pax_global_header00006660000000000000000000000064147657647620014542gustar00rootroot0000000000000052 comment=1d0d42a1c2a4b95ba7ad9bb31994cffdc232a6a7 libzypp-17.36.5/000077500000000000000000000000001476576476200134165ustar00rootroot00000000000000libzypp-17.36.5/.clang-format000066400000000000000000000063211476576476200157730ustar00rootroot00000000000000--- Language: Cpp AccessModifierOffset: -2 AlignAfterOpenBracket: DontAlign AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Right AlignOperands: true AlignTrailingComments: true AllowAllParametersOfDeclarationOnNextLine: false AllowShortBlocksOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: All AllowShortIfStatementsOnASingleLine: false AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: Yes BinPackArguments: true BinPackParameters: true BraceWrapping: AfterClass: true AfterControlStatement: true AfterEnum: true AfterFunction: true AfterNamespace: true AfterObjCDeclaration: true AfterStruct: true AfterUnion: true AfterExternBlock: false BeforeCatch: true BeforeElse: true IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: None BreakBeforeBraces: Custom BreakBeforeInheritanceComma: false BreakInheritanceList: BeforeColon BreakBeforeTernaryOperators: true BreakConstructorInitializersBeforeComma: false BreakConstructorInitializers: BeforeComma BreakAfterJavaFieldAnnotations: false BreakStringLiterals: true ColumnLimit: 80 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerIndentWidth: 2 ContinuationIndentWidth: 2 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false FixNamespaceComments: true ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH IncludeBlocks: Preserve IncludeCategories: - Regex: '^"(llvm|llvm-c|clang|clang-c)/' Priority: 2 - Regex: '^(<|"(gtest|isl|json)/)' Priority: 3 - Regex: '.*' Priority: 1 IncludeIsMainRegex: '(Test)?$' IndentCaseLabels: true IndentPPDirectives: None IndentWidth: 2 IndentWrappedFunctionNames: false JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepLineBreaksForNonEmptyLines: false KeepEmptyLinesAtTheStartOfBlocks: true MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: All ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 2 ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: false PenaltyBreakAssignment: 2 PenaltyBreakBeforeFirstCallParameter: 19 PenaltyBreakComment: 300 PenaltyBreakFirstLessLess: 120 PenaltyBreakString: 1000000 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 1000000 PenaltyReturnTypeOnItsOwnLine: 1000000 PointerAlignment: Right ReflowComments: false SortIncludes: false SortUsingDeclarations: true SpaceAfterCStyleCast: false SpaceAfterTemplateKeyword: true SpaceBeforeAssignmentOperators: true SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeParens: ControlStatements SpaceBeforeRangeBasedForLoopColon: true SpaceInEmptyParentheses: false SpacesBeforeTrailingComments: 1 SpacesInAngles: false SpacesInContainerLiterals: true SpacesInCStyleCastParentheses: false SpacesInParentheses: true SpacesInSquareBrackets: true Standard: Cpp11 TabWidth: 4 UseTab: Never ... libzypp-17.36.5/.clang-tidy000066400000000000000000000012431476576476200154520ustar00rootroot00000000000000Checks: - bugprone-use-after-move - bugprone-move-forwarding-reference - modernize-use-override - performance-move-const-arg - cppcoreguidelines-prefer-member-initializer - cppcoreguidelines-special-member-functions - performance-inefficient-vector-operation - performance-for-range-copy - bugprone-copy-constructor-init # - bugprone-dangling-handle - bugprone-dynamic-static-initializers - bugprone-unsafe-functions - -clang-diagnostic-unused-command-line-argument - -clang-diagnostic-ignored-optimization-argument WarningsAsErrors: 'bugprone-use-after-move' CheckOptions: performance-move-const-arg.CheckTriviallyCopyableMove: false libzypp-17.36.5/.gitattributes000066400000000000000000000000501476576476200163040ustar00rootroot00000000000000*.po merge=binary *.pot merge=binary libzypp-17.36.5/.gitignore000066400000000000000000000002131476576476200154020ustar00rootroot00000000000000build *.orig *.rej *.swp *.kate-swp #* .#* *# .*project .externalToolBuilders .settings *flymake.h.gch CMakeLists.txt.user* .vscode .cache libzypp-17.36.5/.obs/000077500000000000000000000000001476576476200142575ustar00rootroot00000000000000libzypp-17.36.5/.obs/workflows.yml000066400000000000000000000006431476576476200170420ustar00rootroot00000000000000ci_workflow: steps: - branch_package: source_project: zypp:ci:libzypp source_package: libzypp target_project: home:zypp-team filters: event: pull_request master_workflow: steps: - branch_package: source_project: zypp:ci:libzypp source_package: libzypp target_project: home:zypp-team filters: event: push branches: only: - masterlibzypp-17.36.5/.travis.yml000066400000000000000000000024341476576476200155320ustar00rootroot00000000000000sudo: required dist: trusty group: stable language: c++ os: linux services: - docker before_install: - cat /proc/cpuinfo - docker pull opensuse:tumbleweed - docker run -i -d --name test opensuse:tumbleweed bash - docker exec test zypper ref - docker exec test zypper in -y --recommends cmake openssl-devel boost-devel dejagnu doxygen gcc-c++ gettext-devel graphviz libxml2-devel libproxy-devel pkg-config libsolv-devel libsolv-tools ruby rpm-devel libcurl-devel libboost_program_options*-devel libboost_test*-devel libudev-devel xorg-x11-fonts-core xorg-x11-fonts texlive-lm-fonts libgpgme-devel gpgme libboost_thread1_* - docker exec test zypper in -y "rubygem(asciidoctor)" script: - docker cp ../libzypp/ test:/root - docker exec test mkdir /root/build - docker exec test bash -c "cd /root/build && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_SKIP_RPATH=1 ../libzypp" - docker exec test bash -c "cd /root/build && make -j4 VERBOSE=1" - docker exec test bash -c "cd /root/build && make -j4 -C doc/autodoc" - docker exec test bash -c "cd /root/build && make -j4 -C po translations" - docker exec test bash -c "cd /root/build && make -j4 -C tests" - docker exec test bash -c "cd /root/build/tests && LD_LIBRARY_PATH=\$PWD/../zypp:\$LD_LIBRARY_PATH ctest -VV ." on: repo: openSUSE/libzypp tags: true libzypp-17.36.5/CMakeLists.txt000066400000000000000000000473571476576476200161760ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.10) PROJECT(LIBZYPP) SET( PACKAGE "libzypp" ) # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked SET( CMAKE_MODULE_PATH ${LIBZYPP_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH} ) INCLUDE(ZyppCommon) INCLUDE(CMakePushCheckState) # use Boost's config file if(POLICY CMP0167) cmake_policy(SET CMP0167 NEW) endif() # allow name libraries by name mixed with full # paths if(COMMAND cmake_policy) cmake_policy(SET CMP0003 NEW) endif(COMMAND cmake_policy) OPTION (ENABLE_BUILD_DOCS "Build documentation by default?" OFF) OPTION (ENABLE_BUILD_TRANS "Build translation files by default?" OFF) OPTION (ENABLE_BUILD_TESTS "Build and run test suite by default?" OFF) OPTION (ENABLE_ZSTD_COMPRESSION "Build with zstd compression support?" OFF) OPTION (ENABLE_VISIBILITY_HIDDEN "Build with hidden visibility by default?" OFF) OPTION (ENABLE_ZCHUNK_COMPRESSION "Build with zchunk compression support?" OFF) # Helps with bug https://bugzilla.gnome.org/show_bug.cgi?id=784550 , Segfault during signal emission when slots are cleared OPTION (ENABLE_SIGC_BLOCK_WORKAROUND "Enable a workaround for older sigcpp libraries?" OFF ) OPTION (DISABLE_MEDIABACKEND_TESTS "Disable Tests depending on Nginx and libfcgi?" OFF) OPTION (DISABLE_LIBPROXY "Build without libproxy support even if package is installed?" OFF) OPTION (DISABLE_AUTODOCS "Do not require doxygen being installed (required to build autodocs)?" OFF) OPTION (EXPORT_NG_API "Export experimental libzypp API" OFF) # This option will reroute all tool binaries to the libzypp build dir instead of taking those installed in the default directories. OPTION (ENABLE_DEVEL_BUILD "Developer build, use zypp tools directly from build dir rather than the default locations" OFF) OPTION (INSTALL_NG_BINARIES "Installs the NG binaries, disabled for now since we are not actively using them." OFF) # Distros using just zypper may want to enable this as default earlier OPTION (ENABLE_PREVIEW_SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER "[preview] Force zypper into using a single rpm transaction to install" OFF) OPTION (ENABLE_CLANG_TIDY "Enables static checks with clang-tidy" OFF) OPTION (ENABLE_CPPCHECK "Enables static checks with cppcheck" OFF) OPTION (ENABLE_UBSAN_CHECKS "Enables the undefined behavior sanitizer runtime checks in debug builds." OFF) #-------------------------------------------------------------------------------- # Builtin defaults amended for legacy codestreams OPTION( LIBZYPP_CONFIG_USE_DELTARPM_BY_DEFAULT "Builtin default for zypp.conf:download.use_deltarpm" OFF ) #-------------------------------------------------------------------------------- SET (have_system x) SET (LIBZYPP_CODESTREAM default) IF (DEBIAN) MESSAGE (STATUS "Building for Debian") SET (ENABLE_BUILD_DOCS ON) SET (ENABLE_BUILD_TRANS ON) SET (ENABLE_BUILD_TESTS ON) SET (have_system ${have_system}x) ENDIF (DEBIAN) IF (${have_system} STREQUAL x) MESSAGE (STATUS "Building for SUSE (${LIBZYPP_CODESTREAM})") ENDIF (${have_system} STREQUAL x) IF (${have_system} STRGREATER xx) MESSAGE (FATAL_ERROR "Can only build for one system type.") ENDIF (${have_system} STRGREATER xx) #-------------------------------------------------------------------------------- # general flags used for all targets add_library( zypp_general_compiler_flags INTERFACE ) IF ( ENABLE_DEVEL_BUILD ) MESSAGE( WARNING "Zypp devel build enabled, do not do this in production" ) SET( ZYPP_RPM_BINARY "${LIBZYPP_BINARY_DIR}/tools/zypp-rpm/zypp-rpm") SET( ZYPP_WORKER_PATH "${LIBZYPP_BINARY_DIR}/tools/workers" ) if ( ZYPP_STACK_BUILD ) target_compile_definitions( zypp_general_compiler_flags INTERFACE ZYPP_REPO2SOLV_PATH="${zypp-stack_BINARY_DIR}/libsolv/tools/repo2solv" ) target_compile_definitions( zypp_general_compiler_flags INTERFACE ZYPP_RPMDB2SOLV_PATH="${zypp-stack_BINARY_DIR}/libsolv/tools/rpmdb2solv" ) endif() ELSE() SET( ZYPP_RPM_BINARY "${ZYPP_LIBEXEC_INSTALL_DIR}/zypp-rpm") SET( ZYPP_WORKER_PATH "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF( ENABLE_DEVEL_BUILD ) message ( "Using zypp-rpm from path: ${ZYPP_RPM_BINARY}" ) target_compile_definitions(zypp_general_compiler_flags INTERFACE ZYPP_RPM_BINARY="${ZYPP_RPM_BINARY}" ) target_compile_definitions(zypp_general_compiler_flags INTERFACE ZYPP_WORKER_PATH="${ZYPP_WORKER_PATH}") #-------------------------------------------------------------------------------- find_package(FindPkgConfig, QUIET) INCLUDE( ${LIBZYPP_SOURCE_DIR}/VERSION.cmake ) MATH( EXPR LIBZYPP_NUMVERSION "${LIBZYPP_MAJOR} * 10000 + ${LIBZYPP_MINOR} * 100 + ${LIBZYPP_PATCH}" ) MATH( EXPR LIBZYPP_CURRENT "${LIBZYPP_MAJOR} * 100 + ${LIBZYPP_MINOR}" ) MATH( EXPR LIBZYPP_AGE "${LIBZYPP_MINOR} - ${LIBZYPP_COMPATMINOR}" ) # Libtool wanted current:patch:age # But cmake is not libtool, it wants the verbatim suffix to libzypp.so MATH( EXPR LIBZYPP_SO_FIRST "${LIBZYPP_CURRENT}-${LIBZYPP_AGE}" ) SET( VERSION "${LIBZYPP_MAJOR}.${LIBZYPP_MINOR}.${LIBZYPP_PATCH}" ) CONFIGURE_FILE ( zypp-core/APIConfig.h.in zypp-core/APIConfig.h @ONLY ) SET (CMAKE_CXX_STANDARD ${ZYPPCOMMON_CXX_STANDARD}) SET (CMAKE_CXX_EXTENSIONS OFF) include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) CHECK_C_COMPILER_FLAG("-Werror=format-security" CC_FORMAT_SECURITY) CHECK_CXX_COMPILER_FLAG("-Werror=format-security" CXX_FORMAT_SECURITY) SET( CMAKE_THREAD_PREFER_PTHREAD TRUE ) FIND_PACKAGE( Threads REQUIRED ) IF ( NOT CMAKE_USE_PTHREADS_INIT ) MESSAGE( FATAL_ERROR "No pthreads found" ) ENDIF ( NOT CMAKE_USE_PTHREADS_INIT ) target_compile_options( zypp_general_compiler_flags INTERFACE "-pthread" "-fno-strict-aliasing" "-g" "-Wall" "-Wp,-D_GLIBCXX_ASSERTIONS" ) target_link_options( zypp_general_compiler_flags INTERFACE "-pthread" "-fno-strict-aliasing" "-g" "-Wall" "-Wp,-D_GLIBCXX_ASSERTIONS" ) target_compile_options( zypp_general_compiler_flags INTERFACE "-fvisibility-inlines-hidden" "-Woverloaded-virtual" "-Wnon-virtual-dtor" "-ftemplate-backtrace-limit=0" ) target_link_options( zypp_general_compiler_flags INTERFACE "-fvisibility-inlines-hidden" "-Woverloaded-virtual" "-Wnon-virtual-dtor" "-ftemplate-backtrace-limit=0" ) IF ( ENABLE_VISIBILITY_HIDDEN ) target_compile_options( zypp_general_compiler_flags INTERFACE "-fvisibility=hidden" ) target_link_options( zypp_general_compiler_flags INTERFACE "-fvisibility=hidden" ) ENDIF( ENABLE_VISIBILITY_HIDDEN ) IF(${CXX_FORMAT_SECURITY}) target_compile_options( zypp_general_compiler_flags INTERFACE "-Werror=format-security") target_link_options( zypp_general_compiler_flags INTERFACE "-Werror=format-security") ENDIF(${CXX_FORMAT_SECURITY}) #cli args ignored by clang, it still prints a noisy warning though if ( NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") target_compile_options( zypp_general_compiler_flags INTERFACE "-Wl,-as-needed" ) target_link_options( zypp_general_compiler_flags INTERFACE "-Wl,-as-needed" ) if( ENABLE_UBSAN_CHECKS ) target_compile_options( zypp_general_compiler_flags INTERFACE "$<$:-fsanitize=undefined>" ) target_link_options( zypp_general_compiler_flags INTERFACE "$<$:-fsanitize=undefined>" ) endif() endif() INCLUDE(CheckFunctionExists) CHECK_FUNCTION_EXISTS(pipe2 PIPE2_FOUND) IF(${PIPE2_FOUND}) target_compile_definitions( zypp_general_compiler_flags INTERFACE HAVE_PIPE2 ) ENDIF(${PIPE2_FOUND}) #tell libsolv to rename its variables to be C++20 compatible target_compile_definitions(zypp_general_compiler_flags INTERFACE LIBSOLV_SOLVABLE_PREPEND_DEP ) target_compile_definitions(zypp_general_compiler_flags INTERFACE _FILE_OFFSET_BITS=64 LIBSOLV_SOLVABLE_PREPEND_DEP ) target_compile_definitions(zypp_general_compiler_flags INTERFACE $<$>:ZYPP_NDEBUG NDEBUG> ) target_compile_options( zypp_general_compiler_flags INTERFACE $<$>:-O2>) target_link_options ( zypp_general_compiler_flags INTERFACE $<$>:-O2>) SET( LIBZYPP_VERSION_INFO "${LIBZYPP_SO_FIRST}.${LIBZYPP_AGE}.${LIBZYPP_PATCH}" ) SET( LIBZYPP_SOVERSION_INFO "${LIBZYPP_SO_FIRST}" ) GENERATE_PACKAGING(${PACKAGE} ${VERSION}) #################################################################### FIND_PACKAGE(Boost REQUIRED COMPONENTS program_options unit_test_framework thread) IF (Boost_FOUND) MESSAGE( STATUS "boost found: includes in ${Boost_INCLUDE_DIRS}, library in ${Boost_LIBRARY_DIRS}") target_include_directories( zypp_general_compiler_flags INTERFACE ${Boost_INCLUDE_DIRS}) target_link_directories( zypp_general_compiler_flags INTERFACE ${Boost_LIBRARY_DIRS}) ENDIF(Boost_FOUND) FIND_PACKAGE(Gettext REQUIRED) IF (GETTEXT_FOUND) MESSAGE(STATUS "Found Gettext: ${GETTEXT_SOURCE}") target_include_directories( zypp_general_compiler_flags INTERFACE ${GETTEXT_INCLUDE_DIR}) ELSE (GETTEXT_FOUND) MESSAGE( FATAL_ERROR "Gettext not found" ) ENDIF (GETTEXT_FOUND) FIND_PACKAGE(CURL REQUIRED) IF ( NOT CURL_FOUND) MESSAGE( FATAL_ERROR " curl not found" ) ELSE ( NOT CURL_FOUND) target_include_directories( zypp_general_compiler_flags INTERFACE ${CURL_INCLUDE_DIRS}) ENDIF( NOT CURL_FOUND) FIND_PACKAGE(LibXml2 REQUIRED) IF ( NOT LIBXML2_FOUND) MESSAGE( FATAL_ERROR " libxml not found" ) ELSE ( NOT LIBXML2_FOUND) target_include_directories( zypp_general_compiler_flags INTERFACE ${LIBXML2_INCLUDE_DIR}) ENDIF( NOT LIBXML2_FOUND) FIND_PACKAGE(ZLIB REQUIRED) IF ( NOT ZLIB_FOUND) MESSAGE( FATAL_ERROR " zlib not found" ) ELSE ( NOT ZLIB_FOUND) target_include_directories( zypp_general_compiler_flags INTERFACE ${ZLIB_INCLUDE_DIR}) ENDIF( NOT ZLIB_FOUND) FIND_PACKAGE(YAML-CPP REQUIRED) IF ( NOT YAML-CPP_FOUND) MESSAGE( FATAL_ERROR " yaml-cpp not found" ) ELSE ( NOT YAML-CPP_FOUND) target_include_directories( zypp_general_compiler_flags INTERFACE ${YAML_CPP_INCLUDE_DIR}) IF ( NOT YAML_CPP_LIBRARIES ) # Must have been found by config insted of module, use target instead. SET( YAML_CPP_LIBRARIES "yaml-cpp" ) ENDIF ( NOT YAML_CPP_LIBRARIES ) ENDIF( NOT YAML-CPP_FOUND) #Allow to override the libsolv install location if( ZYPP_STACK_BUILD ) set ( LibSolv_FOUND TRUE ) SET ( LibSolv_INCLUDE_DIRS ${ZYPP_STACK_INCLUDE_DIRS} ) SET ( LibSolv_LIBRARIES libsolvext libsolv ) else() FIND_PACKAGE(LibSolv REQUIRED ext) #SET(LibSolv_USE_STATIC_LIBS ON) IF ( NOT LibSolv_FOUND ) MESSAGE( FATAL_ERROR " libsolv not found" ) ELSE() # static case: Assert libsolv.a ist the last one linked SET(LibSolv_LIBRARIES ${LibSolv_LIBRARIES} ${LIBSOLV_LIBRARY}) ENDIF() # detecting libsolv features, so we know which libraries to link this is still required even if we were asked to build # without zstd support include(CheckSymbolExists) cmake_push_check_state(RESET) set(CMAKE_REQUIRED_INCLUDES ${LibSolv_INCLUDE_DIRS} ${CMAKE_REQUIRED_INCLUDES}) CHECK_SYMBOL_EXISTS( LIBSOLVEXT_FEATURE_ZLIB_COMPRESSION "solv/solvversion.h" SOLV_NEED_ZLIB ) CHECK_SYMBOL_EXISTS( LIBSOLVEXT_FEATURE_LZMA_COMPRESSION "solv/solvversion.h" SOLV_NEED_LZMA ) CHECK_SYMBOL_EXISTS( LIBSOLVEXT_FEATURE_BZIP2_COMPRESSION "solv/solvversion.h" SOLV_NEED_BZIP2 ) CHECK_SYMBOL_EXISTS( LIBSOLVEXT_FEATURE_ZSTD_COMPRESSION "solv/solvversion.h" SOLV_NEED_ZSTD ) cmake_pop_check_state() # no check for system zchunk, default is usually to use the libsolv internal libs #CHECK_SYMBOL_EXISTS( LIBSOLVEXT_FEATURE_ZCHUNK_COMPRESSION "solv/solvversion.h" SOLV_NEED_ZCHUNK ) #if ( SOLV_NEED_ZCHUNK ) # FIND_PACKAGE(PkgConfig REQUIRED) # PKG_CHECK_MODULES(ZCHUNK zck REQUIRED) # set(LibSolv_LIBRARIES ${LibSolv_LIBRARIES} ${ZCHUNK_LIBRARIES}) #endif () if ( SOLV_NEED_ZLIB ) FIND_PACKAGE (ZLIB REQUIRED) SET(LibSolv_LIBRARIES ${LibSolv_LIBRARIES} ${ZLIB_LIBRARY}) endif () if ( SOLV_NEED_LZMA ) FIND_LIBRARY(LZMA_LIBRARY NAMES lzma liblzma REQUIRED) SET(LibSolv_LIBRARIES ${LibSolv_LIBRARIES} ${LZMA_LIBRARY}) endif () if ( SOLV_NEED_BZIP2 ) FIND_PACKAGE (BZip2 REQUIRED) SET(LibSolv_LIBRARIES ${LibSolv_LIBRARIES} ${BZIP2_LIBRARIES}) endif () if ( SOLV_NEED_ZSTD ) FIND_LIBRARY (ZSTD_LIBRARY NAMES zstd REQUIRED) SET(LibSolv_LIBRARIES ${LibSolv_LIBRARIES} ${ZSTD_LIBRARY}) endif () endif( ZYPP_STACK_BUILD ) target_include_directories( zypp_general_compiler_flags INTERFACE ${LibSolv_INCLUDE_DIRS} ) pkg_search_module(GPGME gpgme>=1.8.0) IF ( GPGME_FOUND ) MESSAGE(STATUS "Found gpgme ${GPGME_VERSION}" ) target_include_directories( zypp_general_compiler_flags INTERFACE ${GPGME_INCLUDE_DIRS} ) target_link_directories( zypp_general_compiler_flags INTERFACE ${GPGME_LIBRARY_DIRS} ) ELSE() FIND_PACKAGE(Gpgme REQUIRED) IF ( NOT GPGME_PTHREAD_FOUND ) MESSAGE( FATAL_ERROR " gpgme not found" ) ELSE() target_include_directories( zypp_general_compiler_flags INTERFACE ${GPGME_INCLUDES} ) target_link_directories( zypp_general_compiler_flags INTERFACE ${GPGME_LIBRARY_DIR} ) SET(GPGME_LIBRARIES ${GPGME_PTHREAD_LIBRARIES}) ENDIF() ENDIF() FIND_PACKAGE(OpenSSL REQUIRED) FIND_PACKAGE(Udev) IF ( NOT UDEV_FOUND ) MESSAGE(WARNING "No udev found. CD device detection will be poor") ELSE ( NOT UDEV_FOUND ) target_compile_definitions( zypp_general_compiler_flags INTERFACE HAVE_UDEV) ENDIF ( NOT UDEV_FOUND ) IF( DISABLE_LIBPROXY ) MESSAGE( STATUS "libproxy support disabled" ) ELSE( DISABLE_LIBPROXY ) target_compile_definitions( zypp_general_compiler_flags INTERFACE WITH_LIBPROXY_SUPPORT) ENDIF( DISABLE_LIBPROXY ) FIND_PROGRAM( DOXYGEN doxygen ) IF ( NOT DOXYGEN ) IF ( DISABLE_AUTODOCS ) MESSAGE( STATUS "doxygen is not available. Can't build the documentation." ) ELSE ( DISABLE_AUTODOCS ) MESSAGE( FATAL_ERROR "doxygen not found: install doxygen to build the documentation!" ) ENDIF ( DISABLE_AUTODOCS ) ELSE ( NOT DOXYGEN ) MESSAGE( STATUS "doxygen found: ${DOXYGEN}" ) ENDIF ( NOT DOXYGEN ) if (ENABLE_CLANG_TIDY) FIND_PROGRAM( CLANG-TIDY clang-tidy ) if ( CLANG-TIDY ) message( "Enabling clang-tidy checks") set( ZYPP_CXX_CLANG_TIDY ${CLANG-TIDY} ) else ( CLANG-TIDY ) message(WARNING "clang-tidy not found.") endif( CLANG-TIDY ) endif(ENABLE_CLANG_TIDY) if ( ENABLE_CPPCHECK ) FIND_PROGRAM( CPPCHECK cppcheck ) if ( CPPCHECK ) message( "Enabling cppcheck") set(ZYPP_CXX_CPPCHECK ${CPPCHECK};–std=c++17;--suppress=rethrowNoCurrentException) else ( CPPCHECK ) message(WARNING "cppcheck not found.") endif( CPPCHECK ) endif(ENABLE_CPPCHECK) # https://bugzilla.gnome.org/show_bug.cgi?id=784550 IF (ENABLE_ZCHUNK_COMPRESSION) MESSAGE("Building with zchunk support enabled.") PKG_CHECK_MODULES (ZCHUNK zck REQUIRED) message("ZCHUNK FLAGS ${ZCHUNK_CFLAGS} ") target_compile_options( zypp_general_compiler_flags INTERFACE ${ZCHUNK_CFLAGS} ) target_link_options( zypp_general_compiler_flags INTERFACE ${ZCHUNK_CFLAGS} ) target_compile_definitions( zypp_general_compiler_flags INTERFACE ENABLE_ZCHUNK_COMPRESSION=1 ) ENDIF(ENABLE_ZCHUNK_COMPRESSION) IF(ENABLE_SIGC_BLOCK_WORKAROUND) message("Building with sigcpp block workaround") target_compile_definitions( zypp_general_compiler_flags INTERFACE LIBZYPP_USE_SIGC_BLOCK_WORKAROUND=1) ENDIF(ENABLE_SIGC_BLOCK_WORKAROUND) pkg_check_modules ( SIGCPP REQUIRED sigc++-2.0 ) target_include_directories( zypp_general_compiler_flags INTERFACE ${SIGCPP_INCLUDE_DIRS} ) pkg_check_modules ( LIBGLIB REQUIRED glib-2.0 ) target_include_directories( zypp_general_compiler_flags INTERFACE ${LIBGLIB_INCLUDE_DIRS} ) MESSAGE(STATUS "soname: ${LIBZYPP_VERSION_INFO}") MESSAGE(STATUS "version: ${VERSION}") MESSAGE(STATUS "Writing pkg-config file...") CONFIGURE_FILE(${LIBZYPP_SOURCE_DIR}/libzypp.pc.cmake ${LIBZYPP_BINARY_DIR}/libzypp.pc @ONLY) INSTALL( FILES ${LIBZYPP_BINARY_DIR}/libzypp.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) MESSAGE(STATUS "ZyppConfig.cmake will be installed in ${LIB_INSTALL_DIR}/cmake/Zypp") INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/cmake/modules/ZyppConfig.cmake DESTINATION ${LIB_INSTALL_DIR}/cmake/Zypp ) INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/cmake/modules/ZyppCommon.cmake DESTINATION ${LIB_INSTALL_DIR}/cmake/Zypp ) #################################################################### # config templates # (don't forget to mention them in the .spec file) #################################################################### MESSAGE(STATUS "zypp.conf will be installed in ${SYSCONFDIR}/zypp") INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/zypp.conf DESTINATION ${SYSCONFDIR}/zypp ) MESSAGE(STATUS "needreboot will be installed in ${SYSCONFDIR}/zypp/") INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/needreboot DESTINATION ${SYSCONFDIR}/zypp ) #install systemCheck MESSAGE(STATUS "systemCheck will be installed in ${SYSCONFDIR}/zypp") INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/systemCheck DESTINATION ${SYSCONFDIR}/zypp ) # logrotate config file INSTALL( FILES ${LIBZYPP_SOURCE_DIR}/zypp-history.lr DESTINATION ${SYSCONFDIR}/logrotate.d ) IF ( ENABLE_PREVIEW_SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER ) MESSAGE( STATUS "[preview] Force zypper into using a single rpm transaction to install" ) target_compile_definitions( zypp_general_compiler_flags INTERFACE SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER ) ENDIF ( ENABLE_PREVIEW_SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER ) #usage requirements for all libs add_library( zypp_lib_compiler_flags INTERFACE) target_compile_options( zypp_lib_compiler_flags INTERFACE "-fPIC" "-rdynamic" "-Wl,--no-allow-shlib-undefined" "-Wl,--no-undefined") target_link_options ( zypp_lib_compiler_flags INTERFACE "-fPIC" "-rdynamic" "-Wl,--no-allow-shlib-undefined" "-Wl,--no-undefined" ) target_link_libraries ( zypp_lib_compiler_flags INTERFACE zypp_general_compiler_flags ) #usage requirements for all executables add_library( zypp_exe_compiler_flags INTERFACE) target_compile_options( zypp_exe_compiler_flags INTERFACE "-fpie" "-pie" "-Wl,--no-undefined" ) target_link_options ( zypp_exe_compiler_flags INTERFACE "-fpie" "-pie" "-Wl,--no-undefined" ) target_link_libraries ( zypp_exe_compiler_flags INTERFACE zypp_general_compiler_flags ) MACRO(ADD_TESTS) FOREACH( loop_var ${ARGV} ) SET_SOURCE_FILES_PROPERTIES( ${loop_var}_test.cc COMPILE_FLAGS "-DBOOST_TEST_DYN_LINK -DBOOST_TEST_MAIN -DBOOST_AUTO_TEST_MAIN=\"\" " ) ADD_EXECUTABLE( ${loop_var}_test ${loop_var}_test.cc ) SET(TEST_REQ_LIBS ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) IF(NOT DISABLE_MEDIABACKEND_TESTS) LIST( APPEND TEST_REQ_LIBS zypp_test_utils ) ENDIF() TARGET_LINK_LIBRARIES( ${loop_var}_test PUBLIC zypp_exe_compiler_flags ) TARGET_LINK_LIBRARIES( ${loop_var}_test PUBLIC ${TEST_REQ_LIBS} ) TARGET_LINK_LIBRARIES( ${loop_var}_test PUBLIC zypp-allsym ) ADD_TEST( ${loop_var}_test ${CMAKE_CURRENT_BINARY_DIR}/${loop_var}_test --catch_system_errors=no) ENDFOREACH( loop_var ) ENDMACRO(ADD_TESTS) # Macro to set the log group for a list of files MACRO( SET_LOGGROUP _group _files ) SET_SOURCE_FILES_PROPERTIES( ${_files} COMPILE_FLAGS -DZYPP_BASE_LOGGER_LOGGROUP=\\"${_group}\\" ) FOREACH (_currentFile ${ARGN}) #MESSAGE( STATUS "setting loggroup to \"${_group}\" for ${_currentFile}" ) SET_SOURCE_FILES_PROPERTIES( ${_currentFile} COMPILE_FLAGS -DZYPP_BASE_LOGGER_LOGGROUP=\\"${_group}\\" ) ENDFOREACH (_currentFile ${ARGN}) ENDMACRO( SET_LOGGROUP ) #################################################################### # SUBDIRECTORIES # #################################################################### ADD_SUBDIRECTORY( zypp-core ) ADD_SUBDIRECTORY( zypp-media ) ADD_SUBDIRECTORY( zypp-curl ) ADD_SUBDIRECTORY( zypp-tui ) ADD_SUBDIRECTORY( zypp-common ) ADD_SUBDIRECTORY( zypp ) ADD_SUBDIRECTORY( zyppng ) ADD_SUBDIRECTORY( tools ) ADD_SUBDIRECTORY( shared ) ADD_SUBDIRECTORY( doc ) IF ( ENABLE_BUILD_TRANS ) ADD_SUBDIRECTORY( po ) ELSE ( ENABLE_BUILD_TRANS ) ADD_SUBDIRECTORY( po EXCLUDE_FROM_ALL ) ENDIF ( ENABLE_BUILD_TRANS ) IF ( ENABLE_BUILD_TESTS ) ADD_SUBDIRECTORY( tests ) ELSE ( ENABLE_BUILD_TESTS ) ADD_SUBDIRECTORY( tests EXCLUDE_FROM_ALL ) ENDIF ( ENABLE_BUILD_TESTS ) INCLUDE(CTest) ENABLE_TESTING() libzypp-17.36.5/COPYING000066400000000000000000000022131476576476200144470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ Copyright (C) 2000-2002 Ximian, Inc. Copyright (C) 2005-2018 SUSE LINUX Products GmbH, Nuernberg, Germany. ZYpp is licensed under the GNU General Public License version 2 or later. The text of the GNU General Public License can be viewed at http://www.gnu.org/licenses/gpl.html As a special exception, you have permission to link this program with the following libraries and distribute executables, as long as you follow the requirements of the GNU GPL in regard to all of the software in the executable aside from the following libraries: - OpenSSL (http://www.openssl.org) libzypp-17.36.5/Makefile.cvs000066400000000000000000000014231476576476200156500ustar00rootroot00000000000000# Generic Makefile.cvs for CMake-based projects: # # Create a subdirecory build/ and call cmake from there with /usr prefix. # # Intentionally using /usr rather than the default /usr/local since this is for # internal use, and we are the distribution makers: /usr/local is off limits # for us. # # Author: Stefan Hundhammer BUILD_SUBDIR = build HERE_FROM_BUILD_SUBDIR = .. PREFIX = /usr CMAKE = /usr/bin/cmake all: cmake cmake: create-build-subdir create-toplevel-makefile ( cd $(BUILD_SUBDIR) && $(CMAKE) -DCMAKE_INSTALL_PREFIX=$(PREFIX) $(HERE_FROM_BUILD_SUBDIR) ) create-build-subdir: test -d $(BUILD_SUBDIR) || mkdir $(BUILD_SUBDIR) create-toplevel-makefile: echo 'all:' >Makefile echo -e '\t$$(MAKE) $$(MAKEFLAGS) -C $(BUILD_SUBDIR)' >>Makefile libzypp-17.36.5/VERSION.cmake000066400000000000000000000044371476576476200155550ustar00rootroot00000000000000# ================================================== # Versioning # ========== # # MAJOR Major number for this branch. # # MINOR The most recent interface number this # library implements. # # COMPATMINOR The latest binary compatible minor number # this library implements. # # PATCH The implementation number of the current interface. # # # - The package VERSION will be MAJOR.MINOR.PATCH. # # - Libtool's -version-info will be derived from MAJOR, MINOR, PATCH # and COMPATMINOR (see configure.ac). # # - Changing MAJOR always breaks binary compatibility. # # - Changing MINOR doesn't break binary compatibility by default. # Only if COMPATMINOR is changed as well. # # # 1) After branching from TRUNK increment TRUNKs MAJOR and # start with version `MAJOR.0.0' and also set COMPATMINOR to 0. # # 2) Update the version information only immediately before a public release # of your software. More frequent updates are unnecessary, and only guarantee # that the current interface number gets larger faster. # # 3) If the library source code has changed at all since the last update, # then increment PATCH. # # 4) If any interfaces have been added, removed, or changed since the last # update, increment MINOR, and set PATCH to 0. # # 5) If any interfaces have been added since the last public release, then # leave COMPATMINOR unchanged. (binary compatible change) # # 6) If any interfaces have been removed since the last public release, then # set COMPATMINOR to MINOR. (binary incompatible change) # ================================================== #======= # - MOST IMPORTANT: # - Before you submitt to git: # - Remember the new version in 'LAST RELEASED:' # - State the new version in the changes file by adding a line # "- version MAJOR.MINOR.PATCH (COMPATMINOR)" # - Commit changes and version files together in a separate # commit using -m 'changes MAJOR.MINOR.PATCH (COMPATMINOR)' # - Tag the above commit with 'MAJOR.MINOR.PATCH' using # -m "tagging MAJOR.MINOR.PATCH". # # - Consider calling ./mkChangelog to assist you. # See './mkChangelog -h' for help. # SET(LIBZYPP_MAJOR "17") SET(LIBZYPP_COMPATMINOR "35") SET(LIBZYPP_MINOR "36") SET(LIBZYPP_PATCH "5") # # LAST RELEASED: 17.36.5 (35) # (The number in parenthesis is LIBZYPP_COMPATMINOR) #======= libzypp-17.36.5/cmake/000077500000000000000000000000001476576476200144765ustar00rootroot00000000000000libzypp-17.36.5/cmake/modules/000077500000000000000000000000001476576476200161465ustar00rootroot00000000000000libzypp-17.36.5/cmake/modules/FindGpgme.cmake000066400000000000000000000351661476576476200210230ustar00rootroot00000000000000# Taken from gpgmepp project # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # - Try to find the gpgme library # # Algorithm: # - Windows: # On Windows, there's three gpgme variants: gpgme{,-glib,-qt}. # - The variant used determines the event loop integration possible: # - gpgme: no event loop integration possible, only synchronous operations supported # - gpgme-glib: glib event loop integration possible, only asynchronous operations supported # - gpgme-qt: qt event loop integration possible, only asynchronous operations supported # - GPGME_{VANILLA,GLIB,QT}_{FOUND,LIBRARIES} will be set for each of the above # - GPGME_INCLUDES is the same for all of the above # - GPGME_FOUND is set if any of the above was found # - *nix: # There's also three variants: gpgme{,-pthread,-pth}. # - The variant used determines the multithreaded use possible: # - gpgme: no multithreading support available # - gpgme-pthread: multithreading available using POSIX threads # - gpgme-pth: multithreading available using GNU PTH (cooperative multithreading) # - GPGME_{VANILLA,PTH,PTHREAD}_{FOUND,LIBRARIES} will be set for each of the above # - GPGME_INCLUDES is the same for all of the above # - GPGME_FOUND is set if any of the above was found # # GPGME_LIBRARY_DIR - the directory where the libraries are located # # THIS IS ALMOST A 1:1 COPY OF FindAssuan.cmake in kdepim. # Any changes here likely apply there, too. # include(FeatureSummary) # do away with crappy condition repetition on else/endfoo set( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS_gpgme_saved ${CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS} ) set( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true ) #if this is built-in, please replace, if it isn't, export into a MacroToBool.cmake of its own macro( macro_bool_to_bool FOUND_VAR ) foreach( _current_VAR ${ARGN} ) if ( ${FOUND_VAR} ) set( ${_current_VAR} TRUE ) else() set( ${_current_VAR} FALSE ) endif() endforeach() endmacro() #HACK: local copy... MACRO(MACRO_BOOL_TO_01 FOUND_VAR ) FOREACH (_current_VAR ${ARGN}) IF(${FOUND_VAR}) SET(${_current_VAR} 1) ELSE(${FOUND_VAR}) SET(${_current_VAR} 0) ENDIF(${FOUND_VAR}) ENDFOREACH(_current_VAR) ENDMACRO(MACRO_BOOL_TO_01) if ( WIN32 ) # On Windows, we don't have a gpgme-config script, so we need to # look for the stuff ourselves: # in cmake, AND and OR have the same precedence, there's no # subexpressions, and expressions are evaluated short-circuit'ed # IOW: CMake if() suxx. # Starting with CMake 2.6.3 you can group if expressions with (), but we # don't require 2.6.3 but 2.6.2, we can't use it. Alex set( _seem_to_have_cached_gpgme false ) if ( GPGME_INCLUDES ) if ( GPGME_VANILLA_LIBRARIES OR GPGME_QT_LIBRARIES OR GPGME_GLIB_LIBRARIES ) set( _seem_to_have_cached_gpgme true ) endif() endif() if ( _seem_to_have_cached_gpgme ) macro_bool_to_bool( GPGME_VANILLA_LIBRARIES GPGME_VANILLA_FOUND ) macro_bool_to_bool( GPGME_GLIB_LIBRARIES GPGME_GLIB_FOUND ) macro_bool_to_bool( GPGME_QT_LIBRARIES GPGME_QT_FOUND ) # this would have been preferred: #set( GPGME_*_FOUND macro_bool_to_bool(GPGME_*_LIBRARIES) ) if ( GPGME_VANILLA_FOUND OR GPGME_GLIB_FOUND OR GPGME_QT_FOUND ) set( GPGME_FOUND true ) else() set( GPGME_FOUND false ) endif() else() set( GPGME_FOUND false ) set( GPGME_VANILLA_FOUND false ) set( GPGME_GLIB_FOUND false ) set( GPGME_QT_FOUND false ) find_path( GPGME_INCLUDES gpgme.h ${CMAKE_INCLUDE_PATH} ${CMAKE_INSTALL_PREFIX}/include ) find_library( _gpgme_vanilla_library NAMES gpgme libgpgme gpgme-11 libgpgme-11 PATHS ${CMAKE_LIBRARY_PATH} ${CMAKE_INSTALL_PREFIX}/lib ) find_library( _gpgme_glib_library NAMES gpgme-glib libgpgme-glib gpgme-glib-11 libgpgme-glib-11 PATHS ${CMAKE_LIBRARY_PATH} ${CMAKE_INSTALL_PREFIX}/lib ) find_library( _gpgme_qt_library NAMES gpgme-qt libgpgme-qt gpgme-qt-11 libgpgme-qt-11 PATHS ${CMAKE_LIBRARY_PATH} ${CMAKE_INSTALL_PREFIX}/lib ) find_library( _gpg_error_library NAMES gpg-error libgpg-error gpg-error-0 libgpg-error-0 PATHS ${CMAKE_LIBRARY_PATH} ${CMAKE_INSTALL_PREFIX}/lib ) set( GPGME_INCLUDES ${GPGME_INCLUDES} ) if ( _gpgme_vanilla_library AND _gpg_error_library ) set( GPGME_VANILLA_LIBRARIES ${_gpgme_vanilla_library} ${_gpg_error_library} ) set( GPGME_VANILLA_FOUND true ) set( GPGME_FOUND true ) endif() if ( _gpgme_glib_library AND _gpg_error_library ) set( GPGME_GLIB_LIBRARIES ${_gpgme_glib_library} ${_gpg_error_library} ) set( GPGME_GLIB_FOUND true ) set( GPGME_FOUND true ) endif() if ( _gpgme_qt_library AND _gpg_error_library ) set( GPGME_QT_LIBRARIES ${_gpgme_qt_library} ${_gpg_error_library} ) set( GPGME_QT_FOUND true ) set( GPGME_FOUND true ) endif() endif() # these are Unix-only: set( GPGME_PTHREAD_FOUND false ) set( GPGME_PTH_FOUND false ) set( HAVE_GPGME_PTHREAD 0 ) set( HAVE_GPGME_PTH 0 ) macro_bool_to_01( GPGME_FOUND HAVE_GPGME ) macro_bool_to_01( GPGME_VANILLA_FOUND HAVE_GPGME_VANILLA ) macro_bool_to_01( GPGME_GLIB_FOUND HAVE_GPGME_GLIB ) macro_bool_to_01( GPGME_QT_FOUND HAVE_GPGME_QT ) else() # not WIN32 # On *nix, we have the gpgme-config script which can tell us all we # need to know: # see WIN32 case for an explanation of what this does: set( _seem_to_have_cached_gpgme false ) if ( GPGME_INCLUDES ) if ( GPGME_VANILLA_LIBRARIES OR GPGME_PTHREAD_LIBRARIES OR GPGME_PTH_LIBRARIES ) set( _seem_to_have_cached_gpgme true ) endif() endif() if ( _seem_to_have_cached_gpgme ) macro_bool_to_bool( GPGME_VANILLA_LIBRARIES GPGME_VANILLA_FOUND ) macro_bool_to_bool( GPGME_PTHREAD_LIBRARIES GPGME_PTHREAD_FOUND ) macro_bool_to_bool( GPGME_PTH_LIBRARIES GPGME_PTH_FOUND ) if ( GPGME_VANILLA_FOUND OR GPGME_PTHREAD_FOUND OR GPGME_PTH_FOUND ) set( GPGME_FOUND true ) else() set( GPGME_FOUND false ) endif() else() set( GPGME_FOUND false ) set( GPGME_VANILLA_FOUND false ) set( GPGME_PTHREAD_FOUND false ) set( GPGME_PTH_FOUND false ) find_program( _GPGMECONFIG_EXECUTABLE NAMES gpgme-config ) # if gpgme-config has been found if ( _GPGMECONFIG_EXECUTABLE ) message( STATUS "Found gpgme-config at ${_GPGMECONFIG_EXECUTABLE}" ) exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --version OUTPUT_VARIABLE GPGME_VERSION ) set( _GPGME_MIN_VERSION "1.1.7" ) if ( ${GPGME_VERSION} VERSION_LESS ${_GPGME_MIN_VERSION} ) message( STATUS "The installed version of gpgme is too old: ${GPGME_VERSION} (required: >= ${_GPGME_MIN_VERSION})" ) else() message( STATUS "Found gpgme v${GPGME_VERSION}, checking for flavours..." ) exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --libs OUTPUT_VARIABLE _gpgme_config_vanilla_libs RETURN_VALUE _ret ) if ( _ret ) set( _gpgme_config_vanilla_libs ) endif() exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --thread=pthread --libs OUTPUT_VARIABLE _gpgme_config_pthread_libs RETURN_VALUE _ret ) if ( _ret ) set( _gpgme_config_pthread_libs ) endif() exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --thread=pth --libs OUTPUT_VARIABLE _gpgme_config_pth_libs RETURN_VALUE _ret ) if ( _ret ) set( _gpgme_config_pth_libs ) endif() # append -lgpg-error to the list of libraries, if necessary foreach ( _flavour vanilla pthread pth ) if ( _gpgme_config_${_flavour}_libs AND NOT _gpgme_config_${_flavour}_libs MATCHES "lgpg-error" ) set( _gpgme_config_${_flavour}_libs "${_gpgme_config_${_flavour}_libs} -lgpg-error" ) endif() endforeach() if ( _gpgme_config_vanilla_libs OR _gpgme_config_pthread_libs OR _gpgme_config_pth_libs ) exec_program( ${_GPGMECONFIG_EXECUTABLE} ARGS --cflags OUTPUT_VARIABLE _GPGME_CFLAGS ) if ( _GPGME_CFLAGS ) string( REGEX REPLACE "(\r?\n)+$" " " _GPGME_CFLAGS "${_GPGME_CFLAGS}" ) string( REGEX REPLACE " *-I" ";" GPGME_INCLUDES "${_GPGME_CFLAGS}" ) endif() foreach ( _flavour vanilla pthread pth ) if ( _gpgme_config_${_flavour}_libs ) set( _gpgme_library_dirs ) set( _gpgme_library_names ) string( TOUPPER "${_flavour}" _FLAVOUR ) string( REGEX REPLACE " +" ";" _gpgme_config_${_flavour}_libs "${_gpgme_config_${_flavour}_libs}" ) foreach( _flag ${_gpgme_config_${_flavour}_libs} ) if ( "${_flag}" MATCHES "^-L" ) string( REGEX REPLACE "^-L" "" _dir "${_flag}" ) file( TO_CMAKE_PATH "${_dir}" _dir ) set( _gpgme_library_dirs ${_gpgme_library_dirs} "${_dir}" ) elseif( "${_flag}" MATCHES "^-l" ) string( REGEX REPLACE "^-l" "" _name "${_flag}" ) set( _gpgme_library_names ${_gpgme_library_names} "${_name}" ) endif() endforeach() set( GPGME_${_FLAVOUR}_FOUND true ) foreach( _name ${_gpgme_library_names} ) set( _gpgme_${_name}_lib ) # if -L options were given, look only there if ( _gpgme_library_dirs ) find_library( _gpgme_${_name}_lib NAMES ${_name} PATHS ${_gpgme_library_dirs} NO_DEFAULT_PATH ) endif() # if not found there, look in system directories if ( NOT _gpgme_${_name}_lib ) find_library( _gpgme_${_name}_lib NAMES ${_name} ) endif() # if still not found, then the whole flavour isn't found if ( NOT _gpgme_${_name}_lib ) if ( GPGME_${_FLAVOUR}_FOUND ) set( GPGME_${_FLAVOUR}_FOUND false ) set( _not_found_reason "dependant library ${_name} wasn't found" ) endif() endif() set( GPGME_${_FLAVOUR}_LIBRARIES ${GPGME_${_FLAVOUR}_LIBRARIES} "${_gpgme_${_name}_lib}" ) endforeach() #check_c_library_exists_explicit( gpgme gpgme_check_version "${_GPGME_CFLAGS}" "${GPGME_LIBRARIES}" GPGME_FOUND ) if ( GPGME_${_FLAVOUR}_FOUND ) message( STATUS " Found flavour '${_flavour}', checking whether it's usable...yes" ) else() message( STATUS " Found flavour '${_flavour}', checking whether it's usable...no" ) message( STATUS " (${_not_found_reason})" ) endif() endif() endforeach( _flavour ) # ensure that they are cached # This comment above doesn't make sense, the four following lines seem to do nothing. Alex set( GPGME_INCLUDES ${GPGME_INCLUDES} ) set( GPGME_VANILLA_LIBRARIES ${GPGME_VANILLA_LIBRARIES} ) set( GPGME_PTHREAD_LIBRARIES ${GPGME_PTHREAD_LIBRARIES} ) set( GPGME_PTH_LIBRARIES ${GPGME_PTH_LIBRARIES} ) if ( GPGME_VANILLA_FOUND OR GPGME_PTHREAD_FOUND OR GPGME_PTH_FOUND ) set( GPGME_FOUND true ) else() set( GPGME_FOUND false ) endif() endif() endif() endif() endif() # these are Windows-only: set( GPGME_GLIB_FOUND false ) set( GPGME_QT_FOUND false ) set( HAVE_GPGME_GLIB 0 ) set( HAVE_GPGME_QT 0 ) macro_bool_to_01( GPGME_FOUND HAVE_GPGME ) macro_bool_to_01( GPGME_VANILLA_FOUND HAVE_GPGME_VANILLA ) macro_bool_to_01( GPGME_PTHREAD_FOUND HAVE_GPGME_PTHREAD ) macro_bool_to_01( GPGME_PTH_FOUND HAVE_GPGME_PTH ) endif() # WIN32 | Unix set( _gpgme_flavours "" ) if ( GPGME_VANILLA_FOUND ) set( _gpgme_flavours "${_gpgme_flavours} vanilla" ) endif() if ( GPGME_GLIB_FOUND ) set( _gpgme_flavours "${_gpgme_flavours} Glib" ) endif() if ( GPGME_QT_FOUND ) set( _gpgme_flavours "${_gpgme_flavours} Qt" ) endif() if ( GPGME_PTHREAD_FOUND ) set( _gpgme_flavours "${_gpgme_flavours} pthread" ) endif() if ( GPGME_PTH_FOUND ) set( _gpgme_flavours "${_gpgme_flavours} pth" ) endif() # determine the library in one of the found flavours, can be reused e.g. by FindQgpgme.cmake, Alex foreach(_currentFlavour vanilla glib qt pth pthread) if(NOT GPGME_LIBRARY_DIR) get_filename_component(GPGME_LIBRARY_DIR "${_gpgme_${_currentFlavour}_lib}" PATH) endif() endforeach() if ( NOT Gpgme_FIND_QUIETLY ) if ( GPGME_FOUND ) message( STATUS "Usable gpgme flavours found: ${_gpgme_flavours}" ) else() message( STATUS "No usable gpgme flavours found." ) endif() endif() if ( Gpgme_FIND_REQUIRED AND NOT GPGME_FOUND ) message( FATAL_ERROR "Did not find GPGME" ) endif() if ( WIN32 ) set( _gpgme_homepage "http://www.gpg4win.org" ) else() set( _gpgme_homepage "http://www.gnupg.org/related_software/gpgme" ) endif() set_package_properties(Gpgme PROPERTIES DESCRIPTION "The GnuPG Made Easy (GPGME) library)" URL ${_gpgme_homepage}) set( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS_gpgme_saved ) libzypp-17.36.5/cmake/modules/FindOpenSSL.cmake000066400000000000000000000064551476576476200212460ustar00rootroot00000000000000# - Try to find the OpenSSL encryption library # Once done this will define # # OPENSSL_FOUND - system has the OpenSSL library # OPENSSL_INCLUDE_DIR - the OpenSSL include directory # OPENSSL_LIBRARIES - The libraries needed to use OpenSSL if (OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) # in cache already SET(OPENSSL_FOUND TRUE) else (OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) FIND_PATH(OPENSSL_INCLUDE_DIR openssl/ssl.h /usr/include/ /usr/local/include/ $ENV{ProgramFiles}/OpenSSL/include/ $ENV{SystemDrive}/OpenSSL/include/ ) if(WIN32 AND MSVC) # /MD and /MDd are the standard values - if somone wants to use # others, the libnames have to change here too # see http://www.openssl.org/support/faq.html#PROG2 for their meaning FIND_LIBRARY(SSL_EAY_DEBUG NAMES ssleay32MDd PATHS $ENV{ProgramFiles}/OpenSSL/lib/VC/ $ENV{SystemDrive}/OpenSSL/lib/VC/ ) FIND_LIBRARY(SSL_EAY_RELEASE NAMES ssleay32MD PATHS $ENV{ProgramFiles}/OpenSSL/lib/VC/ $ENV{SystemDrive}/OpenSSL/lib/VC/ ) FIND_LIBRARY(LIB_EAY_DEBUG NAMES libeay32MDd PATHS $ENV{ProgramFiles}/OpenSSL/lib/VC/ $ENV{SystemDrive}/OpenSSL/lib/VC/ ) FIND_LIBRARY(LIB_EAY_RELEASE NAMES libeay32MD PATHS $ENV{ProgramFiles}/OpenSSL/lib/VC/ $ENV{SystemDrive}/OpenSSL/lib/VC/ ) IF(MSVC_IDE) IF(SSL_EAY_DEBUG AND SSL_EAY_RELEASE) SET(OPENSSL_LIBRARIES optimized ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE} debug ${SSL_EAY_DEBUG} ${LIB_EAY_DEBUG}) ELSE(SSL_EAY_DEBUG AND SSL_EAY_RELEASE) MESSAGE(FATAL_ERROR "Could not find the debug and release version of openssl") ENDIF(SSL_EAY_DEBUG AND SSL_EAY_RELEASE) ELSE(MSVC_IDE) STRING(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_TOLOWER) IF(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug) SET(OPENSSL_LIBRARIES ${SSL_EAY_DEBUG} ${LIB_EAY_DEBUG}) ELSE(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug) SET(OPENSSL_LIBRARIES ${SSL_EAY_RELEASE} ${LIB_EAY_RELEASE}) ENDIF(CMAKE_BUILD_TYPE_TOLOWER MATCHES debug) ENDIF(MSVC_IDE) MARK_AS_ADVANCED(SSL_EAY_DEBUG SSL_EAY_RELEASE LIB_EAY_DEBUG LIB_EAY_RELEASE) else(WIN32 AND MSVC) FIND_LIBRARY(OPENSSL_LIBRARIES NAMES ssl ssleay32 ssleay32MD libeay32 libeay32MD PATHS /usr/lib /usr/local/lib ) FIND_LIBRARY(CRYPTO_LIBRARIES crypto PATHS /usr/lib /usr/local/lib ) endif(WIN32 AND MSVC) if (OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) set(OPENSSL_FOUND TRUE) endif (OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) if (CRYPTO_LIBRARIES) set(CRYPTO_FOUND TRUE) message(STATUS "Found libcrypto: ${CRYPTO_LIBRARIES}") endif (CRYPTO_LIBRARIES) if (OPENSSL_FOUND) if (NOT OpenSSL_FIND_QUIETLY) message(STATUS "Found OpenSSL: ${OPENSSL_LIBRARIES}") endif (NOT OpenSSL_FIND_QUIETLY) else (OPENSSL_FOUND) if (OpenSSL_FIND_REQUIRED) message(FATAL_ERROR "Could NOT find OpenSSL") endif (OpenSSL_FIND_REQUIRED) endif (OPENSSL_FOUND) MARK_AS_ADVANCED(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES) endif (OPENSSL_INCLUDE_DIR AND OPENSSL_LIBRARIES) libzypp-17.36.5/cmake/modules/FindReadline.cmake000066400000000000000000000023341476576476200214760ustar00rootroot00000000000000# - Find readline library # This module looks for the GNU gettext tools. This module defines the # following values: # if(READLINE_INCLUDE_DIR AND READLINE_LIBRARY) # Already in cache, be silent set(READLINE_FIND_QUIETLY TRUE) endif(READLINE_INCLUDE_DIR AND READLINE_LIBRARY) set(READLINE_LIBRARY) set(READLINE_INCLUDE_DIR) FIND_PATH(READLINE_INCLUDE_DIR readline/readline.h /usr/include /usr/include/readline /usr/local/include /usr/include/readline ) # make find_library look only for shared lib # otherwise it would find the static libreadline.a SET(CMAKE_FIND_LIBRARY_SUFFIXES_BACKUP ${CMAKE_FIND_LIBRARY_SUFFIXES}) SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so") FIND_LIBRARY(READLINE_LIBRARY readline PATHS /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64 ) SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BACKUP}) if(READLINE_INCLUDE_DIR AND READLINE_LIBRARY) MESSAGE( STATUS "readline found: includes in ${READLINE_INCLUDE_DIR}, library in ${READLINE_LIBRARY}") set(READLINE_FOUND TRUE) else(READLINE_INCLUDE_DIR AND READLINE_LIBRARY) MESSAGE( STATUS "readline not found") endif(READLINE_INCLUDE_DIR AND READLINE_LIBRARY) MARK_AS_ADVANCED(READLINE_INCLUDE_DIR READLINE_LIBRARY) libzypp-17.36.5/cmake/modules/FindRpm.cmake000066400000000000000000000052461476576476200205160ustar00rootroot00000000000000 if(RPM_INCLUDE_DIR AND RPM_LIBRARY) # Already in cache, be silent set(RPM_FIND_QUIETLY TRUE) endif(RPM_INCLUDE_DIR AND RPM_LIBRARY) set(RPM_LIBRARY) set(RPMIO_LIBRARY) set(RPM_INCLUDE_DIR) FIND_PATH(RPM_INCLUDE_DIR rpm/rpmdb.h /usr/include /usr/local/include ) set(RPM_SUSPECT_VERSION "RPM_SUSPECT_VERSION-NOTFOUND" ) if ( RPM_INCLUDE_DIR ) FIND_PATH(RPM_SUSPECT_VERSION rpm/rpm4compat.h ${RPM_INCLUDE_DIR} NO_DEFAULT_PATH ) if ( RPM_SUSPECT_VERSION ) set(RPM_SUSPECT_VERSION "5.x" ) else ( RPM_SUSPECT_VERSION ) set(RPM_SUSPECT_VERSION "4.x" ) endif ( RPM_SUSPECT_VERSION ) endif ( RPM_INCLUDE_DIR ) FIND_LIBRARY(RPM_LIBRARY NAMES rpm PATHS /usr/lib /usr/local/lib ) FIND_LIBRARY(RPMIO_LIBRARY NAMES rpmio PATHS /usr/lib /usr/local/lib ) if(RPM_INCLUDE_DIR AND RPM_LIBRARY AND RPMIO_LIBRARY) MESSAGE( STATUS "rpm found: includes in ${RPM_INCLUDE_DIR}, library in ${RPM_LIBRARY}, librpmio in ${RPMIO_LIBRARY} (suspect ${RPM_SUSPECT_VERSION})") if ( "${RPM_SUSPECT_VERSION}" STREQUAL "4.x" ) set( ZYPP_RPM_VERSION_INCL "rpm/rpmlib.h" ) else() set( ZYPP_RPM_VERSION_INCL "rpm/rpmtag.h" ) endif() configure_file( "${CMAKE_CURRENT_LIST_DIR}/printrpmver.c.in" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/printrpmver.c" @ONLY ) try_run( RPM_VER_EXITCODE RPM_VER_COMPRESULT "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/printrpmver.c" LINK_LIBRARIES ${RPM_LIBRARY} CMAKE_FLAGS -DINCLUDE_DIRECTORIES="${RPM_INCLUDE_DIR}" COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} COMPILE_OUTPUT_VARIABLE RPM_PRINTVER_COMPILE_OUTPUT RUN_OUTPUT_VARIABLE RPM_LIB_VER ) if ( NOT RPM_VER_COMPRESULT OR NOT RPM_VER_EXITCODE EQUAL 0 ) message( WARNING "Could not determine rpm version" ) if ( NOT RPM_VER_COMPRESULT ) message( WARNING "Compilation failed: ") message( WARNING "${RPM_PRINTVER_COMPILE_OUTPUT}") endif() else () string(REGEX MATCHALL "[^.^-]+" RPM_VER_PARTS "${RPM_LIB_VER}") list( LENGTH RPM_VER_PARTS RPM_VER_PARTS_CNT ) if ( RPM_VER_PARTS_CNT GREATER_EQUAL 3 ) list( GET RPM_VER_PARTS 0 RPM_LIB_VER_MAJ ) list( GET RPM_VER_PARTS 1 RPM_LIB_VER_MIN ) list( GET RPM_VER_PARTS 2 RPM_LIB_VER_PATCH ) message ( STATUS "Detected RPM version is: maj:${RPM_LIB_VER_MAJ} min:${RPM_LIB_VER_MIN} patch:${RPM_LIB_VER_PATCH}" ) set(RPM_FOUND TRUE) endif() endif() else(RPM_INCLUDE_DIR AND RPM_LIBRARY AND RPMIO_LIBRARY) MESSAGE( STATUS "rpm not found") endif(RPM_INCLUDE_DIR AND RPM_LIBRARY AND RPMIO_LIBRARY) MARK_AS_ADVANCED(RPM_INCLUDE_DIR RPM_LIBRARY) libzypp-17.36.5/cmake/modules/FindUdev.cmake000066400000000000000000000010251476576476200206520ustar00rootroot00000000000000 SET( UDEV_LIBRARY ) SET( UDEV_INCLUDE_DIR ) FIND_PATH( UDEV_INCLUDE_DIR libudev.h /usr/include /usr/local/include ) FIND_LIBRARY( UDEV_LIBRARY NAMES udev PATHS /usr/lib /usr/local/lib ) # check if udev is usable for us INCLUDE (CheckSymbolExists) SET(CMAKE_REQUIRED_LIBRARIES udev) CHECK_SYMBOL_EXISTS(udev_enumerate_new libudev.h USABLE_UDEV) SET(CMAKE_REQUIRED_LIBRARIES "") FIND_PACKAGE_HANDLE_STANDARD_ARGS( Udev DEFAULT_MSG UDEV_LIBRARY UDEV_INCLUDE_DIR USABLE_UDEV) MARK_AS_ADVANCED( UDEV_LIBRARY UDEV_INCLUDE_DIR ) libzypp-17.36.5/cmake/modules/FindZsync.cmake000066400000000000000000000014461476576476200210640ustar00rootroot00000000000000 if(ZSYNC_INCLUDE_DIR AND ZSYNC_LIBRARY) # Already in cache, be silent set(ZSYNC_FIND_QUIETLY TRUE) endif(ZSYNC_INCLUDE_DIR AND ZSYNC_LIBRARY) set(ZSYNC_LIBRARY) set(ZSYNC_INCLUDE_DIR) FIND_PATH(ZSYNC_INCLUDE_DIR zsync.h /usr/include /usr/local/include ) FIND_LIBRARY(ZSYNC_LIBRARY NAMES zsync PATHS /usr/lib /usr/local/lib ) FIND_LIBRARY(RCKSUM_LIBRARY NAMES rcksum PATHS /usr/lib /usr/local/lib ) if(ZSYNC_INCLUDE_DIR AND ZSYNC_LIBRARY AND RCKSUM_LIBRARY) MESSAGE( STATUS "zsync found: includes in ${ZSYNC_INCLUDE_DIR}, library in ${ZSYNC_LIBRARY}") set(ZSYNC_FOUND TRUE) else(ZSYNC_INCLUDE_DIR AND ZSYNC_LIBRARY) MESSAGE( STATUS "zsync not found") endif(ZSYNC_INCLUDE_DIR AND ZSYNC_LIBRARY AND RCKSUM_LIBRARY) MARK_AS_ADVANCED(ZSYNC_INCLUDE_DIR ZSYNC_LIBRARY RCKSUM_LIBRARY)libzypp-17.36.5/cmake/modules/Findlibproxy.cmake000066400000000000000000000005121476576476200216170ustar00rootroot00000000000000# The "real" libproxy provides its own Findlibproxy.cmake but saner, simpler # alternatives like the PacRunner replacement which *just* queries PacRunner # directly will only provide a .pc file. So use pkg-config to find it... if(NOT PKG_CONFIG_FOUND) include(FindPkgConfig) endif() PKG_CHECK_MODULES( LIBPROXY libproxy-1.0 ) libzypp-17.36.5/cmake/modules/ZyppCommon.cmake000066400000000000000000000122751476576476200212720ustar00rootroot00000000000000include(GNUInstallDirs) # Library IF ( DEFINED LIB ) SET ( LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${LIB}" ) ELSE ( DEFINED LIB ) SET ( LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" ) ENDIF ( DEFINED LIB ) MESSAGE(STATUS "Libraries will be installed in ${LIB_INSTALL_DIR}" ) # Headers IF (DEFINED INCLUDE) SET (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/${INCLUDE}") else (DEFINED INCLUDE) SET (INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include") ENDIF (DEFINED INCLUDE) MESSAGE (STATUS "Header files will be installed in ${INCLUDE_INSTALL_DIR}") # system configuration dir (etc) IF( NOT DEFINED SYSCONFDIR ) IF ( ${CMAKE_INSTALL_PREFIX} STREQUAL "/usr" ) # if installing in usr, set sysconfg to etc SET( SYSCONFDIR /etc ) ELSE ( ${CMAKE_INSTALL_PREFIX} STREQUAL "/usr" ) SET ( SYSCONFDIR "${CMAKE_INSTALL_PREFIX}/etc" ) ENDIF ( ${CMAKE_INSTALL_PREFIX} STREQUAL "/usr" ) ENDIF( NOT DEFINED SYSCONFDIR ) MESSAGE(STATUS "Config files will be installed in ${SYSCONFDIR}" ) # install directory for private executables that are not for the user SET ( ZYPP_LIBEXEC_INSTALL_DIR "${CMAKE_INSTALL_FULL_LIBEXECDIR}/zypp" ) # usr INSTALL_PREFIX IF( DEFINED CMAKE_INSTALL_PREFIX ) SET( INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} ) ELSE( DEFINED CMAKE_INSTALL_PREFIX ) SET( INSTALL_PREFIX /usr ) ENDIF( DEFINED CMAKE_INSTALL_PREFIX ) # system configuration dir (etc) IF( NOT DEFINED MANDIR ) SET( MANDIR ${INSTALL_PREFIX}/share/man ) ENDIF( NOT DEFINED MANDIR ) MESSAGE( "** Manual files will be installed in ${MANDIR}" ) #################################################################### # CONFIGURATION # #################################################################### IF( NOT DEFINED DOC_INSTALL_DIR ) SET( DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/packages/${PACKAGE}" CACHE PATH "The install dir for documentation (default prefix/share/doc/packages/${PACKAGE})" FORCE ) ENDIF( NOT DEFINED DOC_INSTALL_DIR ) #################################################################### # INCLUDES # #################################################################### SET( ZYPPCOMMON_CXX_STANDARD 17 ) #SET (CMAKE_INCLUDE_DIRECTORIES_BEFORE ON) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} SYSTEM ) #################################################################### # RPM SPEC # #################################################################### MACRO(SPECFILE) MESSAGE(STATUS "Writing spec file...") CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/${PACKAGE}.spec.cmake ${PROJECT_BINARY_DIR}/package/${PACKAGE}.spec @ONLY) MESSAGE(STATUS "I hate you rpm-lint...!!!") IF (EXISTS ${PROJECT_SOURCE_DIR}/package/${PACKAGE}-rpmlint.cmake) CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/package/${PACKAGE}-rpmlint.cmake ${PROJECT_BINARY_DIR}/package/${PACKAGE}-rpmlintrc @ONLY) ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/package/${PACKAGE}-rpmlint.cmake) ENDMACRO(SPECFILE) MACRO(PKGCONFGFILE) MESSAGE(STATUS "Writing pkg-config file...") CONFIGURE_FILE(${PROJECT_SOURCE_DIR}/libzypp.pc.cmake ${PROJECT_BINARY_DIR}/libzypp.pc @ONLY) INSTALL( FILES ${PROJECT_BINARY_DIR}/libzypp.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) ENDMACRO(PKGCONFGFILE) #################################################################### # INSTALL # #################################################################### MACRO(GENERATE_PACKAGING PACKAGE VERSION) # The following components are regex's to match anywhere (unless anchored) # in absolute path + filename to find files or directories to be excluded # from source tarball. SET (CPACK_SOURCE_IGNORE_FILES # hidden files "/\\\\..+$" # temporary files "\\\\.swp$" # backup files "~$" # others "\\\\.#" "/#" "/build/" "/_build/" # used before "/CVS/" "\\\\.o$" "\\\\.lo$" "\\\\.la$" "Makefile\\\\.in$" ) SET(CPACK_PACKAGE_VENDOR "SUSE LLC") SET( CPACK_GENERATOR "TBZ2") SET( CPACK_SOURCE_GENERATOR "TBZ2") SET( CPACK_SOURCE_PACKAGE_FILE_NAME "${PACKAGE}-${VERSION}" ) INCLUDE(CPack) SPECFILE() if ( ZYPP_STACK_BUILD ) set( target_prefix "${PROJECT_NAME}_" ) endif() ADD_CUSTOM_TARGET( ${target_prefix}svncheck COMMAND cd ${PROJECT_SOURCE_DIR} && LC_ALL=C git status | grep -q "nothing to commit .working directory clean." ) SET( AUTOBUILD_COMMAND COMMAND ${CMAKE_COMMAND} -E remove ${PROJECT_BINARY_DIR}/package/*.tar.bz2 COMMAND ${CMAKE_MAKE_PROGRAM} package_source COMMAND ${CMAKE_COMMAND} -E copy ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.bz2 ${PROJECT_BINARY_DIR}/package COMMAND ${CMAKE_COMMAND} -E remove ${CPACK_SOURCE_PACKAGE_FILE_NAME}.tar.bz2 COMMAND ${CMAKE_COMMAND} -E copy "${PROJECT_SOURCE_DIR}/package/${PACKAGE}.changes" "${PROJECT_BINARY_DIR}/package/${PACKAGE}.changes" ) ADD_CUSTOM_TARGET( ${target_prefix}srcpackage_local ${AUTOBUILD_COMMAND} ) ADD_CUSTOM_TARGET( ${target_prefix}srcpackage COMMAND ${CMAKE_MAKE_PROGRAM} svncheck ${AUTOBUILD_COMMAND} ) ENDMACRO(GENERATE_PACKAGING) libzypp-17.36.5/cmake/modules/ZyppConfig.cmake000066400000000000000000000031671476576476200212470ustar00rootroot00000000000000 IF (DEFINED ZYPP_PREFIX) MESSAGE(STATUS "ZYpp library prefix set to ${ZYPP_PREFIX}") ELSE (DEFINED ZYPP_PREFIX) MESSAGE(STATUS "ZYpp path not set. Looking for it.") ENDIF (DEFINED ZYPP_PREFIX) if(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY) # Already in cache, be silent SET(ZYPP_FIND_QUIETLY TRUE) endif(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY) set(ZYPP_LIBRARY) set(ZYPP_INCLUDE_DIR) IF (DEFINED ZYPP_PREFIX) MESSAGE( STATUS "Looking in ${ZYPP_PREFIX}") FIND_PATH(ZYPP_INCLUDE_DIR zypp/ZYpp.h ${ZYPP_PREFIX}/include NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH ) FIND_LIBRARY(ZYPP_LIBRARY NAMES zypp PATHS ${ZYPP_PREFIX}/lib ${ZYPP_PREFIX}/lib64 NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH ) FIND_LIBRARY(ZYPP_TUI_LIBRARY NAMES zypp-tui PATHS ${ZYPP_PREFIX}/lib ${ZYPP_PREFIX}/lib64 NO_DEFAULT_PATH NO_SYSTEM_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH ) ELSE (DEFINED ZYPP_PREFIX) FIND_PATH(ZYPP_INCLUDE_DIR zypp/ZYpp.h /usr/include /usr/local/include ) FIND_LIBRARY(ZYPP_LIBRARY NAMES zypp PATHS /usr/lib /usr/local/lib ) FIND_LIBRARY(ZYPP_TUI_LIBRARY NAMES zypp-tui PATHS /usr/lib /usr/local/lib ) ENDIF (DEFINED ZYPP_PREFIX) if(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY) MESSAGE( STATUS "ZYpp found: includes in ${ZYPP_INCLUDE_DIR}, library in ${ZYPP_LIBRARY}, tui library in ${ZYPP_TUI_LIBRARY}") set(ZYPP_FOUND TRUE) else(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY) MESSAGE( FATAL "ZYpp not found") endif(ZYPP_INCLUDE_DIR AND ZYPP_LIBRARY) MARK_AS_ADVANCED(ZYPP_INCLUDE_DIR ZYPP_LIBRARY) libzypp-17.36.5/cmake/modules/printrpmver.c.in000066400000000000000000000002051476576476200213040ustar00rootroot00000000000000#include #include <@ZYPP_RPM_VERSION_INCL@> int main ( int argc , char* argv[] ) { printf("%s\n", rpmEVR); return 0; } libzypp-17.36.5/doc/000077500000000000000000000000001476576476200141635ustar00rootroot00000000000000libzypp-17.36.5/doc/CMakeLists.txt000066400000000000000000000037541476576476200167340ustar00rootroot00000000000000IF ( ENABLE_BUILD_DOCS ) ADD_SUBDIRECTORY( autodoc ) ELSE ( ENABLE_BUILD_DOCS ) ADD_SUBDIRECTORY( autodoc EXCLUDE_FROM_ALL ) ENDIF ( ENABLE_BUILD_DOCS ) FIND_PROGRAM(A2X a2x) IF (A2X) MESSAGE("a2x found: ${A2X}") SET(ASCDOC_CMD ${A2X} -D ${CMAKE_CURRENT_BINARY_DIR} -f manpage) ENDIF (A2X) FIND_PROGRAM(ASCIIDOC asciidoctor) IF (ASCIIDOC) MESSAGE("asciidoctor found: ${ASCIIDOC}") SET(ASCDOC_CMD ${ASCIIDOC} -D ${CMAKE_CURRENT_BINARY_DIR} -b manpage -d manpage) ENDIF (ASCIIDOC) IF (NOT ASCDOC_CMD) MESSAGE(FATAL_ERROR "Could not find a2x or asciidoctor, please install either one of them.") ENDIF() function(ADD_A2X_MANPAGES) set(options) set(oneValueArgs MAN_INST_PATH) set(multiValueArgs MAN_PAGES1 MAN_PAGES2 MAN_PAGES3 MAN_PAGES4 MAN_PAGES5 MAN_PAGES6 MAN_PAGES7 MAN_PAGES8) cmake_parse_arguments(A2X "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} ) set(ALL_MAN_PAGES) FOREACH (MAN_IDX RANGE 1 8) IF (NOT DEFINED A2X_MAN_PAGES${MAN_IDX}) CONTINUE() ENDIF() FOREACH (curr_PAGE ${A2X_MAN_PAGES${MAN_IDX}}) ADD_CUSTOM_COMMAND ( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${curr_PAGE} COMMAND ${ASCDOC_CMD} ${CMAKE_CURRENT_SOURCE_DIR}/${curr_PAGE}.txt DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${curr_PAGE}.txt WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Building manpage ${curr_PAGE}" ) ADD_CUSTOM_TARGET( ${curr_PAGE}_Target ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${curr_PAGE} ) INSTALL ( FILES ${CMAKE_CURRENT_BINARY_DIR}/${curr_PAGE} DESTINATION "${A2X_MAN_INST_PATH}/man${MAN_IDX}" ) ENDFOREACH () ENDFOREACH() endfunction(ADD_A2X_MANPAGES) SET (libzypp_MAN1 zypp-NameReqPrv.1) SET (libzypp_MAN5 locks.5) ADD_A2X_MANPAGES( MAN_INST_PATH ${MANDIR} MAN_PAGES1 ${libzypp_MAN1} MAN_PAGES5 ${libzypp_MAN5} ) libzypp-17.36.5/doc/autodoc/000077500000000000000000000000001476576476200156215ustar00rootroot00000000000000libzypp-17.36.5/doc/autodoc/CMakeLists.txt000066400000000000000000000043701476576476200203650ustar00rootroot00000000000000### ################################################## IF ( DOXYGEN ) ### ################################################## FIND_PROGRAM( DOT dot ) IF ( NOT DOT ) MESSAGE( "dot not found: you should install graphviz." ) SET( HAVE_DOT NO ) ELSE ( NOT DOT ) SET( HAVE_DOT YES ) ENDIF ( NOT DOT ) SET( ZYPP_PROJECT_ROOT ${LIBZYPP_SOURCE_DIR} ) STRING( JOIN " " ZYPP_SOURCE_DIRS ${LIBZYPP_SOURCE_DIR}/zypp ${LIBZYPP_SOURCE_DIR}/zypp-core ${LIBZYPP_SOURCE_DIR}/zypp-curl ${LIBZYPP_SOURCE_DIR}/zypp-media ${LIBZYPP_SOURCE_DIR}/zypp-proto ${LIBZYPP_SOURCE_DIR}/zypp-tui ) SET( ZYPP_DOCINCLUDE_DIR ${LIBZYPP_SOURCE_DIR}/doc/autoinclude ) SET( DOXYGEN_INPUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile ) SET( DOXYGEN_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/html/index.html ) SET( DOXYGEN_WARNINGS ${CMAKE_CURRENT_BINARY_DIR}/Doxywarnings ) FILE( MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html ) ### ################################################## CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.cmake ${DOXYGEN_INPUT} @ONLY ) ### ################################################## ADD_CUSTOM_COMMAND ( OUTPUT ${DOXYGEN_OUTPUT} COMMAND ${CMAKE_COMMAND} -E echo_append "Building Documentation..." COMMAND ${DOXYGEN} ${DOXYGEN_INPUT} || { echo '*** IGNORE FAILED DOXYGEN - DOC MIGHT BE INCOMPLETE!'\; true\; } COMMAND ${CMAKE_COMMAND} -E echo "Done." WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${DOXYGEN_INPUT} ) ADD_CUSTOM_TARGET( doc ALL DEPENDS ${DOXYGEN_OUTPUT} ) ADD_CUSTOM_TARGET( doc_forced COMMAND ${CMAKE_COMMAND} -E echo_append "Building Documentation..." COMMAND ${DOXYGEN} ${DOXYGEN_INPUT} || { echo '*** IGNORE FAILED DOXYGEN - DOC MIGHT BE INCOMPLETE!'\; true\; } COMMAND ${CMAKE_COMMAND} -E echo "Done." WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${DOXYGEN_INPUT} ) ### ################################################## INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/libzypp.doxytag DESTINATION ${DOC_INSTALL_DIR}/libzypp/libzypp.doxytag ) INSTALL( DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html DESTINATION ${DOC_INSTALL_DIR}/libzypp ) ### ################################################## ENDIF ( DOXYGEN ) ### ################################################## libzypp-17.36.5/doc/autodoc/Doxyfile.cmake000066400000000000000000000203071476576476200204100ustar00rootroot00000000000000# Doxyfile 1.4.4 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- PROJECT_NAME = @PACKAGE@ PROJECT_NUMBER = @VERSION@ OUTPUT_DIRECTORY = CREATE_SUBDIRS = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = YES STRIP_FROM_PATH = @ZYPP_PROJECT_ROOT@ STRIP_FROM_INC_PATH = @ZYPP_PROJECT_ROOT@ #STRIP_FROM_INC_PATH = @ZYPP_PROJECT_ROOT@/zypp @ZYPP_PROJECT_ROOT@/zypp-core SHORT_NAMES = NO JAVADOC_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = NO INHERIT_DOCS = YES DISTRIBUTE_GROUP_DOC = NO SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = YES EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO SORT_BY_SCOPE_NAME = NO GENERATE_TODOLIST = YES GENERATE_TESTLIST = YES GENERATE_BUGLIST = YES GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = YES WARNINGS = YES WARN_IF_UNDOCUMENTED = YES WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = @DOXYGEN_WARNINGS@ #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = @ZYPP_SOURCE_DIRS@ FILE_PATTERNS = *.h *.hh *.hxx *.hpp *.h++ *.c *.cc *.cxx *.cpp *.c++ *.tcc *.hcc *.doc RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = #EXCLUDE_PATTERNS = */zyppng/* EXAMPLE_PATH = @ZYPP_DOCINCLUDE_DIR@ EXAMPLE_PATTERNS = EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = NO REFERENCES_RELATION = NO USE_HTAGS = NO VERBATIM_HEADERS = NO #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = HTML_FOOTER = HTML_STYLESHEET = GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO BINARY_TOC = NO TOC_EXPAND = NO DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = YES TREEVIEW_WIDTH = 250 USE_MATHJAX = YES #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex COMPACT_LATEX = NO PAPER_TYPE = a4wide EXTRA_PACKAGES = LATEX_HEADER = PDF_HYPERLINKS = NO USE_PDFLATEX = NO LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = @PACKAGE@.doxytag ALLEXTERNALS = NO EXTERNAL_GROUPS = YES PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES HIDE_UNDOC_RELATIONS = NO HAVE_DOT = @HAVE_DOT@ CLASS_GRAPH = YES COLLABORATION_GRAPH = NO GROUP_GRAPHS = NO UML_LOOK = NO TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = NO DOT_IMAGE_FORMAT = png DOT_PATH = DOTFILE_DIRS = MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- SEARCHENGINE = NO libzypp-17.36.5/doc/autoinclude/000077500000000000000000000000001476576476200164775ustar00rootroot00000000000000libzypp-17.36.5/doc/autoinclude/ApplicationMetada.doc000066400000000000000000000007661476576476200225560ustar00rootroot00000000000000/** \page zypp-appdata [Dropped in Code 15] Code 12 Application Metadata \author Michael Andres
\section zypp-appdata_intro Intro In Code12 we introduced \c application as new kind of resolvable object (see e.g. http://worldofgnome.org/gnome-software-on-opensuse). In Code15 (with libyzpp-17.7.0) we dropped type \c application due to poor AppStream metadata support (bsc#1100095, bsc#1104415). */ libzypp-17.36.5/doc/autoinclude/CodePitfalls.doc000066400000000000000000000027141476576476200215430ustar00rootroot00000000000000namespace zypp { /** \page CodePitfalls Code Pitfalls - Frequently made mistakes \section TriBoolCompare Comparing TriBool values Comparing two \ref TriBool values is not as easy as it might look like, because the \c TriBool::operator== and \c TriBool::operator!= return a \ref TriBool. For example is (indeterminate==indeterminate) not \c true, but \c indeterminate. That's why the following snippet does not do what the author expected: \code // buggy option class struct Option { public: Option() : _value( indeterminate ) {} bool get() const { return ( _value == indeterminate ) ? true : bool(_value); } void set( bool new_r ) { _value = new_r; } private: tribool _value; }; \endcode You find that \c get() returns \c false as long as the option is unset, and not \c true as the code suggests. That's because (_value==indeterminate) returns \c indeterminate. \note Always use \c indeterminate(_value) to test whether a TriBools value is \c indeterminate: \code bool get() const { return indeterminate( _value ) ? true : bool(_value); } \endcode \code tribool _value; ... if ( indeterminate( _value ) ) { ... } // indeterminate else if ( _value ) { ... } // true else { ... } // false \endcode
*/ } libzypp-17.36.5/doc/autoinclude/EnvironmentVariables.doc000066400000000000000000000064751476576476200233370ustar00rootroot00000000000000/** \page zypp-envars Environment Variables \author Michael Andres \section zypp-envars-intro Environment Variables Note that for Boolean variables we usually test whether the variable exists and not for the assigned value. \subsection zypp-envars-config zypp config options \li \c ZYPP_CONF= Location of the zypp.conf file. \li \c ZYPP_LOCK_TIMEOUT= If zypp is locked by another process wait this number of seconds for the lock becoming available. A negative value will wait forever. \subsection zypp-envars-repos Variables related to repositories \li \c ZYPP_REPO_RELEASEVER= Overwrite the \c $releasever variable in repository URLs and names (\see zypp::repo::RepoVariablesStringReplacer). \subsection zypp-envars-commit Variables related to commit \li \c ZYPP_IS_RUNNING=1 Set during commit so packages pre/post/trigger scripts can detect whether rpm was called from within libzypp. \li \c ZYPP_SINGLE_RPMTRANS=1 Enable alternative and !!!experimental!!! commit strategy where all rpm operations are executed in a single rpm transaction, which results in much faster commits. \subsection zypp-envars-logging Variables related to logging \li \c ZYPP_LOGFILE= Location of the logfile to write or \c - for stderr. \li \c ZYPP_FULLLOG=1 Even more verbose logging (usually not needed). \li \c ZYPP_LIBSOLV_FULLLOG=1 Verbose logging when resolving dependencies. \li (\c ZYPP_LIBSAT_FULLLOG=1) deprecated since \c libzypp-10.x, prefer \c ZYPP_LIBSOLV_FULLLOG \li \c LIBSOLV_DEBUGMASK= Pass value to libsolv::pool_setdebugmask \li \c ZYPP_MEDIA_CURL_DEBUG=<1|2> Log http headers, if \c 2 also log server responses. \li \c ZYPP_MEDIA_CURL_IPRESOLVE=<4|6> Tell curl to resolve names to IPv4/IPv6 addresses only. \li \c ZYPP_METALINK_DEBUG=1 Log URL and priority of the mirrors parsed from a metalink file. \li \c ZYPP_RPM_DEBUG=1 Log verbose output from all rpm commands. \subsection zypp-envars-mediabackend Selecting the mediabackend to use. \li \c ZYPP_MULTICURL=0 Turn off multicurl (metalink and zsync) and fall back to plain libcurl. \li \c ZYPP_CURL2=1 Turn on a lightweight experimental curl backend supporting zchunk downloads and a simple download strategy, overrules ZYPP_MULTICURL if both are set. \li \c ZYPP_PCK_PRELOAD=1 Turn on parallel HTTP downloads when commiting a transaction. \subsection zypp-envars-plugin Variables related to plugins \li \c ZYPP_PLUGIN_DEBUG=1 Verbose logging from plugin framework. \li \c ZYPP_PLUGIN_TIMEOUT= Send/receive timeout for plugin communication. \li \c ZYPP_PLUGIN_SEND_TIMEOUT= Send timeout for plugin communication. \li \c ZYPP_PLUGIN_RECEIVE_TIMEOUT= Receive timeout for plugin communication. \li \c ZYPP_PLUGIN_APPDATA_FORCE_COLLECT=1 Make RepoManager trigger the appdata collector plugin unconditionally. Can be used with \c 'zypper \c lr' (as root) to trigger an initial collect rather than calling \c 'zypper \c ref \c -f' or waiting for some repo to be refreshed. \subsection zypp-envars-misc Variables not for common use (test and debug) \li \c ZYPP_MODALIAS_SYSFS= Use this instead of \c /sys to evaluate modaliases. \li \c ZYPP_COMMIT_NO_PACKAGE_CACHE=1 \li \c ZYPP_TESTSUITE_FAKE_ARCH Never use this! \li \c ZYPPTMPDIR= \li \c ZYPP_LOCKFILE_ROOT= Hack to circumvent the currently poor --root support. \li \c ZYPP_PROFILING=1 */ libzypp-17.36.5/doc/autoinclude/FeatureTest.doc000066400000000000000000000046011476576476200214220ustar00rootroot00000000000000/** \page feature-test Testing for provided features. \author Michael Andres
\section intro Introduction The libzypp rpm package will indicate the presence of certain features by using special \c Provides: \verbatim # Provides: libzypp(FEATURE) = FEATURE_VERSION Provides: libzypp(code10) = 0 \endverbatim Packages requiring a feature may use the corresponding \c Requires: in their .spec file.
\section features Features
plugin
version 0
General ability to provide and handle plugins.
version 0.1
Bugfix: don't reject header values containing a ':'.
plugin:commit
\ref plugin-commit
version 0
Basic plugin indicating start and end of commit.
version 1
Added COMMITBEGIN/COMMITEND.
plugin:repoverification
\ref plugin-repoverification
version 0
Repository metadata verification beyond GPG.
plugin:services
\ref plugin-services
version 0
Provide a client a list of repositories.
version 1
Support multiple repo baseurls in plugin services.
plugin:system
\ref plugin-system
version 0
Plugin executed when system content change is detected (by now SUSE Manager/spacewalk only).
version 1
Plugin executed when system content change is detected (all installed plugins).
plugin:urlresolver
\ref plugin-url-resolver
version 0
Convert urls of scheme "plugin" into a supported scheme.
repovarexpand
\ref zypp-repovars
version 0
Also support braced variables, shell like default and alternate values.
version 1
Also support user defined repo variables in /etc/zypp/vars.d.
version 1.1
Support repo variables in an URIs \c host and \c port component.
*/ libzypp-17.36.5/doc/autoinclude/Mainpage.doc000066400000000000000000000060171476576476200207130ustar00rootroot00000000000000/** \mainpage Welcome to libzypp \section intro Introduction Welcome to the libzypp documentation. libzypp is the package management library that powers applications like YaST, zypper and the openSUSE/SLE implementation of PackageKit. \section whatis What is libzypp? libzypp provides all the functionality for a package manager: - An API for package repository management, supporting most common repository metadata formats and signed repositories. - An API for solving packages, products, patterns and patches (installation, removal, update and distribution upgrade operations) dependencies, with additional features like locking. - An API for commiting the transaction to the system over a rpm target. Supporting deltarpm calculation, media changing and installation order calculation. - An API for browsing available and installed software, with some facilities for programs with an user interface. - A suite of maintained solving testcases representing common and uncommon operations on Linux software management \section impl Implementation libzypp is implemented as a C++ library with experimental bindings available for python and ruby. \section otherfunc Other functionality offered by libzypp Most of libzypp functionality is implemented over components provided also by libzypp: - Media abstraction library offering a common interface over local files, http,ftp,iso,nfs and other protocols. \section thirdpfunc 3rd party software libzypp is based on Additionally, some functionality libzypp uses is based on 3rd party libraries: - SAT solver library, for dependency solving and repository data storage and querying - curl, that powers some protocols of the media abstraction component - boost, for misc. utilities like shared pointers, functors and algorithms. \section join Join the community Visit our web site at : http://en.opensuse.org/Libzypp or #zypp on irc.freenode.net \section license License \code /*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ Copyright (C) 2000-2002 Ximian, Inc. Copyright (C) 2005 SUSE Linux Products GmbH ZYpp is licensed under the GNU General Public License version 2 or later. The text of the GNU General Public License can be viewed at http://www.gnu.org/licenses/gpl.html As a special exception, you have permission to link this program with the following libraries and distribute executables, as long as you follow the requirements of the GNU GPL in regard to all of the software in the executable aside from the following libraries: - OpenSSL (http://www.openssl.org) \endcode */libzypp-17.36.5/doc/autoinclude/Modalias.doc000066400000000000000000000012651476576476200207230ustar00rootroot00000000000000/** \page zypp-modalias Hardware (modalias) dependencies \author Michael Andres
Rpm packages which support a specific hardware and should be installed automatically if this hardware is present use \c modalias() supplements. \c FNMATCH(3) is used to match the defined pattern against the systems modalias definitions. \note Special characters not allowed to occur in a spec-files \c Supplements: definition may be %Hexencoded. \code # of:NfirmwareT*Craspberrypi,bcm2835-firmwareC* Supplements: modalias(of:NfirmwareT*Craspberrypi%2Cbcm2835-firmwareC*) \endcode */ libzypp-17.36.5/doc/autoinclude/PatternPackages.doc000066400000000000000000000077001476576476200222460ustar00rootroot00000000000000/** \page zypp-pattern-packages Code 12 Pattern Packages \author Michael Andres
\section zypp-pattern-packages_intro Intro Since Code12 (SLES-12) we utilize a new method of defining patterns, as opposed to the older XML-based patterns files. A pattern and its dependencies are now represented by a rpm package and the few pattern specific properties are provided by the package. No extra XML-file is needed. By convention a patterns-package for a pattern:FOO is named patterns-[*-]FOO and is must provide pattern() = FOO. Usually the patterns-package name has a distribution or product identifier embedded, like in patterns-sles-Minimal or patterns-openSUSE-xfce. The patterns content is expressed by the patterns-packages' dependencies to other packages and patterns-packages. The list of patterns-package provides used for the new pattern autogeneration:
Basic provides relevant for package management (libzypp/zypper):
Provides: pattern() = FOO The patterns name: FOO. Additional attributes like version, release, architecture, summary and description are taken from the pattenrs-package.
Provides: pattern-visible() A UI hint telling whether the pattern should be shown to the user. If the provides is missing, the UI will usually hide the pattern in lists and output. This is mainly used for helper patterns defining a basic content which is then required/recommended by different (visible) patterns.
Additional pattern properties not used by libzypp, but provided by the API mainly for the YAST UI:
Provides: pattern-icon() = STRING Name of an icon the UI should use for this pattern.
Provides: pattern-order() = STRING A string used by the UI for sorting patterns rather than 'by name'. Usually some 4-digit string like "1750"
Provides: pattern-category() = STRING The category name used in the UI in English (en).
Provides: pattern-category(de) = STRING The category name translated. E.g. into German (de).
Provides: pattern-includes() = STRING Hint for the UI to include an other patterns content (i.e. its required and recommended packages) in this patterns content list. Usually used to embed the content of an invisible pattern in a visible one.
Provides: pattern-extends() = STRING Reverse-includes. Hint for the UI to include this patterns content (i.e. its required and recommended packages) in an other patterns content list. Usually used to embed the content of an invisible pattern in a visible one.
STRING must be url-hexencoded so that it does not contain any characters that rpm-provides can't have.
E.g.: ' ' => %20 / ',' => %2C / '-' => %2D
\code patterns-sles-Minimal-12-37.1.x86_64.rpm PROVIDES { pattern() == Minimal pattern-icon() == pattern-basis pattern-order() == 1099 pattern-visible() pattern-category() == Base%20Technologies pattern-category(ar) == %D8%A7%D9%84%D8%AA%D9%83%D9%86%D9%88%D9%84%D9%88%D8%AC%D9%8A%D8%A7%D8%AA%20%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9 pattern-category(ca) == Tecnologies%20de%20base pattern-category(cs) == Z%C3%A1kladn%C3%AD%20technologie pattern-category(da) == Basisteknologier pattern-category(de) == Basistechnologien ... } REQUIRES { systemd coreutils insserv aaa_base ... } RECOMMENDS (22){ grub2 rpcbind nfs-client rsyslog ... } \endcode */ libzypp-17.36.5/doc/autoinclude/Plugin-Commit.doc000066400000000000000000000070421476576476200216550ustar00rootroot00000000000000/** \page plugin-commit Commit plugin \author Michael Andres
\section intro Introduction This is a statefull plugin executed during \ref zypp::ZYpp::commit. At the beginning of a commit all plugins found in \c /usr/lib/zypp/plugins/commit are launched. The plugins will receive messages as commit proceeds. Unless otherwise specified messages received need to be confirmed by sending an \c ACC message. Sending back an unexpected or \c ERROR message execution of the plugin will be canceled. If you have e.g. \c zypp-plugin-python installed a basic commit plugin could look like this: \verbatim #!/usr/bin/env python # # zypp commit plugin # import os import sys from zypp_plugin import Plugin class MyPlugin(Plugin): def PLUGINBEGIN(self, headers, body): # commit is going to start. if headers.has_key('userdata'): print "Commit starts with TID '%s'" % headers['userdata'] self.ack() def PLUGINEND(self, headers, body): # commit ended self.ack() plugin = MyPlugin() plugin.main() \endverbatim \see \ref plugin-writing
\section pluginbegin PLUGINBEGIN \verbatim PLUGINBEGIN userdata:TIDfoo42 ^@ \endverbatim Sent as 1st message after the plugin was launched. Prepare your plugin and send an \c ACC message when you are done. Commit will start after all plugins are initialized. \li \c userdata:stringval Optional header sent if the application has provided a user data string. \see \ref zypp-userdata
\section commitbegin COMMITBEGIN (added in v1) \verbatim COMMITBEGIN { "TransactionStepList": [ ,... ] } ^@ \endverbatim Sent before installation actually starts. The body contains a JSON encoded object providing the \c TransactionStepList, basically the list of install/remove actions the the commit is going to perform. Each \c TransactionStep is encoded as JSON object: \verbatim = { "type": # [optional] "stage": # [optional] "solvable": } = # ignore; implicit or non-package actions | "-" # remove | "+" # install | "M" # multi version install; install keeping the old version; e.g. kernel = # todo | "ok" # done | "err" # failed = { "n": # name "e": # epoch if not 0 [optional] "v": # version "r": # release "a": # architecture } \endverbatim \see \ref zypp::sat::Transaction::Step
\section commitend COMMITEND (added in v1) \verbatim COMMITEND { "TransactionStepList": [ ,... ] } ^@ \endverbatim Sent at the end of commit. The body contains a JSON encoded object providing the final \c TransactionStepList. The \c StepStage indicates whether the action succeeded, failed or was skipped (still 'todo'). \see \ref commitbegin
\section pluginend PLUGINEND \verbatim PLUGINEND ^@ \endverbatim This message is sent at the end of commit. You should receive this message even if commit was aborted by some unexpected exception. */ libzypp-17.36.5/doc/autoinclude/Plugin-Repoverification.doc000066400000000000000000000033431476576476200237350ustar00rootroot00000000000000/** \page plugin-repoverification Repository metadata verification plugin \author Michael Andres
\section intro Introduction Stateless plugins found in \c /usr/lib/zypp/plugins/repoverification are called during a repository metadata refresh, immediately after a repositories master index file has been downloaded and before any further GPG checks are performed. The plugins determine whether the repository is allowed to be used on the system or not. If a plugin returns not-zero, the repository is discarded and can not be used. All executable plugins found in \c /usr/lib/zypp/plugins/repoverification (relative to the RepoManagers root directory) are launched in arbitrary order. If the RepoManagers root directory is not \c /, the plugins are executed via \c chroot. Arguments passed to the plugin are:
--file PATH
Path to the repositories master index file.
--fsig PATH
Path to the master index files detached gpg signature. A path is always supplied, but whether it actually denotes a file depends on whether the master index file is actually signed.
--fkey PATH
Path to the ascii armored GPG key that signed the signature. A path is always supplied, but whether it actually denotes a file depends on whether the key is provided by the repo.
--ralias NAME
The alias of the repository.
All output written to stdout/stderr is forwarded to the application (zypper,YAST,PK...) and may become visible to the user. All output written to stderr is also captured in the logfile, in case logging is enabled by the application. \see \ref plugin-writing */ libzypp-17.36.5/doc/autoinclude/Plugin-System.doc000066400000000000000000000040441476576476200217100ustar00rootroot00000000000000/** \page plugin-system System plugin \author Michael Andres
\section intro Introduction This is a statefull plugin executed at the end of \ref zypp::ZYpp::commit, if the system content has change, i.e. if packages have actually been installed or deleted. All plugins found in \c /usr/lib/zypp/plugins/system are launched. Unless otherwise specified, messages received need to be confirmed by sending an \c ACC message. Sending back an unexpected or \c ERROR message, the execution of the plugin will be canceled. If you have e.g. \c zypp-plugin-python installed a basic system plugin could look like this: \verbatim #!/usr/bin/env python # # zypp system plugin # import os import sys from zypp_plugin import Plugin class MyPlugin(Plugin): def PACKAGESETCHANGED(self, headers, body): // Installation has ended. The set of installed packages has changed. // .... self.ack() def plugin = MyPlugin() plugin.main() \endverbatim \see \ref plugin-writing
\section pluginbegin PLUGINBEGIN \verbatim PLUGINBEGIN userdata:TIDfoo42 ^@ \endverbatim Sent as 1st message after the plugin was launched. Prepare your plugin and send an \c ACC message when you are done. \li \c userdata:stringval Optional header sent if the application has provided a user data string. \see \ref zypp-userdata
\section packagesetchanged PACKAGESETCHANGED \verbatim PACKAGESETCHANGED ^@ \endverbatim Installation has ended. The set of installed packages has changed. \see \ref zypp::sat::Transaction::Step
\section pluginend PLUGINEND \verbatim PLUGINEND ^@ \endverbatim This message is sent at the end before the plugin is closed. You should receive this message even if the action was aborted by some unexpected exception. */ libzypp-17.36.5/doc/autoinclude/Plugins.doc000066400000000000000000000215651476576476200206200ustar00rootroot00000000000000/** \page zypp-plugins Extending ZYpp: Plugins and Hooks \author Duncan Mac-Vicar P. \author Michael Andres
\section plugins-intro Introduction Plugins allow one to extend the ZYpp package manager without the need to change code. Plugins are designed as external programs so that they can be written in any language. \section plugin-protocols Plugin protocols Depending on the complexity and need for future extension, plugins talk to ZYpp using two methods. \subsection plugin-protocol-stateless Stateless This type of plugin receive input reading the standard input, and answer ZYpp writing to the standard output. This means the plugin is executed once per hook and they are stateless (unless the plugin keeps the state out of process). \subsection plugin-protocol-stateful Stateful This type of plugin is called by ZYpp and a conversation using a simple protocol. The protocol is based on STOMP https://stomp.github.io (Streaming Text Orientated Messaging Protocol). Messages (called "frames") look like the following: \verbatim COMMAND param1:val1 param2:val2 ... Thus a COMMAND followed by key:value header lines and a multiline body separated from header by an empty line and terminated by NUL. ^@ \endverbatim \note ^@ is a null (control-@ in ASCII) byte.
\section plugin-writing Writing plugins A python class is offered as a helper to handle communication between the plugin and libzypp. It is available by installing \c zypp-plugin-python. \verbatim zypper in -C zypp-plugin-python \endverbatim The plugin must define a method for each message it may receive from \ref libzypp. Message header list and body are passed to the method as arguments. \verbatim #!/usr/bin/env python # # zypp plugin # import os import sys from zypp_plugin import Plugin class MyPlugin(Plugin): def SAMPLE( self, headers, body ): # called upon revieving a SAMPLE message ... if ( ok ): self.ack() else: self.error( { "aheader":"header value" }, "body\n(multiline text ok)" ) plugin = MyPlugin() plugin.main() \endverbatim Two methods \c ack and \c error are available to send back a standard \c ACK or \c ERROR message. You may optionally pass header entries and a multiline body. For sending custom messages use \c answer, which takes the command name as 1st argument, followed by optional header entries and a multiline body. Plugin closes \c stdin and exits when receiving a \c _DISCONNECT message. Upon an \c ACK response to \c _DISCONNECT libzypp will not attempt to kill the script. An exit value different than \c 0 may be set via an \c 'exit' header in \c ACK. \verbatim def _DISCONNECT( self, headers, body ): sys.stding.close() self.ack( {'exit':'99'}, 'Famous last words.' ) \endverbatim
\section plugins-impl Developers: Implementation Plugins are implemented in the following classes: - \ref zypp::PluginScript (Plugin as an external program) - \ref zypp::PluginScriptException - \ref zypp::PluginFrame (Message for the stateful protocol) - \ref zypp::PluginFrameException - \ref zypp::repo::PluginServices (Finds Service plugins) The plugins default location is obtained from \ref zypp::ZConfig::pluginsPath()
\section plugin-toc Supported plugins \subpage plugin-commit Escort installation of packages \subpage plugin-system Receive notification if system content has changed \subpage plugin-repoverification Repository metadata verification beyond GPG \ref plugin-services \ref plugin-url-resolver \ref plugin-appdata
\section plugin-services Service plugins ZYpp will find a subscribed service for each executable located in /usr/lib/zypp/plugins/services and will set the alias as the executable name. The type will be set to "plugin". Service plugins are used to provide a client a list of repositories from a central location where more complex logic is needed than a simple remote xml index accessible via http (in that case you can use \ref services-remote "Remote Services"). \subsection plugin-services-example1 Example: Management console You have a custom mass management application that controls the repositories each client muss have. While you can use \ref services-remote "Remote Services" and subscribe each client to an url in the server providing a dynamic repoindex.xml based on the client, if you need to pass custom information in order for the server to calculate the repository list (e.g. number of CPUs) or the protocol that the client and the server and client speak is proprietary, you may implement the service locally, as an executable that will be installed in each client /usr/lib/zypp/plugins/services directory (it may be installed from a package). \subsection plugin-services-how How to write a Services plugin When listing services, ZYpp will find each plugin service as a subscribed service. Service plugins are Stateless. When services are refreshed, ZYpp will call each plugin and the repository list will be taken from the output of the script in INI format (same as how they are stored in /etc/zypp/repos.d). For our example: \verbatim # example plugin output # comments are ignored [repo1] name=Base repository summary=Standard repository baseurl=http://server.com/repo1 type=rpm-md # multiple repositories can be present in the output [repo2] ... \endverbatim The repositories will be added on service refresh with the alias present in the output, prefixed by the service alias (in this case, the executable name). To protect your code from e.g python modules writing their own messages to stdout, you should use a copy of stdout and redirect stdout to stderr (Python3 may need a slightly different print syntax): \verbatim #!/usr/bin/python import sys sendback = sys.stdout sys.stdout = sys.stderr print >>sendback, "# example plugin output" print >>sendback, "# comments are ignored" print >>sendback, "[repo1]" print >>sendback, "name=Base repository" ... \endverbatim
\section plugin-url-resolver Url Resolver plugins Url resolver plugins convert urls of scheme "plugin" into the output of the plugin named $name using the protocol. Thanks to the protocol, each header returned is also added as HTTP headers. The current protocol sequence is: ZYpp sees a repository whose url has the format: \verbatim plugin:foo?param1=val1¶m2=val2 \endverbatim ZYpp tries to execute a plugin named foo (in /usr/lib/zypp/plugins/urlresolver) and call it with the following protocol: \verbatim RESOLVEURL param1:val1 param2:val2 ... ^@ \endverbatim The plugin answers: \verbatim RESOLVEDURL: header1:val1 header2:val2 ... http://realurl.com?opts=vals ^@ \endverbatim And this url is used instead. \subsection plugin-urlresolver-example Example You have a repository with url: plugin:lan The script looks which distribution you have installed, and via SLP finds the right repositories in the lan and selects the update one and returns it url. But in addition, it adds a header with the update status that can be collected on the server side. This type of plugin can be combined with service plugins, because a local service could return a list of repos like this: \verbatim [distro] name=Distribution repository baseurl=plugin:lan?repo=distro [update] name=Update repository baseurl=plugin:lan?repo=update \endverbatim \note In this example, the service plugin could have inmediately resolved the urls and returned http://realurl, but the url resolver allows also to add HTTP headers to the request.
\section plugin-appdata Appdata refresh plugins (repo change) Stateless plugins found in /usr/lib/zypp/plugins/appdata are called whenever any of the system repos has changed (added/removed/renamed/modified) or has been refreshed. Detailed information \b what exactly has changed is not available. (scripts are executed IFF euid is '0' and --root is not used). For every enabled system repo we pass alias type and metadata path on the commandline like this: \verbatim -R REPO_ALIAS -t REPO_TYPE -p REPO_METADATA_PATH -R NEXT_REPO.... \endverbatim \note REPO_TYPE can be e.g. "rpm-md", "yast2", "plaindir" or "NONE" indicating the repo was not yet probed. \note REPO_METADATA_PATH can be empty or a not existing directory, indicating valid metadata for the repo are not yet available. Scripts are executed 'fire and forget' whenever a RepoManager instance that performed changes goes out of scope. So it's up to the script to protect against concurrency. */ libzypp-17.36.5/doc/autoinclude/README000066400000000000000000000025351476576476200173640ustar00rootroot00000000000000All .doc files here will be parsed and included in the autodocs generated by doxygen (see http://www.doxygen.org/). All the other files here (mostly below notes) are available to be vervatim included in some documentation block using: /** \include somefile */ or /** \example */ The .doc files here will mostly provide: - The content of the main index page (defined in Mainpage.doc). - Other related documentation pages: /*! \page page1 A documentation page Leading text. \section sec An example section This page contains the subsections \ref subsection1 and \ref subsection2. For more info see page \ref page2. \subsection subsection1 The first subsection Text. \subsection subsection2 The second subsection More text. */ /*! \page page2 Another page Even more info. */ Those pages will per default appear in the documentations 'Related Pages' section, unless you refer to them from within soome other page by using '\subpage': /** \mainpage A simple manual Some general info. This manual is divided in the following sections: - \subpage intro - \subpage advanced "Advanced usage" */ - Documentation for a group of classes defined by \ingroup: /*! \defgroup g_Resolvable Resolvable Objects Some explanation. */ - And whatever else we don't want to keep in the header files. libzypp-17.36.5/doc/autoinclude/RepoVariables.doc000066400000000000000000000045021476576476200217250ustar00rootroot00000000000000/** \page zypp-repovars Repository Variables \author Michael Andres \section zypp-repovars-intro Repository Variables Within a \c .repo or \c .service file, the name and URLs are subject to variable substitution. Variables are e.g. useful for related repositories like packman (http://ftp.gwdg.de/pub/linux/packman/suse/$releasever), which shall always fit the installed distribution, even after a distribution upgrade. To help performing a distribution upgrade, the value of \c $releasever can be overwritten in zypper using the \c --releasever global option. This way you can easily switch all repositories using \c $releasever to the new version (provided the server layouts did not change and new repos are already available). The variable expander also supports shell like definition of default and alternate values. \see \ref zypp::repo::RepoVarExpand Variable expander \subsection zypp-repoars-builtin Builtin repository variables \li \c $arch - The system's CPU architecture. \li \c $basearch - The base architecture of the system. For example, iX86 machines have a base architecture of \c i386, while AMD64 and Intel64 have \c x86_64. \li \c $releasever - The version of your openSUSE or SUSE Linux. The value is obtained from the /product/version XML-node in /etc/products.d/baseproduct. \li \c $releasever_minor \li \c $releasever_major - \c $releasever_major will be set to the leading portion up to (but not including) the 1st dot; \c $releasever_minor to the trailing portion after the 1st dot. If there's no dot in \c $releasever, \c $releasever_major is the same as \c $releasever and \c $releasever_minor is empty. \subsection zypp-repoars-userdefined User defined repository variables [requires 'libzypp(repovarexpand) >= 1'] A custom repository variable is defined by creating a file in \c /etc/zypp/vars.d. The variable name equals the file name. The files first line (up to but not including the newline character) defines the variables value. Valid variable(file) names consist of alphanumeric chars and '_' only. Variable substitution within an URIs authority [requires 'libzypp(repovarexpand) >= 1.1'] is limited to \c host and \c port. Bash style definition of default and alternate values is not supported. No variables can be used in an URIs \c scheme, \c user and \c password. */ libzypp-17.36.5/doc/autoinclude/Services.doc000066400000000000000000000270231476576476200207550ustar00rootroot00000000000000/** \page zypp-services Services \author Duncan Mac-Vicar P. Services provide a list of repositories. So when the service is refreshed, the repositories specified by the service service is synced with the local repository list. \section service-types Classes of services There are two classes of services: \subsection services-remote Remote Services Remote services are a subscription to a remote server, that provide a list of repositories that will be synced with the previous list of repositories for the same service. By default, the remote services list is stored in the \ref /etc/zypp/services.d directory in standard INI files. Each file can contain more than one service. The format is the following: \verbatim [servicealias] name=My Service url=http://customers.maintenance.company.com/service enabled=true autorefresh=true type=nu \endverbatim The type "nu" stands for Novell Update, which gives a customer the repositories it is entitled to access. The type "ris" is an extended version of the "nu" type. Additionally, the file could contain "repostoenable" and "repostodisable" entries, which contain a list of repository aliases to enable or disable on the next refresh. This line is modified by other programs to force enabling or disabling a certain repository. From the remote side, the service url needs to provide a repoindex.xml file with the repository list: \verbatim ... \endverbatim \subsection services-plugin Plugin Services \ref plugin-services "Plugin services" are simple scripts that return a list of repositories. They are installed locally in the system using packages. For each script installed ZYpp will “see” a service of type “plugin”. When you refresh the service, the repositories this script returns as output will be added (or removed and kept in sync if they change afterwards). A plugin service is a program installed in /usr/lib/zypp/plugins/services. Once a program called "foobar" is installed, listing services will show it: \verbatim > zypper ls # | Alias | Name | Enabled | Refresh | Type ---+------------------+--------------+---------+---------+------- 1 | foobar | foobar | Yes | Yes | plugin ... ... \endverbatim When this service is refreshed, the program will be executed and it will return the list of repositories in the same .repo files format that can be found in /etc/zypp/repos.d: \verbatim # output returned by the plugin [repo-oss] name=oss enabled=1 autorefresh=0 baseurl=http://download.opensuse.org//distribution/11.4/repo/oss type=yast2 keeppackages=0 ... \endverbatim As you can see, the main advantage of plugin services is that they can read information from the client and calculate the repository list from there. Nothing prevents a plugin service to still interact with a server to get the repository list. The main disadvantage is that you have logic in the client side that in case of bugs or changes, needs to be updated. Spacewalk integration is implemented using plugin services. The plugin talks XML-RPC to the server and asks for the list of channels the system is subscribed to. The plugin needs to read the server address and perform the login. However, the spacewalk plugin service does have an extra indirection, as the repository list returned are not plain urls, but urls of the type plugin:$name?params, which use the urlresolver plugin to get the real url. This is not necessary, and here it is done because it allows to add custom headers to the HTTP requests. You can read more about urlresolver plugins \ref plugin-url-resolver here. \section service-refresh Refreshing services Using zypper, you can refresh services by executing \verbatim zypper refs \endverbatim The repositories that are listed in the service will be added, using the reposotiy alias specified in the service index prefixed by the service alias: e.g. "myservice:myrepository". Repositories that vanished from the service will be automatically removed. \section service-examples Example usecases \subsection services-usecase-1 Usecase #1: The project with multiple repositories and layers Imagine the following usecase (with this one I am using some real request from our KDE guys) The build service provides a KDE4 repository. Which in turn requires the Qt4 repository, because is built on openSUSE 11.0 + the new Qt4 repo. When looking at this problem, repository dependencies is what comes to head in the first place. But forget about them. If package dependencies are complicated right now, imagine adding a secondary (and duplicated) layer of information. Packages already know their dependencies. Now imagine our KDE guys can provide an URL, which you add to zypper. And this url returns a dynamic list of repositories. And zypper adds and remove repositories based on the information returned by this url on every refresh. \subsection services-usecase-2 Usecase #2: Update repositories based on the customer This is actually where services where originated. Services were present in Novell ZenWorks. How it works? The service url nu.novell.com is added to the system. But in this url also a customer id is present as a http username. When you registered, Novell knows the subscription and products this system is linked to and what entitlements the customer has. The service can then return a dynamic list of repositories based on the customer preferences, products and entitlements. The customer does not need to keep them manually in sync. Now that we don’t have Zenworks in the base system, we still want this cool functionality for our customers, therefore ZYpp now implements services natively. Technically, this even allows us to offer hotfixes to L3 supported customers on the fly: the system is marked on the server side as being hotfixed, and an extra temporary repository with the PTF (Problem Temporary Fix) packages is added to this system list of repositories. \subsection services-usecase-3 Usecase #3: Dynamic repository collections You are a build service user, and you have an account, and of course you have a list of watched projects you are interested to. What if you could keep your system repositores in sync with your watched project list. Or what if the build service could offer a service based on keywords or other data: like http://build.opensuse.org/services/mostpopular/repo/repoindex.xml would contain dynamically the 15 most popular repositories. You add that service, and then ZYpp does the work for you of adding new popular repositories, and remove the old ones. \subsection services-usecase-4 Usecase #4: Collect openSUSE core repos in one service Some people prefer to keep and maintain the distros core repos within one local service rather than managing the repos individually. Since version 14.21.0 libzypp supports a simple form of variable replacement within a repoindex.xml file, which makes this even easier. To use a local RIS service create a directory /somewhere on your disk (or accessible via http, nfs, etc.) and create the file ./repo/repoindex.xml inside. A repoindex.xml for openSUSE Leap 15.1 might look like this: \verbatim \endverbatim %{VAR} always refers to the value defined in the repoindex tag. Reserved names are 'ttl' and 'alias'. - ttl="SECONDS" defines the matadata's expected time to live in case autorefresh is turned on for the service. It's the number of seconds that should pass before the service is autorefreshed again. It is not available as variable. - %{alias} is available within a repo tag after the alias was defined there. Given the file is located at /somewhere/repo/repoindex.xml, add the service by: \verbatim zypper sa /somewhere openSUSE \endverbatim Manually refresh the service (incl. its repos) with: \verbatim zypper refs -r \endverbatim Refreshing the service will evaluate the repoindex.xml and adjust the Services repos accordingly. The repos alias will be prefixed by the service name: \verbatim zypper lr > # | Alias | Name | Enabled | ... | Refresh > ---+-------------------------+-----------------------+---------+-...-+-------- > 9 | openSUSE:debug-non-oss | debug-non-oss (15.1) | No | ... | ---- > 10 | openSUSE:debug-oss | debug-oss (15.1) | No | ... | ---- > 11 | openSUSE:repo-non-oss | repo-non-oss (15.1) | Yes | ... | Yes > 12 | openSUSE:repo-oss | repo-oss (15.1) | Yes | ... | Yes > 13 | openSUSE:source-non-oss | source-non-oss (15.1) | No | ... | ---- > 14 | openSUSE:source-oss | source-oss (15.1) | No | ... | ---- > 15 | openSUSE:upadte-non-oss | upadte-non-oss (15.1) | Yes | ... | Yes > 16 | openSUSE:update-oss | update-oss (15.1) | Yes | ... | Yes \endverbatim After editing the repoindex.xml you must manually refresh the service to takeover the changes, or you turn on autorefresh for the service (depends on how often you change the content): \verbatim zypper ms -r openSUSE \endverbatim Rather than hardcoding the distver="15.1", you can also use a repo variable like distver="${releasever}". \section service-impl Developers: Implementation Services are implemented in the following classes: - \ref zypp::repo::ServiceType (Service types enumeration) - \ref zypp::parser::ServiceFileReader (.service file parser) - \ref zypp::ServiceInfo Information about a service (.service file data) - \ref zypp::repo::PluginServices (Services as plugins) - \ref zypp::parser::RepoindexFileReader (NU and RIS remote service index XML parser) - \ref zypp::repo::ServiceRepos (Repositories in a service) */ libzypp-17.36.5/doc/autoinclude/SolverVendorChange.doc000066400000000000000000000062361476576476200227330ustar00rootroot00000000000000/** \page pg_zypp-solv-vendorchange Solver - Vendor protection \author Michael Andres \section zypp-solv-vendorchange Vendor protection rule Tracing a packages origin \c libzypp uses the packages \c vendor string. The \c vendor string is part of the rpm header and thus defined at the time the package was built. It stays the same, no matter which repository was used to ship the package. Using \c rpm is one way to retrieve a packages \c vendor string: \code $ rpm -q --qf '%{name} \tvendor: %{vendor}\n' libzypp nautilus libdvdread3 libzypp vendor: openSUSE nautilus vendor: obs://build.opensuse.org/GNOME libdvdread3 vendor: http://packman.links2linux.de \endcode Also several \c zypper commands will display a packages \c vendor: \code $ zypper info libzypp Information for package libzypp: Repository: openSUSE-11.4-Update Name: libzypp Version: 8.12.6-0.2.1 Arch: x86_64 Vendor: openSUSE <=== Installed: Yes Status: up-to-date Installed Size: 7.0 MiB Summary: Package, Patch, Pattern, and Product Management Description: Package, Patch, Pattern, and Product Management \endcode \subsection zypp-solv-vendorchange-rule The vendor protection rule is quite simple: \note When looking for an installed packages \e update \e candidate, we are looking for a package originated by the \e same \e vendor (not repository!) as the \e installed one. \section zypp-solv-vendorchange-tune Vendor protection tuning The \e brute \e force method is to turn off all vendor protection in \c /etc/zypp/zypp.conf: \code ## ## EXPERTS ONLY: Per default the solver will not replace packages of ## different vendors, unless you explicitly ask to do so. Setting this ## option to TRUE will disable this vendor check (unless the application ## explicitly re-enables it). Packages will then be considered based on ## repository priority and version only. This may easily damage your system. ## ## CHANGING THE DEFAULT IS NOT RECOMMENDED. ## ## Valid values: boolean ## Default value: false ## solver.allowVendorChange = true \endcode \subsection zypp-solv-vendorchange-equiv Groups of equivalent vendor strings A built in example for this is the \c vendor string \c SuSE. All vendor strings starting (case insensitive) with \c "suse", are considered to be the \e same \e vendor and their packages may replace each other without asking. You may define your own classes of equivalent \c vendor strings by creating an entry in the \c /etc/zypp/vendors.d directory. For each group of \c vendor strings create a file, name it as you like, with the following content: \code [main] ## A comma separated list of equivalent vendor string (prefixes!) ## Example: ## vendors = suse,opensuse vendors = \endcode \note A built in rule unifying \c "suse" and \c "opensuse" was disabled in libzypp-16.7.1. The above example would recreate it. \note Within the \c "opensuse*" namespace exact matches (case insensitive) are required. The above example will allow switching between \c "suse*" and \c "opensuse" but not e.g. \c "opensuse build service". \section zypp-solv-vendorchange-Impl Related classes \li \ref zypp::VendorAttr (vendor string equivalence and \c vendors.d parser) */ libzypp-17.36.5/doc/autoinclude/Testcases.doc000066400000000000000000000070421476576476200211270ustar00rootroot00000000000000/** \page Testcases Writing and tunning testcases \section Introduction Introduction ZYpp has a suite of tests located in under test/ directory of the source tree. Right now, tests are grouped into - media : tests related to downloading and the http/ftp/nfs/iso abstraction layer - parser : tests related to classes that offer file format parsing - repo : tests related to repository handling - sat : tests related to the sat-solver integration - zypp : tests related to the main libzypp classes and APIs Tests are written using boost test library. - Boost Test Library - The Unit Test Framework - The UTF testing tools reference \section Anatomy Anatomy of a ZYpp testcase The file should be in one of the described groups, and by general rule it is named ClassName_test.cc where ClassName is the name of the class or module the test covers. Data and fixtures are stored in data/ directories in each test group. However groups may use and reference data from other test groups. The macro \ref TESTS_SRC_DIR is defined as the tests/ directory located in libzypp source directory. You can build the paths to the data/fixtures using that macro. A simple testcase: \code #include "zypp/Date.h" #include BOOST_AUTO_TEST_CASE(date_test) { std::string format = "%Y-%m-%d %H:%M:%S"; std::string date = "2009-02-14 00:31:30"; BOOST_CHECK_EQUAL(zypp::Date(date,format).form(format), date); } \endcode \section Building Building and running the testsuite - Build the testsuite \verbatim $ cd build $ cmake -DCMAKE_INSTALL_PREFIX=/prefix .. $ cd tests $ make \endverbatim - Run a simple test \verbatim $ zypp/Date_test Running 1 test case... *** No errors detected \endverbatim - Run all tests \verbatim $ ctest . \endverbatim \section \verbatim - added tests/data/openSUSE-11.1 containing raw susetags metadata. Keeping .solv files in svn is somewhat inconvenient, as you must rebuild them if something in libsolv changes. \endverbatim \verbatim - added tests/include as location for includes that might be used in multiple testcases. \endverbatim \verbatim - added tests/include/TestSetup.h to ease building a test environment below some tempdir. Currently supports easy setup of Target, RepoManager and loading data (raw metadata and .solv files) into the pool. That's how it currently looks like: #include "TestSetup.h" BOOST_AUTO_TEST_CASE(WhatProvides) { TestSetup test( Arch_x86_64 ); // use x86_64 as system arch test.loadTarget(); // initialize and load target test.loadRepo( TESTS_SRC_DIR"/data/openSUSE-11.1" ); This is all you need to setup Target, RepoManager below some temp directory and load the raw metadata into the pool. In case you want to setup the system below some fix directory, use: TestSetup test( "/tmp/mydir", Arch_x86_64 ); You directory is used as it is and not removed at the end. \endverbatim \verbatim - Added support for loading helix files e.g. from testcases. This is what you need to load all repos from a solver testcase into the pool: #include "TestSetup.h" BOOST_AUTO_TEST_CASE(test) { TestSetup test( Arch_x86_64 ); test.loadTestcaseRepos( "/suse/ma/BUGS/153548/YaST2/solverTestcase" ); \endverbatim \section References */ libzypp-17.36.5/doc/autoinclude/Threads.doc000066400000000000000000000013721476576476200205630ustar00rootroot00000000000000/** \page thread Libzypp and threads \author Michael Andres \section thread_intro Libzypp and threads Libzypp is \b not thread safe. Before we can think about using threads in libzypp, or even libzypp in threads, a bunch of components have to be fixed. \li \c Logging as one one of the core components has to become threadsafe. \li \c SmartPointer as one of the core patterns implementing resource control need to become threadsafe \li \c ...more \subsection thread_loggin Logging in threads \see http://accu.org/index.php/journals/1539, http://www.pantheios.org/ Need to estimate performance impact when making the current zypp::log implementation threadsafe. Current implementation is based on STL streams with a custom linebuffer. */libzypp-17.36.5/doc/autoinclude/UserData.doc000066400000000000000000000017671476576476200207110ustar00rootroot00000000000000/** \page zypp-userdata User data as transaction id \author Michael Andres
\section userdata-introduction Introduction It is possible to store a user defined data string via \ref zypp::ZConfig::setUserData inside libzypp for use as a transaction id. \c Zypper e.g. supports this via its global '--userdata ' option. \li Setting a new user data string, a line will be written to the log file. So you can \c grep for it, or for '(setUserData)' to find all locations where user data strings were set. \li The user data string will also be passed to commit plugins, so they can make use of it. The btrfs e.g would be able to tag created snapshots with this string. \see \ref plugin-commit \li The user data string will appear on each histoy line logging package or repository related events (install, delete, add, modify). \see \ref zypp::HistoryLog and zypp::parser::HistoryLogReader */ libzypp-17.36.5/doc/autoinclude/g_BOOST.doc000066400000000000000000000003701476576476200203620ustar00rootroot00000000000000/** \namespace boost \ref BOOST */ /** \defgroup BOOST Boost libraries. Boost provides free peer-reviewed portable C++ source libraries. Several \c ::boost names were dragged or typedefed into namespace \c ::zypp. \see http://www.boost.org/ */ libzypp-17.36.5/doc/autoinclude/g_LIBSOLV.doc000066400000000000000000000001741476576476200206100ustar00rootroot00000000000000/** \namespace zypp::sat \ref LIBSOLV */ /** \defgroup LIBSOLV Libsolv interface Interface to sat-pool and sat-solver. */ libzypp-17.36.5/doc/autoinclude/g_ZyppHistory.doc000066400000000000000000000054741476576476200220320ustar00rootroot00000000000000/** \defgroup g_ZyppHistory Libzypp History File Log important events like installation/deletion of packages and repositories. \section g_ZyppHistory_Location Location The default location is \c /var/log/zypp/history. This can be changed via \c history.logfile key in \c /etc/zypp/zypp.conf. \section g_ZyppHistory_Format Format \li CSV file with pipe character (|) as the value separator \li one event per line \li different actions have different set of values (columns), see the tables below \li lines starting with # are treated as comments \see \ref zypp-userdata \subsection g_ZyppHistory_Format_Colummn Action Columns \subsubsection g_ZyppHistory_Format_Colummn_Install Install A package has been installed. \li \b 1 timestamp \li \b 2 action ID (\c "install") \li \b 3 package name \li \b 4 package epoch:version-release \li \b 5 package architecture \li \b 6 requested by (user@hostname, pid:appname, or empty (solver)) \li \b 7 repository alias \li \b 8 package checksum \li \b 9 userdata/transactionId \subsubsection g_ZyppHistory_Format_Colummn_Remove Remove A package has been removed. \li \b 1 timestamp \li \b 2 action ID (\c "remove") \li \b 3 package name \li \b 4 package epoch:version-release \li \b 5 package architecture \li \b 6 requested by (user@hostname, pid:appname, or empty (solver)) \li \b 7 userdata/transactionId \subsubsection g_ZyppHistory_Format_Colummn_Radd Radd A repository has been added. \li \b 1 timestamp \li \b 2 action ID (\c "radd") \li \b 3 repository alias \li \b 4 primary URL \li \b 5 userdata/transactionId \subsubsection g_ZyppHistory_Format_Colummn_Rremove Rremove A repository has been removed. \li \b 1 timestamp \li \b 2 action ID (\c "rremove") \li \b 3 repository alias \li \b 4 userdata/transactionId \subsubsection g_ZyppHistory_Format_Colummn_Ralias Ralias A repository alias has changed. \li \b 1 timestamp \li \b 2 action ID (\c "ralias") \li \b 3 old alias \li \b 4 new alias \li \b 5 userdata/transactionId \subsubsection g_ZyppHistory_Format_Colummn_Rurl Rurl The primary URL of a repository has changed. \li \b 1 timestamp \li \b 2 action ID (\c "rurl") \li \b 3 repository alias \li \b 4 new URL \li \b 5 userdata/transactionId \section g_ZyppHistory_Example Example \code 2008-09-24 11:48:58|rremove|packman 2008-09-24 11:50:02|radd |packman|http://packman.iu-bremen.de/suse/11.0 2008-09-24 11:53:10|install|amarok-yauap|1.4.10-25|x86_64||factory|4421dfa718ab73c805c1c695c97b1b67f39bf2f3 2008-09-24 11:53:25|install|amarok-lang|1.4.10-25|x86_64||factory|691030edafcc4fbc22aa225350f9de32974e4bc2 # Additional rpm output: # warning: /var/cache/zypp/packages/packman/x86_64/amarok-1.4.10-100.pm.1.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 9a795806 # 2008-09-24 11:53:45|install|amarok|1.4.10-100.pm.1|x86_64|root@kompost|packman|ee0fffa1e4eeaaeb8799bd05c6882ef74100d681 \endcode */ libzypp-17.36.5/doc/autoinclude/groups.doc000066400000000000000000000025241476576476200205100ustar00rootroot00000000000000//////////////////////////////////////////////////////////////////////////////// // Short or empty group definitions. Move them to a sepearate .doc file if // more text is provided. //////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_EnumerationClass Enumeration Class */ //////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_RAII RAII solutions \see http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization */ //////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_CRTP CRTP solutions \see http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern */ //////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_BackenSpecific Backend Specific */ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_Functor Filters and Functors */ //////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_Algorithm Algorithms */ //////////////////////////////////////////////////////////////////////////////// /*! \defgroup g_Parser Parser */ //////////////////////////////////////////////////////////////////////////////// libzypp-17.36.5/doc/autoinclude/notes/000077500000000000000000000000001476576476200176275ustar00rootroot00000000000000libzypp-17.36.5/doc/autoinclude/notes/n_ResPool_nomorenameiter000066400000000000000000000033651476576476200245650ustar00rootroot00000000000000 I tagged the byName iterator as deprecated, so the compiler tells you where it is used. Please review the code and check whether byIdent is an appropriate replacement. -- The 'old' zypp pool internally maintained a byName index, so it was a fast way to iterate the pool by name and filter by kind to visit e.g. all packages named foo: invokeOnEach( pool.byNameBegin( name ), pool.byNameEnd( name ), resfilter::ByKind( kind ), action() ); for_( it, pool.byNameBegin( name ), pool.byNameEnd( name ) ) { if ( (*it)->kind() == kind ) { ... } } This is no longer true. In contrary, byName now is a 'quite expensive' iteration. It's faster to rewrite these loops using byIdent (and no filter): invokeOnEach( pool.byIdentBegin( kind, name ), pool.byIdentEnd( kind, name ), action() ); for_( it, pool.byIdentBegin( kind, name ), pool.byNameEnd( kind, name ) ) { ... } How to construct the byIdent iterator: ResPool::byIdentBegin( poolItem ) // using this poolItems kind and name ResPool::byIdentBegin( kind, name ) // explicit kind and name ResPool::byIdentBegin( name ) // or templated kind -- If you prefer using iterator in a for' loop, but dislike to figure out the exact type of the iterator, you may find the 'for_' macro convenient: #include "zypp/base/Easy.h" for_( it, pool.byIdentBegin( kind, name ), pool.byIdentEnd( kind, name ) ) { PoolItem copy = *it; } instead of: for ( ResPool::byIdent_iterator it = pool.byIdentBegin( kind, name ), end = pool.byIdentEnd( kind, name ); it != end, ++it ) { PoolItem copy = *it; } libzypp-17.36.5/doc/locks.5.txt000066400000000000000000000101201476576476200161740ustar00rootroot00000000000000LOCKS(5) ======== :man manual: LIBZYPP :man source: SUSE Linux NAME ---- locks - libzypp locking file DESCRIPTION ----------- The file '/etc/zypp/locks' is read by libzypp at start-up if 'zypp.conf' allows it. The entries are used for initial locking of packages. Locking a package means not allowing to install or uninstall it. Valid entries are of the form: 'attribute'*:* 'value':: Where attributes and their values are described below. Locks are separated by an empty lines. ATTRIBUTES ---------- All attributes are lower-case. *repo*:: specifies repository restriction. Only alias is accepted. + By default all repositories match. *type*:: resolvable type restriction. The values can be *package*, *patch*, *pattern*, *product* and *srcpackage*. + By default all types match. *case_sensitive*:: if strings are matched case sensitive. The values are *true*, *false*, *on*, *off*. + The default is case insensitive. *install_status*:: status of object. Possible states are *installed*, *not-installed* and *all*. If more install statuses are specified then the last one is used. The values are *installed* for all packages which are installed, *non-installed* for packages which can be installed or reinstalled and *all* for both. + The default is *all*. *match_type*:: type of string matching in values. Does not affect *type* and *repo* which must be specified exactly. The values are *exact*, *substring*, *regex* for regular expressions, *glob* for matching as on the command line, and *word*. + The default is *substring*. *query_string*:: String to be matched in multiple attributes. Should be restricted by another attribute with empty value (it is recommended, because without restriction expect some performance problems). *version*:: Restrict the lock only to some versions. It contains two parts: an optional operator and the version. + The operator is *==*, *!=*, *<*, *>*, *<=*, *>=*. If operator is not specified then *==* is used. + The version has the format ['epoch'*:*+]+'version'[*-*'release']. + Example: *version: < 0:0.11.4-2* *solvable_name*:: name of object (e.g. zypper) *solvable_summary*:: summary of object *solvable_arch*:: architecture of object (e.g. x86_64, i586) *solvable_description*:: description of object *solvable_eula*:: license text of objects which request accepting license by user *solvable_license*:: license of package (only for package) (e.g. GPL2) *solvable_keywords*:: keywords which specify package (only for package) *solvable_authors*:: authors of package (only for package) *solvable_group*:: package group (only for package) (e.g. Development/Tools/Version Control ) *update_reference_type*:: reference for update (e.g. bugzilla,cve) (only for patches) EXAMPLES -------- *Exact Package*:: This is the way YaST UI does it. Lock k3b (e.g. you don't want to update it). -------------------- -----locks----- type: package solvable_name: k3b match_type: exact case_sensitive: on -------------------- *Package Wildcard*:: This is the way "zypper addlock cross-*-gcc-icecream-backend" does it. -------------------- -----locks----- type: package solvable_name: cross-*-gcc-icecream-backend match_type: glob case_sensitive: on -------------------- *Versioned Lock*:: Do not install new GCC. This format is used when converting from the openSUSE-10.3 lock format. -------------------- -----locks----- solvable_name: gcc match_type: glob version: > 4.2 -------------------- *Anything named KDE*:: Locks everything which contains kde in the name. -------------------- -----locks----- solvable_name: kde -------------------- *Anything mentioning KDE*:: Locks everything which contains kde in the name, summary, or description. -------------------- -----locks----- query_string: kde solvable_name: solvable_summary: solvable_description: -------------------- HOMEPAGE -------- This manual page only covers the most important attributes. The complete list is available at http://en.opensuse.org/Libzypp/Locksfile AUTHORS ------- Josef Reidinger Manual page contributions by Martin Vidner . SEE ALSO -------- zypper(8) libzypp-17.36.5/doc/zypp-CheckAccessDeleted.1.txt000066400000000000000000000015541476576476200215160ustar00rootroot00000000000000ZYPP-CHECKACCESSDELETED(1) ========================== :man manual: LIBZYPP :man source: SUSE Linux NAME ---- zypp-CheckAccessDeleted - List processes which access deleted files SYNOPSIS -------- *zypp-CheckAccessDeleted* [_OPTION_]... DESCRIPTION ----------- List running processes which access deleted files. This may help to identify services and processes which need to be restarted after an update, e.g. if they still refer to meanwhile deleted libraries. The output is similar to `*zypper ps*' but does not sort out processes accessing normal files only. OPTIONS ------- *--help*:: display help and exit *--zypper*:: use less verbose zypper mode to list processes *--debugFile* 'filename':: Reads process and opened files information from a file that was created by zypper previously AUTHORS ------- Michael Andres SEE ALSO -------- zypper(8) libzypp-17.36.5/doc/zypp-NameReqPrv.1.txt000066400000000000000000000047011476576476200201050ustar00rootroot00000000000000ZYPP-NAMEREQPRV(1) ================== :man manual: LIBZYPP :man source: SUSE Linux NAME ---- zypp-NameReqPrv - Investigate packages and dependencies in solver test-cases SYNOPSIS -------- *zypp-NameReqPrv* [*--root* 'DIR'] [['OPTIONS'] 'NAME'...]... DESCRIPTION ----------- Load all enabled repositories (without refresh) and search for occurrences of regular expression 'NAME' in package names or dependencies. In case 'DIR' denotes a directory containing a solver test-case, repositories and settings provided by the test-case are loaded instead. A solver test-case is an abstract of repositories, packages, hardware and dependency resolution related settings which can be created by using zyppers *--debug-solver* option. Attached to a bug report the test-case helps investigating the reported behavior. Options and output of this command are tailored to this use-case and may change as needed. Reported matches show the packages 'internal id', 'name', 'version' and 'architecture', 'priority' and name of the providing 'repository', 'vendor', 'buildtime' and the locations matching 'NAME'. -------------------- 2431 zypper-1.9.16-22.2.x86_64 (99)@System openSUSE 1400499579 nam: zypper 40947 zypper-1.9.3-1.1.x86_64 (99)repo-oss (13.1) openSUSE 1383049437 nam: zypper 56140 zypper-1.9.16-22.2.x86_64 (99)repo-oss-update (13.1) openSUSE 1400499579 nam: zypper -------------------- OPTIONS ------- *--root* 'DIR':: Load repos from the system located below 'DIR'. If 'DIR' denotes a solver test-case, the test-case is loaded. *--installed*:: Process installed packages only. *-i*/*-I*:: Turn on/off case insensitive search (default on) *-n*/*-N*:: Turn on/off looking for names (default on) *-p*/*-P*:: Turn on/off looking for provides (default off) *-r*/*-R*:: Turn on/off looking for requires (default off) *-c*/*-C*:: Turn on/off looking for conflicts (default off) *-o*/*-O*:: Turn on/off looking for obsoletes (default off) *-m*/*-M*:: Turn on/off looking for recommends (default off) *-s*/*-S*:: Turn on/off looking for supplements (default off) *-a*:: Short for *-n -p -r* *-A*:: Short for *-n -P -R* *-D* 'PKG':: Dump dependencies of package 'PKG' (exact name). AUTHORS ------- Michael Andres SEE ALSO -------- zypper(8) libzypp-17.36.5/libzypp.pc.cmake000066400000000000000000000005161476576476200165140ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=@LIB_INSTALL_DIR@/zypp libdir=@LIB_INSTALL_DIR@ includedir=@INCLUDE_INSTALL_DIR@ Name: @PACKAGE@ Version: @VERSION@ Description: Package, Patch, Pattern, and Product Management Libs: -L${libdir} -lzypp Cflags: -I${includedir} -D_FILE_OFFSET_BITS=64 @ZYPP_CFLAGS@ features=@ZYPP_FEATURES@ libzypp-17.36.5/libzypp.spec.cmake000066400000000000000000000327171476576476200170540ustar00rootroot00000000000000# # spec file for package libzypp # # Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via https://bugs.opensuse.org/ # %if 0%{?suse_version} > 1500 || 0%{?sle_version} >= 150400 || (0%{?is_opensuse} && 0%{?sle_version} >= 150100) %bcond_without zchunk %else %bcond_with zchunk %endif # libsolvs external references might require us to link against zstd, bz2, xz %if 0%{?sle_version} >= 150000 || 0%{?suse_version} >= 1500 %bcond_without zstd %else %bcond_with zstd %endif %if 0%{?sle_version} >= 120300 || 0%{?suse_version} >= 1330 || !0%{?suse_version} %bcond_without bz2 %bcond_without xz %else %bcond_with bz2 %bcond_with xz %endif %bcond_without mediabackend_tests # older libsigc versions have a bug that causes a segfault # when clearing connections during signal emission # see https://bugzilla.gnome.org/show_bug.cgi?id=784550 %if 0%{?sle_version} < 150200 %bcond_without sigc_block_workaround %else %bcond_with sigc_block_workaround %endif %if 0%{?suse_version} > 1500 || 0%{?sle_version} >= 150600 %bcond_without visibility_hidden %else %bcond_with visibility_hidden %endif # Distros using just zypper may want to enable this as default earlier %bcond_with enable_preview_single_rpmtrans_as_default_for_zypper Name: libzypp Version: @VERSION@ Release: 0 License: GPL-2.0-or-later URL: https://github.com/openSUSE/libzypp Summary: Library for package, patch, pattern and product management Group: System/Packages BuildRoot: %{_tmppath}/%{name}-%{version}-build Source: %{name}-%{version}.tar.bz2 Source1: %{name}-rpmlintrc Provides: yast2-packagemanager Obsoletes: yast2-packagemanager # bsc#1227793: python zypp-plugin < 0.6.4 rejects stomp headers including a '-' Conflicts: python2-zypp-plugin < 0.6.4 Conflicts: python3-zypp-plugin < 0.6.4 # API refactoring. Prevent zypper from using (now) private symbols Conflicts: zypper <= 1.14.76 # Features we provide (update doc/autoinclude/FeatureTest.doc): Provides: libzypp(plugin) = 0.1 Provides: libzypp(plugin:appdata) = 0 Provides: libzypp(plugin:commit) = 1 Provides: libzypp(plugin:services) = 1 Provides: libzypp(plugin:system) = 1 Provides: libzypp(plugin:urlresolver) = 0 Provides: libzypp(plugin:repoverification) = 0 Provides: libzypp(repovarexpand) = 1.1 %if 0%{?suse_version} Recommends: logrotate # lsof is used for 'zypper ps': Recommends: lsof %endif BuildRequires: cmake >= 3.10 BuildRequires: pkgconfig(openssl) BuildRequires: pkgconfig(libudev) %if 0%{?suse_version} >= 1330 BuildRequires: libboost_headers-devel BuildRequires: libboost_program_options-devel BuildRequires: libboost_test-devel BuildRequires: libboost_thread-devel %else BuildRequires: boost-devel %endif BuildRequires: dejagnu BuildRequires: doxygen BuildRequires: texlive-latex BuildRequires: texlive-xcolor BuildRequires: texlive-newunicodechar BuildRequires: texlive-dvips BuildRequires: ghostscript BuildRequires: gcc-c++ >= 7 BuildRequires: gettext-devel BuildRequires: graphviz BuildRequires: libxml2-devel BuildRequires: yaml-cpp-devel # we are loading libproxy dynamically, however we have # a failsafe unit test that links against libproxy to make # sure the API did not change BuildRequires: libproxy-devel #keep the libproxy runtime requires for old releases %if 0%{?suse_version} && 0%{?suse_version} <= 1500 && 0%{?sle_version} <= 150500 Requires: libproxy1 %endif %if 0%{?fedora_version} || 0%{?rhel_version} || 0%{?centos_version} BuildRequires: pkgconfig %else BuildRequires: pkg-config %endif BuildRequires: libsolv-devel >= 0.7.24 %if 0%{?suse_version} > 1500 || 0%{?sle_version} >= 150600 BuildRequires: libsolv-tools-base >= 0.7.29 %requires_eq libsolv-tools-base Requires: ( findutils if libsolv-tools-base <= 0.7.31 ) %else BuildRequires: libsolv-tools %requires_eq libsolv-tools %endif BuildRequires: glib2-devel BuildRequires: libsigc++2-devel BuildRequires: readline-devel >= 5.1 # required for testsuite %if %{with mediabackend_tests} BuildRequires: nginx BuildRequires: vsftpd %endif Requires: rpm BuildRequires: rpm %if 0%{?suse_version} BuildRequires: rpm-devel > 4.4 %endif %if 0%{?fedora_version} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600 BuildRequires: popt-devel BuildRequires: rpm-devel > 4.4 %endif %if 0%{?mandriva_version} BuildRequires: librpm-devel > 4.4 %endif %if 0%{?suse_version} BuildRequires: libgpgme-devel #testsuite %if %{with mediabackend_tests} BuildRequires: FastCGI-devel %endif %else BuildRequires: gpgme-devel #testsuite %if %{with mediabackend_tests} BuildRequires: fcgi-devel %endif %endif %define min_curl_version 7.19.4 BuildRequires: libcurl-devel >= %{min_curl_version} %if 0%{?suse_version} # Code11+ Requires: libcurl4 >= %{min_curl_version} %else # Other distros (Fedora) Requires: libcurl >= %{min_curl_version} %endif # required for documentation %if 0%{?suse_version} >= 1330 BuildRequires: rubygem(asciidoctor) %else BuildRequires: asciidoc BuildRequires: libxslt-tools %endif %if %{with zchunk} BuildRequires: libzck-devel %endif %if %{with zstd} BuildRequires: libzstd-devel %endif %if %{with bz2} %if 0%{?suse_version} BuildRequires: libbz2-devel %else BuildRequires: bzip2-devel %endif %endif %if %{with xz} BuildRequires: xz-devel %endif %description libzypp is the package management library that powers applications like YaST, zypper and the openSUSE/SLE implementation of PackageKit. libzypp provides functionality for a package manager: * An API for package repository management, supporting most common repository metadata formats and signed repositories. * An API for solving packages, products, patterns and patches (installation, removal, update and distribution upgrade operations) dependencies, with additional features like locking. * An API for commiting the transaction to the system over a rpm target. Supporting deltarpm calculation, media changing and installation order calculation. * An API for browsing available and installed software, with some facilities for programs with an user interface. %package devel Summary: Header files for libzypp, a library for package management Group: Development/Libraries/C and C++ Provides: yast2-packagemanager-devel Obsoletes: yast2-packagemanager-devel Provides: libzypp-tui-devel = 1 %if 0%{?suse_version} >= 1330 Requires: libboost_headers-devel Requires: libboost_program_options-devel Requires: libboost_test-devel Requires: libboost_thread-devel %else Requires: boost-devel %endif Requires: bzip2 Requires: glibc-devel Requires: libstdc++-devel Requires: libxml2-devel Requires: libzypp = %{version} Requires: pkgconfig(openssl) Requires: popt-devel Requires: rpm-devel > 4.4 Requires: zlib-devel Requires: libudev-devel %if 0%{?suse_version} # Code11+ Requires: libcurl-devel >= %{min_curl_version} %else # Other distros (Fedora) Requires: libcurl-devel >= %{min_curl_version} %endif %if 0%{?suse_version} %requires_ge libsolv-devel %else Requires: libsolv-devel %endif %description devel Development files for libzypp, a library for package, patch, pattern and product management. %package devel-doc Summary: Developer documentation for libzypp Group: Documentation/HTML %description devel-doc Developer documentation for libzypp. %prep %autosetup -p1 %build mkdir build cd build %if 0%{?suse_version} == 1600 # bsc#1216091: rpm-4.18' does not execute 'rpm --runposttrans' # scripts chroot if --root is used. export CFLAGS="%{optflags} -DWORKAROUNDDUMPPOSTTRANS_BUG_1216091" export CXXFLAGS="%{optflags} -DWORKAROUNDDUMPPOSTTRANS_BUG_1216091" %else export CFLAGS="%{optflags}" export CXXFLAGS="%{optflags}" %endif EXTRA_CMAKE_OPTIONS= %if 0%{?suse_version} EXTRA_CMAKE_OPTIONS="${EXTRA_CMAKE_OPTIONS} -DLIBZYPP_CODESTREAM=0%{?suse_version}:0%{?sle_version}:0%{?is_opensuse}" %endif %if 0%{?suse_version} <= 1500 && 0%{?sle_version} <= 150600 EXTRA_CMAKE_OPTIONS="${EXTRA_CMAKE_OPTIONS} -DLIBZYPP_CONFIG_USE_DELTARPM_BY_DEFAULT=1" %endif cmake -DCMAKE_INSTALL_PREFIX=%{_prefix} \ -DENABLE_BUILD_DOCS=TRUE \ -DENABLE_BUILD_TRANS=TRUE \ -DENABLE_BUILD_TESTS=TRUE \ -DDOC_INSTALL_DIR=%{_docdir} \ -DLIB=%{_lib} \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_SKIP_RPATH=1 \ -DCMAKE_INSTALL_LIBEXECDIR=%{_libexecdir} \ %{?with_visibility_hidden:-DENABLE_VISIBILITY_HIDDEN=1} \ %{?with_zchunk:-DENABLE_ZCHUNK_COMPRESSION=1} \ %{?with_zstd:-DENABLE_ZSTD_COMPRESSION=1} \ %{?with_sigc_block_workaround:-DENABLE_SIGC_BLOCK_WORKAROUND=1} \ %{!?with_mediabackend_tests:-DDISABLE_MEDIABACKEND_TESTS=1} \ %{?with enable_preview_single_rpmtrans_as_default_for_zypper:-DENABLE_PREVIEW_SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER=1} \ ${EXTRA_CMAKE_OPTIONS} \ .. make %{?_smp_mflags} VERBOSE=1 %install cd build %make_install %if 0%{?fedora_version} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600 ln -s %{_sysconfdir}/yum.repos.d %{buildroot}/%{_sysconfdir}/zypp/repos.d %else mkdir -p %{buildroot}/%{_sysconfdir}/zypp/repos.d %endif mkdir -p %{buildroot}/%{_sysconfdir}/zypp/services.d mkdir -p %{buildroot}/%{_sysconfdir}/zypp/systemCheck.d mkdir -p %{buildroot}/%{_sysconfdir}/zypp/vars.d mkdir -p %{buildroot}/%{_sysconfdir}/zypp/vendors.d mkdir -p %{buildroot}/%{_sysconfdir}/zypp/multiversion.d mkdir -p %{buildroot}/%{_sysconfdir}/zypp/needreboot.d mkdir -p %{buildroot}/%{_sysconfdir}/zypp/credentials.d mkdir -p %{buildroot}/%{_prefix}/lib/zypp mkdir -p %{buildroot}/%{_prefix}/lib/zypp/plugins mkdir -p %{buildroot}/%{_prefix}/lib/zypp/plugins/appdata mkdir -p %{buildroot}/%{_prefix}/lib/zypp/plugins/commit mkdir -p %{buildroot}/%{_prefix}/lib/zypp/plugins/services mkdir -p %{buildroot}/%{_prefix}/lib/zypp/plugins/system mkdir -p %{buildroot}/%{_prefix}/lib/zypp/plugins/urlresolver mkdir -p %{buildroot}/%{_var}/lib/zypp mkdir -p %{buildroot}/%{_var}/log/zypp mkdir -p %{buildroot}/%{_var}/cache/zypp # Default to 'solver.dupAllowVendorChange = false' on TW and post SLE12 %if 0%{?suse_version} >= 1330 || "%{distribution}" == "openSUSE Tumbleweed" sed -i "s|# solver.dupAllowVendorChange = true|solver.dupAllowVendorChange = false|g" %{buildroot}%{_sysconfdir}/zypp/zypp.conf %endif cd .. # Create filelist with translations %{find_lang} zypp %if %{defined _distconfdir} # Move logratate files form /etc/logrotate.d to /usr/etc/logrotate.d mkdir -p %{buildroot}/%{_distconfdir}/logrotate.d mv %{buildroot}/%{_sysconfdir}/logrotate.d/zypp-history.lr %{buildroot}%{_distconfdir}/logrotate.d %endif %check pushd build/tests LD_LIBRARY_PATH="$(pwd)/../zypp:$LD_LIBRARY_PATH" ctest --output-on-failure . popd %if %{defined _distconfdir} %pre # Prepare for migration to /usr/etc; save any old .rpmsave for i in logrotate.d/zypp-history.lr; do test -f %{_sysconfdir}/${i}.rpmsave && mv -v %{_sysconfdir}/${i}.rpmsave %{_sysconfdir}/${i}.rpmsave.old ||: done %endif %if %{defined _distconfdir} %posttrans # Migration to /usr/etc, restore just created .rpmsave for i in logrotate.d/zypp-history.lr; do test -f %{_sysconfdir}/${i}.rpmsave && mv -v %{_sysconfdir}/${i}.rpmsave %{_sysconfdir}/${i} ||: done %endif %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %files -f zypp.lang %defattr(-,root,root) %if 0%{?suse_version} >= 1500 %license COPYING %endif %dir %{_sysconfdir}/zypp %if 0%{?fedora_version} || 0%{?rhel_version} >= 600 || 0%{?centos_version} >= 600 %{_sysconfdir}/zypp/repos.d %else %dir %{_sysconfdir}/zypp/repos.d %endif %dir %{_sysconfdir}/zypp/services.d %dir %{_sysconfdir}/zypp/systemCheck.d %dir %{_sysconfdir}/zypp/vars.d %dir %{_sysconfdir}/zypp/vendors.d %dir %{_sysconfdir}/zypp/multiversion.d %config(noreplace) %{_sysconfdir}/zypp/needreboot %dir %{_sysconfdir}/zypp/needreboot.d %dir %{_sysconfdir}/zypp/credentials.d %config(noreplace) %{_sysconfdir}/zypp/zypp.conf %config(noreplace) %{_sysconfdir}/zypp/systemCheck %if %{defined _distconfdir} %{_distconfdir}/logrotate.d/zypp-history.lr %else %config(noreplace) %{_sysconfdir}/logrotate.d/zypp-history.lr %endif %dir %{_var}/lib/zypp %if "%{_libexecdir}" != "%{_prefix}/lib" %dir %{_libexecdir}/zypp %endif %dir %attr(750,root,root) %{_var}/log/zypp %dir %{_var}/cache/zypp %{_prefix}/lib/zypp %{_datadir}/zypp %{_bindir}/* %{_libexecdir}/zypp/zypp-rpm %{_libdir}/libzypp*so.* %doc %{_mandir}/man1/*.1.* %doc %{_mandir}/man5/*.5.* %files devel %defattr(-,root,root) %{_libdir}/cmake/Zypp %{_libdir}/libzypp.so %{_libdir}/libzypp-tui.a %{_includedir}/zypp %{_includedir}/zypp-core %{_includedir}/zypp-media %{_includedir}/zypp-curl %{_includedir}/zypp-tui %{_includedir}/zypp-common %{_libdir}/pkgconfig/libzypp.pc %files devel-doc %defattr(-,root,root) %{_docdir}/%{name} %changelog libzypp-17.36.5/mkChangelog000077500000000000000000000140121476576476200155610ustar00rootroot00000000000000#! /bin/bash function Recho() { echo -e "\e[0;31m""$@""\e[0m"; } function Gecho() { echo -e "\e[0;32m""$@""\e[0m"; } function Becho() { echo -e "\e[0;34m""$@""\e[0m"; } function errexit() { exec >&2 Recho "Error: $@" exit 1 } function usage() { exec >&2 cat </dev/null || { Recho "!!!" Recho "!!! There is no LAST_RELEASE tag '$LAST_RELEASE'. Check manually. " Recho "!!! (git tag -m 'tagging $LAST_RELEASE' '$LAST_RELEASE' ?commit?)" Recho "!!!" exit 8 } if [ "$DRYRUN" == "1" ]; then newchangesentry sameVersion && { Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)." } exit 0 fi # check version file # while true; do # $LAST_RELEASE # $LAST_COMPAT # $THIS_RELEASE # $THIS_COMPAT sameVersion && { newchangesentry Becho "!!! Version is unchanged at $LAST_RELEASE ($LAST_COMPAT)." read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (P) patch, (M) minor, (I) incompat minor, (e)dit version [e]: ")" RES echo case "${RES:-e}" in [eE]*) Edit $VERSIONFILE eval $(getversion) continue ;; [cC]) Becho "!!! Leave $VERSIONFILE untouched" break ;; [P]) setversion LIBZYPP_PATCH $(($THIS_PATCH + 1)) eval $(getversion) continue ;; [M]) setversion LIBZYPP_MINOR $(($THIS_MINOR + 1)) setversion LIBZYPP_PATCH 0 eval $(getversion) continue ;; [I]) setversion LIBZYPP_COMPATMINOR $(($THIS_MINOR + 1)) setversion LIBZYPP_MINOR $(($THIS_MINOR + 1)) setversion LIBZYPP_PATCH 0 eval $(getversion) continue ;; *) errexit "aborted" ;; esac } break done # prepare changes file # TMPFILE=$(mktemp) trap " [ -f \"$TMPFILE\" ] && /bin/rm -f -- \"$TMPFILE\" " 0 1 2 3 13 15 { newchangesentry; cat $CHANGESFILE; } >$TMPFILE RES=e while [ "$RES" == "e" ]; do Edit $TMPFILE echo awk '{print}/^----------/{n=n+1; if ( n == 2 ) exit 0; }' $TMPFILE read -n 1 -p "$(Gecho "(a)bort, (c)ontinue, (s)ubmitt, (e)dit [e]: ")" RES echo case "${RES:-e}" in [eE]*) RES=e ;; [cCsS]) Becho "!!! Store new $CHANGESFILE" mv $TMPFILE $CHANGESFILE chmod 644 $CHANGESFILE test "$RES" == "s" && { if [ "$LAST_RELEASE" == "$THIS_RELEASE" ]; then git add "$CHANGESFILE" && git commit -m "changes" else Becho "!!! Remember new version $THIS_RELEASE in $VERSIONFILE" sed -i "s/^# LAST RELEASED:.*$/# LAST RELEASED: $THIS_RELEASE ($THIS_COMPAT)/" $VERSIONFILE if git add "$CHANGESFILE" "$VERSIONFILE" \ && git commit -m "changes $THIS_RELEASE ($THIS_COMPAT)" \ && git tag -m "tagging $THIS_RELEASE" "$THIS_RELEASE" HEAD; then Becho "!!!" Becho "!!! Do not forget to push the commit and the tag: $(Gecho git push --tags origin HEAD)" Becho "!!!" else Recho "!!!" Recho "!!! Commit failed. Check manually. (git reset HEAD~)" Recho "!!!" exit 9 fi fi } ;; *) Becho "!!! Leave $CHANGESFILE untouched" ;; esac done libzypp-17.36.5/needreboot000066400000000000000000000015431476576476200154720ustar00rootroot00000000000000## ## This file may contain packages which will trigger the reboot-needed hint. ## So the user gets informed that the system should be rebooted after ## one of these packages was updated. ## ## This config file is for the systems administrator. ## Additional configuration files can be placed in /etc/zypp/needreboot.d ## ## For packages the intended way would be to provide 'installhint(reboot-needed)' ## if the package wants to trigger the needreboot hint. If the hint should be ## shown for packages not providing 'installhint(reboot-needed)', list them here. ## ## Format: Each line must contain either a 'PACKAGENAME' or 'provides:CAPABILITY' ## to include all packages providing a dependency match for 'CAPABILITY'. ## Lines starting with '#' and empty lines are ignored. ## ## Example: ## provides:kernel ## kernel-firmware ## libzypp-17.36.5/package/000077500000000000000000000000001476576476200150115ustar00rootroot00000000000000libzypp-17.36.5/package/libzypp-rpmlint.cmake000066400000000000000000000000571476576476200211710ustar00rootroot00000000000000addFilter("libzypp.* shlib-policy-name-error") libzypp-17.36.5/package/libzypp.changes000066400000000000000000015632011476576476200200440ustar00rootroot00000000000000------------------------------------------------------------------- Mon Mar 17 10:22:21 CET 2025 - ma@suse.de - Fix computation of RepStatus if Repo URLs change. - Fix lost double slash when appending to an absolute FTP url (bsc#1238315) Ftp actually differs between absolute and relative URL paths. Absolute path names begin with a double slash encoded as '/%2F'. This must be preserved when manipulating the path. - version 17.36.5 (35) ------------------------------------------------------------------- Fri Feb 28 16:20:03 CET 2025 - ma@suse.de - Add a transaction package preloader (fixes openSUSE/zypper#104) This patch adds a preloader that concurrently downloads files during a transaction commit. It's not yet enabled per default. To enable the preview set ZYPP_CURL2=1 and ZYPP_PCK_PRELOAD=1 in the environment. - RpmPkgSigCheck_test: Exchange the test package signingkey (fixes #622) - Exclude MediaCurl tests if DISABLE_MEDIABACKEND_TESTS (fixes #626) - Strip a mediahandler tag from baseUrl querystrings. - version 17.36.4 (35) ------------------------------------------------------------------- Thu Feb 27 10:21:22 CET 2025 - ma@suse.de - Disable zypp.conf:download.use_deltarpm by default (fixes #620) Measurements show that you don't benefit from using deltarpms unless your network connection is very slow. That's why most distributions even stop offering deltarpms. The default remains unchanged on SUSE-15.6 and older. - Make sure repo variables are evaluated in the right context (bsc#1237044) - Introducing MediaCurl2 a alternative HTTP backend. This patch adds MediaCurl2 as a testbed for experimenting with a more simple way to download files. Set ZYPP_CURL2=1 in the environment to use it. - version 17.36.3 (35) ------------------------------------------------------------------- Fri Feb 21 15:08:12 CET 2025 - ma@suse.de - Filesystem usrmerge must not be done in singletrans mode (bsc#1236481, bsc#1189788) Commit will amend the backend in case the transaction would perform a filesystem usrmerge. - Workaround bsc#1216091 on Code16. - version 17.36.2 (35) ------------------------------------------------------------------- Wed Feb 12 15:58:56 CET 2025 - ma@suse.de - Don't issue deprecated warnings if -DNDEBUG is set (bsc#1236983) Released libyui packages compile with -Werror=deprecated-declarations so we can't add deprecated warnings without breaking them. - make gcc15 happy (fixes #613) - version 17.36.1 (35) ------------------------------------------------------------------- Mon Feb 10 16:18:10 CET 2025 - ma@suse.de - Drop zypp-CheckAccessDeleted in favor of 'zypper ps'. - Fix Repoverification plugin not being executed (fixes #614) - Refresh: Fetch the master index file before key and signature (bsc#1236820) - Allow libzypp to compile with C++20. - Deprecate RepoReports we do not trigger. - version 17.36.0 (35) ------------------------------------------------------------------- Wed Jan 22 16:09:09 CET 2025 - ma@suse.de - Create '.keep_packages' in the package cache dir to enforce keeping downloaded packages of all repos cahed there (bsc#1232458) - version 17.35.19 (35) ------------------------------------------------------------------- Mon Jan 20 17:17:16 CET 2025 - ma@suse.de - Fix missing UID checks in repomanager workflow (fixes #603) - version 17.35.18 (35) ------------------------------------------------------------------- Mon Jan 20 10:36:25 CET 2025 - ma@suse.de - Move cmake config files to LIB_INSTALL_DIR/cmake/Zypp (fixes #28) - Fix 'zypper ps' when running in incus container (bsc#1229106) Should apply to lxc and lxd containers as well. - Re-enable 'rpm --runposttrans' usage for chrooted systems (bsc#1216091) - version 17.35.17 (35) ------------------------------------------------------------------- Wed Dec 18 22:40:49 CET 2024 - ma@suse.de - Url: queryparams without value should not have a trailing "=". - version 17.35.16 (35) ------------------------------------------------------------------- Mon Dec 9 19:01:14 CET 2024 - ma@suse.de - Url query part: `=` is a safe char in value (bsc#1234304) - RpmDb: Recognize rpmdb.sqlite as database file (#593) - Fix typo (fixes #592) - cmake: check location of fcgi header and adjust include accordingly. On Debian and derivatives the fcgi headers are not stored in a fastcgi/ subdirectory.(#590) - version 17.35.15 (35) ------------------------------------------------------------------- Fri Nov 15 10:45:20 CET 2024 - ma@suse.de - The 20MB download limit must not apply to non-metadata files like package URLs provided via the CLI (bsc#1233393). - version 17.35.14 (35) ------------------------------------------------------------------- Tue Nov 12 14:35:35 CET 2024 - ma@suse.de - BuildCache: Don't try to retrieve missing raw metadata if no permission to write the cache (bsc#1225451) - RepoManager: throw RepoNoPermissionException if the user has no permission to update(write) the caches (bsc#1225451) - version 17.35.13 (35) ------------------------------------------------------------------- Wed Oct 9 18:21:43 CEST 2024 - ma@suse.de - PluginFrame: Send unescaped colons in header values (bsc#1231043) According to the STOMP protocol it would be correct to escape a colon in a header-value, but it breaks plugin receivers which do not expect this. The first colon separates header-name from header-value, so escaping in the header-value is not needed anyway. Escaping in the header-value affects especially the urlresolver plugins. The input URL is passed in a header, but sent back as raw data in the frames body. If the plugin receiver does not correctly unescape the URL we may get back a "https\c//" which is not usable. - Do not ignore return value of std::remove_if in MediaSyncFacade (fixes #579) - Fix hang in curl code with no network connection (bsc#1230912) - version 17.35.12 (35) ------------------------------------------------------------------- Thu Sep 12 13:44:05 CEST 2024 - ma@suse.de - Deprecate librpmDb::db_const_iterator default ctor (bsc#1230267) It's preferred to explicitly tell the root directory of the system whose database you want to query. - version 17.35.11 (35) ------------------------------------------------------------------- Fri Sep 6 11:55:42 CEST 2024 - ma@suse.de - API refactoring. Prevent zypper from using now private libzypp symbols (bsc#1230267) - Conflicts: zypper <= 1.14.76 - version 17.35.10 (35) ------------------------------------------------------------------- Mon Aug 5 12:04:25 CEST 2024 - ma@suse.de - single_rpmtrans: fix installation of .src.rpms (bsc#1228647) - version 17.35.9 (35) ------------------------------------------------------------------- Fri Aug 2 12:46:50 CEST 2024 - ma@suse.de - Make sure not to statically linked installed tools (bsc#1228787) - version 17.35.8 (35) ------------------------------------------------------------------- Thu Aug 1 17:35:44 CEST 2024 - ma@suse.de - MediaPluginType must be resolved to a valid MediaHandler (bsc#1228208) - version 17.35.7 (35) ------------------------------------------------------------------- Tue Jul 30 16:59:53 CEST 2024 - ma@suse.de - Export CredentialManager for legacy YAST versions (bsc#1228420) - version 17.35.6 (35) ------------------------------------------------------------------- Tue Jul 30 15:55:38 CEST 2024 - ma@suse.de - Export asSolvable for YAST (bsc#1228420) - Fix 4 typos in zypp.conf. - version 17.35.5 (35) ------------------------------------------------------------------- Tue Jul 23 14:19:39 CEST 2024 - ma@suse.de - Fix typo in the geoip update pipeline (bsc#1228206) - Export RepoVariablesStringReplacer for yast2 (bsc#1228138) - version 17.35.4 (35) ------------------------------------------------------------------- Mon Jul 15 16:13:25 CEST 2024 - ma@suse.de - Translation: updated .pot file. - Conflict with python zypp-plugin < 0.6.4 (bsc#1227793) Older zypp-plugins reject stomp headers including a '-'. Like the 'content-length' header we may send. - Fix int overflow in Provider (fixes #559) This patch fixes an issue in safe_strtonum which caused timestamps to overflow in the Provider message parser. - Fix error reporting on repoindex.xml parse error (bsc#1227625) - version 17.35.3 (35) ------------------------------------------------------------------- Tue Jul 9 11:28:36 CEST 2024 - ma@suse.de - Keep UrlResolverPlugin API public (fixes #560) - Blacklist /snap executables for 'zypper ps' (bsc#1226014) - Fix handling of buddies when applying locks (bsc#1225267) Buddy pairs (like -release package and product) internally share the same status object. When applying locks from query results the locked bit must be set if either item is locked. - version 17.35.2 (35) ------------------------------------------------------------------- Tue Jul 2 12:30:20 CEST 2024 - ma@suse.de - Install zypp/APIConfig.h legacy include (fixes #557) - version 17.35.1 (35) ------------------------------------------------------------------- Fri Jun 28 17:48:09 CEST 2024 - ma@suse.de - Update soname due to RepoManager refactoring and cleanup. - version 17.35.0 (35) ------------------------------------------------------------------- Mon Jun 24 12:48:00 CEST 2024 - ma@suse.de - Workaround broken libsolv-tools-base requirements (fixes openSUSE/zypper#551) - Strip ssl_clientkey from repo urls (bsc#1226030) - Remove protobuf build dependency. - Lazily attach medium during refresh workflows (bsc#1223094) - Refactor RepoManager and add Service workflows. - version 17.34.2 (34) ------------------------------------------------------------------- Fri May 31 12:19:45 CEST 2024 - ma@suse.de - zypp-tui: Make sure translated texts use the correct textdomain (fixes #551) - Skip libproxy1 requires for tumbleweed. - version 17.34.1 (34) ------------------------------------------------------------------- Tue May 14 16:17:41 UTC 2024 - Dirk Müller - don't require libproxy1 on tumbleweed, it is optional now -------------------------------------------------------------------- Tue May 14 14:21:13 CEST 2024 - bzeller@suse.de - version 17.34.0 (34) - Fix versioning scheme ------------------------------------------------------------------ Mon May 13 11:48:13 CEST 2024 - bzeller@suse.de - version 17.33.4 (35) ------------------------------------------------------------------- Thu May 9 13:43:39 UTC 2024 - Dirk Müller - add one more missing export for libyui-qt-pkg ------------------------------------------------------------------- Wed May 8 14:05:16 CEST 2024 - bzeller@suse.de - Revert eintrSafeCall behavior to setting errno to 0. - version 17.33.3 (34) ------------------------------------------------------------------- Mon May 6 08:28:32 UTC 2024 - Dirk Müller - fix up requires_eq usage for libsolv-tools-base - add one more missing export for PackageKit - version 17.33.2 ------------------------------------------------------------------- Fri May 3 14:06:58 CEST 2024 - ma@suse.de - version 17.33.1 (33) ------------------------------------------------------------------- Fri May 3 11:31:43 UTC 2024 - Dirk Müller - switch to reduced size libsolv-tools-base (jsc#PED-8153) ------------------------------------------------------------------- Fri May 3 12:52:22 CEST 2024 - ma@suse.de - Fixed check for outdated repo metadata as non-root user (bsc#1222086) - Add ZYPP_API for exported functions and switch to visibility=hidden (jsc#PED-8153) - Dynamically resolve libproxy (jsc#PED-8153) - version 17.33.0 (33) ------------------------------------------------------------------- Mon Apr 29 12:00:59 CEST 2024 - ma@suse.de - Fix download from gpgkey URL (bsc#1223430, fixes openSUSE/zypper#546) - version 17.32.6 (32) ------------------------------------------------------------------- Fri Apr 19 15:58:26 CEST 2024 - ma@suse.de - Don't try to refresh volatile media as long as raw metadata are present (bsc#1223094) - version 17.32.5 (32) ------------------------------------------------------------------- Wed Apr 17 17:07:52 CEST 2024 - ma@suse.de - Fix creation of sibling cache dirs with too restrictive mode (bsc#1222398) Some install workflows in YAST may lead to too restrictive (0700) raw cache directories in case of newly created repos. Later commands running with user privileges may not be able to access these repos. - version 17.32.4 (32) ------------------------------------------------------------------- Thu Apr 11 16:10:46 CEST 2024 - ma@suse.de - Update RepoStatus fromCookieFile according to the files mtime (bsc#1222086) - TmpFile: Don't call chmod if makeSibling failed. - version 17.32.3 (32) ------------------------------------------------------------------- Tue Apr 2 16:08:58 CEST 2024 - ma@suse.de - Fixup New VendorSupportOption flag VendorSupportSuperseded (jsc#OBS-301, jsc#PED-8014) Fixed the name of the keyword to "support_superseded" as it was agreed on in jsc#OBS-301. - version 17.32.2 (32) ------------------------------------------------------------------- Thu Mar 28 17:56:04 CET 2024 - ma@suse.de - Add resolver option 'removeUnneeded' to file weak remove jobs for unneeded packages (bsc#1175678) - version 17.32.1 (32) ------------------------------------------------------------------- Fri Mar 22 18:16:32 CET 2024 - ma@suse.de - Add resolver option 'removeOrphaned' for distupgrade (bsc#1221525) - New VendorSupportOption flag VendorSupportSuperseded (jsc#OBS-301, jsc#PED-8014) - Tests: fix vsftpd.conf where SUSE and Fedora use different defaults (fixes #522) - Add default stripe minimum (#529) - Don't expose std::optional where YAST/PK explicitly use c++11. - Digest: Avoid using the deprecated OPENSSL_config. - version 17.32.0 (32) ------------------------------------------------------------------- Tue Feb 20 17:30:42 CET 2024 - ma@suse.de - ProblemSolution::skipsPatchesOnly overload to handout the patches. - Remove https->http redirection exceptions for download.opensuse.org. - version 17.31.32 (22) ------------------------------------------------------------------- Wed Feb 7 10:25:39 CET 2024 - ma@suse.de - tui: allow to access the underlying ostream of out::Info. - Add MLSep: Helper to produce not-NL-terminated multi line output. - version 17.31.31 (22) ------------------------------------------------------------------- Tue Feb 6 10:36:24 CET 2024 - ma@suse.de - applydeltaprm: Create target directory if it does not exist (bsc#1219442) - Add ProblemSolution::skipsPatchesOnly (for openSUSE/zypper#514) - Fix problems with EINTR in ExternalDataSource::getline (fixes bsc#1215698) - version 17.31.30 (22) ------------------------------------------------------------------- Tue Jan 23 16:10:26 CET 2024 - ma@suse.de - CheckAccessDeleted: fix running_in_container detection (bsc#1218782) - Detect CURLOPT_REDIR_PROTOCOLS_STR availability at runtime (bsc#1218831) - Make Wakeup class EINTR safe. - Add a way to cancel media operations on shutdown (openSUSE/zypper#522) This patch adds a mechanism to signal libzypp that a shutdown was requested, usually when CTRL+C was pressed by the user. Currently only the media backend will utilize this, but can be extended to all code paths that use g_poll() to wait for events. - Manually poll fds for curl in MediaCurl. Using curl_easy_perform does not give us the required control on when we want to cancel a download. Switching to the MultiCurl implementation with a external poll() event loop will give us much more freedom and helps us to improve our Ctrl+C handling. - Move reusable curl poll code to curlhelper.h. - version 17.31.29 (22) ------------------------------------------------------------------- Tue Jan 9 15:38:42 CET 2024 - ma@suse.de - Fix to build with libxml 2.12.x (fixes #505) - version 17.31.28 (22) ------------------------------------------------------------------- Fri Dec 22 17:12:31 CET 2023 - ma@suse.de - CheckAccessDeleted: fix 'running in container' filter (bsc#1218291) - version 17.31.27 (22) ------------------------------------------------------------------- Thu Dec 21 18:14:32 CET 2023 - ma@suse.de - Call zypp commit plugins during transactional update (fixes #506) - Add support for loongarch64 (fixes #504) - Teach MediaMultiCurl to download HTTP Multibyte ranges. - Teach zsync downloads to MultiCurl. - Expand RepoVars in URLs downloading a .repo file (bsc#1212160) Convenient and helps documentation as it may refer to a single command for a bunch of distributions. Like e.g. "zypper ar 'https://server.my/$releasever/my.repo'". - version 17.31.26 (22) ------------------------------------------------------------------- Thu Dec 14 11:09:24 CET 2023 - ma@suse.de - Fix build issue with zchunk build flags (fixes #500) - version 17.31.25 (22) ------------------------------------------------------------------- Thu Dec 14 10:48:01 CET 2023 - ma@suse.de - Open rpmdb just once during execution of %posttrans scripts (bsc#1216412) - Avoid using select() since it does not support fd numbers > 1024 (fixes #447) - tools/DownloadFiles: use standard zypp progress bar (fixes #489) - Revert "Color download progress bar" (fixes #475) Cyan is already used for the output of RPM scriptlets. Avoid this colorific collision between download progress bar and scriptlet output. - Fix ProgressBar's calculation of the printed tag position (fixes #494) - Switch zypp::Digest to Openssl 3.0 Provider API (fixes #144) - Fix usage of deprecated CURL features (fixes #486) - version 17.31.24 (22) ------------------------------------------------------------------- Wed Oct 25 16:03:51 CEST 2023 - ma@suse.de - Stop using boost version 1 timer library (fixes #489, bsc#1215294) - version 17.31.23 (22) ------------------------------------------------------------------- Thu Oct 12 14:26:36 CEST 2023 - ma@suse.de - Preliminary disable 'rpm --runposttrans' usage for chrooted systems (bsc#1216091) This limits the %transfiletrigger(postun|in) support in the default installer if --root is used (as described in bsc#1041742). The chrooted execution of the scripts in 'rpm --runposttrans' broke in rpm-4.18. It's expected to be fixed in rpm-4.19. Then we'll enable the feature again. - fix comment typo on zypp.conf (boo#1215979) - version 17.31.22 (22) ------------------------------------------------------------------- Thu Sep 21 14:54:42 CEST 2023 - ma@suse.de - Attempt to delay %transfiletrigger(postun|in) execution if rpm supports it (bsc#1041742) Decide during installation whether rpm is capable of delayed %posttrans %transfiletrigger(postun|in) execution or whether we can just handle the packages %posttrans. On TW a delayed %transfiletrigger handling is possible since rpm-4.17. - Make sure the old target is deleted before a new one is created (bsc#1203760) - version 17.31.21 (22) ------------------------------------------------------------------- Thu Aug 24 15:33:45 CEST 2023 - ma@suse.de - Fixup changes for 17.31.16. Remove faulty reference to a bug actually fixed in 2019. - version 17.31.20 (22) ------------------------------------------------------------------- Wed Aug 16 16:54:34 CEST 2023 - ma@suse.de - Fix zypp-tui/output/Out.h to build with clang. - Fix zypp/Arch.h for clang (fixes #478) Clang seems to have issues with picking the overload in std::men_fn if there is a static overload of a member function. We need to explicitely specify the correct type of the function pointer. To make sure this would not break compiling a application with clang that builds against libzypp this patch works around the problem. - version 17.31.19 (22) ------------------------------------------------------------------- Fri Aug 4 17:40:19 CEST 2023 - ma@suse.de - SINGLE_RPMTRANS: Respect ZYPP_READONLY_HACK when checking the zypp-rpm lock (fixes openSUSE/openSUSE-repos#29) - version 17.31.18 (22) ------------------------------------------------------------------- Fri Jul 28 12:26:54 CEST 2023 - ma@suse.de - Fix wrong filesize exceeded dl abort in zyppng::Downloader (bsc#1213673) In some cases when downloading very small files we can run into issues when the URL is protected by credentials. - version 17.31.17 (22) ------------------------------------------------------------------- Mon Jul 24 16:58:18 CEST 2023 - ma@suse.de - Fix negative ZYPP_LOCK_TIMEOUT not waiting forever (bsc#1213231) - Don't cleanup orphaned dirs if read-only mode was promised (bsc#1210740) - version 17.31.16 (22) ------------------------------------------------------------------- Wed Jun 28 12:34:18 CEST 2023 - ma@suse.de - Fix build against protobuf >= 22 (fixes #465, closes #466) Port away from protobuf_generate_cpp. Upstream protobuf does not export protobuf_generate_cpp by default anymore. Use protobuf_generate instead, which is also available on older versions. - Remove SUSE < SLE11 constructs (fixes #464). - version 17.31.15 (22) ------------------------------------------------------------------- Thu Jun 15 12:00:07 CEST 2023 - ma@suse.de - build: honor libproxy.pc's includedir (bsc#1212222) - Curl: trim all custom headers (bsc#1212187) HTTP/2 RFC 9113 forbids fields ending with a space. So we make sure all custom headers are trimmed. This also includes headers returned by URL-Resolver plugins. - version 17.31.14 (22) ------------------------------------------------------------------- Mon Jun 12 16:37:13 CEST 2023 - ma@suse.de - curl: Trim user agent string (bsc#1212187) HTTP/2 RFC 9113 forbids fields ending with a space. Violation results in curl error: 92: HTTP/2 PROTOCOL_ERROR. - version 17.31.13 (22) ------------------------------------------------------------------- Mon Jun 5 12:15:55 CEST 2023 - ma@suse.de - Do not unconditionally release a medium if provideFile failed (bsc#1211661) - libzypp.spec.cmake: remove duplicate file listing. - version 17.31.12 (22) ------------------------------------------------------------------- Fri Apr 28 13:40:07 CEST 2023 - ma@suse.de - MediaCurl: Fix endless loop if wrong credentials are stored in credentials.cat (bsc#1210870) Since libzypp-17.31.7 wrong credentials stored in credentials.cat may lead to an endless loop. Rather than asking for the right credentials, the stored ones are used again and again. - zypp.conf: Introduce 'download.connect_timeout' [60 sec.] (bsc#1208329) Maximum time in seconds that you allow the connection phase to the server to take. This only limits the connection phase, it has no impact once it has connected. (see also CURLOPT_CONNECTTIMEOUT) - commit: Try to provide /dev fs if not present (fixes #444) - fix build with boost 1.82. - version 17.31.11 (22) ------------------------------------------------------------------- Mon Apr 24 08:30:44 CEST 2023 - aschnell@suse.com - fix build with boost 1.82 ------------------------------------------------------------------- Thu Apr 13 16:48:40 CEST 2023 - ma@suse.de - BuildRequires: libsolv-devel >= 0.7.24 for x86_64_v[234] support. - version 17.31.10 (22) ------------------------------------------------------------------- Fri Mar 31 18:35:00 CEST 2023 - ma@suse.de - Workround bsc#1195633 while libsolv <= 0.7.23 is used. - Fix potential endless loop in new ZYPP_MEDIANETWORK. - ZYPP_METALINK_DEBUG=1: Log URL and priority of the mirrors parsed from a metalink file. - multicurl: propagate ssl settings stored in repo url (boo#1127591) Closes #335. - Teach MediaNetwork to retry on HTTP2 errors. - fix CapDetail to return Rel::NONE if an EXPRESSION is used as a NAMED cap. - Capability: support parsing richdeps from string. - defaultLoadSystem: default to LS_NOREFRESH if not root. - Detect x86_64_v[234]: Fix LZCNT bit used in detection (fixes #439) Merges rpm-software-management/rpm#2412: The bit for LZCNT is in CPUID 0x80000001, not 1. - Detect x86_64_v[234] architecture levels (fixes #439) - Support x86_64_v[234] architecture levels (for #439) - version 17.31.9 (22) ------------------------------------------------------------------- Mon Feb 13 16:48:56 CET 2023 - ma@suse.de - ProgressData: enforce reporting the INIT||END state (bsc#1206949) - ps: fix service detection on newer Tumbleweed systems (bsc#1205636) - version 17.31.8 (22) ------------------------------------------------------------------- Sat Dec 24 02:22:11 CET 2022 - ma@suse.de - Hint to "zypper removeptf" to remove PTFs. - Removing a PTF without enabled repos should always fail (bsc#1203248) Without enabled repos, the dependent PTF-packages would be removed (not replaced!) as well. To remove a PTF "zypper install -- -PTF" or a dedicated "zypper removeptf PTF" should be used. This will update the installed PTF packages to theit latest version. - version 17.31.7 (22) ------------------------------------------------------------------- Fri Nov 25 13:41:55 CET 2022 - ma@suse.de - Avoid calling getsockopt when we know the info already. This patch hopefully fixes logging on WSL, getsockopt seems to not be fully supported but the code required it when accepting new socket connections. (for bsc#1178233) - Enhance yaml-cpp detection (fixes #428) - No need to redirect 'history.logfile=/dev/null' into the target. - MultiCurl: Make sure to reset the progress function when falling back. - version 17.31.6 (22) ------------------------------------------------------------------- Mon Nov 7 13:09:46 CET 2022 - ma@suse.de - Create '.no_auto_prune' in the package cache dir to prevent auto cleanup of orphaned repositories (bsc#1204956) - properly reset range requests (bsc#1204548) - version 17.31.5 (22) ------------------------------------------------------------------- Mon Oct 17 12:53:40 CEST 2022 - ma@suse.de - Do not clean up MediaSetAccess before using the geoip file (fixes #424) - version 17.31.4 (22) ------------------------------------------------------------------- Fri Oct 14 14:09:51 CEST 2022 - ma@suse.de - Improve download of optional files (fixes #416) - Do not use geoip rewrites if the repo has explicit country settings. - Implement geoIP feature for zypp. This patch adds a feature to rewrite request URLs to the repo servers by querying a geoIP file from download.opensuse.org. This file can return a redirection target depending on the clients IP adress, this way we can directly contact a local mirror of d.o.o instead. The redir target stays valid for 24hrs. This feature can be disabled in zypp.conf by setting 'download.use_geoip_mirror = false'. - Use a dynamic fallback for BLKSIZE in downloads. When not receiving a blocklist via metalink file from the server MediaMultiCurl used to fallback to a fixed, relatively small BLKSIZE. This patch changes the fallback into a dynamic value based on the filesize using a similar metric as the MirrorCache implementation on the server side. - Skip media.1/media download for http repo status calc. This patch allows zypp to skip a extra media.1/media download to calculate if a repository needs to be refreshed. This optimisation only takes place if the repo does specify only downloading base urls. - version 17.31.3 (22) ------------------------------------------------------------------- Wed Oct 5 18:02:15 CEST 2022 - ma@suse.de - Resolver: Fix missing --[no]-recommends initialization in update (fixes #openSUSE/zypper#459, bsc#1201972) - Log ONLY_NAMESPACE_RECOMMENDED because this is what corresponds to --[no]-recommends. - version 17.31.2 (22) ------------------------------------------------------------------- Fri Sep 2 16:38:42 CEST 2022 - ma@suse.de - UsrEtc: Store logrotate files in %{_distconfdir} if defined (fixes #402) - Log backtrace on SIGABRT too. - Need to explicitly enable building experimental code. Otherwise an old Notcurses++ package which happens to be present in the buildenv breaks the build (fixes #412). - Work around libyui/libyui#78 on code 15.4 and older. - Stop using std::*ary_function; deprecated and removed in c++17. - Don't expose header files which use types not available in c++11. In 15.3 and older, YAST and PK compile with -std=c++11. - Remove no longer needed %post code (bsc#1203649) - Enable zck support for SLE15-SP4 and newer. On Leap it is enabled since 15.1 (bsc#1189282) - version 17.31.1 (22) ------------------------------------------------------------------- Tue Jul 19 16:03:01 CEST 2022 - ma@suse.de - Add PoolItem::statusReinit to reset the status it's initial state in the ResPool (might help bsc#1199895) This may either be 'KEEP_STATE bySOLVER' or 'LOCKED byUSER' if the PoolItem matched a hard lock defined in /etc/zypp/locks. - Fix building with GCC 13 on i586 (fixes #407, fixes #396) - Be prepared to receive exceptions from curl_easy_cleanup (bsc#1201092) - Don't auto-flag kernel-firmware as 'reboot-needed' (bsc#1200993) - Remove Medianetwork and dependend code. This commit removes the MediaNetwork tech preview and all related code. First reason for this is that MediaNetwork was just meant as a way to test the new CURL based downloader and second: since the Provide API is going to completely replace the current media backend it would be extra work to ensure that changes on the Downloader do not break MediaNetwork. - version 17.31.0 (22) ------------------------------------------------------------------- Tue Jul 5 10:29:19 CEST 2022 - ma@suse.de - Fix building with GCC 12.x release (#396) - version 17.30.3 (22) ------------------------------------------------------------------- Wed Jun 15 12:07:22 CEST 2022 - ma@suse.de - appdata plugin: Pass path to the repodata/ directory inside the cache (bsc#1197684) - zypp-rpm: flush rpm script output buffer before sending endOfScriptTag. - version 17.30.2 (22) ------------------------------------------------------------------- Mon May 30 14:37:57 CEST 2022 - ma@suse.de - PluginRepoverification: initial version hooked into repo::Downloader and repo refresh. - Immediately start monitoring the download.transfer_timeout. Do not wait until the first data arrived. (bsc#1199042) - singletrans: no dry-run commit if doing just download-only. - Work around cases where sat repo.start points to an invalid solvable. May happen if (wrong arch) solvables were removed at the beginning of the repo. - fix misplaced #endif SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER (fixes #388) - version 17.30.1 (22) ------------------------------------------------------------------- Fri Mar 25 17:08:46 CET 2022 - ma@suse.de - ZConfig: Update solver settings if target changes (bsc#1196368) - version 17.30.0 (22) ------------------------------------------------------------------- Mon Mar 21 09:04:36 CET 2022 - ma@suse.de - Fix possible hang in singletrans mode (bsc#1197134) - Do 2 retries if mount is still busy. - version 17.29.7 (22) ------------------------------------------------------------------- Mon Mar 14 15:40:04 CET 2022 - ma@suse.de - Fix package signature check (bsc#1184501) Pay attention that header and payload are secured by a valid signature and report more detailed which signature is missing. - Retry umount if device is busy (bsc#1196061, closes #381) A previously released ISO image may need a bit more time to release it's loop device. So we wait a bit and retry. - Fix serializing/deserializing type mismatch in zypp-rpm protocol (bsc#1196925) - Fix handling of ISO media in releaseAll (bsc#1196061) - Hint on common ptf resolver conflicts (bsc#1194848) - version 17.29.6 (22) ------------------------------------------------------------------- Thu Feb 24 13:47:26 CET 2022 - ma@suse.de - Hint on ptf<>patch resolver conflicts (bsc#1194848) - version 17.29.5 (22) ------------------------------------------------------------------- Tue Feb 8 10:52:48 CET 2022 - ma@suse.de - Fix handling of redirected command in-/output (bsc#1195326) This fixes delays at the end of zypper operations, where zypper unintentionally waits for appdata plugin scripts to complete. - version 17.29.4 (22) ------------------------------------------------------------------- Tue Feb 1 18:49:00 CET 2022 - ma@suse.de - Public header files on older distros must use c++11 (bsc#1194597) - Fix exception handling when reading or writing credentials (bsc#1194898) - version 17.29.3 (22) ------------------------------------------------------------------- Thu Jan 20 17:29:52 CET 2022 - ma@suse.de - Fix Legacy include (bsc#1194597) - version 17.29.2 (22) ------------------------------------------------------------------- Mon Jan 10 13:02:11 CET 2022 - ma@suse.de - Fix broken install path for parser compat headers (fixes #372, bsc#1194597) - RepoManager: remember exec errors in exception history (bsc#1193007) - version 17.29.1 (22) ------------------------------------------------------------------- Thu Dec 23 16:01:31 CET 2021 - ma@suse.de - Use the default zypp.conf settings if no zypp.conf exists (bsc#1193488) - Fix wrong encoding of iso: URL components (bsc#954813) - Handle armv8l as armv7hl compatible userland. - Introduce zypp-curl a sublibrary for CURL related code. - zypp-rpm: Increase rpm loglevel if ZYPP_RPM_DEBUG is set. - Save all signatures associated with a public key in its PublicKeyData. - version 17.29.0 (22) ------------------------------------------------------------------- Thu Nov 11 15:12:44 CET 2021 - ma@suse.de - Disable logger in the child after fork (bsc#1192436) - version 17.28.8 (22) ------------------------------------------------------------------- Thu Nov 4 15:16:29 CET 2021 - ma@suse.de - Check log writer before accessing it (fixes #355, bsc#1192337) - Save locks: Update an existing locks changed comment string. - Allow uname-r format in purge kernels keepspec (fixes openSUSE/zypper#418) - version 17.28.7 (22) ------------------------------------------------------------------- Mon Oct 18 12:02:57 CEST 2021 - ma@suse.de - Zypper should keep cached files if transaction is aborted (bsc#1190356) Singletrans mode currently does not keep files around if the transaction is aborted. This patch fixes the problem. - Require a minimum number of mirrors for multicurl (bsc#1191609) - Use procfs to detect nr of open fd's if rlimit is too high (bsc#1191324) Especially in a VM iterating over all possible fd's to close open ones right before a exec() slows down zypper unnecessarily. This patch uses /proc/self/fd to iterate over open fd's in case rlimit is above 1024. - po: Fix some lost '%' signs in positional args (bsc#1191370) - RepoManager: Don't probe for plaindir repo if URL schema is plugin: (bsc#1191286) - version 17.28.6 (22) ------------------------------------------------------------------- Mon Oct 4 12:46:46 CEST 2021 - ma@suse.de - Downloader does not respect checkExistsOnly flag (bsc#1190712) A missing check causes zyppng::Downloader to always download full files even if the checkExistsOnly flag is set. This patch adds the missing logic. - Fix kernel-*-livepatch removal in purge-kernels (bsc#1190815) The kernel-*-livepatch packages are supposed to serve as a stable handle for the ephemeral kernel livepatch packages. See FATE#320268 for details. As part of the kernel live patching ecosystem, kernel-*-livepatch packages should not block the purge-kernels step. - version 17.28.5 (22) ------------------------------------------------------------------- Fri Sep 17 10:41:56 CEST 2021 - ma@suse.de - Make sure to keep states alives while transitioning (bsc#1190199) - May set techpreview variables for testing in /etc/zypp/zypp.conf. If environment variables are unhandy one may enable the desired techpreview in zypp.conf as well: [main] techpreview.ZYPP_SINGLE_RPMTRANS=1 techpreview.ZYPP_MEDIANETWORK=1 - version 17.28.4 (22) ------------------------------------------------------------------- Fri Sep 3 14:34:19 CEST 2021 - ma@suse.de - CMake/spec: Add option to force SINGLE_RPMTRANS as default for zypper (fixes #340) - Make sure singleTrans is zypper-only for now. - Do not double check signatures and keys (bsc#1190059) - version 17.28.3 (22) ------------------------------------------------------------------- Tue Aug 31 10:49:51 CEST 2021 - ma@suse.de - Workaround Bug 1189788: Don't allow ZYPP_SINGLE_RPMTRANS=1 on a not UsrMerged Tumbleweed system. - version 17.28.2 (22) ------------------------------------------------------------------- Mon Aug 23 08:39:15 CEST 2021 - ma@suse.de - Fix crashes in logging code when shutting down (bsc#1189031) - version 17.28.1 (22) ------------------------------------------------------------------- Mon Jul 26 11:48:28 CEST 2021 - ma@suse.de - Rephrase vendor conflict message in case 2 packages are involved (bsc#1187760) This covers the case where not the packages itself would change its vendor, but replaces a package from a different vendor. - Fix solver jobs for PTFs (bsc#1186503) - spec: switch to pkgconfig(openssl) - Show key fpr from signature when signature check fails (bsc#1187224) Rpm by default only shows the short key ID when checking the signature of a package fails. This patch reads the signatures from the RPM headers and replaces she short IDs with the key fingerprints fetched from the signatures. - Implement alternative single transaction commit strategy. This patch adds a experimental commit strategy that runs all operations in a single rpm transaction, speeding up the execution a lot. - Use ZYPP_MEDIANETWORK=1 to enable the experimental new media backend. - Implement zchunk download, refactor Downloader backend. - Fix purge-kernels fails with kernels from Kernel:HEAD (bsc#1187738) There recently was a change in the kernel package naming scheme in regards to rc kernels. Since kernel upstream uses characters in the version that are not allowed in rpm versions a "-rc" was previously replaced with ".rc" which broke sorting by version, to fix this issue it was replaced with "~rc", which unfortunately broke the purge-kernels logic. This patch makes sure purge-kernel does apply the same conversion. - version 17.28.0 (22) ------------------------------------------------------------------- Thu Jun 10 17:34:14 CEST 2021 - ma@suse.de - Enhance XML output of repo GPG options (fixes openSUSE/zypper#390) In addition to the effective values, add optional attributes showing the raw values actually present in the .repo file. (raw_gpgcheck, raw_repo_gpgcheck, raw_pkg_gpgcheck) - Link all executables with -pie (bsc#1186447) - Ship an empty /etc/zypp/needreboot per default (fixes #311, jsc#PM-2645) If packages want to trigger the reboot-needed hiint upon installation they may provide 'installhint(reboot-needed)'. Builtin packages triggering the hint without the provides are only kernel and kernel-firmware related. - Add Solvable::isBlacklisted as superset of retracted and ptf packages (bsc#1186503) - Fix segv if ZYPP_FULLOG is set (fixes #317) - version 17.27.0 (22) ------------------------------------------------------------------- Tue Jun 1 19:10:35 CEST 2021 - ma@suse.de - Work around download.o.o broken https redirects. - Allow trusted repos to add additional signing keys (bsc#1184326) Repositories signed with a trusted gpg key may import additional package signing keys. This is needed if different keys were used to sign the the packages shipped by the repository. - MediaCurl: Fix logging of redirects. - Use 15.3 resolver problem and solution texts on all distros. - $ZYPP_LOCK_TIMEOUT: Let negative values wait forever for the zypp lock (bsc#1184399) Helps boot time services like 'zypper purge-kernels' to wait for the zypp lock until other services using zypper have completed. - Fix purge-kernels is broken in Leap 15.3 (bsc#1185325) Leap 15.3 introduces a new kernel package called kernel-flavour-extra, which contain kmp's. Currently kmp's are detected by name ".*-kmp(-.*)?" but this does not work which those new packages. This patch fixes the problem by checking packages for kmod(*) and ksym(*) provides and only falls back to name checking if the package in question does not provide one of those. - Introduce zypp-runpurge, a tool to run purge-kernels on testcases. - version 17.26.0 (22) ------------------------------------------------------------------- Wed Apr 28 15:34:01 CEST 2021 - ma@suse.de - Properly handle permission denied when providing optional files (bsc#1185239) - Fix service detection with cgroupv2 (bsc#1184997) - version 17.25.10 (22) ------------------------------------------------------------------- Thu Apr 22 15:52:19 CEST 2021 - ma@suse.de - Add missing includes for GCC 11 (bsc#1181874) - Fix unsafe usage of static in media verifier. - Solver: Avoid segfault if no system is loaded (bsc#1183628) - MediaVerifier: Relax media set verification in case of a single not-volatile medium (bsc#1180851) - Do no cleanup in custom cache dirs (bsc#1182936) - ZConfig: let pubkeyCachePath follow repoCachePath. - version 17.25.9 (22) ------------------------------------------------------------------- Wed Feb 24 17:07:52 CET 2021 - ma@suse.de - Try to provide a mounted /proc in --root installs (bsc#1181328) Some systemd tools require /proc to be mounted and fail if it's not there. - Enable release packages to request a releaxed suse/opensuse vendorcheck in dup when migrating. (bsc#1182629) - version 17.25.8 (22) ------------------------------------------------------------------- Wed Feb 17 09:06:49 CET 2021 - ma@suse.de - Patch: Identify well-known category names (bsc#1179847) This allows to use the RH and SUSE patch categrory names synonymously: (recommendedi = bugfix) and (optional = feature = enhancement). - Add missing includes for GCC 11 compatibility. (bsc#1181874) - Fix %posttrans script execution (fixes #265) The scripts are execuable. No need to call them through 'sh -c'. - Commit: Fix rpmdb compat symlink in case rpm got removed. - Repo: Allow multiple baseurls specified on one line (fixes #285) - Regex: Fix memory leak and undefined behavior. - Add rpm buildrequires for test suite (fixes #279) - Use rpmdb2solv new -D switch to tell the location ob the rpmdatabase to use. - BuildRequires: libsolv-devel >= 0.7.17. - version 17.25.7 (22) ------------------------------------------------------------------- Tue Jan 12 19:34:03 CET 2021 - ma@suse.de - Rephrase solver problem descriptions (jsc#SLE-8482) - Adapt to changed gpg2/libgpgme behavior (bsc#1180721) - Multicurl backend breaks with with unknown filesize (fixes #277) - version 17.25.6 (22) ------------------------------------------------------------------- Fri Dec 11 16:52:54 CET 2020 - ma@suse.de - Fix lsof monitoring (bsc#1179909) - version 17.25.5 (22) ------------------------------------------------------------------- Thu Dec 3 17:06:35 CET 2020 - ma@suse.de - Prevent librpmDb iterator from accidentally creating an empty rpmdb in / (repoened bsc#1178910) - Fix update of gpg keys with elongated expire date (bsc#1179222) - needreboot: remove udev from the list (bsc#1179083) - Prefer /run over /var/run. - version 17.25.4 (22) ------------------------------------------------------------------- Fri Nov 27 10:17:50 CET 2020 - ma@suse.de - RepoManager: Carefully tidy up the caches. Remove non-directory entries. (bsc#1178966) - RpmDb: If no database exists use the _dbpath configured in rpm. Still makes sure a compat symlink at /var/lib/rpm exists in case the configures _dbpath is elsewhere. (bsc#1178910) - Url: Hide known password entries when writing the query part (bsc#1050625 bsc#1177583, CVE-2017-9271) - adapt testcase to change introduced by libsolv#402. - RepoManager: Force refresh if repo url has changed (bsc#1174016) - RepoInfo: ignore legacy type= in a .repo file and let RepoManager probe (bsc#1177427, Fixes openSUSE/zypper#357). - version 17.25.3 (22) ------------------------------------------------------------------- Wed Oct 7 12:05:33 CEST 2020 - ma@suse.de - Bump version to force rebuild against a fixed libsolv. (bsc#1177238, bsc#1177275) - version 17.25.2 (22) ------------------------------------------------------------------- Fri Sep 25 13:39:38 CEST 2020 - ma@suse.de - Fix bsc#1176902: When kernel-rt has been installed, the purge-kernels service fails during boot. - Use package name provides as group key in purge-kernel (bsc#1176740 bsc#1176192) kernel-default-base has new packaging, where the kernel uname -r does not reflect the full package version anymore. This patch adds additional logic to use the most generic/shortest edition each package provides with %{packagename}= to group the kernel packages instead of the rpm versions. This also changes how the keep-spec for specific versions is applied, instead of matching the package versions, each of the package name provides will be matched. - version 17.25.1 (22) ------------------------------------------------------------------- Fri Sep 18 16:45:49 CEST 2020 - ma@suse.de - RepoInfo: Return the type of the local metadata cache as fallback (bsc#1176435) - VendorAttr: Fix broken "suse,opensuse" equivalence handling. Enhance API and testcases. (bsc#1174918) - Update docs regarding 'opensuse' namepace matching. - New solver testcase format. - Link against libzsd to close libsolvs open references (as we link statically) - BuildRequires: libsolv-devel >= 0.7.15. - version 17.25.0 (22) ------------------------------------------------------------------- Fri Aug 28 17:09:59 CEST 2020 - ma@suse.de - VendorAttr: Const-correct API and let Target provide its settings (bsc#1174918) - Support buildnr with commit hash in purge-kernels (bsc#1175342) This adds special behaviour for when a kernel version has the rebuild counter before the kernel commit hash. - Improve Italian traslation of the "breaking dependencies" message (bsc#1173529) - Make sure reading from lsof does not block forever (bsc#1174240) - Just collect details for the signatures found (fixes #229) - version 17.24.2 (22) ------------------------------------------------------------------- Thu Jul 16 18:04:18 CEST 2020 - ma@suse.de - Fix bsc#1174011 auth=basic ignored in some cases (bsc#1174011) Proactively send credentials if the URL specifes '?auth=basic' and a username. - ZYPP_MEDIA_CURL_DEBUG: Strip credentials in header log (bsc#1174011) - version 17.24.1 (22) ------------------------------------------------------------------- Tue Jul 14 13:19:56 CEST 2020 - ma@suse.de - Completey rework the purge-kernels algorithm (fix bsc#1173106) The new code is closer to the original perl script, grouping the packages by name before applying the keep spec. - Set ZYPP_RPM_DEBUG=1 to capture verbose rpm command output (implements #228) - version 17.24.0 (22) ------------------------------------------------------------------- Fri Jun 26 14:13:10 CEST 2020 - ma@suse.de - Fix core dump with corrupted history file (bsc#1170801) - version 17.23.8 (22) ------------------------------------------------------------------- Tue Jun 23 17:44:21 CEST 2020 - ma@suse.de - Enable zchunk metadata download if libsolv supports it. - version 17.23.7 (22) ------------------------------------------------------------------- Thu Jun 4 11:45:03 CEST 2020 - ma@suse.de - Revert "Enable zchunk on SLE-15-SP2". - version 17.23.6 (22) ------------------------------------------------------------------- Wed May 27 18:50:32 CEST 2020 - ma@suse.de - Enable zchunk on SLE-15-SP2. - Older kernel-devel packages are not properly purged (bsc#1171224) - doc: enhance service plugin example. - version 17.23.5 (22) ------------------------------------------------------------------- Thu Apr 9 12:52:10 CEST 2020 - ma@suse.de - Get retracted patch status from updateinfo data (jsc#SLE-8770) libsolv injects the indicator provides into packages only. - remove 'using namespace std;' (bsc#1166610, fixes #218) - Online doc: add 'Hardware (modalias) dependencies' page (fixes #216) - version 17.23.4 (22) ------------------------------------------------------------------- Wed Mar 25 15:26:14 CET 2020 - ma@suse.de - Add HistoryLogReader actionFilter to parse only specific HistoryActionIDs. - version 17.23.3 (22) ------------------------------------------------------------------- Fri Mar 20 12:28:18 CET 2020 - ma@suse.de - RepoVariables: Add safe guard in case the caller does not own a zypp instance. - Enable c++17. Define libyzpp CXX_STANDARD in ZyppCommon.cmake. - version 17.23.2 (22) ------------------------------------------------------------------- Mon Mar 2 19:53:51 CET 2020 - ma@suse.de - Fix package status computation regarding unneeded, orphaned, recommended and suggested packages (broken in 17.23.0) (bsc#1165476) - version 17.23.1 (22) ------------------------------------------------------------------- Fri Feb 21 16:06:57 CET 2020 - ma@suse.de - Log patch status changes to history (jsc#SLE-5116) - Allow to disable all WebServer dependent tests when building. OBS wants to be able to get rid of the nginx/FastCGI-devel build requirement. Use 'rpmbuild --without mediabackend_tests' or 'cmake -DDISABLE_MEDIABACKEND_TESTS=1'. - version 17.23.0 (22) ------------------------------------------------------------------- Fri Feb 7 14:56:40 CET 2020 - ma@suse.de - update translations - Replace mongoose/webrick with nginx in test suite. This patch makes use of nginx to replace the current WebServer mongoose implementation. Also adds support for registering callback functions for certain URL requests via FCGI, making it possible to mock HTTP responses and test more complex HTTP setups. - boost: Fix deprecated auto_unit_test.hpp includes. - Disable zchunk on Leap-15.0 and SLE15-* while there is no libzck. - Fix decision whether to download ZCHUNK files. libzypp and libsolv must both be able to read the format. - version 17.22.1 (22) ------------------------------------------------------------------- Thu Jan 23 16:30:19 CET 2020 - ma@suse.de - yum::Downloader: Prefer zchunk compressed metadata if libvsolv supports it. - BuildRequires: libsolv-devel >= 0.7.11. - version 17.22.0 (22) ------------------------------------------------------------------- Mon Jan 20 12:53:12 CET 2020 - ma@suse.de - Selectable: Fix highestAvailableVersionObj if only retracted packages are available. Avoid using retracted items as candidate (jsc#SLE-8770) - version 17.21.0 (20) ------------------------------------------------------------------- Thu Dec 19 13:28:00 CET 2019 - ma@suse.de - BuildRequires: libsolv-devel >= 0.7.10. - RpmDb: Become rpmdb backend independent (jsc#SLE-7272) - RpmDb: Close API offering a custom rpmdb path It's actually not needed and for this to work also libsolv needs to support it. You can sill use a librpmDb::db_const_iterator to access a database at a custom location (ro). - Remove legacy rpmV3database conversion code. - version 17.20.0 (20) ------------------------------------------------------------------- Wed Dec 11 09:51:10 CET 2019 - ma@suse.de - MediaCurl: assert cookie file has mode 0600 (bsc#1158763, CVE-2019-18900) - version 17.19.0 (12) ------------------------------------------------------------------- Mon Dec 9 10:22:56 CET 2019 - ma@suse.de - dup: fix removing orphaned packages dropped by to-be-installed products (bsc#1155819) - version 17.18.1 (12) ------------------------------------------------------------------- Thu Dec 5 14:23:52 CET 2019 - ma@suse.de - Resolver: add solution actions for SOLVER_SOLUTION_BLACK (retracted/PTF) - Solvable: add isRetracted and isPtf attributes. - version 17.18.0 (12) ------------------------------------------------------------------- Thu Nov 28 18:20:04 CET 2019 - ma@suse.de - Introduce PurgeKernels class (bsc#1155198) Adds libzypp API to mark all obsolete kernels according to the existing purge-kernel script rules. - Add solver jobs for retracted packages and ptfs. Support for ptf packages and retract ed patches. - Do not enforce 'en' being in RequestedLocales (bsc#1155678) If the user decides to have a system without explicit language support he may do so. - Pass correct posttrans script argument (fixes #190) - BuildRequires: libsolv-devel >= 0.7.8. - version 17.17.0 (12) ------------------------------------------------------------------- Tue Oct 29 14:54:51 CET 2019 - ma@suse.de - Expose new libsolv API via C++ counterparts (openSUSE/zypper#214) - BuildRequires: libsolv-devel >= 0.7.7 - version 17.16.0 (12) ------------------------------------------------------------------- Fri Oct 18 17:20:08 CEST 2019 - ma@suse.de - Fix empty metalink downloads if filesize is unknown (bsc#1153557) - Recognize riscv64 as architecture - Fix installation of new header file (fixes #185) - zypp.conf: Introduce `solver.focus` to define the resolvers general attitude when resolving jobs. (bsc#1146415) - New container detection algorithm for zypper ps (bsc#1146947) - version 17.15.0 (12) ------------------------------------------------------------------- Thu Sep 26 14:08:51 CEST 2019 - ma@suse.de - Revert "Use CURL_HTTP_VERSION_2TLS if available" (bsc#1146027) - doc: add service example using variables - Fix build with rpm >= 4.15 (fixes #172) - version 17.14.1 (12) ------------------------------------------------------------------- Mon Aug 5 13:03:55 CEST 2019 - ma@suse.de - PublicKey::algoName: supply key algorithm and length - version 17.14.0 (12) ------------------------------------------------------------------- Thu Jul 25 17:25:10 CEST 2019 - ma@suse.de - MediaCurl: Fix leaking filedescriptors (bsc#1116995) - commit: Run file conflict check on dry-run (best with download-only) (bsc#1140039) - commit: do not remove orphan products if the .prod file is owned by a package (bsc#1139795) - version 17.13.0 (12) ------------------------------------------------------------------- Tue May 28 16:50:14 CEST 2019 - ma@suse.de - Drop unused InterProcessMutex class and test - Drop unused WebpinResult class and test - Give posttrans script a parameter of 0 (issue #168) - Use CURL_HTTP_VERSION_2TLS if available (fixes #141) - version 17.12.0 (12) ------------------------------------------------------------------- Thu Apr 4 13:24:40 CEST 2019 - ma@suse.de - Enhance scanning /sys for modaliases (bsc#1130161) - version 17.11.4 (9) ------------------------------------------------------------------- Tue Apr 2 18:15:12 CEST 2019 - ma@suse.de - Prevent SEGV if the application sets an empty TextLocale (bsc#1127026) ------------------------------------------------------------------- Mon Apr 1 08:49:45 UTC 2019 - Christophe Giboudeaux - Fix build with CMake >= 3.14.0: Starting with CMake 3.14, EXCLUDE_FROM_ALL now spreads from directories to targets. 'make -C someSubdir' when 'someSubdir' uses the 'EXCLUDE_FROM_ALL' keyword does nothing. (gh/libzypp#libzypp#165) ------------------------------------------------------------------- Thu Mar 21 12:35:39 CET 2019 - ma@suse.de - KeyManager: Work around bsc#1127220 [libgpgme] no error upon incomplete import due to signal received. - MediaCurl: add hint to check SCC for an expired regcode on http error 403 (bsc#965786) - version 17.11.3 (9) ------------------------------------------------------------------- Mon Feb 25 12:07:19 CET 2019 - ma@suse.de - Correctly handle exceptions when verifying the medium (bsc#1065022) - Only write type field when probing (bsc#1114908) - Don't blame user on TargetAbortedException (bsc#978193) - version 17.11.2 (9) ------------------------------------------------------------------- Thu Jan 31 17:41:21 CET 2019 - ma@suse.de - CheckAccessDeleted: Suppress reporting `/memfd:` pseudo files (bsc#1123843) - MediaCurl: improve reporting https->http redirection errors - Prevent SEGV if the application sets an empty TextLocale - Url: don't force printing an empty authority if the schema does not allow authority at all - Try to the missing rpmDB compat symlink in case the rpm package got deleted (bsc#1122471) - version 17.11.1 (9) ------------------------------------------------------------------- Fri Jan 11 10:24:33 CET 2019 - ma@suse.de - PoolItemBest: Optionally prefer not locked packages (for bsc#1113296) - ui::Selectable: add `hasLocks` to indicate a partially locked item (for bsc#1113296) - version 17.11.0 (9) ------------------------------------------------------------------- Tue Dec 18 14:01:19 CET 2018 - ma@suse.de - Simplify complex locks so zypper can display them (bsc#1112911) - version 17.10.3 (9) ------------------------------------------------------------------- Mon Dec 10 16:57:34 CET 2018 - ma@suse.de - commit: set `SYSTEMD_OFFLINE=1` during chrooted commits (bsc#1118758) - no-recommends: Nevertheless consider resolver namespaces (hardware, language,..supporting packages) (FATE#325513) - BuildRequires: libsolv-devel >= 0.7.2 (SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED) - Remove world-readable bit from /var/log/zypp (bsc#1099019) - version 17.10.2 (9) ------------------------------------------------------------------- Wed Nov 28 14:40:26 CET 2018 - ma@suse.de - Adapt to changes in upcoming Boost 1.69.0 - Do not fail service-refresh on a empty repoindex.xml (bnc#1116840) - version 17.10.1 (9) ------------------------------------------------------------------- Mon Nov 26 12:14:49 CET 2018 - ma@suse.de - str: recognize 'always' and 'never' as valid boolean strings - Fix needreboot code to use SolvableSpec parser (fate#326451) - SolvableSpec: Define a set of Solvables by ident and provides - version 17.10.0 (9) ------------------------------------------------------------------- Wed Nov 14 11:48:35 CET 2018 - ma@suse.de - Provide needreboot config files in /etc/zypp (fate#326451, fixes #140) - Need to fix soname due to libsolv ABI changes (bsc#1115341) - version 17.9.0 (9) ------------------------------------------------------------------- Mon Oct 29 12:20:40 CET 2018 - ma@suse.de - Adapt to changed type names in libsolv-0.7 - Package needreboot file (fate#326451) - Fix definitions of gettext macros (fixes #135) - version 17.8.1 (2) ------------------------------------------------------------------- Fri Oct 12 14:01:19 CEST 2018 - ma@suse.de - Add infrastructure to flag specific packages to trigger a reboot needed hint (fate#326451) - Adapt to libsolv: Drop support for REPOKEY_TYPE_U32 - Resolver: add setInr to request solving namespaces - ResolverNamespace: add No/AllResolverNamespaces constants - version 17.8.0 (2) ------------------------------------------------------------------- Mon Oct 1 14:04:15 CEST 2018 - ma@suse.de - Fix blocking wait for finished child process (bsc#1109877) - version 17.7.2 (2) ------------------------------------------------------------------- Fri Sep 28 14:38:01 CEST 2018 - ma@suse.de - Fix conversion of string and glob to regex when compiling queries (bsc#1099982, bsc#939392, bsc#556664) - version 17.7.1 (2) ------------------------------------------------------------------- Fri Sep 7 12:07:39 CEST 2018 - ma@suse.de - Drop type application due to poor metadata support (bsc#1100095, bsc#1104415) - version 17.7.0 (2) ------------------------------------------------------------------- Thu Sep 6 12:16:25 CEST 2018 - ma@suse.de - Automatically fetch repository signing key from gpgkey url (bsc#1088037) - lsof: use '-K i' if lsof supports it (bsc#1099847,bsc#1036304) - version 17.6.4 (2) ------------------------------------------------------------------- Thu Aug 30 16:44:56 CEST 2018 - ma@suse.de - Check for not imported keys after multi key import from rpmdb (bsc#1096217) - version 17.6.3 (2) ------------------------------------------------------------------- Tue Aug 21 18:46:35 CEST 2018 - ma@suse.de - fixup! Add filesize check for downloads with known size (bsc#408814) Fix detetction of metalink downloads and prevent aborting if a metalink file is larger than the expected data file. - version 17.6.2 (2) ------------------------------------------------------------------- Fri Aug 17 14:52:14 CEST 2018 - ma@suse.de - Adapt to changes in libgpgme11-11.1.0 breaking the signature verification (bsc#1100427) - Use %license (bsc#1082318) - BuildRequires: libsolv-devel >= 0.6.35 (for bsc#1100095) - changes: add CVE numbers - version 17.6.1 (2) ------------------------------------------------------------------- Fri Aug 3 11:11:25 CEST 2018 - ma@suse.de - RepoInfo::provideKey: add report telling where we look for missing keys. - Support listing gpgkey URLs in repo files (bsc#1088037) - Add new report to request user approval for importing a package key - Handle http error 502 Bad Gateway in curl backend (bsc #1070851) (fixes openSUSE/zypper#177) - Add filesize check for downloads with known size (bsc#408814) - Removed superfluous space in translation (bsc#1102019) - version 17.6.0 (2) ------------------------------------------------------------------- Thu Jul 19 12:57:21 CEST 2018 - ma@suse.de - Prevent the system from sleeping during a commit (fixes openSUSE/zypper#135) - RepoManager: Explicitly request repo2solv to generate application pseudo packages. - version 17.5.2 (2) ------------------------------------------------------------------- Wed Jul 18 10:55:49 CEST 2018 - ma@suse.de - libzypp-devel should not require cmake (bsc#1101349) - Avoid zombies from ExternalProgram - Update ApiConfig - fix typo - version 17.5.1 (2) ------------------------------------------------------------------- Mon Jul 9 14:43:15 CEST 2018 - ma@suse.de - HardLocksFile: Prevent against empty commit without Target having been been loaded (bsc#1096803) - lsof: use '-K i' if lsof supports it (bsc#1099847) - PackageProvider: Validate deta rpms before caching (bsc#1091624, bsc#1088705, CVE-2018-7685) - PackageProvider: Validate downloaded rpm package signatures before caching (bsc#1091624, bsc#1088705, CVE-2018-7685) - version 17.5.0 (2) ------------------------------------------------------------------- Mon Jun 25 10:48:55 CEST 2018 - ma@suse.de - Flags: make it std=c++14 ready - Replace 'redhat-release' with generic 'system-release' (#120) - Ignore /var, /tmp and /proc in zypper ps (bsc#1096617) - Show GPGME version in log - version 17.4.0 (2) ------------------------------------------------------------------- Thu Apr 26 18:07:11 CEST 2018 - ma@suse.de - Avoid zombie tar processes (bsc#1076192) - Replace the terminology 'uninstallable' with 'not installable' (bsc#1029392) - version 17.3.1 (2) ------------------------------------------------------------------- Mon Apr 9 13:11:50 CEST 2018 - ma@suse.de - Show progressbar when running posttrans scripts - Execute service plugin script chrooted to the RepoManagers root (bsc#1080693) - Make sure the product file comes from /etc/products.d for the fallback product search (bsc#1086602) - Introduce ZConfig::repoManagerRoot to support having diverging target and repomanager root paths - Rename `stderr` as it can be a macro (fixes #102) - version 17.3.0 (2) ------------------------------------------------------------------- Tue Mar 13 18:03:42 CET 2018 - ma@suse.de - Protect code against broken translations (bsc#1082711) - Fix broken translated format strings - Deprecate the use of asciidoc for new releases - version 17.2.2 (2) ------------------------------------------------------------------- Wed Mar 7 11:22:02 CET 2018 - ma@suse.de - PoolQuery::addDependency add overload to define an individual Match::Mode (bsc#1043166) - version 17.2.1 (2) ------------------------------------------------------------------- Thu Mar 1 17:46:39 CET 2018 - bzeller@suse.de - Add /var/lib/gdm to CheckAccessDeleted blacklist (bsc#1079991) - Use gpgme instead of calling gpg2 binary directly - Fix leak in Digest.cc (bsc#1075978) - version 17.2.0 (2) ------------------------------------------------------------------- Tue Feb 20 18:03:24 CET 2018 - ma@suse.de - RpmDb::checkPackage: fix parsing localized rpm output (bsc#1076415) - Replace libexpat with libxml - Fix libzypp tests failing with `-Wp,-D_GLIBCXX_ASSERTIONS` compiler flag (fixes #84) - BuildRequire gpg2 as testcases need it (fixes #84) - version 17.1.3 (0) ------------------------------------------------------------------- Fri Feb 2 16:07:08 CET 2018 - ma@suse.de - Fix crash when installing broken rpm packages (bsc#1078284) - Testcase: Minor fix writing update testcases - version 17.1.2 (0) ------------------------------------------------------------------- Mon Jan 15 17:01:33 CET 2018 - ma@suse.de - Adapt rpm package verification to changes in rpm-4.14 (bsc#1076018) - version 17.1.1 (0) ------------------------------------------------------------------- Thu Jan 4 17:49:06 CET 2018 - ma@suse.de - plugin: don't reject header values containing a ':' (bsc#1074687) - Locks: Don't store duplicate locks (bsc#969569) - version 17.1.0 (0) ------------------------------------------------------------------- Wed Dec 6 13:29:42 CET 2017 - ma@suse.de - Fix default for solver.allowNameChange (bsc#1071466) - version 17.0.5 (0) ------------------------------------------------------------------- Mon Dec 4 11:09:24 CET 2017 - ma@suse.de - Stop BuildRequire dropped boost-devel (bsc#1062782) - version 17.0.4 (0) ------------------------------------------------------------------- Tue Nov 28 18:21:51 CET 2017 - ma@suse.de - When importing multiple keys, export the individual keys ascii armored for import into the rpmdb (bsc#1069381) - version 17.0.3 (0) ------------------------------------------------------------------- Thu Nov 23 12:33:51 CET 2017 - ma@suse.de - Don't filter procs with a different mnt namespace (bsc#1068708) - Support repo variables in an URIs host:port component (bsc#1057640, bsc#1067605) - version 17.0.2 (0) ------------------------------------------------------------------- Fri Nov 10 15:25:20 CET 2017 - ma@suse.de - Solvable: fix inconsistent retrieval of mediaNr (bsc#1065677) - version 17.0.1 (0) ------------------------------------------------------------------- Tue Nov 7 16:14:31 CET 2017 - ma@suse.de - Locale: Fix possible segfault (bsc#1064999) - RpmDb: Remove excess keys in the zypp keyring when exporting keys only (bsc#1064380) - KeyRing: Fix deleted keys not removed from rpmdb too (bsc#1064380) - Flag gpg keycache dirty when adding/removing keys (bsc#1064380) - Version 17.x for CODE-15, 16.x. is continued on SuSE-SLE-12-SP2-Branch - version 17.0.0 (0) ------------------------------------------------------------------- Thu Oct 12 18:04:38 CEST 2017 - ma@suse.de - Fix media handling in presence of a repo path prefix (bsc#1062561) - version 16.17.3 (0) ------------------------------------------------------------------- Wed Oct 11 16:29:48 CEST 2017 - ma@suse.de - Fix RepoProvideFile ignoring a repo path prefix (bsc#1062561) - version 16.17.2 (0) ------------------------------------------------------------------- Fri Sep 22 12:16:34 CEST 2017 - ma@suse.de - Default to 'solver.dupAllowVendorChange = false' on SLE15 (FATE#323478) - Remove unused legacy notify-message script (bsc#1058783) - version 16.17.1 (0) ------------------------------------------------------------------- Fri Sep 8 18:05:30 CEST 2017 - ma@suse.de - Support multiple product licenses in repomd (FATE#322276) - version 16.17.0 (0) ------------------------------------------------------------------- Thu Sep 7 12:27:44 CEST 2017 - ma@suse.de - Propagate 'rpm --import' errors (bsc#1057188) - Fix typos in zypp.conf - version 16.16.0 (0) ------------------------------------------------------------------- Mon Aug 28 16:05:36 CEST 2017 - ma@suse.de - Add testcase to compile (bsc#1055920) - version 16.15.6 (0) ------------------------------------------------------------------- Fri Aug 25 14:08:43 CEST 2017 - ma@suse.de - Adapt to work with GnuPG 2.1.23 (bsc#1054088) - version 16.15.5 (0) ------------------------------------------------------------------- Fri Aug 25 12:51:43 CEST 2017 - ma@suse.de - verifyFileSignature: Support signing with subkeys (bsc#1008325) - PublicKey: Scan and provide subkey information. - Enhance sort order for media.1/products (bsc#1054671) - Drop detection and support for rpm-4.4 (fixes #77) - version 16.15.4 (0) ------------------------------------------------------------------- Fri Aug 11 15:29:40 CEST 2017 - ma@suse.de - RepoInfo: add enum GpgCheck for convenient gpgcheck mode handling (bsc#1045735) - Fix repo/pkg checks to follow explicitly defined gpgcheck in a .repo file - version 16.15.3 (0) ------------------------------------------------------------------- Fri Jul 21 13:26:48 CEST 2017 - ma@suse.de - Weaken fix for bsc#1038984 if 'gpgcheck=0' in libzypp-16.15.x only. This will allow some already released products to adapt to the behavioral changes introduced by fixing bsc#1038984, while systems with a default configuration (gpgcheck=1) already benefit from the fix in libzypp-16.15.x. For details see section 'Signature checking' in /etc/zypp/zypp.conf. - Fix gpg-pubkey release (creation time) computation (bsc#1036659) - update lsof blacklist (bsc#1046417) - version 16.15.2 (0) ------------------------------------------------------------------- Tue Jul 18 13:18:16 CEST 2017 - ma@suse.de - Be sure bad packages do not stay in the cache (bsc#1045735, CVE-2017-9269) - version 16.15.1 (0) ------------------------------------------------------------------- Mon Jul 17 16:38:14 CEST 2017 - ma@suse.de - PackageProvider: enforce a signed package if pkgGpgCheckIsMandatory - Add RpmDb::checkPackageSignature to report unsigned packages - Fix repo gpg check workflows, mainly for unsigned repos and packages (bsc#1045735, bsc#1038984, CVE-2017-7435, CVE-2017-7436, CVE-2017-9269) - version 16.15.0 (0) ------------------------------------------------------------------- Wed Jul 12 17:06:14 CEST 2017 - ma@suse.de - repo refresh: Re-probe if the repository type changes (bsc#1048315) - MediaCurl: Propagate proper error code to DownloadProgressReport (bsc#1047785) - Allow to trigger an appdata refresh unconditionally (bsc#1009745) - Support custom repo variables defined in /etc/zypp/vars.d (fixes #68) - rename: handle EXDEV error on OverlayFS - version 16.14.0 (0) ------------------------------------------------------------------- Fri Jun 30 14:25:29 CEST 2017 - ma@suse.de - Adapt loop mounting of iso images (bsc#1038132, bsc#1033236) - Adjust zypp.conf for openSUSE Tumbleweed (bsc#1031756) - Change arch variable names conflicting with compiler macros (fixes #70) - Fix potential crash if repo has no baseurl (bnc#1043218) - version 16.13.0 (0) ------------------------------------------------------------------- Wed May 31 11:49:07 CEST 2017 - ma@suse.de - Testcase: add missing solver flags (bsc#1041889) - version 16.12.0 (0) ------------------------------------------------------------------- Fri May 12 11:36:52 CEST 2017 - ma@suse.de - add identIsAutoInstalled convenience methods - make gcc6 happy - version 16.11.0 (0) ------------------------------------------------------------------- Thu May 11 15:23:28 CEST 2017 - ma@suse.de - Use a common workflow for downloading packages and srcpackages. This includes a common way of handling and reposrting gpg signature and checks. (bsc#1037210) - PackageProvider: as well support downloading SrcPackage (for bsc#1037210) - version 16.10.0 (0) ------------------------------------------------------------------- Thu Apr 27 16:03:32 CEST 2017 - ma@suse.de - PoolQuery: Treat explicit queries for 'kind:name' correctly (bsc#1035729) - version 16.9.0 (0) ------------------------------------------------------------------- Fri Apr 21 16:23:51 CEST 2017 - ma@suse.de - Add API to control resolver job to update all packages (FATE#320653) - Remove legacy vendor equivalence between 'suse' and 'opensuse' (bsc#1030686) - version 16.8.0 (0) ------------------------------------------------------------------- Fri Apr 21 09:40:32 CEST 2017 - ma@suse.de - RepoInfo: Allow temporary repos to control their metadata directories (bsc#1032632) - Arch: add armv5tl - version 16.7.0 (0) ------------------------------------------------------------------- Thu Mar 30 15:00:30 CEST 2017 - ma@suse.de - Recognize license tarball in rpmmd repos (FATE#316159) - Fix media verification to properly propagate media access errors (bsc#1031093) - version 16.6.1 (0) ------------------------------------------------------------------- Mon Mar 27 17:10:52 CEST 2017 - ma@suse.de - Fix invalidation of PoolItems if Pool IDs are reused (bsc#1028661) - version 16.6.0 (0) ------------------------------------------------------------------- Mon Mar 27 09:33:26 CEST 2017 - ma@suse.de - Fix X-libcurl-Empty-Header-Workaround (bsc#1030919) - version 16.5.2 (0) ------------------------------------------------------------------- Tue Mar 21 13:38:08 CET 2017 - ma@suse.de - MediaCurl: Treat http response 410(Gone) like 404(Not Found) (bsc#1030136) - version 16.5.1 (0) ------------------------------------------------------------------- Thu Mar 16 14:06:03 CET 2017 - ma@suse.de - Support multi-volume repomd repositories (FATE#320544) - MediaCurl: ZYPP_MEDIA_CURL_IPRESOLVE=<4|6> to force name resolution to IPv4/IPv6 only (fixes openSUSE/zypper#49) - Add support for openssl >= 1.1 - version 16.5.0 (0) ------------------------------------------------------------------- Mon Feb 20 10:10:43 CET 2017 - ma@suse.de - PublicKey: Create tmpdirs inside ZYpp::tmpPath (bsc#926844) - Don't create AnonymousUniqueId in chroot (bsc#1024741) - version 16.4.3 (0) ------------------------------------------------------------------- Tue Feb 14 12:07:14 CET 2017 - ma@suse.de - dumpAsXmlOnL: xml escape node content (bsc#1024909) - version 16.4.2 (0) ------------------------------------------------------------------- Fri Feb 3 13:40:04 CET 2017 - ma@suse.de - MediaMultiCurl: Trigger aliveCallback when downloading metalink files (bsc#1021291) - version 16.4.1 (0) ------------------------------------------------------------------- Thu Jan 26 13:03:37 CET 2017 - ma@suse.de - Add API for updating the AutoInstalled db - MediaCD: Fix mountpoint creation after failing udf mount (bsc#1022046) - fix misleading indentation (fixes #65) - Fix compilation error reported by GCC7 (#63). - Prefer calling "repo2solv" rather than "repo2solv.sh" - version 16.4.0 (0) ------------------------------------------------------------------- Wed Dec 14 12:24:23 CET 2016 - ma@suse.de - Don't raise FileCheckException if user accepted a package with wrong digest (bsc#1014265) - Also provide the exception history when requesting a media failed (bsc#1010952) - version 16.3.2 (0) ------------------------------------------------------------------- Tue Oct 11 18:04:18 CEST 2016 - ma@suse.de - Let 'dup --from' leave an updateTestcase- in /var/log (bsc#1004096) - version 16.3.1 (0) ------------------------------------------------------------------- Tue Oct 11 11:41:47 CEST 2016 - ma@suse.de - RepoInfo: Allow parsing multiple gpgkey= URLs (bsc#1003748) - version 16.3.0 (0) ------------------------------------------------------------------- Tue Sep 20 11:41:48 CEST 2016 - ma@suse.de - guessPackageSpec: Don't break globbing (fixes openSUSE/zypper#97) - version 16.2.5 (0) ------------------------------------------------------------------- Thu Sep 15 15:27:15 CEST 2016 - ma@suse.de - RepoFileReader: fix parsing of multiline url entries (bsc#964932) - Allow repo type 'rpm' as alias for 'rpm-md' (fixes openSUSE/zypper#100) - version 16.2.4 (0) ------------------------------------------------------------------- Fri Sep 9 16:43:30 CEST 2016 - ma@suse.de - xmlout::Node: Allow adding nore attributes while the start node is not closed (FATE#320699) - Fixes broken XML output introduced by an unwanted change in 16.2.2 (bsc#998344) - version 16.2.3 (0) ------------------------------------------------------------------- Wed Aug 10 17:10:41 CEST 2016 - ma@suse.de - Report numeric curl error if code is unrecognized (bsc#992302) - multicurl: propagate proxy settings stored in repo url (bsc#933839) - version 16.2.2 (0) ------------------------------------------------------------------- Thu Jul 21 13:09:33 CEST 2016 - ma@suse.de - Rebuild .solv-files not matching the parsers LIBSOLV_TOOLVERSION - BuildRequires: libsolv-devel >= 0.6.23 - version 16.2.1 (0) ------------------------------------------------------------------- Mon Jul 18 16:36:25 CEST 2016 - ma@suse.de - Product: Offer tri-state hasEndOfLife details (FATE#320699) - version 16.2.0 (0) ------------------------------------------------------------------- Thu Jul 14 19:02:57 CEST 2016 - ma@suse.de - use more user friendly command names for "zypper ps" (bsc#980541) - version 16.1.3 (0) ------------------------------------------------------------------- Thu Jul 14 15:39:03 CEST 2016 - ma@suse.de - Don't do media number substitution on URLs of medium #1 (bsc#798470) - version 16.1.2 (0) ------------------------------------------------------------------- Tue Jul 5 11:39:11 CEST 2016 - ma@suse.de - Fix Shrink pool if all repos are removed (bsc#899755, bsc#987573) - version 16.1.1 (0) ------------------------------------------------------------------- Fri Jun 24 12:33:29 CEST 2016 - ma@suse.de - API enahncements for zypper (FATE#320447) - version 16.1.0 (0) ------------------------------------------------------------------- Tue Jun 21 11:11:03 CEST 2016 - ma@suse.de - Filter duplicate resolver solutions (bsc#985674) - zypp.conf: Add download.media_mountdir: Path where media are preferably mounted or downloaded (FATE#319462) - version 16.0.5 (0) ------------------------------------------------------------------- Wed Jun 15 12:36:27 CEST 2016 - ma@suse.de - Fix bug in removeRepository which may keep an empty .repo file rather than deleting it (bsc#984494) - version 16.0.4 (0) ------------------------------------------------------------------- Mon Jun 13 12:53:03 CEST 2016 - ma@suse.de - Shrink pool if all repos are removed (bnc#899755) - Avoid direct BuildRequire on libudev-devel (#60) - version 16.0.3 (0) ------------------------------------------------------------------- Tue Jun 7 18:43:31 CEST 2016 - ma@suse.de - Allow PackageKit to drop the zypp lock (bnc#899755) - Avoid superfluous rebuilding of indices when solving - version 16.0.2 (0) ------------------------------------------------------------------- Sun Jun 5 16:12:42 CEST 2016 - ma@suse.de - po: upadte makefiles - DefaultIntegral: provide asString (for FATE#320447) - version 16.0.1 (0) ------------------------------------------------------------------- Fri May 13 08:45:53 CEST 2016 - ma@suse.de - Prepare cmake to maintain the .pot and .po files in git. Add initial .po file set derived from tarballs. Translations are now maintained via Weblate. - Provide 'libzypp(plugin:services) = 1' after fixing bsc#933760 - Bump major version for Factory, 15.x is continued on SuSE-SLE-12-SP1-Branch - version 16.0.0 (0) ------------------------------------------------------------------- Thu Apr 28 14:17:09 CEST 2016 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Apr 28 14:04:36 CEST 2016 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Apr 25 14:59:41 CEST 2016 - ma@suse.de - Fix credential file parser losing entries with known URL but different user name (bsc#933760) - RepoManager: allow extraction of multiple baseurls for service repos (bsc#964932) - addRepository: fix to use the correct history file for logging - specfile: add /etc/zypp/credentials.d to the file list - version 15.22.0 (19) ------------------------------------------------------------------- Mon Apr 18 15:03:13 CEST 2016 - ma@suse.de - RepoindexFileReader: fix service metadata TTL default value (bsc#967828) - version 15.21.7 (19) ------------------------------------------------------------------- Fri Apr 15 11:31:08 CEST 2016 - ma@suse.de - DiskUsageCounter: Limit estimated waste per file (bsc#974275) - version 15.21.6 (19) ------------------------------------------------------------------- Fri Mar 18 13:37:22 CET 2016 - ma@suse.de - Use PluginExecutor for commit- and system-hooks (bnc#971637) - BuildRequires: libsolv-devel >= 0.6.19 (bnc#971018) - version 15.21.5 (19) ------------------------------------------------------------------- Sun Mar 13 01:13:08 CET 2016 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Mar 10 01:13:24 CET 2016 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Mar 1 12:34:53 CET 2016 - ma@suse.de - media: Send stats header to download.opensuse.org only (bsc#955801) - fix build-compare (#57, #58) - version 15.21.4 (19) ------------------------------------------------------------------- Thu Feb 18 18:38:52 CET 2016 - ma@suse.de - yum::Downloader: Download only wanted 'susedata.LANG' files (FATE#320518) - version 15.21.3 (19) ------------------------------------------------------------------- Thu Feb 4 16:38:14 CET 2016 - ma@suse.de - installSrcPackage: trigger progress callback (bsc#580902) - version 15.21.2 (19) ------------------------------------------------------------------- Thu Feb 4 01:13:31 CET 2016 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Jan 29 11:40:51 CET 2016 - ma@suse.de - Don't buildrequire graphviz-gnome (bsc#964150) - Unwanted btrfs subvolumes must be filtered by device (not fsid) (fixes #54) - version 15.21.1 (19) ------------------------------------------------------------------- Thu Jan 21 01:13:29 CET 2016 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Jan 20 17:12:42 CET 2016 - ma@suse.de - Filter unwanted btrfs subvolumes (fixes #54, closes #55, bnc#949945) - RepoInfo: Provide access to repo content keywords - Build with boost-1.60.0 - version 15.21.0 (19) ------------------------------------------------------------------- Thu Jan 14 01:13:17 CET 2016 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jan 7 01:13:28 CET 2016 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Dec 24 01:13:13 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Dec 11 19:07:09 CET 2015 - ma@suse.de - ResPoolProxy: make begin/end pairs Iterable - String: Format and FormatNAC classes based on boost::format - DefaultIntegral: provide initial value - More specific exception message if GPG binary is missing (bsc#637791) - version 15.20.0 (19) ------------------------------------------------------------------- Thu Dec 10 01:14:50 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Dec 3 01:13:11 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Nov 22 01:13:29 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Nov 19 01:16:03 CET 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Nov 19 01:13:40 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Nov 16 12:27:02 CET 2015 - ma@suse.de - createPot: Fix plural form detection (bsc#955053) - version 15.19.7 (19) ------------------------------------------------------------------- Thu Nov 12 01:13:26 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Nov 8 01:13:11 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Nov 6 11:08:46 CET 2015 - ma@suse.de - Add testcase for uncached repo-variables. - Fixed Japanese translations (bsc#949196) - version 15.19.6 (19) ------------------------------------------------------------------- Fri Nov 6 10:56:44 CET 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Nov 5 01:15:12 CET 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Nov 5 01:13:24 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Nov 3 10:52:01 CET 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Nov 3 10:51:43 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Oct 23 17:10:18 CEST 2015 - ma@suse.de - Fix broken product: <-> -release package relation (bnc#951782) - version 15.19.5 (19) ------------------------------------------------------------------- Thu Oct 22 12:23:29 CEST 2015 - ma@suse.de - Use a uniform translation set for SLE and openSUSE (bnc#948924) - fix Plugin-services not updating repo GPGCheck settings (bnc#951402) - version 15.19.4 (19) ------------------------------------------------------------------- Sun Oct 18 01:13:27 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Oct 15 01:13:57 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Oct 14 16:36:27 CEST 2015 - ma@suse.de - make Solvable::asUserString more readable (bnc#949957) - version 15.19.3 (19) ------------------------------------------------------------------- Sun Oct 11 01:13:12 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Oct 8 01:14:43 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Oct 7 13:11:48 CEST 2015 - ma@suse.de - fix suse_version test (bsc#949046) - version 15.19.2 (19) ------------------------------------------------------------------- Wed Oct 7 11:06:24 CEST 2015 - ma@suse.de - Locks: fix using namespaces (for FATE#318299) - version 15.19.1 (19) ------------------------------------------------------------------- Mon Oct 5 12:27:49 CEST 2015 - ma@suse.de - fix reserved identifier violation (fixes #51) - solver: speed up collecting pool data to build the job queue - doc: short abstract about 'Code 12 Application Metadata' - version 15.19.0 (19) ------------------------------------------------------------------- Tue Sep 29 17:51:48 CEST 2015 - ma@suse.de - solver verify: multiversion property needs to be assigned to installed items too. - ZYppCommitResult: add attemptToModify to indicate an attempt to actually install/remove was made (bsc#946750, FATE#319467) - version 15.18.0 (14) ------------------------------------------------------------------- Mon Sep 28 12:19:26 CEST 2015 - ma@suse.de - SetTracker: fix computation of change sets (bsc#946898) - version 15.17.2 (14) ------------------------------------------------------------------- Fri Sep 25 11:42:28 CEST 2015 - ma@suse.de - Pattern: support dynamic computation of pattern visibility (bsc#900769) - Avoid URL rewrite if probing local cache directories (bsc#946129) - version 15.17.1 (14) ------------------------------------------------------------------- Mon Sep 21 16:57:45 CEST 2015 - ma@suse.de - Dummy (FATE#318827) to make Sles-changelog-checker stop whining. - version 15.17.0 (14) ------------------------------------------------------------------- Mon Sep 21 16:09:50 CEST 2015 - ma@suse.de - Glob: fix reserved identifier violation - version 15.16.2 (14) ------------------------------------------------------------------- Tue Sep 15 15:02:45 CEST 2015 - ma@suse.de - CheckAccessDeleted: Identify services by systemd cgroup (FATE#318827) - version 15.16.1 (14) ------------------------------------------------------------------- Mon Sep 14 12:21:30 CEST 2015 - ma@suse.de - Reload multiversion setting from the target zypp.conf (bnc#906096) - version 15.16.0 (14) ------------------------------------------------------------------- Sun Sep 13 01:15:26 CEST 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Sep 13 01:13:30 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 10 01:16:00 CEST 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Sep 4 13:49:33 CEST 2015 - ma@suse.de - Don't cache repo releasever (bnc#943563) - Selectable: allow setPickStatus for non-multiversion packages (bnc#943870) - ResPoolProxy: add ScopedSaveState - version 15.15.0 (14) ------------------------------------------------------------------- Tue Sep 1 18:19:27 CEST 2015 - ma@suse.de - zypp.conf: add solver.dupAllow{Downgrade,NameChange,ArchChange, VendorChange} default options for tuning distribution upgrades. - Remove obsolete method (bsc#941398) (fixes #50) - fix invalid XML (bnc#942518) - version 15.14.0 (14) ------------------------------------------------------------------- Sun Aug 30 01:13:07 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 27 01:14:20 CEST 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 20 01:13:09 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Aug 16 01:13:23 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 13 18:16:52 CEST 2015 - ma@suse.de - Support caching of service metadata. A TTL for the service metadata may be provided in the repoindex.xml itself. The default is 'no caching'. (FATE#318136) - Fix setting dup_allow* solver options (bnc#941463) - Don't make zypper encode {} around repo vars (bnc#941453) - version 15.13.0 (11) ------------------------------------------------------------------- Thu Aug 13 01:13:43 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Aug 11 18:48:57 CEST 2015 - ma@suse.de - History: Add 'command' tag showing who triggered the commit. The corresponding HistoryLogData class for parsing is HistoryLogDataStampCommand. Available data are the commandline executed, user@hostname and userdata/transactionID. (FATE#312298) - Add convenience comparison PoolItem<>ResObject::constPtr - Fixes for SWIG 2.x - version 15.12.0 (11) ------------------------------------------------------------------- Mon Aug 10 16:22:06 CEST 2015 - ma@suse.de - Make multiversion an individual solvables property (FATE#318778) - SolvableType: common api to access solvable properties - Support for MIPS architectures - version 15.11.0 (11) ------------------------------------------------------------------- Sun Aug 9 01:13:24 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Aug 2 01:13:27 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 30 16:13:49 CEST 2015 - ma@suse.de - Resolver: Track changed requested locales and adjust installed packages accordingly. (part of FATE#318099) - Testcase: Store autoinstalled packages - Locale: Make it IdString based - Get rid of std::tr1:: hashes - Flags: Fix to work with 'enum class' - Hide away resolver internals - version 15.10.0 (10) ------------------------------------------------------------------- Thu Jul 30 01:13:30 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Jul 28 14:14:54 CEST 2015 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Jul 27 09:30:38 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Jul 26 01:13:37 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 16 01:13:33 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Jul 12 01:13:20 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 9 16:43:12 CEST 2015 - ma@suse.de - Resolver allow tuning DUP mode solver flags (FATE#319128) - version 15.9.0 (5) ------------------------------------------------------------------- Fri Jul 3 08:23:04 CEST 2015 - ma@suse.de - Flags: add stringify - add asString for Patch::InteractiveFlag - version 15.8.0 (5) ------------------------------------------------------------------- Thu Jul 2 01:13:24 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Jul 1 14:00:42 CEST 2015 - ma@suse.de - add asString for Patch::Category - version 15.7.0 (5) ------------------------------------------------------------------- Mon Jun 29 17:43:00 CEST 2015 - ma@suse.de - Fix lost pathname when importing repo keys (bnc#936373) - Disable code swig does not understand - version 15.6.0 (5) ------------------------------------------------------------------- Sat Jun 27 17:07:32 CEST 2015 - ma@suse.de - Patch: fixup testing Category and Severity flags (FATE#318760) - version 15.5.0 (5) ------------------------------------------------------------------- Fri Jun 12 12:14:04 CEST 2015 - ma@suse.de - Add details to the default signature verification problem report - PathInfo: Avoid ExternalProgram in clean_dir - call rpmdb2solv without executing user-supplied scripts (bnc#926853) - version 15.4.1 (3) ------------------------------------------------------------------- Thu Jun 11 01:13:31 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jun 4 01:13:22 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Jun 3 13:00:59 CEST 2015 - ma@suse.de - Enhance solv.idx file handling to support zypper bash completion - Fix SSL client certificate authentication via URL option ssl_clientcert/ssl_clientkey (bnc#932393) - version 15.4.0 (3) ------------------------------------------------------------------- Thu May 28 01:13:23 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun May 24 18:17:38 CEST 2015 - ma@suse.de - Downloader: Accept unsigned repository if pkgGpgCheck is ON. - FindFileConflicts: avoid nested exception on user abort (bnc#931601) - Support for *.check files in the systemCheck.d directory (#45) - version 15.3.0 (3) ------------------------------------------------------------------- Sun May 24 01:13:19 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon May 18 10:46:10 CEST 2015 - ma@suse.de - zypp.conf: Add config values for gpgcheck, repo_gpgcheck and pkg_gpgcheck. The default behavior 'gpgcheck=On' will automatically turn on the gpg signature check for packages downloaded from repository with unsigned metadata. If the repo metadata are signed, a faster comparison via checksums is done. By explicitly setting repo_gpgcheck or pkg_gpgcheck you can enforce the signature check of repository metadata or downloaded packages to be always performed. Those defaults can be overwritten per repository. (FATE#314603) - version 15.2.0 (2) ------------------------------------------------------------------- Wed May 13 14:04:04 CEST 2015 - ma@suse.de - Write solv.idx to speed up bash tab completion (bnc#928650) - version 15.1.3 (1) ------------------------------------------------------------------- Fri May 8 11:44:44 CEST 2015 - ma@suse.de - gcc5 fixes - Fix repo alias containing ']' not handled correctly (bnc#929528) - Fix SEGV when dumping rpm header with epoch (bnc#929483) - version 15.1.2 (1) ------------------------------------------------------------------- Mon Apr 27 14:43:53 CEST 2015 - ma@suse.de - PubliKey: fix reference to temporary data - version 15.1.1 (1) ------------------------------------------------------------------- Thu Apr 23 01:13:15 CEST 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Apr 22 10:50:00 CEST 2015 - ma@suse.de - ZYpp: Changed ZYpp::Ptr to be a shared_ptr; a precondition for fixing bnc-899755 - rpmmd: support 'metalink=' in .repo (for zypper#63) - RepoMirrorList: ignore comments and malformed urls in mirrorlist - PathInfo: remove minor/major conflicting with GNU libc macros DiskUsageCounter: remove ctors taking 'magic' bool flags ZyppCallbacks: remove unused PatchDownload callbacks - version 15.1.0 (1) ------------------------------------------------------------------- Thu Apr 2 19:06:56 CEST 2015 - ma@suse.de - POODLE: libzypp should only talk TLS (bnc#903405) - Bump major version for Factory, 14.x is continued on SuSE-SLE-12-Branch - version 15.0.0 (0) ------------------------------------------------------------------- Thu Apr 2 16:01:43 CEST 2015 - ma@suse.de - Fixes to build with gcc5 - RepoProvideFile: Suppress MediaChangeReport while testing multiple baseurls (bnc#899510) - version 14.38.1 (30) ------------------------------------------------------------------- Thu Mar 19 16:44:39 CET 2015 - ma@suse.de - Suppress MediaChangeReport while testing multiple baseurls (bnc#899510) - version 14.38.0 (30) ------------------------------------------------------------------- Mon Mar 16 14:05:28 CET 2015 - ma@suse.de - add support for SHA224/384/512 - version 14.37.1 (30) ------------------------------------------------------------------- Wed Mar 11 09:22:46 CET 2015 - ma@suse.de - New RepoVarExpand: Functor expanding repo variables in a string . Supports bash style default ${v:-w}' and alternate ${v:+w} values (FATE#318354) - Easy.h: Use __typeof__ rather than typeof in header - Support repo variable replacement in service url - Support repo variable replacement in gpg url - Gettext.h: Fallback to ::gettext if accidentally included outside libzypp - version 14.37.0 (30) ------------------------------------------------------------------- Sun Feb 22 01:13:12 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Feb 19 01:13:13 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Feb 15 01:13:28 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Feb 12 01:13:34 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Feb 9 16:05:38 CET 2015 - ma@suse.de - Don't execute scripts in /tmp or /var/tmp, as they could be mounted noexec for security reasons (bnc#915928) - zypp/PublicKey.cc: Use GPG_BINARY from KeyRing - Support $releasever_major/$releasever_minor repo variables (FATE#318354) - version 14.36.0 (30) ------------------------------------------------------------------- Sun Feb 8 01:13:14 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Feb 5 01:13:27 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Feb 1 01:13:10 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jan 29 01:13:12 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jan 22 01:13:36 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Jan 21 10:28:49 CET 2015 - ma@suse.de - PathInfo: Deprecate major/minor in favor of new devMajor/devMinor. The old names clash with GNU libc macros. - version 14.35.0 (30) ------------------------------------------------------------------- Sun Jan 18 01:13:09 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jan 15 01:13:12 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Jan 12 15:04:17 CET 2015 - ma@suse.de - Properly propagate repo variables in service refresh. - Let $ZYPP_REPO_RELEASEVER overwrite $releasever in .repo files (bnc#911658) - Call pool_set_rootdir to properly check for file conflicts. - Use xgettext --boost to support boost-format (%N%) - version 14.34.0 (30) ------------------------------------------------------------------- Sun Jan 11 01:13:15 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jan 8 01:13:23 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jan 1 01:13:29 CET 2015 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Dec 21 01:13:33 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Dec 19 10:05:00 CET 2014 - ma@suse.de - Parse and offer productRegisterFlavor attribute (bnc#896224) - version 14.33.0 (30) ------------------------------------------------------------------- Thu Dec 18 01:13:20 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Dec 17 18:44:26 CET 2014 - ma@suse.de - Improve conflict message for locked packages (bnc#828631) - Fix broken de-escaping in str::splitEscaped (bnc#909772) - cleanup loging - version 14.32.2 (30) ------------------------------------------------------------------- Fri Dec 12 14:00:01 CET 2014 - ma@suse.de - CheckAccessDeleted: Filter PIDs running in a container (bnc#909143) - version 14.32.1 (30) ------------------------------------------------------------------- Wed Dec 10 16:06:04 CET 2014 - ma@suse.de - suppress informal license (no need to accept) upon update (bnc#908976) - version 14.32.0 (30) ------------------------------------------------------------------- Mon Dec 8 14:53:00 CET 2014 - ma@suse.de - Adapt to gpg-2.1 (bnc#908135) - rpm: do not obsolete yast2-packagemanager-devel by libzypp-devel-doc - replaceAll: fix endless loop on empty search string - version 14.31.0 (30) ------------------------------------------------------------------- Thu Nov 27 07:40:30 UTC 2014 - dimstar@opensuse.org - Do not provide/obsolete yast2-packagemanager-devel by the -doc package: the -devel package already does that. - Minor .spec cleanup (remove Authors section). ------------------------------------------------------------------- Tue Nov 11 17:09:28 CET 2014 - ma@suse.de - Call rpm with '--noglob' (bnc#892431) - Downloader: unify workflow downloading a (signed) master index file - Fix iostream includes (fixes #34) - Explicitly call libsolv:pool_setdisttype (fixes #36) - version 14.30.2 (30) ------------------------------------------------------------------- Sun Nov 9 01:13:17 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Nov 2 01:14:10 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Oct 27 11:38:00 CET 2014 - ma@suse.de - doc: add hint to code 12 pattern packages - MediaCurl: Fix URL path concatenation (bnc#901590) - Move doxygen html doc to libzypp-devel-doc (bnc#901691) - Remove non-breaking spaces from changes file - Control lifetime of downloaded mirrorlist - version 14.30.1 (30) ------------------------------------------------------------------- Thu Oct 16 11:03:11 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Oct 15 15:07:09 CEST 2014 - ma@suse.de - Store baseurls in list as order expresses preference - Support parsing multiple baseurls from a repo file (bnc#899510) - Fix handling local mirrorlist= files in .repo (bnc#899510) - Provide missing man pages (fixes #33) - Enable building autodocs, translations and test per default on debian - Fix several typos in output messages and comments (fixes #29) - Make the include dir path configurable (fixes #27) - version 14.30.0 (30) ------------------------------------------------------------------- Fri Oct 10 16:01:31 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 (bnc#899603) ------------------------------------------------------------------- Thu Oct 9 01:13:15 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Oct 5 01:14:42 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Sep 28 01:13:30 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 25 17:59:06 CEST 2014 - ma@suse.de - Trigger appdata plugin when system repos have changed (bnc#866257) - Protect against race when destructing globals - BuildRequire libsolv-tools as libsolv-devel no longer does - version 14.29.4 (29) ------------------------------------------------------------------- Thu Sep 25 01:15:42 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Sep 23 17:07:45 CEST 2014 - ma@suse.de - Fix computation of userinstalled items (bnc#897404) - version 14.29.3 (29) ------------------------------------------------------------------- Tue Sep 23 10:55:08 CEST 2014 - ma@suse.de - Adapt to API changes in rpm.4.12 - SLE-12 (suse_version 1315) uses it's own translations set (bnc#897176) - version 14.29.2 (29) ------------------------------------------------------------------- Sun Sep 21 01:13:25 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 18 15:47:50 CEST 2014 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 18 15:47:34 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 18 15:46:11 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Sep 17 13:18:23 CEST 2014 - ma@suse.de - adjust BuildRequires - version 14.29.1 (29) ------------------------------------------------------------------- Tue Sep 16 10:45:39 CEST 2014 - ma@suse.de - DiskUsageCounter: Set growonly on detetcted snapshotting btrfs partitions (bnc#896176) - DiskUsageCounter: Allow MountPoint to store fstype - DiskUsageCounter: Support setting 'growonly' partition hint (bnc#896176) - version 14.29.0 (29) ------------------------------------------------------------------- Fri Sep 5 12:46:57 CEST 2014 - ma@suse.de - Make Repository::isUpdateRepo also check for being referenced by products (bnc#892579) - Report repositories skipped as nonroot due to insufficient permission (bnc#893260) - version 14.28.0 (28) ------------------------------------------------------------------- Thu Sep 4 01:14:34 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Aug 29 14:46:25 CEST 2014 - ma@suse.de - PackageProvider: consider toplevel cache if --root or --pkg-cachedir is used. - Cleanup orpahned cache dirs only at zypp.conf default locations (bnc#891515) - Remove orphaned package caches on refresh (bnc#888919) - version 14.27.2 (27) ------------------------------------------------------------------- Sun Aug 24 01:16:00 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Aug 18 14:01:06 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 31 19:22:56 CEST 2014 - ma@suse.de - Fix gpg key creation/modification date computation to properly update trusted keys stored in the rpm database. - version 14.27.1 (27) ------------------------------------------------------------------- Mon Jul 28 11:32:40 CEST 2014 - mls@suse.de - reverted last commit to make yast2-pkg-bindings build again ------------------------------------------------------------------- Fri Jul 25 12:56:17 CEST 2014 - ma@suse.de - JobReport: extend callback to allow passing UserData - hardlinkCopy must not fail if proc/sys/fs/protected_hardlink is on - adapt to changed boost::error_category throw specifier - version 14.27.0 (27) ------------------------------------------------------------------- Fri Jul 18 08:57:39 CEST 2014 - ma@suse.de - Execute install scripts with cwd==/ (bnc#886764) - fix wrong '//' when extending URLs with an empty path (bnc#885254) - version 14.26.1 (26) ------------------------------------------------------------------- Mon Jul 14 17:46:14 CEST 2014 - ma@suse.de - refreshService: add option to force repo status reset - Strip local filenames and args from URL. - version 14.26.0 (26) ------------------------------------------------------------------- Fri Jul 11 13:42:43 CEST 2014 - ma@suse.de - Support RepoInfo content keywords (FATE#316287) - fix parsing repomd.xml twice - version 14.25.0 (23) ------------------------------------------------------------------- Wed Jun 11 07:36:48 CEST 2014 - ma@suse.de - Patch: add isCategory/isSeverity convenience - If available provide info in ServiceException - version 14.24.0 (23) ------------------------------------------------------------------- Wed Jun 4 11:49:32 CEST 2014 - ma@suse.de - Cleanup orphanded service repos on the fly (bnc#649846) - Service refresh must not attempt to modify plugin services - version 14.23.0 (23) ------------------------------------------------------------------- Wed May 28 13:41:22 CEST 2014 - ma@suse.de - Fix service methods to throw ServiceException, not RepoException. - version 14.22.0 (22) ------------------------------------------------------------------- Tue May 27 16:31:21 CEST 2014 - ma@suse.de - Let ServiceRefresh en-/disable repos with respect to previous state and user modifications. - RepoindexFileReader: support variable substitution - Parse optional autorefresh attribute from repoindex.xml - version 14.21.0 (20) ------------------------------------------------------------------- Wed May 14 13:52:38 CEST 2014 - ma@suse.de - Add DownloadResolvableReport::infoInCache - Adjust transfer timeout settings (bnc#877405) - Fix computation of update candidate (bnc#834858) - version 14.20.0 (20) ------------------------------------------------------------------- Thu May 8 18:54:25 CEST 2014 - ma@suse.de - KeyRingReport: New infoVerify callback showing the trusted key that will be used for verification. - version 14.19.0 (19) ------------------------------------------------------------------- Sun May 4 01:15:49 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 1 01:15:38 CEST 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Apr 28 15:34:44 CEST 2014 - ma@suse.de - Derive initial AutoInstalled file from history - Target: maintain AutoInstalled database file - version 14.18.0 (17) ------------------------------------------------------------------- Tue Apr 15 17:03:30 CEST 2014 - ma@suse.de - Factor out CommitPackageCache for standalone usage. (Fate#317077) - version 14.17.5 (17) ------------------------------------------------------------------- Fri Apr 11 16:16:11 CEST 2014 - ma@suse.de - history: log %posttrans errors and output - adapt to libsolv cannges - version 14.17.4 (17) ------------------------------------------------------------------- Fri Apr 4 14:29:13 CEST 2014 - ma@suse.de - Log warning if baseproduct symlink is dangling or missing - version 14.17.3 (17) ------------------------------------------------------------------- Thu Apr 3 19:18:48 CEST 2014 - ma@suse.de - RepoManager: Fix RepoStatus computation and refresh of PLAINDIR repos. - Recreate solv file caches if content may change even if raw metadata are unchanged (here: new pattern, product and application data). - version 14.17.2 (17) ------------------------------------------------------------------- Wed Apr 2 18:09:47 CEST 2014 - ma@suse.de - CpeId: Basic functionality incl. matching - New SetRelationMixin - version 14.17.1 (17) ------------------------------------------------------------------- Mon Mar 31 10:23:42 CEST 2014 - ma@suse.de - Use dummy licenses in test data (bnc#862471) - Install zypp-NameReqPrv helper for evaluating testcases. - version 14.17.0 (17) ------------------------------------------------------------------- Tue Mar 18 14:55:11 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Feb 26 15:06:06 CET 2014 - ma@suse.de - Ignore failed-eject-exception on media change (bnc#865705) - version 14.16.1 (16) ------------------------------------------------------------------- Tue Feb 25 13:42:13 CET 2014 - ma@suse.de - Remove duplicate code detecting known kinds and move it to ResKind::explicitBuiltin. - version 14.16.0 (16) ------------------------------------------------------------------- Sun Feb 23 21:52:55 CET 2014 - ma@suse.de - Optionally exclude suggested packages from pattern content (bnc#857671) - Fix pattern content for auto-pattens (bnc#864087) - Don't report missing filelists for non-packages (bnc#864314) - adapt to new rpm weak dependency tags - version 14.15.0 (15) ------------------------------------------------------------------- Fri Feb 14 13:51:46 CET 2014 - ma@suse.de - Provide ContentIdentifier of required update repositories in Product (Fate#316160) - Support CpeId in Repository and Product attributes (Fate#316160) - Add API for retrieving repository ContentRevision and ContentIdentifier (Fate#316160) - version 14.14.0 (14) ------------------------------------------------------------------- Thu Feb 13 10:28:24 CET 2014 - ma@suse.de - Adjust solver defaults to changed soft lock handling (bnc#863275) - Avoid confusing solver decisions by not storing soft locks (bnc#863275) - version 14.13.0 (13) ------------------------------------------------------------------- Tue Feb 11 21:22:58 CET 2014 - ma@suse.de - Add Product::endOfLife attribute (Fate#316172) - Let Product::shortName fallback to name. - Remove license text from test data (bnc#862471) - version 14.12.0 (12) ------------------------------------------------------------------- Sun Feb 2 01:13:59 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Jan 31 19:09:28 CET 2014 - ma@suse.de - Introduce new solvable kind: Application (as provided by appdata.xml) - version 14.11.0 (7) ------------------------------------------------------------------- Fri Jan 31 17:37:29 CET 2014 - ma@suse.de - String helper for printing indented text. - Offer translated names for dependency types. - version 14.10.0 (7) ------------------------------------------------------------------- Thu Jan 30 01:13:40 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Jan 29 10:28:16 CET 2014 - ma@suse.de - No fileconflict check if DownloadOnly. - version 14.9.0 (7) ------------------------------------------------------------------- Sat Jan 25 17:07:45 CET 2014 - ma@suse.de - Collect and execute %posttrans scripts delayed (Fate#313506) - BuildRequire libsolv implementing (Fate#309385) - version 14.8.0 (7) ------------------------------------------------------------------- Fri Jan 24 11:26:52 CET 2014 - ma@suse.de - Patterns are no longer pseudo installed (Fate#309385) - version 14.7.0 (7) ------------------------------------------------------------------- Fri Jan 24 08:41:13 CET 2014 - ma@suse.de - Check for file conflicts in commit (bnc#673720) - Add asUserSting: human readable (translated) string representation - Add file conflict detection during commit (bnc#673720) - Add Transaction::installedResult - version 14.6.0 (6) ------------------------------------------------------------------- Mon Jan 20 17:14:48 CET 2014 - ma@suse.de - Fix cleanup code removing the @System solv file. (bnc#853065) - Fix missing priority in RepoInfo::dumpAsXML (bnc#855845) - version 14.5.0 (4) ------------------------------------------------------------------- Tue Jan 14 18:38:49 CET 2014 - ma@suse.de - Improve ProgressData reporting. - Allow xml::escape directly dumping to a stream. - Add support for repo authentication using SSL client certificates (bnc#683914) - Enhance Queue to perform COW - fix documentation - version 14.4.0 (4) ------------------------------------------------------------------- Thu Jan 9 01:13:40 CET 2014 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Dec 13 19:36:34 CET 2013 - ma@suse.de - Polish DiskUsageCounter - Add Bitmap type (aka sat::Map) - Remove obsolete DiskUsage class - version 14.3.0 (3) ------------------------------------------------------------------- Thu Dec 12 18:01:18 CET 2013 - ma@suse.de - Fix disk usage computation for single packages (bnc#852943) - version 14.2.1 (2) ------------------------------------------------------------------- Wed Dec 4 12:54:30 UTC 2013 - jreidinger@suse.com - Drop package-manager script as it is already deprecated and packagekit usage in desktop invalidates it. If someone really need it, then place it to proper top level package which can decide what GUI is proper for given task. ------------------------------------------------------------------- Wed Nov 20 16:32:30 CET 2013 - ma@suse.de - Extend commit plugin to send the transaction list (Fate#316203) - Add base/Json.h: JSON encoder for e.g. sending data to plugins - Re-evaluate dropped packages list on upgrade, even if product remains unchanged (bnc#849251). - Add ppc64le architecture - Add m68k architecture - version 14.2.0 (2) ------------------------------------------------------------------- Fri Oct 25 14:21:31 CEST 2013 - ma@suse.de - Always properly initialize pool storage (bnc#846565) - version 14.1.1 (0) ------------------------------------------------------------------- Thu Oct 17 17:57:54 CEST 2013 - ma@suse.de - Add Package isCached and cachedLocation methods - fixed PluginFrame::hasKey - version 14.1.0 (0) ------------------------------------------------------------------- Thu Oct 10 01:13:48 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Oct 6 01:13:51 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Oct 3 01:14:59 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Oct 2 19:25:58 CEST 2013 - ma@suse.de - fix handling symlinks in export pathname on NFSv4 (bnc#804544) - Bump major version for Factory 13.1 is continued on SuSE-Code-13_1-Branch - version 14.0.0 (0) ------------------------------------------------------------------- Sun Sep 29 01:15:02 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Sep 22 01:14:26 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Sep 18 17:06:06 CEST 2013 - ma@suse.de - Allow multiversionSpec manipulation in ZConfig - Fix string hexdecoding - Avoid parsing gpg subkeys but still parse multiple keys - version 13.7.0 (6) ------------------------------------------------------------------- Sun Sep 15 01:14:55 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 12 01:15:29 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 5 01:13:43 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Sep 2 17:04:37 CEST 2013 - ma@suse.de - Avoid parsing gpg subkeys - Use explicit operator bool in TmpPath - Must keep legacy rpm level flag (bnc#838039) - version 13.6.0 (6) ------------------------------------------------------------------- Sun Sep 1 01:14:03 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 29 01:13:44 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Aug 27 19:10:37 CEST 2013 - ma@suse.de - remove deprecated methods - fix key expiry date parsing (bnc#828672) - Provide additional keys data in case the ASCII armored blob containes multiple keys - No rpmdb key import in readony mode (bnc#828672) - Fix rpmdb key import/export (bnc#828672) - Reduce amount of gpg calls when importing/exporting keys. - Add public accessible PublicKeyData/PublicKeyScanner classes - fix ASCII armored PublicKey parsing (bnc#828672) - fix typo (bnc#761985) - Fix multiversion update candidate to respect an installed objects arch and vendor (bnc#820444) - fix logfile truncation introduced by previous fix for (bnc#825490) - Swig can't handle move constructor - Workaround bnc#819354 by executing rpm in /. (bnc#827609) - Try to detect Arch_ppc64p7 (requires glibc-2.16: getauxval) - Fix file probing via tftp:// (bnc#803316) - Add armv7hl to armv6hl compat to be in sync with libsolv. - Support for armv6hl - version 13.5.0 (5) ------------------------------------------------------------------- Thu Aug 22 01:13:25 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Aug 18 01:13:20 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 15 01:13:27 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 8 01:13:27 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Aug 4 01:13:59 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 1 01:13:52 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 25 01:13:40 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 18 01:13:43 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Jul 14 01:13:38 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 11 01:13:49 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Jun 21 20:24:39 CEST 2013 - ma@suse.de - Fix testcases failing if local pathnames contain umlauts - Pathname: add move constructor and fix assign - Set logfile permission upon file creation only (bnc#825490) - Add arch ppc64p7 - version 13.4.0 (4) ------------------------------------------------------------------- Tue Jun 11 11:37:48 CEST 2013 - ma@suse.de - Speedup scanning for modaliases (bnc#824110) - version 13.3.0 (2) ------------------------------------------------------------------- Sun May 26 01:13:15 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 23 01:13:13 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 16 12:22:48 CEST 2013 - ma@suse.de - Remove deprecated old stuff (aria2 support, old InstallOrder, old History parser) - version 13.2.0 (2) ------------------------------------------------------------------- Thu May 16 01:13:47 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun May 12 01:13:39 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 9 01:13:54 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 2 11:07:52 CEST 2013 - ma@suse.de - Discourage using SafeBool in favor of explicit operator bool - version 13.1.0 (1) ------------------------------------------------------------------- Mon Apr 29 10:41:46 CEST 2013 - ma@suse.de - Testsuite: Workaround boost::thread being not header only since boost-1.50 (boost ticket 7085) - Adaptions to smart_pointer changes in boost-1.53; mainly introduce explicit operator bool; constructible and comparable with nullptr_t. - Bump major version for Factory 12.x is continued on SuSE-Code-12_3-Branch - version 13.0.0 (0) ------------------------------------------------------------------- Sun Apr 28 01:14:07 CEST 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Apr 5 14:26:35 CEST 2013 - ma@suse.de - added new fuction zypp::ZYpp::provideSrcPackage - Treat opensuse-education as separate vendor (bnc#812608) - AArch64 support - version 12.11.0 (0) ------------------------------------------------------------------- Wed Mar 27 12:31:17 CET 2013 - ma@suse.de - added tftp-support (bnc#803316) - version 12.10.1 (0) ------------------------------------------------------------------- Tue Mar 26 13:06:21 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Mar 21 01:13:45 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Mar 10 01:14:01 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Mar 7 14:13:42 CET 2013 - ma@suse.de - Adapt to libsolv dataiterator fixes (returning random data in some cases) - Require and adapt to changes in libsolv-0.3.0 - version 12.10.0 (0) ------------------------------------------------------------------- Thu Mar 7 01:13:25 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Mar 3 01:15:52 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Feb 27 08:41:18 CET 2013 - ma@suse.de - Rephrase error message if 'lsof' is not installed (bnc#694427) - version 12.9.0 (0) ------------------------------------------------------------------- Fri Feb 15 12:49:18 CET 2013 - ma@suse.de - Handle dangling update script symlinks in instsys. (bnc#803751) - version 12.8.1 (0) ------------------------------------------------------------------- Thu Feb 14 01:13:28 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Feb 7 01:16:50 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Feb 4 12:35:51 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Jan 22 11:06:55 CET 2013 - ma@suse.de - make multicurl suppress progress reports for the metalink download - work around libcurl bug that sometimes gives us old values in the progress callback - version 12.8.0 (0) ------------------------------------------------------------------- Fri Jan 18 14:07:50 CET 2013 - ma@suse.de - Reduce logging - MediaMultiCurl: throw AbortRequestException if aborted by user - version 12.7.0 (0) ------------------------------------------------------------------- Sun Jan 13 01:13:23 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Jan 6 01:13:17 CET 2013 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Dec 27 01:13:27 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Dec 17 13:31:15 CET 2012 - ma@suse.de - Add NamedValue<_Tp>: Simple value<>name mapping supporting aliases - Enable zypper to remove zypp locks without evaluating the query (bnc#792901) - Configure curl to "not fix the BEAST attack" (bnc#779177) - version 12.6.0 (0) ------------------------------------------------------------------- Sun Dec 16 01:13:16 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Dec 3 14:31:59 CET 2012 - ma@suse.de - HistoryLogReader: new HistoryLogData based API for parsing the new history file entries (fate#312521) The old HistoryItem based API is deprecated but will still be available for a while if you compile with -DWITH_DEPRECATED_HISTORYITEM_API. - Write userdata string to history log (fate#312521) - Add HistoryLogReader testcases - Adapt to libsolv 'medianr'-changes - version 12.5.0 (0) ------------------------------------------------------------------- Thu Nov 22 01:14:42 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Nov 18 01:13:44 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Nov 13 15:40:10 CET 2012 - ma@suse.de - Forward userdata string to commit plugins in BEGINPLUGIN (fate#312521) - Extend ZConfig to store a user defined string value (fate#312521) - Add SIGSEGV handler trying to log a stack trace - Add zypp::dumpBacktrace to dump current stack trace to a stream. - Use gettext plural handling (bnc#784666) - version 12.4.0 (0) ------------------------------------------------------------------- Sun Nov 4 01:13:21 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Oct 24 10:40:38 CEST 2012 - ma@suse.de - Add simple sysconfig::write (bnc#766598) - For installed products also filelists when trying to find the buddy (bnc#784900) - Provide information whether product license needs to be accepted. - version 12.3.0 (0) ------------------------------------------------------------------- Thu Oct 18 01:13:43 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Oct 7 01:13:41 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Oct 1 11:00:42 CEST 2012 - ma@suse.de - Enable multiversion kernel and set multiversion.kernels in /etc/zypp/zypp.conf to keep the latest, latest-1 and the running. - Fix typo (bnc#782801) - Relax evaluation of patch category tags (case insensitive) ------------------------------------------------------------------- Sun Sep 30 01:13:18 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Sep 16 01:14:34 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Sep 12 10:28:00 CEST 2012 - ma@suse.de - Add str::commonPrefix - version 12.2.0 (0) ------------------------------------------------------------------- Sun Sep 9 01:13:25 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Sep 5 11:56:54 CEST 2012 - gs@suse.de - Provide Target::reload() - version 12.1.0 (0) ------------------------------------------------------------------- Sun Aug 26 01:13:31 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 23 01:13:47 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Aug 19 01:14:11 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 16 01:13:43 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Aug 10 12:53:47 CEST 2012 - ma@suse.de - Implement $ZYPP_LOCK_TIMEOUT: number of seconds to wait for a zypplock becoming available (bnc#772965) - Unify update-scripts with same content(md5sum) (bnc#773575) - version 12.0.1 (0) ------------------------------------------------------------------- Thu Aug 9 01:15:12 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 2 11:55:00 CEST 2012 - ma@suse.de - set $ZYPP_IS_RUNNING during commit - Bump major version for Factory 11.x is continued on SuSE-Code-12_2-Branch - version 12.0.0 (0) ------------------------------------------------------------------- Thu Aug 2 01:14:11 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Aug 1 15:32:40 CEST 2012 - ma@suse.de - Fixed typo (bnc#773467) - Erase any old repo instance from pool when (re)loading from cache - filter zero sized devices in disk usage counter(bnc#769819) - fix isSoftLocked computation - fix possibly reporting timeout as "aborted by user" (bnc#665327) - do not fork the uuidgen program, use kernel interface instead - remove obsolete hicolor-icon-theme BuildRequires - version 11.7.0 (6) ------------------------------------------------------------------- Sun Jul 29 01:13:31 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 19 01:13:43 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Jul 1 01:13:31 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jun 28 01:14:27 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Jun 25 15:23:10 CEST 2012 - ma@suse.de - zypp.conf:servicesdir is ignored (bnc#765528) - allow libcurl to take proxy from environment iff proxy is not configured or disallowed (bnc#745404) - version 11.6.3 (6) ------------------------------------------------------------------- Sun Jun 24 01:14:32 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jun 14 01:13:35 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Jun 8 15:57:22 CEST 2012 - ma@suse.de - Adjust weaklock fix ------------------------------------------------------------------- Fri Jun 8 14:16:15 CEST 2012 - ma@suse.de - Fix processing of weak locks (bnc#749418, bnc#765164) - [valgrind] don't dereference if we may be past the end of the repositories. - add armv7hl workaround for Adrian - version 11.6.2 (6) ------------------------------------------------------------------- Sun Jun 3 01:14:09 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 31 10:07:37 UTC 2012 - dmacvicar@suse.com - fix an invalid read revealed by valgrind in RepositoryIterator::increment() ------------------------------------------------------------------- Sun May 20 01:13:30 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 17 01:15:25 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun May 13 01:14:15 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue May 8 13:39:22 CEST 2012 - ma@suse.de - Use ld version script to hide symbols outside zypp namespace (bnc#755324) - remove base/Deprecated.h (macros now in APIConfig.h) - Disribute Easy.h in APIConfig.h - Add APIConfig.h providing ZYPP_API and ZYPP_LOCAL macros - version 11.6.0 (6) ------------------------------------------------------------------- Fri May 4 11:18:17 CEST 2012 - ma@suse.de - build with gcc-4.7 (bnc#755324) - version 11.5.0 (5) ------------------------------------------------------------------- Wed Apr 25 18:50:20 CEST 2012 - ma@suse.de - Fix lost device info when mounting CD/DVD ------------------------------------------------------------------- Sun Apr 22 01:15:46 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Apr 19 10:19:05 CEST 2012 - ma@suse.de - Always consider (block) devices passed as url option (bnc#755815) ------------------------------------------------------------------- Thu Apr 19 01:14:57 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Apr 18 18:38:06 CEST 2012 - ma@suse.de - Fix install progress hopping back and forth - Try to create a missing destination dir before switching to tmp space (bnc#755239) ------------------------------------------------------------------- Mon Apr 16 14:52:35 CEST 2012 - ma@suse.de - ResStatus: add 'unneeded' bit (determined by solver) - Force using gcc-4.6 until it builds with 4.7 - Support multiversion definitions being read from files in /etc/zypp/multiversion.d. - Workaround doxygen SEGV and accept incomplete docs (until bnc#755402 is fixed) - Rename zypp::sat::AttrMatcher to zypp::StrMatcher (base/StrMatcher.h) - Support (source)package download by non-root user (bnc#755239) - Delay construction of ZYppGlobalLock until its actually needed (bnc#575096) - Fix buddy handling in solver results - Simplify Selectable::multiversionInstall - Don't cache defaultCandidate as it depends on solver::allowVendorChange flag (bnc#754286) - version 11.4.0 (4) ------------------------------------------------------------------- Tue Apr 10 12:11:37 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Apr 8 01:13:24 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Apr 5 01:16:21 CEST 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Mar 26 14:47:59 CEST 2012 - ma@suse.de - Cleanup orphaned media attach points (bnc#751221) - Show max support status if package is in multiple repos (bnc#735841) - Parse proxy user/pass from url (bnc#752497) - Add CMake option to disable libproxy usage and disable it on SLE. (bnc#752500) - version 11.3.0 (1) ------------------------------------------------------------------- Thu Mar 15 00:31:25 CET 2012 - ma@suse.de - Add API for patch severity (bnc#733723, FATE#312633) - version 11.2.0 (1) ------------------------------------------------------------------- Tue Mar 13 13:04:48 CET 2012 - ma@suse.de - Force libproxy into using "/etc/sysconfig/proxy" if it exists (bnc#679322) - Apply soft locks by name and not per package (bnc#749418) - version 11.1.1 (1) ------------------------------------------------------------------- Fri Feb 3 13:18:01 CET 2012 - ma@suse.de - Add Fetcher support for CHECKSUMS file (replaceing SHA1SUMS) (bnc#744302) - Build with -fvisibility-inlines-hidden - CheckAccessDeleted: avoid duplicate entries for the same PID (bnc#716972) - Correctly use user:pass directly embedded in a proxy url (bnc#740764) - new sat::Map - Libsolv (bit)Map wrapper. - always set splitprovides to true now that libsolv handles them better - version 11.1.0 (1) ------------------------------------------------------------------- Thu Feb 2 01:14:17 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Jan 29 01:14:28 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Jan 22 01:13:30 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Jan 10 18:31:41 CET 2012 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Dec 23 14:51:25 CET 2011 - ma@suse.de - Adapt Repository iteration to libsolv changes. - Add sat::Pool tests - Fix Flags<> api to be more consistent and add testcase. - Set min_curl_version 7.19.4 (bnc#735284) - Doc: add some words about 'Solver - Vendor protection' - version 11.0.0 (0) ------------------------------------------------------------------- Thu Dec 1 01:13:37 CET 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Nov 28 18:08:42 CET 2011 - ma@suse.de - Fix and optimize Pathname ctor and provide testcases (bnc#721128) - Open all file descriptors with O_CLOEXEC to avoid leaks and races - Some improvements to the services documentation - Fix RW_pointer comparison with underlying smart pointer type. - version 10.3.5 (3) ------------------------------------------------------------------- Sun Nov 27 01:13:10 CET 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Nov 17 01:13:15 CET 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Nov 11 13:38:42 CET 2011 - ma@suse.de - Try to find and use some CD/DVD device even if HAL/UDEV detection fails (bnc#724807) - Static initialization problem fixes (by Harald Fernengel) - version 10.3.4 (3) ------------------------------------------------------------------- Mon Nov 7 15:45:28 CET 2011 - ma@suse.de - Don't use proxy if disabled (bnc#696805) - version 10.3.3 (3) ------------------------------------------------------------------- Mon Nov 7 13:49:44 UTC 2011 - dimstar@opensuse.org - Add pkg-config BuildRequires: We fail to detect libproxy due to the missing pkg-config. Additionally, we have a .pc file ourselfes, which we do not get the provides for [bnc#696805] ------------------------------------------------------------------- Thu Nov 3 14:58:42 CET 2011 - ma@suse.de - Let RepoInfo::keepPackages properly default to FALSE (bnc#727385) - version 10.3.2 (3) ------------------------------------------------------------------- Thu Nov 3 01:13:12 CET 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Oct 30 01:14:41 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Oct 27 01:14:10 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Oct 24 13:35:56 CEST 2011 - ma@suse.de - Explicitly include textLocale in package translation download ------------------------------------------------------------------- Mon Oct 24 09:37:31 CEST 2011 - ma@suse.de - Update libversion info (due to ABI change in 10.2.0 (bnc#725407) - version 10.3.1 (3) ------------------------------------------------------------------- Sun Oct 23 01:13:11 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Oct 21 11:47:39 CEST 2011 - ma@suse.de - Add zypp.conf option repo.refresh.locales: A list of locales for which translated package descriptions should be downloaded if available. - Explixitly set CURLOPT_PROXYAUTH - version 10.3.0 (1) ------------------------------------------------------------------- Tue Oct 18 16:45:13 CEST 2011 - ma@suse.de - Add arch armv7tnhl and armv7thl - Fix RepoVariablesReplacer to compute substitution values on demand only - PathInfo::hardlinkCopy: fix handling cross-device links - version 10.2.0 (1) ------------------------------------------------------------------- Sun Oct 16 01:13:37 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Oct 13 11:50:26 CEST 2011 - ma@suse.de - Must not differ between type nfs and nfs4 when checking the mount table (bnc#710269) - version 10.1.1 (1) ------------------------------------------------------------------- Thu Oct 13 01:13:37 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Oct 11 15:20:43 CEST 2011 - ma@suse.de - Switch to using libsolv instead of satsolver - version 10.1.0 (1) ------------------------------------------------------------------- Sun Oct 9 01:13:16 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Oct 6 01:14:00 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Sep 20 09:57:04 CEST 2011 - ma@suse.de - Bump major version for Factory; 9.x is continued on SLE-11-SP2-Branch - version 10.0.0 (0) ------------------------------------------------------------------- Tue Sep 13 10:51:53 CEST 2011 - ma@suse.de - Enhance Selectable API - version 9.11.0 (8) ------------------------------------------------------------------- Sun Sep 11 01:18:59 CEST 2011 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Sep 11 01:13:12 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 8 01:19:28 CEST 2011 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 8 01:14:08 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Sep 7 12:38:23 CEST 2011 - ma@suse.de - Explicitly require rpm. - version 9.10.2 (8) ------------------------------------------------------------------- Sun Sep 4 01:16:54 CEST 2011 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Sep 4 01:13:27 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Sep 1 01:13:36 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Aug 29 10:51:04 CEST 2011 - ma@suse.de - Extend mount entry comparison fix (bnc#710269) - version 9.10.2 (8) ------------------------------------------------------------------- Thu Aug 25 01:17:06 CEST 2011 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Aug 22 13:57:16 CEST 2011 - ma@suse.de - Update sle-zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Aug 14 01:13:21 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Aug 7 01:16:07 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Aug 5 15:20:07 CEST 2011 - ma@suse.de - Attempt to fix smb mount entry comparison (bnc#710269) - version 9.10.1 (8) ------------------------------------------------------------------- Thu Aug 4 14:54:47 CEST 2011 - ma@suse.de - Allow to turn Resolvers upgrade mode on and off (bnc#709480) - Fix reading of integer arrays from rpm headers (bnc#709716) - version 9.10.0 (8) ------------------------------------------------------------------- Thu Aug 4 01:14:00 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jul 28 13:04:10 CEST 2011 - ma@suse.de - Evaluate CURLINFO_CONDITION_UNMET on zero sized successful transfers, if compiled against libcurl-7.19.4 or above. (bnc#692260) - version 9.9.2 (8) ------------------------------------------------------------------- Mon Jul 25 16:20:37 CEST 2011 - ma@suse.de - Always read /proc/mounts when looking for mounted media (bnc#705893) - version 9.9.1 (8) ------------------------------------------------------------------- Fri Jul 22 13:12:34 CEST 2011 - ma@suse.de - MediaUserAuth: Do not expose libcurl header files. - version 9.9.0 (8) ------------------------------------------------------------------- Mon Jul 18 11:33:25 CEST 2011 - ma@suse.de - More initialize parser structure fixes. (bnc#705181) - version 9.8.7 (8) ------------------------------------------------------------------- Fri Jul 15 15:15:01 CEST 2011 - ma@suse.de - Check for /etc/sysconfig/storage changes before solving (bnc#702365) - version 9.8.6 (8) ------------------------------------------------------------------- Fri Jul 15 13:58:53 CEST 2011 - ma@suse.de - Properly initialize parser structures (bnc#705181) - version 9.8.5 (8) ------------------------------------------------------------------- Thu Jul 7 15:53:17 CEST 2011 - ma@suse.de - Fix tests for available libcurl version. - version 9.8.4 (8) ------------------------------------------------------------------- Thu Jul 7 01:13:47 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Jul 4 10:41:42 CEST 2011 - ma@suse.de - Make fix for bnc#702576 more robust. - Enhance fix for bnc#699435. Return an error if download in advance failed to provide all packages, so zypper does not silently quit. - version 9.8.3 (8) ------------------------------------------------------------------- Thu Jun 30 01:13:43 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Jun 29 12:23:24 CEST 2011 - ma@suse.de - Always compute transaction from pool (bnc#702576) - version 9.8.2 (8) ------------------------------------------------------------------- Tue Jun 28 16:04:50 CEST 2011 - ma@suse.de - Add feature provides for supported plugins. ------------------------------------------------------------------- Tue Jun 21 10:44:47 CEST 2011 - dmacvicar@suse.de - Add configuration template for automatic kernel purge (feature#312018) to zypp.conf ------------------------------------------------------------------- Tue Jun 14 13:38:00 CEST 2011 - ma@suse.de - Fix download loop to skip non-install actions. (bnc#699435) - version 9.8.1 (8) ------------------------------------------------------------------- Sun Jun 12 01:13:36 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Jun 9 09:34:51 CEST 2011 - ma@suse.de - Fix missing return value. ------------------------------------------------------------------- Wed Jun 8 12:58:54 CEST 2011 - ma@suse.de - Simplify ZYppCommitResult by using filtered Transaction::action_iterator. - version 9.8.0 (8) ------------------------------------------------------------------- Tue Jun 7 14:12:35 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Jun 7 12:42:20 CEST 2011 - ma@suse.de - Fix transaction ORDER_BY_MEDIANR. - version 9.7.0 (5) ------------------------------------------------------------------- Fri Jun 3 23:12:05 CEST 2011 - ma@suse.de - Basic commit plugins implemented. They may be used to implement pre/post commit actions like taking file system snapshots (fate#303699) - version 9.6.0 (5) ------------------------------------------------------------------- Tue May 31 17:27:45 CEST 2011 - ma@suse.de - Do commit based on sat::Transaction. - version 9.5.0 (5) ------------------------------------------------------------------- Tue May 31 12:09:17 CEST 2011 - ma@suse.de - Assert rpm database directory is created before rpmtsInitDB is called (bnc#697115) ------------------------------------------------------------------- Tue May 31 11:46:57 CEST 2011 - dheidler@suse.de - fix var definition order in PackageProvider - fix operator~ return datatype for flags (ctor is explicit) - add method interactiveFlags to Patch describing what makes it interactive - version 9.4.0 (3) ------------------------------------------------------------------- Tue May 31 10:12:12 CEST 2011 - ma@suse.de - Recommend 'lsof' (for zypper ps) (bnc#694427, bnc#684466) ------------------------------------------------------------------- Mon May 30 17:14:14 CEST 2011 - dheidler@suse.de - Switch patch interactive-check to flags - version 9.3.0 (3) ------------------------------------------------------------------- Sun May 29 01:13:42 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri May 27 17:02:05 CEST 2011 - ma@suse.de - fix specfile to handle sles translations if available ------------------------------------------------------------------- Fri May 27 09:51:13 CEST 2011 - ma@suse.de - Avoid using #elifdef directive. ------------------------------------------------------------------- Thu May 26 01:13:43 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed May 25 09:22:28 CEST 2011 - ma@suse.de - Add a fallback gnome-packagekit updater in package-manager (bnc#667504) - Backport changelog entries from SLE11-SP1 branch. Bugs mentioned here were either fixed without bnc# or do not apply to this branch. This is to make the changelog checker happy: - Set proper defaults for service repos (bnc#673943) ------------------------------------------------------------------- Tue May 24 12:43:32 CEST 2011 - dheidler@suse.de - add option ignore_reboot_flag to Patch::interactive (bnc#665853) - version 9.2.0 (2) ------------------------------------------------------------------- Mon May 23 16:12:32 CEST 2011 - dheidler@suse.de - respect patch content license when determinating interactive status - version 9.1.2 (1) ------------------------------------------------------------------- Mon May 23 12:05:10 CEST 2011 - ma@suse.de - More rpm-4.9 fixes - Disable rpm V3toV4 conversion while not working with rpm 4.9 ------------------------------------------------------------------- Sun May 22 01:14:21 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri May 20 17:11:10 CEST 2011 - ma@suse.de - Fix for rpm-4.9 - version 9.1.1 (1) ------------------------------------------------------------------- Fri May 20 13:43:38 CEST 2011 - ma@suse.de - Disable use if rpm-4.4 legacy interface (dropped in 4.9) (bnc#691089) - Fix poolquery handling repo restrictions correctly. (bnc#661976) - version 9.1.0 (1) ------------------------------------------------------------------- Wed May 18 14:10:20 CEST 2011 - dmacvicar@suse.de - Allow MediaCD to build against HAL or nothing if udev is not present ------------------------------------------------------------------- Mon May 16 14:42:09 CEST 2011 - dmacvicar@suse.de - forward port all changes to make it build in Code10 ------------------------------------------------------------------- Mon May 16 11:51:51 UTC 2011 - dmacvicar@suse.de - make -Werror=format-security optional and used only if supported ------------------------------------------------------------------- Sun May 15 01:13:47 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu May 12 01:13:54 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri May 6 13:22:35 CEST 2011 - dheidler@suse.de - delete old metadata temp directories - version 9.0.3 (0) ------------------------------------------------------------------- Wed Apr 27 17:17:00 CEST 2011 - dheidler@suse.de - fix max_concurrent_connections option in MultiCurl (bnc#596089) - version 9.0.2 (0) ------------------------------------------------------------------- Sun Apr 17 01:13:40 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Apr 12 18:49:32 CEST 2011 - dheidler@suse.de - check for permissions before writing (fixes bnc#683509) - version 9.0.1 (0) ------------------------------------------------------------------- Tue Apr 5 12:08:27 CEST 2011 - ma@suse.de - Switch ResPoolProxy to use multimap in order to allow iteration of all Selectables of all kinds. - Add upper/lower_bound iteration to MapKVIterator. - Add stream output for multimap/set. - version 9.0.0 (0) ------------------------------------------------------------------- Mon Apr 4 15:08:08 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Apr 4 15:04:47 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Apr 4 15:03:55 CEST 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Mar 10 01:13:39 CET 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun Mar 6 01:13:41 CET 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Feb 16 14:24:27 UTC 2011 - dmacvicar@suse.de - Do not look for $releasever 's value if there is no variable in the url: parses product file again and again - version 8.12.2 (10) ------------------------------------------------------------------- Thu Feb 10 16:01:46 CET 2011 - ma@suse.de - Remove package-manager.desktop file (bnc#329635) - version 8.12.1 (10) ------------------------------------------------------------------- Tue Jan 25 10:09:22 CET 2011 - ma@suse.de - Apply patch introducing armv7nhl:armv7hl ------------------------------------------------------------------- Tue Jan 18 12:28:19 UTC 2011 - dmacvicar@suse.de - allow for Repo Index Services to set the enabled state of repositories from the server side. - Fix priority not being set on reading service indexes - version 8.12.0 (10) ------------------------------------------------------------------- Fri Jan 14 12:45:18 CET 2011 - ma@suse.de - Add new ServicePlugin Exceptions. ------------------------------------------------------------------- Thu Jan 13 01:13:32 CET 2011 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Dec 23 14:42:02 CET 2010 - dheidler@suse.de - add method to check if there are manually configured urls - version 8.11.0 (10) ------------------------------------------------------------------- Thu Dec 23 11:31:22 CET 2010 - dheidler@suse.de - create cache directory, if it doesn't exist when saving mirrorlist - version 8.10.6 (10) ------------------------------------------------------------------- Wed Dec 22 12:38:22 CET 2010 - dheidler@suse.de - moved keepPackages code to RepoInfo::Impl - version 8.10.5 (10) ------------------------------------------------------------------- Tue Dec 21 13:29:06 CET 2010 - dheidler@suse.de - Fix caching of mirrorlist files - version 8.10.4 (10) ------------------------------------------------------------------- Thu Dec 16 19:46:00 CET 2010 - ma@suse.de - Do not export keyring if rpmdb is initialised, but target isn't (bnc#659494) - version 8.10.3 (10) ------------------------------------------------------------------- Fri Dec 10 17:17:07 CET 2010 - dheidler@suse.de - Catch RPM-Exeption when instaling the Distribution (bnc#658714) - version 8.10.2 (10) ------------------------------------------------------------------- Wed Dec 8 14:15:12 CET 2010 - dheidler@suse.de - fix retrieval of distributionVersion if target is not initialized - MultiCurl: make sure the server responds with "partial content", fixes corrupt downloads if the metalink file contains no checksums - version 8.10.1 (10) ------------------------------------------------------------------- Wed Dec 1 17:39:16 CET 2010 - dheidler@suse.de - Added ReplacerVar caching in RepoInfo - Automaticly remove empty mirrorlist-files - version 8.10.0 (10) ------------------------------------------------------------------- Tue Nov 30 17:11:32 CET 2010 - dheidler@suse.de - Added MirrorList caching - version 8.9.0 (7) ------------------------------------------------------------------- Mon Nov 29 12:31:37 CET 2010 - ma@suse.de - Icons for libzypp should go into desktop-data. (bnc#329635) - version 8.8.2 (7) ------------------------------------------------------------------- Wed Nov 24 11:55:59 CET 2010 - ma@suse.de - Properly handle FTP response 550. (bnc#645747) - version 8.8.1 (7) ------------------------------------------------------------------- Fri Nov 19 11:24:39 CET 2010 - mls@suse.de - fix access of freed memory in MultiCurl (bnc#654600) ------------------------------------------------------------------- Sun Nov 7 01:13:39 CET 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Nov 3 16:06:46 CET 2010 - dheidler@suse.de - added metalink support - version 8.8.0 (7) ------------------------------------------------------------------- Thu Oct 21 18:15:31 CEST 2010 - ma@suse.de - Feed the ProvideFilePolicy progress callback in addition to any connected media::DownloadProgressReport (bnc#545106) - version 8.7.1 (7) ------------------------------------------------------------------- Wed Oct 13 16:14:13 CEST 2010 - dheidler@suse.de - Make MetaLinkParser accept InputStreams - Make MetaLinkParser accept Pathnames insted of strings - Fix MetaLinkv4 hash parsing - Add MetaLinkParser test - version 8.7.0 (7) ------------------------------------------------------------------- Mon Oct 11 17:06:17 CEST 2010 - ma@suse.de - Use timeouts in plugin script communication. - Fix ExternalProgram to correctly remember exit status. - version 8.6.0 (5) ------------------------------------------------------------------- Sun Oct 10 01:13:40 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Oct 8 08:43:02 UTC 2010 - dmacvicar@novell.com - fix services not being linked to their file after being saved ------------------------------------------------------------------- Thu Oct 7 09:02:26 CEST 2010 - jkupec@suse.cz - Don't use aria2c for FTP (bnc #641328) ------------------------------------------------------------------- Wed Oct 6 15:39:59 UTC 2010 - dmacvicar@novell.com - implementation for url resolver plugins - version 8.5.0 (5) ------------------------------------------------------------------- Wed Oct 6 16:54:15 CEST 2010 - dheidler@suse.de - Use DownloadInHeaps as default, when there is nothing configured and when the target root is set to "/". (bnc#591476) - version 8.4.0 (4) ------------------------------------------------------------------- Tue Sep 28 17:12:51 CEST 2010 - dheidler@suse.de - fixed replacing releasever (for fedora systems) - (bnc#637470) - version 8.3.0 (0) ------------------------------------------------------------------- Fri Sep 24 13:07:25 CEST 2010 - mls@suse.de - fix metalink4 parsing [bnc#641484] ------------------------------------------------------------------- Thu Sep 23 01:13:45 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Sep 20 15:31:31 UTC 2010 - dmacvicar@novell.com - Allow per repository proxy settings like yum does. Including setting it to _none_ overriding the system proxy. Patch from Zhang, Qiang - version 8.2.1 (0) ------------------------------------------------------------------- Fri Sep 10 17:06:34 CEST 2010 - dheidler@suse.de - fixed replacing basearch (for fedora systems) - (bnc#637473) - version 8.2.0 (0) ------------------------------------------------------------------- Fri Sep 10 11:57:29 CEST 2010 - ma@suse.de - Report download failures in commit result (bnc#431854) - Fix Solvable::onSystemByUser returning true for uninstalled solvables. - version 8.1.3 (0) ------------------------------------------------------------------- Tue Aug 31 20:01:26 CEST 2010 - ma@suse.de - Fix download-only not to omit source packages (bnc#635596) - version 8.1.2 (0) ------------------------------------------------------------------- Thu Aug 26 01:13:38 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Aug 13 12:33:26 UTC 2010 - dmacvicar@novell.com - fix basearch url variable - use the right release package name on fedora ------------------------------------------------------------------- Tue Aug 10 13:18:08 CEST 2010 - ma@suse.de - MediaDISK: Use blkid to verify disk volumes. (bnc#623226) - version 8.1.1 (0) ------------------------------------------------------------------- Sun Aug 8 01:13:37 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Thu Aug 5 01:13:53 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Aug 3 16:17:04 CEST 2010 - ma@suse.de - Fix memory leaks. ------------------------------------------------------------------- Mon Aug 2 11:58:57 CEST 2010 - ma@suse.de - Enhance PoolItem interface to assist patch classification. (bnc#627316) - version 8.1.0 (0) ------------------------------------------------------------------- Tue Jul 27 15:38:00 CEST 2010 - ma@suse.de - Fix bug in PoolQuery::addDependency - Disable MediaAria and enable MultiCurl as default http/ftp backend. MultiCurl implements MetaLink and Zsync support using libcurl. In case of trouble set ZYPP_MULTICURL=0 in the envirionment to disable the new backend. - version 8.0.1 (0) ------------------------------------------------------------------- Mon Jul 26 17:05:14 CEST 2010 - ma@suse.de - Bump heads major version after 11.3 branched away. - version 8.0.0 (0) ------------------------------------------------------------------- Thu Jul 22 01:13:27 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed Jul 7 13:56:49 CEST 2010 - ma@suse.de - Add PoolQuery for name, edition AND architecture in one go. (bnc#614362) - version 7.8.0 (6) ------------------------------------------------------------------- Mon Jul 5 13:03:57 CEST 2010 - ma@suse.de - Fix requirement to /usr/bin/uuidgen (bnc#613304) ------------------------------------------------------------------- Sun Jul 4 01:13:29 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue Jun 29 17:46:13 CEST 2010 - ma@suse.de - Fix CURLOPT_MAX_RECV_SPEED_LARGE expecting a curl_off_t argument. ------------------------------------------------------------------- Tue Jun 29 10:22:06 CEST 2010 - ma@suse.de - Respect zypp.conf policy settings when solving for update. ------------------------------------------------------------------- Fri Jun 25 11:35:52 CEST 2010 - ma@suse.de - Don't bloat logfile by logging install progess values. ------------------------------------------------------------------- Thu Jun 10 01:13:49 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Mon Jun 7 17:52:50 CEST 2010 - ma@suse.de - Add missing Date constant declarations. - version 7.7.5 (6) ------------------------------------------------------------------- Mon Jun 7 11:46:58 CEST 2010 - ma@suse.de - Prevent against daemons launched in rpm %post, that do not close their filedescriptors. Original fix was accidentally reverted. (bnc#174548) - version 7.7.4 (6) ------------------------------------------------------------------- Sun Jun 6 01:13:52 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri Jun 4 17:14:17 CEST 2010 - ma@suse.de - Fix default evaluation of recommendations of installed packages (bnc#605490) - version 7.7.3 (6) ------------------------------------------------------------------- Thu Jun 3 01:14:08 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri May 21 20:00:55 CEST 2010 - ma@suse.de - Fix broken IdStringType comparison (bnc#607572) - version 7.7.2 (6) ------------------------------------------------------------------- Thu May 20 21:01:05 CEST 2010 - ma@suse.de - Fix packages provided via delta rpm being placed in the wrong package cache (bnc#607583) - version 7.7.1 (6) ------------------------------------------------------------------- Thu May 20 01:13:49 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Tue May 18 18:02:44 CEST 2010 - ma@suse.de - Fix arch detection on sprac (bug #566291) - Arch: add sparc64v and sparcv9v and armv7l - RepoManager: refresh repo if last refresh is in the future (bnc#593617) - version 7.6.1 (6) ------------------------------------------------------------------- Mon May 17 15:25:14 CEST 2010 - ma@suse.de - Fix package-manager-su to support LXDE (Andrea Florio) (bnc#582235) - Cleanup spec file (Pavol Rusnak) - version 7.6.0 (6) ------------------------------------------------------------------- Sun May 16 01:13:39 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Wed May 12 19:09:54 CEST 2010 - ma@suse.de - Add methods to evaluate gpg geys expiration dates. - Export all rpmDb keys to the zypp trusted keyring in one go. - version 7.6.0 (6) ------------------------------------------------------------------- Wed May 12 17:35:44 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sun May 9 01:13:45 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Sat May 8 01:13:43 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 ------------------------------------------------------------------- Fri May 7 01:13:55 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 (Revision: 54959) ------------------------------------------------------------------- Wed May 5 14:49:39 CEST 2010 - ma@suse.de - Update zypp-po.tar.bz2 (Revision: 54959) ------------------------------------------------------------------- Tue May 4 01:13:43 CEST 2010 - ma@suse.de - Update translations. ------------------------------------------------------------------- Mon May 3 18:12:36 CEST 2010 - ma@suse.de - Improve solver.cleandepsOnRemove result by evaluating the install history to find packages installed on behalf of a user request (not auto added by the solver). - version 7.5.0 (5) ------------------------------------------------------------------- Sat May 1 01:13:43 CEST 2010 - ma@suse.de - Update translations. ------------------------------------------------------------------- Fri Apr 30 01:13:46 CEST 2010 - ma@suse.de - Update translations. ------------------------------------------------------------------- Thu Apr 29 17:10:29 CEST 2010 - ma@suse.de - Cleanup when deleting packages. New zypp.conf expert option solver.cleandepsOnRemove telling whether the solver should per default try to remove packages exclusively required by the ones he's asked to delete (default false). - Resolver::cleandepsOnRemove API to allow applications to change the solver option. - version 7.4.0 (4) ------------------------------------------------------------------- Thu Apr 29 01:13:40 CEST 2010 - ma@suse.de - Update translations. ------------------------------------------------------------------- Wed Apr 28 16:35:04 CEST 2010 - ma@suse.de - Enable splitprovides on update. ------------------------------------------------------------------- Wed Apr 28 01:13:37 CEST 2010 - ma@suse.de - Update translations. ------------------------------------------------------------------- Tue Apr 27 17:42:20 CEST 2010 - ma@suse.de - Selectable: Classify broken but locked patch as isUnwanted (bnc#577118) - version 7.3.0 (2) ------------------------------------------------------------------- Tue Apr 27 11:25:17 CEST 2010 - ma@suse.de - Use libudev to detect available cd/dvd devices (bnc#590707,fate#308980) - Fix specfile to BuildRequire libudev-devel. - version 7.2.0 (2) ------------------------------------------------------------------- Mon Apr 26 11:57:23 CEST 2010 - ma@suse.de - Support URLs and ISOs ending on 'Media1', 'Media2', etc., when rewiting the URL to access a specific media number. By now only nanmes ending on 'CD' or 'DVD' were supported. (bnc#594850) ------------------------------------------------------------------- Fri Apr 23 01:13:34 CEST 2010 - ma@suse.de - Update translations. ------------------------------------------------------------------- Wed Apr 21 01:13:38 CEST 2010 - ma@suse.de - Update translations. ------------------------------------------------------------------- Tue Apr 20 16:56:59 CEST 2010 - ma@suse.de - /etc/zypp/locks: Allow to specify edition ranges with solvable:name and dependencies. - version 7.1.1 (1) ------------------------------------------------------------------- Thu Apr 15 12:49:01 CEST 2010 - ma@suse.de - Provide name of the lock holder in ZYppFactoryException. (bnc#580513) - version 7.1.0 (1) ------------------------------------------------------------------- Wed Apr 14 15:09:18 CEST 2010 - ma@suse.de - Using boost-1.42 requires -fno-strict-aliasing (bnc#595545) - Bump major version for 11.3 development. - version 7.0.0 (0) ------------------------------------------------------------------- Tue Apr 13 14:36:31 CEST 2010 - ma@suse.de - Fix parsing port from IPv6 URL (bnc#593385) ------------------------------------------------------------------- Fri Mar 26 19:23:59 CET 2010 - ma@suse.de - Propagate ZConfig::setTextLocale to pool. (bnc#588850) - version 6.31.3 (31) ------------------------------------------------------------------- Fri Mar 26 13:50:08 CET 2010 - ma@suse.de - Fix guessing package spec to match package names only. (bnc#590864) - version 6.31.2 (31) ------------------------------------------------------------------- Tue Mar 23 16:55:56 CET 2010 - ma@suse.de - Add static Target::distributionLabel to return the baseproducts shortName and summary. Mainlu used for the bootloader menu. (bnc #586303) - version 6.31.1 (31) ------------------------------------------------------------------- Thu Mar 18 17:17:02 CET 2010 - ma@suse.de - Fix broken bit values in enum VendorSupportOption (bnc#589331) - version 6.31.0 (31) ------------------------------------------------------------------- Fri Mar 12 14:46:25 CET 2010 - ma@suse.de - Fix handling of symlinked packages in package cache. (bnc #585409) - version 6.30.5 (19) ------------------------------------------------------------------- Tue Feb 23 19:05:04 CET 2010 - jkupec@suse.cz - Avoiding use of 'guest' if 'credentials' is used when moutning a CIFS share. This caused 'permission denied' error with certain server configurations (bnc #560496). ------------------------------------------------------------------- Tue Feb 23 17:31:05 CET 2010 - ma@suse.de - Check if a downloaded file actually exists even if aria2c returned 0. (bnc #564816) - version 6.30.3 (19) ------------------------------------------------------------------- Mon Feb 22 15:25:34 CET 2010 - jkupec@suse.cz - Made CURLE_PARTIAL_FILE an auto-retry error (bnc #471436) ------------------------------------------------------------------- Mon Feb 22 13:09:09 CET 2010 - ma@suse.de - Turn off cookies when retrieving services repoindex.xml (bnc #573897) - Consider pending disable requests when removing service repositories. (bnc #572634) - version 6.30.1 (19) ------------------------------------------------------------------- Sun Feb 21 14:11:49 CET 2010 - jkupec@suse.cz - RepoManager::cleanCacheDirGarbage added for removing directories which do not belong to any of known repos (bnc #467693) - version 6.30.0 (19) ------------------------------------------------------------------- Thu Feb 11 13:40:49 CET 2010 - ma@suse.de - On SLE aria2 is not required, so conflict with a too old aria2 version installed. (bnc #578052) - version 6.29.5 (19) ------------------------------------------------------------------- Wed Feb 10 12:45:21 CET 2010 - ma@suse.de - Fix package-manager script wrongly escaping UTF-8 chars in path names (bnc #571410) - version 6.29.4 (19) ------------------------------------------------------------------- Mon Feb 8 13:21:40 CET 2010 - ma@suse.de - Support an alternate SLE-SP1 translation set. - version 6.29.3 (19) ------------------------------------------------------------------- Wed Feb 3 15:57:13 CET 2010 - ma@suse.de - Remember the enabled state of removed service repositories. This way we are able to restore service repositories correctly after a subscrition expired and gets renewed. (bnc #572634) - version 6.29.2 (19) ------------------------------------------------------------------- Thu Jan 28 16:12:25 CET 2010 - jkupec@suse.cz - Abort aria2c download when the progress callback receives 'false' (bnc #545106) ------------------------------------------------------------------- Tue Jan 19 14:50:15 CET 2010 - ma@suse.de - Evaluate SolvAttr::repositoryToolVersion to prevent loading outdated solv files. (bnc #570623) - version 6.29.0 (19) ------------------------------------------------------------------- Fri Jan 15 18:15:26 CET 2010 - jkupec@suse.cz - Use regex to parse aria2c progress lines (bnc #570917) - version 6.28.1 (19) ------------------------------------------------------------------- Thu Jan 7 12:25:24 CET 2010 - jkupec@suse.cz - Set SignatureFileChecker context even if the key is not known (bnc #495977) - version 6.28.0 (19) ------------------------------------------------------------------- Thu Dec 10 17:18:34 CET 2009 - jkupec@suse.cz - RepoInfoBase::label() added for use in UI messages, plus ZConfig::repoLabelIsAlias() ------------------------------------------------------------------- Tue Dec 8 19:41:17 CET 2009 - ma@suse.de - Fix transaction building in presence of multiversion installable items. - version 6.27.1 (19) ------------------------------------------------------------------- Fri Dec 4 17:19:58 CET 2009 - ma@suse.de - Improve multiversion status handling and installation. (fate #305311) - version 6.27.0 (19) ------------------------------------------------------------------- Fri Dec 4 14:56:19 CET 2009 - jkupec@suse.cz - Don't allow an alias to start with '.' (bnc #473834) ------------------------------------------------------------------- Thu Dec 3 12:00:16 CET 2009 - ma@suse.de - PickList and status interface for handling packages which are installable in multiple versions. (fate #305311) - version 6.26.0 (19) ------------------------------------------------------------------- Wed Dec 2 13:10:43 CET 2009 - ma@suse.de - Add Selectable::highestAvailableVersionObj. Returns the highest available package version, ignoring priorities and policies. (bnc #557557) - version 6.25.0 (19) ------------------------------------------------------------------- Mon Nov 30 17:56:02 CET 2009 - ma@suse.de - Also parse tag from .prod files section. - version 6.24.3 (19) ------------------------------------------------------------------- Fri Nov 27 11:20:34 CET 2009 - ma@suse.de - Fix chroot execution of update scripts. (bnc #558813) - version 6.24.3 (19) ------------------------------------------------------------------- Thu Nov 26 16:06:52 CET 2009 - jkupec@suse.cz - Fixed parsing of download speed from aria2c (bnc #537870) ------------------------------------------------------------------- Wed Nov 25 16:28:29 CET 2009 - ma@suse.de - Add ui::Selecatble interface for picking specific package versions to install or delete if multiversion install is on. - version 6.24.0 (19) ------------------------------------------------------------------- Fri Nov 20 13:30:02 CET 2009 - ma@suse.de - Parse zypp.conf multiversion option and make the setting available in pool and resolver. - version 6.23.0 (19) ------------------------------------------------------------------- Mon Nov 16 16:27:39 CET 2009 - ma@suse.de - Specfile fixes to build on sle11-sp1. - Fix repository probing and building in presence of productdir. (bnc #553712) - version 6.22.3 (19) ------------------------------------------------------------------- Thu Nov 12 15:31:10 UTC 2009 - dmacvicar@suse.de - Forward port and document already present changes from Code11-Branch * void SEGV if trying to access data of installed packages, that were deleted behind our back (bnc #530595) * ProxyInfoSysconfig: take care variables get initialized. * Fix parsing of rpm.install.excludedocs option (bnc #518883) * Use rpm variables in specfile. (bnc #512466) * Fix to compile with -Werror=format-security * Fix packageand() in testcase generation * Don't link unneeded libraries. (bnc #490895) * Fix Patch::categoryEnum. * Adapt to changed satsolver API. (bnc #480303) * Taking ALL translations for generating GMO files (bnc #458739) * Advice users to contact NCC if access to a 'novell.com' repository is denied (bnc #464586). - version 6.22.2 (19) ------------------------------------------------------------------- Thu Nov 12 11:53:04 CET 2009 - ma@suse.de - Raised the limit of redirections from 3 to 6 (bnc #465532) - Following redirections also for https (bnc #545722). - Following https redirections requires at least libcurl4-7.19.4. (bnc #553895) - Do not report cached packages as being downloaded. (bnc #545295) - Per default do not collect and report deleted files outside bin and lib directories for 'zypper ps'. (bnc #554480) - version 6.22.1 (19) ------------------------------------------------------------------- Wed Nov 11 13:54:52 CET 2009 - ma@suse.de - CheckAccessDeleted: Per default do not collect and report deleted files that outside bin and lib directories. 'zypper ps' reporting false positive seems to confuse. (bnc #554480) ------------------------------------------------------------------- Wed Nov 11 11:45:01 CET 2009 - ma@suse.de - Following https redirections requires at least libcurl4-7.19.4. (bnc #553895) ------------------------------------------------------------------- Fri Nov 6 22:16:10 CET 2009 - ma@suse.de - dup: Process drop list only if product actually changes. (bnc #552180) - Selectable: Consider allowed arch/noarch changes when comuting candiadates. - version 6.22.0 (19) ------------------------------------------------------------------- Mon Nov 2 21:33:40 CET 2009 - ma@suse.de - Enhance interface for zypper. (bnc #551956) - version 6.21.4 (19) ------------------------------------------------------------------- Mon Nov 2 20:03:31 CET 2009 - ma@suse.de - CIFS/SMB: Support mountoption 'noguest' to prevent passing 'guest' option to mount. "cifs://server/share/path?mountoptions=noguest,ro" (bnc #547354) - version 6.21.3 (19) ------------------------------------------------------------------- Mon Nov 2 16:35:33 CET 2009 - ma@suse.de - CheckAccessDeleted: Avoid reporting false positive due to insufficient permission. ------------------------------------------------------------------- Mon Nov 2 13:59:33 CET 2009 - ma@suse.de - Don't try to access droplist of dropped products. (bnc #551697) - version 6.21.2 (19) ------------------------------------------------------------------- Fri Oct 30 12:30:48 CET 2009 - ma@suse.de - Don't try to use an empty proxy string. (bnc #551314) - MediaSMB failed to pass the --workgroup option to mount. (bnc #547354) - version 6.21.1 (19) ------------------------------------------------------------------- Fri Oct 30 11:28:05 CET 2009 - ma@suse.de - New class PoolItemBest: Find the best candidates e.g. in a PoolQuery result. ui::Selectabe enhancements. Both will aid applications to install package sets determined by query results. (bnc # 548392) - Fix upgradeRepo solution to keep obsolete packages. (bnc #550915) - Updated iso3166-1 country codes (bnc #531350) - version 6.21.0 (19) ------------------------------------------------------------------- Tue Oct 27 12:30:29 CET 2009 - ma@suse.de - Add Resolver::upgradingRepo demanded by GUI. (bnc #548551) - version 6.20.0 (19) ------------------------------------------------------------------- Thu Oct 22 15:09:57 CEST 2009 - ma@suse.de - Fixes to make libzypp-bindings compile. - version 6.19.3 (19) ------------------------------------------------------------------- Tue Oct 20 16:06:13 CEST 2009 - ma@suse.de - Credentials are passed as commandline options to aria2c, so strip any 'user@' from the URL. Otherwise aria will use an empty password for this URL and authentication will fail. (bnc #544634) - version 6.19.2 (19) ------------------------------------------------------------------- Mon Oct 19 13:39:31 CEST 2009 - ma@suse.de - Repository::setInfo: Propagate priority changes to the solver to avoid reloading the whole repo (bnc #498266). - version 6.19.1 (19) ------------------------------------------------------------------- Thu Oct 15 20:48:02 CEST 2009 - ma@suse.de - ResStatus: add isOrphaned to test whether a package is not provided by any enabled repository. Orphaned packages are usually good candidates for cleanup unless the providing repository was intentionally disabled. - version 6.19.0 (19) ------------------------------------------------------------------- Thu Oct 15 17:28:38 CEST 2009 - dmacvicar@suse.de - aria2: pass credentials in a file instead of the command line which is logged. - aria2: we get the url in the progress if there is no response from the server yet, handle that to avoid flooding the log. - version 6.18.2 (17) ------------------------------------------------------------------- Thu Oct 15 16:56:25 CEST 2009 - ma@suse.de - Performing a dist upgrade the solver may try to delete old and no longer provided (dropped) packages, even if they do not cause any dependency problem. This behaviour may be trurned off via zypp.conf option solver.upgradeRemoveDropedPackages. (bnc #539543) - New zypp.conf option solver.upgradeRemoveDropedPackages (true). - Add Product::droplist: List of dropped packages, i.e. packages no longer provided by a product. - version 6.18.1 (17) ------------------------------------------------------------------- Wed Oct 7 16:45:21 CEST 2009 - ma@suse.de - Return update messages via ZYppCommitResult. Support variable substitution in notification command. (fate #301175) - Fix evaluation of no_proxy entries (bnc #543337) - aria/curl: Fix header data in case the target is not initialized when downloading. - version 6.18.0 (17) ------------------------------------------------------------------- Thu Sep 24 17:21:45 CEST 2009 - ma@suse.de - Add zypp.conf option update.messages.notify: Command to be invoked to send update messages. (fate #301175) - version 6.17.2 (17) ------------------------------------------------------------------- Tue Sep 22 20:32:38 CEST 2009 - ma@suse.de - Add Selectable::updateCandidateObj returning the candidate for update, if there is one. The updateCandidate must not violate any active solver policy. - version 6.17.1 (17) ------------------------------------------------------------------- Fri Sep 18 17:20:37 CEST 2009 - ma@suse.de - Make sure rpmReadConfigFiles was called before using librpm (bnc #539603). - Remove dead rpm database caching code from class RpmDb. - version 6.17.0 (17) ------------------------------------------------------------------- Fri Sep 11 15:13:30 CEST 2009 - ma@km13.de - New commit.downloadMode option in zypp.conf. Allows to set a prefered download policy for commit. - version 6.16.0 (11) ------------------------------------------------------------------- Thu Sep 10 19:03:01 CEST 2009 - ma@suse.de - Support nfs4 (nfs4://... or nfs://...?type=nfs4) (fate #306451) - Added Url::schemeIsLocal, schemeIsRemote, schemeIsVolatile and schemeIsDownloading. - version 6.15.0 (11) ------------------------------------------------------------------- Wed Sep 9 15:02:18 CEST 2009 - ma@suse.de - Add Capability::guessPackageSpec; parser also supporting "name-ver-rel.arch" formats for building Capabilities(originally "name.arch=ver-rel"). - version 6.14.3 (11) ------------------------------------------------------------------- Mon Sep 7 17:31:20 CEST 2009 - ma@suse.de - Fix resolution to force installation even if dependencies are missing. (bnc #531564) - Rephrase solver resolution to point out if a package will break. (bnc #520083) ------------------------------------------------------------------- Fri Sep 4 12:19:50 CEST 2009 - ma@suse.de - Lock rpms architecture only on distupgrade of the running system. (bnc #458520) - version 6.14.2 (11) ------------------------------------------------------------------- Thu Sep 3 13:41:31 CEST 2009 - ma@suse.de - Fix PoolQuery comparison (bnc #528755) - Fix serialization and restore of predicated PoolQueries. - version 6.14.0 (11) ------------------------------------------------------------------- Mon Aug 31 15:17:01 CEST 2009 - ma@suse.de - package-manager script: Fall back to package selection if no packages are passed on the commandline. (bnc #529137) ------------------------------------------------------------------- Fri Aug 28 17:33:55 CEST 2009 - dmacvicar@suse.de - package-manager script: do not fail if kpackagekit is not installed (bnc #529510) - version 6.13.3 (11) ------------------------------------------------------------------- Wed Aug 26 15:55:22 CEST 2009 - ma@suse.de - Tune CheckAccessDeleted to focus on libraries and executables. - version 6.13.2 (11) ------------------------------------------------------------------- Thu Aug 6 18:18:21 CEST 2009 - ma@suse.de - Provide class CheckAccessDeleted and command zypp-CheckAccessDeleted to check for running processes which access meanwhile deleted files or libraries. This may be used after commit, when trying to figure out which services need to be restated. (fate #300763). - version 6.13.1 (11) ------------------------------------------------------------------- Mon Aug 3 18:46:13 CEST 2009 - ma@suse.de - New Resolver::addUpgradeRepo to perform a dist upgrade restricted to certain repositories. - version 6.13.0 (11) ------------------------------------------------------------------- Fri Jul 31 17:55:33 CEST 2009 - ma@suse.de - Remove confusing newlines in vendor change info (bnc #503859) - Removing a package lock was not counted as state change (bnc #501850) - Take solver_allowVendorChange option into account when computing the Selectables default candidate. - version 6.12.0 (11) ------------------------------------------------------------------- Wed Jul 29 13:36:19 CEST 2009 - ma@suse.de - Avoid deadlock after fork and failed exec. (bnc 493152) - No need to manually detect the location of aria2 binary. - version 6.11.4 (11) ------------------------------------------------------------------- Tue Jul 28 23:05:43 CEST 2009 - jkupec@suse.cz - Fixed parsing of download rate report (changed in aria2 1.4.0) (bnc #513944) ------------------------------------------------------------------- Mon Jul 27 16:05:43 CEST 2009 - ma@suse.de - Create LogControl on demand instead of using a static var. (bnc #525339) - version 6.11.2 (11) ------------------------------------------------------------------- Thu Jul 23 00:22:50 CEST 2009 - ma@km13.de - New misc::defaultLoadSystem: Convenience to create the ZYpp instance and load target and enabled repositories. ------------------------------------------------------------------- Wed Jul 22 14:57:32 CEST 2009 - ma@suse.de - New class InstanceId to build strings to identify/retrieve specific Solvables. - version 6.11.1 (11) ------------------------------------------------------------------- Mon Jul 20 23:57:46 CEST 2009 - ma@km13.de - Add download policies to ZYppCommitPolicy, supporting DownloadOnly and DownloadInAdvance. (fate #302159, fate #305624) - version 6.11.0 (11) ------------------------------------------------------------------- Thu Jul 16 17:05:27 CEST 2009 - dmacvicar@suse.de - add support to the package-manager script to use kpackagekit or gnome-packagekit if available, which allows to install local rpms with one click from file manager following desktop policies and fetching other dependencies if required. (fate #306526) - version 6.10.5 (10) ------------------------------------------------------------------- Thu Jul 16 16:25:24 CEST 2009 - ma@suse.de - New solver.upgradeTestcasesToKeep option in zypp.conf. It tells how many dist upgrade solver testcases should be kept on the system. Per default just the last two are kept. - version 6.10.4 (10) ------------------------------------------------------------------- Wed Jul 15 17:53:43 CEST 2009 - ma@suse.de - Don't write a solver testcase when solving for dist upgrade, but when actually committing. - version 6.10.3 (10) ------------------------------------------------------------------- Wed Jul 15 16:45:39 CEST 2009 - ma@suse.de - Add new string Match::Mode STRINGSTART and STRINGEND. ------------------------------------------------------------------- Tue Jul 15 14:38:51 CEST 2009 - jkupec@suse.cz - log redirections when cURL media backend is used (fate #305320). ------------------------------------------------------------------- Tue Jul 14 18:15:51 CEST 2009 - ma@suse.de - Support "product version" detection on systems not using /etc/product.d/baseproduct by looking for the first package providing ZConfig::distroverpkg (defaults to redhat-release). - version 6.10.2 (10) ------------------------------------------------------------------- Fri Jul 10 15:21:39 CEST 2009 - ma@suse.de - Adapt to boost_unit_test_framework-1.38. - version 6.10.1 (10) ------------------------------------------------------------------- Wed Jul 8 16:19:31 CEST 2009 - ma@suse.de - Remove obsolete UpgradeStatistics class from libzypp. ------------------------------------------------------------------- Tue Jul 7 17:45:47 CEST 2009 - ma@suse.de - Fix HistoryLog to initialize on demand. - version 6.10.0 (10) ------------------------------------------------------------------- Fri Jul 3 13:01:13 CEST 2009 - ma@suse.de - Fix parsing of rpm.install.excludedocs option (bnc #518883) ------------------------------------------------------------------- Fri Jul 3 09:20:56 CEST 2009 - ma@suse.de - When unmounting ISO images, don't mix up exceptions thrown by the loop mounted ISO and those thrown by the media containing it. (bnc #517856) ------------------------------------------------------------------- Thu Jul 2 16:42:42 CEST 2009 - ma@suse.de - Adapt to satsolvers improved dataiterator handling. - version 6.9.3 (8) ------------------------------------------------------------------- Wed Jul 1 18:05:54 CEST 2009 - ma@suse.de - Support PoolQuery for sub-structures attributes. (fate #305503) - version 6.9.2 (8) ------------------------------------------------------------------- Wed Jul 1 13:44:04 CEST 2009 - ma@suse.de - Running as non-root user use a temporary @System solvfile in case the global one is outdated and needed refresh. (bnc #517183) - version 6.9.1 (8) ------------------------------------------------------------------- Tue Jun 30 16:32:08 CEST 2009 - ma@suse.de - Enhance LookupAttr to allow direct query of attributes within sub-structures (flexarrays). ------------------------------------------------------------------- Fri Jun 26 12:06:51 CEST 2009 - ma@suse.de - Enhance PoolQueryIterator to allow detailed inspection of attribute matches. - Prefer datadir stored as repo attribute, but fallback searching in solvbales (old solv files do this). - version 6.9.0 (8) ------------------------------------------------------------------- Tue Jun 23 13:29:36 CEST 2009 - ma@suse.de - Allow building libzypp with rpm-5 (experimental) - version 6.8.3 (8) ------------------------------------------------------------------- Wed Jun 17 15:39:17 CEST 2009 - ma@suse.de - Allow building libzypp without HAL (not recommended). Without HAL CD/DVD device detection is limited to /dev/dvd and /dev/cdrom. - version 6.8.2 (8) ------------------------------------------------------------------- Fri Jun 5 21:16:45 CEST 2009 - ma@suse.de - Fix solver to use IdSting to avoid failing vendor checks. - version 6.8.1 (8) ------------------------------------------------------------------- Thu Jun 4 14:22:58 CEST 2009 - ma@suse.de - Cleanup and remove deprecated interface methods. - version 6.8.0 (8) ------------------------------------------------------------------- Fri May 29 20:12:55 CEST 2009 - ma@suse.de - Improve PoolQuery to allow queries on dependencies. (bnc #475682) - version 6.7.0 (6) ------------------------------------------------------------------- Thu May 28 12:53:02 CEST 2009 - ma@suse.de - New solver.allowVendorChange expert option in zypp.conf. - version 6.6.0 (6) ------------------------------------------------------------------ Wed May 20 14:23:07 CEST 2009 - ma@suse.de - Fix lost housekeeping data in modifyRepo (bnc #503207) ------------------------------------------------------------------- Fri May 8 16:43:47 CEST 2009 - ma@suse.de - Allow service refresh to change a repositories url (bnc #502157) ------------------------------------------------------------------- Tue May 5 13:39:08 CEST 2009 - ma@suse.de - Detect and compile with rpm 4.7 (bnc #444211) - version 6.5.2 (5) ------------------------------------------------------------------- Mon May 4 16:19:54 CEST 2009 - ma@suse.de - Improve problem report on broken systemCheck rule (bnc #475144) ------------------------------------------------------------------- Mon Apr 27 15:26:54 CEST 2009 - ma@suse.de - In update repos providing multiple release package versions for the same product, link a product to the latest version. (bnc #497696) ------------------------------------------------------------------- Mon Apr 27 14:28:07 CEST 2009 - ma@suse.de - New classes wraping satsolver datamatcher (Match and sat::AttrMatcher) - Extend LookupAttr to support matching specific string patterns. - Rewrote PoolQuery::Iterator (adapt to AttrMatcher, fixes and speedup) - version 6.5.0 (5) ------------------------------------------------------------------- Thu Apr 16 12:49:40 CEST 2009 - ma@suse.de - Soft lock packages deleted on behalf of a user request. - version 6.4.1 (2) ------------------------------------------------------------------- Tue Mar 31 15:51:32 CEST 2009 - ma@suse.de - New zypp.conf option 'download.media_preference': Hint which media to prefer when installing packages (download vs. CD). - version 6.4.0 (2) ------------------------------------------------------------------ Thu Mar 12 18:38:30 CET 2009 - ma@suse.de - Add Resolver::setSolveSrcPackages. Per default disable solving of source package dependencies. We will later allow enabling it per package. - version 6.3.0 (2) ------------------------------------------------------------------- Fri Mar 6 17:17:26 CET 2009 - dmacvicar@suse.de - aria2: show the download speed in the right unit - aria2: show the filename in progress, not the repository - aria2: don't show done twice ------------------------------------------------------------------- Thu Mar 5 14:52:44 CET 2009 - ma@suse.de - Remove a lock if the locking process is in zombie state. (bnc #481577) ------------------------------------------------------------------- Wed Mar 4 00:13:19 CET 2009 - jkupec@suse.cz - zypp.conf: fixed and enabled 'servicesdir' ------------------------------------------------------------------- Tue Mar 3 13:38:11 CET 2009 - dmacvicar@suse.de - aria2: implement speed indicators (bnc#475506) - aria2: implement progress indicators correctly (bnc#473846) - aria2: fix broken pipe when looking for aria2c which caused a fallback to curl. (bnc#480930) - aria2: implement saving and reading mirror stats data in /var/cache/zypp/aria2.stats - aria2: handle failover correctly (bnc#481115) - aria2: various improvements in error and report handling - aria2: curl: reset settings on attach to avoid duplicate headers - version 6.2.1 (2) ------------------------------------------------------------------- Tue Mar 3 12:44:24 CET 2009 - ma@suse.de - Adapt to changed satsolver API. ------------------------------------------------------------------- Fri Feb 27 16:23:36 CET 2009 - dmacvicar@suse.de - Make sure Fetcher pass optional files as non-interactive - Fixes file does not exist error when key/sig does not exist - version 6.2.0 (2) ------------------------------------------------------------------- Thu Feb 26 13:49:56 CET 2009 - ma@suse.de - Use correct default for zconfig(solver.checkSystemFile) (bnc# 475144) ------------------------------------------------------------------- Thu Feb 26 01:25:33 CET 2009 - ma@suse.de - Prevent ResStatus from overriding user locks. (bnc #475230) ------------------------------------------------------------------- Sun Feb 22 15:27:11 CET 2009 - ma@suse.de - Never refresh repositories from CD/DVD, once they are created. (bnc #476429) ------------------------------------------------------------------- Sat Feb 21 18:31:17 CET 2009 - dmacvicar@suse.de Implemented the following options with aria backend: - download.max_concurrent_connections (default 2) download.min_download_speed (default no limit) download.max_download_speed (default no limit) download.max_silent_tries (default 5) ------------------------------------------------------------------- Fri Feb 20 16:28:19 CET 2009 - dmacvicar@suse.de - MediaAria2c: allow disabling aria2 using ZYPP_ARIA2C=0. Various improvements including file existence checking Disable HEAD request if aria2c >= 1.20 Restrict max connections to 2 for now. ------------------------------------------------------------------- Wed Feb 18 15:51:38 CET 2009 - ma@suse.de - Neither lose packages with empty name, nor SEGV when processing them. (bnc #470011) ------------------------------------------------------------------- Tue Feb 17 23:17:54 CET 2009 - ma@suse.de - Compute obsoletes based on names only (not considering provides) (bnc #471023) ------------------------------------------------------------------- Tue Feb 17 12:56:57 CET 2009 - jkupec@suse.cz - Fixed FTP authentication (bnc #472879) ------------------------------------------------------------------- Wed Feb 11 13:31:03 CET 2009 - ma@suse.de - Follow IEC and use the binary prefixes (KiB,MiB,GiB) for printing Byte counts based on a power of 1024 (formerly just K,M,G). Byte counts based on a power of 1000 stay unaffected (kB,MB,GB). ------------------------------------------------------------------- Mon Feb 9 13:14:26 CET 2009 - ma@suse.de - Fix installation prompting for the wrong CD/DVD. (bnc #472892) ------------------------------------------------------------------- Tue Feb 3 18:07:38 CET 2009 - ma@suse.de - Send any output from rpm install/delete scripts via callback, so applications are able to display it. (bnc #369450) ------------------------------------------------------------------- Mon Feb 2 14:12:08 CET 2009 - ma@suse.de - Add missing translations (bnc #256289) ------------------------------------------------------------------- Wed Jan 28 14:37:28 CET 2009 - jkupec@suse.cz - HistoryLogReader added ------------------------------------------------------------------- Tue Jan 27 13:35:44 CET 2009 - ma@suse.de - Respect content-file DATDIR when downloading packages. (bnc #468612) ------------------------------------------------------------------- Tue Jan 27 13:28:54 CET 2009 - jkupec@suse.cz - Enabled CredentialManager for MediaSMB (bnc #460970). - Ignore URL's username, password, and query string in AuthData comparator in CredentialManager. ------------------------------------------------------------------- Mon Jan 26 12:41:07 CET 2009 - ma@suse.de - Let vendor checks per default differ between 'openSUSE Build Service' and 'openSUSE' (bnc #467262). ------------------------------------------------------------------- Fri Jan 23 12:34:44 CET 2009 - ma@suse.de - Fix handling of plaindir repos on mounted devices (e.g. USB) (bnc #464778) - Fix plaindir checksum computation not to to follow symlinks (bnc #464778) ------------------------------------------------------------------- Thu Jan 22 10:41:27 CET 2009 - ma@suse.de - Tell satsolver about product buddies (bnc #466565) ------------------------------------------------------------------- Fri Jan 9 17:01:10 CET 2009 - jkupec@suse.cz - handle HTTP 503 responses as temporary errors (bnc #462545) ------------------------------------------------------------------- Thu Dec 18 22:26:18 CET 2008 - ma@suse.de - Fixed lost user request to abort during commit. (bnc #388810, bnc #450273) - revision 11954 - version 5.25.0 (23) ------------------------------------------------------------------- Thu Dec 18 13:02:27 CET 2008 - ma@suse.de - Add Package::filelist, faster and less memory consuming implementation of Package::filenames (now deprecated). - revision 11949 ------------------------------------------------------------------- Thu Dec 11 21:39:50 CET 2008 - ma@suse.de - Add str::hexencode and str::hexdecode to encode special characters in a string as %XX. - Hexdecode modalias strings in rpm dependencies because rpm does not allow comma, blank and other special chars. (bnc #456695) - revision 11927 ------------------------------------------------------------------- Thu Dec 11 17:13:06 CET 2008 - ma@suse.de - Catch and report media errors when proving packages. (bnc #457652) - revision 11926 ------------------------------------------------------------------- Wed Dec 10 16:09:08 CET 2008 - ma@suse.de - Remove obsolete zypp.conf::productsdir and deprecate ZConfig::productsPath(). - Monitor /etc/products.d to determine if @system.solv needs to be rebuilt. (bnc #457933) - revision 11923 - version 5.24.7 (23) ------------------------------------------------------------------- Mon Dec 8 15:31:18 CET 2008 - ma@suse.de - Execute patch scripts chroot to the installed system. (bnc #456795) - revision 11908 ------------------------------------------------------------------- Mon Dec 8 10:39:30 CET 2008 - schubi@suse.de - Make the solver reset function public (bnc #439373) - Revision 11904 ------------------------------------------------------------------- Sun Dec 7 20:21:09 CET 2008 - coolo@suse.de - note for coolo: do not trust bash advisory from TPM colleagues ------------------------------------------------------------------- Fri Dec 5 14:22:11 CET 2008 - ma@suse.de - Fix solvers inappropriate selection as byUSER (bnc 455965) - revision 11891 - version 5.24.6 (23) ------------------------------------------------------------------- Thu Dec 4 11:10:35 CET 2008 - coolo@suse.de - fix %post script to not warn on fresh install ------------------------------------------------------------------- Mon Dec 1 19:38:24 CET 2008 - ma@suse.de - Fix install order computation losing some installed packages pre-requirements. (bnc #439802) - revision 11845 - version 5.24.5 (23) ------------------------------------------------------------------- Fri Nov 28 16:33:56 CET 2008 - ma@suse.de - Prune soft locks to prevent installation but not update of already installed packages. - revision 11829 - version 5.24.4 (23) ------------------------------------------------------------------- Fri Nov 28 11:36:03 CET 2008 - schubi@suse.de - Taking solutions which based on user requirements/conflict "by User" solutions (bnc #442718) - revision 11825 ------------------------------------------------------------------- Fri Nov 28 00:05:17 CET 2008 - ma@suse.de - Take into account the requirements of all obsoleted packages uninstall scripts when computing the installation order. (bnc #439802) - revision 11823 - version 5.24.3 (23) ------------------------------------------------------------------- Thu Nov 27 14:45:07 CET 2008 - dmacvicar@suse.de - fix maybeUnsuported() method returning wrong result - add testcase for future coverage - don't force time based uuid for anonymous id string (bnc #449654) - RELEASE: 5.24.2 (23) ------------------------------------------------------------------- Wed Nov 26 17:18:00 CET 2008 - ma@suse.de - Call 'repo2solv -R' (recursive scan) for plaindir repos. (bnc #443350) - revision 11810 ------------------------------------------------------------------- Wed Nov 26 17:09:12 CET 2008 - dmacvicar@suse.de - SHA1SUMS.key is not imported by zypp as known key (bnc #446188) - path and url in add_on_products.xml is evaluated wrong (bnc #446170) ------------------------------------------------------------------- Mon Nov 24 17:47:35 CET 2008 - schubi@suse.de - activate locking for doUpdate (bnc #447684) - revision 11792 - RELEASE: 5.24.1 (23) ------------------------------------------------------------------- Fri Nov 21 16:56:10 CET 2008 - dmacvicar@suse.de - remove unused updaterepokey, replaced by repo product information ------------------------------------------------------------------- Fri Nov 21 15:12:52 CET 2008 - jkupec@suse.cz - fixed uninitialized value in OnMediaLocation (bnc #447010) - revision 11770 ------------------------------------------------------------------- Thu Nov 20 23:59:16 CET 2008 - ma@suse.de - Fix retrieval of deltarpm info. - revision 11764 - version 5.24.0 (23) ------------------------------------------------------------------- Thu Nov 20 22:15:28 CET 2008 - ma@suse.de - Fix retrieval of Repository attributes like timestamps, keywords and product info. - revision 11760 ------------------------------------------------------------------- Thu Nov 20 19:30:05 CET 2008 - ma@suse.de - Enhance class LookupAttr and add convenience class LookupRepoAttr to iterate those solv file attributes which are not acssociated with a solvable. E.g. product or deltarpm info. - revision 11754 ------------------------------------------------------------------- Wed Nov 19 15:49:38 CET 2008 - jkupec@suse.cz - encode user-supplied URL strings before using them in the Url object (bnc #446395, bnc #444267) - revision 11720 ------------------------------------------------------------------- Wed Nov 19 15:15:14 CET 2008 - ma@suse.de - Support loading helix files. - revision 11719 ------------------------------------------------------------------- Tue Nov 18 18:37:30 CET 2008 - ma@suse.de - Add class filesystem::Glob to find pathnames matching a pattern by using ::glob. - revision 11708 ------------------------------------------------------------------- Thu Nov 13 11:07:56 CET 2008 - schubi@suse.de - Taking care for ppc64 while distupgrade (bnc #443685) - revision 11670 ------------------------------------------------------------------- Wed Nov 12 18:53:03 CET 2008 - ma@suse.de - Add Capability ctor from Arch and Name: (Arch_i386, "name") or (Arch_i386, "name == 1.0"). - revision 11669 ------------------------------------------------------------------- Wed Nov 12 14:31:20 CET 2008 - ma@suse.de - Take care to always reset CURLOPT_TIMECONDITION to prevent incomplete downloads. (bnc #444109) - revision 11656 - version 5.23.0 (23) ------------------------------------------------------------------- Wed Nov 12 13:19:02 CET 2008 - ma@suse.de - Check for modaliases below /sys (bnc #430179) - revision 11653 ------------------------------------------------------------------- Tue Nov 11 18:36:33 CET 2008 - ma@suse.de - Avoid superfluous file copying and gpg invocation in keyring handling. - revision 11650 ------------------------------------------------------------------- Tue Nov 11 14:48:52 CET 2008 - ma@suse.de - Prevent fetcher from processing the same index file twice. (bnc #443644) - revision 11648 - version 5.22.0 (21) ------------------------------------------------------------------- Fri Nov 7 23:55:47 CET 2008 - ma@suse.de - Fix retrieval of patch contents and references attributes. (bnc #442200) - revision 11641 - version 5.21.0 (21) ------------------------------------------------------------------- Fri Nov 7 19:51:00 CET 2008 - ma@suse.de - Add CheckSum::asString. - revision 11634 ------------------------------------------------------------------- Fri Nov 7 17:55:48 CET 2008 - ma@suse.de - revision 11631 - version 5.20.0 (20) ------------------------------------------------------------------- Thu Nov 6 18:35:25 CET 2008 - dmacvicar@suse.de - re-add the flavor to the http header now using a flavor cache that is updated on every target load. Target::dstributionFlavor provides access to this cache in case you need the last used flavor without loading the target. ------------------------------------------------------------------- Thu Nov 6 16:23:03 CET 2008 - schubi@suse.de - added flag: ignorealreadyrecommended to the testcases (bnc #432136) - revsion 11539 ------------------------------------------------------------------- Thu Nov 6 09:41:48 CET 2008 - schubi@suse.de - Adding rule rpm-arch for installed rpm package in order to avoid unneeded architecture change. (bnc #441004) - revision 11585 ------------------------------------------------------------------- Tue Nov 4 13:21:35 CET 2008 - jkupec@suse.cz - handle MediaTimeoutException also in MediaSetAccess::provideFile() (bnc #439983) - revision 11568 ------------------------------------------------------------------- Mon Nov 3 15:30:53 CET 2008 - dmacvicar@suse.de - merge contributions by Jon Nelson, the patches resolve the following issues: - disable the "Pragma: nocache" header which is automatically used by curl. re-enables the use of a caching http proxy (like squid or others) and corrects (bnc #326208) - don't generate an If-Modified-Since header if we don't have a previous file to work with - don't generate a Proxy-Authenticate header if one is not called for. ------------------------------------------------------------------- Fri Oct 31 14:01:57 CET 2008 - ma@suse.de - Do not save solver locks (by APPL_HIGH). - revision 11558 ------------------------------------------------------------------- Fri Oct 31 13:53:39 CET 2008 - dmacvicar@suse.de - fetcher.setOptions( Fetcher::AutoAddIndexes ) allows for automatic signed index discovery. - enqueueDir with checksum checking s now enqueueDigestedDir ------------------------------------------------------------------- Thu Oct 30 14:24:57 CET 2008 - schubi@suse.de - solutions: keep/lock will be done by APPL_HIGH. So they will not be saved in the lockfiles - "keep obsolete" will be handled with lock by APPL_HIGH (bnc #439134) - revision 11549 ------------------------------------------------------------------- Wed Oct 29 14:14:16 CET 2008 - jkupec@suse.cz - throw a MediaTimeoutException also on http 504 (gateway timeout) (bnc #425035) - revision 11535 ------------------------------------------------------------------- Wed Oct 29 12:51:55 CET 2008 - ma@suse.de - Add 'sh4' architectures. - revision 11534 ------------------------------------------------------------------- Tue Oct 28 22:01:40 CET 2008 - dmacvicar@suse.de - don't free the header before curl_perform as curl does not copy it. (bnc#439532) ------------------------------------------------------------------- Tue Oct 28 16:47:36 CET 2008 - ma@suse.de - Add 'arm' architectures. - revision 11525 ------------------------------------------------------------------- Tue Oct 28 10:07:13 CET 2008 - schubi@suse.de - regarding "keep obsolete" in the solutions (bnc #439134) - revision 11517 ------------------------------------------------------------------- Mon Oct 27 10:51:01 CET 2008 - dmacvicar@suse.de - fix broken aria2c command line (bnc#438971) ------------------------------------------------------------------- Sun Oct 26 14:53:56 CET 2008 - coolo@suse.de - adding svn r11488 to fix compile of PackageKit ------------------------------------------------------------------- Fri Oct 24 18:12:34 CEST 2008 - ma@suse.de - Remove error prone methods from OnMediaLocation API to prevent accidental missuse. (bnc #437328) - revision 11487 - version 5.19.0 (19) ------------------------------------------------------------------- Fri Oct 24 16:07:45 CEST 2008 - ma@suse.de - Provide the /etc/products.d enties filename as Product::referenceFilename. Use it to remove orphan products. (bnc #432932) - Fix media exception handling in commit (bnc #395704) - revision 11485 - version 5.18.0 (17) ------------------------------------------------------------------- Fri Oct 24 10:29:19 CEST 2008 - schubi@suse.de - Taking "unlock" instead of setTransact(false) in the solutions (bnc #436923) - revision 11468 - version 5.17.0 (17) ------------------------------------------------------------------- Wed Oct 22 14:33:10 CEST 2008 - ma@suse.de - For retrieving a product license fall back to license.tar.gz. (bnc #372386) - revision 11447 ------------------------------------------------------------------- Wed Oct 22 14:16:33 CEST 2008 - dmacvicar@suse.de - move anonymous unique id to a private http header X-ZYpp-AnonymousUniqueId (bnc#431571 ) ------------------------------------------------------------------- Wed Oct 22 12:58:35 CEST 2008 - ma@suse.de - Adapt to satsolver-0.12 API. - Add Locale:: bestMatch to find the best match within a set of available Locales. - revision 11441 ------------------------------------------------------------------- Mon Oct 20 16:44:58 CEST 2008 - ma@suse.de - RepoInfo: Add methods to handle repository licenses. (bnc #372386) - revision 11419 ------------------------------------------------------------------- Mon Oct 20 16:39:41 CEST 2008 - ma@suse.de - Adapt to changed satsolver dataiterator API. - revision 11418 ------------------------------------------------------------------- Fri Oct 17 18:31:47 CEST 2008 - ma@suse.de - Secure download of license file on repo refresh (bnc #372386) - revision 11398 ------------------------------------------------------------------- Fri Oct 17 17:26:25 CEST 2008 - ma@suse.de - Call 'repo2solv.sh -o' instead of using output redirection. (bnc #420046) - revision 11397 ------------------------------------------------------------------- Thu Oct 16 17:57:15 CEST 2008 - jkupec@suse.cz - repository license methods added to RepoManager (bnc #372386) - revision 11377 ------------------------------------------------------------------- Thu Oct 16 16:26:01 CEST 2008 - dmacvicar@suse.de - don't take into account stat information when looking for remote SHA1SUMS (part of bnc#409927) ------------------------------------------------------------------- Wed Oct 15 18:01:48 CEST 2008 - jkupec@suse.cz - MediaSetAccess::provideOptionalFile() added - revision 11369 ------------------------------------------------------------------- Wed Oct 15 18:01:48 CEST 2008 - jkupec@suse.cz - version 5.16.1 (16) ------------------------------------------------------------------- Tue Oct 14 16:15:09 CEST 2008 - jkupec@suse.cz - don't initialize servicesTargetDistro via global ZYpp instance in RepoManagerOptions() constructor (bnc #435184) - revision 11342 ------------------------------------------------------------------- Mon Oct 13 19:12:40 CEST 2008 - jkupec@suse.cz - repository probing: check for other types of repo even on MediaException, throw only if all fail (bnc #335906) - revision 11332 ------------------------------------------------------------------- Mon Oct 13 14:16:25 CEST 2008 - ma@suse.de - Adapt to satsolver changes. - revision 11331 - version 5.16.0 (16) ------------------------------------------------------------------- Mon Oct 13 13:28:48 CEST 2008 - ma@suse.de - Fix reading delta rpm checksum from solv file. - revision 11313 ------------------------------------------------------------------- Mon Oct 13 12:12:39 CEST 2008 - ma@suse.de - Fix package-manager script to properly quote arguments. (bnc #30903) - revision 11311 ------------------------------------------------------------------- Mon Oct 13 11:03:04 CEST 2008 - schubi@suse.de - regarding orphaned resolvables - removed old distupgrade algorithm - revision 11307 ------------------------------------------------------------------- Sun Oct 12 13:55:51 CEST 2008 - jkupec@suse.cz - handle ftp response 530 (login failed) like http 403 (bnc #433537) - revision 11305 ------------------------------------------------------------------- Thu Oct 9 17:37:18 CEST 2008 - ma@suse.de - Adapt to satsolvers 'big solv data change'. - revision 11294 ------------------------------------------------------------------- Thu Oct 9 17:18:18 CEST 2008 - schubi@suse.de - Taking the right solution actions for locked resolvables (bnc #400840) - revision 11289 ------------------------------------------------------------------- Thu Oct 9 13:52:03 CEST 2008 - ma@suse.de - Add required copy-ctor and assignment operator to WhatProvides. (bnc #433087) - revision 11276 ------------------------------------------------------------------- Wed Oct 8 16:24:25 CEST 2008 - jkupec@suse.cz - detect and use unused loop device for mounting ISO images (bnc #428009) - revision 11262 - version 5.15.1 (13) ------------------------------------------------------------------- Wed Oct 8 15:39:08 CEST 2008 - jkupec@suse.cz - fixed segfault when saving the probed repo type in RepoManager::refreshMetadata() (bnc #431963) - revision 11261 ------------------------------------------------------------------- Wed Oct 8 11:33:00 CEST 2008 - dmacvicar@suse.de - improve log message (bnc#429114) ------------------------------------------------------------------- Wed Oct 8 11:15:20 CEST 2008 - lslezak@suse.cz - disk usage - ignore /proc filesystem (bnc#418783) - revision 11258 ------------------------------------------------------------------- Tue Oct 7 13:24:10 CEST 2008 - ma@suse.de - Fixed detection of loopback mounted iso-files. The mtab entry does not necessarily mention the iso-file. (bnc #432504) - revision 11252 - version 5.15.0 (13) ------------------------------------------------------------------- Thu Oct 2 19:46:13 CEST 2008 - ma@suse.de - Add zypp.conf option 'download.use_deltarpmr.always' to enable using delta rpms even if the package is available on a local source. (Axel C. Frinke) - revision 11235 - version 5.14.0 (13) ------------------------------------------------------------------- Thu Oct 2 18:50:11 CEST 2008 - ma@suse.de - Add product attribute: PRODUCTLINE. - revision 11234 ------------------------------------------------------------------- Thu Oct 2 17:18:19 CEST 2008 - ma@suse.de - Do not consider self provided requirements whan computing the installation order. - revision 11231 ------------------------------------------------------------------- Wed Oct 1 16:07:36 CEST 2008 - ma@suse.de - Rephrase missleading error message. (bnc #431229) - revision 11222 ------------------------------------------------------------------- Tue Sep 30 17:23:48 CEST 2008 - ma@suse.de - Allow computation of disk usage per solvable. - revision 11218 ------------------------------------------------------------------- Mon Sep 29 23:59:10 CEST 2008 - dmacvicar@suse.de - Merge aria2c Media handler code from Google SOC 2008 (Gerard Farras) - Only activated by making env var ZYPP_ARIA=1 ------------------------------------------------------------------- Mon Sep 29 15:56:17 CEST 2008 - jkupec@suse.cz - history: tell which package failed before logging rpm output or error message (bnc #430585) - no localization for history log comments - revision 11202 ------------------------------------------------------------------- Mon Sep 29 13:43:08 CEST 2008 - ma@suse.de - Fix zypp::WhatProvides::empty returning inverse result. - revision 11200 - version 5.13.1 (13) ------------------------------------------------------------------- Sat Sep 27 23:36:19 CEST 2008 - jkupec@suse.cz - fixed endless loop when CredentialManager returns bad password - CredentialManager now correctly updates password of existing credentials - revision 11187 ------------------------------------------------------------------- Fri Sep 26 15:37:50 CEST 2008 - ma@suse.de - Fix computation of Product::flavor. - Add Product::productLine. A vendor specific string denoting the product line. - revision 11182 - version 5.13.0 (13) ------------------------------------------------------------------- Fri Sep 26 15:25:33 CEST 2008 - jkupec@suse.cz - save user credentials after asking for them - revision 11181 ------------------------------------------------------------------- Thu Sep 25 23:19:55 CEST 2008 - jkupec@suse.cz - ZConfig::credentialsGlobal{File,Dir}() added (/etc/zypp/credentials.{cat,d}) - revision 11176 ------------------------------------------------------------------- Thu Sep 25 17:09:44 CEST 2008 - jkupec@suse.cz - Target::setInstallationLogfile() removed from zypp/Target.h - revision 11171 ------------------------------------------------------------------- Thu Sep 25 13:11:43 CEST 2008 - ma@suse.de - Remove obsolete zypp-query-pool binary. zypper provides all the information one needs. - revision 11160 ------------------------------------------------------------------- Wed Sep 24 19:11:19 CEST 2008 - jkupec@suse.cz - HistoryLog added and used to log package installs/removes and repository adds, removes, url and alias changes into history.logfile (/var/log/zypp/history) (fate #110205) - str::escape(string, char) added - revision 11150 - version 5.12.1 (12) ------------------------------------------------------------------- Tue Sep 23 14:02:08 CEST 2008 - jkupec@suse.cz - CredentialManager: look for credentials with wanted_url.startsWith(stored_url) - RepoManager: don't pass service credentials down to repos if their urls are not based on service's url. - revision 11134 ------------------------------------------------------------------- Mon Sep 22 16:27:41 CEST 2008 - ma@suse.de - Remove superfluous PRODUCT_REFERENCES attribute. - revision 11127 ------------------------------------------------------------------- Mon Sep 22 16:13:08 CEST 2008 - ma@suse.de - Add Url::hasCredentialsInAuthority test for username or password being encoded in the authority component. I.e. user:pass@host. - Handle repos to be disabled disable in service refresh. - revision 11126 ------------------------------------------------------------------- Mon Sep 22 12:10:34 CEST 2008 - jkupec@suse.cz - provided context to keyring callbacks (bnc #370223) - merged trust & import callbacks (bnc #366467) (don't worry, still allows to trust && !import) - revision 11113 ------------------------------------------------------------------- Fri Sep 19 13:17:38 CEST 2008 - ma@suse.de - Moved DefaultAcceptBits enum to class KeyRing (formerly KeyRingReort). - revision 11102 ------------------------------------------------------------------- Thu Sep 18 16:11:23 CEST 2008 - ma@suse.de - Use service alias as namespace for it's repositories aliases. - revision 11097 - version 5.11.0 (11) ------------------------------------------------------------------- Thu Sep 18 12:45:25 CEST 2008 - jkupec@suse.cz - pass service's credentials down to repos - support ?credentials=filepath in URL to specify credentials - revision 11092 ------------------------------------------------------------------- Thu Sep 18 09:57:49 CEST 2008 - ma@suse.de - Add Product::isTargetDistribution to identify the systems installed baseproduct. This should replace tests for Product::type is "base". - revision 11089 ------------------------------------------------------------------- Wed Sep 17 18:05:44 CEST 2008 - jkupec@suse.cz - save user credentials when adding repos/services with URLs containing the credentials (bnc #425462) - revision 11085 ------------------------------------------------------------------- Wed Sep 17 15:08:54 CEST 2008 - ma@suse.de - Adapt to rpms new way of quoting whitespace in pathnames.(bnc #426924) - revision 11082 ------------------------------------------------------------------- Tue Sep 16 18:41:39 CEST 2008 - ma@suse.de - Service handling fixes. Added ServiceException. - revision 11077 ------------------------------------------------------------------- Mon Sep 15 11:40:04 CEST 2008 - ma@suse.de - Fix building of transaltions. - revision 11064 ------------------------------------------------------------------- Sun Sep 14 00:10:21 CEST 2008 - jkupec@suse.cz - ServiceInfo.clearReposTo{Enable,Disable}() methods added - revision 11060 ------------------------------------------------------------------- Fri Sep 12 18:24:28 CEST 2008 - ma@suse.de - Create new Service repos in disbaled sate. - revision 11056 - version 5.10.0 (10) ------------------------------------------------------------------- Fri Sep 12 16:04:54 CEST 2008 - ma@suse.de - Make registerTarget and registerRelease abvailable for installed product. Required for registration. - revision 11043 ------------------------------------------------------------------- Fri Sep 12 12:59:50 CEST 2008 - ma@suse.de - Add url lists query to Product interface. A generic query and convenience methods to query urls for "releasenotes", "register", "updateurls", "extraurls", "optionalurls" and "smolt" (bnc #413444) - revision 11029 ------------------------------------------------------------------- Fri Sep 12 01:38:25 CEST 2008 - jkupec@suse.cz - ServiceType and ServiceInfo::type() added (contains only RIS for now), service type probing added. - Avoiding the use of 'path' for services (appending the repoindex.xml's 'path' to the baseurl of created repos) - renamed ServiceInfo::*catalog*() methods to *repo*() methods - revision 11022 ------------------------------------------------------------------- Thu Sep 11 16:01:57 CEST 2008 - dmacvicar@suse.de - add Repostiroy::updateKeys and Repository::providesUpdatesForKey(string) for repo and product matching - Provide Repository::isUpdateRepo ------------------------------------------------------------------- Thu Sep 11 14:41:28 CEST 2008 - ma@suse.de - Fix evaluation of vendor support flags. - Adapt retrieval of registration data (targetDistribution, targetDistributionRelease and targetDistributionFlavor). - revision 11013 ------------------------------------------------------------------- Wed Sep 10 18:23:52 CEST 2008 - ma@suse.de - Follow gpgcheck tag in .repo file and do no check if disabled. - revision 11010 - version 5.9.0 (8) ------------------------------------------------------------------- Wed Sep 10 17:54:20 CEST 2008 - jkupec@suse.cz - added dumpAsXMLOn(stream,string) to ServiceInfo to print services with content (repos) - revision 11004 ------------------------------------------------------------------- Wed Sep 10 17:31:41 CEST 2008 - ma@suse.de - Remove obsolete product attributes. - Store less packages in /var/lib/zypp/SoftLocks (bnc #418050) - revision 11001 ------------------------------------------------------------------- Wed Sep 10 16:40:00 CEST 2008 - ma@suse.de - Provide product::updaterepoKey: Update repository indicator string. - revision 11000 ------------------------------------------------------------------- Tue Sep 9 17:33:03 CEST 2008 - dmacvicar@suse.de - provide context about the repository (name/alias) if available when checking signatures (bnc#370223) - 5.8.0 ------------------------------------------------------------------- Tue Sep 9 13:04:11 CEST 2008 - ma@suse.de - Add ServiceInfo interface to define a set of catalogs (repository aliases) to be enabled on next refresh. - revision 10970 ------------------------------------------------------------------- Tue Sep 9 11:40:42 CEST 2008 - ma@suse.de - Fix reading of Traget::targetDistribution. - Allow to configure default answers in signature verification workflow. - revision 10968 ------------------------------------------------------------------- Mon Sep 8 17:11:02 CEST 2008 - jkupec@suse.cz - CredentialManager added to manage stored credentials - MediaCurl adapted to use CredentialManager to read credentials - revision 10958 ------------------------------------------------------------------- Fri Sep 5 11:40:05 CEST 2008 - jkupec@suse.cz - operator ==, !=, < definition moved to RepoInfoBase from the derived classes - fixed RepoInfo::dumpAsIniOn() to not print 'type' if it is unknown (bnc #407515) - {Repo,Service}Info::dumpAsXMLOn(ostream) added - RepoInfo::dumpRepoOn() deprecated in favor of dumpAsIniOn() - use shared_ptr instead of itrusive for {Repo,Service}Info - revision 10931:10942 ------------------------------------------------------------------- Thu Sep 4 16:47:07 CEST 2008 - jkupec@suse.cz - RepoInfo{,Base} setters made void - revision 10931 ------------------------------------------------------------------- Wed Sep 3 14:53:06 CEST 2008 - jkupec@suse.cz - skip repositories with non-matching target distro when reading repoindex - revision 10926 ------------------------------------------------------------------- Tue Sep 2 11:04:52 CEST 2008 - schubi@suse.de - Enabled distupgrade of the SAT solver. In order to use the old distupgrade you can set the environment variable ZYPP_NO_SAT_UPDATE. This variable will can be used until the old distupgrade mechanism will be removed from libzypp. Have a look to above changelogs. - revision 10911 - version 5.7.0 (5) ------------------------------------------------------------------- Tue Aug 19 16:36:47 CEST 2008 - dmacvicar@suse.de - add Package::maybeUnsupported to remove duplicated code in clients dealing with Package::vendorSupport ------------------------------------------------------------------- Tue Aug 19 11:04:52 CEST 2008 - schubi@suse.de - Reset transaction only if this solvable has no buddy (bnc #417799) e.g. do not reset Products cause the concerning release package could not already be installed. - revision 10883 - version 5.6.1 (5) ------------------------------------------------------------------- Mon Aug 18 17:31:02 CEST 2008 - dmacvicar@suse.de - don't report "may be outdated" for @System repo. ------------------------------------------------------------------- Fri Aug 15 20:20:07 CEST 2008 - ma@suse.de - Add Target::targetDistribution. Returns "distribution-arch" of the installed base product. Used for registration and Service refresh. (for Fate #304915) - revision 10877 - version 5.6.0 (5) ------------------------------------------------------------------- Fri Aug 15 17:42:58 CEST 2008 - ma@suse.de - Add method Product::replacedProducts to identify installed Products that would be replaced by installing a new Product. (for Fate #301997) - revision 10876 ------------------------------------------------------------------- Fri Aug 15 15:30:32 CEST 2008 - ma@suse.de - Fixes to Selectable doing staus manipulation on non-USER level. - revision 10873 ------------------------------------------------------------------- Fri Aug 15 14:23:02 CEST 2008 - ma@suse.de - Add method ZYpp::getTarget that returns the Target or a NULL pointer, if it is not yet initialized. This is to avoid try/catch blocks just to test whether the Target is initialized. (bnc #417556) - Add method Target::assertRootPrefix. Pass a pathname and get back the path prefixed with the tragets root, unless it already had that prefix. - revision 10870 ------------------------------------------------------------------- Thu Aug 14 18:44:45 CEST 2008 - schubi@suse.de - Regarding error messages for Products correctly (FATE #304502) - rev 10863 ------------------------------------------------------------------- Thu Aug 14 14:03:27 CEST 2008 - ma@suse.de - Let Selectable default to USER level. - revision 10850 - version 5.5.1 (5) ------------------------------------------------------------------- Wed Aug 13 21:01:25 CEST 2008 - ma@suse.de - Change Selectable API to support doing staus manipulation on non-USER level. - revision 10847 - version 5.5.0 (5) ------------------------------------------------------------------- Wed Aug 13 16:48:49 CEST 2008 - dmacvicar@suse.de - support sat solver API for searching files ------------------------------------------------------------------- Wed Aug 13 15:12:45 CEST 2008 - ma@suse.de - Add ResPool::reposFind to get repositories by alias. - revision 10835 ------------------------------------------------------------------- Tue Aug 12 19:37:36 CEST 2008 - ma@suse.de - Advise rpmdb2solv to parse the product database. - revision 10824 - version 5.4.0 (4) ------------------------------------------------------------------- Tue Aug 12 12:05:49 CEST 2008 - ma@suse.de - Offer a simpler, fate based status manipulation in ui::Selectable. This is easier to handle, as the ui::Status always distinguishes wheter an object is installed or not. - revision 10814 ------------------------------------------------------------------- Mon Aug 11 18:00:40 CEST 2008 - ma@suse.de - Propagate default rpm install flags from zypp.conf via ZConfig and ZYppCommitPolicy down to the installer. (FATE #302952) - revision 10813 ------------------------------------------------------------------- Mon Aug 11 16:28:07 CEST 2008 - ma@suse.de - Add base::Flags (like qt's QFlags) a type-safe way of storing OR-combinations of enum values. - revision 10811 ------------------------------------------------------------------- Fri Aug 8 17:01:00 CEST 2008 - ma@suse.de - Add static ui::Selectable::get methods as convenient ctor substitute. - revision 10806 ------------------------------------------------------------------- Fri Aug 8 15:41:17 CEST 2008 - ma@suse.de - Adapt zypp-query-pool to new product handling. - revision 10803 ------------------------------------------------------------------- Fri Aug 8 14:11:03 CEST 2008 - ma@suse.de - Don't pass epoch to 'rpm -e', it does not support it. - revision 10800 ------------------------------------------------------------------- Fri Aug 8 13:27:42 CEST 2008 - ma@suse.de - Adapt to new product handling. Products are no longer pseudo installed objects verified by the solver, but actually installed. Thus removed satisfiedProduct iterator, fixed Selctables. - Removed class ProductInfo as we keep Product. - revision 10797 ------------------------------------------------------------------- Thu Aug 7 22:00:55 CEST 2008 - dmacvicar@suse.de - implement relogin suggested support (fate#304889) ------------------------------------------------------------------- Wed Aug 6 18:21:30 CEST 2008 - ma@suse.de - Detect correct download path even if repository type is not set. (bnc #386386) - revision 10768 ------------------------------------------------------------------- Wed Aug 6 17:15:48 CEST 2008 - ma@suse.de - Cleanup, mostly by removing, unused parser code and related classes. - revision 10765 ------------------------------------------------------------------- Wed Aug 6 16:23:27 CEST 2008 - ma@suse.de - Don't let exception escape MediaSetAccess dtor (bnc #415017) - revision 10763 ------------------------------------------------------------------- Mon Aug 4 19:34:27 CEST 2008 - ma@suse.de - Add new product attributes (flavor,referencePackage). - Add PoolItem buddies, i.e. two PoolItems sharing the same status object. This is used to keep the product resolvable and the package providing the product metadata in sync. - revision 10742 ------------------------------------------------------------------- Sat Aug 2 19:26:52 CEST 2008 - jkupec@suse.cz - support an optional url attribute in repoindex.xml's - revision 10729 ------------------------------------------------------------------- Thu Jul 31 21:52:11 CEST 2008 - ma@suse.de - New class ProductInfo to provide product related metadata that might be associated with a package. This will replace the Product resolvable. - revision 10715 ------------------------------------------------------------------- Thu Jul 31 19:01:54 CEST 2008 - dmacvicar@suse.de - generate a unique anonymous unique string per target and add it to the agent string for better statistics ------------------------------------------------------------------- Thu Jul 31 19:01:14 CEST 2008 - ma@suse.de - Follow solver policy and make repository priority the highest key, when ordering packages. Then architecture, and edition last. - revision 10710 ------------------------------------------------------------------- Wed Jul 30 19:12:00 CEST 2008 - ma@suse.de - /var/lib/zypp and /var/cache/zypp should be owned by libzypp (bnc #412094) - revision 10702 ------------------------------------------------------------------- Wed Jul 30 12:47:48 CEST 2008 - jkupec@suse.cz - Service renamed to ServiceInfo - RepoInfoBase added; RepoInfo and ServiceInfo now derive from it - revision 10695 ------------------------------------------------------------------- Tue Jul 29 12:59:46 CEST 2008 - jkupec@suse.cz - fixed yum repos to work with non '/' base url post fix (bnc #341617) - revision 10662 ------------------------------------------------------------------- Mon Jul 28 18:13:24 CEST 2008 - ma@suse.de - Fixed SolvIterMixin::Selectable_iterator eating some solvables (bnc #411339) - revision 10680 ------------------------------------------------------------------- Fri Jul 25 20:12:55 CEST 2008 - ma@suse.de - Several changes to make libzypp-bindings compile using the original header files and no private copies. (bnc #391831) - revision 10668 - version 5.3.0 ------------------------------------------------------------------- Wed Jul 23 17:17:47 CEST 2008 - jkupec@suse.cz - Service::enabled() added - revision 10657 ------------------------------------------------------------------- Tue Jul 22 17:18:28 CEST 2008 - jkupec@suse.cz - Removed FRESHENS dependency type - revision 10643 ------------------------------------------------------------------- Thu Jul 17 09:49:40 CEST 2008 - schubi@suse.de - Allow parallel installation of packages which have been defined in zypp.conf (parameter "multiversion") Fate #302050 - Additional check for broken system. (defined in zypp.conv: solver.checkSystemFile) - revision 10600 ------------------------------------------------------------------- Wed Jul 16 14:39:50 CEST 2008 - ma@suse.de - Add ui::Selectable::isNeeded to indicate patch relevance (bnc #409150) - revision 10596 ------------------------------------------------------------------- Wed Jul 16 01:10:37 CEST 2008 - ma@suse.de - Remove Atom, Script, Message and other obsolete classes. - revision 10592 ------------------------------------------------------------------- Mon Jul 14 13:36:26 CEST 2008 - ma@suse.de - Also report the name of the locking process in ZYppFactoryException (bnc #280537) - revision 10572 ------------------------------------------------------------------- Mon Jul 14 11:26:30 CEST 2008 - schubi@suse.de - corrected logging of solver settings - regard locking while doUpdate (bnc #405427) - revision 10564 ------------------------------------------------------------------- Sat Jul 12 22:14:32 CEST 2008 - jkupec@suse.cz - make curl use the right transfer mode (CURLOPT_PROXY_TRANSFER_MODE) when proxy is used (bnc #306272) - revision 10559 ------------------------------------------------------------------- Sat Jul 12 11:19:56 CEST 2008 - jkupec@suse.cz - reuse existing disk mounts (applied Marius' patch) (bnc #208222) - revision 10557 ------------------------------------------------------------------- Wed Jul 9 18:13:58 CEST 2008 - ma@suse.de - Provide Package::url() if available in solv file. (bnc #402434) - A missing cookie file must not be treated as an error. Simply rebuild the cache (bnc #405867) - Add 22x22 and 24x24 icons (bnc #329635) - revision 10528 ------------------------------------------------------------------- Mon Jul 7 13:39:09 CEST 2008 - schubi@suse.de - Do not update an already updated package (bnc #400422) - revision 10504 ------------------------------------------------------------------- Fri Jul 4 17:19:24 CEST 2008 - ma@suse.de - Also check if the fingerprint matches before importing updated keys. (bnc #393160) - revision 10500 ------------------------------------------------------------------- Mon Jun 30 23:55:20 CEST 2008 - dmacvicar@suse.de - forward port add message attribute to patches. - port import newer keys if a trusted key is updated - (bnc#393160) - version 5.0.2 ------------------------------------------------------------------- Mon Jun 30 10:28:27 CEST 2008 - ma@suse.de - Fix permanent duplication of gpg keys in the rpm database. Also retrieve correct creation and expire dates. (bnc #401259) - Invoke gpg with --homdir, otherwise command fails if executed within a wrapper. (bnc #401259) - revision 10487 ------------------------------------------------------------------- Thu Jun 26 12:07:33 CEST 2008 - schubi@suse.de - version 5.0.1 - revision 10464 ------------------------------------------------------------------- Thu Jun 19 17:55:35 CEST 2008 - ma@suse.de - Handle new patch messages and scripts in commit. Provide callbacks to display the patch messages and give visual feedback on script execution. (bnc #401220) - revision 10411 ------------------------------------------------------------------- Thu Jun 19 17:35:59 CEST 2008 - ma@suse.de - Fix wrong parenthesis causing bug 399320 - version - revision ------------------------------------------------------------------- Tue Jun 10 09:52:03 CEST 2008 - jreidinger@suse.cz - improve performance of gsub - change replace_all to replaceAll (same name convency) - add tests for gsub and replaceAll - revision 10366 ------------------------------------------------------------------- Fri Jun 6 13:29:59 CEST 2008 - ma@suse.de - Handle application/x-redhat-package-manager in package-manager.desktop (bnc #391183) - revision 10361 ------------------------------------------------------------------- Thu Jun 5 18:01:15 CEST 2008 - jkupec@suse.cz - X-SuSE-ControlCenter-System category added to package-manager.desktop (bnc #302324) - revision 10353 ------------------------------------------------------------------- Wed Jun 4 14:57:13 CEST 2008 - ma@suse.de - Fix crash when requesting disk usage without a target loaded. (bnc #396755) - revision 10340 ------------------------------------------------------------------- Wed Jun 4 14:05:09 CEST 2008 - ma@suse.de - Fix memory corruption in curl media handler (bnc #396979) - revision 10338 ------------------------------------------------------------------- Tue Jun 3 20:00:00 CEST 2008 - ma@suse.de - Take care satsolver recognizes 'Capability( "srcpackage:zypper" )' as 'source package named zypper'. So these capabilities can be used together with sat::Whatprovides or in resolver requests. (bnc #369893) - revision 10335 ------------------------------------------------------------------- Tue Jun 3 15:40:37 CEST 2008 - jreidinger@suse.cz - allow aborting progress during removing packages. (bnc #389238) - revision 10331 ------------------------------------------------------------------- Mon Jun 2 15:31:36 CEST 2008 - schubi@suse.de - New option for ignoring Obsoletes. This is used for installing more than one pacakges with the same name but different versions. Often used by kernel. - r 10299 ------------------------------------------------------------------- Sun Jun 1 23:14:34 CEST 2008 - - ma@suse.de - Revert inappropriate Selectable cleanup. Fix Selectable status computation. Unmaintained packages were wrongly reported as unsinstalled. (bnc #394630) - version 5.0.0 (4.x continued in SuSE-Linux-11_0-Branch) - revision 10295 ------------------------------------------------------------------- Fri May 30 12:14:47 CEST 2008 - tgoettlicher@suse.de - fixed typo ------------------------------------------------------------------- Wed May 28 18:54:27 CEST 2008 - ma@suse.de - Reenable diskusage calculation (bnc #395051) - version 4.25.1 - revision 10273 ------------------------------------------------------------------- Wed May 28 18:50:11 CEST 2008 - jkupec@suse.cz - RepoManager::packagesPath(RepoInfo) added (bnc #394728) - revision 10271 ------------------------------------------------------------------- Wed May 28 16:26:09 CEST 2008 - jkupec@suse.cz - RepoInfo: don't overwrite flags that have already been set externally (bnc #394728) - revision 10256 ------------------------------------------------------------------- Wed May 28 15:30:24 CEST 2008 - ma@suse.de - Create missing directories when saving config files. (bnc #395026) - Fix undefined behaviour in RepoManager. - revision 10255 ------------------------------------------------------------------- Wed May 28 15:23:44 CEST 2008 - schubi@suse.de - SOLVER_ERASE_SOLVABLE_NAME: As we do not know, if this request has come from resolvePool or resolveQueue we will have to take care for both cases. (bnc#393969) - r 10252 ------------------------------------------------------------------- Tue May 27 22:35:37 CEST 2008 - coolo@suse.de - compile with RPM_OPT_FLAGS ------------------------------------------------------------------- Mon May 26 17:23:24 CEST 2008 - jkupec@suse.cz - old2new locks file converter script added to %post (jredinger) - r 10227 ------------------------------------------------------------------- Mon May 26 11:48:35 CEST 2008 - schubi@suse.de - Do not regard packages with the same name while upgrading obsoleted packages (bnc#394367) - r 10219 ------------------------------------------------------------------- Sat May 24 01:23:44 CEST 2008 - dmacvicar@suse.de - revert commit don't check for existence of keys, to avoid a non needed HEAD request. (related bnc#381280) as it creates popup error callbacks due to the 404's in the keys. Leave however the OnMediaLocation::optional() API to look for another fix strategy. ------------------------------------------------------------------- Fri May 23 15:52:20 CEST 2008 - dmacvicar@suse.de - define path for messages and scripts and document them in zypp.conf ------------------------------------------------------------------- Fri May 23 14:42:34 CEST 2008 - schubi@suse.de - Added IgnoreAlreadyRecommended flag. So recomments/suggest will be ignored for already INSTALLED packages (bnc #389694) - r 10202 ------------------------------------------------------------------- Fri May 23 10:22:47 CEST 2008 - schubi@suse.de - Packages which obsoletes and do NOT required other installed packages will be installed if no other packages obsolete the installed package too. - r 10196 ------------------------------------------------------------------- Thu May 22 02:22:29 CEST 2008 - dmacvicar@suse.de - fix filelist for installed packages (bnc#392544) - fix changelog retrieval for installed packages ------------------------------------------------------------------- Wed May 21 13:50:00 CEST 2008 - dmacvicar@suse.de - deprecate Repository::name() and use alias() to be consistent. Related to (bnc#383553) - don't check for existence of keys, to avoid a non needed HEAD request. (helps bnc#381280) - 4.25.0 ------------------------------------------------------------------- Wed May 21 11:37:23 CEST 2008 - schubi@suse.de - added onlyRequires in the testcase (bnc #389184) ------------------------------------------------------------------- Tue May 20 12:12:27 CEST 2008 - jreidinger@suse.cz - allow installation and refreshing from repository with alias that contains ' or " (bnc #392426) - r10158 ------------------------------------------------------------------- Mon May 19 21:11:41 CEST 2008 - jkupec@suse.cz - delta rpm support reenabled - r10150 ------------------------------------------------------------------- Mon May 19 18:13:19 CEST 2008 - schubi@suse.de - Resetting Delete Details in ResStatus correctly (bnc #391785) - r 10145 ------------------------------------------------------------------- Mon May 19 11:47:06 CEST 2008 - dmacvicar@suse.de - when setting status to non installed for uninstalled packages set the user transaction so they go to soft locks. (related to bnc#389739 ) ------------------------------------------------------------------- Fri May 16 16:56:04 CEST 2008 - schubi@suse.de - Added new calls : isInstalledBy (const PoolItem item); installs (const PoolItem item); - r 10125 - 4.23.0 ------------------------------------------------------------------- Fri May 16 16:49:04 CEST 2008 - jreidinger@suse.cz - don't run merge in save when toAdd/Remove queue is empty - throw when locks cannot load its file - r10124 ------------------------------------------------------------------- Fri May 16 09:59:09 CEST 2008 - jreidinger@suse.cz - throw more describing exception when repo probing failed (bnc #389690) - revision 10118 ------------------------------------------------------------------- Thu May 15 15:15:59 CEST 2008 - jreidinger@suse.cz - allow call only merge old locks and newly added/removed without saving it to file - -revision 10104 ------------------------------------------------------------------- Tue May 13 17:37:11 CEST 2008 - dmacvicar@suse.de - report non packages as keep installed if satisfied to the user interace (Selectables) - 4.21.3 ------------------------------------------------------------------- Tue May 13 15:50:28 CEST 2008 - jkupec@suse.cz - create /etc/zypp/products.d on install ------------------------------------------------------------------- Mon May 12 17:21:19 CEST 2008 - jkupec@suse.cz - /etc/zypp/products.d added to file list (bnc #385868) - revision 10049 - version 4.21.2 ------------------------------------------------------------------- Mon May 12 17:15:34 CEST 2008 - jkupec@suse.cz - call RemoveResolvableReport::problem() before finish() on error (bnc #388810) - revision 10045 ------------------------------------------------------------------- Sat May 10 21:57:29 CEST 2008 - coolo@suse.de - fix file list ------------------------------------------------------------------- Fri May 9 23:15:53 CEST 2008 - ma@suse.de - Product now retrieves all attributes from the solv file. - version 4.21.1 - revision 10031 ------------------------------------------------------------------- Fri May 9 21:28:42 CEST 2008 - ma@suse.de - Add zypp.conf option configdir (/etc/zypp) and arrange all config files and directories to follow {configdir} per default. - Fix zypp-query-pool to print satisfied products and additional products defined in {configdir}/products.d for registration. (bnc #385868) - version 4.21.0 - revision 10029 ------------------------------------------------------------------- Fri May 9 15:30:40 CEST 2008 - jreidinger@suse.cz - implement remove duplicate entries in lock file (bnc#385967) ------------------------------------------------------------------- Fri May 9 15:15:32 CEST 2008 - ma@suse.de - Speedup rpmdb2solv by reusing an existing solv file. - version 4.20.1 - revision 10012 ------------------------------------------------------------------- Thu May 8 18:13:54 CEST 2008 - ma@suse.de - Fix failed package download due to unkown repository type (bnc #386386) - revision 9995 ------------------------------------------------------------------- Thu May 8 16:33:37 CEST 2008 - ma@suse.de - Support optional root argument to RepoManagerOptions, to prefix all path names taken from ZConfig. (bnc #388265) - version 4.20.0 - revision 9993 ------------------------------------------------------------------- Thu May 8 14:21:51 CEST 2008 - schubi@suse.de - new solution action for removing requirements/conflicts (bnc #387631) - revision 9988 ------------------------------------------------------------------- Thu May 8 10:56:49 CEST 2008 - ma@suse.de - Provide enumerated patch category 'Patch::categoryEnum()' (bnc #159100) - revision 9984 ------------------------------------------------------------------- Wed May 7 13:52:24 CEST 2008 - schubi@suse.de - DistUpgrade: searching for providers -> regarding name onl - r 9977 ------------------------------------------------------------------- Tue May 6 17:35:59 CEST 2008 - dmacvicar@suse.de - add flag --registrable (-r) to query pool to avoid using system as a filter - 4.19.1 ------------------------------------------------------------------- Tue May 6 07:37:22 CEST 2008 - coolo@suse.de - return values in non-void functions ------------------------------------------------------------------- Mon May 5 14:08:20 CEST 2008 - jkupec@suse.cz - support multiple search strings in PoolQuery (ORed) - revision 9945 ------------------------------------------------------------------- Mon May 5 09:55:29 CEST 2008 - schubi@suse.de - Switch off the upgrade mode of the SAT solver cause the packages have already been evaluated by the distupgrade machanism of libzypp. (bnc #386375) - rev 9943 ------------------------------------------------------------------- Fri May 2 16:36:04 CEST 2008 - jreidinger@suse.cz - release file after copy to cache as soon as possible. (bnc #381311) - r9940 ------------------------------------------------------------------- Fri May 2 16:28:05 CEST 2008 - schubi@suse.de - Bugfix: keep states by user has been removed it the package has not been installed BUT has been recommended by another package. (bnc #385832) - rev 9938 ------------------------------------------------------------------- Fri May 2 12:19:22 CEST 2008 - jreidinger@suse.cz - add isLocal function to Url which say if scheme is local or internet. - r9932 ------------------------------------------------------------------- Fri May 2 09:36:18 CEST 2008 - jreidinger@suse.cz - cache decision for repository depend on his url. - http,ftp and smb cache packages. - revision 9929 ------------------------------------------------------------------- Thu May 1 00:50:51 CEST 2008 - ma@suse.de - Load and maintain persistent hard locks stored in /etc/zypp/locks. Locks are loaded together with the target, and changes are writen back on commit. zypp.conf option locksfile.apply can be used to turn this feature on or off. (FATE #120352) - version 4.18.0 - revision 9927 ------------------------------------------------------------------- Wed Apr 30 16:27:49 CEST 2008 - ma@suse.de - Add zypp.conf option solvfilesdir: Path where the repo solv files are created. Default value: {cachedir}/solv. - Target and repositories now save their solvfiles below {solvfilesdir} in directories named after the repositories alias. - version 4.18.0 - revision 9913 ------------------------------------------------------------------- Wed Apr 30 14:19:16 CEST 2008 - jkupec@suse.cz - fixed filesystem::expandlink(Pathname) (bnc #368477) - r9906 ------------------------------------------------------------------- Tue Apr 29 16:37:19 CEST 2008 - schubi@suse.de - cleanup in return values of doUpgrade and doUpdate - r9886 - 4.17.0 ------------------------------------------------------------------- Mon Apr 28 18:27:54 CEST 2008 - jkupec@suse.cz - check for valid pool in begin(), improve the code (bnc #384337) - r9872 - 4.16.0 ------------------------------------------------------------------- Mon Apr 28 15:40:09 CEST 2008 - mvidner@suse.cz - Updated package-manager-su from xdg-utils-1.0.2-48 (bnc#339549). ------------------------------------------------------------------- Mon Apr 28 15:25:46 CEST 2008 - schubi@suse.de - added translations ------------------------------------------------------------------- Mon Apr 28 11:15:47 CEST 2008 - jkupec@suse.cz - ostream operator<<(ostream,TriBool) added - r9833 ------------------------------------------------------------------- Fri Apr 25 16:12:12 CEST 2008 - ma@suse.de - Prevent target::unload from creating a system repo in order to unload it. (bnc 382297) - version 4.15.2 - revision 9822 ------------------------------------------------------------------- Fri Apr 25 14:15:17 CEST 2008 - ma@suse.de - Prevent deselected or deleted items from being re-selected due to recommends (aka. persistent soft locks). Unlike hard locked, those items will be automatically selected if required. The list of soft locked items is stored in /var/lib/zypp/SoftLocks. - version 4.15.1 - revision 9818 ------------------------------------------------------------------- Wed Apr 23 22:24:00 CEST 2008 - ma@suse.de - Remove obsolete AdditionalCapabilities interface from ResPool. Forward sat::Pool::RepositoryIterator. There's no more need to maintain an extra Repository list in ResPool. - revision 9806 ------------------------------------------------------------------- Wed Apr 23 21:12:56 CEST 2008 - ma@suse.de - Support dependencies requiring a specific architecture: "name[.arch] [op edition]". See class Capability for details about how to construct dependencies. (bnc #305445) - version 4.15.0 - revision 9805 ------------------------------------------------------------------- Tue Apr 22 17:39:28 CEST 2008 - dmacvicar@suse.de - patch attributes and deprecate old ones - 4.14.0 ------------------------------------------------------------------- Tue Apr 22 15:44:34 CEST 2008 - jreidinger@suse.cz - change locks api - - make more functions const - replace add/remove by selectable to add/remove by ident or name and kind - rename iterator to const_iterator to avoid confusion - revision 9781 ------------------------------------------------------------------- Tue Apr 22 13:55:14 CEST 2008 - schubi@suse.de - Do architecture changes while "dup" in the external distribution upgrade ONLY. bnc #382274 - Added "ignore" to the solutions - Added "self-conflicts" to the solution - added new solver mechanism "resolveQueue" - Bugfix broken/satisfied products - rev 9776 ------------------------------------------------------------------- Tue Apr 22 10:33:03 CEST 2008 - ma@suse.de - Added Pattern::core returning the packages required by a pattern. (see also Pattern::depends and Pattern::contents). - revision 9771 ------------------------------------------------------------------- Mon Apr 21 15:38:10 CEST 2008 - ma@suse.de - Added Target::release(), returning the targets distribution release string. - revision 9761 ------------------------------------------------------------------- Sat Apr 19 01:08:04 CEST 2008 - ma@suse.de - per default abort if package installation fails. (bnc #381203) - version 4.13.3 - revision 9725 ------------------------------------------------------------------- Fri Apr 18 15:19:36 CEST 2008 - dmacvicar@suse.de - add ZYpp and curl version to http agent string (bnc #381280) ------------------------------------------------------------------- Thu Apr 17 16:29:15 CEST 2008 - ma@suse.de - Fixed pools package index wrongly including source packages. (bnc #380283) - version 4.13.2 - revision 9683 ------------------------------------------------------------------- Wed Apr 16 15:00:19 CEST 2008 - ma@suse.de - Disable fast creation of @System.solv. It may produce wrong results e.g. after a rebuilddb. - version 4.13.1 - revision 9666 ------------------------------------------------------------------- Wed Apr 16 12:50:09 CEST 2008 - ma@suse.de - initializeTarget now takes an additional option, telling whether to rebuild an existing rpm database before using it. Default is false. (bnc #308352) - version 4.13.0 - revision 9664 ------------------------------------------------------------------- Tue Apr 15 12:57:42 CEST 2008 - jreidinger@suse.cz - save do nothing if no locks added/removed - fix bug with multiple save lock - don't save same query multiple times - improve tests - revision 9644 ------------------------------------------------------------------- Tue Apr 15 09:34:29 CEST 2008 - schubi@suse.de - added new translations - activate zypp-query-pool - Revision 9637 - 4.12.1 ------------------------------------------------------------------- Tue Apr 15 00:54:07 CEST 2008 - jkupec@suse.cz - Locks API cleaned-up, iterator added, light read() added - PoolQuery::attribute(SolvAttr) getter added - revision 9609 ------------------------------------------------------------------- Mon Apr 14 17:00:05 CEST 2008 - dmacvicar@suse.de - reenable zypp-query-pool - 4.11.1 ------------------------------------------------------------------- Mon Apr 14 12:53:09 CEST 2008 - ma@suse.de - Enable evaluation of hardware dependencies. - Enable evaluation of filesystem dependencies. - revision 9605 ------------------------------------------------------------------- Sun Apr 13 02:17:25 CEST 2008 - jkupec@suse.cz - RawMetadataRefreshPolicy: CheckIfNeededIgnoreDelay added needed for explicit refresh request - revision 9574 ------------------------------------------------------------------- Fri Apr 11 21:55:21 CEST 2008 - ma@suse.de - Install ResPoolProxy index to speedup Solvable to Selectable conversion. - version 4.11.0 - revision 9558 ------------------------------------------------------------------- Fri Apr 11 18:02:14 CEST 2008 - kkaempf@suse.de - Implement update scripts installed by packages. After every package install /var/adm/update-scripts is scanned for the first file starting with "-.-", which is then executed. - revision 9547 ------------------------------------------------------------------- Fri Apr 11 14:43:05 CEST 2008 - ma@suse.de - Fix SolvIterMixin to avioid multiple visits of the same Selectable. - Add Resolvable::poolItem() providing access to the corresponding PoolItem. API to query isRelevant/isSatisfied/isBroken was moved to PoolItem. - Add ResPool::satisfiedProductsBegin/End iterator over all products whose dependencies are satisfied. This reflects the status determined by the last solver run. (#368104) - revision 9535 ------------------------------------------------------------------- Fri Apr 11 12:07:47 CEST 2008 - jreidinger@suse.cz - switch to new locks api - revision 9524 ------------------------------------------------------------------- Wed Apr 9 21:24:54 CEST 2008 - ma@suse.de - Enable ui::Selectable lookup by Solvable/PoolItem in ResPoolProxy. - Add SolvIterMixin: Base class providing PoolItem_iterator and Selectable_iterator iterator types based on a Solvable iterator. - Enhanced WhatProvides and SolvableSet to PoolItem_iterator to offer PoolItem_iterator and Selectable_iterator. - Add Solvable::SplitIdent: Helper class that splits an identifier into kind and name. - Provide methods Pattern::contents returning a collection of packages associated with the pattern/patch. - revision 9496 ------------------------------------------------------------------- Tue Apr 8 15:50:48 CEST 2008 - jreidinger@suse.cz - add comparing to PoolQuery - revision 9466 ------------------------------------------------------------------- Tue Apr 8 13:18:30 CEST 2008 - jreidinger@suse.cz - move RepoInfo to universal RepoException. This can enable more verbose output - for frontend. (helps with bnc #377137) - revision 9452 ------------------------------------------------------------------- Tue Apr 8 10:52:30 CEST 2008 - jreidinger@suse.cz - initial implementation of new locks (FATE #120118 and #120352) - revision 9442 ------------------------------------------------------------------- Tue Apr 7 15:18:22 CEST 2008 - dmacvicar@suse.de - selectable API updates and changes - 4.10.0 ------------------------------------------------------------------- Fri Apr 4 14:01:45 CEST 2008 - jreidinger@suse.cz - add split with respect to escaped delimeters and also for quotes - revision 9373 ------------------------------------------------------------------- Thu Apr 3 12:55:50 CEST 2008 - ma@suse.de - Fixed some missing package and source package attributes. - revision 9348 ------------------------------------------------------------------- Thu Apr 3 11:59:13 CEST 2008 - ma@suse.de - Allow to store a media label in MediaSetAccess. This label is passed to a media change requests to describe which CD is requested. (bnc #330094) - Fixed some missing package and source package attributes. - revision 9347 ------------------------------------------------------------------- Wed Apr 2 13:48:52 CEST 2008 - schubi@suse.de - Moved poolItem.status().isSatisfied(),.... to poolItem.isSatisfied() - Removed establish state in ResStatus - revision 9337 - version 4.7.0 ------------------------------------------------------------------- Wed Apr 2 10:24:17 CEST 2008 - ma@suse.de - Add PoolItem::isSatisfied()/isBroken() to test whether the items requirements are met. - revision 9334 ------------------------------------------------------------------- Tue Apr 1 21:54:10 CEST 2008 - ma@suse.de - Extend sat::WhatProvides allows one to query for possible providers of a collection of capabilies. E.g. all providers of a packages requirements. - Fixed retrieval of translated texts from .solv files, provided the solv file contains them. - revision 9328 ------------------------------------------------------------------- Tue Apr 1 16:17:44 CEST 2008 - jreidinger@suse.cz - initial implementation of serialize/recovery PoolQuery (needed by FATE #120118) - revision 9325 ------------------------------------------------------------------- Wed Mar 26 16:15:24 CET 2008 - ma@suse.de - Allow prioritizing repos by adding a line 'priority=N' to the .repo file. Where N is an integer number from 1 (highest prio) to 99 (least and default). (bnc #369827, fate #302872) - version 4.6.1 - revision 9276 ------------------------------------------------------------------- Mon Mar 24 21:17:05 CET 2008 - coolo@suse.de - support plaindir again (at least the most important parts) ------------------------------------------------------------------- Fri Mar 21 13:23:13 CET 2008 - jreidinger@suse.cz - Throwing special exception MediaBadCAException in case of SSL certificate validation failure.(bnc #223512) - revision 9250 ------------------------------------------------------------------- Fri Mar 21 12:38:39 CET 2008 - jreidinger@suse.cz - add new error IO_SOFT to media request callback for temporary connection problem. (bnc #328822) - add new media exception timeout when somethink fail due to exceed timeout - mediacurl throw timeout exception when timeouted - revision 9246 ------------------------------------------------------------------- Thu Mar 20 15:00:24 CET 2008 - jreidinger@suse.cz - return more information from checking if metadata need refresh, so user can get better info. (bnc #307249) - revision 9231 ------------------------------------------------------------------- Tue Mar 18 21:59:04 CET 2008 - ma@suse.de - class sat::LocaleSupport: Convenience methods to manage support for language specific packages. - revision 9197 ------------------------------------------------------------------- Tue Mar 18 13:54:16 CET 2008 - jkupec@suse.cz - removed obsolete capability handling stuff (ma) - version 4.5.0 ------------------------------------------------------------------- Tue Mar 18 11:42:51 CET 2008 - jreidinger@suse.cz - Don't mask skip and abort exception in Fetcher - revision 9188 ------------------------------------------------------------------- Tue Mar 18 11:00:22 CET 2008 - jreidinger@suse.cz - action is correctly set in mediaRequest callback - revision 9186 ------------------------------------------------------------------- Mon Mar 17 12:33:44 CET 2008 - ma@suse.de - Fix SEGV in commit (bnc# 371137) - version 4.4.3 - revision 9174 ------------------------------------------------------------------- Fri Mar 14 17:28:39 CET 2008 - ma@suse.de - version 4.4.2 ------------------------------------------------------------------- Fri Mar 14 14:27:43 CET 2008 - dmacvicar@suse.de - look for openssl in cmake, actually we build require it - explicitly link against openssl and crypto, required to compile in all platforms/distros. ------------------------------------------------------------------- Fri Mar 14 12:07:41 CET 2008 - jreidinger@suse.cz - Save repo type during refresh if type is NONE (f.e. lazy probing). - revision 9153 ------------------------------------------------------------------- Fri Mar 14 11:34:24 CET 2008 - jreidinger@suse.cz - replace gpg escaped semicolon with real semicolon (bnc #355434) - revision 9151 ------------------------------------------------------------------- Fri Mar 14 10:17:41 CET 2008 - jreidinger@suse.cz - make strings from RpmDb and Keyring exceptions translatable - revision 9146 ------------------------------------------------------------------- Thu Mar 13 18:41:26 CET 2008 - dmacvicar@suse.de - fix retrieving keys (bnc #368099) - version 4.4.1 ------------------------------------------------------------------- Thu Mar 13 18:40:57 CET 2008 - jreidinger@suse.cz - enable frontend to rewrite add_probe settings.(bnc #309612) - Correct adding repo without type to lazy probing. - revision 9135 ------------------------------------------------------------------- Thu Mar 13 17:59:52 CET 2008 - jreidinger@suse.cz - get better message if something fail when trying run rpm (bnc #344584) - revision 9133 ------------------------------------------------------------------- Thu Mar 13 12:33:13 CET 2008 - ma@suse.de - Add ExternalProgram::execError and ExternalProgram::command to improve error reporting. - revision 9112 ------------------------------------------------------------------- Thu Mar 13 11:45:20 CET 2008 - jkupec@suse.cz - release all media before requesting another (bnc #336881) - revision 9110 ------------------------------------------------------------------- Thu Mar 13 11:32:56 CET 2008 - jkupec@suse.cz - getDetectedDevices added (fate #120298) - revision 9108 ------------------------------------------------------------------- Wed Mar 12 15:55:14 CET 2008 - jkupec@suse.cz - media backend release() methods changed to take string & instead of bool (needed for FATE #120298) - media label, detected device list and current device arguments added to the requestMedia callback - version 4.4.0 ------------------------------------------------------------------- Wed Mar 12 14:16:07 CET 2008 - coolo@suse.de - fix for bnc#369543 ------------------------------------------------------------------- Mon Mar 10 13:30:04 CET 2008 - jkupec@suse.cz - provide download rate info (average and curent) in the media::DownloadProgressReport for ftp/http (bnc #168935) - r9074 ------------------------------------------------------------------- Mon Mar 10 12:45:03 CET 2008 - jkupec@suse.cz - cleanCache(): clean also .cookie files - cleanTargetCache() added - use escaped_alias() in rawcache_path_for_repoinfo() and packagescache_path_for_repoinfo() - r9068 ------------------------------------------------------------------- Fri Mar 7 19:59:10 CET 2008 - jkupec@suse.cz - fixed location of RPMs in subdirs when parsing plaindir repo recursively (bnc #368218) - revision 9060 ------------------------------------------------------------------- Thu Mar 6 13:42:53 CET 2008 - ma@suse.de - Do not filter any installed solvables. - revision 9031 - version 4.3.2 ------------------------------------------------------------------- Wed Mar 5 11:33:26 CET 2008 - ma@suse.de - Try to rebuild broken solv files in Target::load. - revision 9015 ------------------------------------------------------------------- Tue Mar 4 18:17:41 CET 2008 - ma@suse.de - Try to rebuild broken solv files in RepoManager::loadFromCache. - Fix RepoStatus::operator&& and RepoStatus testsuite. - revision 9008 ------------------------------------------------------------------- Tue Mar 4 16:09:14 CET 2008 - schubi@suse.de - improved problem description while a vendor change - improved problem description if a requirement cannot be fulfilled. Bug #358560 - revision 9002 ------------------------------------------------------------------- Tue Mar 4 12:57:58 CET 2008 - ma@suse.de - Save and restore requested locales on target load/commit. - revision 8999 ------------------------------------------------------------------- Mon Mar 3 17:10:26 CET 2008 - schubi@suse.de - (Update) Prevent reinstallation of installed packages. - revision 8984 ------------------------------------------------------------------- Sun Mar 2 16:13:16 CET 2008 - coolo@suse.de - refresh metadata if there is no cache to unbreak compat with kiwi (that relied on "zypper sa " to create a repo that "zypper in" could work on) ------------------------------------------------------------------- Sun Mar 2 10:28:13 CET 2008 - coolo@suse.de - create cache directory before calling rpmdb2solv (in an empty chroot) - version 4.3.1 ------------------------------------------------------------------- Thu Feb 28 16:43:11 CET 2008 - jkupec@suse.cz - special exception message if server returns 403 response (forbidden) (port from SP2) - MediaException messages marked for translation ------------------------------------------------------------------- Wed Feb 27 10:31:24 CET 2008 - dmacvicar@suse.de - make sure we have target cache on target initialize - version 4.3.0 ------------------------------------------------------------------- Tue Feb 26 13:59:03 CET 2008 - lslezak@suse.cz - DiskUsageCounter.cc - ignore "vfat", "fat", "ntfs" and "ntfs-3g" file systems (#333166) - rev. 8915 ------------------------------------------------------------------- Tue Feb 26 13:26:30 CET 2008 - ma@suse.de - Fixed Capabilites iterator exposing prereq marker. - revision 8914 ------------------------------------------------------------------- Tue Feb 26 11:29:05 CET 2008 - schubi@suse.de - postinstall script fixed - version 4.2.10 ------------------------------------------------------------------- Mon Feb 25 17:06:53 CET 2008 - schubi@suse.de - Testcases regards modaliases, rpmlib, ... correctly - Revision 8904 ------------------------------------------------------------------- Mon Feb 25 13:20:26 CET 2008 - ma@suse.de - Remove obsolete sql database. (bnc#363224) - revision 8898 ------------------------------------------------------------------- Fri Feb 22 14:03:59 CET 2008 - ma@suse.de - Take care target uses --root when creating solv files (bnc #363789) - revision 8881 ------------------------------------------------------------------- Fri Feb 22 10:10:14 CET 2008 - schubi@suse.de - Unmaintained packages which does not fit to the updated system (broken dependencies) will be deleted. - revision 8867 ------------------------------------------------------------------- Fri Feb 22 07:20:35 CET 2008 - coolo@suse.de - let libzypp-devel require libsatsolver-devel ------------------------------------------------------------------- Wed Feb 20 13:47:56 CET 2008 - ma@suse.de - Cleanup unused /var/lib/zypp/cache in migrate_sources (#305160) - revision 8833 ------------------------------------------------------------------- Tue Feb 19 16:21:12 CET 2008 - jkupec@suse.cz - media: fixed DownloadProgressReport.finish() url argument in doGetFileCopy() - revision 8815 ------------------------------------------------------------------- Tue Feb 19 11:21:59 CET 2008 - dmacvicar@suse.de - hardlink when possible to optimize data transfer and space across caches. - version 4.2.8 ------------------------------------------------------------------- Tue Feb 19 08:15:07 CET 2008 - coolo@suse.de - added some locale support to sat::Solvable - version 4.2.7 ------------------------------------------------------------------- Mon Feb 18 14:15:48 CET 2008 - dmacvicar@suse.de - handle error messages better in doesFileExist too which is used during probing. (bnc #362608) ------------------------------------------------------------------- Sun Feb 17 21:44:12 CET 2008 - dmacvicar@suse.de - Fetcher::reset() should not reset cache directories. (bnc #348050) - version 4.2.6 ------------------------------------------------------------------- Fri Feb 16 15:47:00 CET 2008 - dmacvicar@suse.de - Use CURLOPT_NOBODY instead of a CURLOPT_RANGE of 1 byte for http and https, but this time set CURLOPT_HTTPGET back to 1 so it actually works. This makes Media::doesFileExist efficient for http and https. (related to bnc #348050) - version 4.2.5 ------------------------------------------------------------------- Fri Feb 15 10:52:59 CET 2008 - coolo@suse.de - using .solv files only now (fate #303018) - revision 8699 ------------------------------------------------------------------- Tue Feb 12 17:10:48 CET 2008 - coolo@suse.de - fix architectures on distupgrade ------------------------------------------------------------------- Fri Feb 8 12:50:30 CET 2008 - coolo@suse.de - fixes from trunk merged ------------------------------------------------------------------- Fri Feb 1 17:45:07 CET 2008 - jkupec@suse.cz - fixed renaming a repo to an existing one (bnc #228216) - revision 8431 ------------------------------------------------------------------- Sun Jan 27 21:35:13 CET 2008 - coolo@suse.de - fix changelog ------------------------------------------------------------------- Thu Jan 24 18:26:47 CET 2008 - jkupec@suse.cz - read .curlrc more robustly to obtain user-proxy (#330351) - revision 8368 ------------------------------------------------------------------- Fri Jan 18 12:19:09 CET 2008 - coolo@suse.de - always buildrequire openssl-devel - replacing strange utf-8 chars in changelog - revision 8317 ------------------------------------------------------------------- Thu Jan 17 15:07:52 CET 2008 - jkupec@suse.cz - Saner NFS timeo default (#350309) - revision 8314 ------------------------------------------------------------------- Thu Jan 17 12:03:10 CET 2008 - kkaempf@suse.de - support 'patterns.pat' and 'patterns.pat.gz' to read all patterns in one go. - rev 8309 ------------------------------------------------------------------- Tue Jan 15 14:56:21 CET 2008 - lslezak@suse.cz - added RpmDb::removePubkey(), call it from KeyRing::Impl::deleteKey() - remove the GPG key from RPM when it is removed from the trusted keyring - revision 8288 ------------------------------------------------------------------- Mon Jan 14 17:11:15 CET 2008 - schubi@suse.de - Textchanges - reduced logging in SAT-solver - ordering solutions - version 4.1.8 - revision 8276 ------------------------------------------------------------------- Thu Jan 10 16:50:26 CET 2008 - schubi@suse.de - Enabled SAT solver via default. (removed ZYPP_SAT_SOLVER) ZYPP_RC_SOLVER=1 will enable the old RedCapet solver - Revision 8255 - Version 4.1.7 ------------------------------------------------------------------- Wed Jan 2 18:24:34 CET 2008 - jkupec@suse.cz - Pathname zypp::filesystem::expandlink(const Pathname &) added - if the provided file is a symlink, expand it (#274651) (this probably won't work for schemes other than file/dir and cd/dvd) - revision 8179 ------------------------------------------------------------------- Tue Dec 18 12:28:22 CET 2007 - aschnell@suse.de - fixed password handling in URLs (bug #347273) - revision 8118 ------------------------------------------------------------------- Mon Dec 17 13:47:44 CET 2007 - ma@suse.de - Fixed default text locale detection not to use static variables. (#346872) - version 4.1.6 - revision 8116 ------------------------------------------------------------------- Mon Dec 10 12:46:26 CET 2007 - ma@suse.de - Log more details about zypp lock owner. (#294094) - revision 8088 ------------------------------------------------------------------- Fri Dec 7 15:47:53 CET 2007 - ma@suse.de - Remove runtime dependency for libboost_filesystem (#345773) - version 4.1.5 - revision 8061 ------------------------------------------------------------------- Fri Nov 30 14:20:34 CET 2007 - schubi@suse.de - Enable SAT solver via environment variable ZYPP_SAT_SOLVER. e.g.: ZYPP_SAT_SOLVER=1 zypper install foo - version 4.1.4 - revision 7998 ------------------------------------------------------------------- Wed Nov 28 15:12:33 CET 2007 - aschnell@suse.de - make IniParser more strict (bug #306697) ------------------------------------------------------------------- Mon Nov 26 13:19:34 CET 2007 - ma@suse.de - Fix missing packages in patch content list. (#340896) - revision 7925 ------------------------------------------------------------------- Fri Nov 16 12:46:39 CET 2007 - coolo@suse.de - fix build ------------------------------------------------------------------- Wed Nov 14 14:23:23 CET 2007 - ma@suse.de - Output date strings in UTF-8. (#339423) - revision 7807 ------------------------------------------------------------------- Tue Nov 13 13:40:03 CET 2007 - schubi@suse.de - fixes for new gcc - version 4.1.3 - r7788 ------------------------------------------------------------------- Mon Nov 5 15:22:33 CET 2007 - ma@suse.de - Don't mark failed patch scripts as installed. (#327523) - version 4.1.2 - revision 7744 ------------------------------------------------------------------- Wed Oct 31 09:19:59 CET 2007 - dmueller@suse.de - update rpmlint suppression ------------------------------------------------------------------- Fri Oct 26 15:12:24 CEST 2007 - aschnell@suse.de - fixed retrieval of epoch from rpmdb (bug #246680) ------------------------------------------------------------------- Thu Oct 25 16:29:24 CEST 2007 - aschnell@suse.de - allow non-existing "packages" file in susetags parser (bug #309235) ------------------------------------------------------------------- Fri Oct 12 15:47:37 CEST 2007 - ma@suse.de - SMBIOS DMI modalias matching added (#333152) - revision 7494 ------------------------------------------------------------------- Sat Oct 6 16:37:11 CEST 2007 - jkupec@suse.cz - do not download the same file multiple times in one attach session (#307098), r7456 - special cdrom detection code for SCSI / Virtual CDROMs on iSeries removed - should be correctly detected by HAL now (#167629, #163971), r7452 - version 4.1.1 ------------------------------------------------------------------- Fri Oct 05 10:35:47 CEST 2007 - aschnell@suse.de - filter architecture in plaindir parser (bug #330791) ------------------------------------------------------------------- Thu Oct 4 16:31:58 CEST 2007 - ma@suse.de - Throw constructing malformed checksums. (#189096) - revision 7441 ------------------------------------------------------------------- Thu Oct 4 14:22:31 CEST 2007 - mvidner@suse.cz - Renamed templates back because proper qualification makes it work too. - 4.1.0 ------------------------------------------------------------------- Thu Oct 04 11:23:19 CEST 2007 - aschnell@suse.de - only look for repositories in file ending ".repo" (bug #294779) ------------------------------------------------------------------- Wed Oct 3 13:37:57 CEST 2007 - mvidner@suse.cz - Fixed compilation errors with GCC 4.3 by adding missing includes and renaming templates: MaxBits to MaxBitsT, Mask to MaskT, Compare to CompareEd. - r7426 ------------------------------------------------------------------- Mon Oct 1 20:29:36 CEST 2007 - ma@suse.de - Incorporated patch from Michael Matz to speedup cache reading. - revision 7413 ------------------------------------------------------------------- Fri Sep 28 18:40:59 CEST 2007 - schubi@suse.de - Resolvertestcase: - log Repository info - set keep state in the testcase - handle vendor - r 4707 ------------------------------------------------------------------- Thu Sep 27 17:13:14 CEST 2007 - ma@suse.de - Fixed pattern parser SEGV on broken pattern files. (#328546) - revision 7402 ------------------------------------------------------------------- Wed Sep 26 11:08:14 CEST 2007 - schubi@suse.de - QueuItemRequire: Filter out all provider which have worser architecture, are NOT noarch and have not the same name as the requirement. The last one is needed for updating packages via patch/atoms. Bug 328081 - Revert changes of r 7340 - r 7386 ------------------------------------------------------------------- Tue Sep 25 15:51:34 CEST 2007 - ma@suse.de - Add missing '--install' parameter in desktop file. (#308640) - version 4.0.0 - revision 7369 ------------------------------------------------------------------- Tue Sep 25 11:08:13 CEST 2007 - jkupec@suse.cz - release all attached media before attempting to eject (#293428) - fixed parsing of --proxy-user parameter of .curlrc (#309139) - revision 7352 - version 3.26.0 ------------------------------------------------------------------- Mon Sep 24 16:10:32 CEST 2007 - dmacvicar@suse.de - provide a way to retrieve the metadata path. Used for installation, which incorrectly creates a repository in cache without adding it first, so metadata path is not set and therefore it is not possible to setup a media verifier on installation. Part of fix for (#293428) - 3.25.0 ------------------------------------------------------------------- Mon Sep 24 15:48:47 CEST 2007 - schubi@suse.de - If more than one resolvables provide a requirements and have different architecture take thatone with the best architecture. (Not regarding the name). Bug: Branching too much while an installation of a multi-arch-DVD - r 7340 - version 3.24.8 ------------------------------------------------------------------- Fri Sep 21 15:50:30 CEST 2007 - schubi@suse.de - Checking the queue if an item will be deleted. If yes, the requirements are not needed anymore. Bug 326384 - version 3.24.7 - r 7329 ------------------------------------------------------------------- Thu Sep 20 17:37:30 CEST 2007 - jkupec@suse.cz - don't probe the repository type upon saving if disabled (#326769) - version 3.24.6 - revision 7319 ------------------------------------------------------------------- Thu Sep 20 15:19:53 CEST 2007 - ma@suse.de - Avoid calling rpm repeatedly in case of an error. This is fault-prone, esp. if the error occurred executing the packages post-install script. - version 3.24.5 - revision 7317 ------------------------------------------------------------------- Thu Sep 20 11:00:04 CEST 2007 - ma@suse.de - If a package is deselected by user, apply this soft lock to all available versions of this package. - version 3.24.4 - revision 7316 ------------------------------------------------------------------- Wed Sep 19 17:45:12 CEST 2007 - schubi@suse.de - Update: Do not set an item to installation if there has been already set one for installation which has the same NVA. Bug 326286 - version 3.24.3 - r 7311 ------------------------------------------------------------------- Wed Sep 19 14:19:49 CEST 2007 - ma@suse.de - Enable package cache during commit. (#326249) - revision 7309 ------------------------------------------------------------------- Tue Sep 18 14:01:02 CEST 2007 - schubi@suse.de - Do not regarding requirements for packages which will be deleted in the same solver run. Bug 310618 - r 7292 - version 3.24.2 ------------------------------------------------------------------- Mon Sep 17 16:33:14 CEST 2007 - jkupec@suse.cz - don't download filelists.xml.gz (#307105) - version 3.24.1 - revision 7269 ------------------------------------------------------------------- Mon Sep 17 15:51:04 CEST 2007 - ma@suse.de - Improve estimated diskusage while there is no valid solver result. (#325617) - revision 7266 ------------------------------------------------------------------- Mon Sep 17 15:22:47 CEST 2007 - schubi@suse.de -Bugfix in vendor change of a required resolvable (Correct error message) Bug 310455 - r 7262 ------------------------------------------------------------------- Mon Sep 17 12:36:28 CEST 2007 - lslezak@suse.cz - fixed DU parsing in inst-sys (#308659) - revision 7256 ------------------------------------------------------------------- Fri Sep 14 22:57:54 CEST 2007 - ma@suse.de - Enable using patch and delta rpms. (#309124) - version 3.24.0 - revision 7253 ------------------------------------------------------------------- Thu Sep 13 17:59:55 CEST 2007 - ma@suse.de - On update do not delete unmaintained non-SuSE packages. - version 3.23.2 - revision 7239 ------------------------------------------------------------------- Thu Sep 13 13:02:39 CEST 2007 - lslezak@suse.cz - ZYppImpl::getPartitions() - don't return the current partitioning when the partitioning hasn't been set - fixes DU parsing in inst-sys (#308659) ------------------------------------------------------------------- Thu Sep 13 11:30:47 CEST 2007 - dmacvicar@suse.de - Throw specific exceptions during commit (#308511) - 3.23.1 ------------------------------------------------------------------- Wed Sep 12 18:48:00 CEST 2007 - ma@suse.de - Various disk space calculation fixes. Susetags, plaindir and rpmdb now provide more detailed disk usage information. Yum metadata don't, so we book the package size to '/'. (#308362) - version 3.23.0 - revision 7225 ------------------------------------------------------------------- Wed Sep 12 15:48:41 CEST 2007 - schubi@suse.de - Regarding keep state while recycle old valid solver results. Bug 286889 - r 7209 ------------------------------------------------------------------- Wed Sep 12 12:24:49 CEST 2007 - jkupec@suse.cz - report 100% progress on finishing RPM removal (bug #309431) - revision 7200 ------------------------------------------------------------------- Tue Sep 11 17:25:35 CEST 2007 - schubi@suse.de - Update: rename language packages --> take that package which fits to the selected language Bug 308098 - r 7919 ------------------------------------------------------------------- Tue Sep 11 16:11:20 CEST 2007 - dmacvicar@suse.de - restore deltas and patch rpms from the cache (#309124) - 3.22.8 ------------------------------------------------------------------- Tue Sep 11 14:54:44 CEST 2007 - ma@suse.de - Don't fail if a product is deleted multiple times (e.g. due to obsoletes and an explicit deleted request). (#308746) - version 3.22.7 - revision 7184 ------------------------------------------------------------------- Tue Sep 11 13:52:47 CEST 2007 - jkupec@suse.cz - SYSCONFDIR variable added for modifying /etc ------------------------------------------------------------------- Tue Sep 11 12:18:11 CEST 2007 - schubi@suse.de - uninstallable resolvable -->suggested solution: delete; Bug 308164 - r 7177 ------------------------------------------------------------------- Mon Sep 10 16:19:05 CEST 2007 - schubi@suse.de - new translations added - r 7166 - version 3.22.6 ------------------------------------------------------------------- Mon Sep 10 15:50:49 CEST 2007 - lslezak@suse.cz - fixed disk usage counting of updated packages (#308362) ------------------------------------------------------------------- Mon Sep 10 14:17:29 CEST 2007 - schubi@suse.de - Splitting packages: Take the package with the best architecture,edition ONLY; Bug 308591 - r 7160 ------------------------------------------------------------------- Mon Sep 10 10:55:45 CEST 2007 - lslezak@suse.cz - properly report fallback disk usage size (in kB instead of bytes) when disk usage is not known (YUM repos) (#308475) ------------------------------------------------------------------- Fri Sep 7 13:27:26 CEST 2007 - ma@suse.de - Install a sample /etc/zypp.conf. (#306615) - Fixed missing soversion symlink in package. - version 3.22.5 - revision 7150 ------------------------------------------------------------------- Fri Sep 7 13:03:48 CEST 2007 - schubi@suse.de - RequirementIsMet: return true only if ALL Atoms are NOT incomplete; Bug 308252 - r 7143 ------------------------------------------------------------------- Thu Sep 6 18:22:36 CEST 2007 - schubi@suse.de - Error: Select two candidate with the same name while update. Solution: If there is a candidate which is already selected for installation --> take thatone #308082 - r 7132 ------------------------------------------------------------------- Thu Sep 6 14:11:58 CEST 2007 - ma@suse.de - Work arround installed patterns providing an empty vendor string. (#307743) - Let the solver treat vendor suse and opensuse as equivalent. - version 3.22.4 ------------------------------------------------------------------- Thu Sep 6 12:33:27 CEST 2007 - schubi@suse.de - Checking item before evaluating the concerning vendor. bug #307941 - r 7119 ------------------------------------------------------------------- Wed Sep 6 02:24:37 CEST 2007 - dmacvicar@suse.de - Fix for bug #307163 - empty package descriptions a.k.a shared tag not 100% implemented - r 7117 - version 3.22.3 ------------------------------------------------------------------- Wed Sep 5 17:52:37 CEST 2007 - schubi@suse.de - logging "reverse" NEEDED_BY in the detail description of solver problems. - improved error message if a requiremnt is not fulfilled Bug 307743 - Add "ignore" option to the solution if a requirement is not fulfilled Bug 304276 - revision 7113 ------------------------------------------------------------------- Wed Sep 5 14:33:02 CEST 2007 - jkupec@suse.cz - fixed the order of operands of susetags local metadata status computation which caused the YaST repositories to always get refreshed (part of bug #304310) - revision 7107 - version 3.22.2 ------------------------------------------------------------------- Tue Sep 4 12:09:10 CEST 2007 - schubi@suse.de - comparing vendor with VendorAttr::equivalent - revision 7103 ------------------------------------------------------------------- Mon Sep 3 18:43:51 CEST 2007 - schwab@suse.de - Use $RPM_OPT_FLAGS. ------------------------------------------------------------------- Mon Sep 3 17:14:02 CEST 2007 - ma@suse.de - Reset transact bits when switching status from "update" to "protected" (#246976) - version 3.22.1 - revision 7094 ------------------------------------------------------------------- Mon Sep 3 13:56:42 CEST 2007 - schubi@suse.de - new translations added - rev 7083 ------------------------------------------------------------------- Fri Aug 31 22:10:55 CEST 2007 - ma@suse.de - Added ability to switch off use of patch and delta rpms via zypp.conf (#305864) [main] download.use_patchrpm = no download.use_deltarpm = no - version 3.22.0 - revision 7069 ------------------------------------------------------------------- Fri Aug 31 19:56:40 CEST 2007 - ma@suse.de - On demand translate patch requirements into a list of atoms. Required by the UI to display packages acssociated with a patch. (#300612) - version 3.21.1 - revision 7065 ------------------------------------------------------------------- Fri Aug 31 13:59:54 CEST 2007 - kkaempf@suse.de - enrich ResolverInfo with the reason if a user-initiated request fails (#304325, #306240) - r 7051 ------------------------------------------------------------------- Thu Aug 30 20:10:00 CEST 2007 - jkupec@suse.cz - added missing implementation of LogControl::setLineFormater() (lslezak) - version 3.21.0 - revision 7041 ------------------------------------------------------------------- Thu Aug 30 18:55:15 CEST 2007 - jkupec@suse.cz - enable changing url in requestMedia callback (#294481) - revision 7037 ------------------------------------------------------------------- Thu Aug 30 18:22:32 CEST 2007 - ma@suse.de - Filter readonly mount points in DiskUsageCounter (#297405) - revision 7030 ------------------------------------------------------------------- Thu Aug 30 17:31:33 CEST 2007 - jkupec@suse.cz - remember the cause of the RepoException when refreshing metadata (#301022) - r7023 ------------------------------------------------------------------- Thu Aug 30 17:25:14 CEST 2007 - ma@suse.de - Safe fix for bug #299680. - version 3.20.1 - revision 7026 ------------------------------------------------------------------- Thu Aug 30 15:48:03 CEST 2007 - schubi@suse.de - Bugfix: If a requirement has been fulfilled by more than one language resolvables only thatone will be taken which fits to the selected language. - r 7018 ------------------------------------------------------------------- Thu Aug 30 15:14:23 CEST 2007 - jkupec@suse.cz - correct error code for media errors in MediaCurl::doGetFileCopy() affects only zypper error output, does not affect YaST - r7013 ------------------------------------------------------------------- Wed Aug 29 18:28:41 CEST 2007 - jkupec@suse.cz - reverted blocking of requestMedia from r6271 (#301710) - r6999 ------------------------------------------------------------------- Wed Aug 29 18:09:29 CEST 2007 - kkaempf@suse.de - prevent progress report in destructor (#299680) - r6998 ------------------------------------------------------------------- Wed Aug 29 18:02:36 CEST 2007 - jkupec@suse.cz - treat non-filelists.xml entries as file provides capabilities in YUM parser (#304701) - r6992 ------------------------------------------------------------------- Wed Aug 29 16:32:01 CEST 2007 - kkaempf@suse.de - the media.1/media uniquely identifies a 'susetags' repo, not the content file (#304200) ------------------------------------------------------------------- Wed Aug 29 15:42:17 CEST 2007 - jkupec@suse.cz - fixed locale dir (#304649) - r6984 ------------------------------------------------------------------- Wed Aug 29 15:39:52 CEST 2007 - kkaempf@suse.de - don't treat normal package license as "license to confirm" (#305906) ------------------------------------------------------------------- Wed Aug 29 15:28:53 CEST 2007 - ma@suse.de - Fixed fix for #293039. Segfault due to uninitialzed data. - version 3.19.3 - revision 6980 ------------------------------------------------------------------- Wed Aug 29 15:10:20 CEST 2007 - schubi@suse.de - reduced too much verbosed ResolverContext logging; Bug 303971 - r 6977 ------------------------------------------------------------------- Wed Aug 29 13:55:28 CEST 2007 - ma@suse.de - Fixed PlainDir repositories to provide real disk usage data. For repomd and others that do not provide any detailed disk usage info, assume the packgage size is required below "/". Peviously they were treated as being empy. - version 3.19.2 - revision 6972 ------------------------------------------------------------------- Wed Aug 29 13:36:42 CEST 2007 - schubi@suse.de - Add a new solver solution in the case of running in a timeout: ProblemSolutionDoubleTimeout.h #Bug 302496 - revision 6970 ------------------------------------------------------------------- Wed Aug 29 11:23:26 CEST 2007 - dmacvicar@suse.de - bug in fix for (#292986) ------------------------------------------------------------------- Tue Aug 28 18:48:26 CEST 2007 - dmacvicar@suse.de - (#297001) - libzypp: can't skip broken packages - re enable importing zypp keyring from rpm.(#302379) - 3.19.1 ------------------------------------------------------------------- Tue Aug 28 17:30:30 CEST 2007 - kkaempf@suse.de - rename ResolvableQuery::iterateResolvablesByKindsAndStrings to ResolvableQuery::iterateResolvablesByKindsAndStringsAndRepos in order to support query-by-repo (#305384) - fix iterateResolvablesByKindsAndStringsAndRepos to take any number of kinds, names, or repos (#305347) - remove ResolvableQuery::iterateResolvablesByKind, not needed - version 3.19.0 - rev 6935 ------------------------------------------------------------------- Tue Aug 28 11:27:53 CEST 2007 - dmacvicar@suse.de - real fix for reading signature ids. (#390535). - delete metadata when removing repo (#301037). ------------------------------------------------------------------- Mon Aug 27 23:52:41 CEST 2007 - dmacvicar@suse.de - following behaviour for setPartitions - if they are not set, they are detected - if they are set, that value is used. - if value set or detected is empty, all disk usage information is read. Otherwise just values in those mount points. Should work for installation as long as detectPartitions is empty at installation.(#293039) ------------------------------------------------------------------- Mon Aug 27 17:08:41 CEST 2007 - kkaempf@suse.de - Add ZConfig::overrideSystemArchitecture() to override zypp arch from external, e.g. for the testcases - Honor ZYPP_CONF environment variable to override the buit-in /etc/zypp/zypp.conf - Check architecture at handout() to prevent NULL ptr reference. - Bug 301286 - rev 6908 ------------------------------------------------------------------- Mon Aug 27 15:53:52 CEST 2007 - schubi@suse.de -The solver generate an establish call for all resolvables which has filesystemcaps if there is not a valid result from a former solver run available. This covers: * Initial solver run * Changing of filesystem whithin a workflow, cause the solver results will be reset if the filesystem dependencies have been changed Bug 271912 - r 6901 ------------------------------------------------------------------- Sun Aug 26 15:49:27 CEST 2007 - kkaempf@suse.de - pass location to plaindir package (#303751) - Add name of file in question to checksum/signature related exceptions. - pass basename of file to verifyFileSignatureWorkflow (instead of empty string). - filter out incompatible architectures when parsing sustags repos (first half of #301286) - r 6882 ------------------------------------------------------------------- Fri Aug 24 11:52:27 CEST 2007 - dmacvicar@suse.de - don't run source migration if yast is running in intsys mode (#297136) - signature and checksum verification fixes. Still pending problem ZYpp getting no output from gpg when running from zypper. (#302059) ------------------------------------------------------------------- Thu Aug 23 13:51:41 CEST 2007 - schubi@suse.de - Do not strip resolvables which have the same name but different kind (ResolverInfo*) - Flag info NEEDEDBY correctly if it will be used by freshen/supplement - r 6830 ------------------------------------------------------------------- Wed Aug 22 18:58:44 CEST 2007 - mvidner@suse.cz - Do not use "a-z" in regexes. Fixes "Invalid Url scheme 'http'" in the Estonian locale (#302525). ------------------------------------------------------------------- Wed Aug 22 17:59:39 CEST 2007 - aschnell@suse.de - added remembering of exception history at various places ------------------------------------------------------------------- Wed Aug 22 16:52:09 CEST 2007 - schubi@suse.de - Bugfixes concerning vendor handling: - first bug: Installed A-1.0(vendor SuSE) Available A-2.0(other vendor) A will not be regarded as "unmaintained". So it will not be deleted. - second bug: A need B-2.0. B-1.0 is installed but has another vendor. Report a proper errmessage. - Testcase : solution-tests/vendor-test.xml - r 6812 - 3.18.4 ------------------------------------------------------------------- Tue Aug 21 15:38:08 CEST 2007 - dmacvicar@suse.de - ignore HASH key for download (#300982) ------------------------------------------------------------------- Tue Aug 21 15:17:23 CEST 2007 - schubi@suse.de - Added explicitly_requested as parameter in ResolverContext::Uninstall Bug 299819 - revision 6794 ------------------------------------------------------------------- Tue Aug 21 13:06:44 CEST 2007 - dmacvicar@suse.de - If no mount information is available, parse all DU entries. - read only hack mode for migrate-sources. We actually do add repositories with it, but no harm. (#292986) - fix some typos in exceptions (#301331) - 3.18.3 ------------------------------------------------------------------- Mon Aug 20 16:06:36 CEST 2007 - schubi@suse.de - Do not regard explicit request in order to recognize updated packages correctly. Bug 301676 - Updated translations - r 6766 - 3.18.2 ------------------------------------------------------------------- Mon Aug 20 15:35:46 CEST 2007 - mvidner@suse.cz - package-manager script: Call /sbin/yast2 with full path because of gnomesu (#269873). ------------------------------------------------------------------- Mon Aug 20 15:23:14 CEST 2007 - dmacvicar@suse.de - add support for the HASH key. (#300982) - Use ContentFileParser in Downloader (instead of implementing the parser again, it has a reason, Downloader was written first) - update testcases and data to cover the new HASH key - 3.18.1 ------------------------------------------------------------------- Mon Aug 20 13:21:34 CEST 2007 - kkaempf@suse.de - unify query API for kind and name, summary, description (incomplete) - rev 6761, version 3.18.0 ------------------------------------------------------------------- Fri Aug 17 12:30:55 CEST 2007 - kkaempf@suse.de - add iterateResolvablesByKindsAndName - rev 6735, version 3.17.13 ------------------------------------------------------------------- Fri Aug 17 11:45:24 CEST 2007 - kkaempf@suse.de - rename ResolvableQuery::queryByName to iterateResolvablesByName - fix reading of kind and repository in ResolvableQuery - add reverse lookups in CacheTypes - add iterateResolvablesByKind - rev 6733 ------------------------------------------------------------------- Fri Aug 17 10:37:56 CEST 2007 - schubi@suse.de - shorten solver error messages Bug 259894 - rev 6723 ------------------------------------------------------------------- Thu Aug 16 23:43:50 CEST 2007 - kkaempf@suse.de - fix ResolvableQuery::query(), add ResolvableQuery::queryByName() install zypp/cache header files. - rev 6719, version 3.16.13 ------------------------------------------------------------------- Thu Aug 16 17:21:52 CEST 2007 - kkaempf@suse.de - discard pattern files with incompatbile architecture, both for download and for parsing. (#298716) - rev 6711 ------------------------------------------------------------------- Thu Aug 16 17:12:45 CEST 2007 - kkaempf@suse.de - run sqlite asynchronously and add sql index files where appropriate, gives 6x performance on certain operations. Bumping cache schema version to 1004. (#300998) - rev 6710 ------------------------------------------------------------------- Thu Aug 16 17:08:58 CEST 2007 - kkaempf@suse.de - fix String::endsWith (#301038) - rev 6709 ------------------------------------------------------------------- Thu Aug 16 11:16:25 CEST 2007 - schubi@suse.de - added an _explicitly_requested in QueueItemConflict ( as already in QueueItemEstablish, QueueItemInstall, QueueItemUninstall ) in order to remove the conflicting item without an error message. Bug 299819 - rev 6699 ------------------------------------------------------------------- Thu Aug 16 07:23:31 CEST 2007 - jkupec@suse.cz - forgot to set default refresh policy in checkIfToRefreshMetadata - repo.refresh.delay default set to 10 minutes - 6693 ------------------------------------------------------------------- Wed Aug 15 15:32:36 CEST 2007 - schubi@suse.de - Bugfix while regarding correct vendor in update - r6677 - version 3.15.0 ------------------------------------------------------------------- Wed Aug 15 13:57:04 CEST 2007 - jkupec@suse.cz - repo.refresh.delay= (ZConfig, "main" section) support added to delay next check & refresh until the specified number of minutes has passed from the last check or refresh (FATE #301991). Revisions: 6654, 6656, 6666, and 6667. - filesystem::touch(Pathname) added (r6666) - RepoManager::touchIndexFile(RepoInfo) added - RepoManager::checkIfToRefreshMetadata(RepoInfo,Url,policy): decision to do the refresh moved to this public method. - r6667 ------------------------------------------------------------------- Wed Aug 15 12:38:26 CEST 2007 - schubi@suse.de - generate a resolver problem if addRequires does not find a resovable #299486 - rev 6660 ------------------------------------------------------------------- Tue Aug 14 15:54:15 CEST 2007 - schubi@suse.de - Prioritized delete request by the user BEFORE delete requests due missing dependencies or conflicting dependencies. Bug 298322 - rev 6640 ------------------------------------------------------------------- Fri Aug 10 20:49:20 CEST 2007 - jkupec@suse.cz - support also "Plaindir" as valid repo type name (#298622) - revision 6616 - version 3.14.0 ------------------------------------------------------------------- Fri Aug 10 18:03:06 CEST 2007 - dmacvicar@suse.de - fix segfault in Progress reporting - progress report use name instead of alias (#298035) - repoinfo returns alias if name is empty ------------------------------------------------------------------- Fri Aug 10 16:04:42 CEST 2007 - dmacvicar@suse.de - merge patch by dmueller to get rid of boost-regex ------------------------------------------------------------------- Fri Aug 10 13:50:40 CEST 2007 - dmacvicar@suse.de - dont create a second CacheStore in the same scope, will lock... #297627 ------------------------------------------------------------------- Thu Aug 9 15:04:21 CEST 2007 - jkupec@suse.cz - fixed some RepoManager exception docs & history - r6558 ------------------------------------------------------------------- Thu Aug 9 13:33:59 CEST 2007 - dmacvicar@suse.de - feature #302135: Graceful update of 3rd party packages Automatic upgrading only sees packages from same vendor This allows not needed to have those locked. - Add persistent locks file which allow wildcards. Users can lock certain packages adding lines like "kde* < 3.5" - add applyLocks() to apply persistent locks before solving ------------------------------------------------------------------- Thu Aug 9 13:28:20 CEST 2007 - schubi@suse.de - recognize changes in the pool (e.g. changing /etc/sysconfig/storage #271912 wq - Added locking resolvables in the testcases - rev 6544 ------------------------------------------------------------------- Wed Aug 8 16:04:07 CEST 2007 - dmacvicar@suse.de - add migrate-sources to %post (#292986) - 3.13.15 ------------------------------------------------------------------- Wed Aug 8 13:32:52 CEST 2007 - jkupec@suse.cz - fixed bug with using wrong files from raw metadata cache (bug #297611) (duncanmv) (r6501, already released in 3.13.14) ------------------------------------------------------------------- Wed Aug 8 12:42:39 CEST 2007 - schubi@suse.de - fix in "ignore conflicts" if the conflict has been caused by an obsolete Bug# 297795 - r 6517 ------------------------------------------------------------------- Tue Aug 7 17:04:47 CEST 2007 - dmacvicar@suse.de - implement susetags support for compressed metadata and testcases. (feature #301916) - implement disk usage in cache. For installation requires some changes in YaST to setup the ZYpp getPartitions() before repos are cached. (bug #293039) - added testcases for diskusage - 3.13.14 ------------------------------------------------------------------- Mon Aug 6 10:19:12 CEST 2007 - jkupec@suse.cz - fixed YUM parser to properly create source packages - disabled reading of filelists.xml.gz by default (the data are currently not stored anyway) - revision 6481 - version 3.13.13 ------------------------------------------------------------------- Sat Aug 4 01:03:19 CEST 2007 - ma@suse.de - Don't download unwanted translation files (#293740). - revision 6470 ------------------------------------------------------------------- Fri Aug 3 23:52:18 CEST 2007 - ma@suse.de - Fix susetags repo to parse dikusage data (#293039) - revision 6467 - version 3.13.12 ------------------------------------------------------------------- Fri Aug 3 18:56:47 CEST 2007 - ma@suse.de - Add product attribute 'type' (aka 'category' which is now deprecated). Adapted sustags and yum parsers to parse and provide this value. - revision 6464 - version 3.13.11 ------------------------------------------------------------------- Fri Aug 3 17:29:56 CEST 2007 - dmacvicar@suse.de - fix modalias rel column number - version 3.13.10 ------------------------------------------------------------------- Fri Aug 3 16:35:36 CEST 2007 - dmacvicar@suse.de - Implemented option repo.add.probe to allow probing the added repositories - version 3.13.9 ------------------------------------------------------------------- Fri Aug 3 16:07:46 CEST 2007 - schubi@suse.de - Fixed detection of renamed packages while update. - Added new translations - rev 6445 ------------------------------------------------------------------- Fri Aug 3 15:02:28 CEST 2007 - ma@suse.de - Speed up retrieving MediaNr attribute, as it slows down install order calculation. (#297173) - revision 6442 ------------------------------------------------------------------- Fri Aug 3 14:13:36 CEST 2007 - dmacvicar@suse.de - Fixed cache schema upgrade ------------------------------------------------------------------- Fri Aug 3 13:38:17 CEST 2007 - ma@suse.de - Fixed pattern includes and extends attributes. - revision 6431 - version 3.13.8 ------------------------------------------------------------------- Fri Aug 3 12:33:41 CEST 2007 - schubi@suse.de - API for retrieving additional dependencies" solver/detail/Resolver.h - Handle additional dependencies in the testcases - Handle system and language dependencies in the testcases correctly. - r 6418 ------------------------------------------------------------------- Thu Aug 2 18:14:12 CEST 2007 - ma@suse.de - Indicate changed pool content if /etc/sysconfig/storage USED_FS_LIST has changed. Resolver must discard any cached filesystem dependencies. (required for #271912) - revision 6404 ------------------------------------------------------------------- Thu Aug 2 16:37:06 CEST 2007 - ma@suse.de - Indicate changed pool content to the resolver. (required for #271912) - revision 6398 - version 3.13.7 ------------------------------------------------------------------- Thu Aug 2 10:16:16 CEST 2007 - schubi@suse.de - speedup error handling. Do not log ResolveInfo anymore. Set limit of 20 problems. Bug 280387 - r 6378 - version 3.13.6 ------------------------------------------------------------------- Wed Aug 1 18:51:12 CEST 2007 - ma@suse.de - Added interface to install source packages via zypper. - revision 6373 - version 3.13.5 ------------------------------------------------------------------- Tue Jul 31 22:01:08 CEST 2007 - ma@suse.de - Added package attributes Package::sourcePkgName and Package::sourcePkgEdition. Name and edition of the source rpm this package was built from. - Added ZYpp::installSrcPackage to install a single source package. - revision 6353 - version 3.13.4 ------------------------------------------------------------------- Tue Jul 31 19:06:54 CEST 2007 - ma@suse.de - Temorary files and directories created by makeSibling use the same protection as the original. - revision 6344 - version 3.13.3 ------------------------------------------------------------------- Tue Jul 31 10:37:13 CEST 2007 - schubi@suse.de - Removed keepExtras from resolvePool. This will be handled in the solver internally now. #294727 - Checking if item really exists (#295544; ResolverInfoContainer.cc) - revision 6317 - version 3.13.2 ------------------------------------------------------------------- Mon Jul 30 17:23:19 CEST 2007 - ma@suse.de - Remove tribool from RepoInfo's interface. - revision 6301 - version 3.13.1 ------------------------------------------------------------------- Mon Jul 30 13:59:33 CEST 2007 - ma@suse.de - Fixed wrong media number reported by script, message and patch. - Fixed script API to provide the scripts location on media (if not inlined). - Introduced ScripProvider to make a script available on the local disk. - revision 6288 - version 3.13.0 ------------------------------------------------------------------- Fri Jul 27 18:08:42 CEST 2007 - jkupec@suse.cz - don't request media chage if the media is not changeable (like e.g. http) - revision 6271 - version 3.12.1 ------------------------------------------------------------------- Fri Jul 27 17:40:44 CEST 2007 - dmacvicar@suse.de - progress ticks for clean cache - ZConfig: remove default from names. - re enable reading cache callbacks - ini parser without boost::regexp patch by dmueller (#152447) ------------------------------------------------------------------- Fri Jul 27 17:16:27 CEST 2007 - ma@suse.de - Fixed package to provide the location media number. (#294496) - revision 6263 ------------------------------------------------------------------- Fri Jul 27 16:31:38 CEST 2007 - jkupec@suse.cz - RepoFileReader - ignore empty url keys (baseurl, mirrorlist, gpgkey) instead of throwing bad url exception - revision 6259 ------------------------------------------------------------------- Thu Jul 26 16:41:30 CEST 2007 - kkaempf@suse.de - Make clearing of extra dependencies/conflicts configurable when resolvePool(). Leave the default as before (clear extras). Bug # 294727 - revision 6233 - version 3.12.0 ------------------------------------------------------------------- Thu Jul 26 10:58:27 CEST 2007 - dmacvicar@suse.de - /var/lib/zypp/cache -> /var/cache/zypp (#292419) - ini parser without boost::regexp, patch by dmueller (#152447) ------------------------------------------------------------------- Wed Jul 25 13:50:06 CEST 2007 - ma@suse.de - Make temp directory configurable via environment variable ZYPPTMPDIR. - revision 6202 - version 3.11.11 ------------------------------------------------------------------- Tue Jul 24 17:55:49 CEST 2007 - ma@suse.de - Fixed bug in smart pointer comparison. ------------------------------------------------------------------- Mon Jul 23 13:05:53 CEST 2007 - ma@suse.de - Fix failing rename of metadata download directories across filesystem boundaries. ------------------------------------------------------------------- Fri Jul 20 16:10:59 CEST 2007 - ma@suse.de - Fixed malicious gettext include. - Make ZConfig a singleton. - revision 6123 ------------------------------------------------------------------- Thu Jul 19 15:52:03 CEST 2007 - ma@suse.de - Fixed repo::provideFile to set a deleter for downloaded files (#293004). - revision 6094 - version 3.11.10 ------------------------------------------------------------------- Thu Jul 19 12:58:12 CEST 2007 - ma@suse.de - Query ByRepository now takes as well an alias. ------------------------------------------------------------------- Wed Jul 18 16:40:35 CEST 2007 - dmacvicar@suse.de - fix retrieval of container attributes in cache (#292698) ------------------------------------------------------------------- Wed Jul 18 16:12:06 CEST 2007 - ma@suse.de - Port zypp-query-pool (#292404) - revision 6069 - version 3.11.9 ------------------------------------------------------------------- Wed Jul 18 16:09:04 CEST 2007 - schubi@suse.de - added new calls in Resolver.h: addRequire,addConflict ------------------------------------------------------------------- Wed Jul 18 14:43:04 CEST 2007 - ma@suse.de - Fixed IniParser to allow '=' in values (#292669) - revision 6063 ------------------------------------------------------------------- Wed Jul 18 14:16:59 CEST 2007 - dmacvicar@suse.de - allow / in alias (#292628) ------------------------------------------------------------------- Wed Jul 18 12:38:55 CEST 2007 - ma@suse.de - Fixed repo::provideFile to throw on error. - Fixed ResolvableQuery to use 0 as default for non existing numerical values. - revision 6058 ------------------------------------------------------------------- Tue Jul 17 15:57:03 CEST 2007 - ma@suse.de - Fixed OnMediLocation to use safe defaults. Added setLocaltion and additional ctor for convenience. - revision 6047 ------------------------------------------------------------------- Tue Jul 17 10:45:39 CEST 2007 - schubi@suse.de - Evalute update canditate: Take canditates only which are really installable. Bug 292077 r 6034 ------------------------------------------------------------------- Mon Jul 16 15:41:31 CEST 2007 - jkupec@suse.cz - fixed some tribool bugs in RepoInfo - revision 6022 ------------------------------------------------------------------- Mon Jul 16 11:43:33 CEST 2007 - dmacvicar@suse.de - fix reading of non existant repo - r6018 - first submission to stable - fix keywords parsing in susetags parser - version 3.11.8 ------------------------------------------------------------------- Wed Jul 11 19:14:47 CEST 2007 - jkupec@suse.cz - make resolvable query complete exceptionless with the database - test that packages have some attributes - disable progress adaptor for now - revision 5977 - version 3.11.7 ------------------------------------------------------------------- Wed Jul 11 14:37:02 CEST 2007 - ma@suse.de - fixed unresolved symbols - revision 5972 - version 3.11.6 ------------------------------------------------------------------- Wed Jul 11 13:31:39 CEST 2007 - ma@suse.de - fixed TranslatedText creating unwanted entries. - fixed capability processing - revision 5964 - version 3.11.5 ------------------------------------------------------------------- Tue Jul 10 20:01:18 CEST 2007 - jkupec@suse.cz - MediaSetAccess::release() added - Use attachDesiredMedia in MediaProducts - Progress reporting improved - revision 5959 - version 3.11.4 ------------------------------------------------------------------- Tue Jul 10 14:23:13 CEST 2007 - ma@suse.de - fixed parsing translated texts. - added source packages. - revision 5947 - version 3.11.3 ------------------------------------------------------------------- Tue Jul 10 13:11:31 CEST 2007 - jkupec@suse.cz - repo callbacks fixed - Fixed YUM parser progress reporting - Added CombinedProgressData - make RepoImpl::resolvables() load lazy - MediaProducts added for scanning products file - Implement cache schema versioning and automatic invalidation of cache when schema changes - revision 5942 - version 3.11.2 ------------------------------------------------------------------- Fri Jul 6 13:51:50 CEST 2007 - ma@suse.de - Propagate pools repository_iterator to the UI - revision 5911 - version 3.11.1 ------------------------------------------------------------------- Thu Jul 5 17:02:08 CEST 2007 - ma@suse.de - Package::location is now returns an OnMediaLocation - archivesize() renamed to downloadSize() - Allow to iterate all Repositories that contribute Resolvables to the Pool. - MediaSetAccess::provideDir added - remove useless url check - add old-api-style wrapper - Add MediaProducts class - revision 5892 - version 3.11.0 ------------------------------------------------------------------- Thu Jul 5 09:31:02 CEST 2007 - schubi@suse.de - function isInstalledBy/installs Added an initial installation flag which shows if the item has been triggered for installation, or the dependency is already satisfied. - Revision 5884 - Version 3.4.0 ------------------------------------------------------------------- Tue Jul 3 13:07:31 CEST 2007 - jkupec@suse.cz - removed unused %{prefix}/lib/zypp from %files in spec file - revision 5870 ------------------------------------------------------------------- Tue Jul 3 10:37:37 CEST 2007 - jkupec@suse.cz - Old API (SourceManager, metadata parsers) dropped in favor of the new refactored ones (RepoManager, RepoParser(s), cache subtree, repo subtree). - Some new API improvements. - revision 5868 - version 3.10.0 (bumped minor to 10 to indicate refactoring branch) ------------------------------------------------------------------- Fri Jun 22 15:28:03 CEST 2007 - schubi@suse.de - New API calls which provides more information about one resolvable after a solverrun: isInstalledBy (const PoolItem_Ref item); installs (const PoolItem_Ref item); - Revision 5835 ------------------------------------------------------------------- Thu Jun 21 15:58:16 CEST 2007 - adrian@suse.de - fix changelog entry order ------------------------------------------------------------------- Wed Jun 20 11:47:33 CEST 2007 - schubi@suse.de - Ignore conflicting items which are uninstallable - Create a "needed by" info if a requirement is still fulfilled. - Allow only one needed_by and needed_by_capability in QueueItemInstall - Added capability and type (REQUIRE, RECOMMEND,....) to ResolverInfoNeededBy - Evaluate ResolverInfoNeededBy for more information in the error messages - Enlarge detail description in the error messages - Revision 5807 ------------------------------------------------------------------- Tue Jun 19 13:59:09 CEST 2007 - ma@suse.de - Fixes for gcc-4.2 - revision 5786 - version 3.3.1 ------------------------------------------------------------------- Mon Jun 18 17:20:45 CEST 2007 - mvidner@suse.cz - fixed so versioning from libtool to cmake - 3.3.0 ------------------------------------------------------------------- Mon Jun 18 09:47:32 CEST 2007 - dmacvicar@suse.de - Use gpg2 instead of gpg for keyring and make the package depend on it (#284211) ------------------------------------------------------------------- Mon Jun 11 17:02:49 CEST 2007 - schubi@suse.de - Required kmp packges FOR EACH installed/to_be_installed kernel will be installed. New dependency "packageand(foo:bar)" which provides an AND dependency by injecting a supplement/freshen. e.G. package novell-cluster-services-kmp-smp supplements: packageand(kernel-smp:novell-cluster-services-kmp) Bug 255011 - Dont check for architecture changes in atoms (#266178) - Revision 5720 ------------------------------------------------------------------- Wed May 23 17:03:29 CEST 2007 - ma@suse.de - Fixed package-manager script (#275847) - revision 5614 ------------------------------------------------------------------- Wed May 23 13:32:02 CEST 2007 - schubi@suse.de - fixed cmake - version 3.2.2 ------------------------------------------------------------------- Wed May 23 11:25:55 CEST 2007 - schubi@suse.de - Reduced logging in order to speedup solving Bug 275100 - revision 5603 - version 3.2.1 ------------------------------------------------------------------- Tue May 15 14:03:34 CEST 2007 - ma@suse.de - Fix excess calls to releaseFile. (#274357) - revision 5545 ------------------------------------------------------------------- Wed May 9 18:44:20 CEST 2007 - dmacvicar@suse.de - Fix importing keys into rpm. (#270125) - r5527 ------------------------------------------------------------------- Wed Apr 18 14:56:17 CEST 2007 - ma@suse.de - Support filesystem dependencies to add needed filesystem RPMs automatically (Fate 301966). - revision 5404 - version 3.2.0 ------------------------------------------------------------------- Mon Apr 16 11:23:15 CEST 2007 - jkupec@suse.cz - avoiding attaching media where not needed (#263207) - r5381 ------------------------------------------------------------------- Fri Apr 13 17:32:55 CEST 2007 - dmacvicar@suse.de - fix FileCap with attributes - r5376 ------------------------------------------------------------------- Thu Apr 12 02:33:18 CEST 2007 - ma@suse.de - Fixed computation of install order. Take requirements of an installed packages uninstall scripts into account, if the package is updated. (#258682) - revision 5349 - version 3.1.1 ------------------------------------------------------------------- Wed Apr 11 15:24:01 CEST 2007 - ma@suse.de - Parse and provide package keywords. (Fate 120368) - revision 5338 - version 3.1.0 ------------------------------------------------------------------- Thu Apr 5 15:50:15 CEST 2007 - schubi@suse.de - Upgrade: Do NOT delete packages which have unresolved dependencies --> Ask the user. Bug 258322 - revision 5305 - version 3.0.3 ------------------------------------------------------------------- Wed Apr 4 19:39:12 CEST 2007 - ma@suse.de - Fix restoring of Sources id root prefix is used. (#238165) - revision 5299 - version 3.0.2 ------------------------------------------------------------------- Wed Apr 4 15:33:54 CEST 2007 - jkupec@suse.cz - MediaManager::attachDesiredMedia() added to support multiple (CD/DVD) drives (fate #3974) - r5296 ------------------------------------------------------------------- Wed Mar 14 14:33:26 CET 2007 - schubi@suse.de - If there is no valid solver result and NOT all resolvables ( other architecture) has been regarded, let the user decide making a new solver run with ALL available resolvables. Bug 223440 - reducing logging (error -> debug) bug 252921 - Revision 5219 ------------------------------------------------------------------- Fri Mar 9 00:08:38 CET 2007 - ma@suse.de - Allow configuration of trusted vendors via /var/lib/zypp/db/trustedVendors. (#186636) - revision 5194 - version 3.0.1 ------------------------------------------------------------------- Wed Mar 7 15:20:29 CET 2007 - dmacvicar@suse.de - libzypp-devel -> libzypp requirement is not versioned (#251086) - r5181 ------------------------------------------------------------------- Tue Mar 6 17:25:49 CET 2007 - schubi@suse.de - Using already existing valid solver results for further solver runs. (partiell solving) - r5169 ------------------------------------------------------------------- Fri Mar 2 16:11:16 CET 2007 - dmacvicar@suse.de - fix link order - r5165 ------------------------------------------------------------------- Tue Feb 27 15:50:39 CET 2007 - dmacvicar@suse.de - merging from 10.2 / SP1 - #247459 ftp probing denied == dont exists in ftp - r5124 ------------------------------------------------------------------- Tue Feb 27 15:35:06 CET 2007 - schubi@suse.de - Merging solver related stuff from SuSE-Linux-10_2-Branch ( till r5111): - Simultaneouqusly establishing of items which are conflicting eachother is useless. So only one will be established. Fixed in QueueItemInstall.cc Bug 243595 - Added new upgrade options to fine tune version and patch handling. (F301990) - The context of establishPool will be stored in Resolver and will be regarded for the next solver run everytime. So it will be not reset by any solver run anymore. bug 191810 ( A broken patch will not be installed again) ------------------------------------------------------------------- Fri Feb 23 17:40:23 CET 2007 - jkupec@suse.cz - adding sotf,timeo=X nfs mount options by default (#235211) - r5093 ------------------------------------------------------------------- Fri Feb 23 14:16:19 CET 2007 - jkupec@suse.cz - support for HTTP authentication prompt added (#190609) - fixed problem with empty path in URL in MediaCurl::doGetFileCopy() - r5085 ------------------------------------------------------------------- Mon Feb 12 15:28:08 CET 2007 - jkupec@suse.cz - Merged revisions 4926-4993,4995,4998-5006 via svnmerge from SuSE-Linux-10_2-Branch - verifySystem: Regarding patterns too. Bug 239750 (schubi) - verifySystem: The result will be set to APPL_HIGH, so it will be not reset by a second "normal" solver run. #239281 (schubi) - yast2 reports invalid URL as 'unknown source type' (#209961) (dmacvicar) - Added freshen language dependency in supplemements too if there is no entry in supplements. #240617;IPA fonts are not installed even if select Japanese language (schubi) - Setting allowed authentication methods to "basic,digest" if none provided in URL (#243006) (jkupec) - Stopping after 50 valid solver results. Anymore would be useless. Bug 243595 (schubi) - r 5007 ------------------------------------------------------------------- Mon Feb 12 10:37:02 CET 2007 - mvidner@suse.cz - package-manager: use a generic su script from XDG (#235303, #244442) ------------------------------------------------------------------- Fri Feb 9 15:21:55 CET 2007 - jkupec@suse.cz - Setting allowed authentication methods to "basic,digest" if none provided in URL (#243006) - fixed gettext and rpath problems in configure.ac and Makefile.cvs (mvidner) - r4999 ------------------------------------------------------------------- Wed Feb 7 15:52:29 CET 2007 - jkupec@suse.cz - MediaCurlException::dumpOn() adjusted for ncurses dialogue (#222602) - 4984 ------------------------------------------------------------------- Mon Jan 29 13:10:37 CET 2007 - dmacvicar@suse.de - Merged revisions 4907-4926 from SuSE-Linux-10_2-Branch - update packages: changing architecture is only valid while an system update and NOT while an update via a patch. Last fix does not fit for every case. Bug 230685 - Patch has selected not the concerning package for update but a package which has provided the required dependencies too. Algorithmus: If there are exactly two providers which differ in architecture prefer the better arch. Fix: Regarding NVRA too. ( only if equal ) Bug 238284 - Download only English and Local translation (#208457) - Added solver parameter: tryAllPossibilities: regarding every solver branch ( not only branches with e.G. best architectures preferHighestVersion: Prefer solver results which have a higher version number. Bug #238087 - update packages: changing architecture is only valid while an system update and NOT while an update via a patch. Bug 230685 - x86_64 MozillaFirefox binaries in security update repository Fix of version 2.11.2 has not worked if the first founded item had had another architecture. - r4927 ------------------------------------------------------------------- Wed Jan 24 14:50:33 CET 2007 - lslezak@suse.cz - added ZYpp::getPartitions() - return the partitinoning ------------------------------------------------------------------- Wed Jan 24 14:20:28 CET 2007 - dmacvicar@suse.de - Merged revisions 4705-4906 via svnmerge from SuSE-Linux-10_2-Branch - Corrupt download cannot be skipped (#217425 and #224216) - Enable package read ahead/caching in commit per default to reduce interactive media changes. If the environment variable ZYPP_COMMIT_NO_PACKAGE_CACHE is set, caching will be disabled. (F100182) - added parameter not to reset resolver results while calling freshen pool Bug: 235761 - Prepare package read ahead/caching of packages in commit. Adatped the workflow. Caching details are now hidden inside CommitPackageCache. The current implementation still performs no read ahead. (for F100182) - Skip invalid or broken rpm database entries. (#231211) - verifySystem: check if the solution is valid after calling freshenPool() Bug: 235761 - Added own call for Resolver::verifySystem with additional hardware/language check in order to keep binary compatibility Fate #301224 - Rpm requires additional quoting of special chars in filenames. (#233967) - Resolver::verifySystem checks for new hardware now by calling freshenPool. This is configureable. Fate #301224 - merged texts from proofread - Don't consider patch/delta rpms if package architecture changes. (#231254) - update packages: changing architecture is only valid while an system update and NOT while an update via a patch. Bug 230685 - x86_64 MozillaFirefox binaries in security update repository - verifySystem: Do only regard items which will be on the system after the commit. Fate 301178 - feature #301369 Import listed GPG Keys from an trusted installation source - fix return call in new xml parser - Enable system resolvables in Helix parser (Revision 4787) - deptestomatic: Resetting transaction with the correct call; bugfix; Added kind in keep state (Revision 4788) - Wrong behaviour in soft install/uninstall. --> Setting Transact with soft (Revision 4789) - New call added: maySetToBeUninstalledSoft (Revision 4789) Both are only functions for the solver (Revision 4789) - Resetting "by causer" in order to distinguish from state "keep by user". ( function setLock in order to remove lock) (Revision 4789) - Better fix for Bug 217574: Checking if the resolveable CAN be deleted soft in QueueItemUninstall.cc (Revision 4790) - Regarding "keep state by user". So avoiding "reselecting" by other requirements. Give a corresponding problem solution if a resolvable satisfy a dependency, but has been set to keep by the user. Bug : 222531 (Revision 4791) - Allow to disable autoprotection of foreign vendor items. Required in zmd-backend. (F301735). - use sqlite-zmd if using > 10.2 in spec. Use the one available durin compile. - Item could has already been selected to soft uninstall (e.G. remove pattern which recommend this item ). Do not throw an exception anymore. bug#225278 - Added syscontent::Reader: Parse serialized set of ResObjects. (for F300729) - If there has already been selected another item by the solver (e.g. from another source) we will take thatone in order to avoid parallel installation and there concerning error messages. Bug 224698 - In order to handle conflicting resolvable we try to update the conflicting item. While evaluating these canditates an already selected candidate will not be regarded. So it could be that an older package will be selected for update although a newer has already been selected. Revision 4765 - Conflicting items: The resolvable will be obsoleted by another. So it is useless finding an update candidate and evaluate additional branches. - r4907 ------------------------------------------------------------------- Mon Dec 4 15:38:12 CET 2006 - mt@suse.de - Improved realpath() wrapper in media handler class (#222521). - revision 4758 ------------------------------------------------------------------- Thu Nov 30 09:15:20 CET 2006 - ma@suse.de - version 3.0.0 (2.x.x now in SuSE-Linux-10_2-Branch) - revision 4713 ------------------------------------------------------------------- Wed Nov 29 19:20:24 CET 2006 - dmacvicar@suse.de - use sqlite-zmd package for the non yet shipped zypp2/ stuff because backend uses this sqlite and it is no fun to install one and the other to develop (as the -devel packages) conflict. - add cmake support for building zypp/ lib. TODO: soinfo, compile testcases, devel, zypp2,docs find rpm, curl and others. - dont serialize interactive, as it is calculated now. (it was already fixed as we don't reimplement the method, but we still serialized, parsed) - r4709 ------------------------------------------------------------------- Tue Nov 28 22:40:12 CET 2006 - ma@suse.de - fixed Patch::interactive to return true as well, if the patch itself has a licence. (#224192) - revision 4702 - version 2.9.2 ------------------------------------------------------------------- Tue Nov 28 16:36:56 CET 2006 - mt@suse.de - Added search for /sbin/vol_id tool - that is in /lib/udev/vol_id on the installation image (#213852). - revision 4700 ------------------------------------------------------------------- Tue Nov 28 11:44:52 CET 2006 - schubi@suse.de - Avoid duplicate pool entries; Bug 223750; second part of the fix - r4698 - Version 2.9.1 ------------------------------------------------------------------- Mon Nov 27 18:29:58 CET 2006 - schubi@suse.de - Pool has multi instances of an item in the pool. Reduced this error to items which are identically at least. #217574 and #223750 - r4695 ------------------------------------------------------------------- Mon Nov 27 17:37:44 CET 2006 - dmacvicar@suse.de - replace spaces to underscores in product names - 2.8.7 - r4688 ------------------------------------------------------------------- Mon Nov 27 16:54:03 CET 2006 - dmacvicar@suse.de - Mark some strings for translation (#219783 need it) - r4682 ------------------------------------------------------------------- Mon Nov 27 16:17:07 CET 2006 - mt@suse.de - Added translations marks to hal, url and mutex exceptions (#23771) - revision 4680 ------------------------------------------------------------------- Wed Nov 22 19:24:57 CET 2006 - dmacvicar@suse.de - don't make libzypp-devel depend on sqlite-devel as headers from zypp2 are not installed yet - r4663 ------------------------------------------------------------------- Wed Nov 22 15:23:55 CET 2006 - ma@suse.de - Return an error if fork failed. (#204807) - Make Script execution abortable by user request. (#212949, F100233) - revision 4660 - version 2.8.6 ------------------------------------------------------------------- Tue Nov 21 16:25:03 CET 2006 - mvidner@suse.cz - Added package-manager wrapper script, with icon and .desktop (#222757). (Used by gnome-main-menu) - version 2.8.5 - r4640 ------------------------------------------------------------------- Tue Nov 21 13:11:06 CET 2006 - mt@suse.de - Fixed target/hal - one more dbus_connection_close found (#216035) - revision 4636 - version 2.8.4 ------------------------------------------------------------------- Mon Nov 20 14:15:38 CET 2006 - schubi@suse.de - translation added rev 4630 version 2.8.3 ------------------------------------------------------------------- Mon Nov 20 11:02:04 CET 2006 - ma@suse.de - Process obsoletes when installing non-package objects. (#217352) - revision 4621 - version 2.8.2 ------------------------------------------------------------------- Fri Nov 17 16:57:39 CET 2006 - mt@suse.de - Implemented volume device check using /sbin/vol_id (#213852). - Revision 4619 ------------------------------------------------------------------- Fri Nov 17 15:53:58 CET 2006 - schubi@suse.de - new translation added ------------------------------------------------------------------- Fri Nov 17 12:42:04 CET 2006 - mt@suse.de - Implemented an reuse of already existing foreign CD/DVD mount points (e.g. automounted) - depends on REUSE_FOREIGN_MOUNTS flag (#220206). - Added a fallback check of the volume.mount_point HAL property to isAutoMountedMedia(); info.hal_mount.created_mount_point seems to be not avaliable in newer HAL versions (on 10.2). - Revision 4615 - Version 2.8.1 ------------------------------------------------------------------- Thu Nov 16 23:39:15 CET 2006 - ma@suse.de - removed unused methods from Patch and PatchImplIf. Provided reasonable default implementation for Patch::interactive. (#221476). - revision 4610 - Version 2.8.0 ------------------------------------------------------------------- Thu Nov 16 15:32:04 CET 2006 - dmacvicar@suse.de - Handle media eject failures (#216545) - r4606 ------------------------------------------------------------------- Wed Nov 15 22:41:51 CET 2006 - ma@suse.de - Reimplemented RpmDb::checkPackage using librpm API instead of parsing "rpm --checksig" output. (#163202) - Version 2.7.4 - revision 4600 ------------------------------------------------------------------- Wed Nov 15 15:39:26 CET 2006 - schubi@suse.de - NEW behaviour of the solver: Obsolete virtual provides. E.G.: Installed: ----------- Name: test-1.0-0 Name: moretest-1.0-0 Provides: test To be installed ------------------ Name: nomoretest-1.0-0 Obsoletes: test Result -------- test-1.0-0 AND moretest-1.0-0 will be deleted. In former versions only test-1.0-0 had been deleted. Bug 220999 - Translations added Version 2.7.3 rev 4593 ------------------------------------------------------------------- Tue Nov 14 16:32:49 CET 2006 - schubi@suse.de - Bugfix in generating solver testcases: - added kind of capabilities in description file - removed unneded channel from uninstall in command file ------------------------------------------------------------------- Mon Nov 13 18:35:01 CET 2006 - mt@suse.de - Try to call /bin/eject utility if the eject-ioctl fails. - r4568 ------------------------------------------------------------------- Mon Nov 13 17:00:51 CET 2006 - dmacvicar@suse.de - ignore empty capabilities - r4565 ------------------------------------------------------------------- Fri Nov 10 17:52:10 CET 2006 - dmacvicar@suse.de - make progress strings translatable (#219783) - r4556 ------------------------------------------------------------------- Tue Nov 7 16:40:28 CET 2006 - schubi@suse.de - While deleting a selection all concerning recommended packages will be deleted too. BUT those packages should not be deleted which have been set to KEEP by the user. bug 217574 rev 4526 VERSION: 2.7.2 ------------------------------------------------------------------- Tue Nov 7 13:12:49 CET 2006 - schubi@suse.de - Makefile in zypp2 fixed Revision 4520 ------------------------------------------------------------------- Tue Nov 7 11:38:10 CET 2006 - schubi@suse.de - Translations added Revision 4514 VERSION: 2.7.1 ------------------------------------------------------------------- Mon Nov 6 12:32:22 CET 2006 - dmacvicar@suse.de - Make the parser more strict, rejecting broken sources but showing the error line. Last fix making the parser relax would break multitag descriptions with empty lines, now we check dependencies at a higher level. (reference #160607) - r4501 ------------------------------------------------------------------- Fri Nov 3 11:04:19 CET 2006 - schubi@suse.de - New problem solution added: Unlock ALL resovables in order to speed up problem solution. Bug 206453 ------------------------------------------------------------------- Fri Nov 3 10:29:08 CET 2006 - schubi@suse.de - Translations added ------------------------------------------------------------------- Thu Nov 2 17:15:19 CET 2006 - mt@suse.de - Fixed target/hal - removed dbus_connection_close calls, because the connections are shared; unref the ref-counted handle only. (#216035) - r4442 ------------------------------------------------------------------- Thu Nov 2 16:18:27 CET 2006 - dmacvicar@suse.de - skipping unreachable packages won't work (#215445) - r4468 ------------------------------------------------------------------- Wed Oct 25 19:04:51 CEST 2006 - dmacvicar@suse.de - (#213793) Target store fails to recreate stored install-time (other Date and ByteCount values as well) - skip comments and blank lines in multilists fixes (#214877) - zen-updater is not installed by default - Automatically fix broken products when reading the product database. still pending: honour the read-only flag Changes to make this possible include using read_dir instead of boost directory iterator. ------------------------------------------------------------------- Wed Oct 25 17:09:06 CEST 2006 - schubi@suse.de - added new class for generating solver testcases: Testcase ------------------------------------------------------------------- Wed Oct 25 15:40:44 CEST 2006 - ma@suse.de - Finalized ui::PatternContents. (F301229) - version 2.7.0 - revision 4413 ------------------------------------------------------------------- Wed Oct 25 08:21:52 CEST 2006 - mvidner@suse.cz - Moved zypper and zypp-checkpatches(-wrapper) to zypper.rpm - version 2.6.0 ------------------------------------------------------------------- Tue Oct 24 14:33:16 CEST 2006 - ma@suse.de - Added ui::PatternContents: Helper class that will compute a patterns expanded install_packages set. (UI interface for F301229) - revision 4387 ------------------------------------------------------------------- Tue Oct 24 09:06:24 CEST 2006 - mvidner@suse.cz - removed the last reference to /usr/lib64 to fix the build ------------------------------------------------------------------- Mon Oct 23 17:44:42 CEST 2006 - mvidner@suse.cz - added "zypper info" (jkupec) - version 2.5.2 ------------------------------------------------------------------- Mon Oct 23 11:28:01 CEST 2006 - dmacvicar@suse.de - fix rpm db timestamp - add extra urls and optional urls to product API - r4378 ------------------------------------------------------------------- Fri Oct 20 16:55:44 CEST 2006 - mvidner@suse.cz - zypper: nicer progress reports, with or without --verbose. ------------------------------------------------------------------- Fri Oct 20 16:25:50 CEST 2006 - ma@suse.de - Fixed reloading of target data after commit. Broken since rev 3880. - version 2.5.1 - revision 4365 ------------------------------------------------------------------- Fri Oct 20 16:22:09 CEST 2006 - dmacvicar@suse.de - put query-pool in /usr/lib/zypp and not lib64 - r4363 ------------------------------------------------------------------- Fri Oct 20 12:16:06 CEST 2006 - dmacvicar@suse.de - revert keyring changes, causes endless loop (obvious) - add dist-product information, adapt store - version 2.5.0 - r4355 ------------------------------------------------------------------- Fri Oct 20 11:04:26 CEST 2006 - ma@suse.de - zypp-query-pool: For products show additionally distributionName and distributionEdition. (required by #205392) - revision 4349 ------------------------------------------------------------------- Fri Oct 20 00:13:49 CEST 2006 - ma@suse.de - Add accessor for Product distributionName and distributionEdition. (required by #205392) - revision 4347 ------------------------------------------------------------------- Thu Oct 19 18:40:36 CEST 2006 - dmacvicar@suse.de - added test case for KeyRing - fire trustedKeyAdded in all calls to import trusted key not only in signature check workflow. - r4342 ------------------------------------------------------------------- Thu Oct 19 18:27:02 CEST 2006 - mvidner@suse.cz - zypper update: implemented minimal version (patches only) - zypper list-updates: changed default type from package to patch, consider patches affecting the package manager separately ------------------------------------------------------------------- Thu Oct 19 14:09:33 CEST 2006 - dmacvicar@suse.de - version 2.4.1 - r4338 ------------------------------------------------------------------- Thu Oct 19 14:05:18 CEST 2006 - dmacvicar@suse.de - add zypp-query-pool, so registration doesn't depend on libzypp-zmd-backend being installed. Will remove from backend when suseregister gets updated. ------------------------------------------------------------------- Thu Oct 19 12:31:08 CEST 2006 - schwab@suse.de - Make sure config.rpath is present. ------------------------------------------------------------------- Wed Oct 18 21:40:25 CEST 2006 - mvidner@suse.cz - zypper search: fixed uninitialized members that made all searches exact and case sensitve ------------------------------------------------------------------- Wed Oct 18 13:13:16 CEST 2006 - dmacvicar@suse.de - zypp-checkpatches, write in the right file - r4328 ------------------------------------------------------------------- Wed Oct 18 12:45:49 CEST 2006 - schubi@suse.de - Install resolvables although they are unneeded if they have NOT the kind patch/atoms Bug 210538 - freshens/supplements does not work with patterns - r4326 ------------------------------------------------------------------- Tue Oct 17 19:17:39 CEST 2006 - mvidner@suse.cz - zypper service-add -r http://example.org/foo.repo (F#300641). ------------------------------------------------------------------- Tue Oct 17 18:29:34 CEST 2006 - dmacvicar@suse.de - zypp-checkpatches: save version of the generated xml to regenerate it if it changes. save a random token in case of error to force recreating xml file - r4321 ------------------------------------------------------------------- Tue Oct 17 13:49:53 CEST 2006 - dmacvicar@suse.de - remove permissions for zypp checkpatches from spec - r4318 ------------------------------------------------------------------- Tue Oct 17 12:36:57 CEST 2006 - dmacvicar@suse.de - registration fails because of wrong product data (#205392) use DISTPRODUCT,DISTVERSION to create the product resolvable. have this resolvable provide PRODUCT = VERSION - r4312 ------------------------------------------------------------------- Mon Oct 16 18:05:56 CEST 2006 - mvidner@suse.cz - zypper service-add -r ./foo.repo (F#300641). ------------------------------------------------------------------- Mon Oct 16 15:02:00 CEST 2006 - jkupec@suse.cz - zypper: added case-sensitive search, search in descriptions and summaries, search by resolvable type, substring and word matching, support for wildcards - Revision 4303 ------------------------------------------------------------------- Mon Oct 16 13:27:50 CEST 2006 - mvidner@suse.cz - Prevent the user from sending signals to zypp-checkpatches-wrapper (#211286). ------------------------------------------------------------------- Mon Oct 16 12:57:56 CEST 2006 - schubi@suse.de - Dont incomplete an uninstalled resolvable, even not when establishing. Incomplete only makes sense for installed resolvables (when they have broken deps), for patches (because they are needed) and for atoms (because they are used during patch calculation) Bug 198379 - Do not branch for packages with the same NVE but different architectures. Take the best architecture. ------------------------------------------------------------------- Fri Oct 13 16:51:43 CEST 2006 - dmacvicar@suse.de - implement rename source in sourcemanager - r4286 ------------------------------------------------------------------- Fri Oct 13 14:32:44 CEST 2006 - dmacvicar@suse.de - YaST sources: set alias to product summary if empty - show alias on logs. - r4281 ------------------------------------------------------------------- Thu Oct 12 16:40:29 CEST 2006 - dmacvicar@suse.de - version 2.4.0 (bin incompat due to callback fixes) - r4272 ------------------------------------------------------------------- Thu Oct 12 16:30:55 CEST 2006 - ma@suse.de - Provide additional solver status information to the UI. (#162164,F301272) - Fixed UI satus computation in presence of multiple available candidates. - revision 4264 - version 2.3.1 ------------------------------------------------------------------- Thu Oct 12 15:45:12 CEST 2006 - dmacvicar@suse.de - remove const in MediaChangeReport requestMedia that broke cd changing. - r4262 ------------------------------------------------------------------- Wed Oct 11 08:35:48 CEST 2006 - mvidner@suse.cz - zypper: added search (jkupec) - removed the suid bit from zypp-checkpatches-wrapper so that the build passes until permissions.rpm is updated (~#211286). - r4253 ------------------------------------------------------------------- Tue Oct 10 16:03:40 CEST 2006 - dmacvicar@suse.de - Log microseconds if ZYPP_PROFILING env var is enabled. - r4252 ------------------------------------------------------------------- Mon Oct 9 18:15:19 CEST 2006 - dmacvicar@suse.de - YaST sources: Factory cannot be set with 'refresh' enabled (#204957) - get rid of some const bool signatures in Source classes - r4247 ------------------------------------------------------------------- Mon Oct 9 15:11:16 CEST 2006 - mvidner@suse.cz - Added zypp-checkpatches and a suid-root zypp-checkpatches-wrapper. ------------------------------------------------------------------- Fri Oct 6 13:23:32 CEST 2006 - schubi@suse.de - select the best solution: prefering the total amount of install/update packages BEFORE source preferences. Bug 208784 ------------------------------------------------------------------- Fri Oct 6 11:55:11 CEST 2006 - dmacvicar@suse.de - Introduce a method to see if a source supports a kind of resolvable at that time, so we can init a YUM source like factory but avoid parsing it if it contains no patches. - add TODO - zypp-checkpatches xml output - r4235 ------------------------------------------------------------------- Mon Oct 2 16:34:03 CEST 2006 - mvidner@suse.cz - added a CLI preview: zypper - revision 4214 - version 2.2.3 ------------------------------------------------------------------- Mon Oct 2 15:11:26 CEST 2006 - dmacvicar@suse.de - FATE #100165: Make Content File Aware of Different Architectures expand %a in release notes with architecture ------------------------------------------------------------------- Fri Sep 29 16:10:46 CEST 2006 - ma@suse.de - Extended pattern parser to support includes/extends tags as hint for the IO. (F301229) - revision 4199 - version 2.2.2 ------------------------------------------------------------------- Fri Sep 29 00:31:33 CEST 2006 - ma@suse.de - Enabled sending of ScriptResolvableReport. - Changed ScriptResolvableReport::start to send local path of script to be executed. - revision 4190 - version 2.2.1 ------------------------------------------------------------------- Wed Sep 27 14:14:33 CEST 2006 - ma@suse.de - Added ScriptResolvableReport. Callbacks triggered on script execution during commit. (F100233) - revision 4187 - version 2.2.0 ------------------------------------------------------------------- Mon Sep 25 13:52:55 CEST 2006 - mvidner@suse.cz - fix: Url::getRegisteredSchemes() would always return nothing ------------------------------------------------------------------- Fri Sep 22 15:34:11 CEST 2006 - jkupec@suse.cz - Made the build dependency on gettext-devel explicit ------------------------------------------------------------------- Tue Sep 19 10:59:24 CEST 2006 - jsrain@suse.cz - adapted multi-media YUM sources according to official YUM specification (F300743) ------------------------------------------------------------------- Mon Sep 18 17:42:26 CEST 2006 - lslezak@suse.cz - use RPM_OPT_FLAGS (meissner@suse.de) ------------------------------------------------------------------- Mon Sep 18 15:19:53 CEST 2006 - lslezak@suse.cz - SourceFactory::createFrom() - don't loose url,... - r4160 ------------------------------------------------------------------- Mon Sep 18 12:00:46 CEST 2006 - kkaempf@suse.de - reduce logging in ResolvableImpl.cc - rev 4157 ------------------------------------------------------------------- Thu Sep 14 15:59:47 CEST 2006 - schubi@suse.de - Replaced requirementIsMet by requirementIsInstalledOrUnneeded in QueueItemInstall and QueueItemRequire Bug 192535/204913 removed fix:Thu Sep 7 18:31:46 CEST 2006 - schubi@suse.de ------------------------------------------------------------------- Thu Sep 14 12:44:53 CEST 2006 - lslezak@suse.cz - fixed SourceFactory::createFrom() - don't loose alias, cachedir,... parameters ------------------------------------------------------------------- Thu Sep 14 10:21:02 CEST 2006 - mvidner@suse.cz - Use RPM Enhances only if detected at configure time, to allow compilation with older rpm. - callback params: use const string & instead of string (dmacvicar) ------------------------------------------------------------------- Thu Sep 7 18:31:46 CEST 2006 - schubi@suse.de - Do not regarding SATISFIED (regarding UNNEEDED) in isPresent if it is a package/script/message Bug: 192535 ------------------------------------------------------------------- Thu Sep 7 16:19:36 CEST 2006 - dmacvicar@suse.de - add Source_Ref::checksum() which in combination with timestamp can give an idea of a source change. - r4106 ------------------------------------------------------------------- Thu Sep 7 14:32:38 CEST 2006 - mvidner@suse.cz - Implemented fgzstreambuf::compressed_tell and fXstream::getbuf to enable progress reporting on compressed streams. ------------------------------------------------------------------- Wed Sep 6 18:31:20 CEST 2006 - dmacvicar@suse.de - better error propagation - r4096 ------------------------------------------------------------------- Tue Sep 5 19:22:56 CEST 2006 - mt@suse.de - Removed libblkid dependency - the workaround using libblkid to check filesystem on XEN vbd mapped devices is obsolete, because the info is avaliable via /dev/disk/by-label link now. (#197107) - revision 4087 ------------------------------------------------------------------- Thu Aug 31 15:16:11 CEST 2006 - ma@suse.de - PackageProvider: Fixed broken retry. (#202163) - revision 4071 ------------------------------------------------------------------- Wed Aug 30 23:50:55 CEST 2006 - ma@suse.de - Fixed RpmDb::makePackageFromHeader: Catch NULL Header passed as argument and refuse to create a Package from a source package header. - Added method Pathname::extension: Return all of the characters in name after and including the last dot in the last element of name. - PlaindirImpl: Disable rpm signature verification when scaning a directory for rpms. Otherwise we'd need access to the rpm database to get the keys. - revision 4069 ------------------------------------------------------------------- Wed Aug 30 17:42:40 CEST 2006 - schubi@suse.de - Do not regarding SATISFIED/UNNEEDED in isPresent if it is a package/script/message Bug: 192535 ------------------------------------------------------------------- Wed Aug 30 14:29:45 CEST 2006 - ma@suse.de - Speedup computation of number of rpm database entries. - revision 4058 ------------------------------------------------------------------- Tue Aug 29 16:58:20 CEST 2006 - schubi@suse.de - Fixed endless loop in transactResObject Bug 198095 - YaST2 Installaler crashes when selecting Gnome pattern to a KDE installation ------------------------------------------------------------------- Tue Aug 29 12:05:09 CEST 2006 - dmacvicar@suse.de - fix some testcases for tar file parser changes - r4045 ------------------------------------------------------------------- Tue Aug 29 11:19:53 CEST 2006 - dmacvicar@suse.de - missing includes - clean old callbacks - r4041 ------------------------------------------------------------------- Fri Aug 25 14:32:07 CEST 2006 - schubi@suse.de - zyppPattern->install_packages returns SUGGESTED package too. Bug 201476 Revision 4036 ------------------------------------------------------------------- Fri Aug 25 13:05:33 CEST 2006 - schubi@suse.de - New behaviour in the solver: try with 'best' package first, try with 'all' packages if this fails. Bug :Bug 191983 ------------------------------------------------------------------- Fri Aug 25 11:35:48 CEST 2006 - dmacvicar@suse.de - libzypp 2.1.0 - bump version due to incompatible callback changes in KeyRing Sources ------------------------------------------------------------------- Thu Aug 24 15:34:45 CEST 2006 - dmacvicar@suse.de - new keyring callbacks - separate trust key from import key - use PublicKey class instead of params, to be able to add more info like photos later (pending #181682) - update zmart with those callbacks. - better error handling (Exception types) - make tmp file names more readable depending on the context - r4026 ------------------------------------------------------------------- Tue Aug 22 22:35:30 CEST 2006 - dmacvicar@suse.de - decouple probing from source creation, using the new media test for existence functions. - r4019 ------------------------------------------------------------------- Tue Aug 22 17:56:53 CEST 2006 - mt@suse.de - Fixed getDoesFileExist to reset the transfer range - Added logging of curl debug messages to the zypp log. The env var ZYPP_MEDIA_CURL_DEBUG=1 logs curl infos, ZYPP_MEDIA_CURL_DEBUG=2 logs the in/out headers. - r4018 ------------------------------------------------------------------- Fri Aug 18 14:57:35 CEST 2006 - kkaempf@suse.de - remove the /etc/sysconfig/zypp:REWRITE_KERNEL_DEPS = yes check; see rev 3810 below. (#190163) - rev 3998 ------------------------------------------------------------------- Thu Aug 17 18:15:14 CEST 2006 - dmacvicar@suse.de - fix uninstalling of atoms (noop) - r3995 ------------------------------------------------------------------- Wed Aug 16 17:41:40 CEST 2006 - dmacvicar@suse.de - Implement initial verson of Media doesFileExist, for future source probing. - r3984 ------------------------------------------------------------------- Tue Aug 15 12:01:31 CEST 2006 - dmacvicar@suse.de - more dbus_connection_close fixes - r3974 ------------------------------------------------------------------- Tue Aug 15 11:41:41 CEST 2006 - kkaempf@suse.de - clean up 'incomplete' handling in QueueItemEstablish. - rev 3973. ------------------------------------------------------------------- Tue Aug 15 11:30:50 CEST 2006 - kkaempf@suse.de - Don't set 'incomplete' for uninstalled patterns or products. (#198379) - rev 3970. ------------------------------------------------------------------- Mon Aug 14 16:50:53 CEST 2006 - schubi@suse.de - Added new API calls: setAdditionalProvide setAdditionalConflict setAdditionalRequire ------------------------------------------------------------------- Mon Aug 14 11:26:20 CEST 2006 - dmacvicar@suse.de - don't link examples to testsuite library. ------------------------------------------------------------------- Sat Aug 12 17:30:30 CEST 2006 - schwab@suse.de - Disable profiling to work around compiler bug. ------------------------------------------------------------------- Fri Aug 11 17:01:33 CEST 2006 - dmacvicar@suse.de - forward port 3924:3939 - Add explicit finish callbacks for subtasks during ProvidePackage to avoid UI confusion. - rev3957 ------------------------------------------------------------------- Fri Aug 11 11:48:44 CEST 2006 - dmacvicar@suse.de - Introduce examples/ - fix some svn ignores - fix compilation. Use: dbus_connection_close - rev 3943 ------------------------------------------------------------------- Thu Aug 10 16:32:36 CEST 2006 - dmacvicar@suse.de - Initial support for plain directory with rpms as source - r3935 ------------------------------------------------------------------- Tue Aug 8 16:51:45 CEST 2006 - dmacvicar@suse.de - Move the target query by kind function to a iterator, so we dont make a copy of the restore the iterator works loading by demand too ------------------------------------------------------------------- Mon Aug 7 17:57:26 CEST 2006 - dmacvicar@suse.de - rename the new initTarget to initializeTarget, leave the old one as is, but deprecate it. - r3903 ------------------------------------------------------------------- Mon Aug 7 15:10:08 CEST 2006 - dmacvicar@suse.de - forward port from SLES10 branch , till 3888 - Prefer to use available DeltaRpm or PatchRpm instead of downloading full packages. (#168844) - rpmdb : Do not use the deprecated POSIX API, but boost::regex - version 2.0.0 - rev 3893 ------------------------------------------------------------------- Fri Aug 4 15:20:13 CEST 2006 - dmacvicar@suse.de - Separate target init from adding resolvables, getting rid of the uggly bool flag. - dont clear the store each time Target::resolvables is called - Load target resolvables on demand by kind, keep them cached later - add Target::resolvablesByKind(kind) to allow query specific kind without reading all kinds. Used to port TargetProduct, which was reading the whole rpm database only to displayy base product name in YaST help. - commit to pkg-bindings and packager will follow. - jsrain will port more yast stuff, especially inst_source which startup time should by reduced by half afterwards. - rev 3880 ------------------------------------------------------------------- Tue Aug 1 13:37:29 CEST 2006 - dmacvicar@suse.de - forward port: rev 3786 fix to stalle tmpfiles broke patches. SLES was released with this broken. 10.1 has a blocked zypp update because this. Attempt to fix this. (#192535) - fix configure.ac sqlite-source build path - rev 3858 ------------------------------------------------------------------- Fri Jul 21 10:58:58 CEST 2006 - dmacvicar@suse.de - link correctly ------------------------------------------------------------------- Wed Jul 19 13:50:57 CEST 2006 - dmacvicar@suse.de - dont link sqlite in the main lib. - rev 3826 ------------------------------------------------------------------- Tue Jul 18 17:42:45 CEST 2006 - dmacvicar@suse.de - susetags: parse product parser regexp only once - parse yum factory 5 sec. (from 30) faster using another string find algorithm - rev 3824 ------------------------------------------------------------------- Tue Jul 18 12:56:17 CEST 2006 - dmacvicar@suse.de - Digest: Don't read the stream character wise but reading blocks, as advised by matz profiling. - r3819 ------------------------------------------------------------------- Mon Jul 17 12:54:39 CEST 2006 - ma@suse.de - Add "openSUSE", "ATI Technologies Inc." and "Nvidia" to trusted vendors. (#189573) - revision 3804 ------------------------------------------------------------------- Thu Jul 13 12:52:58 CEST 2006 - dmacvicar@suse.de - backport fix for stalle tmpfile (#191311) - rev 3788 ------------------------------------------------------------------- Wed Jun 28 13:22:22 CEST 2006 - mt@suse.de - deactivated media manager code that was disabling the automounter (#172419) - rev 3724 ------------------------------------------------------------------- Mon Jun 26 17:14:53 CEST 2006 - dmacvicar@suse.de - fix autorefresh (#186115) - revision 3708 ------------------------------------------------------------------- Fri Jun 23 13:41:18 CEST 2006 - ma@suse.de - forward port from SLE branch - Set default permission for logfiles to 0640. (#187044) - revision 3696 ------------------------------------------------------------------- Thu Jun 22 16:01:15 CEST 2006 - ma@suse.de - forward port from SLE branch - Fixed installation of SP or Add-On product switching to media 2 too early. (#186607) - revision 3691 ------------------------------------------------------------------- Wed Jun 21 15:47:39 CEST 2006 - dmacvicar@suse.de - forward port from SLE branch - Strip self provides without edition in Resolvable ctor. (#186079) - Source::provideResolvables not implemented in yum source type. Product not set for packages that are available from update source (#186920) - Hook modalias() supplements without package to "kernel" (#184840) - Allow on-demand SourceManager::restore() (#186678) - Hook modalias() supplements without package to "kernel" (#184840) - rev 3676 ------------------------------------------------------------------- Mon Jun 19 15:17:17 CEST 2006 - mt@suse.de - Fix adding resolving of path names for mount points (#181606) - rev 3658 ------------------------------------------------------------------- Mon Jun 19 13:52:14 CEST 2006 - dmacvicar@suse.de - merge download algorithm and refactoring from branch (#181204) ------------------------------------------------------------------- Thu Jun 15 17:53:40 CEST 2006 - mvidner@suse.cz - autodocs: use find+xargs to overcome command length limit, do not call doxygen unnecessarily (#185334). - rev 3645 ------------------------------------------------------------------- Thu Jun 15 07:26:29 CEST 2006 - kkaempf@suse.de - Dont use getZYpp in static constructor (#185198) Bugfix #178292 was wrong. - Only warn on incompleting installed resolvables (#185197) - rev 3644 ------------------------------------------------------------------- Wed Jun 14 22:43:40 CEST 2006 - kkaempf@suse.de - Atoms might only be installed via patches (#184714) - rev 3642 ------------------------------------------------------------------- Wed Jun 14 17:26:39 CEST 2006 - dmacvicar@suse.de - fix for the last stall tmpfile (#178292) - r3637 ------------------------------------------------------------------- Wed Jun 14 12:06:57 CEST 2006 - mt@suse.de - Implemented transfer timeout inside of the progress callback. The timeout value can be set using timeout url parameter, the default transfer timeout is 180 seconds. (#181602) - Added ssl_verify and ssl_capath url options used in https scheme, allowing to change or disable the ssl verify options. (#171622) - Added fallback on read failures of /etc/mtab to /proc/mounts. Improved verbosity in mount and mount check related failure cases, incl. /etc/mtab dump. (#181606) - rev 3623 ------------------------------------------------------------------- Wed Jun 14 10:49:10 CEST 2006 - kkaempf@suse.de - combine knownAliases and knownUrls in a single function. - rev 3616 ------------------------------------------------------------------- Mon Jun 12 16:27:46 CEST 2006 - kkaempf@suse.de - honor parallel installs in resolver context (#181103) - rev 3592 ------------------------------------------------------------------- Mon Jun 12 15:37:10 CEST 2006 - dmacvicar@suse.de - right fix for tmpdir initialized in static constructor - catch around provideJustFile in providePackage -rev 3654 ------------------------------------------------------------------- Mon Jun 12 15:15:07 CEST 2006 - dmacvicar@suse.de - fix #182003 YUM packages without size - rev 3587 ------------------------------------------------------------------- Mon Jun 12 14:58:55 CEST 2006 - kkaempf@suse.de - Allow to restore and remove by Url - rev 3583 ------------------------------------------------------------------- Mon Jun 12 13:07:31 CEST 2006 - kkaempf@suse.de - make atoms parallel installable (#181103) - rev 3580 ------------------------------------------------------------------- Fri Jun 9 16:28:11 CEST 2006 - dmacvicar@suse.de - Allow to restore by alias - r3568 ------------------------------------------------------------------- Fri Jun 9 13:06:16 CEST 2006 - mvidner@suse.cz - Do not fork in a global destructor, perl dislikes it (#182672). Fixes hanging ag_ldapserver and yast2-perl-bindings tests. ------------------------------------------------------------------- Thu Jun 8 16:24:55 CEST 2006 - ma@suse.de - Installation: Assert product information is stored to libzypp database before reboot. (#181198) - Version 1.2.0; revision 3553 ------------------------------------------------------------------- Wed Jun 7 13:55:23 CEST 2006 - visnov@suse.cz - Synchronize keys with rpm database before closing access to it (#182338) - rev 3533 ------------------------------------------------------------------- Wed Jun 7 11:40:46 CEST 2006 - mt@suse.de - Changed to just prefer DVD drives in "dvd:" scheme, instead of filter out the non-DVD drives completely. Allows a fallback to drives without the dvd HAL property e.g. in VMWare. (#177457) - rev 3530 ------------------------------------------------------------------- Wed Jun 7 01:00:06 CEST 2006 - dmacvicar@suse.de - Merge fix for stalle tmpdir due to cyclic references, using a master TmpDir for zypp. (#178292) . There is still 1 tmpdir to fix. - rev 3521 ------------------------------------------------------------------- Wed Jun 7 01:00:05 CEST 2006 - dmacvicar@suse.de - Fixes unneeded file download, and add download callbacks (still need yast side) #181204 and #160206 - Fix stalle tmpdir due to cyclic references, using a master TmpDir for zypp. # 178292 ------------------------------------------------------------------- Wed Jun 7 00:02:18 CEST 2006 - ma@suse.de - fixed memory leak in PersistentStorage (#168690) - revision 3519 ------------------------------------------------------------------- Tue Jun 6 22:24:00 CEST 2006 - ma@suse.de - fixed memory leak in XMLSourceCacheParser (#168690) - revision 3517 ------------------------------------------------------------------- Fri Jun 2 16:09:03 CEST 2006 - schubi@suse.de -latest fi translation added Revision 3502 ------------------------------------------------------------------- Thu Jun 1 15:11:47 CEST 2006 - schubi@suse.de -All installed resolvables has been set to "satisfied" in ResolverContext::unneeded . BUT: Patch concerning resolvables have to be set to "unneeded" although they are installed. In order getting the state "no longer applicable" (Bug 171590) - rev 3496 ------------------------------------------------------------------- Thu Jun 1 14:54:02 CEST 2006 - kkaempf@suse.de - compute status for scripts and messages so their freshens get properly honored (aj with postgresql-server) - rev 3494 ------------------------------------------------------------------- Thu Jun 1 13:57:48 CEST 2006 - dmacvicar@suse.de - revert not-used-yet rpmdb timestamp, as it broke rpmdb::init(). (#180040) - rev 3490 ------------------------------------------------------------------- Thu Jun 1 11:03:34 CEST 2006 - schubi@suse.de - updating gmo files, if po files has been changed; bug 164449 ------------------------------------------------------------------- Wed May 31 18:32:58 CEST 2006 - dmacvicar@suse.de - Dont download twice if starting from 1st time - fix typo - rev 3481 ------------------------------------------------------------------- Wed May 31 17:06:48 CEST 2006 - dmacvicar@suse.de - set cache dir only if storeMetadata is called as a public method.´ - rev 3475 ------------------------------------------------------------------- Wed May 31 15:27:38 CEST 2006 - kkaempf@suse.de - schedule a package for installation if - it freshens / supplements something - it is not installed yet (#178721) - rev 3473 ------------------------------------------------------------------- Wed May 31 15:22:43 CEST 2006 - dmacvicar@suse.de - make susetags also implement download and check first. - rev 3470 ------------------------------------------------------------------- Tue May 30 12:43:47 CEST 2006 - dmacvicar@suse.de - make yum more robust. Never parse from provideFile but only from local disk. Make sure the cache is consistent before recreating it. the code is easier to follow and probably faster. checksum and signatures are checked on caching not on parsing. Required to implement refresh for #154990 - rev 3452 ------------------------------------------------------------------- Wed May 24 16:57:54 CEST 2006 - dmacvicar@suse.de - implement timestamp for YUM and SuseTags - actually use the license to confirm in yum patches - add prerequires tag in yum optonally to the bad designed and nonintuitive pre=1 - rev 3448 ------------------------------------------------------------------- Wed May 24 15:30:32 CEST 2006 - dmacvicar@suse.de - dont pass root on init but before. - implement rpm db modification timestamp not used yet - move Helix source to testsuite out of the solver so we can use it for target, storage tests - add Source_Ref::timestamp(), default to now() in order to implement smart sync of sources by zmd - don't parse desc and summary twice - fix a segfault with tranlated text - fix broken size tag introduced in rev 3427 - rev 3446 ------------------------------------------------------------------- Tue May 23 20:53:27 CEST 2006 - dmacvicar@suse.de - dont accept corrupt sources, improve logs ------------------------------------------------------------------- Tue May 23 17:26:41 CEST 2006 - ma@suse.de - Added PoolItem_Ref::statusReset. Resets the PoolItem status without loosing autoprotection (eg. for foreign vendor). (assists #177469) - rev 3431 ------------------------------------------------------------------- Tue May 23 17:04:04 CEST 2006 - jsrain@suse.cz - added mediaNr() to PatchRpm and DeltaRpm classes - rev 3430 ------------------------------------------------------------------- Tue May 23 15:58:04 CEST 2006 - dmacvicar@suse.de - enable YUM license to confirm. needed for #174476 - adapt store to serialize and read all new resobject fields - use install-time to now() when serializing (#174653) - rev 3427 ------------------------------------------------------------------- Mon May 22 20:51:59 CEST 2006 - ma@suse.de - Do not violate install order when restricting commit to a certain mediaNumber. (#170079) - Version 1.1.0; rev 3423 ------------------------------------------------------------------- Mon May 22 19:03:20 CEST 2006 - mvidner@suse.cz - Added SourceManager::findSourceByUrl to overcome alias mismatches (#177543). - rev 3420 ------------------------------------------------------------------- Mon May 22 17:19:25 CEST 2006 - ma@suse.de - Order all objects according to prerequirements, not just packages. (#173690) - rev 3419 ------------------------------------------------------------------- Mon May 22 15:57:43 CEST 2006 - schubi@suse.de - Added new translation ------------------------------------------------------------------- Fri May 19 12:53:44 CEST 2006 - dmacvicar@suse.de - fix missing homedir option for gpg (#171055) - rev 3415 ------------------------------------------------------------------- Thu May 18 19:08:52 CEST 2006 - ma@suse.de - Prevent against daemons launched in rpm %post, that do not close their filedescriptors. (#174548) - Version 1.0.1; rev 3413 ------------------------------------------------------------------- Thu May 18 16:51:41 CEST 2006 - jsrain@suse.cz - fixed media number of package retrieved as a part of a patch (#174841) - rev 3409 ------------------------------------------------------------------- Thu May 18 16:16:21 CEST 2006 - dmacvicar@suse.de - fix missing package descriptions due to filtered packages by incompatible architectures. (#159109) - rev 3404 ------------------------------------------------------------------- Thu May 18 16:08:42 CEST 2006 - kkaempf@suse.de - decrease logging in DiskUsageCounter and Modalias (#163186) - rev 3406 ------------------------------------------------------------------- Thu May 18 10:43:47 CEST 2006 - ma@suse.de - Stay backward comapatible. ------------------------------------------------------------------- Tue May 16 21:35:27 CEST 2006 - ma@suse.de - Make basic attributes available through ResObject. - Let ResObjects which do not require media access during commit return ZERO sourceMediaNr (required for #173690) - Version 1.0.0 - rev 3390 ------------------------------------------------------------------- Tue May 16 15:11:35 CEST 2006 - kkaempf@suse.de - reduce logging verbosity (#163186) - rev 3381 ------------------------------------------------------------------- Tue May 16 14:00:57 CEST 2006 - schubi@suse.de - setCandidate accept candidates with compatible architectures too. Not only with the same architecture. Bug 172594 - If update package has differet arch, UI display is wrong ------------------------------------------------------------------- Tue May 16 09:30:45 CEST 2006 - mvidner@suse.cz - Added Source_Ref::resStoreInitialized. If we know that noone has seen the resolvables yet, we can skip them too, eg. when deleting a source. (#174840) - rev 3378 ------------------------------------------------------------------- Mon May 15 12:41:39 CEST 2006 - kkaempf@suse.de - Honor freshens as conditionals independant from the installed/ uninstalled status (#174797) - rev 3376 ------------------------------------------------------------------- Mon May 15 11:15:03 CEST 2006 - kkaempf@suse.de - State modifier "unneeded" is transitive for patches (#171590) - rev 3375 ------------------------------------------------------------------- Thu May 11 17:42:29 CEST 2006 - schubi@suse.de - Do not transact itself (update) in the transactResObject mechanism Bug 174290 ------------------------------------------------------------------- Thu May 11 16:37:51 CEST 2006 - mt@suse.de - Reenabled improved large file support flags (unintentionally removed in rev 1544). Fixes bug #173753. - Added large file support flags to libzypp.pc file allowing consistence checks in the application using features variable - rev 3366 ------------------------------------------------------------------- Thu May 11 10:49:36 CEST 2006 - mvidner@suse.cz - SourceManager: moved source deletion before creation so that we can recreate a deleted one (#174295) - removed dead code dealing with known_caches from SourceManager::store (see r3195) - r3362 ------------------------------------------------------------------- Thu May 11 10:15:14 CEST 2006 - jsrain@suse.cz - fixed returning product short name and summary if product read from target store (#148625) - rev 3360 ------------------------------------------------------------------- Wed May 10 11:39:06 CEST 2006 - jsrain@suse.cz - set media verifier on redirected medium (#172599) - rev 3359 ------------------------------------------------------------------- Mon May 8 17:28:42 CEST 2006 - kkaempf@suse.de - fix 'transactResKind' to collect best providers by capability and to recursively transact items of same kind (#170114) - rev 3355 ------------------------------------------------------------------- Mon May 8 16:45:46 CEST 2006 - dmacvicar@suse.de - serialize the full URL to avoid missing password and other url settings (#148108) - rev 3353 ------------------------------------------------------------------- Fri May 5 17:47:14 CEST 2006 - mt@suse.de - Added a 60 sec connect timeout to MediaCurl (#172860) - rev 3348 ------------------------------------------------------------------- Thu May 4 15:15:37 CEST 2006 - kkaempf@suse.de - re-fetch also .asc and .key files before checking signature (#172597) - rev 3350 (3345-10.1) ------------------------------------------------------------------- Wed May 3 17:40:45 CEST 2006 - dmacvicar@suse.de - Fix yum key verification, because a double variable declaration ------------------------------------------------------------------- Wed May 3 15:34:00 CEST 2006 - dmacvicar@suse.de - use --no-default-keyring to avoid creating a default gpg dir in / (#171055) - rev 3335 ------------------------------------------------------------------- Wed May 3 14:40:25 CEST 2006 - dmacvicar@suse.de - Fix YUM signature checking, we were passing the key instead of the signature. - When the user trust a key, sync again. Bye to the session trusted keys and user being asked all the time. (#171213) - r3332 ------------------------------------------------------------------- Wed May 3 14:22:02 CEST 2006 - ma@suse.de - Cleanup index tables when removing items from pool (#170564). ------------------------------------------------------------------- Wed May 3 12:23:36 CEST 2006 - kkaempf@suse.de - backout rev 3246->3275 of TargetImpl.cc - add missing testsuite/utils/TestUtils.h - rev 3330 ------------------------------------------------------------------- Wed May 3 12:13:38 CEST 2006 - dmacvicar@suse.de - more fixes for #171062, there were some files still not being read from cache. - r3327 ------------------------------------------------------------------- Tue May 2 18:41:44 CEST 2006 - dmacvicar@suse.de - cache keys and signature. Remove lot of duplicated code. (#171062) - r3320 ------------------------------------------------------------------- Tue May 2 18:02:46 CEST 2006 - mt@suse.de - Disabled isUseableAttachPoint check in MediaDIR -- we do not mount here anything, so it is OK to use any dir (171351). - rev 3318 ------------------------------------------------------------------- Tue May 2 14:58:03 CEST 2006 - kkaempf@suse.de - parse "license-to-confirm" in primary.xml (#168437) - rev 3312 ------------------------------------------------------------------- Mon May 1 17:44:29 CEST 2006 - kkaempf@suse.de - Don't try to store 'Atom', not needed and the backend store rejects them anyways (addtion to #168610) - rev 3306 ------------------------------------------------------------------- Mon May 1 04:43:01 CEST 2006 - mt@suse.de - Improved device check in MediaDISK using libblkid (Bug #158529) - Allow to provide sysfs path via $SYSFS_PATH in MediaCD.cc and added a check if it is a directory - Added libcurl and libblkid checks to configure.ac - Added e2fsprogs(-devel) requires to the spec file - rev 3303 ------------------------------------------------------------------- Sat Apr 29 21:46:22 CEST 2006 - kkaempf@suse.de - dont download "other" during key check (#171041) - rev 3294 ------------------------------------------------------------------- Sat Apr 29 11:05:15 CEST 2006 - kkaempf@suse.de - allow parallel installs of atoms (used to fulfill patch require- ments, atoms aren't installed anyways) (#170098) - some testsuite improvements. - rev 3288 ------------------------------------------------------------------- Fri Apr 28 20:15:06 CEST 2006 - dmacvicar@suse.de - get rid of autobuild check when throwing exceptions without throw but with a macro, returning a null pointer at the end (never reached). ------------------------------------------------------------------- Fri Apr 28 19:50:28 CEST 2006 - ma@suse.de - Do not violate install order when restricting commit to a certain mediaNumber. (#170079) ------------------------------------------------------------------- Fri Apr 28 18:12:26 CEST 2006 - dmacvicar@suse.de - Don't use throw directly! use ZYPP_THROW with a Exception class, otherwise package bindings will not catch them. Should fix crashes when reading broken sources with yast. - rev 3272 ------------------------------------------------------------------- Fri Apr 28 15:29:32 CEST 2006 - schubi@suse.de - Bug 162064 - font packages are not installed for locale, e.g. khmer font not installed after CD1 revision 3269 ------------------------------------------------------------------- Fri Apr 28 14:55:04 CEST 2006 - kkaempf@suse.de - revert bugfix #168906 (fom rev 3219), it filters too many errors. - further improve on #168840 (from rev 3231), match on name-edition when filtering by best arch. (#170098) - rev 3268 ------------------------------------------------------------------- Fri Apr 28 13:01:58 CEST 2006 - dmacvicar@suse.de - #170093 , lot of package descriptions missing - rev 3263 ------------------------------------------------------------------- Thu Apr 27 20:28:01 CEST 2006 - dmacvicar@suse.de - try to fix wrong permissions of /var/lib/zypp created by old zypp, only when running as root they are fixed (#169094) - YUM: Verify signatures on factoryInit. Dont provide other.xml. Cleanups, better logging. When refreshing signed soruces, don't refresh is source has not changed. - YaST sources: don't refresh if media file has not changed. - Show full url of index files in sources for signature validation (mentioned in #170139 comment #3)- ------------------------------------------------------------------- Thu Apr 27 18:41:02 CEST 2006 - jsrain@suse.de - udpated media ID syntax for external scripts (to be consistent with packages) (#170247) - rev 3256 ------------------------------------------------------------------- Thu Apr 27 18:33:48 CEST 2006 - jsrain@suse.de - set media ID to 1 if not specified in YUM metadata (#167452) - rev 3255 ------------------------------------------------------------------- Thu Apr 27 11:55:05 CEST 2006 - kkaempf@suse.de - If freshen and supplement are fulfilled, install any kind of resolvable if not yet installed (#165746) - rev 3249 ------------------------------------------------------------------- Wed Apr 26 18:00:42 CEST 2006 - kkaempf@suse.de - make downloaded script executable. (#169191) - rev 3247 ------------------------------------------------------------------- Wed Apr 26 10:43:03 CEST 2006 - kkaempf@suse.de - Improve on last fix, compare only compatible archs. - rev 3233 ------------------------------------------------------------------- Tue Apr 25 19:36:13 CEST 2006 - kkaempf@suse.de - Only choose best arch of multiple package atoms with identical name (#168840) - rev 3231 ------------------------------------------------------------------- Tue Apr 25 16:59:51 CEST 2006 - dmacvicar@suse.de - pass empty strings to UI as key properties if unknown key (#169114) - rev 3228 ------------------------------------------------------------------- Tue Apr 25 16:47:35 CEST 2006 - kkaempf@suse.de - refrain from parsing 'other.xml' (#159316) - rev 3226 ------------------------------------------------------------------- Tue Apr 25 16:34:50 CEST 2006 - visnov@suse.cz - in source refresh, clean up the cache dir if fails - do not require repomd.xml.asc when creating a cache (#163765) - rev 3224 ------------------------------------------------------------------- Tue Apr 25 15:17:15 CEST 2006 - dmacvicar@suse.de - Check if a file exists before providing it, and just handling the exception is not sufficient, because it can release the media. it nows get all possible packages.X translations an then it selects the candidate from the existing ones (#168654) - rev 3221 ------------------------------------------------------------------- Tue Apr 25 12:28:17 CEST 2006 - kkaempf@suse.de - dont report conflicts if item is neither installed nor to-be-installed (#168906) - rev 3219 ------------------------------------------------------------------- Tue Apr 25 11:27:09 CEST 2006 - dmacvicar@suse.de - #168060 , propagate the file description or original name to the UI and not the checked filename path, which could be a tmp file. Requires changes in pkg-manager, and probably zmd-helpers. - rev 3215 ------------------------------------------------------------------- Mon Apr 24 18:27:59 CEST 2006 - dmacvicar@suse.de - /var/lib/zypp/db/languages/* are empty files (##168355) - r3206 ------------------------------------------------------------------- Mon Apr 24 17:45:07 CEST 2006 - dmacvicar@suse.de - All resolvables must honor arch, so Arch_noarch in target/store/XMLFilesBackend.cc is wrong (#160792) - Introduced code to honour shared package descriptions (#159109) - r3204 ------------------------------------------------------------------- Mon Apr 24 16:43:48 CEST 2006 - jsrain@suse.de - replace '_' in YUM elements/attributes with '-' (#168762) - rev 3201 ------------------------------------------------------------------- Mon Apr 24 16:15:02 CEST 2006 - mt@suse.de - Fixed iseries workaround - interchanged variables for scsi devices, added debug messages about the steps (#163971). - Added getenv NULL ptr check and verify of the $HOME dir's and ~/.curlrc file's ownership (#163203). - rev 3199 ------------------------------------------------------------------- Mon Apr 24 15:44:18 CEST 2006 - ma@suse.de - Use filesystem::TmpDir to create unique and unused Source cache directories. (#168051) ------------------------------------------------------------------- Mon Apr 24 14:30:41 CEST 2006 - ma@suse.de - Enable signature checks per default. (#168525) ------------------------------------------------------------------- Mon Apr 24 11:20:17 CEST 2006 - visnov@suse.cz - fix callbacks for providing a single file (#160206) ------------------------------------------------------------------- Sun Apr 23 12:28:21 CEST 2006 - kkaempf@suse.de - If an installed package looses a dependency, the solver tries to upgrade it. Limit the upgrade candidates to best arch, best edition. - filter 'other' entries with incompatible arch in yum parser. - rev 3177 ------------------------------------------------------------------- Fri Apr 21 22:47:18 CEST 2006 - jsrain@suse.de - initialize the product category according to source (#168061) - rev 3172 ------------------------------------------------------------------- Fri Apr 21 18:32:00 CEST 2006 - mvidner@suse.cz - delete only one older version of a xml-store resolvable (half-baked, but the previous attempt was charred) ------------------------------------------------------------------- Fri Apr 21 17:49:18 CEST 2006 - jsrain@suse.de - moved license_to_confirm to primary.xml - rev 3170 ------------------------------------------------------------------- Fri Apr 21 16:36:14 CEST 2006 - ma@suse.de - Removed deprecated oldstyle commit methods. ------------------------------------------------------------------- Fri Apr 21 15:58:14 CEST 2006 - mvidner@suse.cz - when installing a xml-store resolvable (all except package, message, script), delete older versions (#160792). - read selection edition from the XML store - rev 3167 ------------------------------------------------------------------- Thu Apr 20 14:10:41 CEST 2006 - kkaempf@suse.de - properly clear transaction flag after successful commit (see rev 3122, #164365, #167285) - rev 3157 ------------------------------------------------------------------- Thu Apr 20 13:14:25 CEST 2006 - kkaempf@suse.de - recursively soft-uninstall recommended package on real uninstall, not on update (#167603) - rev 3155 ------------------------------------------------------------------- Thu Apr 20 13:01:28 CEST 2006 - dmacvicar@suse.de - fix #167605 (importing keys to rpm multiple times due to wrong interpretation of rpm gpg versioning. - add support for reading the rpm keys, with full id and fingerprint - rev 3153 ------------------------------------------------------------------- Wed Apr 19 16:47:34 CEST 2006 - kkaempf@suse.de - don't add duplicate error infos to ResolverContext (#167309) - rev 3146 ------------------------------------------------------------------- Wed Apr 19 14:10:10 CEST 2006 - kkaempf@suse.de - fix Resolver::transactReset() (see rev 3122) (#167285) - rev 3140 ------------------------------------------------------------------- Wed Apr 19 13:48:26 CEST 2006 - ma@suse.de - Introduced $ZYPP_KEYRING_DEFAULT_ACCEPT_ALL. If this environment variable is present, all signature checking callbacks will default to 'accept', in case no recipient is present. ------------------------------------------------------------------- Wed Apr 19 11:37:47 CEST 2006 - dmacvicar@suse.de - read content file on construction, and make provideProduct only insert the already read product object into the store (#165826) (dmacvicar) - When the signature is not found, warn the user about a unsigned source. When the key is not found, do nothing, it can be in the keyring already. (#166016) (dmacvicar) - enable key verification only if ZYPP_CHECKSIG env var is set (dmacvicar) - r1529 ------------------------------------------------------------------- Tue Apr 18 20:41:48 CEST 2006 - kkaempf@suse.de - fix bugfix 164365, fix bug 167285 Actually clear the transcation state instead of locking it to 'dont transact' - rev 3122 ------------------------------------------------------------------- Tue Apr 18 15:46:59 CEST 2006 - visnov@suse.cz - revert the signature/digest checking callbacks - rev 3115 ------------------------------------------------------------------- Tue Apr 18 15:14:35 CEST 2006 - kkaempf@suse.de - Bugfix #165670 - Honor keep requests. - Dont flag "locked uninstall" as error if a keep request was issued before. - rev 3114 ------------------------------------------------------------------- Tue Apr 18 12:04:35 CEST 2006 - kkaempf@suse.de - rule out locked items during distribution upgrade as early as possible. (#165670) - rev 3110 ------------------------------------------------------------------- Mon Apr 17 16:04:35 CEST 2006 - kkaempf@suse.de - Bugfix #166212 - use APPL_LOW as 'ui initiated, by solver' in transactKind() and transactResObject(). - resetTransaction(APPL_LOW) before resolving - enhance transactCaps by using the same algorithm as in QueueItemRequire (before: transact all requires and recommends by name now: transact best requires and recommends by provides) - rev 3107 ------------------------------------------------------------------- Fri Apr 14 16:04:35 CEST 2006 - visnov@suse.cz - new callbacks for failing digest - rev 3098 ------------------------------------------------------------------- Thu Apr 13 17:01:41 CEST 2006 - visnov@suse.cz - ask for file without a checksum (#165125) ------------------------------------------------------------------- Thu Apr 13 16:59:38 CEST 2006 - kkaempf@suse.de - dont install satisfied resolvables (#165843) - rev 3095 ------------------------------------------------------------------- Thu Apr 13 16:00:21 CEST 2006 - kkaempf@suse.de - dont abort on failed "dry_run" (#164583) - rev 3091 ------------------------------------------------------------------- Thu Apr 13 15:19:20 CEST 2006 - visnov@suse.cz - Ask user if signature file does not exist (#163765) - handle repomd.xml.asc as optional file (#163765) - rev 3089 ------------------------------------------------------------------- Thu Apr 13 13:52:08 CEST 2006 - schubi@suse.de - Bug 164365 - build 906: Deselecting a selection, all packages are still selected - rev 3087 ------------------------------------------------------------------- Thu Apr 13 11:57:58 CEST 2006 - kkaempf@suse.de - Dont do transitive uninstalls on uninstalled or upgraded items. (#165798) - rev 3083 ------------------------------------------------------------------- Wed Apr 12 17:57:21 CEST 2006 - ma@suse.de - Added 'rpmNoSignature' to ZYppCommitPolicy (#163862) ------------------------------------------------------------------- Wed Apr 12 16:44:57 CEST 2006 - mvidner@suse.cz - Product::updateUrls: restore it from the XML store; fixed content parsing (#163192). - restore product flags fro the XML store - rev 3074 ------------------------------------------------------------------- Wed Apr 12 13:48:25 CEST 2006 - kkaempf@suse.de - Only consider best arch/version (#165477) - rev 3069 ------------------------------------------------------------------- Wed Apr 12 10:57:50 CEST 2006 - ma@suse.de - No need to parse tags at all if there is no item to store values (e.g. data for unwanted arch). Fixed segv trying to store data in NULL item. (#165479) - rev3065 ------------------------------------------------------------------- Tue Apr 11 19:48:51 CEST 2006 - mt@suse.de - Improved Url path name "//" vs. "/%2f" handling; now if the url has an authority, "/%2f" is used for ftp only (#163784) - rev 3062 ------------------------------------------------------------------- Tue Apr 11 16:41:02 CEST 2006 - jsrain@suse.de - fixed storing patch scripts to target store (#159928) - rev 3058 ------------------------------------------------------------------- Tue Apr 11 16:24:26 CEST 2006 - kkaempf@suse.de - if a patch is bad, only skip this patch, not everything (#165200) - rev 3057 ------------------------------------------------------------------- Tue Apr 11 15:42:32 CEST 2006 - ma@suse.de - Susetags:Selections: Allow parsing older .sel file formats. (#159851) - Susetags:Pattern: Fixed parser. ------------------------------------------------------------------- Tue Apr 11 15:21:48 CEST 2006 - kkaempf@suse.de - when uninstalling, only re-establish installed items supplementing the to-be-uninstalled one. (variant of #165111) - rev 3054 ------------------------------------------------------------------- Tue Apr 11 14:17:00 CEST 2006 - ma@suse.de - Susetags:Package: Parse and provide ins/delnotify texts. ------------------------------------------------------------------- Tue Apr 11 13:01:31 CEST 2006 - kkaempf@suse.de - when checking freshens/supplements at install, only consider best architecture/edition (#164453) - rev 3051 ------------------------------------------------------------------- Tue Apr 11 10:31:41 CEST 2006 - kkaempf@suse.de - when checking for supplements, only consider best arch, best edition for installation (#165111) - rev 3047 ------------------------------------------------------------------- Tue Apr 11 10:23:14 CEST 2006 - schubi@suse.de - Bug 165117: build 910: Update: Splitted packages are selected for all archs ------------------------------------------------------------------- Tue Apr 11 09:30:14 CEST 2006 - visnov@suse.cz - ask user if a file exists but does not have a checksum (#162797) - rev 3044 ------------------------------------------------------------------- Mon Apr 10 22:39:34 CEST 2006 - jsrain@suse.de - parse time and size elements from delta and patch RPM - rev 3043 ------------------------------------------------------------------- Mon Apr 10 18:55:03 CEST 2006 - mt@suse.de - Added detection of iSeries virtual CD (/dev/iseries/vcd[a-h]) devices - on powerpc only (#163971) - rev 3042 ------------------------------------------------------------------- Mon Apr 10 18:05:51 CEST 2006 - kkaempf@suse.de - fix endless loop in patches parsing. - rev 3039 ------------------------------------------------------------------- Mon Apr 10 17:00:05 CEST 2006 - jsrain@suse.de - fixed media handling in SuSEtags source (#164879) - rev 3037 ------------------------------------------------------------------- Mon Apr 10 16:30:54 CEST 2006 - kkaempf@suse.de - honor 'dry_run' on package remove (#164732) - rev 3036 ------------------------------------------------------------------- Mon Apr 10 13:12:49 CEST 2006 - kkaempf@suse.de - add files from yum filelist as provides to package (#164731) - rev 3032 ------------------------------------------------------------------- Mon Apr 10 11:10:37 CEST 2006 - kkaempf@suse.de - honor "+Enh:/-Enh:" in packages file (#156513) ------------------------------------------------------------------- Mon Apr 10 10:56:24 CEST 2006 - visnov@suse.cz - fix callback receiver signature to match the callback for removing package ------------------------------------------------------------------- Mon Apr 10 10:32:22 CEST 2006 - mvidner@suse.cz - Added Product::updateUrls, from content/UPDATEURLS (#163192). - rev 3024 ------------------------------------------------------------------- Sat Apr 8 12:03:37 CEST 2006 - schubi@suse.de - Bug 164440; Taking wrong architecture while updating obsoletes splitted packages - rev 3022 ------------------------------------------------------------------- Sat Apr 8 10:07:06 CEST 2006 - kkaempf@suse.de - allow relative paths with url file: - dont filter atoms from going into pool, multi-arch patch requirements need them. Instead, treat atoms with incompatible architecture as unneeded. - rev 3018 ------------------------------------------------------------------- Fri Apr 7 23:57:37 CEST 2006 - jsrain@suse.de - product now provides short name - rev 3013 ------------------------------------------------------------------- Fri Apr 7 20:42:09 CEST 2006 - jsrain@suse.de - read metadata for packages from correct tags in patches (#163220) - rev 3011 ------------------------------------------------------------------- Fri Apr 7 19:57:41 CEST 2006 - kkaempf@suse.de - more detailed resolver error reports (#162994) - rev 3010 ------------------------------------------------------------------- Fri Apr 7 17:35:07 CEST 2006 - visnov@suse.cz - report package download progress (#160966) - rev 3007 ------------------------------------------------------------------- Fri Apr 7 16:27:35 CEST 2006 - kkaempf@suse.de - transact also for languages (#163819) - rev 3004 ------------------------------------------------------------------- Fri Apr 7 15:08:06 CEST 2006 - kkaempf@suse.de - loop through all affected ResObjects in transactResKind (#163819) - rev 3002 ------------------------------------------------------------------- Fri Apr 7 12:42:35 CEST 2006 - kkaempf@suse.de - allow re-installation of non-packages (#162906) - rev 2998 ------------------------------------------------------------------- Fri Apr 7 11:50:22 CEST 2006 - mt@suse.de - Added loop checking for scsi cdroms (/sys/block/srX) in case HAL does not provide any drives like on iSeries (#163971). - rev 2995 ------------------------------------------------------------------- Fri Apr 7 11:05:30 CEST 2006 - kkaempf@suse.de - add 'licenceToConfirm()' to Product. (#164375) ------------------------------------------------------------------- Fri Apr 7 10:36:05 CEST 2006 - ma@suse.de - Avoid excessive CD hopping on commit. But still far from being perfect. (#159679) - Fixed Target::commit: Despite dry_run set True, packages were depeted. ------------------------------------------------------------------- Fri Apr 7 08:32:32 CEST 2006 - visnov@suse.cz - honour if user decides to skip a package in commit (#156031) ------------------------------------------------------------------- Thu Apr 6 18:14:30 CEST 2006 - jsrain@suse.de - fixed parsing external reference to script in patch (#163221) - r2981 ------------------------------------------------------------------- Thu Apr 6 17:07:10 CEST 2006 - dmacvicar@suse.de - cache and provide content.asc/key optionally. Dont show a popup if they dont exists. (dmacvicar) - Actually abort when verify signature workflow is false. (dmacvicar) - r2978 ------------------------------------------------------------------- Thu Apr 6 16:37:49 CEST 2006 - jsrain@suse.de - fixed setting autorefresh flag for installation sources ------------------------------------------------------------------- Thu Apr 6 15:53:02 CEST 2006 - kkaempf@suse.de - drop patches with incompatible architecture. - rev 2972 ------------------------------------------------------------------- Thu Apr 6 15:33:11 CEST 2006 - mt@suse.de - Added info method to media verifier base and more debug info - rev 2970 ------------------------------------------------------------------- Wed Apr 5 19:27:46 CEST 2006 - kkaempf@suse.de - Dont deny the "/" attach point in MediaDIR, since this is used for all "file:" urls, esp. local packages. - rev 2962 ------------------------------------------------------------------- Wed Apr 5 18:21:58 CEST 2006 - schubi@suse.de - Bug 159673 - only one conflict solvable per page ------------------------------------------------------------------- Wed Apr 5 18:01:37 CEST 2006 - kkaempf@suse.de - parse all dependencies of 'packages' file (#163773) - rev 2957 ------------------------------------------------------------------- Wed Apr 5 17:47:04 CEST 2006 - dmacvicar@suse.de - Use the original media descr_dir on refresh for suse tags source (#163196) - r2952 ------------------------------------------------------------------- Wed Apr 5 16:44:08 CEST 2006 - kkaempf@suse.de - add Source::setUrl() for zmd backend helper. - rev 2946 ------------------------------------------------------------------- Wed Apr 5 16:44:01 CEST 2006 - dmacvicar@suse.de - implement rpm keyring / zypp tmp keyring two-way syncronization at rpm target init. (dmacvicar) - r2949 ------------------------------------------------------------------- Wed Apr 5 16:28:42 CEST 2006 - mt@suse.de - Fixed MediaDISK to use a mount -oro,bind id the disk partition is already attached e.g. by the automounter. Try to mount it a second time may fail (#163486). - rev 2944 ------------------------------------------------------------------- Wed Apr 5 15:04:31 CEST 2006 - kkaempf@suse.de - honor optional 3rd parameter to "=Loc:" key of packages (#154337) - rev 2940 ------------------------------------------------------------------- Wed Apr 5 12:48:19 CEST 2006 - visnov@suse.cz - only try to create a source of a given type when restoring from the persistent store (#162111) ------------------------------------------------------------------- Wed Apr 5 11:36:54 CEST 2006 - kkaempf@suse.de - parse all dependencies for patterns (.pat) files (#160602) - drop YOUPATH and YOUURL from content file. - rev 2924 ------------------------------------------------------------------- Wed Apr 5 09:27:08 CEST 2006 - visnov@suse.cz - properly initialize autorefresh for non-remote sources (#154990) - rev 2919 ------------------------------------------------------------------- Tue Apr 4 19:19:39 CEST 2006 - mt@suse.de - Added flag to MediaManager::isUseableAttachPoint, whether to check against system mount entries or not. - Disallows one to use the attachpoints of another media handlers as source path in MediaDIR. - rev 2917 ------------------------------------------------------------------- Tue Apr 4 18:47:01 CEST 2006 - dmacvicar@suse.de -implement callbacks for when package verification (checksum) fails, offer to retry or abort ------------------------------------------------------------------- Tue Apr 4 16:57:51 CEST 2006 - dmacvicar@suse.de - Fix construction of checksum objects when using non-standard checksum algorithms - Fix broken YUM cache - r2913 ------------------------------------------------------------------- Tue Apr 4 16:54:44 CEST 2006 - kkaempf@suse.de - Keep packages with no version upgrade installed during distribution upgrade (#162972) - add 'transactReset()' helper function for UI. - rev 2908 ------------------------------------------------------------------- Tue Apr 4 14:47:14 CEST 2006 - dmacvicar@suse.de - r2906 ------------------------------------------------------------------- Tue Apr 4 14:43:15 CEST 2006 - ma@suse.de - Fixed candidate handling in ui::Selectable. (#156589) ------------------------------------------------------------------- Tue Apr 4 14:06:23 CEST 2006 - dmacvicar@suse.de - fix #162984 , gpg hangs because the matching data file for the key cannot be find. (dmacvicar) - Fix restore of YUM source using the same cache dir semantics as susetags instead of assuming there is a cache if a cache_dir was given. (dmacvicar) ------------------------------------------------------------------- Tue Apr 4 12:37:51 CEST 2006 - kkaempf@suse.de - use DISTPRODUCT/DISTVERSION from content file to generate the product name, version, and release. - rev 2902 ------------------------------------------------------------------- Mon Apr 3 20:45:55 CEST 2006 - mt@suse.de - Removed broken forcing of absolute ftp paths added in rev2705 to MediaCurl, refined cleanupPathName/setPathName in url (#154197). - rev 2900 ------------------------------------------------------------------- Mon Apr 3 19:30:35 CEST 2006 - kkaempf@suse.de - add Resolver::freshenPool() (#156980) - rev 2893 ------------------------------------------------------------------- Mon Apr 3 08:33:12 CEST 2006 - kkaempf@suse.de - skip incompatible archs in filelist parsing. - restrict pathes to 'interesting' ones (/bin/, /sbin/, /lib/, /lib64/, ...) - rev 2886 ------------------------------------------------------------------- Sun Apr 2 22:18:06 CEST 2006 - kkaempf@suse.de - skip incompatible archs in primary parsing. - rev 2883 ------------------------------------------------------------------- Sun Apr 2 11:17:56 CEST 2006 - kkaempf@suse.de - allow setting of source when parsing local .rpm (#147765) - rev 2880 ------------------------------------------------------------------- Fri Mar 31 18:53:55 CEST 2006 - schubi@suse.de - Do not update packages over other architectures ------------------------------------------------------------------- Fri Mar 31 18:28:59 CEST 2006 - sh@suse.de - Added zypp/ui/UserWantedPackages to support the UI's "automatic changes" dialog (bug #152700) ------------------------------------------------------------------- Fri Mar 31 18:02:05 CEST 2006 - jsrain@suse.de - use KeyRing class to validate repomd.xml (#160909) ------------------------------------------------------------------- Fri Mar 31 17:33:21 CEST 2006 - dmacvicar@suse.de - Product resolvables should be readable by normal users. (#162474) (dmacvicar) - implemented keyring and metadata signature verification in susetags source - dont delete the lock if we did not acquire it - r2847 ------------------------------------------------------------------- Fri Mar 31 16:34:51 CEST 2006 - mt@suse.de - Added disabling of the automounter while MediaManager init and restoring of the old state on exit (#154326). - Implemented check if media (CD) is automounted or not - rev 2840 ------------------------------------------------------------------- Fri Mar 31 13:27:09 CEST 2006 - mt@suse.de - Implemented several hal get/set/removeDeviceProperty wrappers - Improved HalException allows one to fetch HAL/DBUS error componets - rev 2830 ------------------------------------------------------------------- Fri Mar 31 12:44:25 CEST 2006 - kkaempf@suse.de - honor subscription status of catalogs (#162350) - rev 2827 ------------------------------------------------------------------- Fri Mar 31 11:29:05 CEST 2006 - mt@suse.de - Enabled CD eject error reporting exceptions (#154326) - rev 2822 ------------------------------------------------------------------- Fri Mar 31 06:40:51 CEST 2006 - kkaempf@suse.de - support "dry run" (#159467) - implement "transactResKind" (#161400) - rev 2817 ------------------------------------------------------------------- Thu Mar 30 17:22:49 CEST 2006 - jsrain@suse.de - add checksum for external patches (#159928) ------------------------------------------------------------------- Thu Mar 30 16:48:01 CEST 2006 - kkaempf@suse.de - calculate product architecture (#158198) ------------------------------------------------------------------- Wed Mar 29 23:28:13 CEST 2006 - jsrain@suse.de - fixed checking checksum of YUM metadata, added sha1 vs. sha256 detection ------------------------------------------------------------------- Wed Mar 29 23:12:30 CEST 2006 - ma@suse.de - Auto protect installed packages from unknown vendor. (#157446) ------------------------------------------------------------------- Wed Mar 29 09:13:51 CEST 2006 - visnov@suse.de - added support for external scripts to metadata (#159928) (jsrain) - fixed handling of Language resolvables (ma) - fix leak in rpmdb (dmacvicar) - added softlock for autoyast (#159466) (ma) - Fixed exceptions in doGetFileCopy() to show full url including the file instead of just the media base url. (mt) - Provide Language::summary (ma) - check patterns and selections file exist before veryfing them (#161300) (dmacvicar) - added YUM metadata checksum computation (jsrain) - added interface to patch of a message (jsrain) - r2734 ------------------------------------------------------------------- Mon Mar 27 23:57:16 CEST 2006 - jsrain@suse.de - added support for external scripts to metadata (#159928) - r2709 ------------------------------------------------------------------- Sat Mar 25 22:08:26 CET 2006 - jsrain@suse.de - report separate exception when trying to start source cache again to suppress incorrect error message in XEN installation - r2682 ------------------------------------------------------------------- Fri Mar 24 18:16:22 CET 2006 - schubi@suse.de - Implement inter process locking in zypp. - Added No medium found output - splitting modaliases in supplements TOO - parse also the available signing keys ------------------------------------------------------------------- Fri Mar 24 10:44:10 CET 2006 - visnov@suse.cz - release all media when removing source (#159754) (visnov) - more testsuites (schubi) - updated translations (schubi) - added MediaNotEjectedException (mt) - rev 2652 ------------------------------------------------------------------- Thu Mar 23 14:10:54 CET 2006 - dmacvicar@suse.de - fix patches descriptions (dmacvicar) - fix source serialization (dmacvicar) - metadata for kernel test (schubi) - Arch tests updated (ma) - classify NULL Ptr as unique (ma) - Added host check, because file Url allows it now. (mt) - prepare modalias fix (#159766) (ma) - Provide iterator based access to SourceManager data. (ma) - Fixed "file:" Url scheme config to allow relative paths; (mt) RFC1738 says, it may contain a hostname as well... - revision 2633 ------------------------------------------------------------------- Wed Mar 22 19:58:37 CET 2006 - visnov@suse.cz - pkg-config support (mvidner) - close all medias when destructing MediaSet (jsrain) - rev 2622 ------------------------------------------------------------------- Wed Mar 22 15:48:05 CET 2006 - dmacvicar@suse.de - Bug 159976 - build 804: Adding AddOn CD via ftp gives error (dmacvicar) - Message callback implemented to show patch messages (visnov) - Bug 159696 (schubi) - provide transform_iterators to iterate over a maps keys or values (ma) - added 'bool Arch::empty() const' test for an empty Arch string (ma) - added script and message installation (jsrain) - chooses the 'right' kernel now (kkaempf) - Use noarch if no arch is specified in patches (dmacvicar) - rev 2611 ------------------------------------------------------------------- Tue Mar 21 19:06:56 CET 2006 - mvidner@suse.cz - Added some debug output including the access id (mt) - Bug #154326: Enabled FORCE_RELEASE_FOREIGN flag causing release with eject=true on attached media, to umount other mounts as well. (mt) - 159483 - solver does not blame missing dependency (schubi) - Added a variant of MediaHandler::forceRelaseAllMedia (ma) - Fixed MediaCD::forceEject() to handle DELAYED_VERIFY and use forceRelaseAllMedia if FORCE_RELEASE_FOREIGN=1 (ma) - fixed ZYPP_RETHROW (#156430) (ma) - patch for #156114 (visnov) - fixed container.erase loops (ma) - Fixed to reset desired (cached) flag before the action (mt) - Removed return in forceRelaseAllMedia (void function) (mt) - Parse nonexisting architecture to noarch so patches dont get filtered by the pool (dmacvicar) - 159512 - yast2-qt does not show label of to be installed products anymore (dmacvicar) - 159765 - Hidden patterns still visible (dmacvicar) - Use noarch if no arch is specified. (dmacvicar) - r2594 ------------------------------------------------------------------- Tue Mar 21 09:04:06 CET 2006 - visnov@suse.de - properly report error for media change callback - rev 2579 ------------------------------------------------------------------- Mon Mar 20 23:02:07 CET 2006 - ma@suse.de - fixed memory leak in XMLNodeIterator (#157474) - disabled storing filelist (YUMFileListParser) and changelog (YUMOtherParser) - Renamed private MediaManager::forceMediaRelease function to forceReleaseShared (more exact name) - Implemented forceRelaseAllMedia() that can be used to release also foreign (user) mounts. - Added use of forceRelaseAllMedia for CD/DVDs if FORCE_RELEASE_FOREIGN is 1 (default 0) - little cleanup of the checkAttached function - r2578 ------------------------------------------------------------------- Mon Mar 20 17:04:28 CET 2006 - mvidner@suse.cz - don't try to attach without exception handling (#158620) - fix descriptions, as a new tag Des for selections exists now. - fix #157683: failure after adding add-on product to install sources - added more files for translation - resolve-dependencies.cc: establish pool - parse-metadata.cc: catch bad URL - set zmdid for atoms - r2574 ------------------------------------------------------------------- Sun Mar 19 19:24:44 CET 2006 - kkaempf@suse.de - fix testsuite. - provide edition and architecture for all kinds of yum resolvables. - fix ResStatus output. - establish atoms correctly. - treat requires to unneeded resolvables as fulfilled. - rev 2559 ------------------------------------------------------------------- Sun Mar 19 00:05:17 CET 2006 - kkaempf@suse.de - fix the build - only consider best architecture/version (#157594) - prefer providers which supplement/enhance installed or to-be-installed packages (fixes the tpctl-kmp issue) - rev 2546 ------------------------------------------------------------------- Sat Mar 18 02:22:22 CET 2006 - kkaempf@suse.de - provide more filters for pkg-bindings (#158602) - add SystemResObject to provide system (modalias, hal, ...) capabilities. - handle this during resolving. - make the modalias and hal capability match the SystemResObject by default, thereyby triggering a modalias (resp. hal) evaluation. - xmlstore: decouple target store from YUM schema. - clean up moving of hal() and modalias() from provides to supplements in ResolvableImpl. - add PatchContents() for UI. - handle Edition::noedition as empty string. - r2537 ------------------------------------------------------------------- Tue Mar 14 23:32:44 CET 2006 - jsrain@suse.de - releasing all medias when asking for CD (#156981) - r2471 ------------------------------------------------------------------- Tue Mar 14 19:38:43 CET 2006 - mvidner@suse.cz - ResStatus::resetTransact must return a value. - Fixed random build failures in LanguageCode.cc. (Rewrote the CodeMaps constructor so that gcc does not optimize a 500-statement basic block.) - Fix constructions of patch objects. Actually insert atoms in atoms list. Insert atoms for package even if the package does not exists in the source. Fixes #157628 (dmacvicar). - Fixed license reading from susetags, #151834 (dmacvicar). - r2468 ------------------------------------------------------------------- Tue Mar 14 16:59:42 CET 2006 - mvidner@suse.cz - added ResStatus::resetTransact (ma) - bugfix for #156439 (schubi) - Added Source_Ref::setAlias (#154913). - Do not assume there is a product file when scanning for products (visnov) - function to disable all sources in the persistent store (visnov) - dependency errors go to stdout, not stderr; output resolver info directly to stderr (kkaempf) - rev 2464 ------------------------------------------------------------------- Tue Mar 14 01:34:38 CET 2006 - kkaempf@suse.de - fix merging of resolver info (needed for #157684). - errors are also important in ResolverInfo. - improve debug output in ResolverContext. - rev 2455 ------------------------------------------------------------------- Mon Mar 13 22:54:01 CET 2006 - jsrain@suse.de - delete RPMs downloaded via HTTP/FTP after installnig them (#157011) - fixed product registration (reverted autorefresh patch) (#157566) ------------------------------------------------------------------- Mon Mar 13 11:53:52 CET 2006 - kkaempf@suse.de - if root!="/", always prefer the upgrade candidate (#155472) - implement license confirmed api for UI. - prefer architecture over version in distribution upgrade (#157501) - clean up media handling. - rev 2448 ------------------------------------------------------------------- Sun Mar 12 22:31:09 CET 2006 - kkaempf@suse.de - init Modalias properly. - fix warnings in testcases. - rev 2432 ------------------------------------------------------------------- Sat Mar 11 21:25:18 CET 2006 - kkaempf@suse.de - drop libjpeg-devel and sqlite-devel from build requires. ------------------------------------------------------------------- Sat Mar 11 08:16:53 CET 2006 - kkaempf@suse.de - implement 'modalias()' capability (#157406) - make dependencies consistent, its 'freshens'. - cope with user umounts of devices. - add debug to SourceManager. - rev 2418 ------------------------------------------------------------------- Fri Mar 10 16:20:41 CET 2006 - kkaempf@suse.de - allow version downgrade during distribution upgrade if the newer package is coming from a trusted vendor (#155472) - implement locale fallback - 'freshen' -> 'freshens' in schema definitions to make it consistent with all other dependency definitions. - better error reporting for .pat and .sel files. - rule out packages from dependency resolutions which are de-selected by user (#155368) - use locale fallbacks in package translations. - refresh source when re-enabling it. - rev 2406 ------------------------------------------------------------------- Tue Mar 7 21:18:19 CET 2006 - kkaempf@suse.de - split of libzypp-zmd-backend subpackage as a stand-alone leaf package. - encapsulate bool test for Source_Ref better. - fixed stack overflow (ma). - make testsuite build again. - rev 2346 ------------------------------------------------------------------- Tue Mar 7 16:17:07 CET 2006 - kkaempf@suse.de - fixed URL rewriting for CD2 and following (#154762) - fixed ResPoolProxy diffState (for proper ok/cancel support in UI) - added special exception class for aborting installation (#154936) - only auto-change directories if they end in CDn or DVDn. - rev 2320. ------------------------------------------------------------------- Tue Mar 7 15:37:51 CET 2006 - kkaempf@suse.de - silently ignore multiple installs of the same package. - fix disk usage for installs and uninstalls. - rev 2308 ------------------------------------------------------------------- Mon Mar 6 22:22:57 CET 2006 - kkaempf@suse.de - zmd-backend: filter out incompatible architectures from repository. - rev 2298 ------------------------------------------------------------------- Mon Mar 6 21:35:24 CET 2006 - kkaempf@suse.de - sync libzypp media data with mtab. - improve resolver error and solution reports. - fix source cache reading (#155459). - default cached sources to enabled (#155459). - let each source provide public keys. - rev 2297 ------------------------------------------------------------------- Sun Mar 5 15:48:29 CET 2006 - kkaempf@suse.de - only write by-sovler transactions back (#154976) - rev 2278 ------------------------------------------------------------------- Sat Mar 4 12:36:40 CET 2006 - kkaempf@suse.de - release last used source at end of commit (#155002) - rev 2277 ------------------------------------------------------------------- Fri Mar 3 23:14:50 CET 2006 - kkaempf@suse.de - cope with NULL values in zmd catalogs table (#153584) - set YAST_IS_RUNNING in transact zmd helper (#154820) - run SuSEconfig after transact zmd helper (#154820) - add softTransact to honor user vs. soft requirements (#154650) - honor all build keys provided by a package source. - add source metadata refresh. - add progress callbacks to zmd helpers. - rev 2276 ------------------------------------------------------------------- Thu Mar 2 21:59:07 CET 2006 - kkaempf@suse.de - include .diffs into main source. - catch exception when ejecting media which was unmounted externally (#154697). - init source in zmd-backend correctly (#154667) - implement disk usage info for YaST. - clean up XML schema files. - catch CPUs identifying as 'i686' but being 'i586'. - allow definition of preferred attach (mount) point for media. - make resolver results more readable. - use language fallbacks if none of multiple language providers matches. - get rid of ignoring wrong arch in resolver, having the wrong architecture is prevented by other means. - prepare for translations in exceptions. - fix 'abort does not abort' - implement 'flag' I/O in target cache backend. - skip incompatibles architectures in packages. - rev 2228 ------------------------------------------------------------------- Thu Mar 2 13:44:34 CET 2006 - kkaempf@suse.de - dont even provide src/nosrc from the source. - rev 2169 + diffs ------------------------------------------------------------------- Wed Mar 1 17:23:23 CET 2006 - kkaempf@suse.de - Initialize commit result (#154409) - release media if its wrong (#154326) - dont copy src/nosrc packages to the pool (#154627) - reduce XML logging. - rev 2169 + diffs ------------------------------------------------------------------- Tue Feb 28 16:10:14 CET 2006 - kkaempf@suse.de - fix path of .po files (#154074). - parse the correct package. file (kinda #154074). - complain about bad "=Sel:" or "=Pat:" lines (#153065). - reattach all released medias. - raise exception instead of abort() on XML errors (#154104). - update translations. - PathInfo: implemented a copy_dir_content (variant of copy_dir) and is_empty_dir utility function - rev 2169 ------------------------------------------------------------------- Tue Feb 28 14:51:46 CET 2006 - kkaempf@suse.de - check freshens and supplements for packages (#154074). - only complain about incomplete installed resolvables, if they are uninstalled, schedule them for installation. (#154074) - add testcases for locale() provides. - add lang_country -> lang fallback. - have locale(parent:...) deps match any provides of 'parent' also when uninstalling a package. - rev 2148 ------------------------------------------------------------------- Tue Feb 28 10:35:15 CET 2006 - kkaempf@suse.de - change the locale(...) separator to ";" (#153791) - complete "find-files" of zmd-backend. - rev 2140 ------------------------------------------------------------------- Tue Feb 28 10:28:06 CET 2006 - visnov@suse.de - avoid attaching media when initializing source - rev 2139 ------------------------------------------------------------------- Mon Feb 27 21:26:00 CET 2006 - kkaempf@suse.de - warn about misspelled 'locale(...)' provides - add testcases - rev 2134 ------------------------------------------------------------------- Mon Feb 27 20:19:40 CET 2006 - kkaempf@suse.de - fix the build - rev 2129 ------------------------------------------------------------------- Mon Feb 27 18:15:16 CET 2006 - kkaempf@suse.de - provide available locales to application (#153583) - honor 'requestedLocales' (language dependant packages) - honor release requests for all holders of a device. - silently re-attach after a forced release. - solver improvements. - handle source caches. - proper logging in zmd backend helpers. - rev 2127 ------------------------------------------------------------------- Mon Feb 27 13:44:39 CET 2006 - kkaempf@suse.de - upgrade always to best version and arch (#153577) - reset 'transact' state for obsoleted packages (#153578) - translation updates - rev 2113 ------------------------------------------------------------------- Mon Feb 27 10:42:33 CET 2006 - kkaempf@suse.de - add support for 'local' .rpm packages to zmd-backend. - rev 2101 ------------------------------------------------------------------- Sun Feb 26 20:24:10 CET 2006 - kkaempf@suse.de - fix build of zmd/backend. - actually fill 'files' table in package-files. - rev 2094 ------------------------------------------------------------------- Sun Feb 26 17:43:06 CET 2006 - kkaempf@suse.de - improve testcases. - add 'setPossibleLocales()' to ZYpp, this defines the set of possible locales to choose from (#153583) - provide LanguageImpl and create 'Language' resolvables for each 'possible' locale. - fix YUM parsing of patches, insert 'atoms' to link patches with packages. - replace gzstream/ with own, existing implementation. - honor locks in solver (#150231) - sync pool with target after commit() properly (#150565, #153066) - new zmd helper 'package-files' - rev 2093 ------------------------------------------------------------------- Thu Feb 23 21:45:06 CET 2006 - kkaempf@suse.de - prevent multiple initializations of the target (#153124) - implement 'loopback mounted ISO images' - retain old package sources on upgrade. - support compressed .xml files in 'repodata' type repositories. - rev 2025 ------------------------------------------------------------------- Thu Feb 23 15:16:58 CET 2006 - kkaempf@suse.de - parse locale(...) provides and construct correct dependencies. ------------------------------------------------------------------- Thu Feb 23 14:16:44 CET 2006 - kkaempf@suse.de - always upgrade to candidate (#152760). - fix typo in package sorting. - prepare handling of locale provides. - rev 1995 ------------------------------------------------------------------- Thu Feb 23 10:53:51 CET 2006 - kkaempf@suse.de - sort src/nosrc package to right list during commit. - revert installtime/buildtime in susetags parser (#152760) - rev 1990 ------------------------------------------------------------------- Thu Feb 23 10:22:08 CET 2006 - kkaempf@suse.de - reset state after successful commit (#153030) - run "rpm -e" always with "--nodeps" (#153026) - provide separate resolvable kind for src packages. - extend status field for LOCK and LICENSE. - add sameState()/diffState() for UI. - provide 'best' candidate for UI. - set 60 sec timeout for curl access. - don't cross-compare solver results, takes too much time. - provide sizes of installed packages. - extend REQUIRES semantics in content file. - add "parse-metadata" helper to zmd-backend. - rev 1987 ------------------------------------------------------------------- Wed Feb 22 14:51:46 CET 2006 - kkaempf@suse.de - provide complete disk usage data (#152761) - include upgrade flag when copying solver solution back to pool (#152717) - rev 1959 ------------------------------------------------------------------- Wed Feb 22 13:16:48 CET 2006 - kkaempf@suse.de - don't insert incompatible architectures to the pool (#151933) - don't accept incompatible architectures from a repository (#151933) - separate rpm log (#151431). - allow extended product requires. - rev 1954 ------------------------------------------------------------------- Tue Feb 21 22:02:59 CET 2006 - kkaempf@suse.de - provide the XML schema files in the main package. (#152593) ------------------------------------------------------------------- Tue Feb 21 20:05:34 CET 2006 - kkaempf@suse.de - provide arch compat handling. - implement data upload to zmd. - fix source metadata caching on target. - add 'supplements' dependencies to 'yum' parser. - provide user agent identification to curl calls. - move resolver branches (multiple alternatives) back in queue (resolve known things first, then the unknown ones). - clean up 'packages' parser. - rev 1947 ------------------------------------------------------------------- Tue Feb 21 09:18:53 CET 2006 - kkaempf@suse.de - improve media mount/umount interface - prepare class ArchCompat for proper architecture ordering and compatibility handling. - add returns to dummy functions in DbAccess. - rev 1913 ------------------------------------------------------------------- Mon Feb 20 21:08:22 CET 2006 - kkaempf@suse.de - don't explictly delete to-be-upgraded packages. - finish query-system, resolve-dependencies, and transact for libzypp-zmd-backend. - provide Pattern::category. - move system architecture to toplevel. - make target store pathname settable. - speed up rpmdb reading by properly filtering unwanted file provides. - rev 1905 ------------------------------------------------------------------- Sun Feb 19 20:35:03 CET 2006 - kkaempf@suse.de - new translations. - proofread texts. - when comparing solutions, prefer higher versions. - provide generic 'SafeBool' for bool conversions. - add PtrTypes testsuites. - rev 1876 ------------------------------------------------------------------- Fri Feb 17 21:43:51 CET 2006 - kkaempf@suse.de - integrate all diffs - move Target::commit to toplevel API - generalize dependency iterators and hash dependency information in pool (for speedup) - add 'supplements' as dependency - make more pattern attributes available - drop "smbfs" in favour of "cifs" (#151476) - add metadata cache to sources (Beta4 bug) - run "rpm -e" with name-version-release - fix update conflicts - rev 1864 ------------------------------------------------------------------- Thu Feb 16 20:02:19 CET 2006 - kkaempf@suse.de - fix-mediachange.diff: dont skip CD but retry after media change - cd-eject-button.diff: fix CD url so YaST recognizes it and shows 'eject' button - release-forced-eject-no-ptrfix.diff: fix refcounting in ptrs so media handle gets actually released and media unmounted. ------------------------------------------------------------------- Thu Feb 16 14:40:31 CET 2006 - kkaempf@suse.de - implement arch scoring - prefer better arch (#151427) - transitive depedencies of weak requirements are non-weak (#151446) - rev 1778 + diff ------------------------------------------------------------------- Wed Feb 15 18:19:12 CET 2006 - kkaempf@suse.de - ignore self and to-be-updated conflicts (#150844) - fix enable of target store (for non-packages) - rev 1778 ------------------------------------------------------------------- Wed Feb 15 13:11:28 CET 2006 - kkaempf@suse.de - fix "cd:" url (#151121) - provide location() in public Package api - allow running distribution upgrade in testmode - extend HAL interface - rev 1762 ------------------------------------------------------------------- Wed Feb 15 10:10:48 CET 2006 - kkaempf@suse.de - pass normal and locale packages from selections correctly. - its "baseconf" for base selections. - Make 'ZYpp' an obvious singleton. - provide releasenotesUrl. - dont continue upgrade without target. - implement 'fake' hal for testing. - fix package sizes. - more solver testcases. - rev 1754 ------------------------------------------------------------------- Tue Feb 14 20:52:02 CET 2006 - kkaempf@suse.de - extend requires of libzypp-devel - provide package sizes for UI - provide more UI helpers - implement Product and related functions - fix split provides in distribution upgrade - provide locale information to system - ask HAL for available devices - reduce debug information in solver - filter architectures in source, not in solver - rev 1743 ------------------------------------------------------------------- Tue Feb 14 07:27:39 CET 2006 - visnov@suse.de - disable another testsuite for now - fetch the default locale from environment - support user-defined formatting of log - rev 1710 ------------------------------------------------------------------- Mon Feb 13 20:41:36 CET 2006 - visnov@suse.de - providing basic product information from susetags source - public API for preferred language - implemented redirect of logging (#149001) - report start/finish of source data parsing (#150211) - store/restore source aliases properly (#150256) - disable a lot of debug logging to speed up solver - properly rewrite URL for CDn directory layouts (#149870) - rev 1706 ------------------------------------------------------------------- Sun Feb 12 16:59:48 CET 2006 - kkaempf@suse.de - add save/restore state to facilitate UI 'cancel' - enable target/store - add 'forceResolve' call and flag to resolver to switch between task-oriented ZMD and interactive YaST behaviour. - Fix resolver problem solution texts. - improve solver problem solution offerings. - fix media access handling to better support multiple requestors to single media. - move the media number checking to the source (media requestor) which knows how to verify the correct media. - Fix CD ordering (#149871), adding testcases. - Move 'PoolItemList' and 'PoolItemSet' typedefs inside classes. - Add selections to testcases. - rev 1673 ------------------------------------------------------------------- Sat Feb 11 10:17:15 CET 2006 - kukuk@suse.de - Fix missing return in Source.cc:124 ------------------------------------------------------------------- Fri Feb 10 18:41:29 CET 2006 - kkaempf@suse.de - cope with empty arch field in selections - enable dummy "enableStorage" function - rev 1610-branch ------------------------------------------------------------------- Fri Feb 10 15:36:43 CET 2006 - kkaempf@suse.de - fix random data return in Source.cc - rev 1610 ------------------------------------------------------------------- Fri Feb 10 15:00:45 CET 2006 - kkaempf@suse.de - adapt zmd-backend to SourceImpl API change - rev 1608 ------------------------------------------------------------------- Fri Feb 10 13:54:43 CET 2006 - kkaempf@suse.de - fix the packages parser bug. Now all packages are parsed including (english) translations. source/susetags is back to svn head. - rev 1600 ------------------------------------------------------------------- Fri Feb 10 10:30:12 CET 2006 - kkaempf@suse.de - fix off-by-one bug in bitfield handling - revert source/susetags to rev 1411 - rev 1586 ------------------------------------------------------------------- Thu Feb 9 22:21:43 CET 2006 - kkaempf@suse.de - dont prereq-sort non-packages - rev 1584 ------------------------------------------------------------------- Thu Feb 9 21:29:00 CET 2006 - kkaempf@suse.de - rev 1582 ------------------------------------------------------------------- Thu Feb 9 11:10:54 CET 2006 - kkaempf@suse.de - update to rev 1543 ------------------------------------------------------------------- Thu Feb 9 00:49:23 CET 2006 - ro@suse.de - require hal-devel in libzypp-devel - re-merge fixes (RPM_OPT_FLAGS) ------------------------------------------------------------------- Wed Feb 8 23:53:58 CET 2006 - kkaempf@suse.de - make solver behaviour a bit more interactive - rev 1537 ------------------------------------------------------------------- Wed Feb 8 18:45:21 CET 2006 - schwab@suse.de - Fix syntax error in configure script. - Use RPM_OPT_FLAGS. ------------------------------------------------------------------- Wed Feb 8 17:03:37 CET 2006 - kkaempf@suse.de - update for qt ui integration - rev 1504 ------------------------------------------------------------------- Tue Feb 7 23:18:09 CET 2006 - kkaempf@suse.de - split off libzypp-zmd-backend - rev 1466 ------------------------------------------------------------------- Tue Feb 7 23:10:59 CET 2006 - kkaempf@suse.de - another update to svn ------------------------------------------------------------------- Mon Feb 6 20:42:22 CET 2006 - kkaempf@suse.de - finish rpm callbacks - finish UI API - fix state change resolver<->pool - zmd backend stuff - speed up tag file parsing - rev 1405 ------------------------------------------------------------------- Mon Feb 6 16:53:03 CET 2006 - schubi@suse.de - disabling failing tests of s390 and ppc ------------------------------------------------------------------- Mon Feb 6 11:14:16 CET 2006 - schubi@suse.de - Snapshoot rev 1367 ------------------------------------------------------------------- Mon Feb 6 01:42:48 CET 2006 - kkaempf@suse.de - use hashes for pool - rev 1343 ------------------------------------------------------------------- Fri Feb 3 14:21:47 CET 2006 - schubi@suse.de - removed Obsoletes: yast2-packagemanager ------------------------------------------------------------------- Fri Feb 3 11:36:19 CET 2006 - schubi@suse.de - Snapshoot 3 Feb 2005 (11:30) ------------------------------------------------------------------- Thu Feb 2 14:27:02 CET 2006 - schubi@suse.de - Snapshoot 2 Feb 2005 (14:00) ------------------------------------------------------------------- Thu Feb 2 12:23:03 CET 2006 - schubi@suse.de - Snapshoot 2 Feb 2005 ( integrating YaST ) ------------------------------------------------------------------- Wed Jan 25 21:37:50 CET 2006 - mls@suse.de - converted neededforbuild to BuildRequires ------------------------------------------------------------------- Sat Jan 14 08:51:55 CET 2006 - kkaempf@suse.de - Initial version libzypp-17.36.5/po/000077500000000000000000000000001476576476200140345ustar00rootroot00000000000000libzypp-17.36.5/po/CMakeLists.txt000066400000000000000000000053221476576476200165760ustar00rootroot00000000000000# Translation set name SET( POT_NAME "zypp" ) # Creating the .pot file.... # POT_FILE_DEPENDS was set in ../src SET( POT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${POT_NAME}.pot ) SET( XGETTEXT_CMD "xgettext" ) SET( XGETTEXT_OPTIONS -L C++ --boost --no-wrap --add-comments --add-location --foreign-user ) SET( XGETTEXT_OPTIONS ${XGETTEXT_OPTIONS} --keyword=_ --keyword=_:1,2 --keyword=__ --keyword=N_ --keyword=PL_:1,2 ) SET( XGETTEXT_OPTIONS ${XGETTEXT_OPTIONS} --copyright-holder=\"SuSE Linux GmbH, Nuernberg\" ) SET( XGETTEXT_OPTIONS ${XGETTEXT_OPTIONS} --package-name=${POT_NAME} --default-domain=${POT_NAME} ) SET( _abs_POT_FILE_DEPENDS ) SET( POT_FILE_DEPENDS ${POT_FILE_DEPENDS_ZYPP} ${POT_FILE_DEPENDS_ZYPP_COMMON} ${POT_FILE_DEPENDS_ZYPP_CORE} ${POT_FILE_DEPENDS_ZYPP_MEDIA} ${POT_FILE_DEPENDS_ZYPP_CURL} ${POT_FILE_DEPENDS_ZYPP_TUI} ) FOREACH( _currentDepends ${POT_FILE_DEPENDS} ) SET( _abs_POT_FILE_DEPENDS ${_abs_POT_FILE_DEPENDS} ${LIBZYPP_SOURCE_DIR}/${_currentDepends} ) ENDFOREACH() ADD_CUSTOM_COMMAND( OUTPUT ${POT_FILE} COMMAND ${XGETTEXT_CMD} ${XGETTEXT_OPTIONS} --output=${POT_FILE} ${POT_FILE_DEPENDS} WORKING_DIRECTORY ${LIBZYPP_SOURCE_DIR} DEPENDS ${_abs_POT_FILE_DEPENDS} COMMENT "Extract translatable messages to ${POT_FILE}" ) # Creating the .gmo files out of the .po files FILE( GLOB PO_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.po" ) SET( GMO_FILES ) FOREACH( _currentPoFile ${PO_FILES} ) GET_FILENAME_COMPONENT( _absFile ${_currentPoFile} ABSOLUTE ) GET_FILENAME_COMPONENT( _lang ${_absFile} NAME_WE ) SET( _poFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.po ) SET( _gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo ) ADD_CUSTOM_COMMAND( OUTPUT ${_gmoFile} COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} --quiet --no-fuzzy-matching -o ${_poFile} ${_absFile} ${POT_FILE} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_poFile} DEPENDS ${POT_FILE} ${_absFile} COMMENT "Update ${_gmoFile}" ) INSTALL( FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${POT_NAME}.mo ) SET( GMO_FILES ${GMO_FILES} ${_gmoFile} ) ENDFOREACH() # Provides the 'translations' target that # creates the .gmo files out of the .po files SET( SOURCE_POT_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${POT_NAME}.pot ) ADD_CUSTOM_TARGET( translations ALL COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/PotfileDiff.sh ${SOURCE_POT_FILE} ${POT_FILE} | grep '^[+-][^+-]' || true DEPENDS ${GMO_FILES} COMMENT ".pot file diff..." ) ADD_CUSTOM_TARGET( potfile_update COMMAND ./PotfileDiff.sh ${SOURCE_POT_FILE} ${POT_FILE} -q || ./PotfileUpadte.sh ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS translations COMMENT "Checking for uncommitted changes to the .pot file..." ) libzypp-17.36.5/po/PotfileDiff.sh000077500000000000000000000005031476576476200165640ustar00rootroot00000000000000#! /bin/bash set -e function extract() { grep '^\(msgid\|"\)' "$1" | grep -v "POT-Creation-Date" | sort -u; } OLDTMP=$(mktemp) NEWTMP=$(mktemp) trap "/bin/rm -f -- \"$OLDTMP\" \"$NEWTMP\"" 0 1 2 3 13 15 extract "$1" >"$OLDTMP" extract "$2" >"$NEWTMP" shift 2 # additional args for diff diff -u0 "$@" "$OLDTMP" "$NEWTMP" libzypp-17.36.5/po/PotfileUpadte.sh000077500000000000000000000014471476576476200171460ustar00rootroot00000000000000#! /bin/bash set -e function errexit() { echo "$0: $@" >&2 exit 1 } function currentBranch() { git rev-parse --abbrev-ref HEAD; } test "$(currentBranch)" == "master" || errexit "Not on master branch." test "$(basename "$PWD")" == "po" || errexit "Cd to the po directory." test "$(git status --porcelain 2>/dev/null| grep '^[^ !?]' | wc -l)" == 0 || errexit "Index not clean: wont't commit" BINDIR="${1}" test -z "$BINDIR" && errexit "Missing argument: BINDIR" test -d "$BINDIR" || errexit "Not a directory: BINDIR '$BINDIR'" echo "Updating .pot .po files from $BINDIR..." for F in *.pot *.po; do if [ -f "$BINDIR/$F" ]; then cp "$BINDIR/$F" . else errexit "Missing file $BINDIR/$F (touch CMakeLists.txt?)" fi done git add -A *.pot *.po git commit -m 'Translation: updated .pot file' libzypp-17.36.5/po/af.po000066400000000000000000003704441476576476200147760ustar00rootroot00000000000000# Copyright (C) 2006 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2006-11-03 12:03\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Onbekende land:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Geen kode nie" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Verenigde Arabiese Emirate" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua en Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanië" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenië" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Nederlands-Antille" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktika" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentinië" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikaanse Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Oostenryk" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australië" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Aland-eilande" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaijan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnië en Herzegowina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "België" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgarye" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrein" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Broenei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivië" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasilië" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhoetan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet-eiland" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belo-Rusland" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Cocos- (Keeling-) eilande" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Republiek van Sentraal-Afrika" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Switserland" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Ivoorkus" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cook-eilande" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kameroen" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Sjina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kaap Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Kersfees-eiland" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Siprus" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tseggiese Republiek" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Duitsland" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djiboeti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Denemarke" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikaanse Republiek" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algerië" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonië" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipte" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Wes-Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanje" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Ethiopië" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-eilande (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federasie van Mikronesië" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faroë-eilande" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Frankryk" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Metropolitaanse Frankryk" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gaboen" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Verenigde Koninkryk" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgië" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Frans-Guyana" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Duitsland" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambië" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinee" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekwatoriaal-Guinee" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Griekeland" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Suid-Georgia en die Suid-Sandwich-eilande" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinee-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard-eiland en McDonald-eilande" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroasië" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haïti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hongarye" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesië" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ierland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indië" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Brits-Indiese Oseaangebied" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Ysland" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italië" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaika" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordanië" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgisië" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodja" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comore" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "St. Kitts en Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Noord-Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Suid-Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Koeweit" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kaaimanseilande" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Lao Demokratiese Republiek" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Lebanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "St. Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberië" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litoue" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letland" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libië" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldowa" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "Mongo" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "San Marino" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshall-eilande" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Masedonië" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mianmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolië" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Noord-Mariana-eilande" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritanië" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maledive" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Maleisië" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mosambiek" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibië" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nieu-Kaledonië" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk-eilande" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigerië" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nederland" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noorweë" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauroe" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nieu-Seeland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Frans-Polinesië" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papoea-Nieu-Guinee" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Philippyne" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Pole" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "St. Pierre en Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestynse Gebied" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palaoe" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Roemenië" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "Serwies" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russiese Federasie" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi-Arabië" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomon-eilande" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelle" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Soedan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Swede" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapoer" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "St. Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slowenië" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard en Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slowakye" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalië" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tomé en Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Sirië" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- en Caicos-eiland" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tsjad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Franse Suidelike Gebiede" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tajikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Toerkmenië" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisië" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Oos-Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkye" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad en Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Toewaloe" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzanië" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Oekraïne" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Verenigde State van Kleiner Buite-eilande" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Verenigde State" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Oesbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikaanstad" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent en die Grenadine" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britse Maagde-eilande" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Maagde-eilande, .V.S.A." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Viëtnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis en Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Suid-Afrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambië" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s uitgediendes:%s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Onbekende taal:" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhazies" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinees" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asiaties (ander)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadies" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanies" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonquianse tale" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Suid-Altaïs" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharies" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Engels, Oud (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apache-tale" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabies" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramees" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonees" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armeens" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araukanies" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Kunsmatig (ander)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamees" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Astoeries" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapaskanse tale" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australiese tale" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avaries" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avesties" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aimara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaijaans" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Bandies" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke-tale" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambaries" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinees" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskies" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Balties (ander)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Belo-Russies" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berbers (ander)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (ander)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnies" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretons" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesië)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Boeginees" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgaars" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmees" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Kaddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Sentraal-Amerikaanse Indiaans (ander)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalaans" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukasies (ander)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Kelties (ander)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tjetjeens" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Sjinees" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukees" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook-jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewiaans" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Kerk-Slawies" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Chamiese tale" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Kopties" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Kornies" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsikaans" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreole en pidgintale, Engels-gebaseer (ander)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreole en pidgintale, Frans-gebaseer (ander)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreole en pidgintale, Portugees-gebaseer (ander)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krimse Tataars" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreole en pidgintale (ander)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kashubies" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Kushities (ander)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tsjeggies" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Deens" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Daiak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slawetaal (Athapaskies)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Drawidies (ander)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Laer Sorbies" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Nederlands, Middel- (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nederlands" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egipties (Antieke)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamities" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engels" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Engels, Middel- (ca.1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonies" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faroëes" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijiaans" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Fins" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fins-Oegries (ander)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Frans" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Frans, Middel- (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Frans, Oud- (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Fries" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulies" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gaïo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germaans (ander)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgies" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Duits" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertees" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gallies" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Iers" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galisies" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Duits, Middelhoog- (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Duits, Oudhoog- (ca.1050-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Goties" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grieks, Antieke (tot 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grieks, Moderne (tot 1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haïda" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haïties" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaïes" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebreeus" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligainon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittities" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Oppersorbies" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Hongaars" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Yslands" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Intertale" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Internasionale Hulptaalvereniging)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indies (ander)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesies" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-Europees (ander)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraans (ander)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Iroquoi-tale" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiaans" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javaans" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japannees" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeo-Persies" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeo-Arabies" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannadees" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazaks" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardies" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (ander)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanees" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikoejoe" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kiniarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreaans" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraeaans" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuaniama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Koerdies" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latyn" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letties" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghiaans" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgs" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litaus" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgies" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenia en Tanzanië)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Masedonies" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurees" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallees" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesies (ander)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Maleis" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mendies" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Iers, Middel- (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Verskillende tale" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (ander)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagassies" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltees" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Mantsjoe" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo-tale" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldawies" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongools" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Veelvoudige tale" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda-tale" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandees" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Maya-tale" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Noord-Amerikaanse Indiaans" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitaans" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, Suid-" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, Noord-" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Platduits" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanies (ander)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueaans" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Noors Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Noors Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Noors, Oud-" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Noors" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Noord-Sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubiese tale" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Klassieke Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitaans (na 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetiaans" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turks, Ottomaans (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomiese tale" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuaans (ander)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauaans" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persies, Oud- (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persies" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Philippyns (ander)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenisies" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Pools" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeiaans" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugees" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakrit-tale" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provensaals, Oud- (tot 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongaans" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romaans (ander)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Raeto-Romaans" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Sigeunertaal" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Roemeens" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russies" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Jakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Suid-Amerikaanse Indiaans (ander)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salishan-tale" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritaanse Aramees" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serwies" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliaans" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Skots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroasies" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semities (ander)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Iers, Oud- (tot 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Gebaretale" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouaanse tale" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetaans (ander)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slawies (ander)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slowaaks" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Sloweens" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Suid-Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Noord-Sami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Sami-tale (ander)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoaans" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdiaans" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalies" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, Suid-" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spaans" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinies" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Sahara (ander)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Soedanees" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumeries" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Sweeds" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siries" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahities" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (ander)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tartaars" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetaans" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinies" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Njassa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tonga-eilande)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmen" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Toemboeka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi-tale" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turks" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaïes (ander)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvinies" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Oedmoert" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Oegarities" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Oeighoer" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Oekraïnies" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Oembundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Onbepaal" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Oerdoe" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Oesbeks" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Viëtnamees" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Voties" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakashan-tale" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Warai" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Wallies" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbiese tale" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walloons" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmies" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Japees" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Joruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Jupik-tale" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotek" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "onbekend" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "Die skyf bestaan nie." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Onbekende opdrag" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ongeldige Url-skema '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "Kan gids %1 nie skep nie: %2." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Kan werkskermitem '%s' nie open nie" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Ongeldige uitvoerlêernaam." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Kan lêer nie vir skryf open nie." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Fout met lees vanaf slapskyf." #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "Terugstel van hulpbronne" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Kan werkskermitem '%s' nie open nie" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "Die SM se naam kan nie met ’n syfer begin nie." #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr "Die SM se naam kan nie met ’n syfer begin nie." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" # continue button label #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Voortgaan?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "Pakket %s se integriteitsnagaan misluk. Wil u dit weer probeer aflaai?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Pakket %s se integriteitsnagaan misluk. Wil u dit weer probeer aflaai?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm-nagaan het misluk." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm het misluk." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "hulpbronsoort VAR1 ondersteun nie toon wysigings-eienskap nie" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Kan %s vanaf %s nie voorsien nie" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "Lêer %1 nie in die bewaarplek gevind nie." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "Kan die lêer nie skep nie." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "Ignoreer dié vereiste net hier" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "Ignoreer dié vereiste net hier" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "Verbindingsversoek aan:" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "Kan %s nie installeer nie vanweë afhanklikheidsprobleme" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "Geen voorsiening %s nie" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "Daar is geen installeerbare verskaffers van %s nie" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "Daar is geen installeerbare verskaffers van %s nie" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "Die navraag bestaan reeds." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Installasie is gestaak soos gelas." #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "Voer uit" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "Fout tydens sleutelenkriptering." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "het misluk" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Gewysigde konfigurasielêers vir %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm geberg %s as %s, maar dit was onmoontlik om die verskil te bepaal" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm geberg %s as %s.\n" "Hier is die eerste 25 rëels van verskil:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm geskep %s as %s, maar dit was onmoontlik om die verskil te bepaal" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm geskep %s as %s.\n" "Hier is die eerste 25 rëels van verskil:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "Bykomende rpm-uitset:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "geskepte rugsteun %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "Inskywing nie gevind nie." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "Inskywing nie gevind nie." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "Inskywing nie gevind nie." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1' bestaan nie." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1' bestaan nie." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Misluk om die SM te begin." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Misluk om die SM te begin." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "Inskywing nie gevind nie." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Kan lêer '%1' nie open nie." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Ongeldige LDAP URL-navraagstring" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Ongeldige LDAP URL-navraagparameter '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Kan Url-voorwerp nie kloon nie" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Ongeldige leë Url-voorwerpverwysing" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Kan Url-komponente nie ontleed nie" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url-skema laat nie ’n %s toe nie" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Ongeldige %s komponent '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Ongeldige %s komponent" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Navraagstring-ontleding nie vir hierdie URL ondersteun nie" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url-skema is ’n vereiste komponent" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Ongeldige Url-skema '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url-skema laat nie ’n gebruikernaam toe nie" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url-skema laat nie ’n wagwoord toe nie" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url-skema vereis ’n gasheerkomponent" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url-skema laat nie ’n gasheerkomponent toe nie" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Ongeldige gasheerkomponent '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url-skema laat nie ’n poort toe nie" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Ongeldige poortkomponent '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url-skema vereis padnaam" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relatiewe pad nie toegelaat indien magtiging bestaan nie" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Enkoderingstring bevat ’n NUL-greep" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Ongeldige parametermatryssplyt-skeierkarakter" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Ongeldige parameterbindingsplyt-skeierkarakter" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Ongeldige parametermatrysaansluit-skeierkarakter" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Opdrag uitgevoer wanneer verbind word" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Kan %s nie vind nie." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "Kan %s nie vind nie." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Kan %s - %s nie open nie\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Misluk om module \"%s\" te laai." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Lêer %1 nie in die bewaarplek gevind nie." #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Kan nie na lêer %1 toe skryf nie." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 is nie ’n gids nie." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "Leë CA-naam." #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Ongeldige URL-skema '%1'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Kan werkskermitem '%s' nie open nie" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Toelatings geweier" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ja" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nee" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Waarskuwing" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Fout" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "gedoen" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "fout" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Waarskuwing" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Begin met ..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Nie gevind nie" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ja" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nee" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s voorsien %s, maar dit het ’n ander argitektuur." #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "opdrag om pakkette te oninstalleer" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "Geen voorsiening %s nie" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Die skyf bestaan nie." #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s is gesluit en kan nie ongeïnstalleer word nie." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "nie geïnstalleer nie" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s word benodig deur %s" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Kan %s nie installeer nie" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s verkeer in konflik met %s" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s uitgediendes %s" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s uitgediendes %s" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s verkeer in konflik met %s" #~ msgid "do not install %s" #~ msgstr "moenie %s installeer nie" #~ msgid "keep %s" #~ msgstr "hou %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "moenie %s installeer nie" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "Daar is geen installeerbare verskaffers van %s nie" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "Moenie waar oplossings ter sprake is, installeer of skrap nie" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s voorsien %s, maar dit het ’n ander argitektuur." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "Installeer %s, hoewel dit die argitektuur kan verander" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s uitgediendes %s" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "%s afgelaai vanaf %s" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Installasie" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Kan lêer '%1' nie open nie." #~ msgid "Hal Exception" #~ msgstr "Hal-uitsondering" #~ msgid "HalContext not connected" #~ msgstr "HalContext nie verbind nie" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive nie geïnisialiseer nie" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume nie geïnisialiseer nie" #~ msgid "Unable to create dbus connection" #~ msgstr "Kan dbus-verbinding nie skep nie" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Kan libhal-konteks nie skep nie" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Kan dbus-verbinding nie stel nie" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Kan HAL-konteks nie inisialiseer nie -- hald loop nie?" #~ msgid "Not a CDROM drive" #~ msgstr "Nie ’n CDROM-aandrywer nie" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Kan mutex-eienskappe nie inisialiseer nie" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Kan terugkerende mutex-eienskappe nie stel nie" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Kan terugkerende mutex nie inisialiseer nie" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Kan die mutex-slot nie verkry nie" #~ msgid "Can't release the mutex lock" #~ msgstr "Kan die mutex-slot nie ontsluit nie" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Kan die openbare sleutel nie kry nie." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "nie geïnstalleer nie" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Kan %s - %s nie open nie\n" #~ msgid "Serbia and Montenegro" #~ msgstr "Serwië en Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Onbekende lys-opsie" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "kon afhanklikhede nie oplos nie" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Lêer %s het nie ’n nagaansom nie. \n" #~ "Gebruik die lêer in elk geval?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Lêer %s het nie integriteitsnagaan geslaag met die volgende sleutel nie:\n" #~ "%s|%s|%s\n" #~ " Gebruik die lêer in elk geval?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Lêer %s het ’n ongeldige nagaansom. \n" #~ "Verwag %s, kry %s\n" #~ " Gebruik die lêer in elk geval?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Lêer %s het ’n onbekende nagaansom %s. \n" #~ "Gebruik die lêer in elk geval?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Lêer %s is nie geteken nie.\n" #~ "Gebruik dit in elk geval?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Lêer %s word geteken met ’n onbekende sleutel:\n" #~ "%s|%s|%s\n" #~ " Gebruik die lêer in elk geval?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Onbetroubare sleutel gevind:\n" #~ "%s|%s|%s\n" #~ " Vertrou sleutel?" #~ msgid "%s remove failed" #~ msgstr "%s verwyder het misluk" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "Wysig u wagwoord" #~ msgid "rpm output:" #~ msgstr "rpm-uitset:" #~ msgid "%s install failed" #~ msgstr "%s installasie misluk" #~ msgid "%s installed ok" #~ msgstr "%s geïnstalleer is goed" #~ msgid "%s remove ok" #~ msgstr "%s verwyder is goed" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "" #~ "%s voorsien hierdie afhanklikheid, maar sal die argitektuur van die " #~ "geïnstalleerde item wysig" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "" #~ "%s voorsien hierdie afhanklikheid, maar sal die argitektuur van die " #~ "geïnstalleerde item wysig" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Moenie waar oplossings ter sprake is, installeer of skrap nie" #~ msgid "Ignore that %s is already set to install" #~ msgstr "Ignoreer dat %s reeds gestel is om te installeer" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "Ignoreer die uitgediende %s in %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "Ignoreer hierdie konflik van %s" #~ msgid "Ignore this requirement just here" #~ msgstr "Ignoreer dié vereiste net hier" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "Installeer %s, hoewel dit die argitektuur kan verander" #~ msgid "Install missing resolvables" #~ msgstr "Installeer ontbrekende oplossings" #~ msgid "Keep resolvables" #~ msgstr "Hou oplossings" #~ msgid "Unlock these resolvables" #~ msgstr "Ontsluit hierdie oplossings" #~ msgid "delete %s" #~ msgstr "skrap %s?" #~ msgid "install %s" #~ msgstr "installeer %s" #~ msgid "unlock %s" #~ msgstr "ontsluit %s" #~ msgid "unlock all resolvables" #~ msgstr "ontsluit alle oplossings" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Kan lêer '%1' nie open nie." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "Fout tydens lees van sektor %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "Padparameter-ontleding nie vir hierdie URL ondersteun nie" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "Padparameter-ontleding nie vir hierdie URL ondersteun nie" #~ msgid "Software management is already running." #~ msgstr "Sagtewarebestuur loop reeds." #~ msgid "%s is replaced by %s" #~ msgstr "%s word vervang deur %s" #~ msgid "%s replaced by %s" #~ msgstr "%s vervang deur %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "Hierdie oplossings sal uit die stelsel geskrap word." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s sal nie ongeïnstalleer word nie, want dit word steeds vereis" #~ msgid "Invalid information" #~ msgstr "Ongeldige inligting" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s word deur ander oplossings benodig" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s word benodig deur:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s verkeer in konflik met ander oplossings" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s verkeer in konflik met:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s maak ander oplossings uitgedien" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "Hierdie oplossings sal uit die stelsel geskrap word." #~ msgid "%s depends on other resolvables" #~ msgstr "%s hang van ander oplossings af" #~ msgid "%s depends on %s" #~ msgstr "%s hang af van %s" #~ msgid "%s depends on:%s" #~ msgstr "%s hang af van:%s" #~ msgid "Child of" #~ msgstr "Kind van" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "Daar is geen hulpbron wat hierdie vereiste ondersteun, beskikbaar nie." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "Toekomstige probleme wat bo/onder hierdie resolusie beskryf word, sal nie " #~ "alle afhanklikhede oplos nie" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "Kan %s nie installeer nie, omdat dit in konflik verkeer met %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s word nie geïnstalleer nie en is as oninstalleerbaar gemerk" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s het vereistes waaraan nie voldoen is nie" #~ msgid "%s has missing dependencies" #~ msgstr "%s het afhanklikhede wat ontbreek" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s kan nie geïnstalleer word nie vanweë ontbrekende afhanklikhede" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s vervul afhanklikhede van %s, maar sal ongeïnstalleer word" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s vervul afhanklikhede van %s, maar sal op u stelsel gehou word" #~ msgid "No need to install %s" #~ msgstr "Geen nodigheid om %s te installeer nie" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "Kan %s nie installeer om die afhanklikhede van %s te vervul nie" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "Kan %s nie installeer om die afhanklikhede van %s te vervul nie" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s sal nie ongeïnstalleer word nie, want dit word steeds vereis" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "" #~ "%s uitgediendes %s. Maar %s kan nie geskrap word nie, want dit is gesluit." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "Kan %s nie installeer nie, want dit verkeer in konflik" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s is oninstalleerbaar vanweë konflikte met %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "om %s vir %s te vereis tydens bywerk van %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s het nie die vereiste %s" #~ msgid ", Action: " #~ msgstr ", Aksie:" #~ msgid ", Trigger: " #~ msgstr ", Sneller:" #~ msgid "package" #~ msgstr "pakket" #~ msgid "selection" #~ msgstr "keuse" #~ msgid "pattern" #~ msgstr "patroon" #~ msgid "product" #~ msgstr "produk" #~ msgid "patch" #~ msgstr "regstelling" #~ msgid "script" #~ msgstr "skrip" #~ msgid "message" #~ msgstr "boodskap" #~ msgid "atom" #~ msgstr "atoom" #~ msgid "system" #~ msgstr "stelsel" #~ msgid "Resolvable" #~ msgstr "Oplossings" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "Merk van hierdie resolusiepoging as ongeldig." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "Merk van oplossing %s as oninstalleerbaar" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s word geskeduleer om geïnstalleer te word, maar dit is vanweë " #~ "afhanklikheidsprobleme nie moontlik nie." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "Kan %s nie installeer nie, aangesien dit reeds gemerk is om " #~ "ongeïnstalleer te word" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "" #~ "Kan %s nie installeer nie, aangesien dit nie op hierdie stelsel van " #~ "toepassing is nie." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "Kan %s nie installeer nie, aangesien %s reeds gemerk is om geïnstalleer " #~ "te word" #~ msgid "This would invalidate %s." #~ msgstr "Dit sal %s ongeldig maak." #~ msgid "Establishing %s" #~ msgstr "Vestig van %s" #~ msgid "Installing %s" #~ msgstr "Installeer van %s" #~ msgid "Updating %s to %s" #~ msgstr "Bywerk van %s na %s" #~ msgid "Skipping %s: already installed" #~ msgstr "Oorslaan van %s: reeds geïnstalleer" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "Daar is geen alternatief-geïnstalleerde verskaffers van %s nie" #~ msgid "for %s" #~ msgstr "vir %s nie" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "Bywerking na %s om verwyder van %s te verhoed, is nie moontlik nie." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s voorsien %s, maar word geskeduleer om ongeïnstalleer te word." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "" #~ "%s voorsien %s, maar ’n ander weergawe van daardie %s is reeds " #~ "geïnstalleer." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s voorsien %s, maar dit is oninstalleerbaar. Probeer om dit alleen te " #~ "installeer vir meer besonderhede." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s voorsien %s, maar dit is gesluit." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s voorsien %s, maar word geskeduleer om gehou te word." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s voorsien %s, maar dit het ’n ander argitektuur." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "Kan nie aan vereiste %s vir %s voldoen nie" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s word vereis deur ’n ander geïnstalleerde oplossing; gevolglik sal dit " #~ "nie ontkoppel word nie." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s word vereis deur ’n ander geïnstalleerde oplossing; gevolglik sal dit " #~ "nie ontkoppel word nie." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "" #~ "’n Konflik oor %s (%s) vereis die verwydering van om-geïnstalleer-te-word-" #~ "%s" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "Merk van %s as oninstalleerbaar vanweë konflikte oor %s" #~ msgid "from %s" #~ msgstr "vanaf %s" #~ msgid " Error!" #~ msgstr "Fout!" #~ msgid " Important!" #~ msgstr "Belangrik!" #~ msgid "%s depended on %s" #~ msgstr "%s afgehang van %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s word benodig deur %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s word benodig deur %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s word vervang deur %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s word benodig deur %s" #~ msgid "%s part of %s" #~ msgstr "%s deel van %s" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s word benodig deur %s" #~ msgid "Unable to parse Url authority" #~ msgstr "Kan Url-magtiging nie ontleed nie" #~ msgid "Ignore this requirement generally" #~ msgstr "Ignoreer hierdie vereiste oor die algemeen" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s word vereis deur ’n ander om-geïnstalleer-te-word-oplossing; gevolglik " #~ "sal dit nie ontkoppel word nie." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "" #~ "Kan nie ’n lêer wat benodig word om bywerkinstallasie uit te voer, skep " #~ "nie." #~ msgid "Unable to restore all sources." #~ msgstr "Kan nie alle bronne terugstel nie." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "Ten minste een bron reeds geregistreer, gebergde bronne kan nie " #~ "teruggestel word nie." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "Kan %s nie installeer om die afhanklikhede van %s te vervul nie" #~ msgid "%s dependend on %s" #~ msgstr "%s afhanklik van %s" #~ msgid "Reading index files" #~ msgstr "Lees van indekslêers" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "" #~ "Die getekende repomd.xml-lêer het nie die handtekeningnagaan geslaag nie." #~ msgid "Reading product from %s" #~ msgstr "Lees van produk vanaf %s" #~ msgid "Reading filelist from %s" #~ msgstr "Lees van lêerlys vanaf %s" #~ msgid "Reading packages from %s" #~ msgstr "Lees van pakkette vanaf %s" #~ msgid "Reading selection from %s" #~ msgstr "Lees van keuse vanaf %s" #~ msgid "Reading pattern from %s" #~ msgstr "Lees van patroon vanaf %s" #~ msgid "Reading patches index %s" #~ msgstr "Lees van regstellingsindeks %s" #~ msgid "Reading patch %s" #~ msgstr "Lees van regstelling %s" #~ msgid "The script file failed the checksum test." #~ msgstr "Die skriplêer het nie die nagaansomtoets geslaag nie." #~ msgid "Reading packages file" #~ msgstr "Lees van pakkettelêer" #~ msgid "Reading translation: %s" #~ msgstr "Lees van vertaling: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "Pakket %s se integriteitsnagaan misluk. Wil u dit weer probeer aflaai, of " #~ "die installasie staak?" #~ msgid " miss checksum." #~ msgstr "nagaansom ontbreek." #~ msgid " fails checksum verification." #~ msgstr "slaag nie nagaansom-bevestiging nie." #~ msgid "Downloading %s" #~ msgstr "Aflaai van %s" libzypp-17.36.5/po/ar.po000066400000000000000000004474701476576476200150160ustar00rootroot00000000000000# Arabic message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999 SuSE GmbH. # Ghayss Tarraf , 2000. # Mohammad Alhargan , 2011, 2012. # moh , 2011. # محمد الحرقان , 2012, 2013. # malhargan , 2014. # malhargan , 2014, 2015. msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2020-05-02 19:50+0000\n" "Last-Translator: mohammad alhargan \n" "Language-Team: Arabic \n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\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 ? 4 : 5;\n" "X-Generator: Weblate 3.6.1\n" "X-Language-English: Arabic\n" "X-Language-Local: Arabic*\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "دولة غير معروفة: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "بدون رمز" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "أندورا" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "الإمارات العربية المتحدة" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "افغانستان" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "أنتيغوا وباربودا" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "أنجيلا" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "البانيا" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "ارمينيا" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "هولندا" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "أنجولا" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "أنتاركتيكا" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "الأرجنتين" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "ساموا الأمريكية" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "النمسا" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "أستراليا" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "أروبا" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "جزر ألاند" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "أذربيجان" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "البوسنة والهرسك" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "بربادوس" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "بنغلاديش" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "بلجيكا" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "بوركينا فاسو" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "بلغاريا" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "البحرين" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "بوروندي" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "بنين" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "برمودا" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "بروناي دار السلام" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "بوليفيا" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "البرازيل" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "جزر البهاما" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "بوتان" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "جزيرة بوفيه" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "بوتسوانا" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "روسيا البيضاء" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "بليز" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "كندا" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "جزر كوكوس (كيلنج)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "الكونغو" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "جمهورية أفريقيا الوسطى" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "سويسرا" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "ساحل العاج" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "جزر كوك" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "تشيلي" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "الكاميرون" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "الصين" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "كولومبيا" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "كوستاريكا" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "كوبا" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "الرأس الأخضر" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "جزيرة الكريسماس" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "قبرص" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "جمهورية التشيك" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "ألمانيا" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "جيبوتي" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "الدنمارك" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "دومينيكان" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "جمهورية الدومينيكان" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "الجزائر" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "الإكوادور" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "استونيا" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "مصر" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "الصحراء الغربية" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "إرتيريا" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "أسبانيا" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "إثيوبيا" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "فنلندا" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "فيجي" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "جزر فوكلاند (مالفينس)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "اتحاد دول ميكرونيزيا" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "جزر فيرو" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "فرنسا" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "فرنسا المركزية" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "الجابون" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "المملكة المتحدة" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "غرينادا" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "جورجيا" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "جيانا الفرنسية" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "غويرنسي" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "غانا" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "جبل طارق" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "جرين لاند" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "جامبيا" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "غينيا" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "جوادلوب" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "غينيا الاستوائية" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "اليونان" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "جورجيا الجنوبية وجزر ساندويتش الجنوبية" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "غواتيمالا" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "جوام" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "غينيا بيساو" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "جيانا" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "هونج كونج" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "جزيرة هيرد وجزر ماكدونالد" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "هندوراس" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "كرواتيا" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "هايتي" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "المجر" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "إندونيسيا" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "أيرلندا" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "اسرائيل" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "جزيرة مان" #: zypp/CountryCode.cc:261 msgid "India" msgstr "الهند" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "مقاطعة المحيط الهندي البريطانية" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "العراق" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "إيران" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "أيسلندا" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "إيطاليا" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "جيرسي" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "جامايكا" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "الأردن" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "اليابان" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "كينيا" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "قيرقيزستان" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "كمبوديا" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "كيريباتي" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "جزر القمر" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "سانت كيتس ونيفيس" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "كوريا الشمالية" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "كوريا الجنوبية" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "الكويت" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "جزر كيمان" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "كازاخستان" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "جمهورية لاو الشعبية الديمقراطية" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "لبنان" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "سانت لوشا" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "ليشتنشتاين" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "سيريلانكا" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "ليبريا" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "ليسوتو" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "ليتوانيا" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "لوكسمبورغ" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "لاتفيا" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "ليبيا" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "المغرب" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "موناكو" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "مولدوفا" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "الجبل الأسود" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "سانت مارتن" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "مدغشقر" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "جزر مارشال" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "مقدونيا" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "مالي" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "ميانمار" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "منغوليا" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "ماكاو" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "جزر ماريانا الشمالية" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "مارتينيك" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "موريتانيا" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "مونتسيرات" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "مالطة" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "موريشيوس" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "جزر المالديف" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "مالاوي" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "المكسيك" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "ماليزيا" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "موزمبيق" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "ناميبيا" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "كاليدونيا الجديدة" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "النيجر" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "جزيرة نورفولك" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "نيجيريا" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "نيكاراجوا" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "هولندا" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "النرويج" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "نيبال" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "ناورو" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "نيوي" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "نيوزيلاندا" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "عمان" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "بنما" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "البيرو" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "بولينيسيا الفرنسية" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "بابواغينيا الجديدة" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "الفلبين" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "باكستان" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "بولندا" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "سان بيير ومكويلون" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "بيتكيرن" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "بورتوريكو" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "فلسطين" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "البرتغال" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "بالاو" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "باراغواي" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "قطر" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "ريونيون" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "رومانيا" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "صربيا" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "روسيا الاتحادية" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "رواندا" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "المملكة العربية السعودية" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "جزر سليمان" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "سيشل" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "السودان" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "السويد" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "سنغافورا" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "سانت هلينا" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "سلوفينيا" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "سفالبارد وجان ماين" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "سلوفاكيا" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "سيراليون" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "سان مارينو" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "السنغال" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "الصومال" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "سورينام" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "سان تومي وبرينسيبي" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "السلفادور" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "سوريا" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "سوازيلند" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "جزر توركس وكايكوس" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "تشاد" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "المقاطعات الجنوبية الفرنسية" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "توجو" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "تايلاند" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "طاجكستان" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "توكيلو" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "تركمانستان" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "تونس" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "تونجا" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "تيمور الشرقية" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "تركيا" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ترينيداد وتوباغو" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "توفالو" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "تايوان" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "تنزانيا" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "أوكرانيا" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "أوغندا" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "الجزر الفرعية النائية التابعة للولايات المتحدة الأميركية" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "الولايات المتحدة" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "الأوروغواي" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "أوزباكستان" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "الكرسي البابوي (دولة الفاتيكان)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "سانت فنسنت وجزر غرينادين" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "فنزويلا" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "جزر فيرجن البريطانية" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "جزر فيرجن الأمريكية" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "فيتنام" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "فانواتو" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "جزر والس وفوتونا" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "ساموا" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "اليمن" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "مايوت" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "جنوب أفريقيا" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "زامبيا" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "زيمبابوي" #: zypp/Dep.cc:96 msgid "Provides" msgstr "يوفر" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "متطلبات مبدئية" #: zypp/Dep.cc:98 msgid "Requires" msgstr "يتطلب" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "تعارضات" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "العناصر القديمة" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "يوصي" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "يقترح" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "يحسن" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "يُضيف" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "لغة غير معروفة: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "الأفارية" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "أذربيجان" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "الأتشينيزية" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "الأكولية" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "الأدانجمية" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "الأديجه" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "الأفرو آسيوية - (أخرى)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "الأفريهيلية" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "الأفريكانس" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "الآينوية" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "الأكانية" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "الأكادية" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "الألبانية" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "الأليوتية" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "اللغات الأمريكية الهندية" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "الألطائية الجنوبية" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "الأمهرية" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "الإنجليزية القديمة (450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "اللغات الأباتشية" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "العربية" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "الآرامية" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "الأراجونية" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "الأرمينية" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "الأروكانية" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "الأراباهو" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "الصناعية (أخرى)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "الأراواكية" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "الأسامية" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "الأسترية" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "اللغات الأزباسكانية" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "اللغات الأسترالية" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "الأفاريكية" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "الأفستية" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "الأوادية" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "الأيمارا" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "الأذربيجانية" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "الباندا" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "اللغات الباميليكية" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "الباشكيرية" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "البلوشية" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "البامبارا" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "اللغة البالية" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "الباسك" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "الباسا" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "البلطيقية (أخرى)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "البيجا" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "بلاروسي" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "البيمبا" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "بنجلاديشي" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "البربرية (أخرى)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "البهوجبرية" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "البيهارية" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "البيكولية" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "البينية" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "البيسلامية" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "السيكسيكية" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "البانتو (أخرى)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "البوسنية" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "البراجية" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "البريتون" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "الباتاكية (إندونسيا)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "البرياتية" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "البجينيزية" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "البلغارية" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "البورمية" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "البلينية" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "الكادو" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "الهندية الأمريكية الوسطى (أخرى)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "الكاريبية" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "الكاتالانية" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "القوقازية (أخرى)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "السيبيونو" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "السلتية (أخرى)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "التشامورو" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "التشيبشا" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "الشيشانية" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "التشاجاتاى" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "الصينية" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "التشكيزية" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "المارية" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "الشينوك جارجون" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "الشوكتو" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "الشيباوايان" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "الشيروكى" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "سلافية كنسية" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "التشفاش" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "الشايان" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "اللغات التشاميكية" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "القبطية" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "الكورنية" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "الكورسيكية" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" "الكرييولى واللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الإنجليزية " "(أخرى)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" "الكرييولى واللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الفرنسية (أخرى)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" "الكرييولى واللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس البرتغالية " "(أخرى)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "الكري" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "لغة توركية كريمينية" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "الكرييولى واللغات المبسطة الأخرى للتفاهم بين الشعوب (أخرى)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "الكاشبايان" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "الكشيتيك (أخرى)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "التشيكية" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "الداكوتا" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "الدانماركية" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "الدارجوا" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "الدياك" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "الديلوير" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "السلافية (الأزباسكانية)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "الدوجريب" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "الدنكا" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "المالديفية" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "الدوجرى" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "الدرافيدين (أخرى)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "الصربية السفلى" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "الديولا" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "الهولندية الوسطى (1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "الهولندية" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "الدايلا" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "الزونخاية" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "الافيك" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "المصرية (القديمة)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "الاكاجك" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "الامايت" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "الإنجليزية" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "الإنجليزية الوسطى (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "الإسبرانتو" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "الإستونية" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "إيوي" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "الإيوندو" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "الفانج" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "الفارويز" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "الفانتى" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "الفيجية" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "الفلبينية" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "الفنلندية" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "فينو أجرايان (أخرى)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "الفون" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "الفرنسية" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "الفرنسية الوسطى (1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "الفرنسية القديمة (842-1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "الفريزيان" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "الفلة" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "الفريلايان" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "الجا" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "الجايو" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "الجبيا" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "الجرمانية (أخرى)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "الجورجية" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "الألمانية" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "الجيز" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "لغة أهل جبل طارق" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "الغيلية" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "الأيرلندية" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "الجاليكية" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "المنكية" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "الألمانية العليا الوسطى (1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "الألمانية العليا القديمة (750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "الجندى" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "الجورونتالو" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "الجرمانية" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "الجريبو" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "اليونانية القديمة (حتى 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "اليونانية الحديثة (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "الجوارانى" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "الغوجاراتية" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "جويتشن" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "الهيدا" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "الهايتية" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "الهوسا" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "لغة أهل الهاواى" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "العبرية" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "الهيريرو" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "الهيليجينون" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "الهيماتشالى" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "هندية" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "الحثية" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "الهمونجية" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "الهيرى موتو" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "الصربية العليا" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "المجرية" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "الهبا" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "الإيبان" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "الإيجبو" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "الآيسلندية" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "الإيدو" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "السيتشيون يى" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "الإيجو" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "الإينكتيتت" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "الإنترلينج" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "الإيلوكو" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "اللغة الوسيطة (جمعية اللغات المساعدة الدولية)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "الهندية (أخرى)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "الإندونيسية" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "الهندية الأوروبية (أخرى)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "الإنجوشية" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "الإينبياك" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "الإيرانية (أخرى)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "اللغات الإيروكويانية" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "الإيطالية" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "الجاوية" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "اللوجبان" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "اليابانية" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "الجيدو الفارسى" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "الجيدو العربي" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "الكارا كالباك" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "القبيلية" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "الكاتشين" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "الكالاليست" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "الكامبا" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "الكانادا" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "الكاريين" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "الكاشميرية" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "الكانيورى" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "الكوي" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "الكازاخستانية" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "الكاباردايان" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "الخاسي" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "الخويسان (أخرى)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "الخميرية" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "الخوتانيز" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "الكيكيو" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "الكينيارواندا" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "القيرغستانية" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "الكيمبندو" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "الكونكانية" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "الكومى" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "الكونغو" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "الكورية" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "الكوسراين" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "الكبيل" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "الكاراتشاى بالكار" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "الكرو" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "كوروخ" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "الكيونياما" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "الكميك" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "الكردية" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "الكتيناى" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "لادينو" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "اللاهندا" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "اللامبا" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "اللاوية" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "اللاتينية" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "اللاتفية" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "الليزجهايانية" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "الليمبورغية" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "اللينجالا" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "الليتوانية" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "المنغولية" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "اللوزى" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "اللوكسمبرجية" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "اللبا-لؤلؤ" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "اللبا-كاتانجا" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "الجاندا" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "اللوسينو" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "اللوندا" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "اللو (كينيا وتنزانيا)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "اللشاى" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "المقدونية" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "المادريز" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "الماجا" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "المارشالية" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "المايثلية" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "الماكاسار" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "الماليالام" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "الماندينغ" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "الموري" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "الأوسترونيسيان (أخرى)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "المراثي" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "الماساي" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "الملايو" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "الموكشا" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "الماندار" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "الميند" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "الأيرلندية الوسطى (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "الميكماكيونية" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "المينانجكاباو" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "اللغات المتنوعة" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "المون خمير (أخرى)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "المالاجاشية" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "المالطية" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "المانشو" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "المانيبرى" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "لغات مانوبو" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "الموهوك" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "المولدوفية" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "المنغولية" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "موسي" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "اللغات المتعددة" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "لغات المندا" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "كريك" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "الميرانديز" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "الماروارى" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "لغات المايا" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "اللغة الأرزية" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "الناهيوتل" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "الهندية الأمريكية الشمالية" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "اللغة النابولية" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "نافاجو" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "النديبيل الجنوبى" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "النديبيل الشمالي" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "الندونجا" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "الألمانية السفلى" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "النيبالية" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "نيبال فاسا" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "نياس" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "النيجر-كوردوفانايان (أخرى)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "نيويان" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "النينورسك النرويجي" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "البوكمال النرويجي" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "نوجاى" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "النورس القديم" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "النرويجية" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "سوتو الشمالي" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "اللغات النوبية" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "النوارية التقليدية" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "التشيتشوا" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "النيامويزى" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "النيانكول" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "النيورو" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "النزيما" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "أوكيتان (بعد 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "الأوجيبوا" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "الأورييا" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "الأورومو" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "الأوساج" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "الأوسيتيان" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "التركية العثمانية (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "اللغات العثمانية" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "الغينية (أخرى)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "البانجاسينان" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "البهلوية" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "البامبانجا" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "بانجابي" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "البابيامينتو" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "البالوان" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "الفارسية القديمة (600-400 قبل الميلاد)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "الفارسية" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "الفليبينية (أخرى)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "الفينيقية" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "البالية" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "البولندية" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "البوهنبيايان" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "البرتغالية" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "اللغات البراقريطية" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "البروفانسية القديمة (حتى 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "بوشتو" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "الكويتشوا" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "الراجاسثانية" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "الرابانى" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "الراروتونجانى" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "الرومانسية (أخرى)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "الرهايتو-رومانس" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "الرومانية" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "الرومانية" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "روندي" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "الروسية" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "السانداوي" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "السانجو" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "الياكت" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "الهندية الأمريكية الجنوبية (أخرى)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "لغات ساليشان" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "الآرامية السومارية" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "السنسكريتية" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "الساساك" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "السانتالي" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "الصربية" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "الصقلية" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "الأسكتلندية" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "الكرواتية" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "السيلكب" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "السامية (أخرى)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "الأيرلندية القديمة (إلى 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "لغات الإشارة" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "الشانية" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "السيدامو" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "السينهالا" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "لغات السيويون" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "الصينية التيبتية (أخرى)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "السلافية (أخرى)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "السلوفاكية" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "السلوفينية" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "السامية الجنوبية" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "السامية الشمالية" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "اللغات السامية (أخرى)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "اللول سامي" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "الإيناري سامي" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "الساموائية" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "السكولت سامي" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "الشونا" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "السيندي" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "السونينك" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "السوجديان" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "الصومالية" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "السونجهاى" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "سوتو الجنوبي" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "الأسبانية" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "السردينية" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "سيرير" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "النيلية الصحراوية (أخرى)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "السواتي" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "السوكوما" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "السودانية" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "السوسو" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "السومارية" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "السواحلية" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "السويدية" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "السريانية" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "التاهيتية" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "تاي (أخرى)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "التاميلية" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "التتارية" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "تيلوغو" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "التيمن" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "التيرينو" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "التيتم" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "الطاجكية" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "التاغالوغية" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "التايلاندية" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "التبتية" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "التيجر" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "التيجرينيا" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "التيف" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "الكلينجون" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "التلينغيتية" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "التاماشيك" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "تونجا (نياسا)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "تونجا (جزر تونجا)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "التوك بيسين" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "التسيمشيان" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "التسوانية" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "تسونجا" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "التركمانية" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "التامبوكا" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "اللغات التوبية" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "التركية" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "الألطائية (أخرى)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "التوي" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "توفاني" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "الأدمرت" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "اليجاريتيك" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "الأغورية" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "الأوكرانية" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "الأمبندو" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "غير محددة" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "الأردية" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "الأوزبكية" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "الفاي" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "الفيندا" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "الفيتنامية" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "الفولابوك" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "الفوتيك" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "لغات الواكاشان" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "الوالامو" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "الواراي" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "الواشو" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "الويلزية" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "اللغات الصربية" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "الولونية" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "الولوف" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "الكالميك" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "الهاوسا" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "الياو" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "اليابيز" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "الييدية" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "اليوروبية" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "اللغات اليوبيكية" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "الزابوتيك" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "الزيناجا" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "الزهيونج" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "الزاند" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "الزولو" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "الزونية" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "سيتم تنفيذ الإجراءات التالية:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "غير معروف" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "غير مدعوم" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "المستوى 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "المستوى 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "المستوى 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "مطلوب عقد عميل إضافي" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "غير صالح" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "مستوى الدعم غير محدد" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "البائع لا يوفر الدعم." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "تحديد المشكلة والذي يعني دعمًا فنيًا مصممًا لتوفير معلومات التوافق والمساعدة في " "التثبيت ودعم الاستخدام والصيانة المستمرة واستكشاف الأخطاء وإصلاحها الأساسي. " "والمستوى 1 من الدعم ليس مخصصًا لتصحيح أخطاء عيوب المنتجات." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "عزل المشكلة، والذي يعني دعمًا فنيًا مصممًا لعمل نسخ مطابقة من مشاكل العملاء " "وعزل منطقة المشكلة وتوفير حل للمشاكل التي لم يتم حلها من خلال دعم المستوى 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "حل المشكلة، والذي يعني دعمًا فنيًا مصممًا لحل المشاكل المعقدة من خلال إشراك " "الهندسة في حل عيوب المنتج التي تم تحديدها في دعم المستوى 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "مطلوب عقد عميل إضافي للحصول على الدعم." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "خيار دعم غير معروف. الوصف غير متاح" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "يتم قفل إدارة النظام بواسطة التطبيق الذي يتضمن معرف العملية %d (%s).\n" "الرجاء إغلاق هذا التطبيق قبل المحاولة مرة أخرى." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "وضع التطابق '%s' غير معروف" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "وضع التطابق '%s' غير معروف للنمط '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "تعبير عادي غير صالح '%s': regcomp أعاد %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "التعبير العادي '%s' غير صالح" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "التصديق '%s' مطلوب" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "تفضل بزيارة مركز عملاء SUSE للتحقق ما إذا كان التسجيل صالحًا وغير منته " "الصلاحية بعد." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "تفضل بزيارة Novell Customer Center (مركز خدمة عملاء Novell) للتحقق من صلاحية " "التسجيل وعدم انتهائها." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "إنشاء نقطة إرفاق: لا يمكن العثور على دليل قابل للكتابة لإنشاء نقطة إرفاق" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "الرجاء تثبيت حزمة 'lsof' أولًا." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "لا يمكن إنشاء دليل لذاكرة التخزين المؤقت لبيانات التعريف." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "حدث خطأ أثناء محاولة القراءة من '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "لا يمكن إنشاء %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "فشل التخزين المؤقت للمخزن (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "يتم الآن بناء الذاكرة المؤقتة لمخزن '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "لا يمكن إنشاء ذاكرة التخزين المؤقت في %s - لا توجد أذونات للكتابة." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "نوع مخزن غير معالج" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "إضافة المخزن '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "اسم ملف المخزن غير صالح في '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "تعذر فتح الملف '%s' للكتابة." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "حدث خطأ غير معروف أثناء القراءة من '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "تعذرت قراءة دليل المخازن '%1%': تم رفض الإذن" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "فشلت قراءة الدليل '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "تعذرت قراءة ملف المخزن '%1%': تم رفض الإذن" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "إزالة المخزن '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "لا يمكن معرفة مكان تخزين المخزن." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "لا يمكن حذف '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "لا يمكن معرفة مكان تخزين الخدمة." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "خدمة غير معروفة '%1%': تتم الآن إزالة مخزن الخدمة الوحيد '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "لا يمكن أن يبدأ الاسم المستعار للمخزن بنقطة." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "لا يمكن أن يبدأ الاسم المستعار للخدمة بنقطة." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" msgstr[5] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" # continue button label #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "هل تريد المتابعة؟" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "المستودع %1% لم يقم بتعريف مفتاح إضافي 'مفتاح gpg=' عناوين المواقع." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "يتم البحث عن معرف لمفتاح gpg رقم %1% في المستودع %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "البحث عن مفتاح gpg للتشفير %1% في الذاكرة المؤقتة %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "السمة المطلوبة '%s' مفقودة." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "إحدى السمتين '%s' أو '%s' أو كلتيهما مطلوبة." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "فشل التحقق من التوقيع" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "يبدو أنه قد تم إتلاف الحزمة %s أثناء النقل. هل تريد إعادة محاولة الاسترداد؟" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "فشل تقديم الحزمة %s. هل تريد إعادة محاولة الاسترداد؟" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "فشل التحقق من applydeltarpm." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "فشل applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "لا تدعم الأداة الإضافية للخدمة تغيير إحدى السمات." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "لا يمكن توفير الملف '%s' من المخزن '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "لا يوجد عنوان url في المخزن." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "يتعارض ملف %1%\n" " من الحزمة\n" " %2%\n" " مع الملف من الحزمة\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "يتعارض ملف %1%\n" " من الحزمة\n" " %2%\n" " مع الملف من تثبيت\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "يتعارض ملف %1%\n" " من تثبيت\n" " %2%\n" " مع الملف من الحزمة\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "يتعارض ملف %1%\n" " من تثبيت\n" " %2%\n" " مع الملف من تثبيت\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "يتعارض ملف %1%\n" " من الحزمة\n" " %2%\n" " مع الملف\n" " %3%\n" " من الحزمة\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "يتعارض ملف %1%\n" " من الحزمة\n" " %2%\n" " مع الملف\n" " %3%\n" " من تثبيت\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "يتعارض ملف %1%\n" " من تثبيت\n" " %2%\n" " مع الملف\n" " %3%\n" " من الحزمة\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "يتعارض ملف %1%\n" " من تثبيت\n" " %2%\n" " مع الملف\n" " %3%\n" " من تثبيت\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "تعذر إنشاء sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "توقيف %s عن طريق تجاهل بعض تبعياتها" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "تجاهل بشكل عام لبعض التبعيات" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "طلبات متعارضة" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "بعض مشكلات التبعية" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "الطلب غير مدعوم" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "الموفرون المحذوفون: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "موفرون غير قابلين للتثبيت: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "الموفرون غير القابلين للتثبيت: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "سيؤدي هذا الطلب إلى تعطل النظام!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "تجاهل تحذير النظام المعطل" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "بتثبيت %1% على الرغم من أنه تم سحبه" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "تسمح بتثبيت PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "تثبيت %1% على الرغم من أنه مدرج في القائمة السوداء" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "تم إيقاف التثبيت وفقًا للتعليمات." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " مُنفَّذ" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " فشل التنفيذ" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "تم تنفيذ %s بالفعل كـ %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " تم تخطي التنفيذ أثناء الإيقاف" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "حدث خطأ أثناء إرسال رسالة إعلام بالتحديث." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "رسالة تحديث جديد" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "فشل RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "فشل استيراد المفتاح العمومي %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "أخفقت إزالة المفتاح العام %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "ملفات التكوين التي تم تغييرها لـ %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "قامت rpm بحفظ %s باعتبارها %s، ولكن تعذر تحديد الفرق" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "تم حفظ rpm %s باعتبارها %s.\n" "فيما يلي أول 25 سطرًا من سطور الفرق:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "قامت rpm بإنشاء %s باعتبارها %s، ولكن تعذر تحديد الفرق" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "تم إنشاء %s من خلال rpm باعتبارها %s.\n" "فيما يلي أول 25 سطرًا من سطور الفرق:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "مخرجات rpm إضافية" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "تم إنشاء النسخة الاحتياطية %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "تمت المصادقة على التوقيع" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "نوع التوقيع غير معروف" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "تعذر التحقق من التوقيع" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "تمت المصادقة على التوقيع، لكن المفتاح غير موثوق به" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "تواقيع المفتاح العمومي غير متوفرة" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "الملف غير موجود أو لا يمكن التحقق من توقيعه" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "الملف غير موقع" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "الصلاحية غير منتهية" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "نهاية الصلاحية:: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "تنتهي: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(الصلاحية غير منتهية)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(انتهت الصلاحية)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(ستنتهي الصلاحية خلال 24 ساعة)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(ستنتهي الصلاحية خلال %d يوم)" msgstr[1] "(ستنتهي الصلاحية خلال يوم واحد)" msgstr[2] "(ستنتهي الصلاحية خلال يومين)" msgstr[3] "(ستنتهي الصلاحية خلال بضعة أيام)" msgstr[4] "(ستنتهي الصلاحية خلال عدة أيام)" msgstr[5] "(ستنتهي الصلاحية خلال %d من الأيام)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "جرت محاولة استيراد المفتاح غير الموجود %s إلى حلقة المفاتيح %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "فشل استيراد المفتاح." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "فشل حذف المفتاح." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "ملف التوقيع %s غير موجود" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" "النوع المشكوك فيه '%s' للمجموع الاختباري لوحدات البايت %u الذي يبلغ '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "تعذر فتح pty (‏%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "لا يمكن فتح المسار (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "سلسلة استعلام URL لبروتوكول LDAP غير صالحة" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "معلمة استعلام URL لبروتوكول LDAP ‏'%s' غير صالحة" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "تعذر استنساخ كائن Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "مرجع كائن Url فارغ غير صالح" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "تعذر تحليل مكونات Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "المحفوظات:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "لا يسمح مخطط Url بـ %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "مكون %s غير صالح '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "مكون %s غير صالح" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "تحليل سلسلة الاستعلام غير مدعوم لعنوان URL هذا" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "يعتبر مخطط Url مكونًا مطلوبًا" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "مخطط Url '%s' غير صالح" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "لا يسمح مخطط Url بإدخال اسم مستخدم" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "لا يسمح مخطط Url بإدخال كلمة سر" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "يتطلب مخطط Url وجود مكون مضيف" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "لا يسمح مخطط Url بوجود مكون مضيف" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "مكون المضيف '%s' غير صالح" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "لا يسمح مخطط Url بإدخال منفذ" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "مكون المنفذ '%s' غير صالح" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "يتطلب مخطط Url وجود اسم مسار" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "غير مسموح بالمسار النسبي في حالة وجود سلطة" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "تحتوي السلسلة المُرمَّزة على وحدة بايت NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "حرف تقسيم مصفوفة المعلمات الفاصل غير صالح" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "حرف تقسيم مخطط المعلمات الفاصل غير صالح" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "حرف ربط مصفوفة المعلمات الفاصل غير صالح" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "تم إنهاء الأمر بالحالة %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "تم إنهاء الأمر بواسطة الإشارة %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "تم إنهاء الأمر بخطأ غير معروف." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "لا يمكن تغيير الجذر الافتراضي إلى '%s' (‏%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "لا يمكن تغيير الدليل الافتراضي إلى '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" "لا يمكن إجراء تغيير الدليل الافتراضي إلى '%s' داخل تغيير الجذر الافتراضي " "'%s' (‏%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "لا يمكن تنفيذ '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "تعذر تقسيم (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "فشل توصيل %s على %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "فشل إلغاء توصيل %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "اسم ملف غير صالح: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "لم يتم فتح الوسيط أثناء محاولة تنفيذ الإجراء '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "لم يتم العثور على الملف '%s' في الوسيط '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "لا يمكن كتابة الملف '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "لم يتم إرفاق الوسيط" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "نقطة إرفاق وسائط غير صالحة" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "فشلت تهيئة تحميل (curl) لـ '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "استثناء النظام '%s' في الوسيط '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "المسار '%s' في الوسيط '%s' ليس ملفًا." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "المسار '%s' في الوسيط '%s' ليس دليلاً." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI غير صالح" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "اسم مضيف فارغ في URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "نظام ملفات فارغ في URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "وجهة فارغة في URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "مخطط URI غير مدعوم في '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "لا يدعم الوسيط العملية" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "خطأ في إنزال (curl) لـ '%s':\n" "رمز الخطأ: %s\n" "رسالة الخطأ: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "حدث خطأ أثناء تعيين خيارات إنزال (curl) لـ '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "لا يحتوي مصدر الوسائط '%s' على الوسيط المطلوب" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "الوسيط '%s' مستخدَم بواسطة مثيل آخر" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "لا يمكن إخراج أي وسائط" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "لا يمكن إخراج الوسائط '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "تم رفض إذن الوصول إلى '%s'." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "تم تجاوز المهلة عند الوصول إلى '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "تجاوزت البيانات المحملة حجم الملف ,الحجم المتوقع للملف '%s' من '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "يتعذر الوصول إلى الموقع '%s' مؤقتًا." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " مشكلة في شهادة SSL، تحقق من أن شهادة CA صالحة لـ '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "أسلوب تصديق HTTP غير مدعوم '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "نعم" #: zypp-tui/Table.cc:32 msgid "No" msgstr "لا" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "ملاحظة:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "تحذير:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "خطأ:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "تم" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "الخطأ" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "تحذير: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "استرداد:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "بدء تشغيل" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "لم يتم العثور عليه" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "لا تتوفر أية تعليمات لهذه المطالبة." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "لا تتوفر أية تعليمات لهذا الخيار" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "إظهار كلّ الخيارات" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "نعم" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "لا" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "لم يتم العثور على بيانات تعريف صالحة في أي عنوان URL محدد" #~ msgstr[1] "لم يتم العثور على بيانات تعريف صالحة في عنوان URL المحدد" #~ msgstr[2] "لم يتم العثور على بيانات تعريف صالحة في عنواني URL المحددين" #~ msgstr[3] "لم يتم العثور على بيانات تعريف صالحة في بعض عناوين URL المحددة" #~ msgstr[4] "" #~ "لم يتم العثور على بيانات تعريف صالحة في كثير من عناوين URL المحددة" #~ msgstr[5] "لم يتم العثور على بيانات تعريف صالحة في عناوين URL محددة أخرى" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "جارٍ تنفيذ برنامج %%posttrans النصي '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "جارٍ تنفيذ برامج %posttrans النصية" #~ msgid "Package is not signed!" #~ msgstr "لم يتم توقيع الحزمة!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "لا ينتمي %s إلى مخزن ترقية التوزيع" #~ msgid "%s has inferior architecture" #~ msgstr "هيكل %s غير ملائم" #~ msgid "problem with installed package %s" #~ msgstr "توجد مشكلة بالحزمة المثبتة %s" #~ msgid "nothing provides requested %s" #~ msgstr "لا يوجد مصدر لتوفير %s المطلوب" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "هل قمت بتمكين كل المخازن المطلوبة؟" #~ msgid "package %s does not exist" #~ msgstr "الحزمة %s غير موجود" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "يتم توفير %s من خلال النظام ولا يمكن حذفه" #~ msgid "%s is not installable" #~ msgstr "%s غير قابل للتثبيت" #~ msgid "nothing provides %s needed by %s" #~ msgstr "لا يوجد مصدر لتوفير %s المطلوب من قبل %s" #~ msgid "cannot install both %s and %s" #~ msgstr "لا يمكن تثبيت كل من %s و%s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "يتعارض %s مع %s المتوفر من قبل %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s يُبطِل %s المتوفر من قبل %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s المثبَت سيُبطل %s الموفَر بواسطة %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "المشكلة القابلة للحل %s تتعارض مع %s المتوفرة من نفسها" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s يتطلب %s، ولكن لا يمكن توفير هذا المتطلب" #~ msgid "remove lock to allow removal of %s" #~ msgstr "إزالة القفل للسماح بالحذف %s" #~ msgid "do not install %s" #~ msgstr "عدم تثبيت %s" #~ msgid "keep %s" #~ msgstr "الاحتفاظ بـ %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "إزالة القفل للسماح بالتثبيت %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "عدم طلب تثبيت المشاكل القابلة للحل التي توفر %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "عدم طلب حذف كل المشاكل القابلة للحل التي توفر %s" #~ msgid "do not install most recent version of %s" #~ msgstr "عدم تثبيت أحدث إصدار من %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "الحفاظ على %s بغض النظر عن الهيكل غير الملائم" #~ msgid "install %s despite the inferior architecture" #~ msgstr "تثبيت %s بغض النظر عن الهيكل غير الملائم" #~ msgid "keep obsolete %s" #~ msgstr "الحفاظ على %s القديمة" #~ msgid "install %s from excluded repository" #~ msgstr "تثبيت %s من المخزن المستبعد" #~ msgid "downgrade of %s to %s" #~ msgstr "تخفيض إصدار %s إلى %s" #~ msgid "architecture change of %s to %s" #~ msgstr "تغيير الهيكل الخاص بـ %s إلى %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "تثبيت %s (مع تغيير البائع)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "استبدال %s بـ %s" #~ msgid "deinstallation of %s" #~ msgstr "إلغاء تثبيت %s" #~ msgid "Can't open lock file: %s" #~ msgstr "لا يمكن فتح ملف القفل: %s" #~ msgid "This action is being run by another program already." #~ msgstr "يتم الآن تشغيل هذا الإجراء بالفعل من قبل برنامج آخر." #~ msgid "Hal Exception" #~ msgstr "استثناء Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "عذرًا، تم إنشاء هذا الإصدار من libzypp بدون دعم HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext غير متصل" #~ msgid "HalDrive not initialized" #~ msgstr "لم تتم تهيئة HalDrive" #~ msgid "HalVolume not initialized" #~ msgstr "لم تتم تهيئة HalVolume" #~ msgid "Unable to create dbus connection" #~ msgstr "تعذر إنشاء اتصال dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: تعذر إنشاء سياق libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: تعذر تعيين اتصال dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "تعذرت تهيئة سياق HAL -- هل hald ليس قيد التشغيل؟" #~ msgid "Not a CDROM drive" #~ msgstr "ليس محرك أقراص مضغوطة" #~ msgid "Can't initialize mutex attributes" #~ msgstr "تعذرت تهيئة سمات mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "تعذر تعيين سمة mutex المتكرر" #~ msgid "Can't initialize recursive mutex" #~ msgstr "تعذرت تهيئة mutex المتكرر" #~ msgid "Can't acquire the mutex lock" #~ msgstr "تعذر الحصول على قفل mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "تعذر تحرير قفل mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "فشل استيراد المفتاح العام من الملف %s‏: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "فشلت إزالة المفتاح العام %s‏: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "لا يمكن العثور على جهاز التسلسل المتاح لتوصيل ملف الصور من '%s'" #~ msgid "generally ignore of some dependecies" #~ msgstr "عموما تجاهل بعض المعتمدات" #~ msgid "do not forbid installation of %s" #~ msgstr "لا تمنع تثبيت %s" #~ msgid "do not keep %s installed" #~ msgstr "عدم الإبقاء على %s مثبت" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "لا يمكن إنشاء المفتاح العام %s من %s إلى ملف حلقة المفاتيح %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "حاول استيراد مفتاح غير موجود %s إلى حلقة مفاتيح %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "لا يمكن تغيير مجلد العمل '/' داخل استجذار (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "فشل تهيئة تحميل (Metalink curl) '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "تحميل (metalink curl) خطأ '%s':\n" #~ "رمز الخطأ: %s\n" #~ "رسالة الخطأ: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "توقف التحميل في %d%%" #~ msgid "Download interrupted by user" #~ msgstr "توقف التحميل بواسطة المستخدم" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "حدث خطأ أثناء إعداد خيارات التحميل (metalink curl) ل '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "فشل في تحميل %s من%s" #~ msgid "Serbia and Montenegro" #~ msgstr "صربيا ومونتنيجرو" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "خيار list غير معروف" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "تعذر حل التبعيات" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" libzypp-17.36.5/po/ast.po000066400000000000000000002771061476576476200152000ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR SuSE Linux GmbH, Nuernberg # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: zypper\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2017-05-07 15:28+0000\n" "Last-Translator: Enol P \n" "Language-Team: Asturian \n" "Language: ast\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: Weblate 2.6\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "¿Siguir?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr "" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Sí" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Non" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Alvertencia: " #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Fallu" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "fecho" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "fallu" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Alvertencia: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Recibiendo:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "aniciando" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Nun s'alcontró" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "nun hai ayuda disponible pa esta opción" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "amosar toles opciones" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "sí" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "non" libzypp-17.36.5/po/be.po000066400000000000000000003113131476576476200147640ustar00rootroot00000000000000# Belarusian message file for YaST2 (@memory@). # Copyright (C) 2007 SUSE Linux Products GmbH. # Alexander Nyakhaychyk , 2007 # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2006-01-04 08:58+0100\n" "Last-Translator: Alexander Nyakhaychyk \n" "Language-Team: Belarusian \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: 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" #: zypp/CountryCode.cc:50 #, fuzzy msgid "Unknown country: " msgstr "Невядомая каманда: %1" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Аб'яднаныя Арабскія Эміраты" #. :ARE:784: #: zypp/CountryCode.cc:160 #, fuzzy msgid "Afghanistan" msgstr "Пакістан" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Албанія" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "" #. :ARM:051: #: zypp/CountryCode.cc:165 #, fuzzy msgid "Netherlands Antilles" msgstr "Нідэрланды" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Аргенціна" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Аўстрыя" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Аўстралія" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "" #. :ABW:533: #: zypp/CountryCode.cc:173 #, fuzzy msgid "Aland Islands" msgstr "Фарэрскія астравы" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "" #. :AZE:031: #: zypp/CountryCode.cc:175 #, fuzzy msgid "Bosnia and Herzegovina" msgstr "Боснія і Герцагавіна" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Бангладэш" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Бельгія" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Балгарыя" #. :BGR:100: #: zypp/CountryCode.cc:181 #, fuzzy msgid "Bahrain" msgstr "Бахрэйн" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Балівія" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "" #. :BTN:064: #: zypp/CountryCode.cc:190 #, fuzzy msgid "Bouvet Island" msgstr "Фарэрскія астравы" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Батсвана" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Беларусь" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Канада" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "" #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "Сірыя" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Швейцарыя" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" #. :CIV:384: #: zypp/CountryCode.cc:201 #, fuzzy msgid "Cook Islands" msgstr "Фарэрскія астравы" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Чылі" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Калумбія" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Коста Рыка" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Чэхія" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Германія" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Данія" #. :DNK:208: #: zypp/CountryCode.cc:215 #, fuzzy msgid "Dominica" msgstr "Дамініканская Рэспубліка" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Дамініканская Рэспубліка" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Алжыр" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Эквадор" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Эстонія" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Егіпет" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Іспанія" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Фінляндыя" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Фарэрскія астравы" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Францыя" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "" #. :GBR:826: #: zypp/CountryCode.cc:234 #, fuzzy msgid "Grenada" msgstr "Канада" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Грузія" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Германія" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Грэнландыя" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Грэцыя" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Гватэмала" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Гонк Конг" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Гандурас" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Харватыя" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Венгрыя" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Інданэзія" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ірландыя" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Ізраіль" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Індыя" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Ірак" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Ісландыя" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Італія" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Іарданія" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Японія" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "" #. :PRK:408: #: zypp/CountryCode.cc:278 #, fuzzy msgid "South Korea" msgstr "Паўдневая Афрыка" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Кувейт" #. :KWT:414: #: zypp/CountryCode.cc:280 #, fuzzy msgid "Cayman Islands" msgstr "Фарэрскія астравы" #. :CYM:136: #: zypp/CountryCode.cc:281 #, fuzzy msgid "Kazakhstan" msgstr "Пакістан" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Ліван" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Ліхтэнштэйн" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Літва" #. :LTU:440: #: zypp/CountryCode.cc:290 #, fuzzy msgid "Luxembourg" msgstr "Люксембург" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Латвія" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Марока" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "" #. :MDG:450: #: zypp/CountryCode.cc:299 #, fuzzy msgid "Marshall Islands" msgstr "Фарэрскія астравы" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Македонія" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "" #. :MTQ:474: #: zypp/CountryCode.cc:307 #, fuzzy msgid "Mauritania" msgstr "Літва" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Мальта" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "" #. :MDV:462: #: zypp/CountryCode.cc:312 #, fuzzy msgid "Malawi" msgstr "Малайзія" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Мексіка" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Малайзія" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "" #. :NAM:516: #: zypp/CountryCode.cc:317 #, fuzzy msgid "New Caledonia" msgstr "Македонія" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" #. :NER:562: #: zypp/CountryCode.cc:319 #, fuzzy msgid "Norfolk Island" msgstr "Фарэрскія астравы" #. :NFK:574: #: zypp/CountryCode.cc:320 #, fuzzy msgid "Nigeria" msgstr "Алжыр" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Нікарагуа" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Нідэрланды" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Нарвегія" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Новая Зеландыя" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Аман" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Панама" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Перу" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Філіпіны" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Пакістан" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Польша" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Пуэрта Рыка" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Партугалія" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Парагвай" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Катар" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Румынія" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "Алжыр" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Саудаўская Аравія" #. :SAU:682: #: zypp/CountryCode.cc:350 #, fuzzy msgid "Solomon Islands" msgstr "Фарэрскія астравы" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Судан" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Швецыя" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Сінгапур" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Славенія" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Славакія" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Сальвадор" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" #. :SYR:760: #: zypp/CountryCode.cc:367 #, fuzzy msgid "Swaziland" msgstr "Тайланд" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Тайланд" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Таджыкістан" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" #. :TKL:772: #: zypp/CountryCode.cc:375 #, fuzzy msgid "Turkmenistan" msgstr "Таджыкістан" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Туніс" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Турцыя" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Тайвань" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Украіна" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 #, fuzzy msgid "United States" msgstr "Аб'яднаныя Арабскія Эміраты" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Уругвай" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Узбексітан" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Венесуэла" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Йемен" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Паўдневая Афрыка" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Зімбабве" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 #, fuzzy msgid "Unknown language: " msgstr "Невядомая каманда: %1" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 #, fuzzy msgid "Albanian" msgstr "Албанія" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "Паўдневая Афрыка" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 #, fuzzy msgid "Apache Languages" msgstr "&Мова" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 #, fuzzy msgid "Australian Languages" msgstr "Аўстралія" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 #, fuzzy msgid "Belarusian" msgstr "Беларусь" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "" #. language code: btk #: zypp/LanguageCode.cc:287 #, fuzzy msgid "Batak (Indonesia)" msgstr "Інданэзія" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 #, fuzzy msgid "Bulgarian" msgstr "Балгарыя" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 #, fuzzy msgid "Catalan" msgstr "Каталонія" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "&Мова" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 #, fuzzy msgid "Danish" msgstr "Завяршыць" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "" #. language code: est et #: zypp/LanguageCode.cc:423 #, fuzzy msgid "Estonian" msgstr "Эстонія" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 #, fuzzy msgid "Faroese" msgstr "Фарэрскія астравы" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "" #. language code: fil #: zypp/LanguageCode.cc:437 #, fuzzy msgid "Filipino" msgstr "Філіпіны" #. language code: fin fi #: zypp/LanguageCode.cc:439 #, fuzzy msgid "Finnish" msgstr "Завяршыць" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 #, fuzzy msgid "Georgian" msgstr "Грузія" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 #, fuzzy msgid "German" msgstr "Германія" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 #, fuzzy msgid "Hungarian" msgstr "Венгрыя" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 #, fuzzy msgid "Icelandic" msgstr "Ісландыя" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "Літва" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 #, fuzzy msgid "Indonesian" msgstr "Інданэзія" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 #, fuzzy msgid "Italian" msgstr "Італія" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 #, fuzzy msgid "Japanese" msgstr "Японія" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 #, fuzzy msgid "Kannada" msgstr "Канада" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 #, fuzzy msgid "Lao" msgstr "Ліван" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "" #. language code: lav lv #: zypp/LanguageCode.cc:665 #, fuzzy msgid "Latvian" msgstr "Латвія" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "Люксембург" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 #, fuzzy msgid "Lithuanian" msgstr "Літва" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "Люксембург" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 #, fuzzy msgid "Macedonian" msgstr "Македонія" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 #, fuzzy msgid "Malayalam" msgstr "Малайзія" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "Малайзія" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "Малайзія" #. language code: mlt mt #: zypp/LanguageCode.cc:745 #, fuzzy msgid "Maltese" msgstr "Мальта" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "&Мова" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "Югаславія" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "" #. language code: mun #: zypp/LanguageCode.cc:763 #, fuzzy msgid "Munda languages" msgstr "Захаванне мовы..." #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "&Мова" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "Германія" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 #, fuzzy msgid "Norwegian" msgstr "Нарвегія" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "" #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "&Мова" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "&Мова" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "" #. language code: phi #: zypp/LanguageCode.cc:865 #, fuzzy msgid "Philippine (Other)" msgstr "Філіпіны" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 #, fuzzy msgid "Portuguese" msgstr "Партугалія" #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "&Мова" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "Японія" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "Румынія" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 #, fuzzy msgid "Romanian" msgstr "Румынія" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "" #. language code: rus ru #: zypp/LanguageCode.cc:903 #, fuzzy msgid "Russian" msgstr "Расія" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "Захаванне мовы..." #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 #, fuzzy msgid "Croatian" msgstr "Харватыя" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "&Мова" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Захаванне мовы..." #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 #, fuzzy msgid "Slovak" msgstr "Славакія" #. language code: slv sl #: zypp/LanguageCode.cc:959 #, fuzzy msgid "Slovenian" msgstr "Славенія" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 #, fuzzy msgid "Lule Sami" msgstr "Імя модуля" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 #, fuzzy msgid "Swedish" msgstr "Швецыя" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "" #. language code: tai #: zypp/LanguageCode.cc:1015 #, fuzzy msgid "Tai (Other)" msgstr "Іншае" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "" #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "Катар" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 #, fuzzy msgid "Tajik" msgstr "Таджыкістан" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 #, fuzzy msgid "Thai" msgstr "Тайланд" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 #, fuzzy msgid "Tswana" msgstr "Батсвана" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "Турцыя" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "&Мова" #. language code: tur tr #: zypp/LanguageCode.cc:1071 #, fuzzy msgid "Turkish" msgstr "Турцыя" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 #, fuzzy msgid "Ukrainian" msgstr "Украіна" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 #, fuzzy msgid "Uzbek" msgstr "Узбексітан" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" #. language code: vie vi #: zypp/LanguageCode.cc:1101 #, fuzzy msgid "Vietnamese" msgstr "Імя файла" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "" #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "Захаванне мовы..." #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "&Мова" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "невядомы" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Невядомая каманда: %1" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Памылковае значэнне для опцыі '%1': %2" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 #, fuzzy msgid "Unhandled repository type" msgstr "Дадаць уключаныя сховішчы" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, fuzzy, c-format, boost-format msgid "Adding repository '%s'" msgstr "Даданне ўключаных сховішчаў..." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Невядомая опцыя для каманды '%1': %2" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "Выдаленне непатрэбных сховішчаў..." #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Працягнуць?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr "" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Змяніць канфігурацыю IrDA" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, fuzzy, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Памылковае значэнне для опцыі '%1': %2" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, fuzzy, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Памылковае значэнне для опцыі '%1': %2" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Так" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Не" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Заўвага:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Папярэджванне:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Памылка:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "done" msgstr "Інданэзія" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "Памылка" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Папярэджванне" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "" #: zypp-tui/output/OutNormal.cc:421 #, fuzzy msgid "No help available for this prompt." msgstr "Даведка не даступна" #: zypp-tui/output/OutNormal.cc:438 #, fuzzy msgid "no help available for this option" msgstr "Даведка не даступна" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "да" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "не" #, fuzzy #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Выдаліць непатрэбныя сховішчы" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "Захаваць налады ўсталёўкі" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Захаваць налады ўсталёўкі" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "Праверыць інтэрнэт злучэнне" libzypp-17.36.5/po/bg.po000066400000000000000000004137171476576476200150010ustar00rootroot00000000000000# translation of zypp.bg.po to Bulgarian # translation of libzypp.bg.po to Bulgarian # 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. # Borislav Mitev , 2006. # msgid "" msgstr "" "Project-Id-Version: zypp.bg\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2017-10-23 11:43+0000\n" "Last-Translator: Dimitar Zahariev \n" "Language-Team: Bulgarian \n" "Language: bg\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: Weblate 2.13.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Неизвестна държава: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Без код" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Андора" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Обединени арабски емирства" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Афганистан" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Антигуа и Барбуда" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Ангила" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Албания" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Армения" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Холандски Антили" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Ангола" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Антарктика" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Аржентина" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Американска Самоа" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Австрия" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Австралия" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Аруба" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Алански Острови" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Азербайджан" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Барбадос" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Бангладеш" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Белгия" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Буркина Фасо" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "България" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Бахрейн" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Бурунди" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Бенин" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Бермуда" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Бруней" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Боливия" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Бразилия" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Бахами" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Бутан" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Остров Бувет" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Боцвана" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Беларус" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Белиз" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Канада" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Кокосови Острови" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Конго" # CF #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "Централноафриканска Република" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Швейцария" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Кот д'ивоар" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Острови Кук" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Чили" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Камерун" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Китай" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Колумбия" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Коста Рика" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Куба" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Капо Верде" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Коледни Острови" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Кипър" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Чешка република" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Германия" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Джибути" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Дания" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Доминика" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Доминиканска република" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Алжир" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Еквадор" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Естония" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Египет" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Западна Сахара" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Еритрея" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Испания" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Етиопия" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Финландия" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Фуджи" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендски Острови (Малвини)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Федерални Щати Микронезия" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Фароеви острови" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Франция" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Френска метрополия" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Габон" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Великобритания" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Гренада" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Грузия" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Френска Гвиана" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Гърнзи" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Гана" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Гибралтар" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Гренландия" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Гамбия" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Гвинея" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Гваделупа" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Екваториална Гвинея" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Гърция" # GS # fuzzy #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Южни Сандвичеви Острови" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Гватемала" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Гуам" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Гвинея-Бисау" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Гияна" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Хонг Конг" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Хърд и МакДоналд Острови" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Хондурас" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Хърватска" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Хаити" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Унгария" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Индонезия" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ирландия" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Израел" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Индия" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Английски територии в Индийския океан" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Ирак" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Ирак" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Исландия" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Италия" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Ямайка" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Йордания" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Япония" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Кения" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Киргизтан" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Камбоджа" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Кирибати" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Комори" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Свети Китс и Невис" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Северна Корея" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Южна Корея" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Кувейт" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Кайманови Острови" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Казахстан" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Лао Народна Демократична Република" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Ливан" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Санта Лучия" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Лихтенщайн" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Шри Ланка" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Либерия" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Лесото" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Литва" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Люксембург" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Латвия" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Либерия" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Мароко" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Монако" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Молдова" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Черна Гора" # SM #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "Сан Марино" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Мадагаскар" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Маршалови Острови" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Македония" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Мали" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Мианмар" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Монголия" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Макао" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Северни Марианови Острови" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Мартиник" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Мавритания" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Монсерат" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Малта" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Мавриций" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Мали" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Малави" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Мексико" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Малайзия" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Мозамбик" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Намибия" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Нова Каледония" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Нигер" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Норфолк Остров" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Нигерия" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Никарагуа" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Холандия" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Норвегия" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Непал" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Науру" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Нию" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Нова Зеландия" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Оман" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Панама" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Перу" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Френска Полинезия" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинея" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Филипини" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Пакистан" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Полша" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Свети Пиер и Микелон" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Питкаирн" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Пуерто Рико" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Палестински територии" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Португалия" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Палау" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Парагвай" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Катар" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Риюниън" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Румъния" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Сърбия" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Руска Федерация" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Руанда" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Саудитска Арабия" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Соломонови Острови" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Сейшели" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Судан" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Швеция" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Сингапур" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Света Елена" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Словения" # SJ # fuzzy #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Свалбард и Ян Майен Острови" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Словакия" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Сиера Леоне" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "Сан Марино" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Сенегал" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Сомалия" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Суринам" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принсипи" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Ел Салвадор" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Суринам" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Свазиленд" # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Тюрк и Кайкос Острови" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Чад" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Франция Южни Територии" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Того" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Тайланд" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Таджикистан" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Токелау" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Туркменистан" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Тунис" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Тонга" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Източен Тимор" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Турция" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Тувалу" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Тайван" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Танзания" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Украйна" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Уганда" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Малки Острови по крайбрежието на САЩ" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "САЩ" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Уругвай" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Узбекистан" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Ватикана" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Свети Винсент и Гренадин" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Венецуела" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Вирджински Острови (Великобритания)" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Вирджински Острови (САЩ)" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Виетнам" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Вануату" # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Уолис и Футуна Острови" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Самоа" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Йемен" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Майот" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Южна Африка" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Замбия" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Зимбабве" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Доставя" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Изисква" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "В конфликт с" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s прави ненужно: %s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Препоръчва" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Предлага" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Подобрява" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Допълва" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Неизвестен език: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Африкански" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Абхазки" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Ачински" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Аколи" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Адангме" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Адиге" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Афро-азиатски (друг)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Африхили" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Африкаанс" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Аину" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Акан" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Акадски" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Албански" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Алют" #. language code: alg #: zypp/LanguageCode.cc:191 #, fuzzy msgid "Algonquian Languages" msgstr "Алгонквиански езици" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Южно-алтайски" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Амхарик" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Английски, стар (ок. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 #, fuzzy msgid "Apache Languages" msgstr "Апачи езици" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Арабски" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Арамайски" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Арагонски" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Арменски" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Араукански" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Арапахо" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Изкуствен (друг)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Аравак" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Асамески" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Астурийски" #. language code: ath #: zypp/LanguageCode.cc:223 #, fuzzy msgid "Athapascan Languages" msgstr "Атапаскан езици" #. language code: aus #: zypp/LanguageCode.cc:225 #, fuzzy msgid "Australian Languages" msgstr "Австралийски езици" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Аварски" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Авестански" # SZ #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Авадхи" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Аймара" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Азербайджански" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Банда" #. language code: bai #: zypp/LanguageCode.cc:239 #, fuzzy msgid "Bamileke Languages" msgstr "Бамилеке езици" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Башкирски" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Балучи" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Бамбара" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Балинески" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Баски" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Баса" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Балтийски (друг)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Бея" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Беларуски" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Бебма" # SN #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Бенгалски" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Бербер (друг)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Бходжури" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Бихари" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Бикол" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Бини" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Бислама" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Сиксика" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Банту (друг)" # BJ #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Босненски" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Брая" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Бретон" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Батак (Индонезия)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Бурият" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Бугинески" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Български" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Бурмийски" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Блин" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Каддо" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Централно-американски индиански (друг)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Карибски" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Каталунски" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Кауказийски (друг)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Кебуано" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Келтски (друг)" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Коморийски" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Чибча" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Чеченски" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Чагатай" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Китайски" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Чуукски" # ML #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Мари" #. language code: chn #: zypp/LanguageCode.cc:331 #, fuzzy msgid "Chinook Jargon" msgstr "Чинук жаргон" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Чоктау" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Чипеуан" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Чероки" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Църковно-славянски" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Чуваш" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Кайенски" #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "Чамик езици" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Коптик" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Корнски" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Корсикански" #. language code: cpe #: zypp/LanguageCode.cc:353 #, fuzzy msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Креолски и пидгински, базиран на английски (друг)" #. language code: cpf #: zypp/LanguageCode.cc:355 #, fuzzy msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Креолски и пидгински, базиран на френски (друг)" #. language code: cpp #: zypp/LanguageCode.cc:357 #, fuzzy msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Креолски и пидгински, базиран на португалски (друг)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Крее" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Кримин татарски" #. language code: crp #: zypp/LanguageCode.cc:363 #, fuzzy msgid "Creoles and Pidgins (Other)" msgstr "Креолски и пидгински (друг)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Кашубски" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Кушитик (друг)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Чешка" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Дакота" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Датска" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Доргава" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Даяк" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Делауеър" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Славе (Атапаскан)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Догриб" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Динка" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Дивехи" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Догри" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Дравидски (друг)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Долно-сорбийски" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "ДуалаДу" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Холандски, среден (ок. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Холандска" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Дюла" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Дзонга" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Ефик" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Египетски (древен)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Екаджук" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Еламите" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Английски" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Английски, среден (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Есперанто" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Естонска" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Еве" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Евондо" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Фанг" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Фаероски" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Фанти" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Фуджиянски" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Филипино" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Финландска" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Фино-угрийски (друг)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Фон" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Френска" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Френски, среден (ок. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Френски, стар (842-ок. 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Фризийски" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Фула" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Флюлийски" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Га" # GA #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Гайо" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Гбая" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Германски (друг)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Грузински" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Германска" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Гииз" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Гилбертезки" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Гаелски" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Ирландски" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Галицийски" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Манкс" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Немски, късно среден (ок. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Немски, късно стар (ок. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Гонди" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Горонтало" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Готски" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Гребо" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Гръцки, древен (до 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Гръцки, модерен (след 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Гуарани" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Гуджарити" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Гвич'ин" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Хайда" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Хаитски" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Хауза" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Хавайски" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Еврейски" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Хереро" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Хилигонски" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Химачали" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Хинди" # HT #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Хитите" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Хмонг" # HT #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Хири Моту" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Горно-сорбийски" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Унгарска" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Хупа" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Ибан" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Игбо" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Исландска" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Идо" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Сичуан юи" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ижо" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Инуктитут" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Интерезичен" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Илоко" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Интерлингва (Международна Асоциация за Помощен Език)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Индски (друг)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Индонезийски" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Индо-европейски (друг)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ингуш" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Инупиаг" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Ирански (друг)" #. language code: iro #: zypp/LanguageCode.cc:575 #, fuzzy msgid "Iroquoian Languages" msgstr "Ирокуонски езици" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Италианска" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Явайски" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Лоджбан" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Японска" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Юдейо-персийски" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Юдейо-арабски" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Кара-калпака-кал" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Кабил" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Качин" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Калаалисут" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Камба" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Канада" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Карен" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Кашмирски" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Канури" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Кави" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Казакски" # MR #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Кабардийски" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Каси" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Койсан (друг)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Хмерски" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Котанески" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Кикую" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Кинярванда" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Киргизки" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Кимбунду" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Конкани" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Коми" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Конго" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Корейски" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Косраейски" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Кпеле" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Карачай-балкар" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Крю" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Курук" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Куаняма" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Кумикумик" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Кюрдски" # KE #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Кутенай" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ладино" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Ланда" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Ламба" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Лао" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Латински" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Латвийски" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Лезганийски" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Лимбурган" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Лингала" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Литовска" # CG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Монго" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Лози" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Люксембургски" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Луба-лулуя" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Луба-катанга" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ганда" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Луисено" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Лунда" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Луо (Кения и Танзания)" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "Лушай" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Македонски" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Мадурейски" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Магахи" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Маршалски" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Майтили" # MG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Макасар" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Малаялам" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Мандинго" # ML #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Маори" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Австронезийски (друг)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Марати" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Масаи" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Малайски" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Мокша" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Мандар" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Менде" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Ирландски, среден (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Ми'кмак" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Минанкубау" #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "Разни езици" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Мон-кхмер (друг)" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Малагаси" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Малтийски" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Манчу" # ML #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Манпури" #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "Манобо езици" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Мохаук" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Молдовски" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Монголски" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Моси" #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "Множество езици" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Мунда езици" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Креек" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Мирандейски" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Марвари" #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "Майски езици" # SY # fuzzy #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Ерзя" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Нахуати" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Северна-американски индиански" # NP #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Неаполитански" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Навахо" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ндебеле, южен" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ндебеле, северерен" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ндонга" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Долно-германски" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Непалски" # NP #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Непал баса" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Ниас" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Нигер-гордофански (друг)" # NU #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Нюеан" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Норвежки нинорск" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Норвежки бокмал" # TO #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Ногай" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Норсе, стар" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Норвежка" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Северно сото" #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "Нубийски езици" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Класически невари" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Чичева" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Нямвези" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Нянколе" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Ньоро" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Нзима" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Окцитан (след 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ожибва" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Ория" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Оромо" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Осаге" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Осетински" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Турски, отомански (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "Османски езици" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Папуански (друг)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Пангасински" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Пахлави" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Пампанга" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Панджаби" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Папияменто" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Палауан" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Персийски, стар (ок. 600-400 пр.н.е.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Персийски" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Филипински (друг)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Финикийски" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Пали" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Полска" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Понпейски" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Португалска" #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "Пракрит езици" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Провенциален, стар (до 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Пущо" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Куечуа" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Раджастани" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Папануй" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Раротоган" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Романски (друг)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Раето-романс" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Романи" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Румънски" # RE #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Рунди" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Руска" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Сандауе" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Санго" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Якут" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Южно-американски индиански (друг)" #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "Салишан езици" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Самаритан арамаик" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Санскрит" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Сасак" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Сантали" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Сръбски" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Сицилиански" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Скотски" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Хърватска" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Селкуп" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Семитски (друг)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Ирландски, стар (до 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Знакови езици" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Шан" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Сидамо" # AO #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Синхала" #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Сиуан езици" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Сино-тибетски (друг)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Славянски (друг)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Словашка" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Словенски" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Южно сами" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Северно сами" #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "Сами езици (друг)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Люле сами" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Инари сами" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Самоански" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Сколт сами" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Шона" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Синди" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Синонке" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Согдийски" # SO #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Сомалийски" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Сонгхай" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Сото, южно" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Испанска" # MR #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Сардински" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Серер" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Нило-сахарски (друг)" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Свати" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Сукума" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Сундански" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Сусу" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Шумерски" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Свахили" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Шведска" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Сирийски" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Таитски" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Тай (друг)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Тамилски" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Татарски" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Телугу" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Тимне" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Терено" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Тетум" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Таджикски" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Тагалог" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Тайландски" # TW # fuzzy #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Тибетски" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Тигре" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Тигриния" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Тив" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Клингон" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Тлингит" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Тамашек" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Тонга (Няса)" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Тонга (Острови Тонга)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Ток писин" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Цимашински" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Цвана" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Цонга" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Туркменски" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Тумбука" #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "Тупи езици" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Турска" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Алтайски (друг)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Тви" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Тувински" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Удмурт" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Угаритски" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Уигурски" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Украинска" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Умбурду" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Неопределен" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Урду" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Узбекски" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Вай" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Венда" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Виетнамски" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Волапук" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Вотски" #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "Вакашан езици" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Валамо" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Варай" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Вашо" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Уелски" #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "Сорбийски езици" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Валун" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Волоф" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Калмик" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Ксоса" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Яо" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Япесе" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Юдийски" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Йоруба" #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "Юпик езици" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Запотек" # SN #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Зенага" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Цуанг" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Занде" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Зулу" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Зуни" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "неизвестно" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Неизвестен потребител: %s\n" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "невалидно име на услуга '%1'." #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Не може да се създаде %s: %m\n" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Достъпът до носителя за обновяване на драйверите е неуспешен." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "невалидно име на услуга '%1'." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Файлът не може да бъде отворен за запис." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Грешка при четенето от дискетата." #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Неуспешно зареждане на модула \"%s\"." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "%s не може да бъде инсталиран" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 #, fuzzy msgid "Continue?" msgstr "Продължаване" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" # %s is either BOOTP or DHCP #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "Настройването чрез %s бе неуспешно." #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Никой не доставя %s" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "Възникнала е грешка при създаването на временния файл %s: %m" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "Пренебрегване на това изискване само тук" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "Пренебрегване на това изискване само тук" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "%s не може да бъде инсталиран поради пробем със зависимостите" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "Никой не доставя %s" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "Няма инсталируеми доставчици на %s" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "Няма инсталируеми доставчици на %s" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" # %s is either BOOTP or DHCP #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "Настройването чрез %s бе неуспешно." #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "пропадна." #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Променени файлове с настройки за %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm запази %s като %s, но е невъзможно да се открие разликата" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm запази %s като %s.\n" "Ето първите 25 реда от разликите:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm създаде %s като %s, но е невъзможно да се открие разликата" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm създаде %s като %s.\n" "Ето първите 25 реда от разликите:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "Допълнителен изход от rpm:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "създадено резервно копие %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "KScreensaver не е открит." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "KScreensaver не е открит." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "KScreensaver не е открит." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "Пакетът не е подписан" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Неуспешно зареждане на модула \"%s\"." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Неуспешно зареждане на модула \"%s\"." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "KScreensaver не е открит." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Съмнителен тип '%s' за %u, код за проверка '%s'" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Възникнала е грешка при отварянето на %s: %m" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Възникнала е грешка при отварянето на %s: %m" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 #, fuzzy msgid "Invalid empty Url object reference" msgstr "Невалидно име за празно действие за услугата '%1'" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 #, fuzzy msgid "History:" msgstr "Преглед на историята" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, fuzzy, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "невалидно име на услуга '%1'." #: zypp-core/url/UrlBase.cc:247 #, fuzzy, c-format, boost-format msgid "Invalid %s component" msgstr "Невалидна информация" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, fuzzy, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "невалидно име на услуга '%1'." #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Команда за изпълнение при свързване" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Възникнала е грешка при отварянето на %s: %m" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Неуспешно зареждане на модула \"%s\"." #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Неуспешно зареждане на модула \"%s\"." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Временният файл (%s) не може да бъде създаден: %m" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "%s не може да бъде инсталиран" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Да" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Не" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Предупреждение" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Грешка" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "done" msgstr "Индонезия" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "Грешка" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Предупреждение" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Стартиране..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "не работи" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "да" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "не" #, fuzzy #~ msgid "Package is not signed!" #~ msgstr "Пакетът има невалидна сигнатура." #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s доставя %s, но има друга архитектура." #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "Никой не доставя %s" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Пакетът не е подписан" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s е заключен и не може да бъде деинсталиран." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "Инсталирането на %s бе неуспешно" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s е необходим на %s" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "%s не може да бъде инсталиран" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s е в конфликт с %s" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s прави ненужно %s" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s прави ненужно %s" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s е в конфликт с %s" #~ msgid "do not install %s" #~ msgstr "без инсталиране на %s" #~ msgid "keep %s" #~ msgstr "запазване на %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "без инсталиране на %s" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "Няма инсталируеми доставчици на %s" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "Без инсталиране или премахване на конфликтните пакети" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s доставя %s, но има друга архитектура." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "Инсталиране на %s, въпреки че ще промени архитектурата" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s прави ненужно %s" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "Обновяване на %s към %s" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Инсталиране" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Възникнала е грешка при отварянето на %s: %m" #, fuzzy #~ msgid "Hal Exception" #~ msgstr "Криптиране" #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "не е свързан" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "връзка канал-към-канал" #, fuzzy #~ msgid "Not a CDROM drive" #~ msgstr "Не са открити CD-ROM устройства." #, fuzzy #~ msgid "Can't acquire the mutex lock" #~ msgstr "Не може да се придобие заключването на zypp." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "без инсталиране на %s" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Неуспешно зареждане на модула \"%s\"." #~ msgid "Serbia and Montenegro" #~ msgstr "Сърбия и Черна Гора" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Непознат монитор:" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "" #~ "%s не може да бъде инсталиран за задоволяване на зависимостите на %s" #~ msgid "%s remove failed" #~ msgstr "Премахването на %s бе неуспешно" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "Невалидно име на устройство." #~ msgid "rpm output:" #~ msgstr "Изход от rpm:" #~ msgid "%s install failed" #~ msgstr "Инсталирането на %s бе неуспешно" #~ msgid "%s installed ok" #~ msgstr "Инсталирането на %s бе успешно" #~ msgid "%s remove ok" #~ msgstr "Премахването на %s бе успешно" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "" #~ "%s задоволява тази зависимост, но ще промени архитектурата на " #~ "инсталирания пакет" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "" #~ "%s задоволява тази зависимост, но ще промени архитектурата на " #~ "инсталирания пакет" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Без инсталиране или премахване на конфликтните пакети" #~ msgid "Ignore that %s is already set to install" #~ msgstr "Пренебрегване на това, че %s е зададен вече за инсталиране" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "Пренебрегване на остарелите %s в %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "Пренебрегване на конфликта на %s" #~ msgid "Ignore this requirement just here" #~ msgstr "Пренебрегване на това изискване само тук" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "Инсталиране на %s, въпреки че ще промени архитектурата" #~ msgid "Install missing resolvables" #~ msgstr "Инсталиране на липсващите пакети" #~ msgid "Keep resolvables" #~ msgstr "Запазване на пакетите" #~ msgid "Unlock these resolvables" #~ msgstr "Отключване на тези пакети" #~ msgid "delete %s" #~ msgstr "изтриване на %s" #~ msgid "install %s" #~ msgstr "инсталиране на %s" #~ msgid "unlock %s" #~ msgstr "отключване на %s" #~ msgid "unlock all resolvables" #~ msgstr "отключване на всички пакети" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Възникнала е грешка при отварянето на %s: %m" #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "Грешка при четенето на сектор %u." #, fuzzy #~ msgid "Software management is already running." #~ msgstr "Услугите за PCMCIA карти вече работят." #~ msgid "%s is replaced by %s" #~ msgstr "%s е заменен от %s" #~ msgid "%s replaced by %s" #~ msgstr "%s е заменен от %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "Тези пакети ще бъдат изтрити от системата." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s няма да бъде деинсталиран, защото все още е необходим" #~ msgid "Invalid information" #~ msgstr "Невалидна информация" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s е необходим на друг пакет" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s е необходим на:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s е в конфликт с други пакети" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s е в конфликт с:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s прави ненужни други пакети" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "Тези пакети ще бъдат изтрити от системата." #~ msgid "%s depends on other resolvables" #~ msgstr "%s зависи от други пакети" #~ msgid "%s depends on %s" #~ msgstr "%s зависи от %s" #~ msgid "%s depends on:%s" #~ msgstr "%s зависи от: %s" #~ msgid "Child of" #~ msgstr "Дете на" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "Няма наличен ресурс за поддръжката на това изискване." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "Поради проблемите, които са показани по-долу/горе сега няма да могат да " #~ "сеудовлетворят всички зависимости." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%s не може да бъде инсталиран, защото е в конфликт с %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s не е инсталиран и не може да бъде маркиран за деинсталиране." #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s има незадоволени изискания" #~ msgid "%s has missing dependencies" #~ msgstr "%s има липсващи зависимости" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s не може да бъде инсталиран поради липсващи зависимости" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s задоволява зависимостите на %s, но ще бъде деинсталиран" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s задоволява зависимостите на %s, но ще бъде деинсталиран" #~ msgid "No need to install %s" #~ msgstr "Няма нужда от инсталиране на %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "" #~ "%s не може да бъде инсталиран за задоволяване на зависимостите на %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "" #~ "%s не може да бъде инсталиран за задоволяване на зависимостите на %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s няма да бъде деинсталиран, защото все още е необходим" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "" #~ "%s прави ненужен %s, но %s не може да бъде изтрит, защото е заключен." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "%s не може да бъде инсталиран, защото е в конфликт" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s е недеинсталируем поради конфликта с %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "за изисканото %s за %s, когато се обновява %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s липсва изискания %s" #~ msgid ", Action: " #~ msgstr ", Действие:" #~ msgid ", Trigger: " #~ msgstr ", задействане при:" #~ msgid "package" #~ msgstr "пакет" #~ msgid "selection" #~ msgstr "подбор" #~ msgid "pattern" #~ msgstr "шаблон" #~ msgid "product" #~ msgstr "продукт" #~ msgid "patch" #~ msgstr "кръпка" #~ msgid "script" #~ msgstr "скрипт" #~ msgid "message" #~ msgstr "съобщение" #~ msgid "atom" #~ msgstr "атом" #~ msgid "system" #~ msgstr "система" #~ msgid "Resolvable" #~ msgstr "Пакет" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "Маркиране на този опит за разрешаване като невалиден." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "Маркиране на пакета %s като деинсталируем" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s е подготвен за инсталиране, но това не е възможно заради проблеми със " #~ "зависимости." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "Не може да се инсталира %s след като вече е маркиран за деинсталиране" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "" #~ "%s не може да се инсталира след като вече не е приложим за тази система." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "Не може да се инсталира %s след като %s вече е маркиран за инсталиране" #~ msgid "This would invalidate %s." #~ msgstr "Това ще направи невалиден %s." #~ msgid "Establishing %s" #~ msgstr "Откриване на %s" #~ msgid "Installing %s" #~ msgstr "Инсталиране на %s" #~ msgid "Skipping %s: already installed" #~ msgstr "Пропускане на %s: вече е инсталиран" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "Няма инсталирани алтернативни доставчици на %s" #~ msgid "for %s" #~ msgstr "за %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "" #~ "Не е възможно обновяването към %s за да се избегне премахването на %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s доставя %s, но е планирано за деинсталиране." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s доставя %s, но друга версия на %s вече е инсталирана." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s доставя %s, но е деинсталируем. Опитайте да го инсталирате ръчно за " #~ "повече подробности." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s доставя %s, но е заключен." #, fuzzy #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s доставя %s, но е планирано за деинсталиране." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s доставя %s, но има друга архитектура." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "Не могат да се удовлетворят изискванията на %s за %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "%s се изисква от друг инсталиран пакет и няма да бъде премахнат." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "%s се изисква от друг инсталиран пакет и няма да бъде премахнат." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "" #~ "Конфликтът с %s (%s) изисква премахването на %s, което е било подготвено " #~ "за инсталиране" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "Маркиране на %s като деинсталируем поради конфликта с %s" #~ msgid "from %s" #~ msgstr "от %s" #~ msgid " Error!" #~ msgstr " Грешка!" #~ msgid " Important!" #~ msgstr " Важно!" #~ msgid "%s depended on %s" #~ msgstr "%s зависи от %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s е необходим на %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s е необходим на %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s е заменен от %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s е необходим на %s" #~ msgid "%s part of %s" #~ msgstr "%s е част от %s" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s е необходим на %s" #~ msgid "Ignore this requirement generally" #~ msgstr "Пренебрегване на това изискване" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s се изисква от друг, маркиран за инсталиране пакет и няма да бъде " #~ "премахнат." #~ msgid "%s dependend on %s" #~ msgstr "от %s зависи %s" #, fuzzy #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "" #~ "Проверката на контролната сума за подписания repomd.xml файл бе неушпешна" #, fuzzy #~ msgid "Reading selection from %s" #~ msgstr "Грешка при четенето на сектор %u." # progress indicator label #, fuzzy #~ msgid "Reading translation: %s" #~ msgstr "Зареждане на инсталационната система" #~ msgid " miss checksum." #~ msgstr "липсва контролната сума." #~ msgid " fails checksum verification." #~ msgstr "неуспешно удостоверяване на контролната сума." #, fuzzy #~ msgid "Downloading %s" #~ msgstr "Грешка при зареждането на %1" #~ msgid "%s needed by %s" #~ msgstr "%s е необходим на %s" #~ msgid "Cannot acquire zypp lock." #~ msgstr "Не може да се придобие заключването на zypp." #~ msgid "Can't write the patch script to a temporary file." #~ msgstr "Не може да се скрипта на кръпката във временен файл." #~ msgid "Target commit aborted by user." #~ msgstr "Целевото извършване бе прекъснато от потребителя." #~ msgid "Failed check for the script file check sum" #~ msgstr "Проверката на контролната сума за скрипта бе неуспешна" #~ msgid "Ok" #~ msgstr "Добре" #~ msgid "The package is not OK for the following reasons:" #~ msgstr "Пакетът не е наред поради следните причини:" #~ msgid "The package contains different version than expected" #~ msgstr "Пакетът съдържа различна от очакваната версия" #~ msgid "The package file has incorrect MD5 sum" #~ msgstr "Файлът на пакета има некоректна MD5 сума" #~ msgid "The package has no MD5 sum" #~ msgstr "Пакетът няма MD5 сума" #~ msgid "The package archive has incorrect MD5 sum" #~ msgstr "Архивът с пакетите има некоректна MD5 сума" #~ msgid "rpm failed for unkown reason, see log file" #~ msgstr "" #~ "rpm завърши с неуспех поради неизвестна причина, прегледайте файла-дневник" #~ msgid "Default" #~ msgstr "Стандартно" #, fuzzy #~ msgid "ignore architecture" #~ msgstr "Архитектура" #, fuzzy #~ msgid "Ignore this requirement for all other resolvables." #~ msgstr "%s е необходим на друг пакет" #~ msgid "Deleting %s" #~ msgstr "Изтриване на %s" #~ msgid "" #~ "Can't install %s, since a resolvable of the same name is already marked " #~ "as needing to be installed" #~ msgstr "" #~ "%s не може да се инсталира, след като пакет със същото име вече е " #~ "маркиран за инсталиране" #~ msgid "%s cannot be uninstalled due missing dependencies" #~ msgstr "%s не може да бъде деинсталиран поради липсващи зависимости" libzypp-17.36.5/po/bn.po000066400000000000000000004527661476576476200150170ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2005-07-29 15:37+0530\n" "Last-Translator: Priyavert Sharma\n" "Language-Team: AgreeYa Solutions \n" "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" "\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "অজানা দেশ: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "কোড" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "বিক্রেতা" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "সংযুক্ত আরব আমিরাত" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "পাকিস্তান" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "এন্টিগা ও বারবুডা" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "এংগুইলা" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "আলবেনিয়া" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "আর্জেন্টিনা" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "নেদারল্যান্ড" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "এংগোলা" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "এন্টার্কটিকা" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "আর্জেন্টিনা" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "আমেরিকান সামোয়া" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "অস্ট্রিয়া" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "অস্ট্রেলিয়া" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "আরুবা" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "ফারো দ্বীপপূঞ্জ" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "আজারবাইজান" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "বসনিয়া এবং হারজেগোভিনা" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "বার্বাডোজ" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "বাংলাদেশ" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "বেলজিয়াম" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "বারকিনা ফাসো" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "বুলগেরিয়া" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "বাহরাইন" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "বুরুন্ডি" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "বাহরাইন" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "জার্মান" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "ব্রুনেই দারুসসালাম" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "বলিভিয়া" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "ব্রাজিল" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "পানামা" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "ভুটান" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "ফারো দ্বীপপূঞ্জ" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "বোটসোয়ানা" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "বেলারুস" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "বেলজিয়ান" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "কানাডা" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "কোকোস (কিলিং) দ্বীপপুঞ্জ" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "কনসোল" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "সিরিয়ান আরব প্রজাতন্ত্র" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "সুইজারল্যান্ড" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "কোট ডি'ইভোয়ার" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "ফারো দ্বীপপূঞ্জ" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "চিলি" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "ক্যামেরা" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "চিলি" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "কলম্বিয়া" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "কোস্টারিকা" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "কিউবা" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "কেপ ভার্দে" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "ক্রিসমাষ আইল্যান্ড" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "সাইপ্রাস" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "চেক প্রজাতন্ত্র" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "জার্মানি" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "জিবৌটি" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "ডেনমার্ক" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "রোমানিয়া" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "ডোমেনিকান প্রজাতন্ত্র" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "আলজেরিয়া" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "ইকুয়েডর" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "এস্টোনিয়া" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "মিশর" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "পশ্চিমী সাহারা" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "ইরিট্রিয়া" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "স্পেন" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "এস্টোনিয়া" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "ফিনল্যান্ড" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "ফিজি" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "ফকল্যান্ড আইল্যান্ডস (মালভিনাস)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "ফেডারেটেড স্টেটস অফ মাইক্রোনেশিয়া" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "ফারো দ্বীপপূঞ্জ" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "ফ্রান্স" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "মেট্রোপলিটান ফ্রান্স" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "নিষিদ্ধ" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "যুক্তরাজ্য" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "গ্রীনল্যান্ড" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "জর্জিয়া" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "ফ্রেঞ্চ (কানাডীয়)" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "জার্মানি" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "ঘানা" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "জিব্রাল্টার" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "গ্রীনল্যান্ড" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "&সাম্বা" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "গিনি" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "গুয়াদেলুপ" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "ইকোয়েটেরিয়াল গিনি" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "গ্রীস" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "সাউথ জর্জিয়া ও সাউথ স্যান্ডউইচ আইল্যান্ড" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "গুয়াতেমালা" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "গুয়াতেমালা" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "গিনি-বিসাউ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "গায়ানা" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "হংকং" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "হার্ড আইল্যান্ড ও ম্যাকডোনাল্ড আইল্যান্ডস" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "হন্ডুরাস" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "ক্রোয়েশিয়া" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "হাইতি" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "হাঙ্গেরী" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "ইন্দোনেশিয়া" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "আয়্যারল্যান্ড" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "ইসরাইল" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "ভারত" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "ব্রিটিশ ইন্ডিয়ান ওসান টেরিটরি" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "ইরাক" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "ইরাক" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "আইসল্যান্ড" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "ইটালী" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "জামাইকা" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "জর্ডান" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "জাপান" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "কীবোর্ড" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "কিরগিজস্তান" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "কলম্বিয়া" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "কিরিবাটি" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "কমোরোস" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "সেন্ট কিটস ও নেভিস" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "উত্তর কোরিয়া" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "দক্ষিন আফ্রিকা" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "কুয়েত" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "ফারো দ্বীপপূঞ্জ" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "পাকিস্তান" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "লাও পিপলস ডেমোক্রেটিক রিপাব্লিক" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "লেবানন" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "সষেন্ট লুসিয়া" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "লাইসেন্স" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "শ্রীলঙ্কা" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "লাইবেরিয়া" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "লেসোথো" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "লিথুয়েনিয়া" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "লাক্সেমবার্গ" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "লাতভিয়া" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "লিবিয়া" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "মরোক্কো" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "মরোক্কো" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "স্লোভাক" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "মনিটর" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "সাম মারিনো" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "মাদাগাস্কার" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "ফারো দ্বীপপূঞ্জ" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "ম্যাসেডোনিয়া" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "মালয়শিয়া" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "পানামা" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "মঙ্গোলিয়া" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "প্রধান" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "নর্দার্ন মারিয়ানা আইল্যান্ডস" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "মার্টিনিক" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "লিথুয়েনিয়া" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "মন্টসেরাট" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "মালটা" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "মরিশাস" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "মালদ্বীপ" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "মালটা" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "মেক্সিকো" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "মালয়শিয়া" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "মোজাম্বিক" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "&সাম্বা" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "ম্যাসেডোনিয়া" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "ঘড়ি" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "ফারো দ্বীপপূঞ্জ" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "আলজেরিয়া" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "নিকারাগুয়া" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "নেদারল্যান্ড" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "নরওয়ে" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "নেপাল" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "নাউরু" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "নিউ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "নিউজিল্যান্ড" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "ওমান" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "পানামা" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "পেরু" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "ফ্রেঞ্চ (কানাডীয়)" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "পাপুয়া নিউ গিনি" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "ফিলিপাইন" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "পাকিস্তান" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "পোল্যান্ড" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "সেন্ট পিয়ের ও মিকেলন" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "পাকিস্তান" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "পোর্টোরিকো" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "প্যালেস্টিনিয়ান টেরিটরি" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "পর্তুগাল" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "প্যারাগুয়ে" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "প্যারাগুয়ে" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "কাতার" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "এলাকা (&R)" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "রোমানিয়া" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "খোঁজো" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "রাশিয়ান ফেডারেশন" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "কানাডা" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "সৌদী আরব" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "ফারো দ্বীপপূঞ্জ" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "সেশেলস" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "সুদান" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "সুইডেন" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "সিঙ্গাপুর" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "সেন্ট হেলেনা" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "স্লোভেনিয়া" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "সভালবার্ড ও জান মায়েন" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "স্লোভাকিয়া" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "সিয়েরা লিওন" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "সাম মারিনো" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "সেনেগাল" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "রোমানিয়া" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "সার্ভিসের নাম (&n)" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "সাও টোম ও প্রিন্সিপ" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "এল সালভাদর" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "সিরিয়া" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "থাইল্যান্ড" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "টার্কস ও কাইকোস আইল্যান্ড" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "পরিবর্তিত" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "ফ্রেঞ্চ সাউদার্ন টেরিটোরিজ" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "নিষিদ্ধ" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "থাইল্যান্ড" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "তাজিকিস্তান" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "টকেলাউ" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "তাজিকিস্তান" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "তিউনিশিয়া" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "মোট" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "ইষ্ট টিমর" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "তুর্কী" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ত্রিনিদাদ ও টোবাগো" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "টুভালু" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "তাইওয়ান" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "তানজানিয়া" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "ইউক্রেন" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "কানাডা" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "ইউনাইটেড স্টেটস মাইনর আউটলায়িং আইল্যান্ডস" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "সংযুক্ত আরব আমিরাত" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "উরুগুয়ে" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "উজবেকিস্থান" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "হোলি সি (ভ্যাটিকান সিটি স্টেট)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "সেন্ট ভিনসেন্ট ও গ্রেনাডাইন্স" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "ভেনিজুয়েলা" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "ব্রিটিশ ভার্জিন আইল্যান্ডস" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "ভার্জিন আইল্যান্ডস, ইউ এস" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "ফাইলের নাম" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "ভানুয়াতু" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "ওয়ালিস ও ফুটুনা" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "&সাম্বা" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "ইয়েমেন" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "মেয়ট" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "দক্ষিন আফ্রিকা" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "&সাম্বা" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "জিম্বাবুয়ে" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "প্রয়োজন হয় " #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s প্রাচীন করে দিয়েছে: %sকে" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "অজ্ঞাত ভাষা: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "আফার" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "আলবেনিয়া" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "ক্রিয়া (&c)" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "আকোলি" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "পরিসীমা" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "এডাইগ" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "আফ্রো-এশিয়াটিক (অন্যান্য)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "আফ্রিহিলি" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "আফ্রিকান্স" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "আইনু" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "আকান" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "আক্কাডিয়ান" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "আলবেনিয়া" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "আলিউট" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "প্রাথমিক ভাষা (&L)" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "দক্ষিন আফ্রিকা" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "আমহারিক" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "ইংরেজী, পুরাতন (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "ভাষাসমূহ" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "আরবী" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "আরামাইক" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "আরাগোনিজ" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "আর্জেন্টিনা" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "ইউক্রেনীয়" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "আরাপাহো" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "নকল (অন্যান্য)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "আরাওয়াক" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "একই" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "অস্ট্রিয়া" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "ইনস্টলকৃত ভাষা" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "আভারিক" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "আভেস্তান" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "অবধী" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "আয়মারা" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "আজারবাইজানি" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "কানাডা" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "ইনস্টলকৃত ভাষা" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "ব্রাজিল" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "বালুচি" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "ক্যামেরা" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "জাপানী" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "বাস্ক" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "ব্রাজিল" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "বালটিক (অন্যান্য)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "বেজা" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "বেলারুস" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "বেম্বা" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "বাংলা" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "বার্বার (অন্যান্য)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "ভোজপুরি" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "বাহরাইন" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "বিকোল" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "বিনি" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "বিসলামা" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "সিকসিকা" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "বানটু (অন্যান্য)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "বোটসোয়ানা" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "ব্রাজিল" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "বাহরাইন" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "ইন্দোনেশিয়া" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "বুলগেরিয়া" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "বুগিনিজ" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "বুলগেরিয়া" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "বাস মাউস " #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "বেলজিয়ান" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "কাড্ডো" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "মধ্য আমেরিকান ইন্ডিয়ান (অন্যান্য)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "ক্যারিব" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "ক্যাটালোনিয়া" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "ককেশীয় (অন্যান্য)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "লেবানন" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "সেল্টিক (অন্যান্য)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "চামোরো" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "চিবচা" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "ক্যাশ" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "চাগাতাই" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "চিলি" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "চুকেসে" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "প্রধান" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "চিনুক জার্গন" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "চোকটাও" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "চিপেওয়ান" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "চেরোকি" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "চার্চ স্লেভিক" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "চুভাশ" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "চেয়েন" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "কোস্টারিকা" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "ধারন করে" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "কোস্টারিকা" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "ক্রেওলস ও ইংরেজী, ইংরেজী-ভিত্তিক (অন্যান্য)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "ক্রেওলস ও পিজিনস ফরাসি-ভিত্তিক (অন্যান্য)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "ক্রেওলস ও পিজিনস পর্তুগিজ-ভিত্তিক (অন্যান্য)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "খালি" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "ক্রিমিয়ান তাতার" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "ক্রেওলস ও পিজিনস (অন্যান্য)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "কাশুবিয়ান" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "কাসিটিক (অন্যান্য)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "চেক" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "ডাকোটা" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "ড্যানিশ" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "ডারগোয়া" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "ডায়াক" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "হার্ডওয়্যার সনাক্ত করো" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "স্লেভ (আথাপাস্কান)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "ডোগরিব" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "ডিস্ক" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "ড্রাইভার" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "ডোগরি" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "দ্রাবিঢ়ীয় (অন্যান্য)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "লোয়ার সরবিয়ান" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "মালটা" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "ডাচ, মধ্য (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "ডাচ্" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ডিউলা" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "জোংখা" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "এফিক" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "ইজিপশিয়ান (প্রাচীন)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "একাজুক" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "এলামাইট" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "ইংরেজি (UK)" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "ইংরেজী, মধ্য (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "অভিজ্ঞ (&E)" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "এস্টোনীয়" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "ইউয়ি" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "এওন্ডো" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "পরিসীমা" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "খালি" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "ফান্টি" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "ফিনল্যান্ড" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "ফিলিপাইন" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "ফিনিশ" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "ফিনো-উগ্রিয়ান (অন্যান্য)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "ফন" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "ফ্রেঞ্চ" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "ফরাসি, মধ্য (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "ফরাসি, পুরাতন (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "শেষ করা হচ্ছে" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "সঙ্কেত" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "ফিনল্যান্ড" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "গা" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "গায়ো" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "গবায়া" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "জার্মান (deadkeys সহ)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "জর্জিয়া" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "জার্মান" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "গ্রীক" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "গিলবার্টিজ" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "গেলিক" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "তুর্কী" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "ইতালীয়" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "ম্যাংক্স" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "জার্মান, মধ্য উচ্চ (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "জার্মান, পুরাতন উচ্চ (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "শব্দ" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "গরোন্টালো" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "গথিক" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "গ্রুপ" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "গ্রীক, প্রাচীন (1453 অবধি)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "গ্রীক, আধুনিক (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "হাঙ্গেরীয়" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "গুজরাটি" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "গুইচ'ইন" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "হাইদা" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "পাকিস্তান" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "হাউসা" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "হাওয়াইয়ান" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "হিব্রু" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "সমস্যা" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "হিলগেনন" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "হিমাচলি" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "ধরন" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "হিটাইট" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "হমং" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "হিরি মটু" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "আপার সার্বিয়ান" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "হাঙ্গেরীয়" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "হুপা" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "ইবন" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "ইগবো" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "আইসল্যান্ডীয়" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ইদো" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "লিথুয়েনিয়া" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ইজো" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "ইনাখটিটাট" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "আভ্যন্তরীণ এলাকা" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "ইলোকো" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "ইন্টারলিঙ্গুয়া (ইন্টারন্যাশনাল অকজিলিয়ারি ল্যাংগুয়েজ অ্যাসোশিয়েশন)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "ইন্ডিক (অন্যান্য)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "ইন্দোনেশিয়া" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "ইন্দো-ইউরোপিয়ান (অন্যান্য)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "ইঙ্গুশ" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "ভারত" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "ইরানি (অন্যান্য)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "প্রাথমিক ভাষা (&L)" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "ইতালীয়" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "জাপানী" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "লেবানন" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "জাপানী" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "জুডেও-পার্সিয়ান" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "জুডেও-আরবী" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "কারা-কালপাক" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "সক্রিয় হয়েছে" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "খোঁজো" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "কলাল্লিসুট" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "&সাম্বা" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "কানাডা" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "বাহরাইন" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "কাশ্মীরি" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "কানুরি" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "কুয়েত" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "কাজাখ" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "কাবারডিয়ান" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "খাসি" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "খয়সান (অন্যান্য)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "ঘড়ি" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "খোটানিজ" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "কিকুয়ু" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "কিনয়ারোয়ান্ডা" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "কিরগিজ" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "ধরন" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "কোঙ্কনী" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "কোমি" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "কঙ্গো" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "জর্ডান" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "কোসরিয়ান" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "একই রাখো" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "কারাচে-বালকার" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "ক্রু" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "তুর্কী" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "পানামা" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "নকল" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "তুর্কী" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "কুয়েত" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "লোড করা হচ্ছে..." #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "কানাডা" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "&সাম্বা" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "লগ" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "লাতভিয়া" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "লাতভিয়া" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "বেলজিয়ান" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "লাক্সেমবার্গ" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "লিঙ্গালা" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "লিথুয়েনিয়ান" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "মনিটর" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "লোজি" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "লাক্সেমবার্গ" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "লুবা-লুলুয়া" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "লুবা-কাটাঙ্গা" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "কানাডা" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "লুইসেনো" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "শব্দ" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "লুও (কেনিয়া ও তানজানিয়া)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "থাইল্যান্ড" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "ম্যাসেডোনিয়া" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "মডিউলসমূহ" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "মাগাহি" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "মারশালিজ" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "মৈথিলি" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "মালয়শিয়া" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "মালয়শিয়া" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "সতর্কবাণী" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "প্রধান" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "অস্ট্রোনেশিয়ান (অন্যান্য)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "মারাঠি" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "মালয়শিয়া" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "মালটা" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "মোক্ষ" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "কানাডা" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "মোড" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "আইরিশ, মধ্য (900-1200) " #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "মি'কমাক" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "মিনাংকাবাউ" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "আপনার ভাষা নির্বাচন করুন:" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "মন-খমের (অন্যান্য)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "মালয়শিয়া" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "মালটা" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "চালু করো (&চ)" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "মণিপুরী" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "মোহক" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "যুগোস্লাভিয়া" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "মঙ্গোলিয়ান" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "মাউস" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "ইনস্টলকৃত ভাষা" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "ভাষাসমূহ" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "গ্রীক" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "মিরান্ডিজ" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "হার্ডওয়্যার তথ্য" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "ইরজিয়া" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "নাহুয়াটি" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "নর্থ আমেরিঅকন ইন্ডিয়ান" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "নিয়াপলিটান" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "নাভাজো" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "এনডেবেলে, দক্ষিণ" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "এনডেবেলে, উত্তর" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "এনডোংগা" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "জার্মান" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "নেপালী" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "নেপাল ভাষা" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "নিয়াস" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "নাইজার-কর্ডোফালিয়ান (অন্যান্য)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "নিউয়ান" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "নরওয়েজিয়ান" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "নরওয়েজিয়ান" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "নগাই" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "নরসে, পুরাতন" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "নরওয়েজিয়ান" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "নর্দার্ন সোথো" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "ক্লাসিকাল নেওয়ারি" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "চিলি" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "নাম" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "নিয়ানকোলে" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "নিয়োরো" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "এনজিমা" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "অক্কিটান 1500 পরবর্তী)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "অজিবোয়া" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "ওড়িয়া" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "ওরোমো" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "একই" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "রাশিয়ান" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "তুর্কী, অটোমান (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "পাপুয়ান (অন্যান্য)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "হাঙ্গেরীয়" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "পহলাভি" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "প্যারাগুয়ে" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "পানামা" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "পাপিয়ামেন্টো" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "প্যারাগুয়ে" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "পার্সিয়ান, পুরাতন (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "ভার্সন " #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "ফিলিপাইন" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "ফোনিসিয়ান" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "পোলিশ" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "পোলিশ" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr " ফোন্পিয়ান " #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "পর্তুগীজ" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "প্রাথমিক ভাষা (&L)" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "প্রভিন্সাল, পুরাতন (1500 অবধি)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "পুশতো" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "কোয়েচুয়া" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "তাজিকিস্তান" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "জাপান" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "রারোটোংগান" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "রোমান্স (অন্যান্য)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "রেটো-রোমান্স" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "রোমানিয়া" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "রোমানিয়া" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "চলছে" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "রাশিয়ান" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "কানাডা" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "পরিসীমা" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "ইয়াকুট" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "দক্ষিণ আমেরিকান ইন্ডিয়ান (অন্যান্য)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "সামারিটান আরামাইক" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "সংস্কৃত" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "সাসাক" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "ক্যাটালোনিয়া" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "খোঁজো" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "সিসিলিয়ান" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "স্তর" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "ক্রোয়েশীয়" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "সাহায্য" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "সেমিটিক (অন্যান্য)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "আইরিশ, পুরাতন (900 অবধি)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "ভাষাসমূহ" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "সুদান" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "সিডামো" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "সিংহল" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "সাইনো-টিবেটান (অন্যান্য)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "স্লেভিক (অন্যান্য)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "স্লোভাক" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "স্লোভেনিয়া" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "দক্ষিণী সামি" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "উত্তরীয় সামি" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "লুলে সামি" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "ইনারি সামি" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "&সাম্বা" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "স্কল্ট সামি" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "স্লোভেনিয়া" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "ধরন" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "চালিয়ে যাও (&চ)" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "সুদান" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "রোমানিয়া" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "সংহাই" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "সোথো, দক্ষিণী" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "স্প্যানিশ" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "ইউক্রেনীয়" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "সার্ভিস" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "নাইলো-সাহারান (অন্যান্য)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "স্পেন" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "সারসংক্ষেপ" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "সুদান" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "SMBus" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "সুদান" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "সোয়াহিলি" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "সুইডিশ" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "সার্ভিস" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "তাইওয়ান" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "তাই (অন্যান্য)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "পরিবার" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "কাতার" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "বেলজিয়াম" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "সময়" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "ট্রী" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Pentium" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "তাজিকিস্তান" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "টাগালগ" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "থাইল্যান্ড" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "তাইওয়ান" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "ট্রী" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "টাইগ্রিনিয়া" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "টিভ" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "ক্লিংগন" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "ট্লিংগিট" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "টামাশেক" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "টোংগা (নায়াসা)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "টোংগা (টোংগা দ্বীপ)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "টোকেন রিং" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "রাশিয়ান" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "বোটসোয়ানা" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "এস্টোনিয়া" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "তুর্কী" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "টুমবুকা" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "ভাষাসমূহ" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "তুর্কী" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "অল্টেইক (অন্যান্য)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "টুই" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "তিউনিশিয়া" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "উডমুর্ট" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "উগারিটিক" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "উইগুর" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "ইউক্রেনীয়" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "উমবুন্ডু" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "অনির্ধারিত" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "উর্দু" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "উজবেকিস্থান" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "ভাই" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "বিক্রেতা" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "ফাইলের নাম" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "ভোলাপুক" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "জয়স্টিক" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "ওয়ালামো" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "প্যারাগুয়ে" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "ওয়াশো" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "ওয়েলশ" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "ভাষা সংরক্ষন করা হচ্ছে..." #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "ওয়ালুন" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "উওলফ" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "কালমাইক" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "জোসা" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "ইয়াও" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "জাপানী" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "ইদ্দিশ" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "ইওরুবা" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "ভাষাসমূহ" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "জ্যাপোটেক" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "জেনাগা" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "পরিবর্তিত" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "পরিসীমা" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "জুলু" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "জুনি" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "অজানা" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "অজানা" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "অবৈধ Url যোজনা %s" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, fuzzy, c-format, boost-format msgid "Authentication required for '%s'" msgstr "সত্যতা যাচাইয়ের ধরন" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "ডায়রেক্টরি %1: %2 তৈরী করা যাচ্ছে না" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "'%s' ডেস্কটপ বস্তু খুলতে পারে না" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "রপ্তানি ফাইলনাম অবৈধ৷" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "লেখার জন্যে ফাইল খুলতে পারে না।" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "ফ্লপি ডিস্ক থেকে পড়ায় ত্রুটি।" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "সংস্থান পুনঃস্থাপন করছে" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "'%s' ডেস্কটপ বস্তু খুলতে পারে না" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "এগিয়ে যাবেন?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "%s প্যাকেজের শুদ্ধতা যাচাই ব্যর্থ হয়েছে। আপনি কি এটাকে পুনরায় ডাউনলোড করার চেষ্টা " "করতে চান?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "%s প্যাকেজের শুদ্ধতা যাচাই ব্যর্থ হয়েছে। আপনি কি এটাকে পুনরায় ডাউনলোড করার চেষ্টা " "করতে চান?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm যাচাই ব্যর্থ হয়েছে।" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm ব্যর্থ হয়েছে।" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "সংস্থানের প্রকার VAR1 পরিবর।তন দেখান বৈশিষ্ট্যকে সমর্থন করে না" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "%s থেকে %s প্রদান করতে পারে না" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "রিপোসিটারিতে ফাইল %1 পাওয়া যায়নি" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "ফাইল তৈরী করা যাচ্ছে না" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "কিছু অমীমাংসিত আবশ্যকতা আছে..." #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "কিছু অমীমাংসিত আবশ্যকতা আছে..." #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "এর সাথে সংযোগের অনুরোধ: " #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "নির্ভরতা সমস্যাগুলির কারণে %s স্থাপন করতে পারে না" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "কোনওটাই %s প্রদান করে না" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "ইতিমধ্যে এই অনুরোধ করা হয়ে গিয়েছে" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "নির্দেশমত স্থাপনা বাতিল করা হয়েছে।" #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "সম্পাদন করুন" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "কী এনক্রিপশনে ত্রুটি" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "ব্যর্থ" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr " %s-এর জন্য পরিবর্তিত কনফিগারেশন ফাইলসমূহ :" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm %s কে %sরূপে সংরক্ষণ করেছিল ,কিন্তু পার্থক্য নিরূপণ করা অসম্ভব হয়েছিল " #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm %s কে %sরূপে সংরক্ষণ করেছিল।\n" "এখানে পার্থক্যের প্রথম ২৫ টি লাইন দেওয়া আছে:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm %s কে %sরূপে সংরক্ষণ করেছিল ,কিন্তু পার্থক্য নিরূপণ করা অসম্ভব হয়েছিল " #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm %s কে %sরূপে তৈরি করেছিল।\n" "এখানে পার্থক্যের প্রথম ২৫ টি লাইন দেওয়া আছে:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "অতিরিক্ত তথ্য" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "%s ব্যাকআপ তৈরী করছে" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "এন্ট্রি পাওয়া যায়নি" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "এন্ট্রি পাওয়া যায়নি" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "এন্ট্রি পাওয়া যায়নি" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1' নেই" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1' নেই" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "এন্ট্রি পাওয়া যায়নি" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "ফাইল খোলা যাচ্ছে না %1." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "অবৈধ LDAP URL অনুসন্ধান স্ট্রিং" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "অবৈধ LDAP URL অনুসন্ধান প্যারামিটার '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Url অনজেক্ট ক্লোন করতে অক্ষম" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "অবৈধ খালি Url অবজেক্ট রেফারেন্স" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Url কম্পোনেন্ট পার্স করতে অক্ষম" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url যোজনা %s এর অনুমতি দেয় না" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "অবৈধ %s কম্পোনেন্ট %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "অবৈধ %s কম্পোনেন্ট" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "এই URL এর জন্যে স্ট্রিং পার্সিং সমর্থিত নয়" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url যোজনা একটি আবশ্যিক কম্পোনেন্ট" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "অবৈধ Url যোজনা %s" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url যোজনা ব্যবহারকারীর নামের অনুমতি দেয় না" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url যোজনা পাসওয়ার্ডের অনুমতি দেয় না" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url যোজনার জন্য হোস্ট কম্পোনেন্ট" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url যোজনা হোস্ট কম্পোনেন্ট-এর অনুমতি দেয় না" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "অবৈধ হোস্ট কম্পোনেন্ট '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url যোজনা পোর্টের অনুমতি দেয় না" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "অবৈধ পোর্ট কম্পোনেন্ট '%s' " #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url যোজনার জন্য পথের নাম দরকার" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "অথরিটি বিদ্যমান থাকলে রিলেটিভ পথের অনুমতি নেই" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "এনকোডেড স্ট্রিংয়ে NUL বাইট আছে" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "অবৈধ প্যারামিটার এরে স্প্লিট সেপারেটর ক্যারেক্টার" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "অবৈধ প্যারামিটার ম্যাপ স্প্লিট সেপারেটর ক্যারেক্টার" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "অবৈধ প্যারামিটার এরে জয়েন সেপারেটর ক্যারেক্টার" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "সংযোগ সাধনের সময়ে আদেশ সম্পন্ন হয়েছে" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "%s খুঁজে পায় না।" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "%s খুঁজে পায় না।" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "%s খুলতে পারে নি - %s\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "মডিউল\"%s\" লোড করতে অসফল হয়েছে।" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "রিপোসিটারিতে ফাইল %1 পাওয়া যায়নি" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr " ফাইলে লেখা যাচ্ছে না %1." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 ডায়রেক্টরি না" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr " CA নাম শূণ্য" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "অবৈধ URL প্রকল্প '%1'৷" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "'%s' ডেস্কটপ বস্তু খুলতে পারে না" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "অনুমতি প্রত্যাখ্যাত" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "হ্যাঁ" #: zypp-tui/Table.cc:32 msgid "No" msgstr "না" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "পূর্বাভাস" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "ত্রুটি" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "ইন্দোনেশিয়া" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "ভুল" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "পূর্বাভাস" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "স্টর্টিং..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "পাওয়া যায় নি" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "হ্যাঁ" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "না" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।" #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "প্যাকেজ আনইনস্টল করার আদেশ" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "কোনওটাই %s প্রদান করে না" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "সার্টিফিকেট %1 অনুপস্থিত" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s লক করা আছে এবং আনইন্সটল করা যাবে না ।" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "ইনস্টল করা হয় নি" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s এর %s দরকার" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "in/ssTklইনস্টল করা যাবে না" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s-এর সঙ্গে %s-এর দ্বন্দ্ব" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s %sকে প্রাচীন করে দিয়েছে" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s %sকে প্রাচীন করে দিয়েছে" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s-এর সঙ্গে %s-এর দ্বন্দ্ব" #~ msgid "do not install %s" #~ msgstr "%s ইন্সটল করে না" #~ msgid "keep %s" #~ msgstr "%s রাখুন" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "%s ইন্সটল করে না" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "%s এর কোনও বিকল্প স্থাপনযোগ্য প্রদানকারী নেই" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "%1 এর দ্বন্দ্ব %2 এর সাথে" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।" #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "%s স্থাপন করুন যদিও এটা আর্কিটেকচার পালটে দেবে" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s %sকে প্রাচীন করে দিয়েছে" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "%s থেকে %s ডাউনলোড করেছে" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "স্থাপন" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "ফাইল খোলা যাচ্ছে না %1." #~ msgid "Hal Exception" #~ msgstr "Hal ব্যতিক্রম" #~ msgid "HalContext not connected" #~ msgstr "HalContext সংযুক্ত নয়" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive চালু নেই" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume চালু নেই" #~ msgid "Unable to create dbus connection" #~ msgstr "dbus সংযোগ তৈরি করতে অক্ষম" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: libhal কনটেক্সট তৈরি করতে পারে না" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: dbus সংযোগ নির্দিষ্ট করতে পারে না" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "HAL কনটেক্সট চালু করতে পারে না -- hald চলছে না?" #~ msgid "Not a CDROM drive" #~ msgstr "CDROM ড্রাইভ নয়" #~ msgid "Can't initialize mutex attributes" #~ msgstr "মিউটেক্স বৈশিষ্ট্য চালু করতে পারে না" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "রিকার্সিভ মিউটেক্স বৈশিষ্ট্য নির্দিষ্ট করতে পারে না" #~ msgid "Can't initialize recursive mutex" #~ msgstr "রিকার্সিভ মিউটেক্স চালু করতে পারে না" #~ msgid "Can't acquire the mutex lock" #~ msgstr "মিউটেক্স লক অর্জন করতে পারে না" #~ msgid "Can't release the mutex lock" #~ msgstr "মিউটেক্স লক মুক্ত করতে পারে না" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "পাব্লিক কী পাওয়া যাচ্ছে না" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "ইনস্টল করা হয় নি" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "%s খুলতে পারে নি - %s\n" #~ msgid "Serbia and Montenegro" #~ msgstr "সার্বিয়া ও মন্টেনেগ্রো" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "অজ্ঞাত তালিকাবিকল্প" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "নির্ভরতাগুলির সমাধান করতে পারে নি" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s ফাইলের কোনও চেকসাম নেই।\n" #~ "তবুও ফাইলটি ব্যবহার করতে চান?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "নিচের কি দ্বারা %s ফাইলের শুদ্ধতা যাচাই ব্যর্থ হয়েছে:\n" #~ "%s|%s|%s\n" #~ "তবুও ফাইলটি ব্যবহার করতে চান?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s ফাইলের একটি অবৈধ চেকসাম আছে।\n" #~ "%s প্রত্যাশিত ছিল, পাওয়া গেছে %sতবুও ফাইলটি ব্যবহার করতে চান?" #, fuzzy #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s ফাইলের একটি অজ্ঞাত চেকসাম আছে ।\n" #~ "তবুও ফাইলটি ব্যবহার করতে চান?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "%s স্বাক্ষরিত নয়।\n" #~ "তবুও ব্যবহার করতে চান?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "ফাইল %s একটি অজ্ঞাত কি দ্বারা স্বাক্ষরিত:\n" #~ "%s|%s|%s\n" #~ "তবুও ফাইলটি ব্যবহার করতে চান?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "অবিশ্বস্ত কি পাওয়া গেছে:\n" #~ "%s|%s|%s\n" #~ "কি-য়ের উপরে বিশ্বাস করবেন?" #~ msgid "%s remove failed" #~ msgstr "%s অপসারণ ব্যর্থ হয়েছে" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "পাসওয়ার্ড পরিবর্তন" #~ msgid "rpm output:" #~ msgstr "rpm আউটপুট" #~ msgid "%s install failed" #~ msgstr "%s ইন্সটল ব্যর্থ হয়েছে " #~ msgid "%s installed ok" #~ msgstr "%s ইন্সটল ঠিক আছে" #~ msgid "%s remove ok" #~ msgstr "%s অপসারণ ঠিক আছে" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "%s এই নির্ভরতা প্রদান করে কিন্তু স্থাপিত আইটেমের আর্কিটেকচার পালটে দেবে " #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "%s এই নির্ভরতা প্রদান করে কিন্তু স্থাপিত আইটেমের আর্কিটেকচার পালটে দেবে " #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "%1 এর দ্বন্দ্ব %2 এর সাথে" #~ msgid "Ignore that %s is already set to install" #~ msgstr "%s ইতোমধ্যেই স্থাপিত হওয়া নির্দিষ্ট রয়েছে, এই বিষয়টি উপেক্ষা করুন" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "%s-এ অপ্রচলিত %s অগ্রাহ্য করুন" #~ msgid "Ignore this conflict of %s" #~ msgstr "%s এর দ্বন্দ্ব অগ্রাহ্য করুন" #~ msgid "Ignore this requirement just here" #~ msgstr "কিছু অমীমাংসিত আবশ্যকতা আছে..." #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "%s স্থাপন করুন যদিও এটা আর্কিটেকচার পালটে দেবে" #~ msgid "Install missing resolvables" #~ msgstr "ড্রাইভার ইনস্টল করা হচ্ছে..." #~ msgid "Keep resolvables" #~ msgstr "ড্রাইভার ইনস্টল করা হচ্ছে..." #~ msgid "Unlock these resolvables" #~ msgstr "%1 এর দ্বন্দ্ব %2 এর সাথে" #~ msgid "delete %s" #~ msgstr "%s মুছে ফেলুন" #~ msgid "install %s" #~ msgstr "%s ইনস্টল করুন" #~ msgid "unlock %s" #~ msgstr "%s আনলক করে" #~ msgid "unlock all resolvables" #~ msgstr "%1 এর দ্বন্দ্ব %2 এর সাথে" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "ফাইল খোলা যাচ্ছে না %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "সেক্টর %u পড়ায় ত্রুটি।" #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "এই URL এর জন্যে পথ প্যারামিটার পার্সিং সমর্থিত নয়" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "এই URL এর জন্যে পথ প্যারামিটার পার্সিং সমর্থিত নয়" #~ msgid "Software management is already running." #~ msgstr "সফ্টওয়্যার ম্যানেজমেন্ট ইতোমধ্যেই চলছে।" #~ msgid "%s is replaced by %s" #~ msgstr "%s প্রতিস্থাপিত হয়েছে %s দ্বারা" #~ msgid "%s replaced by %s" #~ msgstr "%s প্রতিস্থাপিত হয়েছে %s দ্বারা" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "এই রিজলভেবলগুলি সিস্টেম থেকে মুছে দেওয়া হবে।" #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s বিস্থাপিত হবে না কারণ এটার এখনও প্রয়োজন আছে" #~ msgid "Invalid information" #~ msgstr "অবৈধ তথ্য" #~ msgid "%s is needed by other resolvables" #~ msgstr "অন্যান্য রিজলভেবলের %s প্রয়োজন" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "এর %s দরকার:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "অন্যান্য বিশ্লেষ্যগুলির সঙ্গে %s এর দ্বন্দ্ব" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s-এর সঙ্গে দ্বন্দ্ব :\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s অন্যান্য রিজলভেবলগুলিকে প্রাচীন করে দিয়েছে" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "এই রিজলভেবলগুলি সিস্টেম থেকে মুছে দেওয়া হবে।" #~ msgid "%s depends on other resolvables" #~ msgstr "%s অন্য রিজলভেবলগুলির উপরে নির্ভর করে" #~ msgid "%s depends on %s" #~ msgstr "%s নির্ভর করে %s এর উপরে" #~ msgid "%s depends on:%s" #~ msgstr "%s নির্ভর করে এর উপরে: %s" #~ msgid "Child of" #~ msgstr "এর সন্তান" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "এমন কোনও সংস্থান উপলব্ধ নেই যা এই প্রয়োজনটিকে সমর্থন করে" #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "এই রেজলিউশনের উপরে/নিচে বর্ণিত সমস্যাগুলি সমস্ত নির্ভরতাগুলির সমাধান করবে না" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%s স্থাপন করতে পারে না কারণ এটা %s এর সাথে বিবাদ তৈরি করছে" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s ইন্সটল করা নেই এবং আনইন্সটল হিসাবে চিহ্নিত করা হয়েছে" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s এর অপূর্ণ প্রয়োজন আছে" #~ msgid "%s has missing dependencies" #~ msgstr "%s এর হারিয়ে যাওয়া নির্ভরশীলগুলি আছে" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "হারিয়ে যাওয়া নির্ভরশীলগুলির জন্য %s ইন্সটল করা যাবে না" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s %s এর নির্ভরতাগুলি পূরণ করে কিন্তু বিস্থাপিত হবে" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s %s এর নির্ভরতাগুলি পূরণ করে কিন্তু একে আপনার সিস্টেমে রাখা হবে" #~ msgid "No need to install %s" #~ msgstr "%s ইন্সটল করার প্রয়োজন নেই" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "%s এর নির্ভরতাগুলি পূরণ করার জন্যে %s স্থাপন করতে পারে না" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "%s এর নির্ভরতাগুলি পূরণ করার জন্যে %s স্থাপন করতে পারে না" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s বিস্থাপিত হবে না কারণ এটার এখনও প্রয়োজন আছে" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "" #~ "%s %s কে প্রাচীন করে দিয়েছে। কিন্তু %s মুছে দেওয়া যায় না কারণ এটা লক হয়ে আছে।" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "%s স্থাপন করতে পারে না কারণ এটা বিবাদ তৈরি করছে" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s এর সঙ্গে দ্বন্দ্বের জন্য %s ইন্সটল করার অযোগ্য" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "%s উন্নীত করার সময়ে %s এর জন্যে %s এর প্রয়োজনের জন্যে" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s %s প্রয়োজন হারিয়ে ফেলছে" #~ msgid ", Action: " #~ msgstr "ক্রিয়া (&A)" #~ msgid ", Trigger: " #~ msgstr ", ট্রিগার:" #~ msgid "package" #~ msgstr "প্যাকেজ" #~ msgid "selection" #~ msgstr "নির্বাচন" #~ msgid "pattern" #~ msgstr "ধাঁচ" #~ msgid "product" #~ msgstr "পণ্য" #~ msgid "patch" #~ msgstr "প্যাচ" #~ msgid "script" #~ msgstr "স্ক্রিপ্ট" #~ msgid "message" #~ msgstr "বার্তা" #~ msgid "atom" #~ msgstr "অণু" #~ msgid "system" #~ msgstr "ব্যবস্থা" #~ msgid "Resolvable" #~ msgstr "রিজলভেবল" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "এই রেজলিউশন প্রচেষ্টাকে অবৈধ রূপে চিহ্নিত করা হচ্ছে।" #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "%s রিজলভেবলকে বিস্থাপনের অযোগ্য রূপে চিহ্নিত করা হচ্ছে" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s স্থাপিত হওয়ার পরিকল্পনা আছে, কিন্তু নির্ভরতা সমস্যার কারণে এটা সম্ভব হচ্ছে না।" #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "%s স্থাপন করতে পারে না যেহেতু এটা ইতোমধ্যেই বিস্থাপিত হওয়া প্রয়োজন বলে চিহ্নিত " #~ "হয়েছে" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "%s স্থাপন করতে পারে না যেহেতু এটা এই ব্যবস্থার প্রতি প্রযোজ্য নয়।" #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "%s স্থাপন করতে পারে না যেহেতু %s ইতোমধ্যেই স্থাপিত হওয়া প্রয়োজন বলে চিহ্নিত " #~ "হয়েছে " #~ msgid "This would invalidate %s." #~ msgstr "এটা %s কে অবৈধ করে দেবে।" #~ msgid "Establishing %s" #~ msgstr "%s স্থাপন করছে" #~ msgid "Installing %s" #~ msgstr "ইনস্টল করা হচ্ছে %s" #~ msgid "Updating %s to %s" #~ msgstr "%sকে %s এ উন্নীত করছে" #~ msgid "Skipping %s: already installed" #~ msgstr "%s ডিঙিয়ে যাচ্ছে :আগে থেকেই ইনস্টল করা আছে" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "%s এর কোনও বিকল্প স্থাপিত প্রদানকারী নেই" #~ msgid "for %s" #~ msgstr "%s এর জন্য" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "%s অপসারণ এড়ানোর জন্যে %s এ উন্নীত হওয়া সম্ভব নয়।" #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s %s প্রদান করে, কিন্তু এটা বিস্থাপিত হওয়ার সূচী আছে।" #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s %s প্রদান করে, কিন্তু এই %s এর অপর একটি ভার্সন ইতোমধ্যেই স্থাপিত আছে।" #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s %s প্রদান করে, কিন্তু এটা বিস্থাপনযোগ্য নয়। আরও বিবরণের জন্যে এটাকে নিজে " #~ "থেকে স্থাপনের চেষ্টা করুন। " #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s %s প্রদান করে, কিন্তু এটা লক হয়ে আছে।" #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s %s প্রদান করে, কিন্তু এটা রক্ষিত হওয়ার সূচী আছে।" #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s %s প্রদান করে, কিন্তু এটার অন্য একটা আর্কিটেকচার আছে।" #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "%s এর জন্য %s এর প্রয়োজন পূরণ করতে পারে না" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "অন্যান্য স্থাপিত রিজলভেবলের জন্য %s দরকার, তাই এটা আনলিঙ্কড হবে না। " #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "অন্যান্য স্থাপিত রিজলভেবলের জন্য %s দরকার, তাই এটা আনলিঙ্কড হবে না। " #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "%s (%s) নিয়ে বিবাদের জন্যে অন্যান্য স্থাপিত হতে চলা %s অপসারণের প্রয়োজন" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "%s নিয়ে বিবাদের কারণে %s কে বিস্থাপনের অযোগ্য রূপে চিহ্নিত করা হচ্ছে" #~ msgid "from %s" #~ msgstr "%s থেকে" #~ msgid " Error!" #~ msgstr "ত্রুটি" #~ msgid " Important!" #~ msgstr "জরুরি!" #~ msgid "%s depended on %s" #~ msgstr "%s নির্ভর করে %s এর উপরে" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s এর %s দরকার" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s এর %s দরকার" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s প্রতিস্থাপিত হয়েছে %s দ্বারা" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s এর %s দরকার" #~ msgid "%s part of %s" #~ msgstr "%s, %s এর অঙ্গ" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s এর %s দরকার" #~ msgid "Unable to parse Url authority" #~ msgstr "Url অথরিটি পার্স করতে অক্ষম" #~ msgid "Ignore this requirement generally" #~ msgstr "কিছু অমীমাংসিত আবশ্যকতা আছে..." #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "অন্যান্য স্থাপিত হতে চলা রিজলভেবলের জন্য %s দরকার, তাই এটা আনলিঙ্কড হবে না। " #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "আপডেট স্থাপনা সম্পাদনের জন্যে প্রয়োজনীয় ফাইল তৈরি করতে পারে না।" #~ msgid "Unable to restore all sources." #~ msgstr "সকল উত্‍সগুলি পুনরুদ্ধার করতে অক্ষম।" #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "কমপক্ষে একটি উত্‍স ইতোমধ্যেই নথিবদ্ধ আছে, সঞ্চিত উত্‍সটি পুনরুদ্ধার করা যায় না।" #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "%s এর নির্ভরতাগুলি পূরণ করার জন্যে %s স্থাপন করা যায় না" #~ msgid "%s dependend on %s" #~ msgstr "%s নির্ভর করে %s এর উপরে" #~ msgid "Reading index files" #~ msgstr "সূচীপত্র ফাইল পড়ছে" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "স্বাক্ষরিত repomd.xml ফাইল স্বাক্ষর যাচাইয়ে ব্যর্থ হয়েছে।" #~ msgid "Reading product from %s" #~ msgstr "%s থেকে পণ্য পড়ছে" #~ msgid "Reading filelist from %s" #~ msgstr "%s থেকে ফাইলতালিকা পড়ছে" #~ msgid "Reading packages from %s" #~ msgstr "%s থেকে প্যাকেজ পড়ছে" #~ msgid "Reading selection from %s" #~ msgstr "%s থেকে নির্বাচন পড়ছে" #~ msgid "Reading pattern from %s" #~ msgstr "%s থেকে প্যাটার্ন পড়ছে" #~ msgid "Reading patches index %s" #~ msgstr "%s প্যাচ ইনডেক্স পড়ছে" #~ msgid "Reading patch %s" #~ msgstr "%s প্যাচ পড়ছে" #~ msgid "The script file failed the checksum test." #~ msgstr "স্ক্রিপ্ট ফাইল চেকসাম পরীক্ষায় ব্যর্থ হয়েছে" #~ msgid "Reading packages file" #~ msgstr "প্যাকেজ ফাইল পড়ছে" #~ msgid "Reading translation: %s" #~ msgstr "অনুবাদ পড়ছে: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "%s প্যাকেজের শুদ্ধতা যাচাই ব্যর্থ হয়েছে। আপনি কি এটাকে পুনরায় ডাউনলোড করার " #~ "চেষ্টা করতে চান, নাকি স্থাপনা বাতিল করবেন?" #~ msgid " miss checksum." #~ msgstr " অবুপস্থিত চেকসাম।" #~ msgid " fails checksum verification." #~ msgstr "চেকসাম এর শুদ্ধতা যাচাই ব্যর্থ হয়েছে" #~ msgid "Downloading %s" #~ msgstr "%s ডাউনলোড করছে" libzypp-17.36.5/po/bs.po000066400000000000000000003260211476576476200150040ustar00rootroot00000000000000# 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: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2002-07-23 18:27+0200\n" "Last-Translator: Damir Bjelobradic \n" "Language-Team: Bosnian \n" "Language: bs\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" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 #, fuzzy msgid "No Code" msgstr "nobody" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andora" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Ujedinjeni Arapski Emirati" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanija" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenija" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Nizozemski Antili" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktik" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Američka Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austrija" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australija" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 #, fuzzy msgid "Aland Islands" msgstr "Kajmanska ostrva" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbejdžan" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosna i Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" # BD #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladeš" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgija" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bugarska" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrein" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Bruneji" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivija" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazil" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahami" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Butan" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Ostrvo Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Bocvana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Bjelorusija" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosova ostrva" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "Centralnoafrička Republika" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Švicarska" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 #, fuzzy msgid "Cote D'Ivoire" msgstr "Obala Slonovače" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cook ostrva" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Čile" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbija" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kosta Rika" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Zelenortsko otočje" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Uskršnje ostrvo" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Kipar" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Češka Republika" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Njemačka" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Džibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danska" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominikanska Republika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikanska Republika" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algerija" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonija" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipat" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Zapadna Sahara" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritreja" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Španija" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopija" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finska" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsko otočje" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faroe Otoci" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francuska" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Ujedinjeno Kraljevstvo (Velika Britanija)" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Džordžija" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Francuska Gvineja" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Njemačka" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Greenland" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambija" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Gvineja" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadelupa" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatorijalna Gvineja" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grčka" # GS # fuzzy #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia i South Sandwich ostrvo" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Gvineja Bisau" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Gvajana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 #, fuzzy msgid "Heard Island and McDonald Islands" msgstr "Heard ostrvo i McDonaldova ostrva" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Hondoras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Hrvatska" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Mađarska" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesija" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irska" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indija" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britansko-Indijska morska teritorija" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irak" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Iceland" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italija" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamajka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenija" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgistan" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambođa" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komori" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 #, fuzzy msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 #, fuzzy msgid "North Korea" msgstr "Sjeverna Irska" #. :PRK:408: #: zypp/CountryCode.cc:278 #, fuzzy msgid "South Korea" msgstr "Južni pol" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuvajt" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kajmanska ostrva" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazahstan" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 #, fuzzy msgid "Lao People's Democratic Republic" msgstr "Lao Narodna Demokratska Republika" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 #, fuzzy msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Linhenštajn" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Šri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberija" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesoto" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litvanija" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvija" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Liberija" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Moroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" # CG #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "Kongo" # SM #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "San Marino" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Maršalova ostrva" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonija" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolija" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makao" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Sjeverna Marijanska ostrva" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinik" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritanija" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauricijus" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Mali" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malavi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malezija" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibija" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nova Kaledonija" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk ostrvo" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigerija" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragva" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nizozemska" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norveška" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Novi Zeland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Francuska Polinezija" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nova Gvineja" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipini" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poljska" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 #, fuzzy msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitkairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Riko" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 #, fuzzy msgid "Palestinian Territory" msgstr "Britansko-Indijska morska teritorija" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paragvaj" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumunija" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "Srpski" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Ruska Federacija" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudijska Arabija" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomoska ostrva" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Sejšelsko otočje" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Švedska" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Saint Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenija" # SJ # fuzzy #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen ostrva" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovačka" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalija" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome i Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Surinam" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Svazilend" # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 #, fuzzy msgid "Turks and Caicos Islands" msgstr "Turks i Caicos ostrva" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Čad" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 #, fuzzy msgid "French Southern Territories" msgstr "Francuske Južne Teritorije" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tajland" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistan" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turska" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad i Tobago" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" # TW # fuzzy #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tajland" #. :TWN:158: #: zypp/CountryCode.cc:383 #, fuzzy msgid "Tanzania" msgstr "Tasmanija" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrajina" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "SAD" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Urugvaj" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikan (Sveta Zemlja)" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 #, fuzzy msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venecuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 #, fuzzy msgid "British Virgin Islands" msgstr "Djevičansko otočje (U.S.)" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Djevičansko otočje (U.S.)" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vijetnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis i Futuna ostrva" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Južna Afrika" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambija" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabve" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "Izbrii" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 #, fuzzy msgid "Afar" msgstr "Afrika" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Azerbejdđanski" #. language code: ace #: zypp/LanguageCode.cc:165 #, fuzzy msgid "Achinese" msgstr "Kineski" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 #, fuzzy msgid "Akan" msgstr "Azerbejdđanski" #. language code: akk #: zypp/LanguageCode.cc:183 #, fuzzy msgid "Akkadian" msgstr "Azerbejdđanski" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 #, fuzzy msgid "Albanian" msgstr "Albanija" #. language code: ale #: zypp/LanguageCode.cc:189 #, fuzzy msgid "Aleut" msgstr "Aleuta" #. language code: alg #: zypp/LanguageCode.cc:191 #, fuzzy msgid "Algonquian Languages" msgstr "Odaberite vaš jezik:" #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "Južna Afrika" #. language code: amh am #: zypp/LanguageCode.cc:195 #, fuzzy msgid "Amharic" msgstr "Afrika" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 #, fuzzy msgid "Apache Languages" msgstr "Jezik" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arapski" #. language code: arc #: zypp/LanguageCode.cc:203 #, fuzzy msgid "Aramaic" msgstr "Arapski" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 #, fuzzy msgid "Armenian" msgstr "Armenija" # MR #. language code: arn #: zypp/LanguageCode.cc:211 #, fuzzy msgid "Araucanian" msgstr "Mauritanija" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 #, fuzzy msgid "Assamese" msgstr "Poruke" #. language code: ast #: zypp/LanguageCode.cc:221 #, fuzzy msgid "Asturian" msgstr "Austrija" #. language code: ath #: zypp/LanguageCode.cc:223 #, fuzzy msgid "Athapascan Languages" msgstr "Australija" #. language code: aus #: zypp/LanguageCode.cc:225 #, fuzzy msgid "Australian Languages" msgstr "Australija" #. language code: ava av #: zypp/LanguageCode.cc:227 #, fuzzy msgid "Avaric" msgstr "Arapski" #. language code: ave ae #: zypp/LanguageCode.cc:229 #, fuzzy msgid "Avestan" msgstr "Aleuta" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 #, fuzzy msgid "Aymara" msgstr "Myanmar" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbejđanski" #. language code: bad #: zypp/LanguageCode.cc:237 #, fuzzy msgid "Banda" msgstr "Kanada" #. language code: bai #: zypp/LanguageCode.cc:239 #, fuzzy msgid "Bamileke Languages" msgstr "Jezik" #. language code: bak ba #: zypp/LanguageCode.cc:241 #, fuzzy msgid "Bashkir" msgstr "Brazil" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 #, fuzzy msgid "Bambara" msgstr "Smarkand" #. language code: ban #: zypp/LanguageCode.cc:247 #, fuzzy msgid "Balinese" msgstr "Kineski" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskijski" #. language code: bas #: zypp/LanguageCode.cc:253 #, fuzzy msgid "Basa" msgstr "Baskijski" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bjeloruski" #. language code: bem #: zypp/LanguageCode.cc:261 #, fuzzy msgid "Bemba" msgstr "Bermuda" # SN #. language code: ben bn #: zypp/LanguageCode.cc:263 #, fuzzy msgid "Bengali" msgstr "Senegal" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 #, fuzzy msgid "Bihari" msgstr "Bahrein" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" # BJ #. language code: bin #: zypp/LanguageCode.cc:273 #, fuzzy msgid "Bini" msgstr "Benin" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" # BJ #. language code: bos bs #: zypp/LanguageCode.cc:281 #, fuzzy msgid "Bosnian" msgstr "Benin" # BR #. language code: bra #: zypp/LanguageCode.cc:283 #, fuzzy msgid "Braj" msgstr "Brazil" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonski" #. language code: btk #: zypp/LanguageCode.cc:287 #, fuzzy msgid "Batak (Indonesia)" msgstr "Indonesija" #. language code: bua #: zypp/LanguageCode.cc:289 #, fuzzy msgid "Buriat" msgstr "Bugarska" #. language code: bug #: zypp/LanguageCode.cc:291 #, fuzzy msgid "Buginese" msgstr "Kineski" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bugarski" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 #, fuzzy msgid "Blin" msgstr "Belgijski" # TD #. language code: cad #: zypp/LanguageCode.cc:301 #, fuzzy msgid "Caddo" msgstr "Čad" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 #, fuzzy msgid "Carib" msgstr "Maorski" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalanski" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 #, fuzzy msgid "Cebuano" msgstr "Libanon" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 #, fuzzy msgid "Chamorro" msgstr "Komori" #. language code: chb #: zypp/LanguageCode.cc:317 #, fuzzy msgid "Chibcha" msgstr "Kina" #. language code: che ce #: zypp/LanguageCode.cc:319 #, fuzzy msgid "Chechen" msgstr "Češki" #. language code: chg #: zypp/LanguageCode.cc:321 #, fuzzy msgid "Chagatai" msgstr "Šangaj" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kineski" #. language code: chk #: zypp/LanguageCode.cc:327 #, fuzzy msgid "Chuukese" msgstr "Kineski" #. language code: chm #: zypp/LanguageCode.cc:329 #, fuzzy msgid "Mari" msgstr "Maorski" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "Jezik" #. language code: cop #: zypp/LanguageCode.cc:347 #, fuzzy msgid "Coptic" msgstr "Kosta Rika" #. language code: cor kw #: zypp/LanguageCode.cc:349 #, fuzzy msgid "Cornish" msgstr "Irski" #. language code: cos co #: zypp/LanguageCode.cc:351 #, fuzzy msgid "Corsican" msgstr "Kosta Rika" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 #, fuzzy msgid "Cree" msgstr "&Napravi" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Češki" #. language code: dak #: zypp/LanguageCode.cc:373 #, fuzzy msgid "Dakota" msgstr "Dakar" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danski" #. language code: dar #: zypp/LanguageCode.cc:377 #, fuzzy msgid "Dargwa" msgstr "Darvin" #. language code: day #: zypp/LanguageCode.cc:379 #, fuzzy msgid "Dayak" msgstr "Dakar" #. language code: del #: zypp/LanguageCode.cc:381 #, fuzzy msgid "Delaware" msgstr "Hardware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 #, fuzzy msgid "Dinka" msgstr "Dominikanska Republika" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 #, fuzzy msgid "Dogri" msgstr "Maorski" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 #, fuzzy msgid "Lower Sorbian" msgstr "Srpski" #. language code: dua #: zypp/LanguageCode.cc:397 #, fuzzy msgid "Duala" msgstr "Palau" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Holandski" #. language code: dyu #: zypp/LanguageCode.cc:405 #, fuzzy msgid "Dyula" msgstr "Dubai" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 #, fuzzy msgid "Dzongkha" msgstr "Tonga" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engleski" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonski" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 #, fuzzy msgid "Fang" msgstr "Zastave" #. language code: fao fo #: zypp/LanguageCode.cc:431 #, fuzzy msgid "Faroese" msgstr "Faroe Otoci" #. language code: fat #: zypp/LanguageCode.cc:433 #, fuzzy msgid "Fanti" msgstr "Atlantik" #. language code: fij fj #: zypp/LanguageCode.cc:435 #, fuzzy msgid "Fijian" msgstr "Fidži" #. language code: fil #: zypp/LanguageCode.cc:437 #, fuzzy msgid "Filipino" msgstr "Filipini" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finski" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francuski" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 #, fuzzy msgid "Frisian" msgstr "Francuska" #. language code: ful ff #: zypp/LanguageCode.cc:455 #, fuzzy msgid "Fulah" msgstr "Zastave" #. language code: fur #: zypp/LanguageCode.cc:457 #, fuzzy msgid "Friulian" msgstr "Finska" #. language code: gaa #: zypp/LanguageCode.cc:459 #, fuzzy msgid "Ga" msgstr "Guam" # GA #. language code: gay #: zypp/LanguageCode.cc:461 #, fuzzy msgid "Gayo" msgstr "Gabon" #. language code: gba #: zypp/LanguageCode.cc:463 #, fuzzy msgid "Gbaya" msgstr "Gaza" #. language code: gem #: zypp/LanguageCode.cc:465 #, fuzzy msgid "Germanic (Other)" msgstr "Njemački (Swiss)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 #, fuzzy msgid "Georgian" msgstr "Džordžija" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Njemački" #. language code: gez #: zypp/LanguageCode.cc:475 #, fuzzy msgid "Geez" msgstr "Grčki" #. language code: gil #: zypp/LanguageCode.cc:477 #, fuzzy msgid "Gilbertese" msgstr "Vijetnamski" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 #, fuzzy msgid "Gaelic" msgstr "Mali" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irski" #. language code: glg gl #: zypp/LanguageCode.cc:483 #, fuzzy msgid "Galician" msgstr "Vatikan" #. language code: glv gv #: zypp/LanguageCode.cc:485 #, fuzzy msgid "Manx" msgstr "Manila" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" # GA #. language code: gon #: zypp/LanguageCode.cc:491 #, fuzzy msgid "Gondi" msgstr "Gabon" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" # GA #. language code: grb #: zypp/LanguageCode.cc:497 #, fuzzy msgid "Grebo" msgstr "Gabon" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 #, fuzzy msgid "Guarani" msgstr "Mađarski" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 #, fuzzy msgid "Gwich'in" msgstr "Mičigen" #. language code: hai #: zypp/LanguageCode.cc:511 #, fuzzy msgid "Haida" msgstr "Hardware" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "Haiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 #, fuzzy msgid "Hawaiian" msgstr "Havaji" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebrejski" #. language code: her hz #: zypp/LanguageCode.cc:521 #, fuzzy msgid "Herero" msgstr "Hebrejski" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" # HT #. language code: hin hi #: zypp/LanguageCode.cc:527 #, fuzzy msgid "Hindi" msgstr "Haiti" # HT #. language code: hit #: zypp/LanguageCode.cc:529 #, fuzzy msgid "Hittite" msgstr "Haiti" #. language code: hmn #: zypp/LanguageCode.cc:531 #, fuzzy msgid "Hmong" msgstr "Hong Kong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 #, fuzzy msgid "Upper Sorbian" msgstr "Srpski" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Mađarski" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 #, fuzzy msgid "Iban" msgstr "Irak" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandski" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "Litvanija" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 #, fuzzy msgid "Interlingue" msgstr "Nastavi" #. language code: ilo #: zypp/LanguageCode.cc:559 #, fuzzy msgid "Iloko" msgstr "Tokio" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Infoneziski" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 #, fuzzy msgid "Ingush" msgstr "Engleski" #. language code: ipk ik #: zypp/LanguageCode.cc:571 #, fuzzy msgid "Inupiaq" msgstr "Indija" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 #, fuzzy msgid "Iroquoian Languages" msgstr "Odaberite vaš jezik:" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italijanski" #. language code: jav jv #: zypp/LanguageCode.cc:579 #, fuzzy msgid "Javanese" msgstr "Japanski" #. language code: jbo #: zypp/LanguageCode.cc:581 #, fuzzy msgid "Lojban" msgstr "Libanon" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japanski" #. language code: jpr #: zypp/LanguageCode.cc:585 #, fuzzy msgid "Judeo-Persian" msgstr "Infoneziski" #. language code: jrb #: zypp/LanguageCode.cc:587 #, fuzzy msgid "Judeo-Arabic" msgstr "Arapski" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 #, fuzzy msgid "Kabyle" msgstr "Uključeno" #. language code: kac #: zypp/LanguageCode.cc:593 #, fuzzy msgid "Kachin" msgstr "Bahrein" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" # GM #. language code: kam #: zypp/LanguageCode.cc:597 #, fuzzy msgid "Kamba" msgstr "Gambija" #. language code: kan kn #: zypp/LanguageCode.cc:599 #, fuzzy msgid "Kannada" msgstr "Kanada" #. language code: kar #: zypp/LanguageCode.cc:601 #, fuzzy msgid "Karen" msgstr "Korejski" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 #, fuzzy msgid "Kanuri" msgstr "Kurdski" # MW #. language code: kaw #: zypp/LanguageCode.cc:607 #, fuzzy msgid "Kawi" msgstr "Malavi" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 #, fuzzy msgid "Kazakh" msgstr "Kazahstan" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 #, fuzzy msgid "Khasi" msgstr "Tajlandski" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 #, fuzzy msgid "Khotanese" msgstr "Kineski" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 #, fuzzy msgid "Kirghiz" msgstr "Djevičanska ostrva" #. language code: kmb #: zypp/LanguageCode.cc:627 #, fuzzy msgid "Kimbundu" msgstr "Katmandu" #. language code: kok #: zypp/LanguageCode.cc:629 #, fuzzy msgid "Konkani" msgstr "Korejski" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 #, fuzzy msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korejski" #. language code: kos #: zypp/LanguageCode.cc:637 #, fuzzy msgid "Kosraean" msgstr "Korejski" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 #, fuzzy msgid "Kurukh" msgstr "Turski" #. language code: kua kj #: zypp/LanguageCode.cc:647 #, fuzzy msgid "Kuanyama" msgstr "Panama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdski" # KE #. language code: kut #: zypp/LanguageCode.cc:653 #, fuzzy msgid "Kutenai" msgstr "Kenija" #. language code: lad #: zypp/LanguageCode.cc:655 #, fuzzy msgid "Ladino" msgstr "Libanon" # UG #. language code: lah #: zypp/LanguageCode.cc:657 #, fuzzy msgid "Lahnda" msgstr "Uganda" # GM #. language code: lam #: zypp/LanguageCode.cc:659 #, fuzzy msgid "Lamba" msgstr "Gambija" #. language code: lao lo #: zypp/LanguageCode.cc:661 #, fuzzy msgid "Lao" msgstr "Libanon" #. language code: lat la #: zypp/LanguageCode.cc:663 #, fuzzy msgid "Latin" msgstr "Latviski" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latviski" #. language code: lez #: zypp/LanguageCode.cc:667 #, fuzzy msgid "Lezghian" msgstr "Belgijski" #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "Luksemburg" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 #, fuzzy msgid "Lingala" msgstr "Angola" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litvanski" # CG #. language code: lol #: zypp/LanguageCode.cc:675 #, fuzzy msgid "Mongo" msgstr "Kongo" #. language code: loz #: zypp/LanguageCode.cc:677 #, fuzzy msgid "Lozi" msgstr "Prijava" #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "Luksemburg" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 #, fuzzy msgid "Ganda" msgstr "Gana" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 #, fuzzy msgid "Lunda" msgstr "Zvuk" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "Tajlandski" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonski" #. language code: mad #: zypp/LanguageCode.cc:699 #, fuzzy msgid "Madurese" msgstr "Maltski" # MW #. language code: mag #: zypp/LanguageCode.cc:701 #, fuzzy msgid "Magahi" msgstr "Malavi" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 #, fuzzy msgid "Marshallese" msgstr "Maršalova ostrva" # ML #. language code: mai #: zypp/LanguageCode.cc:705 #, fuzzy msgid "Maithili" msgstr "Mali" # MG #. language code: mak #: zypp/LanguageCode.cc:707 #, fuzzy msgid "Makasar" msgstr "Madagaskar" #. language code: mal ml #: zypp/LanguageCode.cc:709 #, fuzzy msgid "Malayalam" msgstr "Malezija" #. language code: man #: zypp/LanguageCode.cc:711 #, fuzzy msgid "Mandingo" msgstr "Upozorenje" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maorski" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 #, fuzzy msgid "Marathi" msgstr "Maorski" # MW #. language code: mas #: zypp/LanguageCode.cc:721 #, fuzzy msgid "Masai" msgstr "Malavi" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "Malta" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 #, fuzzy msgid "Mandar" msgstr "Myanmar" #. language code: men #: zypp/LanguageCode.cc:731 #, fuzzy msgid "Mende" msgstr "Mod" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "Odaberite vaš jezik:" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "Madagaskar" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltski" #. language code: mnc #: zypp/LanguageCode.cc:747 #, fuzzy msgid "Manchu" msgstr "&Pokreni" #. language code: mni #: zypp/LanguageCode.cc:749 #, fuzzy msgid "Manipuri" msgstr "Maorski" #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "Managva" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "Moldova" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 #, fuzzy msgid "Mongolian" msgstr "Mongolija" #. language code: mos #: zypp/LanguageCode.cc:759 #, fuzzy msgid "Mossi" msgstr "Maorski" #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "Jezik" #. language code: mun #: zypp/LanguageCode.cc:763 #, fuzzy msgid "Munda languages" msgstr "Jezik" #. language code: mus #: zypp/LanguageCode.cc:765 #, fuzzy msgid "Creek" msgstr "Grčki" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 #, fuzzy msgid "Mirandese" msgstr "Maine" #. language code: mwr #: zypp/LanguageCode.cc:769 #, fuzzy msgid "Marwari" msgstr "Maorski" #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "Managva" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 #, fuzzy msgid "North American Indian" msgstr "Sjeverna Irska" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 #, fuzzy msgid "Ndonga" msgstr "Tonga" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "Njemački" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 #, fuzzy msgid "Nepali" msgstr "Nepal" # NP #. language code: new #: zypp/LanguageCode.cc:795 #, fuzzy msgid "Nepal Bhasa" msgstr "Nepal" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" # NU #. language code: niu #: zypp/LanguageCode.cc:801 #, fuzzy msgid "Niuean" msgstr "Niue" #. language code: nno nn #: zypp/LanguageCode.cc:803 #, fuzzy msgid "Norwegian Nynorsk" msgstr "Norveški" #. language code: nob nb #: zypp/LanguageCode.cc:805 #, fuzzy msgid "Norwegian Bokmal" msgstr "Norveški" # TO #. language code: nog #: zypp/LanguageCode.cc:807 #, fuzzy msgid "Nogai" msgstr "Tonga" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norveški" #. language code: nso #: zypp/LanguageCode.cc:813 #, fuzzy msgid "Northern Sotho" msgstr "Sjeverna Irska" #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "Jezik" #. language code: nwc #: zypp/LanguageCode.cc:817 #, fuzzy msgid "Classical Newari" msgstr "Ime klase" #. language code: nya ny #: zypp/LanguageCode.cc:819 #, fuzzy msgid "Chichewa" msgstr "Čile" #. language code: nym #: zypp/LanguageCode.cc:821 #, fuzzy msgid "Nyamwezi" msgstr "Naziv" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 #, fuzzy msgid "Nyoro" msgstr "Sjever" #. language code: nzi #: zypp/LanguageCode.cc:827 #, fuzzy msgid "Nzima" msgstr "Lima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 #, fuzzy msgid "Oriya" msgstr "Surinam" #. language code: orm om #: zypp/LanguageCode.cc:835 #, fuzzy msgid "Oromo" msgstr "root" #. language code: osa #: zypp/LanguageCode.cc:837 #, fuzzy msgid "Osage" msgstr "Poruke" #. language code: oss os #: zypp/LanguageCode.cc:839 #, fuzzy msgid "Ossetian" msgstr "Ruski" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "Jezik" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 #, fuzzy msgid "Pangasinan" msgstr "Mađarski" #. language code: pal #: zypp/LanguageCode.cc:849 #, fuzzy msgid "Pahlavi" msgstr "Palau" #. language code: pam #: zypp/LanguageCode.cc:851 #, fuzzy msgid "Pampanga" msgstr "Paragvaj" #. language code: pan pa #: zypp/LanguageCode.cc:853 #, fuzzy msgid "Panjabi" msgstr "Panama" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 #, fuzzy msgid "Palauan" msgstr "Palau" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 #, fuzzy msgid "Persian" msgstr "Srpski" #. language code: phi #: zypp/LanguageCode.cc:865 #, fuzzy msgid "Philippine (Other)" msgstr "Filipini" #. language code: phn #: zypp/LanguageCode.cc:867 #, fuzzy msgid "Phoenician" msgstr "Slovenski" # ML #. language code: pli pi #: zypp/LanguageCode.cc:869 #, fuzzy msgid "Pali" msgstr "Mali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Poljski" #. language code: pon #: zypp/LanguageCode.cc:873 #, fuzzy msgid "Pohnpeian" msgstr "Infoneziski" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugalski" #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "Jezik" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 #, fuzzy msgid "Pushto" msgstr "&Prilagođeno" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 #, fuzzy msgid "Rajasthani" msgstr "Kazahstan" #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "Japan" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "Rumunija" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumunjki" # RE #. language code: run rn #: zypp/LanguageCode.cc:901 #, fuzzy msgid "Rundi" msgstr "Reunion" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ruski" #. language code: sad #: zypp/LanguageCode.cc:905 #, fuzzy msgid "Sandawe" msgstr "Kanada" #. language code: sag sg #: zypp/LanguageCode.cc:907 #, fuzzy msgid "Sango" msgstr "Sajgon" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "Jezik" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 #, fuzzy msgid "Sasak" msgstr "Samoa" #. language code: sat #: zypp/LanguageCode.cc:921 #, fuzzy msgid "Santali" msgstr "Šangaj" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Srpski" #. language code: scn #: zypp/LanguageCode.cc:927 #, fuzzy msgid "Sicilian" msgstr "Mičigen" #. language code: sco #: zypp/LanguageCode.cc:929 #, fuzzy msgid "Scots" msgstr "Jug" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Hrvatski" #. language code: sel #: zypp/LanguageCode.cc:935 #, fuzzy msgid "Selkup" msgstr "Pomoć" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "Jezik" # GH #. language code: shn #: zypp/LanguageCode.cc:943 #, fuzzy msgid "Shan" msgstr "Gana" #. language code: sid #: zypp/LanguageCode.cc:945 #, fuzzy msgid "Sidamo" msgstr "Samoa" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Odaberite vaš jezik:" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovački" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenski" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 #, fuzzy msgid "Northern Sami" msgstr "Sjeverna Irska" #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "Jezik" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 #, fuzzy msgid "Samoan" msgstr "Samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 #, fuzzy msgid "Shona" msgstr "Slovenija" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 #, fuzzy msgid "Soninke" msgstr "Nastavi" #. language code: sog #: zypp/LanguageCode.cc:981 #, fuzzy msgid "Sogdian" msgstr "Prijava" # SO #. language code: som so #: zypp/LanguageCode.cc:983 #, fuzzy msgid "Somali" msgstr "Somalija" #. language code: son #: zypp/LanguageCode.cc:985 #, fuzzy msgid "Songhai" msgstr "Šangaj" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Španski" # MR #. language code: srd sc #: zypp/LanguageCode.cc:991 #, fuzzy msgid "Sardinian" msgstr "Mauritanija" #. language code: srr #: zypp/LanguageCode.cc:993 #, fuzzy msgid "Serer" msgstr "Servis" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 #, fuzzy msgid "Swati" msgstr "Haiti" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 #, fuzzy msgid "Sundanese" msgstr "Sudan" #. language code: sus #: zypp/LanguageCode.cc:1003 #, fuzzy msgid "Susu" msgstr "Status" #. language code: sux #: zypp/LanguageCode.cc:1005 #, fuzzy msgid "Sumerian" msgstr "Srpski" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 #, fuzzy msgid "Swahili" msgstr "Svazilend" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Švedski" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 #, fuzzy msgid "Syriac" msgstr "Surinam" #. language code: tah ty #: zypp/LanguageCode.cc:1013 #, fuzzy msgid "Tahitian" msgstr "Tahiti" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamilski" #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "Katar" #. language code: tel te #: zypp/LanguageCode.cc:1021 #, fuzzy msgid "Telugu" msgstr "Belgija" #. language code: tem #: zypp/LanguageCode.cc:1023 #, fuzzy msgid "Timne" msgstr "Vremenska zona" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 #, fuzzy msgid "Tetum" msgstr "&Testiraj" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 #, fuzzy msgid "Tajik" msgstr "Tajlandski" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tajlandski" # TW # fuzzy #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 #, fuzzy msgid "Tibetan" msgstr "Tajland" # NE #. language code: tig #: zypp/LanguageCode.cc:1039 #, fuzzy msgid "Tigre" msgstr "Niger" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 #, fuzzy msgid "Tigrinya" msgstr "Nigerija" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 #, fuzzy msgid "Klingon" msgstr "Sajgon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 #, fuzzy msgid "Tamashek" msgstr "Taškent" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 #, fuzzy msgid "Tonga (Tonga Islands)" msgstr "Solomoska ostrva" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 #, fuzzy msgid "Tsimshian" msgstr "Ruski" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 #, fuzzy msgid "Tswana" msgstr "Bocvana" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 #, fuzzy msgid "Tsonga" msgstr "Tonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "Turska" #. language code: tum #: zypp/LanguageCode.cc:1067 #, fuzzy msgid "Tumbuka" msgstr "Timbuktu" #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "Jezik" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turski" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 #, fuzzy msgid "Tuvinian" msgstr "Tunisia" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 #, fuzzy msgid "Ugaritic" msgstr "Haiti" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 #, fuzzy msgid "Ukrainian" msgstr "Ukrajina" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 #, fuzzy msgid "Uzbek" msgstr "Uzbekistan" #. language code: vai #: zypp/LanguageCode.cc:1097 #, fuzzy msgid "Vai" msgstr "Vatikan" # VN # fuzzy #. language code: ven ve #: zypp/LanguageCode.cc:1099 #, fuzzy msgid "Venda" msgstr "Vijetnam" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vijetnamski" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 #, fuzzy msgid "Votic" msgstr "Vatikan" #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "Managva" #. language code: wal #: zypp/LanguageCode.cc:1109 #, fuzzy msgid "Walamo" msgstr "Valonski" #. language code: war #: zypp/LanguageCode.cc:1111 #, fuzzy msgid "Waray" msgstr "Paragvaj" #. language code: was #: zypp/LanguageCode.cc:1113 #, fuzzy msgid "Washo" msgstr "Welsh" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Welsh" #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "Odaberite vaš jezik:" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Valonski" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 #, fuzzy msgid "Yapese" msgstr "Japanski" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 #, fuzzy msgid "Yoruba" msgstr "Aruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "Jezik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 #, fuzzy msgid "Zenaga" msgstr "Grenada" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 #, fuzzy msgid "Zhuang" msgstr "Butan" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 #, fuzzy msgid "Zuni" msgstr "Tunis" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "nepoznat" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 #, fuzzy msgid "invalid" msgstr "&Instaliraj" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Ne mogu pokrenuti naredbu \"%s\"" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Ne mogu pokrenuti naredbu \"%s\"" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Couldn't open file: %s." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Ne mogu pokrenuti naredbu \"%s\"" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 #, fuzzy msgid "Continue?" msgstr "Nastavi" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" # %s is either BOOTP or DHCP #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "%s podešavanje nije uspjelo." #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "&Nemoj instalirati" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" # %s is either BOOTP or DHCP #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "%s podešavanje nije uspjelo." #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Editor konfiguracijskih datoteka" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "&Dodatne informacije za korisnika" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Couldn't open file: %s." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Naredba koja se izvršava pri spajanju" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Couldn't open file: %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Instaliram driver..." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Ne mogu pokrenuti naredbu \"%s\"" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Da" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ne" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Greška" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "done" msgstr "Indonesija" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "Greška" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Postavke" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Novi moduli nisu pronađeni." #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 #, fuzzy msgid "yes" msgstr "Da" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "Nova instalacija" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "do not install %s" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "Izbrii" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "niste spojeni" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "channel to channel konekcija" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "rpm output:" #~ msgstr "" #~ "\n" #~ "Izvještaj:" #, fuzzy #~ msgid "%s install failed" #~ msgstr "Nova instalacija" #, fuzzy #~ msgid "%s installed ok" #~ msgstr "&Da, instaliraj" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "install %s" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "No need to install %s" #~ msgstr "&Da, instaliraj" #, fuzzy #~ msgid ", Action: " #~ msgstr "3D ubrzanje:" #, fuzzy #~ msgid "Establishing %s" #~ msgstr "Instaliram driver..." #, fuzzy #~ msgid " Error!" #~ msgstr "Greška" #~ msgid "Ok" #~ msgstr "U redu" #, fuzzy #~ msgid "Default" #~ msgstr "&Podrazumjevani" #, fuzzy #~ msgid "to be installed (soft)" #~ msgstr "&Bootaj instalirani sistem" #, fuzzy #~ msgid "to be uninstalled" #~ msgstr "&Da, instaliraj" libzypp-17.36.5/po/ca.po000066400000000000000000004362231476576476200147710ustar00rootroot00000000000000# 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: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2025-03-01 10:56+0000\n" "Last-Translator: David Medina \n" "Language-Team: Catalan \n" "Language: ca\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: Weblate 5.10.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "País desconegut: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Sense codi" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" # AE #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Unió dels Emirats Àrabs" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" # AL #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albània" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armènia" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antilles Holandeses" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antàrtida" # AR #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Americana" # AT #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Àustria" # AU #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Austràlia" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Illes Aland" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaidjan" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bòsnia i Hercegovina" # BB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" # BD #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangla Desh" # BE #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Bèlgica" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" # BG #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgària" # BH #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benín" # BM #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudes" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" # BO #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolívia" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasil" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahames" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Illa Bouvet" # BW #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" # BY #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Bielorússia" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" # CA #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canadà" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Illes Cocos (Keeling)" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "República Centreafricana" # CH #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Suïssa" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Costa d'Ivori" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Illes Cook" # CL #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Xile" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camerun" # CN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Xina" # CO #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colòmbia" # CR #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cap Verd" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Illa Christmas" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Xipre" # CZ #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "República Txeca" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Alemanya" # DJ #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" # DK #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dinamarca" # DM #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" # DO #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "República Dominicana" # DZ #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algèria" # EC #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Equador" # EE #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estònia" # EG #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipte" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sàhara Occidental" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" # ES #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Espanya" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiòpia" # FI #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlàndia" # FJ #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Illes Malvines (Falkland)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Estats federats de Micronèsia" # FO #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Illes Fèroe" # FR #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "França" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "França metropolitana" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Regne Unit" # GD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" # GE #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Geòrgia" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guaiana Francesa" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" # GI #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" # GL #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenlàndia" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gàmbia" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" # GP #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadalupe" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinea Equatorial" # GR #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grècia" # GS # fuzzy #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Illes Geòrgia del Sud i Sandwich del Sud" # GT #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" # GU #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea Bissau" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" # HK #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Illa Heard i illes McDonald" # HN #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Hondures" # HR #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croàcia" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haití" # HU #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hongria" # ID #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonèsia" # IE #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanda" # IL #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Illa de l'home" # IN #: zypp/CountryCode.cc:261 msgid "India" msgstr "Índia" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Territori Britànic de l'Oceà Índic" # IQ #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraq" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" # IS #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islàndia" # IT #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Itàlia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" # JM # fuzzy #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" # JO #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordània" # JP #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japó" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirguizistan" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodja" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comores" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Christopher i Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Corea del Nord" # ZA #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Corea del Sud" # KW #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Illes Caiman" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakhstan" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "República democràtica popular de Laos" # LB #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Líban" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Santa Lucia" # LI #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Libèria" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" # LT #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituània" # LU #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburg" # LV #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letònia" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libèria" # MA #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marroc" # MC #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Mònaco" # MD #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldàvia" # CG #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" # SM #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Sant Martí" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Illes Marshall" # MK #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedònia" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongòlia" # MO # fuzzy #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macau" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Illes Mariannes del Nord" # MQ #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinica" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritània" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" # MT #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Maurici" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Mali" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" # MX #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mèxic" # MY #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malàisia" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Moçambic" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namíbia" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nova Caledònia" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Níger" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Illa Norfolk" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigèria" # NI #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" # NL #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Països Baixos" # NO #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noruega" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" # NR #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauruà" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" # NZ #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nova Zelanda" # OM #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" # PA #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panamà" # PE #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Perú" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinèsia francesa" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nova Guinea" # PH #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipines" # PK #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" # PL #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polònia" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre-et-Miquelon" # PN #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" # PR #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Territori palestí" # PT #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" # PW #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" # PY #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguai" # QA #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Illa de la Reunió" # RO #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Sèrbia" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Rússia" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" # SA #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Aràbia Saudita" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Illes Salomó" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" # SD #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" # SE #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suècia" # SG #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Santa Helena" # SI #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Eslovènia" # SJ # fuzzy #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Illes Svalbard i Jan Mayen" # SK #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Eslovàquia" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somàlia" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome i Príncipe" # SV #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Síria" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swazilàndia" # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Illes Turks i Caicos" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Txad" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Territoris Francesos del Sud" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" # TH #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tailàndia" # TJ #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadjikistan" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelauès" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" # TN #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunísia" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor Oriental" # TR #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turquia" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinitat i Tobago" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvaluà" # TW # fuzzy #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tailàndia" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzània" # UA #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ucraïna" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Illes Perifèriques Menors dels EUA" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Estats Units" # UY #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguai" # UZ #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Ciutat del Vaticà (Santa Seu)" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent i les Grenadines" # VE #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Veneçuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Illes Verges Britàniques" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Illes Verges Americanes" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Illes Wallis i Futuna" # WS #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" # YE #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Iemen" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" # ZA #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Sud-àfrica" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zàmbia" # ZW #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Proporciona" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Necessita prèviament" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Requereix" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Té conflicte" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Fa obsolet" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recomana" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Suggereix" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Millora" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Complementa" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "L'idioma és desconegut: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Àfar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhàzia" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Atjeh" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adigué" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Llengües afroasiàtiques (altres)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Àkan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Accadi" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanès" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutià" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Llengües algonquines" # ZA #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altaic meridional" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amhàric" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Anglès antic (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Llengües Apatxe" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Àrab" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Arameu" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonès" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armeni" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucà" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Llengües artificials (altres)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arauac" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamès" # AT #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturià" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Llengües atapascanes" # AU #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Llengües australianes" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Àvar" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avèstic" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Àzeri" # CA #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Llengües bamileké" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Baixkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Balutxi" # GM #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinès" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basc" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Llengües bàltiques (altres)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorús" # BM #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" # SN #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengalí" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Llengües berbers (altres)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" # BH #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" # BJ #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Blackfoot" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Llengües bantus (altres)" # BW #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosni" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Francès" # ID #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonèsia)" # BG #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugui" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Búlgar" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birmà" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Bilin" # TD #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Llengües ameríndies d'Amèrica Central (altres)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Català" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Llengües caucàsiques (altres)" # LB #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Llengües cèltiques (altres)" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" # CN #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Txibtxa" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Txetxè" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Txagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Xinès" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" # ML #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Pidgin Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Eslavònic" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Txuvaix" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Xeienne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Llengües txàmiques" # CR #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Copte" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Còrnic" # CR #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Cors" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Criolls i pidgins (basats en l'anglès) (altres)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Criolls i pidgins (basats en el francès) (altres)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Criolls i pidgins (basats en el portuguès) (altres)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tàrtar de Crimea" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Llengües criolles i pidgins (altres)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Caixubi" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Llengües cuixítiques (altres)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Txec" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danès" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Darguà" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Daiak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (atapascà)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Llengües dravidianes (altres)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Baix sòrab" # PW #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Neerlandès mitjà (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Holandès" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egipci antic" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamita" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Anglès" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Anglès mitjà (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonià" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Feroès" # HT #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" # FJ #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijià" # PH #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Pilipí" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finès" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Llengües finoúgriques (altres)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francès" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francès mitjà (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francès antic (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisó" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Ful" # FI #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friülès" # GU #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" # GA #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" # LY # fuzzy #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Llengües germàniques (altres)" # GE #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgià" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Alemany" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Gueez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertès" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaèlic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandès" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Gallec" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Alt alemany mitjà (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Alt alemany antic (ca.750-1050)" # IN #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gòtic" # GA #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grec antic (fins el 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grec modern (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guaraní" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Crioll haitià" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Haussa" # HT #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaià" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebreu" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" # IN #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" # HT #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hitita" # TO #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Alt Sorab" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Hongarès" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandès" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" # LT #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Ilocà" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Associació de la Llengua Auxiliar Internacional)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Llengües indoàries (altres)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesi" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Llengües indoeuropees (altres)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingúix" # IN #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Llengües iràniques (altres)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Iroquès" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italià" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanès" # LB #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonès" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeopersa" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeoàrab" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Cabilenc" # BH #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Grenlandès" # GM #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" # CA #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Caixmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" # MW #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardí" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Llengües khoisanes (altres)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanès" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuiu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirguís" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Congo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreà" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Balkar, karatxai" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" # PA #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kúmik" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurd" # KE #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" # LB #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Judeocastellà" # UG #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Panjabi occidental" # GM #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" # LB #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laosià" # LV #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Llatí" # LV #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letó" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lesguià" # LU #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburguès" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" # LT #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituà" # CG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" # LU #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburguès" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseño" # SD #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (de Kenya i Tanzània)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedònic" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurès" # MW #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallès" # ML #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" # MG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" # MY #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malaialam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Manding" # ML #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Llengües autronèsies (altres)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Massai" # MT #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malai" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Mordovià moksha" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Gaèlic irlandès mitjà (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Micmac" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Llengües mixtes" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Llengües monkhmers (altres)" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgaix" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltès" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manxú" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Llengües manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" # MD #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldau" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Llengües múltiples" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Llengües mundes" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandès" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Llengües maies" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Mordovià erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nàhuatl" # MP #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Llengües ameríndies septentrionals (altres)" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolità" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele meridional" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele septentrional" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Baix alemany" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalès" # NP #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Newari" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Llengües nigerokurdufanianes (altres)" # NU #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "(Noruec) nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "(Noruec) bokmal" # TO #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Noruec antic" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Noruec" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho del nord" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Llengües nubianes" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari clàssic" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Nyanja" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occità (després de 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osset" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turc otomà (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Llengües otomíes" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Llengües papús (altres)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinà" # PW #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" # PY #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" # PA #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" # PW #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauà" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persa antic (ca.600-400 aC)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persa" # PH #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Llengües filipines (altres)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenici" # ML #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polonès" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Ponapeà" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portuguès" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Pràcrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provençal antic (fins al 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Paixtú" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quítxua" # TJ #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" # JP #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Llengües romàniques (altres)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Retoromànic" # RO #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romaní" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romanès" # RE #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Kirundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rus" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" # WS #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Iacut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Llengües ameríndies meridionals (altres)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Llengües salish" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Arameu samarità" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sànscrit" # WS #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbi" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilià" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croat" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Llengües semítiques (altres)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Gaèlic irlandès antic (fins 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Llengües de signes" # SD #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" # WS #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singalès" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Llengües sioux (altres)" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Llengües sinotibetanes (altres)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Llengües eslaves (altres)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Eslovac" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Eslovè" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sami meridional" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Sami septentrional" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Llengües samis (altres)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Sami de Lule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Sami d'Inari" # WS #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoà" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Sami skolt" # SI #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" # SD #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdià" # SO #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" # TO #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, sud" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Espanyol" # MR #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sard" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Llengües niloticosaharianes (altres)" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swazi" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" # SD #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sondanès" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumeri" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Suahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Suec" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siríac" # TW # fuzzy #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitià" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Llengües tai (altres)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tàmil" # QA #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tàtar" # BE #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" # TJ #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadjik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagàlog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tai" # TW # fuzzy #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetà" # NE #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigré" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek (tamazight)" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tongà (Illes Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" # BW #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" # TR #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turcman" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Llengües tupís" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turc" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Llengües altaïques (altres)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" # TN #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvinià" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Votiac" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugarític" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uigur" # UA #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ucraïnès" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Sense determinar" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdú" # UZ #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbek" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamita" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Llengües wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" # PY #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Gal·lès" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sòrab" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Való" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wòlof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Calmuc" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapeà" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jiddisch" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Ioruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapoteca" # GD #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "(Tamazight) zenaga" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" # TV #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Es faran les accions següents:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "desconegut" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "no suportat" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Nivell 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Nivell 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Nivell 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Contracte addicional de client necessari" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Descatalogat i substituït per un paquet diferent" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "invàlid" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "El nivell de suport no està especificat." #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "El proveïdor ja no n'ofereix suport." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Determinació de problema, la qual cosa significa suport tècnic dissenyat per " "oferir compatibilitat d'informació, assistència d'instal·lació, suport d'ús, " "manteniment continu i resolució bàsica de problemes. El suport de nivell 1 " "no està pensat per corregir errors de defecte del producte." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "L'aïllament de problemes, que significa el suport tècnic dissenyat per " "duplicar els problemes del client, aïlla l'àrea del problema i proporciona " "la solució dels problemes no resolts pel nivell 1 de suport." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Resolució de problema, la qual cosa significa suport tècnic dissenyat per " "resoldre problemes complexos a través d'enginyeria de resolució de defectes " "de producte que s'han identificat amb el suport de nivell 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Un contracte addicional de client és necessari per obtenir-ne suport." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "El paquet s'ha descatalogat i s'ha substituït per un paquet nou amb un nom " "diferent." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Opció de suport desconeguda. No n'hi ha descripció disponible." #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "La gestió del sistema està blocada per l'aplicació amb el pid %d (%s).\n" "Tanqueu aquesta aplicació abans de tornar-ho a provar." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Mode de coincidència desconegut: \"%s\"" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Mode de coincidència desconegut \"%s\" per al patró %s" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Expressió regular no vàlida \"%s\": regcomp ha respost %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Expressió regular no vàlida: \"%s\"" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Cal autenticació per a '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Es tornarà a intentar..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Es deixarà estar després de %1% intents." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visiteu el Centre de clientela de SUSE per comprovar si el vostre registre " "és vàlid i no ha caducat." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visiteu el Novell Customer Center per comprovar si el vostre registre encara " "és vàlid i no ha caducat." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Crea un punt d'adjunció: no es pot trobar un directori d'escriptura per " "crear un punt d'adjunció." #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Si us plau, instal·leu primer el paquet lsof." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "No es pot crear el directori cau de metadades." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Error en intentar llegir de '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "No es pot crear %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Ha fallat recuperar les metadades noves del repositori." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "Ha fallat posar a la memòria cau el repositori (no s'ha pogut iniciar " "repo2solv)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Error a l'hora de carregar el repositori (%d) a la memòria cau." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Construint la memòria cau del repositori %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" "No es pot crear la memòria cau a %s - no se'n té permisos d'escriptura." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Ha fallat posar a la memòria cau el repositori %1%." #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Tipus de repositori no manejat" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Afegint el repositori %s" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nom de repositori no vàlid a \"%s\"" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "No es pot obrir el fitxer %s per a l'escriptura." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Error desconegut a l'hora de llegir '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "No es pot llegir el directori del repositori %1%: permís denegat" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Error a l'hora de llegir el directori %s" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "No es pot llegir el fitxer de repositori %1%: permís denegat" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Netejant metadades" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Netejant paquets" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Netejant directoris de la cau" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Netejant el directori: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Netejant la cau" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Carregant de la cau" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Suprimint el repositori %s" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "No es pot esbrinar on es desa el repositori." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "No es pot esborrar %s" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Modificant el repositori" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Refrescant el repositori: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "No s'ha sabut trobar on es guarda el servei." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Servei desconegut \"%1%\": suprimint el repositori de serveis orfe %2%" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "L'àlies del repositori no pot començar amb un punt." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "L'àlies del servei no pot començar amb un punt." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "No hi ha cap resum per al fitxer %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Resum desconegut %s per al fitxer %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Ha fallat la verificació del resum del fitxer %s." #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "El fitxer %s no està signat. Continuo?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "El fitxer %s del repositori %s no està signat. Continuo?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Voleu rebutjar la clau, confiar-hi temporalment o confiar-hi sempre?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nom de la clau: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "S'ha rebut %1% clau de signatura de paquets nova del repositori %2%:" msgstr[1] "" "S'han rebut %1% claus de signatura de paquets noves del repositori %2%:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Ha fallat la verificació de la signatura per al fitxer %1%." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Ha fallat la verificació de la signatura per al fitxer %1% del repositori " "%2%." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Continuo?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "El fitxer %s està signat amb una clau desconeguda: %s. Continuo?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "El fitxer %s del repositori %s està signat amb una clau desconeguda: %s. " "Continuo?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "El repositori %1% no defineix URL \"gpgkey=\" addicionals." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Cercant la clau gpg amb l'ID %1% al repositori %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Cercant la clau gpg amb l'ID %1% a la cau %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Falta l'atribut requerit \"%s\"." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Són necessaris l'atribut \"%s\" o \"%s\", o bé tots dos." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Ha fallat la verificació de la signatura" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "El paquet %s sembla que s'ha corromput durant la transferència. Voleu " "intentar baixar-lo de nou?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "El paquet %s no s'ha pogut obtenir. Voleu intentar baixar-lo de nou?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "La comprovació de l'applydeltarpm ha fallat." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "ha fallat aplicar de l'RPM delta." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "No hi ha permís per escriure la memòria cau del repositori." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "El servei de complements (plugin) no permet canviar-ne un atribut." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "No es pot proporcionar el fitxer %s des del repositori %s" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "No URL al repositori." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Mitjà esperat: %1%/%2%. Identificat pel fitxer %3% amb aquest contingut:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "El fitxer %1%\n" " del paquet\n" " %2%\n" " té conflicte amb el fitxer del paquet\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "El fitxer %1%\n" " del paquet\n" " %2%\n" " té conflicte amb el fitxer de la instal·lació de\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "El fitxer %1%\n" " de la instal·lació de\n" " %2%\n" " té conflicte amb el fitxer del paquet\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "El fitxer %1%\n" " de la instal·lació de\n" " %2%\n" " té conflicte amb el fitxer de la instal·lació de\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "El fitxer %1%\n" " del paquet\n" " %2%\n" " té conflicte amb el fitxer\n" " %3%\n" " del paquet\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "El fitxer %1%\n" " del paquet\n" " %2%\n" " té conflicte amb el fitxer\n" " %3%\n" " de la instal·lació de\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "El fitxer %1%\n" " de la instal·lació de\n" " %2%\n" " té conflicte amb el fitxer\n" " %3%\n" " del paquet\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "El fitxer %1%\n" " de la instal·lació de\n" " %2%\n" " té conflicte amb el fitxer\n" " %3%\n" " de la instal·lació de\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "No es pot crear sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "trenca %s ignorant-ne algunes de les dependències" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "ignora generalment algunes dependències" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "el %1% instal·lat no pertany a un repositori d'actualització de la " "distribució i s'ha de reemplaçar" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" "el %1% per instal·lar no pertany a un repositori d'actualització de la " "distribució" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "el %1% instal·lat té una arquitectura inferior" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "el %1% per instal·lar té una arquitectura inferior" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problema amb el %1% instal·lat" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "demandes conflictives" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "problemes de dependències" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "no hi ha res que proporcioni el %1% requerit" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Heu habilitat tots els repositoris requerits?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "el paquet requerit %1% no existeix" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "petició no suportada" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "%1% és proporcionat pel sistema i no es pot esborrar" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% no és instal·lable" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "no hi ha res que proporcioni %1%, necessari per al %2% instal·lat" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "no hi ha res que proporcioni %1%, necessari per al %2% per instal·lar" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "no es poden instal·lar tots dos: %1% i %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "el %1% instal·lat té conflicte amb %2%, proporcionat per l'instal·lat %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "el %1% instal·lat té conflicte amb el %2%, proporcionat per %3% per " "instal·lar" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "el %1% per instal·lar té conflicte amb %2%, proporcionat per l'instal·lat %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "el %1% per instal·lar té conflicte amb el %2%, proporcionat per %3% per " "instal·lar" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "el %1% instal·lat fa obsolet %2%, proporcionat per l'instal·lat %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "el %1% instal·lat fa obsolet %2%, proporcionat per %3% per instal·lar" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "el %1% per instal·lar fa obsolet %2%, proporcionat per l'instal·lat %3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "el %1% per instal·lar fa obsolet %2%, proporcionat per %3% per instal·lar" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "el %1% instal·lat té conflicte amb %2%, proporcionat per si mateix" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "el %1% per instal·lar té conflicte amb %2%, proporcionat per si mateix" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "el %1% instal·lat requereix %2%, però aquest requisit no es pot proporcionar" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "el %1% per instal·lar requereix %2%, però aquest requisit no es pot " "proporcionar" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "proveïdors suprimits: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "proveïdors no desistal·lables: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "proveïdors no desinstal·lables: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% encara no s'ha integrat plenament a %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Normalment voleu mantenir el PTF (format de text net) i opteu per no " "instal·lar els pedaços de manteniment." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "La supressió del PTF %1% instal·lat en aquest context també suprimirà (no " "substituirà!) els paquets PTF inclosos." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "El PTF s'hauria de suprimir cridant %1%. Això actualitzarà els paquets PTF " "inclosos en lloc de suprimir-los." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Normalment, voleu mantenir el PTF o opteu per cancel·lar l'acció." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "El %1% instal·lat bloqueja l'acció desitjada." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Normalment, voleu mantenir el PTF i opteu per cancel·lar l'acció." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "suprimeix el bloqueig per permetre la supressió de %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "no instal·lis %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "mantén %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "suprimeix el bloqueig per permetre la instal·lació de %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Aquesta petició trencarà l'estabilitat del sistema!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignora l'avís de sistema trencat" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "no preguntis la instal·lació d'un resoluble que proporcioni %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "no preguntis la supressió de tots els resolubles que proporcionin %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "no instal·lis la versió més recent de %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "mantén %1% malgrat l'arquitectura inferior" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "instal·la %1% malgrat l'arquitectura inferior" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "mantén obsolet %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "instal·la %1% des d'un repositori exclòs" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "instal·la %1% tot i que ha estat retret" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "permet instal·lar el PTF (format de text net) %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "instal·la %1% tot i que és a la llista negra" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "degradació de %1% a %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "canvi d'arquitectura de %1% a %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "instal·la %1% (amb canvi de proveïdor)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "instal·la %1% del proveïdor %2%\n" " i reemplaça %3% del proveïdor %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "reemplaçament de %1% per %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "desinstal·lació de %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Executant scripts posteriors a la transacció" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Executant l'script %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Sortida de l'script %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "La instal·lació s'ha avortat tal com heu indicat." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " executat" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " ha fallat l'execució" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s ja s'ha executat com a %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " execució omesa mentre s'avortava" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" "S'ha produït un error durant l'enviament de la notificació d'actualització." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nou missatge d'actualització" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Senyal rebut: \"%1% (%2%)\", per garantir la coherència del sistema, no és " "possible cancel·lar una transacció rpm en execució." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "No s'ha pogut executar la transacció a causa dels problemes següents:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "No s'ha trobat cap rèplica." #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "No s'ha pogut crear el fitxer de destinació." #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "Ja a la memòria cau" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "No s'ha pogut canviar el nom del fitxer temporal." #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "Acabat" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "Cancel·lat per l'usuari." #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Ha fallat l'RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Error a l'hora d'importar la clau pública %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Ha fallat suprimir la clau pública %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "La capçalera del paquet no està signada!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "El contingut del paquet no està signat!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Fitxers de configuració modificats per a %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "L'rpm ha desat %s com a %s però no ha estat possible determinar-ne la " "diferència" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "L'rpm ha desat %s com a %s.\n" "Aquestes són les primeres 25 línies de diferència:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "L'rpm ha creat %s com a %s però no ha estat possible determinar-ne la " "diferència" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "L'rpm ha creat %s com a %s.\n" "Aquestes són les primeres 25 línies de diferència:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Sortida addicional de l'rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "còpia de seguretat creada %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "La signatura és correcta" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tipus de signatura desconeguda" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "La signatura no es verifica" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "La signatura és correcta, però no és de confiança" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "La clau pública de signatures no està disponible" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "El fitxer no existeix o la signatura no es pot comprovar" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "El fitxer no està signat." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "no caduca" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "va caducar el %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "caduca el %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(no caduca)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(CADUCADA)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(caduca d'aquí a 24 h)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(caduca d'aquí a %d dia)" msgstr[1] "(caduca d'aquí a %d dies)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "S'ha provat d'importar la clau no existent %s a l'anell de claus %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Ha fallat importar la clau." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Error a l'hora d'esborrar la clau." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "El fitxer de la firma diginal %s no s'ha trobat" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tipus dubtós %s per a byte %u, suma de verificació \"%s\"" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "No es pot obrir pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "No es pot obrir pipe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "La cadena de consulta de l'URL de l'LDAP no és vàlida" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "El paràmetre de consulta de l'URL de l'LDAP \"%s\" no és vàlid" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "No es pot clonar l'objecte de l'URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "La referència d'objecte de l'URL buit no és vàlida" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "No es poden analitzar els components de l'URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historial:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "L'esquema de l'URL no permet un %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "El component %s no és vàlid %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Component de %s no vàlid" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "No s'admet l'anàlisi de cadenes de consulta per a aquesta URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "L'esquema de l'URL és un component necessari" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "L'esquema de l'URL \"%s\" no és vàlid" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "L'esquema de l'URL no permet un nom d'usuari" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "L'esquema de l'URL no permet una contrasenya" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "L'esquema de l'URL requereix un component d'amfitrió" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "L'esquema de l'URL no permet un component d'amfitrió" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "El component d'amfitrió \"%s\" no és vàlid." #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "L'esquema de l'URL no permet un port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "El component de port \"%s\" no és vàlid" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "L'esquema de l'URL requereix un nom de camí" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "No es permet un camí relatiu si existeix una autoritat" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "La cadena codificada conté un byte NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "El caràcter separador de divisió de matriu de paràmetres no és vàlid" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" "El caràcter separador de divisió d'assignació de paràmetres no és vàlid" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "El caràcter separador d'unió de matriu de paràmetres no és vàlid" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "L'ordre ha acabat amb l'estatus %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "L'ordre s'ha aturat a causa del senyal %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "L'ordre s'ha executat sense que hi hagués cap error conegut." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "S'han donat arguments de generació no vàlids." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "No es pot crear la canonada de control." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "No es pot fer chroot a \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "No es pot fer chdir a \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "No es pot fer chdir a \"%s\" dins chroot \"%s\" (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "No es pot executar \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "No es pot bifurcar (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "No es pot executar %s, ha fallat l'ordre chdir (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "No es pot executar %s, ha fallat l'ordre chroot (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "No es pot executar %s, ha fallat l'ordre exec (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "No es pot executar %s, error inesperat." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Error a l'hora de muntar %s a %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Error a l'hora de desmuntar %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Mal nom de fitxer: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Mitjà no obert quan s'intentava fer l'acció \"%s\"." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "El fitxer %s no s'ha trobat al mitjà %s" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "No es pot escriure al fitxer %s." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "No hi ha un mitjà connectat" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Mal punt de contacte del mitjà" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "L'inici de la baixada (curl) ha fallat per a \"%s\"" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Excepció de sistema \"%s\" al mitjà \"%s\"." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "El camí \"%s\" del mitjà \"%s\" no és un fitxer." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "La ruta \"%s\" del suport %s no és un directori." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Malformat URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nom d'hoste buit a l'URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Sistema de fitxers buit a l'URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destinació buida a l'URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "L'esquema d'URL a %s no és vàlid." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operació no admesa pel mitjà" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Error de baixada (curl) per a %s:\n" "Codi d'error: %s\n" "Missatge d'error: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Hi ha hagut un error en establir les opcions de baixada (curl) per a %s:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "El suport font \"%s\" no conté el mitjà desitjat." #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "El mitjà \"%s\" l'està fent servir una altra instància." #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "No es pot expulsar el mitjà" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "No es pot expulsar el suport %s" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Permís per accedir a %s denegat." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "S'ha acabat el temps d'espera accedint a %s." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "Les dades baixades excedeixen la mida de fitxer esperada \"%s\" de \"%s\"." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "El lloc \"%s\" és temporalment inaccessible." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Problema de certificat SSL, verifiqueu que el certificat CA és correcte per " "a \"%s\"." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "No hi ha recursos lliures disponibles per adjuntar el mitjà." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Mètode d'autenticació HTTP no suportat \"%s\"" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Error de baixada (curl) per a %s.\n" "Codi de l'error: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Error de baixada (curl) per a %s.\n" "No es pot obtenir la resposta d'HTTP.\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Sí" #: zypp-tui/Table.cc:32 msgid "No" msgstr "No" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Atenció!" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Avís!" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Error:" # ID #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "fet" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "atenció" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "error" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Avís! " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Obtenint" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "començant" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "no trobat" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "No hi ha ajuda per a aquesta entrada." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "no hi ha ajuda disponible per a aquesta opció" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "mostra totes les opcions" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "sí" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "no" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "No s'han trobat metadades vàlides a l'URL especificat" #~ msgstr[1] "No s'han trobat metadades vàlides als URL especificats" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Executant l'script %%posttrans \"%1%\"" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Executant scripts %posttrans" #~ msgid "Package is not signed!" #~ msgstr "El paquet no està signat!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s no pertany a un repositori d'actualització de la distribució" #~ msgid "%s has inferior architecture" #~ msgstr "%s té una arquitectura inferior" #~ msgid "problem with installed package %s" #~ msgstr "problema amb el paquet instal·lat %s" #~ msgid "nothing provides requested %s" #~ msgstr "Res proporciona %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Heu habilitat tots els repositoris demanats?" #~ msgid "package %s does not exist" #~ msgstr "el paquet %s no existeix" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s està proveït pel sistema i no es pot esborrar" #~ msgid "%s is not installable" #~ msgstr "%s no és instal·lable" #~ msgid "nothing provides %s needed by %s" #~ msgstr "Res proporciona %s, necessari per a %s" #~ msgid "cannot install both %s and %s" #~ msgstr "No es poden instal·lar %s i %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s entra en conflicte amb %s, proveït per %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s fa(n) obsolet(s) %s proveït(s) per %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "" #~ "el(s) paquets(s) instal·lat(s) %s fa(n) obsolet(s) %s proporcionat(s) per " #~ "%s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "" #~ "la resolució %s entra en conflicte amb %s, proporcionat per si mateix" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s necessita %s, però aquest requeriment no es pot satisfer" #~ msgid "remove lock to allow removal of %s" #~ msgstr "suprimeix el bloqueig per permetre la supressió de %s" #~ msgid "do not install %s" #~ msgstr "no instal·lis %s" #~ msgid "keep %s" #~ msgstr "mantén %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "suprimeix el bloqueig per permetre la instal·lació de %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "no demanis instal·lar un resoluble que proporcioni %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "no demanis suprimir tots els resolubles que proporcionin %s" #~ msgid "do not install most recent version of %s" #~ msgstr "no instal·lis la versió més recent de %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "mantén %s malgrat l'arquitectura inferior" #~ msgid "install %s despite the inferior architecture" #~ msgstr "instal·la %s, encara que tingui una arquitectura inferior" #~ msgid "keep obsolete %s" #~ msgstr "deixa obsolet %s" #~ msgid "install %s from excluded repository" #~ msgstr "instal·la %s del repositori exclòs" #~ msgid "downgrade of %s to %s" #~ msgstr "degradació de %s a %s" #~ msgid "architecture change of %s to %s" #~ msgstr "canvi d'arquitectura de %s a %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "instal·la %s (amb canvi de proveïdor)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "reemplaçament de %s per %s" #~ msgid "deinstallation of %s" #~ msgstr "desinstal·lació de %s" #~ msgid "Can't open lock file: %s" #~ msgstr "No es pot obrir el fitxer de blocatge: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Aquesta acció ja l'està executant un altre programa." #~ msgid "Hal Exception" #~ msgstr "Excepció de Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Perdoneu, però aquesta versió de libzypp va ser construïda sense suport " #~ "de HAL." #~ msgid "HalContext not connected" #~ msgstr "El HalContext no està connectat" #~ msgid "HalDrive not initialized" #~ msgstr "El HalDrive no està iniciat" #~ msgid "HalVolume not initialized" #~ msgstr "El HalVolume no està iniciat" #~ msgid "Unable to create dbus connection" #~ msgstr "No es pot crear la connexió dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: No es pot crear el context libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: No es pot definir la connexió de dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "No es pot iniciar el context HAL. No s'executa hald?" #~ msgid "Not a CDROM drive" #~ msgstr "No és una unitat de CD-ROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "No es poden iniciar els atributs de mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "No es pot definir l'atribut de mutex recursiu" #~ msgid "Can't initialize recursive mutex" #~ msgstr "No es pot iniciar el mutex recursiu" #~ msgid "Can't acquire the mutex lock" #~ msgstr "No es pot obtenir el bloqueig de mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "No es pot alliberar el bloqueig de mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Error a l'hora d'importar la clau pública del fitxer %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Error en eliminar la clau pública %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "No es pot trobar un dispositiu de bucle disponible per muntar el fitxer " #~ "d'imatge de \"%s\"" #~ msgid "generally ignore of some dependecies" #~ msgstr "generalment ignora algunes dependències" #~ msgid "do not forbid installation of %s" #~ msgstr "no prohibeixis la instal·lació de %s" #~ msgid "do not keep %s installed" #~ msgstr "no mantinguis %s instal·lat" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "لا يمكن إنشاء المفتاح العام %s من %s إلى ملف حلقة المفاتيح %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "حاول استيراد مفتاح غير موجود %s إلى حلقة مفاتيح %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "لا يمكن تغيير مجلد العمل '/' داخل استجذار (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "فشل تهيئة تحميل (Metalink curl) '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "تحميل (metalink curl) خطأ '%s':\n" #~ "رمز الخطأ: %s\n" #~ "رسالة الخطأ: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "توقف التحميل في %d%%" #~ msgid "Download interrupted by user" #~ msgstr "توقف التحميل بواسطة المستخدم" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "حدث خطأ أثناء إعداد خيارات التحميل (metalink curl) ل '%s':" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "No es pot obrir %s - %s\n" #~ msgid "Serbia and Montenegro" #~ msgstr "Sèrbia i Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "L'opció list és desconeguda" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "no s'han pogut resoldre dependències" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "El fitxer %s no conté cap suma de verificació.\n" #~ "Voleu utilitzar aquest fitxer de tota manera?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "El fitxer %s no ha superat la comprovació d'integritat amb la següent " #~ "clau:\n" #~ "%s|%s|%s\n" #~ "Voleu utilitzar el fitxer de tota manera?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "El fitxer %s conté una suma de verificació no vàlida.\n" #~ "S'esperava %s, i s'ha trobat %s\n" #~ "Voleu utilitzar aquest fitxer de tota manera?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "El fitxer %s conté la suma de verificació desconeguda %s.\n" #~ "Voleu utilitzar aquest fitxer de tota manera?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "El fitxer %s no està signat.\n" #~ "Voleu utilitzar-lo de tota manera?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "El fitxer %s s'ha signat amb una clau desconeguda:\n" #~ "%s|%s|%s\n" #~ "Voleu utilitzar aquest fitxer de tota manera?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "S'ha trobat una clau no fiable:\n" #~ "%s|%s|%s\n" #~ "Voleu que la clau sigui de confiança?" #~ msgid "%s remove failed" #~ msgstr "S'ha produït un error en suprimir %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "La contrasenya de la CA no és vàlida." #~ msgid "rpm output:" #~ msgstr "Sortida de l'rpm:" #~ msgid "%s install failed" #~ msgstr "S'ha produït un error en instal·lar %s" #~ msgid "%s installed ok" #~ msgstr "%s s'ha instal·lat correctament" #~ msgid "%s remove ok" #~ msgstr "%s s'ha suprimit correctament" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "" #~ "%s proporciona aquesta dependència però canviaria l'arquitectura de " #~ "l'element instal·lat" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "" #~ "%s proporciona aquesta dependència però canviaria l'arquitectura de " #~ "l'element instal·lat" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "No instal·lis ni suprimeixis els ítems amb dependències relacionats" #~ msgid "Ignore that %s is already set to install" #~ msgstr "Ignora que %s ja s'ha definit per a instal·lar-se" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "Ignora l'obsolet %s a %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "Ignora aquest conflicte de %s" #~ msgid "Ignore this requirement just here" #~ msgstr "Ignora aquest requisit només en aquest cas" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "Instal·la %s, encara que canviï l'arquitectura" #~ msgid "Install missing resolvables" #~ msgstr "Instal·la els ítems amb dependències que falten" #~ msgid "Keep resolvables" #~ msgstr "Conserva els ítems amb dependències" #~ msgid "Unlock these resolvables" #~ msgstr "Desbloqueja aquests ítems amb dependències" #~ msgid "delete %s" #~ msgstr "suprimeix %s" #~ msgid "install %s" #~ msgstr "instal·la %s" #~ msgid "unlock %s" #~ msgstr "desbloqueja %s" #~ msgid "unlock all resolvables" #~ msgstr "desbloqueja tots els ítems amb dependències" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "No es pot obrir el fitxer %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "Error en llegir el sector %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "No s'admet l'anàlisi de paràmetres de camí per a aquesta URL" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "No s'admet l'anàlisi de paràmetres de camí per a aquesta URL" #~ msgid "Software management is already running." #~ msgstr "Ja s'està executant la gestió del programari." #~ msgid "%s is replaced by %s" #~ msgstr "%s s'ha reemplaçat per %s" #~ msgid "%s replaced by %s" #~ msgstr "%s ha estat reemplaçat per %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "Aquests ítems amb dependències es suprimiran del sistema." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s no es desinstal·larà perquè encara es necessita" #~ msgid "Invalid information" #~ msgstr "La informació no és vàlida" #~ msgid "%s is needed by other resolvables" #~ msgstr "Altres ítems amb dependències necessiten %s" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s requereix:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s entra en conflicte amb altres ítems amb dependències" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s entra en conflicte amb:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s desactualitza altres ítems amb dependències" #~ msgid "%s obsoletes:%s" #~ msgstr "%s desactualitza:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "Aquests ítems amb dependències es suprimiran del sistema." #~ msgid "%s depends on other resolvables" #~ msgstr "%s depèn d'altres ítems amb dependències" #~ msgid "%s depends on %s" #~ msgstr "%s depèn de %s" #~ msgid "%s depends on:%s" #~ msgstr "%s depèn de:%s" #~ msgid "Child of" #~ msgstr "Fill de" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "No hi ha cap recurs disponible que admeti aquest requisit." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "Atesos els problemes descrits anteriorment o a continuació, aquesta " #~ "resolució no resoldrà totes les dependències" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "No es pot instal·lar %s perquè entra en conflicte amb %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s no s'ha instal·lat i s'ha marcat com a no instal·lable" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s té requisits no complerts" #~ msgid "%s has missing dependencies" #~ msgstr "Falten dependències per a %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s no es pot instal·lar atès que falten dependències" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s compleixen les dependències de %s però es desinstal·laran" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s compleixen les dependències de %s però es conservaran al sistema" #~ msgid "No need to install %s" #~ msgstr "No cal instal·lar %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "No es pot instal·lar %s per a complir les dependències de %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "No es pot instal·lar %s per a complir les dependències de %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s no es desinstal·larà perquè encara es necessita" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "" #~ "%s desactualitza %s. No obstant, %s no es pot suprimir perquè està " #~ "bloquejat." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "No es pot instal·lar %s perquè entra en conflicte" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s no es pot instal·lar atesos els conflictes amb %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "per a requerir %s per a %s en actualitzar %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "A %s li falta el requisit %s" #~ msgid ", Action: " #~ msgstr ", Acció: " #~ msgid ", Trigger: " #~ msgstr ", Activador: " #~ msgid "package" #~ msgstr "paquet" #~ msgid "selection" #~ msgstr "selecció" #~ msgid "pattern" #~ msgstr "patró" #~ msgid "product" #~ msgstr "producte" #~ msgid "patch" #~ msgstr "pedaç" #~ msgid "script" #~ msgstr "script" #~ msgid "message" #~ msgstr "missatge" #~ msgid "atom" #~ msgstr "àtom" #~ msgid "system" #~ msgstr "sistema" #~ msgid "Resolvable" #~ msgstr "Resolvable" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "Es marcarà aquest intent de resolució com a no vàlid." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "Es marcarà l'ítem amb dependències %s com a no instal·lable" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s s'ha programat per a instal·lar-se, però això no és possible per " #~ "problemes de dependència." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "No es pot instal·lar %s perquè ja s'ha marcat com a que necessita " #~ "desinstal·lar-se" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "No es pot instal·lar %s perquè no s'aplica a aquest sistema." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "No es pot instal·lar %s perquè %s ja s'ha marcat com a que necessita " #~ "instal·lar-se" #~ msgid "This would invalidate %s." #~ msgstr "%s quedaria invalidat." #~ msgid "Establishing %s" #~ msgstr "S'està establint %s" #~ msgid "Installing %s" #~ msgstr "S'està instal·lant %s" #~ msgid "Updating %s to %s" #~ msgstr "S'està actualitzant %s a %s" #~ msgid "Skipping %s: already installed" #~ msgstr "S'està ignorant %s: ja s'ha instal·lat" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "No hi ha cap altre proveïdor alternatiu instal·lat de %s" #~ msgid "for %s" #~ msgstr "per a %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "" #~ "No és possible actualitzar a %s per tal d'evitar que es suprimeixi %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s proporciona %s, però s'ha programat per a desinstal·lar-se." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "" #~ "%s proporciona %s, però ja hi ha instal·lada una altra versió d'aquest %s." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s proporciona %s, però no és instal·lable. Proveu d'instal·lar-lo per sí " #~ "mateix per a més detalls." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s proporciona %s, però està bloquejat." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s proporciona %s, però s'ha programat per a conservar-se." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s proporciona %s, però té una altra arquitectura." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "No es pot satisfer el requisit %s per a %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "Un altre ítem amb dependències instal·lat necessita %s, de manera que no " #~ "es desenllaçarà." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "Un altre ítem amb dependències instal·lat necessita %s, de manera que no " #~ "es desenllaçarà." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s està bloquejat i no es pot desinstal·lar." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "" #~ "Per causa d'un conflicte relacionat amb %s (%s), cal suprimir el %s que " #~ "s'ha d'instal·lar" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "" #~ "A causa de conflictes relacionats amb %s, es marcarà %s com a no " #~ "instal·lable" #~ msgid "from %s" #~ msgstr "de %s" #~ msgid " Error!" #~ msgstr " Error" #~ msgid " Important!" #~ msgstr " Important" #~ msgid "%s depended on %s" #~ msgstr "%s depenia de %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s requereix %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s requereix %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s s'ha reemplaçat per %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s requereix %s" #~ msgid "%s part of %s" #~ msgstr "%s és part de %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "Temps d'espera de doble clic " #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s requereix %s" #~ msgid "Unable to parse Url authority" #~ msgstr "No es pot analitzar l'autoritat de l'URL" #~ msgid "Ignore this requirement generally" #~ msgstr "Ignora aquest requisit de manera general" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "Una altra solució que s'ha d'instal·lar necessita %s, de manera que no es " #~ "desenllaçarà." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "" #~ "No es pot crear un fitxer necessari per a executar la instal·lació de " #~ "l'actualització." #~ msgid "Unable to restore all sources." #~ msgstr "No es poden restaurar tots els recursos." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "Ja s'ha registrat al menys una font; no es poden restaurar les fonts " #~ "emmagatzemades." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "No es pot instal·lar %s per a complir les dependències de %s" #~ msgid "%s dependend on %s" #~ msgstr "%s depend de %s" #~ msgid "Reading index files" #~ msgstr "S'estan llegint els fitxers d'índex" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "" #~ "El fitxer signat repomd.xml no ha superat la comprovació de signatura." #~ msgid "Reading product from %s" #~ msgstr "S'està llegint el producte de %s" #~ msgid "Reading filelist from %s" #~ msgstr "S'està llegint la llista de fitxers de %s" #~ msgid "Reading packages from %s" #~ msgstr "S'estan llegint els paquets de %s" #~ msgid "Reading selection from %s" #~ msgstr "S'està llegint la selecció de %s" #~ msgid "Reading pattern from %s" #~ msgstr "S'està llegint el patró de %s" #~ msgid "Reading patches index %s" #~ msgstr "S'està llegint l'índex de pedaços %s" #~ msgid "Reading patch %s" #~ msgstr "S'està llegint el pedaç %s" #~ msgid "The script file failed the checksum test." #~ msgstr "" #~ "El fitxer de l'script no ha superat la prova de suma de verificació." #~ msgid "Reading packages file" #~ msgstr "S'està llegint el fitxer de paquets" #~ msgid "Reading translation: %s" #~ msgstr "S'està llegint la traducció: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "El paquet %s no ha superat la comprovació d'integritat. Voleu intentar " #~ "baixar-lo de nou o avortar la instal·lació?" #~ msgid " miss checksum." #~ msgstr "falta la suma de verificació." #~ msgid " fails checksum verification." #~ msgstr " no supera la verificació de la suma de verificació." #~ msgid "Downloading %s" #~ msgstr "S'està baixant %s" #, fuzzy #~ msgid "Regarding all resolvables with a compatible architecture." #~ msgstr "" #~ "S'estan capturant els ítems amb dependències que coincideixen amb el " #~ "criteri de cerca definit..." #, fuzzy #~ msgid "Make a solver run with best architecture only." #~ msgstr "" #~ "S'estan capturant els ítems amb dependències que coincideixen amb el " #~ "criteri de cerca definit..." #, fuzzy #~ msgid "Regarding resolvables with best architecture only." #~ msgstr "" #~ "S'estan capturant els ítems amb dependències que coincideixen amb el " #~ "criteri de cerca definit..." libzypp-17.36.5/po/cs.po000066400000000000000000004350331476576476200150110ustar00rootroot00000000000000# translation of zypp.po to # Czech message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 1999-2001 SuSE GmbH. # # Petr Pavlik , 1999, 2000, 2001. # Klara Cihlarova , 2006. # Jakub Hegenbart , 2007. # Marek Stopka , 2008. # Klára Cihlářová , 2008. # Vojtěch Zeisek , 2008. # Marek Stopka , 2008. # Radomír Černoch , 2009. # Vojtěch Zeisek , 2010, 2015. # Vít Pelčák , 2011. # Jan Papež , 2011, 2013, 2014, 2015. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-07-20 10:47+0000\n" "Last-Translator: Aleš Kastner \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 5.6.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Neznámá země: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Žádný kód" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Spojené arabské emiráty" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghánistán" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua a Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albánie" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Arménie" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Nizozemské Antily" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktida" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Americká Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Rakousko" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Austrálie" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Alandské ostrovy" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Ázerbájdžán" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosna a Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladéš" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgie" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulharsko" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrajn" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudy" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunej Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolívie" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazílie" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamy" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhútán" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet Island" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Bělorusko" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosové (Keelingovy) ostrovy" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Středoafrická republika" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Švýcarsko" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Pobřeží slonoviny" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookovy ostrovy" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Čína" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbie" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kostarika" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kapverdy" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Vánoční ostrov" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Kypr" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Česká republika" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Německo" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Džibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dánsko" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikánská republika" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alžírsko" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvádor" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonsko" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypt" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Západní Sahara" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Španělsko" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopie" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finsko" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandské ostrovy (Malvíny)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federativní státy Mikronésie" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faerské ostrovy" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francie" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Kontinentální Francie" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Velká Británie" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gruzie" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Francouzská Guajána" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grónsko" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambie" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Rovníková Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Řecko" # GS # fuzzy #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Jižní Georgie a Jižní Sandwichovy ostrovy" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Ostrov Heard a McDonaldovi ostrovy" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Chorvatsko" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Maďarsko" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonésie" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irsko" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Ostrov Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indie" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britské indické oceánské teritorium" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irák" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Írán" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Itálie" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamajka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordánsko" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonsko" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Keňa" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kyrgyzstán" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodža" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komory" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts a Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Severní Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Jižní Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuvajt" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kajmanské ostrovy" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazachstán" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laoská lidově demokratická republika" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Svatá Lucie" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Lichtenštejnsko" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Srí Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Libérie" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litva" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Lucembursko" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Lotyšsko" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libye" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldávie" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Černá Hora" # SM #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Svatý Martin" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshallovy ostrovy" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonie" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar (Barma)" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolsko" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Severní Mariany" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinik" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritánie" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauricius" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Mali" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malajsie" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibie" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nové Kaledonie" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Ostrov Norfolk" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigérie" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nizozemí" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norsko" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepál" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nový Zéland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omán" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Francouzská Polynésie" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nová Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipíny" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pákistán" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polsko" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre a Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Portoriko" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestinské teritorium" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugalsko" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumunsko" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Srbsko" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Ruská Federace" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudská Arábie" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Šalamounovy ostrovy" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychely" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Súdán" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Švédsko" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Svatá Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovinsko" # SJ # fuzzy #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Ostrovy Svalbard a Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovensko" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somálsko" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Svatý Tomáš a Princův ostrov" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Salvador" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Sýrie" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Svazijsko" # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks a Caicos" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Čad" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Francouzská jižní teritoria" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thajsko" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistán" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistán" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunis" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Východní Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turecko" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad a Tobago" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tchaj-wan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzanie" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrajina" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Menší odlehlé ostrovy Spojených států" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Spojené státy" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistán" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikán" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Svatý Vincenc a Grenadiny" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britské Panenské ostrovy" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Panenské ostrovy, U.S." # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Ostrovy Wallis a Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Jižní Afrika" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambie" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Poskytuje" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Předpokládá" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Vyžaduje" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Konflikty" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Nahrazuje" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Doporučuje" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Navrhuje" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Vylepšuje" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Doplňuje" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Neznámý jazyk: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afarština" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abcházština" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Ačinézština" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afroasijské (jiné)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikánština" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadština" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albánština" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutština" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonkinské jazyky" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Jižní Altaj" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharština" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Angličtina, stará (cca. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apačské jazyky" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabština" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramejština" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonština" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Arménština" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Arakuánština" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Umělý (jiný)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Ásámština" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturian" # modules/inst_language.ycp:93 #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapascanské jazyky" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australské jazyky" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarština" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Jazyk Avesty" # SZ #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Avadhí" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymarština" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Ázerbájdžánština" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Jazyky Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Baškirština" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Bali" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskičtina" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltské (jiné)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Běloruština" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengálština" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berberské (jiné)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhodžpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihárština" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikolština" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Binijština" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantuské (jiné)" # BJ #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosenština" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonština" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonésie)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Burjatština" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugiština" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulharština" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Barmština" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Kado" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Středoamerické indiánské (jiné)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Karibské jazyky" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalánština" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kavkazské (jiné)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuánština" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltské (jiné)" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Čamorština" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Čibština" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Čečenština" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Čagatajské jazyky" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Čínština" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Čukština" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Marijština" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Slang Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctawština" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Čipeva" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Čerokézština" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Církevní slovanština" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Čejenština" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Čamicské jazyky" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptština" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Kornština" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsičtina" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreole a pidgin, založené na angličtině (jiné)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreole a pidgin, založené na francouzštině (jiné)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreole a pidgin, založené na portugalštině (jiné)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Krí" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krymská tatarština" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreole a pidgin (jiné)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kašubština" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Kušitské jazyky (jiné)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "České" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dánské" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Daják" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Athabaské jazyky" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Drávidské jazyky (jiné)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Dolní lužičtina" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Nizozemština, střední (cca 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nizozemština" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Staroegypština" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamština" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Angličtina" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Angličtina, střední (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonské" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faerština" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fidžijština" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipínština" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finské" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Ugrofinské (jiné)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francouzské" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francouzština, střední (cca 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francouzština, stará (842- cca 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Fríština" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fula" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Furlánština" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" # GA #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbejština" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germánské (jiné)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Gruzínština" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Němčina" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Giiz" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertština" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelština" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irština" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galicijština" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manština" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Středohornoněmčina (cca 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Starohornoněmčina (cca 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Góndí" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontálština" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gótština" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Starořečtina (do 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Novořečtina (od 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guaraní" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gudžarátština" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitština" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Havajština" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebrejština" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynonština" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himáčalí" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindština" # HT #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Chetitština" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" # HT #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hirimotu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Horní lužičtina" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Maďarština" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandština" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Ilokánsština" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (IALA)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indické (jiné)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonézština" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoevropské (jiné)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Inguština" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Íránské (jiné)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokézské jazyky" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italština" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Jávština" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonština" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Židovské perské jazyky" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Židovské arabské jazyky" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpakština" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabylština" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kačin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kambština" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannadština" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kašmírština" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanurijština" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazaština" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisanské (jiné)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmérština" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanština" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuju" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kyrgyzština" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkanština" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Konžština" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korejština" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kruština" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuaňama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumykština" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kudština" # KE #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahanda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laoština" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latina" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Lotyština" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburština" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litevština" # CG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Lucemburština" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseňo" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luoština (Keňa a Tanzanie)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonština" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurština" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Maršalština" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" # MG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasarština" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malajámština" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Malinština" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maorština" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronéské (jiné)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Maráthština" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masajština" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malajština" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandarština" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mendeština" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irština, střední (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mikmak" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabauština" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Různé jazyky" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-khmérské (jiné)" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgaština" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltština" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manču" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipurština" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Jazyky manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavština" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolština" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Více jazyků" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Mundské jazyky" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Krík" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Mayské jazyky" # SY # fuzzy #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Severoamerické indiánské" # NP #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolština" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Jižní Ndebele" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Severní Ndebele" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Dolnoněmčina" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepálština" # NP #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepál Bhasa" # printers.ycp.noloc:1270 # printers.ycp.noloc:1270 # printers.ycp.noloc:1270 # printers.ycp.noloc:1270 #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Niačtina" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Nigero-kordofánské (jiné)" # NU #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuečtina" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norština (Nynorsk)" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norština (Bokmal)" # TO #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norština, stará" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norština" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Severní Sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Núbijské jazyky" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newarština" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Čičeva" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankolština" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" # printers.ycp.noloc:1400 # printers.ycp.noloc:1400 # printers.ycp.noloc:1400 # printers.ycp.noloc:1400 #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Okcitánština (po 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Orijština" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osetština" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Osmanská turečtina (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomianské jazyky" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuánština (jiné)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinština" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlaví" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Pandžábština" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palajština" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Staroperština (cca 600-400 př. n. l.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Perština" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipínské (jiné)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Féničtina" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Páli" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polština" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeiština" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugalština" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakritské jazyky" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Staroprovensálština (do 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Paštunština" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Kečuánština" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rádžáshánština" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanuiština (tahitština Velikonočního ostrova - Rapa-Nui)" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongánština (tahitština Velikonočního ostrova - Rapa-Nui)" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Románské (jiné)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Rétorománština" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romština" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumunština" # RE #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundština" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ruština" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandaweština" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sangoština" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Jakutština" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Jihoamerické indiánské (jiné)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salishanské jazyky" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritská Aramejština" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrt" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasačtina" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santálština" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Srbština" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilština" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Skotština" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Chorvatské" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkupština" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitské (jiné)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irština, stará (do 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Znakové řeči" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Šanština" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamské jazyky" # AO #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhalština" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouanské jazyky" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sinotibetské (jiné)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slovanské (jiné)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovenština" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovinština" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Jižní Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Severní Sami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Jazyky Sami (jiné)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lulejská Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inarijská Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoánština" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skoltská Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Šonština" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhština" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Soghdština" # SO #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somálština" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhajština" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Jihosotština" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Španělština" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinština" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Sererština" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilosaharské (jiné)" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundánština" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerština" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Svahilština" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Švédština" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syrština" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitština" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Thajské (jiné)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamilština" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatarština" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugština" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tádžičtina" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalština" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thajština" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetština" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigriňňa" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingonština" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamašek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tongánština (Nyasa)" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tongánština (Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshijské jazyky" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Čwana" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmenština" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Jazyky tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turečtina" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altajské (jiné)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Ťwiština" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvština" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritština" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Ujgurština" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrajinština" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Neurčený" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdština" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbečtina" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamština" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votština" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakashanské jazyky" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Velština" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Lužická srbština" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Valonština" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyčtina" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhoština" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Japština" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jidiš" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Jarubština" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Jazyky yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotécké jazyky" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zandština" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zuluština" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Budou provedeny následující akce:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "neznámé" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nepodporováno" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Úroveň 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Úroveň 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Úroveň 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Je nutné uzavřít se zákazníkem další smlouvu" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Ukončeno a nahrazeno jiným balíčkem" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "neplatné" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Není určena úroveň podpory" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Poskytovatel neposkytuje podporu." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Detekce problému, tedy technická podpora zajišťuje informaci o slučitelnosti " "produktů, asistenci při instalaci a používání, následnou údržbu a základní " "řešení problémů. První úroveň podpory neslouží k opravám chyb v produktu." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Izolace problému, tedy podporu při zreplikování zákazníkova problému, " "specifikace problematického místa a poskytuje řešení problémů, které neřeší " "první úroveň." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Řešení problémů, tj. technická podpora, která řeší složité problémy " "zajištěním technických pracovníků, kteří vyřeší vady produktů zjištěné na " "úrovni 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Získání podpory vyžaduje další smlouvu se zákazníkem." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Balíček byl zrušen/ukončen a byl nahrazen novým balíčkem s jiným názvem." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Neznámá volba podpory. Popis není dostupný" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Správa systému je uzamčena aplikací s identifikátorem PID %d (%s). \n" "Ukončete tuto aplikaci a opakujte akci." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Neznámý mód shody '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Neznámý mód shody '%s' pro rys '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Chybný regulární výraz '%s': regcomp vrátil %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Neplatný regulární výraz: '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Pro '%s' je vyžadováno ověřování" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Zkusím to znovu..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Vzdávám se po %1% pokusech." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Pro kontrolu, zda je Vaše registrace platná a aktivní, navštivte Zákaznické " "centrum SUSE." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Obraťte se na zákaznické centrum společnosti Novell a zkontrolujte, zda je " "vaše registrace platná a zda nevypršela." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Vytvořit bod připojení: Nelze najít adresář, do kterého lze zapisovat, pro " "vytvoření bodu připojení" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Nejprve nainstalujte balíček 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Nelze vytvořit adresář s mezipamětí metadat." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Chyba při čtení z '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Nelze vytvořit %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "Nepodařilo se přenést úložiště do mezipaměti (nelze spustit repo2solv)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Chyba při načítání úložiště do mezipaměti (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Vytváří se vyrovnávací paměť úložiště '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Nelze vytvořit mezipaměť v %s - chybí oprávnění k zápisu." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Nepodařilo se přenést úložiště %1% do mezipaměti" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Nepodporovaný typ úložiště" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Přidává se úložiště %s" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Název souboru úložiště na adrese URL „%s“ je neplatný" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Nelze otevřít soubor '%s' pro zápis." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Neznámá chyba při čtení z '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Nelze číst z adresáře úložiště %1%: Přístup odepřen" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Chyba při čtení z adresáře %s" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Nelze přečíst soubor úložiště %1%: Přístup odepřen" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Čistění metadat" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Čistění balíčků" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Čistění adresářů mezipaměti" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Čistění adresáře: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Čistění mezipaměti" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Načítání z mezipaměti" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Odebírá se úložiště %s" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Nelze zjistit umístění úložiště." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "'%s' nelze smazat" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Úprava úložiště" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Obnovení úložiště: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Nelze zjistit umístění služby." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Neznámá služba '%1%': Odstraňuje se osiřelé úložiště služby '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Alias úložiště nemůže začínat tečkou." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Alias služby nemůže začínat tečkou." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Žádný souhrn pro soubor %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Neznámý souhrn %s pro soubor %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Ověření souhrnu pro soubor '%s' se nezdařilo" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Soubor '%s' není podepsán, pokračovat?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Soubor '%s' z úložiště '%s' není podepsán, pokračovat?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Chcete klíč odmítnout, důvěřovat dočasně, nebo důvěřovat vždy?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Název klíče: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "Získán %1% nový podpisový klíč balíčku z úložiště \"%2%\":" msgstr[1] "Získány %1% nové podpisové klíče balíčků z úložiště \"%2%\":" msgstr[2] "Získáno %1% nových podpisových klíčů balíčků z úložiště \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Ověření podpisu souboru '%1%' se nezdařilo." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "Ověření podpisu souboru '%1%' z úložiště '%2%' se nezdařilo." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Pokračovat?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Soubor '%s' je podepsán neznámým klíčem '%s'. Pokračovat?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Soubor '%s' z úložiště '%s' je podepsán neznámým klíčem '%s'. Pokračovat?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Úložiště %1% nedefinuje přídavná URL 'gpgkey='." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Hledám ID klíče gpg %1% v úložišti %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Hledám ID klíče gpg %1% v paměti %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Chybí vyžadovaný atribut '%s'." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Je požadován alespoň jeden z atributů „%s“ a „%s“." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Ověření podpisu selhalo" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "Balíček %s se zřejmě poškodil během přenosu. Chcete pokus opakovat?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Nepodařilo se poskytnout balíček %s. Chcete jej stáhnout znovu?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Kontrola aplikování delta RPM se nezdařila." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "Aplikování delta RPM se nezdařilo." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Zásuvný modul Service nepodporuje změnu atributů." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Nelze poskytnout soubor '%s' z repozitáře '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Adresa URL nebyla nalezena v repozitáři." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Očekáváno médium %1%/%2% identifikované podle souboru '%3%' s obsahem:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Soubor %1%\n" " z balíčku\n" " %2%\n" " je v konfliktu se souborem z balíčku\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Soubor %1%\n" " z balíčku\n" " %2%\n" " je v konfliktu se souborem instalovaným z\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Soubor %1%\n" " instalovaný z\n" " %2%\n" " je v konfliktu se souborem z balíčku\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Soubor %1%\n" " instalovaný z\n" " %2%\n" " je v konfliktu se souborem instalovaným z\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Soubor %1%\n" " z balíčku\n" " %2%\n" " je v konfliktu se souborem\n" " %3%\n" " z balíčku\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Soubor %1%\n" " z balíčku\n" " %2%\n" " je v konfliktu se souborem\n" " %3%\n" " instalovaným z\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Soubor %1%\n" " instalovaný z\n" " %2%\n" " je v konfliktu se souborem\n" " %3%\n" " z balíčku\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Soubor %1%\n" " instalovaný z\n" " %2%\n" " je v konfliktu se souborem\n" " %3%\n" " instalovaným z\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Nemohu vytvořit sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "porušit %s ignorováním některých z jeho závislostí" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "obecně ignorovat některé závislosti" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "nainstalované %1% nepochází z úložiště distribuce upgradů a musí být " "nahrazeno" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "instalovaný %1% nepochází z distribučního úložiště" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "nainstalované %1% má starší architekturu" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "%1% k instalaci má starší architekturu" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problém s instalovaným %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "protichůdné požadavky" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "nějaký problém se závislostmi" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "nikdo neposkytuje požadované '%1%'" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Povolili jste všechna požadovaná úložiště?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "požadovaný balíček %1% neexistuje" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "nepodporovaný požadavek" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' poskytuje systém a nelze jej vymazat" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% není instalovatelný" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "nikdo neposkytuje '%1%' potřebné nainstalovaným %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "nikdo neposkytuje '%1%' potřebné k instalaci %2%" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "nelze nainstalovat %1% i %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "nainstalovaný %1% je v konfliktu s '%2%' poskytnutým nainstalovaným %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "nainstalovaný %1% je v konfliktu s '%2%' potřebným k instalaci %3%" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "%1%, který se má instalovat, je v konfliktu s '%2%' poskytnutým " "nainstalovaným %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "má se instalovat %1%, ale je v konfliktu s '%2%' poskytnutým %3% k instalaci" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "nainstalované %1% zastarává '%2%' poskytované nainstalovaným %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "nainstalované %1% zastarává '%2%' poskytované %3%, jež se má instalovat" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "má se instalovat %1% jež zastarává '%2%' poskytované instalovaným %3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "Má se instalovat %1%, jež zastarává '%2%' poskytované %3%, jež se má " "instalovat" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "nainstalované %1% je v konfliktu s '%2%' poskytnutým samo sebou" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "má se instalovat %1%, ale je v konfliktu s '%2%' poskytnutým jím samým" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "nainstalované %1% vyžaduje '%2%', ale tento požadavek nelze splnit" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "má se instalovat %1% vyžadující '%2%', ale tento požadavek nelze splnit" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "odstranění poskytovatelé: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "neinstalovatelní poskytovatelé: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "neinstalovatelní poskytovatelé: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% ještě není plně zaintegrován do %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Obvykle budete chtít ponechat PTF a vybrat, že nechcete instalovat údržbové " "záplaty." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Odstranění nainstalovaného %1% v tomto kontextu odstraní (nikoli nahradí!) " "také obsažené balíčky PTF." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "Tímto se obsažené balíčky PTF aktualizují a neodstraní. PTF by měly být " "odstraněny voláním '%1%'." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Obvykle chcete PTF ponechat nebo se rozhodnete akci zrušit." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Nainstalovaný %1% blokuje vyžadovanou akci." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Obvykle budete chtít ponechat PTF a vybrat zrušení této akce." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "odstraňte zámek, aby šlo odebrat %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "neinstalujte %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "ponechte %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "odstraňte zámek a tím povolte instalaci %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Tento požadavek poškodí váš systém!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorovat varování poškozeného systému" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "nežádejte instalaci řešení poskytující %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "nepožadovat smazání všech řešitelných problémů poskytujících% 1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "neinstalujte nejnovější verzi %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "ponechte %1% navzdory starší architektuře" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "instalujte %1% navzdory starší architektuře" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "zachovejte zastaralou %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "nainstalujte %1% z vyloučeného úložiště" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "instalovat %1%, ačkoli byl odvolán" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "umožnit instalaci PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "instalovat %1%, ačkoli je na indexu" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "downgrade z %1% na %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "změna architektury %1% na %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "nainstalovat %1% (se změnou dodavatele)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "instalovat %1% od dodavatele %2%\n" " nahradit %3% od dodavatele %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "náhrada %1% %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "odinstalace %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Spuštění skriptů po transakci" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Spuštění skriptu %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Výstup skriptu %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Instalace byla zrušena podle příkazu." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " provedeno" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " provádění selhalo" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s je již prováděn jako %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " provádění přeskočeno během ukončování" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Chyba při odesílání oznámení o aktualizaci." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nová zpráva o aktualizaci" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Přijat signál: \"%1% (%2%)\" - kvůli konzistenci systému nelze zrušit " "probíhající transakci RPM." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Provedení transakce se nezdařilo kvůli následujícím problémům:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM selhalo: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Nepodařilo se importovat veřejný klíč %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Nepodařilo se smazat veřejný klíč %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Hlavička balíčku není podepsaná!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Obsah balíčku není podepsán!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Změněné konfigurační soubory pro %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "Program rpm uložil %s jako %s, ale nebylo možné zjistit rozdíl" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "Program rpm uložil %s jako %s.\n" "Prvních 25 řádek rozdílů:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "Program rpm vytvořil %s jako %s, ale nebylo možné zjistit rozdíl" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "Program rpm vytvořil %s jako %s.\n" "Prvních 25 řádek rozdílů:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Další výstup programu rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "vytvořena záloha %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Podpis je v pořádku" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Neznámý typ podpisu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Podpis nelze ověřit" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Podpis je v pořádku, ale klíč není důvěryhodný" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Veřejný klíč podpisu není k dispozici" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Soubor neexistuje nebo podpis nemůže být zkontrolován" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Soubor není podepsaný" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "nevyprší nikdy" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "vypršel: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "vyprší: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(nevyprší nikdy)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(VYPRŠELO)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(vyprší během 24 hodin)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(vyprší během %d dne)" msgstr[1] "(vyprší během %d dnů)" msgstr[2] "(vyprší během %d dnů)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Pokus o import neexistujícího klíče %s do klíčenky %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Nepodařilo se importovat klíč." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Nepodařilo se smazat klíč." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Soubor s podpisem %s nebyl nalezen" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Pochybný typ %s pro %u-bajtový kontrolní součet %s" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Nelze otevřít pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Nelze otevřít rouru (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Neplatný řetězec dotazu LDAP URL" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Neplatný parametr dotazu LDAP URL %s" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Nelze klonovat objekt URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Neplatný odkaz na objekt prázdného URL" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Nelze analyzovat součásti URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historie:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Schéma URL nepovoluje %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Neplatná %s součást %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Neplatná %s součást" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Pro toto URL není podporována analýza řetězce dotazu" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL schéma je vyžadovanou součástí" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Neplatné schéma URL %s" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Schéma URL nepovoluje uživatelské jméno" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Schéma URL nepovoluje heslo" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Schéma URL vyžaduje součást hostitele" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Schéma URL nepovoluje součást hostitele" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Neplatná součást hostitele %s" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Schéma URL nepovoluje port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Neplatná součást portu %s" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Schéma URL vyžaduje název cesty" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relativní cesta není povolena, pokud existuje autorita" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Zakódovaný řetězec obsahuje bajt NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Neplatný oddělovací znak pole parametrů" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Neplatný oddělovací znak mapy parametrů" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Neplatný oddělovací znak spojení pole parametrů" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Příkaz skončil se stavem %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Příkaz byl ukončen signálem %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Příkaz skončil s neznámou chybou." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Zadány neplatné argumenty spawn." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Nelze vytvořit řídicí kanál." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Nelze změnit kořenový adresář na '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Nelze změnit adresář na '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" "Nelze změnit adresář na '%s' uvnitř chrootem změněného kořenového adresáře " "'%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Nelze spustit '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Nelze forknout (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Nelze spustit '%s', chyba chdir (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Nelze spustit '%s', chyba chroot (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Nelze spustit '%s', chyba exec (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Nelze spustit '%s', neočekávaná chyba." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Nepodařilo se připojit %s do %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Nepodařilo se odpojit %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Špatný název souboru: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Při pokusu o provedení akce '%s' nebylo otevřeno médium." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Soubor '%s' nebyl nalezen na médiu '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Nemůžu zapsat do souboru '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Médium není připojeno" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Špatný bod připojení média" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Inicializace stažení (curl) '%s' selhala" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Systémová výjimka '%s' na médiu '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Cesta '%s' na médiu '%s' není souborem." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Cesta '%s' na médiu '%s' není adresářem." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Chybné URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Není vyplněno hostname v URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Prázdný souborový systém v URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Chybí cíl v URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Nepodporované schéma URI v '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operace není médiem podporována" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Chyba stahování (curl) pro '%s':\n" "Kód chyby: %s\n" "Chybová zpráva: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Při nastavení možností stahování (curl) pro '%s' došlo k chybě:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Zdroj média \"%s\" neobsahuje požadované médium" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Médium '%s' je používáno jinou instancí" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Nemůžu vysunout žádné médium" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Nemůžu vysunout médium '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Přístup k '%s' byl zamítnut." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Během přístupu k '%s' byl dosažen časový limit." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Stažená data překročila očekávanou velikost '%s' souboru '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Umístění '%s' je dočasně nedostupné." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Problém s SSL certifikátem, ověřte, že je certifikát certifikační autority " "pro '%s' v pořádku." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Pro připojení média nejsou k dispozici žádné volné zdroje." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Nepodporovaná HTTP ověřovací metoda '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Chyba stahování (curl) pro '%s':\n" "Kód chyby: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Chyba stahování (curl) pro '%s':\n" "Nelze načíst odpověď HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ano" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ne" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Poznámka:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Pozor:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Chyba:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "dokončeno" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "upozornění" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "chyba" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Upozornění: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Získávám:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "startuji" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "nenalezeno" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "K této výzvě není k dispozici žádná nápověda." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "k této volbě není k dispozici žádná nápověda" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "zobrazí všechny volby" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ano" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ne" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Na zadané adrese URL nebyla nalezena platná metadata" #~ msgstr[1] "Na zadaných adresách URL nebyla nalezena platná metadata" #~ msgstr[2] "Na zadaných adresách URL nebyla nalezena platná metadata" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Běží skript %%posttrans '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Běží skripty %posttrans" #~ msgid "Package is not signed!" #~ msgstr "Balíček není podepsaný!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s nenáleží do repozitáře pro aktualizaci distribuce" #~ msgid "%s has inferior architecture" #~ msgstr "%s má podřadnou architekturu" #~ msgid "problem with installed package %s" #~ msgstr "problém s nainstalovaným balíčkem %s" #~ msgid "nothing provides requested %s" #~ msgstr "nic neposkytuje vyžádaný %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Máte povoleny všechny vyžadované repozitáře?" #~ msgid "package %s does not exist" #~ msgstr "balíček %s neexistuje" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s je poskytováno systémem a nelze odinstalovat" #~ msgid "%s is not installable" #~ msgstr "%s nelze nainstalovat" #~ msgid "nothing provides %s needed by %s" #~ msgstr "nic neposkytuje %s, který je požadován %s" #~ msgid "cannot install both %s and %s" #~ msgstr "Nelze nainstalovat %s a zároveň %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s koliduje s %s, poskytovatel: %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s nahrazuje %s, poskytovatel: %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "nainstalováno: %s, zastaralé: %s, poskytovatel: %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "vyřešitelné %s je v konfliktu s %s, které sám poskytuje" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s vyžaduje %s, ale tento požadavek nemůže být splněn" #~ msgid "remove lock to allow removal of %s" #~ msgstr "odebrat zámek pro umožnění odebrání %s" #~ msgid "do not install %s" #~ msgstr "neinstalovat %s" #~ msgid "keep %s" #~ msgstr "ponechat %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "odebrat zámek pro umožnění instalace položky %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "nenabízet řešení, která zahrnují %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "neptat se na smazání všech balíčků poskytujících %s" #~ msgid "do not install most recent version of %s" #~ msgstr "neinstalovat nejnovější verzi %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "ponechat %s i přes podřadnou architekturu" #~ msgid "install %s despite the inferior architecture" #~ msgstr "Instalovat %s i přes podřadnou architekturu" #~ msgid "keep obsolete %s" #~ msgstr "ponechat zastaralý %s" #~ msgid "install %s from excluded repository" #~ msgstr "instalovat %s z vyloučeného repozitáře" #~ msgid "downgrade of %s to %s" #~ msgstr "downgrade %s na %s" #~ msgid "architecture change of %s to %s" #~ msgstr "změna architektury z %s na %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "instalovat %s (i se změnou poskytovatele)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "nahrazení %s položkou %s" #~ msgid "deinstallation of %s" #~ msgstr "odinstalace %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Nelze otevřít soubor zámku: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Tato akce je právě spuštěna jiným programem." #~ msgid "Hal Exception" #~ msgstr "Výjimka HAL" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Bohužel, tato verze libzypp byla sestavena bez podpory HAL." #~ msgid "HalContext not connected" #~ msgstr "HALContext není připojen" #~ msgid "HalDrive not initialized" #~ msgstr "HALDrive není inicializovaný" #~ msgid "HalVolume not initialized" #~ msgstr "HALVolume není inicializovaný" #~ msgid "Unable to create dbus connection" #~ msgstr "Nelze vytvořit připojení dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Nelze vytvořit kontext libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Nelze nastavit připojení dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Nelze inicializovat kontext HAL - je spuštěna služba hald?" #~ msgid "Not a CDROM drive" #~ msgstr "Není jednotka CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Nelze inicializovat atributy mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Nelze nastavit rekurzivní atribut mutex" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Nelze inicializovat rekurzivní mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Nelze získat zámek mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Nelze uvolnit zámek mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Nepodařilo se importovat veřejný klíč ze souboru %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Nepodařilo se smazat veřejný klíč %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Nelze najít dostupné zařízení loop pro připojení souboru obrazu z '%s'" #~ msgid "generally ignore of some dependecies" #~ msgstr "obecně ignorovat některé závislosti" #~ msgid "do not keep %s installed" #~ msgstr "neudržovat %s nainstalován" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "Nemůžu vytvořit veřejný klíč %s z klíčenky %s do souboru %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "Pokus o import neexistujícího klíče %s mezi klíče %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Nemůžu změnit adresář na '/' uvnitř chrootu (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Inicializace stažení (Metalink curl) selhala na '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Stažení (Metalink curl) selhalo pro '%s':\n" #~ "Chybový kód: %s\n" #~ "Chybová zpráva: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Stahování přerušeno na %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Stahování přerušeno uživatelem" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Během zakládání stahování (metalink curl) došlo k chybě v nastavení pro " #~ "'%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Nepodařilo se stáhnout %s z %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Srbsko a Černá Hora" #~ msgid "Unknown Distribution" #~ msgstr "Neznámá distribuce" #~ msgid "ignore some dependencies of %s" #~ msgstr "ignorovat některé závislosti %s" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Soubor %s nemá kontrolní součet.\n" #~ "Chcete soubor přesto použít?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Nezdařila se kontrola integrity souboru %s s následujícím klíčem:\n" #~ "%s|%s|%s\n" #~ " Chcete soubor přesto použít?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Soubor %s má neplatný kontrolní součet.\n" #~ "Očekáváno %s, nalezeno %s\n" #~ "Chcete soubor přesto použít?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Soubor %s má neznámý kontrolní součet %s.\n" #~ "Chcete soubor přesto použít?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Soubor %s není podepsán.\n" #~ "Chcete jej přesto použít?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Soubor %s je podepsán neznámým klíčem:\n" #~ "%s|%s|%s\n" #~ " Chcete soubor přesto použít?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Byl nalezen nedůvěryhodný klíč:\n" #~ "%s|%s|%s\n" #~ " Chcete mu důvěřovat?" libzypp-17.36.5/po/cy.po000066400000000000000000003203051476576476200150120ustar00rootroot00000000000000# 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: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2003-09-23 10:33+0200\n" "Last-Translator: Kevin Donnelly \n" "Language-Team: Welsh \n" "Language: cy\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" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 #, fuzzy msgid "No Code" msgstr "Modd" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 #, fuzzy msgid "Armenia" msgstr "Affrica" #. :ARM:051: #: zypp/CountryCode.cc:165 #, fuzzy msgid "Netherlands Antilles" msgstr "Yr Iseldiroedd" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "" #. :AGO:024: #: zypp/CountryCode.cc:167 #, fuzzy msgid "Antarctica" msgstr "Iwerydd" #. :ATA:010: #: zypp/CountryCode.cc:168 #, fuzzy msgid "Argentina" msgstr "Arizona" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Awstria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Awstralia" #. :AUS:036: #: zypp/CountryCode.cc:172 #, fuzzy msgid "Aruba" msgstr "Dubai" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "" #. :AZE:031: #: zypp/CountryCode.cc:175 #, fuzzy msgid "Bosnia and Herzegovina" msgstr "Bosnia & Herzegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Gwlad Belg" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bwlgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 #, fuzzy msgid "Burundi" msgstr "Brunei" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "" #. :BOL:068: #: zypp/CountryCode.cc:187 #, fuzzy msgid "Brazil" msgstr "Dwyrain Brasil" #. :BRA:076: #: zypp/CountryCode.cc:188 #, fuzzy msgid "Bahamas" msgstr "Panama" #. :BHS:044: #: zypp/CountryCode.cc:189 #, fuzzy msgid "Bhutan" msgstr "Bahrain" #. :BTN:064: #: zypp/CountryCode.cc:190 #, fuzzy msgid "Bouvet Island" msgstr "Queensland" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "" #. :BWA:072: #: zypp/CountryCode.cc:192 #, fuzzy msgid "Belarus" msgstr "Beirut" #. :BLR:112: #: zypp/CountryCode.cc:193 #, fuzzy msgid "Belize" msgstr "Gwlad Belg" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 #, fuzzy msgid "Congo" msgstr "Hongkong" #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "Gweriniaeth Czech" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Y Swistir" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "" #. :COK:184: #: zypp/CountryCode.cc:202 #, fuzzy msgid "Chile" msgstr "Tseina" #. :CHL:152: #: zypp/CountryCode.cc:203 #, fuzzy msgid "Cameroon" msgstr "Cairo" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Tseina" #. :CHN:156: #: zypp/CountryCode.cc:205 #, fuzzy msgid "Colombia" msgstr "Colombo" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 #, fuzzy msgid "Cuba" msgstr "Ceuta" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "" #. :CPV:132: #: zypp/CountryCode.cc:209 #, fuzzy msgid "Christmas Island" msgstr "Chile Easter Island" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Gweriniaeth Czech" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Yr Almaen" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Denmarc" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 #, fuzzy msgid "Dominican Republic" msgstr "Gweriniaeth Czech" #. :DOM:214: #: zypp/CountryCode.cc:217 #, fuzzy msgid "Algeria" msgstr "Algiers" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Yr Aifft" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Sbaen" #. :ESP:724: #: zypp/CountryCode.cc:224 #, fuzzy msgid "Ethiopia" msgstr "Estonia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Ffindir" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 #, fuzzy msgid "Faroe Islands" msgstr "Iwerddon" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Ffrainc" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Y Deyrnas Unedig" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Yr Almaen" #: zypp/CountryCode.cc:238 #, fuzzy msgid "Ghana" msgstr "Gaza" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 #, fuzzy msgid "Greenland" msgstr "Iwerddon" #. :GRL:304: #: zypp/CountryCode.cc:241 #, fuzzy msgid "Gambia" msgstr "Jamaica" #. :GMB:270: #: zypp/CountryCode.cc:242 #, fuzzy msgid "Guinea" msgstr "Guam" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Groeg" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 #, fuzzy msgid "Guyana" msgstr "Guam" #. :GUY:328: #: zypp/CountryCode.cc:251 #, fuzzy msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 #, fuzzy msgid "Honduras" msgstr "Awr" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croatia" #. :HRV:191: #: zypp/CountryCode.cc:255 #, fuzzy msgid "Haiti" msgstr "Hawaii" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hwngari" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Iwerddon" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 #, fuzzy msgid "India" msgstr "Inetd" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" #. :IOT:086: #: zypp/CountryCode.cc:263 #, fuzzy msgid "Iraq" msgstr "Israel" #. :IRQ:368: #: zypp/CountryCode.cc:264 #, fuzzy msgid "Iran" msgstr "Iwerddon" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Gwlad yr Iâ" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Yr Eidal" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Siapan" #. :JPN:392: #: zypp/CountryCode.cc:271 #, fuzzy msgid "Kenya" msgstr "Corea" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 #, fuzzy msgid "Cambodia" msgstr "Samoa" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 #, fuzzy msgid "North Korea" msgstr "Gogledd Iwerddon" #. :PRK:408: #: zypp/CountryCode.cc:278 #, fuzzy msgid "South Korea" msgstr "Pegwn y De" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lithuania" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latfia" #. :LVA:428: #: zypp/CountryCode.cc:292 #, fuzzy msgid "Libya" msgstr "Lima" #. :LBY:434: #: zypp/CountryCode.cc:293 #, fuzzy msgid "Morocco" msgstr "Monaco" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldofa" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "Monaco" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "Shanghai" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 #, fuzzy msgid "Mali" msgstr "Malta" #. :MLI:466: #: zypp/CountryCode.cc:302 #, fuzzy msgid "Myanmar" msgstr "Panama" #. :MMR:104: #: zypp/CountryCode.cc:303 #, fuzzy msgid "Mongolia" msgstr "Monrovia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 #, fuzzy msgid "Northern Mariana Islands" msgstr "Gogledd Iwerddon" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 #, fuzzy msgid "Mauritania" msgstr "Lithuania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 #, fuzzy msgid "Mauritius" msgstr "Martinique" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "" #. :MDV:462: #: zypp/CountryCode.cc:312 #, fuzzy msgid "Malawi" msgstr "Malta" #. :MWI:454: #: zypp/CountryCode.cc:313 #, fuzzy msgid "Mexico" msgstr "Mecsico Cyffredinol" #. :MEX:484: #: zypp/CountryCode.cc:314 #, fuzzy msgid "Malaysia" msgstr "Malta" #. :MYS:458: #: zypp/CountryCode.cc:315 #, fuzzy msgid "Mozambique" msgstr "Martinique" #. :MOZ:508: #: zypp/CountryCode.cc:316 #, fuzzy msgid "Namibia" msgstr "Nairobi" #. :NAM:516: #: zypp/CountryCode.cc:317 #, fuzzy msgid "New Caledonia" msgstr "Macedonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" #. :NER:562: #: zypp/CountryCode.cc:319 #, fuzzy msgid "Norfolk Island" msgstr "Gogledd Iwerddon" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "" #. :NGA:566: #: zypp/CountryCode.cc:321 #, fuzzy msgid "Nicaragua" msgstr "Managua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Yr Iseldiroedd" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norwy" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 #, fuzzy msgid "Niue" msgstr "Munud" #. :NIU:570: #: zypp/CountryCode.cc:327 #, fuzzy msgid "New Zealand" msgstr "Yr Iseldiroedd" #. :NZL:554: #: zypp/CountryCode.cc:328 #, fuzzy msgid "Oman" msgstr "Rh" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 #, fuzzy msgid "Peru" msgstr "Perth" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "" #. :PHL:608: #: zypp/CountryCode.cc:334 #, fuzzy msgid "Pakistan" msgstr "Pitcairn" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Gwlad y Pwyl" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portiwgal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 #, fuzzy msgid "Paraguay" msgstr "Managua" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 #, fuzzy msgid "Reunion" msgstr "Rhedeg" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "Gwasanaeth" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 #, fuzzy msgid "Rwanda" msgstr "Canada" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" #. :SYC:690: #: zypp/CountryCode.cc:352 #, fuzzy msgid "Sudan" msgstr "Sbaen" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Sweden" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slofenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slofakia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" #. :SEN:686: #: zypp/CountryCode.cc:362 #, fuzzy msgid "Somalia" msgstr "Romania" #. :SOM:706: #: zypp/CountryCode.cc:363 #, fuzzy msgid "Suriname" msgstr "Enw'r gwasanae&th" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" #. :SYR:760: #: zypp/CountryCode.cc:367 #, fuzzy msgid "Swaziland" msgstr "Y Swistir" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" #. :TCA:796: #: zypp/CountryCode.cc:369 #, fuzzy msgid "Chad" msgstr "Wedi'u Newid" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 #, fuzzy msgid "Togo" msgstr "Tokyo" #. :TGO:768: #: zypp/CountryCode.cc:372 #, fuzzy msgid "Thailand" msgstr "Ffindir" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "" #. :TKM:795: #: zypp/CountryCode.cc:376 #, fuzzy msgid "Tunisia" msgstr "Tunis" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Twrci" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 #, fuzzy msgid "Tuvalu" msgstr "Zulu" #. :TUV:798: #: zypp/CountryCode.cc:382 #, fuzzy msgid "Taiwan" msgstr "Vatican" #. :TWN:158: #: zypp/CountryCode.cc:383 #, fuzzy msgid "Tanzania" msgstr "Tasmania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Wcrain" #. :UKR:804: #: zypp/CountryCode.cc:385 #, fuzzy msgid "Uganda" msgstr "Canada" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" #. :MYT:175: #: zypp/CountryCode.cc:401 #, fuzzy msgid "South Africa" msgstr "Affrica" #. :ZAF:710: #: zypp/CountryCode.cc:402 #, fuzzy msgid "Zambia" msgstr "Jamaica" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "&Dileu" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 #, fuzzy msgid "Afar" msgstr "Affrica" #. language code: abk ab #: zypp/LanguageCode.cc:163 #, fuzzy msgid "Abkhazian" msgstr "Albania" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 #, fuzzy msgid "Adangme" msgstr "&Uwch" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 #, fuzzy msgid "Afrikaans" msgstr "Affrica" #. language code: ain #: zypp/LanguageCode.cc:179 #, fuzzy msgid "Ainu" msgstr "Gweithred" #. language code: aka ak #: zypp/LanguageCode.cc:181 #, fuzzy msgid "Akan" msgstr "Alaska" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 #, fuzzy msgid "Albanian" msgstr "Albania" #. language code: ale #: zypp/LanguageCode.cc:189 #, fuzzy msgid "Aleut" msgstr "Aleutian" #. language code: alg #: zypp/LanguageCode.cc:191 #, fuzzy msgid "Algonquian Languages" msgstr "Iaith" #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "Gogledd Iwerddon" #. language code: amh am #: zypp/LanguageCode.cc:195 #, fuzzy msgid "Amharic" msgstr "Affrica" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 #, fuzzy msgid "Apache Languages" msgstr "Iaith" #. language code: ara ar #: zypp/LanguageCode.cc:201 #, fuzzy msgid "Arabic" msgstr "Affrica" #. language code: arc #: zypp/LanguageCode.cc:203 #, fuzzy msgid "Aramaic" msgstr "Jamaica" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 #, fuzzy msgid "Armenian" msgstr "Aleutian" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 #, fuzzy msgid "Assamese" msgstr "Negeseuon" #. language code: ast #: zypp/LanguageCode.cc:221 #, fuzzy msgid "Asturian" msgstr "Awstria" #. language code: ath #: zypp/LanguageCode.cc:223 #, fuzzy msgid "Athapascan Languages" msgstr "Awstralia" #. language code: aus #: zypp/LanguageCode.cc:225 #, fuzzy msgid "Australian Languages" msgstr "Awstralia" #. language code: ava av #: zypp/LanguageCode.cc:227 #, fuzzy msgid "Avaric" msgstr "Affrica" #. language code: ave ae #: zypp/LanguageCode.cc:229 #, fuzzy msgid "Avestan" msgstr "Aleutian" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "" #. language code: bad #: zypp/LanguageCode.cc:237 #, fuzzy msgid "Banda" msgstr "Canada" #. language code: bai #: zypp/LanguageCode.cc:239 #, fuzzy msgid "Bamileke Languages" msgstr "Iaith" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 #, fuzzy msgid "Bambara" msgstr "Samarkand" #. language code: ban #: zypp/LanguageCode.cc:247 #, fuzzy msgid "Balinese" msgstr "Pennawd" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "" #. language code: bas #: zypp/LanguageCode.cc:253 #, fuzzy msgid "Basa" msgstr "Alaska" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 #, fuzzy msgid "Belarusian" msgstr "Bwlgaria" #. language code: bem #: zypp/LanguageCode.cc:261 #, fuzzy msgid "Bemba" msgstr "Bermuda" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 #, fuzzy msgid "Bihari" msgstr "Bahrain" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 #, fuzzy msgid "Bini" msgstr "Brunei" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 #, fuzzy msgid "Breton" msgstr "Freetown" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 #, fuzzy msgid "Buriat" msgstr "Bwlgaria" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 #, fuzzy msgid "Bulgarian" msgstr "Bwlgaria" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 #, fuzzy msgid "Caddo" msgstr "Cairo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 #, fuzzy msgid "Carib" msgstr "Cairo" #. language code: cat ca #: zypp/LanguageCode.cc:307 #, fuzzy msgid "Catalan" msgstr "Casablanca" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 #, fuzzy msgid "Cebuano" msgstr "Ceuta" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 #, fuzzy msgid "Chamorro" msgstr "Cairo" #. language code: chb #: zypp/LanguageCode.cc:317 #, fuzzy msgid "Chibcha" msgstr "Tseina" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 #, fuzzy msgid "Chagatai" msgstr "Shanghai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 #, fuzzy msgid "Chinese" msgstr "Tseina" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 #, fuzzy msgid "Mari" msgstr "Darwin" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "Iaith" #. language code: cop #: zypp/LanguageCode.cc:347 #, fuzzy msgid "Coptic" msgstr "Costa Rica" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 #, fuzzy msgid "Corsican" msgstr "Costa Rica" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 #, fuzzy msgid "Cree" msgstr "Cre&u" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "" #. language code: dak #: zypp/LanguageCode.cc:373 #, fuzzy msgid "Dakota" msgstr "Dakar" #. language code: dan da #: zypp/LanguageCode.cc:375 #, fuzzy msgid "Danish" msgstr "&Gorffen" #. language code: dar #: zypp/LanguageCode.cc:377 #, fuzzy msgid "Dargwa" msgstr "Darwin" #. language code: day #: zypp/LanguageCode.cc:379 #, fuzzy msgid "Dayak" msgstr "Dakar" #. language code: del #: zypp/LanguageCode.cc:381 #, fuzzy msgid "Delaware" msgstr "Caledwedd" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 #, fuzzy msgid "Dinka" msgstr "Dominica" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 #, fuzzy msgid "Duala" msgstr "Palau" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 #, fuzzy msgid "Dutch" msgstr "De" #. language code: dyu #: zypp/LanguageCode.cc:405 #, fuzzy msgid "Dyula" msgstr "Dubai" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 #, fuzzy msgid "Esperanto" msgstr "Dwyrain" #. language code: est et #: zypp/LanguageCode.cc:423 #, fuzzy msgid "Estonian" msgstr "Estonia" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 #, fuzzy msgid "Fang" msgstr "Baneri" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "" #. language code: fat #: zypp/LanguageCode.cc:433 #, fuzzy msgid "Fanti" msgstr "Iwerydd" #. language code: fij fj #: zypp/LanguageCode.cc:435 #, fuzzy msgid "Fijian" msgstr "Fiji" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "" #. language code: fin fi #: zypp/LanguageCode.cc:439 #, fuzzy msgid "Finnish" msgstr "&Gorffen" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 #, fuzzy msgid "French" msgstr "Greenwich" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 #, fuzzy msgid "Frisian" msgstr "Yn gorffen" #. language code: ful ff #: zypp/LanguageCode.cc:455 #, fuzzy msgid "Fulah" msgstr "Baneri" #. language code: fur #: zypp/LanguageCode.cc:457 #, fuzzy msgid "Friulian" msgstr "Ffindir" #. language code: gaa #: zypp/LanguageCode.cc:459 #, fuzzy msgid "Ga" msgstr "Guam" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 #, fuzzy msgid "Gbaya" msgstr "Gaza" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 #, fuzzy msgid "Georgian" msgstr "Yr Almaen" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 #, fuzzy msgid "German" msgstr "Yr Almaen" #. language code: gez #: zypp/LanguageCode.cc:475 #, fuzzy msgid "Geez" msgstr "Groeg" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "" #. language code: glg gl #: zypp/LanguageCode.cc:483 #, fuzzy msgid "Galician" msgstr "Vatican" #. language code: glv gv #: zypp/LanguageCode.cc:485 #, fuzzy msgid "Manx" msgstr "&Uchaf" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 #, fuzzy msgid "Gujarati" msgstr "Cyfnod" #. language code: gwi #: zypp/LanguageCode.cc:509 #, fuzzy msgid "Gwich'in" msgstr "Michigan" #. language code: hai #: zypp/LanguageCode.cc:511 #, fuzzy msgid "Haida" msgstr "Caledwedd" #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "Vatican" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 #, fuzzy msgid "Hawaiian" msgstr "Hawaii" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "" #. language code: her hz #: zypp/LanguageCode.cc:521 #, fuzzy msgid "Herero" msgstr "gwall" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 #, fuzzy msgid "Hmong" msgstr "Hongkong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 #, fuzzy msgid "Hungarian" msgstr "Hwngari" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 #, fuzzy msgid "Icelandic" msgstr "Gwlad yr Iâ" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "Lithuania" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 #, fuzzy msgid "Interlingue" msgstr "Parhau" #. language code: ilo #: zypp/LanguageCode.cc:559 #, fuzzy msgid "Iloko" msgstr "Tokyo" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 #, fuzzy msgid "Iroquoian Languages" msgstr "Iaith" #. language code: ita it #: zypp/LanguageCode.cc:577 #, fuzzy msgid "Italian" msgstr "Yr Eidal" #. language code: jav jv #: zypp/LanguageCode.cc:579 #, fuzzy msgid "Javanese" msgstr "Siapan" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 #, fuzzy msgid "Japanese" msgstr "Siapan" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 #, fuzzy msgid "Kabyle" msgstr "Alluogir" #. language code: kac #: zypp/LanguageCode.cc:593 #, fuzzy msgid "Kachin" msgstr "Bahrain" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 #, fuzzy msgid "Kamba" msgstr "Katmandu" #. language code: kan kn #: zypp/LanguageCode.cc:599 #, fuzzy msgid "Kannada" msgstr "Canada" #. language code: kar #: zypp/LanguageCode.cc:601 #, fuzzy msgid "Karen" msgstr "Corea" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 #, fuzzy msgid "Kawi" msgstr "Darwin" #. language code: kaz kk #: zypp/LanguageCode.cc:609 #, fuzzy msgid "Kazakh" msgstr "Gaza" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 #, fuzzy msgid "Kirghiz" msgstr "Virgin" #. language code: kmb #: zypp/LanguageCode.cc:627 #, fuzzy msgid "Kimbundu" msgstr "Katmandu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 #, fuzzy msgid "Kongo" msgstr "Hongkong" #. language code: kor ko #: zypp/LanguageCode.cc:635 #, fuzzy msgid "Korean" msgstr "Corea" #. language code: kos #: zypp/LanguageCode.cc:637 #, fuzzy msgid "Kosraean" msgstr "Corea" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 #, fuzzy msgid "Kuanyama" msgstr "Panama" #. language code: kum #: zypp/LanguageCode.cc:649 #, fuzzy msgid "Kumyk" msgstr "Dymi" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 #, fuzzy msgid "Kutenai" msgstr "Kuwait" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 #, fuzzy msgid "Lahnda" msgstr "Canada" #. language code: lam #: zypp/LanguageCode.cc:659 #, fuzzy msgid "Lamba" msgstr "Lima" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "" #. language code: lat la #: zypp/LanguageCode.cc:663 #, fuzzy msgid "Latin" msgstr "Lleoliad" #. language code: lav lv #: zypp/LanguageCode.cc:665 #, fuzzy msgid "Latvian" msgstr "Latfia" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "Luxembourg" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 #, fuzzy msgid "Lithuanian" msgstr "Lithuania" #. language code: lol #: zypp/LanguageCode.cc:675 #, fuzzy msgid "Mongo" msgstr "Monaco" #. language code: loz #: zypp/LanguageCode.cc:677 #, fuzzy msgid "Lozi" msgstr "Mew&ngofnodi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "Luxembourg" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 #, fuzzy msgid "Ganda" msgstr "Canada" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "Tahiti" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 #, fuzzy msgid "Macedonian" msgstr "Macedonia" #. language code: mad #: zypp/LanguageCode.cc:699 #, fuzzy msgid "Madurese" msgstr "Llygoden" #. language code: mag #: zypp/LanguageCode.cc:701 #, fuzzy msgid "Magahi" msgstr "Managua" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 #, fuzzy msgid "Makasar" msgstr "Dakar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "" #. language code: man #: zypp/LanguageCode.cc:711 #, fuzzy msgid "Mandingo" msgstr "Rhybudd" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 #, fuzzy msgid "Maori" msgstr "Monrovia" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" #. language code: mas #: zypp/LanguageCode.cc:721 #, fuzzy msgid "Masai" msgstr "Tasmania" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "Malta" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 #, fuzzy msgid "Mandar" msgstr "Manila" #. language code: men #: zypp/LanguageCode.cc:731 #, fuzzy msgid "Mende" msgstr "Modd" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "Managua" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "Managua" #. language code: mlt mt #: zypp/LanguageCode.cc:745 #, fuzzy msgid "Maltese" msgstr "Malta" #. language code: mnc #: zypp/LanguageCode.cc:747 #, fuzzy msgid "Manchu" msgstr "&Cychwyn" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "Managua" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "Moldofa" #. language code: mon mn #: zypp/LanguageCode.cc:757 #, fuzzy msgid "Mongolian" msgstr "Monrovia" #. language code: mos #: zypp/LanguageCode.cc:759 #, fuzzy msgid "Mossi" msgstr "Llygoden" #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "Iaith" #. language code: mun #: zypp/LanguageCode.cc:763 #, fuzzy msgid "Munda languages" msgstr "Iaith" #. language code: mus #: zypp/LanguageCode.cc:765 #, fuzzy msgid "Creek" msgstr "Cre&u" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 #, fuzzy msgid "Marwari" msgstr "Caledwedd" #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "Managua" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 #, fuzzy msgid "North American Indian" msgstr "Gogledd Iwerddon" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "Yr Almaen" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 #, fuzzy msgid "Norwegian" msgstr "Norwy" #. language code: nso #: zypp/LanguageCode.cc:813 #, fuzzy msgid "Northern Sotho" msgstr "Gogledd Iwerddon" #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "Iaith" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 #, fuzzy msgid "Chichewa" msgstr "Tseina" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 #, fuzzy msgid "Nyoro" msgstr "Gogledd" #. language code: nzi #: zypp/LanguageCode.cc:827 #, fuzzy msgid "Nzima" msgstr "Lima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 #, fuzzy msgid "Osage" msgstr "Negeseuon" #. language code: oss os #: zypp/LanguageCode.cc:839 #, fuzzy msgid "Ossetian" msgstr "Aleutian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "Iaith" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 #, fuzzy msgid "Pangasinan" msgstr "Panama" #. language code: pal #: zypp/LanguageCode.cc:849 #, fuzzy msgid "Pahlavi" msgstr "Palau" #. language code: pam #: zypp/LanguageCode.cc:851 #, fuzzy msgid "Pampanga" msgstr "Tasmania" #. language code: pan pa #: zypp/LanguageCode.cc:853 #, fuzzy msgid "Panjabi" msgstr "Panama" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 #, fuzzy msgid "Palauan" msgstr "Palau" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 #, fuzzy msgid "Persian" msgstr "&Fersiwn RPC" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 #, fuzzy msgid "Pali" msgstr "Palau" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 #, fuzzy msgid "Portuguese" msgstr "Portiwgal" #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "Iaith" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "Siapan" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "Romania" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 #, fuzzy msgid "Romanian" msgstr "Romania" #. language code: run rn #: zypp/LanguageCode.cc:901 #, fuzzy msgid "Rundi" msgstr "Rhedeg" #. language code: rus ru #: zypp/LanguageCode.cc:903 #, fuzzy msgid "Russian" msgstr "Rwsia" #. language code: sad #: zypp/LanguageCode.cc:905 #, fuzzy msgid "Sandawe" msgstr "Canada" #. language code: sag sg #: zypp/LanguageCode.cc:907 #, fuzzy msgid "Sango" msgstr "Saigon" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "Iaith" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 #, fuzzy msgid "Sasak" msgstr "Samoa" #. language code: sat #: zypp/LanguageCode.cc:921 #, fuzzy msgid "Santali" msgstr "Shanghai" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "" #. language code: scn #: zypp/LanguageCode.cc:927 #, fuzzy msgid "Sicilian" msgstr "Michigan" #. language code: sco #: zypp/LanguageCode.cc:929 #, fuzzy msgid "Scots" msgstr "De" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 #, fuzzy msgid "Croatian" msgstr "Croatia" #. language code: sel #: zypp/LanguageCode.cc:935 #, fuzzy msgid "Selkup" msgstr "Hepgor" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "Iaith" #. language code: shn #: zypp/LanguageCode.cc:943 #, fuzzy msgid "Shan" msgstr "Shanghai" #. language code: sid #: zypp/LanguageCode.cc:945 #, fuzzy msgid "Sidamo" msgstr "Samoa" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Iaith" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 #, fuzzy msgid "Slovak" msgstr "Slofakia" #. language code: slv sl #: zypp/LanguageCode.cc:959 #, fuzzy msgid "Slovenian" msgstr "Slofenia" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 #, fuzzy msgid "Northern Sami" msgstr "Gogledd Iwerddon" #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "Iaith" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 #, fuzzy msgid "Samoan" msgstr "Samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 #, fuzzy msgid "Shona" msgstr "Slofenia" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 #, fuzzy msgid "Soninke" msgstr "Parhau" #. language code: sog #: zypp/LanguageCode.cc:981 #, fuzzy msgid "Sogdian" msgstr "Mew&ngofnodi" #. language code: som so #: zypp/LanguageCode.cc:983 #, fuzzy msgid "Somali" msgstr "Romania" #. language code: son #: zypp/LanguageCode.cc:985 #, fuzzy msgid "Songhai" msgstr "Shanghai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 #, fuzzy msgid "Spanish" msgstr "Sbaen" #. language code: srd sc #: zypp/LanguageCode.cc:991 #, fuzzy msgid "Sardinian" msgstr "Rhybudd" #. language code: srr #: zypp/LanguageCode.cc:993 #, fuzzy msgid "Serer" msgstr "Gweinydd" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 #, fuzzy msgid "Swati" msgstr "Sbaen" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 #, fuzzy msgid "Susu" msgstr "Cyflwr" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 #, fuzzy msgid "Swahili" msgstr "Hawaii" #. language code: swe sv #: zypp/LanguageCode.cc:1009 #, fuzzy msgid "Swedish" msgstr "Sweden" #. language code: syr #: zypp/LanguageCode.cc:1011 #, fuzzy msgid "Syriac" msgstr "Gwasanaeth" #. language code: tah ty #: zypp/LanguageCode.cc:1013 #, fuzzy msgid "Tahitian" msgstr "Tahiti" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 #, fuzzy msgid "Tamil" msgstr "Tasmania" #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "Qatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 #, fuzzy msgid "Telugu" msgstr "Gwlad Belg" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 #, fuzzy msgid "Tetum" msgstr "&Profi" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 #, fuzzy msgid "Thai" msgstr "Tahiti" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 #, fuzzy msgid "Klingon" msgstr "Saigon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 #, fuzzy msgid "Tamashek" msgstr "Tashkent" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 #, fuzzy msgid "Tswana" msgstr "Tasmania" #. language code: tso ts #: zypp/LanguageCode.cc:1063 #, fuzzy msgid "Tsonga" msgstr "Estonia" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "Twrci" #. language code: tum #: zypp/LanguageCode.cc:1067 #, fuzzy msgid "Tumbuka" msgstr "Timbuktu" #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "Iaith" #. language code: tur tr #: zypp/LanguageCode.cc:1071 #, fuzzy msgid "Turkish" msgstr "Tunis" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 #, fuzzy msgid "Tuvinian" msgstr "Tunis" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 #, fuzzy msgid "Ukrainian" msgstr "Wcrain" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "" #. language code: vai #: zypp/LanguageCode.cc:1097 #, fuzzy msgid "Vai" msgstr "Vatican" #. language code: ven ve #: zypp/LanguageCode.cc:1099 #, fuzzy msgid "Venda" msgstr "Grenada" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 #, fuzzy msgid "Votic" msgstr "Vatican" #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "Managua" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 #, fuzzy msgid "Welsh" msgstr "Gorllewin" #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "Iaith" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 #, fuzzy msgid "Yapese" msgstr "Ie" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "Iaith" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 #, fuzzy msgid "Zenaga" msgstr "Grenada" #. language code: zha za #: zypp/LanguageCode.cc:1143 #, fuzzy msgid "Zhuang" msgstr "Wedi'u Newid" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 #, fuzzy msgid "Zuni" msgstr "Tunis" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "anhysbys" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 #, fuzzy msgid "invalid" msgstr "Arsefydlu" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Arsefydlu %s: \"%s\"" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Couldn't open file: %s." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Arsefydlu %s: \"%s\"" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "Arsefydlu" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Copïo ffeiliau ffurfweddu i'r cysawd a osodwyd" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "Bydd pecyn %1 yn cael ei arsefydlu" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" msgstr[2] "" msgstr[3] "" msgstr[4] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Couldn't open file: %s." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Y gorchymyn a weithredir wrth gysylltu" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Couldn't open file: %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Arsefydlu %s: \"%s\"" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Arsefydlu %s: \"%s\"" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ie" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nage" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Gwall" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "Gwall" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "heb gysylltu" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 #, fuzzy msgid "yes" msgstr "Ie" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" #, fuzzy #~ msgid "Package is not signed!" #~ msgstr "Mae llofnod annilys gan yr RPM." #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "Saerniaeth:" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Bydd pecyn %1 yn cael ei arsefydlu" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "Rhaid arsefydlu'r pecynnau yma:" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "Methodd yr arsefydliad." #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Arsefydlu %s: \"%s\"" #, fuzzy #~ msgid "do not install %s" #~ msgstr "Arsefydlu %s: \"%s\"" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "Arsefydlu %s: \"%s\"" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "Gosod gyrrydd..." #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "&Dileu" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Arsefydlu %s: \"%s\"" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "heb gysylltu" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "Arsefydlu %s: \"%s\"" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "%s remove failed" #~ msgstr "Methodd rpm." #, fuzzy #~ msgid "%s install failed" #~ msgstr "Methodd yr arsefydliad." #, fuzzy #~ msgid "%s installed ok" #~ msgstr "&Ie, gosod" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Gosod gyrrydd..." #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Gosod gyrrydd..." #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "Gosod gyrrydd..." #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "Gosod gyrrydd..." #, fuzzy #~ msgid "install %s" #~ msgstr "Arsefydlu %s: \"%s\"" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "Gosod gyrrydd..." #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "Rhaid arsefydlu'r pecynnau yma:" #, fuzzy #~ msgid "No need to install %s" #~ msgstr "&Ie, gosod" #, fuzzy #~ msgid ", Action: " #~ msgstr "Gweithred" #, fuzzy #~ msgid "Establishing %s" #~ msgstr "Arsefydlu %s: \"%s\"" #, fuzzy #~ msgid " Error!" #~ msgstr "Gwall" #~ msgid "Ok" #~ msgstr "Iawn" #, fuzzy #~ msgid "The package file has incorrect MD5 sum" #~ msgstr "Mae llofnod annilys gan yr RPM." #, fuzzy #~ msgid "The package archive has incorrect MD5 sum" #~ msgstr "Mae llofnod annilys gan yr RPM." #, fuzzy #~ msgid "Default" #~ msgstr "Rhag&osod" #, fuzzy #~ msgid "to be installed (soft)" #~ msgstr "&Ymgychwyn cysawd a osodwyd" #, fuzzy #~ msgid "to be uninstalled" #~ msgstr "ni arsefydlir y rhaglen" libzypp-17.36.5/po/da.po000066400000000000000000003502521476576476200147670ustar00rootroot00000000000000# Copyright (C) YEAR SuSE Linux GmbH, Nuernberg # This file is distributed under the same license as the PACKAGE package. # Martin Schlander , 2015. # scootergrisen, 2017. msgid "" msgstr "" "Project-Id-Version: libzypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2019-12-06 11:54+0000\n" "Last-Translator: scootergrisen \n" "Language-Team: Danish \n" "Language: da\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: Weblate 3.6.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Ukendt land: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Ingen kode" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Forenede Arabiske Emirater" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanien" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenien" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Hollandske Antiller" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktis" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikansk Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Østrig" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australien" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Alandøerne" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbajdsjan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Herzegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgien" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgarien" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasilien" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet-øen" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Hviderusland" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosøerne" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Centralafrikanske Republik" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Schweiz" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Elfenbenskysten" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cook-øerne" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Cameroun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kap Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Juleøen" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cypern" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tjekkiet" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Tyskland" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danmark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikanske Republik" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algeriet" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estland" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypten" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Vest-Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanien" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopien" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøerne (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "De forenede Micronesiske stater" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Færøerne" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Frankrig" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Metropolitansk Frankrig" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Storbritannien" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgien" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Fransk Guinea" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grønland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ækvatorialguinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grækenland" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Syd-Georgien og sydlige Sandwich-øer" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard Øen og McDonald Øerne" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatien" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungarn" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesien" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isle of Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indien" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britisk område indiske ocean" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italien" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodia" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comorerne" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts og Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Nord Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Syd Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Caymanøerne" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kasakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litauen" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letland" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Liberia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshalløerne" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonien" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongoliet" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Nordmarianerne" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauretanien" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldiverne" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Ny Caledonien" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk Øen" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Holland" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norge" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "New Zealand" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Fransk Polynesien" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Ny Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filippinerne" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polen" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre og Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palæstinensisk territorie" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumænien" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbien" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russiske føderation" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudiarabien" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salomonøerne" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychellerne" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Sverige" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Saint Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenien" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen øerne" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakiet" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé og Príncipe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syrien" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicos-øerne" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tchad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Franske sydlige territorier" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadzjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunesien" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Øst-Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Tyrkiet" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraine" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Fjerne, mindre øer, USA" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "USA" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Sankt Vincent og Grenadinerne" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Jomfruøerne (britisk)" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Jomfruøerne (USA)" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis og Futuna øerne" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Sydafrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Leverer" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Præ-kræver" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Kræver" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Konflikter" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Forælder" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Anbefaler" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Foreslår" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Forbedringer" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Supplerer" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Ukendt sprog: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhazian" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinese" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adygejiensk" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asiatisk (Andre)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili (Kunstsprog)" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadian" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albansk" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonkine sprog" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Sydaltaisk" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharic" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Engelsk, Gammel (ca. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apachesprog" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabisk" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramæisk" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonisk" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armensk" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucariask" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Kunstige (Andre)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamese" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturisk" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapaskiske sprog" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australske sprog" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarisk" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Aserbadjansk" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke sprog" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinesisk" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskisk" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltisk (Andre)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Hviderussisk" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengalsk" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber-sprog" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika (Blackfoot)" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (Andre)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnisk" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonsk" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesien)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginesisk" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarsk" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmesisk" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Central Amerikanske Indian (Andre)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalansk" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukasisk (Andre)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltisk (Andre)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Chechen" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kinesisk" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Church Slavic" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Chamiske sprog" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Coptic" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornish" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corsicansk" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creolsk og Pidgin - engelsk-baseret (andre)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creolsk og Pidgin - fransk-baseret (andre)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creolsk og Pidgin - portugisisk-baseret (andre)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Crimean Tatar" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creoles og Pidgins (andre)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kasjubisk" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitisk (Andre)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tjekkisk" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dansk" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Athapan-slavisk" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidiansk (Andre)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Nedre sorbiansk" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Hollandsk, Middelalder (ca. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Hollandsk" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egyptisk (Oldtids-)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamitisk" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engelsk" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Engelsk, Middelalder (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estisk" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Færøsk" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijian" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filippinsk" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finsk" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finno-Ugrisk (Andre)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Fransk" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Fransk, Middelalder (ca. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Fransk, Gammel (ca. 842-1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisian" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulian" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germanske (andre)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgisk" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Tysk" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertesisk" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gælisk" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irsk" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galicisk" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Højtysk, Middelalder (ca. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Højtysk, Gammel (ca. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gothisk" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Græsk, Oldtid (til 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Græsk, Moderne (fra 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitisk" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiiansk" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebraisk" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindu" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittitisk" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Øvre sorbiansk" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ungarsk" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandsk" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indisk (Andre)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesisk" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-Europæisk (Andre)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iransk (Andre)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokesiske sprog" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiensk" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanesisk" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japansk" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Jødisk-persisk" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Jødisk-arabisk" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabylisk" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachinsk" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kasakhisk" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardisk" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (Andre)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmersk" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanesisk" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Congo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreansk" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraeansk" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkarisk" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdisk" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latinsk" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Lettisk" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgansk" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litauisk" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxembourgsk" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya og Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonsk" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Maduresisk" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallesisk" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesisk (Malayo-Polynesisk)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malaysisk" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irsk, Middelalder (ca. 900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Diverse sprog" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (Andre)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Madagaskariansk" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltesisk" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobosprog" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavisk" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolisk" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Flere sprog" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda sprog" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandesisk" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Mayanske sprog" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Nordamerikansk indisk" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitansk" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, syd" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, nord" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Nedertysk" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofaniansk (Niger-Congo)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueansk" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norsk" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norse, gammel" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norsk" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Nordsotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubianske sprog" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Traditionel newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (efter år 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Tyrkisk, Osmannisk (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomianske sprog" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuan-Australsk (Andre)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinansk" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauansk" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persisk, gammel (ca. 600-400 F.K.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persisk" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filippinsk (andre)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fønikisk" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polsk" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeiansk" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugisisk" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakritsprog" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provencalsk, Gammel (til 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthanisk" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongansk" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romansk (Andre)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Raeto-Romance" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumænsk" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russisk" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Sydamerikansk Indiansk (Andre)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salishanske sprog" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritansk Aramæisk" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbisk" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliansk" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Skotsk" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroatisk" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitisk (Andre)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irsk, Gammel (Indtil ca. 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Tegnsprog" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singhalesisk" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouxsprog" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetansk (Andre)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavisk (Andre)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakisk" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovensk" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sydsamisk (Lapland)" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Nordsamisk" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Samiske sprog (andre)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule-samisk" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Samisk" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoan" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Samisk" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spansk" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinian" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Saharansk (Sub-Saharansk Afrikansk)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundansk" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumeriansk" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Svensk" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syrisk" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitisk" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Thai (andre)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamilsk" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetansk" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tongaøerne)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshiansk" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmen" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupisprog" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Tyrkisk" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaisk (Turko-Tatarisk)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuviniansk" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritisk" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainsk" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Ikke fastsat" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbekisk" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamesisk" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakashanske sprog" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Walisisk" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbianske sprog" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Vallonsk" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jødisk" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupiske sprog" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Følgende handlinger udføres:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "ukendt" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "ikke-supporteret" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Niveau 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Niveau 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Niveau 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Yderligere kundekontrakt nødvendig" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "ugyldig" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Supportniveau er ikke angivet" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Leverandøren yder ikke support." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Problembestemmelse, som betyder teknisk support designet til at give " "kompatibilitetsinformation, installationsassistance, brugssupport, løbende " "vedligeholdelse og basal fejlsøgning. Niveau 1-support er ikke beregnet til " "at rette produktfejl." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Problemisolering, som betyder teknisk support designet til at duplikere " "kundeproblemer, isolere problemområdet og levere løsning på problemer som " "ikke løses af niveau 1-support." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Problemløsning, som betyder teknisk support designet til at løse komplekse " "problemer ved at inddrage udvikling i løsning af produktfejl som er blevet " "identificeret af niveau 2-support." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "En yderligere kundekontrakt er nødvendig for at få support." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Ukendt support-mulighed. Beskrivelse ikke tilgængelig" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Systemhåndtering er låst af programmet med pid %d (%s).\n" "
Luk dette program, før du prøver igen." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Ukendt matchtilstand \"%s\"" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Ukendt matchtilstand \"%s\" for mønstret \"%s\"" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Ugyldigt regulært udtryk '%s': Regcomp returnerede %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ugyldigt regulært udtryk '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autentificering påkrævet for '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besøg SUSE-kundercenteret for at tjekke om din registrering er gyldig og " "ikke er udløbet." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besøg Novell-kundercenteret for at tjekke om din registrering er gyldig og " "ikke er udløbet." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Opret tilknytningspunkt: Kan ikke finde en skrivbar mappe til oprettelse af " "et tilknytningspunkt" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Installér pakken \"lsof\" først." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Kan ikke oprette mappe med metadata-cache." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Fejl under forsøg på at læse fra \"%s\"" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Kan ikke oprette %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Caching af softwarekilde (%d) mislykkedes." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Opbygger cache for softwarekilden '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Kan ikke oprette cache i %s - ingen skriverettigheder." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Ikke-håndteret softwarekilde-type" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Tilføjer softwarekilden '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Ugyldig softwarekilde-filnavn i \"%s\"" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Kan ikke åbne filen \"%s\" til skrivning." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Ukendt fejl ved læsning fra \"%s\"" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Kan ikke læse softwarekildemappen \"%1%\": Adgang nægtet" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Kunne ikke læse mappen \"%s\"" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Kan ikke læse softwarekildefilen \"%1%\": Adgang nægtet" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Fjerner softwarekilden '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Kan ikke regne ud hvor softwarekilden er lagret." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Kan ikke slette \"%s\"" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Kan ikke regne ud hvor tjenesten er lagret." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Ukendt tjeneste \"%1%\": Fjerner forældreløs tjeneste-softwarekilde \"%2%\"" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Alias for softwarekilde må ikke starte med punktum." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Alias for tjeneste må ikke starte med punktum." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Vil du fortsætte?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Softwarekilden %1% definerer ikke yderligere 'gpgkey='-URL'er." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Leder efter gpg nøgle-ID'et %1% i softwarearkivet %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Leder efter gpg nøgle-ID'et %1% i mellemlageret %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Den påkrævede attribut '%s' mangler." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "En af eller begge '%s'- og '%s'-attributterne er påkrævet." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Verificering af signatur mislykkedes" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Pakken %s lader til at være blevet defekt under overførslen. Vil du forsøge " "at hente den igen?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Kunne ikke levere pakken %s. Vil du prøve at hente den igen?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm-kontrol mislykkedes." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm mislykkedes." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Tjeneste-plugin understøtter ikke ændring af en attribut." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Kan ikke levere filen '%s' fra softwarekilden '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Ingen URL i softwarekilden." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Filen %1%\n" " fra pakken\n" " %2%\n" " er i konflikt med filen fra pakken\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Filen %1%\n" " fra pakken\n" " %2%\n" " er i konflikt med filen fra installation af\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Filen %1%\n" " fra installation af\n" " %2%\n" " er i konflikt med en fil fra pakken\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Filen %1%\n" " fra installation af\n" " %2%\n" " er i konflikt med filen fra installation af\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Filen %1%\n" " fra pakken\n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra pakken\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Filen %1%\n" " fra pakken\n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra installation af\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Filen %1%\n" " fra installation af\n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra pakken\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Filen %1%\n" " fra installation af\n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra installation af\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Kan ikke oprette sat-pulje." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "ødelæg %s ved at ignorere nogle af dens afhængigheder" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "ignorér generelt nogle afhængigheder" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "modstridende forespørgsler" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "et eller andet afhængighedsproblem" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "ikke understøttet anmodning" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "slettede udbydere: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "ikke-installérbare leverandører: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "ikke-installérbare leverandører: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Denne anmodning vil ødelægge dit system!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorér advarslen om et ødelagt system" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "installér %1%, selvom den er blevet tilbagetrukket" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "giv tillade til installation af PTF'en %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "installér %1%, selvom den er sortlistet" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Installation er blevet afbrudt som ønsket." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " afviklet" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " afvikling mislykkedes" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s er allerede kørt som %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " afvikling skippet under afbrydelse" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Fejl under afsendelse af bekendtgørelse af opdateringsbesked." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Besked om ny opdatering" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM mislykkedes: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Import af offentlig nøgle %1% mislykkedes" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Fjernelse af den offentlige nøgle %1% mislykkedes" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Konfigurationsfiler er ændret for %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm gemte %s som %s, men det var umuligt at bestemme forskellen" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm gemt %s som %s.\n" "Her er de første 25 linjer af forskelle:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm oprettede %s som %s, men det var umuligt at bestemme forskellen" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm oprettet %s som %s.\n" "Her er de første 25 linjer af forskelle:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Yderligere rpm-output" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "backup %s blev oprettet" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Signatur er OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Ukendt signaturtype" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Signaturen verificerer ikke" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Signaturen er OK, men nøglen er ikke betroet" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Signaturens offentlige nøgle er ikke tilgængelig" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Filen findes ikke eller signaturen kan ikke tjekkes" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Filen er uden signatur" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "udløber ikke" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "udløbet: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "udløber: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(udløber ikke)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(UDLØBET)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(udløber indenfor 24 t.)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(udløber om %d dag)" msgstr[1] "(udløber om %d dage)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Prøvede at importere ikke-eksisterende nøgle %s ind i nøgleringen %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Kunne ikke importere nøgle." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Sletning af nøgle mislykkedes." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Signaturfilen %s blev ikke fundet" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tvivlsom type '%s' for %u byte checksum '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Kunne ikke åbne pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Kan ikke åbne dataledning (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Ugyldig LDAP URL-forespørgselsstreng" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Ugyldig LDAP URL-forespørgselsparameter '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Kan ikke klone URL-objekt" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Ugyldig tom URL-objektreference" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Kan ikke fortolke URL-komponenter" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historik:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "URL-oversigt tillader ikke %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Ugyldig %s-komponent '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Ugyldig %s-komponent" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Fortolkning af forespørgselsstreng er ikke understøttet af denne URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL-oversigt er en påkrævet komponent" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Ugyldig URL-oversigt '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "URL-oversigt tillader ikke et brugernavn" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "URL-oversigt tillader ikke en adgangskode" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "URL-oversigt kræver en værtskomponent" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "URL-oversigt tillader ikke en værtskomponent" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Ugyldig værtskomponent '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "URL-oversigt tillader ikke en port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Ugyldig portkomponent '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "URL-oversigt kræver et stinavn" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relativ sti er ikke tilladt hvis autoritet eksisterer" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Kodede strenge indeholder en NUL-byte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Ugyldigt skilletegn for parameter-array" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Ugyldigt skilletegn for parameter-map" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Ugyldigt skilletegn for parameter-array join" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Kommando afsluttet med status %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Kommando dræbtes af signalet %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Kommando afsluttet med ukendt fejl." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Kan ikke skifte rodmappe til '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Kan ikke skifte mappe til \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Kan ikke skifte mappe til \"%s\" indenfor chroot \"%s\" (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Kan ikke eksekvere '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Kan ikke forgrene (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Montering af %s mislykkedes på %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Afmontering af %s mislykkedes" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Dårligt filnavn: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Mediet åbnedes ikke under forsøg på at udføre handlingen '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Filen %s blev ikke fundet på mediet '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Kan ikke skrive filen '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Medie er ikke tilknyttet" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Dårligt tilknytningspunkt for medie" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Download (curl) initialisering mislykkede for '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Systemundtagelse '%s' på mediet '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Stien '%s' på mediet '%s' er ikke en fil." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Stien '%s' på mediet '%s' er ikke en mappe." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Dårligt formeret URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Tomt værtsmaskinenavn i URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Tomt filsystem i URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Tom destination i URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Ikke-understøttet URI-skema i '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operationen understøttes ikke af medie" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Download (curl)-fejl for '%s':\n" "Fejlkode: %s\n" "Fejlmeddelelse: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Fejl opstod under indstilling af download-tilvalg (curl) for \"%s\":" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Mediekilden '%s' indeholder ikke det ønskede medie" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Mediet '%s' er i brug af en anden instans" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Kan ikke skubbe noget medie ud" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Kan ikke skubbe mediet '%s' ud" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Adgangstilladelse til '%s' nægtet." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Tidsfrist udløbet ved tilgang af \"%s\"." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Downloadede data oversteg den ventede filstørrelse '%s' med '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Placeringen \"%s\" er midlertidigt utilgængelig." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL-certifikatproblem. Tjek at CA-certifikatet er OK for '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Ikke-understøttet HTTP autentificeringsmetode '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ja" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nej" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Bemærk:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Advarsel:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Fejl:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "udført" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "fejl" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Advarsel: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Henter:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "starter" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "ikke fundet" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Ingen hjælp tilgængelig for denne forespørgsel." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "ingen hjælp tilgængelig for dette tilvalg" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "vis alle tilvalg" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ja" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nej" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Der blev ikke fundet gyldige metadata på den angivne URL" #~ msgstr[1] "Der blev ikke fundet gyldige metadata på de angivne URL'er" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Udfører %%posttrans-scriptet '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Udfører %posttrans-scripts" #~ msgid "Package is not signed!" #~ msgstr "Pakke er ikke signeret!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s hører ikke til en distopgradering-softwarekilde" #~ msgid "%s has inferior architecture" #~ msgstr "%s har laverestående arkitektur" #~ msgid "problem with installed package %s" #~ msgstr "problem med den installerede pakke %s" #~ msgid "nothing provides requested %s" #~ msgstr "intet leverer forespurgt %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Har du aktiveret alle anmodede softwarekilder?" #~ msgid "package %s does not exist" #~ msgstr "pakken %s findes ikke" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s leveres af systemet og kan ikke slettes" #~ msgid "%s is not installable" #~ msgstr "%s kan ikke installeres" #~ msgid "nothing provides %s needed by %s" #~ msgstr "intet leverer %s, der kræves af %s" #~ msgid "cannot install both %s and %s" #~ msgstr "kan ikke installere både %s og %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s konflikter med %s, der leveres af %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s forælder %s, der leveres af %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "installerede %s forælder %s, der leveres af %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "solvable %s konflikter med %s, der leveres af den selv" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s kræver %s, men dette krav kan ikke leveres" #~ msgid "remove lock to allow removal of %s" #~ msgstr "fjern lås for at tillade fjernelse af %s" #~ msgid "do not install %s" #~ msgstr "installér ikke %s" #~ msgid "keep %s" #~ msgstr "behold %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "fjern lås for at tillade installation af %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "spørg ikke efter at installere en solvable, der leverer %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "spørg ikke efter at slette alle solvables, der leverer %s" #~ msgid "do not install most recent version of %s" #~ msgstr "installér ikke sidste nye version af %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "behold %s på trods af laverestående arkitektur" #~ msgid "install %s despite the inferior architecture" #~ msgstr "installér %s på trods af laverestående arkitektur" #~ msgid "keep obsolete %s" #~ msgstr "behold forældet %s" #~ msgid "install %s from excluded repository" #~ msgstr "installér %s fra ekskluderet softwarekilde" #~ msgid "downgrade of %s to %s" #~ msgstr "nedgradering af %s til %s" #~ msgid "architecture change of %s to %s" #~ msgstr "arkitekturændring af %s til %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "installér %s (med leverandørændring)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "udskiftning af %s med %s" #~ msgid "deinstallation of %s" #~ msgstr "afinstallation af %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Kan ikke åbne låsefilen: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Denne handling køres allerede af et andet program." #~ msgid "Hal Exception" #~ msgstr "Hal-undtagelse" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Beklager, denne version af libzypp blev bygget uden HAL-understøttelse." #~ msgid "HalContext not connected" #~ msgstr "HalContext er ikke tilsluttet" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive er ikke initialiseret" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume er ikke initialiseret" #~ msgid "Unable to create dbus connection" #~ msgstr "Kan ikke oprette dbus-tilslutning" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: libhal-kontekst kan ikke oprettes" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: dbus-tilslutning kan ikke indstilles" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Kan ikke initialisere HAL-kontekst -- kører hald ikke?" #~ msgid "Not a CDROM drive" #~ msgstr "Ikke et cd-rom-drev" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Mutex-attributter kan ikke initialiseres" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Rekursive mutex-attributter kan ikke angives" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Rekursive mutex-attributter kan ikke initialiseres" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Mutex-lås kan ikke hentes" #~ msgid "Can't release the mutex lock" #~ msgstr "Mutex-lås kan ikke frigives" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Import af offentlig nøgle fra filen %s fejlede: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Fjernelse af den offentlige nøgle %s fejlede: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Kan ikke finde tilgængelig løkkeenhed til at montere imagefilen fra '%s'" libzypp-17.36.5/po/de.po000066400000000000000000004401651476576476200147760ustar00rootroot00000000000000# translation of zypp.de.po to German # translation of zypp.de.po to # @TITLE@ # Copyright (C) 2006, SUSE Linux GmbH, Nuremberg # # This file is distributed under the same license as @PACKAGE@ package. FIRST # # # Lars Vogdt , 2007. # Stephan Kulow , 2007. # Marko Schugardt , 2008,2009. # Michael Skiba , 2008, 2012, 2013. # Jannick Kuhr , 2008. # Hermann-Josef Beckers , 2009. # Hermann J. Beckers , 2011, 2014. msgid "" msgstr "" "Project-Id-Version: zypp.de\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2025-03-15 21:29+0000\n" "Last-Translator: Ettore Atalan \n" "Language-Team: German " "\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.10.3\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Unbekanntes Land: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Kein Code" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Vereinigte Arabische Emirate" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua und Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanien" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenien" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Niederländische Antillen" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktis" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentinien" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikanisch Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Österreich" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australien" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Aland-Inseln" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Aserbaidschan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Herzegowina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesch" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgien" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgarien" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivien" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasilien" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvetinsel" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Weißrussland" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosinseln" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Zentralafrikanische Republik" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Schweiz" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Côte d'Ivoire" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookinseln" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbien" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kap Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Weihnachtsinsel" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Zypern" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tschechische Republik" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Deutschland" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Dschibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dänemark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikanische Republik" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algerien" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estland" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Ägypten" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Westsahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanien" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Äthiopien" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finnland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidschi" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandinseln (Malwinen)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Föderierte Staaten von Mikronesien" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Färöer-Inseln" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Frankreich" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Frankreich, Metropolitan" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabun" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Vereinigtes Königreich" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgien" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Französisch-Guayana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grönland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Griechenland" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Südgeorgien und die südlichen Sandwichinseln" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard-Insel und McDonald-Inseln" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatien" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungarn" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesien" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isle of Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indien" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britisches Territorium im Indischen Ozean" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italien" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaika" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordanien" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodscha" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komoren" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "St. Kitts und Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Nordkorea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Südkorea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kaimaninseln" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kasachstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Demokratische Volksrepublik Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "St. Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litauen" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Lettland" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libyen" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldau" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshallinseln" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Mazedonien" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolei" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Nördliche Marianen" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauretanien" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Malediven" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mosambik" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Neukaledonien" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolkinsel" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Niederlande" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norwegen" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauruanisch" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Neuseeland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Französisch-Polynesien" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua-Neuguinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Philippinen" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polen" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "St. Pierre und Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palästinensische Autonomiegebiete" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumänien" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbien" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russische Föderation" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi-Arabien" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salomonen" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychellen" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Schweden" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "St. Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slowenien" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard und Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slowakei" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome und Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syrien" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swasiland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- und Caicosinseln" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tschad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Französische Süd- und Antarktisgebiete" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadschikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunesien" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Osttimor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Türkei" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad und Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tansania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraine" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Amerikanisch-Ozeanien" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "USA" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Usbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Heiliger Stuhl (Vatikan)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent und die Grenadinen" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britische Jungferninseln" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Amerikanische Jungferninseln" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis und Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Südafrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Sambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Simbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Bereitstellungen" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "setzt voraus" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Anforderungen" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Konflikte" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Veraltetete Pakete" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Empfehlungen" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Vorschläge" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Erweiterungen" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Zusätze" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Unbekannte Sprache: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar-Sprache" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abchasisch" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Aceh-Sprache" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acholi-Sprache" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme-Sprache" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adygeisch" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Andere afro-asiatische Sprachen" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan-Sprache" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadisch" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanisch" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutisch" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonkin-Sprachen" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altaisch" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharisch" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Altenglisch (ca. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apachen-Sprachen" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabisch" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramäisch" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonesisch" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armenisch" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Arauka-Sprachen" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho-Sprache" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Andere Kunstsprache" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak-Sprachen" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamesisch" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturianisch" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapaskische Sprachen" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australische Sprachen" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Awarisch" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Awestisch" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara-Sprache" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Aserbeidschanisch" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda-Sprache" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke-Sprache" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Baschkirisch" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Belutschisch" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara-Sprache" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinesisch" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskisch" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basaa-Sprache" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Andere baltische Sprachen" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Bedauye" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Weißrussisch" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba-Sprache" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Andere Berbersprachen" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol-Sprache" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini-Sprache" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Blackfoot-Sprache" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Andere Bantusprachen" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnisch" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj-Bhakha" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonisch" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak-Sprache" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Burjatisch" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugi-Sprache" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarisch" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmesisch" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Bilin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo-Sprachen" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Andere Indianersprachen (Zentralamerika)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Karibisch" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalanisch" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Andere kaukasische Sprachen" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Andere keltische Sprachen" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro-Sprache" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha-Sprachen" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tschetschenisch" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Tschagataisch" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinesisch" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Trukesisch" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook-Jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw-Sprache" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee-Sprache" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Kirchenslawisch" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Tschuwaschisch" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne-Sprache" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Cham-Sprachen" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptisch" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Kornisch" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsisch" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreolisch-Englisch (andere)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreolisch-Französisch (andere)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreolisch-Portugiesisch (andere)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree-Sprache" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krimtatarisch" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreolische Sprachen (Pidgin-Sprachen)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kaschubisch" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Andere kuschitische Sprachen" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tschechisch" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota-Sprache" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dänisch" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Darginisch" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dajakisch" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware-Sprache" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave-Sprache" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib-Sprache" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka-Sprache" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Maledivisch" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Andere drawidische Sprachen" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Niedersorbisch" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala-Sprachen" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Mittelniederländisch (ca. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Niederländisch" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula-Sprache" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Altägyptisch" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamisch" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Englisch" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Mittelenglisch (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estnisch" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe-Sprache" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Pangwe-Sprache" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Färöisch" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fante-Sprache" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fidschi-Sprache" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Pilipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finnisch" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Andere finnougrische Sprachen" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon-Sprache" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Französisch" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Mittelfranzösisch (ca. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Altfranzösisch (842-ca. 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Friesisch" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Ful" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulisch" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo-Sprache" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya-Sprache" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Andere germanische Sprachen" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgisch" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Deutsch" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Altäthiopisch" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertesisch" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gälisch" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irisch" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galicisch" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manxs" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Mittelhochdeutsch (ca. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Althochdeutsch (ca. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi-Sprache" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalesisch" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotisch" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo-Sprache" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Altgriechisch (bis 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Griechisch (nach 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani-Sprache" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati-Sprache" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Kutchin-Sprache" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida-Sprache" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitien" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Haussa-Sprache" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiisch" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebräisch" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero-Sprache" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon-Sprache" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hethitisch" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Miao-Sprachen" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri-Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Obersorbisch" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ungarisch" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa-Sprache" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban-Sprache" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Ibo-Sprache" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Isländisch" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Sinohoan" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Nosu" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo-Sprache" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingua" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Ilokano-Sprache" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Andere indoarische Sprachen" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesisch" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Andere indogermanische Sprachen" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Inguschisch" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupik" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Andere iranische Sprachen" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokesische Sprachen" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italienisch" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanisch" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japanisch" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Jüdisch-Persisch" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Jüdisch-Arabisch" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpakisch" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabylisch" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin-Sprache" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Grönländisch" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba-Sprache" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karenisch" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kaschmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri-Sprache" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kasachisch" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardinisch" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi-Sprache" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Andere Khoisan-Sprachen" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Kambodschanisch" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Andere Khoisan-Sprachen" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu-Sprache" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Rwanda-Sprache" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgisisch" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu-Sprache" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi-Sprache" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo-Sprache" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreanisch" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraeanisch" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle-Sprache" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karatschaisch" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru-Sprachen" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Oraon-Sprache" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kwanyama-Sprache" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumükisch" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdisch" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai-Sprache" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Judenspanisch" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba-Sprache (Bantusprache)" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laotisch" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latein" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Lettisch" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lesgisch" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgisch" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litauisch" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo-Sprache" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Rotse-Sprache" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgisch" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Lulua-Sprache" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga-Sprache" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda-Sprache" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno-Sprache" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda-Sprache" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo-Sprache" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai-Sprache" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonisch" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Maduresisch" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Khotta" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marschallesisch" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makassarisch" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Malinke-Sprache" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori-Sprache" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Andere austronesische Sprachen" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Massai-Sprache" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malaiisch" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Mokschamordwinisch" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandaresisch" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende-Sprache" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Mittelirisch (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Micmac-Sprache" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau-Sprache" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Verschiedene Sprachen" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Andere Mon-Khmer-Sprachen" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagassi-Sprache" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltesisch" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Mandschurisch" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Meithei-Sprache" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo-Sprache" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk-Sprache" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldauisch" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolisch" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi-Sprache" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Mehrere Sprachen" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Mundasprachen" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Muskogisch" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandesisch" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Maya-Sprachen" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erza-Mordwinisch" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Indianersprachen (Nordamerika)" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitanisch" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo-Sprache" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndbele-Sprache (Transvaal)" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele-Sprache (Simbabwe)" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Niederdeutsch" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Newari" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias-Sprache" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Andere Nigerkordofanische Sprachen" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niue-Sprache" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Bokmål" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogaisch" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Altnorwegisch" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norwegisch" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho-Sprache (Nord)" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubische Sprachen" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Alt-Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Nyanja-Sprache" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi-Sprache" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nikole-Sprache" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro-Sprache" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima-Sprache" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Okzitanisch (nach 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa-Sprache" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya-Sprache" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Galla-Sprache" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage-Sprache" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetisch" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Osmanisch (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomangue-Sprachen" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Andere Papuasprachen" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan-Sprache" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pehlewi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanggan-Sprache" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Pandschabi-Sprache" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palau-Sprache" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Altpersisch (ca. 600-400 v. Chr.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persisch" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Philippinen-Austronesisch (andere)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Phönikisch" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polnisch" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Ponapeianisch" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugiesisch" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prâkrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Altprovenzalisch (Altokzitanisch, bis 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Paschtu" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua-Sprache" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Osterinsel-Sprache" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotonganisch" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Andere romanische Sprachen" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Rätoromanisch" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romani (Sprache)" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumänisch" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi-Sprache" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russisch" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe-Sprache" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango-Sprache" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Jakutisch" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Andere Indianersprachen (Südamerika)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salish-Sprachen" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritanisch" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbisch" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sizilianisch" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Schottisch" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroatisch" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkupisch" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Andere semitische Sprachen" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Altirisch (bis 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Zeichensprachen" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Schan-Sprache" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo-Sprache" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singhalesisch" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Sioux-Sprachen" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Andere sinotibetische Sprachen" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Andere slawische Sprachen" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slowakisch" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slowenisch" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Südsamisch" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Nordsamisch" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Samisch (andere)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule-Samisch" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari-Samisch" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoanisch" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt-Lappisch" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Schona-Sprache" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi-Sprache" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke-Sprache" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdisch" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai-Sprache" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Süd-Sotho-Sprache" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spanisch" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardisch" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer-Sprache" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilosaharanische Sprachen" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swasi-Sprache" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma-Sprache" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanesisch" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerisch" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Schwedisch" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syrisch" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitisch" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Andere Thaisprachen" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatarisch" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu-Sprache" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Temne-Sprache" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno-Sprache" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum-Sprache" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadschikisch" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thailändisch" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetisch" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre-Sprache" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinja-Sprache" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv-Sprache" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingonisch" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit-Sprache" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamaseq" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Bantusprache, Sambia)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tongaisch" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Neumelanesisch" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian-Sprache" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana-Sprache" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga-Sprache" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmenisch" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka-Sprache" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Türkisch" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Andere altaische Sprachen" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi-Sprache" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuwinisch" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurtisch" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritisch" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uigurisch" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainisch" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Mbundu-Sprache" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Unbestimmt" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Usbekisch" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai-Sprache" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda-Sprache" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamesisch" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Wotisch" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakash-Sprachen" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo-Sprache" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo-Sprache" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Kymrisch" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbisch" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Wallonisch" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof-Sprache" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmückisch" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa-Sprache" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao-Sprache (Bantusprache)" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapesisch" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jiddisch" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba-Sprache" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupik-Sprache" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotekisch" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande-Sprachen" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu-Sprache" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni-Sprache" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Folgende Aktionen werden ausgeführt:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "Unbekannt" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nicht unterstützt" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Stufe 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Stufe 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Stufe 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Zusätzlicher Kundenvertrag erforderlich" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Nicht mehr in Betrieb und durch ein anderes Paket ersetzt" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "ungültig" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Die Support-Stufe wurde nicht angegeben" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Der Anbieter bietet keinen Support an." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Problembestimmung bezeichnet den technischen Support, der " "Kompatibilitätsinformationen, Hilfe bei der Installation, " "Anwendungsunterstützung, fortlaufende Wartung und grundlegende Hilfe bei der " "Fehlersuche bietet. Support der Stufe 1 ist nicht dazu gedacht, " "Produktfehler zu beheben." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Problemisolierung bezeichnet den technischen Support, der Kundenprobleme " "nachbildet, Problembereiche isoliert und Lösungen für Probleme bietet, die " "nicht durch den Support der Stufe 1 behoben werden konnten." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Problemlösung bezeichnet den technischen Support, der komplexe Probleme " "lösen soll, wobei das Engineering zur Beseitigung von Produktfehlern, die im " "Support der Stufe 2 erkannt wurden, einbezogen wird." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" "Ein zusätzlicher Kundenvertrag ist erforderlich, um Unterstützung zu " "erhalten." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Das Paket ist nicht mehr in Betrieb und wurde durch ein neueres Paket mit " "einem anderen Namen ersetzt." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Unbekannte Support-Option. Keine Beschreibung vorhanden" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Die Systemverwaltung ist gesperrt durch die Anwendung mit PID %d (%s).\n" "Schließen Sie diese Anwendung, bevor Sie es erneut versuchen." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Unbekannter Übereinstimmungsmodus '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Unbekannter Übereinstimmungsmodus %s für Schema %s" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Ungültiger regulärer Ausdruck '%s': regcomp gab %d zurück" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ungültiger regulärer Ausdruck '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Authentifizierung erforderlich für '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Werde es erneut versuchen..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Gebe nach %1% Versuchen auf." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besuchen Sie den SUSE Customer Center zur Prüfung, ob Ihre Registrierung " "gültig und nicht abgelaufen ist." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besuchen Sie den Novell Customer Center zur Prüfung, ob Ihre Registrierung " "gültig und nicht abgelaufen ist." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Anschlusspunkt erstellen: Kann kein schreibbares Verzeichnis finden, um " "einen Anschlusspunkt zu erstellen" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Bitte zuerst Paket 'lsof' installieren." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Metadaten-Cache-Verzeichnis konnte nicht erstellt werden." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Fehler beim Versuch, aus '%s' zu lesen" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "%s konnte nicht erstellt werden" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Repo (%d) konnte nicht im Cache gespeichert werden." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Cache für Repository '%s' erzeugen" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" "Cache konnte auf %s nicht erstellt werden - keine Schreibberechtigungen." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Unverarbeiteter Repository-Typ" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Repository '%s' hinzufügen" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Repo-Dateiname bei '%s' ungültig" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Datei '%s' konnte nicht zum Schreiben geöffnet werden." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Unbekannter Fehler beim Lesen aus '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Repo-Verzeichnis '%1%' kann nicht gelesen werden: Zugriff verweigert" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Verzeichnis '%s' konnte nicht gelesen werden" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Repo-Datei '%1%' kann nicht gelesen werden: Zugriff verweigert" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Metadaten werden bereinigt" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Pakete werden bereinigt" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Zwischenspeicher-Verzeichnisse werden bereinigt" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Verzeichnis wird bereinigt: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Zwischenspeicher wird bereinigt" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Aus dem Zwischenspeicher wird geladen" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Repository '%s' entfernen" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Speicherort des Repos kann nicht gefunden werden." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "'%s' kann nicht gelöscht werden" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Repositorium wird geändert" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Repositorium wird aufgefrischt: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Speicherort des Dienstes kann nicht gefunden werden." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Unbekannter Dienst '%1%': Verwaistes Dienst-Repository '%2%' wird entfernt" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Ein Repository-Alias darf nicht mit einem Punkt beginnen." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Ein Dienst-Alias darf nicht mit einem Punkt beginnen." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Kein Digest für Datei %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Unbekannter Digest %s für Datei %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Fehler beim Überprüfen des Digest für Datei '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Die Datei '%s' ist unsigniert. Weiter?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Die Datei '%s' aus dem Repository '%s' ist unsigniert. Weiter?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Wollen Sie den Schlüssel abweisen, ihm temporär oder immer vertrauen?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Schlüsselname: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "%1% neuen Paket-Signierschlüssel von Repository \"%2%\" erhalten:" msgstr[1] "%1% neue Paket-Signierschlüssel von Repository \"%2%\" erhalten:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Signaturüberprüfung für Datei '%1%' fehlgeschlagen." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Signaturüberprüfung für Datei '%1%' aus Repository '%2%' fehlgeschlagen." # internal key used: Ok # internal key used: Ok #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Fortfahren?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Datei '%s' ist mit einem unbekannten Schlüssel '%s' signiert. Weiter?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Die Datei '%s' aus dem Repository '%s' ist mit einem unbekannten Schlüssel " "'%s' signiert. Weiter?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Repository %1% definiert keine zusätzlichen 'gpgkey='-URLs." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Suche nach der GPG-Key-ID %1% im Repository %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Suche nach der GPG-Key-ID %1% im Cache %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Erforderliches Attribut '%s' fehlt." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Eines oder beide der Attribute '%s' oder '%s' sind erforderlich." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Fehler beim Überprüfen der Signatur" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Paket %s wurde anscheinend bei der Übertragung beschädigt. Möchten Sie " "erneut versuchen, es abzurufen?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Paket %s konnte nicht bereitgestellt werden. Möchten Sie erneut versuchen, " "es abzurufen?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Applydeltarpm-Prüfung nicht bestanden." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "Fehler bei applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Das Dienst-Plugin unterstützt keine Änderung von Attributen." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" "Datei '%s' aus Repository '%s' kann nicht zur Verfügung gestellt werden" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Das Repository enthält keine URL." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Erwartetes Medium %1%/%2%, identifiziert durch Datei '%3%', mit dem Inhalt:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Datei %1%\n" " aus Paket\n" " %2%\n" " im Konflikt mit Datei aus Paket\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Datei %1%\n" " aus Paket\n" " %2%\n" " im Konflikt mit Datei aus Installation von\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Datei %1%\n" " aus Installation von\n" " %2%\n" " im Konflikt mit Datei aus Paket\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Datei %1%\n" " aus Installation von\n" " %2%\n" " im Konflikt mit Datei aus Installation von\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Datei %1%\n" " aus Paket\n" " %2%\n" " im Konflikt mit Datei\n" " %3%\n" " aus Paket\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Datei %1%\n" " aus Paket\n" " %2%\n" " im Konflikt mit Datei\n" " %3%\n" " aus Installation von\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Datei %1%\n" " aus Installation von\n" " %2%\n" " im Konflikt mit Datei\n" " %3%\n" " aus Paket\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Datei %1%\n" " aus Installation von\n" " %2%\n" " im Konflikt mit Datei\n" " %3%\n" " aus Installation von\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Sat-Pool kann nicht erstellt werden." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "%s durch Ignorieren einiger Abhängigkeiten brechen" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "Einige Abhängigkeiten allgemein ignorieren" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "das installierte %1% gehört nicht zu einem distupgrade-Repository und muss " "ersetzt werden" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "das zu installierende %1% gehört nicht zu einem distupgrade-Repository" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "das installierte %1% hat eine minderwertige Architektur" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "das zu installierende %1% hat eine minderwertige Architektur" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "Problem mit dem installierten %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "In Konflikt stehende Anforderungen" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "Abhängigkeitsproblem" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "nichts stellt das angeforderte '%1%' bereit" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Haben Sie alle erforderlichen Repositorys aktiviert?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "das angeforderte Paket %1% ist nicht vorhanden" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "nicht unterstützte Anforderung" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' wird vom System bereitgestellt und kann nicht gelöscht werden" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% ist nicht installierbar" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "nichts stellt '%1%' bereit, das vom installierten %2% benötigt wird" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" "nichts stellt '%1%' bereit, das vom zu installierenden %2% benötigt wird" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "kann nicht %1% und %2% installieren" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "das installierte %1% steht im Konflikt mit '%2%', das vom installierten %3% " "bereitgestellt wird" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "das installierte %1% steht im Konflikt mit '%2%', das von dem zu " "installierenden %3% bereitgestellt wird" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "das zu installierende %1% steht im Konflikt mit '%2%', das vom installierten " "%3% bereitgestellt wird" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "das zu installierende %1% steht im Konflikt mit '%2%', das vom zu " "installierenden %3% bereitgestellt wird" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "das installierte %1% ersetzt '%2%', das vom installierten %3% bereitgestellt " "wird" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "das installierte %1% ersetzt '%2%', das durch das zu installierende %3% " "bereitgestellt wird" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "das zu installierende %1% ersetzt '%2%', das vom installierten %3% " "bereitgestellt wird" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "das zu installierende %1% ersetzt '%2%', das durch das zu installierende %3% " "bereitgestellt wird" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" "das installierte %1% steht im Konflikt mit dem von ihm selbst " "bereitgestellten '%2%'" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "das zu installierende %1% steht im Konflikt mit dem von ihm selbst " "bereitgestellten '%2%'" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "das installierte %1% erfordert '%2%', aber diese Anforderung kann nicht " "bereitgestellt werden" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "das zu installierende %1% erfordert '%2%', aber diese Anforderung kann nicht " "bereitgestellt werden" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "Gelöschte Anbieter: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "Nicht installierbare Anbieter: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "Nicht installierbare Anbieter: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% ist noch nicht vollständig in %2% integriert." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Normalerweise würden Sie das PTF behalten und die Wartungs-Patches nicht " "installieren." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Das Entfernen des installierten %1% in diesem Zusammenhang entfernt (nicht " "ersetzt!) auch die enthaltenen PTF-Pakete." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "Das PTF sollte durch den Aufruf von '%1%' entfernt werden. Dies aktualisiert " "die enthaltenen PTF-Pakete, anstatt sie zu entfernen." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Normalerweise möchten Sie die PTF behalten oder die Aktion abbrechen." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Das installierte %1% blockiert die gewünschte Aktion." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Normalerweise möchten Sie das PTF behalten und brechen die Aktion ab." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "Sperre entfernen, um das Entfernen von %1% zuzulassen" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "%1% nicht installieren" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "%1% beibehalten" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "Sperre entfernen, um Installation von %1% zuzulassen" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Diese Anfrage bringt Ihr System zum Absturz!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "Warnung vor einem beschädigten System ignorieren" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" "Installation eines auflösbaren Elements, das %1% bereitstellt, nicht " "anfordern" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" "Löschen aller auflösbaren Elemente, die %1% bereitstellen, nicht anfordern" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "neueste Version von %1% nicht installieren" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "%1% trotz der minderwertigen Architektur beibehalten" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "%1% trotz der minderwertigen Architektur installieren" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "veraltetes %1% beibehalten" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "%1% aus ausgeschlossenem Repository installieren" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "%1% installieren, obwohl es widerrufen wurde" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "Erlauben das PTF %1% zu installieren" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "%1% installieren, obwohl es geblacklistet ist" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "Herabstufung von %1% auf %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "Architekturänderung von %1% in %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "%1% installieren (mit Herstellerwechsel)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "%1% von Hersteller %2% installieren\n" "und %3% von Hersteller %4% ersetzen" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "Ersetzung von %1% durch %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "Deinstallation von %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Nach-Transaktions-Skripte werden ausgeführt" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Skript %1% wird ausgeführt" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Ausgabe des Skripts %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Die Installation wurde gemäß Anweisung abgebrochen." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " ausgeführt" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " Ausführung fehlgeschlagen" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s bereits als %s ausgeführt)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " Ausführung beim Abbrechen übersprungen" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Fehler beim Senden der Aktualisierungsbenachrichtigung." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Neue Aktualisierungsbenachrichtigung" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Empfangenes Signal: „%1% (%2%)“, um die Konsistenz des Systems zu " "gewährleisten, ist es nicht möglich, eine laufende rpm-Transaktion " "abzubrechen." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" "Die Ausführung der Transaktion ist aufgrund der folgenden Probleme " "fehlgeschlagen:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "Kein Spiegelserver gefunden" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "Zieldatei konnte nicht erstellt werden" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "Temporäre Datei konnte nicht umbenannt werden." #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "Fertiggestellt" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "Durch Benutzer abgebrochen." #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM fehlgeschlagen: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Importieren des öffentlichen Schlüssels %1% fehlgeschlagen" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Entfernen des öffentlichen Schlüssels %1% fehlgeschlagen" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Paket-Kopfdaten sind nicht signiert!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Paket-Nutzdaten sind nicht signiert!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Geänderte Konfigurationsdateien für %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm hat %s als %s gespeichert, der Unterschied konnte jedoch nicht ermittelt " "werden" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm hat %s als %s gespeichert.\n" "Hier die ersten 25 Zeilen mit Unterschieden:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "rpm hat %s als %s erstellt, der Unterschied konnte jedoch nicht ermittelt " "werden" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm hat %s als %s erstellt.\n" "Hier die ersten 25 Zeilen mit Unterschieden:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Zusätzliche rpm-Ausgabe" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "Sicherung %s erstellt" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Signatur ist OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Unbekannter Signaturtyp" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Signatur ist nicht OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Signatur ist OK, aber Schlüssel ist nicht verbürgt" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Öffentlicher Schlüssel für Signatur nicht verfügbar" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Datei nicht vorhanden oder Signatur kann nicht geprüft werden" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Datei ist unsigniert" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "läuft nicht ab" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "abgelaufen: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "läuft ab: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(läuft nicht ab)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(ABGELAUFEN)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(läuft innerhalb 24 Stunden ab)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(läuft innerhalb von %d Tag ab)" msgstr[1] "(läuft innerhalb von %d Tagen ab)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" "Versuch, nicht existierenden Schlüssel %s in Schlüsselbund %s zu importieren" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Importieren des Schlüssels fehlgeschlagen." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Fehler beim Löschen des Schlüssels." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Signaturdatei %s nicht gefunden" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Typ '%s' für %u-Byte-Prüfsumme '%s' fragwürdig" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "PTY (%s) kann nicht geöffnet werden." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Pipe (%s) kann nicht geöffnet werden." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Unzulässige Abfragezeichenkette für die LDAP-URL" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Unzulässiger Abfrageparameter für die LDAP-URL '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "URL-Objekt kann nicht geklont werden" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Unzulässiger leerer URL-Objektverweis" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "URL-Komponenten können nicht analysiert werden" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Verlauf:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "%s laut URL-Schema nicht zulässig" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Unzulässige %s-Komponente: '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Unzulässige %s-Komponente" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" "Die Analyse von Abfragezeichenketten wird für diese URL nicht unterstützt" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Das URL-Schema ist eine erforderliche Komponente" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "'%s' ist ein unzulässiges URL-Schema" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Benutzername laut URL-Schema nicht zulässig" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Passwort laut URL-Schema nicht zulässig" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Für das URL-Schema ist eine Host-Komponente erforderlich" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Host-Komponente laut URL-Schema nicht zulässig" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Unzulässige Host-Komponente: '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Port laut URL-Schema nicht zulässig" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Unzulässige Portkomponente: '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Für das URL-Schema ist ein Pfadname erforderlich" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" "Die Angabe des relativen Pfads ist nicht erlaubt, wenn die " "Zertifizierungsstelle vorhanden ist" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Verschlüsselte Zeichenfolge enthält ein NULL-Byte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Ungültiges Trennzeichen für Parameter-Array-Spaltung" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Ungültiges Trennzeichen für Parameterzuordnungs-Spaltung" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Ungültiges Trennzeichen für Parameter-Array-Zusammenführung" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Kommando mit Status %d beendet." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Kommando wurde mit Signal %d (%s) beendet." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Kommando mit unbekanntem Fehler beendet." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Ungültige Spawn-Argumente angegeben." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Steuer-Pipe kann nicht erstellt werden." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "chroot zu '%s' (%s) nicht möglich." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Wechsel zu '%s' nicht möglich (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Wechsel zu '%s' innerhalb chroot '%s' nicht möglich (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "exec '%s' (%s) nicht möglich." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "(%s) abzweigen nicht möglich." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "exec '%s' nicht möglich, chdir fehlgeschlagen (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "exec '%s' nicht möglich, chroot fehlgeschlagen (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "exec '%s' nicht möglich, exec fehlgeschlagen (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "exec '%s' nicht möglich, unerwarteter Fehler." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Einhängen von '%s' in '%s' ist fehlgeschlagen" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Aushängen von '%s' ist fehlgeschlagen" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Schlechter Dateiname: '%s'" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" "Beim Versuch, Aktion '%s' durchzuführen, wurde das Medium nicht geöffnet." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Datei '%s' auf Medium '%s' nicht gefunden" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Datei '%s' kann nicht geschrieben werden." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Medium nicht angeschlossen" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Fehlerhafter Medienanschlusspunkt" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Fehler bei der Initialisierung von Download (curl) für '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Systemausnahme '%s' auf Medium '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Pfad '%s' auf Medium '%s' ist keine Datei." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Pfad '%s' auf Medium '%s' ist kein Verzeichnis." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Fehlerhaft gebildete URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Leerer Hostname in URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Leeres Dateisystem in URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Leeres Ziel in URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Nicht unterstütztes URI-Schema in '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Vorgang von Medium nicht unterstützt" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Fehler beim Download (curl) für '%s':\n" "Fehlercode: '%s'\n" "Fehlermeldung: '%s'\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Beim Festlegen der Download (curl)-Optionen für '%s' ist ein Fehler " "aufgetreten:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Medienquelle '%s' enthält nicht das gewünschte Medium" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Medium '%s' wird von einer anderen Instanz verwendet" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Es kann kein Medium ausgeworfen werden" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Medium '%s' kann nicht ausgeworfen werden" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Zugriff auf '%s' verweigert." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Zeitüberschreitung beim Zugriff auf '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "Die heruntergeladenen Daten überschritten die erwartete Dateigröße '%s' von " "'%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Auf den Standort '%s' kann zeitweise nicht zugegriffen werden." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " SSL-Zertifikat-Problem; überprüfen Sie, ob das CA-Zertifikat für '%s' in " "Ordnung ist." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Keine freien Ressourcen zum Anhängen des Mediums verfügbar." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Nicht unterstützte HTTP-Authentifizierungsmethode '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Download (curl) Fehler für '%s':\n" "Fehlercode: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Download (curl) Fehler für '%s':\n" "HTTP-Antwort kann nicht abgerufen werden\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ja" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nein" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Hinweis:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Warnung:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Fehler:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "fertig" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "Achtung" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "Fehler" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Warnung: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Abrufen:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "Starten" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "Nicht gefunden" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Keine Hilfe für diese Eingabeaufforderung verfügbar." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "Keine Hilfe für diese Option verfügbar" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "zeigt alle Optionen" # For consistency, use the capitalized form #345187 #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ja" # For consistency, use the capitalized form #345187 #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nein" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Keine gültigen Metadaten bei dem festgelegten URL gefunden" #~ msgstr[1] "Keine gültigen Metadaten bei den festgelegten URLs gefunden" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "%%posttrans script '%1%' wird ausgeführt" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "%posttrans scripts werden ausgeführt" #~ msgid "Package is not signed!" #~ msgstr "Paket ist nicht signiert!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s gehört nicht zu einem Distributionsaktualisierungs-Repository" #~ msgid "%s has inferior architecture" #~ msgstr "%s besitzt eine nachrangige Architektur" #~ msgid "problem with installed package %s" #~ msgstr "Problem mit installiertem Paket %s" #~ msgid "nothing provides requested %s" #~ msgstr "Angefordertes %s wird nirgends zur Verfügung gestellt" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Wurden alle erforderlichen Repositorys aktiviert?" #~ msgid "package %s does not exist" #~ msgstr "Paket %s existiert nicht" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s wird vom System bereitgestellt und kann nicht gelöscht werden" #~ msgid "%s is not installable" #~ msgstr "%s ist nicht installierbar" #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s benötigt von %s wird nirgends zur Verfügung gestellt" #~ msgid "cannot install both %s and %s" #~ msgstr "%s und %s können nicht gleichzeitig installiert sein" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "" #~ "%s steht in Konflikt mit %s, das von %s zur Verfügung gestellt wurde" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s löst %s ab, das von %s zur Verfügung gestellt wurde" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "installiertes %s macht %s, welches durch %s angeboten wird, obsolet" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "" #~ "Das auflösbare Element %s steht in Konflikt mit %s, das es selbst zur " #~ "Verfügung gestellt hat" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s benötigt %s, kann jedoch nicht zur Verfügung gestellt werden" #~ msgid "remove lock to allow removal of %s" #~ msgstr "Sperre entfernen und Entfernen von %s zulassen" #~ msgid "do not install %s" #~ msgstr "%s nicht installieren" #~ msgid "keep %s" #~ msgstr "%s behalten" #~ msgid "remove lock to allow installation of %s" #~ msgstr "Sperre entfernen und Installation von %s zulassen" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "" #~ "Installation eines auflösbaren Elements mit %s darf nicht angefordert " #~ "werden" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "" #~ "Löschen aller auflösbaren Elemente mit %s darf nicht angefordert werden" #~ msgid "do not install most recent version of %s" #~ msgstr "Neueste Version von %s darf nicht installiert werden" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s trotz der nachrangigen Architektur beibehalten" #~ msgid "install %s despite the inferior architecture" #~ msgstr "%s trotz der nachrangigen Architektur installieren" #~ msgid "keep obsolete %s" #~ msgstr "veraltetes %s beibehalten" #~ msgid "install %s from excluded repository" #~ msgstr "%s aus dem ausgeschlossenen Repository installieren" #~ msgid "downgrade of %s to %s" #~ msgstr "Downgrade von %s zu %s" #~ msgid "architecture change of %s to %s" #~ msgstr "Architekturwechsel von %s zu %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "%s installieren (mit Anbieterwechsel)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "Ersatz von %s durch %s" #~ msgid "deinstallation of %s" #~ msgstr "Deinstallation von %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Sperrdatei kann nicht geöffnet werden: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Die Aktion wird bereits von einem anderen Programm ausgeführt." #~ msgid "Hal Exception" #~ msgstr "Hal-Ausnahme" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Diese Version von libzypp wurde ohne HAL-Unterstützung erstellt." #~ msgid "HalContext not connected" #~ msgstr "HalContext nicht verbunden" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive nicht initialisiert" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume nicht initialisiert" #~ msgid "Unable to create dbus connection" #~ msgstr "Dbus-Verbindung kann nicht hergestellt werden" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Erstellen des libhal-Kontexts nicht möglich" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "libhal_set_dbus_connection: Festlegen der dbus-Verbindung nicht möglich" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "HAL-Kontext kann nicht initialisiert werden -- Wird hald nicht ausgeführt?" #~ msgid "Not a CDROM drive" #~ msgstr "Kein CDROM-Laufwerk" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Mutex-Attribute können nicht initialisiert werden" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Rekursives Mutex-Attribut kann nicht festgelegt werden" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Rekursiver Mutex kann nicht initialisiert werden" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Mutex-Sperre kann nicht abgerufen werden" #~ msgid "Can't release the mutex lock" #~ msgstr "Mutex-Sperre kann nicht aufgehoben werden" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "" #~ "Importieren des öffentlichen Schlüssels aus Datei %s fehlgeschlagen: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Entfernen des öffentlichen Schlüssels %s fehlgeschlagen: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Das verfügbare Loop-Device zum Einhängen der Datei aus '%s' kann nicht " #~ "gefunden werden" #~ msgid "generally ignore of some dependecies" #~ msgstr "einige Abhängigkeiten generell ignorieren" #~ msgid "do not forbid installation of %s" #~ msgstr "Installation von %s nicht unterbinden" #~ msgid "do not keep %s installed" #~ msgstr "%s nicht installiert lassen" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Der öffentliche Schlüssel %s vom Schlüsselring %s kann nicht in Datei %s " #~ "erstellt werden" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "" #~ "Es wurde versucht, den nicht vorhandenen Schlüssel %s in Schlüsselring %s " #~ "zu importieren" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Es kann innerhalb des Chroot (%s) nicht zu '/' gewechselt werden." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "" #~ "Initialisierung des Downloads (Metalink-Curl) für '%s' fehlgeschlagen" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Fehler beim Herunterladen (Metalink-Curl) für '%s':\n" #~ "Fehlerkode: %s\n" #~ "Fehlermeldung: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Dateiabbruf bei %d%% unterbrochen" #~ msgid "Download interrupted by user" #~ msgstr "Dateiabbruf durch Benutzer unterbrochen" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Beim Setzen der Download-Optionen (Metalink-Curl) für '%s' ist ein Fehler " #~ "aufgetreten:" #~ msgid "Failed to download %s from %s" #~ msgstr "%s konnte von %s nicht abgerufen werden" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbien und Montenegro" #~ msgid "Unknown Distribution" #~ msgstr "Unbekannte Distribution" #~ msgid "ignore some dependencies of %s" #~ msgstr "einige Abhängigkeiten von %s ignorieren" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Datei %s hat keine Prüfsumme.\n" #~ "Datei trotzdem verwenden?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Datei %s hat die Integritätsprüfung mit dem folgenden Schlüssel nicht " #~ "bestanden:\n" #~ "%s|%s|%s\n" #~ "Datei trotzdem verwenden?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Datei %s hat eine ungültige Prüfsumme.\n" #~ "Erwartet %s, gefunden %s\n" #~ "Datei trotzdem verwenden?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Datei %s hat eine unbekannte Prüfsumme %s.\n" #~ "Datei trotzdem verwenden?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Datei %s ist unsigniert.\n" #~ "Datei trotzdem verwenden?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Datei %s ist mit einem unbekanntem Schlüssel signiert:\n" #~ "%s|%s|%s\n" #~ "Datei trotzdem verwenden?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Nicht vertrauenswürdiger Schlüssel gefunden:\n" #~ "%s|%s|%s\n" #~ "Schlüssel als vertrauenswürdig betrachten?" #~ msgid "Timeout exceeded when access '%s'." #~ msgstr "Zeitablauf beim Zugriff auf '%s'." libzypp-17.36.5/po/el.po000066400000000000000000004516651476576476200150150ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: Greek (libzypp)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2018-04-29 12:02+0000\n" "Last-Translator: Konstantina Tsolakoglou \n" "Language-Team: Greek \n" "Language: el\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: Weblate 2.18\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Άγνωστη χώρα: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Κανένας κώδικας" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Ανδόρα" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Ηνωμένα Αραβικά Εμιράτα" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Αφγανιστάν" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Αντίγκουα και Μπαρμπούντα" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Αγκίλα" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Αλβανία" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Αρμενία" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Ολλανδικές Αντίλλες" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Ανγκόλα" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Ανταρκτική" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Αργεντινή" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Αμερικανική Σαμόα" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Αυστρία" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Αυστραλία" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Αρούμπα" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Νησιά Aland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Αζερμπαϊτζάν" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Βοσνία-Ερζεγοβίνη" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Μπαρμπάντος" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Μπανγκλαντες" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Βέλγιο" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Μπουρκίνα Φάσο" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Βουλγαρία" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Μπαχρέιν" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Μπουρούντι" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Μπενίν" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Βερμούδες" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Μπρουνέι Νταρουσαλάμ" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Βολιβία" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Βραζιλία" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Μπαχάμες" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Μπουτάν" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Νήσος Μπουβέ" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Μποτσουάνα" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Λευκορωσία" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Μπελίζ" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Καναδάς" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Νήσοι Κόκος (Κήλινγκ)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Κονγκό" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Κεντροαφρικανική Δημοκρατία" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Ελβετία" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Ακτή Ελεφαντοστού" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Νήσοι Κουκ" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Χιλή" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Καμερούν" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Κίνα" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Κολομβία" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Κόστα Ρίκα" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Κούβα" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Πράσινο Ακρωτήριο" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Νήσοι Χριστουγέννων" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Κύπρος" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Δημοκρατία της Τσεχίας" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Γερμανία" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Τζιμπουτί" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Δανία" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Δομινίκα" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Δομινικανή Δημοκρατία" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Αλγερία" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Εκουαδόρ" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Εσθονία" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Αίγυπτος" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Δυτική Σαχάρα" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Ερυθραία" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Ισπανία" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Αιθιοπία" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Φινλανδία" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Φίτζι" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Νήσοι Φώκλαντ (Μαλβίνες)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Κυβερνητικές Πολιτείες της Μικρονησίας" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Φερόες Νήσοι" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Γαλλία" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Μητροπολιτική Γαλλία" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Γκαμπόν" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Ηνωμένο Βασίλειο" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Γρανάδα" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Γεωργία" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Γαλλική Γουιάνα" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Γκάνα" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Γιβραλτάρ" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Γροιλανδία" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Γκάμπια" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Γουϊνέα" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Γουαδελούπη" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ισημερινή Γουϊνέα" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Ελλάδα" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Νότια Γεωργία και Νότια Νησιά Σάντουιτς" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Γουατεμάλα" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Γκουάμ" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Γουϊνέα-Μπισάου" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Γουιάνα" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Χονγκ Κονγκ" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Νησί Heard και Νησιά McDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Ονδούρας" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Κροατία" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Αϊτή" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ουγγαρία" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Ινδονησία" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ιρλανδία" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Ισραήλ" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isle of Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Ινδία" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Βρετανικά Εδάφη Ινδικού Ωκεανού" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Ιράκ" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Ιράν" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Ισλανδία" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Ιταλία" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Τζέρσεϋ" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Τζαμάικα" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Ιορδανία" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Ιαπωνία" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Κένυα" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Κιργιστάν" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Καμπότζη" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Κιριμπάτι" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Κομόρες" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Άγιος Χριστόφορος και Χιονία" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Βόρεια Κορέα" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Νότια Κορέα" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Κουβέιτ" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Νήσοι Κέιμαν" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Καζακστάν" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Λαική Δημοκρατία του Λάος" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Λίβανος" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Αγία Λουκία" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Λίχτενσταϊν" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Σρι Λάνκα" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Λιβερία" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Λεσότο" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Λιθουανία" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Λουξεμβούργο" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Λετονία" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Λιβύη" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Μαρόκο" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Μονακό" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Μολδαβία" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Μαυροβούνιο" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Άγιος Μαρίνος" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Μαδαγασκάρη" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Νήσοι Μάρσαλ" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Π.Γ.Δ.Μ." #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Μάλι" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Μιανμάρ" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Μογγολία" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Μακάο" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Νήσοι Βορείων Μαριάννων" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Μαρτινίκα" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Μαυριτανία" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Μονσεράτ" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Μάλτα" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Μαυρίτιος" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Μαλβίδες" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Μαλάουϊ" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Μεξικό" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Μαλαισία" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Μοζαμβίκη" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Ναμίμπια" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Νέα Καληδονία" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Νίγηρας" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Νήσοι Νόρφολκ" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Νιγηρία" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Νικαράγουα" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Ολλανδία" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Νορβηγία" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Νεπάλ" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Ναουρού" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Βράχος Πολυνησίας" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Νέα Ζηλανδία" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Ομάν" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Παναμάς" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Περού" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Γαλλική Πολυνησία" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Παπούα Νέα Γουϊνέα" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Φιλιππίνες" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Πακιστάν" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Πολωνία" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Άγιος Πέτρος και Μιχαήλ" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Νήσοι Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Πουέρτο Ρίκο" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Παλαιστινιακά Εδάφη" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Πορτογαλία" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Νήσοι Παλάου" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Παραγουάη" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Κατάρ" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Νήσος Ρεουνιόν" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Ρουμανία" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Σερβία" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Ρωσική Ομοσπονδία" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ρουάντα" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Σαουδική Αραβία" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Νήσοι Σολομώντος" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Σεϋχέλλες" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Σουδάν" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Σουηδία" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Σιγκαπούρη" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Νήσος Αγίας Ελένης" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Σλοβενία" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Σβάλμπαρντ και Γιαν Μάγεν" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Σλοβακία" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Σιέρρα Λεόνε" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "Άγιος Μαρίνος" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Σενεγάλη" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Σομαλία" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Σουρινάμ" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Σάο Τόμε και Πρίντσιπε" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Ελ Σαλβαδόρ" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Συρία" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Σουαζιλάνδη" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Νήσοι Turks και Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Τσαντ" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Νότια Γαλλικά Εδάφη" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Τόγκο" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Ταϊλάνδη" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Τατζικιστάν" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Τοκελάου" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Τουρκμενιστάν" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Τυνησία" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Τόγκα" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Ανατολικό Τιμόρ" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Τουρκία" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Τρινιντάντ και Τομπάγκο" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Τουβαλού" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Ταϊλάνδη" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Τανζανία" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ουκρανία" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Ουγκάντα" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Μικρά απομονωμένα νησιά Ηνωμένων Πολιτειών" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Ηνωμένες Πολιτείες της Αμερικής" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Ουρουγουάη" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Ουζμπεκιστάν" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Αγία Θέση (Πόλη Κράτος Βατικανού)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Άγιος Βικέντιος και Γρεναδίνες" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Βενεζουέλα" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Βρετανικά Παρθένα Νησιά" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Παρθένες Νήσοι, Η.Π.Α." # #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Βιετνάμ" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Βανουάτου" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Γουόλις και Φουτούνα" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Σαμόα" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Υεμένη" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Μαγιοτ" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Νότια Αφρική" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Ζάμπια" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Ζιμπάμπουε" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Παρέχει" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Προαπαιτεί" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Απαιτεί" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Συγκρούσεις" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Απαρχαιώνει" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Συνιστά" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Προτείνει" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Ενισχύει" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Συμπληρώνει" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Άγνωστη γλώσσα: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Αφάρ" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Αμπχαζία" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinese" # power saving scheme name, combo box and default contents of text entry #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Αφρο-Ασιατικά (Άλλο)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Αφριχίλι" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ιαπωνικά (Ainu)" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Ακκαδική γλώσσα" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Αλβανικά" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Γλώσσες Algonquian" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Νότια Αλτάι" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Αμχαρική γλώσσα" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Αγγλικά, παλαιά (450-110 μ.Χ.)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Γλώσσες Απάτσι" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Αραβικά" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Αραμαϊκά" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonese" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Αρμενικά" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Αραουκάνικα (Μαπούτσε)" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Αραπάχο" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Τεχνητή (Άλλο)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Αραουάκ" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamese" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturian" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Γλώσσες Athapascan" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Αυστραλιανές Γλώσσες" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Αβαρικά" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Αβεστική γλώσσα" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Αζερμπαϊτζανικά" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Γλώσσες Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinese" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Βάσκικα" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Βαλτικά (Άλλο)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Μπέχα" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Λευκορωσικά" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber (Other)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (Άλλη)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Βοσνιακά" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Breton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginese" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Βουλγαρικά" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmese" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Ινδιανικά Κεντρικής Αμερικής (Άλλο)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Διάλεκτος Καραϊβικής" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Καταλονικά" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Καυκάσια (Άλλο)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Κέλτικα (Άλλο)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Τσετσενικά" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Κινεζικά" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Λεξικό Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Church Slavic" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Χαμικές Γλώσσες" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Κοπτικά" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornish" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Κορσικά" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creoles and Pidgins, Βασισμένες στα Αγγλικά (Άλλο)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creoles and Pidgins, Βασισμένες στα Γαλλικά (Άλλο)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creoles and Pidgins, Βασισμένες στα Πορτογαλλικά (Άλλο)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Crimean Tatar" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creoles και Pidgins (Other)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kashubian" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitic (Other)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Τσέχικα" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Δανέζικα" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidian (Other)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Lower Sorbian" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Ολλανδικά, Μεσαίωνα (1050-1350 μ.Χ.)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Ολλανδικά" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Αιγυπτιακά (Αρχαία)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Αγγλικά" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Αγγλικά, Μεσαίωνα (1100-1500 μ.Χ.)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Εσπεράντο" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Εσθονικά" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faroese" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijian" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Φινλανδικά" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Φινο-Ουγγρικά (Άλλο)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Γαλλικά" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Γαλλικά, Μεσαίωνα (1400-1600 μ.Χ.)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Γαλλικά, Παλαιά (842-1400 μ.Χ.)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisian" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulian" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Γερμανικά (Άλλο)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Γεωργιανά" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Γερμανικά" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" # #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertese" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Ιρλανδικά" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galician" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Γερμανικά, Ύστερος Μεσαίωνας (1050-1500 μ.Χ.)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Γερμανικά, Ύστερα Παλαιά (750-1050 μ.Χ.)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gothic" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Ελληνικά, Αρχαία (μέχρι 1453 μ.Χ.)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Ελληνικά, Σύγχρονα (1453 μ.Χ. - )" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitian" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiian" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Εβραϊκά" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittite" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Upper Sorbian" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ουγγρικά" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Ισλανδικά" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Ινδικά (Άλλο)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Ινδονησιακά" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Ινδεο-Ευρωπαϊκά (Άλλο)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Ιρανικά (Άλλο)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Γλώσσες Iroquoian" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Ιταλικά" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanese" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Ιαπωνικά" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Ιουδαιο-Περσικά" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Ιουδαιο-Αραβικά" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (Other)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanese" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Κορεατικά" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Κουρδικά" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Λατινικά" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Λεττονικά" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgan" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Λιθουανικά" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxembourgish" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Γκάνα" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya and Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Λουσάι" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Σκοπιανικά" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurese" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallese" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesian (Άλλες)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Ιρλανδικά, Μεσαίωνα (900-1200 μ.Χ.)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Διάφορες Γλώσσες" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (Other)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagasy" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltese" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Γλώσσες Manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Μολδαβικά" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Μογγολικά" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Πολλαπλές Γλώσσες" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Γλώσσες Munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Γλώσσες Μάγια" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Ινδιανικά Βόρειας Αμερικής" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitan" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Ναβαχό" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, South" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, North" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Low German" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanian (Other)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norwegian Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norwegian Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Νορβηγικά, Παλαιά" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Νορβηγικά" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Northern Sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Γλώσσες Nubia" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Classical Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (post 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Τουρκικά, Οθωμανικής Περιόδου (1500-1928 μ.Χ.)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Γλώσσες Otomian" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Παπουανά (Άλλα)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Περσικά, Παλαιά (400 π.Χ - 600 μ.Χ.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Περσικά" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Φιλιππινιακά" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Φοινικικά" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Πολωνικά" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Πορτογαλική γλώσσα" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Γλώσσες Prakit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provencal, Old (to 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romance (Other)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Raeto-Romance" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romany" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Ρουμανικά" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ρωσικά" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Νότια Αμερικάνικα Ινδιάνικα (Άλλα)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Γλώσσες Salishan" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Αραμαϊκά Σαμαριτικά" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbian" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilian" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Κροατικά" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Σημιτική (Άλλη)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Ιρλανδικά, Παλαιά (μέχρι 900 μ.Χ.)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Νοηματικές Γλώσσες" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Γλώσσες Siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetan (Other)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Σλαβικά (Άλλο)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Σλοβακικά" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Σλοβένικα" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Southern Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Northern Sami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Γλώσσες Σαμι(Άλλες)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoan" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, Southern" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Ισπανικά" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinian" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Saharan (Other)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Σουδανικά" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Σουμεριακά" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Σουαχίλι" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Σουηδικά" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Συριακά" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitian" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (Άλλα)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Ταϊλανδέζικα" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetan" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Νήσοι Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmen" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Γλώσσες Τουπι" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Τούρκικα" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaic (Other)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvinian" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritic" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ουκρανικά" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Απροσδιόριστο" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbek" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" # #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Βιετναμικά" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Γλώσσες Γουακασάν" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Welsh" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Γλώσσες Sorbian" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Γλώσσες Εσκιμώων" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Ζουλού" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Οι ακόλουθες ενέργειες θα γίνουν:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "άγνωστο" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "μη υποστηριζόμενο" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Επίπεδο 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Επίπεδο 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Επίπεδο 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Είναι απαραίτητη η συμπληρωματική σύμβαση πελάτη" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "μη έγκυρο" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Το επίπεδο υποστήριξης είναι απροσδιόριστο" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Ο κατασκευαστής δεν παρέχει υποστήριξη." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Προσδιορισμός προβλήματος, που σημαίνει πως η τεχνική υποστήριξη είναι " "σχεδιασμένη για να παρέχει πληροφορίες συμβατότητας, βοήθεια εγκατάστασης, " "υποστήριξη χρήσης, συνεχόμενη συντήρηση και βασική λύση προβλημάτων. Η " "υποστήριξη επιπέδου 1 δεν προορίζεται για να διορθώνει σφάλματα " "ελαττωματικών προϊόντων." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Απομόνωση προβλήματος, που σημαίνει πως η τεχνική υποστήριξη είναι " "σχεδιασμένη για να αναπαράγει τα προβλήματα των πελατών, να απομονώνει την " "περιοχή του προβλήματος και να παρέχει λύση για προβλήματα που δεν λύνονται " "με την υποστήριξη Επιπέδου 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Επίλυση προβλήματος, που σημαίνει ότι η τεχνική υποστήριξη είναι σχεδιασμένη " "για να επιλύει πολύπλοκα προβλήματα χρησιμοποιώντας μηχανική στην επίλυση " "σφαλμάτων υλικού που έχουν επιβεβαιωθεί από την υποστήριξη Επιπέδου 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" "Μια συμπληρωματική σύμβαση πελάτη είναι απαραίτητη για λήψη υποστήριξης." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Άγνωστη επιλογή υποστήριξης. Δεν υπάρχει διαθέσιμη περιγραφή" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Η διαχείριση συστήματος έχει κλειδωθεί από την εφαρμογή με pid %d (%s).\n" "Κλείστε την εφαρμογή πριν ξαναπροσπαθήσετε." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Άγνωστη λειτουργία ταιριάσματος '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Άγνωστη λειτουργία ταιριάσματος '%s' για το pattern '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Μη έγκυρη κανονική έκφραση '%s': η εντολή regcomp επέστρεψε %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Μη έγκυρη κανονική έκφραση '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Απαιτείται πιστοποίηση για '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Επισκεφθείτε το Κέντρο Πελατών της Novell για να ελέγξετε εάν η εγγραφή σας " "είναι έγκυρη και δεν έχει λήξει." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Δημιουργία σημείου προσάρτησης: Δεν είναι δυνατή η εύρεση εγγράψιμου " "καταλόγου για τη δημιουργία σημείου προσάρτησης" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Παρακαλούμε εγκαταστήστε πρώτα το πακέτο 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Αδυναμία δημιουργίας καταλόγου μεταδεδομένων λανθάνουσας μνήμης." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Σφάλμα στην προσπάθεια ανάγνωσης από το '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Αδυναμία δημιουργίας %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Αποτυχία αποθήκευσης στην λανθάνουσα μνήμη του αποθετηρίου (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Δημιουργία λανθάνουσας μνήμης αποθετηρίου '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" "Αδυναμία δημιουργίας λανθάνουσας μνήμης στο %s - δεν έχετε δικαιώματα " "εγγραφής." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Τύπος αδιαχείριστου αποθετηρίου" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Προσθήκη αποθετηρίου '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Μη έγκυρο όνομα αρχείου αποθετηρίου στο '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Αδυναμία ανοίγματος αρχείου '%s' για εγγραφή." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Άγνωστο σφάλμα κατά την ανάγνωση από '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Αδυναμία ανάγνωσης καταλόγου αποθετηρίου '%1%': Δεν έχετε δικαιώματα" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Αποτυχία ανάγνωσης καταλόγου '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Αδυναμία ανάγνωσης αρχείου αποθετηρίου '%1%': Δεν έχετε δικαιώματα" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Αφαίρεση αποθετηρίου '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Δεν είναι κατανοητό που είναι αποθηκευμένο το αποθετήριο." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Αδυναμία διαγραφής '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Δεν είναι κατανοητό που είναι αποθηκευμένη η υπηρεσία." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Άγνωστη υπηρεσία '%1%': Αφαίρεση του ορφανού αποθετηρίου υπηρεσιών '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Το alias του αποθετηρίου δεν μπορεί να ξεκινά από τελεία." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Το ψευδώνυμο της υπηρεσίας δεν μπορεί να ξεκινά με τελεία." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Συνέχεια;" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Λείπει το απαιτούμενο χαρακτηριστικό '%s'." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Μία ή και οι δύο ιδιότητες των '%s' ή '%s' χρειάζονται." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Απέτυχε η επαλήθευση της υπογραφής" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Το πακέτο %s φαίνεται πως καταστράφηκε κατά την μεταφορά. Θέλετε να " "ξαναδοκιμάσετε ανάκτηση;" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Αποτυχία παροχής Πακέτου %s. Θέλετε να ξαναδοκιμάσετε ανάκτηση;" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Απέτυχε ο έλεγχος applydeltarpm." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "Αποτυχία applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Το πρόσθετο της υπηρεσίας δεν υποστηρίζει την αλλαγή μιας ιδιότητας." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Αδυναμία παροχής αρχείου '%s' από το αποθετήριο '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Δεν υπάρχει το URL στο αποθετήριο." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Το αρχείο %1%\n" " από το πακέτο\n" " %2%\n" " συγκρούεται με το αρχείο από το πακέτο\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Το αρχείο %1%\n" " από το πακέτο\n" " %2%\n" " συγκρούεται με το αρχείο από την εγκατάσταση του\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Το αρχείο %1%\n" " από την εγκατάσταση του\n" " %2%\n" " συγκρούεται με το αρχείο από το πακέτο\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Το αρχείο %1%\n" " από την εγκατάσταση του\n" " %2%\n" " συγκρούεται με το αρχείο από την εγκατάσταση του\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Το αρχείο %1%\n" " από το πακέτο\n" " %2%\n" " συγκρούεται με το αρχείο\n" " %3%\n" " από το πακέτο\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Το αρχείο %1%\n" " από το πακέτο\n" " %2%\n" " συγκρούεται με το αρχείο\n" " %3%\n" " από την εγκατάσταση του\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Το αρχείο %1%\n" " από την εγκατάσταση του\n" " %2%\n" " συγκρούεται με το αρχείο\n" " %3%\n" " από το πακέτο\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Το αρχείο %1%\n" " από την εγκατάσταση του\n" " %2%\n" " συγκρούεται με το αρχείο\n" " %3%\n" " από την εγκατάσταση του\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Αδυναμία δημιουργίας sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "διακοπή %s λόγω αγνόησης μερικών εξαρτήσεων του" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "γενικά αγνόηση μερικών εξαρτήσεων" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "συγκρουόμενες αιτήσεις" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "κάποιο πρόβλημα εξαρτήσεων" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "μη υποστηριζόμενο αίτημα" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "διαγραμμένοι πάροχοι: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "μη εγκαταστήσιμοι πάροχοι: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "Μη εγκαταστήσιμοι πάροχοι: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Το αίτημα αυτό θα καταστρέψει το σύστημα σας!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "αγνοήστε την προειδοποίηση ενός κατεστραμμένου συστήματος" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Η εγκατάσταση ματαιώθηκε σύμφωνα με τις οδηγίες." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " εκτελέστηκε" # %s is either BOOTP or DHCP #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " αποτυχία εκτέλεσηης" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "το %s έχει ήδη εκτελεστεί ως %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " η εκτέλεση παραλείφθηκε κατά την ματαίωση" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Σφάλμα κατά την αποστολή μηνύματος ειδοποίησης ενημέρωσης." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Νέο μήνυμα ενημέρωσης" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Το RPM απέτυχε: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Απέτυχε να εισάγει το δημόσιο κλειδί από το αρχείο %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Αδυναμία απομάκρυνσης του δημοσίου κλειδιού %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Αλλαγή αρχείων ρύθμισης για %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "Το rpm αποθήκευσε το %s ως %s αλλά ήταν αδύνατο να διαφανεί η διαφορά" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "Το rpm αποθήκευσε το %s ως %s.\n" "Εδώ είναι οι πρώτες 25 γραμμές της διαφοράς:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "Το rpm δημιούργησε το %s ως %s αλλά ήταν αδύνατο να διαφανεί η διαφορά" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "To rpm δημιούργησε το %s ως %s.\n" "Εδώ είναι οι πρώτες 25 σειρές της διαφοράς:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Επιπρόσθετο αποτέλεσμα rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "δημιουργήθηκε αντίγραφο ασφαλείας %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Η υπογραφή είναι εντάξει" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Άγνωστος τύπος υπογραφής" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Η υπογραφή δεν μπορεί να επαληθευτεί" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Η υπογραφή είναι εντάξει, αλλά το κλειδί δεν είναι έμπιστο" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Η υπογραφές του δημόσιου κλειδιού δεν είναι διαθέσιμες" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Το αρχείο δεν υπάρχει ή η υπογραφή δεν μπορεί να ελεχθεί" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Το αρχείο δεν είναι υπογεγραμμένο" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "δεν λήγει" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "έληξε: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "λήγει: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(δεν λήγει)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(ΕΛΗΞΕ)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(λήγει μέσα σε 24ω)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(λήγει σε %d ημέρα)" msgstr[1] "(λήγει σε %d ημέρες)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Προσπάθεια εισαγωγής μη υπάρχοντος κλειδιού %s στην κλειδοθήκη %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Αποτυχία εισαγωγής κλειδιού." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Αποτυχία της διαγραφής κλειδιού." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Το αρχείο υπογραφής %s δε βρέθηκε" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Ύποπτος τύπος '%s' για το %u byte στον αθροιστικό έλεγχο '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Αδυναμία ανοίγματος pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Αδυναμία ανοίγματος διασωλήνωσης (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Μη έγκυρο string αναζήτησης LDAP URL" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Μη έγκυρη παράμετρος αναζήτησης LDAP URL '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Αδυναμία κλωνοποίησης αντικειμένου Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Μη έγκυρη αναφορά αντικειμένου κενού Url" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Αδυναμία ανάλυσης συστατικών Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Ιστορικό:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Το σχήμα Url δεν επιτρέπει ένα %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "μη έγκυρο %s συστατικό '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "μη έγκυρο %s συστατικό" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" "Δεν υποστηρίζεται η ανάλυση string ερωτήματος για αυτήν τη διεύθυνση URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Το σχήμα Url είναι ένα απαιτούμενο συστατικό" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Λανθασμένο σχήμα Url '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Το σχήμα Url δεν επιτρέπει όνομα χρήστη" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Το σχήμα Url δεν επιτρέπει συνθηματικό" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Το σχήμα Url απαιτεί ένα συστατικό συστήματος" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Το σχήμα Url δεν επιτρέπει ένα συστατικό συστήματος" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Μη έγκυρο συστατικό συστήματος '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Το σχήμα Url δεν σας επιτρέπει μια θύρα" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "μη έγκυρο συστατικό θύρας '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Το σχήμα Url απαιτεί όνομα διαδρομής" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Σχετική διαδρομή δεν επιτρέπεται εάν υπάρχει αρχή" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Κωδικοποιημένο string περιέχει ένα NUL byte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας χωριστής διάταξης παραμέτρων" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας χωριστού χάρτη παραμέτρων" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Μη έγκυρος διαχωριστικός χαρακτήρας ένωσης διατάξεων παραμέτρων" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Η εντολή τερματίστηκε με κατάσταση %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Η εντολή τερματίστηκε από το σήμα %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Η εντολή τερματίστηκε με άγνωστο σφάλμα." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Αδυναμία chroot σε '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Αδυναμία chdir στο '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Αδυναμία chdir στο '%s' μέσα σε chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Αδυναμία εκτέλεσης του '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Αδυναμία διακλάδωσης (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Αποτυχία προσάρτησης %s στο %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Αποτυχία από-προσάρτησης %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Εσφαλμένο όνομα αρχείου: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" "Το μέσο δεν ανοίχτηκε κατά την προσπάθεια εκτέλεσης της ενέργειας '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Το αρχείο '%s' δεν βρέθηκε στο μέσο '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Αδυναμία εγγραφής αρχείο '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Το μέσο δεν είναι συνδεδεμένο" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Εσφαλμένο σημείο σύνδεσης μέσου" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Η αρχικοποίηση λήψης (curl) απέτυχε για '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Εξαίρεση '%s' συστήματος στο μέσο '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Η διαδρομή '%s' στο μέσο '%s' δεν είναι αρχείο." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Η διαδρομή '%s' στο μέσο '%s' δεν είναι κατάλογος." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Κακώς-διατυπωμένο URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Κενό όνομα συστήματος στην URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Κενό σύστημα αρχείων στην URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Κενός προορισμός στην URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Μη υποστηριζόμενο URl σχήμα στο '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Η λειτουργία δεν υποστηρίζεται από το μέσο" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Σφάλμα λήψεως (curl) για '%s':\n" "Κωδικός σφάλματος: %s\n" "Μήνυμα λάθους: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Προκλήθηκε σφάλμα κατά την διάρκεια ρύθμισης των επιλογών λήψης (curl) για " "'%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Η πηγή του μέσου '%s' δεν περιέχει το επιθυμητό μέσο" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Το μέσο '%s' είναι σε χρήση από άλλο στιγμιότυπο" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Αδυναμία αποβολής κάποιου μέσου" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Αδυναμία αποβολής μέσου '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Άρνηση άδειας πρόσβασης στο '%s'." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Το χρονικό όριο εξαντλήθηκε όταν έγινε πρόσβαση '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Η τοποθεσία '%s' είναι προσωρινά μη προσβάσιμη." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Πρόβλημα πιστοποιητικού SSL, επαληθεύστε ότι το πιστοποιητικό CA είναι " "εντάξει για '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Μη υποστηριζόμενη μέθοδος πιστοποίησης HTTP '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ναι" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Όχι" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Προειδοποιηση: " #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Σφάλμα" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "έγινε" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "σφάλμα" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Προειδοποιηση: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Λήψη:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "εκκίνηση" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Δεν βρέθηκε" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Καμία διαθέσιμη βοήθεια για αυτή την εντολή." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "καμία διαθέσιμη βοήθεια για αυτή την επιλογή" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "εμφάνιση όλων των επιλογών" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ναι" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "όχι" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Δεν βρέθηκαν έγκυρα μεταδεδομένα στην καθορισμένη URL" #~ msgstr[1] "Δεν βρέθηκαν έγκυρα μεταδεδομένα στις καθορισμένες URLs" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Εκτέλεση %%posttrans script '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Εκτέλεση %posttrans scripts" #~ msgid "Package is not signed!" #~ msgstr "Το πακέτο δεν είναι υπογεγραμμένο!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "το %s δεν ανήκει σε αποθετήριο αναβάθμισης της διανομής" #~ msgid "%s has inferior architecture" #~ msgstr "το %s έχει υποδαιέστερη αρχιτεκτονική" #~ msgid "problem with installed package %s" #~ msgstr "πρόβλημα με τα εγκατεστημένα πακέτα %s" #~ msgid "nothing provides requested %s" #~ msgstr "τίποτα δεν παρέχει το ζητούμενο %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Έχετε ενεργοποιήσει όλα τα απαιτούμενα αποθετήρια;" #~ msgid "package %s does not exist" #~ msgstr "το πακέτο %s δεν υπάρχει" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "το %s παρέχεται από το σύστημα και είναι αδύνατο να διαγραφεί" #~ msgid "%s is not installable" #~ msgstr "το %s είναι μη εγκαταστάσιμο" #~ msgid "nothing provides %s needed by %s" #~ msgstr "τίποτα δεν παρέχει το %s που χρειάζεται από το %s" #~ msgid "cannot install both %s and %s" #~ msgstr "αδυναμία εγκατάστασης %s και %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "το %s συγκρούεται με %s που παρέχεται από το %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "Το %s απαρχαιώνει το %s που παρέχεται από το %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "το εγκατεστημένο %s απαρχαιώνει %s που παρέχεται από %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "το επιλύσιμο %s συγκρούεται με %s που παρέχεται από τον εαυτό του" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "το %s απαιτεί %s, αλλά αυτή η απαίτηση δεν μπορεί να παρασχεθεί" #~ msgid "remove lock to allow removal of %s" #~ msgstr "αφαίρεση κλειδώματος για να επιτραπεί η αφαίρεση του %s" #~ msgid "do not install %s" #~ msgstr "να μην εγκατασταθεί το %s" #~ msgid "keep %s" #~ msgstr "διατήρηση του %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "αφαίρεση κλειδώματος για να επιτραπεί η εγκατάσταση του %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "να μην ζητηθεί η εγκατάσταση όλων των επιλύσιμων παρέχοντας %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "να μην ζητηθεί η διαγραφή όλων των επιλύσιμων παρέχοντας %s" #~ msgid "do not install most recent version of %s" #~ msgstr "να μην εγκατασταθεί η νεότερη έκδοση του %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "διατήρηση του %s παρά την κατώτερη αρχιτεκτονική" #~ msgid "install %s despite the inferior architecture" #~ msgstr "εγκατάσταση του %s παρά την κατώτερη αρχιτεκτονική" #~ msgid "keep obsolete %s" #~ msgstr "διατήρηση του απαρχαιωμένου %s" #~ msgid "install %s from excluded repository" #~ msgstr "εγκατάσταση του %s από το εξαιρούμενο αποθετήριο" #~ msgid "downgrade of %s to %s" #~ msgstr "υποβάθμιση του %s σε %s" #~ msgid "architecture change of %s to %s" #~ msgstr "αλλαγή αρχιτεκτονικής από %s σε %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "εγκατάσταση %s (με αλλαγή προμηθευτή)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "αντικατάσταση του %s με το %s" #~ msgid "deinstallation of %s" #~ msgstr "απεγκατάσταση του %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Αδυναμία ανοίγματος αρχείου κλειδώματος: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Αυτή η ενέργεια εκτελείται ήδη από άλλο πρόγραμμα." #~ msgid "Hal Exception" #~ msgstr "Εξαίρεση Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Συγγνώμη, αλλά αυτή η έκδοση του libzypp κατασκευάστηκε χωρίς υποστήριξη " #~ "HAL." #~ msgid "HalContext not connected" #~ msgstr "Το HalContext δεν είναι συνδεμένο" #~ msgid "HalDrive not initialized" #~ msgstr "Το HalDrive δεν είναι αρχικοποιημένο" #~ msgid "HalVolume not initialized" #~ msgstr "Το HalVolume δεν είναι αρχικοποιημένο" #~ msgid "Unable to create dbus connection" #~ msgstr "Αδυναμία δημιουργίας σύνδεσης dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Αδυναμία δημιουργίας περιεχομένου libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Αδυναμία ορισμού σύνδεσης dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "Αδυναμία αρχικοποίησης περιεχομένου HAL -- η υπηρεσία hald δεν εκτελείται;" #~ msgid "Not a CDROM drive" #~ msgstr "Δεν είναι οδηγός CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Αδυναμία αρχικοποίησης ιδιοτήτων mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Αδυναμία ορισμού παλινδρομικής ιδιότητας mutex" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Αδυναμία αρχικοποίησης παλινδρομικής mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Αδυναμία λήψης κλειδαριάς mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Αδυναμία απελευθέρωσης κλειδαριάς mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Απέτυχε να εισάγει το δημόσιο κλειδί από το αρχείο %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Αδυναμία απομάκρυνσης του δημοσίου κλειδιού %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Αδυναμία εύρεσης διαθέσιμης συσκευής βρόγχου για προσάρτηση αρχείου " #~ "εικόνας δεδομένων από '%s'" #~ msgid "generally ignore of some dependecies" #~ msgstr "Γενική αγνόησή κάποιων εξαρτήσεων" #~ msgid "do not forbid installation of %s" #~ msgstr "να μην απαγορευτεί η εγκατάσταση του %s" #~ msgid "do not keep %s installed" #~ msgstr "μην κρατήσετε το %s εγκατεστημένο" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Αδυναμία δημιουργίας δημοσίου κλειδιού %s από την κλειδοθήκη %s στο " #~ "αρχείο %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "" #~ "Εγίνε προσπάθεια προσθήκης μη υπάρχον κλειδιού %s στην κλειδοθήκη %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Δεν μπορεί chdir να '/' μέσα σε chroot (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Η αρχικοποίηση λήψης (Metalink curl) απέτυχε για '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Σφάλμα λήψης (metalink curl) για '%s':\n" #~ "Κωδικός σφάλματος: %s\n" #~ "Μήνυμα λάθους: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Το κατέβασμα διακόπηκε στο %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Το κατέβασμα διακόπηκε από τον χρήστη" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Σφάλμα προκλήθηκε κατά την διάρκεια ρύθμισης των ρυθμίσεων λήψεων " #~ "(metalink curl) για '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Αδυναμία λήψεως %s από το %s" #~ msgid "Valid metadata not found at specified URL(s)" #~ msgstr "Δεν βρέθηκαν έγκυρα μεταδεδομένα στο/α συγκεκριμένο/α URL(s)" #~ msgid "Serbia and Montenegro" #~ msgstr "Σερβία και Μαυροβούνιο" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Άγνωστη επιλογή της list" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "αδυναμία επίλυσης εξαρτήσεων" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Το αρχείο %s δεν έχει ένα checksum.\n" #~ "Χρήση αυτού του αρχείου παρ' αυτά;" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Το αρχείο %s απέτυχε στον έλεγχο ακεραιότητας με το ακόλουθο κλειδί:\n" #~ "%s|%s|%s\n" #~ "Χρήση αυτού του αρχείου παρ' αυτά;" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Το αρχείο %s έχει ένα λανθασμένο checksum.\n" #~ "Αναμενόταν %s, βρέθηκε %s\n" #~ "Χρήση αυτού του αρχείου παρ' αυτά;" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Το αρχείο %s έχει ένα άγνωστο checksum %s.\n" #~ "Χρήση αυτού του αρχείου παρ' αυτά;" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Το αρχείο %s δεν είναι υπογεγραμμένο.\n" #~ "Χρήση του παρ' αυτά;" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Το αρχείο %s είναι υπογεγραμμένο με ένα άγνωστο κλειδί::\n" #~ "%s|%s|%s\n" #~ "Χρήση αυτού του αρχείου παρ' αυτά;" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Βρέθηκε μη έμπιστο κλειδί:\n" #~ "%s|%s|%s\n" #~ "Θα εμπιστευτείτε αυτό το κλειδί;" #~ msgid "%s remove failed" #~ msgstr "%s αφαίρεση απέτυχε" #~ msgid "Invalid user name or password." #~ msgstr "Λανθασμένο όνομα χρήστη ή συνθηματικό." #~ msgid "rpm output:" #~ msgstr "αποτέλεσμα rpm:" #~ msgid "%s install failed" #~ msgstr "%s εγκατάσταση απέτυχε" #~ msgid "%s installed ok" #~ msgstr "%s εγκατάσταση ok" #~ msgid "%s remove ok" #~ msgstr "%s αφαίρεση ok" libzypp-17.36.5/po/en_GB.po000066400000000000000000003664421476576476200153650ustar00rootroot00000000000000# translation of zypp.po to # 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. # Benjamin Weber , 2007. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2007-08-19 16:20+0100\n" "Last-Translator: Benjamin Weber \n" "Language-Team: \n" "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: KBabel 1.11.4\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Unknown country: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "No Code" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarctica" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "American Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Aland Islands" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaijan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia and Herzegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgium" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazil" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet Island" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Central African Republic" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Switzerland" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Cote D'Ivoire" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cook Islands" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Cameroon" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cape Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Christmas Island" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cyprus" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Czech Republic" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Germany" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Denmark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominican Republic" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algeria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Western Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spain" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Ethiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federated States of Micronesia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faroe Islands" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "France" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Metropolitan France" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "United Kingdom" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "French Guiana" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Germany" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Greenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Greece" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia and the South Sandwich Islands" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard Island and McDonald Islands" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croatia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hungary" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ireland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraq" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Iceland" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italy" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodia" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comoros" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts and Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "North Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "South Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Cayman Islands" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Lao People's Democratic Republic" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Lebanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lithuania" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libya" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Morocco" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "Mongo" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "San Marino" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshall Islands" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldives" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "New Caledonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk Island" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Netherlands" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norway" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "New Zealand" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "French Polynesia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Philippines" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poland" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre and Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestinian Territory" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "Serbian" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russian Federation" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomon Islands" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Sweden" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Saint Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard and Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome and Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks and Caicos Islands" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "French Southern Territories" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tajikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "East Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkey" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad and Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraine" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "United States" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "British Virgin Islands" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis and Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "South Africa" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Provides" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Requires" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Conflicts" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s obsoletes:%s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recommends" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Suggests" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Enhances" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Supplements" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Unknown language: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhazian" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinese" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asiatic (Other)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadian" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanian" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonquian Languages" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Southern Altai" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharic" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "English, Old (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apache Languages" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabic" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaic" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonese" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armenian" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucanian" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Artificial (Other)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamese" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturian" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapascan Languages" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australian Languages" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avaric" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaijani" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke Languages" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinese" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basque" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltic (Other)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Belarusian" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber (Other)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (Other)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnian" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Breton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginese" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarian" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmese" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Central American Indian (Other)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalan" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucasian (Other)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celtic (Other)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Chechen" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinese" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook Jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Church Slavic" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Chamic Languages" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Coptic" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornish" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corsican" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creoles and Pidgins, English-Based (Other)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creoles and Pidgins, French-Based (Other)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creoles and Pidgins, Portuguese-Based (Other)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Crimean Tatar" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creoles and Pidgins (Other)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kashubian" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitic (Other)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Czech" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danish" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidian (Other)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Lower Sorbian" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Dutch, Middle (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Dutch" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egyptian (Ancient)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "English" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "English, Middle (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonian" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faroese" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijian" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finnish" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finno-Ugrian (Other)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "French" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "French, Middle (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "French, Old (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisian" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulian" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germanic (Other)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgian" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "German" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertese" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irish" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galician" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "German, Middle High (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "German, Old High (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gothic" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Greek, Ancient (to 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Greek, Modern (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitian" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiian" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebrew" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittite" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Upper Sorbian" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Hungarian" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Icelandic" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indic (Other)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesian" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-European (Other)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iranian (Other)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Iroquoian Languages" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italian" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanese" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japanese" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeo-Persian" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeo-Arabic" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (Other)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanese" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korean" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdish" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latin" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvian" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgan" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lithuanian" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxembourgish" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya and Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedonian" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurese" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallese" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesian (Other)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irish, Middle (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Miscellaneous Languages" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (Other)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagasy" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltese" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo Languages" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavian" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolian" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Multiple Languages" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda languages" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Mayan Languages" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "North American Indian" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitan" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, South" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, North" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Low German" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanian (Other)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norwegian Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norwegian Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norse, Old" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norwegian" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Northern Sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubian Languages" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Classical Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (post 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turkish, Ottoman (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomian Languages" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuan (Other)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persian, Old (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persian" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Philippine (Other)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Phoenician" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polish" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portuguese" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakrit Languages" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provencal, Old (to 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romance (Other)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Raeto-Romance" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romany" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romanian" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russian" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "South American Indian (Other)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salishan Languages" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritan Aramaic" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbian" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilian" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croatian" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitic (Other)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irish, Old (to 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Sign Languages" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouan Languages" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetan (Other)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavic (Other)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovak" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenian" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Southern Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Northern Sami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Sami Languages (Other)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoan" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, Southern" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spanish" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinian" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Saharan (Other)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanese" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerian" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Swedish" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syriac" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitian" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (Other)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetan" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tonga Islands)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmen" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi Languages" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turkish" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaic (Other)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvinian" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritic" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainian" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Undetermined" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbek" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamese" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakashan Languages" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Welsh" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbian Languages" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupik Languages" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 #, fuzzy msgid "Following actions will be done:" msgstr "The following packages will be updated:\n" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "unknown" #: zypp/VendorSupportOptions.cc:17 #, fuzzy msgid "unsupported" msgstr " - not supported" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "The disk does not exist." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Unknown command '%s'" #: zypp/base/StrMatcher.cc:153 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Unknown digest %s for file %s." #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Invalid Url scheme '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Authentication required for '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "Cannot create directory %1: %2." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, fuzzy, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Error parsing metadata for '%s':" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Cannot create %s: %m\n" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Building repository '%s' cache" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 #, fuzzy msgid "Unhandled repository type" msgstr "Uploaded %s to repository." #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Adding repository '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Invalid export filename." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Cannot open file for writing." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Unknown command '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Removing repository '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Cannot stat '%s': %m\n" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "The VM's name cannot start with a digit." #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr "The VM's name cannot start with a digit." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Continue?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, fuzzy, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Required file is missing: " #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "Package %s fails integrity check. Do you want to retry?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Package %s fails integrity check. Do you want to retry?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm check failed." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm failed." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "resource type VAR1 does not support show changes feature" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Can't provide file %s from repository %s" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "No url in repository." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "Cannot create the file." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "Generally ignore this requirement" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "Generally ignore this requirement" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "Connection request to: " #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "Cannot install %s due to dependency problems" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 #, fuzzy msgid "unsupported request" msgstr " - not supported" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "None provides %s" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "There are no installable providers of %s" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "There are no installable providers of %s" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "The request already exists." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Installation has been aborted as directed." #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "Execute" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "Error during key encryption." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "failed" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Changed configuration files for %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm saved %s as %s, but it was impossible to determine the difference" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "rpm created %s as %s, but it was impossible to determine the difference" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "Additional rpm output:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "created backup %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "Source package '%s' not found." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "Source package '%s' not found." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "Source package '%s' not found." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1' does not exist." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1' does not exist." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to start the VM." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to start the VM." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "Source package '%s' not found." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Cannot open file %1." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Invalid LDAP URL query string" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Invalid LDAP URL query parameter '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Unable to clone Url object" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Invalid empty Url object reference" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Unable to parse Url components" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "History:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url scheme does not allow a %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Invalid %s component '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Invalid %s component" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Query string parsing not supported for this URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url scheme is a required component" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Invalid Url scheme '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url scheme does not allow a username" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url scheme does not allow a password" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url scheme requires a host component" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url scheme does not allow a host component" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Invalid host component '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url scheme does not allow a port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Invalid port component '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url scheme requires path name" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relative path not allowed if authority exists" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Encoded string contains a NUL byte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Invalid parameter array split separator character" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Invalid parameter map split separator character" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Invalid parameter array join separator character" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Command executed when connecting" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Can't find %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "Can't find %s." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Unable to open %s - %s\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to load module \"%s\"." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "File %1 not found in the repository." #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Cannot write to file %1." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 is not a directory." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "Empty CA name." #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Invalid URL scheme '%1'." #: zypp-media/mediaexception.cc:131 #, fuzzy msgid "Operation not supported by medium" msgstr "Profile version not supported by Apparmor module\n" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 #, fuzzy msgid "Cannot eject any media" msgstr "Cannot find any schemes." #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Cannot stat '%s': %m\n" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Permissions denied" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Unsupported HTTP authentication method '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Yes" #: zypp-tui/Table.cc:32 msgid "No" msgstr "No" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Warning" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Error" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "done" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "error" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Warning" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Starting..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Not found" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "yes" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "no" #, fuzzy #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Valid metadata not found at specified URL(s)" #~ msgstr[1] "Valid metadata not found at specified URL(s)" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s provides %s, but has another architecture." #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "Problem installing source package %s-%s:" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "None provides %s" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "backup does not exists" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s is locked and cannot be uninstalled." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "not installed" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s is needed by %s" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Cannot install %s" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s conflicts with %s" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s obsoletes %s" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s obsoletes %s" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s conflicts with %s" #~ msgid "do not install %s" #~ msgstr "do not install %s" #~ msgid "keep %s" #~ msgstr "keep %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "do not install %s" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "There are no installable providers of %s" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "Do not install or delete the resolvables concerned" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s provides %s, but has another architecture." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "Install %s although it would change the architecture" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s obsoletes %s" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "Updating %s to %s" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Installation of %s failed:" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Cannot open file %1." #~ msgid "Hal Exception" #~ msgstr "Hal Exception" #~ msgid "HalContext not connected" #~ msgstr "HalContext not connected" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive not initialised" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume not initialised" #~ msgid "Unable to create dbus connection" #~ msgstr "Unable to create dbus connection" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Can't create libhal context" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Can't set dbus connection" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Unable to initialise HAL context -- hald not running?" #~ msgid "Not a CDROM drive" #~ msgstr "Not a CDROM drive" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Can't initialise mutex attributes" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Can't set recursive mutex attribute" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Can't initialise recursive mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Can't acquire the mutex lock" #~ msgid "Can't release the mutex lock" #~ msgstr "Can't release the mutex lock" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Unable to get the public key." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "not installed" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Unable to open %s - %s\n" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia and Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Unknown list option" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "could not resolve dependencies" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "File %s failed integrity check with the following key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgid "%s remove failed" #~ msgstr "%s remove failed" #~ msgid "Invalid user name or password." #~ msgstr "Invalid user name or password." #~ msgid "rpm output:" #~ msgstr "rpm output:" #~ msgid "%s install failed" #~ msgstr "%s install failed" #~ msgid "%s installed ok" #~ msgstr "%s installed ok" #~ msgid "%s remove ok" #~ msgstr "%s remove ok" #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Do not install or delete the resolvables concerned" #~ msgid "Ignore that %s is already set to install" #~ msgstr "Ignore that %s is already set to install" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "Ignore the obsolete %s in %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "Ignore this conflict of %s" #~ msgid "Ignore this requirement just here" #~ msgstr "Ignore this requirement just here" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "Install %s although it would change the architecture" #~ msgid "Install missing resolvables" #~ msgstr "Install missing resolvables" #~ msgid "Keep resolvables" #~ msgstr "Keep resolvables" #~ msgid "Unlock these resolvables" #~ msgstr "Unlock these resolvables" #~ msgid "delete %s" #~ msgstr "delete %s" #~ msgid "install %s" #~ msgstr "install %s" #~ msgid "unlock %s" #~ msgstr "unlock %s" #~ msgid "unlock all resolvables" #~ msgstr "unlock all resolvables" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Cannot open file %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "Error reading repositories:" #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "Path Parameter parsing not supported for this URL" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "Path parameter parsing not supported for this URL" #~ msgid "Reading '%s' repository cache" #~ msgstr "Reading '%s' repository cache" #~ msgid "Reading patch and delta rpms from '%s' repository cache" #~ msgstr "Reading patch and delta rpms from '%s' repository cache" #~ msgid "Cleaning repository '%s' cache" #~ msgstr "Cleaning repository '%s' cache" #~ msgid "Reading repository '%s' cache" #~ msgstr "Reading repository '%s' cache" #~ msgid "Software management is already running." #~ msgstr "Software management is already running." #~ msgid "%s is replaced by %s" #~ msgstr "%s is replaced by %s" #~ msgid "%s replaced by %s" #~ msgstr "%s replaced by %s" #~ msgid "%s will be deleted by the user.\n" #~ msgstr "%s will be deleted by the user.\n" #~ msgid "%s will be deleted by another application. (ApplLow/ApplHigh)\n" #~ msgstr "%s will be deleted by another application. (ApplLow/ApplHigh)\n" #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s will be installed by the user.\n" #~ msgid "%s will be installed by another application. (ApplLow/ApplHigh)\n" #~ msgstr "%s will be installed by another application. (ApplLow/ApplHigh)\n" #, fuzzy #~ msgid "No valid solution found within %d seconds" #~ msgstr "No valid solution found with just resolvables of best architecture." #~ msgid "No valid solution found with just resolvables of best architecture." #~ msgstr "No valid solution found with just resolvables of best architecture." #~ msgid "" #~ "With this run only resolvables with the best architecture have been " #~ "regarded.\n" #~ msgstr "" #~ "With this run only resolvables with the best architecture have been " #~ "regarded.\n" #~ msgid "" #~ "Regarding all possible resolvables takes time, but can come to a valid " #~ "result." #~ msgstr "" #~ "Regarding all possible resolvables takes time, but can come to a valid " #~ "result." #~ msgid "Invalid information" #~ msgstr "Invalid information" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s is needed by other resolvables" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s is needed by:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s conflicts with other resolvables" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s conflicts with:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s obsoletes other resolvables" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgid "%s depends on other resolvables" #~ msgstr "%s depends on other resolvables" #~ msgid "%s depends on %s" #~ msgstr "%s depends on %s" #~ msgid "%s depends on:%s" #~ msgstr "%s depends on:%s" #~ msgid "Child of" #~ msgstr "Child of" #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "Cannot install %s, because it is conflicting with %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s is not installed and has been marked as not installable" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s has unfulfilled requirements" #~ msgid "%s has missing dependencies" #~ msgstr "%s has missing dependencies" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s cannot be installed due to missing dependencies" #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s fulfils dependencies of %s but will be uninstalled" #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s fulfils dependencies of %s but will be kept on your system" #~ msgid "No need to install %s" #~ msgstr "No need to install %s" #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "Cannot install %s to fulfil the dependencies of %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "Cannot install %s to fulfil the dependencies of %s" #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s will not be uninstalled, because it is still required" #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "Cannot install %s, because it is conflicting" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s is not installable due to conflicts with %s" #~ msgid "Requirememt %s cannot be fulfilled." #~ msgstr "Requirement %s cannot be fulfilled." #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "for requiring %s for %s when upgrading %s" #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s is lacking the requirement %s" #~ msgid ", Action: " #~ msgstr ", Action: " #~ msgid ", Trigger: " #~ msgstr ", Trigger: " #~ msgid "package" #~ msgstr "package" #~ msgid "selection" #~ msgstr "selection" #~ msgid "pattern" #~ msgstr "pattern" #~ msgid "product" #~ msgstr "product" #~ msgid "patch" #~ msgstr "patch" #~ msgid "script" #~ msgstr "script" #~ msgid "message" #~ msgstr "message" #~ msgid "atom" #~ msgstr "atom" #~ msgid "system" #~ msgstr "system" #~ msgid "Resolvable" #~ msgstr "Resolvable" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "Marking this resolution attempt as invalid." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "Marking resolvable %s as not installable" #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "Can't install %s, because it does not apply to this system." #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgid "This would invalidate %s." #~ msgstr "This would invalidate %s." #~ msgid "Establishing %s" #~ msgstr "Establishing %s" #~ msgid "Installing %s" #~ msgstr "Installing %s" #~ msgid "Skipping %s: already installed" #~ msgstr "Skipping %s: already installed" #~ msgid "There are no alternative providers of %s installed" #~ msgstr "There are no alternative providers of %s installed" #~ msgid "for %s" #~ msgstr "for %s" #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "Upgrading to %s to avoid removing %s is not possible." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s provides %s, but is scheduled to be uninstalled." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "" #~ "%s provides %s, but another version of that %s is already installed." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s provides %s, but it is not installable. Try installing it on its own " #~ "for more details." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s provides %s, but it is locked." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s provides %s, but is scheduled to be kept." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s provides %s, but has another architecture." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "Can't satisfy requirement %s for %s" #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "Marking %s as not installable due to conflicts over %s" #~ msgid "from %s" #~ msgstr "from %s" #~ msgid " Error!" #~ msgstr " Error!" #~ msgid " Important!" #~ msgstr " Important!" #~ msgid "Make a solver run with ALL possibilities." #~ msgstr "Make a solver run with ALL possibilities." #~ msgid "Regarding all resolvables with a compatible architecture." #~ msgstr "Regarding all resolvables with a compatible architecture." #, fuzzy #~ msgid "Make a solver run with best architecture only." #~ msgstr "Make a solver run with ALL possibilities." #, fuzzy #~ msgid "Regarding resolvables with best architecture only." #~ msgstr "Regarding all resolvables with compatible architecture." #~ msgid "%s depended on %s" #~ msgstr "%s depended on %s" #~ msgid "%s is recommended by %s" #~ msgstr "%s is recommended by %s" #~ msgid "%s is suggested by %s" #~ msgstr "%s is suggested by %s" #~ msgid "%s is enhanced by %s" #~ msgstr "%s is enhanced by %s" #~ msgid "%s is supplemented by %s" #~ msgstr "%s is supplemented by %s" #~ msgid "%s part of %s" #~ msgstr "%s part of %s" #, fuzzy #~ msgid "Start the next solver run with doubled timeout." #~ msgstr "Make a solver run with ALL possibilities." #~ msgid "%s is freshened by %s" #~ msgstr "%s is freshened by %s" libzypp-17.36.5/po/es.po000066400000000000000000004401631476576476200150130ustar00rootroot00000000000000# translation of zypp.po to # Ibán josé García Castillo , 2000. # Javier Moreno , 2000. # Jordi Jaen Pallares , 1999, 2000, 2001. # Pablo Iranzo Gómez , 2000. # Camaleón, 2007. # César Sánchez Alonso , 2007. # Miguel Angel Alvarez , 2008. # Camaleón , 2008. # translation of zypp.es.po to # Spanish message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002, 2003 SuSE Linux AG. # Copyright (C) 1999, 2000, 2001 SuSE GmbH. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-12-12 14:48+0000\n" "Last-Translator: \"Marina J. Donis\" \n" "Language-Team: Spanish \n" "Language: es\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: Weblate 5.8.4\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "País desconocido: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Sin código" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Emiratos Árabes Unidos" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistán" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua y Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguila" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antillas Neerlandesas" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antártida" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Americana" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Islas Aland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaiyán" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia y Herzegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladés" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Bélgica" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahréin" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benín" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudas" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunéi Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasil" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bután" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Isla Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botsuana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Bielorrusia" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belice" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canadá" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Islas Cocos (Keeling)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "República Centroafricana" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Suiza" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Costa de Marfil" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Islas Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camerún" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cabo Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Isla Christmas" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Chipre" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "República Checa" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Alemania" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Yibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dinamarca" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "República Dominicana" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Argelia" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipto" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sáhara Occidental" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "España" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopía" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlandia" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiyi" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Islas Malvinas" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Estados Federados de Micronesia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Islas Feroe" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francia" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Francia metropolitana" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabón" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Reino Unido" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Granada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guayana francesa" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenlandia" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadalupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinea Ecuatorial" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grecia" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia del Sur e Islas Sandwich del Sur" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Isla Heard e Islas McDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croacia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haití" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hungría" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanda" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isla de Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Territorios británicos del Océano Índico" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irán" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islandia" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordania" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japón" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirguistán" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Camboya" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comoras" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "San Cristóbal y Nieves" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Corea del Norte" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Corea del Sur" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Islas Caimán" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazajistán" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laso, República Democrática Popular" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Líbano" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Santa Lucía" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesoto" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituania" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburgo" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letonia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marruecos" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Mónaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavia" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "San Martín" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Islas Marshall" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Birmania" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Islas Marianas del Norte" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinica" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauricio" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldivas" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malaui" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "México" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malasia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nueva Caledonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Níger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Isla Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Países Bajos" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noruega" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauruano" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nueva Zelanda" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omán" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panamá" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Perú" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinesia Francesa" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papúa Nueva Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipinas" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistán" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polonia" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "San Pedro y Miquelón" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Territorios palestinos" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palaos" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Catar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunión" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumanía" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Federación Rusa" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arabia Saudí" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Islas Salomón" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudán" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suecia" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Santa Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Eslovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard y Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Eslovaquia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leona" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Santo Tomé y Príncipe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Siria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Suazilandia" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Islas Turcas y Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Territorios australes franceses" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tailandia" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tayikistán" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistán" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Túnez" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Tímor Oriental" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turquía" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad y Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalino" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwán" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ucrania" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Islas menores alejadas de los Estados Unidos" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Estados Unidos" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistán" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Santa Sede (Ciudad Estado del Vaticano)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "San Vicente y las Granadinas" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Islas Vírgenes Británicas" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Islas Vírgenes, EE.UU." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis y Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Sudáfrica" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabue" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Proporciona" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Requisitos previos" # clients/hwinfo.ycp:73 # clients/hwinfo.ycp:73 # clients/hwinfo.ycp:73 #: zypp/Dep.cc:98 msgid "Requires" msgstr "Requiere" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Conflictos" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Desplaza" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recomienda" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Sugiere" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Mejora" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Complementa" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Idioma desconocido: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abjasio" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinés" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acholi" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Circasiano" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-asiático (otros)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikáans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Acadio" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanés" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutiano" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Lenguas algoquinas" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altai meridional" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amhárico" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Inglés antiguo (450 - 1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Lenguas apache" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Árabe" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Arameo" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonés" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armenio" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucano" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapahoe" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Artificial (otros)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Asamés" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturiano" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Lenguas atapascanas" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Lenguas australianas" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Ávaro" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestano" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awetí" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aimara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaiyano" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Lenguas Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Beluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinés" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Vasco" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Báltico (otros)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorruso" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengalí" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Bereber (otros)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantú (otros)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnio" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretón" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriato" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugi" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Búlgaro" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birmano" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Cado" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Lenguas amerindias de Centroamérica (otros)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Caribe" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalán" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucásico (otros)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Céltico (otros)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Checheno" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chino" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukés" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Jerga Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choktaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewa" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cheroqui" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Eslavo eclesial" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvasio" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyén" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Lenguas chámicas" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Copto" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Córnico" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corso" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Criollos y pidgins basados en el inglés (otros)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Criollos y pidgins basados en el francés (otros)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Criollos y pidgins basados en el portugués (otros)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cri" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tártaro de Crimea" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Criollos y pidgins (otros)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Casubiano" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cusita (otros)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Checo" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danés" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Esclavo (atapascano)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Lenguas drávidas (otros)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Bajo sorabo" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Danés medieval (1050 - 1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Neerlandés" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egipcio (antiguo)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamita" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inglés" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Inglés medio (1100 - 1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonio" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewé" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Feroe" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fiyi" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finés" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fino-ungrio (otros)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francés" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francés medieval (1400 - 1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francés antiguo (842 - 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisón" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fula" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulano" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germánico (otros)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgiano" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Alemán" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertés" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaélico" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandés" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Gallego" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Alto alemán medieval (1050 - 1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Alto alemán antiguo (750 - 1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gótico" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Griego antiguo (hasta 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Griego moderno (desde 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guaraní" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitiano" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiano" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebreo" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynón" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hitita" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Alto sorabo" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Húngaro" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandés" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Yi de Sichuan" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingua" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Ilocano" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Asociación de la Lengua Auxiliar Internacional)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Índico (otros)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Bahasa" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoeuropeo (otros)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingusio" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraní (otros)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Lenguas iroquesas" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiano" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanés" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonés" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeo-persa" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeo-árabe" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Cabila" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Cachemir" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Canurio" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazaco" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Cherkeso" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Jasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Joisán (otros)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Jemer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Jotanés" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyo" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarruandés" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirguiso" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Congo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreano" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosrae" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpellé" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachái-Balcar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumico" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdo" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latín" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letón" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezgino" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgués" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituano" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgués" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenia y Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedonio" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurés" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshalés" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Macasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayamés" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandinga" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maorí" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austranesio (otros)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malayo" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mendé" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandés medieval (900 - 1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Varios idiomas" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Jemer (otros)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgache" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltés" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchú" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Lenguas manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohicano" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavo" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Varios idiomas" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Lenguas munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandés" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Lenguas mayas" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Lenguas amerindias de Norteamérica" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitano" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele meridional" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele septentrional" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Bajo alemán" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalés" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-cordofano (otros)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niue" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Noruego nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Noruego bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogáy" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Noruego antiguo" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Noruego" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho septentrional" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Lenguas nubias" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari clásico" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitano (posterior a 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osetio" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turco otomano (1500 - 1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Lenguas otomanas" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papú (otros)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Panganisano" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlevi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panyabí" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauano" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persa antiguo (600 - 400 a.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persa" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipino (otros)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenicio" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polaco" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Ponapeano" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugués" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Lenguas prácritas" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provenzal antiguo (hasta 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajastaní" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongano" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romance (otros)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Raeto-romance" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romaní" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumano" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ruso" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakuto" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Lenguas amerindias de Sudamérica (otros)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Lenguas salish" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Arameo samaritano" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sánscrito" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbio" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliano" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Escocés" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croata" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semítico (otros)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandés antiguo (hasta 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Lenguas de signos" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Lenguas siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-tibetano (otros)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Eslavo (otros)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Eslovaco" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Esloveno" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sami meridional" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Sami septentrional" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Lenguas sami (otros)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Sami lule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Sami inari" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoano" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Sami skolt" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninké" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdiano" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalí" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songay" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho meridional" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Español" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardo" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-sahariano (otros)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Sisuati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanés" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerio" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Suajili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Sueco" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siríaco" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitiano" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (otros)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tártaro" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telegu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tayiko" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalo" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetano" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigré" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigriña" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamasheq" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (islas Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshián" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tsuana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turcomano" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Lenguas Tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turco" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaico (otros)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvano" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurto" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugarítico" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uigur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ucraniano" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Indeterminado" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbeco" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamita" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votiaco" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Lenguas wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Galés" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Lenguas sórabas" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Valón" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Calmico" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapés" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Lenguas Yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapoteca" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Chuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulú" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuñi" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Se realizarán las siguientes acciones:" # clients/support_registration.ycp:225 include/support/registration.ycp:77 # clients/support_askkey.ycp:246 include/support/supportio.ycp:79 # # clients/support_askkey.ycp:246 include/support/supportio.ycp:79 #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "desconocido" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "no compatible" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Nivel 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Nivel 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Nivel 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Se necesita un contrato adicional de cliente" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Se ha discontinuado y ha quedado obsoleto por otro paquete" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "no válido" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "El nivel de asistencia no se ha especificado" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "El proveedor no proporciona asistencia." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Determinación de problemas, lo que significa asistencia técnica diseñada " "para proporcionar información de compatibilidad, asistencia para la " "instalación, compatibilidad de uso, mantenimiento continuo y resolución " "básica de problemas. La asistencia de nivel 1 no está pensada para corregir " "errores por defectos del producto." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Aislamiento de problemas, lo que significa asistencia técnica diseñada para " "reproducir los problemas del cliente, aislar el área problemática y " "proporcionar soluciones para los problemas que no se resuelven mediante la " "asistencia de nivel 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Resolución de problemas, lo que significa asistencia técnica diseñada para " "resolver problemas complejos utilizando la ingeniería en la resolución de " "los defectos de los productos identificados en la asistencia de nivel 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Para obtener asistencia se necesita un contrato adicional de cliente." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "El paquete se ha discontinuado y ha quedado obsoleto por un nuevo paquete " "con otro nombre." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Opción de asistencia desconocida. Descripción no disponible" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "La gestión del sistema está bloqueada por la aplicación con pid %d (%s).\n" "Cierre la aplicación antes de volver a intentarlo." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Modo de coincidencias '%s' desconocido" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Modo de coincidencias %s desconocido para el patrón %s" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Expresión regular %s no válida: regcomp ha devuelto %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Expresión regular '%s' no válida" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Se requiere autenticación para %s" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Se intentará de nuevo..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Renunciar después de %1% intentos." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visite el Centro de servicios al cliente de SUSE para comprobar si su " "registro es válido y no ha caducado." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visite el Centro de servicios al cliente de Novell para comprobar si el " "registro es válido y no ha caducado." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Creación de punto de conexión: no se encuentra ningún directorio en el que " "se pueda escribir para crear un punto de conexión" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Instale primero el paquete lsof." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "No es posible crear el directorio para el caché de metadatos." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Error al intentar leer de %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "No es posible crear %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "No se pudieron recuperar los nuevos metadatos del repositorio." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "No se pudo almacenar en caché el repositorio ( no se pudo iniciar " "repo2solv )." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Error al añadir a caché el repositorio (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Construyendo el caché del repositorio %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "No es posible crear el caché en %s, no posee permisos de escritura." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "No se pudo almacenar en caché el repositorio %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Tipo de repositorio no gestionado" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Añadiendo el repositorio %s" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nombre de archivo del repositorio no válido en %s" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "No es posible abrir el archivo %s para escribir en él." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Error desconocido al leer de %s" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "No es posible leer el directorio de repositorio %1%: permiso denegado" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Error al leer el directorio %s" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "No es posible leer el archivo de repositorio %1%: permiso denegado" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Limpiando metadatos" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Limpiando paquetes" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Limpiando las carpetas de caché" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Limpiando carpeta: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Limpiando caché" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Cargando desde el caché" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Eliminando el repositorio %s" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "No es posible determinar dónde está almacenado el repositorio." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "No es posible suprimir %s" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Modificando repositorio" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Actualizando Repositorio: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "No es posible determinar dónde está almacenado el servicio." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Servicio desconocido %1%: se va a eliminar el repositorio de servicios " "huérfano %2%" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "El alias del repositorio no puede comenzar con un punto." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "El alias del servicio no puede comenzar con un punto." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "No hay resumen para el archivo %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Resumen desconocido %s para el archivo %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Error de verificación del resumen para el archivo %s" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "El archivo %s no está asignado. ¿Desea continuar?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "El archivo %s del repositorio %s no está asignado. ¿Desea continuar?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" "¿Desea rechazar la clave, confiar en ella temporalmente o confiar en ella " "siempre?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nombre de la clave: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "Ha recibido %1% clave de firma de paquete nueva para el repositorio %2%:" msgstr[1] "" "Ha recibido %1% clave de firmas de paquete nuevas para el repositorio %2%:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Error de verificación de firma para el archivo %1%." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Error de verificación de firma para el archivo %1% desde el repositorio %2%." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "¿Desea continuar?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "El archivo %s está firmado con una clave desconocida %s. ¿Desea continuar?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "El archivo %s del repositorio %s está firmado con una clave desconocida %s. " "¿Desea continuar?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "El repositorio %1% no define ningún URL 'gpgkey=' adicional." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Buscando la clave gpg identificada con %1% en el repositorio %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Buscando la clave gpg identificada con %1% en la caché %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Falta el atributo requerido %s." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Se requieren uno o ambos de los atributos %s o %s." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Error de verificación de firma" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Parece que el paquete %s se ha dañado durante la transferencia. ¿Desea " "volver a intentar la recuperación?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Error al proporcionar el paquete %s. ¿Desea volver a intentar la " "recuperación?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Error al comprobar applydeltarpm." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "Error de applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "No hay permiso para escribir en el caché de repositorio." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "El complemento del servicio no admite el cambio de un atributo." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "No es posible proporcionar el archivo %s desde el repositorio %s" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "No hay ninguna URL en el repositorio." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Medio esperado %1%/%2% identificado por el archivo «%3%», el cual contiene:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "El archivo %1%\n" " del paquete\n" " %2%\n" " tiene un conflicto con un archivo del paquete\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "El archivo %1%\n" " del paquete\n" " %2%\n" " tiene un conflicto con el archivo de la instalación de\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "El archivo %1%\n" " de la instalación de\n" " %2%\n" " tiene un conflicto con un archivo del paquete\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "El archivo %1%\n" " de la instalación de\n" " %2%\n" " tiene un conflicto con un archivo de la instalación de\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "El archivo %1%\n" " del paquete\n" " %2%\n" " tiene un conflicto con el archivo\n" " %3%\n" " del paquete\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "El archivo %1%\n" " del paquete\n" " %2%\n" " tiene un conflicto con el archivo\n" " %3%\n" " de la instalación de\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "El archivo %1%\n" " de la instalación de\n" " %2%\n" " tiene un conflicto con el archivo\n" " %3%\n" " del paquete\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "El archivo %1%\n" " de la instalación de\n" " %2%\n" " tiene un conflicto con el archivo\n" " %3%\n" " de la instalación de\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "No es posible crear sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "romper %s ignorando algunas de sus dependencias" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "ignorar en general algunas dependencias" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "el elemento %1% instalado no pertenece a un repositorio de actualización de " "distribuciones y se debe sustituir" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" "el elemento %1% que se va a instalar no pertenece a un repositorio de " "actualización de distribuciones" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "el elemento %1% instalado tiene una arquitectura inferior" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "el elemento %1% que se va a instalar tiene una arquitectura inferior" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problema con el elemento %1% instalado" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "peticiones en conflicto" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "algún problema de dependencia" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "nada proporciona el elemento %1% pedido" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "¿Ha habilitado todos los repositorios requeridos?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "el paquete %1% pedido no existe" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "petición no admitida" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "%1% es proporcionado por el sistema y no se puede borrar" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% no es instalable" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "nada proporciona %1%, que el elemento %2% instalado necesita" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" "nada proporciona %1%, que el elemento %2% que se va a instalar necesita" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "no es posible instalar %1% y %2% conjuntamente" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "el elemento %1% instalado tiene un conflicto con %2%, que proporciona el " "elemento %3% instalado" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "el elemento %1% instalado tiene un conflicto con %2%, que proporciona el " "elemento %3% que se va a instalar" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "el elemento %1% que se va a instalar tiene un conflicto con %2%, que " "proporciona el elemento %3% instalado" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "el elemento %1% que se va a instalar tiene un conflicto con %2%, que " "proporciona el elemento %3% que se va a instalar" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "el elemento %1% instalado desplaza a %2%, proporcionado por el elemento %3% " "instalado" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "el elemento %1% instalado desplaza a %2%, proporcionado por el elemento %3% " "que se va a instalar" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "el elemento %1% que se va a instalar desplaza a %2%, proporcionado por el " "elemento %3% instalado" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "el elemento %1% que se va a instalar desplaza a %2%, proporcionado por el " "elemento %3% que se va a instalar" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" "el elemento %1% instalado tiene un conflicto con %2% proporcionado por sí " "mismo" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "el elemento %1% que se va a instalar tiene un conflicto con %2% " "proporcionado por sí mismo" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "el elemento %1% instalado requiere %2%, pero no se puede satisfacer este " "requisito" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "el elemento %1% que se va a instalar requiere %2%, pero no se puede " "satisfacer este requisito" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "proveedores suprimidos: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "proveedores no instalables: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "proveedores no instalables: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% aún no se ha integrado por completo en %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Lo habitual es conservar el PTF y no instalar los parches de mantenimiento." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Eliminar el %1% instalado en este contexto también eliminará (¡no " "reemplazará!) los paquetes de PTF incluidos." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "El PTF debe eliminarse llamando a '%1%'. Esto actualizará los paquetes de " "PTF incluidos en lugar de eliminarlos." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Lo habitual es conservar el PTF o cancelar la acción." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "El elemento %1% instalado bloquea la acción deseada." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Lo habitual es conservar el PTF y cancelar la acción." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "elimine el bloqueo para permitir la eliminación de %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "no instalar %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "mantener %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "elimine el bloqueo para permitir la instalación de %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Esta petición dañará su sistema." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorar la advertencia de daño del sistema" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "no pedir que se instale un elemento solucionable que proporcione %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" "no perdir que se supriman todos los elementos solucionables que proporcionen " "%1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "no instalar la versión más reciente de %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "mantener %1% a pesar de que su arquitectura sea inferior" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "instalar %1% a pesar de que su arquitectura sea inferior" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "mantener el elemento %1% obsoleto" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "instalar el elemento %1% del repositorio excluido" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "instalar %1% aunque se haya retraído" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "permitir la instalación de PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "instalar %1% aunque esté en la lista negra" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "bajar de versión %1% a %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "cambio de arquitectura de %1% a %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "instalar %1% (con cambio de proveedor)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "instalar %1% del proveedor %2%\n" " reemplazando %3% del proveedor %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "sustitución de %1% con %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "desinstalación de %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Ejecutando guiones postransacción" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Ejecutando guion %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Resultado de guion %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "La instalación se ha cancelado siguiendo las indicaciones." # include/nis_server/io.ycp:567 #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " ejecutado" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " error de ejecución" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s ya se ha ejecutado como %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " ejecución omitida mientras se cancela" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Error al enviar la notificación del mensaje de actualización." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nuevo mensaje de actualización" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Se ha recibido la señal: \"%1% (%2%)\". Para garantizar la coherencia del " "sistema, no es posible cancelar una transacción de rpm en ejecución." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" "Falló la ejecución de la transacción debido a los siguientes problemas:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM fallido: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Error al importar la clave pública %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Error al eliminar la clave pública %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "¡Cabecera del paquete sin firmar!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "¡Contenido del paquete sin firmar!" # # modules/Mail.ycp:458 # modules/Mail.ycp:554 # modules/Mail.ycp:554 # modules/Mail.ycp:563 #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Se han modificado los archivos de configuración para %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm ha guardado %s como %s, pero no es posible determinar la diferencia" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ha guardado %s como %s.\n" "A continuación se presentan las primeras 25 líneas de diferencia:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm ha creado %s como %s, pero no es posible determinar la diferencia" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ha creado %s como %s.\n" "A continuación se presentan las primeras 25 líneas de diferencia:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Salida de rpm adicional" # include/nis_server/io.ycp:582 # include/backup/ui.ycp:1286 #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "creada copia de seguridad %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "La firma es correcta" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tipo de firma desconocido" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "La firma no cumple la verificación" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "La firma es correcta, pero la clave no es de confianza" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "La clave pública de firma no está disponible" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "El archivo no existe o no es posible comprobar la firma" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "El fichero no está firmado" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "no caduca" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "caducado: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "caduca: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(no caduca)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(CADUCADO)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(caduca en las próximas 24 horas)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(expira en %d día)" msgstr[1] "(expira en %d días)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" "Se intentó importar una clave que no existe (%s) al almacén de claves %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Error al importar la clave." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Error al suprimir la clave." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "No se encuentra el archivo de firma %s" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tipo dudoso %s para el byte %u de la suma de comprobación %s" # include/backup/ui.ycp:1661 #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "No es posible abrir el pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "No es posible abrir el conducto (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Cadena de consulta URL LDAP no válida" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Parámetro de consulta URL LDAP %s no válido" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "No es posible clonar el objeto URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Referencia de objeto de URL vacío no válida" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "No es posible analizar los componentes de URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historial:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "El esquema de URL no permite un elemento %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Componente %s no válido %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Componente %s no válido" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" "El análisis de cadenas de consulta no es compatible con esta dirección URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "El esquema de URL es un componente obligatorio" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Esquema %s de URL no válido" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "El esquema de URL no permite un nombre de usuario" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "El esquema de URL no permite una contraseña" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "El esquema de URL requiere un componente host" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "El esquema de URL no permite un componente host" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Componente de host no válido %s" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "El esquema de URL no permite un puerto" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Componente de puerto no válido %s" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "El esquema URL requiere un nombre de vía" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "No se permiten vías relativas si existe una autoridad" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "La cadena cifrada incluye un byte nulo" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Carácter separador de división de conjunto de parámetros no válido" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Carácter separador de división de asignación de parámetros no válido" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Carácter separador de unión de conjunto de parámetros no válido" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "El comando ha terminado con el estado %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "La señal %d (%s) ha interrumpido el comando." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "El comando ha terminado con un error desconocido." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Se han proporcionado argumentos spawn no válidos." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "No es posible crear una tubería de control." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "No es posible aplicar chroot a %s (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "No es posible cambiar al directorio %s (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "No es posible cambiar al directorio %s en chroot %s (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "No es posible ejecutar %s (%s)." # clients/printconf_write.ycp:121 #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "No es posible hacer fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "No es posible ejecutar '%s', chdir falló (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "No es posible ejecutar '%s', falló chroot (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "No es posible ejecutar '%s', falló exec (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "No es posible ejecutar '%s', error inesperado." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Error al montar %s en %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Error al desmontar %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nombre de archivo incorrecto: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "No se ha abierto el medio al intentar realizar la acción %s." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "No se encuentra el archivo %s en el medio %s" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "No es posible escribir el archivo %s." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Medio no conectado" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Punto de conexión de medio incorrecto" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Error de inicio de descarga (curl) para %s" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Excepción de sistema %s en el medio %s." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "La vía %s del medio %s no es un archivo." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "La vía %s del medio %s no es un directorio." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Formato de URI incorrecto" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nombre de host vacío en URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Sistema de archivos vacío en URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destino vacío en URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Esquema de URI no admitido en %s." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "El medio no admite la operación" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Error de descarga (curl) para %s:\n" "Código de error: %s\n" "Mensaje de error: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Error al definir las opciones de descarga (curl) para %s:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "El origen de medios %s no incluye el medio deseado" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "El medio %s está en uso en otra instancia" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "No es posible expulsar ningún medio" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "No es posible expulsar el medio '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Se ha denegado el permiso para acceder a %s." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Se ha superado el tiempo de espera al acceder a %s." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "La descarga de datos ha excedido el tamaño esperado '%s 1' de '%s 2'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "La ubicación '%s' está momentáneamente inaccesible." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Hay un problema con el certificado SSL. Compruebe que la autoridad de " "certificación (CA) es correcta para %s." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "No hay recursos libres disponibles para adjuntar medios." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Método de autenticación HTTP no compatible %s" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "(curl) Error de descarga para '%s':\n" "Código de error: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "(curl) Error de descarga para '%s':\n" "No se recibió una respuesta HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Sí" #: zypp-tui/Table.cc:32 msgid "No" msgstr "No" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Nota:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Advertencia:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Error:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "terminado" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "atención" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "error" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Advertencia: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Recuperando:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "iniciando" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "no encontrado" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "No hay ayuda disponible para este mensaje." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "no hay ayuda disponible para esta opción" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "mostrar todas las opciones" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "si" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "no" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "No se han encontrado metadatos válidos en la URL especificada" #~ msgstr[1] "No se han encontrado metadatos válidos en las URL especificadas" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Ejecutando el guion %%posttrans %1%" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Ejecutando guiones %posttrans" #~ msgid "Package is not signed!" #~ msgstr "¡El paquete no está firmado!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s no pertenece a un repositorio distupgrade" #~ msgid "%s has inferior architecture" #~ msgstr "%s posee una arquitectura inferior" #~ msgid "problem with installed package %s" #~ msgstr "se ha producido un problema con el paquete instalado %s" #~ msgid "nothing provides requested %s" #~ msgstr "no hay nada que proporcione el elemento %s pedido" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "¿Ha habilitado todos los repositorios pedidos?" #~ msgid "package %s does not exist" #~ msgstr "el paquete %s no existe" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s proviene del sistema y no se puede eliminar" #~ msgid "%s is not installable" #~ msgstr "%s no es instalable" #~ msgid "nothing provides %s needed by %s" #~ msgstr "no hay nada que proporcione %s, necesario para %s" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #~ msgid "cannot install both %s and %s" #~ msgstr "no es posible instalar ambos elementos: %s y %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s está en conflicto con %s proporcionado por %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s deja obsoleto %s, proporcionado por %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s instalado, deja obsoleto a %s proporcionado por %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "" #~ "La solución %s está en conflicto con %s, proporcionada por ella misma" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s requiere %s, pero este requisito no se puede cumplir" #~ msgid "remove lock to allow removal of %s" #~ msgstr "eliminar bloqueo para permitir la desinstalación de %s" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #~ msgid "do not install %s" #~ msgstr "no instalar %s" #~ msgid "keep %s" #~ msgstr "mantener %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "eliminar bloqueo para permitir la instalación de %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "no preguntar si se debe instalar una solución que proporciona %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "" #~ "no preguntar si se deben suprimir todas las soluciones que proporcionan %s" #~ msgid "do not install most recent version of %s" #~ msgstr "no instalar la versión mas reciente de %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "mantener %s a pesar de la arquitectura inferior" #~ msgid "install %s despite the inferior architecture" #~ msgstr "instalar %s a pesar de la arquitectura inferior" #~ msgid "keep obsolete %s" #~ msgstr "mantener el antiguo %s" #~ msgid "install %s from excluded repository" #~ msgstr "instalar %s desde el repositorio excluido" #~ msgid "downgrade of %s to %s" #~ msgstr "restablecer versión anterior de %s a %s" #~ msgid "architecture change of %s to %s" #~ msgstr "cambio en la arquitectura de %s a %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "instalar %s (con cambio de proveedor)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "reemplazo de %s con %s" #~ msgid "deinstallation of %s" #~ msgstr "desinstalación de %s" #~ msgid "Can't open lock file: %s" #~ msgstr "No es posible abrir el archivo de bloqueo: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Otro programa ya está ejecutando esta acción." #~ msgid "Hal Exception" #~ msgstr "Excepción de hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Lo sentimos, pero esta versión de libzypp se ha construido sin " #~ "compatibilidad con HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext no está conectado" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive no se ha iniciado" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume no se ha iniciado" #~ msgid "Unable to create dbus connection" #~ msgstr "No es posible crear la conexión dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: no es posible crear el contexto libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "libhal_set_dbus_connection: no es posible establecer la conexión dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "No es posible iniciar el contexto HAL -- ¿Es posible que hald no se esté " #~ "ejecutando?" #~ msgid "Not a CDROM drive" #~ msgstr "No es una unidad de CD-ROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "No es posible iniciar los atributos de mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "No es posible establecer el atributo de mutex recursivo" #~ msgid "Can't initialize recursive mutex" #~ msgstr "No es posible iniciar mutex recursivo" #~ msgid "Can't acquire the mutex lock" #~ msgstr "No es posible adquirir el bloqueo de mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "No es posible liberar el bloqueo de mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Error al importar la clave pública desde el archivo %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Error al eliminar la clave pública %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "No se encuentra ningún dispositivo de bucle disponible para montar el " #~ "archivo de imagen desde %s" #~ msgid "generally ignore of some dependecies" #~ msgstr "generalmente ignorar algunas dependencias" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #~ msgid "do not forbid installation of %s" #~ msgstr "no prohibir la instalación de %s" #~ msgid "do not keep %s installed" #~ msgstr "no mantener instalado %s" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "تعذر حل التبعيات" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "No se puede crear la clave pública %s del anillo de claves %s al archivo " #~ "%s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "" #~ "Se intentó importar la clave inexistente %s en el anillo de claves %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "No se puede cambiar de directorio a '/' dentro del chroot (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "" #~ "La inicialización de la descarga (Metalink curl) ha fallado para '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Error en la descarga (metalink curl) de '%s':\n" #~ "Código de error: %s\n" #~ "Mensaje de error: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Descarga interrumpida en %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Descarga interrumpida por el usuario" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Se ha producido un error al establecer las opciones de descarga (metalink " #~ "curl) para '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Error al descargar %s desde %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia y Montenegro" #~ msgid "Unknown Distribution" #~ msgstr "Distribución desconocida" #~ msgid "Timeout exceeded when access '%s'." #~ msgstr "Se ha sobrepasado el tiempo de espera al acceder a '%s'." libzypp-17.36.5/po/et.po000066400000000000000000003442411476576476200150140ustar00rootroot00000000000000# translation of zypp.et.po to Estonian # translation of # Copyright (C) 2006 SUSE Linux Products GmbH. # Estonian message file for YaST2 (@memory@). # # Ain Vagula , 2006, 2007, 2009. msgid "" msgstr "" "Project-Id-Version: zypp.et\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2019-12-08 11:54+0000\n" "Last-Translator: Jaanus Ojangu \n" "Language-Team: Estonian \n" "Language: et\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: Weblate 3.6.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Tundmatu riik " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Kood puudub" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Araabia Ühendemiraadid" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua ja Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albaania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armeenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Hollandi Antillid" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktika" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentiina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Ameerika Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Austraalia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Ahvenamaa" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Aserbaidžaan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia ja Hertsegoviina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgia" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrein" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Boliivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasiilia" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahama" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutaan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet' saar" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Valgevene" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kookosesaared" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Kesk-Aafrika Vabariik" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Šveits" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Elevandiluurannik" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cooki saared" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Tšiili" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Hiina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa-Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Roheneemesaared" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Jõulusaar" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Küpros" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tšehhi" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Saksamaa" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Taani" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikaani Vabariik" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alžeeria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Eesti" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egiptus" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Lääne-Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Hispaania" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etioopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Soome" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandi saared (Malviinid)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikroneesia Föderatsioon" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Fääri saared" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Prantsusmaa" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Prantsuse emamaa" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Suurbritannia" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gruusia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Prantsuse Guajaana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Gröönimaa" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatoriaal-Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Kreeka" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Lõuna-Georgia ja Lõuna-Sandwichi saared" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heardi saar ja McDonaldi saared" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Horvaatia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungari" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indoneesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Iirimaa" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Iisrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Manni saar 'Isle of Man'" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Briti India ookeani ala" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iraan" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Itaalia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordaania" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Jaapan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Keenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kõrgõzstan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodža" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komoorid" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts ja Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Põhja-Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Lõuna-Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuveit" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kaimanisaared" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kasahstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Liibanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint-Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri-Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Libeeria" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Leedu" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Läti" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Liibüa" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshalli saared" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedoonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Birma" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongoolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Põhja-Mariaani saared" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritaania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldiivid" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mehhiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaisia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mosambiik" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namiibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Uus-Kaledoonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolki saar" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Holland" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norra" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Uus-Meremaa" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omaan" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peruu" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Prantsuse Polüneesia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Paapua Uus-Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipiinid" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poola" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre ja Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto-Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestiina haldusterritoorium" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Belau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumeenia" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Venemaa Föderatsioon" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi Araabia" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Saalomoni saared" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seišellid" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudaan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Rootsi" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Saint-Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Sloveenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ja Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakkia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra-Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San-Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somaalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome ja Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Süüria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Svaasimaa" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks ja Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tšaad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Prantsuse Lõunaalad" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tai" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Türkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tuneesia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Ida-Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Türgi" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad ja Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tansaania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Ühendriikide hajasaared" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Ameerika Ühendriigid" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Usbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Püha Tool (Vatikan)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent ja Grenadiinid" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Briti Neitsisaared" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "USA Neitsisaared" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis ja Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jeemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Lõuna-Aafrika Vabariik" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Sambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Varustab" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Eeltingimused" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Vajab" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "On vastuolus" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Aegub" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Soovitab" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Soovitused" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Parandused" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Lisandid" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Tundmatu keel: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afari" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abhaasi" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Atšehi" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Akoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adõgee" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afroaasia (muu)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaani" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akani" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akadi" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albaania" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleuudi" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonkini keeled" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altai" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amhaari" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Vanainglise (ca. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apatši keeled" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Araabia" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramea" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragoni" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armeenia" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araukaani" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Tehis (muu)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawaki" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assami" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Astuuria" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Atapaski keeled" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Austraalia keeled" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avaari" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avesta" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Avadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aimaraa" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Aserbaidžaani" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke keeled" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Baškiiri" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Belutši" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Bali" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baski" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Balti (muu)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Bedža" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Valgevene" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengaali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berberi (muu)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhodžpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihaari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikoli" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Edo" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (muu)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnia" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Bradži" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretooni" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Bataki (Indoneesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Burjaadi" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugi" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgaaria" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birma" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blini" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Kado" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Kesk-Ameerika indiaani (muu)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Kariibi" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalaani" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukaasia (muu)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Sebu" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keldi (muu)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Tšamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Tšibtša" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tšetšeeni" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Tšagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Hiina" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Tšuugi" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Tšinuki žargoon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Tšokto" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Tšipevai" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Tšerokii" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Kirikuslaavi" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Tšuvaši" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Šaieeni" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Chamic keeled" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Kopti" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Korni" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsika" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreoolid ja Pidginid, inglise keeles (muu)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreoolid ja Pidginid, prantsuse päritolu (muu)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreoolid ja Pidginid, Portugali põhine (muu)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Krii" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krimmitatari" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreoolid ja Pidginid (muu)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kašuubi" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitic (muu)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tšehhi" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Taani" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargi" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dajaki" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delavari" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Orjaindiaani (atapaski)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Koeraribi-Karujärve" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Maldiivi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidian (muu)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Alamsorbi" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Keskhollandi (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Hollandi" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Djula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Ibibio" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Vanaegiptuse" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekadžuki" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Eelami" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inglise" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Keskinglise (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Eesti" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Eve" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Jaunde" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fangi" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Fääri" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fidži" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipiini" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Soome" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Soomeugri (muu)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Foni" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Prantsuse" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Keskprantsuse (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Vanaprantsuse (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Friisi" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulbe" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friuuli" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Gaa" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gajo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaja" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germaani (muu)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Gruusia" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Saksa" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Etioopia" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilberti" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaeli" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Iiri" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galeegi" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Mänksi" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Keskülemsaksa (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Vanaülemsaksa (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gooti" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Vanakreeka (kuni 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Kreeka, tänapäevane (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guaranii" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gudžarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gvitšini" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haiiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Havai" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Heebrea" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligainoni" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himatšali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Heti" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmongi" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri-Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Ülemsorbi" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ungari" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Ibani" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Ibo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandi" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuani jii" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Idžo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktituti" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue (oktsidentaal)" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (rahvusvaheline abikeele assotsiatsioon)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "India (muu)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indoneesia" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoeuroopa (muu)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Inguši" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Injupiaki" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraani (muu)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokeesi keeled" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Itaalia" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Jaava" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban - tehiskeel" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Jaapani" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Juudipärsia" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Juudiaraabia" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpaki" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabiili" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Katšini" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Kareni" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kašmiiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kaavi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kasahhi" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardi-tšerkessi" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan - aafrika keeled (muu)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmeri" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Saki" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuju" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Ruanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgiisi" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Mbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korea" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosrae" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karatšai-balkaari" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kruu" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Oraoni" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Ambo" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumõki" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdi" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladiino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Ladina" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Läti" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lesgi" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgi" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Leedu" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Letseburgi" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luisenjo" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya ja Tansaania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lušei" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedoonia" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madura" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Maršalli" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makassari" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malajalami" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maoori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesian - aasia keeled (muud)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malai" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Mokša" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandari" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Keskiiri (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mikmaki" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Mitmesugused keeled" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (muud)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagassi" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Malta" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Mandžu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo keeled" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohoogi" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldova" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongoli" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Mitu keelt" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda keeled" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Maskogi" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Miranda" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marvari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Maaja keeled" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Ersa" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahua" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Põhja-Ameerika indiaani" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Naapoli" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Lõunandebele" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Põhjandebele" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Alamsaksa" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa keeled" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Niasi" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-kordofaani (Muud)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niue" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Uusnorra" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norra (bokmål)" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Vanapõhjala" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norra" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Põhjasotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nuubia keeled" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Klassikaline nevari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Njandža" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Njamvesi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nkole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Njoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Provansi (pärast 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Odžibvei" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oria" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Oseidži" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osseedi" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Osmanitürgi (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomi keeled" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Paapua (muu)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinani" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Pandžabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Belau" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Vanapärsia (u. 600-400 eKr.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Pärsia" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipiini (muu)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Foiniikia" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Paali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Poola" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Poonpei" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugali" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Praakriti keeled" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Vanaprovansi (kuni 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Puštu" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Ketšua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Radžastani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotonga" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romaani (muu)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Retoromaani" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Mustlaskeel" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumeenia" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Vene" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandave" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Jakuudi" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Lõuna-Ameerika indiaani (muu)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salishani keeled" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaaria aramea" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbia" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sitsiilia" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Šoti" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Horvaadi" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Sölkupi" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semiidi (muu)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Vanaiiri (kuni 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Märgikeeled" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Šani" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singali" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siuu keeled" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Hiina-Tiibeti keel (Muud)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slaavi (muu)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovaki" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Sloveeni" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Lõunasaami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Põhjasaami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Saami keeled (muu)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule saami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari saami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Koltasaami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Šona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdi" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somaali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Lõunasotho" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Hispaania" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardi" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Sereri" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Niiluse-Sahara (muu)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Svaasi" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sunda" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumeri" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Suahiili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Rootsi" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Assüüria" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahiiti" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (muu)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamili" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatari" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Temne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetumi" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadžiki" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalogi" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tiibeti" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigree" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinja" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tivi" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingoni" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingiti" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tuareegi" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tonga saarestik)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Uusmelaneesia" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tsvaana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Türkmeeni" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi keeled" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Türgi" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altai (muu)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Tvii" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuva" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurdi" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugariti" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uiguuri" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukraina" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Määramata" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Usbeki" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnami" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Vadja" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakashani keeled" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Volamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Varai" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Vašo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Kõmri" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbi keeled" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Vallooni" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Volofi" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmõki" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Koosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Jao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Japi" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jidiš" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Joruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Jupiki keeled" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Sapoteegi" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Tšuangi" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Suulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Sooritatakse järgmised tegevused:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "tundmatu" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "toetamata" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Tase 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Tase 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Tase 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Vajalik on täiendav kliendileping" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "vigane" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Kasutajatoe tase pole määramata" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Müüja ei paku tuge." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Probleemi tuvastamine, mis tähendab tehnilist abi, et pakkuda ühilduvuse " "teavet, paigaldusabi, kasutustuge, töösoleva hoolduse ja põhiliste " "tõrkeotsingute jaoks. Tase 1 tugi pole mõeldud toote defektide vigade " "parandamiseks." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Probleemide eraldamine, mis tähendab tehnilist tuge, mis on loodud klientide " "probleemide dubleerimiseks, probleemipiirkonna isoleerimiseks ja probleemide " "lahendamiseks ei sisaldu tase 1 toes." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Probleemi lahendamine, mis tähendab tehnilist tuge, mis on loodud keerukate " "probleemide lahendamiseks, rakendades tehnilisi lahendusi tuvastatud " "tootevigade kõrvaldamiseks, mis on kindlaks tehtud 2. taseme toe abil." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Kasutajatoe saamiseks on vajalik täiendav kliendileping." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Tundmatu toe valik. Kirjeldus pole saadaval" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Süsteemihaldus on lukustatud rakendusega pid %d (%s).\n" "Enne uuesti proovimist sulgege see rakendus." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Tundmatu ühilduvusstaatus '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Tundmatu 'match mode' '%s' struktuurile '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Vigane regulaaravaldis '%s': recomp vastas %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Vigane regulaaravaldis '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autoriseerimine on nõutav '%s' jaoks" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Külastage SUSE kliendikeskust, et kontrollida, kas teie registreering on " "kehtiv ega ole aegunud." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Külastage kliendikeskust, et kontrollida, kas teie registreerimine on kehtiv " "ja kas see pole aegunud." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Lisamispunkti loomine: lisamispunkti loomiseks ei leia kirjutatavat kataloogi" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Palun esmalt paigaldage 'Isof' pakett." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Metaandmete vahemälu kataloogi ei saa luua." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Viga lugemisel asukohast '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Pole võimalik luua %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Hoidla puhverdamine nurjus (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Loodava repositooriumi '%s' vahemälu" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Ei saa luua vahemälu kohas %s - puuduvad kirjutamise õigused." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Käsitlemata tarkvarahoidla tüüp" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Lisatakse repositoorium '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Vigane repo faili nimi '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Faili '%s' avamine kirjutamiseks nurjus." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Tundmatu viga '%s' lugemisel" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Ei saa lugeda repo kataloogi '%1%': Juurdepääs on keelatud" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Kataloogi '%s' lugemine nurjus" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Ei saa lugeda repo faili '%1%': Juurdepääs on keelatud" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Eemaldatakse hoidla '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Ei suuda tuvastada, kus hoidla asub." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Faili '%s' ei saa kustutada" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Ei suuda tuvastada, kus teenus asub." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Tundmatu teenus '%1%': Orvustunud teenuse repost '%2%' eemaldamine" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Hoidlat alias ei saa alata punktiga." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Teenuse alias ei saa alata täpiga." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Kas jätkata?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Repositoorium %1% ei defineeri täiendavat 'gpgkey=' URLi." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Otsitakse gpg võtme ID-d %1% repositooriumis %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Otsitakse gpg võtme ID-d %1% vahemälus %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Puudub nõutav argument '%s'." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Üks või mõlemad '%s' või '%s' atribuudid on nõutavad." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Allkirja võrdlemine nurjus" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Pakatt %s tundub olevat transpordi ajal rikutud. Kas te soovit proovida " "uuesti vastu võtta?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Paketi %s saatmine nurjus. Kas proovida uuesti saata?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm kontrollimine nurjus." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm nurjus." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Teenuse lisaprogramm ei toeta atribuudi muutmist." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Ei saa faili '%s' tarkvarahoidlast '%s' hankida" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Repositooriumis ei ole URLi." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Faili %1%\n" " paketist\n" " %2%\n" " on konfliktis failiga paketist\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Fail %1%\n" " paketist\n" " %2%\n" " on vastuolus failiga paigaldusest\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Fail %1%\n" " paigaldusest\n" " %2%\n" " on konfliktis failiga paketist\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Fail %1%\n" " paigaldusest\n" " %2%\n" " on vastuolus failiga paigaldusest\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Fail %1%\n" " paketist\n" " %2%\n" " on vastuolus failiga\n" " %3%\n" " paketist\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Fail %1%\n" " paketist\n" " %2%\n" " on vastuolus failiga\n" " %3%\n" " paigaldusest\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Fail %1%\n" " paigaldusest\n" " %2%\n" " on konfliktis failiga\n" " %3%\n" " paketist\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Fail %1%\n" " paigaldusest\n" " %2%\n" " on vastuolus failiga\n" " %3%\n" " paigaldusest\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Faili ei sa luua sat-pooli." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "võib katki teha %s ignoneerides mõnda selle sõltuvust" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "üldiselt ignoreeritakse mõnda sõltuvust" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "vastuolulised päringud" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "mingi sõltuvuse probleem" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "mittetoetaud taotlus" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "kustutatud pakkujad: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "kättesaamatud varustajad: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "kättesaamatud varustajad: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "See päring rikub teie süsteemi!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignoreerige katkise süsteemi hoiatust" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "paigalda %1%, ehkki see on tagasi tõmmatud" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "lubage paigaldada PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "paigaldage %1%, kuigi see on mustas nimekirjas" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Paigaldamine on vastavalt juhistele katkestatud." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " käivitatud" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " käivitamine nurjus" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s juba käivitatud kui %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " käivitamine jäeti katkestamise käigus vahele" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Viga uuendusteate teavituse saatmisel." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Uus uuendusteade" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM nurjus: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Avaliku võtme %1% import nurjus" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Avaliku võtme %1% eemaldamine nurjus" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Muudetud seadistuste fail %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm salvestati %s nimega %s, kuid erinevust oli võimatu tuvastada" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm on salvestatud %s kui %s.\n" "Siin on esimesed 25 erinevuse rida:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm loodi %s nimega %s, aga oli võimatu leida erinevusi" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm loodi %s nimega %s.\n" "Siin toodud esimesed 25 rida erinevusi:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Täiendav rpm-i väljund" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "loodi varukoopia %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Allkiri on korras" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tundmatu allkirja tüüp" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Allkirja ei võrrelda" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Allkiri on õige aga võti ei ole usaldatav" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Allkirjade avalik võti pole saadaval" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Faili pole olemas või allkirja pole võimalik kontrollida" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Fail on allkirjastamata" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "ei vanane" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "aegunud: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "aegub: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(ei vanane)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(AEGUNUD)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(aegub 24h jooksul)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(aegub %d päevaga)" msgstr[1] "(aegub %d päevaga)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Prooviti võtmehoidjasse %s importida olematu võtme %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Võtme import nurjus." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Võtme kustutamine nurjus." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Allkirjade faili %s ei leitud" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Kahtlane tüüp '%s' %u baitide kontrollsummale '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Ei saanud avada preudoterminali 'pty' (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Ei saa avada toru 'pipe' (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Vigane LDAP URL-i päringu kirje" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Vigane LDAP URL-i päringu parameeter '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Pole võimalik kloonida Url objekti" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Vigane tühja Url objekti referents" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Ei ole võimalik uurida Url komponente" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Ajalugu:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "URL kuju ei luba %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Vigane %s komponent '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Vigane %s komponent" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Selle URL-i puhul ei toetata päringu kirje uurimist" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL kuju on nõutav komponent" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Vigane Url kuju '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url kuju ei võimalda kasutajanime" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url kuju ei võimalda salasõna" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url kuju nõuab arvutinime komponenti" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url kuju ei võimalda arvutinime komponenti" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Vigane host komponent '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url kuju ei võimalda porti" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Vigane pordi komponent '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url kuju nõuab teekonna nime" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Suhteline tee pole lubatud, kui autoriseerimine on olemas" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Krüpteeritud rida sisaldab Nul baiti" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Vale parameetri reastuse jaotuse eraldusmärk" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Vigane parameeter kaardijaotuse eraldusmärk" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Vigane parameetrimassiivi liitumismärk" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Käsk lõpetati olekuga %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Käsk lõpetati signaaliga %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Käsk lõpetas tundmatu veaga." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Ei saa chroot läbi viia '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Ei saa kataloogi vahetada 'chdir '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Ei õnnestunud 'chdir' '%s' 'chroot' sees '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Ei saa käivitada '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "'fork' ei õnnestu (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Haakimine %s asukohas %s nurjus" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Lahtihaakimine %s nurjus" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Vigane faili nimi: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Toimingu '%s' sooritamisel meedium ei avanenud." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Faili '%s' ei leitud meediumil '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Faili '%s' ei saa kirjutada." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Meedium ei ole lisatud" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Vigane meedia lisamispunkt" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "'%s' allalaadimise (curl) initaliseerimine nurjus" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Süsteemi erand „%s” andmekandjal „%s”." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Tee sihtkohas '%s' andmekandjal '%s' ei ole fail." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Tee '%s' meediumil '%s' pole kataloog." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Vigane URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Tühi masina nimi URI-s" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Tühi failisüsteem on URl-l" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Tühi sihtkoht URl-s" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Mittetoetatud URl skeem '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "See tegevus ei ole meediumi poolt toetatud" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "'%s' allalaadimise (curl) viga:\n" "Vea kood: %s\n" "Veateade: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "'%s' allalaadimise valikute määramisel ilmnes viga:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Meediumi allikas '%s' ei sisalda soovitud andmekandjat" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Meedium '%s' on kasutuses teise kasutaja poolt" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Ühtegi andmekandjat ei saa väljutada" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Ei saa väljutada meediumi '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Ligipääs '%s' on keelatud." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "'%s juurdepääsu ajalimiit on ületatud." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Allalaaditud andmed ületasid faili suurust '%s' '%s' -st." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Asukoht '%s' on ajutiselt kättesaamatu." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " SSL-i probleem sertifikaadiga, kontolli, et SK sertifikaat sobiks '%s' " "jaoks." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Mittetoetatud HTTP autoriseerimise meetod '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Jah" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ei" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Hoiatus" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Viga" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "valmis" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "viga" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Hoiatus" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 #, fuzzy msgid "Retrieving:" msgstr "Eemaldamine" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Alustamine..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Ei leitud" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "jah" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ei" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Valitud metaandmeid ei leitud määratud URL-ilt" #~ msgstr[1] "Valitud metaandmeid ei leitud määratud URL-delt" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Käib %%posttrans script '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Käib %posttrans scripts" #~ msgid "Package is not signed!" #~ msgstr "Pakett ei ole allkirjastatud!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s ei kuulu distupgrade tarkvarahoidlasse" #~ msgid "%s has inferior architecture" #~ msgstr "%s on halvema arhitektuuriga" #~ msgid "problem with installed package %s" #~ msgstr "Paigaldatud paketiga %s on probleem" #~ msgid "nothing provides requested %s" #~ msgstr "kuskil ei pakuta nõutud %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Kas olete lubanud kõik taotletud hoidlad?" #~ msgid "package %s does not exist" #~ msgstr "paketti %s pole olemas" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s on süsteemi poolt seatud ja ei ole eemaldatav" #~ msgid "%s is not installable" #~ msgstr "%s pole paigaldatav" #~ msgid "nothing provides %s needed by %s" #~ msgstr "miski ei paku %s vajalikku %s -le" #~ msgid "cannot install both %s and %s" #~ msgstr "Ei saa paigaldada mõlemat %s ja %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s on konfliktis %s -ga hangituna %s poolt" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s aegub %s pakkujalt %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "paigaldatud %s aegub %s pakkujalt %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "lahendatav %s on vastuolus enda poolt pakutuga %s" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s nõuab %s, kuid seda nõuet ei saa täita" #~ msgid "remove lock to allow removal of %s" #~ msgstr "eemalda lukk, et lubada %s eemaldamist" #~ msgid "do not install %s" #~ msgstr "ära paigalda %s" #~ msgid "keep %s" #~ msgstr "jäta alles %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "eemalda lukustus %s paigalduse lubamiseks" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "ärge paluge paigaldada pakutavaid sõltuvuste lahendusi %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "ärge paluge kustutada kõiki pakutud sõltuvuste lahendusi %s" #~ msgid "do not install most recent version of %s" #~ msgstr "ära paigalda %s uusimat versiooni" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "jäta alles %s hoolimata halvemast arhitektuurist" #~ msgid "install %s despite the inferior architecture" #~ msgstr "paigaldage %s vaatamata madalamale arhitektuurile" #~ msgid "keep obsolete %s" #~ msgstr "jäta aegunud %s alles" #~ msgid "install %s from excluded repository" #~ msgstr "paigaldage %s välistatud hoidlast" #~ msgid "downgrade of %s to %s" #~ msgstr "tagasiviimine %s tasemele %s" #~ msgid "architecture change of %s to %s" #~ msgstr "arhitektuuri muutus %s teisele %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "paigalda %s (koos tarnija vahetusega)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "%s vahetamine %s vastu" #~ msgid "deinstallation of %s" #~ msgstr "%s eemaldamine" #~ msgid "Can't open lock file: %s" #~ msgstr "Ei saa avada lukustusfaili: %s" #~ msgid "Hal Exception" #~ msgstr "Hal erand" #~ msgid "HalContext not connected" #~ msgstr "HalContext pole ühendatud" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive pole initsialiseeritud" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume pole initsialiseeritud" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "Ainult minu loodud ühenduse korral" #~ msgid "Not a CDROM drive" #~ msgstr "Pole CDROM-seade" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Avaliku võtme %s eemaldamine nurjus: %s" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "paigaldamata" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "%s - %s ei saa avada\n" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia ja Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Tundmatu nimekirja säte" libzypp-17.36.5/po/fa.po000066400000000000000000004035101476576476200147650ustar00rootroot00000000000000# Mohammad Rezaei Seresht , 2014. # hayyan , 2016. msgid "" msgstr "" "Project-Id-Version: opensuse-i 18n\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2023-03-03 15:14+0000\n" "Last-Translator: Mohammad Rezaei Seresht \n" "Language-Team: Persian \n" "Language: fa\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: Weblate 4.9.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "کشور ناشناخته: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "بدون کد" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "آندورا" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "امارات متحده ی عربی" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "افغانستان" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "آنتیگوا و باربودا" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "آنگویلا" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "آلبانی" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "ارمنستان" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "آنتیل هلند" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "آنگولا" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "قاره قطب جنوب" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "آرژانتین" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "ساموآ" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "اتریش" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "استرالیا" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "اروبا" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "جزایر آلند" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "آذربایجان" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "بوسنی و هرزگوین" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "باربادوس" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "بنگلادش" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "بلژیک" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "بورکینا فاسو" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "بلغارستان" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "بحرین" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "بروندی" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "بنین" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "برمودا" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "برونئی دارالسلام" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "بولیوی" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "برزیل" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "باهاماس" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "بوتان" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "جزیره بووت" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "بوتسوانا" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "بلاروس" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "بلیز" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "کانادا" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "جزایر کوکوس (کیلینگ)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "کونگو" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "جمهوجمهوری آفریقای مرکزی" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "سوئیس" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "ساحل عاج" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "جزایر کوک" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "شیلی" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "کامرون" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "چین" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "کلمبیا" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "کاستاریکا" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "کوبا" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "کیپ ورد" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "جزیره ی کریسمس" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "قبرس" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "جمهوری چک" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "آلمان" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "جیبوتی" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "دانمارک" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "دومینیکا" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "جمهوری دومینیکن" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "الجزایر" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "اکوادر" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "استونی" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "مصر" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "صحرای غربی" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "اریتره" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "اسپانیا" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "اتیوپی" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "فنلاند" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "فیجی" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "جزایر فالکلند (مالویناس)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "ایالات فدرال میکرونزی" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "جزایر فارو" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "فرانسه" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "شهری فرانسه" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "گابن" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "انگلستان" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "گرانادا" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "گرجستان" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "گویان فرانسه" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "گرنزی" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "غنا" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "جبل الطارق" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "گرینلند" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "گامبیا" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "گینه" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "جزیره گوادلوپ" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "گینه استوایی" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "یونان" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "جورجیای جنوبی و جزایر ساندویچ جنوبی" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "گواتمالا" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "گوام" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "گینه بیسائو" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "گویان" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "هنگ کنگ" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "جزیره هرد و جزایر مک دونالد" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "هندوراس" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "کرواسی" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "هائیتی" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "مجارستان" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "اندونزی" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "ایرلند" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "اسرائیل" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "جزیره ی من" #: zypp/CountryCode.cc:261 msgid "India" msgstr "هند" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "قلمرو بریتانیا در اقیانوس هند" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "عراق" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "ایران" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "ایسلند" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "ایتالیا" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "جرسی" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "جامائیکا" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "اردن" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "ژاپن" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "کنیا" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "قرقیزستان" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "کلمبیا" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "کیریباتی" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "کومور" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "سنت کیتس و نویس" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "کره ی شمالی" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "کره ی جنوبی" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "کویت" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "جزایر کیمن" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "قزاقستان" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "جمهوری دموکراتیک خلق لائوس" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "لبنان" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "سنت لوسیا" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "لیختن اشتاین" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "سریلانکا" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "لیبریا" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "لسوتو" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "لیتوانی" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "لوکزامبورگ" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "لتونی" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "لیبی" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "مراکش" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "موناکو" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "مولدووا" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "مونته نگرو" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "سنت مارتین" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "ماداگاسکار" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "جزایر مارشال" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "مقدونیه" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "مالی" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "میانمار" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "مغولستان" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "ماکائو" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "جزایر ماریانای شمالی" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "مارتینیک" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "موریتانی" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "مونتسرات" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "مالت" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "موریس" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "مالدیو" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "مالاوی" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "مکزیک" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "مالزی" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "موزامبیک" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "نامیبیا" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "کالدونیای جدید" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "نیجر" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "جزیره نورفولک" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "نیجریه" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "نیکاراگوئه" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "هلند" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "نروژ" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "نپال" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "نائورو" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "نیوئه" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "نیوزیلند" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "عمان" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "پاناما" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "پرو" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "پلینزی فرانسه" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "پاپوآ گینه نو" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "فیلیپین" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "پاکستان" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "لهستان" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "سنت پیر و ماژلان" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "پیتکرن" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "پورتوریکو" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "سرزمین فلسطین" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "پرتغال" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "پالائو" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "پاراگوئه" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "قطر" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "رئونیون" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "رومانی" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "صربستان" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "روسیه" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "رواندا" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "عربستان سعودی" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "جزایر سلیمان" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "سیشل" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "سودان" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "سوئد" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "سنگاپور" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "سنت هلن" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "اسلوونی" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "سوالبارد و یان ماین" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "اسلواکی" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "سیرالئون" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "سان مارینو" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "سنگال" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "سومالی" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "سورینام" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "سائوتومه و پرینسیپ" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "السالوادور" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "سوریه" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "سوازیلند" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "جزایر تورکس و کایکوس" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "چاد" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "سرزمین های جنوبی فرانسه" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "توگو" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "تایلند" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "تاجیکستان" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "توکلائو" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "ترکمنستان" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "تونس" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "تونگا" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "شرق تیمور" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "ترکیه" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ترینیداد و توباگو" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "تووالو" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "تایوان" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "تانزانیا" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "اوکراین" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "اوگاندا" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "جزایر کوچک حاشیه های ایالات متحده" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "ایالات متحده" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "اوروگوئه" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "ازبکستان" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "واتیکان" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "سنت وینسنت و گرنادینها" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "ونزوئلا" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "جزایر ویرجین بریتانیا" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "جزایر ویرجین ایالات متحده." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "ویتنام" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "وانواتو" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "والیس و فوتونا" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "ساموآ" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "یمن" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "مایوت" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "آفریقای جنوبی" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "زامبیا" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "زیمباوه" #: zypp/Dep.cc:96 msgid "Provides" msgstr "ارائه میدهد" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "از پیش نیاز دارد" #: zypp/Dep.cc:98 msgid "Requires" msgstr "نیاز دارد" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "مغایر است با" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "منسوخ میکند" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "توصیه میکند" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "پیشنهاد میکند" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "بالا میبرد" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "تکمیل میکند" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "زبان ناشناخته: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "افر" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "آبخازیا" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "آچه ای" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "آشولی" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "دانگمه" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "آدیغی" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "آفریقایی-آسیایی (دیگر)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "آفریهیلی" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "آفریکانس" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "آینو" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "آکانی" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "اکدی" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "آلبانیایی" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "اینوپیات" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "زبان‌های آلگونکویان" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "آلتای جنوبی" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "امهری" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "انگلیسی، قدیمی (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "زبانهای آپاچی" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "عربی" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "آرماییک" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "آراگونی" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "ارمنی" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "آراکانیان" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "آراپاهو" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "ساختگی (دیگر)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "آراواک" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "آسامی" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "آستوری" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "زبانهای آتاباسکی" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "زبانهای استرالیایی" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "آواری" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "اوستایی" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "اودهی" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "آیمارا" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "آذربایجانی" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "باندا" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "زبانهای بامیلیکی" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "باشقیری" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "بلوچی" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "بامبارا" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "بالی" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "باسکی" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "باسا" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "بالتیک (دیگر)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "بژایی" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "بلاروسی" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "بمبایی" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "بنگالی" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "بربر (دیگر)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "بوجپوری" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "بیهاری" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "بیکلی" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "بینی" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "بسلامایی" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "سیکسیکایی" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "بانتو (دیگر)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "بوسنیایی" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "براج" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "برتون" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "باتاک (اندونزی)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "بوریاتی" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "بوگینی" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "بلغاری" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "برمهایی" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "بلینی" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "کادو" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "هندی آمریکای مرکزی (دیگر)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "کاریبی" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "کاتالان" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "قفقازی (دیگر)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "سبویی" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "سلتیکی (دیگر)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "چامورو" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "چیبچا" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "چچن" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "جغتایی" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "چینی" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "چوکیسی" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "ماری" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "شینوک" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "چوکتاو" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "چیپواین" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "چروکی" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "کلیسای اسلاوی" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "چوواشی" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "شاینی" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "زبانهای چامیک" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "قبطی" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "کورنیش" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "کورسی" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "کرئولس و پیجینز، بر پایه ی انگلیسی (دیگر)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "کرئولس و پیجینز، بر پایه ی فرانسوی (دیگر)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "کرئولس و پیجینز، بر پایه ی پرتغالی (دیگر)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "کری" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "کریمه تاتار" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "کرئولس و پیجینز" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "کاشوبی" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "کوشی (دیگر)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "چکی" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "داکوتایی" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "دانمارکى" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "دارگوا" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "دایاک" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "دلاویر" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "برده (آتاباسکی)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "داگریب" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "دینکا" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "دیوهی" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "دوگری" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "دراویدی (دیگر)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "صربی پایین" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "دوآلایی" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "هلندی، میانی (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "هلندی" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "دیولا" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "دزونگخا" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "افیک" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "مصری (باستانی)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "اکاجوک" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "ایلامی" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "انگلیسی" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "انگلیسی، وسطی (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "اسپرانتو" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "استونیایی" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "اوه ای" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "اووندو" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "فانگ" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "فاروئی" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "فانتی" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "فیجی" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "فیلیپینی" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "فنلاندی" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "فینو-اوگریان (دیگر)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "فن" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "فرانسوی" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "فرانسوی، وسطی (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "فرانسوی، قدیمی (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "فریزی" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "فولا" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "فریولی" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "گا" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "گایو" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "بایا" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "ژرمنی (دیگر)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "گرجی" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "آلمانی" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "گیز" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "کیریباتی" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "زبان بومی اسکاتلندی" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "ایرلندی" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "گالیسی" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "مانی" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "آلمانی، میانه ی بالایی (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "آلمانی، قدیمی بالایی (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "گندی" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "گورونتالو" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "گوتیک" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "گربو" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "یونانی، باستانی (تا 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "یونانی، مدرن (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "گوارانی" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "گجراتی" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "جویشن" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "هایدا" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "هائیتی" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "هوسا" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "زبان هاوایی" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "عبری" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "هررو" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "هیلیگاینون" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "هیماچالی" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "هندی" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "هیتی" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "همانگ" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "هیری موتو" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "صربی بالا" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "مجارستانی" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "هاپا" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "ایبان" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "ایگبو" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "ایسلندی" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ایدو" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "سیچوان یی" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ایجو" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "اینوکتیتوت" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "ایلوکو" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "اینترلینگوا" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "هندو (دیگر)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "اندونزیایی" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "هندو-اروپایی (دیگر)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "اینگوش" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "اینوپیاک" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "ایرانی (دیگر)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "زبانهای ایروکویان" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "ایتالیایی" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "جاوه ای" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "لژبان" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "ژاپنی" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "یهودی-فارسی" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "یهودی-عربی" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "کارا-کالپاک" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "قبایلی" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "کاچینی" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "کالالیسوت" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "کامبا" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "کانادا" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "کارن" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "کشمیری" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "کنوری" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "کاوی" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "قزاقی" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "کاباردیان" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "خاصی" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "خویسان (دیگر)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "خمری" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "ختنی" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "کیکویو" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "کینیارواندایی" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "قرقیزی" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "کیمبوندو" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "کونکانی" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "کومی" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "کونگویی" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "کره ای" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "کوسرائی" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "کپله ای" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "قرهچای و بالکار" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "کرو" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "کوروخ" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "کوانیاما" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "قموقی" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "کردی" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "کونته ای" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "لادینو" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "لندا" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "لامبا" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "لائو" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "لاتین" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "لتونی" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "لزگی" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "لیمبورگان" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "لینگالا" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "لیتوانیایی" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "مونگویی" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "لوزی" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "لوکزامبورگی" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "لوبا-لولوا" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "لوبا-کاتانگا" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "گاندایی" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "لوییزنو" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "لوندا" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "لو (کنیا و تانزانیا)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "لوشای" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "مقدونی" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "مادورس" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "ماگهی" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "مارشالی" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "میتهیلی" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "ماکاسار" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "مالایایی" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "ماندینگو" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "آسترونزی (دیگر)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "مراتی" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "ماسایی" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "مالایا" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "موکشا" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "ماندار" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "منده" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "ایرلندی، وسطی (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "مینغکاباو" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "زبانهای متفرقه" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "مونی-خمری (دیگر)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "ماداگاسکاری" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "مالتی" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "مانچو" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "مانیپوری" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "زبانهای مانوبو" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "موهاک" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "مولداویایی" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "مغولی" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "موسی" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "چندین زبانه" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "زبانهای موندا" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "کریکی" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "میراندی" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "مارواری" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "زبانهای مایان" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "ارزیا" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "ناهواتل" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "هندی امریکای شمالی" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "ناپولی" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "ناواهو" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "اندهبله ای، جنوبی" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "اندهبله ای، شمالی" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "اندونگا" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "آلمانی سفلا" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "نپالی" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "نپال بهاسایی" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "نیاس" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "نیجر-کنگویی" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "نیویان" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "نروژی نینورسک" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "نروژی بوکمال" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "نوقایی" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "نورس، قدیمی" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "نروژی" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "شمالی سوتو" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "زبانهای نوبیایی" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "نواری کلاسیک" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "چیچوا" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "نیاموزی" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "نیانکولی" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "نیورو" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "انزیمایی" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "اکسیتان (بعد از 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "اوجیبوا" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "اوریا" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "اورومو" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "اوسیج" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "اوسته ای" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "ترکی، اوتامان (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "زبانهای اوتامیایی" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "پاپوآ (دیگر)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "پانگاسینانی" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "پهلوی" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "پامپانگا" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "پنجابی" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "پاپیامنتو" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "پالائویی" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "فارسی، قدیمی (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "فارسی" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "فیلیپینی (دیگر)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "فنیقی" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "پالی" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "لهستانی" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "پنپه ای" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "پرتغالی" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "زبانهای پراکریت" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "پرووونسال، قدیمی (تا 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "پشتو" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "کچوا" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "راجستانی" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "رپنویی" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "راروتونگا" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "رومی (دیگر)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "ریتو-رومانی" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "کولی" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "رومانیایی" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "روندیایی" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "روسی" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "سنداوی" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "سانگو" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "یاقوتی" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "هندی امریکای شمالی (دیگر)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "زبانهای سالیشان" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "سامری آرامی" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "سانسکریت" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "ساساک" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "سانتالی" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "صربی" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "سیسیلی" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "اسکاتلندی" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "کرواتی" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "سلکوپی" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "سامی (دیگر)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "ایرلندی، قدیمی (تا 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "زبانهای امضایی" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "شان" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "سیدامو" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "سینهالی" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "زبانهای سیوآن" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "چینی-تبتی (دیگر)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "اسلاوی (دیگر)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "اسلواکی" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "اسلونیایی" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "سامی جنوبی" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "سامی شمالی" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "زبانهای سامی (دیگر)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "لوله سامی" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "ایناری سامی" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "ساموایی" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "سامی اسکولت" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "شونا" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "سندی" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "سونینکه" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "سغدی" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "سومالی" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "سونغایی" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "سوتو، جنوبی" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "اسپانیایی" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "ساردنی" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "سرر" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "نیلو-ساهاران (دیگر)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "سواتی" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "سوکوما" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "ساندانس" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "سوسو" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "سومری" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "سواحیلی" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "سوئدی" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "سریانی" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "زبان تاهیتی" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "تای (دیگر)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "تامیل" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "تاتار" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "تلوگو" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "تیمنه ای" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "ترنو" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "تتوم" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "تاجیکی" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "تاگالوگ" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "تایلندی" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "تبتی" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "تیگر" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "تیگرینیا" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "تیو" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "کلینگون" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "تلینگیتی" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "طوارقی" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "تونگا (نیاسا)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "تونگا (جزایر تونگا)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "توک پیسین" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "سیمیشان" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "تسوانا" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "سونگا" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "ترکمن" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "تومبوکایی" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "زبانهای توپیایی" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "ترکی" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "آلتاییک (دیگر)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "توی" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "تووینیایی" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "ادمورت" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "اوگاریتی" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "اویغور" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "اوکراینی" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "آمباندو" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "نا معین" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "اردو" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "ازبکی" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "وای" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "وندا" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "ویتنامی" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "ولاپوک" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "وتیک" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "زبانهای واکاشان" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "والامو" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "وارای" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "وشوو" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "ولز" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "زبانهای سربی" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "والون" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "ولوف" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "کالمیک" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "خوزا" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "یائو" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "یاپیزی" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "ییدیش" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "یوروبا" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "زبانهای یوپیک" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "زاپوتکی" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "زناگا" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "ژوانگ" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "زند" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "زولو" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "زونی" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "این اعمال انجام خواهند شد:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "ناشناخته" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "پشتیبانی نشده" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "سطح 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "سطح 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "سطح 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "قرارداد اضافی مشتری نیاز است" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "نامعتبر" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "سطح پشتیبانی تعیین نشده است" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "فروشنده پشتیبانی ارائه نمیدهد." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "تعیین مشکل، که به معنای پشتیبانی تخصصی جهت مهیا کردن اطلاعات سازگاری، کمک در " "نصب، پشتیبانی در استفاده، نگهداری در دست اقدام و عیب یابی پایه ای است. " "پشتیبانی سطح 1 برای ترمیم خطاهای نقض محصول در نظر گرفته نشده است." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "انزوای مشکل، که به معنای پشتیبانی تخصصی جهت مشابه سازی مشکلات مشتری، انزوای " "مکان مشکل و مهیا سازی روش حل برای مشکلاتی است که توسط پشتیبانی سطح 1 رفع " "نشده است، طراحی شده است." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "روش حل مشکل، که به معنای پشتیبانی تخصصی طراحی شده جهت حل مشکلات پیچیده به " "وسیله ی جذب مهندسی در حل نقص های محصول که توسط پشتیبانی سطح 2 شناسایی شده " "است." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "یک قرارداد اضافی مشتری برای دریافت پشتیبانی نیاز است." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "اختیار پشتیبانی ناشناخته. تعاریف در دسترس نیستند" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "مدیریت سیستم توسط نرم افزار با pid %d (%s) قفل شده است.\n" "این نرم افزار را قبل از تلاش مجدد ببندید." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "حالت تطابق ناشناخته '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "حالت تطابق ناشناخته '%s' برای الگوی '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "عبارت عادی نامعتبر '%s': regcompبازگرداند %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "عبارت عادی نامعتبر '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "احراز هویت برای '%s' مورد نیاز است" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "دوباره تلاش خواهد کرد..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "تسلیم شدن پس از %1% تلاش." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "برای بررسی اینکه آیا ثبت نام شما معتبر است و منقضی نشده است، به مرکز مشتریان " "SUSE مراجعه کنید." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "مرکز مشتریان Novell را برای بررسی اینکه ثبت نام شما معتبر است و منقضی نشده " "است را مشاهده کنید." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "ساخت نقطه ی اتصال: نمیتوان یک فهرست قابل نوشتن را برای ساخت نقطه ی اتصال یافت" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "لطفا ابتدا بسته ی 'lsof' را نصب کنید." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "نمیتوان فهرست کش شبه داده را ساخت." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "خطا در تلاش برای خواندن از '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "نمیتوان %s را ساخت" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "ناموفق در کش مخزن (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "در حال ساخت کش مخزن '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "نمیتوان کش را در %s ساخت - دسترسی نوشتن نیست." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "نوع مخزن کنترل نشده" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "در حال اضافه کردن مخزن '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "نام پرونده ی مخزن نامعتبر در '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "نمیتوان پرونده ی '%s' را برای نوشتن باز کرد." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "خطای ناشناس در خواندن از '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "نمیتوان فهرست مخزن '%1%' را خواند: دسترسی غیرمجاز است" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "ناموفق در خواندن مسیر '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "نمیتوان پرونده ی مخزن '%1%' را خواند: دسترسی غیرمجاز است" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "در حال حذف مخزن '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "نمیتوان کشف کرد که مخزن در کجا ذخیره شده است." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "'%s' را نمیتوان حذف کرد" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "نمیتوان کشف کرد سرویس در کجا ذخیره شده است." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "سرویس ناشناخته '%1%': در حال حذف مخزن سرویس جدا افتاده '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "نام مستعار مخزن نمیتواند با نقطه شروع شود." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "نام مستعار سرویس نمیتواند با نقطه شروع شود." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "مخزن %1% URL های اضافی 'gpgkey=' را تعریف نمی کند." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "در جستجوی شناسه کلید gpg %1% در مخزن %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "در جستجوی کلید gpg %1% در کش %2% ." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "صفت '%s' مفقود است." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "یک یا جفت صفتهای '%s' یا '%s' نیاز است." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "تایید امضا ناموفق بود" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "بسته ی %s ظاهرا در هنگام انتقال خراب شده است. آیا میخواهید دریافت را مجددا " "امتحان کنید؟" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "در مهیا کردن بسته ی %s ناموفق بود. آیا میخواهید دریافت را مجددا امتحان کنید؟" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "بررسی applydeltarpm ناموفق بود." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm ناموفق بود." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "افزونه ی سرویس از تغییر صفت پشتیبانی نمیکند." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "نمیتوان پرونده ی '%s' از مخزن '%s' را مهیا کرد" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "هیچ آدرسی در مخزن نیست." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "محیط مورد انتظار %1%/%2% شناسایی شده توسط فایل \"%3%\" با محتوا:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "پرونده ی %1%\n" " از بسته ی \n" " %2%\n" " متداخل است با پرونده ای از بسته ی\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "پرونده ی %1%\n" " از بسته ی\n" " %2%\n" " متداخل است با پرونده ای از نصب\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "پرونده ی %1%\n" " از نصب\n" " %2%\n" " متداخل است با پرونده ای از بسته ی\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "پرونده ی %1%\n" " از نصب\n" " %2%\n" " متداخل است با پرونده ای از نصب\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "پرونده ی %1%\n" " از بسته ی\n" " %2%\n" " متداخل است با پرونده ی\n" " %3%\n" " از بسته ی\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "پرونده ی %1%\n" " از بسته ی\n" " %2%\n" " متداخل است با پرونده ی\n" " %3%\n" "از نصب\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "پرونده ی %1%\n" " از نصب\n" " %2%\n" " متداخل است با پرونده ی\n" " %3%\n" " از بسته ی\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "پرونده ی %1%\n" " از نصب\n" " %2%\n" " متداخل است با پرونده ی\n" " %3%\n" " از نصب\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "نمیتوان sat-pool را ساخت." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "شکستن %s با نادیده گرفتن برخی از وابستگیها" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "نادیده گرفته برخی وابستگیها به صورت عمومی" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "%1% نصب شده متعلق به مخزن disupgrade نیست و باید جایگزین شود" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "%1% که قرار است نصب شود به یک مخزن ارتقاء تعلق ندارد" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "%1% نصب شده دارای معماری ضعیفی است" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "%1% که قرار است نصب شود، معماری پایین‌تری دارد" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "مشکل با %1% نصب شده" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "درخواستهای متداخل" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "برخی مشکلات وابستگی" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "هیچ چیز \"% 1%\" درخواستی را ارائه نمی دهد" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "آیا تمام مخازن مورد نیاز را فعال کرده اید؟" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "بسته درخواستی %1% وجود ندارد" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "درخواست پشتیبانی نشده" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "\"%1%\" توسط سیستم ارائه شده است و قابل پاک کردن نیست" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% قابل نصب نیست" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "هیچ چیز «% 1%» مورد نیاز %2% نصب شده را فراهم نمی کند" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "هیچ چیز «% 1%» مورد نیاز برای نصب %2% را فراهم نمی کند" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "نمی تواند %1% و %2% را نصب کند" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "%1% نصب شده با \"%2%\" ارائه شده توسط %3% نصب شده در تضاد است" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "%1% نصب شده با \"%2%\" ارائه شده توسط %3% نصب شده در تضاد است" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "%1% برای نصب با \"%2%\" ارائه شده توسط %3% نصب شده در تضاد است" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "مورد نصب %1% با \"% 2%\" ارائه شده توسط \"%3%\" برای نصب در تضاد است" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "%1% نصب شده، \"%2%\" ارائه شده توسط %3% نصب شده منسوخ شده است" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "%1% نصب شده، \"%2%\" ارائه شده توسط %3% نصب شده منسوخ شده است" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "%1% نصب شده، \"%2%\" ارائه شده توسط %3% نصب شده منسوخ شده است" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "مورد نصب %1% منسوخ شده '%2%' ارائه شده توسط 3% برای نصب" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "%1% نصب شده با \"%2%\" ارائه شده توسط خودش در تضاد است" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "%1% که باید نصب شود با \"%2%\" ارائه شده توسط خودش تضاد دارد" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "%1% که باید نصب شود با \"%2%\" ارائه شده توسط خودش تضاد دارد" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "برای نصب %1% به \"%2%\" نیاز دارد، اما این نیاز قابل ارائه نیست" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "ارائه دهنده های حذف شده: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "ارائه دهندگان غیر قابل نصب: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "ارائه دهندگان غیر قابل نصب: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% هنوز به طور کامل در %2 ادغام نشده است." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "معمولاً می‌خواهید PTF را نگه دارید و وصله‌های نگهداری را نصب نکنید." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "حذف %1% نصب شده در این زمینه، بسته‌های PTF موجود را نیز حذف می‌کند (نه " "جایگزین!)." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF باید با فراخوانی '%1%' حذف شود. این کار بسته‌های PTF ارائه شده را به‌جای " "حذف آن‌ها به‌روزرسانی می‌کند." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "معمولاً می‌خواهید PTF را نگه دارید یا کنش را لغو کنید." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "%1% نصب شده عمل مورد نظر را مسدود می کند." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "معمولاً می‌خواهید PTF را نگه دارید و کنش را لغو کنید." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "حذف قفل برای اجازه حذف %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "%1% را نصب نکن" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "نگه داشتن %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "حذف قفل برای اجازه نصب %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "این درخواست سیستم شما را خواهد شکست!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "نادیده گرفتن هشدار سیستم شکسته شده" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "درخواستی برای نصب یک قابل حل ارائه 1% نپرسید" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "درخواست حذف همه قابل حل‌های ارائه‌دهنده %1% نکنید" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "آخرین نسخه %1% را نصب نکنید" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "%1% را با وجود معماری پایین نگه دارید" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "با وجود معماری ضعیف، %1% را نصب کنید" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "منسوخ نگه داشتن %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "%1% را از مخزن حذف شده نصب کنید" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "%1% را نصب کنید اگرچه پس گرفته شده است" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "اجازه نصب PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "%1% را نصب کنید اگرچه در لیست سیاه قرار دارد" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "کاهش %1% به %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "تغییر معماری %1% به %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "نصب %1% (با تغییر vendor)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "نصب %1% از vendor %2%\n" " جایگزینی %3% از vendor %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "جایگزینی %1% با %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "حذف نصب %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "نصب انصراف داده شد و یا جهتدار شد." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " اجرا شده" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " اجرا ناموفق بود" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s در حال حاظر اجرا شده به عنوان %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " اجرا در هنگام انصراف پرش شد" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "خطا در ارسال اعلام پیغام بروزرسانی." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "پیغام بروزرسانی جدید" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "اجرای تراکنش به دلیل مشکلات زیر انجام نشد:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM شکست خورد: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "ناموفق در وارد کردن کلید عمومی از پرونده ی %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "ناموفق در حذف کلید عمومی %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "سرصفحه بسته امضا نشده است!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "محموله بسته امضا نشده است!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "پرونده های پیکربندی تغییر کرده برای %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm ذخیره شد %s به عنوان %s، اما تعیین اختلاف امکانپذیر نبود" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ذخیره شد %s به عنوان %s\n" "اینها 25 خط اولیه ی اختلاف ها هستند:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm ساخته شد %s به عنوان %s، اما تعیین اختلاف امکانپذیر نبود" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ساخته شد %s به عنوان %s\n" "اینها 25 خط اولیه ی اختلاف ها هستند:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "خروجی rpm اضافی" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "پشتیبان ساخته شد %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "امضا خوب است" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "نوع امضا ناشناخته است" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "امضا قابل تایید نیست" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "امضا خوب است، اما کلید اعتمادسازی نشده است" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "کلید عمومی امضاها موجود نیست" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "پرونده موجود نیست و یا امضاها قابل بررسی نیستند" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "فایل تایید نشده" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "منقضی نمیشود" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "منقضی شده: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "تاریخ انقضا: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(منقضی نمیشود)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(منقضی شده است)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(در 24 ساعت منقضی میشود)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(در %d روز منقضی می شود)" msgstr[1] "(در %d روز دیگر منقضی می شود)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "برای وارد کردن کلید ناموجود %s در دسته کلید %s تلاش شد" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "ناموفق در وارد کردن کلید." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "در حذف کلید ناموفق بود." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "پرونده ی امضای %s یافت نشد" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "مورد مشکوک '%s' برای %u بایت checksum '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "نمیتوان pty (%s) را باز کرد." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "نمیتوان pipe (%s) را باز کرد." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "رشته ی پرس و جوی آدرس LDAP نامعتبر" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "پارامتر پرس و جوی آدرس LDAP نامعتبر '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "ناتوان در همزاد سازی آدرس شیء" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "مرجع شیء آدرس خالی نامعتبر" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "ناتوان در تجزیه ی اجزاء آدرس" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "تاریخچه:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "شکل آدرس یک %s را مجاز نمیکند" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "%s نامعتبر جزء %s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "جزء %s نامعتبر" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "تجزیه ی پرس و جوی رشته برای این آدرس پشتیبانی نمیشود" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "شکل آدرس یک جزء درخواستی است" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "شکل آدرس نامعتبر '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "شکل آدرس، نام کاربری را مجاز نمیکند" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "شکل آدرس، رمز عبور را مجاز نمیکند" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "شکل آدرس یک جزء میزبان را میخواهد" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "شکل آدرس یک جزء میزبان را اجازه نمیدهد" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "مؤلفه میزبان نامعتبر «%s»" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "شکل آدس یک درگاه را مجاز نمیکند" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "جزء درگاه نامعتبر '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "شکل آدرس یک نام مسیر را میخواهد" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "مسیر نسبی در صورت وجود مرجع مجاز نیست" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "رشته ی رمزی حاوی بایت NUL است" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "پارامتر کاراکتر جداکننده ی تقسیمگر آرایه نامعتبر" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "پارامتر کاراکتر جداکننده ی تقسیمگر نقشه نامعتبر" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "پارامتر کاراکتر جداکننده ی پیوند آرایه نامعتبر" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "دستور با وضعیت %d خارج شد." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "دستور با سیگنال %d (%s) کشته شد." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "دستور با خطای ناشناخته خارج شد." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "آرگومان های ارسال نامعتبر ارائه شده است." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "ایجاد لوله کنترل امکان پذیر نیست." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "نمیتوان chroot کرد به '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "نمیتوان chdir کرد به '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "نمیتوان chdir کرد به '%s' درون chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "'%s' (%s) را نمیتوان اجرا کرد." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "نمیتوان fork کرد (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "نمی‌توان «%s» را اجرا کرد، chdir ناموفق بود (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "نمی‌توان «%s» را اجرا کرد، chroot ناموفق بود (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "نمی‌توان «%s» را اجرا کرد، exec ناموفق بود (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "نمی‌توان «%s» را اجرا کرد، خطای غیرمنتظره." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "ناموفق در سوار کردن %s بر روی %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "ناموفق در پیاده سازی %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "نام پرونده ی بد: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "رسانه در هنگام تلاش برای انجام عمل '%s' باز نشده است." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "پرونده ی '%s' در رسانه ی '%s' یافت نشد" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "نمیتوان پرونده ی '%s' را نوشت." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "رسانه متصل نشده است" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "نقطه ی اتصال رسانه ی بد" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "مقداردهی دریافت (curl9) برای '%s' ناموفق بود" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "استثناء سیستم '%s' برای رسانه ی '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "مسیر '%s' در رسانه ی '%s' یک پرونده نیست." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "مسیر '%s' در رسانه ی '%s' یک فهرست نیست." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "ادرس بدشکل" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "نام میزبان خالی در آدرس" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "فایل سیستم خالی در آدرس" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "مسیر خالی در آدرس" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "شکل آدرس پشتیبانی نشده در '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "عملیات توسط رسانه پشتیبانی نشده است" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "خطای دریافت (curl) برای '%s':\n" "کد خطا: %s \n" "متن خطا: %s \n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "خطایی در هنگام تنظیم اختیارات دریافت (curl) برای '%s' رخ داد:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "منبع رسانه ی '%s' حاوی رسانه ی مطلوب نیست" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "رسانه ی '%s' توسط یک مورد دیگر در حال استفاده است" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "نمیتوان هیچ رسانه ای را خارج کرد" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "نمیتوان رسانه ی '%s' را خارج کرد" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "اجازه برای دسترسی به '%s' داده نشد." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "مهلت زمانی در هنگام دسترسی به '%s' پایان یافت." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "داده های دانلود شده از اندازه فایل مورد انتظار '%s' از '%s' فراتر رفته است." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "مکان '%s' به صورت موقتی غیر قابل دسترسی است." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " ایراد گواهی SSL، لطفا بررسی کنید که گواهی CA برای '%s' درست است." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "هیچ منبع رایگانی برای پیوست کردن رسانه موجود نیست." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "حالت احراز هویت پشتیبانی نشده '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "خطای دانلود (curl) برای '%s':\n" "کد خطا: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "خطای دانلود (curl) برای '%s':\n" "پاسخ HTTP قابل بازیابی نیست\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "" #: zypp-tui/Table.cc:32 msgid "No" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "شبه داده ی معتبر در آدرس تعیین شده یافت نشد" #~ msgstr[1] "شبه داده ی معتبر در آدرس های تعیین شده یافت نشد" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "در حال اجرای %%اسکریپت posttrans \"% 1%\"" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "اجرای %posttrans scripts" #~ msgid "Package is not signed!" #~ msgstr "بسته مورد تایید نیست!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s مربوط به یک مخزن distupgrade نیست" #~ msgid "%s has inferior architecture" #~ msgstr "%s دارای معماری نامرغوب است" #~ msgid "problem with installed package %s" #~ msgstr "ایراد در بسته ی نصب شده ی %s" #~ msgid "nothing provides requested %s" #~ msgstr "هیچ چیز %s درخواستی را مهیا نمیکند" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "آیا شما تمامی مخازن درخواستی را فعال کرده اید؟" #~ msgid "package %s does not exist" #~ msgstr "بسته ی %s وجود ندارد" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s توسط سیستم مهیا شده است و نمیتواند حذف شود" #~ msgid "%s is not installable" #~ msgstr "%s قابل نصب نیست" #~ msgid "nothing provides %s needed by %s" #~ msgstr "هیچ چیز %s که توسط %s مورد نیاز است را مهیا نمیکند" #~ msgid "cannot install both %s and %s" #~ msgstr "نمیتوان هردو %s و %s را نصب کرد" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s با %s که توسط %s مهیا شده است متداخل است" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s منسوخ میکند %s را که توسط %s مهیا شده است" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s نصب شده منسوخ میکند %s را که توسط %s مهیا شده است" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "حل شونده ی %s با %s مهیا شده توسط خودش متداخل است" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s میخواهد %s را، اما این نیازمندی قابل مهیا شدن نیست" #~ msgid "remove lock to allow removal of %s" #~ msgstr "قفل را جهت حذف %s پاک کنید" #~ msgid "do not install %s" #~ msgstr "%s را نصب نکن" #~ msgid "keep %s" #~ msgstr "%s را نگه دار" #~ msgid "remove lock to allow installation of %s" #~ msgstr "قفل را جهت نصب %s حذف کن" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "درباره ی نصب یک حل شونده که %s را ارائه میدهد سوال نکن" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "درباره ی حذف تمامی حل شونده ها که %s را ارائه میدهند سوال نکن" #~ msgid "do not install most recent version of %s" #~ msgstr "نسخه های جدیدتر %s را نصب نکن" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "نگهداری %s با وجود اینکه معماری نامرغوب دارد" #~ msgid "install %s despite the inferior architecture" #~ msgstr "نصب %s با وجود اینکه معماری نامرغوب دارد" #~ msgid "keep obsolete %s" #~ msgstr "نگهداری %s منسوخ شده" #~ msgid "install %s from excluded repository" #~ msgstr "نصب %s از مخزن مستثنی" #~ msgid "downgrade of %s to %s" #~ msgstr "تنزل درجه ی %s به %s" #~ msgid "architecture change of %s to %s" #~ msgstr "تغییر معماری %s به %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "نصب %s (با تغییر فروشنده) \n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "جایگزینی %s با %s" #~ msgid "deinstallation of %s" #~ msgstr "از نصب خارج کردن %s" #~ msgid "Can't open lock file: %s" #~ msgstr "نمیتوان فایل قفل را باز کرد: %s" #~ msgid "This action is being run by another program already." #~ msgstr "این عمل در حال حاظر در حال اجرا توسط یک نرم افزار دیگر است." #~ msgid "Hal Exception" #~ msgstr "استثنای Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "عذخواهی میکنیم، اما این نسخه ی libzypp بدون پشتیبانی از HAL ساخته شده است." #~ msgid "HalContext not connected" #~ msgstr "HalContext متصل نشده است" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive مقداردهی اولیه نشده است" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume مقداردهی نشده است" #~ msgid "Unable to create dbus connection" #~ msgstr "ناتوان در ساخت ارتباط dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: نمیتوان متن libhal را ساخت" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: نمیتوان ارتباط dbus را تنظیم کرد" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "ناتوان در مقداردهی به متن HAL -- آیا hald اجرا نمیشود؟" #~ msgid "Not a CDROM drive" #~ msgstr "درایو CDROM نیست" #~ msgid "Can't initialize mutex attributes" #~ msgstr "نمیتوان صفات mutex را مقدار دهی اولیه کرد" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "نمیتوان صفت mutex بازگشتی را قرار داد" #~ msgid "Can't initialize recursive mutex" #~ msgstr "نمیتوان mutex بازگشتی را مقداردهی اولیه کرد" #~ msgid "Can't acquire the mutex lock" #~ msgstr "نمیتوان قفل mutex را دریافت کرد" #~ msgid "Can't release the mutex lock" #~ msgstr "نمیتوان قفل mutex را آزاد کرد" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "ناموفق در وارد کردن کلید عمومی از پرونده ی %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "ناموفق در حذف کلید عمومی %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "نمیتوان دستگاه حلقه را برای سوار کردن پرونده ی ایمیج از '%s' پیدا کرد" libzypp-17.36.5/po/fi.po000066400000000000000000003702071476576476200150030ustar00rootroot00000000000000# translation of zypp.fi.po to suomi # translation of zypp.po to # translation of zypp.fi.po to # Copyright (C) 2005 SUSE Linux Products GmbH. # Finnish message file for YaST2 (@memory@). # Copyright (C) 2003 SuSE Linux AG. # # Michael Hintsala , 2003. 2001. # Ilkka Pirskanen , 2006, 2007. # Jyri Palokangas , 2006, 2007. # Jyri Palokangas , 2007. # Sami Vento , 2007, 2009, 2010. # Jyri Palokangas , 2008, 2009. # Mikko Piippo , 2008. # Jyri Palokangas , 2008, 2010, 2011, 2013, 2014. # Harri Miettinen , 2010, 2011, 2013, 2014. # Katariina Kemppainen , 2010, 2011, 2012. msgid "" msgstr "" "Project-Id-Version: zypp.fi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-12-01 09:48+0000\n" "Last-Translator: Tommi Nieminen \n" "Language-Team: Finnish \n" "Language: fi\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: Weblate 5.8.4\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Tuntematon maa: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Ei koodia" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Arabiemiirikunnat" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua ja Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Alankomaiden Antillit" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktis" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentiina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikan Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Itävalta" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" # CU #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # FO #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Ahvenanmaa" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaidzhan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia ja Hertsegovina" # BB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" # BD #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgia" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" # BH #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasilia" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahama" # BH #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" # FO #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvetinsaari" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" # BY #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Valko-Venäjä" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kookossaaret" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Keski-Afrikan tasavalta" # CH #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Sveitsi" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Norsunluurannikko" # FO #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookinsaaret" # CL #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" # CN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kiina" # CO #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kap Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Joulusaari" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Kypros" # CZ #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tšekki" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Saksa" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Tanska" # DM #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" # DO #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikaaninen tasavalta" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algeria" # EC #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" # EE #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Viro" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypti" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Länsi-Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Espanja" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Suomi" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandinsaaret" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikronesia" # FO #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Färsaaret" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Ranska" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Ranskan suurkaupungit" # GH #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Iso-Britannia" # GD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" # GE #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Ranskan Guayana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" # GL #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grönlanti" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" # GU #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Päiväntasaajan Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Kreikka" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Etelä-Georgia ja Eteläiset Sandwichsaaret" # GT #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" # GU #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" # GH #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard ja McDonaldinsaaret" # HN #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" # HR #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" # HU #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Unkari" # ID #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" # IE #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanti" # IL #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Mansaari" # IN #: zypp/CountryCode.cc:261 msgid "India" msgstr "Intia" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Brittiläinen Intian valtameren alue" # IQ #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" # IS #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islanti" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" # JM #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaika" # JO #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordania" # JP #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japani" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" # KZ #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgisia" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodzha" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komorit" # KN #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts ja Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Pohjois-Korea" # ZA #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Etelä-Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" # FO #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Caymansaaret" # KZ #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" # LT #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Liettua" # LU #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburg" # LV #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvia" # LR #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libya" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" # FO #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshallinsaaret" # MK #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonia" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" # MO #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Pohjois-Mariaanit" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" # MT #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" # MV #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Malediivit" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" # MX #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksiko" # MY #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malesia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mosambik" # GM #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Uusi-Kaledonia" # NG #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" # FO #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolkinsaari" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" # NI #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" # NL #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Alankomaat" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norja" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" # NZ #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Uusi-Seelanti" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" # PA #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" # PE #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Ranskan Polynesia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua-Uusi-Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filippiinit" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" # PL #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Puola" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre ja Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestiina" # PT #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugali" # PW #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" # PY #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" # QA #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" # RO #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Venäjä" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi-Arabia" # FO #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salomonsaaret" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychellit" # SD #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Ruotsi" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Saint Helena" # SI #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Huippuvuoret ja Jan Mayen" # SK #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" # SY #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé ja Príncipe" # SV #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" # SY #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syyria" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swazimaa" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- ja Caicossaaret" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tshad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Ranskan eteläiset alueet" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" # TH #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thaimaa" # TJ #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadzhikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "tokelau" # TJ #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" # TN #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Itä-Timor" # TR #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkki" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad ja Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "tuvalu" # TW #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tansania" # UA #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Yhdysvaltain pienet erillissaaret" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Yhdysvallat" # UY #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Pyhä istuin (Vatikaani)" # VC #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent ja Grenadiinit" # VE #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # VI #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Brittiläiset Neitsytsaaret" # VI #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Yhdysvaltain Neitsytsaaret" # VN #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis ja Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" # ZA #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Etelä-Afrikka" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Sambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Tarjoaa" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Edellytykset" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Vaatii" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Ristiriidat" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Vanhentuneet" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Suosittelee" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Ehdottaa" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Parannukset" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Täydentää" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Tuntematon kieli: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "abhaasi" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "aceh" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "afroaasialaiset (muut)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "akkadi" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "albania" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "aleutti" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "algonkin-kielet" # ZA #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "altai, etelä-" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "amhara" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "englanti, muinais- (noin 450 - 1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "apaššikielet" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "arabia" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "aramea" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "aragonia" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "armenia" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "araukaani" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "keinotekoiset (muut)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "assami" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "asturia" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "athabasca-kielet" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "australialaiset kielet" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "avaari" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "avesta" # SZ #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "awadhi" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "azeri" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "bamileke-kielet" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "baškiiri" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "belutši" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "bali" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "baski" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "balttilaiset (muut)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "valkovenäjä" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "bemba" # BZ #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "berberikielet (muut)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "bhojpuri" # BH #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "bikol" # IN #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "mustajalka" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "bantukielet (muut)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "bosnia" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "bretoni" # ID #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "batak" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "burjaatti" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "bugi" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "bulgaria" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "burma" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Keski-Amerikan intiaanikielet (muut)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "karibi" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "katalaani" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "kaukasialaiset (muut)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "kelttiläiset (muut)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "chamorro" # CN #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "tšetšeeni" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "tšagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "kiina" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "chuuk" # ML #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "chinook jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "kirkkoslaavi" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "tšuvassi" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "cham-kielet" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "kopti" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "korni" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "korsika" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "kreolit ja pidginit, englantiin perustuvat (muut)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "kreolit ja pidginit, ranskaan perustuvat (muut)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "kreolit ja pidginit, portugaliin perustuvat (muut)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "krimintataari" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "kreolit ja pidginit (muut)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "kašubi" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "kuušilaiset (muut)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "tšekki" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "tanska" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "dargva" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "slave" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "dravidakielet (muut)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "alasorbi" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "hollanti, keski- (noin 1050 - 1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "hollanti" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "muinaisegypti" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "elam" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "englanti" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "englanti, keski- (1100 - 1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "viro" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "fääri" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "fidži" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "filippiini" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "suomi" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "suomalais-ugrilaiset (muut)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "ranska" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "ranska, keski- (noin 1400 - 1600 )" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "ranska, muinais- (842 - 1400)" # FR #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "friisi" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "fulani" # FR #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "friuli" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "gã" # GH #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "germaaniset (muut)" # GE #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "georgia" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "saksa" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "ge'ez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "kiribati" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "gaeli" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "iiri" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "galicia" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "saksa, keskiylä- (noin 1050 - 1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "saksa, muinaisylä- (noin 750 - 1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "gootti" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "kreikka, muinais- (ennen 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "kreikka (jälkeen 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "haiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "havaiji" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "heprea" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "himachali" # IN #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "heetti" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "hiri-motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "yläsorbi" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "unkari" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "hupa" # IR #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "islanti" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ido" # LT #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "sichuanin-yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "interlingua" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "indoarjalaiset (muut)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "indonesia" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "indoeurooppalaiset (muut)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "inguuši" # IN #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "iñupiak" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "iranilaiset (muut)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "irokeesikielet" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "italia" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "jaava" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "japani" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "juutalaispersia" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "juutalaisarabia" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "karakalpakki" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "kabyyli" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "kamba" # CA #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "kavi" # KZ #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "kazakki" # MR #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "kabardi" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "khoisan-kielet (muut)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "khotani" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "kikuju" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "ruanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "kirgiisi" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "korea" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "kosrae" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "karatšai-balkaari" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "kru-kielet" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "kurukh" # PA #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "kwanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "kumykki" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "kurdi" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "latina" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "latvia" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "lezgi" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "limburg" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "liettua" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "lozi" # LU #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "luxemburg" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "luba (Lulua)" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "luba (Katanga)" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "luiseño" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "luo (Kenia ja Tansania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "makedonia" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "madura" # MU #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "marshall" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "makassar" # MY #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "mandingo" # ML #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "austronesialaiset (muut)" # MU #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "marathi" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "maasai" # MT #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "malaiji" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "mokša" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "iiri, keski- (900 - 1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "micmac" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "luokittelemattomat kielet" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "mon-khmer-kielet (muut)" # MY #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "malagassi" # MV #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "malta" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "mantšu" # ML #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "manobo-kielet" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "moldavia" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "mongoli" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "monia kieliä" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "mundakielet" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "creek" # MV #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "mirandi" # MU #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "maya-kielet" # SY #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "ersä" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "nahuatl" # ZA #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Pohjois-Amerikan intiaanikielet" # ML #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "napoli" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "ndebele, etelä-" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "ndebele, pohjois-" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "alasaksa" # ML #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "newari" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "nigeriläis-kongolaiset (Muut)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "niue" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "norja (uusnorja)" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "norja (kirjanorja)" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "norja, muinais-" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "norja" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "sotho, pohjois-" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "nubialaiset kielet" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "klassinen newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "nyanja" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "oksitaani" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "ojibwa" # SY #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "osseetti" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "osmani" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "otomi-kielet" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "papualaiset (muut)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "pangasinan" # ML #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "pahlavi" # PY #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "pampanga" # PA #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "papiamentu" # PW #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "palau" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "persia, muinais- (noin 600 - 400 eKr.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "farsi" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "filippiiniläiset (muut)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "foinikia" # ML #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "paali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "puola" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "pohnpei" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "portugali" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "prakrit-kielet" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "provensaali, muinais- (ennen 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "pašto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "quechua" # KZ #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "rajasthani" # JP #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "rarotonga" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "romaaniset (muut)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "retoromaani" # RO #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "romania" # IN #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "venäjä" # SD #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "sandawe" # SD #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "jakuutti" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Etelä-Amerikan intiaanikielet (muut)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "sališilaiset kielet" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "samarianaramea" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "serbia" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "sisilia" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "skotti" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "kroatia" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "selkuppi" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "seemiläiset kielet (muut)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "iiri, muinais- (ennen 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "viittomakielet" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "sinhali" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "sioux-kielet" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "sinotiibetiläiset (muut)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "slaavilaiset (muut)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "slovakki" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "sloveeni" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "saame, etelä-" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "saame, pohjois-" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "saamelaiskielet (muut)" # ES #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "saame, luulajan-" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "saame, inarin-" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "saame, koltan-" # SI #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "sogdi" # SO #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "sotho, etelä-" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "espanja" # MR #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "sardi" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "niililäis-saharalaiset (muut)" # ES #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "swazi" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "sukuma" # SD #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "sunda" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "sumeri" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "ruotsi" # SY #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "syyria" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "tahiti" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "thaikielet (muut)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "tamil" # QA #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "tataari" # BE #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "temne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "tetum" # TJ #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "tadžikki" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "thai" # TW #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "tiibet" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "tigre" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "tonga (Malawi)" # FO #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "tonga (Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "tok-pisin" # FR #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "tsimshian" # TW #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "tswana" # EE #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "tsonga" # TR #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "turkmeeni" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "tupi-kielet" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "turkki" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "altailaiset (muut)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "twi" # TN #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "tuva" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "udmurtti" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "ugarit" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "uiguuri" # UA #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "ukraina" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "määrittämätön" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "uzbekki" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "vietnam" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "vatja" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "wakash-kielet" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "kymri" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "sorbin kielet" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "valloni" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "kalmukki" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "yap" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "jiddiš" # CU #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "joruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "jupikkikielet" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "sapoteekki" # BZ #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Tehdään seuraavat toiminnot:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "tuntematon" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "ei tuettu" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "1. Taso" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "2. Taso" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "3. Taso" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Erillinen asiakassopimus tarpeen" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Lopetettu tai toisen paketin korvaama" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "virheellinen" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Tuen tasoa ei ole määritetty" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Myyjä ei tarjoa tukea." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Ongelman määrittäminen, mikä tarkoittaa teknistä tukea, joka tarjoaa " "yhteensopivuustietoja, asennustukea, käyttötukea, huoltoa ja perustason " "ongelmanratkaisua. 1. tason tukea ei ole tarkoitettu korjaamaan tuotteen " "puutteista johtuvia virheitä." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Ongelman eristäminen, mikä tarkoittaa teknistä tukea, joka tähtää asiakkaan " "ongelmien toistamiseen, ongelma-alueen eristämiseen ja tarjoaa ratkaisuja " "ongelmille, joita 1. tason tuki ei ratkaissut." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Ongelman ratkaiseminen, mikä tarkoittaa monimutkaisten ongelmien " "ratkaisemiseen tarkoitettua teknistä tukea. Insinöörit korjaavat tuotteen " "vikoja, jotka 2. tason tuki on tunnistanut." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Tuen saamiseksi edellytetään erillinen asiakassopimus." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Paketin kehitys on lopetettu tai se on korvattu eri nimisellä paketilla." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Tuntematon tukivaihtoehto. Kuvausta ei ole saatavilla" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Prosessi %d (%s) on lukinnut järjestelmänhallinnan. \n" "Sulje ohjelma ennen uutta yritystä." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Tuntematon tila \"%s\"" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Tuntematon tila \"%s\" hakulauseelle \"%s\"" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Virhe säännöllisessä lausekkeessa \"%s\": regcomp palautti %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Virhe säännöllisessä lausekkeessa \"%s\"" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "\"%s\" vaatii tunnistautumisen" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Yritetään uudelleen…" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Luovutetaan %1% yrityksen jälkeen." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Tarkista SUSEn asiakaskeskuksessa käymällä, onko rekisteröitymisesi voimassa." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Vieraile Novellin asiakaskeskuksessa tarkastamassa onko rekisteröintisi " "voimassa ja ettei se ole vanhentunut." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Luo liitospiste: Kirjoitettavissa olevaa kansiota ei löydy liitospisteen " "luomiseksi" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Asenna 'lsof' paketti ensiksi." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Metatiedon välimuistihakemistoa ei voi luoda." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Virhe luettaessa \"%s\"" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Ei voi luoda %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Uuden asennuslähteen metatiedon noutaminen epäonnistui." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "Asennuslähteen luku välimuistiin epäonnistui (repo2solvia ei voi käynnistää)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Virhe asennuslähteen puskuroinnissa (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Rakennetaan asennuslähteen \"%s\" välimuistia" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Välimuistia %s ei voida luoda - ei kirjoitusoikeuksia." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Asennuslähteen %1% luku välimuistiin epäonnistui" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Virheellinen asennuslähteen tyyppi" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Lisätään asennuslähdettä \"%s\"" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Virheellinen asennuslähteen tiedostonimi \"%s\"" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Tiedostoa \"%s\" ei voida avata kirjoitusta varten." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Tuntematon virhe luettaessa \"%s\"" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "repo hakemiston lukeminen ei onnistu '%1%': Pääsy estetty" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Hakemiston \"%s\" lukeminen ei onnistu" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "repo-tiedostoa '%1%' ei voitu lukea: Pääsy estetty" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Poistetaan metadata" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Poistetaan paketteja" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Tyhjennetään väliaikaishakemistot" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Siivotaan hakemistoa: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Siivotaan välimuistia" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Ladataan välimuistista" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Poistetaan asennuslähdettä \"%s\"" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Asennuslähteen sijaintia ei voida päätellä." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "\"%s\" poistaminen ei onnistu" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Muutetaan asennuslähdettä" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Virkistetään asennuslähdettä: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Palvelun sijaintia ei voida päätellä." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Tuntematon palvelu '%1%': Poistetaan orpo palvelulähde '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Asennuslähteen alias ei voi alkaa pisteellä." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Palvelun alias ei voi alkaa pisteellä." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Ei tiivistelmää tiedostolle %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Tuntematon tiivistelmä %s tiedostolle %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Tiivistelmän tarkistus epäonnistui tiedostolle ”%s”" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Tiedostoa ”%s” ei ole allekirjoitettu, jatketaanko?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" "Tiedostoa ”%s” asennuslähteestä ”%s” ei ole allekirjoitettu, jatketaanko?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" "Haluatko hylätä avaimen, luottaa siihen väliaikaisesti vai luottaa siihen " "aina?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Avaimen nimi: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "Vastaanotettiin %1% uusi pakkausten allekirjoitusavain asennuslähteestä " "”%2%”:" msgstr[1] "" "Vastaanotettiin %1% uutta pakkausten allekirjoitusavainta asennuslähteestä " "”%2%”:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Allekirjoituksen tarkistus epäonnistui tiedostolle ”%1%”." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Allekirjoituksen tarkistus epäonnistui asennuslähteen ”%2%” tiedostolle " "”%1%”." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Jatketaanko?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Tiedosto ”%s” on allekirjoitettu tuntemattomalla avaimella ”%s”. Jatketaanko?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Tiedosto ”%s” asennuslähteestä ”%s” on allekirjoitettu tuntemattomalla " "avaimella ”%s”. Jatketaanko?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Asennuslähde %1% ei ole asettanut ”gpgkey=”-lisäverkko-osoitteita." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Etsitään GPG-avainta %1% asennuslähteestä %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Etsitään GPG-avainta %1% välimuistista %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Vaadittu ominaisuus \"%s\" puuttuu." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Tarvitaan joko %s tai %s -attribuutti." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Allekirjoituksen todennus epäonnistui" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "Paketti %s näyttää vioittuneen siirron aikana. Yritetäänkö uudelleen?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Virhe noudettaessa pakettia %s. Yritetäänkö uudelleen?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm-tarkistus epäonnistui." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm epäonnistui." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Ei käyttöoikeutta kirjoittaa asennuslähteen välimuistiin." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Palvelu-lisäosa ei tue ominaisuuksien muutosta." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Tiedoston \"%s\" nouto asennuslähteestä \"%s\" ei onnistu" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Asennuslähteen verkko-osoite puuttuu." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Odotettiin tiedoston ”%3%” mukaista tietovälinettä %1%/%2% sisältönään:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Tiedosto %1%\n" " paketista\n" " %2%\n" " on ristiriidassa tiedoston kanssa joka kuuluu pakettiin\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Tiedosto %1%\n" " paketista\n" " %2%\n" " on ristiriidassa tiedoston kanssa joka kuuluu asennukseen\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Tiedosto %1%\n" " asennuksesta\n" " %2%\n" " on ristiriidassa tiedoston kanssa joka kuuluu pakettiin\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Tiedosto %1%\n" " asennuksesta\n" " %2%\n" " on ristiriidassa tiedoston asennuksesta\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Tiedosto %1%\n" " paketista\n" " %2%\n" " on ristriidassa tiedoston\n" " %3%\n" " paketista\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Tiedosto %1%\n" " paketista\n" " %2%\n" " on ristiriidassa tiedoston\n" " %3%\n" " asennettavasta paketista\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Tiedosto %1%\n" " asennuksesta\n" " %2%\n" " on ristiriidassa tiedoston\n" " %3%\n" " paketista\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Tiedosto %1%\n" " asennuksesta\n" " %2%\n" " on ristiriidassa tiedoston\n" " %3%\n" " asennuksesta\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Sat-varaston luonti ei onnistu." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "jätä %s riippuvuuksia huomioimatta" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "jätä joitakin riippuvuuksia huomiotta" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "asennettu %1% ei kuulu jakelupäivityslähteeseen ja on korvattava" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "asennettava %1% ei kuulu jakelupäivityslähteeseen" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "asennetulla paketilla %1% on heikompi arkkitehtuuri" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "asennettavalla paketilla %1% on heikompi arkkitehtuuri" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "ongelma asennetussa paketissa %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "ristiriitaiset kyselyt" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "jokin riippuvuusongelma" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "mikään ei tarjoa pyydettyä pakettia ”%1%”" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Onko kaikki vaaditut asennuslähteet otettu käyttöön?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "pyydettyä pakettia %1% ei ole olemassa" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "pyyntöä ei tueta" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "paketin ”%1%” tarjoaa järjestelmä eikä sitä voi poistaa" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% ei ole asennettavissa" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "asennetun paketin %2% vaatimaa pakettia \"%1%” ei tarjoa mikään lähde" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" "asennettavan paketin %2% vaatimaa pakettia ”%1%” ei tarjoa mikään lähde" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "ei voida asentaa sekä %1% että %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "asennettu %1% on ristiriidassa asennetun paketin %3% tarjoaman paketin ”%2%” " "kanssa" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "asennettu paketti %1% on ristiriidassa asennettavan paketin %3% tarjoaman " "paketin ”%2%” kanssa" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "asennettava paketti %1% on ristiriidassa asennetun paketin %3% tarjoaman " "paketin ”%2%” kanssa" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "asennettava paketti %1% on ristiriidassa toisen asennettavan paketin %3% " "tarjoaman paketin ”%2%” kanssa" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "asennettu paketti %1% vanhentaa toisen asennetun paketin %3% tarjoaman " "paketin ”%2%”" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "asennettu paketti %1% vanhentaa asennettavan paketin %3% tarjoaman paketin " "”%2%”" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "asennettava paketti %1% vanhentaa asennetun paketin %3% tarjoaman paketin " "”%2%”" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "asennettava paketti %1% vanhentaa toisen asennettavan paketin %3% tarjoaman " "paketin ”%2%”" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" "asennettu paketti %1% on ristiriidassa itse tarjoamansa paketin ”%2“ kanssa" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "asennettava paketti %1% on ristiriidassa itsensä tarjoaman paketin ”%2%” " "kanssa" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "asennettu paketti %1% vaatii paketin ”%2%” mutta vaatimusta ei voi täyttää" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "asennettava paketti %1% vaatii paketin ”%2%” mutta vaatimusta ei voi täyttää" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "poistetut tarjoajat: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "Poistettavissa olevat tarjoajat: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "poistetut tarjoajat: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% ei vielä ole täysin integroitu paikkaukseen %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Tavallisesti haluat säilyttää PTF:n ja olla asentamatta ylläpitopaikkauksia." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "%1%-asennuksen poisto tässä kontekstissa poistaa (ei korvaa!) myös " "sisällytetyt PTF-paketit." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF tulisi poistaa komennolla ”%1%”. Niiden poistamisen sijaan tämä " "päivittää sisällytetyt PTF-paketit ." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Tavallisesti halunnet säilyttää PTF:n tai perua toimenpiteen." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Asennettu %1% estää halutun toimenpiteen." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Tavallisesti haluat säilyttää PTF:n ja perua toimenpiteen." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "avaa lukitus paketin %1% poistamiseksi" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "älä asenna pakettia %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "pidä %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "avaa lukitus paketin %1% asentamiseksi" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Tämä pyyntö rikkoo järjestelmän!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ohita varoitus rikkinäisestä järjestelmästä" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "älä kysy, asennetaanko paketin %1% tarjoavaa ratkaisua" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "älä kysy, poistetaanko paketin %1% tarjoavia ratkaisuja" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "älä asenna paketin %1% uusinta versiota" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "pidä %1% heikommasta arkkitehtuurista huolimatta" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "asenna %1% heikommasta arkkitehtuurista huolimatta" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "pidä vanhentunut %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "asenna %1% pois suljetusta asennuslähteestä" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "asenna %1%, vaikka se on vedetty takaisin" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "salli asentaa PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "asenna %1%, vaikka se on mustalistattu" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "päivitä alaspäin %1% -> %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "arkkitehtuurin muutos %1% -> %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "asenna %1% (tarjoaja muuttuu)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "asenna toimittajalta %2% %1%,\n" "joka korvaa paketin %3% toimittajalta %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "korvataan %1% -> %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "poistetaan asennus: %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Suoritetaan toimenpiteen jälkeisiä skriptejä" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Suoritetaan skriptiä %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Skriptin %1% tuloste:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Asennus keskeytettiin." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " suoritettu" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " suoritus epäonnistui" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s on jo suoritettu nimellä %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " suoritus ohitettiin keskeytettäessä" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Virhe lähetettäessä päivityshuomautusta." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Uusi päivitysviesti" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Vastaanotettiin signaali ”%1% (%2%)”: järjestelmän eheyden varmistamiseksi " "käynnissä olevaa RPM-toimenpidettä ei voi perua." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Toimenpidettä ei voitu suorittaa seuraavien ongelmien takia:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM-virhe: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Avaimen tuonti tiedostosta %1% epäonnistui" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Julkisen avaimen %1% poisto epäonnistui" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Paketin otsaketta ei ole allekirjoitettu!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Paketin sisältöä ei ole allekirjoitettu!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Muunnettiin paketin %s asetustiedostoja:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm tallensi tiedoston %s nimellä %s. Erojen selvittäminen ei onnistunut" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm tallensi tiedoston %s nimellä %s.\n" "Tässä ensimmäiset 25 muuttunutta riviä:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm loi tiedoston %s nimellä %s, erojen selvittäminen ei onnistunut" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm loi tiedoston %s nimellä %s.\n" "Tässä on ensimmäiset 25 vaihtunutta riviä:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "rpm-lisätuloste" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "luotiin varmuuskopio %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Allekirjoitus kelpaa" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tuntematon allekirjoituksen tyyppi" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Allekirjoitusta ei voida todentaa" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Allekirjoitus kelpaa, mutta avain ei ole luotettu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Allekirjoituksen julkinen avain ei ole saatavilla" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Tiedostoa ei ole tai allekirjoitusta ei voi tarkistaa" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Tiedosto on allekirjoittamaton" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "ei vanhene" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "vanhentunut: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "vanhenee: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(ei vanhene)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(VANHENTUNUT)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(vanhenee 24 tunnin kuluessa)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(vanhenee %d päivässä)" msgstr[1] "(vanhenee %d päivässä)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" "Yritettiin lisätä avain %s avainrenkaaseen %s, mutta tiedostoa ei löydetty" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Avaimen tuonti epäonnistui." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Avaimen poisto epäonnistui." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Allekirjoitustiedostoa %s ei löydetty" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Virheellinen tyyppi \"%s\" tavulle %u, tarkistussumma: \"%s\"" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "pty:n (%s) avaaminen ei onnistu." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Putken (%s) avaaminen ei onnistu." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Virheellinen LDAP URL -kysely" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Virheellinen LDAP URL -parametri: \"%s\"" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Verkko-osoite-objektin kahdentaminen ei onnistunut" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Virheellinen viittaus tyhjään URL-objektiin" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Verkko-osoitteen jäsentäminen ei onnistu" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historia:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Ei sallittu verkko-osoite: %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Virheellinen %s-komponentti \"%s\"" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Virheellinen %s-komponentti" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Tämän verkko-osoitteen jäsentäminen kyselyksi ei ole tuettu" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Verkko-osoite on pakollinen" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Virheellinen verkko-osoite: \"%s\"" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Verkko-osoite ei salli käyttäjänimeä" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Verkko-osoite ei salli salasanaa" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Verkko-osoite edellyttää konenimen" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Verkko-osoite ei salli konenimeä" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Virheellinen konenimi: \"%s\"" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Verkko-osoite ei salli portin määritystä" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Virheellinen porttimääritys: \"%s\"" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Verkko-osoite edellyttää polun määrittämistä" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" "Suhteellisen polun määrittäminen ei ole sallittua, jos valtuuttaja on " "määritetty" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Koodattu merkkijono sisältää NUL-tavun" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Virheellinen parametritaulukon jaon erotin" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Virheellinen parametrikartan jaon erotin" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Virheellinen parametritaulukon liitoksen erotin" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Komento päättyi tilaan %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Komento lopetettiin signaalilla %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Komento päättyi tuntemattomaan virheeseen." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Annettu virheellisiä spawn-parametreja." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Hallintaputkea ei voitu luoda." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Hakemistorajoitus (chroot) ei onnistu hakemistoon \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Kansion vaihto ”chdir %s” ei onnistu (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "chdir '%s' ei onnistu chroot '%s' sisällä (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "\"%s\" (%s) suorittaminen ei onnistu." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Haarauttaminen (fork) ei onnistu (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Ei voida suorittaa ”%s”: chdir epäonnistui (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Ei voida suorittaa ”%s”: chroot epäonnistui (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Ei voida suorittaa ”%s”: exec epäonnistui (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Ei voida suorittaa ”%s”: tuntematon syy." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "%s liittäminen liitospisteeseen %s epäonnistui" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Virhe irrotettaessa %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Virheellinen tiedostonimi: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Tietolähdettä ei avattu suoritettaessa \"%s\"." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Tiedostoa \"%s\" ei löydy tietovälineeltä \"%s\"" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Tiedostoon \"%s\" kirjoittaminen ei onnistu." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Tietolähdettä ei ole liitetty" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Virheellinen liitospiste" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Lataajan (curl) alustus osoitteelle \"%s\" epäonnistui" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Järjestelmäpoikkeus \"%s\" tietovälineellä \"%s\"." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Polku \"%s\" tietovälineellä \"%s\" ei ole tiedosto." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Polku \"%s\" tietovälineellä \"%s\" ei ole hakemisto." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Virheellisesti muotoiltu URI-osoite" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Tyhjä konenimi URI-osoitteessa" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Tyhjä tiedostojärjestelmä URI-osoitteessa" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Tyhjä kohde URI-osoitteessa" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Virheellinen verkko-osoite: \"%s\"." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Tietoväline ei tue toimintoa" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Latausvirhe (curl) %s:\n" "Virhekoodi: %s\n" "viesti: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Virhe määritettäessä kohteen '%s' latausasetuksia (curl):" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "\"%s\" ei sisällä haluttua tietolähdettä" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Tietolähde \"%s\" on varattu" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Tietovälineiden irrottaminen ei onnistu" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Tietovälineen \"%s\" irrottaminen ei onnistu" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Pääsy evätty kohteeseen \"%s\"." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Aikakatkaisu avattaessa \"%s\"." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Ladattu tieto ylittää odotetun tiedostokoon ”%s”/”%s”." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "\"%s\" ei ole hetkellisesti saatavilla." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL-ongelma: Tarkista että CA-varmenne kuuluu \"%s\"." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Ei vapaita resursseja tietovälineen liittämiseksi." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "HTTP-tunnistautumistapa \"%s\" ei ole tuettu" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Latausvirhe (curl) kohteelle ”%s”:\n" "Virhekoodi: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Latausvirhe (curl) kohteelle ”%s”:\n" "HTTP-vastausta ei saatu\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Kyllä" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ei" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Huomaa:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Varoitus:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Virhe:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "valmis" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "huomio" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "virhe" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Varoitus: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Ladataan:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "käynnistetään" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "ei löytynyt" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Tälle toiminnolle ei ole ohjetta." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "Tälle valinnalle ei ole ohjetta" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "näyttää kaikki valinnat" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "kyllä" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ei" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Annetusta verkko-osoitteesta ei löytynyt kelvollista metatietoa" #~ msgstr[1] "Annetuista verkko-osoitteista ei löytynyt kelvollista metatietoa" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Suoritetaan %%posttrans-skriptiä ”%1%”" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Suoritetaan %posttrans-skriptejä" #~ msgid "Package is not signed!" #~ msgstr "Pakettia ei ole allekirjoitettu!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s ei kuulu jakeluversion päivitysasennuslähteeseen" #~ msgid "%s has inferior architecture" #~ msgstr "%s on alempaa arkkitehtuuria" #~ msgid "problem with installed package %s" #~ msgstr "virhe asennettaessa pakettia %s" #~ msgid "nothing provides requested %s" #~ msgstr "Mikään ei tarjoa pyydettyä %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Oletko ottanut käyttöön kaikki pyydetyt asennuslähteet?" #~ msgid "package %s does not exist" #~ msgstr "pakettia %s ei ole olemassa" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s on järjestelmän tarjoama ja sitä ei voi poistaa" #~ msgid "%s is not installable" #~ msgstr "%s ei ole asennettavissa" #~ msgid "nothing provides %s needed by %s" #~ msgstr "mikään ei tarjoa %s, jota %s tarvitsee" #~ msgid "cannot install both %s and %s" #~ msgstr "Ei voida asentaa molempia %s ja %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s on ristiriidassa %s (%s) kanssa" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s vanhentaa %s (%s)" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "asennettu %s vanhentaa %s (%s)" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s on ristiriidassa itsensä kanssa (%s)" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s tarvitsee %s, mutta sen asentaminen ei onnistu" #~ msgid "remove lock to allow removal of %s" #~ msgstr "poista lukitus salliaksesi %s poiston" #~ msgid "do not install %s" #~ msgstr "älä asenna %s" #~ msgid "keep %s" #~ msgstr "pidä %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "poista lukitus asentaaksesi: %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "älä kysy asennettaessa paketteja, jotka tuo %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "älä kysy poistettaessa paketteja, jotka tuo %s" #~ msgid "do not install most recent version of %s" #~ msgstr "älä asenna uusinta %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "Pidä %s vaikka se on alempaa arkkitehtuuria" #~ msgid "install %s despite the inferior architecture" #~ msgstr "asenna %s vaikka se on alempaa arkkitehtuuria" #~ msgid "keep obsolete %s" #~ msgstr "pidä vanhentunut %s" #~ msgid "install %s from excluded repository" #~ msgstr "Asennetaan %s poisjätetystä asennuslähteestä" #~ msgid "downgrade of %s to %s" #~ msgstr "päivitetään vanhempaan %s -> %s" #~ msgid "architecture change of %s to %s" #~ msgstr "arkkitehtuurin vaihto %s -> %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "asenna %s (vaihtaa tarjoajaa)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "Korvataan %s -> %s" #~ msgid "deinstallation of %s" #~ msgstr "poista %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Lukitustiedoston avaaminen ei onnistu: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Jokin toinen ohjelma suorittaa tätä toimintoa." #~ msgid "Hal Exception" #~ msgstr "Hal-poikkeus" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Tämä versio libzypp-kirjastosta on käännetty ilman HAL-tukea." #~ msgid "HalContext not connected" #~ msgstr "Hal-yhteyden muodostus ei onnistunut" #~ msgid "HalDrive not initialized" #~ msgstr "Hal-asemaa ei ole alustettu" #~ msgid "HalVolume not initialized" #~ msgstr "Hal-taltioa ei alustettu" #~ msgid "Unable to create dbus connection" #~ msgstr "dbus-yhteyden luonti epäonnistui" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: libhal-yhteyttä ei voitu luoda" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: dbus-yhteyden asettaminen ei onnistu" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "HAL-yhteyden alustus ei onnistu. Varmista, että \"hald\" on käynnissä." #~ msgid "Not a CDROM drive" #~ msgstr "Kohde ei ole CD-asema" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Mutex-määritteiden alustaminen ei onnistu" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Rekursiivisten mutex-määritteiden asetus ei onnistu" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Rekursiivisten mutex-määritteiden alustaminen ei onnistu" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Mutex-lukitus ei onnistu" #~ msgid "Can't release the mutex lock" #~ msgstr "Mutex-lukituksen vapauttaminen ei onnistu" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Avaimen tuonti tiedostosta %s epäonnistui: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Julkisen avaimen %s poisto epäonnistui: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Levykuvatiedoston \"%s\" liitämiseen tarvittavaa loop-laitetta ei löydy" #~ msgid "do not keep %s installed" #~ msgstr "älä pidä %s asennettuna" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Julkisen avaimen %s tuonti avainrenkaasta %s tiedostoon %s ei onnistu" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Lataajan (Metalink curl) alustus osoitteelle \"%s\" epäonnistui" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Latausvirhe (metalink curl) %s:\n" #~ "Virhekoodi: %s\n" #~ "Viesti: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Lataus keskeytyi %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Käyttäjä keskeytti latauksen" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Virhe asetettaessa lataajan (metalink curl) valintoja osoitteelle \"%s\"." #~ msgid "Failed to download %s from %s" #~ msgstr "Virhe ladattaessa %s osoitteesta %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia ja Montenegro" libzypp-17.36.5/po/fr.po000066400000000000000000004400651476576476200150140ustar00rootroot00000000000000# translation of zypp.fr.po to # French message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002, 2003 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # # # # Patricia Vaz , 2003. # Francoise Lermen , 2000, 2001, 2002. # Karine Nguyen , 2001. # Guillaume GARDET , 2008, 2009, 2010. # Rémy Marquis , 2008. # Rémy Marquis , 2008. # Guillaume GARDET , 2011, 2013, 2014, 2015. # Antoine Belvire , 2015. # msgid "" msgstr "" "Project-Id-Version: zypp.fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-12-04 09:48+0000\n" "Last-Translator: Guillaume GARDET \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.8.4\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Pays inconnu : " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Pas de code" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorre" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Émirats arabes unis" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua-et-Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanie" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Arménie" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antilles néerlandaises" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarctique" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentine" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa américaines" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Autriche" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australie" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Îles Åland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaïdjan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnie-Herzégovine" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbade" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgique" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgarie" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahreïn" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Bénin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudes" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivie" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brésil" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhoutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Île Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Biélorussie" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Îles Cocos (Keeling)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "République centrafricaine" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Suisse" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Cote d'Ivoire" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Îles Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chili" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Cameroun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Chine" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombie" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cap Vert" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Île Christmas" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Chypre" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "République Tchèque" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Allemagne" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danemark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominique" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "République Dominicaine" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algérie" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Équateur" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonie" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Égypte" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sahara Occidental" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Erythrée" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Espagne" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Éthiopie" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlande" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Îles Malouines (Falkland)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "États fédérés de Micronésie" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Îles Féroé" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "France" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "France métropolitaine" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Royaume-Uni" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenade" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Géorgie" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guyane française" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernesey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambie" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinée" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinée équatoriale" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grèce" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Géorgie du Sud et Îles Sandwich" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinée Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong-Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Îles Heard et Mcdonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croatie" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haïti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hongrie" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonésie" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlande" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israël" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Île de Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Inde" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Territoire britannique de l'océan Indien" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islande" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italie" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaïque" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordanie" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japon" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirghizistan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodge" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comores" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint-Kitts-et-Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Corée du Nord" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Corée du sud" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Koweït" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Îles Caïmans" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "République démocratique populaire du Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Liban" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Sainte-Lucie" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituanie" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Lettonie" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libye" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroc" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavie" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Monténégro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint-Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Îles Marshall" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macédoine" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Birmanie" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolie" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Îles Marianne du nord" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritanie" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malte" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Île Maurice" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldives" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexique" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaisie" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibie" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nouvelle Calédonie" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Île Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Pays-Bas" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norvège" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Népal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauruan" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nouvelle Zélande" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Pérou" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polynésie française" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papouasie Nouvelle Guinée" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Philippines" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Pologne" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre-et-Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Porto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Territoire palestinien" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palaos" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Roumanie" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbie" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Fédération de Russie" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arabie Saoudite" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Îles Salomon" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Soudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suède" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapour" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sainte-Hélène" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovénie" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard-et-an Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovaquie" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "Saint-Marin" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Sénégal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalie" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tomé-et-Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syrie" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Îles Turks-et-Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tchad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Terres australes et antarctiques françaises" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thaïlande" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkménistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisie" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor oriental" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turquie" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinité-et-Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzanie" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraine" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Ouganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Petites Îles Situées Près Des États-Unis" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "États-Unis" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Ouzbékistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Saint-Siège (État de la Cité du Vatican)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint-Vincent-et-les Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Îles Vierges britanniques" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Îles Vierges américaines" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Viêt Nam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis et Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yémen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Afrique du Sud" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambie" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Fournit" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Nécessite au préalable" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Nécessite" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Conflits" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Rend obsolète" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recommande" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Suggère" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Améliore" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Complète" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Langue inconnue : " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhaze" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Aceh" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adygué" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-asiatiques (autres langues)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainou" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadien" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanais" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aléute" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Langues algonquines" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altaï du Sud" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharic" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Anglo-saxon (vers 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Langues apaches" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabe" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaïn" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonais" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Arménien" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucan" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Artificielles (autres langues)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamais" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturien" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Langues athapascanes" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Langues australiennes" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avar" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestique" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azéri" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Langues bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bachkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baloutchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinais" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basque" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltiques (autres langues)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Bedja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Biélorusse" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berbères (autres langues)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bichlamar" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Pied-noir" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantoues (autres langues)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosniaque" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Breton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonésie)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Bouriate" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugi" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgare" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birman" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Indiennes d'Amérique centrale (autres langues)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Caribe" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalan" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucasiennes (autres langues)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celtiques (autres langues)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tchétchène" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Djaghatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinois" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukais" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Jargon chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Slavon liturgique" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Tchouvache" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Langues chames" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Copte" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornique" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corse" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Créoles et pidgins anglais (autres)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Créoles et pidgins français (autres)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Créoles et pidgins portugais (autres)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tatar de Crimée" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Créoles et pidgins divers" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kachoube" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Couchitiques (autres langues)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tchèque" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danois" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Esclave (athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Maldivien" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidiennes (autres langues)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Bas-sorabe" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Douala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Néerlandais moyen (vers 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Hollandais" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dioula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Égyptien (ancien)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Élamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Anglais" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Anglais moyen (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Espéranto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonien" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Éwe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Éwondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Féroien" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fidjien" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Philippin" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finnois" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finno-ougriennes (autres langues)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Français" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Français moyen (vers 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Français ancien (842-vers 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frison" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Peul" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Frioulan" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germaniques (autres langues)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Géorgien" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Allemand" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Guèze" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Kiribati" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaélique" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandais" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galicien" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Allemand, moyen haut (vers 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Allemand, ancien haut (vers 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gond" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gothique" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grec ancien (jusqu'à 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grec moderne (après 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Goudjrati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haïtien" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Haoussa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaïen" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hébreu" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittite" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Haut-sorabe" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Hongrois" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandais" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Yi de Sichuan" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Ilocano" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Association pour une langue auxiliaire internationale)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indo-aryennes (autres langues)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonésien" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-europénnnes (autres langues)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingouche" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraniennes (autres langues)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Langues iroquoises" # TLABEL partitioning_2002_01_04_0147__180 #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italien" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanais" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonais" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judéo-persan" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judéo-arabe" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanouri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardien" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (autres langues)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanais" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Rwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghize" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Kom" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coréen" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosrae" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karatchai balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Krou" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Ovambo" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Koumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurde" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Judéo-espagnol" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latin" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letton" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghien" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limbourgeois" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituanien" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxembourgeois" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseño" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya et Tanzanie)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macédonien" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madourais" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshall" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makassar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingue" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Malayo-polynésiennes (autres langues)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathe" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masaï" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malais" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksa" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mendé" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandais moyen (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Micmac" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Langues diverses" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-khmer (autres langues)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgache" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltais" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Mandchou" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Langues Manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldave" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Multilingue" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Langues mounda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Muskogee" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandais" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marvari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Langues maya" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erza" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Langues indiennes d'Amérique du Nord" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitain" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele (Sud)" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele (Nord)" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Allemand, bas" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Népalais" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepalbhasha" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Nigéro-congolaises (autres langues)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuéen" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norvégien nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norvégien bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogaï" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norrois, ancien" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norvégien" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho du Nord" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Langues nubiennes" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari classique" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nkore" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzema" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (après 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwé" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Galla" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossète" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turc ottoman (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Langues otomangues" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papoues (autres langues)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampangan" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Perse, ancien (vers 600-400 av. J.-C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persan" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Philippines (autres langues)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Phénicien" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polonais" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpei" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugais" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prâkrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provençal ancien (jusqu'à 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pachto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotonga" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romanes (autres langues)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Rhéto-roman" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Tsigane" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Roumain" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russe" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Iakoute" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Indiennes d'Amérique du Sud (autres langues)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Langues salish" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritain" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santal" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbe" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilien" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Écossais" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croate" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkoupe" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Sémitiques (autres langues)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandais ancien (jusqu'à 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Langues des signes" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Chan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singhalais" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Langues sioux" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-tibétaines (autres langues)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slaves (autres langues)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovaque" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovène" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sami du Sud" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Sami du Nord" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Sami, autres langues" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Sami de Lule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Sami d'Inari" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoan" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Sami skolt" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdien" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho du Sud" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Espagnol" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sarde" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Sérère" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-sahariennes (autres langues)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Soundanais" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Soussou" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumérien" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Suédois" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syriaque" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitien" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Thaïts (autres langues)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamoul" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Télougou" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Temne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadjik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thaï" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibétain" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrigna" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamacheq" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tongan (îles Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmène" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turc" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaïques (autres langues)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Touva" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Oudmourte" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ougaritique" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Ouïtour" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainien" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Indéterminé" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Ourdou" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Ouszbek" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vaï" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamien" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapït" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Vote" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Langues wakashennes" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Gallois" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Langues sorables" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Wallon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmouk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapois" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Langues yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotèque" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zoulou" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Les actions suivantes seront exécutées :" # TLABEL printer_2002_08_07_0216__54 #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "inconnu" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "non pris en charge" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Niveau 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Niveau 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Niveau 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Contrat client additionnel nécessaire" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Obsolète et remplacé par un autre paquet" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "invalide" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Le niveau du support n'est pas spécifié" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Le fournisseur ne fournit pas de support." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "La détermination d'un problème, ce qui signifie un appui technique visant à " "fournir les informations de compatibilité, l'assistance à l'installation, le " "soutien à l'utilisation, la maintenance et le dépannage de base. Le Support " "de Niveau 1 ne vise pas à corriger les erreurs et défauts du produit." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "L'isolation de problème, ce qui signifie un appui technique visant à " "reproduire les problèmes du client, isoler le problème et fournir une " "résolution pour les problèmes non résolus par le Support de Niveau 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "La résolution de problème, ce qui signifie un appui technique visant à " "résoudre des problèmes complexes en engageant des ingénieurs dans la " "résolution des défauts du produit qui ont été identifiés par le Support de " "Niveau 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Un contrat client additionel est nécessaire pour obtenir du support." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Le paquet est obsolète et a été remplacé par un nouveau paquet portant un " "autre nom." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Option de support inconnue. La description n'est pas disponible" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "La gestion du système est verrouillée par l'application avec le pid %d " "(%s).\n" "Fermez cette application avant de réessayer." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Mode de correspondance '%s' inconnu" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Mode de correspondance '%s' inconnu pour le modèle '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Expression régulière '%s' invalide : regcomp a retourné %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Expression régulière '%s' invalide" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Authentification requise pour '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Une nouvelle tentative va être effectuée..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Abandon après %1% tentatives." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visitez SUSE Customer Center pour vérifier si votre enregistrement est " "valide et n'a pas expiré." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visitez le Novell Customer Center pour vérifier que votre inscription est " "valide et qu'elle n'a pas expiré." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Création d'un point d'attache : Impossible de trouver un répertoire pour " "créer un point d'attache" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Veuillez d'abord installer le paquet 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Impossible de créer le répertoire de cache des métadonnées." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Erreur lors de la tentative de lecture depuis '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Impossible de créer %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" # TLABEL restore_2002_08_07_0216__88 #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Échec de la mise en cache du dépôt (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Construction du cache du dépôt '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Impossible de créer le cache dans %s - pas d'autorisation en écriture." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Type de dépôt non pris en charge" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Ajout du dépôt '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nom du fichier de dépôt non valide sur '%s'" # TLABEL kinternet_2002_02_20_2255__39 #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Impossible d'ouvrir le fichier '%s' en écriture." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Erreur de lecture inconnue depuis '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Impossible de lire le répertoire de dépôt '%1%' : permission refusée" # TLABEL restore_2002_08_07_0216__88 #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Impossible de lire le dossier '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Impossible de lire le fichier de dépôt '%1%' : permission refusée" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Suppression du dépôt '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Impossible de déterminer l'emplacement de stockage du dépôt." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Impossible de supprimer '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Impossible de déterminer l'emplacement de stockage du service." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Service '%1%' inconnu : suppression du dépôt de service orphelin '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "L'alias d'un dépôt ne peut pas commencer par un point." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "L'alias d'un service ne peut pas commencer par un point." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Pas de digest pour le fichier %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Digest %s inconnu pour le fichier %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "La vérification du digest a échoué pour le fichier '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Le fichier '%s' n'est pas signé. Continuer ?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Le fichier '%s' du dépôt '%s' n'est pas signé. Continuer ?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" "Voulez-vous rejeter la clé, l'approuver temporairement ou l'approuver " "toujours ?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nom de la clé : %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "%1% nouvelle clé de signature de paquet reçue du dépôt \"%2%\" :" msgstr[1] "%1% nouvelles clés de signature de paquet reçues du dépôt \"%2%\" :" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "La vérification de la signature a échoué pour le fichier '%1%'." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "La vérification de la signature a échoué pour le fichier '%1%' du dépôt " "'%2%'." # internal key used: Ok #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Continuer ?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Le fichier '%s' est signé avec une clé inconnue '%s'. Continuer ?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Le fichier '%s' du dépôt '%s' est signé avec une clé inconnue '%s'. " "Continuer ?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Le dépôt %1% ne définie pas d'URL 'gpgkey=' additionnelles." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Recherche de la clé gpg %1% dans le dépôt %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Recherche de la clé gpg %1% dans le cache %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "L'attribut requis '%s' est manquant." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Au moins un des attributs '%s' ou '%s' est requis." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Échec de la vérification de la signature" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Le paquet %s semble avoir été corrompu durant le transfert. Souhaitez-vous " "essayer à nouveau de le récupérer ?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Impossible de fournir le paquet %s. Souhaitez-vous essayer à nouveau de le " "récupérer ?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "La vérification d'applydeltarpm a échoué." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm a échoué." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Absence de permission pour écrire le cache du dépôt." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Le plugin de service ne supporte pas la modification d'attribut." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Impossible de fournir '%s' à partir du dépôt '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Pas d'URL dans le dépôt." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Le media attendu %1%/%2% identifié par le fichier '%3%' avec le contenu :" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Le fichier %1%\n" " du paquet\n" " %2%\n" " est en conflit avec le fichier du paquet\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Le fichier %1%\n" " du paquet\n" " %2%\n" " est en conflit avec le fichier de l'installation de\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Le fichier %1%\n" " de l'installation de\n" " %2%\n" " est en conflit avec le fichier du paquet\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Le fichier %1%\n" " de l'installation de\n" " %2%\n" " est en conflit avec le fichier de l'installation de\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Le fichier %1%\n" " du paquet\n" " %2%\n" " est en conflit avec le fichier\n" " %3%\n" " du paquet\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Le fichier %1%\n" " du paquet\n" " %2%\n" " est en conflit avec le fichier\n" " %3%\n" " de l'installation de\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Le fichier %1%\n" " de l'installation de\n" " %2%\n" " est en conflit avec le fichier\n" " %3%\n" " du paquet\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Le fichier %1%\n" " de l'installation de\n" " %2%\n" " est en conflit avec le fichier\n" " %3%\n" " de l'installation de\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Impossible de créer la réserve sat." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "casser %s en ignorant certaines de ses dépendances" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "Ignorer généralement certaines dépendances" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "l'élément %1% installé n'appartient à aucun dépôt de mise à niveau de la " "distribution et doit être remplacé" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" "l'élément %1% à installer n'appartient à aucun dépôt de mise à niveau de la " "distribution" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "l'élément %1% installé présente une architecture inférieure" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "l'élément %1% à installer présente une architecture inférieure" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problème avec l'élément %1% installé" # TLABEL kinternet_2002_02_20_2255__29 #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "requêtes conflictuelles" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "Problèmes de dépendance" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "rien ne fournit le/la '%1%' demandé(e)" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Avez-vous activé tous les dépôts requis ?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "le paquetage demandé %1% n'existe pas" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "Requête non supportée" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' est fourni par le système et ne peut pas être effacé" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% n'est pas installable" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "rien ne fournit '%1%' qui est nécessaire pour l'élément %2% installé" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" "rien ne fournit '%1%' qui est nécessaire pour l'élément %2% à installer" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "impossible d'installer à la fois %1% et %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "l'élément %1% installé est en conflit avec '%2%' fourni par l'élément %3% " "installé" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "l'élément %1% installé est en conflit avec '%2%' fourni par l'élément %3% à " "installer" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "l'élément %1% à installer est en conflit avec '%2%' fourni par l'élément %3% " "installé" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "l'élément %1% à installer est en conflit avec '%2%' fourni par l'élément %3% " "à installer" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "l'élément %1% installé rend obsolète '%2%' fourni par l'élément %3% installé" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "l'élément %1% installé rend obsolète '%2%' fourni par l'élément %3% à " "installer" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "l'élément %1% à installer rend obsolète '%2%' fourni par l'élément %3% " "installé" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "l'élément %1% à installer rend obsolète '%2%' fourni par l'élément %3% à " "installer" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "l'élément %1% installé est en conflit avec '%2%' fourni par lui-même" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "l'élément %1% à installer est en conflit avec '%2%' fourni par lui-même" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "l'élément %1% installé nécessite '%2%', mais cette exigence ne peut pas être " "remplie" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "l'élement %1% à installer nécessite '%2%', mais cette exigence ne peut pas " "être remplie" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "fournisseurs supprimés : " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "fournisseurs non installables : " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "fournisseurs non installables : " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% n'est pas totalement intégré dans %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Généralement, vous voulez conserver le PTF et choisir de ne pas installer " "les correctifs de maintenance." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "La suppression du PTF installé %1% dans ce contexte supprimera (plutôt que " "de remplacer !) les paquets PTF inclus également." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "Le PTF doit être supprimé en appelant '%1%'. Cela mettra à jour les paquets " "PTF inclus plutôt que de les supprimer." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" "Généralement, vous souhaitez conserver le PTF ou choisissez d'annuler " "l'action." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Le %1% installé bloque l'action souhaitée." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" "En général, vous souhaitez conserver les correctifs temporaires du programme " "et choisissez d'annuler l'action." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "supprimer le verrouillage pour permettre la suppression de %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "ne pas installer %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "conserver %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "supprimer le verrouillage pour autoriser l'installation de %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Cette requête va casser votre système !" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorer l'avertissement d'un système cassé" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "ne pas demander d'installer un élément résolvable fournissant %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" "ne pas demander de supprimer tous les éléments résolvables fournissant %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "ne pas installer la dernière version de %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "conserver %1% malgré l'architecture inférieure" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "installer %1% malgré l'architecture inférieure" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "conserver l'élément %1% obsolète" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "installer %1% à partir du dépôt exclu" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "installer %1% bien qu'il ait été retiré" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "autoriser l'installation du PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "installer %1% bien qu'il ait été placé en liste noire" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "rétrogradation de %1% à %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "modification de l'architecture de %1% vers %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "installer %1% (avec le changement de fournisseur)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "installer %1% du fournisseur %2%\n" "en remplaçant %3% du fournisseur %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "remplacement de %1% par %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "désinstallation de %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Exécution des scripts ultérieurs à la transaction" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Exécution du script %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Sortie du script %1% :" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "L'installation a été abandonnée comme demandé." # TLABEL online_update_2002_01_04_0147__113 #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " exécuté" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " échec de l'exécution" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s déjà exécuté en tant que %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " exécution annulée lors de l'abandon" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Erreur lors de l'envoi de la notification de mise à jour par message." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nouveau message de mise à jour" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Signal reçu :\"%1% (%2%)\". Pour garantir la cohérence du système, il n'est " "pas possible d'annuler une transaction rpm en cours d'exécution." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" "L'exécution de la transaction a échoué en raison des problèmes suivants :" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Échec RPM : " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Impossible d'importer la clé publique %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Impossible de supprimer la clé publique %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "L'en-tête du paquet n'est pas signé !" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Le contenu du paquet n'est pas signé !" # TLABEL sw_single_2002_01_04_0147__11 #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Fichiers de configuration modifiés pour %s :" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm a enregistré %s sous le nom de %s, mais il a été impossible de " "déterminer la différence" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm a enregistré %s sous %s.\n" "Voici les 25 premières lignes qui diffèrent :\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "rpm a créé %s sous le nom de %s, mais il a été impossible de déterminer la " "différence" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm a créé %s sous le nom de %s.\n" "Voici les 25 premières lignes qui diffèrent :\n" # TLABEL firewall_2002_03_14_2340__51 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Sortie rpm supplémentaire" # TLABEL backup_2002_03_14_2340__102 #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "sauvegarde %s créée" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "La signature est correcte" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Type de signature inconnu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "La signature n'est pas vérifiée" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "La signature est correcte mais la clé n'est pas certifiée" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "La clé publique des signatures n'est pas disponible" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Le fichier n'existe pas ou la signature ne peut pas être vérifiée" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Le fichier n'est pas signé" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "n'expire pas" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "a expiré le : %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "expire le : %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(n'expire pas)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(EXPIRÉ)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(expire dans les 24h)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(expire dans %d jour)" msgstr[1] "(expire dans %d jours)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Tentative d'importation d'une clé inexistante %s dans le porte-clé %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Impossible d'importer la clé." # TLABEL restore_2002_08_07_0216__88 #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Impossible de supprimer la clé." # TLABEL linuxrc_2002_03_29_0036__117 #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Fichier de signature %s introuvable" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Type '%s' douteux pour %u octet(s) sur la somme de contrôle '%s'" # TLABEL backup_2002_03_14_2340__125 #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Impossible d'ouvrir pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Impossible d'ouvrir le pipe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Chaîne de requête d'URL LDAP non valide" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Paramètre de requête d'URL LDAP '%s' non valide" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Impossible de cloner l'objet d'URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Référence d'objet d'URL vide non valide" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Impossible d'analyser les composants de l'URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historique :" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Le schéma d'URL n'autorise pas de %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Composant '%s' non valide '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Composant %s non valide" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Analyse de la chaîne de requête non prise en charge pour cette URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Le schéma d'URL est un composant requis" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Schéma d'URL '%s' non valide" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Le schéma d'URL n'autorise pas de nom d'utilisateur" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Le schéma d'URL n'autorise pas de mot de passe" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Le schéma d'URL nécessite un composant d'hôte" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Le schéma d'URL n'autorise pas de composant d'hôte" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Composant d'hôte non valide '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Le schéma d'URL n'autorise pas de port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Composant de port non valide '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Le schéma d'URL requiert un nom de chemin" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Chemin relatif non autorisé en présence d'une autorité" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "La chaîne codée contient un octet NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" "Caractère séparateur de division non valide pour l'ensemble de paramètres" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" "Caractère séparateur de division non valide pour le mappage de paramètres" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" "Caractère séparateur de catégorie de jonction non valide pour l'ensemble de " "paramètres" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "La commande s'est terminée avec l'état %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "La commande a été supprimée par le signal %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "La commande s'est terminée à cause d'une erreur inconnue." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Argument spawn fournis non valides." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Impossible de créer un pipe de contrôle." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Impossible d'effectuer une commande chroot vers '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Impossible d'appliquer la commande chdir vers '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" "Impossible d'appliquer la commande chdir à '%s' dans chroot '%s' ('%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Impossible d'exécuter '%s' (%s)." # TLABEL printconf_2002_03_14_2340__110 #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Impossible d'exécuter une commande fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Impossible d'exécuter '%s'. La commande chdir a échoué (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Impossible d'exécuter '%s'. La commande chroot a échoué (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Impossible d'exécuter '%s'. La commande exec a échoué (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Impossible d'exécuter '%s'. Erreur inattendue." # TLABEL restore_2002_08_07_0216__88 #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Impossible de monter %s sur %s" # TLABEL linuxrc_2002_03_29_0036__22 #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Impossible de démonter %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Mauvais nom de fichier : %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Le medium ne s'est pas ouvert lors de l'action '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Fichier '%s' introuvable sur le medium '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Impossible d'écrire dans le fichier '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Le medium n'est pas attaché" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Mauvais point d'attache du support" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Échec de l'initialisation du téléchargement (curl) pour '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Exception système '%s' sur le medium '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Le chemin '%s' sur le medium '%s' n'est pas un fichier." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Le chemin '%s' sur le medium '%s' n'est pas un répertoire." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI malformé" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nom d'hôte vide dans l'URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Système de fichiers vide dans l'URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destination vide dans l'URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Schéma URI non pris en charge dans '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Opération non prise en charge par le medium" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Erreur de téléchargement (curl) pour '%s' :\n" "Code d'erreur : %s\n" "Message d'erreur : %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Une erreur s'est produite lors de la configuration des options de " "téléchargement (curl) pour '%s' :" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "La source de supports '%s' ne contient pas le support désiré" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Le medium '%s' est utilisé par une autre instance" # TLABEL profile-manager_2002_08_07_0216__9 #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Impossible d'éjecter un support" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Impossible d'éjecter le support '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Autorisation d'accès à '%s' refusée." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Temps maximal dépassé lors de l'accès à '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "Les données téléchargées dépassent la taille de fichier attendue '%s' de " "'%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "L'emplacement '%s' est temporairement inaccessible." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Problème de certificat SSL, vérifiez que le certificat CA est OK pour '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Aucune ressource libre disponible pour attacher le support." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Méthode d'authentification HTTP '%s' non prise en charge" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Erreur de téléchargement (curl) pour « %s » :\n" "Code d'erreur : %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Erreur de téléchargement (curl) pour « %s » :\n" "Impossible d'obtenir une réponse HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Oui" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Non" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Note :" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Avertissement :" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Erreur :" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "fait" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "attention" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "erreur" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Avertissement : " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Récupération :" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "Démarrage" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "non trouvé" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Aucune aide disponible pour cette invite." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "Aucune aide disponible pour cette option" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "affiche toutes les options" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "oui" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "non" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Aucune métadonnée valide trouvée à l'URL spécifiée" #~ msgstr[1] "Aucune métadonnée valide trouvée aux URL spécifiées" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Exécution du script %%posttrans « %1% »" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Exécution des scripts %posttrans" #~ msgid "Package is not signed!" #~ msgstr "Le paquet n'est pas signé !" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s n'appartient à aucun dépôt de mise à niveau de la distribution" #~ msgid "%s has inferior architecture" #~ msgstr "%s a une architecture inférieure" #~ msgid "problem with installed package %s" #~ msgstr "problème avec le paquet installé %s" #~ msgid "nothing provides requested %s" #~ msgstr "rien ne fournit %s qui est requis" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Avez-vous activé tous les dépôts requis ?" #~ msgid "package %s does not exist" #~ msgstr "Le paquet %s n'existe pas" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s est fourni par le système et ne peut être supprimé" # TLABEL partitioning_2002_01_04_0147__180 #~ msgid "%s is not installable" #~ msgstr "%s n'est pas installable" #~ msgid "nothing provides %s needed by %s" #~ msgstr "rien ne fournit %s, qui est requis par %s" # TLABEL partitioning_2002_01_04_0147__180 #~ msgid "cannot install both %s and %s" #~ msgstr "impossible d'installer simultanément %s et %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s est en conflit avec %s fourni par %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s rend obsolète %s fourni par %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s installé rend obsolète %s fourni par %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "L'élément %s est en conflit avec %s fourni par lui même" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s requiert %s, mais cette dépendance ne peut pas être fournie" #~ msgid "remove lock to allow removal of %s" #~ msgstr "enlever le verrou pour permettre la suppression de %s" # TLABEL partitioning_2002_01_04_0147__180 #~ msgid "do not install %s" #~ msgstr "ne pas installer %s" #~ msgid "keep %s" #~ msgstr "conserver %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "enlever le verrou pour permettre l'installation de %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "ne pas demander d'installer un élément résoluble fournissant %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "" #~ "ne pas demander de supprimer tous les éléments résolubles fournissant %s" #~ msgid "do not install most recent version of %s" #~ msgstr "ne pas installer une version plus récente de %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "conserver %s en dépit de l'architecture inférieure" #~ msgid "install %s despite the inferior architecture" #~ msgstr "installer %s en dépit de l'architecture inférieure" #~ msgid "keep obsolete %s" #~ msgstr "conserver %s obsolète" #~ msgid "install %s from excluded repository" #~ msgstr "installer %s depuis le dépôt exclu" #~ msgid "downgrade of %s to %s" #~ msgstr "installation d'une version moins récente de %s vers %s" #~ msgid "architecture change of %s to %s" #~ msgstr "changement de l'architecture %s à %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "installer %s (avec changement de fournisseur)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "remplacement de %s par %s" #~ msgid "deinstallation of %s" #~ msgstr "désinstallation de %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Impossible d'ouvrir le fichier verrouillé : %s" #~ msgid "This action is being run by another program already." #~ msgstr "Cette action est actuellement déjà exécutée par un autre programme." #~ msgid "Hal Exception" #~ msgstr "Exception Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Désolé, cette version de libzypp a été construite sans la prise en charge " #~ "HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext non connecté" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive non initialisé" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume non initialisé" # TLABEL linuxrc_2002_03_29_0036__141 #~ msgid "Unable to create dbus connection" #~ msgstr "Impossible de créer la connexion dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new : impossible de créer le contexte libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "libhal_set_dbus_connection : impossible de définir la connexion dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Impossible d'initialiser le contexte HAL -- hald fonctionne-t-il ?" #~ msgid "Not a CDROM drive" #~ msgstr "Pas un lecteur de CD-ROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Impossible d'initialiser les attributs mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Impossible de définir l'attribut mutex récursif" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Impossible d'initialiser l'attribut mutex récursif" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Impossible d'acquérir le verrouillage mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Impossible de libérer le verrouillage mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Impossible d'importer la clé publique du fichier %s : %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Impossible de supprimer la clé publique %s : %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Impossible de trouver un périphérique de boucle pour monter le fichier " #~ "image depuis '%s'" #~ msgid "generally ignore of some dependecies" #~ msgstr "Ignorer généralement certaines dépendances" # TLABEL partitioning_2002_01_04_0147__180 #~ msgid "do not forbid installation of %s" #~ msgstr "ne pas interdire l'installation de %s" # TLABEL partitioning_2002_01_04_0147__180 #~ msgid "do not keep %s installed" #~ msgstr "ne pas laisser %s installé" #~ msgid "Serbia and Montenegro" #~ msgstr "صربيا ومونتنيجرو" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "خيار list غير معروف" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "تعذر حل التبعيات" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Impossible de créer la clé publiqe %s du porteclé %s dans le fichier %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "Essayé d'importer la clé non existante %s dans le porteclé %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Impossible de chdir à '/' dans un chroot (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "" #~ "Échec de l'initialisation du téléchagement (Metalink curl) pour '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Erreur de téléchargement (metalink curl) pour '%s':\n" #~ "Code erreur: %s\n" #~ "Message erreur: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Téléchargement interrompu à %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Téléchargement interrompu par l'utilisateur" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Erreur survenue pendant la définition des options de téléchargement " #~ "(metalink curl) pour '%s':" # TLABEL restore_2002_08_07_0216__88 #~ msgid "Failed to download %s from %s" #~ msgstr "Impossible de télécharger %s depuis %s" #~ msgid "Valid metadata not found at specified URL(s)" #~ msgstr "Meta-donnée valide non trouvée à l'URL spécifiée" libzypp-17.36.5/po/gl.po000066400000000000000000004245651476576476200150160ustar00rootroot00000000000000# Galician translation of zypp # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2000, 2001 SuSE GmbH. # Copyright (C) 2002 SuSE Linux AG. # # # Proxecto Trasno - Adaptación do software libre á lingua galega: Se desexas # colaborar connosco, podes atopar máis información en # # Jesús Bravo Álvarez , 2000. # Leandro Regueiro , 2008. # Manuel A. Vazquez , 2010, 2011, 2013. msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2025-02-13 11:50+0000\n" "Last-Translator: Manuel Vazquez \n" "Language-Team: Galician \n" "Language: gl\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: Weblate 5.9.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "País descoñecido: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Sen código" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" # US # fuzzy #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Emiratos Árabes Unidos" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistán" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antiga e Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguila" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" # AM # fuzzy #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antillas Neerlandesas" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antártida" # AR #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Arxentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Americana" # AT #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" # AU #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" # CU #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # FO # fuzzy #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Illas Aland" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Acerbaixán" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia e Hercegovina" # BB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" # BD #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" # BE #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Bélxica" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" # BG #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" # BH #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benín" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudas" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" # BO #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasil" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" # BH # fuzzy #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bután" # FO # fuzzy #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Illa Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" # BY #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "República de Belarús" # BZ # fuzzy #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" # CA #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canadá" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Illas de Cocos" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" # CF # fuzzy #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "República Centroafricana" # CH #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Suíza" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Costa de Marfil" # FO # fuzzy #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Illas Cook" # CL #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camerún" # CN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" # CO # fuzzy #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cabo Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Illa de Nadal" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Chipre" # CZ #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "República Checa" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Alemaña" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Xibutí" # DK #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dinamarca" # DM #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" # DO #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "República Dominicana" # DZ #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alxeria" # EC # fuzzy #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" # EE #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" # EG #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Exipto" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sáhara Occidental" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" # ES #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "España" # ET # fuzzy #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Estonia" # FI #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlandia" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fixi" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Illas Falkland (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Estados Federados de Micronesia" # FO #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Illas Feroe" # FR #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francia" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Francia Metropolitana" # GH #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabón" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Reino Unido" # GD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Granada" # GE #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Xeorxia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Güiana Francesa" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH # fuzzy #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "China" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Xibraltar" # GL #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grenlandia" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" # GU #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadalupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinea Ecuatorial" # GR #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grecia" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Illas Xeorxia do Sur e Sandwich do Sur" # GT #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" # GU #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea Bissau" # GH #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Güiana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Illa Heard e Illas McDonald" # HN #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" # HR #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croacia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haití" # HU #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hungría" # ID #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" # IE #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanda" # IL #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Illa de Man" # IN #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Territorios británicos no Océano Índico" # IQ #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraq" # IR #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irán" # IS #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islandia" # IT #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" # JM #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Xamaica" # JO # fuzzy #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Xordania" # JP #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Xapón" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" # KZ # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirguisistán" # KH # fuzzy #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Camboxa" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comores" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts e Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Corea do Norte" # ZA #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Corea do Sur" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" # FO #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Illas Caimán" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Casaquistán" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "República Popular Democrática de Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Líbano" # LC #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Santa Lucía" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesoto" # LT # fuzzy #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituania" # LU #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburgo" # LV #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letonia" # LR #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marrocos" # MO #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Mónaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavia" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "San Martín" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" # FO # fuzzy #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Illas Marshall" # MK #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Malí" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Birmania" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" # MO #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macau" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Illas Marianas do Norte" # MU #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinica" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" # MT #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauricio" # MV #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldivas" # MW # fuzzy #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Kanu" # MX #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "México" # MY #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaisia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" # GM #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nova Caledonia" # NG #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Níxer" # FO #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Illa de Norfolk" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nixeria" # NI #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" # NL #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Países Baixos" # NO #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noruega" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" # NZ #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nova Celandia" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omán" # PA #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panamá" # PE #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Perú" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinesia Francesa" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papúa-Nova Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipinas" # TJ # fuzzy #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Paquistán" # PL #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polonia" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "San Pedro e Miguelón" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Porto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Territorios Palestinos" # PT #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" # PW # fuzzy #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Paraguai" # PY #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguai" # QA # fuzzy #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunión" # RO #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romanía" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Federación Rusa" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arabia Saudita" # FO #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Illas Salomón" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seicheles" # SD #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudán" # SE #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suecia" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Santa Helena" # SI #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Eslovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" # SK #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Eslovaquia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Serra Leona" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" # SY # fuzzy #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "San Tomé e Príncipe" # SV #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "O Salvador" # SY #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Siria" # SZ # fuzzy #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Suacilandia" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Illas Turcos e Caicos" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Territorios Franceses do Sur" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" # TH #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tailandia" # TJ # fuzzy #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Taiwán" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Toquelau" # TJ # fuzzy #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistán" # TN # fuzzy #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Rusia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor Leste" # TR #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turquía" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trindade e Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" # TW #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwán" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" # UA #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ucraína" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM # fuzzy #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Estados Unidos de América" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Estados Unidos de América" # UY #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguai" # TJ # fuzzy #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Usbekistán" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Santa Sede (Cidade Estado do Vaticano)" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "San Vicente e Granadinas" # VE #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # VI #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Illas Virxes Británicas" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Illas Virxes Estadounidenses" # VN #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" # KH #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Iemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" # ZA #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Suráfrica" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Cimbabue" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Proporciona" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Requisitos previos" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Require" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Conflitos" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Desactualizados" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recomenda" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Suxire" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Mellora" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Suplementos" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Lingua descoñecida: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" # AZ # fuzzy #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abxasio" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinés" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-asiáticas (outras)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadian" # AZ #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanés" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutiano" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Linguas Algonquinas" # ZA #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altai do Sur" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amhárico" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Anglo-Saxón (450-110 d.c)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Linguas Apache" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Árabe" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Arameo" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonés" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armenio" # MR # fuzzy #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucano" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Artificiais (outras)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Asamés" # AT #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturiano" # AU #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Linguas athapascanas" # AU #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Linguas australianas" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avaric" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" # MM # fuzzy #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aimará" # AZ #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Acerí" # CA #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Linguas Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkirés" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" # GM # fuzzy #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinés" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Éuscaro" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Bálticas (Outras)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" # BY #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorruso" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" # BZ # fuzzy #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengalí" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Bereber (Outras )" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" # BH # fuzzy #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantú (Outras)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnio" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretón" # ID # fuzzy #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesia)" # BG #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginés" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Búlgaro" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birmano" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" # TD # fuzzy #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Indíxenas Centroamericanas (Outras)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Caribe" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalán" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucásicas (Outras)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celtas (Outras)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" # CN #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Checheno" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinés" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Xerga Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Eslavo eclesiástico" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheién" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Linguas Chamic" # HR #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Copto" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Córnico" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corso" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creoles e Pidgin, baseados no Inglés (Outras)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creoles e Pidgin, baseadas no Francés (Outras)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creoles e Pidgin, baseadas no Portugués (Other)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tártaro da Crimea" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creoles e Pidgin (Outras)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Casubio" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushiticas (Outras)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Checo" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dinamarqués" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" # DM # fuzzy #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidicas (Outras)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Baixo Sorbio" # PW # fuzzy #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Neerlandés Medio (1050-1350 d.c)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Holandés" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Exipto (Antigo)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Baixo Sorbio" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inglés" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Anglo Saxón Medio (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonio" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Feroés" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" # FI #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fixiano" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finlandés" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fino-Húngaras (outras)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francés" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francés Medio ( 1400-1600 d.c)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francés Antigo (842-1400 d.c)" # FR #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisio" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" # FI #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friuliano" # GU # fuzzy #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" # GH # fuzzy #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Xermánicas (Outras)" # GE #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Xeorxiano" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Alemán" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertés" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaélico" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandés" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galego" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Alemán, Medio Alto (1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Alemán, Antigo Alto (750-1500)" # IN # fuzzy #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gótico" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grego Antigo (ata 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grego Moderno (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guaraní" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Guxarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitiano" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiiano" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebreo" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" # IN #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittite" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Alto Sórabo" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Húngaro" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandés" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" # LT # fuzzy #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingua" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Asociación por unha Lingua Auxiliar Internacional)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Índicas (Outras)" # ID #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesio" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-Europeas (Outras)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" # IN # fuzzy #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iranianas (Outras)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Linguas Iroquesas" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiano" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Xavanés" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Xaponés" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Xudeu-Persas" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Xudeo-Árabe" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" # BH # fuzzy #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Groenlandés" # GM # fuzzy #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" # CA #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kanada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Cachemirés" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" # MW # fuzzy #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazaxio" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardiano" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (Outras)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanese" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kiniarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreano" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" # PA #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Curdo" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" # UG # fuzzy #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" # GM # fuzzy #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" # LV #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latín" # LV #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letón" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezguí" # LU # fuzzy #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgués" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituano" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" # LU #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgués" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" # GH # fuzzy #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" # SD # fuzzy #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya e Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedonio" # MV # fuzzy #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurese" # MW # fuzzy #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marsellés" # ML # fuzzy #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" # MY # fuzzy #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" # MY # fuzzy #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maorí" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronésicas (Outras)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" # MT #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malaio" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" # MM # fuzzy #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Gaélico Irlandés, Medio (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Linguas varias" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (Outras)" # MY #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgaxe" # MV #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltés" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchú" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Linguas Manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" # BO #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavo" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Linguas múltiples" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Linguas Munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" # FM #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandés" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Linguas Maias" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuátl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Indíxenas Norteamericanas" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitano" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaxo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, Sur" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, Norte" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Baixo Alemán" # ML # fuzzy #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalí" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Bhasa Nepalí" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanianas (Outras)" # NG # fuzzy #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Noruegués Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Noruegués Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Nórdico Antigo" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Noruegués" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho Norte" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Linguas Nubias" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newarí Clásico" # CL #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitano (post 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Oseto" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turco, Otomano (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Linguas Otomi" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Pupuaenses (Outras)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" # PW # fuzzy #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "1Pahlavi" # PY #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" # PA #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" # PW # fuzzy #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persa Antigo (ca 600-400 B.C)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persa" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipinas (Outras)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenicio" # ML # fuzzy #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polaco" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugués" # AU #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Linguas Pakrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provenzal Antigo (Ata 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" # TJ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" # JP #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Románicas, Outras Linguas" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Retorrománico" # RO #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romanés" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romanés" # IN # fuzzy #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ruso" # CA #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" # SD # fuzzy #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Indíxenas Sudamericanas (Outras)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Linguas Salish" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Amárico Samaritano" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sánscrito" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbio" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliano" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Escocés" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croata" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitas (Outras)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Gaélico Irlandés Antigo (ata o 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Linguas de Signos" # SD # fuzzy #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Linguas Siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetanas (Outras)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Eslavas (Outras)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Eslovaco" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Esloveno" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sami Sur" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Sami Norte" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Sami, Outras Linguas" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Sami Lule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Sami Inari" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoano" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Sami Skolt" # SI #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" # SD # fuzzy #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" # SO # fuzzy #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalí" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho do sur" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Español" # MR #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardo" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo- Saharianas (Outras)" # ES #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" # SD # fuzzy #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanés" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerio" # SZ # fuzzy #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Suaxili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Sueco" # SY #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Sirio" # TW #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitiano" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (Outras)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" # QA # fuzzy #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tártaro" # BE #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" # TJ # fuzzy #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Taxiko" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalo" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tailandés" # TW #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetano" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" # NG # fuzzy #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinia" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Illas Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" # TW #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" # EE #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" # TR #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turcomano" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Linguas Tupí" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turco" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaicas (Outras)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" # TN # fuzzy #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvinian" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugarítico" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uigur" # UA #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ucraíno" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Non determinado" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Usbeco" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" # VN # fuzzy #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamita" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Linguas Wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" # PY #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Galés" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Linguas Sorbias" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Valón" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Xidish" # CU # fuzzy #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Ioruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Linguas Yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapoteca" # GD #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulú" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuñi" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Realizaranse as seguintes accións:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "descoñecido" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "non soportado" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Nivel 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Nivel 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Nivel 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Contrato adicional de cliente necesario" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "incorrecto" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "O nivel de soporte non está especificado" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "O fabricante non fornece soporte." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Determinación do problema, o que significa soporte técnico designado para " "prover información de compatibilidade, asistencia de instalación, soporte de " "uso, mantemento sobre a marcha e solucións básicas. Nivel 1 de soporte está " "pensado para corrixir erros por defectos do produto." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Illamento do problema, o que significa soporte técnico designado para " "duplicar os problemas do cliente, illar a área problemática e prover unha " "solución por problemas non resoltos polo Nivel 1 de soporte." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Resolución de problemas, significa soporte técnico designado para resolver " "problemas complexos ao utilizar enxeñaría na resolución de produtos " "defectuosos identificados polo Nivel 2 de soporte." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Un contrato adicional co cliente é necesario para recibir soporte." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Opción de soporte descoñecida. Descrición non dispoñible" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "A xestión do sistema está bloqueada polo aplicativo con pid %d (%s).\n" "Peche este aplicativo antes de tentalo de novo." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Modo de coincidencias '%s' descoñecido" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Modo de coincidencias '%s' descoñecido para o patrón '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Expresión regular '%s' incorrecta: regcomp devolveu %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Expresión regular '%s' incorrecta" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autenticación necesaria para '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Tentarase de novo..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Desistir despois de %1% intentos." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visite o Centro de servizos ao cliente de SUSE para comprobar se o seu " "rexistro é correcto e non caducou." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visite o Novell Customer Center para verificar se o seu rexistro é válido e " "non caducou." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Crear punto de inserción: non se atopa un directorio non que se poida " "escribir e anexar o punto" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Instale primeiro o paquete 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Non se pode crear o directorio da caché de metadatos." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Erro ao ler desde '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Non se pode crear '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Non se puideron recuperar os novos metadatos do repositorio." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "Non foi posíbel almacenar en caché o repositorio (non se puido iniciar " "repo2solv )." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Fallo na caché do repositorio (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Construíndo a caché do repositorio '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Non se pode crear a caché en %s - non hai permisos de escritura." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Non se puido almacenar en caché o repositorio %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Repositorio" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Engadindo o repositorio '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nome de ficheiro do repositorio incorrecto en '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Non se puido abrir '%s' para escribir." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Erro descoñecido ao ler desde '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Non foi posíbel ler o directorio do repositorio %1%: permiso denegado" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Erro ao ler o directorio '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Non foi posíbel ler o ficheiro de repositorio '%1%': permiso denegado" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Limpando metadatos" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Limpando paquetes" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Limpando directorios de caché" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Limpando directorio:%1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Limpando caché" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Cargando da caché" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Eliminando o repositorio '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Non se pode saber onde se atopa almacenado o repositorio." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Non se pode borrar '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Modificación do repositorio" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Actualizando repositorio: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Non se pode saber onde se atopa almacenado o servizo." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Servizo descoñecido de '%1%': eliminando o servizo orfo do repositorio '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "O alias do repositorio non pode comezar cun punto." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "O alias do servizo non pode comezar cun punto." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Non hai resumo para o ficheiro %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Resumo descoñecido %s para o ficheiro %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "O ficheiro '%s' non está asinado. Quere continuar?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Desexa continuar?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "O repositorio %1% non ten definida URLs adicionais nos 'gpgkey='." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Buscando a chave gpg coa ID %1% no repositorio %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Buscando a chave gpg coa ID %1% no caché %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Falta o atributo requirido '%s'." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Necesítanse un ou ambos os dous atributos '%s' ou '%s'." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Fallou a verificación da sinatura" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "O paquete %s semella que se danou durante a transferencia. Quéreo volver " "obter?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Non se puido fornecer o paquete %s. Quéreo volver obter?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "fallou na verificación de applydeltarpm." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "fallou applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "O engadido do servizo non soporta os cambios nos atributos." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Non se pode fornecer o ficheiro '%s' desde o repositorio '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Non hai ningún enderezo url no repositorio." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "O ficheiro %1%\n" " do paquete\n" " %2%\n" " entra en conflito cun ficheiro do paquete\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "O ficheiro %1%\n" " do paquete\n" " %2%\n" " entra en conflito cun ficheiro da instalación de\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "O ficheiro %1%\n" " da instalación de\n" " %2%\n" " entra en conflito cun ficheiro do paquete\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "O ficheiro %1%\n" " da instalación de\n" " %2%\n" " entra en conflito cun ficheiro da instalación de\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "O ficheiro %1%\n" " do paquete\n" " %2%\n" " entra en conflito co ficheiro\n" " %3%\n" " do paquete\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "O ficheiro %1%\n" " do paquete\n" " %2%\n" " entra en conflito co ficheiro\n" " %3%\n" " da instalación de\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "O ficheiro %1%\n" " da instalación de\n" " %2%\n" " entra en conflito co ficheiro\n" " %3%\n" " do paquete\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "O ficheiro %1%\n" " da instalación de\n" " %2%\n" " entra en conflito co ficheiro\n" " %3%\n" " da instalación de\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Non se pode crear sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "quebrar %s ao ignorar algunhas das dependencias" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "polo xeral ignorar algunhas dependencias" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "peticións en conflito" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "algúns problemas de dependencias" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "petición sen soporte" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "fornecedores eliminados: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "provedores non instalables: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "provedores non instalables: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Esta solicitude danará o seu sistema!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorar o aviso de sistema danado" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "permitir a instalación de PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "instalar %1% aínda que estea na lista negra" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Abortouse a instalación seguindo as indicacións." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " executado" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " fallou a execución" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s xa executado como %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " ignorada a execución ao interromper" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Erro ao enviar a notificación da mensaxe de actualización." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nova mensaxe de actualización" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Fallou a execución da transacción debido aos seguintes problemas:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Fallou o RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Erro ao importar a chave pública %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Erro ao eliminar a chave pública %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Modificados os ficheiros de configuración para %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm gardou %s como %s, pero non se pode determinar a diferenza" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm gardou %s como %s.\n" "A continuación amósanse as primeiras 25 liñas de diferenza:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm creou %s como %s, pero no se pode determinar a diferenza" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm creou %s como %s.\n" "A continuación amósanse as primeiras 25 linas de diferenza:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Saída rpm adicional" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "copia de seguridade %s creada" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "A sinatura é correcta" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tipo de sinatura descoñecido" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "A sinatura non se dou verificado" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "A sinatura está correcta, mais non se confía na chave" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Non hai dispoñible unha sinatura pública da chave" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Ou o ficheiro non existe ou ou a sinatura non se pode verificar" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "O ficheiro está sen asinar" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "non caduca" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "caducado: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "caduca: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(non caduca)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(CADUCADO)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(caduca dentro de 24h)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(caduca dentro de %d día)" msgstr[1] "(caduca dentro de %d días)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Tentouse importar unha chave que non existe %s para o chaveiro %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Erro ao importar a chave." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Fallo ao eliminar a chave." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Non se atopou o ficheiro da sinatura %s" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tipo dubidoso '%s' para o byte %u suma de verificación '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Non se pode abrir pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Non se pode abrir a canalización (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Cadea de consulta URL LDAP incorrecta" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Parámetro de consulta URL LDAP '%s' incorrecto" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Non se pode clonar o obxecto URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Referencia de obxecto de URL baleiro incorrecto" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Non se poden analizar os compoñentes de URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historial:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "O esquema de Url non permite un elemento %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Compoñente '%s' incorrecto %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Compoñente %s incorrecto" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "A análise de cadeas de consulta non é compatible con este enderezo URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "O esquema de Url é un compoñente obrigatorio" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Esquema '%s' de URL incorrecto" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "O esquema de Url non permite un nome de usuario" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "O esquema de Url non permite un contrasinal" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "O esquema de Url require un compoñente de host" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "O esquema de Url non permite un compoñente host" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Compoñente de host incorrecto '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "O esquema de Url non permite un porto" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Compoñente de porto incorrecto '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "O esquema de Url require un nome de ruta" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Non se permiten rutas alternativas se existe unha autoridade" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "A cadea codificada inclúe un byte NULO" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" "Parámetro de carácter de separación para a división de matrices incorrecto" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" "Parámetro de carácter de separación para a división de mapas incorrecto" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" "Parámetro de carácter de separación para a unión de matrices incorrecto" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "A orde rematou co estado %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "O sinal %d (%s) matou a orde." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "A orde rematou cun erro descoñecido." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Non se pode facer chroot a '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Non foi posíbel executar '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Non foi posíbel executar chdir '%s' dentro de '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Non se pode executar '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "No se pode facer fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Fallo ao montar %s en %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Fallo ao desmontar %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nome de ficheiro danado: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "O medio non se abriu cando se tentaba realizar a acción '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Non se atopa o ficheiro '%s' no medio '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Non se puido escribir o ficheiro '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Medio non anexado" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Punto de inserción de medio incorrecto" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "O inicio da descarga (curl) fallou para '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Excepción do sistema '%s' no medio '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "A ruta '%s' no medio '%s' non é un ficheiro." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "A ruta '%s' no medio '%s' non é un directorio." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Formato de URI incorrecto" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nome de host baleiro en URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Sistema de ficheiros baleiro en URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destino baleiro en URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Esquema de URL non soportado en '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operación non admitida polo medio" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Erro na descarga (curl) de '%s':\n" "Código de erro: %s\n" "Mensaxe de erro: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Ocorreu un erro ao establecer as opcións de descarga (curl) para '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "O medio fonte '%s' non contén o medio desexado" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "O medio '%s' está en uso por outra instancia" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Non é posible expulsar ningún medio" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Non se puido expulsar o soporte '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Permiso de acceso a '%s' denegado." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Tempo de espera excedido ao acceder a '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "Os datos descargados superan o tamaño de ficheiro '%s' esperado para '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "A localización '%s' está neste intre inaccesible." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Problema no certificado SSL, comprobe se a certificación CA é correcta para " "'%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Método de autenticación HTTP non soportado '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Si" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Non" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Aviso:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Erro:" # ID #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "feito" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "erro" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Advertencia: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Obtendo:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "iniciando" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Non atopado" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Non hai axuda dispoñible para este indicador de ordes." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "Non hai axuda dispoñible para esta opción" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "si" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "non" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Metadatos válidos non atopados no URL especificado" #~ msgstr[1] "Metadatos válidos non atopados nos URLs especificados" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Executando o script %%posttrans '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Executando scripts de %posttrans" #~ msgid "Package is not signed!" #~ msgstr "O paquete non está asinado!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s non pertence ao repositorio de actualización da distribución" #~ msgid "%s has inferior architecture" #~ msgstr "%s ten unha arquitectura inferior" #~ msgid "problem with installed package %s" #~ msgstr "houbo un problema co paquete instalado %s" #~ msgid "nothing provides requested %s" #~ msgstr "no hai nada que forneza o solicitado %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Activou todos os repositorios solicitados?" #~ msgid "package %s does not exist" #~ msgstr "o paquete %s non existe" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s ofréceo o sistema e non se pode eliminar" #~ msgid "%s is not installable" #~ msgstr "%s non é instalable" #~ msgid "nothing provides %s needed by %s" #~ msgstr "no hai nada que forneza %s e que o necesita %s" #~ msgid "cannot install both %s and %s" #~ msgstr "non se puido instalar %s e %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s ten un conflito con %s, fornecido por %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s está obsoleto %s fornecido por %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s instalado, deixa obsoleto a %s fornecido por %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "a solución %s ten conflitos con %s fornecida por esta mesma" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s require %s, pero este requirimento non pode ser fornecido" #~ msgid "remove lock to allow removal of %s" #~ msgstr "retirar os bloqueos para poder eliminar a %s" #~ msgid "do not install %s" #~ msgstr "non instalar %s" #~ msgid "keep %s" #~ msgstr "Manter %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "retirar os bloqueos para poder instalar a %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "non preguntar en caso de instalar algún elemento que forneza %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "" #~ "non preguntar en caso de eliminar todos os elementos que fornecen %s" #~ msgid "do not install most recent version of %s" #~ msgstr "non instalar a versión máis recente de %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "manter %s sen importar que sexa dunha arquitectura inferior" #~ msgid "install %s despite the inferior architecture" #~ msgstr "instalar %s aínda que cambie a arquitectura" #~ msgid "keep obsolete %s" #~ msgstr "manter o antigo %s" #~ msgid "install %s from excluded repository" #~ msgstr "instalar %s desde os repositorios excluídos" #~ msgid "downgrade of %s to %s" #~ msgstr "desactualizar de %s a %s" #~ msgid "architecture change of %s to %s" #~ msgstr "modificación de arquitectura de %s para %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "instalar %s (con cambio de provedor)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "substitución de %s con %s" #~ msgid "deinstallation of %s" #~ msgstr "desinstalación de %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Non se pode abrir o ficheiro de bloqueo: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Esta acción xa está a ser executada por outro programa." #~ msgid "Hal Exception" #~ msgstr "Excepción de hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Esta versión de libzypp foi compilada sen soporte para HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext non conectado" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive non inicializado" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume non inicializado" #~ msgid "Unable to create dbus connection" #~ msgstr "Non foi posible crear a conexión co dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: non foi posible crear o contexto libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "libhal_set_dbus_connection: non se puido definir a conexión con dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "Non foi posible iniciar o contexto HAL - hald non está en execución?" #~ msgid "Not a CDROM drive" #~ msgstr "Non é un dispositivo CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Non é posible iniciar os atributos de mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Non se pode establecer o atributo de mutex recursivo" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Non é posíbel inicializar mutex recursivo" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Non se pode adquirir o bloqueo de mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Non se pode liberar o bloqueo de mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Erro ao importar a chave pública desde o ficheiro %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Erro ao eliminar a chave pública %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Non é posible atopar un dispositivo bucle dispoñible para montar a imaxe " #~ "desde '%s'" #~ msgid "generally ignore of some dependecies" #~ msgstr "xeralmente ignorar algunhas dependencias" #~ msgid "do not forbid installation of %s" #~ msgstr "non prohibir a instalación de %s" #~ msgid "do not keep %s installed" #~ msgstr "non manter instalado %s" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "خيار list غير معروف" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Non se pode crear a chave pública %s do anel de chaves %s ao ficheiro %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "Tentouse importar a chave inexistente %s no anel de chaves %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Non se pode facer chdir a '/' dentro de chroot (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "O inicio da descarga (Metalink curl) fallou para '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Erro na descarga (metalink curl) de '%s':\n" #~ "Código de erro: %s\n" #~ "Mensaxe de erro: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Descarga interrompida en %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Descarga interrompida polo usuario" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Ocorreu un erro ao establecer as opcións de descarga (metalink curl) para " #~ "'%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Erro ao descargar %s desde %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia e Montenegro" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "Depende de: !dependecies" #, fuzzy #~ msgid "%s remove failed" #~ msgstr "Eliminar elemento" #, fuzzy #~ msgid "%s install failed" #~ msgstr "Cron executouse con fallas" #, fuzzy #~ msgid "%s installed ok" #~ msgstr "Non instalado" #, fuzzy #~ msgid "%s remove ok" #~ msgstr "Eliminar elemento" libzypp-17.36.5/po/gu.po000066400000000000000000004475421476576476200150270ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: nis\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2006-11-11 18:41+0530\n" "Last-Translator: Priyavert Sharma\n" "Language-Team: AgreeYa Solutions\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.10.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "અજાણ્યો દેશ:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "કોડ નથી" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "એન્ડોરા" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "યૂનાઇટેડ આરબ એમિરાટ્સ" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "અફઘાનિસ્તાન" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "એન્ટિગુઆ અને બારબુડા" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "એન્ગુઇલા" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "અલ્બાનિયા" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "અર્મેનિયા" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "નેધરલેન્ડ્સ એન્ટિલેસ" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "એન્ગોલા" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "એન્ટાર્કટિકા" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "આર્જેન્ટિના" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "અમેરિકન સામોઆ" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "ઓસ્ટ્રિયા" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "ઓસ્ટ્રેલિયા" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "અરુબા" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "અલાન્ડ આઇલેન્ડ્સ" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "અઝેરબાઇજન" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "બોસ્નિયા અને હર્ઝેગોવિના" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "બાર્બાડોઝ" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "બાંગ્લાદેશ" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "બેલ્જીયમ" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "બર્કિના ફાસો" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "બલ્ગેરિયા" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "બહેરિન" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "બુરુંડી" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "બેનિન" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "બર્મુડા" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "બ્રૂનેઇ દારુસ્સાલમ" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "બોલિવિયા" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "બ્રાઝિલ" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "બહામસ" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "ભૂટાન" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "બૌવેટ આઇલેન્ડ" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "બોટ્સવાના" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "બેલારુસ" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "બેલાઇઝ" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "કેનેડા" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "કોકોસ (કિલિંગ) આઇલેન્ડ્સ" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "કોંગો" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "સેટ્રલ આફ્રિકન રિપબ્લિક" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "સ્વિટઝરલેન્ડ" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "કોટ ડિ'લ્વોઇરે" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "કુક આઇલેન્ડ્સ" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "ચિલિ" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "કેમેરુન" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "ચાઇના" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "કોલોમ્બિયા" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "કોસ્ટા રિકા" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "ક્યુબા" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "કેપ વર્ડે" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "ક્રિસ્ટમસ આઇલેન્ડ" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "સાઇપ્રસ" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "ચેઝ રિપબ્લિક" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "જર્મની" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "ડ્જિબૌટી" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "ડેનમાર્ક" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "ડોમિનિકા" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "ડોમિનિસિયન રિપબ્લિક" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "અલ્જેરિયા" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "એક્વાડોર" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "એસ્ટોનિયા" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "ઇજિપ્ત" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "વેસ્ટર્ન સહારા" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "એરિટરિયા" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "સ્પેન" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "એથિઓપિયા" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "ફિનલેન્ડ" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "ફિજિ" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "ફાલ્કલેન્ડ આઇલેન્ડ (માલ્વિનસ)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "ફેડરેટડ સ્ટેટ્સ ઓફ માઇક્રોનેસિયા" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "ફારોએ આઇલેન્ડ્સ" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "ફ્રાન્સ" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "મેટ્રોપોલિટન ફ્રાન્સ" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "ગબોન" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "યૂનાઇટેડ કિંગડોમ" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "ગ્રેનાડા" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "જ્યોર્જિયા" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "ફેન્ચ ગુઇઆના" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "જર્મની" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "ઘાના" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "જિબ્રાલ્ટર" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "ગ્રીનલેન્ડ" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "ગમ્બિયા" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "ગુનિયા" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "ગૌડેલૌપે" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "એક્વાટોરિયલ ગુનિયા" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "ગ્રીસ" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "સાઉથ જ્યોર્જિયા અને સાઉથ સેન્ડવિચ આઇલેન્ડ્સ" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "ગૌટેમાલા" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "ગુઆમ" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "ગુનિયા-બિસાઉ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "ગુયાના" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "હોંગ કોંગ" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "હર્ડ આઇલેન્ડ અને મેકડોનાલ્ડ આઇલેન્ડ્સ" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "હોંડુરાસ" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "ક્રોએશિયા" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "હૈતી" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "હંગેરી" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "ઇન્ડોનેશિયા" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "આયર્લેન્ડ" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "ઇઝરાયેલ" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "ઇન્ડિયા" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "બ્રિટિશ ઇન્ડિયન ઓસિયન ટેરિટરી" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "ઇરાક" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "ઇરાન" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "આઇસલેન્ડ" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "ઇટાલિ" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "જમૈકા" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "જોર્ડન" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "જાપાન" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "કેન્યા" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "ક્યરઝેસ્તાન" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "કંબોડિયા" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "કિરિબતી" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "કોમરોસ" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "સેંટ કિટ્સ અને નેવિસ" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "નોર્થ કોરિયા" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "સાઉથ કોરિયા" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "કુવૈત" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "કેયમેન આઇલેન્ડ્સ" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "કઝાક્સ્તાન" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "લાઓ પિપલ્સ ડેમોક્રેટિક રિપબ્લિક" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "લેબેનોન" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "સેંટ લુસિયા" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "લેઇચટેન્સ્ટેઇન" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "શ્રી લંકા" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "લિબેરિયા" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "લેસોથો" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "લિથુઆનિયા" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "લક્ઝેમબર્ગ" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "લેટિવા" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "લિબિયા" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "મોરોક્કો" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "મોનેકો" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "મોલ્ડોવા" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "મોંગો" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "સન મેરિનો" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "મડગાસ્કાર" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "માર્શેલ આઇલેન્ડ્સ" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "માસેડોનિયા" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "માલિ" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "મ્યાનમાર" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "મોંગોલિયા" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "મકાઓ" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "નોર્ધર્ન મારિયાના આઇલેન્ડ્સ" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "માર્ટિનિક" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "મૌરિટાનિયા" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "મોન્ટસેરાટ" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "માલ્ટા" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "મોરેશિયસ" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "માલદિવસ" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "મલાવિ" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "મેક્સિકો" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "મલેસિયા" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "મોઝામ્બિક" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "નામિબિયા" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "ન્યૂ કેલેડોનિયા" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "નાઇજેર" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "નોરફોલ્ક આઇલેન્ડ" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "નાઇજિરિયા" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "નિકારાગુઆ" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "નેધરલેન્ડસ" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "નોર્વે" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "નેપાલ" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "નૌરુ" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "નિયુએ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "ન્યૂ ઝીલેન્ડ" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "ઓમાન" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "પનામા" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "પેરુ" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "ફ્રેન્ચ પોલિનેસિયા" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "પાપુઆ ન્યૂ ગુનિયા" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "ફિલિપાઇન્સ" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "પાકિસ્તાન" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "પોલેન્ડ" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "સેંટ પિએરે અને મિકેલોન" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "પિટકેઇર્ન" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "પ્યૂએર્ટો રિકો" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "પેલેસ્ટિનિયન ટેરિટરી" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "પોર્ટુગલ" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "પલાઉ" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "પેરાગ્વે" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "કતાર" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "રિયૂનિયન" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "રોમાનિયા" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "સર્બિયન" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "રશિયન ફેડરેશન" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "રવાન્ડા" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "સાઉદી અરેબિયા" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "સોલોમન આઇલેન્ડ્સ" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "શેશેલ્સ" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "સુદાન" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "સ્વિડન" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "સિંગાપોર" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "સેંન્ટ હેલેના" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "સ્લોવેનિયા" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "સ્વાલબર્ડ અને જાન મયેન" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "સ્લોવેકિયા" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "સિયેરા લિયોન" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "સન મેરિનો" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "સેનેગલ" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "સોમાલિયા" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "સુરિનેમ" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "સાઓ ટોમ અને પ્રિન્સિપે" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "એલ સાલ્વાડોર" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "સિરિયા" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "સ્વાઝિલેન્ડ" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "ટર્કસ અને કઇકોસ આઇલેન્ડ" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "ચેડ" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "ફ્રેન્ચ સાઉધર્ન ટેરિટોરિસ" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "ટોગો" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "થાઈલેન્ડ" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "ટાઝિક્સ્તાન" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "તોકેલાઉ" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "ટર્કમેનિસ્તાન" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ટુનિસિયા" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "ટોંગા" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "ઇસ્ટ ટિમર" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "ટર્કી" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ત્રિનિદાદ અને ટોબાગો" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "ટુવાલુ" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "તાઇવાન" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "ટાન્ઝાનિયા" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "યુક્રેઇન" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "યુગાન્ડા" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "યૂનાઇટેડ સ્ટેટ્સ માઇનોર આઉટલાઇંગ આઇલેન્ડ્સ" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "યૂનાઇટેડ સ્ટેટ્સ" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "યુરુગ્વે" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "યુઝબેકિસ્તાન" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "હોલિ સી (વેટિકન સીટી સ્ટેટ)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "સેંટ વિન્સેન્ટ અને ધ ગ્રેનાડિનેસ" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "વેનેઝુએલા" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "બ્રિટીશ વર્જિન આઇલેન્ડ્સ" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "વર્જિન આઇલેન્ડ્સ, યુ.એસ." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "વિયેટનામ" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "વનુઆટુ" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "વોલિસ અને ફુટુના" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "સમોઆ" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "યેમન" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "મયોટે" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "સાઉથ આફ્રિકા" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "ઝામ્બિયા" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "ઝિમ્બાબ્વે" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s અલગ પાડવું : %s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "અજાણી ભાષા:" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "અફર" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "અબકાઝિયન" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "અચાઈનિઝ" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "અકોલી" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "અડાનગ્મે" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "અડ્યાઘે" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "અફ્રો-એશિયાટીક (અન્ય)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "અફ્રિહિલિ" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "આફ્રિકન્સ" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "એઇનુ" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "અકાન" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "અકાડિયન" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "અલ્બાનિયન" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "એલુટ" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "એલ્ગોનક્વિયન ભાષાઓ" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "સાઉથર્ન અલટાઇ" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "એમહારિક" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "અંગ્રેજી, જૂનું (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "અપાચે ભાષાઓ" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "અરેબિક" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "અરામેઇક" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "આર્ગોનિઝ" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "આર્મેનિયન" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "અરાઉકેનિયન" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "અરાપાહો" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "આર્ટિફિસિયલ (અન્ય)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "અરાવક" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "આસામિઝ" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "ઓસ્ટ્રીયન" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "અથાપાસ્કેન ભાષાઓ" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "ઓસ્ટ્રેલિયન ભાષાઓ" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "અવારિક" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "અવેસ્ટન" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "અવધી" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "અયમારા" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "અઝેરબાઇજાની" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "બાન્ડા" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "બામિલેકે ભાષાઓ" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "બષ્કિર" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "બલુચિ" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "બમબારા" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "બાલિનેઝ" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "બાસ્ક" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "બાસા" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "બાલ્ટિક (અન્ય)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "બેજા" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "બેલારુશિયન" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "બેમ્બા" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "બેંગાલી" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "બેર્બેર (અન્ય)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "ભોજપૂરી" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "બિહારી" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "બિકોલ" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "બિનિ" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "બિસલામા" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "સિકસિકા" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "બાન્ટુ (અન્ય)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "બોસ્નિયન" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "બ્રજ" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "બ્રેટન" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "બટક (ઇન્ડોનેશિયા)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "બરિયટ" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "બુગિનેઝ" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "બલ્ગેરિયન" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "બરમિઝ" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "બ્લિન" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "કેડ્ડો" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "સેન્ટલ અમેરિકન ઇન્ડિયન (અન્ય)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "કેરિબ" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "કેટાલન" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "કૌકાસિયન (અન્ય)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "સેબુઆનો" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "સેલટિક (અન્ય)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "ચામોરો" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "ચિબ્ચા" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "ચેચન" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "ચગાટાઇ" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "ચાઈનિઝ" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "ચુકેસે" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "મારી" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "ચિનુક જાર્ગન" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "ચોક્ટાઓ" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "ચિપેવ્યાન" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "ચેરોકી" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "ચર્ચ સ્લાવિક" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "ચુવાસ" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "ચેયન્ને" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "ચામિક ભાષાઓ" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "કોપ્ટિક" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "કોર્નિશ" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "કોર્શિયન" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "ક્રેઓલેસ અને પિડગિન્સ, અંગ્રેજી-આધારિત (અન્ય)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "ક્રેઓલેસ અને પિડગિન્સ, ફ્રેન્ચ-આધારિત (અન્ય)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "ક્રેઓલેસ અને પિડગિન્સ, પોર્ટુગેઝ-આધારિત (અન્ય)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "ક્રી" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "ક્રિમિન ટટાર" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "ક્રેઓલેસ અને પિડગિન્સ (અન્ય)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "કશુબિયન" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "કુશિટિક (અન્ય)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "ચેઝ" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "ડેકોટા" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "ડેનિશ" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "ડર્ગવા" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "ડાયક" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "ડેલવારે" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "સ્લેવ (અથાપાસ્કેન)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "ડોગ્રિબ" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "ડિન્કા" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "ડિવેહી" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "ડોગરી" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "ડ્રવિડિયન (અન્ય)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "લોવર સોર્બિયન" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "ડૌલા" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "ડચ, મધ્ય (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "ડચ" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ડ્યુલા" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "ડ્ઝોનઘા" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "એફિક" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "ઇજિપ્ટિયન (પ્રાચીન)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "એકાજુક" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "એલામાઇટ" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "અંગ્રેજી" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "અંગ્રેજી, મધ્ય (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "એસ્પરાન્ટો" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "એસ્ટોનિયન" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "એવ" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "એવોન્ડો" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "ફેંગ" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "ફારોઇઝ" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "ફન્ટિ" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "ફિઝિયન" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "ફિલિપિનો" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "ફિનિશ" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "ફિન્નો-યુગ્રીયન (અન્ય)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "ફોન" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "ફ્રેન્ચ" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "ફ્રેન્ચ, મધ્ય (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "ફ્રેન્ચ, જૂનું (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "ફ્રિસિયન" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "ફુલાહ" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "ફ્રિયુલિયન" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "ગા" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "ગાયો" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "ગબાયા" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "જર્મેનિક (અન્ય)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "જ્યોર્જિયન" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "જર્મન" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "ગીઝ" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "ગીલબર્ટેઝ" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "ગાયેલિક" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "આઇરિશ" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "ગાલિસિયન" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "મેંક્ષ" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "જર્મન, મધ્ય ઊંચું (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "જર્મન, જૂનું ઊંચું (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "ગોન્ડી" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "ગોરોનટાલો" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "ગોથિક" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "ગ્રેબો" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "ગ્રીક, પ્રાચીન (to 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "ગ્રીક, આધુનિક (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "ગૌરાની" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "ગુજરાતી" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "ગ્વિચ'ઇન" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "હૈડા" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "હૈશિયન" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "હૌસા" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "હવાઇન" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "હેબ્રૂ" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "હેરેરો" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "હિલિગયનોન" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "હિમાચલિ" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "હિંદી" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "હિટીટે" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "હમોંગ" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "હિરિ મોટુ" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "અપર સોર્બિયન" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "હંગેરિયન" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "હુપા" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "ઇબાન" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "ઇગ્બો" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "આઇસલેન્ડિક" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ઇડો" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "સિચુયન યિ" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ઇજો" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "ઇનુક્ટિટટ" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "ઇન્ટરલિંગ્યુ" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "ઇલોકો" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "ઇન્ટરલિંગ્યુઆ (ઇન્ટરનેશનલ ઓક્ઝિલરી લેંગ્વેજ એસોસિયેશન)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "ઇન્ડિક (અન્ય)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "ઇન્ડોનેશિયન" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "ઇન્ડો-યુરોપિયન (અન્ય)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "ઇનગ્યુશ" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "ઇનુપિક" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "ઇરાનિયન (અન્ય)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "આઇરોક્વોયન ભાષાઓ" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "ઇટાલિયન" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "જાવાનિઝ" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "લોજબાન" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "જાપાનિઝ" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "જ્યુડેઓ-પર્સિયન" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "જ્યુડેઓ-અરેબિક" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "કારા-કલ્પક" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "કબય્લે" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "કચિન" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "કલાલિસટ" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "કમ્બા" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "કન્નડા" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "કરેન" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "કાશ્મીરી" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "કનૌરી" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "કાવિ" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "કઝાક" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "કબાર્ડિયન" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "ખાસિ" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "ખોઇસન (અન્ય)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "ખેમર" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "ખોટેનિઝ" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "કિકુયુ" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "કિનયરવાન્ડા" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "કિરઝિઝ" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "કિમબુંડું" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "કોંકણી" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "કોમિ" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "કોંગો" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "કોરિયન" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "કોસ્રેયિન" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "ક્પેલે" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "કરાચય-બલ્કર" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "ક્રૂ" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "કુરુખ" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "કૌનયામા" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "કુમય્ક" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "કુર્દિશ" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "કુટેનાઇ" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "લાડિનો" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "લાહ્ન્ડા" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "લામ્બા" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "લાઑ" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "લેટિન" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "લેટવિયન" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "લેઝઘિયન" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "લિમ્બર્ગન" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "લિંગાલા" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "લિથુઆનિયન" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "મોંગો" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "લોઝિ" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "લકઝેમબર્ગિશ" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "લુબા-લુલ્યુઆ" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "લુબા-કટનગા" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ગાન્ડા" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "લ્યુઇસેનો" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "લુન્ડા" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "લુઓ (કેન્યા અને ટાન્ઝાનિયા)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "લુશાઇ" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "મેસેડોનિયન" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "મડુરિઝ" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "મગાહિ" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "માર્શેલિઝ" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "મૈથિલિ" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "મકાસાર" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "મલયાલમ" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "મંડિંગો" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "માઓરી" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "ઓસ્ટ્રોનેસિયન (અન્ય)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "મરાઠી" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "મસાઇ" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "મલય" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "મોક્ષા" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "મંડર" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "મેન્ડે" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "આઈરિશ, મધ્ય (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "મિ-ક્મક" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "મિનંગકબાઉ" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "મિશ્ર ભાષાઓ" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "મોન-ખેમર (અન્ય)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "મલાગ્સે" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "મોલ્ટિઝ" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "મંચુ" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "મનિપુરી" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "મનોબો ભાષાઓ" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "મોહાક" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "મોલ્ડાવિયન" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "મોંગોલિયન" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "મોસિ" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "બહુવિધ ભાષાઓ" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "મુંડા ભાષાઓ" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "ક્રિક" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "મિરાંડેઝ" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "મારવારી" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "માયન ભાષાઓ" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "એર્ઝાયા" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "નહુઆટ્લે" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "નોર્થ અમેરિકન ઇન્ડિયન" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "નેપોલિટન" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "નવાજો" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "ન્ડેબેલે, સાઉથ" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "ન્ડેબેલે, નોર્થ" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ન્ડોનગા" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "લો જર્મન" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "નેપાલી" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "નેપાલ ભાષા" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "નિયાસ" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "નાઇજર-કોર્ડોફેનિયન (અન્ય)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "નિયુએન" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "નોર્વેજિયન ન્યનોર્સ્કે" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "નોર્વેજિયન બોકમલ" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "નોગાઈ" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "નોર્સે, જૂનું" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "નોર્વેજિયન" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "નોર્ધન સોથો" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "ન્યુબિયન ભાષાઓ" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "ક્લાસિકલ નેવારી" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "ચિચેવા" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "ન્યામવેઝિ" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "ન્યાનકોલે" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "ન્યોરો" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "ન્ઝિમા" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "ઓસિટન (પોસ્ટ 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "ઓજિબ્વા" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "ઓરિયા" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "ઓરોમો" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "ઓસેજ" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "ઓસેટિયઅન" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "ટર્કિસ, ઓટોમન (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "ઓટોમિયન ભાષાઓ" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "પેપુયન (અન્ય)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "પેન્ગાસિનન" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "પહલાવિ" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "પમપાન્ગા" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "પંજાબી" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "પપિયામેન્ટો" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "પલાઉન" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "પર્સિયન, જૂનું (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "પર્સિયન" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "ફિલિપાઇન્સ (અન્ય)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "ફોએનિસિયન" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "પાલી" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "પોલિશ" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "પોહ્નપેઇયન" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "પોર્ટુગીઝ" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "પ્રક્રિત ભાષાઓ" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "પ્રોવેન્કલ, જૂનું (to 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "પુશ્તો" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "ક્વેચુઆ" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "રાજસ્થાની" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "રપાનુઇ" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "રારોટોન્ગન" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "રોમાન્સ (અન્ય)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "રાએટો-રોમાન્સ" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "રોમાની" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "રોમાનિયન" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "રુન્ડી" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "રસિયન" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "સેન્ડવે" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "સેન્ગો" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "યાકુટ" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "સાઉથ અમેરિકન ઇન્ડિયન (અન્ય)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "સાલિશન ભાષાઓ" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "સમારિટન અરામેઇક" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "સંસ્ક્રિત" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "સસક" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "સનતાલિ" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "સર્બિયન" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "સિસિલિયન" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "સ્કોટ્સ" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "ક્રોએશિયન" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "સેલકપ" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "સેમિટિક (અન્ય)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "આઇરિશ, જૂનું (to 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "સાઇન ભાષાઓ" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "શાન" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "સિદામો" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "સિંહાલા" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "સિયુઅન ભાષાઓ" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "સિનો-ટિબેટિયન (અન્ય)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "સ્લેવિક (અન્ય)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "સ્લોવેક" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "સ્લોવેનિયન" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "સાઉધર્ન સામિ" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "નોર્ધર્ન સામિ" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "સામિ ભાષાઓ (અન્ય)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "લુલે સામિ" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "ઇનારિ સામિ" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "સામોઅન" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "સ્કોલ્ટ સામિ" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "શોના" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "સિંધી" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "સોનિનકે" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "સોગડિયન" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "સોમાલિ" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "સોંઘાઈ" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "સોથો, સાઉધર્ન" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "સ્પેનિશ" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "સર્દિનિયન" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "સેરેર" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "નિલો-સહારન (અન્ય)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "સ્વાતિ" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "સુકુમા" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "સનડેનેઝ" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "સુસુ" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "સુમેરિયન" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "સ્વાહિલિ" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "સ્વેડિશ" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "સાઇરિએક" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "તાહિશિયન" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "તાઇ (અન્ય)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "તામિલ" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "તાતાર" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "તેલુગુ" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "ટિમ્ને" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "ટેરેનો" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "તેટુમ" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "તાજિક" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "તાગાલોગ" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "થાઇ" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "ટિબેટન" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "ટાઇગ્રે" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "ટાઇગ્રીન્યા" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "ટિવ" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "ક્લિંગોન" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "ટ્લિનગિટ" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "ટામાશેક" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "ટોંગા (ન્યાસા)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "ટોંગા (ટોંગા આઇસલેન્ડ્સ)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "ટોક પિસિન" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "ત્સિમશિયન" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "ત્સ્વાના" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "ત્સોનગા" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "ટર્કમેન" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "ટુમબુકા" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "ટુપિ ભાષાઓ" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "ટર્કિશ" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "અલ્ટાઇક (અન્ય)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "ટ્વિ" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "ટુવિનિયન" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "ઉડમુર્ટ" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "યુગારિટિક" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "યુઇઘુર" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "યુક્રેઇનિયન" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "ઉમબુન્દુ" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "અનિશ્ચિત" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "ઊર્દૂ" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "ઉઝબેક" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "વાઈ" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "વેન્ડા" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "વિએટનામિઝ" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "વોલાપુક" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "વોટિક" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "વોકાશન ભાષાઓ" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "વાલામો" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "વારે" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "વાશો" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "વેલ્શ" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "સોરાબિયન ભાષાઓ" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "વલુન" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "વોલોફ" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "કલમ્યક" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "ક્ઝોસા" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "યોઆ" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "યાપેઝ" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "યિડ્ડિશ" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "યોરુબા" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "યુપિક ભાષાઓ" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "ઝાપોટેક" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "ઝેનેગા" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "ઝુઆંગ" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "ઝંડે" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "ઝુલુ" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "ઝુનિ" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "અપરિચિત" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "ડિસ્ક અસ્તિત્વ ધરાવતી નથી." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "અજાણ્યો કમાન્ડ" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "અમાન્ય Url યોજના '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "ડિરેક્ટરી %1 બનાવી શકાતી નથી: %2." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "%s ડેસ્કટોપ આઈટમ ખોલી શકાશે નહીં" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, fuzzy, c-format, boost-format msgid "Adding repository '%s'" msgstr "સાધનો ઉમેરાય છે" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "એક્સપોર્ટ ફાઈલ નું નામ અમાન્ય છે." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "લખવા માટે ફાઇલ ખોલી શકાતી નથી." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "ફ્લોપી ડિસ્કમાંથી વાંચવામાં ભૂલ." #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "સાધનો ઉમેરાય છે" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "%s ડેસ્કટોપ આઈટમ ખોલી શકાશે નહીં" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "VM નું નામ આંકડાથી શરૂ થઇ શકે નહીં." #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr "VM નું નામ આંકડાથી શરૂ થઇ શકે નહીં." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "ચાલુ રાખવું છે? " #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "%s પેકેજ પૂર્ણતા ચકાસણીમાં નિષ્ફળ ગઇ છે. તમે તે ફરીથી ડાઉનલોડ કરવાનો પ્રયત્ન કરવા માંગો " "છો?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "%s પેકેજ પૂર્ણતા ચકાસણીમાં નિષ્ફળ ગઇ છે. તમે તે ફરીથી ડાઉનલોડ કરવાનો પ્રયત્ન કરવા માંગો " "છો?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm ચકાસણી કરવામાં નિષ્ફળ." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm નિષ્ફળ." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "સાધન પ્રકાર VAR1 ફેરફાર-બતાવો ફિચર ને આધાર આપતા નથી" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "%s માંથી %s પૂરું પાડી શકાતું નથી" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "રિપોસીટરીમાં ફાઈલ %1 મળી નહીં." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "ફાઈલ બનાવી શકાતી નથી." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "આ જરૂરિયાત અહીં માત્ર અવગણો" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "આ જરૂરિયાત અહીં માત્ર અવગણો" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "ને જોડાણ માટે વિનંતી કરો:" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "પરાધિનતા મૂશ્કેલીઓને કારણે %s સ્થાપિ શકાયું નથી" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "%s કોઇ આપતું નથી" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "રિક્વેસ્ટ અસ્તિત્વમાં છે જ." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "સૂચના પ્રમાણે સ્થાપન અટકાવેલું હતું." #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "ચલાવો" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "કી એન્ક્રીપ્ટશન દરમિયાન ભૂલ." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "નિષ્ફળ થયું" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s માટે કન્ફિગ્યુરેશન ફાઈલો બદલાઇ:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "%s તરીકે rpm એ %s સાચવ્યું પરંતુ તફાવત જુદો પાડવા તે અશક્ય હતું" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "%s તરીકે rpm એ %s સાચવ્યું.\n" "અહીં તફાવતોના પ્રથમ 25 લાઇનો છે: \n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "%s તરીકે rpm એ %s રચ્યું પરંતુ તફાવત જુદો પાડવા તેઅશક્ય હતું" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "%s તરીકે rpm એ %s રચ્યું.\n" "અહીં તફાવતોના પ્રથમ 25 લાઇનો છે:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "વધારાનું rpm આઉટપુટ:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "%s નું બેકઅપ રચાયું" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "એન્ટ્રી મળી નહીં." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "એન્ટ્રી મળી નહીં." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "એન્ટ્રી મળી નહીં." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1' અસ્તિત્વ ધરાવતી નથી." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1' અસ્તિત્વ ધરાવતી નથી." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "VM શરૂ કરવામાં નિષ્ફળ." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "VM શરૂ કરવામાં નિષ્ફળ." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "એન્ટ્રી મળી નહીં." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "ફાઈલ ખુલી શકતી નથી: %1." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "ફાઈલ ખુલી શકતી નથી: %1." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "અમાન્ય LDAP URL ક્વેરિ સ્ટ્રીંગ" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "અમાન્ય LDAP URL ક્વેરિ પારમિતિ '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Url વસ્તુને ક્લોન કરવામાં અક્ષમ" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "અમાન્ય ખાલી Url વસ્તુ સંદર્ભ" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Url ઘટકોને પાર્સ કરવામાં અક્ષમ" #: zypp-core/base/Exception.cc:186 #, fuzzy msgid "History:" msgstr "XF86History " #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url યોજના %s ને મંજૂરી આપતી નથી" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "અમાન્ય %s ઘટક '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "અમાન્ય %s ઘટક" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "આ URL માટે ક્વેરિ સ્ટ્રીંગ પાર્સિંગ સહાયિત નથી" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url યોજનાને ઘટક જરૂરી છે" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "અમાન્ય Url યોજના '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url યોજના વપરાશકર્તાને મંજૂરી આપતું નથી" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url યોજના પાસવર્ડને મંજૂરી આપતું નથી" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url યોજનાને હોસ્ટ ઘટક જરૂરી છે" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url યોજના હોસ્ટ ઘટકને મંજૂરી આપતું નથી" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "અમાન્ય હોસ્ટ ઘટક '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url યોજનાને પોર્ટને મંજૂરી આપતું નથી" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "અમાન્ય પોર્ટ ઘટક '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url યોજનાને માર્ગ નામ જરૂરી છે" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "હો અધિકૃતિ હાજર હોય તો રિલેટિવ માર્ગની મંજૂરી નથી" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "એનકોડેડ સ્ટ્રીંગમાં NUL બાઇટ સમાવિષ્ટ છે" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "અમાન્ય પારમિતિ એરે સ્પ્લિટ સેપરેટર કેરેક્ટર" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "અમાન્ય પારમિતિ મેપ સ્પ્લિટ સેપરેટર કેરેક્ટર" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "અમાન્ય પારમિતિ એરે જોઇન સ્પ્લિટ સેપરેટર કેરેક્ટર" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "જોડાય ત્યારે કમાન્ડ અમલમાં મૂકવો" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "%s શોધાઈ શકતો નથી." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "%s શોધાઈ શકતો નથી." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "ખુલી શક્તું નથી %s - %s\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "મોડ્યૂલ \"%s\" લોડ કરવામાં નિષ્ફળ." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "રિપોસીટરીમાં ફાઈલ %1 મળી નહીં." #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "ફાઈલ પર લખાઈ શકાતું નથી: %1." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 ડિરેક્ટરી નથી." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "CA નામ ખાલી છે." #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "URL સ્કીમ '%1' અમાન્ય" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "%s ડેસ્કટોપ આઈટમ ખોલી શકાશે નહીં" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr " મંજૂરીઓ નકારાઇ " #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "હા" #: zypp-tui/Table.cc:32 msgid "No" msgstr "ના" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "ચેતવણી" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "ભૂલ" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "પૂર્ણ થયું" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "ભૂલ" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "ચેતવણી" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "શરૂ થઇ રહ્યું છે..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr " મળ્યું નથી " #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "હા" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ના" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે." #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "પેકેજીસનું સ્થાપન દૂર કરવાનો આદેશ" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "%s કોઇ આપતું નથી" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "ડિસ્ક અસ્તિત્વ ધરાવતી નથી." #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s લોક છે અને અસ્થાપિત થઇ શકશે નહીં" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "સ્થાપેલ નથી" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s દ્વારા %s જરૂરી હતું" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "%s સ્થાપિ શકાશે નહીં" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s, %s સાથે વિસંગત છે" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s અલગ પાડવું %s" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s અલગ પાડવું %s" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s, %s સાથે વિસંગત છે" #~ msgid "do not install %s" #~ msgstr "%s સ્થાપશો નહીં" #~ msgid "keep %s" #~ msgstr "%s રાખો" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "%s સ્થાપશો નહીં" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "%s ના કોઇ સ્થાપવાનું પૂરું પાડનાર નથી" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "સંબંધિત રિઝોલ્વેબલ્સ સ્થાપો કે કાઢો નહીં" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "%s સ્થાપો જો કે તે સંરચના બદલી શકે" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s અલગ પાડવું %s" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "%s માંથી %s ડાઉનલોડ થયું" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "સ્થાપન" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "ફાઈલ ખુલી શકતી નથી: %1." #~ msgid "Hal Exception" #~ msgstr "હેલ અપવાદ" #~ msgid "HalContext not connected" #~ msgstr "HalContext જોડાયેલ નથી" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive નો પ્રારંભ થઇ શક્યો નથી" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume નો પ્રારંભ થઇ શક્યો નથી" #~ msgid "Unable to create dbus connection" #~ msgstr "dbus જોડાણ રચવામાં અક્ષમ" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: libhal સંદર્ભ રચાઇ શક્યું નથી" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: dbus જોડાણ સેટ થઇ શક્યું નથી" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "HAL સંદર્ભ પ્રારંભ કરવામાં અક્ષમ -- હેલ્ડ ચાલતું નથી?" #~ msgid "Not a CDROM drive" #~ msgstr "સીડીરોમ ડ્રાઇવ નથી" #~ msgid "Can't initialize mutex attributes" #~ msgstr "મ્યૂટેક્ષ ગુણધર્મ શરૂ કરી શકાયો નથી" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "રિકર્સિવ મ્યૂટેક્ષ ગુણધર્મ સેટ કરી શકાયો નથી" #~ msgid "Can't initialize recursive mutex" #~ msgstr "રિકર્સિવ મ્યૂટેક્ષ શરૂ કરી શકાયો નથી" #~ msgid "Can't acquire the mutex lock" #~ msgstr "મ્યૂટેક્ષ લોક સંપાદિત કરી શકાયો નથી" #~ msgid "Can't release the mutex lock" #~ msgstr "મ્યૂટેક્ષ લોક છોડી શકાયું નથી" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "પબ્લીક કી લાવી શકાતી નથી." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "સ્થાપેલ નથી" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "ખુલી શક્તું નથી %s - %s\n" #~ msgid "Serbia and Montenegro" #~ msgstr "સેરબિયા અને મોન્ટેનેગ્રો" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "અજાણ્યી યાદી વિકલ્પ" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "આશ્રિતોને રિઝોલ્વ કરી શકાયા નહીં" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s ફાઇલ પાસે ચેકસમ નથી.\n" #~ "કોઇ પણ રીતે ફાઇલ વાપરવી છે?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s ફાઈલ નીચેની કળ સાથે પૂર્ણતા ચકાસણીમાં નિષ્ફળ ગઇ છે :\n" #~ "%s|%s|%s\n" #~ "કોઇ પણ રીતે ફાઇલ વાપરવી છે?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s ફાઇલ પાસે અમાન્ય ચેકસમ છે.\n" #~ "%s ની સંભાવના હતી, %s મળી \n" #~ "કોઇ પણ રીતે ફાઇલ વાપરવી છે?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s ફાઇલ પાસે અજાણ્યું %s ચેકસમ છે.\n" #~ "કોઇ પણ રીતે ફાઇલ વાપરવી છે?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "%s ફાઈલ સહી કરેલી નથી \n" #~ "કોઇ પણ રીતે તે વાપરવી છે?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s અજાણી કળ સાથે સહી કરેલી છે :\n" #~ "%s|%s|%s\n" #~ "કોઇ પણ રીતે ફાઇલ વાપરવી છે??" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "અવિશ્વસનીય કળ શોધાઇ છે:\n" #~ "%s|%s|%s\n" #~ "કળ પર વિશ્વાસ કરવો છે?" #~ msgid "%s remove failed" #~ msgstr "%s ને દૂર કરવામાં નિષ્ફળ" #~ msgid "rpm output:" #~ msgstr "rpm આઉટપુટ:" #~ msgid "%s install failed" #~ msgstr "%s નું સ્થાપન નિષ્ફળ" #~ msgid "%s installed ok" #~ msgstr "%s નું સ્થાપન બરાબર" #~ msgid "%s remove ok" #~ msgstr "%s ને દૂર કરવામાં બરાબર" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "%s આ પરાધિનતા પૂરી પાડે છે પરંતુ સ્થાપેલ બાબતનીસંરચના કદાચ બદલી શકે" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "%s આ પરાધિનતા પૂરી પાડે છે પરંતુ સ્થાપેલ બાબતનીસંરચના કદાચ બદલી શકે" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "સંબંધિત રિઝોલ્વેબલ્સ સ્થાપો કે કાઢો નહીં" #~ msgid "Ignore that %s is already set to install" #~ msgstr "પહેલેથી સ્થાપવા સેટ કરેલ તે %s અવગણો" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "%s માં અલગ પાડેલા %s ને અવગણો" #~ msgid "Ignore this conflict of %s" #~ msgstr "%s ની આ વિસંગતતા અવગણો" #~ msgid "Ignore this requirement just here" #~ msgstr "આ જરૂરિયાત અહીં માત્ર અવગણો" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "%s સ્થાપો જો કે તે સંરચના બદલી શકે" #~ msgid "Install missing resolvables" #~ msgstr "છૂટી ગયેલા રિઝોલ્વેબલ્સ સ્થાપો" #~ msgid "Keep resolvables" #~ msgstr "રિઝોલ્વેબલ્સ રાખો" #~ msgid "Unlock these resolvables" #~ msgstr "આ રિઝોલ્વેબલ્સ અનલોક કરો" #~ msgid "delete %s" #~ msgstr "%s કાઢી નાખો" #~ msgid "install %s" #~ msgstr "%s સ્થાપો" #~ msgid "unlock %s" #~ msgstr "%s ને અનલોક કરો" #~ msgid "unlock all resolvables" #~ msgstr "બધા રિઝોલ્વેબલ્સ અનલોક કરો" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "ફાઈલ ખુલી શકતી નથી: %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "%u સેકટર વાંચતી વખતે ભૂલ." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "આ URL માટે માર્ગ પારમિતિ પાર્સિંગ સહાયિત નથી" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "આ URL માટે માર્ગ પારમિતિ પાર્સિંગ સહાયિત નથી" #~ msgid "Software management is already running." #~ msgstr "સોફ્ટવેર મેનેજમેન્ટ પહેલેથી ચાલુ છે" #~ msgid "%s is replaced by %s" #~ msgstr "%s દ્વારા %s ની જગ્યાએ મુકયું" #~ msgid "%s replaced by %s" #~ msgstr "%s દ્વારા %s ની જગ્યાએ મુકાયું" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "આ રિઝોલ્વેબલ્સ સિસ્ટમમાંથી કાઢી નાખવામાં આવશે." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s અસ્થાપિત થશે નહીં કારણકે તે હજુ જરૂરી છે" #~ msgid "Invalid information" #~ msgstr "અમાન્ય માહિતી" #~ msgid "%s is needed by other resolvables" #~ msgstr "અન્ય રિઝોલ્વેબલ્સ દ્વારા %s જરૂરી હતું" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "દ્વારા %s જરૂરી હતુ:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s, અન્ય રિઝોલ્વેબલ્સ સાથે વિસંગત છે" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s આની સાથે વિસંગત છે :\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s અન્ય રિઝોલ્વેબલ્સ અલગ પાડે છે" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "આ રિઝોલ્વેબલ્સ સિસ્ટમમાંથી કાઢી નાખવામાં આવશે." #~ msgid "%s depends on other resolvables" #~ msgstr "%s અન્ય રિઝોલ્વેબલ્સ પર આધાર રાખે છે" #~ msgid "%s depends on %s" #~ msgstr "%s, %s પર આધાર રાખે છે" #~ msgid "%s depends on:%s" #~ msgstr "%s પર આધાર રાખે છે : %s" #~ msgid "Child of" #~ msgstr "નું ચાઇલ્ડ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "કોઇ સ્ત્રોત પ્રાપ્ય નથી જે આ જરૂરિયાતને સહાય કરે." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "આ રિઝોલ્યુશનની ઉપર/નીચે દર્શાવેલ બાકી નિકળતી મૂશ્કેલીઓ બધી પરાધિનતાઓનો ઉકેલલાવી " #~ "શકશે નહીં" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%s સ્થાપિ શકાશે નહીં કારણકે તે %s સાથે વિસંગત છે" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s સ્થપાયું નથી અને અસ્થાપન તરીકે ચિહિત કર્યું હતું" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s પાસે અપૂર્ણ જરૂરિયાતો છે" #~ msgid "%s has missing dependencies" #~ msgstr "%s પાસે છૂટી ગયેલી પરાધિનતા છે" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "છૂટી ગયેલી પરાધિનતાને કારણે %s સ્થાપિ શકાયું નથી" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s, %s ની પરાધિનતા પૂર્ણ કરે છે પરંતુ તે અસ્થાપિત કરાશે" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s, %s ની પરાધિનતા પૂર્ણ કરે છે પરંતુ તે તમારા સિસ્ટમ પર રાખશે" #~ msgid "No need to install %s" #~ msgstr "%s સ્થાપવાની જરૂર નથી" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "%s ની પરાધિનતા પૂર્ણ કરવા %s સ્થાપી શકશે નહીં" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "%s ની પરાધિનતા પૂર્ણ કરવા %s સ્થાપી શકશે નહીં" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s અસ્થાપિત થશે નહીં કારણકે તે હજુ જરૂરી છે" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s અલગ પાડવું %s. પરંતુ %s કાઢી શકાશે નહીં કારણકે તે લોક કરેલું છે." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "%s સ્થાપિત કરી શકાશે નહીં કારણકે તે વિસંગત છે" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s સાથે વિસંગત હોવાથી %s અસ્થાપિત છે" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "જ્યારે %s અદ્યતન કરતા હોવ ત્યારે %s માટે %s જરૂરી છે" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s, %s જરૂરિયાત માટે છૂટી ગયેલ છે" #~ msgid ", Action: " #~ msgstr ", કાર્ય :" #~ msgid ", Trigger: " #~ msgstr ", ટ્રીગર :" #~ msgid "package" #~ msgstr "પેકેજ" #~ msgid "selection" #~ msgstr "પસંદગી" #~ msgid "pattern" #~ msgstr "પેટર્ન" #~ msgid "product" #~ msgstr "પ્રોડક્ટ" #~ msgid "patch" #~ msgstr "પેચ" #~ msgid "script" #~ msgstr "સ્ક્રિપ્ટ" #~ msgid "message" #~ msgstr "સંદેશ" #~ msgid "atom" #~ msgstr "એટમ" #~ msgid "system" #~ msgstr "સિસ્ટમ" #~ msgid "Resolvable" #~ msgstr "રિઝોલ્વેબલ્સ" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "આ ઠરાવ પ્રયત્ન અમાન્ય તરીકે ચિહિત કરો" #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "%s રિઝોલ્વેબલ્સ અસ્થાપિત તરીકે ચિહિત કરો" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "%s સ્થાપવા માટે નિયત છે, પરંતુ વિસંગત મૂશ્કેલીઓનેકારણે આ શક્ય નથી." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "અસ્થાપન માટે જરૂરી છે તે રીતે પહેલેથી ચિહિત છે ત્યાં સુધી %s સ્થાપી શકાશે નહીં" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "તે આ સિસ્ટમ સાથે લાગુ પડતુ નથી ત્યાં સુધી %s સ્થાપી શકાશે નહીં." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "સ્થાપન માટે જરૂરી છે તે રીતે %s પહેલેથી ચિહિત છે ત્યાં સુધી %s સ્થાપીશકાશે નહીં" #~ msgid "This would invalidate %s." #~ msgstr "આ %s ને અપુષ્ટિ કરી શકશે" #~ msgid "Establishing %s" #~ msgstr "%s સ્થપાઇ રહ્યું છે" #~ msgid "Installing %s" #~ msgstr "%s સ્થાપન થઇ રહ્યું છે" #~ msgid "Updating %s to %s" #~ msgstr "%s થી %s માં અદ્યતન થઇ રહ્યું છે" #~ msgid "Skipping %s: already installed" #~ msgstr "%s છોડાઇ રહ્યું છે : પહેલેથી સ્થાપિત છે" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "%s ના કોઇ વૈકલ્પિક સ્થાપવાનું પૂરું પાડનાર નથી" #~ msgid "for %s" #~ msgstr "%s માટે" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "%s ને અદ્યતન કરવા, %s દૂર કરવાનું ટાળવાનું શક્ય નથી" #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ અસ્થાપન માટે નિયત છે." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તે %s ની અન્ય આવૃતિ પહેલેથી સ્થાપિત છે." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s, %s પૂરું પાડે છે, પરંતુ તે અસ્થાપિત છે. વધુ વિગતો માટે તે તેના પોતાના પર સ્થાપવાનો " #~ "પ્રયત્ન કરો." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તે લોક કરેલું છે." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તે રાખવા માટે નિયત કરાયેલું છે." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s, %s પૂરું પાડે છે, પરંતુ તેની પાસે બીજી સંરચના છે." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "%s માટે %s જરૂરિયાત સંતુષ્ટ કરી શકતું નથી" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "%s, અન્ય સ્થાપિત છે તે રિઝોલ્વેબલ દ્વારા જરૂરી છે, તેથી તે અનલિંક થઇ શકશેનહીં." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "%s, અન્ય સ્થાપિત છે તે રિઝોલ્વેબલ દ્વારા જરૂરી છે, તેથી તે અનલિંક થઇ શકશેનહીં." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "%s (%s) ની વિસંગતતા સ્થાપિત કરવાનું છે તે %s ને દૂર કરવાનું જરૂરી બનાવે છે" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "%s ની વિસંગતતાના કારણે %s ને અસ્થાપિત તરીકે ચિહિત કરો" #~ msgid "from %s" #~ msgstr "%s માંથી" #~ msgid " Error!" #~ msgstr "ભૂલ!" #~ msgid " Important!" #~ msgstr "અગત્યનું!" #~ msgid "%s depended on %s" #~ msgstr "%s, %s પર આધાર રાખ્યો" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s દ્વારા %s જરૂરી હતું" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s દ્વારા %s જરૂરી હતું" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s દ્વારા %s ની જગ્યાએ મુકયું" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s દ્વારા %s જરૂરી હતું" #~ msgid "%s part of %s" #~ msgstr "%s, %s નો ભાગ છે" #, fuzzy #~ msgid "Double timeout" #~ msgstr " ડબલ-ક્લિક ટાઇમઆઉટ " #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s દ્વારા %s જરૂરી હતું" #~ msgid "Unable to parse Url authority" #~ msgstr "Url અધિકૃતિ પાર્સ કરવા અક્ષમ" #~ msgid "Ignore this requirement generally" #~ msgstr "સામાન્ય રીતે આ જરૂરિયાત અવગણો" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s, અન્ય સ્થાપિત કરવાનું છે તે રિઝોલ્વેબલ દ્વારા જરૂરી છે, તેથી તે અનલિંક થઇ શકશેનહીં." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "અદ્યતન સ્થાપન કરવામાં જરૂરી ફાઈલ રચી શકાઇ નથી" #~ msgid "Unable to restore all sources." #~ msgstr "બધા સ્ત્રોતો પુનસ્થાપન કરવા અક્ષમ" #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "ઓછામાં ઓછું એક સ્ત્રોત પહેલેથી નોંધાયેલ છે, સંગ્રહ કરાયેલા સ્ત્રોતો પુનસંગ્રહ થઇ શકતો નથી." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "%s ની પરાધિનતા પૂર્ણ કરવા %s સ્થપાઇ શકશે નહીં" #~ msgid "%s dependend on %s" #~ msgstr "%s, %s પર આધારિત" #~ msgid "Reading index files" #~ msgstr "ઇન્ડેક્સ ફાઇલો વંચાઇ રહી છે" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "સહી કરેલી repomd.xml ફાઇલ સહી તપાસવામાં નિષ્ફળ ગઇ." #~ msgid "Reading product from %s" #~ msgstr "%s માંથી પ્રોડક્ટ વંચાઇ રહી છે" #~ msgid "Reading filelist from %s" #~ msgstr "%s માંથી ફાઇલયાદી વંચાઇ રહી છે" #~ msgid "Reading packages from %s" #~ msgstr "%s માંથી પેકેજીસ વંચાઇ રહ્યા છે" #~ msgid "Reading selection from %s" #~ msgstr "%s માંથી પસંદગી વંચાઇ રહી છે" #~ msgid "Reading pattern from %s" #~ msgstr "%s માંથી પેટર્ન વંચાઇ રહ્યા છે" #~ msgid "Reading patches index %s" #~ msgstr "%s માંથી પેચિસ ઇન્ડેક્સ વંચાઇ રહ્યા છે" #~ msgid "Reading patch %s" #~ msgstr "%s પેચ વંચાઇ રહ્યા છે" #~ msgid "The script file failed the checksum test." #~ msgstr "સ્ક્રિપ્ટ ફાઇલ ચેકસમ પરિક્ષણ કરવામાં નિષ્ફળ ગઇ." #~ msgid "Reading packages file" #~ msgstr "પેકેજીસ ફાઇલ વંચાઇ રહી છે" #~ msgid "Reading translation: %s" #~ msgstr "ભાષાંતર વંચાઈ રહ્યું છે : %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "%s પેકેજ પૂર્ણતા ચકાસણીમાં નિષ્ફળ ગઇ છે. તમે તે ફરીથી ડાઉનલોડ કરવાનો પ્રયત્ન કરવા " #~ "માંગો છો.અથવા સ્થાપન અટકાવવું છે?" #~ msgid " miss checksum." #~ msgstr "ચેકસમ છૂટી ગયું છે." #~ msgid " fails checksum verification." #~ msgstr "ચેકસમ ખરાઇમાં નિષ્ફળ" #~ msgid "Downloading %s" #~ msgstr "%s ડાઉનલોડ થઇ રહ્યું છે" libzypp-17.36.5/po/he.po000066400000000000000000003301231476576476200147720ustar00rootroot00000000000000# 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: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2004-08-09 10:24+0200\n" "Last-Translator: xxx \n" "Language-Team: Hebrew \n" "Language: he\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" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 #, fuzzy msgid "No Code" msgstr "מצב" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "איחוד הנסיכויות הערביות" #. :ARE:784: #: zypp/CountryCode.cc:160 #, fuzzy msgid "Afghanistan" msgstr "פקיסטן" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "אלבניה" # AR #. :ALB:008: #: zypp/CountryCode.cc:164 #, fuzzy msgid "Armenia" msgstr "ארגנטינה" # NL #. :ARM:051: #: zypp/CountryCode.cc:165 #, fuzzy msgid "Netherlands Antilles" msgstr "הולנד" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "" # AR #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "ארגנטינה" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" # AT #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "אוסטריה" # AU #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "אוסטרליה" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "" # IE #. :ABW:533: #: zypp/CountryCode.cc:173 #, fuzzy msgid "Aland Islands" msgstr "איי פר-אר" #. :ALA:248: #: zypp/CountryCode.cc:174 #, fuzzy msgid "Azerbaijan" msgstr "אזרביג'נית" #. :AZE:031: #: zypp/CountryCode.cc:175 #, fuzzy msgid "Bosnia and Herzegovina" msgstr "בוסניה הרצגובינה" # BB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "ברבדוס" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "בנגלדש" # BE #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "בלגיה" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" # BG #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "בולגריה" #. :BGR:100: #: zypp/CountryCode.cc:181 #, fuzzy msgid "Bahrain" msgstr "בחריין" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "" #. :BDI:108: #: zypp/CountryCode.cc:183 #, fuzzy msgid "Benin" msgstr "בנגאלית" #. :BEN:204: #: zypp/CountryCode.cc:184 #, fuzzy msgid "Bermuda" msgstr "גרמנית" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" # BO #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "בוליביה" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "" # PA #. :BRA:076: #: zypp/CountryCode.cc:188 #, fuzzy msgid "Bahamas" msgstr "פנמה" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "" # IE #. :BTN:064: #: zypp/CountryCode.cc:190 #, fuzzy msgid "Bouvet Island" msgstr "איי פר-אר" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "בוטסואנה" # BY #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "בלרוס" #. :BLR:112: #: zypp/CountryCode.cc:193 #, fuzzy msgid "Belize" msgstr "בלגית" # CA #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "קנדה" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "" # DO #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "סוריה" # CH #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "שוייץ" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" # IE #. :CIV:384: #: zypp/CountryCode.cc:201 #, fuzzy msgid "Cook Islands" msgstr "איי פר-אר" # CL #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "צ'ילה" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "" # CN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "סין" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "קולומביה" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "קוסטה ריקה" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" # DO #. :CYP:196: #: zypp/CountryCode.cc:211 #, fuzzy msgid "Czech Republic" msgstr "הרפובליקה הדומיניקנית" # DE #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "גרמניה" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "" # DK #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "דנמרק" # RO #. :DNK:208: #: zypp/CountryCode.cc:215 #, fuzzy msgid "Dominica" msgstr "רומניה" # DO #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "הרפובליקה הדומיניקנית" # BG #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "אלג'יר" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "אקוודור" # EE #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "אסטוניה" # EG #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "מצרים" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" # ES #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "ספרד" # EE #. :ESP:724: #: zypp/CountryCode.cc:224 #, fuzzy msgid "Ethiopia" msgstr "אסטוניה" # FI #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "פינלנד" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" # IE #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "איי פר-אר" # FR #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "צרפת" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "" # GD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "גרנדה" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr " ג'ורג'יה" #. :GEO:268: #: zypp/CountryCode.cc:236 #, fuzzy msgid "French Guiana" msgstr "צרפתית (קנדה)" # DE #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "גרמניה" # CN #: zypp/CountryCode.cc:238 #, fuzzy msgid "Ghana" msgstr "סין" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "" # GD #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "גרינלנד" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" # GR #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "יוון" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" # GT #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "גואטמלה" #. :GTM:320: #: zypp/CountryCode.cc:248 #, fuzzy msgid "Guam" msgstr "משחקים" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "הונג-קונג" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" # HN #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "הונדורס" # HR #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "קרואטיה" #. :HRV:191: #: zypp/CountryCode.cc:255 #, fuzzy msgid "Haiti" msgstr "המתן" # HU #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "הונגריה" # ID #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "אינדונזיה" # IE #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "אירלנד" # IL #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "ישראל" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" # IN #: zypp/CountryCode.cc:261 msgid "India" msgstr "הודו" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" # IQ #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "עירק" # IQ #. :IRQ:368: #: zypp/CountryCode.cc:264 #, fuzzy msgid "Iran" msgstr "עירק" # IS #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "איסלנד" # IT #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "איטליה" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "" # JO #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "ירדן" # JP #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "יפן" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 #, fuzzy msgid "Cambodia" msgstr "קולומביה" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" # Frame description in suggested partition for mode accept modify .. #. :KIR:296: #: zypp/CountryCode.cc:275 #, fuzzy msgid "Comoros" msgstr "בחרו" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "" # ZA #. :PRK:408: #: zypp/CountryCode.cc:278 #, fuzzy msgid "South Korea" msgstr "דרום אפריקה" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "כווית " # IE #. :KWT:414: #: zypp/CountryCode.cc:280 #, fuzzy msgid "Cayman Islands" msgstr "איי פר-אר" #. :CYM:136: #: zypp/CountryCode.cc:281 #, fuzzy msgid "Kazakhstan" msgstr "פקיסטן" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "לבנון" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "" #. :LIE:438: #: zypp/CountryCode.cc:286 #, fuzzy msgid "Sri Lanka" msgstr "סרבית" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" # LT #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "ליטא" # LU #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "לוקסמבורג" # LV #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "לטביה" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "מרוקו" #. :MAR:504: #: zypp/CountryCode.cc:294 #, fuzzy msgid "Monaco" msgstr "שני" #. :MCO:492: #: zypp/CountryCode.cc:295 #, fuzzy msgid "Moldova" msgstr "סלובקית" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "לווין" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "" # IE #. :MDG:450: #: zypp/CountryCode.cc:299 #, fuzzy msgid "Marshall Islands" msgstr "איי פר-אר" # MK #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "מקדונית" #. :MKD:807: #: zypp/CountryCode.cc:301 #, fuzzy msgid "Mali" msgstr "&דואר" # PA #. :MLI:466: #: zypp/CountryCode.cc:302 #, fuzzy msgid "Myanmar" msgstr "פנמה" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "" #. :MNG:496: #: zypp/CountryCode.cc:304 #, fuzzy msgid "Macao" msgstr "מאורית" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "" #. :MNP:580: #: zypp/CountryCode.cc:306 #, fuzzy msgid "Martinique" msgstr "דקה" # LT #. :MTQ:474: #: zypp/CountryCode.cc:307 #, fuzzy msgid "Mauritania" msgstr "ליטא" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" # MT #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "מלטה" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "" #. :MUS:480: #: zypp/CountryCode.cc:311 #, fuzzy msgid "Maldives" msgstr "מלטזית" # MT #. :MDV:462: #: zypp/CountryCode.cc:312 #, fuzzy msgid "Malawi" msgstr "מלטה" # MX #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "מקסיקו" # MT #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "מלזיה " #. :MYS:458: #: zypp/CountryCode.cc:315 #, fuzzy msgid "Mozambique" msgstr "נייד" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "" # MK #. :NAM:516: #: zypp/CountryCode.cc:317 #, fuzzy msgid "New Caledonia" msgstr "מקדונית" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" # IE #. :NER:562: #: zypp/CountryCode.cc:319 #, fuzzy msgid "Norfolk Island" msgstr "איי פר-אר" # BG #. :NFK:574: #: zypp/CountryCode.cc:320 #, fuzzy msgid "Nigeria" msgstr "אלג'יר" # PY #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "ניקאראגואה" # NL #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "הולנד" # NO #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "נורבגיה" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "" #. :NRU:520: #: zypp/CountryCode.cc:326 #, fuzzy msgid "Niue" msgstr "דקה" # NZ #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "ניו זילנד" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "עומן" # PA #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "פנמה" # PE #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "פרו" #. :PER:604: #: zypp/CountryCode.cc:331 #, fuzzy msgid "French Polynesia" msgstr "צרפתית (קנדה)" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "הפיליפינים" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "פקיסטן" # PL #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "פולין" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 #, fuzzy msgid "Pitcairn" msgstr "פקיסטן" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "פורטו ריקו" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" # PT #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "פורטוגל" # PA #. :PRT:620: #: zypp/CountryCode.cc:341 #, fuzzy msgid "Palau" msgstr "פאלם" # PY #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "פרגואי" # MT #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "קטאר" #. :QAT:634: #: zypp/CountryCode.cc:344 #, fuzzy msgid "Reunion" msgstr "&אזור" # RO #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "רומניה" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "סרבית" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" # CA #. :RUS:643: #: zypp/CountryCode.cc:348 #, fuzzy msgid "Rwanda" msgstr "קנדה" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "ערב הסעודית" # IE #. :SAU:682: #: zypp/CountryCode.cc:350 #, fuzzy msgid "Solomon Islands" msgstr "איי פר-אר" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" # SD #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "סודן" # SE #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "שבדיה" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "סינגפור" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" # SI #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "סלובניה" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" # SK #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "סלובקיה" # Device type label #. :SVK:703: #: zypp/CountryCode.cc:359 #, fuzzy msgid "Sierra Leone" msgstr "קו סיריאלי" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 #, fuzzy msgid "Senegal" msgstr "בנגאלית" # RO #. :SEN:686: #: zypp/CountryCode.cc:362 #, fuzzy msgid "Somalia" msgstr "רומניה" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" # SV #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "אל סלבדור" #. :SLV:222: #: zypp/CountryCode.cc:366 #, fuzzy msgid "Syria" msgstr "סרבית" # TH #. :SYR:760: #: zypp/CountryCode.cc:367 #, fuzzy msgid "Swaziland" msgstr "תאילנד" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" # CA #. :TCA:796: #: zypp/CountryCode.cc:369 #, fuzzy msgid "Chad" msgstr "כרטיס" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" # TH #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "תאילנד" # TW #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "טאג'יקיסטן" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" # TW #. :TKL:772: #: zypp/CountryCode.cc:375 #, fuzzy msgid "Turkmenistan" msgstr "טאג'יקיסטן" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "טוניס" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" # TR #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "טורקיה" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 #, fuzzy msgid "Tuvalu" msgstr "דיבור" # TH #. :TUV:798: #: zypp/CountryCode.cc:382 #, fuzzy msgid "Taiwan" msgstr "תאילנד" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" # UA #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "אוקראינה" # CA #. :UKR:804: #: zypp/CountryCode.cc:385 #, fuzzy msgid "Uganda" msgstr "קנדה" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 #, fuzzy msgid "United States" msgstr "איחוד הנסיכויות הערביות" # UY #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "אורוגואי" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "אוסביקיסטן" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" # VE #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "ונצואלה" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 #, fuzzy msgid "Vietnam" msgstr "וייטנאמית" # ComboBox item #. :VNM:704: #: zypp/CountryCode.cc:396 #, fuzzy msgid "Vanuatu" msgstr "מדריך" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "תימן" # ComboBox item #. :YEM:887: #: zypp/CountryCode.cc:400 #, fuzzy msgid "Mayotte" msgstr "אדון" # ZA #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "דרום אפריקה" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "זימבבואה " #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" # main dialog: Button Delete partition #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "&מחק" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 #, fuzzy msgid "Abkhazian" msgstr "אלבניה" #. language code: ace #: zypp/LanguageCode.cc:165 #, fuzzy msgid "Achinese" msgstr "סינית" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "אפריקנס" # Edit field label for linux partition size in non-graphical mode #. language code: ain #: zypp/LanguageCode.cc:179 #, fuzzy msgid "Ainu" msgstr "לינוקס:" #. language code: aka ak #: zypp/LanguageCode.cc:181 #, fuzzy msgid "Akan" msgstr "אפריקנס" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 #, fuzzy msgid "Albanian" msgstr "אלבניה" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" # BD #. language code: alg #: zypp/LanguageCode.cc:191 #, fuzzy msgid "Algonquian Languages" msgstr "שפות" # ZA #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "דרום אפריקה" #. language code: amh am #: zypp/LanguageCode.cc:195 #, fuzzy msgid "Amharic" msgstr "ערבית" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" # BD #. language code: apa #: zypp/LanguageCode.cc:199 #, fuzzy msgid "Apache Languages" msgstr "שפות" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "ערבית" #. language code: arc #: zypp/LanguageCode.cc:203 #, fuzzy msgid "Aramaic" msgstr "ערבית" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" # AR #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 #, fuzzy msgid "Armenian" msgstr "ארגנטינה" # UA #. language code: arn #: zypp/LanguageCode.cc:211 #, fuzzy msgid "Araucanian" msgstr "אוקראינית" #. language code: arp #: zypp/LanguageCode.cc:213 #, fuzzy msgid "Arapaho" msgstr "גרף" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 #, fuzzy msgid "Assamese" msgstr "משחקים" # AT #. language code: ast #: zypp/LanguageCode.cc:221 #, fuzzy msgid "Asturian" msgstr "אוסטריה" # BD #. language code: ath #: zypp/LanguageCode.cc:223 #, fuzzy msgid "Athapascan Languages" msgstr "שפות" #. language code: aus #: zypp/LanguageCode.cc:225 #, fuzzy msgid "Australian Languages" msgstr "רשימת כל השפות האפשרויות" #. language code: ava av #: zypp/LanguageCode.cc:227 #, fuzzy msgid "Avaric" msgstr "ערבית" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "אזרביג'נית" # CA #. language code: bad #: zypp/LanguageCode.cc:237 #, fuzzy msgid "Banda" msgstr "קנדה" # BD #. language code: bai #: zypp/LanguageCode.cc:239 #, fuzzy msgid "Bamileke Languages" msgstr "שפות" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 #, fuzzy msgid "Balinese" msgstr "בסיס" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "בסקית" #. language code: bas #: zypp/LanguageCode.cc:253 #, fuzzy msgid "Basa" msgstr "בסיס" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" # BY #. language code: bel be #: zypp/LanguageCode.cc:259 #, fuzzy msgid "Belarusian" msgstr "בלרוס" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "בנגאלית" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 #, fuzzy msgid "Bihari" msgstr "בחריין" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 #, fuzzy msgid "Bosnian" msgstr "רומנית" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "ברטונית" # ID #. language code: btk #: zypp/LanguageCode.cc:287 #, fuzzy msgid "Batak (Indonesia)" msgstr "אינדונזיה" # BG #. language code: bua #: zypp/LanguageCode.cc:289 #, fuzzy msgid "Buriat" msgstr "בולגריה" #. language code: bug #: zypp/LanguageCode.cc:291 #, fuzzy msgid "Buginese" msgstr "סינית" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "בולגרית" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 #, fuzzy msgid "Blin" msgstr "בלגית" # CA #. language code: cad #: zypp/LanguageCode.cc:301 #, fuzzy msgid "Caddo" msgstr "כרטיס" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" # CA #. language code: car #: zypp/LanguageCode.cc:305 #, fuzzy msgid "Carib" msgstr "כרטיס" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "קטלונית" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 #, fuzzy msgid "Cebuano" msgstr "לבנון" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" # CN #. language code: chb #: zypp/LanguageCode.cc:317 #, fuzzy msgid "Chibcha" msgstr "סין" #. language code: che ce #: zypp/LanguageCode.cc:319 #, fuzzy msgid "Chechen" msgstr "צ'כית" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "סינית" #. language code: chk #: zypp/LanguageCode.cc:327 #, fuzzy msgid "Chuukese" msgstr "סינית" #. language code: chm #: zypp/LanguageCode.cc:329 #, fuzzy msgid "Mari" msgstr "מאורית" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" # BD #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "שפות" #. language code: cop #: zypp/LanguageCode.cc:347 #, fuzzy msgid "Coptic" msgstr "מיחשוב" #. language code: cor kw #: zypp/LanguageCode.cc:349 #, fuzzy msgid "Cornish" msgstr "אירית" #. language code: cos co #: zypp/LanguageCode.cc:351 #, fuzzy msgid "Corsican" msgstr "קוסטה ריקה" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" # HR # heading text #. language code: cre cr #: zypp/LanguageCode.cc:359 #, fuzzy msgid "Cree" msgstr "צור" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "צ'כית" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "דנית" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 #, fuzzy msgid "Dayak" msgstr "יום:" # Table header 4/4 #. language code: del #: zypp/LanguageCode.cc:381 #, fuzzy msgid "Delaware" msgstr "חומרה" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 #, fuzzy msgid "Dinka" msgstr "כונן" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 #, fuzzy msgid "Dogri" msgstr "מאורית" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 #, fuzzy msgid "Lower Sorbian" msgstr "סרבית" #. language code: dua #: zypp/LanguageCode.cc:397 #, fuzzy msgid "Duala" msgstr "יומי" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "הולנדית" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 #, fuzzy msgid "English" msgstr "אנגלית (אנגליה)" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "אספרנטו" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "אסטונית" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" # Column header: minimum = 4 characters fill with space if needed #. language code: ewo #: zypp/LanguageCode.cc:427 #, fuzzy msgid "Ewondo" msgstr "סוף" # FR #. language code: fan #: zypp/LanguageCode.cc:429 #, fuzzy msgid "Fang" msgstr "צרפת" # Label for free part of the partition in non-graphical mode # Label for free part of the Windows partition in non-graphical mode #. language code: fao fo #: zypp/LanguageCode.cc:431 #, fuzzy msgid "Faroese" msgstr "פנוי:" #. language code: fat #: zypp/LanguageCode.cc:433 #, fuzzy msgid "Fanti" msgstr "פונטים" # FI #. language code: fij fj #: zypp/LanguageCode.cc:435 #, fuzzy msgid "Fijian" msgstr "פינלנד" #. language code: fil #: zypp/LanguageCode.cc:437 #, fuzzy msgid "Filipino" msgstr "הפיליפינים" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "פינית" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 #, fuzzy msgid "Fon" msgstr "פונטים" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "צרפתית" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" # label text #. language code: fry fy #: zypp/LanguageCode.cc:453 #, fuzzy msgid "Frisian" msgstr "&גירסת FS" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" # FI #. language code: fur #: zypp/LanguageCode.cc:457 #, fuzzy msgid "Friulian" msgstr "פינלנד" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 #, fuzzy msgid "Germanic (Other)" msgstr "גרמנית (עם מקשים מתים)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 #, fuzzy msgid "Georgian" msgstr " ג'ורג'יה" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "גרמנית" #. language code: gez #: zypp/LanguageCode.cc:475 #, fuzzy msgid "Geez" msgstr "יוונית" #. language code: gil #: zypp/LanguageCode.cc:477 #, fuzzy msgid "Gilbertese" msgstr "וייטנאמית" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "אירית" #. language code: glg gl #: zypp/LanguageCode.cc:483 #, fuzzy msgid "Galician" msgstr "איטלקית" # ComboBox item #. language code: glv gv #: zypp/LanguageCode.cc:485 #, fuzzy msgid "Manx" msgstr "מדריך" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" # SD #. language code: gon #: zypp/LanguageCode.cc:491 #, fuzzy msgid "Gondi" msgstr "קול" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 #, fuzzy msgid "Grebo" msgstr "קבוצה" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 #, fuzzy msgid "Guarani" msgstr "הונגרית" #. language code: guj gu #: zypp/LanguageCode.cc:507 #, fuzzy msgid "Gujarati" msgstr "אורך" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" # Table header 4/4 #. language code: hai #: zypp/LanguageCode.cc:511 #, fuzzy msgid "Haida" msgstr "חומרה" #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "לטבית" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "עברית" #. language code: her hz #: zypp/LanguageCode.cc:521 #, fuzzy msgid "Herero" msgstr "שגיאה" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 #, fuzzy msgid "Hindi" msgstr "סוג" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 #, fuzzy msgid "Upper Sorbian" msgstr "סרבית" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "הונגרית" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "איסלנדית" # Column header #. language code: ido io #: zypp/LanguageCode.cc:549 #, fuzzy msgid "Ido" msgstr "Id" # LT #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "ליטא" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 #, fuzzy msgid "Interlingue" msgstr "המשך" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "אינדונזית" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" # IN #. language code: ipk ik #: zypp/LanguageCode.cc:571 #, fuzzy msgid "Inupiaq" msgstr "הודו" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" # BD #. language code: iro #: zypp/LanguageCode.cc:575 #, fuzzy msgid "Iroquoian Languages" msgstr "שפות" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "איטלקית" #. language code: jav jv #: zypp/LanguageCode.cc:579 #, fuzzy msgid "Javanese" msgstr "יפנית" #. language code: jbo #: zypp/LanguageCode.cc:581 #, fuzzy msgid "Lojban" msgstr "לבנון" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "יפנית" #. language code: jpr #: zypp/LanguageCode.cc:585 #, fuzzy msgid "Judeo-Persian" msgstr "אינדונזית" #. language code: jrb #: zypp/LanguageCode.cc:587 #, fuzzy msgid "Judeo-Arabic" msgstr "ערבית" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 #, fuzzy msgid "Kabyle" msgstr "מאופשר" #. language code: kac #: zypp/LanguageCode.cc:593 #, fuzzy msgid "Kachin" msgstr "בחריין" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" # CA #. language code: kan kn #: zypp/LanguageCode.cc:599 #, fuzzy msgid "Kannada" msgstr "קנדה" #. language code: kar #: zypp/LanguageCode.cc:601 #, fuzzy msgid "Karen" msgstr "קוריאנית" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 #, fuzzy msgid "Kanuri" msgstr "כורדית" #. language code: kaw #: zypp/LanguageCode.cc:607 #, fuzzy msgid "Kawi" msgstr "כווית " #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 #, fuzzy msgid "Khasi" msgstr "תאילנדית" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 #, fuzzy msgid "Khmer" msgstr "אחר" #. language code: kho #: zypp/LanguageCode.cc:619 #, fuzzy msgid "Khotanese" msgstr "סינית" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 #, fuzzy msgid "Kimbundu" msgstr "סוג" #. language code: kok #: zypp/LanguageCode.cc:629 #, fuzzy msgid "Konkani" msgstr "קוריאנית" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "קוריאנית" #. language code: kos #: zypp/LanguageCode.cc:637 #, fuzzy msgid "Kosraean" msgstr "קוריאנית" #. language code: kpe #: zypp/LanguageCode.cc:639 #, fuzzy msgid "Kpelle" msgstr "איות" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 #, fuzzy msgid "Kurukh" msgstr "טורקית" # PA #. language code: kua kj #: zypp/LanguageCode.cc:647 #, fuzzy msgid "Kuanyama" msgstr "פנמה" #. language code: kum #: zypp/LanguageCode.cc:649 #, fuzzy msgid "Kumyk" msgstr "דמה" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "כורדית" #. language code: kut #: zypp/LanguageCode.cc:653 #, fuzzy msgid "Kutenai" msgstr "כווית " #. language code: lad #: zypp/LanguageCode.cc:655 #, fuzzy msgid "Ladino" msgstr "רדיו" # CA #. language code: lah #: zypp/LanguageCode.cc:657 #, fuzzy msgid "Lahnda" msgstr "קנדה" # Column header #. language code: lam #: zypp/LanguageCode.cc:659 #, fuzzy msgid "Lamba" msgstr "תווית" #. language code: lao lo #: zypp/LanguageCode.cc:661 #, fuzzy msgid "Lao" msgstr "לבנון" #. language code: lat la #: zypp/LanguageCode.cc:663 #, fuzzy msgid "Latin" msgstr "לטבית" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "לטבית" #. language code: lez #: zypp/LanguageCode.cc:667 #, fuzzy msgid "Lezghian" msgstr "בלגית" # LU #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "לוקסמבורג" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "ליטאית" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 #, fuzzy msgid "Lozi" msgstr "&חיבור" # LU #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "לוקסמבורג" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" # CA #. language code: lug lg #: zypp/LanguageCode.cc:685 #, fuzzy msgid "Ganda" msgstr "קנדה" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" # SD #. language code: lun #: zypp/LanguageCode.cc:689 #, fuzzy msgid "Lunda" msgstr "ראשון" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "תאילנדית" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "מקדונית" #. language code: mad #: zypp/LanguageCode.cc:699 #, fuzzy msgid "Madurese" msgstr "מלטזית" # MT #. language code: mag #: zypp/LanguageCode.cc:701 #, fuzzy msgid "Magahi" msgstr "מתמטיקה" #. language code: mah mh #: zypp/LanguageCode.cc:703 #, fuzzy msgid "Marshallese" msgstr "מלטזית" # MT #. language code: mai #: zypp/LanguageCode.cc:705 #, fuzzy msgid "Maithili" msgstr "מתמטיקה" # MT #. language code: mak #: zypp/LanguageCode.cc:707 #, fuzzy msgid "Makasar" msgstr "מלזיה " # MT #. language code: mal ml #: zypp/LanguageCode.cc:709 #, fuzzy msgid "Malayalam" msgstr "מלזיה " #. language code: man #: zypp/LanguageCode.cc:711 #, fuzzy msgid "Mandingo" msgstr "אזהרה" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "מאורית" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" # MT #. language code: mar mr #: zypp/LanguageCode.cc:719 #, fuzzy msgid "Marathi" msgstr "מתמטיקה" # MT #. language code: mas #: zypp/LanguageCode.cc:721 #, fuzzy msgid "Masai" msgstr "מלזיה " # MT #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "מלטה" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" # ComboBox item #. language code: mdr #: zypp/LanguageCode.cc:729 #, fuzzy msgid "Mandar" msgstr "מדריך" #. language code: men #: zypp/LanguageCode.cc:731 #, fuzzy msgid "Mende" msgstr "מצב" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" # label text #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "בחרו שפה:" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" # MT #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "מלזיה " #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "מלטזית" # ComboBox item #. language code: mnc #: zypp/LanguageCode.cc:747 #, fuzzy msgid "Manchu" msgstr "מדריך" #. language code: mni #: zypp/LanguageCode.cc:749 #, fuzzy msgid "Manipuri" msgstr "מאורית" # BD #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "שפות" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "יגוסלביה" #. language code: mon mn #: zypp/LanguageCode.cc:757 #, fuzzy msgid "Mongolian" msgstr "מקדונית" #. language code: mos #: zypp/LanguageCode.cc:759 #, fuzzy msgid "Mossi" msgstr "מורס" # BD #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "שפות" # BD #. language code: mun #: zypp/LanguageCode.cc:763 #, fuzzy msgid "Munda languages" msgstr "שפות" #. language code: mus #: zypp/LanguageCode.cc:765 #, fuzzy msgid "Creek" msgstr "יוונית" #. language code: mwl #: zypp/LanguageCode.cc:767 #, fuzzy msgid "Mirandese" msgstr "מלטזית" # Table header 4/4 #. language code: mwr #: zypp/LanguageCode.cc:769 #, fuzzy msgid "Marwari" msgstr "חומרה" # BD #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "שפות" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" # ComboBox item #. language code: nah #: zypp/LanguageCode.cc:775 #, fuzzy msgid "Nahuatl" msgstr "מדריך" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 #, fuzzy msgid "Navajo" msgstr "ניווט" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "גרמנית" #. language code: nep ne #: zypp/LanguageCode.cc:793 #, fuzzy msgid "Nepali" msgstr "בנגאלית" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 #, fuzzy msgid "Norwegian Nynorsk" msgstr "הנורבגית" #. language code: nob nb #: zypp/LanguageCode.cc:805 #, fuzzy msgid "Norwegian Bokmal" msgstr "הנורבגית" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "הנורבגית" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "" # BD #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "שפות" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" # CL #. language code: nya ny #: zypp/LanguageCode.cc:819 #, fuzzy msgid "Chichewa" msgstr "צ'ילה" # table header texts #. language code: nym #: zypp/LanguageCode.cc:821 #, fuzzy msgid "Nyamwezi" msgstr "שם" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 #, fuzzy msgid "Ossetian" msgstr "רוסית" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" # BD #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "שפות" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 #, fuzzy msgid "Pangasinan" msgstr "הונגרית" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" # PY #. language code: pam #: zypp/LanguageCode.cc:851 #, fuzzy msgid "Pampanga" msgstr "פרגואי" #. language code: pan pa #: zypp/LanguageCode.cc:853 #, fuzzy msgid "Panjabi" msgstr "פונוגאבי" #. language code: pap #: zypp/LanguageCode.cc:855 #, fuzzy msgid "Papiamento" msgstr "ניהול" # PY #. language code: pau #: zypp/LanguageCode.cc:857 #, fuzzy msgid "Palauan" msgstr "פרגואי" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 #, fuzzy msgid "Persian" msgstr "סרבית" #. language code: phi #: zypp/LanguageCode.cc:865 #, fuzzy msgid "Philippine (Other)" msgstr "הפיליפינים" #. language code: phn #: zypp/LanguageCode.cc:867 #, fuzzy msgid "Phoenician" msgstr "סלובנית" # PA #. language code: pli pi #: zypp/LanguageCode.cc:869 #, fuzzy msgid "Pali" msgstr "פאלם" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "פולנית" #. language code: pon #: zypp/LanguageCode.cc:873 #, fuzzy msgid "Pohnpeian" msgstr "אינדונזית" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "פורטוגזית" #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "שפה עיקרית: %1" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" # TW #. language code: raj #: zypp/LanguageCode.cc:885 #, fuzzy msgid "Rajasthani" msgstr "טאג'יקיסטן" # JP #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "יפן" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" # RO #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "רומניה" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "רומנית" # SD #. language code: run rn #: zypp/LanguageCode.cc:901 #, fuzzy msgid "Rundi" msgstr "קול" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "רוסית" # CA #. language code: sad #: zypp/LanguageCode.cc:905 #, fuzzy msgid "Sandawe" msgstr "קנדה" # SD #. language code: sag sg #: zypp/LanguageCode.cc:907 #, fuzzy msgid "Sango" msgstr "סודן" #. language code: sah #: zypp/LanguageCode.cc:909 #, fuzzy msgid "Yakut" msgstr "נקודת שבירה" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" # BD #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "שפות" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" # Column header: minimum = 5 characters fill with space if needed #. language code: san sa #: zypp/LanguageCode.cc:917 #, fuzzy msgid "Sanskrit" msgstr "התחלה" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 #, fuzzy msgid "Santali" msgstr "לווין" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "סרבית" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 #, fuzzy msgid "Scots" msgstr "איקונים" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "קרואטית" #. language code: sel #: zypp/LanguageCode.cc:935 #, fuzzy msgid "Selkup" msgstr "דלג" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" # BD #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "שפות" # SD #. language code: shn #: zypp/LanguageCode.cc:943 #, fuzzy msgid "Shan" msgstr "סודן" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" # label text #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "בחרו שפה:" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "סלובקית" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "סלובנית" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" # BD #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "שפות" # label text #. language code: smj #: zypp/LanguageCode.cc:967 #, fuzzy msgid "Lule Sami" msgstr "&שם למודול" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 #, fuzzy msgid "Samoan" msgstr "עומן" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" # SI #. language code: sna sn #: zypp/LanguageCode.cc:975 #, fuzzy msgid "Shona" msgstr "סלובניה" #. language code: snd sd #: zypp/LanguageCode.cc:977 #, fuzzy msgid "Sindhi" msgstr "סוג" #. language code: snk #: zypp/LanguageCode.cc:979 #, fuzzy msgid "Soninke" msgstr "המשך" # SD #. language code: sog #: zypp/LanguageCode.cc:981 #, fuzzy msgid "Sogdian" msgstr "סודן" # RO #. language code: som so #: zypp/LanguageCode.cc:983 #, fuzzy msgid "Somali" msgstr "רומניה" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "ספרדית" # UA #. language code: srd sc #: zypp/LanguageCode.cc:991 #, fuzzy msgid "Sardinian" msgstr "אוקראינית" #. language code: srr #: zypp/LanguageCode.cc:993 #, fuzzy msgid "Serer" msgstr "שרת" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" # Column header: minimum = 5 characters fill with space if needed #. language code: ssw ss #: zypp/LanguageCode.cc:997 #, fuzzy msgid "Swati" msgstr "התחלה" #. language code: suk #: zypp/LanguageCode.cc:999 #, fuzzy msgid "Sukuma" msgstr "סיכום" # SD #. language code: sun su #: zypp/LanguageCode.cc:1001 #, fuzzy msgid "Sundanese" msgstr "סודן" # heading text #. language code: sus #: zypp/LanguageCode.cc:1003 #, fuzzy msgid "Susu" msgstr "סטטוס" #. language code: sux #: zypp/LanguageCode.cc:1005 #, fuzzy msgid "Sumerian" msgstr "סרבית" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "שבדית" #. language code: syr #: zypp/LanguageCode.cc:1011 #, fuzzy msgid "Syriac" msgstr "שרות" #. language code: tah ty #: zypp/LanguageCode.cc:1013 #, fuzzy msgid "Tahitian" msgstr "לטבית" #. language code: tai #: zypp/LanguageCode.cc:1015 #, fuzzy msgid "Tai (Other)" msgstr "אחר" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "טמילית" # MT #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "קטאר" # BE #. language code: tel te #: zypp/LanguageCode.cc:1021 #, fuzzy msgid "Telugu" msgstr "בלגיה" # label text #. language code: tem #: zypp/LanguageCode.cc:1023 #, fuzzy msgid "Timne" msgstr "אזור זמן" # MX #. language code: ter #: zypp/LanguageCode.cc:1025 #, fuzzy msgid "Tereno" msgstr "מידעטקסט" #. language code: tet #: zypp/LanguageCode.cc:1027 #, fuzzy msgid "Tetum" msgstr "טקסט" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 #, fuzzy msgid "Tajik" msgstr "דיבור" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "תאילנדית" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 #, fuzzy msgid "Tsimshian" msgstr "רוסית" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 #, fuzzy msgid "Tswana" msgstr "בוטסואנה" # EE #. language code: tso ts #: zypp/LanguageCode.cc:1063 #, fuzzy msgid "Tsonga" msgstr "אסטוניה" # TR #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "טורקיה" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" # BD #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "שפות" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "טורקית" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 #, fuzzy msgid "Tuvinian" msgstr "טוניס" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" # UA #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "אוקראינית" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 #, fuzzy msgid "Uzbek" msgstr "אוסביקיסטן" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" # GD #. language code: ven ve #: zypp/LanguageCode.cc:1099 #, fuzzy msgid "Venda" msgstr "גרנדה" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "וייטנאמית" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" # BD #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "שפות" # PA #. language code: wal #: zypp/LanguageCode.cc:1109 #, fuzzy msgid "Walamo" msgstr "פאלם" # PY #. language code: war #: zypp/LanguageCode.cc:1111 #, fuzzy msgid "Waray" msgstr "פרגואי" #. language code: was #: zypp/LanguageCode.cc:1113 #, fuzzy msgid "Washo" msgstr "וולשית" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "וולשית" # label text #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "בחרו שפה:" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 #, fuzzy msgid "Kalmyk" msgstr "דיבור" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "קוזה" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 #, fuzzy msgid "Yapese" msgstr "יפנית" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" # BD #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "שפות" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" # GD #. language code: zen #: zypp/LanguageCode.cc:1141 #, fuzzy msgid "Zenaga" msgstr "גרנדה" #. language code: zha za #: zypp/LanguageCode.cc:1143 #, fuzzy msgid "Zhuang" msgstr "&שינוי" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "זולו" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" # column description, if disk space is not known # label text #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "לא ידוע" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" # IT #: zypp/VendorSupportOptions.cc:33 #, fuzzy msgid "invalid" msgstr "התקן" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" # Frame title for installation target hard disk / partition(s) #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "מתקין על:" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Couldn't open file: %s." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" # Frame title for installation target hard disk / partition(s) #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "מתקין על:" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" # IT #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "התקן" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" # Commandline help title #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "קורא קובץ הגדרות" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "מידע נוסף" #: zypp/target/rpm/RpmDb.cc:2196 #, fuzzy, c-format, boost-format msgid "created backup %s" msgstr "אל תיצור גיבויים" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Couldn't open file: %s." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "פקודה לביצוע כאשר מתחברים" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Couldn't open file: %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" # Frame title for installation target hard disk / partition(s) #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "מתקין על:" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" # Frame title for installation target hard disk / partition(s) #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "מתקין על:" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "כן" #: zypp-tui/Table.cc:32 msgid "No" msgstr "לא" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "שגיאה" # ID #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "done" msgstr "אינדונזיה" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "שגיאה" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "לא מחובר" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 #, fuzzy msgid "yes" msgstr "כן" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "ארכיטקטורה:" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "התקנה נכשלה" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "מתקין על:" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "do not install %s" #~ msgstr "מתקין על:" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "מתקין על:" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "מתקין דריבר..." # main dialog: Button Delete partition #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "&מחק" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "מתקין על:" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "לא מחובר" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "מתקין על:" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "%s remove failed" #~ msgstr "rpm נכשל." #, fuzzy #~ msgid "%s install failed" #~ msgstr "התקנה נכשלה" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "מתקין דריבר..." #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "מתקין דריבר..." #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "מתקין דריבר..." #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "מתקין דריבר..." # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "install %s" #~ msgstr "מתקין על:" #, fuzzy #~ msgid "unlock %s" #~ msgstr "שעונים" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "מתקין דריבר..." #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "No need to install %s" #~ msgstr "&בוט מערכת קיימת" #, fuzzy #~ msgid ", Action: " #~ msgstr "פעולה" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "Establishing %s" #~ msgstr "מתקין על:" #, fuzzy #~ msgid " Error!" #~ msgstr "שגיאה" #~ msgid "Ok" #~ msgstr "בסדר" #~ msgid "Default" #~ msgstr "ברירת מחדל" libzypp-17.36.5/po/hi.po000066400000000000000000004432111476576476200150010ustar00rootroot00000000000000# translation of zypp.hi.po to Hindi # Sangeeta Kumari , 2007. msgid "" msgstr "" "Project-Id-Version: zypp.hi\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2021-04-08 15:57+0000\n" "Last-Translator: Panwar \n" "Language-Team: Hindi \n" "Language: hi\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: Weblate 3.6.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "अज्ञात देश : " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "कोई कोड नहीं" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "अंदोर्रा" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "संयुक्त अरब अमीरात" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "अफगानिस्तान" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "एंटीगुआ और बारबूडा" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "अंग्युला" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "अल्बानिया" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "अर्मेनिया" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "नीदरलैंड एंटीलस" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "अंगोला" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "अंटार्कटिक" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "अर्जेंटीना" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "अमेरिकी समोआ" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "आस्ट्रिया" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "आस्ट्रेलिया" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "अरूबा" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "अलांड आइलैंड्स" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "अज़रबैजान" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "बोस्निया और हर्जेगोविना" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "बारबाडोस" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "बांग्लादेश" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "बेल्ज़ियम" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "बुर्किना फासो" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "बुल्गारिया" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "बहरीन" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "बुरूंडी" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "बेनिन" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "बरमूडा" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "ब्रुनेई दारूस्सलम" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "बोलेविया" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "ब्राज़ील" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "बहामस" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "भूटान" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "बोउवेत आइसलैंड" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "बोत्सवाना" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "बेलारूस" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "बेलिजी" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "कनाडा" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "कोकोस (कीलिंग) आइलैंड्स" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "कांगो" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "मध्य अफ्रीकी गणराज्य" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "स्विट्ज़रलैंड" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "कोटे डी'आईवोर" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "कुक आइलैंड्स" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "चीले" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "कैमरून" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "चीन" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "कोलंबिया" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "कोस्टा रिका" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "क्यूबा" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "केप वेर्दे" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "क्रिसमस आइसलैंड" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "साइप्रस" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "चेक गणराज्य" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "जर्मनी" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "जिबूती" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "डेनमार्क" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "डोमिनिका" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "डोमिनिका गणराज्य" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "अल्ज़ीरिया" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "इक्वाडोर" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "एस्तोनिया" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "मिश्र" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "पश्चिमी सहारा" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "इरीट्रिया" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "स्पेन" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "इथियोपिया" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "फिनलैंड" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "फिज़ी" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "फाल्कलैंड आइलैंड्स (माल्विनास)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "माइक्रोनेशिया संघीय गणराज्य" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "फरोए आइलैंड्स" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "फ्रांस" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "मेट्रोपोलिटन फ्रांस" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "गाबोन" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "यूनाइटेड किंगडम" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "ग्रेनेडा" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "जार्जिया" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "फ्रेंच गुआना" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "जर्मनी" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "घाना" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "जिब्राल्टर" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "ग्रीनलैंड" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "गाम्बिया" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "गिनी" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "ग्वाडेलोप" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "विषुवतरेखीय गिनी" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "ग्रीस" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "दक्षिणी जॉर्जिया और साउथ सैंडविच आइलैंड्स" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "ग्वाटेमाला" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "गुआम" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "गिनी-बिसाउ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "गुआना" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "हांग-कांग" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "हेर्ड आइसलैंड और मैकडोनाल्ड आइलैंड्स" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "होंडुरास" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "क्रोएशिया" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "हाती" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "हंगरी" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "इंडोनेशिया" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "आयरलैंड" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "इज़रायल" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "भारत" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "ब्रिटिश भारतीय समुद्री क्षेत्र" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "इराक" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "इरान" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "आइसलैंड" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "इटली" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "जमाइका" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "जॉर्डन" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "जापान" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "केन्या" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "किर्गिज़तान" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "कंबोडिया" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "किरिबाती" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "कोमोरोस" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "सेंट किट्स और नेविस" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "उत्तरी कोरिया" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "दक्षिणी कोरिया" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "कुवैत" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "केमन आइलैंड" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "कज़ाकिस्तान" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "लाओ लोक जनवादी गणराज्य" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "लेबनान" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "सेंट लुसिया" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "लिचटेंसटीन" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "श्रीलंका" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "लिबेरिया" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "लेसोथो" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "लिथुआनिया" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "लक्ज़मबर्ग" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "लटाविया" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "लीबिया" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "मोरक्को" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "मोनाका" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "माल्दोवा" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "मोंगो" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "सैन मारिनो" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "मेडागास्कर" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "मार्शल आइलैंड्स" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "मकदूनिया" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "माली" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "म्यांमार" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "मंगोलिया" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "मकाउ" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "उत्तरी मारिआना आइलैंड" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "मारतिनिक" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "मॉरितानिया" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "मांतसेरा" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "माल्टा" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "मॉरीशस" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "मालदीव" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "मलावी" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "मेक्सिको" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "मलेशिया" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "मोजाम्बिक" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "नामीबिया" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "न्यू कैलडोनिया" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "नाइज़र" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "नॉरफोक आइसलैंड" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "नाइजीरिया" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "निकारागुआ" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "नीदरलैंड्स" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "नॉर्वे" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "नेपाल" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "नाउरू" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "नियू" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "न्यूजीलैंड" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "ओमान" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "पनामा" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "पेरू" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "फ्रेंच पॉलीनेशिया" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "पापुआ न्यू गिनी" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "फिलिपीन्स" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "पाकिस्तान" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "पोलैंड" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "सेंट पिअरे और मिक्यूलॉन" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "पिटकैरन" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "प्यूर्टो रिको" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "फिलीस्तीनी क्षेत्र" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "पुर्तगाल" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "पलाउ" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "पैरागुआ" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "कतर" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "रियूनियन" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "रोमानिया" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "सर्बियाई" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "रूसी महासंघ" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "रवांडा" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "सउदी अरब" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "सोलोमन आइलैंड" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "सेशेल्स" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "सूडान" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "स्वीडेन" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "सिंगापुर" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "सेंट हेलेना" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "स्लोविनिया" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "स्वालबार्ड और जेन मायेन" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "स्लोवाकिया" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "सिएरा लिओन" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "सैन मारिनो" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "सेनेगल" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "सोमालिया" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "सूरीनाम" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "साओ टोम और प्रिंसीप" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "अलसल्वाडोर" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "सीरिया" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "स्वाजिलैंड" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "तुर्क और कैकस आइलैंड" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "चाड" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "फ्रांसीसी दक्षिणी क्षेत्र" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "टोगो" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "थाईलैंड" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "तजाकिस्तान" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "तोकेलाउ" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "तुर्कमेनिस्तान" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ट्यूनेशिया" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "टोंगा" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "पूर्वी तिमोर" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "टर्की" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "त्रिनिदाद और टोबागो" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "तुवालू" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "ताइवान" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "तंजानिया" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "उक्रेन" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "उगांडा" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "संयुक्त राज्य के छोटे दूरस्थ द्वीप" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "संयुक्त राज्य" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "उरुग्वे" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "उज़बेकिस्तान" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "होली सी (वैटिकन सिटी राज्य)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "सेंट विनसेंट और द ग्रेनाडिनेस" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "वेनेजुएला" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "ब्रिटिश वर्जिन आइलैंड" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "वर्जिन आइलैंड, यू.एस." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "वियतनाम" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "वनुआतू" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "वालिस और फ्यूतूना" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "समोआ" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "यमन" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "मयोट्टे" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "दक्षिण अफ्रीका" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "जांबिया" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "जिम्बाबवे" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s पुराना कर देता है : %s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "अज्ञात भाषा : " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "अफार" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "अबखाजिआन" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "अचाइनीज" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "अकोली" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "अदांगमे" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "अदाइघे" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "अफ्रो-एशियाटिक(अन्य)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "अफ्रिहिली" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "अफ्रीकांस" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "ऐनू" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "अकान" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "अकादियान" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "अल्बेनियाई" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "एल्यूत" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "अलगांक्यूएन भाषाएं" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "दक्षिणी अल्ताई" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "अम्हारिक" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "अंग्रेजी, पुरानी (सीए. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "अपाची भाषाएं" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "अरबी" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "अरामाइक" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "अरागोनीज़" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "अर्मीनियाई" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "अरॉकेनियाई" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "अरापाहो" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "कृत्रिम (अन्य)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "अरावक" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "असमिया" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "अस्तूरियन" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "अथापास्कन भाषाएं" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "आस्ट्रेलियाई भाषाएं" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "अवारिक" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "अवेस्तान" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "अवधी" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "ऐमारा" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "अज़रबैजानी" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "बांदा" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "बमिलिक भाषाएं" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "बशकीर" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "बलूची" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "बंबारा" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "बलिनीज़" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "बास्क्यू" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "बासा" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "बाल्टिक (अन्य)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "बेजा" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "बेलारूसी" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "बेंबा" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "बंगाली" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "बेरबेर (अन्य)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "भोजपुरी" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "बिहारी" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "बिकोल" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "बिनि" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "बिसलामा" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "सिकसिका" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "बंतू (अन्य)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "बोस्नियाई" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "ब्रज" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "ब्रेटोन" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "बताक (इंडोनेशियाई)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "बुरियात" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "बुगीनीज़" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "बुल्गारियाई" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "बर्मी" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "ब्लिन" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "केडो" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "केंद्रीय अमेरिकी भारतीय (अन्य)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "केरिब" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "केटेलन" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "काकेशियाई (अन्य)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "सेब्यूनो" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "सेल्टीक (अन्य)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "चमोरो" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "चिबचा" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "चेचेन" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "छगाताई" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "चीनी" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "चुकीज़" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "मारी" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "चिनूक जार्गन" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "चोक्टॉ" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "चिप्यूयन" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "चेरोकी" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "चर्च स्लाविक" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "चुवास" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "चेयेन्ने" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "चामिक भाषाएं" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "कोप्टिक" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "कॉर्निश" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "कोर्सिकन" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "क्रियोलेस और पिडगिंस, अंग्रेजी-आधारित (अन्य)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "क्रियोलेस और पिडगिंस, फ्रांसीसी-आधारित (अन्य)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "क्रियोलेस और पिडगिंस, पुर्तगाली-आधारित (अन्य)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "क्री" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "क्रीमियाई तातार" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "क्रियोलेस और पिडगिंस (अन्य)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "कशुबियन" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "क्युशीटिक (अन्य)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "चेक" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "डाकोटा" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "दानिश" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "दरग्वा" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "दयाक" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "देलावारे" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "स्लेव (अथापास्कन)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "डोगरिब" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "दिन्का" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "दिवेही" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "डोगरी" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "द्रविड़ियन (अन्य)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "लोअर सोर्बियन" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "ड्यूला" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "डच, मध्य (सीए. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "डच" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ड्यूला" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "द्जोंगखा" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "इफिक" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "मिश्री (प्राचीन)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "इकाजुक" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "इलामाइट" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "अंग्रेजी" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "अंग्रेजी, मध्य (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "एस्परांतो" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "एस्टोनियाई" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "इवी" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "इवॉन्डो" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "फांग" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "फारोइसी" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "फांती" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "फिजी" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "फिलिपीनो" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "फिन्निश" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "फिन्नो-उगरियन (अन्य)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "फॉन" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "फ्रेंच" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "फ्रेंच, मध्य (सीए. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "फ्रेंच, प्राचीन (842- सीए.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "फ्रीशियन" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "फुलाह" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "फ्रीयूलियन" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "गा" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "गायो" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "ग्बाया" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "जर्मेनिक (अन्य)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "जॉर्जियाई" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "जर्मन" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "गीज" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "जिब्रालटीज़" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "गैलिक" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "आयरिश" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "गालीसियन" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "मैंक्स" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "जर्मन, मिडिल हाई (सीए. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "जर्मन, ओल्ड हाई (सीए. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "गोंडी" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "गोरोन्टालो" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "गोथिक" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "ग्रेबो" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "ग्रीक, प्राचीन (1453 तक)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "ग्रीक, आधुनिक (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "गुआरानी" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "गुजराती" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "ग्विच'इन" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "हैदा" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "हैती" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "हाउसा" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "हवाइयन" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "हिब्रू" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "हेरेरो" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "हिलिगेनोन" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "हिमांचली" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "हिंदी" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "हिटिटी" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "ह्मांग" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "हिरी मोटू" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "ऊपरी सोर्बियाई" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "हंगेरियाई" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "हूपा" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "इबान" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "इग्बो" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "आइसलैंडी" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "आइडो" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "सिचुआन यी" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "आइजो" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "इनुकटिटुट" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "इंटरलिंगुआ" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "आईलोको" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "इण्टर्लिङ्गुआ" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "इंडिक (अन्य)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "इंडोनेशियाई" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "इंडो-यूरोपीय (अन्य)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "इंगुश" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "इन्यूपिआक" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "इरानी (अन्य)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "इरोक्योइयाई भाषाएं" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "इतालवी" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "जावा" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "लोजबान" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "जापानी" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "जूडेओ-पर्सियन" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "जूडेओ-अरबी" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "कारा-कालपक" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "कबाइली" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "काचिन" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "कालाल्लीसट" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "कांबा" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "कन्नड़" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "केरीन" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "कश्मीरी" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "कनुरी" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "कावी" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "कजाक" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "कबार्डियन" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "खासी" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "खोईसान (अन्य)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "खमेर" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "खोतानीज़" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "किकूयू" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "किनयारवांडा" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "किर्गिज़" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "किंबुंदु" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "कोंकणी" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "कोमी" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "कांगो" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "कोरियाई" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "कोस्राइयन" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "क्पेले" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "काराचय-बलकार" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "क्रु" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "कुरुख" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "कुआनयामा" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "कुम्यक" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "कुर्दिश" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "कुतेनाई" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "लादिनो" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "लाहंडा" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "लांबा" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "लाओ" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "लैटिन" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "लाटवियाई" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "लेझियन" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "लिम्बर्गन" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "लिंगाला" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "लिथुआनियाई" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "मोंगो" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "लोज़ी" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "लक्ज़मबर्गिश" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "ल्यूबा-लुलुआ" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "ल्यूबा-कातांगा" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "गांडा" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "ल्युसेनो" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "लुंडा" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "लुओ (केन्या और तंजानिया)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "लुशाई" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "मकदूनियाई" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "मदुरीस" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "मगही" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "मार्शलीज़" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "मैथिली" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "मकासर" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "मलयालम" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "मंदिनगो" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "माओरी" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "असट्रोनेसियाई (अन्य)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "मराठी" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "मसाइ" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "मलय" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "मोक्स" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "मंदार" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "मेंदे" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "आइरिश, मध्य (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "मि'कमाक" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "मिनांग्काबाउ" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "विविध भाषाएं" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "मॉन-खमेर (अन्य)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "मलागासी" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "माल्टीज़" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "मंचू" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "मणिपुरी" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "मनोबो भाषाएं" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "मोहॉक" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "मोल्देवियाई" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "मंगोलियाई" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "मोस्सी" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "अनेकशः भाषाएं" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "मुंडा भाषाएं" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "क्रीक" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "मिरांडीज़" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "मारवाड़ी" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "मयान भाषाएं" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "एर्जया" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "नाहुआट्ल" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "उत्तरी अमेरिकी भारतीय" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "नेपोलिटन" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "नावाजो" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "न्डेबेले, दक्षिणी" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "न्डेबेले, उत्तरी" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "न्डोंगा" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "लो जर्मन" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "नेपाली" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "नेपाल भाषा" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "नियास" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "नाइज़र-कोरदोफानियाई (अन्य)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "नियूएन" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "नॉर्वेजियाई निनॉर्स्क" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "नॉर्वेजियाई बोकमाल" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "नोगाइ" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "नोर्स, पुरानी" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "नॉर्वेजियाई" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "उत्तरी सोथो" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "न्यूबिअन भाषाएं" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "क्लासिकी नेवारी" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "चिचेवा" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "न्यामवेज़ी" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "न्यानकोले" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "न्योरो" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "न्ज़ीमा" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "ओक्कीटन (1500 पश्चात)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "ओज़िब्वा" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "उड़िया" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "ओरोमो" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "ओसेग" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "ओस्सेटियन" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "तुर्कीश, ऑट्टोमन (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "ओटोमियाई भाषाएं" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "पापुअन (अन्य)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "पनगासिनान" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "पहलावी" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "पाम्पांगा" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "पंजाबी" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "पापीमेंटो" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "पालाउन" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "फारसी, पुरानी (सीए. 600-400 ई.पू.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "फारसी" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "फिलीपीनी (अन्य)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "फोएनिसिअन" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "पाली" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "पोलिश" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "पोहन्पिअन" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "पुर्तगाली" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "प्राकृत भाषाएं" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "प्रोवेंसल, पुरानी (1500 तक)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "पश्तो" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "क्वेचुआ" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "राजस्थानी" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "रापान्वी" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "रारोतांगन" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "रोमांस (अन्य)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "रेइतो-रोमांस" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "रोमानी" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "रोमानियाई" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "रूंडी" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "रूसी" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "संदावी" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "सांगो" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "याकूत" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "दक्षिणी अमेरिकी भारतीय (अन्य)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "सलीशान भाषाएं" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "समारिटन अरामिक" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "संस्कृत" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "ससाक" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "संथाली" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "सर्बियाई" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "सिसिलियाई" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "स्काट्स" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "क्रोएशियाई" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "सेलकप" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "सेमिटिक (अन्य)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "आइरिश, पुरानी (900 तक)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "संकेत भाषाएं" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "शान" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "सिडामो" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "सिंहल" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "सिओअन भाषाएं" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "चीनी-तिब्बती (अन्य)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "स्लाव (अन्य)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "स्लोवाक" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "स्लोवेनियाई" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "दक्षिणी सामी" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "उत्तरी सामी" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "सामी भाषाएं (अन्य)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "लूले सामी" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "इनारी सामी" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "सामोन" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "सकोल्त सामी" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "शोना" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "सिंधी" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "सोनिंकी" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "सोगदिया" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "सोमाली" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "सोंघाई" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "सोथो, दक्षिणी" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "स्पेनी" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "सार्डीनियाई" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "सेरेर" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "निलो-सहारन (अन्य)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "स्वाति" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "सुकूमा" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "सुंडानी" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "सुसु" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "सुमेरियाई" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "स्वाहिली" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "स्वीडिश" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "सीरियाई" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "ताहितियन" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "ताई (अन्य)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "तमिल" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "तातार" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "तेलगू" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "तिम्ने" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "तेरेनो" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "तेतम" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "ताज़िक" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "टॅगलॉग" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "थाई" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "तिब्बती" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "तिगरे" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "तिग्रिन्या" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "तीव" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "क्लिंगों" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "त्लिंगित" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "तमाशेक" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "तोंगा (न्यासा)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "तोंगा (तोंगा आइलैंड्स)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "तोक पिसिन" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "त्सीमसियाई" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "त्सवाना" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "त्सोंगा" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "तुर्कमानी" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "तुमबुका" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "तुपी भाषाएं" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "तुर्कीश" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "अल्टाइक (अन्य)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "त्वी" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "तुविनियाई" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "उदमर्त" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "उगारिटिक" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "उइघुर" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "उक्रेनी" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "उंबुंदु" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "अनिर्धारित" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "उर्दू" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "उज़्बेक" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "वाइ" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "वेंदा" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "वियतनामी" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "वोलापुक" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "वोटिक" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "वाकाशान भाषाएं" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "वलामो" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "वरे" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "वाशो" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "वेल्श" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "सोर्बिअन भाषाएं" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "वलून" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "वोलोफ" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "कल्मीक" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "क्होसा" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "याओ" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "यापी" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "यिद्दिश" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "योरूबा" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "यूपिक भाषाएं" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "ज़ापोटेक" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "ज़ेनागा" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "झुआंग" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "ज़ेंदे" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "जुलु" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "ज़ुनी" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "अन्जान" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "अनंजान" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "अमान्य Url स्कीम '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "डायरेक्टरी को सृजित नहीं कर सकता %1 : %2" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "डेस्कटॉप आइटम '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, fuzzy, c-format, boost-format msgid "Adding repository '%s'" msgstr "संसाधन जोड़ रहा" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "अमान्य निर्यात फाइलनाम।" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "लेखन के लिए फाइल नहीं खोल सकता है।" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "फ्लोपी डिस्क पढ़ने में त्रुटि।" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "संसाधन जोड़ रहा" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "डेस्कटॉप आइटम '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "जारी रखें?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "पैकेज %s ने एकीकरण जांच को नाकाम किया। क्या आप इसकी डाउनलोडिंग का प्रयास फिर से करना " "चाहते हैं?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "पैकेज %s ने एकीकरण जांच को नाकाम किया। क्या आप इसकी डाउनलोडिंग का प्रयास फिर से करना " "चाहते हैं?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm जांच नाकाम रही।" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm नाकाम रहा।" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "संसाधन प्रकार वीएआर1 परिवर्तन दर्शाएं विशेषता को सहयोग नहीं करता" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "%s से %s प्रदान नहीं कर सकता" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "कोष में फाइल %1 नहीं प्राप्त हुई।" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "फाइल को सृजित नहीं कर सकता है।" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "सिर्फ यहां पर इस आवश्यकता की अनदेखी कर दें" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "सिर्फ यहां पर इस आवश्यकता की अनदेखी कर दें" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "के लिए कनेक्शन आवेदन : " #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "निर्भरता समस्याओं के कारण %s का संस्थापन नहीं कर सकता" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "कोई नहीं %s प्रदान करता" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "अनुरोध पहले से ही मौजूद है।" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "जैसा निर्देशित था, संस्थापन छोड़ दिया गया।" #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "निष्‍पादन" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "कुंजी एन्क्रिप्शन के दौरान त्रुटि।" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "विफल" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s हेतु विन्यास फ़ाइलें जिन्हें बदला गया :" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm ने %s के रूप में %s सहेजा लेकिन अंतर निर्धारित करना असंभव था " #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ने %s के रूप में %s सहेजा।\n" "यहां अंतर की पहली 25 पंक्तियां हैं :\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm ने %s के रूप में %s सृजित किया लेकिन अंतर निर्धारित करना असंभव था" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ने %s के रूप में %s सृजित किया।\n" "यहां अंतर की पहली 25 पंक्तियां हैं :\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "अतिरिक्त rpm आउटपुट :" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "बैकअप %s सृजित" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "%s %s नहीं मिला" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "%s %s नहीं मिला" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "%s %s नहीं मिला" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1' मौजूद नहीं है।" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1' मौजूद नहीं है।" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "%s %s नहीं मिला" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "फाइल %1 को नहीं खोल सकता है।" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "अमान्य LDAP URL क्वेरी स्ट्रिंग" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "अमान्य LDAP URL क्वेरी मानक '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Url ऑब्जेक्ट क्लोन करने में अक्षम" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "अमान्य रिक्त Url ऑब्जेक्ट संदर्भ" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Url अवयवों को पार्ज करने में अक्षम" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "इतिहास:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url स्कीम किसी %s को अनुमति नहीं देती है" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "अमान्य %s अवयव '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "अमान्य %s अवयव" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "इस URL के लिए क्वेरी स्ट्रिंग पार्जिंग समर्थित नहीं है" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url स्कीम एक आवश्यक अवयव है" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "अमान्य Url स्कीम '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url स्कीम किसी उपयोगकर्ता नाम को अनुमति नहीं देती है" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url स्कीम किसी पासवर्ड को अनुमति नहीं देती है" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url स्कीम को एक होस्ट अवयव की आवश्यकता है" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "यूआरएल व्यवस्था द्वारा होस्ट अनुभाग स्वीकार्य नहीं है" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "अमान्य होस्ट अवयव '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "यूआरएल व्यवस्था द्वारा पोर्ट स्वीकार्य नहीं है" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "अमान्य पोर्ट अवयव '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url स्कीम को पथ नाम की आवश्यकता है" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "यदि प्राधिकरण मौजूद है तो सापेक्ष पथ को अनुमति नहीं है" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "एनकोडेड स्ट्रिंग में एक NUL बाइट समाविष्ट है" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "अमान्य मानक क्रमविन्यास सेपरेटर वर्ण पृथक करें" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "अमान्य मानक मानचित्र सेपरेटर वर्ण पृथक करें" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "अमान्य मानक क्रमविन्यास सेपरेटर वर्ण जोड़ें" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "जब कनेक्ट हो रहे हों तब चलाया जाने वाला कमांड" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "%s को नहीं ढूंढ सकता।" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "%s को नहीं ढूंढ सकता।" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "%s - %s को खोलने में अक्षम\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "\"%s\" मोड्यूल लोड करने में असफल।" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "कोष में फाइल %1 नहीं प्राप्त हुई।" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "फाइल %1 पर नहीं लिख सकता है। " #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 एक डायरेक्टरी नहीं है।" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "रिक्त CA नाम।" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "अमान्य URL स्कीम '%1'" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "डेस्कटॉप आइटम '%s'" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "अनुमति अस्वीकृत" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "हाँ" #: zypp-tui/Table.cc:32 msgid "No" msgstr "नहीं" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "चेतावनी" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "खराबी" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "हो गया" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "त्रुटि" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "चेतावनी" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "आरंभ हो रहा है..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "नहीं मिला" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "हाँ" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "नहीं" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।" #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "पैकेजों को असंस्थापित करने का कमांड" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "कोई नहीं %s प्रदान करता" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "प्रमाण पत्र %1 मौजूद नहीं है।" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s लॉक हो गया है और इसे असंस्थापित नहीं किया जा सकता।" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "इंस्टाल नहीं हुआ" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s को %s की आवश्यकता है" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "%s का संस्थापन नहीं कर सकता" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s का %s से टकराव है " #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s को %s पुराना कर देता है" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s को %s पुराना कर देता है" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s का %s से टकराव है " #~ msgid "do not install %s" #~ msgstr "%s संस्थापित न करें" #~ msgid "keep %s" #~ msgstr "%s रखें" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "%s संस्थापित न करें" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "%s का कोई संस्थापनयोग्य प्रदाता नहीं है" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "संबंधित रिजॉल्वेबल को संस्थापित या मिटाएं नहीं" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।" #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "%s को संस्थापित करें यद्यपि यह स्थापत्य को बदल देगा" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s को %s पुराना कर देता है" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "%s से %s तक अपडेट कर रहा है" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "अधिष्ठापन" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "फाइल %1 को नहीं खोल सकता है।" #~ msgid "Hal Exception" #~ msgstr "हाल अपवाद" #~ msgid "HalContext not connected" #~ msgstr "HalContext कनेक्ट नहीं किया गया" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive आरंभ नहीं किया गया " #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume आरंभ नहीं किया गया" #~ msgid "Unable to create dbus connection" #~ msgstr "dbus कनेक्शन सृजित करने में अक्षम" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: libhal संदर्भ को सृजित नहीं कर सकता" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection : dbus कनेक्शन को सेट नहीं कर सकता" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "HAL संदर्भ को आरंभ करने में अक्षम -- hald नहीं रन कर रहा?" #~ msgid "Not a CDROM drive" #~ msgstr "कोई सीडीरोम ड्राइव नहीं" #~ msgid "Can't initialize mutex attributes" #~ msgstr "म्यूटेक्स गुण को आरंभ नहीं कर सकता" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "रिकर्सिव म्यूटेक्स गुण को सेट नहीं कर सकता" #~ msgid "Can't initialize recursive mutex" #~ msgstr "रिकर्सिव म्यूटेक्स को आरंभ नहीं कर सकता" #~ msgid "Can't acquire the mutex lock" #~ msgstr "म्यूटेक्स लॉक को हासिल नहीं कर सकता" #~ msgid "Can't release the mutex lock" #~ msgstr "म्यूटेक्स लॉक को रिलीज़ नहीं कर सकता" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "सार्वजनिक कुंजी को प्राप्त करने में अक्षम।" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "इंस्टाल नहीं हुआ" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "%s - %s को खोलने में अक्षम\n" #~ msgid "Serbia and Montenegro" #~ msgstr "सर्बिया और मोंटेनेग्रो" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "अज्ञात सूची विकल्प" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "निर्भरता हल नहीं की जा सकती" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाइल %s में कोई चेकसम नहीं है।\n" #~ "फिर भी फाइल का प्रयोग करें?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाइल %s निम्नलिखित कुंजी के साथ एकीकरण जांच में नाकाम रही :\n" #~ "%s|%s|%s\n" #~ "फिर भी फाइल का प्रयोग करें?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाइल %s में एक अमान्य चेकसम है।\n" #~ "%s की उम्मीद थी, %s मिला\n" #~ "फिर भी फाइल का प्रयोग करें?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाइल %s में एक अमान्य चेकसम %s है।\n" #~ "फिर भी फाइल का प्रयोग करें?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "फाइल %s साइन की हुई नहीं है।\n" #~ "फिर भी इसका प्रयोग करें?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाइल %s को एक अज्ञात कुंजी से साइन किया गया है :\n" #~ "%s|%s|%s\n" #~ "फिर भी फाइल का प्रयोग करें?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "गैर-भरोसेमंद कुंजी मिली है :\n" #~ "%s|%s|%s\n" #~ "कुंजी पर भरोसा करें?" #~ msgid "%s remove failed" #~ msgstr "%s स्थानांतरण असफल रहा" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "कूटशब्द बदलो" #~ msgid "rpm output:" #~ msgstr "rpm आउटपुट :" #~ msgid "%s install failed" #~ msgstr "%s संस्थापन असफल " #~ msgid "%s installed ok" #~ msgstr "%s संस्थापन ठीक" #~ msgid "%s remove ok" #~ msgstr "%s स्थानांतरण ठीक" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "यह निर्भरता %s प्रदान करता है लेकिन यह संस्थापित वस्तु केस्थापत्य को बदल देगा" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "यह निर्भरता %s प्रदान करता है लेकिन यह संस्थापित वस्तु केस्थापत्य को बदल देगा" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "संबंधित रिजॉल्वेबल को संस्थापित या मिटाएं नहीं" #~ msgid "Ignore that %s is already set to install" #~ msgstr "%s संस्थापित होने के तैयार है इसको अनदेखा करें" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "%s को %s में हटाए जाने को अनदेखा करें" #~ msgid "Ignore this conflict of %s" #~ msgstr "%s के इस टकराव की अनदेखी कर दें" #~ msgid "Ignore this requirement just here" #~ msgstr "सिर्फ यहां पर इस आवश्यकता की अनदेखी कर दें" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "%s को संस्थापित करें यद्यपि यह स्थापत्य को बदल देगा" #~ msgid "Install missing resolvables" #~ msgstr "छूटे रिजॉल्वेबल्स को संस्थापित करें" #~ msgid "Keep resolvables" #~ msgstr "रिजॉल्वेबल्स रखें" #~ msgid "Unlock these resolvables" #~ msgstr "इन रिजॉल्वेबल्स को अनलॉक करें" #~ msgid "delete %s" #~ msgstr "%s मिटाएं" #~ msgid "install %s" #~ msgstr "%s को संस्थापित करें" #~ msgid "unlock %s" #~ msgstr "%s को अनलॉक करें" #~ msgid "unlock all resolvables" #~ msgstr "समस्त रिजॉल्वेबल्स को अनलॉक करें" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "फाइल %1 को नहीं खोल सकता है।" #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "सेक्टर %u पढ़ने में त्रुटि।" #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "इस URL के लिए पथ मानक पार्जिंग समर्थित नहीं है" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "पथ मानक पार्जिंग इस URL के लिए समर्थित नहीं है" #~ msgid "Software management is already running." #~ msgstr "सॉफ्टवेयर प्रबंधन पहले से ही रन कर रहा है।" #~ msgid "%s is replaced by %s" #~ msgstr "%s से %s को प्रतिस्थापित किया जाता है" #~ msgid "%s replaced by %s" #~ msgstr "%s से %s को प्रतिस्थापित किया गया" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "ये रिजॉल्वेबल्स सिस्टम से मिटा दिए जाएंगे।" #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s को असंस्थापित नहीं किया जाएगा क्योंकि इसकी आवश्यकता अब भी है" #~ msgid "Invalid information" #~ msgstr "अमान्य सूचना" #~ msgid "%s is needed by other resolvables" #~ msgstr "अन्य रिजॉल्वेबल्स को %s की आवश्यकता है" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "%s की इनको आवश्यकता है :%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s का अन्य रिजॉल्वेबल्स से टकराव है" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s का इनसे टकराव है :\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s अन्य रिजॉल्वेबल्स को पुराना कर देता है" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "ये रिजॉल्वेबल्स सिस्टम से मिटा दिए जाएंगे।" #~ msgid "%s depends on other resolvables" #~ msgstr "%s अन्य रिजॉल्वेबल्स पर निर्भर करता है" #~ msgid "%s depends on %s" #~ msgstr "%s पर %s निर्भर करता है " #~ msgid "%s depends on:%s" #~ msgstr "%s इन पर निर्भर करता है :%s" #~ msgid "Child of" #~ msgstr "की संतति" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "कोई स्रोत उपलब्ध नहीं है जो इस आवश्यकता को समर्थन दे।" #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "इस रिजॉल्यूशन के ऊपर/नीचे वर्णित शेष समस्याएं सभी निर्भरताओं कासमाधान नहीं करेंगी" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%s का संस्थापन नहीं कर सकता क्योंकि इसका %s के साथ टकराव है" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "" #~ "%s संस्थापित नहीं किया गया है और अनइंस्टाल योग्य के रूप में चिह्नित कर दिया गया है" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s के पास ऐसी आवश्यकताएं हैं जो संतुष्ट नहीं हुई हैं" #~ msgid "%s has missing dependencies" #~ msgstr "%s की छूटी हुई निर्भरताएं हैं" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s को छूटी हुई निर्भरताओं के कारण संस्थापित नहीं किया जा सका" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s की निर्भरताएं %s पूरी करता है लेकिन इसे असंस्थापित कर दिया जाएगा" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s की निर्भरताएं %s पूरी करता है लेकिन इसे आपके सिस्टम पर रखा जाएगा" #~ msgid "No need to install %s" #~ msgstr "%s को संस्थापित करने की आवश्यकता नहीं है" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "%s की निर्भरताओं को पूरा करने के लिए %s को संस्थापित नहीं कर सकता" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "%s की निर्भरताओं को पूरा करने के लिए %s को संस्थापित नहीं कर सकता" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s को असंस्थापित नहीं किया जाएगा क्योंकि इसकी आवश्यकता अब भी है" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "" #~ "%s पुराना कर देता है %s को। लेकिन %s को मिटाया नहीं जा सकता क्योंकि यह लॉक है।" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "%s को संस्थापित नहीं कर सकता क्योंकि यह टकराव पैदा करता है" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s असंस्थापनीय है क्योंकि इसका %s के साथ टकराव है" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "%s को अपग्रेड करते समय %s हेतु %s की आवश्यकता के लिए" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s में आवश्यकता %s छूटी हुई है" #~ msgid ", Action: " #~ msgstr ", कार्रवाई :" #~ msgid ", Trigger: " #~ msgstr ", ट्रिगर :" #~ msgid "package" #~ msgstr "पैकेज" #~ msgid "selection" #~ msgstr "चयन" #~ msgid "pattern" #~ msgstr "पैटर्न" #~ msgid "product" #~ msgstr "उत्पाद" #~ msgid "patch" #~ msgstr "पैच" #~ msgid "script" #~ msgstr "स्क्रिप्ट" #~ msgid "message" #~ msgstr "संदेश" #~ msgid "atom" #~ msgstr "परमाणु" #~ msgid "system" #~ msgstr "सिस्टम" #~ msgid "Resolvable" #~ msgstr "रिजॉल्वेबल" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "इस रिजॉल्यूशन प्रयास को अमान्य के रूप में चिन्हित करना" #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "रिजॉल्वेबल %s को अनइंस्टॉलेबल के रूप में चिन्हित करना" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s को संस्थापित किया जाना निर्धारित है, लेकिन निर्भरता समस्याओं के कारण यह संभव नहीं " #~ "है।" #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "%s को संस्थापित नहीं किया जा सकता क्योंकि इसे पहले ही असंस्थापित करने की जरूरत के रूप " #~ "में चिन्हित किया गया है" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "%s को संस्थापित नहीं कर सकता क्योंकि यह इस सिस्टम पर लागू नहीं होता" #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "%s को संस्थापित नहीं कर सकता, क्योंकि %s को पहले ही संस्थापित करने की जरूरत के रूप में " #~ "चिन्हित किया गया है" #~ msgid "This would invalidate %s." #~ msgstr "यह %s को अमान्य कर देगा।" #~ msgid "Establishing %s" #~ msgstr "%s को स्थापित कर रहा है" #~ msgid "Installing %s" #~ msgstr "%s को संस्थापित कर रहा है" #~ msgid "Skipping %s: already installed" #~ msgstr "%s को छोड़ दें : पहले ही संस्थापित हो गया है" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "%s का कोई वैकल्पिक संस्थापित प्रदाता नहीं है" #~ msgid "for %s" #~ msgstr "%s के लिए" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "%s को हटाने से बचाने के लिए %s को अपग्रेड करना संभव नहीं।" #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s ही %s प्रदान करता है, लेकिन इसे असंस्थापित करना निर्धारित है।" #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "" #~ "%s ही %s प्रदान करता है, लेकिन इस %s का एक अन्य संस्करण पहले ही संस्थापित है। " #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s ही %s प्रदान करता है, लेकिन यह असंस्थापनयोग्य है। अधिक जानकारी के लिए इसे स्वयं " #~ "ही संस्थापित करने की कोशिश करें।" #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s ही %s प्रदान करता है, लेकिन यह लॉक है।" #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s ही %s प्रदान करता है, लेकिन इसे रखा जाना निर्धारित है।" #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s ही %s प्रदान करता है, लेकिन इसके पास कोई और स्थापत्य है।" #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "%s के लिए %s आवाश्यकताएं संतुष्ट नहीं कर सकता" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "संस्थापित हो चुके किसी अन्य रिजॉल्वेबल को %s की आवश्यकता है, अतः यह अनलिंक नहीं किया " #~ "जा सकता।" #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "संस्थापित हो चुके किसी अन्य रिजॉल्वेबल को %s की आवश्यकता है, अतः यह अनलिंक नहीं किया " #~ "जा सकता।" #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "%s (%s) पर टकराव के लिए संस्थापित होने वाले %s को हटाए जाने की आवश्यकता है" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "%s पर टकराव होने के कारण %s को असंस्थापनीय के रूप में चिन्हित किया जा रहा है" #~ msgid "from %s" #~ msgstr "%s से" #~ msgid " Error!" #~ msgstr "त्रुटि!" #~ msgid " Important!" #~ msgstr "महत्वपूर्ण!" #~ msgid "%s depended on %s" #~ msgstr "%s निर्भर है %s पर" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s को %s की आवश्यकता है" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s को %s की आवश्यकता है" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s से %s को प्रतिस्थापित किया जाता है" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s को %s की आवश्यकता है" #~ msgid "%s part of %s" #~ msgstr "%s का %s भाग" libzypp-17.36.5/po/hr.po000066400000000000000000003125721476576476200150170ustar00rootroot00000000000000# translation of zypp.hr.po to Croatian # 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. # Krešimir Jozić , 2008, 2009, 2011. msgid "" msgstr "" "Project-Id-Version: zypp.hr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2011-04-03 12:05+0200\n" "Last-Translator: Krešimir Jozić \n" "Language-Team: Croatian \n" "Language: hr\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: Lokalize 1.0\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Nema koda" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andora" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Ujedinjeni arapski emirati" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanija" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenija" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Norveški Antili" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antartika" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Američka Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austrija" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australija" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbedžan" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosna i Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" # BD #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladeš" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgija" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bugarska" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivija" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazil" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahami" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Butan" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet Otok" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Bocvana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Bjelorusija" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Otočje" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Centralna Afrička Republika" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Švicarska" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Otočje Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Čile" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbija" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kostarika" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Capo Verde" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Uskršnje otočje" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cipar" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Republika Češka" # DE #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Njemačka" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danska" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikanska republika" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alžir" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonija" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipat" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritreja" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Španjolska" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopija" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finska" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Otočje (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Otočje Faroe" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francuska" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Ujedinjeno Kraljevstvo" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Francuska Gvineja" # DE #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grenland" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambija" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Gvineja" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatorijalna Gvineja" # GR #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grčka" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Gvatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GN #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Gvineja-Bisau" # GH #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Gvajana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Hrvatska" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" # HU #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Madžarska" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonezija" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irska" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indija" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Teritorij Britanskog Indijskog Oceana" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italija" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamajka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenija" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgistan" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodža" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comoros" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Sjeverna Koreja" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Južna Koreja" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuvajt" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kajmansko otočje" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazahstan" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Lihtenštajn" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Šri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberija" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litva" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvija" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libija" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Crna Gora" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Sveti Martin" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonija" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mianmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolija" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Marinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritanija" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauricijus" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Mali" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malezija" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" # GM #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibija" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nova Kaledonija" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" # CK #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Otočje Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigerija" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragva" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nizozemska" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norveška" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Novi Zeland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Francuska Polinezija" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipini" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poljska" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Portoriko" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestinski teritorij" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paragvaj" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumunjska" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Srbija" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudijska Arabija" # CK #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomonski otoci" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Sejšeli" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Švedska" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenija" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovačka" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sijera Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalija" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Sirija" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Čad" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" # CG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tajland" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunis" # CG #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turska" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tajvan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzanija" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrajina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Sjedinjene Američke Države" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Urugvaj" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venecuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Faroe Otočje" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vijetnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Južna Afrika" # GM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambija" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabve" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Pruža" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Zahtijeva" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Sukobi" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Zastarjelo" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Preporuča" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Predlaže" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Poboljšava" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Dopunjava" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" # AZ #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikkans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanski" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arapski" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armenijski" # AZ #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" # AZ #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskijski" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bjeloruski" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" # BJ #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" # BJ #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" # BJ #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosanski" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonski" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bugarski" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" # TD #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalanski" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kineski" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptski" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korzikanski" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Češki" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danski" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nizozemski" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engleski" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonski" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipinski" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finski" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francuski" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "" # GA #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germanski (ostali)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Njemački" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irski" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galicijski" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" # GA #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" # GA #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" # HT #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haićanski" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Havajski" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebrejski" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" # HT #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" # HT #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Mađarski" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandski" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonežanski" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Talijanski" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanski" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japanski" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" # GM #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" # MW #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korejski" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdski" # KE #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" # GM #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latinski" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvijski" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litvanski" # CG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luksemburški" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonski" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" # MW #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" # ML #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" # MG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maorski" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Razni jezici" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Malteški" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavijski" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolski" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Više jezika" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "" # ML #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalski" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norveški" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubijski jezici" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" # LY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomanski jezici" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Perzijski" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenički" # ML #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Poljski" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugalski" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumunjski" # BI #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ruski" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrt" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Srpski" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilijski" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Hrvatski" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitski (ostali)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" # GH #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovački" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenski" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoanski" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalski" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Španjolski" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinijski" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sudanski" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerski" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Suahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Švedski" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Sirijski" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamilski" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tajlandski" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingonski" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" # CK #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turski" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrajinski" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" # VN # fuzzy #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vjetnamski" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Velški" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jidiš" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "nepoznato" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nije podržano" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "neispravno" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Neispravan regularni izraz '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "Ne mogu napraviti datoteku." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Ne mogu napraviti %s: %m\n" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Ne mogu obrisati '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Alias repozitorija ne može započeti s točkom." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Nastaviti?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "izvršavanje nije uspjelo" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 #, fuzzy msgid "unsupported request" msgstr "nije podržano" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "izvršeno" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr "izvršavanje nije uspjelo" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "(ne istječe)" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(ne istječe)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(ISTEKLO)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(istječe unutar 24 sata)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, fuzzy, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(istječe unutar 24 sata)" msgstr[1] "(istječe unutar 24 sata)" msgstr[2] "(istječe unutar 24 sata)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL shema je obavezna komponenta" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Neispravna Url shema '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relativna putanja nije dozvoljena ako postoji autoritet" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Ne mogu obrisati '%s'" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Neispravan URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Medij ne podržava operaciju" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Dozvola za pristup '%s' je odbijena." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Da" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ne" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Upozorenje:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Greška" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "gotovo" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "greška" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Upozorenje:" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Dohvaćam:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "pokrećem" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Datoteka nije pronađena: {0}" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "pomoć nije raspoloživa za ovaj izbor" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "da" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ne" #~ msgid "problem with installed package %s" #~ msgstr "problem s instaliranim paketom %s" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Disk ne postoji." #~ msgid "do not install %s" #~ msgstr "nemoj instalirati %s" #~ msgid "keep %s" #~ msgstr "zadrži %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "deinstalacija %s" #~ msgid "deinstallation of %s" #~ msgstr "deinstalacija %s" #, fuzzy #~ msgid "Hal Exception" #~ msgstr "Šifriranje" #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "veza nije uspostavljena" #, fuzzy #~ msgid "HalDrive not initialized" #~ msgstr "Inicijalizacija mete nije uspjela:" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "Ne mogu napraviti datoteku rezervne kopije %1." #~ msgid "Failed to download %s from %s" #~ msgstr "Ne mogu skinuti %s sa %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Srbija i Crna Gora" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "Nesipravna lozinka" #, fuzzy #~ msgid "Ignore that %s is already set to install" #~ msgstr "Direktorij %1 je već na listi." #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Instaliram upravljački program..." #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "Instaliram upravljački program..." #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "Instaliram upravljački program..." #, fuzzy #~ msgid "install %s" #~ msgstr "Instaliram na:" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "Instaliram upravljački program..." libzypp-17.36.5/po/hu.po000066400000000000000000004331761476576476200150260ustar00rootroot00000000000000# translation of zypp.hu.po to Hungarian # translation of zypp.new.po to # translation of zypp.po to # translation of zypp.hu.po to # Hungarian message File YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # # Marcel Hilzinger , 2001. # Sári Gábor , 2000. # Steve Varadi , 2000. # Zoltán Levárdy , 1999. # Kalman Kemenczy , 2006, 2007, 2008, 2009, 2010. # Ervin Novak , 2008, 2011. # Kalman Kemenczy , 2011, 2012, 2013. msgid "" msgstr "" "Project-Id-Version: zypp.hu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2019-03-23 20:19+0000\n" "Last-Translator: Robert Taisz \n" "Language-Team: Hungarian \n" "Language: hu\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: Weblate 3.3\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Ismeretlen ország: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Nincs kód" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Egyesült Arab Emirátusok" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganisztán" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua és Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albánia" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Örményország" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Holland Antillák" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktisz" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentína" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikai Szamoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Ausztria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Ausztrália" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Aland-szigetek" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbajdzsán" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosznia-Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Banglades" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgium" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgária" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrein" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Szultanátus" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolívia" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazília" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahama-szigetek" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhután" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet-sziget" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Fehéroroszország" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kókusz-szigetek (Keeling)" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongó" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Közép-Afrikai Köztársaság" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Svájc" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Elefántcsontpart" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cook-szigetek" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kína" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Zöld-foki Köztársaság" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Karácsony-sziget" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Ciprus" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Csehország" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Németország" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Dzsibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dánia" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikai Köztársaság" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algéria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Észtország" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egyiptom" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Nyugat-Szahara" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanyolország" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiópia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finnország" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidzsi" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falkland-szigetek (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikronéziai Szövetségi Államok" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Feröer-szigetek" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Franciaország" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Nagyvárosi Franciaország" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Egyesült Királyság" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Grúzia" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Francia Guiana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghána" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltár" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grönland" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Egyenlítői Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Görögország" # GS # fuzzy #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Dél-Georgia és a Dél-Sandwich-sziget" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Bissau-Guinea" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard-sziget és McDonald-szigetek" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Horvátország" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Magyarország" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonézia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Írország" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Man sziget" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Brit indiai-óceáni terület" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irán" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Izland" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Olaszország" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordánia" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japán" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgizisztán" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodzsa" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comore-szigetek" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts és Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Észak-Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Dél-Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuvait" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kajmán-szigetek" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazahsztán" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Lao Népi Demokratikus Népköztársaság" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Santa Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Srí Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Libéria" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litvánia" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Lettország" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Líbia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokkó" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" # CG #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegró" # SM #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint-Martin" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaszkár" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshall-szigetek" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedónia" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mianmar" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongólia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makaó" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Északi Mariana-szigetek" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritánia" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Málta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldív-szigetek" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexikó" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malajzia" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namíbia" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Új-Kaledónia" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk-sziget" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigéria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Hollandia" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norvégia" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepál" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Új-Zéland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omán" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Francia Polinézia" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Pápua Új-Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Fülöp-szigetek" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakisztán" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Lengyelország" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre és Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palesztin terület" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugália" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Románia" # src/trans.h:311 #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Szerbia" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Oroszország" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Szaúd-Arábia" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salamon-szigetek" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelle-szigetek" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Szudán" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Svédország" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Szingapúr" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Szent Ilona" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Szlovénia" # SJ # fuzzy #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard és Jan Mayen-szigetek" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Szlovákia" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Szenegál" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Szomália" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome és Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Salvador" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Szíria" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Szváziföld" # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- és Caicos-szigetek" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Csád" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Déli francia területek" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thaiföld" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tádzsikisztán" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Türkmenisztán" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunézia" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Kelet-Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Törökország" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad és Tobago" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tajvan" # TZ #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzánia" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrajna" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Amerikai Egyesült Államok - kisebb külső szigetek" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Amerikai Egyesült Államok" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Üzbegisztán" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikán (Szentszék)" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent és Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Brit Virgin-szigetek" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Virgin-szigetek (USA)" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis és Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Szamoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Dél-Afrika" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Szolgáltatásai:" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Előfeltételei:" #: zypp/Dep.cc:98 msgid "Requires" msgstr "A következőket igényli:" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Ütközik ezzel:" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Elavult" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "A következőket ajánlja:" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "A következőket javasolja:" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "A következőket javítja:" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "A következőket egészíti ki:" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Ismeretlen nyelv: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "abház" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "akínai" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "acsoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "cserkesz" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "afro-ázsiai (egyéb)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "afrihili" # src/trans.h:281 src/trans.h:318 #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "akkád" # src/trans.h:282 #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "albán" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "algonkin nylevek" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "dél-altáji" # src/trans.h:283 #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "amhara" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "óangol (kb. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "apacs nyelvek" # src/trans.h:283 #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "arab" # src/trans.h:283 #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "arámi" # src/trans.h:294 #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "aragóniai" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "örmény" # src/trans.h:227 #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "araukán" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "mesterséges (egyéb)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "asszámi" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "asztúriai" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "athapaszka nyelvek" # modules/inst_sw_single.ycp:117 # clients/inst_sw_single.ycp:1072 #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "ausztrál nyelvek" # src/trans.h:283 #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "avar" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "avesztán" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "avádi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "aymara" # src/trans.h:311 #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "azeri" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "banda" # modules/inst_sw_single.ycp:117 # clients/inst_sw_single.ycp:1072 #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "bamileke nyelvek" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "baskír" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "balucsi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "bambara" # src/trans.h:220 #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "balinéz" # src/trans.h:284 #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "baszk" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "balti (egyéb)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "beja" # src/trans.h:286 #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "belorusz" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "bengáli" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "berber (egyéb)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "bhodzspuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "biszlama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "szikszika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "bantu (egyéb)" # src/trans.h:309 #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "bosnyák" # src/trans.h:285 #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "bradzs" # src/trans.h:285 #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "breton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "batak (Indonézia)" # src/trans.h:285 #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "burját" # src/trans.h:220 #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "buginéz" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "bolgár" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "burmai" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "közép-amerikai indián (egyéb)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "karib" # src/trans.h:287 #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "katalán" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "kaukázusi (egyéb)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "kelta (egyéb)" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "csamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "csibcsa" # src/trans.h:290 #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "csecsen" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "csagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "kínai" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "csúki" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "csinúk zsargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "csippewi" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "cseroki" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "egyházi szláv" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "csuvas" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "csejenn" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "hámi nyelvek" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "kopt" # src/trans.h:363 #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "cornwalli" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "korzikai" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "angol alapú kreol és pidgin (egyéb)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "francia alapú kreol és pidgin (egyéb)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "portugál alapú kreol és pidgin (egyéb)" # modules/inst_custom_part.ycp:498 #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "krí" # /usr/lib/YaST2/clients/lan_dns.ycp:87 # clients/lan_dns.ycp:271 #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "krími tatár" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "kreol és pidgin (egyéb)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "kasub" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "kusiti (egyéb)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Cseh" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dán" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "dargva" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "dajak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "delavár" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "slave (athapaszkai)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "dravidi (Other)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "alsó-szorbiai" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "holland, középkori (kb. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "holland" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "djula" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "dzongha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "egyiptomi (ókori)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "ekadzsuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "elamit" # src/trans.h:293 #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "angol" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "angol, középkori (1100-1500)" # src/trans.h:298 #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "eszperantó" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "észt" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "ewe" # modules/inst_custom_part.ycp:493 #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "evondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "fang" # src/trans.h:294 #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "färöi" # modules/dialup/dialup.ycp:390 modules/dialup/dialup.ycp:400 # modules/dialup/dialup.ycp:410 # clients/lan_ISDN.ycp:908 #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "fidzsi" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Fülöp-szigeteki" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "finn" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "finn-ugor (egyéb)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "francia" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "francia, középkori (kb. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "ófrancia (842-kb. 1400)" # src/trans.h:227 #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "fríz" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:762 #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "fulah" # src/trans.h:227 #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "friuli" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "ga" # GA #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "germán (egyéb)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "grúz" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "német" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "geez" # src/trans.h:270 #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "gilberti" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "gaelic" # src/trans.h:303 #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "ír" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "galíciai" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "német, késő középkori (kb. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "német, késő ókori (kb. 750-1050)" # modules/sound/sound.ycp:204 modules/sound/sound.ycp:459 # modules/sound/sound.ycp:473 modules/sound/sound.ycp:486 # modules/sound/sound.ycp:536 modules/sound/sound.ycp:621 # modules/sound/sound.ycp:683 modules/sound/sound.ycp:708 # modules/sound/sound.ycp:719 modules/sound/sound.ycp:754 # modules/sound/sound.ycp:801 modules/sound/sound.ycp:848 # modules/sound/sound.ycp:874 modules/sound/sound.ycp:918 #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "gót" # clients/inst_sw_single.ycp:1298 #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "görög, ókori (1453-ig)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "görög, modern (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "gudzsarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "haida" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "haiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "hausza" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "hawaii" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "héber" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "himacsáli" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "hindi" # HT #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "hettita" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "hmong" # HT #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "hiri motu" # src/trans.h:311 #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "felső szorb" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "magyar" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "hupa" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "izlandi" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "szecsuani yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "idzso" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "inuktitut" # src/prefs.c:380 #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "interlingva" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "interlingva (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "indiai (egyéb)" # src/trans.h:302 #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "indonéz" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "indoeurópai (egyéb)" # src/trans.h:293 #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "ingus" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "inupiak" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "iráni (egyéb)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "irokéz nyelvek" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "olasz" # src/trans.h:222 #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "jávai" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "lodzsbai" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japán" # clients/inst_sw_single.ycp:1320 clients/inst_sw_single.ycp:1971 #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "judeo-perzsa" # src/trans.h:283 #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "judeo-arab" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "kara-kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "kabil" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "kacsin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "kasmíri" # src/trans.h:316 #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "kavi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "kazah" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "kabardi" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "hászi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "khoisan (egyéb)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "khotáni" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "kirgiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbunduk" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "komi" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "kongó" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "koreai" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "kozrai" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "karacsai-balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "kru" # src/trans.h:316 #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "kumik" # src/trans.h:316 #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "kurd" # KE #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "kutenai" # src/trans.h:47 src/trans.h:50 #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "lamba" # src/prefs.c:397 src/trans.h:125 #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "lao" # src/trans.h:47 src/trans.h:50 #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "latin" # src/trans.h:289 #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "lett" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "lezgiai" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "limburgi" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litván" # CG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "luxemburgi" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "luba-lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "luba-katanga" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "luo (Kenya és Tanzánia)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "lushai" # src/trans.h:305 #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "macedón" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "maduri" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "magahi" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "marshall" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "maithili" # MG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "makaszár" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "malajálam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "ausztronéziai (egyéb)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "marathi" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "maszáj" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "maláj" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "moksa" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "ír, középkori (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "vegyes nyelvek" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "mon-khmer (egyéb)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "malagázi" # src/trans.h:377 #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "máltai" # modules/dialup/dialup.ycp:391 modules/dialup/dialup.ycp:401 # modules/dialup/dialup.ycp:411 # clients/lan_ISDN.ycp:909 #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "mandzsu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "manobo nyelvek" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "mohauk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "moldáv" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "mossi" # modules/inst_sw_single.ycp:117 # clients/inst_sw_single.ycp:1072 #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "több nyelv" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "munda nyelvek" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "krík" # src/trans.h:294 #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "mirandai" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "marvari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "maja nyelvek" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "erzia" # modules/dialup/dialup.ycp:391 modules/dialup/dialup.ycp:401 # modules/dialup/dialup.ycp:411 # clients/lan_ISDN.ycp:909 #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "észak-amerikai indián" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "nápolyi" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "navahó" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "dél-ndebelei" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "észak-ndebelei" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "alsó-német" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "nepáli" # NP #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "nepál-bhászai" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "niger-kordofáni (egyéb)" # NU #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "niuei" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "norvég nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "norvég Bokmal" # TO #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "norvég, régi" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "norvég" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "északi sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "núbiai nyelvek" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "klasszikus nevari" # src/trans.h:290 #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "csicseva" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "njamvézi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "okcitán (1500 utáni)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "odzsibva" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "orija" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "oszét" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "török, ottomán (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "otomi nyelvek" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "pápua (egyéb)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "pangazini" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "pandzsábi" # clients/lan_modem.ycp:602 #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "palaui" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "perzsa, régi (kb. i.e. 600-400)" # clients/inst_sw_single.ycp:1320 clients/inst_sw_single.ycp:1971 #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "perzsa" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Fülöp-szigeteki (egyéb)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "föníciai" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "páli" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "lengyel" # src/trans.h:302 #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "pompeji" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "portugál" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "prakrit nyelvek" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "provanszi, régi (1500-ig)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "kecsua" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "rádzsasztáni" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "rapanui" # menuentries/menuentry_lan_route.ycp:14 #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "rarotongai" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "romansz (egyéb)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "rétoromán" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "romany-i" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "román" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "orosz" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "szango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "jakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "dél-amerikai indián (egyéb)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "salishi nyelvek" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "szamaritánus arámi" # src/trans.h:193 #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "szanszkrit" # src/trans.h:193 #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "szaszak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "szantáli" # src/trans.h:311 #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "szerb" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "szicíliai" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "skót" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "horvát" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "sémi (egyéb)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "ír, régi (900-ig)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "jelnyelvek" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "sán" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "szidamo" # src/trans.h:270 #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "szinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "sziú nyelvek" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "sino-tibeti (egyéb)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "szláv (egyéb)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "szlovák" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "szlovén" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "déli számi" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "északi számi" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "számi nyelvek (egyéb)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "lule számi" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "inári számi" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "szamoai" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "szkolt számi" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "szindi" # modules/inst_sw_select.ycp:125 # /usr/lib/YaST2/clients/inst_sw_select.ycp:194 # clients/online_update.ycp:39 #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "szogdiai" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "szomáli" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "szonghai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "sotho, déli" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "spanyol" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "szardíniai" # clients/lan_nfs_fstab.ycp:272 #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "szerer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "nílus-szaharai (egyéb)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "szvázi" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "szukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "szundanéz" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "szuszu" # src/trans.h:311 #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "sumer" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "szuahéli" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "svéd" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "szír" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "tahiti" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "tai (egyéb)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "tatár" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "tádzsik" # src/trans.h:116 #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "tibeti" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "tigre" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "tigrinja" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "tamasek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "tonga (Nyasa)" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "tongai (Tonga-szigetek)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "tok pisin" # src/trans.h:227 #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "cimsiai" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "türkmén" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "tupi nyelvek" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "török" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "altáji (egyéb)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "tuvíniai" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "udmurti" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "ugariti" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "ujgur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "ukrán" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "umbundu" # src/prefs.c:380 #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "meghatározatlan" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "üzbég" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "venda" # src/trans.h:270 #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "vietnami" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "vóti" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "vakasai nyelvek" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "valamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "varai" # modules/inst_config_x11.ycp:127 # /usr/lib/YaST2/clients/inst_config_x11.ycp:750 #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "vaso" # modules/inst_config_x11.ycp:127 # /usr/lib/YaST2/clients/inst_config_x11.ycp:750 #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "walesi" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "szorbiai nyelvek" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "vallon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "kalmik" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "xhosa" # src/prefs.c:397 src/trans.h:125 #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "yapi" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "jiddis" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "joruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "jupik nyelvek" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "zapotek" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "zenaga" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "A rendszer a következő műveleteket hajtja végre:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "ismeretlen" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nem támogatott" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "1. szintű" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "2. szintű" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "3. szintű" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "További Ügyfélszerződés szükséges" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "érvénytelen" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Nincs meghatározva a támogatás szintje" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "A gyártó nem biztosít támogatást." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Probléma azonosítás, amely a kompatibilitási információ nyújtására, " "telepítési segítségre, felhasználási támogatásra, folyamatos karbantartásra, " "és alapszintű hibakeresésre terjed ki. Az 1. szintű támogatásnak nem célja a " "termék hibáinak javítása." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Probléma izoláció, amely a vásárlói problémák reprodukálására, a problémák " "beazonosítására és az 1. szintű támogatás által meg nem oldott problémák " "javítására terjed ki." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Probléma megoldás, amely a fejlesztők bevonásával a 2. szintű támogatás " "által beazonosított összetett termékhibák megoldását szolgálja." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "További ügyfélszerződés szükséges a támogatáshoz." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Ismeretlen támogatási opció. Leírás nem található" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "A rendszerkezelőt a %d (%s) pid-del rendelkező folyamat zárolta.\n" "Kérem, zárja be az alkalmazást, majd próbálja újra." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Ismeretlen illeszkedőmód: '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Ismeretlen illeszkedőmód: '%s', a(z) %s mintához." #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Érvénytelen reguláris kifejezés '%s': regcomp visszatérési értéke: %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Érvénytelen reguláris kifejezés '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Felhasználóhitelesítés szükséges ehhez: '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Keresse fel a SUSE Ügyfélközpontot, és ellenőrizze, hogy a regisztrációja " "érvényes-e, illetve nem járt-e le." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Látogassa meg a Novell Ügyfélközpotot (Novell Customer Center), hogy " "ellenőrizni tudja, hogy a regisztrációja érvényes és nem jár re." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Csatlakoztatási pont létrehozása: Nem található írható könyvtár " "csatlakoztatási pont létrehozásához" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Először az 'lsof' csomagot kell telepíteni." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Nem hozható létre a metaadat gyorsítótár-könyvtára." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Hiba történt a következőből való olvasás során: \"%s\"" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "A(z) %s nem hozható létre" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Nem sikerült a tároló gyorsítótárazása (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "A(z) '%s' telepítési forrás gyorsítótárának felépítése" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" "Írási engedélyek hiányában nem hozható létre gyorsítótár a(z) %s helyen." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Nem kezelt tárolótípus" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "A(z) '%s' telepítési forrás hozzáadása" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Érvénytelen tárolónév: '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "A '%s' fájl nem nyitható meg írásra." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Ismeretlen hiba a '%s' beolvasása közben" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" "A következő telepítésiforrás-könyvtár nem olvasható: '%1%': A rendszer " "megtagadta az engedélyt" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Nem sikerült a(z) '%s' könyvtár beolvasása." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" "A következő telepítésiforrás-fájl nem olvasható: '%1%': A rendszer " "megtagadta az engedélyt" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "A(z) '%s' telepítési forrás eltávolítása" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Nem sikerült a tároló felismerése." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "A(z) '%s' törlése sikertelen" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Nem sikerült a szolgáltatás felismerése." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Ismeretlen '%1%' szolgáltatás: az árva '%2%' szolgáltatástároló eltávolítása" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "A telepítési forrás álneve nem kezdődhet ponttal." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "A szolgáltatás álneve nem kezdődhet ponttal." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Folytatja?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "A(z) %1% telepítési forrás nem definiál további 'gpgkey=' URL-címeket." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "%1% azonosítójú gpg-kulcs keresése a telepítési forrásban (%2%)." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "%1% azonosítójú gpg-kulcs keresése a gyorsítótárban (%2%)." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "'%s' szükséges paraméter hiányzik." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Legalább az egyik szükséges a '%s' és '%s' paraméterekből." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Az aláírás-ellenőrzés sikertelen" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "A(z) %s csomag megsérülhetett az átvitel közben. Megismétli az átvitelt?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Nem sikerült a %s csomag beszerzése. Megismétli az átvitelt?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "az applydeltarpm ellenőrzés sikertelen." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "az applydeltarpm futtatása sikertelen." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "A szolgáltatási bővítmény nem támogatja attribútum módosítását." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "A(z) '%s' fájlt nem biztosítja a(z) '%s' telepítési forrás" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "A telepítés forrás nem tartalmaz url-t." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "A(z) %1% fájl\n" " (csomag:\n" " %2%)\n" " ütközik a(z)\n" " %3% csomag fájljával" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "A(z) %1% fájl\n" " (csomag:\n" " %2%)\n" " ütközik a(z)\n" " %3% telepítés fájljával" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "A(z) %1% fájl\n" " (telepítés:\n" " %2%)\n" " ütközik a(z) %3%\n" " csomag fájljával" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "A(z) %1% fájl\n" " (telepítés:\n" " %2%)\n" " ütközik a(z) %3%\n" " telepítés fájljával" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "A(z) %1% fájl\n" " (csomag:\n" " %2%)\n" " ütközik a(z)\n" " %4%\n" " csomag\n" " %3% fájljával" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "A(z) %1% fájl\n" " (csomag:\n" " %2%)\n" " ütközik a(z)\n" " %4%\n" " telepítés\n" " %3% fájljával" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "A(z) %1% fájl\n" " (telepítés:\n" " %2%)\n" " ütközik a(z)\n" " %3%\n" " fájllal (csomag:\n" " %4%)" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "A(z) %1% fájl\n" " (telepítés:\n" " %2%)\n" " ütközik a(z)\n" " %3%\n" " fájllal (telepítés:\n" " %4%)" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Nem hozható létre sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "%s csomag megtörése néhány függőség figyelmen kívül hagyásával" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "egyes függőségek általános mellőzése" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "ütköző kérelmek" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "bizonyos függőségi probléma" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "nem támogatott kérelem" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "törölt csomagok: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "nem telepíthető szolgáltatók: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "nem telepíthető szolgáltatók: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "A kért módosítás a rendszer meghibásodásához vezet!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "a hibás rendszer figyelmeztetésének figyelmen kívül hagyása" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "A kérésnek megfelelően a telepítés megszakad." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " végrehajtva" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " végrehajtás sikertelen" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s már futtatva volt mint %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " megszakítás közben a végrehajtás átugorva" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Hiba történt a frissítési értesítés küldésekor." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Új frissítési üzenet" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM sikertelen: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Nem sikerült a(z) %1% fájlból importálni a publikus kulcsot" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "A(z) %1% publikus kulcs eltávolítása sikertelen" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" # modules/dialup/dialup.ycp:231 modules/dialup/dialup.ycp:246 # modules/dialup/dialup.ycp:259 # menuentries/menuentry_lan_sendmail.ycp:14 #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s módosított konfigurációs fájljai:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "Az rpm a következőként mentette %s-t: %s, de nem sikerült megállapítani a " "különbséget" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "Az rpm a következőként mentette %s-t: %s.\n" "A különbség első 25 sora:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "Az rpm a következőként hozta létre %s-t: %s, de nem sikerült megállapítani a " "különbséget" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "Az rpm a következőként hozta létre %s-t: %s.\n" "A különbség első 25 sora:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "További rpm kimenet" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "%s másolata létrehozva" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Az aláírás rendben van" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Ismeretlen típusú aláírás" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Az aláírás nem felelt meg az ellenőrzésen" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Az aláírás rendben van, de a kulcs nem megbízható" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Az aláírások nyilvános kulcsa nem érhető el" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "A fájl nem létezik, vagy nem ellenőrizhető az aláírása" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "A fájl nincs aláírva" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "nem jár le" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "lejárt: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "lejár: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(nem jár le)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(LEJÁRT)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(24 órán belül lejár)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(%d napon belül lejár)" msgstr[1] "(%d napon belül lejár)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Kísérlet nem létező kulcs (%s) importálására a(z) %s kulcstárban" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Nem sikerült importálni a kulcsot." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "A kulcs törlése sikertelen." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "A(z) %s aláírás-fájl nem található" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "'%s' bizonytalan típus %u byte, ellenőrzőösszeg '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "A pty nem nyitható meg (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "A cső nem nyitható meg (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Érvénytelen LDAP URL lekérdezési karakterlánc" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Érvénytelen LDAP URL lekérdezési paraméter: '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Az URL-objektum másolása sikertelen" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Érvénytelen üres URL-objektum hivatkozás" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Az URL-komponensek elemzése sikertelen" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Előzmények:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Az Url séma nem engedélyezi a(z) %s használatát" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Érvénytelen %s-komponens: '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Érvénytelen %s-komponens" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" "A lekérdezési karakterlánc feldolgozása ehhez az URL-hez nem támogatott" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Az URL-séma megadása szükséges" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Érvénytelen URL-séma: '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Az URL-séma nem engedélyezi a felhasználónevet" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Az URL-séma nem engedélyezi a jelszót" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Az URL-sémában a gépkomponens (host) megadása kötelező" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Az Url séma megadása nem engedélyezi a gépkomponenst (host)" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Hibás gépkomponens (host): '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Az Url séma nem engedélyezi a portot" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Érvénytelen port komponens: '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Az Url sémában az elérési útvonal megadása szükséges" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" "Megadott hitelesítő esetén a relatív elérési útvonal megadása nem támogatott" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "A kódolt karakterlánc NUL byte-ot tartalmaz" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" "Érvénytelen tömbszétválasztás-elválasztó (array split separator) karakter" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" "Érvénytelen leképezésszétválasztás-elválasztó (map split separator) karakter" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Érvénytelen tömbösszefűzés-elválasztó (array join separator) karakter" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "A parancs a következő állapottal lépett ki: %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "A parancs végrehajtását a(z) %d szignál megszakította (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "A parancs végrehajtása ismeretlen hibával leállt." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "A chroot sikertelen ide: '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Sikertelen chdir a(z) '%s' könyvtárra (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" "Sikertelen chdir a(z) '%s' könyvtárra a következő gyökéren belül: '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "'%s' végrehajtása sikertelen (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "A forkolás sikertelen (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Nem sikerült a(z) %s felcsatolása ide: %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "A(z) %s eltávolítása sikertelen" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Hibás fájlnév: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" "Az adathordozó elérése a(z) '%s' művelet végrehajtása közben nem sikerült." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "A(z) '%s' fájl nem található a(z) '%s' adathordozón" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "A fájl írása sikertelen: '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Az adathordozó nincs csatlakoztatva" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Hibás csatolási pont" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "A letöltés (curl) inicializálása meghiúsult: '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "%s rendszerkivétel történt a(z) '%s' adathordozón." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "A(z) '%s' elérési út a(z) '%s' adathordozón nem fájl." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "A(z) '%s' elérési út a(z) '%s' adathordozón nem könyvtár." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Hibás URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Üres hosztnév a hivatkozásban" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Üres fájlrendszer a hivatkozásban" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Üres cél a hivatkozásban" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Érvénytelen URI séma: '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Az adathordozó nem támogatja ezt a műveletet" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Letöltési (curl) hiba: '%s'\n" "Hibakód: %s\n" "Hibaüzenet: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Hiba történt a '%s' letöltési (curl) beállításainak beállítása közben:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "A '%s' adathordozó forrása nem tartalmazza a kívánt adathordozót" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Jelenleg egy másik folyamat használja a(z) '%s' adathordozót" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Nincs kiadható adathordozó" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "A(z) '%s' adathordozó kiadása sikertelen" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Hozzáférés megtagadva: '%s'." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Időtúllépés a '%s' elérése közben." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "A letöltött adatok mérete meghaladta a várt fájlméretet: '%s' (összesen: " "'%s')." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "A '%s' hely ideiglenesen nem elérhető." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " hiba az SSL-tanúsítvánnyal, ellenőrizze, hogy megfelelő-e a CA tanúsítványa " "a következőhöz: '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Nem támogatott HTTP hitelesítési metódus: '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Igen" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nem" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Megjegyzés:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Figyelmeztetés:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Hiba:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "kész" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "hiba" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Figyelmeztetés: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Letöltés:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "indítás" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "nem található" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Ennél a parancssornál nem érhető el a súgó." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "ehhez a paraméterhez nem tartozik súgó" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "az összes lehetőség megjelenítése" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "igen" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nem" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "A megadott URL-címen nem találhatók érvényes metaadatok" #~ msgstr[1] "A megadott URL-címeken nem találhatók érvényes metaadatok" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "'%1%' %%posttrans parancsfájl végrehajtása" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "%posttrans parancsfájlok végrehajtása" #~ msgid "Package is not signed!" #~ msgstr "A csomag nincs aláírva." #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s nem tartozik a distupgrade telepítési forráshoz" #~ msgid "%s has inferior architecture" #~ msgstr "%s alacsonyabb szintű architektúrával rendelkezik" #~ msgid "problem with installed package %s" #~ msgstr "probléma a telepített csomaggal: %s" #~ msgid "nothing provides requested %s" #~ msgstr "semmi nem biztosítja a(z) %s csomagot" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Minden szükséges telepítési forrást engedélyezett?" #~ msgid "package %s does not exist" #~ msgstr "a(z) %s csomag nem létezik" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "A(z) %s a rendszertől származik, ezért törlése nem lehetséges." # modules/inst_target_part.ycp:676 #~ msgid "%s is not installable" #~ msgstr "%s nem telepíthető" #~ msgid "nothing provides %s needed by %s" #~ msgstr "" #~ "semmi sem biztosítja a(z) %s csomagot,\n" #~ "amely szükséges a(z) %s csomag telepítéséhez" # modules/inst_target_part.ycp:676 #~ msgid "cannot install both %s and %s" #~ msgstr "nem telepíthető %s és %s is" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s ütközik a(z) %s csomaggal, amit a(z) %s csomag biztosít" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s elavulttá teszi a(z) %s csomagot, amit a(z) %s csomag biztosít" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s elavulttá teszi a(z) %s csomagot, amit a(z) %s csomag biztosít" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s ütközik a(z) %s csomaggal, amit saját maga biztosít" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s csomagnak a következőre van szüksége: %s, de ez nem teljesíthető" #~ msgid "remove lock to allow removal of %s" #~ msgstr "távolítsa el a zárolást a(z) %s eltávolításának engedélyezéséhez" # modules/inst_target_part.ycp:676 #~ msgid "do not install %s" #~ msgstr "Ne telepítse a(z) %s csomagot" #~ msgid "keep %s" #~ msgstr "%s megtartása" #~ msgid "remove lock to allow installation of %s" #~ msgstr "távolítsa el a zárolást a(z) %s telepítésének engedélyezéséhez" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "ne kérdezzen rá a %s-t biztosító feloldható telepítésére" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "ne kérdezzen rá a %s-t biztosító feloldhatók eltávolítására" #~ msgid "do not install most recent version of %s" #~ msgstr "Ne telepítse a(z) %s csomag legújabb verzióját" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s megtartása az alacsonyabb rendű architektúra ellenére" #~ msgid "install %s despite the inferior architecture" #~ msgstr "%s telepítése az alacsonyabb architektúra ellenére" #~ msgid "keep obsolete %s" #~ msgstr "az elavult %s megtartása" #~ msgid "install %s from excluded repository" #~ msgstr "%s telepítése a figyelmen kívül hagyott tárolóból" #~ msgid "downgrade of %s to %s" #~ msgstr "A(z) %s csomag visszafejlesztése a(z) %s csomagra" #~ msgid "architecture change of %s to %s" #~ msgstr "A(z) %s csomag helyett a(z) %s architektúrájú csomag telepítése" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "%s telepítése (gyártó megváltoztatásával)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "%s cseréje erre: %s" #~ msgid "deinstallation of %s" #~ msgstr "%s eltávolítása" #~ msgid "Can't open lock file: %s" #~ msgstr "A zárolt fájl nem nyitható meg: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Ezt a folyamatot már elindította egy másik program." #~ msgid "Hal Exception" #~ msgstr "Hal kivétel" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "A libzypp ezen verziója HAL-támogatás nélkül készült." #~ msgid "HalContext not connected" #~ msgstr "A HalContext nem kapcsolódott" #~ msgid "HalDrive not initialized" #~ msgstr "A HalDriver inicializálása sikertelen" #~ msgid "HalVolume not initialized" #~ msgstr "A HalVolume inicializálása sikertelen" #~ msgid "Unable to create dbus connection" #~ msgstr "A dbus kapcsolat létrehozása sikertelen" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: A libhal kontextus létrehozása sikertelen" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: A dbus kapcsolat beállítása sikertelen" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "A HAL kontextus inicializálása sikertelen -- lehetséges, hogy a hald nem " #~ "fut?" #~ msgid "Not a CDROM drive" #~ msgstr "CD-ROM meghajtó nem található" #~ msgid "Can't initialize mutex attributes" #~ msgstr "A mutex attribútumok inicializációja sikertelen" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Rekurzív mutex attribútum nem állítható be" #~ msgid "Can't initialize recursive mutex" #~ msgstr "A rekurzív mutex attribútum inicializációja sikertelen" #~ msgid "Can't acquire the mutex lock" #~ msgstr "A mutex zárolása sikertelen" #~ msgid "Can't release the mutex lock" #~ msgstr "A mutex zárolása nem oldható fel" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Nem sikerült a(z) %s fájlból importálni a publikus kulcsot: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "A(z) %s publikus kulcs eltávolítása sikertelen: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Nincs elérhető hurokeszköz a '%s' által tartalmazott képfájl " #~ "felcsatolásához" #~ msgid "generally ignore of some dependecies" #~ msgstr "néhány függőség figyelmen kívül hagyása" # modules/inst_target_part.ycp:676 #~ msgid "do not forbid installation of %s" #~ msgstr "A(z) %s csomag telepítése" # modules/inst_target_part.ycp:676 #~ msgid "do not keep %s installed" #~ msgstr "A(z) %s csomag eltávolítása" #~ msgid "Serbia and Montenegro" #~ msgstr "صربيا ومونتنيجرو" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "خيار list غير معروف" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "تعذر حل التبعيات" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "A(z) %s publikus kulcs elkészítése %s kulcstartóból %s fájlba sikertelen" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "Nem létező kulcsot (%s) próbált a %s kulcstartóba importálni" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "A könyvtár '/'-ra váltása a chroot-ban sikertelen (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "A letöltés (Metalink curl) inicializálása meghiúsult: '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Letöltési (metalink curl) hiba: '%s'\n" #~ "Hibakód: %s\n" #~ "Hibaüzenet: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Letöltés megszakítva: at %d%%" #~ msgid "Download interrupted by user" #~ msgstr "A letöltés a felhasználó megszakította" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Hiba történt a '%s' letöltési (metalink curl) beállításainak beállítása " #~ "közben:" #~ msgid "Failed to download %s from %s" #~ msgstr "Nem sikerült a(z) %s letöltése innen: %s" libzypp-17.36.5/po/id.po000066400000000000000000003704771476576476200150120ustar00rootroot00000000000000# 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. # Kukuh Syafaat , 2017-2018. msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-11-13 15:48+0000\n" "Last-Translator: Arif Budiman \n" "Language-Team: Indonesian \n" "Language: id\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: Weblate 5.8.3\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Negara tidak diketahui: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Tidak ada kode" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" # AE #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Uni Emirat Arab" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua dan Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" # AL #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Belanda Antilles" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antartika" # AR #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Amerika" # AT #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" # AU #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Kepulauan Aland" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaijan" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia Herzegovina" # BB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" # BD #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" # BE #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgia" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" # BG #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" # BH #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" # BM #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" # BO #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazil" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahama" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Pulau Bouvet" # BW #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" # BY #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarusia" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" # CA #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kepulauan Cocos (Keeling)" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Republik Afrika Tengah" # CH #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Swiss" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Pantai Gading" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Kepulauan Cook" # CL #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chili" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" # CN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Cina" # CO #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolombia" # CR #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kosta Rica" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Tanjung Verde" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Pulau Christmas" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Siprus" # CZ #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Republik Ceko" # DE #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Jerman" # DJ #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Jibouti" # DK #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Denmark" # DM #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" # DO #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Republik Dominika" # DZ #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Aljazair" # EC #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekuador" # EE #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" # EG #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Mesir" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sahara Barat" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" # ES #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanyol" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Ethiopia" # FI #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlandia" # FJ #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Kepulauan Malvinas" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federasi Mikronesia" # FO #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Kepulauan Faroe" # FR #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Perancis" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Perancis Metropolitan" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Inggris" # GD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" # GE #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Grujia" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guiana Perancis" # DE #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" # GI #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" # GL #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Greenland" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" # GP #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinea Equator" # GR #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Yunani" # GS # fuzzy #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia Selatan dan Pulau Sandwich Selatan" # GT #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" # GU #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" # HK #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Pulau Heard dan Kepulauan McDonald" # HN #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" # HR #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroasia" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" # HU #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hungaria" # ID #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" # IE #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlandia" # IL #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Palestina" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Pulau Man" # IN #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Wilayah Samudra Hindia Britania" # IQ #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" # IS #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islandia" # IT #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" # JM # fuzzy #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaika" # JO #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Yordania" # JP #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Jepang" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgistan" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kamboja" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komoro" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Santa Kitts dan Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Korea Utara" # ZA #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Korea Selatan" # KW #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Pulau Cayman" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakhstan" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laos" # LB #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Santa Lucia" # LI #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" # LT #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lithuania" # LU #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" # LV #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvia" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Liberia" # MA #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" # MC #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" # MD #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" # CG #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" # SM #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "San Marino" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Kepulauan Marshall" # MK #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" # MO # fuzzy #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makao" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Kepulauan Mariana Utara" # MQ #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" # MT #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Mali" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" # MX #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksiko" # MY #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Caledonia Baru" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Kepulauan Norfolk" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" # NI #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragua" # NL #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Belanda" # NO #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norwegia" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" # NR #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" # NZ #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Selandia Baru" # OM #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" # PA #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" # PE #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinesia Perancis" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nugini" # PH #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipina" # PK #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" # PL #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polandia" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Santa Pierre dan Miquelon" # PN #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" # PR #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestina" # PT #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugis" # PW #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" # PY #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" # QA #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" # RO #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumania" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Rusia" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" # SA #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arab Saudi" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Kepulauan Solomon" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" # SD #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" # SE #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Swedia" # SG #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapura" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Santa Helena" # SI #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" # SJ # fuzzy #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Kepulauan Svalbard dan Jan Mayen" # SK #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakia" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome dan Principe" # SV #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Suriah" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Kepulauan Turks dan Caicos" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chad" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Perancis Selatan" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" # TH #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" # TJ #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tajikistan" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" # TN #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor Leste" # TR #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turki" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad dan Tobago" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" # TW # fuzzy #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" # UA #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Kepulauan Terluar Kecil Amerika Serikat" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Amerika Serikat" # UY #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" # UZ #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Tahta Suci (Negara Kota Vatikan)" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent dan Grenadines" # VE #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Kepulauan Virgin Inggris" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Kepulauan Virgin, A.S." # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Kepulauan Wallis dan Futuna" # WS #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" # YE #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yaman" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" # ZA #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Afrika Selatan" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" # ZW #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Menyediakan" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Prasyarat" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Syarat" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Konflik" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Usang" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Rekomendasi" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Saran" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Meningkatkan" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Suplemen" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Bahasa tidak diketahui: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" # AZ #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhazian" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Bahasa Aceh" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asiatic (Lainnya)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrika" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadia" # AL #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albania" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleut" # LK #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Bahasa Algonquian" # ZA #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altai Selatan" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharic" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Inggris, Kuno (sekitar 450-1100)" # LK #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Bahasa Athabaskan" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arab" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaic" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragon" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armenian" # MR #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucanian" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Buatan (Lainnya)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamese" # AT #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Austria" # AU #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athabaskan" # AU #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australia" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avar" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Myanmar" # AZ #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaijan" # CA #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" # LK #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" # GM #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Bahasa Bali" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basque" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Bassa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltic" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" # BY #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Belarus" # BM #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" # SN #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber (Lainnya)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" # BH #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" # BJ #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (Other)" # BW #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnia" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Breton" # ID #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak" # BG #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugis" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgaria" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmese" # BJ #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" # TD #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "India Amerika Tengah (Lainnya)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalan" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucasian (Lainnya)" # LB #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celtic (Lainnya)" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" # CN #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Chechen" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Cina" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook Jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Church Slavic" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" # LK #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Bahasa Chamic" # CR #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptik" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornish" # CR #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsika" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creoles dan Pidgins, Berbasis Bahasa Inggris (Lainnya)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creoles dan Pidgins, Berbasis Bahasa Perancis (Lainnya)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creoles dan Pidgins, Berbasis Bahasa Portugis (Lainnya)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Crimean Tatar" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creoles dan Pidgins (Lainnya)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kashubian" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitic (Lainnya)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Cekoslowakia" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Denmark" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" # DM #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidian (Lainnya)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Lower Sorbian" # PW #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Belanda, Tengah (sekitar 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Belanda" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Mesir Kuno" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inggris" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Inggris, Pertengahan (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonia" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" # FR #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" # FO #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Kepulauan Faroe" # HT #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" # FJ #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijian" # PH #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipina" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finlandia" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finno-Ugrian (Lainnya)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Prancis" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Prancis, Pertengahan (sekitar 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Prancis, Kuno (842-sekitar 1400)" # FR #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisian" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" # FI #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulian" # GU #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" # GA #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" # LY # fuzzy #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Jerman (Lainnya)" # GE #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Grujia" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Jerman" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Yunani" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertese" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandia" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galisia" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Jerman, Menengah Tinggi (sekitar 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Jerman, Kuno Tinggi (sekitar 750-1050)" # IN #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "India" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gothic" # GA #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Yunani, Kuno (hingga 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Yunani, Modern (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarat" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich’in" # HT #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" # HT #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawai" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Israel" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" # IN #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "India" # HT #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Haiti" # TO #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Tonga" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Serbia" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Hongaria" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandia" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" # LT #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Asosiasi Bahasa Bantu Internasional)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indic (Lainnya)" # ID #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesia" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-Eropa (Lainnya)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" # IN #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iran (Lainnya)" # LK #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Bahasa Iroquoia" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italia" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Bahasa Jawa" # LB #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Jepang" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Yudeo-Persia" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Yudeo-Arab" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" # BH #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" # GM #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" # CA #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kanada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" # MW #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakhstan" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (Lainnya)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanese" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korea" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" # PA #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdish" # KE #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" # LB #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" # UG #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" # GM #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" # LB #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" # LV #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latin" # LV #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvia" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghian" # LU #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgan" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lithuania" # CG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" # LU #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxembourg" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" # SD #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya dan Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Masedonia" # MV # fuzzy #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madura" # MW #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Kepulauan Marshall" # ML #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" # MG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" # MY #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesian (Lainnya)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" # MW #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" # MT #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandia, Pertengahan (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi’kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" # LK #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Ragam Bahasa" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (Lainnya)" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagasy" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltese" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" # KY #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Bahasa Manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" # MD #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavian" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolian" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" # LK #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Multi Bahasa" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Bahasa Munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" # KY #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Bahasa Mayan" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" # MP #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Indian Amerika Utara" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitan" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, Selatan" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, Utara" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Jerman Bawah" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" # NP #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanian (Lainnya)" # NU #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norwegian Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norwegian Bokmal" # TO #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norse, Kuno" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norwegia" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho Utara" # LK #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Bahasa Nubian" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari Klasik" # CL #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (setelah 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetia" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turkish, Ottoman (1500-1928)" # LK #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Bahasa Otomian" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papua (Lainnya)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" # PW #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" # PY #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" # PA #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" # PW #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persia, Kuno (sekitar 600-400 SM.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persia" # PH #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "FIlipina (Lainnya)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Phoenician" # ML #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polandia" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugis" # LK #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Bahasa Prakrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provencal, Kuno (hingga 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" # TJ #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" # JP #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romance (Other)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Raeto-Romance" # RO #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romany" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumania" # RE #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rusia" # CA #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" # WS #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Indian Amerika Selatan (Lainnya)" # LK #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Bahasa Salishan" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritan Aram" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskerta" # WS #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbia" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilian" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroasia" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitic (Lainnya)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandia, Kuno (hingga 900)" # LK #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Bahasa Sign" # SD #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" # WS #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" # LK #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Bahasa Siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetan (Lainnya)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavic (Lainnya)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakia" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenia" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Selatan Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Utara Sami" # LK #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Bahasa Sami (Lainnya)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" # WS #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" # SI #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" # SD #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" # SO #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalia" # TO #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, Selatan" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spanyol" # MR #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinian" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Saharan (Lainnya)" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" # SD #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Bahasa Sunda" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerian" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Swedia" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syriac" # TW # fuzzy #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahiti" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (Lainnya)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" # QA #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" # BE #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" # TJ #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" # TW # fuzzy #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetan" # NE #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Kepulauan Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" # BW #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" # TR #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmenistan" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" # LK #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Bahasa Tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turkish" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaic (Lainnya)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" # TN #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvinian" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritic" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighur" # UA #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukraina" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Tidak dapat ditentukan" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" # UZ #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbekistan" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" # VN # fuzzy #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" # VN # fuzzy #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnam" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" # KY #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Bahasa Wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" # PY #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Welsh" # LK #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Bahasa Sorbian" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" # LK #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Bahasa Yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" # GD #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" # TV #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Tindakan berikut akan dilakukan:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "tidak dikenal" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "tidak didukung" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Level 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Level 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Level 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Kontrak Pelanggan Tambahan Diperlukan" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Dihentikan dan digantikan oleh paket yang berbeda" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "tidak valid" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Tingkat dukungan tidak ditentukan" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Vendor tidak menyediakan dukungan." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Penentuan masalah, yang berarti dukungan teknis yang dirancang untuk " "memberikan informasi kompatibilitas, bantuan instalasi, dukungan penggunaan, " "pemeliharaan berlanjut dan pemecahan masalah dasar. Dukungan Level 1 tidak " "dimaksudkan untuk memperbaiki kesalahan produk cacat." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Isolasi masalah, yang berarti dukungan teknis yang dirancang untuk " "menduplikasi masalah pelanggan, mengisolasi pada area masalah dan memberikan " "solusi untuk masalah tidak diselesaikan dengan Level 1 Support." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Penyelesaian masalah, yang berarti dukungan teknis dirancang untuk " "menyelesaikan masalah yang kompleks dengan cara melibatkan teknik pada " "penyelesaian produk yang cacat sebagaimana telah diidentifikasi oleh Support " "Level 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Kontrak pelanggan tambahan diperlukan untuk mendapatkan dukungan." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Paket ini sudah tidak dilanjutkan dan telah digantikan oleh paket baru " "dengan nama yang berbeda." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Opsi dukungan tidak diketahui. Deskripsi tidak ditemukan" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Manajemen sistem dikunci oleh aplikasi dengan pid %d (%s).\n" "Tutup aplikasi ini sebelum mengulang kembali." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Mode kecocokan '%s' tidak dikenal" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Mode kecocokan '%s' tidak dikenal untuk pola '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Ekspresi reguler '%s' tidak valid: regcomp kembali %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ekspresi reguler '%s' tidak valid" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autentikasi dibutuhkan untuk '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Akan mencoba lagi..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Menyerah setelah %1% mencoba." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Kunjungi Pusat Pelanggan SUSE untuk memeriksa apakah pendaftaran Anda valid " "dan belum kedaluwarsa." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Kunjungi Pusat Pelanggan Novell untuk memeriksa apakah pendaftaran Anda " "valid dan tidak kedaluwarsa." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Buat point lampiran: Tidak dapat menemukan direktori yang dapat ditulis " "untuk membuat point lampiran" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Mohon pasang paket 'lsof' terlebih dahulu." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Tidak dapat membuat metadata direktori singgahan." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Galat saat membaca dari '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Tidak dapat membuat %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Gagal mengambil metadata repositori baru." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "Gagal menyimpan cache repo (tidak dapat memulai repo2solv)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Gagal untuk membuat repo singgahan (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Membangun repositori singgahan '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Tidak dapat membuat singgahan di %s - tidak ada izin untuk menulis." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Gagal menyimpan cache repo %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Jenis repositori yang tidak tertangani" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Menambah repositori '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nama berkas repo tidak valid di '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Tidak dapat membuka berkas '%s' untuk menulis." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Galat tidak diketahui dari '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Tidak dapat membaca direktori repo '%1%': Izin ditolak" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Gagal membaca direktori '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Tidak dapat membaca berkas repo '%1%': Izin ditolak" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Membersihkan metadata" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Membersihkan paket" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Membersihkan dir cache" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Membersihkan direktori: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Membersihkan cache" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Memuat dari cache" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Menghapus reposotori '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Tidak dapat mengetahui di mana repo disimpan." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Tidak dapat menghapus '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Memodifikasi repositori" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Menyegarkan Repositori: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Tidak dapat mengetahui di mana layanan disimpan." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Layanan tidak diketahui '%1%': Menghapus layanan repositori yang tidak " "terpakai '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Alias repositori tidak dapat dimulai dengan titik." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Alias layanan tidak dapat dimulai dengan titik." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Tidak ada intisari untuk berkas %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Intisari %s tidak dikenal untuk berkas %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Verifikasi intisari gagal untuk berkas '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Berkas '%s' tidak ditandatangani, lanjutkan?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Berkas '%s' dari repositori '%s' tidak ditandatangani, lanjutkan?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" "Apakah Anda ingin menolak kunci, percaya untuk sementara, atau selalu " "percaya?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nama kunci: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "Menerima %1% kunci penandatanganan paket baru dari repositori \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Verifikasi tanda tangan gagal untuk berkas '%1%'." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Verifikasi tanda tangan gagal untuk berkas '%1%' dari repositori '%2%'." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Lanjutkan?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Berkas '%s' ditandatangani dengan kunci '%s' yang tidak dikenal. Lanjutkan?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Berkas '%s' dari repositori '%s' ditandatangani dengan kunci '%s' yang tidak " "dikenal. Lanjutkan?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Repositori %1% tidak mendefinisikan 'gpgkey=' URL tambahan." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Mencari kunci gpg ID %1% dalam repositori %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Mencari kunci gpg ID %1% dalam singgahan %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Kebutuhan atribut '%s' hilang." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Satu atau kedua dari '%s' or '%s' atribut dibutuhkan." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Verifikasi tanda tangan gagal" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Paket %s terlihat korup saat transfer berlangsung. Apakah anda henda " "mengulang pemulihan?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Gagal untuk menyediakan paket %s. Apakah anda hendak memulai ulang pemulihan?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "pengecekan applydeltarpm gagal." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm gagal." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Tidak ada izin untuk menulis cache repositori." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Layanan pengaya tidak mendukung perubahan atribut." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Tidak dapat meyediakan berkas '%s' dari repositori '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Tidak ada url pada repositori." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Media yang diharapkan %1%/%2% diidentifikasi oleh berkas '%3%' dengan konten:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Berkas %1%\n" " dari paket\n" " %2%\n" " konflik dengan berkas dari paket\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Berkas %1%\n" " dari paket\n" " %2%\n" " konflik dengan berkas dari pemasangan\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Berkas %1%\n" " dari pemasangan\n" " %2%\n" " konflik dengan berkas dari paket\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Berkas %1%\n" " dari pemasangan\n" " %2%\n" " konflik dengan berkas dari pemasangan\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Berkas %1%\n" " dari paket\n" " %2%\n" " konflik dengan berkas\n" " %3%\n" " dari paket\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Berkas %1%\n" " dari paket\n" " %2%\n" " konflik dengan berkas\n" " %3%\n" " dari pemasangan\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Berkas %1%\n" " dari pemasangan\n" " %2%\n" " konflik dengan berkas\n" " %3%\n" " dari paket\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Berkas %1%\n" " dari pemasangan\n" " %2%\n" " konflik dengan berkas\n" " %3%\n" " dari pemasangan\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Tidak dapat membuat sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "patahkan %s dengan mengabaikan beberapa dependensi" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "umumnya mengabaikan beberapa dependensi" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "%1% yang dipasang bukan milik repositori distupgrade dan harus diganti" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "yang akan dipasang %1% bukan milik repositori distupgrade" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "%1% yang terpasang memiliki arsitektur yang lebih rendah" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "yang akan dipasang %1% memiliki arsitektur yang lebih rendah" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "masalah dengan %1% yang terpasang" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "permintaan konflik" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "beberapa dependensi bermasalah" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "tidak ada yang menyediakan '%1%' yang diminta" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Apakah Anda mengaktifkan semua repositori yang diperlukan?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "paket yang diminta %1% tidak ada" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "permintaan tidak didukung" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' disediakan oleh sistem dan tidak dapat dihapus" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% tidak dapat dipasang" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "tidak ada yang menyediakan '%1%' yang diperlukan oleh %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "tidak ada yang menyediakan '%1%' yang diperlukan untuk dipasang %2%" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "tidak dapat memasang %1% dan %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "konflik %1% yang dipasang dengan '%2%' yang disediakan oleh %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "%1% yang dipasang bertentangan dengan '%2%' yang disediakan oleh yang akan " "dipasang %3%" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "yang akan dipasang %1% konflik dengan '%2%' yang disediakan oleh %3% yang " "terpasang" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "yang akan dipasang %1% konflik dengan '%2%' disediakan oleh yang akan " "dipasang %3%" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "%1% usang yang terpasang '%2%' disediakan oleh %3% yang terpasang" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "%1% usang yang terpasang '%2%' disediakan oleh yang akan dipasang %3%" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "yang akan dipasang %1% usang '%2%' disediakan oleh %3% yang terpasang" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "yang akan dipasang %1% usang '%2%' disediakan oleh yang akan dipasang %3%" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" "konflik %1% yang dipasang dengan '%2%' yang disediakan dengan sendirinya" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "yang akan dipasang %1% konflik dengan '%2%' yang disediakan sendiri" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "%1% yang dipasang membutuhkan '%2%', tetapi persyaratan ini tidak dapat " "disediakan" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "yang akan dipasang %1% membutuhkan '%2%', tetapi persyaratan ini tidak dapat " "disediakan" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "penyedia dihapus: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "penyedia tidak dapat dihapus: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "penyedia tidak dapat dihapus: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% belum sepenuhnya terintegrasi ke dalam %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Biasanya Anda ingin mempertahankan PTF dan memilih untuk tidak memasang " "tambalan pemeliharaan." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Menghapus %1% yang dipasang dalam konteks ini akan menghapus (bukan " "mengganti!) paket PTF yang disertakan juga." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF harus dihapus dengan memanggil '%1%'. Ini akan memutakhirkan paket PTF " "yang disertakan alih-alih menghapusnya." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" "Biasanya Anda ingin mempertahankan PTF atau memilih untuk membatalkan " "tindakan." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "%1% yang dipasang memblokir tindakan yang diinginkan." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" "Biasanya Anda ingin mempertahankan PTF dan memilih untuk membatalkan " "tindakan." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "hapus kunci untuk memungkinkan penghapusan %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "jangan pasang %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "pertahankan %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "hapus kunci untuk memungkinkan pemasangan %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Permintaan ini akan merusak sistem anda!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "abaikan peringatan sistem yang rusak" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "jangan meminta untuk memasang solvable yang menyediakan %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "jangan meminta untuk menghapus semua solvables yang menyediakan %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "jangan memasang versi terbaru %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "pertahankan %1% meskipun arsitekturnya lebih rendah" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "pasang %1% meskipun arsitekturnya lebih rendah" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "biarkan usang %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "pasang %1% dari repositori yang dikecualikan" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "pasang %1% meskipun telah ditarik kembali" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "memungkinkan untuk memasang PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "pasang %1% meskipun masuk daftar hitam" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "turunkan %1% ke %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "perubahan arsitektur dari %1% menjadi %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "pasang %1% (dengan perubahan vendor)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "pasang %1% dari vendor %2%\n" " menggantikan %3% dari vendor %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "penggantian %1% dengan %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "pemasangan ulang %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Menjalankan skrip pasca transaksi" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Menjalankan skrip %1%." #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "%1% keluaran skrip:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Pemasangan dibatalkan sesuai perintah." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " tereksekusi" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " eksekusi gagal" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s sudah dieksekusi sebagai %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " eksekusi dilewati saat membatalkan" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Galat mengirim pesan notifikasi pemutakhiran." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Pesan baru" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Sinyal yang diterima :\"%1% (%2%)\", untuk memastikan konsistensi sistem, " "tidak mungkin membatalkan transaksi rpm yang sedang berjalan." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Mengeksekusi transaksi gagal karena masalah berikut:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM gagal: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Gagal mengimpor kunci publik %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Gagal menghapus kunci publik %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Header paket tidak ditandatangani!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Payload paket tidak ditandatangani!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Mengubah berkas konfigurasi untuk %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm telah disimpan %s sebagai %s, tetapi tidak memungkinkan untuk menentukan " "perbedaannya" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm %s telah disimpan sebagai %s.\n" "Ini adalah perbedaan 25 baris pertama:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "rpm telah disimpan %s sebagai %s, tetapi tidak memungkinkan untuk menentukan " "perbedaannya" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm %s telah dibuat sebagai %s.\n" "Ini adalah perbedaan 25 baris pertama:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Keluaran rpm tambahan" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "membuat cadangan %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Tanda tangan OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tanda tangan tidak dikenal" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Tanda tangan tidak terverifikasi" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Tanda tangan OK, tetapi kunci tidak terpercaya" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Tanda tangan kunci publik tidak tersedia" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Berkas tidak ada atau tanda tangan tidak dapat diperiksa" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Berkas tidak ditandatangani" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "tidak kedaluwarsa" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "kedaluwarsa: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "kedaluwarsa: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(tidak kedaluwarsa)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(KEDALUWARSA)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(Kedaluwarsa dalam waktu 24 jam)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(Kedaluwarsa dalam %d hari)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Mencoba untuk mengimpor kunci %s tidak ada ke keyring %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Gagal mengimpor kunci." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Gagal menghapus kunci." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Berkas tanda tangan %s tidak ditemukan" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tipe ambigu '%s' untuk '%u' byte checksum '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Tidak dapat membuka pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Tidak dapat membuka pipe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "String kueri URL LDAP tidak valid" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Parameter kueri URL LDAP '%s’ tidak valid" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Tidak dapat mengkloning objek Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Referensi objek URL kosong tidak valid" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Tidak dapat mengurai komponen Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Riwayat:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Skema Url tidak diizinkan %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Komponen '%s' tidak valid %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Komponen '%s' tidak sah" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Pemrosesan string kueri tidak didukung untuk URL ini" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Skema url merupakan komponen yang diperlukan" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Skema url '%s' tidak valid" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Skema Url tidak memperbolehkan nama pengguna" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Skema Url tidak memperbolehkan kata sandi" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Skema Url membutuhkan komponen host" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Skema Url tidak memperbolehkan komponen host" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Komponen host '%s' tidak valid" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Skema Url tidak memperbolehkan port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Komponen Port '%s' tidak sah" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Skema url membutuhkan nama path" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Path relatif tidak dibolehkan bila otoritas ada" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "String yang dikodekan berisi byte NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Karakter pemisah susunan pemecah tidak valid" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Karakter pemisah parameter map tidak valid" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Karakter pemisah susunan join tidak valid" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Perintah berhenti dengan status %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Perintah terhenti oleh sinyal %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Perintah berhenti dengan galat yang tidak diketahui." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Argumen spawn yang diberikan tidak valid." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Tidak dapat membuat pipa kontrol." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Tidak dapat chroot untuk '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Tidak dapat membuka ke '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Tidak dapat chdir ke '%s' dalam chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Tidak dapat mengeksekusi '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Tidak dapat melakukan fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Tak bisa eksekusi '%s', chdir gagal (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Tak bisa eksekusi '%s', chroot gagal (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Tak bisa eksekusi '%s', eksekusi gagal (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Tak bisa eksekusi '%s', kesalahan tak terduga." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Gagal untuk mengaitkan %s pada %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Gagal untuk melepas %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nama berkas yang buruk: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Medium tidak dibuka ketika mencoba untuk melakukan tindakan '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Berkas '%s' tidak ditemukan pada medium '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Tidak dapat menulis berkas '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Medium tidak dilampirkan" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Media poin lampiran buruk" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Unduh (curl) inisialisasi gagal untuk '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Pengecualian sistem '%s' pada medium '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Lokasi '%s' pada medium '%s' bukan sebuah berkas." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Lokasi '%s' pada medium '%s' bukan sebuah direktori." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI yang salah bentuk" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nama host kosong pada URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Sistem berkas kosong pada URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Tujuan kosong pada URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Skema URI tidak didukung pada '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operasi tidak didukung oleh medium" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Unduh (curl) galat untuk '%s':\n" "Kode galat: %s\n" "Pesan galat: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Galat terjadi ketika mengatur unduhan (curl) pada opsi untuk '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Sumber media '%s' tidak berisi media yang diinginkan" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Medium '%s' sedang digunakan oleh instance lain" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Tidak dapat mengeluarkan media apapun" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Tidak dapat mengeluarkan media '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Izin untuk mengakses '%s' ditolak." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Batas waktu terlampaui saat mengakses '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Data yang diunduh melebihi ukuran yang diharapkan '%s' dari '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Lokasi '%s' tidak dapat diakses sementara waktu." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " Masalah SSL Sertifikat, pastikan CA cert sudah benar untuk '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Tidak ada sumber daya bebas yang tersedia untuk melampirkan media." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Metode autentikasi HTTP '%s' tidak didukung" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Kesalahan unduhan (curl) untuk '%s':\n" "Kode kesalahan: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Kesalahan unduhan (curl) untuk '%s':\n" "Tidak dapat mengambil respon HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ya" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Tidak" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Catatan:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Peringatan:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Galat:" # ID #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "selesai" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "perhatian" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "galat" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Peringatan: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Mengambil:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "mulai" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "tidak ditemukan" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Tidak ada bantuan yang tersedia untuk permintaan ini." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "tidak ada bantuan yang tersedia untuk opsi ini" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "tampilkan semua opsi" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ya" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "tidak" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Metadata yang valid tidak ditemukan pada URL yang ditentukan" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Menjalankan skrip '%1%' %%posttrans" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Menjalankan skrip %posttrans" #~ msgid "Package is not signed!" #~ msgstr "Paket tidak ditandatangani!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s bukan milik repositori distupgrade" #~ msgid "%s has inferior architecture" #~ msgstr "%s memiliki arsitektur yang lebih rendah" #~ msgid "problem with installed package %s" #~ msgstr "masalah dengan paket %s yang telah terpasang" #~ msgid "nothing provides requested %s" #~ msgstr "tidak ada ketersediaan yang meminta %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Apakah Anda mengaktifkan semua repositori yang diminta?" #~ msgid "package %s does not exist" #~ msgstr "paket %s tidak tersedia" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s disediakan oleh sistem dan tidak dapat dihapus" #~ msgid "%s is not installable" #~ msgstr "%s tidak dapat dipasang" #~ msgid "nothing provides %s needed by %s" #~ msgstr "tidak ada dukungan %s dibutuhkan oleh %s" #~ msgid "cannot install both %s and %s" #~ msgstr "tidak dapat memasang kedua %s dan %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s konflik dengan %s disediakan oleh %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s yang %s disediakan oleh %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "telah dipasang %s usang %s didukung oleh %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "dapat dipecahkan %s konflik dengan %s didukung dengan sendirinya" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s memerlukan %s, tetapi persyaratan ini tidak dapat disediakan" #~ msgid "remove lock to allow removal of %s" #~ msgstr "hapus kunci untuk memungkinkan penghapusan %s" #~ msgid "do not install %s" #~ msgstr "jangan memasang %s" #~ msgid "keep %s" #~ msgstr "simpan %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "hapus kunci untuk memungkinkan pemasangan %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "jangan meminta untuk memasang pemecahan yang didukung %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "jangan meminta untuk menghapus pemecahan yang didukung %s" #~ msgid "do not install most recent version of %s" #~ msgstr "jangan memasang versi terbaru dari %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "jaga %s meskipun arsitektur rendah" #~ msgid "install %s despite the inferior architecture" #~ msgstr "pasang %s meskipun arsitektur rendah" #~ msgid "keep obsolete %s" #~ msgstr "biarkan usang %s" #~ msgid "install %s from excluded repository" #~ msgstr "pasang %s dari repositori pengecualian" #~ msgid "downgrade of %s to %s" #~ msgstr "turunkan dari %s to %s" #~ msgid "architecture change of %s to %s" #~ msgstr "arsitektur berubah dari %s ke %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "pasang %s (dengan perubahan vendor)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "penggantian %s dengan %s" #~ msgid "deinstallation of %s" #~ msgstr "penghapusan dari %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Tidak dapat membuka berkas kunci: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Tindakan ini sudah dijalankan oleh program lain." #~ msgid "Hal Exception" #~ msgstr "Pengecualian Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Maaf, tetapi versi dari libzypp yang digunakan ini dibangun tanpa " #~ "dukungan HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext tidak tersambung" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive tidak dinisialisasi" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume tidak dinisialisasi" #~ msgid "Unable to create dbus connection" #~ msgstr "Tidak dapat membuat koneksi dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Tak dapat membuat konteks libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Tak dapat mengatur koneksi dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Tak dapat menginisialisasi konteks HAL -- hald tidak berjalan?" #~ msgid "Not a CDROM drive" #~ msgstr "Bukan CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Tak bisa menginialisasi atribut mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Tak bisa mengeset atribut rekursif mutex" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Tak bisa menginisialisasi mutex rekursif" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Tidak dapat memperoleh kunci mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Tak bisa membuka kunci mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Gagal mengimpor kunci publik dari berkas %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Gagal menghapus kunci publik %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Tidak dapat menemukan perangkat loop tersedia untuk mengaitkan file image " #~ "dari '%s'" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "Italia" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Italia" #, fuzzy #~ msgid "install %s" #~ msgstr "Italia" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "Italia" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Tidak dapat membuka %s: %m" #, fuzzy #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "Parsing Parameter Path tidak didukung untuk url ini" #, fuzzy #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "Parsing parameter path tidak didukung untuk url ini" #, fuzzy #~ msgid "Establishing %s" #~ msgstr "Italia" #, fuzzy #~ msgid "Installing %s" #~ msgstr "Italia" #, fuzzy #~ msgid "Unable to parse Url authority" #~ msgstr "Tidak dapat memparse komponen otoritas url" #, fuzzy #~ msgid "Unable to restore all sources." #~ msgstr "Tidak dapat memparse komponen url utama" #, fuzzy #~ msgid "Downloading %s" #~ msgstr "Kesalahan memuatkan %1" libzypp-17.36.5/po/it.po000066400000000000000000003707471476576476200150320ustar00rootroot00000000000000# translation of zypp.po to italiano # Italian 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. # # Franca Delcarlo , 1999, 2000, 2001. # Karl Eichwalder , 2000. # Bevacqua Giuseppe , 2008. # Andrea Florio , 2008. # Andrea Florio , 2008, 2009. # Andrea Turrini , 2013, 2014, 2015. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-09-05 15:47+0000\n" "Last-Translator: Paolo Za \n" "Language-Team: Italian \n" "Language: it\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: Weblate 5.7.1\n" "X-Poedit-Bookmarks: 370,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Paese sconosciuto: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Nessun codice" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Emirati Arabi Uniti" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua e Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antille olandesi" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antartide" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa americane" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Isole Aland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaijan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia-Erzegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgio" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasile" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Isola Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Bielorussia" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Isole Cocos (Keeling)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Repubblica Centrafricana" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Svizzera" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Costa d'Avorio" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Isole Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Cile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Cina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Capo Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Isola Christmas" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cipro" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Repubblica Ceca" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Germania" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Gibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danimarca" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Repubblica dominicana" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algeria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egitto" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sahara occidentale" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spagna" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlandia" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Isole Falkland (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Stati federati di Micronesia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Isole Faroe" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francia" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Francia metropolitana" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Regno Unito" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guiana francese" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibilterra" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenlandia" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadalupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinea equatoriale" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grecia" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia meridionale e Isole Sandwich meridionali" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Isola Heard e isole McDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croazia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungheria" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanda" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israele" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isola di Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Territorio dell'Oceano indiano britannico" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraq" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islanda" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Giamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Giordania" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Giappone" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirghizistan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambogia" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comore" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts e Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Corea del Nord" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Corea del Sud" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Isole Cayman" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakistan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Repubblica democratica popolare del Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libano" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituania" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Lussemburgo" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Lettonia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marocco" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavia" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Isole Marshall" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Birmania" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Isole Marianne settentrionali" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinica" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldive" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Messico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malesia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambico" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nuova Caledonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Isola di Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Paesi Bassi" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norvegia" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nuova Zelanda" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Perù" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinesia francese" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nuova Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filippine" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polonia" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre e Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Portorico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Territorio palestinese" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portogallo" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Federazione russa" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arabia Saudita" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Isole Solomon" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Svezia" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sant'Elena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovacchia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé e Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Siria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Isole Turks e Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Territori francesi meridionali" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailandia" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tagikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor est" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turchia" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad e Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ucraina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Isole minori esterne degli Stati Uniti" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Stati Uniti" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Santa Sede (Città del Vaticano)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent e Grenadine" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Isole Vergini britanniche" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Isole Vergini, Stati Uniti" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Sud Africa" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Fornisce" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Prerequisiti" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Richiede" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "In conflitto con" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Obsoleti" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Raccomanda" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Suggerisce" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Migliora" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Integra" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Lingua sconosciuta: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhazo" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinese" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asiatico (altre)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Accadico" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanese" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Lingue algonchine" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altai meridionale" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amarico" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Inglese, antico (450-1100 circa)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Lingue Apache" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabo" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaico" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonese" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armeno" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucano" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Lingue artificiali (altre)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Aruaco" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamese" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturiano" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Lingue Athabaska" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Lingue australiane" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarico" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestano" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaigiano" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Lingue Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinese" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basco" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltico (altre)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorusso" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berbero (altre)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (altre)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosniaco" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretone" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginese" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgaro" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmese" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Indiano dell'America centrale (altre)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Caribico" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalano" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucasico (altre)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celtico (altre)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Ceceno" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Cinese" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Linguaggio Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Slavo ecclesiastico" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Lingue Chamic" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Copto" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornico" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corso" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creole e pidgin, basate sull'inglese (altro)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creole e pidgin, basate sul francese (altro)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creole e pidgin, basate sul portoghese (altro)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tataro della Crimea" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creole e pidgin (altre)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Casciubo" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cuscitico (altre)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Ceco" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danese" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slavo (Athabaska)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidiche (Altre)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Sorabo inferiore" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Olandese, medio (1050-1350 circa)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Olandese" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egiziano (antico)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Akajo" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamitico" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inglese" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Inglese, medio (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estone" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faroese" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Figiano" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filippino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finlandese" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Ugrofinnico (altre)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francese" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francese, medio (1400-1600 circa)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francese, antico (842-1400 circa)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisone" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fula" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulano" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Lingue germaniche (altre)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgiano" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Tedesco" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Ge'ez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertese" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelico" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandese" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galiziano" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Tedesco, medio-alto (1050-1500 circa)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Tedesco, antico alto (750-1050 circa)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotico" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Greco antico (fino al 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Greco moderno (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitiano" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiano" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Ebraico" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Ittita" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Sorabo superiore" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ungherese" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandese" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Associazione internazionale lingue ausiliarie)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indico (altre)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesiano" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Lingue indo-europee (altre)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraniano (altre)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Lingue irochesi" # TLABEL modules/inst_target_part.ycp:680 #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiano" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Giavanese" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Giapponese" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Giudeo-persiano" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Giudeo-arabico" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazako" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Cabardo" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (altre)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanese" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiso" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreano" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraeano" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachai-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Curdo" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latino" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Lettone" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezgiano" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburghese" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituano" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Lussemburghese" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya e Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedone" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurese" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallese" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesiano (altre)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandese, medio (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Lingue varie" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (altre)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgascio" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltese" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manciù" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Lingue Manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavo" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolo" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Lingue multiple" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Lingue munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Lingue maya" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Lingua Erza" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Indiano del Nord America" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napoletano" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, meridionale" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, settentrionale" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Tedesco, basso" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalese" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofaniano (altre)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueano" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norvegese Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norvegese Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norse, antico" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norvegese" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho, settentrionale" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Lingue nubiane" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari classico" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitano (dopo il 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osseto" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turco, ottomano (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Lingue otomiane" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuano (altre)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauano" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persiano, antico (600-400 a.C. circa)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persiano" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filippino (altre)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenicio" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polacco" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeiano" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portoghese" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Lingue Pracrito" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provenzale, antico (fino al 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pashtu" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongano" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romancio (altre)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Retoromanzo" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romeno" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romeno" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russo" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Indiano dell'America meridionale (altre)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Lingue Salish" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Aramaico samaritano" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanscrito" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbo" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliano" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scozzese" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croato" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Lingue semitiche (altre)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandese, antico (fino al 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Linguaggi dei segni" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singalese" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Lingue Siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetano (altre)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavo (altre)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovacco" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Sloveno" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sami meridionale" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Sami settentrionale" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Lingue Sami (altre)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Sami di Lule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Sami di Inari" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoano" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Sami skolt" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalo" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, meridionale" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spagnolo" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardo" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Sahariano (altre)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swazi" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanese" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumero" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Svedese" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siriaco" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitiano" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (altre)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tataro" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tagico" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetano" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrino" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Isole Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmeno" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Lingue Tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turco" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaico (altre)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvano" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurto" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritico" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uiguro" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ucraino" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Indeterminato" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbeko" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamita" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votico" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Lingue Wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Gallese" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Lingue sorabe" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Vallone" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Calmucco" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Lingue Yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Chuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Verranno eseguite le azioni indicate:" # TLABEL modules/inst_user.ycp:71 #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "sconosciuto" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "non supportato" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Livello 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Livello 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Livello 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Contratto clienti aggiuntivo necessario" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Non più supportato e sostituito da un pacchetto diverso" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "non valido" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Il livello di supporto non è specificato" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Il fornitore non fornisce supporto." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Identificazione del problema, ovvero supporto tecnico indirizzato a fornire " "informazioni sulla compatibilità, assistenza per l'installazione, supporto " "per l'utilizzo, manutenzione ordinaria e risoluzione dei problemi di base. " "L'obiettivo del supporto di Livello 1 non è correggere errori e difetti del " "prodotto." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Isolamento del problema, ovvero supporto tecnico indirizzato a riprodurre i " "problemi del cliente, isolare l'area del problema e fornire una soluzione ai " "problemi non risolti dal Supporto di Livello 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Risoluzione del problema, ovvero supporto tecnico indirizzato a risolvere " "problemi complessi attraverso la programmazione nella correzione dei difetti " "di prodotto che sono stati identificati dal Supporto di Livello 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "È necessario un contratto cliente aggiuntivo per ottenere supporto." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Il pacchetto non è più supportato ed è stato sostituito da un nuovo " "pacchetto con un nome diverso." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Opzione di supporto sconosciuta. Descrizione non disponibile" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "La gestione di sistemi è bloccata dall'applicazione con pid %d (%s).\n" "Chiudere l'applicazione prima di riprovare." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Modalità di corrispondenza '%s' sconosciuta" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Modalità di corrispondenza '%s' sconosciuta per il modello '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Espressione regolare '%s' non valida: regcomp ha restituito %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Espressione regolare '%s' non valida" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "È richiesta l'autenticazione per '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Verrà eseguito un nuovo tentativo..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "L'operazione verrà annullata dopo %1% tentativi." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visitare SUSE Customer Center per verificare se la registrazione è valida e " "che non sia scaduta." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visitare Novell Customer Center per verificare che la registrazione sia " "valida e che non sia scaduta." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Creazione del punto di collegamento: impossibile trovare una directory " "scrivibile per creare un punto di collegamento" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Installare prima il pacchetto 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Impossibile creare la directory della cache dei metadati." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Errore durante il tentativo di lettura da '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Impossibile creare %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "Impossibile creare la cache del repo (impossibile avviare repo2solv)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Impossibile creare la cache del repo (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Costruzione della cache del repository '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Impossibile creare la cache in %s - permessi di scrittura mancanti." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Impossibile creare la cache del repo %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Tipo di repository non gestito" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Aggiunta del repository '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nome file del repository non valido a '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Impossibile aprire il file '%s' in scrittura." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Errore sconosciuto durante la lettura da '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Impossibile leggere la directory '%1%' del repository: permesso negato" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Impossibile leggere la directory '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Impossibile leggere il file '%1%' del repository: permesso negato" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Pulizia dei metadati" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Pulizia dei pacchetti" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Pulizia della cartella: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Pulizia della cache" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Caricamento dalla cache" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Rimozione del repository '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Impossibile trovare ubicazione di memorizzazione del repository." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Impossibile eliminare '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Modifica del repository" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Aggiornamento del repository: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Impossibile trovare ubicazione di memorizzazione del servizio." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Servizio '%1%' sconosciuto: rimozione del repository dei servizi orfani '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "L'alias di un repository non può iniziare con un punto." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "L'alias di un servizio non può iniziare con un punto." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Nessun sommario per il file %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Sommario %s sconosciuto per il file %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Verifica del sommario non riuscita per il file '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Il file '%s' non è firmato. Continuare?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Il file '%s' dal repository '%s' non è firmato. Continuare?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" "Rifiutare la chiave, considerarla temporaneamente attendibile o considerarla " "sempre attendibile?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nome della chiave: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "Ricevuta %1% nuova chiave di firma del pacchetto dal repository \"%2%\":" msgstr[1] "" "Ricevute %1% nuove chiavi di firma del pacchetto dal repository \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Verifica della firma non riuscita per il file '%1%'." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Verifica della firma non riuscita per il file '%1%' dal repository '%2%'." # internal key used: Ok # internal key used: Ok #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Continuare?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Il file '%s' è firmato con una chiave sconosciuta '%s'. Continuare?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Il file '%s' dal repository '%s' è firmato con una chiave sconosciuta '%s'. " "Continuare?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Il repository %1% non definisce URL aggiuntivi 'gpgkey='." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Ricerca dell'ID %1% della chiave GPG nel repository %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Ricerca dell'ID %1% della chiave GPG nella cache %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "L'attributo richiesto '%s' è mancante." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Uno o entrambi gli attributi '%s' o '%s' sono richiesti." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Verifica della firma non riuscita" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Possibile danneggiamento del pacchetto %s durante il trasferimento. " "Ritentare il recupero?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Impossibile fornire il pacchetto %s. Ritentare il recupero?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Verifica di applydeltarpm non riuscita." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm non riuscito." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Il plug-in del servizio non supporta la modifica di un attributo." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Impossibile fornire il file '%s' dal repository '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Nessun URL nel repository." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Supporto previsto %1%/%2% identificato dal file '%3%' con contenuto:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Il file %1%\n" " del pacchetto\n" " %2%\n" " è in conflitto con il file del pacchetto\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Il file %1%\n" " del pacchetto\n" " %2%\n" " è in conflitto con il file dell'installazione di\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Il file %1%\n" " dell'installazione di\n" " %2%\n" " è in conflitto con il file del pacchetto\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Il file %1%\n" " dell'installazione di\n" " %2%\n" " è in conflitto con il file dell'installazione di\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Il file %1%\n" " del pacchetto\n" " %2%\n" " è in conflitto con il file\n" " %3%\n" " del pacchetto\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Il file %1%\n" " del pacchetto\n" " %2%\n" " è in conflitto con il file\n" " %3%\n" " dell'installazione di\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Il file %1%\n" " dell'installazione di\n" " %2%\n" " è in conflitto con il file\n" " %3%\n" " del pacchetto\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Il file %1%\n" " dell'installazione di\n" " %2%\n" " è in conflitto con il file\n" " %3%\n" " dell'installazione di\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Impossibile creare sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "installa comunque %s ignorando alcune delle sue dipendenze" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "generalmente ignora alcune dipendenze" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "%1% installato non appartiene a un repository di aggiornamento della " "distribuzione e deve essere sostituito" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" "%1% da installare non appartiene a un repository di aggiornamento della " "distribuzione" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "%1% installato presenta un'architettura inferiore" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "%1% da installare presenta un'architettura inferiore" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problema con %1% installato" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "richieste in conflitto" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "alcuni problemi di dipendenze" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "nessun elemento fornisce '%1%' obbligatorio" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Sono stati abilitati tutti i repository richiesti?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "il pacchetto richiesto %1% non esiste" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "richiesta non supportata" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' viene fornito dal sistema e non può essere cancellato" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% non è installabile" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "nessun elemento fornisce '%1%' obbligatorio per %2% installato" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "nessun elemento fornisce '%1%' obbligatorio per %2% da installare" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "impossibile installare %1% e %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "%1% installato è in conflitto con '%2%' fornito da %3% installato" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "%1% installato è in conflitto con '%2%' fornito da %3% da installare" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "%1% da installare è in conflitto con '%2%' fornito da %3% installato" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "%1% da installare è in conflitto con '%2%' fornito da %3% da installare" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "%1% installato rende obsoleto '%2%' fornito da %3% installato" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "%1% installato rende obsoleto '%2%' fornito da %3% da installare" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "%1% da installare rende obsoleto '%2%' fornito da %3% installato" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "%1% da installare rende obsoleto '%2%' fornito da %3% da installare" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "%1% installato è in conflitto con '%2%' fornito da se stesso" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "%1% da installare è in conflitto con '%2%' fornito da se stesso" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "%1% installato richiede '%2%', ma non è possibile fornire questo requisito" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "%1% da installare richiede '%2%', ma non è possibile fornire questo requisito" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "provider cancellati: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "impossibile installare i provider: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "provider non installabili: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% non è ancora completamente integrato in %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "In genere, è consigliabile mantenere il PTF e scegliere di non installare le " "patch di manutenzione." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "In questo contesto, la rimozione della %1% installata rimuoverà (non " "sostituirà) anche i pacchetti PTF inclusi." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "Rimuovere la PTF richiamando '%1%'. In tal modo i pacchetti PTF inclusi " "verranno aggiornati anziché rimossi." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" "Di norma si suppone di voler mantenere la PTF o scegliere di annullare " "l'azione." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "%1% installato blocca l'azione desiderata." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" "In genere, è consigliabile mantenere il PTF e scegliere di annullare " "l'azione." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "rimuovi il blocco per consentire la rimozione di %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "non installare %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "mantieni %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "rimuovi il blocco per consentire l'installazione di %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Questa richiesta potrebbe danneggiare il sistema!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignora avviso di sistema malfunzionante" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "non chiedere di installare un risolubile che fornisce %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "non chiedere di eliminare tutti i risolubili che forniscono %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "non installare la versione più recente di %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "mantieni %1% nonostante l'architettura inferiore" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "installa %1% nonostante l'architettura inferiore" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "mantieni %1% obsoleto" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "installa %1% dal repository escluso" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "installare %1% anche se è stato ritirato" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "consentire installazione di PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "Installare %1% anche se è nella black list" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "downgrade di %1% a %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "modifica di architettura di %1% in %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "installa %1% (con cambio di fornitore)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "installa %1% dal fornitore %2%\n" " sostituzione di %3% del fornitore %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "sostituzione di %1% con %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "disinstallazione di %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Esecuzione script postransazionali in corso" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Esecuzione di %1% script in coro" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Output script %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "L'installazione è stata interrotta come indicato." # TLABEL modules/inst_config_x11.ycp:578 #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " eseguito" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " esecuzione non riuscita" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s già eseguito come %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " esecuzione saltata durante l'annullamento" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Errore nell'invio della notifica del messaggio di aggiornamento." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nuovo messaggio di aggiornamento" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Segnale ricevuto :\"%1% (%2%)\". Per garantire la coerenza del sistema, non " "è possibile annullare una transazione rpm in esecuzione." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" "L'esecuzione della transazione non è riuscita a causa dei seguenti problemi:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM non riuscito: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Errore importazione della chiave pubblica %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Errore rimozione della chiave pubblica %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "L'intestazione del pacchetto non è firmata!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Il contenuto del pacchetto non è firmato!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "File di configurazione modificati per %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm ha salvato %s come %s, tuttavia non è stato possibile determinare la " "differenza" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ha salvato %s come %s.\n" "Di seguito sono riportate le prime 25 righe di differenza:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "rpm ha creato %s come %s, tuttavia non è stato possibile determinare la " "differenza" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm ha creato %s come %s.\n" "Di seguito sono riportate le prime 25 righe di differenza:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Output aggiuntivo di rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "creata copia di backup di %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "La firma è corretta" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tipo di firma sconosciuto" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "La firma non è verificabile" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "La firma è corretta, ma non è attendibile" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "La chiave pubblica delle firme non è disponibile" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Il file non esiste o la firma non può essere verificata" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "File non firmato" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "non scade" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "scaduta: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "scade: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(non scade)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(SCADUTO)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(scade entro 24 ore)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(scade entro %d giorno)" msgstr[1] "(scade entro %d giorni)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Tentativo di importare la chiave inesistente %s nel portachiavi %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Impossibile importare la chiave." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Impossibile eliminare la chiave." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "La firma del file %s non è stata trovata" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tipo '%s' incerto per %u byte del codice di controllo '%s'" # TLABEL modules/sound/sound.ycp:620 #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Impossibile aprire pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Impossibile aprire pipe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Stringa di interrogazione URL LDAP non valida" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Parametro di interrogazione URL LDAP '%s' non valido" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Impossibile clonare l'oggetto url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Riferimento a oggetto url vuoto non valido" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Impossibile analizzare i componenti dell'url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Cronologia:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Lo schema url non consente un %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "%s componente '%s' non valido" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Componente %s non valido" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Analisi della stringa di interrogazione non supportata per questo URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Lo schema url è un componente obbligatorio" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Schema url '%s' non valido" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Lo schema url non consente un nome utente" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Lo schema url non consente una password" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Lo schema url richiede un componente host" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Lo schema url non consente un componente host" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Componente host '%s' non valido" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Lo schema url non consente una porta" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Componente porta '%s' non valido" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Lo schema url richiede un nome di percorso" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Percorso relativo non consentito se l'autorità esiste" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "La stringa codificata contiene un byte NULL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" "Carattere di separazione di divisione della matrice di parametri non valido" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Carattere di separazione di divisione mappa di parametri non valido" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Carattere di separazione unione della matrice di parametri non valido" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Il comando è terminato con stato %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Il comando è stato terminato dal segnale %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Il comando è terminato con un errore sconosciuto." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Argomenti di distribuzione non validi forniti." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Impossibile creare la pipe di controllo." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Impossibile eseguire il comando chroot in '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Impossibile eseguire chdir verso '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Impossibile eseguire chdir verso '%s' dentro la chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Impossibile eseguire '%s' (%s)." # TLABEL modules/installation.ycp:287 #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Impossibile eseguire il comando fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Impossibile eseguire '%s', chdir non riuscito (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Impossibile eseguire '%s', chroot non riuscito (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Impossibile eseguire '%s'; esecuzione non riuscita (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Impossibile eseguire '%s', errore inaspettato." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Impossibile montare %s su %s." #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Impossibile smontare %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nome file errato: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Supporto non aperto durante il tentativo di esecuzione di '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "File '%s' non trovato sul supporto '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Impossibile scrivere il file '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Supporto non collegato" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Punto di collegamento supporto errato" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Inizializzazione download (curl) non riuscita per '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Eccezione di sistema '%s' sul supporto '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Il percorso '%s' sul supporto '%s' non è un file." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Il percorso '%s' sul supporto '%s' non è una directory." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Formato URI errato" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nome host vuoto nell'URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "File system vuoto nell'URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destinazione vuota nell'URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Schema URI non supportato in '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operazione non supportata dal supporto" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Errore di download (curl) per '%s':\n" "Codice di errore: %s\n" "Messaggio di errore: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Errore durante l'impostazione delle opzioni di download (curl) per '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "L'origine del supporto '%s' non contiene il supporto desiderato" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Supporto '%s' già utilizzato da un'altra istanza" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Impossibile espellere supporti" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Impossibile espellere il supporto '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Autorizzazione per accedere a '%s' rifiutata." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Timeout superato durante l'accesso a '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "I dati scaricati eccedono la dimensione attesa '%s' di '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "L'ubicazione '%s' è temporaneamente inaccessibile." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Problemi con il certificato SSL, verificare che il certificato CA sia " "valido per '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Nessuna risorsa gratuita disponibile da collegare al supporto." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Metodo di autenticazione HTTP '%s' non supportato" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Errore di download (curl) per '%s':\n" "Codice di errore %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Errore di download (curl) per '%s':\n" "Impossibile recuperare la risposta HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Sì" #: zypp-tui/Table.cc:32 msgid "No" msgstr "No" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Nota:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Avvertenza:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Errore:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "fine" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "attenzione" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "errore" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Avvertenza: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Recupero di:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "avvio" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "non trovato" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Nessun aiuto disponibile per questa richiesta." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "nessun aiuto disponibile per questa opzione" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "mostra tutte le opzioni" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "sì" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "no" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Non sono stati trovati metadati validi all'URL specificato" #~ msgstr[1] "Non sono stati trovati metadati validi agli URL specificati" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Esecuzione dello script %%posttrans '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Esecuzione degli script %posttrans" #~ msgid "Package is not signed!" #~ msgstr "Il pacchetto non è firmato!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "" #~ "%s non appartiene a un repository di aggiornamento della distribuzione" #~ msgid "%s has inferior architecture" #~ msgstr "%s presenta un'architettura inferiore" #~ msgid "problem with installed package %s" #~ msgstr "problema con il pacchetto installato %s" #~ msgid "nothing provides requested %s" #~ msgstr "nessun elemento fornisce %s obbligatorio" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Sono stati abilitati tutti i repository richiesti?" #~ msgid "package %s does not exist" #~ msgstr "il pacchetto %s non esiste" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s è fornito dal sistema e non può essere cancellato" # TLABEL modules/inst_target_part.ycp:680 #~ msgid "%s is not installable" #~ msgstr "impossibile installare %s" #~ msgid "nothing provides %s needed by %s" #~ msgstr "nessun elemento fornisce %s obbligatorio per %s" # TLABEL modules/inst_target_part.ycp:680 #~ msgid "cannot install both %s and %s" #~ msgstr "impossibile installare sia %s, sia %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s in conflitto con %s fornito da %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s rende obsoleto %s fornito da %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "l'installazione di %s rende obsoleto %s fornito da %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "il risolubile %s è in conflitto con %s fornito da se stesso" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s richiede %s, ma non è possibile fornire questa richiesta" #~ msgid "remove lock to allow removal of %s" #~ msgstr "rimuovi il blocco per consentire la rimozione di %s" # TLABEL modules/inst_target_part.ycp:680 #~ msgid "do not install %s" #~ msgstr "non installare %s" #~ msgid "keep %s" #~ msgstr "mantieni %s" # TLABEL modules/inst_target_part.ycp:680 #~ msgid "remove lock to allow installation of %s" #~ msgstr "rimuovi il blocco per consentire l'installazione di %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "non chiedere di installare un risolvibile che fornisce %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "non chiedere di eliminare tutti i risolvibili che forniscono %s" #~ msgid "do not install most recent version of %s" #~ msgstr "non installare la versione più recente di %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "mantieni %s nonostante l'architettura inferiore" #~ msgid "install %s despite the inferior architecture" #~ msgstr "installa %s nonostante l'architettura inferiore" #~ msgid "keep obsolete %s" #~ msgstr "mantieni %s obsoleto" #~ msgid "install %s from excluded repository" #~ msgstr "installa %s da repository escluso" #~ msgid "downgrade of %s to %s" #~ msgstr "downgrade di %s a %s" #~ msgid "architecture change of %s to %s" #~ msgstr "modifica dell'architettura di %s in %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "installa %s (con cambio di fornitore)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "sostituzione di %s con %s" #~ msgid "deinstallation of %s" #~ msgstr "disinstallazione di %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Impossibile aprire file bloccato: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Questa azione è stata già eseguita da un altro programma." #~ msgid "Hal Exception" #~ msgstr "Eccezione Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "La versione di libzypp è stata creata senza il supporto per HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext non connesso" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive non inizializzato" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume non inizializzato" #~ msgid "Unable to create dbus connection" #~ msgstr "Impossibile creare la connessione dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: impossibile creare il contesto libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "libhal_set_dbus_connection: impossibile impostare la connessione dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Impossibile inizializzare il contesto HAL - hald non in esecuzione?" #~ msgid "Not a CDROM drive" #~ msgstr "Non è un'unità CD ROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Impossibile inizializzare gli attributi mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Impossibile impostare l'attributo mutex ricorsivo" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Impossibile inizializzare mutex ricorsivo" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Impossibile acquisire il blocco mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Impossibile rilasciare il blocco mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Errore importazione della chiave pubblica dal file %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Errore rimozione della chiave pubblica %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Impossibile trovare un dispositivo di loop disponibile per montare il " #~ "file immagine da '%s'" # TLABEL modules/inst_target_part.ycp:680 #~ msgid "do not keep %s installed" #~ msgstr "non tenere installato %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Impossibile creare la chiave pubblica %s dal portachiavi %s per il file %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Inizializzazione dello scaricamento (metalink curl) per '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Errore di scaricamento (metalink curl) per '%s':\n" #~ "Codice di errore: %s\n" #~ "Messaggio di errore: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Scaricamento interrotto al %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Scaricamento interrotto dall'utente" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Si è verificato un errore durante l'impostazione delle opzioni di " #~ "scaricamento (metalink curl) per '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Scaricamento di %s da %s fallito" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia e Montenegro" #~ msgid "Timeout exceeded when access '%s'." #~ msgstr "Timeout superato mentre si accedeva a '%s'." libzypp-17.36.5/po/ja.po000066400000000000000000004142631476576476200150000ustar00rootroot00000000000000# translation of zypp.po to Japanese # Japanese message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # # Mike Fabian , 2000, 2001. # Yasuhiko Kamata , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2025-03-01 04:56+0000\n" "Last-Translator: Yasuhiko Kamata \n" "Language-Team: Japanese \n" "Language: ja\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: Weblate 5.10.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "不明な国: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "コードなし" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "アンドラ" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "アラブ首長国連邦" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "アフガニスタン" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "アンティグアおよびバーブーダ" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "アングイラ" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "アルバニア" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "アルメニア" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "オランダ領アンティル" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "アンゴラ" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "南極大陸" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "アルゼンチン" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "アメリカ領サモア" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "オーストリア" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "オーストラリア" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "アルーバ" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "オーランド諸島" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "アゼルバイジャン" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "ボスニア-ヘルツェゴヴィナ" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "バルバドス" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "バングラデシュ" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "ベルギー" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "ブルキナファソ" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "ブルガリア" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "バーレーン" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "ブルンディ" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "ベニン" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "バーミューダ" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "ブルネイダルサラーム国" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "ボリビア" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "ブラジル" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "バハマ" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "ブータン" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "ブーヴェ島" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "ボツワナ" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "ベラルーシ" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "ベリーズ" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "カナダ" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "ココス(キーリング)諸島" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "コンゴ" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "中央アフリカ共和国" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "スイス" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "コートディヴォワール" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "クック諸島" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "チリ" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "カメルーン" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "中国" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "コロンビア" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "コスタリカ" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "キューバ" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "カボベルデ" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "クリスマス島" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "キプロス" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "チェコ共和国" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "ドイツ" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "ジブティ" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "デンマーク" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "ドミニカ" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "ドミニカ共和国" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "アルジェリア" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "エクアドル" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "エストニア" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "エジプト" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "西サハラ" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "エリトリア" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "スペイン" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "エチオピア" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "フィンランド" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "フィジー" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "フォークランド諸島(マルビナス)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "ミクロネシア連邦" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "フェロー諸島" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "フランス" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "フランス本国" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "ガボン" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "英国" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "グレナダ" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "ジョージア" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "フランス領ギアナ" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "ガーンジー島" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "ガーナ" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "ジブラルタル" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "グリーンランド" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "ガンビア" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "ギニア" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "グアドループ" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "赤道ギニア" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "ギリシア" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "サウスジョージアおよびサウスサンドイッチ諸島" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "グアテマラ" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "グアム" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "ギニア-ビサウ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "ギニア" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "香港" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "ハード島およびマクドナルド諸島" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "ホンデュラス" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "クロアティア" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "ハイティ" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "ハンガリー" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "インドネシア" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "アイルランド" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "イスラエル" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "マン島" #: zypp/CountryCode.cc:261 msgid "India" msgstr "インド" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "英領インド洋植民地" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "イラク" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "イラン" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "アイスランド" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "イタリア" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "ジャージー" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "ジャマイカ" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "ヨルダン" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "日本" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "ケニア" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "キルギスタン" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "カンボジア" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "キリバス" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "コモロ" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "セントキッツネヴィス" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "北朝鮮" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "韓国" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "クウェート" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "ケイマン諸島" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "カザフスタン" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "ラオス人民民主共和国" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "レバノン" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "セントルシア" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "リヒテンシュタイン" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "スリランカ" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "リベリア" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "レソト" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "リトアニア" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "ルクセンブルク" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "ラトビア" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "リビア" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "モロッコ" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "モナコ" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "モルドバ" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "モンテネグロ" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "サンマルタン" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "マダガスカル" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "マーシャル諸島" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "マケドニア" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "マリ" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "ミャンマー" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "モンゴル" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "マカオ" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "北マリアナ諸島" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "マルティニク" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "モーリタニア" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "モントセラト" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "マルタ" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "モーリシャス" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "モルディブ" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "マラウイ" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "メキシコ" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "マレーシア" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "モザンビーク" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "ナミビア" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "ニューカレドニア" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "ニジェール" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "ノーフォーク島" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "ナイジェリア" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "ニカラグア" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "オランダ" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "ノルウェー" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "ネパール" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "ナウル語" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "ニウエ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "ニュージーランド" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "オマーン" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "パナマ" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "ペルー" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "フランス領ポリネシア" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "パプアニューギニア" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "フィリピン" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "パキスタン" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "ポーランド" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "サンピエールエミクロン" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "ピトケルン" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "プエルトリコ" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "パレスチナ地域" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "ポルトガル" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "パラウ" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "パラグアイ" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "カタール" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "レユニオン" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "ルーマニア" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "セルビア" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "ロシア連邦" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "ルワンダ" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "サウディアラビア" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "ソロモン諸島" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "セーシェル" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "スーダン" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "スウェーデン" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "シンガポール" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "セントヘレナ" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "スロベニア" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "スヴァールバルおよびヤンマイエン" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "スロバキア" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "シエラレオーネ" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "サンマリノ" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "セネガル" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "ソマリア" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "スリナム" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "サントーメ-プリンシペ" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "エルサルバドル" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "シリア" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "スイス" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "タークスアンドケーコス諸島" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "チャド" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "フランス南方領" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "トーゴ" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "タイ" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "タジキスタン" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "トケラウ語" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "トルクメニスタン" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "チュニジア" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "トンガ" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "東ティモール" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "トルコ" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "トリニダードトバゴ" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "ツバル" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "台湾" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "タンザニア" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "ウクライナ" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "ウガンダ" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "合衆国小離島" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "アメリカ合衆国" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "ウルグアイ" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "ウズベキスタン" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "教皇庁(ヴァティカン市国)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "セントヴィンセント-グレナディン" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "ベネズエラ" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "英領ヴァージン諸島" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "米国領ヴァージン諸島" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "ベトナム" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "ヴァヌアトゥ" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "ワリーエフトゥーナ" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "サモア" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "イエメン" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "マヨット" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "南アフリカ" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "ザンビア" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "ジンバブエ" #: zypp/Dep.cc:96 msgid "Provides" msgstr "提供" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "前提条件" #: zypp/Dep.cc:98 msgid "Requires" msgstr "必要" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "競合" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "廃止" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "推奨" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "提案" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "拡張" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "補足" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "不明な言語: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "アファル語" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "アブハーズ語" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "アチェー語" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "アチョリ語" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "アダングメ語" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "アディゲ語" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "アフリカ-アジア語(その他)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "アフリヒリ語" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "アフリカーンス語" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "アイヌ語" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "アカン語" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "アッカド語" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "アルバニア語" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "アレウト語" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "アルゴンギン語" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "南アルタイ語" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "アムハラ語" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "古英語(ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "アパッチ語" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "アラビア語" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "アラム語" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "アラゴン語" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "アルメニア語" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "アラウカン語" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "アラパホー語" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "人工語(その他)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "アラワック語" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "アッサム語" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "アストゥリア語" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "アサパスカン語" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "オーストラリア語" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "アヴァール語" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "アヴェスター語" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "アワディー語" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "アイマラ語" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "アゼルバイジャン語" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "バンダ語" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "バミレケ語" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "バシキール語" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "バルーチー語" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "バンバラ語" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "バリ語" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "バスク語" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "バサ語" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "バルト語(その他)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "ベジャ語" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "ベラルーシ語" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "ベンバ語" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "ベンガル語" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "ベルベル語(その他)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "ボジュプリー語" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "ビハール語" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "ビコール語" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "ビニ語" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "ビスラマ語" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "シクシカ語" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "バントゥー語(その他)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "ボスニア語" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "ブラジ語" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "ブルトン語" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "バタク語(インドネシア)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "ブリヤート語" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "ブギス語" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "ブルガリア語" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "ビルマ語" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "ブラン語" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "カドー語" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "中央アメリカインディアン語(その他)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "カリブ語" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "カタロニア語" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "カフカス語(その他)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "セブアノ語" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "ケルト語(その他)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "チャモロ語" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "チブチャ語" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "チェチェン語" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "チャガタイ語" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "中国語" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "チヌーク語" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "マリ語" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "チヌークジャーゴン語" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "チョクトー語" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "チペワイアン語" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "チェロキー語" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "教会スラブ語" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "チュヴァシ語" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "シャイエン語" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "チャム語" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "コプト語" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "コーンウォール語" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "コルシカ語" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "英語が基盤のクレオール語・ピジン語(その他)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "フランス語が基盤のクレオール語・ピジン語(その他)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "ポルトガル語が基盤のクレオール語・ピジン語(その他)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "クリー語" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "クリミアタタール語" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "クレオール語・ピジン語(その他)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "カシューブ語" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "クシ語(その他)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "チェコ語" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "ダコタ語" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "デンマーク語" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "ダルギン語" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "ダヤク語" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "デラウェア語" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "スレーブ語(アタパスカ語)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "ドグリブ語" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "ディンカ語" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "ディヴェヒ語" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "ドグリー語" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "ドラヴィダ語(その他)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "低地ソルブ語" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "ドゥアーラ語" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "中世オランダ語(ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "オランダ語" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ディウラ語" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "ゾンカ語" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "エフィク語" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "エジプト語(古代)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "エカジュク語" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "エラム語" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "英語" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "中英語(1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "エスペラント語" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "エストニア語" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "エウェ語" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "エウォンド語" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "ファン語" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "フェロー語" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "ファンティ語" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "フィージー語" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "フィリピン語" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "フィンランド語" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "フィン-ウゴル語(その他)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "フォン語" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "フランス語" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "中世フランス語(ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "古フランス語(842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "フリースランド語" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "フラ語" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "フルイリアン語" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "ガー語" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "ガヨ語" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "バヤ語" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "ゲルマン諸語(その他)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "グルジア語" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "ドイツ語" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "ゲーズ語" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "ギルバート語" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "ガエリック語" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "アイルランド語" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "ガリシア語" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "マンクス語" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "中高ドイツ語(ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "古高ドイツ語(ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "ゴンド語" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "ゴロンタロ語" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "ゴート語" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "グレボ語" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "古代ギリシア語(-1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "現代ギリシア語(1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "グアラニー語" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "グジャラート語" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "グイッチン語" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "ハイダ語" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "ハイチ語" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "ハウサ語" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "ハワイ語" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "ヘブライ語" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "ヘレロ語" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "ヒリガイノン語" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "ヒマチャル語" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "ヒンディー語" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "ヒッタイト語" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "フモン語" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "モツ語" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "高地ソルブ語" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "ハンガリー語" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "フーパ語" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "イバン語" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "イボ語" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "アイスランド語" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "イド語" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "四川語" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "イジョ語" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "イヌクティトゥト語" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "インターリングァ語" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "イロコ語" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "インターリングァ(国際補助語協会)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "インド語(その他)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "インドネシア語" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "インド-ヨーロッパ語(その他)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "イングーシ語" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "イヌピアト語" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "イラン語(その他)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "イロコイ語" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "イタリア語" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "ジャワ語" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "ロジパン語" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "日本語" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "ユダヤ系ペルシア語" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "ユダヤ系アラビア語" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "カラカルパク語" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "カバイル語" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "カチン語" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "グリーンランド語" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "カンバ語" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "カナラ語" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "カレン語" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "カシミール語" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "カヌリ語" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "カウィ語" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "カザフ語" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "カバルダ語" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "カーシ語" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "コイサン語(その他)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "クメール語" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "コータン語" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "キクーユ語" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "キニヤルワンダ語" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "キルギス語" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "キンブンドゥー語" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "コンカニ語" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "コミ語" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "コンゴ語" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "韓国語" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "コスラエ語" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "クペル語" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "カラチャイバイカル語" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "クルー語" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "クルク語" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "クアニャマ語" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "クミク語" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "クルド語" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "クテナイ語" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ラディノ語" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "ラーンダ語" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "ランバ語" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "ラオ語" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "ラテン語" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "ラトビア語" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "レズギン語" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "リグリア語" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "リンガラ語" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "リトアニア語" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "モンゴ語" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "ロージー語" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "ルクセンブルク語" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "ルバ・ルルア語" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "ルバ・カタンガ語" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ガンダ語" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "ルイセーニョ語" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "ルンダ語" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "ルオ語(ケニアおよびタンザニア)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "ルシャイ語" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "マケドニア語" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "マドゥラ語" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "マガヒ語" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "マーシャル語" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "マイティリー語" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "マカッサル語" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "マラヤーラム語" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "マンディンゴ語" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "マオリ語" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "アウストロネシア語(その他)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "マラーティー語" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "マサイ語" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "マレー語" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "モクシャ語" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "マンダル語" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "メンデ語" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "中期アイルランド語(900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "ミックマック語" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "ミナンカバウ語" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "その他の言語" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "モン・クメール語(その他)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "マダガスカル語" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "マルタ語" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "満州語" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "マニプリ語" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "マノボ語" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "モホーク語" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "モルダヴィア語" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "モンゴル語" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "モシ語" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "複数言語" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "ムンダ語" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "クリーク語" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "ミランダ語" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "マールワーリー語" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "マヤ語" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "アルジア語" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "ナワトル語" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "北米インディアン語" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "ナポリ語" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "ナヴァホ語" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "南ヌデベレ語" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "北ヌデベレ語" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ンドンガ語" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "低地ドイツ語" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "ネパール語" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "ネワール語" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "ニアス語" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "ニジェール-コルフドファン語(その他)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "ニウエ語" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "ノルウェー・ニーノシュク語" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "ノルウェー・ブークモール語" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "ノガイ語" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "古代スカンディナヴィア語" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "ノルウェー語" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "北ソト語" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "ヌバ語" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "古典ネワール語" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "チェワ語" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "ムエジ語" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "ニャンコーレ語" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "ニョロ語" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "ンジマ語" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "プロヴァンス語(1500年以降)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "オジブウェー語" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "オリヤー語" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "オロモ語" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "オーセージ語" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "オセット語" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "オスマントルコ語(1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "オトミ語" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "パプア語(その他)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "パンガシナン語" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "パフレヴィ語" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "パンパンガ語" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "パンジャブ語" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "パピアメント語" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "パラウ諸島語" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "古ペルシア語(ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "ペルシア語" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "フィリピン語(その他)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "フェニキア語" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "パーリ語" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "ポーランド語" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "ポナペ語" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "ポルトガル語" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "プラークリット諸語" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "古期プロヴァンス語" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "プシュトゥー語" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "ケチュア語" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "ラージャスタニ語" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "ラパヌイ語" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "ラロトンガ語" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "ロマンス語(その他)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "レトロマン語" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "ジプシー語" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "ルーマニア語" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "ルンディ語" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "ロシア語" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "サンダウェ語" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "サンゴ語" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "ヤクート語" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "南アメリカインディアン語(その他)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "サリシュ語" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "サマリアアラム語" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "サンスクリット語" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "ササク語" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "サンターリー語" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "セルビア語" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "シシリア語" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "スコットランド語" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "クロアティア語" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "セルカーク語" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "セム語(その他)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "古代ケルト語(-900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "手話言語" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "シャン語" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "シダモ語" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "シンハラ語" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "スー語" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "シナ-チベット語(その他)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "スラヴ語(その他)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "スロバキア語" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "スロベニア語" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "南サーミ語" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "北サーミ語" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "サーミ諸語(その他)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "ルレオサーミ語" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "イナリサーミ語" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "サモア語" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "スコルトサーミ語" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "ショナ語" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "シンド語" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "ソニンケ語" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "ソグディアナ語" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "ソマリ語" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "ソンガイ語" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "南ソト語" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "スペイン語" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "サルデーニャ語" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "セレル語" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "ナイル-サハラ語(その他)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "スワート語" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "スクマ語" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "スンダ語" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "スス語" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "シュメール語" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "スワヒリ語" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "スウェーデン語" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "シリア語" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "タヒチ語" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "タイ語(その他)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "タミル語" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "タタール語" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "テルグ語" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "テムネ語" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "テレナ語" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "テトゥン語" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "タジク語" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "タガログ語" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "タイ語" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "チベット語" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "ティグレ語" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "ティグリニャ語" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "ティヴ語" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "クリンゴン語" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "トリンギット語" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "タマシェク語" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "トンガ語(ニアサ)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "トンガ語(トンガ諸島)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "トークピジン語" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "チムシアン語" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "ツワナ語" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "ツォンガ語" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "トルクメン語" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "トゥンブカ語" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "トゥピー語族" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "トルコ語" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "アルタイ語(その他)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "トウィ語" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "トゥヴァ語" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "ウドムルト語" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "ウガリット語" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "ウイグル語" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "ウクライナ語" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "ムブンドウ語" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "未確認" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "ウルドゥー語" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "ウズベク語" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "ヴァイ語" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "ヴェンダ語" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "ヴェトナム語" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "ヴォラピューク語" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "ヴォート語" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "ワカシ語族" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "ワッラモ語" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "ワライ語" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "ワショ語" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "ウェールズ語" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "ソルビア語族" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "ワロン語" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "オォロフ語" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "カルムイク語" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "コーサ語" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "ヤオ語" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "ヤップ語" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "イディッシュ語" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "ヨルバ語" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "ユピック語族" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "サポテク語" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "ゼナガ語" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "チワン語" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "ザンデ語" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "ズールー語" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "ズーニー語" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "以下の処理を実行する:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "不明" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "未対応" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Level 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Level 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Level 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "追加の顧客契約が必要" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "廃止され、別のパッケージに置き換えられました" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "無効" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "サポートのレベルが指定されていません" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "ベンダはサポートを提供していません。" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "問題の決定、それは互換性に関する情報やインストール支援、使用方法の対応や進行" "中の保守、基本的なトラブルシューティングなどの技術サポートを指します。Level 1" "サポートは、製品の欠陥によるエラーを修正しようとするものではありません。" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "問題の切り分け、それは顧客内での問題を共有し領域を切り分け、Level 1サポートで" "は解決されていない問題について解決方法を提供する技術サポートを指します。" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "問題の解決、それは複雑な問題に対して技術者を従事させ、Level 2サポートで認識さ" "れていない製品の欠陥を解決する技術サポートを指します。" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "サポートを得るには、追加の顧客契約が必要です。" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "パッケージは廃止され、別の名前の新しいパッケージに置き換えられました。" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "不明なサポートオプションです。説明は利用できません" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "システム管理はpid %d (%s)のアプリケーションによってロックされています。\n" "再試行する前にこのアプリケーションを終了してください。" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "不明な該当モード「%s」" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "該当モード「%s」がパターン「%s」に対して不明です" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "正規表現 '%s' が正しくありません。regcompは %d を返しました" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "正規表現 '%s' が正しくありません" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "'%s' にアクセスするにはユーザ認証が必要です" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "再試行しています..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "%1% 回再試行したので中止しています。" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "SUSE カスタマーセンターを開いて、お使いの登録が有効であること、および期限切れ" "になっていないことをご確認ください。" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Novellカスタマーセンターへアクセスし、登録が有効であるか、有効期限切れになっ" "ていないかを確認してください。" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "接続点の作成: 接続点を作成するための書き込み可能なディレクトリが見つかりませ" "ん" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "最初にパッケージ「lsof」をインストールしてください。" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "メタデータのキャッシュディレクトリを作成できません。" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "'%s' から読み取り時にエラーが発生しました" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "%s を作成できません" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "新しいリポジトリのメタデータ取得に失敗しました。" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "リポジトリのキャッシュ作成に失敗しました ( repo2solv を開始できませんでし" "た ) 。" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "リポジトリ (%d) のキャッシュに失敗しました。" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "リポジトリ '%s' のキャッシュを構築しています" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "%s にキャッシュを作成できません - 書き込み許可がありません。" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "%1% リポジトリのキャッシュ作成に失敗しました" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "未処理のリポジトリタイプ" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "リポジトリ '%s' を追加しています" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "'%s' にあるリポジトリのファイル名が正しくありません" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "ファイル '%s' を書き込み用に開くことができません。" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "'%s' からの読み取り時に不明なエラーが発生しました" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" "リポジトリのディレクトリ '%1%' を読み込むことができません: 許可がありません" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "ディレクトリ '%s' の読み込みに失敗しました" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" "リポジトリのファイル '%1%' を読み込むことができません: 許可がありません" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "メタデータを清掃しています" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "パッケージを清掃しています" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "キャッシュディレクトリを清掃しています" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "ディレクトリを清掃しています: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "キャッシュを清掃しています" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "キャッシュから読み込んでいます" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "リポジトリ '%s' を削除しています" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "リポジトリがどこに保存されたのかがわかりません。" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "'%s' を削除することができません" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "リポジトリを修正しています" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "リポジトリを更新しています: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "サービスの保管場所がわかりません。" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "不明なサービス '%1%' です: 孤立したサービスリポジトリ '%2%' を削除しています" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "リポジトリの別名をドットから始めることはできません。" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "サービスの別名をドットから始めることはできません。" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "ファイル %s のダイジェストはありません。" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "ファイル %s の不明なダイジェスト %s 。" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "ファイル '%s' のダイジェストの検証に失敗しました" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "ファイル '%s' は署名されていません。続行しますか?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "リポジトリ '%s' のファイル '%s' は署名されていません。続行しますか?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "キーを拒否しますか?一時的に信頼しますか?それとも常に信頼しますか?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "キーの名前: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "リポジトリ \"%2%\" から %1% の新しいパッケージ署名キーを受け取りました:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "ファイル '%1%' の署名の検証に失敗しました。" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "リポジトリ '%2%' からのファイル '%1%' の署名の検証に失敗しました。" # internal key used: Ok # internal key used: Ok #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "続行しますか?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "ファイル '%s' は不明なキー '%s' で署名されています。続行しますか?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "リポジトリ '%s' のファイル '%s' は不明なキー '%s' で署名されています。続行し" "ますか?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "リポジトリ %1% は 'gpgkey=' で追加の URL を指定していません。" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "リポジトリ %2% 内で gpg キー ID %1% を検索しています。" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "キャッシュ %2% 内で gpg キー ID %1% を検索しています。" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "必要な属性 '%s' がありません。" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "'%s' または '%s' (もしくはその両方)の属性が必要です。" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "署名の検証に失敗しました" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "パッケージ %s は転送中に壊れてしまったようです。もう一度取得しますか?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "パッケージ %s の提供に失敗しました。取得を再試行しますか?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpmのチェックに失敗しました。" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpmが失敗しました。" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "リポジトリキャッシュへの書き込み許可がありません。" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "サービスプラグインは属性の変更をサポートしていません。" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "ファイル '%s' をリポジトリ '%s' から提供することができません" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "リポジトリにURLが設定されていません。" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "必要なメディア %1%/%2% は '%3%' と記されているメディアで、下記のような内容が" "含まれています:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "パッケージ %2% からの\n" " ファイル %1% が、\n" " パッケージ %3% からの\n" " ファイルと\n" " 競合しています" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "パッケージ %2% からの\n" " ファイル %1% が、\n" " %3% のインストールによる\n" " ファイルと\n" " 競合しています" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "%2% の\n" " インストールによる\n" " ファイル %1% が、パッケージ\n" " %3% からのファイルと\n" " 競合しています" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "%2% の\n" " インストールによる\n" " ファイル %1% が、\n" " %3% のインストールによる\n" " ファイルと競合しています" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "パッケージ %2% \n" " からの\n" " ファイル %1% が、\n" "パッケージ %4% \n" " からの\n" "ファイル %3% と\n" "競合しています" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "パッケージ %2% \n" " からの\n" " ファイル %1% が、\n" " %4% のインストールによる\n" " ファイル %3% と\n" " 競合\n" " しています" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "%2% の\n" " インストールによる\n" " ファイル %1% が、\n" " パッケージ %4% \n" " からのファイル %3%\n" " と競合\n" " しています" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "%2% の\n" " インストールによる\n" " ファイル %1% が、\n" " %4% のインストール\n" " による\n" " ファイル %3%\n" " と競合しています" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "sat-poolを作成できません。" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "いくつかの依存関係を無視することによって %s を壊します" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "いくつかの依存関係をおおよそ無視する" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "インストール済みの %1% は distupgrade リポジトリに属しておらず、置き換えなけ" "ればならないものです" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "これからインストールする %1% は distupgrade リポジトリに属していません" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "インストール済みの %1% は下位のアーキテクチャに属しています" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "これからインストールする %1% は下位のアーキテクチャに属しています" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "インストール済みの %1% に問題があります" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "要求が矛盾しています" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "何らかの依存関係の問題" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "要求された '%1%' を提供するものがありません" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "必要なリポジトリを全て有効化していますか?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "要求されたパッケージ %1% は存在していません" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "サポートされていない要求" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' はシステム側で提供されているものであり、消去できません" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% はインストールできません" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" "インストール済みの %2% によって必要とされている '%1%' を提供するものがありま" "せん" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" "これからインストールする %2% によって必要とされている '%1%' を提供するものが" "ありません" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "%1% と %2% を同時にインストールすることはできません" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' と" "矛盾します" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "インストール済みの %1% は、これからインストールする %3% によって提供される " "'%2%' と矛盾します" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "これからインストールする %1% は、インストール済みの %3% によって提供される " "'%2%' と矛盾します" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "これからインストールする %1% は、これからインストールする %3% によって提供さ" "れる '%2%' と矛盾します" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' を" "廃止します" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "インストール済みの %1% は、インストール済みの %3% によって提供される '%2%' を" "廃止します" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "これからインストールする %1% は、インストール済みの %3% によって提供される " "'%2%' を廃止します" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "これからインストールする %1% は、これからインストールする %2% によって提供さ" "れる '%2%' を廃止します" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "インストール済みの %1% は、それ自身が提供する '%2%' と矛盾します" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "これからインストールする %1% は、それ自身が提供する '%2%' と矛盾します" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "インストール済みの %1% は '%2%' を必要としていますが、この要件を満たすものが" "ありません" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "これからインストールする %1% は '%2%' を必要としていますが、この要件を満たす" "ものがありません" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "削除したプロバイダ: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "インストール不可能なプロバイダ: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "インストール不可能なプロバイダ: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% は未だ %2% に完全統合されていません。" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "PTF をそのまま維持し、メンテナンスパッチをインストールしないように選択するの" "が一般的です。" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "この状況下において、インストールされている %1% を削除すると、その中に含まれて" "いる PTF パッケージも削除 (置換ではありません!) することになります。" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF を削除したい場合は、 '%1%' を実行してください。このコマンドを実行すること" "により、 PTF パッケージを削除せずに更新できます。" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "PTF はそのまま維持するか、処理をキャンセルするのが一般的です。" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "インストール済みの %1% が処理をブロックしています。" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "PTF をそのまま維持し、この処理をキャンセルするのが一般的です。" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "%1% を削除できるようにするには、ロックを解除してください" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "%1% をインストールしません" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "%1% を維持します" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "%1% をインストールできるようにするには、ロックを解除してください" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "この要求はシステムを壊してしまいます!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "システムが破壊される警告を無視する" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "%1% を提供する解決方法のインストールについて確認を行いません" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "%1% を提供する全ての解決方法の削除について確認を行いません" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "%1% の最新バージョンをインストールしません" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "下位のアーキテクチャですが、 %1% を維持します" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "下位のアーキテクチャですが、 %1% を維持します" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "古い %1% を維持します" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "除外されたリポジトリから %1% をインストールします" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "撤回済みの %1% をインストールする" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "PTF %1% のインストールを許可する" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "ブラックリスト設定されている %1% をインストールする" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "%1% を %2% にダウングレードします" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "%1% のアーキテクチャを %2% に変更します" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "%1% をインストールします (ベンダの変更を伴います)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "ベンダ %4% からの %3% を\n" " ベンダ %2% からの %1% に置き換えてインストールします" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "%1% を %2% で置き換えます" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "%1% をアンインストールします" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "処理後スクリプトを実行しています" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "%1% スクリプトを実行しています" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "%1% スクリプトの出力:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "指示通りにインストールが中止されました。" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " 実行済み" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " 実行失敗" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s は %s として実行済みです)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " 中止しているため実行をスキップ" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "更新メッセージ通知の送信時にエラーが発生しました。" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "新しい更新メッセージ" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "シグナル \"%1% (%2%)\" を受信しましたが、システムの一貫性が確保できなくなるた" "め、現在実行中の RPM トランザクションはキャンセルできません。" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "下記の問題が発生したことによって処理が失敗しました:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "ミラーサイトが見つかりませんでした" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "目的のファイルを作成できませんでした" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "既にキャッシュ内にあります" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "一時ファイルの名前変更に失敗しました。" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "完了" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "ユーザによってキャンセルされました。" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPMの失敗: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "公開鍵をファイル %1% からインポートすることができませんでした" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "公開鍵 %1% を削除することができませんでした" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "パッケージヘッダに署名がありません!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "パッケージペイロードに署名がありません!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s 向けに変更された設定ファイル:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpmは %s を %s として保存しましたが、差異を判別できませんでした" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpmは %s を %s として保存しました。\n" "以下は差異のある最初の25行です。\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpmは %s を %s として作成しましたが、差異を判別できませんでした" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpmは %s を %s として作成しました。\n" "以下は差異のある最初の25行です。\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "追加のrpm出力" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "バックアップ %s が作成されました" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "署名に問題はありません" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "不明な種類の署名です" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "署名は正しくありません" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "署名に問題はありませんが、キーを信頼していません" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "署名の公開鍵がありません" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "ファイルが存在しないか、署名を確認できません" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "ファイルに署名がありません" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "無期限" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "有効期限 (期限切れ済み): %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "有効期限: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(無期限)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(期限切れ)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(24 時間以内に期限切れ)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(あと %d 日で期限切れ)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "存在しないキー %s をキーリング %s にインポートしようとしました" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "キーのインポートに失敗しました。" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "キーの削除に失敗しました。" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "署名ファイル %s が見つかりません" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" "%2$u バイトのチェックサム '%3$s' は '%1$s' と思われますが、疑わしいタイプです" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "擬似端末(%s)を開くことができません。" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "パイプ(%s)を開くことができません。" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "無効なLDAP URLのクエリ文字列" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "無効なLDAP URLクエリパラメータ '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "URLオブジェクトを複製できません" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "無効な空のURLオブジェクト参照" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "URLコンポーネントを解析できません" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "履歴:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "URLスキームでは %s を許可していません" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "無効な %s コンポーネント '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "無効な %s コンポーネント" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "このURLに対して、クエリ文字列解析はサポートされていません" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URLスキームは必須のコンポーネントです" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "無効なURLスキーム '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "URLスキームではユーザ名を指定することは許されていません" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "URLスキームではパスワードを指定することは許されていません" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "URLスキームにはホスト部分が必要です" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "URLスキームではホスト部分を指定することは許されていません" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "無効なホスト部分 '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "URLスキームではポートの指定は許されていません" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "無効なポート部分 '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "URLスキームにはパス名が必要です" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "権限部分が存在する場合相対パスは許可されません" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "エンコードされた文字列にNULLバイトがあります" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "無効なパラメータ配列区切り文字" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "無効なパラメータマップ区切り文字" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "無効なパラメータ配列結合文字" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "コマンドは状態 %d で終了しました。" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "コマンドはシグナル %d (%s)で終了しました。" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "コマンドは不明なエラーで終了しました。" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "正しくない実行パラメータが指定されました。" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "制御パイプを作成できませんでした。" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "'%s' (%s)にchrootすることができません。" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "ディレクトリを '%s' (%s)に変更できません。" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" "chroot '%s' (%s)の実行中にディレクトリを '%s' に変更することはできません。" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "'%s' (%s)を実行することができません。" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "fork (%s)することができません。" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "'%s' を実行できません。 chdir が失敗しました (%s) 。" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "'%s' を実行できません。 chroot が失敗しました (%s) 。" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "'%s' を実行できません。 exec が失敗しました (%s) 。" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "'%s' を実行できません。予期しないエラーです。" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "%s を %s にマウントできませんでした" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "%s をアンマウントできませんでした" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "不正なファイル名:%s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "アクション '%s' を実行しようとした際にメディアが開きませんでした。" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "ファイル「%s」がメディア「%s」に見つかりません" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "ファイル「%s」を書き込めません。" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "メディアが接続されていません" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "不正なメディアの接続点" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "「%s」のダウンロード(curl)準備が失敗しました" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "システム例外 '%s' がメディア '%s' で発生しました。" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "パス「%s」(メディア「%s」上)がファイルではありません。" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "パス「%s」(メディア「%s」上)はディレクトリではありません。" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "不正な形式のURI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "URIのホスト名が空です" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "URIのファイルシステムが空です" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "URIの宛先が空です" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "「%s」のURIスキーマがサポートされていません。" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "メディアでサポートされていない操作です" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "「%s」のダウンロード(curl)エラー:\n" "エラーコード:%s\n" "エラーメッセージ:%s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "「%s」のダウンロード(curl)オプションの設定中にエラーが発生しました:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "メディアソース「%s」に目的のメディアが含まれていません" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "メディア「%s」は別のインスタンスによって使用されています" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "メディアを取り出せません" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "メディア「%s」を取り出せません" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "'%s' へのアクセスが拒否されました。" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "'%s' にアクセスする際にタイムアウトになりました。" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "ダウンロードしたデータが期待するファイルサイズを超えています (期待するサイズ=" "%s, 実際のサイズ=%s) 。" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "場所「%s」は一時的にアクセスできなくなっています。" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " SSL 証明書に問題があります。 '%s' について証明機関に問題がないかどうか確認し" "てください。" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "メディアを接続するのに十分なリソースがありません。" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "未対応のHTTP認証方式 '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "'%s' のダウンロード (curl) でエラーが発生しました:\n" "エラーコード: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "'%s' のダウンロード (curl) でエラーが発生しました:\n" "HTTP レスポンスの取得ができませんでした\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "はい (y)" #: zypp-tui/Table.cc:32 msgid "No" msgstr "いいえ (n)" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "注意:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "警告:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "エラー:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "完了" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "注意" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "エラー" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "警告: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "取得しています:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "開始しています" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "見つかりません" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "このプロンプトに対するヘルプは用意されていません。" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "このオプションに対するヘルプは用意されていません" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "すべてのオプションを表示" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "はい" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "いいえ" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "指定した URL には正しいメタデータがありません" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "%%posttrans スクリプト '%1%' を実行しています" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "%postrans スクリプトを実行しています" #~ msgid "Package is not signed!" #~ msgstr "パッケージに署名がありません!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s はdistupgradeのリポジトリに属していません" #~ msgid "%s has inferior architecture" #~ msgstr "%s は下位のアーキテクチャです" #~ msgid "problem with installed package %s" #~ msgstr "インストール済みのパッケージ %s に問題が発生しました" #~ msgid "nothing provides requested %s" #~ msgstr "要求した %s はどこからも提供されていません" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "すべての必要なリポジトリを有効化しましたか?" #~ msgid "package %s does not exist" #~ msgstr "パッケージ %s は存在しません" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s はシステムが提供するもので、削除できません" #~ msgid "%s is not installable" #~ msgstr "%s はインストールできません" #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s (%s で必要)はどこからも提供されていません" #~ msgid "cannot install both %s and %s" #~ msgstr "%s と %s の両方をインストールすることはできません" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s は %s (%s から提供されている)と競合します" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s は %s (%s から提供されている)を古いものとして廃棄します" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "" #~ "インストール済みの %s は、%s (%s から提供されている)を古いものとして廃棄し" #~ "ます" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "解決方法 %s は自分自身で提供している %s と競合しています" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s は %s を必要としていますが、この要求を解決する方法がありません" #~ msgid "remove lock to allow removal of %s" #~ msgstr "%s の削除を許可するためにロックを削除する" #~ msgid "do not install %s" #~ msgstr "%s をインストールしない" #~ msgid "keep %s" #~ msgstr "%s を維持" #~ msgid "remove lock to allow installation of %s" #~ msgstr "%s のインストールを許可するためにロックを削除する" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "%s を提供する解決方法のインストールについて問い合わせない" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "%s を提供するすべての解決方法の削除について問い合わせない" #~ msgid "do not install most recent version of %s" #~ msgstr "%s の最新バージョンをインストールしない" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "下位のアーキテクチャである %s を維持する" #~ msgid "install %s despite the inferior architecture" #~ msgstr "下位のアーキテクチャである %s をインストールする" #~ msgid "keep obsolete %s" #~ msgstr "古い %s を維持する" #~ msgid "install %s from excluded repository" #~ msgstr "除外されたリポジトリから %s をインストールする" #~ msgid "downgrade of %s to %s" #~ msgstr "%s を %s にダウングレードする" #~ msgid "architecture change of %s to %s" #~ msgstr "アーキテクチャを %s から %s に変更する" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "%s をインストールする(ベンダを変更する)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "%s を %s で置き換える" #~ msgid "deinstallation of %s" #~ msgstr "%s をアンインストールする" #~ msgid "Can't open lock file: %s" #~ msgstr "ロックファイルを開けません:%s" #~ msgid "This action is being run by another program already." #~ msgstr "この作業はすでに他のプログラムで実行されています。" #~ msgid "Hal Exception" #~ msgstr "HAL例外" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "申し訳ありません。このバージョンのlibzyppはHALサポートなしで構築されていま" #~ "す。" #~ msgid "HalContext not connected" #~ msgstr "HalContextが接続されていません" #~ msgid "HalDrive not initialized" #~ msgstr "HalDriveが準備されていません" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolumeが準備されていません" #~ msgid "Unable to create dbus connection" #~ msgstr "dbus接続を作成できません" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new:libhalコンテキストを作成できません" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection:dbus接続を設定できません" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "HALコンテキストを準備できません。haldが動作していない可能性があります。" #~ msgid "Not a CDROM drive" #~ msgstr "CD ROMドライブではありません" #~ msgid "Can't initialize mutex attributes" #~ msgstr "相互排他属性を準備できません" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "再帰相互排他的属性を設定できません" #~ msgid "Can't initialize recursive mutex" #~ msgstr "再帰相互排他属性を準備できません" #~ msgid "Can't acquire the mutex lock" #~ msgstr "mutexロックを取得できません" #~ msgid "Can't release the mutex lock" #~ msgstr "mutexロックを解除できません" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "公開鍵をファイル %s からインポートすることができませんでした:%s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "公開鍵 %s を削除することができませんでした:%s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "「%s」からイメージファイルをマウントする使用可能なループデバイスが見つかり" #~ "ません" libzypp-17.36.5/po/ka.po000066400000000000000000003777261476576476200150150ustar00rootroot00000000000000# Georgian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2005 SUSE Linux Products GmbH. # # Aiet Kolkhi , 2005. # George Machitidze , 2009. msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2023-01-28 15:14+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\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: Weblate 4.9.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "უცნობი ქვეყანა: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "კოდის გარეშე" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "ანდირა" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "არაბეთის გაერთიანებული ემირატები" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "ავღანეთი" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "ანტიგუა და ბარბუდა" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "ანგილა" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "ალბანია" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "სომხეთი" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "ნიდერლანდების ანტილის კუნძულები (NL)" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "ანგოლა" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "ანტარქტიკა" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "არგენტინა" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "ამერიკული სამოა" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "ავსტრია" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "ავსტრალია" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "არუბა" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "ალანდის კუნძულები" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "აზერბაიჯანი" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "ბოსნია და ჰერცოგოვინა" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "ბარბადოსი" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "ბანგლადეში" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "ბელგია" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "ბურკინა ფასო" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "ბულგარეთი" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "ბაჰრეინი" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "ბურუნდი" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "ბენინი" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "ბერმუდები" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "ბრუნეი" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "ბოლივია" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "ბრაზილია" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "ბაჰამის კუნძულები" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "ბუტანი" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "ბუვეტის კუნძული" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "ბოცვანა" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "ბელორუსეთი" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "ბელიზი" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "კანადა" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "ქოქოს (კეელინგ) კუნძულები" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "კონგო" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "ცენტრალური აფრიკის რესპუბლიკა" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "შვეიცარია" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "კოტ-დ’ივუარი" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "კუკის კუნძულები (ახალი ზელანდია)" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "ჩილე" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "კამერუნი" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "ჩინეთი" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "კოლუმბია" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "კოსტა რიკა" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "კუბა" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "კაბო ვერდე" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "შობის კუნძული" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "კვიპროსი" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "ჩეხეთი" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "გერმანია" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "ჯიბუტი" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "დანია" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "დომინიკა" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "დომენიკის რესპუბლიკა" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "ალჟირი" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "ეკვადორი" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "ესტონეთი" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "ეგვიპტე" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "დასავლეთ საჰარა" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "ერითრეა" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "ესპანეთი" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "ეთიოპია" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "ფინეთი" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "ფიჯი" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "ფოლკლენდის კუნძულები" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "მიკრონეზიის ფედერალური შტატები" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "ფარერის კუნძულები" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "საფრანგეთი" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "გაბონი" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "დიდი ბრიტანეთი" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "გრენადა" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "საქართველო" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "ფრანგული გვიანა" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "გერნსი" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "განა" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "გიბრალტარი" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "გრენლანდია" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "გამბია" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "გვინეა" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "გვადალუპე" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "ეკვატორული გვინეა" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "საბერძნეთი" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "სამხრეთ ჯორჯია და სამხრეთ სენდვიჩის კუნძულები" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "გვატემალა" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "გუამი" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "გვინეა-ბისაუ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "გაიანა" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "ჰონგკონგი" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "ჰონდურასი" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "ხორვატია" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "ჰაიტი" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "უნგრეთი" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "ინდონეზია" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "ირლანდია" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "ისრაელი" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "მენის კუნძული" #: zypp/CountryCode.cc:261 msgid "India" msgstr "ინდოეთი" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "ბრიტანეთის ინდოეთის ოკეანის ტერიტორია" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "ერაყო" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "ირანი" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "ისლანდია" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "იტალია" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "ჯერსი" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "იამაიკა" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "იორდანია" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "იაპონია" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "კენია" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "ყირგიზეთი" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "კამბოჯა" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "კირიბატი" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "კომორი" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "სენტ კიტსი და ნევისი" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "ჩრდილოეთ კორეა" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "სამხრეთ კორეა" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "ქუვეიტი" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "კაიმანის კუნძულები" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "ყაზახეთი" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "ლაოსის სახალხო დემოკრატიული რესპუბლიკა" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "ლიბანი" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "წმინდა ლუჩია" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "ლიჰტენშტაინი" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "შრი ლანკა" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "ლიბერია" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "ლესოტო" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "ლიეტუვა" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "ლუქსემბურგი" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "ლატვია" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "ლიბია" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "მაროკო" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "მონაკო" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "მოლდოვა" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "მონტენეგრო" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "სენტ მარტინი" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "მადაგასკარი" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "მარშალის კუნძულები" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "მაკედონია" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "მალი" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "მიანმარი" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "მონღოლეთი" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "მაკაო" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "ჩრდილოეთ მარიანას კუნძულები" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "მარტინიკა" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "მავრიტანია" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "მონტსერატი" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "მალტა" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "მავრიკი" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "მალდივები" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "მალავი" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "მექსიკა" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "მალაიზია" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "მოზამბიკი" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "ნამიბია" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "ახალი კალედონია" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "ნიგერი" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "ნორფოლკის კუნძული" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "ნიგერია" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "ნიკარაგუა" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "ჰოლანდია" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "ნორვეგია" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "ნეპალი" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "ნაურუ" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "ნიუე" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "ახალი ზელანდია" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "ომანი" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "პანამა" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "პერუ" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "ფრანგული პოლინეზია" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "პაპუა ახალი გვინეა" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "ფილიპინები" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "პაკისტანი" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "პოლონეთი" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "წმინდა პიერი და მიქელონი" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "პიტკერნი" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "პუერტო რიკო" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "პალესტინის ტერიტორია" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "პორტუგალია" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "პალაუ" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "პარაგვაი" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "ყატარი" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "რეიუნიონი" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "რუმინეთი" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "სერბეთი" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "რუსეთის ფედერაცია" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "რუანდა" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "საუდის არაბეთი" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "სოლომონის კუნძულები" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "სეიშელები" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "სუდანი" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "შვედეთი" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "სინგაპური" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "წმინდა ელენე" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "სლოვენია" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "სვალბარდი და ან-მაიენი" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "სლოვაკეთი" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "სიერა ლეონე" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "სან მარინო" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "სენეგალი" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "სომალი" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "სურინამი" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "საო ტომე და პრინციპე" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "ელ სალვადორი" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "სირია" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "ესვატინი" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "ტერქსისა და კაიკოსის კუნძულები" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "ჩადი" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "ფრანგული სამხრეთ ტერიტორიები" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "ტოგო" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "ტაილანდი" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "ტაჯიკეთი" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "ტოკელაუ" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "თურქმენეთი" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ტუნისი" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "ტონგა" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "აღმოსავლეთ ტიმორი" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "თურქეთი" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ტრინიდადი და ტობაგო" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "ტუვალუ" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "ტაივანი" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "ტანზანია" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "უკრაინა" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "უგანდა" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "შეერთებული შტატების მცირე გარემდებარე კუნძულები" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "ამერიკის შეერთებული შტატები" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "ურუგვაი" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "უზბეკეთი" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "წმიდა საყდართან (ვატიკანის ქალაქი სახელმწიფო)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "სენტ ვინცენტი და გრენადინები" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "ვენესუელა" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "ბრიტანეთის ვირჯინიის კუნძულები" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "ვირჯინიის კუნძულები, აშშ." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "ვიეტნამი" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "ვანუატუ" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "ვალისი და ფუტუნა" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "სამოა" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "იემენი" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "მეიოტი" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "სამხრეთ აფრიკა" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "ზამბია" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "ზიმბაბვე" #: zypp/Dep.cc:96 msgid "Provides" msgstr "მომწოდებლები" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "ესაჭიროება" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "კონფლიქტები" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "მოძველებული" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "უცნობი ენა: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "აფარი" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "აბხაზური" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "ადიღეური" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "აფრიკაანსი" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "აკანი" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "ალბანური" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "ამჰარული" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "ინგლუსური, ძველი (დაახლ. 450-1000)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "აპაჩის ენები" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "არაბული" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "არამეული" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "არაგონური" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "სომხური" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "ხელოვნური (სხვა)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "ასამური" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "ასთურიანული" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "ავსტრალიური ენები" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "ავესტანი" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "აიმარა" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "აზერბაიჯანული" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "ბაშკირი" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "ბალინური" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "ბასკური" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "ბალტიური (სხვა)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "ბეჟა" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "ბელორუსული" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "ბემბა" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "ბენგალური" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "ბიჰარი" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "ბისლამა" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "ბოსნიური" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "ბრეტონული" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "ბუგინური" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "ბულგარული" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "ბირმული" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "კატალანური" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "ჩამორო" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "ჩეჩნური" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "ჩინური" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "მარული" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "ჩეროკი" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "ეკლესიის სლავური" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "ჩუვაშური" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "შეიენი" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "კოპტური" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "კორნიშური" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "კორსიკული" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "ყირიმელი თათრული" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "კაშუბური" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "ჩეხური" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "დანიური" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "დელავერი" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "დივეხი" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "ქვედა სორბული" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "ჰოლანდიური" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "ძონგკხა" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "ინგლისური" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "ინგლისური, შუასაუკუნეების (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "ესპერანტო" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "ესტონური" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "ფაროული" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "ფიჯიური" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "ფილიპინები" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "ფინური" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "ფრანგული" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "ფრისული" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "ფრიულური" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "გა" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "ქართული" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "გერმანული" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "გელური" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "ირლანდიური" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "გალური" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "მენცი" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "გორონტალო" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "გოთური" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "გუარანი" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "გუჯარათული" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "ჰაუსა" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "ჰავაიური" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "ივრითი" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "ჰერერო" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "ინდური" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "ჰირი მოგუ" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "ზედა სორბიული" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "უნგრული" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "იგბო" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "ისლანდიური" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "იდო" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "ინუკტიტუტი" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "ოქსიდენტური" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "ინდონეზიური" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "ინუპიატი" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "ირანული (სხვა)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "იტალიური" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "იავური" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "იაპონური" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "ქაბილი" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "კაჩინი" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "კალაალისუტი" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "კანნადა" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "კაშმირი" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "ყაზახური" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "კხმერული" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "კიკუიუ" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "კენიარუანდა" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "ყირგიზული" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "კომი" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "კონგო" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "კორეული" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "ქურთული" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "ლაოსური" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "ლათინური" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "ლატვიური" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "ლიმბურგანული" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "ლინგალა" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "ლიტვური" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "ლუმბურგული" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "მაკედონური" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "მარშალური" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "მაითხილი" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "მალაიამი" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "მაორი" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "მარათი" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "მალაიური" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "მანდი" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "მალაგასი" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "მალტური" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "მოლდავური" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "მონღოლური" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "მუნდას ენები" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "ნეაპოლიტური" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "ნავაიო" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "სამხრეთ ნდებელე" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "ჩრდილო ნდებელური" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ნდონგა" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "ქვემოგერმანული" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "ნეპალური" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "ნორვეგიული ნიუნორსკი" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "ნორვეგიული" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "სამხრეთ-სოზო" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "ჩიჩევა" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "ორია" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "ორომო" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "ოსური" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "პანგასინანი" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "პამპანგა" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "სპარსული" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "ფონეტიკური" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "პალი" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "პოლონური" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "პორტუგალიური" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "პუშტო" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "კეჩუა" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "რომაული" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "რუმინული" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "რუნდი" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "რუსული" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "სანგო" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "იაკუტიური" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "სანსკრიტი" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "სანტალი" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "სერბული" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "სიცილიური" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "ხორვატული" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "შანი" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "სინჰალა" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "სლოვაკური" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "სლოვენური" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "ჩრდილო-საამური" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "სამოური" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "შონა" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "სინდი" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "სომალი" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "სამხრეთ-სოზო" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "ესპანური" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "სარდინიული" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "სვატი" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "სუნდური" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "სუაჰილი" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "შვედური" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "სირიული" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "ტაიტური" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "თამილური" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "თათრული" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "ტელუგური" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "ტაჯიკური" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "ტაგალოგური" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "ტაილანდური" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "ტიბეტური" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "ტიგრინია" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "ცვანა" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "ტონგა" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "თურქმენული" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "თურქული" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "ტვი" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "უდმურტული" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "უგარათული" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "უიღური" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "უკრაინული" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "ურდუ" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "უზბეკური" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "ვაი" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "ვენდა" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "ვიეტნამური" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "უელსური" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "ვალუნი" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "ვოლოფი" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "კალმიკური" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "ხოსა" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "იაო" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "იდიში" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "იორუბა" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "ჟუანგი" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "ზულუ" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "მხარდაუჭერელი" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "დონე 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "დონე 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "დონე 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "არასწორი" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "რეპოს (%d) კეშირების შეცდომა." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "ფაილის ('%s') ჩასაწერად გახსნის შეცდომა." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "საქაღალდის ('%s') წაკთხვის შეცდომა" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "გავაგრძლო?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "ხელმოწერის გადამოწმების შეცდომა" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "ურთიერთგამომრიცხავი მოთხოვნები" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "დამოკიდებულების რამდენიმე პრობლემა" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "მხარდაუჭერელი მოთხოვნა" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr "" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "RPM-ის დამატებითი გამონატანი" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "გასაღების შემოტანის შეცდომა." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "გასაღების წაშლის შეცდომა." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "ისტორია:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "დიახ" #: zypp-tui/Table.cc:32 msgid "No" msgstr "არა" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "გაფთხილება:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "შეცდომა:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "მიღება:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "გაშვება" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "ვერ ვიპოვე" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "დიახ" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "არა" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "მითითებულ ბმულებზე სწორი მეტამონაცემების პოვნა შეუძლებელია" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "لا يمكن إنشاء المفتاح العام %s من %s إلى ملف حلقة المفاتيح %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "حاول استيراد مفتاح غير موجود %s إلى حلقة مفاتيح %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "لا يمكن تغيير مجلد العمل '/' داخل استجذار (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "فشل تهيئة تحميل (Metalink curl) '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "تحميل (metalink curl) خطأ '%s':\n" #~ "رمز الخطأ: %s\n" #~ "رسالة الخطأ: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "توقف التحميل في %d%%" #~ msgid "Download interrupted by user" #~ msgstr "توقف التحميل بواسطة المستخدم" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "حدث خطأ أثناء إعداد خيارات التحميل (metalink curl) ل '%s':" #~ msgid "Serbia and Montenegro" #~ msgstr "صربيا ومونتنيجرو" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "خيار list غير معروف" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "تعذر حل التبعيات" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." libzypp-17.36.5/po/km.po000066400000000000000000004427671476576476200150270ustar00rootroot00000000000000# translation of zypp.km.po to Khmer # Copyright (C) YEAR SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the PACKAGE package. # Eng Vannak , 2006. # Khoem Sokhem , 2006, 2007, 2008, 2009, 2010. # Auk Piseth , 2007, 2008, 2009. # Seng Sutha, 2010. msgid "" msgstr "" "Project-Id-Version: zypp.km\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2010-06-03 08:04+0700\n" "Last-Translator: Khoem Sokhem \n" "Language-Team: Khmer \n" "Language: \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: KBabel 1.11.4\n" "X-Language: km-KH\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "ប្រទេស​ដែល​មិន​ស្គាល់ ៖ " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "គ្មាន​កូដ" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "អង់ដូរ៉ា" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "អារ៉ាប់​រួម" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "អាហ្គានីស្ថាន" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "អង់ទីហ្គា និង​បារប៊ុយដា" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "អង់ហ្គីឡា" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "អាល់បានី" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "អារមេនី" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "ហូល្លង់ អង់ទីល" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "អង់ហ្គោឡា" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "អង់តាកទិក" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "អាហ្សង់ទីន" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "សាម៉ូអា ​អាមេរិក" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "អូទ្រីស" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "អូស្ត្រាលី" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "អារូបា" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "កោះ​អាឡង់" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "អាហ្ស៊ែរបែហ្សង់" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "បូស្ន៊ី និង​​ហឺហ្ស៊េហ្គោវីណា" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "បារបាដូស" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "បង់ក្លាដេស" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "ប៊ែលហ្ស៊ិក" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "ប៊ូរគីណាហ្វាសូ" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "ប៊ុលហ្គារី" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "បារ៉ែន" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "ប៊ូរុនឌី" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "បេណាំង" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "ប៊េរមូដា" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "ប៊្រុយណេ ដារូសាឡាម" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "បូលីវី" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "ប្រេស៊ីល" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "បាហាម៉ាស" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "ប៊ូតាន" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "កោះ​ប៊ូវ៉េត" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "បុតស្វាណា" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "បេឡារុស្ស" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "បេលីហ្ស" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "កាណាដា" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "កោះ Cocos (Keeling)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "កុងហ្គោ" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "សាធារណរដ្ឋ​អាហ្វ្រិក​កណ្ដាល" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "ស្វ៊ីស" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "កូឌីហ្វ័រ" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "កោះ​កូក" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "ឈីលី" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "កាមេរ៉ូន" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "ចិន" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "កូឡុំប៊ី" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "កូស្តារីកា" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "គុយបា" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "កាបវែរ" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "កោះ​គ្រីស្តម៉ាស" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "ស៊ីពរ៍" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "សាធារណ​រដ្ឋ​ឆេក" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "អាល្លឺម៉ង់" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "ហ្ស៊ីបូទី" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "ដាណឺម៉ាក" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "ដូមីនីកា" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "សាធារណរដ្ឋ​ដូមីនីកែន" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "អាល់ហ្សេរី" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "អេក្វាឌ័រ" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "អេស្តូនី" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "អេហ្ស៊ីប" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "សាហារ៉ា​ខាង​លិច" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "អេរីទ្រា" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "អេស៉្បាញ" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "អេត្យូពី" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "ហ្វាំងឡង់" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "ហ្វីហ្ស៊ី" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "កោះ​ហ្វ៉កឡង់ (ម៉ាល់វីណា)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "រដ្ឋ​សហព័ន្ធ​មីក្រូណេស៊ី" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "កោះ​ហ្វារ៉ូ" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "បារាំង" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "ប្រទេស​ចំណុះ​បារាំង" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "ហ្គាបុង" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "ចក្រ​ភព​អង់គ្លេស" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "ហ្គ្រីណាដា" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "ហ្សកហ្ស៊ី" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "ហ្គូអ៊ីយ៉ាណា បារាំង" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "ហ្គើនស៊ី" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "ហ្គាណា" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "ហ្គីប្រាល់តា" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "ហ្គ្រីនលែន" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "ហ្គាំប៊ី" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "ហ្គីណេ" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "ហ្គូអាដឺលូប៉េ" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "ហ្គីណេ​អេក្វាទ័រ" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "ក្រិក" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "កោះ​ហ្សកហ្ស៊ី​ខាងត្បូង និង​ស៊េនវិច​ខាងត្បូង" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "ហ្គាតេម៉ាឡា" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "ហ្គាម" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "ហ្គីណេប៊ីសៅ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "ហ្គីយ៉ាណា" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "ហុងកុង" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "កោះ​ហ៊ើដ និង​កោះ​ម៉ាកដូណាល់" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "ហុងឌូរ៉ាស់" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "ក្រូអាត" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "ហៃទី" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "ហុងគ្រី" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "ឥណ្ឌូនេស៊ី" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "អៀរឡង់" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "អ៊ីស្រាអែល" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isle of Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "ឥណ្ឌា" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "អាណាចក្រ​ចក្រភព​អង់គ្លេស​នៅ​មហាសមុទ្រ​ឥណ្ឌា" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "អ៊ីរ៉ាក់" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "អ៊ីរ៉ង់" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "អ៊ីស្លង់" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "អ៊ីតាលី" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "ឈឺស៊ី" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "ចា​ម៉ៃកា" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "ហ្ស៊កដង់" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "ជប៉ុន" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "កេនយ៉ា" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "គៀរហ្គីស្តង់" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "កម្ពុជា" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "គិរិបាទី" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "កុំម៉ូរ៉ូស" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "សង់ឃីត និង​នេវីស" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "កូរ៉េ​ខាង​ជើង" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "កូរ៉េ​ខាង​ត្បូង" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "គុយ​វ៉ែត" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "កោះ​កៃម៉ាន" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "កាហ្សាក់ស្តង់" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "សាធារណរដ្ឋ​ប្រជាធិបតេយ្យ​ប្រជាមានិត​ឡាវ" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "លីបង់" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "សង់លូស៊ីយ៉ា" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "លិចទេនស្តែន" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "ស្រីលង្កា" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "លីបេរីយ៉ា" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "ឡេសូតូ" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "លីទុយអានី" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "លុចហ្សំបួរ" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "ឡាតវីយ៉ា" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "លីប៊ី" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "ម៉ារ៉ុក" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "ម៉ូណាកូ" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "ម៉ុលដូវ៉ា" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "​ម៉ុងតេណេហ្ក្រូ" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "សាន់ម៉ាទីន" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "ម៉ាដាហ្គាស្ការ" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "កោះ​ម៉ាស្យល" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "ម៉ាសេដូនី" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "ម៉ាលី" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "ភូមា" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "ម៉ុងហ្គោលី" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "ម៉ាកាវ" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "កោះ​ម៉ារៀណា​ភាគ​ខាង​ជើង" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "ម៉ារទីនីគ" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "ម៉ូរីតានី" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "ម៉ុងសេរ៉ា" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "ម៉ាល់តា" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "ម៉ូរីទុស" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "ម៉ាល់ឌីវ" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "ម៉ាឡាវី" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "ម៉ិចស៊ិក" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "ម៉ាឡេស៊ី" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "ម៉ូហ្សាំប៊ិក" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "ណាមីប៊ី" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "ញូវ កាលេដូនី" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "នីហ្សេរ" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "កោះ​ណរហ្វក" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "នីហ្សេរីយ៉ា" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "នីការ៉ាហ្គ័រ" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "ហូល្លង់" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "ន័រវែស" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "នេប៉ាល់" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "ណូរុ" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "នីវ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "ញូវ​ហ្សេលែន" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "អូម៉ង់" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "ប៉ាណាម៉ា" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "ប៉េរូ" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "ប៉ូលីនេស៊ី​បារាំង" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "ប៉ាពូញូវហ្គីណេ" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "ហ្វីលីពីន" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "ប៉ាគីស្ថាន" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "ប៉ូឡូញ" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "សង់​ព្យែរ និង​មីគុយអេឡុង" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "ពីតខាយរិន" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "ព័រតូរីកូ" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "ប៉ាឡេស្ទីន" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "ព័រទុយហ្គាល់" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "ប៉ាឡូ" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "ប៉ារ៉ាហ្គាយ" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "កាតារ" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "រេអុយញ៉ុង" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "រ៉ូម៉ានី" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "សែប៊ី" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "សហព័ន្ធ​រុស្ស៊ី" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "រវ៉ាន់ដា" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "អារ៉ាប៊ីសាអ៊ូឌីត" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "កោះ​សូឡូម៉ូន" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "សីស្ហែល" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "ស៊ូដង់" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "ស៊ុយអែត" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "សឹង្ហ​បុរី" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "សង់​ហេឡេណា" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "ស្លូវ៉ានី" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "ស្វាល់បាត និង​ហ្សង់ម៉ាយេន" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "ស្លូវ៉ាគី" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "សេរ៉ាឡេអូន" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "សាន់ម៉ារីណូ" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "សេណេហ្គាល់" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "សូម៉ាលី" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "ស៊ូរីណាមី" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "សៅតូម និង​ព្រីនស៊ីព" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "អែលសាល់វ៉ាឌ័រ" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "ស៊ីរី" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "ស្វាហ្ស៊ីឡង់" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "កោះ​ទួក និង​កៃកូស" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "ឆាដ" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "អាណាចក្រ​ខាង​ត្បូង​របស់​ បារាំង" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "តូហ្គោ" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "ថៃ" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "តាហ្ស៊ីគីស្តង់" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "តូកេឡាអ៊ូ" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "ទួគមេនីស្តង់" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ទុយណេស៊ី" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "តុងហ្គា" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "ទីម័រ​ខាង​កើត" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "ទួរគី" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ទ្រីនីដាដ និង​តូបាហ្គោ" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "ទុយវ៉ាលុយ" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "តៃវ៉ាន់" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "តង់ហ្សានី" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "អ៊ុយក្រែន" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "អ៊ូហ្គង់ដា" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "កោះ​ឆ្ងាយៗ​របស់​សហរដ្ឋ​អាមេរិក" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "សហរដ្ឋអាមេរិក" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "អ៊ុយរ៉ាហ្គាយ" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "អ៊ូហ្សបេគីស្តង់" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "ហូលីស៊ី (រដ្ឋ​បូរី​វ៉ាទីកង់)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "សង់វាំងសង់ និង​ហ្គ្រីណាឌីន" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "វេណេហ៊្សុយអេឡា" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "កោះ​វឺជីន អង់គ្លេស" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "កោះ​វឺជីន អាមេរិក" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "វៀតណាម" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "វ៉ានុយអាទុយ" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "វ៉ាលីស និង​ហ៊្វូ​ទុយណា" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "សាម៉ូអា" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "យេមែន" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "ម៉ាយុត" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "អាហ្វ្រិក​ខាង​ត្បូង" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "ហ្សាំប៊ី" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "ហ្ស៊ីមបាវ៉េ" #: zypp/Dep.cc:96 msgid "Provides" msgstr "ផ្ដល់" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "ទាមទារ" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "ប៉ះទង្គិច" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "លែង​ប្រើ %s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "អនុសាសន៍" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "ស្នើ" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "ធ្វើ​ឲ្យ​ប្រសើរ​ឡើង" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "ការ​បន្ថែម" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "មិន​ស្គាល់​ភាសា ៖ " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "អាហ្វារ" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "អាប់​ខាហ៊្សាន" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "អាឈិណិស" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "អាកូលី" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "អាដង់ម៉េ" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "អាដអ៊ីហ្គ៉េ" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "អាហ្រ៉ូ-អាស៊ីយ៉ាទិក (ផ្សេង​ទៀត)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "អាហ្វ្រីហ៊ីលី" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "អាហ្វ្រីកាអាន" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "អាយនុយ" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "អាខាន់" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "អាក់កាយ៉ង់" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "អាល់បានី" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "អាឡេអ៊ុយ" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "ភាសា​អាល់កុងហ្គូអ៊ីយ៉ាន" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "អាល់តាយខាង​ត្បូង" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "អាមហារី" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "អង់គ្លេស បុរាណ (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "ភាសា​អាប៉ាឆេ" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "អារ៉ាប់" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "អារ៉ាម៉ាអ៊ិក" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "អារ៉ាហ្គោន" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "​អារមេនី" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "អារ៉ាអ៊ុយកានីយ៉ាន" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "អារ៉ាប៉ាអូ" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "សិប្បនិម្មិត (ផ្សេង​ទៀត)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "អារ៉ាវ៉ាក់" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "អាសាមីស" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "អាស្តុយរីយ៉ុង" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "ភាសា​អាតាប៉ាសាន" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "ភាសា​អូស្ត្រាលី" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "អាវារីក" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "អាវែស្តង់" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "អាវ៉ាឌី" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "អីម៉ារ៉ា" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "អាហ្ស៊ែរបែហ្សង់" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "បង់ដា" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "ភាសា​បាមីឡេកេ" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "បាសគៀរ" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "បាលូឈិ" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "បាម្បារា" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "បាលីណីស" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "​​បាស្កេ" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "បាសា" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "បាល់ទិក (ផ្សេង​ទៀត)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "បេចា" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "បេឡារុស្ស" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "បេមបា" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "​បេន្កាលី" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "បឺបឺ (ផ្សេង​ទៀត)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "បូជូរី" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "បិហារ" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "ប៊ីកុល" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "ប៊ីនី" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "បីសឡាម៉ា" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "ស៊ិកស៊ីកា" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "បង់ទុយ (ផ្សេង​ទៀត)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "បូស្នី" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "ប្រា" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "ប្រេតុង" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "បាតាក់ (ឥណ្ឌូនេស៊ី)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "ប៊ុយរីអាត" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "ប៊ុយហ្គីណេសេ" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "​​ប៊ុលហ្ការី" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "ភូមា" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "ប្លាំង" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "កាដូ" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "ឥណ្ឌា​កណ្ដាល​បែប​អាមេរិក (ផ្សេង​ទៀត)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "ការីប" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "កាតាឡាន" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "កាអ៊ូកាស៊ីយ៉ាន (ផ្សេង​ទៀត)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "កេប៊ូអាណូ" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "សែលតិក (ផ្សេង​ទៀត)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "ចាមូរូ" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "ឈីបចា" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "ចេចេន" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "ឆាហ្គាតាអ៊ី" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "ចិន" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "ឈូកេសេ" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "ម៉ារី" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "ឈីណូ ចាកុង" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "ឆូកតា" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "ឈីប៉េអ៊ីយ៉ាន" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "ចេរ៉ូគី" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "ឆឺច​ស្លាវិច" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "ចូវ៉ាស" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "ឆេអ៊ីយ៉េណេ" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "ភាសា​កាម៊ិក" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "កុបទិក" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "កូនីស" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "កូសីកា" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "ក្រេអូឡេ និង​ភីដហ្គីន ដែល​ផ្អែក​លើ​ភាសា​អង់គ្លេស (ផ្សេង​ទៀត)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "ក្រេអូឡេ និង​ភីដហ្គីន ដែល​ផ្អែក​លើ​ភាសា​បារាំង (ផ្សេង​ទៀត)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "ក្រេអូឡេ និង​ភីដហ្គីន ដែល​ផ្អែក​លើ​ភាសា​ព័រទុយហ្គាល់ (ផ្សេង​ទៀត)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "គ្រី" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "គ្រីម៉េអាន តាតារ" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "ក្រេអូឡេ និង​ភីដហ្គីន (ផ្សេង​ទៀត)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "កាស៊ូប៊ីយ៉ាន" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "គុយស៊ិទិក" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "ឆេក" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "ដាកូតា" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "ដាណឺម៉ាក" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "ដាកវ៉ា" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "ដាយ៉ាក" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "ដេឡាវ៉ារ៉េ" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "ស្លាវ (អាតាប៉ាសាន)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "ដូហ្គ្រីប" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "ឌីនកា" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "ឌីវេហី" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "ដូហ្គ្រី" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "ដ្រាវីឌីយ៉ាន (ផ្សេង​ទៀត)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "សូរប៊ីយ៉ាន​ក្រោម" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "ឌុយអាឡា" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "ហុល្លង់ កណ្ដាល (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "ហុល្លង់" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ឌុយឡា" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "ដុងហ្កា" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "អេហ្វ៊ីក" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "អេស្ស៊ីប (បុរាណ)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "អេកាជុក" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "អេឡាម៊ិតេ" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "អង់គ្លេស" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "អង់គ្លេស កណ្ដាល (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "អេស្ពេរ៉ាន់តូ" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "​​អេស្តូនី" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "អូវឹ" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "អេវ៉ុងដូ" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "ហ្វ៉ង់" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "ហ្វាអេរូស" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "ហ្វ៉ង់ទី" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "ហ្វ៊ីហ្ស៊ី" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "ហ្វ៊ីលីពីន" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "​ហ្វាំង​ឡង់" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "ហ្វាំងណូ អ៊ុយហ្គ្រីយ៉ាន (ផ្សេង​ទៀត)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "ហ្វុង" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "បារាំង" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "បារាំង កណ្ដាល (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "បារាំង បុរាណ (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "ហ្វ្រីស៊ាន" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "ហ្វូឡា" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "ហ្វ្រីអ៊ុយលីយ៉ាន" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "ហ្កា" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "ហ្កាយ៉ូ" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "ហ្កាយ៉ា" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "ហ្គឺម៉ានិក (ផ្សេង​ទៀត)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "ហ្សកហ្ស៊ី" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "អាល្លឺម៉ង់" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "ហ្គី" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "ហ្គីលបឺតេសេ" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "ហ្គាអេលិក" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "អៀរឡង់" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "ហ្គាលីស្យាន" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "ម៉ុង" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "អាល្លឺម៉ង់ កណ្ដាល ខ្ពស់ (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "អាល្លឺម៉ង់ បុរាណ ខ្ពស់ (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "ហ្គុងឌី" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "ហ្គូរ៉ុងតាឡូ" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "ហ្គោធិក" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "ហ្គ្រេបូ" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "ក្រិក បុរាណ (ដល់ 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "ក្រិក ទំនើប (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "ហ្គូរ៉ានី" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "ហ្កុយ៉ារាទី" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "ហ្គីចអ៊ីន" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "អៃអ៊ីដា" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "ហៃទី" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "ហូសា" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "អាវ៉ាអ៊ីយ៉ាន" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "ហេប្រូ" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "ហេរេអូ" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "អ៊ីលីហ្គាអ៊ីណុង" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "អ៊ីម៉ាឆាលី" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "ហិណ្ឌូ" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "អ៊ីទីតេ" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "ម៉ុង" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "ហ៊ី​រី​ម៉ូទូ" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "អាប​ផើ សូ​បៀន" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "​​ហុងគ្រី" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "អ៊ុយប៉ា" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "អ៊ីបាន" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "អ៊ីកបូ" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "អ៊ីស្លង់" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "អ៊ីឌូ" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "ស៊ី​ចួនអ៊ី" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "អ៊ីចូ" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "អ៊ីនូកទីទូត" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "អ៊ីង​តឺ​លីងគឹ" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "អ៊ីឡូកូ" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (សមាគមន៍​ភាសា​ជំនួយ​អន្តរជាតិ)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "អ៊ីនឌិក (ផ្សេង​ទៀត)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "ឥណ្ឌូនេស៊ី" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "ឥណ្ឌូអឺរ៉ុប (ផ្សេង​ទៀត)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "អ៊ីងហ្គូស" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "អ៊ីងអ៊ិយពីយ៉ាក" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "អ៊ីរ៉ង់ (ផ្សេង​ទៀត)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "ភាសា​អ៊ីរ៉ូគុយអូអ៊ីយ៉ាន" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "អ៊ីតាលី" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "យ៉ាវា" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "ឡូបាន" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "ជប៉ុន" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "ជុយឌីអូ-ប៉ឺស៊ីយ៉ាន" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "ជុយឌីអូ-អារ៉ាប់" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "ការា-កាល់ប៉ាក់" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "កាប៊ី" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "កាឈីន" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "កាឡាលីសុទ" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "កាំបា" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "កិណាដា" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "ការ៉ែន" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "កាស្មៀរ" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "កានុរី" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "កាវី" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "កាហ្សាក់ស្តង់" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "កាបាឌីយ៉ាន" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "ខាស៊ី" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "ខូអ៊ីសាន (ផ្សេង​ទៀត)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "ខ្មែរ" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "ខូតាណេសេ" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "គីគូយូ" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "គីនយ៉ាវាន់ដា" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "គៀរ​ហ្គី​ស្តង់" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "គីមប៊ុនឌុយ" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "​​កុងកានី" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "កូមី" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "កុងហ្គោ" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "កូរ៉េ" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "កូស្រាអេយ៉ាន" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "ខេឡេ" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "ការាឆៃ-បាល់ការ" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "គ្រុយ" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "គុយរ៊ូខ" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "គ័ន​យ៉ាមា" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "គុយម៊ិក" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "ឃឺដ" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "គុយតេណាអ៊ី" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ឡាឌីណូ" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "ឡានដា" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "ឡាមបា" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "ឡាវ" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "ឡាតាំង" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "ឡាតវីយ៉ា" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "ឡេសហ្គីយ៉ាន" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "លីបួគ" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "លីនហ្កា​ឡា" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "លីទុយអានី" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "ម៉ុងហ្គោ" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "ឡូហ្ស៊ី" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "លុចហ្សំបួរ" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "លុយបា-លុយលូអា" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "លូបាកាតុងហ្កា" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ភាង​ហ្គង់​ដា" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "លុយអ៊ីសេណូ" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "លុងដា" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "លុយអូ (កេនយ៉ា និង​តង់ហ្សានី)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "លុយសាអ៊ី" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "ម៉ាសេដូនី" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "ម៉ាឌុយរ៉េសេ" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "ម៉ាហ្គាអ៊ិ" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "ម៉ា​ស្យលីស" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "ម៉ាអ៊ីទីលី" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "ម៉ាកាសារ" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "ម៉ាឡាយ៉ាឡាម" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "ម៉ង់ដាំងហ្គោ" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "ម៉ោរី" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "អូស្ត្រូណេស៊ី (ផ្សេង​ទៀត)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "​​ម៉ារាធី" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "ម៉ាសាអ៊ិ" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "ម៉ាឡេស៊ី" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "ម៉ុកសា" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "ម៉ង់ដារ" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "ម៉ិនដេ" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "អៀរឡង់ កណ្ដាល (៩០០-១២០០)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "ម៊ិកម៉ា" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "ម៊ីណង់កាបាអុយ" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "ភាសា​ផ្សេងៗ" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "ខ្មែរ​មន (ផ្សេងទៀត)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "ម៉ាឡាហ្គាស៊ី" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "ម៉ាល់តា" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "ម៉ង់ឈូ" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "ម៉ានីពូរី" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "ភាសា​ម៉ាណូបូ" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "ម៉ូហាក់" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "ម៉ុល​ដាវី" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "ម៉ុងហ្គោលី" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "ម៉ូស៊ី" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "ពហុភាសា" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "ភាសា​មុនដា" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "ក្រេក" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "មីរង់ដេសេ" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "ម៉ារ៉ារី" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "ភាសា​ម៉ាអ៊ីយ៉ាន" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "អេរីយ៉ា" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "ណាអ៊ុយ៉ាល់" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "ឥណ្ឌា​ខាង​ជើង បែប​អាមេរិក" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "ណេអាប៉ូលីតង់" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "ណាវាហ្សូ" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "នដិបិលិ (ខាង​ត្បូង)" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "នដិបិលិ (ខាង​ជើង)" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "នដុងហ្កា" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "អាល្លឺម៉ង់​ក្រោម" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "នេប៉ាល់" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "បាសា នេប៉ាល់" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "នីយ៉ាស" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "នីហ្ស៊េ - ខដូហ្វានីយ៉ាន" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "នីអ៊ុយេអាន" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "​ន័រវែស ​នីនូស​" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "ន័រវេស បុកម៉ាល់" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "ណូហ្គាអ៊ិ" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "ណូសេ បុរាណ" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "ន័រវែស" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "សូធូ​ខាង​ជើង" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "ភាសា​នុយប្យ៉ាន" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "នីវ៉ារី​បុរាណ" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "ឈិចិវា" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "នីអាម៉េហ្ស៊ី" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "នីអាណូឡេ" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "នីអូរ៉ូ" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "នីម៉ា" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "អុកស៊ីតង់ (ក្រោយ ១៥០០)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "អុហ្សីបវា" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "អូរីយ៉ា" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "អូរ៉ូម៉ូ​" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "អូសា" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "អូសសិត្យុង" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "ទួគី អូតូម៉ង់ (១៥០០-១៩២៨)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "ភាសា​អូតូមីយ៉ាន" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "ប៉ាពុយអាន (ផ្សេង​ទៀត)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "ប៉ង់ហ្គាស៊ីណង់" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "ប៉ាឡាវី" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "ប៉ាមប៉ង់ហ្គា" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "ប៉ង់ចាប៊ី" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "ប៉ាពីយ៉ាម៉ិនតូ" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "ប៉ាឡាអ៊ុយ៉ាន" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "ពឺស៊ាន បុរាណ (ca. ៦០០-៤០០ B.C)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "ពឺស៊ាន" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "ហ្វីលីពីន (ផ្សេង​ទៀត)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "ផូអេនីស្យ៉ាន" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "បាលី" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "​ប៉ូឡូញ" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "ប៉ូណេអ៊ីយ៉ាន" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "​ព័រទុយហ្គាល់" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "ភាសា​ប្រ៉ាក្រិត" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "ប្រ៉ូវ៉ែនកាល់ បុរាណ (ដល់ ១៥០០)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "ពុហ្សតូ" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "កេទ្ជូអា" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "រ៉ាចាសតានិ" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "រ៉ាប៉ានុយអ៊ិ" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "រ៉ារ៉ូតុងហ្គង់" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "រ៉ូម៉ាំង (ផ្សេង​ទៀត)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "រ៉ាអេតូ-រ៉ូម៉ាំង" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "រ៉ូម៉ានី" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "រូម៉ានី" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "រុន្ឌី" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "រុស្ស៊ី" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "រ៉ុងឌី" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "សង់ហ្គោ" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "យ៉ាខឺត" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "ឥណ្ឌា​ខាង​ត្បូង​បែប​អាមេរិក (ផ្សេង​ទៀត)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "ភាសា​សាលីសាន" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "សាម៉ារីតង់ អារ៉ាម៉ាអ៊ិក" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "​សំស្ក្រឹត" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "សាសាក់" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "សង់តាលី" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "សែប៊ី" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "ស៊ីស៊ីល្យ៉ាន" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "ស្កុតថ៍" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "​ក្រូអាត" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "សែលគូប" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "សេម៉ីទិក (ផ្សេង​ទៀត)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "អៀរឡង់ បុរាណ (ដល់ ៩០០)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "ភាសា​សញ្ញា" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "ហ្សាន" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "ស៊ិដាម៉ូ" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "ស៊ីនហាឡា​" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "ភាសា​ស៊ិអួន" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "ស៊ីណូ-ទីបេ (ផ្សេង​ទៀត)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "ស្លាវិក (ផ្សេង​ទៀត)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "ស្លូវ៉ាគី" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "​​​ស្លូវ៉ានី" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "សាម៉ី​ខាង​ត្បូង" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "សាម៉ីខាង​ជើង" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "ភាសា​សាម៉ី (ផ្សេង​ទៀត)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "ឡូលេ សាម៉ី" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "អ៊ិណារី សាម៉ី" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "សាមូអាន" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "ស្កូលថ៍ សាម៉ី" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "សូណា" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "​​ស៊ីន្តី" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "សូណាំងកេ" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "សូដ្យ៊ាន" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "សូម៉ាលី" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "សុងហ្គាយ" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "សូធូ​ខាង​ត្បូង" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "អេស្ប៉ាញ" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "សារឌីនង់" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "សេរឺ" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "នីឡូ-សាហារង់ (ផ្សេង​ទៀត)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "ស្វាទី" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "ស៊ូគុយម៉ា" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "សាន់ដាណេស" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "ស៊ូស៊ូ" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "ស៊ូមេរាន" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "ស្វាហ៊ីលី" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "ស៊ុយអែដ" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "ស៊ីរី" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "តាហិតង់" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "តាអ៊ិ (ផ្សេង​ទៀត)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "តាមីល" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "​​តាតារ" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "តេលូហ្គូ" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "ទីមណេ" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "តេរ៉េណូ" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "តេទូម" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "តាដហ្ស៊ីគីស្តង់" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "តាហ្គាឡូក" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "ថៃ" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "ទីបេ" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "ធីហ្គ្រី" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "ទី​គ្រីនយ៉ា" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "ទីវ" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "ខ្លីង​ហ្កន" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "លីងហ្គីត" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "តាម៉ាហ្សែក" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "តុងហ្គា (និយ៉ាសា)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "តុងហ្គា (កោះ​តុងហ្គា)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "ស៊ីមស្យ៊ាន" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "ស្វាណា" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "សុងហ្កា" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "ទួគមេនីស្តង់" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "ទុមប៊ុយកា" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "ភាសា​ទុយពិ" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "ទួរគី" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "អាល់តាអ៊ិក (ផ្សេង​ទៀត)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "ទ្វី" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "ទុយវីនៀន" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "អ៊ុដម៉ឺត" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "យូហ្គារីទីក" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "វីហ្គៀរ" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "​​​អ៊ុយក្រែន" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "អ៊ូមប៊ុនឌុយ" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "មិន​អាច​កំណត់" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "អ៊ូ​រ្ឌូ" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "អ៊ូហ្សបេគីស្តង់" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "វ៉ាយ" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "វង់ដា" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "វៀតណាម" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "វ៉ូឡាពូក" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "វ៉ូទិក" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "ភាសា​វ៉ាកាហ្សាន" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "វ៉ាឡាម៉ូ" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "វ៉ារ៉ាយ" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "វ៉ាសូ" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "វែល" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "ភាសា​សរប៊ាន" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "វ៉ាឡុង" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "វូឡុហ្វ" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "កាល់មីក" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "ឃសា" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "យ៉ាវ" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "យ៉ាប៉េសេ" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "យីឌីហ្ស" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "យរូបា" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "ភាសា​យូពិក" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "ហ្សាប៉ូតិក" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "ហ្ស៊េណាហ្គា" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "ចួង" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "ហ្សង់ដេ" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "ហ្ស៊ូលូ" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "ហ្ស៊ូនី" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "អំពើ​ខាងក្រោម​នឹង​ត្រូវបាន​ធ្វើ​រួច ៖" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "មិន​ស្គាល់" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "មិន​បានគាំទ្រ" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "កម្រិត ១" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "កម្រិត ២" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "កម្រិត ៣" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "ចាំបាច់​កិច្ចសន្យា​អតិថិជន​បន្ថែម" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "មិន​ត្រឹមត្រូវ" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "កម្រិត​គាំទ្រ​មិន​ត្រូវ​បាន​បញ្ជាក់" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "ក្រុមហ៊ុន​លក់​មិន​បាន​ផ្ដល់​កា​រគាំទ្រ​ទេ ។" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "ការ​កំណត់​បញ្ហា ដែល​មាន​ន័យ​ថា​ការគាំទ្រ​ផ្នែក​បច្ចេកទេស​បាន​រចនា​ដើម្បី​ផ្ដល់​ព័ត៌មាន​​ដែល​ឆប​គ្នា ជំនួយ​ការ​" "ដំឡើង ការ​ប្រើការ​គាំទ្រ និង​ការ​ថែទាំ​ដែល​កំពុង​បន្ត និង​កា​រដោះស្រាយ​បញ្ហា​មូលដ្ឋាន ។ កា​រគាំទ្រ​កម្រិត​មួយ​" "មិនមានបំណង​កែ​កំហុស​ផលិតផល​ឥតខ្ចោះ​ទេ ។" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "ការ​បំបែក​បញ្ហា ដែល​មាន​ន័យ​ថា​ការ​គាំទ្រ​ផ្នែក​បច្ចេកទេស​បាន​រចនា​ដើម្បី​ស្ទួន​បញ្ហា​របស់​អតិថិជន បំបែកបញ្ហា​ " "និង​ផ្ដល់​ដំណោះស្រាយ​សម្រាប់​បញ្ហា​មិន​បាន​ដោះស្រាយ​ដោយ​ការគាំទ្រ​កម្រិត​ពីរ ។" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "ការ​ដោះស្រាយ​បញ្ហា ដែល​មានន័យ​ថា ការ​គាំទ្រ​ផ្នែក​បច្ចេកទេស​បាន​រចនា​ដើម្បី​ដោះស្រាយ​បញ្ហា​ស្មុគស្មាញ " "ដោយ​ភ្ជាប់​វិស្វរកម្ម​នៅ​ក្នុង​ដំណោះស្រាយ​របស់​ផលិតផល​ដែល​ត្រូ​វបាន​បញ្ជាក់​ដោយ​ការ​គាំទ្រ​កម្រិត​ពីរ ។" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "កិច្ចសន្យា​អតិថិជន​បន្ថែម​ចាំបាច់​សម្រាប់​ទទួល​ជំនួយ ។" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "មិន​ស្គាល់​ជម្រើស​គាំទ្រ ។ មិនមាន​សេចក្ដីអធិប្បាយ" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "កា​រគ្រប់គ្រង​ប្រព័ន្ធ​ត្រូវ​បានចាក់​សោ​ដោយ​កម្មវិធី​ដែល​មាន pid %d (%s) ។\n" "សូម​បិទ​កម្មវិធី​នេះ​មុន​នឹង​ព្យាយាម​ម្ដង​ទៀត ។" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "មិន​ស្គាល់​របៀប​ផ្គូផ្គង '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "មិន​ស្គាល់​របៀប​ផ្គូផ្គង '%s' សម្រាប់​លំនាំ '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "កន្សោម​ធម្មតា​មិនត្រឹមត្រូវ '%s' ៖ regcomp បាន​ត្រឡប់ %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "កន្សោម​ធម្មតា​មិន​ត្រឹមត្រូវ '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "បាន​ទាមទារ​ការ​ផ្ទៀងផ្ទាត់​ភាព​ត្រឹមត្រូវ​សម្រាប់ '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "មើល​មជ្ឈមណ្ឌល​អតិថិជន​របស់ Novell ដើម្បីពិនិត្យ​មើល​ថាតើ ការ​ចុះឈ្មោះ​ត្រឹមត្រូវ ហើយមិនបាន​ផុត​កំណត់ ។" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "មិន​អាច​បង្កើត​ថត​ឃ្លាំង​សម្ងាត់​របស់​ទិន្នន័យ​មេតា ។" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "កំហុស​ក្នុង​ការ​ព្យាយាម​អាន​ពី '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "មិន​អាច​បង្កើត​ %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "បាន​បរាជ័យ​ក្នុង​ការ​ឃ្លាំង​ជា​ឃ្លាំង​សម្ងាត់ (%d) ។" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "កំពុង​ស្ថាបនា​ឃ្លាំង '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "មិន​អាច​បង្កើត​ឃ្លាំង​សម្ងាត់​នៅ​ត្រង់​ %s - គ្មាន​សិទ្ធិ​ក្នុង​ការ​សរសេរ ។" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "ប្រភេទ​ឃ្លាំង​ដែល​មិន​បាន​ដោះស្រាយ" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "កំពុង​បន្ថែម​ឃ្លាំង '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "ឈ្មោះ​ឯកសារ​ឃ្លាំង​មិន​ត្រឹមត្រូវ​នៅ '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "មិន​អាច​បើក​ឯកសារ '%s' ដើម្បី​សរសេរ​បានទេ ។" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "មាន​កំហុស​ដែល​មិន​ស្គាល់​ក្នុង​ការ​អាន​ពី '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "បាន​បរាជ័យ​ក្នុង​ការ​អាន​ថត '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "យក​ឃ្លាំង '%s' ចេញ" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "មិន​អាច​ដោះស្រាយ​កន្លែង​ដែល​ឃ្លាំង​ត្រូវ​បាន​ទុក​បានទេ ។" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "មិនអាច​លុប '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "មិនអាច​​ដោះស្រាយ​កន្លែង​ដែល​សេវា​ត្រូវ​បានផ្ទុក​បានទេ ។" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "ឈ្មោះ​ក្លែងក្លាយ​ឃ្លាំង​មិន​អាច​ចាប់​ផ្តើម​ជា​មួយ​ចំណុច (.)បាន​ទេ ។" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "ឈ្មោះ​ក្លែងក្លាយ​សេវាមិន​អាច​​ចាប់​ផ្តើម​​ជាមួយចំណុច ​(.)​បាន​ទេ ។" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "បន្ត ?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "បាត់​គុណលក្ខណៈ​ដែល​ទាមទារ '%s' ។" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "បាន​ទាមទារ​គុណលក្ខណៈ​មួយ ឬ​ពីរ​របស់ '%s' ឬ '%s' ។" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr " បាន​បរាជ័យ​ក្នុងកា​រប្រតិបត្តិ" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "កញ្ចប់ %s ហាក់​បីជា​​ខូច​ក្នុងការ​ផ្ទេរ ។ តើ​អ្នកចង់​ព្យាយាម​ម្ដង​ទៀត​ទេ ?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "បាន​បរាជ័យ​ក្នុងកា​រផ្ដល់​កញ្ចប់ %s ។ តើអ្នក​ចង់​ព្យាយាម​យក​ម្ដង​ទៀត​ទេ ?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "ការ​ពិនិត្យ applydeltarpm បាន​បរាជ័យ ។" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm បាន​បរាជ័យ ។" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "ប្រភេទ​ធនធាន VAR1 មិន​គាំទ្រ​លក្ខណៈ​ពិសេស​បង្ហាញ​ភាពផ្លាស់ប្ដូរ" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "មិនអាច​ផ្ដល់​ឯកសារ '%s' ពី​ឃ្លាំង '%s' បានទេ" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "គ្មាន url នៅ​ក្នុង​ឃ្លាំង ។" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "មិនអាច​បង្កើត sat-pool បានទេ ។" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "បំបែក %s ដោយ​មិនអើពើ​ភាព​អាស្រ័យ​របស់​វា​មួយ​ចំនួន" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "ជា​ទូទៅ​មិនអើពើ​នឹង​ភាព​អាស្រ័យ​មួយ​ចំនួន" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "សំណើ​ការ​ប៉ះទង្គិច" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "បញ្ហា​ភាព​អាស្រ័យ​មួយ​ចំនួន" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 #, fuzzy msgid "unsupported request" msgstr "មិន​បានគាំទ្រ" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "ក្រុមហ៊ុន​ផ្ដល់​ដែល​បាន​លុប ៖ " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "លុបក្រុមហ៊ុនផ្ដល់ ៖ " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "ក្រុមហ៊ុន​លក់​ដែល​អាច​លុបបាន ៖ " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "សំណើ​នេះ​នឹង​ធ្វើ​ឲ្យ​ប្រព័ន្ធ​របស់​អ្នក​ខូច !" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "មិនអើពើ​នឹង​ការ​ព្រមាន​របស់​ប្រព័ន្ធ​ដែល​ខូច" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "ការ​ដំឡើង ត្រូវបាន​បោះបង់​ដោយ​ផ្ទាល់ ។" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " បាន​ប្រតិបត្តិ" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " បាន​បរាជ័យ​ក្នុងកា​រប្រតិបត្តិ" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " ការ​ប្រតិបត្តិ​បាន​រំលង​ខណៈពេល​បោះបង់" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "កំហុស​ក្នុង​ការ​ផ្ញើ​ការ​ជូនដំណឹង​សារបច្ចុប្បន្នភាព​ ។" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "សារ​បច្ចុប្បន្នភាព​ថ្មី" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM បាន​បរាជ័យ ៖ " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "បរាជ័យក្នុង​ការ​នាំចូល​សោ​សាធារណៈ​ពី​ឯកសារ %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "បរាជ័យ​ក្នុងការ​យក​សោ​សាធារណៈ %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "បាន​ប្ដូរ​ឯកសារ​កំណត់​រចនាសម្ព័ន្ធ​សម្រាប់ %s ៖" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm បានរ​ក្សា​ទុក %s ជា %s ប៉ុន្តែ​វា​អាច​កំណត់​ភាព​ខុស​គ្នា" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm បាន​រក្សាទុក %s ជា %s ។\n" "នេះ​ជា​បន្ទាត់ ២៥ ជួរ​ដំបូង​ខុសគ្នា៖\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm បាន​បង្កើត %s ជា %s ប៉ុន្តែ​វា​មិន​អាច​កំណត់​ភាព​ខុស​គ្នា" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm បាន​កំណត់ %s ជា %s ។\n" "នេះ​ជា​បន្ទាត់ ២៥ ជួរ​ដំបូង​ខុសគ្នា ៖​\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "លទ្ធផល rpm បន្ថែម" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "បាន​បង្កើត​ព័ត៌មាន​បម្រុង %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "(មិន​ផុត​កំណត់)" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(មិន​ផុត​កំណត់)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(បាន​ផុត​កំណត់)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(ផុត​កំណត់​ក្នុង​រយៈពេល ២៤ ម៉ោង)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, fuzzy, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(ផុត​កំណត់​ក្នុង​រយៈពេល ២៤ ម៉ោង)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, fuzzy, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "នាំចូល​សោ %s ដែល​មិនមាន​ទៅ​ក្នុង keyring %s" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "បរាជ័យក្នុង​ការ​នាំចូល​សោ​សាធារណៈ​ពី​ឯកសារ %1%" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "បរាជ័យ​ក្នុង​ការ​លុប​សោ ។" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "រក​មិនឃើញ​ឯកសារ​ហត្ថលេខា %s ទេ" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "ប្រភេទ​មិនច្បាស់ '%s' សម្រាប់ %u បៃ ឆេកសាំ '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "មិនអាច​បើក pty (%s) ។" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "មិនអាច​បើក​បំពង់ (%s) ។" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "ខ្សែអក្សរ​សំណួរ LDAP URL មិន​ត្រឹមត្រូវ" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "ប៉ារ៉ាម៉ែត្រ​សំណួរ LDAP URL មិន​ត្រឹមត្រូវ '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "មិនអាច​ក្លូន​វត្ថុ Url បាន​ឡើយ" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "សេចក្ដី​យោង​វត្ថុ Url ទទេ មិន​ត្រឹមត្រូវ" # ############################################################################### # Old yast2-agents.po #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "មិនអាច​ញែក​សមាសភាគ Url បាន​ឡើយ" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "ប្រវត្តិ ៖" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត %s ទេ" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "សមាសភាគ %s មិន​ត្រឹមត្រូវ '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "សមាសភាគ %s មិន​ត្រឹមត្រូវ" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "មិនបាន​គាំទ្រ​ការញែក​ខ្សែអក្សរ​សំណួរ​សម្រាប់ URL នេះ​ឡើយ" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "គ្រោងការណ៍ Url មិនមែន​ជា​សមាសភាគ​ដែល​បាន​ទាមទារ​ឡើយ" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "គ្រោងការណ៍ Url មិន​ត្រឹមត្រូវ '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត​ឈ្មោះ​អ្នកប្រើ​ឡើយ" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត​ពាក្យ​សម្ងាត់​ឡើយ" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "គ្រោងការណ៍ Url ទាមទារ​សមាសភាគ​របស់​ម៉ាស៊ីន" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "គ្រោងការណ៍ Url មិនអនុញ្ញាត​សមាសភាគ​របស់​ម៉ាស៊ីន​ឡើយ" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "សមាសភាគ​របស់​ម៉ាស៊ីន​មិន​ត្រឹមត្រូវ '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "គ្រោងការណ៍ Url មិន​អនុញ្ញាត​ច្រក​ឡើយ" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "សមាសភាគ​ច្រក​មិន​ត្រឹមត្រូវ '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "គ្រោងការណ៍ Url ទាមទារ​ឈ្មោះ​ផ្លូវ" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "មិនបាន​អនុញ្ញាត​ផ្លូវ​ដែល​ទាក់ទង​ទេ ប្រសិន​បើ​មាន​អាជ្ញាធរ" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "ខ្សែអក្សរ​ដែល​បាន​អ៊ិនកូដ មាន NUL បៃ" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "តួអក្សរ​បំបែក​សម្រាប់​ពុះ​អារេ​ប៉ារ៉ាម៉ែត្រ មិន​ត្រឹមត្រូវ" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "តួអក្សរ​បំបែក​សម្រាប់​ពុះ​ផែនទី​ប៉ារ៉ាម៉ែត្រ មិន​ត្រឹមត្រូវ" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "តួអក្សរ​បំបែក​សម្រាប់​ត​អារេ​ប៉ារ៉ាម៉ែត្រ មិន​ត្រឹមត្រូវ" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ​ដោយ​ស្ថានភាព %d ។" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "ពាក្យ​បញ្ជា​ត្រូវ​បាន​ផ្ដាច់​ដោយ​សញ្ញា %d (%s) ។" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "ពាក្យ​បញ្ជា​បាន​ចេញ ដោយ​មាន​កំហុស​មិន​ស្គាល់ ។" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "មិនអាច chroot ទៅ '%s' (%s) បានទេ ។" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "មិនអាច chdir ទៅ '/' ក្នុង chroot (%s) បានទេ ។" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "មិនអាច​ប្រតិបត្តិ '%s' (%s) ។" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "មិនអាច​បែងចែក (%s) បានទេ ។" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "បរាជ័យ​ក្នុង​ការ​ម៉ោន %s លើ %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "បរាជ័យ​ក្នុងការ​អាន់ម៉ោន %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "ឯកសារ​ខូច​ឈ្មោះ ៖ %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "ឧបករណ៍​ផ្ទុក​មិនបាន​បើក នៅពេល​ធ្វើ​អំពើ '%s' ។" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "រក​មិនឃើញ​ឯកសារ '%s' នៅ​លើ​ឧបករណ៍​ផ្ទុក​ទេ '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "មិនអាច​សរសេរ​ឯកសារ '%s' បានទេ ។" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "មិនបាន​ភ្ជាប់​ឧបករណ៍​ផ្ទុក" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "ចំណុច​ភ្ជាប់​ឧបករណ៍​ផ្ទុក​មិនត្រឹមត្រូវ" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "ទាញយក​ការ​ចាប់ផ្ដើម​បាន​បរាជ័យ​សម្រាប់ '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "ករណី​លើកលែង​ប្រព័ន្ធ '%s' នៅលើ​ឧបករណ៍​ផ្ទុក '%s' ។" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "ផ្លូវ '%s' នៅលើ​ឧបករណ៍​ផ្ទុក '%s' មិនមែន​ជា​ឯកសារ​ទេ ។" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "ផ្លូវ '%s' នៅលើ​ឧបករណ៍​ផ្ទុក '%s' មិនមែន​ជា​ថត​ទេ ។" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI មាន​ទ្រង់ទ្រាយ​មិនត្រឹមត្រូវ" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "ឈ្មោះ​ម៉ាស៊ីន​ទទេ​ក្នុង URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "ប្រព័ន្ធ​ឯកសា​ទទេ​នៅ​ក្នុង URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "គោលដៅ​ទទេ​នៅ​ក្នុង URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "គ្រោងការណ៍ URI ដែល​មិនបាន​គាំទ្រ​នៅ​ក្នុង '%s' ។" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "ប្រតិបត្តិការ​មិនបាន​គាំទ្រ​ដោយ​ឧបករណ៍​ផ្ទុក​ទេ" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "ទាញយក​កំហុស​សម្រាប់ '%s' ៖\n" "កូដ​កំហុស ៖ %s\n" "សារ​កំហុស ៖ %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "កំហុស​នៅពេល​កំណត់​ជម្រើស​ទាញយក​សម្រាប់ '%s' ៖" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "ប្រភព​ឧបករណ៍​ផ្ទុក '%s' មិនមាន​ឧបករណ៍​ផ្ទុក​ដែល​ត្រូវការ​ទេ" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "ឧបករណ៍​ផ្ទុក '%s' គឺ​កំពុង​ប្រើ​ដោយ​ឧបករណ៍​ផ្សេង" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "មិនអាច​ច្រាន​ឧបករណ៍​ផ្ទុក​ណាមួយ​ចេញ​ឡើយ" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "មិនអាច​ច្រាន​ឧបករណ៍​ផ្ទុក '%s' ចេញបានទេ" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "សិទ្ធិ​ចូល​ដំណើរការ​ទៅ '%s' បាន​បដិសេធ ។" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "អស់​ពេល​លើល​ពេល​ចូល​ដំណើរការ '%s' ។" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "ទីតាំង '%s' មិន​ដំណើរការ​ជា​បណ្ដោះអាសន្ន ។" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " បញ្ហា​វិញ្ញាបនបត្រ SSL ផ្ទៀងផ្ទាត់​ថា​វិញ្ញាបនបត្រ CA គឺ​ត្រឹមត្រូវ​សម្រាប់ '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "មិនបាន​គាំទ្រ​វិធីសាស្ត្រ​ផ្ទៀងផ្ទាត់​ភាពត្រឹមត្រូវ HTTP '%s' ឡើយ" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "បាទ/ចាស" #: zypp-tui/Table.cc:32 msgid "No" msgstr "ទេ" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "ព្រមាន ៖" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "កំហុស" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "ធ្វើរួច" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "កំហុស" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "ព្រមាន ៖" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "ទៅ​ប្រមូល​យក ៖" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "ចាប់ផ្តើម" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "រក​មិនឃើញ" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "គ្មាន​ជំនួយ​សម្រាប់​ប្រអប់​សំណួរ​នេះ​ទេ ។" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "គ្មាន​ជំនួយ​សម្រាប់​ជម្រើស​នេះ​ទេ" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "បាទ/ចាស" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ទេ" #, fuzzy #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "រក​មិន​ឃើញ​ទិន្នន័យ​មេតា​ដែល​ត្រឹមត្រូវ​នៅ URL ដែល​បាន​បញ្ជាក់" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s មិនមែនជា​របស់​ឃ្លាំង distupgrade នោះ​ទេ" #~ msgid "%s has inferior architecture" #~ msgstr "%s មាន​​​ស្ថាបត្យកម្ម​ទាប​ជាង" #~ msgid "problem with installed package %s" #~ msgstr "បញ្ហា​ជាមួយ​កញ្ចប់​ដែល​បាន​ដំឡើង %s" #~ msgid "nothing provides requested %s" #~ msgstr "គ្មាន​អ្វី​ផ្ដល់ %s ដែលបាន​ស្នើ​ទេ" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "តើ​អ្នក​បាន​បើក​ឃ្លាំង​ដែល​បាន​ស្នើ​ទាំងអស់​ហើយឬនៅ ?" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "មិនមាន​ព័ត៌មាន​បម្រុង​ទុក​ទេ" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s ជាប់សោ និង​មិន​អាច​លុប​បាន​ឡើយ ។" #~ msgid "%s is not installable" #~ msgstr "%s មិនអាច​ដំឡើងបាន" #~ msgid "nothing provides %s needed by %s" #~ msgstr "គ្មាន​អ្វី​ផ្ដល់ %s ដែល​ត្រូវការ​ដោយ %s ទេ" #~ msgid "cannot install both %s and %s" #~ msgstr "មិនអាច​ដំឡើង​ទាំង %s និង %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s ប៉ះទង្គិច​ជាមួយ %s ដែល​បាន​ផ្ដល់​ដោយ %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s លែងប្រើ %s ដែល​ផ្ដល់ដោយ %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s ដែល​បាន​ដំឡើង​លែង​ប្រើ %s ដែល​ផ្ដល់​ដោយ %s ហើយ" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "ការ​ប៉ះទង្គិច %s ដែល​អាច​ដោះស្រាយ​បាន​ជា​មួយ %s ដែល​បាន​ផ្ដល់​ដោយ​ខ្លួន​វា​ផ្ទាល់" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s ត្រូវការ %s ប៉ុន្តែ​តម្រូវការ​នេះ​មិនអាច​ផ្ដល់​បានទេ" #~ msgid "do not install %s" #~ msgstr "កុំ​ដំឡើង %s" #~ msgid "keep %s" #~ msgstr "រក្សា %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "កុំ​ហាម​ការ​ដំឡើង​នៃ %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "កុំ​ស្នើ​ឲ្យ​ដំឡើង​កញ្ចប់​ដោះស្រាយ​ដោយ​ផ្ដល់ %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "កុំ​ស្នើ​ឲ្យ​លុប​កញ្ចប់​ដោះស្រាយ​ទាំងអស់​ដោយ​ផ្ដល់ %s" #~ msgid "do not install most recent version of %s" #~ msgstr "កុំ​ដំឡើង​កំណែ​ថ្មីរបស់ %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "ទុក %s ទោះ​បី​ជា​ស្ថាបត្យកម្ម​ទាប​ក៏​ដោយ" #~ msgid "install %s despite the inferior architecture" #~ msgstr "ដំឡើង %s ទោះ​បីជា​ស្ថាបត្យកម្ម​ទាប​ក៏​ដោយ" #~ msgid "keep obsolete %s" #~ msgstr "លែង​ប្រើ %s" #~ msgid "install %s from excluded repository" #~ msgstr "ដំឡើង %s ពី​ឃ្លាំង​ដែល​បាន​ដក​ចេញ" #~ msgid "downgrade of %s to %s" #~ msgstr "បន្ទាប %s ទៅ %s" #~ msgid "architecture change of %s to %s" #~ msgstr "ការ​ផ្លាស់ប្ដូរ​ស្ថាបត្យកម្ម​នៃ %s ទៅ %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "ដំឡើង %s (ដោយ​មានការ​ផ្លាស់ប្ដូរ​របស់​អ្នក​លក់)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "ការ​ជំនួស %s ជាមួយ %s" #~ msgid "deinstallation of %s" #~ msgstr "ការ​លុប​នៃ %s" #~ msgid "Can't open lock file: %s" #~ msgstr "មិនអាច​បើក​ឯកសារ​សោ ៖ %s" #~ msgid "This action is being run by another program already." #~ msgstr "អំពើ​នេះ កំពុង​រត់​ដោយ​កម្មវិធី​ផ្សេង​មួយ​ទៀត ។" #~ msgid "Hal Exception" #~ msgstr "ការ​លើកលែង Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "សូមអភ័យទោស កំណែ​នៃ​ libzypp នេះ​ត្រូវ​បាន​ស្ថាបនា​ឡើង​ដោយ​គ្មាន​ការ​គាំទ្រ​ HAL ។" #~ msgid "HalContext not connected" #~ msgstr "HalContext មិនបាន​តភ្ជាប់​ឡើយ" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive មិន​បាន​ចាប់ផ្ដើម​ឡើយ" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume មិនបាន​ចាប់ផ្ដើម​ឡើយ" #~ msgid "Unable to create dbus connection" #~ msgstr "មិនអាច​បង្កើត​ការ​តភ្ជាប់ dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new ៖ មិនអាច​បង្កើត​បរិបទ libhal បានឡើយ" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection ៖ មិនអាច​​កំណត់​ការ​តភ្ជាប់ dbus បានឡើយ" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "មិនអាច​ចាប់ផ្ដើម​បរិបទ HAL បានឡើយ -- hald មិន​កំពុង​រត់​ទេឬ ?" #~ msgid "Not a CDROM drive" #~ msgstr "មិន​មែន​ជា​ដ្រាយ​ស៊ីឌី​រ៉ូម​ទេ" #~ msgid "Can't initialize mutex attributes" #~ msgstr "មិនអាច​ចាប់ផ្ដើម​គុណលក្ខណៈ mutex បានឡើយ" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "មិនអាច​កំណត់​គុណលក្ខណៈ mutex ហៅ​ខ្លួនឯង​បានឡើយ" #~ msgid "Can't initialize recursive mutex" #~ msgstr "មិនអាច​ចាប់ផ្ដើម mutex ហៅខ្លួន​ឯង​បាន​ឡើយ" #~ msgid "Can't acquire the mutex lock" #~ msgstr "មិនអាច​យក​សោ mutex បានឡើយ" #~ msgid "Can't release the mutex lock" #~ msgstr "មិនអាច​លែង​សោ mutex បាន​ឡើយ" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "បរាជ័យក្នុង​ការ​នាំចូល​សោ​សាធារណៈ​ពី​ឯកសារ %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "បរាជ័យ​ក្នុងការ​យក​សោ​សាធារណៈ %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "មិន​អាច​រក​ឧបករណ៍​ដែល​មាន​ដើម្បីម៉ោន​ឯកសារ​រូបភាព​ពី '%s'" #~ msgid "do not keep %s installed" #~ msgstr "កុំ​ទុក %s ឲ្យ​នៅ​ដំឡើង" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "មិនអាច​បង្កើត​សោ​សាធារណៈ %s ពី keyring %s ទៅ​ឯកសារ %s បានទេ" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "បានបរាជ័យ​ក្នុងកា​រចាប់ផ្ដើម (Metalink curl) សម្រាប់ '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "កំហុស​ក្នុងការ​ទាញយក (metalink curl) សម្រាប់ '%s' ៖\n" #~ "កូដ​កំហុស ៖ %s\n" #~ "សារ​កំហុស ៖ %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "ការ​ទាញយក​បានផ្អាក​នៅ %d%%" #~ msgid "Download interrupted by user" #~ msgstr "​ទាញយក​អ្វី​ដែលបាន​ផ្អាក​ដោយ​អ្នកប្រើ" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "កំហុស​បានកើតឡើង​ខណៈពេល​កំណត់​​ជម្រើស​ទាញយក (metalink curl) សម្រាប់ '%s' ៖" #~ msgid "Failed to download %s from %s" #~ msgstr "បាន​បរាជ័យ​ក្នុងកា​រទាញយក %s ពី %s" libzypp-17.36.5/po/ko.po000066400000000000000000003754071476576476200150250ustar00rootroot00000000000000# KOREAN message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2000, 2001 SuSE GmbH. # Hwang, Sang-Jin # msgid "" msgstr "" "Project-Id-Version: zypp.ko\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-09-07 03:47+0000\n" "Last-Translator: Joungmin Lee \n" "Language-Team: Korean \n" "Language: ko\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: Weblate 5.7.1\n" "X-Poedit-SourceCharset: UTF-8\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "알 수 없는 국가: " # TextEntry label for phone network Areacode (german Vorwahl) #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "코드 없음" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "안도라" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "아랍에미리트" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "아프가니스탄" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "앤티가 바부다" # AO #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "앙귈라" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "알바니아" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "아르메니아" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "네덜란드령 안틸리스" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "앙골라" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "남극" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "아르헨티나" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "미국령 사모아" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "오스트리아" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "호주" # CU #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "아루바" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "올란드 제도" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "아제르바이잔" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "보스니아 헤르체코비나" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "바베이도스" # BD #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "방글라데시" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "벨기에" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "부르키나파소" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "불가리아" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "바레인" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "부룬디" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "베냉" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "버뮤다" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "브루나이" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "볼리비아" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "브라질" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "바하마" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "부탄" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "부베이 섬" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "보츠와나" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "벨라루스" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "벨리즈" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "캐나다" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "코코스 군도" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "콩고" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "중앙아프리카 공화국" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "스위스" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "코트디부와르" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "쿡 제도" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "칠레" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "카메룬" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "중국" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "콜롬비아" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "코스타리카" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "쿠바" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "카보베르데" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "크리스마스 섬" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "사이프러스" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "체코 공화국" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "독일" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "지부티" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "덴마크" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "도미니카" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "도미니카 공화국" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "알제리" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "에콰도르" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "에스토니아" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "이집트" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "서사하라" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "에리트레아" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "스페인" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "에티오피아" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "핀란드" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "피지" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "포클랜드 제도" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "마이크로네시아" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "파로에 아일랜드" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "프랑스" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "프랑스 본국" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "가봉" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "영국" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "그라나다" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "그루지아" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "파푸아뉴기니" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "건지" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "가나" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "지브롤터" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "그린란드" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "잠비아" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "기니" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "과들루프" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "적도 기니" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "그리스" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "사우스조지아 및 사우스샌드위치 군도" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "과테말라" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "괌" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "기니비사우" # GH #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "가이아나" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "홍콩" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "허드 섬 및 맥도날드 군도" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "온두라스" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "크로아티아" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "아이티" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "헝가리" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "인도네시아" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "아일랜드" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "이스라엘" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "맨 섬" #: zypp/CountryCode.cc:261 msgid "India" msgstr "인도" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "영인도 제도" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "이라크" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "이란" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "아이슬란드" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "이탈리아" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "저지" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "자메이카" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "요르단" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "일본" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "케냐" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "키르기스스탄" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "캄보디아" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "키리바시" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "코모로" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "세인트 크리스토퍼 네비스" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "북한" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "대한민국" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "쿠웨이트" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "케이맨 제도" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "카자흐스탄" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "라오스" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "레바논" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "세인트 루시아" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "리히텐슈타인" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "스리랑카" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "라이베리아" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "레소토" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "리투아니아" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "룩셈부르크" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "라트비아" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "리비아" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "모로코" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "모나코" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "몰도바" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "몬테네그로" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "산마리노" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "마다가스카르" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "마샬 군도" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "마케도니아" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "말리" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "미얀마" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "몽골" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "마카오" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "북마리아나 군도" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "마티니크" # MU # fuzzy #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "모리타니아" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "몬트세라트" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "말타" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "모리셔스" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "몰디브" # ML #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "말라위" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "멕시코" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "말레이시아" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "모잠비크" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "나미비아" # help text for option 'value' #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "뉴 칼레도니아" # NG #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "니제르" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "노퍽 섬" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "나이지리아" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "니카라과" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "네덜란드" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "노르웨이" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "네팔" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "나우루" # table header label #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "니우에" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "뉴질랜드" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "오만" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "파나마" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "페루" # GF # fuzzy #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "프랑스령 폴리네시아" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "파푸아뉴기니" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "필리핀" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "파키스탄" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "폴란드" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "세인트 피에르 미켈론" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "피트카이른" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "푸에르토리코" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "팔레스타인" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "포르투갈" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "팔라우" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "파라과이" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "카타르" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "레위니옹" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "루마니아" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "세르비아" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "러시아 연방" # UG #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "르완다" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "사우디아라비아" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "솔로몬 제도" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "세이셸" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "수단" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "스웨덴" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "싱가포르" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "세인트 헬레나" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "슬로베니아" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "스발바르드 얀마이엔" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "슬로바키아" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "시에라리온" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "산마리노" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "세네갈" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "소말리아" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "수리남" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "상투메 프린시페" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "엘살바도르" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "시리아" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "스와질란드" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "터크스케이커스 제도" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "차드" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "프랑스령 남부 지역" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "토고" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "태국" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "타지크스탄" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "토켈라우" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "투르크메니스탄" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "튀니지" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "통가" # Textentry label - lease time for IPs in the range #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "동티모르" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "터키" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "트리니다드 토바고" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "투발루" # TW # fuzzy #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "대만" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "탄자니아" # "TW" : _("Taiwan R.O.C."), #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "우크라이나" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "우간다" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "미국령 소군도" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "미국" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "우루과이" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "우즈베키스탄" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "바티칸 시국" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "세인트 빈센트 그레나딘스" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "베네수엘라" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "영국령 버진 아일랜드" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "미국령 버진 아일랜드" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "베트남" # src/isdn/interface.ycp:258 src/isdn/lowlevel.ycp:52 #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "바누아투" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "월리스 푸투나" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "사모아" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "예멘" # Combobox - DNS adding zone - Type Master #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "마요티" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "남아프리카공화국" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "잠비아" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "짐바브웨" #: zypp/Dep.cc:96 msgid "Provides" msgstr "제공" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "전제조건" # tree node string #: zypp/Dep.cc:98 msgid "Requires" msgstr "필수" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "충돌" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "폐기사항" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "권장사항" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "제안" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "기능 향상" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "보충" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "알 수 없는 언어: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "아파르어" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "압카즈어" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "아체어" # power saving scheme name, combo box and default contents of text entry #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "아콜리어" # tree node string #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "아당메어" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "아닥헤어" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "아시아-아프리카어(기타)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "아프리히리어" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "아프리칸스어" # entry of bootloader menu - only a-z, A-Z, 0-9, _ and blank space # are allowed, otherwise translartion won't be used # try to keep short, may be shortened due to bootloader limitations #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "아이누어" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "아칸어" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "아카드어" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "알바니아어" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "알류트어" # src/config/proxy.y2cc:21 #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "알곤킨어" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "남부 알타이어" # Combobox item #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "암하라어" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "고대 영어(ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "아파치어" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "아랍어" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "아람어" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "아라곤어" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "아르메니아어" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "아라우칸어" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "아라파호어" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "기계어(기타)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "아라와크어" # src/isdn/complex.ycp:266 src/modem/complex.ycp:207 # src/provider/complex.ycp:186 #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "아샘어" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "아스투리아어" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "아타파스카어" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "호주 언어" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "아바릭어" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "아베스타어" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "아와히어" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "아이마라어" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "아제르바이잔어" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "반다어" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "바미레케어" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "바슈키르어" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "발루치어" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "밤바라어" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "발리어" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "바스크어" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "바사어" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "발트어(기타)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "베자어" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "벨로루시어" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "벰바어" # SN #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "벵골어" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "베르베르어(기타)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "호즈푸리어" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "비하르어" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "비콜어" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "비니어" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "비슬라마어" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "식시카어" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "반투어(기타)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "보스니아어" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "브라어" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "브르타뉴어" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "바타크어(인도네시아)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "부랴트어" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "부기어" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "불가리아어" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "버마어" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "브린어" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "카도어" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "중앙아메리카 인디안어(기타)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "카리브어" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "카탈로니아어" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "카프카스어(기타)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "세부아노어" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "켈트어(기타)" # CM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "차모로어" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "치브차어" # tree node string # tree node string - CPU information #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "체첸어" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "차가타이어" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "중국어" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "츄케스어" # ML #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "마리어" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "치누크 혼합어" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "촉토어" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "치페와이언어" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "체로키어" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "교회슬라브어" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "추바시어" # textentry label # table header 1/2 #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "샤이엔어" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "카믹어" # src/config/routing.y2cc:11 #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "콥트어" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "콘월어" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "코르시카어" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "크레오리스와 피긴스어, 영어 기반(기타)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "크레오리스와 피긴스어, 프랑스어 기반(기타)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "크레오리스와 피긴스어, 포르투갈어 기반(기타)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "크리어" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "크리민 타타르어" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "크레오리스와 피긴스어(기타)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "카슈비아어" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "쿠시어(기타)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "체코어" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "다코타어" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "덴마크어" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "다르그와어" # combo box item #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "다야크어" # src/isdn/complex.ycp:260 #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "델라웨어어" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "슬라브어(아타파스카어)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "도그리브어" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "딩카어" # tree node string - means "hardware driver" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "디베히어" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "도그리어" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "드라비다어(기타)" # combo box item #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "소르비아어(저지)" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "드와라어" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "네덜란드어, 중세(ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "네덜란드어" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "드율라어" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "종카어" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "이픽어" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "이집트어(고대)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "이카죽어" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "엘람어" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "영어" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "영어, 중세(1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "에스페란토어" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "에스토니아어" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "에웨어" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "이원도어" # tree node string #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "팡그어" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "페로스어" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "판티어" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "피지어" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "필리핀어" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "핀란드어" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "피노우그리아어(기타)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "폰어" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "프랑스어" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "프랑스어, 중세(ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "프랑스어, 고대(842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "프리지아어" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "풀라어" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "프리우리안어" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "가어" # GA #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "가요어" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "그바야어" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "독일어(기타)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "그루지아어" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "독일어" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "게이즈어" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "키리바시어" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "게일어" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "아일랜드어" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "갈리시아어" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "맹크스어" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "독일어, 중세 고지(ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "독일어, 고대 고지(ca.750-1050)" # GA #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "곤디어" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "고론탈로어" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "고트어" # GA #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "그리보어" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "그리스어, 고대(1453년까지)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "그리스어, 현대(1453년 이후)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "구아라니어" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "구자라트어" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "그위친어" # src/isdn/complex.ycp:260 #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "하이다어" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "아이티어" # combo box item #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "하우자어" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "하와이어" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "헤브루어" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "헤레로어" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "헤리가뇬어" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "히마차리어" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "힌디어" # HT #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "히타이트어" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "흐몽어" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "히리 모투어" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "소르비아어(고지)" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "헝가리어" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "후파어" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "이반어" # combo box item #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "이그보어" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "아이슬란드어" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "이도어" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "시츄안 이어" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "이조어" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "이눅티투트어" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "인터링게어" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "이로코어" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "국제어(국제보조어협회)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "인도어(기타)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "인도네시아어" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "인도유럽어(기타)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "인귀시어" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "이누피아크어" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "이란어(기타)" # src/config/proxy.y2cc:21 #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "이러쿼이어" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "이탈리아어" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "자바어" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "로반어" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "일본어" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "유대-페르시아어" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "유대-아라비아어" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "카라칼파크어" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "커바일어" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "카친어" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "그린란드어" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "캄바어" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "칸나다어" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "카렌어" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "카슈미르어" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "카누리어" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "카위어" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "카자흐어" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "카바르디어" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "카시어" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "코이산어(기타)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "크메르어" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "코탄스어" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "키쿠유어" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "키냐르완다어" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "키르기스어" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "킴분두어" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "코카니어" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "코미어" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "콩고어" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "한국어" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "코스라이엔어" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "크펠르어" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "카라챠이-발카르어" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "크루어" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "쿠르크어" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "쿠안야마어" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "쿠믹어" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "쿠르드어" # KE #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "쿠터네이어" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "라디노어" # UG #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "라한다어" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "람바어" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "라오어" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "라틴어" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "라트비아어" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "레즈기안어" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "림버거어" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "링갈라어" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "리투아니아어" # CG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "몽고어" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "로지어" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "룩셈부르크어" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "루바-룰루아어" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "루바-카탄가어" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "간다어" # translators: table entry for Listen statements #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "루이세노어" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "룬다어" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "루오어(케냐 및 탄자니아)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "루샤이어" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "마케도니아어" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "마두라어" # src/isdn/interface.ycp:258 src/isdn/lowlevel.ycp:52 #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "마가히어" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "마셜제도어" # ML #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "마이틸리어" # MG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "마카사어" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "말라얄람어" # this string is usually used as headline of a popup # update warning # the user has selected a 64bit partition (x86_64) for update # but booted with the 32bit DVD (x86) # This will replace all 64bit packages with 32bit counterparts. # It is technically possibly but probably not what the user intended. # update warning # the user has selected a 32bit partition on a x86-64 computer for update # but booted with the 64bit DVD (x86-64) # This will replace all 64bit packages with 32bit counterparts. # It is technically possibly but probably not what the user intended. # install warning # the computer system has a 64bit (x86-64) bit processor but # the user booted from a 32bit installation medium #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "만딩고어" # tree node string #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "마오리어" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "오스트로네시아어(기타)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "마라티어" # ML #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "마사이어" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "말레이어" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "모크샤어" # UG #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "만다르어" # According to QIM Screenshot # -ke- #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "멘데어" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "아일랜드어, 중세(900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "미크맥어" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "미낭카바우어" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "기타 언어" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "몬크메르어(기타)" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "마다가스카르어" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "몰타어" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "만주어" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "마니푸리어" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "마노보어" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "모호크어" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "몰다비아어" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "몽골어" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "모시어" # PushButton label #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "다국어" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "문다어" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "크리크어" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "미란다어" # src/isdn/complex.ycp:260 #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "마르와리어" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "마야어" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "엘즈야어" # src/isdn/interface.ycp:258 src/isdn/lowlevel.ycp:52 #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "나우아틀어" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "북아메리카 인디언어" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "나폴리어" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "나바조" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "은데벨레어, 남부" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "은데벨레어, 북부" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "느동가어" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "저지 독일어" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "네팔어" # NP #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "네와르어" # Translators: table column headings #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "니아스어" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "니제르-코르도파니아어(기타)" # Tv frequency table #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "니웨언어" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "뉘노르스크 노르웨이어" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "보크말 노르웨이어" # TO #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "노가이어" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "노르웨이어, 고대" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "노르웨이어" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "소토어, 북부" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "누비안어" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "네와르어(고전)" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "치츄어" # src/isdn/complex.ycp:266 src/modem/complex.ycp:207 # src/provider/complex.ycp:186 #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "니암웨지어" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "니안콜어" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "뉴로어" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "느지마어" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "옥시트어(1500년 이후)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "오지브웨이어" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "오리야어" # User name for user: "root" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "오로모어" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "오세이지어" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "오세티아어" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "터키어, 오스만(1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "오토미안어" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "파푸아어(기타)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "판가시난어" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "팔레비어" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "팜팡가어" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "펀잡어" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "파피아먼토어" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "파라우안어" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "페르시안 고대어(ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "페르시아어" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "필리핀어(기타)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "페니키아어" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "팔리어" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "폴란드어" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "폼페이어" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "포르투갈어" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "프라크리트어" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "프로벤칼어, 고대(1500년까지)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "푸시토어" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "케추아어" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "라자스탄어" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "라파누이어" # src/config/routing.y2cc:11 #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "라로통가어" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "로망스어(기타)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "레토로만어" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "집시어" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "루마니아어" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "룬디어" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "러시아어" # list item #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "산다웨어" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "산고어" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "야큐트어" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "남아메리카 인디언어(기타)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "샐리시어어" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "사마리아 아랍어" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "산스크리트어" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "사사크어" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "산탈리어" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "세르비아어" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "시칠리아어" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "스코틀랜드어" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "크로아티아어" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "셀쿠프어" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "셈어(기타)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "아일랜드어, 고대(900년까지)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "수화" # GH #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "샨어" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "시다모어" # text entry #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "신할라어" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "수족어" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "시노티베트어(기타)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "슬라브어(기타)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "슬로바키아어" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "슬로베니아어" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "남부 사미어" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "북부 사미어" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "사미어(기타)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "룰레 사미어" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "이나리 사미어" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "사모아어" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "스콜트 사미어" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "쇼나어" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "신디어" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "소닌케어" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "소그디엔어" # SO #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "소말리아어" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "송가이족어" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "소토어, 남부" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "스페인어" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "사르디니아어" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "세셀어" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "니로-사하람어(기타)" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "스와티어" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "수쿠마족어" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "순단어" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "수수어" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "수메르어" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "스와힐리어" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "스웨덴어" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "시리아어" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "타히티어" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "태국어(기타)" # tree node string - CPU information #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "타밀어" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "타타르어" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "텔루구어" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "팀니어" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "테레노어" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "테툼어" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "타지크어" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "타갈로그어" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "태국어" # TW # fuzzy #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "티베트어" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "티그레어" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "티그리냐어" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "티비어" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "클링곤어" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "틀링기트어" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "타마섹어" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "통가어(니아사)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "통가어(통가섬)" # combo box entry, networking technology name #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "토크 피신어" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "트심시안어" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "츠와나어" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "총가어" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "투르크멘어" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "툼부카어" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "투피어" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "터어키어" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "알타이어(기타)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "트위어" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "투비니안어" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "우드무르트어" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "유가리틱어" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "위구르어" # "TW" : _("Taiwan R.O.C."), #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "우크라이나어" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "움분두어" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "확인되지 않음" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "우르두어" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "우즈벡어" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "바이어" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "벤다어" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "베트남어" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "볼라퓌크어" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "보틱어" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "와카샨어" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "왈라모어" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "와라이어" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "와쇼어" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "웨일즈어" # src/config/proxy.y2cc:21 #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "소르브어" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "왈론어" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "올로프어" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "칼미크어" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "코사족어" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "야오족어" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "얍페세어" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "이디시어" # CU #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "요루바어" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "야픽어" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "사포테크어" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "제나가어" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "주앙어" # Table header item - DNS listing zones # table header #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "잔데어" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "줄루" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "주니어" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "다음 작업이 수행됨:" # translators: fallback name for a module at command line #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "알 수 없음" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "지원하지 않음" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "단계 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "단계 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "단계 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "추가 고객 계약 필수" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "제공이 중단되어 다른 패키지로 대체되었습니다" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "잘못됨" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "지원 레벨이 지정되지 않았습니다." #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "제조업체에서 지원을 제공하지 않습니다." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Problem determination(문제 결정) - 호환성 정보, 설치 기술 지원, 사용 지원, 지" "속적인 유지보수 및 기본적인 문제해결를 위한 기술 지원을 의미합니다. 레벨 1 지" "원은 제품 결함 오류를 해결하기 위한 지원이 아닙니다." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Problem isolation(문제 격리) - 중복되는 문제, 문제 영역 격리, 그리고 레벨 1 " "지원에서 해결할 수 없는 문제에 대한 해답 제공을 위해 만들어진 기술 지원 서비" "스입니다." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Problem resolution(문제 해결) - 레벨 2 지원에서 식별된 제품 결함을 해결하기 " "위해 엔지니어링 작업을 통해 복잡한 문제를 해결하도록 만들어진 기술 지원 서비" "스입니다." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "지원을 받으려면 추가 고객 계약이 필요합니다." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "이 패키지는 더 이상 제공되지 않고 다른 이름의 새로운 패키지로 대체되었습니다." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "알 수 없는 지원 옵션입니다. 설명을 사용할 수 없습니다." #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "시스템 관리가 응용 프로그램에서 pid %d(%s)과(와) 함께 잠겼습니다.\n" "다시 시도하기 전에 이 응용 프로그램을 닫으십시오." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "알 수 없는 일치 모드 '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "알 수 없는 일치 모드 '%s'(패턴 '%s')" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "잘못된 정규식 '%s': regcomp가 %d을(를) 반환했습니다." #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "잘못된 정규식 '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "'%s'에 대한 인증 필요" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "다시 시도하고 있습니다..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "%1%회 시도 후에 중지합니다." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "SUSE 고객 센터를 방문하여 등록이 올바른지, 등록이 만료되지 않았는지 확인합니" "다." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "등록이 유효하고 만료되지 않았는지 확인하려면 Novell 고객 센터에 문의하십시오." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "연결점 생성: 연결점을 생성할 쓰기 가능한 디렉토리를 찾을 수 없습니다." #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "'lsof' 패키지를 먼저 설치하십시오." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "메타 데이터 캐시 디렉토리를 생성할 수 없습니다." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "'%s'에서 읽기를 시도하는 중에 오류가 발생했습니다." #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "%s을(를) 생성할 수 없음" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "리포지터리 캐싱에 실패했습니다(repo2solv 실행이 불가능합니다)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "리포지토리(%d)를 캐시하지 못했습니다." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "리포지토리 '%s' 캐시 빌드 중" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "%s에서 캐시를 생성할 수 없음 - 쓰기 권한이 없습니다." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "%1% 리포지터리 캐싱에 실패했습니다" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "리포지토리 유형이 처리되지 않았습니다." #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "'%s' 리포지토리 추가 중" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "'%s'에서 리포지토리 파일 이름이 잘못되었습니다." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "쓰기 위한 파일 '%s'을(를) 열 수 없습니다." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "'%s'에서 읽는 중에 알 수 없는 오류가 발생했습니다." #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "리포지토리 디렉토리 '%1%'을(를) 읽을 수 없음: 사용 권한 거부됨" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "디렉토리 '%s'을(를) 읽지 못했습니다." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "리포지토리 파일 '%1%'을(를) 읽을 수 없음: 사용 권한 거부됨" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "메타데이터 정리 중" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "패키지 정리 중" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "캐시 디렉토리 정리 중" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "디렉토리 정리 중: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "캐시 정리 중" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "캐시에서 불러오는 중" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "'%s' 리포지토리 제거 중" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "리포지토리가 저장된 위치를 알 수 없습니다." # Frame title for installation target hard disk / partition(s) #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "'%s'을(를) 삭제할 수 없습니다." #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "서비스가 저장된 위치를 알 수 없습니다." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "알 수 없는 서비스 '%1%': 독립 서비스 리포지토리 '%2%' 제거 중" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "리포지토리 별칭은 점(.)으로 시작할 수 없습니다." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "서비스 별칭은 점(.)으로 시작할 수 없습니다." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "계속하시겠습니까?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "%1% 리포지토리에서 추가 'gpgkey=' URL을 정의하지 않습니다." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "%2% 리포지토리에서 gpg 키 ID %1%을(를) 검색합니다." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "%2% 캐시에서 gpg 키 ID %1%을(를) 검색합니다." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "필수 특성 '%s'이(가) 누락되었습니다." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "'%s' 또는 '%s' 속성 중 하나 또는 둘 다가 필요합니다." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "서명 확인 실패" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "패키지 %s이(가) 전송 중에 손상된 것 같습니다. 다시 검색하시겠습니까?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "패키지 %s을(를) 제공하지 못했습니다. 다시 검색하시겠습니까?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm 검사 실패." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm 실패." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "서비스 플러그인이 특성 변경을 지원하지 않습니다." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "파일 '%s'을(를) 리포지토리 '%s'에서 제공할 수 없습니다." #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "리포지토리에 URL이 없습니다." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "%2%\n" " 패키지의\n" " %1% 파일이\n" " %3%\n" " 패키지의 파일과 충돌합니다." #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "%2%\n" " 패키지의\n" " %1% 파일이\n" " %3%\n" " 설치의 파일과 충돌합니다." #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "%2%\n" " 설치의\n" " %1% 파일이\n" " %3%\n" " 패키지의 파일과 충돌합니다." #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "%2%\n" " 설치의\n" " %1% 파일이\n" " %3%\n" " 설치의 파일과 충돌합니다." #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "%2%\n" " 패키지의\n" " %1% 파일이\n" " %4%\n" " 패키지의\n" " %3%\n" " 파일과 충돌합니다." #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "%2%\n" " 패키지의\n" " %1% 파일이\n" " %4%\n" " 설치의\n" " %3%\n" " 파일과 충돌합니다." #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "%2%\n" " 설치의\n" " %1% 파일이\n" " %4%\n" " 패키지의\n" " %3%\n" " 파일과 충돌합니다." #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "%2%\n" " 설치의\n" " %1% 파일이\n" " %4%\n" " 설치의\n" " %3%\n" " 파일과 충돌합니다." #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "sat-pool을 생성할 수 없습니다." # text is shown in a column of a package list entry #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "일부 종속성을 무시하여 %s을(를) 구분합니다." #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "일부 종속을 일반적으로 무시" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "요청 충돌" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "일부 종속성 문제" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "지원되지 않는 요청" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "삭제된 공급자: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "설치 불가능한 공급자: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "설치할 수 없는 공급자: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "이 요청은 시스템을 손상시킵니다!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "손상된 시스템에 대한 경고를 무시합니다." #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "설치가 지시된 대로 중단되었습니다." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " 실행됨" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " 실행 실패됨" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s이(가) 이미 %s(으)로 실행되었습니다." #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " 중단하는 중 실행 건너뜀" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "업데이트 메시지 알림을 보내는 중에 오류가 발생했습니다." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "새 업데이트 메시지" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM 실패: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "%1% 파일에서 공용 키를 임포트하지 못했습니다." #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "%1% 공용 키를 제거하지 못했습니다." #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" # progress stage #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s에 대한 구성 파일을 변경함:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "RPM은 %s을(를) %s(으)로 저장했지만, 차이점을 구분할 수 없습니다." #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "RPM이 %s을(를) %s(으)로 저장했습니다.\n" "다음은 차이에 대한 처음 25개 행입니다.\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "RPM은 %s을(를) %s(으)로 생성했지만, 차이점을 구분할 수 없습니다." #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "RPM이 %s을(를) %s(으)로 만들었습니다.\n" "다음은 차이에 대한 처음 25개 행입니다.\n" # dialog caption #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "추가 RPM 출력" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "백업 %s을(를) 만들었음" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "서명 정상" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "알 수 없는 서명 유형" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "서명을 확인할 수 없음" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "서명이 정상이지만 키를 신뢰할 수 없음" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "서명 공용 키 사용 불가" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "파일이 존재하지 않거나 서명을 확인할 수 없음" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "파일이 서명되지 않음" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "만료되지 않음" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "만료됨: 1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "만료: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(만료되지 않음)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(만료됨)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(24시간 내 만료)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "%d(24시간 내 만료)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "기존 키 %s을(를) 키링 %s(으)로 임포트하려고 했습니다." #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "키를 임포트하지 못했습니다." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "키를 삭제하지 못했습니다." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "서명 파일 %s을(를) 찾을 수 없습니다." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "모호한 유형 '%s'(%u바이트 체크섬 '%s'에 대해)" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "pty(%s)를 열 수 없습니다." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "파이프(%s)를 열 수 없습니다." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "잘못된 LDAP URL 쿼리 스트링" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "LDAP URL 쿼리 파라미터 '%s'이(가) 잘못되었습니다." #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "URL 객체를 복제할 수 없습니다." #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "빈 URL 객체 참조는 잘못되었습니다." #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "URL 구성요소를 구문 분석할 수 없습니다." #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "이력:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "URL 구성표는 %s을(를) 허용하지 않습니다." #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "%s 구성요소 '%s'이(가) 잘못되었습니다." #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "%s 구성요소가 잘못되었습니다." #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "이 URL에 대해 쿼리 스트링 구문 분석이 지원되지 않습니다." #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL 구성표는 필수 구성요소입니다." #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "URL 구성표 '%s'이(가) 잘못되었습니다." #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "URL 구성표가 사용자 이름을 허용하지 않습니다." #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "URL 구성표가 비밀번호를 허용하지 않습니다." #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "URL 구성표에 호스트 구성요소가 필요합니다." #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "URL 구성표가 호스트 구성요소를 허용하지 않습니다." #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "호스트 구성요소 '%s'이(가) 잘못되었습니다." #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "URL 구성표가 포트를 허용하지 않습니다." #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "포트 구성요소 '%s'이(가) 잘못되었습니다." #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "URL 구성표에 경로 이름이 필요합니다." #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "기관이 있는 경우 상대 경로는 허용되지 않습니다." #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "인코드 스트링에 NUL 바이트가 포함되어 있습니다." #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "파라미터 배열 분할 구분 문자가 잘못되었습니다." #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "파라미터 맵 분할 구분 문자가 잘못되었습니다." #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "파라미터 배열 조인 구분 문자가 잘못되었습니다." #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "상태 %d(으)로 명령이 종료되었습니다." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "명령이 신호 %d(%s)에 의해 종료되었습니다." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "알 수 없는 오류와 함께 명령이 종료되었습니다." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "'%s'(%s)에 대해 chroot할 수 없습니다." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "'%s'(%s)(으)로 chdir할 수 없습니다." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "'%s'(chroot '%s' 내부)(%s)(으)로 chdir할 수 없습니다." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "'%s'(%s)을(를) 실행할 수 없습니다." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "fork(%s)할 수 없습니다." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "%s을(를) %s에 마운트하지 못했습니다." #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "%s을(를) 마운트 해제하지 못했습니다." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "잘못된 파일 이름: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "'%s' 작업을 수행할 때 미디어를 열 수 없습니다." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "'%s' 파일을 '%s' 미디어에서 찾을 수 없습니다." # Frame title for installation target hard disk / partition(s) #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "'%s' 파일을 쓸 수 없습니다." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "미디어가 연결되지 않음" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "잘못된 미디어 연결점" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "'%s'에 대한 다운로드(CURL) 초기화 실패" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "시스템 예외 '%s'이(가) 미디어 '%s'에서 발생했습니다." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "'%s' 경로('%s' 미디어에 있음)가 파일이 아닙니다." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "'%s' 경로('%s' 미디어에 있음)가 디렉토리가 아닙니다." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "잘못된 URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "URI의 호스트 이름이 비어 있습니다." #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "URI의 파일 시스템이 비어 있습니다." #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "URI의 대상이 비어 있습니다." #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "'%s'에서 지원되지 않는 URI 구성표입니다." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "미디어에서 지원되지 않는 작업입니다." #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "'%s'에 대한 다운로드(CURL) 오류:\n" "오류 코드: %s\n" "오류 메시지: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "'%s'에 대한 다운로드(curl) 옵션을 설정하는 동안 오류가 발생했습니다." #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "미디어 소스 '%s'에 원하는 매체가 없습니다." #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "미디어 '%s'이(가) 다른 인스턴스에서 사용 중입니다." #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "미디어를 꺼낼 수 없습니다." # Frame title for installation target hard disk / partition(s) #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "미디어 '%s'을(를) 꺼낼 수 없습니다." #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "'%s' 액세스 권한이 거부되었습니다." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "'%s'에 액세스할 때 제한 시간이 초과되었습니다." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "다운로드한 데이터가 예상 파일 크기 '%s'/'%s'을(를) 초과했습니다." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "위치 '%s'에 일시적으로 액세스할 수 없습니다." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL 인증서 문제, '%s'의 CA 인증서에 문제가 없는지 확인하십시오." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "지원하지 않는 HTTP 인증 방법 '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "예" #: zypp-tui/Table.cc:32 msgid "No" msgstr "아니요" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "참조:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "경고:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "오류:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "완료" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "오류" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "경고: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "검색 중:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "시작 중" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "찾을 수 없음" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "이 프롬프트에 사용 가능한 도움말이 없습니다." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "이 옵션에 사용 가능한 도움말이 없습니다." #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "모든 옵션 표시" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "예" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "아니요" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "지정한 URL에는 유효한 메타데이터가 없음" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "%%posttrans 스크립트 '%1%' 실행 중" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "%posttrans 스크립트 실행 중" #~ msgid "Package is not signed!" #~ msgstr "패키지가 서명되지 않았습니다!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s이(가) 배포 업그레이드 리포지토리에 속해 있지 않습니다." #~ msgid "%s has inferior architecture" #~ msgstr "%s에 하위 아키텍처가 있습니다." #~ msgid "problem with installed package %s" #~ msgstr "설치된 패키지 %s에 문제가 발생했습니다." #~ msgid "nothing provides requested %s" #~ msgstr "요청한 %s이(가) 제공되지 않습니다." #~ msgid "Have you enabled all requested repositories?" #~ msgstr "요청한 모든 리포지토리를 활성화했습니까?" #~ msgid "package %s does not exist" #~ msgstr "%s 패키지가 존재하지 않습니다." #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s은(는) 시스템에서 제공되며 지울 수 없습니다." #~ msgid "%s is not installable" #~ msgstr "%s을(를) 설치할 수 없습니다." #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s(%s에서 필요)이(가) 제공되지 않습니다." # Frame title for installation target hard disk / partition(s) #~ msgid "cannot install both %s and %s" #~ msgstr "%s과(와) %s을(를) 모두 설치할 수 없습니다." #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s이(가) %s(%s에서 제공)과(와) 충돌합니다." #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s이(가) %s(%s에서 제공)을(를) 폐기합니다." #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "설치된 %s이(가) %s(%s에서 제공)을(를) 제거합니다." #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "Solvable %s이(가) 자체적으로 제공된 %s과(와) 충돌합니다." #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s에 %s이(가) 필요하지만, 이 요구사항을 제공할 수 없습니다." #~ msgid "remove lock to allow removal of %s" #~ msgstr "잠금 해제로 %s 제거 허용" # Frame title for installation target hard disk / partition(s) #~ msgid "do not install %s" #~ msgstr "%s 설치 안 함" #~ msgid "keep %s" #~ msgstr "%s 유지" #~ msgid "remove lock to allow installation of %s" #~ msgstr "잠금 해제로 %s 설치 허용" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "%s을(를) 제공하는 solvable 설치를 묻지 않음" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "%s을(를) 제공하는 모든 solvable 삭제를 묻지 않음" #~ msgid "do not install most recent version of %s" #~ msgstr "%s의 최신 버전을 설치하지 않음" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "하위 아키텍처인 경우에도 %s 유지" #~ msgid "install %s despite the inferior architecture" #~ msgstr "하위 아키텍처인 경우에도 %s 설치" #~ msgid "keep obsolete %s" #~ msgstr "구식 %s 유지" #~ msgid "install %s from excluded repository" #~ msgstr "제외된 리포지토리에서 %s 설치" #~ msgid "downgrade of %s to %s" #~ msgstr "%s을(를) %s(으)로 다운그레이드" #~ msgid "architecture change of %s to %s" #~ msgstr "%s에서 %s(으)로 아키텍처 변경" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "%s 설치(벤더 변경)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "%s을(를) %s(으)로 대체" #~ msgid "deinstallation of %s" #~ msgstr "%s 설치 제거" #~ msgid "Can't open lock file: %s" #~ msgstr "잠금 파일 %s을(를) 열 수 없습니다." #~ msgid "This action is being run by another program already." #~ msgstr "이 동작은 이미 다른 프로그램에서 실행 중입니다." #~ msgid "Hal Exception" #~ msgstr "Hal 예외" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "이 버전의 libzypp는 HAL 지원 없이 작성되었습니다." #~ msgid "HalContext not connected" #~ msgstr "HalContext가 연결되지 않았음" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive가 초기화되지 않았음" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume이 초기화되지 않았음" #~ msgid "Unable to create dbus connection" #~ msgstr "dbus 연결을 생성할 수 없음" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: libhal 컨텍스트를 생성할 수 없음" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: dbus 연결을 설정할 수 없음" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "HAL 컨텍스트를 초기화할 수 없습니다. hald가 실행되고 있지 않습니까?" #~ msgid "Not a CDROM drive" #~ msgstr "CD-ROM 드라이브가 아님" #~ msgid "Can't initialize mutex attributes" #~ msgstr "mutex 특성을 초기화할 수 없습니다." #~ msgid "Can't set recursive mutex attribute" #~ msgstr "순환 mutex 특성을 설정할 수 없습니다." #~ msgid "Can't initialize recursive mutex" #~ msgstr "순환 mutex를 초기화할 수 없습니다." #~ msgid "Can't acquire the mutex lock" #~ msgstr "mutex 잠금을 획득할 수 없습니다." #~ msgid "Can't release the mutex lock" #~ msgstr "mutex 잠금을 해제할 수 없습니다." #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "%s 파일에서 공용 키를 임포트하지 못했습니다. %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "%s 공용 키를 제거하지 못했습니다. %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "'%s'에서 이미지 파일을 탑재하기 위해 사용 가능한 루프 장치를 찾을 수 없습" #~ "니다." # Frame title for installation target hard disk / partition(s) #~ msgid "do not keep %s installed" #~ msgstr "%s 의 설치를 그대로 두지 않음" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "공개 키 %s(%s 키링으로 부터)를 %s 파일에 생성 할 수 없음" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "'%s' 에 대한 다운로드 (메타링크 curl) 초기화에 실패" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "'%s' 에 대한 다운로드 (메타링크 curl) 오류 :\n" #~ "오류 코드: %s\n" #~ "오류 메시지: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "다운로드가 중단됨(%d%%)" #, fuzzy #~ msgid "Download interrupted by user" #~ msgstr "다운로드가 중단됨(%d%%)" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "'%s' 에 대한 다운로드 (메타링크 curl) 옵션을 설정 할 때 오류 발생:" #~ msgid "Failed to download %s from %s" #~ msgstr "%s로부터 %s로 다운로드에 실패" #~ msgid "Serbia and Montenegro" #~ msgstr "세르비아 몬테네그로" libzypp-17.36.5/po/ku.po000066400000000000000000003244501476576476200150230ustar00rootroot00000000000000# Copyright © 2009 SUSE Linux Products GmbH. # Kurdish Team , 2009. # msgid "" msgstr "" "Project-Id-Version: memory.ku.po\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2005-09-23 00:15+0200\n" "Last-Translator: Kurdish Team \n" "Language-Team: Kurdish Team \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: Plural-Forms: nplurals=2; plural=n != 1\n" #: zypp/CountryCode.cc:50 #, fuzzy msgid "Unknown country: " msgstr "Vebijêrka nenas: %1" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 #, fuzzy msgid "No Code" msgstr "Kod" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andora" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Mîrtiyên Ereb ên Yekbûyî" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Efxanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Angîla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Arnavût" #. :ALB:008: #: zypp/CountryCode.cc:164 #, fuzzy msgid "Armenia" msgstr "Ermenî" #. :ARM:051: #: zypp/CountryCode.cc:165 #, fuzzy msgid "Netherlands Antilles" msgstr "Holanda" #. :ANT:530: #: zypp/CountryCode.cc:166 #, fuzzy msgid "Angola" msgstr "Mongolî" #. :AGO:024: #: zypp/CountryCode.cc:167 #, fuzzy msgid "Antarctica" msgstr "Bixweber" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Arjantîn" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Awusturya" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Awustralya" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 #, fuzzy msgid "Aland Islands" msgstr "Giravên Kayman" #. :ALA:248: #: zypp/CountryCode.cc:174 #, fuzzy msgid "Azerbaijan" msgstr "Azerbaycanî" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladeş" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belçîka" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaristan" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrayîn" #. :BHR:048: #: zypp/CountryCode.cc:182 #, fuzzy msgid "Burundi" msgstr "Rundî" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermûda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolîvya" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brezîlya" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "" #. :BTN:064: #: zypp/CountryCode.cc:190 #, fuzzy msgid "Bouvet Island" msgstr "Giravên Faroye" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belîze" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 #, fuzzy msgid "Congo" msgstr "Kongoyî" #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "Sûriye" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Swîsre" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" #. :CIV:384: #: zypp/CountryCode.cc:201 #, fuzzy msgid "Cook Islands" msgstr "Giravên Faroye" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Sîlî" #. :CHL:152: #: zypp/CountryCode.cc:203 #, fuzzy msgid "Cameroon" msgstr "Kamera" #. :CMR:120: #: zypp/CountryCode.cc:204 #, fuzzy msgid "China" msgstr "Çînî" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolombiya" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kosta Rîka" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kap Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Girava Noel" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Komara Çek" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Almanya" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Cîbutî" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danîmarka" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Domînîka" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Komara Domînîk" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Cezayîr" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvator" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonya" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Misir" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanya" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Fînlandiya" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fîjî" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Giravên Faroye" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Fransa" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Şahitiya Yekbuyî" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Girava Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gurcistan" #. :GEO:268: #: zypp/CountryCode.cc:236 #, fuzzy msgid "French Guiana" msgstr "Fransî (Kanada)" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Cebelîtariq" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Greenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadelûp" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Yewnanistan" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Hirvatistan" #. :HRV:191: #: zypp/CountryCode.cc:255 #, fuzzy msgid "Haiti" msgstr "Zimanê Haitian" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Macaristan" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Endonezya" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Îrlanda" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Îsraîl" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Girava Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Hindistan" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraq" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Îzlanda" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Îtalya" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamayîka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Urdin" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonya" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts û Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 #, fuzzy msgid "North Korea" msgstr "Amerîkaya Bakur" #. :PRK:408: #: zypp/CountryCode.cc:278 #, fuzzy msgid "South Korea" msgstr "Efrîka Basur" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kûveyt" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Giravên Kayman" #. :CYM:136: #: zypp/CountryCode.cc:281 #, fuzzy msgid "Kazakhstan" msgstr "Qazaxî" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Lubnan" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Lihtenstayn" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lîtvanya" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latviya" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Fas" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "San Marîno" #: zypp/CountryCode.cc:298 #, fuzzy msgid "Madagascar" msgstr "Zimanê Malagasy" #. :MDG:450: #: zypp/CountryCode.cc:299 #, fuzzy msgid "Marshall Islands" msgstr "Giravên Faroye" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonya" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 #, fuzzy msgid "Mongolia" msgstr "Mongolî" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinîk" #. :MTQ:474: #: zypp/CountryCode.cc:307 #, fuzzy msgid "Mauritania" msgstr "Morîtiyus" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Morîtiyus" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Giravên Maldiv" #. :MDV:462: #: zypp/CountryCode.cc:312 #, fuzzy msgid "Malawi" msgstr "Zimanê Malay" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexîko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malezya" #. :MYS:458: #: zypp/CountryCode.cc:315 #, fuzzy msgid "Mozambique" msgstr "Martinîk" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "" #. :NAM:516: #: zypp/CountryCode.cc:317 #, fuzzy msgid "New Caledonia" msgstr "Makedonya" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" #. :NER:562: #: zypp/CountryCode.cc:319 #, fuzzy msgid "Norfolk Island" msgstr "Giravên Faroye" #. :NFK:574: #: zypp/CountryCode.cc:320 #, fuzzy msgid "Nigeria" msgstr "Cezayîr" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nîkaragûa" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Holanda" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norweç" #. :NOR:578: #: zypp/CountryCode.cc:324 #, fuzzy msgid "Nepal" msgstr "Zimanê Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Naûrû" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Nîûe" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Zelandaya Nû" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Uman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Perû" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Fîlîpîn" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polonya" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitkayirn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Porto Rîko" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portekîz" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palawu" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reûnyon" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romanya" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Sirbîstan" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 #, fuzzy msgid "Rwanda" msgstr "Zimanê Banda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Si'ûdî Erebistan" #. :SAU:682: #: zypp/CountryCode.cc:350 #, fuzzy msgid "Solomon Islands" msgstr "Giravên Kayman" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sûdan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Swêd" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Sîngapur" #. :SGP:702: #: zypp/CountryCode.cc:355 #, fuzzy msgid "Saint Helena" msgstr "Saint Lucia" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenya" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakya" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marîno" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" #. :SEN:686: #: zypp/CountryCode.cc:362 #, fuzzy msgid "Somalia" msgstr "Zimanê Somalî" #. :SOM:706: #: zypp/CountryCode.cc:363 #, fuzzy msgid "Suriname" msgstr "Navê Pelê" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 #, fuzzy msgid "Syria" msgstr "Asûrî" #. :SYR:760: #: zypp/CountryCode.cc:367 #, fuzzy msgid "Swaziland" msgstr "Tayland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tayland" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tacîkistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Zimanê Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 #, fuzzy msgid "Turkmenistan" msgstr "Tirkmenî" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tûnis" #. :TUN:788: #: zypp/CountryCode.cc:377 #, fuzzy msgid "Tonga" msgstr "Zimanê Tsonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Tirkiye" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Zimanê Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taywan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrayna" #. :UKR:804: #: zypp/CountryCode.cc:385 #, fuzzy msgid "Uganda" msgstr "Zimanê Banda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 #, fuzzy msgid "United States" msgstr "Mîrtiyên Ereb ên Yekbûyî" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Ozbekîstan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 #, fuzzy msgid "Saint Vincent and the Grenadines" msgstr "Saint Kitts û Nevis" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezûela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 #, fuzzy msgid "Vietnam" msgstr "Vietnamî" #. :VNM:704: #: zypp/CountryCode.cc:396 #, fuzzy msgid "Vanuatu" msgstr "Bi Destan" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayote" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Efrîka Basur" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Peydeker" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Pêwist" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 #, fuzzy msgid "Unknown language: " msgstr "Zimanê Nayê Zanîn:" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Zimanê Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abxazî" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Açînezî" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Akolî" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Zimanê Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Zimanê Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Zimanê Afro-Asyatîk (Yên din)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrîhîlî" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Zimanê Efrîkî" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Zimanê Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Zimanê Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akadî" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanî" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Zimanê Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Zimanên Algonquyî" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altaya Başûrî" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharî" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Îngilîzî, Kevn (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Zimanên Apaçî" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Erebî" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaîkî" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Zimanê Aragonese" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Ermenî" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Arûkanî" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Zimanê Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Zêdehî (Yên din)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawakî" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Zimanê Assamese" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturî" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Zimanên Atapaskanî" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Zimanên Awustralî" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Zimanê Avaric" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestî" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadî" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Zimanê Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaycanî" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Zimanê Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Zimanên Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Zimanê Başkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Beluçî" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Zimanê Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Baliyî" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskî" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Zimanê Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltîk (Yên din)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Zimanê Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Belarusî" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Zimanê Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengalî" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber (Yên din)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Zimanê Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Biharî" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Zimanê Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Zimanê Bînî" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Zimanê Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Zimanê Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (Yên din)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnayî" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Zimanê Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Zimanê Breton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Endonezya)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriatî" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugînî" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarî" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Zimanê Burmese" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Zimanê Blinî" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Zimanê Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 #, fuzzy msgid "Central American Indian (Other)" msgstr "Dravîdî (Yên din)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Zimanê Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalan" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucasian (Yên din)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Zimanê Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Seltîk (Yên din)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Zimanê Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Zimanê Çibça" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Çeçenî" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Zimanê Çaxatay" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Çînî" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Zimanê Çukezî" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Marî" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Zimanê Çînok Cargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Çoktawî" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Çipewyanî" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Çerokî" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Silavîka Dêrê" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Çuvaşî" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Çeyenî" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Zimanên Çamîk" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Kiptî" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornişî" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsîkî" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Zimanê Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tatarî ya Kirimî" #. language code: crp #: zypp/LanguageCode.cc:363 #, fuzzy msgid "Creoles and Pidgins (Other)" msgstr "Dravîdî (Yên din)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kaşûbî" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Kûştîk (Yên din)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Çekî" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Zimanê Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danîmarkî" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Zimanê Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Zimanê Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Zimanê Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Zimanê Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Zimanê Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Zimanê Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehî" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Zimanê Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravîdî (Yên din)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Sorbiya Jêrîn" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Zimanê Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Felemenkî, Navîn (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Felemenkî" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Zimanê Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Zimanê Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Misirî (Kevn)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Zimanê Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Zimanê Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Îngilîzî" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Îngilîzî, Navîn (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonî" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Zimanê Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Zimanê Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Zimanê Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Zimanê Faeroese" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Zimanê Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Zimanê Fijian" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Zimanê Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Fînikî" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finno-Ugrian (Yên din)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Zimanê Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Frensî" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Frensî, Navîn (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Frensî, Kevn (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Zimanê Frisian" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Zimanê Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulyan" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Zimanê Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Zimanê Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Zimanê Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Almanîkî (Yên din)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Gurcî" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Almanî" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Zimanê Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Zimanê Gilbertese" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelî" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Îrlandî" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Zimanê Galisî" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Zimanê Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Almanî, Navîn Bilind (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Almanî, Kevn Bilind (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Zimanê Gondî" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Zimanê Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotîk" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Zimanê Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grekî, Kevnare (heta 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grekî, Nûjen (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guaranî" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gucaratî" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Zimanê Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Zimanê Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Zimanê Haitian" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Zimanê Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawayî" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Îbranî" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Zimanê Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Zimanê Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Zimanê Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindî" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hîtîtî" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Zimanê Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Zimanê Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Zimanê Sorbiana Jorîn" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Macarî" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Zimanê Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Zimanê Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Zimanê Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Zimanê Îzlandî" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Zimanê Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Zimanê Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Zimanê Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Zimanê Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Zimanê Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Zimanê Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Hîndîk (Yên din)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Endonezî" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Hîndo-Ewropa (Yên din)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Zimanê Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Zimanê Inupiak" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Îranî (Yên din)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Zimanên Iraqî" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Îtalyanî" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Cavanezî" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Zimanê Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonî" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Cudî-Farsî" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Cudî-Erebî" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Zimanê Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Zimanê Kabîl" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Zimanê Kaçîn" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Zimanê Kalaallîsut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Zimanê Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannadî" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Zimanê Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kaşmîrî" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanurî" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Zimanê Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Qazaxî" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Zimanê Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Zimanê Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Xosî (Yên din)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Kamboçî" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Xotanezî" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyuyî" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Zimanê Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Qirxizî" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Zimanê Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Zimanê Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komî" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongoyî" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreyî" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosranî" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Zimanê Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karaçay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Zimanê Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Zimanê Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyamî" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Zimanê Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdî" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Zimanê Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Zimanê Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Zimanê Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Zimanê Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Zimanê Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latîn" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvianî" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Zimanê Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Ziman Liburgianisch" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Zimanê Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lîtwanî" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Zimanê Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Zimanê Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgişî" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Zimanê Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Zimanê Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganga" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Zimanê Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Zimanê Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Zimanê Luo (Kenya û Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Zimanê Luşayî" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonî" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurezî" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Zimanê Magahî" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Zimanê Marshallesisch" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maratî" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Zimanê Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Zimanê Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Zimanê Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maorî" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Awustranezî (Yên din)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Maratî" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Zimanê Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Zimanê Malay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Zimanê Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Zimanê Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Zimanê Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Îrîşî, Navîn (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Zimanê Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Zimanê Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Zimanên Cur bi cur" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (Yên din)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Zimanê Malagasy" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Zimanê Maltese" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Zimanê Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipurî" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Zimanên Manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Zimanê Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Zimanê Moldavya" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolî" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Zimanê Mossî" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Zimanên Piranî" #. language code: mun #: zypp/LanguageCode.cc:763 #, fuzzy msgid "Munda languages" msgstr "Zimanên Munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Zimanê Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandezî" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwarî" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Zimanên Mayan" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Zimanê Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Zimanê Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 #, fuzzy msgid "North American Indian" msgstr "Amerîkaya Bakur" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitanî" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Zimanê Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Zimanê Ndebele, Başûr" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Zimanê Ndebele, Bakur" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Zimanê Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Almaniya Jêr" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Zimanê Nepal" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Zimanê Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Zimanê Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Nijer-Kordofanî (Yên din)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Zimanê Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norwecî ya Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norwecî ya Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Zimanê Nogaî" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norzî, Kevn" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norveçkî" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sothoya Bakurî" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Zimanên Nubian" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newariya Klasîk" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Zimanê Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezî" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Zimanê Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Zimanê Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Zimanê Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Ossetî (piştî 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Zimanê Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Zimanê Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Zimanê Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Zimanê Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osetî" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Tirkî, Osmanî (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Zimanên Osmanî" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuanî (Yên din)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangazînanî" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pehlevî" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Zimanê Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Pêncabî" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Zimanê Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Zimanê Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Farisî, Kevn (ca.600-400 P.Z)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Farsî" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Fîlîpînî (Yên din)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fonîcî" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Palî" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polonî" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Fonpeynî" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portekîzî" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Zimanên Prakrît" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provenkal, Kevn (heta 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Puşto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Zimanê Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Racastanî" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanûyî" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotonganî" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romanî (Yên din)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Reto-Romanî" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romî" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romanî" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundî" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rûsî" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sazndawî" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Zimanê Sangro" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakutî" #. language code: sai #: zypp/LanguageCode.cc:911 #, fuzzy msgid "South American Indian (Other)" msgstr "Îranî (Yên din)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Zimanên Salîşî" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Zimanê Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Sirpkî" #. language code: scn #: zypp/LanguageCode.cc:927 #, fuzzy msgid "Sicilian" msgstr "Friulyan" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Zimanê Xirwatî" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 #, fuzzy msgid "Semitic (Other)" msgstr "Seltîk (Yên din)" #. language code: sga #: zypp/LanguageCode.cc:939 #, fuzzy msgid "Irish, Old (to 900)" msgstr "Provenkal, Kevn (heta 1500)" #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "Zimanên Salîşî" #. language code: shn #: zypp/LanguageCode.cc:943 #, fuzzy msgid "Shan" msgstr "Şangay" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sînhala" #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Zimanên Salîşî" #. language code: sit #: zypp/LanguageCode.cc:951 #, fuzzy msgid "Sino-Tibetan (Other)" msgstr "Finno-Ugrian (Yên din)" #. language code: sla #: zypp/LanguageCode.cc:953 #, fuzzy msgid "Slavic (Other)" msgstr "Baltîk (Yên din)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakî" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenî" #. language code: sma #: zypp/LanguageCode.cc:961 #, fuzzy msgid "Southern Sami" msgstr "Samî ya Bakurî" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Samî ya Bakurî" #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "Zimanên Çamîk" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Zimanê Samoan" #. language code: sms #: zypp/LanguageCode.cc:973 #, fuzzy msgid "Skolt Sami" msgstr "Samî ya Bakurî" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Zimanê Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Zimanê Sind" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Zimanê Somalî" #. language code: son #: zypp/LanguageCode.cc:985 #, fuzzy msgid "Songhai" msgstr "Şangay" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Zimanê Sesotho" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spanî" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Zimanê Sardinisch" #. language code: srr #: zypp/LanguageCode.cc:993 #, fuzzy msgid "Serer" msgstr "Zimanê Herero" #. language code: ssa #: zypp/LanguageCode.cc:995 #, fuzzy msgid "Nilo-Saharan (Other)" msgstr "Finno-Ugrian (Yên din)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swatî" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sudanî" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 #, fuzzy msgid "Sumerian" msgstr "Asturî" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Zimanê Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Swêdî" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Asûrî" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Zimanê Tahitî" #. language code: tai #: zypp/LanguageCode.cc:1015 #, fuzzy msgid "Tai (Other)" msgstr "Baltîk (Yên din)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamîlî" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatarî" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Zimanê Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajikî" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalogî" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tayî" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tîbetî" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Zimanê Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 #, fuzzy msgid "Tiv" msgstr "Zimanê Twi" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingonî" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 #, fuzzy msgid "Tonga (Nyasa)" msgstr "Zimanê Tonga (Giravên Toga)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Zimanê Tonga (Giravên Toga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Zimanê Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Zimanê Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Tirkmenî" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "Zimanên Nubian" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Tirkî" #. language code: tut #: zypp/LanguageCode.cc:1073 #, fuzzy msgid "Altaic (Other)" msgstr "Baltîk (Yên din)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Zimanê Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritikî" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Zimanê Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukraynî" #. language code: umb #: zypp/LanguageCode.cc:1089 #, fuzzy msgid "Umbundu" msgstr "Zimanê Kimbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Zimanê Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Ozbekî" #. language code: vai #: zypp/LanguageCode.cc:1097 #, fuzzy msgid "Vai" msgstr "Derbasdar" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Zimanê Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamî" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "Zimanên Salîşî" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Zimanê Welş" #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "Zimanên Nubian" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walloonî" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolofî" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosî" #. language code: yao #: zypp/LanguageCode.cc:1129 #, fuzzy msgid "Yao" msgstr "Zimanê Lao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Eskenazî" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Zimanê Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "Zimanên Nubian" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zimanê Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zimanê Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "nenas" #: zypp/VendorSupportOptions.cc:17 #, fuzzy msgid "unsupported" msgstr "Piştgirî" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 #, fuzzy msgid "invalid" msgstr "URL ya nederbasdar" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 #, fuzzy msgid "Unknown support option. Description not available" msgstr "tu rave tuneye " #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Servîsa '%1' nayê zanîn " #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Derbirîna bi Pergal(an)" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "Pelrêç nayê afirandin" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, fuzzy, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Di nivîsandina pela '%1' de çewtî çêbû" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "%1$s Biafirîne" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 #, fuzzy msgid "Unhandled repository type" msgstr "Çavkaniyê &Çalak Bike" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, fuzzy, c-format, boost-format msgid "Adding repository '%s'" msgstr "Arşîva %1 tê Afirandin" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Pela '%1' nayê vekirin" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Nekarî pelrêça '%1' biafirîne." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "Arşîvan Rake" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Bi rastî bila '%1' jê bibe?" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "Arşîv nederbasdar e." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Bila bidomîne?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "Nivîsandina mîhengan têk çû" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "Çavkanî hilbijêre." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "Pelrêç nayê afirandin" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "Pakêtên nakokiyên wan hene" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 #, fuzzy msgid "unsupported request" msgstr "Piştgirî" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 #, fuzzy msgid "Installation has been aborted as directed." msgstr "Sazkirina di nav Pelrêç de" #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "Bixebitîne" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "Nivîsandina mîhengan têk çû" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Veavakirina IrDA biguherîne" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "Zêdetir vebijark" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "Pel nehat dîtin." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "Pel nehat dîtin." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "Pel nehat dîtin." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "Bikarhêner tuneye." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "Bikarhêner tuneye." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Sepandina delta RPM têk çû" #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Sepandina delta RPM têk çû" #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "Pel nehat dîtin." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "%s nehat vebûn." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Pela %1 nayê vekirin" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 #, fuzzy msgid "Unable to clone Url object" msgstr "&Venebû" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 #, fuzzy msgid "Unable to parse Url components" msgstr "&Venebû" #: zypp-core/base/Exception.cc:186 #, fuzzy msgid "History:" msgstr "Pelrêça Mal:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, fuzzy, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Vebijêrka nederbasdar: %1" #: zypp-core/url/UrlBase.cc:247 #, fuzzy, c-format, boost-format msgid "Invalid %s component" msgstr "Vebijêrka nederbasdar: %1" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 #, fuzzy msgid "Url scheme is a required component" msgstr "Navê bikarhêner pêwist e" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, fuzzy, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Vebijêrka nederbasdar: %1" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, fuzzy, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Vebijêrka nederbasdar: %1" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "%s nehat vebûn." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Jibergirtina %s pêk nehat." #: zypp-media/mediaexception.cc:48 #, fuzzy, c-format, boost-format msgid "Bad file name: %s" msgstr "Navê &pelê:" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Pakêta %1 derdorê nehat dîtin." #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Pela '%1' nayê vekirin" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, fuzzy, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Demê afirandina arşîvê de çewtiyek çêbû." #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 #, fuzzy msgid "Cannot eject any media" msgstr "Nikare cîhazan bibîne." #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Nikare cîhazan bibîne." #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Erê" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Na" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Hişyarî:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Çewtî" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "done" msgstr "Endonezya" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "Çewtî" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Hişyarî:" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 #, fuzzy msgid "Retrieving:" msgstr "Tê rakirin" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Mîheng" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Tu nehat dîtin" #: zypp-tui/output/OutNormal.cc:421 #, fuzzy msgid "No help available for this prompt." msgstr "Tu alîkarî tune ye." #: zypp-tui/output/OutNormal.cc:438 #, fuzzy msgid "no help available for this option" msgstr "Tu alîkarî tune ye" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "erê" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "na" #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "Sazkirina pakêtên hewce pêk nehat." #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Pela %1 tune ye. " #, fuzzy #~ msgid "%s is not installable" #~ msgstr "Saz neke" #, fuzzy #~ msgid "do not install %s" #~ msgstr "Saz neke" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "Sazkirina nivîsbariyê" #, fuzzy #~ msgid "do not install most recent version of %s" #~ msgstr "Ji bo nû ve sazkirina guhertoya cuda" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "kêmkirin" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Moda Sazkirinê" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Pela %1 nayê vekirin" #, fuzzy #~ msgid "Hal Exception" #~ msgstr "Salix" #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "(negirêdayî)" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "Nekarî pelrêça '%1' biafirîne." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "Saz neke" #, fuzzy #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "Demê afirandina arşîvê de çewtiyek çêbû." #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Daxistina delta RPM têk çû: %1" libzypp-17.36.5/po/lt.po000066400000000000000000003561071476576476200150270ustar00rootroot00000000000000# translation of zypp.po to lietuvių # 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. # Andrius Štikonas , 2006, 2007. # Mindaugas Baranauskas , 2009, 2010, 2011, 2013, 2014, 2015, 2016. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-05-16 08:46+0000\n" "Last-Translator: Mindaugas Baranauskas \n" "Language-Team: Lithuanian \n" "Language: lt\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 ? 0 : n%10>=2 && (n%100<10 || n" "%100>=20) ? 1 : n%10==0 || (n%100>10 && n%100<20) ? 2 : 3;\n" "X-Generator: Weblate 5.5.5\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Nežinoma šalis: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Nėra kodo" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andora" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Jungtiniai Arabų Emyratai" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistanas" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antikva ir Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Angilija" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanija" # AM # fuzzy #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armėnija" # AN # fuzzy #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Olandijos Antilai" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarkika" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS # fuzzy #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Šiaurės Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austrija" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australija" # CU # fuzzy #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Alandų salos" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaidžanas" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnija ir Hercogovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbadosas" # BD # fuzzy #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladešas" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgija" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Fasas" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgarija" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahreinas" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundis" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Beninas" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudų" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunėjus Darusalamas" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivija" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazilija" # BS # fuzzy #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamai" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Butanas" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Buvė sala" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botsvana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Gudija" # BZ # fuzzy #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belizas" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosų (Kilingo) salos" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongas" # CF # fuzzy #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Centrinės Afrikos Respublika" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Šveicarija" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Dramblio kaulo krantas" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Kuko salos" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Čilė" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerūnas" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kinija" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbija" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kosta Rika" # CU # fuzzy #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Žaliasis kyšulys" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Kalėdų sala" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Kipras" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Čekijos Respublika" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Vokietija" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Džibutis" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danija" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikos respublika" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alžyras" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvadoras" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estija" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egiptas" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Vakarų Sachara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrėja" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Ispanija" # ET # fuzzy #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopija" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Suomija" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Folklandų salos (Malvinai)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikronezijos Federacinės Valstijos" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Farerų salos" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Prancūzija" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Žemyninė Prancūzija" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabonas" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Jungtinė Karalystė" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gruzija" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Prancūzų Gviana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "" # GH # fuzzy #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltaras" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grenlandija" # GM # fuzzy #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambija" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Gvinėja" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Gvadelupa" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Pusiaujo Gvinėja" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Graikija" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Pietų Džordžija ir Pietų Sandvičo salos" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Gvatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guamas" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Bisau Gvinėja" # GH #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Gajana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Honkongas" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Herdo sala ir Makdonaldo salos" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Hondūras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatija" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haitis" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Vengrija" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonezija" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Airija" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izraelis" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Meno Sala" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indija" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britanijos teritorijos Indijos vandenyne" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irakas" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iranas" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islandija" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italija" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Džersis" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaika" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordanija" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonija" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenija" # KZ # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgiztanas" # KH # fuzzy #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodža" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribatis" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komorai" # KN #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Sent Kitsas ir Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Šiaurės Korėja" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Pietų Korėja" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuveitas" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kaimanų salos" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazachstanas" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laoso Liaudies Demokratinė Respublika" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanas" # LC #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Lichtenšteinas" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Šri Lanka" # LR # fuzzy #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberija" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotas" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lietuva" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Liuksemburgas" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvija" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libija" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokas" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monakas" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Juodkalnija" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Sent Martinas" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskaras" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Maršalo salos" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonija" # ML # fuzzy #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Malis" # MM # fuzzy #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mianmaras" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolija" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Šiaurės Marianų salos" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinika" # MR # fuzzy #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritanija" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montseratas" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauricijus" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldyvai" # MW # fuzzy #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malavis" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksika" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaizija" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambikas" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibija" # NC # fuzzy #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Naujoji Kaledonija" # NG #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Nigeris" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolko salos" # NG # fuzzy #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigerija" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragva" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Olandija" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norvegija" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepalas" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niujė" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Naujoji Zelandija" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omanas" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Prancūzų Polinezija" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Naujoji Gvinėja" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipinai" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistanas" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Lenkija" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Sen Pjeras ir Mikelonas" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Riko" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestinos teritorija" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugalija" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paragvajus" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Kataras" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunionas" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumunija" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbija" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Rusijos Federacija" # RW # fuzzy #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudo Arabija" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Saliamono salos" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seišeliai" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudanas" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Švedija" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapūras" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Šv. Elenos sala" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovėnija" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbardas ir Jan Mayenas" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakija" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Siera Leonė" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marinas" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegalas" # SO # fuzzy #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalis" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinamas" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "San Tomė ir Prinsipė" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Salvadoras" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Sirija" # SZ # fuzzy #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Svazilandas" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Terkso ir Kaiko salos" # TD # fuzzy #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Čadas" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Prancūzų pietinės teritorijos" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togas" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tailandas" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistanas" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmėnistanas" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisas" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tongas" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Rytų Timoras" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkija" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidadas ir Tobagas" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" # TW #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taivanis" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzanija" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" # UG # fuzzy #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM # fuzzy #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Jungtinės Valstijos Mažosios Užjūrio Teritorijos" # US # fuzzy #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Jungtinės Amerikos Valstijos" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Urugvajus" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistanas" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Šventasis Sostas (Vatikano miestas valstybė)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Šv. Vincentas ir Grenadinai" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venesuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britanijos Mergelių salos" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Suomija" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnamas" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Valis ir Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemenas" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Majotas" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Pietų Afrika" # ZM # fuzzy #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambija" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabvė" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Pateikia" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Pirmiau reikalauja" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Reikalauja" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Konfliktuoja" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Pasenę" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Pataria" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Siūlo" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Pagerina" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Papildo" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Nežinoma kalba: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afarų" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abchazų" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Aziatų (Kita)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Būrų" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainų" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akanų" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akadų" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanų" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutų" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Pietų Altajaus" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharų" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Anglų, Senoji (apie 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apačių kalbos" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabų" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramėjų" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armėnų" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Mapudungunų" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Dirbtinė (kita)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Asamų" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturianų" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australijos kalbos" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaidžaniečių" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Baškirų" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balio" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskų" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltų (Kita)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beža" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Gudų" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengalų" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berberų (Kita)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (kita)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnių" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonų" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonezija)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Bugi" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarų" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birmiečių" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Centrinės Amerikos indėnų (Kita)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Karibų" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalonų" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukazo (kita)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltų (Kita)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamoro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Čečėnų" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kinų" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" # ML # fuzzy #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Čerokių" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Bažnytinė slavų" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Čiuvašų" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Šajenas" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptų" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Kornų" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsikiečių" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreolai ir pidginai, anglų k. pagrindu (kiti)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreolai ir pidginai, prancūzų k. pagrindu (kiti)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreolai ir pidginai, portugalų k. pagrindu (kiti)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krymo totorių" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreolai ir pidginai (kiti)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kašubų" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Čekų" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danų" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Deleveras" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidų (kita)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Olandų, Vidurinioji (apie 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Olandų" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egipto (Senovės)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Anglų" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Anglų, Vidurinioji (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estų" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Farerų" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fidži" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipinų" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Suomių" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fino-Ugrų (Kita)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Prancūzų" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Prancūzų, Vidurinioji (apie 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Prancūzų, Senoji (842-apie 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Fryzų" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germanų (Kita)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Gruzinų" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Vokiečių" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gėlų" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Airių" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galų" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotų" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Graikų, senovės (iki 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Graikų, šiuolaikinė (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gudžarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haičio" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Havajiečių" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebrajų" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hetitų" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Vengrų" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Ibanų" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandų" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingua" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Tarptautinė pagalbinės kalbos asociacija)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indų (Kita)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indoneziečių" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoeuropiečių (Kita)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingušų" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iranėnų (kita)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokėzų kalbos" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italų" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javiečių" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonų" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Žydų-persų" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Žydų-arabų" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kačinų" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kašmyro" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakų" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Chmerų" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgizų" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korėjiečių" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdų" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laosiečių" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Lotynų" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvių" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lietuvių" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Liuksemburgiečių" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" # GH # fuzzy #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenija ir Tanzanija)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lušai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonų" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurų" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Maršalų" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maitili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malajalių" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maorių" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marati" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malajų" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Mokša" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Airių, Vidurinioji (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Įvairios kalbos" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-chmerų (kita)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Madagaskaras" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltiečių" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo kalbos" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavų" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolų" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mosi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Kelios kalbos" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda kalbos" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Maruari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Majų kalbos" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Šiaurės Amerikos indėnų" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolio" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, Pietų" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, Šiaurės" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Žemutinė vokiečių" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepalo Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niujiečių" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norvegų Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norvegų Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norvegų, senovės" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norvegų" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Šiaurės Sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubiečių kalbos" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Orija" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osetų" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turkų Osmanų (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomų kalbos" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuasų (Kita)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palau" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persų, Senoji (apie 600-400 pr.m.e)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persų" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipinų (kita)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Finikiečių" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Lenkų" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugalų" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakritų kalbos" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pušto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Kečujų" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romanų (kita)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Reto romanų" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Čigonų" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumunų" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rusų" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandavų" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Jakutų" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Pietų Amerikos indėnų (Kita)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Saramiečių aramėjų" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrito" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbų" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilų" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Škotų" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroatų" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitų (Kita)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Airių, Senoji (iki 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Sign kalbos" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouan kalbos" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibeto (kita)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavų (Kita)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakų" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovėnų" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Pietų Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Šiaurės Sami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Sami kalbos (kita)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalių" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, Pietų" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Ispanų" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardiniečių" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Sererų" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Sacharos (kita)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Svati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sudaniečių" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Šumerų" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Svahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Švedų" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Sirų" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Taičio" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (kita)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamilų" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timnų" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadžikų" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalogų" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tajų" # TW #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibeto" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingonas" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamašekų" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tongas (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tongas (Tonga salos)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tsvana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmėnų" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi kalbos" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turkų" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altajaus (Kita)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Tvi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurtų" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritik" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighurų" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainiečių" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Nenurodyta" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbekų" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamo" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapukų" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votikų" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Vakašan kalbos" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Valamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Varėjų" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Vašo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Valų" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Valonų" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Volofo" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Jao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Japesų" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jidiš" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Joruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Jupikų kalbos" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotekų" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zandų" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Bus atlikti šie veiksmai:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "nežinoma" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nepalaikoma" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "1 lygis" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "2 lygis" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "3 lygis" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Reikalinga papildoma kliento sutartis" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Apleistas ir pakeistas kitu paketu" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "netinkama" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Palaikymo lygis nenurodytas" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Gamintojas nesuteikia palaikymo." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Problemos apibrėžimas, kuris reiškia techninį palaikymą, skirtą pateikti " "suderinamumo informaciją, diegimo pagalbą, naudojimo palaikymą, atvykstančio " "aptarnavimo ir pagrindinių nesklandumų šalinimo. 1 lygio palaikymas nesiekia " "taisyti pačio produkto klaidų." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Problemos izoliavimas, kuris reiškia techninį palaikymą, skirtą dubliuoti " "klientų problemas, izoliuoti problemos sritis ir pateikti problemų " "sprendimus, kurių neišsprendė 1 lygio palaikymas." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Problemos sprendimas, kuris reiškia techninį palaikymą, skirtą spręsti " "kompleksines problemas, užsiimant produkto defektais, tapatinamas su 2 lygio " "palaikymu." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Norint gauti palaikymą, reikalinga papildoma kliento sutartis." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "Šis paketas apleistas, jį pakeitė kitas naujas paketas kitu vardu." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Nežinomo palaikymo parinktis. Aprašas neprieinamasq" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Sistemos tvarkytuvę užrakino programa, kurios pid %d (%s).\n" "Užverkite šią programą ir bandykite iš naujo." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Nežinoma atitikmens veiksena „%s“" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Nežinoma atitikmens veiksena „%s“ šablonui „%s“" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Netinkamas reguliarusis reiškinys „%s“: regcomp grąžino %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Netinkamas reguliarusis reiškinys „%s“" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "%s reikalauja autentifikacijos" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Bandysima iš naujo..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Pasiduota po nesėkmingų bandymų (%1%)." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Apsilankykite SUSE klientų centre ir patikrinkite, ar jūsų registracija yra " "tinkama ir galioja." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Apsilankykite Novell klientų aptarnavimo centre ir sužinosite, ar Jūsų " "registracija dar nėra pasibaigusi." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Sukurti prijungimo vietą: nepavyksta prijungimo vietai rasti katalogo, " "kuriame būtų galima rašyti" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Pirmiausia įdiekite „lsof“ paketą." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Nepavyko sukurti metaduomenų podėlio katalogo." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Klaida bandant nuskaityti „%s“" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Nepavyksta sukurti %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Nepavyko įkelti į saugyklų podėlį (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Kuriamas saugyklos „%s“ podėlis" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Nepavyksta sukurti podėlio ties %s - nepakanka teisių." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Nesutvarkytas saugyklos tipas" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Pridedama saugykla „%s“" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Netinkamas saugyklos pavadinimas „%s“" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Nepavyksta atverti rinkmenos „%s“ įrašymui." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Nežinoma klaida skaitant iš „%s“" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Nepavyko perskaityti katalogo „%1%“: nepakanka leidimų" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Nepavyko nuskaityti katalogo „%s“" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Nepavyko perskaityti rinkmenos „%1%“: nepakanka leidimų" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Pašalinama saugykla „%s“" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Nepavyksta nustatyti, kur patalpinta ši saugykla" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Nepavyksta pašalinti „%s“" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Nepavyksta nustatyti, kur patalpinta ši paslauga" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Nežinoma paslauga „%1%“: pašalinama nebereikalinga paslaugų saugykla „%2%“" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Saugyklos pseudonimas negali prasidėti tašku." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Paslaugos pseudonimas negali prasidėti tašku." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Nėra %s rinkmenos santraukos." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Rinkmenai %s santrauka %s yra nežinoma." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Rinkmenos „%s“ santraukos patikrinimo klaida" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Rinkmena „%s“ nėra pasirašyta. Tęsti?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Rinkmena „%s“ iš „%s“ saugyklos nėra pasirašyta. Tęsti?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Atmesti raktą, raktu pasitikėti laikinai ar pasitikėti visada?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Rakto vardas: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "Iš „%2%“ saugyklos gautas %1% naujas paketų pasirašymo raktas:" msgstr[1] "Iš „%2%“ saugyklos gauti %1% naujas paketų pasirašymo raktai:" msgstr[2] "Iš „%2%“ saugyklos gauta %1% naujas paketų pasirašymo raktai:" msgstr[3] "Iš „%2%“ saugyklos gautas %1% naujas paketų pasirašymo raktas:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Tęsti?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "Rinkmena „%s“ iš „%s“ saugyklos pasirašyta nežinomu raktu „%s“. Tęsti?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Saugykla „%1%“ nenurodo papildomų „gpgkey=“ URL adresų." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "%2% saugykloje ieškoma GPG rakto su ID %1%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "%2% padėlyje ieškoma GPG rakto su ID %1%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Trūksta reikiamo atributo „%s“." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Reikia vieno ar abiejų, „%s“ ar „%s“ atributų." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Nepavyko patikrinti parašo" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Regis paketas %s buvo sugadintas perdavimo metu. Ar norėtumėte jį gauti iš " "naujo?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Nepavyko pateikti paketo %s. Ar norėtumėte bandyti jį gauti iš naujo?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm patikrinti nepavyko." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm nepavyko." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Paslaugos papildinys nepalaiko atributų keitimo." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Nepavyksta pateikti rinkmenos „%s“ iš saugyklos „%s“" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Saugykloje nėra url." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Tikėtasi rasti laikmeną %1%/%2%, kuri identifikuojama pagal rinkmeną „%3%“ " "su turiniu:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Rinkmena %1% ,\n" " esanti pakete\n" " %2% ,\n" " konfliktuoja su rinkmena, esančia pakete\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Rinkmena %1%\n" " iš paketo\n" " %2%\n" " konfliktuoja su rinkmena iš\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Rinkmena %1%\n" " iš\n" " %2%\n" " konfliktuoja su rinkmena iš paketo\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Rinkmena %1%\n" " iš\n" " %2%\n" " su rinkmena iš\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Rinkmena %1%\n" " iš paketo\n" " %2%\n" " konfliktuoja su rinkmena\n" " %3%\n" " iš paketo\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Rinkmena %1%\n" " iš paketo\n" " %2%\n" " konfliktuoja su rinkmena\n" " %3%\n" " iš\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Rinkmena %1%\n" " iš\n" " %2%\n" " konfliktuoja su rinkmena\n" " %3%\n" " iš paketo\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Rinkmena %1%\n" " iš\n" " %2%\n" " konfliktuoja su rinkmena\n" " %3%\n" " iš\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "nepaisyti kai kurių priklausomybių ir taip sugadinti %s " #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "apskritai ignoruoti kai kurias priklausomybes" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "įdiegtasis %1% nepriklauso „distupgrade“ saugyklai ir jį būtina pakeisti" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "įdiegtinas %1% nepriklauso „distupgrade“ saugyklai" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "įdiegtasis %1% yra žemesnės architektūros" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "įdiegtinas %1% yra žemesnės architektūros" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "nesklandumai su įdiegtu %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "konfliktuojantys reikalavimai" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "kai kurių priklausomybių problema" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "niekas nepateikia prašomo „%1%“" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Ar įgalinote visas reikalingas saugyklas?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "nepavyko rasti prašomo %1% paketo" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "nepalaikoma užklausa" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "kadangi sistema pateikia „%1%“, tad jo pašalinti negalima" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% neįmanoma įdiegti" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "niekas nepateikia „%1%“, kuris reikalingas įdiegtam %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "niekas nepateikia „%1%“, kuris reikalingas įdiegtinam %2%" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "negalima %1% ir %2% vienu metu" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "įdiegtasis %1% konfliktuoja su %2%, kurį pateikia įdiegtasis %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "įdiegtasis %1% konfliktuoja su %2%, kurį pateikia įdiegtinas %3%" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "įdiegtinasis %1% konfliktuoja su %2%, kurį pateikia įdiegtasis %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "įdiegtinasis %1% konfliktuoja su „%2%“, kurį pateikia įdiegtinasis %3%" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "įdiegtasis %1% pakeičia pasenusį „%2%“, kurį pateikė įdiegtasis %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "įdiegtasis %1% pakeičia pasenusį „%2%“, kurį pateikia įdiegtinasis %3%" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "įdiegtinasis %1% pakeičia pasenusį „%2%“, kurį pateikė įdiegtasis %3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "įdiegtinasis %1% pakeičia pasenusį „%2%“, kurį pateikia įdiegtinasis %3%" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "įdiegtasis %1% konfliktuoja su „%2%“, kurį jis pats pateikia" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "įdiegtinasis %1% konfliktuoja su „%2%“, kurį jis pats pateikia" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "įdiegtasis %1% reikalauja „%2%“, bet šio reikalavimo neįmanoma patenkinti" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "įdiegtinasis %1% reikalauja „%2%“, bet šio reikalavimo neįmanoma patenkinti" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "pašalinti galimi pasiūlymai: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "netinkami įdiegti pasiūlymai: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "netinkami diegimui pasiūlymai: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% dar nėra pilnai suderinamas su %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Norimo veiksmo atlikti neleidžia įdiegtasis %1%." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "atrakinti ir leisti pašalinti %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "neįdiegti %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "išlaikyti %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "atrakinti ir leisti įdiegti %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Šis veiksmas sugadins jūsų sistemą!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "nepaisyti perspėjimų apie riziką sugadinti sistemą" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "nesiūlyti įdiegimo sprendimo, kuris pateikia %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "nesiūlyti pašalinimo sprendimų, kurie pateikia %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "nediegti naujausios %1% versijos" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "išlaikyti %1% nepaisant žemesnės architektūros" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "įdiegti %1% nepaisant žemesnės architektūros" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "išlaikyti pasenusį %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "įdiegti %1% iš neįtrauktos saugyklos" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "įdiegti %1%, nors jis atšauktas" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "įdiegti %1%, nors jis yra juodajame sąraše" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "%1% pakeisti senesniu %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "%1% architektūros pakeitimas į %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "įdiegti %1% (keičiant gamintoją)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "įdiegti %1% iš gamintojo %2%\n" " pakeičiant %3% iš gamintojo %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "pakeisti %1% į %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "pašalinti %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Vykdomi potransakciniai scenarijai" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Vykdomas %1% scenarijus" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "%1% scenarijus grąžino:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Diegimas buvo nutrauktas pagal nurodymą." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " įvykdyta" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " įvykdyti nepavyko" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s jau įvykdytas kaip %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " nutraukiant vykdymas sustabdytas" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Siunčiant atnaujinimo pranešimą įvyko klaida." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Naujas atnaujinimo pranešimas" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Transakcijos atlikti nepavyko, iškilo nesklandumų:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM klaida:" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Nepavyko įkelti viešojo rakto %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Nepavyko pašalinti viešojo rakto %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Pakeistos %s konfigūracijos rinkmenos:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm išsaugojo %s kaip %s, bet neįmanoma nustatyti skirtumo" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm išsaugojo %s kaip %s.\n" "Pateikiamos pirmosios 25 skirtumų eilutės:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm sukūrė %s kaip %s, bet neįmanoma nustatyti skirtumo" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm sukūrė %s kaip %s.\n" "Pateikiamos pirmosios 25 skirtumų eilutės:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Papildoma rpm išvestis" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "padaryta %s atsarginė kopija" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Parašas geras" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Nežinomo tipo parašas" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Parašas nepatikrinamas. " #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Parašas geras, bet raktas nepatikimas" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Paašo viešasis raktas neprieinamas" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Nėra rinkmenos arba negalima patikrinti parašo" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Rinkmena nepasirašyta" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "nesibaigiantis" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "baigėsi: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "baigiasi: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(galiojimas nepasibaigia)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(NEBEGALIOJA)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(baigsis per 24 valandas)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(baigsis po %d d.)" msgstr[1] "(baigsis po %d d.)" msgstr[2] "(baigsis po %d d.)" msgstr[3] "(baigsis po %d d.)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Mėginta importuoti neegzistuojantį raktą %s į raktinę %s" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Nepavyko įkelti viešojo rakto %1%" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Rakto nepavyko pašalinti." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Parašo rinkmena %s nerasta" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Abejotinas tipas „%s“, skirtas %u bitų kontrolinei santraukai „%s“" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Nepavyksta atverti pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Nepavyksta atverti kanalo (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Netinkama LDAP URL užklausos eilutė" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Netinkamas LDAP URL užklausos parametras „%s“" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Nepavyksta klonuoti Url objekto" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Netinkama tuščio URL objekto nuoroda" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Nepavyksta išnagrinėti Url komponentų" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Istorija:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url schema neleidžia %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Netinkamas %s komponentas „%s“" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Netinkamas %s komponentas" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Užklausos eilutės nagrinėjimas nepalaikomas šiam URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url schema yra reikalingas komponentas" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Netinkama Url schema „%s“" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url schema neleidžia naudotojo vardo" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url schema neleidžia slaptažodžio" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url schemai reikia kompiuterio komponento" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url schema neleidžia kompiuterio komponento" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Netinkamas kompiuterio komponentas „%s“." #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url schema neleidžia prievado" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Netinkamas prievado komponentas „%s“" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url schema reikalauja kelio pavadinimo" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Santykinis kelias neleidžiamas, jei naudojamas tapatybės nustatymas" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Komanda baigta būsenoje %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Komanda nutraukta naudojant signalą %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Komanda pasibaigė su nežinoma klaida." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Nepavyksta keisti pakeisti aplanko į „%s“ (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Nepavyksta įvykdyti „%s“ (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Nepavyko įvykdyti „%s“ (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Nepavyko įvykdyti „%s“, netikėta klaida." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Nepavyko prijungti %s prie %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Nepavyko atjungti %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Netinkamas rinkmenos pavadinimas: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Laikmena nebuvo atidaryta, kai bandyta atlikti veiksmą „%s“." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Rinkmena „%s“ nerasta laikmenoje „%s“" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Nepavyksta įrašyti rinkmenos „%s“." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Laikmena neįdėta" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Netinkama laikmenos prijungimo vieta" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "„%s“ parsiuntimo (curl) iniciacijuoti nepavyko.." #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Sistemos išimtis „%s“ laikmenoje „%s“." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Kelias „%s“ laikmenoje „%s“ nėra rinkmena." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Kelias „%s“ laikmenoje „%s“ nėra katalogas." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Blogai suformuluotas URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Tuščias pagrindinio kompiuterio vardas URL adrese" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "URL adrese tuščia rinkmenų sistema" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "URL adrese tuščia paskirtis" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Nepalaikoma URL schema „%s“." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Laikmena nepalaiko šios operacijos" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "„%s“ parsiuntimo (curl) klaida:\n" "Klaidos kodas: %s\n" "Klaidos pranešimas: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Laikmenos šaltinis „%s“ neturi norimos laikmenos" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Laikmeną „%s“ naudoja kita programa" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Nepavyksta išmesti jokios laikmenos" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Nepavyksta išmesti laikmenos „%s“" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Priėjimas prie „%s“ uždraustas." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Per ilgai jungiamasi prie „%s“." #: zypp-media/mediaexception.cc:197 #, fuzzy, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Parsisiųstų duomenų dydis viršijo manytą rinkmenos dydį „%s“ iš „%s“." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Vieta „%s“ laikinai nepasiekiama." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " SSL liudijimo problema, patikrinkite liudijimų įstaigos tvarkingumą „%s“." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Nėra laisvų išteklių pridėtoje laikmenoje." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Nepalaikomas HTTP tapatybės nustatymo būdas „%s“" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Klaida su curl parsisiunčiant „%s“:\n" "Klaidos kodas: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Klaida su curl parsisiunčiant „%s“:\n" "Nepavyko gauti HTTP atsako\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Taip" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ne" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Pastaba:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Įspėjimas:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Klaida:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "atlikta" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "dėmesio" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "klaida" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Įspėjimas: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Gaunama:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "paleidžiama" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "nerasta" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Čia pagalba neprieinama." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "šiaip parinkčiai paaiškinimo nėra" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "rodyti visas parinktis" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "taip" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ne" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Nurodytu URL nerasta tinkamų meta duomenų" #~ msgstr[1] "Nurodytuose URL nerasta tinkamų meta duomenų" #~ msgstr[2] "Nurodytuose URL nerasta tinkamų meta duomenų" #~ msgstr[3] "Nurodytuose URL nerasta tinkamų meta duomenų" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "" #~ "%s nepriklauso platinamojo paketo naujovinimo (distupgrade) saugyklai" #~ msgid "%s has inferior architecture" #~ msgstr "%s yra kitos architektūros" #~ msgid "problem with installed package %s" #~ msgstr "problema su įdiegtu paketu %s" #~ msgid "nothing provides requested %s" #~ msgstr "niekas nepateikia reikalaujamo %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Ar įgalinote visas reikiamas saugyklas?" #~ msgid "package %s does not exist" #~ msgstr "paketo %s nėra" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s pateikia sistema, jo negalima pašalinti" #~ msgid "%s is not installable" #~ msgstr "%s neįdiegiamas" #~ msgid "nothing provides %s needed by %s" #~ msgstr "niekas nepateikia %s, kurio reikalauja %s" #~ msgid "cannot install both %s and %s" #~ msgstr "negalima įdiegti ir %s, ir %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s konfliktuoja su %s, kurį pateikia %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s pakeičia %s, kurį pateikė %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "įdiegtas %s pakeičia %s, kurį pateikė %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "sprendinys %s konfliktuoja su %s, kurį pats siūlo" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s reikalauja „%s“, bet reikalavimo negalima išpildyti" #~ msgid "remove lock to allow removal of %s" #~ msgstr "nedrausti pašalinti %s" #~ msgid "do not install %s" #~ msgstr "neįdiegti %s" #~ msgid "keep %s" #~ msgstr "išlaikyti %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "nedrausti įdiegti %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "neprašyti įdiegti sprendinių, kuriuos siūlo %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "neprašyti pašalinti visų sprendinių, kuriuos siūlo %s" #~ msgid "do not install most recent version of %s" #~ msgstr "neįdiegti pačios naujausios %s versijos" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "išlaikyti %s, nors yra kitos architektūros" #~ msgid "install %s despite the inferior architecture" #~ msgstr "įdiegti %s, nors yra kitos architektūros" #~ msgid "keep obsolete %s" #~ msgstr "išlaikyti pasenusį %s" #~ msgid "install %s from excluded repository" #~ msgstr "įdiegti %s iš neįtrauktos saugyklos" #~ msgid "downgrade of %s to %s" #~ msgstr "pasendinti nuo %s iki %s" #~ msgid "architecture change of %s to %s" #~ msgstr "pakeisti architektūrą iš %s į %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "įdiegti %s (keičiant gamintoją)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "%s pakeisti į %s" #~ msgid "deinstallation of %s" #~ msgstr "pašalinti %s " #~ msgid "Can't open lock file: %s" #~ msgstr "Nepavyksta atverti užrakintos rinkmenos: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Šį veiksmą jau paleido kita programa." #~ msgid "Hal Exception" #~ msgstr "Hal išimtis" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Atleiskite, ši libzypp versija sukompiliuota su HAL palaikymu." #~ msgid "Unable to create dbus connection" #~ msgstr "Nepavyksta sukurti dbus ryšio" #~ msgid "Not a CDROM drive" #~ msgstr "Tai ne CD nuskaitymo įrenginys" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Nepavyko įkelti viešojo rakto iš rinkmenos %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Nepavyko pašalinti viešojo rakto %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Nepavyko rasti ciklinio įrenginio , prie kurio prijungtume atvaizdį iš " #~ "„%s“" #~ msgid "do not keep %s installed" #~ msgstr "nesistengti išlaikyti įdiegto %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "Nepavyksta sukurti viešojo rakto %s iš %s raktinės į rinkmeną %s" #~ msgid "Download interrupted at %d%%" #~ msgstr "Parsiuntimo pertrūkis ties %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Parsiuntimą nutraukė naudotojas" #~ msgid "Failed to download %s from %s" #~ msgstr "Nepavyko parsiųsti %s iš %s" libzypp-17.36.5/po/mk.po000066400000000000000000003224321476576476200150110ustar00rootroot00000000000000# 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: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2023-05-29 06:14+0000\n" "Last-Translator: Kristijan Fremen Velkovski \n" "Language-Team: Macedonian \n" "Language: mk\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: Weblate 4.9.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Непозната држава: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Без код" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Андора" # US # fuzzy #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Соединети Американски Држави" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Афганистан" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Антигва и Барбуда" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Ангила" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Албанија" # AM # fuzzy #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Арменија" # AN # fuzzy #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Ангола" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Антарктика" # AR #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Аргентина" # AS # fuzzy #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Америчка Самоа" # AT #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Австрија" # AU #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Австралија" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Аруба" # FO # fuzzy #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Оландски Острови" # AZ # fuzzy #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Српски" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" # BB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Барбадос" # BD # fuzzy #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Англиска" # BE #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Белгија" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Буркина Фасо" # BG #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Бугарија" # BH # fuzzy #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Бразил" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Бурунди" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Бенин" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Бермуда" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Брунеј" # BO #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Боливија" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Бразил" # BS # fuzzy #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Панама" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Бутан" # FO # fuzzy #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Остров Буве" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Боцвана" # BY # fuzzy #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Бретонски" # BZ # fuzzy #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Белгија" # CA #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Канада" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Кокосови Острови" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Конго" # CF # fuzzy #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Доминиканска Република" # CH #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Швајцарија" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Брег на Слоновата Коска" # FO # fuzzy #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Кукови Острови" # CL #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Чиле" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Камерун" # CN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Кина" # CO # fuzzy #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Колумбија" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Коста Рика" # CU # fuzzy #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Колумбија" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Зелен ’Рт" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Божиќен Остров" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Кипар" # CZ # fuzzy #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Доминиканска Република" # DE #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Германија" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Џибути" # DK #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Данска" # DM # fuzzy #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Романија" # DO #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Доминиканска Република" # DZ # fuzzy #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Бугарија" # EC # fuzzy #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Еквадор" # EE #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Естонија" # EG # fuzzy #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Енергија" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Западна Сахара" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Еритреја" # ES #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Шпанија" # ET # fuzzy #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Естонија" # FI #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Финска" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Фиџи" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Фолкландските Острови (Малвини)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Сојузни Држави на Микронезија" # FO # fuzzy #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Ирска" # FR #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Франција" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Метрополитна Франција" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Габон" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Обединето Кралство" # GD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Гренада" # GE # fuzzy #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Србија" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Француска Гвајана" # DE #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Гернзи" # GH # fuzzy #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Кина" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Гибралтар" # GL # fuzzy #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Гренада" # GM # fuzzy #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Јамајка" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Гвинеја" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Гваделуп" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Екваторска Гвинеја" # GR #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Грција" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Јужна Џорџија и Јужни Сендвички Острови" # GT #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Гватемала" # GU # fuzzy #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Гватемала" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Гвинеја-Бисао" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Гвајана" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Хонгконг" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Остров Херд и Острови МекДоналд" # HN #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Хондурас" # HR #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Хрватска" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Хаити" # HU #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Унгарија" # ID # fuzzy #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Икони" # IE #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ирска" # IL #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Израел" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Островот Ман" # IN # fuzzy #: zypp/CountryCode.cc:261 msgid "India" msgstr "Икони" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Британска Индоокеанска Територија" # IQ # fuzzy #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Израел" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Иран" # IS #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Исланд" # IT #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Италија" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Џерси" # JM # fuzzy #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Јамајка" # JO # fuzzy #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Корејски" # JP #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Јапонија" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Кенија" # KZ # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Киргистан" # KH # fuzzy #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Камбодија" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Кирибати" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Комори" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Свети Кристофер и Невис" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Северна Кореја" # ZA #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Јужна Кореја" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Кувајт" # FO # fuzzy #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Кајмански Острови" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Тајван" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Лаоска Народна Демократска Република" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Либан" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Света Луција" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Лихтенштајн" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Шри Ланка" # LR # fuzzy #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Србија" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Лесото" # LT # fuzzy #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Литвански" # LU # fuzzy #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Луксембург" # LV # fuzzy #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Хрватска" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Либија" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Мароко" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Монако" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Молдавија" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Црна Гора" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Свети Мартин" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Мадагаскар" # FO # fuzzy #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Маршалски Острови" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Македонија" # ML # fuzzy #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "KStep" # MM # fuzzy #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Панама" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Монголија" # MO # fuzzy #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "KStep" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Северните Маријански Острови" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Мартиник" # MR # fuzzy #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Литвански" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Монтсерат" # MT # fuzzy #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "KStep" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Литвански" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "KStep" # MW # fuzzy #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "KStep" # MX #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Мексико" # MY # fuzzy #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "KStep" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Мозамбик" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Намибија" # NC # fuzzy #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Македонија" # NG # fuzzy #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Нигер" # FO # fuzzy #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Норфолшки Остров" # NG # fuzzy #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Србија" # NI # fuzzy #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Парагвај" # NL #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Холандија" # NO #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Норвешка" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Непал" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Науру" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Ниуе" # NZ #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Нов Зеланд" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Оман" # PA #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Панама" # PE #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Перу" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Француска Полинезија" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинеја" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Филипини" # TJ # fuzzy #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Пакистан" # PL #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Полска" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" # PT #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Португалија" # PW # fuzzy #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Палау" # PY #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Парагвај" # QA # fuzzy #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "KStep" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "" # RO #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Романија" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Србија" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" # RW # fuzzy #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Канада" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "" # FO # fuzzy #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Соломонови Острови" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" # SD # fuzzy #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Звук" # SE #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Шведска" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" # SI #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Словенија" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" # SK # fuzzy #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Словачки" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" # SO # fuzzy #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Романија" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" # SV #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Ел Салвадор" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" # SZ # fuzzy #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Тајланд" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" # TD # fuzzy #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Кина" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" # TH #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Тајланд" # TJ # fuzzy #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Тајван" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" # TJ # fuzzy #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Туркменистан" # TN # fuzzy #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Русија" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" # TR #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Турција" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "" # TW #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Тајван" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" # UA #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Украина" # UG # fuzzy #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Канада" # UM # fuzzy #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Соединетите Американски Држави" # US # fuzzy #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Соединетите Американски Држави" # UY #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Уругвај" # TJ # fuzzy #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Узбекистан" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" # VE #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Венецуела" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Британски Девствени Острови" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Американски Девствени Острови" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" # ZA #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Јужна Африка" # ZM # fuzzy #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Јамајка" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Акинески" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Африкански" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Албански" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" # AU #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Алгонкиски јазици" # ZA #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Јужен Алтај" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" # AU #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Апачи јазици" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Арапски" # JM # fuzzy #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Арамејски" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" # AM # fuzzy #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Ерменски" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Араукански" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" # AU #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Атапаскански јазици" # AU #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Австралиски јазици" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" # AZ # fuzzy #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Азербејџански" # RW # fuzzy #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Банда" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 #, fuzzy msgid "Balinese" msgstr "Кинески" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Баскиски" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" # BY # fuzzy #. language code: bel be #: zypp/LanguageCode.cc:259 #, fuzzy msgid "Belarusian" msgstr "Бретонски" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 #, fuzzy msgid "Bosnian" msgstr "Естонски" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Бретонски" # ID # fuzzy #. language code: btk #: zypp/LanguageCode.cc:287 #, fuzzy msgid "Batak (Indonesia)" msgstr "Икони" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 #, fuzzy msgid "Buginese" msgstr "Кинески" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Бугарски" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Кинески" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" # AU #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "Австралија" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "" #. language code: cor kw #: zypp/LanguageCode.cc:349 #, fuzzy msgid "Cornish" msgstr "Дански" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Чешки" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Дански" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 #, fuzzy msgid "Lower Sorbian" msgstr "Српски" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 #, fuzzy msgid "English" msgstr "Полски" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Есперанто" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Естонски" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" # FO # fuzzy #. language code: fao fo #: zypp/LanguageCode.cc:431 #, fuzzy msgid "Faroese" msgstr "Ирска" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Фински" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Француски" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" # GU # fuzzy #. language code: gaa #: zypp/LanguageCode.cc:459 #, fuzzy msgid "Ga" msgstr "Гватемала" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" # GE # fuzzy #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 #, fuzzy msgid "Georgian" msgstr "Србија" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Германски" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Ирски" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "Хрватски" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Еврејски" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 #, fuzzy msgid "Upper Sorbian" msgstr "Српски" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Унгарски" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Исландски" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" # LT # fuzzy #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "Литвански" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" # ID # fuzzy #. language code: ind id #: zypp/LanguageCode.cc:565 #, fuzzy msgid "Indonesian" msgstr "Икони" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" # AU #. language code: iro #: zypp/LanguageCode.cc:575 #, fuzzy msgid "Iroquoian Languages" msgstr "Австралија" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Италијански" #. language code: jav jv #: zypp/LanguageCode.cc:579 #, fuzzy msgid "Javanese" msgstr "Јапонски" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Јапонски" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 #, fuzzy msgid "Judeo-Arabic" msgstr "Арапски" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" # CA #. language code: kan kn #: zypp/LanguageCode.cc:599 #, fuzzy msgid "Kannada" msgstr "Канада" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 #, fuzzy msgid "Kazakh" msgstr "Тајван" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 #, fuzzy msgid "Khotanese" msgstr "Кинески" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Корејски" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "" # LV # fuzzy #. language code: lav lv #: zypp/LanguageCode.cc:665 #, fuzzy msgid "Latvian" msgstr "Хрватска" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Литвански" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" # LU # fuzzy #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "Луксембург" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" # RW # fuzzy #. language code: lug lg #: zypp/LanguageCode.cc:685 #, fuzzy msgid "Ganda" msgstr "Канада" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "Таи" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Македонски" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" # MY # fuzzy #. language code: mal ml #: zypp/LanguageCode.cc:709 #, fuzzy msgid "Malayalam" msgstr "KStep" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Маорски" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" # MY # fuzzy #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "KStep" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" # RW # fuzzy #. language code: mdr #: zypp/LanguageCode.cc:729 #, fuzzy msgid "Mandar" msgstr "Канада" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" # AU #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "Австралија" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" # MY # fuzzy #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "KStep" # MT # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 #, fuzzy msgid "Maltese" msgstr "KStep" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" # AU #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "Австралија" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" # AU #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "Австралија" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" # AU #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "Австралија" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "Германски" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" # NO #. language code: nor no #: zypp/LanguageCode.cc:811 #, fuzzy msgid "Norwegian" msgstr "Норвешка" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "" # AU #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "Австралија" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" # AU #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "Австралија" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" # PW # fuzzy #. language code: pau #: zypp/LanguageCode.cc:857 #, fuzzy msgid "Palauan" msgstr "Парагвај" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Полски" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Португалски" # AU #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "Австралија" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" # JP #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "Јапонија" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" # RO #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "Романија" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Романски" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Руски" # RW # fuzzy #. language code: sad #: zypp/LanguageCode.cc:905 #, fuzzy msgid "Sandawe" msgstr "Канада" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" # AU #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "Австралија" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Српски" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Хрватски" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" # AU #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Австралија" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Словачки" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Словенечки" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" # SO # fuzzy #. language code: som so #: zypp/LanguageCode.cc:983 #, fuzzy msgid "Somali" msgstr "Романија" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 #, fuzzy msgid "Spanish" msgstr "Дански" #. language code: srd sc #: zypp/LanguageCode.cc:991 #, fuzzy msgid "Sardinian" msgstr "Македонски" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Шведски" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "" #. language code: tah ty #: zypp/LanguageCode.cc:1013 #, fuzzy msgid "Tahitian" msgstr "Хрватски" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Тамилски" # QA # fuzzy #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "KStep" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" # TJ # fuzzy #. language code: tgk tg #: zypp/LanguageCode.cc:1029 #, fuzzy msgid "Tajik" msgstr "Тајван" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Таи" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "" # TR #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "Турција" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" # AU #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "Австралија" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Турски" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" # UA #. language code: ukr uk #: zypp/LanguageCode.cc:1087 #, fuzzy msgid "Ukrainian" msgstr "Украина" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" # AU #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "Австралија" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "" # AU #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "Австралија" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Валонски" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" # AU #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "Австралија" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Неможеше да се створи %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Неможеше да се кешира складиштето (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Couldn't open file: %s." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Неможеше да се прочита директориумот '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Неможеше да се избрише '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Фајл %1%\n" " од пакет\n" " %2%\n" " е во конфликт со фајлот\n" " %3%\n" " од пакет\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Неможе да се создаде sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "скрши %s со игнорирање некои од неговите зависности" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "генерално игнорирај некои зависности" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "инсталираниот %1% не припаѓа во distupgrade складижте и мора да се замени" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "инсталираниот %1% има инфериорна архитектура" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "проблем со инсталираниот %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "спротивставени барања" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "некои проблеми со зависности" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "ништо не го поддржува бараниот '%1%'" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Дали ги вклучивте сите потребни складишта?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "бараниот пакет %1% не постои" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " егзекуцијата не успеа" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Не успеа да се увезе клучот." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Не успеа да се избрише клучот." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Couldn't open file: %s." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Неможеше да се chdir-а во '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Неможеше да се монтира %s во %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Неможеше да се демонтира %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Couldn't open file: %s." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "" #: zypp-tui/Table.cc:32 msgid "No" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "не е конектирано" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." # CL #, fuzzy #~ msgid "Child of" #~ msgstr "Чиле" # CF # fuzzy #, fuzzy #~ msgid "Centruual African Republic" #~ msgstr "Доминиканска Република" libzypp-17.36.5/po/mr.po000066400000000000000000004466501476576476200150310ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: Check hardware-2.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2006-11-13 12:55+0530\n" "Last-Translator: Priyavert Sharma \n" "Language-Team: AgreeYa Solutions \n" "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: KBabel 1.10.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "अज्ञात देश:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "कोड नाही" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "अंडोरा" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "संयुक्त अरब अमिराती" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "अफगाणिस्तान" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "ऑन्टिग्वा व बर्बुडा" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "अंग्विला" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "अल्बेनिया" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "आर्मेनिया" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "नेदरलॅन्ड्स अन्टिलेस" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "अंगोला" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "अंटार्क्टिका" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "अर्जेंटिना" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "अमेरिकन सॅमोआ" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "ऑस्ट्रिया" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "आस्ट्रेलिया" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "अरूबा" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "अलॅन्ड बेटे" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "अझरबैजान" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "बोस्निया व हर्जेगोव्हिना" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "बारबॅडॉस" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "बांग्लादेश" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "बेल्जियम" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "बर्किना फासो" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "बल्गेरिया" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "बहारिन" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "बुरूंडी" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "बेनिन" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "बरमुडा" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "ब्रुनेई दारूसलाम" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "बोलिव्हिया" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "ब्राझील" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "बहामास" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "भूतान" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "बोव्हेच बेट" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "बोटस्वाना" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "बेलारूस" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "बेलिझे" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "कॅनडा" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "कॉकस (कीलींग) बेटे" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "काँगो" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "मध्य आफ्रिकी प्रजासत्ताक" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "स्वित्झर्लंड" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "कोट डी आयव्हरी" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "कूक बेटे" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "चिली" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "कॅमेरून" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "चीन" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "कोलंबिया" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "कोस्टा रिका" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "क्युबा" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "केप व्हेर्डे" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "ख्रिसमस बेट" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "सायप्रस" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "चेक प्रजासत्ताक" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "जर्मनी" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "दिजबौती" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "डेनमार्क" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "डॉमिनिका" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "डॉमिनिकन प्रजासत्ताक" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "अल्जेरिया" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "इक्वेडोर" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "एस्टोनिया" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "ईजिप्त" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "पश्चिम सहारा" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "एरिट्रिआ" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "स्पेन" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "इथिओपिया" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "फिनलँड" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "फिजी" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "फाल्कलॅन्ड बेटे (माल्व्हिनास)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "मिक्रोनेशिया फेडरेटेड स्टेट्स" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "फरोई बेटे" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "फ्रान्स" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "मेट्रॉपॉलिटन फ्रान्स" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "गॅबॉन" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr ".युनायटेड किंगडम" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "ग्रेनाडा" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "जॉर्जिया" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "फ्रेच गुआना" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "जर्मनी" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "घाना" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "जिब्राल्टर" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "ग्रीनलॅन्ड" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "गॅम्बिया" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "ग्विनिआ" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "ग्वाडेलोप" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "इक्वेटोरियल गुनिआ" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "ग्रीस" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "दक्षिण जॉर्जिया व दक्षिण सॅन्डविच बेटे" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "ग्वाटेमाला" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "ग्वॅम" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "ग्विनिआ-बिसाऊ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "गयाना" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "हाँगकाँग" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "हर्ड बेटे व मॅकडॉनल्ड बेटे" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "होंडुरास" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "क्रोएशिया" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "हैती" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "हंगेरी" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "इंडोनेशिया" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "आयर्लंड" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "इस्रेल" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "भारत" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "ब्रिटिश हिंदी महासागर प्रदेश" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "इराक" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "इराण" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "आइसलॅन्ड" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "ईटाली" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "जमैका" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "जॉर्डन" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "जपान" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "केनिया" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "किरगिझस्तान" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "कंबोडिया" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "किरीबती" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "कॉमोरोस" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "सेंट किट्स व नेव्हिस" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "उत्तर कोरिया" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "दक्षिण कोरिया" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "कुवैत" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "केमन बेटे" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "कझाकस्तान" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "लाओ पीपल्स डेमोक्रॅटिक रिपल्बिक" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "लेबनॉन" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "सेंट ल्युसिया" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "लाएचटेन्स्टिन" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "श्रीलंका" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "लायबेरिया" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "लेसोथो" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "लिथुएनिया" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "लक्झेमबर्ग" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "लॅटव्हिया" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "लिबिया" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "मोरोक्को" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "मोनॅको" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "मॉल्दोव्हा" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "मोंगो" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "सॅन मारिनो" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "मादागास्कर" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "मार्शल बेटे" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "मासेडोनिया" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "माली" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "म्यानमार" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "मंगोलिया" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "मकाओ" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "उत्तरी मेरियाना बेटे" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "मार्टिनिक" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "मॉरिटॅनिया" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "माँतेसेरत" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "माल्टा" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "मॉरिशस" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "मालदीव्हज" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "मालावी" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "मेक्सिको" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "मलेशिया" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "मोझाम्बिक" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "नामिबिया" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "न्यू कॅलेडोनिया" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "नायजेर" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "नॉरफॉक बेटे" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "नायजेरिया" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "निकारागुआ" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "नेदरलॅन्डस" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "नॉर्वे" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "नेपाळ" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "नौरू" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "न्यूए" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "न्यूझीलंड" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "ओमान" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "पनामा" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "पेरू" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "फ्रेंच पॉलिनेसिया" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "पापुआ न्यू जिनिव्हा" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "फिलीपीन्स" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "पाकिस्तान" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "पोलंड" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "सेंट पिअर व मिक्वेलॉन" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "पिटकैर्न" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "प्युर्टो रिको" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "पॅलेस्टिनी भूप्रदेश" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "पोर्तुगाल" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "पलाऊ" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "पॅरॅग्वे" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "कतार" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "रीयुनियन" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "रूमेनिया" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "सर्बियन" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "रशियन फेडरेशन" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "रवांडा" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "सौदी अरबस्तान" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "सॉलोमन बेटे" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "सेशेल्स" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "सुदान" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "स्वीडन" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "सिंगापुर" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "सेंट हेलेना" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "स्लोव्हेनिया" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "स्वॅलबार्ड व जन मायेन" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "स्लोव्हाकिया" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "सिएरा लिओन" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "सॅन मारिनो" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "सेनेगल" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "सोमालिया" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "सुरीनाम" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "साओ टोम व प्रिन्सिप" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "एल सॅल्व्हेडोर" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "सायरिया" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "स्वाझिलॅन्ड" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "टर्क्स व कैकॉस बेटे" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "चॅड" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "फ्रेंच दक्षिणी भूप्रदेश" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "टोगो" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "थायलंड" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "ताजिकीस्तान" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "टोकेलाऊ" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "तुर्कमेनिस्तान" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ट्युनिशिया" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "टोंगा" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "पूर्व तिमोर" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "तुर्कस्तान" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "त्रिनिदाद व टोबॅगो" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "तुवालू" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "तैवान" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "टांझानिया" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "युक्रेन" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "युगांडा" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "अमेरिकेतील छोटी बेटे" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "अमेरिका" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "ऊरुग्वे" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "उझबेकिस्तान" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "होली सी (व्हॅटिकन सिटी देश)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "सेंट विन्सेन्ट व ग्रेनाडिन्स" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "व्हेनेझुएला" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "ब्रिटिश व्हर्जिन बेटे" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "व्हर्जिन आयलंड्स, अमेरिका" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "व्हिएटनाम" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "वानुआतू" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "वॉलिस व फुतुना" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "सॅमोआ" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "येमेन" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "मायोटे" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "दक्षिण आफ्रिका" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "झांबिया" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "झिंबाब्बे" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s :%s ला बाजूला टाकते" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "अज्ञात भाषा" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "अफार" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "अबखॅजियॅन" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "अचाईनीज" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "अकोली" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "अडँग्मे" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "अडायघे" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "आफ्रो-एशियाटिक (अन्य)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "आफ्रिहिली" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "आफ्रिकान्स" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "ऐनू" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "अकान" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "अक्कादियॅन" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "अल्बेनियन" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "अलौत" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "अल्गोन्क्वियन भाषा" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "दक्षिण अल्तई" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "अम्हॅरिक" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "इंग्रजी जुनी (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "अपाची भाषा" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "अरेबिक" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "अरॅमॅइक" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "अरॅगोनीज" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "अर्मेनियन" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "अरौकॅनियन" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "अरापाहो" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "आर्टिफिशियल (अन्य)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "अरावाक" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "असमी" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "अस्टुरियन" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "अथापास्कन भाषा" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "ऑस्ट्रेलियन भाषा" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "अवॅरिक" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "अव्हेस्टन" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "अवधी" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "ऐमारा" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "अझरबैजानी" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "बांदा" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "बामिलिक भाषा" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "बशकीर" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "बलुची" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "बाम्बारा" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "बालीनीज" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "बास्क" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "बासा" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "बाल्टिक (अन्य)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "बेजा" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "बेलारूसियन" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "बम्बा" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "बंगाली" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "बर्बर (अन्य)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "भोजपुरी" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "बिहारी" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "बिकोल" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "बिनी" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "बिस्लामा" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "सिकसिका" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "बांतू (अन्य)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "बोस्नीयन" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "ब्रज" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "ब्रेटॉन" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "बाटक (इंडोनेशिया)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "बरियत" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "बगिनीज" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "बल्गेरियन" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "बर्मीज" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "ब्लिन" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "कॅडो" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "मध्य अमेरिकन इंडियन (अन्य)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "कॅरीब" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "कॅटलॅन" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "कॉकेशियन (अन्य)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "सेबुआनो" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "सेल्टिक (अन्य)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "चॅमोरो" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "चीबचा" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "चेचेन" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "चगतई" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "चीनी" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "चुकीज" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "मारी" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "चीनूक जारगॉन" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "चोकटा" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "चिपेव्यान" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "चेरोकी" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "चर्च स्लाविक" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "चुवाश" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "चेयेनी" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "चॅमिक भाषा" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "कॉप्टिक" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "कोर्निश" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "कोर्सिकन" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "क्रेओलेस व पिडगिन्स, इंग्रजी वर आधारित (अन्य)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "क्रेओलेस व पिडगिन्स, फ्रेंचवर आधारित (अन्य)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "क्रेओलेस व पिडगिन्स, पोर्तुगीजवर आधारित (अन्य)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "क्री" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "क्रिमियन टाटार" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "क्रेओलेस व पिडगिन्स (अन्य)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "काशुबियन" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "कुशिटीक (अन्य)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "चेक" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "डाकोटा" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "डॅनिश" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "डार्गवा" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "डायाक" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "डेलावेअर" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "स्लाव (अथॅपास्कन)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "डोग्रीब" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "डिनका" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "दिवेही" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "डोगरी" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "द्रविडियन (अन्य)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "लोअर सर्बियन" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "दुआला" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "डच, मध्य (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "डच" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ड्यूला" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "झोंगखा" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "एफिक" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "इजिप्शियन (प्राचीन)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "एकाजुक" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "इलॅमाइट" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "इंग्रजी" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "इंग्रजी, मध्य (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "एस्पेरॅन्टो" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "एस्टोनियन" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "इवे" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "इवोंडो" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "फँग" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "फरोसी" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "फान्ती" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "फिजियन" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "फिलिपिनो" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "फिनिश" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "फिनो-उग्रीयन (अन्य)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "फॉन" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "फ्रेंच" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "फ्रेंच, मध्य (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "फ्रेंच, जुनी(842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "फ्रिसीयन" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "फुलाह" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "फ्रुलियन" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "गा" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "गायो" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "ग्बाया" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "जर्मनिक (अन्य)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "ज़ॉर्जियन" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "जर्मन" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "गीझ" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "गिल्बर्टीज" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "गेलिक" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "आयरिश" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "गॅलीसियन" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "मँक्स" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "जर्मन , मध्यम जास्त (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "जर्मन, जुनी जास्त (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "गोंडी" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "गोरोंटॅलो" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "गोथिक" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "ग्रेबो" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "ग्रीक, प्राचीन (1453 पर्यंत)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "ग्रीक, आधुनिक (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "गुरानी" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "गुजराती" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "ग्विच’इन" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "हैदा" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "हैतियन" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "हौसा" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "हवाईयन" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "हिब्रु" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "हरेरो" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "हिलीगेनॉन" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "हिमाचली" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "हिन्दी" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "हित्तिते" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "ह्माँग" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "हिरी मोतू" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "अप्पर सॉर्बियन" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "हंगेरियन" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "हुपा" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "ईबान" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "इग्बो" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "आईस्लॅन्डिक" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "इडो" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "सिचुआन यी" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ईजो" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "इनुक्तितूत" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "इन्टरलिंग" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "इलोको" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "इन्टरलिंगुआ (आंतरराष्ट्रीय ऑक्सिलरी भाषा संघटना" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "इंडिक (अन्य)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "इंडोनेशियन" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "इंडो-युरोपियन (अन्य)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "इंगुश" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "इनुपिआक" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "इराणीयन (अन्य)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "इरोकोईयन भाषा" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "ईटालियन" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "जावानीज" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "लॉज्बन" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "जपानी" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "ज्युडेओ-पर्शियन" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "ज्युडेओ-अरेबिक" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "कारा-कल्पक" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "काबाईल" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "काचीन" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "कलालिसट" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "कांबा" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "कानाडी" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "कारेन" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "काश्मिरी" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "कानुरी" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "कावी" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "कझाक" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "कबर्डियन" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "खासी" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "खोईसन (अन्य)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "खमेर" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "खोटानीज" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "किकूयू" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "किन्यारवंडा" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "किरगीझ" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "किम्बुन्डू" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "कोकणी" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "कोमी" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "काँगो" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "कोरियन" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "कोस्रीयन" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "क्पेल्ले" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "कराचाय-बल्कर" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "क्रू" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "कुरुख" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "क्वॅन्यॅमा" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "कुम्यक" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "कुर्दिश" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "कुतेनाय" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "लॅडिनो" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "लाहंदा" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "लांबा" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "लाओ" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "लॅटिन" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "लॅटव्हियन" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "लेझगियान" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "लिंबुर्गन" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "लिंगाला" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "लिथुएनियन" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "मोंगो" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "लोझी" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "लक्झेम्बर्गिश" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "लुबा-लुलुआ" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "लुबा-कटंगा" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "गांडा" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "लुईझेनो" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "लुंडा" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "लुओ (केनिया व तांझानिया)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "लुशाई" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "मेसेडोनियन" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "मदुरीज" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "मगही" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "मार्शलीज" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "मैथिली" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "मकासार" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "मल्याळम" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "मन्डिंगो" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "माओरी" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "ऑस्ट्रोनेशियन (अन्य)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "मराठी" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "मसई" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "मलय" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "मोक्षा" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "मंदार" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "मेंडे" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "आयरिश, मध्य (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "मि’क्माक" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "मिनँगकाबाऊ" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "किरकोळ अन्य भाषा" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "मॉन-खमेर (अन्य)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "मलागासी" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "माल्टीज" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "मांचू" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "मणिपुरी" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "मोनोबो भाषा" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "मोहॉक" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "मॉल्देव्हियन" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "मंगोलियन" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "मोस्सी" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "अनेक भाषा" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "मुंडा भाषा" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "क्रीक" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "मिरॅन्डिस" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "मारवाडी" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "मायन भाषा" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "एरझ्या" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "नाहुआटल" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "उत्तर अमेरिकी भारतीय" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "नेपोलिटन" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "नाव्हाजो" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "न्डेबेले, दक्षिण" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "न्डेबेले उत्तर" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "न्डोंगा" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "लो जर्मन" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "नेपाळी" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "नेपाल भासा" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "निअस" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "नायजेर-कोर्डोफॅनियन (अन्य)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "नियुईन" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "नॉर्वेजियन न्योर्स्क" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "नॉर्वेजियन बोकमल" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "नोगई" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "नॉर्से, जुनी" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "नॉर्वेजियन" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "उत्तरी सोथो" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "नुबियन भाषा" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "क्लासिकल नेवाडी" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "चिचेवा" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "न्याम्वेझी" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "न्यान्कोल" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "न्योरो" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "न्झिमा" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "ऑसिटन (1500 नंतर)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "ऑजिब्वा" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "उडिया" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "ओरोमो" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "ओसाज" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "ऑसेटियन" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "टर्किश, ओटोमन (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "ऑक्टोमियन भाषा" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "पापुआन (अन्य)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "पांगेसिनन" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "पल्हवी" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "पम्पॅन्गा" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "पंजाबी" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "पापिअमेन्टो" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "पलौअन" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "पर्शियन, जुनी (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "पर्शियन" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "फिलीपिनी (अन्य)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "फोएनिशियन" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "पाली" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "पोलिश" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "पोहमपेइयन" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "पोर्तुगीज" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "प्राकृत भाषा" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "प्रॉव्हेन्कल, जुनी (1500 " #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "पुश्तो" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "क्वेचुआ" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "राजस्थानी" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "रापानुई" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "रारोटोंगन" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "रोमन्स (अन्य)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "राएटो-रोमन्स" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "रूमेनी" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "रुमेनियन" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "रूंदी" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "रशियन" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "सॅन्डावे" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "सांगो" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "याकुत" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "दक्षिण अमेरिकन भारतीय (अन्य)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "सॉलिशन भाषा" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "समरितान भाषा" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "संस्कृत" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "सासक" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "संताली" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "सर्बियन" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "सिसीलियन" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "स्कॉट्स" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "क्रोएशियन" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "सेल्कप" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "सेमिटिक (अन्य)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "आयरिश, जुनी (900 पर्यंत)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "खुणांची भाषा" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "शान" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "सिडॅमो" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "सिंहला" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "सिओयुअन भाषा" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "सिनो-तिबेटन (अन्य)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "स्लेव्हिक (अन्य)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "स्लोव्हाक" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "स्लोव्हेनियन" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "दक्षिण सॅमी" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "उत्तरी सॅमी" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "सॅमी भाषा (अन्य)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "लुले सॅमी" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "इनारी सॅमी" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "सॅमोअन" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "स्कॉल्ट सॅमी" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "शोना" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "सिंधी" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "सोनिंके" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "सॉग्डियन" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "सोमाली" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "साँघई" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "सोथो, दक्षिणी" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "स्पॅनिश" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "सार्डिनियन" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "सेरेर" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "निलो-सहारन (अन्य)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "स्वाती" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "सुकुमा" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "सुदानीज" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "सुसु" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "सुमेरियन" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "स्वाहिली" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "स्वीडिश" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "सायरिअक" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "ताहिशियन" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "ताई (अन्य)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "तामिल" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "तातार" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "तेलगू" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "टिम्ने" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "तेरेनो" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "टेटम" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "ताजिक" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "तागालॉग" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "थाई" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "तिबेटियन" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "तिग्री" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "तिग्रीन्या" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "तिव्ह" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "क्लिंगॉन" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "त्लिंगिट" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "तामाशेक" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "टोंगा (न्यासा)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "टोंगा (टोंगा बेटे)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "टॉक पिसीन" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "त्सिम्सीयॅन" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "त्स्वाना" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "त्सोंगा" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "तुर्कमन" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "टुंबुका" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "तुपी भाषा" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "टर्किश" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "अल्ताईक (अन्य)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "त्वि" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "तुव्हिनियन" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "उडमर्ट" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "युगारिटिक" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "युईघर" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "युक्रेनियन" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "युबुंडु" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "निश्चित केलेली नाही" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "उर्दू" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "उझबेक" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "वाई" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "वेंदा" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "व्हिएतनामीज" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "व्होलॅपुक" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "व्होटिक" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "वाकाशन भाषा" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "वालॅमो" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "वॅरे" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "वाशो" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "वेल्श" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "सर्बियन भाषा" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "वॅलून" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "वोलोफ" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "कल्माइक" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "क्झोसा" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "याओ" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "यापीज" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "यिदिश" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "योरूबा" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "युपिक भाषा" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "झापोटेक" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "झेनागा" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "झुएंग" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "झांदे" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "झुलू" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "झुनी" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "अनोळखी" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "डिस्क अस्तित्वात नाही" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "अज्ञात आज्ञा" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "अवैध Url स्कीम %s" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "डिरेक्टर %1: %2 निर्माण करता आली नाही." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr " डेस्कटॉप आयटेम'%s' उघडू शकत नाही" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "पाठवल्याच्या फाईलचे अवैध नांव" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "फाईलरायटिंगसाठी उघडू शकत नाही." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "फ्लॉपी डिस्कवरुन एरर वाचत आहे." #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "रिसोर्सेस जतन करत आहे" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr " डेस्कटॉप आयटेम'%s' उघडू शकत नाही" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr " VM चे नाव आकड्याने सुरू होता कामा नये. " #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr " VM चे नाव आकड्याने सुरू होता कामा नये. " #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "चालू ठेवायचे?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "पॅकेज %s एकत्रित तपासणीत अयशस्वी. आपल्याला ते पुन्हा डाऊनलोड करण्याचा प्रयत्न करायचाआहे?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "पॅकेज %s एकत्रित तपासणीत अयशस्वी. आपल्याला ते पुन्हा डाऊनलोड करण्याचा प्रयत्न करायचाआहे?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm चेक अयशस्वी" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm अयशस्वी" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "बदल वैशिष्ट्ये दाखवाला रिसोर्स प्रकार VAR1 समर्थन देत नाही feature" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "%s वरून %s पुरवू शकत नाही" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "भांडारात फाईल %1 आढळली नाही" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "फाईल निर्माण करु शकत नाही" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "या गरजेकडे येथेच दुर्लक्ष करा" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "या गरजेकडे येथेच दुर्लक्ष करा" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "यांच्याशी कनेक्शनची रिक्वेस्ट :" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "अवलंबून असण्याच्या (डिपेन्डन्सी) समस्येमुळे %s स्थापित करु शकत नाही" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "कोणतीही गोष्ट %s पुरवत नाही" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "विनंती आधीपासूनच आहे." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "निर्देशानुसार स्थापना मधेच सोडली" #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "अमलात आणा" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "की च्या सांकेतिकीकरणादरम्यान चूक आली" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "अयशस्वी" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s साठी बदललेल्या आकृतीबंध फाईल्स" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm ने %s हे %s म्हणन जतन केले, परंतु फरक सांगणे अशक्य" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "rpm ने %s हे %s म्हणून जतन केले/nफरकाच्या या पहिल्या 25 ओळी\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm ने %s हे %s म्हणून जतन केले फरकाच्या या पहिल्या" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "rpm ने %s हे %s म्हणून जतन केले/nफरकाच्या या पहिल्या 25 ओळी\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "अतिरिक्त rpm आऊटपुट" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "बॅकअप %s निर्माण केले" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "नोंद आढळली नाही" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "नोंद आढळली नाही" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "नोंद आढळली नाही" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1' अस्तित्वात नाही." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1' अस्तित्वात नाही." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "VM सुरू करण्यात अयशस्वी." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "VM सुरू करण्यात अयशस्वी." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "नोंद आढळली नाही" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "फाईल उघडता येत नाही %1." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "फाईल उघडता येत नाही %1." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "अवैध LDAP URL क्वेरी स्ट्रिंग" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "अवैध LDAP URL क्वेरी पॅरामीटर %s" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Url ऑब्जेक्ट क्लोन करण्यात असमर्थ" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "अवैध रिक्त Url ऑब्जेक्ट संदर्भ" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Url भागांचा संबंध जोडण्यात असमर्थ" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url स्कीम %sला अनुमती देत नाही" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "अवैध %s कॉम्पोनन्ट %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "अवैध %s कॉम्पोनन्ट" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "या URL साठी क्वेरी स्ट्रिंग पार्सिंगचे समर्थन नाही" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL स्कीम हा एक आवश्यक भाग आहे" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "अवैध Url स्कीम %s" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url स्कीम उपभोक्त्याच्या नावाला अनुमती देत नाही" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url स्कीम पासवर्डला अनुमती देत नाही" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url स्कीमला मुख्य भागाची गरज असते" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url स्कीम मुख्य भागाला अनुमती देत नाही" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "अवैध मुख्य भाग %s" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url स्कीम पोर्टला अनुमती देत नाही" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "अवैध पोर्ट भाग %s" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url स्कीमला पाथच्या नावाची गरज असते" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "अथॉरिटी उपस्थित असेल तर सापेक्ष पाथला अनुमती नाही" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "एनकोडेड स्ट्रिंगमधे NUL बाईटचा समावेश आहे" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "अवैध पॅरामीटर अरे स्प्लिट सेपरेटर कॅरॅक्टर" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "अवैध पॅरामीटर मॅप स्प्लिट सेपरेटर कॅरॅक्टर" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "अवैध पॅरामीटर अरे जॉईन सेपरेटर कॅरॅक्टर " #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr " कनेक्ट करतांना आदेश वापरला " #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "%s आढळत नाही." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "%s आढळत नाही." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr " %s - %s उघडणे अशक्य\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "मॉड्युल लोड करण्यात अपयश \"%s\"." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "भांडारात फाईल %1 आढळली नाही" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "फाईल %1 लिहिता येत नाही." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 ही डिरेक्टरी नाही." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "रिक्त CA नांव." #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "अवैध URL योजना '%1'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr " डेस्कटॉप आयटेम'%s' उघडू शकत नाही" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "परवानगी नाकारली" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "होय" #: zypp-tui/Table.cc:32 msgid "No" msgstr "नाही" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "सावधान" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "त्रुटी" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "केले" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "चूक" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "सावधान" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "सुरु करत आहे..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "सापडले नाही" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "योय" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "नाहीं" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे." #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "पॅकेजेस अस्थापित करण्याचा आदेश" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "कोणतीही गोष्ट %s पुरवत नाही" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "डिस्क अस्तित्वात नाही" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s ला कुलुप आहे व अस्थापित होऊ शकत नाही" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "स्थापित नसलेली" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s ला %s ची गरज आहे" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "%s स्थापित करु शकत नाही" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s चे %s शी पटत नाही" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s %s ला बाजूला टाकते" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s %s ला बाजूला टाकते" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s चे %s शी पटत नाही" #~ msgid "do not install %s" #~ msgstr "%s स्थापित करु नका" #~ msgid "keep %s" #~ msgstr "%s ठेवा" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "%s स्थापित करु नका" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "%s चे स्थापित करता येण्याजोगे प्रदाता नाहीत" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "संबंधित रिझॉल्व्हेबल्स स्थापित किंवा पुसून टाकू नका" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "%s स्थापित करा, जरी ते स्थापत्य बदलत असेल" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s %s ला बाजूला टाकते" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "% वरून % डाऊनलोड करत आहे" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "स्थापना (इन्स्टॉलेशन)" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "फाईल उघडता येत नाही %1." #~ msgid "Hal Exception" #~ msgstr "Hal अपवाद" #~ msgid "HalContext not connected" #~ msgstr "हॅलकॉन्टेक्स्ट कनेक्ट केलेले नाही" #~ msgid "HalDrive not initialized" #~ msgstr "हॅलड्राईव्हची सुरुवात नाही" #~ msgid "HalVolume not initialized" #~ msgstr "हॅलव्हाल्यूमची सुरुवात नाही" #~ msgid "Unable to create dbus connection" #~ msgstr "डीबस कनेक्शन निर्माण करणे अशक्य" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: लिभाल कॉन्टेक्स निर्माण करु शकत नाही" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr " libhal_set_dbus_connection: डीबस कनेक्शन निश्चित करू शकत नाही" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "HAL कॉन्टेक्स्ट चा प्रारंभ अशक्य – हाल्ड चालू नाही?" #~ msgid "Not a CDROM drive" #~ msgstr "CDROM ड्राईव्ह नाही" #~ msgid "Can't initialize mutex attributes" #~ msgstr "म्युटेक्स अट्रिब्यूट्स सुरू करू शकत नाही" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "रीकर्सिव्ह म्यूटेक्स अट्रिब्यूट स्थापित करु शकत नाही" #~ msgid "Can't initialize recursive mutex" #~ msgstr "रीकर्सिव्ह म्युटेक्स सुरू करू शकत नाही " #~ msgid "Can't acquire the mutex lock" #~ msgstr "म्युटेक्स लॉक मिळवू शकत नाही" #~ msgid "Can't release the mutex lock" #~ msgstr "म्युटेक्स लॉक उघडू शकत नाही" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "सार्वजनिक की मिळवणे अशक्य" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "स्थापित नसलेली" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr " %s - %s उघडणे अशक्य\n" #~ msgid "Serbia and Montenegro" #~ msgstr "सर्बिया व माँटेनेग्रो" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "अज्ञात सूची पर्याय" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "निर्भरता रिझॉल्व करु शकलो नाही" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाईल %s मधे चेकसम नाही.\n" #~ "तरीही फाईल वापरायची?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s फाईल पुढील की बरोबर सचोटी:\n" #~ "%s|%s|%s\n" #~ "तपासात अयशस्वी तरीही फाईल वापरायची?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाईल %s मधे अवैध चेकसम.\n" #~ "अपेक्षित %s,आढळले %s\n" #~ "तरीही फाईल वापरायची?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाईल %s मधे अज्ञात चेकसम. %s.\n" #~ "तरीही फाईल वापरायची?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "फाईल %s वर स्वाक्षरी नाही\n" #~ "तरीही वापरायची?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "फाईल %s वर अज्ञात की ची स्वाक्षरी:\n" #~ "%s|%s|%s\n" #~ "तरीही फाईल वापरायची?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "अविश्वासू की आढळली:\n" #~ "%s|%s|%s\n" #~ "की वर विश्वास ठेवायचा?" #~ msgid "%s remove failed" #~ msgstr "%s काढून टाकणे अयशस्वी" #~ msgid "rpm output:" #~ msgstr "rpm आऊटपुट" #~ msgid "%s install failed" #~ msgstr "%s स्थापना अयशस्वी" #~ msgid "%s installed ok" #~ msgstr "%s स्थापना ठीक आहे" #~ msgid "%s remove ok" #~ msgstr "%s टाकणे ठीक आहे" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "%s ही डिपेन्डन्सी पुरवते, परंतु ते स्थापित आयटेमचे स्थापत्य बदलेल" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "%s ही डिपेन्डन्सी पुरवते, परंतु ते स्थापित आयटेमचे स्थापत्य बदलेल" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "संबंधित रिझॉल्व्हेबल्स स्थापित किंवा पुसून टाकू नका" #~ msgid "Ignore that %s is already set to install" #~ msgstr "%s याआधीच स्थापनेसाठी सज्ज असल्याकडे दुर्लक्ष करा" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr " %s मधील %s ऑब्सोलीटकडे दुर्लक्ष करा" #~ msgid "Ignore this conflict of %s" #~ msgstr "%s चा हा विवाद विसरून जा" #~ msgid "Ignore this requirement just here" #~ msgstr "या गरजेकडे येथेच दुर्लक्ष करा" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "%s स्थापित करा, जरी ते स्थापत्य बदलत असेल" #~ msgid "Install missing resolvables" #~ msgstr "गायब रिझॉल्व्हेबल्स स्थापित करा" #~ msgid "Keep resolvables" #~ msgstr "रिझॉल्व्हेबल्स ठेवा" #~ msgid "Unlock these resolvables" #~ msgstr "ही रिझॉल्व्हेबल्स अनलॉक करा" #~ msgid "delete %s" #~ msgstr "%s पुसून टाका" #~ msgid "install %s" #~ msgstr "%s स्थापित करा" #~ msgid "unlock %s" #~ msgstr "%s अनलॉक करा" #~ msgid "unlock all resolvables" #~ msgstr "सर्व रिझॉल्व्हेबल्स अनलॉक करा" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "फाईल उघडता येत नाही %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "एरर सेक्टर %u वाचत आहे." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "या URL साठी पाथ पॅरामीटर पार्सिंगचे समर्थन नाही" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "या URL साठी पाथ पॅरामीटर पार्सिंगचे समर्थन नाही" #~ msgid "Software management is already running." #~ msgstr "सॉफ्टवेअर व्यवस्थापन आधीच चालू आहे" #~ msgid "%s is replaced by %s" #~ msgstr "%s च्या जागी %s" #~ msgid "%s replaced by %s" #~ msgstr "%s च्या जागी %s " #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "ही रिझॉल्व्हेबल्स प्रणालीतून पुसून टाकली जातील" #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s अस्थापित होणार नाही कारण ते अजून आवश्यक आहे" #~ msgid "Invalid information" #~ msgstr "अवैध माहिती" #~ msgid "%s is needed by other resolvables" #~ msgstr "इतर रिझॉल्व्हेबल्सना %s ची गरज आहे" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "%s ला %s ची गरज आहे:/n" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s चे अन्य रिझॉल्व्हेल्बशी पटत नाही" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s चे\n" #~ "%s शी पटत नाही:" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s अन्य रिझॉल्व्हेबल्सना बाजूला टाकते" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "ही रिझॉल्व्हेबल्स प्रणालीतून पुसून टाकली जातील" #~ msgid "%s depends on other resolvables" #~ msgstr "%s इतर रिझॉल्व्हेबल्सवर अवलंबून" #~ msgid "%s depends on %s" #~ msgstr "%s %s वर अवलंबून" #~ msgid "%s depends on:%s" #~ msgstr "%s :%s वर अवलंबून" #~ msgid "Child of" #~ msgstr "चाईल्ड ऑफ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "असे कोणतेही साधन उपलब्ध नाही जे या गरजेला समर्थन देते." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "येऊ घातलेल्या समस्या, ज्या या रिझोल्यूशनच्या वर/खाली नमूद केल्या आहेत, त्यासर्व अवलंबून " #~ "गोष्टी सोडवणार नाहीत" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%s स्थापित करु शकत नाही कारण त्यांचे %s शी पटत नाही" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s स्थापित नाही व त्यावर स्थापित न करता येणारा अशी खूण आहे" #, fuzzy #~ msgid "%s has unfulfilled requirements" #~ msgstr "च्या गरजा पूर्ण न होणार्या" #~ msgid "%s has missing dependencies" #~ msgstr "%sच्या गरजा पूर्ण न होणार्या आहेत" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s मधे गायब डिपेन्डन्सीज आहेत." #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "गायब डिपेन्डन्सीडमुळे %s स्थापित करु शकत नाही" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s %s च्या डिपेन्डन्सीज पूर्ण करते, परंतु आपल्या प्रणालीवर ठेवण्यात येईल" #~ msgid "No need to install %s" #~ msgstr "%s स्थापित करण्याची गरज नाही" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "%s च्या डिपेन्डन्सीज पूर्ण करण्यासाठी %s स्थापित करू शकत नाही" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "%s च्या डिपेन्डन्सीज पूर्ण करण्यासाठी %s स्थापित करू शकत नाही" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s अस्थापित होणार नाही कारण ते अजून आवश्यक आहे" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s %s ला बाजूला टाकते, परंतु %s पुसता येत नाही कारण ते लॉक्ड आहे" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "%s स्थापित करता येऊ शकत नाही कारण ते विवादास्पद आहे" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s स्थापित करता येण्यासारखे नाही कारण त्याचे %s शी पटत नाही" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "%s चे अपग्रेडिंग करतांना %s साठी %s ची गरज" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s गरज %s चुकवत आहे" #~ msgid ", Action: " #~ msgstr "कृती" #~ msgid ", Trigger: " #~ msgstr "ट्रिगर" #~ msgid "package" #~ msgstr "पॅकेज" #~ msgid "selection" #~ msgstr "निवड" #~ msgid "pattern" #~ msgstr "नमुना" #~ msgid "product" #~ msgstr "उत्पादन" #~ msgid "patch" #~ msgstr "पॅच" #~ msgid "script" #~ msgstr "स्क्रिप्ट" #~ msgid "message" #~ msgstr "संदेश" #~ msgid "atom" #~ msgstr "अणू (अटम)" #~ msgid "system" #~ msgstr "प्रणाली" #~ msgid "Resolvable" #~ msgstr "रिझॉल्व्हेबल" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "हा रिझोल्यूशनचा प्रयत्न अवैध असल्याची खूण करत आहे" #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "रिझ़ॉल्व्हेबल %s स्थापित करण्यासारखा नसल्याची खूण करत आहे" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "%s स्थापित होणार आहे, परंतु डिपेन्डन्सी समस्यांमुळे हे शक्य नाही" #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "%s स्थापित करु शकत नाही कारण आधीच त्यावर अस्थापित करण्याची गरज असल्याची खूण केलेली " #~ "आहे" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "%s स्थापित करु शकत नाही, कारण ते या प्रणालीला लागू होत नाही" #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "%s स्थापित करु शकत नाही, कारण आधीच त्यावर अस्थापित करण्याची गरज असल्याची खूण " #~ "केलेली आहे " #~ msgid "This would invalidate %s." #~ msgstr "हे %s अवैध करेल" #~ msgid "Establishing %s" #~ msgstr "%s प्रस्थापित करत आहे" #~ msgid "Installing %s" #~ msgstr "%s स्थापित करत आहे" #~ msgid "Updating %s to %s" #~ msgstr "%s ते %s अपडेट करत आहे" #, fuzzy #~ msgid "Skipping %s: already installed" #~ msgstr "%s वगळत आहेः %s याआधीच स्थापित आहे" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "%s चे पर्यायी स्थापित प्रदाता नाहीत" #~ msgid "for %s" #~ msgstr "%s करिता" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "%s काढून टाकणे शक्य नसल्याचे टाळण्यासाठी %sला अपग्रेड करा" #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s %s पुरवते, परंतु ते अस्थापित होणार आहे." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s %s पुरवते, परंतु त्या %s ची दुसरी आवृत्ती आधीच स्थापित आहे." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s %s पुरवते, परंतु ते स्थापित करण्याजोगे नाही. अधिक माहितीसाठी ते स्वतःहूनच स्थापित " #~ "करण्याचा प्रयत्न करा" #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s %s पुरवते, परंतु त्याला कुलुप आहे " #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s %s पुरवते, परंतु ते ठेवण्यात येणार आहे." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s %s पुरवते, परंतु त्याचे दुसरे स्थापत्य आहे." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "%s साठी %s ची गरज पूर्ण करु शकत नाही" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "दुसर्या स्थापित होणार्या रिझॉल्व्हेल्बला %s ची गरज आहे, त्यामुळे त्याची लिंक जाणार नाही" #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "दुसर्या स्थापित होणार्या रिझॉल्व्हेल्बला %s ची गरज आहे, त्यामुळे त्याची लिंक जाणार नाही" #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "%s (%s) विषयीच्या वादामुळे स्थापित होणारे %s काढून टाकणे आवश्यक आहे" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "%s वरील विवादावरुन %s अस्थापित असल्याची खूण" #~ msgid "from %s" #~ msgstr "%s वरुन" #~ msgid " Error!" #~ msgstr "चूक!" #~ msgid " Important!" #~ msgstr "महत्वाचे!" #~ msgid "%s depended on %s" #~ msgstr "%s वर %s अवलंबून" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s ला %s ची गरज आहे" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s ला %s ची गरज आहे" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s च्या जागी %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s ला %s ची गरज आहे" #~ msgid "%s part of %s" #~ msgstr "%s हा %s चा भाग आहे" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s ला %s ची गरज आहे" #~ msgid "Unable to parse Url authority" #~ msgstr "Url अथॉरिटीचा संबंध सांगणे अशक्य" #~ msgid "Ignore this requirement generally" #~ msgstr "सर्वसाधारणपणे या गरजेकडे दुर्लक्ष करा" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "दुसर्या स्थापित होणार्या रिझॉल्व्हेल्बला %s ची गरज आहे, त्यामुळे त्याची लिंक जाणार नाही" #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "अपडेट स्थापना करण्यासाठी आवश्यक फाईल निर्माण करु शकत नाही" #~ msgid "Unable to restore all sources." #~ msgstr "सर्व स्रोत पुनर्स्थापित करणे अशक्य" #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "किमान एका स्रोताची आधीच नोंदणी आहे, साठवलेले स्रोत पुन्हा साठवता येऊ शकत नाहीत" #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "%s च्या डिपेन्डन्सीज पूर्ण करण्यासाठी %s स्थापित होऊ शकत नाही " #~ msgid "%s dependend on %s" #~ msgstr "%s वर %s अवलंबून" #~ msgid "Reading index files" #~ msgstr "इंडेक्स फाईल्स वाचत आहे" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "स्वाक्षरीची repomd.xml फाईल स्वाक्षरी तपासण्यात अयशस्वी." #~ msgid "Reading product from %s" #~ msgstr "%s वरून प्रॉडक्ट वाचत आहे" #~ msgid "Reading filelist from %s" #~ msgstr "%s वरून फाईलसूची वाचत आहे" #~ msgid "Reading packages from %s" #~ msgstr "%s वरून पॅकेजेस वाचत आहे" #~ msgid "Reading selection from %s" #~ msgstr "%s वरून सिलेक्शन वाचत आहे" #~ msgid "Reading pattern from %s" #~ msgstr "%s वरून नमुना वाचत आहे" #~ msgid "Reading patches index %s" #~ msgstr "%s वरून पॅच वाचत आहे" #~ msgid "Reading patch %s" #~ msgstr "पॅच %s वाचत आहे " #~ msgid "The script file failed the checksum test." #~ msgstr "स्क्रिप्ट फाईल चेकसम टेस्टमधे अयशस्वी." #~ msgid "Reading packages file" #~ msgstr "पॅकेज फाईल वाचत आहे" #~ msgid "Reading translation: %s" #~ msgstr "भाषांतर वाचत आहे: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "पॅकेज %s एकत्रित तपासणीत अयशस्वी. आपणास ते पुन्हा डाऊनलोड करण्याचा प्रयत्न करायचा " #~ "आहे की स्थापना काढून टाकायची?" #~ msgid " miss checksum." #~ msgstr "मिस चेकसम" #~ msgid " fails checksum verification." #~ msgstr "चेकसम पडताळणी अयशस्वी" #~ msgid "Downloading %s" #~ msgstr "%s डाऊनलोड करत आहे" libzypp-17.36.5/po/nb.po000066400000000000000000003700411476576476200150000ustar00rootroot00000000000000# translation of zypp.po to norsk bokmål # translation of zypp.po to # Norwegian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2002 SuSE GmbH. # Olav Pettershagen , 2006, 2007. # Rune Nordbøe Skillingstad , 2007. # Olav Pettershagen , 2008, 2009, 2013. # Olav P. , 2008. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-11-14 10:48+0000\n" "Last-Translator: Martin Hansen \n" "Language-Team: Norwegian Bokmål \n" "Language: nb\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: Weblate 5.8.3\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Ukjent land: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Ingen kode" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "De forente arabiske emirater" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" # AM # fuzzy #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Argentina" # AN # fuzzy #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Nederland" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktis" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS # fuzzy #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerika, Nord" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Østerrike" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" # CU # fuzzy #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Åland" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Aserbadjan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia og Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgia" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasil" # BS # fuzzy #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvetøya" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" # BZ # fuzzy #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belgia" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyene" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF # fuzzy #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Den sentralafrikanske republikken" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Sveits" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Elfenbenskysten" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookøyene" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" # CU # fuzzy #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kapp Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Christmasøya" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Kypros" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tsjekkia" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Tyskland" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danmark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Den dominikanske republikk" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algerie" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estland" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Vest-Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spania" # ET # fuzzy #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Estonia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøyene (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikronesiaføderasjonen" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Færøyene" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Frankrike" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Frankrike (Europa)" # GH # fuzzy #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Storbritannia" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Fransk Guiana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH # fuzzy #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grønland" # GM # fuzzy #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Jamaica" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatorial-Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Hellas" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Sør-Georgia og De sørlige sandwichøyene" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" # GH # fuzzy #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heardøya og Mcdonaldøyene" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungarn" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isle of Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britisk territorium i Indiahavet" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Israel" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" # KZ # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgisistan" # KH # fuzzy #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodsja" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komorene" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "St. Kitts og Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Nord-Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Sør-Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Caymanøyene" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kasakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "St. Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" # LR # fuzzy #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litauen" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvia" # LR # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libya" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshalløyene" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonia" # ML # fuzzy #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Malta" # MM # fuzzy #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Panama" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Nord-Marianene" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" # MR # fuzzy #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Lituaisk" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Lituaisk" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Malta" # MW # fuzzy #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malta" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mosambik" # GM # fuzzy #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" # NC # fuzzy #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Ny-Caledonia" # NG # fuzzy #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolkøyene" # NG # fuzzy #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nederland" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norge" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "New Zealand" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Fransk Polynesia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Ny-Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filippinene" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polen" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre og Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestina" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russland" # RW # fuzzy #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomonøyene" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychellene" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Sverige" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "St. Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO # fuzzy #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome og Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Serbia" # SZ # fuzzy #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Thailand" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøyene" # TD # fuzzy #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tsjad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Sørlige franske territorier" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadsjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Øst-Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Tyrkia" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" # UG # fuzzy #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Canada" # UM # fuzzy #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Amerikas forente stater" # US # fuzzy #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Amerikas forente stater" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Usbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "St. Vincent og Grenadinene" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Jomfruøyene" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Jomfruøyene, USA" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis og Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Sør-Afrika" # ZM # fuzzy #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Jamaica" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Inneholder" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Forutsetninger" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Krever" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Konflikter" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Foreldes" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Anbefalt" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Forslag" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Forbedringer" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Tillegg" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Ukjent språk: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" # AZ #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhasisk" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Akinesisk" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-asiatisk (annet)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikansk" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" # AZ #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akansk" # AZ #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadisk" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albansk" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutisk" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonquianske språk" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Sør-altaisk" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharisk" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Engelsk, gammelengelsk (ca. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apache-språk" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabisk" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Arameisk" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonesisk" # AM # fuzzy #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armensk" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucaniansk" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Kunstspråk (annet)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamesisk" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturiansk" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapascanske språk" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australske språk" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarisk" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestasisk" # SZ # fuzzy #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" # MM # fuzzy #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Aserbadjansk" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke-språk" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkirisk" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinesisk" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskisk" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltisk (annet)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Belarusisk" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengalsk" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber-språk (annet)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (annet)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnisk" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonsk" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginesisk" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarsk" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmesisk" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Mellomamerikansk indiansk (annet)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Karibisk" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalansk" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukasisk (annet)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltisk (annet)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tsjetsjensk" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kinesisk" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook-sjargong" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Kirkeslavisk" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Chamiske språk" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptisk" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Kornisk" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsikansk" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreolsk og pidgin, engelskbasert (annet)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreolsk og pidgin, franskbasert (annet)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreolsk og pidgin, portugisiskbasert (annet)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krim-tatar" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreolsk og pidgin (annet)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kashubiansk" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitisk (annet)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tsjekkisk" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dansk" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slavisk (athapascansk)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidisk (annet)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Sorbiansk, nedre" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Mellomnederlandsk (ca. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nederlandsk" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egyptisk (gammelt)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamitisk" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engelsk" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Engelsk, mellomengelsk (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estisk" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Færøyisk" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fiji" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filippinsk" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finsk" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finsk-ugrisk (annet)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Fransk" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Fransk, mellomfransk (ca. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Fransk, gammelfransk (842-ca. 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisisk" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friuliansk" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" # GH # fuzzy #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germansk (annet)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgisk" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Tysk" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertesisk" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gælisk" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irsk" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galisisk" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Mansk" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Tysk, mellomhøytysk (ca. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Tysk, gammelhøytysk (ca. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotisk" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Gresk, gammelgresk (til 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Gresk, moderne (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitisk" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiiansk" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebraisk" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittitisk" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hirimotu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Sorbiansk, øvre" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ungarsk" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandsk" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indisk (annet)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesisk" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoeuropeisk (annet)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingusj" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iransk (annet)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokesiske språk" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiensk" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanesisk" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japansk" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeopersisk" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeoarabisk" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmirsk" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kasakstansk" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardiansk" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (annet)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanesisk" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgisisk" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreansk" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraeansk" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdisk" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laotisk" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latin" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvisk" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghiansk" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgansk" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litauisk" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgisk" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" # GH # fuzzy #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya og Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonsk" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Maduresisk" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallisk" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalamsk" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesisk (annet)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" # MW # fuzzy #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malayisk" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" # MM # fuzzy #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irsk, mellomirsk (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Diverse språk" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (annet)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagasisk" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltisk" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo-språk" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldovisk" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolsk" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Flere språk" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda-språk" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandesisk" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Maya-språk" # SY # fuzzy #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Nordamerikansk indiansk" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitansk" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, sør" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, nord" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Lavtysk" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalsk" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepalsk bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-kordofaniansk (annet)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueansk" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norsk nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norsk bokmål" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norrønt, gammelnorrønt" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norsk" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho, nordlig" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubiske språk" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Klassisk Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Oksitansk (etter 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetisk" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Tyrkisk, ottomansk (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomianske språk" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuansk (annet)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinansk" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauansk" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persisk, gammelpersisk (ca. 600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persisk" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filippinsk (annet)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fønisisk" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polsk" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeiansk" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugisisk" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakrit-språk" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provensalsk, gammelprovensalsk (til 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongansk" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romansk (annet)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Retoromansk" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romsk" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumensk" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russisk" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Søramerikansk indiansk (annet)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salisjanske språk" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritansk arameisk" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbisk" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliansk" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Skotsk" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroatisk" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semittisk (annet)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irsk, gammelirsk (til 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Tegnspråk" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouanske språk" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sinotibetansk (annet)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavisk (annet)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakisk" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovensk" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sørsamisk" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Nordsamisk" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Samiske språk (annet)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lulesamisk" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Enaresamisk" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoisk" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skoltesamisk" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdiansk" # SO # fuzzy #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalisk" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, sørlig" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spansk" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinsk" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilosaharansk (annet)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sudanesisk" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerisk" # SZ # fuzzy #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Svensk" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syrisk" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitisk" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (annet)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamilsk" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadsjikisk" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalogsk" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetansk" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" # NG # fuzzy #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingonsk" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamasjek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tongaøyene)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmensk" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi-språk" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Tyrkisk" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaisk (annet)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuviniansk" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritisk" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighursk" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainsk" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Udefinert" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Usbekistansk" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamesisk" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votisk" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakasjanske språk" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Walisisk" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbianske språk" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Wallonsk" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapesisk" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" # CU # fuzzy #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupik-språk" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Følgende handlinger vil bli utført:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "ukjent" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "støttes ikke" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Nivå 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Nivå 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Nivå 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Kundekontrakt kreves" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Utgått og erstattet av en annen pakke" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "ugyldig" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Brukerstøttenivå er ikke angitt" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Produsenten tilbyr ikke støtte." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Problembeskrivelse, dvs. teknisk støtte som er utformet for å gi informasjon " "om kompatibilitet, installasjonshjelp, brukerstøtte, kontinuerlig " "vedlikehold og grunnleggende feilsøking. Nivå 1-brukerstøtte omfatter ikke " "retting av produktfeil." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Problemidentifikasjon, dvs. teknisk støtte som er utformet for å gjenskape " "kundens problemer, identifisere problemområdet og løse problemer som ikke " "blir løst med Nivå 1-brukerstøtte." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Problemløsning, dvs. teknisk støtte som er utformet for å løse sammensatte " "problemer ved hjelp av teknisk ekspertise, og som kan rette produktfeil som " "er identifisert med Nivå 2-brukerstøtte." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Brukerstøtte krever en tilleggskundekontrakt." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Pakken har utgått og har blitt erstattet av en ny pakke med et nytt navn." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Ukjent brukerstøttevalg. Ingen beskrivelse tilgjengelig" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Systemadministrasjonen er låst av programmet med pid %d (%s).\n" "Lukk dette programmet før du forsøker igjen." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Ukjent samsvarsmodus '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Ukjent samsvarsmodus '%s' for mønsteret '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Ugyldig regulært uttrykk '%s': regcomp returnerte %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ugyldig regulært uttrykk '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autentisering kreves for '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Vil forsøke igjen..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Gir opp etter %1% forsøk." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besøk SUSE-kundesenter for å sjekke om registreringen din er gyldig og ikke " "har utløpt." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besøk Novell kundesenter for å kontrollere om din registrering er gyldig og " "ikke er utløpt." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Opprett tilknytningspunkt: Kan ikke finne skrivbar mappe å opprette et " "tilknytningspunkt" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Installer pakken 'lsof' først." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Kan ikke opprette katalog for metadatamellomlager." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Feil under lesing fra '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Kan ikke opprette %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Kunne ikke hente nye pakkebrønn metadata." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "Kunne ikke hurtiglagre pakkebrønn ( kan ikke starte repo2solv )." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Kunne ikke mellomlagre pakkebrønn (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Bygger pakkebrønnmellomlager '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Kan ikke opprette mellomlager på %s - skrivebeskyttet." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Kunne ikke hurtiglagre pakkebrønn %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Pakkebrønntypen er ugyldig" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Legger til pakkebrønn '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Ugyldig pakkebrønnfilnavn på '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Kan ikke åpne filen '%s' for å skrive til den." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Ukjent feil ved lesing fra '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Kan ikke lese pakkebrønn mappe '%1%': Tilgang nektet" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Kunne ikke lese mappen '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Kan ikke lese pakkebrønn fil '%1%': Tilgang nektet" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Renser metadata" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Renser pakker" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Renser hurtiglager mapper" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Renser mapper: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Renser hurtiglager" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Laster fra hurtiglager" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Fjerner pakkebrønnen '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Finner ikke ut hvor pakkebrønnen er lagret." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Kan ikke slette '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Endrer pakkebrønn" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Oppdaterer Pakkebrønn: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Finner ikke ut hvor tjenesten er lagret." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Ukjent tjeneste '%1%': Fjerner foreldreløs tjeneste pakkebrønn '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Et pakkebrønnalias kan ikke begynne med punktum." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Tjenestealiaset kan ikke begynne med punktum." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Ingen sammendrag for filen %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Ukjent sammendrag %s for filen %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Sammendragsbekreftelse mislyktes for filen '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Filen '%s' er usignert, fortsett?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Filen '%s' fra pakkebrønn '%s' er usignert, fortsett?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Vil du avvise nøkkelen, stole midlertidig, eller alltid stole på?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nøkkel Navn: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "Mottok %1% ny pakkesigneringsnøkkel fra pakkebrønn \"%2%\":" msgstr[1] "Mottok %1% nye pakkesigneringsnøkler fra pakkebrønn \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Signaturbekreftelse mislyktes for filen '%1%'." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "Signaturbekreftelse mislyktes for filen '%1%' fra pakkebrønn '%2%'." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Vil du fortsette?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Filen '%s' er signert med en ukjent nøkkel '%s'. Fortsett?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Filen '%s' fra pakkebrønn '%s' er signert med en ukjent nøkkel '%s'. " "Fortsett?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Pakkebrønn %1% definerer ikke ytterligere 'gpgkey=' URLer." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Ser etter gpg-nøkkel med ID %1% i pakkebrønn %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Ser etter gpg-nøkkel med ID %1% i hurtiglager %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Nødvendig attributt '%s' mangler." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Én eller begge attributtene '%s' eller '%s' kreves." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Signaturbekreftelse mislyktes" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Det ser ut til at pakken %s har blitt skadet under overføring. Vil du prøve " "å laste den ned på nytt?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Kunne ikke hente pakken %s. Vil du førsøke å hente den på nytt?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm-kontroll mislyktes." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm mislyktes." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Ingen tillatelse til å skrive pakkebrønn hurtiglager." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Tjeneste-programtillegg støtter ikke endring av egenskap." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Kan ikke hente filen '%s' i pakkebrønnen '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Ingen nettadresse i pakkebrønn." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Forventet medium %1%/%2% identifisert av filen '%3%' med innhold:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Filen %1%\n" " fra pakke\n" " %2%\n" " er i konflikt med filen fra pakke\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Filen %1%\n" " fra pakke\n" " %2%\n" " er i konflikt med filen fra installasjon av\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Filen %1%\n" " fra installasjon av\n" " %2%\n" " er i konflikt med filen fra pakke\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Filen %1%\n" " fra installasjon av\n" " %2%\n" " er i konflikt med filen fra installasjon av\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "File %1%\n" " fra pakke\n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra pakke\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "File %1%\n" " fra pakke\n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra installasjon av\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Filen %1%\n" " fra installasjon av\n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra pakke\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Filen %1%\n" " fra installasjon av \n" " %2%\n" " er i konflikt med filen\n" " %3%\n" " fra installasjon av\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Kan ikke opprette sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "ignorer noen avhengigheter selv om %s ikke vil fungere" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "generelt ignorer noen avhengigheter" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "den installerte %1% tilhører ikke et oppgraderings-pakkebrønn og må bli " "erstattet" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "Det som skal installeres %1% tilhører ikke en oppgraderings-pakkebrønn" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "det installerte %1% har en dårligere arkitektur" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "det som skal installeres %1% har en dårligere arkitektur" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problem med den installerte %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "kommandokonflikter" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "en konflikt" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "ingenting gir den etterspurte '%1%'" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Har du aktivert alle de nødvendige pakkebrønnene?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "den etterspurte pakken %1% eksisterer ikke" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "forespørselen støttes ikke" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' er anskaffet av systemet og kan ikke bli slettet" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% er ikke installerbar" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "ingenting tilbyr '%1%' påkrevd av den installerte %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "ingenting tilbyr '%1%' som er nødvendig av %2% for å bli installert" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "kan ikke installere både %1% og %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "den installerte %1% er i konflikt med '%2%' som gis av den installerte %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "den installerte %1% er i konflikt med '%2%' gitt av %3% som skal installeres" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "den som skal installeres %1% er i konflikt med '%2%' gitt av installerte %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "den som skal installeres %1% er i konflikt med '%2%' gitt av %3% som skal " "installeres" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "den installerte %1% har foreldet '%2%' gitt av den installerte %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "den installerte %1% har foreldet '%2%' gitt av den som skal installeres %3%" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "den som skal installeres %1% har foreldet '%2%' gitt av den installerte %3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "den som skal installeres %1% har foreldet '%2%' gitt av den som skal " "installeres %3%" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "den installerte %1% er i konflikt med '%2%' som er gitt av den selv" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "den som skal installeres %1% er i konflikt med '%2%' som er gitt av seg selv" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "den installerte %1% er påkrevd av '%2%', men dette kravet kan ikke gis" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "%1% som skal installeres krever '%2%', men dette kravet kan ikke gis" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "slettede leverandører: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "uinstallerbare nødvendige pakker: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "uinstallerbare nødvendige pakker: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% er enda ikke fullstendig integrert i %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Vanligvis vil du beholde PTF-ene og velge å ikke installere vedlikeholds-" "programfiks." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Fjerning av den installerte %1% i denne sammenhengen vil fjerne (ikke " "erstatte!) de inkluderte PTF-pakkene også." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF-ene burde bli fjernet ved å tilkalle '%1%'. Dette vil oppdatere de " "inkluderte PTF-pakkene i stedet for å fjerne dem." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Vanligvis vil du beholde PTF-ene eller velge å avbryte handlingen." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Den installerte %1% blokkerer den ønskede handlingen." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Vanligvis vil du beholde PTF-ene og velge å avbryte handlingen." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "fjern låsen for å tillate fjerning av %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "ikke installer %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "behold %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "fjern låsen for å tillate installasjonen av %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Denne kommandoen vil skade systemet!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorer advarsel om skadet system" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "ikke be om å installere en løsning som gir %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "ikke be om å slette alle løsningene som gir %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "ikke installer den nyeste versjonen av %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "behold %1% til tross for den dårlige arkitekturen" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "installer %1% til tross for den dårlige arkitekturen" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "beholde foreldet %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "installer %1% fra den ekskluderte pakkebrønnen" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "installer %1% selv om den er trukket tilbake" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "tillat installering av PTF-en %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "installer %1% selv om den er svartlistet" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "nedgradering av %1% til %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "arkitektur endring av %1% til %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "installer %1% (med leverandør endring)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "installer %1% fra leverandør %2%\n" " erstatter %3% fra leverandør %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "erstatting av %1% med %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "avinstallering av %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Kjører ettertransaksjon skript" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Kjører %1% skript" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "%1% skript utdata:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Installasjonen er avbrutt som angitt." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " kjørt" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " kjøring mislyktes" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s allerede kjørt som %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " kjøring ikke utført under avbrudd" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Feil ved sending av melding om oppdatering." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Melding om ny oppdatering" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Mottok signal :\"%1% (%2%)\", for å sikre konsistensen til systemet er det " "ikke mulig å avbryte kjørende rpm-transaksjon." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Utføringen av transaksjonen mislyktes på grunn av følgende problemer:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM mislyktes: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Kunne ikke importere offentlig nøkkel %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Kunne ikke fjerne offentlig nøkkel %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Pakkeoverskrift er ikke signert!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Pakkeinnhold er ikke signert!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Endrede konfigurasjonsfiler for %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm lagret %s som %s, men det var umulig å finne noen forskjell" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm lagret %s som %s.\n" "Her er de 25 første avvikende linjene:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm opprettet %s som %s, men det var umulig å finne noen forskjell" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm opprettet %s som %s.\n" "Her er de 25 første avvikende linjene:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Flere rpm-resultater" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "opprettet sikkerhetskopi %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Signaturen er OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Ukjent signatur type" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Signaturen verifiserer ikke" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Signaturen er OK, men nøkkelen er ikke til å stole på" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Signaturens offentlige nøkkel er ikke tilgjengelig" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Filen eksisterer ikke eller signaturen kan ikke bli sjekket" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Fil er usignert" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "utløper ikke" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "utløpt: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "utløper: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(utløper ikke)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(UTLØPT)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(utløper innen 24 t)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(utløper om %d dag)" msgstr[1] "(utløper om %d dager)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Forsøkte å importere ikke-eksisterende nøkkel %s til nøkkelring %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Kunne ikke importere nøkkel." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Kunne ikke slette nøkkel." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Signaturfilen %s ikke funnet" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tvilsom type '%s' for %u byte-kontrollsum '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Kunne ikke åpne pty: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Kan ikke åpne pipe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Ugyldig LDAP URL-spørringsstreng" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Ugyldig LDAP URL-spørringsparameter %s" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Kan ikke klone URL-objekt" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Ugyldig referanse til tomt URL-objekt" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Kan ikke analysere URL-komponenter" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historie:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Adressestrategi tillater ikke %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Ugyldig %s komponent %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Ugyldig %s komponent" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Analyse av spørringsstreng støttes ikke for denne URL-en" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Adressestrategi er en obligatorisk komponent" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Ugyldig adressestrategi %s" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Adressestrategi tillater ikke brukernavn" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Adressestrategi tillater ikke passord" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Adressestrategi krever en vertskomponent" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Adressestrategi tillater ikke en vertskomponent" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Ugyldig vertskomponent %s" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Adressestrategi tillater ikke port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Ugyldig portkomponent %s" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Adressestrategi krever banenavn" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relativ sti ikke tillatt hvis autoritet finnes" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Kodet streng inneholder nullbyte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Ugyldig skilletegn for deling av parametermatrise" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Ugyldig skilletegn for deling av parametertilordning" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Ugyldig skilletegn for sammenføyning av parametermatrise" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Kommandoen ble avsluttet med status %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Kommandoen ble drept av signalet %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Kommandoen ble avsluttet med en ukjent feil." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Ugyldige spawn-argumenter gitt." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Kan ikke opprette kontrollrør." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Kan ikke kjøre chroot til '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Kan ikke kjøre chdir til «%s» (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Kan ikke kjøre chdir til «%s» fra chroot «%s» (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Kan ikke kjøre '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Kan ikke splitte (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Kan ikke utføre '%s', chdir mislykket (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Kan ikke utføre '%s', chroot mislykket (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Kan ikke utføre '%s', utførelsen mislyktes (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Kan ikke utføre '%s', uventet feil." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Kunne ikke montere %s på %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Kunne ikke avmontere %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Ugyldig filnavn: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Mediet ble ikke åpnet da handlingen ble forsøkt utført '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Filen '%s' ikke funnet på medium '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Kan ikke lagre filen '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Medium ikke tilkoblet" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Ugyldig tilkoblingspunkt for medier" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Initialisering av nedlasting (curl) mislyktes for '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Systemunntak '%s' på mediet '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Stien '%s' på mediet '%s' er ikke en fil." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Stien '%s' på mediet '%s' er ikke en katalog." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Feilformatert URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Vertsnavn mangler i URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Filsystem mangler i URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destinasjon mangler i URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "URI-skjema som ikke støttes i '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Handlingen støttes ikke av mediet" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Nedlastingsfeil (curl) for '%s':\n" "Feilkode: %s\n" "Feilmelding: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Feil under definisjon av nedlastingsvalg (curl) for '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Mediekilde '%s' inneholder ikke ønsket medium" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Mediet '%s' benyttes av en annen prosess" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Kan ikke løse ut medium" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Kan ikke løse ut mediet '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Tilgang til '%s' avvist." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Tidsavbrudd under tilgang '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Nedlastede data overskred den forventede filstørrelsen '%s' av '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Plasseringen '%s' er midlertidig utilgjengelig." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL-sertifikatproblem, bekreft at CA-sertifikat er OK for '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Ingen tilgjengelige ressurser for å legge ved medium." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "HTTP-autentiseringsmetode '%s' er ikke støttet" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Last ned (curl) feil for '%s':\n" "Feil kode: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Last ned (curl) feil for '%s':\n" "Kunne ikke hente HTTP-svar\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ja" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nei" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Notat:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Advarsel:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Feil:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "fullført" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "oppmerksomhet" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "feil" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Advarsel: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Henter:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "starter" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "ikke funnet" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Ingen tilgjengelig hjelp for denne meldingen." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "ingen tilgjengelig hjelp for dette valget" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "Vis alle alternativer" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ja" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nei" #, fuzzy #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Ingen gyldige metadata funnet på spesifisert(e) nettadresse(r)" #~ msgstr[1] "Ingen gyldige metadata funnet på spesifisert(e) nettadresse(r)" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s tilhører ikke en pakkebrønn for distribusjonsoppgradering" #~ msgid "%s has inferior architecture" #~ msgstr "%s har foreldet arkitektur" #~ msgid "problem with installed package %s" #~ msgstr "problem med den installerte pakken %s" #~ msgid "nothing provides requested %s" #~ msgstr "ingenting inneholder den nødvendige %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Har du aktivert alle nødvendige pakkebrønner?" #~ msgid "package %s does not exist" #~ msgstr "pakken %s finnes ikke" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s er beskyttet av systemet, og kan ikke slettes." #~ msgid "%s is not installable" #~ msgstr "%s kan ikke installeres" #~ msgid "nothing provides %s needed by %s" #~ msgstr "ingenting inneholder %s som kreves av %s" #~ msgid "cannot install both %s and %s" #~ msgstr "kan ikke installere både %s og %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s er i konflikt med %s fra %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s foreldede pakker %s fra %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "installert %s foreldede %s fra %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "løsningen %s er i konflikt med %s som den selv inneholder" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s krever %s, men denne nødvendige filen finnes ikke" #~ msgid "do not install %s" #~ msgstr "Ikke installer %s" #~ msgid "keep %s" #~ msgstr "behold %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "ikke forby installasjon av %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "ikke be om å installere en nødvendig pakke som gir %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "ikke be om å slette alle nødvendige pakker som gir %s" #~ msgid "do not install most recent version of %s" #~ msgstr "ikke installer nyeste versjon av %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "behold %s selv om arkitekturen er feil" #~ msgid "install %s despite the inferior architecture" #~ msgstr "installer %s selv om arkitekturen ikke er riktig" #~ msgid "keep obsolete %s" #~ msgstr "behold den foreldede pakken %s" #~ msgid "install %s from excluded repository" #~ msgstr "installer %s fra deaktivert pakkebrønn" #~ msgid "downgrade of %s to %s" #~ msgstr "nedgradering av %s til %s" #~ msgid "architecture change of %s to %s" #~ msgstr "Arkitekturendring fra %s til %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "installer %s (med produsentendring)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "%s erstattes av %s" #~ msgid "deinstallation of %s" #~ msgstr "avinstallasjon av %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Kan ikke åpne låsefil: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Denne handlingen utføres allerede av et annet program." #~ msgid "Hal Exception" #~ msgstr "Hal-unntak" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Beklager, men denne versjonen av libzypp er kompilert uten HAL-støtte." #~ msgid "HalContext not connected" #~ msgstr "HalContext ikke tilkoblet" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive ikke initialisert" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume ikke initialisert" #~ msgid "Unable to create dbus connection" #~ msgstr "Kan ikke opprette dbus-tilkobling" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Kan ikke opprette libhal-kontekst" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Kan ikke angi dbus-tilkobling" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Kan ikke initialisere HAL-kontekst, kjører ikke hald?" #~ msgid "Not a CDROM drive" #~ msgstr "Ikke en CD-ROM-stasjon" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Kan ikke initialisere muteksattributter" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Kan ikke angi rekursive muteksattributter" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Kan ikke initialisere rekursiv muteks" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Kan ikke oppnå mutekslås" #~ msgid "Can't release the mutex lock" #~ msgstr "Kan ikke frigi mutekslås" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Kunne ikke importere offentlig nøkkel fra filen %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Kunne ikke fjerne offentlig nøkkel %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Kan ikke finne noen tilgjengelig loop-enhet for å montere diskbildefilen " #~ "fra '%s'" #~ msgid "do not keep %s installed" #~ msgstr "ikke behold %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Kan ikke opprette den offentlige nøkkelen %s fra %s nøkkelringen for " #~ "filen %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Initialisering av nedlasting (Metalink curl) mislyktes for '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Nedlastingsfeil (curl) for '%s':\n" #~ "Feilkode: %s\n" #~ "Feilmelding: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Nedlasting avbrutt %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Nedlasting avbrutt av bruker" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Det oppstod en feil under definisjon av nedlastingsvalg (metalink curl) " #~ "for '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Kunne ikke laste ned %s fra %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia og Montenegro" #~ msgid "Unknown Distribution" #~ msgstr "Ukjent distribusjon" #~| msgid "Ignore some dependencies of %s" #~ msgid "ignore some dependencies of %s" #~ msgstr "ignorer noen avhengigheter for '%s'" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s har ingen kontrollsum.\n" #~ "Vil du bruke filen likevel?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s bestod ikke integritetskontroll med følgende nøkkel:\n" #~ "%s|%s|%s\n" #~ " Vil du bruke filen likevel?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s har en ukjent kontrollsum \n" #~ ".Forventet %s, men finner %s\n" #~ " Vil du bruke filen likevel?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s har en ukjent kontrollsum %s.\n" #~ "Vil du bruke filen likevel?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Filen %s er ikke signert.\n" #~ "Vil du bruke den likevel?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s er signert med en ukjent nøkkel:\n" #~ "%s|%s|%s\n" #~ " Vil du bruke filen likevel?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Upålitelig nøkkel funnet:\n" #~ "%s|%s|%s\n" #~ " Skal nøkkelen klareres likevel?" #~ msgid "%s remove failed" #~ msgstr "%s avinstallasjon mislyktes" #~ msgid "Invalid user name or password." #~ msgstr "Ugyldig brukernavn eller passord." #~ msgid "rpm output:" #~ msgstr "rpm-resultat:" libzypp-17.36.5/po/nl.po000066400000000000000000003745031476576476200150210ustar00rootroot00000000000000# translation of zypp.nl.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. # Rinse de Vries , 2006, 2007, 2008. # Freek de Kruijf , 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015. msgid "" msgstr "" "Project-Id-Version: zypp.nl\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2025-03-01 10:56+0000\n" "Last-Translator: Freek de Kruijf \n" "Language-Team: Dutch " "\n" "Language: nl\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: Weblate 5.10.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Onbekend land: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Geen code" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Verenigde Arabische Emiraten" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua en Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanië" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenië" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Nederlandse Antillen" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:80 #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarctica" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentinië" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikaans-Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Oostenrijk" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australië" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Åland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbeidzjan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnië en Herzegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "België" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgarije" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrein" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazilië" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahama's" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouveteiland" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Wit-Rusland" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Cocoseilanden" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Centraal Afrikaanse Republiek" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Zwitserland" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Ivoorkust" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookeilanden" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chili" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kameroen" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kaapverdië" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Christmaseiland" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cyprus" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tsjechië" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Duitsland" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Denemarken" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominicaanse Republiek" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algerije" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estland" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypte" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Westelijke Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanje" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Ethiopië" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandeilanden" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federale staten van Micronesia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faeröer" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Frankrijk" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Metropolitaans Frankrijk" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Verenigd Koninkrijk" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgië" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Frans-Guyana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinee" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Equatoriaal-Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Griekenland" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Zuid-Georgia en de Zuidelijke Sandwicheilanden" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinee-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard en McDonaldeilanden" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatië" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haïti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hongarije" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesië" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ierland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israël" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Man (eiland)" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Brits Indische Oceaanterritorium" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "IJsland" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italië" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordanië" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgizië" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodja" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comoren" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts en Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Noord-Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Zuid-Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Koeweit" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kaaimaneilanden" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazachstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Democratische Volksrepubliek Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Sint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litouwen" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letland" # ../../db/printers.ycp.noloc:1400 #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libië" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavië" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Sint-Maarten" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshalleilanden" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonië" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolië" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macau" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Noordelijke Marianen" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritanië" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Malediven" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Maleisië" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibië" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nieuw-Caledonië" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk (eiland)" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nederland" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noorwegen" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nieuw-Zeeland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Frans-Polynesië" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papoea-Nieuw-Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipijnen" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polen" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre en Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestijns Gebied" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Roemenië" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Servië" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russische Federatie" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saoedi-Arabië" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salomonseilanden" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychellen" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Soedan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Zweden" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sint-Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenië" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard en Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slowakije" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalië" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome en Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syrië" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- en Caicoseilanden" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tsjaad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Frans Zuidelijke Gebieden" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadzjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunesië" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Oost-Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkije" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad en Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Oekraïne" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Oeganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Kleine afgelegen eilanden van de Verenigde Staten" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Verenigde Staten" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Oezbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Staat Vaticaanstad" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Sint Vincent en de Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britse Maagdeneilanden" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Maagdeneilanden, V.S." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # /usr/lib/YaST2/clients/dialup_dev_cfg.ycp:82 #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis en Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Zuid-Afrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Levert" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Vereisten" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Vereist" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "In conflict met" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Verouderde onderdelen" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Beveelt aan" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Suggereert" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Verbetert" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Vult aan" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Onbekende taal: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar, Hamitisch" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abchazisch" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinees" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acholi" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adygees" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Aziatisch (overig)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Aino" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akaans" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadiaans" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanees" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleuts" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonquian-talen" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Zuid-Altai" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amhaars, Amharisch" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Engels, Oud (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apache-talen" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabisch" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramees" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonees" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armeens" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucaniaans" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Kunstmatig (overig)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamees, Assami" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturisch" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapascan-talen" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australische talen" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avaars, Awari" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestisch" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azeri, Azerbeidzjaans" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke-talen" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Basjkiers, Basjkirisch" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Balutsji, Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinees" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskisch" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Balinees" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltisch (overig)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Wit-Russisch" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengaals" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berbers (overig)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (overig)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnisch" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretons, Bretoens" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesië)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Boeriaats" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginees" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgaars" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmees" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Centraal-Amerikaans Indiaans (overig)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Caraïbisch" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalaans" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukasisch (overig)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltisch (overig)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Tsjibtsja" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tsjetsjeens" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinees" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook-jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyaans" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Kerkslavisch" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Tsjoevasjisch" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Chamische talen" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptisch" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornish" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corsicaans" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creools en Pidgin, op basis van Engels (overig)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creools en Pidgin, op basis van Frans (overig)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creools en Pidgin, op basis van Portugees (overig)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" # /usr/lib/YaST2/clients/lan_dns.ycp:87 # /usr/lib/YaST2/clients/lan_dns.ycp:87 #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krim-Tataars" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creools en Pidgin (overig)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kasjoebisch" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cusjitisch (overig)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tsjechisch" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Deens" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slavisch (Athapascaans)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidiaans (overig)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Nedersorbisch" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Nederlands, middel (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nederlands" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efikisch" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egyptisch (Oud)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamitisch" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engels" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Engels, Middel (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Ests" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faeröers" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijisch" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipijns" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Fins" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fins-Oegrisch (overig)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Frans" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Frans, Middel (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Frans, Oud (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Fries" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulisch" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germaans (overig)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgisch" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Duits" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertees" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Iers" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galicisch" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Duits, Middel Hoog (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Duits, Oud Hoog (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gothisch" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grieks, Oud (tot 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grieks, Modern (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haïtiaans" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiiaans" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebreeuws" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligainoons" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himatsjali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittitisch" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Oppersorbisch" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Hongaars" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Ibaans" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "IJslands" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sitsjuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indisch (overig)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesisch" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-Europees (overig)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingoesjetisch" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiak" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraans (overig)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Iroquoian-talen" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiaans" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javaans" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojbaans" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japans" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeo-Perzisch" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeo-Arabisch" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Katsjin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Groenlands" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada, Kanara, Kanarees" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kasjmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazachs" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardisch, Tsjerkessisch" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisaans (overig)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanees" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Gikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgizisch" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Congo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreaans" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraeaans" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karatsjay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Koerdisch" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenaïsch" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laotiaans" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latijn" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Lets" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghiaans" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgs" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litouws" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgs" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenia en Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedonisch" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurees" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahisch" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallees" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesisch (overig)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Maleis" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksja" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandars" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Iers, Middel (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Diverse talen" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (overig)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Plateaumalagasi" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltees" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo-talen" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavisch" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongools" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossisch" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Meerdere talen" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda-talen" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandees" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Maya-talen" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Noord-Amerikaans Indiaans" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitaans" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, Zuid" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, Noord" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Zuid-Duits" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalees" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Niaas" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofaniaans (overig)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueaans" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Noors Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Nynorsk en Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Noors, Oud" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Noors" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Noord-Sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubische talen" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Klassiek Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankools" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitaans (na 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osaags" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetisch, Osseets" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turks, Ottomaans (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Otomi-talen" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuaans (overig)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinaans" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pehlevi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Punjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauaans" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Perzisch, Oud (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Perzisch" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipijns (overig)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Foenisisch" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Pools" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeiaans" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugees" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakrit-talen" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provençaals, oud (tot 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Poesjto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongaans" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romaans (overig)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Retoromaans" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Roma" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Roemeens" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russisch" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Jakoets" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Zuid-Amerikaans Indiaans (overig)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salishan-talen" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritaans Aramees" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskriet" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasaaks" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Servisch" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliaans" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Schots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroatisch" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Sulkoeps" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitisch (overig)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Iers, Oud (tot 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Gebarentalen" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Sjaans" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singalees" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouaanse talen" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetaans (overig)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavisch (overig)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slowaaks" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Sloveens" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Zuid-Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Noord-Sami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Sami-talen (overig)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoaans" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdiaans" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalisch" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhaïsch" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Zuid-Sothaans" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spaans" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardinisch" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Saharaans (overig)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Soendanees" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerisch" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Zweeds" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syrisch" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitisch" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (overig)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tataars" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadzjieks" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetaans" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamasjek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tonga-eilanden)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimsjiaans" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmeens" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupi-talen" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turks" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaïsch (overig)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuviniaans" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurts" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritisch" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Oeigoers, Oejgoers" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Oekraïens" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Onbepaald" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Oezbeeks" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamees" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votisch" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakashan-talen" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Wasjo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Welsh" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbische talen" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Waals" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapees" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jiddisch" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupik-talen" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "De volgende acties worden uitgevoerd:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "onbekend" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "niet ondersteund" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Niveau 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Niveau 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Niveau 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Aanvullend gebruikerscontract noodzakelijk" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Gestopt en opgevolgd door een ander pakket" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "ongeldig" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Het ondersteuningsniveau is niet gedefinieerd" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "De verkoper levert geen ondersteuning." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Probleembepaling, wat technische ondersteuning betekent die is ontworpen " "voor het leveren van informatie over compatibiliteit, hulp bij installatie, " "ondersteuning bij gebruik, constant onderhoud en algemene " "probleemoplossing.. Niveau 1 ondersteuning is niet bedoeld om fouten in " "producten te verbeteren." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Probleemisolatie, wat technische ondersteuning betekent voor reproduceren " "van problemen bij klanten, probleemgebieden bepalen en oplossingen leveren " "voor problemen die niet opgelost worden door Niveau 1 ondersteuning." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Probleemoplossing, wat technische ondersteuning betekent voor het oplossen " "van complexe problemen door engineering in te schakelen bij het oplossen van " "productfouten die geïdentificeerd zijn in Niveau 2 ondersteuning." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" "Een aanvullend gebruikerscontract is noodzakelijk voor het verkrijgen van " "ondersteuning." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Het pakket is gestopt en is opgevolgd door een nieuw pakket met een andere " "naam." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Onbekende ondersteuningsoptie. Beschrijving niet beschikbaar" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Systeembeheer is geblokkeerd door de toepassing met pid %d (%s).\n" "Sluit deze toepassing voordat u het opnieuw probeert." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Onbekende overeenkomstmodus '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Onbekende overeenkomstmodus '%s' voor patroon '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Ongeldige reguliere expressie '%s': regcomp heeft %d geretourneerd" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ongeldige reguliere expressie '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Authenticatie vereist voor '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Zal het opnieuw proberen..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Opgegeven na %1% pogingen." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Het SUSE Customer Center bezoeken om te controleren of uw registratie geldig " "is en niet is verlopen." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Ga naar het Novell Customer Center om te controleren of uw registratie " "geldig is en niet is verlopen." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Aanknooppunt aanmaken: Kan geen beschrijfbare map vinden om een aanknooppunt " "aan te maken" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Eerst pakket 'lsof' installeren." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Kan map voor metadata-cache niet aanmaken." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Fout bij het lezen van '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Kan %s niet aanmaken" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Ophalen van metagegevens van opslagruimte is mislukt." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "In cache opslaan van opslagruimte is mislukt ( starten van repo2solv lukt " "niet )." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Kan opslagruimte (%d) niet opslaan in de cache." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Cache van opslagruimte '%s' wordt gebouwd" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Kan cache in %s niet aanmaken - geen toegangsrechten." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Opslagruimte %1% opslaan in cache is mislukt" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Niet behandeld type opslagruimte" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Bezig met toevoegen van installatiebron ‘%s’…" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Ongeldige naam van installatiebronbestand bij ‘%s’" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Kan bestand '%s' niet openen voor schrijven." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Onbekende fout bij lezen van '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Kan map '%1%' van opslagruimte niet lezen: Toegang geweigerd" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Het lezen van map '%s' is mislukt" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Kan opslagruimtebestand '%1%' niet lezen: Toegang geweigerd" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Metagegevens worden opgeschoond" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Pakketten worden opgeschoond" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Mappen voor cache worden opgeschoond" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Map %1% wordt opgeschoond" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Cache wordt opgeschoond" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Uit cache laden" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Bezig met verwijderen van installatiebron ‘%s’…" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Kan niet achterhalen waar opslagruimte is opgeslagen." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "‘%s’ kan niet worden verwijderd" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Opslagruimte wijzigen" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Opslagruimte wordt ververst: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Kan er niet achter komen waar de service is opgeslagen." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Onbekende service '%1%': Verweesde opslagruimte '%2%' verwijderen" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "De alias van een opslagruimte mag niet met een punt (.) beginnen." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "De alias van een service mag niet met een punt (.) beginnen." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Geen samenvatting voor bestand %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Onbekende samenvatting %s voor bestand %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Verificatie van samenvatting is mislukt voor bestand '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Bestand '%s' is ondertekend, doorgaan?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Bestand '%s' uit opslagruimte '%s' is niet ondertekend, doorgaan?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Wilt u de sleutel afwijzen, tijdelijk vertrouwen of altijd vertrouwen?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Sleutelnaam: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "Ontvangen %1% nieuwe sleutel voor ondertekening van pakketten uit " "opslagruimte \"%2%\":" msgstr[1] "" "Ontvangen %1% nieuwe sleutels voor ondertekening van pakketten uit " "opslagruimte \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Verificatie van ondertekening is mislukt voor bestand '%1%'." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Verificatie van ondertekening is mislukt voor bestand '%1%' uit opslagruimte " "'%2%'." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Wilt u doorgaan?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Bestand '%s' is ondertekend met een onbekende sleutel '%s'. Doorgaan?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Bestand '%s' uit opslagruimte '%s' is ondertekend met een onbekende sleutel " "'%s'. Doorgaan?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Opslagruimte %1% definieert geen extra URL's met 'gpgkey='." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Bezig met zoeken naar gpg-sleutel-id ‘%1%’ in %2%-installatiebron…" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Bezig met zoeken naar gpg-sleutel-id ‘%1%’ in %2%-cache…" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Vereist attribuut '%s' ontbreekt." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Een of beide kenmerken van '%s' of '%s' zijn vereist." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Verificatie van de ondertekening is mislukt" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Het pakket, ‘%s’, lijkt beschadigd te zijn tijdens de overdracht. Wilt u het " "opnieuw ophalen?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Het pakket, ‘%s’, is niet aangetroffen. Wilt u het opnieuw ophalen?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "controle van applydeltarpm is mislukt." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm mislukt." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Geen toestemming naar cache van opslagruimte te schrijven." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Service-plug-in ondersteunt geen wijzigen van een attribuut." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Kan bestand '%s' niet leveren uit opslagruimte '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Geen URL in opslagruimte." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Verwacht medium %1%/%2% geïdentificeerd door bestand '%3%' met inhoud:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Het bestand ‘%1%’\n" " in het pakket\n" " %2%\n" " botst met een bestand in het pakket\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Het bestand ‘%1%’\n" " in het pakket\n" " %2%\n" " botst met een geïnstalleerd bestand van\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Het bestand ‘%1%’\n" " van de installatie van\n" " %2%\n" " botst met een bestand van het pakket\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Het bestand ‘%1%’\n" " van de installatie van\n" " %2%\n" " botst met een bestand van de installatie van\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Het bestand ‘%1%’\n" " in het pakket\n" " %2%\n" " botst met het bestand\n" " %3%\n" " in het pakket\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Het bestand ‘%1%’\n" " in het pakket\n" " %2%\n" " botst met het bestand\n" " %3%\n" " van de installatie van\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Het bestand ‘%1%’\n" " van de installatie van\n" " %2%\n" " botst met het bestand\n" " %3%\n" " in het pakket\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Het bestand ‘%1%’\n" " van de installatie van\n" " %2%\n" " botst met het bestand\n" " %3%\n" " van de installatie van\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Kan sat-pool niet maken." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "doorbreek ‘%s’ door enkele afhankelijkheden te negeren" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "negeer normaliter enige afhankelijkheden" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "de geïnstalleerde %1% behoort niet tot een opslagruimte voor een " "opwaardering van de distributie en moet vervangen worden" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" "de te installeren %1% behoort niet tot een opslagruimte voor opwaarderen van " "een distributie" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "de geïnstalleerde %1% heeft een inferieure architectuur" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "de te installeren %1% heeft een inferieure architectuur" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "er is een probleem met het geïnstalleerde pakket ‘%1%’" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "conflicterende verzoeken" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "een afhankelijkheidsprobleem" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "niets levert de gevraagde ‘%1%’" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Zijn alle vereiste installatiebronnen ingeschakeld?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "het gevraagde pakket, ‘%1%’, bestaat niet" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "niet-ondersteund verzoek" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' wordt geleverd door het systeem en kan niet gewist worden" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% is niet te installeren" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" "er is geen pakket dat ‘%1%’ levert, benodigd door het geïnstalleerde %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" "er is geen pakket dat ‘%1%’ levert, benodigd door het te installeren %2%" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "zowel %1% als %2% kunnen niet worden geïnstalleerd" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "het geïnstalleerde %1% botst met ‘%2%’, zoals geleverd door het " "geïnstalleerde %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "het geïnstalleerde %1% botst met ‘%2%’, zoals geleverd door het te " "installeren %3%" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "het te installeren %1% botst met ‘%2%’, zoals geleverd door het " "geïnstalleerde %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "het te installeren %1% botst met ‘%2%’, zoals geleverd door het te " "installeren %3%" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "het geïnstalleerde %1% markeert ‘%2%’, geleverd door het geïnstalleerde %3%, " "als verouderd" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "het geïnstalleerde %1% markeert ‘%2%’, geleverd door het te installeren %3%, " "als verouderd" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "het te installeren %1% markeert ‘%2%’, geleverd door het geïnstalleerde %3%, " "als verouderd" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "het te installeren %1% markeert ‘%2%’, geleverd door het te installeren %3%, " "als verouderd" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "het geïnstalleerde %1% botst met ‘%2%’ dat zichzelf aanlevert" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "het te installeren %1% botst met ‘%2%’ dat zichzelf aanlevert" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "het geïnstalleerde %1% vereist ‘%2%’, maar deze vereiste kan niet geleverd " "worden" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "het te installeren %1% vereist ‘%2%’, maar deze vereiste kan niet geleverd " "worden" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "verwijderde diensten: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "niet-installeerbare diensten: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "niet-installeerbare diensten: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% is nog niet volledig geïntegreerd in %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Normaliter is het het beste als u de PTF wilt behouden en kiest om de " "patches voor onderhoud niet te installeren." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Het geïnstalleerde %1% in deze context zal de meegenomen PTF-pakketten ook " "verwijderen (niet vervangen)." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "De PTF zou verwijderd moeten worden door '%1%' aan te roepen. Dit zal de " "meegenomen PTF-pakketten bijwerken in plaats van ze te verwijderen." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "U wilt typisch de PTF behouden of kies om de actie te annuleren." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "De geïnstalleerde %1% blokkeert de gewenste actie." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" "U wilt typisch de PTF behouden en er voor kiezen de actie te annuleren." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "vergrendeling opheffen om verwijdering van %1% toe te staan" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "%1% niet installeren" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "%1% behouden" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "vergrendeling opheffen om installatie van %1% toe te staan" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Dit verzoek zal het systeem laten crashen!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "negeer de waarschuwing voor een gebroken systeem" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "niet vragen om een oplosbare te installeren die %1% levert" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "niet vragen om alle oplosbaren te verwijderen die %1% levert" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "recentste versie van %1% niet installeren" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "%1% behouden, ondanks de inferieure architectuur" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "%1% installeren, ondanks de inferieure architectuur" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "behoud het verouderde pakket ‘%1%’" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "%1% installeren uit genegeerde installatiebron" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "%1% installeren, hoewel het is ingetrokken" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "toestaan de PTF %1% te installeren" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "%1% installeren hoewel het op de zwarte lijst staat" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "%1% afwaarderen naar %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "architectuur van %1% wijzigen naar %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "%1% installeren (met leverancierswijziging)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "installeer %1% van leverancier %2%\n" " ter vervanging van %3% van leverancier %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "%1% vervangen door %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "verwijder ‘%1%’" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Scripts voor post-transaction uitvoeren" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Script %1% wordt uitgevoerd" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Uitvoer van script %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "De installatie is op verzoek afgebroken." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " uitgevoerd" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " het uitvoeren is mislukt" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s is al uitgevoerd als %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " uitvoeren is overgeslagen tijdens afbreken" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Het bijwerkbericht kan niet worden verstuurd." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nieuw updatebericht" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Ontvangen signaal :\"%1% (%2%)\", om de consistentie van het systeem te " "verzekeren is het niet mogelijk om een actieve rpm-transactie te annuleren." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" "Het uitvoeren van de overdracht is vanwege de volgende problemen mislukt:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "Geen mirror-server gevonden" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "Kon geen doelbestand aanmaken" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "Al in de cache" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "Tijdelijk bestand hernoemen is mislukt." #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "Beëindigd" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "Geannuleerd door gebruiker." #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM is mislukt: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Het importeren van de publieke sleutel %1% is mislukt" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Het verwijderen van de publieke sleutel %1% is mislukt" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "De pakketkop is niet ondertekend!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "De pakketinhoud is niet ondertekend!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Configuratiebestanden gewijzigd voor %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm heeft %s opgeslagen als %s, maar het was niet mogelijk om het verschil " "te bepalen" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm sloeg %s op als %s.\n" "Dit zijn de eerste 25 regels die verschillend zijn:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "rpm maakte %s aan als %s, maar het was niet mogelijk om het verschil te " "achterhalen" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm maakt %s aan als %s.\n" "Dit zijn de eerste 25 regels die verschillen:\n" # /usr/lib/YaST2/clients/lan_inetd_custom.ycp:162 #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Aanvullende rpm-uitvoer" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "reservekopie %s aangemaakt" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "De ondertekening is in orde" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Onbekend type ondertekening" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Ondertekening klopt niet" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Ondertekening is OK, maar sleutel kan niet worden vertrouwd" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Handtekeningen van publieke sleutel zijn niet beschikbaar" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Bestand bestaat niet of ondertekening kan niet gecontroleerd worden" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Bestand heeft geen ondertekening" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "vervalt niet" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "vervallen op %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "vervalt op %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(vervalt niet)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(VERVALLEN)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(vervalt binnen 24 uur)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(vervalt binnen %d dag)" msgstr[1] "(vervalt binnen %d dagen)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" "Er is een poging gedaan om een niet-bestaande sleutel, ‘%s’, te importeren " "in sleutelbos %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Het importeren is mislukt." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Het verwijderen is mislukt." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Het ondertekeningbestand, ‘%s’, is niet aangetroffen" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Twijfelachtig type '%s' voor %u bytes controlesom '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Kan pty (%s) niet openen." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Kan pipe (%s) niet openen." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Ongeldige LDAP-URL-querytekenreeks" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Ongeldige LDAP-URL-queryparameter '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Kan URL-object niet klonen" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Ongeldige lege URL-objectverwijzing" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Kan URL-componenten niet analyseren" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Geschiedenis:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "%s is niet toegestaan in URL-schema" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Ongeldige %s-component '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Ongeldige %s-component" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Parseren van queryreeks wordt niet ondersteund voor deze URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL-schema is een vereiste component" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Ongeldig URL-schema '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Gebruikersnaam is niet toegestaan in URL-schema" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Wachtwoord is niet toegestaan in URL-schema" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "URL-schema vereist hostcomponent" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Hostcomponent is niet toegestaan in URL-schema" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Ongeldige hostcomponent '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Poort is niet toegestaan in URL-schema" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Ongeldige poortcomponent '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "URL-schema vereist padnaam" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relatief pad is niet toegestaan als authority bestaat" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Gecodeerde reeks bevat een NUL byte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Ongeldig scheidingsteken voor splitsen parametermatrix" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Ongeldig scheidingsteken voor splitsen parametertoewijzing" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Ongeldig scheidingsteken voor samenvoegen parametermatrix" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "De opdracht is beëindigd met status %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "De opdracht is afgebroken door signaal %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "De opdracht is beëindigd met een onbekende foutmelding." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Ongeldige afsplits argumenten gegeven." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Pipe voor besturing maken lukt niet." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Kan geen chroot doen naar '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Kan geen chdir doen naar '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Kan geen chdir naar '%s' doen binnen chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Kan '%s' niet uitvoeren (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Kan geen fork (%s) uitvoeren." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Kan '%s' niet uitvoeren, chdir is mislukt (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "'%s' uitvoeren lukt niet, chroot is mislukt (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "'%s' uitvoeren lukt niet, exec is mislukt (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "'%s' uitvoeren lukt niet, onverwachte fout." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Kan %s niet koppelen aan %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Ontkoppelen van %s is mislukt" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Onjuiste bestandsnaam: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Medium kan niet worden geopend wanneer '%s' wordt uitgevoerd." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Bestand '%s' niet gevonden op medium '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Kan niet naar bestand '%s' schrijven." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Medium is niet gekoppeld" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Beschadigd koppelpunt van medium" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Initialiseren van downloaden (curl) is mislukt voor '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Systeemuitzondering '%s' op medium '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Pad '%s' op medium '%s' is geen bestand." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Pad '%s' op medium '%s' is geen map." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Onjuiste URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Lege hostnaam in URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Leeg bestandssysteem in URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Lege bestemming in URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Niet-ondersteund URI-schema in '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Bewerking niet ondersteund door medium" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Fout bij downloaden (curl) '%s':\n" "Foutcode: %s\n" "Foutbericht: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Fout bij het instellen downloadopties (curl) voor '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Mediumbron '%s' bevat niet het gewenste medium" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Medium '%s' wordt door een andere instantie gebruikt" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Kan geen media uitwerpen" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Kan medium '%s' niet uitwerpen" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Toegang tot '%s' geweigerd." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Time-out overschreden bij toegang tot '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "Gedownloade gegevens overtreffen de verwachte bestandsgrootte '%s' van '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Locatie '%s' is tijdelijk niet toegankelijk." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL-certificaatprobleem, controleer of de CA-cert OK is voor '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Geen vrije hulpbronnen om medium aan te koppelen." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Niet-ondersteunde HTTP-authenticatiemethode '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Fout bij download (curl) voor '%s':\n" "Foutcode: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Fout bij downloaden (curl) voor '%s':\n" "Kan HTTP-respons niet ophalen\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ja" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nee" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Opmerking:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Waarschuwing:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Foutmelding:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "gereed" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "attentie" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "foutmelding" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Waarschuwing: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Bezig met ophalen van:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "bezig met starten" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "niet gevonden" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Geen hulp beschikbaar voor deze prompt." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "geen hulp beschikbaar voor deze optie" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "alle opties tonen" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ja" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nee" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Geen geldige metagegevens op de gespecificeerde URL gevonden" #~ msgstr[1] "Geen geldige metagegevens op de gespecificeerde URL's gevonden" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Bezig met uitvoeren van %%posttrans-script ‘%1%’…" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "De %posttrans-scripts zijn uitgevoerd" #~ msgid "Package is not signed!" #~ msgstr "Pakket is niet ondertekend!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s behoort niet tot een opslagruimte voor distributie-upgrade" #~ msgid "%s has inferior architecture" #~ msgstr "%s heeft een slechtere architectuur" #~ msgid "problem with installed package %s" #~ msgstr "probleem met geïnstalleerd pakket %s" #~ msgid "nothing provides requested %s" #~ msgstr "Niets levert het gevraagde %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Hebt u alle vereiste opslagruimtes ingeschakeld?" #~ msgid "package %s does not exist" #~ msgstr "pakket %s bestaat niet" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s wordt door het systeem geleverd en kan niet gewist worden" #~ msgid "%s is not installable" #~ msgstr "%s is niet geïnstalleerd" #~ msgid "nothing provides %s needed by %s" #~ msgstr "niets levert %s nodig door %s" #~ msgid "cannot install both %s and %s" #~ msgstr "kan %s en %s niet beide installeren" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s is in conflict met %s die geleverd is door %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s maakt %s verouderd en is geleverd door %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "geïnstalleerd %s maakt %s verouderd en is geleverd door %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "oplosser %s is in conflict met %s die geleverd is door zichzelf" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s vereist %s, maar aan deze eis kan niet voldaan worden" #~ msgid "remove lock to allow removal of %s" #~ msgstr "verwijder de vergrendeling om de verwijdering van %s toe te staan" #~ msgid "do not install %s" #~ msgstr "%s niet installeren" #~ msgid "keep %s" #~ msgstr "%s behouden" #~ msgid "remove lock to allow installation of %s" #~ msgstr "verwijder de vergrendeling om de installatie van %s toe te staan" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "vraag niet om een oplossingspakket die %s levert te installeren" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "" #~ "vraag niet om alle oplossingspakketten die %s leveren te verwijderen" #~ msgid "do not install most recent version of %s" #~ msgstr "installeer de meest recente versie van %s niet" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s behouden ondanks de slechtere architectuur" #~ msgid "install %s despite the inferior architecture" #~ msgstr "%s installeren ondanks de slechtere architectuur" #~ msgid "keep obsolete %s" #~ msgstr "verouderde %s handhaven" #~ msgid "install %s from excluded repository" #~ msgstr "%s installeren uit een uitgesloten opslagruimte" #~ msgid "downgrade of %s to %s" #~ msgstr "downgrade %s tot %s" #~ msgid "architecture change of %s to %s" #~ msgstr "architectuurverandering van %s naar %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "%s installeren (met wijziging van leverancier)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "vervanging van %s door %s" #~ msgid "deinstallation of %s" #~ msgstr "verwijderen van %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Kan het blokkeringsbestand niet openen: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Deze actie is al bezig vanuit een ander programma." #~ msgid "Hal Exception" #~ msgstr "Hal-uitzondering" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Helaas, deze versie van libzypp is gebouwd zonder HAL-ondersteuning." #~ msgid "HalContext not connected" #~ msgstr "HalContext is niet verbonden" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive is niet geïnitialiseerd" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume is niet geïnitialiseerd" #~ msgid "Unable to create dbus connection" #~ msgstr "Kan de dbus-verbinding niet maken" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Kan libhal-context niet maken" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Kan dbus-verbinding niet instellen" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Kan HAL-context niet initialiseren, is hald niet actief?" #~ msgid "Not a CDROM drive" #~ msgstr "Geen cd-rom-station" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Kan mutex-kenmerk niet initialiseren" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Kan recursief mutex-kenmerk niet instellen" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Kan recursieve mutex niet initialiseren" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Kan mutex-vergrendeling niet verkrijgen" #~ msgid "Can't release the mutex lock" #~ msgstr "Kan mutex-vergrendeling niet ontgrendelen" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Importeren van publieke sleutel uit bestand %s is mislukt: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Verwijderen van publieke sleutel %s is mislukt: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Kan geen beschikbaar lusapparaat vinden voor het koppelen van het " #~ "imagebestand van '%s'" #~ msgid "do not keep %s installed" #~ msgstr "houd %s niet geïnstalleerd" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Kan geen publieke sleutel %s uit %s sleutelring aanmaken naar bestand %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Download (Metalink curl) initialisatie mislukt voor '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Download (metalink curl) fout voor '%s':\n" #~ "Foutcode: %s\n" #~ "Foutboodschap: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Download onderbroken bij %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Download onderbroken door gebruiker" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "Fout bij het instellen downloadopties (metalink curl) voor '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Downloaden van %s op %s is mislukt" #~ msgid "Serbia and Montenegro" #~ msgstr "Servië en Montenegro" #~ msgid "Unknown Distribution" #~ msgstr "Onbekende distributie" #~ msgid "ignore some dependencies of %s" #~ msgstr "negeer enige afhankelijkheden van %s" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Bestand %s bevat geen checksum.\n" #~ "Wilt u het toch gebruiken?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Bestand %s voldoet niet aan integriteitscontrole door de volgende " #~ "sleutel:\n" #~ "%s|%s|%s\n" #~ " Wilt u het bestand toch gebruiken?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Bestand %s heeft een ongeldige checksum.\n" #~ "%s verwacht, %s gevonden\n" #~ "Wilt u het toch gebruiken?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Bestand %s heeft een onbekende checksum.%sWilt u het toch gebruiken?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Bestand %s is niet ondertekend.\n" #~ "Wilt u het toch gebruiken?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Bestand %s is ondertekend met een onbekende sleutel:\n" #~ "%s|%s|%s\n" #~ " Wilt u het bestand toch gebruiken?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Niet-vertrouwde sleutel gevonden:\n" #~ "%s|%s|%s\n" #~ " Sleutel vertrouwen?" libzypp-17.36.5/po/nn.po000066400000000000000000003121441476576476200150140ustar00rootroot00000000000000# @TITLE@ # Copyright (C) 2011, SUSE Linux GmbH, Nuremberg # This file is distributed under the same license as @PACKAGE@ package. FIRST # Karl Ove Hufthammer , 2015, 2017. msgid "" msgstr "" "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2022-05-29 21:13+0000\n" "Last-Translator: Karl Ove Hufthammer \n" "Language-Team: Norwegian Nynorsk \n" "Language: nn\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: Weblate 4.9.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Ukjent land: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Ingen kode" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Dei sameinte arabiske emirata" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua og Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Dei nederlandske Antillane" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktika" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikansk Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austerrike" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Aserbajdsjan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia-Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgia" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasil" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvetøya" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosøyane" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo-Brazzaville" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Den sentralafrikanske republikken" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Sveits" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Elfenbeinskysten" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookøyane" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kapp Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Christmasøya" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Kypros" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tsjekkia" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Tyskland" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danmark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Den dominikanske republikken" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algerie" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estland" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Vest-Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spania" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsøyane" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikronesiaføderasjonen" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Færøyane" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Frankrike" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Storbritannia" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Fransk Guyana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grønland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatorial-Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Hellas" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungarn" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Det britiske territoriet i Indiahavet" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgisistan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodsja" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komorane" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "St. Kitts og Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Caymanøyane" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kasakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "St. Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litauen" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marokko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshalløyane" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Nord-Marianane" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldivane" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mosambik" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Ny-Caledonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolkøya" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nederland" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noreg" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Naurisk" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "New Zealand" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Fransk Polynesia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Ny-Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filippinane" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polen" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre-et-Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugual" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russland" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi-Arabia" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salomonøyane" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychellane" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Sverige" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "St. Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard og Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé og Príncipe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- og Caicosøyane" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tsjad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Dei franske sørterritoria" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadsjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Tyrkia" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad og Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "USAs ytre småøyar" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "USA" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Usbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Jomfruøyane (Storbritannia)" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Jomfruøyane (USA)" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Sør-Afrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Krev" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Ukjent språk: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhasisk" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Acehnesisk" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adygeisk" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afroasiatiske (andre)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadisk" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albansk" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutisk" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharisk" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabisk" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonsk" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armensk" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Kunstspråk (andre)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assami" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturleonesisk" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarisk" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestisk" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Avadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Aserbajdsjansk" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Basjkirsk" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Balutsji" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskisk" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltisk (andre)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Belarusisk" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berbisk (andre)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (andre)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnisk" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonsk" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarsk" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmesisk" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalansk" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukasisk (andre)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltisk (andre)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tsjetsjensk" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kinesisk" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Kyrkjeslavisk" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Tsjuvasjisk" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptisk" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Kornisk" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsikansk" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tsjekkisk" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dansk" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidisk" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Lågsorbisk" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nederlandsk" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engelsk" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estisk" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Færøysk" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijiansk" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finsk" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finsk-ugrisk" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Fransk" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulfulde" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germansk (andre)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgisk" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Tysk" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Kiribatisk" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gælisk" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irsk" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galisisk" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotisk" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Gammalgresk (fram til 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitisk" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebraisk" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hettittisk" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Høgsorbisk" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ungarsk" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Ibo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandsk" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuittisk" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesisk" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoeuropeisk" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiak" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiensk" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanesisk" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japansk" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Grønlandsk" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kasjmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kasakhisk" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgisisk" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreansk" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdisk" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laotisk" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latin" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvisk" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litauisk" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxembourgsk" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya og Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonsk" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallesisk" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malayisk" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Gassisk" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltesisk" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Mandsju" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Rumensk (utdatert)" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolsk" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitansk" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Lågtysk" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norsk (nynorsk)" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norrønt" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norsk" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Nordsotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Oksitansk (etter 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetisk" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persisk" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fønikisk" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polsk" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Ponapisk" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugisisk" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pashto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romansk (andre)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumensk" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russisk" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbisk" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliansk" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroatisk" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkupisk" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semittisk (andre)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Gammalirsk (fram til 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Teiknspråk" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singalesisk" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-tibetansk (andre)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavisk (andre)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakisk" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovensk" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sørsamisk" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Nordsamisk" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lulesamisk" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Enaresamisk" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoansk" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skoltesamisk" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sørsotho" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spansk" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardisk" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanesisk" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumerisk" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Svensk" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitisk" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (andre)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatarisk" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadsjikisk" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetansk" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigré" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinja" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tongansk" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Setswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmensk" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Tyrkisk" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaisk (andre)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uigurisk" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainsk" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Usbekisk" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamesisk" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Walisisk" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Vallonsk" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapesisk" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jiddisch" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Joruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Desse handlingane vert utførte:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Ukjend samsvarsmodus «%s»" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Ukjend samsvarsmodus «%s» for mønsteret '%s'." #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Installer pakken «lsof» først." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Byggjer mellomlager for pakkebrønnen «%s»" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Fjernar pakkebrønnen «%s»" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Vil du halda fram?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Fila %1%\n" " frå pakken\n" " %2%\n" " er i konflikt med fil frå pakken\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Fila %1%\n" " frå pakken\n" " %2%\n" " er i konflikt med fil frå installeringa av\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Fila %1%\n" " frå installeringa av\n" " %2%\n" " er i konflikt med fil frå pakken\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Fila %1%\n" " frå installeringa av\n" " %2%\n" " er i konflikt med fil frå installering av\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Fila %1%\n" " frå pakken\n" " %2%\n" " er i konflikt med fila\n" " %3%\n" " frå pakken\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Fila %1%\n" " frå pakken\n" " %2%\n" " er i konflikt med fila\n" " %3%\n" " frå installeringa av\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Fila %1%\n" " frå installeringa av\n" " %2%\n" " er i konflikt med fila\n" " %3%\n" " frå pakken\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Fila %1%\n" " frå installeringa av\n" " %2%\n" " er i konflikt med fila\n" " %3%\n" " frå installeringa av\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Denne kommandoen vil skada systemet!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr "" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Melding om ny oppdatering" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Fann ikkje fila «%s» på mediet «%s»" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Ugyldig URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ja" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nei" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Åtvaring: " #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Feil" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "fullført" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "feil" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Åtvaring: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Hentar:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "startar" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Fann ikkje" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Det finst ikkje noko hjelp tilgjengeleg for denne meldinga." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "finst ikkje hjelp for denne meldinga" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "vis alle val" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ja" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nei" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s er i konflikt med %s frå %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "løysbare %s konfliktar med %s tilgjengeleg frå seg sjølv" #~ msgid "Hal Exception" #~ msgstr "Hal-unntak" libzypp-17.36.5/po/pa.po000066400000000000000000004365651476576476200150170ustar00rootroot00000000000000# translation of zypp.pa.po to Panjabi # Punjabi message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2005 SUSE Linux Products GmbH. # Jaswinder Singh Phulewala # Kanwaljeet Singh Brar # # A S Alam , 2007. msgid "" msgstr "" "Project-Id-Version: zypp.pa\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2007-08-23 19:28+0530\n" "Last-Translator: A S Alam \n" "Language-Team: Panjabi \n" "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: KBabel 1.11.4\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "ਅਣਜਾਣ ਦੇਸ਼: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "ਕੋਡ ਨਹੀਂ" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "ਆਂਡੋਰਾ" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "ਸੰਯੁਕਤ ਅਰਬ ਅਮੀਰਾਤ" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "ਅਫਗਾਨਿਸਤਾਨ" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "ਐਟੀਗੁਆ ਅਤੇ ਬਾਰਮੁਦਾ" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "ਅੰਗੂਲੀਆਂ" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "ਅਲਬੀਨਾ" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "ਅਮਰੀਨੀਅਨ" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "ਨੀਂਦਰਲੈਂਡ ਐਂਟੀਲਸ" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "ਅੰਗੋਲਾ" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "ਐਟਰਾਟਿਕਾ" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "ਅਰਜਨਟੀਨਾ" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "ਅਮਰੀਕੀ ਸਮੋਨਾ" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "ਆਸਟਰੀਆ" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "ਅਸਟਰੇਲੀਆ" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "ਅਰੂਬਾ" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "ਅਲੈਂਡ ਟਾਪੂ" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "ਅਜ਼ਰਬਾਈਜ਼ਾਨ" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "ਬੋਸੀਨਾ ਅਤੇ ਹਰਜ਼ੀਗੋਵੀਨਾ" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "ਬਾਰਬਾਡਾਸ" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "ਬੰਗਲਾਦੇਸ਼" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "ਬੈਲਜੀਅਮ" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "ਬੂਪਕੀਨਾ ਫਾਸੋ" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "ਬੁਲਗਾਰੀਆ" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "ਬਹਿਰਾਨ" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "ਬੁਰੁਡੀ" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "ਬੀਨੀਨ" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "ਬਾਰਾਮੂਡਾ" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "ਬਰੂਨਈ ਡੇਰੂਸਲਾਮ" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "ਬੋਲੋਵੀਆ" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "ਬਰਾਜ਼ੀਲ" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "ਬਾਹਾਮਾਸ" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "ਭੁਟਾਨ" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "ਬੁਉਵੀਟ ਟਾਪੂ" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "ਬੂਟਸਵਾਨਾ" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "ਬੇਲਾਰੂਸ" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "ਬਿਲੀਜ਼ੀ" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "ਕੇਨੈਡਾ" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "ਕੋਕੋਸ (ਕਿੱਲਿੰਗ) ਟਾਪੂ" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "ਕਾਂਗੋ" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "ਕੇਂਦਰੀ ਅਫ਼ਰੀਕੀ ਰਿਪਬਲਿਕ" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "ਸਵਿਟਜ਼ਰਲੈਂਡ" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "ਕੋਟੀ ਡੀਵੋਈਰੀ" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "ਕੁੱਕ ਟਾਪੂ" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "ਚਿੱਲੀ" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "ਕੈਮਰੂਨ" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "ਚੀਨ" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "ਕੋਲੰਬੀਆ" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "ਕਾਸਟ ਰੀਕਾ" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "ਕਿਊਬਾ" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "ਕੇਪ ਵਾਰਡੀ" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "ਕਰਿਸਮਿਸ ਟਾਪੂ" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "ਕਿਊਰੂਸ" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "ਚੈੱਕ ਗਣਰਾਜ" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "ਜਰਮਨੀ" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "ਡਜੀਬੂਟੀ" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "ਡੈਨਮਾਰਕ" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "ਡੋਮੀਨੀਆ" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "ਡੋਮੀਨੀਆਨ ਗਣਰਾਜ਼" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "ਅਲਜੀਰੀਆ" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "ਏਕਵੇਡਰ" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "ਈਸਟੋਨੀਆ" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "ਮਿਸਰ" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "ਦੱਖਣੀ ਸਹਾਰਾ" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "ਈਰਟੀਰਆ" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "ਸਪੇਨ" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "ਈਥੋਪੀਆ" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "ਫਿਨਲੈਂਡ" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "ਫਿਜ਼ੀ" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "ਫਾਕਲੈਂਡ ਟਾਪੂ (ਮਾਲਵੀਨਸ)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "ਮਾਈਕਰੋਨਸੀਆ ਦੇ ਸੰਘੀ ਰਾਜ" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "ਫਾਰੀਓ ਟਾਪੂ" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "ਫਰਾਂਸ" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "ਮੈਟਰੋਪਲੋਟਨ ਫਰਾਂਸ" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "ਗਾਬੋਨ" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "ਬਰਤਾਨੀਆ" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "ਗਰੀਨਾਡਾਆ" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "ਜਾਰਜੀਆ" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "ਫਰੈਂਚ ਗੁਆਨਾ" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "ਜਰਮਨੀ" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "ਗਾਨਾ" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "ਗੀਬਰਾਲਟਰ" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "ਗਰੀਨਲੈਂਡ" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "ਗਾਬੀਆ" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "ਗੁਈਨਾ" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "ਗੁਆਡੀਲੂਪੀ" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "ਭੂ-ਖੰਡੀ ਗੁਆਨਾ" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "ਗਰੀਸ" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "ਦੱਖਣੀ ਜਾਰਜੀਆ ਅਤੇ ਦੱਖਣੀ" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "ਗੁਆਟੇਮਾਲਾ" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "ਗੁਆਮ" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "ਗੂਈਨੀਆ" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "ਗੁਆਨਾ" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "ਹਾਂਗਕਾਂਗ" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "ਹਾਰਟਡ ਟਾਪੂ ਅਤੇ ਮੈਕਡਾਨਲਡ ਟਾਪੂ" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "ਹਾਨਡੂਰਸ" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "ਕਰੋਟੀਆ" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "ਹਾਈਟੀ" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "ਹੰਗਰੀ" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "ਇੰਡੋਨੇਸੀਆ" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "ਆਈਰਲੈਂਡ" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "ਇਜ਼ਰਾਈਲ" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "ਭਾਰਤ" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "ਬਰਤਾਨੀਵੀ ਭਾਰਤੀ ਮਹਾਂ-ਸਾਗਰ ਖੇਤਰ" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "ਇਰਾਕ" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "ਈਰਾਨ" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "ਆਈਸਲੈਂਡ" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "ਇਟਲੀ" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "ਜੈਮਾਈਕਾ" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "ਜਾਰਡਨ" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "ਜਾਪਾਨ" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "ਕੀਨੀਆ" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "ਕਿਰਗਸਤਾਨ" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "ਕੰਬੋਡੀਆ" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "ਕੀਰੀਬਾਟੀ" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "ਕੋਮੋਰੋਸ" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "ਸੇਂਟ ਕਿਟੱਸ ਅਤੇ ਨੀਵਿਸ" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "ਉੱਤਰੀ ਕੋਰੀਆ" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "ਦੱਖਣੀ ਕੋਰੀਆ" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "ਕੁਵੈਤ" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "ਕਾਯਮਾਨ ਟਾਪੂ" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "ਕਜ਼ਾਕਸਤਾਨ" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "ਲਿਓ ਲੋਕਤੰਤਰ" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "ਲੀਬਨਾਨ" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "ਸੇਂਟ ਲੂਸੀਆ" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "ਲੀਚਟੀਨੀਆ" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "ਸ਼ਰੀਲੰਕਾ" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "ਲੀਬਰੀਆ" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "ਲੀਸੋਥੋ" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "ਲੀਥੂਨੀਆ" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "ਲ਼ਕਸ਼ਬਰਗ" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "ਲਾਟੀਵਾਆ" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "ਲੀਬੀਆ" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "ਮੋਰੋਸ਼ਸ" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "ਮੋਨਸ਼ੀਆ" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "ਮੋਲਡੋਵਾ" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "ਮੋਨਗੋ" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "ਸੇਂਟ ਮਾਰੀਓ" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "ਮੈਡਾਗਾਸਕਰ" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "ਮਾਰਸ਼ਲ ਟਾਪੂ" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "ਮੈਕਡੋਨੀਆ" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "ਮਾਲੀ" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "ਮਿਆਂਮਾਰ" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "ਮੰਗੋਲੀਆ" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "ਮੈਕਸੀਕੋ" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "ਉੱਤਰੀ ਮਾਰੀਨਾ ਟਾਪੂ" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "ਮਾਰਟੀਨਿਉ" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "ਮਾਉਰੀਟਨੀਆ" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "ਮੋਨਟਸ਼ਟੀਟ" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "ਮਾਲਟਾ" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "ਮਾਉਰੀਟੀਸ" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "ਮਾਲਦੀਵ" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "ਮਾਲਾਵੀ" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "ਮੈਕਸੀਕੋ" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "ਮਲੇਸ਼ੀਆ" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "ਮੋਜਾਬਕਿਉ" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "ਨਾਮੀਬੀਆ" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "ਨਿਊ ਕਾਲੀਡੋਨੀਆ" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "ਨੀਗਰ" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "ਨੋਰਫੋਕ ਟਾਪੂ" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "ਨਜੀਰੀਆ" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "ਨਿਕਾਰਗੁਆ" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "ਨੀਂਦਰਲੈਂਡ" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "ਨਾਰਵੇ" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "ਨੇਪਾਲ" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "ਨੀਓਰੂ" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "ਨਿਉ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "ਨਿਊਜ਼ੀਲੈਂਡ" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "ਓਮਾਨ" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "ਪੈਨਾਮਾ" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "ਪੇਰੂ" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "ਫਰੈਂਚ ਪੋਲੀਸੀਨੀਆ" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "ਪੋਪ ਨਿਉ ਗੁਆਨਾ" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "ਫਿਲਿਪੀਨੀਜ਼" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "ਪਾਕਿਸਤਾਨ" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "ਪੋਲੈਂਡ" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "ਸੇਂਟ ਪੀਇੱਰ ਅਤੇ ਮੀਕਿਉਨੋਲ" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "ਪਿਟਸਾਰਨ" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "ਪੁਈਰਟੋ ਰੀਸੋ" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "ਫਿਲਸਤੀਨ ਰਾਜ" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "ਪੁਰਤਗਾਲ" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "ਪਾਲਾਊ" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "ਪੇਰੂਗਵੇ" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "ਕਤਰ" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "ਰੀਯੁਨੀਅਨ" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "ਰੋਮਾਨੀਆ" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "ਸਰਬੀਅਨ" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "ਰੂਸੀ ਸੰਘ" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "ਰਵਾਂਡਾ" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "ਸਾਊਦੀ ਅਰਬ" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "ਸੋਲੋਮੋਨ ਟਾਪੂ" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "ਸੀਯਚੀਲੱਸ" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "ਸੂਡਾਨ" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "ਸਵੀਡਨ" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "ਸਿੰਘਾਪੁਰ" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "ਸੇਂਟ ਹੀਲੀਆ" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "ਸਲੋਵੀਨੀਆ" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "ਸਵਾਲਬਾਰਡ ਅਤੇ ਜਾਨ ਮਾਯਾਨ" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "ਸਲੋਵਾਕੀਆ" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "ਲਿੱਰ ਲੀਓਨ" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "ਸੇਂਟ ਮਾਰੀਓ" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "ਸੈਨੇਗਾਲ" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "ਸੋਮਾਲੀਆ" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "ਸੁਰੀਨੇਮ" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "ਸਾਓ ਟੋਮੀ ਅਤੇ ਪਰਿਸਪੀ" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "ਈਲ ਸਾਲੇਵਡੋਰ" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "ਸੀਰੀਆ" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "ਸਵਾਜੀਲੈਂਡ" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "ਤੁਰਕ ਅਤੇ ਸਾਈਸੋਸ ਟਾਪੂ" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "ਚੱਡ" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "ਫਰੈਂਚ ਦੱਖਣੀ ਖੇਤਰ" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "ਟਾਂਗੋ" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "ਥਾਈਲੈਂਡ" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "ਤਜ਼ਾਕਸਤਾਨ" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "ਤੁਕੀਲਾਓ" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "ਤੁਰਕਮੇਨਸਤਾਨ" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ਟੁਨੀਸ਼ੀਆ" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "ਤਾਂਗਾ" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "ਪੂਰਬੀ ਤੇਮੂਰ" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "ਤੁਰਕੀ" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ਟਰੀਨੀਡ ਅਤੇ ਤੋਬਾਗੋ" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "ਤੁਵਾਲੂ" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "ਤਾਈਵਾਨ" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "ਤਾਂਜੀਨੀਆ" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "ਯੂਕਰੇਨ" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "ਉਜਾਂਡਾ" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "ਸੰਯੁਕਤ ਰਾਜ ਮੀਨੋਰ ਆਉਟਲੇ ਟਾਪੂ" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "ਸੰਯੁਕਤ ਰਾਜ" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "ਉਰੂਗਵੇ" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "ਉਜ਼ੇਬਕਸਤਾਨ" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "ਹੋਲੀ ਸੀ (ਵਾਟੀਕਾਨ ਸਿਟੀ ਸਟੇਟ)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "ਸੇਂਟ ਵੀਨਸੈਂਟ ਅਤੇ ਗਰੀਨਡੀਨ" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "ਵੈਨੂਜੇਏਲਾ" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "ਬਰਤਾਨਵੀਂ ਵਰਜੀਨੀਆ ਟਾਪੂ" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "ਵੀਰਜੀਨ ਟਾਪੂ, ਅਮਰੀਕਾ" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "ਵੀਅਤਨਾਮ" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "ਵਾਂਉਤੁ" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "ਵਾਲਿਸ ਅਤੇ ਫੁਟੁਨਾ" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "ਸਾਮੀਆ" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "ਯਮਨ" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "ਮਿਯੋਟੀ" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "ਦੱਖਣੀ ਅਫਰੀਕਾ" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "ਜੈਂਬੀਆ" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "ਜਿੰਬਾਬਾਵੇ" #: zypp/Dep.cc:96 msgid "Provides" msgstr "ਪਰੋਵਾਇਡ" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "ਲੋੜੀਦਾ" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "ਅਪਵਾਦ" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "ਬਰਤਰਫ਼" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "ਸਿਫਾਰਸ਼ੀ" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "ਸੁਝਾਅ" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "ਇੰਹੈਂਸ" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "ਸਪਲੀਮੈਂਟ" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "ਅਣਜਾਣ ਭਾਸ਼ਾ: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "ਅਫ਼ਰ" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "ਅਬਖਾਜ਼ੀਨਾ" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "ਅਚੀਨੀਜ਼" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "ਅਕੋਲੀ" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "ਅਡਾਨਗਮੀ" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "ਅਡਯਘੀ" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "ਅਫਰੋ-ਏਸ਼ੀਆਟਿਕ (ਹੋਰ)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "ਅਫਰੀਹੀਲੀ" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "ਅਫਰੀਕੀ" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "ਈਨੂ" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "ਅਕਾਨ" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "ਅੱਕਾਡਿਨ" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "ਅਲਬੀਅਨ" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "ਅਲਿਉਟ" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "ਅਲਗੁਨਕਿਉਨ ਭਾਸ਼ਾਵਾਂ" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "ਦੱਖਣੀ ਅਥਟਾਈ" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "ਅਮਹਾਰਿਕ" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "ਅੰਗਰੇਜ਼ੀ, ਪੁਰਾਣੀ (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "ਆਪਚੇਂ ਭਾਸ਼ਾਵਾਂ" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "ਅਰਬੀ" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "ਅਰਾਮਿਕ" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "ਅਰਾਗੋਨੀਸੀ" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "ਅਰਮੀਨੀਅਨ" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "ਅਰਾਉਕਾਨੀਆ" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "ਅਰਾਪਿਹੋ" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "ਆਰਟੀਫਿਸ਼ਲ (ਹੋਰ)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "ਅਰਾਵਾਕ" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "ਅਸਾਮੀ" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "ਆਸਟਰੀਆਈ" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "ਅਥਾਪਾਸਕਾਨ ਭਾਸ਼ਾਵਾਂ" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "ਆਸਟਰੇਲੀਆਈ ਭਾਸ਼ਾਵਾਂ" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "ਅਵਾਰਿਕ" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "ਅਵੀਸਟੀਨ" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "ਅਵਾਥੀ" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "ਅਰਮਾਰਾ" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "ਅਜ਼ਰਬਾਈਜਾਨ" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "ਬਾਂਡਾ" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "ਬਾਕਿਮਲੀਕੀ ਭਾਸ਼ਾਵਾਂ" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "ਬਸ਼ਕੀਰ" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "ਬਲੋਚੀ" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "ਬਾਮਬਾਰਾ" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "ਬਾਲੀਨਸੀ" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "ਬਸਕਿਊ" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "ਬਾਸਾ" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "ਬਲਟਿਕ (ਹੋਰ)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "ਬੀਜਾ" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "ਬੇਲਾਰੂਸੀ" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "ਬੀਮਬਾ" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "ਬੰਗਾਲੀ" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "ਬੀਰਬੀਰ (ਹੋਰ)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "ਭੋਜਪੁਰੀ" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "ਬਿਹਾਰੀ" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "ਬਿਕੋਲ" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "ਬਿਨਿ" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "ਬਿਸਲਮਾ" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "ਸਿਕਸਿਕਾ" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "ਬਾਂਤੁ (ਹੋਰ)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "ਬੋਸਨੀਆ" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "ਬਰਾਜ" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "ਬਰੀਤੋਨ" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "ਬਾਟਾਕ (ਇੰਡੋਨੇਸੀਆ)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "ਬੈਰੁਤ" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "ਬੁਗੀਨੀਆ" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "ਬੁਲਗਾਰੀਅਨ" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "ਬੁਰਮੀਸੀ" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "ਬਲਿਨ" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "ਕੱਡੋ" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "ਕੇਂਦਰੀ ਅਮਰੀਕੀ ਇੰਡੀਅਨ (ਹੋਰ)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "ਕਾਰਿਬ" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "ਕਾਟਾਲੋਨ" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "ਕੂਕੇਸ਼ੀਆਈ (ਹੋਰ)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "ਸੀਬੁਆਂਨੋ" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "ਸੀਲਟਿਕ (ਹੋਰ)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "ਚਾਮੋਰੋ" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "ਚੀਬਚਾ" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "ਚੇਚਨ" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "ਚਾਗਾਤਾਈ" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "ਚੀਨੀ" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "ਚੂਉਕੀਸੀ" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "ਮਾਰੀ" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "ਚੀਨੂਕ ਜਾਰਗਾਨ" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "ਚਾਕਤਾਵ" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "ਚਿਪੀਵਯਾਨ" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "ਚੀਰੋਕੀ" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "ਚਰਚ ਸਲਾਵਿਕ" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "ਚੁਵਸ" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "ਚੀਯੀਨੀ" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "ਚਾਮਿਕ ਭਾਸ਼ਾਵਾਂ" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "ਕੋਪਟੀਕ" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "ਕੋਰਨਿਸ਼" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "ਕੋਰਸਕੇਨ" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "ਕਰੀ" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "ਕਰੀਮਿਕ ਤਰਾਰ" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "ਕਾਸ਼ੁਬਿਨ" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "ਚੈੱਕ" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "ਡਾਕੋਟਾ" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "ਡੈਨਿਸ਼" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "ਡਾਰਗਵਾ" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "ਡਾਯਾਕ" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "ਡੀਲਵਾਰੀ" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "ਸਲਾਵੀ (ਅਥਾਪਾਕਸਕੈਨ)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "ਡਾਗਰਿਬ" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "ਡੀਨਕਾ" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "ਡੀਵਿਹਾ" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "ਡੋਗਰੀ" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "ਦਰਾਵੜੀਅਨ (ਹੋਰ)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "ਲੋਅਰ ਸੋਰਬੀਆਈ" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "ਡੁਆਲਾ" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "ਡੱਚ, ਮਿਡਲ (ca 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "ਡੱਚ" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ਡਯੂਲਾ" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "ਡਜ਼ੋਨਗਖਾ" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "ਈਫਿਕ" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "ਮਿਸਰ (ਪੁਰਾਤਨ)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "ਈਕਾਜੁਕ" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "ਅਲਾਮਿਟੀ" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "ਅੰਗਰੇਜ਼ੀ" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "ਅੰਗਰੇਜ਼ੀ, ਮਿਡਲ (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "ਇਸਪੀਰੋਟੋ" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "ਈਸਟੋਨੀਅਨ" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "ਈਵੀ" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "ਈਵੋਨਡੋ" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "ਫੌਂਗ" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "ਫਾਰੋਸੀ" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "ਫਾਂਟੀ" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "ਫਿਜ਼ੀ" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "ਫਿਲਿਪਿਨੋ" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "ਫੈਨਿਸ਼" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "ਫੋਨ" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "ਫਰੈਂਚ" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "ਫਰੈਂਚ, ਮਿਡਲ (ca. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "ਫਰੈਂਚ, ਪੁਰਾਣੀ (842 ca 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "ਫਾਰਸੀ" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "ਫੂਲਾਹ" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "ਫਰੀਉਲੀਅਨ" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "ਗਾ" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "ਗਾਯੋ" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "ਗਬਾਯਾ" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "ਗਿਰਮਿਕ (ਹੋਰ)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "ਜਾਰਜੀਅਨ" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "ਜਰਮਨ" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "ਗਾਜ਼ਾ" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "ਗਿਲਬਰਿਟਸੀ" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "ਗਾਇਲਿਕ" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "ਆਈਰਸ਼" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "ਗਲੀਸਿਕ" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "ਮੈਂਨਸ" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "ਜਰਮਨ, ਮਿਡਲ ਉੱਚ (ca. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "ਜਰਮਨ, ਪੁਰਾਣਾ ਉੱਚ (ca. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "ਗੋਂਡੀ" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "ਗੋਰੋਨਟਾਲੋ" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "ਗੋਥਿਕ" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "ਗਰੀਬੋ" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "ਗਰੀਕ, ਪੁਰਾਤਨ (1453 ਤੱਕ)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "ਗਰੀਕ, ਮਾਡਰਨ (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "ਗੁਜਰਨੀ" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "ਗੁਜਰਾਤੀ" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "ਗਵਿਚਨਿ" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "ਹਾਈਡਾ" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "ਹਾਈਤਿਨ" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "ਹਾਉਸਾ" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "ਹਾਵਾਈਨ" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "ਹੈਬਰਿਓ" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "ਹੀਰੀਰੋ" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "ਹਿਲਿਗਾਯਨੋਨ" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "ਹਿਮਾਚਲੀ" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "ਹਿੰਦੀ" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "ਹਿੱਟੀਟੀ" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "ਹਮਾਂਗ" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "ਹੀਰੀ ਮੋਟੋ" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "ਅੱਪਰ ਸੋਰਬੀਆਈ" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "ਹੰਗਰੀਅਨ" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "ਉਪਾ" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "ਲਬਾਨ" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "ਲਗਬੋ" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "ਆਈਸਲੈਂਡਿਕ" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ਈਡੋ" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "ਸਿਚੁਨ ਯੀ" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ਈਜੋ" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "ਇਨਕਟੁਟ" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "ਇੰਟਰਲੈਗੁਆ" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "ਲੱਕੋ" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "ਭਾਰਤੀ (ਹੋਰ)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "ਇੰਡੋਨੇਸ਼ੀਅਨ" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "ਇੰਡੋ-ਯੂਰਪੀਆਈ (ਹੋਰ)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "ਈਂਗੁਸ਼" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "ਇਨੁਪਿਓ" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "ਆਈਰਸ਼ (ਹੋਰ)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "ਈਰੋਕਿਉਆਈ ਭਾਸ਼ਾਵਾਂ" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "ਇਤਾਲਵੀ" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "ਜਾਵੀ" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "ਲੋਜਬੀਨ" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "ਜਾਪਾਨੀ" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "ਜੂਡੀਓ-ਪਾਰਸ਼ੀਆਈ" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "ਜੂਡੀਓ-ਅਰਬੀ" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "ਕਾਰਾ-ਕਾਲਪਾਕ" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "ਕਾਬਆਲੇ" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "ਕੋਚੀਨ" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "ਕਾਲਾਲਸੁਟ" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "ਕੰਮਬਾ" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "ਕੰਨੜ" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "ਕੀਰਿਨ" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "ਕਸ਼ਮੀਰੀ" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "ਕਾਨਉਰੀ" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "ਕਵੀ" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "ਕਾਜ਼ਾਖ" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "ਕਾਬਾਰਡੀਆਈ" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "ਖਾਸੀ" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "ਖੋਈਸਾਨ (ਹੋਰ)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "ਖਮੀਰ" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "ਖੋਤਾਨੀਸੀ" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "ਕਿਕੁਯੂ" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "ਕੀਯਾਰਵਾਂਡਾ" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "ਕਿਰਘੀਜ਼" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "ਕਿਮਬੁਡੂ" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "ਕੋਕਨੀ" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "ਕੋਮੀ" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "ਕਾਂਗੋ" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "ਕੋਰੀਆਨ" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "ਕੋਸਰੀਨ" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "ਕਪੀੱਲੀ" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "ਕਾਰਾਚਾਯ-ਬਾਲਕਾਰ" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "ਕਰੁ" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "ਕੁਰੂਖ" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "ਕੂਯਾਮਾ" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "ਕੁਮਯਕ" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "ਕੁਰਦ" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "ਕੁਟੀਨੀ" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ਲਾਡਿਨੋ" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "ਲਾਹਨਡਾ" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "ਲਾਬਾਂ" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "ਲਿਓ" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "ਲੈਟਿਨ" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "ਲਾਵਟੀਅਨ" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "ਲਿਜ਼ਘੀਨ" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "ਲਿਮਬੁਰਗਾਨ" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "ਲਿੰਗਾਲਾ" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "ਲੀਥੂਨੀਅਨ" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "ਮੋਨਗੋ" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "ਲੁਜ਼ੀ" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "ਲ਼ਕਸ਼ਬਰਗਿਸ਼" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "ਲੁਬਾ-ਲੁਲੁਆ" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "ਲੁਬਾ-ਕਾਤਾਂਗਾ" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ਗਾਂਡਾ" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "ਲੁਈਸੀਨੋ" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "ਲੁਆਂਡਾ" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "ਲੁਸ਼ਾਈ" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "ਮੈਕਡੋਨੀਅਨ" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "ਮਾਡੁਰੀਸੀ" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "ਮਾਗਾਹੀ" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "ਮਾਰਸੱਲੀਸੀ" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "ਮੈਥਲੀ" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "ਮਾਕਾਸਾਰ" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "ਮਲਿਆਲਮ" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "ਮਾਂਡੀਂਗੋ" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "ਮੋਰੀ" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "ਮਰਾਠੀ" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "ਮਾਸਾਈ" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "ਮਲਾਇਆ" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "ਮੋਕਸਾ" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "ਮਾਂਡਾਰ" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "ਮੀਂਡੀ" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "ਆਈਰਸ਼, ਮਿਡਲ (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "ਮਿਕਮਾਕਿਉ" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "ਮਿਨਾਂਗਕਾਬਾਉ" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "ਫੁਟਕਲ ਭਾਸ਼ਾਵਾਂ" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "ਮੋਨ-ਖਮੀਰ (ਹੋਰ)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "ਮਾਲਾਗਸੇ" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "ਮਾਲਟਾ" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "ਮਾਂਚੁ" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "ਮਨੀਪੁਰੀ" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "ਮਾਂਨੋਬੋ ਭਾਸ਼ਾਵਾਂ" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "ਮੋਹਾਵਕ" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "ਮੋਲਡੋਵਾ" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "ਮੰਗੋਲੀਅਨ" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "ਮੱਸੀ" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "ਕੋਈ ਭਾਸ਼ਾਵਾਂ" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "ਮਾਂਨਡਾ ਭਾਸ਼ਾਵਾਂ" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "ਕਰੀਕ" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "ਮੀਰਾਂਡੀਸੀ" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "ਮਾਰਵਾਰੀ" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "ਮਾਯਾਨ ਭਾਸ਼ਾਵਾਂ" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "ਈਰਜ਼ਯਾ" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "ਨਾਹੁਆਟਲ" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "ਉੱਤਰੀ ਅਮਰੀਕੀ ਇੰਡੀਅਨ" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "ਨੀਪੋਲੀਤਾਨ" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "ਨਾਵਾਜੋ" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "ਨਡੀਬੀਲੀ, ਦੱਖਣੀ" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "ਨਡੀਬੀਲੀ, ਉੱਤਰੀ" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ਨਡੋਗਾ" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "ਲੋ ਜਰਮਨ" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "ਨੇਪਾਲੀ" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "ਨੇਪਾਲ ਭਾਸ਼ਾ" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "ਨੀਆਸ" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "ਨੀਉਨ" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "ਨਾਰਵੀਅਨ ਨਿਯਰੋਸਕ" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "ਨਾਰਵੀਅਨ ਬੋਕਮਾਲ" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "ਨੋਗਾਈ" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "ਨੋਰਸੀ, ਪੁਰਾਣੀ" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "ਨਾਰਵੀਅਨ" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "ਉੱਤਰੀ ਸੋਥੋ" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "ਨਿਬੀਆਈ ਭਾਸ਼ਾਵਾਂ" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "ਕਲਾਸੀਕਲ ਨੀਵਾਰੀ" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "ਚਿਚੀਵਾ" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "ਨਆਮਵਜ਼ੀ" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "ਨਆਨਕੋਲੀ" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "ਨਆਰੋ" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "ਨਜ਼ੀਮਾ" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "ਉਸਟਾਨ (ਪੋਸਟ 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "ਉਜੀਬਵਾ" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "ਓੜੀਆ" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "ਓਰੋਮਾ" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "ਓਸਾਗੀ" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "ਉੱਸਟੀਨਅਨ" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "ਤੁਰਕ, ਉੱਟੋਮਨ (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "ਓਟਾਮੀਆਈ ਭਾਸ਼ਾਵਾਂ" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "ਪਾਪੁਆਨ (ਹੋਰ)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "ਪਾਂਗਾਸੀਆਈ" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "ਪਾਹਲਵੀ" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "ਪਾਮਪਾਂਗਾ" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "ਪੰਜਾਬੀ" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "ਪਾਡੀਮੀਟਤੋ" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "ਪਾਲਾਉਨ" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "ਪਰਸ਼ੀਆਈ, ਪੁਰਾਣੀ (ca 600-400 BC)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "ਪਰਸੀਆਈ" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "ਫਿਲਿਪੀਨੀ (ਹੋਰ)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "ਫੋਨੋਨੀਸਿਕ" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "ਪਾਲੀ" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "ਪੋਲਿਸ਼" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "ਫੋਹਨਪੀਈ" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "ਪੁਰਤਗਾਲੀ" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "ਪਰਾਕਰਿਟ ਭਾਸ਼ਾਵਾਂ" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "ਪਰੋਵਾਂਕਾਲ, ਪੁਰਾਣੀ (1500 ਤੋਂ)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "ਪੁਸਤੋ" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "ਕਿਉਚੁਆ" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "ਰਾਜਸਥਾਨੀ" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "ਰਾਪਾਨਈ" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "ਰਾਰੋਤੋਨਗੀ" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "ਰੋਮਾਨਿਕ (ਹੋਰ)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "ਰੀਟੋ-ਰੋਮਨੀ" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "ਰੋਮਨੀ" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "ਰੋਮਾਨੀਅਨ" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "ਰੰਡੀ" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "ਰੂਸੀ" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "ਸਾਂਡਾਵੀ" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "ਸਾਂਗੋ" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "ਯਾਕੁਟ" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "ਦੱਖਣੀ ਅਮਰੀਕੀ ਇੰਡੀਅਨ (ਹੋਰ)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "ਸਾਲੀਸ਼ਾਂ ਭਾਸ਼ਾਵਾਂ" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "ਸਾਮਾਰਿਟਿਕ ਅਰਾਮਾਕ" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "ਸੰਸਕਰਿਤ" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "ਸਾਸਾਕ" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "ਸਾਂਤਾਲੀ" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "ਸਰਬੀਅਨ" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "ਸਿਕਿਲਿਆਈ" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "ਸਕੋਟਸ" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "ਕਰੋਆਟੀਅਨ" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "ਸਿਲਕੁਪ" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "ਸਿਮੀਟਿਕ (ਹੋਰ)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "ਆਈਰਸ਼, ਪੁਰਾਣੀ (900 ਤੋਂ)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "ਸਾਇਨ ਭਾਸ਼ਾਵਾਂ" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "ਸ਼ਾਨ" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "ਸੀਡਾਮੋ" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "ਸਿੰਹਾਲਾ" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "ਸੀਉਆਨ ਭਾਸ਼ਾਵਾਂ" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "ਸੀਨੋ-ਤਿੱਬਤ (ਹੋਰ)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "ਸਲਾਵਿਕ (ਹੋਰ)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "ਸਲੋਵਾਕ" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "ਸਲੋਵੀਅਨ" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "ਦੱਖਣੀ ਸਾਮੀ" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "ਉੱਤਰੀ ਸਾਮੀ" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "ਸਾਮੀ ਭਾਸ਼ਾਵਾਂ (ਹੋਰ)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "ਲੁਈ ਸਾਮੀ" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "ਇਨਰੀ ਸਾਮੀ" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "ਸਾਮੋਨੀ" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "ਸਲਾਲਟ ਸਾਮੀ" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "ਸ਼ੋਨਾ" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "ਸਿੰਧੀ" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "ਸੋਨੀਨਕੀ" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "ਸੋਗਡੀਆਈ" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "ਸੋਮਾਲੀ" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "ਸੋਂਘਾਈ" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "ਸੋਥੋ, ਦੱਖਣੀ" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "ਸਪੇਨੀ" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "ਸਾਰਡੀਨੀਅਨ" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "ਸੀਰੀਰ" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "ਨਿਲੋ-ਸਸਾਹਾਰਨ (ਹੋਰ)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "ਸਵਾਤੀ" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "ਸੁਕੁਮਾ" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "ਸੁਡਾਨੀ" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "ਸੁਸੁ" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "ਸੁਮੀਰਿਨ" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "ਸਵਾਹਿਲੀ" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "ਸਵੀਡਿਸ਼" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "ਸਅਰਿਕ" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "ਤਾਹੀਤੀਆਨ" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "ਤਾਈ (ਹੋਰ)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "ਤਾਮਿਲ" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "ਤਤਾਰ" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "ਤੇਲਗੂ" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "ਤਿਮਨੀ" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "ਤਿਰਿਨੋ" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "ਤੋਤੁਮ" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "ਤਾਜ਼ਿਕ" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "ਤਾਗਾਲੋਗ" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "ਥਾਈ" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "ਤਿੱਬਤ" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "ਤੀਗਰਿ" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "ਟੀਗਰੀਨਯਾ" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "ਤੀਵ" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "ਕਲਿੰਗੋਨ" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "ਤਲਿੰਗੀਤ" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "ਤਾਮਾਸਿਕ" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "ਤਾਂਗਾ (ਨਆਸਾ)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "ਤਾਂਗਾ (ਤਾਂਗਾ ਟਾਪੂ)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "ਤੋਕ ਪਿਸ਼ਿਨ" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "ਤਸਾਮਸ਼ਿਨ" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "ਤਸਵਾਕਾ" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "ਤਸਾਂਗੋ" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "ਤੁਰਕ" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "ਤੁਮਬੁਕਾ" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "ਤੁਪਾਈ ਭਾਸ਼ਾਵਾਂ" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "ਤੁਰਕੀ" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "ਅਲਟਿਕ (ਹੋਰ)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "ਤਵੀ" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "ਤੁਵੀਨੀਆਈ" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "ਉਡਮਰਟ" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "ਯਗਾਰਿਟਿਕ" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "ਉਘੋਰ" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "ਯੂਕਰੇਨੀ" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "ਯਮਬੁਡੂ" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "ਅਣ-ਪਛਾਣੀ" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "ਉਰਦੂ" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "ਉਜ਼ੇਬਕ" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "ਵਾਈ" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "ਵਾਂਡਾ" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "ਵੀਅਤਨਾਮੀ" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "ਵੋਲਾਪੁਕ" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "ਵੋਟਿਕ" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "ਵਾਕਾਸ਼ਾਨ ਭਾਸ਼ਾਵਾਂ" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "ਵਾਲਾਮੋ" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "ਵਾਰਾਏ" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "ਵਾਸ਼ੋ" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "ਵਾਲਿਸ਼" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "ਸੋਰਬੀਆਈ ਭਾਸ਼ਾਵਾਂ" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "ਵੱਲੂਨ" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "ਵੋਲੋਫ" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "ਕਾਲਮਯਕ" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "ਯੋਸਾ" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "ਯਾਓ" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "ਯਾਪੀਸੀ" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "ਯੀਡਿੱਸ਼" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "ਯੋਰੁਬਾ" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "ਯੁਪਿਕ ਭਾਸ਼ਾਵਾਂ" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "ਜ਼ਾਪੋਟਿਕ" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "ਜੀਨਾਗਾ" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "ਜ਼ੁਆਂਗ" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "ਜਾਂਡੀ" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "ਜ਼ੂਲੂ" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "ਜੁਨੀ" #: zypp/ProblemSolution.cc:134 #, fuzzy msgid "Following actions will be done:" msgstr "ਹੇਠ ਦਿੱਤੇ ਪੈਕੇਜ ਅੱਪਡੇਟ ਕੀਤੇ ਜਾਣਗੇ:\n" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "ਅਣਜਾਣ" #: zypp/VendorSupportOptions.cc:17 #, fuzzy msgid "unsupported" msgstr " - ਸਹਾਇਕ ਨਹੀਂ" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "ਡਿਸਕ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "ਅਣਜਾਣ ਕਮਾਂਡ '%s'" #: zypp/base/StrMatcher.cc:153 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "ਫਾਇਲ %2$s ਲਈ ਅਣਜਾਣ ਡਿਜ਼ਟ %1$s" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "ਗਲਤ Url ਸਕੀਮ '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "'%s' ਲਈ ਪਰਮਾਣਿਕਤ ਲੋੜੀਦੀ ਹੈ" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "%1 ਡਾਇਰੈਕਟਰੀ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ: %2" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, fuzzy, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਤੋਂ ਮੇਟਾ-ਡਾਟਾ ਪਾਰਸਿੰਗ ਦੌਰਾਨ ਗਲਤੀ:" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "%s ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %m\n" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਕੈਚੇ ਬਿਲਡ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 #, fuzzy msgid "Unhandled repository type" msgstr "%s ਰਿਪੋਜ਼ਟਰੀ ਲਈ ਅੱਪਲੋਡ ਕੀਤਾ।" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਸ਼ਾਮਲ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "ਗਲਤ ਐਕਸਪੋਰਟ ਫਾਇਲ ਨਾਂ ਹੈ।" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "ਲਿਖਣ ਲਈ ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "ਅਣਜਾਣ ਕਮਾਂਡ '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਹਟਾਈ ਜਾ ਰਹੀ ਹੈ।" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "ਡੈਸਕਟਾਪ ਆਈਟਮ '%s' ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "VM ਦਾ ਨਾਂ ਇੱਕ ਅੰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।" #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr "VM ਦਾ ਨਾਂ ਇੱਕ ਅੰਕ ਨਾਲ ਸ਼ੁਰੂ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ।" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "ਜਾਰੀ ਰੱਖਣਾ ਹੈ?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, fuzzy, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "ਲੋੜੀ ਫਾਇਲ ਗੁੰਮ ਹੈ: " #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "ਪੈਕੇਜ %s ਐਂਟੀਗਰੇਟੀ ਚੈਕ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ। ਕੀ ਤੁਸੀਂ ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰਨੀ ਚਾਹੁੰਦੇ ਹੋ?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "ਪੈਕੇਜ %s ਐਂਟੀਗਰੇਟੀ ਚੈਕ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ। ਕੀ ਤੁਸੀਂ ਮੁੜ-ਕੋਸ਼ਿਸ਼ ਕਰਨੀ ਚਾਹੁੰਦੇ ਹੋ?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm ਚੈੱਕ ਫੇਲ੍ਹ ਹੈ।" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm ਫੇਲ੍ਹ ਹੋਇਆ।" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਪਰੋਫਾਇਲ ਲੈਣ ਦੌਰਾਨ ਗਲਤੀ: " #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਕੋਈ URL ਨਹੀਂ ਹੈ।" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "ਫਾਇਲ ਨਹੀਂ ਬਣਾਈ ਜਾ ਸਕਦੀ ਹੈ।" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "ਆਮ ਤੌਰ ਉੱਤੇ ਇਹ ਲੋੜ ਅਣਡਿੱਠੀ ਕਰੋ" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "ਕੁਨੈਕਸ਼ਨ ਮੰਗ:" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "ਨਿਰਭਰਤਾ ਸਮੱਸਿਆਵਾਂ ਕਰਕੇ %s ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "%s ਕੋਈ ਨਹੀਂ ਦਿੰਦਾ ਹੈ" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "ਉਪਲੱਬਧ ਪਰੋਫਾਇਲ" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "ਮੰਗ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "ਇੰਸਟਾਲੇਸ਼ਨ ਹਦਾਇਤਾਂ ਮੁਤਾਬਕ ਅਧੂਰੀ ਛੱਡੀ ਗਈ ਹੈ।" #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "ਚਲਾਓ" # %s is either BOOTP or DHCP #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI ਚਲਾਉਣਾ ਫੇਲ੍ਹ: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "ਕੁੰਜੀ ਇੰਕ੍ਰਿਪਸ਼ਨ ਦੌਰਾਨ ਗਲਤੀ ਹੈ।" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "ਫੇਲ੍ਹ" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s ਲਈ ਸੰਰਚਨਾ ਫਾਇਲਾਂ ਬਦਲੀਆਂ:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "ਹੋਰ rpm ਆਉਟਪੁੱਟ:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "%s ਦਾ ਬੈਕਅੱਪ ਬਣਿਆ" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "VM ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।" #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "VM ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਫੇਲ੍ਹ ਹੈ।" #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "ਸੋਰਸ ਪੈਕੇਜ '%s' ਨਹੀਂ ਲੱਭਿਆ।" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "ਫਾਇਲ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕੀ: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "ਫਾਇਲ %1 ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "ਗਲਤ LDAP URL ਕਿਊਰੀ ਸਤਰ" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Url ਆਬਜੈਕਟ ਕਲੋਨ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "ਗਲਤ ਖਾਲੀ Url ਆਬਜੈਕਟ ਰੈਫਰੈਂਸ" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Url ਭਾਗ ਪਾਰਸ ਕਰਨ ਲਈ ਅਸਮਰੱਥ" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "ਅਤੀਤ:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url ਸਕੀਮ ਲਈ %s ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "ਗਲਤ %s ਭਾਗ '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "ਗਲਤ %s ਭਾਗ" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਲੋੜੀਦਾ ਭਾਗ ਹੈ" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "ਗਲਤ Url ਸਕੀਮ '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਯੂਜ਼ਰ-ਨਾਂ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਪਾਸਵਰਪ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url ਲਈ ਇੱਕ ਹੋਸਟ ਭਾਗ ਲੋੜੀਦਾ ਹੈ" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url ਸਕੀਮ ਲਈ ਇੱਕ ਹੋਸਟ ਭਾਗ ਮਨਜ਼ੂਰ ਨਹੀਂ ਹੈ।" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "ਗਲਤ ਹੋਸਟ ਭਾਗ '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url ਸਕੀਮ ਇੱਕ ਪੋਰਟ ਨਹੀਂ ਦਿੰਦੀ ਹੈ।" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "ਗਲਤ ਪੋਰਟ ਭਾਗ '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url ਸਕੀਮ ਲਈ ਮਾਰਗ ਨਾਂ ਲੋੜੀਦਾ ਹੈ" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "ਕੁਨੈਕਟ ਕਰਨ ਦੌਰਾਨ ਚੱਲਦੀ ਕਮਾਂਡ" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "%s ਨਹੀਂ ਲੱਭਿਆ।" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "ਮੋਡੀਊਲ \"%s\" ਲੋਡ ਕਰਨ ਲਈ ਫੇਲ ਹੈ।" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "ਫਾਇਲ %1 ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "ਫਾਇਲ %1 ਲਿਖੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 ਡਾਇਰੈਕਟਰੀ ਨਹੀਂ ਹੈ।" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "ਖਾਲੀ CA ਨਾਂ ਹੈ।" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "ਗਲਤ URL ਸਕੀਮ '%1' ਹੈ।" #: zypp-media/mediaexception.cc:131 #, fuzzy msgid "Operation not supported by medium" msgstr "ਪਰੋਫਾਇਲ ਵਰਜਨ ਅੱਪਾਰਮੋਰ ਮੋਡੀਊਲ ਵਲੋਂ ਸਹਾਇਕ ਨਹੀਂ ਹੈ\n" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 #, fuzzy msgid "Cannot eject any media" msgstr "ਕੋਈ ਸਕੀਮ ਨਹੀਂ ਲੱਭੀ ਹੈ।" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "ਡੈਸਕਟਾਪ ਆਈਟਮ '%s' ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "ਅਧਿਕਾਰ ਪਾਬੰਦੀ ਹੈ" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "ਹਾਂ" #: zypp-tui/Table.cc:32 msgid "No" msgstr "ਨਹੀਂ" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "ਸਾਵਧਾਨ: " #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "ਗਲਤੀ" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "ਪੂਰਾ" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "ਗਲਤੀ" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "ਸਾਵਧਾਨ: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "ਸ਼ੁਰੂ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "ਨਹੀਂ ਲੱਭਿਆ" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ਹਾਂ" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ਨਹੀਂ" #, fuzzy #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)" #~ msgstr[1] "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਆਰਕੀਟੈਕਚਰ ਹੋਰ ਹੈ।" #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "ਸੋਰਸ ਪੈਕੇਜ %s-%s ਇੰਸਟਾਲ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ:" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "%s ਕੋਈ ਨਹੀਂ ਦਿੰਦਾ ਹੈ" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "%s ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s ਦਾ %s ਨਾਲ ਅਪਵਾਦ ਹੈ" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s %s ਰਾਹੀਂ ਚਾਹੀਦਾ ਹੈ" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s ਦਾ %s ਨਾਲ ਅਪਵਾਦ ਹੈ" #~ msgid "do not install %s" #~ msgstr "%s ਨੂੰ ਨਾ ਹਟਾਓ" #~ msgid "keep %s" #~ msgstr "%s ਰੱਖੋ" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਆਰਕੀਟੈਕਚਰ ਹੋਰ ਹੈ।" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s ਹਟਾਓ" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "%s ਨੂੰ %s ਲਈ ਅੱਪਡੇਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" # %s is either BOOTP or DHCP #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "%s ਦੀ ਇੰਸਟਾਲੇਸ਼ਨ ਫੇਲ੍ਹ ਹੋਈ:" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "ਫਾਇਲ %1 ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।" #~ msgid "Hal Exception" #~ msgstr "Hal ਅਪਵਾਦ" #~ msgid "HalContext not connected" #~ msgstr "HalContext ਕੁਨੈਕਟਡ ਨਹੀਂ" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive ਸ਼ੁਰੂ ਨਹੀਂ ਹੈ" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ" #~ msgid "Unable to create dbus connection" #~ msgstr "dbus ਕੁਨੈਕਸ਼ਨ ਬਣਾਉਣ ਲਈ ਅਸਮਰੱਥ" #, fuzzy #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_set_dbus_connection: dbus ਕੁਨੈਕਸ਼ਨ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: dbus ਕੁਨੈਕਸ਼ਨ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" #~ msgid "Not a CDROM drive" #~ msgstr "ਇੱਕ CDROM ਡਰਾਇਵ ਨਹੀਂ ਹੈ" #~ msgid "Can't acquire the mutex lock" #~ msgstr "mutex ਲਾਕ ਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ" #~ msgid "Can't release the mutex lock" #~ msgstr "mutex ਲਾਕ ਰੀਲਿਜ਼ ਨਹੀਂ ਜਾ ਸਕਦਾ" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "ਪਬਲਿਕ ਕੁੰਜੀ ਲੈਣ ਲਈ ਅਸਮਰੱਥ ਹੈ।" #, fuzzy #~ msgid "generally ignore of some dependecies" #~ msgstr "ਆਮ ਤੌਰ ਉੱਤੇ ਇਹ ਲੋੜ ਅਣਡਿੱਠੀ ਕਰੋ" #, fuzzy #~ msgid "do not forbid installation of %s" #~ msgstr "%s ਨੂੰ ਨਾ ਹਟਾਓ" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "ਇੰਸਟਾਲ ਨਹੀਂ ਹਨ" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "لا يمكن إنشاء المفتاح العام %s من %s إلى ملف حلقة المفاتيح %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "حاول استيراد مفتاح غير موجود %s إلى حلقة مفاتيح %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "لا يمكن تغيير مجلد العمل '/' داخل استجذار (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "فشل تهيئة تحميل (Metalink curl) '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "تحميل (metalink curl) خطأ '%s':\n" #~ "رمز الخطأ: %s\n" #~ "رسالة الخطأ: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "توقف التحميل في %d%%" #~ msgid "Download interrupted by user" #~ msgstr "توقف التحميل بواسطة المستخدم" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "حدث خطأ أثناء إعداد خيارات التحميل (metalink curl) ل '%s':" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "ਪਾਰਸ ਕਰਨ ਦੌਰਾਨ ਫੇਲ੍ਹ: %s।" #~ msgid "Serbia and Montenegro" #~ msgstr "ਸਰੀਬੀਆ ਅਤੇ ਮਾਂਟੀਂਗਰੋ" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "ਅਣਜਾਣ ਲਿਸਟ ਚੋਣ" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "ਨਿਰਭਰਤਾ ਹੱਲ਼ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕੀ" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "ਫਾਇਲ %s ਲਈ ਚੈਕਸਮ ਨਹੀਂ ਹੈ।\n" #~ "ਕੀ ਫਾਇਲ ਇੰਝ ਹੀ ਵਰਤਣਾ ਹੈ?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "ਫਾਇਲ %s ਹੇਠ ਦਿੱਤੀ ਕੁੰਜੀ ਨਾਲ ਐਂਟਗਰੇਟੀ ਚੈੱਕ ਲਈ ਫੇਲ੍ਹ ਹੋਈ:\n" #~ "%s|%s|%s\n" #~ "ਕੀ ਫਾਇਲ ਵਰਤਣੀ ਹੈ?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "ਫਾਇਲ %s ਦਾ ਚੈਕਸਮ ਗਲਤ ਹੈ।\n" #~ "%s ਦੀ ਲੋੜ ਸੀ, ਮਿਲਿਆ %s\n" #~ "ਕੀ ਫਾਇਲ ਇੰਝ ਹੀ ਵਰਤਣੀ ਹੈ?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "ਫਾਇਲ %s ਲਈ ਅਣਜਾਣ ਚੈਕਸਮ %s ਹੈ।\n" #~ "ਕੀ ਫਾਇਲ ਇੰਝ ਹੀ ਵਰਤਣੀ ਹੈ?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "ਫਾਇਲ %s ਸਾਇਨ ਨਹੀਂ ਹੈ।\n" #~ "ਕੀ ਇਸ ਨੂੰ ਇੰਝ ਹੀ ਵਰਤਣਾ ਹੈ?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "ਫਾਇਲ %s ਇੱਕ ਅਣਜਾਣੀ ਕੁੰਜੀ ਨਾਲ ਸਾਇਨ ਕੀਤੀ ਗਈ ਹੈ:\n" #~ "%s|%s|%s\n" #~ "ਕੀ ਫਾਇਲ ਵਰਤਣੀ ਹੈ?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "ਅਣ-ਟਰਸਟਡ ਕੁੰਜੀ ਲੱਭੀ:\n" #~ "%s|%s|%s\n" #~ "ਕੁੰਜੀ ਉੱਤੇ ਭਰੋਸਾ ਕਰਨਾ ਹੈ?" #~ msgid "%s remove failed" #~ msgstr "%s ਹਟਾਉਣਾ ਫੇਲ੍ਹ" #~ msgid "Invalid user name or password." #~ msgstr "ਗਲਤ ਯੂਜ਼ਰ ਨਾਂ ਜਾਂ ਪਾਸਵਰਡ ਹੈ।" #~ msgid "rpm output:" #~ msgstr "rpm ਆਉਟਪੁੱਟ:" #~ msgid "%s install failed" #~ msgstr "%s ਇੰਸਟਾਲ ਫੇਲ੍ਹ ਹੈ" #~ msgid "%s installed ok" #~ msgstr "%s ਇੰਸਟਾਲ ਹੋਇਆ" #~ msgid "%s remove ok" #~ msgstr "%s ਹਟਾਇਆ" #~ msgid "Ignore that %s is already set to install" #~ msgstr "ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਸੈੱਟ ਕੀਤੇ ਉਸ %s ਨੂੰ ਅਣਡਿੱਠਾ ਕਰੋ" #~ msgid "Ignore this conflict of %s" #~ msgstr "%s ਦਾ ਇਹ ਅਪਵਾਦ ਅਣਡਿੱਠਾ ਕਰੋ" #~ msgid "Ignore this requirement just here" #~ msgstr "ਇਹ ਲੋੜ ਇੱਥੇ ਹੀ ਅਣਡਿੱਠੀ ਕਰੋ" #~ msgid "Install %s although it would change the vendor" #~ msgstr "%s ਇੰਸਟਾਲ ਕਰੋ, ਭਾਵੇਂ ਇਹ ਵੇਂਡਰ ਬਦਲ ਦੇਵੇਗਾ" #~ msgid "Install missing resolvables" #~ msgstr "ਗੁੰਮ ਹੱਲ-ਯੋਗ ਇੰਸਟਾਲ ਕਰੋ" #~ msgid "Keep resolvables" #~ msgstr "ਹੱਲ-ਯੋਗ ਰੱਖੋ" #~ msgid "Unlock these resolvables" #~ msgstr "ਇਹ ਹੱਲਯੋਗ ਅਣਲਾਕ ਕਰੋ" #~ msgid "install %s" #~ msgstr "%s ਇੰਸਟਾਲ" #~ msgid "unlock %s" #~ msgstr "%s ਅਣਲਾਕ" #~ msgid "unlock all resolvables" #~ msgstr "ਸਭ ਹੱਲਯੋਗ ਅਣਲਾਕ ਕਰੋ" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "ਫਾਇਲ %1 ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।" #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "ਰਿਪੋਜ਼ਟਰੀ ਤੋਂ ਪੜ੍ਹਨ ਦੌਰਾਨ ਗਲਤੀ:" #~ msgid "Software management is already running." #~ msgstr "ਸਾਫਟਵੇਅਰ ਪਰਬੰਧ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਿਹਾ ਹੈ।" #~ msgid "%s is replaced by %s" #~ msgstr "%s ਨੂੰ %s ਨਾਲ ਬਦਲਿਆ ਜਾਂਦਾ ਹੈ" #~ msgid "%s replaced by %s" #~ msgstr "%s ਨੂੰ %s ਨਾਲ ਬਦਲਿਆ ਗਿਆ" #~ msgid "%s will be deleted by the user.\n" #~ msgstr "%s ਨੂੰ ਯੂਜ਼ਰ ਵਲੋਂ ਹਟਾਇਆ ਜਾਵੇਗਾ।\n" #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s ਨੂੰ ਯੂਜ਼ਰ ਵਲੋਂ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।\n" #~ msgid "Invalid information" #~ msgstr "ਗਲਤ ਜਾਣਕਾਰੀ" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s ਲੋੜੀਦਾ ਹੈ:\n" #~ "%s" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s ਦਾ ਅਪਵਾਦ ਹੈ:\n" #~ "%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "ਇਹ ਹੱਲ-ਕਰਨ-ਯੋਗ ਸਿਸਟਮ ਤੋਂ ਹਟਾਏ ਜਾਣਗੇ।" #~ msgid "%s depends on %s" #~ msgstr "%s %s ਉੱਤੇ ਨਿਰਭਰ ਹੈ" #~ msgid "%s depends on:%s" #~ msgstr "%s ਨਿਰਭਰ ਹੈ: %s" #~ msgid "Child of" #~ msgstr "ਚਾਈਲਡ" #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "ਇਹ ਲੋੜ ਨੂੰ ਪੂਰੀ ਕਰਨ ਲਈ ਕੋਈ ਸਰੋਤ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।" #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%s ਨੂੰ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਇਸ ਦਾ %s ਨਾਲ ਅਪਵਾਦ ਹੈ।" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ ਅਤੇ ਅਣ-ਇੰਸਟਾਲਯੋਗ ਮਾਰਕ ਕੀਤਾ ਗਿਆ" #~ msgid "%s has missing dependencies" #~ msgstr "%s ਲਈ ਨਿਰਭਰਤਾ ਅਧੂਰੀ ਹੈ" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s ਨੂੰ ਨਿਰਭਰਤਾ ਅਧੂਰੀ ਹੋਣ ਕਰਕੇ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" #~ msgid "No need to install %s" #~ msgstr "%s ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ" #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "%s ਨੂੰ %s ਦੀ ਨਿਰਭਰਤਾ ਪੂਰੀ ਨਾ ਹੋਣ ਕਰਕੇ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "%s ਨੂੰ %s ਦੀ ਨਿਰਭਰਤਾ ਪੂਰੀ ਨਾ ਹੋਣ ਕਰਕੇ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ" #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ, ਕਿਉਂਕਿ ਇਹ ਹਾਲੇ ਵੀ ਲੋੜੀਦਾ ਹੈ" #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "%s ਨੂੰ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਇਹ ਅਪਵਾਦ ਪੈਦਾ ਕਰਦਾ ਹੈ" #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s ਲਈ %s ਲੋੜ ਦੀ ਕਮੀ ਹੈ" #~ msgid ", Action: " #~ msgstr ", ਕਾਰਵਾਈ: " #~ msgid ", Trigger: " #~ msgstr ", ਟਿਗਰ: " #~ msgid "package" #~ msgstr "ਪੈਕੇਜ" #~ msgid "selection" #~ msgstr "ਚੋਣ" #~ msgid "pattern" #~ msgstr "ਪੈਟਰਨ" #~ msgid "product" #~ msgstr "ਪਰੋਡੱਕਟ" #~ msgid "patch" #~ msgstr "ਪੈਚ" #~ msgid "script" #~ msgstr "ਸਕ੍ਰਿਪਟ" #~ msgid "message" #~ msgstr "ਸੁਨੇਹਾ" #~ msgid "atom" #~ msgstr "ਐਟਮ" #~ msgid "system" #~ msgstr "ਸਿਸਟਮ" #~ msgid "Resolvable" #~ msgstr "ਹੱਲ-ਯੋਗ" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "ਇਹ ਹੱਲ ਦੀ ਕੋਸ਼ਿਸ਼ ਨੂੰ ਗਲਤ ਮਾਰਕ ਕਰੋ।" #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "ਹੱਲ-ਯੋਗ %s ਨੂੰ ਅਣ-ਇੰਸਟਾਲ ਯੋਗ ਮਾਰਕ ਕਰੋ" #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "%s ਨੂੰ ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਸ਼ੈਡਿਊਲ ਕੀਤਾ ਗਿਆ ਹੈ, ਪਰ ਨਿਰਭਰਤਾ ਸਮੱਸਿਆ ਕਰਕੇ ਸੰਭਵ ਨਹੀਂ ਹੈ।" #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "%s ਨੂੰ ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਇਹ ਇਸ ਸਿਸਟਮ ਉੱਤੇ ਲਾਗੂ ਨਹੀਂ ਹੁੰਦਾ ਹੈ।" #~ msgid "Establishing %s" #~ msgstr "%s ਤਿਆਰ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" #~ msgid "Installing %s" #~ msgstr "%s ਇੰਸਟਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ" #~ msgid "Skipping %s: already installed" #~ msgstr "%s ਛੱਡਿਆ ਜਾਂਦਾ ਹੈ: ਪਹਿਲਾਂ ਹੀ ਇੰਸਟਾਲ ਹੈ" #~ msgid "There are no alternative providers of %s installed" #~ msgstr "ਇੰਸਟਾਲ %s ਦੇਣ ਵਾਲਾ ਕੋਈ ਬਦਲਵਾਂ ਪਰੋਵਾਈਡਰ ਨਹੀਂ ਹੈ।" #~ msgid "for %s" #~ msgstr "%s ਲਈ" #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਅਣ-ਇੰਸਟਾਲ ਕਰਨ ਲਈ ਸ਼ੈਡਿਊਲ ਹੈ।" #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਉਸ %s ਦਾ ਹੋਰ ਵਰਜਨ ਪਹਿਲਾਂ ਹੀ ਇੰਸਟਾਲ ਹੈ।" #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਅਣ-ਇੰਸਟਾਲ-ਯੋਗ ਹੈ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਖੁਦ ਹੀ ਇੰਸਟਾਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।" #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਲਾਕ ਹੈ" #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s %s ਦਿੰਦਾ ਹੈ, ਪਰ ਵੇਂਡਰ (%s) ਹੋਰ ਹੈ।" #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "%s ਦੀ ਲੋੜ ਨੂੰ %s ਲਈ ਪੂਰਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ" #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s ਲਾਕ ਹੈ ਅਤੇ ਅਣ-ਇੰਸਟਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।" #~ msgid "from %s" #~ msgstr "%s ਤੋਂ" #~ msgid " Error!" #~ msgstr " ਗਲਤੀ!" #~ msgid " Important!" #~ msgstr " ਖਾਸ!" #~ msgid "%s depended on %s" #~ msgstr "%s %s ਉੱਤੇ ਨਿਰਭਰ ਹੈ" #~ msgid "%s is recommended by %s" #~ msgstr "%s %s ਵਲੋਂ ਸਿਫਾਰਸ਼ੀ ਹੈ" #~ msgid "%s is suggested by %s" #~ msgstr "%s ਲਈ %s ਵਲੋਂ ਸੁਝਾਅ ਹੈ" #~ msgid "%s is enhanced by %s" #~ msgstr "%s %s ਵਲੋਂ ਇੰਹਾਂਸਡ ਹੈ" #~ msgid "%s is supplemented by %s" #~ msgstr "%s %s ਦਾ ਸਪਲੀਮੈਂਟ ਹੈ" #~ msgid "%s part of %s" #~ msgstr "%s %s ਦਾ ਭਾਗ ਹੈ" #~ msgid "Reading '%s' repository cache" #~ msgstr "'%s' ਰਿਪੋਜ਼ਟਰੀ ਕੈਚੇ ਪੜ੍ਹੀ ਜਾ ਰਹੀ ਹੈ" #~ msgid "Cleaning repository '%s' cache" #~ msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਕੈਚੇ ਸਾਫ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ" #~ msgid "Reading repository '%s' cache" #~ msgstr "ਰਿਪੋਜ਼ਟਰੀ '%s' ਕੈਚੇ ਪੜ੍ਹੀ ਜਾ ਰਹੀ ਹੈ" #~ msgid "%s will be deleted by another application. (ApplLow/ApplHigh)\n" #~ msgstr "%s ਨੂੰ ਹੋਰ ਕਾਰਜ ਵਲੋਂ ਹਟਾਇਆ ਜਾਵੇਗਾ। (ApplLow/ApplHigh)\n" #~ msgid "Requirememt %s cannot be fulfilled." #~ msgstr "%s ਲੋੜ ਪੂਰੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ।" #~ msgid "Make a solver run with ALL possibilities." #~ msgstr "ਸੋਲਵਰ ਨੂੰ _ਸਭ_ ਸੰਭਵਾਨਾਵਾਂ ਨਾਲ ਚਲਾਓ" #, fuzzy #~ msgid "Make a solver run with best architecture only." #~ msgstr "ਸੋਲਵਰ ਨੂੰ _ਸਭ_ ਸੰਭਵਾਨਾਵਾਂ ਨਾਲ ਚਲਾਓ" #, fuzzy #~ msgid "Start the next solver run with doubled timeout." #~ msgstr "ਸੋਲਵਰ ਨੂੰ _ਸਭ_ ਸੰਭਵਾਨਾਵਾਂ ਨਾਲ ਚਲਾਓ" libzypp-17.36.5/po/pl.po000066400000000000000000003563241476576476200150240ustar00rootroot00000000000000# Copyright (C) 2006 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # # Mariusz Fik , 2010, 2011, 2012, 2014, 2015. # Przemyslaw Bojczuk , 2013. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2019-03-14 18:32+0000\n" "Last-Translator: Ewelina Michalowska \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 3.3\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Nieznane państwo: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Bez kodu" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andora" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Zjednoczone Emiraty Arabskie" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua i Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antyle Holenderskie" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktyda" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentyna" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Amerykańskie" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Wyspy Alandzkie" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbejdżan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bośnia i Hercegowina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesz" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgia" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bułgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrajn" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudy" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Boliwia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazylia" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamy" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Wyspa Bouveta" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Białoruś" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Wyspy Kokosowe" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Republika Środkowoafrykańska" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Szwajcaria" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Wybrzeże Kości Słoniowej" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Wyspy Cooka" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Chiny" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kostaryka" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Wyspy Zielonego Przylądka" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Wyspa Bożego Narodzenia" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cypr" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Czechy" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Niemcy" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Dżibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dania" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikana" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algieria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekwador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sahara Zachodnia" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Erytrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Hiszpania" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlandia" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidżi" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandy (Malwiny)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikronezja" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Wyspy Owcze" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francja" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Francja metropolitalna" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Zjednoczone Królestwo" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gruzja" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Gujana Francuska" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grenlandia" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Gwinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Gwadelupa" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Gwinea Równikowa" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grecja" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia Południowa i Sandwich Południowy" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Gwatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Gwinea Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Gujana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Wyspy Heard i McDonalda" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Chorwacja" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Węgry" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonezja" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlandia" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Wyspa Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indie" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Brytyjskie Terytorium Oceanu Indyjskiego" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islandia" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Włochy" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamajka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordania" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonia" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgistan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodża" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komory" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts i Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Korea Północna" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Korea Południowa" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwejt" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kajmany" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazachstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laotańska Republika Ludowo-Demokratyczna" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Liban" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litwa" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Łotwa" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Mołdawia" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Czarnogóra" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint-Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Wyspy Marshalla" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Birma" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Mariany Północne" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martynika" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauretania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Malediwy" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksyk" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malezja" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nowa Kaledonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Holandia" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norwegia" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nowa Zelandia" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinezja Francuska" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua - Nowa Gwinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipiny" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polska" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint-Pierre i Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Portoryko" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Autonomia Palestyńska" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugalia" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paragwaj" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumunia" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Federacja Rosyjska" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arabia Saudyjska" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Wyspy Salomona" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seszele" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Szwecja" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Święta Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Słowenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard i Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Słowacja" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Wyspy Św. Tomasza i Książęca" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Salwador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Suazi" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Wyspy Turks i Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Czad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Francuskie Terytoria Południowe" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tajlandia" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadżykistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunezja" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor Wschodni" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turcja" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trynidad i Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tajwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Dalekie Wyspy Mniejsze Stanów Zjednoczonych" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Stany Zjednoczone Ameryki Północnej" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Urugwaj" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Watykan" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent i Grenadyny" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Wenezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Brytyjskie Wyspy Dziewicze" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Amerykańskie Wyspy Dziewicze" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Wietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Republika Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis i Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Majotta" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Republika Południowej Afryki" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Dostarcza" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Wymagania wstępne" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Wymaga" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Konflikty" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Zastępuje" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Zaleca" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Sugeruje" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Ulepsza" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Uzupełnia" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Nieznany język: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "abchaski" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "aceh" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "aczoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "adygejski" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "afroazjatyckie (inne)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "akadyjski" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "albański" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "aleucki" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "języki algonkińskie" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "ałtajski południowy" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "amharski" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "staroangielski (ok. 450–1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "języki apaczańskie" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "arabski" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "aramejski" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "aragoński" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "ormiański" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "araukański" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "sztuczne (inne)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "arawakańskie" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "assamski" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "asturyjski" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "języki atapaskańskie" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "języki australijskie" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "awarski" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "awestyjski" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "ajmara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "azerbejdżański" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "języki bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "baszkirski" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "beludżyjski" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "balijski" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "baskijski" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "bałtyckie (inne)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "bedża" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "białoruski" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "bengalski" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "berberskie (inne)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "bhodżpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "biharski" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "bikolskie" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "bantu (inne)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "bośniacki" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "bradż" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "bretoński" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "batackie (Indonezja)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "buriacki" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "bugijski" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "bułgarski" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "birmański" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "kadoskie" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Indian środkowoamerykańskich (inne)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "karaibski" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "kataloński" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "kaukaskie (inne)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "celtyckie (inne)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "czibczańskie" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "czeczeński" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "czagatajski" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "chiński" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "czukocki" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "maryjski" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Dialekt czinucki" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "czipewiański" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "czerokeski" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "starocerkiewnosłowiański" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "czuwaski" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "czejeński" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "języki chamickie" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "koptyjski" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "kornwalijski" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "korsykański" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreolskie i pidżyny oparte na angielskim (inne)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreolskie i pidżyny oparte na francuskim (inne)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreolskie i pidżyny oparte na portugalskim (inne)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "tatarski (krymski)" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreolskie i pidżyny różne (inne)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "kaszubski" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "kuszyckie (inne)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "czeski" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "duński" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "dajackie" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "niewolnicze (atapaskańskie)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "malediwski" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "drawidyjskie (inne)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "łużycki dolny" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "średnioholenderski (ok. 1050–1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "holenderski" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "dzongka" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "egipski (starożytny)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "elamicki" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "angielski" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "średnioangielski (1100–1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "estoński" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "fan" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "farerski" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "fante" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "fidżyjski" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "fiński" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "ugrofińskie (inne)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "francuski" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "średniofrancuski (ok. 1400–1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "starofrancuski (842–ok. 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "fryzyjski" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "fulani" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "friulski" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "germańskie (inne)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "gruziński" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "niemiecki" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "ge'ez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "gilbertański" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "gaelicki (szkocki)" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "irlandzki" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "galicyjski" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "mański" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "średniowysokoniemiecki (ok. 1050–1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "starowysokoniemiecki (ok. 750–1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "gorontalskie" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "gocki" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "grecki, starożytny (do 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "grecki, współczesny (1453–)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "gudżarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "haiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "hausański" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "hawajski" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "hebrajski" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "himaczali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "hetycki" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "hiri motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "łużycki górny" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "węgierski" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "islandzki" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "sichuan yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "interlingwe" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "ilokano" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "interlingua (Międzynarodowe Stowarzyszenie Języka Pomocniczego)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "indyjskie (inne)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "indonezyjski" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "indoeuropejskie (inne)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "inguski" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "inupiak" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "irańskie (inne)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "języki irokeskie" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "włoski" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "jawajski" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "japoński" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "judeo-perski" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "udeo-arabski" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "karakałpacki" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "kabylski" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "kareński" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "kaszmirski" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "kazachski" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "kabardyjski" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "khazi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "khoisan (inne)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "khmerski" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "chotański" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "kinjarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "kirgiski" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "koreański" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "keresański" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "karaczajsko-bałkarski" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "kuruch" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "kwanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "kumycki" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "kurdyjski" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "laotański" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "łaciński" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "łotewski" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "lezgiński" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "limburgan" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "litewski" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "luksemburski" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "luba-lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "luba-katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "luo (Kenia i Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "macedoński" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "madurski" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "marshall" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "makasarski" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "malajalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "maoryjski" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "języki malajo-polinezyjskie (inne)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "masajski" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "malajski" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "mandarski" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "średnioirlandzki (900–1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "micmac" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "języki różne" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "mon-khmerskie (inne)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "malgaski" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "maltański" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "mandżurski" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "języki manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "mołdawski" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "mongolski" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Wielojęzyczność" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "języki munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "mirandyjski" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "języki majskie" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Indian północnoamerykańskich (inne)" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "neapolitański" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "ndebele, południowy" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "ndebele, północny" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "dolny niemiecki" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "nepalski" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "nepalski Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "niger-kordofańskie (inne)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "niueński" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "norweski (nynorsk)" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "norweski (Bokmål)" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "staronordyjski" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "norweski" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "sotho północny" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "języki nubijskie" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "newari klasyczny" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "njamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "njankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "njoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "nzema" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "okcytańskie (po 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "odżibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "orija" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "osetyński" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "turecki, osmańskie (1500–1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "języki otomiańskie" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "papuaskie (inne)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "pahlawi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "pampangan" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "pandżabski" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "palauański" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "staroperski (ok. 600–400 p.n.e.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "perski" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "filipińskie (inne)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "fenicki" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "polski" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "ponapeański" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "portugalski" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakryty" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "staroprowansalski (do 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "pusztu" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "keczua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "radżastani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "rapanuański" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "rarotongański" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "romańskie (inne)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "retoromański" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "cygański / romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "rumuński" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "rosyjski" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "jakucki" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Indian południowoamerykańskich (inne)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "języki saliskie" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "samarytański" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "sanskrycki" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "serbski" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "sycylyjski" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "szkocki" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "chorwacki" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "selkupski" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "semickie (inne)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "staroirlandzki (do 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "języki migowe" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "szan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "syngaleski" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "języki Siuksów" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "chińsko-tybetańskie (inne)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "słowiańskie (inne)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "słowacki" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "słoweński" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "lapoński południowy" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "lapoński północny" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "języki sami (inne)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "lulu sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "inar sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "samoański" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "skolt sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "szona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "sogdyjski" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "somalijski" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "sotho południowy" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "hiszpański" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "sardyńskie" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "nilo-saharyjskie (inne)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "sundajski" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "sumeryjski" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "suahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "szwedzki" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "syryjski" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "tahitański" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "tajskie (inne)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "tamilski" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "tatarski" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "teme" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "tadżycki" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "tajski" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "tybetański" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "klingoński" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "tamaszek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "tongański (Niasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "tangański (wyspy Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "neomelanezyjski" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "turkmeński" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "tubuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "języki tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "turecki" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "języki ałtajskie (inne)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "twi (aszanti)" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "tuwiński" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "udmurcki" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "ugarycki" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "ujgurski" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "ukraiński" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "nieokreślony" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "uzbecki" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "wietnamski" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "volapűk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "wotski" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "języki wakasz" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "walijski" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "języki łużyckie" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "walloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "jao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "japski" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "jidysz" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "joruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "języki yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "zapoteckie" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Wykonane zostaną następujące czynności:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "nieznany" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "niewspierany" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Poziom 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Poziom 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Poziom 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Wymagana dodatkowa umowa użytkownika" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "nieprawidłowy" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Nieokreślony poziom wsparcia" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Producent nie zapewnia wsparcia." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Określenie problemu oznacza, że pomoc techniczna obejmuje informacje na " "temat kompatybilności, pomoc w zakresie instalacji, użytkowania i bieżącej " "konserwacji oraz podstawowego rozwiązywania problemów. Pomoc techniczna na " "poziomie 1 nie obejmuje naprawy błędów produktu." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Wyizolowanie problemu oznacza, że pomoc techniczna obejmuje odtworzenie " "problemów użytkownika, oddzielenie ich i dostarczenie rozwiązania problemów " "nieobjętych pomocą techniczną na poziomie 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Rozwiązywanie problemu: pomoc techniczna obejmuje rozwiązywanie złożonych " "problemów przy użyciu metod inżynieryjnych w celu naprawy defektów produktów " "zidentyfikowanych w ramach wsparcia technicznego na poziomie 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" "Do otrzymania pomocy technicznej wymagana jest dodatkowa umowa użytkownika." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Nieznana opcja wsparcia. Brak opisu" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Zarządzanie systemem jest zablokowane przez program o identyfikatorze pid %d " "(%s).\n" "Proszę zamknąć ten program i spróbować ponownie." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Nieznany tryb dopasowania '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Nieznany tryb dopasowania '%s' dla wzorca '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Nieprawidłowe wyrażenie regularne '%s': regcomp zwróciło %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Nieprawidłowe wyrażenie regularne '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Wymagane uwierzytelnienie dla '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Proszę odwiedzić SUSE Customer Center, aby sprawdzić, czy rejestracja jest " "ważna i czy nie wygasła." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Proszę odwiedzić Centrum obsługi klienta firmy Novell, aby sprawdzić, czy " "rejestracja jest ważna i czy nie wygasła." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Tworzenie punktu dołączenia: nie można znaleźć katalogu z możliwością zapisu " "w celu utworzenia punktu dołączenia" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Zainstaluj najpierw pakiet 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Nie można utworzyć katalogu pamięci podręcznej metadanych." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Błąd podczas próby odczytu z '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Nie można utworzyć %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Tworzenie pamięci podręcznej repozytorium nie powiodło się (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Budowanie pamięci podręcznej repozytorium '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Nie można utworzyć pamięci podręcznej w %s - brak uprawnień do zapisu." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Nieobsługiwany typ repozytorium" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Dodawanie repozytorium '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nieprawidłowa nazwa pliku repozytorium pod adresem '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Nie można otworzyć pliku '%s' do zapisu." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Nieznany błąd podczas odczytu z '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Nie można odczytać katalogu repozytorium '%1%': odmowa dostępu" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Odczyt katalogu '%s' nie powiódł się" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Nie można odczytać pliku repozytorium '%1%': odmowa dostępu" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Usuwanie repozytorium '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Nie można określić miejsca przechowywania repozytorium." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Nie można usunąć '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Nie można określić, gdzie jest przechowywana usługa." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Nieznana usługa '%1%': usuwanie osieroconego repozytorium usługi '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Alias repozytorium nie może rozpoczynać się od kropki." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Alias usługi nie może rozpoczynać się od kropki." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Czy kontynuować?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Repozytorium %1% nie definiuje dodatkowych adresów URL 'gpgkey='." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Wyszukiwanie identyfikatora %1% klucza gpg w repozytorium %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Wyszukiwanie identyfikatora %1% klucza gpg w pamięci podręcznej %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Brak wymaganego atrybutu '%s'." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Wymagany jeden lub oba atrybuty '%s' i '%s'." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Weryfikacja podpisu nie powiodła się" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Pakiet %s wygląda na uszkodzony podczas przesyłania. Czy ponowić próbę " "pobrania?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Nie można dostarczyć pakietu %s. Czy ponowić próbę pobrania?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Sprawdzenie applydeltarpm zakończone niepowodzeniem." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm zakończone niepowodzeniem." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Wtyczka usługi nie obsługuje zmiany atrybutu." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Nie można dostarczyć pliku '%s' z repozytorium '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Brak adresu URL w repozytorium." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Plik %1%\n" " z pakietu\n" " %2%\n" " jest w konflikcie z plikiem z pakietu\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Plik %1%\n" " z pakietu\n" " %2%\n" " jest w konflikcie z plikiem z instalacji\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Plik %1%\n" " z instalacji\n" " %2%\n" " jest w konflikcie z plikiem z pakietu\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Plik %1%\n" " z instalacji\n" " %2%\n" " jest w konflikcie z plikiem z instalacji\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Plik %1%\n" " z pakietu\n" " %2%\n" " jest w konflikcie z plikiem\n" " %3%\n" " z pakietu\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Plik %1%\n" " z pakietu\n" " %2%\n" " jest w konflikcie z plikiem\n" " %3%\n" " z instalacji\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Plik %1%\n" " z instalacji\n" " %2%\n" " jest w konflikcie z plikiem\n" " %3%\n" " z pakietu\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Plik %1%\n" " z instalacji\n" " %2%\n" " jest w konflikcie z plikiem\n" " %3%\n" " z instalacji\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Nie można utworzyć sat-pool." # break odnosi się do możliwego zepsucia wynikającego ze zignorowania zależności, więc "zainstaluj" wydaje się tu właściwe. Fisiu #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "zainstaluj %s, ignorując niektóre z zależności" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "zazwyczaj ignoruje pewne zależności" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "sprzeczne żądania" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "problem z kilkoma zależnościami" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "nieobsługiwane żądanie" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "usunięci dostawcy: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "dostawcy, których nie można zainstalować: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "dostawcy, których nie można zainstalować: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "To żądanie uszkodzi system!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignoruj ostrzeżenie o uszkodzeniu systemu" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Instalacja przerwana zgodnie z życzeniem." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " wykonano" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " wykonanie nie powiodło się" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s został już wykonany jako %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " nie wykonano w wyniku przerwania" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Błąd podczas wysyłania powiadomienia o aktualizacji." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nowy komunikat o aktualizacji" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Wystąpił błąd RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Nie udało się zaimportować klucza publicznego z pliku %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Usunięcie klucza publicznego nie powiodło się %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Zmienione pliki konfiguracyjne dla %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm zapisał %s jako %s, ale nie można było określić różnicy" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm zapisał %s jako %s.\n" "Oto pierwszych 25 linii różnicy:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm utworzył %s jako %s, ale nie można było określić różnicy" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm utworzył %s jako %s.\n" "Oto pierwszych 25 linii różnicy:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Dodatkowe wyjście rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "utworzono zapasowy %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Podpis jest OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Nieznany rodzaj podpisu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Nie można sprawdzić podpisu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Podpis jest OK, ale klucz nie jest zaufany" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Klucz publiczny podpisów nie jest dostępny" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Plik nie istnieje lub nie można sprawdzić podpisu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Plik jest niepodpisany" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "nie wygasa" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "wygasł: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "wygasa: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(nie wygasa)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(WYGASŁY)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(wygasa w ciągu 24 godzin)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(wygasa w ciągu %d dnia)" msgstr[1] "(wygasa w ciągu %d dni)" msgstr[2] "(wygasa w ciągu %d dni)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Próbowano zaimportować nieistniejący klucz %s do bazy kluczy %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Nie udało się zaimportować klucza." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Usunięcie klucza nie powiodło się." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Nie znaleziono pliku sygnatury %s" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Niepewny typ '%s' dla %u-bajtowej sumy kontrolnej '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Nie można otworzyć pseudoterminala (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Nie można otworzyć potoku (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Nieprawidłowy ciąg zapytania adresu URL LDAP" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Nieprawidłowy parametr zapytania URL LDAP '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Nie można sklonować obiektu URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Nieprawidłowe odwołanie do pustego obiektu adresu URL" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Analiza komponentów URL nie powiodła się" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historia:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Schemat URL nie zezwala na %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Nieprawidłowe: %s, komponent: '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Komponent — nieprawidłowe: %s" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Analiza zapytania nie jest obsługiwana dla tego adresu URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Schemat URL to wymagany komponent" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Nieprawidłowy schemat URL '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Schemat URL nie zezwala na nazwę użytkownika" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Schemat URL nie zezwala na hasło" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Schemat URL wymaga komponentu hosta" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Schemat URL nie zezwala na komponent hosta" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Nieprawidłowy komponent hosta '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Schemat URL nie zezwala na port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Nieprawidłowy komponent portu '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Schemat URL wymaga nazwy ścieżki" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Względna ścieżka nie jest dozwolona, jeśli usługa istnieje" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Zakodowany łańcuch znaków zawiera bajt NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Nieprawidłowy znak parametru podziału tablicy" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Nieprawidłowy znak parametru podziału mapy" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Nieprawidłowy znak parametru połączenia tablicy" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Polecenie zakończone statusem %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Polecenie zakończone przez sygnał %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Polecenie zakończone nieznanym błędem." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Nie można wykonać polecenia chroot dla '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Nie można wykonać polecenia chdir dla elementu '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" "Nie można wykonać polecenia chdir dla elementu %s w zmienionym katalogu " "głównym chroot %s (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Nie można wykonać '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Nie można wykonać fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Montowanie %s w %s zakończone niepowodzeniem" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Odmontowywanie %s zakończone niepowodzeniem" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Błędna nazwa pliku: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Nieotwarty nośnik podczas próby wykonania akcji '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Pliku '%s' nie znaleziono na nośniku '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Nie można zapisać pliku '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Nośnik niedołączony" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Błędny punkt dołączenia nośnika" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Inicjalizacja pobierania (curl) dla '%s' zakończona niepowodzeniem" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Wyjątek systemowy '%s' na nośniku '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Ścieżka '%s' na nośniku '%s' nie prowadzi do pliku." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Ścieżka '%s' na nośniku '%s' nie prowadzi do katalogu." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Błędny adres URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Pusta nazwa hosta w adresie URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Pusty system plików w adresie URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Pusty element docelowy w adresie URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Nieobsługiwany schemat adresu URI w '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operacja nieobsługiwana przez nośnik" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Błąd pobierania (curl) dla '%s':\n" "Kod błędu: %s\n" "Komunikat błędu: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Napotkano błąd podczas ustawiania opcji pobierania (curl) dla '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Źródło nośników '%s' nie zawiera żądanego nośnika" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Nośnik '%s' jest używany przez inną instancję" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Nie można wysunąć żadnego nośnika" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Nie można wysunąć nośnika '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Dostęp do '%s' zabroniony." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Przekroczono limit czasu podczas dostępu do '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Pobrane dane przekroczyły oczekiwany rozmiar pliku '%s' z '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Położenie '%s' jest tymczasowo niedostępne." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Problem z certyfikatem SSL; proszę sprawdzić, czy certyfikat CA jest " "odpowiedni dla \"%s\"." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Nieobsługiwana metoda uwierzytelniania HTTP: '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Tak" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nie" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Informacja:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Ostrzeżenie:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Błąd:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "gotowe" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "błąd" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Ostrzeżenie: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Pobieranie:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "uruchamianie" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "nie znaleziono" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Nie jest dostępna pomoc dla tej wskazówki." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "pomoc nie jest dostępna dla tej opcji" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "wyświetla wszystkie opcje" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "Tak" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "Nie" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Pod podanym adresem URL nie znaleziono prawidłowych metadanych" #~ msgstr[1] "Pod podanymi adresami URL nie znaleziono prawidłowych metadanych" #~ msgstr[2] "Pod podanymi adresami URL nie znaleziono prawidłowych metadanych" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Wykonywanie skryptu %%posttrans '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Wykonywanie skryptów %posttrans" #~ msgid "Package is not signed!" #~ msgstr "Pakiet nie jest podpisany!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s nie należy do repozytorium uaktualniania dystrybucji" #~ msgid "%s has inferior architecture" #~ msgstr "%s jest przewidziany dla niższej architektury" #~ msgid "problem with installed package %s" #~ msgstr "problem z zainstalowanym pakietem %s" #~ msgid "nothing provides requested %s" #~ msgstr "żaden pakiet nie dostarcza żądanego %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Czy włączono wszystkie wymagane repozytoria?" #~ msgid "package %s does not exist" #~ msgstr "pakiet %s nie istnieje" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "Element %s jest dostarczany przez system i nie można go usunąć" #~ msgid "%s is not installable" #~ msgstr "%s nie można zainstalować" #~ msgid "nothing provides %s needed by %s" #~ msgstr "żaden pakiet nie dostarcza %s wymaganego przez %s" #~ msgid "cannot install both %s and %s" #~ msgstr "nie można jednocześnie zainstalować %s i %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s jest w konflikcie z %s dostarczonym przez %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s dezaktualizuje %s, dostarczony przez %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s dezaktualizuje %s, dostarczony przez %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "" #~ "Element rozwiązywalny %s jest w konflikcie z %s, dostarczonym przez " #~ "samego siebie" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s wymaga %s, lecz nie można spełnić tego wymagania" #~ msgid "remove lock to allow removal of %s" #~ msgstr "usuń blokadę, aby umożliwić usunięcie %s" #~ msgid "do not install %s" #~ msgstr "nie instaluj %s" #~ msgid "keep %s" #~ msgstr "zachowaj %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "usuń blokadę, aby umożliwić instalację %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "" #~ "nie pytaj o instalację wszystkich elementów rozwiązywalnych, " #~ "dostarczających %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "" #~ "nie pytaj o usunięcie wszystkich elementów rozwiązywalnych, " #~ "dostarczających %s" #~ msgid "do not install most recent version of %s" #~ msgstr "nie instaluj najnowszej wersji %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "zachowaj %s, mimo niższej architektury" #~ msgid "install %s despite the inferior architecture" #~ msgstr "zainstaluj %s, mimo niższej architektury" #~ msgid "keep obsolete %s" #~ msgstr "zachowaj starszą wersję %s" #~ msgid "install %s from excluded repository" #~ msgstr "zainstaluj %s z wyłączonego repozytorium" #~ msgid "downgrade of %s to %s" #~ msgstr "przywróć %s do %s" #~ msgid "architecture change of %s to %s" #~ msgstr "zmiana architektury z %s na %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "zainstaluj %s (ze zmianą dostawcy)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "zamiana %s na %s" #~ msgid "deinstallation of %s" #~ msgstr "usunięcie %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Nie można otworzyć pliku blokady : %s" #~ msgid "This action is being run by another program already." #~ msgstr "Inny program wykonuje już tę czynność." #~ msgid "Hal Exception" #~ msgstr "Wyjątek Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Ta wersja libzypp nie zawiera obsługi HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext niepołączony" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive: niezainicjowany" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume: niezainicjowany" #~ msgid "Unable to create dbus connection" #~ msgstr "Nie można utworzyć połączenia dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: nie można utworzyć kontekstu libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: nie można ustanowić połączenia dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "Nie można zainicjować kontekstu HAL — demon hald nie jest uruchomiony?" #~ msgid "Not a CDROM drive" #~ msgstr "To nie jest napęd CD-ROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Nie można zainicjować atrybutów muteksu" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Nie można ustawić atrybutu rekurencyjności muteksu" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Nie można zainicjować rekurencyjnego muteksu" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Nie można pobrać blokady muteksu" #~ msgid "Can't release the mutex lock" #~ msgstr "Nie można zwolnić blokady muteksu" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Nie udało się zaimportować klucza publicznego z pliku %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Usunięcie klucza publicznego nie powiodło się %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Nie można znaleźć dostępnego urządzenia pętli do zamontowania pliku " #~ "obrazu z '%s'" #~ msgid "do not keep %s installed" #~ msgstr "nie utrzymuj zainstalowanego %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "Nie można utworzyć klucza publicznego %s z zestawu %s do pliku %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "" #~ "Inicjalizacja pobierania (Metalink curl) dla '%s' zakończona " #~ "niepowodzeniem" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Błąd pobierania (metalink curl) dla '%s':\n" #~ "Kod błędu: %s\n" #~ "Komunikat błędu: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Przerwano pobieranie na %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Pobieranie przerwane przez użytkownika" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Napotkano błąd podczas ustawiania opcji pobierania (metalink curl) dla " #~ "'%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Nie udało się pobrać %s z %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia i Czarnogóra" libzypp-17.36.5/po/pt.po000066400000000000000000004147501476576476200150320ustar00rootroot00000000000000# translation of zypp.pt.po to Portuguese # PORTUGUESE 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. # # Bruno David Rodrigues , 2000. # João Teles , 1999-2000. # Antonio Cardoso Martins , 2006, 2007, 2008. # Carlos Gonçalves , 2007. msgid "" msgstr "" "Project-Id-Version: zypp.pt\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2020-12-06 18:26+0000\n" "Last-Translator: Luís Tiago Favas \n" "Language-Team: Portuguese \n" "Language: pt\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: Weblate 3.6.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "País desconhecido: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Sem Código" # name for AND #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Emirados Árabes Unidos" # name for AFG #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afeganistão" # name for ATG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antígua e Barbuda" # name for AIA #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguila" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albânia" # name for ARM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Arménia" # name for ANT #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antilhas Holandesas" # name for AGO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # name for ATA #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antárctida" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # name for ASM #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Americana" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Áustria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Austrália" # name for ABW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # name for ALA #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Ilhas Aland" # name for AZE #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaijão" # name for BIH #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bósnia e Herzegovina" # name for BRB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Bélgica" # name for BFA #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burquina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgária" # name for BHR #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Barém" # name for BDI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # name for BEN #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benim" # name for BMU #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudas" # name for BRN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolívia" # name for BRA #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasil" # name for BHS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Baamas" # name for BTN #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Butão" # name for BVT #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Ilha Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" # name for BLZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canadá" # name for CCK #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Ilhas Cocos" # name for COG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" # name for CAF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "República Central Africana" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Suíça" # name for CIV #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Costa do Marfim" # name for COK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Ilhas Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" # name for CMR #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camarões" # name for CHN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colômbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" # name for CUB #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" # name for CPV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cabo Verde" # name for CXR #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Ilha Christmas" # name for CYP #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Chipre" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "República Checa" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Alemanha" # name for DJI #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Jibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dinamarca" # name for DMA #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Domínica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "República Dominicana" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algéria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Equador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estónia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipto" # name for ESH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sara Ocidental" # name for ERI #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritreia" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Espanha" # name for ETH #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiópia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlândia" # name for FJI #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" # name for FLK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Ilhas Falkland (Malvinas)" # official_name for FSM #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Estados Federados da Micronésia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Ilhas Faroé" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "França" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "França Metropolitana" # name for GAB #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabão" # name for GBR #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Reino Unido" # name for GRD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Granada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" # name for GUF #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guiana Francesa" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # name for GHA #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" # name for GIB #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Gronelândia" # name for GMB #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gâmbia" # name for GIN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guiné" # name for GLP #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadalupe" # name for GNQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guiné Equatorial" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grécia" # name for SGS #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Ilhas Geórgia do Sul e Sandwich do Sul" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" # name for GUM #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # name for GNB #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guiné-Bissau" # name for GUY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guiana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" # name for HMD #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Ilhas Heard e McDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croácia" # name for HTI #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hungria" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonésia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanda" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Ilha de Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Índia" # name for IOT #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Território Britânico do Oceano Índico" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraque" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irão" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islândia" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Itália" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" # name for JAM #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordânia" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japão" # name for KEN #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Quénia" # name for KGZ #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Quirguizistão" # name for KHM #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Camboja" # name for KIR #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Quiribati" # name for COM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comoros" # name for KNA #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "São Cristóvão e Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Coreia do Norte" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Coreia do Sul" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" # name for CYM #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Ilhas Caimão" # name for KAZ #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Cazaquistão" # name for LAO #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "República Democrática Popular do Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Líbano" # name for LCA #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Santa Lúcia" # name for LIE #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Listenstaine" # name for LKA #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanca" # name for LBR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Libéria" # name for LSO #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesoto" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituânia" # name for LUX #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburgo" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvia" # name for LBR #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Líbia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marrocos" # name for MCO #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Mónaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldávia" # name for SCG #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" # name for SMR #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Coletividade de São Martinho" # name for MDG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagáscar" # name for MHL #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Ilhas Marshall" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedónia" # name for MLI #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # name for MMR #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mianmar" # name for MNG #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongólia" # name for MAC #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macau" # name for MNP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Marianas do Norte" # name for MTQ #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinica" # name for MRT #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritânia" # name for MSR #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Monserrate" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # name for MUS #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Maurícia" # name for MDV #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldivas" # name for MWI #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malavi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "México" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malásia" # name for MOZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Moçambique" # name for NAM #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namíbia" # name for NCL #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nova Caledónia" # name for NER #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Níger" # name for NFK #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Ilha Norfolk" # name for NGA #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigéria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicarágua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Holanda" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noruega" # name for NPL #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" # name for NRU #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # name for NIU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nova Zelândia" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omã" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panamá" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Perú" # name for PYF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinésia Francesa" # name for PNG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papuásia-Nova Guiné" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipinas" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Paquistão" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polónia" # name for SPM #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "São Pedro e Miquelon" # name for PCN #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" # official_name for PSE #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Território Palestiniano" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" # name for PLW #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" # name for REU #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunião" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Roménia" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Sérvia" # name for RUS #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Federação da Rússia" # name for RWA #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arábia Saudíta" # name for SLB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Ilhas Salomão" # name for SYC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seicheles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudão" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suécia" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapura" # name for SHN #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Santa Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Eslovénia" # name for SJM #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard e Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Eslováquia" # name for SLE #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Serra Leoa" # name for SMR #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "São Marino" # name for SEN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # name for SOM #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somália" # name for SUR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" # name for STP #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Síria" # name for SWZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Suazilândia" # name for TCA #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Ilhas Turcas e Caicos" # name for TCD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chade" # name for ATF #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Territórios Austrais Franceses" # name for TGO #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tailândia" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tajiquistão" # name for TKL #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" # name for TKM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turquemenistão" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunísia" # name for TON #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor Leste" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turquia" # name for TTO #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidade e Tobago" # name for TUV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzânia" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ucrânia" # name for UGA #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # name for UMI #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Ilhas Menores Distantes dos Estados Unidos" # name for USA #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Estados Unidos" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbequistão" # name for VAT #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Santa Sé (Estado da Cidade do Vaticano)" # name for VCT #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "São Vicente e Granadinas" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # official_name for VGB #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Ilhas Virgens Britânicas" # name for VIR #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Ilhas Virgens Americanas, E.U." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietname" # name for VUT #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # name for WLF #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" # name for WSM #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Iémen" # name for MYT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "África do Sul" # name for ZMB #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zâmbia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabué" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Providencia" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Pré requer" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Requer" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Conflitua" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Obsoletos" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recomenda" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Sugere" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Melhorar" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Suplementos" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Idioma desconhecido: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhazião" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinese" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asiático (Outra)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadian" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanês" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Idiomas Algonquianos" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altai do Sul" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amárico" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Inglês Antigo (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Idiomas Apache" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Árabe" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaic" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonese" # name for ARM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Arménio" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucanian" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Artificial (Outro)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" # /usr/lib/YaST2/clients/logcontrol.ycp:64 #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamese" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturiano" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Idiomas Athapascan" # /usr/lib/YaST2/clients/sw_single.ycp:12 #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Idiomas Australianos" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avaric" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestão" # name for SWZ #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" # name for MMR #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbeijão" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" # /usr/lib/YaST2/clients/sw_single.ycp:12 #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Idiomas Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinese" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basco" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Báltico (Outro)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorusso" # name for BMU #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber (Outro)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" # name for HTI #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (Outro)" # name for BEN #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bósnio" # name for BRA #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretão" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonésia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginese" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Búlgaro" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmês" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Índio América Central (Outro)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalão" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucasiano (Outro)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Céltico (Outro)" # name for COM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" # name for CHN #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Checheno" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinês" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" # name for MLI #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Jargão Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Church Slavic" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Idiomas Chamic" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Coptic" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornish" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corsicano" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Criolo e Pidgins, Baseados em Inglês (Outros)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Criolo e Pidgins, Baseados em Francês (Outros)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Criolo e Pidgins, Baseados em Português (Outros)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Crimean Tatar" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Criolo e Pidgins (Outros)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kashubian" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitic (Outro)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Checo" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dinamarquês" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidian (Outro)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Baixo-Sórbio" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Holandês, Médio (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Holandês" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" # name for TON #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egípcio (Antigo)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inglês" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Inglês, Médio (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estónio" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faroês" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" # name for FJI #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijiano" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finlandês" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finno-Ugrian (Outro)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francês" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francês, Médio (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francês, Antigo (842-ca.1400)" # /usr/lib/YaST2/clients/adsl_custom.ycp:115 #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisão" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" # /usr/lib/YaST2/clients/adsl_custom.ycp:115 #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulian" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" # name for GAB #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germânico (Outros)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgiano" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Alemão" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertês" # name for MLI #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaélico" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandês" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galêgo" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Alemão, Médio Alto (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Alemão, Alto Antigo (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gótico" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grêgo, Antigo (até 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grêgo, Moderno (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" # name for HTI #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitiano" # /usr/lib/YaST2/clients/remotechooser.ycp:37 #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Havaiano" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebreu" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" # name for HTI #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" # name for HTI #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hittite" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" # name for HTI #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Sórbio Alto" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Húngaro" # /usr/lib/YaST2/clients/remotechooser.ycp:37 #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandês" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" # /usr/lib/YaST2/clients/logcontrol.ycp:69 #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indic (Outro)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonês" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-Europeu (Outro)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraniano (Outro)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Idiomas Iroquoians" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiano" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanês" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonês" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeu-Persa" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeu-Arábico" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" # name for KAZ #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (Outro)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Jemer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanês" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" # name for COG #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreano" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Curdo" # name for KEN #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latim" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letão" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgan" # name for AGO #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituano" # name for COG #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" # name for LUX #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburguês" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" # name for GHA #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenia e Tanzânia)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedónio" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurês" # name for MUS #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" # name for MHL #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshalês" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" # name for MDG #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" # name for MLI #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronésio (Outro)" # name for MUS #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" # name for MWI #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malaio" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" # name for MMR #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" # According to QIM Screenshot # -ke- #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandês, Médio (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Idiomas Vários" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (Outro)" # name for MDG #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagasy" # name for MDV #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltês" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" # name for MLI #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Idiomas Manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldávo" # name for MNG #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" # /usr/lib/YaST2/clients/sw_single.ycp:12 #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Idiomas Múltiplos" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Idiomas Mundas" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Grêgo" # name for MDV #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandês" # name for MUS #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Idiomas Mayan" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Índio Norte Americano" # name for NPL #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitan" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, Sul" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, Norte" # name for TON #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Alemão Baixo" # name for NPL #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalês" # name for NPL #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanian (Outro)" # name for NIU #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Nynorsk Norueguês" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Bokmal Norueguês" # name for TON #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norse, Antigo" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norueguês" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho do Norte" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Idiomas Nubian" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari Clássico" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (posto 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turco, Otomano (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Idiomas Otomian" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuan (Outro)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" # name for MLI #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" # name for PLW #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persa, Antigo (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persa" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipino (Outro)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Phoenician" # name for MLI #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polaco" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Português" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Idiomas Prakrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provençal, Antigo (até 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" # name for KAZ #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romance (Outro)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Raeto-Romance" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romeno" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romeno" # name for REU #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russo" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" # name for WSM #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Índio da América so Sul (Outro)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Idiomas Salishan" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Aramaico Samaritano" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanscrito" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Sérvio" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliano" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Escocês" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croata" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semítico (Outro)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandês, Antigo (até 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Linguagem Gestual" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" # name for WSM #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" # name for AGO #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Idiomas Siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetano (Outro)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Eslavo" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Eslovaco" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Esolveno" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sami Meridional" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Sami Setentrional" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Idiomas Sami (Outros)" # name for WSM #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" # name for WSM #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoano" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" # workflow: "Software-Auswahl" # -ke- #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" # name for SOM #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalês" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, Meridional" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Espanhol" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardiniano" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-Saharan (Outro)" # name for HTI #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanese" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumério" # name for SWZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Sueco" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siríaco" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Taitiano" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tailandêses (Outros)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tailandês" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetano" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" # name for NGA #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinha" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" # name for SLB #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Olhas Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" # /usr/lib/YaST2/clients/adsl_custom.ycp:115 #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" # name for TON #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turcomano" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Idiomas Tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turco" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaico (Outro)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuviniano" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" # name for HTI #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritic" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ucraniano" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" # /usr/lib/YaST2/clients/logcontrol.ycp:69 #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Indeterminado" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbek" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamita" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Idiomas Wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Gaulês" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Idiomas Sórbio" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yiddish" # name for ABW #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Idiomas Yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" # name for BTN #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" # name for TUV #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "As seguintes acções serão realizadas:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "desconhecido" #: zypp/VendorSupportOptions.cc:17 #, fuzzy msgid "unsupported" msgstr " - não suportado" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "O disco não existe." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, fuzzy, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "A gestão do sistema está bloqueada pela aplicação com pid %d. Por favor " "encerre esta aplicação antes de tentar novamente." #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Comando '%s' desconhecido" #: zypp/base/StrMatcher.cc:153 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Digest %s desconhecido para o ficheiro %s." #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Expressão regular inválida '%s': regcomp devolveu %d" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Expressão regular inválida '%s': regcomp devolveu %d" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autenticação requerida para '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "A limpar a cache dos metadados raw de '%s'." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, fuzzy, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Erro ao interpretar a metadata de '%s':" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Não é possível criar %s: %m\n" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Falha na interpretação de %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "A construir a cache do repositório '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 #, fuzzy msgid "Unhandled repository type" msgstr "Repositório activado" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "A Adicionar repositório '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Ficheiro de exportação inválido." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Não é possível abrir ficheiro para escrita." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Comando '%s' desconhecido" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Falha na interpretação de %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "A remover o repositório '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Não é possível ejectar o suporte '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "O nome da MV não pode iniciar com um dígito." #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr "O nome da MV não pode iniciar com um dígito." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" # internal key used: Ok #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Continuar?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, fuzzy, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Está em falta um ficheiro necessário: " #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "O pacote %s falhou a verificação de integridade. Pretende tentar novamente?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "O pacote %s falhou a verificação de integridade. Pretende tentar novamente?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "falhou a verificação applydeltarpm." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "falhou o applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Não é possível fornecer o ficheiro '%s' a partir do repositório '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Nenhum url no repositório." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Não é possível criar o sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "Ignorar de uma forma geral algumas dependências" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "pedidos em conflito" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "Não foi possível instalar %s devido a problemas de dependências" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "fornecedores apagados: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "fornecedores não instaláveis: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "fornecedores não instaláveis: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "A instalação foi interrompida conforme indicado." #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "Executar" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "Falhou a Execução DBI: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "falha no RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Falha ao importar a chave pública %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Falha ao remover a chave pública %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Ficheiros de configuração modificados para %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "o rpm %s foi guardado como %s, mas foi impossível determinar a diferença" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "o rpm %s foi guardado com %s.\n" "Tem as primeiras 25 linhas diferentes:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "o rpm %s foi criado como %s, mas foi impossível determinar a diferença" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "o rpm %s foi criado com %s.\n" "Tem as primeiras 25 linhas diferentes:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "Resultado adicional do rpm:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "cópia de segurança %s criada" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Falha ao importar a chave pública %1%" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Falha ao apagar chave." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Ficheiro de assinatura %s não encontrado" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tipo '%s' dúbio para soma de verificação de %u byte '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Não foi possível abrir o pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Não é possível abrir o pipe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Cadeia de interrogação URL de LDAP inválida" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Parâmetro '%s' de interrogação URL de LDAP inválido" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Não é possível clonar o objecto Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Referência para objecto Url vazia é inválida" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Não é possível interpretar os componentes Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Histórico:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "O esquema url não permite um %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "componente %s inválido '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Componente %s inválido" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Interpretação da cadeia de interrogação não é suportado para este URL." #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "O esquema de url é um componente requerido" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Esquema de Url inválido '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "O esquema do Url não permite um nome de utilizador" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "O esquema do Url não permite uma palavra passe" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "O esquema de Url requer um componente de computador (host)" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "O esquema do Url não permite um componente de computador (host)" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Componente de computador inválido '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "O esquema de Url não permite um porto" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Componente de porto inválido '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "O esquema de Url requer um nome de caminho" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Caminho relativo não é permitido se a autoridade existe" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "A cadeia codificada contém um byte NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Parâmetro do caracter do separador de dívisão da lista inválido" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Parâmetro do caracter do separador de divisão do mapa inválido" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Parâmetro do caracter do separador de junção da lista inválido" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Comando terminou com estado %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Comando foi morto pelo sinal %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Comando terminou com erro desconhecido." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Não é possível fazer chroot para '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Não foi possível fazer chdir a '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Não foi possível fazer chdir a '%s' dentro de chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Não é possível executar '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Não é possível bifurcar (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Falha ao montar %s em %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Falha ao desmontar %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nome de ficheiro incorrecto: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Ficheiro '%s' não foi encontrado no suporte '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Não é possível escrever o ficheiro '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Mau ponto de ligação com o suporte" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Inicialização da descarga (curl) falhou para '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI mal formado" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nome de computador vazio no URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Sistema de ficheiros vazio no URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destino vazio no URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Esquema de URI não suportado em '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Erro de descarga (curl) para '%s':\n" "Código do erro: %s\n" "Mensagem do erro: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Ocorreu um erro durante a definição das opções de descarga (curl) para '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Não é possível ejectar nenhum suporte" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Não é possível ejectar o suporte '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Foi negada a autorização para aceder a '%s'." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, fuzzy, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Tempo limite excedido quando acedia a '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " problema no certificado SSL, verifique se o certificado de CA é OK para " "'%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Método '%s' de autenticação HTTP não suportado" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Sim" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Não" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Nota:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Aviso:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Erro:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "concluído" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "atenção" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "erro" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Aviso: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "A obter:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "a iniciar" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "não encontrado" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Não existe ajuda disponível para esta mensagem." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "Não existe ajuda disponível para esta opção" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "mostrar todas as opções" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "sim" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "não" #, fuzzy #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "" #~ "Não foi encontrada uma metadata válida no(s) URL(s) especificado(s)" #~ msgstr[1] "" #~ "Não foi encontrada uma metadata válida no(s) URL(s) especificado(s)" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s fornece %s, mas tem outra arquitectura." #~ msgid "problem with installed package %s" #~ msgstr "problema com o pacote %s instalado" #~ msgid "nothing provides requested %s" #~ msgstr "nada fornece %s solicitado" #~ msgid "%s is not installable" #~ msgstr "%s não é instalável" #~ msgid "nothing provides %s needed by %s" #~ msgstr "nada fornece %s necessário por %s" #~ msgid "cannot install both %s and %s" #~ msgstr "não é possível instalar tanto %s como %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s conflitua com %s fornecido por %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s torna obsoleto %s fornecido por %s" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s torna obsoleto %s fornecido por %s" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "Resolúvel %s conflitua com %s fornecido por ele próprio" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s requer %s, mas este requisito não pode ser fornecido" #~ msgid "do not install %s" #~ msgstr "não instalar %s" #~ msgid "keep %s" #~ msgstr "manter %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "não perguntar para instalar um resolúvel que fornece %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "não perguntar para apagar todos os resolúveis que fornecem %s" #~ msgid "do not install most recent version of %s" #~ msgstr "não instalar a versão mais recente de %s" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s fornece %s, mas tem outra arquitectura." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "instalar %s apesar de alterar a arquitectura" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s obsoleto %s" #, fuzzy #~ msgid "install %s from excluded repository" #~ msgstr "Repositório activado" #~ msgid "downgrade of %s to %s" #~ msgstr "desactualização de %s para %s" #~ msgid "architecture change of %s to %s" #~ msgstr "alteração de arquitectura de %s para %s" #, fuzzy #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "instalar %s (com alteração do vendedor)\n" #~ " %s\n" #~ "-->\n" #~ " %s" #~ msgid "replacement of %s with %s" #~ msgstr "substituição de %s por %s" #~ msgid "deinstallation of %s" #~ msgstr "desinstalação de %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Não é possível abrir ficheiro de bloqueio: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Esta acção já está a ser executada por outro programa." #~ msgid "Hal Exception" #~ msgstr "Excepção Hal" #~ msgid "HalContext not connected" #~ msgstr "HalContext não ligado" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive não inicializado" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume não inicializado" #~ msgid "Unable to create dbus connection" #~ msgstr "Não foi possível criar a ligação dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Não é possível criar o contexto libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Não é possível definir a ligação dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "Não foi possível inicializar o contexto HAL -- o hald não está em " #~ "execução?" #~ msgid "Not a CDROM drive" #~ msgstr "Não é uma unidade de CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Não é possível inicializar os atributos da mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Não é possível definir o atributo da mutex recursiva" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Não é possível inicializar a mutex recursiva" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Não foi possível adquirir o bloqueio da mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Não foi possível libertar o bloqueio da mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Falha ao importar a chave pública do ficheiro %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Falha ao remover a chave pública %s: %s" #, fuzzy #~ msgid "generally ignore of some dependecies" #~ msgstr "Ignorar de uma forma geral algumas dependências" #~ msgid "do not forbid installation of %s" #~ msgstr "não proibir a instalação de %s" #~ msgid "do not keep %s installed" #~ msgstr "não manter %s instalado" #~ msgid "Download interrupted at %d%%" #~ msgstr "توقف التحميل في %d%%" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Não é possível criar a chave pública %s a partir do chaveiro %s para o " #~ "ficheiro %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "Tentativa de importar uma chave %s não existente no chaveiro %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Não é possível fazer chdir para '/' dentro do chroot (%s)." #, fuzzy #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Inicialização da descarga (curl) falhou para '%s'" #, fuzzy #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Erro de descarga (curl) para '%s':\n" #~ "Código do erro: %s\n" #~ "Mensagem do erro: %s\n" #, fuzzy #~ msgid "Download interrupted by user" #~ msgstr "A descarregar grupos" #, fuzzy #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Ocorreu um erro durante a definição das opções de descarga (curl) para " #~ "'%s':" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Falha ao montar %s em %s" # name for SCG #~ msgid "Serbia and Montenegro" #~ msgstr "Sérvia e Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Opção de lista desconhecida" #, fuzzy #~| msgid "Ignore some dependencies of %s" #~ msgid "ignore some dependencies of %s" #~ msgstr "Ignorar algumas dependências de %s" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "O ficheiro %s não tem uma soma de verificação.\n" #~ "Utilizar este ficheiro de qualquer das formas?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "O ficheiro %s falhou a verificação de integridade com a seguinte chave:\n" #~ "%s|%s|%s\n" #~ "Utilizar o ficheiro de qualquer das formas?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "O ficheiro %s tem um checksum inválido.\n" #~ "Esperava-se %s, mas foi encontrado %s\n" #~ "Utilizar o ficheiro de qualquer das formas?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "O ficheiro %s tem um checksum %s desconhecido.\n" #~ "Utilizar o ficheiro de qualquer das formas?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "O ficheiro %s não está assinado.\n" #~ "Utilizá-lo de qualquer das formas?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "O ficheiro %s está assinado com uma chave desconhecida:\n" #~ "%s|%s|%s\n" #~ "Utilizar o ficheiro de qualquer das formas?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Foi encontrada uma chave que não é de confiança:\n" #~ "%s|%s|%s\n" #~ "Confiar na chave?" #~ msgid "%s remove failed" #~ msgstr "Falha ao remover %s" #~ msgid "Invalid user name or password." #~ msgstr "Nome de utilizador ou palavra passe inválidos." #~ msgid "rpm output:" #~ msgstr "resultado do rpm:" #~ msgid "%s install failed" #~ msgstr "Falhou a instalação de %s" #~ msgid "%s installed ok" #~ msgstr "%s instalado com sucesso" #~ msgid "%s remove ok" #~ msgstr "%s removido com sucesso" libzypp-17.36.5/po/pt_BR.po000066400000000000000000004333441476576476200154150ustar00rootroot00000000000000# translation of zypp.po to Brazilian Portuguese # Portugese (Brasilian) 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. # # Karl Eichwalder , 1999. # Ralf Lanz , 1999. # Isis Binder , 2008, 2010. # Luiz Fernando Ranghetti , 2008. # Luiz Fernando Ranghetti , 2008, 2009, 2012, 2013, 2014, 2015, 2016. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-11-14 15:48+0000\n" "Last-Translator: Rodrigo Macedo \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\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: Weblate 5.8.3\n" "X-Poedit-Language: Portuguese\n" "X-Poedit-Country: BRAZIL\n" "X-Poedit-SourceCharset: utf-8\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "País desconhecido: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Sem código" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Emirados Árabes Unidos" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afeganistão" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antígua e Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguila" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albânia" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armênia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antilhas Holandesas" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antártida" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Americana" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Áustria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Austrália" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Ilhas Åland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaijão" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bósnia e Herzegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Bélgica" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgária" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Barein" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudas" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolívia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasil" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Butão" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Ilha Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botsuana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canadá" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Ilhas Cocos (Keeling)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "República Centro-Africana" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Suíça" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Costa do Marfim" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Ilhas Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camarões" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colômbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cabo Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Ilha Christmas" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Chipre" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "República Checa" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Alemanha" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dinamarca" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "República Dominicana" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Argélia" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Equador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estônia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egito" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Saara Ocidental" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritreia" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Espanha" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiópia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlândia" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Ilhas Malvinas (Falkland)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Estados Federados da Micronésia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Ilhas Feroe" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "França" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "França metropolitana" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabão" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Reino Unido" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Granada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Geórgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guiana Francesa" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenlândia" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gâmbia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guiné" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadalupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guiné Equatorial" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grécia" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Ilhas Geórgia do Sul e Sandwich do Sul" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guiné-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guiana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Ilha Heard e Ilhas McDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croácia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hungria" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonésia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanda" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Ilha de Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Índia" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Território Britânico do Oceano Índico" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraque" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irã" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islândia" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Itália" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordânia" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japão" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Quênia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Quirguistão" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Camboja" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comores" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "São Cristóvão e Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Coreia do Norte" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Coreia do Sul" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Ilhas Cayman" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Cazaquistão" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Líbano" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Santa Lúcia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Libéria" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesoto" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituânia" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburgo" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letônia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Líbia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marrocos" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Mônaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldávia" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "São Martinho" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Ilhas Marshall" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedônia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mianmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongólia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macau" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Ilhas Marianas do Norte" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinica" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritânia" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Ilhas Maurício" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldivas" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "México" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malásia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Moçambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namíbia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nova Caledônia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Níger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Ilha Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigéria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicarágua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Holanda" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Noruega" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauruano" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nova Zelândia" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omã" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panamá" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinésia Francesa" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nova Guiné" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipinas" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Paquistão" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polônia" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre e Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Ilhas Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Porto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Território Palestino" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguai" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Catar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Ilha Reunião" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romênia" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Sérvia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Rússia" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arábia Saudita" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Ilhas Salomão" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seicheles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudão" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suécia" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Cingapura" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Santa Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Eslovênia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Ilhas Svalbard e Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Eslováquia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Serra Leoa" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somália" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé e Príncipe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Síria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Suazilândia" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Ilhas Turks e Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chade" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Terras Austrais e Antárticas Francesas" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tailândia" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadjiquistão" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turcomenistão" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunísia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timor-Leste" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turquia" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad e Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvaluano" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzânia" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ucrânia" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Ilhas Menores Distantes dos Estados Unidos" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Estados Unidos" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguai" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbequistão" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Santa Sé (Cidade do Vaticano)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "São Vicente e Granadinas" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Ilhas Virgens Britânicas" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Ilhas Virgens, EUA." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnã" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis e Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Iêmen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "África do Sul" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zâmbia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbábue" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Fornece" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Pré-requisitos" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Requer" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Está em conflito" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Torna obsoleto" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recomenda" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Sugere" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Aprimora" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Complementa" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Idioma desconhecido: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abcásio" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achém" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Circassiano" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-asiático (outros)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Africâner" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Aino" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Acadiano" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanês" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleúte" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Línguas algonquinas" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altaico Meridional" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amárico" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Inglês antigo (aprox. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Línguas apaches" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Árabe" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaico" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonês" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armênio" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucano" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Artificial (outros)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamês" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturiano" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Línguas atapascas" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Línguas australianas" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avárico" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avéstico" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaidjano" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Línguas bamileques" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Balúchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinês" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basco" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Báltico (outros)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Bejanês" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorusso" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berbere (outros)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislamá" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Banto (outros)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bósnio" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Brajavali" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretão" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Bataque (Indonésia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriátio" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginês" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Búlgaro" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birmanês" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Cadoano" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Indígena centro-americano (outros)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Caribe" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalão" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucasiano (outros)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celta (outros)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Checheno" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinês" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Jargão chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Eslavo eclesiástico" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Línguas tchadianas" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Copta" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Córnico" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corso" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Crioulos e pidgins de base inglesa (outros)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Crioulos e pidgins de base francesa (outros)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Crioulos e pidgins de base portuguesa (outros)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tártaro (Crimeia)" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Crioulos e pidgins (outros)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Cassúbio" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cuchita (outros)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Checo" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dacota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dinamarquês" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Daiaque" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Atapasca)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinca" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidiano (outros)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Baixo-sorbiano" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Holandês medieval (aprox. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Holandês" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Diula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efique" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egípcio (Antigo)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamita" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inglês" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Inglês medieval (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estoniano" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Jeje" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Feroês" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijiano" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finlandês" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fino-ugriano (outros)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francês" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francês medieval (aprox. 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francês antigo (aprox. 842-1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frísio" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fula" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulano" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Cua" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaia" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germânico (outros)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgiano" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Alemão" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Ge'ez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertês" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaélico" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandês" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galego" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Alto-alemão medieval (aprox. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Alto-alemão antigo (aprox. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gonde" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gótico" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grego antigo (até 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grego moderno (após 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Guzerate" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitiano" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Haúça" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Havaiano" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebraico" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Hereró" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hitita" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Alto-Sorbiano" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Húngaro" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Ibo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandês" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Yi (Sechuan)" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlíngua" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Ilocano" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" "Interlíngua (International Auxiliary Language Association, Associação de " "Línguas Internacionais Auxiliares)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Índico (outros)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonésio" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-europeu (outros)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraniano (outros)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Línguas iroquesas" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiano" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanês" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonês" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judeu-persa" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judeu-arábico" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Groenlandês" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Camba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Canarês" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Caxemira" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Canúri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Cazaque" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Cabardíaco" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (outros)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Cotanês" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Quirguiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Quimbundo" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Concani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Congo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreano" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Cosreano" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Curdo" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laosiano" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latim" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letão" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgano" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituano" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburguês" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Nganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lundês" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Quênia e Tanzânia)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedônio" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurês" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallino" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malaiala" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandinga" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronésio (outros)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marati" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Massai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malaio" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandês medieval (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Línguas diversas" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-khmer (outros)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgaxe" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltês" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Línguas manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldávio" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Vários idiomas" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Línguas mundas" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandês" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Línguas maias" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Indígena norte-americano" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitano" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele do sul" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele do norte" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Baixo-alemão" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalês" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Bhasa (Nepal)" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Nigero-cordofânio (outros)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueano" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Novo norueguês" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Dano-norueguês" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Nórdico antigo" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norueguês" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho (setentrional)" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Línguas núbias" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari clássico" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitano (após 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojíbua" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriá" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osseto" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turco otomano (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Línguas otomianas" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papua (outros)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinano" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pálavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauano" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persa antigo (aprox. 600-400 A.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persa" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipino (outros)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenício" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Páli" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polonês" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pompeano" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Português" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Línguas prácritas" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provençal antigo (até 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Afegão" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quíchua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajastanês" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapa Nui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotonganês" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Latim (outros)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Romanche" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romeno" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Russo" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Iacuto" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Indígena sul-americano (outros)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Línguas salichanas" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Aramaico samaritano" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sânscrito" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Sérvio" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliano" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Escocês" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croata" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semita (outros)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandês antigo (até 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Linguagens de sinais" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Línguas sioux" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-tibetano (outros)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Eslavo (outros)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Eslovaco" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Esloveno" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Lapão Meridional" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Lapão setentrional" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Línguas lapônias (outras)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lapão (Lule)" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Lapão (Inari)" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoano" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Lapão (Skolt)" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Xichonês" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninquê" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdian" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho (Meridional)" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Espanhol" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardo" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-saariano (outros)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Suázi" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanês" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumério" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Suaíli" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Sueco" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siríaco" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Taitiano" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (outros)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tâmil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tártaro" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Temne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tétum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadjique" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalo" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tailandês" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetano" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigré" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrínio" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tuaregue" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonganês (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonganês (Ilhas Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Setswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turcomeno" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Línguas tupis" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turco" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaico (outros)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuviniano" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugarítico" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uigur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ucraniano" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundo" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Indeterminado" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbeque" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamita" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuque" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Vótico" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Línguas wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Galês" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Línguas sorbianas" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Valão" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Iao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapês" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Iídiche" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Iorubá" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Línguas yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapoteca" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zunhi" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "As seguintes ações serão realizadas:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "desconhecido" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "não suportado" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Nível 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Nível 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Nível 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Contrato adicional do consumidor necessário" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Descontinuado e substituído por um pacote diferente" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "inválido" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "O nível de suporte não foi especificado" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "O fornecedor não oferece suporte." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Determinação do problema, que significa suporte técnico feito para fornecer " "informações de compatibilidade, assistência na instalação, suporte ao uso, " "manutenção contínua e solução básica de problemas. O Suporte de Nível 1 não " "corrige defeitos do produto." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Isolamento do problema, que significa suporte técnico feito para duplicar os " "problemas do cliente, isolar a área do problema e fornecer solução para " "problemas não resolvidos pelo Suporte de Nível 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Resolução de problema, que significa suporte técnico feito para resolver " "problemas complexos através de engenharia na resolução de defeitos do " "produto que foram identificados pelo Suporte de Nível 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" "Um contrato adicional com o consumidor é necessário para receber suporte." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "O pacote foi descontinuado e substituído por um novo pacote com um nome " "diferente." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Opção de suporte desconhecida. A descrição não está disponível" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "O gerenciamento do sistema está bloqueado pelo aplicativo com o pid %d " "(%s).\n" "Feche esse aplicativo antes de tentar novamente." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Modo de correspondência desconhecido '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Modo de correspondência desconhecido '%s' para o padrão '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Expressão regular inválida '%s': o regcomp retornou %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Expressão regular inválida '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autenticação necessária para '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Será feita nova tentativa..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Desistirá após %1% tentativas." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visite o SUSE Customer Center para verificar se seu registro é válido e não " "expirou." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Visite o Novell Customer Center para verificar se seu registro é válido e " "não expirou." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Criar ponto para anexar: Não foi possível localizar um diretório gravável " "para criar um ponto de anexar" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Instale o pacote ''lsof'' primeiro." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Não foi possível criar o diretório do cache de metadados." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Erro ao tentar ler de '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Não foi possível criar %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Falha ao recuperar novos metadados do repositório." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "Falha ao armazenar em cache o repositório (não foi possível iniciar o " "repo2solv)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Falha ao armazenar .repo (%d) em cache." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Construindo o cache do repositório '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Não foi possível criar o cache em %s - sem permissão de gravação." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Falha ao armazenar em cache o repositório %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Tipo de repositório não identificado" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Adicionando o repositório '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nome de arquivo de repositório inválido em '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Não foi possível abrir o arquivo '%s' para gravação." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Erro desconhecido ao ler de '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" "Não foi possível ler o diretório de repositório '%1%': Permissão negada" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Falha ao ler o diretório '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Não foi possível ler o arquivo de repositório '%1%': Permissão negada" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Metadados de limpeza" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Limpando pacotes" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Limpando diretórios de cache" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Limpando diretório: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Limpando cache" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Carregando do cache" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Removendo o repositório '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Não foi possível descobrir onde o repositório está armazenado." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Não foi possível remover '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Modificando repositório" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Atualizando o Repositório: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Não foi possível descobrir onde o serviço está armazenado." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Serviço '%1%' desconhecido: removendo o repositório de serviço órfão '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "O apelido do repositório não pode começar com ponto." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "O apelido do serviço não pode começar com ponto." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Nenhum digest para o arquivo %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Digest %s desconhecido para o arquivo %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Falha na verificação do digest para o arquivo '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "O arquivo '%s' não está assinado. Continuar?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "O arquivo '%s' do repositório '%s' não está assinado. Continuar?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" "Você deseja rejeitar a chave, confiar nela temporariamente ou confiar nela " "sempre?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nome da Chave: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" "%1% chave de assinatura de novo pacote recebida do repositório \"%2%\":" msgstr[1] "" "%1% chaves de assinatura de novo pacote recebidas do repositório \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Falha na verificação de assinatura para o arquivo '%1%'." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Falha na verificação de assinatura para o arquivo '%1%' do repositório '%2%'." # internal key used: Ok #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Continuar?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "O arquivo '%s' está assinado com uma chave desconhecida '%s'. Continuar?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "O arquivo '%s' do repositório '%s' está assinado com uma chave desconhecida " "'%s'. Continuar?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Repositório 1% não define URLs 'gpgkey' adicionais." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Procurando por ID da chave gpg %1% no repositório %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Procurando por ID da chave gpg 1% no cache %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Atributo necessário '%s' faltando." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Um ou ambos os atributos '%s' ou '%s' são necessários." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Falha na verificação da assinatura" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "O pacote %s parece ter sido corrompido durante a transferência. Deseja " "tentar obtê-lo novamente?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Falha ao fornecer o pacote %s. Deseja tentar obtê-lo novamente?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Falha na verificação de applydeltarpm." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "Falha no applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Nenhuma permissão para gravar no cache do repositório." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "O plug-in de serviço não suporta alterar um atributo." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Não foi possível fornecer o arquivo '%s' a partir do repositório '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Nenhuma URL no repositório." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Mídia esperada %1%/%2% identificada pelo arquivo '%3%' com o conteúdo:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "O arquivo %1%\n" " do pacote\n" " %2%\n" " conflita com o arquivo do pacote\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "O arquivo %1%\n" " do pacote\n" " %2%\n" " conflita com o arquivo da instalação de\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "O arquivo %1%\n" " da instalação de\n" " %2%\n" " conflita com o arquivo do pacote\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "O arquivo %1%\n" " da instalação de\n" " %2%\n" " conflita com o arquivo da instalação de\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "O arquivo %1%\n" " do pacote\n" " %2%\n" " conflita com o arquivo\n" " %3%\n" " do pacote\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "O arquivo %1%\n" " do pacote\n" " %2%\n" " conflita com o arquivo\n" " %3%\n" " da instalação de\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "O arquivo %1%\n" " da instalação de\n" " %2%\n" " conflita com o arquivo\n" " %3%\n" " do pacote\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "O arquivo %1%\n" " da instalação de\n" " %2%\n" " conflita com o arquivo\n" " %3%\n" " da instalação de\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Não foi possível criar o sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "quebrar %s ao ignorar algumas das dependências" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "geralmente ignorar algumas dependências" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "O %1% instalado não pertence a um repositório distupgrade e deve ser " "substituído" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "o %1% a ser instalado não pertence a um repositório distupgrade" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "o %1% instalado tem uma arquitetura inferior" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "o %1% a ser instalado tem uma arquitetura inferior" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problema com o instalado %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "solicitações conflitantes" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "algum problema de dependência" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "nada fornece o '%1%' solicitado" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Você habilitou todos os repositórios necessários?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "o pacote solicitado %1% não existe" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "solicitação não suportada" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' é fornecido pelo sistema e não pode ser apagado" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% não é instalável" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "nada fornece '%1%' necessário para o %2% instalado" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "nada fornece '%1%' necessário para o %2% instalado" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "não pode instalar %1% e %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "o %1% instalado está em conflito com '%2%' fornecido pelo %3% instalado" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "o %1% instalado está em conflito com o '%2%' fornecido pelo a ser instalado " "%3%" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "o %1% a ser instalado está em conflito com '%2%' fornecido pelo %3% instalado" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "o %1% a ser instalado está em conflito com '%2%' fornecido pelo a ser " "instalado %3%" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "o %1% instalado torna obsoleto '%2%' fornecido pelo %3% instalado" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "o %1% instalado torna obsoleto '%2%' fornecido pelo a ser instalado %3%" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "o %1% a ser instalado torna obsoleto '%2%' fornecido pelo %3% instalado" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "o %1% a ser instalado torna obsoleto '%2%' fornecido pelo a ser instalado %3%" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "o %1% instalado está em conflito com o '%2%' fornecido por ele mesmo" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "o %1% a ser instalado está em conflito com o '%2%' fornecido por ele mesmo" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "o %1% instalado requer '%2%', mas este requisito não pode ser fornecido" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "o %1% a ser instalado requer '%2%', mas este requisito não pode ser fornecido" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "fornecedores removidos: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "fornecedores não instaláveis: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "fornecedores não instaláveis: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% ainda não está completamente integrado em %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Normalmente você deseja manter o PTF e escolher não instalar as correções de " "manutenção." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "A remoção do %1% instalado neste contexto também removerá (não substituirá) " "os pacotes PTF incluídos." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "O PTF deve ser removido chamando '%1%'. Isso atualizará os pacotes PTF " "incluídos em vez de removê-los." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Normalmente, convém manter o PTF ou cancelar a ação." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "O %1% instalado bloqueia a ação desejada." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Normalmente, você deseja manter o PTF e optar por cancelar a ação." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "remova o bloqueio para permitir a remoção de %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "não instale %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "manter %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "remova o bloqueio para permitir a instalação de %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Esta solicitação travará o seu sistema!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "igorar o aviso de um sistema travado" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "não peça para instalar um solucionável fornecendo %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "não peça para apagar todos os solucionáveis fornecendo %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "não instale a versão mais recente de %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "mantenha %1% apesar da arquitetura inferior" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "instale %1% apesar da arquitetura inferior" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "mantenha obsoleto %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "instale %1% do repositório excluído" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "instale %1% apesar de ter sido recolhido" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "permitir instalar o PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "instale %1%, embora esteja na lista negra" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "rebaixamento de %1% para %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "mudança de arquitetura de %1% a %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "instalar %1% (com mudança de fornecedor)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "instale% 1% do fornecedor% 2%\n" " substituindo% 3% do fornecedor% 4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "substituição de %1% por %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "desinstalação de %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Executando scripts de pós-transação" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Executando script %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Saída do script %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "A instalação foi cancelada conforme instruções." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " executado" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " falha na execução" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s já executado como %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " execução ignorada durante o cancelamento" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Erro ao enviar a notificação de mensagem de atualização." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nova mensagem de atualização" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Sinal recebido :\"%1% (%2%)\", para garantir a consistência do sistema não é " "possível cancelar uma transação RPM em execução." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "A execução da transação falhou devido aos seguintes problemas:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Falha no RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Falha ao importar chave pública %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Falha ao remover chave pública %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "O cabeçalho do pacote não está assinado!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "A carga útil do pacote não está assinada!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Arquivos de configuração alterados para %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "o RPM salvou %s como %s, mas não foi possível determinar a diferença" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "o rpm salvou %s como %s.\n" "Aqui estão as 25 primeiras linhas de diferença:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "o rpm criou %s como %s, mas não foi possível determinar a diferença" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm criou %s como %s.\n" "Aqui estão as 25 primeiras linhas de diferença:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Saída adicional do rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "backup %s criado" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "A assinatura está OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Tipo de assinatura desconhecido" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Assinatura não verificada" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "A assinatura está OK, mas a chave não é confiável" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Chave pública das assinaturas não disponível" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "O arquivo não existe ou a assinatura não pode ser verificada" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "O arquivo não está assinado" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "não expira" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "expirada: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "expira em: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(não expira)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(EXPIRADO)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(expira dentro de 24h)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(expira em %d dia)" msgstr[1] "(expira em %d dias)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Tentativa de importar a chave não existente %s para o chaveiro %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Falha ao importar chave." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Falha ao remover chave." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "O arquivo de assinatura %s não foi encontrado" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tipo '%s' duvidoso da soma de verificação de bytes %u ('%s')" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Não foi possível abrir o pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Não foi possível abrir o pipe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "String de consulta de URL de LDAP inválida" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Parâmetro de consulta '%s' de URL de LDAP inválido" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Não foi possível clonar o objeto URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Referência a objeto URL vazio inválida" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Não foi possível analisar os componentes da URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Histórico:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "O esquema de URL não permite %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Componente '%s' inválido %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Componente inválido %s" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "A análise de strings de consulta não é suportada para este URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "O esquema de URL é um componente obrigatório" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Esquema de URL '%s' inválido" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "O esquema de URL não permite nome de usuário" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "O esquema de URL não permite senha" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "O esquema de URL requer um componente de host" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "O esquema de URL não permite componente de host" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Componente de host inválido '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "O esquema de URL não permite porta" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Componente de porta inválido '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "O esquema de URL requer nome de caminho" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Caminho relativo não permitido se existir autoridade" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "A string codificada contém um byte NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Caractere separador de divisão de matriz de parâmetros inválido" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Caractere separador de divisão de mapa de parâmetros inválido" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Caractere separador de integração de matriz de parâmetros inválido" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "O comando encerrou com status %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Comando eliminado pelo sinal %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "O comando encerrou com erro desconhecido." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Argumentos de geração inválidos fornecidos." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Incapaz de criar o tubo de controle." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Não foi possível executar o chroot em '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Não foi possível executar chdir para '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Não foi possível executar chdir para '%s' dentro do chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Não foi possível executar '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Não foi possível dividir (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Impossível executar '%s', chdir falhou (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Impossível executar '%s', chroot falhou (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Impossível executar '%s', exec falhou (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Impossível executar '%s', erro inesperado." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Falha ao montar %s em %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Falha ao desmontar %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nome de arquivo inválido: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Mídia não aberta ao tentar realizar a ação '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Arquivo '%s' não encontrado na mídia '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Não é possível gravar o arquivo '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Mídia não conectada" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Ponto de conexão de mídia inválido" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Falha na inicialização do download (curl) para '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Exceção do sistema '%s' na mídia '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "O caminho '%s' na mídia '%s' não é um arquivo." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "O caminho '%s' na mídia '%s' não é um diretório." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI mal formado" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nome de host vazio no URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Sistema de arquivos vazio no URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destino vazio no URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Esquema de URI não suportado em '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operação não suportada pela mídia" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Erro de download (curl) para '%s':\n" "Código de erro: %s\n" "Mensagem de erro: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Erro ao configurar as opções de download (curl) para '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "A mídia fonte '%s' não contém a mídia desejada" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "A mídia '%s' está sendo usada por outra instância" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Não foi possível ejetar qualquer mídia" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Não foi possível ejetar a mídia '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Permissão para acessar '%s' negada." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Tempo de espera excedido ao acessar '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "Os dados transferidos excederam o tamanho esperado do tamanho do arquivo " "'%s' of '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "O local '%s' está temporariamente inacessível." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Problema no certificado SSL. Verifique se o certificado CA está correto " "para '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Não há recursos livres disponíveis para anexar a mídia." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Método de autenticação HTTP '%s' não suportado" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Erro de download (curl) para '%s':\n" "Código do erro: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Erro de download (curl) para '%s':\n" "Não foi possível obter a resposta HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Sim" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Não" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Nota:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Aviso:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Erro:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "concluído" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "atenção" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "erro" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Aviso: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Baixando:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "iniciando" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "não encontrado" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Nenhuma ajuda disponível para este prompt." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "nenhuma ajuda disponível para esta opção" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "exibe todas as opções" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "sim" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "não" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Metadados válidos não encontrados na URL especificada" #~ msgstr[1] "Metadados válidos não encontrados nas URLs especificadas" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Executando o script %%posttrans '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Executando scripts %posttrans" #~ msgid "Package is not signed!" #~ msgstr "O pacote não está assinado!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s não pertence a um repositório de atualização da distribuição" #~ msgid "%s has inferior architecture" #~ msgstr "%s tem uma arquitetura inferior" #~ msgid "problem with installed package %s" #~ msgstr "problema com o pacote instalado %s" #~ msgid "nothing provides requested %s" #~ msgstr "nada fornece o pacote solicitado %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Você habilitou todos os repositórios solicitados?" #~ msgid "package %s does not exist" #~ msgstr "o pacote %s não existe" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s é fornecido pelo sistema e não pode ser apagado" #~ msgid "%s is not installable" #~ msgstr "%s não pode ser instalado" #~ msgid "nothing provides %s needed by %s" #~ msgstr "nada fornece %s que é necessário a %s" #~ msgid "cannot install both %s and %s" #~ msgstr "Não foi possível instalar ambos (%s e %s)" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s conflita com %s, fornecido por %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s torna obsoleto %s, fornecido por %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s instalado torna obsoleto %s fornecido por %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "resolvível %s conflita com %s fornecido por ele mesmo" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s requer %s, mas este requisito não pode ser fornecido" #~ msgid "remove lock to allow removal of %s" #~ msgstr "remover bloqueio para permitir a remoção de %s" #~ msgid "do not install %s" #~ msgstr "não instalar %s" #~ msgid "keep %s" #~ msgstr "manter %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "remover bloqueio para permitir a instalação de %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "não perguntar ao instalar um resolvível que fornece %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "não perguntar ao remover todos os resolvíveis que fornecem %s" #~ msgid "do not install most recent version of %s" #~ msgstr "não instalar a versão mais recente de %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "manter %s apesar da arquitetura inferior" #~ msgid "install %s despite the inferior architecture" #~ msgstr "instalar %s apesar da arquitetura inferior" #~ msgid "keep obsolete %s" #~ msgstr "manter o obsoleto %s" #~ msgid "install %s from excluded repository" #~ msgstr "instalar %s do repositório excluído" #~ msgid "downgrade of %s to %s" #~ msgstr "desatualização de %s para %s" #~ msgid "architecture change of %s to %s" #~ msgstr "alteração de arquitetura de %s para %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "instalar %s (com alteração do fornecedor)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "substituição de %s por %s" #~ msgid "deinstallation of %s" #~ msgstr "desinstalação de %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Não foi possível abrir o arquivo de bloqueio: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Esta ação já está sendo executada por outro programa." #~ msgid "Hal Exception" #~ msgstr "Exceção de Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Desculpe, mas esta versão do libzypp foi compilada sem o suporte ao HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext não conectado" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive não inicializado" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume não inicializado" #~ msgid "Unable to create dbus connection" #~ msgstr "Não foi possível criar a conexão com o dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Não foi possível criar o contexto libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "libhal_set_dbus_connection: Não foi possível definir a conexão com dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "Não foi possível inicializar o contexto HAL - o hald não está em execução?" #~ msgid "Not a CDROM drive" #~ msgstr "Não é uma unidade de CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Não foi possível inicializar os atributos do mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Não foi possível definir o atributo do mutex recursivo" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Não foi possível inicializar o mutex recursivo" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Não foi possível adquirir o bloqueio mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Não foi possível liberar o bloqueio mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Falha ao importar chave pública do arquivo %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Falha ao remover chave pública %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Não foi possível encontrar um dispositivo loop disponível para montar o " #~ "arquivo de imagem de '%s'" #~ msgid "generally ignore of some dependecies" #~ msgstr "geralmente ignorar algumas das dependências" #~ msgid "do not forbid installation of %s" #~ msgstr "não proibir a instalação de %s" #~ msgid "do not keep %s installed" #~ msgstr "não manter %s instalado" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #~ msgid "%s remove failed" #~ msgstr "فشلت إزالة %s" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "rpm output:" #~ msgstr "مخرجات rpm:" #~ msgid "%s install failed" #~ msgstr "فشل تثبيت %s" #~ msgid "%s installed ok" #~ msgstr "تم تثبيت %s بنجاح" #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "عدم تثبيت التبعيات القابلة للتحليل المتعلقة أو حذفها" #~ msgid "Ignore that %s is already set to install" #~ msgstr "تجاهل أنه تم تعيين %s بالفعل لتثبيته" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "تجاهل %s القديم في %s" #~ msgid "Ignore this conflict of %s" #~ msgstr "تجاهل تعارض %s هذا" #~ msgid "Ignore this requirement just here" #~ msgstr "تجاهل هذا المتطلب هنا فقط" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "Install missing resolvables" #~ msgstr "تثبيت التبعيات القابلة للتحليل المفقودة" #~ msgid "Keep resolvables" #~ msgstr "الاحتفاظ بالتبعيات القابلة للتحليل" #~ msgid "Unlock these resolvables" #~ msgstr "إلغاء قفل التبعيات القابلة للتحليل هذه" #~ msgid "delete %s" #~ msgstr "حذف %s" #~ msgid "install %s" #~ msgstr "تثبيت %s" #~ msgid "unlock %s" #~ msgstr "إلغاء قفل %s" #~ msgid "unlock all resolvables" #~ msgstr "إلغاء قفل كافة التبعيات القابلة للتحليل" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "يتعارض %s مع التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s يتعارض مع:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "تعذر تثبيت %s لأنه يتعارض مع %s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "لم يتم تثبيت %s وتم وضع علامة عليه كقابل لإلغاء التثبيت" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #~ msgid "%s has missing dependencies" #~ msgstr "تم فقد تبعيات %s" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "تعذر تثبيت %s بسبب عدم وجود التبعيات" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #~ msgid "No need to install %s" #~ msgstr "لا داعي لتثبيت %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s يمكن إلغاء تثبيته لأنه يتعارض مع %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s يفتقد المتطلب %s" #~ msgid ", Action: " #~ msgstr "، الإجراء:" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "patch" #~ msgstr "التصحيح" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Establishing %s" #~ msgstr "تأسيس %s" #~ msgid "Installing %s" #~ msgstr "تثبيت %s" #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #~ msgid "Skipping %s: already installed" #~ msgstr "تخطي %s: تم التثبيت بالفعل" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "%s مقفل ويتعذر إلغاء تثبيته." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid " Error!" #~ msgstr "خطأ!" #~ msgid " Important!" #~ msgstr "هام!" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "Unable to parse Url authority" #~ msgstr "تعذر تحليل سلطة Url" #~ msgid "Ignore this requirement generally" #~ msgstr "تجاهل هذا المتطلب بصفة عامة" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "Unable to restore all sources." #~ msgstr "تعذرت استعادة كافة المصادر." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading packages file" #~ msgstr "قراءة ملف الحزم" #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Downloading %s" #~ msgstr "إنزال %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Não foi possível criar a chave pública %s do chaveiro %s para o arquivo %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "" #~ "Tentativa de importar chave não existente %s no gerenciador de chaves %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "" #~ "Não foi possível alterar o diretório para '/' dentro do chroot (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Falha na inicialização do download (Metalink curl) para '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Erro de download (metalink curl) para '%s':\n" #~ "Código de erro: %s\n" #~ "Mensagem de erro: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Download interrompido em %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Download interrompido pelo usuário" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "Erro ao configurar as opções de download (metalink curl) para '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Falha ao baixar %s de %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Sérvia e Montenegro" #~ msgid "Unknown Distribution" #~ msgstr "Distribuição desconhecida" #~ msgid "ignore some dependencies of %s" #~ msgstr "ignorar algumas das dependências de %s" #~ msgid "Timeout exceeded when access '%s'." #~ msgstr "Tempo de espera excedido quando acessando '%s'." libzypp-17.36.5/po/ro.po000066400000000000000000003512641476576476200150270ustar00rootroot00000000000000# Translator(s): # # Lucian Oprea # strainu # xdaiana # Laudatti # turcan # Alexandru Szasz # nicubunu # anonymous # mazilu59 # evinteler # Ursan Marius Bogdan # # Reviewer(s): # # Lucian Oprea # xdaiana # Alexandru Szasz # strainu # # Comunitatea romana openSUSE - www.suseromania.ro msgid "" msgstr "" "Project-Id-Version: OpenSUSE\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2012-11-19 14:59+0200\n" "Last-Translator: Lucian Oprea \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Narro 2.0 on http://tradu.softwareliber.ro\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" "X-Generator: Narro 2.0 on http://tradu.softwareliber.ro\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Țară necunoscută: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Fără cod" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Emiratele Arabe Unite" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua și Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antilele Olandeze" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarctica" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samoa Americană" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Insulele Aland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaidjan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia și Herțegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgia" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrein" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermude" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazilia" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Insula Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Insulele Cocos (Keeling)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Republica Centrafricană" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Elveția" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Coasta de Fildeș" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Insulele Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Columbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Capul Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Insulele Christmas" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cipru" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Republica Cehă" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Germania" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danemarca" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Republica Dominicană" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algeria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sahara Occidentală" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritreea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spania" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlanda" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Insulele Falkland (Malvine)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Micronezia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Insulele Feroe" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Franța" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Franța metropolitană" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Anglia" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guiana Franceză" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenlanda" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guineea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadelupa" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guineea Ecuatorială" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grecia" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Georgia de Sud și Insulele Sandwich de Sud" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guineea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Insula Heard și Insulele McDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croația" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungaria" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonezia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlanda" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Insula Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Teritoriul britanic din Oceanul Indian" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islanda" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italia" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Iordania" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonia" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kârgâzstan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodgia" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Insulele Comore" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts și Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Coreea de Nord" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Coreea de Sud" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuweit" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Insulele Cayman" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazahstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Republica Populară Democratică Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Liban" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lituania" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letonia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libia" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroc" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Muntenegru" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Insulele Marshall" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Insulele Mariana de Nord" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinica" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Maurițius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldive" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexic" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaezia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambic" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Noua Caledonie" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Insula Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Olanda" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norvegia" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Noua Zeelandă" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinezia franceză" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Noua Guinee" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipine" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polonia" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre și Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Teritoriile palestiniene" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugalia" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "România" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Federația Rusă" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arabia Saudită" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Insulele Solomon" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suedia" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sfânta Elena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard și Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovacia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome și Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Siria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Insulele Turks și Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Ciad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Teritoriile Franceze Sudice" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tailanda" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Timorul de Est" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turcia" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad și Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ucraina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Insulele minore din afara Statelor Unite" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Statele Unite" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Sfântul Scaun (Vatican)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Sfântul Vincent și Grenadine" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Insulele Virgine Britanice" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Insulele Virgine, S.U.A." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis și Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Africa de Sud" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Oferă" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Necesită" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Conflicte" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "păstrează pachetul vechi %s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Recomandă" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Sugerează" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Îmbunătățește" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Suplimentează" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Limbă necunoscută: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abhază" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achineză" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adâgă" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asiatică (alta)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadiană" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albaneză" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleută" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Limbi Algonquian" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altai de Sud" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharică" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Engleză veche (cca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Limbi apache" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabă" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramaică" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragoneză" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armeană" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araucaniană" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Artificială (alta)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assameză" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturian" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Limbi athapascane" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Limbi australiene" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avaric" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azeră" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Limbi Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bașkiră" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Balochi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balineză" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Bască" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltică (alta)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorusă" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengaleză" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berberă (alta)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (alta)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosniacă" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonă" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonezia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriată" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginese" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgară" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birmaneză" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Indiană din America Centrala (alta)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalană" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Caucaziană (alta)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celtică (alta)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Cecenă" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chineză" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Chuuk" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Jargon Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Slavonă bisericească" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Ciuvașă" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Limbi chamice" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Coptă" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornică" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corsicană" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creole și pidgin bazate pe engleză (altele)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creole și pidgin bazate pe franceză (altele)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creole și pidgin bazate pe portugheză (altele)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tătară crimeeană" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creole și pidgin (altele)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kașubiană" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cuștică (alta)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Cehă" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Daneză" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidiană (alta)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Sorabă de jos" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Olandeză medievală (cca. 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Olandeză" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha (Bhutan)" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egipteană (antică)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamită" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engleză" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Engleză medievală (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estoniană" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Feroeză" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijiană" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipineză" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finlandeză" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fino-ugrică (alta)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Franceză" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Franceză medievală (cca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Franceză veche (842-cca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Friziană" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friulană" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germanică (alta)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgiană" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Germană" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilberteză" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Galică" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandeză" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galiciană" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Germană medievală (cca. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Germană veche (cca. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotică" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Greacă veche (până la 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Greacă modernă (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitiană" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiiană" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Ebraică" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hitită" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Sorabă de sus" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Maghiară" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandez" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indiană (alta)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indoneziană" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-europeană (alta)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingușă" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iraniană (alta)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Limbi irocheze" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italiană" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javaneză" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japoneză" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Iudeo-persiană" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Iudeo-arabică" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kașmiră" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Cazacă" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisan (alta)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotaneză" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiză" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Komi" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreeană" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosraeană" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karageai-Balkară" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdă" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laoțiană" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latină" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letonă" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezghiană" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgheză" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Lituaniană" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgheză" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya și Tanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedoneană" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurese" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshalleză" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austroneziană (alta)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malaeziană" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandeză medievală (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Diverse limbi" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (alta)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgașă" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Malteză" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Limbi manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldovenească" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolă" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Limbi multiple" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Limbile Munda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandeză" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Limbi maya" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzia" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Indiană din America de Nord" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitană" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele de sud" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele de nord" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Germană de jos" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepaleză" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanian (alta)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueană" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norwegiană Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norwegiană Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Scandinavă veche" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norvegiană" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Sotho de Nord" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Limbi nubiene" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari clasică" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitană (după 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Osetă" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turcă otomană (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Limbi otomiene" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papua (alta)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauană" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Persană veche (cca. 600-400 î.e.n.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persană" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipineză (alta)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Feniciană" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Poloneză" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugheză" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Limbi prakrite" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provensală veche (până la 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romanică (alta)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Retoromană" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Română" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rusă" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakută" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Indiană din America de sud (alta)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Limbi salishan" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Aramaică samariteană" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanscrită" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Sârbă" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Siciliană" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Croată" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitică (alta)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandeză veche (până la 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Limbajul semnelor" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Limbi siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-tibetană (alta)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slavă (alta)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovacă" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenă" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sami sudică" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Sami nordică" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Limbi sami (altele)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Sami lule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Sami inari" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoană" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Sami skolt" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdiană" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho de sud" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spaniolă" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardă" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-sahariană (alta)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sumeriană" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumeriană" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Suedeză" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siriacă" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitiană" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (alta)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tătară" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tailandeză" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetană" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingoniană" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Insulele Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmenă" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Limbi Tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turcă" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaică (alta)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuviniană" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritică" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uigură" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ucrainiană" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Nedeterminată" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbecă" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnameză" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votică" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Limbi wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Galeză" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Limbi sorabe" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Valonă" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmucă" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Idiș" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Limbi yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotecă" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Vor fi efectuate următoarele acțiuni:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "necunoscut" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nesuportat" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Nivelul 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Nivelul 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Nivelul 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Este necesar un contract client suplimentar" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "invalid" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Nivelul de suport este nespecificat" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Vânzătorul nu oferă suport." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Determinarea problemei, ceea ce înseamnă suport tehnic menit să ofere " "informații de compatibilitate, asistență la instalare, suport la utilizare, " "mentenanță curentă și rezolvarea problemelor simple. Suportul de nivel 1 nu " "este menit să corecteze erori ale produsului." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Izolarea problemei, ceea ce înseamnă suport tehnic menit să reproducă " "problemele clienților, să izoleze zona cu probleme și să ofere soluții " "pentru probleme nerezolvate de suportul de nivel 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Rezolvarea problemei, ceea ce înseamnă suport tehnic menit să rezolve " "problemele complexe prin contribuția specialiștilor la rezolvarea de defecte " "ale produselor, identificate de suportul de nivel 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" "Pentru a obține suport tehnic se necesită un contract client suplimentar." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Opțiune de suport necunoscută. Descrierea nu este disponibilă" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Gestiunea sistemului a fost blocată de aplicația cu pid %d (%s).\n" "Închideți această aplicație înainte de a încerca din nou." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Mod necunoscut '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Mod necunoscut '%s' pentru modelul '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "'%s' este o expresie regulată invalidă: regcomp a întors %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Expresie regulată invalidă '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Pentru '%s' este necesară autentificarea" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Vizitează Centru de Relații cu Clienții Novell pentru a verifica dacă " "înregistrarea este validă și încă valabilă." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 #, fuzzy msgid "Please install package 'lsof' first." msgstr "Curăț cache-ul pachetelor instalate." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Nu se poate crea directorul pentru cache-ul de metadate." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Eroare la încercarea de a citi din '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Nu se poate crea %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Sursa de instalare (%d) nu a putut fi încărcată în cache." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Construirea cache-ului sursei de instalare '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Nu se poate crea memoria cache la %s - lipsește dreptul de scriere." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Tip de sursă de instalare netratat" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Adaug sursa de instalare '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Nume de fișier sursă de instalare invalid la '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Nu se poate deschide fișierul '%s' pentru scriere." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Eroare necunoscută la citirea de la '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Citirea directorului '%s' a eșuat" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Îndepărtez sursa de instalare '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Nu pot determina unde este stocată sursa de instalare." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Nu pot șterge '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Nu pot determina unde este stocat serviciul." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Aliasul sursei de instalare nu poate începe cu punct." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Aliasul serviciului nu poate începe cu punct." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" # continue button label #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Continuați?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Atributul necesar '%s' lipsește." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Unul sau ambele din atributele '%s' și '%s' sunt necesare." #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr " execuție eșuată" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Pachetul %s a fost probabil corupt în timpul transferului. Doriți să " "repetați descărcarea?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Furnizarea pachetului %s a eșuat. Doriți să încercați să-l obțineți din nou?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "verificarea applydeltarpm a eșuat." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm a eșuat." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "" "tipul de resursă VAR1 nu suportă funcția de arătare a modificărilor (show " "changes)" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Nu pot oferi fișierul '%s' din sursa '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Nici un url în sursa de instalare." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Nu pot crea sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "întrerupe pachetul %s ignorând o parte din dependențele lui" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "în general se ignoră unele dependințe" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "cereri ce intră în conflict" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "o problemă de dependențe" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 #, fuzzy msgid "unsupported request" msgstr "nesuportat" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "pachete șterse: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "pachete care pot fi dezinstalate: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "furnizori dezinstalabili: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Această cerere vă va afecta sistemul!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignoră avertismentul privitor la stricarea sistemului" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Instalarea a fost anulată la cerere." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " executat" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " execuție eșuată" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, fuzzy, c-format, boost-format msgid "%s already executed as %s)" msgstr "%1 este deja decriptat!" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " execuție sărită în timpul anulării" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Eroare trimitere notificare mesaj de actualizare." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nou mesaj de actualizare" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM a eșuat:" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Importul cheii publice %1% a eșuat" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Îndepărtarea cheii publice %1% a eșuat" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Fișiere de configurare modificate pentru %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm a salvat %s ca %s, dar nu a putut determina diferențele" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm a salvat %s ca %s.\n" "Acestea sunt primele 25 de linii diferite:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm a creat %s ca %s, dar nu a putut determina diferențele" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm a creat %s ca %s.\n" "Acestea sunt primele 25 de linii diferite:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Ieșire rpm suplimentară" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "backup %s creat" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "Fișierul semnătură %s nu a fost găsit" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "Fișierul semnătură %s nu a fost găsit" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "Fișierul semnătură %s nu a fost găsit" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "(nu expiră)" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(nu expiră)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(EXPIRAT)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(expiră în 24h)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, fuzzy, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(expiră în 24h)" msgstr[1] "(expiră în 24h)" msgstr[2] "(expiră în 24h)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, fuzzy, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Am încercat să import cheia inexistentă %s în colecția de chei %s" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Importul cheii publice %1% a eșuat" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Ștergerea cheii a eșuat." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Fișierul semnătură %s nu a fost găsit" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Tip dubios '%s' pentru byte-ul %u, suma de control '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Nu pot deschide pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Nu pot deschide pipe-ul (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Șir de interogare URL LDAP invalid" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Parametru șir de interogare URL LDAP invalid '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Nu pot clona obiectul Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Referință vidă invalidă la obiect Url" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Nu pot parcurge componentele Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Istoric:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Schema url nu permite %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Componentă %s invalidă '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Componentă invalidă %s" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Pentru acest URL nu este suportată parcurgerea unui șir de interogare" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Schema url este o componentă obligatorie" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Schemă ulr invalidă '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Schema url nu permite un nume de utilizator" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Schema url nu permite parolă" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Schema url necesită o componentă gazdă" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Schema url nu permite componentă gazdă" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Componentă gazdă invalidă '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Schema url nu permite port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Componentă port invalidă '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Schema url necesită o cale" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Calea relativă nu este permisă dacă autoritatea există" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Șirul codat conține un byte NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Parametru invalid caracter de separare împărțire matrici" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Parametru de hartă invalid pentru separarea caracterelor" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Parametru invalid caracter de separare uniune matrici" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Comandă finalizată cu starea %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Comanda a fost oprită de semnalul %d(%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Comandă finalizată cu eroare necunoscută." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Nu se poate face chroot la '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Nu se poate face chroot la '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Nu pot efectua chdir spre '/' în chroot (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Nu pot executa '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Nu pot crea un proces nou (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Montarea %s pe %s a eșuat" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Demontarea %s a eșuat" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nume de fișier incorect: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" "Mediul nu a fost deschis în timp ce se încerca efectuarea acțiunii '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Fișierul '%s' nu a fost găsit pe mediul '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Nu pot scrie fișierul '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Mediu neatașat" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Punct incorect de conectare a mediului" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Inițializarea download-ului (curl) a eșuat pentru '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Excepție sistem '%s' pe mediul '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Calea '%s' de pe mediul '%s' nu este un fișier." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Calea '%s' de pe mediul '%s' nu este un director." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI Invalid" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Nume de gazdă vid în URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Sistem de fișiere vid în URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Destinație vidă în URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Schemă URI nesuportată în '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operația nu este suportată de mediu" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Eroare de descărcare (curl) pentru '%s':\n" "Cod eroare: %s\n" "Mesaj eroare: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "A apărut o eroare la setarea opțiunilor de download (curl) pentru '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Sursa '%s' nu conține CD-ul/DVD-ul corect" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Mediul '%s' este utilizat momentan de o altă instanță" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Nu pot ejecta nici un mediu" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Nu pot ejecta mediul '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Accesul la '%s' a fost interzis." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Timp depășit în timpul accesării '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Locația '%s' este temporar inaccesibilă." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" "Problemă de certificat SSL, verificați dacă certificatul autorității de " "certificare este OK pentru '%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Metodă de autentificare HTTP nesuportată '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Da" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nu" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" # window title for kernel loading (see txt_load_kernel) #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Avertisment:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Eroare" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "gata" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "eroare" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Avertisment:" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Se descarcă:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "pornesc" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Nu s-a găsit" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Niciun ajutor disponibil pentru acest dialog." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "niciun ajutor disponibil pentru această opțiune" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "da" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nu" #, fuzzy #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "" #~ "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide" #~ msgstr[1] "" #~ "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide" #~ msgstr[2] "" #~ "La URL-ul (URL-urile) specificate nu au fost găsite metadate valide" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s nu aparține de o sursă de instalare de actualizare distribuție" #~ msgid "%s has inferior architecture" #~ msgstr "%s are arhitectură inferioară" #~ msgid "problem with installed package %s" #~ msgstr "problemă cu pachetul instalat %s" #~ msgid "nothing provides requested %s" #~ msgstr "nimic nu oferă %s necesar" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Ați activat toate sursele cerute?" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "nu există backup" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s este blocat şi nu poate fi deinstalat." #~ msgid "%s is not installable" #~ msgstr "%s nu este instalabil" #~ msgid "nothing provides %s needed by %s" #~ msgstr "Nimic nu oferă %s necesar pentru %s" #~ msgid "cannot install both %s and %s" #~ msgstr "nu pot instala %s și %s împreună" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s intră în conflict cu %s pus la dispoziție de %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s înlocuiește %s oferit de %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "versiuni vechi %s instalate %s furnizate de %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "dependența %s intră în conflict cu %s furnizat de ea însăși" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s necesită %s, dar această cerință nu este îndeplinită" #~ msgid "do not install %s" #~ msgstr "nu instala %s" #~ msgid "keep %s" #~ msgstr "păstrează %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "nu interzice instalarea %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "nu cere instalarea unui pachet ce oferă %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "nu cere stergerea tuturor pachetelor ce oferă %s" #~ msgid "do not install most recent version of %s" #~ msgstr "nu instala cea mai recentă versiune a %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "păstrează %s chiar dacă arhitectura este inferioară" #~ msgid "install %s despite the inferior architecture" #~ msgstr "instalează %s chiar dacă arhitectura este inferioară" #~ msgid "keep obsolete %s" #~ msgstr "păstrează pachetul vechi %s" #~ msgid "install %s from excluded repository" #~ msgstr "instalează %s de la o sursă de instalare exclusă" #~ msgid "downgrade of %s to %s" #~ msgstr "downgrade %s la %s" #~ msgid "architecture change of %s to %s" #~ msgstr "modificare de arhitectură a %s în %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "instalează %s (cu modificarea vânzătorului)\n" #~ " %s\n" #~ "-->\n" #~ " %s" #~ msgid "replacement of %s with %s" #~ msgstr "înlocuirea %s cu %s" #~ msgid "deinstallation of %s" #~ msgstr "deinstalarea %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Nu pot deschide fișierul zăvor: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Această acțiune este rulată deja de alt program." #~ msgid "Hal Exception" #~ msgstr "Excepție Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Ne pare rău, dar această versiune de libzypp a fost construită fără " #~ "suport HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext nu este conectat" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive nu este inițializat" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume nu este inițializat" #~ msgid "Unable to create dbus connection" #~ msgstr "Nu pot crea conexiunea dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Nu pot crea contextul libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Nu pot seta conexiunea dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "" #~ "Nu pot inițializa contextul HAL -- este posibil ca hald să nu ruleze?" #~ msgid "Not a CDROM drive" #~ msgstr "Nu este o unitate CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Nu pot inițializa atributele mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Nu pot seta atributul mutex recursiv" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Nu pot inițializa mutex-ul recursiv" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Nu pot obține zăvorul mutex-ului" #~ msgid "Can't release the mutex lock" #~ msgstr "Nu pot elibera zăvorul mutex-ului" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Importul cheii publice din fișierul %s a eșuat: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Îndepărtarea cheii publice %s a eșuat: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "Nu este disponibil dispozitivul pentru a monta imagine de la '%s'" #~ msgid "do not keep %s installed" #~ msgstr "nu păstra %s instalat" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "Nu pot crea cheia publică %s din keyring-ul %s pe fișierul %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Inițializarea descărcării (metalink curl) a eșuat pentru '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Eroare de descărcare (metalink curl) pentru '%s':\n" #~ "Cod eroare: %s\n" #~ "Mesaj eroare: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Descărcare întreruptă la %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Descărcare întreruptă de utilizator" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "A apărut o eroare la setarea opțiunilor de descărcare (metalink curl) " #~ "pentru '%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "A eșuat descărcarea %s de la %s" libzypp-17.36.5/po/ru.po000066400000000000000000004267271476576476200150440ustar00rootroot00000000000000# Translation of zypp.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 Novodvorksy , 2000. # Eugene Osintsev , 1999, 2000. # Aleksey Osipov , 2005, 2006, 2007, 2008. # Nikolay Derkach , 2007, 2008. # Alexander Melentiev , 2008, 2009, 2010. # Alexander Melentiev , 2011, 2012, 2013, 2014, 2015. msgid "" msgstr "" "Project-Id-Version: zypp.ru\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2022-03-16 00:12+0000\n" "Last-Translator: Sergey Mashkov \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.9.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Неизвестная страна: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Нет кода" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Андорра" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Объединенные Арабские Эмираты" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Афганистан" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Антигуа и Барбадос" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Ангилья" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Албания" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Армения" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Нидерландские Антильские острова" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Ангола" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Антарктида" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Аргентина" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Американское Самоа" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Австрия" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Австралия" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Аруба" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Аландские острова" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Азербайджан" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Босния и Герцеговина" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Барбадос" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Бангладеш" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Бельгия" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Буркина-Фасо" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Болгария" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Бахрейн" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Бурунди" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Бенин" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Бермудские острова" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Бруней-Даруссалам" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Боливия" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Бразилия" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Багамы" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Бутан" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Остров Буве" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Ботсвана" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Беларусь" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Белиз" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Канада" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Кокосовые острова (Килинг)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Конго" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Центральноафриканская Республика" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Швейцария" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Кот-д\"Ивуар" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Острова Кука" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Чили" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Камерун" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Китай" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Колумбия" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Коста-Рика" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Куба" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Кабо-Верде" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Остров Рождества" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Кипр" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Чехия" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Германия" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Джибути" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Дания" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Доминика" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Доминиканская Республика" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Алжир" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Эквадор" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Эстония" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Египет" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Западная Сахара" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Эритрея" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Испания" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Эфиопия" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Финляндия" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Фиджи" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендские острова (Мальвинские)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Федеративные Штаты Микронезии" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Фарерские острова" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Франция" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Франция" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Габон" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Соединенное Королевство" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Гренада" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Грузия" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Французская Гвинея" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Гернси" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Гана" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Гибралтар" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Гренландия" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Гамбия" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Гвинея" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Гваделупа" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Экваториальная Гвинея" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Греция" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Южная Георгия и Южные Сандвичевы острова" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Гватемала" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Остров Гуам" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Гвинея-Бессау" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Гайяна" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Гонконг" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Остров Херд и острова МакДональда" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Гондурас" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Хорватия" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Гаити" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Венгрия" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Индонезия" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ирландия" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Израиль" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Остров Мэн" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Индия" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Британская территория Индийского океана" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Ирак" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Иран" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Исландия" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Италия" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Джерси" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Ямайка" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Иордан" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Япония" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Кения" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Киргизстан" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Камбоджа" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Кирибати" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Коморские острова" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Сент-Китс и Невис" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Северная Корея" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Южная Корея" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Кувейт" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Каймановы острова" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Казахстан" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Лаосская Народно-Демократическая Республика" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Ливан" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Сент-Люсия" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Лихтенштейн" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Шри-Ланка" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Либерия" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Лесото" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Литва" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Люксембург" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Латвия" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Ливия" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Марокко" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Монако" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Молдова" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Черногория" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Сен-Мартен" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Мадагаскар" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Маршалловы острова" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Македония" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Мали" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Мьянма" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Монголия" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Макао" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Северные Марианские Острова" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Остров Мартиника" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Мавритания" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Монтсеррат" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Мальта" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Маврикий" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Мальдивы" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Малави" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Мексика" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Малайзия" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Мозамбик" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Намибия" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Новая Каледония" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Нигер" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Остров Норфолк" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Нигерия" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Никарагуа" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Нидерланды" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Норвегия" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Непал" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Науру" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Ниуэ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Новая Зеландия" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Оман" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Панама" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Перу" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Французская Полинезия" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Папуа – Новая Гвинея" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Филиппины" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Пакистан" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Польша" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Сен-Пьер и Микелон" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Остров Питкэрн" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Пуэрто-Рико" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Палестина" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Португалия" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Острова Палау" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Парагвай" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Катар" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Реюньон" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Румыния" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Сербия" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Российская Федерация" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Руанда" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Саудовская Аравия" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Соломоновы острова" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Сейшелы" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Судан" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Швеция" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Сингапур" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Остров Святой Елены" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Словения" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Шпицберген и Ян-Майен" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Словакия" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Сьерра-Леоне" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "Сан-Марино" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Сенегал" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Сомали" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Суринам" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Сан-Томе и Принсипи" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Сальвадор" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Сирия" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Свазиленд" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Теркс и Кайкос" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Чад" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Французские Южные территории" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Того" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Таиланд" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Таджикистан" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Токелау" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Туркменистан" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Тунис" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Тонга" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Восточный Тимор" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Турция" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Тувалу" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Тайвань" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Танзания" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Украина" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Уганда" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Внешние малые острова США" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "США" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Уругвай" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Узбекистан" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Ватикан" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Сент-Винсент и Гренадины" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Венесуэла" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Британские Виргинские острова" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Виргинские острова, США" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Вьетнам" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Вануату" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Уоллис и Футуна" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Острова Самоа" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Йемен" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Майотта" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "ЮАР" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Замбия" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Зимбабве" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Предоставляет" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Предварительно требует" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Требует" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Конфликтует" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Делает устаревшим" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Рекомендует" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Предлагает" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Улучшает" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Дополняет" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Неизвестный язык: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Афарский" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Абхазский" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Ачехский" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Ачоли" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Адангме" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Адыгейский" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Афро-азиатский (другие)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Африхили" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Африкаанс" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Айнский" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Аканский" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Аккадский" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Албанский" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Алеутский" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Алгонкинские языки" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Южно-алтайский" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Амхарский (амаринья)" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Английский, Старый (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Апачские языки" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Арабский" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Арамейский" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Арагонский" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Армянский" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Арауканский" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Арапахо" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Искусственные (другие)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Аравакские" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Ассамский" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Астурийский" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Атапаскские языки" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Австралийские языки" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Аварский" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Авестийский" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Авадхи" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Аймара" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Азербайджанский" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Банда" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Бамилеке языки" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Башкирский" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Белуджский" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Бамбара" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Балийский" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Баскский" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Баса" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Балтийский (Другие)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Беджа" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Белорусский" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Бемба" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Бенгальский" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Берберские (другие)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Бходжпури" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Бихари" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Бикольский" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Бини" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Бислама" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Сиксика" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Банту (другие)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Боснийский" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Брауи" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Бретонский" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Батакский (Индонезия)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Бурятский" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Бугийский" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Болгарский" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Бирманский" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Блин" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Каддо" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Индейцев Центральной Америки (Другой)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Кариб" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Каталонский" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Кавказские (другие)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Себуанский" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Кельтские (другие)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Чаморро" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Чибча" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Чеченский" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Чагатайский" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Китайский" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Чукотский" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Марийский" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Чинук жаргон" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Чоктав" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Чипевьян" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Чероки" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Церковно-славянский" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Чувашский" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Чейенн" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Чамикские языки" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Коптский" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Корнский" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Корсиканский" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Англо-креольские и пиджины (другие)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Франко-креольские и пиджины (другие)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Португало-креольские и пиджины (другие)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Кри" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Крымско-татарский" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Креольские и пиджины (другие)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Кашубианский" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Кушитские (другие)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Чешский" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Дакота" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Датский" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Даргинский" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Даякский" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Делаварский" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Атапачские языки" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Догриб" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Динка" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Дивехи (Мальдивский)" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Догри" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Дравидийские (другие)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Нижне-лужицкий" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Дуала" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Немецкий, средневековый (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Голландский" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Диула (Дьюла)" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Дзонг-кэ" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Эфик" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Древнеегипетский" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Экаджук" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Эламский" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Английский" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Английский, Средневековый (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Эсперанто" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Эстонский" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Эве" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Эвондо" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Фанг" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Фарерский" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Фанти" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Фиджи" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Филиппинский" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Финский" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Финно-Угрисйкий (другие)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Фон" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Французский" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Среднефранцузский" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Старофранцузский" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Фризский" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Фулах" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Фриулийский" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Га" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Гайо" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Гбайя" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Германские (другие)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Грузинский" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Немецкий" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Геэз" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Гильбертский" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Гаэльский" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Ирландский" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Галисийский" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Мэнский" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Немецкий, средние века (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Немецкий, старый (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Гонди" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Горонтала" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Готский" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Гребо" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Древнегреческий" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Греческий, Современный (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Гуарани" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Гуджарати" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Гвичин" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Хайда" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Гаитянский" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Хауса" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Гавайский" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Иврит" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Гереро" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Хилигайнон" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Химачали" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Хинди" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Хиттит" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Хмонг" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Хири" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Верхне-лужицкий" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Венгерский" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Хупа" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Ибанский" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Игбо" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Исландский" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Идо" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Йи (Сычуань)" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Иджо" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Инуктитут" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Интерлингве" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Илоко" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Интерлингва (Международная Ассоциация Вспомогательного Языка)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Индийские (другие)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Индонезийский" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Индо-Европейский (Другой)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ингушский" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Инупиак" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Иранский (Другой)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Ирокезские языки" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Итальянский" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Яванский" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Ложбан" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Япония" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Еврейско-персидский" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Еврейско-арабский" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Кара-Калпакский" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Кабильский" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Качинский" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Гренландский" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Камба" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Каннада" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Каренский" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Кашмири" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Канури" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Кави" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Казахский" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Кабардинский" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Кхаси" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Койсанские (другие)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Хмерский" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Хотанский" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Кикуйю" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Киньяруанда" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Киргизский (Кыргызский)" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Кимбунду" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Конкани" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Коми" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Конго" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Корейский" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Кусайе" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Кпелле" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Карачаево-балкарский" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Кру" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Курух" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Киньяма" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Кумыкский" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Курдский" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Кутенаи" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ладино" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Лахнда" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Ламба" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Лаосский" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Латинский" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Латышский" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Лезгинский" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Лимбуржский" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Лингала" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Литовский" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Монго" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Лози" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Люксембургский" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Луба-Лулуа" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Луба-Катанга" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ганда" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Луисеньо" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Лунда" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Луо (Кения и Танзания)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Лушаи" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Македонский" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Мадурский" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Магахи" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Маршальский" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Майтхили" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Макассарский" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Малаялам" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Мандинго" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Маори" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Австронезийские (другие)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Маратхи" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Масаи" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Малайский" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Мокшанский" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Мандара" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Менде" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Ирландский, средневековый (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Микмак" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Минангкабау" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Смешанные языки" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Монкхмерские (другие)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Малагасийский" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Мальтийский" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Манчу" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Манипурский" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Манобо языки" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Мохаук" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Молдавский" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Монгольский" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Моси" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Языки разных семей" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Мунда языки" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Крик" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Мирандский" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Марвари" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Майя языки" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Эрзянский" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Науатль" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Северной Америки индейцев" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Неаполитанский" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Навахо" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ндебеле южный" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ндебеле северный" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ндунга" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Нижненемецкий" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Непальский" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Непал-бхаса" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Ниасский" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Нигер-кордофанские (другие)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Ниуэ" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Нюнорск (Новонорвежский)" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Букмоль (Норвежский)" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Ногайский" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Старонорвежский" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Норвежский" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Северный Сото" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Нубийские языки" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Классический неварский" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Чичева" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Ньямвези" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Ньянколе" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Ньоро" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Нзима" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Окситанский (после 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Оджибва" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Ория" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Оромо" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Оседжи" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Осетинский" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Турецкий, Оттоманский (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Отомангские языки" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Папуасские (другие)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Пангасинан" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Пехлевийский" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Пампанга" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Панджаби" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Папьяменто" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Палау" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Персидский, Старый (ca.600-400 до н.э.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Персидский" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Филиппинские (другие)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Финикийский" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Пали" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Польский" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Понпейский" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Португальский" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Языки пракрит" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Провансальский, Старый (до 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Пушту" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Кечуа" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Раджастхани" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Рапануи" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Раротонга" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Романские (другие)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Рето-Романский" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Цыганский" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Румынский" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Рунди" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Русский" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Сандаве" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Санго" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Якутский" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Индейцев Южной Америки (другие)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Салишские языки" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Самаритянский арамейский" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Санскрит" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Сасакский" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Сантали" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Сербский" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Сицилийский" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Шотландский (Гэльский)" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Хорватский" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Селькупский" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Семитские (другие)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Ирландский, Устаревший (до 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Языки жестов" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Шанский" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Сидама" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Сингальский" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Языки Сиу" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Сино-Тибетские (другие)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Славянские (другие)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Словацкий" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Словенский" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Южно-саамский" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Северо-саамский" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Саамские языки (другие)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Люле-саамский" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Инари-саамский" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Самоанский" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Скольт-саамский" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Шона" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Синдхи" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Сонинке" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Согдийский" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Сомали" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Сонгаи" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Сото Южный" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Испанский" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Сардинский" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Серер" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Нило-сахарские (другие)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Свати" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Сукума" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Сунданский" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Сусу" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Шумерский" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Суахили" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Шведский" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Сирийский" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Таитянский" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Тайские (другие)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Тамильский" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Татарский" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Телугу" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Темне" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Терено" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Тетумский" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Таджикский" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Тагальский" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Тайский" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Тибетский" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Тигре" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Тигринья" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Тив" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Клингон" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Тлингит" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Тамашек" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Тонга (Ньяса)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Тонга (Тонга Исландский)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Ток-писин" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Цимшиан" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Тсвана" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Тсонга" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Туркменский" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Тумбука" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Тупи языки" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Турецкий" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Алтайские (другие)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Тви" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Тувинский" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Удмуртский" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Угаритский" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Уйгурский" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Украинский" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Умбунду" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Неопределенный" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Урду" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Узбекский" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Ваи" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Венда" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Вьетнамский" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Волапюк" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Водский" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Вакашские языки" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Воламо" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Варай" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Вашо" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Уэльский" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Лужицкие языки" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Валлонский" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Волоф" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Калмыцкий" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Кхоса" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Яо" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Яп" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Идиш" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Йоруба" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Языки группы Юпик" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Сапотекский" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Зенагский" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Чжуань" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Занди" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Зулусский" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Зунийский" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Будут выполнены следующие действия:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "неизвестно" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "не поддерживается" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Уровень 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Уровень 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Уровень 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Необходимо дополнительное клиентское соглашение" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "неверно" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Уровень поддержки не определен" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Производитель не предоставляет поддержку." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Определение проблемы, т. е. техподдержка должна предоставлять информацию о " "совместимости, помощь при установке, поддержку использования, обслуживание и " "базовое выявление неисправностей. Поддержка первого уровня не подразумевает " "исправление дефектов продукта." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Изоляция проблемы, т. е. техподдержка должна воспроизводить проблему " "клиента, изолировать проблемную область и предоставлять решения проблем, не " "решенных поддержкой первого уровня." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Решение проблемы, т. е. техподдержка должна решать сложные проблемы с " "привлечением инженеров для исправления дефектов продукта, обнаруженных " "поддержкой второго уровня." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" "Для получения поддержки необходимо дополнительное клиентское соглашение." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Неизвестный вариант поддержки. Описание недоступно" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Управление системой заблокировано приложением с pid %d (%s).\n" "Закройте это приложение перед следующей попыткой." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Неизвестный режим сопоставления \"%s\"" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Неизвестный режим сопоставления \"%s\" для шаблона \"%s\"" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Недопустимое регулярное выражение \"%s\": regcomp вернул %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Недопустимое регулярное выражение \"%s\"" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Необходима аутентификация для \"%s\"" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Убедитесь, что ваша регистрация действительна и срок ее действия не истек, в " "центре SUSE Customer Center." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Посетите Novell Customer Center для проверки срока действия вашей " "регистрации." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Создание точки присоединения: не могу найти катлог с возможностью записи для " "создания точки присоединения" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Сначала установите пакет \"lsof\"." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Невозможно создать каталог кэша метаданных." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Ошибка при попытке чтения из \"%s\"" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Не удалось создать %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Ошибка при кэшировании репозитория (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Сбор кэша репозитория \"%s\"" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Не удалось создать кэш в %s — нет прав на запись." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Необрабатываемый тип репозитория" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Добавление репозитория \"%s\"" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Недопустимое имя файла репозитория в \"%s\"" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Невозможно открыть файл \"%s\" для записи." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Неизвестная ошибка при чтении из \"%s\"" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Невозможно прочитать каталог репозитория \"%1%\": доступ запрещен" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Не удалось прочитать каталог \"%s\"" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Невозможно прочитать файл репозитория \"%1%\": доступ запрещен" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Удаление репозитория \"%s\"" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Невозможно выяснить, где хранится репозиторий." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Не удается удалить \"%s\"" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Невозможно определить, где хранится сервис." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" "Неизвестный сервис \"%1%\": удаление служебного репозитория \"%2%\" с " "нарушенными ассоциациями" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Псевдоним репозитория не может начинаться с точки." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Псевдоним сервис не может начинаться с точки." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Продолжить?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Репозиторий %1% не определяет дополнительных URL вида «gpgkey=»." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Поиск ID gpg-ключа %1% в репозитории %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Поиск ID gpg-ключа %1% в кэше %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Необходимый атрибут \"%s\" отсутствует." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Требуются один или оба атрибута \"%s\" или \"%s\"." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Сбой при проверке подписи" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Похоже, что пакет %s поврежден при передаче. Попробовать получить еще раз?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Не удалось предоставить пакет %s. Попробовать получить еще раз?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "сбой при проверке applydeltarpm." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "сбой в applydeltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Модуль сервиса не поддерживает изменение атрибута." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Невозможно предоставить файл \"%s\" из репозитория \"%s\"" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "В репозитории нет URL-адреса." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" "Ожидается носитель %1%/%2% идентифицированный в файле '%3%' со следующим " "содержимым:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом из пакета\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом из пакета\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом из пакета\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом из пакета\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом\n" " %3%\n" " из пакета\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом\n" " %3%\n" " из пакета\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом\n" " %3%\n" " из пакета\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Файл %1%\n" " из пакета\n" " %2%\n" " конфликтует с файлом\n" " %3%\n" " из пакета\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Невозможно создать sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "повредить %s, игнорируя некоторые из его зависимостей" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "вообще игнорировать некоторые зависимости" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "установленный пакет %1% не содержится в репозитории обновления и должен быть " "заменён" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" "установленный пакет %1% не принадлежит репозиторию обновления дистрибутива" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "установленный %1% имеет низшую архитектуру" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "будет установлен %1% с низшей архитектурой" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "проблема с установленным %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "конфликтующие запросы" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "проблема с некоторыми зависимостями" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "никто не предоставляет запрошенный '%1%'" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Вы включили все необходимые репозитории?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "запрошенный пакет %1% не существует" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "запрос не поддерживается" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1' поставляется как часть системы и не может быть удалён" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% не может быть установлен" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "никто не предоставляет '%1' требуемый для установленного %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "никто не предоставляет '%1%' требуемый для установки %2%" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "невозможно установить оба %1% и %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "установленный %1% конфликтует с '%2%' предоставленным %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "установленный %1% конфликтует с '%2%', требуемым для установки %3%" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "устанавливаемый %1% конфликтует с '%2%' требуемым для установленного %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "устанавливаемый %1% конфликтует с '%2%' требуемым для установки %3%" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "установленный %1% заменяет '%2%', требуемый для установленного %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "установленный %1% заменяет '%2%' требуемый для установки %3%" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "устанавливаемый %1% заменяет '%2%' требуемый для установленного %3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "устанавливаемый %1% заменяет %2% требуемый для установленного %3%" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "установленный %1% конфликтует с '%2%' предоставленным самим собой" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "устанавливаемый %1% конфликтует с '%2%', который поставляет сам" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "установленный %1% требует '%2%', но это требование не может быть выполнено" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "устанавливаемый %1% требует '%2%', но это требование не может быть выполнено" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "удаленные поставщики: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "неустанавливаемые поставщики: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "поставщики, не подлежащие установке: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% ещё не полностью интегрирован в %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Скорее всего вы захотите оставить PTF и решите не устанавливать исправления." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Установленный %1% не позволяет выполнить желаемое действие." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Скорее всего вы хотите оставить PTF и решите отменить действие." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "снять блокировку чтобы разрешить удаление %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "не устанавливать %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "оставить %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "снять блокировку чтобы разрешить установку %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Этот запрос повредит вашу систему!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "игнорировать предупреждение о повреждении системы" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "не просить установить решение, которое предоставляет %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "не просить удалять все решения, предоставляющие %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "не устанавливать самую последнюю версию %1" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "оставить %1% не смотря на низшую архитектуру" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "установить %1% не смотря на низшую архитектуру" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "оставить устаревший %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "установить %1% из выключенного репозитория" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "установить %1%, хоть он и был отозван" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "разрешить установку PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "установить %1%, хоть он и в чёрном списке" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "понизить версию %1% до %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "изменить архитектуру %1% на %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "установить %1% (со сменой поставщика)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "установить %1% от поставщика %2%\n" " заменяющий %3% от поставщика %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "замена %1% на %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "удаление %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Установка прервана согласно указаниям." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " выполнено" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " сбой при выполнении" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s уже выполнен как %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " выполнение пропущено во время прерывания работы" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Ошибка при отправке сообщения об обновлении." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Новое сообщение об обновлении" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Транзакция не удалась из-за следующих проблем:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Сбой RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Не удалось импортировать открытый ключ %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Не удалось удалить открытый ключ %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Заголовок пакета не подписан!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Содержимое пакета на подписано!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Измененные конфигурационные файлы для %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm сохранил %s как %s, но было невозможно определить различия" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm сохранил %s как %s.\n" "Первые 25 строк различий:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm создал %s как %s, но было невозможно определить различия" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm создал %s как %s.\n" "Первые 25 строк различий:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Дополнительный вывод rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "создана резервная копия %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Подпись в порядке" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Неизвестный тип подписи" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Подпись не проверена" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Подпись в порядке, но ключ не является доверенным" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Открытый ключ подписей недоступен" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Файл не существует, или невозможно проверить подпись" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Файл не подписан" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "не истекает" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "истек: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "истекает: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(не истекает)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(ИСТЕК)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(истекает в течение 24 часов)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(истекает через %d день)" msgstr[1] "(истекает через %d дня)" msgstr[2] "(истекает через %d дней)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Попытка импорта несуществующего ключа %s в хранилище ключей %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Не удалось импортировать ключ %1%." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Не удалось удалить ключ." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Не найден файл подписи %s" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Подозрительный тип \"%s\" %u-байтовой контрольной суммы \"%s\"" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Невозможно открыть псевдотерминал (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Невозможно открыть канал (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Недопустимая строка запроса LDAP в URL-адресе" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Недопустимый параметр запроса LDAP в URL-адресе: \"%s\"" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Не удалось создать клон объекта URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Недопустимая ссылка на пустой объект URL" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Не удалось выполнить анализ синтаксиса компонентов URL-адреса" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "История:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Схема URL-адреса не позволяет использовать %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Недопустимый компонент %s: \"%s\"" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Недопустимый компонент %s" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Для данного URL-адреса анализ строки запроса не поддерживается" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Схема URL-адреса является необходимым компонентом" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Недопустимая схема URL-адреса \"%s\"" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Схема URL-адреса не позволяет использовать имя пользователя" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Схема URL-адреса не позволяет использовать пароль" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Схема URL-адреса требует указания компонента хоста" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Схема URL-адреса не позволяет использовать компонент хоста" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Недопустимый компонент хоста \"%s\"" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Схема URL-адреса не позволяет использовать порт" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Недопустимый компонент порта \"%s\"" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Схема URL-адреса требует указания пути" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" "При наличии компонентов авторизации относительные пути указывать нельзя" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Зашифрованная строка содержит байт со значением NULL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Недопустимый символ разделителя для разбиения массива параметров" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Недопустимый символ разделителя для разбиения отображения параметров" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Недопустимый символ разделителя для объединения массива параметров" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Команда завершилась с кодом %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Команда была прекращена сигналом %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Команда завершилась с неизвестной ошибкой." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Заданы неверные аргументы запуска." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Невозможно создать контролирующий канал." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Невозможно выполнить chroot в \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Невозможно сменить каталог на \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Невозможно сменить каталог на \"%s\" внутри среды chroot \"%s\" (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Невозможно выполнить exec \"%s\" (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Невозможно выполнить fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Невозможно выполнить '%s', chdir не удалась (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Невозможно выполнить '%s', chroot не удалась (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Невозможно выполнить '%s', exec не удался (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Невозможно выполнить '%s': неожиданная ошибка." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Не удалось смонтировать %s в %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Не удалось отмонтировать %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Некорректное имя файла: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "При попытке произведения действия \"%s\" не был открыт носитель." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Файл \"%s\" не найден на носителе \"%s\"" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Невозможно записать файл \"%s\"." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Носитель не присоединен" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Некорректная точка присоединения носителя" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Сбой инициализации загрузки (curl) для \"%s\"" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Системное исключение \"%s\" на носителе \"%s\"." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Путь \"%s\" на носителе \"%s\" не является файлом." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Путь \"%s\" на носителе \"%s\" не является каталогом." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Неправильно сформированный URI-адрес" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Пустое имя хоста в URI-адресе" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Пустая файловая система в URI-адресе" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Пустой пункт назначения в URI-адресе" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Неподдерживаемая схема URI-адреса в \"%s\"." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Операция не поддерживается носителем" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Ошибка загрузки (curl) \"%s\":\n" "Код ошибки: %s\n" "Сообщение об ошибке: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "Произошла ошибка при установке параметров загрузки (curl) для \"%s\":" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Источник носителей \"%s\" не содержит желаемого носителя" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Носитель\"%s\" используется другим экземпляром" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Невозможно извлечь ни один носитель" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Невозможно извлечь носитель \"%s\"" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Доступ к \"%s\" запрещен." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Превышено время ожидания при попытке доступа к \"%s\"." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Размер загруженных данных превысил ожидаемый '%s' из '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Расположение \"%s\" временно недоступно." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Проблема с сертификатом SSL, проверьте, все ли в порядке с удостоверяющим " "центром сертификата \"%s\"." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Неподдерживаемый метод HTTP-аутентификации \"%s\"" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Ошибка скачивания (curl) для '%s':\n" "Код ошибки: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Ошибка скачивания (curl) для '%s':\n" "Не могу получить ответ по HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Да" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Нет" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Замечание:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Предупреждение:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Ошибка:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "готово" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "внимание" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "ошибка" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Предупреждение: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Получение:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "запуск" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "не найдено" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Для этого режима справка недоступна." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "для этого параметра справка недоступна" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "выводит все параметры" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "да" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "нет" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "По указанному URL-адресу не найдено допустимых метаданных" #~ msgstr[1] "По указанным URL-адресам не найдено допустимых метаданных" #~ msgstr[2] "По указанным URL адресам не найдено допустимых метаданных" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Выполнение скрипта %%posttrans \"%1%\"" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Выполнение скриптов %posttrans" #~ msgid "Package is not signed!" #~ msgstr "Пакет не подписан!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s не принадлежит репозиторию обновления дистрибутива" #~ msgid "%s has inferior architecture" #~ msgstr "%s имеет худшую архитектуру" #~ msgid "problem with installed package %s" #~ msgstr "проблема в установленном пакете %s" #~ msgid "nothing provides requested %s" #~ msgstr "ничто не предоставляет запрошенный %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Включили ли вы все требуемые репозитории?" #~ msgid "package %s does not exist" #~ msgstr "пакет %s не существует" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s предоставляется системой и не может быть удален" #~ msgid "%s is not installable" #~ msgstr "%s недоступен для установки" #~ msgid "nothing provides %s needed by %s" #~ msgstr "ничто не предоставляет %s, необходимый для %s" #~ msgid "cannot install both %s and %s" #~ msgstr "Не удается установить оба %s и %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s конфликтует с %s, который предоставляется %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s делает устаревшим %s, предоставляемый %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "установленный пакет %s делает устаревшим %s, предоставляемый %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "" #~ "объект разрешения зависимостей %s конфликтует с %s, который " #~ "предоставляется им самим" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s требует %s, но это требование не может быть удовлетворено" #~ msgid "remove lock to allow removal of %s" #~ msgstr "удалить блокировку для удаления %s" #~ msgid "do not install %s" #~ msgstr "не устанавливать %s" #~ msgid "keep %s" #~ msgstr "оставить %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "удалить блокировку для установки %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "" #~ "не просить установить объект разрешения зависимостей, предоставляющий %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "" #~ "не просить удалить все объекты разрешения зависимостей, предоставляющие %s" #~ msgid "do not install most recent version of %s" #~ msgstr "не устанавливать самую последнюю версию %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "оставить %s, несмотря на смену архитектуры" #~ msgid "install %s despite the inferior architecture" #~ msgstr "установить %s, несмотря на смену архитектуры" #~ msgid "keep obsolete %s" #~ msgstr "оставить устаревший %s" #~ msgid "install %s from excluded repository" #~ msgstr "установить %s из исключенного репозитория" #~ msgid "downgrade of %s to %s" #~ msgstr "обновить %s до более старой версии %s" #~ msgid "architecture change of %s to %s" #~ msgstr "изменение архитектуры %s на %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "установить %s (со сменой поставщика)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "замена %s на %s" #~ msgid "deinstallation of %s" #~ msgstr "удаление %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Невозможно открыть файл блокировки: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Это действие уже выполняется другой программой." #~ msgid "Hal Exception" #~ msgstr "Исключение Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Увы, данная версия libzypp была собрана без поддержки HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext не подключен" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive не инициализирован" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume не инициализирован" #~ msgid "Unable to create dbus connection" #~ msgstr "Не удалось установить соединение с dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: не удается создать контекст libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: не удалось установить соединение с dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Не удалось инициализировать контекст HAL – не запущен hald?" #~ msgid "Not a CDROM drive" #~ msgstr "Не привод CD-ROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Невозможно инициализировать атрибуты взаимного исключения" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Невозможно установить атрибут рекурсивного взаимного исключения" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Не удается инициализировать рекурсивное взаимоисключение" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Не удается получить блокировку взаимоисключения" #~ msgid "Can't release the mutex lock" #~ msgstr "Не удается освободить блокировку взаимоисключения" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Не удалось импортировать публичный ключ из файла %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Не удалось удалить публичный ключ %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Невозможно найти доступное loop-устройство для монтирования файла образа " #~ "из '%s'" #~ msgid "generally ignore of some dependecies" #~ msgstr "игнорировать некоторые зависимости везде" #~ msgid "do not keep %s installed" #~ msgstr "не оставлять установленным %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "Невозможно записать публичный ключ %s из хранилища %s в файл %s" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "Попытка импорта несуществующего ключа %s в хранилище ключей %s" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Невозможно выполнить chdir в '/' внутри среды chroot (%s)." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "Сбой инициализации загрузки (Metalink curl) для '%s'" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Ошибка загрузки (metalink curl) для '%s':\n" #~ "Код ошибки: %s\n" #~ "Сообщение об ошибке: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Загрузка прервана на %d%%" #~ msgid "Download interrupted by user" #~ msgstr "Загрузка прервана пользователем" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Произошла ошибка при установке параметров загрузки (metalink curl) для " #~ "'%s':" #~ msgid "Failed to download %s from %s" #~ msgstr "Не удалось загрузить %s с %s" libzypp-17.36.5/po/si.po000066400000000000000000003030451476576476200150140ustar00rootroot00000000000000# Sinhala message file for YaST2 (@memory@). # Copyright (C) 2007 SUSE Linux Products GmbH. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2005-07-29 15:37+0530\n" "Last-Translator: i18n@suse.de\n" "Language-Team: Sinhala \n" "Language: si\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" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "" #. :ARM:051: #: zypp/CountryCode.cc:165 #, fuzzy msgid "Netherlands Antilles" msgstr "නෙදර්ලන්තය" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "බෙල්ජියම" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "" #. :COG:178: #: zypp/CountryCode.cc:199 #, fuzzy msgid "Switzerland" msgstr "නෙදර්ලන්තය" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "ජර්මනිය" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "ඩෙන්මාර්කය" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "පින්ලන්තය" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 #, fuzzy msgid "Faroe Islands" msgstr "අයර්ලන්තය" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "එක්සත් රාජධානිය" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "ජර්මනිය" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "" #. :GIB:292: #: zypp/CountryCode.cc:240 #, fuzzy msgid "Greenland" msgstr "අයර්ලන්තය" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "ග්‍රිසිය" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "හන්ගේරියාව" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "අයර්ලන්තය" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "" #. :IRN:364: #: zypp/CountryCode.cc:265 #, fuzzy msgid "Iceland" msgstr "අයර්ලන්තය" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 #, fuzzy msgid "North Korea" msgstr "උතුරු අයර්ලන්තය" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "ලක්සන්බර්ග්" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "මෝල්ඩෝව" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "" #. :MAC:446: #: zypp/CountryCode.cc:305 #, fuzzy msgid "Northern Mariana Islands" msgstr "උතුරු අයර්ලන්තය" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" #. :NER:562: #: zypp/CountryCode.cc:319 #, fuzzy msgid "Norfolk Island" msgstr "උතුරු අයර්ලන්තය" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "නෙදර්ලන්තය" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "" #. :NIU:570: #: zypp/CountryCode.cc:327 #, fuzzy msgid "New Zealand" msgstr "නෙදර්ලන්තය" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "" #. :PAK:586: #: zypp/CountryCode.cc:335 #, fuzzy msgid "Poland" msgstr "පින්ලන්තය" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "පෘතුගාලය" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "රුමෙනියාව" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "ස්ලෝවෙනියාව" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "ස්ලෝවැකියාව" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" #. :SYR:760: #: zypp/CountryCode.cc:367 #, fuzzy msgid "Swaziland" msgstr "පින්ලන්තය" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" #. :TGO:768: #: zypp/CountryCode.cc:372 #, fuzzy msgid "Thailand" msgstr "පින්ලන්තය" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "තුර්කිය" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "යුක්රේනය" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "උතුරු අයර්ලන්තය" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 #, fuzzy msgid "German" msgstr "ජර්මනිය" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 #, fuzzy msgid "Hungarian" msgstr "හන්ගේරියාව" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 #, fuzzy msgid "Icelandic" msgstr "අයර්ලන්තය" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "ලක්සන්බර්ග්" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "මෝල්ඩෝව" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 #, fuzzy msgid "North American Indian" msgstr "උතුරු අයර්ලන්තය" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "ජර්මනිය" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "" #. language code: nso #: zypp/LanguageCode.cc:813 #, fuzzy msgid "Northern Sotho" msgstr "උතුරු අයර්ලන්තය" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 #, fuzzy msgid "Portuguese" msgstr "පෘතුගාලය" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "රුමෙනියාව" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 #, fuzzy msgid "Romanian" msgstr "රුමෙනියාව" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 #, fuzzy msgid "Slovak" msgstr "ස්ලෝවැකියාව" #. language code: slv sl #: zypp/LanguageCode.cc:959 #, fuzzy msgid "Slovenian" msgstr "ස්ලෝවෙනියාව" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 #, fuzzy msgid "Northern Sami" msgstr "උතුරු අයර්ලන්තය" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "තුර්කිය" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 #, fuzzy msgid "Turkish" msgstr "තුර්කිය" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 #, fuzzy msgid "Ukrainian" msgstr "යුක්රේනය" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Couldn't open file: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Couldn't open file: %s." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Couldn't open file: %s." #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Couldn't open file: %s." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Couldn't open file: %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Couldn't open file: %s." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "" #: zypp-tui/Table.cc:32 msgid "No" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." libzypp-17.36.5/po/sk.po000066400000000000000000003663521476576476200150300ustar00rootroot00000000000000# Copyright (C) YEAR SuSE Linux GmbH, Nuernberg # This file is distributed under the same license as the PACKAGE package. # Ferdinand Galko , 2015, 2016. msgid "" msgstr "" "Project-Id-Version: libzypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2025-03-01 15:56+0000\n" "Last-Translator: Ferdinand Galko \n" "Language-Team: Slovak " "\n" "Language: sk\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: Weblate 5.10.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Neznáma krajina: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Žiadny kód" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Spojené Arabské Emiráty" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua a Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albánsko" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Arménsko" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Holandské Antily" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktída" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentína" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Americká Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Rakúsko" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Austrália" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Alandské ostrovy" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbajdžan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosna a Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladéš" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgicko" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulharsko" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrajn" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudy" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolívia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazílsky" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamy" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhután" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvetov ostrov" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Bielorusko" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosové (Keeling) ostrovy" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Stredoafrická Republika" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Švajčiarsko" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Pobrežie Slonoviny" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookove ostrovy" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Čile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Čína" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kostarika" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kapverdy" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Vianočne ostrovy" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cyprus" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Česká Republika" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Nemecko" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Džibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Dánsko" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikánska republika" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alžírsko" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvádor" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estónsko" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Západná Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Španielsko" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiópia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Fínsko" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandské ostrovy (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federácia Mikronézskych štátov" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faerské ostrovy" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francúzsko" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Metropolitné Francúzsko" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Spojené kráľovstvo" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Granada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gruzínsko" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Francúzska Guana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltár" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grónsko" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Rovníková Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grécko" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Južná Georgia a Južné Sandwichove ostrovy" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heardov ostrov a Macdonaldové ostrovy" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Chorvátsko" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Maďarsko" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonézia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Írsko" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Ostrov Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britská oblasť Indického oceánu" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irak" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Taliansko" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamajka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordánsko" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonsko" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Keňa" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgizsko" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodža" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komory" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Svätý Kitts a Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Severná Kórea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Južná Kórea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuvajt" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kaimanské ostrovy" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazachstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Ľudová Demokratická Republika Laos" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Svätá Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Lichtenštajnsko" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Srí Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Libéria" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litva" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembursko" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Lotyšsko" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Líbya" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavsko" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Čierna hora" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Svätý Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshallove ostrovy" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedónsko" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mjanmarsko" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolsko" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Severné ostrovy Mariana" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinik" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritánia" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Maurícius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldivy" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malajzia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namíbia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nová Kaledónia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolské ostrovy" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigéria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Holandsko" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Nórsko" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepál" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nový Zéland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Omán" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Francúzska Polynézia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nová Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipíny" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poľsko" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Svätý Pierre a Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairnove ostrovy" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Portoriko" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestínske teritórium" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugalsko" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguaj" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumunsko" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Srbsko" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Ruská Federácia" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudská Arábia" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomon ostrovy" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychely" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudán" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Švédsko" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Svätá Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovinsko" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard a Jan Mayen ostrovy" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovensko" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Maríno" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somálsko" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome a Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Salvádor" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Sýria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swazijsko" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Ostrovy Turks a Caicos" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Čad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Južné Francúzske teritóriá" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thajsko" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkménsko" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisko" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Východný Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turecko" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad a Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tajwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzánia" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrajina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Spojené Štáty Minor Outlying ostrovy" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Spojené Štáty" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguaj" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Mestský Štát Vatikán" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Svätý Vincent a Grenadíny" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britské Panenské ostrovy" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Panenské ostrovy, U.S." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis a Futuna ostrovy" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Južná Afrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Poskytuje" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Predpokladá" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Vyžaduje" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Je v konflikte" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Zastarané" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Odporúča" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Navrhuje" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Zlepšuje" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Doplnky" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Neznámy jazyk: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afarčina" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abcházčina" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Acehčina" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Ačoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adygčina" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Ázijský (ostatné)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihikli" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikánsky" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadčina" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albánsky" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleuty" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonkské jazyky" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Južný Altai" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharic" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Staroanglický (r. 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apačské jazyky" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabský" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramejčina" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonese" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Arménsky" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araukánčina" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Umelý (ostatné)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawačtina" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamský" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Rakúsky" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athabaské jazyky" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Austrálske jazyky" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarský" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestský jazyk" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymarčina" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Ázerbajdžánsky" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Balúdžtina" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balijčina" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskitský" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltický (ostatné)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Bedža" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bieloruský" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengálsky" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berber (ostatné)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhódžpurčina" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Biharčina" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikolčina" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (ostatné)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosniansky" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Bradžčina" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretónsky" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "(Batak) Indonézia" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buriatčina" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginčina" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulharský" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmese" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Kaddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Stredoamerický Indiánsky (ostatné)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Karibský" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalánsky" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukazský (ostatné)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuánčina" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltský (ostatné)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Čibský" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Čečenský" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Čagatajský" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Čínsky" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Čukský" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Maríjčina" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Činucký žargón" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Čipeva" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Čerokézčina" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Cirkevný slovanský" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Čuvaština" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Čejenský" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Čamaské jazyky" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptčina" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornish" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korzický" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creoles a Pidgins, anglické (ostatné)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creoles a Pidgins, francúzske (ostatné)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creoles a Pidgins, Portugalské (ostatné)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krimský tatársky" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creoles a Pidgins (ostatné)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kašubský" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Cushitic (ostatné)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Český" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakotský" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Dánsky" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Darginčina" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dajačtina" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidian (ostatné)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Dolná lužická srbčina" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Holandský, stredoveký (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Holandský" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Djula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Egyptský (starobylý)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekadžuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamčina" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Anglický" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Anglický stredoveký (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estónsky" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faroese" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fidžský" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipínsky" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Fínsky" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fínsko-uhorský (ostatné)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fončina" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francúzsky" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francúzsky starý (r. 842-1400)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francúzsky stredný (r. 1400-1600)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frízsky" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Frízsky" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaja" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Nemecký (ostatné)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Gruzínsky" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Nemecký" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Ge´ez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Kiribatčina" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaelic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Írsky" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galícijský" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Mančina" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Nemecký (r. 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Nemecký (r. 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotický" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grécky starobylý (do r. 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grécky moderný (od r. 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitian" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Havajský" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebrejský" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligajnončina" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himachálsky" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Chetitčina" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Hornosrbský" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Maďarský" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandský" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Idžo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indický (ostatné)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonézsky" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoeurópsky (ostatné)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Inguština" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iránsky (ostatné)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokézske jazyky" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Taliansky" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Jávsky" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonský" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Židovsko-Perzský" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Židovsko-Arabský" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpačtina" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabylčina" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kačjinčina" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Grónčina" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karenčina" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kašmírsky" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazašský" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardčina" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasijčina" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khojsánske jazyky (iné)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Kotčina" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuju" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgizský" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkánčina" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komijčina" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Konžský" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Kórejský" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kusaie" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukhčina" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuaňama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumytčina" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdský" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladinčina" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahandčina" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latinský" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Lotyšský" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezginčina" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgan" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litovský" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburský" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-luluánčina" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseňo" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Keňa a Tanzánia)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lušáí" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedónsky" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurčina" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahí" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallove ostrovy" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasarčina" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronézsky (ostatné)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malajský" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandarčina" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Írsky stredný (r. 900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mikman" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabaučina" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Rôzne jazyky" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Khmer (ostatné)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagasy" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltézsky" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Mandžuština" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobo jazyky" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldavský" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongolský" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mosi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Viaceré jazyky" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Mundské jazyky" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Muskogi" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Májske jazyky" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Severoamerický Indiánsky" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitan" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele (Južná Afrika)" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele (Zimbabwe)" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Dolnonemčina" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepálsky" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepál Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Nigérisjko-Kordofanský (ostatné)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niueština" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Nórsky Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Nórsky Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogidalčina" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Norse, starý" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Nórsky" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Severné Sotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubijiské jazyky" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Classical Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Ňandža" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Ňamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Ňankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Ňoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (post 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Odžibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromčina" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turecký, Ottoman (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Oto-pameské jazyky" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papujský (ostatné)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlaví" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampangan" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Pandžábčina" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palaučina" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Perzský starý (r. 600-400 p.n.l.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Perzský" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipíny (ostatné)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Péničtina" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pálí" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Poľský" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeičina" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugalský" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakritské jazyky" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provensálsky, starý (do 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Kečuánčina" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Radžastanský" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanujčina" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongčina" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romance (ostatné)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Rétorománčina" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Rómčina" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumunský" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ruský" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Juhoamerický Indiánsky (ostatné)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Sališské jazyky" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritánska aramejčina" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrt" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasačtina" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Srbský" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicílsky" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Chorvátsky" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkupčina" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitský (ostatné)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Írsky starý (do r. 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Znakové jazyky" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Šančina" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouské jazyky" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-tibetský (ostatné)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slovanský (ostatné)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovenský" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovinský" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Južné Sami" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Severné Sami" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Samské jazyky (ostatné)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Inari Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samojčina" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Šona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdčina" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somálsky" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Soto" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Španielsky" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardínsky" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nílsko-Saharský" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundánsky" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumérsky" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Svahilský" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Švédsky" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Sýrčina" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitský" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Tai (ostatné)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamilský" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatársky" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thajský" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetský" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingónsky" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamašek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tongčina (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tongské ostrovy)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshijské jazyky" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Čwančina" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkménsky" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Jazyky tupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turecký" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altajské jazyky" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuviančina" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurtčina" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritčina" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrajinský" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Neurčený" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbecký" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamský" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Vodčina" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakašské jazyky" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamčina" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Welšský" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Srbské jazyky" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmyčtina" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Japčina" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Judejský" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupické jazyky" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotéčtina" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Čuangčina" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Budú vykonané nasledovné akcie:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "neznámy" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nepodporovaný" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Úroveň 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Úroveň 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Úroveň 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Je potrebná ďalšia Zákaznícka Zmluva" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Ukončené a nahradené iným balíkom" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "chybný" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Úroveň podpory nie je určená" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Dodávateľ neposkytuje podporu." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Určenie problému, teda technická podpora zameraná na poskytovanie informácií " "o kompatibilite, pomoc pri inštalácii, pomoc pri používaní, nepretržitú " "údržbu a základnú pomoc pri riešení problémov. Podpora Úrovne 1 nie je " "určená na opravu chýb produktu." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Izolácia problému, teda technická podpora zameraná na reprodukovanie " "problémov zákazníka, vymedzenie problémovej oblasti a poskytovanie riešenia " "problémov nevyriešených Podporou Úrovne 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Riešenie problému, teda technická podpora zameraná na riešenie zložitých " "problémov za pomoci odborníkov pri riešení chýb produktu, ktoré boli " "identifikované Podporou Úrovne 2." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Pre poskytovanie podpory je potrebná ďalšia zákaznícka zmluva." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "Balík bol ukončený a nahradil ho nový balík s iným názvom." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Neznáma voľba podpory. Popis nie je k dispozícii" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Správa softvéru je uzamknutá inou aplikáciou s pid %d (%s).\n" "Ukončite najprv túto aplikáciu a skúste znova." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Neznámy režim zhody '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Neznámy režim zhody '%s' pre šablónu '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Neplatný regulárny výraz '%s': regcomp vrátil %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Neplatný regulárny výraz '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "'%s' vyžaduje autentifikáciu" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Skúste to znova..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Vzdanie sa po %1 % pokusoch." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Navštívte SUSE Customer Center, aby ste skontrolovali, či je vaša " "registrácia platná a ešte nevypršala." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Navštívte Novell Customer Center, aby ste skontrolovali, či je vaša " "registrácia platná a ešte nevypršala." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Vytvoriť prípojný bod: Nie je možné nájsť zapisovateľný adresár pre " "vytvorenie prípojného bodu" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Prosím, najskôr nainštalujte balík 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Nie je možné vytvoriť adresár vyrovnávacej pamäte metadát." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Chyba pri čítaní z '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Nie je možné vytvoriť %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Nepodarilo sa načítať metadáta nového repozitára." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "Nepodarilo sa uložiť repozitár do vyrovnávacej pamäte ( nie je možné spustiť " "repo2solv )." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Zlyhalo ukladanie do vyrovnávacej pamäti pre repozitár (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Vytváram vyrovnávaciu pamäť repozitára '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" "Nie je možné vytvoriť vyrovnávaciu pamäť v %s - žiadne práva na zapisovanie." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Nepodarilo sa uložiť do vyrovnávacej pamäte repozitár %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Nepodporovaný typ repozitára" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Pridávam repozitár '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Neplatný názov súboru repozitára v '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Nemôžem otvoriť súbor '%s' pre zápis." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Neznáma chyba čítania z '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Nie je možné čítať adresár repozitára '%1%': Prístup zamietnutý" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Zlyhalo čítanie adresára '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Nie je možné čítať súbor repozitára '%1%': Prístup zamietnutý" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Vymazávanie metadát" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Vymazávanie balíkov" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Vymazanie adresárov vyrovnávacej pamäte" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Vymazanie adresára: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Vymazávanie vyrovnávacej pamäte" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Načítavanie z vyrovnávacej pamäte" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Odstraňujem repozitár '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Nie je možné prísť na to, kde je uložený repozitár." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Nie je možné vymazať '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Úprava repozitára" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Obnovenie repozitára: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Nie je možné prísť na to, kde je uložená služba." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Neznámá služba '%1%': Odstraňovanie osirelého repozitára služby '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Alias repozitára nemôže začínať bodkou." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Alias služby nemôže začínať bodkou." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Žiadny prehľad pre súbor %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Neznámy prehľad %s pre súbor %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Overenie prehľadu zlyhalo pre súbor '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Súbor '%s' nie je podpísaný, pokračovať?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Súbor '%s' z repozitára '%s' nie je podpísaný. Pokračovať?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Prajete si tento kľúč odmietnuť, prijať dočasne alebo prijať natrvalo?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Názov kľúča: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "Bol prijatý %1% nový podpisový kľúč balíkov z repozitára \"%2%\":" msgstr[1] "Boli prijaté %1% nové podpisové kľúče balíkov z repozitára \"%2%\":" msgstr[2] "" "Bolo prijatých %1% nových podpisových kľúčov balíkov z repozitára \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Overenie podpisu súboru '%1%' zlyhalo." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "Overenie podpisu súboru '%1%' z repozitára '%2%' zlyhalo." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Pokračovať?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Súbor '%s' je podpísaný neznámym kľúčom '%s'. Pokračovať?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Súbor '%s' z repozitára '%s' je podpísaný neznámym kľúčom '%s'. Pokračovať?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Repozitár %1% nedefinuje dodatočné URL 'gpgkey='." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Hľadanie ID gpg kľúča %1% v repozitári %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Hľadanie ID gpg kľúča %1% vo vyrovnávacej pamäti %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Chýba vyžadovaný atribút '%s' ." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Jeden alebo oba z atribútov '%s' alebo '%s' sú vyžadované." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Overenie podpisu zlyhalo" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Balík %s sa počas sťahovania pravdepodobne poškodil. Chcete sa znova pokúsiť " "o jeho stiahnutie?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Zlyhalo poskytnutie Balíka %s. Chcete sa pokúsiť o znovuzískanie?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Kontrola aplikovania delta rpm zlyhala." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "Aplikovanie delta rpm zlyhalo." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Žiadne oprávnenie na zápis do vyrovnávacej pamäte repozitárov." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Zásuvný modul služby nepodporuje zmenu atribútu." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Nemôžem poskytnúť súbor '%s' z repozitára '%s'" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Pre tento repozitár nie je definovaná žiadna URL adresa." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Očakávané médium% 1%/%2% identifikované podľa súboru '%3%' s obsahom:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Súbor %1%\n" " z balíka\n" " %2%\n" " je v konflikte so súborom z balíka\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Súbor %1%\n" " z balíka\n" " %2%\n" " je v konflikte so súborom inštalovaným z\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Súbor %1%\n" " inštalovaný z\n" " %2%\n" " je v konflikte so súborom z balíka\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Súbor %1%\n" " inštalovaný z\n" " %2%\n" " je v konflikte so súborom inštalovaným z\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Súbor %1%\n" " z balíka\n" " %2%\n" " je v konflikte so súborom\n" " %3%\n" " z balíka\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Súbor %1%\n" " z balíka\n" " %2%\n" " je v konflikte so súborom\n" " %3%\n" " inštalovaným z\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Súbor %1%\n" " inštalovaný z\n" " %2%\n" " je v konflikte so súborom\n" " %3%\n" " z balíka\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Súbor %1%\n" " inštalovaný z\n" " %2%\n" " je v konflikte so súborom\n" " %3%\n" " inštalovaným z\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Nepodarilo sa vytvoriť sat-pole." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "porušiť %s ignorovaním niektorých závislostí" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "všeobecne ignorovať niektoré závislosti" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "nainštalovaný %1% nepatrí do repozitára zvýšenia verzie distribúcie a musí " "byť nahradený" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" "%1%, ktorý sa má inštalovať, nepatrí do repozitára zvýšenia verzie " "distribúcie" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "nainštalovaný %1% má nižšiu architektúru" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "%1%, ktorý sa má inštalovať, má nižšiu architektúru" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problém s nainštalovaným %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "protichodné požiadavky" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "problém so závislosťami" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "nič neposkytuje požadovaný '%1%'" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Máte povolené všetky požadované repozitáre?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "požadovaný balík %1% neexistuje" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "nepodporovaná požiadavka" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' poskytuje systém a nemôže sa vymazať" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% nie je inštalovateľný" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "nič neposkytuje '%1%', ktorý je potrebný pre nainštalovaný %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" "nič neposkytuje '%1%', ktorý je potrebný pre %2%, ktorý sa má inštalovať" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "nie je možné nainštalovať obidva %1% aj %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje nainštalovaný %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje %3%, ktorý sa má " "inštalovať" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje " "nainštalovaný %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje %3%, " "ktorý sa má inštalovať" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "nainštalovaný %1% zastaráva '%2%', ktorý poskytuje nainštalovaný %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "nainštalovaný %1% zastaráva '%2%', ktorý poskytuje %3%, ktorý sa má " "inštalovať" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "%1%, ktorý sa má inštalovať, zastaráva '%2%', ktorý poskytuje nainštalovaný " "%3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "%1%, ktorý sa má inštalovať, zastaráva '%2%', ktorý poskytuje %3%, ktorý sa " "má inštalovať" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "nainštalovaný %1% je v konflikte s '%2%', ktorý poskytuje sám" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "%1%, ktorý sa má inštalovať, je v konflikte s '%2%', ktorý poskytuje sám" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "nainštalovaný %1% vyžaduje '%2%', ale túto požiadavku nie je možné splniť" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "%1%, ktorý sa má inštalovať, vyžaduje '%2%', ale túto požiadavku nie je " "možné splniť" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "zmazaný poskytovatelia: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "neinštalovateľní poskytovatelia: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "neinštalovateľní poskytovatelia: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% ešte nie je úplne integrované do %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Zvyčajne chcete zachovať PTF a rozhodnete sa neinštalovať údržbové opravy." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Odstránenie nainštalovaného %1% v tomto kontexte odstráni (nie nahradí!) aj " "zahrnuté PTF balíky." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF by sa malo odstrániť volaním '%1%'. Tým sa aktualizujú zahrnuté PTF " "balíky namiesto ich odstránenia." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Zvyčajne si chcete ponechať PTF alebo sa rozhodnúť zrušiť akciu." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Nainštalované %1% blokuje požadovanú akciu." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Zvyčajne chcete zachovať PTF a rozhodnete sa zrušiť akciu." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "odstrániť zámok pre umožnenie odstránenia %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "neinštalovať %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "ponechať %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "odstrániť zámok pre umožnenie inštalácie %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Tento požiadavka poruší váš systém!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorovať varovanie o porušení systému" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "nepožadovať inštaláciu riešenia, ktoré poskytuje %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "nepožadovať zmazanie všetkých riešení, ktoré poskytuje %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "neinštalovať najnovšiu verziu %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "ponechať %1% napriek nižšej architektúre" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "nainštalovať %1% napriek nižšej architektúre" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "ponechať zastaraný %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "inštalovať %1% z vylúčeného repozitára" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "inštalovať %1%, aj keď bol stiahnutý späť" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "umožniť inštaláciu PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "inštalovať %1%, aj keď je nežiadúci" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "znížiť verziu %1% na %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "zmena architektúry %1% na %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "inštalovať %1% (so zmenou dodávateľa)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "inštalovať %1% od dodávateľa %2%\n" " nahradenie %3% od dodávateľa %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "nahradenie %1% s %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "odinštalovanie %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Spustenie skriptov po transakcii" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Spustenie skriptu %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Výstup skriptu %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Inštalácia bola podľa príkazu zrušená." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " spustený" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " spustenie zlyhalo" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s už spustený ako %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " spustenie odložené kvôli prerušeniu programu" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Chyba zasielania oznámenia o aktualizačnej správe." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nová správa aktualizácie" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Prijatý signál :\"%1% (%2%)\", na zabezpečenie konzistentnosti systému nie " "je možné zrušiť prebiehajúcu rpm transakciu." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Vykonanie transakcie zlyhalo z dôvodu nasledujúcich problémov:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "Nenašlo sa žiadne zrkadlo" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "Nepodarilo sa vytvoriť cieľový súbor" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "Už vo vyrovnávacej pamäti" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "Zlyhalo premenovanie dočasného súboru." #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "Dokončené" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "Zrušené používateľom." #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM zlyhalo: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Nepodarilo sa importovať verejný kľúč %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Nepodarilo zmazať verejný kľúč %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Hlavička balíka nie je podpísaná!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Obsah balíka nie je podpísaný!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Zmenené konfiguračné súbory pre '%s':" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "Balík rpm uložil %s ako %s, ale nebolo možné určiť rozdiel" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "Balík rpm uložil %s ako %s.\n" "Tu je prvých 25 riadkov rozdielov:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "Balík rpm vytvoril %s as %s, ale nebolo možné určiť rozdiel" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "Balík rpm vytvoril %s as %s.\n" "Tu je prvých 25 riadkov rozdielov:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Ďalší výstup z rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "Bola vytvorená záloha %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Podpis je v poriadku" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Neznámy typ podpisu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Podpis neoveruje" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Podpis je v poriadku, ale kľúč nie je dôveryhodný" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Verejný kľúč podpisov nie je k dispozícii" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Súbor neexistuje alebo podpis nie je možné overiť" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Súbor je nepodpísaný" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "nevyprší" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "vypršal: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "vyprší: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(nevyprší)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(VYPRŠANÉ)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(vyprší do 24h)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(vyprší za %d deň)" msgstr[1] "(vyprší za %d dni)" msgstr[2] "(vyprší za %d dní)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Pokus o importovanie neexistujúceho kľúča %s do zväzku kľúčov %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Nepodarilo sa importovať kľúč." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Nepodarilo zmazať kľúč." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Súbor podpisu %s nebol nájdený" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Pochybný typ '%s' pre %u bajtový kontrolný súčet '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Nie je možné otvoriť pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Nie je možné otvoriť rúru (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Neplatný query string v URL pre LDAP" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Neplatný parameter dopytu LDAP URL '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Daný URL objekt nie je možne klonovať" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Neplatný odkaz na prázdny URL objekt" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Nie je možné prečítať zložky URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "História:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Zadaná URL schéma nepovoľuje %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "%s obsahuje neplatnú položku '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "%s obsahuje neplatnú položku" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Query string nie je pre túto URL povolený" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Schéma URL je povinná" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Neplatný názov URL schémy: '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Daná URL schéma nepovoľuje meno používateľa" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Daná URL schéma nepovoľuje heslo" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Daná URL schéma vyžaduje názov hostiteľského počítača (host component)" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" "Daná URL schéma nepovoľuje názov hostiteľského počítača (host component)" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Neplatný názov počítača '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Daná URL schéma nepovoľuje port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Neplatný port '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Daná URL schéma vyžaduje zadanú cestu" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relatívna cesta nie je povolená v prípade, že je zadaná autorita" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Zakódovaný reťazec obsahuje NUL bajt" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Neplatný oddeľovací znak pre pole parametrov" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Neplatný oddeľovací znak pre mapu parametrov" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Neplatný oddeľovací znak pre spájanie poľa parametrov" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Stav príkazu po skončení je %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Príkaz bol zabitý signálom %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Príkaz skončil s neznámou chybou." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Zadané nesprávne argumenty spawn." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Nie je možné vytvoriť riadiacu rúru." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Nemôžem spraviť chroot do '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Nie je možné vykonať chroot pre '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Nie je možné vykonať chdir pre '%s' vo vnútri chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Nemôžem spustiť '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Nemôžem spraviť rozdelenie programu (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Nemožno vykonať '%s', chdir zlyhal (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Nemožno vykonať '%s', chroot zlyhal (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Nemožno vykonať '%s', exec zlyhal (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Nemožno vykonať '%s', neočakávaná chyba." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Nepodarilo sa pripojiť %s na %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Nepodarilo sa odpojiť %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Nesprávne meno súboru: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Médium sa neotvorilo pri pokuse vykonať '%s'." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Súbor '%s' nebol nájdený na médiu '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Nemôžem zapísať súbor '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Médium nie je pripojené" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Nesprávny prípojný bod média" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Zlyhala inicializácia sťahovania (curl) pre '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Systémová výnimka '%s' na médiu '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Cesta '%s' na médiu '%s' nie je súborom." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Cesta '%s' na médiu '%s' nie je adresárom." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Chybné URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Prázdny názov hostiteľa v URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Prázdny súborový systém v URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Prázdny cieľ v URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Nepodporovaná schéma URI v '%s'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operácie nie je médiom podporovaná" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Chyba sťahovania (curl) pre '%s':\n" "Kód chyby: %s\n" "Chybová správa: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Vyskytla sa chyba počas nastavovania možností sťahovania (curl) pre '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Zdroj média '%s' neobsahuje požadované médium" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Médium '%s' už používa iná inštancia" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Nemôžem vysunúť žiadne médium" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Nemôžem vysunúť médium '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Zamietnutý prístup na '%s'." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Vypršal časový limit pri prístupe na '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Stiahnuté dáta prekročili očakávanú veľkosť súboru '%s' z '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Umiestnenie '%s' je dočasne nedostupné." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " problém s certifikátom SSL, skontrolujte či certifikát CA je v poriadku pre " "'%s'." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Na pripojenie média nie sú k dispozícii žiadne voľné zdroje." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "'%s' nie je podporovaná metóda autentifikácie" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Chyba sťahovania (curl) pre '%s':\n" "Kód chyby: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Chyba sťahovania (curl) pre '%s':\n" "Odpoveď HTTP sa nepodarilo načítať\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Áno" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nie" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Poznámka:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Varovanie:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Chyba:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "hotovo" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "pozor" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "chyba" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Pozor: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Sťahuje sa:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "štartovanie" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "nenájdené" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Pre túto výzvu nie je k dispozícii pomocník." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "pre túto voľbu nie je k dispozícii pomocník" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "ukazuje všetky voľby" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "áno" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nie" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Na stanovenej adrese URL sa nenašli platné metadáta" #~ msgstr[1] "Na stanovených adresách URL sa nenašli platné metadáta" #~ msgstr[2] "Na stanovených adresách URL sa nenašli platné metadáta" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Vykonávanie %%posttrans skriptu '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Vykonávanie %p osttrans skriptov" #~ msgid "Package is not signed!" #~ msgstr "Balík nie je podpísaný!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s nepatrí do repozitára zvýšenia verzie distribúcie" #~ msgid "%s has inferior architecture" #~ msgstr "%s má nižšiu architektúru" #~ msgid "problem with installed package %s" #~ msgstr "Problém s nainštalovaným balíkom %s" #~ msgid "nothing provides requested %s" #~ msgstr "nič neposkytuje požadovaný %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Máte povolené všetky požadované repozitáre?" #~ msgid "package %s does not exist" #~ msgstr "balík %s neexistuje" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s poskytuje systém a nemôže sa vymazať" #~ msgid "%s is not installable" #~ msgstr "%s nie je inštalovateľný" #~ msgid "nothing provides %s needed by %s" #~ msgstr "nič neposkytuje %s, ktorý je potrebný pre %s" #~ msgid "cannot install both %s and %s" #~ msgstr "nie je možné nainštalovať obidva %s aj %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s je v konflikte s %s poskytovaným %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s zastaráva %s, ktorý poskytuje %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "nainštalovaný %s zastaráva %s, ktorý poskytuje %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "Riešenie %s je v konflikte s %s, ktorý poskytuje sám" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s vyžaduje %s, ale túto požiadavku nie je možné splniť" #~ msgid "remove lock to allow removal of %s" #~ msgstr "odstrániť zámok pre umožnenie odstránenia %s" #~ msgid "do not install %s" #~ msgstr "neinštalovať %s" #~ msgid "keep %s" #~ msgstr "ponechať %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "odstrániť zámok pre umožnenie inštalácie %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "nepožadovať inštaláciu riešenia, ktoré poskytuje %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "nepožadovať zmazanie všetkých riešení, ktoré poskytuje %s" #~ msgid "do not install most recent version of %s" #~ msgstr "neinštalovať najnovšiu verziu %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "ponechať %s napriek nižšej architektúre" #~ msgid "install %s despite the inferior architecture" #~ msgstr "nainštalovať %s napriek nižšej architektúre" #~ msgid "keep obsolete %s" #~ msgstr "ponechať zastaraný %s" #~ msgid "install %s from excluded repository" #~ msgstr "inštalovať %s z vylúčeného repozitára" #~ msgid "downgrade of %s to %s" #~ msgstr "znížiť verziu %s na %s" #~ msgid "architecture change of %s to %s" #~ msgstr "zmena architektúry %s na %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "inštalovať %s (so zmenou dodávateľa)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "nahradenie %s s %s" #~ msgid "deinstallation of %s" #~ msgstr "odinštalovanie %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Nie je možné otvoriť súbor so zámkom: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Táto akcia je už spustená iným programom." #~ msgid "Hal Exception" #~ msgstr "Výnimka Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Prepáčte, ale táto verzia libzypp bola zostavená bez podpory HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext nie je pripojený" #~ msgid "HalDrive not initialized" #~ msgstr "Jednotka HalDrive nie je inicializovaná" #~ msgid "HalVolume not initialized" #~ msgstr "Jednotka HalVolume nie je inicializovaná" #~ msgid "Unable to create dbus connection" #~ msgstr "Nie je možné vytvoriť spojenie pomocou dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Nie je možné vytvoriť libhal context" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: Nie je možné nastaviť spojenie s dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Nie je možné inicializovať HAL kontext -- je spustený hald?" #~ msgid "Not a CDROM drive" #~ msgstr "Nie je CDROM mechanika" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Nemôžem inicializovať mutex atribúty" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Nemôžem nastaviť rekurzívny mutex" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Nemôžem inicializovať rekurzívny mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Nepodarilo sa získať mutex zámok" #~ msgid "Can't release the mutex lock" #~ msgstr "Nemôžem uvoľniť mutex zámok" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Nepodarilo sa importovať verejný kľúč zo súboru %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Nepodarilo zmazať verejný kľúč %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Nie je možné nájsť dostupné loop zariadenie na pripojenie súboru obrazu z " #~ "'%s'" libzypp-17.36.5/po/sl.po000066400000000000000000003667451476576476200150370ustar00rootroot00000000000000# 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: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-11-12 02:48+0000\n" "Last-Translator: Jure Repinc \n" "Language-Team: Slovenian \n" "Language: sl\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: Weblate 5.8.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Neznana država: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Brez kode" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andora" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Združeni arabski emirati" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigva in Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Angvila" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanija" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenija" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Nizozemski Antili" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktika" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Ameriška Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Avstrija" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Avstralija" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Alandski otoki" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbajdžan" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosna in Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladeš" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgija" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bolgarija" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrajn" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunej" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivija" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazilija" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahami" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Butan" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvetov otok" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botsvana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belorusija" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosovi (Keelingovi) otoki" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Srednjeafriška republika" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Švica" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Slonokoščena obala" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cookovi otoki" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Čile" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kitajska" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbija" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kostarika" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Zelenortski otoki" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Božični otok" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Ciper" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Češka republika" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Nemčija" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Džibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danska" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominika" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikanska republika" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alžirija" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonija" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipt" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Zahodna Sahara" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritreja" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Španija" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopija" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finska" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandski otoki" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Združene države Mikronezije" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Ferski otoki" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francija" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Metropolitanska Francija" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Združeno kraljestvo" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gruzija" # Shouldn't this be French Guyane? # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Francoska Gvajana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grenlandija" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambija" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Gvineja" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Gvadelup" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatorialna Gvineja" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grčija" # GS #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Južna Georgija in Južni Sandwichevi otoki" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Gvatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Gvam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Gvineja Bissau" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Gvajana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hongkong" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Otok Heard in otočje McDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Hrvaška" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Madžarska" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonezija" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irska" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Otok Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indija" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Britansko ozemlje v Indijskem oceanu" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Islandija" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italija" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamajka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordanija" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonska" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenija" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgizstan" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodža" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komori" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Sveti Krištof in Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Severna Koreja" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Južna Koreja" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuvajt" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Kajmanski otoki" # Shouldn't this be "Kazakhstan"? # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazahstan" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Laos, ljudska demokratična republika" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Sveta Lucija" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Lihtenštajn" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Šrilanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberija" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesoto" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litva" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvija" # LY #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libija" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavija" # CG #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Črna gora" # SM #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Sveti Martin" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshallovi otoki" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonija" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Mjanmar" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolija" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Makav" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Severni Marijanski otoki" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinik" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mavretanija" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Monserat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # Shouldn't this be "Mauritius"? # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mavricij" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldivi" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malavi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mehika" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malezija" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibija" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nova Kaledonija" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolški otok" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigerija" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragva" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nizozemska" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norveška" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nova Zelandija" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Francoska Polinezija" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nova Gvineja" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipini" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poljska" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Sveti Peter in Mihael" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairnovi otoki" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Portoriko" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestinsko ozemlje" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugalska" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palav" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paragvaj" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romunija" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Srbija" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Ruska federacija" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudova Arabija" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salomonovi otoki" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Sejšeli" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Švedska" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sveta Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenija" # SJ #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard in Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovaška" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalija" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sveti Tomaž in Princ" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Salvador" # SY #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Sirija" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Svazi" # Perhaps "Turks and Caicos Islands"? # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Otoki Turks in Caicos" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Čad" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Francoska južna ozemlja" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tajska" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistan" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelav" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunizija" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Vzhodni Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turčija" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad in Tobago" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tajvan" # TZ #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzanija" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrajina" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Manjši oddaljeni otoki Združenih držav" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Združene države" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Urugvaj" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikanska država (Sveti sedež)" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Sveti Vincencij in Grenadine" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britanski Deviški otoki" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Deviški otoki Združenih držav" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # This should be Wallis, not Wallace # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis in Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Južna Afrika" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambija" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabve" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Ponuja" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Pred-zahteva" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Zahteva" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Spori" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Nadomešča" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Priporoča" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Predlaga" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Izboljša" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Dopolnjuje" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Neznan jezik: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abkhazijski" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Aceščina" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Ačolščina" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Dangmenščina" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adigejščina" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-azijski (drugi)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikanščina" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainujščina" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akanščina" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akadščina" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanščina" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutščina" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonkinski jeziki" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Južnoaltajščina" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharic" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Angleščina, stara (okoli 450–1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apaški jeziki" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabski" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramejščina" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonščina" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armenski" #. language code: arn #: zypp/LanguageCode.cc:211 #, fuzzy msgid "Araucanian" msgstr "Albanščina" #. language code: arp #: zypp/LanguageCode.cc:213 #, fuzzy msgid "Arapaho" msgstr "Grafi" #. language code: art #: zypp/LanguageCode.cc:215 #, fuzzy msgid "Artificial (Other)" msgstr "CA certifikat" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamski" #. language code: ast #: zypp/LanguageCode.cc:221 #, fuzzy msgid "Asturian" msgstr "Avstrija" #. language code: ath #: zypp/LanguageCode.cc:223 #, fuzzy msgid "Athapascan Languages" msgstr "Nastavi jezik" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 #, fuzzy msgid "Avaric" msgstr "Amharic" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbaižanščina" #. language code: bad #: zypp/LanguageCode.cc:237 #, fuzzy msgid "Banda" msgstr "Kanada" #. language code: bai #: zypp/LanguageCode.cc:239 #, fuzzy msgid "Bamileke Languages" msgstr "Nastavi jezik" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 #, fuzzy msgid "Bambara" msgstr "Samba" #. language code: ban #: zypp/LanguageCode.cc:247 #, fuzzy msgid "Balinese" msgstr "Osnova" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskovščina" #. language code: bas #: zypp/LanguageCode.cc:253 #, fuzzy msgid "Basa" msgstr "Osnova" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Belorusščina" #. language code: bem #: zypp/LanguageCode.cc:261 #, fuzzy msgid "Bemba" msgstr "Bermuda" # SN #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 #, fuzzy msgid "Bini" msgstr "Hindi" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" # BJ #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosanski" # BR #. language code: bra #: zypp/LanguageCode.cc:283 #, fuzzy msgid "Braj" msgstr "Brazilija" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonščina" #. language code: btk #: zypp/LanguageCode.cc:287 #, fuzzy msgid "Batak (Indonesia)" msgstr "Indonezija" #. language code: bua #: zypp/LanguageCode.cc:289 #, fuzzy msgid "Buriat" msgstr "Bolgarija" #. language code: bug #: zypp/LanguageCode.cc:291 #, fuzzy msgid "Buginese" msgstr "Kitajščina" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarščina" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 #, fuzzy msgid "Burmese" msgstr "Vodilo" #. language code: byn #: zypp/LanguageCode.cc:299 #, fuzzy msgid "Blin" msgstr "Belgijska" #. language code: cad #: zypp/LanguageCode.cc:301 #, fuzzy msgid "Caddo" msgstr "Karte" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 #, fuzzy msgid "Carib" msgstr "Karte" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalanščina" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 #, fuzzy msgid "Cebuano" msgstr "Libanon" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Komorski" #. language code: chb #: zypp/LanguageCode.cc:317 #, fuzzy msgid "Chibcha" msgstr "Kitajska" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Češki" #. language code: chg #: zypp/LanguageCode.cc:321 #, fuzzy msgid "Chagatai" msgstr "Shanghai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kitajščina" #. language code: chk #: zypp/LanguageCode.cc:327 #, fuzzy msgid "Chuukese" msgstr "Kitajščina" # ML #. language code: chm #: zypp/LanguageCode.cc:329 #, fuzzy msgid "Mari" msgstr "Mali" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 #, fuzzy msgid "Choctaw" msgstr "Chroot" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Cerkveno Slovanski" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 #, fuzzy msgid "Cheyenne" msgstr "Kanal" #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "Jeziki" #. language code: cop #: zypp/LanguageCode.cc:347 #, fuzzy msgid "Coptic" msgstr "Računanje" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Kornščina" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korziški" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" # &A is taken #. language code: cre cr #: zypp/LanguageCode.cc:359 #, fuzzy msgid "Cree" msgstr "Kreiraj" #. language code: crh #: zypp/LanguageCode.cc:361 #, fuzzy msgid "Crimean Tatar" msgstr "Čas in datum" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Češka" #. language code: dak #: zypp/LanguageCode.cc:373 #, fuzzy msgid "Dakota" msgstr "Dhaka" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danska" #. language code: dar #: zypp/LanguageCode.cc:377 #, fuzzy msgid "Dargwa" msgstr "Darwin" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 #, fuzzy msgid "Delaware" msgstr "Strojna oprema" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 #, fuzzy msgid "Dinka" msgstr "Trdi disk" #. language code: div dv #: zypp/LanguageCode.cc:389 #, fuzzy msgid "Divehi" msgstr "Gonilnik" #. language code: doi #: zypp/LanguageCode.cc:391 #, fuzzy msgid "Dogri" msgstr "Prijava" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 #, fuzzy msgid "Lower Sorbian" msgstr "Varčevanje z energijo" #. language code: dua #: zypp/LanguageCode.cc:397 #, fuzzy msgid "Duala" msgstr "Dakar" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nizozemska" #. language code: dyu #: zypp/LanguageCode.cc:405 #, fuzzy msgid "Dyula" msgstr "Dubai" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Angleščina" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonska" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 #, fuzzy msgid "Ewondo" msgstr "Konec" #. language code: fan #: zypp/LanguageCode.cc:429 #, fuzzy msgid "Fang" msgstr "Območje" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faerščina" #. language code: fat #: zypp/LanguageCode.cc:433 #, fuzzy msgid "Fanti" msgstr "Atlantik" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijian" #. language code: fil #: zypp/LanguageCode.cc:437 #, fuzzy msgid "Filipino" msgstr "Filipini" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finska" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 #, fuzzy msgid "Fon" msgstr "Pisave" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francoska" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frizijski" #. language code: ful ff #: zypp/LanguageCode.cc:455 #, fuzzy msgid "Fulah" msgstr "Zastavice" #. language code: fur #: zypp/LanguageCode.cc:457 #, fuzzy msgid "Friulian" msgstr "Frizijski" #. language code: gaa #: zypp/LanguageCode.cc:459 #, fuzzy msgid "Ga" msgstr "Gaza" # GA #. language code: gay #: zypp/LanguageCode.cc:461 #, fuzzy msgid "Gayo" msgstr "Gabon" #. language code: gba #: zypp/LanguageCode.cc:463 #, fuzzy msgid "Gbaya" msgstr "Gaza" #. language code: gem #: zypp/LanguageCode.cc:465 #, fuzzy msgid "Germanic (Other)" msgstr "Nemška (mrtva tipka)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Gruzijski" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Nemška" #. language code: gez #: zypp/LanguageCode.cc:475 #, fuzzy msgid "Geez" msgstr "Grška" #. language code: gil #: zypp/LanguageCode.cc:477 #, fuzzy msgid "Gilbertese" msgstr "Vietnamski" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 #, fuzzy msgid "Gaelic" msgstr "Mali" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irščina" #. language code: glg gl #: zypp/LanguageCode.cc:483 #, fuzzy msgid "Galician" msgstr "Vatikan" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 #, fuzzy msgid "Gondi" msgstr "Zvok" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 #, fuzzy msgid "Grebo" msgstr "Skupina" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 #, fuzzy msgid "Gwich'in" msgstr "Michigan" #. language code: hai #: zypp/LanguageCode.cc:511 #, fuzzy msgid "Haida" msgstr "Strojna oprema" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "Haiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 #, fuzzy msgid "Hawaiian" msgstr "Havaji" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebrejski" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" # HT #. language code: hit #: zypp/LanguageCode.cc:529 #, fuzzy msgid "Hittite" msgstr "Haiti" #. language code: hmn #: zypp/LanguageCode.cc:531 #, fuzzy msgid "Hmong" msgstr "HongKong" # HT #. language code: hmo ho #: zypp/LanguageCode.cc:533 #, fuzzy msgid "Hiri Motu" msgstr "Hiri" #. language code: hsb #: zypp/LanguageCode.cc:535 #, fuzzy msgid "Upper Sorbian" msgstr "Srbščina" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Madžarska" #. language code: hup #: zypp/LanguageCode.cc:539 #, fuzzy msgid "Hupa" msgstr "Hausa" # IR #. language code: iba #: zypp/LanguageCode.cc:541 #, fuzzy msgid "Iban" msgstr "Iran" #. language code: ibo ig #: zypp/LanguageCode.cc:543 #, fuzzy msgid "Igbo" msgstr "Ne upoštevaj" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Islandska" #. language code: ido io #: zypp/LanguageCode.cc:549 #, fuzzy msgid "Ido" msgstr "ld" #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "Litva" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Medzejični" #. language code: ilo #: zypp/LanguageCode.cc:559 #, fuzzy msgid "Iloko" msgstr "Tokijo" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonezijščina" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 #, fuzzy msgid "Ingush" msgstr "Angleščina" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italijanska" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanski" #. language code: jbo #: zypp/LanguageCode.cc:581 #, fuzzy msgid "Lojban" msgstr "Libanon" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonska" #. language code: jpr #: zypp/LanguageCode.cc:585 #, fuzzy msgid "Judeo-Persian" msgstr "Perzijski" #. language code: jrb #: zypp/LanguageCode.cc:587 #, fuzzy msgid "Judeo-Arabic" msgstr "Arabski" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 #, fuzzy msgid "Kabyle" msgstr "Omogočeno" #. language code: kac #: zypp/LanguageCode.cc:593 #, fuzzy msgid "Kachin" msgstr "Išči v" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 #, fuzzy msgid "Kamba" msgstr "Samba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kanada" #. language code: kar #: zypp/LanguageCode.cc:601 #, fuzzy msgid "Karen" msgstr "Korejščina" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kašmir" #. language code: kau kr #: zypp/LanguageCode.cc:605 #, fuzzy msgid "Kanuri" msgstr "Kurdsko" #. language code: kaw #: zypp/LanguageCode.cc:607 #, fuzzy msgid "Kawi" msgstr "Darwin" # Shouldn't this be "Kazakhstan"? # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazaški" #. language code: kbd #: zypp/LanguageCode.cc:611 #, fuzzy msgid "Kabardian" msgstr "Kanada" #. language code: kha #: zypp/LanguageCode.cc:613 #, fuzzy msgid "Khasi" msgstr "Tajski" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 #, fuzzy msgid "Khotanese" msgstr "Kitajščina" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 #, fuzzy msgid "Kimbundu" msgstr "Vrsta" #. language code: kok #: zypp/LanguageCode.cc:629 #, fuzzy msgid "Konkani" msgstr "Korejščina" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 #, fuzzy msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Korejščina" #. language code: kos #: zypp/LanguageCode.cc:637 #, fuzzy msgid "Kosraean" msgstr "Korejščina" #. language code: kpe #: zypp/LanguageCode.cc:639 #, fuzzy msgid "Kpelle" msgstr "Črkovalniki" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 #, fuzzy msgid "Kurukh" msgstr "Turška" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 #, fuzzy msgid "Kumyk" msgstr "Testni modul" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdsko" # KE #. language code: kut #: zypp/LanguageCode.cc:653 #, fuzzy msgid "Kutenai" msgstr "Kenija" #. language code: lad #: zypp/LanguageCode.cc:655 #, fuzzy msgid "Ladino" msgstr "Radioamaterstvo" #. language code: lah #: zypp/LanguageCode.cc:657 #, fuzzy msgid "Lahnda" msgstr "Pokrajina" #. language code: lam #: zypp/LanguageCode.cc:659 #, fuzzy msgid "Lamba" msgstr "Samba" # LA #. language code: lao lo #: zypp/LanguageCode.cc:661 #, fuzzy msgid "Lao" msgstr "Laos" #. language code: lat la #: zypp/LanguageCode.cc:663 #, fuzzy msgid "Latin" msgstr "Latvijščina" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Latvijščina" #. language code: lez #: zypp/LanguageCode.cc:667 #, fuzzy msgid "Lezghian" msgstr "Belgijska" #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "Luksemburg" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 #, fuzzy msgid "Lingala" msgstr "Angola" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litvanska" # CG #. language code: lol #: zypp/LanguageCode.cc:675 #, fuzzy msgid "Mongo" msgstr "Kongo" #. language code: loz #: zypp/LanguageCode.cc:677 #, fuzzy msgid "Lozi" msgstr "Prijava" #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "Luksemburg" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 #, fuzzy msgid "Ganda" msgstr "Gana" #. language code: lui #: zypp/LanguageCode.cc:687 #, fuzzy msgid "Luiseno" msgstr "Poslušaj na" #. language code: lun #: zypp/LanguageCode.cc:689 #, fuzzy msgid "Lunda" msgstr "Nedelja" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "Tajski" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonščina" #. language code: mad #: zypp/LanguageCode.cc:699 #, fuzzy msgid "Madurese" msgstr "Faerščina" # MW #. language code: mag #: zypp/LanguageCode.cc:701 #, fuzzy msgid "Magahi" msgstr "Malavi" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 #, fuzzy msgid "Marshallese" msgstr "Marshallovi otoki" #. language code: mai #: zypp/LanguageCode.cc:705 #, fuzzy msgid "Maithili" msgstr "Matematika" # MG #. language code: mak #: zypp/LanguageCode.cc:707 #, fuzzy msgid "Makasar" msgstr "Madagaskar" #. language code: mal ml #: zypp/LanguageCode.cc:709 #, fuzzy msgid "Malayalam" msgstr "Malezija" #. language code: man #: zypp/LanguageCode.cc:711 #, fuzzy msgid "Mandingo" msgstr "Opozorilo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 #, fuzzy msgid "Maori" msgstr "Glavni" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 #, fuzzy msgid "Marathi" msgstr "Matematika" # MW #. language code: mas #: zypp/LanguageCode.cc:721 #, fuzzy msgid "Masai" msgstr "Malavi" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "Malta" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 #, fuzzy msgid "Mandar" msgstr "Mjanmar" #. language code: men #: zypp/LanguageCode.cc:731 #, fuzzy msgid "Mende" msgstr "Način" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "Razne nastavitve" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "Managua" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 #, fuzzy msgid "Maltese" msgstr "Malta" #. language code: mnc #: zypp/LanguageCode.cc:747 #, fuzzy msgid "Manchu" msgstr "Ročno" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "Jeziki" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "Moldavija" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 #, fuzzy msgid "Mongolian" msgstr "Mongolija" #. language code: mos #: zypp/LanguageCode.cc:759 #, fuzzy msgid "Mossi" msgstr "Morse" #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "&Več ključev" #. language code: mun #: zypp/LanguageCode.cc:763 #, fuzzy msgid "Munda languages" msgstr "Se&kundarni jeziki" #. language code: mus #: zypp/LanguageCode.cc:765 #, fuzzy msgid "Creek" msgstr "Grška" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 #, fuzzy msgid "Mirandese" msgstr "Wisconsin" #. language code: mwr #: zypp/LanguageCode.cc:769 #, fuzzy msgid "Marwari" msgstr "Strojna oprema" #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "Jeziki" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 #, fuzzy msgid "Nahuatl" msgstr "Ročno" #. language code: nai #: zypp/LanguageCode.cc:777 #, fuzzy msgid "North American Indian" msgstr "Severna Amerika" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 #, fuzzy msgid "Ndonga" msgstr "Tonga" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "Nemška" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 #, fuzzy msgid "Nepali" msgstr "Nepal" # NP #. language code: new #: zypp/LanguageCode.cc:795 #, fuzzy msgid "Nepal Bhasa" msgstr "Nepal" #. language code: nia #: zypp/LanguageCode.cc:797 #, fuzzy msgid "Nias" msgstr "Vzdevek" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" # NU #. language code: niu #: zypp/LanguageCode.cc:801 #, fuzzy msgid "Niuean" msgstr "Niue" #. language code: nno nn #: zypp/LanguageCode.cc:803 #, fuzzy msgid "Norwegian Nynorsk" msgstr "Norveška" #. language code: nob nb #: zypp/LanguageCode.cc:805 #, fuzzy msgid "Norwegian Bokmal" msgstr "Norveška" #. language code: nog #: zypp/LanguageCode.cc:807 #, fuzzy msgid "Nogai" msgstr "Prijava" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norveščina" #. language code: nso #: zypp/LanguageCode.cc:813 #, fuzzy msgid "Northern Sotho" msgstr "Severna Irska" #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "Nastavi jezik" #. language code: nwc #: zypp/LanguageCode.cc:817 #, fuzzy msgid "Classical Newari" msgstr "Ime razreda" #. language code: nya ny #: zypp/LanguageCode.cc:819 #, fuzzy msgid "Chichewa" msgstr "Češki" #. language code: nym #: zypp/LanguageCode.cc:821 #, fuzzy msgid "Nyamwezi" msgstr "Ime" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 #, fuzzy msgid "Nyoro" msgstr "Sever" #. language code: nzi #: zypp/LanguageCode.cc:827 #, fuzzy msgid "Nzima" msgstr "Lima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" # SY #. language code: ori or #: zypp/LanguageCode.cc:833 #, fuzzy msgid "Oriya" msgstr "Sirija" #. language code: orm om #: zypp/LanguageCode.cc:835 #, fuzzy msgid "Oromo" msgstr "Korenski uporabnik" #. language code: osa #: zypp/LanguageCode.cc:837 #, fuzzy msgid "Osage" msgstr "shrani" #. language code: oss os #: zypp/LanguageCode.cc:839 #, fuzzy msgid "Ossetian" msgstr "Ruska" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "Nastavi jezik" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 #, fuzzy msgid "Pangasinan" msgstr "Madžarska" #. language code: pal #: zypp/LanguageCode.cc:849 #, fuzzy msgid "Pahlavi" msgstr "Palau" #. language code: pam #: zypp/LanguageCode.cc:851 #, fuzzy msgid "Pampanga" msgstr "Paragvaj" #. language code: pan pa #: zypp/LanguageCode.cc:853 #, fuzzy msgid "Panjabi" msgstr "Punjabi" #. language code: pap #: zypp/LanguageCode.cc:855 #, fuzzy msgid "Papiamento" msgstr "Parameter" #. language code: pau #: zypp/LanguageCode.cc:857 #, fuzzy msgid "Palauan" msgstr "Palau" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Perzijski" #. language code: phi #: zypp/LanguageCode.cc:865 #, fuzzy msgid "Philippine (Other)" msgstr "Filipini" #. language code: phn #: zypp/LanguageCode.cc:867 #, fuzzy msgid "Phoenician" msgstr "Slovenščina" # ML #. language code: pli pi #: zypp/LanguageCode.cc:869 #, fuzzy msgid "Pali" msgstr "Mali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Poljska" #. language code: pon #: zypp/LanguageCode.cc:873 #, fuzzy msgid "Pohnpeian" msgstr "Indonezijščina" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugalska" #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "Primarni &Jezik" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 #, fuzzy msgid "Pushto" msgstr "Po meri" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" # Shouldn't this be "Kazakhstan"? # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 #, fuzzy msgid "Rajasthani" msgstr "Kazahstan" #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "Japonska" #. language code: rar #: zypp/LanguageCode.cc:889 #, fuzzy msgid "Rarotongan" msgstr "Preberi usmerjanje" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "Romunija" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romunščina" #. language code: run rn #: zypp/LanguageCode.cc:901 #, fuzzy msgid "Rundi" msgstr "Deluje" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ruska" #. language code: sad #: zypp/LanguageCode.cc:905 #, fuzzy msgid "Sandawe" msgstr "Pokrajina" #. language code: sag sg #: zypp/LanguageCode.cc:907 #, fuzzy msgid "Sango" msgstr "Saigon" #. language code: sah #: zypp/LanguageCode.cc:909 #, fuzzy msgid "Yakut" msgstr "Breakout" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "Nastavi jezik" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 #, fuzzy msgid "Sanskrit" msgstr "Začetek" #. language code: sas #: zypp/LanguageCode.cc:919 #, fuzzy msgid "Sasak" msgstr "Samba" #. language code: sat #: zypp/LanguageCode.cc:921 #, fuzzy msgid "Santali" msgstr "Scan postaja" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Srbščina" #. language code: scn #: zypp/LanguageCode.cc:927 #, fuzzy msgid "Sicilian" msgstr "Michigan" #. language code: sco #: zypp/LanguageCode.cc:929 #, fuzzy msgid "Scots" msgstr "Sekunde" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Hrvaška" #. language code: sel #: zypp/LanguageCode.cc:935 #, fuzzy msgid "Selkup" msgstr "Preskoči" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "Jeziki" #. language code: shn #: zypp/LanguageCode.cc:943 #, fuzzy msgid "Shan" msgstr "Shanghai" #. language code: sid #: zypp/LanguageCode.cc:945 #, fuzzy msgid "Sidamo" msgstr "Samoa" #. language code: sin si #: zypp/LanguageCode.cc:947 #, fuzzy msgid "Sinhala" msgstr "Zaporedno (serial)" #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Nastavi jezik" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovaška" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenščina" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 #, fuzzy msgid "Northern Sami" msgstr "Severna Irska" #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "Jeziki" #. language code: smj #: zypp/LanguageCode.cc:967 #, fuzzy msgid "Lule Sami" msgstr "Ime modula" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 #, fuzzy msgid "Samoan" msgstr "Samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 #, fuzzy msgid "Shona" msgstr "Slovenija" #. language code: snd sd #: zypp/LanguageCode.cc:977 #, fuzzy msgid "Sindhi" msgstr "Hindi" #. language code: snk #: zypp/LanguageCode.cc:979 #, fuzzy msgid "Soninke" msgstr "Nadaljuj" #. language code: sog #: zypp/LanguageCode.cc:981 #, fuzzy msgid "Sogdian" msgstr "Prijava" # SO #. language code: som so #: zypp/LanguageCode.cc:983 #, fuzzy msgid "Somali" msgstr "Somalija" #. language code: son #: zypp/LanguageCode.cc:985 #, fuzzy msgid "Songhai" msgstr "Shanghai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Španska" #. language code: srd sc #: zypp/LanguageCode.cc:991 #, fuzzy msgid "Sardinian" msgstr "Ukrajinska" #. language code: srr #: zypp/LanguageCode.cc:993 #, fuzzy msgid "Serer" msgstr "Strežnik" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 #, fuzzy msgid "Swati" msgstr "Začetek" #. language code: suk #: zypp/LanguageCode.cc:999 #, fuzzy msgid "Sukuma" msgstr "Povzetek" #. language code: sun su #: zypp/LanguageCode.cc:1001 #, fuzzy msgid "Sundanese" msgstr "Sudan" #. language code: sus #: zypp/LanguageCode.cc:1003 #, fuzzy msgid "Susu" msgstr "SMVodilo(SMBus)" #. language code: sux #: zypp/LanguageCode.cc:1005 #, fuzzy msgid "Sumerian" msgstr "Srbščina" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 #, fuzzy msgid "Swahili" msgstr "Svazi" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Švedska" # SY #. language code: syr #: zypp/LanguageCode.cc:1011 #, fuzzy msgid "Syriac" msgstr "Sirija" #. language code: tah ty #: zypp/LanguageCode.cc:1013 #, fuzzy msgid "Tahitian" msgstr "Tahiti" #. language code: tai #: zypp/LanguageCode.cc:1015 #, fuzzy msgid "Tai (Other)" msgstr "Ostalo" #. language code: tam ta #: zypp/LanguageCode.cc:1017 #, fuzzy msgid "Tamil" msgstr "Družina" #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "Katar" #. language code: tel te #: zypp/LanguageCode.cc:1021 #, fuzzy msgid "Telugu" msgstr "Belgija" #. language code: tem #: zypp/LanguageCode.cc:1023 #, fuzzy msgid "Timne" msgstr "Čas" #. language code: ter #: zypp/LanguageCode.cc:1025 #, fuzzy msgid "Tereno" msgstr "Herero" #. language code: tet #: zypp/LanguageCode.cc:1027 #, fuzzy msgid "Tetum" msgstr "Pentium" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 #, fuzzy msgid "Tajik" msgstr "Pogovori" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Tajski" # TW #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetanski" #. language code: tig #: zypp/LanguageCode.cc:1039 #, fuzzy msgid "Tigre" msgstr "prezri" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 #, fuzzy msgid "Tigrinya" msgstr "Nigerija" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 #, fuzzy msgid "Klingon" msgstr "Saigon" #. language code: tli #: zypp/LanguageCode.cc:1049 #, fuzzy msgid "Tlingit" msgstr "Dopisni seznami" #. language code: tmh #: zypp/LanguageCode.cc:1051 #, fuzzy msgid "Tamashek" msgstr "Tashkent" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 #, fuzzy msgid "Tonga (Tonga Islands)" msgstr "Solomonovi otoki" #. language code: tpi #: zypp/LanguageCode.cc:1057 #, fuzzy msgid "Tok Pisin" msgstr "Token Ring" #. language code: tsi #: zypp/LanguageCode.cc:1059 #, fuzzy msgid "Tsimshian" msgstr "Ruska" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 #, fuzzy msgid "Tswana" msgstr "Botsvana" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 #, fuzzy msgid "Tsonga" msgstr "Tonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "Turčija" #. language code: tum #: zypp/LanguageCode.cc:1067 #, fuzzy msgid "Tumbuka" msgstr "Timbuktu" #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "Nastavi jezik" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turška" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 #, fuzzy msgid "Tuvinian" msgstr "Tunizija" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 #, fuzzy msgid "Ugaritic" msgstr "Haiti" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrajinska" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 #, fuzzy msgid "Undetermined" msgstr "Medzejični" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 #, fuzzy msgid "Uzbek" msgstr "Uzbekistan" #. language code: vai #: zypp/LanguageCode.cc:1097 #, fuzzy msgid "Vai" msgstr "Vi" #. language code: ven ve #: zypp/LanguageCode.cc:1099 #, fuzzy msgid "Venda" msgstr "Proizvajalec" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamski" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 #, fuzzy msgid "Votic" msgstr "Vatikan" #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "Nastavi jezik" #. language code: wal #: zypp/LanguageCode.cc:1109 #, fuzzy msgid "Walamo" msgstr "Palm" #. language code: war #: zypp/LanguageCode.cc:1111 #, fuzzy msgid "Waray" msgstr "Sobota" #. language code: was #: zypp/LanguageCode.cc:1113 #, fuzzy msgid "Washo" msgstr "Welški" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Welški" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 #, fuzzy msgid "Walloon" msgstr "vsi" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 #, fuzzy msgid "Kalmyk" msgstr "Pogovori" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 #, fuzzy msgid "Yapese" msgstr "Japonska" #. language code: yid yi #: zypp/LanguageCode.cc:1133 #, fuzzy msgid "Yiddish" msgstr "Končaj" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 #, fuzzy msgid "Yoruba" msgstr "Aruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "Nastavi jezik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 #, fuzzy msgid "Zenaga" msgstr "Grenada" #. language code: zha za #: zypp/LanguageCode.cc:1143 #, fuzzy msgid "Zhuang" msgstr "Spremeni" #. language code: znd #: zypp/LanguageCode.cc:1145 #, fuzzy msgid "Zande" msgstr "Območje" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 #, fuzzy msgid "Zuni" msgstr "Tunizija" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Izvedena bodo naslednja dejanja:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "neznano" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nepodprto" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "1. stopnja" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "2. stopnja" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "3. stopnja" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Potrebna je dodatna uporabniška pogodba" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Opuščen in nadomeščen z drugim paketom" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "neveljavno" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Stopnja podpore ni določena" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Izdelovalec ne ponuja podpore." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Ugotavljanje težave, kar pomeni tehnično podporo za ponujanje informacij o " "združljivosti, pomoč pri nameščanju, pomoč pri uporabi, tekoče vzdrževanje " "in osnovno odpravljanje težav. Prva stopnja podpore ni namenjena " "odpravljanju napak izdelka." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Osamitev težave, kar pomeni tehnično podporo za podvajanje težav uporabnika, " "osamitev področja težave in ponujanje rešitev za težave, ki jih ne razreši " "podpora prve stopnje." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Rešitev težave, kar pomeni tehnično pomoč za odpravljanje kompleksnih težav " "z vključitvijo inženirjev in odpravo napak izdelka, ki so bile ugotovljene s " "strani podpore druge stopnje." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Za pridobitev podpore je potrebna dodatna uporabniška pogodba." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Paket je bil opuščen in je bil nadomeščen z novim paketom z drugim imenom." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Neznana možnost podpore. Opis ni na voljo." #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Sistemsko upravljanje je zaklenil program s PID %d (%s).\n" "Pred ponovnim poskusom zaprite ta program." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Neznan način ujemanja »%s«" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Neznan način ujemanja »%s« za vzorec »%s«" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Neveljaven regularni izraz »%s«: regcomp je vrnil %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Neveljaven regularni izraz »%s«" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Za »%s« je potrebna overitev" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Poskusilo se bo znova …" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Opuščeno po %1% poskusih." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Obiščite SUSE Customer Center in preverite ali je registracija še veljavna " "in še ni potekla." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Obiščite Novell Customer Center in preverite ali je registracija še veljavna " "in še ni potekla." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Ustvarjanje priklopne točke: ni moč najti zapisljive mape za ustvarjanje " "priklopne točke" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Najprej namestite paket »lsof«." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Ni moč ustvariti mape predpomnilnika metapodatkov." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Napaka pri poskušanju branja iz »%s«" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Ni moč ustvariti %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Pridobivanje metapodatkov za vir ni uspelo." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "Dodajanje vira v predpomnilnik ni uspelo (ni moč zagnati repo2solv)." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Predpomnjenje vira ni uspelo (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Grajenje predpomnilnika vira »%s«" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Predpomnilnika v %s ni moč ustvariti – ni dovoljenja za pisanje." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Dodajanje vira %1% v predpomnilnik ni uspelo" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Neobravnavana vrsta vira" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Dodajanje vira »%s«" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Neveljavno ime datoteke vira na »%s«" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Datoteke »%s« ni moč odpreti za pisanje." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Neznana napaka pri branju iz »%s«" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Ni moč brati mape vira »%1%«: dovoljenje zavrnjeno" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Branje mape »%s« ni uspelo" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Ni moč brati datoteke vira »%1%«: dovoljenje zavrnjeno" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Čiščenje metapodatkov" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Čiščenje paketov" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Čiščenje map predpomnilnika" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Čiščenje mape: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Čiščenje predpomnilnika" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Nalaganje iz predpomnilnika" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Odstranjevanje vira »%s«" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Ni moč ugotoviti, kje je vir shranjen." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Ni moč izbrisati »%s«" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Spreminjanje vira" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Osveževanje vira: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Ni moč ugotoviti, kje je storitev shranjena." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Neznana storitev »%1%«: odstranjevanje zapuščenega vira storitve »%2%«" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Drugo ime vira se ne more začeti s piko." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Drugo ime storitve se ne more začeti s piko." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Ni izvlečka za datoteko %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Neznan izvleček %s za datoteko %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Potrjevanje z izvlečkom za datoteko »%s« ni uspelo" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Datoteka »%s« ni podpisana. Ali želite nadaljevati?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Datoteka »%s« iz vira »%s« ni podpisana. Ali želite nadaljevati?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Ali želite zavrniti ključ, mu zaupati začasno, ali zaupati vedno?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Ime ključa: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "Prejet %1% nov ključ za podpisovanje paketov iz vira »%2%«:" msgstr[1] "Prejetih %1% novih ključev za podpisovanje paketov iz vira »%2%«:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Potrjevanje s podpisom za datoteko »%1%« ni uspelo." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "Potrjevanje s podpisom za datoteko »%1%« iz vira »%2%« ni uspelo." #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Ali želite nadaljevati?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Datoteka »%s« je podpisana z neznanim ključem »%s«. Ali želite nadaljevati?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Datoteka »%s« iz vira »%s« je podpisana z neznanim ključem »%s«. Ali želite " "nadaljevati?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Vir %1% ne določa dodatnih mest »gpgkey=«." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Iskanje ključa GPG z določilnikom %1% v viru %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Iskanje ključa GPG z določilnikom %1% v predpomnilniku %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Zahtevana lastnost »%s« manjka." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Zahtevana je vsaj ena od lastnosti »%s« ali »%s«." # %s is either BOOTP or DHCP #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Preverjanje s podpisom ni uspelo" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Videti je, da se je paket %s med prejemanjem pokvaril. Ali želite znova " "poskusiti s prejemanjem?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Paketa %s ni bilo moč ponuditi. Ali želite znova poskusiti s prejemanjem?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Preverjanje applydeltarpm ni uspelo." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm ni uspel." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Ni dovoljenja za zapis predpomnilnika vira." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Vstavek storitve ne podpira spreminjanja lastnosti." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Ni moč ponuditi datoteke »%s« iz vira »%s«" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "V viru ni nobenega mesta." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Pričakovan nosilec %1%/%2%, določen z datoteko »%3%« z vsebino:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Datoteka %1%\n" " iz paketa\n" " %2%\n" " je v sporu z datoteko iz paketa\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Datoteka %1%\n" " Iz paketa\n" " %2%\n" " je v sporu z datoteko nameščeno iz\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Datoteka %1%\n" " nameščena iz\n" " %2%\n" " je v sporu z datoteko iz paketa\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Datoteka %1%\n" " nameščena iz\n" " %2%\n" " je v sporu z datoteko nameščeno iz\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Datoteka %1%\n" " iz paketa\n" " %2%\n" " je v sporu z datoteko\n" " %3%\n" " iz paketa\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Datoteka %1%\n" " iz paketa\n" " %2%\n" " je v sporu z datoteko\n" " %3%\n" " nameščeno iz\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Datoteka %1%\n" " nameščena iz\n" " %2%\n" " je v sporu z datoteko\n" " %3%\n" " iz paketa\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Datoteka %1%\n" " nameščena iz\n" " %2%\n" " je v sporu z datoteko\n" " %3%\n" " nameščeno iz\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Ni moč ustvariti sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "pokvari %s s prezrtjem nekaterih njegovih odvisnosti" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "splošno prezrtje nekaterih odvisnosti" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "nameščeni %1% ne spada v vir za nadgradnjo distribucije in mora biti " "nadomeščen" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "%1%, ki bo nameščen, ne spada v vir za nadgradnjo distribucije" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "nameščeni %1% ima starejšo arhitekturo" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "%1%, ki bo nameščen, ima starejšo arhitekturo" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "težava z nameščenim %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "zahteve v sporu" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "neka težava z odvisnostjo" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "nič ne ponuja zahtevanega »%1%«" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Ali ste omogočili vse zahtevane vire?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "zahtevani paket %1% ne obstaja" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "nepodprta zahteva" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "»%1%« ponuja sistema in ga ni mogoče izbrisati" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% ni mogoče namestiti" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "nič ne ponuja »%1%«, ki ga potrebuje nameščeni %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "nič ne ponuja »%1%«, ki ga potrebuje %2%, ki bo nameščen" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "ni mogoče namestiti oba %1% in %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "nameščeni %1% je v sporu z »%2%«, ki ga ponuja nameščeni %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "nameščeni %1% je v sporu z »%2%«, ki ga ponuja %3%, ki bo nameščen" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "%1%, ki bo nameščen, je v sporu z »%2%«, ki ga ponuja nameščeni %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "%1%, ki bo nameščen, je v sporu z »%2%«, ki ga ponuja %3%, ki bo nameščen" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "nameščeni %1% nadomešča »%2%«, ki ga ponuja nameščeni %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "nameščeni %1% nadomešča »%2%«, ki ga ponuja %3%, ki bo nameščen" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "%1%, ki bo nameščen, nadomešča »%2%«, ki ga ponuja nameščeni %3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "%1%, ki bo nameščen, nadomešča »%2%«, ki ga ponuja %3%, ki bo nameščen" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "nameščeni %1% je v sporu z »%2%«, ki ga ponuja sam" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "%1%, ki bo nameščen, je v sporu z »%2%«, ki ga ponuja sam" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "nameščeni %1% zahteva »%2%«, vendar te zahteve ni mogoče ponuditi" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "%1%, ki bo nameščen, zahteva »%2%«, vendar te zahteve ni mogoče ponuditi" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "izbrisani ponudniki: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "ponudniki, ki jih ni mogoče namestiti: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "ponudniki, ki jih ni mogoče namestiti: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% še ni povsem integriran v %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Običajno je želeno obdržati PTF in ne namestiti vzdrževalnih popravkov." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Odstranitev nameščenega %1% v tem kontekstu bo odstranila (ne nadomestila!) " "tudi vsebovane pakete PTF." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF bi morali odstraniti z ukazom »%1%«. To bo posodobilo vsebovane pakete " "PTF, namesto da bi jih odstranilo." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Običajno je želeno obdržati PTF ali preklicati dejanje." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Nameščeni %1% blokira želeno dejanje." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Običajno je želeno obdržati PTF in preklicati dejanje." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "odstrani zaklep za dovoljenje odstranitve %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "ne namesti %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "obdrži %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "odstrani zaklep za dovoljenje namestitve %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Ta zahteva bo pokvarila sistem!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "prezri opozorilo o pokvaritvi sistema" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "ne vprašaj za namestitev rešitve, ki ponuja %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "ne vprašaj za izbris vseh rešitev, ki ponujajo %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "ne namesti najnovejše različice %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "obdrži %1% kljub starejši arhitekturi" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "namesti %1% kljub starejši arhitekturi" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "obdrži opuščeni %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "namesti %1% iz izločenega vira" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "namesti %1%, čeprav je bil opuščen" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "omogoči nameščanje PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "namesti %1%, čeprav je bil dodan na seznam prepovedanih" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "vrni %1% na starejšo različico %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "spremeni arhitekturo %1% na %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "namesti %1% (s spremembo izdelovalca)\n" " %2% → %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "namesti %1% izdelovalca %2%,\n" " ki nadomesti %3% izdelovalca %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "nadomestitev %1% z %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "odstranitev %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Zaganjanje skriptov po transakciji" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Zaganjanje skripta %1%" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "Izhod skripta %1%:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Namestitev je bila prekinjena, kot naročeno." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " izvedeno" # %s is either BOOTP or DHCP #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " izvedba ni uspela" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s že izveden kot %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " izvedba preskočena med prekinitvijo" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Napaka pošiljanja obvestila s sporočilom posodobitve." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Sporočilo nove posodobitve" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Prejet signal: »%1% (%2%)«. Zaradi zagotovitve skladnosti sistema ni mogoče " "preklicati tekoče transakcije RPM." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Izvajanje transakcije ni uspelo zaradi naslednjih težav:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM ni uspel: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Uvažanje javnega ključa %1% ni uspelo" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Odstranjevanje javnega ključa %1% ni uspelo" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Glava paketa ni podpisana!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Vsebina paketa ni podpisana!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Spremenjene nastavitvene datoteke za %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "RPM je %s shranil kot %s, vendar ni bilo moč ugotoviti razlik" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "RPM je %s shranil kot %s.\n" "Tu je prvih 25 vrstic razlike:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "RPM je %s ustvaril kot %s, vendar ni bilo moč ugotoviti razlik" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "RPM je %s ustvaril kot %s:\n" "Tu je prvih 25 vrstic razlik:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Dodatni izhod RPM" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "ustvaril varnostno kopijo %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Podpis je v redu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Neznana vrsta podpisa" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Podpis ni potrjen" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Podpis je v redu, vendar ključu ni zaupano" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Javni ključ podpisa ni na voljo" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Datoteka ne obstaja ali pa podpisa ni moč potrditi" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Datoteka ni podpisana" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "ne poteče" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "potekel: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "poteče: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(ne poteče)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(POTEKEL)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(poteče v naslednjih 24 urah)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(poteče čez %d dan)" msgstr[1] "(poteče čez %d dni)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Poskusilo se je uvoziti neobstoječ ključ %s v zbirko ključev %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Uvažanje ključa je spodletelo." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Brisanje ključa je spodletelo." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Podpisna datoteka %s ni bila najdena" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Dvomljiva vrsta »%s« za %u bajtov nadzorne vsote »%s«" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Ni moč odpreti psevdo-terminala (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Ni moč odpreti cevi (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Neveljaven poizvedovalni niz mesta LDAP" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Neveljavne poizvedovalni parameter »%s« mesta LDAP" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Ni moč podvojiti objekta Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Neveljavna referenca na prazen objekt Url" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Ni moč razčleniti delov Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Zgodovina:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Shema Url ne dovoljuje %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Neveljavna %s komponenta »%s«" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Neveljavna %s komponenta" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Razčlenjevanje poizvedovalnega niza za ta URL ni podprto" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Shema Url je zahtevana komponenta" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Neveljavna shema Url »%s«" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Shema Url ne dovoljuje uporabniškega imena" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Shema Url ne dovoljuje gesla" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Shema Url zahteva komponento gostitelja" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Shema Url ne dovoljuje komponente gostitelja" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Neveljavna komponenta gostitelja »%s«" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Shema Url ne dovoljuje vrat" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Neveljavna komponenta vrat »%s«" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Shema Url zahteva me poti" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Če obstaja avtoriteta, relativna pot ni dovoljena" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Zakodiran niz vsebuje bajt NUL" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Neveljaven znak za razdelitev niza parametrov" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Neveljaven znak za razdelitev preslikave parametrov" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Neveljaven znak za združitev niza parametrov" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Ukaz je končal s stanjem %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Ukaz je bil ubit s signalom %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Ukaz je končal z neznano napako." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Dani neveljavni argumenti ustvaritve." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Ni moč ustvariti nadzorne cevi." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Ni moč izvesti chroot v »%s« (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Ni moč izvesti chdir v »%s« (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Ni moč izvesti chdir v »%s« znotraj chroot »%s« (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Ni moč izvesti »%s« (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Ni moč razvejiti (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Ni moč izvesti »%s«. Ukaz chdir ni uspel (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Ni moč izvesti »%s«. Ukaz chroot ni uspel (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Ni moč izvesti »%s«. Ukaz exec ni uspel (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Ni moč izvesti »%s«. Nepričakovana napaka." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Priklapljanje %s v %s ni uspelo" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Odklapljanje %s ni uspelo" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Slabo ime datoteke: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Nosilec med poskusom izvajanja dejanja »%s« ni bil odprt." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Datoteke »%s« na nosilcu »%s« ni bilo moč najti" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Datoteke »%s« ni moč zapisati." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Nosilec ni priklopljen" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Slaba priklopna točka nosilca" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Pripravljanje prejemanja (curl) ni uspelo za »%s«" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Sistemska izjema »%s« na nosilcu »%s«." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Pot »%s« na nosilcu »%s« ni datoteka." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Pot »%s« na nosilcu »%s« ni mapa." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Napačno oblikovan URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Prazno ime gostitelja v URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Prazen datotečen sistem v URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Prazen cilj v URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Nepodprta shema URI v »%s«." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Nosilec ne podpira dejanja" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Napaka prejemanja (curl) za »%s«\n" "Koda napake: %s\n" "Sporočilo napake: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Prišlo je do napake med nastavljanjem možnosti prejemanja (curl) za »%s«:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Vir nosilca »%s« ne vsebuje želenega nosilca" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Nosilec »%s« uporablja drug primerek" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Ni moč izvreči nobenega nosilca" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Ni moč izvreči nosilca »%s«" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Dovoljenje za dostop do »%s« je bilo zavrnjeno." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Med dostopanjem do »%s« je potekel čas." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" "Prejeti podatki so večji od pričakovane velikosti datoteke »%s« za »%s«." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Mesto »%s« trenutno ni dostopno." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " Težava s potrdilom SSL. Preverite, ali je potrdilo CA za »%s« v redu." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Za priklop nosilca ni na voljo nobenega prostega vira." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Nepodprt način overjanja HTTP »%s«" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Napaka prejemanja (curl) za »%s«:\n" "Koda napake: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Napaka prejemanja (curl) za »%s«:\n" "Ni moč dobiti odziva HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Da" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ne" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Opomba:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Opozorilo:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Napaka:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "zaključeno" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "pozor" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "napaka" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Opozorilo: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Prejemanje:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "zaganjanje" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "ni najdeno" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Pomoč za ta poziv ni na voljo." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "pomoč za to možnost ni na voljo" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "prikaže vse možnosti" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "da" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ne" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Na navedenem mestu niso bili najdeni veljavni metapodatki" #~ msgstr[1] "Na navedenih mestih niso bili najdeni veljavni metapodatki" #, fuzzy #~ msgid "Package is not signed!" #~ msgstr "Paketi za obnovitev" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "Zagonska arhitektura" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Paketi za obnovitev" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "Ta paket ni nameščen in ne bo nameščen." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "Namestitev ni uspela." #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Nameščam na:" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "do not install %s" #~ msgstr "Nameščam na:" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "Nameščam na:" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "Zbriši %1" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Namestitev" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "Hal Exception" #~ msgstr "Šifriranje" #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "ni povezave" #, fuzzy #~ msgid "HalDrive not initialized" #~ msgstr "Ponovno pripravi" #, fuzzy #~ msgid "HalVolume not initialized" #~ msgstr "Ponovno pripravi" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "povazava kanal-kanal" #, fuzzy #~ msgid "Not a CDROM drive" #~ msgstr "Ni CD-ROM enot." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "Nameščam na:" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Napaka pri nalaganju modula \"%s\"." #~ msgid "Serbia and Montenegro" #~ msgstr "Srbija in Črna gora" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Neznan monitor:" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "Nezadoščene odvisnosti:" #, fuzzy #~ msgid "%s remove failed" #~ msgstr "rpm neuspešen." #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "Nepravilno ime naprave." #, fuzzy #~ msgid "rpm output:" #~ msgstr "" #~ "\n" #~ "Izhod ukaza:" #, fuzzy #~ msgid "%s install failed" #~ msgstr "Namestitev ni uspela." #, fuzzy #~ msgid "%s installed ok" #~ msgstr "Nameščena verzija" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "Ignore that %s is already set to install" #~ msgstr "Imenik %1 je že na seznamu." #, fuzzy #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "Ignore this conflict of %s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "Ignore this requirement just here" #~ msgstr "ima nerešene zahteve..." #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Namesti manjkajoče pakete" #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "Namesti manjkajoče pakete" #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "install %s" #~ msgstr "Namesti %1" #, fuzzy #~ msgid "unlock %s" #~ msgstr "Ure" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "Napaka pri branju odseka %u." #, fuzzy #~ msgid "Software management is already running." #~ msgstr "Storitev za PCMCIA kartice že deluje." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "Potrebno je namestiti %s " #, fuzzy #~ msgid "%s conflicts with other resolvables" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "Ta paket ni nameščen in ne bo nameščen." #, fuzzy #~ msgid "%s has missing dependencies" #~ msgstr "Nezadoščene odvisnosti:" #, fuzzy #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "Nezadoščene odvisnosti:" #, fuzzy #~ msgid "No need to install %s" #~ msgstr "potrebno je ponovno namestiti" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "Nezadoščene odvisnosti:" #, fuzzy #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%1 je v sporu s/z %2" #, fuzzy #~ msgid ", Action: " #~ msgstr "Akcija" #~ msgid "patch" #~ msgstr "popravek" #, fuzzy #~ msgid "Establishing %s" #~ msgstr "Nameščam na:" #, fuzzy #~ msgid "Installing %s" #~ msgstr "Nameščam na:" #, fuzzy #~ msgid "Skipping %s: already installed" #~ msgstr "Preverjam že nameščene optične bralnike" #, fuzzy #~ msgid " Error!" #~ msgstr "Napaka" #, fuzzy #~ msgid " Important!" #~ msgstr "Uvozi podatke" #, fuzzy #~ msgid "Ignore this requirement generally" #~ msgstr "ima nerešene zahteve..." #, fuzzy #~ msgid "Reading selection from %s" #~ msgstr "Napaka pri branju odseka %u." #, fuzzy #~ msgid "Reading patch %s" #~ msgstr "Skrivanje popravkov" #, fuzzy #~ msgid "Reading translation: %s" #~ msgstr "Nalaganje nameščenega sistema" #, fuzzy #~ msgid "Downloading %s" #~ msgstr "Napaka pri nalaganju %1" #~ msgid "Ok" #~ msgstr "OK" #, fuzzy #~ msgid "The package file has incorrect MD5 sum" #~ msgstr "Paketi za odstranitev" #, fuzzy #~ msgid "The package has no MD5 sum" #~ msgstr "Paketi za odstranitev" #, fuzzy #~ msgid "The package archive has incorrect MD5 sum" #~ msgstr "Paketi za odstranitev" #~ msgid "Default" #~ msgstr "Privzeto" #, fuzzy #~ msgid "to be installed (soft)" #~ msgstr "bo nameščen kot:" #, fuzzy #~ msgid "to be uninstalled" #~ msgstr "potrebno je ponovno namestiti" libzypp-17.36.5/po/sr.po000066400000000000000000003505541476576476200150340ustar00rootroot00000000000000# 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: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2004-03-31 11:34+0200\n" "Last-Translator: Bojan Jovanovic \n" "Language-Team: Serbian \n" "Language: sr\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" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" # TextEntry label for phone network Areacode (german Vorwahl) #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 #, fuzzy msgid "No Code" msgstr "Poz&ivni broj" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Андора" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Ujedinjeni arapski emirati" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Авганистан" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Антигва и Барбуда" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Ангила" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanija" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Јерменија" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Холандски Антили" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Ангола" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Антарктик" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Америчка Самоа" # Contry name #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austrija" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australija" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Аруба" #. :ABW:533: #: zypp/CountryCode.cc:173 #, fuzzy msgid "Aland Islands" msgstr "Оландска острва" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Азербејџан" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Босна и Херцеговина" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Amerika/Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Бангладеш" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgija" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Буркина Фасо" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bugarska" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Azija/Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Бурунди" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Бенин" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Султанат Брунеи" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivija" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Бразил" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Бахами" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Бутан" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Буве острво" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Bocvana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belorusija" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Белизе" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Кокос (Килинг) острва" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Конго" #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "Централна Афричка Република" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Švajcarska" #. :CHE:756: #: zypp/CountryCode.cc:200 #, fuzzy msgid "Cote D'Ivoire" msgstr "Обала Слоноваче" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Кукова острва" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Čile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Камерун" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Narodi Republike Kine" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolumbija" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kostarika" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Куба" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Зеленортска острва" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Божићно острво" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Кипар" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Češka Republika" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Nemačka" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Afrika/Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danska" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Amerika/Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikanska Republika" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Alžir" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonija" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egipt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Западна Сахара" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Еритреја" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Španija" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Етиопија" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finska" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidži" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Фокландска острва (Малвини)" # official_name for FSM #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Федералне Државе Микронезија" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Farska ostrva" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Francuska" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Габон" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Velika Britanija" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Amerika/Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Jordan" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Француска Гвајана" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Nemačka" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Гана" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Evropa/Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Гамбија" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Гвинеа" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Amerika/Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Екваторијална Гвинеја" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grčka" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Јужна Џорџија и Јужна Сендвич острва" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Gvatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Гвинеа-Бисао" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Гвајана" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Херд острво и Мекдоналд острва" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Hrvatska" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Хаити" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Mađarska" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonezija" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irska" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Izrael" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indija" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Британска Индијска Океанска Територија" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 #, fuzzy msgid "Iran" msgstr "Irak" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italija" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Globalno/Jamajka" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Кенија" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Киргизстан" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Камбоџа" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Кирибати" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Комори" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Свети Китс и Невис" #. :KNA:659: #: zypp/CountryCode.cc:277 #, fuzzy msgid "North Korea" msgstr "Evropa/Severna-Irska" #. :PRK:408: #: zypp/CountryCode.cc:278 #, fuzzy msgid "South Korea" msgstr "Južni Pol" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuvajt" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Кајманска острва" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Казахстан" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Лаошка Народна Демократска Република" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Liban" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Света Луција" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Evropa/Linhenštajn" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Шри Ланка" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Либерија" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Лесото" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litvanija" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Evropa/Luksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Jermenija" #. :LVA:428: #: zypp/CountryCode.cc:292 #, fuzzy msgid "Libya" msgstr "Либерија" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Maroko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Evropa/Monako" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Evropa/Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "монго" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "Сан Марино" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Мадагаскар" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Маршалска острва" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonija" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Мали" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Мјанмар" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Монголија" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Azija/Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Северна Маријанска острва" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Amerika/Marinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Мауританија" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Монтсерат" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Маурицијус" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Малдиви" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Малави" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malazija" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Мозамбик" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Намибија" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Нова Каледонија" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Нигер" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Норфолк острво" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Нигерија" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragva" # Contry name #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Europa/Holandija" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norveška" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Непал" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Ниуе" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Novi Zeland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Француска Полинезија" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Папуа Нова Гвинеја" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipini" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" # Contry name #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poljska" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Свети Пјер и Микелон" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pacifik/Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Porto Riko" # official_name for PSE #. :PRI:630: #: zypp/CountryCode.cc:339 #, fuzzy msgid "Palestinian Territory" msgstr "Окупирана Палестинска Територија" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugalija" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paragvaj" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Реунион" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumunija" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "српски" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Руска Федерација" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Руанда" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudijska Arabija" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Соломонска острва" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Сејшели" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Švedska" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Света Хелена" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenija" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Свалбард и Јан Мајен" # Contry name #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovačka" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Сијера Леоне" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "Сан Марино" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Сенегал" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Сомалија" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Суринам" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Сао Томе и Принсипе" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 #, fuzzy msgid "Syria" msgstr "сиријски" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Свазиланд" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Туркс и Каикос острва" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Чад" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Француске Јужне Територије" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Того" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tajland" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadžikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "токелау" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Туркменистан" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunis" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Тонга" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turska" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Тринидад и Тобаго" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "тувалу" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Тајван" #. :TWN:158: #: zypp/CountryCode.cc:383 #, fuzzy msgid "Tanzania" msgstr "Australija/Tasmania" # "TW" : _("Taiwan R.O.C."), #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrajina" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Уганда" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Мала Спољашња Острва Сједињених Држава" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Сједињене Државе" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Urugvaj" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Света Столица (Ватикан град-држава)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Свети Винсент и Гренадинци" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venecuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Британска Девичанска Острва" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Девичанска острва, Америчка" #. :VIR:850: #: zypp/CountryCode.cc:395 #, fuzzy msgid "Vietnam" msgstr "вијетнамски" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Вануату" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Волис и Футуна" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "SAD/Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Мајоте" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Južna Afrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Замбија" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zibabve" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" # tree node string #: zypp/Dep.cc:98 msgid "Requires" msgstr "Zahteva" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "Obriši %1" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "афар" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "абкаски" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "акинески" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "аколи" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "адангме" #. language code: ady #: zypp/LanguageCode.cc:171 #, fuzzy msgid "Adyghe" msgstr "адангме" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "афроазијски (остали)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "африхили" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "африканс" # entry of bootloader menu - only a-z, A-Z, 0-9, _ and blank space # are allowed, otherwise translartion won't be used # try to keep short, may be shortened due to bootloader limitations # entry of bootloader menu - only a-z, A-Z, 0-9, _ and blank space # are allowed, otherwise translartion won't be used # try to keep short, may be shortened due to bootloader limitations #. language code: ain #: zypp/LanguageCode.cc:179 #, fuzzy msgid "Ainu" msgstr "Linux:" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "акан" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "акадски" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "албански" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "алеут" #. language code: alg #: zypp/LanguageCode.cc:191 #, fuzzy msgid "Algonquian Languages" msgstr "алгонквијски језици" #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "јужни сами" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "амхарски" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "енглески, стари (око 450–1100)" #. language code: apa #: zypp/LanguageCode.cc:199 #, fuzzy msgid "Apache Languages" msgstr "језици Апача" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "арапски" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "арамајски" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "арагонски" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "јерменски" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "араукански" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "арапахо" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "вештачки (остали)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "аравак" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "асамешки" # Contry name #. language code: ast #: zypp/LanguageCode.cc:221 #, fuzzy msgid "Asturian" msgstr "Austrija" #. language code: ath #: zypp/LanguageCode.cc:223 #, fuzzy msgid "Athapascan Languages" msgstr "атапаскански језик" #. language code: aus #: zypp/LanguageCode.cc:225 #, fuzzy msgid "Australian Languages" msgstr "аустралијски језици" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "аварски" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "авестан" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "авади" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "ајмар" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "азербејџански" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "банда" #. language code: bai #: zypp/LanguageCode.cc:239 #, fuzzy msgid "Bamileke Languages" msgstr "бамилеке језици" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "башкир" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "балучи" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "бамбара" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "балинезе" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "баскијски" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "баса" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "балтички (остали)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "беџа" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "белоруски" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "бемба" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "бенгалски" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "бербер (остали)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "бојупи" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "бихари" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "бикол" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "бини" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "бислама" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "сиксика" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "банту (остали)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "бошњачки" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "браџ" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "бретањски" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "батак (Индонезија)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "буријат" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "бугинезе" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "бугарски" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "бурмиски" #. language code: byn #: zypp/LanguageCode.cc:299 #, fuzzy msgid "Blin" msgstr "бини" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "кадо" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "централноамерички индијански (остали)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "карипски" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "каталонски" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "кавкаски (остали)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "цебуано" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "келтски (остали)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "чаморо" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "чибча" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "чеченски" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "чагатај" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kineski" #. language code: chk #: zypp/LanguageCode.cc:327 #, fuzzy msgid "Chuukese" msgstr "чукезе" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "мари" #. language code: chn #: zypp/LanguageCode.cc:331 #, fuzzy msgid "Chinook Jargon" msgstr "чиноок жаргон" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "чоктав" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "чипевјан" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "чироки" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "црквенословенски" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "чуваш" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "чејенски" #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "чамски језици" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "коптски" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "корнвалски" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "корзикански" #. language code: cpe #: zypp/LanguageCode.cc:353 #, fuzzy msgid "Creoles and Pidgins, English-Based (Other)" msgstr "креолски и пиџински (остали)" #. language code: cpf #: zypp/LanguageCode.cc:355 #, fuzzy msgid "Creoles and Pidgins, French-Based (Other)" msgstr "креолски и пиџински (остали)" #. language code: cpp #: zypp/LanguageCode.cc:357 #, fuzzy msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "креолски и пиџински (остали)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "кри" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 #, fuzzy msgid "Creoles and Pidgins (Other)" msgstr "креолски и пиџински (остали)" #. language code: csb #: zypp/LanguageCode.cc:365 #, fuzzy msgid "Kashubian" msgstr "кабардијански" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "кушитски (остали)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Češka" #. language code: dak #: zypp/LanguageCode.cc:373 #, fuzzy msgid "Dakota" msgstr "дакота\t" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danska" #. language code: dar #: zypp/LanguageCode.cc:377 #, fuzzy msgid "Dargwa" msgstr "Darwin" #. language code: day #: zypp/LanguageCode.cc:379 #, fuzzy msgid "Dayak" msgstr "сасак" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "делавер" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "славски (атапаскански)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "догриб" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "динка" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "дивехи" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "догри" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "дравижански (остали)" #. language code: dsb #: zypp/LanguageCode.cc:395 #, fuzzy msgid "Lower Sorbian" msgstr "Čuvanje Energije" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "дуала" #. language code: dum #: zypp/LanguageCode.cc:399 #, fuzzy msgid "Dutch, Middle (ca.1050-1350)" msgstr "холандски, средњевековни (око 1050—1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Holandija" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "ђула" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "дзонгка" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "ефик" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "египатски (стари)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "екаџук" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "еламит" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "енглески" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "енглески, средњевековни (1100—1500.)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "есперанто" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonski" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "еве" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "евондо" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "фанг" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "фарски" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "фанти" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "фиџијан" #. language code: fil #: zypp/LanguageCode.cc:437 #, fuzzy msgid "Filipino" msgstr "Filipini" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finska" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "фино-угарски (остали)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "фон" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francuska" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "француски, средњевековни (око 1400—1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "француски, стари (842—око 1400.)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "фрижански" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "фула" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "фриулијански" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "га" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "гајо" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "гбаја" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "германски (остали)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "грузијски" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Nemačka" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "гиз" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "жибертески" #. language code: gla gd #: zypp/LanguageCode.cc:479 #, fuzzy msgid "Gaelic" msgstr "Мали" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "ирски" #. language code: glg gl #: zypp/LanguageCode.cc:483 #, fuzzy msgid "Galician" msgstr "гвичин" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "са острва Мана" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "немачки, средњевековни горњи (око 1050—1500.)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "немачки, стари горњи (око 750—1050.)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "гонди" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "горонтало" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "готски" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "гребо" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "грчки, стари (до 1453.)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "грчки, савремени (1453.—)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "гуарани" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "гујарати" #. language code: gwi #: zypp/LanguageCode.cc:509 #, fuzzy msgid "Gwich'in" msgstr "гвичин" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "хаида" #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "Хаити" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "хауса" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "хавајски" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "хебрејски" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "хереро" # bug: highlight? #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "хилигајнон" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "химахали" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "хинду" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "хетски" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "хмонг" #. language code: hmo ho #: zypp/LanguageCode.cc:533 #, fuzzy msgid "Hiri Motu" msgstr "хири" #. language code: hsb #: zypp/LanguageCode.cc:535 #, fuzzy msgid "Upper Sorbian" msgstr "српски" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Mađarska" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "хупа" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "ибан" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "игбо" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "исландски" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "идо" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "сихуан ји" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "иџо" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "инуктитут" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "интерлингве" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "илоко" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "индијски (остали)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "индонежански" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "индоевропски (остали)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "ингуш" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "инупијак" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "ирански (остали)" #. language code: iro #: zypp/LanguageCode.cc:575 #, fuzzy msgid "Iroquoian Languages" msgstr "ироквојански језици" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italija" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "јавански" #. language code: jbo #: zypp/LanguageCode.cc:581 #, fuzzy msgid "Lojban" msgstr "Liban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japan" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "јудо-персијски" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "јудо-арапски" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "кара-калпак" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "кабил" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "качин" #. language code: kal kl #: zypp/LanguageCode.cc:595 #, fuzzy msgid "Kalaallisut" msgstr "гренландски (калалисут)" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "камба" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "канада" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "карен" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "кашмирски" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "канури" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "кави" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "казахстански" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "кабардијански" #. language code: kha #: zypp/LanguageCode.cc:613 #, fuzzy msgid "Khasi" msgstr "кази" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "косијански (остали)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "кмерски" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "котанезе" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "кикују" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "кинјарванда" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "киргишки" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "кимбунду" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "конкани" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "коми" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "конго" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreanski" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "косраенски" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "кпеле" #. language code: krc #: zypp/LanguageCode.cc:641 #, fuzzy msgid "Karachay-Balkar" msgstr "кара-калпак" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "кру" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "курук" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "куанјама" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "кумик" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "курдски" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "кутенај" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ладино" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "ланда" # #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "ламбда" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "лао" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "латински" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "летонски" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "лежгијански" #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "лимбуржански" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "лингала" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "литвански" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "монго" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "лози" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "луксембуршки" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "луба-лулуа" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "луба-катанга" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "ганда" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Луијсено" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Лунда" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "луо (Кенија и Танзанија)" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "лушаји" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "македонски" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "мадурезе" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "магахи" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "маршалски" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "маитхили" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "макасар" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "малајамски" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "мандинго" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "маори" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "аустронежански (остали)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "марати" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "масаи" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "малајски" #. language code: mdf #: zypp/LanguageCode.cc:727 #, fuzzy msgid "Moksha" msgstr "мохавк" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "мандарски" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "менде" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "ирски, средњевековни (900-1200.)" #. language code: mic #: zypp/LanguageCode.cc:735 #, fuzzy msgid "Mi'kmaq" msgstr "микмак" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "минангкабау" #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "разни језици" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "мон-кмер (остали)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "малагаси" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "малтешки" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "манчу" #. language code: mni #: zypp/LanguageCode.cc:749 #, fuzzy msgid "Manipuri" msgstr "канури" #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "манобо језици" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "мохавк" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "молдавски" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "монголски" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "моси" #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "вишејезички" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "мунда језици" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "крик" #. language code: mwl #: zypp/LanguageCode.cc:767 #, fuzzy msgid "Mirandese" msgstr "мадурезе" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "марвари" #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "језици маја" #. language code: myv #: zypp/LanguageCode.cc:773 #, fuzzy msgid "Erzya" msgstr "орија" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "нахуатл" #. language code: nai #: zypp/LanguageCode.cc:777 #, fuzzy msgid "North American Indian" msgstr "северноамерички индијански (остали)" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "напуљски" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Globalno/Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "ндебеле, јужни" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "ндебеле, северни" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ндонга" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "Nemačka" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "непалски" #. language code: new #: zypp/LanguageCode.cc:795 #, fuzzy msgid "Nepal Bhasa" msgstr "Непал" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "нијас" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "нигер-кордофански (остали)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "ниујеан" #. language code: nno nn #: zypp/LanguageCode.cc:803 #, fuzzy msgid "Norwegian Nynorsk" msgstr "норвешки/модерни правопис" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "норвешки/бокмал" #. language code: nog #: zypp/LanguageCode.cc:807 #, fuzzy msgid "Nogai" msgstr "ндонга" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "нордијски, стари" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norveška" #. language code: nso #: zypp/LanguageCode.cc:813 #, fuzzy msgid "Northern Sotho" msgstr "северни сами" #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "нубијски језици" #. language code: nwc #: zypp/LanguageCode.cc:817 #, fuzzy msgid "Classical Newari" msgstr "Ime klase" #. language code: nya ny #: zypp/LanguageCode.cc:819 #, fuzzy msgid "Chichewa" msgstr "чибча" #. language code: nym #: zypp/LanguageCode.cc:821 #, fuzzy msgid "Nyamwezi" msgstr "Ime" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "њанкол" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "њоро" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "нзима" # ??? #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "окситан (после 1500.)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "оџибва" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "орија" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "оромо" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "осаж" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "осетијан" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "турски, отомански (1500–1928)" # ??? #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "отомијански језици" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "папуан (остали)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "пангасинан" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "палави" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "пампања" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "панџаби" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "папијаменто" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "палауан" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "персијски, стари (око 600–400 п.н.е.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "персијски" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "филипински (остали)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "феничански" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "пали" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Poljska" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "понпејан" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugalija" #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "пракрит језици" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "провансалски, стари (до 1500.)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "пушто" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "квечуа" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "раџастани" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "рапануји" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "раротонган" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "романски (остали)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "рето-романски" # овако каже Мортон-Бенсон, или „језик Рома“ #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "цигански" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 #, fuzzy msgid "Romanian" msgstr "Rumunija" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "рунди" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rusija" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "сандаве" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "санго" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "јакут" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "јужноамерички индијански (остали)" #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "салишан језици" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "самарићански арамајски" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "санскрит" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "сасак" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "сантали" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "српски" #. language code: scn #: zypp/LanguageCode.cc:927 #, fuzzy msgid "Sicilian" msgstr "SAD/Michigan" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "шкотски" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Hrvatski" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "селкуп" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "семитски (остали)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "ирски, стари (до 900.)" #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "знаковни језици" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "шан" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "сидамо" #. language code: sin si #: zypp/LanguageCode.cc:947 #, fuzzy msgid "Sinhala" msgstr "синалезе" #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "сијуан језици" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "сино-тибетски (остали)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "словенски (остали)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovačka" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "словеначки" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "јужни сами" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "северни сами" #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "сами језици (остали)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "луле сами" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "инари сами" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "самоански" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "сколт сами" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "шона" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "синди" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "сонинке" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "согдијан" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "сомалски" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "сонгхај" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "сото, јужни" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Španija" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "сардинијски" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "серер" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "нило-сахарски (остали)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "свати" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "сукума" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "сунданежански" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "сузу" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "сумерски" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "свахили" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Švedska" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "сиријски" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "тахићански" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "тајландски (остали)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "тамил" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Татарски" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "телугу" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "тимне" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "терено" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "тетум" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "таџик" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "тагалог" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "тајландски" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "тибетски" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "тигар" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "тигрињски" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "тив" #. language code: tlh #: zypp/LanguageCode.cc:1047 #, fuzzy msgid "Klingon" msgstr "конго" #. language code: tli #: zypp/LanguageCode.cc:1049 #, fuzzy msgid "Tlingit" msgstr "тлинклит" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "тамашек" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "тонга (Нијаса)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "тонга (Тонга острва)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "ток писин" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "цимшиан" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "цвана" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "цонга" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "туркменистански" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "тумбука" #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "тупи језици" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turska" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "алтајски (остали)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "тви" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "тувинијански" #. language code: udm #: zypp/LanguageCode.cc:1081 #, fuzzy msgid "Udmurt" msgstr "урду" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "угарски" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "ујгур" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "украјински" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "умбунду" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "неодређен" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "урду" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "узбекистански" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "ваи" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "венда" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "вијетнамски" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "волапук" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "вотик" #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "вакашан језици" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "валамо" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "варај" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "вашо" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "велшки" # моравско српски? #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "сорбски језици" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "валун" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "волоф" #. language code: xal #: zypp/LanguageCode.cc:1125 #, fuzzy msgid "Kalmyk" msgstr "кумик" # не ваља #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "гзоза" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "јао" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "јапески" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "јидишки" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "јоруба" #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "јупик језици" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "запотек" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "зенага" #. language code: zha za #: zypp/LanguageCode.cc:1143 #, fuzzy msgid "Zhuang" msgstr "Бутан" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "занде" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Itd/Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "зуни" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" # translators: fallback name for a module at command line #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "nepoznato" #: zypp/VendorSupportOptions.cc:17 #, fuzzy msgid "unsupported" msgstr " - није подржано" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 #, fuzzy msgid "invalid" msgstr "URL није исправан" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Не могу да отворим '%1'." #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Не могу да отворим '%1'." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Не могу да отворим '%1'." #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" # continue button label #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 #, fuzzy msgid "Continue?" msgstr "Настави" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "ima neispunjene zahteve..." #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "ima neispunjene zahteve..." #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "Proveravam međuzavisnost..." #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 #, fuzzy msgid "unsupported request" msgstr " - није подржано" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "Automatska Instalacija" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" # progress stage #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Snimi konfiguracione fajlove" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" # TextEntry label #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "&Dodatne ipppd opcije" # Proposal for backup during update #: zypp/target/rpm/RpmDb.cc:2196 #, fuzzy, c-format, boost-format msgid "created backup %s" msgstr "Ne pravite sigurnosnu kopiju" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" # summary text heading #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "Paketi za obnavljanje" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Couldn't open file: %s." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 #, fuzzy msgid "History:" msgstr "XF86History" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Наредба која се извршава при повезивању" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Couldn't open file: %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Не могу да отворим '%1'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Не могу да отворим '%1'." #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" # summary item: an option is turned on #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "&Da" #: zypp-tui/Table.cc:32 msgid "No" msgstr "&Ne" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" # window title for kernel loading (see txt_load_kernel) #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Упозорење" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Greška" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "done" msgstr "Indonezija" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "Greška" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Упозорење" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Покрећем..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "веза није успостављена" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" # summary item: an option is turned on #: zypp-tui/output/promptoptions.cc:194 #, fuzzy msgid "yes" msgstr "&Da" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" # summary text heading #, fuzzy #~ msgid "Package is not signed!" #~ msgstr "Paketi za obnavljanje" # tree node string #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "Boot arhitektura" # summary text heading #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Paketi za obnavljanje" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "Ovaj paket nije i neće biti instaliran." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "Instalacioni proces nije uspešno završen." # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Instaliram na:" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%1 je u konfliktu sa %2" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "do not install %s" #~ msgstr "Instaliram na:" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "Instaliram na:" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "Obriši %1" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Инсталација" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "веза није успостављена" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "Instaliram na:" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." # name for SCG #~ msgid "Serbia and Montenegro" #~ msgstr "Србија и Црна Гора" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "Proveravam međuzavisnost..." #, fuzzy #~ msgid "%s remove failed" #~ msgstr "rpm greška." #, fuzzy #~ msgid "rpm output:" #~ msgstr "" #~ "\n" #~ "Komandni izlaz:" #, fuzzy #~ msgid "%s install failed" #~ msgstr "Instalacioni proces nije uspešno završen." # PushButton: Allright, really start installation # PushButton: Allright, really start installation #, fuzzy #~ msgid "%s installed ok" #~ msgstr "&Da, instaliraj" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "%1 je u konfliktu sa %2" # error popup message #, fuzzy #~ msgid "Ignore that %s is already set to install" #~ msgstr "Direktorijum %1 je već na listi." #, fuzzy #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "Ignore this conflict of %s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "Ignore this requirement just here" #~ msgstr "ima neispunjene zahteve..." # summary heder #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Instaliranje nedostajućih paketa" # summary heder #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "Instaliranje nedostajućih paketa" #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "install %s" #~ msgstr "Instaliraj %1" #, fuzzy #~ msgid "unlock %s" #~ msgstr "Satovi" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "%s conflicts with other resolvables" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "Ovaj paket nije i neće biti instaliran." #, fuzzy #~ msgid "%s has missing dependencies" #~ msgstr "Proveravam međuzavisnost..." #, fuzzy #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "Proveravam međuzavisnost..." #, fuzzy #~ msgid "No need to install %s" #~ msgstr "mora da se reinstalira" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "Proveravam međuzavisnost..." #, fuzzy #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%1 je u konfliktu sa %2" #, fuzzy #~ msgid ", Action: " #~ msgstr "Akcija" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "Establishing %s" #~ msgstr "Instaliram na:" # Frame title for installation target hard disk / partition(s) #, fuzzy #~ msgid "Installing %s" #~ msgstr "Instaliram na:" #, fuzzy #~ msgid "Skipping %s: already installed" #~ msgstr "Ovaj paket je već instaliran. Obrišite ga." #, fuzzy #~ msgid " Error!" #~ msgstr "Greška" #, fuzzy #~ msgid " Important!" #~ msgstr "Unos podataka" #, fuzzy #~ msgid "Ignore this requirement generally" #~ msgstr "ima neispunjene zahteve..." # button for message box with help text #~ msgid "Ok" #~ msgstr "U redu" # summary text heading #, fuzzy #~ msgid "The package file has incorrect MD5 sum" #~ msgstr "Paketi za obnavljanje" # summary text heading #, fuzzy #~ msgid "The package archive has incorrect MD5 sum" #~ msgstr "Paketi za obnavljanje" #~ msgid "Default" #~ msgstr "Podrazumevano" #, fuzzy #~ msgid "installed" #~ msgstr "Instaliraj" #, fuzzy #~ msgid "to be installed (soft)" #~ msgstr "mora da se reinstalira" #, fuzzy #~ msgid "to be uninstalled" #~ msgstr "mora da se reinstalira" libzypp-17.36.5/po/sv.po000066400000000000000000003751011476576476200150330ustar00rootroot00000000000000# translation of zypp.sv.po to Swedish # translation of zypp.po to # Swedish message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # # Mattias Newzella , 2001. # Gudmund Areskoug , 2001. # Mattias Newzella , 2007. # Jonas Svensson , 2016. msgid "" msgstr "" "Project-Id-Version: zypp.sv\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2025-03-02 13:56+0000\n" "Last-Translator: Luna Jernberg \n" "Language-Team: Swedish \n" "Language: sv\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: Weblate 5.10.2\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Okänt land: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Ingen kod" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Förenade Arabemiraten" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua och Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albanien" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenien" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Nederländska Antillerna" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarktis" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikanska Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Österrike" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australien" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Åland" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbajdzjan" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnien-Hercegovina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgien" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgarien" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brasilien" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvetön" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Vitryssland" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Kokosöarna" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Centralafrikanska republiken" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Schweiz" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Elfenbenskusten" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cooköarna" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Kina" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Kuba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Kap Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Julön" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cypern" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tjeckien" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Tyskland" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danmark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominikanska republiken" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algeriet" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estland" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypten" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Västsahara" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spanien" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopien" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falklandsöarna (Malvinas)" # official_name for FSM #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federala staterna Mikronesien" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Färöarna" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Frankrike" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Franska metropolitan" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Storbritannien" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgien" # GF #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Franska Guiana" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grönland" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatorialguinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grekland" # GS #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Sydgeorgien och södra Sandwichöarna" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" # HM #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heardön och McDonaldöarna" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Kroatien" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Ungern" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesien" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Isle of Man" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Indien" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Brittiskt territorium i Indiska Oceanen" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Island" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italien" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordanien" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" # KG #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirgisistan" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kambodja" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comorerna" # KN #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Sankt Kitts och Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Nordkorea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Sydkorea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Caymanöarna" # KZ #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakstan" # CD #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Demokratiska folkrepubliken Lao" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Libanon" # LC #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Sankt Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litauen" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Lettland" # LR #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libyen" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marocko" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldavien" # Libris vill ha det så. #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" # SM #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Saint Martin" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshallöarna" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonien" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongoliet" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Nordmarianerna" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauretanien" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" # MV #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldiverna" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexiko" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Moçambique" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nya Kaledonien" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolköarna" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Nederländerna" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norge" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nya Zeeland" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Franska Polynesien" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Nya Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filippinerna" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polen" # PM #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Sankt Pierre och Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" # official_name for PSE #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Ockuperade palestinska territoriet" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Réunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Rumänien" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbien" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Ryska federationen" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudiarabien" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Salomonöarna" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychellerna" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Sverige" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sankt Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenien" # SJ #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard och Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakien" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé och Príncipe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" # Libris vill ha det så. #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syrien" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks- och Caicosöarna" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tchad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Franska sydterritorierna" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadzjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisien" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Östtimor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkiet" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad och Tobago" # Libris vill ha det så. #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvaluanska" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraina" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "USA:s avlägsna mindre öar" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "USA" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" # VA #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikanstaten" # VC #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Sankt Vincent och Grenadinerna" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Brittiska Jungfruöarna" # VI #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Jungfruöarna, amerikanska." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # WF #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis och Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Jemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Sydafrika" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Tillhandahåller" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Förutsätter" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Kräver" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "I konflikt" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Gör inaktuellt" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Rekommenderar" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Föreslår" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Utökar" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Kompletterar" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Okänt språk: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abchaziska" # Libris vill ha achinese här. #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinesiska" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adygeiska" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afroasiatiska språk (övriga)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akkadiska" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanska" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutiska" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Algonkinska språk" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Sydaltaiska" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amhariska" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Fornengelska (ca 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Apachiska språk" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabiska" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Arameiska" # Libris vill ha "aragonsk spanska" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonska" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Armeniska" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araukanska" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Konstgjorda språk (övriga)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawakiska" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamesiska" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturiska" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Athapaskiska språk" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Australiska språk" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avariska" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestiska" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerbajdzjanska" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Bamilekespråk" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Basjkiriska" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinesiska" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Baskiska" # Libris har med den där parentesen #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Basa (bantuspråk)" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltiska språk (övriga)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beyja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Vitryska" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengaliska" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berberspråk (övriga)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" # Libris har med parentesen #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Edo (bini)" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" # Länge leve Libris! #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Svartfotindianernas språk (siksika)" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantuspråk (övriga)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosniska" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Bretonska" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonesien)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Burjatiska" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Buginesiska" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgariska" # Libris vill ha det så. #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmanska" # Libris har med parentesen #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Centralamerikanska indianspråk (övriga)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Karibiska" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalanska" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kaukasiska språk (övriga)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Keltiska språk (övriga)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tjetjenska" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Kinesiska" # Libris vill ha det så. #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Tjuktjiska" # Alternativt tjeremissiska enligt Libris. #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mariska" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Chinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Chopi" # Libris vill ha det så. #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Cherokesiska" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Fornkyrkoslaviska" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Tjuvasjiska" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Chamicspråk" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Koptiska" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Korniska" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Korsikanska" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreol- och pidginspråk, baserade på engelska (övriga)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreol- och pidginspråk, baserade på franska (övriga)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreol- och pidginspråk, baserade på portugisiska (övriga)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Krimtatariska" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreol- och pidginspråk (övriga)" # Osäker # Ej verifierat #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kasjubiska" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Kushitiska språk (övriga)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tjeckiska" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danska" # Libris vill ha "Darginska (Dargwa)". Jag antar att Dargwa är vanligare. #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dajakiska" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidiska språk (övriga)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Lågsorbiska" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Medelnederländska (ca 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Nederländska" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dyula" # Libris vill ha med parentesen. #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Bhutanesiska (Dzongkha)" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Fornegyptiska" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamitiska" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Engelska" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Medelengelska (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estniska" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Färöiska" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" # SAOL vill ha utan d, Libris med d. Jag kör på SAOL:s variant. #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fijianska" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filippinska" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finska" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Finsk-ugriska språk (övriga)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Franska" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Medelfranska (ca 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Fornfranska (842-ca 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frisiska" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulani" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friuliska" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Germanska språk (övriga)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Georgiska" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Tyska" # Libris vill ha det så. #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Fornetiopiska (Geez)" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Gilbertesiska" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gaeliska" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Iriska" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galiciska" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Medelhögtyska (ca 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Fornhögtyska (ca 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotiska" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grekiska, klassisk (-1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Nygrekiska (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Guaraní" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwichin" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Haida" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Haitiska" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Haussa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawaiiska" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Hebreiska" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" # Libris vill ha det så. #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Pahari (himachali)" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" # Libris vill ha det så. #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hettitiska språk" # Libris vill ha det så. #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmongspråk" # Libris vill ha det så. #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hirimotu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Högsorbiska" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Ungerska" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" # Libris vill ha det så. #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Ibo (Igbo)" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Isländsk" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (International Auxiliary Language Association)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indoariska språk (övriga)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonesiska" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indoeuropeiska språk (övriga)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingusj" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iranska språk (övriga)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Irokesiska språk" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Italienska" # Libris vill ha det så. #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Javanska" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japanska" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Judepersiska" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Judearabiska" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Karakalpakiska" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabyliska" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Grönländska (Kalaallisut)" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" # Även kanaresiska (äldre form) #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" # Libris vill ha det så. #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Fornjavanska (kawi)" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazakiska" # Libris vill ha det så. #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardinska (östtjerkessiska)" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Khoisanspråk (övriga)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Kambodjanska (khmer)" # Libris vill ha det så. #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Sakiska (khotanesiska)" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Rwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirgisiska" # Libris vill ha det så. #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Mbundu (kimbundu)" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kikongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Koreanska" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kusaie" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpelle" # Osäker # Ej verifierat #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karatjaj-balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Kruspråk" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kurukh" # Libris vill ha det så. #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Ovambo (kuanyama)" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurdiska" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenai" # Libris vill ha det så. #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Spanjolska (ladino)" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Laotiska" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latin" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Lettiska" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezginska" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limburgiska" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litauiska" # Libris vill ha det så. #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Lolo (mongo)" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Luxemburgiska" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Luganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Luo (Kenya och Tanzania)" # Libris vill ha det så. #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonska" # Libris vill ha det så. # Även madura. #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurese" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshallesiska" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" # Libris vill ha det så. # Även malinke. #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mande" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Austronesiska språk (övriga)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Massajiska" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malajiska" # Osäker # Ej verifierat #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Medeliriska (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Mic-mac" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Diverse språk" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-khmerspråk (övriga)" # Libris vill ha det så. #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malagasy" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Maltesiska" # Även mandju. #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Manobospråk" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldaviska" # Libris vill ha det så. #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongoliska språk" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Flera språk" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Mundaspråk" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Muskogee" # Libris vill ha det så. # Även madura. #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandesiska" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Mayaspråk" # http://www.geocities.com/forfader/samerna/uraliska.html #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Nordamerikanska indianspråk" # Libris vill ha det så. #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Neapolitansk italienska" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele, syd" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele, nord" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Lågtyska" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepali" # NP #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Nepalesisk bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-/Kongospråk (övriga)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Nynorska" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Nynorska (Bokmal)" # Libris vill ha det så #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogaiska" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Fornisländska" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norska" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Nordsotho" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Nubiska språk" # Osäker #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Klassisk newariska" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" # Libris vill ha det så. #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Langue d'oc (1500-)" # Libris vill ha det så. #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Odjibwa (chippewa)" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" # Libris vill ha det så. #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetiska" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Ottomanska (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Oto-manguespråk" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papuanska språk (övriga)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangasinan" # Libris vill ha det så. #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi (medelpersiska)" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" # Även panjabi. #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Punjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Fornpersiska (ca 600-400 f.Kr.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Persiska" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filippinska språk (övriga)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Feniciska" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polska" # Libris vill ha det så. #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Ponape" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portugisiska" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Prakritspråk" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Fornprovensalska (till och med 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pashto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Rarotongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Romanska språk (övriga)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Rätoromanska" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Rumänska" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Ryska" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Jakutiska" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Sydamerikanska indianspråk (övriga)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Salisiska språk" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Samaritanska" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbiska" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilianska" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Skotska" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Kroatiska" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitiska språk (övriga)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Forniriska (-900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Teckenspråk" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidami" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Singalesiska" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Siouxspråk" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sinotibetanska språk (övriga)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Slaviska språk (övriga)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakiska" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovenska" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Sydsamiska" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Nordsamiska" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Samiska språk (övriga)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Lulesamiska" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Enaresamiska" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samoanska" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Skoltsamiska" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdiska" # Libris vill ha det så. #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Sotho, syd" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Spanska" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardiska" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-sahariska språk (övriga)" # Libris vill ha det så. #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Swazi" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Sukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanesiska" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Sumeriska" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Swahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Svenska" # Libris vill ha det så. #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Syriska" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahitiska" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Thaispråk (övriga)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatariska" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telugo" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Temne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadzjikiska" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Thailändska" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetanska" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigré" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinja" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tivi" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingonska" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Tongaöarna)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" # Libris vill ha det så. #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turkmeniska" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Tumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Tupíspråk" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turkiska" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altaiska språk (övriga)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Tuvinska" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Udmurtiska" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ugaritiska" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Uiguriska" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Ukrainska" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Odefinierat språk" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Uzbekiska" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamesiska" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapük" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votiska" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Wakusjiska språk" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" # Libris vill ha det så. #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Kymriska" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Sorbiska språk" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Vallonska" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" # Libris vill ha det så. #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmuckiska" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yap" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Jiddisch" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Yupiska språk" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapotek" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Följande åtgärder kommer att vidtas:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "okänd" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "stöds inte" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Nivå 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Nivå 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Nivå 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Ytterligare kundavtal behövs" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "Utgått och ersatt av ett annat paket" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "ogiltig" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Supportnivån har inte angetts" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Leverantören tillhandahåller inte support." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Problembestämning – innebär teknisk support som ska kunna ge " "kompatibilitetsinformation, installationshjälp, användningssupport, " "underhåll och grundläggande felsökning. Support på nivå 1 är inte avsedd att " "korrigera produktfel." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Problemisolering – innebär teknisk support som ska kunna återskapa " "kundproblemen, isolera problemområdet och ge lösningar på problem som inte " "åtgärdas av supporten på nivå 1." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Problemlösning – innebär teknisk support som ska kunna lösa komplexa problem " "som har identifierats i supporten på nivå 2 med hjälp av tekniker." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Ytterligare ett kundavtal behövs för att kunna ge support." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" "Paketet har utgått och har ersatts av ett nytt paket med ett annat namn." #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Okänt supportalternativ. Beskrivning är inte tillgänglig" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Systemhanteringen är låst av programmet med pid %d (%s).\n" "Stäng detta program och försök igen." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Okänt matchningsläge '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Okänt matchningsläge '%s' för mönstret '%s'" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Ogiltigt reguljärt uttryck '%s': regcomp returnerade %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ogiltigt reguljärt uttryck '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Autentisering krävs för '%s'" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "Kommer att försöka igen..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "Ger upp efter %1% försök." #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besök SUSE kundcenter för att se om din registrering är giltig och inte har " "slutat gälla." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Besök Novells kundcenter och kontrollera att din registrering är giltig och " "fortfarande gäller." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "Skapa fästpunkt: hittar ingen skrivbar katalog för att skapa fästpunkt" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Installera paketet 'lsof' först." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Kan inte att skapa cachekatalog för metadata." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Det gick inte att läsa från '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Kan inte skapa %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "Misslyckades att hämta ny metadata för förrådet." #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" "Misslyckades att cachelagra lagringsplats ( kunde inte starta repo2solv )." #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Misslyckades att cachelagra lagringsplats (%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Cache för lagringsplatsen '%s' byggs" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Kan inte att skapa cache på %s - ingen skrivrättighet." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "Misslyckades att cachelagra lagringsplats %1%" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Kan inte hantera lagringsplatstypen" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Lägger till lagringsplats '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Ogiltigt namn på lagringsplats '%s'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Kan inte skriva till filen '%s'." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Ett okänt fel uppstod vid läsning från '%s'" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Kan inte läsa lagringsplatskatalog '%1%': Åtkomst nekad" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Det gick inte att läsa katalogen '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Kan inte läsa lagringsplatsfilen '%1%': Åtkomst nekad" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "Rensar metadata" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "Rensar paket" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "Rensar cache kataloger" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "Rensar katalog: %1%" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "Rensar cache" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "Laddar från cache" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Lagringsplatsen '%s' tas bort" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Kan inte identifiera var lagringsplatsen finns." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Kan inte radera '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "Modifierar lagringsplats" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "Uppdaterar lagringsplats: " #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Det gick inte att identifiera var tjänsten är lagrad." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Okänd tjänst '%1%': Tar bort övergiven lagringsplats '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Aliaset för en lagringsplats kan inte inledas med en punkt." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Ett alias för en tjänst kan inte inledas med en punkt." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "Ingen sammanfattning för fil %s." #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "Okänd sammanfattning %s för fil %s." #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "Sammanfattningsverifiering misslyckades för fil '%s'" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "Fil '%s' är osignerad, fortsätt?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "Fil '%s' från lagringsplats '%s' är osignerad, fortsätt?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "Vill du avvisa nyckeln, lita på tillfälligt eller alltid lita på?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "Nyckelnamn: %1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "Fick %1% ny paketsigneringsnyckel från lagringsplats \"%2%\":" msgstr[1] "Fick %1% nya paketsigneringsnycklar från lagringsplatser \"%2%\":" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "Signaturverifiering misslyckades för fil '%1%'." #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" "Signaturverifiering misslyckades för fil '%1%' från lagringsplats '%2%'." # continue button label #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Fortsätt?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "Fil '%s' har signerats med en okänd nyckel '%s'. Fortsätta?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" "Fil '%s' från lagringsplats '%s' har signerats med en okänd nyckel '%s'. " "Fortsätt?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Lagringsplatsen %1% definierar inte ytterligare 'gpgkey=' URL." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Söker efter gpg-nyckel med ID %1% i lager %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Söker efter gpg-nyckel med ID %1% i cache %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Det nödvändiga attributet '%s' saknas." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Ett av eller båda attributen '%s' och '%s' krävs." # %s is either BOOTP or DHCP #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Signaturen kunde inte verifieras" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Paketet %s verkar ha skadats under överföringen. Vill du försöka överföra " "det på nytt?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Det gick inte att tillhandahålla paketet %s. Vill du försöka hämta det på " "nytt?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm-kontrollen misslyckades." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm misslyckades." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "Ingen behörighet att skriva förrådscache." #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Insticksprogrammet för tjänsten har inte stöd för ändring av attribut." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Det går inte att hämta filen %s från lagringsplats %s" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Det finns ingen URL i lagringsplats." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "Förväntat medium %1%/%2% identifierat av filen '%3%' med innehåll:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Fil %1%\n" " från paketet\n" " %2%\n" " står i konflikt med fil från paketet\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Fil %1%\n" " från paketet\n" " %2%\n" " står i konflikt med fil från installationen av\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Fil %1%\n" " från installationen av\n" " %2%\n" " står i konflikt med fil från paketet\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Fil %1%\n" " från installationen av\n" " %2%\n" " står i konflikt med fil från installationen av\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Fil %1%\n" " från paketet\n" " %2%\n" " står i konflikt med fil\n" " %3%\n" " från paketet\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Fil %1%\n" " från paketet\n" " %2%\n" " står i konflikt med fil\n" " %3%\n" " från installationen av\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Fil %1%\n" " från installationen av\n" " %2%\n" " står i konflikt med fil\n" " %3%\n" " från paketet\n" " %4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Fil %1%\n" " från installationen av\n" " %2%\n" " står i konflikt med fil\n" " %3%\n" " från installationen av\n" " %4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Kan inte skapa sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "bryt %s genom att ignorera vissa beroenden" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "ignorera generellt några beroende" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "det installerade %1% tillhör inte en uppgraderingslagringsplats och måste " "ersättas" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "det som ska installeras %1% tillhör inte en uppdateringslagringsplats" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "det installerade %1% har sämre arkitektur" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "det som ska installeras %1% har sämre arkitektur" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "problem med den installerade %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "begäranden i konflikt" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "vissa beroendeproblem" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "ingenting tillhandahåller den begärda '%1%'" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Har du aktiverat alla nödvändiga lagringsplatser?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "det begärda paketet %1% finns inte" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "begäran stöds inte" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "'%1%' tillhandahålls av systemet och kan inte raderas" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% är inte installerbar" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "ingenting ger '%1%' som behövs av den installerade %2%" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "ingenting ger '%1%' som behövs för att %2% ska installeras" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "kan inte installera både %1% och %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "den installerade %1% står i konflikt med '%2%' från den installerade %3%" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" "den installerade %1% står i konflikt med '%2%' från %3% som ska installeras" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" "den installerade %1% står i konflikt med '%2%' som tillhandahålls av den " "installerade %3%" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" "den installerade %1% står i konflikt med '%2%' från %3% tillhandahålls av " "%3% som ska installeras" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "det installerade %1% har föråldrat '%2%' från den installerade %3%" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "det installerade %1% har föråldrat '%2%' som tillhandahålls av det som ska " "installeras %3%" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" "det som ska installeras %1% har föråldrat '%2%' från det installerade %3%" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" "det som ska installeras %1% har föråldrats '%2%' från det som ska " "installeras %3%" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" "Den installerade %1% står i konflikt med '%2%' som tillhandahålls av sig " "själv" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" "Det som ska installeras %1% står i konflikt med '%2%' som tillhandahålls av " "sig själv" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" "den installerade %1% kräver '%2%', men detta krav kan inte tillhandahållas" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" "%1% som ska installeras kräver '%2%', men detta krav kan inte tillhandahållas" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "borttagna leverantörer: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "leverantörer som inte går att installera: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "leverantörer som inte går att installera: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% är ännu inte helt integrerad i %2%." #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" "Vanligtvis vill du behålla PTF och välja att inte installera " "underhållspatcharna." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" "Att ta bort det installerade %1% i detta sammanhang kommer att ta bort (inte " "ersätta!) De inkluderade PTF-paketen också." #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "PTF bör tas bort genom att kalla \"%1%\". Detta kommer att uppdatera de " "inkluderade PTF-paketen snarare än att ta bort dem." #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "Vanligtvis vill du behålla PTF eller välja att avbryta åtgärden." #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "Den installerade %1% blockerar önskad åtgärd." #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "Vanligtvis vill du behålla PTF och välja att avbryta åtgärden." #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "ta bort lås för att tillåta borttagning av %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "installera inte %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "behåll %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "ta bort lås för att tillåta installation av %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Denna begäran kommer att knäcka systemet!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ignorera varningen om ett trasigt system" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "be inte om att installera en lösning som ger %1%" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "be inte om att ta bort alla lösningar som ger %1%" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "installera inte senaste versionen av %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "behåll %1% trots den sämre arkitekturen" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "installera %1% trots den sämre arkitekturen" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "behåll föråldrad %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "installera %1% från exkluderad lagringsplats" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "installera %1% fast den har blivit tillbakadragen" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "Tillåt installation av PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "installera %1% fast den har blivit svartlistad" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "nergradering av %1% till %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "arkitekturändring på %1% till %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "installera %1% (med leverantörsändring)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "installera %1% från leverantör %2%\n" " ersätter %3% från leverantören %4%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "ersättning av %1% med %2%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "avinstallation av %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "Kör efter transaktionsskript" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "Kör %1% skript" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "%1% skriptutdata:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Installationen har avbrutits enligt instruktionerna." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " körd" # %s is either BOOTP or DHCP #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " körningen misslyckades" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s redan körd som %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " körningen hoppades över vid avbrottet" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Ett fel inträffade när ett uppdateringsmeddelande skickades." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Nytt uppdateringsmeddelande" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "Mottagen signal:\"%1% (%2%)\", för att säkerställa systemets konsistens är " "det inte möjligt att avbryta en körande rpm-transaktion." #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "Det gick inte att utföra transaktionen på grund av följande problem:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "Ingen spegel hittades" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "Kunde inte skapa mål fil" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "Redan i cache" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "Misslyckades att byta namn på temporär fil." #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "Slutfört" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "Avbryten av användare." #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM misslyckades: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Det gick inte att importera den offentliga nyckeln %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Det gick inte att ta bort den offentliga nyckeln %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "Pakethuvud är inte signerat!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "Paket payload är inte signerad!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Konfigurationsfiler har ändrats för %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "RPM sparade %s som %s, men det gick inte att avgöra skillnaden" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "RPM sparade %s som %s.\n" "Här visas de första 25 raderna med skillnader:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "RPM skapade %s som %s, men det gick inte att avgöra skillnaden" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "RPM skapade %s som %s.\n" "Här visas de första 25 raderna med skillnader:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Ytterligare RPM-utdata" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "skapade säkerhetskopian %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "Signaturen är OK" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Okänd signaturtyp" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Signaturen kan inte verifieras" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "Signaturen är OK, men nyckeln är inte betrodd" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Signaturens offentliga nyckel är inte tillgänglig" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Filen finns inte eller signaturen kan inte kontrolleras" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Filen är inte signerad" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "går inte ut" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "gick ut: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "går ut: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(går inte ut)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(UTGÅNGEN)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(går ut inom 24 timmar)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(går ut om %d dag)" msgstr[1] "(går ut om %d dagar)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Försökte importera icke existerande nyckel %s till nyckelringen %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Det gick inte att importera nyckeln." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Det gick inte att ta bort nyckeln." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Signaturfilen %s hittas inte" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Den tvivelaktiga typen '%s' för %u-bytekontrollsumma '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Kan inte öppna pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Det går inte att öppna programkopplingen (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Ogiltig LDAP URL-frågesträng" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Ogiltig LDAP URL-frågeparameter '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Det går inte att klona URL-objektet" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Den tomma URL-objektreferensen är ogiltig" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Det gick inte att analysera URL-komponenterna" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Historik:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "URL-schemat tillåter inte %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "%s-komponenten '%s' är ogiltig" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Ogiltig %s-komponent" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Analysering av frågesträng stöds inte för den här URL-adressen" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL-schemat är en obligatorisk komponent" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "URL-schemat '%s' är ogiltigt" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "URL-schemat tillåter inte något användarnamn" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "URL-schemat tillåter inte något lösenord" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Det måste finnas en värdkomponent i URL-schemat" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Det får inte finnas någon värdkomponent i URL-schemat" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Värdkomponenten '%s' är ogiltig" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "URL-schemat tillåter inte någon port" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Portkomponenten '%s' är ogiltig" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Det måste finnas ett sökvägsnamn för URL-schemat" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Relativa sökvägar tillåts inte om det finns behörighet" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Den kodade strängen innehåller ett NULL-byte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Ogiltigt avgränsningstecken för delning av parametermatris" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Ogiltigt avgränsningstecken för delning av parametermappning" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Ogiltigt avgränsningstecken för koppling av parametermatris" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Kommandot avslutades med statusen %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Kommandot avbröts av signalen %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Kommandot avslutades med ett okänt fel." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "Ogiltigt spawn argument angivet." #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "Kunde inte skapa kontrollrör." #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Kan inte ändra roten (chroot) till '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Kan inte ändra katalogen (chdir) till '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Kan inte ändra katalogen (chdir) till '%s' i chroot '%s' (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Kan inte köra '%s' (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Kan inte dela upp (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "Kan inte köra '%s', chdir misslyckades (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "Kan inte köra '%s', chroot misslyckades (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "Kan inte köra '%s', köra misslyckades (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "Kan inte köra '%s', oväntat fel." #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Misslyckades att montera %s på %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Misslyckades att avmontera %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Ogiltigt filnamn: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Mediet öppnades inte när åtgärden '%s' skulle utföras." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Filen '%s' kunde inte hittas på mediet '%s'" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Kan inte skriva filen '%s'." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Mediet är inte anslutet" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Felaktig anslutningspunkt för media" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Initieringen av hämtningen (curl) misslyckades för '%s'" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Systemundantaget '%s' uppstod för mediet '%s'." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Sökvägen '%s' på mediet '%s' är inte en fil." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Sökvägen '%s' på mediet '%s' är inte en katalog." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Felaktigt format för URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Tomt värdnamn i URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Tomt filsystem i URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Tomt mål i URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "URI-schemat i '%s' stöds inte." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Åtgärden stöds inte av mediet" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Ett hämtningsfel (curl) uppstod för '%s'.\n" "Felkod: %s\n" "Felmeddelande: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Ett fel uppstod när alternativ för hämtning (curl) skulle anges för '%s':" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Mediekällan '%s' innehåller inte önskat medium" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Mediet '%s' används av en annan instans" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Kan inte mata ut något medium" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Kan inte mata ut mediet '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Behörighet för åtkomst till '%s' nekad." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Tidsgränsen överskreds vid försök att nå '%s'." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Hämtade data överskred förväntad filstorlek '%s' av '%s'." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Platsen '%s' är för tillfället oåtkomlig." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL-certifikatsproblem, verifiera att CA-certifikatet för '%s' är OK." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "Inga fria resurser tillgängliga för att fästa medium." #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Det finns inte stöd för HTTP-autentiseringsmetoden '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Hämtningen (curl) fel för '%s':\n" "fel kod: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Nerladdning (curl) fel för '%s':\n" "Kunde inte hämta HTTP-svar\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ja" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nej" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Notera:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Varning:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Fel:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "klar" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "uppmärksamhet" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "fel" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Varning: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Hämtar:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "startar" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "hittades inte" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Det finns ingen hjälp till meddelandet." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "det finns ingen hjälp till alternativet" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "visar alla alternativ" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ja" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "nej" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Giltig metadata hittades inte på specificerad URL" #~ msgstr[1] "Giltig metadata hittades inte på specificerade URL:er" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Kör %%posttrans-skriptet '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Kör %p 1osttrans-skript" #~ msgid "Package is not signed!" #~ msgstr "Paketet är inte signerat!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s tillhör inte ett distupgrade-förråd" #~ msgid "%s has inferior architecture" #~ msgstr "%s innehåller en underordnad arkitektur" #~ msgid "problem with installed package %s" #~ msgstr "problem med det installerade paketet %s" #~ msgid "nothing provides requested %s" #~ msgstr "inget tillhandahåller begärda %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Har du aktiverat alla begärda lagringsplatser?" #~ msgid "package %s does not exist" #~ msgstr "paketet %s finns inte" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s kommer från systemet och kan inte tas bort" #~ msgid "%s is not installable" #~ msgstr "%s går inte att installera" #~ msgid "nothing provides %s needed by %s" #~ msgstr "inget tillhandahåller %s som behövs i %s" #~ msgid "cannot install both %s and %s" #~ msgstr "kan inte installera både %s och %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s är i konflikt med %s som kommer från %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s gör %s inaktuell som kommer från %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s gör %s som kommer från %s inaktuell" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "lösbara %s är i konflikt med %s som kommer från sig själv" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s behöver %s, men kravet kan inte uppfyllas" #~ msgid "remove lock to allow removal of %s" #~ msgstr "ta bort lås så att %s kan tas bort" #~ msgid "do not install %s" #~ msgstr "installera inte %s" #~ msgid "keep %s" #~ msgstr "behåll %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "ta bort lås så att %s kan installeras" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "fråga inte om att installera en lösbar med %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "fråga inte om att ta bort alla lösbara med %s" #~ msgid "do not install most recent version of %s" #~ msgstr "installera inte den senaste versionen av %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "behåll %s trots underordnad arkitektur" #~ msgid "install %s despite the inferior architecture" #~ msgstr "installera %s trots underordnad arkitektur" #~ msgid "keep obsolete %s" #~ msgstr "behåll föråldrad version av %s" #~ msgid "install %s from excluded repository" #~ msgstr "installera %s från undantaget arkiv" #~ msgid "downgrade of %s to %s" #~ msgstr "Nedgradera %s till %s" #~ msgid "architecture change of %s to %s" #~ msgstr "arkitekturändring av %s till %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "installera %s (med ändrad leverantör)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "ersätt %s med %s" #~ msgid "deinstallation of %s" #~ msgstr "avinstallation av %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Kan inte öppna låsfilen: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Åtgärden körs redan av ett annat program." #~ msgid "Hal Exception" #~ msgstr "Hal-undantag" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Tyvärr är denna version av libzypp byggd utan stöd för HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext har inte anslutits" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive har inte initierats" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume har inte initierats" #~ msgid "Unable to create dbus connection" #~ msgstr "Det gick inte att skapa dbus-anslutningen" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: Det gick inte att skapa libhal-kontext" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "libhal_set_dbus_connection: Det gick inte att ange dbus-anslutningen" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Det gick inte att initiera HAL-kontext - hald körs inte?" #~ msgid "Not a CDROM drive" #~ msgstr "Inte en cd-rom-enhet" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Det går inte att initiera mutex-attribut" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Det går inte att ange rekursiva mutex-attribut" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Det går inte att initiera rekursivt mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Det går inte att hämta mutex-låset" #~ msgid "Can't release the mutex lock" #~ msgstr "Det går inte att släppa mutex-låset" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "" #~ "Det gick inte att importera den offentliga nyckeln från filen %s: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Det gick inte att ta bort den offentliga nyckeln %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Det gick inte att hitta en tillgänglig loop-enhet för montering av " #~ "bildfilen från '%s'" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "inte installerad." #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "Kan inte skapa publik nyckel %s från %s nyckelring till filen %s" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Kunde inte öppna %s - %s\n" # name for SCG #~ msgid "Serbia and Montenegro" #~ msgstr "Serbien och Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Okänt alternativ för list" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "det gick inte att lösa beroenden" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s har inte någon kontrollsumma.\n" #~ "Vill du använda filen ändå?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Integritetskontrollen för filen %s misslyckades med följande nyckel:\n" #~ "%s|%s|%s\n" #~ "Vill du använda filen ändå?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s har en ogiltig kontrollsumma.\n" #~ "%s förväntades, men %s hittades\n" #~ " Vill du använda filen ändå?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s har en okänd kontrollsumma.%s.\n" #~ "Vill du använda filen ändå?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Filen %s har inte signerats.\n" #~ "Vill du använda den ändå?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Filen %s har signerats med en okänd nyckel:\n" #~ "%s|%s|%s\n" #~ "Vill du använda filen ändå?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "En osäker nyckel hittades:\n" #~ "%s|%s|%s\n" #~ "Vill du lita på nyckeln?" libzypp-17.36.5/po/ta.po000066400000000000000000004637101476576476200150130ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: NetworkManager-vpnc\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-06-20 12:46+0000\n" "Last-Translator: Rajasekaran Karunanithi \n" "Language-Team: Tamil \n" "Language: ta\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: Weblate 5.6\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "அறிந்திராத நாடு:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "குறியீடு இல்லை" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "அன்டோரா" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "ஐக்கிய அரபு நாடுகள்" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "ஆப்கானிஸ்தான்" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "ஆன்டிகுவா மற்றும் பார்புடா" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "அங்வில்லா" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "அல்பேனியா" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "ஆர்மீனியா" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "நெதர்லாந்து அண்டிலிஸ்" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "அங்கோலா" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "அண்டார்டிகா" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "அர்ஜென்டினா" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "அமெரிக்க சமோவா" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "ஆஸ்திரியா" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "ஆஸ்திரேலியா" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "அருபா" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "அலண்ட் தீவுகள்" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "அஜர்பைஜான்" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "பாஸ்னியா மற்றும் ஹெர்சகோவினா" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "பார்படாஸ்" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "பங்களாதேஷ்" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "பெல்ஜியம்" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "பர்கினா ஃபாஸோ" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "பல்கேரியா" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "பஹ்ரைன்" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "புருண்டி" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "பெனின்" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "பெர்முடா" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "புரூனய் தாருசலாம்" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "பொலிவியா" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "பிரேசில்" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "பஹாமாஸ்" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "பூட்டான்" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "பூவெட் தீவு" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "பாட்ஸ்வானா" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "பெலாரஸ்" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "பெலிஸ்" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "கனடா" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "கோகோஸ் (கீலிங்) தீவுகள்" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "காங்கோ" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "மத்திய ஆப்பிரிக்க குடியரசு" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "சுவிட்சர்லாந்து" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "கோடே த’ஐவரி" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "குக் தீவுகள்" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "சிலி" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "கேமரூன்" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "சீனா" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "கொலம்பியா" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "காஸ்டா ரிகா" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "கியூபா" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "கேப் வெர்ட்" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "கிறிஸ்துமஸ் தீவு" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "சைப்ரஸ்" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "செக் குடியரசு" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "ஜெர்மனி" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "ஜிபெளட்டி" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "டென்மார்க்" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "டொமினிகா" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "டொமினிக்கன் குடியரசு" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "அல்ஜீரியா" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "ஈக்வடார்" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "எஸ்டோனியா" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "எகிப்து" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "மேற்கு சஹாரா" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "எரிட்ரியா" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "ஸ்பெயின்" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "எத்தியோப்பியா" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "பின்லாந்து" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "ஃபிஜி" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "ஃபால்க்லாந்து தீவுகள் (மால்வினாஸ்)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "மைக்ரோனேசிய நாடுகளின் கூட்டமைப்பு" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "ஃபாரோ தீவுகள்" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "பிரான்ஸ்" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "பெருநகர பிரான்ஸ்" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "காபோன்" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "ஐக்கிய இராச்சியம்" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "கிரெனடா" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "ஜார்ஜியா" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "பிரஞ்சு கயானா" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "குர்ன்சி" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "கானா" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "ஜிப்ரால்டர்" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "கிரீன்லாந்து" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "காம்பியா" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "கினியா" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "காடேலூப்" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "ஈக்வடோரியல் கினியா" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "கிரீஸ்" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "தென் ஜியார்ஜியா மற்றும் தென் சான்ட்விச் தீவுகள்" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "குவாதமாலா" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "குவாம்" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "கினியா-பிசாவ்" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "கயானா" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "ஹாங் காங்" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "ஹேர்ட் தீவு மற்றும் மெக்டொனால்ட் தீவுகள்" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "ஹோண்டுராஸ்" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "குரோஷியா" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "ஹைட்டி" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "ஹங்கேரி" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "இந்தோனேசியா" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "அயர்லாந்து" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "இஸ்ரேல்" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "மனித தீவு" #: zypp/CountryCode.cc:261 msgid "India" msgstr "இந்தியா" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "பிரிட்டிஷ் இந்துமாக் கடல் எல்லை" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "ஈராக்" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "ஈரான்" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "ஐஸ்லாந்து" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "இத்தாலி" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "ஜெர்சி" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "ஜமைக்கா" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "ஜோர்டான்" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "ஜப்பான்" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "கென்யா" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "கிர்கிஸ்தான்" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "கம்போடியா" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "கிரிபாட்டி" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "கோமரோஸ்" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "செயின்ட் கிட்ஸ் மற்றும் நெவிஸ்" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "வட கொரியா" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "தென் கொரியா" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "குவைத்" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "கெய்மன் தீவுகள்" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "லாவோ மக்கள் ஜனநாயக குடியரசு" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "லெபனான்" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "செயின்ட் லூசியா" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "லிச்சன்ஸ்டெயின்" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "இலங்கை" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "லைபீரியா" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "லெசோத்தோ" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "லிதுவேனியா" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "லக்சம்பர்க்" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "லாட்வியா" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "லிபியா" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "மொராக்கோ" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "மொனாக்கோ" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "மால்டோவா" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "மாண்டினீக்ரோ" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "சான் மரினோ" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "மடகாஸ்கர்" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "மார்ஷல் தீவுகள்" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "மாசிடோனியா" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "மாலி" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "மியான்மர்" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "மங்கோலியா" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "மக்காவ்" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "வட மாரியானா தீவுகள்" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "மார்டினிக்" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "மொரிட்டானியா" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "மான்ட்செர்ரட்" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "மால்டா" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "மொரிஷியஸ்" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "மாலத்தீவுகள்" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "மலாவி" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "மெக்சிகோ" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "மலேசியா" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "மொசாம்பிக்" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "நமீபியா" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "புதிய கலிடோனியா" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "நைஜர்" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "நார்போக் தீவு" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "நைஜீரியா" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "நிகரகுவா" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "நெதர்லாந்து" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "நார்வே" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "நேபாளம்" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "நவ்ரு" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "நியூ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "¿¢äº¢Ä¡óÐ" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "§º÷Áý" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "ÀÉ¡Á¡" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "¦ÀÕ" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "பிரெஞ்சு பாலினேசியா" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "பாப்புவா நியூ கினியா" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "ஃபிலிப்பைன்ஸ்" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "¾¡öÅ¡ý" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "§À¡Ä¡óÐ" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "செயின்ட் பியரி மற்றும் மிக்வலான்" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "பிட்கெய்ர்ன்" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "பியூர்டோ ரிகோ" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "பாலஸ்தீனிய எல்லை" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "§À¡÷òиø" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Àá̧Å" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Àá̧Å" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Á¡ø¼¡" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "ரீயூனியன்" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Õ§Áɢ¡" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "¦º÷À¢Âý" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "ரஷ்ய கூட்டரசு" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "¸É¼¡" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "சவூதி அரேபியா" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "«Â÷Ä¡óÐ" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "செய்செலஸ்" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "ݼ¡ý" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "ÍÅ£¼ý" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "சிங்கப்பூர்" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "செயின்ட் ஹெலனா" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "ͧġŢɢ¡" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "ஸ்வால்பார்ட் மற்றும் ஜான் மேயன்" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "ͧġš츢Â" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "ஸியரா லியோன்" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "சான் மரினோ" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "செனகல்" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Õ§Áɢ¡" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "¦º÷À¢Â¡" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "சாவோ டோம் மற்றும் பரின்சிபே" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "±ø º¡øÅ§¼¡÷" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "¦º÷À¢Â¡" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "¾¡öÄ¡óÐ" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "டர்க்ஸ் மற்றும் கெய்கோஸ் தீவுகள்" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "º£É¡" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "பிரெஞ்சு தென் எல்லைகள்" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "டோகோ" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "¾¡öÄ¡óÐ" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "¾¡öÅ¡ý" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "டோகேலாவ்" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "¾¡öÅ¡ý" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ú¢Â¡" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "டோங்கா" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "கிழக்கு தைமூர்" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "ÐÕ츢" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ðâɢ¼¡ð & ¦¼¡À¡§¸¡" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Ýæ" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "¾¡öÅ¡ý" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "டான்சானியா" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "¯ì¦Ãöý" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "¸É¼¡" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "³ì¸¢Â «¦ÁÃ¢ì¸ ¿¡Î¸û" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "³ì¸¢Â «¦ÁÃ¢ì¸ ¿¡Î¸û" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "¯Õ̧Å" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "¾¡öÅ¡ý" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "ஹோலி ஸீ (வாடிகன் நகர மாகாணம்)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "¦ºÂ¢ýð Å¢ý¦ºýð & ¸¢¦ÃÉËý¸û" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "¦ÅÉ¢ÍÅÄ¡" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "À¢ýÄ¡óÐ" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "À¢ýÄ¡óÐ" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "வானுவாடூ" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "வாலிஸ் மற்றும் ஃபுடூனா" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "¦¸¡ÄõÀ¢Â¡" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "யேமன்" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "மயோட்" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "¦¾ý ¬ôâ측" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "ƒº¦Áö측" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "ஜிம்பாப்வே" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s %sஐ வழக்கற்றதாக்குகிறது:" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "அறியப்படாத மொழி: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "தொலைதூரம்" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "«º÷¨Àº¡ý" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "º£É" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "அகோலி" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "அடாங்மே" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "அடிகே" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "ஆப்பிரிக்க-ஆசிய (மற்றவை)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "ஆப்ரிஹிலி" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "¬·À⸡ýÍ" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "அய்னு" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "¬·À⸡ýÍ" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "அக்கடியன்" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "«º÷¨Àº¡ý" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "அல்யூட்" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "¦¾ý ¬ôâ측" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "«Ã¡À¢ì" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "ஆங்கிலம், புராதன (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "«Ã¡À¢ì" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "«Ã¡À¢ì" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "அரகோனீஸ்" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "¬÷¦ºƒýÊÉ¡" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Ä¢òЧÅɢ¡" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "அரபாஹோ" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "செயற்கை (மற்றவை)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "அரவாக்" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "அசாமிய" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "¬Íò¾¢Ã¢Â¡" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "«Ã¡À¢ì" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "அவெஸ்டான்" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "அவதி" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "ÀÉ¡Á¡" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "«º÷¨Àº¡É¢" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "¸É¼¡" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "பாமிலேகே மொழிகள்" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "பஷ்கீர்" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "பலுச்சி" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "ƒº¦Áö측" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "º£É" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "À¡ÍìÌ" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "À¡ÍìÌ" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "பால்டிக் (மற்றவை)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "பெஜா" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "¦ÀÄ¡åÍ" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "பெம்பா" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "¦Àøº¢Âõ" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "பெர்பெர் (மற்றவை)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "போஜ்புரி" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "À¢§Ãº¢ø" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "பைகோல்" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "பினி" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "பிஸ்லாமா" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "சிக்சிகா" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "பன்டு (மற்றவை)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "¯Õ§ÁÉ¢Â" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "À¢§Ãº¢ø" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "À¢Ã¢¼¡ý" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "­ó§¾¡É£º¢Â¡" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Àø§¸Ã¢Â¡" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "º£É" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Àø§¸Ã¢Âý" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "பர்மிய" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Àø§¸Ã¢Âý" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "º£É¡" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "மத்திய அமெரிக்க இந்திய (மற்றவை)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Á¡µÃ¢" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "¦¸¼Ä¡ý" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "காகாசியன் (மற்றவை)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "செபுவானோ" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "செல்டிக் (மற்றவை)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "சமாரோ" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "º£É¡" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "¦ºì" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "சகடாய்" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "º£É" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "º£É" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Á¡µÃ¢" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "சினூக் ஜார்கன்" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "சோக்டாவ்" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "சிப்யூயான்" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "செரோக்கீ" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "சர்ச் ஸ்லாவிக்" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "சுவாஷ்" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "செயன்" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "̦á§Åº¢Â¡" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "³Ã¢Í" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "̦á§Åº¢Âý" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "க்ரியோலஸ் மற்றும் பிட்ஜின்ஸ், ஆங்கிலம் சார்ந்தது (மற்றவை)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "க்ரியோலஸ் மற்றும் பிட்ஜின்ஸ், பிரெஞ்சு சார்ந்தது (மற்றவை)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "க்ரியோலஸ் மற்றும் பிட்ஜின்ஸ், போர்த்துக்கீசிய மொழி சார்ந்தது (மற்றவை)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "¸¢§Ãì¸" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "க்ரிமியன் டார்டர்" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "க்ரியோலஸ் மற்றும் பிட்ஜின்ஸ் (மற்றவை)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "கசுபியன்" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "குஷிடிக் (மற்றவை)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "¦ºì" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "டகோடா" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "§¼É¢Í" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "டார்க்வா" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "டாயக்" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "டெலாவேர்" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "ஸ்லேவ் (அதபாஸ்கன்)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "டாக்ரிப்" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Õ§Áɢ¡" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "டிவேஹி" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Á¡µÃ¢" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "திராவிட (மற்றவை)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "¦º÷À¢Âý" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Àá̧Å" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "டச்சு, மத்திய (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "¼îÍ" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "டியூலா" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "ஜாங்கா" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "ஈஃபிக்" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "எகிப்து (புராதன)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "எகாஜக்" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "எலாமைட்" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "§¼É¢Í" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "ஆங்கிலம், மத்திய (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "±ÍÀáý§¼¡" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "±Í§¼¡É¢Â" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "ஈவ்" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "இவான்டோ" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "À¢Ã¡ýÍ" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "«Â÷Ä¡óÐ" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "ஃபன்டி" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "À¢ýÄ¡óÐ" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "ஃபிலிப்பினோ" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "À¢ýÉ¢Í" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "ஃபின்னோ-உக்ரியன் (மற்றவை)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "ஃபான்" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "À¢¦Ãýî " #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "பிரெஞ்சு, மத்திய (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "பிரெஞ்சு, புராதன (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "À¢Ã¡ýÍ" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "ஃப்யூலா" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "À¢ýÄ¡óÐ" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "ÌÅ¡ò¾Á¡Ä¡" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "கயோ" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "º£É¡" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "ஜெர்மானிய (மற்றவை)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "¦º÷À¢Â¡" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "§º÷Áý" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "¸¢§Ãì¸" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Å¢ÂðÉ¡Á¢Â" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Á¡ø¼¡" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "³Ã¢Í" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "­ò¾¡Ä¢Âý" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "மான்க்ஸ்" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "ஜெர்மன், மேல் மத்திய (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "ஜெர்மன், மேல் புராதன (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "­ó¾¢Â¡" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "கோரன்டாலோ" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "கோத்திக்" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "¸¢§Ãì¸" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "கிரேக்கம், புராதன(1453 வரை)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "கிரேக்கம், நவீன (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Àø§¸Ã¢Âý" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "குஜராத்தி" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "க்விச் இன்" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "ஹைடா" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "ÄðÅ¢Âý" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "ஹெளசா" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "ஹவாயன்" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "¸£ôê" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "¸£ôê" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "ஹிலிகைனான்" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "ஹிமாச்சலி" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "­ó¾¢Â¡" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "ஹிடைட்" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "ஹ்மாங்" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "ஹிரி மோட்டு" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "¦º÷À¢Âý" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "«í§¸Ã¢Âý" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "ஹ்யூபா" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "®Ã¡ì" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "இக்போ" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "³ÍÄ¡ó¾¢Â" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "ஐடோ" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Ä¢òЧÅɢ¡" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "ஐஜோ" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "இனக்டிடட்" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "இன்டர்லிங்வே" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "இலோக்கோ" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "இன்டர்லிங்குவா (சர்வதேச துணை மொழி குழுமம்)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "இன்டிக் (மற்றவை)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "­ó§¾¡É£º¢Âý" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "இந்தோ-ஐரோப்பிய (மற்றவை)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "இங்குஷ்" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "­ó¾¢Â¡" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "இரானிய (மற்றவை)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "­ò¾¡Ä¢Âý" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "ÂôÀ¡É¢Â" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "லோஜ்பான்" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "ÂôÀ¡É¢Â" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "­ó§¾¡É£º¢Âý" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "«Ã¡À¢ì" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "கரா-கல்பக்" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "காபைல்" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "À¢§Ãº¢ø" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "கலால்லிசட்" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "ƒº¦Áö측" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "¸É¼¡" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "¦¸¡Ã¢Âý" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "காஷ்மீரி" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Ì÷¾¢Í" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Á¡ø¼¡" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "¾¡öÅ¡ý" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "கபர்டியன்" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "¾¡ö" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "கொய்சான் (மற்றவை)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "க்மர்" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "º£É" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "கிகுயு" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "கின்யர்வாண்டா" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "கிர்கிஸ்" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "கிம்பன்டு" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "¦¸¡Ã¢Âý" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "கோமி" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "காங்கோ" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "¦¸¡Ã¢Âý" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "¦¸¡Ã¢Âý" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "க்பெல்" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "கராச்சய் - பல்கார்" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "க்ரு" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Ì÷¾¢Í" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "ÀÉ¡Á¡" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "குமிக்" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Ì÷¾¢Í" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "குடேனய்" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "ÄðÅ¢Âý" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "¸É¼¡" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "ƒº¦Áö측" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "லாவோ" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "ÄðÅ¢Âý" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "ÄðÅ¢Âý" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "லெஸ்கியன்" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Äìºõ§À¡÷ì" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "லிங்கலா" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "ĢЧÅÉ¢Âý" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "மாங்கோ" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "லோசி" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Äìºõ§À¡÷ì" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "லுபா-லுலுவா" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "லுபா-கடாங்கா" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "º£É¡" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "லூயிசெனோ" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "ݼ¡ý" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "லுவோ (கென்யா மற்றும் டான்சானியா)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "¾¡ö" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Á¡º¢§¼¡É¢Â" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Á¡øËº¢Â" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Á¡ø¼¡" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Á¡øËº¢Â" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Á¡ø¼¡" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Á¡ø¼¡" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Á¡ø¼¡" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "மான்டிங்கோ" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Á¡µÃ¢" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "ஆஸ்ட்ரோனேசியன் (மற்றவை)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Á¡µÃ¢" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Á¡ø¼¡" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Á¡ø¼¡" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "மோக்ஷா" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "ÀÉ¡Á¡" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "மென்டே" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "ஐரிஷ், மத்திய (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "மிக்மாக்" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "மினாங்கபாவ்" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "மான்-க்மர் (மற்றவை)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Á¡ø¼¡" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Á¡øËº¢Â" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "மஞ்சு" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Á¡µÃ¢" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "மொஹாக்" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "ÄðÅ¢Âý" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Á¡º¢§¼¡É¢Â" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Á¡µÃ¢" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "முண்டா மொழிகள்" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "¸¢§Ãì¸" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Á¡º¢§¼¡É¢Â¡" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Á¡µÃ¢" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "எர்சியா" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "நவ்ஹட்ல்" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "வட அமெரிக்க இந்திய" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "நியபாலிட்டன்" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "நவாஜோ" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "ந்டெபில், தெற்கு" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "ந்டெபில், வடக்கு" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "ந்டோங்கா" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "§º÷Áý" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Á¡ø¼¡" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "நேபால் பாசா" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "நியாஸ்" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "நைகர்-கார்டோஃபானியன் (மற்றவை)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "¦º÷À¢Â¡" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "நார்வேஜிய நைநார்ஸ்க்" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "நார்வேஜிய போக்மால்" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "நோகய்" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "நார்ஸ், புராதன" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "¿¡÷§Å" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "வட சோதோ" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "பாரம்பரிய நெவாரி" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "º¢Ä¢" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "நயாம்வேஸி" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "நயான்கோல்" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "நயோரோ" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "நஸீமா" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "ஆக்ஸிடன் (1500க்குப்பின்)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "‍ஓஜிப்வா" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "¦º÷À¢Â¡" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "ஓரோமோ" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "ஓசேஜ்" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "¯Õº¢Â" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "துருக்கி, ஓட்டோமன் (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "பாப்புவன் (மற்றவை)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "«í§¸Ã¢Âý" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Àá̧Å" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Àá̧Å" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "ÀÉ¡Á¡" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "பாப்பியாமென்டோ" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Àá̧Å" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "பாரசீகம், புராதன (ca.600-400 கி.மு.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "¦º÷À¢Âý" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "ஃபிலிப்பைன் (மற்றவை)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "ͧġţɢÂý" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Á¡ø¼¡" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "§À¡Ä¢Í" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "­ó§¾¡É£º¢Âý" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "§À¡÷òÐ츣º¢Â" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "புராவென்கல், புராதன (1500 வரை)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "புஷ்டோ" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "க்வெச்சுவா" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "¾¡öÅ¡ý" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "ºôÀ¡ý" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "ரரோடோங்கன்" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "ரொமான்ஸ் (மற்றவை)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "ரேடோ-ரொமான்ஸ்" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Õ§Áɢ¡" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "¯Õ§ÁÉ¢Â" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "­ó¾¢Â¡" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "¯Õº¢Â" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "¸É¼¡" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "ݼ¡ý" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "யாகுட்" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "பதென் அமெரிக்க இந்திய (மற்றவை)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "சமாரிட்டன் அராமைக்" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "சமஸ்கிருதம்" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "சசாக்" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "சந்தாலி" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "¦º÷À¢Âý" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "சிசிலியன்" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "ஸ்காட்ஸ்" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "̦á§Åº¢Âý" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "செல்கப்" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "செமிடிக் (மற்றவை)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "ஐரிஷ், புராதன (900 வரை)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "சங்கேத மொழிகள்" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "ݼ¡ý" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "சைடாமோ" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "சிங்களம்" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "சீன-திபெத்திய (மற்றவை)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "ஸ்லாவிக் (மற்றவை)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "ͧġšì" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "ͧġţɢÂý" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "தென் சாமி" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "வட சாமி" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "சாமி மொழிகள் (மற்றவை)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "லூலெ சாமி" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "இனாரி சாமி" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "சமோவன்" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "ஸ்கோல்ட் சாமி" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "ͧġŢɢ¡" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "சிந்தி" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "ͧġţɢÂý" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "ݼ¡ý" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Õ§Áɢ¡" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "சோங்காய்" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "சோதோ, தெற்கு" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "ÍÀ¡É¢Â" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Ä¢òЧÅɢ¡" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "செரர்" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "நிலோ-சஹாரன் (மற்றவை)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "ͦÀ¢ý" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "சுகுமா" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "ݼ¡ý" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "சுசு" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "¦º÷À¢Âý" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "¾¡öÄ¡óÐ" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "ÍÅ£ÊÍ" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "¦º÷À¢Â¡" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "¾¡öÅ¡ý" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "தாய் (மற்றவை)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "¾Á¢ú" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Á¡ø¼¡" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "¦Àøº¢Âõ" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "டிம்னே" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "டெரனோ" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "டேடம்" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "¾¡öÅ¡ý" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "டகலோக்" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "¾¡ö" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "¾¡öÅ¡ý" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "டைக்ரே" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "¦º÷À¢Â¡" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "டைவ்" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "க்ளிங்கான்" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "ட்லிங்கிட்" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "டமாஷேக்" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "டோங்கா (நியாஸா)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "டோங்கா (டோங்கா தீவுகள்)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "டோக் பிசின்" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "¯Õº¢Â" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "¾¡öÅ¡ý" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "±Í§¼¡É¢Â¡" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "ÐÕ츢" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "டும்புகா" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "ÐÕ츢Â" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "அல்டெய்க் (மற்றவை)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "ட்வி" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "ú¢Â¡" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "உட்மர்ட்" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "உகாரிடிக்" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "உய்கூர்" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "¯ì¦Ãöý" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "உம்பண்டு" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "தீர்மானிக்க இயலாதவை" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "உருது" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "உஸ்பெக்" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "வாய்" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Vietnam" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Å¢ÂðÉ¡Á¢Â" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "வொலாபக்" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "வால்டிக்" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "வலாமோ" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Àá̧Å" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "§ÅøÍ" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "§ÅøÍ" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "வாலூன்" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "வோலாஃப்" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "கால்மிக்" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "§º¡º¡" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "யாவோ" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "ÂôÀ¡É¢Â" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "யிட்டிஷ்" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "¦¸¡ÄõÀ¢Â¡" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "¬ŠÍò¾¢§ÃĢ¡" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "ஸாபோடெக்" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "¸¢¦Ãɼ¡" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "சுவாங்" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "ஸாண்டே" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Ýæ" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "சுனி" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "அறியப்படாதது" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "தெரியாத ஆணை " #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "செல்லாத யூஆர்எல் திட்டம் '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "அடைவு %1 உருவாக்க முடியவில்லை: %2." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "டெஸ்க்டாப் பொருளை '%s' திறக்க முடியவில்லை" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, fuzzy, c-format, boost-format msgid "Adding repository '%s'" msgstr "மூலங்கள் சேர்க்கப்படுகின்றன" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "செல்லாத ஏற்றுமதி கோப்புபெயர்." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "எழுதுவதற்கு கோப்பைத் திறக்க முடியவில்லை." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "ஃப்ளாப்பி வட்டிலிருந்து படிப்பதில் பிழை" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "மூலங்கள் சேர்க்கப்படுகின்றன" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "டெஸ்க்டாப் பொருளை '%s' திறக்க முடியவில்லை" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "தொடரலாமா?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "நேர்மை சோதனையில் %s பேக்கேஜ் தோல்வியுற்றது. அதனை தகவலிறக்கம் செய்வதற்கு நீங்கள் மீண்டும் " "முயற்சிக்கப் போகிறீர்களா?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "நேர்மை சோதனையில் %s பேக்கேஜ் தோல்வியுற்றது. அதனை தகவலிறக்கம் செய்வதற்கு நீங்கள் மீண்டும் " "முயற்சிக்கப் போகிறீர்களா?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "அப்ளைடெல்டாஆர்பிஎம் சோதனை தோல்வியுற்றது" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "அப்ளைடெல்டாஆர்பிஎம் தோல்வியுற்றது." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "VAR1 மூல வகை காட்சி மாற்றங்கள் அம்சத்திற்கு ஆதரவளிப்பதில்லை" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "%sலிருந்து %sஐ அளிக்க இயலாது" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "சேமிப்பிடத்தில் கோப்பு %1 காணப்படவில்லை." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "கோப்பை உருவாக்க முடியவில்லை." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "இத்தேவையை இங்கேயே புறக்கணிக்கவும்" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "இத்தேவையை இங்கேயே புறக்கணிக்கவும்" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "இந்த இணைப்புக்கான கோரிக்கை: " #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "சார்புத்தன்மை பிரச்னைகள் காரணமாக %s ஐ நிறுவ இயலவில்லை" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "%s யாரும் அளிப்பதில்லை" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "கோரிக்கை ஏற்கனவே உள்ளது." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "குறிப்பிட்டுள்ளபடி நிறுவுதல் இடையில் நிறுத்தப்பட்டது." #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "நிறைவேற்று" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "விசை என்கிரிப்ட் செய்யும்போது பிழை." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "தோல்வியுற்றது" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s:க்காக உள்ளமைத்தல் கோப்புகள் மாற்றப்பட்டுள்ளன" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "%s ஆக ஆர்பிஎம் சேமிக்கப்பட்டுள்ளது, ஆனால் வேறுபாட்டை நிர்ணயிக்க முடியவில்லை" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, fuzzy, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "%s ஆக ஆர்பிஎம் சேமிக்கப்பட்டுள்ளது.\n" "வேறுபாடுகளின் முதல் 25 வரிகள் இங்குள்ளன:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "%s ஆக ஆர்பிஎம் உருவாf;கப்பட்டுள்ளது, ஆனால் வேறுபாட்டை நிர்ணயிக்க முடியவில்லை" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, fuzzy, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "%s ஆக ஆர்பிஎம் உருவாக்கப்பட்டுள்ளது.\n" "வேறுபாடுகளின் முதல் 25 வரிகள் இங்குள்ளன:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "கூடுதல் ஆர்பிஎம் அவுட்புட்:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "%s மறுபிரதி உருவாக்கப்பட்டது" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "உள்ளீடு காணப்படவில்லை." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "உள்ளீடு காணப்படவில்லை." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "உள்ளீடு காணப்படவில்லை." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1' காணப்படவில்லை." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1' காணப்படவில்லை." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "உள்ளீடு காணப்படவில்லை." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "கோப்பை %1 திறக்க முடியவில்லை." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "செல்லாத எல்டிஏபி யூஆர்எல் வினா வரிசை" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "செல்லாத எல்டிஏபி யூஆர்எல் வினா அளவீடு '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "யூஆர்எல் பொருளின் போலிகையை உருவாக்க இயலவில்லை" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "செல்லாத காலி யூஆர்எல் பொருள் குறிப்புரை" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "யூஆர்எல் உறுப்புகளை விளக்க இயலவில்லை" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "யூஆர்எல் திட்டம் %sக்கு அனுமதிப்பதில்லை" #: zypp-core/url/UrlBase.cc:240 #, fuzzy, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "'%s' செல்லாத உறுப்பு" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "செல்லாத %s உறுப்பு" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "இந்த யூஆர்எல்லுக்கு வினா வரிசை விளக்கம் ஆதரவளிக்கப்படவில்லை" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "யூஆர்எல் திட்டம் ஒரு தேவைப்படும் உறுப்பாகும்" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "செல்லாத யூஆர்எல் திட்டம் '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "யூஆர்எல் திட்டம் பயனாளர் பெயரை அனுமதிப்பதில்லை" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "யூஆர்எல் திட்டம் கடவுச்சொல்லை அனுமதிப்பதில்லை" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "யூஆர்எல் திட்டத்திற்கு ஓர் ஆதார உறுப்பு தேவைப்படுகிறது" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "யூஆர்எல் திட்டம் ஓர் ஆதார உறுப்பை அனுமதிப்பதில்லை" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "செல்லாத ஆதார உறுப்பு'%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "யூஆர்எல் திட்டம் ஒரு முணையத்தை அனுமதிப்பதில்லை" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "செல்லாத முணைய உறுப்பு'%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "யூஆர்எல் திட்டத்திற்கு ஒரு பாதை பெயர் தேவைப்படுகிறது" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "அதிகாரம் இருக்குமானால் தொடர்புப் பாதை ஆதரவளிக்கப்படுவதில்லை" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "குறியீடு செய்யப்பட்ட வரிசை, என்யூஎல் பைட் கொண்டுள்ளது" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "செல்லாத அளவீட்டு அடுக்கு பிளவை பிரிக்கும் வடிவம்" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "செல்லாத அளவீட்டு வரைவு பிளவை பிரிக்கும் வடிவம்" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "செல்லாத அளவீட்டு அடுக்கு இணைப்பை பிரிக்கும் வடிவம்" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "இணைக்கப்படும் பொழுது கட்டளையை செயல்படுத்து" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "%s கண்பிடிக்க முடியவில்லை." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "%s கண்பிடிக்க முடியவில்லை." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "%s - %s திறக்க முடியவில்லை\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "கூறு\"%s\"ஐ ஏற்ற முடியவில்லை" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "சேமிப்பிடத்தில் கோப்பு %1 காணப்படவில்லை." #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "%1 கோப்பில் எழுத முடியவில்லை." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 ஒரு அடைவல்ல." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "சிஏ பெயா காலி செய்." #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "செல்லாத URL திட்டம் '%1'." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "டெஸ்க்டாப் பொருளை '%s' திறக்க முடியவில்லை" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "அனுமதிகள் மறுக்கப்படுகின்றன" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "ஆம்" #: zypp-tui/Table.cc:32 msgid "No" msgstr "இல்லை" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "எச்சரிக்கை" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "பிழை" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "­ó§¾¡É£º¢Â¡" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "பிழை" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "எச்சரிக்கை" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "ஆரம்பிக்கிறது..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "காணப்படவில்லை " #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ஆம்" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "இல்லை" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது." #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "பேக்கேஜ்களின் நிறுவுதலை நீக்குவதற்கான ஆணை" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "%s யாரும் அளிப்பதில்லை" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "சான்றிதழ் %1 இல்லை." #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s பூட்டப்பட்டுள்ளது மற்றும் அதன் நிறுவுதலை நீக்க இயலாது." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "நிறுவப்படவில்லை" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s, %sக்கு தேவைப்படுகிறது" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "%sஐ நிறுவ முடியவில்லை" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s %sஉடன் முரண்படுகிறது" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s %sஐ வழக்கற்றதாக்குகிறது" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s %sஐ வழக்கற்றதாக்குகிறது" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s %sஉடன் முரண்படுகிறது" #~ msgid "do not install %s" #~ msgstr "%sஐ நிறுவ வேண்டாம்" #~ msgid "keep %s" #~ msgstr "%sஐ வைத்துக் கொள்ளவும்" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "%sஐ நிறுவ வேண்டாம்" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "%sக்கு நிறுவக்கூடிய அளிப்பவர்கள் இல்லை" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "தொடர்புள்ள தீர்வுகளை நிறுவவோ அல்லது நீக்கவோ வேண்டாம்" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "அது கட்டமைப்பை மாற்றக்கூடுமென்றாலும் %sஐ நிறுவவும்" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s %sஐ வழக்கற்றதாக்குகிறது" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "%sலிருந்து %s தகவலிறக்கம் செய்யப்பட்டது" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "நிறுவுதல்" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "கோப்பை %1 திறக்க முடியவில்லை." #~ msgid "Hal Exception" #~ msgstr "ஹால் விதிவிலக்கு" #~ msgid "HalContext not connected" #~ msgstr "ஹால்கான்டெக்ஸ்ட் இணைக்கப்படவில்லை" #~ msgid "HalDrive not initialized" #~ msgstr "ஹால்டிரைவ் துவக்கப்படவில்லை" #~ msgid "HalVolume not initialized" #~ msgstr "ஹால்வால்யூம் துவக்கப்படவில்லை" #~ msgid "Unable to create dbus connection" #~ msgstr "டிபஸ் இணைப்பை உருவாக்க இயலவில்லை" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: ஆல் லைபால் உள்ளடக்கத்தை உருவாக்க இயலவில்லை" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: ஆல் டிபஸ் இணைப்பை அமைக்க இயலவில்லை" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "HAL உள்ளடக்கத்தை துவக்க இயலவில்லை -- ஹால்ட் இயக்கத்தில் இல்லையா?" #~ msgid "Not a CDROM drive" #~ msgstr "சிடிரோம் டிரைவ் அல்ல" #~ msgid "Can't initialize mutex attributes" #~ msgstr "மியூடெக்ஸ் பண்புகளை துவக்க இயலாது" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "எதிர்ப்புத்தன்மையுள்ள மியூடெக்ஸ் பண்மப அமைக்க இயலாது" #~ msgid "Can't initialize recursive mutex" #~ msgstr "எதிர்ப்புத்தன்மையுள்ள மியூடெக்ஸை துவக்க இயலாது" #~ msgid "Can't acquire the mutex lock" #~ msgstr "மியூடெக்ஸ் பூட்டை பெற இயலாது" #~ msgid "Can't release the mutex lock" #~ msgstr "மியூடெக்ஸ் பூட்டை திறக்க இயலாது" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "பொது விசையை பெற முடியவில்லை." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "நிறுவப்படவில்லை" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "%s - %s திறக்க முடியவில்லை\n" #~ msgid "Serbia and Montenegro" #~ msgstr "செர்பியா மற்றும் மான்டநெக்ரோ" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "தெரியாத பட்டியல் விருப்பத்தேர்வு" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "சார்புத்தன்மைகளை தீர்க்க முடியவில்லை" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s கோப்பிற்கு செக்சம் இல்லை.\n" #~ "அவ்வாறிருந்தும் அக்கோப்பை பயன்படுத்தலாமா?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s கோப்பு, பின்வரும் கீயுடன் நேர்மை சோதனையில் தோல்வியுற்றது:\n" #~ "%s|%s|%s\n" #~ "அவ்வாறிருந்தும் அக்கோப்பை பயன்படுத்தலாமா?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s கோப்பிற்கு செல்லாத ஒரு செக்சம் உள்ளது.\n" #~ "எதிர்பார்த்தது %s, கண்டது %s\n" #~ "அவ்வாறிருந்தும் அக்கோப்பை பயன்படுத்தலாமா?" #, fuzzy #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s கோப்பிற்கு அறியப்படாத ஒரு செக்சம் உள்ளது.\n" #~ "அவ்வாறிருந்தும் அக்கோப்பை பயன்படுத்தலாமா?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "%s கோப்பு கையொப்பமிடப்படவில்லை.\n" #~ "அவ்வாறிருந்தும் அதனை பயன்படுத்தலாமா?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "%s கோப்பு அறிந்திராத ஒரு கீயினால் கையொப்பமிடப்பட்டுள்ளது:\n" #~ "%s|%s|%s\n" #~ "அவ்வாறிருந்தும் அக்கோப்பை பயன்படுத்தலாமா?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "நம்பகத்தன்மையற்ற கீ கண்டுபிடிக்கப்பட்டுள்ளது:\n" #~ "%s|%s|%s\n" #~ "கீயை நம்பலாமா?" #~ msgid "%s remove failed" #~ msgstr "%s நீக்குதல் தோல்வியுற்றது" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "கணத்தை மாற்று" #~ msgid "rpm output:" #~ msgstr "ஆர்பிஎம் அவுட்புட்:" #~ msgid "%s install failed" #~ msgstr "%s நிறுவுதல் தோல்வியுற்றது" #~ msgid "%s installed ok" #~ msgstr "%s நிறுவுதல் சரியானது" #~ msgid "%s remove ok" #~ msgstr "%s நீக்குதல் சரியானது" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "" #~ "இச்சார்புத்தன்மையை %s அளிக்கிறது ஆனால், நிறுவப்பட்டுள்ள பொருளின் கட்டமைப்பை " #~ "மாற்றிவிடும்" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "" #~ "இச்சார்புத்தன்மையை %s அளிக்கிறது ஆனால், நிறுவப்பட்டுள்ள பொருளின் கட்டமைப்பை " #~ "மாற்றிவிடும்" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "தொடர்புள்ள தீர்வுகளை நிறுவவோ அல்லது நீக்கவோ வேண்டாம்" #~ msgid "Ignore that %s is already set to install" #~ msgstr "‍‍ஏற்கனவே நிறுவுவதற்காக அமைக்கப்பட்டுள்ள %sஐ புறக்கணிக்கவும்" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "%sல் உள்ள வழக்கில் இல்லாத %sஐ புறக்கணிக்கவும்" #~ msgid "Ignore this conflict of %s" #~ msgstr "%sன் முரண்பாட்டை புறக்கணிக்கவும்" #~ msgid "Ignore this requirement just here" #~ msgstr "இத்தேவையை இங்கேயே புறக்கணிக்கவும்" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "அது கட்டமைப்பை மாற்றக்கூடுமென்றாலும் %sஐ நிறுவவும்" #~ msgid "Install missing resolvables" #~ msgstr "­ò¾¡Ä¢Âý" #~ msgid "Keep resolvables" #~ msgstr "தீர்வுகளை வைத்துக் கொள்ளவும்" #~ msgid "Unlock these resolvables" #~ msgstr "இத்தீர்வுகளைத் திறக்கவும்" #~ msgid "delete %s" #~ msgstr "%s ஐ நீக்கவும்" #~ msgid "install %s" #~ msgstr "%sஐ நிறுவவும்" #~ msgid "unlock %s" #~ msgstr "%sஐ திறக்கவும்" #~ msgid "unlock all resolvables" #~ msgstr "­ò¾¡Ä¢Âý" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "கோப்பை %1 திறக்க முடியவில்லை." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "%u பிரிவை படிப்பதில் பிழை." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "இந்த யூஆர்எல்லுக்கு பாதை அளவீடு விளக்கம் ஆதரவளிக்கப்படவில்லை" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "இந்த யூஆர்எல்லுக்கு பாதை அளவீடு விளக்கம் ஆதரவளிக்கப்படவில்லை" #~ msgid "Software management is already running." #~ msgstr "மென்பொருள் நிர்வாகம் ஏற்கனவே இயக்கத்திலுள்ளது." #~ msgid "%s is replaced by %s" #~ msgstr "%s %sஆல் மாற்றியமைக்கப்பட்டது" #~ msgid "%s replaced by %s" #~ msgstr "%s %sஆல் மாற்றியமைக்கப்பட்டது" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "இத்தீர்வுகள் அமைப்பிலிருந்து நீக்கப்படும்" #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "அது இன்னமும் தேவைப்படுவதால், %s நீக்கப்பட மாட்டாது" #~ msgid "Invalid information" #~ msgstr "செல்லாத தகவல்" #~ msgid "%s is needed by other resolvables" #~ msgstr "மற்ற தீர்வுகளுக்கு %s தேவைப்படுகிறது" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%sக்கு தேவைப்படுவது:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s மற்ற தீர்வுகளுடன் முரண்படுகிறது" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%sஉடன் முரண்படுவது:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s மற்ற தீர்வுகளை வழக்கற்றதாக்குகிறது" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "இத்தீர்வுகள் அமைப்பிலிருந்து நீக்கப்படும்" #~ msgid "%s depends on other resolvables" #~ msgstr "%s மற்ற தீர்வுகளை சார்ந்துள்ளது" #~ msgid "%s depends on %s" #~ msgstr "%s %sஐ சார்ந்துள்ளது" #~ msgid "%s depends on:%s" #~ msgstr "%s %sஐ சார்ந்துள்ளது:" #~ msgid "Child of" #~ msgstr "இதன் உருவாக்கம்" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "இத்தேவையை பூர்த்தி செய்யும் ஆதாரம் எதுவும் இல்லை" #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "இத்தீர்வின் மேலே மற்றும் கீழே விளக்கப்பட்டுள்ள பிரச்னைகள், அனைத்து சார்புத்தன்மைகளையும் " #~ "தீர்க்கக்கூடியவை அல்ல" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%s ஐ நிறுவ இயலவில்லை ஏனெனில் அது %s உடன் முரண்படுகிறது" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s நிறுவப்படவில்லை மற்றும் அது நிறுவ இயலாததாக குறிக்கப்பட்டுள்ளது" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s தீர்க்கப்படாத தேவைகளைக் கொண்டுள்ளது" #~ msgid "%s has missing dependencies" #~ msgstr "%s காணப்படாத சார்புத்தன்மைகளைக் கொண்டுள்ளது" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "காணப்படாத சார்புத்தன்மைகள் %sஐ காரணமாக நிறுவ இயலாது" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s சார்புத்தன்மைகளை %s பூர்த்தி செய்யும் ஆனால் நிறுவுதல் நீக்கப்பட்டுவிடும்" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "%s சார்புத்தன்மைகளை %s பூர்த்தி செய்யும் ஆனால் உங்கள் அமைப்பில் வைக்கப்படும்" #~ msgid "No need to install %s" #~ msgstr "%sஐ நிறுவத் தேவையில்லை" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "%sன் சார்புத்தன்மைகளை பூர்த்தி செய்வதற்கு %sஐ நிறுவ இயலவில்லை" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "%sன் சார்புத்தன்மைகளை பூர்த்தி செய்வதற்கு %sஐ நிறுவ இயலவில்லை" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "அது இன்னமும் தேவைப்படுவதால், %s நீக்கப்பட மாட்டாது" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "" #~ "%sஐ %s வழக்கற்றதாக்கிவிடும். ஆனால் %sஐ நீக்க முடியாது ஏனெனில் அது பூட்டப்பட்டுள்ளது." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "%sஐ நிறுவ முடியாது ஏனெனில் அது முரணானது" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s உடன் உள்ள முரண்பாடு காரணமாக %sன் நிறுவுதலை நீக்க முடியாது" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "%sஐ புதுப்பிக்கும்போது %sக்காக %s தேவைப்‍படும்போது" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s க்கான தேவையை %s இழந்துள்ளது" #~ msgid ", Action: " #~ msgstr ", செயல்பாடு:" #~ msgid ", Trigger: " #~ msgstr ", தூண்டுதல்:" #~ msgid "package" #~ msgstr "பேக்கேஜ்" #~ msgid "selection" #~ msgstr "தேர்வு" #~ msgid "pattern" #~ msgstr "வடிவம்" #~ msgid "product" #~ msgstr "பொருள்" #~ msgid "patch" #~ msgstr "பாட்ச்" #~ msgid "script" #~ msgstr "உரை" #~ msgid "message" #~ msgstr "தகவல்" #~ msgid "atom" #~ msgstr "அணு" #~ msgid "system" #~ msgstr "சாதனம்" #~ msgid "Resolvable" #~ msgstr "தீர்வு" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "இத்தீர்வு முயற்சி செல்லாததாக குறிக்கப்படுகிறது" #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "இத்தீர்வு %s நிறுவக்கூடியதல்ல என்று குறிக்கப்படுகிறது" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s நிறுவப்படுவதற்காக திட்டமிடப்பட்டுள்ளது, ஆனால் சார்புத்தன்மை பிரச்னைகள் காரணமாக இது " #~ "சாத்தியமில்லை." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "நிறுவுதல் நீக்கப்பட வேண்டியது என்று ஏற்கனவே குறிக்கப்பட்டிருப்பதால், %sஐ நிறுவஇயலவில்லை" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "இந்த சாதனத்திற்கு பொருந்தாமல் இருப்பதால், %sஐ நிறுவ இயலவில்லை" #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "நிறுவுப்பட வேண்டியது என்று ஏற்கனவே குறிக்கப்பட்டிருப்பதால், %s ஐ நிறுவ \n" #~ "இயலவில்லை" #~ msgid "This would invalidate %s." #~ msgstr "இது, %sஐ செல்லாததாக்கிவிடும்." #~ msgid "Establishing %s" #~ msgstr "%s அமைக்கப்படுகிறது" #~ msgid "Installing %s" #~ msgstr "%s நிறுவப்படுகிறது" #~ msgid "Updating %s to %s" #~ msgstr "%s லிருந்து %sக்கு புதுப்பித்தல்" #~ msgid "Skipping %s: already installed" #~ msgstr "%s விடப்படுகிறது: ஏற்கவே நிறுவப்பட்டுவிட்டது" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "%sக்கான நிறுவப்பட்ட மாற்று அளிப்பவர்கள் இல்லை" #~ msgid "for %s" #~ msgstr "%sக்காக" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "%sக்கு மேம்படுத்திக் கொள்ளவும், %sஐ நீக்குதல் இயலாது" #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அது நிறுவுதல் நீக்கப்படுவதற்கு திட்டமிடப்பட்டுள்ளது" #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால், %sன் மற்றொரு வடிவம் ஏற்கனவே நிறுவப்பட்டுவிட்டது" #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s, %sஐ அளிக்கிறது, ஆனால், அதன் நிறுவுதலை நீக்க இயலாது. கூடுதல் விவரங்களுக்கு, " #~ "அதனைத் தானாகவே நிறுவம முயற்சிக்கவும்." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அது பூட்டப்பட்டுள்ளது." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அது வைக்கப்படுவதற்கு திட்டமிடப்பட்டுள்ளது." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s, %sஐ அளிக்கிறது, ஆனால் அதற்கு வேறொரு கட்டமைப்பு உள்ளது." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "%s க்கான %sன் தேவையைப் பூர்த்தி செய்ய இயலாது" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "மற்றொரு நிறுவப்பட்டுள்ள தீர்வுக்கு %s தேவைப்படுகிறது, எனவே அதன இணைப்பு நீக்கப்பட " #~ "மாட்டாது." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "மற்றொரு நிறுவப்பட்டுள்ள தீர்வுக்கு %s தேவைப்படுகிறது, எனவே அதன இணைப்பு நீக்கப்பட " #~ "மாட்டாது." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "" #~ "%s (%s) மீதான ஒரு முரண்பாட்டிற்கு, நிறுவப்படப்போகும் %sன் நீக்கம் தேவைப்படுகிறது." #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "%s மீதான ஒரு முரண்பாடு காரணமாக %s நிறுவப்பட முடியாததாக குறிக்கப்பட்டுள்ளது" #~ msgid "from %s" #~ msgstr "%sலிருந்து" #~ msgid " Error!" #~ msgstr "பிழை!" #~ msgid " Important!" #~ msgstr "முக்கியம்!" #~ msgid "%s depended on %s" #~ msgstr "%s, %sஐ சார்ந்துள்ளது" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s, %sக்கு தேவைப்படுகிறது" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s, %sக்கு தேவைப்படுகிறது" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s %sஆல் மாற்றியமைக்கப்பட்டது" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s, %sக்கு தேவைப்படுகிறது" #~ msgid "%s part of %s" #~ msgstr "%s, %sன் ஒரு பகுதியாகும்" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s, %sக்கு தேவைப்படுகிறது" #~ msgid "Unable to parse Url authority" #~ msgstr "யூஆர்எல் அதிகாரத்தை விளக்க இயலவில்லை" #~ msgid "Ignore this requirement generally" #~ msgstr "இத்தேவையை பொதுவாக புறக்கணிக்கவும்" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "மற்றொரு நிறுவப்படப்போகும் தீர்வுக்கு %s தேவைப்படுகிறது, எனவே அதன் இணைப்பு நீக்கப்பட " #~ "மாட்டாது." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "" #~ " புதுப்பிக்கப்பட்ட நிறுவுதலை மேற்கொள்வதற்கு தேவைப்படும் கோப்பை உருவாக்க இயலவில்லை." #~ msgid "Unable to restore all sources." #~ msgstr "அனைத்து ஆதாரங்களையும் மீட்க முடியவில்லை" #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "ஒரு ஆதாரமேனும் ஏற்கனவே பதிவு செய்யப்பட்டுள்ளது, சேமிக்கப்பட்ட ஆதாரங்களைமீட்க இயலாது." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "%sன் சார்புத்தன்மைகளை பூர்த்தி செய்வதற்கு %s நிறுவப்படுவதற்கு இயலவில்லை" #~ msgid "%s dependend on %s" #~ msgstr "%s, %sஐ சார்ந்துள்ளது" #~ msgid "Reading index files" #~ msgstr "உள்ளடக்க கோப்புகள் படிக்கப்படுகின்றன" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "கையாப்பமிடப்பட்ட repomd.xml கோப்பு, கையொப்ப சோதனையில் தோல்வியுற்றது." #~ msgid "Reading product from %s" #~ msgstr "%sலிருந்து பொருள் படிக்கப்படுகிறது" #~ msgid "Reading filelist from %s" #~ msgstr "%sலிருந்து கோப்புப்பட்டியல் படிக்கப்படுகிறது" #~ msgid "Reading packages from %s" #~ msgstr "%sலிருந்து பேக்கேஜ்கள் படிக்கப்படுகின்றன" #~ msgid "Reading selection from %s" #~ msgstr "%sலிருந்து தேர்வுகள் படிக்கப்படுகின்றன" #~ msgid "Reading pattern from %s" #~ msgstr "%sலிருந்து வடிவம் படிக்கப்படுகிறது" #~ msgid "Reading patches index %s" #~ msgstr "பாட்ச்களின் உள்ளடக்கம் %s படிக்கப்படுகிறது" #~ msgid "Reading patch %s" #~ msgstr "பாட்ச் %s படிக்கப்படுகிறது" #~ msgid "The script file failed the checksum test." #~ msgstr "சோதனைத் தேர்வில் உரை கோப்பு தோல்வியுற்றது" #~ msgid "Reading packages file" #~ msgstr "பேக்கேஜ்கள் கோப்பு படிக்கப்படுகிறது" #~ msgid "Reading translation: %s" #~ msgstr "மொழிபெயர்ப்பு படிக்கப்படுகிறது: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "நேர்மை சோதனையில் %s பேக்கேஜ் தோல்வியுற்றது. அதனை தகவலிறக்கம் செய்வதற்குநீங்கள் மீண்டும் " #~ "முயற்சிக்கப் போகிறீர்களா அல்லது நிறுவுதலை நிறுத்திவிடப் போகிறீர்களா?" #~ msgid " miss checksum." #~ msgstr "செக்சம் தவறியது." #~ msgid " fails checksum verification." #~ msgstr "செக்சம் சரிபார்ப்பில் தோல்வியுற்றது." #~ msgid "Downloading %s" #~ msgstr "%s தகவலிறக்கம் செய்யப்படுகிறது" libzypp-17.36.5/po/th.po000066400000000000000000003513501476576476200150160ustar00rootroot00000000000000# Thai message file for YaST2 (@memory@). # Copyright (C) 2008 SUSE Linux Products GmbH. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2008-01-04 08:58+0100\n" "Last-Translator: i18n@suse.de\n" "Language-Team: Thai \n" "Language: th\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" #: zypp/CountryCode.cc:50 #, fuzzy msgid "Unknown country: " msgstr "ไม่ทราบประเทศ: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 #, fuzzy msgid "No Code" msgstr "ไม่มีรหัส" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "อันดอร์รา" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "สหรัฐอาหรับเอมิเรตส์" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "อัฟกานิสถาน" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "แอนติกาและบาร์บูดา" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "แองกวิลลา" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "แอลเบเนีย" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "อาร์เมเนีย" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "เนเธอร์แลนด์แอนทิลลีส" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "แองโกลา" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "แอนตาร์กติกา" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "อาร์เจนตินา" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "อเมริกันซามัว" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "ออสเตรีย" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "ออสเตรเลีย" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "อรูบา" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "หมู่เกาะเอแลนด์" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "อาเซอร์ไบจาน" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "บอสเนียและเฮอร์เซโกวินา" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "บาร์เบโดส" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "บังกลาเทศ" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "เบลเยียม" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "บูร์กินาฟาโซ" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "บัลแกเรีย" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "บาห์เรน" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "บุรุนดี" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "เบนิน" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "เบอร์มิวดา" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "บรูไนดารุสซาลาม" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "โบลิเวีย" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "บราซิล" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "บาฮามาส" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "ภูฏาน" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "เกาะบูเว" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "บอตสวานา" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "เบลารุส" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "เบลีซ" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "แคนาดา" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "หมู่เกาะโคโคส (คีลิง)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "คองโก" #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "สาธารณรัฐแอฟริกากลาง" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "สวิตเซอร์แลนด์" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "โกตดิวัวร์" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "หมู่เกาะคุก" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "ชิลี" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "แคเมอรูน" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "จีน" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "โคลอมเบีย" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "คอสตาริกา" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "คิวบา" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "กาบูเวร์ดี" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "เกาะคริสต์มาส" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "ไซปรัส" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "สาธารณรัฐเช็ก" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "เยอรมนี" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "จิบูตี" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "เดนมาร์ก" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "โดมินิกา" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "สาธารณรัฐโดมินิกัน" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "แอลจีเรีย" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "เอกวาดอร์" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "เอสโตเนีย" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "อียิปต์" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "ซาฮาราตะวันตก" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "เอริเทรีย" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "สเปน" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "เอธิโอเปีย" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "ฟินแลนด์" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "ฟีจี" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "หมู่เกาะฟอล์กแลนด์ (มัลบินัส)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "สหพันธรัฐไมโครนีเซีย" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "หมู่เกาะแฟโร" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "ฝรั่งเศส" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "ฝรั่งเศสแผ่นดินใหญ่" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "กาบอน" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "สหราชอาณาจักร" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "เกรนาดา" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "จอร์เจีย" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "เฟรนช์เกียนา" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "เกิร์นซีย์" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "กานา" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "ยิบรอลตา" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "กรีนแลนด์" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "แกมเบีย" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "กินี" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "กวาเดอลูป" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "อิเควทอเรียลกินี" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "กรีซ" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "กัวเตมาลา" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "กวม" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "กินี-บิสเซา" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "กายอานา" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "ฮ่องกง" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "เกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "ฮอนดูรัส" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "โครเอเชีย" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "เฮติ" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "ฮังการี" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "อินโดนีเซีย" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "ไอร์แลนด์" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "อิสราเอล" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "เกาะแมน" #: zypp/CountryCode.cc:261 msgid "India" msgstr "อินเดีย" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "บริติชอินเดียนโอเชียนเทร์ริทอรี" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "อิรัก" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "อิหร่าน" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "ไอซ์แลนด์" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "อิตาลี" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "เจอร์ซีย์" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "จาเมกา" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "จอร์แดน" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "ญี่ปุ่น" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "เคนยา" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "คีร์กีซน" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "กัมพูชา" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "คิริบาส" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "คอโมโรส" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "เซนต์คิตส์และเนวิส" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "เกาหลีเหนือ" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "เกาหลีใต้" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "คูเวต" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "หมู่เกาะเคย์แมน" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "คาซัคสถาน" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "สาธารณรัฐประชาธิปไตยประชาชนลาว" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "เลบานอน" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "เซนต์ลูเซีย" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "ลิกเตนสไตน์" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "ศรีลังกา" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "ไลบีเรีย" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "เลโซโท" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "ลิทัวเนีย" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "ลักเซมเบิร์ก" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "ลัตเวีย" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "ลิเบีย" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "โมร็อกโก" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "โมนาโค" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "มอลโดวา" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "มอนติเนโกร" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "ซานมาริโน" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "มาดากัสการ์" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "หมู่เกาะมาแชลล์" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "มาซิโดเนีย" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "มาลี" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "พม่า" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "มองโกเลีย" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "มาเก๊า" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "หมู่เกาะมาเรียนาเหนือ" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "มาร์ตินีก" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "มอริเตเนีย" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "มอนต์เซอร์รัต" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "มอลตา" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "มอริเชียส" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "มัลดีฟส์" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "มาลาวี" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "เม็กซิโก" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "มาเลเซีย" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "โมซัมบิก" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "นามิเบีย" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "นิวแคลิโดเนีย" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "ไนเจอร์" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "เกาะนอร์ฟอล์ก" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "ไนจีเรีย" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "นิการากัว" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "เนเธอร์แลนด์" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "นอร์เวย์" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "เนปาล" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "นาอูรู" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "นีอูเอ" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "นิวซีแลนด์" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "โอมาน" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "ปานามา" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "เปรู" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "เฟรนช์โปลินีเซีย" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "ปาปัวนิวกินี" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "ฟิลิปปินส์" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "ปากีสถาน" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "โปแลนด์" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "แซงปีแยร์และมีเกอลง" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "เกาะพิตแคร์น" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "เปอร์โตริโก" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "ดินแดนปาเลสไตน์" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "โปรตุเกส" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "ปาเลา" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "ปารากวัย" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "กาตาร์" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "เรอูนียง" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "โรมาเนีย" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "เซอร์เบีย" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "สหพันธรัฐรัสเซีย" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "รวันดา" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "ซาอุดีอาระเบีย" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "หมู่เกาะโซโลมอน" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "เซเชลส์" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "ซูดาน" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "สวีเดน" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "สิงคโปร์" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "เซนต์เฮเลนา" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "สโลวีเนีย" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "สฟาลบาร์และยานไมเอน" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "สโลวะเกีย" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "เซียร์ราลีโอน" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "ซานมาริโน" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "เซเนกัล" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "โซมาเลีย" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "ซูรินาม" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "เซาตูเมและปรินซีปี" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "เอลซัลวาดอร์" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "ซีเรีย" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "สวาซิแลนด์" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "หมู่เกาะเติกส์และหมู่เกาะเคคอส" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "ชาด" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "เฟรนช์เซาเทิร์นเทร์ริทอรีส์" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "โตโก" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "ไทย" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "ทาจิกิสถาน" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "โตเกเลา" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "เติร์กเมนิสถาน" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "ตูนิเซีย" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "ตองกา" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "ติมอร์ตะวันออก" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "ตุรกี" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "ตรินิแดดและโตเบโก" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "ตูวาลู" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "ไต้หวัน" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "แทนซาเนีย" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "ยูเครน" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "ยูกันดา" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "เกาะเล็กรอบนอกของสหรัฐอเมริกา" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "สหรัฐอเมริกา" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "อุรุกวัย" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "อุซเบกิสถาน" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "สันตะสำนัก (นครรัฐวาติกัน)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "เซนต์วินเซนต์และเกรนาดีนส์" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "เวเนซุเอลา" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "หมู่เกาะบริติชเวอร์จิน" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "หมู่เกาะเวอร์จินของสหรัฐอเมริกา" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "เวียดนาม" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "วานูอาตู" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "วาลลิสและฟุตูนา" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "ซามัว" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "เยเมน" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "มายอต" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "แอฟริกาใต้" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "แซมเบีย" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "ซิมบับเว" #: zypp/Dep.cc:96 msgid "Provides" msgstr "มอบ" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "สิ่งที่ต้องมีก่อน" #: zypp/Dep.cc:98 msgid "Requires" msgstr "ต้องการ" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "ขัดแย้ง" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "ล้าสมัย" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "แนะนำ" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "อาจเกี่ยวข้อง" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "ขยาย" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "เสริม" #: zypp/LanguageCode.cc:49 #, fuzzy msgid "Unknown language: " msgstr "ภาษาที่ไม่รู้จัก: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "อาฟรีกานส์" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 #, fuzzy msgid "Albanian" msgstr "แอลเบเนีย" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "อัลไตใต้" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "อารบิก" #. language code: arc #: zypp/LanguageCode.cc:203 #, fuzzy msgid "Aramaic" msgstr "แอราเมอิก" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 #, fuzzy msgid "Armenian" msgstr "อาร์เมเนีย" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 #, fuzzy msgid "Azerbaijani" msgstr "อาเซอร์ไบจาน" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 #, fuzzy msgid "Balinese" msgstr "บาหลี" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 #, fuzzy msgid "Belarusian" msgstr "เบลารุส" #. language code: bem #: zypp/LanguageCode.cc:261 #, fuzzy msgid "Bemba" msgstr "&Membase" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "เบงกาลี" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "บอสเนีย" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "" #. language code: btk #: zypp/LanguageCode.cc:287 #, fuzzy msgid "Batak (Indonesia)" msgstr "อินโดนีเซีย" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "บัลแกเรีย" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "คาตาลัน" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 #, fuzzy msgid "Chechen" msgstr "ตรวจสอบ" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 #, fuzzy msgid "Chinese" msgstr "จีน" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 #, fuzzy msgid "Cheyenne" msgstr "กาแยน" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "เช็ก" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "เดนมาร์ก" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 #, fuzzy msgid "Delaware" msgstr "ฮาร์ดแวร์" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 #, fuzzy msgid "Lower Sorbian" msgstr "เซอร์เบียต่ำ" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "ดัตช์" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 #, fuzzy msgid "English" msgstr "อังกฤษ" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "เอสโตเนีย" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 #, fuzzy msgid "Faroese" msgstr "หมู่เกาะแฟโร" #. language code: fat #: zypp/LanguageCode.cc:433 #, fuzzy msgid "Fanti" msgstr "แอตแลนติก" #. language code: fij fj #: zypp/LanguageCode.cc:435 #, fuzzy msgid "Fijian" msgstr "ฟิจิ" #. language code: fil #: zypp/LanguageCode.cc:437 #, fuzzy msgid "Filipino" msgstr "ฟิลิปปินส์" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "ฟินแลนด์" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "ฝรั่งเศส" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 #, fuzzy msgid "Ga" msgstr "กวม" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 #, fuzzy msgid "Germanic (Other)" msgstr "เยอรมัน (อื่นๆ)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 #, fuzzy msgid "Georgian" msgstr "จอร์เจีย" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "เยอรมัน" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "คุชราต" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "ไฮติ" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "ฮิบรู" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "ฮินดี" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 #, fuzzy msgid "Upper Sorbian" msgstr "เซอร์เบียบน" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "ฮังการี" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "ไอซ์แลนด์" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "ลิทัวเนีย" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 #, fuzzy msgid "Interlingue" msgstr "เขตภายในเครือข่าย" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "อินโดนีเซีย" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "อิตาลี" #. language code: jav jv #: zypp/LanguageCode.cc:579 #, fuzzy msgid "Javanese" msgstr "ชวา" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "ญี่ปุ่น" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 #, fuzzy msgid "Kachin" msgstr "การาจี" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 #, fuzzy msgid "Kannada" msgstr "แคนาดา" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 #, fuzzy msgid "Kazakh" msgstr "คาซัคสถาน" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "เขมร" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 #, fuzzy msgid "Kongo" msgstr "คองโก" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "เกาหลี" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 #, fuzzy msgid "Lao" msgstr "ลาว" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "ละติน" #. language code: lav lv #: zypp/LanguageCode.cc:665 #, fuzzy msgid "Latvian" msgstr "ลัตเวีย" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "ลักเซมเบิร์ก" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "ลิทัวเนีย" #. language code: lol #: zypp/LanguageCode.cc:675 #, fuzzy msgid "Mongo" msgstr "มองโก" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "ลักเซมเบิร์ก" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 #, fuzzy msgid "Ganda" msgstr "กันดา" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 #, fuzzy msgid "Lunda" msgstr "ลูนดา" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "มาซิโดเนีย" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 #, fuzzy msgid "Marshallese" msgstr "มาร์แชลล์" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 #, fuzzy msgid "Malayalam" msgstr "มาลายาลัม" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "มันดิงกา" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "เมารี" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "มราฐี" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "มาเลย์" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "ไอริชกลาง (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "มาดากัสการ์" #. language code: mlt mt #: zypp/LanguageCode.cc:745 #, fuzzy msgid "Maltese" msgstr "มอลตา" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "มอลโดวา" #. language code: mon mn #: zypp/LanguageCode.cc:757 #, fuzzy msgid "Mongolian" msgstr "มองโกเลีย" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "หลายภาษา" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "" #. language code: mus #: zypp/LanguageCode.cc:765 #, fuzzy msgid "Creek" msgstr "มัสคีกี" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "นาวาโฮ" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 #, fuzzy msgid "Ndonga" msgstr "ตองกา" #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "เยอรมันต่ำ" #. language code: nep ne #: zypp/LanguageCode.cc:793 #, fuzzy msgid "Nepali" msgstr "เนปาล" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 #, fuzzy msgid "Niuean" msgstr "นีวเว" #. language code: nno nn #: zypp/LanguageCode.cc:803 #, fuzzy msgid "Norwegian Nynorsk" msgstr "นอร์เวย์นีนอสก์" #. language code: nob nb #: zypp/LanguageCode.cc:805 #, fuzzy msgid "Norwegian Bokmal" msgstr "นอร์เวย์บุคมอล" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "โนไก" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "นอร์สโบราณ" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "นอร์เวย์" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "โซโทเหนือ" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "เนียมเวซี" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "เนียนโกเล" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "นิโอโร" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "นซิมา" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "อ็อกซิตัน (หลัง 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "โอจิบวา" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "โอดิยา" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "โอโรโม" #. language code: osa #: zypp/LanguageCode.cc:837 #, fuzzy msgid "Osage" msgstr "โอซากี" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "ออสเซเตีย" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "ตุรกีออตโตมัน (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "ปังกาซีนัน" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "ปะห์ลาวี" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "ปัมปังกา" #. language code: pan pa #: zypp/LanguageCode.cc:853 #, fuzzy msgid "Panjabi" msgstr "ปัญจาบ" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 #, fuzzy msgid "Palauan" msgstr "ปาเลา" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "เปอร์เซียโบราณ (ประมาณ 600-400 B.C." #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 #, fuzzy msgid "Persian" msgstr "เปอร์เซีย" #. language code: phi #: zypp/LanguageCode.cc:865 #, fuzzy msgid "Philippine (Other)" msgstr "ฟิลิปปินส์ (อื่นๆ)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "โปแลนด์" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "โปรตุเกส" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "ญี่ปุ่น" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "โรมาเนีย" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "โรมาเนีย" #. language code: run rn #: zypp/LanguageCode.cc:901 #, fuzzy msgid "Rundi" msgstr "บุรุนดี" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "รัสเซีย" #. language code: sad #: zypp/LanguageCode.cc:905 #, fuzzy msgid "Sandawe" msgstr "รวันด้า" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "เซอร์เบีย" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "โครเอเชีย" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" #. language code: shn #: zypp/LanguageCode.cc:943 #, fuzzy msgid "Shan" msgstr "เซี่ยงไฮ้" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "สิงหล" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "สโลวะเกีย" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "สโลวีเนีย" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 #, fuzzy msgid "Lule Sami" msgstr "ชื่อโมดูล" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 #, fuzzy msgid "Samoan" msgstr "ซามัว" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 #, fuzzy msgid "Somali" msgstr "โซมาเลีย" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "สเปน" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "สวีเดน" #. language code: syr #: zypp/LanguageCode.cc:1011 #, fuzzy msgid "Syriac" msgstr "ซีเรีย" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "" #. language code: tai #: zypp/LanguageCode.cc:1015 #, fuzzy msgid "Tai (Other)" msgstr "อื่น ๆ" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "ทมิฬ" #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "กาต้าร์" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 #, fuzzy msgid "Tajik" msgstr "ทาจีกิสถาน" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "ไทย" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 #, fuzzy msgid "Tonga (Tonga Islands)" msgstr "หมู่เกาะโซโลมอน" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 #, fuzzy msgid "Tswana" msgstr "บอตสวานา" #. language code: tso ts #: zypp/LanguageCode.cc:1063 #, fuzzy msgid "Tsonga" msgstr "ตองก้า" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "ตุรกี" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "ตุรกี" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "ยูเครน" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 #, fuzzy msgid "Uzbek" msgstr "อุซเบกิสถาน" #. language code: vai #: zypp/LanguageCode.cc:1097 #, fuzzy msgid "Vai" msgstr "วาติกัน" #. language code: ven ve #: zypp/LanguageCode.cc:1099 #, fuzzy msgid "Venda" msgstr "ผู้ผลิต" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "เวียดนาม" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "เวลส์" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "วัลลูน" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "โคซา" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 #, fuzzy msgid "Yoruba" msgstr "โยรูบา" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "ซูลู" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 #, fuzzy msgid "Following actions will be done:" msgstr "จะมีการดำเนินการตามขั้นตอนต่อไปนี้:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "ไม่ทราบ" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 #, fuzzy msgid "invalid" msgstr "ค่าเวลาใช้งานไม่ได้" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 #, fuzzy msgid "Unknown support option. Description not available" msgstr "ไม่มีรายละเอียด" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "โหมดที่ไม่รู้จัก" #: zypp/base/StrMatcher.cc:153 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "ไม่ทราบค่าของพารามิเตอร์ %1" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "รูปแบบการค้นหา (RegExp)" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "ไม่สามารถสร้างไดเรกทอรี " #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "ไม่สามารถเปิดใช้งานบริการ '%1' ได้" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "ล้มเหลวในการคืนค่าส่วน MBR ของฮาร์ดดิสก์" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, fuzzy, c-format, boost-format msgid "Building repository '%s' cache" msgstr "การเพิ่มคลังแพกเกจ %1 ล้มเหลว" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 #, fuzzy msgid "Unhandled repository type" msgstr "ชื่อของคลังแพกเกจใช้งานไม่ได้" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, fuzzy, c-format, boost-format msgid "Adding repository '%s'" msgstr "กำลังเพิ่มคลังแพกเกจ %1" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "ค่าสำหรับตัวเลือก '%1' ไม่ถูกต้อง: %2" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "ไม่รู้จักตัวเลือกสำหรับคำสั่ง '%1': %2" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "ไม่สามารถสร้างไดเรกทอรี '%1' ได้" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "กำลังตรวจคลังแพกเกจ " #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "ไม่สามารถเปิดใช้งานบริการ '%1' ได้" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 #, fuzzy msgid "Can't figure out where the service is stored." msgstr "ไม่สามารถลบบริการได้ เนื่องจากมันยังไม่ถูกติดตั้ง" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "คลังแพกเกจใช้งานไม่ได้" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "ทำต่อไปหรือไม่ ?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "การสร้างแฟ้มสำรองข้อมูลล้มเหลว" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "แพกเกจ %1 เสียหาย การตรวจสอบความถูกต้องล้มเหลว" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "แพกเกจ %1 เสียหาย การตรวจสอบความถูกต้องล้มเหลว" #: zypp/repo/PackageProvider.cc:621 #, fuzzy msgid "applydeltarpm check failed." msgstr "การตรวจความถูกต้องล้มเหลว" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "เลือกคลังแพกเกจ" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "ไม่สามารถสร้างไดเร็กทอรี " #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "การตรวจสอบการขึ้นอยู่แก่กันของระบบ ไม่พบปัญหา" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "การตรวจสอบการขึ้นอยู่แก่กันของระบบ ไม่พบปัญหา" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "การตรวจสอบการขึ้นอยู่แก่กันของระบบ ไม่พบปัญหา" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "อ่านค่าของผู้ให้บริการ" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "เขียนค่าของผู้ให้บริการ" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "เขียนค่าของผู้ให้บริการ" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "รุ่นนี้ถูกติดตั้งไว้บนระบบของคุณ" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 #, fuzzy msgid "Installation has been aborted as directed." msgstr "การติดตั้งเสร็จสมบูรณ์เพียงบางส่วนเท่านั้น" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "การสร้างแฟ้มสำรองข้อมูลล้มเหลว" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "จัดเก็บแฟ้มการปรับแต่งค่า" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "ข้อมูล rpm output เพิ่มเติม" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "ลายเซ็นใช้ได้" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "ลายเช็นไม่ได้รับการตรวจสอบ" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "ลายเซ็นใช้ได้ แต่กุญแตไม่สามารถเชื่อถือได้" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "ยังไม่มีผู้ใช้" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "ยังไม่มีผู้ใช้" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "พยายามนำเข้ากุญแจ %s ที่ไม่มีอยู่จริงเข้าไปในพวงกุญแจ %s" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "ล้มเหลวในการคืนค่าส่วน MBR ของฮาร์ดดิสก์" #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "ล้มเหลวในการคืนค่าส่วน MBR ของฮาร์ดดิสก์" #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "ไม่สามารถเปิด pty (%s) ได้" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "ไม่สามารถเปิด pipe (%s) ได้" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 #, fuzzy msgid "History:" msgstr "ประวัติ:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, fuzzy, c-format, boost-format msgid "Invalid host component '%s'" msgstr "host component '%s' ไม่ถูกต้อง" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, fuzzy, c-format, boost-format msgid "Invalid port component '%s'" msgstr "port component '%s' ไม่ถูกต้อง" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, fuzzy, c-format, boost-format msgid "Command exited with status %d." msgstr "ออกจากคำสั่งด้วยสถานะ %d" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "ไม่สามารถ chdir ไป '%s' (%s) ได้" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "" #: zypp-media/mediaexception.cc:48 #, fuzzy, c-format, boost-format msgid "Bad file name: %s" msgstr "ชื่อแฟ้ม: %1" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "ไม่พบแฟ้มควบคุม %1 บนสื่อการติดตั้ง" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, fuzzy, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "ดาวน์โหลดแฟ้มอิมเมจการติดตั้ง" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, fuzzy, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "เกิดข้อผิดพลาดขึ้นระหว่างทำการสร้างคลังแพกเกจ" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "ไม่สามารถเปิดใช้งานบริการ '%1' ได้" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "ใช่" #: zypp-tui/Table.cc:32 msgid "No" msgstr "ไม่ใช่" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "แจ้งเตือน: " #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "ผิดพลาด" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "เสร็จแล้ว" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "ผิดพลาด" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "แจ้งเตือน: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "กำลังรับข้อมูล:" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "กำลังเริ่ม" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "ไม่พบ" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "ไม่พบข้อความช่วยเหลือของส่วนนี้" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "ไม่พบข้อความช่วยเหลือของตัวเลือกนี้" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ใช่" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ไม่ใช่" #, fuzzy #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "กำลังเรียกใช้คลังแพกเกจสำหรับปรับรุ่นให้ทันสมัย..." #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "สถาปัตยกรรมพื้นฐาน" #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "ผิดพลาด: ไม่สามารถติดตั้งแพกเกจได้" #, fuzzy #~ msgid "Have you enabled all requested repositories?" #~ msgstr "เพิ่มคลังแพกเกจแบบออนไลน์ที่เลือกไว้ทั้งหมด" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "ยังไม่มีบริการ %1 อยู่" #, fuzzy #~ msgid "%s is not installable" #~ msgstr "ไฟร์วอลล์ยังไม่ถูกติดตั้ง" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "ไม่ต้องติดตั้งตัวจัดการการบูตระบบใด ๆ" #, fuzzy #~ msgid "do not install %s" #~ msgstr "ไม่ต้องติดตั้ง" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "บันทึกการตั้งค่าการติดตั้ง" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "ลบอัตโนมัติ" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "บันทึกการตั้งค่าการติดตั้ง" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "ไม่สามารถเปิดแฟ้ม %1 ได้" #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "ไม่ได้เชื่อมต่อ" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "ทดสอบการเชื่อมต่ออินเทอร์เน็ต" #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "ไม่ต้องติดตั้ง" #, fuzzy #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "ดาวน์โหลดแฟ้มอิมเมจการติดตั้ง" #, fuzzy #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "เกิดข้อผิดพลาดขึ้นระหว่างทำการสร้างคลังแพกเกจ" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "ล้มเหลวในการดาวน์โหลดแฟ้ม delta ของแพกเกจ RPM: %1" #~ msgid "Serbia and Montenegro" #~ msgstr "เซอร์เบียและมอนเตเนโกร" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "ผู้รวบรวมเผยแพร่ที่ไม่รู้จัก" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "เพิกเฉยต่อการขึ้นอยู่แก่กันของ %s" #, fuzzy #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "แฟ้ม '%1' \n" #~ "ไม่น่าจะเป็นแฟ้มอิมเมจแบบ ISO \n" #~ "แน่ใจหรือว่าต้องการจะใช้มันจริง ๆ ? \n" #, fuzzy #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "แฟ้ม '%1' \n" #~ "ไม่น่าจะเป็นแฟ้มอิมเมจแบบ ISO \n" #~ "แน่ใจหรือว่าต้องการจะใช้มันจริง ๆ ? \n" #, fuzzy #~ msgid "%s remove ok" #~ msgstr "ลบ % เรียบร้อย" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "ไม่ต้องติดตั้งหรือลบสิ่งที่แก้ไขได้ที่กำลังคำนึงถึง" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "ไม่สามารถเปิดแฟ้ม solv-file:" #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "เกิดข้อผิดพลาดระหว่างเขียนแฟ้ม solv-file: " libzypp-17.36.5/po/tr.po000066400000000000000000004261541476576476200150350ustar00rootroot00000000000000# 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. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2018-01-29 14:07+0000\n" "Last-Translator: Özgür Ateş Fırat \n" "Language-Team: Turkish \n" "Language: tr\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: Weblate 2.18\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Bilinmeyen ülke:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 #, fuzzy msgid "No Code" msgstr "&Kod" # AD #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andora" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Birleşik Arap Emirlikleri" # AF #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antiga ve Barbuda" # AI #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Angula" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Arnavutluk" # AM #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Ermenistan" # AN #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Hollanda Antilleri" # AO #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" # AQ #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antartika" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Arjantin" # AS #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Amerikan Samoası" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Avusturya" # /usr/lib/YaST2/keyboard_raw.ycp:230 #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Avusturalya" # AW #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" # KY #. :ABW:533: #: zypp/CountryCode.cc:173 #, fuzzy msgid "Aland Islands" msgstr "Seyman Adaları" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaycan" # BA #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosna-Hersek" # /usr/lib/YaST2/timezone_raw.ycp:58 #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" # menuentries/menuentry_language.ycp:13 #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladeş" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belçika" # BF #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" # /usr/lib/YaST2/keyboard_raw.ycp:570 #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaristan" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahreyn" # BI #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" # BJ #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" # /usr/lib/YaST2/keyboard_raw.ycp:79 #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" # BN #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Bruney Darüsselam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivya" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brezilya" # BS #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamalar" # BT #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bütan" # BV #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet Adası" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" # BZ #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Kanada" # CC #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Adaları" # CG #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Kongo" # CF #. :COD:180: #: zypp/CountryCode.cc:197 #, fuzzy msgid "Central African Republic" msgstr "Orta Afrika Cumhuriyeti" # /usr/lib/YaST2/keyboard_raw.ycp:169 #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "İsviçre" # CI # fuzzy #. :CHE:756: #: zypp/CountryCode.cc:200 #, fuzzy msgid "Cote D'Ivoire" msgstr "Cote d'Ivoire" # CK #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cook Adaları" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Şili" # CM #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Kamerun" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Çin" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Kolombiya" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Kosta Rika" # CU #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Küba" # CV #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Verde Burnu" # CX #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Christmas Adası" # CY #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Kıbrıs" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Çek Cumhuriyeti" # /usr/lib/YaST2/keyboard_raw.ycp:79 #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Almanya" # /usr/lib/YaST2/timezone_raw.ycp:18 #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Cibuti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Danimarka" # /usr/lib/YaST2/timezone_raw.ycp:76 #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominik Cumhuriyeti" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Cezayir" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ekvator" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonya" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Mısır" # EH #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Batı Sahra" # ER #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritre" # /usr/lib/YaST2/keyboard_raw.ycp:200 #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "İspanya" # ET #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiyopya" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlandiya" # include/nis_server/ui.ycp:45 #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" # FK #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Adaları (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Mikronezya Federal Devletleri" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faroe Adaları" # /usr/lib/YaST2/keyboard_raw.ycp:139 #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Fransa" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" # GA #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" # /usr/lib/YaST2/timezone_raw.ycp:390 #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "İngiltere" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Gürcistan" # GF # fuzzy #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Fransız Guyanası" # /usr/lib/YaST2/keyboard_raw.ycp:79 #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Almanya" # GH #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" # /usr/lib/YaST2/timezone_raw.ycp:384 #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Cebelitarık" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Grönland" # GM #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambiya" # GN #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Gine" # /usr/lib/YaST2/timezone_raw.ycp:85 #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" # GQ #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Ekvatoral Gine" # /usr/lib/YaST2/keyboard_raw.ycp:320 #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Yunanistan" # GS # fuzzy #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Güney Gürcistan ve Güney Sandoviç Adası" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" # GW #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Gine-Bissau" # GY #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" # HM # fuzzy #. :HKG:344: #: zypp/CountryCode.cc:252 #, fuzzy msgid "Heard Island and McDonald Islands" msgstr "Heard Adası and McDonald Adaları" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Hırvatistan" # HT #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" # /usr/lib/YaST2/keyboard_raw.ycp:570 #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Macaristan" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Endonezya" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "İrlanda" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "İsrail" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Man Adası" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Hindistan" # IO #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Hint Okyanusu İngiliz Sömürgeleri" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Irak" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "İzlanda" # /usr/lib/YaST2/keyboard_raw.ycp:230 #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "İtalya" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Jersey" # /usr/lib/YaST2/timezone_raw.ycp:347 #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaika" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Ürdün" # /usr/lib/YaST2/keyboard_raw.ycp:700 #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japonya" # KE #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" # KG # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kırgızistan" # KH #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Kamboçya" # KI #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" # KM #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Komoros" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 #, fuzzy msgid "Saint Kitts and Nevis" msgstr "Sen Kitts ve Nevis" # /usr/lib/YaST2/timezone_raw.ycp:374 #. :KNA:659: #: zypp/CountryCode.cc:277 #, fuzzy msgid "North Korea" msgstr "Kuzey İrlanda" #. :PRK:408: #: zypp/CountryCode.cc:278 #, fuzzy msgid "South Korea" msgstr "Güney Kutbu" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuveyt" # KY #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Seyman Adaları" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakistan" # CD # fuzzy #. :KAZ:398: #: zypp/CountryCode.cc:282 #, fuzzy msgid "Lao People's Democratic Republic" msgstr "Lao Halk Cumhuriyeti" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Lübnan" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 #, fuzzy msgid "Saint Lucia" msgstr "Sen Lusia" # /usr/lib/YaST2/timezone_raw.ycp:407 #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" # LK #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" # LR #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberya" # LS #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesoto" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litvanya" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Lüksemburg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letonya" # LY # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Liberya" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Fas" # /usr/lib/YaST2/timezone_raw.ycp:394 #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monako" # /usr/lib/YaST2/timezone_raw.ycp:381 #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" # CG #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "Kongo" # SM #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "San Marino" # MG #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagaskar" # MH #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marşal Adaları" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Makedonya" # ML #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" # MM #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Miyanmar" # MN #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Moğolistan" # /usr/lib/YaST2/timezone_raw.ycp:207 #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" # MP #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Kuzey Meryem Adaları" # /usr/lib/YaST2/timezone_raw.ycp:99 #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" # MR #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Moritanya" # MS #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Monserat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Mali" # MW #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malavi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Meksika" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malezya" # MZ #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambik" # NA #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibya" # NC #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Yeni İskoçya" # NE #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Nijer" # NF #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk Adası" # NG #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nikaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Hollanda" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norveç" # NP #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" # NU #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Nie" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Yeni Zelenda" # /usr/lib/YaST2/keyboard_raw.ycp:79 #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Umman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" # PF #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Fransız Polinezyası" # PG #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua Yeni Gine" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Flipinler" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Polonya" # PM # fuzzy #. :POL:616: #: zypp/CountryCode.cc:336 #, fuzzy msgid "Saint Pierre and Miquelon" msgstr "Sen Piyer ve Miquelon" # /usr/lib/YaST2/timezone_raw.ycp:456 #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Porto Riko" # IO #. :PRI:630: #: zypp/CountryCode.cc:339 #, fuzzy msgid "Palestinian Territory" msgstr "Hint Okyanusu İngiliz Sömürgeleri" # /usr/lib/YaST2/keyboard_raw.ycp:260 #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portekiz" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" # RE #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romanya" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "Sırpça" # RU #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Rusya Federasyonu" # RW #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Ruanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Suudi Arabistan" # SB #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomon Adaları" # SC #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seyşel Adaları" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" # /usr/lib/YaST2/keyboard_raw.ycp:440 #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "İsveç" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapur" # SH #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sen Helen" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenya" # SJ # fuzzy #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ve Jan Mayen Adaları" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakya" # SL #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" # SM #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" # SN #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" # SO #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somali" # SR #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Surinam" # ST #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Surinam" # SZ #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" # TC # fuzzy #. :SWZ:748: #: zypp/CountryCode.cc:368 #, fuzzy msgid "Turks and Caicos Islands" msgstr "Turks ve Kaykos Adaları" # TD #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Çad" # TF # fuzzy #. :TCD:148: #: zypp/CountryCode.cc:370 #, fuzzy msgid "French Southern Territories" msgstr "Fransa'nın Güney Bölgeleri" # TG #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Tayland" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tacikistan" # TK #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" # TM #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Türkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunus" # TO #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" # clients/online_update.ycp:223 #. :TON:776: #: zypp/CountryCode.cc:378 #, fuzzy msgid "East Timor" msgstr "Hat süresi" # /usr/lib/YaST2/keyboard_raw.ycp:668 #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Türkiye" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad ve Tobako" # TV #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Tuvalu" # TW # fuzzy #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Tayland" #. :TWN:158: #: zypp/CountryCode.cc:383 #, fuzzy msgid "Tanzania" msgstr "Tazmanya" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukrayna" # UG #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" # UM #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" # US #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Birleşik Devletler" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Özbekistan" # VA # fuzzy #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatikan" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 #, fuzzy msgid "Saint Vincent and the Grenadines" msgstr "Sen Vinsınt ve Granadalar" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezüella" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Britanya Virjin Adaları" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Virgin Adaları (U.S.)" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" # VU #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" # WF # fuzzy #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis ve Futuna Adaları" # /usr/lib/YaST2/timezone_raw.ycp:481 #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" # YT #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Güney Afrika" # ZM #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambiya" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 #, fuzzy msgid "Prerequires" msgstr "Öngereklilikler" # clients/hwinfo.ycp:54 #: zypp/Dep.cc:98 msgid "Requires" msgstr "Gerekenler" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Eskitiyor" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Bilinmeyen dil:" # /usr/lib/YaST2/timezone_raw.ycp:31 #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr " Afarca" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abhazya" #. language code: ace #: zypp/LanguageCode.cc:165 #, fuzzy msgid "Achinese" msgstr "Çince" #. language code: ach #: zypp/LanguageCode.cc:167 #, fuzzy msgid "Acoli" msgstr "Sessiz" # clients/support_question.ycp:85 #. language code: ada #: zypp/LanguageCode.cc:169 #, fuzzy msgid "Adangme" msgstr "Aralık" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adigey " #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Asyatik(Diğer)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikanca" # clients/inst_resize_ui.ycp:702 #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Aynu" #. language code: aka ak #: zypp/LanguageCode.cc:181 #, fuzzy msgid "Akan" msgstr "Afrikanca" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Akatça" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Arnavutça" # /usr/lib/YaST2/timezone_raw.ycp:472 #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Aleutça" #. language code: alg #: zypp/LanguageCode.cc:191 #, fuzzy msgid "Algonquian Languages" msgstr "Dil yapılandırılıyor..." #. language code: alt #: zypp/LanguageCode.cc:193 #, fuzzy msgid "Southern Altai" msgstr "Güney Afrika" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amharca" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "İngilizce, Eski Çağ (ca. 450-1100)" # clients/inst_language.ycp:116 #. language code: apa #: zypp/LanguageCode.cc:199 #, fuzzy msgid "Apache Languages" msgstr "Dili ayarla" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arapça" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramice" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonca" # AM #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Ermenice" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Araukanya" # clients/inst_sw_single.ycp:1462 #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Yapay dil (Diğer)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assam " #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturyanca " # clients/inst_language.ycp:116 #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Atabask dilleri" # /usr/lib/YaST2/keyboard_raw.ycp:230 #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Avusturalya Dilleri" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarca" # /usr/lib/YaST2/timezone_raw.ycp:472 #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestaca " #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Abadhi" # MM #. language code: aym ay #: zypp/LanguageCode.cc:233 #, fuzzy msgid "Aymara" msgstr "Miyanmar" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azerice" #. language code: bad #: zypp/LanguageCode.cc:237 #, fuzzy msgid "Banda" msgstr "Kanada" # clients/inst_language.ycp:116 #. language code: bai #: zypp/LanguageCode.cc:239 #, fuzzy msgid "Bamileke Languages" msgstr "Dili ayarla" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Başkurtça" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Beluci " # /usr/lib/YaST2/timezone_raw.ycp:481 #. language code: bam bm #: zypp/LanguageCode.cc:245 #, fuzzy msgid "Bambara" msgstr "Samba" #. language code: ban #: zypp/LanguageCode.cc:247 #, fuzzy msgid "Balinese" msgstr "Çince" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Bask Dili" #. language code: bas #: zypp/LanguageCode.cc:253 #, fuzzy msgid "Basa" msgstr "Temel" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltık (Diğer)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Beca" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Beyaz Rusça" # /usr/lib/YaST2/keyboard_raw.ycp:79 #. language code: bem #: zypp/LanguageCode.cc:261 #, fuzzy msgid "Bemba" msgstr "Bermuda" # SN #. language code: ben bn #: zypp/LanguageCode.cc:263 #, fuzzy msgid "Bengali" msgstr "Senegal" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berberi (Diğer)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri " #. language code: bih bh #: zypp/LanguageCode.cc:269 #, fuzzy msgid "Bihari" msgstr "Bahreyn" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" # BJ #. language code: bin #: zypp/LanguageCode.cc:273 #, fuzzy msgid "Bini" msgstr "Benin" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantu (Diğer)" # BJ #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Boşnakça" # BR #. language code: bra #: zypp/LanguageCode.cc:283 #, fuzzy msgid "Braj" msgstr "Brezilya" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Britanyaca" #. language code: btk #: zypp/LanguageCode.cc:287 #, fuzzy msgid "Batak (Indonesia)" msgstr "Endonezya" # /usr/lib/YaST2/keyboard_raw.ycp:570 #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Buryatça" #. language code: bug #: zypp/LanguageCode.cc:291 #, fuzzy msgid "Buginese" msgstr "Çince" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgarca" # include/scanner/scanner_functions.ycp:114 #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Burmaca" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. language code: byn #: zypp/LanguageCode.cc:299 #, fuzzy msgid "Blin" msgstr "Belçikaca" # TD #. language code: cad #: zypp/LanguageCode.cc:301 #, fuzzy msgid "Caddo" msgstr "Çad" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Merkezi Kızılderili (Diğer)" #. language code: car #: zypp/LanguageCode.cc:305 #, fuzzy msgid "Carib" msgstr "Kart" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Katalanca" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Kafkas (Diğer)" #. language code: ceb #: zypp/LanguageCode.cc:311 #, fuzzy msgid "Cebuano" msgstr "Lübnan" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Kelt (Diğer)" # KM #. language code: cha ch #: zypp/LanguageCode.cc:315 #, fuzzy msgid "Chamorro" msgstr "Komoros" #. language code: chb #: zypp/LanguageCode.cc:317 #, fuzzy msgid "Chibcha" msgstr "Çin" # clients/hwinfo.ycp:44 clients/hwinfo.ycp:93 #. language code: che ce #: zypp/LanguageCode.cc:319 #, fuzzy msgid "Chechen" msgstr "Önbellek" # /usr/lib/YaST2/timezone_raw.ycp:240 #. language code: chg #: zypp/LanguageCode.cc:321 #, fuzzy msgid "Chagatai" msgstr "Şangay" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Çince" #. language code: chk #: zypp/LanguageCode.cc:327 #, fuzzy msgid "Chuukese" msgstr "Çince" # ML #. language code: chm #: zypp/LanguageCode.cc:329 #, fuzzy msgid "Mari" msgstr "Mali" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Çinok Jargon" #. language code: cho #: zypp/LanguageCode.cc:333 #, fuzzy msgid "Choctaw" msgstr "Chroot" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Çipevyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Çeroki" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Eski Kilise Slavcası" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Çuvaşça" #. language code: chy #: zypp/LanguageCode.cc:343 #, fuzzy msgid "Cheyenne" msgstr "Kanal" # menuentries/menuentry_language.ycp:13 #. language code: cmc #: zypp/LanguageCode.cc:345 #, fuzzy msgid "Chamic Languages" msgstr "Diller" #. language code: cop #: zypp/LanguageCode.cc:347 #, fuzzy msgid "Coptic" msgstr "Bilgi işleme" #. language code: cor kw #: zypp/LanguageCode.cc:349 #, fuzzy msgid "Cornish" msgstr "İrlandaca" #. language code: cos co #: zypp/LanguageCode.cc:351 #, fuzzy msgid "Corsican" msgstr "Kosta Rika" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Kreyol ve Pidgin Dilleri, İngilizce Kökenli (Diğer)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Kreyol ve Pidgin Dilleri, Fransızca Kökenli (Diğer)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Kreyol ve Pidgin Dilleri, Portekizce Kökenli (Diğer)" # clients/lan_inetd_custom.ycp:762 #. language code: cre cr #: zypp/LanguageCode.cc:359 #, fuzzy msgid "Cree" msgstr "Oluştur" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Kırım Tatarları" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Kreyol ve Pidgin Dilleri (Diğer)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Kusitik (Diğer)" # /usr/lib/YaST2/keyboard_raw.ycp:500 #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Çekçe" # clients/online_update_details.ycp:81 #. language code: dak #: zypp/LanguageCode.cc:373 #, fuzzy msgid "Dakota" msgstr "Dhaka" # /usr/lib/YaST2/keyboard_raw.ycp:380 #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Danca" # include/ui/common_messages.ycp:91 #. language code: dar #: zypp/LanguageCode.cc:377 #, fuzzy msgid "Dargwa" msgstr "Darwin" # clients/hwinfo.ycp:71 #. language code: day #: zypp/LanguageCode.cc:379 #, fuzzy msgid "Dayak" msgstr "Gün:" #. language code: del #: zypp/LanguageCode.cc:381 #, fuzzy msgid "Delaware" msgstr "Donanım" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Tlınçonca" # classnames.ycp:163 clients/hwinfo.ycp:70 #. language code: din #: zypp/LanguageCode.cc:387 #, fuzzy msgid "Dinka" msgstr "Disk" #. language code: div dv #: zypp/LanguageCode.cc:389 #, fuzzy msgid "Divehi" msgstr "Sürücü" # include/security/ui.ycp:695 #. language code: doi #: zypp/LanguageCode.cc:391 #, fuzzy msgid "Dogri" msgstr "Kullanıcı girişi" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravid (Diğer)" # classnames.ycp:98 #. language code: dsb #: zypp/LanguageCode.cc:395 #, fuzzy msgid "Lower Sorbian" msgstr "Güç koruma" #. language code: dua #: zypp/LanguageCode.cc:397 #, fuzzy msgid "Duala" msgstr "Palau" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Hollanda, Orta Çağ (ca. 1050-1350)" # /usr/lib/YaST2/keyboard_raw.ycp:350 #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Felemenkçe" # /usr/lib/YaST2/timezone_raw.ycp:191 #. language code: dyu #: zypp/LanguageCode.cc:405 #, fuzzy msgid "Dyula" msgstr "Dubai" # TO #. language code: dzo dz #: zypp/LanguageCode.cc:407 #, fuzzy msgid "Dzongkha" msgstr "Tonga" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Mısır (Antik)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elam " #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "İngilizce" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "İngilizce, Orta Çağ (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonyaca" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewe" # clients/inst_custom_part.ycp:2932 #. language code: ewo #: zypp/LanguageCode.cc:427 #, fuzzy msgid "Ewondo" msgstr "Bitiş" # clients/support_question.ycp:85 #. language code: fan #: zypp/LanguageCode.cc:429 #, fuzzy msgid "Fang" msgstr "Aralık" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faroece" #. language code: fat #: zypp/LanguageCode.cc:433 #, fuzzy msgid "Fanti" msgstr "Atlantik" # include/nis_server/ui.ycp:45 #. language code: fij fj #: zypp/LanguageCode.cc:435 #, fuzzy msgid "Fijian" msgstr "Fiji" #. language code: fil #: zypp/LanguageCode.cc:437 #, fuzzy msgid "Filipino" msgstr "Flipinler" # /usr/lib/YaST2/keyboard_raw.ycp:470 #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Fince" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fin-Ugor (Diğer)" #. language code: fon #: zypp/LanguageCode.cc:443 #, fuzzy msgid "Fon" msgstr "Yazı tipleri" # /usr/lib/YaST2/keyboard_raw.ycp:139 #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Fransızca" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Fransız,Orta Çağ (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Fransız, Eski Çağ (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 #, fuzzy msgid "Frisian" msgstr "Dosya sistemi s&ürümü" # clients/lan_inetd_custom.ycp:756 #. language code: ful ff #: zypp/LanguageCode.cc:455 #, fuzzy msgid "Fulah" msgstr "İşaretler" #. language code: fur #: zypp/LanguageCode.cc:457 #, fuzzy msgid "Friulian" msgstr "Finlandiya" #. language code: gaa #: zypp/LanguageCode.cc:459 #, fuzzy msgid "Ga" msgstr "Guam" # GA #. language code: gay #: zypp/LanguageCode.cc:461 #, fuzzy msgid "Gayo" msgstr "Gabon" #. language code: gba #: zypp/LanguageCode.cc:463 #, fuzzy msgid "Gbaya" msgstr "Gaza" # /usr/lib/YaST2/keyboard_raw.ycp:109 #. language code: gem #: zypp/LanguageCode.cc:465 #, fuzzy msgid "Germanic (Other)" msgstr "Almanca (ölü tuşlar ile)" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 #, fuzzy msgid "Georgian" msgstr "Gürcistan" # /usr/lib/YaST2/keyboard_raw.ycp:79 #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Almanca" # /usr/lib/YaST2/keyboard_raw.ycp:320 #. language code: gez #: zypp/LanguageCode.cc:475 #, fuzzy msgid "Geez" msgstr "Yunanca" # src/mozilla_i18n.c:37 #. language code: gil #: zypp/LanguageCode.cc:477 #, fuzzy msgid "Gilbertese" msgstr "Vietnamca" # ML #. language code: gla gd #: zypp/LanguageCode.cc:479 #, fuzzy msgid "Gaelic" msgstr "Mali" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "İrlandaca" # /usr/lib/YaST2/timezone_raw.ycp:408 #. language code: glg gl #: zypp/LanguageCode.cc:483 #, fuzzy msgid "Galician" msgstr "Vatikan" #. language code: glv gv #: zypp/LanguageCode.cc:485 #, fuzzy msgid "Manx" msgstr "Man" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" # GA #. language code: gon #: zypp/LanguageCode.cc:491 #, fuzzy msgid "Gondi" msgstr "Gabon" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotça" # GA #. language code: grb #: zypp/LanguageCode.cc:497 #, fuzzy msgid "Grebo" msgstr "Gabon" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Yunan, Antik (1453'e kadar)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Yunan, Modern (1453-)" # clients/ui_widgets.ycp:156 #. language code: grn gn #: zypp/LanguageCode.cc:505 #, fuzzy msgid "Guarani" msgstr "Paranoya" #. language code: guj gu #: zypp/LanguageCode.cc:507 #, fuzzy msgid "Gujarati" msgstr "Süre" # /usr/lib/YaST2/timezone_raw.ycp:478 #. language code: gwi #: zypp/LanguageCode.cc:509 #, fuzzy msgid "Gwich'in" msgstr "Michigan" #. language code: hai #: zypp/LanguageCode.cc:511 #, fuzzy msgid "Haida" msgstr "Donanım" # HT #. language code: hat ht #: zypp/LanguageCode.cc:513 #, fuzzy msgid "Haitian" msgstr "Haiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 #, fuzzy msgid "Hausa" msgstr "Saat" # /usr/lib/YaST2/timezone_raw.ycp:476 #. language code: haw #: zypp/LanguageCode.cc:517 #, fuzzy msgid "Hawaiian" msgstr "Hawaii" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "İbranice" # include/ui/common_messages.ycp:95 #. language code: her hz #: zypp/LanguageCode.cc:521 #, fuzzy msgid "Herero" msgstr "hata" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" # /usr/lib/YaST2/timezone_raw.ycp:450 #. language code: hin hi #: zypp/LanguageCode.cc:527 #, fuzzy msgid "Hindi" msgstr "Midi" # HT #. language code: hit #: zypp/LanguageCode.cc:529 #, fuzzy msgid "Hittite" msgstr "Haiti" #. language code: hmn #: zypp/LanguageCode.cc:531 #, fuzzy msgid "Hmong" msgstr "Hong Kong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 #, fuzzy msgid "Upper Sorbian" msgstr "Sırpça" # /usr/lib/YaST2/keyboard_raw.ycp:570 #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Macarca" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupaca" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 #, fuzzy msgid "Iban" msgstr "Irak" # clients/ui_widgets.ycp:85 #. language code: ibo ig #: zypp/LanguageCode.cc:543 #, fuzzy msgid "Igbo" msgstr "Görmezden gel" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "İzlandaca" # clients/inst_custom_part.ycp:2920 #. language code: ido io #: zypp/LanguageCode.cc:549 #, fuzzy msgid "Ido" msgstr "Tanıtıcı" #. language code: iii ii #: zypp/LanguageCode.cc:551 #, fuzzy msgid "Sichuan Yi" msgstr "Litvanya" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 #, fuzzy msgid "Inuktitut" msgstr "Başlangıç" # clients/online_update.ycp:45 #. language code: ile ie #: zypp/LanguageCode.cc:557 #, fuzzy msgid "Interlingue" msgstr "Devam et" # /usr/lib/YaST2/timezone_raw.ycp:236 #. language code: ilo #: zypp/LanguageCode.cc:559 #, fuzzy msgid "Iloko" msgstr "Tokyo" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "İnterlingua (Uluslararası Yapay Dil Derneği)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Hint (Diğer)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Endonezyaca" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Hint-Avrupa (Diğer)" #. language code: inh #: zypp/LanguageCode.cc:569 #, fuzzy msgid "Ingush" msgstr "İngilizce" #. language code: ipk ik #: zypp/LanguageCode.cc:571 #, fuzzy msgid "Inupiaq" msgstr "Hindistan" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "İrani (Diğer)" #. language code: iro #: zypp/LanguageCode.cc:575 #, fuzzy msgid "Iroquoian Languages" msgstr "Dil yapılandırılıyor..." # /usr/lib/YaST2/keyboard_raw.ycp:230 #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "İtalyanca" # /usr/lib/YaST2/keyboard_raw.ycp:700 #. language code: jav jv #: zypp/LanguageCode.cc:579 #, fuzzy msgid "Javanese" msgstr "Japonca" #. language code: jbo #: zypp/LanguageCode.cc:581 #, fuzzy msgid "Lojban" msgstr "Lübnan" # /usr/lib/YaST2/keyboard_raw.ycp:700 #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Japonca" #. language code: jpr #: zypp/LanguageCode.cc:585 #, fuzzy msgid "Judeo-Persian" msgstr "Endonezyaca" #. language code: jrb #: zypp/LanguageCode.cc:587 #, fuzzy msgid "Judeo-Arabic" msgstr "Arapça" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-kalpaklar" #. language code: kab #: zypp/LanguageCode.cc:591 #, fuzzy msgid "Kabyle" msgstr "Etkin" #. language code: kac #: zypp/LanguageCode.cc:593 #, fuzzy msgid "Kachin" msgstr "Aranacak yer" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Grönlandca" # /usr/lib/YaST2/timezone_raw.ycp:481 #. language code: kam #: zypp/LanguageCode.cc:597 #, fuzzy msgid "Kamba" msgstr "Samba" #. language code: kan kn #: zypp/LanguageCode.cc:599 #, fuzzy msgid "Kannada" msgstr "Kanada" #. language code: kar #: zypp/LanguageCode.cc:601 #, fuzzy msgid "Karen" msgstr "Kore dili" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Keşmirce" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri " # MW #. language code: kaw #: zypp/LanguageCode.cc:607 #, fuzzy msgid "Kawi" msgstr "Malavi" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 #, fuzzy msgid "Kazakh" msgstr "Kazakistan" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardeyce" #. language code: kha #: zypp/LanguageCode.cc:613 #, fuzzy msgid "Khasi" msgstr "Taylandça" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" # classnames.ycp:73 #. language code: khm km #: zypp/LanguageCode.cc:617 #, fuzzy msgid "Khmer" msgstr "Zamanlayıcı" #. language code: kho #: zypp/LanguageCode.cc:619 #, fuzzy msgid "Khotanese" msgstr "Çince" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Ruandaca" # clients/inst_sw_single.ycp:1461 #. language code: kir ky #: zypp/LanguageCode.cc:625 #, fuzzy msgid "Kirghiz" msgstr "Virgin" #. language code: kmb #: zypp/LanguageCode.cc:627 #, fuzzy msgid "Kimbundu" msgstr "Tür" #. language code: kok #: zypp/LanguageCode.cc:629 #, fuzzy msgid "Konkani" msgstr "Kore dili" #. language code: kom kv #: zypp/LanguageCode.cc:631 #, fuzzy msgid "Komi" msgstr "Alan adı" # CG #. language code: kon kg #: zypp/LanguageCode.cc:633 #, fuzzy msgid "Kongo" msgstr "Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Kore dili" #. language code: kos #: zypp/LanguageCode.cc:637 #, fuzzy msgid "Kosraean" msgstr "Kore dili" # /usr/lib/YaST2/timezone_raw.ycp:242 #. language code: kpe #: zypp/LanguageCode.cc:639 #, fuzzy msgid "Kpelle" msgstr "İmla" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karaçay-Balkarca" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" # /usr/lib/YaST2/keyboard_raw.ycp:668 #. language code: kru #: zypp/LanguageCode.cc:645 #, fuzzy msgid "Kurukh" msgstr "Türkçe" #. language code: kua kj #: zypp/LanguageCode.cc:647 #, fuzzy msgid "Kuanyama" msgstr "Panama" #. language code: kum #: zypp/LanguageCode.cc:649 #, fuzzy msgid "Kumyk" msgstr "Geçersiz" # /usr/lib/YaST2/keyboard_raw.ycp:668 #. language code: kur ku #: zypp/LanguageCode.cc:651 #, fuzzy msgid "Kurdish" msgstr "Türkçe" # KE #. language code: kut #: zypp/LanguageCode.cc:653 #, fuzzy msgid "Kutenai" msgstr "Kenya" #. language code: lad #: zypp/LanguageCode.cc:655 #, fuzzy msgid "Ladino" msgstr "Radyo" # UG #. language code: lah #: zypp/LanguageCode.cc:657 #, fuzzy msgid "Lahnda" msgstr "Uganda" # /usr/lib/YaST2/timezone_raw.ycp:481 #. language code: lam #: zypp/LanguageCode.cc:659 #, fuzzy msgid "Lamba" msgstr "Samba" #. language code: lao lo #: zypp/LanguageCode.cc:661 #, fuzzy msgid "Lao" msgstr "Kayıt" #. language code: lat la #: zypp/LanguageCode.cc:663 #, fuzzy msgid "Latin" msgstr "Letonyaca" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letonyaca" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. language code: lez #: zypp/LanguageCode.cc:667 #, fuzzy msgid "Lezghian" msgstr "Belçikaca" #. language code: lim li #: zypp/LanguageCode.cc:669 #, fuzzy msgid "Limburgan" msgstr "Lüksemburg" # AO #. language code: lin ln #: zypp/LanguageCode.cc:671 #, fuzzy msgid "Lingala" msgstr "Angola" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litvanyaca" # CG #. language code: lol #: zypp/LanguageCode.cc:675 #, fuzzy msgid "Mongo" msgstr "Kongo" # include/security/ui.ycp:695 #. language code: loz #: zypp/LanguageCode.cc:677 #, fuzzy msgid "Lozi" msgstr "Kullanıcı girişi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 #, fuzzy msgid "Luxembourgish" msgstr "Lüksemburg" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" # GH #. language code: lug lg #: zypp/LanguageCode.cc:685 #, fuzzy msgid "Ganda" msgstr "Gana" #. language code: lui #: zypp/LanguageCode.cc:687 #, fuzzy msgid "Luiseno" msgstr "Bunları dinle" # menuentries/menuentry_sound.ycp:14 #. language code: lun #: zypp/LanguageCode.cc:689 #, fuzzy msgid "Lunda" msgstr "Pazar" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 #, fuzzy msgid "Lushai" msgstr "Taylandça" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Makedonyaca" #. language code: mad #: zypp/LanguageCode.cc:699 #, fuzzy msgid "Madurese" msgstr "Faroece" # MW #. language code: mag #: zypp/LanguageCode.cc:701 #, fuzzy msgid "Magahi" msgstr "Malavi" # MH #. language code: mah mh #: zypp/LanguageCode.cc:703 #, fuzzy msgid "Marshallese" msgstr "Marşal Adaları" # ML #. language code: mai #: zypp/LanguageCode.cc:705 #, fuzzy msgid "Maithili" msgstr "Mali" # MG #. language code: mak #: zypp/LanguageCode.cc:707 #, fuzzy msgid "Makasar" msgstr "Madagaskar" #. language code: mal ml #: zypp/LanguageCode.cc:709 #, fuzzy msgid "Malayalam" msgstr "Malezya" # include/ui/common_messages.ycp:91 #. language code: man #: zypp/LanguageCode.cc:711 #, fuzzy msgid "Mandingo" msgstr "Uyarı" # /usr/lib/YaST2/timezone_raw.ycp:207 #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 #, fuzzy msgid "Maori" msgstr "Yüksek" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Avustranezya (Diğer)" # clients/online_update_details.ycp:88 clients/online_update_select.ycp:112 #. language code: mar mr #: zypp/LanguageCode.cc:719 #, fuzzy msgid "Marathi" msgstr "Matematik" # MW #. language code: mas #: zypp/LanguageCode.cc:721 #, fuzzy msgid "Masai" msgstr "Malavi" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 #, fuzzy msgid "Malay" msgstr "Malta" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" # MM #. language code: mdr #: zypp/LanguageCode.cc:729 #, fuzzy msgid "Mandar" msgstr "Miyanmar" #. language code: men #: zypp/LanguageCode.cc:731 #, fuzzy msgid "Mende" msgstr "Mod" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "İrlandaca, Orta Çağ (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" # clients/ui_helps.ycp:139 include/security/ui.ycp:624 #. language code: mis #: zypp/LanguageCode.cc:739 #, fuzzy msgid "Miscellaneous Languages" msgstr "Diğer ayarlar" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" # MG #. language code: mlg mg #: zypp/LanguageCode.cc:743 #, fuzzy msgid "Malagasy" msgstr "Madagaskar" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 #, fuzzy msgid "Maltese" msgstr "Mali" #. language code: mnc #: zypp/LanguageCode.cc:747 #, fuzzy msgid "Manchu" msgstr "Man" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" # menuentries/menuentry_language.ycp:13 #. language code: mno #: zypp/LanguageCode.cc:751 #, fuzzy msgid "Manobo Languages" msgstr "Diller" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" # /usr/lib/YaST2/timezone_raw.ycp:381 #. language code: mol mo #: zypp/LanguageCode.cc:755 #, fuzzy msgid "Moldavian" msgstr "Moldova" # MN #. language code: mon mn #: zypp/LanguageCode.cc:757 #, fuzzy msgid "Mongolian" msgstr "Moğolistan" #. language code: mos #: zypp/LanguageCode.cc:759 #, fuzzy msgid "Mossi" msgstr "Mors" #. language code: mul #: zypp/LanguageCode.cc:761 #, fuzzy msgid "Multiple Languages" msgstr "&Çoklu anahtarlar" # menuentries/menuentry_language.ycp:13 #. language code: mun #: zypp/LanguageCode.cc:763 #, fuzzy msgid "Munda languages" msgstr "Diller" # /usr/lib/YaST2/keyboard_raw.ycp:320 #. language code: mus #: zypp/LanguageCode.cc:765 #, fuzzy msgid "Creek" msgstr "Yunanca" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 #, fuzzy msgid "Mirandese" msgstr "Maine" #. language code: mwr #: zypp/LanguageCode.cc:769 #, fuzzy msgid "Marwari" msgstr "Donanım" # menuentries/menuentry_language.ycp:13 #. language code: myn #: zypp/LanguageCode.cc:771 #, fuzzy msgid "Mayan Languages" msgstr "Diller" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 #, fuzzy msgid "Nahuatl" msgstr "El ile" #. language code: nai #: zypp/LanguageCode.cc:777 #, fuzzy msgid "North American Indian" msgstr "Kuzey Amerika" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" # /usr/lib/YaST2/timezone_raw.ycp:356 #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" # TO #. language code: ndo ng #: zypp/LanguageCode.cc:789 #, fuzzy msgid "Ndonga" msgstr "Tonga" # /usr/lib/YaST2/keyboard_raw.ycp:79 #. language code: nds #: zypp/LanguageCode.cc:791 #, fuzzy msgid "Low German" msgstr "Almanca" # NP #. language code: nep ne #: zypp/LanguageCode.cc:793 #, fuzzy msgid "Nepali" msgstr "Nepal" # NP #. language code: new #: zypp/LanguageCode.cc:795 #, fuzzy msgid "Nepal Bhasa" msgstr "Nepal" #. language code: nia #: zypp/LanguageCode.cc:797 #, fuzzy msgid "Nias" msgstr "Takma ad" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" # NU #. language code: niu #: zypp/LanguageCode.cc:801 #, fuzzy msgid "Niuean" msgstr "Nie" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. language code: nno nn #: zypp/LanguageCode.cc:803 #, fuzzy msgid "Norwegian Nynorsk" msgstr "Norveççe" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. language code: nob nb #: zypp/LanguageCode.cc:805 #, fuzzy msgid "Norwegian Bokmal" msgstr "Norveççe" # TO #. language code: nog #: zypp/LanguageCode.cc:807 #, fuzzy msgid "Nogai" msgstr "Tonga" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norveççe" # /usr/lib/YaST2/timezone_raw.ycp:374 #. language code: nso #: zypp/LanguageCode.cc:813 #, fuzzy msgid "Northern Sotho" msgstr "Kuzey İrlanda" # clients/inst_language.ycp:116 #. language code: nub #: zypp/LanguageCode.cc:815 #, fuzzy msgid "Nubian Languages" msgstr "Dili ayarla" #. language code: nwc #: zypp/LanguageCode.cc:817 #, fuzzy msgid "Classical Newari" msgstr "Sınıf adı" #. language code: nya ny #: zypp/LanguageCode.cc:819 #, fuzzy msgid "Chichewa" msgstr "Şili" #. language code: nym #: zypp/LanguageCode.cc:821 #, fuzzy msgid "Nyamwezi" msgstr "Ad" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 #, fuzzy msgid "Nyoro" msgstr "Kuzey" #. language code: nzi #: zypp/LanguageCode.cc:827 #, fuzzy msgid "Nzima" msgstr "Lima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 #, fuzzy msgid "Oriya" msgstr "Surinam" #. language code: orm om #: zypp/LanguageCode.cc:835 #, fuzzy msgid "Oromo" msgstr "root" #. language code: osa #: zypp/LanguageCode.cc:837 #, fuzzy msgid "Osage" msgstr "kaydet" # /usr/lib/YaST2/keyboard_raw.ycp:638 #. language code: oss os #: zypp/LanguageCode.cc:839 #, fuzzy msgid "Ossetian" msgstr "Rusça" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" # clients/inst_language.ycp:116 #. language code: oto #: zypp/LanguageCode.cc:843 #, fuzzy msgid "Otomian Languages" msgstr "Dili ayarla" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" # /usr/lib/YaST2/keyboard_raw.ycp:570 #. language code: pag #: zypp/LanguageCode.cc:847 #, fuzzy msgid "Pangasinan" msgstr "Macarca" #. language code: pal #: zypp/LanguageCode.cc:849 #, fuzzy msgid "Pahlavi" msgstr "Palau" #. language code: pam #: zypp/LanguageCode.cc:851 #, fuzzy msgid "Pampanga" msgstr "Paraguay" #. language code: pan pa #: zypp/LanguageCode.cc:853 #, fuzzy msgid "Panjabi" msgstr "Panama" #. language code: pap #: zypp/LanguageCode.cc:855 #, fuzzy msgid "Papiamento" msgstr "Parametre" #. language code: pau #: zypp/LanguageCode.cc:857 #, fuzzy msgid "Palauan" msgstr "Palau" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" # clients/inst_sw_single.ycp:1461 #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 #, fuzzy msgid "Persian" msgstr "Sürüm" #. language code: phi #: zypp/LanguageCode.cc:865 #, fuzzy msgid "Philippine (Other)" msgstr "Flipinler" #. language code: phn #: zypp/LanguageCode.cc:867 #, fuzzy msgid "Phoenician" msgstr "Slovence" #. language code: pli pi #: zypp/LanguageCode.cc:869 #, fuzzy msgid "Pali" msgstr "Palm" # /usr/lib/YaST2/keyboard_raw.ycp:604 #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Lehçe" #. language code: pon #: zypp/LanguageCode.cc:873 #, fuzzy msgid "Pohnpeian" msgstr "Endonezyaca" # /usr/lib/YaST2/keyboard_raw.ycp:260 #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portekizce" # clients/inst_language.ycp:116 #. language code: pra #: zypp/LanguageCode.cc:877 #, fuzzy msgid "Prakrit Languages" msgstr "Dili ayarla" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" # include/security/ui.ycp:417 #. language code: pus ps #: zypp/LanguageCode.cc:881 #, fuzzy msgid "Pushto" msgstr "Özel" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 #, fuzzy msgid "Rajasthani" msgstr "Kazakistan" # /usr/lib/YaST2/keyboard_raw.ycp:700 #. language code: rap #: zypp/LanguageCode.cc:887 #, fuzzy msgid "Rapanui" msgstr "Japonya" #. language code: rar #: zypp/LanguageCode.cc:889 #, fuzzy msgid "Rarotongan" msgstr "Yönlendirme oku" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 #, fuzzy msgid "Romany" msgstr "Romanya" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Romence" # RE #. language code: run rn #: zypp/LanguageCode.cc:901 #, fuzzy msgid "Rundi" msgstr "Reunion" # /usr/lib/YaST2/keyboard_raw.ycp:638 #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rusça" # include/cups/helps.ycp:578 #. language code: sad #: zypp/LanguageCode.cc:905 #, fuzzy msgid "Sandawe" msgstr "Yatay" # /usr/lib/YaST2/keyboard_raw.ycp:200 #. language code: sag sg #: zypp/LanguageCode.cc:907 #, fuzzy msgid "Sango" msgstr "Saygon" #. language code: sah #: zypp/LanguageCode.cc:909 #, fuzzy msgid "Yakut" msgstr "Breakout" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" # clients/inst_language.ycp:116 #. language code: sal #: zypp/LanguageCode.cc:913 #, fuzzy msgid "Salishan Languages" msgstr "Dili ayarla" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" # clients/inst_custom_part.ycp:2930 #. language code: san sa #: zypp/LanguageCode.cc:917 #, fuzzy msgid "Sanskrit" msgstr "Başlangıç" # /usr/lib/YaST2/timezone_raw.ycp:481 #. language code: sas #: zypp/LanguageCode.cc:919 #, fuzzy msgid "Sasak" msgstr "Samoa" # /usr/lib/YaST2/timezone_raw.ycp:240 #. language code: sat #: zypp/LanguageCode.cc:921 #, fuzzy msgid "Santali" msgstr "Şangay" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Sırpça" # /usr/lib/YaST2/timezone_raw.ycp:478 #. language code: scn #: zypp/LanguageCode.cc:927 #, fuzzy msgid "Sicilian" msgstr "Michigan" #. language code: sco #: zypp/LanguageCode.cc:929 #, fuzzy msgid "Scots" msgstr "Saniye" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Hırvatça" #. language code: sel #: zypp/LanguageCode.cc:935 #, fuzzy msgid "Selkup" msgstr "Atla" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "İrlandaca, Eski Çağ (900'e kadar)" # menuentries/menuentry_language.ycp:13 #. language code: sgn #: zypp/LanguageCode.cc:941 #, fuzzy msgid "Sign Languages" msgstr "Diller" # GH #. language code: shn #: zypp/LanguageCode.cc:943 #, fuzzy msgid "Shan" msgstr "Gana" # /usr/lib/YaST2/timezone_raw.ycp:481 #. language code: sid #: zypp/LanguageCode.cc:945 #, fuzzy msgid "Sidamo" msgstr "Samoa" #. language code: sin si #: zypp/LanguageCode.cc:947 #, fuzzy msgid "Sinhala" msgstr "Seri numara" # clients/inst_language.ycp:116 #. language code: sio #: zypp/LanguageCode.cc:949 #, fuzzy msgid "Siouan Languages" msgstr "Dili ayarla" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Slovakça" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Slovence" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" # /usr/lib/YaST2/timezone_raw.ycp:374 #. language code: sme se #: zypp/LanguageCode.cc:963 #, fuzzy msgid "Northern Sami" msgstr "Kuzey İrlanda" # menuentries/menuentry_language.ycp:13 #. language code: smi #: zypp/LanguageCode.cc:965 #, fuzzy msgid "Sami Languages (Other)" msgstr "Diller" #. language code: smj #: zypp/LanguageCode.cc:967 #, fuzzy msgid "Lule Sami" msgstr "Modül adı" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" # /usr/lib/YaST2/timezone_raw.ycp:481 #. language code: smo sm #: zypp/LanguageCode.cc:971 #, fuzzy msgid "Samoan" msgstr "Samoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 #, fuzzy msgid "Shona" msgstr "Slovenya" # /usr/lib/YaST2/timezone_raw.ycp:450 #. language code: snd sd #: zypp/LanguageCode.cc:977 #, fuzzy msgid "Sindhi" msgstr "Midi" # clients/online_update.ycp:45 #. language code: snk #: zypp/LanguageCode.cc:979 #, fuzzy msgid "Soninke" msgstr "Devam et" # include/security/ui.ycp:695 #. language code: sog #: zypp/LanguageCode.cc:981 #, fuzzy msgid "Sogdian" msgstr "Kullanıcı girişi" # SO #. language code: som so #: zypp/LanguageCode.cc:983 #, fuzzy msgid "Somali" msgstr "Somali" # /usr/lib/YaST2/timezone_raw.ycp:240 #. language code: son #: zypp/LanguageCode.cc:985 #, fuzzy msgid "Songhai" msgstr "Şangay" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" # /usr/lib/YaST2/keyboard_raw.ycp:200 #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "İspanyolca" # MR #. language code: srd sc #: zypp/LanguageCode.cc:991 #, fuzzy msgid "Sardinian" msgstr "Moritanya" #. language code: srr #: zypp/LanguageCode.cc:993 #, fuzzy msgid "Serer" msgstr "Sunucu" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" # HT #. language code: ssw ss #: zypp/LanguageCode.cc:997 #, fuzzy msgid "Swati" msgstr "Haiti" #. language code: suk #: zypp/LanguageCode.cc:999 #, fuzzy msgid "Sukuma" msgstr "Özet" #. language code: sun su #: zypp/LanguageCode.cc:1001 #, fuzzy msgid "Sundanese" msgstr "Sudan" # clients/hwinfo.ycp:43 #. language code: sus #: zypp/LanguageCode.cc:1003 #, fuzzy msgid "Susu" msgstr "SMBus" #. language code: sux #: zypp/LanguageCode.cc:1005 #, fuzzy msgid "Sumerian" msgstr "Sırpça" # SZ #. language code: swa sw #: zypp/LanguageCode.cc:1007 #, fuzzy msgid "Swahili" msgstr "Swaziland" # /usr/lib/YaST2/keyboard_raw.ycp:440 #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "İsveççe" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 #, fuzzy msgid "Syriac" msgstr "Surinam" # /usr/lib/YaST2/timezone_raw.ycp:461 #. language code: tah ty #: zypp/LanguageCode.cc:1013 #, fuzzy msgid "Tahitian" msgstr "Tahiti" # include/cups/ui.ycp:346 #. language code: tai #: zypp/LanguageCode.cc:1015 #, fuzzy msgid "Tai (Other)" msgstr "Diğer" # clients/hwinfo.ycp:51 #. language code: tam ta #: zypp/LanguageCode.cc:1017 #, fuzzy msgid "Tamil" msgstr "Aile" #. language code: tat tt #: zypp/LanguageCode.cc:1019 #, fuzzy msgid "Tatar" msgstr "Katar" # /usr/lib/YaST2/keyboard_raw.ycp:410 #. language code: tel te #: zypp/LanguageCode.cc:1021 #, fuzzy msgid "Telugu" msgstr "Belçika" # classnames.ycp:73 #. language code: tem #: zypp/LanguageCode.cc:1023 #, fuzzy msgid "Timne" msgstr "Süre" # include/cups/ui.ycp:2582 #. language code: ter #: zypp/LanguageCode.cc:1025 #, fuzzy msgid "Tereno" msgstr "Tex bilgisi" # classnames.ycp:96 #. language code: tet #: zypp/LanguageCode.cc:1027 #, fuzzy msgid "Tetum" msgstr "Pentium" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 #, fuzzy msgid "Tajik" msgstr "Taylandça" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Taylandça" # TW # fuzzy #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 #, fuzzy msgid "Tibetan" msgstr "Tayland" # clients/ui_widgets.ycp:85 #. language code: tig #: zypp/LanguageCode.cc:1039 #, fuzzy msgid "Tigre" msgstr "görmezden gel" # NG #. language code: tir ti #: zypp/LanguageCode.cc:1041 #, fuzzy msgid "Tigrinya" msgstr "Nigeria" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" # /usr/lib/YaST2/keyboard_raw.ycp:200 #. language code: tlh #: zypp/LanguageCode.cc:1047 #, fuzzy msgid "Klingon" msgstr "Saygon" #. language code: tli #: zypp/LanguageCode.cc:1049 #, fuzzy msgid "Tlingit" msgstr "Posta listeleri" # /usr/lib/YaST2/timezone_raw.ycp:221 #. language code: tmh #: zypp/LanguageCode.cc:1051 #, fuzzy msgid "Tamashek" msgstr "Taşkent" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" # SB #. language code: ton to #: zypp/LanguageCode.cc:1055 #, fuzzy msgid "Tonga (Tonga Islands)" msgstr "Solomon Adaları" #. language code: tpi #: zypp/LanguageCode.cc:1057 #, fuzzy msgid "Tok Pisin" msgstr "Token Ring" # /usr/lib/YaST2/keyboard_raw.ycp:638 #. language code: tsi #: zypp/LanguageCode.cc:1059 #, fuzzy msgid "Tsimshian" msgstr "Rusça" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 #, fuzzy msgid "Tswana" msgstr "Botswana" # TO #. language code: tso ts #: zypp/LanguageCode.cc:1063 #, fuzzy msgid "Tsonga" msgstr "Tonga" # /usr/lib/YaST2/keyboard_raw.ycp:668 #. language code: tuk tk #: zypp/LanguageCode.cc:1065 #, fuzzy msgid "Turkmen" msgstr "Türkiye" # /usr/lib/YaST2/timezone_raw.ycp:48 #. language code: tum #: zypp/LanguageCode.cc:1067 #, fuzzy msgid "Tumbuka" msgstr "Timbuktu" # clients/inst_language.ycp:116 #. language code: tup #: zypp/LanguageCode.cc:1069 #, fuzzy msgid "Tupi Languages" msgstr "Dili ayarla" # /usr/lib/YaST2/keyboard_raw.ycp:668 #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Türkçe" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altay(Diğer)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 #, fuzzy msgid "Tuvinian" msgstr "Tunus" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" # HT #. language code: uga #: zypp/LanguageCode.cc:1083 #, fuzzy msgid "Ugaritic" msgstr "Haiti" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 #, fuzzy msgid "Ukrainian" msgstr "Ukrayna" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Belirsiz" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 #, fuzzy msgid "Uzbek" msgstr "Özbekistan" #. language code: vai #: zypp/LanguageCode.cc:1097 #, fuzzy msgid "Vai" msgstr "Vi" #. language code: ven ve #: zypp/LanguageCode.cc:1099 #, fuzzy msgid "Venda" msgstr "Üretici" # src/mozilla_i18n.c:37 #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamca" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" # /usr/lib/YaST2/timezone_raw.ycp:408 #. language code: vot #: zypp/LanguageCode.cc:1105 #, fuzzy msgid "Votic" msgstr "Vatikan" # clients/inst_language.ycp:116 #. language code: wak #: zypp/LanguageCode.cc:1107 #, fuzzy msgid "Wakashan Languages" msgstr "Dili ayarla" #. language code: wal #: zypp/LanguageCode.cc:1109 #, fuzzy msgid "Walamo" msgstr "Palm" #. language code: war #: zypp/LanguageCode.cc:1111 #, fuzzy msgid "Waray" msgstr "Cumartesi" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" # clients/inst_mouse.ycp:83 #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 #, fuzzy msgid "Welsh" msgstr "Batı" #. language code: wen #: zypp/LanguageCode.cc:1119 #, fuzzy msgid "Sorbian Languages" msgstr "Dil yapılandırılıyor..." #. language code: wln wa #: zypp/LanguageCode.cc:1121 #, fuzzy msgid "Walloon" msgstr "tümü" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 #, fuzzy msgid "Kalmyk" msgstr "Konuşma" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" # /usr/lib/YaST2/keyboard_raw.ycp:700 #. language code: yap #: zypp/LanguageCode.cc:1131 #, fuzzy msgid "Yapese" msgstr "Japonca" # include/nis_server/ui.ycp:45 #. language code: yid yi #: zypp/LanguageCode.cc:1133 #, fuzzy msgid "Yiddish" msgstr "Sonlandır" # AW #. language code: yor yo #: zypp/LanguageCode.cc:1135 #, fuzzy msgid "Yoruba" msgstr "Aruba" # clients/inst_language.ycp:116 #. language code: ypk #: zypp/LanguageCode.cc:1137 #, fuzzy msgid "Yupik Languages" msgstr "Dili ayarla" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 #, fuzzy msgid "Zenaga" msgstr "Grenada" # BT #. language code: zha za #: zypp/LanguageCode.cc:1143 #, fuzzy msgid "Zhuang" msgstr "Bütan" #. language code: znd #: zypp/LanguageCode.cc:1145 #, fuzzy msgid "Zande" msgstr "Bölge" # /usr/lib/YaST2/timezone_raw.ycp:326 #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zulu" #. language code: zun #: zypp/LanguageCode.cc:1149 #, fuzzy msgid "Zuni" msgstr "Tunis" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Aşağıdaki işlemler tamamlanacak:" # include/cups/ui.ycp:2577 include/cups/ui.ycp:2598 #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "bilinmeyen" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "desteklenmeyen" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Seviye 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Seviye 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Seviye 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Ek Kullanıcı Sözleşmesi Gerekli" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "geçersiz" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Destek seviyesi belirtilmemiş" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Sağlayıcı destek sağlamıyor." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Destek almak için ek kullanıcı sözleşmesi gerekmektedir." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Bilinmeyen destek seçeneği. Açıklama bulunamadı" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Sistem yönetimi uygulama tarafından pid kullanılarak kilitlendi %d (%s). \n" "Tekrar denemeden önce bu uygulamayı kapatın." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Geçersiz düzenli ifade '%s': regcomp %d döndürdü" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Geçersiz düzenli ifade '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "'%s' için kimlik doğrulama gerekmektedir" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Kaydınızın geçerli olduğundan ve süresinin dolmadığından emin olmak için en " "yakın Novell Müşteri Merkezini ziyaret edin." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Metadata önbellek klasörü oluşturulamadı." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "'%s' okunmaya çalışılırken bir hata meydana geldi" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "%s oluşturulamıyor" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %d." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "'%s' depo önbelleği oluşturuluyor" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "%s 'de önbellek oluşturulamıyor - yazma izni yok." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "'%s' depoya ekleniyor" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Geçersiz yetki '{0}'" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "'%s' dosyası açılamıyor." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "'%s' dosyası okunamadı" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "'%s' deposu siliniyor" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Reponun nerede depolandığı belirlenemedi." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "'%s' silinemiyor" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Servesin nerede depolandığı belirlenemedi." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Depo ismi noktayla başlayamaz." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Servis ismi noktayla başlayamaz." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Devam edilsin mi?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Gerekli '%s' niteliği bulunamadı." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "'%s' ya da '%s' niteliklerinden biri yada ikisi birden gerekli." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "%s paketi aktarılırken hasar görmüş olabilir. Kurtarmayı denemek istiyor " "musunuz?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "%s Paketi bulunamadı. Tekrar aramak ister misiniz?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "'%s' deposundaki '%s' e ulaşılamıyor" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Sat-pool oluşturulamadı." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "şu çözülmemiş gereksinimlere sahip:" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" # clients/inst_sw_single.ycp:742 #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "Yetersiz bağımlılıklar:" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "Yüklenemez sağlayıcılar:" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "Yüklenemez sağlayıcılar:" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Bu istek sisteminizi çökertecek!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Yükleme yönlendirildiği şekilde iptal edildi" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "uygulandı" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr "işletme hatası" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "İptal etme sırasında uygulama es geçildi." #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" "Güncelleme bilgilendirmesi için mesaj gönderilirken bir hata meydana geldi." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" # clients/online_update_load.ycp:380 #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "İndirme işlemi başarısız oldu:" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "%1% dosyasından genel anahtar alınamadı" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "'%1%' genel anahtarı silinemedi" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" # clients/sw_single.ycp:310 #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, fuzzy, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Yapılandırma dosyalarını kaydet" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Ek rpm çıktısı" # clients/inst_sw_backup.ycp:260 #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "%s yedeklemesi oluşturuldu" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "(süresi dolmadı)" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(süresi dolmadı)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(SÜRESİ DOLDU)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(24 saat içinde süresi dolacak)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "%1% dosyasından genel anahtar alınamadı" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Anahtar silinirken hata meydana geldi." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "%s imza dosyası bulunamadı" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Kararsız '%s' türü için %u bayt sğlama toplamı '%s'" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Pty açılamıyor (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Veri yolu açılamıyor (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 #, fuzzy msgid "Unable to clone Url object" msgstr "çalışma alanı oluşturulamadı\n" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 #, fuzzy msgid "Unable to parse Url components" msgstr "çalışma alanı oluşturulamadı\n" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Tarih:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" # include/nfs/routines.ycp:188 #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Geçersiz %s bileşeni '%s'" # include/nfs/routines.ycp:188 #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Geçersiz %s bileşeni" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, fuzzy, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Geçersiz yetki '{0}'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" # include/nfs/routines.ycp:188 #: zypp-core/url/UrlBase.cc:1125 #, fuzzy, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Geçersiz özellik '{0}'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" # include/nfs/routines.ycp:188 #: zypp-core/url/UrlBase.cc:1157 #, fuzzy, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Geçersiz özellik '{0}'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Kodlanmış dizi bir NUL baytı içerir" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Geçersiz dizi karakteri ayırma parametresi" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Geçersiz dizi karakteri birleştirme parametresi" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Komut %d durumuyla çıkış yaptı." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Komut %d sinyali tarafından durduruldu (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Bağlanıken çalıştırılacak komut" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "'%s' e chroot yapılamıyor (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "'%s' yürütülemedi (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Ayrıştırılamadı (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "%s açılamadı - %s\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Hatalı dosya adı: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "'%s' işlemi gerçekleştirilmeye çalışılırken ortam açılamadı." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "'%s' dosyası '%s' ortamında bulunamadı" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "'%s' dosyası yazılamadı." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Ortam ekli değil" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Hatalı medya bağlantı noktası" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "'%s' için indirme (curl) başlatılamadı" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "'%s' ortamındaki '%s' te sistem isnası meydana geldi." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "'%s' ortamındaki '%s' yolu bir dosya değil." #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Hata: %s temel dizini bir dizin değil, atlanıyor.\n" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "URI de boş alan adı" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "URI de boş dosya sistemi" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "URI de içeriksiz hedef" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 #, fuzzy msgid "Operation not supported by medium" msgstr "Profil sürümü Apparmor modülü tarafından desteklenmiyor\n" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "'%s' için indirme(curl) hatası:\n" "Hata kodu: %s\n" "Hata raporu: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "'%s' için indirme (curl) ayarları düzenlenirken bir hata meydana geldi:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "'%s' medya kaynağı gerekli ortamı içermiyor." #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "'%s' medyası başka bir oluşum tarafından kullanımda" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Hiçbir sürücü çıkartılamıyor" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "'%s' medyası çıkartılamadı" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "İzin verilmedi\n" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "'%s' konumuna şuan ulaşılamaz. " #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" "SSL sertifikası problemi, CA sertifikasının '%s' için geçerli olduğunu " "doğrulayın." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Evet" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Hayır" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Not:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Uyarı:" # include/ui/common_messages.ycp:95 #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Hata:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "tamamlandı" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 #, fuzzy msgid "attention" msgstr "dikkat" # include/ui/common_messages.ycp:95 #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "hata" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Uyarı: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Alınıyor:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "başlatılıyor" # clients/nis_write.ycp:73 #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "bulunamadı" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "Bu seçenek için yardım mevcut değil" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "tüm seçenekleri göster" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "evet" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "hayır" #, fuzzy #~ msgid "Package is not signed!" #~ msgstr "Geri yüklenecek paketler" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s dağıtım güncelleme deposuna ait değil." # clients/hwinfo.ycp:66 #~ msgid "%s has inferior architecture" #~ msgstr "%s alt mimariye sahip" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "İstenen bütün depoları etkinleştirdiğinizden emin misiniz?" # clients/online_update_start.ycp:171 #~ msgid "%s is not installable" #~ msgstr "%s kurulabilir değil" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #~ msgid "cannot install both %s and %s" #~ msgstr "%s ve %s in ikisi birden yüklenemez" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s, %s tarafından sağlanan %s ile çakışıyor." #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s %s tarafından sağlanan %s'in süresini bitirdi." #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%1, %2 ile çakışıyor" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s, %s'i gerektiriyor, ama bu gereklilik sağlanamıyor." # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #~ msgid "do not install %s" #~ msgstr "%s yüklenmedi" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%1 paketini sil" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Kurulum" #~ msgid "Can't open lock file: %s" #~ msgstr "Kilitlenmiş dosya açılamıyor: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Bu işlem zaten başka bir program tarafından çalıştırıldı." #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Üzgünüz, libzypp'nin bu versiyonunda HAL desteklenmemektedir." #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "bağlı değil" #, fuzzy #~ msgid "Unable to create dbus connection" #~ msgstr "çalışma alanı oluşturulamadı\n" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Mutex nitelikleri başlatılamıyor" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Yinelemeli mutex nitelikleri ayarlanamadı." #~ msgid "Can't initialize recursive mutex" #~ msgstr "Yinelemeli mutex başlatılamıyor" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Mutex kilidine ulaşılamadı." #~ msgid "Can't release the mutex lock" #~ msgstr "Mutex kilidi açılamıyor" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "%s dosyasından genel anahtar alınamadı: %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "'%s' genel anahtarı silinemedi: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr " '%s' deki image dosyasını bağlayacak döngü aracı bulunamadı" #, fuzzy #~ msgid "generally ignore of some dependecies" #~ msgstr "şu çözülmemiş gereksinimlere sahip:" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #, fuzzy #~ msgid "do not forbid installation of %s" #~ msgstr "Kurulan disk:" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #~ msgid "do not keep %s installed" #~ msgstr "%s i kurulu halde bırakmayın" #~ msgid "Tried to import not existant key %s into keyring %s" #~ msgstr "حاول استيراد مفتاح غير موجود %s إلى حلقة مفاتيح %s" #~ msgid "Valid metadata not found at specified URL(s)" #~ msgstr "بيانات التعريف غير صحيحة لم يتم العثور عليها في المسار(s)" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "خيار list غير معروف" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "لا يحتوي الملف %s على مجموع اختباري.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "فشل التحقق من سلامة الملف %s باستخدام المفتاح التالي:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير صالح.\n" #~ "متوقع %s، تم العثور على %s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "يحتوي الملف %s على مجموع اختباري غير معروف %s.\n" #~ "هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "لم يتم توقيع الملف %s.\n" #~ "هل تريد استخدامه على أي حال؟" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "تم توقيع الملف %s باستخدام مفتاح غير معروف:\n" #~ "%s|%s|%s\n" #~ " هل تريد استخدام الملف على أي حال؟" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "تم العثور على مفتاح غير موثوق:\n" #~ "%s|%s|%s\n" #~ " هل تريد الوثوق بالمفتاح؟" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "كلمة السر CA غير صالحة." #~ msgid "%s remove ok" #~ msgstr "تمت إزالة %s بنجاح" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "يوفر %s هذه التبعية، لكنه سيؤدي إلى تغيير هيكل العنصر المثبَّت" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "قم بتثبيت %s بالرغم من أنه قد يؤدي إلى تغيير الهيكل" #~ msgid "delete %s" #~ msgstr "حذف %s" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "تعذر فتح الملف %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "تعذرت قراءة القطاع %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "تحليل معلمة المسار غير مدعوم لعنوان URL هذا" #~ msgid "Software management is already running." #~ msgstr "إدارة البرامج قيد التشغيل بالفعل." #~ msgid "%s is replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #~ msgid "%s replaced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "لن يتم إلغاء تثبيت %s لأنه لا يزال مطلوبًا" #~ msgid "Invalid information" #~ msgstr "المعلومات غير صالحة" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s مطلوب بواسطة التبعيات القابلة للتحليل الأخرى" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s مطلوب بواسطة\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s يجعل التبعيات القابلة للتحليل الأخرى قديمة" #~ msgid "%s obsoletes:%s" #~ msgstr "%s يجعل العنصر التالي قديمًا:%s" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "سيتم حذف هذه التبعيات القابلة للتحليل من النظام." #~ msgid "%s depends on other resolvables" #~ msgstr "%s يعتمد على التبعيات القابلة للتحليل الأخرى" #~ msgid "%s depends on %s" #~ msgstr "%s يعتمد على %s" #~ msgid "%s depends on:%s" #~ msgstr "%s يعتمد على:%s" #~ msgid "Child of" #~ msgstr "عنصر فرعي لـ" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "لا يتوفر أي مورد يدعم هذا المتطلب." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "نتيجة للمشكلات الموضحة أعلاه/أدناه، لن يقوم هذا التحديد بحل كافة التبعيات" #~ msgid "%s has unfulfilled requirements" #~ msgstr "لم يتم استيفاء متطلبات %s" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم إلغاء تثبيته" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "يستوفي %s تبعيات %s، لكن سيتم الاحتفاظ به في النظام لديك" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s يجعل %s قديمًا. لكن يتعذر حذف %s لأنه مقفل." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "تعذر تثبيت %s لأنه متعارض" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "لطلب %s لـ %s عند تحديث %s" #~ msgid ", Trigger: " #~ msgstr "، تشغيل:" #~ msgid "package" #~ msgstr "الحزمة" #~ msgid "selection" #~ msgstr "التحديد" #~ msgid "pattern" #~ msgstr "النمط" #~ msgid "product" #~ msgstr "المنتج" #~ msgid "script" #~ msgstr "البرنامج النصي" #~ msgid "message" #~ msgstr "الرسالة" #~ msgid "atom" #~ msgstr "الذرة" #~ msgid "system" #~ msgstr "النظام" #~ msgid "Resolvable" #~ msgstr "التبعية القابلة للتحليل" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "تعليم محاولة التحديد هذه كغير صالحة." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "تعليم التبعية القابلة للتحليل %s باعتبارها قابلة لإلغاء التثبيت" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "تمت جدولة %s لتثبيته، لكن لا يمكن القيام بذلك بسبب وجود مشكلات في التبعية." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "تعذر تثبيت %s لأنه تم تعليمه بالفعل على أنه مطلوب إلغاء تثبيته" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "تعذر تثبيت %s لأنه لا ينطبق على هذا النظام." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "تعذر تثبيت %s، لأن %s تم تعليمه بالفعل على أنه مطلوب تثبيته" #~ msgid "This would invalidate %s." #~ msgstr "سيؤدي هذا إلى إلغاء صلاحية %s." #~ msgid "Updating %s to %s" #~ msgstr "تحديث %s إلى %s" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "لا يوجد أي موفرين مثبَّتين بدائل لـ %s" #~ msgid "for %s" #~ msgstr "لـ %s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "لا يمكن التحديث إلى %s لتجنب إزالة %s." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s يوفر %s، لكن تمت جدولته لإلغاء تثبيته." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s يوفر %s، لكن تم تثبيت إصدار آخر لـ %s هذا بالفعل." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s يوفر %s، لكنه قابل لإلغاء التثبيت. حاول تثبيته للحصول على مزيد من " #~ "التفاصيل." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s يوفر %s، لكنه مقفل." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s يوفر %s، لكن تمت جدولته للاحتفاظ به." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s يوفر %s، لكن له هيكل آخر." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "تعذر استيفاء متطلب %s لـ %s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل مثبَّتة أخرى، لذا لن يتم إلغاء الارتباط." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "يتطلب تعارض %s (%s) إزالة %s المطلوب تثبيته" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "تعليم %s باعتباره قابل لإلغاء التثبيت بسبب وجود تعارضات على %s" #~ msgid "from %s" #~ msgstr "من %s" #~ msgid "%s depended on %s" #~ msgstr "%s اعتمد على %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s مطلوب بواسطة %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s تم استبداله بـ %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "%s part of %s" #~ msgstr "%s جزء من %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "موعد الاستحقاق: %1" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s مطلوب بواسطة %s" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s مطلوب بواسطة تبعية قابلة للتحليل أخرى مطلوب تثبيتها، لذا لن يتم إلغاء " #~ "الارتباط." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "تعذر إنشاء الملف المطلوب لتنفيذ عملية تثبيت التحديث." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "تم تسجيل مصدر واحد على الأقل، تعذرت استعادة المصادر المخزَّنة." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "تعذر تثبيت %s لاستيفاء تبعيات %s" #~ msgid "%s dependend on %s" #~ msgstr "%s اعتمد على %s" #~ msgid "Reading index files" #~ msgstr "قراءة ملفات الفهرس" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "فشل ملف repomd.xml الموقَّع في التحقق من التوقيع." #~ msgid "Reading product from %s" #~ msgstr "قراءة المنتج من %s" #~ msgid "Reading filelist from %s" #~ msgstr "قراءة قائمة الملفات من %s" #~ msgid "Reading packages from %s" #~ msgstr "قراءة الحزم من %s" #~ msgid "Reading selection from %s" #~ msgstr "قراءة التحديد من %s" #~ msgid "Reading pattern from %s" #~ msgstr "قراءة النمط من %s" #~ msgid "Reading patches index %s" #~ msgstr "قراءة فهرس التصحيحات %s" #~ msgid "Reading patch %s" #~ msgstr "قراءة التصحيح %s" #~ msgid "The script file failed the checksum test." #~ msgstr "فشل ملف البرنامج النصي في اختبار المجموع الاختباري." #~ msgid "Reading translation: %s" #~ msgstr "قراءة الترجمة: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "فشل التحقق من سلامة الحزمة %s. هل تريد إعادة محاولة إنزالها، أو إيقاف " #~ "التثبيت؟" #~ msgid " miss checksum." #~ msgstr "فقد المجموع الاختباري." #~ msgid " fails checksum verification." #~ msgstr "فشل التحقق من المجموع الاختباري." #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "%s anahtarlığındaki %s genel anahtarı %s dosyasında oluşturulamadı" #~ msgid "Can't chdir to '/' inside chroot (%s)." #~ msgstr "Chroot'un içinde '/' chdir yapılamıyor(%s) ." #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "'%s' için indirme (Metalink curl) başlatılamadı." #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "'%s' için indirme(metalink curl) hatası:\n" #~ "Hata kodu: %s\n" #~ "Hata raporu: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "%d%% 'de indirme kesildi" #~ msgid "Download interrupted by user" #~ msgstr "İndirme kullanıcı tarafından iptal edildi" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "'%s' için indirme (metalink curl) ayarları düzenlenirken bir hata " #~ "meydana geldi:" #~ msgid "Failed to download %s from %s" #~ msgstr "%s den %s indirilirken hata meydana geldi" #, fuzzy #~ msgid "Serbia and Montenegro" #~ msgstr "Seri kablo bağlantısı" # clients/inst_sw_single.ycp:742 #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "Yetersiz bağımlılıklar:" #, fuzzy #~ msgid "%s remove failed" #~ msgstr "rpm başarısız oldu." #, fuzzy #~ msgid "rpm output:" #~ msgstr "Program çıktısı:\n" # clients/online_update_start.ycp:171 #, fuzzy #~ msgid "%s install failed" #~ msgstr "Kurulum işlemi başarısız oldu." #, fuzzy #~ msgid "%s installed ok" #~ msgstr "&Evet, kur" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "Ignore that %s is already set to install" #~ msgstr "%1 dizini zaten listede." #, fuzzy #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "Ignore this conflict of %s" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "Ignore this requirement just here" #~ msgstr "şu çözülmemiş gereksinimlere sahip:" #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Eksik paketleri kur" #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "Eksik paketleri kur" #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "install %s" #~ msgstr "%1 paketini kur" # include/security/ui.ycp:774 #, fuzzy #~ msgid "unlock %s" #~ msgstr "Saatler" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "%s conflicts with other resolvables" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "Bu paket kurulu değildir ve kurulmayacaktır." # clients/inst_sw_single.ycp:742 #, fuzzy #~ msgid "%s has missing dependencies" #~ msgstr "Yetersiz bağımlılıklar:" # clients/inst_sw_single.ycp:742 #, fuzzy #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "Yetersiz bağımlılıklar:" # clients/online_update_load.ycp:923 #, fuzzy #~ msgid "No need to install %s" #~ msgstr "yeniden kurulmalı" # clients/inst_sw_single.ycp:742 #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "Yetersiz bağımlılıklar:" #, fuzzy #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%1, %2 ile çakışıyor" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "Paket gereksinimlerini listele" #, fuzzy #~ msgid ", Action: " #~ msgstr "Hareket" # clients/online_update_details.ycp:88 clients/online_update_select.ycp:112 #~ msgid "patch" #~ msgstr "yama" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #, fuzzy #~ msgid "Establishing %s" #~ msgstr "Kurulan disk:" # include/partitioning/auto_part_ui.ycp:200 include/partitioning/auto_part_ui.ycp:249 #, fuzzy #~ msgid "Installing %s" #~ msgstr "Kurulan disk:" # include/scanner/scanner_start.ycp:138 #, fuzzy #~ msgid "Skipping %s: already installed" #~ msgstr "Önceden kurulu tarayıcılar kontrol ediliyor" #, fuzzy #~ msgid "%s is locked and cannot be uninstalled." #~ msgstr "Bu paket kurulu değildir ve kurulmayacaktır." # include/ui/common_messages.ycp:95 #, fuzzy #~ msgid " Error!" #~ msgstr "Hata" #, fuzzy #~ msgid " Important!" #~ msgstr "Dışarıdan veri al" #, fuzzy #~ msgid "Unable to parse Url authority" #~ msgstr "çalışma alanı oluşturulamadı\n" #, fuzzy #~ msgid "Ignore this requirement generally" #~ msgstr "şu çözülmemiş gereksinimlere sahip:" #, fuzzy #~ msgid "Unable to restore all sources." #~ msgstr "çalışma alanı oluşturulamadı\n" # # clients/inst_sw_select.ycp:195 #, fuzzy #~ msgid "Reading packages file" #~ msgstr "{0} dosyasını barındıran paket yok" #, fuzzy #~ msgid "Downloading %s" #~ msgstr "%1 yüklemesinde bir hata oluştu" #~ msgid "Ok" #~ msgstr "Tamam" #, fuzzy #~ msgid "The package file has incorrect MD5 sum" #~ msgstr "Geri yüklenecek paketler" #, fuzzy #~ msgid "The package has incorrect signature" #~ msgstr "Geri yüklenecek paketler" #, fuzzy #~ msgid "The package archive has incorrect MD5 sum" #~ msgstr "Geri yüklenecek paketler" #~ msgid "Default" #~ msgstr "Öntanımlı" # include/scanner/scanner_manual.ycp:82 #, fuzzy #~ msgid "to be installed (soft)" #~ msgstr "şu şekilde yüklenecek:" # clients/online_update_load.ycp:923 #, fuzzy #~ msgid "to be uninstalled" #~ msgstr "yeniden kurulmalı" libzypp-17.36.5/po/uk.po000066400000000000000000004144061476576476200150240ustar00rootroot00000000000000# translation of zypp.po to Ukrainian # Translation of zypp.uk.po to Ukrainian # Ukrainian message file for YaST2 (@memory@). # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2005 SUSE Linux Products GmbH. # # xxx, 2005. # Ivan Petrouchtchak , 2006, 2007. # Yuri Chornoivan , 2008. # Ivan Petrouchtchak , 2008, 2009. # Andriy Bandura , 2014, 2015. msgid "" msgstr "" "Project-Id-Version: zypp.uk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2021-03-11 21:56+0000\n" "Last-Translator: Lesath <4lesath@gmail.com>\n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 3.6.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Невідома країна: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Немає коду" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Андорра" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Об'єднані Арабські Емірати" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Афганістан" # AG #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Антигуа і Барбуда" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Ангілья" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Албанія" # AM # fuzzy #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Вірменія" # AN # fuzzy #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Нідерландські Антильські острови" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Ангола" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Антарктика" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Аргентина" # AS # fuzzy #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Американське Самоа" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Австрія" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Австралія" # CU # fuzzy #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Аруба" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Аландські острови" # AZ #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Азербайджан" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Боснія і Герцеговина" # BB #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Барбадос" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Бангладеш" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Бельгія" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Буркіна-Фасо" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Болгарія" # BH # fuzzy #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Бахрейн" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Бурунді" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Бенін" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Бермуди" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Бруней Даруссалам" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Болівія" # BR #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Бразилія" # BS # fuzzy #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Багамські острови" # BH # fuzzy #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Бутан" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Острів Буве" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Ботсвана" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Білорусь" # BZ # fuzzy #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Беліз" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Канада" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Кокосові острови" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Конго" # CF # fuzzy #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Центральноафриканська республіка" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Швейцарія" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Кот д'Івуар" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Острови Кука" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Чилі" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Камерун" # CN #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Китай" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Колумбія" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Коста-Рика" # CU # fuzzy #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Куба" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Кабо-Верде" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Різдвяні острови" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Кіпр" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Чехія" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Німеччина" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Джибуті" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Данія" # DM # fuzzy #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Домініка" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Домініканська республіка" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Алжир" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Еквадор" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Естонія" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Єгипет" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Західна Сахара" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Еритрея" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Іспанія" # ET # fuzzy #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Ефіопія" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Фінляндія" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Фіджі" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Фолклендські острови (Мальвінські)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Мікронезія (Федеральні Штати)" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Фарерські острови" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "Франція" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Метропольна Франція" # GH # fuzzy #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Габон" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Сполучене Королівство" # GD #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Гренада" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Грузія" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Французька Гвіана" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Гернсі" # GH # fuzzy #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Гана" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Гібралтар" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Гренландія" # GM # fuzzy #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Гамбія" # GU # fuzzy #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Гвінея" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Гваделупа" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Екваторіальна Гвінея" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Греція" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Південна Джорджія і Південні Сандвічеві острови" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Гватемала" # GU # fuzzy #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Гуам" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Гвінея-Бісау" # GH # fuzzy #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Гвіана" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Гонконг" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Хердські і Макдональд острови" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Гондурас" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Хорватія" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Гаїті" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Угорщина" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Індонезія" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ірландія" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Ізраїль" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Острів Мен" #: zypp/CountryCode.cc:261 msgid "India" msgstr "Індія" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Британська Територія в Індійському океані" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Ірак" # IR # fuzzy #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Іран" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Ісландія" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Італія" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Джерсі" # JM # fuzzy #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Ямайка" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Йорданія" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Японія" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Кенія" # KZ # fuzzy #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Киргизстан" # KH # fuzzy #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Камбоджа" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Кірибаті" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Комори" # KN # fuzzy #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Сент Кітс і Невіс" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Північна Корея" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Південна Корея" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Кувейт" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Кайманові острови" # KZ # fuzzy #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Казахстан" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Лаоська Народно-Демократична Республіка" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Ліван" # LC # fuzzy #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Санта Люсія" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Ліхтенштейн" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Шрі-Ланка" # LR # fuzzy #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Ліберія" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Лесото" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Литва" # LU #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Люксембург" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Латвія" # LR # fuzzy #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Лівія" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Марокко" # MO # fuzzy #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Монако" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Молдова" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Чорногорія" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Сен-Мартен" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Мадагаскар" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Маршаллові острови" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Північна Македонія" # ML # fuzzy #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Малі" # MM # fuzzy #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "М’янма" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Монголія" # MO # fuzzy #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Аоминь" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Північні Марианські острови" # MU # fuzzy #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Мартиніка" # MR # fuzzy #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Маврітанія" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Монтсеррат" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Мальта" # MU # fuzzy #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Маврікій" # MV # fuzzy #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Мальдіви" # MW # fuzzy #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Малаві" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Мексика" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Малайзія" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Мозамбік" # GM # fuzzy #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Намібія" # NC # fuzzy #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Нова Каледонія" # NG # fuzzy #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Нігер" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Острів Норфолк" # NG # fuzzy #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Нігерія" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Нікарагуа" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Нідерланди" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Норвегія" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Непал" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Науру" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Ніуе" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Нова Зеландія" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Оман" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Панама" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Перу" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Французька Полінезія" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Папуа Нова Гвінея" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Філіппіни" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Пакистан" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Польща" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Сен П'єр і Мікелон" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Піткерн" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Пуерто-Ріко" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Палестинська територія" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Португалія" # PW # fuzzy #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Палау" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Парагвай" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Катар" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Реуніон" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Румунія" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Сербія" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Російська Федерація" # RW # fuzzy #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Руанда" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Саудівська Аравія" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Соломонові острови" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Сейшели" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Судан" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Швеція" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Сингапур" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Острів Святої Олени" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Словенія" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Свальбард і Ян Маєн" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Словаччина" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Сьєра Леон" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "Сан Марино" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Сенегал" # SO # fuzzy #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Сомалі" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Суринам" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Сан Томе і Принсипі" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "Ель Сальвадор" # SY # fuzzy #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Сирія" # SZ # fuzzy #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Есватіні" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Острови Теркс і Кайкос" # TD # fuzzy #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Чад" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Французькі Південні Території" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Того" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Таїланд" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Таджикистан" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Токелау" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Туркменістан" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Туніс" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Тонга" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Східний Тімор" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Туреччина" # TT #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Республіка Тринідад та Тобаго" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Тувалу" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Тайвань" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Танзанія" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Україна" # UG # fuzzy #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Уганда" # UM # fuzzy #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Віддалені острови США" # US # fuzzy #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "США" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Уругвай" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Узбекистан" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Святий Престол (Ватикан, місто-держава)" # VC # fuzzy #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Сент Вікент і Гренадіни" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Венесуела" # VI # fuzzy #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Віргінські острови (Британія)" # VI # fuzzy #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Віргінські острови, США" # VN # fuzzy #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "В'єтнам" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Вануату" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Валліс і Футунські острови" # KH # fuzzy #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Самоа" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Ємен" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Майотта" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Південна Африка" # ZM # fuzzy #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Замбія" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Зімбабве" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Ознаки" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "Вимоги" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Вимагає" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Конфліктує" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "Робить застарілим" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Рекомендує" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Пропонує" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Покращує" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Доповнює" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Невідома мова: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Афар" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Абхазька" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Ахінська" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Аколі" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Адангме" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Адиґхе" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Афро-азіатські (інші)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Афрігілі" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Африкаанська" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Аіну" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Акан" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Акадійська" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Албанська" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Алеутська" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Алгонкінські мови" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Південноалтайська" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Амхарська" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Англійська, стара (450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Мови апачі" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Арабська" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Арамейська" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Арагонська" # AM # fuzzy #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Вірменська" # AM # fuzzy #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Арауканська" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Арапахо" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Штучні (інші)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Аравацька" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Ассамська" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Астурійська" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Атапаські мови" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Австралійські мови" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Аварська" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Авестійська" # SZ # fuzzy #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Авадхі" # MM # fuzzy #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Аймарська" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Азербайджанська" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Банда" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Бамілекські мови" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Башкирська" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Балучі" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Бамбара" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Балійська" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Баскська" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Баса" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Балтійські (інші)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Бежа" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Білоруська" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Бемба" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Бенгальська" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Берберські (інші)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Бходжпурі" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Біхарі" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Бікол" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Біні" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Біслама" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Сіксіка" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Банту (інші)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Боснійська" # BR #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Брай" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Бретонська" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Батак (Індонезія)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Бурятська" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Бугійська" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Болгарська" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Бірманська" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Блін" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Каддо" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Індіанські центрально-американські (інші)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Карибські мови" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Каталанська" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Кавказькі (інші)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Кебуанська" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Кельтські (інші)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Чаморо" # CN #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Чибча" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Чеченська" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Чагатай" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Китайська" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Чуукійська" # ML # fuzzy #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Марі" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Чинукський жаргон" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Чокто" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Чіпев’ян" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Черокі" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Церковнослов'янська" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Чуваська" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Шайєнська" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Чамські мови" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Коптська" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Корнійська" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Корсиканська" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Креольські і піджинські, англійські (інші)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Креольські і піджинські, французькі (інші)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Креольські і піджинські, португальські (інші)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Крі" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Кримськотатарська" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Креольські і піджинські (інші)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Кашубська" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Кушитські (інші)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Чеська" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Дакота" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Данська" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Даргва" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Даяк" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Делавар" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Атапаська" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Догрібська" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Дінка" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Дайвегі" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Догрі" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Дравідські (інші)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Нижня лужицька" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Дуала" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Голландська, середня (1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Голландська" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Діула" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Дзонгка" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Ефік" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Єгипетська (древня)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Екаюк" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Еламська" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Англійська" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Англійська, середньовічна (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Есперанто" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Естонська" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Еве" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Евондо" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Фанг" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Фарерська" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Фанті" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Фіджійська" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Філіппінська" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Фінська" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Фіно-угорські (інші)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Фон" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Французька" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Французька, середньовічна (1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Французька, давня (842 - 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Фризька" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Фула" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Фріулійська" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Га" # GH # fuzzy #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Гайо" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Ґбая" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Германські (інші)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Грузинська" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Німецька" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Ґіз" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Гілбертійська" # ML # fuzzy #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Гаельська" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Ірландська" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Галісійська" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Манкс" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Німецька, середньо-висока (1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Німецька, стара висока (750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Ґонді" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Ґоронтало" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Готська" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Гребо" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Грецька, стародавня (до 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Грецька, сучасна (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Гуарані" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Гуджараті" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Ґвіч’ін" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Хайда" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Гаїтянська" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Хауса" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Гавайська" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Єврейська" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Гереро" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Хілігайнонська" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Гімачалі" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Хінді" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Хетська" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Хмонг" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Хірі Моту" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Верхня лужицька" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Угорська" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Гупа" # IR # fuzzy #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Ібан" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Ігбо" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Ісландська" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ідо" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Сичуаньська Ї" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Іжо" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Інуктитут" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Інтерлінгва" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Ілоко" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Інтерлінгва (Інтернаціональна допоміжна асоціація мови)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Індійські (інші)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Індонезійська" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Індоєвропейські (інші)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Інгуш" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Інупіак" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Іранські (інші)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Ірокезькі мови" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Італійська" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Японська" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Ложбан" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Японська" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Юдейсько-перська" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Юдейсько-арабська" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Каракалпацька" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Кабільська" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Качин" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Калаалісут" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Камба" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Каннадська" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Карен" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Кашмірська" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Канурі" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Каві" # KZ # fuzzy #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Казахська" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Кабардинська" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Хасі" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Койсанські (інші)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Кхмерська" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Хотанська" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Кікуйю" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Кіньяруанда" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Киргизька" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Кімбунду" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Конкані" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Комі" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Конго" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Корейська" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Косраенська" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Кпеле" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Карачаєво-балкарська" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Кру" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Курух" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Куаньяма" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Кумик" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Курдська" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Кутенай" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ладіно" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Лахнда" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Ламба" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Лаоська" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Латинська" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Латвійська" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Лезгінська" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Лімбурганська" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Лінгала" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Литовська" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Монгольська" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Лозі" # LU #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Люксембурзька" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Луба-лулуа" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Луба-катанга" # GH # fuzzy #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Ґанда" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Луїсено" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Лунда" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Луо (Кенія і Танзанія)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Лушаї" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Македонська" # MV # fuzzy #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Мадурі" # MU # fuzzy #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Маґахі" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Маршальська" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Маїтхілі" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Макасар" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Малаялам" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Мандінго" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Маорі" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Австронезійські (інші)" # MU # fuzzy #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Маратхі" # MW # fuzzy #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Масаї" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Малайська" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Мокша" # MM # fuzzy #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Мандар" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Менде" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Ірландська, середньовічна (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Мікмак" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Мінангкабау" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Інші мови" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Мон-кхмерські (інші)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Малагасійська" # MV # fuzzy #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Мальтійська" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Манчу" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Маніпурі" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Мови манобо" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Могавк" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Молдовська" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Монгольська" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Моссі" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Декілька мов" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Мови мунда" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Крік" # FM # fuzzy #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Мірандська" # MU # fuzzy #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Марварі" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Мови Майя" # SY # fuzzy #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Ерзія" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Нагуатл" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Індіанська північноамериканська" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Неаполітанська" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Навахо" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ндебеле, південна" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ндебеле, північна" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ндонга" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Нижня німецька" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Непальська" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Непал Вхаза" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Ніас" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Нігеро-кордофанські (інші)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Ніу" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Норвезька (лансмол)" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Норвезька (букмол)" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Ногайська" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Норвезька, давня" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Норвезька" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Північне Сото" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Нубійські мови" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Класичне неварі" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Чичева" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Ньямвезі" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Ньянколе" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Ніоро" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Нзіма" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Провансальська (після 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Ожібва" # SY # fuzzy #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Орійська" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Оромо" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Осаге" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Осетинська" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Турецька, оттоманська (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Отомійські мови" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Папуаські (інші)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Пангасійська" # ML # fuzzy #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Пахлаві" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Пампанга" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Панджабі" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Папіяменто" # PW # fuzzy #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Палау" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Перська, давня (600-400 до н.е.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Перська" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Філіппінські (інші)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Фінікійська" # ML # fuzzy #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Палі" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Польська" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Понпейська" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Португальська" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Пракритські мови" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Провансальська, давня (до 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Пушту" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Кечуа" # KZ # fuzzy #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Раджастані" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Рапануї" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Раротонгська" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Романські (інші)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Ретороманська" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Циганська" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Румунська" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Рунді" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Російська" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Сандаве" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Санго" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Якутська" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Індіанські південноамериканські (інші)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Салішанські мови" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Самарійська арамейська" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Санскрит" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Сасак" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Санталі" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Сербська" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Сицилійська" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Шотландська" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Хорватська" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Селкуп" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Семітські (інші)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Ірландська, давня (до 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Знакові мови" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Шан" # KH # fuzzy #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Сідамо" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Сингальська" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Сіуанські мови" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Сино-тибетські (інші)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Слов'янські (інші)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Словацька" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Словенська" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Південна Самі" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Північна Самі" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Мови Самі (інші)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Луле самі" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Інарі самі" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Самоанська" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Сколт самі" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Шона" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Синдхі" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Сонінке" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Согдійська" # SO # fuzzy #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Сомалійська" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Сонгай" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Сото, південна" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Іспанська" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Сардинська" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Серер" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Ніло-сахарські (інші)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Сваті" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Сукума" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Сунданська" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Сусу" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Шумерська" # SZ # fuzzy #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Суахілі" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Шведська" # SY # fuzzy #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Сирійська" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Таїтянська" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Тайські (інші)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Тамільська" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Татарська" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Телугу" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Тімне" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Терено" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Тетум" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Таджицька" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Тагалог" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Таїландська" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Тибетська" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Тигре" # NG # fuzzy #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Тигринья" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Тів" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Клінгонська" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Тлінгіт" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Тамашек" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Тонга (Ньяса)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Тонга (острови Тонга)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Ток пісін" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Тсимшіан" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Тсвана" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Тсонга" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Туркменська" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Тумбука" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Мови Тупі" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Турецька" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Алтайські (інші)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Тві" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Тувинська" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Удмуртська" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Угарітська" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Уйгурська" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Українська" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Умбунду" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Невизначено" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Урду" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Узбецька" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Ваі" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Венда" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "В'єтнамська" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Волапюк" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Вотік" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Вакашанські мови" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Валамо" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Варай" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Вашо" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Валлійська" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Лужицькі мови" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Валлонська" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Волоф" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Калмицька" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Хоза" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Йао" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Япізька" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Ідиш" # CU # fuzzy #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Йоруба" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Юпікські мови" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Сапотекські мови" # GD #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Зенага" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Жуанг" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Занде" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Зулуська" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Зуні" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Буде виконано такі дії:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "невідомий" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "не підтримується" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Рівень 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Рівень 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Рівень 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "Потрібний додатковий контракт клієнта" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "недійсний" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Не вказано рівень підтримки" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Постачальник не надає підтримки." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Визначення проблеми, тобто технічна підтримка, при якій надається інформація " "про сумісність, допомога при встановленні, підтримка для використання, та " "вирішення простих проблем. Підтримка 1-го рівня не займається виправленням " "помилками дефектів продуктів." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "Виокремлення проблеми, тобто технічна підтримка, при якій дублікуються " "проблеми клієнтів, виокремлюється проблемна ділянка і надається вирішення " "проблем, які не було виправлено 1-ми рівнем підтримки." #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "Вирішення проблем, тобто технічна підтримка, призначена для вирішення " "складних проблем, до яких залучають інженерний персонал для вирішення " "дефектів в продуктах, що їх було знайдено підтримкою 2-го рівня." #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "Для отримання підтримки потрібний додатковий контракт клієнта." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Невідомий параметр підтримки. Немає опису" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "Керування системою заблоковано програмою з pid %d (%s).\n" "Закрийте цю програму перш ніж спробувати знову." #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Невідомий режим збігу «%s»" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Невідомий режим збігу «%s» для шаблона «%s»" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Некоректний формальний вираз «%s»: regcomp повернула %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Недійсний формальний вираз «%s»" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "Потрібна автентифікація для «%s»" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Відвідайте Центр клієнтів SUSE, щоб перевірити, чи ваша реєстрація дійсна та " "чи не закінчився термін дії." #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" "Відвідайте центр покупця Novel для перевірки терміну дії вашої реєстрації." #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" "Створюємо точку монтування: неможливо знайти директорію з можливістю запису " "для створення точки монтування" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "Встановіть спершу пакунок 'lsof'." #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Неможливо створити директорію кешу метаданих." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Помилка спроби читання з «%s»" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Неможливо створити %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Не вдалось скешувати сховище(%d)." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Створення кешу сховища «%s»" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Не вдалося створити кеш %s - немає прав на запис." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Необроблений тип сховища" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Додавання сховища «%s»" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Не чинна назва файла сховища «%s»" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Неможливо відкрити файл «%s» для запису." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Невідома помилка читання з «%s»" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "Неможливо прочитати директорію сховища '%1%': Доступ заборонено" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Не вдалось прочитати директорію «%s»" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "Неможливо прочитати файл сховища '%1%': Доступ заборонений" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Вилучення сховища «%s»" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Неможливо визначити, де знаходиться сховище." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Неможливо вилучити «%s»" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Неможливо визначити, де знаходиться служба." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "Невідома служба '%1%': видалення сховища служби '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "Псевдонім сховища не може починатися з точки." #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "Псевдонім служби не може починатися з точки." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" msgstr[2] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" # continue button label #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Продовжити?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "Сховище %1% не визначає додаткові мережеві адреси для «gpgkey=»." #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "Пошук ID ключа для gpg %1% у сховищі %2%." #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "Пошук ID ключа для gpg %1% у кеші %2%." #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "Немає потрібного атрибута «%s»." #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Потрібний один або двоє атрибутів «%s» та «'%s»." #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "Невдала перевірка підпису" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Пакунок %s, здається, пошкоджено під час перенесення. Повторити спробу?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "Не вдалося надати пакунок %s. Повторити спробу?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "перевірка applydeltarpm зазнала невдачі." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "застосування дельти rpm зазнало невдачі." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "Модуль служби не підтримує зміну атрибута." #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Неможливо надати файл «%s» зі сховища «%s»" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "В сховищі немає url." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом пакунку\n" "%3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом пакунку\n" "%3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом пакунку\n" "%3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом пакунку\n" "%3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом\n" "%3%\n" " пакунку\n" "%4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом\n" "%3%\n" " пакунку\n" "%4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом\n" "%3%\n" "з пакунку\n" "%4%" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "Файл %1%\n" "з пакунку\n" "%2%\n" "конфліктує з файлом\n" "%3%\n" "з пакунку\n" "%4%" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Неможливо створити sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "зламати %s, ігноруючи деякі залежності" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "взагалі нехтувати деякими залежностями" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" "встановлений %1% не належить до оновлюваного сховища та мусить бути замінений" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "%1% який було встановлено не належить до оновлюваного сховища" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "встановлений %1% має неповноцінну архітектуру" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "%1% який було встановлено має неповноцінну архітектуру" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "проблема з встановленим %1%" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "конфлікт запитів" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "якась проблема залежностей" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "ніхто не надає запитуваний «%1%»" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "Ви ввімкнули всі необхідні сховища?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "запитуваний пакунок %1% не існує" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "непідтримуваний запит" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "вилучені залежності: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "залежності без можливості встановлення: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "залежності без можливості встановлення: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Цей запит пошкодить вашу систему!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "ігнорувати попередження про пошкодження системи" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "встановити %1% хоч він і був відкладений" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "дозволити встановити PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "встановити %1% хоч він і був у чорному списку" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Встановлення перервано відповідно до вказівки." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " виконано" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " виконання зазнало невдачі" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s вже виконаний як %s)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " виконання пропущено під час переривання" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Помилка відсилання сповіщення про оновлення." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Нове повідомлення про оновлення" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Помилка RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "Не вдалося імпортувати відкритий ключ %1%" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Не вдалося вилучити відкрити ключ %1%" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Змінено конфігураційні файли для %s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm збережено %s як %s, але було неможливо виявити різницю" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm збережено %s як %s.\n" "Ось перші 25 рядків розбіжностей:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm створила %s як %s, але було неможливо виявити різницю" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm створили %s як %s.\n" "Ось перші 25 рядків розбіжностей:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Додатковий вивід rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "створено резервну копію %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "З підписом усе гаразд" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "Невідомий тип підпису" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "Підпис не перевіряється" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "З підписом усе гаразд, але ключ - ненадійний" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "Публічний ключ підписів - недоступний" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "Файл не існує чи підпис не можна перевірити" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "Файл не підписаний" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "(не минає)" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "минув: %1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "минає: %1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(не минає)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(МИНУЛО)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(минуло протягом 24 годин)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(закінчується через %d день)" msgstr[1] "(закінчується через %d дні)" msgstr[2] "(закінчується через %d днів)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Спроба імпорту неіснуючого ключа %s у сховище ключів %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "Не вдалося імпортувати ключ." #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Не вдалось вилучити ключ." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Файл підпису «%s» не знайдено" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Сумнівний тип «%s» для %u байтів контрольної суми «%s»" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Не вдалося відкрити pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Неможливо відкрити канал (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Недійсний рядок запиту URL LDAP" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Недійсний параметр запиту «%s» URL LDAP" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Не вдається клонувати об'єкт URL" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Не чинне порожнє посилання до об'єкта URL" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Неможливо розібрати компоненти URL" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Історія:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Схема Url не дозволяє %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Недійсний %s компонент «%s»" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Недійсний компонент %s" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Розбір рядка запиту не підтримується для цього URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Схема URL - це потрібний компонент" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Недійсна схема URL «%s»" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Схема URL не дозволяє імені користувача" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Схема URL не дозволяє пароля" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Схема URL потребує компонент вузла" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Схема URL не дозволяє компонент вузла" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Недійсний компонент вузла «%s»" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Схема URL не дозволяє порт" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Недійсний компонент порту «%s»" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Схема URL потребує назву шляху" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Відносний шлях не дозволяється при існуванні повноваження" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Закодований рядок містить нульовий байт" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Недійсний символ розділення масиву параметрів" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Недійсний символ розділення карти параметрів" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Недійсний символ сполучення масиву параметрів" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Команда завершила роботу зі станом %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Команду було вбито за сигналом %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Команда завершила роботу з невідомою помилкою." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Не вдалося створити chroot для «%s» (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Неможливо змінити директорію на «%s» (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Неможливо зробити chdir «%s» всередині chroot «%s» (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Не вдалося виконати «%s» (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Не вдалося відгалузити (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Не вдалося змонтувати %s у %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Не вдалося відмонтувати %s" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Некоректна назва файла: %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Носій не було відкрито під час спроби виконання дії «%s»." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Файл «%s» не знайдено на носії «%s»" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Неможливо записати у файл «%s»." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Носій не з’єднано" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Некоректна точка з’єднання носія" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "Започаткування завантаження (curl) зазнало невдачі для «%s»" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Системне виключення «%s» на носії «%s»." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Шлях «%s» на носії «%s» не є файлом." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Шлях «%s» на носії «%s» не є директорією." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "Помилковий URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Порожня назва вузла у URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Порожня файлова система за URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Порожнє місце призначення за URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Непідтримувана схема URI у «%s»." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Операція не підтримується носієм" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Помилка завантаження (curl) для «%s»:\n" "Код помилки: %s\n" "Повідомлення про помилку: %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Під час встановлення параметрів завантаження (curl) для «%s» сталася помилка:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "Пристрій носія «%s» не містить бажаного носія" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Носій «%s» використовується іншою копією програми" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Не вдається виштовхнути жодного носія" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Не вдається виштовхнути носія «%s»" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Дозвіл на доступ до «%s» заборонено." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "Перевищено час очікування при спробі доступу до «%s»." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "Завантажені дані перевищили очікуваний розмір файлу «%s» у «%s»." #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Адреса «%s» тимчасово недоступна." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " Проблема з сертифікатом SSL, перевірте чи все гаразд з сертифікатом CA для " "«%s»." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Метод автентифікації HTTP «%s», який не підтримується" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "Помилка (curl) завантаження «%s»:\n" "Код помилки: %s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "Помилка (curl) завантаження «%s»:\n" "Не вдається отримати відповідь HTTP\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Так" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Ні" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "Примітка:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "Увага:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "Помилка:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "завершено" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "увага" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "помилка" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "Попередження: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "Отримання:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "запуск" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "не знайдено" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "Для цього запрошення немає довідки." #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "для цього параметра немає довідки" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "показати усі параметри" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "так" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "ні" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "У вказаній адресі URL не знайдено чинних метаданих" #~ msgstr[1] "У вказаних адресах URL не знайдено чинних метаданих" #~ msgstr[2] "У вказаних адресах URL не знайдено чинних метаданих" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "Виконання сценарію %%posttrans '%1%'" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "Виконання сценаріїв %posttrans" #~ msgid "Package is not signed!" #~ msgstr "Пакунок не підписаний!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s не належить до сховища distupgrade (оновлення дистрибутиву)" #~ msgid "%s has inferior architecture" #~ msgstr "%s має слабшу архітектуру" #~ msgid "problem with installed package %s" #~ msgstr "проблема з встановленим пакунком %s" #~ msgid "nothing provides requested %s" #~ msgstr "жоден з пакунків не надає потрібного %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Чи ви увімкнули всі запитані сховища?" #~ msgid "package %s does not exist" #~ msgstr "пакунок %s не існує" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s надано системою і його неможливо прибрати" #~ msgid "%s is not installable" #~ msgstr "%s не можливо встановити" #~ msgid "nothing provides %s needed by %s" #~ msgstr "жоден з пакунків не надає %s, потрібного %s" #~ msgid "cannot install both %s and %s" #~ msgstr "неможливо встановити одночасно %s і %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s конфліктує з %s, що надається %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s робить застарілим %s, що надається %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "встановлений пакунок %s робить застарілим %s, який надається %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "Розв’язок %s конфліктує з %s, що у ньому міститься" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s потребує %s, але цю залежність неможливо вдовольнити" #~ msgid "remove lock to allow removal of %s" #~ msgstr "усунути блокування, щоб дозволити вилучення %s" #~ msgid "do not install %s" #~ msgstr "не встановлювати %s" #~ msgid "keep %s" #~ msgstr "залишити %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "усунути блокування, щоб дозволити встановлення %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "не питати про встановлення розв’язувача, що надає %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "не питати про вилучення всіх розв’язувачів, що надаються %s" #~ msgid "do not install most recent version of %s" #~ msgstr "не встановлювати ранішу версію %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "Залишити %s, незважаючи на слабшу архітектуру" #~ msgid "install %s despite the inferior architecture" #~ msgstr "Встановити %s, незважаючи на те, що це змінить архітектуру" #~ msgid "keep obsolete %s" #~ msgstr "Залишити застарілі %s" #~ msgid "install %s from excluded repository" #~ msgstr "Встановити %s з невключеного сховища" #~ msgid "downgrade of %s to %s" #~ msgstr "повернення замість %s %s" #~ msgid "architecture change of %s to %s" #~ msgstr "зміна архітектури з %s на %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "встановити %s (зі зміною виробника)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "заміна %s на %s" #~ msgid "deinstallation of %s" #~ msgstr "вилучення %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Не вдалося відкрити файл замка: %s" #~ msgid "This action is being run by another program already." #~ msgstr "Цю дію вже запущено іншою програмою." #~ msgid "Hal Exception" #~ msgstr "Виняток Hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "Вибачте, цю версію libzypp було складено без підтримки HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext не приєднано" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive не започатковано" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume не започатковано" #~ msgid "Unable to create dbus connection" #~ msgstr "Неможливо створити з'єднання з dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new: неможливо створити контекст libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: неможливо встановити з'єднання з dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Неможливо започаткувати контекст HAL context -- не запущено hald?" #~ msgid "Not a CDROM drive" #~ msgstr "Не привід CD-ROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Неможливо започаткувати атрибути mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Неможливо встановити рекурсивний атрибут mutex" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Неможливо започаткувати рекурсивний mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Неможливо отримати блокування mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Неможливо відпустити блокування mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "Не вдалося імпортувати відкритий ключ з файла %s: %s" # ############################################################################### # Old yast2-agents.po #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Не вдалося вилучити відкрити ключ %s: %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Неможливо знайти наявний пристрій для монтування штампа файла з «%s»" #~ msgid "do not keep %s installed" #~ msgstr "не залишати встановленим %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Не вдалося створити відкритий ключ %s зі списку ключів %s до файл %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "" #~ "Започаткування завантаження (Metalink curl) зазнало невдачі для «%s»" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Помилка завантаження (metalink curl) для «%s»:\n" #~ "Код помилки: %s\n" #~ "Повідомлення про помилку: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "Звантаження перервано на %d%%" #, fuzzy #~ msgid "Download interrupted by user" #~ msgstr "Звантаження перервано на %d%%" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Під час встановлення параметрів завантаження (metalink curl) для «%s» " #~ "сталася помилка:" #~ msgid "Failed to download %s from %s" #~ msgstr "Не вдалося звантажити %s з %s" #~ msgid "Serbia and Montenegro" #~ msgstr "Сербія і Чорногорія" libzypp-17.36.5/po/vi.po000066400000000000000000003010141476576476200150110ustar00rootroot00000000000000# Vietnamese translation for YaST2 (@memory@). # Copyright © 2006 SUSE Linux Products GmbH. # Copyright © 2005, 2006 Gnome i18n Project for Vietnamese. # Phan Vĩnh Thịnh , 2006. # Clytie Siddall , 2005, 2006. # msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2016-08-25 08:06+0000\n" "Last-Translator: Hoàng Phạm \n" "Language-Team: Vietnamese \n" "Language: vi\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: Weblate 2.6\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Cần" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Xung đột" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Lỗi khi đọc từ '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Không thể tạo %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Đang thêm kho '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Không thể mở tập tin '%s' để ghi." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "Đang xoá kho '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Không thể xác định nơi chứa kho phần mềm." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Không thể xoá '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Đã huỷ cài đặt theo yêu cầu." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Thông báo cập nhật mới" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "Lỗi RPM: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Failed to parse: %s." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Couldn't open file: %s." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Lệnh thực hiện khi kết nối" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Couldn't open file: %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Failed to parse: %s." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Couldn't open file: %s." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "" #: zypp-tui/Table.cc:32 msgid "No" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Couldn't open file: %s." #, fuzzy #~ msgid "HalContext not connected" #~ msgstr "chưa kết nối" #~ msgid "Not a CDROM drive" #~ msgstr "Không phải ổ đĩa CDROM" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Failed to parse: %s." #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Couldn't open file: %s." libzypp-17.36.5/po/wa.po000066400000000000000000003616461476576476200150230ustar00rootroot00000000000000# Translation into the walloon language. # Copyright (C) 2007 SUSE Linux Products GmbH. # # Pablo Saratxaga , 2001, 2004. # Jean Cayron , 2007, 2010, 2011, 2012. msgid "" msgstr "" "Project-Id-Version: lcn memory\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2012-08-24 14:42+0200\n" "Last-Translator: Jean Cayron \n" "Language-Team: Walloon \n" "Language: wa\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 1.4\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Payis nén cnoxhou : " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Pont d' côde" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andore" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Emirats Arabes Unis" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afganistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua eyet Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguila" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albaneye" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Årmeneye" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Antiyes neyerlandesses" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antartike" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Årdjintene" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "Samowa amerikinne" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Otriche" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Ostraleye" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Arouba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Iyes Aland" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaydjan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosneye" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Bårbades" # #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Beljike" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Bourkina Fasso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgåreye" # #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bareyn" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Bouroundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermudes" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Boliveye" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Braezi" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Boutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Iye Bouvet" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Boswana" # #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belaruss" # #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Iyes Cocos (Keeling)" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo-Brazza" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Cintrafrike" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Swisse" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Coisse d' Ivwere" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Iyes Cook" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Tchili" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Camrone" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "Chine" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombeye" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cap Vert" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Iye Christmas" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Chipe" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Tchekeye" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Almagne" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Daenmåtche" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominike" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Republike Dominikinne" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Aldjereye" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecwåteur" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estoneye" # #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Edjipe" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Sara Coûtchantrece" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrêye" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Espagne" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Etiopeye" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finlande" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fidji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Iyes Malouwines (Falkland)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Estats Federé d' Microneseye" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Iyes Faeroyé" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "France" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "France Metropolitinne" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "Grande-Burtaegne" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenåde" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Djeyordjeye" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "Guyane francesse" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "Guernsey" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Gana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Djibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Groenlande" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambeye" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinêye" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Gwadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Guinêye Ecwåtoriåle" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Grece" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "Djeyordjeye do sud eyet Iyes Sandwich do sud" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Gwatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Gwam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinêye-Bissaw" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Iyes Heard eyet Iyes MacDonald" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Crowåceye" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Hayiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hongreye" # #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonezeye" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Irlande" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israyel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "Iye di Man" # #: zypp/CountryCode.cc:261 msgid "India" msgstr "Inde" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "Teritweres britanikes di l' Oceyan Indyin" # #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Irak" # #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Izlande" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Itåleye" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "Djerzey" # #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Djamayike" # #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Djordaneye" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Djapon" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenia" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kirguiztan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodje" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comores" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Sint Kitts et Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "Corêye (bijhrece)" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "Corêye (nonnrece)" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuweyt" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Iyes Cayman" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazaxhtan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Republike Democratike då Peupe Lawo (Lawos)" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Liban" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Sinte Luceye" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Lîchtensteyn" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lessoto" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Litwaneye" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Lussimbork" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Letoneye" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libeye" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Marok" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "Montenegro" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "Sint Martin" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Iyes Marshall" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedoneye" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Birmaneye" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongoleye" # #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Iyes Marianes bijhreces" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinike" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Moritanreye" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Male" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Iye Môrice" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldives" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mecsike" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaizeye" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambike" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibeye" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "Nouve Caledoneye" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Nidjer" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Iye Norfolk" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nidjeria" # #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragwa" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Bas Payis" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norvedje" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nawouryin" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niuwé" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "Nouve Zelande" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" # #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Perou" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "Polinezeye francesse" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papouwazeye Nouve Guinêye" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Filipenes" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Pologne" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Sint Pire et Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Porto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestene" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" # #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palawou" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paragway" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Katar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reyunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Roumaneye" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "Serbeye" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Rûsseye" # #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Arabeye Sawoudite" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Iyes Solomon" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seycheles" # #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Soudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Suwede" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapour" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Sinte Helene" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Esloveneye" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Iyes Svalbard eyet Jan Mayen" # #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Eslovakeye" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Siera Leyone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "Sint Marin" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegål" # #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somaleye" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "São Tomé et Prince" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Sireye" # #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Suwazilande" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Iyes Turks eyet Caicos" # #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Tchad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "Payis francès nonnrece" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Taylande" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tadjikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turcmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunizeye" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "Levant Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkeye" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinité et Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "Touvalou" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzaneye" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Oucrinne" # #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Ouganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "Iyes mineures des Estats Unis" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "Estats Unis" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Ourougway" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Ouzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Vatican" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Sint Vincint et les Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezwela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "Iyes Viedjes Britanikes" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Iyes Viedjes etazunyinnes" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanouatou" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis et Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samowa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayote" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "Nonne Afrike" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambeye" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwè" #: zypp/Dep.cc:96 msgid "Provides" msgstr "Dene" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "Dimande" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "Afrontmints" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "wårder l' forpassé %s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "Ricmande" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "Propoze" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "Amidrêye" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "Rawetes" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Lingaedje nén cnoxhou : " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Abxhaze" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Achinwès" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Afro-Aziyatike (ôtes)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "Afrikaans" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Aynou" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Acanyin" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Acadyin" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Albanès" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Alewoute" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Lingaedjes algonkyins" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Altay nonnrece" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Amarike" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "Inglès, Vî inglès (450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Lingaedjes apaches" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Arabe" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Aramayike" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Aragonès" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Årmenyin" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Arawoucan" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Constrût (ôtes)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Assamès" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Asturyin" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Lingaedjes atapascans" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Lingaedjes ostralyins" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Avarike" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Awadi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Azeri" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "Banda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Lingaedjes bamilekes" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "Baloutchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "Balinès" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Basse" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "Bassa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Baltike (ôtes)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "Bedja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "Bielorûsse" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Berbere (ôtes)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Bantou (ôtes)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "Bosnyin" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "Burton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "Batak (Indonezeye)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "Bouriate" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "Budjinès" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "Bulgåre" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "Birman" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Amerindyin di l' Amerike cintråle (ôtes)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "Carayibe" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "Catalan" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Cocåzyin (ôtes)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "Cebwano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Celtike (ôtes)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "Tchamoro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "Tchibtcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "Tchetchene" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "Tchagatay" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "Chinwès" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "Tchouwoukès" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Djårgon Tchinouk" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "Tchoctåw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "Tchipewa" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "Tcherokî" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "Eslavonike d' eglijhe" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "Tchouvache" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "Tcheyinne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Lingaedjes xhamitikes" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "Coptike" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "Cornike" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "Corse" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Creyoles et pidjines, båzé so l' inglès (ôtes)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Creyoles et pidjines, båzé sol francès (ôtes)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Creyoles et pidjines, båzé sol portuguès (ôtes)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "Crî" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Tatar crimeyin" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Creyoles et pidjines (ôtes)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "Kachubian" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Couchitike (ôtes)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "Tcheke" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "Daenwès" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Dravidyin (ôtes)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "Bas serbe" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "Douwala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "Neyerlandès, Moyén neyerlandès (åtoû di 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "Neyerlandès" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "Dioula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "Boutanès" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "Edjipcyin (ancyin)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Ekadjouk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "Inglès" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "Inglès, Moyén inglès (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Estonyin" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Ewè" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "Faeroyès" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "Fidjyin" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "Filipenes" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "Finwès" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Fino-ougryin (ôtes)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "Francès" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "Francès, Moyén francès (åtoû d' 1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "Francès, Vî francès (842-1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "Frizon" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "Friyoulan" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "Tîxhon (ôtes)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "Djeyordjyin" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "Almand" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "Gehez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "Djilbertyin" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "Gayelic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Irlandès" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "Galicyin" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "Gayel di l' iye di Man" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "Almand, Moyén hôt almand (åtoû di 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "Almand, Vî hôt almand (åtoû di 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "Gotike" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "Grek, Ancyin grek (disk' a 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "Grek, Modiene (dispoy 1453)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "Gwarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "Goudjarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "Hayida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "Hayicyin" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "Hawssa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "Hawayin" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "Ebreu" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "Himatchali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "Hitite" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "Hôt serbe" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "Hongrwès" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Izlandès" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "Yi sitchouwanès" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Interlingua (Soce do lingaedje ogziliaire internacionå)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Indyin (ôtes)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Indonezyin" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Indo-uropeyin (ôtes)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Ingouche" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Inyupiak" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Iranyin (ôtes)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Lingaedjes irocwès" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "Itålyin" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "Djavanès" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "Djaponès" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "Djudeyo-farsi" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Djudeyo-arabe" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "Kabile" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "Katchin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "Kazaxh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "Kabardyin" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "Koysan (ôtes)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "Xhmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "Khotanès" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "Kikouyou" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "Kirguize" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "Kimboundou" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "Kicongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "Coreyin" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "Kosrayin" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "Kpellè" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "Karatchay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "Krou" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "Kuruxh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "Kwanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "Kurde" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "Kutenay" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "Lawocyin" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "Latén" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "Letonyin" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "Lezguyin" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "Limbordjwès" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "Litwanyin" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "Lussimbordjès" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "Louba-Loulouwa" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "Louba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "Louganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "Lounda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "Louwo (Kenia et Tanzaneye)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "Louchay" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "Macedonyin" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "Madurès" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "Marshalès" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "Makazar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "Mawori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Ostronezyin (ôtes)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "Marati" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "Massay" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "Malay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Irlandès, Moyén irlandès (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "Micmak" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Ôtes lingaedjes" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "Mon-Xhmer (ôtes)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "Malgache" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "Malès" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "Mantchou" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Lingaedjes manobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "Mohåwk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "Moldåve" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "Mongol" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Multipes lingaedjes" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Lingaedjes mounda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "Crîk" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "Mirandès" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Lingaedjes maya" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "Amerindyins d' Amerike bijhrece (ôtes)" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "Napolitin" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navaxho" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "Ndebele (Nonnrece)" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "Ndebele (Bijhrece)" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "Ndonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "Bas almand" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "Nepalès" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "Bhasa nepalès" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "Niger-Kordofanyin (ôtes)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "Niuweyin" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "Norvedjyin Ninorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "Norvedjyin Bokmål" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "Nogay" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "Vî norvedjyin" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "Norvedjyin" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "Soto bijhrece" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Lingaedjes noubyins" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "Newari classike" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "Tchitchewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "Nyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "Nzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Occitan (après 1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Odjibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Ozaedje" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Ossetyin" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "Turk otoman (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Lingaedjes otomans" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "Papouwazyin (ôtes)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "Pangazinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "Pandjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "Palawouwin" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "Farsi, Vî farsi (åtoû di 600-400 divant J.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "Farsi" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Filipin (ôtes)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "Fenicyin" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "Pâli" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "Polonès" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "Pohnpeyin" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "Portuguès" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Lingaedjes prakrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "Provincå, Vî provincå (djusk' a 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Pashto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "Ketchwa" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "Radjastani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "Rapanwi" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "Raratongyin (Iye di Påke)" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "Roman (ôtes)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "Romantche" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "Romani" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "Roumanyin" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "Kiroundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "Rûsse" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "Yakout" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "Amerindyins d' Amerike nonnrece (ôtes)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Lingaedjes salichans" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Arameyin samaritin" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "Serbe" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "Sicilyin" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "Crowåte" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "Semitike (ôtes)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Irlandès, Vî irlandès (divant 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Lingaedjes des sines" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "Chan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Lingaedjes siwous" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "Sino-Tibetin (ôtes)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Eslåve (ôtes)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "Eslovake" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "Eslovenyin" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "Såmi nonnrece" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "Såmi bijhrece" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Lingaedjes såmi (ôtes)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "Såmi Lule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "Såmi Inari" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "Samowan" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "Såmi Skolt" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "Shona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "Sindi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "Sogdyin" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "Somalyin" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "Songhay" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "Soto nonnrece" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "Espagnol" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "Sardegnyin" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "Nilo-saryin (ôtes)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "Suwati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "Soukouma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "Sundanès" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "Sousou" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "Soumeryin" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "Suwahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "Suwedwès" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "Siriake" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "Tahityin" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Taylandès (ôtes)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "Tamoul" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Tatår" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "Telougou" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "Tetoum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "Tadjik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "Taylandès" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "Tibetin" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "Tigré" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "Tonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "Tonga (Iyes Tonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "Tsimchyin" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "Tswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "Tsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "Turcmene" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "Toumbouka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Lingaedjes toupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "Turk" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Altayike (ôtes)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "Twi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "Touvinyin" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Oudmourt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Ougaritike" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Ouygour" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Oucrinnyin" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Oumboundou" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Nén cnoxhou" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Ourdou" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Ouzbeke" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "Vay" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "Venda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "Vietnamyin" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "Volapouk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Lingaedjes wakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "Walès" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Lingaedjes sorbyin" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "Walon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "Kalmike" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "Xhossa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "Yawo" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "Yidish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "Yorouba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Lingaedjes youpik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "Zapoteke" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "Zandè" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "Zoulou" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "Zouni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "Dji va fé les faitindjes shuvants :" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "nén cnoxhou" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "nén sopoirté" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "Livea 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "Livea 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "Livea 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "I fåt èn ôte Contrat cliyint" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "nén valåbe" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "Li livea do sopoirt n' est nén specifyî" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "Li vindeu n' dene pont d' sopoirt." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "Trovaedje do problinme, ça vout dire on sopoirt tecnike atuzlé po dner des " "informåcions sol copatibilité, aidance a l' astalaedje, sopoirt po l' " "eployaedje, mintnance normåle eyet rujhes di båze. Li sopoirt di livea 1 n' " "est nén fwait po coridjî les arokes des sacwès nén bén fwaites e prodût." #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "I fåt èn ôte contrat cliyint pos awè on sopoirt." #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "Tchuze di sopoirt nén cnoxhowe. I gn a pont d' discrijhaedje" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Môde di corespondaedje \"%s\" nén cnoxhou" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "Môde di corespondaedje \"%s\" pol modele \"%s\" nén cnoxhou" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "Erîlêye ratourneure « %s » nén valåbe : regcomp a rtourné %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Erîlêye ratourneure « %s » nén valåbe" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "I s' fåt otintifyî po « %s »" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "Dji n' sai ahiver l' ridant muchete des meta-dnêyes." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "Åk n' a nén stî come dji sayive di lére a pårti di « %s »" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "Dji n' sai ahiver %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Li metaedje e muchete do depot (%d) a fwait berwete." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "Dji basti l' muchete do depot « %s »" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "Dji n' sai ahiver l' muchete a %s - pont d' droet di scrijhaedje." #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "Dji n' sai nén apougnî cisse sôre di depot la" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "Dji radjoute li depot « %s »" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "No do fitchî do depot so « %s » nén valåbe" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Dji n' sai nén drovi l' fitchî « %s » pol sicrire." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Åk di nén cnoxhou n' a nén stî come dji léjheu a pårti d' \"%s\"" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Li léjhaedje do ridant « %s » a fwait berwete." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "Dji n' sai nén trover ewou ç' kel depot est wårdé." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "Dji n' sai disfacer « %s »" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "Dji n' sai nén trover ewou ç' kel siervice est wårdé." #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "On no metou di siervice ni s' pout cominçî avou on pont." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 #, fuzzy msgid "Continue?" msgstr "&Continouwer" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "Dj' a dandjî d' onk ou amdedeus atributs « %s » ou « %s »." #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr " a fwait berwete a l' enondaedje" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Li pacaedje %s shonne awè stî crombyî sol tins do berwetaedje. Voloz rsayî " "l' rischoyaedje ?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "L' ahessaedje do pacaedje %s a fwait berwete. Voloz vs rissayî l' " "rischoyaedje?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "li verifiaedje d' applydeltarpm a fwait berwete." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm a fwait berwete." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Dji n' sai diner l' fitchî « %s » do depot « %s »" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "Pont d' url e depot" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "Dji n' sai ahiver sat-pool." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "sketer %s e passant houte sacwantes di ses aloyances" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "sketer %s e passant houte sacwantes di ses aloyances" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "dimandes d' afrontmints" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "gn des des problinmes d' aloyances" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 #, fuzzy msgid "unsupported request" msgstr "nén sopoirté" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "ahesseus disfacé : " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "ahesseus nén astalåves : " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "ahesseus nén astalåves : " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "Cisse dimande ci va scheter vosse sistinme !" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "passer houte l' adviertixhmint d' on sketé sistinme" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "L' astalaedje a stî abandné come dimandé." #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " enondé" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " a fwait berwete a l' enondaedje" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " a passé l' enondaedje cwand il abandnéve" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "Åk n' a nén stî come dji meteu a djoû l' notifiaedje do messaedje." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "Novea messaedje di metaedje a djoû" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM a fwait berwete :" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "L' abagaedje del clé publike %1% a fwait berwete" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "Li oistaedje del clé publike %1% a fwait berwete" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Les fitchîs d' apontiaedje po %s ont stî candjîs :" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" "rpm a schapé %s come %s mins ça n' a nén stî possibe di trover l' diferince" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm a schapé %s come %s/\n" "Vos avoz droci les 25 prumirès royes di diferince :\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" "rpm a ahivé %s come %s mins ça n' a nén stî possibe di trover l' diferince" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm a ahivé %s come %s/\n" "Vos avoz droci les 25 prumirès royes di diferince :\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "Ôtès rexhowes di rpm" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "copeye di såvrité di %s ahivêye" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "Sinateure di fitchî %s nén trovêye" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "Sinateure di fitchî %s nén trovêye" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "Sinateure di fitchî %s nén trovêye" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "(n' espire nén)" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(n' espire nén)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(ESPIRÉ)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(espire divant 24 e)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, fuzzy, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(espire divant 24 e)" msgstr[1] "(espire divant 24 e)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, fuzzy, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "Dj' a sayî d' abaguer l' clé %s nén egzistante e l' anea d' clés %s" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "L' abagaedje del clé publike %1% a fwait berwete" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "Li disfaçaedje del clé a fwait berwete." #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "Sinateure di fitchî %s nén trovêye" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "Crombe sôre « %s » po l' octet %u del some di controle « %s »" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Dji n' sai drovi pty (%s)." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Dji n' sai drovi l' pupe (%s)." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Tchinne di cweraedje di l' IRL LDAP nén valåbe" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Paramete cweraedje di l' URL LDAP nén valåbe « %s »" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Dji n' sai clôner l' objet Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Vude referince d' objet di l' Url nén valåbe" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Dji n' sai analijhî les componints di l' Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "Istwere :" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "L' arindjmint di l' Url ni permet pont d' %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Componrint %s nén valåbe « %s »" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Componint %s nén valåbe" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "L' arindjmint di l' URL est on componint reki" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Arindjmint di l' URL nén valåbe « %s »" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "L' arindjmint di l' Url ni permet pont d' no d' uzeu" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "L' arindjmint di l' Url ni permete pont d' sicret" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "I fåt on lodjoe e l' arindjmint di l' URL" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "L' arindjmint URL ni permete nén d' awè on componint lodjoe" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Componint do lodjoe nén valåbe « %s »" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "L' arindjmint di l' Url ni permet pont d' pôrt" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Componint do pôrt « %s » Nén valåbe" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "I fåt on no di tchmin e l' arindjmint di l' URL" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "I gn a èn octet NUL el tchinne ecôdêye." #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "Li comande a moussî foû avou l' sitatut %d." #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "Li comande a stî touwêye på signå %d (%s)." #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "Li comande a moussî foû avou ene aroke nén cnoxhowe." #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "Dji n' sai fé chroot a « %s » (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Dji n' sai fé chroot a « %s » (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "Dji n' sai fé chdir a « / » divins chroot (%s)." #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "Dji n' sai enonder « %s » (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "Dji n' sai fé on fork (%s)." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Li montaedje di %s dins %s a fwait berwete" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "Li dismontaedje di %s a fwait berwete" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "Mwais no d' fitchî : %s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "Media nén drovou cwand dj' a sayî d' fé l' faitindje « %s »." #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Fitchî « %s » nén trové sol media « %s »" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Dji n' sai scrire li fitchî « %s »." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "Media nén ataetchî" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "Mwais pont d' ataetche do media" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "L' inicialijhaedje di l' aberwetaedje (curl) a fwait berwete po « %s »" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "Foû rîle sistinme « %s » sol media « %s »." #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "Li tchmin « %s » sol media « %s » n' est nén on fitchî." #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "Li tchmin « %s » sol media « %s » n' est nén on ridant." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "URI må fwaite" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "Vude no do lodjoe e l' URI" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "Vude sistinme di fitchî e l' URI" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "Vude såme e l' URI" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Arindjmint d' URI nén sopoirté dins \"%s\"." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "Operåcion nén sopoirtêye på media" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "Aroke d' aberwetaedje (curl) po « %s » :\n" "Côde di l' aroke : %s\n" "Messaedje d' aroke : %s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" "Åk n' a nén stî come dji definixheu les tchuzes d' aberwetaedje (curl) po « " "%s » :" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "I gn a nén e media sourdant « %s » li media volou" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "Li media « %s » est eployî pa-z ene ôte instance" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "Dji n' sai fé rexhe nou media" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Dji n' sai fé rexhe li media « %s »" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Droet di moussî e « %s » rifuzé." #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "L' astådje a stî trop longue po moussî e \"%s\"." #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "Dji n' sai moussî e l' eplaeçmint « %s » pol moumint." #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" " : rujhe di l' acertineure SSL, waitîz k' l' acert. di l' OA est boune po « " "%s »." #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "Metôde d' otintifiaedje HTTP \"%s\" nén sopoirtêye" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Oyi" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Nonna" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Adviertixhmint" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Aroke" # #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "done" msgstr "Indonezeye" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "error" msgstr "Aroke" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Adviertixhmint" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 #, fuzzy msgid "Retrieving:" msgstr "Oistaedje" #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Dj' enonde..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Rén trové" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "Oyi" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "Nonna" #, fuzzy #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "Dji n' a trové nole meta-dnêye valåbe al/ås URL sipeciftî(s)" #~ msgstr[1] "Dji n' a trové nole meta-dnêye valåbe al/ås URL sipeciftî(s)" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "" #~ "%s ni fwait nén pårteye d' on depot d' metaedje a djoû del distribucion" #~ msgid "%s has inferior architecture" #~ msgstr "%s a ene årtchitecteure pus basse" #~ msgid "problem with installed package %s" #~ msgstr "problinme avou l' pacaedje d' astalé %s" #~ msgid "nothing provides requested %s" #~ msgstr "rén n' dene li %s dimandé" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "Avoz metou en alaedje tos les depots dmandés ?" #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "Çou paket n' est nén astalé et n' serè nén astalé." #~ msgid "%s is not installable" #~ msgstr "%s n' est nén astalåve" #~ msgid "nothing provides %s needed by %s" #~ msgstr "rén n' dene %s k' a dandjî %s" #~ msgid "cannot install both %s and %s" #~ msgstr "Dji n' sai nén astaler ambedeus %s eyet %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s s' afronte avou %s ahessî pa %s" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s rind trop vîs %s ahessî pa %s" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "astalé %s trop vîs %s dinés pa %s" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s afrontmints rezoudåves avou %s ahessî pa lyi minme" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s a dandjî d' %s mins cisse dimande ni sait nén esse ahesseye" #~ msgid "do not install %s" #~ msgstr "èn nén astaler %s" #~ msgid "keep %s" #~ msgstr "wårder %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "èn nén espaitchî l' astalaedje di %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "èn nén dmander d' astaler on rezoudaedje dinant %s" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "èn nén dmander d' disfacer tos les rezoudaedjes dinant %s" #~ msgid "do not install most recent version of %s" #~ msgstr "èn nén astaler l' pus nouve modêye di %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "wårder %s mågré k' il est d' ene pus basse årtchitecteure" #~ msgid "install %s despite the inferior architecture" #~ msgstr "astaler %s mågré k' il est d' ene pus basse årtchitecteure" #~ msgid "keep obsolete %s" #~ msgstr "wårder l' forpassé %s" #~ msgid "install %s from excluded repository" #~ msgstr "astaler %s a pårti do depot schovté evoye" #~ msgid "downgrade of %s to %s" #~ msgstr "dismete a djoû di %s a %s" #~ msgid "architecture change of %s to %s" #~ msgstr "candjmint d' årtchitecteure di %s a %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "astaler %s (avou candjmint d' vindeu)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "replaeçmint di %s avou %s" #~ msgid "deinstallation of %s" #~ msgstr "disastalaedje di %s" #~ msgid "Can't open lock file: %s" #~ msgstr "Dji n' sai nén drovi l' fitchî d' eclawaedje : %s" #~ msgid "This action is being run by another program already." #~ msgstr "Ci faitindje ci est dedja enondé pa èn ôte programe." #~ msgid "Hal Exception" #~ msgstr "Foû-rîle di hal" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "" #~ "Dji rgrete mins cisse modêye ci di libzypp a stî basteye sins sopoirt po " #~ "HAL." #~ msgid "HalContext not connected" #~ msgstr "HalContext nén raloyî" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive nén inicialijhî" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume nén inicialijhî" #~ msgid "Unable to create dbus connection" #~ msgstr "Dji n' sai ahiver l' raloyaedje dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new : Dji n' sai ahiver l' contecse libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection : Dji n' sai defini l' raloyaedje dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Dji n' sai inicialijhî l' contecse HAL -- hald nén ovrant ?" #~ msgid "Not a CDROM drive" #~ msgstr "Nén on léjheu d' plake CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Dji n' sai inicialijhî les atributs mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Dji n' sai defini l' atribut mutex recursif" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Dji n' sai inicialijhî l' mutex recursif" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Dji n' sai acweri l' eclawaedje mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Dji n' sai dislaxhî l' eclawaedje mutex" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "L' abagaedje del clé publike do fitchî %s a fwait berwete : %s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Li oistaedje del clé publike %s a fwait berwete : %s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "" #~ "Dji n' sai trover l' éndjin loop k' i gn a po monter l' imådje a pårti d' " #~ "« %s »" #~ msgid "do not keep %s installed" #~ msgstr "èn nén wårder %s astalé" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "" #~ "Dji n' sai askepyî l' clé publike %s di l' anea des clés %s e fitchî %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "" #~ "L' inicialijhaedje di l' aberwetaedje (Metalink curl) a fwait berwete po " #~ "« %s »" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "Aroke d' aberwetaedje (metalink curl) po « %s » :\n" #~ "Côde di l' aroke : %s\n" #~ "Messaedje d' aroke : %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "L' aberwetaedje s' a aresté a %d%%" #~ msgid "Download interrupted by user" #~ msgstr "L' aberwetaedje a stî aresté pa l' uzeu" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "" #~ "Åk n' a nén stî come dji definixheu les tchuzes d' aberwetaedje (curl) po " #~ "« %s » :" #~ msgid "Failed to download %s from %s" #~ msgstr "L' aberwetaedje di %s a pårti di %s a fwait berwete" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbeye et Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Djin nén cnoxhowe" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "L' operåcion d' siervice ni covént nén." #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Coridjaedjes di radjoutés" #, fuzzy #~ msgid "Install missing resolvables" #~ msgstr "Afrontmint etur les coridjaedjes" #, fuzzy #~ msgid "Keep resolvables" #~ msgstr "Coridjaedjes ki dj' vos propôze" #, fuzzy #~ msgid "Unlock these resolvables" #~ msgstr "Coridjaedjes d' amidrés" #, fuzzy #~ msgid "delete %s" #~ msgstr "Dis&facer" #, fuzzy #~ msgid "unlock all resolvables" #~ msgstr "Afrontmint etur les coridjaedjes" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "" #~ "Dji n' pout nén drovi l' fitchî d' son:\n" #~ "%1" #, fuzzy #~ msgid "Software management is already running." #~ msgstr "Meteu a djoû d' programe - ZMD n' est nén enondé" #, fuzzy #~ msgid "Invalid information" #~ msgstr "&Informåcion" #, fuzzy #~ msgid "%s is needed by other resolvables" #~ msgstr "Coridjaedjes ricomandés" #, fuzzy #~ msgid "%s conflicts with other resolvables" #~ msgstr "Afrontmint etur les coridjaedjes" #, fuzzy #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "afrontmint avou..." #, fuzzy #~ msgid "%s obsoletes other resolvables" #~ msgstr "Coridjaedjes di radjoutés" #, fuzzy #~ msgid "%s depends on other resolvables" #~ msgstr "Coridjaedjes ricomandés" #, fuzzy #~ msgid "Child of" #~ msgstr "Tchili" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "Gn a pont d' eterface uzeu po ç' module." #, fuzzy #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "Çou paket n' est nén astalé et n' serè nén astalé." #, fuzzy #~ msgid "%s has unfulfilled requirements" #~ msgstr "a des dmandes nén rezoudowes..." #, fuzzy #~ msgid "No need to install %s" #~ msgstr "Copyî les fitchîs sol sistinme d' astalé" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "a des dmandes nén rezoudowes..." #, fuzzy #~ msgid ", Action: " #~ msgstr "&Accions" #, fuzzy #~ msgid "selection" #~ msgstr "Tchuze" #, fuzzy #~ msgid "pattern" #~ msgstr "Modeles" #, fuzzy #~ msgid "product" #~ msgstr "prodûts" #, fuzzy #~ msgid "patch" #~ msgstr "coridjaedjes" #, fuzzy #~ msgid "script" #~ msgstr "Scripe" #, fuzzy #~ msgid "message" #~ msgstr "Messaedjes" #, fuzzy #~ msgid "Resolvable" #~ msgstr "Coridjaedjes di dnés." #, fuzzy #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "Coridjaedjes ki dvèt esse astalés" #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "Coridjaedjes ki dj' a dandjî dvant l' astalaedje" #, fuzzy #~ msgid "Installing %s" #~ msgstr "Astalaedje" #, fuzzy #~ msgid " Error!" #~ msgstr "Aroke" #, fuzzy #~ msgid " Important!" #~ msgstr "Abe&rweter" #, fuzzy #~ msgid "Reading index files" #~ msgstr "Dji lé l' lisse des modules..." #, fuzzy #~ msgid "Reading product from %s" #~ msgstr "Dji schape l' informåcion sol prodût..." #, fuzzy #~ msgid "Reading filelist from %s" #~ msgstr "Aroke e scrijhant l' lisse des pakets a pårti d' %1" #, fuzzy #~ msgid "Reading packages from %s" #~ msgstr "Aroke e scrijhant l' lisse des pakets a pårti d' %1" #, fuzzy #~ msgid "Reading pattern from %s" #~ msgstr "Modeles k' on -z a dandjî" #, fuzzy #~ msgid "The script file failed the checksum test." #~ msgstr "Ci fitchî la n' egzistêye nén." #, fuzzy #~ msgid "Reading packages file" #~ msgstr "L' astalaedje des pakets dmandés n' a nén stî." #, fuzzy #~ msgid "Downloading %s" #~ msgstr "A&berweter" #, fuzzy #~ msgid "Apache languages" #~ msgstr "Lingaedjes apaches" #, fuzzy #~ msgid "Athapascan languages" #~ msgstr "Lingaedjes atapascans" #, fuzzy #~ msgid "Australian languages" #~ msgstr "Lingaedjes ostralyins" #, fuzzy #~ msgid "Bamileke languages" #~ msgstr "Lingaedjes bamilekes" #, fuzzy #~ msgid "Chinook jargon" #~ msgstr "Djårgon Tchinouk" #, fuzzy #~ msgid "Creoles and pidgins, English based (Other)" #~ msgstr "Creyoles et pidjines, båzé sol inglès (ôtes)" #, fuzzy #~ msgid "Creoles and pidgins, French-based (Other)" #~ msgstr "Creyoles et pidjines, båzé sol francès (ôtes)" #, fuzzy #~ msgid "Creoles and pidgins, Portuguese-based (Other)" #~ msgstr "Creyoles et pidjines, båzé sol portuguès (ôtes)" #, fuzzy #~ msgid "Iroquoian languages" #~ msgstr "Lingaedjes irocwès" #, fuzzy #~ msgid "Manobo languages" #~ msgstr "Lingaedjes manobo" #, fuzzy #~ msgid "Otomian languages" #~ msgstr "Lingaedjes otomans" #, fuzzy #~ msgid "Prakrit languages" #~ msgstr "Lingaedjes prakrit" #, fuzzy #~ msgid "Salishan languages" #~ msgstr "Lingaedjes salichans" #, fuzzy #~ msgid "Siouan languages" #~ msgstr "Lingaedjes siwous" #, fuzzy #~ msgid "Tupi languages" #~ msgstr "Lingaedjes toupi" #, fuzzy #~ msgid "Wakashan languages" #~ msgstr "Lingaedjes wakashan" #, fuzzy #~ msgid "Sorbian languages" #~ msgstr "Lingaedjes sorbyin" #, fuzzy #~ msgid "Centruual African Republic" #~ msgstr "Cintrafrike" libzypp-17.36.5/po/xh.po000066400000000000000000003754531476576476200150340ustar00rootroot00000000000000# Copyright (C) 2006 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2006-11-03 12:03\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Ilizwe elingaziwa:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Akukho Khowudi" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "i-Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "Ii-Arab Emirates Ezimanyeneyo" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "i-Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "i-Antigua ne-Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "i-Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "i-Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "i-Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "i-Netherlands Antilles" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "i-Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "i-Antarctica" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "i-Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "i-American Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "i-Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "i-Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "i-Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "i-Aland Islands" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "i-Azerbaijan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "i-Bosnia ne-Herzegowina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "i-Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "i-Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "i-Belgium" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "i-Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "i-Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "i-Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "i-Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "i-Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "i-Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "i-Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "i-Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "i-Brazil" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "i-Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "i-Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "i-Bouvet Island" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "i-Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "i-Belarus" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "i-Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "i-Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "i-Cocos (Keeling) Islands" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "i-Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Iriphabliki yaseAfrika Esembindini " #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "i-Switzerland" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "i-Cote D'Ivoire" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "i-Cook Islands" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "i-Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "i-Cameroon" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "i-China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "i-Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "i-Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "i-Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "i-Cape Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "i-Christmas Island" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "i-Cyprus" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "i-Czech Republic" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "EJamani" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "i-Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "i-Denmark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "i-Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "i-Dominican Republic" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "i-Algeria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "i-Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "i-Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "iYiphutha" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "i-Western Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "i-Ertrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "i-Spain" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "i-Ethiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "i-Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "i-Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "i-Falkland Islands (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "i-Federated States of Micronesia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "i-Faroe Islands" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "i-France" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "i-Metropolitan France" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "i-Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "i-United Kingdom" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "i-Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "i-Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "i-French Guiana" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "EJamani" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "i-Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "i-Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "i-Greenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "i-Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "i-Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "i-Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "i-Equatorial Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "i-Greece" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "i-South Georgia ne-South Sandwich Islands" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "i-Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "i-Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "i-Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "i-Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "i-Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "i-Heard Island ne-McDonald Islands" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "i-Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "i-Croatia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "i-Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "i-Hungary" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "i-Indonesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "i-Ireland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "i-Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "i-Indiya" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "i-British Indian Ocean Territory" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "i-Iraq" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "i-Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "i-Iceland" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "i-Italy" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "i-Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "i-Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "iJapani" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "i-Kenya" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "i-Kyrgyzstan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "i-Cambodia" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "i-Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "i-Comoros" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "i-Saint Kitts neNevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "i-North Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "i-South Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "i-Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "i-Cayman Islands" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "i-Kazakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "i-Lao People's Democratic Republic" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "i-Lebanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "i-Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "i-Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "i-Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "i-Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "i-Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "i-Lithuania" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "i-Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "i-Latvia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "i-Libya" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "i-Morocco" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "i-Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "i-Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "isi-Mongo" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "i-San Marino" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "i-Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "i-Marshall Islands" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "i-Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "i-Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "i-Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "i-Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "i-Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "i-Northern Mariana Islands" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "i-Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "i-Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "i-Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "i-Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "i-Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "i-Maldives" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "i-Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "i-Mexico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "i-Malaysia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "i-Mozambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "i-Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "i-New Caledonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "i-Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "i-Norfolk Island" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "i-Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "i-Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "i-Netherlands" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "i-Norway" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "i-Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "i-Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "i-Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "i-New Zealand" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "i-Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "i-Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "i-Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "i-French Polynesia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "i-Papua New Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "i-Philippines" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "i-Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "i-Poland" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "i-Saint Pierre ne-Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "i-Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "i-Puerto-Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "i-Palestinian Territory" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "i-Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "i-Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "i-Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "i-Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "i-Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "i-Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "isi-Serbian" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "i-Russian Federation" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "i-Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "i-Saudi Arabia" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "i-Solomon Islands" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "i-Seychelles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "i-Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "i-Sweden" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "i-Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "i-Saint Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "i-Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "i-Svalbard ne-Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "i-Slovakia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "i-Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "i-San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "i-Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "i-Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "i-Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "i-Sao Tome ne-Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "i-El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "i-Syria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "i-Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "i-Turks ne-Caicos Islands" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "i-Chad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "i-French Southern Territories" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "i-Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "i-Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "i-Tajikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "isi-Tokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "i-Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "i-Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "i-Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "i-East Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "i-Turkey" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "i-Trinidad ne-Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "isi-Tuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "i-Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "i-Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "i-Ukraine" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "i-Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "i-United States Minor Outlying Islands" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "i-United States" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "i-Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "i-Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "i-Holy See (Vatican City State)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "i-Saint Vincent ne-Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "i-Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "i-British Virgin Islands" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "i-Virgin Islands, U.S." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "i-Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "i-Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "i-Wallis ne-Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "i-Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "i-Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "i-Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "uMzantsi Afrika" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "i-Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "i-Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s ziphelelwe lixehsa:%s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Ulwimi Olungaziwayo:" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Isi-Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Isi-Abkhazian" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "isi-Achinese" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "isi-Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "isi-Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "isi-Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "isi-Afro-Asiatic (Esinye)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "isi-Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "isiBhulu" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "isi-Ainu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "isi-Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "isi-Akkadian" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "isi-Albanian" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "isi-Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "isi-Algonquian Languages" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "isi-Southern Altai" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "isi-Amharic" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "isiNgesi, Sakudala (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Iilwimi ze-Apache" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "isi-Arabic" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "isi-Aramaic" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "isi-Aragonese" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "isi-Armenian" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "isi-Araucanian" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "isi-Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "isi-Artificial (Esinye)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "isi-Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "isi-Assamese" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "isi-Asturian" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Iilwimi ze-Athapascan" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Iilwimi zase-Australia" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "isi-Avaric" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "isi-Avestan" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "isi-Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "isi-Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "isi-Azerbaijani" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "isiBanda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Iilwimi ze-Bamileke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "isi-Bashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "isi-Baluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "isi-Bambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "isi-Balinese" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "Isi-Basque" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "isi-Basa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "isi-Baltic (Esinye)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "isi-Beja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "isi-Belarusian" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "isi-Bemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "isi-Bengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "isi-Berber (Esinye)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "isi-Bhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "isi-Bihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "isi-Bikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "isi-Bini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "isi-Bislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "isi-Siksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "isiBantu (Esinye)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "isi-Bosnian" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "isi-Braj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "isi-Breton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "isi-Batak (Indonesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "isi-Buriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "isi-Buginese" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "isi-Bulgarian" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "isi-Burmese" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "isi-Blin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "isi-Caddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "isi-Central American Indian (Esinye)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "isi-Carib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "isi-Catalan" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "isi-Caucasian (Esinye)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "isi-Cebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "isi-Celtic (Esinye)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "isi-Chamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "isi-Chibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "isi-Chechen" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "isi-Chagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "isiTshayina" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "isi-Chuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "isi-Mari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "isi-Chinook Jargon" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "isi-Choctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "isi-Chipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "isi-Cherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "isi-Church Slavic" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "isi-Chuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "isi-Cheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Iilwimi ze-Chamic" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "isi-Coptic" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "isi-Cornish" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "isi-Corsican" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "Ii-Creoles nee-Pidgins, Ezisekwe esiNgesini (Nakwezinye)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "Ii-Creoles nee-Pidgins, Ezisekwe kwisiFrentshi (Nakwezinye)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "Ii-Creoles nee-Pidgins, Ezisekwe kwisiPhuthukezi (Nakwezinye)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "isi-Cree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "isi-Crimean Tatar" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Ii-Creoles nee-Pidgins (Ezinye)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "isi-Kashubian" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "isi-Cushitic (Ezinye)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "isi-Czech" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "isi-Dakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "isi-Danish" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "isi-Dargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "isi-Dayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "isi-Delaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "isi-Slave (Athapascan)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "isi-Dogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "isi-Dinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "isi-Divehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "isi-Dogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "isi-Dravidian (Esinye)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "i-Lower Sorbian" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "isi-Duala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "isi-Datshi, Esiphakathi (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "isiDatshi" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "isi-Dyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "isi-Dzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "isi-Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "isiYiphutha (Samandulo)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "isi-Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "isi-Elamite" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "isiNgesi" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "isiNgesi, Esiphakathi (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "isi-Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "isi-Estonian" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "isi-Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "isi-Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "isi-Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "isi-Faroese" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "isi-Fanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "isi-Fijian" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "isi-Filipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "isiFinnish" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "isi-Finno-Ugrian (Esinye)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "isi-Fon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "isiFrentshi" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "isiFrentshi, Esiphakathi (ca.1050-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "isiNgesi, Sakudala (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "isi-Frisian" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "isi-Fulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "isi-Friulian" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "isi-Ga" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "isi-Gayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "isi-Gbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "isi-Jamani (Ezinye)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "isi-Georgian" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "isiJamani" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "isi-Geez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "isi-Gilbertese" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "isi-Gaelic" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "isi-Irish" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "isi-Galician" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "isi-Manx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "isiJamani, Esiphakathi Phezulu(ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "isiJamani, Sakudala Phezulu (ca.750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "isi-Gondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "isi-Gorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "isi-Gothic" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "isi-Grebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "isi-Grike, Samandulo (ukuya ku-1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "isiGrike, Sanamhla (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "isi-Guarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "isi-Gujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "isi-Gwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "isi-Haida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "isi-Haitian" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "isi-Hausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "isi-Hawaiian" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "isiHebheru" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "isi-Herero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "isi-Hiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "isi-Himachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "isi-Hindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "isi-Hittite" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "isi-Hmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "isi-Hiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "isi-Sorbian Sangasentla" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "isi-Hungarian" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "isi-Hupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "isi-Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "isi-Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "isi-Icelandic" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "isi-Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "isi-Sichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "isi-Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "isi-Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "isi-Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "isi-Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "i-Interlingua (Umbutho Wehlabathi Wokuncedisa Ngeelwimi)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "isi-Artificial (Esinye)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "isi-Indonesian" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "isi-Indo-European (Esinye)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "isi-Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "isi-Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "isi-Iranian (Esinye)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Iilwimi ze-Iroquoian" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "isiTaliyane" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "isi-Javanese" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "isi-Lojban" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "isiJapani" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "isi-Judeo-Persian" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "isi-Judeo-Arabic" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "isi-Kara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "isi-Kabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "isi-Kachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "isi-Kalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "isi-Kamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "isi-Kannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "isi-Karen" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "isi-Kashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "isi-Kanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "isi-Kawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "isi-Kazakh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "isi-Kabardian" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "isi-Khasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "isi-Khoisan (Esinye)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "isi-Khmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "isi-Khotanese" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "isi-Kikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "isi-Kinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "isi-Kirghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "isi-Kimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "isi-Konkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "isi-Komi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "isi-Kongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "isi-Korean" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "isi-Kosraean" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "isi-Kpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "isi-Karachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "isi-Kru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "isi-Kurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "isi-Kuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "isi-Kumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "isi-Kurdish" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "isi-Kutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "isi-Ladino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "isi-Lahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "isi-Lamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "isi-Lao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "isi-Latin" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "isi-Latvian" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "isi-Lezghian" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "isi-Limburgan" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "isi-Lingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "isi-Lithuanian" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "isi-Mongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "isi-Lozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "isi-Luxembourgish" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "isi-Luba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "isi-Luba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "isi-Ganda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "isi-Luiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "isi-Lunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "isi-Luo (eKenya naseTanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "isi-Lushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "isi-Macedonian" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "isi-Madurese" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "isi-Magahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "isi-Marshallese" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "isi-Maithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "isi-Makasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "isi-Malayalam" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "isi-Mandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "isi-Maori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "isi-Austronesian (Esinye)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "isi-Marathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "isi-Masai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "isi-Malay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "isi-Moksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "isi-Mandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "isi-Mende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "isi-Irish, Esiphakathi (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "isi-Mi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "isi-Minangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Iilwimi Eziyintlaninge" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "isi-Mon-Khmer (Esinye)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "isi-Malagasy" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "isi-Maltese" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "isi-Manchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "isi-Manipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Iilwimi zesiManobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "isi-Mohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "isi-Moldavian" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "isi-Mongolian" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "isi-Mossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Iilwimi Ezininzi" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Iilwimi zesiMunda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "isi-Creek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "isi-Mirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "isi-Marwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Iilwimi zesi-Mayan" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "isi-Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "isi-Nahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "isi-American Indian saseMantla" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "isi-Neapolitan" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "i-Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "isiNdebele, saseMzantsi" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "isiNdebele, saseMantla" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "isiNdonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "isiJamani saseZantsi" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "isi-Nepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "isi-Nepal Bhasa" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "isi-Nias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "isi-Niger-Kordofanian (Ezinye)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "isi-Niuean" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "isi-Norwegian Nynorsk" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "isi-Norwegian Bokmal" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "isi-Nogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "isi-Norse, Sakudala" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "isi-Norwegian" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "isiSuthu saseLebowa" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Iilwimi zesiNubian" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "isi-Classical Newari" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "isi-Chichewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "isi-Nyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "isi-Nyankole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "isiNyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "isiNzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "isi-Occitan (emva kwe-1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "isi-Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "isi-Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "isi-Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "isi-Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "isi-Ossetian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "isi-Turkish, Ottoman (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Iilwimi zesi-Otomian" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "isi-Papuan (Esinye)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "isi-Pangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "isi-Pahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "isi-Pampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "isi-Panjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "isi-Papiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "isi-Palauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "isi-Persian, Sakudala (ca.600-400 B.C)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "isi-Persian" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "isi-Philippine (Esinye)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "isi-Phoenician" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "isiPali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "isi-Polish" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "isi-Pohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "isiPhuthukezi" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Iilwimi zesi-Prakrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "isi-Provencal, Sakudala (ukuya kwi-1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "Isi-Pushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "isi-Quechua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "isi-Rajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "isi-Rapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "isi-Ratongan" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "isi-Romance (Ezinye)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "isi-Raeto-Romance" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "isi-Romany" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "isi-Romanian" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "isi-Rundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "isiRashiya" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "isi-Sandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "isi-Sango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "isi-Yakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "isi-South American Indian (Ezinye)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Iilwimi zesi-Salishan " #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "isi-Samaritan Aramaic" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "isi-Sanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "isi-Sasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "isi-Santali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "isi-Serbian" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "isi-Sicilian" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "isi-Scots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "isi-Croatian" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "isi-Selkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "isi-Semitic (Ezinye)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "isi-Irish, Sakudala (ukuya ku-900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Iilwimi zeMiqondiso" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "isi-Shan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "isi-Sidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "isi-Sinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Iilwimi zesi-Siouan" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "isi-Sino-Tibetan (Ezinye)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "isi-Slavic (Esinye)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "isi-Slovak" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "isi-Slovenian" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "isi-Sami esiseMzantsi" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "isi-Sami esiseMantla" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Iilwimi zesi-Sami (Ezinye)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "isi-Lule Sami" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "isi-Inari Sami" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "isi-Samoan" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "isi-Skolt Sami" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "isiShona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "isi-Sindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "isi-Soninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "isi-Sogdian" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "isi-Somali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "isi-Songhai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "isiSuthu, saseMzantsi" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "isi-Spanish" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "isi-Sardinian" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "isi-Serer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "isi-Nilo-Saharan (Ezinye)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "isiSwati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "isiSukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "isi-Sundanese" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "isi-Susu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "isi-Sumerian" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "isiSwahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "isi-Swedish" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "isi-Syriac" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "isi-Tahitian" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "isi-Tai (Esinye)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "isi-Tamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "isi-Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "isiTelegu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "isi-Timne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "isi-Tereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "isi-Tetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "isi-Tajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "isi-Tagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "isi-Thai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "isi-Tibetan" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "isi-Tigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "isi-Tigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "isi-Tiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "isi-Klingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "isi-Tlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "isi-Tamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "isiTonga (Nyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "isi-Tonga (Tonga Islands)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "isi-Tok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "isi-Tsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "isiTswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "isiTsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "isi-Turkmen" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "isiTumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Iilwimi zesiTupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "isi-Turkish" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "isi-Altaic (Esinye)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "isiTwi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "isi-Tuvinian" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "isi-Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "isi-Ugaritic" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "isi-Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "isi-Ukrainian" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "isi-Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Akuqondwanga" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "isi-Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "isi-Uzbek" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "isi-Vai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "isiVenda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "isi-Vietnamese" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "isi-Volapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "isi-Votic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Iilwimi zesiWakashan" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "isi-Walamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "isi-Waray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "isi-Washo" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "isi-Welsh" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Iilwimi zesi-Sorbian" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "isi-Walloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "isi-Wolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "isi-Kalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "isiXhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "isi-Yao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "isi-Yapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "isi-Yiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "isiYoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Iilwimi zesi-Yupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "isi-Zapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "isi-Zenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "isi-Zhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "isi-Zande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "IsiZulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "isiZuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "akwaziwa" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "Idiski ayikho." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Umyalelo ongaziwa" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Ulungiselelo olusebenzisekayo lwe-Url '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "Akakwazi kudaleka uvimba weefayili %1: %2." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Ayikwazi kuvuleka into yolwazi olusesikrinini '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Igama lefayili elithathwa ngaphandle elingasebenzisekiyo." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Ayikwazi kuvula ifayili ukuze kubhalwe." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Imposiso xa kufundwa kwidiski ye-floppy." #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "Ibuyisela oovimba" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Ayikwazi kuvuleka into yolwazi olusesikrinini '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "Igama le-VM alikwazi kuqalisa ngomvo." #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr "Igama le-VM alikwazi kuqalisa ngomvo." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" # continue button label #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Qhubeka?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Umbekelo%s usilele ukukhangela imfezekiso. Ingaba usafuna ukuzama kwakhona " "ukuyikhuphela?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Umbekelo%s usilele ukukhangela imfezekiso. Ingaba usafuna ukuzama kwakhona " "ukuyikhuphela?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "kusilele ukukhangela ukusetyenziswa kwe-deltarpm. " #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "kusilele ukusetyenziswa kwe-deltarpm." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "uhlobo lukavimba we-VAR1 aluluxhasi uphawu lokubonisa utshintsho" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Ayikwazi kubonelela%s ukusuka ku%s" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "Ifayili %1 ayifunyenwanga elugcinweni." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "Ayikwazi kudaleka ifayili." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "Suhoya le mfuneko apha nje" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "Suhoya le mfuneko apha nje" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "Uqhagamshelo lucela uku:" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "Ayikwazi kuhlohla%s ngenxa yeengxaki zoxhomekeko" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "Akukho nanye ebonelela ngo%s " #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "Akukho baboneleli bahlohliweyo baka%s" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "Akukho baboneleli bahlohliweyo baka%s" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "Isicelo sesikhona kakade." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Ukuhlohla kuye kwalahlwa njengoko bekuyalelwe." #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "Phumeza" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "Imposiso ngethuba loguqulelo oluntsonkothileyo lweqhosha." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "isilele" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Iifayili zobumbeko ezitshintshileyo zika%s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "i-rpm igcine %s njenge %s kodwa kwakungenzeki ukumisela umahluko" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "i-rpm igcinwe %s njenge %s.\n" "Nantsi imigca eyi-25 yokuqala yomahluko:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "i-rpm idalwe %s njenge %s kodwa kwakungenzeki ukumisela umahluko" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "i-rpm idalwe %s njenge %s.\n" "Nantsi imigca eyi-25 yokuqala yomahluko:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "Isivelisi se-rpm Esongezelelweyo:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "idale ugcino olukhuselekileyo %s " #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "Ukungenisa akufunyenwanga." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "Ukungenisa akufunyenwanga." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "Ukungenisa akufunyenwanga." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'%1ayikho kwayona." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'%1ayikho kwayona." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Isilele ukuqalisa i-VM." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Isilele ukuqalisa i-VM." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "Ukungenisa akufunyenwanga." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Ayikwazi kuvuleka ifayili %1." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Umtya wokubuzisa we-LDAP URL ongasebenzisekiyo" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Umtya wokubuzisa we-LDAP URL ongasebenzisekiyo '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Akukwazeki ukufanisa into ye-Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Isalathi sento ye-Url elikhamte nengasebenzisekiyo" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Akukwazeki ukwahlula iinxalenye ze-Url" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Ulungiselelo lwe-Url aluyivumeli i-%s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Ayisebenziseki %s inxalenye '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Ayisebenziseki %s inxalenye" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Ukwahlulwa komtya wokubuzisa awuxhaswa malunga nale-URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Ulungiselelo lwe-Url yinxalenye efunekayo" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Ulungiselelo olusebenzisekayo lwe-Url '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Ulungiselelo lwe-Url akulivumeli igama lomsebenzisi" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Ulungiselelo lwe-Url awulivumeli igama lokugqithisa" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Ulungiselelo lwe-Url lufuna inxalenye yomamkeli" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Ulungiselelo lwe-Url awuyivumeli inxalenye yomamkeli" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Ayisebenziseki inxalenye yomamkeli ye-'%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Ulungiselelo lwe-Url awusivumeli isiqhagamshelanisi" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Ayisebenziseki inxalenye yesiqhagamshelanisi se-'%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Ulungiselelo lwe-Url lufuna igama lendlela yothungelwano" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Indlela yothungelwano ethelekisekayo ayivunyelwa xa lukhona ugunyaziso" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Umtya ofakwe iikhowudi uqhulethe i-byte ENGENANTO" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" "Uphawu oluthatha isithuba somhlukanisi oqhekezayo woludwe lomda wenkcazelo " "engasebenzisekiyo" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" "Uphawu oluthatha isithuba somhlukanisi oqhekezayo woludwe lomda wenkcazelo " "ongasebenzisekiyo" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" "Uphawu oluthatha isithuba somhlukanisi ohlanganisayo woludwe lomda " "wenkcazelo engasebenzisekiyo" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Umyalelo okhutshwa xa kudityaniswa" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Ayikwazi kufumana %s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "Ayikwazi kufumana %s." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Ayikwazanga kuvuleka i-%s - %s\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Kusilele ukulayishwa kwemodyulei \"%s\"." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Ifayili %1 ayifunyenwanga elugcinweni." #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Akukwazi kubhaleka ukuphawuleka kwefayili %1." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "%1 asingovimba weefayili." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "Igama le-CA elikhamte." #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Isicwangciso se-Url asisebenziseki '%1'" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Ayikwazi kuvuleka into yolwazi olusesikrinini '%s'" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Iimvume zaliwe" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "Ewe" #: zypp-tui/Table.cc:32 msgid "No" msgstr "Hayi" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Isilumkiso" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Imposiso" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "igqibile" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "impazamo" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Isilumkiso" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Kuyaqaliswa..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Ayifunyanwanga" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "ewe" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "hayi" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha." #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "umyalelo wokuyeka ukuhlohla imibekelelo" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "Akukho nanye ebonelela ngo%s " #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Idiski ayikho." #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s itshixiwe kwaye ayikwazi kungahlohlwa." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "ayihlohlwanga" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s ifunwa ngu %s" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Ayikwazi kuhlohla%s " #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s iimpixano ne %s" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s ziphelelwe lixehsa %s" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s ziphelelwe lixehsa %s" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s iimpixano ne %s" #~ msgid "do not install %s" #~ msgstr "ungahlohli %s" #~ msgid "keep %s" #~ msgstr "Gcina%s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "ungahlohli %s" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "Akukho baboneleli bahlohliweyo baka%s" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "Ungahlohli okanye cima izicombululi ezinxulumeneyo" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "Hlohla%s nangona kuza kutshintsha inzululwazi yokwakha" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s ziphelelwe lixehsa %s" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "Ikhuphele%s ukusuka ku%s" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Ukuhlohla" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Ayikwazi kuvuleka ifayili %1." #~ msgid "Hal Exception" #~ msgstr "Isinxaxhi se-Hal" #~ msgid "HalContext not connected" #~ msgstr "Imeko ye-Hal ayiqhagamshelwanga" #~ msgid "HalDrive not initialized" #~ msgstr "Isixhobo se-Hal asindululwanga" #~ msgid "HalVolume not initialized" #~ msgstr "Isixa se-Hal asindululwanga" #~ msgid "Unable to create dbus connection" #~ msgstr "Ayikwazi kudala uqhagamshelo lwe-dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "i-libhal_ctx_entsha: Ayikwazu kudala imeko ye-libhal" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "" #~ "i-libhal_imisela_uqhagamshelo_lwe-dbus: Ayikwazi kumesela uqhagamshelo " #~ "lwe-dbus " #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Ayikwazi kundulula imeko ye-HAL--i-hald ayiqhubi?" #~ msgid "Not a CDROM drive" #~ msgstr "Akukho sixhobo se-CDROM" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Ayikwazi kundulula ukwabela i-mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Ayikwazi kumisela ulwabelo lokugoba i-mutex " #~ msgid "Can't initialize recursive mutex" #~ msgstr "Ayikwazi kundulula i-mutex yokugoba" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Ayikwazi kufumana isitshixo se-mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Ayikwazi kukhulula isitshixo se-mutex" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Akukwazeki ukufumana iqhosha likawonkewonke." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "ayihlohlwanga" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Ayikwazanga kuvuleka i-%s - %s\n" #~ msgid "Serbia and Montenegro" #~ msgstr "i-Serbia ne-Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Isikhethwa soluhlu esingaziwa" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "ayikwazi kusombulula izixhomekeki" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayili%s ayinayo inxenye yokukhangela.\n" #~ "Sebenzisa ifayili nakanjani?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayili%s isilele ukukhangela imfezeko ngeqhosha elilandelayo:\n" #~ "%s|%s|%s\n" #~ " Sebenzisa ifayili nalanjani?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayili%s inenxenye yokukhangela engasebenzi.\n" #~ "Ilindeleke%s, ifunyenwe%s\n" #~ " Sebenzisa ifayili nakanjani?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayili%s inenxenye yokukhangela engaziwa%s .\n" #~ "Sebenzisa ifayili nakanjani?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Ifayili %s ayisayinwanga.\n" #~ "Yisebenzise nakanjani?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayili%s isayinwe ngeqhosha elingaziwa:\n" #~ "%s|%s|%s\n" #~ " Sebenzise ifayili nakanjani?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Kufunyenwe iqhosha elingathenjwanga:\n" #~ "%s|%s|%s\n" #~ " Themba Iqhosha?" #~ msgid "%s remove failed" #~ msgstr "%s ukushenxisa kusilele" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "Guqula igama lokugqithisa lakho" #~ msgid "rpm output:" #~ msgstr "isivelisi se-rpm:" #~ msgid "%s install failed" #~ msgstr "%s ukuhlohla kusilele" #~ msgid "%s installed ok" #~ msgstr "%s ukuhlohla kulungile" #~ msgid "%s remove ok" #~ msgstr "%s ukushenxisa kulungile" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "" #~ "%s ibonelela esi sixhomekeki kodwa kuza kutshintsha inzululwazi yokwakha " #~ "into ehlohliweyo" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "" #~ "%s ibonelela esi sixhomekeki kodwa kuza kutshintsha inzululwazi yokwakha " #~ "into ehlohliweyo" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Ungahlohli okanye cima izicombululi ezinxulumeneyo" #~ msgid "Ignore that %s is already set to install" #~ msgstr "Suhoya ukuba%s sele imiselwe ukuhlohla" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "Suhoya ukuphelelwa%s lixesha kwi%s" #~ msgid "Ignore this conflict of %s" #~ msgstr "Suhoya le mpixano ka%s " #~ msgid "Ignore this requirement just here" #~ msgstr "Suhoya le mfuneko apha nje" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "Hlohla%s nangona kuza kutshintsha inzululwazi yokwakha" #~ msgid "Install missing resolvables" #~ msgstr "Hlohla izicombululi ezilahlekileyo" #~ msgid "Keep resolvables" #~ msgstr "Gcina iziconjululwa" #~ msgid "Unlock these resolvables" #~ msgstr "Vula ezi zicombululi" #~ msgid "delete %s" #~ msgstr "Cima %s" #~ msgid "install %s" #~ msgstr "hlohla%s" #~ msgid "unlock %s" #~ msgstr "vula%s" #~ msgid "unlock all resolvables" #~ msgstr "vula zonke izicombululi" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Ayikwazi kuvuleka ifayili %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "Icandelo lokufunda imposiso %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "" #~ "Ukwahlula umda wenkcazelo yendlela yothungelwano awuxhaswa malunga nale-" #~ "URL" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "" #~ "Ukwahlula umda wenkcazelo yendlela yothungelwano awuxhaswa malunga ne-URL" #~ msgid "Software management is already running." #~ msgstr "Ukulawulwa kwe-software sele kuqhuba." #~ msgid "%s is replaced by %s" #~ msgstr "%s ibuyiselwe ngo %s" #~ msgid "%s replaced by %s" #~ msgstr "%s ibuyiselwe ngo %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "Ezi ziconjululwa ziza kucinywa kwisixokelelwano." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s ayizukuhlohlwa kuba isafuneka" #~ msgid "Invalid information" #~ msgstr "Ulwazi olungasebenzi" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s iyafunwa zezinye iziconjululwa" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s ifunwa ngu:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s iimpixano nezinye iziconjululwa" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s iimpixano ne:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s yenza ezinye iziconjululwa ziphelelwe lixesha" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "Ezi ziconjululwa ziza kucinywa kwisixokelelwano." #~ msgid "%s depends on other resolvables" #~ msgstr "%s ixhomekeke kwezinye iziconjululwa" #~ msgid "%s depends on %s" #~ msgstr "%s ixhomekeke kwi %s" #~ msgid "%s depends on:%s" #~ msgstr "%s ixhomekeke kwi:%s" #~ msgid "Child of" #~ msgstr "Umntwana ka" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "Akukho vimba ufumanekayo oxhasa le mfuneko." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "Ngenxa yeengxaki ezichazwe ngentla/ngezantsi kwesi sigqibo " #~ "akuyikusombulula zonke izixhomekeki." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "Ayikwazi kuhlohla u%s kuba kuyaphixana ne%s " #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s ayihlohlwanga kwaye iphawulwe njengengahlohleki" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s inemfuneko ezingazalisekiswanga" #~ msgid "%s has missing dependencies" #~ msgstr "%s inezixhomekeki ezilahlekileyo" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s ayikwazi kuhlohla ngenxa yezixhomekeki ezilahlekikeyo" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s zalisekisa izixhomekeki zika%s kodwa aziyi kuhlohlwa" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "" #~ "%s zaliseka izixhomekeki zika%s kodwa ziza kugcinwa kwisixokelelwano sakho" #~ msgid "No need to install %s" #~ msgstr "Akukho mfuno yokuhlohla%s " #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "Ayikwazi kuhlohla%s ukuzalisekisa izixhomekeki zika%s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "Ayikwazi kuhlohla%s ukuzalisekisa izixhomekeki zika%s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s ayizukuhlohlwa kuba isafuneka" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "%s ziphelelwe lixehsa%s . Kodwa%s ayikwazi kucima kuba itshixiwe." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "Ayikwazi kuhlohla u%s kuba kuyaphixana " #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s ayihlohleki ngenxa yeempixano ne %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "ukufuna%s ka%s xa ihlaziya%s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s ilahlekelwe yimfuneko %s" #~ msgid ", Action: " #~ msgstr ", Isenzo:" #~ msgid ", Trigger: " #~ msgstr ", Inkcukumiso:" #~ msgid "package" #~ msgstr "umbekelo" #~ msgid "selection" #~ msgstr "ukukhetha" #~ msgid "pattern" #~ msgstr "indlela yenkqubo" #~ msgid "product" #~ msgstr "imveliso" #~ msgid "patch" #~ msgstr "lungisa" #~ msgid "script" #~ msgstr "iskripti" #~ msgid "message" #~ msgstr "umyalezo" #~ msgid "atom" #~ msgstr "iatom" #~ msgid "system" #~ msgstr "isixokelelwano" #~ msgid "Resolvable" #~ msgstr "Isiconjululwa" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "Ukuphawu le nzame yesigqibo akusebenzi." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "Ukuphawula ukuconjululwa%s njengesingahlohleki" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s uludwe lwenkqubo ukuba lihlohlwe, kodwa oku akwenzeki ngenxa yeengxaki " #~ "zesixhomekeki." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "" #~ "Ayikwazi kuhlohla%s ukusukela oko kuba sele iphawulwe njengefuna ukuba " #~ "ihlohlwe" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "" #~ "Ayikwazi kuhlohla%s ukusukela oko ingabhekiseli kwesi sixokelelwano." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "Ayikwazi kuhlohla%s ukusukela oko%s kuba sele iphawulwe njengefuna ukuba " #~ "ihlohlwe" #~ msgid "This would invalidate %s." #~ msgstr "Oku kuza kubhangisa%s." #~ msgid "Establishing %s" #~ msgstr "Imisela%s" #~ msgid "Installing %s" #~ msgstr "Ihlohla %s" #~ msgid "Updating %s to %s" #~ msgstr "Ihlaziya%s ukuya ku%s" #~ msgid "Skipping %s: already installed" #~ msgstr "Itsiba%s: sele ihlohliwe" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "Akukho baboneleli bachaseneyo bahlohliweyo baka%s" #~ msgid "for %s" #~ msgstr "ka%s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "Hlaziya ukuya ku%s ukunqanda ukushenxiswa kuka%s akwenzeki." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s ibonelela%s, kodwa yenzelwe uludwe lwenkqubo ukuba ihlohlwe." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "%s ibonelela%s, kodwa enye inguqulelo yoko%s sele ihlohliwe." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s ibonelela%s, kodwa ayihlohleki. Zama ukuyihlohla ngokunokwayo " #~ "ngeenkcukacha ezithe vetshe." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s ibonelela%s, kodwa itshixiwe." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s ibonelela%s, kodwa yenzelwe uludwe lwenkqubo ukuba igcinwe." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s ibonelela%s, kodwa inenye inzululwazi ngokwakha." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "Ayikwazi kwanelisa imfuneko%s ka%s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s iyafunwa zezinye ukuba ihlohle izicombululi, ayizukwazi ukwenziwa " #~ "inganxulumani." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s iyafunwa zezinye ukuba ihlohle izicombululi, ayizukwazi ukwenziwa " #~ "inganxulumani." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "Impixano ngaphezu%s (%s) ifuna ukushenxiswa ukuba kuhlohlwe%s" #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "Ukuphawula%s njengengahlohleki ngenxa yeempixano ezingaphezu kuka%s" #~ msgid "from %s" #~ msgstr "Ukusuka ku%s" #~ msgid " Error!" #~ msgstr "Imposiso!" #~ msgid " Important!" #~ msgstr "Ibalulekile!" #~ msgid "%s depended on %s" #~ msgstr "%s ixhomekeke kwi %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s ifunwa ngu %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s ifunwa ngu %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s ibuyiselwe ngo %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s ifunwa ngu %s" #~ msgid "%s part of %s" #~ msgstr "%s inxenye ka %s" #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s ifunwa ngu %s" #~ msgid "Unable to parse Url authority" #~ msgstr "Akukwazeki ukwahlula ugunyaziso lwe-Url" #~ msgid "Ignore this requirement generally" #~ msgstr "Suhoya le mfuneko jikelele" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s iyafunwa zezinye ukuba ihlohle izicombululi, ayisoze inganxulumani." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "Ayikwazi kudala ifayili efunelwa ukwenza ukuhlohlwa kohlaziyo." #~ msgid "Unable to restore all sources." #~ msgstr "Ayikwazi kugcina bonke oovimba." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "Uvimba nje omnye sele ebhalisiwe, oovimba abagciniweyo abanako ukugcinwa " #~ "kwakhona." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "Ayikwazi kuhlohla%s ukuzalisekisa izixhomekeki zika%s" #~ msgid "%s dependend on %s" #~ msgstr "%s ixhomekeke kwi %s" #~ msgid "Reading index files" #~ msgstr "Ifunda iifayili zokwalathisa" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "Ifayili ye-xml repomd esayiniweyo isilele usayino lokukhangela." #~ msgid "Reading product from %s" #~ msgstr "Ifunda imveliso ukusuka ku%s" #~ msgid "Reading filelist from %s" #~ msgstr "Ifunda uluhlu lwefayili ukusuka ku%s" #~ msgid "Reading packages from %s" #~ msgstr "Ifunda imibekelo ukusuka ku%s" #~ msgid "Reading selection from %s" #~ msgstr "Ifunda ukukhetha ukusuka ku%s" #~ msgid "Reading pattern from %s" #~ msgstr "Ifunda indlela yenkqubo ukusuka ku%s" #~ msgid "Reading patches index %s" #~ msgstr "Ifunda iindawana zokwalathisa%s" #~ msgid "Reading patch %s" #~ msgstr "Ifunda indawana%s" #~ msgid "The script file failed the checksum test." #~ msgstr "Ifayili yesikripti isilele uvavanyo lwe-checksum. " #~ msgid "Reading packages file" #~ msgstr "Ifunda ifayili yemibekelo" #~ msgid "Reading translation: %s" #~ msgstr "Ifunda uguqulelo: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "Umbekelo%s usilele ukukhangela imfezekiso. Ingaba usafuna ukuzama " #~ "kwakhona ukuyikhuphela, okanye lahla ukuhlohla?" #~ msgid " miss checksum." #~ msgstr "ilahlekelwe kukukhangela inxenye." #~ msgid " fails checksum verification." #~ msgstr "isilele ukuqinisekisa ukukhangela inxenye." #~ msgid "Downloading %s" #~ msgstr "Ikhuphela u%s" libzypp-17.36.5/po/zh_CN.po000066400000000000000000003632051476576476200154060ustar00rootroot00000000000000# Chinese message file for YaST2 (@memory@) # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # # # Thruth Wang , 2007, 2008, 2009, 2012, 2013. # marguerite , 2013. # 玛格丽特 · 苏 , 2013, 2014, 2015. msgid "" msgstr "" "Project-Id-Version: YaST (@memory@)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-04-30 05:43+0000\n" "Last-Translator: Grace Yu \n" "Language-Team: Chinese (China) \n" "Language: zh_CN\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: Weblate 4.9.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "未知国家或地区: " #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "无代码" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "安道尔共和国" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "阿拉伯联合酋长国" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "阿富汗" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "安提瓜岛和巴布达岛" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "安圭拉岛" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "阿尔巴尼亚" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "亚美尼亚" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "荷属安的列斯" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "安哥拉" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "南极洲" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "阿根廷" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "美属萨摩亚" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "奥地利" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "澳大利亚" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "阿鲁巴岛" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "奥兰群岛" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "阿塞拜疆" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "波斯尼亚和黑塞哥维那" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "巴巴多斯岛" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "孟加拉国" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "比利时" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "布基纳法索" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "保加利亚" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "巴林" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "布隆迪" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "贝宁湾" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "百慕大群岛" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "文莱达鲁萨兰国" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "玻利维亚" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "巴西" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "巴哈马群岛" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "不丹" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "布维岛" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "博茨瓦纳" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "白俄罗斯" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "伯利兹城" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "加拿大" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "科科斯(基林)群岛" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "刚果" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "中非共和国" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "瑞士" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "科特迪瓦共和国" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "库克群岛" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "智利" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "喀麦隆" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "中国" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "哥伦比亚" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "哥斯达黎加" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "古巴" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "佛得角" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "圣诞岛" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "塞浦路斯" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "捷克共和国" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "德国" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "吉布提" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "丹麦" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "多米尼加" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "多米尼加共和国" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "阿尔及利亚" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "厄瓜多尔" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "爱沙尼亚" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "埃及" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "西撒哈拉" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "厄立特里亚" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "西班牙" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "埃塞俄比亚" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "芬兰" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "斐济" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "福克兰群岛(马尔维纳斯群岛)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "密克罗尼西亚联邦" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "法罗群岛" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "法国" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "法属美特罗波利坦" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "加蓬" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "英国" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "格林纳达" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "乔治亚州" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "法属圭亚那" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "格恩西" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "加纳" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "直布罗陀" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "格陵兰" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "冈比亚" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "几内亚" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "瓜德罗普岛" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "赤道几内亚" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "希腊" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "南乔治亚岛和南三维治群岛" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "危地马拉" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "关岛" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "几内亚比绍共和国" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "圭亚那" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "中国香港特别行政区" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "赫德岛和麦克唐纳岛" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "洪都拉斯" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "克罗地亚" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "海地" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "匈牙利" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "印度尼西亚" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "爱尔兰" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "以色列" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "马恩岛" #: zypp/CountryCode.cc:261 msgid "India" msgstr "印度" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "英属印度洋领地" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "伊拉克" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "伊朗" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "冰岛" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "意大利" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "泽西岛" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "牙买加" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "约旦" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "日本" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "肯尼亚" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "吉尔吉斯斯坦" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "柬埔寨" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "基里巴斯" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "科摩罗" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "圣基茨和尼维斯" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "北朝鲜" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "南韩" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "科威特" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "开曼群岛" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "哈萨克斯坦" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "老挝人民民主共和国" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "黎巴嫩" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "圣卢西亚岛" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "列支敦士登" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "斯里兰卡" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "利比里亚" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "莱索托" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "立陶宛" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "卢森堡公国" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "拉脱维亚" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "利比亚" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "摩洛哥" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "摩纳哥" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "摩尔多瓦" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "黑山" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "圣马丁" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "马达加斯加岛" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "马绍尔群岛" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "马其顿王国" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "马里" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "缅甸" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "蒙古" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "中国澳门行政特区" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "北马里亚纳群岛" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "马提尼克岛" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "毛利塔尼亚" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "蒙特塞拉特岛" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "马耳他" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "毛里求斯" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "马尔代夫" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "马拉维" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "墨西哥" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "马来群岛" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "莫桑比克" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "纳米比亚" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "新喀里多尼亚" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "尼日尔" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "诺福克岛" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "尼日利亚" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "尼加拉瓜" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "荷兰" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "挪威" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "尼泊尔" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "瑙鲁语" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "纽埃岛" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "新西兰" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "阿曼" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "巴拿马" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "秘鲁" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "法属波利尼西亚" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "巴布亚新几内亚" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "菲律宾共和国" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "巴基斯坦" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "波兰" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "圣皮埃尔和密克隆" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "皮特克恩岛" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "波多黎各" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "巴基斯坦领土" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "葡萄牙" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "帕劳群岛" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "巴拉圭" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "卡塔尔" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "留尼旺" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "罗马尼亚" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "塞尔维亚" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "俄联邦" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "卢旺达" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "沙特阿拉伯" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "所罗门群岛" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "塞舌尔" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "苏丹" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "瑞典" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "新加坡" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "圣赫勒拿" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "斯洛文尼亚" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "斯瓦尔巴岛和扬马延岛" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "斯洛伐克" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "塞拉利昂" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "圣马力诺" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "塞内加尔" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "索马里" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "苏里南" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "圣多美和普林西比" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "萨尔瓦多" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "叙利亚共和国" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "斯威士兰" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "特克斯和凯科斯群岛" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "乍得湖" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "法属南部领土" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "多哥" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "泰国" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "塔吉克斯坦" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "托克劳语" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "土库曼斯坦" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "突尼斯" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "汤加" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "东帝汶" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "土耳其" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "特立尼达和多巴哥" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "图瓦卢语" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "台湾" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "坦桑尼亚" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "乌克兰" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "乌干达" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "美国本土外小岛屿" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "美国" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "乌拉圭" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "乌兹别克斯坦" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "梵蒂冈(梵蒂冈城国)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "圣文森特和格林纳丁斯" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "委内瑞拉" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "英属维尔京群岛" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "美属维尔京群岛" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "越南" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "瓦努阿图" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "瓦利斯和富图纳" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "萨摩亚群岛" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "也门" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "马约特岛" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "南非" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "赞比亚" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "津巴布韦" #: zypp/Dep.cc:96 msgid "Provides" msgstr "提供" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "前提" #: zypp/Dep.cc:98 msgid "Requires" msgstr "需要" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "冲突" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "淘汰" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "推荐" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "建议" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "增强" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "补充" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "未知语言: " #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "阿法尔语" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "阿布哈兹语" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "亚齐语" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "阿乔利方言" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "阿当梅语" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "阿地盖语" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "亚非诸语言(其它)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "阿弗里希利语" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "南非荷兰语" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "阿伊努语" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "阿坎语" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "阿卡德语" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "阿尔巴尼亚语" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "阿留申语" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "阿冈昆语" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "南阿尔泰语" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "阿姆哈拉语" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "古代英语(约 450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "阿帕切语" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "阿拉伯语" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "亚拉姆语" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "阿拉贡语" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "亚美尼亚语" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "阿劳干语" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "阿拉帕霍语" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "人工语言(其它)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "阿拉瓦克语" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "阿萨姆语" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "阿斯图里亚斯语" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "阿撒巴斯卡语" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "澳洲语" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "阿法语" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "阿维斯陀语" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "阿瓦乔语" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "艾马拉语" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "阿塞拜疆语" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "班达语" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "巴米累克语" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "巴什基尔语" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "俾路支语" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "班巴拉语" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "巴厘语" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "巴斯克语" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "巴萨语" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "波罗的海诸语言(其它)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "别札语" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "白俄罗斯语" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "别姆巴语" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "孟加拉语" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "柏柏尔语(其它)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "博杰普尔语" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "比哈里语" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "比口语" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "比尼语" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "比利兹语" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "西克西卡语" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "班图语(其它)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "波斯尼亚语" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "布拉杰语" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "布里多尼语" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "巴塔克语(印度尼西亚)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "布利亚特语" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "布吉语" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "保加利亚语" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "缅甸语" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "布林语" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "卡多语" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "中美洲印第安语(其它)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "加勒比语" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "加泰罗尼亚语" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "高加索语(其它)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "宿务语" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "塞尔特语(其它)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "查莫罗语" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "契布卡语" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "车臣语" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "查加语" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "中文" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "楚克语" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "马里语" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "契努克语" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "乔克托语" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "奇帕维安语" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "彻罗基语" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "宗教斯拉夫语" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "楚瓦什语" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "夏延语" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "查米克语" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "科普特语" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "凯尔特语" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "科西嘉语" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "基于英语的克里奥尔语和皮钦语(其它)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "基于法语的克里奥尔语和皮钦语(其它)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "基于葡萄牙语的克里奥尔语和皮钦语(其它)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "克里族语" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "克里米亚鞑靼语" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "克里奥尔语和皮钦语(其它)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "卡舒比语" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "库希特语(其它)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "捷克语" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "达科他语" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "丹麦语" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "特拉华语" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "达雅语" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "特拉瓦印第安人语" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "阿萨巴斯卡奴隶语" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "多格里布语" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "丁卡语" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "迪蔚希语" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "多格来语" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "达罗毗荼语(其它)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "下索布语" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "都阿拉语" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "中古荷兰语(约 1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "荷兰语" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "迪尤拉语" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "不丹语" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "艾非克语" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "古埃及语" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "艾卡朱克语" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "艾拉米特语" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "英语" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "中古英语 (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "世界语" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "爱沙尼亚语" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "幽语" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "埃翁多语" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "芳语" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "法罗语" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "芳蒂语" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "斐济语" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "菲律宾语" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "芬兰语" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "芬兰乌戈尔语(其它)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "丰语" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "法语" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "中古法语(约 1050-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "古法语(842-约 1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "弗里西语" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "富拉语" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "弗留利语" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "加语" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "卡约语" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "巴亚语" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "日尔曼语(其它)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "乔治亚语" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "德语" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "吉兹语" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "吉尔伯特语" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "盖尔语" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "爱尔兰语" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "加利西亚语" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "马恩岛语" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "中古高地德语(约 1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "古高地德语(约 750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "贡德语" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "哥伦打洛语" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "哥特语" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "格列博语" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "古希腊语(1453 以前)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "现代希腊语 (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "瓜拉尼语" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "印度古哈拉地语" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "库臣语" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "海达语" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "海地语" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "豪撒语" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "夏威夷语" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "希伯来语" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "赫雷罗语" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "希利盖农语" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "喜马偕尔语" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "北印度语" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "赫梯语" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "蒙(苗)语" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "希里莫图语" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "高地索布语" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "匈牙利语" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "胡帕语" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "伊班语" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "伊博语" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "冰岛语" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "伊多语" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "四川彝语" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "伊乔语" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "伊努伊特语" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "国际语" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "伊洛卡诺语" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "国际语(国际辅助语协会)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "印度语(其它)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "印度尼西亚语" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "印欧诸语言(其它)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "英古什语" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "依努皮亚语" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "伊朗语(其它)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "易洛魁语" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "意大利语" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "爪哇语" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "逻辑语" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "日语" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "犹太-波斯语" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "犹太-阿拉伯语" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "卡拉卡尔帕克语" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "卡比尔语" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "克钦语" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "格陵兰语" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "坎巴语" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "加拿大语" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "克伦语" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "克什米尔语" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "卡努里语" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "卡威语" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "哈萨克语" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "卡巴尔德语" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "卡西语" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "科伊桑语(其它)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "高棉语" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "和阗(和田)语" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "基库尤语" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "加泰隆语" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "吉尔吉斯语" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "金本杜语" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "孔卡尼语" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "科米语" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "刚果语" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "韩语" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "科斯拉伊语" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "克佩勒语" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "卡拉恰伊-巴尔卡尔语" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "克鲁语" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "库卢克语" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "宽亚玛语" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "库密克语" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "库尔德语" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "库特内语" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "拉迪诺语" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "拉亨达语" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "兰巴语" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "老挝语" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "拉丁语" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "拉脱维亚语" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "列兹金语" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "林堡干语" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "林加拉语" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "立陶宛语" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "蒙古语" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "洛齐语" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "卢森堡语" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "卢巴-卢拉语" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "卢巴-加丹加语" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "干达语" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "卢伊塞诺语" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "隆达语" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "卢奥语(肯尼亚和坦桑尼亚)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "卢萨语" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "马其顿语" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "马都拉语" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "马加赫语" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "马绍尔语" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "米德勒语" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "望加锡语" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "马拉雅拉姆语" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "曼丁哥语" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "毛利语" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "南岛语(其它)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "马拉地语" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "马萨伊语" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "马来语" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "莫克沙语" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "曼达语" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "门德语" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "中古爱尔兰语 (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "密克马克语" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "米南卡保语" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "杂语" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "孟高棉语(其它)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "马达加斯加语" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "马耳他语" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "满语" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "曼尼普尔语" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "马诺博诸语言" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "莫霍克语" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "摩尔达维亚语" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "蒙古语" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "莫西语" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "多语种" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "蒙达诸语言" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "克里克语" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "米兰德语" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "马尔瓦利语" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "玛雅诸语言" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "厄尔兹亚语" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "纳瓦特尔语" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "北美印第安语" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "那不勒斯语" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "纳瓦霍语" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "南部恩德贝勒语" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "北部恩德贝勒语" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "恩敦加语" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "低地德语" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "尼泊尔语" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "尼泊尔 Bhasa 语" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "尼亚斯语" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "尼日尔-科尔多凡语(其它)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "纽埃语" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "挪威 Nynorsk 语" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "挪威布克摩尔语" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "诺盖语" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "古诺尔斯语" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "挪威语" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "北梭托语" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "努比亚诸语言" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "古典尼瓦尔语" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "齐切瓦语" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "尼扬韦齐语" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "尼扬科勒语" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "尼奥罗语" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "恩济马语" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "欧西坦语(1500 后)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "奥吉布瓦语" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "奥里亚语" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "奥罗莫语" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "奥萨格语" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "奥塞梯语" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "土耳其语,古奥斯曼 (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "奥托米诸语言" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "巴布亚语(其它)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "邦阿西楠语" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "钵罗钵语" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "邦板牙语" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "旁遮普语" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "帕皮亚门托语" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "帕劳语" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "古波斯语(约公元前 600-400)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "波斯语" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "菲律宾语(其它)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "腓尼基语" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "巴利语" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "波兰语" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "波纳佩语" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "葡萄牙语" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "古印度方言" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "古普罗旺斯语(1500 以前)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "普什图语" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "盖丘亚语" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "拉贾斯坦语" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "拉帕努伊语" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "拉罗汤加语" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "罗曼语 (其它)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "罗曼语" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "吉普赛语" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "罗马尼亚语" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "隆迪语" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "俄语" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "桑达韦语" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "桑戈语" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "雅库特语" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "南美洲印第安语(其它)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "萨利什诸语言" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "萨马利亚阿拉米语" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "梵语" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "萨萨克语" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "桑塔利语" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "塞尔维亚语" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "西西里岛语" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "苏格兰语" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "克罗地亚语" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "塞尔库普语" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "闪米特语(其它)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "古爱尔兰语(900 以前)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "手语" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "掸语" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "锡达莫语" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "僧伽罗语" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "苏语诸语言" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "汉藏诸语言(其它)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "斯拉夫语(其它)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "斯洛伐克语" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "斯洛文尼亚语" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "南萨摩斯语" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "北萨摩斯语" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "萨米诸语言(其它)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "鲁乐萨摩斯语" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "伊纳里萨摩斯语" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "萨摩亚语" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "斯考特萨摩斯语" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "修纳语" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "信德语" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "索宁克语" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "粟特语" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "索马里语" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "桑海语" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "南部索托语" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "西班牙语" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "撒丁语" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "塞雷尔语" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "尼罗-撒哈拉语(其它)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "斯瓦特语" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "苏库马语" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "巽他语" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "苏苏语" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "苏美尔语" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "斯瓦希里语" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "瑞典语" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "古叙利亚语" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "塔希提语" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "傣语(其它)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "泰米尔语" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "鞑靼语" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "泰卢固语" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "滕内语" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "特列纳语" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "特塔姆语" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "塔吉克语" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "塔加路语" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "泰国语" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "藏语" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "提格雷语" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "提格里尼亚语" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "蒂夫语" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "克林贡" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "特林吉特语" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "塔马奇克语" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "汤加语(尼亚萨)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "汤加语(汤加岛)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "托克皮辛语" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "钦西安语" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "茨瓦纳语" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "聪加语" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "土库曼语" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "奇图姆布卡语" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "图皮诸语言" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "土耳其语" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "阿尔泰语(其它)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "契维语" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "图瓦语" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "乌德穆尔特语" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "乌加里特语" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "维吾尔语" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "乌克兰语" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "翁本杜语" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "未确定的语种" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "乌尔都语" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "乌兹别克斯坦语" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "瓦伊语" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "文达语" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "越南语" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "沃拉普克语" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "沃提克语" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "瓦卡希语组" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "瓦拉莫语" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "瓦赖语" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "瓦肖语" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "威尔士语" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "索布诸语言" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "瓦龙语" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "沃洛夫语" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "卡尔梅克语" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "科萨语" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "瑶语" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "雅浦语" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "依地语" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "约鲁巴语" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "尤皮克诸语言" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "萨波特克语" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "哲纳加语" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "壮语" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "赞德语" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "祖鲁语" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "祖尼语" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "将执行以下动作:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "未知" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "不支持" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "级别 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "级别 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "级别 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "需要额外的客户合同" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "已停产且已被其他软件包替代" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "无效" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "支持级别未指定" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "厂商不提供支持。" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "问题判定,该技术支持设计用于提供兼容性信息、安装辅助、使用帮助、持续维护和基" "础甄错。一级支持并不意在修正产品缺陷错误。" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "问题隔离,该技术支持设计用于重现客户问题、孤立问题领域并提供一级支持不能解决" "的问题的解决方案。" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "问题解决,该技术支持设计用来解决复杂的问题,通过工程解决二级支持中确认的产品" "缺陷。" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "签署一份额外的客户合同后才能获得支持。" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "该软件包已停产且已被一个使用其他名称的新软件包替代。" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "未知支持选项。描述不可用" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "系统管理被进程编号为 %d 的应用程序 %s 锁定。\n" "请关闭此应用程序再试。" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "未知匹配模式 '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "未知匹配模式 '%s'(对于软件集 '%s')" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "无效的正则表达式 '%s':regcomp 返回 %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "无效的正则表达式 '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "'%s' 需要认证" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "将重试..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "已尝试 %1% 次,将放弃。" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "访问 SUSE 客户中心检查您的注册是否有效且未过期。" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "访问 Novell 客户中心检查您的注册是否有效并尚未过期。" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "创建挂接点:找不到可用于创建挂接点的可写目录" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "请先安装 'lsof' 软件包。" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "无法创建元数据缓存文件夹。" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "试图读取 '%s' 出错" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "无法创建 %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "缓存软件源 (%d) 失败。" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "正在构建软件源 '%s' 的缓存" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "无法在 %s 创建缓存 - 无写入权限。" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "未处理的软件源类型" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "正在添加软件源 '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "'%s' 处的源文件名无效" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "无法打开 '%s' 文件进行写入。" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "读取 '%s' 遇到未知错误" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "无法读取源文件夹 '%1%':权限被拒" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "读取文件夹 '%s' 失败" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "无法读取源文件 '%1%':权限被拒" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "正在移除软件源 '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "不确定软件源的存储位置。" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "无法删除 '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "不确定服务的储存位置。" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "未知服务 '%1%':正在移除孤立的服务软件源 '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "软件源别名不能以点开头。" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "服务别名不能以点开头。" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "文件 %s 没有摘要。" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "摘要 %s 未知(文件 %s)。" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "文件 '%s' 的摘要验证失败" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "文件 '%s' 未签名,要继续吗?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "文件 '%s'(来自储存库 '%s')未签名,要继续吗?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "要拒绝密钥、暂时信任还是始终信任密钥?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "密钥名称:%1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "从储存库 \"%2%\" 收到 %1% 个新的套件签名密钥:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "文件 '%1%' 的签名验证失败。" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "对储存库 '%2%' 中的文件 '%1%' 的签名验证失败。" # internal key used: Ok #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "继续吗?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "文件 '%s' 是使用未知密钥 '%s' 签名的。要继续吗?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "文件 '%s'(来自储存库 '%s')是使用未知密钥 '%s' 签名的。要继续吗?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "软件源 %1% 并未定义额外的 'gpgkey=' URL。" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "正在软件源 %2% 中查找 GPG 密钥 ID %1%。" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "正在缓存 %2% 中查找 GPG 密钥 ID %1%。" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "缺失所需属性 '%s' 。" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "需要 '%s' 或 '%s' 属性中的一项或两项。" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "签名校验失败" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "软件包 %s 似乎在传输时损坏了。您想要重试检索吗?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "未能提供软件包 %s。您想要重试检索吗?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "Applydeltarpm 检查已失败。" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "Applydeltarpm 已失败。" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "服务插件不支持修改属性。" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "无法提供文件 '%s',软件源 '%s' 中找不到该文件" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "软件源中没有 url。" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "由'%3%' 文件标识的预期介质 %1%/%2% 内容为:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "来自软件包 %2%\n" " 的文件\n" " %1%\n" " 与来自软件包 %3%\n" " 的文件冲突" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "来自软件包 %2%\n" " 的文件\n" " %1%\n" " 与安装自 %3%\n" " 的文件冲突" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "安装自 %2%\n" " 的文件\n" " %1%\n" " 与来自软件包 %3%\n" " 的文件冲突" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "安装自 %2%\n" " 的文件\n" " %1%\n" " 与安装自 %3%\n" " 的文件冲突" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "来自软件包\n" " %2%\n" " 的文件 %1%\n" " 与来自软件包\n" " %4%\n" " 的文件\n" " %3% 冲突" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "来自软件包\n" " %2%\n" " 的文件 %1%\n" " 与安装自\n" " %4%\n" " 的文件\n" " %3% 冲突" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "安装自\n" " %2%\n" " 的文件 %1%\n" " 与来自软件包\n" " %4%\n" " 的文件\n" " %3% 冲突" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "安装自\n" " %2%\n" " 的文件 %1%\n" " 与安装自\n" " %4%\n" " 的文件\n" " %3% 冲突" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "无法创建 sat-pool。" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "通过忽略一些依赖关系来断开 %s" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "通常忽略一些依赖关系" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "安装的 %1% 不属于发行版升级源,必须替换" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "要安装的 %1% 不属于发行版升级源" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "安装的 %1% 的架构较低" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "要安装的 %1% 的架构较低" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "安装的 %1% 有问题" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "冲突的请求" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "一些依赖性问题" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "没有软件源能提供所请求的 \"%1%\"" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "您是否启用了全部所需的软件源?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "请求的软件包 %1% 不存在" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "不支持的请求" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "\"%1%\" 由系统提供,无法擦除" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% 不可安装" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "没有软件源能提供安装的 %2% 所需的 \"%1%\"" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "没有软件源能提供要安装的 %2% 所需的 \"%1%\"" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "无法同时安装 %1% 和 %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "安装的 %1% 与安装的 %3% 所提供的 \"%2%\" 冲突" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "安装的 %1% 与要安装的 %3% 所提供的 \"%2%\" 冲突" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "要安装的 %1% 与安装的 %3% 所提供的 \"%2%\" 冲突" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "要安装的 %1% 与要安装的 %3% 所提供的 \"%2%\" 冲突" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "安装的 %1% 会淘汰安装的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "安装的 %1% 会淘汰要安装的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "要安装的 %1% 会淘汰安装的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "要安装的 %1% 会淘汰要安装的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "安装的 %1% 与其自身所提供的 \"%2%\" 冲突" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "要安装的 %1% 与其自身所提供的 \"%2%\" 冲突" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "安装的 %1% 需要 \"%2%\",但无法满足此要求" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "要安装的 %1% 需要 \"%2%\",但无法满足此要求" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "已删除提供者: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "无法安装的提供者: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "无法安装的提供者: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% 尚未完全集成到 %2% 中。" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "通常情况下,您需要保留 PTF 并选择不安装维护补丁。" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "移除此环境中安装的 %1% 还会移除(而不是替换)包含的 PTF 软件包。" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "应通过调用 \"%1%\" 来移除 PTF。这样将会更新包含的 PTF 软件包,而不会将其移" "除。" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "通常,您需要保留 PTF 并选择取消该操作。" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "已安装的 %1% 阻碍了期望进行的操作。" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "通常来说您会想要保留该暂时性修复并选择取消该操作。" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "移除锁定以允许移除 %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "不安装 %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "保留 %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "移除锁定以允许安装 %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "此请求将破坏您的系统!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "忽略损坏系统的警告" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "不询问就安装提供 %1% 的一个解析项" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "不询问就删除提供 %1% 的所有解析项" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "不安装最新版本的 %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "即使架构较低,仍保留 %1%" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "即使架构较低,仍安装 %1%" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "保留淘汰的 %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "安装来自排除的软件源的 %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "尽管 %1% 已被维护团队撤回,仍予以安装" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "允许安装暂时性修复 %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "尽管 %1% 已列入黑名单,仍予以安装" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "将 %1% 降级到 %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "架构从 %1% 变为 %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "安装 %1%(并更改厂商)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "由供应商 %2% 安装 %1% 代替\n" "由供应商 %4% 安装 %3%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "将 %1% 用 %2% 取代" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "卸载 %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "运行事务后脚本" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "正在运行 %1% 脚本" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "%1% 脚本输出:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "安装已按指示中止。" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " 已执行" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " 执行失败" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s 早已作为 %s 执行了)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " 中止时跳过执行" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "发送更新消息通知出错。" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "新更新消息" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" "接收到信号:\"%1% (%2%)\",为了确保系统一致性,无法取消正在运行的 RPM 事务。" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "由于以下问题执行操作失败:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM 失败: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "从文件 %1% 中导入公钥失败" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "移除公钥 %1% 失败" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "软件包包头未签名!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "软件包数据体未签名!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s 配置文件有变化:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm 已将 %s 另存为 %s,但是无法确定两者的差异" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm 已将 %s 另存为 %s。\n" "以下是前 25 行差异:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm 已将 %s 创建为 %s,但是无法确定两者的差异" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm 已将 %s 创建为 %s。\n" "以下是前 25 行差异:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "额外的 RPM 输出" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "已创建备份 %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "签名正确" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "未知签名类型" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "无法校验签名" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "签名正确,但密钥是非受信的" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "签名公钥不可用" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "文件不存在或无法检查其签名" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "未签署文件" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "永不过期" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "过期日期:%1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "过期日期:%1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(永不过期)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(已过期)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(24 小时内过期)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(%d 天后过期)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "尝试导入尚不存在的密钥 %s 到密钥环 %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "导入密钥失败。" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "删除密钥失败。" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "未找到签名文件 %s" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "“%s”对 %u 属于错误类型,字节校验和“%s”" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "无法打开 pty (%s)。" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "无法打开管道 (%s)。" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "无效的 LDAP URL 查询字符串" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "无效的 LDAP URL 查询参数 '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "无法克隆 URL 对象" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "无效的空 URL 对象引用" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "无法解析 URL 组件" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "历史:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "URL 方案不允许使用 %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "无效的 %s 组件 '%s'" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "无效的 %s 组件" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "不支持解析此 URL 的查询字符串" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "URL 方案是一个必需组件" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "无效的 URL 方案 '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "URL 方案不允许使用用户名" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "URL 方案不允许使用密码" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "URL 方案要求有主机组件" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "URL 方案不允许使用主机组件" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "无效的主机组件 '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "URL 方案不允许使用端口" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "无效的端口组件 '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "URL 方案要求有路径名" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "若存在认证则不允许相对路径" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "编码的字符串包含了一个 NUL 字节" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "无效的参数数组分割的分隔符" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "无效的参数映射分割的分隔符" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "无效的参数数组合并的分隔符" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "命令退出,状态 %d。" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "命令已被信号 %d (%s) 杀死。" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "命令退出,未知错误。" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "子参数无效。" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "无法创建控制管道。" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "无法 chroot 到 '%s' (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "无法 chdir 到 '%s' (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "无法 chdir 到 %s,它在 chroot %s (%s) 中。" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "无法执行 '%s' (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "无法派生 (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "无法执行 '%s',chdir 失败 (%s) 。" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "无法执行 \"%s\",chroot 失败 (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "无法执行 '%s',执行失败 (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "无法执行 '%s',意外错误。" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "未能把 %s 挂载到 %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "卸载 %s 失败" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "文件名错误:%s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "当试图执行动作 '%s' 时,介质没有打开。" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "文件 '%s' 未在介质 '%s' 上找到" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "无法写入文件 '%s'。" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "介质未挂载" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "介质挂载点错误" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "下载(curl) '%s' 时初始化失败" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "系统例外 '%s'(发生于介质 '%s' 上)。" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "路径 '%s'(介质 '%s' 上)并不是一个文件。" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "路径 '%s'(介质 '%s' 上)并不是一个文件夹。" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "异常的 URI" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "URI 中主机名为空" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "URI 中文件系统为空" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "URI 中目标为空" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "不支持 '%s' 中的 URI 方案。" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "介质不支持此操作" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "下载 (curl) '%s' 出错:\n" "错误代码:%s\n" "错误消息:%s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "为 '%s' 设置下载 (curl) 选项时出错:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "介质来源 '%s' 不包含期望的介质" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "介质 '%s' 正被另一个实例使用" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "无法弹出任何介质" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "无法弹出介质 '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "访问 '%s' 的准入请求被拒绝。" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "访问 '%s' 时超时。" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "下载到的数据超出了预期文件大小 '%s'/'%s'。" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "位置 '%s' 暂时无法访问。" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL 证书问题,请校验 '%s' 的 CA 证书。" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "没有可供挂接媒体的免费资源。" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "不支持 HTTP 认证方法 '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "下载 (curl) \"%s\" 时发生错误:\n" "错误代码:%s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "下载 (curl) \"%s\" 时发生错误:\n" "无法检索 HTTP 响应\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "是" #: zypp-tui/Table.cc:32 msgid "No" msgstr "否" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "备注:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "警告:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "错误:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "完毕" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "注意" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "错误" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "警告: " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "正在检索:" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "正在启动" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "未找到" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "此提示无可用帮助。" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "此选项无可用帮助" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "显示全部选项" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "是" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "否" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "在指定 URL 未找到有效元数据" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "正在执行 %%posttrans 脚本“%1%”" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "正在执行 %p osttrans 脚本" #~ msgid "Package is not signed!" #~ msgstr "未签署包!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s 不属于发行版升级源" #~ msgid "%s has inferior architecture" #~ msgstr "%s 架构不对应" #~ msgid "problem with installed package %s" #~ msgstr "已安装的 %s 软件包有问题" #~ msgid "nothing provides requested %s" #~ msgstr "没有什么能提供所需的 %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "您启用了全部请求的软件源了吗?" #~ msgid "package %s does not exist" #~ msgstr "软件包 %s 不存在" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s 由系统提供,无法擦除" #~ msgid "%s is not installable" #~ msgstr "%s 不可安装" #~ msgid "nothing provides %s needed by %s" #~ msgstr "没有什么能提供 %s,而它为 %s 所需" #~ msgid "cannot install both %s and %s" #~ msgstr "无法同时安装 %s 和 %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s 与 %s 冲突,后者由 %s 提供" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s 淘汰了 %s,后者由 %s 提供" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "已安装的 %s 淘汰了 %s,后者由 %s 提供" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "可解析项 %s 与自身提供的 %s 冲突" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s 需要 %s,但无法满足此需求" #~ msgid "remove lock to allow removal of %s" #~ msgstr "移除锁定以允许移除 %s" #~ msgid "do not install %s" #~ msgstr "不安装 %s" #~ msgid "keep %s" #~ msgstr "保留 %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "移除锁定以允许安装 %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "不询问就安装一个提供 %s 的解析项" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "不询问就删除全部提供 %s 的解析项" #~ msgid "do not install most recent version of %s" #~ msgstr "不安装最新版本的 %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "保留 %s,即使架构不对应" #~ msgid "install %s despite the inferior architecture" #~ msgstr "尽管架构不对应仍安装 %s" #~ msgid "keep obsolete %s" #~ msgstr "保留已淘汰的 %s" #~ msgid "install %s from excluded repository" #~ msgstr "从排除的软件源安装 %s" #~ msgid "downgrade of %s to %s" #~ msgstr "降级 %s 到 %s" #~ msgid "architecture change of %s to %s" #~ msgstr "架构从 %s 变更到 %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "安装 %s(包括厂商变更)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "将 %s 用 %s 取代" #~ msgid "deinstallation of %s" #~ msgstr "卸载 %s" #~ msgid "Can't open lock file: %s" #~ msgstr "无法打开锁定文件:%s" #~ msgid "This action is being run by another program already." #~ msgstr "此动作正在由另一个程序运行着。" #~ msgid "Hal Exception" #~ msgstr "Hal 例外" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "对不起,本版 libzypp 没有编译 HAL 支持。" #~ msgid "HalContext not connected" #~ msgstr "HalContext 未连接" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive 未初始化" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume 未初始化" #~ msgid "Unable to create dbus connection" #~ msgstr "无法创建 dbus 连接" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new:无法创建 libhal 环境" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection:无法设置 dbus 连接" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "无法初始化 HAL 环境 - hald 未运行?" #~ msgid "Not a CDROM drive" #~ msgstr "不是 CDROM 驱动器" #~ msgid "Can't initialize mutex attributes" #~ msgstr "无法初始化 mutex 属性" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "无法设置递归的 mutex 属性" #~ msgid "Can't initialize recursive mutex" #~ msgstr "无法初始化递归的 mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "无法获取 mutex 锁定" #~ msgid "Can't release the mutex lock" #~ msgstr "无法释放 mutex 锁定" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "从文件 %s 中导入公钥失败:%s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "移除公钥 %s 失败:%s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "找不到可用 loop 设备以挂载来自 '%s' 的映像文件" #~ msgid "do not keep %s installed" #~ msgstr "不保留 %s" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "无法创建公共密钥 %s, 该密钥来自 %s 钥匙环,准备创建到 %s 文件" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "下载 (Metalink curl) '%s' 时初始化失败" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "下载 (metalink curl) '%s' 出错:\n" #~ "错误代码:%s\n" #~ "错误消息:%s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "下载在 %d%% 中断" #~ msgid "Download interrupted by user" #~ msgstr "下载被用户中断" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "为 '%s' 设置下载 (metalink curl) 选项时出错:" #~ msgid "Failed to download %s from %s" #~ msgstr "下载 %s 从 %s 时失败" libzypp-17.36.5/po/zh_TW.po000066400000000000000000003625731476576476200154470ustar00rootroot00000000000000# translation of zypp.po to Chinese Traditional # Chinese message file for YaST2 (@memory@). -*- coding: utf-8 -*- # Copyright (C) 2005 SUSE Linux Products GmbH. # Copyright (C) 2002 SuSE Linux AG. # Copyright (C) 2001 SuSE GmbH. # swyear , 2008, 2009, 2011. # Ray Chen , 2012. # Ramax Lo , 2014. msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2024-04-30 05:43+0000\n" "Last-Translator: Grace Yu \n" "Language-Team: Chinese (Taiwan) \n" "Language: zh_TW\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: Weblate 4.9.1\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "未知國家:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "沒有程式碼" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "安道爾" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "阿拉伯聯合大公國" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "阿富汗" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "安地卡及巴布達" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "安圭拉島" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "阿爾巴尼亞" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "亞美尼亞" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "荷屬安第列斯群島" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "安哥拉" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "南極洲" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "阿根廷" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "美屬薩摩亞" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "奧地利" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "澳大利亞" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "阿魯巴" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "愛蘭群島" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "亞塞拜然" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "波士尼亞與赫塞哥維納" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "巴貝多" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "孟加拉共和國" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "比利時" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "布基那法索" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "保加利亞" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "巴林" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "蒲隆地" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "貝南" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "百慕達" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "汶萊" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "玻利維亞" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "巴西" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "巴哈馬" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "不丹" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "布維特島" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "波紮那" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "白俄羅斯" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "貝里斯" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "加拿大" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "科科斯群島" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "剛果" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "中非共和國" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "瑞士" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "象牙海岸" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "庫克群島" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "智利" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "喀麥隆" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "中國" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "哥倫比亞" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "哥斯大黎加" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "古巴" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "維德角" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "聖誕島" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "塞普勒斯" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "捷克共和國" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "德國" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "吉布地" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "丹麥" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "多米尼克" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "多明尼加共和國" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "阿爾及利亞" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "厄瓜多爾" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "愛沙尼亞" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "埃及" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "西撒哈拉" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "厄立特里亞" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "西班牙" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "衣索比亞" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "芬蘭" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "斐濟" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "英屬福克蘭群島 (馬爾維納斯群島)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "密克羅尼西亞聯邦" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "法羅群島" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "法國" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "法屬美特羅波利坦" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "加彭" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "英國" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "格瑞納達" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "喬治亞" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "法屬圭亞納" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "格恩西" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "迦納" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "直布羅陀" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "格林蘭島" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "甘比亞" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "幾內亞" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "哥德洛普島 (法屬)" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "赤道幾內亞" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "希臘" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "南喬治亞及南三明治群島" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "瓜地馬拉" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "關島" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "幾內亞比紹" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "蓋亞那" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "香港" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "赫德及麥當勞群島" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "宏都拉斯" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "克羅埃西亞共和國" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "海地" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "匈牙利" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "印尼" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "愛爾蘭" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "以色列" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "馬恩島" #: zypp/CountryCode.cc:261 msgid "India" msgstr "印度" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "英屬印度洋領土" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "伊拉克" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "伊朗" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "冰島" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "義大利" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "澤西" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "牙買加" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "約旦" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "日本" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "肯亞" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "吉爾吉斯" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "柬埔寨" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "吉里巴斯共和國" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "葛摩" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "聖克里斯多福及尼維斯" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "北韓" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "南韓" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "科威特" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "開曼群島" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "哈薩克" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "寮人民民主共和國" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "黎巴嫩" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "聖露西亞" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "列支敦斯登" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "斯里蘭卡" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "賴比瑞亞" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "賴索托" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "立陶宛" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "盧森堡" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "拉脫維亞" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "利比亞" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "摩洛哥" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "摩納哥" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "摩爾多瓦" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "芒特尼格羅共和國" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "聖馬丁" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "馬達加斯加" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "馬紹爾群島" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "馬其頓" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "馬利" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "緬甸" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "蒙古" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "澳門" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "北馬里安納群島" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "馬丁尼克" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "茅利塔尼亞" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "蒙特色拉特島" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "馬爾他" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "模里西斯" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "馬爾地夫" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "馬拉威" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "墨西哥" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "馬來西亞" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "莫三比克" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "那米比亞" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "新喀里多尼亞群島" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "尼日" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "諾福克島" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "奈及利亞" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "尼加拉瓜" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "荷蘭" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "挪威" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "尼泊爾" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "諾魯" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "紐威島" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "紐西蘭" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "阿曼" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "巴拿馬" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "祕魯" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "法屬波里尼西亞" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "巴布亞新幾內亞" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "菲律賓" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "巴基斯坦" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "波蘭" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "聖匹島" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "皮特康" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "波多黎各" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "巴勒斯坦領土" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "葡萄牙" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "帛琉" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "巴拉圭" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "卡達" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "留尼旺島" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "羅馬尼亞" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "塞爾維亞" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "俄羅斯聯邦" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "盧安達" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "沙烏地阿拉伯" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "所羅門群島" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "塞席爾群島" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "蘇丹" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "瑞典" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "新加坡" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "聖赫勒拿島" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "斯洛維尼亞共和國" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "冷岸及央棉群島" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "斯洛伐克" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "獅子山" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "聖馬力諾" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "塞內加爾" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "索馬利亞" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "蘇利南" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "聖多美普林西比" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "薩爾瓦多" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "敘利亞" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "史瓦濟蘭" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "土克斯及開科斯群島" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "查德" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "法國南方領土" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "多哥" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "泰國" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "塔吉克" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "托克勞群島" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "土庫曼" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "突尼西亞" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "東加" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "東帝汶" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "土耳其" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "千里達托貝哥" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "吐瓦魯" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "台灣" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "坦尚尼亞" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "烏克蘭" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "烏干達" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "美國外島" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "美國" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "烏拉圭" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "烏茲別克" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "羅馬教庭 (梵蒂岡)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "聖文森及格瑞那丁" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "委內瑞拉" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "英屬維爾京群島" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "美屬維爾京群島" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "越南" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "萬那杜" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "瓦利斯及福杜納群島" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "薩摩亞" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "葉門" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "馬約特島" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "南非" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "尚比亞" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "辛巴威" #: zypp/Dep.cc:96 msgid "Provides" msgstr "提供" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "先決條件" #: zypp/Dep.cc:98 msgid "Requires" msgstr "需要" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "衝突" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "汰換" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "建議" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "推薦" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "增強" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "補充" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "未知的語言:" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "阿法爾語" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "阿布哈西亞語" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "亞齊語" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "阿科利語" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "阿當梅語" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "阿迪格語" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "非洲-亞洲 (其他)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "阿弗裡希利語" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "南非荷蘭語" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "艾奴語" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "阿坎語" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "阿卡德語" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "阿爾巴尼亞語" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "阿留申語" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "亞爾岡京語言" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "南方阿爾泰語" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "阿姆哈拉語" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "英語,舊 (大約450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "阿帕契語" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "阿拉伯語" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "阿拉姆語" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "阿拉貢語" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "亞美尼亞語" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "阿勞坎語" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "阿拉帕霍語" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "人為的 (其他)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "阿拉瓦克語" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "阿薩姆語" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "阿斯圖里亞語" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "阿薩巴斯卡語" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "澳大利亞語" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "阿瓦爾語" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "阿維斯陀語" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "阿沃提語" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "艾馬拉語" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "亞塞拜然語" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "班達語" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "巴米累克語" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "巴什克爾語" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "巴路奇語" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "班巴拉語" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "巴里語" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "巴斯克語" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "巴沙語" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "波羅的語 (其他)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "白廈語" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "白俄羅斯語" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "曼巴語" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "孟加拉語" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "柏柏爾語 (其他)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "波布里語" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "比哈爾語" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "比口語" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "比尼語" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "比斯拉馬語" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "西克西卡" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "班圖語 (其他)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "波士尼亞語" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "布拉吉語" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "不列塔尼語" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "巴塔克語 (印尼)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "白雅特語" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "布吉斯語" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "保加利亞語" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "緬甸語" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "伯林語" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "凱多語" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "中美洲印地安 (其他)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "加勒比語" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "嘉泰羅尼亞語" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "高加索語 (其他)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "宿霧語" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "賽爾特語 (其他)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "查摩洛語" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "奇布查語" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "車臣語" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "察合臺語" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "中文" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "夏克島語" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "麻里語" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "契奴克語" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "喬克托語" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "奇帕維安語" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "卻洛奇文" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "教會斯拉夫語" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "楚瓦士語" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "薜安語" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "占米克語" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "科普特語" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "康瓦耳語" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "科西嘉語" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "克瑞奧里語與皮欽語,英國型 (其他)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "克瑞奧里語與皮欽語,法國型 (其他)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "克瑞奧里語與皮欽語,葡萄牙型 (其他)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "克里語" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "克裡米亞韃靼語" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "克瑞奧里語與皮欽語 (其他)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "卡舒布語" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "庫希迪克語 (其他)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "捷克語" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "達科他語" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "丹麥語" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "達爾格瓦語" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "達雅克語" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "德拉瓦語" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "斯拉夫語 (阿薩巴斯卡)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "多格里布語" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "丁卡語" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "迪韋西語" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "多格里語" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "達羅毗荼語 (其他)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "下文德語" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "杜阿拉語" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "荷蘭語,中古世紀 (大約1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "荷蘭語" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "迪尤拉語" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "宗卡語" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "艾非克語" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "埃及語 (古代)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "艾卡朱克語" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "艾拉米特語" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "英語" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "英文,中古世紀 (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "世界語" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "愛沙尼亞語" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "埃維語" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "埃翁多語" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "芳族語" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "法羅語" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "芳蒂語" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "斐濟語" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "菲律賓語" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "芬蘭語" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "芬匈語 (其他)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "豐語" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "法語" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "法語,中古世紀 (大約1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "法語,舊 (842-大約1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "弗利然語" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "富拉語" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "弗留利語" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "咖語" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "咖幼語" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "格巴亞語" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "日耳曼語 (其他)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "喬治亞文" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "德語" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "吉茲語" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "吉伯特語" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "蓋爾語" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "愛爾蘭語" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "加利西亞語" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "曼島語" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "德語,中古世紀 (大約1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "德語,古代 (大約750-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "岡德語" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "哥倫打洛語" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "哥德語" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "格列博語" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "希臘語,古代 (至 1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "希臘語,現代 (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "瓜拉尼語" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "古吉拉特文" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "哥威迅語" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "海達語" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "海提語" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "豪薩語" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "夏威夷語" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "希伯來文" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "赫雷羅語" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "希利蓋農語" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "赫馬查理語" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "北印度語" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "西台語" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "赫蒙語" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "希裡莫圖語" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "高地索布語" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "匈牙利語" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "胡帕語" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "伊班語" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "伊博語" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "冰島語" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "伊多語" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "西川易語" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "伊喬語" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "伊奴伊特語" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "人工國際語" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "伊洛幹諾語" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "英特林瓜語 (國際輔助語)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "印度語 (其他)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "印尼語" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "印歐語 (其他)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "印古什語" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "因努皮雅克語" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "伊朗語 (其他)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "伊洛古歐安語" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "義大利語" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "爪哇語" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "邏輯語" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "日語" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "猶太-波斯語" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "猶太-阿拉伯語" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "卡拉卡爾帕克語" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "卡拜爾語" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "卡欽語" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "卡拉利蘇特語" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "卡姆帕語" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "坎那達文" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "克倫語" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "喀什米爾語" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "卡努里語" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "卡威語" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "哈薩克語" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "卡巴爾達語" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "卡西語" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "科依桑語 (其他)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "高棉文" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "和闐語" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "吉庫猶語" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "金雅爾王達語" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "吉爾吉斯語" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "金本杜語" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "剛卡尼語" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "科密語" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "剛果語" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "韓語" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "科西嘉語" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "克帕勒語" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "卡拉契巴卡語" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "克魯語" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "庫魯科語" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "夸尼雅馬語" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "庫密克語" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "庫德語" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "庫特內語" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "拉第諾語" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "拉亨達語" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "蘭姆巴語" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "寮文" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "拉丁文" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "拉脫維亞語" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "雷格西安語" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "林柏格安語" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "林加拉語" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "立陶宛語" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "蒙古語" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "羅利語" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "盧森堡語" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "盧巴盧路拉語" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "盧巴卡丹咖語" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "干達語" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "盧伊塞諾語" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "隆達語" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "盧奧語 (肯亞與坦桑尼亞)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "盧夏語" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "馬其頓語" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "馬都拉語" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "馬加伊語" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "馬紹爾語" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "彌濕羅語" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "滿加撒語" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "馬來亞拉姆文" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "曼丁果語" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "毛利語" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "南島語系 (其他)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "馬拉地語" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "馬塞語" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "馬來語" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "莫克夏語" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "門德語" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "門迪語" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "愛爾蘭語,中古世紀 (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "密克馬克語" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "米南卡保語" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "其他語言" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "孟-高棉語 (其他)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "馬拉加西語" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "馬爾他語" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "滿族語" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "曼利普裏語" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "馬諾伯語" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "摩哈克語" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "摩爾達維亞語" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "蒙古文" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "莫西語" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "多重語言" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "蒙達語" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "克里克語" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "米蘭德斯語" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "馬爾瓦爾語" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "瑪雅語" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "愛斯亞語" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "那瓦特語" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "北美印地安" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "紐波利頓語" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "納瓦伙語" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "南恩德貝勒語" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "北恩德貝勒語" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "恩敦加語" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "低地德語" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "尼泊爾語" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "尼伯爾跋娑語" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "尼亞斯語" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "尼日-科爾多凡語 (其他)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "紐埃語" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "挪威耐諾斯克語" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "挪威巴克摩語" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "諾蓋語" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "古諾爾斯語" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "挪威語" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "北索索語" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "努比亞語" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "尼瓦爾語" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "齊切瓦語" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "尼揚韋齊語" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "尼揚科萊語" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "尼奧羅語" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "恩濟馬語" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "奧克騰語 (1500 之後)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "奧吉布瓦語" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "歐利亞文" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "歐羅摩語" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "歐塞奇語" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "奧塞梯語" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "土耳其,鄂圖曼 (1500-1928)" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "鄂圖曼語" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "巴布亞語 (其他)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "邦卡西南語" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "巴勒維語" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "邦幫咖語" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "旁遮普語" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "帕皮阿門托語" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "帛琉語" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "古波斯語 (大約西元前 600-400)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "波斯語" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "菲律賓語 (其他)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "腓尼基語" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "巴利語" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "波蘭語" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "波那貝語" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "葡萄牙語" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "普拉克里特語" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "古普羅凡斯語 (至 1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "普什圖語" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "蓋楚瓦語" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "拉賈斯坦語" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "拉巴怒伊語" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "拉羅通加語" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "羅曼語 (其他)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "里托羅曼語" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "羅曼尼語" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "羅馬尼亞語" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "隆迪語" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "俄語" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "桑達韋語" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "桑戈語" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "雅庫特語" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "南美洲印地安 (其他)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "薩利什語" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "薩瑪利亞語" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "梵語" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "沙沙克語" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "山塔利語" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "塞爾維亞語" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "西西里語" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "蘇格蘭語" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "克羅埃西亞語" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "瑟爾卡普語" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "閃語 (其他)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "古愛爾蘭語 (至 900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "符號語言" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "撣語" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "希達摩語" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "錫蘭文" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "蘇語語系" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "漢藏語 (其他)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "斯拉夫語 (其他)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "斯洛伐克語" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "斯洛維尼亞語" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "南薩米語" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "北薩米語" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "薩米語 (其他)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "魯爾薩米語" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "伊納里薩米語" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "薩摩亞語" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "斯克特薩米語" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "紹納語" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "信德語" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "索寧克語" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "粟特語" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "索馬利語" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "桑海語" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "南索索語" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "西班牙語" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "薩丁尼亞語" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "塞雷爾語" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "尼羅--撒哈拉語 (其他)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "斯瓦特語" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "蘇庫馬語" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "巽他語" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "蘇蘇語" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "蘇美語" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "斯華西里語" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "瑞典語" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "敘利亞文" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "塔希提語" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "泰語 (其他)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "坦米爾文" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "韃靼語" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "特拉古文" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "堤姆奈語" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "特崙諾語" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "德頓語" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "塔吉克語" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "塔加拉族語" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "泰文" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "西藏文" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "泰格瑞語" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "提格利尼亞語" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "提夫語" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "克林貢語" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "特林吉特語" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "泰瑪歇克語" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "東加語 (尼亞沙)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "東加語 (東加群島)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "托比辛語" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "欽西安語" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "班圖語" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "聰加語" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "土庫曼語" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "通布卡語" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "圖皮語" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "土耳其語" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "阿爾泰語 (其他)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "契維語" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "圖瓦尼安語" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "烏德穆爾特語" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "烏嘎利特語" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "維吾爾語" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "烏克蘭語" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "姆崩杜語" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "未確定的" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "烏都語" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "烏茲別克語" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "埃語" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "溫達語" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "越南語" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "沃拉普克語" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "沃提克語" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "瓦卡時語" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "瓦拉莫語" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "瓦瑞語" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "瓦紹語" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "威爾斯語" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "索布語" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "瓦隆語" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "沃洛夫語" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "卡爾梅克語" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "科薩語" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "瑤語" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "雅蒲語" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "意第緒語" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "優魯巴語" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "尤皮克語" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "薩波特克語" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "澤納加語" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "壯語" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "贊德語" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "祖魯語" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "祖尼語" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "將執行以下操作:" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "不明的" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "不支援" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "層級 1" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "層級 2" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "層級 3" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "需要額外的使用者授權" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "已停產且已被另一個套件取代" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "不適用" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "支援的等級未指定" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "此廠商不提供支援。" #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" "問題判斷,意指提供相依性資訊、安裝協助、用法支援、持續維護及基本錯誤排除的技" "術支援。層級 1 支援並不提供產品缺失錯誤的更正。" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" "問題隔離,意指複製客戶問題、隔離問題區域並提供層級 1 支援無法解決的方案的技術" "支援。" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" "問題解決,意指透過工程方法解決層級 2 支援所確認的產品缺陷來解決複雜問題的技術" "支援。" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "要取得支援,需要額外的使用者授權。" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "該套件已停產,一個使用其他名稱的新套件已將其取代。" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "未知的支援選項。 描述不適用" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" "系統管理已被 pid 為 %d (%s) 的應用程式鎖定。\n" "請關閉此應用程式,然後重試。" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "未知的符合模式 '%s'" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "未知的符合模式 '%s' (針對樣式 '%s')" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "無效的正規表示法 '%s'︰regcomp 傳回 %d" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "無效的正規表示法 '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "%s 需要驗證" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "將重試..." #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "已嘗試 %1% 次,即將放棄。" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "造訪 SUSE Customer Center 以檢查您的註冊是否有效以及是否過期。" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "請造訪 Novell Customer Center,檢查您的註冊是否有效且是否未過期。" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "建立裝載點:無法找到可寫入的目錄以建立裝載點" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "請先安裝套件 'lsof'。" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "無法建立中繼資料快取目錄。" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "嘗試自 '%s' 讀取時發生錯誤" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "無法建立 %s" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "快取套件庫失敗 (%d)。" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "正在建立套件庫 '%s' 的快取" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "無法在 %s 建立快取 - 無寫入權限。" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "無法處理的套件庫類型" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "正在新增套件庫 '%s'" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "'%s' 處的套件庫檔案名稱無效" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "無法開啟檔案 '%s' 來寫入。" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "由 '%s' 讀取時發生未知錯誤" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "無法讀取套件庫目錄 '%1%'︰權限遭拒" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "無法讀取目錄 '%s'" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "無法讀取套件庫檔案 '%1%'︰權限遭拒" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "正在移除套件庫 '%s'" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "無法找到套件庫儲存的位置。" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "無法刪除 '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "無法找到服務儲存的位置。" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "未知的服務 '%1%':正在移除落單的服務儲存庫 '%2%'" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "套件庫別名不能以點開始。" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "服務的別名不能以點開始。" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "檔案 %s 無摘要。" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "未知摘要 %s (檔案 %s)。" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "檔案 '%s' 的摘要驗證失敗" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "檔案 '%s' 未經簽署,要繼續嗎?" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "檔案 '%s' (來自儲存庫 '%s') 未經簽署,要繼續嗎?" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "您想要拒絕該金鑰、暫時信任還是永遠信任該金鑰?" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "金鑰名稱:%1%" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "從儲存庫 \"%2%\" 中收到 %1% 個新的套件簽署金鑰:" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "檔案 '%1%' 的簽名驗證失敗。" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "對儲存庫 '%2%' 中的檔案 '%1%' 的簽名驗證失敗。" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "要繼續嗎?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "檔案 '%s' 經未知金鑰 '%s' 簽署。要繼續嗎?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "檔案 '%s' (來自儲存庫 '%s') 經未知金鑰 '%s' 簽署。要繼續嗎?" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "套件庫 %1% 未定義額外的 'gpgkey=' URL。" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "尋找套件庫 %2% 中的 gpg 金鑰 ID %1%。" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "尋找快取 %2% 中的 gpg 金鑰 ID %1%。" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "需要的屬性 '%s' 遺失。" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "需要 '%s' 及 '%s' 屬性或兩者之一。" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "簽章驗證失敗" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "套件 %s 可能在傳輸期間已毀損。是否要重試取回操作?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "無法提供套件 %s。是否要重試取回操作?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "applydeltarpm 檢查失敗。" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "applydeltarpm 失敗。" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "服務外掛不支援屬性的修改。" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "檔案 '%s' 無法由套件庫 '%s' 提供" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "套件庫中沒有 url。" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "檔案 \"%3%\" 所識別的媒體 %1%/%2% 內容應為:" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "檔案 %1%\n" " (來自以下套件\n" " %2%)\n" " 與來自下列套件的檔案相衝突\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "檔案 %1%\n" " (來自以下套件\n" " %2%)\n" " 與來自下列安裝的檔案相衝突\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" "檔案 %1%\n" " (來自以下安裝\n" " %2%)\n" " 與來自下列套件的檔案相衝突\n" " %3%" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" "檔案 %1%\n" " (來自以下安裝\n" " %2%)\n" " 與來自下列安裝的檔案相衝突\n" " %3%" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "檔案 %1%\n" " (來自以下套件\n" " %2%)\n" " 與下列檔案相衝突\n" " %3%\n" " (來自以下套件\n" " %4%)" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "檔案 %1%\n" " (來自以下套件\n" " %2%)\n" " 與下列檔案相衝突\n" " %3%\n" " (來自以下安裝\n" " %4%)" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" "檔案 %1%\n" " (來自以下安裝\n" " %2%)\n" " 與下列檔案發生衝突\n" " %3%\n" " (來自以下套件\n" " %4%)" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" "檔案 %1%\n" " (來自以下的安裝\n" " %2%)\n" " 與下列檔案發生衝突\n" " %3%\n" " (來自以下的安裝\n" " %4%)" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "無法建立 sat-pool。" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "藉由忽略它的某些相依性以破壞 %s" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "一般忽略某些相依性" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "安裝的 %1% 不屬於版本升級套件庫,必須將其取代" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "要安裝的 %1% 不屬於版本升級套件庫" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "安裝的 %1% 的架構較低" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "要安裝的 %1% 的架構較低" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "安裝的 %1% 有問題" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "衝突的要求" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "一些相依性問題" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "沒有套件庫能提供所申請的 \"%1%\"" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "您是否啟用了全部所需的套件庫?" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "申請的套件 %1% 不存在" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "不支援的要求" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "\"%1%\" 由系統提供,無法去除" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "%1% 不可安裝" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "沒有套件庫能提供安裝的 %2% 所需的 \"%1%\"" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "沒有套件庫能提供要安裝的 %2% 所需的 \"%1%\"" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "無法同時安裝 %1% 和 %2%" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "安裝的 %1% 與安裝的 %3% 所提供的 \"%2%\" 衝突" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "安裝的 %1% 與要安裝的 %3% 所提供的 \"%2%\" 衝突" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "要安裝的 %1% 與安裝的 %3% 所提供的 \"%2%\" 衝突" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "要安裝的 %1% 與要安裝的 %3% 所提供的 \"%2%\" 衝突" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "安裝的 %1% 會汰換安裝的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "安裝的 %1% 會汰換要安裝的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "要安裝的 %1% 會汰換安裝的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "要安裝的 %1% 會汰換要安裝的 %3% 所提供的 \"%2%\"" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "安裝的 %1% 與其自身所提供的 \"%2%\" 衝突" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "要安裝的 %1% 與其自身所提供的 \"%2%\" 衝突" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "安裝的 %1% 需要 \"%2%\",但無法符合此要求" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "要安裝的 %1% 需要 \"%2%\",但無法符合此要求" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "已刪除的提供者: " #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" "\n" "無法安裝的提供者: " #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "無法安裝的提供者: " #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "%1% 尚未完全整合到 %2% 中。" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "通常情況下,您需要保留 PTF 並選擇不安裝維護修補程式。" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "移除此網路位置中安裝的 %1% 還會移除 (而不是取代) 包含的 PTF 套件。" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" "應透過呼叫 \"%1%\" 來移除 PTF。這樣將會更新包含的 PTF 套件,而不會將其移除。" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "通常,您需要保留 PTF 並選擇取消該動作。" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "安裝的 %1% 封鎖了所需的動作。" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "通常情況下,您需要保留 PTF 並選擇取消動作。" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "移除鎖定以允許移除 %1%" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "不安裝 %1%" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "保留 %1%" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "移除鎖定以允許安裝 %1%" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "此要求將會破壞您的系統!" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "忽略損毀系統的警告" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "不詢問即安裝提供 %1% 的解決方案" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "不詢問即刪除提供 %1% 的所有解決方案" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "不安裝最新版本的 %1%" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "即使架構較低,仍保留 %1%" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "即使架構較低,仍安裝 %1%" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "保留汰換的 %1%" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "安裝來自已排除套件庫的 %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "儘管 %1% 已收回,仍予以安裝" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "允許安裝 PTF %1%" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "儘管 %1% 已列入黑名單,仍予以安裝" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "將 %1% 降級到 %2%" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "架構從 %1% 變更為 %2%" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" "安裝 %1% (並變更廠商)\n" " %2% --> %3%" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" "安裝來自廠商 %2% 的 %1%\n" " 取代廠商 %4% 的 %3%" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "以 %2% 取代 %1%" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "解除安裝 %1%" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "執行交易後程序檔" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "正在執行 %1% 程序檔" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "%1% 程序檔輸出:" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "安裝已如指示中止。" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr " 已執行" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr " 執行失敗" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "%s 已作為 %s 執行)" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr " 中止時跳過執行" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "發送更新訊息提醒失敗。" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "新的更新提醒" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "接收到訊號:\"%1% (%2%)\",為確保系統一致性,無法取消執行中 RPM 交易。" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "由於出現以下問題,執行交易失敗:" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "RPM 失敗: " #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "從檔案 %1% 輸入公用金鑰失敗" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "移除公用金鑰 %1% 失敗" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "未簽署套件標頭!" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "未簽署套件封包內容!" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "%s 的已變更組態檔:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "rpm 已將 %s 儲存為 %s,但看不出差異" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm 已將 %s 儲存為 %s。\n" "這是前 25 行差異:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "rpm 已將 %s 建立為 %s,但看不出差異" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "rpm 已將 %s 建立為 %s。\n" "這是前 25 行差異:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "其他 rpm 輸出" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "已建立備份 %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "簽章驗證正確" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "未知的簽章類型" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "簽章無法驗證" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "簽章驗證正確,然而金鑰是不被信任的" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "簽章用的公開金鑰不存在" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "檔案不存在或是簽章無法驗證" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "檔案未簽章" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "不過期" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "過期日期:%1%" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "過期日期:%1%" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "(未過期)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "(已過期)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "(在 24 小時內過期)" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "(在 %d 天內過期)" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "嘗試將不存在的金鑰 %s 匯入金鑰圈 %s" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "輸入金鑰失敗。" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "刪除金鑰失敗。" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "找不到簽章檔 %s" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "可疑的類型 '%s' (%u 位元組檢查總數 '%s')" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "無法開啟 pty (%s)。" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "無法開啟管線 (%s)。" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "無效的 LDAP URL 查詢字串" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "無效的 LDAP URL 查詢參數「%s」" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "無法複製 Url 物件" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "無效的空白 Url 物件參照" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "無法剖析 Url 元件" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "歷史記錄:" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Url 規劃不允許 %s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "無效的 %s 元件「%s」" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "無效的 %s 元件" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "此 URL 不支援查詢字串剖析" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Url 規劃為必要元件" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "無效的 Url 規劃「%s」" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Url 規劃不允許使用者名稱" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Url 規劃不允許密碼" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Url 規劃中必須要有主機元件" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Url 規劃不允許主機元件" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "無效的主機元件「%s」" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Url 規劃不允許連接埠" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "無效的連接埠元件 '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Url 規劃必須要有路徑名稱" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "如果授權存在,則不允許相對路徑" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "編碼字串包含 NUL 位元組" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "無效的參數陣列分割分隔符號字元" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "無效的參數映射分割分隔符號字元" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "無效的參數陣列加入分隔符號字元" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "指令跳出,狀態 %d。" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "指令被信號 %d (%s) 中止。" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "因未知錯誤指令跳出。" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "指定了無效的衍生引數。" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "無法建立控制管線。" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "無法 chroot 到 '%s' (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "無法切換目錄到 '%s' (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "無法切換目錄到 '%s' (在 chroot '%s' 中) (%s)。" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "無法執行 '%s' (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "無法 fork (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "無法執行 \"%s\",chdir 失敗 (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "無法執行 \"%s\",chroot 失敗 (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "無法執行 \"%s\",exec 失敗 (%s)。" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "無法執行 \"%s\",發生非預期的錯誤。" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "無法將 %s 載掛到 %s" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "卸載 %s 失敗" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "無效的檔案名稱︰%s" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "嘗試執行動作 '%s' 時未開啟媒體。" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "檔案 '%s' 無法在媒體 '%s' 中找到" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "無法寫入檔案 '%s'。" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "媒體未加入" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "無效的媒體附載點" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "'%s' 下載 (curl) 初始化失敗" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "發生系統例外 '%s' (在媒體 '%s' 上)。" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "路徑「%s」(媒體「%s」上) 不是檔案。" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "路徑 '%s' (媒體 '%s' 上) 不是目錄。" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "格式錯誤的位址" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "位址中的主機名稱為空" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "位址中的檔案系統為空" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "位址中的目標為空" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "'%s' 中存在不受支援的位址規劃。" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "媒體不支援此操作" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" "'%s' 下載 (curl) 錯誤:\n" "錯誤碼:%s\n" "錯誤訊息:%s\n" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "為 '%s' 設定下載 (curl) 選項時發生錯誤:" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "媒體來源 '%s' 不包含所需的媒體" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "媒體 '%s' 正被其他例項使用" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "無法退出任何媒體" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "無法退出媒體 '%s'" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "存取 '%s' 的權限被拒絕。" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "存取 '%s' 時超出限定時間。" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "下載到的資料超出了預期檔案大小 %s/%s。" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "位置 '%s' 暫時無法存取。" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr " SSL 憑證問題,驗證 '%s' 的 CA 憑證是否正確。" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "沒有可供連接媒體的免費資源。" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "不支援的 HTTP 驗證方式 '%s'" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" "下載 (curl) \"%s\" 時發生錯誤:\n" "錯誤代碼:%s\n" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" "下載 (curl) \"%s\" 時發生錯誤:\n" "無法擷取 HTTP 回應\n" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "是" #: zypp-tui/Table.cc:32 msgid "No" msgstr "否" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "注意:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "警告:" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "錯誤:" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "完成" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "注意" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "錯誤" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "警告︰ " #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "正在取回︰" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "正在啟動" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "找不到" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "此提示沒有可用說明。" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "此選項沒有說明訊息" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "顯示所有選項" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "是" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "否" #~ msgid "Valid metadata not found at specified URL" #~ msgid_plural "Valid metadata not found at specified URLs" #~ msgstr[0] "在指定的 URL 中找不到有效的中繼資訊" #, boost-format #~ msgid "Executing %%posttrans script '%1%'" #~ msgstr "正在執行 %%posttrans 程序檔「%1%」" #, c-format, boost-format #~ msgid "Executing %posttrans scripts" #~ msgstr "正在執行 %p osttrans 程序檔" #~ msgid "Package is not signed!" #~ msgstr "套件未簽章!" #~ msgid "%s does not belong to a distupgrade repository" #~ msgstr "%s 不屬於版本升級套件庫" #~ msgid "%s has inferior architecture" #~ msgstr "%s 有次要架構" #~ msgid "problem with installed package %s" #~ msgstr "已安裝的套件 %s 發生問題" #~ msgid "nothing provides requested %s" #~ msgstr "無法提供所需的 %s" #~ msgid "Have you enabled all requested repositories?" #~ msgstr "是否已啟用所有需要的套件庫?" #~ msgid "package %s does not exist" #~ msgstr "套件 %s 不存在" #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s 由系統提供,無法清除" #~ msgid "%s is not installable" #~ msgstr "%s 無法安裝" #~ msgid "nothing provides %s needed by %s" #~ msgstr "無法提供 %s (%s 需要此項目)" #~ msgid "cannot install both %s and %s" #~ msgstr "無法同時安裝 %s 和 %s" #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s 與 %s 衝突 (由 %s 提供)" #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s 汰換 %s (由 %s 提供)" #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "安裝的 %s 會汰換 %s (由 %s 提供)" #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "解決方案 %s 與 %s 衝突 (由其自己提供)" #~ msgid "%s requires %s, but this requirement cannot be provided" #~ msgstr "%s 需要 %s,但無法提供此需求" #~ msgid "remove lock to allow removal of %s" #~ msgstr "解除鎖定以允許移除 %s" #~ msgid "do not install %s" #~ msgstr "請勿安裝 %s" #~ msgid "keep %s" #~ msgstr "保留 %s" #~ msgid "remove lock to allow installation of %s" #~ msgstr "解除鎖定以允許安裝 %s" #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "請勿要求安裝提供 %s 的解決方案" #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "請勿要求刪除所有提供 %s 的解決方案" #~ msgid "do not install most recent version of %s" #~ msgstr "請勿安裝最新版本的 %s" #~ msgid "keep %s despite the inferior architecture" #~ msgstr "保留 %s,忽略次要架構" #~ msgid "install %s despite the inferior architecture" #~ msgstr "安裝 %s,忽略次要架構" #~ msgid "keep obsolete %s" #~ msgstr "保留過時的 %s" #~ msgid "install %s from excluded repository" #~ msgstr "自排除的套件庫中安裝 %s" #~ msgid "downgrade of %s to %s" #~ msgstr "降級 %s 到 %s" #~ msgid "architecture change of %s to %s" #~ msgstr "架構由 %s 變更為 %s" #~ msgid "" #~ "install %s (with vendor change)\n" #~ " %s --> %s" #~ msgstr "" #~ "安裝 %s (並變更廠商)\n" #~ " %s --> %s" #~ msgid "replacement of %s with %s" #~ msgstr "將 %s 取代為 %s" #~ msgid "deinstallation of %s" #~ msgstr "反安裝 %s" #~ msgid "Can't open lock file: %s" #~ msgstr "無法開啟鎖定檔案:%s" #~ msgid "This action is being run by another program already." #~ msgstr "此行動已被其他程式執行。" #~ msgid "Hal Exception" #~ msgstr "Hal 例外" #~ msgid "Sorry, but this version of libzypp was built without HAL support." #~ msgstr "抱歉,此版本的 libzypp 不支援 HAL。" #~ msgid "HalContext not connected" #~ msgstr "HalContext 未連接" #~ msgid "HalDrive not initialized" #~ msgstr "HalDrive 未初始化" #~ msgid "HalVolume not initialized" #~ msgstr "HalVolume 未初始化" #~ msgid "Unable to create dbus connection" #~ msgstr "無法建立 dbus 連接" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "libhal_ctx_new:無法建立 libhal 網路位置" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "libhal_set_dbus_connection: 無法設定 dbus 連接" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "無法初始化 HAL 網路位置 -- hald 尚未執行嗎?" #~ msgid "Not a CDROM drive" #~ msgstr "不是光碟機" #~ msgid "Can't initialize mutex attributes" #~ msgstr "無法初始化 mutex 屬性" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "無法設定遞迴 mutex 屬性" #~ msgid "Can't initialize recursive mutex" #~ msgstr "無法初始化遞迴 mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "無法取得 mutex 鎖定" #~ msgid "Can't release the mutex lock" #~ msgstr "無法釋放 mutex 鎖定" #~ msgid "Failed to import public key from file %s: %s" #~ msgstr "從檔案 %s 輸入公用金鑰失敗:%s" #~ msgid "Failed to remove public key %s: %s" #~ msgstr "移除公用金鑰 %s 失敗:%s" #~ msgid "Cannot find available loop device to mount the image file from '%s'" #~ msgstr "無法找到可用的 loop 裝置來掛載 '%s' 中的影像檔" #~ msgid "Cannot create public key %s from %s keyring to file %s" #~ msgstr "無法建立公開金鑰 %s 從 %s 鑰匙圈到檔案 %s" #~ msgid "Download (Metalink curl) initialization failed for '%s'" #~ msgstr "'%s' 下載 (Metalink curl) 初始化失敗" #~ msgid "" #~ "Download (metalink curl) error for '%s':\n" #~ "Error code: %s\n" #~ "Error message: %s\n" #~ msgstr "" #~ "'%s' 下載 (Metalink curl) 錯誤:\n" #~ "錯誤碼: %s\n" #~ "錯誤訊息: %s\n" #~ msgid "Download interrupted at %d%%" #~ msgstr "下載中斷在 %d%%" #~ msgid "Download interrupted by user" #~ msgstr "使用者中斷下載" #~ msgid "" #~ "Error occurred while setting download (metalink curl) options for '%s':" #~ msgstr "為 '%s' 設定下載(metalink curl)參數時發生錯誤:" #~ msgid "Failed to download %s from %s" #~ msgstr "下載 %s 從 %s 失敗" #~ msgid "Serbia and Montenegro" #~ msgstr "塞爾維亞和芒特尼格羅共和國" libzypp-17.36.5/po/zu.po000066400000000000000000003737721476576476200150550ustar00rootroot00000000000000# Copyright (C) 2006 SuSE Linux Products GmbH, Nuernberg # This file is distributed under the same license as the package. # msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: 2006-11-03 12:03\n" "Last-Translator: Novell Language \n" "Language-Team: Novell Language \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "Izwe elingaziwa:" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "Ayikho Ikhodi" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "Andorra" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "United Arab Emirates" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "Afghanistan" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "Antigua and Barbuda" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "Anguilla" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "Albania" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "Armenia" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "Netherlands Antilles" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "Angola" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "Antarctica" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "Argentina" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "American Samoa" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "Austria" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "Australia" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "Aruba" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "Aland Islands" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "Azerbaijan" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "Bosnia ne-Herzegowina" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "Barbados" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "Bangladesh" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "Belgium" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "Burkina Faso" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "Bulgaria" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "Bahrain" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "Burundi" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "Benin" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "Bermuda" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "Brunei Darussalam" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "Bolivia" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "Brazil" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "Bahamas" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "Bhutan" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "Bouvet Island" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "Botswana" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "Belarus" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "Belize" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "Canada" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "Cocos (Keeling) Islands" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "Congo" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "Centruual African Republic" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "Switzerland" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "Cote D'Ivoire" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "Cook Islands" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "Chile" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "Cameroon" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "China" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "Colombia" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "Costa Rica" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "Cuba" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "Cape Verde" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "Christmas Island" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "Cyprus" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "Czech Republic" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "Germany" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "Djibouti" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "Denmark" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "Dominica" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "Dominican Republic" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "Algeria" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "Ecuador" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "Estonia" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "Egypt" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "Western Sahara" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "Eritrea" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "Spain" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "Ethiopia" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "Finland" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "Fiji" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "Falkland Islands (Malvinas)" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "Federated States of Micronesia" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "Faroe Islands" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "France" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "Metropolitan France" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "Gabon" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "United Kingdom" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "Grenada" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "Georgia" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "French Guiana" #. :GUF:254: #: zypp/CountryCode.cc:237 #, fuzzy msgid "Guernsey" msgstr "Germany" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "Ghana" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "Gibraltar" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "Greenland" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "Gambia" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "Guinea" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "Guadeloupe" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "Equatorial Guinea" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "Greece" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "South Georgia kanye ne-South Sandwich Islands" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "Guatemala" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "Guam" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "Guinea-Bissau" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "Guyana" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "Hong Kong" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "Heard Island kanye ne-McDonald Islands" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "Honduras" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "Croatia" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "Haiti" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "Hungary" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "Indonesia" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "Ireland" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "Israel" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "India" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "British Indian Ocean Territory" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "Iraq" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "Iran" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "Iceland" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "Italy" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "Jamaica" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "Jordan" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "Japan" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "Kenya" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "Kyrgyzstan" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "Cambodia" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "Kiribati" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "Comoros" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "Saint Kitts ne-Nevis" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "North Korea" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "South Korea" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "Kuwait" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "Cayman Islands" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "Kazakhstan" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "Lao People's Democratic Republic" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "Lebanon" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "Saint Lucia" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "Liechtenstein" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "Sri Lanka" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "Liberia" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "Lesotho" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "Lithuania" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "Luxembourg" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "Latvia" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "Libya" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "Morocco" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "Monaco" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "Moldova" #. :MDA:498: #: zypp/CountryCode.cc:296 #, fuzzy msgid "Montenegro" msgstr "IsiMongo" #: zypp/CountryCode.cc:297 #, fuzzy msgid "Saint Martin" msgstr "San Marino" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "Madagascar" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "Marshall Islands" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "Macedonia" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "Mali" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "Myanmar" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "Mongolia" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "Macao" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "Northern Mariana Islands" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "Martinique" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "Mauritania" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "Montserrat" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "Malta" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "Mauritius" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "Maldives" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "Malawi" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "Mexico" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "Malaysia" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "Mozambique" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "Namibia" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "New Caledonia" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "Niger" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "Norfolk Island" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "Nigeria" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "Nicaragua" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "Netherlands" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "Norway" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "Nepal" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "Nauru" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "Niue" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "New Zealand" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "Oman" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "Panama" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "Peru" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "French Polynesia" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "Papua New Guinea" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "Philippines" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "Pakistan" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "Poland" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "Saint Pierre ne-Miquelon" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "Pitcairn" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "Puerto Rico" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "Palestinian Territory" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "Portugal" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "Palau" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "Paraguay" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "Qatar" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "Reunion" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "Romania" #. :ROU:642: #: zypp/CountryCode.cc:346 #, fuzzy msgid "Serbia" msgstr "IsiSerbia" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "Russian Federation" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "Rwanda" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "Saudi Arabia" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "Solomon Islands" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "Seychelles" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "Sudan" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "Sweden" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "Singapore" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "Saint Helena" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "Slovenia" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "Svalbard ne-Jan Mayen" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "Slovakia" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "Sierra Leone" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "San Marino" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "Senegal" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "Somalia" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "Suriname" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "Sao Tome ne-Principe" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "El Salvador" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "Syria" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "Swaziland" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "Turks ne-Caicos Islands" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "Chad" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "French Southern Territories" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "Togo" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "Thailand" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "Tajikistan" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "IsiTokelau" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "Turkmenistan" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "Tunisia" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "Tonga" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "East Timor" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "Turkey" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "Trinidad ne-Tobago" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "IsiTuvalu" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "Taiwan" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "Tanzania" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "Ukraine" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "Uganda" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "United States Minor Outlying Islands" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "United States" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "Uruguay" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "Uzbekistan" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "Holy See (Vatican City State)" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "Saint Vincent and the Grenadines" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "Venezuela" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "British Virgin Islands" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "Virgin Islands, U.S." #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "Vietnam" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "Vanuatu" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "Wallis ne-Futuna" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "Samoa" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "Yemen" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "Mayotte" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "South Africa" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "Zambia" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "Zimbabwe" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 #, fuzzy msgid "Obsoletes" msgstr "%s yenza zingasebenzi:%s" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "Ulimi olungaziwa:" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "Isi-Afar" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "Isi-Abkhazia" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "Isi-Achinese" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "Isi-Acoli" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "Isi-Adangme" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "Isi-Adyghe" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "Isi-Asia Esiyisi-Afro (Esinye)" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "Isi-Afrihili" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "IsiBhunu" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "Isi-Anu" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "Isi-Akan" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "Isi-Akkad" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "Isi-Albania" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "Isi-Aleut" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "Izilimi Zama-Algonquia" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "Isi-Altai SaseNingizimu" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "Isi-Amhari" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "IsiNgisi, Esidala (ca.450-1100)" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "Izilimi Zama-Apache" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "Isi-Arabhu" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "Isi-Aramu" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "Isi-Aragoni" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "Isi-Armenia" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "Isi-Araucania" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "Isi-Arapaho" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "Isi-Artificial (Esinye)" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "Isi-Arawak" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "Isi-Assame" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "Isi-Asturia" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "Izilimi Zama-Athapasca" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "Izilimi Zase-Australia" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "Isi-Avari" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "Isi-Avesta" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "Isi-Awadhi" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "Isi-Aymara" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "Isi-Azerbaijani" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "IsiBanda" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "Izilimi ZamaBalimeke" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "IsiBashkir" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "IsiBaluchi" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "IsiBambara" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "IsiBaline" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "IsiBasque" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "IsiBasa" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "Isi-Baltic (Esinye)" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "IsiBeja" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "IsiBelarusia" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "IsiBemba" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "IsiBengali" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "Isi-Barber (Esinye)" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "IsiBhojpuri" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "IsiBihari" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "IsiBikol" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "IsiBini" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "IsiBislama" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "IsiSiksika" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "Izilimi Zabomdabu (Ezinye)" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "IsiBosnia" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "IsiBraj" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "IsiBreton" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "IsiBatak (Indonesia)" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "IsiBuriat" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "IsiBuginese" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "IsiBulgaria" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "IsiBurmese" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "IsiBlin" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "IsiCaddo" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "Isindiya SaseMelika Ephakathi (Esinye)" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "IsiCarib" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "IsiCatal" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "Isi-Caucasia (Esinye)" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "IsiCebuano" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "Isi-Celt (Esinye)" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "IsiChamorro" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "IsiChibcha" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "IsiChechen" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "IsiChagatai" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "IsiShayina" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "IsiChuukese" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "IsiMari" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "Ingxubevange YesiChinook" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "IsiChoctaw" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "IsiChipewyan" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "IsiCherokee" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "IsiSlav SaseSontweni" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "IsiChuvash" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "IsiCheyenne" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "Izilimi ZamaChami" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "IsiCopt" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "IsiCorni" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "IsiCorsic" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "AmaCreoles namaPidgin, Ezisekelwe EsiNgisini (Ezinye)" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "AmaCreoles namaPidgin, Ezisekelwe EsiFulentshini (Ezinye)" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "AmaCreoles namaPidgin, Ezisekelwe EsiPutukezini (Ezinye)" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "IsiCree" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "Isi-Tatar SaseCrimea" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "Ama-Creole namaPidgin (Ezinye)" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "IsiKashubi" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "Isi-Cushiti (Esinye)" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "IsiCzech" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "IsiDakota" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "IsiDanishi" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "IsiDargwa" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "IsiDayak" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "IsiDelaware" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "IsiSlave (Sesi-Athapasca)" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "IsiDogrib" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "IsiDinka" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "IsiDivehi" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "IsiDogri" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "Isi-Dravid (Esinye)" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "IsiSorbia Sangezansi" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "IsiDuala" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "IsiDashi, Maphakathi (ca.1050-1350)" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "IsiDashi" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "IsiDyula" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "IsiDzongkha" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "Isi-Efik" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "IsiGibhithe (Sasendulo)" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "Isi-Ekajuk" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "Isi-Elami" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "IsiNgisi" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "IsiNgisi, Maphakathi (1100-1500)" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "Isi-Esperanto" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "Isi-Estonia" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "Isi-Ewe" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "Isi-Ewondo" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "Isi-Fang" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "IsiFaroese" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "IsiFanti" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "IsiFiji" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "IsiFilipino" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "IsiFinishi" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "Isi-Ugrio SesiFinno (Esinye)" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "IsiFon" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "IsiFulentshi" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "IsiFulentshi, Maphakathi (ca.1400-1600)" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "IsiFulentshi, Esidala (842-ca.1400)" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "IsiFrisia" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "IsiFulah" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "IsiFriulia" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "IsiGa" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "IsiGayo" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "IsiGbaya" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "IsiJalimane (Esinye)" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "IsiGeorgia" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "IsiJalimane" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "IsiGeez" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "IsiGilbertese" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "IsiGaeli" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "Isi-Irish" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "IsiGalicia" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "IsiManx" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "IsiJalimane, Esiphezulu Maphakathi (ca.1050-1500)" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "IsiJalimane, Esiphezulu Sakudala (ca.1050-1050)" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "IsiGondi" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "IsiGorontalo" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "IsiGothic" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "IsiGrebo" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "IsiGriki, Sasendulo (kuya ku-1453)" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "IsiGriki, Sesimanje (1453-)" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "IsiGuarani" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "IsiGujarati" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "IsiGwich'in" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "IsiHaida" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "IsiHaiti" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "IsiHausa" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "IsiHawaii" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "IsiHebheru" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "IsiHerero" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "IsiHiligaynon" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "IsiHimachali" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "IsiHindi" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "IsiHeti" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "IsiHmong" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "IsiHiri Motu" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "IsiSorbia Sangenhla" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "IsiHungary" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "IsiHupa" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "Isi-Iban" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "Isi-Igbo" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "Isi-Iceland" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "Isi-Ido" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "IsiSichuan Yi" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "Isi-Ijo" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "Isi-Inuktitut" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "Isi-Interlingue" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "Isi-Iloko" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "Isi-Interlingua (Inhlangano Yomhlaba Wonke Esiza Ngezilimi)" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "Isi-Indi (Esinye)" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "Isi-Indonesia" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "Isi-Indo-Europe (Esinye)" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "Isi-Ingush" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "Isi-Inupiaq" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "Isi-Irani (Esinye)" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "Izilimi Zase-Iraqi" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "IsiNtaliyane" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "IsiJavani" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "IsiLobja" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "AmaJapane" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "IsiPheresiya EsiyisiJuda" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "Isi-Arabhu EsiyisiJuda" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "IsiKara-Kalpak" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "IsiKabyle" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "IsiKachin" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "IsiKalaallisut" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "IsiKamba" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "IsiKannada" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "IsiKaren" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "IsiKashmiri" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "IsiKanuri" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "IsiKawi" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "IsiKazakh" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "IsiKabard" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "IsiKhasi" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "IsiKhoisan (Esinye)" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "IsiKhmer" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "IsiKhotanese" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "IsiKikuyu" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "IsiKinyarwanda" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "IsiKrghiz" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "IsiKimbundu" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "IsiKonkani" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "IsiKomi" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "IsiKongo" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "IsiKoriya" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "IsiKosrae" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "IsiKpelle" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "IsiKarachay-Balkar" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "IsiKru" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "IsiKurukh" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "IsiKuanyama" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "IsiKumyk" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "IsiKurdu" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "IsiKutenai" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "IsiLadino" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "IsiLahnda" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "IsiLamba" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "IsiLao" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "IsiLatini" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "IsiLatvia" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "IsiLezghia" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "IsiLimburg" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "IsiLingala" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "IsiLithania" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "IsiMongo" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "IsiLozi" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "IsiLuxembourg" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "IsiLuba-Lulua" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "IsiLuba-Katanga" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "IsiGanda" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "IsiLuiseno" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "IsiLunda" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "IsiLuo (Ekenya naseTanzania)" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "IsiLushai" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "IsiMacedonia" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "IsiMadurese" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "IsiMagahi" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "IsiMarshall" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "IsiMaithili" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "IsiMakasar" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "IsiMalayal" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "IsiMandingo" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "IsiMaori" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "Isi-Austronesia (Esinye)" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "IsiMarathi" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "IsiMasai" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "IsiMalay" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "IsiMoksha" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "IsiMandar" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "IsiMende" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "Isi-Irish, Maphakathi (900-1200)" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "IsiMi'kmaq" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "IsiMinangkabau" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "Izilimi Eziyingxubevange" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "IsiMon-Khmer (Ezinye)" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "IsiMalagasy" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "IsiMaltese" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "IsiManchu" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "IsiManipuri" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "Izilimi ZaManobo" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "IsiMohawk" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "IsiMoldavia" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "IsiMongolia" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "IsiMossi" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "Izilimi Eziningi" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "Izilimi ZamaMunda" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "IsiCreek" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "IsiMirandese" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "IsiMarwari" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "Izilimi ZamaMaya" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "Isi-Erzya" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "IsiNahuatl" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "IsiNdiya SaseNyakatho Melika" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "IsiNeapoli" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "Navajo" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "IsiNdebele, saseNingizimu" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "IsiNdebele, saseNyakatho" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "IsiNdonga" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "IsiJalimane Esiphansi" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "IsiNepali" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "IsiNepali Bhasha" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "IsiNias" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "IsiNiger-Kordofanian (Esinye)" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "IsNiue" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "IsiNynorsk SaseNorway" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "IsiBokmal SaseNorway" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "IsiNogai" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "IsiNorse, Esidala" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "IsiNorway" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "IsiSuthu SaseNyakatho (isiPedi)" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "Izilimi zamaNubi" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "IsiNewari Sendabuko" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "IsiChewa" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "IsiNyamwezi" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "IsiNyakole" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "IsiNyoro" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "IsiNzima" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "Isi-Occitan (sangemva kuka-1500)" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "Isi-Ojibwa" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "Isi-Oriya" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "Isi-Oromo" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "Isi-Osage" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "Isi-Ossetian" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "IsiTurkey, Isi-Ottoman (1500-1928" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "Izilimi Zama-Otomia" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "IsiPapua (Esinye)" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "IsiPangasinan" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "IsiPahlavi" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "IsiPampanga" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "IsiPanjabi" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "IsiPapiamento" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "IsiPalauan" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "IsiPeresiya, Esidala (ca.600-400 B.C.)" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "IsiPeresiya" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "Isi-Philippine (Esinye)" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "IsiPhoenicia" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "IsiPali" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "IsiPolishi" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "IsiPohnpeian" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "IsiPutukezi" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "Izilimi ZesiPrakrit" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "IsiProvencal, Esidala (ukuya ku-1500)" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "IsiPushto" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "IsiQuenchua" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "IsiRajasthani" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "IsiRapanui" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "IsiRarotonga" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "IsiRomance (Esinye)" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "IsiRaeto-Romance" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "IsiRomany" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "IsiRomania" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "IsiRundi" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "IsiRashiya" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "IsiSandawe" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "IsiSango" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "IsiYakut" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "IsiNdiya SaseMelika EseNingizimu (Esinye)" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "Izilimi ZesiSalisha" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "Isi-Aramu SaseSamariya" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "IsiSanskrit" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "IsiSasak" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "IsiSantali" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "IsiSerbia" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "IsiSicilia" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "IsiScots" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "IsiCroatia" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "IsiSelkup" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "IsiSemi (Esinye)" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "Isi-Irish, Esidala (ukuya ku-900)" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "Izilimi Zezandla" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "IsiShan" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "IsiSidamo" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "IsiSinhala" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "Izilimi ZaseSioua" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "IsiTibeti SamaSino (Esinye)" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "Isi-Slavic (Esinye)" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "IsiSlovak" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "IsiSlovenia" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "IsiSami SaseNingizimu" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "IsiSami SaseNyakatho" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "Izilimi ZamaSami (Esinye)" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "IsiSami SamaLule" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "IsiSami Sama-Inari" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "IsiSamoa" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "IsiSami SamaSkolt" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "IsiShona" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "IsiSindhi" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "IsiSoninke" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "IsiSogdia" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "IsiSomali" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "IsiSonghai" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "IsiSuthu, SaseNingizimu" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "ISipanishi" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "IsiSardinia" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "IsiSerer" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "IsiSahara EsiyisiNilo (Esinye)" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "IsiSwati" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "IsiSukuma" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "IsiSundanese" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "IsiSusu" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "IsiSumeri" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "IsiSwahili" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "IsiSwidi" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "IsiSyria" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "IsiTahiti" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "Isi-Tai (Esinye)" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "IsiTamil" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "Isi-Tatar" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "IsiTelugu" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "IsiTimne" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "IsiTereno" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "IsiTetum" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "IsiTajik" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "IsiTagalog" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "IsiThai" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "IsiTibet" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "IsiTigre" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "IsiTigrinya" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "IsiTiv" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "IsiKlingon" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "IsiTlingit" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "IsiTamashek" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "IsiTonga (SamaNyasa)" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "IsTonga (Eziqingini ZamaTonga)" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "IsiTok Pisin" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "IsiTsimshian" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "IsiTswana" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "IsiTsonga" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "IsiTurkment" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "IsiTumbuka" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "Izilimi ZamaTupi" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "IsiTurkey" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "Isi-Atlaic (Esinye)" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "IsiTwi" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "IsiTuvinia" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "Isi-Udmurt" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "Isi-Ugaritic" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "Isi-Uighur" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "Isi-Ukrania" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "Isi-Umbundu" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "Olunganqunyiwe" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "Isi-Urdu" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "Isi-Uzbek" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "IsiVai" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "IsiVenda" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "IsiVietnam" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "IsiVolapuk" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "IsiVotic" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "Izilimi ZamaWakasha" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "IsiWalamo" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "IsiWaray" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "IsiWasho" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "IsiWelsh" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "Izilimi ZamaSorbia" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "IsiWalloon" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "IsiWolof" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "IsiKalmyk" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "IsiXhosa" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "IsiYao" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "IsiYapese" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "IsiYiddish" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "IsiYoruba" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "Izilimi ZamaYupik" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "IsiZapotec" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "IsiZenaga" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "IsiZhuang" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "IsiZande" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "IsiZulu" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "IsiZuni" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "akwaziwa" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 #, fuzzy msgid "The vendor does not provide support." msgstr "Idiski ayikho." #: zypp/VendorSupportOptions.cc:47 msgid "" "Problem determination, which means technical support designed to provide " "compatibility information, installation assistance, usage support, on-going " "maintenance and basic troubleshooting. Level 1 Support is not intended to " "correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "" "Problem isolation, which means technical support designed to duplicate " "customer problems, isolate problem area and provide resolution for problems " "not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "" "Problem resolution, which means technical support designed to resolve " "complex problems by engaging engineering in resolution of product defects " "which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "" "The package was discontinued and has been superseded by a new package with a " "different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, fuzzy, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "Ikhomandi engaziwa" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, fuzzy, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "Uhlelo lwe-Url olungekho emthethweni '%s'" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "" "Visit the SUSE Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "" "Visit the Novell Customer Center to check whether your registration is valid " "and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "" "Create attach point: Can't find a writable directory to create an attach " "point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 #, fuzzy msgid "Can't create metadata cache directory." msgstr "Ayikwazi ukwakha i-directory '%1'. %2." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, fuzzy, c-format, boost-format msgid "Can't create %s" msgstr "Ayikwazi ukuvula into esesendlalelweni (desktop) '%s'" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, fuzzy, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "Failed to parse: %s." #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, fuzzy, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "Igama lefayela yokuthekelisa engekho emthethweni." #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, fuzzy, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "Ayikwazi ukuvula ifayela ukuze ibhale." #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, fuzzy, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "Kwenzeke iphutha lapho ifunda iflophi diski." #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, fuzzy, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "Failed to parse: %s." #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, fuzzy, c-format, boost-format msgid "Removing repository '%s'" msgstr "Ukubuyisela imithombo yokwaziswa" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, fuzzy, c-format, boost-format msgid "Can't delete '%s'" msgstr "Ayikwazi ukuvula into esesendlalelweni (desktop) '%s'" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 #, fuzzy msgid "Repository alias cannot start with dot." msgstr "Igama le-VM alikwazi ukuqala ngenombolo." #: zypp/ng/repomanager.h:78 #, fuzzy msgid "Service alias cannot start with dot." msgstr "Igama le-VM alikwazi ukuqala ngenombolo." #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "Qhubeka?" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "" "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 #, fuzzy msgid "Signature verification failed" msgstr "DBI Execution failed: %s" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, fuzzy, c-format, boost-format msgid "" "Package %s seems to be corrupted during transfer. Do you want to retry " "retrieval?" msgstr "" "Iphakheji %s ihlulekile lapho ihlolwa ukuthembeka. Ufuna ukuphinde uzame " "ukuyilanda futhi?" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, fuzzy, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" "Iphakheji %s ihlulekile lapho ihlolwa ukuthembeka. Ufuna ukuphinde uzame " "ukuyilanda futhi?" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "ukuhlola i-applydeltarpm kuhlulekile." #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "i-applydeltarpm ihlulekile." #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 #, fuzzy msgid "Service plugin does not support changing an attribute." msgstr "" "uhlobo lomthombo wokwaziswa we-VAR1 alulusekeli uhlelo lokuboniswa " "kwezinguquko" #: zypp/repo/RepoProvideFile.cc:260 #, fuzzy, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "Ayikwazi ukuhlinzeka nge-%s kwi-%s" #: zypp/repo/RepoProvideFile.cc:266 #, fuzzy msgid "No url in repository." msgstr "Ifayela %1 ayitholakali enqolobaneni yamafayela." #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 #, fuzzy msgid "Can not create sat-pool." msgstr "Ayikwazi ukwakha ifayela." #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, fuzzy, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "Sishaye indiva lesi sidingo lapha nje kuphela" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 #, fuzzy msgid "generally ignore of some dependencies" msgstr "Sishaye indiva lesi sidingo lapha nje kuphela" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "" "the installed %1% does not belong to a distupgrade repository and must be " "replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 #, fuzzy msgid "conflicting requests" msgstr "Isicelo Sokuxhuma kwi-:" #: zypp/solver/detail/SATResolver.cc:1177 #, fuzzy msgid "some dependency problem" msgstr "Ayikwazi ukufaka %s ngenxa yezinkinga zohlelo oluncike kwezinye" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "" "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "" "the to be installed %1% conflicts with '%2%' provided by the to be installed " "%3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "" "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "" "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "" "the to be installed %1% requires '%2%', but this requirement cannot be " "provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 #, fuzzy msgid "deleted providers: " msgstr "Akukho okunikeza %s" #: zypp/solver/detail/SATResolver.cc:1285 #, fuzzy msgid "" "\n" "not installable providers: " msgstr "Abekho abanye abaphakeli abafakiwe be-%s" #: zypp/solver/detail/SATResolver.cc:1287 #, fuzzy msgid "not installable providers: " msgstr "Abekho abanye abaphakeli abafakiwe be-%s" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "" "Typically you want to keep the PTF and choose to not install the maintenance " "patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "" "Removing the installed %1% in this context will remove (not replace!) the " "included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "" "The PTF should be removed by calling '%1%'. This will update the included " "PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 #, fuzzy msgid "This request will break your system!" msgstr "Isicelo sesikhona kakade." #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "Ukufaka kuyekiwe njengoba kunikezwe isiqondiso." #: zypp/target/TargetImpl.cc:463 #, fuzzy msgid " executed" msgstr "Qalisa" #: zypp/target/TargetImpl.cc:485 #, fuzzy msgid " execution failed" msgstr "DBI Execution failed: %s" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 #, fuzzy msgid "Error sending update message notification." msgstr "Kwenzeke iphutha ngesikhathi kufakwa amakhodi okuphepha." #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "" "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it " "is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 #, fuzzy msgid "RPM failed: " msgstr "ayiphumelelanga" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "Amafayela okuhlela ashintshile e-%s:" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, fuzzy, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "I-rpm igcine %s njenge-%s kodwa bekungenakwenzeka ukubona umehluko" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "I-rpm igcine i-%s njenge-%s.\n" "Nansi imigqa yokuqala engu-25 yomehluko:\n" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, fuzzy, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "I-rpm yakhe %s njenge-%s kodwa bekungenakwenzeka ukubona umehluko" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" "I-rpm yakhe i-%s njenge-%s.\n" "Nansi imigqa yokuqala engu-25 yomehluko:\n" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 #, fuzzy msgid "Additional rpm output" msgstr "Okunye okukhishiwe kwe-rpm:" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "yakhe i-backup %s" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 #, fuzzy msgid "Signature is OK" msgstr "Into ayitholakali." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 #, fuzzy msgid "Signature does not verify" msgstr "Into ayitholakali." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 #, fuzzy msgid "Signature is OK, but key is not trusted" msgstr "Into ayitholakali." #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 #, fuzzy msgid "does not expire" msgstr "'I-o%1' ayitholakali." #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 #, fuzzy msgid "(does not expire)" msgstr "'I-o%1' ayitholakali." #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 #, fuzzy msgid "Failed to import key." msgstr "Ayikwazanga ukuqala i-VM." #: zypp-common/private/keyring_p.cc:298 #, fuzzy msgid "Failed to delete key." msgstr "Ayikwazanga ukuqala i-VM." #: zypp-common/private/keyring_p.cc:304 #, fuzzy, c-format, boost-format msgid "Signature file %s not found" msgstr "Into ayitholakali." #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, fuzzy, c-format, boost-format msgid "Can't open pty (%s)." msgstr "Couldn't open file: %s." #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, fuzzy, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "Ayikwazi ukuvula ifayela %1." #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "Uhlu lombuzo lwe-LDAP URL olunganembile" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "Ipharamitha yombuzo ye-LDAP URL enganembile '%s'" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "Ayikwazi ukukopisha into ye-Url" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "Into engenalutho ye-Url okubhekiselwe kuyo ayinembile" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "Ayikwazi ukucaza izingxenyana ze-Url" #: zypp-core/base/Exception.cc:186 #, fuzzy msgid "History:" msgstr "Linganisa Umlando" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "Uhlelo lwe-URL aluyivumeli i-%s" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "Ingxenyana '%s' engekho emthethweni %s" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "Ingxenyana engekho emthethweni %s" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "Ukucazwa kohlu lwemibuzo akusekelwa kule-URL" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "Uhlelo lwe-Url luyingxenyana edingekayo" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "Uhlelo lwe-Url olungekho emthethweni '%s'" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "Uhlelo lwe-URL alulivumeli igama lomsebenzisi" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "Uhlelo lwe-URL aluyivumeli iphasiwedi" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "Uhlelo lwe-Url ludinga ingxenyana yesiphakeli" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "Uhlelo lwe-URL aluyivumeli ingxenyana yesiphakeli" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "Ingxenyana engekho emthethweni '%s'" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "Uhlelo lwe-URL aluyivumeli iphasiwedi" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "Ingxenyana engekho emthethweni '%s'" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "Uhlelo lwe-Url ludinga igama lomgudu" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "Umgudu ongaphelele awuvunyelwe uma kunegunya" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "Uhlu olufakwe amakhodi okuphepha lune-NUL byte" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "Iqoqo lepharamitha elinganembile lihlakaza uhlamvu oluhlukanisayo" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "Ibalazwe lepharamitha elinganembile lihlakaza uhlamvu oluhlukanisayo" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "Iqoqo lepharamitha elinganembile lihlanganisa uhlamvu oluhlukanisayo" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 #, fuzzy msgid "Command exited with unknown error." msgstr "Ikhomandi ekhishwa lapho ixhumeka" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, fuzzy, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "Ayiyitholi i-%s." #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, fuzzy, c-format, boost-format msgid "Can't fork (%s)." msgstr "Ayiyitholi i-%s." #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, fuzzy, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "Ayikwazi ukuvula %s - %s\n" #: zypp-media/mediaexception.cc:43 #, fuzzy, c-format, boost-format msgid "Failed to unmount %s" msgstr "Ihlulekile ukufaka imoduli \"%s\"." #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, fuzzy, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "Ifayela %1 ayitholakali enqolobaneni yamafayela." #: zypp-media/mediaexception.cc:63 #, fuzzy, c-format, boost-format msgid "Cannot write file '%s'." msgstr "Ayikwazi ukubhala efayeleni %1." #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, fuzzy, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "I-%1 ayiyona i-directory." #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 #, fuzzy msgid "Empty host name in URI" msgstr "Igama le-CA elingenalutho" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, fuzzy, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "Uhlelo '%1' lwe-URL engekho emthethweni." #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, fuzzy, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "Ayikwazi ukuvula into esesendlalelweni (desktop) '%s'" #: zypp-media/mediaexception.cc:181 #, fuzzy, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "Izimvume zinqatshiwe" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "&Yebo" #: zypp-tui/Table.cc:32 msgid "No" msgstr "&Cha" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 #, fuzzy msgid "Warning:" msgstr "Isexwayiso" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 #, fuzzy msgid "Error:" msgstr "Iphutha" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "kwenziwe" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "iphutha" #: zypp-tui/output/OutNormal.cc:90 #, fuzzy msgid "Warning: " msgstr "Isexwayiso" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" # window title for kernel loading (see txt_load_kernel) #: zypp-tui/output/OutNormal.cc:261 #, fuzzy msgid "starting" msgstr "Iyaqalisa..." #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 #, fuzzy msgid "not found" msgstr "Akutholakalanga" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "yebo" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "cha" #, fuzzy #~ msgid "%s has inferior architecture" #~ msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo." #, fuzzy #~ msgid "problem with installed package %s" #~ msgstr "ikhomandi yokukhipha amaphakheji" #, fuzzy #~ msgid "nothing provides requested %s" #~ msgstr "Akukho okunikeza %s" #, fuzzy #~ msgid "package %s does not exist" #~ msgstr "Idiski ayikho." #, fuzzy #~ msgid "%s is provided by the system and cannot be erased" #~ msgstr "%s ihluthulelwe futhi ngeke ikwazi ukukhipheka." #, fuzzy #~ msgid "%s is not installable" #~ msgstr "alufakiwe" #, fuzzy #~ msgid "nothing provides %s needed by %s" #~ msgstr "%s idingwa yi- %s" #, fuzzy #~ msgid "cannot install both %s and %s" #~ msgstr "Ayikwazi ukufaka %s" #, fuzzy #~ msgid "%s conflicts with %s provided by %s" #~ msgstr "%s ixabana ne- %s" #, fuzzy #~ msgid "%s obsoletes %s provided by %s" #~ msgstr "%s yenza zingasebenzi %s" #, fuzzy #~ msgid "installed %s obsoletes %s provided by %s" #~ msgstr "%s yenza zingasebenzi %s" #, fuzzy #~ msgid "solvable %s conflicts with %s provided by itself" #~ msgstr "%s ixabana ne- %s" #~ msgid "do not install %s" #~ msgstr "ungafaki %s" #~ msgid "keep %s" #~ msgstr "Gcina %s" #, fuzzy #~ msgid "remove lock to allow installation of %s" #~ msgstr "ungafaki %s" #, fuzzy #~ msgid "do not ask to install a solvable providing %s" #~ msgstr "Abekho abanye abaphakeli abafakiwe be-%s" #, fuzzy #~ msgid "do not ask to delete all solvables providing %s" #~ msgstr "Ungafaki noma ususe maqondana nezixazululi" #, fuzzy #~ msgid "keep %s despite the inferior architecture" #~ msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo." #, fuzzy #~ msgid "install %s despite the inferior architecture" #~ msgstr "Faka %s nakuba izoshintsha ubuciko bomklamo" #, fuzzy #~ msgid "keep obsolete %s" #~ msgstr "%s yenza zingasebenzi %s" #, fuzzy #~ msgid "downgrade of %s to %s" #~ msgstr "Ilande %s kwi-%s" #, fuzzy #~ msgid "deinstallation of %s" #~ msgstr "Ukufaka uhlelo" #, fuzzy #~ msgid "Can't open lock file: %s" #~ msgstr "Ayikwazi ukuvula ifayela %1." #~ msgid "Hal Exception" #~ msgstr "I-Hal Exception" #~ msgid "HalContext not connected" #~ msgstr "I-HalContext ayixhumekile" #~ msgid "HalDrive not initialized" #~ msgstr "I-HalDrive ayizange ilungiselelwe ukuqalisa" #~ msgid "HalVolume not initialized" #~ msgstr "I-HalVolume ayizange ilungiselelwe ukuqalisa" #~ msgid "Unable to create dbus connection" #~ msgstr "Ayikwazanga ukwakha ukuxhumana nge-dbus" #~ msgid "libhal_ctx_new: Can't create libhal context" #~ msgstr "I-libhal_ctx_new: Ayikwazi ukwakha i-libhal context" #~ msgid "libhal_set_dbus_connection: Can't set dbus connection" #~ msgstr "I-libhal_set_dbus_connection: Ayikwazi ukwakha ukuxhumana kwe-dbus" #~ msgid "Unable to initalize HAL context -- hald not running?" #~ msgstr "Ayikwazi ukuqalisa i-HAL context --i-hald ayisebenzi?" #~ msgid "Not a CDROM drive" #~ msgstr "Akuyona i-CDROM drive" #~ msgid "Can't initialize mutex attributes" #~ msgstr "Ayikwazi ukulungela ukuqalisa ama-attribute e-mutex" #~ msgid "Can't set recursive mutex attribute" #~ msgstr "Ayikwazi ukusetha ama-attribute e-mutex" #~ msgid "Can't initialize recursive mutex" #~ msgstr "Ayikwazi ukulungiselela ukuqalisa i-recursive mutex" #~ msgid "Can't acquire the mutex lock" #~ msgstr "Ayikwazi ukuthola isihluthulelo se-mutex" #~ msgid "Can't release the mutex lock" #~ msgstr "Ayikwazi ukukhulula isihluthulelo se-mutex" #, fuzzy #~ msgid "Failed to remove public key %s: %s" #~ msgstr "Ayikwazi ukuthola isikhiye sikawonk’ uwonke." #, fuzzy #~ msgid "do not keep %s installed" #~ msgstr "alufakiwe" #, fuzzy #~ msgid "Failed to download %s from %s" #~ msgstr "Ayikwazi ukuvula %s - %s\n" #~ msgid "Serbia and Montenegro" #~ msgstr "Serbia ne-Montenegro" #, fuzzy #~ msgid "Unknown Distribution" #~ msgstr "Uhlu olungaziwa okukhethwa kulo" #, fuzzy #~ msgid "ignore some dependencies of %s" #~ msgstr "ayikwazanga ukuxazulula izinhlelo ezincike kwezinye" #~ msgid "" #~ "File %s does not have a checksum.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayela %s ayinayo i-checksum.\n" #~ "Nokho yisebenzise ifayela?" #~ msgid "" #~ "File %s failed integrity check with the folowing key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayela %s yehlulekile ekuhlolweni kokwethembeka ngesikhiye " #~ "esilandelayo:\n" #~ "%s|%s|%s\n" #~ " Nokho yisebenzise ifayela?" #~ msgid "" #~ "File %s has an invalid checksum.\n" #~ "Expected %s, found %s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayela %s ine-checksum engasebenzi.\n" #~ "Bekulindeleke %s, kwatholakala %s\n" #~ " Nokho yisebenzise ifayela?" #~ msgid "" #~ "File %s has an unknown checksum %s.\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayela %s ine-checksum engaziwa %s.\n" #~ "Nokho yisebenzise ifayela?" #~ msgid "" #~ "File %s is not signed.\n" #~ "Use it anyway?" #~ msgstr "" #~ "Ifayela %s ayisayiniwe.\n" #~ "Nokho yisebenzise?" #~ msgid "" #~ "File %s is signed with an unknown key:\n" #~ "%s|%s|%s\n" #~ "Use the file anyway?" #~ msgstr "" #~ "Ifayela %s isayinwe ngesikhiye esingaziwa:\n" #~ "%s|%s|%s\n" #~ " Nokho yisebenzise ifayela?" #~ msgid "" #~ "Untrusted key found:\n" #~ "%s|%s|%s\n" #~ "Trust key?" #~ msgstr "" #~ "Isikhiye esingenakwethenjwa sitholakele:\n" #~ "%s|%s|%s\n" #~ " Sethembe isikhiye?" #~ msgid "%s remove failed" #~ msgstr "Ukususa i-%s akuphumelelanga" #, fuzzy #~ msgid "Invalid user name or password." #~ msgstr "Iphasiwedi ye-CA engekho emthethweni." #~ msgid "rpm output:" #~ msgstr "okukhishiwe kwe-rpm:" #~ msgid "%s install failed" #~ msgstr "ukufakwa kwe-%s akuphumelelanga" #~ msgid "%s installed ok" #~ msgstr "%s efakiwe ilungile" #~ msgid "%s remove ok" #~ msgstr "ukususa i-%s kuphumelele" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the architecture of the " #~ "installed item" #~ msgstr "" #~ "%s ihlinzeka ngalolu hlelo okuncikwe kulo kodwa ingabushintsha ubuciko " #~ "bomklamo bento efakiwe" #, fuzzy #~ msgid "" #~ "%s provides this dependency, but would change the vendor of the installed " #~ "item" #~ msgstr "" #~ "%s ihlinzeka ngalolu hlelo okuncikwe kulo kodwa ingabushintsha ubuciko " #~ "bomklamo bento efakiwe" #, fuzzy #~ msgid "Do not install or delete the resolvables concerned" #~ msgstr "Ungafaki noma ususe maqondana nezixazululi" #~ msgid "Ignore that %s is already set to install" #~ msgstr "Kushaye indiva ukuthi i-%s isisethelwe ukufakwa kakade" #~ msgid "Ignore the obsolete %s in %s" #~ msgstr "Ishaye indiva into engasebenzi i-%s e-%s" #~ msgid "Ignore this conflict of %s" #~ msgstr "Kushaye indiva lokhu kuxabana kwe-%s" #~ msgid "Ignore this requirement just here" #~ msgstr "Sishaye indiva lesi sidingo lapha nje kuphela" #, fuzzy #~ msgid "Install %s although it would change the vendor" #~ msgstr "Faka %s nakuba izoshintsha ubuciko bomklamo" #~ msgid "Install missing resolvables" #~ msgstr "Faka izixazululi ezilahlekile" #~ msgid "Keep resolvables" #~ msgstr "Gcina Izixazululi" #~ msgid "Unlock these resolvables" #~ msgstr "Vula izihluthulelo zalezi zixazululi" #~ msgid "delete %s" #~ msgstr "Susa %s" #~ msgid "install %s" #~ msgstr "faka %s" #~ msgid "unlock %s" #~ msgstr "vula isihluthulelo se-%s" #~ msgid "unlock all resolvables" #~ msgstr "Vula izihluthulelo zezixazululi" #, fuzzy #~ msgid "Can't open solv-file: " #~ msgstr "Ayikwazi ukuvula ifayela %1." #, fuzzy #~ msgid "Error reading solv-file: " #~ msgstr "Kwenzeke iphutha ifunda i-sector %u." #~ msgid "Path Parameter parsing not supported for this URL" #~ msgstr "Ukucazwa kwepharamitha yomgudu akusekelwa kule-URL" #~ msgid "Path parameter parsing not supported for this URL" #~ msgstr "Ukucazwa kwepharamitha yomgudu akusekelwa kule-URL" #~ msgid "Software management is already running." #~ msgstr "Ukulawulwa kwe-software sekuyasebenza kakade." #~ msgid "%s is replaced by %s" #~ msgstr "%s ithathelwa indawo yi- %s" #~ msgid "%s replaced by %s" #~ msgstr "%s ingenelwe esikhundleni yi- %s" #, fuzzy #~ msgid "%s will be deleted by the user.\n" #~ msgstr "" #~ "\n" #~ "Lezi zixazululi zizosulwa kwisistimu." #, fuzzy #~ msgid "%s will be installed by the user.\n" #~ msgstr "%s ayinakukhishwa ngoba isadingeka namanje" #~ msgid "Invalid information" #~ msgstr "ukwaziswa okungasebenzi" #~ msgid "%s is needed by other resolvables" #~ msgstr "%s idingwa ezinye izixazululi" #~ msgid "" #~ "%s is needed by:\n" #~ "%s" #~ msgstr "" #~ "%s idingwa yi-:\n" #~ "%s" #~ msgid "%s conflicts with other resolvables" #~ msgstr "%s ixabana nezinye izixazululi" #~ msgid "" #~ "%s conflicts with:\n" #~ "%s" #~ msgstr "" #~ "%s ixabana ne-:\n" #~ "%s" #~ msgid "%s obsoletes other resolvables" #~ msgstr "%s yenza ezinye izixazululi zingasebenzi" #~ msgid "" #~ "\n" #~ "These resolvables will be deleted from the system." #~ msgstr "" #~ "\n" #~ "Lezi zixazululi zizosulwa kwisistimu." #~ msgid "%s depends on other resolvables" #~ msgstr "%s yenzike kwezinye izixazululi" #~ msgid "%s depends on %s" #~ msgstr "%s yencike kwi- %s" #~ msgid "%s depends on:%s" #~ msgstr "%s yencike kwi-:%s" #~ msgid "Child of" #~ msgstr "Ingane ka-" #, fuzzy #~ msgid "" #~ "\n" #~ "There is no resource available which supports this requirement." #~ msgstr "" #~ "\n" #~ "Awukho umthombo otholakalayo osekela lemfuneko." #, fuzzy #~ msgid "" #~ "Due to the problems described above/below, this resolution will not solve " #~ "all dependencies" #~ msgstr "" #~ "Izinkinga ezidlulelwe yisikhathi ezichazwe ngenhla/ngezansi kwalokhu " #~ "ngeke zixazulule zonke izinhlelo okuncikwe kuzo." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting with %s" #~ msgstr "Ayikwazi ukufaka %s ngoba ixabana ne-%s" #~ msgid "%s is not installed and has been marked as uninstallable" #~ msgstr "%s ayifakwanga futhi iye yaphawulwa njengengafakeki" #~ msgid "%s has unfulfilled requirements" #~ msgstr "%s inezimfuneko ezingagcwalisiwe" #~ msgid "%s has missing dependencies" #~ msgstr "%s inezinhlelo encike kuzo ezilahlekile" #~ msgid "%s cannot be installed due to missing dependencies" #~ msgstr "%s ayikwazi ukufkwa ngenxa yezinhlelo encike kuzo ezilahlekile" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be uninstalled" #~ msgstr "%s igcwalisa izinhlelo okuncikwe kuzo ze-%s kodwa izokhishwa" #, fuzzy #~ msgid "%s fulfills dependencies of %s but will be kept on your system" #~ msgstr "" #~ "%s igcwalisa izinhlelo okuncikwe kuzo ze-%s kodwa izogcinwa kwisistimu " #~ "yakho" #~ msgid "No need to install %s" #~ msgstr "Asikho isidingo sokuyifaka %s" #, fuzzy #~ msgid "Cannot install %s to fulfill the dependencies of %s" #~ msgstr "Ayikwazi ukufaka %s ukuze igcwalise izinhlelo okuncikwe kuzo ze-%s" #~ msgid "Cannot install %s to fulfil the dependencies of %s" #~ msgstr "Ayikwazi ukufaka %s ukuze igcwalise izinhlelo okuncikwe kuzo ze-%s" #, fuzzy #~ msgid "%s will not be uninstalled, because it is still required" #~ msgstr "%s ayinakukhishwa ngoba isadingeka namanje" #, fuzzy #~ msgid "%s obsoletes %s. But %s cannot be deleted, because it is locked." #~ msgstr "" #~ "%s yenza ingasebenzi i-%s. Kodwa %s ayikwazi ukususwa ngoba ihluthulelwe." #, fuzzy #~ msgid "Cannot install %s, because it is conflicting" #~ msgstr "Ayikwazi ukufaka %s ngoba iyaxabana" #~ msgid "%s is uninstallable due to conflicts with %s" #~ msgstr "%s ayifakeki ngenxa yokuxabana ne- %s" #~ msgid "for requiring %s for %s when upgrading %s" #~ msgstr "ngokudinga i-%s ye-%s lapho kuvuselelwa uhlelo %s" #, fuzzy #~ msgid "%s is lacking the requirement %s" #~ msgstr "%s ilahlekelwe into edingekayo %s" #~ msgid ", Action: " #~ msgstr ", Isinyathelo:" #~ msgid ", Trigger: " #~ msgstr ", Qalisa:" #~ msgid "package" #~ msgstr "iphakheji" #~ msgid "selection" #~ msgstr "okukhethiwe" #~ msgid "pattern" #~ msgstr "iphethini" #~ msgid "product" #~ msgstr "umkhiqizo" #~ msgid "patch" #~ msgstr "isichibiyelo" #~ msgid "script" #~ msgstr "I-script" #~ msgid "message" #~ msgstr "umyalezo" #~ msgid "atom" #~ msgstr "i-athomu" #~ msgid "system" #~ msgstr "isistimu" #~ msgid "Resolvable" #~ msgstr "Isixazululi" #~ msgid "Marking this resolution attempt as invalid." #~ msgstr "Ukuphawula lomzamo we-resolution akusebenzi." #~ msgid "Marking resolvable %s as uninstallable" #~ msgstr "Ukuphawula isixazululi %s njengesingafakeki" #, fuzzy #~ msgid "" #~ "%s is scheduled to be installed, but this is impossible due to dependency " #~ "problems." #~ msgstr "" #~ "%s ihlelelwe ukuba ifakwe, kodwa lokhu akunakwenzeka ngenxa yezinkinga " #~ "zezinhlelo okuncikwe kuzo." #, fuzzy #~ msgid "" #~ "Can't install %s since it is already marked as needed to be uninstalled" #~ msgstr "Ayikwazi ukufaka i-%s njengoba isiphawulwe ukuthi idinga ukukhiswa" #, fuzzy #~ msgid "Can't install %s, because it does not apply to this system." #~ msgstr "" #~ "Ayikwazi ukufaka i-%s njengoba ingakwazi ukuyisebenzisa kule sistimu." #, fuzzy #~ msgid "" #~ "Can't install %s, because %s is already marked as needed to for " #~ "installation" #~ msgstr "" #~ "Ayikwazi ukufaka i-%s njengoba %s isiphawulwe ukuthi idinga ukukhiswa" #~ msgid "This would invalidate %s." #~ msgstr "Lokhu kuzokwenza i-%s ingasebenzi." #~ msgid "Establishing %s" #~ msgstr "Imisa %s" #~ msgid "Installing %s" #~ msgstr "Ifaka %s" #~ msgid "Updating %s to %s" #~ msgstr "Ivuselela %s kwi-%s" #~ msgid "Skipping %s: already installed" #~ msgstr "Yeqa %s: isifakiwe kakade" #, fuzzy #~ msgid "There are no alternative providers of %s installed" #~ msgstr "Abekho abanye abaphakeli abafakiwe be-%s" #~ msgid "for %s" #~ msgstr "nge-%s" #, fuzzy #~ msgid "Upgrading to %s to avoid removing %s is not possible." #~ msgstr "Ukuvuselela kwi-%s ukuze ugweme ukususa %s akunakwenzeka." #~ msgid "%s provides %s, but is scheduled to be uninstalled." #~ msgstr "%s ihlinzeka nge-%s, kodwa ihlelelwe ukuba ikhishwe." #~ msgid "%s provides %s, but another version of that %s is already installed." #~ msgstr "" #~ "%s ihlinzeka nge-%s, kodwa olunye uhlelo lwale-%s selufakiwe kakade." #~ msgid "" #~ "%s provides %s, but it is uninstallable. Try installing it on its own " #~ "for more details." #~ msgstr "" #~ "%s ihlinzeka nge-%s, kodwa ayikhipheki. Zama ukuyifaka yodwa ukuze " #~ "uthole imininingwane eyengeziwe." #~ msgid "%s provides %s, but it is locked." #~ msgstr "%s ihlinzeka nge-%s, kodwa ihluthulelwe." #~ msgid "%s provides %s, but is scheduled to be kept." #~ msgstr "%s ihlinzeka nge-%s, kodwa ihlelelwe ukuba igcinwe." #, fuzzy #~ msgid "%s provides %s, but has another vendor (%s)." #~ msgstr "%s ihlinzeka nge-%s, kodwa inobunye ubuciko bomklamo." #~ msgid "Can't satisfy requirement %s for %s" #~ msgstr "Ayikwazi ukwanelisa isidingo se-%s ye-%s" #, fuzzy #~ msgid "" #~ "%s is required by another resolvable selected for installation, so it " #~ "won't be unlinked." #~ msgstr "" #~ "%s idingwa ngesinye isixazululi esifakiwe, ngakho ngeke ingalinkeki." #, fuzzy #~ msgid "" #~ "%s is required by another installed resolvable, so it won't be unlinked." #~ msgstr "" #~ "%s idingwa ngesinye isixazululi esifakiwe, ngakho ngeke ingalinkeki." #, fuzzy #~ msgid "" #~ "A conflict over %s (%s) requires the removal of %s which is scheduled for " #~ "installation" #~ msgstr "Ingxabano nge-%s (%s) idinga ukususwa kwe-%s ezofakwa " #~ msgid "Marking %s as uninstallable due to conflicts over %s" #~ msgstr "Ukuphawula i-%s njengengafakeki ngenxa yezingxabano nge-%s" #~ msgid "from %s" #~ msgstr "ivela %s" #~ msgid " Error!" #~ msgstr "Iphutha!" #~ msgid " Important!" #~ msgstr "Kubalulekile!" #~ msgid "%s depended on %s" #~ msgstr "%s yencike kwi- %s" #, fuzzy #~ msgid "%s is recommended by %s" #~ msgstr "%s idingwa yi- %s" #, fuzzy #~ msgid "%s is suggested by %s" #~ msgstr "%s idingwa yi- %s" #, fuzzy #~ msgid "%s is enhanced by %s" #~ msgstr "%s ithathelwa indawo yi- %s" #, fuzzy #~ msgid "%s is supplemented by %s" #~ msgstr "%s idingwa yi- %s" #~ msgid "%s part of %s" #~ msgstr "%s ingxenye ye- %s" #, fuzzy #~ msgid "Double timeout" #~ msgstr "Ukuchofoza Kabili Kuphelelwe Isikhathi " #, fuzzy #~ msgid "%s is freshened by %s" #~ msgstr "%s idingwa yi- %s" #~ msgid "Unable to parse Url authority" #~ msgstr "Ayikwazi ukucaza igunya le-Url" #~ msgid "Ignore this requirement generally" #~ msgstr "Sishaye indiva lesi sidingo kaningi" #~ msgid "" #~ "%s is required by other to-be-installed resolvable, so it won't be " #~ "unlinked." #~ msgstr "" #~ "%s idingwa ngesinye isixazululi esizofakwa, ngakho ngeke ingalinkeki." #~ msgid "Cannot create a file needed to perform update installation." #~ msgstr "" #~ "Ayikwazi ukwakha ifayela edingekayo ukuze ifake uhlelo lokuvuselela." #~ msgid "Unable to restore all sources." #~ msgstr "Ayikwazi ukubuyisela yonke imithombo." #~ msgid "" #~ "At least one source already registered, stored sources cannot be restored." #~ msgstr "" #~ "Okungenani umthombo owodwa usubhalisiwe kakade, imithombo egciniwe " #~ "ayinakubuyiselwa." #~ msgid "Cannot be install %s to fulfil the dependencies of %s" #~ msgstr "Ayikwazi ukufaka %s ukze igcwalise izinhlelo okuncikwe kuzo ze%s" #~ msgid "%s dependend on %s" #~ msgstr "%s ibincike kwi- %s" #~ msgid "Reading index files" #~ msgstr "Ifuna amafayela e-index" #~ msgid "The signed repomd.xml file failed the signature check." #~ msgstr "Ifayela ye-repomd.xml esayiniwe ihlulekile lapho ihlolwa isignisha." #~ msgid "Reading product from %s" #~ msgstr "Ifunda umkhiqizo ovela kwi-%s" #~ msgid "Reading filelist from %s" #~ msgstr "Ifunda uhlu lwamafayela oluvela kwi-%s" #~ msgid "Reading packages from %s" #~ msgstr "Ifunda amaphakheji avela kwi-%s" #~ msgid "Reading selection from %s" #~ msgstr "Ifunda okukhethiwe okuvela kwi-%s" #~ msgid "Reading pattern from %s" #~ msgstr "Ifunda iphethini evela kwi-%s" #~ msgid "Reading patches index %s" #~ msgstr "Ifunda i-index %s yezichibiyelo" #~ msgid "Reading patch %s" #~ msgstr "Ifunda isichibiyelo %s" #~ msgid "The script file failed the checksum test." #~ msgstr "I-script sihlulekile lapho kwenziwa ukuhlolwa kwe-checksum." #~ msgid "Reading packages file" #~ msgstr "Ifunda ifayela yamaphakheji" #~ msgid "Reading translation: %s" #~ msgstr "Ifunda inkumusho: %s" #, fuzzy #~ msgid "" #~ "Package %s fails integrity check. Do you want to retry, or abort " #~ "installation?" #~ msgstr "" #~ "Iphakheji %s ihlulekile lapho ihlolwa ukuthembeka. Ufuna ukuphinde uzame " #~ "ukuyilanda futhi, noma uyeke ukufaka uhlelo?" #~ msgid " miss checksum." #~ msgstr "yeqe i-checksum." #~ msgid " fails checksum verification." #~ msgstr "ihlulekile lapho kufakazelwa i-checksum." #~ msgid "Downloading %s" #~ msgstr "Ilanda i-%s" libzypp-17.36.5/po/zypp.pot000066400000000000000000002763261476576476200156020ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR SuSE Linux GmbH, Nuernberg # This file is distributed under the same license as the zypp package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: zypp\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-02-28 16:30+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: zypp/CountryCode.cc:50 msgid "Unknown country: " msgstr "" #. Defined CountryCode constants #. Defined LanguageCode constants #: zypp/CountryCode.cc:149 zypp/LanguageCode.cc:148 msgid "No Code" msgstr "" #: zypp/CountryCode.cc:158 msgid "Andorra" msgstr "" #. :AND:020: #: zypp/CountryCode.cc:159 msgid "United Arab Emirates" msgstr "" #. :ARE:784: #: zypp/CountryCode.cc:160 msgid "Afghanistan" msgstr "" #. :AFG:004: #: zypp/CountryCode.cc:161 msgid "Antigua and Barbuda" msgstr "" #. :ATG:028: #: zypp/CountryCode.cc:162 msgid "Anguilla" msgstr "" #. :AIA:660: #: zypp/CountryCode.cc:163 msgid "Albania" msgstr "" #. :ALB:008: #: zypp/CountryCode.cc:164 msgid "Armenia" msgstr "" #. :ARM:051: #: zypp/CountryCode.cc:165 msgid "Netherlands Antilles" msgstr "" #. :ANT:530: #: zypp/CountryCode.cc:166 msgid "Angola" msgstr "" #. :AGO:024: #: zypp/CountryCode.cc:167 msgid "Antarctica" msgstr "" #. :ATA:010: #: zypp/CountryCode.cc:168 msgid "Argentina" msgstr "" #. :ARG:032: #: zypp/CountryCode.cc:169 msgid "American Samoa" msgstr "" #. :ASM:016: #: zypp/CountryCode.cc:170 msgid "Austria" msgstr "" #. :AUT:040: #: zypp/CountryCode.cc:171 msgid "Australia" msgstr "" #. :AUS:036: #: zypp/CountryCode.cc:172 msgid "Aruba" msgstr "" #. :ABW:533: #: zypp/CountryCode.cc:173 msgid "Aland Islands" msgstr "" #. :ALA:248: #: zypp/CountryCode.cc:174 msgid "Azerbaijan" msgstr "" #. :AZE:031: #: zypp/CountryCode.cc:175 msgid "Bosnia and Herzegovina" msgstr "" #. :BIH:070: #: zypp/CountryCode.cc:176 msgid "Barbados" msgstr "" #. :BRB:052: #: zypp/CountryCode.cc:177 msgid "Bangladesh" msgstr "" #. :BGD:050: #: zypp/CountryCode.cc:178 msgid "Belgium" msgstr "" #. :BEL:056: #: zypp/CountryCode.cc:179 msgid "Burkina Faso" msgstr "" #. :BFA:854: #: zypp/CountryCode.cc:180 msgid "Bulgaria" msgstr "" #. :BGR:100: #: zypp/CountryCode.cc:181 msgid "Bahrain" msgstr "" #. :BHR:048: #: zypp/CountryCode.cc:182 msgid "Burundi" msgstr "" #. :BDI:108: #: zypp/CountryCode.cc:183 msgid "Benin" msgstr "" #. :BEN:204: #: zypp/CountryCode.cc:184 msgid "Bermuda" msgstr "" #. :BMU:060: #: zypp/CountryCode.cc:185 msgid "Brunei Darussalam" msgstr "" #. :BRN:096: #: zypp/CountryCode.cc:186 msgid "Bolivia" msgstr "" #. :BOL:068: #: zypp/CountryCode.cc:187 msgid "Brazil" msgstr "" #. :BRA:076: #: zypp/CountryCode.cc:188 msgid "Bahamas" msgstr "" #. :BHS:044: #: zypp/CountryCode.cc:189 msgid "Bhutan" msgstr "" #. :BTN:064: #: zypp/CountryCode.cc:190 msgid "Bouvet Island" msgstr "" #. :BVT:074: #: zypp/CountryCode.cc:191 msgid "Botswana" msgstr "" #. :BWA:072: #: zypp/CountryCode.cc:192 msgid "Belarus" msgstr "" #. :BLR:112: #: zypp/CountryCode.cc:193 msgid "Belize" msgstr "" #. :BLZ:084: #: zypp/CountryCode.cc:194 msgid "Canada" msgstr "" #. :CAN:124: #: zypp/CountryCode.cc:195 msgid "Cocos (Keeling) Islands" msgstr "" #. :CCK:166: #. :CAF:140: #: zypp/CountryCode.cc:196 zypp/CountryCode.cc:198 msgid "Congo" msgstr "" #. :COD:180: #: zypp/CountryCode.cc:197 msgid "Central African Republic" msgstr "" #. :COG:178: #: zypp/CountryCode.cc:199 msgid "Switzerland" msgstr "" #. :CHE:756: #: zypp/CountryCode.cc:200 msgid "Cote D'Ivoire" msgstr "" #. :CIV:384: #: zypp/CountryCode.cc:201 msgid "Cook Islands" msgstr "" #. :COK:184: #: zypp/CountryCode.cc:202 msgid "Chile" msgstr "" #. :CHL:152: #: zypp/CountryCode.cc:203 msgid "Cameroon" msgstr "" #. :CMR:120: #: zypp/CountryCode.cc:204 msgid "China" msgstr "" #. :CHN:156: #: zypp/CountryCode.cc:205 msgid "Colombia" msgstr "" #. :COL:170: #: zypp/CountryCode.cc:206 msgid "Costa Rica" msgstr "" #. :CRI:188: #: zypp/CountryCode.cc:207 msgid "Cuba" msgstr "" #. :CUB:192: #: zypp/CountryCode.cc:208 msgid "Cape Verde" msgstr "" #. :CPV:132: #: zypp/CountryCode.cc:209 msgid "Christmas Island" msgstr "" #. :CXR:162: #: zypp/CountryCode.cc:210 msgid "Cyprus" msgstr "" #. :CYP:196: #: zypp/CountryCode.cc:211 msgid "Czech Republic" msgstr "" #. :CZE:203: #: zypp/CountryCode.cc:212 msgid "Germany" msgstr "" #. :DEU:276: #: zypp/CountryCode.cc:213 msgid "Djibouti" msgstr "" #. :DJI:262: #: zypp/CountryCode.cc:214 msgid "Denmark" msgstr "" #. :DNK:208: #: zypp/CountryCode.cc:215 msgid "Dominica" msgstr "" #. :DMA:212: #: zypp/CountryCode.cc:216 msgid "Dominican Republic" msgstr "" #. :DOM:214: #: zypp/CountryCode.cc:217 msgid "Algeria" msgstr "" #. :DZA:012: #: zypp/CountryCode.cc:218 msgid "Ecuador" msgstr "" #. :ECU:218: #: zypp/CountryCode.cc:219 msgid "Estonia" msgstr "" #. :EST:233: #: zypp/CountryCode.cc:220 msgid "Egypt" msgstr "" #. :EGY:818: #: zypp/CountryCode.cc:221 msgid "Western Sahara" msgstr "" #. :ESH:732: #: zypp/CountryCode.cc:222 msgid "Eritrea" msgstr "" #. :ERI:232: #: zypp/CountryCode.cc:223 msgid "Spain" msgstr "" #. :ESP:724: #: zypp/CountryCode.cc:224 msgid "Ethiopia" msgstr "" #. :ETH:231: #: zypp/CountryCode.cc:225 msgid "Finland" msgstr "" #. :FIN:246: #: zypp/CountryCode.cc:226 msgid "Fiji" msgstr "" #. :FJI:242: #: zypp/CountryCode.cc:227 msgid "Falkland Islands (Malvinas)" msgstr "" #. :FLK:238: #: zypp/CountryCode.cc:228 msgid "Federated States of Micronesia" msgstr "" #. :FSM:583: #: zypp/CountryCode.cc:229 msgid "Faroe Islands" msgstr "" #. :FRO:234: #: zypp/CountryCode.cc:230 msgid "France" msgstr "" #. :FRA:250: #: zypp/CountryCode.cc:231 msgid "Metropolitan France" msgstr "" #. :FXX:249: #: zypp/CountryCode.cc:232 msgid "Gabon" msgstr "" #. :GAB:266: #: zypp/CountryCode.cc:233 msgid "United Kingdom" msgstr "" #. :GBR:826: #: zypp/CountryCode.cc:234 msgid "Grenada" msgstr "" #. :GRD:308: #: zypp/CountryCode.cc:235 msgid "Georgia" msgstr "" #. :GEO:268: #: zypp/CountryCode.cc:236 msgid "French Guiana" msgstr "" #. :GUF:254: #: zypp/CountryCode.cc:237 msgid "Guernsey" msgstr "" #: zypp/CountryCode.cc:238 msgid "Ghana" msgstr "" #. :GHA:288: #: zypp/CountryCode.cc:239 msgid "Gibraltar" msgstr "" #. :GIB:292: #: zypp/CountryCode.cc:240 msgid "Greenland" msgstr "" #. :GRL:304: #: zypp/CountryCode.cc:241 msgid "Gambia" msgstr "" #. :GMB:270: #: zypp/CountryCode.cc:242 msgid "Guinea" msgstr "" #. :GIN:324: #: zypp/CountryCode.cc:243 msgid "Guadeloupe" msgstr "" #. :GLP:312: #: zypp/CountryCode.cc:244 msgid "Equatorial Guinea" msgstr "" #. :GNQ:226: #: zypp/CountryCode.cc:245 msgid "Greece" msgstr "" #. :GRC:300: #: zypp/CountryCode.cc:246 msgid "South Georgia and the South Sandwich Islands" msgstr "" #. :SGS:239: #: zypp/CountryCode.cc:247 msgid "Guatemala" msgstr "" #. :GTM:320: #: zypp/CountryCode.cc:248 msgid "Guam" msgstr "" #. :GUM:316: #: zypp/CountryCode.cc:249 msgid "Guinea-Bissau" msgstr "" #. :GNB:624: #: zypp/CountryCode.cc:250 msgid "Guyana" msgstr "" #. :GUY:328: #: zypp/CountryCode.cc:251 msgid "Hong Kong" msgstr "" #. :HKG:344: #: zypp/CountryCode.cc:252 msgid "Heard Island and McDonald Islands" msgstr "" #. :HMD:334: #: zypp/CountryCode.cc:253 msgid "Honduras" msgstr "" #. :HND:340: #: zypp/CountryCode.cc:254 msgid "Croatia" msgstr "" #. :HRV:191: #: zypp/CountryCode.cc:255 msgid "Haiti" msgstr "" #. :HTI:332: #: zypp/CountryCode.cc:256 msgid "Hungary" msgstr "" #. :HUN:348: #: zypp/CountryCode.cc:257 msgid "Indonesia" msgstr "" #. :IDN:360: #: zypp/CountryCode.cc:258 msgid "Ireland" msgstr "" #. :IRL:372: #: zypp/CountryCode.cc:259 msgid "Israel" msgstr "" #. :ISR:376: #: zypp/CountryCode.cc:260 msgid "Isle of Man" msgstr "" #: zypp/CountryCode.cc:261 msgid "India" msgstr "" #. :IND:356: #: zypp/CountryCode.cc:262 msgid "British Indian Ocean Territory" msgstr "" #. :IOT:086: #: zypp/CountryCode.cc:263 msgid "Iraq" msgstr "" #. :IRQ:368: #: zypp/CountryCode.cc:264 msgid "Iran" msgstr "" #. :IRN:364: #: zypp/CountryCode.cc:265 msgid "Iceland" msgstr "" #. :ISL:352: #: zypp/CountryCode.cc:266 msgid "Italy" msgstr "" #. :ITA:380: #: zypp/CountryCode.cc:267 msgid "Jersey" msgstr "" #: zypp/CountryCode.cc:268 msgid "Jamaica" msgstr "" #. :JAM:388: #: zypp/CountryCode.cc:269 msgid "Jordan" msgstr "" #. :JOR:400: #: zypp/CountryCode.cc:270 msgid "Japan" msgstr "" #. :JPN:392: #: zypp/CountryCode.cc:271 msgid "Kenya" msgstr "" #. :KEN:404: #: zypp/CountryCode.cc:272 msgid "Kyrgyzstan" msgstr "" #. :KGZ:417: #: zypp/CountryCode.cc:273 msgid "Cambodia" msgstr "" #. :KHM:116: #: zypp/CountryCode.cc:274 msgid "Kiribati" msgstr "" #. :KIR:296: #: zypp/CountryCode.cc:275 msgid "Comoros" msgstr "" #. :COM:174: #: zypp/CountryCode.cc:276 msgid "Saint Kitts and Nevis" msgstr "" #. :KNA:659: #: zypp/CountryCode.cc:277 msgid "North Korea" msgstr "" #. :PRK:408: #: zypp/CountryCode.cc:278 msgid "South Korea" msgstr "" #. :KOR:410: #: zypp/CountryCode.cc:279 msgid "Kuwait" msgstr "" #. :KWT:414: #: zypp/CountryCode.cc:280 msgid "Cayman Islands" msgstr "" #. :CYM:136: #: zypp/CountryCode.cc:281 msgid "Kazakhstan" msgstr "" #. :KAZ:398: #: zypp/CountryCode.cc:282 msgid "Lao People's Democratic Republic" msgstr "" #. :LAO:418: #: zypp/CountryCode.cc:283 msgid "Lebanon" msgstr "" #. :LBN:422: #: zypp/CountryCode.cc:284 msgid "Saint Lucia" msgstr "" #. :LCA:662: #: zypp/CountryCode.cc:285 msgid "Liechtenstein" msgstr "" #. :LIE:438: #: zypp/CountryCode.cc:286 msgid "Sri Lanka" msgstr "" #. :LKA:144: #: zypp/CountryCode.cc:287 msgid "Liberia" msgstr "" #. :LBR:430: #: zypp/CountryCode.cc:288 msgid "Lesotho" msgstr "" #. :LSO:426: #: zypp/CountryCode.cc:289 msgid "Lithuania" msgstr "" #. :LTU:440: #: zypp/CountryCode.cc:290 msgid "Luxembourg" msgstr "" #. :LUX:442: #: zypp/CountryCode.cc:291 msgid "Latvia" msgstr "" #. :LVA:428: #: zypp/CountryCode.cc:292 msgid "Libya" msgstr "" #. :LBY:434: #: zypp/CountryCode.cc:293 msgid "Morocco" msgstr "" #. :MAR:504: #: zypp/CountryCode.cc:294 msgid "Monaco" msgstr "" #. :MCO:492: #: zypp/CountryCode.cc:295 msgid "Moldova" msgstr "" #. :MDA:498: #: zypp/CountryCode.cc:296 msgid "Montenegro" msgstr "" #: zypp/CountryCode.cc:297 msgid "Saint Martin" msgstr "" #: zypp/CountryCode.cc:298 msgid "Madagascar" msgstr "" #. :MDG:450: #: zypp/CountryCode.cc:299 msgid "Marshall Islands" msgstr "" #. :MHL:584: #: zypp/CountryCode.cc:300 msgid "Macedonia" msgstr "" #. :MKD:807: #: zypp/CountryCode.cc:301 msgid "Mali" msgstr "" #. :MLI:466: #: zypp/CountryCode.cc:302 msgid "Myanmar" msgstr "" #. :MMR:104: #: zypp/CountryCode.cc:303 msgid "Mongolia" msgstr "" #. :MNG:496: #: zypp/CountryCode.cc:304 msgid "Macao" msgstr "" #. :MAC:446: #: zypp/CountryCode.cc:305 msgid "Northern Mariana Islands" msgstr "" #. :MNP:580: #: zypp/CountryCode.cc:306 msgid "Martinique" msgstr "" #. :MTQ:474: #: zypp/CountryCode.cc:307 msgid "Mauritania" msgstr "" #. :MRT:478: #: zypp/CountryCode.cc:308 msgid "Montserrat" msgstr "" #. :MSR:500: #: zypp/CountryCode.cc:309 msgid "Malta" msgstr "" #. :MLT:470: #: zypp/CountryCode.cc:310 msgid "Mauritius" msgstr "" #. :MUS:480: #: zypp/CountryCode.cc:311 msgid "Maldives" msgstr "" #. :MDV:462: #: zypp/CountryCode.cc:312 msgid "Malawi" msgstr "" #. :MWI:454: #: zypp/CountryCode.cc:313 msgid "Mexico" msgstr "" #. :MEX:484: #: zypp/CountryCode.cc:314 msgid "Malaysia" msgstr "" #. :MYS:458: #: zypp/CountryCode.cc:315 msgid "Mozambique" msgstr "" #. :MOZ:508: #: zypp/CountryCode.cc:316 msgid "Namibia" msgstr "" #. :NAM:516: #: zypp/CountryCode.cc:317 msgid "New Caledonia" msgstr "" #. :NCL:540: #: zypp/CountryCode.cc:318 msgid "Niger" msgstr "" #. :NER:562: #: zypp/CountryCode.cc:319 msgid "Norfolk Island" msgstr "" #. :NFK:574: #: zypp/CountryCode.cc:320 msgid "Nigeria" msgstr "" #. :NGA:566: #: zypp/CountryCode.cc:321 msgid "Nicaragua" msgstr "" #. :NIC:558: #: zypp/CountryCode.cc:322 msgid "Netherlands" msgstr "" #. :NLD:528: #: zypp/CountryCode.cc:323 msgid "Norway" msgstr "" #. :NOR:578: #: zypp/CountryCode.cc:324 msgid "Nepal" msgstr "" #. :NPL:524: #. language code: nau na #: zypp/CountryCode.cc:325 zypp/LanguageCode.cc:781 msgid "Nauru" msgstr "" #. :NRU:520: #: zypp/CountryCode.cc:326 msgid "Niue" msgstr "" #. :NIU:570: #: zypp/CountryCode.cc:327 msgid "New Zealand" msgstr "" #. :NZL:554: #: zypp/CountryCode.cc:328 msgid "Oman" msgstr "" #. :OMN:512: #: zypp/CountryCode.cc:329 msgid "Panama" msgstr "" #. :PAN:591: #: zypp/CountryCode.cc:330 msgid "Peru" msgstr "" #. :PER:604: #: zypp/CountryCode.cc:331 msgid "French Polynesia" msgstr "" #. :PYF:258: #: zypp/CountryCode.cc:332 msgid "Papua New Guinea" msgstr "" #. :PNG:598: #: zypp/CountryCode.cc:333 msgid "Philippines" msgstr "" #. :PHL:608: #: zypp/CountryCode.cc:334 msgid "Pakistan" msgstr "" #. :PAK:586: #: zypp/CountryCode.cc:335 msgid "Poland" msgstr "" #. :POL:616: #: zypp/CountryCode.cc:336 msgid "Saint Pierre and Miquelon" msgstr "" #. :SPM:666: #: zypp/CountryCode.cc:337 msgid "Pitcairn" msgstr "" #. :PCN:612: #: zypp/CountryCode.cc:338 msgid "Puerto Rico" msgstr "" #. :PRI:630: #: zypp/CountryCode.cc:339 msgid "Palestinian Territory" msgstr "" #. :PSE:275: #: zypp/CountryCode.cc:340 msgid "Portugal" msgstr "" #. :PRT:620: #: zypp/CountryCode.cc:341 msgid "Palau" msgstr "" #. :PLW:585: #: zypp/CountryCode.cc:342 msgid "Paraguay" msgstr "" #. :PRY:600: #: zypp/CountryCode.cc:343 msgid "Qatar" msgstr "" #. :QAT:634: #: zypp/CountryCode.cc:344 msgid "Reunion" msgstr "" #. :REU:638: #: zypp/CountryCode.cc:345 msgid "Romania" msgstr "" #. :ROU:642: #: zypp/CountryCode.cc:346 msgid "Serbia" msgstr "" #: zypp/CountryCode.cc:347 msgid "Russian Federation" msgstr "" #. :RUS:643: #: zypp/CountryCode.cc:348 msgid "Rwanda" msgstr "" #. :RWA:646: #: zypp/CountryCode.cc:349 msgid "Saudi Arabia" msgstr "" #. :SAU:682: #: zypp/CountryCode.cc:350 msgid "Solomon Islands" msgstr "" #. :SLB:090: #: zypp/CountryCode.cc:351 msgid "Seychelles" msgstr "" #. :SYC:690: #: zypp/CountryCode.cc:352 msgid "Sudan" msgstr "" #. :SDN:736: #: zypp/CountryCode.cc:353 msgid "Sweden" msgstr "" #. :SWE:752: #: zypp/CountryCode.cc:354 msgid "Singapore" msgstr "" #. :SGP:702: #: zypp/CountryCode.cc:355 msgid "Saint Helena" msgstr "" #. :SHN:654: #: zypp/CountryCode.cc:356 msgid "Slovenia" msgstr "" #. :SVN:705: #: zypp/CountryCode.cc:357 msgid "Svalbard and Jan Mayen" msgstr "" #. :SJM:744: #: zypp/CountryCode.cc:358 msgid "Slovakia" msgstr "" #. :SVK:703: #: zypp/CountryCode.cc:359 msgid "Sierra Leone" msgstr "" #. :SLE:694: #: zypp/CountryCode.cc:360 msgid "San Marino" msgstr "" #. :SMR:674: #: zypp/CountryCode.cc:361 msgid "Senegal" msgstr "" #. :SEN:686: #: zypp/CountryCode.cc:362 msgid "Somalia" msgstr "" #. :SOM:706: #: zypp/CountryCode.cc:363 msgid "Suriname" msgstr "" #. :SUR:740: #: zypp/CountryCode.cc:364 msgid "Sao Tome and Principe" msgstr "" #. :STP:678: #: zypp/CountryCode.cc:365 msgid "El Salvador" msgstr "" #. :SLV:222: #: zypp/CountryCode.cc:366 msgid "Syria" msgstr "" #. :SYR:760: #: zypp/CountryCode.cc:367 msgid "Swaziland" msgstr "" #. :SWZ:748: #: zypp/CountryCode.cc:368 msgid "Turks and Caicos Islands" msgstr "" #. :TCA:796: #: zypp/CountryCode.cc:369 msgid "Chad" msgstr "" #. :TCD:148: #: zypp/CountryCode.cc:370 msgid "French Southern Territories" msgstr "" #. :ATF:260: #: zypp/CountryCode.cc:371 msgid "Togo" msgstr "" #. :TGO:768: #: zypp/CountryCode.cc:372 msgid "Thailand" msgstr "" #. :THA:764: #: zypp/CountryCode.cc:373 msgid "Tajikistan" msgstr "" #. :TJK:762: #. language code: tkl #: zypp/CountryCode.cc:374 zypp/LanguageCode.cc:1045 msgid "Tokelau" msgstr "" #. :TKL:772: #: zypp/CountryCode.cc:375 msgid "Turkmenistan" msgstr "" #. :TKM:795: #: zypp/CountryCode.cc:376 msgid "Tunisia" msgstr "" #. :TUN:788: #: zypp/CountryCode.cc:377 msgid "Tonga" msgstr "" #. :TON:776: #: zypp/CountryCode.cc:378 msgid "East Timor" msgstr "" #. :TLS:626: #: zypp/CountryCode.cc:379 msgid "Turkey" msgstr "" #. :TUR:792: #: zypp/CountryCode.cc:380 msgid "Trinidad and Tobago" msgstr "" #. :TTO:780: #. language code: tvl #: zypp/CountryCode.cc:381 zypp/LanguageCode.cc:1075 msgid "Tuvalu" msgstr "" #. :TUV:798: #: zypp/CountryCode.cc:382 msgid "Taiwan" msgstr "" #. :TWN:158: #: zypp/CountryCode.cc:383 msgid "Tanzania" msgstr "" #. :TZA:834: #: zypp/CountryCode.cc:384 msgid "Ukraine" msgstr "" #. :UKR:804: #: zypp/CountryCode.cc:385 msgid "Uganda" msgstr "" #. :UGA:800: #: zypp/CountryCode.cc:386 msgid "United States Minor Outlying Islands" msgstr "" #. :UMI:581: #: zypp/CountryCode.cc:387 msgid "United States" msgstr "" #. :USA:840: #: zypp/CountryCode.cc:388 msgid "Uruguay" msgstr "" #. :URY:858: #: zypp/CountryCode.cc:389 msgid "Uzbekistan" msgstr "" #. :UZB:860: #: zypp/CountryCode.cc:390 msgid "Holy See (Vatican City State)" msgstr "" #. :VAT:336: #: zypp/CountryCode.cc:391 msgid "Saint Vincent and the Grenadines" msgstr "" #. :VCT:670: #: zypp/CountryCode.cc:392 msgid "Venezuela" msgstr "" #. :VEN:862: #: zypp/CountryCode.cc:393 msgid "British Virgin Islands" msgstr "" #. :VGB:092: #: zypp/CountryCode.cc:394 msgid "Virgin Islands, U.S." msgstr "" #. :VIR:850: #: zypp/CountryCode.cc:395 msgid "Vietnam" msgstr "" #. :VNM:704: #: zypp/CountryCode.cc:396 msgid "Vanuatu" msgstr "" #. :VUT:548: #: zypp/CountryCode.cc:397 msgid "Wallis and Futuna" msgstr "" #. :WLF:876: #: zypp/CountryCode.cc:398 msgid "Samoa" msgstr "" #. :WSM:882: #: zypp/CountryCode.cc:399 msgid "Yemen" msgstr "" #. :YEM:887: #: zypp/CountryCode.cc:400 msgid "Mayotte" msgstr "" #. :MYT:175: #: zypp/CountryCode.cc:401 msgid "South Africa" msgstr "" #. :ZAF:710: #: zypp/CountryCode.cc:402 msgid "Zambia" msgstr "" #. :ZMB:894: #: zypp/CountryCode.cc:403 msgid "Zimbabwe" msgstr "" #: zypp/Dep.cc:96 msgid "Provides" msgstr "" #: zypp/Dep.cc:97 msgid "Prerequires" msgstr "" #: zypp/Dep.cc:98 msgid "Requires" msgstr "" #: zypp/Dep.cc:99 msgid "Conflicts" msgstr "" #: zypp/Dep.cc:100 msgid "Obsoletes" msgstr "" #: zypp/Dep.cc:101 msgid "Recommends" msgstr "" #: zypp/Dep.cc:102 msgid "Suggests" msgstr "" #: zypp/Dep.cc:103 msgid "Enhances" msgstr "" #: zypp/Dep.cc:104 msgid "Supplements" msgstr "" #: zypp/LanguageCode.cc:49 msgid "Unknown language: " msgstr "" #. language code: aar aa #: zypp/LanguageCode.cc:161 msgid "Afar" msgstr "" #. language code: abk ab #: zypp/LanguageCode.cc:163 msgid "Abkhazian" msgstr "" #. language code: ace #: zypp/LanguageCode.cc:165 msgid "Achinese" msgstr "" #. language code: ach #: zypp/LanguageCode.cc:167 msgid "Acoli" msgstr "" #. language code: ada #: zypp/LanguageCode.cc:169 msgid "Adangme" msgstr "" #. language code: ady #: zypp/LanguageCode.cc:171 msgid "Adyghe" msgstr "" #. language code: afa #: zypp/LanguageCode.cc:173 msgid "Afro-Asiatic (Other)" msgstr "" #. language code: afh #: zypp/LanguageCode.cc:175 msgid "Afrihili" msgstr "" #. language code: afr af #: zypp/LanguageCode.cc:177 msgid "Afrikaans" msgstr "" #. language code: ain #: zypp/LanguageCode.cc:179 msgid "Ainu" msgstr "" #. language code: aka ak #: zypp/LanguageCode.cc:181 msgid "Akan" msgstr "" #. language code: akk #: zypp/LanguageCode.cc:183 msgid "Akkadian" msgstr "" #. language code: alb sqi sq #: zypp/LanguageCode.cc:185 zypp/LanguageCode.cc:187 msgid "Albanian" msgstr "" #. language code: ale #: zypp/LanguageCode.cc:189 msgid "Aleut" msgstr "" #. language code: alg #: zypp/LanguageCode.cc:191 msgid "Algonquian Languages" msgstr "" #. language code: alt #: zypp/LanguageCode.cc:193 msgid "Southern Altai" msgstr "" #. language code: amh am #: zypp/LanguageCode.cc:195 msgid "Amharic" msgstr "" #. language code: ang #: zypp/LanguageCode.cc:197 msgid "English, Old (ca.450-1100)" msgstr "" #. language code: apa #: zypp/LanguageCode.cc:199 msgid "Apache Languages" msgstr "" #. language code: ara ar #: zypp/LanguageCode.cc:201 msgid "Arabic" msgstr "" #. language code: arc #: zypp/LanguageCode.cc:203 msgid "Aramaic" msgstr "" #. language code: arg an #: zypp/LanguageCode.cc:205 msgid "Aragonese" msgstr "" #. language code: arm hye hy #: zypp/LanguageCode.cc:207 zypp/LanguageCode.cc:209 msgid "Armenian" msgstr "" #. language code: arn #: zypp/LanguageCode.cc:211 msgid "Araucanian" msgstr "" #. language code: arp #: zypp/LanguageCode.cc:213 msgid "Arapaho" msgstr "" #. language code: art #: zypp/LanguageCode.cc:215 msgid "Artificial (Other)" msgstr "" #. language code: arw #: zypp/LanguageCode.cc:217 msgid "Arawak" msgstr "" #. language code: asm as #: zypp/LanguageCode.cc:219 msgid "Assamese" msgstr "" #. language code: ast #: zypp/LanguageCode.cc:221 msgid "Asturian" msgstr "" #. language code: ath #: zypp/LanguageCode.cc:223 msgid "Athapascan Languages" msgstr "" #. language code: aus #: zypp/LanguageCode.cc:225 msgid "Australian Languages" msgstr "" #. language code: ava av #: zypp/LanguageCode.cc:227 msgid "Avaric" msgstr "" #. language code: ave ae #: zypp/LanguageCode.cc:229 msgid "Avestan" msgstr "" #. language code: awa #: zypp/LanguageCode.cc:231 msgid "Awadhi" msgstr "" #. language code: aym ay #: zypp/LanguageCode.cc:233 msgid "Aymara" msgstr "" #. language code: aze az #: zypp/LanguageCode.cc:235 msgid "Azerbaijani" msgstr "" #. language code: bad #: zypp/LanguageCode.cc:237 msgid "Banda" msgstr "" #. language code: bai #: zypp/LanguageCode.cc:239 msgid "Bamileke Languages" msgstr "" #. language code: bak ba #: zypp/LanguageCode.cc:241 msgid "Bashkir" msgstr "" #. language code: bal #: zypp/LanguageCode.cc:243 msgid "Baluchi" msgstr "" #. language code: bam bm #: zypp/LanguageCode.cc:245 msgid "Bambara" msgstr "" #. language code: ban #: zypp/LanguageCode.cc:247 msgid "Balinese" msgstr "" #. language code: baq eus eu #: zypp/LanguageCode.cc:249 zypp/LanguageCode.cc:251 msgid "Basque" msgstr "" #. language code: bas #: zypp/LanguageCode.cc:253 msgid "Basa" msgstr "" #. language code: bat #: zypp/LanguageCode.cc:255 msgid "Baltic (Other)" msgstr "" #. language code: bej #: zypp/LanguageCode.cc:257 msgid "Beja" msgstr "" #. language code: bel be #: zypp/LanguageCode.cc:259 msgid "Belarusian" msgstr "" #. language code: bem #: zypp/LanguageCode.cc:261 msgid "Bemba" msgstr "" #. language code: ben bn #: zypp/LanguageCode.cc:263 msgid "Bengali" msgstr "" #. language code: ber #: zypp/LanguageCode.cc:265 msgid "Berber (Other)" msgstr "" #. language code: bho #: zypp/LanguageCode.cc:267 msgid "Bhojpuri" msgstr "" #. language code: bih bh #: zypp/LanguageCode.cc:269 msgid "Bihari" msgstr "" #. language code: bik #: zypp/LanguageCode.cc:271 msgid "Bikol" msgstr "" #. language code: bin #: zypp/LanguageCode.cc:273 msgid "Bini" msgstr "" #. language code: bis bi #: zypp/LanguageCode.cc:275 msgid "Bislama" msgstr "" #. language code: bla #: zypp/LanguageCode.cc:277 msgid "Siksika" msgstr "" #. language code: bnt #: zypp/LanguageCode.cc:279 msgid "Bantu (Other)" msgstr "" #. language code: bos bs #: zypp/LanguageCode.cc:281 msgid "Bosnian" msgstr "" #. language code: bra #: zypp/LanguageCode.cc:283 msgid "Braj" msgstr "" #. language code: bre br #: zypp/LanguageCode.cc:285 msgid "Breton" msgstr "" #. language code: btk #: zypp/LanguageCode.cc:287 msgid "Batak (Indonesia)" msgstr "" #. language code: bua #: zypp/LanguageCode.cc:289 msgid "Buriat" msgstr "" #. language code: bug #: zypp/LanguageCode.cc:291 msgid "Buginese" msgstr "" #. language code: bul bg #: zypp/LanguageCode.cc:293 msgid "Bulgarian" msgstr "" #. language code: bur mya my #: zypp/LanguageCode.cc:295 zypp/LanguageCode.cc:297 msgid "Burmese" msgstr "" #. language code: byn #: zypp/LanguageCode.cc:299 msgid "Blin" msgstr "" #. language code: cad #: zypp/LanguageCode.cc:301 msgid "Caddo" msgstr "" #. language code: cai #: zypp/LanguageCode.cc:303 msgid "Central American Indian (Other)" msgstr "" #. language code: car #: zypp/LanguageCode.cc:305 msgid "Carib" msgstr "" #. language code: cat ca #: zypp/LanguageCode.cc:307 msgid "Catalan" msgstr "" #. language code: cau #: zypp/LanguageCode.cc:309 msgid "Caucasian (Other)" msgstr "" #. language code: ceb #: zypp/LanguageCode.cc:311 msgid "Cebuano" msgstr "" #. language code: cel #: zypp/LanguageCode.cc:313 msgid "Celtic (Other)" msgstr "" #. language code: cha ch #: zypp/LanguageCode.cc:315 msgid "Chamorro" msgstr "" #. language code: chb #: zypp/LanguageCode.cc:317 msgid "Chibcha" msgstr "" #. language code: che ce #: zypp/LanguageCode.cc:319 msgid "Chechen" msgstr "" #. language code: chg #: zypp/LanguageCode.cc:321 msgid "Chagatai" msgstr "" #. language code: chi zho zh #: zypp/LanguageCode.cc:323 zypp/LanguageCode.cc:325 msgid "Chinese" msgstr "" #. language code: chk #: zypp/LanguageCode.cc:327 msgid "Chuukese" msgstr "" #. language code: chm #: zypp/LanguageCode.cc:329 msgid "Mari" msgstr "" #. language code: chn #: zypp/LanguageCode.cc:331 msgid "Chinook Jargon" msgstr "" #. language code: cho #: zypp/LanguageCode.cc:333 msgid "Choctaw" msgstr "" #. language code: chp #: zypp/LanguageCode.cc:335 msgid "Chipewyan" msgstr "" #. language code: chr #: zypp/LanguageCode.cc:337 msgid "Cherokee" msgstr "" #. language code: chu cu #: zypp/LanguageCode.cc:339 msgid "Church Slavic" msgstr "" #. language code: chv cv #: zypp/LanguageCode.cc:341 msgid "Chuvash" msgstr "" #. language code: chy #: zypp/LanguageCode.cc:343 msgid "Cheyenne" msgstr "" #. language code: cmc #: zypp/LanguageCode.cc:345 msgid "Chamic Languages" msgstr "" #. language code: cop #: zypp/LanguageCode.cc:347 msgid "Coptic" msgstr "" #. language code: cor kw #: zypp/LanguageCode.cc:349 msgid "Cornish" msgstr "" #. language code: cos co #: zypp/LanguageCode.cc:351 msgid "Corsican" msgstr "" #. language code: cpe #: zypp/LanguageCode.cc:353 msgid "Creoles and Pidgins, English-Based (Other)" msgstr "" #. language code: cpf #: zypp/LanguageCode.cc:355 msgid "Creoles and Pidgins, French-Based (Other)" msgstr "" #. language code: cpp #: zypp/LanguageCode.cc:357 msgid "Creoles and Pidgins, Portuguese-Based (Other)" msgstr "" #. language code: cre cr #: zypp/LanguageCode.cc:359 msgid "Cree" msgstr "" #. language code: crh #: zypp/LanguageCode.cc:361 msgid "Crimean Tatar" msgstr "" #. language code: crp #: zypp/LanguageCode.cc:363 msgid "Creoles and Pidgins (Other)" msgstr "" #. language code: csb #: zypp/LanguageCode.cc:365 msgid "Kashubian" msgstr "" #. language code: cus #: zypp/LanguageCode.cc:367 msgid "Cushitic (Other)" msgstr "" #. language code: cze ces cs #: zypp/LanguageCode.cc:369 zypp/LanguageCode.cc:371 msgid "Czech" msgstr "" #. language code: dak #: zypp/LanguageCode.cc:373 msgid "Dakota" msgstr "" #. language code: dan da #: zypp/LanguageCode.cc:375 msgid "Danish" msgstr "" #. language code: dar #: zypp/LanguageCode.cc:377 msgid "Dargwa" msgstr "" #. language code: day #: zypp/LanguageCode.cc:379 msgid "Dayak" msgstr "" #. language code: del #: zypp/LanguageCode.cc:381 msgid "Delaware" msgstr "" #. language code: den #: zypp/LanguageCode.cc:383 msgid "Slave (Athapascan)" msgstr "" #. language code: dgr #: zypp/LanguageCode.cc:385 msgid "Dogrib" msgstr "" #. language code: din #: zypp/LanguageCode.cc:387 msgid "Dinka" msgstr "" #. language code: div dv #: zypp/LanguageCode.cc:389 msgid "Divehi" msgstr "" #. language code: doi #: zypp/LanguageCode.cc:391 msgid "Dogri" msgstr "" #. language code: dra #: zypp/LanguageCode.cc:393 msgid "Dravidian (Other)" msgstr "" #. language code: dsb #: zypp/LanguageCode.cc:395 msgid "Lower Sorbian" msgstr "" #. language code: dua #: zypp/LanguageCode.cc:397 msgid "Duala" msgstr "" #. language code: dum #: zypp/LanguageCode.cc:399 msgid "Dutch, Middle (ca.1050-1350)" msgstr "" #. language code: dut nld nl #: zypp/LanguageCode.cc:401 zypp/LanguageCode.cc:403 msgid "Dutch" msgstr "" #. language code: dyu #: zypp/LanguageCode.cc:405 msgid "Dyula" msgstr "" #. language code: dzo dz #: zypp/LanguageCode.cc:407 msgid "Dzongkha" msgstr "" #. language code: efi #: zypp/LanguageCode.cc:409 msgid "Efik" msgstr "" #. language code: egy #: zypp/LanguageCode.cc:411 msgid "Egyptian (Ancient)" msgstr "" #. language code: eka #: zypp/LanguageCode.cc:413 msgid "Ekajuk" msgstr "" #. language code: elx #: zypp/LanguageCode.cc:415 msgid "Elamite" msgstr "" #. language code: eng en #: zypp/LanguageCode.cc:417 msgid "English" msgstr "" #. language code: enm #: zypp/LanguageCode.cc:419 msgid "English, Middle (1100-1500)" msgstr "" #. language code: epo eo #: zypp/LanguageCode.cc:421 msgid "Esperanto" msgstr "" #. language code: est et #: zypp/LanguageCode.cc:423 msgid "Estonian" msgstr "" #. language code: ewe ee #: zypp/LanguageCode.cc:425 msgid "Ewe" msgstr "" #. language code: ewo #: zypp/LanguageCode.cc:427 msgid "Ewondo" msgstr "" #. language code: fan #: zypp/LanguageCode.cc:429 msgid "Fang" msgstr "" #. language code: fao fo #: zypp/LanguageCode.cc:431 msgid "Faroese" msgstr "" #. language code: fat #: zypp/LanguageCode.cc:433 msgid "Fanti" msgstr "" #. language code: fij fj #: zypp/LanguageCode.cc:435 msgid "Fijian" msgstr "" #. language code: fil #: zypp/LanguageCode.cc:437 msgid "Filipino" msgstr "" #. language code: fin fi #: zypp/LanguageCode.cc:439 msgid "Finnish" msgstr "" #. language code: fiu #: zypp/LanguageCode.cc:441 msgid "Finno-Ugrian (Other)" msgstr "" #. language code: fon #: zypp/LanguageCode.cc:443 msgid "Fon" msgstr "" #. language code: fre fra fr #: zypp/LanguageCode.cc:445 zypp/LanguageCode.cc:447 msgid "French" msgstr "" #. language code: frm #: zypp/LanguageCode.cc:449 msgid "French, Middle (ca.1400-1600)" msgstr "" #. language code: fro #: zypp/LanguageCode.cc:451 msgid "French, Old (842-ca.1400)" msgstr "" #. language code: fry fy #: zypp/LanguageCode.cc:453 msgid "Frisian" msgstr "" #. language code: ful ff #: zypp/LanguageCode.cc:455 msgid "Fulah" msgstr "" #. language code: fur #: zypp/LanguageCode.cc:457 msgid "Friulian" msgstr "" #. language code: gaa #: zypp/LanguageCode.cc:459 msgid "Ga" msgstr "" #. language code: gay #: zypp/LanguageCode.cc:461 msgid "Gayo" msgstr "" #. language code: gba #: zypp/LanguageCode.cc:463 msgid "Gbaya" msgstr "" #. language code: gem #: zypp/LanguageCode.cc:465 msgid "Germanic (Other)" msgstr "" #. language code: geo kat ka #: zypp/LanguageCode.cc:467 zypp/LanguageCode.cc:469 msgid "Georgian" msgstr "" #. language code: ger deu de #: zypp/LanguageCode.cc:471 zypp/LanguageCode.cc:473 msgid "German" msgstr "" #. language code: gez #: zypp/LanguageCode.cc:475 msgid "Geez" msgstr "" #. language code: gil #: zypp/LanguageCode.cc:477 msgid "Gilbertese" msgstr "" #. language code: gla gd #: zypp/LanguageCode.cc:479 msgid "Gaelic" msgstr "" #. language code: gle ga #: zypp/LanguageCode.cc:481 msgid "Irish" msgstr "" #. language code: glg gl #: zypp/LanguageCode.cc:483 msgid "Galician" msgstr "" #. language code: glv gv #: zypp/LanguageCode.cc:485 msgid "Manx" msgstr "" #. language code: gmh #: zypp/LanguageCode.cc:487 msgid "German, Middle High (ca.1050-1500)" msgstr "" #. language code: goh #: zypp/LanguageCode.cc:489 msgid "German, Old High (ca.750-1050)" msgstr "" #. language code: gon #: zypp/LanguageCode.cc:491 msgid "Gondi" msgstr "" #. language code: gor #: zypp/LanguageCode.cc:493 msgid "Gorontalo" msgstr "" #. language code: got #: zypp/LanguageCode.cc:495 msgid "Gothic" msgstr "" #. language code: grb #: zypp/LanguageCode.cc:497 msgid "Grebo" msgstr "" #. language code: grc #: zypp/LanguageCode.cc:499 msgid "Greek, Ancient (to 1453)" msgstr "" #. language code: gre ell el #: zypp/LanguageCode.cc:501 zypp/LanguageCode.cc:503 msgid "Greek, Modern (1453-)" msgstr "" #. language code: grn gn #: zypp/LanguageCode.cc:505 msgid "Guarani" msgstr "" #. language code: guj gu #: zypp/LanguageCode.cc:507 msgid "Gujarati" msgstr "" #. language code: gwi #: zypp/LanguageCode.cc:509 msgid "Gwich'in" msgstr "" #. language code: hai #: zypp/LanguageCode.cc:511 msgid "Haida" msgstr "" #. language code: hat ht #: zypp/LanguageCode.cc:513 msgid "Haitian" msgstr "" #. language code: hau ha #: zypp/LanguageCode.cc:515 msgid "Hausa" msgstr "" #. language code: haw #: zypp/LanguageCode.cc:517 msgid "Hawaiian" msgstr "" #. language code: heb he #: zypp/LanguageCode.cc:519 msgid "Hebrew" msgstr "" #. language code: her hz #: zypp/LanguageCode.cc:521 msgid "Herero" msgstr "" #. language code: hil #: zypp/LanguageCode.cc:523 msgid "Hiligaynon" msgstr "" #. language code: him #: zypp/LanguageCode.cc:525 msgid "Himachali" msgstr "" #. language code: hin hi #: zypp/LanguageCode.cc:527 msgid "Hindi" msgstr "" #. language code: hit #: zypp/LanguageCode.cc:529 msgid "Hittite" msgstr "" #. language code: hmn #: zypp/LanguageCode.cc:531 msgid "Hmong" msgstr "" #. language code: hmo ho #: zypp/LanguageCode.cc:533 msgid "Hiri Motu" msgstr "" #. language code: hsb #: zypp/LanguageCode.cc:535 msgid "Upper Sorbian" msgstr "" #. language code: hun hu #: zypp/LanguageCode.cc:537 msgid "Hungarian" msgstr "" #. language code: hup #: zypp/LanguageCode.cc:539 msgid "Hupa" msgstr "" #. language code: iba #: zypp/LanguageCode.cc:541 msgid "Iban" msgstr "" #. language code: ibo ig #: zypp/LanguageCode.cc:543 msgid "Igbo" msgstr "" #. language code: ice isl is #: zypp/LanguageCode.cc:545 zypp/LanguageCode.cc:547 msgid "Icelandic" msgstr "" #. language code: ido io #: zypp/LanguageCode.cc:549 msgid "Ido" msgstr "" #. language code: iii ii #: zypp/LanguageCode.cc:551 msgid "Sichuan Yi" msgstr "" #. language code: ijo #: zypp/LanguageCode.cc:553 msgid "Ijo" msgstr "" #. language code: iku iu #: zypp/LanguageCode.cc:555 msgid "Inuktitut" msgstr "" #. language code: ile ie #: zypp/LanguageCode.cc:557 msgid "Interlingue" msgstr "" #. language code: ilo #: zypp/LanguageCode.cc:559 msgid "Iloko" msgstr "" #. language code: ina ia #: zypp/LanguageCode.cc:561 msgid "Interlingua (International Auxiliary Language Association)" msgstr "" #. language code: inc #: zypp/LanguageCode.cc:563 msgid "Indic (Other)" msgstr "" #. language code: ind id #: zypp/LanguageCode.cc:565 msgid "Indonesian" msgstr "" #. language code: ine #: zypp/LanguageCode.cc:567 msgid "Indo-European (Other)" msgstr "" #. language code: inh #: zypp/LanguageCode.cc:569 msgid "Ingush" msgstr "" #. language code: ipk ik #: zypp/LanguageCode.cc:571 msgid "Inupiaq" msgstr "" #. language code: ira #: zypp/LanguageCode.cc:573 msgid "Iranian (Other)" msgstr "" #. language code: iro #: zypp/LanguageCode.cc:575 msgid "Iroquoian Languages" msgstr "" #. language code: ita it #: zypp/LanguageCode.cc:577 msgid "Italian" msgstr "" #. language code: jav jv #: zypp/LanguageCode.cc:579 msgid "Javanese" msgstr "" #. language code: jbo #: zypp/LanguageCode.cc:581 msgid "Lojban" msgstr "" #. language code: jpn ja #: zypp/LanguageCode.cc:583 msgid "Japanese" msgstr "" #. language code: jpr #: zypp/LanguageCode.cc:585 msgid "Judeo-Persian" msgstr "" #. language code: jrb #: zypp/LanguageCode.cc:587 msgid "Judeo-Arabic" msgstr "" #. language code: kaa #: zypp/LanguageCode.cc:589 msgid "Kara-Kalpak" msgstr "" #. language code: kab #: zypp/LanguageCode.cc:591 msgid "Kabyle" msgstr "" #. language code: kac #: zypp/LanguageCode.cc:593 msgid "Kachin" msgstr "" #. language code: kal kl #: zypp/LanguageCode.cc:595 msgid "Kalaallisut" msgstr "" #. language code: kam #: zypp/LanguageCode.cc:597 msgid "Kamba" msgstr "" #. language code: kan kn #: zypp/LanguageCode.cc:599 msgid "Kannada" msgstr "" #. language code: kar #: zypp/LanguageCode.cc:601 msgid "Karen" msgstr "" #. language code: kas ks #: zypp/LanguageCode.cc:603 msgid "Kashmiri" msgstr "" #. language code: kau kr #: zypp/LanguageCode.cc:605 msgid "Kanuri" msgstr "" #. language code: kaw #: zypp/LanguageCode.cc:607 msgid "Kawi" msgstr "" #. language code: kaz kk #: zypp/LanguageCode.cc:609 msgid "Kazakh" msgstr "" #. language code: kbd #: zypp/LanguageCode.cc:611 msgid "Kabardian" msgstr "" #. language code: kha #: zypp/LanguageCode.cc:613 msgid "Khasi" msgstr "" #. language code: khi #: zypp/LanguageCode.cc:615 msgid "Khoisan (Other)" msgstr "" #. language code: khm km #: zypp/LanguageCode.cc:617 msgid "Khmer" msgstr "" #. language code: kho #: zypp/LanguageCode.cc:619 msgid "Khotanese" msgstr "" #. language code: kik ki #: zypp/LanguageCode.cc:621 msgid "Kikuyu" msgstr "" #. language code: kin rw #: zypp/LanguageCode.cc:623 msgid "Kinyarwanda" msgstr "" #. language code: kir ky #: zypp/LanguageCode.cc:625 msgid "Kirghiz" msgstr "" #. language code: kmb #: zypp/LanguageCode.cc:627 msgid "Kimbundu" msgstr "" #. language code: kok #: zypp/LanguageCode.cc:629 msgid "Konkani" msgstr "" #. language code: kom kv #: zypp/LanguageCode.cc:631 msgid "Komi" msgstr "" #. language code: kon kg #: zypp/LanguageCode.cc:633 msgid "Kongo" msgstr "" #. language code: kor ko #: zypp/LanguageCode.cc:635 msgid "Korean" msgstr "" #. language code: kos #: zypp/LanguageCode.cc:637 msgid "Kosraean" msgstr "" #. language code: kpe #: zypp/LanguageCode.cc:639 msgid "Kpelle" msgstr "" #. language code: krc #: zypp/LanguageCode.cc:641 msgid "Karachay-Balkar" msgstr "" #. language code: kro #: zypp/LanguageCode.cc:643 msgid "Kru" msgstr "" #. language code: kru #: zypp/LanguageCode.cc:645 msgid "Kurukh" msgstr "" #. language code: kua kj #: zypp/LanguageCode.cc:647 msgid "Kuanyama" msgstr "" #. language code: kum #: zypp/LanguageCode.cc:649 msgid "Kumyk" msgstr "" #. language code: kur ku #: zypp/LanguageCode.cc:651 msgid "Kurdish" msgstr "" #. language code: kut #: zypp/LanguageCode.cc:653 msgid "Kutenai" msgstr "" #. language code: lad #: zypp/LanguageCode.cc:655 msgid "Ladino" msgstr "" #. language code: lah #: zypp/LanguageCode.cc:657 msgid "Lahnda" msgstr "" #. language code: lam #: zypp/LanguageCode.cc:659 msgid "Lamba" msgstr "" #. language code: lao lo #: zypp/LanguageCode.cc:661 msgid "Lao" msgstr "" #. language code: lat la #: zypp/LanguageCode.cc:663 msgid "Latin" msgstr "" #. language code: lav lv #: zypp/LanguageCode.cc:665 msgid "Latvian" msgstr "" #. language code: lez #: zypp/LanguageCode.cc:667 msgid "Lezghian" msgstr "" #. language code: lim li #: zypp/LanguageCode.cc:669 msgid "Limburgan" msgstr "" #. language code: lin ln #: zypp/LanguageCode.cc:671 msgid "Lingala" msgstr "" #. language code: lit lt #: zypp/LanguageCode.cc:673 msgid "Lithuanian" msgstr "" #. language code: lol #: zypp/LanguageCode.cc:675 msgid "Mongo" msgstr "" #. language code: loz #: zypp/LanguageCode.cc:677 msgid "Lozi" msgstr "" #. language code: ltz lb #: zypp/LanguageCode.cc:679 msgid "Luxembourgish" msgstr "" #. language code: lua #: zypp/LanguageCode.cc:681 msgid "Luba-Lulua" msgstr "" #. language code: lub lu #: zypp/LanguageCode.cc:683 msgid "Luba-Katanga" msgstr "" #. language code: lug lg #: zypp/LanguageCode.cc:685 msgid "Ganda" msgstr "" #. language code: lui #: zypp/LanguageCode.cc:687 msgid "Luiseno" msgstr "" #. language code: lun #: zypp/LanguageCode.cc:689 msgid "Lunda" msgstr "" #. language code: luo #: zypp/LanguageCode.cc:691 msgid "Luo (Kenya and Tanzania)" msgstr "" #. language code: lus #: zypp/LanguageCode.cc:693 msgid "Lushai" msgstr "" #. language code: mac mkd mk #: zypp/LanguageCode.cc:695 zypp/LanguageCode.cc:697 msgid "Macedonian" msgstr "" #. language code: mad #: zypp/LanguageCode.cc:699 msgid "Madurese" msgstr "" #. language code: mag #: zypp/LanguageCode.cc:701 msgid "Magahi" msgstr "" #. language code: mah mh #: zypp/LanguageCode.cc:703 msgid "Marshallese" msgstr "" #. language code: mai #: zypp/LanguageCode.cc:705 msgid "Maithili" msgstr "" #. language code: mak #: zypp/LanguageCode.cc:707 msgid "Makasar" msgstr "" #. language code: mal ml #: zypp/LanguageCode.cc:709 msgid "Malayalam" msgstr "" #. language code: man #: zypp/LanguageCode.cc:711 msgid "Mandingo" msgstr "" #. language code: mao mri mi #: zypp/LanguageCode.cc:713 zypp/LanguageCode.cc:715 msgid "Maori" msgstr "" #. language code: map #: zypp/LanguageCode.cc:717 msgid "Austronesian (Other)" msgstr "" #. language code: mar mr #: zypp/LanguageCode.cc:719 msgid "Marathi" msgstr "" #. language code: mas #: zypp/LanguageCode.cc:721 msgid "Masai" msgstr "" #. language code: may msa ms #: zypp/LanguageCode.cc:723 zypp/LanguageCode.cc:725 msgid "Malay" msgstr "" #. language code: mdf #: zypp/LanguageCode.cc:727 msgid "Moksha" msgstr "" #. language code: mdr #: zypp/LanguageCode.cc:729 msgid "Mandar" msgstr "" #. language code: men #: zypp/LanguageCode.cc:731 msgid "Mende" msgstr "" #. language code: mga #: zypp/LanguageCode.cc:733 msgid "Irish, Middle (900-1200)" msgstr "" #. language code: mic #: zypp/LanguageCode.cc:735 msgid "Mi'kmaq" msgstr "" #. language code: min #: zypp/LanguageCode.cc:737 msgid "Minangkabau" msgstr "" #. language code: mis #: zypp/LanguageCode.cc:739 msgid "Miscellaneous Languages" msgstr "" #. language code: mkh #: zypp/LanguageCode.cc:741 msgid "Mon-Khmer (Other)" msgstr "" #. language code: mlg mg #: zypp/LanguageCode.cc:743 msgid "Malagasy" msgstr "" #. language code: mlt mt #: zypp/LanguageCode.cc:745 msgid "Maltese" msgstr "" #. language code: mnc #: zypp/LanguageCode.cc:747 msgid "Manchu" msgstr "" #. language code: mni #: zypp/LanguageCode.cc:749 msgid "Manipuri" msgstr "" #. language code: mno #: zypp/LanguageCode.cc:751 msgid "Manobo Languages" msgstr "" #. language code: moh #: zypp/LanguageCode.cc:753 msgid "Mohawk" msgstr "" #. language code: mol mo #: zypp/LanguageCode.cc:755 msgid "Moldavian" msgstr "" #. language code: mon mn #: zypp/LanguageCode.cc:757 msgid "Mongolian" msgstr "" #. language code: mos #: zypp/LanguageCode.cc:759 msgid "Mossi" msgstr "" #. language code: mul #: zypp/LanguageCode.cc:761 msgid "Multiple Languages" msgstr "" #. language code: mun #: zypp/LanguageCode.cc:763 msgid "Munda languages" msgstr "" #. language code: mus #: zypp/LanguageCode.cc:765 msgid "Creek" msgstr "" #. language code: mwl #: zypp/LanguageCode.cc:767 msgid "Mirandese" msgstr "" #. language code: mwr #: zypp/LanguageCode.cc:769 msgid "Marwari" msgstr "" #. language code: myn #: zypp/LanguageCode.cc:771 msgid "Mayan Languages" msgstr "" #. language code: myv #: zypp/LanguageCode.cc:773 msgid "Erzya" msgstr "" #. language code: nah #: zypp/LanguageCode.cc:775 msgid "Nahuatl" msgstr "" #. language code: nai #: zypp/LanguageCode.cc:777 msgid "North American Indian" msgstr "" #. language code: nap #: zypp/LanguageCode.cc:779 msgid "Neapolitan" msgstr "" #. language code: nav nv #: zypp/LanguageCode.cc:783 msgid "Navajo" msgstr "" #. language code: nbl nr #: zypp/LanguageCode.cc:785 msgid "Ndebele, South" msgstr "" #. language code: nde nd #: zypp/LanguageCode.cc:787 msgid "Ndebele, North" msgstr "" #. language code: ndo ng #: zypp/LanguageCode.cc:789 msgid "Ndonga" msgstr "" #. language code: nds #: zypp/LanguageCode.cc:791 msgid "Low German" msgstr "" #. language code: nep ne #: zypp/LanguageCode.cc:793 msgid "Nepali" msgstr "" #. language code: new #: zypp/LanguageCode.cc:795 msgid "Nepal Bhasa" msgstr "" #. language code: nia #: zypp/LanguageCode.cc:797 msgid "Nias" msgstr "" #. language code: nic #: zypp/LanguageCode.cc:799 msgid "Niger-Kordofanian (Other)" msgstr "" #. language code: niu #: zypp/LanguageCode.cc:801 msgid "Niuean" msgstr "" #. language code: nno nn #: zypp/LanguageCode.cc:803 msgid "Norwegian Nynorsk" msgstr "" #. language code: nob nb #: zypp/LanguageCode.cc:805 msgid "Norwegian Bokmal" msgstr "" #. language code: nog #: zypp/LanguageCode.cc:807 msgid "Nogai" msgstr "" #. language code: non #: zypp/LanguageCode.cc:809 msgid "Norse, Old" msgstr "" #. language code: nor no #: zypp/LanguageCode.cc:811 msgid "Norwegian" msgstr "" #. language code: nso #: zypp/LanguageCode.cc:813 msgid "Northern Sotho" msgstr "" #. language code: nub #: zypp/LanguageCode.cc:815 msgid "Nubian Languages" msgstr "" #. language code: nwc #: zypp/LanguageCode.cc:817 msgid "Classical Newari" msgstr "" #. language code: nya ny #: zypp/LanguageCode.cc:819 msgid "Chichewa" msgstr "" #. language code: nym #: zypp/LanguageCode.cc:821 msgid "Nyamwezi" msgstr "" #. language code: nyn #: zypp/LanguageCode.cc:823 msgid "Nyankole" msgstr "" #. language code: nyo #: zypp/LanguageCode.cc:825 msgid "Nyoro" msgstr "" #. language code: nzi #: zypp/LanguageCode.cc:827 msgid "Nzima" msgstr "" #. language code: oci oc #: zypp/LanguageCode.cc:829 msgid "Occitan (post 1500)" msgstr "" #. language code: oji oj #: zypp/LanguageCode.cc:831 msgid "Ojibwa" msgstr "" #. language code: ori or #: zypp/LanguageCode.cc:833 msgid "Oriya" msgstr "" #. language code: orm om #: zypp/LanguageCode.cc:835 msgid "Oromo" msgstr "" #. language code: osa #: zypp/LanguageCode.cc:837 msgid "Osage" msgstr "" #. language code: oss os #: zypp/LanguageCode.cc:839 msgid "Ossetian" msgstr "" #. language code: ota #: zypp/LanguageCode.cc:841 msgid "Turkish, Ottoman (1500-1928)" msgstr "" #. language code: oto #: zypp/LanguageCode.cc:843 msgid "Otomian Languages" msgstr "" #. language code: paa #: zypp/LanguageCode.cc:845 msgid "Papuan (Other)" msgstr "" #. language code: pag #: zypp/LanguageCode.cc:847 msgid "Pangasinan" msgstr "" #. language code: pal #: zypp/LanguageCode.cc:849 msgid "Pahlavi" msgstr "" #. language code: pam #: zypp/LanguageCode.cc:851 msgid "Pampanga" msgstr "" #. language code: pan pa #: zypp/LanguageCode.cc:853 msgid "Panjabi" msgstr "" #. language code: pap #: zypp/LanguageCode.cc:855 msgid "Papiamento" msgstr "" #. language code: pau #: zypp/LanguageCode.cc:857 msgid "Palauan" msgstr "" #. language code: peo #: zypp/LanguageCode.cc:859 msgid "Persian, Old (ca.600-400 B.C.)" msgstr "" #. language code: per fas fa #: zypp/LanguageCode.cc:861 zypp/LanguageCode.cc:863 msgid "Persian" msgstr "" #. language code: phi #: zypp/LanguageCode.cc:865 msgid "Philippine (Other)" msgstr "" #. language code: phn #: zypp/LanguageCode.cc:867 msgid "Phoenician" msgstr "" #. language code: pli pi #: zypp/LanguageCode.cc:869 msgid "Pali" msgstr "" #. language code: pol pl #: zypp/LanguageCode.cc:871 msgid "Polish" msgstr "" #. language code: pon #: zypp/LanguageCode.cc:873 msgid "Pohnpeian" msgstr "" #. language code: por pt #: zypp/LanguageCode.cc:875 msgid "Portuguese" msgstr "" #. language code: pra #: zypp/LanguageCode.cc:877 msgid "Prakrit Languages" msgstr "" #. language code: pro #: zypp/LanguageCode.cc:879 msgid "Provencal, Old (to 1500)" msgstr "" #. language code: pus ps #: zypp/LanguageCode.cc:881 msgid "Pushto" msgstr "" #. language code: que qu #: zypp/LanguageCode.cc:883 msgid "Quechua" msgstr "" #. language code: raj #: zypp/LanguageCode.cc:885 msgid "Rajasthani" msgstr "" #. language code: rap #: zypp/LanguageCode.cc:887 msgid "Rapanui" msgstr "" #. language code: rar #: zypp/LanguageCode.cc:889 msgid "Rarotongan" msgstr "" #. language code: roa #: zypp/LanguageCode.cc:891 msgid "Romance (Other)" msgstr "" #. language code: roh rm #: zypp/LanguageCode.cc:893 msgid "Raeto-Romance" msgstr "" #. language code: rom #: zypp/LanguageCode.cc:895 msgid "Romany" msgstr "" #. language code: rum ron ro #: zypp/LanguageCode.cc:897 zypp/LanguageCode.cc:899 msgid "Romanian" msgstr "" #. language code: run rn #: zypp/LanguageCode.cc:901 msgid "Rundi" msgstr "" #. language code: rus ru #: zypp/LanguageCode.cc:903 msgid "Russian" msgstr "" #. language code: sad #: zypp/LanguageCode.cc:905 msgid "Sandawe" msgstr "" #. language code: sag sg #: zypp/LanguageCode.cc:907 msgid "Sango" msgstr "" #. language code: sah #: zypp/LanguageCode.cc:909 msgid "Yakut" msgstr "" #. language code: sai #: zypp/LanguageCode.cc:911 msgid "South American Indian (Other)" msgstr "" #. language code: sal #: zypp/LanguageCode.cc:913 msgid "Salishan Languages" msgstr "" #. language code: sam #: zypp/LanguageCode.cc:915 msgid "Samaritan Aramaic" msgstr "" #. language code: san sa #: zypp/LanguageCode.cc:917 msgid "Sanskrit" msgstr "" #. language code: sas #: zypp/LanguageCode.cc:919 msgid "Sasak" msgstr "" #. language code: sat #: zypp/LanguageCode.cc:921 msgid "Santali" msgstr "" #. language code: scc srp sr #: zypp/LanguageCode.cc:923 zypp/LanguageCode.cc:925 msgid "Serbian" msgstr "" #. language code: scn #: zypp/LanguageCode.cc:927 msgid "Sicilian" msgstr "" #. language code: sco #: zypp/LanguageCode.cc:929 msgid "Scots" msgstr "" #. language code: scr hrv hr #: zypp/LanguageCode.cc:931 zypp/LanguageCode.cc:933 msgid "Croatian" msgstr "" #. language code: sel #: zypp/LanguageCode.cc:935 msgid "Selkup" msgstr "" #. language code: sem #: zypp/LanguageCode.cc:937 msgid "Semitic (Other)" msgstr "" #. language code: sga #: zypp/LanguageCode.cc:939 msgid "Irish, Old (to 900)" msgstr "" #. language code: sgn #: zypp/LanguageCode.cc:941 msgid "Sign Languages" msgstr "" #. language code: shn #: zypp/LanguageCode.cc:943 msgid "Shan" msgstr "" #. language code: sid #: zypp/LanguageCode.cc:945 msgid "Sidamo" msgstr "" #. language code: sin si #: zypp/LanguageCode.cc:947 msgid "Sinhala" msgstr "" #. language code: sio #: zypp/LanguageCode.cc:949 msgid "Siouan Languages" msgstr "" #. language code: sit #: zypp/LanguageCode.cc:951 msgid "Sino-Tibetan (Other)" msgstr "" #. language code: sla #: zypp/LanguageCode.cc:953 msgid "Slavic (Other)" msgstr "" #. language code: slo slk sk #: zypp/LanguageCode.cc:955 zypp/LanguageCode.cc:957 msgid "Slovak" msgstr "" #. language code: slv sl #: zypp/LanguageCode.cc:959 msgid "Slovenian" msgstr "" #. language code: sma #: zypp/LanguageCode.cc:961 msgid "Southern Sami" msgstr "" #. language code: sme se #: zypp/LanguageCode.cc:963 msgid "Northern Sami" msgstr "" #. language code: smi #: zypp/LanguageCode.cc:965 msgid "Sami Languages (Other)" msgstr "" #. language code: smj #: zypp/LanguageCode.cc:967 msgid "Lule Sami" msgstr "" #. language code: smn #: zypp/LanguageCode.cc:969 msgid "Inari Sami" msgstr "" #. language code: smo sm #: zypp/LanguageCode.cc:971 msgid "Samoan" msgstr "" #. language code: sms #: zypp/LanguageCode.cc:973 msgid "Skolt Sami" msgstr "" #. language code: sna sn #: zypp/LanguageCode.cc:975 msgid "Shona" msgstr "" #. language code: snd sd #: zypp/LanguageCode.cc:977 msgid "Sindhi" msgstr "" #. language code: snk #: zypp/LanguageCode.cc:979 msgid "Soninke" msgstr "" #. language code: sog #: zypp/LanguageCode.cc:981 msgid "Sogdian" msgstr "" #. language code: som so #: zypp/LanguageCode.cc:983 msgid "Somali" msgstr "" #. language code: son #: zypp/LanguageCode.cc:985 msgid "Songhai" msgstr "" #. language code: sot st #: zypp/LanguageCode.cc:987 msgid "Sotho, Southern" msgstr "" #. language code: spa es #: zypp/LanguageCode.cc:989 msgid "Spanish" msgstr "" #. language code: srd sc #: zypp/LanguageCode.cc:991 msgid "Sardinian" msgstr "" #. language code: srr #: zypp/LanguageCode.cc:993 msgid "Serer" msgstr "" #. language code: ssa #: zypp/LanguageCode.cc:995 msgid "Nilo-Saharan (Other)" msgstr "" #. language code: ssw ss #: zypp/LanguageCode.cc:997 msgid "Swati" msgstr "" #. language code: suk #: zypp/LanguageCode.cc:999 msgid "Sukuma" msgstr "" #. language code: sun su #: zypp/LanguageCode.cc:1001 msgid "Sundanese" msgstr "" #. language code: sus #: zypp/LanguageCode.cc:1003 msgid "Susu" msgstr "" #. language code: sux #: zypp/LanguageCode.cc:1005 msgid "Sumerian" msgstr "" #. language code: swa sw #: zypp/LanguageCode.cc:1007 msgid "Swahili" msgstr "" #. language code: swe sv #: zypp/LanguageCode.cc:1009 msgid "Swedish" msgstr "" #. language code: syr #: zypp/LanguageCode.cc:1011 msgid "Syriac" msgstr "" #. language code: tah ty #: zypp/LanguageCode.cc:1013 msgid "Tahitian" msgstr "" #. language code: tai #: zypp/LanguageCode.cc:1015 msgid "Tai (Other)" msgstr "" #. language code: tam ta #: zypp/LanguageCode.cc:1017 msgid "Tamil" msgstr "" #. language code: tat tt #: zypp/LanguageCode.cc:1019 msgid "Tatar" msgstr "" #. language code: tel te #: zypp/LanguageCode.cc:1021 msgid "Telugu" msgstr "" #. language code: tem #: zypp/LanguageCode.cc:1023 msgid "Timne" msgstr "" #. language code: ter #: zypp/LanguageCode.cc:1025 msgid "Tereno" msgstr "" #. language code: tet #: zypp/LanguageCode.cc:1027 msgid "Tetum" msgstr "" #. language code: tgk tg #: zypp/LanguageCode.cc:1029 msgid "Tajik" msgstr "" #. language code: tgl tl #: zypp/LanguageCode.cc:1031 msgid "Tagalog" msgstr "" #. language code: tha th #: zypp/LanguageCode.cc:1033 msgid "Thai" msgstr "" #. language code: tib bod bo #: zypp/LanguageCode.cc:1035 zypp/LanguageCode.cc:1037 msgid "Tibetan" msgstr "" #. language code: tig #: zypp/LanguageCode.cc:1039 msgid "Tigre" msgstr "" #. language code: tir ti #: zypp/LanguageCode.cc:1041 msgid "Tigrinya" msgstr "" #. language code: tiv #: zypp/LanguageCode.cc:1043 msgid "Tiv" msgstr "" #. language code: tlh #: zypp/LanguageCode.cc:1047 msgid "Klingon" msgstr "" #. language code: tli #: zypp/LanguageCode.cc:1049 msgid "Tlingit" msgstr "" #. language code: tmh #: zypp/LanguageCode.cc:1051 msgid "Tamashek" msgstr "" #. language code: tog #: zypp/LanguageCode.cc:1053 msgid "Tonga (Nyasa)" msgstr "" #. language code: ton to #: zypp/LanguageCode.cc:1055 msgid "Tonga (Tonga Islands)" msgstr "" #. language code: tpi #: zypp/LanguageCode.cc:1057 msgid "Tok Pisin" msgstr "" #. language code: tsi #: zypp/LanguageCode.cc:1059 msgid "Tsimshian" msgstr "" #. language code: tsn tn #: zypp/LanguageCode.cc:1061 msgid "Tswana" msgstr "" #. language code: tso ts #: zypp/LanguageCode.cc:1063 msgid "Tsonga" msgstr "" #. language code: tuk tk #: zypp/LanguageCode.cc:1065 msgid "Turkmen" msgstr "" #. language code: tum #: zypp/LanguageCode.cc:1067 msgid "Tumbuka" msgstr "" #. language code: tup #: zypp/LanguageCode.cc:1069 msgid "Tupi Languages" msgstr "" #. language code: tur tr #: zypp/LanguageCode.cc:1071 msgid "Turkish" msgstr "" #. language code: tut #: zypp/LanguageCode.cc:1073 msgid "Altaic (Other)" msgstr "" #. language code: twi tw #: zypp/LanguageCode.cc:1077 msgid "Twi" msgstr "" #. language code: tyv #: zypp/LanguageCode.cc:1079 msgid "Tuvinian" msgstr "" #. language code: udm #: zypp/LanguageCode.cc:1081 msgid "Udmurt" msgstr "" #. language code: uga #: zypp/LanguageCode.cc:1083 msgid "Ugaritic" msgstr "" #. language code: uig ug #: zypp/LanguageCode.cc:1085 msgid "Uighur" msgstr "" #. language code: ukr uk #: zypp/LanguageCode.cc:1087 msgid "Ukrainian" msgstr "" #. language code: umb #: zypp/LanguageCode.cc:1089 msgid "Umbundu" msgstr "" #. language code: und #: zypp/LanguageCode.cc:1091 msgid "Undetermined" msgstr "" #. language code: urd ur #: zypp/LanguageCode.cc:1093 msgid "Urdu" msgstr "" #. language code: uzb uz #: zypp/LanguageCode.cc:1095 msgid "Uzbek" msgstr "" #. language code: vai #: zypp/LanguageCode.cc:1097 msgid "Vai" msgstr "" #. language code: ven ve #: zypp/LanguageCode.cc:1099 msgid "Venda" msgstr "" #. language code: vie vi #: zypp/LanguageCode.cc:1101 msgid "Vietnamese" msgstr "" #. language code: vol vo #: zypp/LanguageCode.cc:1103 msgid "Volapuk" msgstr "" #. language code: vot #: zypp/LanguageCode.cc:1105 msgid "Votic" msgstr "" #. language code: wak #: zypp/LanguageCode.cc:1107 msgid "Wakashan Languages" msgstr "" #. language code: wal #: zypp/LanguageCode.cc:1109 msgid "Walamo" msgstr "" #. language code: war #: zypp/LanguageCode.cc:1111 msgid "Waray" msgstr "" #. language code: was #: zypp/LanguageCode.cc:1113 msgid "Washo" msgstr "" #. language code: wel cym cy #: zypp/LanguageCode.cc:1115 zypp/LanguageCode.cc:1117 msgid "Welsh" msgstr "" #. language code: wen #: zypp/LanguageCode.cc:1119 msgid "Sorbian Languages" msgstr "" #. language code: wln wa #: zypp/LanguageCode.cc:1121 msgid "Walloon" msgstr "" #. language code: wol wo #: zypp/LanguageCode.cc:1123 msgid "Wolof" msgstr "" #. language code: xal #: zypp/LanguageCode.cc:1125 msgid "Kalmyk" msgstr "" #. language code: xho xh #: zypp/LanguageCode.cc:1127 msgid "Xhosa" msgstr "" #. language code: yao #: zypp/LanguageCode.cc:1129 msgid "Yao" msgstr "" #. language code: yap #: zypp/LanguageCode.cc:1131 msgid "Yapese" msgstr "" #. language code: yid yi #: zypp/LanguageCode.cc:1133 msgid "Yiddish" msgstr "" #. language code: yor yo #: zypp/LanguageCode.cc:1135 msgid "Yoruba" msgstr "" #. language code: ypk #: zypp/LanguageCode.cc:1137 msgid "Yupik Languages" msgstr "" #. language code: zap #: zypp/LanguageCode.cc:1139 msgid "Zapotec" msgstr "" #. language code: zen #: zypp/LanguageCode.cc:1141 msgid "Zenaga" msgstr "" #. language code: zha za #: zypp/LanguageCode.cc:1143 msgid "Zhuang" msgstr "" #. language code: znd #: zypp/LanguageCode.cc:1145 msgid "Zande" msgstr "" #. language code: zul zu #: zypp/LanguageCode.cc:1147 msgid "Zulu" msgstr "" #. language code: zun #: zypp/LanguageCode.cc:1149 msgid "Zuni" msgstr "" #: zypp/ProblemSolution.cc:134 msgid "Following actions will be done:" msgstr "" #: zypp/VendorSupportOptions.cc:14 msgid "unknown" msgstr "" #: zypp/VendorSupportOptions.cc:17 msgid "unsupported" msgstr "" #: zypp/VendorSupportOptions.cc:20 msgid "Level 1" msgstr "" #: zypp/VendorSupportOptions.cc:23 msgid "Level 2" msgstr "" #: zypp/VendorSupportOptions.cc:26 msgid "Level 3" msgstr "" #: zypp/VendorSupportOptions.cc:29 msgid "Additional Customer Contract Necessary" msgstr "" #: zypp/VendorSupportOptions.cc:31 msgid "Discontinued and superseded by a different package" msgstr "" #: zypp/VendorSupportOptions.cc:33 msgid "invalid" msgstr "" #: zypp/VendorSupportOptions.cc:41 msgid "The level of support is unspecified" msgstr "" #: zypp/VendorSupportOptions.cc:44 msgid "The vendor does not provide support." msgstr "" #: zypp/VendorSupportOptions.cc:47 msgid "Problem determination, which means technical support designed to provide compatibility information, installation assistance, usage support, on-going maintenance and basic troubleshooting. Level 1 Support is not intended to correct product defect errors." msgstr "" #: zypp/VendorSupportOptions.cc:50 msgid "Problem isolation, which means technical support designed to duplicate customer problems, isolate problem area and provide resolution for problems not resolved by Level 1 Support." msgstr "" #: zypp/VendorSupportOptions.cc:53 msgid "Problem resolution, which means technical support designed to resolve complex problems by engaging engineering in resolution of product defects which have been identified by Level 2 Support." msgstr "" #: zypp/VendorSupportOptions.cc:56 msgid "An additional customer contract is necessary for getting support." msgstr "" #: zypp/VendorSupportOptions.cc:58 msgid "The package was discontinued and has been superseded by a new package with a different name." msgstr "" #: zypp/VendorSupportOptions.cc:60 msgid "Unknown support option. Description not available" msgstr "" #: zypp/ZYppFactory.cc:379 #, c-format, boost-format msgid "" "System management is locked by the application with pid %d (%s).\n" "Close this application before trying again." msgstr "" #: zypp/base/StrMatcher.cc:152 #, c-format, boost-format msgid "Unknown match mode '%s'" msgstr "" #: zypp/base/StrMatcher.cc:153 #, c-format, boost-format msgid "Unknown match mode '%s' for pattern '%s'" msgstr "" #: zypp/base/StrMatcher.cc:157 #, c-format, boost-format msgid "Invalid regular expression '%s': regcomp returned %d" msgstr "" #: zypp/base/StrMatcher.cc:158 #, c-format, boost-format msgid "Invalid regular expression '%s'" msgstr "" #. !\todo add comma to the message for the next release #: zypp/media/MediaCIFS.cc:427 zypp/media/MediaCurl.cc:1374 #: zypp/media/MediaCurl2.cc:712 #, c-format, boost-format msgid "Authentication required for '%s'" msgstr "" #. just report (NO_ERROR); no interactive request to the user #: zypp/media/MediaCurl.cc:649 msgid "Will try again..." msgstr "" #: zypp/media/MediaCurl.cc:652 #, boost-format msgid "Giving up after %1% attempts." msgstr "" #: zypp/media/MediaCurl.cc:767 zypp-curl/ng/network/networkrequesterror.cc:124 msgid "Visit the SUSE Customer Center to check whether your registration is valid and has not expired." msgstr "" #: zypp/media/MediaCurl.cc:769 zypp-curl/ng/network/networkrequesterror.cc:126 msgid "Visit the Novell Customer Center to check whether your registration is valid and has not expired." msgstr "" #: zypp/media/MediaHandler.cc:339 msgid "Create attach point: Can't find a writable directory to create an attach point" msgstr "" #: zypp/misc/CheckAccessDeleted.cc:458 msgid "Please install package 'lsof' first." msgstr "" #: zypp/ng/repo/refresh.cc:45 msgid "Can't create metadata cache directory." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:81 #: zypp/ng/repo/workflows/serviceswf.cc:283 #, c-format, boost-format msgid "Error trying to read from '%s'" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:439 #: zypp/ng/repo/workflows/repomanagerwf.cc:665 #: zypp/ng/repo/workflows/repomanagerwf.cc:747 #, c-format, boost-format msgid "Can't create %s" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:491 msgid "Failed to retrieve new repository metadata." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:578 msgid "Failed to cache repo ( unable to start repo2solv )." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:596 #: zypp/ng/repo/workflows/repomanagerwf.cc:625 #, c-format, boost-format msgid "Failed to cache repo (%d)." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:653 #, c-format, boost-format msgid "Building repository '%s' cache" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:753 #, c-format, boost-format msgid "Can't create cache at %s - no writing permissions." msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:808 #, boost-format msgid "Failed to cache repo %1%" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:825 msgid "Unhandled repository type" msgstr "" #: zypp/ng/repo/workflows/repomanagerwf.cc:901 #, c-format, boost-format msgid "Adding repository '%s'" msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/repomanagerwf.cc:996 #, c-format, boost-format msgid "Invalid repo file name at '%s'" msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repo/workflows/repomanagerwf.cc:1012 zypp/ng/repomanager.cc:589 #: zypp/ng/repomanager.cc:667 zypp/ng/repomanager.cc:739 #: zypp/ng/repomanager.cc:1097 zypp/ng/repomanager.cc:1223 #, c-format, boost-format msgid "Can't open file '%s' for writing." msgstr "" #. TranslatorExplanation '%s' is an URL #: zypp/ng/repo/workflows/serviceswf.cc:290 #: zypp/ng/repo/workflows/serviceswf.cc:296 #, c-format, boost-format msgid "Unknown error reading from '%s'" msgstr "" #: zypp/ng/repomanager.cc:196 #, boost-format msgid "Cannot read repo directory '%1%': Permission denied" msgstr "" #. TranslatorExplanation '%s' is a pathname #: zypp/ng/repomanager.cc:204 zypp/ng/repomanager.cc:468 #: zypp/ng/repomanager.cc:1329 zypp/repo/PluginServices.cc:49 #, c-format, boost-format msgid "Failed to read directory '%s'" msgstr "" #: zypp/ng/repomanager.cc:214 #, boost-format msgid "Cannot read repo file '%1%': Permission denied" msgstr "" #: zypp/ng/repomanager.cc:383 msgid "Cleaning metadata" msgstr "" #: zypp/ng/repomanager.cc:401 msgid "Cleaning packages" msgstr "" #: zypp/ng/repomanager.cc:453 msgid "Cleaning up cache dirs" msgstr "" #: zypp/ng/repomanager.cc:473 #, boost-format msgid "Cleaning up directory: %1%" msgstr "" #: zypp/ng/repomanager.cc:503 msgid "Cleaning cache" msgstr "" #: zypp/ng/repomanager.cc:524 msgid "Loading from cache" msgstr "" #: zypp/ng/repomanager.cc:615 #, c-format, boost-format msgid "Removing repository '%s'" msgstr "" #: zypp/ng/repomanager.cc:635 zypp/ng/repomanager.cc:719 msgid "Can't figure out where the repo is stored." msgstr "" #. TranslatorExplanation '%s' is a filename #: zypp/ng/repomanager.cc:649 zypp/ng/repomanager.cc:1085 #, c-format, boost-format msgid "Can't delete '%s'" msgstr "" #: zypp/ng/repomanager.cc:705 msgid "Modifying repository" msgstr "" #: zypp/ng/repomanager.cc:892 msgid "Refreshing Repository: " msgstr "" #: zypp/ng/repomanager.cc:1073 zypp/ng/repomanager.cc:1145 msgid "Can't figure out where the service is stored." msgstr "" #. translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. #. %1% = service name #. %2% = repository name #: zypp/ng/repomanager.cc:1433 #, boost-format msgid "Unknown service '%1%': Removing orphaned service repository '%2%'" msgstr "" #: zypp/ng/repomanager.h:66 msgid "Repository alias cannot start with dot." msgstr "" #: zypp/ng/repomanager.h:78 msgid "Service alias cannot start with dot." msgstr "" #: zypp/ng/reporthelper.cc:26 #, c-format, boost-format msgid "No digest for file %s." msgstr "" #: zypp/ng/reporthelper.cc:39 #, c-format, boost-format msgid "Unknown digest %s for file %s." msgstr "" #: zypp/ng/reporthelper.cc:52 #, c-format, boost-format msgid "Digest verification failed for file '%s'" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:69 #, c-format, boost-format msgid "File '%s' is unsigned, continue?" msgstr "" #. TranslatorExplanation: speaking of a file #: zypp/ng/reporthelper.cc:73 #, c-format, boost-format msgid "File '%s' from repository '%s' is unsigned, continue?" msgstr "" #: zypp/ng/reporthelper.cc:90 msgid "Do you want to reject the key, trust temporarily, or trust always?" msgstr "" #: zypp/ng/reporthelper.cc:116 #, boost-format msgid "Key Name: %1%" msgstr "" #: zypp/ng/reporthelper.cc:128 #, boost-format msgid "Received %1% new package signing key from repository \"%2%\":" msgid_plural "Received %1% new package signing keys from repository \"%2%\":" msgstr[0] "" msgstr[1] "" #. translator: %1% is a file name #: zypp/ng/reporthelper.cc:144 #, boost-format msgid "Signature verification failed for file '%1%'." msgstr "" #. translator: %1% is a file name, %2% a repositories na me #: zypp/ng/reporthelper.cc:147 #, boost-format msgid "Signature verification failed for file '%1%' from repository '%2%'." msgstr "" #. @TODO use a centralized Continue string! #: zypp/ng/reporthelper.cc:150 zypp-tui/output/Out.cc:32 msgid "Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:168 #, c-format, boost-format msgid "File '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translators: the last %s is gpg key ID #: zypp/ng/reporthelper.cc:172 #, c-format, boost-format msgid "File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?" msgstr "" #. translator: %1% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:78 #, boost-format msgid "Repository %1% does not define additional 'gpgkey=' URLs." msgstr "" #. no key in the cache is what we are looking for, lets download #. all keys specified in gpgkey= entries #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a repositories name #: zypp/ng/workflows/repoinfowf.cc:87 #, boost-format msgid "Looking for gpg key ID %1% in repository %2%." msgstr "" #. translator: %1% is a gpg key ID like 3DBDC284 #. %2% is a cache directories path #: zypp/ng/workflows/repoinfowf.cc:134 #, boost-format msgid "Looking for gpg key ID %1% in cache %2%." msgstr "" #: zypp/parser/RepoindexFileReader.cc:198 #, c-format, boost-format msgid "Required attribute '%s' is missing." msgstr "" #: zypp/parser/RepoindexFileReader.cc:210 #, c-format, boost-format msgid "One or both of '%s' or '%s' attributes is required." msgstr "" #: zypp/repo/PackageProvider.cc:343 msgid "Signature verification failed" msgstr "" #. TranslatorExplanation %s = package being checked for integrity #: zypp/repo/PackageProvider.cc:474 #, c-format, boost-format msgid "Package %s seems to be corrupted during transfer. Do you want to retry retrieval?" msgstr "" #. TranslatorExplanation %s = name of the package being processed. #: zypp/repo/PackageProvider.cc:498 #, c-format, boost-format msgid "Failed to provide Package %s. Do you want to retry retrieval?" msgstr "" #: zypp/repo/PackageProvider.cc:621 msgid "applydeltarpm check failed." msgstr "" #: zypp/repo/PackageProvider.cc:632 msgid "applydeltarpm failed." msgstr "" #: zypp/repo/RepoException.cc:73 msgid "No permission to write repository cache." msgstr "" #: zypp/repo/RepoException.cc:130 msgid "Service plugin does not support changing an attribute." msgstr "" #: zypp/repo/RepoProvideFile.cc:260 #, c-format, boost-format msgid "Can't provide file '%s' from repository '%s'" msgstr "" #: zypp/repo/RepoProvideFile.cc:266 msgid "No url in repository." msgstr "" #. Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. #: zypp/repo/SUSEMediaVerifier.cc:104 zypp-media/ng/mediaverifier.cc:109 #, boost-format msgid "Expected medium %1%/%2% identified by file '%3%' with content:" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:34 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:40 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:47 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" msgstr "" #. TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) #: zypp/sat/FileConflicts.cc:53 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" msgstr "" #. [lhs][rhs] 0 = installed; 1 = to be installed #. TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) #: zypp/sat/FileConflicts.cc:68 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:76 #, boost-format msgid "" "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:85 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" msgstr "" #. TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) #: zypp/sat/FileConflicts.cc:93 #, boost-format msgid "" "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" msgstr "" #: zypp/sat/detail/PoolImpl.cc:201 msgid "Can not create sat-pool." msgstr "" #. TranslatorExplanation %s = name of package, patch, selection ... #: zypp/solver/detail/ProblemSolutionIgnore.cc:42 #, c-format, boost-format msgid "break %s by ignoring some of its dependencies" msgstr "" #: zypp/solver/detail/ProblemSolutionIgnore.cc:48 msgid "generally ignore of some dependencies" msgstr "" #: zypp/solver/detail/SATResolver.cc:1160 #, boost-format msgid "the installed %1% does not belong to a distupgrade repository and must be replaced" msgstr "" #. just in case #: zypp/solver/detail/SATResolver.cc:1162 #, boost-format msgid "the to be installed %1% does not belong to a distupgrade repository" msgstr "" #: zypp/solver/detail/SATResolver.cc:1166 #, boost-format msgid "the installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1168 #, boost-format msgid "the to be installed %1% has inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1171 #, boost-format msgid "problem with the installed %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1174 msgid "conflicting requests" msgstr "" #: zypp/solver/detail/SATResolver.cc:1177 msgid "some dependency problem" msgstr "" #: zypp/solver/detail/SATResolver.cc:1180 #, boost-format msgid "nothing provides the requested '%1%'" msgstr "" #: zypp/solver/detail/SATResolver.cc:1181 #: zypp/solver/detail/SATResolver.cc:1185 msgid "Have you enabled all the required repositories?" msgstr "" #: zypp/solver/detail/SATResolver.cc:1184 #, boost-format msgid "the requested package %1% does not exist" msgstr "" #: zypp/solver/detail/SATResolver.cc:1188 msgid "unsupported request" msgstr "" #: zypp/solver/detail/SATResolver.cc:1191 #, boost-format msgid "'%1%' is provided by the system and cannot be erased" msgstr "" #: zypp/solver/detail/SATResolver.cc:1194 #, boost-format msgid "%1% is not installable" msgstr "" #: zypp/solver/detail/SATResolver.cc:1199 #, boost-format msgid "nothing provides '%1%' needed by the installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1201 #, boost-format msgid "nothing provides '%1%' needed by the to be installed %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1204 #, boost-format msgid "cannot install both %1% and %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1209 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1211 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1215 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1217 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1224 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1226 #, boost-format msgid "the installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1230 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1232 #, boost-format msgid "the to be installed %1% obsoletes '%2%' provided by the to be installed %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1237 #, boost-format msgid "the installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1239 #, boost-format msgid "the to be installed %1% conflicts with '%2%' provided by itself" msgstr "" #: zypp/solver/detail/SATResolver.cc:1271 #, boost-format msgid "the installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1273 #, boost-format msgid "the to be installed %1% requires '%2%', but this requirement cannot be provided" msgstr "" #: zypp/solver/detail/SATResolver.cc:1275 msgid "deleted providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1285 msgid "" "\n" "not installable providers: " msgstr "" #: zypp/solver/detail/SATResolver.cc:1287 msgid "not installable providers: " msgstr "" #. translator: %1% is the name of a PTF, %2% the name of a patch. #: zypp/solver/detail/SATResolver.cc:1324 #, boost-format msgid "%1% is not yet fully integrated into %2%." msgstr "" #: zypp/solver/detail/SATResolver.cc:1325 msgid "Typically you want to keep the PTF and choose to not install the maintenance patches." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1333 #, boost-format msgid "Removing the installed %1% in this context will remove (not replace!) the included PTF-packages too." msgstr "" #: zypp/solver/detail/SATResolver.cc:1334 #, boost-format msgid "The PTF should be removed by calling '%1%'. This will update the included PTF-packages rather than removing them." msgstr "" #: zypp/solver/detail/SATResolver.cc:1335 msgid "Typically you want to keep the PTF or choose to cancel the action." msgstr "" #. translator: %1% is the name of a PTF. #: zypp/solver/detail/SATResolver.cc:1340 #, boost-format msgid "The installed %1% blocks the desired action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1341 msgid "Typically you want to keep the PTF and choose to cancel the action." msgstr "" #: zypp/solver/detail/SATResolver.cc:1398 #, boost-format msgid "remove lock to allow removal of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1405 #: zypp/solver/detail/SATResolver.cc:1443 #, boost-format msgid "do not install %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1422 #: zypp/solver/detail/SATResolver.cc:1464 #, boost-format msgid "keep %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1427 #, boost-format msgid "remove lock to allow installation of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1478 #: zypp/solver/detail/SATResolver.cc:1499 msgid "This request will break your system!" msgstr "" #: zypp/solver/detail/SATResolver.cc:1479 #: zypp/solver/detail/SATResolver.cc:1500 msgid "ignore the warning of a broken system" msgstr "" #: zypp/solver/detail/SATResolver.cc:1484 #, boost-format msgid "do not ask to install a solvable providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1506 #, boost-format msgid "do not ask to delete all solvables providing %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1519 #, boost-format msgid "do not install most recent version of %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1540 #, boost-format msgid "keep %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1545 #, boost-format msgid "install %1% despite the inferior architecture" msgstr "" #: zypp/solver/detail/SATResolver.cc:1554 #, boost-format msgid "keep obsolete %1%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1559 #, boost-format msgid "install %1% from excluded repository" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1573 #, boost-format msgid "install %1% although it has been retracted" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1576 #, boost-format msgid "allow installing the PTF %1%" msgstr "" #. translator: %1% is a package name #: zypp/solver/detail/SATResolver.cc:1579 #, boost-format msgid "install %1% although it is blacklisted" msgstr "" #: zypp/solver/detail/SATResolver.cc:1599 #, boost-format msgid "downgrade of %1% to %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1606 #, boost-format msgid "architecture change of %1% to %2%" msgstr "" #. FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. #: zypp/solver/detail/SATResolver.cc:1617 #, boost-format msgid "" "install %1% (with vendor change)\n" " %2% --> %3%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1622 #, boost-format msgid "" "install %1% from vendor %2%\n" " replacing %3% from vendor %4%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1631 #, boost-format msgid "replacement of %1% with %2%" msgstr "" #: zypp/solver/detail/SATResolver.cc:1642 #, boost-format msgid "deinstallation of %1%" msgstr "" #. Translator: progress bar label #: zypp/target/RpmPostTransCollector.cc:201 msgid "Running post-transaction scripts" msgstr "" #. Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:203 #, boost-format msgid "Running %1% script" msgstr "" #. Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' #: zypp/target/RpmPostTransCollector.cc:205 #, boost-format msgid "%1% script output:" msgstr "" #: zypp/target/TargetException.cc:27 msgid "Installation has been aborted as directed." msgstr "" #: zypp/target/TargetImpl.cc:463 msgid " executed" msgstr "" #: zypp/target/TargetImpl.cc:485 msgid " execution failed" msgstr "" #. translators: We may find the same script content in files with different names. #. Only the first occurence is executed, subsequent ones are skipped. It's a one-line #. message for a log file. Preferably start translation with "%s" #: zypp/target/TargetImpl.cc:602 #, c-format, boost-format msgid "%s already executed as %s)" msgstr "" #: zypp/target/TargetImpl.cc:612 msgid " execution skipped while aborting" msgstr "" #: zypp/target/TargetImpl.cc:667 zypp/target/TargetImpl.cc:687 #: zypp/target/TargetImpl.cc:715 zypp/target/TargetImpl.cc:752 #: zypp/target/TargetImpl.cc:760 msgid "Error sending update message notification." msgstr "" #: zypp/target/TargetImpl.cc:811 msgid "New update message" msgstr "" #. translator: %1% is the received unix signal name, %2% is the numerical value of the received signal #: zypp/target/TargetImpl.cc:2128 #, boost-format msgid "Received signal :\"%1% (%2%)\", to ensure the consistency of the system it is not possible to cancel a running rpm transaction." msgstr "" #: zypp/target/TargetImpl.cc:2736 msgid "Executing the transaction failed because of the following problems:" msgstr "" #: zypp/target/commitpackagepreloader.cc:100 msgid "No mirror found" msgstr "" #: zypp/target/commitpackagepreloader.cc:108 msgid "Could not create target File" msgstr "" #: zypp/target/commitpackagepreloader.cc:134 #: zypp/target/commitpackagepreloader.cc:364 msgid "Already in Cache" msgstr "" #. error #: zypp/target/commitpackagepreloader.cc:279 msgid "Failed to rename temporary file." msgstr "" #: zypp/target/commitpackagepreloader.cc:283 msgid "Finished" msgstr "" #: zypp/target/commitpackagepreloader.cc:607 msgid "Cancelled by user." msgstr "" #. TranslatorExplanation after semicolon is error message #. TranslatorExplanation the colon is followed by an error message #: zypp/target/rpm/RpmDb.cc:434 zypp/target/rpm/RpmDb.cc:1809 #: zypp/target/rpm/RpmDb.cc:1982 msgid "RPM failed: " msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:759 #, boost-format msgid "Failed to import public key %1%" msgstr "" #. Translator: %1% is a gpg public key #: zypp/target/rpm/RpmDb.cc:826 #, boost-format msgid "Failed to remove public key %1%" msgstr "" #: zypp/target/rpm/RpmDb.cc:1246 msgid "Package header is not signed!" msgstr "" #: zypp/target/rpm/RpmDb.cc:1248 msgid "Package payload is not signed!" msgstr "" #. Translator: %s = name of an rpm package. A list of diffs follows #. this message. #: zypp/target/rpm/RpmDb.cc:1587 #, c-format, boost-format msgid "Changed configuration files for %s:" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1790 #, c-format, boost-format msgid "rpm saved %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1792 #, c-format, boost-format msgid "" "rpm saved %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1795 #, c-format, boost-format msgid "rpm created %s as %s, but it was impossible to determine the difference" msgstr "" #. %s = filenames #: zypp/target/rpm/RpmDb.cc:1797 #, c-format, boost-format msgid "" "rpm created %s as %s.\n" "Here are the first 25 lines of difference:\n" msgstr "" #. report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #. report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) #. TranslatorExplanation Text is followed by a ':' and the actual output. #: zypp/target/rpm/RpmDb.cc:1825 zypp/target/rpm/RpmDb.cc:1998 msgid "Additional rpm output" msgstr "" #: zypp/target/rpm/RpmDb.cc:2196 #, c-format, boost-format msgid "created backup %s" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2217 msgid "Signature is OK" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2219 msgid "Unknown type of signature" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2221 msgid "Signature does not verify" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2223 msgid "Signature is OK, but key is not trusted" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2225 msgid "Signatures public key is not available" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2227 msgid "File does not exist or signature can't be checked" msgstr "" #. translators: possible rpm package signature check result [brief] #: zypp/target/rpm/RpmDb.cc:2229 msgid "File is unsigned" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:65 msgid "does not expire" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" #: zypp-common/PublicKey.cc:70 #, boost-format msgid "expired: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" #: zypp-common/PublicKey.cc:75 #, boost-format msgid "expires: %1%" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:84 msgid "(does not expire)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:93 msgid "(EXPIRED)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:97 msgid "(expires within 24h)" msgstr "" #. translators: an annotation to a gpg keys expiry date #: zypp-common/PublicKey.cc:101 #, c-format, boost-format msgid "(expires in %d day)" msgid_plural "(expires in %d days)" msgstr[0] "" msgstr[1] "" #. TranslatorExplanation first %s is key name, second is keyring name #: zypp-common/private/keyring_p.cc:285 #, c-format, boost-format msgid "Tried to import not existent key %s into keyring %s" msgstr "" #: zypp-common/private/keyring_p.cc:291 msgid "Failed to import key." msgstr "" #: zypp-common/private/keyring_p.cc:298 msgid "Failed to delete key." msgstr "" #: zypp-common/private/keyring_p.cc:304 #, c-format, boost-format msgid "Signature file %s not found" msgstr "" #. dubious: Throw on malformed known types, otherwise log a warning. #: zypp-core/CheckSum.cc:136 #, c-format, boost-format msgid "Dubious type '%s' for %u byte checksum '%s'" msgstr "" #: zypp-core/ExternalProgram.cc:245 #, c-format, boost-format msgid "Can't open pty (%s)." msgstr "" #: zypp-core/ExternalProgram.cc:264 zypp-core/ExternalProgram.cc:281 #, c-format, boost-format msgid "Can't open pipe (%s)." msgstr "" #: zypp-core/Url.cc:118 msgid "Invalid LDAP URL query string" msgstr "" #: zypp-core/Url.cc:159 #, c-format, boost-format msgid "Invalid LDAP URL query parameter '%s'" msgstr "" #: zypp-core/Url.cc:319 msgid "Unable to clone Url object" msgstr "" #: zypp-core/Url.cc:332 msgid "Invalid empty Url object reference" msgstr "" #: zypp-core/Url.cc:345 zypp-core/Url.cc:359 msgid "Unable to parse Url components" msgstr "" #: zypp-core/base/Exception.cc:186 msgid "History:" msgstr "" #: zypp-core/url/UrlBase.cc:221 #, c-format, boost-format msgid "Url scheme does not allow a %s" msgstr "" #: zypp-core/url/UrlBase.cc:240 #, c-format, boost-format msgid "Invalid %s component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:247 #, c-format, boost-format msgid "Invalid %s component" msgstr "" #: zypp-core/url/UrlBase.cc:864 zypp-core/url/UrlBase.cc:1308 msgid "Query string parsing not supported for this URL" msgstr "" #: zypp-core/url/UrlBase.cc:902 msgid "Url scheme is a required component" msgstr "" #: zypp-core/url/UrlBase.cc:908 #, c-format, boost-format msgid "Invalid Url scheme '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1025 msgid "Url scheme does not allow a username" msgstr "" #: zypp-core/url/UrlBase.cc:1059 msgid "Url scheme does not allow a password" msgstr "" #: zypp-core/url/UrlBase.cc:1088 msgid "Url scheme requires a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1098 msgid "Url scheme does not allow a host component" msgstr "" #: zypp-core/url/UrlBase.cc:1125 #, c-format, boost-format msgid "Invalid host component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1146 msgid "Url scheme does not allow a port" msgstr "" #: zypp-core/url/UrlBase.cc:1157 #, c-format, boost-format msgid "Invalid port component '%s'" msgstr "" #: zypp-core/url/UrlBase.cc:1174 msgid "Url scheme requires path name" msgstr "" #: zypp-core/url/UrlBase.cc:1195 zypp-core/url/UrlBase.cc:1209 msgid "Relative path not allowed if authority exists" msgstr "" #: zypp-core/url/UrlUtils.cc:111 msgid "Encoded string contains a NUL byte" msgstr "" #: zypp-core/url/UrlUtils.cc:172 msgid "Invalid parameter array split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:211 msgid "Invalid parameter map split separator character" msgstr "" #: zypp-core/url/UrlUtils.cc:282 msgid "Invalid parameter array join separator character" msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:183 #, c-format, boost-format msgid "Command exited with status %d." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:204 #, c-format, boost-format msgid "Command was killed by signal %d (%s)." msgstr "" #: zypp-core/zyppng/io/abstractspawnengine.cc:209 msgid "Command exited with unknown error." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:243 #: zypp-core/zyppng/io/forkspawnengine.cc:486 msgid "Invalid spawn arguments given." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:299 msgid "Unable to create control pipe." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:366 #, c-format, boost-format msgid "Can't chroot to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:376 #, c-format, boost-format msgid "Can't chdir to '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:377 #, c-format, boost-format msgid "Can't chdir to '%s' inside chroot '%s' (%s)." msgstr "" #. don't want to get here #: zypp-core/zyppng/io/forkspawnengine.cc:406 #, c-format, boost-format msgid "Can't exec '%s' (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:413 #: zypp-core/zyppng/io/forkspawnengine.cc:567 #, c-format, boost-format msgid "Can't fork (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:432 #, c-format, boost-format msgid "Can't exec '%s', chdir failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:435 #, c-format, boost-format msgid "Can't exec '%s', chroot failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:438 #, c-format, boost-format msgid "Can't exec '%s', exec failed (%s)." msgstr "" #: zypp-core/zyppng/io/forkspawnengine.cc:442 #, c-format, boost-format msgid "Can't exec '%s', unexpected error." msgstr "" #: zypp-media/mediaexception.cc:33 #, c-format, boost-format msgid "Failed to mount %s on %s" msgstr "" #: zypp-media/mediaexception.cc:43 #, c-format, boost-format msgid "Failed to unmount %s" msgstr "" #: zypp-media/mediaexception.cc:48 #, c-format, boost-format msgid "Bad file name: %s" msgstr "" #: zypp-media/mediaexception.cc:53 #, c-format, boost-format msgid "Medium not opened when trying to perform action '%s'." msgstr "" #: zypp-media/mediaexception.cc:58 #: zypp-curl/ng/network/networkrequesterror.cc:135 #, c-format, boost-format msgid "File '%s' not found on medium '%s'" msgstr "" #: zypp-media/mediaexception.cc:63 #, c-format, boost-format msgid "Cannot write file '%s'." msgstr "" #: zypp-media/mediaexception.cc:68 msgid "Medium not attached" msgstr "" #: zypp-media/mediaexception.cc:73 msgid "Bad media attach point" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:79 #, c-format, boost-format msgid "Download (curl) initialization failed for '%s'" msgstr "" #: zypp-media/mediaexception.cc:84 #, c-format, boost-format msgid "System exception '%s' on medium '%s'." msgstr "" #: zypp-media/mediaexception.cc:89 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a file." msgstr "" #: zypp-media/mediaexception.cc:94 #, c-format, boost-format msgid "Path '%s' on medium '%s' is not a directory." msgstr "" #: zypp-media/mediaexception.cc:101 msgid "Malformed URI" msgstr "" #: zypp-media/mediaexception.cc:111 msgid "Empty host name in URI" msgstr "" #: zypp-media/mediaexception.cc:116 msgid "Empty filesystem in URI" msgstr "" #: zypp-media/mediaexception.cc:121 msgid "Empty destination in URI" msgstr "" #: zypp-media/mediaexception.cc:126 #, c-format, boost-format msgid "Unsupported URI scheme in '%s'." msgstr "" #: zypp-media/mediaexception.cc:131 msgid "Operation not supported by medium" msgstr "" #: zypp-media/mediaexception.cc:138 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n" msgstr "" #. TranslatorExplanation: curl is the name of a library, don't translate #: zypp-media/mediaexception.cc:146 #, c-format, boost-format msgid "Error occurred while setting download (curl) options for '%s':" msgstr "" #: zypp-media/mediaexception.cc:153 #, c-format, boost-format msgid "Media source '%s' does not contain the desired medium" msgstr "" #: zypp-media/mediaexception.cc:158 #, c-format, boost-format msgid "Medium '%s' is in use by another instance" msgstr "" #: zypp-media/mediaexception.cc:164 msgid "Cannot eject any media" msgstr "" #: zypp-media/mediaexception.cc:166 #, c-format, boost-format msgid "Cannot eject media '%s'" msgstr "" #: zypp-media/mediaexception.cc:181 #, c-format, boost-format msgid "Permission to access '%s' denied." msgstr "" #: zypp-media/mediaexception.cc:189 #: zypp-curl/ng/network/networkrequesterror.cc:119 #, c-format, boost-format msgid "Timeout exceeded when accessing '%s'." msgstr "" #: zypp-media/mediaexception.cc:197 #, c-format, boost-format msgid "Downloaded data exceeded the expected filesize '%s' of '%s'." msgstr "" #: zypp-media/mediaexception.cc:205 #: zypp-curl/ng/network/networkrequesterror.cc:115 #, c-format, boost-format msgid "Location '%s' is temporarily unaccessible." msgstr "" #: zypp-media/mediaexception.cc:213 #, c-format, boost-format msgid " SSL certificate problem, verify that the CA cert is OK for '%s'." msgstr "" #: zypp-media/mediaexception.cc:220 msgid "No free ressources available to attach medium." msgstr "" #: zypp-curl/auth/curlauthdata.cc:97 #, c-format, boost-format msgid "Unsupported HTTP authentication method '%s'" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:140 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Error code: %s\n" msgstr "" #: zypp-curl/ng/network/networkrequesterror.cc:146 #, c-format, boost-format msgid "" "Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n" msgstr "" #: zypp-tui/Table.cc:32 msgid "Yes" msgstr "" #: zypp-tui/Table.cc:32 msgid "No" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:26 msgid "Note:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:28 msgid "Warning:" msgstr "" #. translator: usually followed by a ' ' and some explanatory text #: zypp-tui/output/Out.cc:30 msgid "Error:" msgstr "" #. translator: Shown as result tag in a progress bar: ............[done] #. Translator: download progress bar result: ".............[done]" #: zypp-tui/output/Out.cc:141 zypp-tui/output/OutNormal.cc:341 #: zypp-tui/output/OutNormal.cc:344 msgid "done" msgstr "" #. translator: Shown as result tag in a progress bar: .......[attention] #: zypp-tui/output/Out.cc:143 msgid "attention" msgstr "" #. translator: Shown as result tag in a progress bar: ...........[error] #. Translator: download progress bar result: "............[error]" #: zypp-tui/output/Out.cc:145 zypp-tui/output/OutNormal.cc:338 #: zypp-tui/output/OutNormal.cc:344 msgid "error" msgstr "" #: zypp-tui/output/OutNormal.cc:90 msgid "Warning: " msgstr "" #: zypp-tui/output/OutNormal.cc:254 zypp-tui/output/OutNormal.cc:288 #: zypp-tui/output/OutNormal.cc:326 msgid "Retrieving:" msgstr "" #: zypp-tui/output/OutNormal.cc:261 msgid "starting" msgstr "" #. Translator: download progress bar result: "........[not found]" #: zypp-tui/output/OutNormal.cc:335 zypp-tui/output/OutNormal.cc:344 msgid "not found" msgstr "" #: zypp-tui/output/OutNormal.cc:421 msgid "No help available for this prompt." msgstr "" #: zypp-tui/output/OutNormal.cc:438 msgid "no help available for this option" msgstr "" #. translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" #: zypp-tui/output/promptoptions.cc:85 msgid "shows all options" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "yes" msgstr "" #: zypp-tui/output/promptoptions.cc:194 msgid "no" msgstr "" libzypp-17.36.5/shared/000077500000000000000000000000001476576476200146645ustar00rootroot00000000000000libzypp-17.36.5/shared/CMakeLists.txt000066400000000000000000000011221476576476200174200ustar00rootroot00000000000000# This subproject contains small shared object libraries # usually used in libzypp and workers, or for tests. # rpm protocol definition, could be moved to a zypp-rpm lib some day # if more than one class is required to be shared between libzypp and zypp-rpm ADD_LIBRARY( commit-proto-obj OBJECT commit/CommitMessages.h commit/CommitMessages.cc ) target_link_libraries( commit-proto-obj PRIVATE zypp_lib_compiler_flags ) # tvm protocol lib ADD_LIBRARY( tvm-protocol-obj OBJECT tvm/tvmsettings.h tvm/tvmsettings.cc ) target_link_libraries( tvm-protocol-obj PRIVATE zypp_lib_compiler_flags ) libzypp-17.36.5/shared/commit/000077500000000000000000000000001476576476200161545ustar00rootroot00000000000000libzypp-17.36.5/shared/commit/CommitMessages.cc000066400000000000000000000422101476576476200214020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "CommitMessages.h" #include #include #include #include #include namespace zypp::proto::target { namespace { // Serializes a field of type T into the ByteArray buffer, appending a \0 to terminate the field template void serializeStepField ( ByteArray &data, const T&field ) { if constexpr ( std::is_same_v ) { if ( field ) { data.push_back ('1'); data.push_back ('\0'); } else { data.push_back ('0'); data.push_back ('\0'); } } else if constexpr ( std::is_same_v ) { data.insert(data.end(), field.begin(), field.end() ); data.push_back ('\0'); } else { // numbers, convert to string and recursively call again serializeStepField (data, str::numstring (field) ); } } // fetches a terminated string from the iterator, requires the terminator to come up before hitting the \a end std::string fetchTerminatedField ( ByteArray::const_iterator &i, ByteArray::const_iterator end, const char term = '\0' ){ std::string fData; fData.reserve(512); while ( true ) { if ( i == end ) ZYPP_THROW( zypp::PluginFrameException("Unexpected end of field in transaction step") ); if ( *i == term ) { i++; // consume the terminator break; } fData.push_back( *i ); i++; } fData.shrink_to_fit(); return fData; }; template using has_stepid = decltype(std::declval().stepId); template zyppng::expected makeTrivialMessage( const std::string &command, const T& msg ) { PluginFrame f(command); if constexpr ( std::is_detected_v ) f.addHeader ("stepId", asString (msg.stepId) ); return zyppng::expected::success ( std::move(f) ); } template zyppng::expected parseTrivialMessage( const PluginFrame &msg ) { try { T c; if ( msg.command() != T::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException( str::Str()<<"Message is not a " << T::typeName ) ) ); if constexpr ( std::is_detected_v ) { zyppng::rpc::parseHeaderIntoField ( msg, "stepId", c.stepId ); } return zyppng::expected::success(c); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } } #define IMPL_TRIVIAL_MESSAGE( Type ) \ zyppng::expected Type::toStompMessage() const \ { \ return makeTrivialMessage( #Type, *this ); \ } \ \ zyppng::expected Type::fromStompMessage(const PluginFrame &msg) \ { \ return parseTrivialMessage( msg ); \ } zyppng::expected Commit::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("flags", asString (flags) ); f.addHeader ("arch", arch ); f.addHeader ("root", root ); f.addHeader ("dbPath", dbPath ); f.addHeader ("lockFilePath", lockFilePath ); f.addHeader ("ignoreArch", ignoreArch ? "1" : "0" ); ByteArray &body = f.bodyRef(); for ( const auto &step : transactionSteps ) { if ( std::holds_alternative(step) ) { const InstallStep &value = std::get(step); body.push_back( InstallStepType ); serializeStepField( body, value.stepId ); serializeStepField( body, value.pathname ); serializeStepField( body, value.multiversion ); } else if ( std::holds_alternative(step) ) { const RemoveStep &value = std::get(step); body.push_back( RemoveStepType ); serializeStepField( body, value.stepId ); serializeStepField( body, value.name ); serializeStepField( body, value.version ); serializeStepField( body, value.release ); serializeStepField( body, value.arch ); } else { return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Unknown Step type in message") ) ); } } body.shrink_to_fit(); return zyppng::expected::success ( std::move(f) ); } zyppng::expected Commit::fromStompMessage( const zypp::PluginFrame &msg ) { try { Commit c; if ( msg.command() != Commit::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a Commit") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "flags", c.flags ); zyppng::rpc::parseHeaderIntoField ( msg, "arch", c.arch ); zyppng::rpc::parseHeaderIntoField ( msg, "root", c.root ); zyppng::rpc::parseHeaderIntoField ( msg, "dbPath", c.dbPath ); zyppng::rpc::parseHeaderIntoField ( msg, "lockFilePath", c.lockFilePath ); zyppng::rpc::parseHeaderIntoField ( msg, "ignoreArch", c.ignoreArch ); // we got the fields, lets parse the steps // steps are serialized into a very simple form, starting with one byte that tells us what step type we look at // enum ParseState { ReadingStepType, Reading }; const auto &data = msg.body (); for ( auto i = data.begin(); i != data.end(); ) { uint8_t stepType = *i; i++; if ( i == data.end() ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Invalid data in commit message") ) ); switch ( stepType ) { case InstallStepType: { InstallStep s; zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.stepId ); zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.pathname ); zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.multiversion ); c.transactionSteps.push_back(s); break; } case RemoveStepType: { RemoveStep s; zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.stepId ); zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.name ); zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.version ); zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.release ); zyppng::rpc::parseDataIntoField( fetchTerminatedField(i, data.end() ), s.arch ); c.transactionSteps.push_back(s); break; } default: return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Invalid step type in commit message") ) ); } } return zyppng::expected::success ( std::move(c) ); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected TransactionError::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); ByteArray &body = f.bodyRef(); for ( const auto &err : problems ) { serializeStepField ( body, err ); } return zyppng::expected::success ( std::move(f) ); } zyppng::expected TransactionError::fromStompMessage(const PluginFrame &msg) { try { TransactionError c; if ( msg.command() != TransactionError::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a TransactionError") ) ); const auto &data = msg.body (); for ( auto i = data.begin(); i != data.end(); ) { c.problems.push_back( fetchTerminatedField( i, data.end() ) ); } return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected RpmLog::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("level", asString (level) ); f.setBody( line ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected RpmLog::fromStompMessage(const PluginFrame &msg) { try { RpmLog c; if ( msg.command() != RpmLog::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a RpmLog") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "level", c.level ); c.line = msg.body().asString(); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } IMPL_TRIVIAL_MESSAGE(PackageBegin) IMPL_TRIVIAL_MESSAGE(PackageFinished) IMPL_TRIVIAL_MESSAGE(PackageError) zyppng::expected PackageProgress::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("stepId", asString (stepId) ); f.addHeader ("amount", asString (amount) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected PackageProgress::fromStompMessage(const PluginFrame &msg) { try { PackageProgress c; if ( msg.command() != PackageProgress::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a PackageProgress") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "stepId", c.stepId ); zyppng::rpc::parseHeaderIntoField ( msg, "amount", c.amount ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected CleanupBegin::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("nvra", asString (nvra) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected CleanupBegin::fromStompMessage(const PluginFrame &msg) { try { CleanupBegin c; if ( msg.command() != CleanupBegin::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a CleanupBegin") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "nvra", c.nvra ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected CleanupFinished::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("nvra", asString (nvra) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected CleanupFinished::fromStompMessage(const PluginFrame &msg) { try { CleanupFinished c; if ( msg.command() != CleanupFinished::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a CleanupFinished") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "nvra", c.nvra ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected CleanupProgress::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("nvra", asString (nvra) ); f.addHeader ("amount", asString (amount) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected CleanupProgress::fromStompMessage(const PluginFrame &msg) { try { CleanupProgress c; if ( msg.command() != CleanupProgress::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a CleanupProgress") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "nvra", c.nvra ); zyppng::rpc::parseHeaderIntoField ( msg, "amount", c.amount ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected ScriptBegin::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("stepId" , asString (stepId) ); f.addHeader ("scriptType" , asString (scriptType) ); f.addHeader ("scriptPackage", asString (scriptPackage) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected ScriptBegin::fromStompMessage(const PluginFrame &msg) { try { ScriptBegin c; if ( msg.command() != ScriptBegin::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a ScriptBegin") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "stepId" , c.stepId ); zyppng::rpc::parseHeaderIntoField ( msg, "scriptType" , c.scriptType ); zyppng::rpc::parseHeaderIntoField ( msg, "scriptPackage" , c.scriptPackage ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } IMPL_TRIVIAL_MESSAGE(ScriptFinished) zyppng::expected ScriptError::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("stepId" , asString (stepId) ); f.addHeader ("fatal" , asString (fatal) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected ScriptError::fromStompMessage(const PluginFrame &msg) { try { ScriptError c; if ( msg.command() != ScriptError::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a ScriptError") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "stepId" , c.stepId ); zyppng::rpc::parseHeaderIntoField ( msg, "fatal" , c.fatal ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected TransBegin::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("name" , asString (name) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected TransBegin::fromStompMessage(const PluginFrame &msg) { try { TransBegin c; if ( msg.command() != TransBegin::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a TransBegin") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "name" , c.name ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } IMPL_TRIVIAL_MESSAGE( TransFinished ); zyppng::expected TransProgress::toStompMessage() const { PluginFrame f = zyppng::rpc::prepareFrame(); f.addHeader ("amount", asString (amount) ); return zyppng::expected::success ( std::move(f) ); } zyppng::expected TransProgress::fromStompMessage(const PluginFrame &msg) { try { TransProgress c; if ( msg.command() != TransProgress::typeName ) return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::PluginFrameException("Message is not a TransProgress") ) ); zyppng::rpc::parseHeaderIntoField ( msg, "amount", c.amount ); return zyppng::expected::success( std::move(c) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } } libzypp-17.36.5/shared/commit/CommitMessages.h000066400000000000000000000160451476576476200212530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_SHARED_COMMIT_COMMITMESSAGE_H_INCLUDED #define ZYPP_SHARED_COMMIT_COMMITMESSAGE_H_INCLUDED #include #include #include #include #include #include /*! * This file specifies all messages that are sent between TargetImpl and the zypp-rpm * backend binary. The communication protocol uses our implementation of the * STOMP protocol mesage format. \sa zypp::PluginFrame */ namespace zypp::proto::target { // transaction steps are sent as part of the Commit Message // serialized to 0x0\stepId\0pathName\0multiversion\0 struct InstallStep { uint32_t stepId; std::string pathname; bool multiversion; }; // serialized to 0x1stepId\0name\0version\0release\0arch\0 struct RemoveStep { uint32_t stepId; std::string name; std::string version; std::string release; std::string arch ; }; using TransactionStep = std::variant; // first message that is sent to zypp-rpm // to setup the commit basics. struct Commit { Commit() = default; Commit(const Commit &) = default; Commit(Commit &&) = default; Commit &operator=(const Commit &) = default; Commit &operator=(Commit &&) = default; static constexpr std::string_view typeName = "Commit"; enum StepTypes : uint8_t { InstallStepType, RemoveStepType }; uint32_t flags; std::string arch; std::string root; std::string dbPath; std::string lockFilePath; bool ignoreArch; std::vector transactionSteps; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; // message written to zypper when the transaction has failed struct TransactionError { static constexpr std::string_view typeName = "TransactionError"; std::vector problems; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; // message written to the rpm log including the level struct RpmLog { static constexpr std::string_view typeName = "RpmLog"; uint32_t level; std::string line; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; // Per package information which directly correspond to a TransactionStep !!!! struct PackageBegin { static constexpr std::string_view typeName = "PackageBegin"; uint32_t stepId; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct PackageFinished { static constexpr std::string_view typeName = "PackageFinished"; uint32_t stepId; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct PackageError { static constexpr std::string_view typeName = "PackageError"; uint32_t stepId; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct PackageProgress { static constexpr std::string_view typeName = "PackageProgress"; uint32_t stepId; uint32_t amount; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; // Progress for cleaning up old versions of packages // which have NO corresponding TransactionStep struct CleanupBegin { static constexpr std::string_view typeName = "CleanupBegin"; std::string nvra; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct CleanupFinished { static constexpr std::string_view typeName = "CleanupFinished"; std::string nvra; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct CleanupProgress { static constexpr std::string_view typeName = "CleanupProgress"; std::string nvra; uint32_t amount; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; // per script info, for each of those the stepId can be -1 or point // to a valid step in the transaction set. struct ScriptBegin { static constexpr std::string_view typeName = "ScriptBegin"; int32_t stepId; std::string scriptType; std::string scriptPackage; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct ScriptFinished { static constexpr std::string_view typeName = "ScriptFinished"; int32_t stepId; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct ScriptError { static constexpr std::string_view typeName = "ScriptError"; int32_t stepId; bool fatal; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; // Generic Transactionstep report, we use it for preparing and verifying progress struct TransBegin { static constexpr std::string_view typeName = "TransBegin"; std::string name; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct TransFinished { static constexpr std::string_view typeName = "TransFinished"; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; struct TransProgress { static constexpr std::string_view typeName = "TransProgress"; uint32_t amount; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; } #endif // ZYPP_SHARED_COMMIT_COMMITMESSAGE_H_INCLUDED libzypp-17.36.5/shared/tvm/000077500000000000000000000000001476576476200154725ustar00rootroot00000000000000libzypp-17.36.5/shared/tvm/tvmsettings.cc000066400000000000000000000000311476576476200203620ustar00rootroot00000000000000#include "tvmsettings.h" libzypp-17.36.5/shared/tvm/tvmsettings.h000066400000000000000000000040521476576476200202330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_SHARED_TVM_TVMSETTINGS_H_INCLUDED #define ZYPP_SHARED_TVM_TVMSETTINGS_H_INCLUDED #include #include #include namespace zypp::test { struct TVMSettings { struct Device { std::string name; // the device name std::string insertedPath; // the path what is currently inserted into the device }; std::vector devices; }; } namespace YAML { template<> struct convert { static Node encode(const zypp::test::TVMSettings& rhs) { Node node; node["devices"] = rhs.devices; return node; } static bool decode(const Node& node, zypp::test::TVMSettings& rhs) { if(!node.IsMap() || !node["devices"] ) { return false; } rhs.devices = node["devices"].as>(); return true; } }; template<> struct convert { static Node encode(const zypp::test::TVMSettings::Device& rhs) { Node node; node["name"] = rhs.name; node["insertedPath"] = rhs.insertedPath; return node; } static bool decode(const Node& node, zypp::test::TVMSettings::Device& rhs) { if(!node.IsMap() || !node["name"] || !node["insertedPath"] ) { return false; } rhs.name = node["name"].as(); rhs.insertedPath = node["insertedPath"].as(); return true; } }; } #endif libzypp-17.36.5/systemCheck000066400000000000000000000005501476576476200156230ustar00rootroot00000000000000## ## This file contains requirements/conflicts which fulfill the ## needs of a running system. ## For example the system would be broken if not glibc or kernel is ## installed. ## So the user will be informed if these packages will be deleted. ## ## format: Each line represents one dependency: ## e.g. ## requires:kernel ## requires:glibc requires:glibc libzypp-17.36.5/tests/000077500000000000000000000000001476576476200145605ustar00rootroot00000000000000libzypp-17.36.5/tests/CMakeLists.txt000066400000000000000000000007161476576476200173240ustar00rootroot00000000000000 ADD_DEFINITIONS( -DTESTS_SRC_DIR="${CMAKE_CURRENT_SOURCE_DIR}" -DTESTS_BUILD_DIR="${CMAKE_CURRENT_BINARY_DIR}" ) IF( NOT DISABLE_MEDIABACKEND_TESTS ) ADD_SUBDIRECTORY(lib) ENDIF() ENABLE_TESTING() INCLUDE_DIRECTORIES( ${LIBZYPP_SOURCE_DIR}/tests/lib ) ADD_SUBDIRECTORY( media ) ADD_SUBDIRECTORY( zypp ) ADD_SUBDIRECTORY( parser ) ADD_SUBDIRECTORY( repo ) ADD_SUBDIRECTORY( sat ) ADD_SUBDIRECTORY( zyppng ) ADD_CUSTOM_TARGET( ctest COMMAND ctest -VV -a ) libzypp-17.36.5/tests/README000066400000000000000000000013551476576476200154440ustar00rootroot00000000000000 You can find here unit tests for lot of zypp classes. run ctest . or the binary itself to run just one test Note on libboost_unit_test_framework.so.1.38.0 ---------------------------------------------- When you run the tests manually, some of the testcases here may fail with an error message like: unknown location(0): \ fatal error in "keyring_test": \ child has exited; pid: 7222; uid: 216; exit value: 2 This happens because the boost test framework we use monitors the return code of child processes. This monitoring should be turned off. You can do this either via a commandfline option: ./KeyRing_test --catch_system_errors=no Or via an environment variable: BOOST_TEST_CATCH_SYSTEM_ERRORS=no ./KeyRing_test libzypp-17.36.5/tests/data/000077500000000000000000000000001476576476200154715ustar00rootroot00000000000000libzypp-17.36.5/tests/data/11.0-update/000077500000000000000000000000001476576476200173305ustar00rootroot00000000000000libzypp-17.36.5/tests/data/11.0-update/repodata/000077500000000000000000000000001476576476200211275ustar00rootroot00000000000000libzypp-17.36.5/tests/data/11.0-update/repodata/deltainfo.xml.gz000066400000000000000000006234201476576476200242440ustar00rootroot00000000000000OII\n\r}p2YU$$'@ ^g ے#iN(c]jڒ XmZUkz?>z~qNz>;=/?kUp6v˿ۿ?|h?Xr1׹yP Ǫ'~g1ߜ?OדN}|s_.|~{3?}\;tzYNo^t9O.8_3q)Ŭ])X((ǖٽ{ _XMߞzW\ >oԥ+ُ,#Ym1J#U;{[o #؄c*«bs AQ5:Fd>Č$YGs@:?9WX:zfR/@5YVϭZȖXK?/~~VAnN޻Sڂ[s4ui9;ew觳c8Kܨߥ&Vc s/#>2ԥP)ֆ@H,ԣ&%"_8SkaO57JR`r),;Gr[&͎Gq ܌75nPjrKP M( Csi#, 2Aq/छJN-D2龻L!ICڈ-6P4v($CiMMQzXi$ Rcwqo=5$D'T®c6J)St9 =qL$^Vx"K=ĵUZ-w YRQHgHD; $E~E(uo]zG|Jc*`QT8>@5oב " 16Z͸PHR^i8-cs݇f(nӋ I*42kX/BBq[meCG} % I4hk1rH) (%^ll?f.לU)ZA{: F+Rf? gW3#P+. Z@ʼn&06$LIS Dc⬶v\+S$VP *=^qUBGCc@5Gp&|lT^Ж9A5eU𔢒]lV-@2b4J%Pi$?(| p1 r/nj0*47=7yͦzksN|lt4ּ@i@MeY)G޶:J@$dk!j 1[]at'w91=x~4+H is2]8G"`VkEJ\SrbGvC = Fj\(ZS%D;9u-=>]NXIϑ6d7fYw7w9^Yy/iTKHC^(aQE#d(6c Ty_GtP܋<ɲ=e))qujcŧsf-Ѷ.$bc! iBߠ{P@쿖WחԚ\7G툢(-}-s\@!Uqf2Fҽ2mao;?L`|@E͑X=iGzΜH.l;hNeMl~U=W}Z(KW)@9 6 _ +3fiGjDeʲFRAzIm6v|{4v\D&-jY4*r×x"G Wpi3֊v\H2*05z.@C!JI@Ӂ!}/CTR!؋u9TЇ/={{Dd VF%[=`y)e_Zä#0ynz=0¨wӂqܻM[A1A"Ck}ӻE :jPO! T;X !\ }\󢊃<^{'7V)N +v|> >-le:E(=->Xy^|S44=)Mix2v! /&@؛c0$Rw5X򱲖mb"yT 0i!/w&ԑ0xaQS(>.rr]-#h1NnlA=#ƶP-\dѡY^| z>3XjqvB2U9T\ t&J, ΑC/^j"*t(2sv`y9ZeZƤ*AT(GFނ^$Gn <%C8e^fL50m:s,&/M_GKO6u"A@p+%:\켭n6=1; PSmL UB{A>=re>sƼk4=ɐP`b z0Gj Y~VQ<Ҝ"2 CeR1:*q17FuAͻ׏Z`+Wo!ℴCX/0L31s'Z"m}Vm@C€D13Hg@q~v+Pćs҃;?oak@01#'NʼI-E獃mR~>Pj^.Rd&8ҽ ;~h+(FsAS`ٍ BS8k/6A=q.WR8tg߾8~?|Kv#8MR[F}廀u^,,v 1GEX9["c*:jY%Tȧ XTv08oǣjTA14R1$(ZMF+,p.⩗u{lXS:Kve_;-p hx';CՅAcy.(3oam#x4gnz~%V)TmY^BM#^jaj8bx{*<(RUOqLo_5T-Ŏ'۟-6t]mήqvcfcO]u4%m@..zB=-41E;C$鱟#MSeW@32H .RG?M+}]+<' vpc9iɜ6?@9էta*57hWsme@/:ɖE(U 7w>㗟knL8$WG =[ق= dZeg}t,ohk{(:JZEW>4 AZ.퟿oG߅^VRo"+;$3wj`CvVD*w9dKk8if!wF1luhjTemeG5ԫsf'N .# |l܁녧#b2Mn,\# 7NШ*2.w^|!9F1I,3Jg&V97N>5=C܋^6vI$SC.20U$Ԑaq7 3 <3LDP mŷ9̷ mwGI b_2܄pd;wl!RIxL %g.ԧS< 8ڣXuMrr)wm >{7^˯_]t܋7[nyys׿@^Tq(9ēwlXa(3ؐ`9}7vAnfi/;7/Nl +fS!.l$ t@_0(Q}H7helI}&Qw3[n΍68R] -ߴ+vIT7+-Yجw.lGz25^sIl;iVVxj дa;ү$,|{^7]@y9c/g/NEA",h(ΫZ%ʵޞa ` ,}[s|ǭ[=77wB<HE&FNUl= n4Fx﹅ij(V߶2ZԠ Cjnc7`\9fTȡl2oϰ-,y[$C}3a8<X-YiNI,N \Yl# )>sJw]t[T5wXiբZl)FXpsu"} ZEԽ *Z0ۆ}0*Gm,3`ǚVl,LPvF?ΆZt^sj}``XM[Z_MM-wΓ I__w+>+rR-|/.xo|^h;m6@Ȫ 6FHjgs~s޷+] *},rºʖ6fgȻ>[Y JuNҏZ^AxZC0OOe$-HP݂\ͯk 6&;OW^lwGEm^rzE0Ĺɣr/ 7إEun?G9F< >zvmnTbOg/9 Jjj0c`$2ہd%7aZ< F2AϙspK[ݣcHs/B fHH\kEy&U[L|CJ/MTMM Vp_)s4pB >sB1X@<:%,GCjߝ7{ŹsuZ5w_sGg@p SJ .pȰ-ί9 +֎,?'nwmV§,+^)WOdqaCVu_q iijClifp>݆T Jqd6k?JL=lu2u153N>g!C0b8,$if([{q4i=kfģFoCesahRJWb1ʖ>Cyϲ> sld]R}눮#,Kر YrV]gIb爬:559XR9-ä, MbG%yYM%mɺ.9ud_-Y%sK%뒺\v%g39Rj}yI^rr_O֓um[.lϽoZu#K*\uL꒢&yIuddl %g,3 t}I]R$-DUNZ_K%uIYD/%;b֑%:j6%edvI$ID-%j_֓zuI&yI!;s*et^}elsBA%e%1j5qp\=uIVSm|$/9-L}v=Ȓ ;d_-Y%eI39.7j2oq-L yfkgf\^%ݝIJ;dA;@UX`% `FP,;@卝mT5ad $p ʃA$ulA<'@~ByQ vF H)@#h< `HZʃ6@}BP+ `H(P@;@UQ6(P@;@WGyp2V `Hju9ʃ2&h7A Mn(P@;@uA<( -86@*a-2  vm'0q8"{cȔ!S26QmѶ?wA;;|iNG gPql>KFV9Uxh?q8A@=$!Mԃoʃ FJխ(olZijviT'ײo( Suzj<q~ݴ%WpUVejuhpj`OcE;?oV{x)ﰨ)c-Y^,ތ>;<;<;<;<;<;ޡҶWPG-_FFci zq ګdb%xk8xGb*(+٭ꯩ۫ @b*FdlCTgP/RU} gO\36;LQS{uTPyVIIz.dZU!Rj1S\]ISS_]tzMP]+U*v|9|ɼ9bt#0u|n9{5YFE2}9.ث$z!MO$nlsTe4sma~S6K=m6kWg+ĶcYI©EuDݰ:)Yd~:ߩz9M4]gU%b[CN,eZ06ĮP—B6:%{-NRU9"TC_ԨɵĶO> |m/wzY~Xl)˒[: LU}HmGr^ȊM$ű-qv떾bƮǯrPޫU{{-C'Kʶ#_ṢVǗ)kq~n"k>ƓkO~㼂XS[8e<}~q~ꌾg-YTEj=yu郘MNKo?YBERZ4ՖP (ڂߦo{3EKh*lV#BkɈT,mG#yv==w\k-APϊ-ko7CVNt}pN1 zyf4b.b.zX(<Bm;Ax LT\\¿ڥC\9[|o:dOvfV3۝5B/Ojی "B[T1?!fsbm@N&67|#qiGd3KMJQ9 mc;z stLwz ne8I n5H#0Ǎ5{fP!l;@2²( `HWE1( P@;c|)_oaDgu" $pmM HuA&Q( oeߦ1-yolfU0;H|=R#ٜ}X ]d&͍øELC+nf 2n!"B(! `0|p2doo(P)tԉFN=p |z{~thQRN0" P8I۞t$8@]A (mdOmGGņ~$ʁ v.Ayu(m~ßz 6 m,![( l& ,F÷FJDa:! \R P@V`8/Z߁dDP@.e{a$mqklRO}ږUq2`Jlޯa5j+h FmXxVd3`\ۆbp!07q>/BsYm"3Z3[#,cB Mf4U<|O_CPضP"6"h$,Ou7t|$pΦJ.%'8\r1J#FI(P@e4rj7m/5HFY՞8N Y[3 `}u-, d $p ʃ6@5!Кf,Ci $p5j`xjw#5WY!S]$&K#nrH,^-R֗{=ٮͭ䮘H9-6eRS6#r}#҅yi'26,uTBF)ޖ|#.پs;w]GkEux+BU{er%CsgΪ!W!`SOJeע,کϾiyfͩ3^CD}6sLzZƵ-ϔ/+[|-xmoqv'+v'+|ljOQ3EtXƾVmf)vhYYW\U{ۛ Y>ֳN&kjns_ ϕEUω; (GF.Jk$<3j:BS%-[d ؕXKm_Z'֢Cɐwl|`fԹ^_! ]N͌R`a%*6LKjeNQ< Jiz鹊Ms xI-TG"%ZJ htyDzA3Z* \!&h0ix~ϯN[RԔCB)ܶg2ړ爡B]lTコ@\VRT->EEUZjjs{9PծÏ쩮6ӗ?ƯyG_/zZ7HKSbo~ŵ촫uP57C΢*&CTdrpO]ng kZ`WMW;_ck75ߓkق1v\Pr2I aKPH#D[2j:\ʧXnVPn< jK{j\QNҋ$ٸt3 M31~[G+VWShma.0IL_"g I'Zfϧ!r\ xxX,'Ie!H~K)mwa'ò/mbjL˫]A {#PnKl6EdR>*msZߴׯ }WDbn9;ΏfDE #,ȵ,i'mw|p]]N}%(Z;GskUՔlh R'Gc=+ް(H\2/s@`uoWo sN *BH4X5Bϫ)\{YB~W|ҦXLV+jWtuA0S": 8]C9Q|@-mBH7ggIҘ' &0%&o%QfUvb^2(#"^R ;C%H/tR*/58 FIU"CCy[^(uWmt,-,%ZHٗ%5Ny׌󍪛fs2CX.WvnLdos޶cО><UjEV[VdndDz\%O: :+$u$`9ArjfHޖ1?D|zu5cXZlfW9Ӵ ?6󑺹`urte`)F6NU8F|4ZtJFt񳨷v5[״Q]ݑ!\ZʶhN &bNj }0Q=^!EG_x5kj9ա}wRyZѫhg6Oj )0ؕâfLI-X$(mW+7] #[xLmy+kKȉ4|!gO)ٽ[=/Kj%ڛ 3cD(T iEf=rw5(t⮆WG$ʗ9zf3y;@<$vwj$L%~yE )l^UO"e堻["i;m.-j^P7s\]J.j( Xm{C^TZ"݁0jBm*mlAm͙'dtIa³$ED+n6hI9bgy# v5unqG, Kv㯌!.$WGx3/7JlG یPBog[^`[r` N#h[B`̾L2ver8$n3řʠBVl /Bl6ZBQ{r 3,+8(| \bu0f۠ߑ !cxMFwY FS,lqCzI&ScѪz@IzYf1٬[K'!E_YiFG *G+>`BL$Kb>6x xxx|teG2ء8e50OGO bT2"E&䏅UBٲN"8ەY6k||>}Fߟ<=܇_)0 3E=^ 6% LjIAdW]vGX Ơ#g1*OmR̅:5^S]@A[FXfH4%Ps9h+ t BP!v|&PG$w|H=TBB<먳+#9ݎG6O' {&xwCnNktCpyCL[Хoaq+",1}DBeJ935cX$9 lcsՇkgm3_u΃9j8IT~:|0k뭳 xFɷ1"ַPxn @yhX&PK 6}=}ݥO3}zĥhq8+X?k54J})rSo!v8wtXi6ш3>O4!c&,PP::rLH iLjMK]Fk Kc.xnAqj3QehڭmjMG厜eOi>N80Om9KJ(ag8~>M}K=~!٥ֲkI1?ث+V"Wl3Qē{a~OU䟥w/JՁ4F3<"-:c Ý*a@kvmK?xVwn׷b.Tמt$pI`f|f @ÁXEL+}O{w )[ֵ&ꮑKpK*>SrP(Ʌu~,\c*5n_0Dm;eEwPEEG@ J8q&2130N#Ht\GeW2G :Ek@65qZt@L\bzYtp^5@ /(Ԙcި|kwre +]ݺ5jvyрZ{e@~!khws'4~D8YXp43{ϣnOwXoJBPպQxsyh+t ȘA2Tm Rvβ81& çh*w) /Ϊz-m׷K7#S2\Ae·RmY`Ԋq^m-OW\f_I$tnu&]2s3k1F.9ץv]m)א{kڀ# quO5/= +|mOj7azIFVLMMҪ6#\ 72o&9&u^jZs,g9i]1p[e%<8d7k-DHH 6Bbmf{($2:Y6ĞFk!J"FnIGO1m r;WiȭҰ \Sg7G8@H?AQ$2KXa9~qbQY38s\nNY1a뛑'D^G~{nv!JҝDHT=0̫!| @5\*'RaL@jig h.atrBVNFhsu'<`Ω 00Fy^8d m\\*Z `-RmlzECBL i{Li>/3.ZmH Y޾~:K7#]r9Ku1P3ySgE>h/^ mG2dzpf}a7R5':}Ucu:)DI !\t`Z >ː.'9{? @D8}čj㸸\c@X`r5ֱ28zUiCt~<%4lU6 bhиҫHrGD.͢kN"u%:2J:q k+An, /`f֢KDׄT"Z0឵%e݀d]Qñ5j̓X +F(oBm~noOoc*M ykѨ# ?,]0&iShDLX?*?_KTWyCW5!<>c_]`c-E VVoq8Px~t@ϖ䬙p s?' w/$lvIjV(}Kvڨw\z:r ',TS7ugy]wgLZ=CH@˅9T~~Z]bxXbO:~Lt?OPP]%䭣ɭr]LE&_YiVGy]f#v !CldݱNrVД 1ՙaiatJ"QWIz(U6Suc(؇[}Ylus򅷁B8M{os{7Y)߽0e f I שArhBk&Qqq͎5X+zJGk^{+^=$KLWxmC8&"`@u +BD?C49"lG'W_j\ o"dhH&8#Kqbu:(B1 X4-*(t|O5fҐ+xXB^76F 955FOk%OjCDrMO imj.~J!k3~ u)Rakk 0*տi*W QGwe:U;Brxt ހ|s UXH4S_?ҧsh}iwcZoiV5I8̠(`A4$09'IhҜgxY(k,RZC4+#`wA{r%[+G] 2$ }}'$FtU5< t d7A&3t-7 >!.l L9 s9i#t E<5FE"LO2V%MhP?r>#٬G1~` [{GSk&{Vǩt<̄&1'Di {@duVR2%{p#!x5#"HZ,g.=TtΕƫ0vʚgI !&|{(Β;ʴ^rp5g ;2Tijma<-7f%A!q&!/l"3#auH)]p.1m@3ݡ.^%Pff='2m[i Y@{U}Q,'dDp@\/y݇:Az)fg$Hcn!}Iޚ ^aao촯_Qs)GN`{ a@̾E$$ .xlM>‰aCA($֝L3!ɰwS^z(h~ /Sj%L"E||K OZqcwΚ|3xT,yBSEks~;&:YԳ1~{(VJ^pMc)Xo-%i!-lݩ sA{ きqIk,Hp #A&x;ضZ҉ki@ Ffߕb:ՠ`! AmK8<@JwP_Ik+bcdWc]هO~W J Id#P|emң|mLbHda:A,9sѐ>T]z1|9K8BGNĽ^WبvezK#MSP/7@FUG)uBږsMUwϗ\*Z0 -3`zy,hi̤azLJu˴G OLdjҽ!)dh/⩬^|Ar9)$Øk,k+ ^MOw Xj 5 ZUqlRlj>ua?Ozo*ʰ(5\p.9m@7ݡJ-hr\#q'V+8mrNCji}Oyӻv?{b+i<]@sB4ƳŠYGa&Sk(΢- ^O8t]?luA;[~2wC/(. 3sv}sj G(ꅍѦj5Lh+Ck케r:Avat7HO<% % WcR$WA{LbXD&%:'ڡMsn8x5G3(SF%Zjdu\Re;^zY4rBTGqù#uu3 G+}݃Iw 샫>մ^0qI|rwG4~!yG}).h˜#[u+aO'"Ql-5sc(- TUZ(N%p- 劯𹵶lcZ@FeJY(Ί9V `xDA$!_詃P/NB7bLO ~AR:H{6k~?~z{-}RN2@PTYko/%JGȰ"ќq5]>s LK56GYK142ݥv'Te`#op8Vhv"aOZm@$q/t.!˱B'V@C[u6*5)dŃwD @=KyO> (_g>JI<N;19>!LvIV!oۺ (R>J- g6fE|,O(S2){"d^@OZra 4ܡq.WmcaK^KCY l6, z89y?&~e"G;JZ쌀h:p  jŃt2ZۧSŧwi[n`i6>#XOll -q `R!|E#~8A=jKqQ4q^bJ%kT75HmxKoVW䝃й"<ڂGc+Ik}>Aէ6 'n@:: j86Cl1ʺE@R&Yd HX1FX %ZMSIeTo+>}9uO(vmDz`* Ae]v (%I4Ds].L Hv)z| jDu9暕c Zg6DMOZn шt ?YA@kBw!@U0 x'r_?7kDi&;5^yi*kÒc <3K~P@%L30 TY"܀\$U*%V+.vtxjh ; F }ٞCzTnElW' Lzd IdU1^%j=md/m:+V"#g׺{ zY\W$ڈQ7S;=\BߩKZB̌.#™$>_sih #H<.?aTFyg d!jya5kH̬p4Ђ_ oKa"m|_>:VG}{L~0^܍FbbS&L]6sDawp+v:ӘZsCFVK E9^ܠݰ(&SʡCS{9X62?>y2X&~ .M WW9Gi/ѝ1, JLYk1kg(c{O+8WkoUjF ь9wN Y%?ɵ> cnrd-~m tpq9Ȯ16-yLߘhе9P*WE i$%W@4 .X$Zt ~nX_2{r켡3SE}сo[.9Ysy"KeK WVv[R=FQP(~ށj)=,38?.{O05{vJJ9f8: 8gZK*dU[7hc񛧗dZ_k.Xl8jJK/ӅBcIzgVxeZgmle<\V?,U2W4vfg˧Otٯwdmõ^Iym?ey>`:VjxRӶg}{WҶlﵖpEn6')B0. gDWS֔PCcɗ皉_ xri")(dXC5s_Gt, }݌yo55Zeu1R(@8:W(3դq֜*N;^}R`nnFx)Fy،Ʈ{`pX熼[qe@{:-h/%ۖ\yv)6KAFCtTJYb~4Q4.ӵm!G߃233=DySRϣ8 'RӰmtqB)D`Sl [HC1[uՄoJC["9k}t#3T4DkѲ`h$)D_hqo]/e@H&~|6~~GB)Ouspc4u/nԸvt"^V-d"Zsj^&}kŦWhQ7 &3oid`R Vo <\&YhPIpy?oy^x~9Lp@ z(ݮ\_3_!+0dIs7 2zT??^b@<@ ކd5zzӉkcZJ؎{T|=ZUyù _ōU!6ւjVymz@S0<@u!nKRÌ ^[\aGj }Sp 49VPD!D5[ fLMd)HKp~';q.cY[G*kԝh D-Z'ؾ['꣯klP?;7]>~s?n,1x2/Kui 8dm$ibz0kȹDz'M[ƭB`*$瘛wAiޘдMVV)9w1cBy3KsUkV,`$=DYSIz%~,IW21z* Bר[SnAL M΅l+x6Ҁd!7'Zwc/{4ux>b$ 5^o)Q#̑YSBUiD>8-f] .wxo X19o?6;Ӟͫ!VWF΀4PiÕ^cˑ,1'1Fc5['ضvl\1?k1X8?1 /ZpLW;u`(5VP%sICwweǂ6sd-/#\knZ ݊ V UdJ!_`I|c'br;Xd+`MyRkrkM\5<S?vUX)g& W7t=>? V]%h $X`)l\ 6[sQ|`ѫM` TYM_q.&Dj4V4UT8''_BӚbE->o&ʜچ=fkD΋vd.n]RF4LD0Z yE)Ac1 F̚#,QFK-K% ',JΈ&&i 7XK. e,J]7ss!D#4ZS݁ E:<k|= +6xq:dݡq2kÚ/VC}(vvh=%gRvj*m[L.M,zxID~4j5Gězǿ.e w9Yڧk/FekZϾٲ6 nr1fQ:brI3%wu W? 0;8FHv9&q'gPF΄/- ofc=,Xr\d:OLtuf: Λbۢ١p 6d!PN>&[3oL~3?l#pt@VyjM 7ʆ#6Y8 _VoMFM4VJ26-cImQ͘ﯿ&>^vwގYîyt+[} a5Z6{۵nlQsaU>b4=OΝKϣm?Լ!dN}p٧|ًAmL铛<]̃R=TyC;?~/sL#]~#A兟']#Mwe(̾F{˴ <6+Grf.b{̺0 nM7Yp{ ^>B\l5@6ٓ*C.ذ'VM{' od)g>R;7 {^8ͷޝjwwCu:kY2KX m^3M';-a]Dߞ ݌Ywq-PqHyS1ʊ/ic'ۂn3S5\V|3Q3g3VZ4֔|/X7Vb{MRL{gZBB;XӤYSMRiDfYj"-W% C*hw4&h cM#b:JZ 75 wXNLbZko/T2۫ao֍j||u_9,+Z6UvPEQ]5JgZ%+B4mT*z5.S>U~rmn]7<4({iD g+(sL,6{L6Z"oyv79|yοkNr2_5d.+O'/&UOf wNy193SS'4|EVkj!Q ~:$Nk0kYmPh/>^[m!{ J䶹Է',*C$TO6bͽ+elFrl&5'͜j>ޙ Q-M|FSisLaͧڢP.%VU%x\CIa?'xrQ|Q@H|F-'SijɆ4v8a(SRsIJg)O w6.vtA|:Ľ])Ojzmf%C}p\dPr`䬵{ĖM/TPnm<6ADWԸwLWX8#dY;=ɷ1b[F,:=Pl&"bsN;߶Yl|yw9..%e1VMy^;eu~YY<ݶT&uMUɷ\>,?h98c޷f &s{MEѴcGssZz0s2v nrN2ן<7hyRcqOG鿔)QVjb3sW޲8{mZh6Cxl]L|МoiZfԴ}6a'ŴWCA{:9b1'd"2Ԥ!r1{(?ȘiÕC ʝI689[ޱKǠH5K#Y_ | ,c{-XLo{Xp[xp'w/ʺX zV=lWmd)Uf7 :E;88Ա)pYPb|`Ä,za򏭅xn pbҹz8.%?s_WULm}{kz>%4q٥W2%sj,K_UwvmdO5/G4w.3`ksVyxH{]1^>?bv.g^c_jcZj.#Lg.T7lܕK.ZVicziB<1Ww0<2#b7f<, UoT9e;Wǜ ]q^tiRYY7s辮Ro\vS&} HxJ.vMϼṵ\t+5.,a_%̡\ڏd1uk_SH\e;͜Km ~-Xݗvo>3.k<̽\4=aYӔVD.Ϳ14s1sץl6fF2g{DӸNrjG{KFJ I| Wp9JoQ?Y.h>l;M?H"jr+mKLĸY2ޱhɊ1a?#dt]/BԔ[דb$J,a>8&OJV}!!ѮM8o.G;lTUJOj߶Dof>R?Ϝ*nD?T^IVznN6GM %+֪/lSύ­H8y~H;/Q+9. ;:dq(p)d~>W5tP@i/זsM3h-R"-`N+m4( Z-Ep7} C82#Io1>Mf9N4CiJ^{r eI^k2j8PQt&H>h0RD )l[wNP yAͶx3˸.>/BipM2=(c# -AP  *8@$[ A %X+`P F"H )"%X$nB~p P@ Aw *8@$p#>'d=>*8@$l)A( #h8A( nA~p P@P@ 4:G~P {+\QozC$@sQozS2H#7UHLG(& iTp#iO # j#R*uBDZ%%ނ<ςY< g/p+jr0q'HHY mϠ[NPόVf",@|"Ź@qAhD9+#?H6BN>bx%dм R@:=^N"Ƶ *8@ bI?c^P& AjG$wSAOҺ>x8է))F˞d.YbCC N۷iNӿN+tóPe~6tg5 \Pkf7QRf[/Y: .6gf^u =v(7z&Aˁ F4:* (+p^Wq<8N՚ĸs(y2(4pHB }h6A@lsBf%[N[r 8dֳZ#p[F z:m3%CA  m  mlۂBNy(4pC-P.( .(Brh3pTPePhPkccfBC)84;jmrF1H@1Hߡֺ&Pkt|V4C1HY)8 |(rMjmC-|嶠&EPk PnZ3tBjM(*x6gv5g6;|3ʍ mֳrC а0q'jmfP>i2xVnn4 tڡ PkB18ӆ>5zYѡ٠PktڀNS5Nۇ6{TO5N;:-يZT[%yqYl8Y~F ?k"^ƻu,^6n{=2ZwD#Y9c1{=?W=sx9^=^ؠnNfThn=2mo9wL9LkOM歸lcb4em,5?&~L|L=&yɼdc2! yɼdd k[zb~!n̬ u&qթOk/4HjJ)dT~m<~V{L=Sz)ǔcJSz)ǔŔ^r.qy6X#6_[=uj.-)׿炶|O|W1ݼ^ǰ"uGMW:mZA cĄkxkM75UJ΋)/T#2T1ڴqz(qR<=C!?HT,&/in+W%y{: ,"TIޅOygFI_Ӕ<AQ5"%qn9h ~YXx]pmJ h)JrEnZ }le yH$̓⠂D>ܢc%~*8H~5¿5q|EZ1YL'h`@c %g_8tQm_^։{3 ޻c7^0wZVaةU4{땷wnp\$p!^'pS;Qv.M.Fk{K #PlŰkUD5ziɏh4Y7G.~.UCdO Z aΖ1INŸDn-C9ALGR Ʒ o~lTRkp!"h Z, N6eq0 ʌȎL썫5zw/ROn;ū@;(MbfE }U9,&5JBV$4sO3ȄZy+d nvy\%ٱTlհ'Pw8+SaP7@c$S[YWK|ɵi5bv7tm]Q{PzbRTxZ߽Ѩ4BxG$vBH>DԓNԋ/mLk˶!-.Pq}ij \DB%dǛ2dFa3;LkFX/ڣhѮ !BDPAՀ;,M }m(qէjskɍ2JKrKՃg5ٔ%b?[ ,vP+!v\ql\ru QZvCt]t^WJ,(BJ{PxOmN 1, %XZ %ӨD \EpjܠSF%AЋw,=o_|j?O'e~G#sY{H8{?~dFl}dN $2 Y$ZW4mqwGWҁѵeTUgCk[qwe/w3ex)nܔi[TrӒ5QNSt*ȻiArTD3M^+kI:]ǔuiQ:Q#iVKs1dԧVEg4N]g&J.Z*s۷_0[/&_;텉JӐV]ddWm.BHxcG3 XՆg\mۄ.$R3sY}O{Ə Ât7rf;KKUآ!e9/]K ѣ e_z9 .qpކ>9‘ʠX%[MJsB"DޞDN pTjW|=Sʹ5,ޒ˗x?^"kv̍`L8I؎% cdzfqf S%ch T\ugˬLdz)"I12*!4 t>Hܖ44x06̕CT onѷ.O_N.pS)RƊGEnS@J5EjTBt㎣Vu o1x^r:py POb+ ՁZ l`h"#m2)Rz2o΁xvZ:B4'a-cB؞, $<l =]l Qn2{?nuvlYab<B!m bE ev2 l^} k%IoR|`ަf%vrtuz{.]~N{EZyaZ34 ( S^a'tjlg g5$1q`ٔ!xYhm=4 )S=|#DxH'YrlgKI5_8oP,aFöo.Ke%dg~crJK{aTW{殛Tafs "ꬺ:1ô:l,J1a!tҼzIeCDm`pz @~P;H\iP_ Wгc9#4eΨ$jrMj5{*[usѽ~yFz|{_$$,馱n`ƈǰױʠj;mn lP88[qCeyܴ32 پZKWa/Y$\Ԟ9@!ژc॥2/NZBjvyo~& ])&#zFl_Yƿ?vMVz!_R<ܿ=K'8uRM4BU;bp@60AdOkE!7juujߥ~];s7x#qn·W;_iy_^ [hw3VjSkwL9ŞZLkþ05yEh*a`xB҅@2kJHyXLd_Hq䶕Z y8Ů%<4MwиX=/\DWt3NmX#wRD̄g IB7?Kbm\%K`q"w yT^@a:=Z݁qK%N+'ץhHö1Яx g$:&}FJb'8d} Zj-Zή +_WW sW_⃽]"zX R R"PK):?ُ眖NJpi{+gy+QjU(LlOarSTN`rCDd2\R[pt'8Z WC"[ b@yl倮f_: _2?Ǧ-$۩gtK`;UZ2S]vK~E hꦂTP}⮵9["|_MھLK֬i8 (j{ڬ7,faqJarܓ]-\O[Y*KsgSgBU#J,I982v`Aeӥpbrg:W9̿]8񗪈~Kiϑ9cn: FvA2oT3 Ub6:RMlK&}{̿ݘ ^4.M/ʕ`K[%?RU!!`ee47-6ɺJH}>WMr0(N-׵1\ pލ>2,;8)|㥢ft?|gnSaZ3&YLbM PXyHAj5! kwK˥J9LUج CaUɩsG4kfFnmLӴ( 3+lU8d]/@VZ qvqXc֬jU,-'kYd߯6|4]/yz{D (Yg>;HAL֝Y-в%QTrH堈[hmVJ֗.0^Jn;dfn`{(a'2b}_.eWE]-V݇a[dTԒZt:9ֹc4V}+pQ zsr%aV`<{1Sڏ\Y ǴDjQFJ%RGc'`;@v̎C(ML)gmd!9I y NDxGYZ?:eX7Zc1I,wf!kg\|B#]glr<*Υ_J:'H2V<X'+a|ky'Z3fmC۾VC Ū2}+X&OYyf$k*޸O;'120@|LJߠ:*!*VLx2;2iEc^K,F&bv ;[ X$ZES&o]@g[H^5;Q3hmqGcoC_ eʱ\ m22e}2eh&%͚ĵl/RG&zӅ|ŷԍP8r1}+օ8\u{k&kbs)&J4X-T.PPhdP!Xh/F_we%&1D*E 0ehΖ m22ˠW-] MG|䵐$:(GSRkEe&PwQ=+ba}]j0C ChmI2n}瘸zxEQmQ / +jk%UDiCufE65G_ edl+-C]] .ò.ò.ò.þ|g a'V[ (.` ۚr$}j/};kWU`mP^#McvlF,D$Sں(W`EM8,mHt sqJ+xȢ1(}xNKJ,wpr Ojض-(=Bc!m WJNE1eED7=sJJ9*Eg9p:59` ;?JzoRE \npJzxmiC<8$_5U$l:i= G>@+fMVjΙ s2$p}"~]!+c)53(]E,tϳLr mXtsoբF.4ĢbWXOȼ/jo*ժ#3ְBy_-LbtQ.F pTj qVZpJr0їs.^N?/g.cp\璧" $kJy)d05D# RԬDxU9lU\ِ_ ,eU*DB)z~ X WG"Q*Hh֩^9u1djsKC̅5X`8ʾe fypt8 s[DW}5ZCQrP +ؘB 3=A긏r(C'glo}/ӏ(JXօS>zs^QL*A_jen5@xB.JRk!C{ o58 ?rǂHó5 &=&ʱ+qrku>A lzm{^%wz.B ':i;<|iQF{ #Ż%Ӑ Y`Q<,9O+o՝Q,;_%zi 2}]T-P7b^,YFܝz]ygx&XllfJeK! s7o%WN@@suKdp`pn۬#ujm#v3ZD}ɎR[7 r12W9]K_o0׏އЬ<ےsIPD-A<4: E/!< O|cOw}d=QEB8Ԗ1Xe5f¾7RJO%b#?3>Vo) YuDL^wiu v^)Qk QXWy'UsAKX|^AFմȒtDxPа( 4:m̬QnrAo=kwXbn ju:"`:ϦUCudjS٧,Z%20EYꃔ˜m }G:~}йv7N0#j0E(p52`N sywPe+GmUR.: [8~ɱT&`z_{0n2dEʬJ<,N湜 {~3oI\ux2SˠLeC^h5|qЗXpaEcPe²ɍ /Of%0;A]c~t1 ' 7-)J2WM!"&f&4 Zrm/Z`@FsZw#̐JFr<\ti6NuG}\((;%/IfjII;޼cOC}DGP X%q(B:FhOaMnKn-e r~G|%x`.Os&oƨe5(kl72r%⡹*X{Uk|Crl"B#5c(r^Ջl*"Th_LWE#!ohrq^"_lqqlBUf F-b] ~V&% =23GTraplI:דY瑔 S-}jG!hlQ|4Lm;Ω3ϟEyPp-wM j>tϵ>um?7M8Yf@.к<$7 &"IY\, V|j\$m@L쎣3f3[HN0kwE->.ۚmh"++3Fg}kKM 4q_Gƺ]LaX1%pk+o瑔 kJpN-v Y8k? x&X~ٹZr\KryPp-wM "g5)^LF 7`9gX-Vvע Γ8 eJٱzm}\nW}0W^ZG_"xu$Z%&Jb풃,\6>ÁJR`u A+R+{~H}7:ud박Ҝu@&A[/ޥ}*Hp{GסqZS(z[0uOSQ-(7X !~h1R>DϷz-]z#͞{Ar?* P+m` 8:k 8xJy5T2US&(Nirm< gt5J9O[ 8P1Xހ*dQ;M&rZ)WOJ֨1eV+-Q>&S_NmbezU :꾫u{kэ$Ǒ_T(kz;3{7;{ vU>Ye7mm2;I*G%ŗA/8OFp65.D @Gs#gi`doSEk,6@\ê {\Z]L'IP7k MطY HJZZw<!|ߚzfwO_&>ԺZdnXӊέ{B Hiʳ w.bXBkN3'mXWs 1ᑬWAkz.  I-X}/V ɔrXNSztTAW/bF`%많E}i[K>zg'5n'es_g?X.qu UYip䦝S ifU>k}$s%gI VjpjT$mTGK;6f"BnF5ub$<+B{#Mw`_j C|"&aF{AzQ>S$M%7UMgV^w {RQwGO#xSȻ\Œ}w^Fc),SßC=hnaݖZ5"lV5՛`\ ?DbXԨTgþ#MtokV\QMB8fVMtzhǢ _ޜS酄S5v.P pV>NǮMkWU!iExl (ʄ5dg5k~Pl|4AꭆxL`֥eA`S\l-Ab= Nlp! R'}1$f{>[C[CWPO?El.T^]V#{+R"|n{Jދds,&@!FAYjlFa sjopU߇V 7F'5erqi=EX9Aٹ Y`G k WfX^Fjy^c>y^&'Ɵ_ztp6[hWăZUSH:㵑ѽڡsq / H?\b[\LDj'Jҷ"gȖ`ީ  4X=:עк>E7j \PGV_. i]\yC *iB@$Pْl$ ǯ'k޼Ng/=.Als"MfZTIsN3:Y۫ D7iIpf01&Ihcs gz_ !LjG\}cOi-K2#FDA1xl₋G)-mOAkF.)9eqJpZbaӏs^`E2}̱щ6v,4G)F~s~VF"Sϣէ/ء6ggBZW`28q :hY1oaX`ԚJ: V_:voedâ5s'1xtk~ZF,eWF)L,WxF_ ;\k`@66xPv0یTnV6lrs>g憰,ckh⹼~!bQm\,NKeE%)74QI6}p~O~<1hbXMfCź{X9N dΞd&DDj\@FcZϿ~ j"tri8 %<ܦpcJu5*VgbşQ hjMC _Up*р&mfA7k0}m;pF6.Ba uDyZwVgT?E_ pɰFERG9!Y 4&8Cx.5sJheMMZ  *~u~+@1%˻3c-OI7Aח\bB7_>xf2\qM} qA3Ҡtśd8m(K E5P*;HvSݫ6޼"Ef'e'njV2-ڡ+v|$;%7`#XS8jsLѾGg۬ށ7KJH%:6Icb)DM"US/  68>mWzo֫vbaIc}'k]w3Q=yo: eUs䜟|o7>&">ycu:1D88Dl7| nTwӃ kUM p a{R~`ӡJ~Xd[* dJN|)=p+`K'lBl ^XGҁsy;.%Ϛ$?eHw-oqo =+=JO,^~]{Ӑ ,p59XMMr(U@,D pE@m ]MxpŜBlAN6}6aOW9u}ա-dІʃ,XYfs` 9-Cߤ.,yJe ߩk:F+-W[W}vX)!Y;GrbV\I83M KLltκv((pƿ^gqy hqɪr MQ񞴅@\ύTp?@jASg{/-lni~pnZVQGpzr_,ؓKTsVrHfʈCd.^%ajRA3Ti8W-/߁?J޼dzHo벷lP,'&K^\XNPنs>ײB}&HCA{2Ed"QSZ8>EM.epS1_ʵvUu2p[1_{[N61 |i.vկvҔ M  0iĈ$?rexvHn|bT'~o¿׽\Y8$ybSvO^_oYn%7r=X}}{0ދPIŚR 9XC}䥺3[;YX\3YuJk#֠R jO4Q l'$'AH[eV5Պn#\Fރv ʝZU7G'R &ٷg]`m \ hyZSVBHC3)RLD!ue׆ߒ_譕pW/WnlyyW_B2طJ.MHA[W 0= :"-p Ԋ@3 4>7^}SE:`U'x5ciFb Ds*Ǫ][怦tKLK\#G4 }o21cUwO︖Dmm-@.< Y .ZZ\.亯}TOKˁǴ_#☱Y;TWd IB$~ q +.x񪯯A%[ޅV ',zC S4bt|(iXFueQ0ivesI%ɍ.4R۷:fXX{ZC£Zf͸<1l-oT<=kM _ Te Mp;m>*NS ZtjC_QpaZbgJh)6Ngκ*((-\<>ƪj Hk1; |6j`#ɢ<BىSpͫlJ_~/x_s?_1<\|~ދ^?z(jp޶ƜWEx9JS2bu9F5߇UW("hRj`*YB^['Zܺqi$f0JN~mȎCҙѤ*.e3bn%?=ea#9VBMTӸx_ӫ473iVbdM@|4yZ A[gPZT?4;~ፇ?#NӺ{,%e:3[:1siԥTDౝd2[X ,6?#WYDu ps*~-.?,T@ tT)؇m<5GQ]b.}RܡBd}?W on(Au(VYP5 W [} :gMHt1ժ h(Q=)ieJq{ K <;2,CqWdB#؃.e~@\A#۩4rY JUV[#C9ů~ ›o?BRO91N C=LTz(,yZVvr23L4F7Lvv|L;Հix{q"2 3d[ҖOBpP 7$:Sd-1PhC5~fb_g,w22ronH cY<5Ԗ=]Dw]*%%Nr>'MҏyWqsJW>fckx)9݊yn?hm6)ai04SBO M;+ICգVdI.ס+Z "  7uGgB[i !M pە5]l ^{$uӟ;4s"̍ҘQIvdՕ"_xV@ɊWsg}-Inϖ*2 ܖ^GjVuM! N"j {g`kaHʅZYmGay9*H[J_w)5=O.xVn} :A _#!oud,CݾO_Eo|;$[sLK9Pijvb9cbhp H;UPlNcdܠE'6w@Z"sVVo,"(@ Qo^r4ؐE4q۶͕1*:@dÎzn[k/6q .-] ΌdO.CBsʡ/^&-8nk~vPBuV&F7?|?~Ԇ\=4fv3XEp^kLf3wZD.rSE8-XQ`ULWȮ<ڌ[>vNN&<}GP4עVMҩ= ,w352U ꮩrmĈ-FSs#>1}O~!>Z]N%}" DX06`&2D|lԘ 7bO~ Q]x"+n.[7ŜA.p,vR`ƹ $8t? !:TИ4#hXZr#*m5tkE0,BX ߟJO珜۞~S_y)zS-V2Ῐ᳇_kPlߏt &<!Һ<1Rzel)mp2ZCanFN[e0nZNߋpp<"QLrMP!?b @@ 4XdP0?Yw-ʫjMcVhNSN=fCLJG!7^8^oO^8C-=$f@=K"EC =XRpK_{gwb t5e\"a_9^+bu nER* Rcd8u_(Ѭ(: oH7%P1J|nd_ KV9Sm'9j-d]0H$Ox}qPל܍npdZL34P9,q~n 6a~&Dp8!$gx~X״A]ۄ}xgdb,, 臁, +?km=6]nA[FF`: ҹmKh[_y.S80LrSn͗RX|Xjl}-g-&B_Oޚ YOK0{ٍ\N݈vxhhbɖsUI¥j6<v]&Lƈ56 S'Ac0q]n suu± 'I,Uy{l^֌۷M1D:=q+4J: cM^peڗq|_}Nr8&w~ C(*(b?}ጘIVJ-BփVQu`:>|k>oi#_\{ΉGhVQ xճoKjnu{VobHZ}x" ='e?627U`$(& B3FV,-DZ&nKX07ddҥ%v1peTe7y܆PiՖx1xD9\CvZ޾+sfⱮ}>Vw>Ƕ]|4#O]+aD;Ď\ lىm!@A\@0P^ fxe-Lu9M<_1 Z,;6s4|R$_ S^k?1.az`pDVrZ ӯ$0O2:1UqʷU }8?uMt*Ƀ>jɠ0%i&jp{ehDT.@vSeOC}p,<{ VXGӔG1'0 |͟/!)${ N6,b;\"xJWYym]Bp !c K@-U]@t z6Y!Hkƒ d9Qgj~h7];h,Ȯ%O DᎵDD8R fmwZ2Z{W@X=<Q؝ǿO'%sًNV#<}R G ,(S*퐥TGVwKVrБcO W0V(8 epC0I{`K di.JI%DBـJu@ܱ_ "q%(1E9d,')b RD5(@[%}K=uQHGy_sl 4jQB[:sAu~*.nSib8z+0pVb%RZ}_ߗ>è8΅Ua楮 ^J̄#%KE1 V~zĕ}+.MӛybNeXKosy6KSi 1bz+"CKkyp4Ip*2B l*[rFֆ9z=9Bql#tG4;L']LVn-7[^^|g[0>|bvJg޴ܽd7+(9]V8YUpV,9$KB,S6r/!#fjIvҊm om#7Q٪4v'.¾N =j ~n'ĹȄpK^/I_ipʣPYNONzc -`4_} `mV("t0^8Wv;'$s蜸! {dWw!e[ZeK$`<&Bxê$'JIaf^C"쬃]ܸ̑$cx.J|bC6I/^(1=Vf9L o##ҴP6Ӻ,@Rn9s2{sZy!yEmrO1K)v ܠC5]iRYo/sJ%Qi+Ba!rhx~ǟ=?7ۏSN}1ZkPUܡx[e&I԰w{if7WsntrU~I-Z{vd]3r˻Z},9txТ#!ܹ\8}PV1yfZEH5N̔GDV}YᛋpYo@فX5D*5Ars?HC.i3Xk;) _]j/svLs8c}  ]1ÐL9evY1: [G?ZA%]^́ j:i#\%Gݶac uyKbVHW\.-ѐ4wN{xo[4^́G_"S2R۵Yu^E&ՖJmNG|)nux;7] Puu)2<Z$i[OIgiܜ*~%鶼2}z ÐRK$UCu~ه$q{IpKÖifu' [/u=d$NK y0T(K[8lRq{-@s(*6RQ}t Š.U_x8<&dUŁ΃MtVqXGJ5V;kxgI\#yN}_Q♦Krx䜨IPɋC!7sbyXjR+sօt LnRrD> ¯P}Jܫ?+%sXۘC3ӰA#t_NoV]JIT#{C3Fb?KT&a ͭoao>n>ljK5Yٰ#q@h"F19 '2?t}yݷtakMv8*v@7|uOfYgK"95 e$Z `_^~i▨0.zeNA"TI++%-o@U_Gҿ)G!AF)1 sSJW?M?k<7yY"{mI1R󓒷@pH[^x:ne7 .ֽ0,H1 5}8Yz(̜$ @~j/ux$2ll[?oC}.Խ~7k]5\lnG^mcsKۯ'$|'ꣽcŃ}9Sli:jNR h՘x&W ;ru#+ϝ#LCw3 xݽYdB%-#p]0; jH 6AM:NY e$h"L.P>yTsHQ{ޝu`|^ EeLgHX#ZҊZ^ J $FɾuԪvl˺T9t/:xyg+kNz,xCRb,@A.h斏>vs Egr]w3c"S *Ut &Z% @F1%wI ;狎"m6h+@FBַu?1j)"dQ*pTv9P .^ٜ-_=Zcz ҆#`wW-ƏM+j7O zo^t7\" [g*'/R  ^T+MapP<p3BHn@Qڬho?-V=@\lTҊuoe`lb23@: qmԹsmc o_dTH@Jt2-j6+8TieX_ǖaC"{G|:/~-bU$ph> O,UnnF {3`֐y@4ؠ:ZHGKxZ`Za¨AFeV!a"%#n X'Y"O~ mBwqrAeP0 P0)ےMzfNvV!yrX|ֵSkg1d]el s7!9rP6 I^bECژ}e _>dgǁ`"զ\Y:9 <+iGCAN:HYjVIGd,W~xm'*[5Q^##&M3,sWlQ"t%X} T+DS$i;lY˫Lͯ!q_zm5$[! :_ (oZ4yY˅{JH 3yݿq|ţAN"["Z'ڻcgq ;zP(]sh?ǯ`dP|Q{_?~?|g KK 2JHNgf%]h7HQ+i6%fr#rsaRVQٍ!lΠEcr$}~]?+Pc>:ѳ{>~ _N{>UU&U\,*aWpGluqѫ|(tfRBG= nܽ g|c\M'NQ1sa0^Ԡ/o י< i..^vG^e ?`Lqpx@ ӌ֡8+Zb'%^SJu;8<'3pv#f;8CHκ~A! 3'aЄЧrK;%J^dyyLo}0GȖZ*+X` Sļ GJ`u\;wmbrC5@}nవkea-v~0*.~?\rAN$@NBXOC*9[n4\FߗÁ9'@j-:pZC6L/uӽbcÕ Y"8^WR=tS#f)C1z,㪍3A>0\ Ɏ?e}sۧᗟV/,*-<:H@*?U5>zL Ky˳lJ[jYjm:;k>T}V~ б%b526$ᐋ(ZpVs [#:]ْ7tpO1KW破KUV{UNHMA?[\s+W[\7u |uk:`'od5T67xD⊄Z7~sEVAHhB_'.>ڧ:B1N[~Ͽ>?SgX/p?\G?k)Vd5H6>5 !!fXV+C +$ ?_pyBDo ?aO^g'+K]xa %g2 "Byd3g? K3UB)E %NS.63Z;mM~8Fdlb;`GqHV=omnص_6q=o|e>z5|fLO!EN MRau>z$+`]F*E 4hzй#cHNҞ9Rx &l XRѹ]*v;.3myd.欐ޤ}gj xߒU "S9T5oKpRaL: 1N" MBmOy_55\0\0 5|O ??-}m0/!!pF}7}?BȾ/;-W:EIڀ|k0Zղ멵@D6{9khJ &18bn{>׷՛h;6V%gww>'/2{^zGqU{5\3ACƟ1 A\f[O/Oީ[btRAj/g~7MU^e XGF8`e?;nFR~ L CJHienTBZS%KSdIȪ[3ͮE^Ou ganhmd!VI;χz qxll89F;o3*ӻY#U7q5>1Q@2!t;>ZSq:8NU&vI&u|֑{mKF?u[]ڄVmf<;2u<ȴ@BaV6 wI6,7/ZptEyB7=}:! ,61{s* m0c?LAg*:cI)nJȄTKpVDZwr6XIОkb7[g>l1?nպCkqM6.^>\j3BiGqԜ&̘8t"vvtyPPZwh$h#ӦfGBK?Ż-_^ [wwp a.\ohu"JyHc q8xuc#e՗m:?ZQBVƖ uiœӌys8 S,AF?gE3rQ Z:o~}%33E/|$ōR)-Ͽ.{߿غS_5iǿ|t;={,~Xa#p*ѥNzddkLd ъuQ-pPoM3 ="*[T Gcg74Hs -gYQY)NʘM::={eZ{U{}l eh?,F'%`86(Ԕ5õL8,6mAѽ0!F߼a{/cN`[#Xw$}+FD؊\jBkPܷBƉ}s{F%WV蠙gd#( RA .nH5D@TSiV2"zٔ逢>:va҂ DVU9ک ?1.F_[ӴWEWZkQ%uKYk3>W Z.j"6i*{J뚭oSn0W;|rnFDdNKxyb}Lg >$vu*Y }.͑W=/ٮnjJi>gy$AUYf^FAuNS &xlR8OV;bJXRU_+.VZsMyh2p,pǨ8Ƙ6Cul3t]e-p@"O9ժD4kDzztѳs_ _|5%ёUĘ+^%r;K чk =fJ؅Q"#9T.{Ë=ur%9_\w>T{Zn3Ylj6]#F*;xlQA,/:'=zavo)L7WGsdv|i 8U*~fjx! H'4P쀙7|raw"T"cW`0WZ7c;AȹA2e³Pa9ܷ>xذA+(ȭ:z1a EGmlU':e ݆S uQۑ]7lua Lf!820xaKt!!Վ\b*F~:>wD?KXiqպtP}%K:ra&W>~]C8ͨ#M4DP.vk1f+^T $>ZyN^hd"Ɏ$\Ki  /a`ˉL)@&)zsװ`Ҫs<)=na1U.ҭ~I;.Gbu[rhm*E|/\:s޺OI9`Qfթ1ʬ"0_jm=M\0}iIژꪕ ) " 7~F@Ϲ(d)0+rl{rj~p<!Ѣ6<4&x h-Xv+Sn1 zRNfHZ^ҟG􇀑g,LݓM`>2j[;i2},bsp%iq1lYA[X"O_$l% 66z!e\2~-$9B#5܌iιOZ*>7!k|">7gv1LsOQDžz]+Hz][g wbtR|Oܔ HR6g_:@nn!i4¡p-GY 2uN nF rCMX}Ux'?¦sߒ,8oW D)ֻe'sۇDgi1#hɗan=[L4x>Y'kH0P8VUZ#.#pKXCM-S5ý-'yi*2Ň [@,0FiU hWA2 qvcH"Xzcf+,z7K](=*, @5nj "jOs>U}mvoD^J*=$ŜH"z(#䀄,4fq=nӥڐ_[JY" Evd#G6cs>C @rzX`<>l%Y̜2Cn] 0a$7\ܴ%4+|Jo OZx:.IU*ywQ0Y!g*\-t.R0}K\o }ϭ-i-k,PjӎG"f;E=4 nq=%6 DR'ܥtπTmW;6b* D偏sue62?ߤꦫmk9=7Z6M-ʥ8?Fsc$7WlsU&ǸjvlnW8)ppBf4[* ~io5 y4M7ߋ^-RKJLSqY0N_m7~Qydyݗk11ؿ[R奔U ؂Jf%y3.SXN\tRZJ.jww,^,j=.yi;%;CH+)cK5yֵ,g>ַ.'CUIu`j82$Cn-'x)оNPgBq|g=| qb+ͱ‘ `ͭ*K6W<䷗nT7樧b~q(52g]o+y/KueΎcM!r–,vMggUkQ "=Ŕ, Gݜcug\.tCrd#$;Q9)Q|20tO;]!~/=tlVxDf 0Dsa0AZ W +[6ɰM |Ш>H;;S#re},㒋0˄V T&\EcTOxiU}D0:Xx“M[bP`νs^בkUVosMɏN' x._gs*>ON̾XvR%KDoOTo*&K0pag-‚-hmJu;67N{do&,YS3r,يh#cJ%:q-ʬPnybkY2HTobx{}@ )]&HcXMvB99%Q.|jKc[I>^U6?|W鰈,S]Ēy;: K0%Zf RRX~z &~|sE{}N!1rX@Qeĝ:g8\.XT,q᪦γrw6fꘆ}Z, J / Mn'uxvnlCN^]Z;vS|{x'=`W<ٕ\"$sIsӖrL{3I9>Zyo˕^{]zcӇ܃ts4NuBUeppmk總 {/ Ā>Oxְb"_up6׎tUcMZ_ *KssXi珮(Nѓ}cس X*KC`y c$@1M`\̗K;9.LՒb Nw˵|ԲWUZ=箓n{qίϧ\t<ʤ5Ϣ`d+{(qz!8(va/bơ͏?{}Y Zl/,r 1cB ?FM*Wöfrт K=\sC;r);w0D{''|妃B,%}}O@-rIb5d!1lX>c#h𲳝=O;B+o^:oD5 ~5|>1^KqcDB2c]tqH\KOl1Ptn$zRJpLy:yXmq29pB/@swg}HMJj[ êqkw`xBfH Yt7KϞg;-g0|W*/ҰD;KܵK|4ŝm5VGsӕ,棗\zHćHndyx*Ũ\Ҹ'[:n6l= x%P c3+WY줘LeC{N ";}r3: iff+cban: 9Ȃ;(bַq>v}?SpڃpjOٶO2~r,n0ѯ>3ze^cp#h/()"VxKWɽhnZܒSpkOQ_U.l/;V oq#B냝|PڒK"1hOixo3g +_bBPO9^{j6{8l\ڙ5)d>! BbSV!*(EN=8Hp0 녖h/R5< :V)IPXEr%M!ǘf#lcHrOb!|5)͚8d]TYJVUVnZe6oJe3,W/3u2)pAu?BIʇk21|cǓif5,{e^mW!L890H'$w#[wkx맭G nbS0 se7ȀS-ԟxř6)2[ZuugJo,Vo4Vj+7R= ˃|LZXCvb5߱-t:5 RX|w{f/8af!5$'(Tt:?̲Szv jrֽFp-R$r&o1Vx hJ13X9Hr͋@xG^|c !5 vܫIN0ɺow+pn\"k,oZb˥["uP+S=?I?=1G}c|=rMsV|[)NxTK mVLSƺYgoWTW8?~ ě $/k$OCJ:+\B oe륹}*buU9َEwN(!;maqe2G1Tnn)9(×h[pĝp] :555ᎉ̃9~Q_|kuwla]1TPϱdKamlTBeeɈfZ{`5@2v;R;,7dvM;ˌ9Y{4کRtM_g[b?d;ǿV͌}P$vsp95C&7ր'ڰgiozKrۮmJirBC#՚܎[>f/#Mi'+@Fk}I̝c47R*m9k:B}q3&vХC ƋfK8Ӥw4]:%bShV{3evw'9^ v3dQb׻ Xr' c+,|%i!KӜFi&SRWpG.9' ~_ kw7{z'4VJ-GX*"HH`GͲwz)&B<7Scebۘ0vtKB&!pp=V:}J;ƺeSt mB<ռx tHw-L"f̭9d4/UHbĿ?G<>_")i 힘N$q%%_sX^j}XZ"ZNrZxG(Y]FŷM3{ĸZTLQ-.Ct@4Q:Jzlqd0%RsF8ƞjdINP<R@Y>JES_XCE[4Yy@K[Ap~:ǰ}=(jy`((][<8hwmz_b'nM{ML ɡG7#T]y^+V"Y䙧NL!ʾ&Q4츥e^O}J;~H)XE̸9sԍ0ly{2/{ےS;~qQĭ%Lâ۾~]_}] HlCYR k~8Zr2j6ڪa//Akgؚ~C[(V&NҜ; a,@XU"og6B1R2BjpV?&62~OyKп.-Vg {WmK=Ф!c #BԬFxd˫eU Fb!duι;?[py WkwjgsH­LƐ^P[ *%g.Т9ei}_䝞ϮOd۞p3!A M`$ߺK<E>MH8"SP?@aziR o{Z=z~J3EgI0%+Bv-7_GEd :v 3rgA鴶5`;.*:V;8Rmjq#:9Ŵ(6)2?&?b<NIW ivWSJ]nQ"ۅ-:#[fuga2oœD%JuBKcb_uŃ "\OX8;Dv2ŪԑnqzxVYo 6ق.|piJ =YM;Q|@V)[~~vUIN,=Ѵ"NFֆצM[z\66}m@-_XYq8֋ò¡QBHr5׃W`1WM#rl,TS+;A>9S:[!xj]9SȐIPk( | =dž]~v\~.paKfڌk֦ vikSOyWѺ<\ `[1KsY5@-d w!yT?y_ܢ)%HPd%1O1 '-4edաN U*7ު0yw܇aL;T6-+ͳ5cmxmڴl]6mmF]/,_^_R_^ʃAc;IjѝY>[RSȲugb㡎Y<@]@By/|AZN]]ޓSBc bJ(ThT,:m~Ql ]\;^hGaX6mm9OX^6mm2Ḛ̂"3ȴ^\=Y(ü.BO3H6FP_ qTBV4!]T$?=/L+^(*9*֋9o/P*c6tM]Kk#kkצM]H k3ֆצM;]gXd<d+1rK 5K6;~4%L ݞ{;B?*{JmX \n9B馊kƆOK}PF|nD4:E.׮3}{#]MT%da1lQ G+%->8.z HY68Z,i Pn<- aw@NI| :e0?H>l 9X xsV <]loTv6. -c:lG욁lv͔XR5nGrd8RV4k}:;U2,anbЉP}Xa@f_5\#r\Az8Yۃ= j*͒JroN]i㩜XH"]~KSYi^ `l%iLL.O0WSx!+o-z=yeWH@eǣ ԧ֊\ń:}i"[ GJFy@V~4dV<;z,)gʘopQߟ&rp = v1IVߵrS|F'cO@ٸvy׫I5j%ao )Nzyw =]Fi] \VOpGcOR9[eVi3{bV,qȕ]Ko ~? 蓲m49cTUj$7!ie#9ꅒ̺4@pӶq29M e"T caf8GMy$˘Ki]ʠ :+QA&~ZkgY1O^ɧ\ZTn?ݤ#޿Op09/Ii{t2s%`78"$)VAoR|՘gk M%W{3l'Xk~R/0tƽ$HwuNu~P6Z5vtJ"by-m絝?9|_~S/sudEOVzco0;5S8 VKCL*\ )Yّj+",h;llY:*QM>춈П'gsjK9s%b]( ZzNرR<6[Qgq,K?m]FU|L>OtK"푢ڧH"[aǑg{dr9]!bt\Ʃ6AxuUyJÛcQ.6o\ϸIwȗz!? H:NuJK݉ >&Hl]bdb$Չ(M3h%;՜ܷ?!?%/ ':'FeoY}(RSp~5 ؞ÞeabhOuSjQEjKrjW}'4~w|y~]*FU5STif8]htYLaVKPưܗm|97螣p>+/8/hԛQ-ĕʶ&=S6kn,-R4)p:j2!J{zN-شRʶnN|҆06\U6N֕($?=m-k/B:b۩P͎@j9h([VEJ/Xsm7=>SAߥ֠VY>KytWC吢 4(by'BۡjB{ ӯe5>Sok'!>j=B ɦL:*7KT9g,r(9Fq=n9ֲ$Ŷ7 {WrNWMMZv'\F|g)R+BG6ۍFx.40;JvlGO1Gwy+ƭK%C|TcCqƔ}̊x;Ԇp'ztԠ[-娱QW8\nV`d !) eEBL)Qߗ_Noˎ=}40>g$oS?;öy.r>lYՕ.zjri'󒿅HTڳ :2Uc1=x08<1ы0cqcPr>Ff ΋FNIu4f$ sYua'wEIj'}j(_nwO4V'["-c`-ӚC}-[㲌gw_vws^7(>SL>j6IOr-94ȶ9Di|ܦz~g5փ[zQk liE-CoVr좺ojGjS\>|nao\{|W~nTBö 6f2\[[dU'}qM6l}l17?[xGNds VTpZ9Sե5)5EWNz?g=zՙT\)攎{kNm>}qХW QJsō5*-nQ\j>$fMmEiagTHɌfץG\rZ%]YUI]ϲJq_>_$K5J+EXJ檲͊ۯ;;;>dgoַ =LN6k-VkcZBN.7kӐIu /:ra,;Teg}K~i$c;XU14\R*`^ʸ޿\5cVϖ_W_O碩OI^~Z١Ж(9اX'=YfˑWT/)-'l[+Eіz\tn]q>ʫ_m;BFg+ũ}U.sq!Ck9UŮ6eFI-Qenu,xQCmWku YE/ӢzkvF4Uפ桽I(spxS% ]->p!*o1p>; +ѸxQuRy:7m+#^aqKUkK+LG5˻hg{{AräSXREKp#㦶sgC"JBEzj L#RW+ܷa?o|h/k@\8=?{OͶbsҹ`v\#o,96G5f606q.|,1{>R +y-xht-ѭW$MyKgO~G\$%UFAϩJ&Šj?oQS72.&>8 by`{\9j>2<ƑPVcmjibVlit3BtڪCQOp2$̃g{e hrK;rmF?13s&M 񱭪kHUL U#6cͯyU(]_MF-ՁŭħȗE!uv#,~R!z#3k4ZiTnR߷P6g~W> |]b>MGγZaY֘}CRݸ+ksIfLZQ% zߎC9\:DɱO"V5Jz vFl%2 k.=Ji`Z΢/5V{|Ac|!>S((n d]$x՟'ycտ`iqSIm;% }Lp?St}Z gҋFXjg#0- TI5gGND 2HNXFQŶ>UU| ~xZт,[ʛinr0Lef@ڍQz1B5C׌k2\2z6 ;;;@je5+ \MPRWClev!(&R d ;k/ʜ44OXpH@)v` p PQ8؀sہh~\3\4_ldzhA`׶g87_f*]^P^)1$͑Xy{5 &O 2P}Hk)<4}q IhC@m4(T)%H >D` < m-2L'S@iHl(7.İNEzpgsHxh uDm1Ќa.(o@.@Ӟi8}!; i(l@2[@0pNBm}mD%o(͐7NpL7&\oSm&7 <'s| Z(@ h!0

v` puܗHyè%/;P?p %@vܬ?7MfEbñp !=ZܣAEQ($wQpjdCĆĉd{\d m\Aix1;` A\J$&5I@P}Ȕ1*7x_p{RXn)l9+jJ^}q:Xx7Zҫx7Dg"j[&۾F&@NDm?Q j|Ƴ@(-j4%ogDpI!.CԶ#8z BLdDm.v#BDX iBxMDX6P"!R}= 5 ׎wdG\|QDoc7#Zp >\&p j@m$}&p>S_5#:C&@p!RDm p!:A"Hm52pH M`ߑp"RHmx1" ڎښB6F{ $#A|0 w Hk {`I3әY݃F95Y̪|A2bmm1uuMu1OX[]ײu-uMW03kq'-_\.FKkW5'u.6ֵ/qʺ>܃άm.^6X쬯kgpu]˺OܙuW03k+׋u͟03kkg6Z׶ZF{bpg֖kڮapOX[^״Һ!c15kZ׹ZO'ybm}]in^׹ZK:_+ݘZ>__;ڙOX[^׺ZmO-=gm創3w[L-Y[zbmuZ[|.6k[ L'6kˋY|t0#x暨Ϗ,HDC.>z{wkvG*j:mQ=*zޣ=*z>7GEQ+zޱW'KTȷ[1tk<=JvSҀl =yzޣ=yzރG=Q{z*UTdXR73PԨ[>~+n޹Xl2C 쐐O)ңTQ{GaQ{Q{žH:qb5V #&k(=pow>v#,y9V^5usA;(#}>={ޣ(={ރ={ޣPKB_ X-;D HM;1o)}ӟ;:w1|8 ,l_%N##_h>i066'kK sǁ_%׻gm Ԃ[q  SiAt..4dҽLBd]ơb\w䓷s_ rcb^q7&zqԩ4Bf>UA%;78e\ufHq [䐫y qqHىZ LTf xkK N<`p Sc*"X[\kzcw ᭽zr>ke畓RfBh ntfSFC #[;6]y&/D X\q!jʁWi|AW;qjSYS Q^cR ~}WOl+D\d \S>ՓDcPR8f#@vWD.%Kc+{%o=ߙi~ր g"A<@ dz¿@%m V^wT1n9IݳRwW+vkKChEtR|DƁcS|]?txPZ0, eۺG+0xTBn,2/{Mj-}lH[ }/5QAFsvw"T)x{A( zGfFh?ȝވ=cTQ7UZJF`- TN\[\ 62X9IoRS5",م n\@=VJv|D5Rr PͧƮ=̫ZV_o}?Y!~()R}sޱe?;!tD#?ݿݡe B0(dq[t|$,v>R0mo.-І %rCKd U{E;?(}NduRh=HŀkK0,< Z\"BɍtP/\NBpoGÝl=EA>llg+ _Ĩ&j,%iW_ O}]SF ،s6-s2/Iº*r&Ѕr,&\R _bȟ}>Ei)<*7.^|{L uZ-^-p&<#P nՐ +ࢬ)3QUm3ffbJc0#v  :ZwZK0\[nmbM^e4k.mb |+) ُ}D̐ܛ{3ݲԗ/5Oy4[OBQtqX]8Ըz A PZGʶp6%ݲכe Aa QGπO,52] e3@M1 iY-lVX"~_q\ ~J|?xk {pk"uwIEIҊiۓ.;WPi) I65s!V1c\wjfȩ5RhX-BǩPh°R}i6r9ԿV3OX9W] guCӔ l= x̑~";vhsrг*4؁jE@]5~ib6_/>ÜH$+١r +y iw"ԶD;HOSN :ZKiy>U"Ύ/8qᆣgk:ld- SEކ-]W ms!ӗV .1GA&I1I(:`k\4by'd/Lv>M:hϽ:g|쒤qIO.]vxPkAo3&;fkvDB/e\R\+"*_BӡQ]Y) G衃 kR4 * _j+-↷r'0gm)Vׄؕu ټ"r1r-KWo禾[%p*R)Xrn$plĀQ ~G;ė"YR9B3nQ1'CG:9-դNƦIj{J1 ŘԊAHA.g<2t/?o[m/ǸնC4Տq˔.=~!/$# :r%:|7z\WGRm>{=gT&> rX;(/- `1~ -vos(_YkDy͎ݎņ_g_K B>=;X__~+?( lx,Mcbou:Mty cA1 Pm"N;p{5w]l'qFV$]_y6G<"3M;y2\ 4*/2Km鉑;ۑ6lWAA5١ho}Խa7;"&+bUۅK ?SN@SFQ O8'^Jhɥrh.0o}H+49*Q'Bڕn۱t|$:3387\@s)xsۏaPk8Is1 9hŅϻHDfJؑi Ls34Wz+qFȫز ӎ\”]&)|/~ߏyq>uݺ>} 8{]_8IH)TC:k\󴩻֊}2 $ a6*Zi؀n#ݡ l;FZcxIMeOrB 2{--FZ15Tqbf ҴMD ti~_6>}K{ 뛋5Զ?V$f}d˰BgW<0Kb`Z_lsQ;~~^lӅgk_aV죇ϭ)"-/F|}wI)f3Wؚۚ|n6o#ֽjZfŗRbXwhkh]]c7nEr yI+^;Isp5;-ݏa]eT"ȃ89ށY- 6m+e[$`S9&pڰo7;oZⴄECMro򢫽t+><,KׯMV!x]zL5LFֲtx^FF}m(foĹuOxm6cl-׆(XTsỎbmф*su4ዽ6 kӹH/\%߯Q "jS#_W{$wF:$6Mº8'urņ:l.P>4Grh:2YU!)`d6k8M5^Md U?e\ 5S-`Y>eWɎΫy;%,SkX[P)a?"z~uXYK/D%Ϟ bǩkdQu惏>wp7E$uḱS+8[Y3퓣LQrwI[0L%&u.36lָ7q4|\h|BRnc.oRd-ҍ Ӫ+ inw'[S|0ȃ&"c4)@`"1 kwT:ωmRI.3G JANnTƪk)byƽ:3|m?e'~EVkn,G1>SִcPnGu8(Bl/pݹD*;"NrИ? P$i+l)_:d- R&@Hs&o sHu;%P`uS銌y\ӭ@J[A3HC1-!5ʵ%O )|EV՚4q>HDe'# §\,HܸQ*U%7Pv-$E}N 4<%l4ipcݞ0gӚA[+T2' n4Um+r9C*l0 N.pDϔ==G5[5T;kv6[ƹ0EQkq &:.~߿ϛ Qߞ~VFV[O}"nSƜPn%FܐVdihlyV_ ` U.IyKS?l3k*֚Q0Satp'܎Qܾ5):vnD#9k}^ujr>2R]gNVwwM].EV%}cqTV\F+]Q:ʵ}2#gR y n~1)kud=A=l)x $#V a |PGŃ2c"$%8RppZe$TjsMYBRr tf~'"Vm+ai?͟2^۵O4UY96 \-U tBsikLn/Ļaܚ,2/tϺexj<Fj!rì['iŗN1GCu]GxtT`l)\>o~,DT;ou߻\!O8(<1gnuc;S2[lux<6^^&pwԭPju??l =%8=Գt3ٴʁί[w_s[k#2J*)YW ]WWm)93pPgeĮsH魨SUZ//|ɡKb.7i`hqci%,bMW'QSWܚmgh=N^Xsۓ?g3hĵTdfk9D!~ L@!Z9`IZ׹,~-E'KNj`烧_|W܌t&Ȧ֢%ߊ5**/HYK0mE c}Y?7oWdJ22X!ZJ8mV(Hı匂S.Sxo(k/3/Z*˝kÀ%+ۡKx } rƌd݊Q.uKAqp3]ݦ; ?sh>X'+5U[PA® V1hڦˁR0:Vi n:`3, Pߧ6%jIQܧK6e[jҬe/_?/!#oƹJI(Y}zOnPgcbD(XhФԮ0$DE x|07\xt`v,=jR*4h{Hh"پiW/ZԪ%O!k _v9t?x:` %n 2MHE0; ELĺ z0hgHj>9mݱꋁ1Żڬj}ڸ@L *tbHրqjjbAcmI?=߮LƑ srL|7 XZd&\ =%Vm5ubVpn37R_L>˗gu'O 8lax7'/G皹U<쒩@X f+c.7Ti ѹh!iW6enVd+7'_}b .gi_Kq]i\"X J*该U:y@tiMAN*X[ ؙwwm44QzYs70?Ma#8aSChk`SvƲ(.!of|Bڎ އdfhZ,k-ZLiIrpTL̥$ }fJFm\%$@Lij[CAOSS>lAGJL\aZl:LGo`?|~b.D[>-KdOnKbHr KU5, n\TEAןH&[lƛ^դEwm[r8RktH4 N+R.z>| UJ" qap QQ!V6sHNdZ>&?a G{^8#z dIuJҡ#Ḯ^I`%hDb),FU'9;|Nfe"4]-툻txx%b_ ,K)j, ,$E.{Tg(K/ٺp5TgaXz z>Q`:[P,q:`IqYA߲*C%Ê+=Mv֋|B'pu R8'Z IxM|n5ӛMw9ĝD, 9BÓOT4<ءCpBSo)tHR3A:8KB}zv Ε7&e|Co& =~~kl϶ow7oggoo6g}+66ƲYJ4^ ?4`<oG#@kaI 6 <-*x??FWF޼ܥdg_u鷟noy?oZ!cj5(*oTG)<@r yX*&XVRA漕0%:#OTUs;ID.6sL__6YaY Q N2lfɒA& мǸ|_}~ `G O៷r6o،f,O%`+ruKVZsp]I?I, ŘߊY%0Ԑ$mbCjp(tMkq䫑mX|,I~,w602LRvV9k>xO.c%2sGpFK>uӢ^o2(U$Җء'SQ1 DGd4B i{-vkI}`g'N`l*7v1=( & oE)XSyy)eH9~1Y= 7ֲU^kD3d{ph10=h'y]'_9gAȒ,[oBs87d]K}zH;a 4XG.u ;m:=ժ,E'Fj)= UmXX|v@Ym6x31X\cwabL6F ~ `!6aS5U !b?[QX|_}lpϚI@r\qZ{jyҾ` .U?Pl$e0aga1rHO YAQ,?PSn+|\kU?6eu.Rԝ:Y?{+g4)Gх2,xӭ#>Ω8"b91-m2_tyQ>=O>[AZÑrf}f6u>2BźyUƈKa^vv=Ϯw[C! LeKг9%N| TA֔ ѬR:@y5Ee@"`1FM>LqYKn$H$^rp8 ׀.;Mq,u$*57Гjg{z1'"q'mŚ[V 7T!IIUu.u;{HaZ]Qvh`Fd!r<3ēL0@FbΑFw5!yf0%\v\~ng5['t [f$ǬɈjΚꩋ{΢CH|pR'e _ mgTT ,(& q)KզG%&c-X (4KD|âvYc\oJcfzvl]`oof0xx50e|qw۠e= 윖L$&i)2wGEɵVn [Fv2!X 9ZShN  ֬;/>.o^_ğbY gRNG tPj!#WoYyYAڸ24/˴EB jD%G0`5&PJ;^agWhFRk>85?֡|-~ |d(,J̩ÌG'i6s@8 W,#xi17;"vL>\rA\ښ`5(v su`)Kv.# ~ڋ9"HJUQHL$ D iFQX]ڴeikw,{17?Rcՙ8zndEZw@(7풜!9d>5_e"ߋ"agڊ4 3j5y<+J@\HG6V*[W|,}YE_b9! h81#ByqCT.OcvR lܗa"ї2,e~e".7XB!wQ&{jT9A#|K*<}X~㚦5͹[*{҈ūmYܲޏYN&BO H,q/@tyZlu2D~ZD  i( Ĭ ֻ52vn?&Dc8nB24xZD 8,U\|UWbG(oN=B dlW%2h1UC %ḩ̂\,zV:*urS5OM0>Rbe q9+f.`ktY~b~~#7V@`v qZd5r擬wbT"w@jaz[>?eGOG;ZyZ6dZzݘT;Kv47b'Gr-8EN$BҖwdˀij6p|rRԼ6^h'֘pLPJ2"7@+ :nw"c&r־BH< Zro>)%v>mQuד"X(m Q_]κUعw(k']( ]Ol3U?UXyl1.aCo*’urYt2``3t+.Ay9’Fwoe7_ğbֱ>!k#UzMbWҭQovej!Zug%$)p1g~% "gär .ȯ6, F6h4~pѷ~aϾŗT??ov[X8J^*њV&C}&/אtd5(f&{EHnO` Oh1"oFb'kׇQ(^N!U0;c9&k}ɋ nݹn)--q9ZRM4r1?ɋ ଴% ֎~OMIk  _מ(rS)[Cktm53ekZ}rN֭"BgKGVmNc6El l˔nÿ)eR"!欖akMzvf}Xp>lCr TKc6~޾mYe9 "14jM[[lPAXvرc([P9 aerT^fR#ztg%:>ITgz\{HF19馻g+ɢbW|;Lܶo{;`FNfP%)cLw1ݭC` m4d SE`q?%ͭd7I(A>yuV:Yp ^>d.i-iL 7+"Cth#@ms+{3{g+`|sTS+Ui,0M}xW]ىE;D%0BzBqPx*Pґ-%%ZcSadxE!"Esa[+og^X-?nj^j\N<[$  5 Hj%. nx5Xɮc`q1& ԓy%XlW-#>z rBmFM5)b!0k1ퟯ?qyh؏8xKOOsm~T(E ,C(mY(/%@v'J9 ΨއXZA5QdV9ɞ )x X [ "Q0l N9mnH}C6VeiBpIJ(V$k}{>XTWo ڼ&(g[WP*.j5[ԝ(ZOniZiCXX5q[ٟǯ>fVܫUhέ2a ο~56*1Do3Z.T율ͭ;rûmnKX#͙^u$`{DvZfiJv=56< wJPܜNF?E&'V6Ph11s(YwD>]7\PtdU܇X%d' Oleq,f3!p3X|-2 &iW\ Ђo@Osz?PXC~v5ϰ4D"$ ^VqgKXwgRw I!bo࠱Yƚ@ǒL.ae-e?@ IR ƺui\'U`) BvS\sH1%T#xO<Y]<*< 5JCkbaQ*Hv0[x\yI|rnٺhDF Aj oϰND^bkB eBw>MU(;T7Z/^~.H.R8F٭|k<~ UNjdrWh nš86LZ_:Gpt6uoj~iUWKMoO- -fK,TbE,;rzl- +DP&"bLmvjkhzZXa3Ek(A M75X,Cfv"]BC,/OwcR6 0>'G'KŶ z:8l_(d~}z O.AQjWRRYW49טyqU‹E4F-c#uEyv.֘oU֠;݋fRLT|Q1&=Wyݱ(>P-BKuGئ~2уTŊgm,"Spu 1W?߿gsOa;=>B5;赧ϯ9Í)W?TCj)0`qPRg^8L)$j 0LU\uZS޻Zqמ htX&c)tǡ7mjFx8%ƞDeҐϊDI줪{ҋR/@s$ yd.gpyr5XwT7Xeεrq=Y6O|jG q:*IaJy;殃+2geg3BqxK6\C#2&/nWx/Bc{e%I]lb P YZM} ,zg(n6 "<'9&(Κ4 zִ3@ܲŏou$0/W֮_~> p7^,.el` fm7ȹdIsQc.{F iN]f)s+q>k#,rۥ(qȰjb?g/ZYJ)}/SّM,=ϣ_Aei}HڬifI#ÞUGc""O`sn6P Yʀ__X'e|>=@m읧˧?_^Rhs%7n\D"~>$T*YǛd}=h3x$H2:&`G0,HpEkN[0UXӷ0\sH;_muNyQɘ5 _SmNx4fFt޲/ܾr ha.>[o!q;azRWOeТmZP f]k4@#T]#]ص=B먴tXM>jk S SQ2y6Oas-{ea tml&I<zc&==LH;"_+Advg,6R醔 ZELf-MdN™Կ= 5{4zLߜ1e`5tgiJA39!B`mW?ra0Ô_3]^cYE}?x%|S6Z- +N>\vJ=VM*T۱ekH~ر+m<Yg,AXN&e:re1E*SB։DsH6y!`/O߃2gM#VCp0=g|PhC TQrcut! _5Ù^ ?o՘b@z* ;уf-䫴$9)ӆ$ SA 8@17-!"ծL Qm \r n`L`J.[lIwmT|Ka1]sq7ځmvc =Uys<-6_hs)ZHi4Cj\=z3@m_ 3c4cQU-)$BF&VKs:*2(p~ zGCmP⮪YI59 /*M:2'VVx{ ZQCE,ru^?ҿ._~۾q;kIf j|vl>m_XKF_]Sw\7ߋyzLwd&g[Jܤ*9qiV# ,5*AWZ%g`ڜ,N9=} 05Qpkbc6W3HjAg+nigF* '7yrC%e}+4ͦu2z2tѶfM܏RTp&ac>0>]5چI% MOHIEzZkoR)zk̈́э#6u\}g/J=\#!;?| %sUQNZV^=DYDt0v--u 08 j*`M3*,_M~Cnrp'c.filPj>}rT^(ٙPNS^oudF (uBӲԹvӖQO9LAa@&'RV%K)Epi_-g+9m}B8Rj@eSL6$R)4gu;3IVz` ,oHG4?|CxQEt9XXMȃ!ȿ{D1蕸DI?#mZQ1gYO̅Ob,s*qzz\%n2=L';ӹÖqr|xy PDRCę˜` ݀N@vEMkdvM9kBt!:f`w+G)J yo"Hmjل sL15 9a yͯJHH}%LY/m^=u+}{'{]nd-Al*ʂ˨!N9p,ʹ\s/m{d:X?楠"V jS3 ʔX]p\ ^wH.wkk=5A"Imz?`۶캗pNrTTnYuQ?J- 2Ydm9yN.7 m˟l}ҥcSdîƈkUu?`xQ5ӎ`uMu9'gۦw1(خqXWܨ <[}E *@ǭYz[nE'nK)ݢl,1.T8غ[RQ;"2[Bk Q* ˟qxer&<)Ҵ]г" uy`{"sebZldب5ȃ[ۓ箟{z|%"|öW5mQ(Rmu_Pz] NclTGeJr41aMNͦPmofǝ祟z>:z\4CJa=ssRw ne},s E4WuG@s^i+ӠWyG:4ly{@_O6g=ZɁ]_< 32; SSFS 4$Ecc[SR",l׿61_7^>b/dϿx\/PϮK1= r=+XBAΈ.ۉl\F@烦2iӁ{6l4=r㺕z=#1w뎞)C IdS:&8<.t&$b5 \vySOHRsl;Vpy܇q~V Ez&f2 sǗIn_0[@!sAcKS'ubґlAn4s< x/G9ng^W_u^i iei4Jk0XnE_#X;<<`zl|oăBW[Jq?@>f69!m=;P@uu{<|^{x୷+NT.V^U*-wpaGPwѪ*fZJ,>-ݷZ';+EٝmJM5xH iH.Xnuۤx䶑Wzn1 jٵ(;ZT4\@duy|| Wъp*{uT{cQ9hp0g&LHc1T@0Mݥsby~x5HD%E"j,J;6556uV> ex ўr0jB2dO@MPd9IlSq P_'\ȨYɉXuxXURHXpO^xnPDReisp=JctN03ϥ^Zt;r´{[^s‡Ӻ+ox V&(JEP?Pոo &죨dy@4[eJ'_&?Z\l15kAc;[$hPRW 墋{JQ6 ~[>vfdxaV`Ez-"_VC{iCa&Pjh} i`i0ݦaSO>v<;'R6xy,b+S霸sL:Q[Ŀ<)V]dV,9{]MYǏUO)RDE:+Mw{iC}ʇS "g%k3$U=6v9+B?C>^)˰ܪJ<&tT;zՙE^w1_BzQݾ?uuqPD7GG4ᕸ[zv'~?-JoֻœEz7ذ2.PeK0\9^Ch$``;,s2;p@ $h Lxh $$GK`ʲ $Z8 4lǁt8<5%x' (x6 NFK8p7 ;L<Űe0Zm#86ήaO.19@%p1Zgq`_xa\ZpN0d 'wP2%胖@c2l-W Ugv-؀ }G{J5@!lzG/hH!mgy9d*='6J{H{H{=@NF{hl@ih$$%(CinH9 ;p l@apvB{ 粱&c[BM?r 6MV&qܳRg 5Pj>Cg 53|Pj?_]Y/J.L #mt[Esr؊57g|h}fvylRU2'A;U%Z3|Ɯ_qwƜg̹n6;p@ϯhS.DB9/DhfhsmvO9y!ڜmhshs"\~m2E|mm2R)7D_՞13|ƜϘs>cg̹s&%xR*%2]j0\eT5J\b"O</5TYIL WePu.'^4eқ+;Pv(/Ϡg5*jGso?#V|]} |zJъaD{ByϥHYl9(_sն&+sopU3]HSG?rysO`~x#𲚪7"^ZRp8 :6ڬVObjBOa\-X\#ZaQ_W.rΥꭐ߸TSIHZϨdKu߶Ȍx|tH.+lc8=0rֻ\jrW.욮VK1Ueu/;U-Ҋ|ZIT9ڹ8c}G4/nM@͐:FNz0٭by嶭 gw.]Gr.~Or?]rp%磚cJy&m_-ӪR^^o7\9l9L:ͦ~!V իov%{?O~O{?}(ߛJLE'k%ۆNe!ɿ9&G\ʠmmmM:,?YML'M[hS$:nS ͏bץ6{(1rr.vvW%Q8ڔI}+WUC{OSrrcW]jF(^o:uɃwljTCJ2jiP=v'2]YQU)C$ZFz,3=-tr=GK55gnFZ=4S8^=o2 v0l _tn;>,G;T:B`:upIx#pF'G\xm[۟ kvf5=UEP#;w^җEs(-I͹TGh!x9#7bֆob mjlf͢K,c-kՍP3ۻw^pSSSTo'U^9Μf RsZCiMWqUuZYrhr as3~)-{R]cR%!Ӏ?Ѯ2[RWW~xGڛ~ۜ=+]̱ľ7VuɅ8cYocm^sTVjɊBר[7yItk^gv ߽֪j3*zMՌZ Y;rv9yVf{&^T')^e<灈N/uM3N꼲KlV kFQmjˬC!7V\6/ [ irob}.h5zToH=,I 4 1e+9> 9$jYuS(~a!ߣ[2/H*j]Q6dOVXzߡWNҊ ԋڱ̽fD̟y&߼wKm>ugևSRm:+i0J3..u)Cm0=8TI5E%~JT}Rk$4u,nE? [aվ->s}JP2Z~Լes%Ӟpm*Dä|'ZJ63׻̅ԅMJi}U?tKۼ`(YĔT%"6mLU /JpP'yJ{Gюq%3e.v UTbOCo9<'췿˯_,#EG^1R{T -y?w纳O%=we k.d5Ԭ{0u|>tz.sMz@kygX+%k[#7MH xc@X+LHrz~O6)"ҬnE IT^jiEYXuUtGG0 n.lݵosINͩ.a,Xl7밀)FpYmyNq6 H[kr>%ϖ*Yf{˙$0:pтXGU qc6Jr87CZAIrC\}B`56}zN.j6i9PuęWK@NmVFҐ[ɻ[HʪFl-`SڈU1zmy@Ő&1WT?™TLjwLV82g]Fp6-8a#T׃+SMvcWjrSmOf.Mn^8iȥif2J+ Y"rgXᷰO$+ƿfR]\ʊz b>8 q{d/^ ~5V6At>>Ȣ5!X\ȸYqQu1+q񅔇[@.s#ht)kրxPB̾FZwׇͦzM6FɈM 4%%K{fH)I/KsuKk e0L@m+siLGh"\s%)XLbӴsս=16ǏW\>]Np$bmODթUOɬd V&VYN6z@UD제*д8#( Qx\zSlbp5a'a[N8N8ѡ6",c2 7E6VȖ9r,XDaýxf><OPr FQ%яY|䯠'ǞJNN;kPy(~H3(o0*;K4HTof\g {ypY2ЛN Rm⚧dȜ\=mn"í&^/ʿl.P?#R/nu&*$l/1rUXzmݓ~!8 bg YcXi z,4qimkrv,wzÏ~|{LJa _OpJGW aclۨms[x6z5Vd=F>O3JoXW'S{(쁵pX N K" hܹJ3tPNSZKX="/tQ% 2`Zp`7 Gv"7p30 &[AЄ9t wދ{@eԠ;.EшvΙ=щ8GyVyS-b": *@űNeM5ةhF\^k-p17zlf~_{zQIN \ǹG 6 E7FXp)wjlru脈s6Gy\S@yll"Hͽwn xDЩ"8osjp%>]-P^'KYi]e,BAk(n+kL|L Â_@Ğ Xf)cem|wj<Zgp\A>Vc) ) :t3XPmOw%+qt_tpih+JHŒc&7Jz#8n0KL:X @Bf6.b&I3-YJ6>#쨅Ǒ22$!dͶg a 9"Qn#@f軃V7Иh VG=e|8& ⲕjDa2[L3hjR,ɲDmc2 jG\A-A۬,/=\t>潹l K֨SZM9 t<V3pET>ͶyhҶf J~POuvN*J&Ɲ=~m4'"0#)ODiG4G2gVI0!ABph׈7ms)(IUF[MM=ZK6r4p6B`70!@t/ HhhG;x"L{Z`)Ue'l1bu!N8}?ւw{'[u)ia F4;(Pb5FhvN)pަySZl,9A{+O%kYnVyh@#<}5"j(υr3>q{ n*w2r}!tjԖ()sDІs_\"#Q]mX`Z}^_ftd<~M(OKs>ʆ)eC5iVG" >\RJY\sds`Β7]|յZjYf*":2l OnZg܂(fBD ķ5LR\?*Q"ّ=\ -N 8u !z#epbکBrfj Qho0|CtOvFgh9l)q!A)9F k踲M& (-kDB[KdAmN;+c[O/;ע7-Ǘ1dOtlƮ_R kz<2~GU.iq.;n #΂i֘m<pk3wxXOz~9ـuRV%f-fpGV`btl CW؃Ԛq]b -RneX_|n uTpߠUZ>9c> Ӝ4%$tAjٍѷIY_NO.Ս49Cg4%CW-Tl+[ X8V-G]}Q#4glzH) For+B\:שhs _Y,z1:: M?$wגR"v_P\N&\ /e睫۳顠$q%cr%$˯Ɵ'~E?ߤOeWӵΰ<\t5l]fvt|G`)Q0E+nҭQ_xɥ\i~K`u ex&-҆9H!{M9_x D|l|y$!YSՓyD3j̡}+-$l72,ufƚ]m6_%׵iȯ+e|Guߤ^y1=6ԆJ=TOR^{nk9hR(1h>9;AImEg+{ ϲdJLi'?];[5{n8S }aq,'ſ#֪_6mv,k0iv?>>b$LMA2{BB]AQ\h[ۜv[mu{ydt?;!,sr: -X0´<n_FG頫 e; jeݥt= b\j{|6N6 -}HJɗG雺_o}(3)5e8LnFRqcXw@5=dObsV~I̶6ף}MO1ۧdNƘXp8_Ǟ! 6ys,`FoaedO!9y !l`y Tp2d=QTp2H9>^TpA=;d( Np2H~eP ްA'8@ %A( n=p(~( 2 A'8@$p~<0P@ ܄zfk0/ Np2H&'8@$p^gdPTpAEFyp=Q Np2Hd(*8 PTpVԧo 78'ʀ Np7 S b\dt'p[q(qҁAg]xp e@'8@y \ GG Qek.p1*8A$p/'8@ DŽ 8 Ǥ NA@P P@ ^o(Np2Hf  %A'8@$poA} SPFY4ԩNuҠ AHA=}Eώ*$p3nBP@ ܛd<'9Ox69W(8@ G"eh5(3p5p2HbxvF^ɛ*8M"l(&"lk(`EX@O8 t|} O O h j% P@>$,&¢A=\P@( 5ǡ@͊9JL9j4.]=K@H'L|g䡉%+k:{i5U7R8K2 L\(&7pwț v{ݛHCĿscХl.2Uӝģ+ mFvfF e_Zrj5r Z ١OVٔVJ#4w˘*\P75|f[ia/|um„sdJ{(N#VKj{LӞ};ɃZKѠ766T7Sm&MrlIA.J.|Y䗳t^ȘJӳl+ɯ tӦ^4-%Zq)7"Hb*MWzzcٺYI(_C2c6zz-!i$ *~BPs(Av?,#}\'c,%Pqコkwl+#AQ% E$k5%.z|j/Gf㸘xmZWetEkwk Uoƃw0.6dLǡt= ε|Xt[exT֌&jYHW9 U/We;\ƨ?\::xdPk$M"IU8Z&r@ -ܷ{ToxnXן?7Z[wַ-M dP{b'?bz{.ڙ{vh߬nr,gvv˒uˌ$3%) (j8 @E-jNjZ rm-h4˚YL[Rr_L%>Oot|-s Ns?>y!\Ct?c=/|yqd7oq_>g( >9ya}<z4=}%x\ gyF4tc Ӎ/[-r%xP|N%FpF+gb2Έ˪Fm|\l5ez'w<θ˗e:(yxNg䅑 d|E>/?+iЋ#9N|N$ngtb649^hƊlrydD`ȭ-ub'_nv0MvFd 2=9myghTeإ*#%)7hL2/7TeGle0ㅹ-O| Oya(uP֚D EP* rw}c-IMI ˤ,#K>Cދy>Ei.:.d58)ZU>M 7.٤z)kFD/~=lRd#BMsVrGyX>8]zcJcLkRi ЌK5aՆ W(k - dS~%bM;]mX_mF =JJT촚s1 ZvRbTj-(^U׺}ѷ\I0ȆU߉TQj Nɠ~|R.sW4C-9ս&<5R(҇K9d-h^.A?i?q_l%J(#8:=z_=o)0ӥֱdW49RҾCl*ɚr}hy/Ny`~Vl5miՎ^Wx֜68e)Q4v@XfLWnU 8+ JC&ш& Ksw[#}$nri9F\{GD nceħդjN}akO6Qz֓=Vnk>ah_3 *.FsCR4bQ8ȡ"^ mhBK>\Zt{(t:6- Hp,$V(~sCMvNwk]~uZܷ.ezm%\A{we`_voA \稹k=. ֓o~<nގq2X!B P,x~%Os 'UFbzټD}Z|C#.'u@ Ym؇AIl&7쨣\(rN)E.P "$Dym7j])uZˤϖ2K$0Zj+vd14Q#B:7Uz;ѱ&Y)8m бJLzS6%p{[gG s?~_vboC6;Yd8.j4㊞r?8ӁYA,1u[rQrcTpEIz?H]>eu WQBQRŖRI!-%; Q2e +X^x.\q^<5Zs} Qvb,ˠ |Қba:'[ WbF=Ƭ^FY_ՃU2試g51Wr1Wz4FA9WdA(8~ܩ*BZa:rH2I F?5j?̮( t5Pɺ}.VC* tu;Xz& l|(>H_|5P3qeM '=WNgv(W*H!qMI@*5Uhv*@%ӬYVw%7ϓ|{r{xcxs'Wm {X\52[/ELEAswlbj4ش^ mlvg->dI+NK@EBXKvP ,-7`Nf5Z4<;aЖ)>u;6+v];LÃTd~4q>mC#UH0BNkehы0U:v;>9R֜*-@| ռa(Zrf>5*edCȖ_`O-_e6kh6(-6ֺ8H\QVzgcID!W{Sn34sfbSY2$vjD܀.H3Tއc%ƿa\qr5u% @zU.Ek\rJ9*VekEʙ.B G Hm o_xq1GM}BS)IBXɞYZZ=gݾϏ?Vu!У{oN#"GI9$@(M H\&zsA11^FcsvJPD!߃wLi)|k5q, TM7ti4D\SK7N-u3x10 ܖmq-gyy߁ fϛ$b%iQ7du,=GJJC }d;΂к#LD9C˕ʞ FG ʐY6\ʆcz?2Gcy2ę2H(jt*s'dymZbWpD1CW!hD*idU˽V)% KێKt S&ob1h=wrEj L.,J%DDt)萛 }c ?oд!( \3 * 1^Pup/ڱA"9>F}V KTn[~XL Z]P<+qwc oM8)!6Ji4Pj .Od_ `(kGPCnۆdP'O5M9''tN07xwVQռ $]PA[ \?v|1̩) +,nR҄hRiZpŪ\t5H#Dɬm8q-Voadr,AV":A,[>hMee6s*zT/* /pȰqcju_[^t8%:dq cmtVJzx%u_3}Qa}_q1)O'5!1KpРY VCiTݨ-F ;fέ&EBKEEo_bje=I<|q@f4^rq o: }4\хeya,УUMn?T Hx<sWF[$Q_Snlڷ Φ\χx|]`MXCR90c4P~]Xy}xYEM.pKiRE! "ek3VL lD&grp& v^ؾϭPmN$1Y3a3p!@Tc=94Rê >BrQFL`ps`!9&Pg1\}뿭xjA/d+yCm2grn,88S&@@ O`t jX|w@_r3DЁ\*]nd\wN֋Q%@Ax A3Tb.5 }жhwgޤW`Tڑ uIOg=/π [A{Ztcu*p7J/V&Sol1ޏFQC" br1{"·îDtesJGR_OC#;~ F;l@rKAU;`Pr̦ǘM,c{IJŧbJ*Qqߋ͚4 w=Di[U>uُ,o)"lbG`}K{F".mTGtLLeT@61;5g no:s!dd2B99vFM!53AF8Ӟ${9L.ʜY:x9 Ix/ϗàOqYboP494g#+9\eS5_Q2< BZN?o!s%\(] ۜi9u͆rvj{S̭v4=lH]c:;"ȳ뇊m#[> % %dCd;RtZvS2,.C(> {452zcNKJ-ŷo.ju^{uR*Rt?fz$6p8JƖo#ʳ.gّdljl1E"2{MM#ߐsX9,0vK 4K&,4c Fm/2ty;ٍ阊)v?Z\t KY8g۵.IeZ7QtMcC˰Ü qł{Mp0:mڼĭ5*2F3XfgJqn?Yv-a7KL6^hj؂dQH~GXVG1\N2:^uZ k]l #Hc1tټE LfkkMf79fM#~+hOkم@b_Cp&sk:} FF`LVɒl`݊vr@tvdy\^P&F?v]{ĸN3 At* 8]pJvVA1dl 3`xC1RG1M7ŕcHQ)7Rׂ=m;K Q$.N`m)cװ~ygf i*6mϴᏍ}?9|pzy%8%@ݛ9wdxهaYnfu@ľO=~. >^,uQ LFAxDV-'ksHxގsjӯ/B/Q~ @[s&(|9S2v^)Vt7?44q˧'^)&LŽ|J1D^4&qcag}hM:l= "$*o9@4{g;}C<ׯܬrC$g3FDR)Lէ.0 gJ> { ܬr!-LeKjV ;aOt 1jyIȦ>5?mW*f!`K6 O݉ÓΠSLn ϭ%v?;6;PnYFmz;\cmzlTwE<RF3ƙ鏱d0RpnB~ YwWͅp21YS\k]4]]"PǕ.!5X63JD?l9:l+"MO&SiҒdX\ur3qR`(IkS+$iM#C:i{HOuiD~o"o?|ffwY2`C?&-׽kMz饞H"ʎш@n:S/14QUX*zc_\ݲ1}&ϑCbΕ*.Y^5=@ώ`GG)^r`wrGNRr1M[[v2k7>h\05qd J Oתw^Z$zBॊR@"X=xǣlK??ߕ"W0QB]C84*zo+ &LL"rֱ?fCi#f JBi9$#zUA{&MPEeYcj@Ɍ#{ mJ:bkbᳫy%.c€gf:%U}H cm-+({kۯ+.y/DY]/h:Zhԓ9<6˥HrqkZVÀlȇzd/ )cTcPLNj+Y0ǎk_f4tU ,pwpsLCԙ<,^])qm9s>vB8~+~$/}$F3gj9U``FrQ ؏݉^WrmE*..1l>+4VKaPACBRԚ2gw'Jynu5'|T$y1]>^>۟?nrδ]ac ~z݅ٴw͎ILq]^y6r:ԵdluVv{ Z{θcWm"De\G)Oc'q; >*Q1lSk% 81ꋅjt;D{mnl $!$9B+Nq;HpC GeM*Db=9V~ߟKTRd={|QP=2XM@lK4wU${w%ni 3!OvrOMֿ#-PhŰ\im+ߑ6o/3 IͥKhK\Sm8`JF./xAd`b @QHVBTށw%)ėV1_~r;$^s:yv*IgQ.nv#xOXJݓ6FJ.^b UT:A8 c5ߑ|?bAR JT50qA6)D$u7a8q#r_ehRj{J4ك懴F6m]Gf z ‡LYUնSh'SY%yPj}n&J]Z1l!j6%౅3ij h&u](.!W9y9"Ɔ >m.H.q\ hn=ij iŝ6Xݼ bs&׭zHԴe^"-S΁$'xylC˷zFcAل!WQj))_&Ӛ2j^-FV4Etc4DH+59&8 <mz]rd*fXAsZh%P}pBط]$ ʊ '9Y*ة%;I߿~V)㝗%On8.FRő;/ jBSߓ Hݎs'|ݘk^Z?xVC+\D> vNZbm$/׉Gz#4h4axk13g5wPTo,sGtqnNV ůuv6zjV xgKs"sң^~|]ヨcrVFCt*ObߢxmUpz}{̹ y;BR /dQt@>ѿ~.k8dmu/-oZd?bJ,L<8ςLZDAmz3VūגÜ޻-v*~ N4N;8>TZ􁝮_52~ztql͎VX̹L4+I8_{l'C*^KtAK =#ѐKZPD\q~Z2s-MS@f&lpyקt`e W;^`0"BV*3u^5pʢS4.$VRґ7 ,α0؊ /JfY+$V,NN׉<_3w GKw \;a r z˽X'IցDT*L;(t7|Ҭ%(jc`y(<{u~W~RC"/P%$vs:! \>q.8 %b??BNYYc3m3Q)@ v U lY8H%,6ᢏ_>/pgQ=_Yy9}y>+X&H*9U !EaMY'ǶapQP2wߒK jUNث>\Mu (hTYʦ`OZ1 g?{+֎txxֳFx\q`r02E8X=5~5|f ^]bOxד}& T#B tj6c(LgvvJw  gF/wܝ3Z..nf$0zVcĭt SRGN}unP6㳀{'Cm6jL9&"J-GBF݊,1DΑm[tl݇d[ZvM;Hoj?J5g78)B\qZ>iM$~Z 8\mJA@1Cc!X#KX[ 5N!C FRwy@q >cpih8f 1'b_jMԍԂFqJ6Tف>ľ[|NEjl Xs 4V6} ? *&Q, 4nᴭѰ$YH+Zs,SK[,]{~ }o`^djPhwI|۔k[;u?^ uOe-C쮷)4jMWg|R:4( rv(02Pmh#_[o:1y*Ȳp"΢ݭeYv6!)!akV )_~Ayrqԉ <.OEi]f+ø1l=/L;EYl[BOץPj0gO7) Xޤt pܕ-3'mnܺ%/yR%rjHIıi+λ$ڠy]v ݡ˻ ϩfM!UĨz!9j݉w}:UFcJȢL0/daG];A8} ҿ%v!s/qd;Vۅp\ϑ B]=LokufsCHjkVJ~p1pc,le ?'u iFxSYsזq\E~7w%: wXl4CYFҪs[?3RsS ;pI:Ɲ=99hU -a4Y,i_۝,u fOD@Yq%\tc CT7K̸nhu@dJSIvc1Tm1Ïi7=rX]3smA߱wĈ&U(#ZEF^(_-V]O?ď=X'̔a\2xx=O>zPNuc bQ8{QT!X!c\{b!ZgpZl\&hO!0 օ8/!CFw'2wȐb<@U OSɭm̕tPt=T\%r`eֲnzq6դ}Ks :)9W\Ԑ|Y;Uxŵ\ PvGQcJyT@5miϟsbAlZ4ҮUˢ‡q0\-RSUJmDHܡA(h]ꢗLԵYrE?~|7}-n㥥 FN]5(WmT@x1@fxk:~~tCOƏ=7AlMͫ ء9W쫦s\B4^?K}ڰ|} (6I Uj%s51Ԩ}?O4x7%znSA ȈF΍-l^܃f뒞q iY'2 ^T})E$9ޖoYzD&f5f=_[ABp/}!>m_ߕ7RECIާM0$ SݾGoAwSoSE /B'Ff<8bG#>s(hI.7vGIԍ0mI$^srha Zc]$[H5>k]Q+E* 4zqp~pP.tp-aYg:bY:\fum1D:#8G0//')س -\3nmh jsm 0K:QRBCXgk*.[L,y_򩼛@޷ - K\MrQO 剜XfʴYƮ2| I'gi,B{/ ~$7b 'A |+\flD !ٹسk)Kfg'|鿠{&ˋ~hn:p֩[mӼqۡF;$/6Ӗ13'R$|yC jM!UZ( pN $\vP9c8^m#R};DwB\= d v'Eܵ$N[ ~^tXVMsͳbgc{(<~s p&M6>RX\҇l l 9zNOM-v| +jF`eBNC}U eZO݌pDdBvjRӯQSE =5?= =>qA?Qq]"aBP:2#?|tL:V VջΡ@O\0z;/2=gy1ݹ0%2m1|YԠC'#~*E ^==x 3hOIM3̔ݝ IM[2 dݞQ nJѨ4!ACEֵ,}YGR*_.moKO9AB/vJ8JAD 3mᮽl+uSu"Y^G:4AM:Edq:_OMŧ:ܣT'c簴s[e6%ЍH`JQ;^ڒKfI2?ICGCs3ɴRM3:LJ0az7\^^2V3ݢ5 8ޖlQ?hzk#?dNfWxC蹁s)I6 #{(׀W#I_FEdngbs\)hM'2kώ-TV?~hxdf[j?6HQmr$CD(q)2Hkg\es[uN/H^]+יeAjD;;#f+2{-5{0ek+crPͿ[$~2's씴 qʀP)n4i#NS*g8|"$ f>g_h?_mz۴#\k#ڷ?d5ĪE;\LFDR ٺQ+][!Y>46`^`Bv1HIK;m c%jG7ZWsv?# + š'j Hj)AL# IL%(ut*qso#Y'f`c[D~'>į^Ԓ$C8!L $k[uSjN)fdfFn_St)/3O:N*VYh~zt<͘`t-7a|rҲw9 ݂RT{F8 5сKZ]J"T*φ2pN):|F9'U:r&^_GOO_T=$XSg VXb{T=Ia>Wn zx_~ ]J!Ƨ[oe"^Hn >ZzHH![ KhHn4B>5Kiˮ(HWBҹ;}zׅLO@|IE=*jխ6ѹ^UZ.3Nʯ?j70`jS/%h?R-N JGVk PT+z#!)D_HxB:n~pǜ Ψo`=y[ճe&3yDS <:eh6NX`i1Bʙ+>%OnMj`.6h}l&!upVb'x u(LSЁ'XІQB[:pzy6Y_CV:\j鮎b\b3iO[ܖHV٬{w-62 [h`.;q>QlM2<,@<<,AƓYINdO  ԫe4`|860s$5)Iy~!qEx\)'-E}ɨ?rh2jC+Cqgp.]4 B qh_j֍@7 yKLqHt5 )^F.xiK9^"ܕF/rAďyoH83g9puΈܜ(TȊIREC[uuׁ^?뇣[Wk#T+Rj/\b`GL#tl,yu o=uކL:JMUdj[U+ ʄC裈U^.#Y?P-<x(c~6?0+x݉% |t3N5*iFَT4 K.)tԎ |wZy:]č^s|~LE:6,-zM%J:YTK3z,7sDbbcޕ֎3XuĠy294o\Bi*hEn=' #,β1VlfӊD*ժKVK@jt˭AdmBywX7$-3k{v?ܿnA "J9ClE>!Arj.Ґ0F͚JD=U?y!!'Z =h TU.ӱ(+ @PTqk|d o)mO%^vIAFc!df7rd1&1U qKe I uZ? /Hպ.ya5RDb v+Ɯ H$;O˲-\$X+(_)KBd*_"39m) `tmײT.{ ą4 eCk z^m5{;g{ @8 smrBZ#a$*X-G> = xۦ{[=!5W_o-r 0#bKжSm_;zrTg"AplӭF{*v{^MZ}"ub53ܻ`_ 2XA5h pb'R1Nr;x5ɸu -+$ 5άD.N Z+("bw ` =!`t*. _AS6⬒JMJpSi=O6~NȾ~6=Jp}&TjL5Q.`$P'INn"|ALEf+e9Ia/Gح뚾%. rFm_\V+__RϽNn}Q*!ÄcAfsz׾˗x&R;Q`PPB=u]ŷ{/5],u_R2g O"q v$$!}mcRN< 1dBSR+Q&6R^\,Wڑeu*|[;MWy:Xs=.;#z$]bhR)u[nAms7DY^|||  *PqԂUPRCrRh).y D_g"^(*|v|xA϶.) 6vd*K yuf+AsܖgжBM\yi2'lz֨DBʎ&G 4c0S'E(ijeA_HNaNȡn,yخ/!nfX 4d9 oDҞ. 5Pf:(@ g[sI,eS vZw߯P; H  $@ N{ʸ 61ܘoQaڡ٫#8t{Z$8 cMI~PMN@T.w>~GHfL,YA)S.QZ09[Z=/{jYP*߶Ԟ. 5Ϝ]o"j0i|M5ylE059i[+%i,U7ʶ P{ʸ 6Qa%Hbi(4o#\K<# t]{k@h&eY' NkNgoj,pt-{ N׿{$NoBg~vϖ7,׾U?c/woiאb4E+ ) [;yb)uRw `ЁZl(. S`޼ǤPk[ՉcVꔛuyv"M!,@=agc6Ck<e<ڲԤΧFԃM" N$AS d %[7ގTwsp AsaP4,(t;[ZL`Y/?U? ,}L =Q6\pw0/כo#gO-dCOm_ 8md)PE*<;9 O-Xg[ @Љ9,si Z9Lp%g]PF:Ѝ; `wޯ0[o_gCئZXxM;m+c* [1s;;!? PȺ#sw9]fG[jHO#SS'Ǒ1qG#O9ҧY!/5M M(_,{'L}_:Rʵu+УZ]8\HÍh=t@ԼT5 ZXH\-ʷ_fX_D$-V{= uha-fMxrpޱ Jzvc_0'Jh lS-V-Ch֣vrL$- @f_Lb5t>as-m'c$BRsl;w-!_Ժ('c,xx{/Wa^}/ 8wa]w Ԭ|1jOOVpvԩW 5["@F1j;EnRskK=(٧X20[yfPm=4*"%:̃Fv=aq$7sWՖ6 i]6\%H#25+mD 7UV,LhT]m+_3i}MtrzM9jx6eaT6.oZ9vVo1JoXP̡r*V.v@NF  m6"7~1Ξb;N ATS()T4L{Qjt iDNQih S[W tnp{ݎ.CSIPF7 @[$ՃV1זĆ.oF=Z}=Py80<+&[EKۭ#&J 7L2[A @8(VlR+g@<#;Xyj@)/cɍiX6g=e{c>$Qe0YJڙ LVW#`ck8d)ywQI֕'d;1d{YWY)?ß,wW]ƴjˏ{&g<y Hj:zs}!!u᧚OSXuޗ9V_#ҺUSj>jsX\)gJqiO|1bٿ VTRZmѶ*$H Ҫ*t)o:/-6ʼ +8t_p4yʩꎥ(z0a:xzG|)Fh;7HmM+dJw5H 'owB zh)\/VIfnvG1~(饶Dd Qj"3 Zc\@{qw)H[FJCA+H}fԄ@gL!ùA:&KOc |ֻ`EZ}XV RcFJQd>T* b5:kPl}0E*.Lkž>_>z[ pv{?J?z8]vp%xk'I;hpg-GTp>lT5b.[clu{Vkk?b}G?6un!-͐j(\Z`U ȩu#Q9V}gPJ]V#++uYVs#k8Mt+^"9L'T~wb>.|c'0 Ѐ̌DJ2U-X<'!bkC:2Gba ^iPn[&F i>0 J$*#Ϟ1٢NnߡE$ށ񸕳^@rlѕ}HZXbH2$:ɺ(G,W?Ɋ"/ "㾽M?g^mn}9s410:ɏT2hQq`֗Y`f+/A?|PPR9T̾:Sˀ<.q_D#m'6Uj O116tu% S@9g闵 @Pyne4ށ.`r+g9Iz*ܔ6a0[ dI 4D뱞E*Eۋ+moeQh{,H?}:0Kb~>AA,/[vå`Fs{GǍ9W xejI 6,PVm 1 Ӷ!tHLa/ĴQ/n*pJ}u4;6Hu(|)j} ށ쮀V[C)$U-6B2 4{MN2Ih.Xӣ /s;oM{~{60`D)כpQ˵òt80Yi{{(Jyo0R%6(4w^_^,O[AjG b 8+0ZwJi J30,3+ٝc;N./tz9i6D4Ҳvo+v )V֞Votz!w>f^Er/.}oF/r/Ü^{preۖ XF $.xqo06b^m jBK?cέ~5<369LJ؟Z+ҤeW.H[//Jc=u 1rZ5s{i͹ogo]$u֘ktvexe{,w2֒sK~LQ29^a_je7#~y~Amf\ GTpK#lunY!Fpj.-/&D~s?qL5Cנy4vADZdxW6,PY- /hsuVʱIY|É;.>8 N<x1쒷se4I&/nF9BWCjoܙD: fs[}r(fĴoDV!Luq7()X=]б\v;yط6wf͂oo@SèZ\}6'Kckʨ*)Z>([*flTRWkcklm/<04&h{IRH}+CK$cUCHH>LP?j~5<7z*qr6V[l+p%e2F&.Sl'K)ՔωǫB5ϭߵui\N !+ըFҒAFa=_+un@Yͦp"dV&1eJmz2\(,\f9wܪxZG[-b~b'߼^zxz6ˋs>eez,Xl":,5 ä\2qAP"ET#:(2O0jyx^sו<3;ȓuT>M}x3;;LtN#+2|ӧFu 쵤d\nJm }-񯮼yfk qZwgZ} Mb&WF`]к+~'rȶ_5_l*imf[` qI ZMaC$_)vA6Nn k喼X#PΏ_&DJG;F8l6..%Hq7jrxsGmVT!* .yۈoW!H3\MpscNEta%e?jT" `Fl$cPXA8O(1W[)!q"B#jVKbkyjz\_w+p/ar0):Rk/' 8,q"%dc 5E/qSNT {K{%_6B a;->^Ȥ/GN!ivw]:JO*;ާmpv2Kl32"47t?:E깨E.6 H,vw{J_NHy^p\cae'ئu-Fuk)aFheǪk$+#5P%Bl+8ċh 82TM$v>X=b7Ǝ;6% R/9HYK;blk""u$ g):g"=IU~`+f7?\p~;\i3$K!92/ZϚZ[2{TFF /4wvejp}fN1xco 1e G C+lv▐icPӄzD{S c}))g|g 0\eHPVꭇ\H5O.~1ڇ 6j{ C;Ki=:~?C֨61}0Vn>xu!m)Z K^cu>waBjHNERNCw8v:K㿫>FU-~   Z9dR ӑRAMd:b>Z_^ d9kWQ+M&OyJۻM_?C}`W(eꝍ DK¶{BNɢ-{@őCʦѽ!X>jP$Dwz̭?unHx:Y<0kG8y0ϼ>fw)۟Hfb'më0YsH\% fKF #NV/Q>ѓp2lG &kM { _Yd襖*ZiɌy/X)[΃YrnZGZCuyҾ3?ܷf~2=/{Ø V%WNV=LI"ھn7!y+ebͺ:PZcWgUs5}n%ڈ38Fc'iV˃ݲcot( +<@MxrFfzThRc@W}c]=yzJ9ʄ#d=P6?1w%smV>#Vג?-BAnޞOWŽ>uu HG:qJiK*:Tv:H~$JwC;_ű7Yۣig,PQjxs䙳0}G^a-skh^$#"׸&n8.?Hu)V` qȮy>Q*CUE+`IZM紾D ZzTgh3m$/ ժ6ÅJ8! kfƊphjvClчPo 4*h2H4PfnDކYXDȼm&An6*\XJeu^9 TџН]K>xDisUHM5,{3 ~L'`$U[~HWy4f5 Ռ-MU ;{pJ8ԧr-~>Cj.J D K{߀}Ǩe;1 9#.iͤ)v#bY֦W#dUԞ+pb! 22IP{`+Pӂl~B7F[-iy%er/W +RG&0P'O6YxcMGuvMtst)' V Ȱ:X /{"W,d %f& >%@`hjai΃ͨR\haQ$W_e~|D*1CLODp=hڑ,W l⬰CR7'Ƀ )p֍G >gW,p_>c'J:h0Pj[N$:[#ݞ/*Y*O!p%C8[Jڐ1mf;:9jnkt*,ǃ]FxF3gP݄!N ! d{vH(i ܖ,Y-ip$ܱ ݱCR{~> aQVBSLԡ{W ?XSAN6!:sOz%T'DtvX`TeMky o Q>I#X &\BM"6VmV >WnP{ ΨtyM= ne+]zV 7Ln%l|8';>buH57ܽ)B/'ۘ A΍K)Yfp٧SK;pPDOYykRhNbJ$@,B˼ :40Zؔgp$Acɷ %Y9*T gyr-u3aeeI 'Ppuڰ/ "b&h <>xW|)%.^ <{%|PdCVe HGji#Sb<~ίRpRBǔcL*Ye[FӫڒD43pi'[LuoZ} =42{z4Z2'P&nf .T` MS9C6I|*o Qk gUCl@k˅^ d<1MְJG0]Nxn!f4'b R|q_(6e[ L %X:<@( ¯v)ԯ/w|hJiR>Cr8U?K^LcW໤4(Cl4N:|8 XM!<#NAiaZƋ͉}8{W#‚ѹS6 TI}Ȉ'X%m 7z'H 1zhFEɗzC:ah 7ookGPB%qWS?ϦTGkњuq(۰E]ܒz`|8xPrpA-1ILA[+f{Kehxuu=9UK[%t[[yM ~ьPLY*Z倷e$Ss5)H[kZ ר1Vc\AӾP5c S`b%f@o _ y?-gb((P-HnW8_dի"s%5_B9,{~I=NLoa*;u<^3CWv̢0Ճ? ]J yKBfR-zE6 J7GchkXk6A;TtZEpVlzG̔G>R+~9iG%!OIu\ZsvүLi +ZFkFZ*a94BAP~`OEM5"^:j})w Kb5T/P->F6#] h'&;0?/ǽ oTpZbX`қ;) +X 0l^x ]ko_ QЎ. ߳.ҮRjO'zh'd;YC =8G䩐?%դT$w5 jS!ۀ~.iU`>#"|6­!ԁn|~9~$DD@-=WgyVm St\Jw %@C`1*kTed.K]@rN׀]I.#RN~63LODDjOt(8t)Ji$*b4DhkVCUy'њ;yӮ]W:_,7įM2՗W:Lٗ70 4.M-2{`x-9ѿK11u'juqlϦ!u8 5C\0WMA$C\76y'8'.Se (n}H-!U}< ݆Q@ie]ʻ @|N4xKC+kQAG ߰| 4DG>L+&=]|>(}jWz$Zx:g}eʁmm.SW|K$p?Wz&Nop]j, I:\5t3?]b-yBAl,_Gy_z:NwJyHYg)VtufAy:Lr}sypשk#vB|Km8YU?Y/G󦥥-LŗN?g2#^vn 5>I܄Wy bէMO"\ MfdYaZ+hÓ x֫W}A_XBƳ/EױH~$d7?d7Yl 6ղsΕ4"DGOO% C\d+0u}{r ~tѵISV4HZl>Hʌ֫,E<5ydDߔ=n?^/ǣDk,\q'szQb.~EP 0`C gZk|y&xo#b{^AKjk6'HpkM= SZ{"û"fy Q$C?2׶O=8*{RV%TҤaLwg󯼃~JX”O} +rP6T$^?AP0c>6Ɉ-X.K8_e-aVBW3zjh4wy'Z/o`@\b zFLU 7ιDbvO BPah8DwjZb0FVdS-ʗ27P{xBk?`Bċ,mxB^~0z5 b?9l^XhH[WڣD\}wOwpry_<],@fʊ+x@ba}>{ɛPh?'uD>+"8PZtO 6 lLy$?Wscs)ĺ纘"H]b` cx(!J}d NZ{̾!^:f4% $U.z_j zkK dxcĻQr!>56r)F^>`'mPs~<ǂկd% >Lz3NG?bhoaKv|9G(lv͔(p'^58C`k5>qe޹Z礿QVa_@ݱTú2*ֳp2'ۄJ4hմjY0iw%}|wGS5 \4BY琺L<.yAb Wl523M9?A뻳VW)pfIwv?L1tPjfX+e70>7|ءMWg!xb}]zY~ǁwAޣiRŽBg [;>'kd SvXb A!ʷO;}RHuhWǰZGj@󵤿-V 2@rR~DOO)N? {FnڈOw9TSl@iLWMMdޓ|y!'E?~߬y?r&P!dmy/pZKh5*V`<7#E_%0@R)R!ЬS`Za}ЕyDP;uRй4|i6~ݏPzO9#p$YjvzP>bęڏXajwg!77'6PkbexOx&䔷% [jꭼkLꌱ'V@aܞh/Ҙa6x.8HK x"`L9J>3]~ė0kGMU ֘ӳ$d.(mi-M;,ZhMg0 EzA@Bл wC>M!v k ͥ蒄e(mw6`7\\J+V߂U俅yBi"0-&nK84+*X =M}z }?՘pN$TO=ePp{1r@&g@5^wd|>F |-oQz }j6Z’[p&?Ve>@z(u5 OZ?u^faX9+5BRoy&P<]Ndqhz8ϦsTݍ"jGr/}<|#՜Ҳ=( x+xۀqp#j])tj V ;"W 9$ f'ԿD91RߨJNSoA"C*dQ+J&l]:\ՙQyw@eEo*ۿЛW兣31| b(`X8L$ dq:ҞK ըOVHϗr7pG%PX'г2A ;*e»D,57[.H Xg n ͬ9Ÿo/s89 QB4>@o^s3? WY-BC{fg5^u/?ÎDlcUX ϗr7pG;)6_.f)mD?^= XggRq6e% 34"bO*jg#L!pS9O~+@9xbz l)s }zgDH!Xo/fphTK[nq=`ڻV]a{b!ڨUsl Fr`n=}>xa&WLBdW9c8\ 9oJb7he͛qtF}}bR/؋ |x$(򎡠Q,Tmކ:WdCXVux}?Q!k,ď=[ B٥p`4dVLf;V\Bkt>NJ@L؄rn^@i.هQ<ÐJy{j+D{lZ4f)0:{,"X˯"ǣ潧-S, 2W*O{J+Vч15=Qe想ؑk % dJp ą(}j%~E{,vs8AJ+(JѬ\aI2SosI__xS>{F9,&hZ[,CypRIxyLy}د>SMp?1er0~Zn8cԚX O\,/.3\Z-7.8g kl3NRwE;DI>Mv1-eB"ӕ]Tbp7$ ]Lu'9^h@H>x!u.eQʆΔI}>нsNgT~Ui;,5K{^)ܻkw ̽SEVUtx^~:;/}n$-ȣهזQUo [uAؚ?𾎞?g_VHT|֪AUs-Q׏Ff 22ZkHG$ px 'с=D?3nMe2B؀8mtИJiU; T2ޱ ЛW '~:FWͣ%^nG9ڌ s%!*v󈻌s+>(!݈|TS`$0XHRJrp Mb .`u:9](7Oػz kɯMe*᪂(&KKv5%g`KkXz`uj>Iq@͑[LՑT#<~3NCs +4ߴW]88ȓm (NJQAX^aod/-/qd;N)% !V ð|@lf>\gS,`!/[PY׈nO[񷂹**QUgJ6LZ\Bktj.ZQAP–#tڣpfw[Q tdUT ToHm $ceXnHh2yOG%A:1􍽇{J*B#$jwifM.:`8m  /EHD?p/sx>?M'hR碓->n#w7b88^-%HJ,<˼ $h9=0{ 4w%h|U@ I:2Gt_קd[c!\eMЄ@nTu$wœ#?U:[QeT`֝㿐(ܗ_*PNKBi p~Sɿ񥏦?qe" ߩ 5NI{1ŵ.] ӒOi\B A;azO#^^-S ` 2m߅4klKlR6s[5"3=0-XPtN;Cj"JQg7T@ۓ^AjO^ّ8DNufs W#쭔i@ܡsn+)}Ч$Y D6pQ?`'[ޒEqЖ"^4]=롵\//^^1Jh}!͂0{Z2JӇubvYH_4fXK8I̶Rq[gNR 暭c?fo} vޅ*Vl.˱ °)Z˕&"Y+{R!lcT2F/tg%]\Z{(V/fciG>ofW0yԴ>sd]m=}f+8t; $4w4HqR0آF(ŵ0FN`Ewqu1%]BPz\ڍj֤3se*U-E~9t 1@Q䰆;?_Ҁ=Tomh}o3 WXUh/0ؠ50]a"˒"aq{JR9\J =8+#ųVl2*Wv#1/G}>o}?_Ɩc-7, %Wpi@W;Ts3)2G$YwSb^Z{([҂e_WBWIPVVr7QoT{[XQ(zgQ=N?a2N7ackWMˣY<1H0gcD[:]Ä/5:]bAR/3{9CyR{r=K 1̭U`rڍϥ{ޒV|FC$DB[[ZYŵ2P4k3 ,oA; /{J0{@\%Zۻ|0-0$ѦJj!@x^vg`Op 7봕zI4Y <܃LZFи:Ҥ=@V '6!~=4/} kƊݜ<^#B-WCF > PM wp}OgXE>1w,lZA4(3֑TGoܹ@c!Ă8UYb 4bΑeuՅܦΙ~By7@ 2Yd(]돐wH}.[ȂPzf[Y|<&`[ ^SZ'+8}Uw^|j[ӕք>΢碗2\gi䪾n ,_g!4?Fdn/WgLuֿM?=9ɮmD 9aͲ]AĮK۷q->ͧJ&|hs҈"wh\ /eBLE9 hZSiMeUGIWMHeFQִBc2Zc<:ro~[[(dL>dչ>9<-FAǥT!0Hs7{+i?)^,~Zax',= " L3CڱոV}g~L3NW^^6MiUPOTHA]{lŽ#!/qig~jޅv |P`92(1sA=s; 17sy ؾC~6}}c.:T.m{A=hqnP|IT mՕvRpҩz3e%rDw%Ie {VV^ܖA /12ʄ u@T:p7h(J6>5VʵgJm?`b XZ}xnt$v_A.:5e#kW{eB<(tp;ۼ9A1cy T=r _(' ɕ1RBY9=Aߩ"@On33 60 bGl^X{ϾzYY3gه IcAk@|^xf]H\MrmACb]ނY Osv<ƽβRZ6ا@!co}G@+ssBLvxSƐwyN5s_*k͊ժhu[`%@ظ[B>cͥmUP|nߢdvT!C |pXװcxCN,BIz{ԋ['o*{Te(<8NXmJu15i|"tj~^Uي}B<` 9nُck"AꔜRPw7e7.R0CEH"&įޛĒkd?=9g_LsڢX敊j~OF,` yP ҫ50oelhѭ }VB ~B dUsJݧ,0gJ}BC~q7Dž#ǧJ= 0#Mk8HF1]_Z.(a\&Bx-HM[ޒ΁WR~^CΥHiJ[rY" 9Ѹ"qQ)X-nٗXgNłsx,WPLzr>ɛZ+ɜg, ?.tއ3g-q"~_c,,Yb<_>Q[qW]!"Sj_?"=yݻeI;]!6C˜ZZ(Ʃ lf, Lܬyai, b?>VL)T Ҝh a*Gc\[Ph)BwC\Y!\Y9&Ł6KNz#I1U^.w[;"Zd*хԏ%n{0yٴEQZ:PI6j_~ۯP%i e:jkuh! (*DؒiK>\OgwX\p( "J2*ӦagNGŽ< `S:mb "sb $Pfg8zG>k(I  D-|AR 3id)d=LHA&68V'`_k{O[ÇEbJ̯"C;:]#v5~[K=H:I#{W)R'PF!&*n6?~){/'xLt^@:y{n}ATQ^waJ?W׌*ʕH 9CWV/TO24&0Clzji`w)эѤ1rI+э+;0)5:_~gk[dÚbͩH) .wC([(S$s͆>؃r@ מ*;Ee ʸ[zºT.ٶ!^pӹ;h?>cyfҨMC*HlD4wXm:8rm4"e~=È\MC:[YR&5徻|3CNK:e+6*Uc]5? ~yoZwm~TʻۚtgfaDbJg ~ex˶>2 #*Z̡Ss~-\I1}'Y̳.k,ul:݋(I@K6m9-DpV@~!%\Nd{[JQi,늂uJS_[5x8k)l9 0C(B`b[ %zh3bdؼ͹+mA UGev,v6v8]w{gY~/!\6zziy5'f¡k{-+Qٶ P,;)Ԋ^[ 뗿2+mi2g-tŵb`jMTuumLnL" yviaD My⋖E=}j,ŐZQd{A4j5 <9jʻhCW B~_=/xږɅ^;(G&NsUe;tv7g>ki/^jG{t^ш7b3:q)`MI vJ!7p?/9o }͏iyÜrBu2;j(zfAf8t*'с=D6ǽEM+n)5Ά\'Iу.GX~J FaQc58Vw`Ǣ >We ;bZRܦ}.8m?S 2J16W ْV[yϧ=J?Uzu{sZ:jxN+tJFF=M"o(P&s|<Xec_i spzHRtQE^D>Iq~/^}Ϋےc} x{sM1k()W[{c#Ӊos>Xdm^|i:`:y߁ܘ#MO `RYycPGE)&0`u:JYcHf= 32TiVԆL?or%kU};#|g3ntddJ«Pmzj s"!x/|ͨR ѐ)函|x-Z~qs0I6ylea]$noKm`V^c$6$FpݟMzB OJx/1p,9psudž:{BR ~y9pF:`@3F bBuR$}LY9b}W<#v{HQvK*KTpOrt:b0}bz.H]àRhx?QMFdǖ~gn*|_G8NNzpp yřbj'Qh8#N}#G*+wH ]4 w! F~5@5J+Z؜F'z&X4Bbw.{۳#Q&vj(OHqF"wt\"`O&K:ی4w׮TGنW086m^Pk)@B0>ind7 ׬!JoA`Qa:D%l G{qtą"t_s; ^?| RC e4so=h򁡗)@(}[œu5[~nncor22>NTYwR,=rAk<6qa+[r9k/6װ`8-qt,hˊ0|P1Z~ E׏25 t-F>Dmku>].cԓjWց6Zn{ٝcCE̠5Xȹ:(SFaO9 Ϧ LmY ,bG`ԙ!p=,-!+\*:;:S ;߼b^Frޢ+`lseY;~}÷ ߟpYHƒXZrrnd"K9-ה [*nq?ɯ;G8[h뗾5lqBgHzA;m=PpR-QiQf4_ݘbJ&W|5ء%8gEfM 5)vǔZdQX5g%YtV{[4A)9$"S 5W O=wo`V&]P&2P+EsIb8%ص)|O(jbqdazKh"n:#$sv,m1U7`z*:GE,a.^" Ҳ58ſkgb%KJH(RGi-7y7_3xwC,?NA9_H6@t5NΘP0 *[NH ͧ&-@?`AaUK_c'JvgZ%qس/ hV>*^I IQŬ@>v 5x@ K37,azJ/Is8`sټxHݞȚ8SHuY֗}Ͼ>G<hmSeO#4S h\yuv`x[ٽ}lXU}[ٛ#S2ovDma#\wg@b*Bvy\*JvĽ )x۹̃Ы=^vNhMFÖs`T;'l@~^R_-N r]l3җk!@md 3u:&a6RjĮVٽ31(d9rUGizQRiaxymqlxNd䞝rMv `1Ȯ4Nf[w Q{.i/6lծ7v:,m9G(tJ'c&?09GQr>d0>mmP5X3I7GYbcظw߼T OXx|~K̈́z(.+x;W!J|cӶd+g@h\V7eQnmރ ks2u#mBټ-igu9ȴ Nw;BS8sߍ~ v.7c|E10=ϰ/0e5w޲$9[x lrYK)t$D\5^Ot,ֺWo&{e>ݾ-OQeYKtMEqz$ LiNs)^l~?7+OV^s/X0ҭaR۾2H63us#:'koa{ְ㞽p,iBs<'~]죥4~۱HCXbԐZw,%p賓O+j-"gn[7gTz0]kS6QApIm~)t*GƺR{MIcdj){lG\?n7]|՟)Ul1Dm~ Q00Q9w,/_LR1nSIq ;i?TA=tݫu#S#$!-rW𛼣=rdggN*ijBxlsGm%JBCՕ~ȐWnqo?_8qu3/} |&/QYt:&cZcr;751ocGQR"]<5X;yW\jۚr[2{4N1$f{1UGY3FHuЩrG;T$Z3[C If7uHs;/AR[]>$51vKD>fd$=kMn<كa?/\/^ rq:&gC't@4@&UZy;;?,4\,Õ!#YgXֳCK _seW#\|o#k#1UΩw2셫mCs}`$5n6n!wьv*<{VYEh}}m^)_|}~W_s(Hg ݨ2SK K~GpߛDht8q0Y1 $ӣa惢& T_4]sKLB 2/jRq"}0 ! nmxOhm0?;R-lIf%N)Bq挣M,kEm~VNkWk䫓N#쐺fDj!Lx9I>l[4c4ydbk_h; fuH5$pt>K{p!p5y(W&*9 Y@{}LkI0-0#sey~n6]dTiY iP)E3/mFu8;ܤH[4^K\g~sA!t?cGfs`O;382R12qI3a8B;Jv㶳kU &WAM"ùSQ_&/ykZ<nh&L-K0F-\JMqZS֚T =øJ#)TV4', @ca 'J"Ԛ(*/3n^Ǹ3;5%`Y7MRMq$F n_e?`Fx}1<QGSZs 5PNs!&έ O{N< _&WIkazPk Z+* a4nFii41HP-Z ea'D;BXg, +J2X+Խ ךӪ>%o87@l,ƸرV.GѪTyԲs.8ٻbG(Ҝ^J:mŹ-חWyFA LY'`c&Uz!^ؐYsv䔆5mM(s^^eK'GXm#:VdW28Xwua'FY9Û (նbmgՂ? `c7#\I lI6@3s VƊu;sa7`)&ˬ,8!8.Y|=3Jޟ9"´$vj#K-석>h5pN_0x%hմ Sf 8uoMң-?VVi3%З-.Ĥ&i̕L5y@m%j|&AL5:YQ7ʎ7 J%D(*ZC&ŲvY@m%v29aB,m9~Qm A_?ɏ-±oAuʬ i5UYJyp mm}D!HP>pMEZ 07 "2V!7O]V`D~FOړ7M;OMB^(1QGX ( ;{0sb"Ȳ"΁+!c9]$GZi#4^TGDUF6Qe i.oQ,\9镚+5x¯U|±~:?֪ݫܿę k|Md+-ZvY''f |0p1Њ o>lߖc^/WM=^"?ƗG!z# yGɸ^VO␝.Ǜۑ_?X=0ZC)}J%0t23#a6z%Ǩr70GŸEps~H~3|Z.M@,A % $_e(I[zؒP3=\ zႯKG o|1)d|y.ZFyJ9XBA!F%T F怶ut!{:pDžo&TSz X2< (Zޛ\oYQ+ "VmSGsyO6G~<|R[C^l!r *yz,H.a2p&n=<6"[x( 9>7qh#{Sq':Oȿ9lMiioD"};[ 1}ds4}lGb%N;e!X553}[V2">h5X/P1b\9BWذEzLߋ}Or&jDC4ŗڎDδhdm^*!H.#3suk5.{ tMƅ)V!RڹZBSm޼?ڇ7ͭѤ7%@-fW/pBl-jP:IW$ȁ̴ ݶJM١ȫQ$A7&<؎q"d}RG-|@ ]ƝzrmrvBfkxVñ ȀzTcޫ3|^؎؇mDGdsRUz9){%$[E(_Ot@飆&p)Z >2W]V[m;lk3r VbNWk>WZ{ëfE9*aQKVw!;˅di:K\%9+X`;e) >zSQL8gZk*U)xo|{?l͇?uww Sb4k} KQ>,'x{"'ƜL>R>M9nȳ ϥ4'IsEHOͦCb|`9 aoC&!E0ƱERBm֭]K7c/ - 櫄O8`额 !3xt;ܬG6 VzխF|2/6n@Z bZC&bmn1`=5Enh&AG|I^DjoNrd* 2~pԀ\A e.R9-^DQ@TC~Fu\sTqyS=b(xZ$ǵIit)6 x%w-J^l/pjbku۷"I+%>Z)ۙ:R :wh'#Z^Zh6|Q~vlp>DijE?!|yL[29mТ2f9t0tȶ^jgE˻M(Պα$z0*aHϱy2#TZHm.; 6PW:8/HQ3^ZnMƃa )Xv-Aci$G $UpF}uIc(M>ߊ8_Aki"Uc37I~ PXMޘGqr@p+h l>.d-0sEV 4=s+*(чmcr*\ B+*gH2RZ3uՁ X碄T N?pM4B$e .}r50>"zaU㐃ŊT'oH'7RNJ ~dA&+3e]sB'4IW0H\FlbPSCk7$۞ѣx mJhB@-5]Tӆ2 7Xydl>gp*eSZXcao~l̙> )T׳h뛝 4Qc6GSp12Dx;*^&4Oae \ DX(B4$MӶ(U>::'Zx\_؇H%s%qH= :htڔ> wvE`ݸZbdWpʜu[q4U֋OI Ş@t)#Yź(I[-UdYMe?s0lzww񚂷Wl:, B$Jŧ K,b,.Z6k@D!zV0slÝ`+dGHuk&#iը{hGcb܃6Lp[Ԍ 4oڍ@z٦O h4Rsh)ؠp$pۼ7Hxe̟$qX%D*{JhUr--wT: KTn7RFz'?te |_*yժ7ȗ ,PؑkS51scT- S#X$ 8dK9{6RevqSf9N\wmb㑔dx[յqC17(apO->*H5fёm5<+ej&馎h=g,v!dz6i>paU$^M_wUBŇ^2=O?|_Mw/i*0bx`sklo»SH,}fejZC)F _sCuOm~fWP+-RێX|Om!җz"E?^C=_.qkvۮGBE.hZUג&ނkTlo ƃ+w_clTiX8&c˵#V8>Y[9:#+{^g2Yd<",+IV,Fd-p7INfDz RcWw%@앮K5PgΣgƚDJ|!;^X24LCa2n |]V<MT{YwҦbzВ Z;5~DP;mK0NJk9a%9Ak)D|>>@ph3$lv~Eʋb/"2 pD@l8I5P=vpEͶndf?_WchNWn 0%ZO0KTG $׭]lhGG68 <& 5@Tml / yo?njkiϲLml3fApXiNgp͊/Y/e"6h׊~Vjts%[6?@Ln-kL-1IZۆppU ]$2IKBNcN.h8)n-C-$vXAClb ٬4ۼ|y6[|ی4iKiJSlBO[e.&X9gC:/ 1g047AE!7"֥}Z' kQ?kϺÄ7 _}r~^>xE} mbq+%Q/Zl[Vk`_d MϖY,2gk)[@D`8AH($onŐxXOȴ JpYmLmPu`p'8GNpX~F*v傳 65R^ZU՘ 9a Rɵ̩5pX8nFb;ß ɥoe?E 6h O^>nV.^|V&Ep0C`c#5d/ӳ9^Oj^o_?f?cwR1$ȄA&kkt MX(zɵtSVd$xk?O mbp`5  ީbLCcw ޺iK_C,Wyw!Ti 2'XOl!mq?toLJBB _#}Fe i=˗+}ykaHmvv%\@ ”A5G@J)mOoYu-xlT =(MI\qW:9m'o}@_-k؂6K)Z-jAnJ"9ut;$JfU9|mO{{O|?9VxP;wÊ# 4p#I f}"CT9[겿5(wܭ?mgk}2a΂0u T0I}V/&≿c &$P29OʩYTRuGĦ.[G=II{ 1Q 6ǡ]_V\Y?f/˽A"XG(J9>oEW'~v&9W\Ej (kUO?h\&H *c $ٌo}lny ;>m>?p}v: ^^LZqN.u ֨+כ0.%k `uq{B_ qsZӔqu\s%4~ G pеxh:O<$(_-lgte`hxN:KGS vRo;B}::on]s(zjgEJv; fcZ3\rє^u&T{\S[:V:Ԏr'U3yI蠗eZ7Nd.tW!\X5xY7G,SC9GA-"fnUfq#V}8.2`>VH߁6@g^SAY{eDk_`뀀h :\F\܌f%3Y_v[瀶5ƂwwZHG:UF uXWZxL+F؄zLn3iY,dN]}{sI\GLDׇ9NEWH;l{}t TRHD\E[uXs7y[[2ey5TF^9m/JuXf &=TBVXu7Fw7Z,:VQgz:t?Jn6}2젊kCRm0[D^<U4'X^czL:xmXgS$/ <Gؚ{WS##IL.:C,;OВC!*$avB1lI#YWPhT^;d7N~?ԝ+DT~}uD6tnTK'x(tF)~ 隀4$^ޚ577#  }SFڨZ&Ek4Չ=Q*MӎBv7=*ȧ@24\ٲ5yX:l-6,3EW 6yS[2UU.xgS>w|?X&rM䖉$ je~e.M{MD@w 62ǀb32T.vG?: 4leLOc\w丑,D2xg }A0H. xl3qRrn0>(+`L2h=n?&ۗVN Qf {L~Q_/z+~k}hDP| א7ƚڮzdqi!n ޥ&#mT5eeYcOھ+ߴ?mRwFV!k ܲZfuz'QG*d~ז"p L")~Zw<Ͽ5VJ9Hs'˗%lj "cK;YSt24rTYn2[smq2k Ӗ9bM`wt]5L'3VVSRM;!tI|kuy^dˮPǍ;IgQMK2J QFIM{5f #=O U>Mn˛e~X9XkФK6XX#zr̖xh0wՂoXߣUDq9~ jM[7Yan[c{1u|y䔊;wmj*o5f[,}1^eBc͡~W|rBh27 0)rl\hiVSV}uӔ"Avr[٣GYVo*|AMD670q"7nJ= mVr9R_^x?¾̪ 6 ȐGk*nyٵY˃$n_]I77PFe&3f4WO&}Gg2A|m֏KA:}'t?yT1ff5}P}zj; <ӕu7k|zU}uθSԃb>7$flMPo'.: bmsKE7+zL&+MMd<(ygj6KN#"LI%{p7M?>5{쀘6Je'͵Wɛ@?*ZG!wDÖ{xy+Kg4H'tod"\ 4?d{͑RտK?uWƕ>zuA?0,Qc(Qih.)_6fҋ֮Tr5Z@/6Ow\jnj?>@}U4@g5Kk3oHXiLޗTOv4/%1hd*=՗2WAp+UUڏM 3;gH㗭:vyoڭvH6oͥVl>Oqr]mo/ڿjϏ9gO\?|Ͽ><bA(7Aq"Khf辎,=<8&#&dǙTf?Ĩ[qpj8 pa6[`IV2#ʬr'}sOYK+j-8c`//ݿqvo}zctN [MajSYL;v'`ofF2*Eײ[eg~U~gB]/nh){,Z-#Fߓyޭ$H sS0랽4gךL^2)^_xOs6b`eXݚO\V*Kr/ 6 tY\Cuy-(j2#F Cg5X>M~gcja/a>c w_ȿk_?x)\ ~_*׏Bct$nc1mw1|ɢw9Q˫X]e|ȅCnGsJq1w2_{ޛlj5Ah\/¬~}##4wOo? IXg355(%5WԌd~ |97A'ɖèYw @a'S?A<;CS`>JVjsk}דoQo3_ sMCLx nDtVscn6 t@NDt'iܒ/Zg.vkc(޶/m C{;"4H6?ylfLTP6m,7xG?G7e(D?10[1/ćO Y$%ɤ؜bbffk`<ȦzplL:LMBDsYeiR8HJI9rej{\+5U/nmC.HәxPݾ}bOS]i ףM[1^Kql}6mzJWLhsj{l9ҭnwHqtNa40ksml-}/yl%E-reJ1򘭹eG dZ,pU~y=^Q#nkfS*EnO4uDRb M2.hn ;[a }ڸt~$dR%ǩJ Rs޶ NiNKN6}Oy|8ݮ#U4FߗWbZ3Sl6I~rNĚZ\\X#24{7ck3/ - ϋF_哭rTm\EzUg| n}7lMN: =>"  *8@$,OI< <㮐$ЬPJB V( %X!h)"%X`,RE&'dVXjm h#4az~P {"?8A( -E#?d=ęQ/NP yy fQ*8@$T \QozSԛ< h A  NP@ ܂< q nB~pz}'RttMp [fȳu+ς,ςtpnE \|(q';A (G"Oh;\ nA:8A=Vf",@DHq.@?Nii--њ(h6?4p:9ɩ mKɠytpr1רMP.M>LڃИվ4bfQfMJt%F{$gI E L5-#h6Sm¢i 9Fm?T/T U[L1gmC-Pq\C Hv3+r&zyNp) EPgsNjzR Om:N2Hj[vSAZOڍ_8:HPPm _k:XP24 &@1&8I- 6^7k^^ϴ)Rknù&M&n+:AڍACmCu&>nt\]+Pk kzzmq?tc:nl6A]o( ?qvSpܡ&5TLM@^ϴۆR[&8L1HWtJm'g3&D: z ˚Nw&h jtƓ#pCtkvgڍ6IM zFOm@ 6jPmCC=nCaՖMmjCEY"fx*8=ួ{z9<;y U?[uF)13h=zϬ3=zO=zϬ#G{M$P˜gPP"HIVN@JԮ㴟{] q{O\4cZHrr" ym}(mgn_|0Uj5Zd1IG+g{&Ig{jg{&~I"exKQ FM$!-/U\$}62s~{|߅fB c!!Ύh@hiSW* 6Ź9c'(9Ƹ_5N=L&|9v/D;eג'Oǹᗳɤ:X8x+:)oםQ4nt|Rq۠aubx ;[] X^AH-̖m Op<=BL}?*`TF=21_{ j)ल=)Rd`Jx]Elˁ"~}Ĉ螴li>r2㳴L2"ziƺBz;hU6oXX[B]|ˢA\aQRl 8T2:K%R)д <ζtЬ k.},}xi,Z8v6'osznY=d(s(+.L\6bl6wL;jqU?aZ,dA%>ѱ>Y6 BRFj)l;P5ùй nYdD)d")U0;+C GGP%jOXp".PcoeL-M |uHk"3ʫ06^f(*PRNW9܊ߚ}>OKPtYX8DC%ӄMmDĠ༝dalvWPu7)'a'zl$k@ݗp춣g9Kn1B9CM37[ц@Bv+{M1A$cր%l7N-؋챪D`8,m\N7Z?/b5`B|}IRcO,ǿu~YWDrܶ/|(c?ُɝ6xzЧڦ3AF))*kP+I~r& Ꭼv0۩שT'x ɏS9)a5k@Qlp9j2 SuIɽ; {yZO褜Ca0k[5F-٪|i>E4S[ZoG6{l>{Sw6r%iB֧CLPda+fYg@)\B1kݪo@ֶM%^6&H1~# B-BraA~ 番aW}^.BN7vq+^ؗRU[̻N?D*).-ݱ>yÜ %Y57 lw٭O OO)SV:N` K[sk>]3U "+D$ۅ !F'l*Zg>,3/uL39WGwI.cKX ABA /^AAl-!sov饈d;1!օVrS-(`$@|Tʹiσ~/0*x{g|'tIHD \R]p$:h#2'Wm]o`J ~@g ̫w? DSՅF7q-Tc/Vl eR(6y8(%x~G6Yd *6,a]#Ga%^3 P>89=?->' H9xiJ-=/mU_:asٷT 4XTz8dҕ,jǐ'=( 1DpaڑȠ־lŸr!>XkŊ5!%2sr#XvLK9UR˄ghnΑspB GѬ3rmoJ9LfV|0nJ\d&2:6u3pu.`& Ń K\Ҥ^4jnoUvN\]4#w"%+Immǟ"_f:rz  j[S30sJ^C2,K-SxtvPd ,Zx@D(Sj'5?hJl $k_FZ7_Qrϗ*cS?^>S},͕T lEK (aM Xϙ=Q?TVX^Nl]M94=5T9uqf :FxXLp}*֪L{^23ZB等BWß565Ysxz$ַMgeZbSVTJ`,w6`?Ld{T] _e%}(ևsFpmbDnxY9~%_OZYVoKqYv4Q8-1AI@V x% 9_Ks'a~}΋[$t_kGm.ɑ"N":wOn#J9^|29u /imi)2: 4D֡$IrPnE#|v)x$L-&VkO A6#b짿YEiQ;¾GE~:õtb*7f>un6ј28VZ#_iG[C.L֠DJ6bƞjVpLɯca">A/^إV N9~`,>6/ՒXYw93ZBʥ9ˠvO \,wF|'}gS6& 0Xf!TFvJUuz:SՆFu& ã*e>|Qhޅal٧M (H}L-nۅCwg%6CilS=LJ'`#A dPj L^v`)EZ4a#H'UIBƗw1ibU mC;,v XLwF%4MO'RѺTlxՖ{u0iV0b5@wXBLGf ]bbx+/9=a<*W8gFf| 2`Ӷ 5w^LZuLL@V;i%5ɳ}bIe_7޽c/L2kUxY LKF,{M<Yo|ꉃ{ ^}gPr_[<}tP*go4=u@Ec% 5s %=!-9o7Cn=֧{JV,}nG IgyMB|>G,KI\y`@VpKCt81jJ]&/V;,VTN}42(˴ZQ;8zߎS5רMl3B aɺbs%.m@!bK b% ֎m|H̗O?y֋WL6?I@3V;ꈗd{aKnl]͗ZŒa߹R۷}ɥivle-I[Ǯ$^| (l[7nĬ~X-UYV*lvW5 I•W\sƍ³@~"j\t { N'ZgKXU'q>ݞMLeڬzÒ,jQVŮ r'5ty,Ѯ4L߫D7Zժ^Ӝl12\'ɱfϵE`@4>阭p5jW/RydC%gs$j#مnţ .[ Jmw1]ɿܯ>c.ςoWuk7<FI\xdy B_R}h<z9h&4*CF3T-Xt?զoLv TAwf 9~\lm5]#: 1C#el fm"؁SeP*eXQCls=;ۀ:JVe[dL`<$jzc=vzAsQ8QB FO+^&t[}Qh w9\vL;'~f+=Jebe^9YbU`4Ǥb1[˭7Y'10tzRn/8|%s%qYV>t-Պ'I!zuA7뱌X zXcu^ M[1Қh ݚX>Pӿyߡ73*|TdScs_tƄd՜9+[Zb5{S m3!_`hv^=$Fl;*B[R7rnNSq9nTg;<#LH#hM]#Epjv,Õ]%/٤sJz*Ac  Xsۤ-e}?-pu*S䕦N' פ_ds7 5M(p7If+kd[K˶XOmus>MzٜV9~r.VI)wFMR<Wlޕ\cabuʧ`?|ƌ0L?m.6t:ġ*"8 +T5gN6YJ;h2=eJ{%@"g먣 A5/Mb̼O_>}PvoYWt>X6m%VO/=`3U[*t/YB Z.| k%!1;"K:$b&1̬!Y=XGy+ߐ櫊6o)uFqK -y}ضZ}I\ }vޛ- e$L >F7$uti`Y ɬ6i(4ȑiJY-ZqDlJ %gȤGj 2S|鷡_p//_[[9!g{w.=a q?[qm̭k3jHf`_ doYp|X:‡jRD\\{h}C>684lW.֎n-)l (f-X` x.Kr&C,IWoa 1k[j:-|"?]x*sB|g%U^psZvZ^``%?5Wӭ6%c{Qn{sY|owmZVtU!SD ȵ$+Jsmdf-y8hF-XEQhQ-F)V2a&bqOɟ?~_{CH-!^;{:~oZb>$ٯ@A[J+)z4خF;ҚQnQ[`}~J#zFtȹ҅ϵa>}Fe!LژV]K.j/ch~ gϤGi}W6o㛢 zs9n+غw; ?k)(Ú+ 6R1,dY;v2+tX;ƚ?`vQld,[Ew:jMxvdv.;{)+.֑؉{,df{#KGP6o(kIiDu4W&YXX3,#Kל;x#6CęH]p+B`L++#VL3T; p Dea! DBC~.|'=]C(c<ީ bupօ[ag0$Ee?M䮭{08=n#nm.:c;2 6T3r*eý%8XAPX*)Ѳ7A;NJwM܋Vg< vZÔ$ç'XMkszĚҹ5g# WlCa7X58iad 5?sϚah?>OF8:TGm\|#7zJrsn-+ff 1lP*4JEڳㅈڟ:=q׼8ôMhdK骖ʥ,R;|Zѓ0:,*H/d[z*ƽ:!'`9GCNXĸ -{uФ|Z5||__=Û0Tcx)vh%<7|K~łtah] )<ZV-l<ZE|Tjݪ$/2dIgl^SvH ^=Ug?c o_W-޿{Vқ?=x8I–==~<m{(gꁶ)[w|v#wGo9ãHV~cXȳedF dgۘ?Y|C,+P/;ve?}Z{a÷xhNJ(0[8^{,P(/G* W:_- ek犗r}4tP nj+4_+i {7^ mTk,0nv sE@vdͮlNՏ#ۊk/K/:-ɮ:5ZؖV}!<8?1ѭ.[{ {GTZڷ4Ğuj;--r]c6Ab¢d= o|iKp obu?Ǫ7XS]-\ZYm_-Z[ku^WV[WzVh2vycھZ>4j͞n Xhڶںکjje؎GVke3vP=]V˫mޙr#Ydp_:nKcܸ)US)S*=v0p-b$.8 & NLPUʰcjhd_cM"Dґrfx9hypjeM>42^EmJ-LMYy=SR 5SgaIj6jj&,O&ZONm[2w6Č]o+ؤC[|1^@m2z ~6jHg*|'~16jk*WOl5fë$]+yv#GSg vjVjfjnhiVhv,-ńm FLMpB-]e찃کM4x#ٴx8 LQPrASƋZ%:VeU@2 }j$+%&Je@k I;ZeGciс ݌ESRUeL cwIb»SkL!LMԙy> slJIzݨV[Gt+.Fަš&I^ FLMnU qg jϣ,CD%D97mbNmZYy;"hgfDی2xyo'~N:#NmJ-LM'SRՔ;sQ&z%$t#fo6ƨ8z([3Ż;׿-gs74@3[ZS?\;g|NNr)LrtS΂Y:6eN}0_d}6NHq~){_[O&J9I.T`v\CZE6ovpJUL+9}7*s ͤnB0%0`AQOr0_&7!r^?2-6%fCZ` Un,ӜL2)R veXnEԁ\M\ns ٮ~Ͻ&$/xMCݸ]"jO\gu&uyɻ;'gW AA>8'vt!% Lݍ[*B}rm0l)pHl\‚ 0PMhI; ZK=wՏ:N~/s.Z^&ܸi çqڍl O$av7q򐬑 @hd`tMLFRx~#тd0E#flL?Fkݦzj~ZJT`~Y5#1x̻p*f!bX]ה%TCZs^etjzeAiӦ[;ӵ~#ew2ood: lq 'GGa)_fnEs'ݕEijeS^ (qJ>vwxonL݋IcCpJhL.ERŒhU e}FcCLiȏ`sIb%Q1 hN{F}.‡ =/Yr} ORgCPk-u/PT$3m.[IwR09hu&K{9ȲTZVظZݨtSC i: tU)w2jì3+;n#CD%Ջ5ɈϦk3V7iaA.LN:{yBCJMPNA5񏾧Lq)ՆqBɦjaWyYk4KMGMk{޴7Mk{޴7Mk{oow{gmDg>8x:羳{]\!B]B/ri *V5`t:΢"wb}b=VnU/iiH, u7ꤟy-uezH)Twj7.hgPsըY3oD&E&"RW.QWU F{7JD_.TKu}$,I]CK&(GF]E#uB]B]_%fr<~#RW:I]Ej.8"0QcsG`{F`B]/1+ً58F`&BܺSV6%uF`sIy >Wj?^B]/i3uuV^ΨEꅺ_QN]ԕ$0RW'u%$W6JK`6Loujzac[cc3uQ׼PW!u%ڬua lcrh}FoE"uC.ԕ5xT_$0R z.Zf&m#uPe"/Եa ]| K*퍽=2?_E'kX?[_;{3u0xW@]ߨ2qou7oEBpz%iN*= ,g m&CN$&UEBٹ&Y d/J|X?W#}s0ǿ'Vjɡնu4Ѽ "] l" d j!5VY>m7^/_Xd-X|N:$M`ˆp0Z\u(eBCoN2,~\o.$o0N~QhVmVm @MٔoW`@5+PU`0wAz6ch_E-.HGQք4c0Q p|mVmVmVmVmVmVGPq$&dRsȘj<8Cy^Es!X^K[K[K+bi+bi̝XZ0SrO$SV Ls쳱[uN{hBvx[Fm R?Z^ڊڊڊڊQ[Q5񡐶{KaK \x9"%9u2Z\# ⰾ}Wh(`ΉLp;w?ORSI/u-ט?DSMQ眒n]pQ9NӈPoɘ1B#r : '7UVE_8 \ j^S&:1tQv[yk< i€x+;T4S]oQwWp}>Z(|w|{c<{ `lޛ2}lƘ `=UJPaS (>v/͹/Vc\.5&n_4Du\3<w3PL,Li,~dGp7/~ڣxXe[U[j0xruO.)Лi6-:aj-;㔜.'|Ly s6\ejNI-ngo잿X&;Re:ORgcgl}k{)|o>`ovM 2ԹP'Quݷ]P{]3ckn`gƺac)ͻnF_5oאr8\szqd ZVgV%zc;kT% tQmLmp|cޘ^7n|lC%K6 :k5ft3-fvm3Vf绪Cb69I (~j3gzrWOԭSb9ZY,X'8ߺg@HQҁ2Xn0gg ;YwtoR~gI)m~H{ѣh'4<=w1W֐ LlʖK=,+FDO^zY>ynrRF;HaG47f1Vy.-y\tť9Rf9z}o=CC݀-_8Ww8Zj0̉P+@m1g)3<eC5(IϰS=r\Lg?MST6}0wof792?Y"xB|\ .=U]UK:[+6=a.XC/fQЮLRéɦqYIDzKngUHO5/*Ɏۣn(@Q3~X1SˀmЗ3Yɛ x۽wbǚRT%0&9#Qwmn8}%2$  _EıbİhT,J](͎.Ne8uFlĈ#C?p|RXkMY]MQ 8t5#g{+4f-5`#1r6>V

Ua9u[-^TnQ|u{'<Ҷnt^t5% )Cp 6/s,ݧg#S ¥$i8\& 1$ 5q$_̝q޳2hxP|;lÇJgk:IM} 1_dEx\1؋'ŤӦQN$k5Ho-뻲O!8]++- =-JN^!ІnпLraڧk,g20{"˔$x"L[ 'FR $jEV Lc.8АWIpnKpNмG HpFg[+ @W D8o"},+J5sG>YnELUυk΄f!] ԊIBFbc%ѻe(H(V*ˈq*J>ăa3OPl.ĜJ\X RT*kDOd P-s:x*W#]oj䍯KU"TX}80Yp?̓A}JJVqp`+-1V9=#q2PMC r&>$0T[3T ߎZ Fl\ qHZmP?fCE#MP(GTgPNmbN#e|0T?dC5eR9pbC$ޑZ< C6aӻ2T{ʳΊ=ySqُZwHohA_Py!Xէ4J܌Cu՗NeCf=q]Yn; 鲢3U/x/nztF}aVP>pt|:~U#քHXp #Nhm- ”SIyIwF$D),伥 Qg,Mpr 4t]>}gK:/FhtxIFxkqB#l N :5;t/_BْJYh"P`:b85#6Y")#|Ga(MEl*fɲu-+BvDޮ[8=8+v^*];B"u}?GRz;H8aI ba 7 VɩK%#!7 ]uuq 1|HࢄF>5x֋!3}W)|`0C"Q i@B E(L]<GDZS*V2IQi.חa|njF!,F |h>BF!w ѹDi/\ jX CܛnuQw-2%eHY`~`%cFݴA3>$M6nМa /Hl|V6- #+N2&)4.V sVlR9+hgs2Vz9ֶ0<6v~_;~Uu͏VkPѮkgUHL$c.Ss׶:|4V(:gYdTILc} 'E,i>n+ba3K‹&$h>}LRpk& lTc[8j Q[4"x| uHEn$5Fvxw"+&@A4QiD51Fa _+Yeg\}inf> +Ĩt$Q5[iS|PtC X,v&Z $oua-9rLPJ:H tqϛ$yaPk{ M1bŪDriKzB¥d0lLBJ3"_׶y_k駾; ϙG܀KW޿c.,-.%c]f5ߍ|ixi "ԗcQ_/4.iG~MA@dɈvohCf<<얬qcb,!R*4iB˨XZf~iBVL@m[e%Y.kX&LQ`a4(kXi'lط:!lI>ڗbYg9ƎDZfGXh찵c"2"N uMq%8'5=S<ˡff&i?!g*2ștvoVo`#7xT㐨8b$# !*)A42T}`N+!a3 'FB9BM 7s=:PT=W9{"̄i3[ook/ShƟ1)F`&(#,DsLʷ/  J¾t"OLAsa@ϐhF2T.EG;[oR5E?]A4(RNvN{ X:#Cˉ:ʘpq(tXbt!VwK_voeN*TY3:/)|6C fxZJLCm|nie A#آFF4S/Wm1q{u;K͋_ /"nh,IN` 5"(^f:ˎT`ܨ۠}Kz:ߢكr$aGgobU"XQmlmXX746+=x&1JabFm5DZ H 4s3n^&Ț7I70IoUʋ{LH:f(>} Ph=1,sbƻأߡ/1NAos\$s?NL* d1GRRGĈqHzQ90=dzs <;ц.Ud02OuwP ƦK;c܈H-2X1B9aȟ^pc!U!p{#I<}Ia56*MT#mOۇf?R&~^v_U ou/:Aڼf0E)+Ʌ*%D$DGhnB3&e5>,RVCY";|qӣH} r]f5fcRjM^Ϡuzi }ՁI >(1~賣V݉:N~4I# q|['_ !}|ڶ.}'=4 WCzRu=g.t| )ى;%45, p݁dXfFyN~d@}'VC ìXè5Y~׿g907 Q' ie{ v|oėN`- 19.a! sw8& yos˧$ BP1ʥ|,U}d u\-LY֚M8Oy#q }(aI8.{=,Yx%{梗^WviMݺQKhvmˀBW=}YӮޠIhtU]{+}yU?:(SU{iTa]]Z?:qd>r jeaAŏC3c  E#c*E^6& M2#xz_xw`4Pr8+3wQͱ(BkrϒY 9gЕO11Ǜc߆*^H8ϫ|A C6g L͜C J]%*V@}V4fnl,gx!oƵNH,osIb U,"% a$ZIF݊Y|I?,L8Sh]y9v:.H;ip9.-oΝءɏ-)r}+3aP"fI S1,xN, Gqo,&8+MgIACvHGO{cɑF w 䡦UBbDgm ov%9Da{KiRi\>_-v殣DIUjM [Fe/k|ni8iԌONxI &&%~'Km7e럯54Ϗ{ZǸa倞kI:Š>v_@>ɚ5&dpve6KI⌬vE[ 8Ty7 UPFQjOi;\Ԡ,F2X_7Kʮ$}Zc؂ef遁Aygzz>a(bd7nj\g[|׶$7lk%h/i>/./fiTrz67oy :˧Kf)|eo5OR |>nFɛ2Y! J~S.?oͺ лF-y .Y^@Nkw3u/)7'w7]n;N޶>n?mWڷo?=LKfy^َJqơuW>boMťtvl8iuOݞ.1V K|MޭavG73ֆ{u |1eKI؛5CabJ1jKBp)hw0j2fYX[X^ex(&ѹ8R3'ኒ4Mp3Ƹ.uziݚ!kF uZ3J_(z*MO>?&{?0d1– GCmm\9c#jw6a]0=y nI,4]r>$岶>aFU*F#q}\[5.2&$~.g}첶z)aD7 ’#lW;y:NyȂIz,x\d=뙊i _}-e+v i/_O_[}]y΂TC%RI>q:Q-0qɋ-Vd$ ,Ţnb^}+޹Gph62yGwѩBٲƬ4ޣ{y$;][u'7WHv(i,6RHBȌRI,#.rXM̧X YDvFsw>fD\]q>wWVW-oRȘ O0GbSv5M1"'`߸fP$XUD-@YwAF~%&oXv8k ut鲎8 }Ɓ6Д|-(Ao;>Uv  &aycgOOnK`󛵏^71=Q_*hڨ3 D@6J7XZ_y;S> >H|u釓= EPRc>s8v_P.pЈW4rov-/YB3V`ZEJ]:=4E]Ga,9"$ CMcxl !a[}~!uT LnWD?fe@qfߊIo~PG<pA+(AYcGo{m5=e)(ZqzFo}DXg&'/ޞ=yZTӹUi㌆T8Y{1`M8}dl:ߎ0B͂- &)TTc4ȝm5jL ,۽!3 W8Gs}qTiJr6=uGb:(vv.oKKYm|NKN~$gx7ck/|l^Sw1qS&!FmE:G4r铒0JMf`$,F*iS z bãXم#ʄ"s8~f@Å(г3_x>~jRl7Ү1qC<Ṽ_+QӒЎY҄m@1L>Y0tyhwh! ,5{j}pcٱc R6BV*+C0F֚02匽7{Ba4'|.4#&yE&2EVTNå6[G[6,"u[ Whebv$.wtvnPݓŃHXx V8PD?!ppa0-e&):vkң[C;ThQ3iI{3 )lf! sk:&L$f̭+2=e37c35܁?7LgNt^j[g~#~NTAѾi.1}ZR-cM#m9QLrg c"Sp44`i2$GdeȐI1q!CNQؔeZMm8Y_l.0.m;X\7707Cxoh{tD)))TUhc\i.}շo]Sd~7"oRVє4y# ѐO<0D>7?ƍuvF:㣊;]#}OP܏=Zq'm{a5-xr"ᐘZAcȰX:*),F3BaE8{(u)ՅolhԿݮn> KeJw5~Lk` ?1KRr314:߹D_8(<ơ MYD(:ND*©^h]A\caG L5*4m c9 Ә0!w1d{zjgTs OO6Q׻=wGӂd{ɟu疰PьP@bd!< maDTj. B䵣`xsN~r ~ssZ#_.3ߓ T1Y-YGp JZF#m V}s6O_SOS*餛'::e=S<fn(FG24ɂ?] |n~-Q׵@qɿi\ \ZNE_;OтƮ:~K~ j|{Q_<ﺢlKZ\L.oVJ؈ř_| \QtIx/d/NG#m#=%>}**!^YM0窭lRѐf܅jDĪC6y x3\:9} ځ@jz4N)ږC~VEq:4Rk%#wAxUm* "U L8(++ar0. U2*/='|ܜ }Nܚok6}5W+5;N6:5Ҵ~p~kqB+f ~3lcd$$vNĖ8l#+d;- wMwh]P|=Od>Roԗ'ct|Z8)lFSF3x $m(vs9ӆ`Fqs5#SK@W!Z4ώ6wpi^Ό 76w efۂ]"MRR#ƤXfD-r%BjW#~Q- ف*u (*L6LPMS<Ī0B5pb7qۦt!okb?1; jdZ WFkv1s?M&C״;m=0Vk)UJZCGZC(\& }WQMww$dw" ~>\'?8op{libzypp-17.36.5/tests/data/obs_virtualbox_11_1/repodata/repomd.xml000066400000000000000000000016671476576476200250750ustar00rootroot00000000000000 580103a6b945e1830565121199acbdad45437c7f 1223588080 2d2604f11a697bc443b3c9999d630897138168ad e8696a3badb8419500de7e1618585d6272912a99 1223588080 91d3e517317bcd686a5ec1e88abd63b6fb7619da fc0f951db57c5b767887190bf99e479692b1c407 1223588080 a0015ff42e9822c16990b23a9cb08e026b4afdf9 libzypp-17.36.5/tests/data/obs_virtualbox_11_1/repodata/repomd.xml.asc000066400000000000000000000002751476576476200256340ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBI7njy+FLjwVdyGmYRAh6pAJ4zinB1Qa04keOTZET1/KTWRQcdqACf WulP6OHLt3n1fuHPRQRYUmUgeaU= =GveQ -----END PGP SIGNATURE----- libzypp-17.36.5/tests/data/obs_virtualbox_11_1/repodata/repomd.xml.key000066400000000000000000000020201476576476200256440ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.5 (GNU/Linux) mQGiBEeWVjIRBACUzcPOeJfTB0/AbBdlmZqfGca/YwPdg7PXB1zBkfuH/YSDDgTo 4BesZigfcgIyO+3KCyPZ0P+5pO3RIdmIyMGndhKsSTb+sX0utPYvsJlMDmo2lHm3 i26st2DZLESKOtfpeyeXrZHTL1loAyUy0IHpTD6pmtgnBLr7SNkcGb2oJwCgxMvG ArBVVG5+R6r8gXJ5NxAH+rUEAIOYuwl8RwmFHvVMg/swDl+YTXqhM7BOyieY4HzR hhm+OKOkMFqSMudReHvX+jwtpUduN8GiTZq0QaWTF1WUZLQhn+Q+4oRjOWnIKiwl RRQisrn4cVJtzLQojCh6JBcIobNCexAUCMMoC0dGB5LGxfx8eKKuytzPooMYpfzV 78QmA/49WMDc5wLyobhchFzm4cQmk7SYGaTFbAnkF6IBgIEOfQGkQCSMcKlLNYfB kgJr8FMeakkeExrXKsvmL5U8stwtLgRqYhBYgEE/1ZS2MGDLB0nzaEVfovvTYn6B n4o34KE/l6RaXUsxcyL0sbZ6BOG1MgKWLjlKkn9xI77m9jR5HbRUVmlydHVhbGl6 YXRpb246VmlydHVhbEJveCBPQlMgUHJvamVjdCA8VmlydHVhbGl6YXRpb246Vmly dHVhbEJveEBidWlsZC5vcGVuc3VzZS5vcmc+iGYEExECACYFAkeWVjICGwMFCQQe sAAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRD4UuPBV3IaZrrMAJ0aJsQOUt+s efyWCGh3MefGjBEUFACdEixxBrtbVss3yILYjJbzlUwhp1GIRgQTEQIABgUCR5ZW MgAKCRA7MBG3a51lI3O8AJ9vv441rs2ZR8pHL2EEmvegbAMPTwCeJJUbs14J5Wlr zqyZAhXnXWJnldY= =elkz -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/000077500000000000000000000000001476576476200175105ustar00rootroot00000000000000libzypp-17.36.5/tests/data/openSUSE-11.1/content000066400000000000000000000217071476576476200211140ustar00rootroot00000000000000CONTENTSTYLE 11 NAME openSUSE LABEL The openSUSE Distribution VENDOR SUSE LINUX Products GmbH, Nuernberg, Germany RELNOTESURL http://www.suse.com/relnotes/i386/openSUSE/11.0.42/release-notes-openSUSE.rpm DESCRDIR suse/setup/descr REFERENCES openSUSE-release EQ 11.1 LINGUAS cs da de en en_GB en_US es fi fr hu it ja nb nl pl pt pt_BR ru sv zh zh_CN zh_TW BASEARCHS x86_64 FLAVOR dvd DISTRIBUTION openSUSE DATADIR suse VERSION 11.1 META SHA1 02f22523c8302dbd4838618b746cf8a348e39a53 dvd-11.1-46.1.x86_64.pat.gz META SHA1 cc02920ad0f2270663a04861bc44c7fd480f1e9f non_oss-11.1-46.1.x86_64.pat.gz META SHA1 d8e90da75261b09757c10d90055aba27c36c2571 packages.cs.gz META SHA1 1bfeb67fbb2e77f1309bd105d209549370d63184 packages.DU.gz META SHA1 2db9160217ca686f78a3e86de3de38955ad9fe3f packages.en.gz META SHA1 f4671fc99244c27e2a467a9bd11aa43a5fbe96b8 packages.gz META SHA1 73615d8e511ea4ad14bce617bfe18ea5de65395e patterns #HASH SHA1 cd4e142d292e299488a482144f38f9f8d4d61f01 license.tar.gz HASH SHA1 7bd21d938f9fec0ec764ac4d46d80417baf5c94e control.xml HASH SHA1 e1499f54fba10d11ce6b6f0fc9c57c6a2ad49f83 media.1/info.txt HASH SHA1 d423ad41e93a51195a6264961e4a074c6d89359d boot/x86_64/bind HASH SHA1 635492857403d315c613579760694919d252fa68 boot/x86_64/branding HASH SHA1 6c661d6cf1db68da6498bcf179fb52dbec907563 boot/x86_64/common HASH SHA1 7cb8e2739b4751daed7c6f6e7cc20b5021346885 boot/x86_64/config HASH SHA1 7eebc04d8999af9a5b2fdcb75c6ad2e9cd46ef24 boot/x86_64/cracklib-dict-full.rpm HASH SHA1 50067c10711281342e1b73bdb02b49a95ea626d0 boot/x86_64/directory.yast HASH SHA1 93d86eaadeedbf29cf4028f6b965cd513fb4b392 boot/x86_64/efi HASH SHA1 c9216fb7114ce0f23a0c0650b91d4efd5785dd57 boot/x86_64/fonts-arabic.rpm HASH SHA1 d4cde75eaf078dcf5a9be04f5cb6427fc5c0a4d2 boot/x86_64/fonts-thai.rpm HASH SHA1 c82ef5b36dda514d8239a0c234f50a5201cf2f1c boot/x86_64/gdb HASH SHA1 44bed8ec07474e7703fa7915909eccf76a624b68 boot/x86_64/indic-fonts.rpm HASH SHA1 e3005c6ffc8600dc1e5c42b3a1d94ce3e32562d5 boot/x86_64/KhmerOS-fonts.rpm HASH SHA1 e9c779539f1b3f56a96337f262b2bc548e6b223e boot/x86_64/LIESMICH HASH SHA1 abdf17a0246be709efbcc7c0e0a68f8ad797a754 boot/x86_64/LIESMICH.DOS HASH SHA1 b5a21e780bdad707a989754f0fda867b60bf398e boot/x86_64/lklug.rpm HASH SHA1 c4dca65aa97554bc45885b22ef4af24ad5177c75 boot/x86_64/mkbootdisk HASH SHA1 635492857403d315c613579760694919d252fa68 boot/x86_64/openSUSE HASH SHA1 ae44557c57285f0866be41334fdaa20312ccdeab boot/x86_64/README HASH SHA1 4a71ee6114eccfb88582dc5422020cbc5a2639dd boot/x86_64/README.DOS HASH SHA1 b82adaf3be49972e7241ade027a6a26139cc632c boot/x86_64/rescue HASH SHA1 3810d9544827f1d42708f39427e0a48e9e086ea1 boot/x86_64/root HASH SHA1 415f125a4ee1e5a42dc65399b31526110bce3dc1 boot/x86_64/rpmlist HASH SHA1 bd61c88b73894e8106bda37d8190427a910d3ca2 boot/x86_64/sax2 HASH SHA1 df10e84db8c57c00aac85e2e6a6cc5e359c27d8f boot/x86_64/unfonts.rpm HASH SHA1 1239df7c815fa8e121aed8c0dcef1afe45579611 boot/x86_64/yast2-trans-af.rpm HASH SHA1 b12865177ac3be4741dfb4aae42b39398128314f boot/x86_64/yast2-trans-ar.rpm HASH SHA1 a35e306a95f4dd292baab41c280cb25f49e9a90f boot/x86_64/yast2-trans-bg.rpm HASH SHA1 b6eeb78c8462f7d5a26e863f1e4b60740b3379eb boot/x86_64/yast2-trans-bn.rpm HASH SHA1 b3f6d1ff28da9b19e42a0376a44eaa047d538ebc boot/x86_64/yast2-trans-bs.rpm HASH SHA1 e95f0a401ac1b94f463d3c47bb1fbde091644dbb boot/x86_64/yast2-trans-ca.rpm HASH SHA1 6a2c8a3bad0ecc2d18c000d6c1ce0b3af2e0e208 boot/x86_64/yast2-trans-cs.rpm HASH SHA1 11486ac6c36f4d5a4272bc1c712c30dc8f2c7828 boot/x86_64/yast2-trans-cy.rpm HASH SHA1 9f15697ae01461959861b33ca46a04587b8f428e boot/x86_64/yast2-trans-da.rpm HASH SHA1 4a15f3271782059ad77d0b2027685e86d26f0b00 boot/x86_64/yast2-trans-de.rpm HASH SHA1 1667a7ab28bcc171234c960dab46fef1871d4d69 boot/x86_64/yast2-trans-el.rpm HASH SHA1 70dab8364af972d42cb21879eac56eaf9b1b2b19 boot/x86_64/yast2-trans-en_GB.rpm HASH SHA1 29b416da00c34a2bced9438f0ce4e4eeb92b94e6 boot/x86_64/yast2-trans-en_US.rpm HASH SHA1 46c97123053954623de74f2f88eaabe9bc7a330d boot/x86_64/yast2-trans-es.rpm HASH SHA1 ab897d8d470485f1ede2ed378502faa5ddc699cc boot/x86_64/yast2-trans-et.rpm HASH SHA1 f0fba8ba6a39e4ff54e55d0f5afe52102d7f6cb3 boot/x86_64/yast2-trans-fa.rpm HASH SHA1 83c25237432beb7fcb31ef4242d692ab8683cf2a boot/x86_64/yast2-trans-fi.rpm HASH SHA1 54d0a51ca313a293afa71837f06570933a811123 boot/x86_64/yast2-trans-fr.rpm HASH SHA1 199ce417e36c36384709f5870a9227bdbeb69300 boot/x86_64/yast2-trans-gl.rpm HASH SHA1 3adf1af8f9a806101ec2ec30fd30e3b6f36c5754 boot/x86_64/yast2-trans-gu.rpm HASH SHA1 4b7f87ba2f9c0305b50ccd05993223319bd98699 boot/x86_64/yast2-trans-hi.rpm HASH SHA1 64573b85a3635dd438ea3a20948b50e7feff1e1f boot/x86_64/yast2-trans-hr.rpm HASH SHA1 6450a7cd2061f5399816b521248ad4f96d1401c0 boot/x86_64/yast2-trans-hu.rpm HASH SHA1 cd7a63bda7472183da33cb778e3ad403152663e2 boot/x86_64/yast2-trans-id.rpm HASH SHA1 8db427cb2eb69348042ea94e2523c0e626431894 boot/x86_64/yast2-trans-it.rpm HASH SHA1 3c273d19b4c6ac6d3209fe35109595034fb2bbf5 boot/x86_64/yast2-trans-ja.rpm HASH SHA1 4a14bf1c880b63ebc4ae0746c89519f7b8a41cd5 boot/x86_64/yast2-trans-jv.rpm HASH SHA1 f47f6a81e05c38fc77a37226dabe038d64b3b4cd boot/x86_64/yast2-trans-ka.rpm HASH SHA1 397dcfbe3dc3f54b0ede510105d474360d986930 boot/x86_64/yast2-trans-km.rpm HASH SHA1 666f733888966efd0490fbb3e41f1ede9f14f1ca boot/x86_64/yast2-trans-ko.rpm HASH SHA1 417c70401e18d2f948e5f4e87db1396dd6d886c9 boot/x86_64/yast2-trans-lo.rpm HASH SHA1 f7856142994f69c5d6fe3c7a78fc1ad708fecb55 boot/x86_64/yast2-trans-lt.rpm HASH SHA1 58beaecdacfda372a34454f738a0f8ec80aecfb2 boot/x86_64/yast2-trans-mk.rpm HASH SHA1 c48d3d055928c8bd2fc1ec3040f102fe0f387990 boot/x86_64/yast2-trans-mr.rpm HASH SHA1 890a914b0ad6a29143e61deb161eff3556b72a44 boot/x86_64/yast2-trans-nb.rpm HASH SHA1 11a8297890053f5cca3674953805284d88b1ad79 boot/x86_64/yast2-trans-nl.rpm HASH SHA1 fa28c6c056018f95e008e8dc586f0e0b370428c1 boot/x86_64/yast2-trans-pa.rpm HASH SHA1 7751c37d3d772ff1b85a3a890d95779703980419 boot/x86_64/yast2-trans-pl.rpm HASH SHA1 b8462077cb347654ad110e7a5eceb5510b785ba1 boot/x86_64/yast2-trans-pt_BR.rpm HASH SHA1 97f44a1d7e04f9d08d2ce6fdd83398d7aa0643ba boot/x86_64/yast2-trans-pt.rpm HASH SHA1 570ccf8610302ee61731f50604a0d74405c36640 boot/x86_64/yast2-trans-ro.rpm HASH SHA1 74822dc08976c91840e90624d369da07c035b69a boot/x86_64/yast2-trans-ru.rpm HASH SHA1 133235b1cb582ecb94c2f1da2b42f2bf7ad555dd boot/x86_64/yast2-trans-si.rpm HASH SHA1 a49abc3f07422c8b7356633d4293de4f477d2d8a boot/x86_64/yast2-trans-sk.rpm HASH SHA1 2cc14382b7bda0846d529580fc168e76d02eade2 boot/x86_64/yast2-trans-sl.rpm HASH SHA1 6728cda67fd1c92d4b34f8a75752e98145916e4f boot/x86_64/yast2-trans-sr.rpm HASH SHA1 fc9387bfec45138cbcc10d112a4160e93548dce9 boot/x86_64/yast2-trans-sv.rpm HASH SHA1 3a6f6bf53ab8dfe8c268dbf25f7aae869dfa8623 boot/x86_64/yast2-trans-ta.rpm HASH SHA1 755b0d4289a35a84bdc643112c09f102e5aecee6 boot/x86_64/yast2-trans-th.rpm HASH SHA1 c4e460be4ead26938872f5ee56f05fd527af31c8 boot/x86_64/yast2-trans-tr.rpm HASH SHA1 5df0e280b9d3f071cf72158d4a482e443fc98c51 boot/x86_64/yast2-trans-uk.rpm HASH SHA1 e4c77981b4ab02c963536ab6afd3cfe226fd6a3d boot/x86_64/yast2-trans-vi.rpm HASH SHA1 dcd414589be7e8d1d837d49d35614845f986a59e boot/x86_64/yast2-trans-wa.rpm HASH SHA1 2f76618d24c00b3fd4cbf8fdd4a56d34dc19867e boot/x86_64/yast2-trans-xh.rpm HASH SHA1 3e6ac86cc533dae2053c06dca92918444e4c9361 boot/x86_64/yast2-trans-zh_CN.rpm HASH SHA1 ad9e32afe651712cd384c8e20d17de18d6a86ae4 boot/x86_64/yast2-trans-zh_TW.rpm HASH SHA1 a1aaa5991b25744683a761b936067ba279be608e boot/x86_64/yast2-trans-zu.rpm HASH SHA1 219014df667b51f44d62b22979993c6914aab3ce boot/x86_64/loader/linux HASH SHA1 266979798cb8924da5078fce8f1c41db54e21032 boot/x86_64/loader/initrd HASH SHA1 1ee4dd576e7aef8b10e01cf64b70e548175f9f40 boot/x86_64/loader/08000600.spl HASH SHA1 f93b778b469797d3547ce21dd67d31aeeefa412b boot/x86_64/loader/10240600.spl HASH SHA1 8a33d7e0f2f1c1933261e1747ea9592991b6d305 boot/x86_64/loader/10240768.spl HASH SHA1 8f51f64ddfcbe6b3261bd329a65bd8f75ddbd779 boot/x86_64/loader/12800800.spl HASH SHA1 de76d38637bf6a520972ba22125023fb5e9005d2 boot/x86_64/loader/12801024.spl HASH SHA1 db7c22e91260da6c5c86587a477b277a2921fcc3 boot/x86_64/loader/14001050.spl HASH SHA1 a5985dc49d457ef58127b288cf3e20c4fbdb5a55 boot/x86_64/loader/16001200.spl HASH SHA1 495cee4703eaea74c31fca705a4cdbb8825c9f8d boot/x86_64/loader/16801050.spl HASH SHA1 01aaf0d2aa576c4bdd0fd2638baeeb6e788e902b boot/x86_64/loader/19201200.spl KEY SHA1 17162a96933229a9771ee10c0976bdc047a2f53d gpg-pubkey-0dfb3188-41ed929b.asc KEY SHA1 f6accbb18d705bfc104c893cf7dfca1247a33f3c gpg-pubkey-307e3d54-481f30aa.asc KEY SHA1 47f6492d127ae9f6aac353a2dd23752fc0ed4f8d gpg-pubkey-3d25d3d9-36e12d04.asc KEY SHA1 2288e5849740566e4fb65b7c9dc0c7e4f43b1039 gpg-pubkey-56b4177a-47965b33.asc KEY SHA1 89d4bcd20a281553fd1d4ec1708603ebf88f1a59 gpg-pubkey-7e2e3b05-4816488f.asc KEY SHA1 06ff5171362496c0db84beeccd29967f580350b2 gpg-pubkey-9c800aca-481f343a.asc KEY SHA1 04544096c5c3b0ed7b01a83d79e048307c2af919 gpg-pubkey-a1912208-446a0899.asc libzypp-17.36.5/tests/data/openSUSE-11.1/gpg-pubkey-0dfb3188-41ed929b.asc000066400000000000000000000015551476576476200245560ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEHtkpsRBACRHiXh3olS++6/Mp9N7ByGMmjaaE+Y8cJQLUPG1myrbW5aogIP 0WenayhGbbgOHNWgd5dQ8KQpYYFoQuUHjFYzj5MvgrdOENOvD7ZNJ6+EmbkNh5cV zUYfNG9jdiGweZkyA1sh8DYS0JiUmQ4CzaBD/DotB/dCmDcyuNQFiw4qKwCglQah ATyueBRsOiXl0NIs1uB6dkkD/1A2YmQ6te1q38a1J+a8os6bDlMZhVnkZdhJdw6x eBwUb9XS0n7hyt/AKCcBnrDEUQJuhBMNgzctJvbuMv27yRMANAXZDQkp0ip/yHLJ PhUdSNTTRHOL9bV3t+JuZ9xmuclprwyrrJYUkEESXNc0tkuczHBP2c/RqA3OxYHt hrHLA/9Pqe2gEleeo8l26u/uFXs2dtwjh8EZmdhHoqGcOlpYR4DyAg2D+jYfh3RI oPzIwRlHVUR1ii5h8iPi98BVuEvukwfbbQ1K22Jwzxt6w3ihCXBKWKbeC3ElIMfA hVMchLFUbTAw+yodO/u3NHxKQ34+ginid9dVyxV5T0gpDEEHObQrT3BlbiBFbnRl cnByaXNlIFNlcnZlciA8c3VwcG9ydEBub3ZlbGwuY29tPoheBBMRAgAeBQJB7ZKb AhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEHPSXWMN+zGID4oAoJPTGZbZApW+ tuU422mHYGwoqgjrAJ9fhzRhRbV3YsOxKUomNeuIfmWGXA== =Qv5+ -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/gpg-pubkey-307e3d54-481f30aa.asc000066400000000000000000000011451476576476200244540ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC GwMECwcDAgMVAgMDFgIBAh4BAheABQJIHzCqBQkHwXpNAAoJEOOlw2Awfj1UvWgE AIRoxE8S6jQB7S43SVcX06FHJeUJ/m+1ErIj9LwJTYrR/8qsDjTgrttgb+nBHkIj NhCCLAuR8sWj3CxsUMH2fayryNnwZEWGqnzo7Jtt4R1Ur3h5pHYonFjfoJyFUZjJ 7Mhw7/TuOWx20FrzqBi8tbHx8pd7Fa5lCUgopVtMh6GR =R56j -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/gpg-pubkey-3d25d3d9-36e12d04.asc000066400000000000000000000032361476576476200244630ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQENAzbhLQQAAAEIAKAkXHe0lWRBXLpn38hMHy03F0I4Sszmoc8aaKJrhfhyMlOA BqvklPLE2f9UrI4Xc860gH79ZREwAgPt0pi6+SleNFLNcNFAuuHMLQOOsaMFatbz JR9i4m/lf6q929YROu5zB48rBAlcfTm+IBbijaEdnqpwGib45wE/Cfy6FAttBHQh 1Kp+r/jPbf1mYAvljUfHKuvbg8t2EIQz/5yGp+n5trn9pElfQO2cRBq8LFpf1l+U P7EKjFmlOq+Gs/fF98/dP3DfniSd78LQPq5vp8RL8nr/o2i7jkAQ33m4f1wOBWd+ cZovrKXYlXiR+Bf7m2hpZo+/sAzhd7LmAD0l09kABRG0JVN1U0UgU2VjdXJpdHkg VGVhbSA8c2VjdXJpdHlAc3VzZS5kZT6JARUDBRA24S1H5Fiyh7HKPEUBAVcOB/9b yHYji1/+4Xc2GhvXK0FSJN0MGgeXgW47yxDL7gmR4mNgjlIOUHZj0PEpVjWepOJ7 tQS3L9oP6cpj1Fj/XxuLbkp5VCQ61hpt54coQAvYrnT9rtWEGN+xmwejT1WmYmDJ xG+EGBXKr+XP69oIUl1E2JO3rXeklulgjqRKos4cdXKgyjWZ7CP9V9daRXDtje63 Om8gwSdU/nCvhdRIWp/Vwbf7Ia8iZr9OJ5YuQl0DBG4qmGDDrvImgPAFkYFzwlqo choXFQ9y0YVCV41DnR+GYhwl2qBd81T8aXhihEGPIgaw3g8gd8B5o6mPVgl+nJqI BkEYGBusiag2pS6qwznZiQEVAwUQNuEtBHey5gA9JdPZAQFtOAf+KVh939b0J94u v/kpg4xs1LthlhquhbHcKNoVTNspugiC3qMPyvSX4XcBr2PC0cVkS4Z9PY9iCfT+ x9WM96g39dAF+le2CCx7XISk9XXJ4ApEy5g4AuK7NYgAJd39PPbERgWnxjxir9g0 Ix30dS30bW39D+3NPU5Ho9TD/B7UDFvYT5AWHl3MGwo3a1RhTs6sfgL7yQ3U+mvq MkTExZb5mfN1FeaYKMopoI4VpzNVeGxQWIz67VjJHVyUlF20ekOz4kWVgsxkc8G2 saqZd6yv2EwqYTi8BDAduweP33KrQc4KDDommQNDOXxaKOeCoESIdM4p7Esdjq1o L0oixF12CohGBBARAgAGBQI7HmHDAAoJEJ5A4xAACqukTlQAoI4QzP9yjPohY7OU F7J3eKBTzp25AJ42BmtSd3pvm5ldmognWF3Trhp+GYkAlQMFEDe3O8IWkDf+zvyS FQEBAfkD/3GG5UgJj18UhYmh1gfjIlDcPAeqMwSytEHDENmHC+vlZQ/p0mT9tPiW tp34io54mwr+bLPN8l6B5GJNkbGvH6M+mO7R8Lj4nHL6pyAv3PQr83WyLHcaX7It Klj371/4yzKV6qpz43SGRK4MacLo2rNZ/dNej7lwPCtzCcFYwqkiiEYEEBECAAYF AjoaQqQACgkQx1KqMrDf94ArewCfWnTUDG5gNYkmHG4bYL8fQcizyA4An2eVo/n+ 3J2KRWSOhpAMsnMxtPbB =Ay23 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/gpg-pubkey-56b4177a-47965b33.asc000066400000000000000000000017671476576476200243470ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt 8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6 RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu c3VzZS5vcmc+iGYEExECACYFAkeWWzMCGwMFCQQesAAGCwkIBwMCBBUCCAMEFgID AQIeAQIXgAAKCRAcchwkVrQXevBsAKCOeScnlH2fWVBJGHTOVJ3M4yBqDACbBeNk PuWo05AOQ3M1dLE1hkN36G+IRgQTEQIABgUCR5ZbMwAKCRA7MBG3a51lI7PfAKCc 9ZtKfI5G/g66V7pSMXh9gi+ykgCgivPfGMDh9HIROwBIudo2qGImOqI= =htdw -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/gpg-pubkey-7e2e3b05-4816488f.asc000066400000000000000000000020141476576476200244130ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1 uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF 13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG 2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgIbAwYLCQgHAwIEFQIIAwQW AgMBAh4BAheABQJIFkiPBQkHhmvVAAoJEBTCi8l+LjsFn4QAn2wgOHudNubNZvTz NdaYJKJ0m2qnAJ9hd0nQBhn28H4Ii4a4h7kpGWRxN4hGBBMRAgAGBQJEexD/AAoJ EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU fJAKVDoB9w== =MWDN -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/gpg-pubkey-9c800aca-481f343a.asc000066400000000000000000000041751476576476200245420ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff 4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6 Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/ EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5 +D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z 3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4 l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0 bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L 1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ 1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3 JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6 =mY6G -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/gpg-pubkey-a1912208-446a0899.asc000066400000000000000000000034131476576476200242460ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2 dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8 WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1 NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0 l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh 0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK 2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg== =E+qN -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/media.1/000077500000000000000000000000001476576476200207265ustar00rootroot00000000000000libzypp-17.36.5/tests/data/openSUSE-11.1/media.1/media000066400000000000000000000000521476576476200217250ustar00rootroot00000000000000SuSE Linux Products GmbH 20080918201559 1 libzypp-17.36.5/tests/data/openSUSE-11.1/media.1/products000066400000000000000000000000241476576476200225100ustar00rootroot00000000000000/ openSUSE-dvd-11.1 libzypp-17.36.5/tests/data/openSUSE-11.1/media.1/products.asc000066400000000000000000000002751476576476200232650ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBI0qRLHHIcJFa0F3oRAm+dAKCLULReuAU6ZgUPJaYRwKuU9tqFfgCg mqQniBKmBYN23YM/PTIUhH7yP1g= =2Ub2 -----END PGP SIGNATURE----- libzypp-17.36.5/tests/data/openSUSE-11.1/media.1/products.key000066400000000000000000000017671476576476200233160ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEeWWzMRBADU8l2IckSzgdUS1dn0WMM7wXK4seoFsHHQw/0unHCQCxpyDMnn TKV86p5KTbR1FDdeaZlY0yCV+IGsiIxLyuUdJn8vuA5gA5ZkUr89/HtWaeZVl77J HIQxvhDRBWCOO4QNtrZYWvGbvl83wl/zOfdLEs8IGElt0LgfohyTA1qfrwCg/Hac tDDscXsPlo5Jek/+3RHVeD0D/30riCpfpLJOmhraLg1EbWsE0mN9IQsl+WDPdoYo bB76z6eH3e38618WzP/LTG4WuVbwpSSqmXyfdVpXxWzESfT8q0B8CGpHf/Sa/T/L emohmRnLvkf/tAfxFmDMm1jOewJIE9S35jANGHVJcxmfRNpPWC7uHnqjopnsmDkL kMEdBAC6YcpDOcMJZ9sJbt/JNZBaoT5CltgMDlSN50t2v/J5em8qMLqCSNF5UJyd LFnePHTHy6gVjWbqcC0ncFzOqM1y644Up7BoKSAr1hRTl6Mw9S3UfZZZ0al3JtWt 8y0eFIW3QP66w1AL0LO2bZMBuOvhb63DXv5iHorcxk0yIFbbybRCb3BlblNVU0U6 RmFjdG9yeSBPQlMgUHJvamVjdCA8b3BlblNVU0U6RmFjdG9yeUBidWlsZC5vcGVu c3VzZS5vcmc+iGYEExECACYFAkeWWzMCGwMFCQQesAAGCwkIBwMCBBUCCAMEFgID AQIeAQIXgAAKCRAcchwkVrQXevBsAKCOeScnlH2fWVBJGHTOVJ3M4yBqDACbBeNk PuWo05AOQ3M1dLE1hkN36G+IRgQTEQIABgUCR5ZbMwAKCRA7MBG3a51lI7PfAKCc 9ZtKfI5G/g66V7pSMXh9gi+ykgCgivPfGMDh9HIROwBIudo2qGImOqI= =htdw -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/openSUSE-11.1/suse/000077500000000000000000000000001476576476200204675ustar00rootroot00000000000000libzypp-17.36.5/tests/data/openSUSE-11.1/suse/setup/000077500000000000000000000000001476576476200216275ustar00rootroot00000000000000libzypp-17.36.5/tests/data/openSUSE-11.1/suse/setup/descr/000077500000000000000000000000001476576476200227275ustar00rootroot00000000000000libzypp-17.36.5/tests/data/openSUSE-11.1/suse/setup/descr/dvd-11.1-46.1.x86_64.pat.gz000066400000000000000000004570521476576476200265470ustar00rootroot00000000000000Hdvd-11.1-46.1.x86_64.patZ[sŒ~_Qq+)l` Vf,N4LkD70M~ , 4D4!9qA>)wܼ#2310fllu KLh#}g UJ)>|:uf.Q+ӗӣB}z>=U~Pc58QGn7w9C RGw~g\a녎shG?AROۥۥvi}=7]ڞ..rȵJMe!xK:]+TתZmjCՕڨzr}!bDwV ;Mc9O"oijvڕw u [mө&' {Ie?3kI a&_B'0Mu $BWOJTeHBjXl" J^uQRDGkh.p(*|):De Lw@AMI) .WnTV2"slfow~VXs] ._#ԧ/ /e k .]yEM׮P ^]sX\A((`Th7. >j¸fl\9eJsKۥ""bƊ2!4-3J<(9 EM6vLr5o$]۰w>E~ru6mWG&"rvy`VYxaUk MJQmRz4أXHߜ' SoUϵcۣ324|3CKK "mOC8k5m4:bO־|5wji:**B6t 8Oo Xl4 \ZiiC#; i)%/3l ‰n.tn|EI '1o)dm̐e2 )ٙa%`,Ts':D$eBN m3Fz7-xNj8 gygdjZ) ~JEi,Uʕխa &D%`?<5Yy5Ф z$i=Wpvh4)C"AH?HHX4EQ2i$[ZɴFXyRUU2@쉘Gg3[}[G5lW S)rƒќcOՉԔ`,Rinm-LxŴLC{3T@Kr<&di~L1³0ǬiC┏cl"o8C`>ׂG76"Oo4ːf 9f 57?tn7Px݉\\#*Aq@ڷ'6$~`G4G6 A  YݞeISo "%BV8,3͠L `"};3P2h>0aYaXt:=È-ngy̛XJH ((`F[)Tj(Lid$VuMH&i1--DpQ1~((,KCkVc1'kSFDPl a ln5 #\Re#y`edxs2HgqL>!3ex]0~L() IS%âF">?th>ޯI%Gq9YwA9jNd|I&ߪWx.tbFxI)v'~̈́y Sloi݋7{qv@fV><;q~wbq|~Iwlob痯^^d{S#/O1MjzTҹZ::ɛv[=st15=EYQ[=jTfFa,Kzyi.v֥#¬N7~.z9yol4ů~- ɫ rY*✐*AUF,z,0m;IDaYۈe3a{:JHP'?lRm6x$5~/mpIyiif_ >Y$hgNߞLƗk Oo&Hr'݉ N$lgqLA+w\?ntٝ/v&:~mo\XPm|]bxcf <WO$+'帗u?StNN鋣&n2;˝êۄGH3 Չ:rq |ha'=@{4;> =pTE>T~}cYIߌ8ҁq-;8ێyq4Mv4  jX sf78euQ7ã$5tՠ%0^΢,3Yp{l33}g |uPw6N{oSk98I"c37ZQXhRRIK$@z[JAUAJ2trŝÍZ|!"b)eA^ GŊ dR>byjwj{r  h X[qq[>zmGbއ'*W\l$5,p]J8g"ݜ+3 MUI8flaTV6 \`eu Ρh)PʝέA+KYPWYPE<٤TC!; xÒlMeUG[2@!$` q+p6| $ wQyeW<2HlVPhek84W 2ҏ0Mm74sXlA1B c-8~.dU+5 yʠZ\"AF [X%eXʺ\bbwOƥJJo!n]jx&Wz-.tCC b%::ip5a=Q*zݶE5qNWirJ)5M)0.tcB #iHAH - G1&OBDIpQ3RК|aq_ ukTsߏQ!4%c҈P`nzyK`["ݏu_uqK9}'m@'+3ǟ7]8u3Ѭdha ݦoi2/fKA4 *bD4H!K%e]θwu єq`%#0X [5hVGaa GdRʾO&@#()˧(g8RTDkDHcːbo뇶EMJZBг$(\ͅ~6e;l aǴ$+k#&;xbĄ#3v'HjI:bj-H@B,j$DKH xHU#~BG >߹ӶK3{vsQ>xKi^}jB@5 "1 qFzjUsQmJ1U (k@hsdpYS͚BK1U#iGjd%Џ8HԭeJS`n," ^#'\8n6n[+#L]N`:D0`MHoqKMiIj)FF6z $I D;K9`lL}d`TB\F4ɥ:"8T!E[.w${>ZRRC Vd~/Q^WJ6+s,@cT}T%$Nu,+EXBu6%Mk@UCoUqBiH!ZIGfUDuz'#R9jpPEN82#0D) p.+X EgȺK:Xa(b|h|@l"! 8U 5GuԨZ '9ZX#K4&S7n(U%Ɂ5LB=YaOw`)TJZKԔ*4Eh2|:K^%B&[Dz`'-d:Y UEVx?R9 IMVo*' {߯+ŇZ^)VBݝG zS)J~mlcQ82kJJv==/oJ~Emjz]{x\xW)DK!VU *k9SM/e38c^TìuyJ.Y?$ Nf@a$@tŕJqfCdz{աtSh{7Rgx@y0Zs.i~ρKS?_B-0lqC.0}56e6 is!d.l>cgfWłk#~>>oo3$~ ̛vdU̳#WH\Ar?.3޿d-qW{5u+,6G\itFpZDcɴ |?%3Z)]t#zApf#6(?lqFt:-' q6vu3sH:.&ϗvK/ǥԖt>U_/OJR}ql,Vͭ]x>_<|%՟LK>QM(lc8NE 3+RV2'gu}}*.ץ\}pb`K2b$3㰸>?^/\} ioív:k AcMͭI7s1a(|g6b/;RuftJ:#W5UM- dlE]8WJkc4\2 [ݍH:eR *%\ž p8iEH TW.8oI$S(6zWfvY8) [4BEdb>؎+QR+ JJQ0?ZRin'TYiVJ}g!Ώ2sL$[x-3NϤ9)o8kPteRh@;3Y 9}iH6LadFc?{A`6ۡyrL`JVR&Wpf N,ѩZLn)NZ1i 55{btv8 %s^ KNt hOKtT(Ì9 iRXJr7m(JYi54Eہ3c(dMpnͷ֤RdhT%K[)%(Ŕ4{vjZ.!7AuHE3[ mP#@&FFD[#پtq5;G^K͡?H?.9؃χc;C B:P u?o}<<.PIG?fh?*2LZ1;0= uќZA>Pm3r=z=^[h;j*!n UH]QuHbQ_> ty,9yX"^49U7AHctY)%6rԑy7Q~[.1aʰoa<[ȗ8[,.D:\o@;~Si?JˊQyt*ګaY\-ZʢTOh.ݺ'vR-1IJ((,XM; @>ҢlZ2= *ZQ8r6@+O_xiZId2IdI)u-#C3-*pc3{4j}QLHKGK{t'd͇V'iMﴚ%SWPFSP̉?(طEH5jD#mHKD>.ؐBE,҄Cd5Ez?>khY0ܵ$>H<K8-'͡37gI@}PwF`܆ Fs$P6Z(Z 3S 5,5 eb͸52J}M %eUOp w2D(6NhG5i 6s;hW~$MS^i*hC&|b5: {]u O01%i@,I4Yht$m`i"N̴4L26аRp9E'%X>JAfyEA#0aSFyaohreJVw5 *nCtS( ;b^Ɂeu._)/4̛j9W<ybQuoxXΟ7ׇ_מOgOTS}]<)9|R\ԟZy54re* 'Q_ޏ䆩ɛ PpOR_J곇/gVϪX=xի_˭Wձ"_Tk{dU\6!:P]:~ZvҦڝ{1O;2x9.O;bTǦEԨFm`*UOLOoW#bxumtCrCՁ ~P-p|PnH;Z4r:;y?].OS0f5{׼v~u  1 wNΗti5^lEUR¥_;%U}9An\ѡGc}'o^Qg?n[z|W__s"ʖ6qe׍m\[y(]9څTjsڹoT,$܅pB]H w!.d焄p~.C:$܅pB]H w!.$܅pB]H w!.$܅pB]H w!.$܅pB]H w!.$܅p&1Ap d;sa_m"éd'Sl9_F;WI9Ao9DvuhSBv[n m?vErhwfa"X >i-0q ވ>l@1/}b7iie-ȡOZ&eR t"|bk7\btsӮ[ƚSsƚwM՜D5g{COV _V|ksm掣Vswgxj⩈yCݛufo@f㥜6HljzwkiƛoS^*I{)i{-g8HqT륮ԙ ZY2_v^p9 [JZQķkF%X$'#8}Rv6%pT Q@M5p(EXn-MNS#Hzn _\kRs|{c;kZ|h"GY }W='3O*cQ6_| ˌi1C8hPvԳ y8tY)KgF*Z^& 韭Z-#]q׬~oǭe1B/Г8LdX&@ Ѡ2e&z\$2p%EMҙV4Sx4VA&qץ*"`;c3vu;Fm0a Weg=B$T ! ֗jM"(6.H4Zs0]&Ƿ,P>-2T06se@Sw,E2>{lɮCaOl]Tۛҧ. 4T^2'IЃm-Y)7GT_vHJA[6bnZ8|qi4`L|'PK6* TpduZB߯u(l{ͭA/a-[|NnbLx7GX`)}Mު #73zI{ d]h/2e oE:j M.V:y󝥀Ic:R$q-G#(\<{8 iI1Z;Bʷ2m$$qi-6 HAUҲ7˂D@h@' d5QR=%0! лa ,m*=Zy3I^zX-2@i,<4-6ĕDH|DT~$epbGDt>+!hM(,d]N-z ՠ-wH G 8״٫J}WW@iŲ\G(u.NC$EFMT C0RզQ܂ sWɑId[Zƭ$֥.pL{3n詌- }!R D<ҊJNggl6lq&LtI Y=&D;NhI94svA4iqbU%vm)UB>ֲ( bQ'TPÝEAě/'S 4& 48 Ѐc0,af @KSNb)˱ ==iG8>BI110wrSȯzdiHOԦ+ ީ䇫õ|@ C U _J ֻ6ΎW3Z9Z wd"MAr~ (Vu.9>eq/?zY=*3"'*Ţ `/U xR8d&Rmp<3 @N]C\ԃʶbЯH\1wȅ喁jV t y&?b$ǁ.Ƀsr\ -3?=n{O;Jݺf4,h,  y:bRcRb׈gvC>\uw,N_.MpAlcsszO?\9nj 4eHnD휫/_s\ӯT/?ZϏY}8D6=.nT ?XsR$ثut.I3g?:'HEaqɣuǮ'e3 {J ߔ w7+Ϳ_Qo3\Fh_LHVt]ު6'c@.'I0w~5`)nJ ]Ωs0JÃs}'C@샗| ӾbM&Ъ6jwuWցy h4"\4% wi13Bqkv jߢ9m%D\ Zyx*X@3 8I RoDf<{ oVS^j+ҥvsQxa;O !sڴkZB&ʹe/c asF~ ;1?HӀ s15%)zõdQð,Y 4Bl珮_,Jbs_brв =%Tm9_ьCM3.!.5`nyj ޝƢ0_1Ma%o*ֈW7i}njܥLdSI!X38k_LpeSH˶dbR ؼ˳) %F]45 媨t!8ۯ[;21<E wg)9hҎ~8d}$aaZ>ݝ:M@y!D-+ѠoX"B[J%P| Ұ*Ui zQ!hiPh2C lj"ykҠb"JãoV@;K#e5H:!{NfI䱲tg vܜ=8йk|(N, ݔl(@7/qg9C5O!n~:ɋ3* :ֻ~ бgߞm~1at{^> zwfcӅϡP5b1l;VF72dhto]B4<ыn[˿񖆻 v(ۅ(VVV [F4NTFơ]vsxUD";qyR@(WU x6·zA9Xcrt=Xs{h T~ZWP RQeJg.-@rb|ٯ鼹P} Y˃`R6HD^*iQYYr䅔yR.,K(#Ogn'%$2Y5ʛ'uy jD.< Ok].cHiNp}1SkȏT;q`P%xx$r59qI+gj!аGj@ ]$k5&ą!s%eG4xDj#/֒KntqLC&3]4Ch%0Hg$OJz,nIx ^%'kc0YFHyB M ABf*jVT ݖS B;H!4癅B)vuuJH+rȹ."b?jqаDXB `?jo&{WXT!`*#Y[n(i6>R`[??vL %ٝ<A22 5w[mf=Ecgwg@dC!p)   "xA{kHYj"^w<f\ j"j=-$4ɡ0dždbɀk&,B"l8J8WGB "4lSIM/U4Y$fe:V$H}/_nh/ !$l҄AcAm55#KC8@Mz@ƘUda?dDh% 3ٟx!Qm[l?W%aUr^#W<` 쌠h+EHUv-_Vc"Br*v Qn 1 d)~ކ#mSSpЇӤ r㉜ZKO7}v+Yi7Sij 2*{|$`G0~ܬQP?>3%ջ~7V|.ޜ|ON^ yxrn<:gPWgt!7{+G LƂ>M^^`q[uh`©rT}:{R";n$]+lQ~mgTc (Qa= `p iԅ0܂þF^7y_hkA,4}w[vWqTxǍwaM [ShHԈh}EX*iaKN:tɼ2_Ieύ:cF:^!!R~X߉@䦳%Jn"JuV % :S?QUsX jr&O+4ITVi+%ʏ&aOU@ Ԫg /)=ZQ^vƴxzz' ) 5ܲZvy Ky+F"0B=^ݧKQq 09VLy30HaEvC{(zNbb =\RF 1'/` g<߈ 3nG˲n粀Hp=5F莵ϩfOD[5:}^Xې*_4jM͚mt*)m8>|9ģQP{)o{ӡ۳_}֗9)An):HO`Kv2Jf΁nZmx?@Yk3Ibspn܎dGwވ]+ p}lGNC%]D5]gIJ`pFT+N$|Pd T#д f@(~}H'hua<>SUУ䮩 %-ZS6v Ǝt5#p-zM@C-Ty>J8 [%s+Q]LKYUKJU)9.M-R 1IdD,SSۑF>bM exH 0+@ kjaZPZGJ6#$$sFY .C e3ໍQfdPAdM>2t*8@7XS[ 1\t! U +[O+)3dv\An ZaHǔ,xMQq /ER$K\NZ3Q]/O\i PW7Rrǰ}Dl 6 *T l KYjRډ8U0,#< ucIMD(k ϳ6G JԊk#"dQRЩEzlAp82ps(3qpPițkTR2Ț(Ԉ-4A>2$8b#o 4O݈˳;cHK#}wMln\s]T2rIحOT, BڌFMdN([VQjD'`ۭ; -~u] xe9vw7,F2 {bdOT\ =}dšXDfpX‹C#wḨBf}ūWı`\ӹWi_wV}qB: D?'aٟWnmo9L;R ]8/ozS4Q/PIdt(qN=mϋO=4ڬB"#PܴoB{ o~9Ʉ3P/`$R~]..G~Dȶߩ$parH;ҽ\3#){MaBdnJ|Vs'VexxhEЗyk3E'n99F:<\+!(zL֩[>Ke [oמɖy9OvNOgRTQKCRUGTsmη\-6.uL|PߐM:ȏ5Msk9ȏRvja9:hF-55sH`t67[6*4)cp,`tH K1돦NsF%tt s"jD&$F*)=yC:0P:.yˇJشi*h HaCıR\ r|5I_;*}fb* r'eo yr|;$9qe?q^#U #6yQlwĽkՙ9ޑ//#ߤv# <싟oe *a3짠Ths{ cd6 g#C-~ >9@N}δ\$t .ޛ5Iqd)M'5CBRHLC^dQQYQ%'jaĢFHk $+Hl=ᑕHgҺEe{{r9~N-俣5*zҎ;Z%ݠ^խyIuuaV3Qִ )X%S /[a{)kuaNI3S (k—La!<&i a>V&YƦWG$?Fr E}@_ԗl"H{hm# ڢ7bJxQmO$Y z[#Ż)u[HT V"B:ny=rџ$I=Kdv'e &:'8kYj̪4>t>L v[w*D{{dY c/{UĚ:Y-,z&1gZ~K\g'02"4|D.}trƒ"z7]vdptJQ[9/*&aUK6]J N;Z$ߤ))::s %Q5V_*I5_O>"au!"R+t{3z$Fd@cf%L#[gy,.J]v]AJfO#ޅV;r5%6U_g˄2P32x츣.,C> kxV~tG9i`!}K TJB)bH:*A^ ru19B`C5#P{|)De" \>h1EvuyBǛ;.> m3H; ꞇ$] 7%k=cH4Ajt2Yoz#6Gu0Y |q%ʈin<^촼ZHwf&עXԬ𳒩Uzd)Ut[zx>h7H[Ԧ3=@Ggn2ϙ[́G#<(SY@2=e*BޚiRznG[> S|=h6$qJffQeoLz\yƉiŌK.ت_% G[9[JΫ&]'b7qb(-C;T^=kB߀̂?:)mݖy !`%0wC!Qͻ-) 1}-k)L)7^)5M1mN]rĵ9uc}mHpcԷhX!@]ͩH 꾘&;?e<șHz˝dWļ+,&q;ka '#w.ڐm(&ufS>2+HQ Vq%n񑼻GR:R#/:mϑ@M<'|O|4s>@_̣;?P߿pc'~ܴuC#Vs3%oۂ_7K#8O?PYCBCZ]uD2xk+P# ±Vx$gH$ˁXiD7+!rnZĵD4h?PwI4[Uk_z[(0U6g%^&;)>lTlpLCe4lՖ0W)Q #>>NN: *VC[_j綴H?7z|0}z4YOe6bB6~ x@Y؏;CҋImKC<®n+0CDs"Ay"M?vp;C: t+Z8}%Vگ+լ_IػF3fU*Ilo͑'ëvЄ'veLJ &=оà *] ^r-)aI'"j!pQ6#bC"`D{IQ~+}O?dQqꞁgzn^CƸ!^.n wOg1B~4Q8P Q(Xk]&I -^F1Be@!Ʊ&g ?Jg<:›%X57 ; L8ܭ{[Pc<qK_jc@` &"d(8/ =ˑXywqݻnk7xid~5'g?ymIӫr&:Ƹud.8ݚZшV_'v7_b^EdihN]ь994s #pL}3/lƑC7Q?/ դUCo D-1a$c>kp"&w&8ZK̏tpy!-1>K#ZQw0qz{Ew *7JX+7Z*z6,?F)5xؼNbՅՕlXj&Z @GKxHGޅֹ2\6Ev )Ŷ|=ܣu݆e`Vh8I+Q0jlsi io҂iA/A؍mM a>ܦpْێ6\12m :bz@]ܞ2zGUjB)sQ/k:*S^d '\jBX'X,Dx Ԓ6"kUn6Bl )"pjHe3<N >#b?{a  r~6wOZ~PL MEIx)Cg|/p&ÔFjI]tz|( 0ȿ֋B1R!A2Mrt{<$i_{[K:ߺYϗ_}e'Z P`Ӧ0ȁdG[#R?S| l֜_udO5׏#7>, Έ_auWox+LIn U=K(v46STM#)/Ҍ/ HKy\!d&%#+So|LoA)g HV\00\A4^Wނ㕤,_{)rfFq[9\^2_]k&~ 4؎'J %ACo:LHN{LYac)XIF^^)Yi8FR, ,5;n]=}{3O1),PuMr܍л(FguZpbs^DfZob̜Ow&lSAG1VgMwSV&Z|qDg?wjMlӺq?]U0p"NQ +G=qDhʎ}~+ a3Ҭ jM5w_rj6^Nϋ`v|L7U~ffno#ѨsIh.alvy=rOo6zrϳ'}Y27j=5Æ]НדlO?h"8GQV&b]bn:;!'cb.wn^oO{6! 8 , pGĘoe65OCWm SXghNi^~;w+EQɉ&GmF ucԓtl1>l&( SV['8JlSgW/QٕUJ+ :n.C@Ϩί?NjsяjCphdYsFݎ;t 3ncDtX̖J*l7#(B})^L[KԏDpSEا U(Ǹ*p߇Nn/xK.<)w29q;R:{sު2ZfϠv-BK?zo;˵5 GǏo-TB۪fZ$PԓĪMy]i F)Dc~0PLĎ-zпiѫ#+ħᵈȮp9)ު}cpzJV蹿@U dz,<Ч AUwMmAU!"ܞB/&jm4wO1N*:&q\31nVF]™C7ۜ?V֒@ڂ.o^1Tu2ځ=w{f7ɐ"6s@ӞDz[~C G'վ(Z[(^~Bj`ϣ{qe[X{BJrP r3 kS 1&wC5='#/ Q鏱ֶ͔aF V( Nr"~\`Yf[Y賞0sYAz LjN1Dk+k]`[*k%Ȏm?1dı6b#ŎW_xyN1\:Es48hͦ {sϥ|:EYRQB^6e!y.& /ICI DxߖO(Y;z!k$M۵ y(JXVPGb[+mO츁_w(OũC(5YigxuX|JQypQڴ8/9ta5,@F'~!ӟ9&Dd pDFlZh9Ep—KA'UAԞYq8S̎!ڠ)92jI OT!2*1Ԓ|"y`D,HmY'ٜ˱('%4B\Rqi#e*/!%mumXk+D:3| ~FkHW ٿUx9iakz7W8ÌŻヷ glfLO,kE|굔S4cR4Zp`-y53-힬?Q6`}j_5вWXK^i%ggβ6-"dYB!4c=ۑñY%E,tAwzPrgzƆs[đvIW>>=wp5k]}ѹES=s?<\CE"OgjP)xxjzy^dabuWu.h1.!W8x{u]*h&1{bOx<^9,WɻKh_\Ņ=Q9(:x:MPK%O󌗴q:#[+ZW/iGa]:G\`,&n"^GkXV^F'( #JKPxH E?zB{Լק9efnnzF^C=tT(%HwXW@6yջ>~͐%SZb¹c7Ծ+5G]Yy['}` n9Z/< Dl?^Oi7W-py b='TB}czU.O:nRecVTqLD΃ZYF+[SRo(UUFmԶpz_S^L+MNA=1%o@6ʚ+fDzѸ4,Wx blʓ-VBV1xdvH{7t^^Z(Ur{N=\gEM"yD{',8?`wt]n8\y% oii?}ܨߡ)d!&yL)=b1'3y\,e,zQ@/.j96UՒ?<(Cu1p~XG:nTIܛ)e < 4X A;D9)'aLٻP􊤽 c!0HU*ʛRb^Tu|+wUn(aR4Lt;"C=i ls< 2HZfOHh5.}@R/=EdS,? ZQ{Y [1!ۑndk5-㑎t"6p 79D0G.ORz :>*5;Qu<}Fd??т.80u_i&T )q'H+: {hΈL9ӫ xͅĎD 3J%Ʀ ̘2L>t}:7OPvk=6M>q_ջV'@"#jgh |ɰ?į.++1"I\=-⫹Tja? vpO>+dVHV{v^1> |%Sg;أ#ߩb5W ۩zڨaZ 8g8/#U] uFaL8c CəSzPjo{oPb޲`RGUMED=RLBՃX)^fIkaX@݆e*cAߵ̞*ZbG SzoL I`Mh_:ԓ = S @Z=U/ݯ_^8` >l о1P @) ਓV 㠹{O#@ h?S?;|O9@_ APzÿn&AozA(zQHӎB*բ</I7lD-:!˃FHi+Q87cG@X]|_ W= K~VTwVqw+k*羽L({VZ{кoR ig&Mڋ;z5^ j'F0!n+sVī3Ü^S V%")IW3=ipY ^܎|Jޏկ o/_ &*쬔);X|+1,uwH%=4մkn_{ Ե)wcxJ5H:AK<%f#NsE4Ѡn>zz;>L4h,lŀ=\+{h&H8ÒdbmU#˜|*D%ll13zFdckk쭞15NHL͵!^= ^f*%I6R5HXV r!U,b \ȓLLiD36COlΙk#IF*c)֙|`tɀ{7R%7Rc'sT SÞOl{>1T&;L H|3#vf_/Y~=#AF.J'3 # zR^D0PHVB!#Uf t]3XQ"E>8qJȧ"?kĎL.|XrArD~K|+j(U k&hT[aJU,iXy=sp{=沞z‹*_Kihӽ.06]- G3ձ{Of3 C7Y@:r Q;}EMIL}>JRVATT7H맽kÏyab+\΋ ñ"u#֘nṥNR 8#Ʉ?Uu鎞-L[c5׸2Co*%ԱiT]Mwݽ'oDJ-l5v-Z_ܿEdJfEyA?Ϩy\֣ߢṽpyx`0Ѧ.<|/UC#(F8QXS1%nǑ|r8`1*xBg>)u醾bzäzƴ>L RLka~9͊yrrrOemIVF@Uc(Wa"d]gC4ga;'Y 5Xj5?khunF0eZ}Bݖ$RH)V(x# _gWgd;wwYʹOըڕa"vAPC cǘA3Y]1]kbgY( 4  @Џ8ҾV倭QRidJ,Пn mU)UFhGfnZ KKYx Oq=B 4+5Fnf{5'I0<$$r񐉄g2/Ȋo3z\2#*Ka=[ Ŗ۱GKu,eq`ʨ`:ߔ(Eq\ŝj7|˳PAQB;uOP!L?:=њВKߌ7& 'rosqs(|,C9K ؕc(N(iMS'U=~͔8F ͘gzoឭ&j^F/r_R͓%ɦk.ߊB w /p yŘVLHs05N]=} &RYkWQWZNO`_&>{욶.@?}QyŤny49Ҧ@.n}ޢ*7чۆUt e%M:}L \,9$rgpDc~D~bAruGR>0AD!BׁV^f-HAm+=&#yBB@(tG!j IT*l.],IY]ivTx,ﺱyM R'~%No2҂i$F_$xV/fi:R7P'N>@ԏ@rCB'RP &eݶ[kBEaɎь yFmũ[n`ۛZ(n]BՇP0weg!%ojN2Q=֏: owx&/9=+nH{,DB#bѭyȴw3X,I t %(TG;Pqͩ vi]jg-\$-uϢrQ$oދ{z)e{ t%t6 r f-Zn#j: ?#%7ćCu)[^d2ḓFpXMeo3.tN;Nevnz6|ᩏ}ͨ@".?O?|B~~beA< ޢ_Dwkg BNzwDI\{Z,ZNrVŁW~>WGP൑ [0K'HsЁG8~8 $3B(x!ʤ7n7m, N_8Eqqjpm~y#k>fʦ_YP (g8ة邯4-yq]ߐt({9̞0- >|+.v#[A/ I o8Ls}E.YSeK< kVظQۮN^W"rDž87[NdtNp녣59{zn9M^TW@Fջ[\d7H>_ޮ-* ]sjhWQ$/G!y$ĭ vx("3k \en&t[vS:,g !CT&q[HAL p҅/"ZKZUC{N5'0bN GP]}f t b=ܣ滋 媠?x 3QO `t-O{6]41P(G^=yFLg,X2=tFԽT`㊛F xӹ2ıVjv UjpǚFVi]:d :a3;jpT/AP 'TB/ 7*,jnU i%u c4T 6b9H2@g<3c le<5[Õ"~=GvcMFHdd6g--f%֦9&Fu*jj͊qѦfiꢁh.z"x;^*Y\)mK6Ż5}^ݤ^L"-#F)Ur=PWO%[M2t{Ş ϪjAx a_]SzyBab_OE0$-rZ$z.Y-#5%wWw+( 5Z\,LGZF0! 9U囦ؿr*,,}A ^ ^]^ @8h*Gհ-'^-^Q^K|,cWJU :cWfU#^R@/dc2^/Ce3:i>@,P5V׼W ;ǯQ` =Imn/cxC'Ajm2fB5 Y,`G0(9/ @ r T5wFd"[I}X;]Hnal"wk`77Ԧ3h")uDŽ ;PjoǬua~=rVAдC tL?xLcEFkjK~q0~BJ)\׊bl~ql;jE(332 jZbPlā?a}GG; (Uˌut΍^vaSW6 Oq&qj;x4Hj^ćfU kV5`4*I-J #b~}OqOǘeAS#AX yZM{!lU%be\1~1Y\5i2'iżVԨW L&)/?]_3BqŃZ<~>74VX Xw-vTFN' o PTHMcr)4Sk7s|rR׸ӋtŒT}um;5zrɷ׬Xoiuu׬?JVՇ+??աt}X~_`Wb=3> e#~F-[*{HGrU~- ;gdJZTۼfJ?Pj{a'ݐeVNBщ$5fI'ZH85Ve֊&kj\ @X+Ԭ{@'`|_F-XnU&A$2U<'^0Lk@o`?e4&lcU+R7 } IoQL9$7,GRDHQ1R!Y#Kꈺ3X/D ˜!^bE;8 OK۴ `|7VxŬTn6Ǐc,!5 dmzI~m'bWtPPf nxl(,Q(/BcށۓAWȵ-S'Wg( B$`:Sϸ Tg?/aՆz0X=)i^7{bBv=X b.xj7>Qd*E]iC#-FP %W=՞PE*x/z˽MjR^ra+j>a:J_B>:ND@CDbI~,<#qQE%e*M~ɦ18wz}M:g= ;O7f.OdOi^’~ jQAokݕ^+'q}5hԓ/ }yb":iJY2k pҹ;MOkYy^:~fs߲83;;Lr_"E ʄ$3%5+Oa#FA؈D^!ic.KB4R لa5A+Qa~w矖iY]q eoZ CP^zn&:V `s3o)6SzR區)iX8Y?n6C~X'i)05ˬEQ%YQ@QX =4DiTvLv*t6̾Gt]#Г\*iI6M'rb67k*$d\cbMZ'V\(*g0`^;/=' WU>4XE*Ws6s H/F}CE ̵l-b|O.fi/EP!nׄkJUpf3ϳ'Ҙh,jhD@(́]6K9M[vPg5lmp RA\mLGUvab 744QhԺg0Δ&;Ŭ+ޝMySCvo>6 ]\xLRXF(m>gUlR^Jzj)%Avてc#܈7MBTW UT( vBR]>g)"%R1E⻾$B1HXQ[|<~<(jd(.<=Ai>jYOWﮍ-O $8!tw/dE>xHk\=ri<\ 9,>Xך#N=v˨BU :pāDH̓#{,:6}htbej}4͂$8hGH=Mb,FV`Q=@"T:*Sc6etOв󊡖6 p~OFܖ& 2Z{2BaKٰ6|lS"Rާ&lҖ4ænJG+Z|#N%H'bՎb$aNu_vBo÷n=OcԧjÄh1],f] #:oy_I:˳~ cےQ*NX+9ؒ3CY 5-BC;D̏tC^A'a^s5jFb@"OFzlS.ڎ#|4sbW Q.>8c#0,.w0XnD51?Ⱥa' ܘ)wZ-*ino+JjLz{+g"VET[+Ne  Gz,unl+noDF :|@X 3B/L@ F9l \BD)0.cd66s=K:NxtL SC3OQąiZ.#C$7?J ݝUYFT p10|P)`+ Ç`5zfřS9S$חtBRS]La%f P7kmsXr垀{yg>0Na??k{x)lnCЗs ۠`,MB?<7"A6:/fp`a@Da=<| +e*31P.V~Kh;=kD >?Ox;}4%5.S;Y"#z)L&.&zvDlJIֱ#{ B y wTuTۅƚVZoW}DђH ߛ?" 4 4Q|NZlI(qIXYMoB][XlpGŸ.ћ3 ~RsGhǮgO Bx ~lz;)GguÝPyxO?9n*>% rL N`і_(uAYp%N`S ̉lO=^fx)HU`r GFG׀^=59Be'@Lp'i0?0yFg;A:^PQӴ%9Żgq'Ch__B[cW 6>;4}cw5VԸAݜ61~c@!g՚cR>)c&d;9c UO8;1|֢665g0;4㊃3lDQVENw\PXcF~a UcI` b"'Z@9)"-b Er`Yݱ6AA WȁCBjs֯h}a{+ic{XDghf.cC(s11Pfc8gͻ5'&sԢ-iz NŸ;⦩5ٽ ͒ *FHar^JMA 9ԭsw=Yrά]]vhHԫsXi7 Y,sd%zf+}Zz}L 9cgbGOϻuCv9sóԷkPV`U1*+&a󱄺MY8s끹?59[,b+m."jQKV|w'G-g̪[a!&75˼0Zi`unE Kܺr2f~ Ũލa#CKUWwkJX Gzjn ͠|aD' ъsS'e }#Qvڔ Xop` |uT L gq6/" q=7X`MJgBInğd5:c̷Tp,u{YδK4`䍈ɊYh;H/%>܂"As u;$ˀcsJNYM]iA>@)1tKj:/T7F1:$d8*:Єi:훻ǒ4kgZ}8F`kqŒڤzOhQh/~):Ҭ-eFdRvŢ+t#M/|/.rH_hqlC5bxqamxUk͠;,&.u^MX u"yN YWA#qJ]oaho} t+ >ضա~V,矯0-ϚZg>dƚoqfBKV"24K_XRD'+Zd\ϴEF_Ju'{ӷN*#djUË}L` NLT_ "4Ń+- Y|l{,\n,gU];t0Į3R`ȚCh <9ARwn't>Tۛ:#h%LDfy^Ě~\v'ta#!ZtTrk'0GGv%N8޽4 S & EA5fI2 <ƦţP`q]c…}MA6QjͺPNh<~ZpQ'>Y~ÇV֡O͞ng{p=מ=o致Ecb`vZ Nn׌}Zl ˼k=WGTo(+^j(ƴq&kߥYvaſo Yw& ه*vf];N?uVF|[!?Vh(`&hPgk%) jpi]IpÆA "Z,bgnG|T!#Ou/d tdCN]|`CG;n-/rW)ӠxJw+"V!WfSn>fD"4ItN =s$yeAU#Iey/]׫ed;fёcu?y?k؃mN`om`/|{8VeYR(?aCQP?Un%q7iKaxIU R?sa>|9a(Ldb}2=^8pKB)jap (M"{uT^mT&/ck Dw؝5*]7Ћ.[nU阁0Q ^>쮒fumϣnﷷ21+?+ u-o4A~P6k|nա$+P^T b7cBY2=WVfZ.}Gq2xQ{,%\v>J&/3~9|ei!m98c]?uqnz Bp+|k0XP<ʇT`G?p }ޡGU܆bQ 'a#0. }= 7dGaԵ$HU$0Wq'"Ylk|hEm}]D-n&`1A?pHȢ N;'W׾ywW}ǂa6m~n'~fv舵pe֝\їf_웿r޺ġf%4`5RrL#% &3"$F}87wpfN4otua nlk{_P+Y3u3*A>m 䍺6+^'iΑN0bY`g(jSRTpQu6G)hܖ{6g-yk{|yKh ZQkl4UZvX?\>7sScvnZW<>QG'XU| ]HǑ=ȖճtX8Ƕc՝68haJfÃ'M{oFq}ٯ΢3}¾;Z1`hVd'0œy,yeAZQeS!"i{PAd:$Ù" Ө^>1N=TxPϳJ=*='g©g7Xïv<1^wU!>c6mh NHIf[#B+Sɵ(enQJWVXO%W ع%^{=̩!OqfO.ra_pIEXE~#vARc|_ ncg?f4ZatZv``<YkF}("ާtqx+6ݲM%2Iͮ+[e"ᄋĽIn̈́ىUPKdg⹥Oqƴ9NfЙ'Hi.%QgOv:u-H,NJ1mt^sHTg؁QOS񛟩b'+Ob_yGhk^Yĥ;<źg؏iIi-F l?LP$ fȹCf``v00; f``v00;#j+c.]&Ui0PZ:u`:Sw6&fobYk+^HH U/4hx>\!F^(j6&Z6s6,U+D FN$Z8Zŭzn/0cRDQQAljI-N0{PIFܘ[ni@Zk׳VÅ)Ʀ:V^lUƢ ?Aa&@i7$u04 Gתl8VTkGcTj2J n`<\zS] DT5=րXK.];HceW}RWǿvzVYԽJTK51U"VT X(,VJRC(:O 5Sl~j矉T(t" A8j7M C=2""pHJ>HvYgAbN#464':I6|`dHi{vJw)$[@%tHv[/Vzmx)ND~Ec>jDMhbfdN^`>0'?1HE3D E͏d{47{Ot'V^f{~hHHS9f8 p`'x5iў#QS)>jQ+ǰ: bD9nRCK|-؞orM jkBs&C?>Fz3~0Z+n57 UiOoX?7Ԗ.$e5>7%>7enj2Ӟ-bCcso}27yRH˽ S&7P[Pz/9w?[]{; x\snHl|)u NQӚY_ޘT>J%>~?t7dwf|XNjr7U)wt6<3p*g>Lęp˙~WAݿS7 ?.\.-ScSq>pUR?,wI*/o?_<9D&>CMNmfx,p4ZʮqZQAhmߜw 1r.9f~hp  K:a &/~=b| _2tٺԘv8|dv)y'p} l6p߱G8oX4L!.4ds,&Fs.{^Oλ2/ݘ0cF2s!_WTlkw=M,SwN,>Ü-@wH⢡k<&.u|L@FA!>o&9,wfq1n DJ@fQExD#џy-yY6^! Eu^i"Ąr`FqF+wwr ٙk ޞFU߄QYv N@IlgKlI>XVVK"7WPJ~? oս?^b r~'~>u,::>~O1_){l^6Jn淮(D:zF2μwM<ɿ`nyqztg#B'à 7OvC?Kp>'ͽ?|sK/I a q'rϘk7L[N2eẂ=!mHG զZaC/=k-v2_߅,,0]=Y:֝vi9SƯ斀/a@Kȸ n,a*@䗆]gMiRz7 .pLA3aSfDX>j{Z o( RuY ˫a8 OnO:u{]=:uZCy߳/q@U#i:a( ;,V{(ӵ{^iy!g'%6/ ƍmȉqAe뼔G]PWz @(CLp$|hh}n۹o|rHύu3~'lcqw?ڽ$JO][.aӼKW+%JzO-=;ts*Xڨ'~W7?A.P͕U*?rH $gbx\`3 gre$ dÒlկظlp `62SIed4o63.݉l)k_xADoPC!Nh&/.MsRo팡Ʈ2!XI>Nn96^ -u/h{&Qc ~}}~P (uxӏGovqЀiovwm}of!Tݡo;t/7wDmگlOQWV/{S ^T.I IpS$rGuϳ~rViou}/E>ݐ~h_ +h^?3zR,M/חK)!' _-K>AkGy37>'c=@ -6ħQoԧd"MN>D 8Bw)o!eS`F, @b}tpgƙ'4'oo59fAoiqv g\.f\^T{n CTT 8/ޣ)i̟B(=4y߲_M6+dUn2) )̌|{q pkӝI:$} hBCxEl*-vAFD]~<<7q]^D ]~| lalRO%# yI3| d}*S}YN'??zx`E@nPJI jHTE)|ԖgՅ?E58v ;gNᙛtF j`"OiW}G`FN='h,v%UC} YDeM֝7q)?/I`[ُo'b;ܴ`tKvS9ȵ8$@WR6zނWIZ<ŞսQU. <%{T kKc}q38>>BUY +de 2@VY +de gY! nytaj(ӕ P`+5e}ÚzdV}>'G[z;e #.}:1&GxdO&D=pLmyF.+4^%a';X6ԅռ٣񆢸[VkQق/ƵŎ yܬ穜6.<\iutwn8X3=[r `d Y TE-8Q,N/3?Nsӟ]̾ y$:'#{DžE>UbՈ ڑidloWp/ƕ1"h(۰TDn\q2;qW נpWQܶR(ڔ! )NEprrelcX eWX׿tŝzc?z \L¯rKWɿM8%N3w׌VT6~{MĖK8 Y c.{PWU5dݪ~S>Le0?K;Q^ep;.ކV)^"AfxO^=A.e$X,ϺЯkY80A 8WO>b +)Oj"8MR'kÔfyt͆k wN@S2KlěETkEGU\_[GY\v!ܭ맸P p~~E %M t`fH.Xy$W}r)cX#5 0!8 Nf !p#( #J?zYW6G(FpB %"|,x+#wrv 67\iwּBCg@|rՆ6/(M 17-8tbFgh0^u}[uF5rG4p@ 9%2͸8"JzU4"=\,!/GBBZ +I`r0qmЩZB)B !AjxVՔ2ML:qM*.+rCV p=)^Eh7/\`27Bq}pv{{g_GBz&oʬCWhXtKCbeOv iTI>)w?hu%ϼoc\$[;[.qJ_O?yk| w~\:5NF7͝}&QliY?OoƘKgMrs¡_g;*k-c\Ȝ80⳾LDdr̚X2JHB=)v@v#$z{ IM2 OtKMnÿqL枭$Fҳ5ǀW;0),BRĻsrEﮣ+`'a:$bd2uMDËcaԁOɫv׍ qQeRx:o-3X7㨅нgt Χb@6ww.!_wS69ywK;_x/ŸcmNx^~~Z$Kt?v.i{Lzzzq3wvo_O~+ue3{v>_@c v;.ܽ'G'60P?8~eP3W7MgJuz{Kk#-!\!FínSctn_d^PC8AUMyLgܶJ,:Ctz5}( _Lu]BqqPM$Oa)br߱rM?4 U`i~F5gag~vH[o|Uh;JS5yRͭϽ۫wYD>DYNs2* ѓ %m88>u([nO- 5aZUTZs C[M}AFN #J^o5&:}Vè JU׃DXvD LzA/r3jf塷Djwe9ѵuCDh11ѻ6'@ޛe ʂ; L{ Wbca-: IdnH%%2>4g)dXSlEH*2kM3TJٜVI!EBOWp@^qkIii8QKe)Bj@&YFHo8g /_t6=iD^L: qRUu<Ͱqf*nxμ8{C*K8n~X@dN˸N5G J/Ϲ֓iiRy|y6M?c'Op *w&?콙ާ3eG>]2]勊@ì(郦H NBEsTO2bgob5//XuZRf^yp՟X<0Y֗GxN^j±bӬ4:.HM mݍ={N0o`_MX^|f5ί2r u/ۻy+;ۃ1: m0T@,w$u;nem#[o!-l%+,H%0޳gh%e^z^NZ!:֚8~< 0Z}"~Z ;/-ĿwOq&?вBr Q$^^xIܜÃTzl. q-l`W.Ů„]YxvDJ&QsPݷC vqTCP9/&i0uw@hB{!DE 9{zZ(Ȁ\6PAx~אjVլ Q֯-!Ud{q2lʍm5hG,dyo5:axڝՃ>%A`g o]&r{#>"VϸhgBR'/:.;V \`zZ~qG<3#nw\M74o>gV Lq ĦdTpH|ղ+Vhh$1=AuDkב,*%)!2YW>?]ૣ΃f~>w4qȹq"væbQsW4e5NX'_^kڳ*fZ'Mu6&O]]}_%ו9_s/r۾qYEHΆJޞq)- ohPhEv\'$&UVFe`9[ ,/VKmܽdn6qG1 ^-qzdGdͦ9-ys&!xs5iz Q,60^՚h,,}޸T`Ϸ.goo(ts6\9??/@D;ިj ѻBr*:oY^Ba-u)L.в߂YzPUiAKPoK O-FgnYGvAKh1+=%0ALp݈36 f@z=]dss7itc}xhkmh`1?/`~}}>w18Ƌʉm͗dz/@Dx |P/\Ji*#GvkM%贗fGc `;h2TNkխr:+=z4(<*\>@*ζKֲ l栬FڠгL#LDD-aRʭ*H-gAIgf%Ȋ1r<fM",&%@ڞ|#>81k3~S \ QbZzye/hȍI UtL ]c @ ndČVI%u~aTـ,]Ԙb޲ȶtQ(}bbɂ<_vEc۲oc,Q%ǿn` xgEܘ6Nsv~~?NIG܅%C5-nzr =m7 _ZH(4*hr:2R}{p,~%XVEw6躬*Vi19x[{ Nt+>eaZqj+ yn#׉ I"P GXQq^+QP+PT_~2AP*u?nE ҾWQ=r1i *m@Kɚz[ ] O0t,ⵕj= qcW[n 4{bO $l>1KB")X3:%35؎b1`ۑe(2@k2js :waG }Xгycd08IkDQ-^/OI[%i3s~aF7x,=oyKDW`3FjXk xMi%X0JaFj`X+Q\sa*[zH$6+ =nW[>.p8IY^I`)JꆍH_[i*ԫeƜ3<,xgXVvq} qJ; 9,G%zMVT` F?GŒq͒{:oۭ{H@$a:j"ʙ_oXؾnzh]M3lY-_4͞z(U 88 h~|i5R(5R*ԱjU$c?WQ՛)4[>~ӎ^At5h&LCZ$E -|[$prQ"j_t^s^4?39m?֘s2FFc z"ֹ7}م\J㬃QtQl3aKa&eUۆԗ0$!RP?ըޚ#K S/6Κ$bPԣbS4;(XWI1. g_UD>!V&B*<1XuZeatx;riLHX\R*M$~!laDgDh{$# բTa&\<STo;%f>$*f4)Ef4SQrƫX@_:&H:!O-RZkcLFvMŴN,ήV}lBV+ a`0BX! V+ a`0BGBPw`n¼w_0k+zk!,Ym ŒJI'RaᭅU% t~3Pw7-YPOOlsҩTg #XBBBϼ["T:+z M b#xJ~GV}/}@oȰ; neX[f6VP w^kwek )x4*v#HF|;$(Q WL"ևfk_[39APp{JKvKS z=?p؋K:s8#jrH1!7ؚ+ii{Nshq%"=bWst-苾sI F~Wb{A }!m䐄XTM;*r0BEܩqaB5΀HVP?KÌ Ġ41] +Dmҭ#"!}[RN/yiZ:.X{F3y1^CZ^bXKY7?lKòx5LZ3|lǭ3\dw.HYK )F˔}mp2M j#?͠'2wgY T=҈auS0J`:hIB|'AnˏOUw=wjM?rE=}RmmdMDMB˷x{J*9~J99Heƾď6{ɽN-F!R@*"CaM*in:mx5/p`p}Hwd76rԗ)/;Je:"8j , rA!wPza' `Q9n+6cZZ oWLj`x-=%;i,XnWWӖyIs8BuZt$n@w8~ڳަ篬p;ޝm+F|8D1.*t.nǿ89zM Mt i%\I$=_ t:{Nu- -Iz@%)&+F"taY{!7PiY)Ɏzo[|ieђHt~jn3p0J8$_zC¾+ii؇~@?g<Ւ\yе'* 9hFԚׂ;,基_u8t{ΐQCl4ӌy :P`q6Bd?aH%b_KJIEr{+FAs{ӭ Oݺt}Lp{3JΈN"1..u/IE*1#c䟏Sk (/XO$ :> iR/Ոz?/Z#1#MAТL݃O{Il:MH,1o TEx"[fbf禮e?|onj{_a$<“Hۘjn>C/[-" zf,%qM{U`_{43KEU}D~xd0ŸteoD,sH 4-a|_+xBICX΄s ~v[_#;tL}w䤈یrAV YTppF76:A f29^G;p~ʁw7g6ѻ[wĺFa8ES>gLY;v;.G$!qT.rizDP>&I!яY~O}; ŏw@?\v,BYh^yD:wYJ2դ >ؿ^6o[rA%6c $2D@"Hd $2DyHN<)<9W7 o%UkVܶWi0k79iHGopwhb$=]3A\fDe"k~i_gi]ze `gf # d}z}CQxOm\ܙf; vv%2v:Q24|En|zUeb.ϐrenzM:#y}3糏fN>`=p h1=C-f- fi2i!/:q36QLI暏Ϭx"L(xMVj#by UP봅\&dx 1b^2QMע XApFE+WD5"jv_g"@hz# m`.!NPp[h&U#hAB_"o=9鷾!b'ޞzpQ漍tw[g4Gj"~/6fc $@¸- #8&D{ Џ=F;5_i`?$[Pco!Mw(^g=wK g7dB`k2F:-7i|v>7 {67n&סG cs Wak`7;s}_uI^Y{, XPD5fõ>?齽lñ ?5oO{.+-8>Q9s';s]>ꡛo?7Sᴻ_ YCP /kxK(D8Ⴠ ZLl^w2X׽pXEA":_AgÙb"~ߺ ,2}{#$hBI@^zclwC ;W݆,ٸNΠa d=U|_Z^W$^[46ZtfR$ȇnAl %%^.09S&j&N ZyԵ4ySm߅ h3 =?uc$jLytmO(vHw'ݯ3D8z'C"MFckxI&c) >NlPVq֢qPE Hklbr,Өfn bI禿$:HdM_x؏7M:7_P3<}` 1ZG'§SFr49O5/NwM_TrCXj] ڊaճrw[\M+}?cnY\y:/}G3'#?yG?pA"2!຅!{wR9LА%U<H; ̈́rkCT̛=μ7v'MmAoj\%XJ/kcO;0ȩNrG|e7?6(>DthM`ꋻx}O=X,(|hNߡخQOn/g-QK^}ǖ`Z\n!f=@|[yҶ,_fʵgՖ(zq&EJDÆ=.(5ʓ2|0DpFٷkIMhy˾h ّ^2?MeI%Vo)E,޳Ũ 1$镕TH!7LFb@ 1 b@ EEp; /QW~u/!X= 1}?+\ާ^TIy6{ ؁(ǾM7/6ݰ݃7wf"J4}{%uM<jAGކG?,J(ufǍ i5Rbi%~ܡᑖʠIz\uQ?7)m-wx,ϣU82 ^R>8Js~/8͕jo*-[+Ix~O*E{F#~0:&NC}kKo'MOo% 3K;h3+6%ͯ?jyMy1PeR e`nX@x^VKA+l2/d?Պ_36_g߅E ϶}hub6hS˄9e7d&^P3wsQhӷuQ^+oV2»"[Az g0vL,9}YEP"o6o!n(8^[x|MߪT'z%4VZ;P66B@Hi!m B?>d29f57taiu17LW5DտA⤊'zkٖP$_l*yMx4gR#7%Qo D@Qob祽P8 {ķwpQXdyhA0cX|bpe/c\/,~6x!x.Q< Sjk& ʀg4aTKc,0<)}{ub;ZN`D愂Q>p b8>;+yB^X]LatsÙTza)a%9c|Nb%1&‡=W#7ih|u@)<;#!7rn3w!-)^aZXE*]"F:::eY0to&,g3G-Tū)=e39jdgD,ppl`YS$k%Ȏ!By$SB񊀎;%4І<1,|lT 2F'@ \rq!+ XEKpQDՎ-ZrJ[3YHq * (߾^.7^g`D97hb0e|?4 b.8VA?9&`|W jLkSxvbNԫ 4xWb5yF# AmD >SÃЭs7-)/(,Q=ˣ^xj*/ vQvX DF=.,6FB/L&X'6Cp7V`kM1ҽGキǃ(v ՊGz ú}{FJ(BN}}{4aóϦ txٝ&̏FzaaQ^}P~wdIg^r޸|iG$uǢ1OrL, |5(U~Zx) `8f*An#bXg ~Ft5ngd~|Cebpۻ!a8qW;onMQ`  #8] ]P܋q+X!^^\ @Xt\}?Tk̭ ڰ'"QPi$sI(.V9iI.*a0:z(- OB:J`2޵a/F=%#N8!*R77{T@| >t~>hw=,0 ЦGi49ɍKJX j*$q|\<"'~n) KWd1Ftˈ=ty"6p=pY -WZ/ 䣰IJ[?0/%I'),U@U6{ ōkH/^l]xP\ ȡ0y"W(ʤR[jJQVy/,pi  c#w.ѩ</ 'wiG>jc3k~D taVkWI$;;Y]yǂU"L 7ʖB/hvsF6ZqTkg/]A+T5X2*@007FOèCwaS]aYGN$+n*v1'I 4SS gamts2K@BZ0C> ,=~"Z|&awr:JHzGQkM0"ޢ=*t% V``N#Պ ,xqx"vl}3VWV 4Ԃ?Ϟ|ޗ \qj&ޙdT:"jkDig4%ae'qXa㣞)2_wϱ)Y_QpRkIz .G<])V~Xy9#SBى5Z\728Jt /H[,&r Mu!ò]ҋU%hlxD ietډ@Y;HQb ~ůc5%:X&o>m}so}ͷ}sovP ǜFmݡ}N&CrLS!z~wWY"65zfä)0'q!g5ͨ&o\j1h^d8H4j◌zqȿ8oh(2@,ƓoLHN a4"k2 e6O/:xNo IC*jmxQ݁3]YXOnXHP`āiԒ"5+"4s{M.^~y~6M=7M}sMH̀jnӸ)Agŵ+|}=AH ij }_{43K:g~>sEVgNtiBeoD,n6jm7mxaqC`@Txf N}a{͝G`Ko;4Q9y4[VP,0bҝY 8::1^S/yxMvE/1t"8ZrW郮?~?ՋwZ$BtpzU4ŸeaӼznjlZ<ȕJr9xdתPnƠea=j⦆1O05nQȍfikظlp`M4s.9!23.ѹȗB~s?Bm'&"Jw)Fw(/T+PGk*⹽JTk<">(Ƞ lK?_$ckjzl>6`zD@ FX@wOH &$62wA `(E"ETGJi% a3!K&1ad[S?)z̶cD zknuIiH ^rI'q$4v^YF$t$GeN΍=߁8d 3BI3\&¼H|FGq+@5ڄYPOٗaVbt/X}zx؇/NrԋQLu0#^} T5t(^`>~ LKFtyD') <@x''_-q' ~7ѝ'ku9Ar¥78y [؋Syp8B_i›br=RT1ъm%G vFGB$^PF$)`b4`!1YxzA7(](n!H:oN<-ٽV;xRB7,4~똟MADZbLa elb{wyֳQC :O]SN"kz } 8-/en-Ʊu)=?L2R7j rvD,wGtܶ Zrn0<*,rPlGV׽P^XR}pA}nG^L`A˃? Q(4= #!%J1m)WdHɄOPv' =KO J &qOb0lN?B^N8`:,b|L UexkyZX4Q>jff[9om՘\^} " eX oZ17 İ%oO#Rg֟ٺyN47%5X9<>T7?pm4>Hn1*&ƈ36;Gs8kkXuxqb-ΚXb֨5=I#$H$#86q.W^0a3.]]=1^3feUf~iQ)(]CdCi+KcwqJ8 ;M˟0lW`FVZg'8c:E]N& l"_YFVf`^_C]E+):߷^X{siB{c7rw3n4Y,z,S;j@ڜ @zKf-$: y(d-x< z2.g]ŸϦ$M=Y)s*5F<)&%(MǖQk˫ [k !<0`־&1cg㯵#kg}/F_l_\;~ oszйoƞ73obMO ZEmé[kcLkgP kGFdЎ1h vW>3cxCK_9) $LWV5QCz>vz?r9(d~nC(Yv\ا9˰ 8UJtBRx$[~{h0c"826SwrKn&ÚMK tƂDx:dDcc]տ:i?s$1 T`_զHe9kѧd?÷0԰K?^_qXh 6"۶v\awl|k{&c*|/6uԂz|tS@}Y! ?  Z sYQrdGzTvfIXxH L8>{>YSdz=p k},82IʎY'-?rhP-8(c !hn@)1%/)I_ LFߋCHͲ= FS <N:8@ Aݨzk t8M ON H6 պJ `O47i0;K$iN^5٩B2+Ζ=ޅdk1l߰zܟjloPÿg/ -dŪU۰g7(m?nG;3PP0 ͚&FAY`kh!m5Zu!PL,\W4kB[HIHOPo LW>:ܙxϑ:ܻ .4s33Vzw K_BU8/#MKQa(g071 ZPԾgѝA./ LV<:ņvCX{+&!pȣ{_- b[wg4C.ɞ륩C^-}vʳ$ޱ1lƽg&~tU I]ۿtWóY>K;|ptVaխ\92=]Ym-]xghqE헸'ȆIe#7n!_ZȗG(;x`^bZPl ab 0&A&2mI<+ߣl*!z(ಒ1 ,Uk@;5 )H6ܱ܇>>L?n?Z3~n?t~v :m>t܇ +vZ܇ 0:BxXw)]XtJbJ[W,=Sx9x*]A(vj  "Oۘ'btln{#Vy/n+=>5ӆׁ)%)ng U’ ^rcf;5~-y@|i/8E'GZL Ar[{>@=>*Ε]Aբ-Tz[g5tw϶ N%?;;Ӟ:t8 guvp0MG3&u:{A3Zbť\)eռ$OVk^ {` >jBvxWKZw3C=Zn 粐9Bc$, F#ya监F/ .L G K~Y$[9BG)wR4|!'<Ty{ >X%(;rϴU\߇f[{yc$[-V HNLN5%o{) ŗql ̙9@(eXbsFo!Rig$Q[rT9J"J /RR.R%jZ;DGH0_eאIl-6Z$_2I528Ҧ=HH:'w% &ۏv($>şp2-Y;;p-t A8h losg%\&ӭ`SBS ~?N? L^=E"LPg) dLrg4ywyⲊͩ澟&ռ9m OhfuĘ)X2tf;lXqv{8/TCN$0Gdú^0K~!gFPIV K/J!Ԭe$ߞ)B?wxr>ƏM_#@_6Ah?,#z%H*y2<,iqlwJc"E'`XO8wQ yX+HLK|2B DֆP.S0|+ B\]% ( D.XT{+m#j3"үbƯ)8L?{:dNQlԖjfFa/1KJ-A):L\&2e%Ej Ô~$p: ܗKO).nQTS 6aDt;Ȼ[Y(f7a|= z QZ:B$e؞u3 ݊MOBH!B}Jr* AYB'|(6-)UJa18A[ EJsˮLy%SE| ;A0vB=˩_!v?oPjiZIuU$>.Ɖ/J&*I OQ11Uuq4&4cg4zόdEHBHa,UA$A1ElNmΛmiZjiZ7GC _z ) zjI/ }|OMjaP=<03~I ZY-)z触02E*MwyL5+^-E5o)W5zf7^Nv$59j.n5'2esUTM{<0$dgk_Tq2ޡ_6%DbgHP'H] U(T@惝LS0HPFʞ58iqvT<"%NBt/ʑ%P*rtp.>P(RkC[hCJJ'K1Βn0U!{H[ݣ]ʼL/Wvc | 2]IwhZqQѿˍ12L>82GrOLoIcP䤦d />U[QnFD&`#Eh,N*<~\{d3otINB=&F+F_hsD=1$2jI:X%lVDRI]R =140t*L`•BFI'P,kRѨր/ȷ :qSi8'D;mLS# mSMZpb.'!]vkn9SXv\WSsvq'tN9D6suC\|=R`Y5FFt ].n{v W@esre EkYbuݾ ёu yB*lȆ}HxS*%4w',ƣFd|jbujtކf% >|怃EBC%3ҫ4L1t$¿Aˇ=H& f?D%wϯyHSM}k#r73dD9yaޖfl Pt + ~ɱQ'?6CƉ)G.>"-4'7ڪ)&`V-+41YLg[c)yT q)~QxUΝ3u>UU,LhG33:|JRIzgĢKh ʘTX?|Mt 7cD#k) b`#OxɠQwIq&MxbSLbO4\AbՋp-em]OuXl xv`i"[Qi-u E tLΤ'P*HHiXh8I'p->Okd_(/Mr{֗i7 w(:1rȣt6gə9hI-%=bD( 5@MwjktVǢs񖿩jƈ@#ʻ Q!xw/qLq3? ϡXD wG\{ׅIMn{1Gb.hzx3qA(iS$jQ-^W $qKTkʔK Qȟ] Mj"''hJ@ ª 飹,l79VyS]dYH.@P*jAQ~]R)6|Ŭ_VE9?=[>qdܒ {'ð=rdmZ}%&{rqLa^|GOC$V&aśY.fdq J}c@EY{ '55WL|P.I%R2wn- m(glCkLyH tP,W!b1`Af/L[{x~pop~sy =^]Ⱦcd n&AGsOmD%c?q0IwuttBiRPSb00ѶWkW~=LW:GEub%ܩE,  ?w$ucBԏ8g58E@$ʿI)pEcL+1q32=eTlÓ[4NcB֕%A@ <.!2bʀct{J/G~z7+\3 Ky;0N0k"l'!b1?TehP:: I*!0oOqDLTӆYi|ljL}emqɚxQ;y>glzf78n 6h'^uZwDIYԝ%TiU")ɤbffUB%PUʬ/3+sϮ/:|hub\ų'05{%ۊ C\5P=PĂf@=\GF׈v<l߂W+[n`>іު֏1pg*f1EhX՝/x9GkR2UmӠQi!g nU'ANL"OC[c@dfչ5OpcmM[aVش6mM[aVش6mM[aVش6m ^iz|]}tu4 K"@ D{`oJs盨U7jYsӠ4"8㿶0<'][Vw?'QٰTc^S lB\`RT?11^_}IOJa҉ IJ%Y׊/v? (ƠXI cne1nUtsdtƗ/FU wvkADc]d(vN _p]WPGi:|}b@eQd!θ@scZl(CuׇZU}u @| tOcK&R1njcf &;{)4JN53tzy8X}wv`#ﰙDZ]#9D>HFAxIB`l vc[t_>$LͬS5<6a2hL0Hv!Yh3Qud{ b>2ɵ{YgV{~o!aX]1 [IJV[){&7f{%Uv嘴]adU: :lXtrS+9[)Y` K؎?} /B2I YENjq(M?ULL0x\GӰv-0^X܌?_%2#pcPN:28!E4E(q4PT*Q ڡ5 H*T'2%@đk$ S,Pc:R ]_c^b@=A|uضvZ]^y62Iuژ*ǢSm-}ɂ%+~dLv;(;ao{~Lp\ǔM8U([~>L0+7 Fی*rXc+I wWw_|69lr+3BZDߒg6,TFZ d%32Q|F8=?[A.Op~=9#4oAEwOwZMd͹&f^d8316>>f{w戵12͑cl=4svؖzx52Dr-R: nw-Yw^؅*H SM5FkCK} h\Z Icò}Y_սޔKYZQ ju2\Re(9Ђ[=Fˠ{;57ZC8 ?0tt9gPa SvSC<3AodwS94=GvtU*N(RH.Ź\iaUNcWqMI+Vox)rvS+7]Gmװ~WRaIq'!nQmI[& l$B۠ ͠E{ݚEѢ('q@b۹4 , fk T~' LRЛ0H>IYaڨ)XBj$qZǑ@$ǪA9(ƽ0( =HzLNK LZw a)8lޘ>:7U@>D҄SuMIAjZ4|YGR+KF 2; ox2{gW@}2{dwgF];ru<) Ugm`)\ť</mrf`Dv٣-Qҭkgģ_VIo[UڽV}٤m%ۆճ8IՊV_EAXWj^V(O[IV?ۓ6UOwYJ@ҹ<7K-rT`!GW" ǣ.(=%e^2#|GpR%U2dU Sb0tST/qWR'%)Sp~?D[xY<q▮2}׮U`7?4=-3badN>5 G5ΙΚ4wڕ~XӇdݍ9V 0S3 F-ęK_@?~vT̿H-2`!(:EσgUO#LG]vݨf{[vwGN,n5(F]wد(Rt [n[-\6|"8!N|SDIWB/JHC D6ߧXԲ(Pj6Loo֠;'?&Ax _o]Lan).$N.`70M1u`,r$75 .x,H,R" 9TQļR&OV":%\b*4ؔ''IM@u|rԱh.^ ;JvuH?DE?Ja{&> Qw95dXnfBvhRC|ӧpvB+dتeJĘU3tM3JHW3_BX 2J3cX06͇f, fӜű*yxS/˴96ͽf&lƻiý&윭gxވMoFم|P#vovGb_U]8 NyxW>k7LQM&G- ҩ ]g]^͉ RvB wUoV]/&㠏!xv"V\ rݮK~Pv]㝪7`5 j~iwb++߿ {EzBX?)Hu5![5!^B+l-NhD!ܯ6y:.Hwrbo>xozh!zh!z/ihjן<bc>x> ۡ*'TEÛ _n[cNiZڴHl7(ymh׆vmhsA vdK*93o%]֋3?ޜQd Yk~Gb` ]ys444HT(-vr:_2d.a9q{LEɒ"'*?SYuq9aļlY;;!o2J!^LPsbϦ$FN &02kO.65M$3ήL9%* čkU D+㢕ަ+,c& }637pfnZ̈ܰV,H7C#voe]4c[#8?w4C~êi@-,ml0>'♏p*OLTu#d,aȭT=P*?+MS hP7r@Ee}X-QQ3_)\1s ^8naBPwȅo;;>H(wMQ) ڜ1= %x4xl"U=!"Yi;]Fš=[8aM~K$׈#$בmϮb҄w)s_:!*];Cb])כֿ]^;la^KG)ȀH w|%C?Yqƭgxw'#e{E5~X#H};_.In|?d P!*Pj=HA2VlIr0NdH׀F\]J!İ4n&B>JkLJiz|H?"MXjoIMLUMAs=?3FN2vV<xl AOh L儥 u7AǯNؑ4ria Ԣ-hC><_nL Q{}Ի IZۈeW)[ꓯv8L?1T:= _RI"U+hejSg>2-G)AsnTS!Ԁ0O}EGӥ-5oqN>uc2&9w'~qƗ@>h7E1U i}^KqDlި Ǧג^0 L}zŞ̀$4ɊwtMB%s? )id %G`}—j:'ߙmxFES˻@^6Wd1m;O3ŢgFXzgO#Mcߥ0O^蚲xl4O[a =FK,A*,xs| ɫT{0+[pvUPBJI( .D"}9DI5id܇l@rVFUNTLpZ{?9JY8E`JF^E읜/H%kcp:sS7JR]Y2<%/evդxu'cn蚉\bKVzjK9ps^۸5[ PS3ֳglxu \vRd3{#7X[<(qnL\V~s;, EbJSD#$8ѳĊ%'+Ye;_(h`}e3ξN.ǔeLn'Ֆvj-S:@*|HҬFON/[TمYb/ձl!8g]ZSMHk$W,FqrQ-BauC|T)ag7)efIV`P-`mZZ-%cnCeU:u"i'W'%%ܥY)9]5蔤_w쎪bID*♏/)<։h (4#0'`rD"T>h W󤶉r`将UuS"eKt2HlH҉[\.¹R唕~qmHy a%9I$P/N?~1/PEBa+X8H(&O&YD3tc=1II0qDۡe!6J`tpUOQSf>dIM]VP466ۚ)$H.]޳tM@-dƅ6Zԭ(zxVU /!حCM[JPǻk~>7@)+0ex {<" ڎH@cڤJb_ᄖ[e~]1X3LOavu*VEv;|BnPsK=Nq+T5Q= dg%2K ڼG ~aX:˜kVu,1%Va4\],1ukm7N߆$\:%́Ɖ^;tBz\7vThhahp"٣DJj|']+b#evb4vY̓tdB9r1"d'5hAIỡ'A7jZ(A;jawAwVˆ j1rHSSkMnwR &T݇c 'x}pF=f1Ǹ= x+i!Y-R`'!J_>KB\^aו\?gtyKC*Ydګs=(`n8v݆˪ 7[N7x xå >-zj 4nWt|A@c{aZ8*aMzz^Yǫ4&FGɑ!O ՚E6<ŵ%HO '&ϲ=؇ @a!/F-ǀQ,lc*ak0[8;xX4Up>gkD \Qd}&W"m>m1WS~@M>Xy#"j8{Zc EX Yoc,[--)ѡ@c 3ef+;#6abzZĸ7nF شj酷o&Ϥ gS PDXxEuȖ4qڪ`%`duuvkgÌp^J%V٦h.@L-z)l=W _%uUawoWo>2xGLOy޽2WY^veГ+#+C#sډk'AkS ϯ ~2xreK{fer&\+hYWx~ _<2O'.lpu``^idg*ɔcp=K.RCTxΊS%{8._k"Vq$1GCԇc GG'BEd>sn+~cspe'87Bק8CPsꄨ%Z#2$^`C9XāO)qc_r6uĉG4 %͟-PAB\+O B3 Lcݣd:+"h=刵16qv|E8wxc삵sc#/n8qzp+ czgY{ya13fクUÙ[7nڸ0Ɵ}Y&׏N*~>]ڍ›N_̋SDRF R'vK CW ]CP}1z@V8VtAu)RJh23OI/@*`%TAEwtPU ]@(1 9k\$C"zM 3X8NڇLH&DM6$MZ0qa+O &LKx&F[f +)Ci:}&NZ}j:6[-u QP[P?QkǓAWGZۣ3=/z>Wd~|u~|s§})`p1zXO/}bP7T( PmQ9`Z]A YGZه+Zܭ  kL=R}%hWdTkL'.iiFꏹ РV1۠XG"V "6foq= _ IG_1#u+߱a9OON:A<_I&g&6"UAl`WwLBw 5&6Іjaa5F `ò|mh-,Ï{6uIz/\އrwi08.֠ H0 z.Oį Uọ/58>GWjp]VA[HI^ mևD5hׁ{Z'/2 7vD{/Ån%xxo'}뽾UfE*ro0i`SGEs`Y0y3B>IWtSG)%%.)qB_, /cZ֮a/B"7]0˪E3ϜpOMSwOjOcnrnN]}2;dҳOf<^~zlɽ޹d~wޓOwE:wou[(|6Ǟ=8z*:z٭`^۹:ك]%ԋgW]2+];zysyzvwc_w,<+/WHڞg&wc݁ÎܸcMmҧZrwQO-<C{W&>A{OY} :vq?yNZ̼[̿VQzoS.H"qG%mF~-ߪ qhêaj{XiV)grK&+ZT"ĵ֣x< }ܣJ2orT/?g ^QԘ#`cGu5 41gF7-Ϯ t}n,vR)O , pc`{?otcZ0NvV!'RRܵ[M'>kCK ;pӧ3vzz dҮW p̖>]-SKS}`b0»b) e{i42q:*zQE_ j(l8Ej\]`a7ʋ`ewjګ#|!/pN,N1ϷNq.qA͡'>1%r?C4CXk:M=I 숭й]+tE]wXN<>~+CcD=]_;_~!w۽z {Ý?Mn`݀:mP̮Gx{oh-۪GX]?y,c49_4Sr~mő1kƅ]l˔aѸ%d \蠝ײ iF­<5zۼJaܸdיYi-eT~euiY%8#%sqB]ziw|Hg FbljL$4Y=};D#pbJ^k;puĚi@"&Ɣ!=8E.MwEg? {6cS'֛!X15@3t16.Hѿ ː zO;J!Y$In *~߮q![wi;i FPKҴxsz:n2B؜$nD[Z65 ufYA.>v9up5YPdg VOc=6}̬do0R=qknЏuf&^< dXxk)$*oV!OZP05fSO "+37tB+@t0 rņjxYLa3 tcOLO:RtV~m[Z֦CW+vF)[g AjAҿi];iR:)1x)&R;nL#>N/lu1"/RٱZmŊ)/ҘUDsqUD h|tЯ@~m]O450l|M._Y%3pSͣo_:O..yN { `ؤ>_9s忼`]MWXj1q:!U}Z''OJʌ憜,,,O͒{h}*ItTU]/ :#_kN)ttU:թPqxtK潍q}e5nPqMp|eEPY[lڑ7oISIA'H)~ؗB J,gYqsjj&i:Lxm6Ȯή>Gc3o IA-l811p)Ęc*A4Y''B&Q(,S +%fZZ4g 4Thާ*rP҈ t5f%vj FMiFM%fNᘭ{)+&ujyvlW/wO)C|,VkwK=x܎+u=* FL4IJԋ9=DĄ6u(t{/4n7_aeHP^Z-#~Q mc1VcKWqf)1}a/I{=mzcX$zi)#VJDR ɱ1&B ȵfۋNdayeA7c0Iq㾨 W@cRGYO^lu;ENjG6 ^tzj5X\>zxRxR#O Q\xL@ 5R S6 uE1&XV$w67hqH 2K5 VABE <3\]Ɗ%;BbB8Je,wtPtR@]6!.ZΉCO{1@x~vës?~QɾWeJ]\fw{g/Ԛq?}d$@@IDv #ɖNfVUwUw0Ǎ3xT]ʬeee XMb]VC$@}19Ȳ5Qdx/^,3`I˳{P֩SV5 ,թ9u%XE&H\EU,bt|ToVj&>}cVC ї:oASѠ”\:RKhJR61?ndvX&n&*oz^)H(GPAW_]V*| {Kܠhѝ Iqӛ~΀jc8Oq~f>g f/Gy҈c <+$s 4|r n(R{{@J[jFZ ّ[yK栏.= L4GSWV"-ڟDOܱ_L`@Ov&DaMC_d~6ThÔ=Y8޵LJZRpz'1)$&ݨUI,=cd\˸% ؋V7`/J6g%4,W-p󫔀`Urh;oogX5<ȝ5~?oRfM>1lE)(# }++pLd$%-x:FOn%L[>EٺdS+O5&"&8cwԥeBE2ulL1BE GEi;]/&nn_}xzb c!5;xkbQ d;d;Ƙ!66eHٻ̡~gģk?K0t5Yx-gVvhq[ f^+_ytyt  ohFW5_ '8rG٘DL"oS: O(/i-'lrNlՋD8jD 0.70M#L440M#L440M#L440aT]"m.o X.VCP)Q/V-7[ v߽Ra݁Z G#zlPIsY*?O 4S4M3ŏkOe+şEfFBzlX*alkFa7~bqLw_VG 4%)cFC~݃$Ζ.&QIc՚~ I2QTt1[\$pZ߯|ϵ`TA[8sbD1E5C4fQ-/M"b&nb&4%Ojgd,!1_I!>$CM A(ʗ`=_jy޸{=6RZ(ugFWռeza`:g:ݒ|zF4R] :c]nSrގ|1%P V35!${TU_U?v ŘޛH_RyvǗi;|tyn%]6S 80 0_p<1#&F"q@}{ˈĒPnXpz_7Vaَ=vi`k0NÒEB \OAZlPvl_?5F wT܃KKǀ1 01 $}tbÏ :&4(Oowh,Zۼ(/ 6]~fy^+Z(=ktϡQ,&fm+=ًqܟnϊg|D PcWDTb.|x@o#-wn,`av;" c<^Ø؀ *Q!%YD x9P#,[šk ·ʷ,X@y[(H ?v(HyhHd\շMTa$! 5 a6c<3/ƶ PFaw?  Ҁr&KCL̳` )_}5p |?6anu廕zA{ ssV]"(/Dn0ol Fe`m2d~y`kŝCX_"Zdk 8"i106RؚoϯN7p_Qu%PIF&}Dz\o_{gVwgwvO]Kj&G7<ɡBOL;hP䀺vمxv`}#ƅeH[$K('pd ri<)`Q+ sz]`ti|%VeYZ ZsVmRpi^2w@`F'h!B,TQ, ]faqY {2An4̱>6G^5c8EWKA.4zip {Ax|)l]?f›K.+ĢNHnB֋v.pQaf]ϊ-UOn4貝)q&Z{:XؖtX$ D#@{'PϺaBxNGhEd g yAkúb @ hZ~yx<@O.azmQ6V(3Jf:un>:Lme02Nwy:Tk&SI#NUm1/Q))=Jtciʈ.~+vϖO~wzn:ϖW-V~$V]߫㻑7&4dV>ծM2"'t f_!z;!3ł ?Flh3?ZL~TR$jH˔ a> il35(6٢Q\Z5@'yeZg!އID]H#I37$2ָ%5>G+3ă |-5OK?3};=FpN5oC=?rs2z73U̙`dy̙ [_06tQ jLgMl;nĖ꘼X3 |\ĆQ 3gWN<[;PEO:@qHf5R9k4caFcКd+I[kNA2} Vr%%U^f]dxlX5\L*|b@ov %5)W i[FmQ6&ȪޛMykז(iL-z0\*&-ljDR_M,4PS0[8fSro -lt^ۅ(~[7keVA[c[xU_yV_&2YTysa'囪 L$MʋkNOj\K-~ YvW d@ d\ Aw2F 'Tajt2V~&k&Xpb5f(!ln"P ?[%⪐NbFOA;֭? hDL.b,q 5 {DV'PsCa&1  !] FPq'ƌ$#WGo8E'^'oI%s*.e$KփLеa=7IbE<0(o;5JbB\mlj RF5G1 2b(Z|L$ǰ$9'`/M?)*IL!erJRٚ8-*Qc^Vn#[CN I٠/#{jc]C)x\W rZ2Չ4tʪ~E$JCek1jLuMuNuN52nDaF jZ݈\ԣid^SXAFjjz&WDe=}Q^LvI~;QV· ż՚GoBң/м__ DQT nkb6OYk'=B<ت+_;r#o$3 )} mS>PJٍ؊EBkU*/qY Ew?0Ę\nGBˊ;y]r|+1{ĆT{oz1gRS+[S׶FvfNH~c8LqD:*9|s!ϡ 1쵝G}i\ '5'|ՉQ7s׾qc7G(|ADxfq{ъ"x_Nckn|0U'1b^qHleGfF> q>l{nogxX^W˺k9akyQ,? #?8?B#FʳtmA4ǥ:R)e Qy4v+ ڮSO̮ H€&Rm]Dy]5_De2C)a9zF% $qz|Ě} uo&8i}ř^#vbU||zDիc(hu%F<^#Fz+KuIVwk&~#S~@FaO0@y:rOQx5t }xӞR#j[ 8?to{%qv~ # sl!vPъ>NDԭ˼.0j4p`VArd{~*WSM%]n)JUBBR!` ZT&(cE &kj2a)q4+ {'}G]I!ВR+I^N }M W㸡eTmbpB<\eۀ.8@铮WnV߫ /:[]3n6"QVJj3L'k|GD,y6[i2v%.^C/Rp;aC|OUlM\zD `p% 'Zea$ʒ:#i2XѴ AFP!UOV" Cxs1-47PѾ̅ !"#[rC6v&nmNccOkZLDo )WF)s[(n[y=+Ay`|T:!nU n3u\ s 'b|R :]KVB/&fv9Bkb2XyCb;[_|AEϢߞ ,mdc4`ǨC!&Lia܁2~`zÂeEw6z-m: \5BDBPhN䠤Z #*qap<؅:r ZEx FXՉ\Ɖt8Jw3QA-1BeP30!1XvBuk@X/Ft]kL7^ ?Idub25d/st ;=ŏ-v{kRV767nگA*s4|u/akd=]AK "=4[y 49LuF%LS᣸C!"؏%|'>[ Ʒ@&sKΐjppńS4)6B^![|ѳo7G6{7X;tō_@pkt#NKltk2S1 a(vGݐ1f/a0<>txǰ|tng\ gRP(5e܂ YNjFF,@gDa؁]^t9>0LX®-$QYg;BĩzRX|١FJm1ܜiaJl]-϶0 4 t2؉GUIϬ/%-̰X42WZenpq@_ٜ`TJg)ӧS ԃ#ǣ}jpo| ԣʼn }b+ !jOyXf}|>[ A( g@-׆; `ﴄpЋPe֜kix~/{CAvʫyPڡ3L8)YPsV!Z FYjt'Ȳ~4px~0ZV࡝+X9'&~'=W++묣#>a8#}2Fǭ!O-Zc 79~D5>?B};FN3]ix i :z)a^8Р4wEɡN ]ag^O6H+e5Ig,- y[?Abp$ A%ޗD#$ /ΗJӼ|XMҲԠ+-6pl~{-Z>`w螱7|K4}sr;ɽ -Xqxַ;z#==zgoUcK ޡ3CT|tm3/4cLJ.;uG?0&?æ3pk0 {`֠Fc2TYg#iaWCcמOa/`FjAk0nM[|B`n*̶Yhl4Ѵnױ2j&# Zi>,/ ")$^`}2BFb̬PDc̘W}]xr%ڀ9pH&6pb“}A1ptsHdX%Vk,PmV'u=&ϷvѢraWc#EhmNop=29 K~Sr m-Fcx&m>1@~|$*ezG?$Ch_ [E֔SBccaU;زCo g{MhV8%@|xZz4[ٸJE蛀$ԣM>l~NRؚ(׵&`yMu\qɲ5BTY@u-=r$zulIPCZb$\Qh`]T)1m5@{x$$Hd4 UeNtnzA|g)xJyJM?#{tqZ"ǩ/z==YbN4HP7S:4yr9S#耵 ܅ ,3׫c̳ ϭR¯Q>][^HP̘XOUt\=mU䚼 y_Xf*IOǷi=yHeO^$}wo]l&WGGسg+'ǪkPڗϖG+z90g$nѡ/x.ʳ/ MnM:zra9A#;CgX1c#*o:E畹3P~^]92WS[GG&G(Du2l{7mGG8]뛬 W_}rPz648ujr588.P ^8"m]߹r%S_# <y'xa&ob7Q:20`֬~[0l Qi=V :S-FE r^+ۭTϬ[`?@UqO;qD6.Ró'⢈?u7u|lEujx+рh٣UZk\Zee%+9Ktǻ&|K:`tr7cG˻wc[90'=!΂k32yOJ)U RCzU#&&s LGOY#.]+ɞ`{x>[u|P(OoM( wT܃K+0 @{np" sc/\IGw nr0mc3t,/槮'4&XP74;0 dh1,'39+=#5 }̘|Y :x6j?}ڔWEl#߽kcA!{޷<,uQooYia@wIɼFh5C9} O'aE+m5<:G+@cf|lea<*%r6in;0nLh@`c+ is&y +S^>|6̽_S C F9|`[]?fr"i:^t{ s ko|u}9p $!){ьFRXWNW/2~uꡋ;s ;s*1t"'˄I@MSrv=ccN{{/y:}c';}x>zq^w++paweQ\Y~Ey&D؞y=1a{#2%*+"UOZ؄4 Y\0FH,BЫA -,ͭ$wqD6Tݺy9=9xK v9u ^޵eq\fE,*Nܳ'!ˮ${z'cRMeBbC*藳?ΞаTrOxGs 1/MJ%pu|k+jM^LFʻ/ڳxˢˁڳԖ%|[cVAm^w݊We`53vÃ]FPv/B'Lj_+w(Ti|5µ& (.]=$A' _ka:-1呫1yL39v`\uLT8z;3Z 3:K3ѲH?ˁ57 PH@*G8d~X_-YWo=|jW]bYfTܛRR _:N$ ;Ò87S,<`!b7r7GOUL@zB_Ugggߒg\)Hbu csϺIl3CC; 뮵Ⱦ ai{]h8:AӞu:k'X?K.y~CBZR*Ш<(Zp(m,d߄ uڱvpH'B:L5޲Tt= s2CЀ)C*3k'`gswnoލ;n2 -^4m:pXQ\<_S k7o"CZzuՅ4ޚ`k){uh79 xi"~uOc<,3NrnЅŭ`]mĠ斛A{ k+B+0/zG,3fp6]:ɬ]]?, `&eod_8n|T;kCC 6<(j֙s pFOʌ/FJ֏Sx6rƳmN/<"dzq0dz1zqhþD:S 1bxndGA6Y C;Z'/Tp΅;:,pk诀K_.%0hpt&̈́hVC:rK[u 2QUTӕ,qnap.`61 zyPx0(jfUtwGIWʇA;1o{%CGH$7Y>hϹms f ީY)JAsH2uL6L0`BASBfӑkC 0Ӱ i(Q!YHx"|OT4O%O?< ;1R8TVu=>^'8i`Iv{ʠyj!bK9 YM2K"3#EGfvr! _c&{8vp7m)q?:o[ W2Μ%6'~qvFHyOї0lt'N@U<.( ۞W0yљ}Ec۶&QY/CA+pҸ;V8${VtB,*+fHU]_`hj<z zy25DQ+b3Pb(EXEWPXbBpF-dC"/!sOǿ H卹?)JOmJטDcˤ|#ƑQ5w? OHh6t:LN郗x"*(dۓs*''E\H}>GrLiF[^9Ӻח`8CJ~9A?mmki_]!5b ueT:R\,Iw/vk5k:(@ſtxzPElx&>UX^«sji=1gLp{TM &:~L[I!kP1Rl^3FEsZ#3-<89Vixu/d@Vgqߦ/xϦqV/K0U nYN#QuX-gEnֱNih;\!׳o!a"Pټ.R͇)U ʹ﹦VsMfA}p.w x%J$r1Ha0&+XsU<8/*eKtíA|iU-ztaVJ} h@~bp9Pbg,RM) t֯{JtWs:sidr\:0&( <4Im%9]~ f'jx.fg, 13ECx4 !ZEбOSo:2B&MZMJ4{'_|]ɺ}Z s=Sӫ!_29-cmfSىO}>Xtakst"VӅ3I{/l囗#ev,(Ly־SoU+j`%W|A_1/a71Ҙ,6" $'*A6,PL UM_k2Zgճ-Y~9NcӶAtä.E_8h`5|eMe;_L/wkEɏ=V&챪 teQ&lp}jVt[|KWXUK]! {l ։ ʠDuϊ@^x: 4aCN2}/B\lSȱ[GvL1t(/VJ"xqLX%1GFGX̾sQܘQ^̉>q8)j~RmUi*; 7 /evVh]|!-2(tRK+,&g ӗMIɚqn]v&^E?g #6/sj-ݽjUWw-^B~׋ {mGȻQH y`|Mb۸}#KAȷƒAѽRM.w۶mHm@UwSH.:oG8o(bL˾bJJ'z]9]B:*cL[&G0)6t5ؘ&~ԙ7TŽjp\W!$U wj^OyQ:V9 Q͒~Z>"(g@!Z/lДՑVMt*ey1P.kt:wAgf'z*#(PG(i9*̙TU xarqY }+<V(QOkj3r~ uf]=OgFoܱhDP*t&yw]{bEtUq=gK])k'Qߦ9v⇸# ;0bP29=]^?n~s5z~TLLNM+BVfRN?QJeΈ/Tvt<''I#n8ǙgVe)*sHWvP+k"}W)Zn?#?M.lͷ^MQLqEBTd%rqn0g rހXY"}.JG'Jhi;bO*Dͣ5XH+ARu"ԁNJ̹k=8T)埧bqTR@W ]>:n# Șl^f=d}ftiHz_rK|I-,߯Y-L5 Q8|f]9h*RU.se0w<_F{Jh%jbJ,S7t <R3.)aFD?E 7@ FVkU0`gg t9n:D!V1' 7AR?~<? n^$".?aU+4(0#E ;8A!d@lEP Yc(VGXsYQqKu%4ڣt[("3ہAATwAlcPвDjV*zGn@5?? 6uY1wt9fѠ,x32ޢ́-D<47m6u~- _PNl͡N+ە"Wxx;0Yq9?[>7OjVNZh}9BIMFoX^sܙ xVAUl2-yf }kO/j(@S-? _~d{%t:%v*!v0wSZn{SigMiS)>ҘJS9YeψQ_X˺ ӸK+;_ C{~=tC{~=tC{~?t8poFp߿-a`wzrP b^x~6W\,eG<BE$o7w`*Frz|߻myʭcBC*$KxЃ,[*]i'sxQZ]BmKec[ ev ge u3~cjAՃ< C t9"߽bINX.z0ٻ8,ί7Fb;<ڒ#fg&,ٻ/uÓaec dIFzhx BF{̪즅'V㈎"df99䱦+%0lEQ%J[';NR@~QIrPB+u6U.ez6hE`jUȶx3JK6R*cL`C:>2$xl- &FK.!Z![1i(I}X.f1vѧF^ #B}.& K`'.++U<\=Sqyr"vΪpP6R/V,aiCǡFP "Gax|mXk.>_l|y:Ufn ԒzP]e/ wҸ4UwA<>/w^|qP3 h~r p!ʖJ7f[}B?~6vy4IvXqBCלd,v]fWRHaW݋ +f.V9R&n4XdK.Djl'/p4?.N:`n^A}zRu_K!% ekeكI\_ʱ~k>yE_ UN(LJ`Dh.8 Twv[iEYBH=yctyb./<o>|b𦮌RvK8խZ#T|Uk]ele _|.bkl0Xa1aIp" X.aZkCH*?tvWa(XP[66cYi*[QWWrsc1+fB й1bI NR K U͏KfsE5T1 rx"Ntl':kgK'DJ@\"[0K0Ŀz. "|/`CC:s2 Y2T `9CP8X`΂QP/U3đֆ5Pl>ۥkʉ>w:⃿]\`#t,yGTv?,RUЃp6UhA$gRPUk>#V\|T <Vޫ"x^Bg#G@%eVy#j:ChBp{ uB!c _v,r|;_REȘ{Krb=\aNs @ )daJ}g<C!~o.rϣԿУN}f_౰  Z,a> 2nqC|JM'qnJD*+Q & K> ~ {.1P2n+w*FK Kbӹ݋$[RĿ FTԔaYBh:ovyBr .rqcIX}$<|LH8hؼbs.ӌ$Q8 ; 9)Np a.FMs$9! P ALTB@gO#& W5 2.b8E=APu}ʅ–CY$Y@!=a G(5@=m!C#5@*dd 0Uud5볌#L 2qD{nEZөCGopǡP1v/0 +Fbz>"^Ejj̉e7ej)*OF.X-1CtSgU`WwV0x<]sw&tB>׏}R\kZsnܤSUx~ ne7+-]Eqpy rXrM`Ȼ*Zx2bUNW Z6bū67OAdQߣ,Vml4A sck߯ {zqn!/ =pmJo^>~("zF3>J4MKrMu__7)u4,XÒFAablR b@l(mʒU{ J] e)49, | \`xd $Ŏ04U $0 [N.eikÿ(aՉywp$@B=@+^<,D%`:փ+rEф+5HlkS*;dPRzr+r_@Qgmھ`5fkݻx</HG 9_z| qb6ץo˻+ 8C{!Pe?cF,h(H/C??ds n1 ;$* %FЂ)qbPmzl*I(}oIHAV,~6zx2f25Һ$/ y=PA_DFBhő~cAs$3W'$^%ȖHA}A2@\>p0Gpш"}A& 3IHE9oË|yMꤔ8.ȸIF8sʉ5TF2p='K/;Y.=\_~j}la}~ts~ōﭟ'g6>8/^tcalԄigKx6ڜ?z6>y` g 瞍 [HXO}lo]Yvi.I% j:6S>Nx'g+-WK9ϋW'{Ktk]=*Z0ۻ' KpQ`{y-ڥ*~W)8j\-W}C5m:!VcF֬z!m%>59*kʁ|_6MŴ:M d:("-1 I1M9 @B2wS$58i _&Nx ~$q`6s>j/kjhv/2 JNaB<4g2Ao;q`ZHQM&(c_VT (${%O\I@[YF!)W̌OqK:>9v H(!߭~MFqK/h\' ZӿܜK $L]؀ X(Z=Lbowc7l"8-YE܂/A,0H$pu!L:x>lߨC6ձt_&L -\As$❾AZ YJ|#*-ϟ"N|g_7V'-J̡X PF*)t"L"mp|XdVTlO5=PcԨԺ{%bȭ8$WKIog?6ʳL}A{kl Yu"-ɷQX_^sYAT XE03rM.SY,ѭ$@>_ X+lr.%M.ʽ (6 .!w]+d?J qrgҋ\njӹjBcR{ՙ_<0öѵ2[nŶl& h.Yx 5HJQ޸lU('5`Ԓ!:zt])'ߘM_Y:a$yUU? Uylߖp;БWwFfc3ޔDPܘn߯8UO[ 3(BVLomSk͌b p l|齓(Ш hHӛ1\+EW Tz R9w)R2.{Ľo8I?>. TOרFDQqy]v \!g5g5!zHy El2ރҒOYx0Y%}SȜΐcb4?ª~hCb`P %Ӈ;,l(P%h}{\Ύ@ՓYnsQ3 8m%4jko45z@#b$5b=dP#>WvDGF pŽ}9rѕK=Тh)&QDVHN,81C}T*ôf*W) Ъ_[G.MQ!70!e9k+'* C1@g.+WSXZm'2^Vqh4@00 י-E]4T[PH`h\^0vۗ/s ԊRiz|P " E!d` iz#ȀBd?wVq C^qqs8֪a!+v?(xyI !=  /U(pcw}M-VvG'qoW'}sZkd9/S >ɲ%vQ$N\)%+qR\Yr^U!n$8;w>[Xn 6?2A jSia*aM*1`HlV}uC F ogܡPg&VU ow/1Կ!ïm~|7y i v-_^5oKog_ws]oxY]%þj3(/_/>?xyW|o|g^3=6)6*$fBFwYATj(8N~ )l vyn#=(q/ʿ 5ʧ#&2E}üg=rQ{U!._ןyuY)Mj/B.žVY-WX}ཬ9Z&AYx6nP>}OMqhA%:/-ʹNVm{<%L:_7Єx4S'x.o?$;Y3ݷDQ3:7'f$̚tu{70>uG_gi^h6&f{_mqGh>t_?~?_?>;?}SAdžl1JO}t%}wOT|A"͚@+zR2g$ǝ!Hbe%s8hh_ƲhmEpF`_c2mL\\{̱4A!!g7mR[gClY -}4Fe?M&nI{\s>5q~/jzF4{6Sa [AI&Cz\:O&g,n\JfN /46i#[M~xqx=ƦhFeiCQb-,vBL^%19iu٬2*G71NX<)\+ QN07.ty dGN3E]GD{՘6'3o4WKϮ;W[/J|0^jdy'ڇ1M(fe6X2j.Jeyo߮Mm^{WcoR9x^qn;'};'8۹УCv^{Z;';H 9rNWaGPMYsKݯ1^Uue2$9w_kOk{P]~o ޼5s-*2j$"?ɖ̗ytA+j,a  mPϸ.s\llBA%&e젫;1S҅ V?z+Q'e&b~;\TjRQ|@:Fy%̓@Sv$w$v$|#Aj+103 hs "qh vȷe[" RySœzƓ:86X"c1&AOE Iq-m+nN*P!,O gow큐r%MAO9j (U Pj~vJ݅HVJg ˇRչ703ZgVr Cth$͖nUB-HfK(2:Vygf+ #Ɩ61Biҽ5Z{ہ@@Fm>JHq.m՜uM[,֐)wnDgG/htLYO?TLcSE0-TY[DNvXq0ЬM;_{){6e~\W*Rnu¥֘Xш7łB,q,)=XKtn#kUf##LܒDŽUwM0Y2Vk]<񋺼´z4XQ`N>0!Xҵ1f&ug.z\*/FnUFoc>`R8IzIm$2,d#Kkimk )rN&Ʊzt!Rup$ܔbd%8BdxO1Zk)])m0Ikqx-=¶^crQ_+\L%.!sޜߚ?SEqM qtl*w f'NjDLEŜHtMXvc.H#QZ,,2E@JEi LnlH4 fCw#3I 1sL/,(6arx(?ȞMlvФe˲'@ãYtyM|O6wOۧ~FnkNXaQ0zcv4{MZֈo; 5śX:; _fc$''0܋tLPuȺ 6 #vڗ`1p!h6Ꟙx/6S'i_jKeWBdip )pJpg(cӊ(B/;x쮄!gm܉٫=ơΖ==]nt߱]㲖3M/]g ?(^~tv+69(qk #;t%um8=9m<=*Q~i24\p/E3sigyLS.{)K&E~vZ)`E f*QIRK?۹DN"bUSgѫ=7E9KN_g6VNώWZh-EOV3K;,!$2% a=3{r{PjǔSgOa-P'HM9jgiP@>cG'kxro1^zQԽ"?:{S:6Oew<;9 TV6m_5 1}^TvVL—؝dDluш?ۊisztUL p+Pצwm|tK"jzopḦk ^.( /nnsLjtې6+1'8:.S {gD*1bslٲXߜ7ɱv}r`6zn(~"BS?{ Ne6=+ v C3kȊgvjf#,4\,tWEQdU TՁ!:Hp w&[QI$:BTN)rZKexL,Kuer̭g2Vh<1g fB%LRPj+k_U^ڲɧ̥^k{2 0IjWv." K9{ő^"ܳyuݗ:`/tӜyʪJU*+:3ty02 Z̫[b_8{gf =I;{GĎP[pxӼN'vZ6hH=tb%0v^_LN3+ w'bϥb*Z H&xDl3Y~-H lٖZ/D/xqmY@܍v0(Av9>h)":m\mN(bla_}z _(w09 Va(Ə.P]G>쓰ǠA* ],_B4T,v8R> =נUF̠YJN؜>((oan-K܍ZSA AGrn$>==G B(j B=݋*v5o.Q=*i>;\%5:qd .ԢBv\xr y,vP Ё5TTő~ڍ:q3:;!uo~,St<au?4% ')]HTm؋v#ّ8)zkx4t2Ô2;4Oybl9<-4^_v `dMϼYT6^#X4Ө3ΰ:5(fuӬ5[Ku#X6ͼe36,hlUWVJ FK͊3hϛAkf3j8?lXhOdvfd32fGfwf;lA3oݬa6,,Iʞ?:oZ( z2S<'(<ꕔ/ qnIsqU7t@H΄Im.t0'6P{#%=c# 4xuRK):-sS΁L:ÙIDr\|gp2riI NJ S*Q>I-vD (&,sQ# JP8ςKeEiT:BKQ%*eR$IxURf@xL*+JH$Z# 㮑EmPd8PytVjk@4pS%|K$%\i^VIl 8/Y[K/!yStDVN u0-mGX}ٶW:YqIK 3JM JS$NHtvcIQtf k2"#vP$ ǟ98t^z1L]'>>3A䲊qrE`톔 d@)KO%OA:|h۔̹EU57= `A)W8dP 8hHBq YćaB ĀrpCAaCց<0D}KN!HDAMK< UaX!(($dEF) (P 5Q I  Q5q*(FyxF[>KjI@IpIvU1BҠK8RRRBT 8R8RR]_)!j>d (!hgigvԡ )V )(r"+(AӧS+p J$ SR$}gvj2*^@B%";c1Y .ZF[xeH"Z(*m͡-m*#Dz!Yӿ3GZP欄j# f`CkJ[Ýms!BxCt Dm$x$ä%6̱I{dGt;y39 0~q#5ކ;M5Ҙtg],ȚAѽdT[$iS]+ݍat rW: zgIg$zX$1Id$AJd$ܖ$yI\dd3dDMܜ4D EOdܟwA΋ʆݢ͒[Ha(EAdhN9PAF32\$X%AUdrp"h4#Y3dfI%M2g-<]p"î\X'.<(]6- 9w3^8y1ܻ 3]`+TϺ!s?fmm\Ș8&ghTuZf$6 Jn3ۤplL脦u,wE:sH:^&vu$wTMtW:9ioiL?m1g6$]<'Ym۴NÝl`ihfl6)*m"U58NK2k>;9w#B} t!PGDEudH(߂ Z^zIkAp'atcPm2SC$r-!~8Mdg'h8՘c"|)gUT){3ŬCEDoDtK6=e bgV:,bVZ[gYe,geOrmAzFR"D/դj%~>ɵ2Sf5&eì HA7Ze~7MLRդFV㻳*ɪ1e9.:^{IM~&^-;=NpDVѱ6vZޜ%wo^w!x{TxDc##`,Ztá;Kw.?n>ܿt.] ORuaze;^>C ]d1Nk1 w%!cRKnZ%`=GNEE,+޲#w_*ZU]kw/:yQ+՝scύ<~<>sOO ?>w vZu9p=>d}iԷo^d_G3Mԣ㏦M/>hfGM]󌎷jAGA7WK);$a*^uff兕͕"݃9ωq -Q4uGmmw1{u)ﮅɆmE,Q w+/ C,[ %C3_t`Ybf 1˜uw(v>~H`HxVنH+S2.ǫ¸ ҃B^jFm\NjX4jl  4QYّwAK`'Xq9s"mE.^\X::t`uLnR0g'0BSD9% Cckߡgcm:q X<.f^٭DVzjwB頟S&zA#/>x4}Dȣ5!9þoG}|~1Xx7p<63 (H_,_x8q1btt u`>/R/ϳPBh~B{L'g!hU(rap32ptʓ{A{]D= ]xuJPV삋I,>r> <2ߜD/^.%ǫQ 2$Y朏V Az'+(!c~Oi4/9eb;ʁ4f8=nļ^@0K7.ٶ)/[ AoTQyzB˃!Urh&XvFT:"¢ik|ת]EbhË*n ˲-n5o釅VgZAhC)Vf(naa[:pCpe:@_~3k/w˰f-}(1w?@CK.ÕقR@.r@`~ Z=Sβ$T]*yxdz8c^ a!K_@G ɰg'tȆfo0L,g[UvB0pZ^(m8`FЀ F]LZ D/9UmNY2b; lA֜rnou(1Biު^ -8Vw~ <Ӟ=Z}xX chB] )Bª>D hNWyXц<]lNm J=`X׊sxlUL~٨y9nZ=P@C9mJ&BXJO"&YsԆ9j7nșlN`mT뎚I}P\]Zv-] >,LlOl*ݯq`;Xdr~/@q4΢:in>4>k{hwkl kZ5&v1A10VoєtK>/ ./ Z+`r lrs @a]*}C+'._㭮VmnaFx2d뵳k ޘ]{xCkGܛz:yhk#?r Xl۸7!\Qls^5omqƙ3jziHݼ+Cl1ڏ'z2FZ:W49){~\ hD]8]K 鮨젧/qdNUZ^,sUgF!YKW.aWL<^?$1Q}L1Wuq Bxbɋa+g݌h>#5/q'VBI7I*%5&E吞աl`e)| X]Sl n}2u~ --@iKǔs钵tf#E')3><ݪ;1ȐwJE- %ļK\ύ`BX8z}5Wֻ8Mxut[~@Δ/b<(~֣$nzΉ*[}P+Q2jv>53;eZt6ttuhhu*&kՁV _J}4kVjj8ߏDĥ+spB˾ֳc[C\W0k ;1XCkȵ/ɴfEk |Aٵ\\Nk}!r)<Ӭ0<6H1M7Lq2+6Z6 :U1tϵCݴg0^?`Ú%߶:r:romN3pw \>څ wzb:IW.\žcdm'OBl@n y9)p*^׊=,2^F̡FLT`{C'ئ8i]̣@hUg?{T$uIqI6Y]*L uP/7Rˠ [azU/QzQY*_ooFY/rotzm^۪׶*Weծ*)]e]J~Iԭ*Z q?Py7nNu5.ʫ6U6،t4gzWn-ZSYU%խ2ߋ)[:Vըa2 ,\*kzYݪUG׫ʒ1vsmILjUJVmj[VmVTS:,ɲhյ\)sQ I5,퓹Eb_Vj3԰Ka¦;磊}mazضmazضmazضmazضmad=`yZT}}k/T}!*i{paw-t,xC&H]C2D]7J+ @+UBMٺ 'ŨWh!i\C+qPQB;u@j׳]>Xq}K0VWTC۪x!$asHD t݃k3Ϯ5=rw5~ie xګ]WzCvs*o]6:nn[]ڏnptCC'g&-zS{|n:b861DÐFiX7?.=:z̓_*=[v]@T&zԥ:nWn p˞-&h+\NGJV{>Xq])X!U&oT.[= M/Hݜ HJ]I$YrtP)zU_\2S&߯(J K) M"IlV 7']`Gt?EKQQ ɶjC- ^^XlJbz3C.۪փJvu$X6E^=d(9MsWL°B؜ND=ֺrknm?82- di &/-Ћ-U:yX2Gl3#rVp2!NbG;sfߝ\L+g Z5VɄ:& Vkc B:"^&[V~Zdzdkx=n;JZ쓹Sͫ!(V~%?g>TzWx[NҌ _(0Hq!6HrE'_#x I7IsE*yLAy&V}$!*@N.W !\tB.SфJj9ų X\yn= ҩ3Z BگNRHrMyOw3U\fTŬ+$ ry9"5&.C92O(WӒze+9m}i ̯M8=VTjҺk̵}ځ "jC'.];=ZuQ)eQufX)Ot^òq%/*)<Nj|1kHv(QqH$赈5~㥜NؤFRGD7? ̼. vUxyu=͂Fզ;?oThQscvIh͇OL5L6޶G0z=;n*=8?ۣ~6/6N C6AAqz6 ^W{o9zX[lLZATX\ג=xH\2S\qOjĄny`HDs@Z0 svLk퇿4)NvbceaA 1;aJRpg(,,hP  ﱫ=] "3 @nX\l( FgEA6jx'LT =yvdEz7G|jXa*L*s?6oEռŻFnygy(},R|.no\b*@ӁOB?oM.Ud7&_҇, T't}ΐ@}ٱHfrc~Z9{5 ^\8Oا& aF >jc]JmUP ~8Lydes}u+XmC/ ,t٨3d&!"`R"d][Cد亥Ź~ZpM0]:TE(;\P boK& (gVY 7ĭ`7[pIO*ߐy,?R{}ƞЮ_4GF h8ڑ3 R~Őji޵b'פB?1Ơ%Ɗf؊N&uӮx} ~jRn?{~; GGFT;qwg立0$l_:>L65,2t*n6.~lU\'s }'w~s*_>W}*o"v{LW]^ xޕwA>:./ݍíݓVCf%T su5t Zru$T pT%`5wOâڶL4;@ #0Yu;Gkj9’yKix> ~ ,:~Ж ;sbW؝Ulwlq팂(VލO}>@ß1;d8Z.*yv_/(5@8ngecEiH `4\9R>3rJ ӔW:4]6PP*. ML9T]ʨf+qY:, ιe(% PMqu#5x3l|rE~q# g.AZv}/~۽ߕW/5`/yENeMt9rqW,,"aez{݉[Yh^#OܬAa+5;[~齚ӕdV{ ^kk` Y9TȘ.G$>ijcECj/1Ts~; (PjYֱ)dYWem5HjGiT; ~-9Q/nU+[*A0* 0֋c4 Vbևv#+YU;$Ew*BC<уE8k9kP>,M[1u`^uʡlX`Zb  Iri \܎a7b'P/};_nNmО/v4(/ ?;"7P0l\E³c!NdjϣFđ!XUC9a6*Y?JE|M|hfJer`p7ʑ)Ndpj~c;+-q7nDveX~A}EJ]5X Upb0MM]cd4.^[ȁmmdnSK CK p$?eeۉk!R%_XFK`)x`n- YMyxȂJ 4r4KZ~Bnh;IRhߤf\ajmf5Y藀(?t/X>9@{D(C1K*t)[ |+m`dt5VЍ2L9@JBfl:xK>gY r'c.hW ۜ"VkVeD°\|Qi漗ud'C}[ܶ%1,E=^48WPJ[m9:|@PřQŽO% ]\6D\ D["Ĉ;qvYӘ4wmk.CgN!,Nt)šzd^oY:[zNigǰ-#۫ea1|t}@]@;"VAcUMj|~kkߡgcm:qmi\q h!]:5`m]u~|s𔅍>6zh2{FFRdը^CܫD;^5uQvHg7*~/[Lm9K)ngLw9؍&^ĺUdg{Yކ\SRsp IpG-[z;˶_ LW:#TLLGB'\ qES%,٢qlr 7y(_Pڔyܙiʔ/9v[%'J vdL-O9 }osޛU_^vݽUXN91*P Pb"y[ x +#>K_U\wTk>,9p#y7މGݲBVh |%kw@} ÿ/+g}GSȇUѫp-vQ`SC~\2 u'/S@*5őt*>.چ VTc)cU:۱,+tP}e >2[< Cva{[ e\7RF5$b`>IeZX&~ SꧩV9 Őg,1.G;WEd'OPÕ~q$}DW #:r,/v%$ȔdŐ,l҅ɵ$ceUk8^e'Cd7VOQ+juDB i!RQHfE(UGQ"C;,zFWT] E؛"^Aՠ]y1,3rhnʊHu>ZO.nR#fY X$$ȲMtQ7~0)μ! ;t#G؁bA`q|&wX05'@`6o հ`p'ByU" )4rK5ɀ o?n^o?dE *nˌX!.Sn2ӣ&V8K e2LJO3W-E0v0dENVs_SA7Ǡ&bCo/O(<:`@8`Maـ}Jt Bm1!,,Fj;kPȄV#OϮ]y2׿qfx`襍O~vgvUF|:0piE?rmؓ{<;d2ڙcVΟظ7>ɵk2+z4lG~7'}zhCOY\ˆ3KO">az}3-MG4۬yΎXw7in3}z adn ^8>X;|;?qs,/S\;76#O CP찿.{:}JY;|p#twF'ѳٗYc'/}wqɝѵY20j -+[+`g!!tK\T| GtEբ/<:`hdQ7_]k4ViXu^VR<֘>w zr.'QR9n|ׯc#p Q'Ks{O[3GU^,WPuS› 0yGP2:!ōo? <}HUhG}tu/,N@ Pg6R\ (]?AOlǹR\ȡ#7CYD jSDB1tЗo NgZ"BZsf&kwCBë3(F 126L Y\8d2NLpNd2_22ܫJ( qսʤTA653AЊ6hj#ڈ6hj#ڈ6hj#ڈ6hj#ڈ6hj#ڈ6hj#ڈ6hj#ڈ6hj#ڈpD'Z`/bbo~& SKaQ.t2sa%FJu 8Wyx+_rzD,Ta|.A_ͱo{شs$w~4ဌu?BS`vIF "l鈊W/bC=,ϯ~<A랏ISKadh鈝H^Rt!'P-w& 4 <4όD})12"#{{!O?%iq ~%HI\ʿ7'+]JxPAS޴i3V2<tt)Rd4t~2bOt9GiUX^yNC^q(a(nz1KDs"x/OcOZ%VlUNPEU[vd u &}mKNK`Mq #%j??P&q8P&o} db4~ۣz7/PKf S4&xu2ohzPaKDv$A.}žez"^u&5S6#D ,UL$C̈niJ`^sTT8?d~勸M՗Y~+&DhRcĆ[w9ND HBhOxxi^9ЁhVBab޿vwD\n왲5ˊJqXZߎ>fh+f hR[AF̌iZ{IVϯ8#kx7iX}CIyVuZ0~Ɉ.H3/H~W9ʿn1]J+kZX\fz=#fc6`aė,e a+-#|#a'h۷9瞏8U"_~#[\{Q'zj![LMMw˅-7땰?W‚fEs-W#JLOzIQ9+\ 9Ko9ĈތCSf1@ZF1;pZ AG\Fw>:_І-Q33уj]76q:ZnuR=ʍE [o$ iՂgg'*T*F2Z0U< k;YRm>]6LtZ qQM⬛D*9M2R=6TRx-`Qa(. 3s?kPMUjMT 0! ǜ2+n%,P7Wɞ Chvk'Y|]-ڬ\Tfq[벎BHy֕[ xkM-ZXNM A>aġ⨠8KB qb^Līdp֚AZ;}#0(uٓߺnj>&l/kOc$Ԗt]%QqiCXTmtb<0 Hd}*!+,'dJAZYjmkTΌV`vZ&ź0t`SP`REMg9)b3U%6`+ڎu&I)8av{ٯ6عچzue:fY0tIE¦BV_):G ^g35:;TN00Tw5Op0WPd=5(D/_e+ bc,QPr$b"sR DC+?}$,/"0Ƨ+bpl0/mbZ-Inv7t4<ݾ"N`Ѫ,&`-M7"pFo:[,{c(g"F򎢍vpq ewn>1L t4M=^X%W4zhUZ&=I}#gN(f+,@@5g=F?f0EAtB _ciȆ(1j8)nЋV}y'3sb'r%F>GHTپ"B~ +& ?fu_Kwޡa zSAu]I.8hp^X䍓 yg%Vt'>+,[`qN <=~@<{b1T} F`)]l&]ҝI=#_\Ԉ"]}۾ĤCU-u컍]AEgw ; nx ʥ:j.WƵ.&Bi0tD,-ҞFB;e'գcu<_ 6  i@aU{+ Ѕm2 0'$7@E5Q\n]n JF%Q=sd.BϜJLB?En@%ѝ<["!qLjTЇ49ʹ>J?BPO8 Q&0:t4$Dr0BainA1KWM)1B$&7{bsWq&,WyCQFyafh+nOd[h ZV=-_Lj^Ї%]V5*xS+@T+ \:Ó'.#\OP{0*˄o{Kd3ܟ¼` a^z~_>c >d(ߘ>l3Fs 3Kt81B13qj6 $t:j3؅XTu^d#61'c\ыj[Y $l,uCs(lzD!|`9ѱfN] ZAlUtDN9{wlvZ &1> ƴhM]g_@l|سssFWyw-Ap͕7Ҿ&S`&Vc' y)ʐ8ͧxrYlQN2X^{ 4 Ž`/1/ӑkʭ>'S8=C¶,bwBM(,ekt^\aBda }A{Ղ,?u [**ju4@!&ǍcXP*s~_ƨ¡1k1[+ke[Tk86*=(%E1*Qq } *">(jT j 㔰t򛏔m:Ko"W) ] zQ kV(h,"exϊQ,0#=zQfj*0ef.`̉#V=8x'[=G\_TƬJk_lłM]:ߝP*1P>}Xi/D3V ?\mЏ\5T *0NcM b(Ry]ZLULYB; ꀻkIڑ|)Ɔzׅ_ nGrvM,[4pVaVƛVU[0*ި'W 'ڸ4sIMm<#'=Wdd0e sX Dzn p>~iF1f@~A{HqJNܙ%zVwwۍ2"1~z1EEþ ]Х/hZTm~A&lh\L`U|I1jF> AY`-AHw!U!vQ5 "%3Mb+"4oԃUlԳD<UY1VFd)iW4ji9p K@do 2ƿ^!I 4#ȊԅH`4f+62RcLo2 cP@Mr_Swzj篓 iQLeW ~ ghCyJfo,xS /qiF-gJkDFB;2vbkXVa)Zx(a-Jt5|D6FTVo 0tcr:ֹ9|Z[r<9hĠPw4h8<A{ܐvAb[b}]>0a޻~ 4]{ejEWml'jJ`Aa cOXͥКk<XSm5 5d|OHaE~74Frj&ZI V[&/"5 1ůxCM~a]ͮ,ckLDKQ*Y]O0sx]MN !` -" :(~Ab"=SRQ 6HAǯMIbLޭA f؅h/ E ŒwNQe>02D hسWvމq/m T2*O{2CDe2?mD >trB]|nOȃ*Lrપtmgev:z7xi:L윅 Qu!w-]ꮺ`z05WU#ۉ0AS~Vue^SuA%UAOΚ7{aGTK׺UR6$jif0 [7tkYgHz*gG¹p~Tg%#Iκ֤1b60-Հ+oBGA{eiqXLs,G!\6^%\HT/%G|);YT<*%Ne(~JMt1]jmy>fτOMfuS\q-^ӂYhᘕs 170'{;$Wsq!@>Y^+e 3s 1՝jycn@Z^|-8ۘߎ些r5.G7Ղ3s K598OxFRԆԆԆԆmY'mHBNDFbBC%a9^>WM}J*K~){~UbBV; Φ'7oz0r Ű6FĠ!Ӧ zO ev([Ȕ`hk SDu " PEf)~q)Jq -啽#3휚R.(n]e3Jjn21(-i nFVsn#'>9eË4 ̅[_\n[+ҹ=î2 {n> 3.ˢ RV}> z^PALb/Tt 9|yo !6hn?С 6@Ф|+ /uh> ]>_^U1y%3 cb`t GAiGr!bØsj[hxAr`6ˆ3e@th88fi=(22_y>'4NY'KE\%M;K`4`D̅3Hv?zt魍OI7>{gJ, W AF`]\DQéŤ nMjakA]j6sTijpך+2Y_+9r]V08|:kO:Y+CBN0ͺ5- κ˻rWb%x7ker0Ԩq ʍۙY/9U5_;|Yj9[a=MDrF,iXwhI\~[ȭavy9“#86ɁɨIH%y;J2ďH}Mo|]D}*Gҗ(Q_T1s~^\*qb7E80V?lw' ^Y'_h'jC+P9V=2oKr(4 &cekiDAZM?=^#DWTH|ԙ>l߆F G;c=y9bOShd?ͭ4ZL%;?zk!c&&׊ Q6&`%qJ|1eb v${S~YsN=ٷ#UY2)5T iS%0}5/ mrAI}C簫flj tZ0#!GL4[ƀ1rn`2ZG@i"(v=Z\BhsDm2{E| TqðY(H^^6dM2RaIVH+{S'0ٛ/Fk01,xH(!{"˷(*g .q4X [gG"20֜.5"xl`CCδE1`~PcH؃iB݄+Β%&PyJKagO =%%'-b !@KOɂR7AvrqD1@iEwF /"CImPi @ˏzK4ُ]W CL3d`@A:lBW<$r)Yo&ӝpmHȸ?E[JJ0}<* CŪ*L|6C7UL!YtғM6|֏IyC0;~eqjƧTO'<~o&K@e@ұutxua !%9Y177x"$G2ӓ*H)ORKc_AIm("21-6PHn0Tt#-꼶>A9!fxrw@Å[n߮ty͍LYw a7B=ltVjI {Eݚ/~F5#~ǿ3w\u lfq-qƢ:*SDeǯH[)/%|~~e2koeFAQîhhRb_a&18ԺB:Y2Hn9:Ida׏Ӻd0`W=ȊI^G[A jb bpQ+N$Kq:vba<)s~d(0IU7QrpՐF{^-?oE|ЉߨމJIe ^xQIAJq\\]\Nʩmb(_5*8Y,YS }[XU)}&݉t2x9HG L?D9}XDCIA1ч98uId(` XQ~Î t[rWg~aдM&~kW VХ"ۏR_MWځ10uyg,[8XoB.CY<4ñ3|2ɂ"#iWS լdSVdO|G2UH&f"YYІ#ؚ]c07Y\H3:B;P2=03] .l*JDۯs 31IdOf5.1Uc(wP{!՝ivjgΗ֚+ln)Y]`0^GCu_I_;v{![/BR1(dKLe$,ȇHX00"a-,DV@!R0 …K0a qC~}Q-c" ~ci`@HI1}a#.Hk`[fio̐zn WD$ɼ~ ^1ܰ ;7{A; M"uÏj=CĽJ#&߁Kh՜,bvjsӮjJYUo1%|o QЖC=GfiƕG7V՜ ѣȮ02f` 4;XCTYA:*қS e@8GγTzB[w0jcsZ:~O>۾4~qNmN0 boW {޻M1x4e^ $A"qVnKy^}ۢٱsuN[D|{ Ql;-`Gr勮B?v<޼]d|W Y;nJ2"$N؛p܌suxMY VqIC6[+bbkoMo ACݟdw'M& %E~GԠja9^ 54N?!}C(DQ@M?WO WNr`8UAMڙ;&U YH=MJjnj66UQOWӋ-ٹdb7ee'۲ӂ$_R¡8!d+&S;"zަQBZX%mPMUi~򵚈Y&>Bf̖ ߰ԨnS ڪfRKp'@UZTňgj-Db( >.Y2,zjmd!9PH3+B>>јS-Ե|gMʧ^SP_KWiS~*"]X~́]Q̘f_(ϏhzLF26wˀ}E,0̮0假˃Fܹ<\H#'f!ily@I{5F #j,jhP3^g$klɞޝx5qc6bҹѥdn,7hn~1[j3'ɳ'|򞹉ܘhEƆ I4 &"0&ga5RÂ_gDH^x&دWWo{33jjp_~2ڹ9f*A0&ղ}j( $*լ`U`T s0 ϙgWd6\Pai эCױf#3axMcZ5-~盧FԔLeV^!@\[@R NĮ3^Oʠ,;D}'P^l>mh7l5,3 DXa-k Nj54*bt@{DCtМ82|2ĪyA0 nx 5X#ӼG4zT/|7 mmBt!)͡:| |>̧nb"eB ^F|jHɧf#>OSW-OSU9pԝKדCk]U6;ZH:uES5U@ f[r$E N C <}<؊hyey*HWYoI9\ v5PDˑʀ”@!0n%j9|K "D.J[l%zsT=ƚumB9P!p8u>J-ynԾ^UT#yɁ"\)0!%t;tA]w 'E^0UO:0,}tX b-_|ZK^#tdPm_i_v >: X&&@1^EK0DOJi\C<!L{/7"BApE q XenXery`$@2gCT,R ͵Ai+-".Í; 1Їg&NXF r@6=^z8up2sjI"V(dq(Q;ΑD"L{8-|up ۬ u>Ŕʗ . 8 3AK]i ": L4!pMDğ'fffieD-.t&"`l~ =2wi+Z9&\w[5a*}L1#.("K+k zzM-:,=hrMjJ8Q"+?wjfutj_M㉕K#oFZ_hW>@.8!U8v.r1ՋCA S}G)rZaI9`LP(odOǻ1`Jز}uz!(ujcTCVد|bCuϿdvo5#Xx).QIV&3RTaJ7z*O%ŚT t'Lqӎ16uzZ1Un#9fՎkk `"aQ֨QX0{/U:Uqfo$ ,3M%թE]##IahGL1k@=|.rby(I9JB!Jrݺ0?(gs8f*):D:$4׈Z\.h3Eu4qY.3tIuͽH@/KkUźpY.!7~_O8'#j;λww8;?964yJ E&}Zu 1Hf}AX& q[c.OC)eg<$TpW2 bK(Q%8Xp #3>H=M)E,5"}!Z2p7vC>j\A.ϣ+wۼ=YxIgȼ;w{ߞθ/ HT:pa?#4h'^:_/ЃQ8?.XpB֨YQ+O_dJ6ʵ14fyoܓ^)poX:ʓ"6Hqx7ͳT|=apE.fۄ8p/3_/ߟy{/s;Ώa&~f!_ۅ4_6uo~s/6fn~12~jE9|m~}??&hST@% &e! 9 ~qE脦<#cBW e6 cN&q#-ԢIXbTo)"&].ܽ?=軅LGm>z%}$p[7gm_DHYIMmRٿ.+6xӰXCo$y}5О7 xrӎk!̮Y;m>o}hykX^5ia?O{Hs|7{W=l(ЋxDz$JD.&= =s u*Qì*Ҥǁ!}Α_ ԙV<- Qhi6kvH=ӊPB M>ĺA~F6Rip[1_vS =k+fz:@K@9$Ȅ_ i}XE\כx4Y`^==Iւ#sK?w'~c-UیL`.TTtaȼ3Ii~1l!U{VV~35 ~TtC)mO7rk \Gzv=4 \ X&zW0eǟ7rGG'-c]&ݱ ݱswr:@_UԍU%xfrdVA[heE֜w46_=wϔ7Sٞ\Hv6sMFm7es؛Qhu{):j t D' GF[7r?߿l&ZT/)0dVpՓ^ /WU$Be@Y*7Vt|ߚ ORZJ ȲUQ4gtcIwk-vN6zҔǰ6qm؟Ѻ\gw~D4~}_z~-QFˤwy:.T6{jQemfCu?*׸ye}au tvO}L{_}~qzn{O_\9U|ys^v7̟a"}O+:^)m5$yc:9+)zڴmD6jd.BZù&࢘v6ۯvDՀ:ʖ;ӆ>\r9 //’j[_anv6޼%r4wu]a ת s֮[4fl7y{g}lu+*)+zq<ϫս{O+ܵo.֌D n?8K]yoKk티ꕪԨ7 (ȯSΦˣ ޶f-I`a1wTsrZJWΆ̐a|ּ֠`r% $B*'zY[Bot^wNu7oᷭZo]Eۅm僡jJ =tTH\Niy=KR 50$En%\]nuTwvN/RynZAqJc"LtxlLJFu6> .8zVhE޷|:rNp3cf@/nz}߿\~~u8mwi7I|lq5#G9njDR`O'yҭ~9X/Z']%Za"Lm HC/*G@>)(="J4$0tkYN6eu5c-/p#߾ hD8 vyy@D`.tcpaNHoyl43M6 9̺P0ibF2*mxq1z;̷Ks{4{l '{VI0d|,W=:=f'/g8+̌O qr9CcOxEb+I;~I-g恃+!&H<[I.g?|q (dx%8%}tceܔg!>8^oNЂeNDtdFt=c}tNڎۧqX% ErxK2sx:5.xLM`)g8Z)}1p2P9܇+̎1e>!8Ғ\2>8Nħ5Ok d@?^<ܺt%rdW~@/ZqB 0䒁0?w 3p3Jst4 )蕥'0>#m1 FT(ā#WoCe=2A_)t[ G21e!l>X[Dõy]E_7Wi`~Sqy$&i)puD.Z3 +}nq\j I"bd"#UMc{t7EƮb#!uEJH[uUl Gza$}XiL,1EQvt w 7 nT`($,T_-~xo7D13Z3J\?o E G}r"bpSB3Nz7Tt! UU|}}y0F"x=0}s%9!Xᆶ)Sȭw!:ՠ"m Xz`Oʜw`Ng tC @''WTKeC體+hA.5^lU8MrejpGF[G[xuWN`TN5g"@Hw8^ǁY 5B% K$7~A|.ǷԐFo)[# 5||Ҟ>(ևxQ@V&sh-Ē}OKDM5qv_`H.]}QpK£O5"̂n02V,p8 7:P9#7}cZ':TTjw}޳DP= {#8Ļ}ĝȜ}H鋜e]Aаn鱗ۮ߄]yA+յ|ӧ:Ƿ[+šbD.:G\ΰ59Yv7ʧNOOzI.9%95d>y֌ Pt_R~97ŜȣX`H <)_hr6~Nd6zoLtazM_RGl ״ihH9R's md%|P#[Ͽ}11;\yj}^mwA}ϑs>tȽzj`OzDR١/"2 4eyd|~H)0};uYARSnjXoV&V[WA6yuԀ_? 9@_u?m1χ<)2Y!RUN')!2ĐGy|A|Gy9,ی;nը% 1&\EsNφK1¥~-ՔZmvuYcу8`rr h+_R 897r\^^?bz!N$ԬW XlS4ue9;/n]EA10g&G'x[^vT m!hբev ;()^iH4) X?<9yuql>gj^ݢeR5lB& ɉA z^Xj-G8jK!iFSaAۨ]h7\a{! ANi$9Q =@}*]cKoov ˆ /,.c>}dVF(/UdLX*ˡGbmB ܒ<'|Zf \6#]ߤ7%+!np~s[v!IhX$ ʇ9xcby(n͂JP1#c(XX/vۦ?~иb{kޮ5GRJN qK :sg:K͕ ӰNTAt0U tN( ZP2I=n>wˣa*4mRA4+{v>|^NK}`ڝ[z$x"Kj2mJ=h2 38ў7bCMbJ|rD:ֳYP{ p wvŢRʤ9+3Qfv/-yYFEN3&OTbdk{цc۶B=ׄ_ ͌iyi{g s0 IcjrH>2Lp_F@`5hCg-"qճ^2F9)S52BqVb̃՘LDC󼝟/?uT+}O#NLgA`B_0|O4s`Ϲn697 ?@@t-^(64g;h%͜ j-ж4{i:9!ϋ鼹`q8G4(S.j]"=&%ݭ7+p&F'~&0~^_;yt$N9*u}\U_=1+$@ܢ[&.Md{г)0_ܸ毀~frc>%{fV2g֗fOEkl8)D[doth@P;2k~T(!D>וG$v 4:z|feKVlthٳж4؆֔u?TYj$jgGfy΅Qd̓I,Z+ZEՖ%΋O¢7؅r{맄?Jyy]n@^tԡ)8)Klv9 `۽|~̴f#UlDzѓ6AƼEFSa8emI\a*2RG֥ǯ ֢鱪N:h̻BhY({y; plk]A2/o^yQy%&3/gt57.[ՠ6.XFvxEB)X.?vﴨβ:uc$Cܷ.~ࣂ ( {fH 7*mۗSN_an;xKo.|mfM_3%)j*A؉׹||Y7s|zo/r")Ӆ>X?ak zL}4b%<^ֻQZ-ZH DwEҎ>J~t@{+ nF՛fV3nCpqː4sѽM y?Ќ:=p~;[>ůկrn TE\eny[2+Ab85x`aw6, $v auGP-dHϧsQN,1l(s: uPcZpn۠a^E_ $10XQ c"3=E_&^\W˩0RD߄wlA#6'h*xNlD=C l58 t"dUFKvaɣrF*6fF>bLyb`6UfĈ1 hEztE/X0 ( !b m;EJhpUSW൹w]m~՗6sPO$=@D=<\yI /0_P( ozi(T+˴9צr2$X@tU%6r&6j ߉SZg_X:]VѨA:*S3Rɸ,e(㴯W#BnWiQ UMCSZ/ڵ!'rapseOGW1[i^ʌ4SyYnV絺07!j1mЏ=%ć2CI AB {O7xh뺍qA'!⡭]4 FVGmG{AZ Lbxk˲N52Co\4nm#W?+ŗbN8Zwo;#}Tcb$JS5Xc팂,>1/ P<|͡$?/gc啋 VFB[, @2AL(?fmy~I>HE  ?OY eHbvGfϗ9*Fb 5[G @D/m*8DI'Y?M>u773^%m#}, 7GRlL$IہH2[ E]ed]p0&s!L׽p\SlD@nЮ*z]1>Lu3#2$ϟ7wfz+8pI^x'"}l=6c2t7sr~ՎxjTI{ѓ0ygx1Czw>:eՂm%"`Ä<$g)rL W6yi*#$;:^ЃL 12>  C4߷BEBj9hҌGQLV45.rfWPQf?ߖoeӰܣ! iĦ1S}A Tw1%`T09/vW=EkNKa4j!gm^7`즅^Yr=K9x:jt2hiw|. xYh!<x,UQLQl^e8ٓg>Y3 fv|tJFΫpai wSz8&-&EEKI2K8!ޭ ~k*X i+Vs~cx\H+eOV'&1pS7^n^Wj,CQY.EF92V}zP //flj6K;Lqد\PD\p+k][Ш*Ű\fJvvuB\RƷS#: ޤˎm x[j2龵*U5B1.fr2T"xgj![$Q ncijnfբίfK.m$z1wɹ'J <߈noEm!pՉ]ic2g̑C+vNzymQ&>X`Vi}*?#A`n{I\t`> :T9r;=c zfØk+ >0< 5CC|X]ߖ.TX3-mue<7j\ W5Fm/l@q􆋱`Ho/*oUpM0r㲳s#dGb02`{Vh i5ǮD1ڑ 7CV[@4y-w9DC!Zr-骠?_ Qa b.Hi~ar{u2Dӈ=ؒ3OxccLC6*M߃Pր7)G Myɋ&~发$0^ɂ`@jXN‹1ZՇP'I[N#!ǣ f.h07ջԌB "lG_ާuDƭ)F㪢;ޜ|7.td[Rs*k7DrAbzip;wwHA߾ItSSJI- _?z]t$EJ*njv߂a˜K*/GqjTr .hDP2J8 9q誢Y:θUHx.?tu{upˣ-cARZAhPTH9mn-5T-|9@tJ1;e"шCHpL ZÁ)5mjK^|j@C2& k4ܽ P `.lE µy9s$;|6c밟UP+B<KItx.yOAi8Ίsa $БBb(p20|wgmYXٱDASSEؒHVn.V< p{ 5#Iqb2JR#4"n>s{.?sH6kdKc8Rfھ+=nzʾ-˗~mf&#"ٲFdkg,%XmC22礨CVk [,*#| fhk[!7ٍSޚ.f\ǐByym%Lumߘ\5KaB4hJ"'QcWUw+GJ&#JQqԉ({JrHVٱ O?wyj#ocmF.q\uh*9nlRl&hU}T3RU؎ދ9 Dd.;ΛO\(}/}^c;|>@!oqWmܜ-pgF\`],yHXtI&kdYs_ܑRmГ#~p̴n{~N7"ٚBpd_MꚘYH ۳z?{y[^/mEաZ?4iAQyoPPa/* tpu(&v꬐uMJ%EYiGy"j: dK a1]sS:& R̖&6Za(syD[$t?Y~-倏 B+oY;mD|tW&x:,!V[1Y*%ঁ-zP}4RRXk }Cc«q@i6tؙS?M 'a ~Ӱ }|<:t|/~ѿHlHIFC2w?a/wWhSY )lDx|}eM=R>/+~#Skey6N7 N>t`ΥmXPQrFbfsٜ_(Q<+N6RG^T>rV3yNdM sxÕ[gI F/"D䃶#%zxF*LiՏmr@6 Tje9~'/i焖#T`gڦ9sR(Ja?JjT*9)zca~[?38m?[Ƕoyz38FR>xPi ӌMdo70ؗ|J!gft ]yYW'2 =μԏ6ǛwАd WxsϷ`ID%PQY҉4{C᭫Wٶ(d =_m%-I,Gg+ PzUvɦ^2^jK9:~KBOfP[HO(d =mC:8v, Rېr`i)gqKzh;dSJz(&?Kr]}n2GVx-mdO)q=sRe  0?azogR>3t2uFi+s 6ړt)dB+_Wz֘d86EURJ\ݏ^[^#d.= HJ<~-W.(q=WxuO*/C'4oWUxEXJ$Egea%߻f;;'Sɩ?az`}B!}@bwuj{}J!2St7@05*V?Akv7ZJ7OFbd+yn=̈́[51t"v0_x{K~F!5_xab锁^[awdg+T%bMWQvqKLGGֆZNFqtsF9k܍6v4l|\ )Ƭz&軄9Ra ֶ2WbdҎQ7%gv%!4-E vٮoHZN4i(r:u4Vf,[:#^,*'7-j=)#2yߏ#B p_W[s%fe7!ϐ`Éyh'-T,iLw"fJ2{R9(W \}eNrSB܃ 9@v QdǖO@3R\U_,/9OJD)|[[NrZ=>'D!\};_5p:XE7z1KvpH+0QШL- >;i6)#e-ܕw/-;GatZN{ ZI??:#JIDjhmidc=#q^B/CjE;:B" )fº6W7?#{x8.NXZHЂXl[..葒6u$%bGk0߿~i$b5CEe(_6] QJU7%@7 m<>`*LnMԷ~[pl_P,Jp~$L5LB IR٧jN|*'=\ɞ.M*ȉԘNm54*hfLqy5JErf6GPk2h{|!#;A{`nAF!( ݻbߝcYyh0gu'W NϿyjXr.?_T5SwOiaJЙܫhiICG\^ūL tGȟc"mE=)a MS?XnuZaSHXa d`%)<isQ{ێuCw(`5oBT&J^>$J$YZ;syy#9>kF rwyѪv =vHC4pgj4+*q[9OP#bzq>5*Hs%3/6fv,>涐/=7<ҤxUXO}emZ>:xG3](8 Cw R>-`!7xi7"rW4Lh4TXY-4B1 % w[E 後p[ G8| q[1 u`:cW&m3~o_/̮us{-G9uB{cJ fT "f*m `9dαsP_jK֌-_se1[|DDE-*vNakxٜ1_Dp yej12@ut;q8mk0^!q/{Kl@4l"UiD/8mlyJ7w&FMP(E_)UʉEŝ۱!BpƪS,hۍQg"Wo_Čqx@Êl'șqsZdhUJ}/7#F6*N<ԎS) m9D!*@cI]3T4HBleO{09[dIw}?2" 0CgtYztXiiq^}ĉuLlG4.N S8%+sUs9ܒRUST !:0S[v3׻c(vzc&$Fn{S+8u0bQ:J*ZD>?-ZP)hqR|Ͻsf"n;;#z0Г6:6K`: =ܿիx]hV$_K7K',3-ļFt^_p!$9F+(-˕=syfw q]_@?@['qe_0l7{" 11u+lKԶlf3Fa[05r|C7Lk%2m9I xVFRMs<ڰGz/o8TLpy/OW a8(ڤ\eұ .qTVXn~3+13t>`+C7[7ɵH Q\C<_#O$q ˛EײN'Scܱ>w3l߻PXI@IC&"Sv0j9IiFEF!4C0p6w0wC]tL2Jy(qao7 m%xOCJ(= ޒ~h~NdtBf5+  $)1tbg^/v*r{N{| .U-oCL>+x+(6\ ':%{>eH܄ G'g'|Mao'^GKhsA.M_z|}Ql݀0mD#SByOن?gdaDd9O]oV֕W4Nyտ[~P\ҔV .u*rB:erW`F6 @y~_Sǿ?dzﺲZZ%*M)>{6r?hm9डm" xv!׀J1X`][m'*^Z%\m]}u J{⍞|1<̭tsD)!{ie [ʅ(f4vI%S-4p`qsJY32RzpO0Í!=1iEu.x|QĬD0AޡB U(IBA%PCG<g.$2 DB?@%v`s#H da:`{bUW\#Fb!vLX/r\kML#"m _U2TkZw#XNr8!cxgHJ VC#N;,FM :tO>)m1x`-qyFB4ꮄy_b=:]5,"K <0]io>%1f|_ּ"lY=ʈN_ PTP`=W \[i-@.l ,p$mIT~ؿG MB\= ?A~t(*E%9ݿV)ueu/>=D ۊ'A>4mg#c˭Zm]l jm~]Ku @WƬ퓪’R\L* x=o^.X}Z7v$BEiR*У`}RW4]99=lujR|5Ҷn-"ssDԙ]u2_8t0iHQ'h,- 6w,tnl/OCQ$h=qPہ6%^@A|@֥^[=@|u"I`iǝSRAkߘ2w.!pY#eN}M ,Qf"gr"+P(q4RMa1jȝ}Wщ։k\#jhpx!HI;clW}Q4VR?K.o/zHJٜ(l$=IQ3)f"rŸMc:o&hrz UGYCDԸ/>6aoL}\!v炯;b-S rM!GzNdm\В'S&ވY[dm8= 9ٹ7 q61T7U Me#0ځOq#Z&y!e^hx _ڢي%M-95Ζ5Y#Ei-:~߷E?B"ؖ/][4\܁@1 f]Pݞ(au 7HXE}gDH|µPl̫ $Y?)E={ ԂQadu_cQ7hV]\y#PJj=~`~4fGP9./Qpi$ti;ޒyWϮF1|NRFd]Jle(-ۿnѫ'n?hsN=\=ǧ"V`6ٕdym&/X"IHXkaoNV{r-+C)ؤa_2%?xj(Љ6NϗĜ%&ޓ(J 6L^s0NN78iJ"$b-Ds9yzIsdI9_D=r%Đ 92YO^4bߌ( ,pca.{4& CT׿N38Ս<8z <7,+WE)_?uAo7h2WiJl0d pYhDFF0Ը )eԧ"(Oeyq-CK=#Mbx@?nԴ:8)!L\SVh$So> }Tk_'3t©x^nEU}-y|]r]7P 5]-= 孪TJ^Rթ7N|y {1l yLK?_nsQ+"3 p芺܄@XI&{LT=z@pj@&)Qxy-g$AcJ٧(V? C.\!9{QeAҖSٜv͗:2^=J_; QC{wrŖ%Җ]3ϮA5z:v,$8^P2ΫEmN-rji%&GrkYZ!2G[<ꅮyP.{HS{R.Q ]~}_Id>nh]dYB mm`Fk'7j-ɤ.5"M(VD`AeF{W4rؿm|-ih"ݻ0O˳)gZR.NK6]gf5PV~^nvX(MJy<,ѻHt0n۵c:og.:p'Zx#?Xȫ.Bw@[ xYR˥{,lWPx6V6kԸWq0Y2 }BNJ>m.7"Vʚa"׀pc)`4Hm A9:~ O6Wz #mzԵKc+̿ 5=݃Ff#-E HDXHf`gݿOkx׶n-358e2 TTmgPZݹ#qoJAwKvOAڸ4>iO^F )=wZ b?f ڍy-#(HSjee _KFox(] "ه؊G5#/b,\h݆GUUWIQjlq-DLTѦ-Ӫwg'riS( Ҥ\0 srv/ t1N= e~[Ry! mթ({Z0v[<q?qe]-*a/$hxDЬ](>s]4$IlpMnQZs"pW '|ܿ\H<&ɂyh?aT I)ZdCEQOwn^>T{Iu/1hS%9G]q0c&B(]{]ԋ0+Y-%K@W-v+q[#q~Pe0ϱ a5χab8-%&Rb׀p',@x/nX!"i yolT(uqN%pȝK}V:[ן)st8c!bPyjpƽ7N6.T-hNR1R D? v"c1Ta뀟!4~)vz.s; \9᭍OvI4CCo",qлtDOa62VᝒQ̭ zCI"?_WT|1#=@>V; ZهsX亮bvԜtd9<;ypNOvM\7@fǘ*7Dh)>9%5.ic&TM +jY9.OinuiL8Mм m|XAZ Lt0p6{ ion{ 5 t6!Y3Op9Al\@ }7dĆ ߳\;gJC;op,wp,@Ş\'!n ˥dM|jN'0oI!O=ZeLK-ZNweV{. o,¥m 4095cFIC4\&eB8n2&'[.HY;cLŨ8`/;"%&j4[VkUϔ}͒Z9:s41Qza&$LKۭGA(gP5^q'܂Df}%MT'%%Je/|vC} '7"%TFUaTFJ)Q!*p8 (rUVyU:rBn@#xyS~۬!E O2%Q5p8UH#95ggla^ًB|$UѽHJ ;Y}W崜MpJ ДQ41_fF;ټ ¹Ek5%4!ek\]bF^Q>wa/>ߜ=Fě3!ěw bZfX~ `WsU-GVQ q)! Bss;h$,i|3\۠46^\M6y;B3BϹ'2ЗǮjl"+%N\]蓹 \U=v[2fӣ^'wOτOk/3W<9o x(h"qc256dA ̥Kh'j$ »?С@:H0&!%fOGpd7aK\qY3 4<׆ZťmQϲK75g1'[FmS;3q;R螄ߞ=q6)H#95]5S) OG~ 5K\J{V{Q^ҬߖŢQ^Ov>bMy $yG|NⷺKQcJ<m3mR fs<ڤGAnw8iW/ToC5/0Ĥ.l:&rQXڀsV`2KVU,}S/e9şAY6݊y:A-3bTףp4V_(&8ωQ~Y5 7%S NDϒfYњ68fͰj m^P77E{?ZZm^xg`j[e|@PN;&v 3BmuGyU=m `;O,`+턹jP<9_hڿmb #v I y?;kc0ܬIYaȜn6vOzv3j~2>/8=1然QJEbg,&۔^<К(`#Aùߨ~9ثfzS* ׹bACԁ&IƵZsV*QRS<և4X*'ႧmO./_bbok5*U`YĽ\|}}YxtcC\Sb_ԩ=$kyt/7G Xp<Iؐ?)xEU߈ePsșDOG@_-.$ZyW6lj(n'V*Jd>R^g%56zGyy*nwEڨ6\贅rd 29`%5},_mВz9rOW`(nBB#E?c\"(vq6"dLb/IJ\M+&ς=FuImĦB5?aى;swO|<)S.bXMqA.4[o?z/T&:`䬈YpUR$ ޳^(Nͩ>?XκE͚`c,/̚=/sSNaAXp<a#IEPsΞ?__.iVAbJƇzڊVwYb\lWZs :?)Ury_aqi fdͤ82|ѵC]#)٘R{PgU=k&pbC>0u硼"VQR-ш{iuT}hGmYXxQ߈Þ"iufфҜ2GIMHγ"(8&#Ob\ " 16%CvǪ/86)TͬS-0z OI*#j6\}ܼ ef&!= pߪEg[䲯0X6X 8T ܺ1XWʗ8-^I?-iE"|Y.Ze?APUO0+OW4JmǛj XMIQ?L )@Ƀo 5Gga͇X6h⭝"߮k@ ycQq6#vLz}s}EKmtu W֫gfwQ9O_o޽  uϚ#D C>+}ƾ&%qgyW"g-UESȏɱbm@BoV 9Gqk/p88jưfŦ{fҪrg7!g!sq[bǕH>O ^Y֎+Tт6A))̓qR7mTl4(&=Lvs4/30_9_R.&7Rdj^ORim b-qTWp:#X3FVwgl=hbDR#Q: Q6$s@E ,*m.j4re8RJHDQ *]0l@'[u5X3fӶf2cp+jsN(S0 ;WxԼuǪSdLoH[tICUfttN#eI&bR{LbbįB蔱dys}7k npKHX6Tr"sP F xʥz{ZQ -31<3g9ZVXMpcfBZ5:9RR(pvIxBvj:xb(L-WmRR;' uYv}ҲcUft11Ir9{=|f] 8Cxtwx*ė)* +*D< /SHeL <%zasS]ۀzQ9Ӱ)S±d_KvH޺6xwRuL .hΑM`v'痰. m2JuIT-/'1\Llk@AИAl!u"ilr:-mIV͖IS}þ~lkq5cCGUvj) +AX >.T >v^Ļ/i <SQKZW G1Gؘd9Z-7F[E`ͥE!雈=fio5h]&pG_t@(?FQ.OgTH]mcdDϤ7؝l@:$dOvojgib*g44}/N׌fh&fX-yOGeFܳ+;k Udz^-:> ]-{Ѕ,Ū@yqRgiw:iIC7K"L`a3NfeεqXYjhS(Twg sBy}d I $MǍ~]>/?g¨VdsYw]Ȑa+mF;xJ!uLapٿl-3.F`@> cI8錁ʓ7絝#aBCl? i,|[Lx<ϳag7b6!NZ .y0$Gq9٦:Q_XEAqUQd54|Izdɏ2"?ހN!MԂ{|{lg7c;8:zӖ 1-U0 0n~]X\% (_ɖ]:H}"V6K\?r{|]F?jꚅ>bδۺ.C*gdJ oQzz(ֱNk%8^˙U|ϔag7x.I ANF;{#ʤaxȨ+sIRPH;%%ue 66҇ϗv=grt%=`dhj%Ҹ-JSK b+RBl`LSBmaC&UDZ0<9#Mڸypkɣ87e@ԳPЂkͼB{wQ:SN;ԑe2WQYg{%cvQ~EtLN|(xadD Y xKr?7ZSה8, BgV`.㌴FmrJnOXmwp-(C & D oo>q?]zӥݿW1BG&X8+,3`M@P0Ôi_a? ,89HeAFѳ*J*ݯ5&j,|BlLMHIMR`s-2, Sr (,g@4>Jތp4S F0JXTŪP2Ą>7elQe--cj2>% Jnh_ffҵϗo6f02bmh5'4j7L}>o}f%0#B M=82@{ x~ꎘicQ?alߡk3 .# 6[y_I׮ x0P5$to]5)Рg:e<\.Qױ\I0R'i:)1% ڌ*YjPmi [;T*)19F u &xnmޙnӱ) G$GX/!ǝ;irbd(-'ݗRIӘ̶K?a:c$qi>lbLʲ@w}_7WD fy.vnFlʫm}}$<d98 Fٶc]ɴSkbKvYnރAg2vi#~tV3+^)y$@٧1Hۈ_r <,/I,3cPQG9}y7RE– .&{2׋. o %/s ߛ=Gt_mmg' ]:3W7`WPAN $z$G5;0~ ޟ3_cbP"&ywx Xؤ }'Go-ԯ@;w*%m2̶O/Z=ħvʇϧ( ʚYk I|LL"ZLi:b~q'lȷ{I†0iaדiz>TOR7lF1m{Dr}LA߻筧j~'q!?fu16F8U+ݑ,d}~- 5R9hAcv}SF|=ۤ@8i﵏N^TH?LAso>b;H2'O=DlU#%tvhq9#p"LO{I7Yp$#V:M ;c9pW_/8: P,a%Y#Ix1IUV8XPMp~Mu*d̄(=$an+0maH:z2{q)oԗr36eoZۦux}3 j>JDW$o+o! rl]Quz &o3`cOL~S.3,Q&]se]ha#5#vaぜO_ Sr6ặ }|X4Ȯ&:&8o.喻s`R8U/ccڊMC@L gb&a+7B_ q3 Tax$cz)QVڊCuB] 8m>|ع kJ$QDsMyTߞ!~ gk k<ж{jIYT,Qb'a5ZՃ,As d&am+ߎU3o! 4~v:'%.1pA p9B[0߾bчĬ-̙vi7)SV袃yw|! MKDtg1#D֦g~&5L`l&3Q']M}mvH+@ .E~\:1kҧ9uB%d(!:i7(O#14#?odіN=7֦1m ؐe.:QQn6k )g8n0 ז;R@p !b6CҎlF!i4;4|Qv-Xe*Nqcre4"dgRC8TAsAI?ibY>f\u+-I۲5oi?Wkw|$<0꧘ ܯciǍI;ڞK*AtF<'"/&!YiGYKl2r|ؤ? WBq1mjv򤲂>B ff?lƄm::foI.sRDaxG'=s+ fs$nfevJqvڹ w i/1V+4sINCZb> 5?-vE[𝢙9X֛Rq P@ʩ:fk27f(2)ǟN ѤG=el/˖ lcPyvAzC}ZA Kw$66 TV|piIBi]qka1Axa?=cXnzW %oS!ZLMVC'JHVӿixټ-Nqi^J D#Ġ")\<\U A *Q_GPeH$0;ep`WgJUЩz?QG&Мe_ȧ<\7<\Ki6H)a0drC<VޭΊ$\K(-6mܩƖh̝i~in~u" nx8GSx9 {#~_NXJv(!R+KcHWDs~%b}!E9[Ǝ3s^;-7kjqZל%GbQ( L4k{[uk2%hkh1XX|1JucKl<5ixɣ[ NMcW* B3#A^\o=tr<}s:"-<6PA8"\ B P>bMRi`IC+*]w珗aȗ"=`!^B@KMݲE.FdQh] IIg$_C[I58X։T>lyҤ<0d.Okձ^uP36i"eb1gH{yHYGYu%R*Eg+>uBЕ ;0idA;O١~( -[Aǜ &;I 'Ԣs‡Ibm(`{?/Riv!z:jμ6ȗaJ1f&9uқNduABL&iXuKb p`~.afApX?` `H4ܦ?}eUȦ3bΣ߂# 4|"c>Z3?86z!4Su'gL5p%`4[2תG&^6/Kp}|ȬX6nj,nȁn8B7; \j/۟~s@]orڈB@6IbVFvEhymYn24ƅ7U\gQ>0E+ @HŴ'*rzcQ1V`{;xYz=w,ϭuuU.䫦x)3dTBԱWId'm\lG:ym$).Ĭ(9gGԥ$$F4UX`]j^84;~2_s0=5$6>52>QeTuπud R}6oo˞@ Ņ6o+Ri{RYYe?EpOW0J2bQ(RF;gܣB.[$ԳV5 +/J9 Q]bprsR8ށɿoKtIdp21:=џy;Yz=^#+ *ЈZJ jeP)"*bn#{4n0&3JF g "1f`Qm2GC>XrI vlw[\ZaF7XW$[ն7N.06+[7rɲA}q5 G(ů"r)hpK0prP|&^K)KIjd;3Ir\^;݈ԖqP.Md;I-@4F+fâG1ؕE#:b:`nҦ&;,LDR2 7? ?QQ1~WI蚏OJޡj$2a2IlDbi`oo{1{.%ec|LwOrl.mQ,G\emBy+]r"9;f,n-,hnf-.\(qeU(N|FKJka1V>v/f-,KUHEpB >ԫ,D #|>H2~ڀkϐiʧ>,@zD㋘l)VI·E*̛܋ C .tD9\GvR$좎^c2f{=$6yⓆiwb2-h1 /%}zw:Cuo]foU򱊈/hVX(N9 n9_ͳ3IUYh~_aYF mjAgu;3ۅP4ZNol[ 1We ԤAq_Ӷ." ^$X{AU(!c`EBκW $|>~ bK׮2+[~]!ӞnBt?V4wx#b*jgn#{XK|fp! \,}b.Kt$c_T_s} a5۶yY2aBa} fI.,tL[n&I@W@ixT+s!ǼăPМo"e3x-2(AX)d1ql\AmouyB1f'5bc? sbwIU#8h αEZ7Z bt;&ܭYD$2kS_ ~0ym /?9r !%gJ=+K~4Q{U!W3Yhǃ QI.BendOӿuKI@ nO3a.?T\(:ƪ&Io"??-tg135 GYTEY"XmZfX_H_aLQi;Tda%jP!L{PpۨfM̂^ɣZ]8MFϰomZ]3z5+l?݃e0`M6OF`W.k6FKE<팧dnxߌ!q?'71Y8\b5r]ru#-!z`v@`_P0{. e/hNfYx; JL;$Dhhv y Jz}9~MYAƌ/, )>F6:y:i==Nީ-4␼^GZXFA~heWFˏT|g#Gi bf<5IAJKLL^bZ;@q>XRnq7vB*̀Mʱg^`' fDa0CR~Y}' $Rs=53 |khp!dR Q"HKiGL~p-(< 0%͙sSU @JL2#*mCFgF0$+G6v?ffcKLgzklBp%'j%On?IW\eIIx\͗X]U62\]&yߤ"%Ʈu?cm&qz1Xդ ⁝+UY1Hld&["/JYXdo "`1py1iPxK jDY\3d O(oˏGP9\i7KR D$H%zHfdvB~O0 Y3Ov%*vAr j`p9?D#v_)L?yJȓr%F@?n"`'`q# ª\wFpH4\9W,n < 8#|nUwPzs9 mv#.ZtBx =41];ELIȰ^tuZGc؈?pK2T>iyẵB;=+q̱q]&y T_gCk.ōi̮p uw4kݢ6_׊d|%|^NS{q4"ggŭm¿R5_ݺN9 R<x~ǴOOP<p Yh"f< 7g2_:-g=q<^eAFfJ a2,?#W/j&,B#5; "䄝J5ɍHg˝?!0 h mBxC*W:?~_O΍ROhLrO5*_cPPuKie< |D<~pl(lA]ŔK+^`$|M ÐâorJ ._eBG*SY-jR.5t)m⎳㞃L(ik͵٤ hNjq#lB 5m`_"Sk۷a9Fx rg$u='[CKz;dVa[ ؍ՎiIւd/W8<88\&|<].e~z_6QX$. xJ@W^"բa0оTB(>9&А39dx4FM4^7Z>6mp :_]N\挄CA|졙SC. uJNv@(˪cdS)n[(ݖ}ݱNAC?@MMϗ#wZhzu[ iBmR)\an#?*5]OU3{(a2wp@mؑi KދGeΟNz^`1ZۿM_ vN9վÆsfۍ!y8b|}nє7Og7-|QG>Z~7<:vH]iuDR`B%fl'ﱿl-1Y5/*G{B8ֵo2"{<6u GI;-3XPa\]F`EAKIY!ZnZfdiӔƗK/L^ܥL0|t|-xUV6IBTQl]&42Gv6ͧy6A银З<bG~%I*HQᱭWgS~8c)\ۤ/6 "YҊKm1AX%[:̃ Y7A0?Ht!{S^S(SR>Emb*ytCP?n)c-j$EQqS%Ƽ g~ܾl9V I&3 ]ǣ2&r|9)DvR i}˝.D.>VpQI%Ī^&qs|q>-ϯv<9Cʍ f"4n^qbУkZnkDhI5 ]+yGޗ nt8yĻYnsJkTA>7V߁cFm;э/wEGhf1 P{ơ!C~Ρ|%t5aJpP5YB!v[J։6eE~2bgE齭+Br`4 .=+v b~^6)ũ5Pu v&\$ Dcjec^ ]&~QԒdE繨XR+aSrT!+Inr0Kr'Ӷd A$bC؍h]cE+\gjzׂ hWŒքxi3++[]ODp5❱RAw? d땲_ $aE: |}b" p1&!]'^ d~f[Lc+ڦ@FKF`yE m0ꌻޱoO(XvH3IbcQ ۯYx:Zn|P2*ILrs͂tl qfD,(IѢdm9 ꅏXstN ֩oNkQcq@k!Y,=:?O&$环O_+JmQ=I.0␧N=SFzƢaSB؉"? i;.pS$C(Ꜯu+sp^,W%*Op9v&E&UއlDa?aoN\ NU ?:H[sBՐZ$;FXb:^e}Ac?\* F]оr6)4ҞtF ѿ@'>}L}1Ϟ=_c|Nھ\갵 3|~fw\yp<&t?lQygy*Sw@9ikSp7k]ТU?z5fx'**"|Ab\j@"Un2RT3yq[kc0 ƴvGTWuL_|^i/517Y'1xG.IdNT=#>2;TXkZ )9[S6xLIuƞi Ư>t%±".hT8f6iWWat` zb<<_Sh Y+G yf46M2AaA$*,DJ>4:W I: S1%XZ6ߨ7*)k~fJcIOP\ysVrS?f{rV7dJ&-7<ާ)b^DلL(i;tEcxQ`\{:ɴtdzQQdrUNK%rq0w=Lr!XA(m[j>0D0zw?izֳYOr,ϏY u5/`AB`4禄ij_Uw-`.(l]r.Xi4G5W]NӦ񂵩8{̇- NRv NKBzAxMB5USe#BXD!VAˇ`9nO:Q"d|n0*rGIUEם5JH3Gk&&Za\O*]8 xxrP~~8<EXYo#L;r3h7tW 7bvTHLiI(E5*€N O7$&ScWK-a1fy]amzد ]#&J$ZtDή#j6ڝ+fп?~ھjSz[֋S &B<#=-WwPA /TNoyVj6M;$ikE'iǰJN4p,/icX YthgO~…%j agpW;ߦP!%U(pjjbDZX녝< qq0[Hm\Y,m]Ls,mHcfVXo'!G'qǂ@53͆X_Np"G1Et|ф,#ӛnο ͽp8F=<]͚ ǯ8ID6·ΤH7lr_95Fc~dOOh{hȜ*dp*# ݹ8hFxB;Vۗ"6-"֣3n*V)yq\J=*H)iR,hB$(2 F~<3flkPY<,dEB "B8rI4l"L&'!1h9a! ͝-Q%TJmuAcmJ1sxG+lDp qP٬I Wr); M0 Ć{E=n7,I+Ӡy61# XC!Ȯo}3NZǃT-3RP" YC >a(`U-)r38!b;ش 9ڼm!}NI{NQzF Ǟa2ɷ 4|2xy }Z\~n+fkl8u9ofתzƾ<:g/i1yD'=x1:!5kHSOIJ[qv:-]`A;P͗"8}2XU> ]&1XgE1FגY9r㓒Onr؏X Z`pt$61huM&ڇIIfcļ$[6 c%(%=X0gr6b_jnF*hTy"䕥H@CIV~Rж˧o'lRk,MD*NVRI6aY {QVM(ֶD^UbL)F#8YI,Y_C!ȉYjpo?;OpZ;/w/Nsݸ M^Uz">&L>%-hTF>G,`11"ƢexqvĝLzctvI_y;^2%uy s^g"D:W4%& ?&oOL`T/է{Y5yLQTRwNq6 `ݨcp4hQSȎ\T//;k%ɀ_=хg;`F͞Y3&'m0PPix[WY_W_jO_PP;JF!藦熋O7-},őÞ;bE,_7 TcB1myA^PRsh.Cd*P2}(QrC0x U]mn\^L?c`PboBŐw3L/9]sGpO.R,m܎tUVH9Fi`|r-Vhh;5ĀӀ'mV&%Q̭Pi)NF .$p(|d:s 81ypsUȼhL-'$̃e+LJ$V\1jha7 /{ݺ̥\͔B- 8\geyU <~4A1v#&$ld .YzXOA֏8~`!3cJhjS2rp}u'(N>5m6^D6{e(-m/, TibTwXY[%,Ä_+5pͮWFƦMqFJ*1Hil, 9x$\P16.CAk$ŸŜ %)H{;o3w5S|(Mѡ1ڰ%x+|R1+e5Fkrkh 8 mS$*YK*!?w'FJX!y|"$&!GIϏ.[V@|\H5wX[2pU@l#2J*Iho2HR؃^$^^MKVK&]B P_|}F՗gՄ[}0, 2E}(fo":<״/t=' ;!Q]MMC@üi9Eh XNڨr9iJ~s\ӇZh>ʚqc%)XGO>5mB "7MfqW`h%bv`s -@ĝVWRx" VA[t^a^~$6SV^JƥC_ixwԶ-74M$5:\[M; {†3ѥ最O* Y| *I1[vFZ*-d_@Q p[$ +Np>oK&PADɟ](Ba&C ;H|+A☤mso/y :#*%0dl ɦþ?ϐG,o ~edމvI V6NbuFFA1u$K\ *ϒ$v]m/B*0$ʹt!qWyٽ+bmtrOs~Tplce@%z|dI7)m%hl_^EYŔA6 aXY+3V/\E1_))h)Q L!1؂Ƭ<&CTZx=`vBT9BJ[(tJgd_,hɌ`jռt`"(k*VS7l䧍dIn?H %_l?iHѬ.:ƈU]1,iY#y-a45Ш#fzVI+byaH!.A%Y1F2(nF&qm6n_Ҹ^YdXMh{ !CG(x~}(:'F[θgoE%O)IL !3+4M;;7ME5˜%ɰ ,hPgJ^I{ R"5d59EHGZm͏ԑO&~O?4[iyxZ>Iz  fDK[+1YXNWLgh˾#<9 9ac9AU!&#w n{#/ZɱO$?y籂bz˟^q,d%]h8hbsWag?p_D馋 T)%CX[)5˪5|WTu4ro1>ڒ6̚-G:d>j?7A";MRYgرҐpׅ:MC q%!8qP'ʴN:R !n[LP,b1ɾW3mzJN ^~/"Օ#!qeLﻁGEmְazĉim"-mjddJ-YH"DR ]Ji7ҖGP]xAdC.[Fɮ| K)>YGh {afNeܳo,MA߬-V ]*Lb~}1:"N7?u:jYܟ~,5B!Z1Z5m/h D:vzĊKorE|Bܯ1L0s/ “3d"$C=W{MЌMK63<$h2^Z\I@ۮ0 F3&Y8Rt> 2y Vk،S,b}$\ /)2xZ̫Q`M4#b`Nr|75uP頻,ӹ@_o|T(I;8%цǛ<1"W)7 hRfJzXK:L1MD`~wj"|,Nx7DwԤa\l(x7f#64(f0U"b$1i+ Łbה6)f+GQ]ɕH-3@AJjKUUZu W.1r5cUAhpvDwxXߌSrThroc#9*΃c9 lDm!ۍa%i*/ơaFM90\NQ+ 5|ƅ ͇yC¦%l2 kW]#XUyZS? ª*+j.Hy2l}ZpLJ"KNuڸe#5<mnNJ%QQ2i22iQq;6}VFSּAr_(FӪu\OU+⤲zm;J  !^c9^.;@/JjF_TGٰʼn, *"m ` 6w P9u"Z (42,"- 1{dđysFh("M'͞QvYIڌDϪx gt c]ڤX]G! 0?3eVuCx%xyTfz2`gxG5Q(d߇ !g3eq>`je5H ?W343Wi;@4@0!k hg}eq<^GX\crBm+CUw$1։#3shh Xl*R@>)g8/ӁɳT[8 =MTrռ# ~6ćʌBCqHj^B#_ylH6QDEi(hn"%2oj&ɎA)|Ut~Ri= guX Sms ư_cʦ-8|1 9'{\)h&˰/ԬvSmDrհz^0;"yE UoA.̳wr{펉)j W7-ÇY4 * n]lzw9V9O~N2s(P&Qm1SAhmR+A$g577eK+ ygU QV=7x ԥAT0 ĥ:}pb}Qcgl0yIa;V>"& ]_ h.P,m=jᰃ TJ4RO茳sPI&ICPLܜxSɥafRJLyεUM\tHU񕨨؟UI}sTދo$3_xK2܂M__6YU]nֳK-;]um )x?K[ڶlozeYTd&~?C̪fU5#Y@H  RYeH6*7ŏOz:m`Nd{$x2:Tچm@APZ5L/T #`RpOA|Eʅo8^7}GMŞ5_ꁿI:  jL:W~à5VFJkevʬͩ=59*'l'=|6 C c Khg~Dyܫ/IkϗpAkƢ(<ʄ6uuC +ݥZ?Yb&vwy8'&570[N pDR4֜Z-ʼ҃&r5W#90 @OÉ:'JZtF0׮`V0T=2|"C_ UA{Bts6>y MoiB oiI>˖1'ubɟ'L z% 1*sdS9jëJ"XzK(YJgt2Fyd≅תR.5y2N۟]HM]m"喇+\H"m']"/]jSȝs6 v=5}L2:> b|;!Y;Kźˠm1/LC !at q5K= 0og~jUP.ee5kIE&(F2mMĪVG~phPɒ79p_vCyr1g.چ{mai/2B|*3_MEá(6We2QrXEPWXTYCQWiآc0rx*< 1n@Έ+mT"tMg M)׫,q;dMPP y*K "6=P;o@w_zʱ~p6Cwt<#0{,v=Ny9 yJ q8R/&E41e0E!r.M o^4W96LKl,ƽpDCVx%mfoT񥝪rs* _)Zh/yV CA,*F]I/*k`:LJycW[kn$'uO/wb*GUr|w_kqWc.=uKĐdbtыV I!𻘶q2*.RZm=U}8„,y{6+~56N G,AzfIۂݔIzc{na*fu:wc9[ _VP0$ ȸo_&k_'|{f%̐E@{ 4g[ 1L;7p34/rr9ʮ9 ?.XiD> ~ȇ ߰=|׊d+aoBK2A$`?v|,i;!{_qڌ70@+gjsk f,IEvɛ;/=i ׯ{xh|(nk(M͆7T&e> &5X.Nw%3\~ݞ4~PUuZ"e_˘sMƤSA5W.9 Q+(pU8ڎ@=wm;3-fe, kiLJLH :epghb1r颣 /3ZSww|"kU^6W`V+)|QFmN?FN'rc|wZG&bQ!TA!T Gj8cn8F) [8LQB ہ{|>v|>v{;=_YVR[ R"jVپz<}ߝ?.|6 Z_ijLuc&!Q 7HoP4vK}eHփ[;̽{ ok] :ei̚IqؼCSж" 7g43ȗ||t¬ԒP'Kq-(MT[DW@5SNyx5Tc|hWW߭ VgX R>6.Pc܏;g\W*!O݉&0 !҂Ĉ)8jP1;DU5!afH02>-*I-݁n@?z瞅ӄDł1%5WC9 5+š VMmO 4 ijfB,ea&st* }IyY,8^h'^'j_0 &ֲ*ê5ʉ}X>+dPw%Dĭ)DVQ h:'I4'Qf,Y ̝8-X4$(GP-,Z]Pcހ+$V?f.AM@沝s BX/3 ڣ¿npmDK4OkBRf3ʼ, $PJLbWv [ClhۮTgkx`kvaFʬ;6*T]p߼36Jdd;̓ f˶ˬY1/{M^?Rf^&+cJsH 1dKL[J2vqVrғm$sD)Ιb?sRϗ^U`ѶU,1} bkz^|OEjS%~Ó_] ᅗ%Ea U6l&؝/H}ids;`ReLk% efRo3WÊ)QδǾ.cry^ڗoj`pv3S#Q*v#~Cqx>T8 IA*c>htJ?3/XDsФ*Z$v,1L5xM[qP*QA!(ٷ:<(:2ww:/Ϗ'`%[>d) xYB2Į|O*c֓Qyp*?Ko!Pؿ+A!`97[$j'Je%VDu'P*Yy3/ !{rt  .^3ѸNrmeӹ 1bHT^ 0ۓcFϵеMOD,lhC&hr3!sE.bȱnN PxᏵS ֽF^S%';kg=kV>\28 ?S-i%d*hK2;[Uڷ;,iR,Ap@4\hTIL\]E zR',:[lQ̺-o 4̪v`'KQoZޓlb,לhI-S0tt .TN\uFVR/r(E%\<]m=~աlXA94Be@f@qoِξwP$}NM[p <]9BV)W"p+^.E!ԝ'WQ{^yFkY*>JÕV%w!ѶB  !|Ċq/70̬nhF^;]l7j˳EЦ ;TRB+6Wd޴|>V*lvy؁ޓSr?}<$cx*0qKbtFX* +xUl;ZF#|a IS_ܑ("+nLcTL63-W_BrNA;X(!E 5R%5櫷Kp4ٕqIMrqsmsܝ>lv26?FcDf@3a[ Nӑl  %L- y0W4Xs*EҒ /^?gD|9F +Ѓ72l4I{(qK:oMƙ}f-4m‰jwVl]OSJUFAϨ(gBcͥ S*͉Z<$ (91n!agQ{jwZ'@(k ;;"c *:9MhKU_#H'[L8rd{F[ɚSH'"2R!R& ynM}zu[Б:+T}#A"=p9S4r9+d%cRkIܼ xoSk0קm@S*옲emK(o0k5eP>lOS+"0Jwa*ԍMx_@ּ%ٵ-/ڤmݘ/kr7м8>k)) 9ʩA{RʦtPoU𞆱aTvr{4/J'm'M3z,aS/j¤J΁YN]%^N]C}c屙;Ǿ;O9ע– [&]Y|8Ss֤/*cS(n:* güf1!y).BOfF8Gb^ĬN;?lG7wbbm`)M}qol<&s[aPCTI`QLbMG{]s1#Wl/߷~ҥgA4{؇*a5Qh ;Y8Ӈa3=A8^mCj2F^"xm3 ^y$^Bt[p7Pv˔:zZF0g⡟Z1,@y.vo~x{T6x9n5^6-z-#S #o\mUm'c+2A8:YDJD-0xf-R_UEIF=(ɯ]q/x‹~Gh֊춇 ('?0ۃ՘(AYznFY o?|<<>N7tJl5Zޢœ(ׅD\n 7P 'z$)o$VUä|-mR%6@%=@;<,Kc1<;yZ>'hԿ)5rXR$(ŮIGmnGt+H; $1ӯ-fw:.Ǝ1~p.6klmjj:C]ɗrX:q"gǧ]?y_ RQ]&A*\# q4St2L!T(wTYl$r0+Lax7_t.ֻDnivKʘ0}u8^xgVﱠm*C \ad'UqȺ`5vM1swn ^^\1ZzyW!^`qX!*L뛹F?wgGj<ȵw=J[*V&lҭi&ݜES+ I(V P(F/b&; x &/+WM"_21f ԟApt$~) Mb.bɆ@՗7vq/Sn(nKQWj*s=jgx69C.$}47 lgQ,;{WeFYA9SDvv}ʃhGZbȊdTc-1STfg=p*}l)3"Ώan2}7/C:B Y rF{ sނ}6GQۂ}G2!Y g^ODsʛSBPq2h,ǓdLKgQbR7IPsK6nÚu9(4"ze|s;Qr.}VxcӬ:qx (0- 6b<\$r/_ e}^Ѩ\6n)0Ť6;"28}E!ܟ/S)Fmس[<"hx+iƜ}Z|a2jCA+ڞ&ae;4- u 9j(82 PN 'g@|vm2\y6mzWW{N^ B^LbwN0xMh\)ޯ Q^5nqX7ǧI)/mǨ28_>OJ]wۏ/ 'JtWAk;#&S)!]/Ӎ/dnS6'ff/P,{z^-a}Fц3B-TGRΉ޷}*(2G4a@OaǾ;/ !nZҲ0—R/1+}]Xk49# *XAkq3Qˆ(8Mp˹oEviTo:[6Fs'yH'& '(wťFE`2^ ze;nHkqFnA(Jo//̢K-נ_IB4jҖFѸGr߲L#vE[5M WC4ue/L*h_}A|H p7O#iHE b>o}d8=;%@*S^ 0+X_B`^fa TyL}ee`,W k@#kRuP t2 4ʃm\屫?"da/O#coG݀Haж{}I' +"?sdF89Lbe6?M?7|2t*9mR߇ۣOZ4<7D \#Š0x 0m{$]PW1s\ک7}U 8!%mR:x 10 >/89C]¨_GN.F\$U͙|T6e tR8~IW9^HV+$c\Z|:4/k!pNX'f+,dr%U|I1 RZ47ںB@05zg<顦VOiٞxނ"kwX(}L[7MZC ,-h*6Xժjq>2;Y ގVV_oo,NLT8B4%zTTUL<(^kP#&*ׅ9)}Badjr j3M<E!Q(p*Vd8]=N5n-j}Rr77(X=# cW4bRA`#J(S):…x80T嬞5qqp2Awaأ1d%>' IX*rQἺS 0E̵=gI??>9*~qgRm >PV菻+do^ A{,h5ztQ٦ Jg%YtQ}zL9M68gH^ImH_(,sͮwH%_:VLwH>FK/}it~&\5z ù(Nd >~Gu"ytb-ѠJ/GaCf:@y(|}bR&]ca53C,.2^=ьx0}wiಘ[Q&M(b&a]=* 0D^Y$FXE4Y]a:+9ZʆTrhUvYt'dUy@'>k5m 41P2aƢG`B iwhiP7Q Bi@MtdZ|*ӂΆ-U|. r^`}ڝC:Ҳ DDE?eoHDHqϱZG¾Ι%ز=M7pô12w`Ar~T)NPV뢓8pI?r5? (hp+z`@Feu(nCohYKN6+\ f}/-O"(4 - 2]̬f1$98E鶂8ع45+ٓ'=3E"p/䴘1s{]Sq+8mg{` RFH3e?&I͒vT ж$f6Lיc i<'a N%Fe#w`WՈtYP ?}9m3N {t/=aZ *Lr+ 5 h|MI"Oxm{V# f[yxa9=vxdK283,;m̲dmؙ"]:W]7li#,d3`Xdn?+at75II2Ml,ނq*ҽ EF ;^-ݫ)d(08?3L/\",DRyЊ܁&3 -L 9jɘdAPY%lXsUC7߅TlY:BϋXiayD@}y J"//#9#H+0w۴K? ,"+uC,{hweQh0h?i-$V騧_SC(q8ɠd+q}ᶛ?W]αB3j\pngNw| VڌAn;&~A|аd$ |DGZq=re>U ~$,1sB(TѴTi^JEYya"lsyIȗ G1e *'!sT+#Ji~•VV J%9P@.^W#fxV'0)h,U [>~ڔO@"6R`mh}Bs>NEWsD]a_Sr0yl(Bmbi2qIĪsޘrxgL%V> Bڍ۳NfJ lTp0XFˏ]wG/!ى&Z8-2r뇹5"BAJV%Ԇ6@y=Vsw1R (po1Em٭Z_{`%Wsz7-,Li:;?vK:I s)9bfOb۷ӻ2aczh]#1BOГ%_`S?=,3]N;MjYc{Fܔ5a9@'F O:'z]ҙE73SQyxaڋƘ":"!V*u3=wf0жgĝc .N2= ݒSQ0ӍGY٬dj!%&#0~CcD%>4iM27ڌ X gpxgvb  hN )g`[`>t !9K{Mfx(<̙S+t M0?pjJI gpY MS VN3o8n)rN|LZӚ(@B` (#`F59" `LwydgpAӰ+W[w9i'68heAR@I^cU)^H iȵ' c.' \ؿ@Wa_ä׀, #E< DŽ fw!3Lz/Lۍ_̑a͓S= zv9+9'&/TT]P1]7ʃIbٺG=n0ݦI) 1RCGMVELuמ. ׆ #IL5hmip*OJ]6c1}+ ]P_&IB߫>< gsլ)J Td /jڍ~ נ|FghDeilMׯ̹W u4./T; HV7ԍfӹz1 ]H5};Ƃ%Zz!!CHeŽZ]׾|v6`8ujP+/'DPx_Qq3e:ѢrSfm;'k h.VCpja>Hxq 9׈VÑjt Ƭs#j*ϔByu?OzEJr YhA/h /']{#O:o_VT2~MΧ}SQT{, 1çI_5+>Q[~\;R +#f{\|V#3 l$}Sw7aR5R8VEӲ0iYW<Кu5ڻ2)Qʕ^!v 墮 )g>y+9UJ+=T5Ļ DUIۢAɣ_q6GEVXrCkAҐ3mN1n;-/9OIf\AR|D6ݙ'g{cGʜhB-ZJnG}cEzɕXcɠk7pzGޝժ##L3.}I֩Vɺ9ռ̅5^@ #1`6.Z1 RҎlU0~&v5Ԁ6xmĿ\_h^ d;K*%n9t y*SY?bgtcшӹQE0̹pq_D qYwV6KCѓ欁(NJ“3;A!+Pk0/=2$G}{X5XB vxɞjl bH9w#GY0T)COjAz 5!ۮoǩbdi۽ӟ7 &W?mX =-W $8Sg#JKw]BE6Ljo) $IHN^1d]Iz6 ~>ϋ4uO PmyʖHIi CP9`^;Jk4mwv1Q_UkV@f;Tz>m[ s=up9~mB3Z?<ί͡'e]2,a(IBUeUÝ*4J@;/.Z (1Ae ګ+hL=W-*JY* =ׇCЦ}c9!xXh$Jɬ ʂļ0\?b BeT)/3t}poL&̗HWzb(*#Mk ML2K8 hy#gmqŽВd OAPUwm< r0QI%鳶f3k]udX^]XgTF=ts*Hyum _["HtS40ɉ 9q2&4ֲ\E&x38E6ZĔc-.F3hzE}yFsݹD t#a>P\QLژ6fKjD8~ЭrpT tXW+ԷN.bgx0 (q=~3h&r4LY&,46qXCP 4_Y,[(+Ht&P&.rpN$gl\A9i)mձ}Ƣ}}RSNOZ4dV}f,t*=)B1ckŏyǥ⤝XZwNNG _Hؤ c^;sj+bM8lK-1K Or87mJiqcxAɫ(EdDa5BH?"zh2%mր$*C?/mXf\JNkCgjIa*3O?KIYawh7)ctS^eEs7XWmHJء˾{~H񬝢]q@> ń-\I1gz:U&^swhLDtNeB<)i)3޿'4R3Dw֦yaA\TAp" 3$ b쫋Og_̣ܷ8qtU-kѝ+51_SH.>3~5ҋJHC# U&37("w?BM#WsXubTx69(ex;s Z\XV-ci"a=k`-_5[\fH`+*t!ȅ>0qo1X\DW\JOV|lHXǺ Bg#H }+1'\WB 6~$6,~t }Yި0ua|LUAK6Ϧ&q.qc%٫p:$NU(=qmD}aE= A2` |djT&84QF8^]s1_=aN!WI؃0%^8ch9$}~m AYf%Bk|ۨoxC`*m?wY# M$gXCb1d8XMKhKT,Lj!x@TT7?ڑ>0w~޷'J]g"vN`UJ[" qgZ <s}.{-VIZ"ScܪNZs.L{y1s,mYO Pǧ`4 \rQ4Iدu ~Cü[74~UI~:NsI8;^4dGlU,K]I%F}{ćcf4,>/QTk'o;)g6̕ 53IP7 (N;x&ާf;E}Ã䂷 q1#̃k9mq+ h@ IYSŽz̞[$*"Y g# Gk*sqZbf}i>mt$/#|Ewi =7obpUH$4r$zޝfD8DF,LY"I}4wvȯkDMiKi15f;aq}!C)8bpd`.*>>BmR|@Af4OOa92BygX#k8|n5ҲB"6heҠМpŻ6yQJ{OGQ8:oHkȃ $kP9h.ĒS6WykD;C~q[_}'A~y;="sEtAL C)2{pÖ}{ ސ;.n@,F<3 Ǟ'E s <DXS|ݪ jՐ0ZCBZbBs^)+5Ψx6v40r ]pͰt]O|y4O_.yցX'J#Ӈ_+W%y:cb:U5>@t {Iý*PFkb;noh8?.uհ?r( 9>QlvjE{{bjX9EXŜat?c  F|ٮ/ۏ2L`c/f#_KpB2OA<8*@LNv#(ea;r;G5OpNf!5JCTN>m" @&Gd9_4L.h~X! "k̂``~"淛}0&.ZMXiKG𘦳' >^.>;-Qe7{dm$aA x>kROu&!: DYq!hpwvcLϱK% 2 7E  },Bc.,F:V"9Fw\Xc@|iVug|t ;Aۏ6-EG #GN{:ceo[hp Ssc]>=" -,elKIuN8_ϘQrơqՠk(UfW|hU9L- ˜K.p:R{zJ9!MZS(j]k14+\%Խqw xIaEZPL҂}0g' G0m(]bT}mu+ &u4Xj@Ѧ^F~ٴPTQU{ǩ=jJTEE7qHiͩլJzn|>0ryL0&} {KsI8o•dԚp_~;O6ѱBֆ(i8@$`cLdI%o⼔CX?@Y.JIWKOB(P34l&&44ٜz1}0s}T/ ](Mo xH݌%oc׋H 0퀩*1'Ye wSw9/یJ~[?w0 2 MQplQ="7q89`Jw,"_{Ġ Kr^R 0smn\Ɋ"65v,*3=FD< mռhS. )&h.'bs O梞6c*pDfH5AdL# 񷩬ݠil R2t}VsfM%5lًz ]`%b+x1. KDL_UEQE)p@(O.n؜|P~ĺ&Sjxڵ,@Ҧr0nK0]% @Jb=kEfҴV]jv芋tjFq=(S pXhp%dqyI&פ~IP5N7Mᶆ g+ Uq^W|k3f۟ro \ҴoMлWsƼ}@CWJ0elfmEe Η?NB"ξ7HQ.@pUpm9S{!`YHT|#폳pO@'>_C?xXXCӥmĐJ(:yalB1o5]._Vg(&@XmD3%<8B#kz(@T:svm>ALf:=As͹v9\> ,_͈REQK <#O>I+[#GJ L^) BFMwq1j$9qΕ DGG(A7IsWwb5XE\Asru2Z`0Kn#XlC]3r!Ujj7uMrXahi_=vty$'Yv~J8a#}}P X9՟~e&e #^B3E'ҭS4{w; "=-:7mFYD$+> &v3}J iGZtnr]mĪ4~h3t~;QO,Jk1H1< 0Isk4$>!WьJG^qҙu[eXӧax|M)G ) t3G5 gW|L^4lkzSOv pPp~ЙqsK/m/lnRPĸ:!1vqr]L'%x\A$6,eXLB_'; 0JDV *Px9#M-&%U"\$ʗfmRLz&['^=_N!e4#D_u9yt7;`n%>u+i o){--j4=4ҁ$ks#ȹ:Qδuˇݿ8|!R=9>-"bUG%M*rBr̉?-UR0iQDX'NR&uz3g(f\KWD!h"7}z1ęÿjt:j;3^ԈIL4G<cd'*OCਗ'A]JiXI/ىQϙ3p|{f(//W4Q #$C%cBO)^Bm>"9/>~W^L vU%X 3zIc9 Ѷ $q/|Ê T:Ǎt N m.kOMkOe Z[DWқŃ4\ êI8YJSegAU4P?t\C (PYMܦ!Le\~.ܙ3{oCX5)uSQe\۱+Ќӳ45[ӫ<䅶QG5q.W18FՀ gt}CML6=ߖl f8ScA^bjY yǍu|@q%_^6u= 9"* [.& A_#a_s'٨g~ɭ|pQ(̿PTBޱ=\Ce^dPiBd`KV桙|hÕ@&`F;ssjC&Ӷ=ڦJeyoD08F0k*1D&I(D3=D\5~TK-|ie3BVÕJ/b~yN0s*B-p >[/OѸ yYC (@XVQM~n֤xf"q `X*R HL-( +xl韹RI-* `=es<e8m__[Ӭ-Q *U;yAIBg BUv$ 2O^یaT!uam[-0bNg nRX!5:wl"ޙ Q&+ёuwhf _p`'7p|5Nr &(R/{A!L3?~>G%p"ˬ 6hۚlhCULDE__˪kU.AT{c'G t:vPZU9ig_Zs{D- قTarЁv횹~f6 vvF]Z]\+qhm"!M;l>vÒ_c$e*ڴè(w\y*sLk Ne:)6)Qz$5g) 12ȕv<hE sa=]A>Pڰ&)%4 SuEĉGz ɀ&cj֌&5}%|OÆEޝE?4$}H_"92fL[~ /:X^Joƭ "T )8Fۮ넬sHaAkh>%h\_5U֯^ WeA*Ŕ-OS QqqHiC\"isgx𤢳TG/'޷Ch|z9ܙW'Yz%[vܓ9ԟV(2㭫U%mZıxUkjDtD`T=є+M]#Uh ,=2 řT!$J(qH ڔWFsq!B Q3,eUir}4*F} Q&1x$MNn 'ؘP ;(^P{xz9Ё |% ڼBM.Yi ]K˜&% >SlzzXkǤ ,D`oj\\HjhLG4&PĜ~vX?wcYKthIjlqZ?]Q d‡D.Jl߅.?}{T@m7SHۙ^;a5ѳa*:rUn+4.ǚ]^S{ROW]EG&?r>9 L3b-1>€Kx1==<&3(Kg}`\b 8tILH`N<+2Y}!5##vfYszl]6!G`.dm{)XEoMj1U| `N;qO In2S٦ǟf f$;׈‘*'8'زe>f/}]V#j+Kͧ/Їk:M*wA.9M ]gsj =+ɣF?HoHamp" ;>|xp$:w+3=ߝOni-!N1 uËAϳr=(x?~pP _wN& Rp񁰂b׳\iQi 襷}QD-GSp Hg3@ڴL\zg[Z16[7- p ^㣉FBr3ՒaYLz5PIq pv"c2@Ӧ,|;!3Ƕ{_.W/ QW1L8b QdГt3ZH9uGa p3io`Ni9?`e|w7ah㭻sv2̠a Mxgg(hXJID"n@̪w @WIlQ9E"R3&;hPc $KFjT|yڷL~4 Ħ |ÄAyO'b&`Sʴ,o-ϛa)|*<#!4+^L_4R"5GCU|H<&|@éނi!'YS7]}֙&`rď߾?G b(ӥX֙2q~Ү9MUEXH7Rx^Nw3jkmHAЉ{K) G!2=l^ `D CTaSĄ4frV%>բҌ' _ Vbb6 AX ttE“צ}AE1cV'8- 9mڑd~?nD$?G)+nC6M ;|nG4Wr>jZ!)3nI>ds(jn@ᑘ( LW-i{[XZgaK|za,Z87dXkX j 02>2*ULǼ'a!Y52kw,Xy5H+~KSᅍ1˩k1US} [Uq=kI8opI,;g2v}nh-X3RftR}=Fdo2r_WblD .ڦ4^r ;w\ 0bXޗB*-\&Eb7LaPMF:ZpJD^||o0,? ֔C핶=Kʣ؜Ɉo{X?o\dxԙW/j쨘scRѸJrSjd˫!jU˭Z9ju: ~UlHdSN>_=oG#20! :&+CĆ;h',Ԇ2mY!~ pX 1 fQtp \RO*>6e2iV3F)T1p~$I+ ȇkMN:qW{Ȣ˕R:1$:GVQjuN(2w&S0ZP" ,DF(.C%"Y·op0Ƞ&IA?}M$.Ag.XZ|͘}2\(DV|5ư]l#/ (qh HZAMթVsT~+jB%W@:2p}֕>2f\0'x_`~|W:jXiٍ4?{x*4 M78W:JbkހZ_JJFkaDʚNgCс6~fvHQes9tlJa1^-꒯*7x < |ka @JuMFH. lcO"=]P}7as] Ҧu.ǁ1yu$7fԬ[."HM~v.[gcIF"^1-nY܀oYgyҺH`BJ" A]31IFA8u}b4e8N:}O'EhH py iV—wܷ}7o_EQXLR%1 e'v27`]CRW); m51]l1><&,?~oנ&tg`:%%Hj uAΡon6ff伸jpA brډ׉uŽg =f(9(x;#rX ,>JJOzF.8B-~0 =<힇>w:R*j86 'U4/u8sUU_`%3$'/Ce ~y-'x8>mW5zA(IM舋go/Gf2F!}өn){_?`揷zɀ(I_}E8udp}O&}UwޞNܮoNr/cD /yrr+W~ˉ#O\| Ҧ}ULye~yxUtg~'v~t'|˵8싌T ؙ~jb#Ч~%d S3 W+ YoHӟnpkzt8=ͳS{*V2ς-@~ .>}՟)[~{ޘy5WלoknJSzw8f8f[]NZ3Tj,`(l<ӱߞ$$e#dMk56d8>5D PmSBx#wĔDK$Ԑ$/hYsyvfqV VN'[$B> B3{LЩuOazW,#LPM>*c3p'}MqgB<5_Pɶ?Xuxb7Y>=|˃* T!v8ȩi* 2 H!"O2`!NϻC%LB%i 0t66'vg(# -xԴ:tw譟ռZ?9oۓGj (x~95,M5N^ut| 8Z)'V5xWXsQȬ pJo XRU( 9E5@E\ho􆵤6̰26=XƑ{u.@dd^\&',(Bvsc(E.u8@+p=xl2TP^8&XtUƞ]so*]}O6Swß7.&[Y;[H;ĺ3T?b˿;S3JC]J{>9 R+k~ 4`2 M=EY5:a[8Fvʪb9)skn(˺AK/nkzyqH c=O/|(Nb/Sz_!a9LeFF]r TLY_K# C2rigFnD)O(gFijsf~Lɣ2vQjb؃qq5 h s3CJ:|E5*Iv}ż{tda.5PE>] }oiKU]n{L@w_&#VnX`R-E4Iy7U}YS{tgP6` Ev0DyKw.b+ 5hyKۨY6Hi ]a7;x1H-@K7M%t9# >eԧM&7ŅQ'#0YstKN>ۤIP5Cv'%!?& , AXBFSUB b{WT2+`N\߹$T/kְFQH\ݎso`Mی)<}"H݂G_+ 3oꬵoZU 7iyLsnva5w 5޺wejlc_k Y1]͙?{g:d\o y55IC!&X@J,Vf <Ŀ;0"hR"[)dƒ/!eBR:xUߊQrqt)vjEߝ;c \(;Y"9M@ 1৉vqW6@9nWŪjtR I 4u;>.loOI~L1??>BՕqg3mG]#E=V0l%4K}ztGEG*I3/N+<0G]S)"+%j7p'q\*n. lϼ-`䲃GeAv?uuac/ wִ-;L-9r0&#PSmB.KNg+zJ[L!a隷 8h3[xKIm;7o(ӹ=X^crqwm##+A`H5*wy`!Pޜux>I$,$$43#w`xauH^'隽\863c!* >pg;ȹlzaIY@5NXpګ?8S .3 m wp@8:yIE}KWD _"u!*n/*!*p&z fXPMᠦ6+eeX4;>%1|e@~yꄦB ^Ow&W݃L&/fjqqv,Ț:Oi욹9ǧG2ș19C.\`\0gǃNS .qi)yo -3dٌ.N7Cqteo8T> L$y/nw\I̷/eF oʷ俴Ao=DA"mOZ1@náWn%tBeT,R&X.MWH6]qM7 ̓-f cK=(5W.n7qG?+%(Bx vʇa{x4[ ΑK-%-A1TPd6*GɊxh  y)7og]ʝ0yt wA]Tڴq9r4Sy\=,^Q͠KR7 Fɭfe9oՌT*p!oϪU rg]c|?ڏ *ޣ#b+E98  [)C\-Clx#C̃b/EC P|㰌va n)S XW YQjxF 93P&f0e;QѠd(h5(%Ra8Xw]n$zJ]N&]0!ѻ\qN9mSﴨ=7n;-ZR9SDwݡmn){ 2vwTEx)(@VJD\}2c~G2U7B۸PU/2fwoN"dvܑm3bc .My* {&}L taAq'34*\YI +z <JmU0n;Ca /5A3mbj~0b#x`ص䒧Y$ cJ>2XMt)eE=FKK vAhls]Q1KV ٞRr.9(JFp>C*\)!u2X# afauiіHwoQtI9>} pu2JRr*Zx7@|U9g {J IWp. r[x]RA4#҃^qW;l_۞w2 I=$M $jŤՈĭ7iBpzVR`0ҷ6^PiycR$Dz8S=J煋Q&Zdl}aZ q ӄ=)Q:wA2P!UpΜv?5YOPe1݄!o?;$^f~lx醑aw 0"SwM-k2>EdPG4_rG?h{1ZUۓezQd'{>c)A]]UT9iӌ/rixn ,K:_r9Ša~*@X0$5'zŸEdcD NG`fh^SKΝ:#+#Yˢmy|`qt( fJ2[ѝY "$-" 0ZQzs|wRy,e6ժN7k(mۨ6*Xi_~}ϛ_;s~u,ucNRDŽ)%`tXmM=]fv^t ʬbFNެjnw_2@Rf}J@( L]F_rq};aXD-BQ8jUc/'HBcBkeGGj('B&4SrXbUr`g -wl1 w@p.OO=mqPh˰ '·G5J1Ŀ#2l;#H֪l68qQ5$jEwȚ\ O{#rEhrW.d)_*F/:h.DWpsD\P]]Htm0X_""'ч-%h5+sjLO+Lqa<ãVGF]+d:q$t_/Tg^>ks։0=g E}|<RgNT3qf܅Ps/gȴ̀e$(wG µzlp Vh%.K1W ZvC:w8 0fS@`T`@Y4Dd,&yN ˏQd$i twWp^(_߫gb=R-f냉fX='5:A^E輱rQ=]zT?"$ǵ!JAU1PiK1|9|Y+@+(z"I (PQ2gOsG4=*F>yȗ.tͳy){dOԳ(j$ѿ|֜`o:!N ?V%;(mn2Qx5khݝ>HA>1<4΋ tϠ+y#mE{{QmAa&8myG8q[/!z^#,AE/G:E@@ /c4 hupڷV *IeS؃>-XJ_XB]X,-)NTlP^9\<+ p ԁݰP K /~YLED-DdbE7Vv7K/'x$TVIs]drD5(uf|'*BwqÑ",˦DbL\"hP0r@atQ;DM^SdXeǍ=*Ү*.eQ"$)`Ͷw0$lMQŐ1G.X'1t̠-gq!0Q:9Rk^Dc}P{լQ eWyn'SS1#~d@۶0<>{żhpG0*Vrn̰EVB6Σ‰ eIp ƱBK=wrsgCqt(P[TÃșB X7ܯݷI#ժ$ը?T?~ؗs+|jFzDU`~=.MeZ% *f5z`+^j;5bZHr?_$5q_~ۗĺvQ2wOf82Wi4. H :X"<eŕ,MFU,^\. )wʃ{D$`w[|x/8G.qFMHbVy7h6>Uξ4 PYxEѡ.Kl)q<^by4_Mc׷&Si/PD Qf) sk㹟3V;JVk/<졵<f;"y^@78\脞[*lYd{Ó4"(ڸ=w^hT\/`uE h_K*w#v.sҮ/HV$T%U/hM GiO92H lJ=m\1AhQ;Sǜ !{V?li0[Ĉ7YK&Ph|vs":hfkiw>`/ŷcpYGWaqdϸ3#:^!Aۨg"YȬݞ蕻zNe-:3[ctu%B1o;lφjWq VEV| \2uʔ7:ͮ춃>n "TzF:.# Nf+"93kwr$Uxrti&pk0v\ΊCݮڴˢ bD] ʑA=ݽIy=k| X5V#4tؠna{Qx.{]pC0D:Mq zk% |!8,{>(0vа>BoH7`<$HRp² w݂ol dS—:L. P$bB<*cθKU!>ڿFA4FI s P%b&%.@|ֹ8pAX&5`E tpUq2QCH%D>Źs͋\k_RPqytl-_UМg/To{TK7D7K}N2!-Z¾G &S!wK},Q'c"*2ӿ M:tTt>N:2%>sD46z F>ՋU8hY&Avt8jL& " P#9ɓ9FUtJ"DIW}力gDWG|{:^D t nAFEȮ9CnK;Y 񰺠\<4; o[>l4걉UPց6-R"3Gy<ɭkOhӮ{VUŏt/nby6]9?N?{ɵokҴku4EsPNQ[[ouu&p7DlpcL84*NcAUPu$ݝ;+'߬ (`ct.Ye`em(ށwqS(Gkp7Y@R,9)@1AE0Y4M˹7x3Q6*yDIq0-HgLLAg=fCc&gUs[ ; vjiZ\ 3oIqG{GH7~k?uxmHVT_\hH/x ޻ E,I ?c*G+>1˩~jcW  v)%nJ|d|b|7ml| D$uc!AF ž?>]^@X|XYKUA0gπ)V 8t[zaNҦk&DSx4sp=>эzٚ[r\>u-*\ "ƸW+J:=i =<>|}?F< wDc$wp3To1O߈+d2k@̝~`M%z^ \?m{{m} (,K[: hw}~sQ]:SJ$%A,J lnxoL樯Gŷ;!yW?<ûy{rXZH/kTh#{P}z?U!9:pC9L`yOgWuVlVxԨMeE Dªy0Ҵf`\fĐD6=#*%SQ({0\݄.iurQj7К,ݢc *#=o0$W (C۸MmdM-P`5vL!@9kh?"r sAH!=PЁsEZ'ꗪ $=RfKХeDE,}^DG<:[<#jE]CHX>3/OR.ja ?0o|tg[җuWL+cQW5LʨwǪLn=}-&o % UM!IvI?,Q"|8tgQCATf䕡e,ז J!eYjNUX!JC7f'N'5\U#sBB2<݇19qfՀչ MHlf" xz,S{o\䵳:=]Y׻"MOKF93\*֭2P(;.†Ϟδ46A.s`.^{ZkbRLtԜuaߜP|nHh| |G:ՍO>fNoyAN$°WN!B4P46yv*v:6p_咁߽Zg gRjB*:Dj6l~Lvkd6 pմcaIgPr/iiDI#*4%_s UbPxFi/.Tcᛤ=.S{`Jc؇ 1q]8l h`M MP*xjg9J́Q[%iq g]g?g_>>kJVNI`L{F Q36 Nhdtw 3WrAJ6!|XX/]flB]l%^#Fmm,}/w-?tDg$+VhpJwy Da>Kژ\mǜ7HAkQlHBH'L>ia#׌]Ȣ@1CjzQ}Vkط,׻mwLn ZHRElN(ǙJVFa8#Fcl6W)O&|S=żv\m@;m o]R$xsJ|UKMp8{$rr]5㫎YSEbBE}a5;p"õK?>߭;7uGYa9{̡3~5pPEFO&<ϗZעʦvԒ^Rkp%8DA+W(LƉBV?B$U+|2ɼKP(*ʢo|lx$\*"b]qnfY +Dw3Ͼ_34NH֛=z4:Z"f :88f[-sjmKQR`@liX ,c]TUOPٖtl;Dho\`>ͷh&QJ6Akj._<刴PmD1M8;>)F ς}<-y:wY^+t?;b \j^0/+H*DdTD$:t}YnU4lL{s 1%):F ^D Ax1}ӂļ2qq HŌ~ 5Jh_ԩ' lx֦0+J('U#)<+Ih̸M<I'rVU`R9%@TO}(ƹ*kh͓cR `ґvrxӴn|2l:=]! E)/"]w"SޯmNlpK$xE4UбA/ G써y˼A/ߍ(0\xG^Ke„}tD(mu+(}Ctb_6Ύ~C3RL&3 \ǐ:Қ.^Ew>h?3`qp>iNE&HU@0XFu_ "FWz%*G*@p=ɺ}#'ވ´q(Jk#f7y0黳V)~ä&21jX'Hƿ|ڟ> Rr,z_FRV'M$"Ǻuoh6fp_;ipLߣvAK5C~[8O{h\=˺`izznA;%t)WP:dN{W,p9)<鉎(K+#9q: *21te؟aZLU IC)9$v(~$G lϦ C&D9#pd!UU6DlUq:KkTHIݰNd=M~sଌԐ|I"3$ՙGcF~89͎ ]SW+xg<Ū[fUTߐ!pyJ` j$ȜG.8ł 85px~̱*[lX!ňD va Ս, W?tXxrW`g)X5MR`J(eԈce7J+AN'x\OJH0]xtm_fTvu{-HXb&S4-$a8a#_ގY#nS z5w]Ѩ~ "} Dsl%۬ˋ/AA.c],f ҹIv`ZB5 *WK'bsOw7Nwϗciϗ4@H%a/A M arula\cJ%z{!Ox:ݵAKLuÖ [08(t#9vŹ^ǩ-.M,!9ͤK*)IpuH~<S=aُ`%{]=O?{xʃuNihx0 h.qnt}C3ʂ l Oa}EW ʷYwׯX0@L)5KoK *#-(Af!_sHӪ%ߺ3 ՎЪ}ظAGQfKM۸"FCfzچy σj-!Nr_HޑBuaMMAbbݲ,ya&t7qg'y`nI;)8V@ҲGl m_X [; OL!b I#pChlMIQ1qOd{)W+3O@R Bw9WA y3* &'GQ%nW% `NBؔuUCܮfk1bBO;3' 7g8Վ@YU\^̷JV((Yeu. ,Җ_fl]a!\Ru-a>wi=ą VkfU*-Il6܋n/lBr@³!~NS}YQH X8nμ"8R^4nx-{A"G~߮臆h,]=Ͼ pe/,Sb2/Uc>Xd+cva,|u`7ǖ &B)^j>Z4\)Fa4ݠm B(;2klnhzzqѺ\'s5-e`ɡd9SNstSs _i.;; 4<0'U(ό&=u^h:| 8c}ė/2/r:oผ?#5`g]Ί{v`%L -$6M$[}Y0 :R%sTABH1 v=+Ug4gdL?9@2{r|؝ÀɋEY_U".bRxg Y0dHkx}6=m,5 @{kq \W[hzJ:*v"8BQ}v/- }#m2f#岯_^:8XwjW KfoJK9  Â0N]pǾY u#Uh*c<ڨ֕k_ę'B HC]硶z)rΙE9M9Fο~*y@t*L7vu*`}zj| (AT*)LT*f;[6{*&yGe)z?"R,?0'6Y|"49a$9CiFB#; tk8ZӅ! Ud 5qD^kD-41WYJQ.Р5ҩOC PX lEt e1g:wmiÇڱ0:lyE@^+$4'J#LL<(1z~''\ upM/|l$+̥@>Vs3f`q,+*D(U(N|[_[ $dLNLNk!pI$0'"JdklN&fffcaNfَyiKM5\tYU,e0@#EPD @9<.Ra>;^QtԤEϼai{ܙ;uݿ>w*fW)ΚN~ŤI8t<`2m}<4 S2_@a*9Y? qrTW }$aZĊ2o8]jcNvmfo}w~|a -/l>'hf ^>$/t#Hf Փr25xl~)y|8xM'6On3ܿ=oO8EY Z@TpHEa 4)4) N51d$1>JI}"Z΢r$% KNFGmQM Vi8!eÞq{T sDZRbD+^uיBSypG.3MeSDЀ)_&GsF%Q0[Z8SNHl/sA!oig=g0)s<f'Px[;OL_dl @7vf NDa ݡ3s .s{bVBb'|*H "x/E.I,NUXfv||\DA?"Q-I(X?a8~?a$8fL⋺, ٭7INBy9_[WIS)Ղq`/,fPW|˶:}? } %%P}uU$Ϊֻ[2@okJ܁U'ݵxb@(kVPde $͡) /C>OHn׵}7L F0~arrs,_MI|L Aboחm7P#?F!aYa:rYnBpv41"vPU40>[lwAIm1Q(Yu8 RM1qo2.4|5l kaIdnԏOôp)ڪAD,U as^FZ-\/-q#/𕼚  5&b3>^ߪc(fѨUe)#ENP)L3Bi9Yv_6E!@Ƽu%)ov-4lќٞs7N%@UA3ܭ!!f<NJqX)AxYa|9L*bt[Wdt4 [䘸VvTn{N3\w7* `[J^3ۜ԰4e'ˈ6wW&/M2:+:'wO!]xWa)3<,L&3*m:퀘L4w]E % Qj3 dyCW E <1J<˸Q0CG7BDUAo3e2tPgzhO۷OXastTyaXȯ^0~̀}`-wEӒ:= 7?l(P̅#y>ea ^]? wT:fg}x>uPĹ_EBcq9D| 4&\2%F\Mymf`8A36N{,$QccdȜ$GZN'S<^މ<_^ Q~' :(i b;,D }Dw /s8mU. 8RG.(Xh-f@ND*,O^F[xZuSü3dlo'PxF%Sԋjq p=TT&"D#bxxq r逵h" kuHY]vU#/`{幡,ygΣ:{0aа3ư@MSIĈ2p9DZ`.I Uw+F٥, aTR_毇*;nRSl&mbD&&[z#Adl=&{-+'M"$`!#8IT셁 fLԷ%8p9`#Q8SI:vzu$$͚Ei7-Fs*|DNK* bhc'h 3MfC,\E&83Eҡl5|,푃k7Ŋݕ#:r 0i/@[t5m =C?iKv iʽGrHE * 0*Ld=E!i3ڹP ~a{xzޭzr$d Ұ3xYt݂0{8g}E2{ET(}FD$smC1bPMfz)ҝY̞Q[^:K |MT;C.,,OJ]EC>$9O38 8jfeu9wVW\>4-{=/-GaRI-{;}w1 J{9wBꯄ9VuO&jV;4 oƬԡvٻ\u\Jes2eR\ "6F N p4ddSZ+%-T`^tTeE+Q^ ʔ:VwsAmDO-cX| Nٵf8f?[:}$OFcb\!\5F̔o'\Ts~W~m(4hmU0J>\WQ2c/M>7)SDt &ٻ?'tۚ%grπW4Rwey %:y| R" #)8 YetNJNb*D,Ʊbr$e43Q¤}rrtXk'[WоB]ήЅנ:å'1Jn7"̝J,h1o+t]SNNd-v(mvx2\yB jor}_b0"VgXH2AS E6^yPQk( 79D|d7IZySuEBgSTH{3C& DʳXZXvx[x.xsO" !4 '.'U7[w}g3<b=0KVKŮ7"| k iݗ 5 $=opBQ'ң`t #H˫ǔ" ~P [_'3un}w:7Ȝo u_g; R!TԂXňHqP1tO|ԷڳI3dm"9#ET|LĹH`l?x^@fB(=IrypNFfÜ8WKi+h|7Y;jFtw#߭7* Gt;4N}5$Un`"-FĒlU}{k 4&xebWpT1y篹{mEwq$)_%r~HBR"e @cr$eL|ZdF5l]TJq\UNIuĺ{nN!U2OTɰ 5Ke=bWL~{AL7:iaψ I1 LS.`PjqK,P/^ '*rG>fkUj~dž߷ui~7TI{ST@I%^O΄,Ʈou#FOcc9qT7K}{i?>tJL SCC/&|A(VXSId@KFs@ 7ʼnv~.GXV+n|IcMpKIuHLL*GWywa {-u A> "ޫG.GJUJ7tYPқ-aTA࡞WXƒ uRq\Iz,2X4}+Ihɸl`+,LS @ k+,O+XNpBQtbCcyc; *': pQGu+:]kh"jē|a@5 u [X6V}͖JG?۟K,F lx"h#Jn(`\$QۡpE~9}m{ayЎrH%/v<]wGRBH;g %U¹dRH8=gNwn%%*2 i} RE YQ' aQ. Oɸ 6Zh~lӰZE@gElьԌV3w/{OmjҚMT&z,%0 'e^߻E H1&BpR}${$VE;vPƉ \UȌ7U0f$>~X/{Dy ^xl:e$<"tFf14ba9-|Ny/DgeZ[MOdx@3'P%ѓ_Ӱ4DyO 9wρꃒ`J(ۊ-ýFt8L0}O_%d~qy2Â>6X8ĥW^Z fG>Tfq e@XSݥ]?A*X5 Ÿ5A/0IW~?i_S9Tނ]J Ĉb)2 P8l~E&e@78Ago;^3R@0Cy4pzc 1K-;лowEHHc_r8[ap�ȃ"kVII&͋:$ Z$r{9r@f3Hl$X7/V Va6U^,}:LP%wJHR.],t2P Ͱ0tN 5+tW?mByN]摷>'zeeO qL1Wi ˤ4yA_UapJbcT ?:4'4)Z 5pxjPa{4Ao>x,~'X_f `W] EF@^.#>թ~ ՠ 3p:Ø>s&Bettm]+ HI,zG\ksNikm=GJhNW@T@rqBj?ai EEFimpD,ƿ$#m3ӂZI9-kn95"N2gNHZE| E^GxÅ[((s\sgajS{ρ]F0[Y?eo|yu|tu6V7!i(tps فI2{MBch# t$A7[[`܂^#{d-LlIzv2LbW1Srb`dNح8D07]e&V;I0tnnSSa{ߞNyLJrAE!Ux03Gx;&  "{ceUO*P\>}(VG5fd>%| ҃Eg-BAl= @7y.a6)X"**#T6`RS{Yk;9j=/R;TXx&bj'l܃]#[j߈W S'g^'L8WR$n?/}L(T3=Sa 5!g G2Nn3]Ɂwd(B C)y]UzVPZk<+VHM"@~*V&!+K%Q:]vPΩR)[ m ϣ _H}NCaEI`.pa m#|qaOȏd@1V/&xtJo˾r0^1t+˓+0i?Mu:CX%a9:Jp@Ku`m֐w= S+ΌIqra\y[XeG $ " 6T~1Ƥ|$gIFYm7[tn6?Xژt@{ 2c I< A+#UΗܯB@yH Ԧ&QS߯OwXD7z]4\kŠ8'YN.6x#w#Vs}txn/銁4# ^'L{v\o?=ȦX:-p: ny]3` 8EƕX@MPzmۚL|r8%R#_9#;a]|,Ah= ?3xBOpz *X7O']󻁛Z߷qe+*pMěȄ|7&3\AY/wf;Uayȭ5#'$L"j5,Aj?1PIM_݂c0se F25te۟FFB]Âp#ҽa{>|[}OZߎ"C4' )qS4 g5?։VB3oW^5 XH;37TRr𙿥2 s urXUռ*EsU5yN7ENR/H%cwl_UO:AjZ\*<:$ r{ /<ƄC csq&YyӪP*^yL`մok3TV: "PƷ[n}Bz]n\bbA"^'1‹7.y:xt $.a.dW.IU ES飦zm ϚL-V,8QcÈXf>!Eg=#5JCOVKn0w}xx9uA&a|5ߑ#o{)+М)0T VAM(Z\QLѻukh1ۇ#+u*C{pF2_l ɷM|N..T3hA )d~C>'f~| pa+3,='H'Xfp3ɛֿ'eJl;e6hfhdYvQ%17x]\,-G+;{\R{\ޠMa#c$aџ}ocdt?Zvߙ pUf|,PE + cvpRSGG"^o ӀVE#ø $DFHhdװv9e;"{gxN\*Q~QG5)+#UOH#/XMsh,ϟڧߺDF<]ldbqǶ[~׮?Cm5@ԖsRJU'@?|cnxOp6qj Aꈎw߷XKc8?5 eK&pGxh,)%\z?[lϫ|d3\817H [a7j^ʐ.-Ex 4Fab HK#U|RxӅ;o,b%υ[)0kq3#ӢU6MR%HJ H²r7uE1?»ƒ 0`虗映sw !.4x,sBSܚMOE>vk 50\Ԝ^<'5q$8(iv KZ,^I/E+f" h1^w_2B~`\PJDzj8t* r=  "x/ Γ#ip1b#0~pY/:|,TrH$)TSMqE*VXاԁO r\>!`CrԬHd2;]Sԟ&x6 d  D֌vTH/#-vs~W Ԣlx ]g d-`Bm=gaEZ`md[ףzMGL3 q$"\Y`33㛮߻ʃѐ'9K"&9:~/X0Py/MT4w6W!O|@R0Py[(\U;lVx1׹/|N#2 $7"]],,[4 d@sO<ġW pc 1ER4PpǠg7iГP#T)SFHDoY879<^XGaAxӥfHf$cWjd<d!u C[L"D$o@8- Ԑ#OMQX T᷼Ͳ}YfYV<ǠBCf hM-Õ]mߓ_!iy18[,R?uTP* ށMBmsպ.\>rU&QNtmExƼ5ScތM] eݳG6'݅e{?A Υ/6Hz#5J#OC?,s>PĄߩx,WkO? Vaw 6^ж1@WCS99Ū\\*dw#h\ ݃ GAu$e˕1ڏþ[shUQz+to d#iөntZ? νur?=c[*f%~zثPܫ- 3ZYQA_wgq+OxP M6REn.fgMPtgs< 17k :tm{M'FoOa|&,35~t'(y2W g>v i 펌 ެɑ9}_kdXc2-HgS$⒕5XY`uz-Lp_? hR;7t$^NtrAsF &&6,?}{ʬ*z2ihް$I06붍N#m;6: 9!_6{ZR!#H*%A6<^RKv(9 FC 9r(%Ax4m㎞NX? T> LqƼ :pnya~pݯa4Glniq:~XeRsGy[6p*FZ'|{q9}7 ZnBrV:fB).ī>{ĥ_.oTN6Qszd&M̈́4q&M5y&PТ՚Y/l^ji-9C* ܥ}9 j{"cx{#nyU}34l7ˬ>.}BwZ<ރ7BE[\(Iytŏ]ߺre ʉ5g:O.;iv*9#6pE!\=no)UbHfX9{vR :!B OJs?[ǯ'GIJP6KgĢJ?b[ e:$=ĝ;~`ٖPJ)[/֍DI`m;j#A48?tde% :}Ax1.;HIxL$V8y}zܒ0|_ޘG}V/)inހϜ|\F ʾ=u * iZM:a0kVu/iԁ؋摳3RKOHLF޽9j1 0KLBCߖauGiw_WTfO}59.74hc'jFO;w4R@xiaXa}ގ+H<(Rligf4;ޢBj$˼^)M4!2a76FfGrx嚆ӝ0I2Ʌ#̻NSMtSoX0ahh H!dTq(*!iMe\qK/۹Ey5y͕|4av3΃3(xpH|.JHkPnY39+k~yHP;sXc ې?[6NBa0 퍵:pӺJĥY`l\|{'zOedN(\EI"YhlsҺu^n eݪ3bk'-YY e|Y.x Ժբ_t%=^I(XE!y_t^SVOu#!d:Urc&k*NBJ5Ֆh~M EɎC"z{K^< *j\2hq eK*0u`5a:2qKZfvQb\P.tt&,H"ѢHL&iuBj #V$m=6{4n5^O=q Zz~hH3]m4~/$Zu ̬f@ͱb ?BnnMf|ոR;]!upL?˷?xD2ޜw<σۅm/Ag6"p;mT`'IPջVYEcwaqC&?95R-47):4rX f!m17FIh oLzzg( ҁ ͟4N"7DXd~ʅ4G!(,6J. kɑY\IDSr iOpr1S +AZhGkQ h5$+Ǝ"xN l\p$Տ'M!? N1=%:Ȕ9]t޽a\kGMz.P!Z1p+cJ-P4%P)cwHxsƅ)%WJ' 1 ҷ CZ HT[5%U梒v_PКb㺼M+!?}<[K`lkQǸb1pOy\^כ?ajα yAkD70@(q+;`b5Xuk4P f~~'. c(Yѳ:ZU~7#dsWoMEQu|D)ZG9f̟r8@PRy*=iﵖ洺}[e_ʃӇmCrD ƶ/}|1j==nIg}ѤI(PӀTǛ2"w8g ٺ:МzFPF"hyy^PysMй7X;:?2bֆ󸺞6s?_K&>{2~!9ܷU)J =5E}_7yҏ3"_T.ct5thG@;0ք\f4l}t^`2UMyܜJR@Ot%<9)2L?n+afèA2ւ }/gm"Txx]V6"s \eŃ)stPIm8덏62ctO~nNc>פ+G겉'@]@<-̴W2iu~DIi渻;&('2Vf8Yg|`G;eD ɓwIGfKW쟶r/*[H Eꃸ0REpk8"!D cy_6ۭa\φ5 R*CDNCjlR J.B yjjErS):פb"Ғ1AgU bg&q \!r 6d#I=tXqM2VC=IGC"#KrPKY t弼wD8JEQ;ͼ7fn|✵܂5Wɖ/i2M 'Yxٹ72qq>1fhӞO*G-n!maB)O]%d0x 7y`9%P& Yo0<_mΗq=btXj rgnaP7ʖ|"+lsUAǐ`nD |)ZR3 ̓wbW{̴O0mcTYdfP,'Ņ[n}9-[=ڧ}֑Tua!+>3V]aXpG-/'c@!U-@B%e 1Eտv#HGx[Bہe1rfqZxz^F}CFQ;(6ŝƋB%M201Ƶ"s[ @y>OJ&ګʹ[<'ZUWv\j}s_WF3a,>V( f?Ҵࢍ"nb乬.u]77Ug~- BO҃u Z ] JU)'ZZYĬL x6/kv}vk>)ޞ9g`@"ԟNfU+P$#q'n'o.3GWh u$T*[z>zBa>{BY\@.356y{)0 !d- 5wE_\nkq{ݲ܏^P'p&ߥ)~=&#-wRwJ'A=Dus'%=NBB2\s[ҹ%=vnl#3~ XEQ07A} W5€r>`mbIH 9l4(*? knı͐MEL vsEdf b^tg*,$!SC%GGR"yw4iO֔^//K,Ac5;N&P-!ԾIrhf)d"jQ"Y#q)W[5TqpR[K e球uB:senVon;m5iժBv8da%Q&6}Ry~Znsg_ L6;POz6\"+rEp~w)P:e&Vnd΂6gOHq( X[RLZ)#Wk2ƙ 9((\ GEe ggrb:: m~nPqB ڎļb%XDκB&K$ɕig[l: jn!.dA͠3燲PL= t~sG`k6z>3[tI',nY4u$+7AQ[pȔCax*'ȫ1+LlB`JkLm?UodN@.jU0Z, )c*r],v/iO![;S݇=䬴!鱵g<=у3sMGgᢻA"5A`dĢMgxk# p'Ÿ@US>XzVu2*,(ۨ_j~5ov_ hBp'Ed6Gn?)i6hu<܀@SHωʝ@kg;"mLΕO9J 1P\ҎHb._",C hlr+dp4ͷ'T8cA#nnoBS߰Ei&^^YHΟI:y{Zfqtߨ^z^U~1nH=.NO# )± ڣ@qꉬ(F;cq gPj+4CFd,`IEhZL I*u4᜝Qv/Z|V͸:hMRVw^:DT=N{>9bb/*J#&S x;oo6* fMvY}t{SAݟngPD[QVi[lI}5N=ɵm7M{ kwk^zU<8FT ǮU_ ii[erzT!`f`mȠ}1!Ap(QKG@J>9`ǹ)=gvKW+Lm<ޑIAmz^onp4vz|&O;`SF ^3o[>9 Z)8F0]Ɇ=j9$cP*V(sYfqbpw|Lt~&k( ޥ_܁]޺6 yńX$Kk,M(0߷ռ*可t'aʄO%ZÒ )H1hlyYI„ə_g -p($T tE ٚ&ayp,@Ԁq@](W%}93Q>h8v:_V]MBA}V`+aFy p^sL_3AJZzzDEe+$ޭEQMGxxU@h}7(#lLvK΋%! y%QVI7aC⩗kn^mTT^t?2eȷo !m[luƪb~2Q`ʄfb}^Ff` "rX"<׳)_?H\Q:4W8i畩LH \.x%3y_`!l='Ѭ(fC9:aH!ӥ4"Rqv%g,6r-Iit_/LTʨ$m:)FIN,i2L"wAk If)"GGù󅀩=+NfZ R\Tͦ ̹K_$M<4q։Fc:zn!B#ᄇS/,<)̄rr] TS6<._h)!]UPDx&NLI4BM3೘TW[ /y P6!;mAMF8&)yNBP2J cXɓ ǽfn,H5v%7m%FT^Mz)v$Yx̿'dm&e=rLKG!ח>$ 𨥩TL٫pq\_5Avs&d|W[XׅRIS*$T Óg9nU+`sIKM׏Onޜp7D )y_o6I`| /S('AV I@OmBdֹɓ~o&͋3w[zpS!z;iOy,DsF.D½{_[߳j?r䞹ߏ!LW2xH.;BZE 0h$M -{Q^/IoIq}9 Z> paa] _|ٍsЛ8# dPH IOE3: MŃr,*xM547Qi=hx$CceDm\kFEVb"R@)&tp6fG-D&eV1isyawGiuHW%̣F lj&:2BϓL0jV\.{ooR; 4:5>玘&~G)qzEav֞v*<2q}4 Aom-= ׆2WVo =6 +jz_t/~Q&E3F2  "Wwr58";p{~bG}T~![ =D4&H$D$ߑ_7(԰1k!YE+e8E>t[.Dꍪmu〲 q`ΤVwT$H: hu%5BHɲ9Ϗf=Ζ*A L<$FtU.֢Zg.y^_?UAkprVCR kKelNq5O ̢@/ʮ\MR'sgīwGk!|Hz6.*WJ۶Bexhr H9f rf|ǦDX|TaoB)-k6Qmz9@M'8wnd8)BXgc1!+m~ w`AzYsi^({w i3Iy;khp{9a 8}j@}ړdzo F$)!4&yX2rUs`?>Kbhۚk_Pv(2 %l̗RY:?k-o `%@*4̍iNK2;\~ݬ(YnX9 ;}H] Tܩ@PMYn*mBB=6 ΄NH Ua/dH'"Q uAUPq:&ʑ~^-MiiU]RuXcmn}|~ K_:6$<17*qڏK}=Za_(5"lqO'iez5OK uCxSb N轔+A\ɠ-a`bV{pYycdEω ?@3WZ^TʊA[D ,XۂS(pclRnҳf`_Ү[JZNdJEZy2ݦ0i8nQ>rN(ݠ*zNLZSEvkg r5Z Bʖ -icR9jL"Ix!6 w3,ȇ iy@֫4k7$5e Tfj"J?j0}/#~ Ip56\bztIjԟ$8NT*)*&x2Ҡ%i0l?o(ޟq]l Q"-e^- J铃닪ȜEbm ;ɟ~_͍ͭCCyCN*p+P+%S&*L` ckl=#yٮIQ5~&ǎS8nQ@`P뗧&܉ep,')o܊?7 #VSDaڜfX5ԛzo ^sZqX$0zZ7Nu~VcwNI TǙkQ۟9FƩѹ$|98+BҒ}Z>1. .W#R$r6Np{Ua!dB琢s}xLEWt$=6)\aƂ8H1Eb+ BJdCLʞjyawb+Ij Mjwu=Ǚoe {cfT ߦ_&&+5XӔ aMM]p g>:ʫE`m!6BM g0ˆ5}ap?~b-`%lȰQGLns^|:68~21e…/~!ObQ:YA)6<^[D/ ˒;T>ݟnt?֦A\-./x}Zt6J7q좭^Қfbʤ~0vݐ|ԙv>59LYr+Z&d@}j1/&噸NHMCA$0m~suw+̲ 3g",6?n3kd̀DcvY?jq<Η !_NN3ueysq"pe oni_qIJ%I1 e^vYځ?j>Ϯ^ב*؎"پp:)^R !+1AsH 6`|dfh|xHdyХy5=rLgQIH Nɴ|9j!ѻ{DiμcTrsKܒ}f5^FUog.ޛ^WFr6{;В'A~MZy<P/xZ6o"b6}q~if6 n0/&qxߗ_aI3琽3=_oO^(6@t}(y]kwtMlŴ_8<W"J]s뗼Y,lI=aQl|뇉-<$]ns*D7ʔT‹$%'CD VF ~Vas3z=헛xb=&uCz5zY󮸐P0 xq6C@;L[F)IȦL}~77ertwWN>i{Ja3l#,N76mVi 6mt:9c z鵏@kj[Svw7uxrA?,Cy}LKa̬nlv9̸5_;9ǣg}=0F@_d>Oks73,Ua_14@(*1K9aZY0&F M Lf h V,$=$N1"z@ qr>'`Z0ֱɽ2׹|"|-L_`fXK.}_Ipљ*r3|Ʃj]lMӥ&: l};%2dR=˸Ò %i qX4`',6 <62xoD$`9D$3Ҁ9\&k‚7&GmAs(d,Qm*Y\)HҦ!,B\6\(@ىLGp &+2>_UB~vH$|8/(F.䌀W!"iZ݉2aKvuH(e6֮ƽk;-gc|ޢe\=8:MDm[B6"^k4[ DRy݌ TfS0ML^jG2M=5y VIEXF*Kʹ=$V0Ky؊wdTe Xo;vxwϢ4XKmclhӼa;R:Zeݰ\  iۂHX14~,]޿ #?@cW8Sl?}a{2eLB!0 EVBoQ/'y-"6~̚=6PFF 3yd{Gjt/AOoF3\- "|(M<-Kdy:G\K1đ d /&6܆YZ:r7;.L BԜ\ؠǪbP9T F;1A*ؾD(>m 5 gsQ٩B*YL|3)ߘΗNK~vS~jC7iڊ4*_WPV"Dli4fI_/-y'm:>RJfqFBZgz2 @ÒQj0/ '@mLr C=J5%cfjwݘXk)l_SVBF;/kwOv^.ZgĞ <[[12a'GM&yڎF ԢR d4%,3[{1tnB/#".(ԩ‹|7+p.x &rT!:ٙT j2Ctݛp7r}8.U^~g$-N,k]?37h<Ԁ@4 ܅X-qn x`Z*>meCYx+o1?-L$ !ae:o4ы,,C@nʝ:-O&:b\BѦ-cTpAO I3yYi+eBY0iŜ2aBB.zIqI/2o c1,M[@b#"rE+2:g 22+ԕC8# esbU0hD `rN̾{5V!'vub:'Ŗoť!1]V5Qs]Y]TrPUXx0Z͕+X W0Zu{lkz6c z4Dʂ7^oQ<& "~soKv=54@gVoU]( hrYwAK[ XiLk9,.324FXތU wB/~mRL# H*Dmވ{lJTڣNWSY#X0ٵ13T1I,2̕nR# 7bSBHUe(P&0l6Foԑ~?KW5Or"Mq{0%#€4[T`㎜N ix#7J)iDgχ1w z h&MنKnn{+35ۅ16[-8ac0?6&d]f  fPfBI 9y3u]/bhIRt, '&ڦn8u`*દhhzo XfVrUxЈ(U8ҝy^eN zyY5w&KȏFwx|96dL_1L 8(AGMol hw4. 8 ~An>D.E^ǹRpr\N~ߥ_ RMSn | ,wB2>Y1lF`U&.NLF鏩J™ 6;P 't~q:XPg_X^V1~CWgL |3ߒ)~!:wgUeú`RZ+PW0xF"1"O(Zg*dbFFKD09n5*<d,=#|!#(cw)āѳG&F7_y]nyű-FQW^}TqTMCO11.M| [roQ]_2q*7xImκ3#d[հT̘8}v@%˗h%ĕg]9[ӿ*\t\hr?j۸qgXl ܂4f6JښUq ι~ܯ@vQsR f D)Z3/3EYWv\*HjrB!H;@g|9!ƴ%o1zwIMN¸Y8aOo*H$uȞG*k[P( K mI!!|T5"MrZzH#Nq?ݠy Yg%He`獓&49+LLMT˘<'T5P%" }0m# .TϹt@" )+qx J~ +rx އEpv^ `77G: GHF:,jbQ=(Dk蟖SG'%d}!ߣ{6ȉ. cŀv1fQ֍P R(,ޅ@1! l@ܮmmQx#g4ˀsCwU7t!S&|{=lQiNژ("8J ʝ2:mGru߼lhŤ׾&љk6r_${r>~}7 ~S7Cprh^C6зTGuޢuGn̰LZWX )rϿ]鿘DW` ѭᭂkL X}fأ>Z(OܹQGH0aյʌ7i1G0WBFXs+-\OɎ )F1މ` i5Ȃ}= NQN-~98&*sPY8ͬʃ15F-KhUaH൅n!7R0IÀgv8NԒWײRZq ]&tܠʖrH$LA{ENcf56}Ӳ|fdx=Hi]|>`1".6g~E֐M/A0D Q;;kiP+aM MvXʒMj{Ҷ}WBTr.(nRymF࢘!UzEK]?-ne̡Z)(;<̂!\7)4sn%6\ c0 bS+W4'z^ooFK5ҒJ([8N2D[>&5M*{|vk= [ܤUY?Ɔ0kGPC׿,_y;Kh q:%,lJ"&lLUi\ޛE͖ҏa -q'DW=9\f3fX~!MMrܢ_(2ArYO kZ=mkcmd43j 6 kt-(mdu:m=~)4 hmpz|;B|g1 ҋA |~1cd,Bevu=Va-͏V1cWe6#5J#dN~ wH$"8}ɜ*,ۓzĎ36~[W-NY0,@ K3.Ή|1|a(j!}N/d`4e2T)wG}&_3'Z!KTS^@oK}ͩQ%EyFBn Lzxb0v mFChi>#T̄DxPhr6mB-G0}ۿ_ zv$qh.-+,0l:V%b-=*o6O9J _aȴmj%'Put (ei"v|(!E:@@tg+jpbt -[M&4`o?A3$86f, y@xs[}RP_zwZk2r幞ĪD,:lL a#yȿrH oYen*QHW+;F &QJiWfMâ6V^wȄKzxٔ[A(6pZё$糗<&Psv6ú7Usip i#CkoYeKSܑ[&w~<>o@c96kz,ja m@`–jAORF2lI\ƀÖȸoQ^+Z7gٙv&ڀ@ޥ.KV,6 (wL̬?~_EEKS0i l(WF כ,. Y${i_o/q_ٞ3F,й}( F8{Қwnk;sڶŵNy&C?!b%G,J$\2 ˅&"]˽Xa*$Q#R=7qO_*MPdL`k^bQZh]|6DZ7@taARpnXii*|; HSRd)Y7;$iBʯetbYVv%qM0mTjYh, KӳS [vsԯ&K+-_,[/\Gx}>_a׋CBv ٶŵ+f"E^ ŚgrZ_¦WM']?myknM6~_I/H8ۜy ߬.T#m9馫K;ݥBcF2CO8M2ڨ5i P|3Rϧ{ʔ)32~1b|F 5Q;0W݇$M, F[7sNd|~.CSImfҾ=h ~z[0 @C2,ޕ^Rޖm,wyLvzh4ۨܵrE(G$:\X .`]iNv#.KD'qϱ*ޚ&5ti[#2 r,ʷ c?^%rCӄ q"1 |?_ E^ `C7_Dh[nf%GvRUdaǤe Z0yk/X*vP^7_PP`, l"Kl"-}7 iG\o;YB:*WW? oiGPS0n ŽI[^bo@gQCH;\*[f(Y5$ "۟<얧3@&K"VÚ/Hd\hn0*_JGJ9H*~EKREt^ҼSR.-|axDQC!ǢaW2$YIL$'$-4AzhéWeΒ-~axO#(TE@ޤyCu֐?,x>Aoq zw^sOѪx?Pd"?"|W eހ@3Ot!Lb,i_3뼡_vY>LBo &Rw<VoHdoOT()m`.ždHb#J*[\nwlC cĽ['gv.X8Ku!C-a,qz9/ZA},mB,ZAEkku-&g a$M"] ݙdB1(7_*pI[~YBzQzZarM9|R#:jRAΏI{?lɻ\ h”`.T$If#0 R`=Ew͆WU l2[D]6nX^qxjy]7%҅<9 ˓Kh-Z& 2&/@SRzbj7 ٛ/ժ Yd4Qwq2xش&lP "YR`7vr\sb?,9y77K)nhc샜CY]B"":zȽPj`lDn^_h 9ҋ"VEݤ Q^#0ٔ|앴Fx/Ȗe¢`i4괢H( 4y!o)WD3qM={1Cxؼ=\U j!|eF۸t>9D_խ* m]" .)PVí#P#ncNiI$@( Hvy5${/|]":zb1Gn ԩwG KI)6FFԳJS@tѳ׭G36hN`>ZM /=ĩIq;7/Iy2ԣav`\Hj^a]st0hYGVb!B5r`Nz,{a/RI/g˔<Pi(LN%9j=XNBn.V29R,zI!٤iDrdolJvc{`j,e#Iy]ÔO|\af]^`d-wj41guc3+\-ԛE~1P=A2FLF<Ҡ8 Ϯi/ۯQ@$~WsXASӜKfT="D^=@@(To%*EI_̷Jd}>rԘ63 a(,c,Ѩ..md"^B:(k0~hʜD4 [v`}T{>lӷ}Rpt/X1C'kV9 ?m24 jN h̜h;5ۣVHZ yNLkVCV2N Gٱ 9yCE6rVTvց(d^h_cC!Π;3_莄tx9t5x E9"fA^TiŻ/ͤuVMzʥ"f  ]0XhMJZgD]dž~kj&5d'ch Kd%'qv'!+S#CEqg\3>7սo㡼GcWEfMۙ~FX@A*]y&AxPOuh&$y<_PGZ įbծV=O&Յk!皸QR8!NFBXEZ0G*5[ZPaWFMPjO+ʓy=dR+-ksT 4 e26uf(NtEM{ʨv\ۧp!Ϥ-$K:#S|_Ο{w@GmAkoTZh(?=ym;:gYoJE w܂C(*IW[vwT|vP%!n9X"90o_ϟi }xdU4tNsI6]ĤdɈ[AAþ?HͣAsqD0=ݲhim~*~{=wv[f _m14wK"+Ң Qۚh@ fls@چ=w=R^+&ڰqcE`dޚz0.#flIZ-W 6UYL{ǺqMh[ÚVK/ w@^XMzeQ$?.n$hM:ɕa`;h$F cً%"**VdnL#YW%yU>;3M8Iz%S&aI ?"ħ$p'@gLFCPIiNy)7d{䃧I-d? g7ꈬ`Ci,ERW.O9ӴB-ZVt &83?j*mTnqlQ.4 ߺb^-m"}~ͦLNy#خ.M Qqf]/p{E87Gy1?{Jq;/?#m>:-Zt뻿BOE@y?=#u5".u<90)fH)-|3N.>%6%Dž^TmZ1jx>7!izz\>G*LXɨMe.!!~D/|1rʮzۧҠH$PuiΨ3ˇPnø,n}o#A񎷏Î3/41V QSۏ!ө;x棫eo>6)\ ] ~vr~O^t7vBbVܢ'F'&qnK{I o\*qY<:]CwgQ\.^~[ɜo*:uvFϞ {UJq"̝z:x'f g=VlC1 t oihb=-&T L%t>{L'Vq%H]!FߡT贄ĐKl:oO!!# `AQl sL"D3wc$u>p=|<%3܀ZyrW4ԛ!6%P=aW-46}K gy%QT0Ώ7 ǏiYs rmzCE-Qz%1 >PtM˩n?1*ZU[?VČNg!S(k#ۧ.ܜs精 6"x\t!$Lgw2ߎŀጃNN_6,׀@b=W ":TmNfdr&U?Mq bb=a :LZff8É>84+ [ysy Rx<:La Mi"5+65':ϩ]Ale8dAu\?Bl]5D ='394#`@zBi@צA)yłV:GÌcR(pX40G#5i&x,:,LBkzA-tPA䫿j``ຣ,y,hK3yT)P;sVwr9\,VNg*^aeˈso#>V=>c:Q$E"n ͬ>[E*>M?)6 8ERAVJ(ݗDG!h 3j- P=72N,{@1CvCHCt.4<;kIh-ЂDrD~:f~2]HroOk#fĘ%8hQ ~b@nemj/M4_/'v ;Lm݉osR02~[_ v45OpZ$;ni c(' {2OlZ8ȠYw9($ȁB&jOij#jDsҖ ɔT?m45Ah is%yV9Wm5e[9F`i;Лd0D8X:Ă4Ϋq]n,`I;-F2p5#xnzyY^pT\Ƿ1riO8u?[:hp/ILNRQǙs)$~w<# WfL4*|h2\?~!-MV,}֔c2BD{+qOjыODNz\ޠpD +<DpnjT loIȢPM7Xu#d՜3"҄SeOOLЬ$U(R*̆&ơf)duUp/?twḠ>YEvAhA$Tj?-C_Ab%v!-gͽ]_wA"IQ1{rfX!*ҩ{_Z*R$wYr7 TrOCH'9L8^(Iza?H!Ҝ/;:f]4V\lc>14q[NJ9oړo"qŎu1;R<mgdN d],8ɱAhPTF闊8N:19.^10rF&!=Q;wGso)sH{۪ڀot;"+j- l#8<F"S0abmJ,.j?d}Tt\Wq&'_XË~ty3~'m*f3c0To%7^ jo|'d=k3fѰg6$&={X'!‰ۂ#dUZ;\4o[&N^B^cXƊ6MSM..,tՌ9lB?EMV0&c>O r쾑gwb?F㫣@l1W]A bpdɁeKmݳ?/TĉLmcce2)$h5t!2[>ɺJO0R*BJNw,rhrլP9a_d libzypp-17.36.5/tests/data/openSUSE-11.1/suse/setup/descr/packages.cs.gz000066400000000000000000014201421476576476200254570ustar00rootroot00000000000000ۚHpackages.cs[v8}W`yOK-/wwKر'ʥ"! I0i[u>6G]q>u.T~nff)VtIFWE_& {]5V  ?ĪLT *,Ku }ɤ'iH{b|`[7p3˫f픝cʊ$@sAX/RŔԀ/M^e9;z)zU(FxXǠQ!. ;C #3#\O$ȐOzi\sK3=a귆LJWdJ2kc5yIȕfL 1M,7ъ$+=IIƲ_k ĄƷ@B(3@^z "BITUPZc+4At G֐xنcjHd Ϲ"Y͐9uxO8!t6@A06ibMÄc_#B_RLKMHDKp&Z0A7UD٘lv)?$`$*e*e o徢RWT}yjr SRĠ9}eDr*2|1P}@H[@.jT9՜urJo.ζ"Z1H٠$[õ~E.[]GMi%&L6C.cª@K 5˕)m|x[HK+l]>:C*BT+7BX%Lڨ|~L1~׺ͷV{ N}^D~6~u=v*~ÕQefXF  Y_Hd]#QLfCn\%n %>ysx#9%T1u1O O[Ob4V`, T8ĔNIA$]n"ixRoOC?qw*Fȧ{VKa.0x")Vyk̩//2ڞ lC)ه2_> sHMFON[Gޤ,S CfqdKH]_UM[[snb4Kʨ~JŦɚx,˜z g=EFE,CEU1vU⛢S!H&c4牒E\k ϡզm|7۠rk<֊a/āIL@~> D1fhDeik]SujQ[De[]Ȧ*dnK/m_ŋRoY▅ VJbO!k6 (!.1zJSS*1⒌Vw `2g)^4U]dsk.-1Ӡk{u#" $5 97NC3t,A{Qw^$׎)G]˭U'9Q]éƅk\,+oEQns'f,QI2aSNG`.0dy3{Krpo9"BioYC2cnY_*嬶^: RoFsC+n!zڪ84 Ϟc,-8ډҝGkŎftN'' )_N^Go(&;N EynPqIMZ^N@c՚ERRƠ]#Q9fxre0Y 歬Sy:#,oV.\sՋA43ԍڂ)?r!G1L WQ+haE;6OLbW6ݥqυa\osm3^_*ytOxّEwco[I,Nfx*x%QrېEOd٣EԹsn.8X2k?BaGӳ>)R |){Uu!J%\1$H}{o0l^~'CszYzhZxՆeZNgkt2 œ-?'MU8q=zUƇ$#.M؃b<"~J׼-_p8_vGXNѹ-|Mw(pm%}6.+ޑC wL'l1rm[E ۀYOٖ%іi3ΩJQ.g@s-viEjj0SU}A*t~FqN#V]VHuǶ`MmR&]{xMC:D:c!.Bf'o4љ1t`CYGc @d/(܋GJtt3&>@d}@I(lꊑ1H ^T;8t|b\"mh>6EOZt9-'ƞ謥nיP+|-{-AZXdŸvή憻-<6&QNJSpBK6JVBzʼnKNkҭs?K8릩b؀* 17+iB/+I@H-&o.)w,7@XU{W)6-?RJ_&HZe c} [QϿe@uMܐ=ߨB& v"HbD(]Wm He_ۻ79ǻ']Emc 5%/vc9֞|qmɀ{{=m<ѯ[߶?&%?K*_"rs2yv5;†Vǯر:w3wo& _e? }+B_u?忱/NۧHOW/in#_4쩄ީ{BCtła2N \QNrTXɹ E#R2v7:_ @kFf N\ڨsGPaN6-{,LO!&IlLn"`|Se,:;V+ }uI(?1`ِ򟇱7p=`(i'=.=9MxD'ӗtL 3S3 tlE7_SDp,nf7 :Ew!pX2LNADs6ғ1ߢT(_>B:b#VY"C$ P|5不R|Tr*AxJT>Z*s.6Amm•.iC me@.u% v,ӗRT+*̴CGIj6!f%I_x[ PQTw&,G_'y#ٛ1X%S61U 4ŜsVѬ3". s(F{n-~n)g00T5]EG k8ҡ- a ?CB#Օ4?7 gZ ZwX]xU+ @1֛!]rs uT"劋paH#Y 2{~+F#@)\ha Gvg,LP188ӆc0\bҲYk"ȼ,XR| 36S8d(~q5شAOס'`2|2YAG*l)}t+w8+>g@1vҢ8Ο'께G+egpJځG|2`h\6 l|-y\` 4hb .Kct1[@q6A51܍Ip#{Złl|Wa`9Ɠ("Ҷ~fZr/ i+y!,:.M,B'9I?L^$&A4d61DI:T:C X@qBb)l HLwEgwf]Hj/xdkM!~b&Xwkw ví\?@*'$%Rfh$rڱ \Ŧ 1v :Wxԓ]6ؼ[5 P ySs?30.Yj|[lP-p0VY"C`YYOŅ?hA0@,w Dn(ZRi\;N\;A(Yb0*aӠw蔫 էŮZnDXAf*U9d5Dƃ{EH"cf ClSQ,yO!:Vݒ""콗9eKGhO[^Bdƾ,!Zb`397Dsݡne*§}^n:7R ޹J)ɱP"ͣ~ۇ@0(tB*aY:V14 b ɋkf紋oiZw!"^3:+w&Np(o lJ18mvoWK\AwXֵ@/T0gPE)icc& i53yII@JڔIB^GMFbzh_GI$ ˯,蛞@x {ZLn6R˾9TV׌qi9/QQ^Q0*fǤIݐ"T3JCTӟ;\M) mfM.``8L^am dW(\˾rlڮ 9Apf"KӾ/J,ANiڬ7),V=ήo@ypCy"=N!3D>?)\˩qR~ƾ !DJ3 ҕWL?͎XQ>mC^`."ȇG l,Ry|̧*azҖZlW)z1{`ec*݄э ׍OŜy|u_a'6pJqXcTak8CgT+7!{R$_k[ʤtn@^"$fL 4S2`SE@*Fm [t<"3@:~. sĻF+pNΎMlد+9 c$UܧW G)ʙ[<^.p!CM?\f+x֕7P:Q5(TxG[`fml)6MF~n6$$?8lgV%yJq/Sd0 #-v HF]I{!G܈y<\GH-5!/5ZGhk5zlFr[#L^5ZGQ[ѣk/5,5ZG(^G(^ckt7Zуk4 @U\lu{KD78<3h_q&eG>LAx҈L7Uv1u9ln朢o+άOUr/2ޢWWQcPٝcoF]?LLvf2#lS%N,eMk^_v w.?Lf:W65oּE}L3M]z [ w^@?yzX=PeK ~9(LϞ&/kblzKa7%q<;(?Ϳ}[[oQqܢsEϑO۞8}nQ<@l]nQ{ܢrEer-[odE-.,o;R޷|ܢr]->F{X>nƸuL %uel RyJ>h L? J`yLKmQ [!.bE`~m`%iV+g϶k͎e@!`Tï=!zQs"7MʥE 'WǘNQܽU<##͊+Ռ,g>t`hrddD ˋd8Ixg_;Y>VvD~/K! {(vRэN } "us7"j E&b<<8޿o0:ѬzBkurV"ܣ+ AT` }~Y22 [ zCpA4h Y!(1[0]>Ebⴹ#z@$E8 J| )+FGeBV1!UI.a2^iVEycR#Jb&(B.+U"z>X\ Sajy2Z[vRU"Ł Co:z=zC7TAsk0Mgx@ڭVk>O( >T+ĹOWgI azAw辛\*~'ʮ j!=Ϣ5>C'Rg~gx%_K.+*Nl1kopt̑)W᳌Q H Ɏ~:vSuI-ṰݟEolgl~t8cVolڶ5^{V鑣)OT^" $摔]yvzb }>ZiRYXkX^^+8wa|q>Wӌ n1I3q |*!GڒEJ3Gg;ZEe\euʋi4a0Og{St UѤpȼQ=',27UCSk6ͅhiV铗Z\O`A9v\SU6AD;XIM'W\0l&Yjٟu k2;֟:]^kƫzկ]q#cl(7L}+/mDyyY#lzfUH'=Vk 35;.:@WI*0m@?O;'D`or<Տ=9Hi8Lҿo_w^>$ SXw q}U'}leYGM-#_0xK`~=S@{",#M-㖕|,b[ SCxH@6A1J\..ޏY &bFg̪Ww5e'`Ђ[Z~n}KWJyG 0SyzsnrY`1ߺD=Zv%q@jm5qzǒ3~Li[=i<{^2bn.ZZmݓbJ۝@;b[BK΀j>@Ŧ~_<=OTF !;f+XOX]g qor8$n9]q:;X^NBU {5aGee.A|d;qvbTR]n}&9HtA8Ӊ;B7̕}j6oS6=q~-roC6Tfo4?wZʜ?no(s~e)Ć(hܘ b %a6Ai*+9N~cD Rչ*([8ܽ;tc=IJTEvf3@ۍ~S,( gwooa Ňh$v߁nn-Ji4ibJ]io5lÙRT`1Q u P`v_s$s ^fzۭ]@'rb8|aNasd5kI'9VfzX |S XI,/}܀OAFϣ19zXU0+C뀕|!]ʍ8]MY?P*^dس*[ `NT2RL^Aɋ5CLE;v$}S}jඵ`[fmmU"*XfMR\646;9N1utg9'j%KZKDD֝|mؐ1Rҟ34k*B{pnOKlmݭleJVZcm*d=8Ģ:g^O)RDE05-{,em;DYH^fI2^B×6e>yWXI5vtd=iqxqbǒ;@ /Iш|% VBS@:#$6eM_m2^#8#Fv&vg AIpJ5 B+dQz!V.ڵ"^OH@9R$Qt7z@y${?K(wNPNSXa3BGzrr)\ &$7 =L%&~&7Fdܪ]&[ <(liJiר d)pnܣ Zzmf\>\PƾVo V*^X˽x5cH+- 'wfsʰ?5Ləxq;L.~Swf0ś1u3 6Z^{5rT)YǨY<{*ll*ÒIcjc<ȴJ:Z΁Žpjnǩ^X`KZPGP?QeD׭40C !OXELɡX91I}4W|A_c,ӑ"X4}Gzcmm-x f070-DÓD6l1̅ټ@P/˦K?=|{Vx :L:wLDž,5HIvBBu=r L\^;LlU&mKA:D޺UmLɐL RZcfTٞ"\?ӔwhL"&gl"T50pjϓbN?IK(/skq$mw{cv :q_s/!!&kjJ%Nhm4`bowϛ-~zy=x5ѓUۯݚ3$>ni(vh3}(]+qϝIb┫[ώc&l"-$&9;p|~+. 2TGcٹ`+*le#/ݷ6j^\%iml۵<ɤ{2}.}t*cx!̬]3VCLj5{miP Bȫ|*8_vj֫{~`+P0%+]$+ J̝_.)QSEq3/aCNF9Tz~$av*KYun>̗wNݾ&R5' ur*SP“#Ǩ_F y Zzj3M)&]ynV,"%ui,SHĮ8,dc9CA~}>UJob(Դ-& ItbT9ZO|$!%8=&H)K!7n ` G6 q? [X"sd0){:=& =f5PRAQ3?˰G =,IX9s=Vgr@B!b{CMIiTJ[ r=ͻSMG:GHEl;Xx8 ,b|=S%,H !,&WF2S.1~1c~7 6%:963#6q'#VkxgPyHۤL*!]!0QУ ~`R$4YPtm@qGeu:a1X;W>|7KW~уa>u`X~ cO@V&cԹ՘UUt4IWB͸܏Ev&n{9uM`uX֏ g]Qn$ ~򨥛kfcNͪJ f䳭6}L<#];eH(4p#zZyǚYv{85h{/ NuFO~[dwXpB`tF:Y$ لTel$8V#F爴xo3wlojmmml㿛-w`/ X; 6mժN6]i<~M卆ƲDob<,C8Ta.( +*KRׯٞyV]LwŞD0Kr`Pɹ za+pd֦_>((S/~4MOPE Xp8c]q 84)X+p^smtSppai-d>+=2Ca^oNe9RiF_<СaB x_bT^T=ԇ q뗁&fG^7ֶ[@@-K@r F vK_=A"3C(8 $P'7GF&#F_򯥙It Odj 9tET3c\}؆0x-{12ɸ0 5٭#,vJ%iZ3W7DVD wb̴Ξ[Im!ነo`ډMx,! ^juB>܋.)Z95`H ǭ0]3Pa. }Y$3RL;x8tuKQuKQuKQC:<(x؟KYuKYuKYu?ʺ7 SKQuKQuKQut\QE1/]KYuKYuKY˺{7jtE 37͑MO2ZwMr\,{ ."[He免1Ay$(gm@79ߟadl(I^nL{#9EBH2 q#MS8rl֖hs(@ڢ3T>ΰ>(z\2="r 툞m cU)mI%+m^\u.RQ >}pq,ԅib͆F. MLK`2}:UXh=Xa/ѮiijV~hjX|c1fs61.^6Ƃ`nAgjۢ"5鹰>5uD߀@"ól,N[2C!YQ!y9j)̵-`HIau%8wÌ/3MeDd|^!j)UKq~ ~)pH7`ћkAJ#8SGpա@2 on/c80j+>Hckۂ]s{}d'j[i8 p^x+ˢlĕrRO,Jr+@PrA O,w5YSn@60)V' /hR?[1:tdmx_VOz[X~V[vƪm;aDY` CM6"jS&]tA'9>NN^W(ImtCJ̗Ϙ3'rdiK61/cJ]RKAqoQ9 *b|j;(c3cPTRw:!RKg"'[Q EQkڰœd4ׂ_[F `Rrtw0+SrT4JgAb FCZU򨕣e(zwAm ,z6$4U1*,@*?KǤMܕ2x[pb`, .dg&1*2r|ρ3ѧp$h׀+ǹ([Ŗ JnN]bPWIG"§ǟ-e;ҏnx|)A PF ;EB>6 @fhsq)}lNrUbKR^U01BTT*4VD'<a` {0财C.sq'! 6IP7j)tzwVf6ԕ> GKW÷i 'o)6E4Bp͖8;%=j.!"嫲}oJ.0x3p~ᱵ zsMģbh3N=]&u2/tƞ Z jvS!=VL6*=#;K0207/A97buj~9M mxb|@kC eh/@ 9N aK#Cģ2F+ K_& F^V] r>{jaOpBGrYIvŮ0-x:don~`DNcr j%fVe YK-`0 Q*N`Hyl#'{sLIc{{#{f p_u@-3hC"0L{Z5`;jql%?\w/V&"3apBdL)?0Xkz6&4EnMmc؇NC̰lr)"F֢0 aӉp~]Jij%7w.">$4P/Q#CCu]J9T" )a}|xCAm ݈X8gGm: gz,;>U^יšŏqWH2K6Bgm;qBC\Y`:2I<h-P.OX6y/@e^56 玈jg> ;apnr g7l3WFUpv!8cS̑'LA ӴoMuHYƹ>"0f:1)(m5( М=}`ѷ?Ki]Dzg"L [d/?B!&*G6+$.|a=R#) P`fchB|;OQX= e0v.s@@d`6ZFsi6D*"Z"/_)uf+ZU매x8<ΖH#`ppEG.dQt7ZЍ㶏9 B고X4eiUbX;HQ %:PbΥX/9+=.|,h7p.oIidmd%Bpz-/R'j|Xॗ`Hp[#[l]x:Y0# ^H`yL/;I tEZtd(jab?SGB6zk!b20}r"+ݰ8@Ǭy7t0 ݥD[Xt<6JIfR/4Ny;컍*7>һ= +q93}ImuI2pv0-$7gpJmZC ce;D|qyqpt6_ɺw Ԍd|}:OlyĚa Alʍ >~x+ 6 KT"i:v8@R@<9, Wz){L/s 5wA^FTnhRΰP$(nb!?J;IIIFo6נxm )g ~ c U{!ub7 _Nȴ-'P&#iFe2*F$T;C ~5zlǀB=E>^!O(ҩ*Z"ԥhMk vO"45Ec6&EhYVzc4eh-_ow-aC/s)t:ѣ6L%^ftynXm]vѳ6o }αPt9)BˣΫQxDkStB[M:TWzzSjXtFzI rLW{҆=bhj͋A'i^,^6쌟uHdz _כ^a{y/ýRYIHA#!EgHHQwD@ (7aDiDg%)p@7¡&Eklh&G ݄4xt,;%ԛߩse]؁MeRئƱb]^.|lP޾b7~9HJV3[zrfEIv;Aj ͉>1"LՙMI*8$2b@A<79¨A~.< ]q.?j1n.M3hDE&簼8R+b¾TA7)l /w6s.rb:=qI6޶)JgzU6 wIH3a4z)ˋK=#<kD6Vc wyFyAK1nv/v!?vQEx Bmv崏u%|p$/"QQL$dʔ9F#Q`L/dsC0ă9>"LxS}l~FA^mx:3^xRe; t}pPM!&uVӯ\fϰ| zMnM#.,?I\ۂlQZuKEoI-Zj:JlGl+j|𚂳DF'E`̗zy#;D1Oj>i>Kp#uqbC :xH|"J'):nٹO0C)n6tI S=h//Numl]1Su6a?. %fs`""u[?M|EJu.|{:LʅCO̜&=ӞS?= ȴSM g%u?CPs@sHwMEޕ62iVM9ÑKɠlu?xqf&3(\G'NR?={.5W/DttݕnOw:$_6GӅoZP$J! _RJHO]cXy f8M{`p툵=f=HGkb2dѼ]vqd7ul^9GKvY_EY'U kCh_]226 j  )_7^פX2+0ټE6m4OdGov׽]e?d~mo-6^\|rt8I[}J鲓_|Kdvzx|rFZk[?4J8W߾G@gH>ItO_FέHM̵&)=i/KӡyvH6-4<%-%+tws.I pyJBv<[ oW#WȏkYyD&yu2{kjh='LSw7H4\Iڷf-ԮȞ $7, dWwp^\1?&#N 9jfyF|uxe/\)4oc|ڄۧ ]kkU FE <,n"cqHqi-u}v.(- Bxy݂( U|m74.J ,dvEeZAWI }OUK`0W_ rm;i]N;7g=AI -'pW:NH|l [Ԁ?˸t#)NgͲJ%.j6_Vuط_{٭dvKNfiD*;RhIֈƕ9YZ ikt؆eW>\H-cW_hTJ=q9..io㒿\"Vš +RQZ)|7`ZT@d ʽnQSicBXɱXn{$-(#-6B2"Ŏג+\@NJX2R,nCϢkItt8)oc4-V:n{m} wZ)= 5A:Ej*lfjKgCMʉ9sBܩY̝\2/|R:&mC8j\~m4eQڕ eu~!OM8*4* ?[d&gJtw` w-nK?܅{3-{1Id}6ׯNɨlz֟x3#PDhcb;I{po1yuk׈dQJWR$QYHx5Œ*t+o:Y伲SIq\R>`8Q܄f_ CU^GwϺ?U91Jrjի{Y(|'=X\MLʕ~p&!͚e߬8̤ |gy03bA(UD+R%DIشHFW(P&I_^,DG;'pµUX`n)5 ejgqhM\쇇K5jnל{MI%kV^'6O%eOX5QpWxp)oD222$O'G p;҇@RE{}EJI-j"xR݋>OL1'%LLMMO璦ie:tX50w3xYLØ/B٫#x< `aiO /^(j,*4emA|f_eef#Zڴ.m!l=۞V}-"`YQ/6nǁ8k<#6 `]rgCroȨkl[Uh^?iƋH MܯL8Kics(Ƶcw&v0 L N+/3: g'ccBm `2GZ0Pc&@ ڥ_8/`R 3E+Mlje ˼R,&YV 2RSδAN@E$ǂqkM63Zl'$ |sQ#R>$S 9~Ϛ]J_A&}>Dqڳq]O;ݟ/E7RmPȀ˘++Q 7 P$ bS[{+}"TE1qāPOTwϡ> !ItF?s pBncWiq[ uB7~9DRD, ,T;CoR /,.HSo4uH1KR}Sݼ`ajT2oW<§͍x'2.@^{LåUu7t6wZEMt]c06XEʯY(RmOp&q){0|dA4,Nrm(b.kj%k2XsžHإ5OT?Q6Ayq@:q* :71EO<#d_s`hl07sX兌"P需S%}8#n&%8mٹqt>F&l2E*yE$]GtT" x`H:1O& J{&Vj.Q44 mL' isFtɪ؏; fkЁq=V$"E:ҕJUwZf%inQ+=v[R{e#ߪ" i VjyF? -kY0+XT`.ʉVYTbM{FbJUW]TtiaY(nxP13oB{*)MGUndSRc'6fzx!2m` a$(xP͆zx10rf\I A HZeʆukZfEkK8p8OTB"Kc (mtmԩ5j6Z~qFNT$RKPA6gx +Ҝ(}Q(TcR0\ĊkXawS0flAXeK:oxں8;_4xiOQp4C^Mg|;eFI56ћM)y.#?1Lz$&/vf$U #2Jk<> 7ZT7pDžΓ]j:[%Uhܩ68Үl`r l/xk0q3/ͬT(yj@=k$aʐbd+G~s,``IbG憕dfxH>+gs?tScLmsQ7ZW}k$zjkgL}}bB;Rp`mr31Va#B$>C}:28.aAɭ8( ` {^@u̘I0+TBb|TR@Fb s!N"09[8VhG,QpXBг!NNGgm)رf8ZMrI2Kq9Dum'zep"h;aAyjϯagذ3q4 ds}vک@HfT`a-EfJRR= ]pʛh#NVnjYbнt8uP.zR6538E.+*vq]AY<(D5|cdQCMkB|!2JқmA,Awu9kO%{&c JW`v4@N'[} 'y#H7CV;Xh6|C }bgW&ԴD$MЅY ]6dli{tjg8 {Ugr5kR'bD*2`'X8;AGXNm.Ksjj_ rqk`?yh2j jq4:4]sc+k5OF2`ڃrk[f 6@&Q4G[Zըj#@hqa`%P~dPO;DAVb5N+@8x&"dⰱʒ5QJ{AXI7"\na8R AvW0 PL-8(?yb,KhRZjV*.9N6u\v,WDKGSSwqǂ90#U#r\cliPAjBJn fź蒴ܱb0 o,hcPIGe 5C0rd phXHmNΒ]åM|$"0oͱ XܿH2Nݡ@".nzfoV`IS Ber"`Oˬ k\va y6lB>INEfY3c^RtNI䩲_bQԸH8f]JXUO#io[/g1O.u`/Ij5o&SC&UO!4tM0ƨth1igM4R2p brwu3&)ӎܗk_ 4uf~(-ē &|ŀ@xAq C&6+ 0@{,˹F)2ncҭD /]cKDb19~ m Bf'Ody%&^<|4{lTG~2Hd H\XgPL+ H|];+S~CX7v= 7 G {oPakcc{+3o{ԦdÛ"BTW%Cd4%²S 5RnYb̲Ea梨 xGeWdBB{eËC)W%QCy#tYKe5# Ӵ-֊4{ym]"iAaK^r9~:eC\I~1)|8) B7!ɉlHb0e;}{Uc`3 @ ^tk- +g|"|>`9~_} 6_F.%yj"J5ãGmA?RLflW͇\n/CXc`кn:U9PP8;Kcl*]WO2)Je2Ŧ(%^U2Ld:J[M"50S~ٝHF/E^~z/fZo2 jC襇 &ಶvf u=Xt&ޤ2Jͣb-ы* uL׷{S+*Kĺ\*hl[[%7DZdXkpTx_bQK i;(p-Kt%LoRKYdy??4mQeDO׀v9oUh]$JKפeT<;™-jmr&MoV_?|XJ.(% b^ߏr|CߒADT ʭ$m4 6=sֺzm: hkWekzzIc2u`}n #nA߹Q2{21o4V1M,1]ҏ9~&+ůKc˚c\Ľ`^B^ƾ %K &&^ƾ e+kh6} dcřua-h-r|T!.C4} D:ˈV `#tע#PooA¥W@HEcַKD c+7AљD ±nemk\QnUoxR%֒i[ Yz jlkc\AodbXo6}b+< l߂$"I]Lϋ/@jo#t*2bFd` D'65;$l`NM ̹_CGN }"$13qg$-/R6;HmfA ίNZBy?ߋ)ʆn4BtmIXlnȭ6֫pz:e3h?X5X^G1!Zl] VsϕLTtIer3rDI$NMBݝ- yυP|]ez5}1Y$0)3sL#|l7%33qy]dFF(J@:Xz+ ,dv'3R@ n Pz|)ʭMF"q[@Յ~ɕYغoM~1F̘RoM~.llFx8W74ǂQ0zC[9Cqy7 bВCM#ԯ7K=At`eݢ5 [:.izǝMƬ^}…9{†@sŕAv1RITM{Du%GT@WWRv rm8Iܙij1?Qo#C璿JRόŀɚ$K67RVN'HՀRIdN}$Da-! 0i,=YHT =Ԋ%m5 Rw/>`dz 8]쒭-oʳgsc.H枳6@a=QІh}WFި`<(rwClEV(͔y4aŸ]M[NZ^>&g>@xk4jowOS_#3m#wuxHAt?qQ3XGOmUY;靬(tIO:v4ҪGȱb.s`ɚt7U7>A:bsݵ7Oi:]d0hϒr9mk383縑]?G*2Yc*lO>gp;Fff&݁r8%t4c Iۤb|pnj2 idED0lI0 wx0~j#GC@W `\86j6YIQL9J9NN t v}$O6X~r@9 'h] NƱ!d2K?3A+>߳Qʺ Ko&m_pe65JB9,9JmR/N ^Y6R1)y=-*&nKPr:Ty}}җ'N?tu狪.Ihqw2[(!.聻;0[ 2)rH9B{1Km6!|vc7:q+|Uer>MqIB?j٩2?@+M gv"j0=cg6u-UI(P "|  @S4pqwvغD:"*|xBr8馓(5'O3?(y 9Q.3HJ[ Ww6^y7fTXR,3 uLK8 7tpIvlK3\ǧeP"4+h/wٗ0Б!8%gP]m6ϊ)t[N.zkK8эzU_5<mF6"uo:%zVqr{VVHvQd4"NKr}Ӎ.t$[1e>M!=iv-#b2ǝҔ ҲS+<[?ER}~t0p? ]m|Pv̈$$RKĴ b #jJ MO8DQ0{&X]l&nEXW3Bylj`bF*bL+ڽ)LfdGT%Ѯ \j8&7 d1oώ-!.Zc: 5FTgݧcj$꥕V7$ThI_4$ddԒJ $HPJA@MpMˆMg|Fo[~늝䔘"$HOQ6D]R#>fPgٴ5uhGь\U:C1[cKh4mfx$4[H^tu|֘nq\k״!kgF!慅<(g# 3魅.䍞s&EjLsjITi='+t$_=f:yTY?{!IHU&|ҝVwxQX/6n;9n}aR g:8\;;~vT>ٱJnm *UICzv8#pԘCۢ@{jJ>rݡOWFF]]?V7;#?ql?{j?h ق!SQJڮlQp`کr[H z=(e&#?[0^/'1BO7Fltz_<ʚt!4+>zM:8ѝْD$z[ZĈKK([rESk&AȾ+GZQae74W὚Qzc=9(2zJOXy3ҷVQ+ιOi<E|jd0|aD暾Cۖz_egCK0 i'Of1띁!@{ [=U[g !mb|v쓎َ;KZxǡ`KcnT8j Yr5Usc7}kMp`'f,.M[8Z'y +j&>hEu7xB"g4rhUF{AIHn?Ѱl͖8伳$|{SKŪmkt[)hZi4,EiTNeкLbjڵCGO!-~}[",{3ir,6 t\XQ),"EX"o,߼Ufc`?bv wӪ,8.an}]Aej=p| b pgD Z)|ɏՄ$C wؙ\=|A)nv/M6a=+V BۅoGץS\%sVܪ#ؐNvܔA!AkPFϥM,W[˗0-}%B%78.Ǐ@qȔ^xBiXYLgr'**Z8 Am5oT?>^jR{@GHE{|ttDlk 6\=>.}i$@q0 ;DI[ԔNK#Xovhc݇mM9N\CZ1w4RNC>IG\hIHaz/Ew8zwvνF;[so;l{[۵iB6'y( ζ}PP/Inx^h%ΤLb.eA~/ͦl3nrs^s~:axC[E?=rLgg9=vH?9,a#fQWwWQYD tz|a5&fh K{NcNB/hI kM3TSNw܃8srS{UZ7= <}qaD&QM{@]i fƅRUIDQZ[JF &*,R4C߮4ȪeI+C>ӹ2Πf=Uv}^+EfgzV٫s8< %w<0So?Ti ^ug[}@GGWhJ n8ҲStei-:,t $ߡLu/Mḥ2|lZ/x'9͗!iu{T*ی!b%mφ}ZYD`ֺޢʿY@ W~絶qe|N_=?Ac5뒇Aѣ-:K<%sٓOpw҃Z$ +%E;J=ujgu.wՇQ0h޲>8py拑cϗgYz=۞wLmED8Ͻl'ņ {WjڏK?u:%q43R!BHivGA-uISqǿ/ˤX&i#MD{"g EH,`o>qdEnNUCn8ӄ!(:nBWt%CXTH9"Q;X!x.yCC0fqW-'v*Ći =ꍺ}Z M/Y$#mԾ5g=W0iKhfhRtȅf/`" V7fgs"yE_'OR.U&VՅ^u邂hv jJ1[(Ꙁ#pmlnlo4ֆ4p@tX*6^5gSlo?'?^{on<Ճ|y|AaP[aersPlm{[3#!|w흹P;Abֈ/E x\Q'Rr{.N9Q5#sZEkm5 n4m/ܭMo2Kq3mڤ(/,I[+͕t;u:Wc"%FW{n80[!uڰjSb.eH授=v" 7/ ^*FE 2G2I|B|Nl}XT\%i% 8R7 ѱ+iְV]@Pd* ©qfO;*v[ wV>C]Q@W͝kv R1!1+l? p ˩P܁ E{LO+tX4U~ƥ𸜰,1a7^G_Z@Ϸ  Ȗi@[[A\! Qw @Q[+D iJ" qoA/x؍a75~яy+~Űs' ~?~\0Κ$B1z?,G83Kd%qh4Jd)iMXwqOjh *wMoգyaTrEs`jeooH6_nE5J!NVRˣQg:2-w6A홠RYڀ%2!LWyLP I&1 sc(nҪfu~_VO2d3uP[e࣒JT71C vx>hLyii"iMu5zT/xL렻౟ɂ ~Dǀz!i#s<6*BURP-ƼlHUTEcBINF |s Euq>Qb.V7Ԫ2RffZ K:{] VM0[vLQGr"N*|U4p{Z9wӭim~)󨦅L`'[Gw=ިG/lNk tj 7}d2PṽVO ٷ(pϸCs-q,a j\\ U^(v#%U 4ZV dӠ[0 NȞx:pcDEC*2iaI?Q^Yy3g ˸i5Bj^4+*n4ط6 UGiS0ߎ5[C+S Hh8SvsFֻ9i-É0Z7܉bX =E$AUMy.^gU )9?4ҍ:i? t$jsݚi– ]f6Ts%,c;LQMG萱꫶,>CRBc;c)6( &T(Tw&M(5 3[ hdMw-Ш0G#c;LoB܂&,PiҸ;ʺӢ6;۸+ݜYB}H0TV8担*ԟRQ[TZ\$7Ydkhk|.lxd8 բ>YyHtB/kaUĠ܃їpt8Wam{4'Cw7I|Cx}tPdjAQdd9) 4Jт,].L oe>QNJ"y؛/6z:SyP,C^s&4t}峝Yu(8A.Jb4GRTdلsvg9Y j#6Ai``XPsTDf1N1Q2IG[ڶ/Ӯ&ay̝iRrσG_3| e[3 ";͇G_P][~%- ?AFnnJKhTvoƸfn7rxܚԍ~Iчw>[[~U/oOkE^x/Sa؏<- ⰷK;a9hJen໩+!d:gx=~v%omf~ew%S$l &W&Z3q_&1rz/ݭBD~Qy{|g.ooHV͏{45.Ru4`ՒKƣ=I!.f _گ0˃v$qZtPVAR,86GT>pEA#25\uͽ xP#]񝷂Te &CNAQ:ecNMqD/[I"κ s8R/(ʹɆD8&)H4oa9;Ӎ$ 3.?.X6 '?tcɕ)HjY,%KN_O:j /C3N9K.SIy!FfEJ$Brr9Ci \~ a;wa׆1|>$2xܭglYEZ*X0 0<78I?7/.v$Y0aϒWj1e+NS8J{$Pll0"sٌ\}V^rzX'?.{y%Z)rzQx~? -U d9ME+HXĹ5q4{}o4 p6#[zRZTvV{f~?.~)hp{?w44R8?x{B-*/:;C7I5_9^Av t1n^'*UIc ܗ#PTVY-LxcP2@&Pt%-JthpO e]1KܨLgcRUɾz 3L5oj,QZ.Ի>1&X"pS;Z]qƒ%%Y8JoӄLJ3SUmV)-H4#v(7A,5v f;&3ڷ@En,s=`$see@ŅfޜӹKVO+q~FKi>{g* mߒia/(#E+z3gFtüQiziKltCP+_I>"}.R5 rN0_>pɢnw<I/ڴ%Is(5pЭoS Q`-;[ֺa+ Xm!άx[U/&QP o}3l 3 V~szkq?Řf@u-m1u"\Mdˣ?8t,A,hlrw@ l;ǂ3ual~f~Fz6Jq̳E_3rr"7W_yQ 0ณW@"hڙtҝ8Z4 K7졢>lG򹕎)-IJU"g@SxΎhCHSzy Q7np!H%;濭 |DSLl";,d˜jն\OWVDP3ζv`kkz0Ormv9Nk&"OyIN*K+hl*:]Ňv:: 4B~Mn@#8%_58$;ʔqԜ\xߤ}NK`sF5>dͦZqwo`,7%?;UVv-7|c:viފz :2Fۜ _uyHq̜PrDی mn[m6G"9uk-sLsQK"ɛ}!P{D5;t~~GrC^X#SUwڛ=-;cdK>j]M[\*fF~'g=_]߽+ޒ&3A $s/w'(2si Av̿uS4< @ktDWnFxXaT %+f6h"fi.Cxnۚޗ1sqiZč݄v:^[uLW0eCnnt"A Mm|9ɫ g]>v=@C] Pd`$錊 e(͘S_PUE\+:aZ Rp _w>7AKvMb֪v{fӌbIts|Ûd1}¾aΥݛ2PT8wtw8YD}{Aws[{I@q$ ƌƁ˹^ʉ_j]/i hmU- VIōaܑ"LW"dl[%eZb-_ggCSGe-F C"E1iQd}:_] :8k+v>Apno:RuM=x=#oO~'0G#Ɗ+~\Nɥs& AX8װώtJJo*p\rM/. l*<\}cCy  xվuwEwV^M9bQe??} SdvOzz~tмNìooQ8РKIQ>갥 6@fuX[+Rg9J&:RԴ;2 R ¿1l9?QL.A`4 0N(X>Qt"ͦeFEAgt1 ']:cU3^(98+k y15ZAFJ62G\x(3R:nK eEX[QӖ@;kSc^B٥Vt)ǝq8?3{ 78Eح 3qfz> Á/GeʠMJA3d*G.ٛ i @0骰%#'@TJDLntq^e01 C5mݐ$5^>|_"5 ЬrbkVaM'$<dR5wK^}0Fܲ|j"MxއܷA#~|8o _x/{T4b:O(a_:Ai~ךmQvtsr~SY'fPGrܾ/ G!j~3ď')2vTj!;k{u{B_JMy="M n ^EVWH]-0ÄmlLdU Gܭދ"#(?Eecn:QUB#0)Fas@^q+:Ip$Y 4sޏ¦ťo=o\<Ҙ7Y$Uӵ/]:&6p/-k?VZeIJrBhp㞜pn^tP4~:}yD䢀B 68 { }a-iȻ65%"/S$>&p SBd3 !_%s?\ MXo^ᯐ>֬ūi 69  eYz/ =ӄ`Wy)d_sf fԍBxx|ӵ@ 1ʰau&9up1@)Hy"I^.tl=5H(ZOF-l:v4͡")ed|$V)fC,PJc$M]Y/Za!.HYhRQҺLxE!`w'o*^TYL}k8Nذ \h0J42^ZWNDPm guQſpL5R c" }B 'LhCMBr]+TB[2>tYo..`*hzz?82{}A_zUp7b5JeVlPl>t0k]A?{LG^{Nl6X@<Wb+q1 10]t 5Qц%DY,O U_2i^9A+PͲADBv͙bM?2_wU\I YZ7^;qkR4`0ҷ~`G].NܣoO{X/;4 =LҁV ->(̌2ae+1Fע?SÞ0>t #ʡpfA>` q]Mى} t#;4A/H2ZXa[r*Gl+V0:mvLd*599m8i< An67flP4{t= AҮTCuzH͹i>TǺ:(k%zҧ*Ui !.0uI"|;"+E>!:{۶A×y[wcm1-"u˛-\L4wJL5StZws %iS#)Q5ZW5c6Ȇ) ҪtAxE;T u 7h$gnVNA} oR Wu;5QSKjEk;e{u 9e;;kcچǎ\nپk ٻKn`:̮?EwykY[DqBi{);3(Ehale@[D j9@&>8!-( K|{F} `'Yx[fhpc5uX#7F๶-+CT!u*q(Z2ҤSpK.5# sTķYUi]_t eN` Z9T4ˠ+a{^pH}0|P>,}GrMJՂ"D~lAz!4}~zt@¹T 1w+o9ԉ{? Ӫ^ӽ6tD.] ,[~w/*'V^_D`ES6ϰ<-HSgI]bvQxsqV"*gPN}3A)A?߃  c뺂mv]oӎzL\n4PѐT-cӚ>> ]^%kdFK"Q?g2@:lwϭteWq_2lUM ScgF 8:ևF# 6ްK(>6Ų7ib8}R5nh,f_PI\(2J`i?L_-Vվ=v-Ȥk"$+"`^;cUL2kB6ޑؤg3#.xk=XعdeWbxHG 8)eVZo=7 b 1N*2P AS>An4A8_dԽél`9ֵP7pqh{W_BCXX\逤˥$=aQOZ܁ԓPlO=J01K2fY(v0[;Lp] |d$A,쬂4UI kܐEa|Ś.<~9+H>&yshVH?oNm[?p8t@Hce%3 z4}噃҈ĸ)xdaq9iO^pJ^)k'jF.iBn(ZcDv|?Q**"{pϊ5bĬI"(hzx⍊'-F8 -<'i\n?qHE}<I<]>Jl(|ۮ y~誀B zZDFlk*O[`+53K.ZoRQ Lc-% ۅ}98`Ĩ.s9(.PIYWkEIɍdalp~&ƣ*B1*(W:QKWGJũɔCs٭1' }}tY|įєSXe8ʑuk&:h8"| xkAT,C$Oi1&LFpvh; :(3y.szZ5Rvx%X_u܋ٵ"`:i! cK&,J.(ɻS~u6$Of1EГOE^iG, h}\%jF⦅`#)Mܵ@/́T 3r$m?$Dl*e{FLnRsTVE GX\8yI|.kAp,6oލFHP*y|%c!k 2S}9k&D?s$Wkj'ճZd1&,kr$>Bsƾ?I#rNL=}(qGdy"N]%B%SXݚU$!n$|43gDɜ"._hFH!l,UtQ2 VGi6IZÙZrb9RSy QLhD`$&nAL8ض\![hH-Z*bB>0"3~:W,&U-WLaVI,y0֣pUڨ X7`J֝]a6^AΧ͗ Qsxy^c{K!}dWW 1tpT]9ތFMǑ%x>=UD5b\z%Z:앷,{aWXn82pXmVr@4E7|J؊|n|= 4Dɰkʾ=ΏN~p? ۲fҍ[d#иS:<?Hz l} K5n|f7p#%>g24ǩ7WN 2LM'4[8*Kv&' k&Zi"g:C$HNv lbk%Wzd PP9҆k M㵐79o& |CLso,~5;U-JQi pȡceXp3o=Z*<{YCg!!=ݕGޛS9Łt%~x+1r#DN: L8e:I;M)@8?K8U.@ĉnBumGwݴUY̯(I|8N&Xy3;^p~Dgw4×3lAOd],g?u_iq-qYɱi7͙4AЕ6ٙg!{I`%'8`=ch"0U=[x⯊& |MA}SIZ;LQ*aHz>؞>_"ܙ{RP>PXf:'%3n'#^̾@JkNux-4mS`cc4nՇ$I#^eߞA5ܓDwhg#IQ^6yi/Fzݳ seCX` F5G.{ll5;W͍vcsL:#ipq<{{T$dj8T ;jL!çG0 :0R4A]gS 㭥*mv6?^ KJr|hZHgA=v77l(6_nlo1U{dUl7lSq~杴rD2bK9-oKl$ir[$ C[U..:񰼞~0Z@"d*(kiO<#S"5SGMQY(Nx- 㠛:qD]WaIƜ^u+j%P1?*<'F%!ˇr Sv7_z/f@fg.m@bEwطI 1=~w22lA!L&XT›w\ZC qMdDEbn`GH5d6zN蔽Ug &a~ Jj XmSzfa$KOJs̆f$ nv6BmoPGQQJh} Z,Æ&Z @9e)yOpRKHf3S9rq۞ˍņ8w&;e61fj1DX12uSͣƩȁpI =xwVr]"bѥEAF)3))Uy=p&MjM۶*jg)jVd`ڹm2(G*$_9l;d<?JMX2]‘Dz՘Wݧ?4lpH ,Q/^& 8Ih$.\B+Lj'I- 3ɣ2a6ڬ@[aa䯭wAƓQScvIrc^,/RN|$T* s(jS$I7o!-PeT,/F rv:ٱzYa)Ыb XkZ=\T46˗/t }"E*LlHiD!v8W%7j:x{=چSՊH}ڐe5ȣ&#p|ȁ8-:ʧDV7S0{[NY3k4kF*Q&zKn|@UFZюV^ٿ}ŅFkL}$9ǵJٿ9w(A9hD+-1]TMeP:=/b2ޙ((pJR|*[c]˫ f[@9n>5&!@7LQ弇#kGG ǸNW0_[݈vy?At1U]Qt4hAfٔ%^ >|3fAe{戯Y~(GBRz%B Oa[pmI3w^ԝ\mğrJ`Պđ ],c<$cJ%UkÎYRdS1:,TKbǶSkK>usѱ)]"w>1d}M d4$M%FHw Fj'ߎWD+ʦE0_W(?=ũTrPvSNXV?N`I"mڄ^K&CJUk ȝ6֌vdW@9wPOWtYxwgW 򖟾R^>`?u_M^TK2uݠWD:5JZ TT?#$~Fi]?U&8ke6ExM2*$gYک>+燃lxi&[g.WM/#9HeC|W~+ÝK6AX` 5!0Wb渹T}xn]aӅՏ Y2v +TB ҙZzmm+E m 9c`pl7xN*P%"HyIkonn;zZ*j^BxmФg0ɀnMdlďgtxl绁nl!l|"2(/k5tZzLe 1b|_/|- UFCqB" V(s̢{Idb6ko<ۀ&ųٙ2'?}< O[Of܍?93x?ޠͭ"i=}I@:3Vw (a^?K+|E~]9h:VohF[Jìxi f v/8v!J?^Ff =<5a\=Y(bx~X(Q~Q McuOjT1G"⮤&+rv*aqi{x aQ"q:t)}H@"b oе&^'-nY%f5ރ1Ș@k9θʻR7"i] `  ()4 6/q{U[5s΢x +) :FhcC%A8,S~r "s*JW,t!a%Z^9Q5.Rg#x~dPdcmuv > f+/ W-F)tKwǐy^y'a C&צnoysJLM2Zg(gkB#.8t*hD6%0ZM r+M_æp {4<U0@tp٧I.u h7S,{'Z2G1T6 rJjA#(5HJYa@,DSĮW9SyeGGwd!n״*כNjbfMx~-y•&l6 `<#oMV",0lR] ueϱĚ?q͓4N$OEn_Cl;4Άm;挢nmƣ{XVVIh[ TW4a1Rƌ47x`A5й3FJ6ۘ>>]TJ3;-lbt< ^J9P75&0pjTjy4j*or08Wίο{TcrnR#LpzE7_p*H)j2-!c7J4><PJ&;Ɖ;xgu쉣.{ & zZQFԹ4yQD!#kJFv o`l={:Kb8eqd]||nнcVWa `c$Ч}.2 #7kf>-Û*E%Wa(_ۡ SqN8Ims@nь TV᱃##nt>wUlC9>KB]8X?`Le? +j< xhoάSC9Q ..Кe=(Qł >PԘyNIᵃEht:Nioni}!!q?ĕBнL 7cfWJInDX`dϱ+5X*~޺ @B..m~%aѭmB,׶"bB&(rʵo\1Shܷ ; O \AÈ?̖Y"SP-:q\a[Kv Ix6ufEɝk2T/r5cZsaZZGR q2=pOӣUrLB䶘`hJaћ ,7(@'ImRg YTzy Fvi:{⯺~J1/sZ/dP3/"jWY2Uyğ|4yW<z~ \9}3 WSiD}Uh&_9q4mYŒ҇3E 3`YOG[j4A}އ*O4㞻;z 4= _%~Ma r~pZQ T'5b!HT5~ft RJ.?]U}{A< ejx+ }\$*y;qKT󜎧=v{˒6qs6Ӣﰵϥ5 n4aPܧ+A=LMXx#y}Z6#-QEƚYneHb͡ޜMXIJUMt]C&IV':&hygDE"ǥ4qDdc/h 飛`"B0˦$)~)d鰳bP[eC:H-l7f7.Xu/gʳEԏa(D;ŌOؐәdj6 +,C/,8\V0!t L:6Rh]7W/ݫB@ўymmuō*G<}ܘ孡5d$[D=Qϑ.r>u?=. yÜN!,~6Wʼ["1 O!__> +"R,w[! ;C @EiSM 21C^.(t[rY/n$OH]‘_;`)@{w?d{%9Isl̠+iokS\zF`R`x  ,Mwҙ2)Kֺ/agGm8 {p~vj-s.+E%>Bk0u>Xaw(ZaT|'þ.!!fa$,+UOcӏ&Y $Z>Q&`:"i0nCB2`}"YUhnXiZkh )Z䜺8ޅҬpjbgTc _6v(( 7:SX\-rWbP–F$F@4҄f@LtqM(5"pkb<[bğnMjp[DžztdFDbs]<]2|$6*ur;%YoAP,QXUqmP}8ng2b6b%ETE)75 _H 3[(>\tM̋ڔ+BϱkǬς?e6 RNR>._LLq㊑=pSI cՕ^}u ?%GU3bUQt?xzp(o' U(O7-lʩ\*h-7Fm.[Ċ֯;?jRa찚Srly1ɭ|sc +?;u3՗YJ3lԜr߮f< >ٴ0B*^yϗ(kP&2uKg,c%fDZi-\rхZnQ:lù^kVƭbj?h\n՝g6Dup~8`:z ?$n.@NͼPKB含{H@ә7E۴3F’Q|描JA(h"o`ڻVAeBh$No}%f_=:tҟ:M~" @-+'gtx֛ vẅ́[!c907YD_rHpnK\Z=-CcI^=C:{{E RHJ$WcI\2Ek^E0mceU HV6efQ[)B Kb0ohe Zc+%șӤUQ"ϩdșXb j hVf~>{N.66)uMۯz^/ J9.*ygت?I@}or&tuI(=o>p$[%- ;Qy2~wgɉMD\TU7pulRQM+%i_uw^߷SExUt;ū:ctN%$4fJ<:Je;Mpe 4,<~*27ùl+=J/88UvTJw"x7^dlj^ME%oa| NBI ru캬#tr4(]V{rnL<2aZK]T1:Wa㳸WhYX1,}uҹa-,Tf ?ZxepVosԖ@ ~!PEY]DkzB;܉J"v> z'!21vyo*\84x!AEW=n?&ڿI#t/4qFApGe> jc/dx#t/xc4Dt]ޢ֣P@gTSV{NnI>=MG>0ӻI \Quۈ3qd`/蛝:~=QE8-z~c- #N+J׫]b/>?555o LҘ$?ԑ?}$D ]N|T?mc-z6= e6]t) /OȦtp9_-$ (|r͸࿶?=DS{r8˺VrHmz׶uC w|cr?Ćn/gyxXoWZKa II M#?=_3N=hHz{q2 ɚRɣ)%T@R${!8H \{w Aގ劌PI%#D x/˥d*.l'Qϙ'H}at=*h^Ljyr{RL|͐h92XB;4ܗϞ9?J+6W;wNy UwE\< /u_LQ[j󬾾01 pd8tLH5"&:6X,@@x?/UOR@"mmo:~yvk&lk:~nj_|mѡ?J‡L_9$<Ξআ*Cd,u %1.em'̹Gؖ||5,! Ђ@ȓ,1IhF N؛ONތ`j{ԱU˟?l5ŀWJ2nۗ^ѵ z]YgZ4SD 4㋊@LNYT( d:C\"큚w]@l. [6_^BLD8"862TN@c"Cۜ|VEB0f)SiX7Մhxe-?4o\G%3~U۸D>gxnUjG׺#Agٱ{tˤxr({k>|f2&,AL`;hZs b[SlS.7 'g@"{^ho?$(ټ︴.!)'0,y;(\KgX^+4gQU_[`=au.P>н)* a8ۏ~]P#us87-ˍ͍ӷ^y_XE<;asc>nnR?]LV`up:OCR )Y* /趟:6Or9Dx Tzj*|lCBUNCk'H9: "7ώO4<FRX➻'o˞4(p-0Xww_}NH@&,/WrLŽ2,˶?X{ CykhF D >f@GS!]ifP/MǬPE @MSn:=W]$ʆ]Us6TMx,mDb6DJ[If:UR\LkQh*jXfKFU۸*MB 39=ӫN.i!7Jڙp!d)`dk C5FQ( R9 &Q+qN2P33{׹= tB'4eP[$R^83\3qJWe#68f1+3426Kx5LKy7v~,*g&б79 17")jWT,TS**.6.A2ƿo�6`t>I'-w!}~faih"ǽB&N8E㍶sk=Wf8$6Ns=Jr-X*Ha5ѝJkm<4]/i }~kЕnnjVKx_\iY~Ԡnr6[łrs2 ʗІDܓ2t ꖾULUgG1s37'@z|tO \mݑىLQ Gf Z~GluW$R4t(P59? as$IJ>XpJBoSBkpi;4xU*bOX讜ДpXU)v>8k'/`FI'GH_^b4څDD 59b?uJfd\}Vp>H.s*^mrNt$cN湃]~Ŏ#8k4&M fyR21=WOWUuzsAk(VXTr q=כ#(!QG *MV%5ˏ㺕|T۠{rܜ1ZNPC94~șa>BJ>Q<7:(Ou'PfZ>-w_٘$yÒۼ%B!z{Va4tZ !=ٌ]#d#%F,Nŕ$H'jPeX?:ԺuS8wc/xt,1p;nƽJ};MՌT G=DE}h~EkD_Ck ;̟Oĵk (jӔnOp3[KR\-wZ ?u'T"Nߢ9\YlfHI7^m`[7Ɖꚴ]ocĄ)Ab}c,w3Xca ^ErMSVeLez98RZƉ˩{}cŞל؝p8+ -[ ʝ(m1_tmlm$ei5vO4J1XEFRt$X6q.)x=tv`,'} @MDF,CLq'^M˓+"j;·{q]CWяW_(}Tg?Rϴ}+Wٞ8=MCRNrHvլ`7&[* Ml|vb| :@k.xSb~ݧY7O ~|OyY+56i<}F}oU[!t*ˆ&ĩŏ{g{oUQ%gak;%!BM+@,,+u>n#as{wEUd0tHF_:X9؟/cI 9FWO/|*GD\Q:/[0N5 Z Α&od LeLy%Gw9B`J}ԘGWCD<k}u6d=><=ۢ}bŘܙL/>`HaA*eGxl;;޳9@' @{ۇJ^8"VK[:XI0&2XugH7Ȫﰶ7:xK 3lrqH2;Sp|#h+8T _(*T ;Uv_[*=XCm*8U+Pikc݅BצM7lcvQqD_wXtB=-.jhSґ2p.qw{d\nM!wOZPt(4v<"2$OFtztE?4;brIo),+MHZrm{A 9`)l ց +4'k?2qh 6[t4ָSua:Lmh157{J \%~&B Hv=J4ü`#u-Zk#-N$*ZQqƉ\<07*ߖ b 3`<,IKHIhaʯ Mq:pjROb3Z;<DW<(AUΐCuqCT:k)ݍ4X)U/E!s:֭|lk2T+%aa:bn%A/tc2=z=㰐ekabR警)Urٞx 3VS{a3~Flhr$:XQ`z՜MŽO@*>(bwk>*E̻X 9];6N{!`AcBc6 :9䐃.F"~l!!gzHG mq_Ghup3"+aZee:4XheA8}kS [ZW5͡J4VP]>{TҴ'zwx$Wb3tӜᶃ~Jlhci5!WCً?i:̥ltm\{)@ć91Y>=WE]< V+hƸZ`ř␼0(U"| "K@ $ g&$ybc@C+fC21^G0IёMb{=J,oI(5i8!i@6m4ak~x)&EʃUqu0p U氪@D/aŠqI7}J`#sEq.65ֶIdZδDt>-z(#vZ-lM6gT{ "s`:>Ȫt )k[vrSP PTj\yaP wx--M*tm ꐿaW 4F^Lp>vjE,}y,Ub16ae_-(* vr#Vtq_ku"'@-0&&8a8OƆ5JHfaCy>&NSg!vl w~6jf6Nd$Ma r쨰upT Ahi3/x2E3 Ǻߑ=H1Ki$&)&^jܻy~4ilbL`8=+#_j"%*j&oZoACR..;Tr^fD ,s,Liݪ?(~snfRrW]DT{t9 AFn}NwNmYa-dDPiAV'ꊙ$#D=XCA~K I\Yޅ`PGWPes;~Ԡy;;mg FA\NENQ@WF"#pZרvչ綬r.[ =v`Ù?!洍8Aeo/M\̈uSAJc) k&SzV4'"WZaswDʶH6J\)ItݴDї=좏w}*ŎZA?hj¦t5c9~C@*LLHpJғ[ZթLyYl%5S*ͦcSݫ`^nf%uhz@8$6,k(&VaԖicl[#' W+y*M]~KBݹBIuV(ixp 3)!$xlɰȣCr ګD׸kil1 ֥ Z7_$nq+<̈́``c N3$[ɾpFUC"k'+3-ez s<ǰop~1-糧 XY X]D@kaR jXc nZY[aYvxQM+a1ìU5- -. k @p-Ϯ kH.G[y UqDJ0FC- mQ:zf,(;DEb!}SLuՌStV3= VD I~V'jH@S9r"Hxȼ+N\?Pbb<:<m:oo89otʢeԼ !t*pk$L{/ҕ;<8#I&^،Q<ᏑV66{3ea)I6W9?.1846F-R5Hڋ;F:eiɾɵ+#58;-dWlnٚ^ .*,:jRFOj/ \"|Ӊɦo>- = I}(X pWH۲L]yqR,S9SwJ>RaD&L PDIw;Br8,DwQU`;tnsVT&urjה.5`Dg&6~O&ծq*19ﰁ@g` =[f.Ͳ;I(iLf[ۏN  eo}(n1)E:Blӻtӯ*kSЇ|m8C4{tuqYD{踈ֺM{sUN 21]|sI-neV@}dJ?/jyBT^*?!5UMegAUBlmf8o8Ƭo&HgͿ~d`PE\3㡨(]JkYF]2m>QnML,떬OqKE~č6-A@eVcfY}lSF7q,E SNW.++3{&-\ϖL,,wVRSuB6)ʦ+ɦhKs: `r#vAOx T;rrsv=(Y\2a:AӺCEY|K]7@߻p--%t'3znz潘MYL,y"(:jY`EhǍ4b؟Q]] r8AtdN&ۅ\Uk!閛~N^5ܣm?>h d>!A%ƒtrE\F(i9GQW\q*?Ic<`msUFάM=ު07 4h*A5uήS[_.o);~΋f I{+oqBlcM~0ylj8ش%kt <' ΦJea$||tt#irN]q/tWacwsc*iAY_n_kvEbם$&.kAI: `2+bg%990i1err~mE>)T"9&\% 3JR Ng-fc_)NH-7$d+"0̞WnQbWJSY1a`/r 7 u߫!,#ٲxŴ [.=A=Hj0 SAb=Յ4ڕ&QߙaGkyPzډucE=.8bsLU7ǂIun(±Q{H#Os&>8h>R-%H 5m'g-@DV Gstź ,QʉfKFaK?jlbĜ5L:_៌s,ƈX$( l6㲡O8}IhUс+cӴ)k7f޼*ƀGӡC2YV}^[[L@YfX]Y/ >.$b oC%6yJ5Mq]Pq!w&c| R-ϭ1f5kipUfݱ2ɜ.;YBƕj^kM#AMeݼ`'ϤˋY),.v8SGS?G;y2SI:y~ iʒo2/DU?QX}ݣ ta=02b>w`@u5%jV(kJ[td#.U~_VV<-^Eۑڽ}jAw7LT:'jZ5!#o@G\0.`oam^<%칧:ԸFLE%~L|OL {CѸFtQ&.6q|Vt:re>ϕ/l^jh#J(¶_'OV "#{E{b1b蕕n'pLRE.(yr"_3A^֒?*ƺ7w=m!q m㡪T5)s"MGbwx]D<k^G[(m|&*O+~"&7ЯR%ad5"&"%Q #B⩦xZv ِK qT+q徘s<;wC{&8Z^)ɐW7K4R4p}u\6t_76yD;^E}|b"IC*qpj8ٰ:^b 8xIbׁܶoiaz*j 8y=".5cKpԿ1BWXRcౘ~d󯆻ݢ7+_d69r$ZG}J0<d<_!h¬[mEr?-ؾ~2Lvb #|ΖbS('mmtE @gI%:x^"kUvK©qVO{۩qLͯC+;ENQ6 i & FpV"/l)1JQX>.ˆI"oY zf8{vix W5~q ͗+&R<7-\#vĠ҆ۧ5kpQÍ;x<~>7ppRvdƂWr1d6=QQ0 w8@{!HjNЇAmšwJsԥ,a0DVGЖg(A)}no5Ia PnQg{HՐgƅ:t-5z% -(aMƒn $'Q0B|^_ax~Ww\S\BzM[*/kxmܻhGFkpw[DS>bG;wyq:|׏BjJedy6]xrʲˬ;7wjww>lC\S@[杀:~?G!Z^zA(sB_ i鉚 ׄ4^b_49Ai/(4w>H? } Om{.yp+uߓD(BmpiT2{=.(ݳ.\{5t'Vw0_67Os?s*|"/^Os]E/-Y2M`4M |% =@F;3@ـȇdsU9uJ IQLNJ"h뾢5tDʶ[IL :m^韒QZg qܐ!xr'IL[S^+M<>:ɮ)`0g}Ƀ+p4֐ZjٴiOs.s؅7 "f4ys>=V Qq{:'^a\EϾErw\]..}Xr N_T_~ V&1(Plܖ}c)ѷ%\G#TukWWĬAۻ3f8j**T,wZ1"cAdssU@kQ A%g {$[Z=!R'P 'r!=|S$u?'Q3QetQnHg/'/@ Y*GE>Amve~2uS̍p멂`Z.f@D fNƊ4Yb'SD$K+<aX->哇ti$*),_L͂y+AbLM1ҠF1+l8\|c8 ]E7 [s-tS#nf8<Ғkv9V4I? kZZ섪;lvb@x/os6WY+m8cyWU0I _Ftʰ{wxx|d;[U.X`^ي8f5%FtQQuhN5Hu\ҕB<;0CAl!ỐU?90S|9JZntꎀT6 ^k{)7h;@~m ƕ[b[D}K[C-;_mYtnbX8hVJ > յΒ#K6̡kpWP~m< 5@?*J'st69-UӸ՝ |ea zHKLa(PT3˫hIl.(HhP1WT%DC"IaZlрjާU_IN~eE-mVU Lzj)d0LՇH:mo_3usiO 2Ǩe@FƼ!. `D8A![ `Nڭ:!Y 7[w㋿;S{_0Nj8E|OI3PLqM=^ﭜk}hJ u8_[UFTb)( `dK@˺wET{PNJboC p9 ½.D=/- p2+[y !'S=!ַ;P%%mJk)şV:2K.tftӛz{t6c_siLg)mSE*,uұfjdS9j:!INS\T\`i4+KdjDZO'Eu4Ē%Q`2|H/dO6"A9@Tc,MݵsoԬ ~_jD9~fM|5pd2[Ġ ef j]gs /Al+`=Jbwu4IkY}U_rI6 +":۬ KmxSMPRV *.$Y[?Fomgzmݣ:^Dvef<<<ܗ/_oId:_rh K ^]L*(\ckKQk[Jb$coocY NLl׺AD&q'?Hmm:5/{fm_*uHSY77 Vp{3ce4uD#[uMtշO4F)@/! OJ$C3fR[eϕ2wj=86aQ魠̢TQXlxn;"4 )2?7Ym3"sB럡XM31;.5ߠ8ԭBQ[4V`;q8ehk}7Uue!m@eB$떋0g1öTƥ`Vugw`OB=A,vN?jPGSbiO['? bE;ʹ.^lU%kpKSzv:9jj@Cg[˧&b̪z =퍮<؂j1d#xQ3عjhrsWؤ-foz+ .#&@08lS#+DS (Hb]O4``) Yp˦d`<QE9.dvw NǼ5ލf/AGᭊ 2WgܣUӹE-/z%b0WWkBn.Iޭ+?FrICrZJI]b[KQԡ[c.rpvљ{YE.\~ڗJܩ5N54n[~&8L&qG ௼퇀L4H({lI4\ʋ[7*1 Y,чb;ɲqHbx}H̯*MC_ꯠEqk=ooK(|y{{?@|bQI2*D2ѫ$}2_wiӟcj1pQ'3Ӊ1(۩Q{E:kqmdp;~aБܩ|VEz\n)^K(waBꞁegNƈ:LAO+/l{nV1Ql{2'8$YD=F)*qCz&b{8"}M9+ :Qd(HWWL*z)Rsa .B/<{iv"\ 0PE@XRvvqv0ȫOxzv!H0$9T(VDlFi)l+4M6uPW%i:cMt4>G6j+e C?W!p")t9]LOHUTxVX5'mOW-1{~өҞyWc/ ` DIC-SoP27=bošvYxg~921J lhql ]A;Nv:4r k#UL[hR'qDx2ch\]ۢtv}ݽ[o=?~b+;""{w M5"û.ijn6Wl掳zW #^1_XP8H&2_hs"VHBw7vp ydws{;'WCdxJ'qLMZ5bfui#ёVp2b/fcuzʏ$}jZ:Yv>D%GyL8P$ٜ{m;atQRTj'Wkк2E ʟun=q# # I@[5x<&\FڜI Im. ꫐%ޘK86[oE%0V5h{($(d;ˢL~"wPe:,&h&Q hqPk'DC)t)NM=S&UщvPZU1V"MpEg럃 !ב)_UuCn5@T I4ӀI(aRu5. MG<4UGЄ}րF؀oro9`3O{/FVk09፻۞mmW"9x(.޵J fr kx0cwLny[o𽢟uk[T| H-Xb/|TRR{ha_<8 tF%"bB*P\~=hHNUMU٣J̊ؐ*=s,iWP|/Z*-J%C&l2>c}.ilx|ӋQ?b!/> Y/;\gA"P,٤}q0:u0Yd4!7#qTtIϨmvW"S_gv_{!kw8ˉC 8`\"d^R!l̖C;kb4>7ZYõt6;2JIq8$-oVȞL`05\2_CxsIhV![ R3œMTEsyVj=fo6 N8\qY{h@W_Lq[upvywqFt($/G|^2PɻM?( S[ww/YyJ, i:#zi`E5oHreZutl,8Tg9g졲zCC/-c’q%?qhlaݐ6n;~NrTsBi=#`\ XɘanxY9κtvw?.&+#(-tF ^# L`A#tAmX!B'η5B9㮓8nnnw"V+Rjх%%Mlzާ|N{Pn(Y,)CV}6S[oD#!"@"/f,QhAŪu!C69׌GkU6;&ćA {tJٚMmlU+pTZ HV%2ELTkqNqu3_.a+4$-waD2nh2I~SuwLz,l3 M JpM·uפ - :W2;'(df(CAtVfp|3+<$)yeS/dֿkvzoImY00fsr6?%%~C2~pؒGxt"{zp?&|~tpؽx@R%]ər /!9 ݪpsdnݍW]U^ی WFDAʖ0F]8:;UQvx3w>.z1)jW*aV1 <)H~㽞_0#.τ0tG.$>Y/>8ün* FM^b%(Yps틨y=4˹a#ot4Ad#5ml#q.!_b+$*ƘUw&ȡR"A#"^5G%>!ԁ0ːtq+*y |D)~dVtəoܭy5ʢ :8G됖۫$ά50s峘xx0Qz&S˯>Txlc9 014M"7 ~jf*Vy5:Mo;uf5k$1+D|RaIfOyhohX-C@d dEhɸiZ11 aQKju +D^œ䇼&49멻:Dv^+[ؑ*iKO!kO>;u&aS5dy|Մ%jN\f=vM$Ja)d8l*@CN&z!E* cs2$u"Ƙ;e%CHJA A~6|8.&1Z,* \*(%HE}x 4X'OVR]X瓿қ)bFmLu.r_RyNַz+>R=rIVMg'RKy#`-9G&+zp([JKd!/tOx#`鍅!͋1Ʀ2|2[l& JzVv(0_֩F:l=U}!FPs(/h:Ϫ"'rGX=n0OCM5JNEh }y 1Kny^=I1G5+޺*A`cdpz>O(fOL(Rgq<[͋pitfpwL X'14y?־_rʹk}[*{?ǝ~%4"dsRܤrLY30ad< +,~zH?u ~\7~ş-c@zI" 7ǩ}㯐3YY& p+1t4-![ A;0Ʀ] uwn.&tTĴG2t"B$1-Ns86EX@O&\ ]J)qP_D &xǏEW 7*T>y&r8bWI}̀WW_p5VBh** l7J¤J.#}WPs~c|b~ lUqC8K] UWurDYj2,J;nDs;Wa`!afޙJlAF5XJ "_߻TS12.4Sv>7M88fCЀ4#Я\Udqa8c+F ,F򡫓sP^sD Ցׁ]m+* XDǑdw:~$Qqǃ h 1rAn_ X]A֒YvL\ Uwi@° K(`.VgRc)0l?xg=hNS/ߙQo0a!QJh\ e)D?&i(OŻ~`$s˺l1Bk'{2!r F{yCזs>:\p6њZhd6V⩱Ygfr.eY4󨺕EXƬ7Q'}' #gc킇iɈ$b_}8>=8$0HzU9e^tJuX,:n0gFrfa-s×ah7/o^|!wlT b"V4)[f.>;#&2nf e:n҈r7FXathvyWp2՝V,p?H1 ) ˵~t_ߡ*3Wfũ5`#yӖcb|W6D<3&)goHpȯ́мblxs< !^3fnQ &%|EQqgT\nssRP:bCR.; 6ŦTu:Y bm VMh]X ;/.T'Cvƥx˫6y3zUϼ_ϫ{LWBE$F LBMʍ#}!ܹy㜓vߠhoAn A(yH,Z.ʱWMƾX9a?Fڂf6!]\;&9{JcSZՕ|zIzԪݲH *f3锵v-!m ihh/&<1խl3+^?0Au% g_zRʠPT '*swcJnPdu\ U'ݬv[Wo(Xʧ{=M_jwTf۝:7F5:ѳAV`\h='Zz4zZ*U/|y@fŬ3_m/~ͻ_87"8ڽF'jF:nM,$}ٔl5(z+_5ӐZn4z.nSRKyaFxۘ:}>A ##іοF6'yn3^i4Ⱥ,~q+|')S CI^ .S|TiY8nNd(g~!>qAj pV!d#‰a H$ѻa^7L%qۇO0x2 I5' B|&I"7IԥkS8;wJݑ^ajНw6~~&rY'(jB77W}zcll'xq9tqK2RK t,Bn! EZ"" K*yL.*?SND HCw ]m/K"`JU)Cu(܋T.wǗ^2 {DK{ؓ븮JǙJ񿦴'/yS^f <ZBh^rqU9 Tޕ!,oF33=K^Y(k{SwVLvøoDz:E* |Ս'cu3m*Ӵ3e3ҟ *声U}׈_OxFþQ^tZ(:u>1A"R?ݍsmĕVSĄuT_皘щFDo -xjtY@qK705:W:;WX.^cT`rw` 6U!'&4#yWv;ϭæٹBG{}. z x= }dٖE1n\9Gi2f{O]ZxڛAOJu%O"w =ҽDʛc/ĚA*8tʘ5hT{ "]AM4LMzXWݧǔS>Z{WbT͝t7aEe\xהlpgD%jj`I,s4SZf*TH=Zh"tg#ϡ򆒱)N#x.2qcF ?J1OPq8* tad'& 7SQ2A<7 ugn><9E'v]~xE*1BI9}-v*5uǽ\ȟ2\Gј$ƌL KٴM uXN3S= ,_Ha]3noaTvcg>j!̛Ȯ\b;V}ZƆhBдuo-aºj\|ݕľY*yf-x#\Ԭ12")뫶_, ث(2U%Ad);o*5tӊ w,~7j ItTYybgteDza9Z_J'~™lUN pIYɴV7&ygr@0L!kq{\W"%:s.k3D2I5ucm4|?v|J&䥛"*gF,Y;q֌xN!*4FB_*ob$+5Tli|׈ҍۻW@\$EpJW~\V}8)xUA71L[P?$Ψ&*Ciᙐ +Dq9mrw^yp?M 쳴S>Rk3΢&ZT̤nF"DInBqLMC!jB;mMFSψR0kLXvL9bgBV$X(hV{ u! U~`z4-v ĕ!t%E*R=m(ROMaÅ(1 Ϯ_]RߐhЏ|2sws;YzޟT;YHa>57Thaqs%?oxZ'q 5zg`Cgi9ӓ $,,="2`Ɍ ÿEF#φay8z$&Ⱦ=zF=o8QcȅU}SIYXM=^peŸmSי5ǥr?#}ӓ igW؂sN:t8J'7TI{`ܶ#j+[j E(#/9s ^D%}SQn˲,i?щf+eʪ : !~pJ+Gi YcDP8@[LR?67:qPG8ݤnFZ`RnwL1PÉ[i?j (Ō(1; b!C4gJU? K'pLj 1:X(5M8[1Ve M u2uF!T<{҄xMZ~ǒ#6-TX^Pk,\ t@_iq[qjD =D3@h u4PkEU,xYësTD˻godw!IT*!.޾666W4ԴW=ϯξGVW$PQsA-oc^lx12=mst6[>(ڠA'*Nn?CNu|7ǧR3wqw͑Tt~pw86[}b6 NVrXпLJB lh[~*5ժ qV`5ˍ8\eYPm^o<.ҝA]eku%q-ľ%٫-"WeCXtyVwI܈",N9Cj(l^7@Z#1VIUؾtЀHY{wuuqoA|>G?\uܫGpLOώ hb `g7Vl<@nx\xhp ەzh PmW.xBo8ky޷0BA4}6yRsߖ#:j rUK.M,7hrln&`a.κ$.>Y]cEدi`ޯPn˖| MF §;79R3akC.Mjl' fYYc.5Ju4oǤs ϟ_9yY0CN%|:ӹYj=`q@\Ǎ d$PT!۵ `t%6>mAg_XFEekmqaU= ÷̧pa%)IbȺ<[TV!ʨ˿N3!-VEjn>?fYwXM"-6l/sK /s6S% |īu=PY{N%焅X(,е==?~b)OCr'qǍ pj*my^ݻ8m Fh7X~6`TdcS*'i=( <>p7L!m53 }|Vqϳ#g'F;AӂS뀗{;n)aTq=θq1~kupޠgO3?4_gϓC'=$ɣx4_9<=9_=sQi)?1u{ó#p^2v47-ttonַ18ė֩(aQ~0uP؁:AiP^FH|#9Pl tqkc-X\%l kC#Mѹ<񖍿Ďm8*N_W16f _ȇ,3?_s)--6B6QtC)l [wEшxڧVOy$ȭcxPQ 9%6ƅ}vs_3pCpj ݳҌy;J0,x" cCVT^̟ne8q?/sxF ^±N'sCtAfxŰzsMkrn{O)ikxp~ Ԩl;U!yg2:AఌZQ)hDqF'=^2 Y}sS g3b @E VU9` $4P?l Bf[w77{YB=Ll{n^yPj%j$݇<3n%P?@%LϦvŭ smlt%x3Y!\BլUA ea* DE?ж HsMyY!d5qy<NJmo\w_iHYmr;GӒeΏY2fch7m95qI?kO)Ū6ұ7sEd00y&tCkog< 6ㄆiʕM>\5.út P`sZk6:[|ǂY5Gȷ-iؑkqݒ^ށM~KQ`8KB@H* B-Cp}8> @ P8QCQPQݣAeAQcbDv?&8_woxZ&kV/QXW 8?zd"DbyLM N"u&nZcT0FjV3b'NM8$AtO[ TV^d/[҄-TМ0VIɹ{VuF,<,HdOg{͎{rC;3 n4<PGPWV#%Jtޢ1NILʽ 0@=+u1cEx7ϋ7<hsۙ0tMjxϼڜeY R3u4%{1\T"ʹ/ɓI}1"DCSL8P|z.F|ᦉ8D_SޙCsi Yn`'5 " 35q"+}IldY:ݑ|$٧,V$CjF0#48Wu/CIj;.JYi6nPC¢YsTfT+:Aaֆc*H",&>f 00\7+8clܐzŃP 퀈B=ׯI!cY?J9[=f{i@! !f-}a}URdcKjIBW%En2NM5 F,+s.00e>p4&]پ8[dFR" Q(dtj#L2mݕ*L8k? }IQn&*g=+'e@sYJ0Ө,2$ѭ ?ml ,%t7snJdc,e?]O.#;uLg7Lsc&“i'[_\v3}sݬLLn™vwtУCJ}4;=|0 tk^nH ׂ4PuF9Z+WpH3HTL|F9@};)B[5e4+=79r (>xgS0۾V{Ǵ"J>@ I(:>HM;D>XDUt!\M+TڋgD -z"(wqEG\.*M$ő4'A#\*COl#( lx"dfA9MAgI>)i8Y6P,gc^ƭk e$K p(;8X[԰g8ݡ.gGjiDGc 魰 XZ2?^Zڻ]6?yNl*U4hܩ3Qm:5{uzp!#1|tslMo]) ;>(63ܛPI1/<8L|؉ ;?KmL9H΅PARvjXG4W)4d%\eEʰB10Ǟ{,ڴ8.p!6r_A ? Ė6BZ;dK٘>/4~ڪVZ'z߹ޒXNc} /0Z,_@-B0<~u9Iڄ* \5Mש M7lSԒѤ| fI_T,cS1^I#],&u>iMalKRg,>ؾtObi"~ZwE;cOnxa9*Valm-&1NV-rs'g%hxrbqY54S` [%Y0ſJ 4?Fj+2}AI*9)}X,b%*~!J`O.JC[.E!ؼ\4s$@eXUvŞar^0rǩ 5KJ\F KWKtk KUƚuʈ/"k-}8eAt6iuiYɪZ.k64< c "z4Me>5c*N|- <&K܍)E]ґB`#PngLDFLBgUkZdzcL1l>e;ybE3k.E ɒ ƞ.7LwDtiAp!S*eg/sKu1:'#I=z(PZ<\^[9{#WL*+Ϣ1[{sOvퟶbܠv,MQ6r'q ]f2GhPS;}f1>s&W `kb1q_Kn`']]دܑb]B#jS9nFT+y;Rd 6 FW 'ոk$w5/S> &M)72qQ-T\f!%$?3W1 ?wasqb^z f{z8@7|;PIqH#L`z'\|,z3EbXjkYehsӻk puz9ՕXuf[ bƧ/+pZq?5:ΐ? Eީٺ Lj3 K N)Lf/F*MQ9y90uOi݀wǩJt܃scGCs_3zɕ$hLT mdcy+D`NP- {+@&쩲6rXtN^4(,d <_=CD" \%s|2~zgߒ~pB҇PW # s?&r`&dn7[ x'R$KN^.U^8 sL1I8`gtR:ݡ\?5/+&|#M3%qD"* 2o͌?5<bmT"(2s ˑVGeX`bnz0tӘN]1]MYLȕRO>$v:5ya`,XLt0{0 '/zZ3$JÝN 8[/doj`vS`Cʨ^lfF* lt#*Dt+тc.=*8[_YE ́)l8ډ|Vuse+pPZ+SN`ދb̔:pЖMox׼{\⊦ %Q8t/uId_z6W+REC1<&QÏ n&v/VYґaRCrP+y(%{5p@nRcI0eF/0Nʈ`dZ*twI~D!3P_X 6;c]>TKl!2IM4FϠc3TE<|aiCSTQ /H>14_P[, ftiN #giMq'hWE]Z?X̕ CH~Cwݣ4M430-Zv&XB9GFuڒSBL<6ymlR2 1GU1;>}Z5sB'׫unQJrq: 9N7mvH,ZRĸ$A-a,wqIao8™24>a>hStGs,NF.sjGW/BFn˳{A^PpOI&IM(b =~YlWn|h|S@7<0W4)\pKP}RoBgni\CWUA&_P4NN MOG5ES#/uH'" ̥v<%5315_2c}=ҰgX[5T9.{U_ u0_&Yn|isb$4o= {C&6vl~ )ć!lJyI @9%}cZYbjS* U(#Lrbq_gUͶCDV  Gcwqk;| Q{]p"Kc*/25.VidHVD70=Q:t$C;yCVÛXymhVTfZcU3h_C=I<[G .q!<M H+[{4'6++|ǫ c؂O`嫦pG8Mz4p@LYꕓGSroHx6Uw8eoR(-iCW*r!/Agt<;~aoǚU1: N JP0"ױLa.M5ol켱:Xy<޻1S)NՉZ䕋2p #X'#4q68>>5 ǭXp:AƅN0=jxWOKo\ƃp-F؋hyk( tyZbl /Ubß$/IhR|'Ŗ~1 RUF|2Hs o\|ooַ5gap,g`ߘ7m*͈6;&,H>Pfs锿u?3^tA7buJ{k5\ az: ' RA߫öP`yC$ ͱ C7k#qJ“OYZѪ ٰc"PSDMuz6 $X^@W퀂hXĐ=5s46 ռ)źtRLܮ$l ] AZ![&>(kz}̶6)j+@#~Oq`A5ѮPוê´0&M﹊MeFxDp(iu,f4GKDRD;BŜ@|?7f)لETHdZ} D K1߹ #v/?w>c j9:׽ [Qx1Tc_ 4 ^MG 7l %#^3bZY23ipMlQkIMǙ[SaU22ȷHiZa=v'HÊ h=+Ӌ6H }95e%bxYeV߹ְg0~b\|~NOŞ ,˞RCx@UXo ?Z_t23%JT _kwg1YN=9NdFum2Z>ͳPwu,˹܃* K&x|Z?QuA*:ŏ"5UsvnNy!#٭ʐI4pQV܉iTL  ӻO'/r*k0VfUƺbcXs$fc*ֿ0/tt hN,aH7Ҋ??׿)UŐ۠&ZEB ߏ|h y@qF8EF6FUڿ 4 RB 69Z+ 8Y% Ӣ2ᬒL=S8 {wqE'ho\I]6.?i_97i8;Kl;hek&g8L0K8ypoWubuW/'VOGv26zu y!kEbMwd{tr`~Hv h85 dumfК8L`K{pzɤ$&硻St:zbhƲ<*)mzwNt1GYpngP*2r-ʎyUQJH/P`5Q&t4o&\Q,#1.2 wg~20&yzO҃B:` N85Uyы k϶i)B!˩İL+{ʜ|8i2z 4Ws:_7NSMLN%-j5<䏧z^b]ʥZw}ܛkVIkJ3sbJ8Oni;@Ǡ}(|KmV&z<wN05u۱XMK\  C/L7?ntϷ(5m_Ka@:y"ɿH=63 \@^3{Ļi9TFwR\z$:|i ȈjMe= ,]̒۟FX``_1cSE]~_kD]R5C@ElI!mK\b\tˢr„9uN3R(YF)pŸkƈZj`Y$v`YcyNi68܄Y<{ FMz/z-;_\4^@y6j&?=C*{k& Y!I??`68gk.bFLã&U_j&L]sՋ"7G$KLqWzAl z E{U" D]Q0>֪$GFa(0YE훅UgmEѰra>:oAxW5)tdIFt}+#b(VĄ؂݇h3 u. C W^5 QAhFYe˖j;Sr,e+='#x櫻m]Kaex)Lmf K2  cnI9TĆFpթ4_t\򨞖jW-$MdQ=;;)3]Q 6ۤU.p&@<D:٠I8#]'衦Q_tk11|N[" oϠDV$nbʯ2z@e2>҄Lad9^~N*?/ 8:P8yp]A}SϜr:wLl^ le  Q߅n"8_Ӵ "?e$\`9/'qD^|GEa"IB/49$R_#݅1I5?KD8#}UJM࿋hKW HmA[u3AB[J|_t(I6nI/t aa+wKrS({@qws\/t!z6T LkQ8`~B$NyzU' yc5@zX籆igJu.wwh/q:ҙ-WHk_I\[cz-yXI7BC{2bo۞O&yx<Tgvn  8X+ėE8gVbƪ2pH,M̒Y9SY6HFDsOp]ڈ-#`(iDwѹ* p\d+Rm}ʲ3մ& XHm˭HG4fZN}IC4_B'bN4MZ@M^!╬1,"ko^0Jo ZɶZҨt^ߴF"6v0SwjH2ʼTA]CB N<N&m*o=F0Lk) @r9+o'0(5D5 WLQF=ǤB!9@E?h$'4VYЩ=A)=d^T5fY⌴q i[1NX3eS;̓2/ w0^I LԻId*?'`lY:Iex^Ȝwu^K`z q=PXgHfG*^0)2MD Va"&1emR_T6)1cV4n@?%3;U -\?3yʟe2꾛L$ GIs:`f7\D^R|JPviP "$4!l_!sI`wo҂?,EiX6<4+نNFI'9U7"y7b/|Ux{؀ڑU$jBZgKkX<ϰMu ٜ䇾{xVeXzG3#UbI,~TB_2cAh ֡ئ&eX8 ǫ*Ԝvˈ0}6e<?qO9w-cBqH,ES;R۴9gг}>lz=ۇC>ۇCC\]6^ :\YFTn1XbUl!@H:?n Dy 򅛚W/.ʜr7km̷' r Qġ"$|Ja}Efmw!̽}pOMG i\ő#>mEP~K Ŕ=8N[p-= Y4\ȀY@FC qƳmnC}֕ǴdOG(;Gw=:踿_t_NNqAG/O;[mtK$qfK!cABz}@$%qTPRӎ{\^{qߧt G ;UOB|%5_;·p?FxZ/9^2X<Ԝ.@k{qAq:d[Q^ӎỲISٍ~|]J\p Ywo"w*\r@ѽ\I kvoCDwxڃ]'e94Iښ/9ۆVp c4AehAB!wgC~dzlU|,?gj* [K,:/3$+B H=6 z71a (i h [1'dmI)dei 9~ -i9xyG/N>cjcA"Bm_u!+㼔tBRErY->LKSxLhdǖTt1W͌4]9"bN#_ʕAd@9V. ''.%f{eQQILV ~4Dy9́?/ۡJK}g2i!ݜ+6NH=V RtcY$t']jɢ0sfS>P%@i(8ChԿ9?^CdD'>U)ET?~VU#=wvlΝ22Xm34G.J$?ޯ rNx J͔\~(tYk s2.Z7C¢HMd n`xxZ\tD 4y0Ti=17nG]%S |Fr[%-#M*WO~`Oaq?8o!!ɁM5ީ.D5%X ܩĭu^:Qu'aO"qM(qMEQ{qNmrt#S"(.pDPEUêAe>kǫpc0 3zpS-;USxeQ} !® HE]vC|YVVċyқQqSwinx*ܽ%J'x^vFg0~3^3sдTQq6- >#m<2"-M-`礛4cbbf`\4!+?jZ#;HDP/P5A7o{|e1 e̚|Ls./hNjMa:OFGG w/Z.BSBcOs[m0Iȡ˝FIaٚA{S5Xf3G"5IYq_ B$ Ijbc8℀[9SLƌ?j:\^|0q9Jx) 3=X L2sJ0xTt`ғprJM=> /4gcnX&%Pz* &^ YJ~Lϔd O^ tn&X+c1DZ"#q^NQ*.!GwKr*%͒B5@]9mooî{j~X)b=a)Gq:Vޓ {n(:RtA"YoH Op./{w::j]]O떏7hFBvR0ިM}¦^Jj*׬jojoaZHͩBeFzVԠG-O7:WO+fDPӧɣ8׼5.mSFϞ㓦A̙VO`gYڥRG;./$~c/("X8bߕyyb|HfWгI>wPz^wl-%Tx8'qˍ5lTY[.=L\5tMUjP߱7*ύΩ Z3lt?scn@C%NSí X0H@'з%lcRuEFcتq|1 N}I@u-v>Jpc$n)"ʽ@Ϊk&!z2705l(PHWl;ܛ\X`9sZ s=69& qw{@MsȻW_d{$k5554 pa¤e`u009V3sE`27 1|Qom%@Aʣx$1kCDŽ2Z] Qmwϥab9ZSQSܫٴ+6Vk >'?'=q\l̲9"џmOjqmJ#&b~ZdB:8b9}QY}kei؀ĭ^i4V@r+ĵGXTkJ6j|cyg0ksO='qbDǦ)zҏx:#s jbNpġCs86=:>V&2ri#t4MKlj׶ipP[ԅj?+Uo ݨG=qEh uGԻF+F/p}P_A}}aS~l׿7%wE>FWzJ55Q_/]#G/IlM1_lߙ}~%es7l}EJWGi;ww+WzmL~TgP`Hb FOBky\Wzظ{=a\W,=$s="hUvhzӁɖgT[#@9P.lM#Lĭ& }|䚚#_VXm ; WOxЂpqV{#E.JA'$llxZ(+3Ex6D5(mP"+PX=)gcKM26^Ǜc(*AdgNDu6K^V#Fi.. 0PA?{7 ͉H־lGӾp&TZ@0CFlqaaQe놤{d0FƐNcVنSzq"s݂O*."Rn[sr! Kw1Bubg1[JBk.J5(O3G}9 ]xNgF\/b]{w!o 8" [W,^o#A̓yC?Fr" :zX_ 7sHU4ucC|F;)݋34YvxhH&FQnKa`i[ Ÿ@JCRRgr5&qu,#|*Ɩ` ̃ 1>L]8l>QsNP9iQt۝/vM6>IJsËq)Ca 5@[ަ _.:'Cq/<ָdhe魍U MX%WANRvWPљwYɨ3O a6^NFާOQp(B"'RB*qB_4o񷧐:҄^.LV^I_{.QZ+ʼFUEgHފ{E'`l,{:XF㮁D+CD/*`'ZO0UYL;5iWSa+1JqLת%~L(4)S |d2_lZ߁F 1u:_E7t4[՞gp5FchON;5Kyf3 +1[;K#\p *ohk2 rak&kÇ謹ϮT').m՟-Pƿ?;9uOzHڧe/^t}U銹)W$wܷ;\}Fdyn,C bFfK[o6CxmXeTQ&@l*CF^B .sOI556m/k靖6zܱ14>#,?%F!ڙ`NcjF u-7yAF>[BLb3τahqV,CSRlh;A 彆-+x N{iJ 5G1{^?@ܥQ8}rl :nر /<aWˑjV @EA&wFe̫DMUg>wA~u?D0GZ얷me kr\X+mJDlZ(/2nnn6ƚSz!r `gfLUO@ ʺ&Lrfïc dW!F7ۀL'ʃ_YceTQO;I@#dֿyָ'sm@{L.faZ+Tm ?Ͱnş~IȹɤkHm9^T)i RP"k9(˛q/,2,l-ˮT8Vn!$ivapKI ]djH($%ZߝʅT.gR$GEO6qGpoG"-.~Ķ?%Q@0iT5, (`p"aD݂'.=Ji&) E'/ ߒ I*mKbݔhjfya$yT?3'ug7?#LLOBڽQ0Gq*a hBOoCE$#:%(t,"v8v?aǝ^4 8V]z XgR I>B$dsnB`G0T/ -O8+~cc- kxċZe'*3[~L ?Ha4PQN-Ge1<8'Q"q\iF-PLG։H|"kg]@Sf+i3`H%Tp oD<587„㤹5E}+ +Xb帲B:q$ "pNl| u:C 6D&l ==j.10~Bɞ2蔟bVOuĶLoD?ZxZb&րsZ}VZ_JV[n5V\V[m05ul⣆;y7w٭_;}޳= oEg&O5<9IѮeګTnTJJ2I~s99KBk+֗MVd)pʴh9} @ [pj TQJƭ* <0B̎beԄ.EX, VqTaŴ\Eǭ 3d߽[)Pޭ|_rw/s7_tƁ%$g\0 -N txi>4箼,/Fp1 TXG z"=cT]7qeq?^9 1fN}JFvc 30U -K3^Z]KJI wCT"fp! `:{}ڈ_ )"] "*A@` &m'ȋaJ8 +B RLɴ)/u˄4G{GUhȟdT"V2H]4Grŋ͕^o}~**Q;(too_mn!;x·}Qۚ|]8M 4*hS* R~:˟JUUϯdUN F3~?oͧ|6*jxS˸ʘ nnV da?1cz V*b h;p6LFL*QӏO.+J@PR5"}ǥ0VS.E ='v#֓hnM8斪nJpܤ9IPFe]+Y:1DE2y4ERaP_TuhaoL7N1 Fե#&0XpCF18ɶs*Ho 3pQ](é2pHUy27. ԭ_UUInL!it$іq a /CNNܵcu9,H΍F&ѮVlȶLL~Mq xם܋sLjmNpkN)pGF)Ϻ ayhG*OW1OʇRcwt$^\OTFiWp 7_h[Lk[w @jLmӟt@oEu#FS&\nY? j@|[ҡY󭊓)pFM@(CĄXw0dS1ؤIw8SMWҦܧT"#͑xb}A}\HIK`ḭrb"ZFF+-b $Q"] z zZ"BF?) 3Bٜ_I0͢I6F֤QUboTS_H%(uQàCt!#vm')~ALj[y*hbP8bܤC}:l@Jy.NI Pr|wo 7K6{.0K 5^B)"qU˜)} Yd&JPVjrf1'TBIƺ -UpsYvʎNrH_a?E) Ai3'a4mCw_rtLEc}@QMZ0Ů9ΨE2\y) 8'Wi:8I'WYԬN#QǸ$woצhb31Bk;xnNR8 әY~:PfE#B A ˞Z) qqdԯ +ADCoЎϙ(/yJA.{=f*nmA9`N,xeӘ25CEn+ @6,݃R$^]5D`kMzg8 7[7W]K-6Lުgۍd+lΕm}eUe;Y4~<ki,-xY+LSm5,xA0>!v˻ZnT=ƸPB^~;H†Q%` (˵1k nx"S>vX aLjf;7uBw1 zptݸkD/~(^|9CD/DΗr;=4ø;+X|agT7,[g>W|QT|Dm=-.9[z*Ak0|4RoY.=7wZW9I `NUv0s?4=Y'F 3љiaMٲO±-?|R]]=6 ͒}ǝ}3JӉcYsD;,&BADN( 19%~}]66xM˞<񁍶퓆joj򤁵Oo,'L?si2ܔ]ko{w`vC[yrUk86j`+97:6{W{nR߽xڊU~Uɏf4 t Hۨ q.)0_kgO"u>1>F)ÈS K#iRf4A؃;gؾTY.vgsEFZK9E-,Q3g~7;3ϟѸ)c 7zox3ԠӪݵV @|:SB\QhC-'ii&]ʺF0bHZŵ J1Be8558:DnU2=(Cb\5@u6Jݣ ɾ2/+#}&OYAyߧ!}v=c|ny娎lY%ȀZԀPG B𐎻t]u7=˿~]yC[~oq+Ӵp{lVF&ÅOQՋ jnVzWIu/P:O9\F0Fz8 Έw#u& }I]^R su眑O M/}"{n5K Xh6yt.;:,4Ӝ/pXhrYcLQ6Z~Q"W?9zod>=~8onxIKsIz2I9KTLJ[H ,z5W1NbUwV @f\Oc#җCdw{xjJ%c&|ҝwr讋ٞZPu"]KgOEUeDbSa}:B?+o/F1 WzCd%Bc |2!ЁB:3pz(LQNSrHqz֯AnTs'a% =k0S|zw~N0'/M+Ӓ|_l0 6%bX$b.ϕ:#i76۵ ?z)1.f^=r=32=L01ɪ:l<@r$iFPzKyV檕Yj| f#Ý{˸J9uQ^ži;&KDykKF53lq=0D450=fL0Y2Y;/nG97OYơ  (b~Laj:jlozoviO~_D+iMXɏ=#Qnr! {n v,@@B PYwN150]9N$eh{k-Oxn3B9-FGvJ|2s4ÂŤC0 NO=AMW( )9K"9 ]8aC8=cbmW fO t8:cLB\+!goWq9؏S\:pт f;cm ؗ\K2[;eFzOE-)(vWyk{yS!t1B-@gFBoFUR1[`;o= eYZ"<Iա)73؏[ՌdهqbIm˾$X0~ '4'D1,`^`Uf^6.'$ק/5|PꁴdPB8č|q[onPfs0m[okbxN>T/1FX˒3C1EyAêߠ2p| 4ovB-܍t23 +=2Kf qsWko\Ħr3`bM$|Ə %<׸yp&WYs8gw!na/W&pSpB !wj-!29T82NBp(zۤF]cXˁ"%e߄lgZЪT@! q'gjՈ&7 _ܿ$)}?$BW*i5u qz9$!$'RH8.-#Bbe} X S Yʏ`)X}<.(WE{~iV=9=vO%!C2 /.c;1lYBT&D :I1)dƴ*ѤN"nlyu;{f ":z9ϲqNv<#)=~\]#%yt >m<[nI;oSn:!>\#-j]UV FeɜJ ["sTHe4`)%1HiN:NsnjJtOТJb :S{ՠ3BxJb .DDGpkdF e#1SӨ|r#՘sf$ ,1YRyIdH8F0T؀;T>,:\UE0 l9 Z;'i"]VZX豔2]4$4'+取R]v[Y\GCeà)+3(2GYDEpKÒڴ\f]px`.UEb96#<|'.~Us} I@(GGߑdLBiúq\]p95øn/#lA2IK ˊL"˕IRE%\{8z.ID4Yw{!$cxw^Ogeכ[(V#ppx&Yk0DLo#.Ԁ>HqG"Sŀb.Ei+Oꃵڃ*JJWȴ̔?OX\$җ. `'}TiNCB=Ӈu&N jhIU&:]oY@h( {E,N͎9̛0P$ w~+VuI438S!EJ i?}~AժJDskݿTN/z\o81}3ZEx-@өH+ʉkQy NF4ShaopM%tly<@m 6gȳ Ғ˞m 6gȳ lgȳ l/r{o919-CK,:c,,2 Ks .D.B7Gc)BU{gX"G컄`tӎqL,RfuP.Ϗb &vl9"Bs@LPUy5S Nދ]k+rWEYN6M`f14 zq>%)6+P 8oH|y=->,x ty>M~nJ+栝^UkfbaP&a@ݽ&4L{~z sgA.N;s۳PD bcTS,ھ2wT7zi~+}7H#m@ ur%lLQɛ{0!Ecgڞa^JɁsSaWyZ=> ݹ5_m]AUHFi5*gtX93AwW+ B˰'y08Y@EJF_E"4Ldޖ̔5*Bw_0c!jA۹x_f* ,MhxIڟBUGAݑq1pj ᜳkj)eW,flπ懳k:qJG*$י:l4Ha=nf: 2&r5U=kŰc oS<wɷ&7hp_v3'|ywUM_\“h?3 fb#Em[og݆սzgfrO[9hݚ-DEi,D$(,Vۻ=-b)ߤ@^|˽C9$]0 r/@/ 0 NCNbggs9hhHtS<CGF*v~f4:2Tydd ˱D\/ᮎ ;yrUS4ko6=: n>VSWI1`RGθ`g%17+{PRAxGVk)^Â5^krIUߺVЅΤG;<M3{"^wS+[r@U(g_kETH$1c7D vs|۠B$z0vIMH-njq,偝V ]h)rJd4\z;_Gƃn[eѮ78y9c,A(BV"cVed(uәBm$3@ZXV aIĶaTiިA]N-wck lI95똟<~c}Eb%1SgGU93GwEVhHB UR>]޵tAl:)r;Xl%k*дZtQO {N 0/?ӫg5B|&`8EF'ǩNNܵnsh8& MaA1on㽖NJΌzJ,_{\]a4zң?O8 ~Eg}SVqEY*&UU.dL|U9׽5J^+?詻0#H곱qwgt\2be3?, 6k, aDW^I*$TaĀx?zzt%a$UOd1c >KeaÊƿrb2~%\G<)hu-Ʃ"R>O^h.xhC^4ȣޣԜI]ffD?LTZ2_c%w2 Ky5Y ?Lr.ʐ'Mˍ+!Y<|LT8fWk0?kIdiCI7ѼvohLDm|: m6SawhErPsz;-GpQ&&T$qМ*Q2#I-ՍDhH.cFK 8."ArI%wst+A,C{)ݘ2WuԈ"ᒐ7궜AGLMwuC_te4PkdN{ s(ʢ-F9/`oiv/3?v0* wb`|%n?W㒞4L{Ay紹RR3O$1m|ʨP9 LwwɧjpF7KUA@+f"/m}"$œ%83 52o SNᄃ O TAxw&D,r[`߸b62)"h^a= 6dᇀ'Z{à4 h*y ziRGUH *w-@R2RUt|)V/9}\vhg+wl`H1}yh3ȉ R 7Ǵ{GbxNlMqaӪ8 Hpw~I{R)&J'e<&UBqނ#)h>KGR޵52&PKT zn M!v JGY R-/H%$[M)gh)z }I8mNG[3DaΔ ;=!H w_eaxj}"eINєI6JA%4Gg/pVrdIӴY/Io50?Qg4IsTz$=luck,>gcyxأcD~cE&3g1j{9S1|M=1BZ)\2qȠi܊8iqf6g6,Hy;ER_ͦZ i|r1TPvrbn2Lx #A"_uІ#,MKoR+Კ-4҄֫&%K=V {OԻM(Ht q7.SOϏ:gtSi[ܩ, m H7=sNl N;,BFw CYU]  ƬmU56x 8_"uؖc3x0Lrw3GM0J4˫*DN8ҽ{}{9'qxZ+|Wt̅qTHN'QvNp8 1=OM(x#r_9 .В4A>)pB ^.1sY-]w:[S(<{'f01=Z#<"1dP Ԭfn0毽2=&CI[j/=A74'KU% 4E U*`bx>D`` gz(_z.H#kL%ixg g6?l=HhJ\Me2'' B \5xElJ-*t9]Xg@@kf4eNTW+ws{~VIMB |:pfLX8' tL%H1wÃW H.>}Gci=H1{iv댑ZPj5G< =ޒ'3Bqx9&n3yʢ~[쯚{<fom0EsiZ$nI@ġeƬ=P8oWƱR G_C$m!X .,h uCV>I |0KU N3f*k:q Ɉ/ [Lv{NuO=t@Jo2ʳ%ݗ穧g H͈UG$] ziXN}?v2 A5SxYŌglYaUq&|8z`t]kxUu_Q8bƈc|:ɉ]0I+|f/_F a>\pfgqz#KT@dlHTѣa5QxIYI3W@|QNju;AK{Bï¤Jv6S5Ou0* u| O/TYsiit0{|0[rbާ(f?k5* '*`U=|J'HmCcs{3 ۯZ gYfQwÁ8tIuC9[ɛ.4֦UL;5ܛui{ز"s?" =y}[GJ+?W#D_\r7$&@-rX."+`nfl ^FckVHd]S̝ ޥ^".{4U)SZoS%`EԒršv36]0t{xis@O})$m= tJQj4` +!Ijǥ?F%+O,kJ|`ѬWdz%M6-K>"Eo<% (F1_ /%}Thݍ&,p B ͨل.Q417K4 "7 DTu*?)pNpuwcAmh xEUbZ~aI0 CxeN35˛}|JSh8Ψn872ȺU ؍Vę(АH1˚6_oItDҿ_$U}r@7{f4{ww$W/$nJ<h{<DO[PkhKpՑ*=i ʍ s9'Gmx;4:q^FxnQZ.crax 83c]ofZE5+-r=m׋uB&E]"htʀkUlHl_v7[|/ 9I1fC+k$>ku?bq8n|VaDu)Gypm//J8(,"L "蚆 _Oqg75c/U#͏klvՆzM]w`),5[^Z㫹wѥo47sz|T9ͭ noh.E&+!OSS6Ӣ IlxqX"@5sBViTMKtiγxU/2"3\7;9uSm-a|KZ@`Xfnz8 glǢFz\&@6c8֜uܲr 6`#\uǟs׳bdz+y[a\tSа~qu #%f$[Kse j揠Wsۈn Ϯ"ic ŏsaɔ:<񇌿JDbRN\Oʬ"Pa:ݵ׼Z/Lh Uaa6⭒&װ+  =*iql!{~ |!'>rxZɔ/ r'ړ0ɰƴ.Ĵi0CbT]I]W:k#%E)ib&C.xBvY_+!Jc女}z:o6ywtvMz(lĂzdzӯ1P԰qAܻr6I3r~+sՃwzbCd\r}tyxi6=eeJgx }EVI]e)8 O-2<^mŻJc r|f E}s?~77hu6T/oL}O#8EmwkiMdD?W:;^>."jp` vӇ^JRmYiq>>Q΁NJ !e@21’pԈxڌIMKht% 'nxI`=Sy=C|D@~)tPkJ $,FPoBqI%"E.@gMi)}"sE4/qH4^q*U{~/ S+$A͵ f>v3k<,C:h78z7%:=1qN %4b2VzN&t6 VsDꆶg vEk ΜLpR'.'=(#K04K޷ {?M,TCSX4D~IIbfJiA"Q%V>H߮v⇴Ba~ZY~4 $q6eIAm+țg/-8ĪQIw 5҅=lZIy eo/tt0^fLO'x(}m?*8WוmRY%x4*N=2&\8lH޻}$-B.UaJh#.I;'Q+,"oUYl(%dLFSuRmYF6]j^.S&5H$no_4STo2Ov=? t9 Vetq.+- 71zvQȱD6mL*jBYo>#$ƜsfAfj˧}zS⼇Bo8p#h^~5Җ4&"/=̊^Kfk"a1/  V)>Vyf!^ ޤG2"ü!ݒ^s^/`W@b=Ө'*]".s,'xfy!" &B6yDJ8bnL$!݄ KZ(cmbUY 68Q/&5!4S2sOnUfmE~W$ e|}.I,^n+y'Z !,+=F"3J6|"I MݜW%۳rB#d:nMe$2xwHe1R/S=@>, v!7K +{?[IK9LS (;Ī@鸑K("%1韻i=okuW/$ :@LZ( #o݃ OoP8I.X04yo"a aVF6 ~B@͇7C1 hZ8!N $UZ@G2cR_4Kؕ =`q1 WfeH<?,@}1[yUsQ?ψCLj6}5L)nnZS dGe$Y\|EK@R$%TF;^$%R/RRuod$vB\yrVk#MN7ʺE w{mOkyZ%ky(m)"86~DZx$1.+^(-+ *|P8l8o5c@襪ʔ[L2ʅHR})Wc mNh.ӥ Li8&uu7QQ{B֝rp*&:W.c_ 9(hrX$M= ">*P#g9. }p)p,¸"kմ ?unȫŪ B,;th>10?.5n+%ϯKIN4.p.ɕB~Um8k*):Mmw[#@z+SMT9ݒ H H$?87ҐKq4EJC9+|x}hyOu 2Q6GF/搶q6Ln@wSZ4A]u1OB| 4-$sWY ظE,XX*wE7dcF[HIslz.[}RlxzlH: ^% B~.39@iߢn[0#8ۜ/3N9sal<.m3 yOg-/r-/_\^.:7{1eZeZ>J.8)h9 phyxO^]\K-׷1bJ~g2C5 t,N $-܈ 3U#ڙt уيKڿenB  uwi^QAXo!ܦ]*,*6l}i{t`$F6Q#UIk [.N~pZmcr+yĚ T6_[GTqv%ąIqy -Tf'cJ'.:ke%3>0Z#wdQU^rr7IuRGz"h\ien"8}$Qrޚ D_\Ҡh.]>rgLZy(ڎzesᅴlzdLA%|Ӛzk `33y.sFִM΄/)ua@MNh#Ԧ o%vhIRe[c״r+8]v ;9i"OP c&xH3C4{ _>6!-gU ] liϰIt19t5=~ZPt-A gpDBBC]*~ܮsHM w%i//e Fu죞(tt1Gf0/biuO|ZR8\4<Vr2MSѸǚ.s̉9=4ZzZY&MH͎{+K[<"2rE:}i۵_z^T(B=ÅYOLqEL(PnbXU;$t \.ܣ9T'TKL?}CjgZK>l:n;K‡Y7P[0vP?-234 @% =TZR0oੴ\ʽ,!EkL*LBH{*u?o,Fb|Cl]2Pȅ2+#@SYveYdHYӮNoûYB{T8IGXG)2rbCp :̇]JAFPGΒRRA`tZ Oe@)hk'Ֆ*4c=Y|91>5OOkͻ}ŨKtG= ^Z(q3{ј愗QQTD87geqߐhzi^ ^RS#f7a_/m ҷ[kp$:K= Bs=bQ+ỤZIH` i0`4^M !e󲪍GV8L17l nc j萩0PlZEOi7#NOﺯuc3Nӹj 3 m°CĆ2W$&U1iWNMY ^͗orth^ޮ|/n%P6L|s6$&mvQIi-Z't0<' 217ۯL3ldϷфh!Nʽ|Yy93z?K5:B߇X K@>Ws]pz:1{iF LVFShH Xݾ'2eoGeSQSf7M,[Z ewV\[dڍA/`i'׉|r>6y(pw?n19U މe^*CjeZ5jDްp>"f$@4/[3|UUL1:"c(c2̫L2 Wԇ0'SpUɼehzt$_oK9;2H4>(<\QyOxR4.E:bAX|x [ I0<0y?=0?.?nQU|:.EBU٭#e-ϩ$r 2 NJ>{ߗ!wFtƃ@w}?{3*Ӆ"=WbKڌcҭ713yHm\b@,2ܔZWsenʢ'skB6&磉;jrM#d`ڀ@WغYpԙ脬OǦո]\OVX,>rPX@yO4I r4=*gU]MjݑVxǕpHZTokvf{Ke']EduX~cxz}_A "AU r=e8Q[j:l-{VE f˻Fҕ'HjbnՓ~;_/WYvGVsY[#|AhO ہnE9Rtb.k%bpc?`o[okx00n}@$則V"z)}_ w׺I-ލ[{+Rcj-P/ǩunZS, @u Jm [{"IzAdѣQ5 F a `O\3=`/dMPbVХ/(!7|NJ/o!}4Ek*& G'-ZHܓ)s&'1! '!x]7=mymn/+lJ-6%g{4L8uµ/AN ;Me,Bg%4Ƃz2IH3 ut@Ëou |L#H+sFa$c2N b,IT˨0((MiEJTasrZPx䐻Y/ ޼نE~9Ul$ӢI͝51^ wXQG3?84iF#0=NY$#ppXNB}s, 9B[gǭn]/GKn+?%ͺͭmlsg-L' AXYv}RK=wxFsjvY%T DUJe"О!?|pI΍mǹ@ij؀J5.vW*4;NOzoS~. tq!~S OiUIa,:K{< ad{Sc#9vKD "+Ʀˎ[}gifczbltT3)i`8O#dW=;9=@EU#l#E5%\xOwL|YtvWG U_W 7пqXVwKhυ_A1&oޑwA g5 tFS*s⁝*_쐆,uA̒ !igbl8䯞{HS:-'q?=v㉚R'Nr;]L5 iDW\{;ss=T 0]V$W91g>4[{bB~ejtKA{)*PZ ǜ~H2"͜ݝ=4IU^#s+B9&!TvIWo\:ĵrsH b"8.o2*7Az-; &PQx]h:6ŭ-iJiA'źA{ur IPt0vH:t5Bp_i)=Kn蛭Q<Xti?<*_*2/aZWQJy`jݗ;٢#gopqq3[aʣ*@ 1,[RbT") ~ *ܖÕ) b%yV*H4&ъ!MiO{ `3l)$d1rve4Y?$=ਟ?JN+oV/~:牚CtAIuqr^{r^.cJNGlj7G N%ʺePSSy1tkd^KB6}rUp4BWy:WdJ=aaq*g׍.0sOt%pӿZĠG7hWTXmaMk#)Jq嘯p[!#qU$^}Baw1.1f(LM=*0\Pp&f$"cn0W/fa-Le?q#b{}s[ؑCaLL7 6O~ud w īCx0Me7r?$Y)F5dUQ!W@}vFrFr'S?pf%fŦ YvNs=W"Ŵl.c" AK Z.L nSE'}DXlȝ5-m+$]&ׯ8λ ާ$i4EIH8+fj'"';D#p6xK<-uwD ,8 OBcG G_ձB4Z,ck?T,'P*H߽p766_olo:,t~{J- 77h6oX ߍvZH14C5Gۊ0 OTOymY zh1<t;tD\Z1f ~Ls/LQLxEv^/H8 mrzm<a#Hp0;)H+A3sVɦ{zS> IEHFH;C|cp)L:WIzE/xn^/8IG:;t',ِ@]qg(_pг lUVt7L i)Rq+AUxT4"33B ]7_^5{_8ˍNc>fQ*ns."eK=>;}gH>K``NBP$O6kZǸץ2+>SX6@xKK$37(f*"5g֕&GEΞqanGSR[h*5\eeTG 񂘧md ]>*ssyD9"(nZ.$1P C"ÿy $6GU#]-|Fe0sE" tFf9 rR BFڒN .jqD~ݡڥDr3dȼ9f^1$=?n^i0ܠ'ZRa<<@n߄]!05I1ylxi*k[ U#Db<ԏ+:K7F}C3c"IA6|~.//\C)s8EHS,1;.k|͑㰷Zpြqܸ[ Η=(܀F$N](Vىu>tF>R|L2ecC ;n9AO~ڰnl9`Lהq}4o|i5CG+A @\#7Ł6eB`rO a8k(&g 5B[ 84oHrW@SBŤ]Z~^:$@U3hA a"Ef˗- 莪qd|q DI;*HݧmHe")i 1`Giڊ[cjaLWe[yQHbg8?0 _qqOTtHm,_Md*jW }}O$E,//1p(li)NcR=ڴ&FcDd uZMe* :OHdI> "J1->R^,@$(h]qgHWT1Zzu2R^FKpsX#(cӝOXI*s CPݿ˅AucTwJ炵XKzG:ə/hO܏M{dո짠[Ȏ˗[7?fi}\vB!gU5vB?|*+dmR-&,۬/Ml[1$wA‚x_T?wekm=lf!YWNm4'媐ّ$&Ss5 A2A]]Y]PqK9"$@(*+OX$ /2km.Q䚣x]\]6?YlJkHf@fJjX h(|+{P, a}]-%(? lczfAM{ |Sl6eb'W#wt #-2YRC>x@WՒiN9mi0]c6yp*]Yi$?Q '˞RSl]@$?@WI<"hb"YU R^S?!fc}WQu2d^2H*+-Ò t;8o)CHQ~ ?bꄠR#l~7dgw}X/hSa=~C2;G2|F : ;c@v|.dE=QV9 ]#= "iܳ0crJpBLx~_{Tn;~edA⇿=-73`|FЅ5Yg:[RZPMo:lR7N21r/$$t~</u '_:~O G7MR-:0Ș@[!ߕDhi YZ> Hd9-85Hu˙b=덽íXy]%t} ȡ7 |iU<|?A5t_ aՋETNp28E[B\~bb9c! ?j(Ai5dєT`gCT8nW£qw[2V @ oŭ9̐L|%S\UyS$d @ʑ}ˇ|6Ota9'9HUHZdxm{u|y;f/$|c} 5? #+?g Gru}Z'8@E 7sW||zIu&YpٍFwYі);MU:* ~/|Ή;g ~f* 9 0*ʡh"4K1رS;m`3Nځrwg84W- 5!;3| G6JET,KJ%qr0I/jq<=wOq\  bh{9џShWp]LBR2Zc=?e3(=m7'AH;Ɗb Z@JYdD%W*J#= )sXuMR!yHa|nv$X'R[|s̀~ZG#t|TwZC07 iڻm%(JA")`4ᒿb4PGfFrkke]ry%Z%E~K,ܥr ,ЭjZM[ յPW&~K.#rqe.Q.U{\uDzwJwt%*%ѿkydJꮣ Jq* Iw!x\J% -y8+ӷvs\!1-*]y|lh|kkٿW]kkkٿG=N@= 뵬^구^궬s?DbSk>\KD_K$-77 Aa@rTQS[=gOAYc%6bnήS u Y7IM)(.繬?$6  [$i+ȜN[ݫAlIb|5M$ 6R.aPIcN u b)ȊC:ӣaNw\^=^XrS9Y%4"4(;.w\ 1w?k'_Zr8B"2V~%%HfUTO h9a/%36np@fr.uK]4UTʸ;cפBc-wr$2f)ѥnRvJQNs> p`N1aހ5R{릹@/KZzbjtKb"0!P+hl1@@TMBn"Q'BURds=MCS۷UV-tjN%9 ߻Hf4;I&ӥnO%CqXZק@`Ҧ$녍k3s(w=7} ެ9?gم٬ߺ9N׳p#&;ye  oI69qK5;w{)QPHCP^ܫu#>t rŧwVM.YG>if'qǑ*Ti`I?1s]g) tADYe /)?g̲u-"3Bd dsCbmoc!nli,M~m/n}g7j &м^(efU/i9ijh,Րx2þf^R6%z\RQUQi$reUTnoj~fjūUŏ4Pi! :K)f'IGނuk}1H${=c&\xi8ǻ}DTT|U"Vvb ~FuGW8T 'Uݟ81zn.٣'e'1]fcYTsB+S0GP4H٧[œ;ޣv"^Y2JiT/tALV gj:e~fKRZ@#uLHI>¬\$Z<&ph>?^F,N. sgi@ "}[A\0[Ifz7xeYYBaxNUASտ3l6р bW/d)eKe H.]𻆼[xZ~2,Ѥ0 b4<ۛ/ GEv֕Bs]O19BZ1lfoŋ/_/6҄Jb𐦹lz"tJ{^iu wvi`b Si}FXz9]Hrv"M ͟vvKNY q‹z֨TVdWJ]A 'Y8a4"|F,*1qYT/2#s.5(hxPSdOۙGv?DYo 2]2PI"CnytC$&"K 7O8樯mZxӟGc㸱 alp~<۔YB-="ۑȢֺ8NHC8-Cc1G$䴈7kvu,l=W`q~sN}lSdȀ{Zwf ʝ))FA w\ќ:L3% ojn qWV7 ;IQcgPϼ?߽} D7l;2P׊փ@4[԰s5~ga: he4$S^:aFbMq wgɧA '&NyJoZ; ho:ϕNheEm0L}IS'UE $ez?_fCKkR6ohFxޞ);,Z/r`:27QqlkKfHUFBIʉ5땲@`VedXFYxDrYZK!XdQn:*F) m+|TV/(A4|Ć'i,4jiBS=؈h VP/fuźQ~4¤YY燛7޸"i{'$ ~UL#?*̕x;4ǼR4v>8r!M"fPIURm`V7d4LFm6\z0dR M[dd =-c/WDZgZ~7< @UJ8qTYz dZcNw[g5CVvNUK?:Ie5SSssP%p˷fjoƚ>gSvNhfjÞi˸#{إ̴yW} >1yt<$3M4(8>҃.,96ڒfX0옄J@:i2c|]ի-oe#vXx ՟z8\)r.=25_u6>kXNӸϮH ~sSW]9kޔvl2)@Bd^v$)UuWZW63W%ǎx`PZɭUTC{ 41M +g mYO,OSvp6]}4ouR}z'SW!]c[g8V$)~LD1-N k:"VUT4YTnAj ioW["ڋXj/lo3'yrڬpIݲن6nfmڅב=, $]D-Bk񅩆sr݉.hXh25Ya͜+ÊZE%D8%o W֛Rqhӳc|!% 8dGJG._|/^XȚFS9@R`<ՓPMI:RrzeZUDdZZW]q5ȑ1f@bGx`|ڄ[Rp:vx g:FF4d5U.o[񢟢&P;{!}$w{y =iDl}ʗN6/1>C?xiUd$,fŀZc~hϖHN{f}ӣ [7F?~0>,Ӫ`Yv-0pA^8: skNv&u>VH~%4uwf4'l6A |_ۜo U0vh960FQZ^P`#Q.4ܝq-a20sWm)?? QPB./QP4Eޒ*.iP 2T$#o^5Cg$]}(1,R_X4SQ3M|XSePux _ K0*`O4i)APO A"WfR{9Sܝ&8S~^k62^ZTdbc,-s?RP}%qVLc1>0h)'j1Geo.ʂo]0.&:H2Y Њ(#ZgdG &d^SEBu;oC.oNR7ٓ1>?=jo9inav}}71|u1X^`E?F@# VR y n7TLd5RӶXPibΎIgu2Ac <Z؆4M#(@ّ2n9Ȳ.9<+]ftԇ|h+)g`/$M˱)9 DQWYTqJ`ʸǙ2-ijUARWAQta@;_i䁧|y/1=mupmos}z}|qB%9/᪰U|s^'$0> 8q_+|#S$dlC$ "I%iDru"tT'!tI(\"EO#CAJ˅~V)am8<zqX>9QFlnu[/^yfvѽs `bɎTHP _kRz'PE57*y+mb1#`:Vx  Dxtɾ2u*Q;$K:(d@ƺMr'dEʥ]*{$ 0Js 0L cSUuItSyі# R28:~E5!yk&Bqșuu@FPMl8={S:amY|Pse4~;S5 2GJ_iQXB MьC_jr/>e57W*\*{Bkwc/4@6'Ez\o"ҹZ+RNU 4'y~w˯g0K}7{[%"N+`֘ǰu 7^P$7\vCcnś9{÷>yp,=LfBp0e af#. `,hA?Fq@sps섴'` ,CRqa!nV-AĘG8Ɯ ;kYXr]!?fݍ*5; i/$(II)7Lӳhv|F_h7AXLvM37ژ\~nV"̬J7/WO@OsW9Xc>ylG`H-wǂ y54R7pC,"96R!f!!vmrapC<7Mg*D/suhe0I8X?wLVWk홬xEi) fx缜xl%Tૂ6y-}WM_$OnV*H +Ms|VVI>ڿ{-LgN;j(zc:RR%된P P^V#ʹoMg@PZ'gD?}˔=d⼿#9SS~ QRw& nT\s OSh_H }=,M0[ؗc&(4OBԑHxGUD aLrHg!S'AaC c#KL2KY&vR7Bhnx[O/ZoC3:'~&)hPkhپ*qvizfy,߳8 q8b&N9sg!eva A>\\τ0*J C_/^0Nl`eeZLP#'8 _B!beݒ pAki& J;OVM4kq4LLJbIr)x~ЖҬt|<ͱv O6g]y ^;G#tTi"k1 1^xoȂ{{f)*vIÔ[)JcOI_r* 6 VT&e_'A7WiC9KF_;|jA K↭u9q Z/`oߞbۤ}U),Ԍ"G-+ 4hg4;>,ĞlЛkg ]AW%CeiըSRU‡dr̢șpY4w%+:TC9z  Ф !ooqOd:mPwy:*Դ&E,֞&]V]{vtvr|f9 :!-f~k`$R],Hc*RauäTCi|k-Gu9E9 zgm!.$ 8Z±gb! sڙ՘dfYzneo$f.f^,rAkc$2%4Z쾫5*LЛ\ބ~uw?e߃ڨ'[i3^N}E%M]R/#1oVt `˗mBZC, wڊypTYDF_=CB8\d'Ej1cdiR ]6o`JMaR;M1ֶv}f4_C$h[׾wleUv2K~XpM -416 ONZ~PY:F&L2eccʆB  1* '5\#GaWI(紳כUİtDNuJ* ǡYILTsK]1'2IkT9TӔzvDO*2i:1:aa@ʤ'4ʙ*G-YS&0G4~l}#(dt#],UXCAl'|W>V!?7WJ &})"s?fU>)#*W>l*S)OIO"K#񴐯XݏZ\qv|!]JI{m$I11mJdɖ IV$$@!J:=u2D{uO,BP/OD9=$0Tۓ>Ma^X~ȫ%^i94NdvOJΒeQrܿWI]Âancli˺S6eAE:vZ>DS&ЂnU>#ģZ†X@Z8yuOe=e:DR x+iz6a99m Iυڵg}3M=.rtrO_Di@O1j&:* ɦb &_#Z!u%2|F N{:|3n;wӉ7?trk񖻱>r Fƈڎ+R >'pB&nZdWfkifP"yfVb+K//B/g Ll 5rȒ\8$U# ‹d1'CHvث#-FXB*D2>iJ`WmLx\bi0tsu(-y6ॶ9k=,ʋGTt|FNxoa#znc;3}A]{pmtzԓD U= Hh-}`nRb5;` l+94}{*AeX+*W+v6U%18j^ӏe, ~Po/dOE7tCg%<Vܯ6 ZL_ucP IJx{Wn >{ȗkp*:DLL#9yȥ_e{!dN~HG[~ 3U k>JZ7Ģ_|L^NxN.Fٶ  mCKWyU>LSf7RaVu;{,z1ذo6*nHO&CO3/O[;u)#EBQhb.co}yE>^@}@p^-[`${ ?]xnО(pG!hRVOhE$pQ5raBL4Ɇsq k},i㍧ayY91LQ2sJj3^16CfSP@ O$8nGIF] ̎3L|Z=|lG8o.k#J gRcSi{b'\zC}keHlۖwڍ H#{;h]a@'QmrfZ]ŲSp\Xtn Tyslx3s_)zŜwPӽLߓiޘ+\cU)lu1w`X*#If</[=]hl,1@*@z]C7tqXewHéH张KPǃ\Ľӭa5KE#,GK|..TlD+6tfND"0Řfwj̈́m\SOLUG7.5*[SWԨq(ATU ΝRUa/|~ ~H@2~a]a+d+6Q( 0D1B:f j\'TS %--߀Y*P$Ne[ ?) {)-,!L3vہ\Љ ڥ\fD?߸K4*߸o7/E؆-NڬA󄪲8S4 ͠V5YgexۦNDLP2ǶF-H'ک(mTE_A"Iʳahܦ\"fj(uu&q?dXJxt$Ji&YAorfV* @ȳ ӧl&I~魽vֽ%T$o" >A-W; Vv$Bf$}.2:$ylu,>[dj©{ߔj%I f}1b[)M 3.RČcNk5HLy,k^`1N*aNlt[yw\C:w&wGf`b[:JLSnkpv7YUbZ(rnh8]{J$JY5ї8FRq |j>X'1zUNJb! F%v!V3eY3Jw}sc_܍ yIK6u o_K4bMc]ºdkW_yB c}{Z&-b*JhƷloaԈ:Mw'B?Ȧ]ļ`3i3?5bGف767!nq$~^eI~%p0,<9o'|س#73 T 7g*w 9j7=NR"Rײp ;W!Քr4+g&$0SpL\a4k+J3]֐ pe58hvM;84-g{Qƺڝ܅zP! +eR@ EƹaYhJs.Ŝ>, Ƙ&EN]Z`M ; P$fSUߣsFwJ_gCp yFC,%H&_PB̍X. ?;2Өؖa|53E+=L:CGeqKm}bpeesղZVVjYybv+eeղZVÙ_MoX2]yE+^.4b%cDwX_W0I0f(.M0W@9ŃE!#cnIZdMK'H{.4>XnxY&B77 6Z=XqZ3N%#(fp}d}G GA'GK؀?rЗBґ^rljg2M4"Ȱ`4F 2g#(d ĆB_"zwzSc6=YK; ʔԽQA_X=r5Vse.s nle?2`#SF2lk198F=FH,O}Ԩ*z&7$VԆK/CP϶t1iي׷o93! nL/s&ғhFNf ZLcSagɭHlPƁ [E׶6߾Z'Eؒ/ xQ39rntÇ{SrS^|b\:-wY3#,*f1aȞLq1ın#qk/%ILּ -C K&P27nc Z B^B\Z>|[7E#N=[ܤeȽhao[l51m=QX]0+;9}Owu'5AQ&VR FnlxrJ Ɔ.h_Gl"4 e!W-se\P4)RԼ$Ix}'K-wa-\#-m(q*n`εBԀ,K7DB68UGTzP#5aL}.%cJHR"\Zq L(:Xjɕʌh#}IU\ɧÂ֚wX&Ks ڠIkj.tp/p0CKyhk/Uر}\yYYtV]>#s-saAgAaDO8aЂ65*ScQ~2&\q /s_eT.Ol۳[ܪ3U_"+.+.=fO{\IF./kZ::˛q j(qSf%Nɩ%VLc4VL4&,cx@t  čq6k)+_÷x66K;jPfY/B6]+ËA*2]r*c/h$d>'şy_i OU\RUjGwdf63tc7j+Svߺc~Z=4Ugid6$vz ']bk]mN.f;xRQ#ߢHFnpp6 YD2I`'\۩2[ofquRF&S$|:>{ih%c1M>rVOxtR°! pN.$WgR6j62RO3o`cXX;(都5˰xniqN2PGBiR dB뭟\[$KiS)2u"WX[ֽB\!%Kw)[\}ػ嶑$ZGl=CvbMQnlDI E7??y2 %Rmѱ1h$PTeee%2ω$8h@Qdb1q`աJrs3Ʋ%J{*?{u8S(z82.QocHzS~jZ#' ByJ1#ʧy?LsƊcEn^9~w4 ar 4mFFlICK%`ȶǂf|^}R=aۑeױ7j6C Q>TiGсa¤TRR7[$ksȔg-< 0`P;NjDqub#}mGbPKvc@ޖ3 |Le,lS㽼_su~z_ڃLkm lrغM޹}ԙpiD l[Q/]2"Ή2$ &X1-+c1wKP#Vb hnz0[l-mަc^\ ?6C Ix(} +Cʌ֞/H[6m Md*Ә;<Q6l|]0{X TYrjZT`zV[ r* o7Jț$c<Ӈ H/,1oK=+[\3}/ޗu@D=I?c6 ?A$[[[j쑺elNj};kPLw[19P:(4 2KIN3l/S 6_kii6bsbF`6l+r{B$O.p[;2|.sQpgmrU/lQږjta3XpTӪŌC<|828w;֞iC@MY+f%J-|r0( }H4v;#nӧʲoz6cqrU+ ?ad͒D_FY<-Z3z8яlc,9`s x*5q1cH(DܛיS꼂O+l^cN\;4 uiu SS&0˓C%GHiwoA#G=$c9=0|CN~!,Z:ҡ:E!q~Ԡ8f 6!9v G#C+:LؓehsudyPTgNwI~[%E{Ly=#CWQnd+x lΩ {ov8φnPGJO#㣀v7~b]}Uq{k*e1Imb1ĩ -F=Ɋ\-neeq: D訾O9e-dU/r5z9D6ph8'&<ߗOdO,)PoWYKiFٶ'cTk)S?# w]ط[[ţz3{ u3Q#gΞx;:5M2|oe/J9yH} wߟ6p$d tŝzY"{ gymΜ%VYA! sd ]rV :џxtʳbq|1vshkUv]::_yx(s]EwVQ {v-b>[cgRKu-l[Ko-ְďkaˌfw(]Y{ oxT Dd>1.\[_z7څXrRNJ ]2NY4*gqJw]1 L F>-t-wj죰K%Β^/*;WZ^uUwzP[}Aݷփ-o=ߴ[n6$Y6G??SM8=qfס.Ml2ɥ[w{m_9reeTF]<+7곺V(8M54-y9T7{#qA6t8 E{O  k8cu"ą,E~z䜚t/xKOVV{LoEA&|"Ʀ5?0N1ɝ7 k 5~w[;WYK)>]&aU49d(0J) #g8:9ƈr \V/LRC3GJ$Bj&Ȧr(|S/٪ހ!** )afՁ%0ħVcNdGhRJP̼~N>P4C{r͡ᓦIIFgɇ.}#v/4ec@QG y@)uZ6HӑL[("qrBeu麸&_"6+'QQ%/<Iu\J7OЄ0&׉,~$]}(qWU9W69LV5I ȻImL#Nf?7=k~I Pc>I=/EbU9 ꫵ R؁< gv(ngZzAy-SߞӪj׻52U1m5j/Xm-8IlF1@>V%Ў&ځn:W"+ߑes*Y],oxjΥT.+?2~xMv :7|kScc|$t?3(跧 _M7R n_@$bW@j)8SAuW]$3pHU"}H/oFJH`a2!<~HtI6TŚzW:Q\w0Qz$!mjnd&2.3sSeF;>wZGaQE1:U@滻u$f՝Usϻ8se>,K3K{i, 0t ָj _S]4XG$eYBs5],嘩Ƒ>l^"5*aɑlG;Kpu\9Y[S Ot1Ros (?d _M1(o'%҈t'Grh4^6T5i&;E\pnq8g'hfsLTNGO[9S P(?%{J/@M!P+WT>y׈VzR%'\i'7_A%xL7X`V eh^kF*=8n/ 7-$߬/TQZd%Y~gqop,SQ1NIψ4~g; tJWMSj!( Ea1E 8] ckW*RUFJ ∀q3u+̔$ A vs `M͞Ӡ(qxpϮѪ"L8(biCOY:&N Yd,y1*\P^%ZRtɻ&k!אӑRWI1dtctDdyFL2LW@q\ͭ~n5'(# sA:^_s=N!0##]!I<|ŘucM b4X&ju]Egz:ȗ6i9R$;?u*k(S> 'Sr^Srh\Js/_@ׇ+Wt4iZު[Yr+2ML:A/b+M<.Uc'EU&&q@U4F:EuҶXb_-Hoa^3fkfAN&73!a$^V1ěETWYWMvgMOm4}0LWԎN*'N5.IWbTsЪe )Z$0 9Sqj0.7izqJ֓)"V2Xk3e`q;V6Q|ag_[ K&g9;ƼwLބzZ8vqL5'+D::Ze+ 4.ɀWgz¼L/[F#06"N`ި]ϴ[i(g\#No~NAzS6Im%}||O-ԇ˷0^$m.ҁ\}Oh(s -KtM;kPzy=8\Z\xT17ا1 wSNW.dhyاi6M6%0֌ISY2YXg@?[%$cc(/'fOt m6MoVS żxX\r|Fhau}1z3rI/-Bh(.5–8Fr G"b! V`d{ :S)Y6 ۴7r:VAޣ?tFޤvN:t0m0ou0KT-pC cj 4 >kud {cXW~RfIF,z@,*.,XuHjX6nOD8BG$EKK:9&c\0,N a%a7Ƚ&@e_'Qˠ bFcn:𖞔N_k $ mߥgW@wzMkcbtxgɌ?s8n6;QZ{-a;TWH>0V_MNgtgZ{=t:tap؏XL.c=@/%,8YzӬ-b2W],uJ&3g͔g%ILjA[H6Ab/pE='EƖ$&j|BBַWhGtypYZl$GۻYe*A>_@G$t`mƆYu[D㔴-? {6 Cp|Teuq6&/S `ϋp1џ؎=SCy#S@;Mȿ^s-.L%_b+z$<{wA:XR ggB-;u4 UOOfx*3yØ ?@/ ;caCi:gKs^ɪM "8g8jƓݐ.>BEn5Y0ntȸέl@cG) OfIPv@j+ѓixjnJ @?m2#=a!{"H_9e%\B2 -d$(^~4,֍tkVǁfu-0iF\ 3x! l`oAi˂.4kXqܬV~=%Fʆd˶5^ ]܎qtRm\^^]( RKv~iӳ ph vz2܏kDlK6P"4hN {n ё?-IwꃡA(,-1 }u?rUX&xvQ (JRui(T۟|퐥 *E/ 4?}Q?cul A O]&? {ݕP#C[ ZA}6zE񯽊EXOm̨3_@Y XOh-^déV!rm}~:/Xõ$R&+2t0&Ъ46NlLHMHiér鄃lW*2~: Ag&wGIr3Ml)&fvAgIhXiŹ̵),92';|jH,QWe/ fQ7{h}gq#z@w}duiעɌPAiA#1A#̪uͬ nVRΥT<&30ppVdpj{ &66i"qW}ӿ 1' z'Orj6ڏ}'ݠuOhI(O4KkHL}ImlpVjByg,&;m|&Ø؆3HKWbnN֬Vi3%B XLʪ"(fAgJerkecL؁VoB@8SLVMpH/b$ϑ0V4gP|*L@$#41%188z D]yW.o67 P%4Vsnf]˴~3 QPM,X$z/2##;"ݸ4^iAٮn hI@6үߜ;q>1ʍ&&]n`N 5jEEO~^G] + rh~̚D"N&͖f1[qU*a&2g,6kN/7wMr1ocv n͊G$[3jqfKف@mlٴSA/AVH[RDjhnral`eo6HEZhpL IXu59;,2sY‰VDG",0:+8-T.xx6pU*1wv7[& jd=-@o)hnxﮎHs|B~9|ۄ1VKwxD>pt~2̗mнAMZEɬҸk/Ilx^$Z~t;QڽX`]VUO?Aňf8d _$Kb6Wͱ+? :`1sVn_V]vsѤ*r@7HwJt 11Aόa0݆uiDg3샸J^YaH PNtG)$.*HuFj@$f݁d;!|{Iӱ|rrDe~涂FrJgnE73mcξ=IB$vf.sd&ƵZ<>G'j~mk;UJR$3o;hz.ibUHGIO/Ώu |mY5SUd,{'^.6)Ba9W{XZ sUVHqƫ7z"Th x>5AnX>G4ue xW:NG< 7$'fK݅.8jQ}6eX҈L` n<%nN`zl̋W\b3Z" al0CnS ^>pv|vuCe!7"Bٽۮƌ6zH}R C΂`̄>=WJE4ҽ'v!UF8?OO[ 'aUc9;;LnJH4ͨEix$odoW%=$DI\|SZI"ӁԒL$S3O{LWikQ1X;pb(PvwZOxJ/LJ G3$feظFؼ`}-`A$jİLW2zԪ >2CyH08F]Dmc LAeug&$W[zk0\Ŭ^Fr'|J͡)Ug+0ր"7Ulނ ٢Wkb  5V7`ʁFAϩb\8.U_ʯ/ FZQCiȿ{^džH)^[U'MdPFC+eD8#س뚟"3D>`:)o֡DVӲ4an8OjgR:,;l'q/N\ȔjTx~槞#ۋ7AHf+kZ}H0:{\ZxhDkdVCV!.n8nP-Vb` @@Ltէ O A+P -s͗;5RݣcO",|&kJat)ɓT}KZA=`0Kjxz6롱hwuޘs{\VZy)w5Mh4 t0Ui| v$=.s:x9CFr>e%A@;Pd_p[qը4S|tң .8ŏ~4a#0Ekw"@pRaK[MK[IpK柂@U>DjUN9-Z4Q# dm C%Uԩ?cr/h3Ij9lYH9ɠh4@B*JMm[q2C"Zp*y,hP/ޚH Ҵ>,DK{xLAL3qc$Jm"̥r[L\x%7؂ J˃<5A0gytG|x0X6괻aU2i4+S'FZ13?˹$ZYG&/yݩGͯdbhζy9ad72Wƃ!0^ \Q= YRgZ%~1Z|D~fn,I exWU(y8!B߽hlvEZi2W5~+8Մ¯ u dQPS=~** s!%$57|څFGKͣP ([Lz"0m*ږt=`+;@*w/1/v:ePl#u(YKBa/ 0]1T`l& l&~d{)Gl>7Ad\ICn5e5 Ylꈙn;1]li\4/ڹiQc UXǶ t/@ &p߸xrb0V:ҌIH߭fVk3QyȆ7qX YW֪n97-Lp &覆ȬpC]XM:JMHbB&A9z_XKYjcc[3$Mpn?n}x9QG& W;R-cڛ_ x8("]ϭ&fFfx̘6t[.5̀Â1=݂!Rb]F{F5TѰf( ܙ -ª"t@*AI~oMFm` WB#s* !D=N ΩC7 }kS@\Tf Ɂ]:RAl9vحfrE,̍3ntA<$bo_`cIIeoz9#Uq%˒iASTcڶbHv_̹+(H ӈCT!E1silc#hi0[[NKtbLLdD{]m+vľ}Xa^[}rtx9GI2s06jXhTNoqt F_ _cR؎#d2lVIzF9]>yiM0z6Jq%,WHs9|:2{ ˢ0RE MZhUhr5m*ļXryM?Cm,uZhC1'bIVSf6s_3~jRʡTmx%ٛeq[Zak:#f֑ie`*E*y1nY<)~FP K?p!fY8rKY7m^r>UZu.gf% jtDݎ%X2c,2HR#=0E$>pTŐc 2ފM%{/EwCPm spdVHG&FNbG6Dx$?0O2X ¨$gf!a-\vM~ D!5HV2ťɠp1^)`<79iw9u c=1PLf ."Oh|wIP ,4(u=p:WiyTYcMuS;23#-I[ߌOЁb"-TIx1B c ,U"4noς0r1+D5PL$pq9}gA/Φ*uY njtK_hGqffY>9$'f4F n>{w̨G#t˙|/&=:bYxNGO2)j_&`ha ^Tx~}9 w`TGJ` ;sw @g)ʌF@~w%`)VeMZ;KO%_ng.pTʖwMExgJ?0k`daxKFOGKʝCUjACf9OДڿcD|AuGܮ&imfX^`p.Mu{π5tQyvFK<]iJzI{+DBfj}V"$fx]v=Œ:=YZP"TFCސ8ĹS“ (YW OL 7LN@gG,ya;k>]yFy V S!&IڨYz#;YUPu{256g\#YYEv\8\HzZ)lr1{g]{EIhuvtUeXN1+`Nd%9"l^1'qks ؈M>$8wWV<@ѐ=eK/GؘSUiaz$c8M䌍?&l+he|9݀?Ujt2yn;"f.ܣ+ *>F@twN¶~V#/]N_3K8 xTBl,ם+MMYP'&6V}Z#r 5׬IΝjAW &&I8=WvtUp5()֜Ѿk|D"8~܌[mTS XU9^QU=@)*]КFpe>;dM.qnrrF.-f0gji[o:)frI|{Jc$O{ibn !8K+äα[7S6y 3E^:C oD:>}1 m]*>ΐaYs?O)gΔC{@pU؎:NM`bw W`.#D V&;XR[H?y9")9K=$6w gO@7=ӼW|wŰL5H?{7 8eqfLKjY\\Jl`ۜ==ZNh:)|Asw˧+Z.ILi^Z+S ༚fsڬdzM[ J̒- Q6#טm;DϾ]TPSdg)oG ~ֿyb$k*xiĴI@웍!f0lg.Zx5|K]{HoY^9y-ڧO;#e.NWz}%N|jO /NIKbL]atl>Ջᔶ-(> (p^YF~̷Xtb+&K,+?֪^oxي_|շU6VW_PEۼ6kW7{^E,})Z5 fu\e 0'lNky8kaFăe^K{uW/OKMȳc5+|FLype仭gA^]AK]?_ ԯ3aM{*_.v}<'mRy'[ӌJglg*s;o"&#٢uʀ8e=`Sx" 09U:ٙTPw_fY?4Exr!Ǘ1&R=I9vcl8aTʛ!܄5?QD@\)񼖽GU"ÿ3fl^]n4m~tѴ |Oq7+CE[de 5ځV8Jo+˛ōR(̠`U5iK3r@.8'Bkr@uhwIO@!$H@e'@~$4x\IU8p^[ 5-C}_GIqukCmabZ{g/Apgk7sl.[tސ7mW7S=tfصX$c9o>yT&Pd=34qlYeØ.]|F/!>Uon6oV"٢*@r7pIiy;m ]J3rO8Ζh ,rӞ&QTtվ?BH'aVse~ !ПvmAr ޵ncFrM]j0u7 0/{j([.7H?}/cTȞcciܝ@96n%p1d<NF؃CFc̕βQ РZ9qD1gU_q?$HxY5m,HNJN˷1.&@ OIf?ȈN`: &RS r6]EFvb1[SEbL 3n2ܥ44 ȱ¢\c!h Q(@}"M(hʿxQ zɹ Yif@>9G1O0&+nEHixWD.bEO8*OF#%5g/;9*!'S:MH`. 1'Eoq~KdhCCG7I_O'=6޲uA2yݮayWZQ5`ݙ]~N9Hv֔%* +Lc`9{ }<&%eƀm2Ovk{ SilFJى혔m,8{yT hddPVa#j$wSN-KٰOlgzF x3XIFIW2w_!bV_ Ws=j|v-x u-Q\)<|_7 ?;8 Ne C'࣐ȩE)QH\yfEK^U\Q98fm}}7L=g q A<π10sf8Ox/ l>38VsA#<FB?R 4fY)P ̤7D$_+LFXVVQ:1e O\PW|厩͂E0ŧc61B#;IzeJDYFjzhN!B۴6?]y9k~,_TqNg B,%'M>-/ό,œp:J(*?^1I2"u +O*qmI VIE)w'5+1N,x Ր[?(|N6Ĺ>CՐW!yI+ڥI&)佖5z0Cojȝ挬&>2o%uƛ*նW5,Lz8xy6thHd [f"ٷh"I^RK1jF&-5=L3=۰% R-)Qx$wY(0Aˊi2 b~_>| m5]~ߟ-xC:rˏl- a/'M{Ͱhx›9ֳgsg3X?ԟtV5棭NzAcX@U8 +)uHS\gmb6RwѾ-4l,JgքPI ی@͚/U2j pojxi@7o{[KmB GU_+NҢkvӳPn5 ¼TQ'i֑GRQǏj8ƕVH!mk3:>r[K4 _?5*~=q*!:Pi%qg䡼C724K,ɫ+`y9̬ʿ!Ժ2 >*+Qnb`&mEFrj:f}ܹx<ٺЕxP^svĎDH=D2sPޤ%#gylџM}vi U\7T uvIw6CIkeu( *NӤ|@kCIU2)&~oZ?~ͬea{Dw`.^/\f7X@ojd&F qĿ6cGԒA4göXب"̴jt7Ix//^5N޴3zl1FUvV4)/00f *fVu̻Vc^'Q˳;k]nuN~~+H$مEw)^Tc6w\lV1(7yGA ۰e T9#Hz{qKY˳hm9V`M A C @q=ی<+fں r]ISty]q)Ќq2{!nL/+~D$5e@KuAHbdԇ%h"j2u=}wVfe*\1(Q0W:#qy2*&xG2+%qѺEӊ?qeQpl>LnČ禩įɐ6 +2ڋ7ƅaWj'zi G M7&`wL @St~7dnF!HFS2SgT땷O0Wj$~Y뻞Fm^;g3'Sϊ &!˜!@u)M>t}ud7"S qd2^gD4OM?4|cP4!ڴ:DcT!:%n&7\q/x4F\#$O~ynr}5+U/iI}ڿN2|ye+Lwyyz;-@$t6|J[DHtS ^T~$^_g٭7@ e `!sޏ["y16 t2ɀ[ EMܬ`;YSQK?zw>ղs_U`1,i KK?KMda" ^#o6%d$&˜: F}})䙩UYR-YE)H9~!mY-سBp%WKp tA0 VSj*,8es>.z ׁe0#6Ag cPfP~4QUeby#2Yߑ8%e[yYJ`~aZFU?A$gVvumC/o.].iׯ[ 8;>٬T{"ǫ?rP'ws!Zd68R0pMaD pڮ8T>ƾ euؗALVvuJ<1xtSP>O"" ouW_Z Vza SG|k z2ne84CN6.ё5wX`HWOL v=NpMNbZ8o,Kٍ6:͑MND8Ui cDŮMhCz0%M4*rn{,h1-~J,:l, :* 5#>k9t{X0& >&ZcyU2Hkqndag12-bQg"0:b;A:D>@ DP>-[?imj\oJD1>D%jo<|ysEsoN-lv*; T1X;YKT*GML=X{(6f}۬͘qL@w.cęt;u4s䎹8A!򤳡PcD6)Q7a'/LjJ6]-GRbtuGTLU{R$U9hu$~ذp_̣4@ Df!8t5q=ϲ/Wge 7w e[q Vz]I;4DSa6; `daAdgmIS&rvLmFV.!N2?)Wt>.q<>z{r|vݑm(U,۾ofSb\Z N] xc iY3\Ej p"VҴRMswԊ3Ϟ )=x Ije_jp2 p vsޓAqdm]mZ[ >J/ z"۪KsZT޲pzlɚ(-^\4{V‹طkk/O>39EYJ)|s %W y5{ {a`,=lY$;"w9F}"[߄in qWIp.;#lufѦH8^O-~"1n~O[[3dQ F^A.-B巪䉁h\ XJbdO!`]{m(Q^gpfNQs*0^W.5ŷi-7gv^b6H{PCF‡CHVؗE.2fdkLWm8)d59Qy@ձWX3歇Nst2B&I0Q(\Л/GCd*&$ {?R]ܾ" ? -)l·D|u)GK{8) }B̦nZj>:a 8z:{?;zҽV1qƀLmf}{4n`#C#8Öx1:In(kV,1d_JFOkS; |Dmߏ6et^5I21!PۀBo=m6ay#ZQcS&:Dve,m&Ih#?-PeE!Ĭ'FBh6E4b0@[cO+pAhA!'T0M ~'ߗ-4xbꉅcG쒨Y,|?Ph'شhf[Yq_i&vjan?yztfQM6ر1f7| 7` ++ K&\x͗;nψ|<`\VDp|&ǫlIBEY&Inn{~d65$L&i5쬙WH5>5ְ=ÇZ-## ' jpi+~x}?GA+kP`YuVH Iz㜪WSާpmSӸq fƧb@)wMCu:g01iNKD}xH &f'iUa'iQ($cvXe;Mt2-ص' Igܡ`Q3fBdN8QR;hl#$"1.h$I/6-KC!bj{%Tv3 e,$Pbٗ^'/9Rh(34+N`wdDG61{<j80$3QGᝌ9JSvD3Ծ7"l=w{VLbq`$QyȾw,^!g!C14tar a'Y#JkQ&n@oˋphW HKbA0Y!vҶUKSpe/]Q@b7-o6-u:ڼǢ.@֓_eb u((mbs.7&k,hZ&UJQ:܋1laM'jM๲Q 8^V[;db:|lܾphЋȈu8㭓IK0Q@,z#Dψ8.ƤGRzz 6.[ؠ9%X" #@6 ʨ*ߤaLl 9!e>qN?tH&4ή0IwK"|=҂v,ʐlrP3OFt$Ib9!辟j"8zܓ oH޸ Ĺs ݹDHoj+ ## Y/!J*ICܠiʉe%Ԑ& iJ$X tb}99J*|;'E?8X϶ׯm8"o{vAyB$"pO5챮\$ÙH%wjRr# &2gA[m[.mM埃Ul%2:!g^ 4^3˾bYG]뉆6J2c@mV' h:Ў?4iw ]z f7L y<\DK~Li`u-s+t dQuv~SvkὐD#o2%̚ Y7 Oݭ=gcr܇r]bT|k' ~`Cy];h34`2K/eKLFhK*N̓MN |(m-|6JIulCDW1?.\K@ (@\/OXNV\YZ3Y g _YްWd2ep`wP0! paj9i+L|`Mm:$UւcˡR<ϠUV:J r mzj&G:cA{X~hOtrDgfΨ%X5X.~ll+vtFz) YjŭWi80d|>x% vKQ*źd~:4R>]:jBG Z- )`jM22x~9$p 6cC÷ TσiGDxHFz 8X[\p7g{_{쉨d;6ik'OU8Xa^B7S-aePqÉ`~kcgtɓy[#5@!GC(^t4O2Ҏq{\υmP?zA<=]7U4B%:m_VM3[Dpј2"Qކn5,cS|$M~1N|͇'3oL6*T[r% >PWIѧ|<^t9>H& ~%vckdĐ3\+KnrjJk.ٯVTmݭ HDt5\Pa/zìP}|{iFDa#*YgLb)!30^7|o9<*.Q-@'lU㴓GpDO0KƖ[pa'e #xmt'{ro <jd`"u60  v+$_X@Z9U?v@_~;Ti ilx Fs{\V /dlU@Cܚ8)j(6O3F G:sz+lIU*O Z7׷5q fyl٢ (N]C 3!c$CqcXK;eWW 5܇"m}ɢ3Scwst7Ɠ]b77@ӓ;\H<6]zum$+KLd⠝zřy 1=`IZ !'X'I$%b* X.#Hڿş6Ѻd{!v_8"v+sUCG5/N,12\bW|hn U g|~h-Oͧx nrliQ@oomfa/Ϯn ${2lf %'ƞ"u̇a7!L#43UY^dZJZ &1.1% n0S ˻D[W l=xJ-C$`l4^:_ OĤ(9 y(t""ԟsNrf)؁%-fW7TW˶ES(N':_'jk>` ȨF~ہyv Μ*L3ɉjTEIwX, 燃lů ? ^Ȃ5dkvVM9WkZ aw&Hʊ-1#VQ58Sx`=m;gtLeVE-@E`D*S.rDxk4ϲ5DFNۋ4 'D3 [2˫]`gYpv|vr=T}-eW\ɸR~hXN|d ?delP]/Ҍh5(2W^<ɠԄPd Ch83_2f'jUSW&j**u @9Ur6WzK̆T#`驪Vaxeƹ7">"Λ{*2-S@L"u: po9#7zΓ$˧Q ĵDu:I#NdʸVC W)zmY$ik]].-cmjDԦ Ry8$HyάA2T1+a#:._2(Pkon ].W8 yC$-gP)9xNcˆnƱOfa,)8`T\ז0hJaIKvy@Rn]DdXIpVeu%mPA9y^:lƱzFA_Ra>S1YP'==e(Η@45&mI 'PdlL> ^𛄷#lgڿiߓ|bhfȈJ94xj'Ԥ/S=ӝMN?jcb`_n(4L)\97#VW6Dm_2]s8Qwi #ZV^{~e1'HAm"pYP a'-RbHN%':M;ͺذa&856a1b"c5D:IZ |nΞii^Eh2cG(fZxy#V3C:Gzs Nv˜׮clmy~1 )VKnY{8:>G.B%5 ݄;aOri7*iU<[8+WBA u [ 4] GaS 5X:BT!*da%w|`@\+B~JhN$9Lkk _E,uq&x&%Q{5G&&2p S;.]|3931`skaG\@jYXhĬuW_*e$ _=7Dc촞{3e>#hpoiumŷh7̑<'MI=x7]=K;:'ѫk {{By7G{Adr"-UOd?lH1cz⮅Tp+@hP{?΁zf<$?dg:+ʙ/VFT/md&3SEj#!Rﯛ?~py|orڪ(ÍyhI=Ƌy ߀& LJ,г5h.~#cؽ}% -wMzQ?r2i=:5^csH(ˀjd~I ԃ&I| Hy>cU{BLr+>i6>T +$<\Lz1Ja`'x~SL MTs q{\+d4 s'pgmHYIB18h:]4Z)>'FfN'` UyZGl8☇kiy>WɆk`暒kڅܡ5 oPR#TS᳠e>0zc2TaȚnUqy,mzN]t58̗ٕTuהZ\{d2k=jEV[n(3Ĺ5'b>ף@9, 2! v@x5ܰWsI}ܺ|M7M\fRaYIsr&\Ϭ}i 8l?G7n7/6KAw6ARW+=gE\F_ Ny nj{3PV65X A&EW n)AAx=[o?&KվM%(0"2> Yxqo]̜Q倅ȋd  Ȇ*q_`e`"UCK[`س6aBg *K[| {~oO,aӇi LMw ֋ym:H9L)5Wӄr^e@I4K^&$6[tVZl‘zEbKLFFE Q=-/a0`Wt~~kxnmS|vC_[ODfR)`[m"4ɳr[dDfQQ޲еPvS^l A ^ynL%D aw>496-@{䛬r0_#o.=D Hu]ʪ$$` B*^4ꍑaok̜w.5\9T.;DT6u5?Gcz{21[gzI}Dͻ /=7ыS1bog bCɲ#@bޥD:U&<7&uVNnVX=@ ܲQ MoZI"$n%!㰊ohR A8XP>Rֱ l6Mhg3aB6=aK7R 6I|˻*e'{ 6cqM|5hboFi^C`Q0SͱX53=OY!{]-q5/U@b>!Ht]h xs՜@2(/40 _'J$thKU%g?&]69adXL1 !1{Qb`븚Nqm(8xqQ 3X{ =բS |=O؋j5K&'8z*|#/@me_dL&z sNa0wS yԿ%=6\׹*6 UL}VXM P#hSPU#\0 EU!v1eeӹ`ؑrCbRN<޷l}Ӟjɡ܆kmC:;K+SWFc Jm\ӟ͆72^>1M%W*=D)n)ZKrI}wvQBI70 "%̺0ÊNDpJrPoF!u} mڴlO> TcOo<}ڎ~>O($rA{?cV\*t~W v@bʫI{żɓlom`retQ|Sӳ#į7i] [k[:g[Q_Ë:<:H"5K$E@{-7%'+h{>;QdUMgpmSό:"7 ]Ic֯gmT!l2|5mVj^mT}i3zO2쩂.5i͈i4l`XўH= IQ3ok?̄:{ƞƤ4z6oxYQmf39 GJA?Pמg_be8z>MmB3햝7[=Ӎm으VEcm5S 3o0M"\gˆۭmC`o{ 㶁\=ANDէoXt5%ԘyF:Q>}d}9̍ 'sfGNA h*UY#ߝ@0 )bkǠ-N_߷=b8Н٠ blfٕhI_Ȼ mgҶgrIWrVOjmY 4Tdx2l]%+=E x|g:J,k^<ŜhaAMdhN ~XXJ;7ԛN:IDg8=yiMi"Ё">FrDΊ2DR,{#GoԦU@Ϭ0_EcNdqnCmv51`29@LU7+Φ iYmCbN]W%{ =`5l\-a*MD8@9gmʧSp ISw{=Vf קB ߷(EYǞ8-ͪ'̩+g!7n.PMY]D=1^bl~b] \I]0B0G!y?Ip@lZ(<8:Q4. Nu4b`@]G D`o¤HIHgs !WͰm3րy ؜1@&8G2J'$b@_U2 TwP}sy`;9jBdhcxc,qW)JT̽ζ*HY5H>XUpR>ںKYׅބX\S۹6Cm }p:o^<}߾4#|zXSQϠ!<\ۛʺ='&L !8v,D$v[@tEn6Veco/u`ʳ's1Z8ׇ9zQp[CiumݿGe~'\.yb2gs,lo zidX\XPrI/G#=ok^no z6LUB|>Kz ok4v8XOc-Qu (IUV݃. cNBfRY,=*ԣVBXm;y: >B#RwQz,n 0U5@88h. sfPhA1pfɆʙaC&Ѐq@w4SI:IL ܖw( swi@q[spt! ~"Rv) C@|{^RC,X+b:r/YʲV9hdZ6ggBm T*x@\d di9 `=69xQۑ AEtp4&'#VH2 E \[jz l Q˚k&Ϡ 0ȎE84>ъ;0yRq?:Qڬ vf :D&dYj&fg[?Pbp-JKa`yys pUDsR $-/ΙQC4ag"A -P%B V=xE[ 3P!u \LNfݲ d \ NDL3cI*n'i|(CbJݺ h'1dbO\vSvL,͵WVcuWOGg! 45LXb|JN`5Ib{`;l~nc$RH@cʬp!Ԩ/:m{նW4,ڧSܵ_uG:yHU-ѷG_Km=YL8!.<+y_%kK(^57-%U/LQ"44Vc=`SZyL~+(m땎PռiuYD==J~X]i?KbSÑD`u6teSFI$F^s0d8\K<ީV%Uj"IN=wܥlme{ZXX&ѳ^2o21f*e, R„DU!?2hN3UZc-T׫r7z 8j Na?n8'=,?4a5X2k Olca *xx(cu4#6r5&K$,J繞K0%hdgl\mlΪyA0., xv #\"S7FĀ䘄̓86!$OsK}754Ɇ]Ijpͻcg8w,mvۗGgE@\bc9NЬ={Xح&&,G:1÷q82L;1vx]kb]v_"$WWI e)Oi{kHn;rͦȋ(D5PIXɀ b Mm(m$^ߝ룹>̣;t}@4 o\?AS*Mg4ysz6WEe=vH><})g vVOr qdd*{2`zI0_Yf6ʂ[v]#>mwqJCIG*k/orOrCv>3>lw'}}'wgoǏh{[k9E>c>c}ıĉiNjb*Y#NaS%LZR; 9ƸY,&A`s{>b#֨dXhq>GzHQ.ũcDi7"l+AibM)CV,A7p8a rQoj#]'OB㲍fjSC XMc1v?U۾|)7 {(վ͗ej B/l-aVb:cӣc;ia:!QT{,}Q;xC?o.ĢQLߴD{9LzwwON 8{;vkg$0J~܄wb#?IN#*{ܚJy$OHT`$5s^$H~ e0B5A:gsC5Ǝ53SPydNMGAD446F"ВJbǐ!2q Zl#z~YĻQN/9/4Or$1A)HQL&t5]7Q0PC=Qr#8a@ DkWȞ e(4sÀ>QtFՆ/ ":M ;Z`{G,;/m"殮8ȷocZ*smFm۷Kẘe{w;Io90jn8^Hcִ!Gx+hɚIiLekQrl48ud3&%¾gGYyz-*;[L쨥{w|mrl27 [+ #]jff k bΐnZnfr~[(E/.1L`yⱱ6!uo7Ϣa[kյ8$j/ hEg&7d϶q1|]dA(ߊlobs%VU[r.ų-eL-o[f>4%3$}3OɎJMhfJ/9e2{RA=LVhik=MŋV7nت4uD<>4o,06)[?i;a ɷԓ֌e踉lԓZ6 ȫNJE?nę"mnްt*tN|~ Eϼo2 ȯ3zhN&m⢤ohi<"m$s/zk$\ƒ0Ůp[9q/fv9Xˋ$H.z9:.%e҂[5Zv&aRfVݬvV!xFPGߵG BY6eb 82 ]uCm-¬}ӊ{OjsקnS[v3o4%%B~VɞNr[&[uT=y:{w\(J>k1+_#"SE.7k:97~yf(I&.oWx7IT yEo}cg gˤ5iTM=V9+ ܴВ$؄h?z+y1uwŎ9∿LLmCxQ$Rpȓ S44t=ቋ;ĮvVe43$Ǿbwo/T6``iZUfu";yB!=ۻg?ShńY<"٭+p-[D0pNf  oS7N94mƦO[,b~ vy,= %Z,[p6͢d@McË)ބ^P.U+:'or13hĎXBO(Ӎm#vIp""˄lcsݴ å1Ǡo]Q-뇘Cph'_eo[cb2; 1ݷlaizxm(.H,Kb݈]Ky㈢_R~3ֿSW o* 6/巯il3q-`Do!\AUm&:H UiEWsJtiܼ " hQ[et٠\o(AiY.us< zd Wt4">ε 3yj8~Jf hA;{w95J='UM\zˌIx~2JUJDcx 9ܗfij briNX VA V4k0[HѴˑyu9zi0Bq'Z֣U-SKԾM+D:Ïx1C|1:Suڢh~`4_0H*0@mFFIkS|԰Y_ꔸl#X>5{tO'q] h6~YS" ZO>ϕ6R0dPӂD5~~n>|a.W Ηqħ?ih֠lj|/à7H_Z]N%R09S"-ʧ6ω\AF9^>͕`T!$v;KHa4t쏵߾M"2=.ޢVFUou_tLQı_kDBuFt4˧W\i:t*clcMi 6[# 9f="b}*2SlJ|;cڑoE7?GL4? @wu^Lz1ڙO JB/P4$d@M/se?oG1+c璍zO߸9q+;,V7HMsu \o0ovECHXVi7 ׮ Py$ە|uo@zjSZneD{ \ ndcoqEF{IG$"l (06f Thpҿſt\B4s5mZՖQx-!/80/<?f[NIL=l=*K#<ȶD)AE>{ɛ[[ ? ON >&`+Xɺ }?( h6ކMRc3?SѬGYȳbkSƺ;Jnw!C Xҧ 7k:90WmiZTiM.SH5iZ5iZ?i\ &gsJ2c} ὪĚTI՚TIշ"U7{(h!S 2(tS9JW!?/-4Q'P~c{C"ip~TǾspyCOĊ㽵󙺝Ha|6lb:jՙg `e`e}I#գmF#H=~j޻}I"&*Ȑ}_?A7?[jikgx <&n  #u!- @IX'}(f䬱_Er?#ȒAJPy%X߆$,/asH*4UX +^\$}ǝ:ObI U(E@>rehY[-iF *u5bEĢqp=$F9%~:{w&`䎆Ao$,Eu{8 J, t)aOBKa,)ذ~e1"~_Ͼ\ Bm{=LoV2ub evsI*6`)ÖCWß1jKwb@c.:`t$gp1?k՟aYGh }08a*Y5GZWĆ~B>]DG杰RVcu{ćA@!1%gh@N(LrN Dj2XM5d  tWAJHJ (<va'z ֫!Ğq\r'S?LhO}F{W~Kgh@uH<|1.[H!Z0~ۓջMu8.RG4!kwiFR/@cpVaY  =r\C5׷ Vd';CPnWIƎ '0IL$~t<\^_Wz:b7#~sSA a$Nfm\^lRČ; LDM&-lJ2i,(= 6{K׊{-r%~`5ޘLp"Ɋ(Y;N|)J{M0L/M5iF6?8f$E}.64W;SƵHICp$Kj,4#dUp\P#'Zq%v/5dcƓpWAg|y¶i+8{ydW;b7no$OhGKv Nڃ)k;璳V'KRs7g{Jh,^k=膊gBEyDCzaXnH8CLꧫԪԫhR*?".9)~DVE@iN}:eѦ?|(ni=ǿ49laߴtqkDlw'%w'הhƓf4(*&2'8h^æU uCP3Km&~nko{]Xk m+*T">EvD/3/T<ssCvNQ//x W/;3$"h  ?L}rZbUfT MUzupEKūhC=9_4яt6߭-tgdTW^fSx:V NQs#JSh#^:y(B?Pқ>WkUKW᳻aN^{"3x 1HRrbȠJ-Oir q>?ğ s`X'߆p(J2=aۙ|o _ 6Ul4T誁kak:p_xXi"i]%Q дHA @1dC7jhR31a^8Rm{o& lT'+BM⤛$qI#c?\nC3H3$h_l [;+"ᔃz|~ÁzDLA+eoNZ`U"=@J'ZhAvJ! r:ko~eR1MQ=$o$g{C|ƄU٨En$$^*aELkX5Vd]IzMJOpG9)EΉ{'z{N{FY#{KTjy8Hn7JQ#`+/Зozk[N PF#q,΄{ Hv2ǖg`Y" }c '^y;t>P?Y>*l5e&"ZB=PEfJHy-L5&Ǡ$y|$vUɃ iLM ,]MJA0L 1~U8j9-^ K e:ea͚dgno`0옜+i\\ MښqWA.A[_L)SKT:OHGQe$fA:#j9i~-ViW܆"B@4lüo{MGç~CΉ$괘&`tmE#:''O,Pjz$h7ASxBi)mL ]"І~RUۮ#-_7wR-ȕۭgsʥw 'llΪ46$`O* xe`:r)2ܽ(AOK1.4$8) aIágmZ8]rұ<1m-KR$YzbvqS@5?臱T5'y{xPQy6J V1$JE~MzN<& ߴSI2Ys٬_q "BD]y|3 eDC"6}NnO>ٿ"yiHRe2| m]> č%P̵m7lU 3}RGAř/1Ӎd i:_a 5;U:Ҥٴ V#uC=&"@_0H+]mz0! Aw+E@>6 5)AtSg0{YTOHNL]+kT7x.&l;JדM1 (*?1{433Rf=>{ e^WYdLĞ`KČXy>оJnK+NY]ѡ2{b_B"D3 esz%mb-k@WBuKlL\i%l68#XWu6Գ+g{ޣ$$=ݞGG -sGυ0=䉙?P&MQ=fskWf7ջ HX=CX쑧TyeOaB^ м&*|":*ƭo7ί[MPDf2 w(oY<-+Pc+k[<@, \:?q>F d.,u)>`0c1q (i%5 :]О$ݤx6AXcEc{WU-M~t _7B8j-fGG]m?Ĝ׼7IV!8rdvDH2T*AÙL 'ӈ> F j|j*FM쎌6g6NdM>0%&>k>m.uݙ92$QP)ӺS*9vN=5WJs!,I JWvs4-xΈ3cŜi0Yp>4ark nLm }PLY!S9ui8j]-~h~A.K4YqN"}g[~<>o#ǭʹL՛IlQ il\u-ho<%5yzqp|b\S2Ǒ" Nlrቴ^3cdҽ6o$܂f`5ظ2jJWK\t+IR`֗]h*0:z"J5xqɦg> OFyqN.LP8Wۚa,r:G]Qh-E!Q#8sP̰DM{#Qi ݎ/o)?$\ґ9nB6z 0Mb^9Wڢ fD sR,ϐPI *SI42l=.sDT,fWclKLڟN`wW 2Vfc/lXA0*rxCMds0`.EntR1kayE3-S?h1ӕN24LK_wbo)u " 9}bq:.Z:8\ 쀡m@~7 _3mm'N5@`a17ݶΰ6ZUIkUלb}r'71q|tvq_<#k^cb4:4 dw|9#IwYDyhݤrHʜ` :ot+kf}))2mqEC!Y%oiWpjنQo&IjݣC o^X>4ܣ/I!)03b{&!_"@ړ?Q8 TGi}$^0`NzzK:žyaIm<)3fd'oKj,l]YnZtzwՙ/LSeS1ՕwaE/Ἂ sᖤ㊦5S^̍`$犩:&~xV&XB2FY t1[L.0}*74NZOrkmQF-pl@fA3\ 55ng2&Z+d,h "ZqHqM8ɨh%>A9uᅩ[tu08/Aq.kew^"@{ONh_l'+`2& SppxXEqCPH+dm $媣0 6@*g9T4-AУT%G$)5=* Z!4YP0=(xj62y 1U/0Mp2݈x0O?%Øہڅ>mZ9ڹt;+A ͓m7Uo_o7V?޳!sq/—ٳۓgaQyM*Pk{Ʈ*vm$y[nۣ/k"<'9K+)"lFs~̋+7"~b [\-[Eeڃf?*4OeKdНtL |it}A F$<C_x 1kۦ&%#x2Y=8!&'#bdgMvdgMv &yÚ6s{3$89m#=\p1B}"$:=okwбzzB{"K>"xg˸СMzܡbzQЭ!vM3j}1]C&+OH,Ǒ֟9@.-Ha\Mk#I"o(3=HTWO!+*caz\.clk2x/u)-X#yvaM4o[~L:$4?Q}ND'vWꯋ".r?o˒B (#O*C[A S i.+yvbRt=L{Rs"oH "'EϿx@BMb3QVo(>h\wP@HŇv7e<ĝ[2O&/'үB:!iC=3eM+4~ >`l>Q.u~<*PcVoouYJ4-SOqA u.1"腘<=/#~ZOha.i7EIsZCH8*HNRD9v O}6_Qka+#X銣JZLGq:M ͻh$ (8l>$QAeq@lC6[8OI1-7^O }dQ9t+*7ߋ (Qғ65mBù@c}kcODkBsZdѡk?̒Mt^N[=%r. /roV њ!X3k`5Cf A節֖zbւm5t`RKXu0٬TLV#@6Yy7.; g8iFNyweʄ$qQo<μoc!| gZ8@wM>ΐ-\6o5gf?\ȼ Iy ܠ7dש4<0w6#ea\r4#v{ݖWIq}N4uZLv(j<͛9ޥSg͓R[Oа+A "-Bcƃ͉-I0n]wVe~YcمhXOtwc[$6ѫOa`{-1Zx^}Dkv5j*ky/JJJ41qN8ͻg?ZC>mxOԳ@]ǔ:e*ll?}ғq)H2Θ s4c`$ v9mj4,LvZFqTϤ.+N)VYh4>qcmsج.& E\|j8;xyu$)$;j֛z'i+gQ^#z;Wo~ lbMpNYyz[L͠$&r۴Pwj*R)?nڧC>*;SqxGJ)]8F$ZY񕵣t" taKic{0}6\jzMzMȵyz{&rVbx?C36*/JM?YIZ!T-[svU[E[5?yjlM=sM=sM=P|Cm 7cj[-g4nmgK |;^]_^rz}ڪ$z0CY,4ʃ7.ċ[ S|W+}|!i]c1{6yR穀A5PM"}sX`pOL|$1帞c- '<$j3=8cZo`;9i\7j!6"XW0ƹcN 3O> 0J\J&D4:%A: _|RyeRZ!kz0 "2_lxB ҄?o9& 1Ow"eO8+s1p ]=II"\!= I%ap>yۿڛ8`cGݡ̙vdglLZJ%l{iQzx4C-9-r4MĽ$N 0ża(}$zVM.7szL9n 4&B n2J_]L` Hdi $QE&6aƉ! m˸.6b !=To7lZX"/D+SdCM@m!&&ø7EM'Tm&hgt[t^ٿgl8?|3E1IM''44fVX1( مN3QTY1[1l/O)_W^ -b}QBgnA=9Φ]nl42j/5EufDܽz 9kIpMij^8nJ_\|) <&zu![B*dr*İ$KJۈ~ކ乳uN:jNsVŚh}|PYHG F>5IA~/`0>zmz0 ?)Ho|O!׋o6cAm&70-3$;t ;§,F\x/GhjeC;޲*c[X84uO,V8 :~CM)qs(xg^Jg> `F#}z)$XPiTDO[o, 20PgAY؂4%$ÞٌJ=uXd݄6GPVb gy}^ᒸfvVE6e8QǛfMώpxG{EԬ+Ӥ[d9pѠe,M-qVuԗ:'ǦpYM"d8iO|j2r][q813ՇP9Rqvxzv HԦ s^O n{ݭ"gǻ84):GR64~hZD* ݓf7f^74j;+/ qAo'Q2`|Zjva  x=oIɺ\ք7(d E]uzy' y{xwPl20'$+9ؔ}RC[~cRxA{~r̍j,- (iO5k|$$6|1=MaټX*.T\LK:Z8qz-#gǯ-K iWŜ~En' uUSGS[L0VNY1Tψl܄Z5t Hwu~x)ߋ=%G ݚ#Z!pW{y@2)GW=5xK40ĥߺ!۲E1,Q FA 1R ܔv[;#/~d iZU[J)6K<מU R84 .u%xX^7|yud)аtΘ< '88:DDNR0"OIA}po Ώlll>ٴht}@4=~|msZSuvrҢeGUbe0jy^ }njQc}Om\^4;4fK)rnw5HK3."842 !Ю\'K9nb$$c -hu%4n7wĉ kKJ-G Mͫ]t mOD>$H*7(Kh͌O^x?~rr2.EyTB7yoDx…z#$2jX 38Zb&~͙(Ad=h'2JHɍ+8Ze-ퟤȢG (DC <>2f1"N(PW3oz)1U??y{0Za6u=jX/ɻ*7+XR0縿 r!&J\aJU1O7ݩL@s {qמޮX?1(f0٘%Tox^j^6qez\dc6>c~\oO/O֩L`8c)Q)siUJ?ê,r0vG%QJ?=. 1&VNHDռ|o'b/"JWP-ats C9*vJRi*WA?ŵQR8ot0-Njn0y˩l= $ox g#KvL/,4:닕ald|9hmr4:/B#SѬ4F9v֙!q WXG ZD{J/tKa=[b4wMlfMlkM  䭕LPIG}ߙ)/33?``fi .v[{S gj($4㰷t {C|o@YdfW01Kb&]*!E}ryx|xQK]D>@ lVqz~W2ެ2nM*ʿ[d/!gZ6𨴏Zu7w?kl8yau/z>2@#Rq҇l dd}qV8CpTRڎa /{b+r:a鬆GCK]%bm"ere`R%qy xf1Z)0[f[YdЄAW>Qu~_Ra5ʓf<,4@B I2us/r&\{BA(-vJvIF0~vsF>.&tNɣy ~p2tGA$ WGF]t,f@Akx~uNzgݲ~Ow2"Jg#b~gCYKm[d{?8i`r`2ys/A54yoM9#ԍUACtz*pJ+|e=BZO~ B?#9^_:C \S&(Cc9}r{'Hnj7+{\"F~X~Mq<)2ko.e٤yL qTϪWdٕAeW*5S==!bKt~B\w,vR;Z|$pє]F7R GQ`IM’%2s")]7&;OU5<"SatPRm|: }ҩV^)t!Ĥ-%K4Ŀ#U.cTr8Qg2+D{Fy miP|cyʄ (6.$x`y~ =41f2avxTfV\Nzry!WTȓ:OUpjfsim! Y J* I~zk/Ԩ艐 *͘0XvWgOn^W9Ɉ̢O;&D{ 8#ueS5v~sqvd?tAT+hp>:8T^Wj6m=WCŢ0# 4|\ e(ZG<1CN$8 ֊Ԗ;-n.U]P>IDT^мJX'UOOA_L.a{˦¦6B' 2#yo] F-uelt?ݣCR_L}`ڋ"] ꄵrׂRoSHI??Hǰ ~2XޛOrO=Z-Fezy I CIEC}ڎ;G.lmg*gH\fEO,)i,N$e[&ebhϢv8xrۼ")Z2)+.Qýv \d=]klۀV]eyQmaɼtj6+k\UzLDniU1f_ {4fj4eI_~MC\_p^6iwWuk8হw5/76xGC^] 6խԾku߶w7" (widN#]ǑwBbN +B#nGI/N.|zvSce /Iw mY\{DgӶx's f j eq5(,P? \ڊ]Q[I 11|K&<+󦍻0 1B)cDV*QmPٴb̕/ءjs/yp &H7L!:vI֋DA,DL~EݥRHmwAොBz2݉txov~BgzcD%5Qz\&z5K\jɇ4Ӆ :u%'B?h25Vb46_ Hv@QbueI' u8Hg`"Gb)n٬zII<`<`CrwW}ڻ D)Tx)cLAA8yp =W. W=u u|kr;t:j:mɺZ[ Sa%"0m1me td7%St%8U{Z%0L3v8-:|]d:(GqK!( Z@2;^ғcm@_>QG`228"JhN0P8\}cjYIE;'܎PӥmBA;<ӈJ9%Uʗ(@c EI,H)JGOcb~nK&>%1,ߋhc Ŷ§3:w%ޜIVt'-䷇=]elH@!guk$DL';On?sm]1y$U+w^~ϼjYKN,1]E X$cc[~썒K``4>\PĄU{18lI\Q}N",.$FV%y:%{{dhԣnlzjjôm$lSJPOwAe5 XQ-Ը9^', &k a=۵cI_]"Ӊt$VjTmGN׼oM>[G_=!orbKC科Ք:v1T;m2E5Y6qA[T# %ߢc/ZnU\腼5y'0R35uB@w }_-quҐLZI@-f%MzU^(riWEυ|<q *rzW\{ Ie[Y5HFu]RIk俭 8md\"gĢ?_f#}cHsRX3?L72o^7:/{ۙR{Gvi;oon*IOܢ^ܰ0nNDbCŎ#-TJpYgF@`iUÍ_zM&6ږss j*9SԈ$ TU-ȇ9ƜHJiJy]-TLX0pGSaz?;GߩEQ'W ѹ!N\]V-f*_ ;L IqS2vim]_MR\0bJd ! D`c6elחޮ*g`gM{`ܾGBI\AgKK*ù76eu )3G 3Un{FS/,^ cjU_ Gne)Ӻ v~Sǘ2M%j'i5Tr{7&\Ǽo1EXbdR_!=t@pD"qj.C[H`4 c8 DOF4F;e(ׁ8])}YzrLbOzuq7 ;;("Kqėm. (etEzXsd 0߽ơzKU9? -MR!:?mɾW zV K$[bdKnKR,2Ug^6O&P3b{3"M HD"3Ho୬oht{a:Yw^r+d!q1?DŽa% gtXcUj_el^,z*٪\ûݭBRVՀ? .Aˀ'I9In7Krp)Cv˧~aR-rH95DNc ,HuavuQ,S6+GS@,?Ih棟IY>V}y-ɜӥat44T~]?P[ڟ2*:{qb2ajVxW߇$dpj>nǦMOVUg?7ucb_:_5`o}=k}A#>#IKzz8cxm)Hh, ٢f7O"&fz}ƒF%[gj4řڃ$#0A6]r'Aq A?/ƴ@]^wZ[?KJ<B~8񉞊?23zkm*sbtN9 !~p. \:Cwᑣ|V`T)#ݕX{Ee<<<}PO 2GTP``>$мMpU2f kR#\B#JS:嘤7<%qhw{kNTl{h,'v;\jZoRb&%2#aIݰ`5H#:J55@R; GvY]?h 2+o#(x9u]\^ӪYfWx@[BK;27U.>`mJ? 5Vѳd y$qkP7=N/?PSi'UDG,a/}ö>HM{m=YE.AFaa簽re.M|f*KqdYM"# ܒ'"z7zvI3a1vE#%ꞡ 4"d]u+ǖj672J[g𸟤TxtfYWA>cBfm@nw;})U@BhL&st~x< o)5-qgUD2*SyrK;PC8:3bb~D'<ᏊAr}!d7.HJ**UӅ$<6Ñ81Cͥ6ڽVm{ Pa?h@X-cp*,<# jhFl;B6 5nIIy1#5_0 u_Ʀvyr _$&0li~Ndg(E}R93,Ŵ@?q"gz& fhŷ;hҶZd`ɻEYCN#S`]Ig5x9^`<4O9\peģ6^Ki1pzQ1TVW)b/ΐCR nٸBR/+s6_P365̽`Q ߽0=sJXLgZJC$&(r==i:+(+q>r`7HC-kkZ5X[:Nt׶"k&Tk,mY@3$/h9F 쒔~Q`.-/4]}`k7a42[p҃s'(޷q%(T:dl=g3>v[:*9 Jxvw̼q!586f:,).:6ͺYEt nB4mߜoȢ "`j뤅]QOf1AӤc(A HG0Y%F25r|TMg 6';fZ,#T_pmMc(iwzKҹMZAwb,*PN4Mߔ7:Oiҋ~Hp@T̽_O? wi0;yI}*Mp&͍񬷆rw| YL^G) I?^^;U`*PԖ81vl#]V\(Y3h]Gn/_o%7A'Yt3w Ӡ(6FIЪvaWԈ\}o;k.aIchLІ*ii;yM׻h_έ̠8*,]gW۰8)A '772l|.ݵi}(Px iX7PʸnwQ 1:` PUt?z=ބvC_M%jY x}Drz.1[(v*˨x/UJnh[`3ùەG%B\݀}?Ac p 4z{zŃRW4K{/Pڮ:%#0J^n637i\TuIa*+wB: K];=heW4hEa*}dZW=Q@%YfG37pЯQ}/xϨ~{? I9{uGS9_ow0CyKa$_xOvQ3 HJkΌ X |'Mb=%ŞtH;G&}:8'uM,7Ke~6pbpa847 @:Li2u?o@ qxI& Q/ 1! Ưvը" jaVPkVPk ;xHo5tڷi=|VVt_k;*|vz01Bpk535c Q5\*/Ġдй:P㓴>$Ê*~`E #\&AC0rY^존x`|?$XL.%]Ro鹳Y c{ʨ[s]H-']X m-%լ-Py)os=5ww^{KDI3Pn2'\)tEv2^ֵHMib\0MvSW2 %\$"F@Gaeާ栤(6]UUi:tgZ::#d&ʴ:у PX>3z`e~xI\֬Ng';QΦ-}(Ve!;;|& T \ܖ (݇\s^nE2+~|m ȎC?^8+qT20銳x4!6_.]}=`$et[0;1le>%0}1]{TO >򨶢p46qrIMS\cFz=Nn{mܨ |w6uQ?Y9l.m2@ƗG+Evm݅d=qWo_ueqc>:{ᎨOӢ K ?鬚%t`d%ox)0/x[:\+~cUJ jذ|{̮J uJiBVm%9+s2A[wAbS]GkA+' .ӟVRyߐ_&]yl_.]$>UMx }DV n/ h$8ʣ) a˰.$4T.L/@d4ʂV ׄsRK.Y+YP+)sh)UfXch&ZD htbrw`"R0m70MoߧC\boc;"P.y' w-I;4B[%C|3MBZݟ'"kh%>!F}6A uhBNaF+Ƨ/l,A1yLAhcKr0eZ4^:pL U"cL8;ċz3ٮmlsDXPL TZ=gND Tꇒ9|D-: mcC f=4"8]^y쨨_!-A Bݘ3y{S#W'w5dɥ:6) ^"'ˆJldGaZ2C܎R?d[{ 2,ԇE#rC_G"bZݎr=Ed<#ZM+sM@8)S b66٬L& g kw-e¹GNqZ C.˦HչFxmXx3Efl2 \"s<2~\0"LJ5`,Eam#KkaCۧht}]4 Q!sd1p5GA^9Wbsc"?)Q|ۏׁ4:Bf)-k j<ڗ(JS,<.T$2ha1U+Za0i?1yUY!M SM:(\0uL,8$$ t4RtzezXft4dW۲e,QwuV#UA25'٩m K"] ^g6jG'C{gð2op[hk,jo%]'"9k)gQa J Rd~}L)6 2jW.8-ث hr#@ɣh\'Q.|j3FcwIܖ;rVaӇƘV@'4z<'f;)J?Q{4Gxpl^%IZ2q%ez=.dBi{c:ꅊ+63jEJH*ZS"qGjF]2;8p_C$$2''O" X ng-W!=ۚjwrm]aI:u,/ 0BKm9֭>@ ïv<+y-jnfÐ̜ PH\uɠtz1yDQGr Y[:~ڂHT {?fU[Book heH58 '< EI]FKDNRA`zBܷfwLyɇahqZ07B@Av B%,H'B&4Nt.j]S76/'?lbH9XT;(&oZEx)&;ύmz37a,}Ær\:\ )AcIZT,gmuԘf'}w;qok)t=Lg-m,냧=KX?NZ_+lIt*C&E;@jkH;RTL`ggmG:'(j~4!3d2 }\"< C} "ŠpQ2Rp9vR dn^&4I([Ч.۾ηI8(]9v/j)aC-}sF//y!zް#U~Weq&i:钎!MJkzܩvI5Ԭ+mX/QYhڢ@,* & I+A^%j2H} *1AA,of4RXEKJŦ[eȼ%9e*yFN-4*gJ*ەHw$YVdⳈscĔ#6I,iADEgEGdݑWjU^͈+;ĕ`ƙbP$zɥ.Jr狮H.\1˫$sK1}}RQ#p^VSm ƀj ƀj ƀz^!t62A jdP#GȠm ]{jP#)HF =B Q%x~sT0 9%l5tGz\]D!vctz#ps0ƞF]]Y0!BQ4u{,HtD#3[S&svvQrG4's|=#zr룧\d]p^I D*Bx7cg\&veP"dT 9:5Hp&2d.5gv:q_}}+%֯ GDr;_1ܰ #2<%# ơ @M0qE&қnJFM\4hdS v[YmWn{$ $~PlO[^џ6)7tNӤ/B(\]$/2gw[޾3@ODR_q<J;ڂVbZ8"R= Qƪu-iRU$4I2#2yEp'"鲂n"2⼥(S\U$51# Կwz@oo8i8kFȢ/J#}RoDž?Ru1Ȼ/Vn7pC}To"q~3; f~zCi:opO0b2 ]`Zhk]ͫnPS.ĵB$h&D؎/nN˗nxGsK& S%8A^[ldFfoN&t Mb4v^R!?78 o` YXj^'4\$~RëB[x0O7tEXrL/ Jcy4#GI?κ9- G-7h O2W'W2g$ e@2|K_/g+N~7Цw~J{$O8ˈ 1|0`VrV#؟BwBv ʹ9^؍ Tu}2p:hqǀ ‚VEMC͆BƗdžF>3'aCqi/$Ct_q:"E2op-]\UL*EEd#{wXsrT=CKiAiC z\/Z^Î:%wEaAo䴞6lRp&ҟ=ZȚ5nN^֦-٩^A71J&OVm^˴^롽]op饞`r'l }Pri|~tqɭmh#F1ڈF:R k V`<.Oo$\Jsg}97E<~;fɫx-sAvw*Ve>](W |*8L!RM1߼=ϟ}V/{de=ocZlVG}V qԈҷƋ2XQKhs9&Zne~1]?X+?%fׄ?qxDAng,6>S/:wVfo#τ%3ROFQ~/3Zr\ pR=j?Q-l.X~g>>bp>w>p:1̒zutlt&Lq8Sq7:ag [9mhkeCᠣ^mIz2o!hu{&lPf"R v)펒qCۙn1:[LP .O׈8*H"q:]veI-gBdϪkIu ]"_q0ĜEv΋CaN?d%_m#⸾*Fk#/6F4IA{VkoӐ9 S 9\juAȺ0(gGf8ټ%fB(N1} vy"^svayoȔS۱|Yr:Qk7MUeF"J%,ۜ]xUq@yJ$iRÉNq3wٮAJDrW mAlڡQp ӯѶħP*wOMi|o SPḯtȼ^-^=?u}pDJڵ#MnV%zX3 *\c /#!RCWK_lOпjw}u k^3ߙx!Cu OUއBXl~X@lUȜ^+JZE%X̟저oԽD;(O?o~4F}Xr 䋐3#3$S y'/QV7GU$DJ'+\ގ_>5.)UH?9@U/-A2#sQjYg]T7Npc#3_Bi[%awJ>c|']Ֆ[:/8ZE/LNi\>CnIVMSiIMbicCb* F:߯8->+g6' &h.@Fe0)F ߛ O2|Tu[< C.wz&R51Q؁UffLІ֟%{Cl$y6qtgU u!zR1,8og ))y|gC}Z"ڍۢ XG2Cx.!kqeW8A+&+lyA~2z&&€k4('_? =1۪vmr-=죮?\_"u>|VH՚sE4@+$* ѯѾcR<+Pn%P.04VRlb $`zF@c%Cl<~[3ʴm7[5[i78Ҷ Dݕ {x{fM iO\K xآ=dC_0nx{&+{ʱ.A3u 4d6C.Inv)=';nBws9^G39Ho6|01-r:ά{02Lx39V+e_mDU\u-:cKS0s+M _^$&,ߺIoXUTC#CVu%`]D`d|IْI)1>5`2HI7#I:}ўt{+kv_ 㜗w҈R%bAZĿq_ Y<bDC;:wMssԸvsV9f#N9DB4E]1{ pJ܋v<'> 3=bQ8!IhVۨR/Wbxz=)Zzm6Yu3Y#Bkd\㇄c2ͺ6F*r,g%f:D9f>~j8ګ쇲maJǩs5O;F%Kv2L[GH>p8RDJ-e 김]΁W沭H[P yEo /vaCD òXb 7josthɍ![MO%Lh;}qdjEޕjNUX*if-n4Ybi&m!Ll\=j]*Zk9sץu̺uq]jDﰲUW}L I3/Rf1mIq0a]I$2 7Y~Sp9U7A9D&ȰyFٚ('2)\b=d];s?e`x]Nh@GdtkνwP3ߺagRQ(7I. iE :qd8-9m"m*GvQ/š&h8yhx G7W=S]@5p򟙓]n ?),qry5YUk!2+ ݸЃ]Bst2RƺmYmOo:}Z*3Ɨ gM #2Cqa >eMI,9`C\lf*}WQbF H8=)E&~L0K@ +'Pb$s{؛p&꼑COuJKf#ܺL 핮OzPt>Fkswx%Z/L5^W4#m4]Z uml|ÁBmUEW&S>g1~UџKi">07l(:i y^ɌsXc򸗏2[]kiS/2DtA1ɣ*񤈥anQ%->M탫Q=P.'޾}J8  g brUR^YbuYdK8a^"BEPi*HC԰ m."ȨR\CyIhˑJf'mbڊ3GFR@)RibP0¼uVVbg7h yظT'a}Pdzp 3K't? 01Nht9qA@ە4WQ5@Dmz&C.8P-P8AO=OS"RsWνNgZ5TfpV<#U}{;.uR9z2b5 I䴇i a]-@#lܴIjtStMDT r.چ-1d{0E ,xѿ¨ htdje:W?4zRF!u˂_#x t sI+Ru&HdoLv=_3-kWu(҆wcse TVux_J{%J?e,L5۠,Qr]'TJlev0ه%Liجf X흜w&m˞agOs5Hb۽L-dҀsd6sEA*Ivnʺ0g@#5M-,(bQhchٽf!&d,tm Cg{洶V3q*B k6GF^TUf1'$/`F!qfR(4m Er7ox3xTל>A%jsOMwjZw:g׈X9i9~2 @\ Y&,2W UgZ`I qpᢼLV,^0EW) H'pM6L嗥F)̒]l*9Vq\XDrV"G[V` K3Hks]z2\!LCth]Ԋzq6ݝ _n\X7݋KaAAWEXXˉ0 (mf}-‚Nq巎 0?]}v$ _loW/S͗kayi^1++o&/Mf'B;Z2Nc,:XozDp{{ K9!9ڇ>=kXD&̭AȰ>?;H,>LI$1`@_sD S/B'3FE{Sx7М+-ofLEPV0>4~! !; #alT &8w1g/&t =F"DйK0.u 3:'zTT/Lܷo~jn&$@E!SͶ VSj*Ƨi}񿸯7- ̬@zD+knM?'<(ÿ?ASugm=6Ͱ5;4a:bPPIFz1k4ReK p0 L*L%FX/Y>JSRPsAFN/$p00fZCWUv.]HHHfsU!8z@u9Ĉ؜=8P똻[nA4ί Rj?$л3˫(q>iTzSr".닧, BϦ[fyt G;&-i?Jw_Vnc\$7ܦiR'a^ j &/.PJ%ViC7+Ҕcr܂;8-2Qw*gMQfZͺQ%օ dOiJ(Hrèӂ1#Vqc\jFE\CAi/ nKW,*#/4Yw\F0.7zr(< 3h5Q#q߶׷׷7>dVzBѓ`O[.4(Q|;W;krr9ܽh?>ܿ:9+G'^LJؓg{>K{']*2$o6er7H;gA ;SF=@d&<<*|;oH%w^gP:֤FiG>ye›U&00U@+FZ}20P8L>MV%D:P<x}0@&cfOBD^0KA_2i4tݡ~)T'aBlǷU4x[*~6[+tYp{G9du4EO$԰f>Dp4_$%)`\*{"l=tU-P_oW˳[/axJYm߅/b!&q,+A\"D'湋 WÎe$a=D#0s1PIŽ ^ /?x*DƘ&s{o\xEgAoD ,. dq q.H/QAn%0Vu{JmU@1O^=E4u;-h4аU)eHQ,A*q]j!wǗ(&[0Ҧ8oI )g"!qR=>J.9'G`& yoU€kg*T|scNgqdJt&1vL:q7vVqv:ڲYS^SJnV^/Y?GTPwl:֘U9a(|R3f PO&<>ЃA:f-K j31njb}~ ^z\# c.|yR|j-Ѽ:aq჋4I!ljL9f(aig >xOzs"S  p{-:Ǝ>8-D8 ັD3skK 3@3#9zce'4j|pD2!.ϳ`e:Y0\&pvWȏX=zĺn&kX1M*ܨ^:{yզ9rٷ5{AEX|Yإ&d0v֥#$#F7 S0X@P2B=>8eq{0h}i .T0[Y 6Bo?8ɦZA<&uɻ): tbn{ Ls:i`9dK"i"Nw)2gc"UE),JA)d\KE?g^Rqdr77/.\;dڵS܄Y1@F6øt2;[7cWeT ʹP[;.ytZp4El '`._$_) B1$^*_WU$u>^XDAFƮRhNp4a twmL~RRaDW3cx"3a&!_\ zQ@}X|~5V#l5vh0ӳZ42~F-( *@9aGwxY%x %Je0Єm9fW_Q8Ѿ#" bkE4"GC.&nU?}5Q-d۞ZmtŹ>9‘wH[yk:~6L0%qEn ux+C!7K@YϝPzD,dAryOr<0ѣIϐ8r ݞ:8rׂ2lA|Q2:M{㬜m{mL+in&_][Iwa. Ujhˡvˊ̖8q~2S:#_k\eD-#Laƻ6Ade9S rhH:y-Fld6/O\GZZy`#v邑)o‒b 6C%IqDE= VsLd'E/}G5}=@U^oG<^/5}3o4̀ƒGx?6MXƓ(ē U'Jy.ݪa(Rh0~&Dfxth":c(fdf_cKz}ޓ=LؓkZʤe6{L$)v]=݊p$$y pd[ۉĮὰ1ZTqj>urGJ<,ªUK R<9 S#tL@j@ g+ Pe(jT:0 Ld}tGV[&4ԍF_ogYhZ 3b,ySFM kÔߍ.*S8C`^l:)Z6@SIoNG)#Σ.NGI,f3 %6!966Lm<)d>sS459H.}Am&)ɜR.75n)*Q#%0Eum9bOUAU\M~/,)Ɠ8kmyR/z p,05 iҠ̾X܊;P]F$2P%׍$ȭ{:7 > ϩzJ9*z%qZQţ-mvURۨ,ڞk;edc^sݡ^ ,m/!Y|ʐhYpO84Cho\F2$(y Aeˉ7̷M^VKB"!A2)Z9+Hm[P\387+6r,bህ=a8`OL=-L*b[c/8)J|܏_..,: K||`Y_ZŢOqϔW \Xoye*?Z,ytvq5\ubCKorSN1󡞬5}0Z*}^"<| wUeqqnƷӤv?G6IK04l91yNq~(:R~Ag%mw-KȠ4CF_HKȠum h7ut7eVWK&t#1g[ep{Δ,sY/KܙgX1y] ]*wZǟa=@܃j/ bv|[g}[.5zy؁~\J/˂l灮$ZNY\䙣^ru{Sb5|mcTǻz4~v:;RL½$c)w)<@9{*]~񈳈lWJ* x]Y*STe%>T d]~VR7@teuڧƇc^.Ntq5T=ӡ k ;2/ !'`::p}O`uPI֗?( ))1i7Tͩ֨?$E(TPHTiR79( 8 hm\%7oޟ-L#nRڡ[h/Vְ bT%mL#9֢+lX>-ėS{bg.#VI{2Cny\)̞ u#P.B5pi1i1(P|;>< E[1C{Z'ԕ{sM7p:[[[;[^-mJ7h|vcH]~O$ wgEwh%Ƀ̺3*iqvQXDnI4|pJX$#~6Xèp߾;lUzLikYL?=σ ̐zN2az:.{&^bLƱNCf)hh1MuSV0שׂ4E2.Hc TH8R"@؅cLl {R C!mT>.~4έ*RUL꩟zKK̅-Ru/H"3*j1(ag2oT5G'-dAru:Gn#ȭ- )JMgPKPJr1䜙>8:-Ss,-+tU yk"sxE:HO@ΡDWḎѸ=¹B> }v.t ʧq|%T;ȭ?9gU'4_PM1ǪP9lgw6+P45P?!>N֋(L܍]ZB3*X"&,U? Ճ80:ir齜h죢Nb-$Pn]%`RWkkPSu2Ӭ͵J`n"L]<*)qWiӇ`N#ZCP'9`7qZCm<֖$_{>LA& }&iµ4'#[-dU [Tg<3=yx3 g4'-k}i}1-- ەP*@*]̚v[{wTd9qbScMJ[f}, %H >BTI{kӮ7,Dmϳy=϶?h'g/-@\Cf4^})@.Nk/2W 7Ktҵ7L[~N?B8KK WWBtuD*8$Ewfj ڦȹzbgkQ!ZgÕ8շ-DOxֻ42Rg㤃]Gpa%2co(,tL5z03Rq Tl-tQywQr `_DRZad,ȘxtɊbUNQ&q 4ugo/eb- 5 ’Q1G9UT8v lFʃh$_j@(Щ>Ƒ<[C-)k}@%;sJ@ݚ'L#5`Tp] x O2v02t0& {c8SH\Bt)|n"WR=)][5JE dq9 SxJ$"uW<)ZU9qMpנ7%~jp\vOa;BN#:&zF\0f8 4&s)V9?ɊBP()V>2>a>{2 VT}1T'0%񪧰(a$ez}ħ=|Cwz5/6rL{ T6sZ"RuD^w*JC2/Ka/ts±GJœzD@r2`>.>9-|^/9wtZ#(Jƶ35Rpnr]Ůeg2-P,=5"[?ź'7TOLmA^\nGӖyA4..΍&6|s䫙 #I, ]*/sǼ1MsBcM1GisME򹋴(<]#Mz܋E :ϩ+ֲs-Џo{A"ɣKHܯ~x?)OT˨*yw?l@m-/7sPeOg~j4@BAƳXF"!>赏/jl mIVH=X Qy_DU]w_6_ 4uug m˧2+Ά+.ήeu Dy%0J]I?M f]p*ZβqTYPq  =)0gXFabcА_Y΄^ %u"@rzy=;,SZzʅO*yPH[N*{o6.<w(7 klo j-klQuD$IX$?9/p^`[+3P]eUwWW""D+3ݢ^P"sC{,=DCR_mX}Na|%.uZZg{_h.t^mV+@# #iȯt C X2odSdԬ>>5;py3ۃj8QDZ(Y5¢ˍI[SD9{<]ҭgK/^8ȕHQNטVWza9-ލNkО󷦲BQkWXx~<Onw.OjXCD0γ:xqUyt8뼐,|\<=$~w/"$*i6Dsb8#OYex)VKj*~(<`pu@.u^[LiX)tx3wxsy#5ƪ m3)D##>{.>!Y,z͆B諄SHktcZ(w_n R͢Ex>MΔ @-Z;9 4i Rst'ɴk 𵭟x)LGS`k\:7hAM^Yqinsx[Un1aBt7WVèL}K3a**C 8sn9}jK2J6KdőMBD7*^킒ԉFhsF:L :䭗^K"A%nXUIrXEHBG4]]r2Wڦj}޳ospxZ*;"U q,ӘYўlDCUXҦSdNM[z "%XDt<\Y$-$zR5,m./ J&6Ni+>%C`6f 8v5kƀ(7f%|hiNY'V ּ9 5tS::*ȼiAIޕ:Umm/Bخ'*V3T*K@g!78L2rlL96!բ8pJ/nqxٚHT4St6BAFV_w)͘@3˘qAGjlΗMFRB=O;bL9HZH݆ Y4C T6c!jfDaG J@,I$Y!X)sVZz)?]l4 EL-F;*1foT{T4 ϛ+n[ulz>x >\(rZwhJѕG[i;%)f[qtck@XA>hq8?w۴V`A[F)̲?Zj(D@Qk)T_''R"'sk wʟz>-HDާ ؍^P&^,ur:/QRC,w=H-^/.YƇ J{ؗz6U: ޹[-p:3@`_"8q08@QB# 4q͐8IT"`rgTkxc@I_6'+2VTViQaB/L܉qԫÚ4'-&*=A)´;4vz*+%H M0EPDp9<p{CpZ'CiJRU10;a"F(p$z4t?6 o}n\YLqZc |d:6[DWSM,7U.o@M6#sk)~ h]:`#Pj˼'8o;CK@ږFutgf]}GB^:]; 9= tDTӜ”`qucWSi@cr4c8rƑk4;O)̲$G|Ap!/&q9f{4;܄ٙ_/UGOPp4@8K3?J {as@& =X5{L,yo|dMLuSrG9k`r-0%|fKKg{l,ܺ']/vZ}\#:G}\Zls舛f&[ǰsCmaR/RĐ?jT*rwR4hF fXF=#m `~0ޣa>è*C+xR tcyT8e^OG>4cOg4o2 S3R'}Wĉcv }oLOhug PKD K kG:**z;~ ؏E<Οp_?PQ+,GTtV4M<"b{TPUh@X@]V  F&*J~wJ(=ꂴ^73Vօ,Jx{T1<9O#"Zq/BT4D4Kiž~D}thgTMhaKmOdSgH؋.E CQy6R=L4T {c(4oVWsO̤BJS =b*U"Ii4BpxF[mn'QxfX1i єe0h|"1ucV_tQ1~( FʟIlj*KCxMot~@8691ncpьZ )7r!fRaz0b^K?glB<X:{l@fޓkQ!zl7Rp$7NӱūxTaz(nd#F!^٧Cݭ,M't-Jh:+/,#N~c;6|z>o{O!q!5E:9;=Y]~@84j48ha.Ŭ́ K%ڡZО,_9'㚳YC30:piѠ' NnG,&5XfgcfQry6Hcsφp JyS lJ.(ܧ,49@'Jɇ5YL8bY)罹[YcGyW47D-m{qMmHV8l@]wqgO@NvZά_9)YGHt nq_5*P{F (b ]41Pȅԭ5楺T0v|qEth޼ȬѽnH9P.H%'ddw!*እqL/}9]OF(8P5'; _Dt{c2F ve`ܿ1򖜲GUe+ 6z2[&tDOSwx:5ᆷoy7?s|'a'[)ǦH6<{Km^e=H,J!oZ{.8K ,r<П.1&i^4*\S?E&M>+G`vew7dڜ%_a2}TA5@n  Uz|{ X ɻ(W׶J1Q~,,˒a2++oyk'(#:h?Ŧ*]+5g$5Uѕv`'2!4vɏH$U cv%Gbg{@_{6}h<<vBbi\ [|E{"~E6; ˬb֚v5S}gyL!CdUbUWSVbpjq/tC_ 3RJ9}KB%$"h@]1=GKbuq*r, ,*hu>?e pMc4SpB*2q$Uɀ]#^fʺO )2SOdvQ$t=r<9<9S<Ǥ=# sPJ̑Fi-tpfgPYqkt =12=cgQHְuHu\qQSMDbvN؆k7iU9"AIFі`ҞUx& }~#A*M'ܖ|MXd|1fxqhGu17uo/C$tNrOaX%S6GM'9|DT:[oO1Fpy(Wh[o\[.:+"e#BP+5'8jX5 :*I PaϤ*t{V@U&o`J-9d}Q3ɉLg*M-lb9"9"-5d#%l8\CjS+ ?tښw |N=ʧ^6 0K oSNu@B+"vjW_Da>{!S,m`Yooh DS^ k&j F #a ̦2^x1DxK Y-'5/Z±DSQ@רRd! 1vم2si5:_p~<9{0O$74> O zM"uU. s5 G Q|b+bjK) m7k%=S8VC1bbT<tM`߮|Q!rp(8sfB< VVW=UQYO أ>I|dԝ^6cúM]u@GӒTV{w;'"8ʺ=Su͏D^QFEZX9R=&ĩ1rŸzS*a's'  ưf&Z:b2;>yRj 0LY$rvK¥?}ng%ϬXaݦHA T'񟸈! @W.X%n^9篽YTCT Gn3'zBzґ] ?.ӴGry"EjNJ|iWjk(3؋rxmqnj6!Z^}]#@p#lJG3zOnb܋GQMz?GkŶlO/D Ť{d M.V{ݛ7_wԯteA{u&fp V-$!DuL܃~7"4/e.4i ʈ$lnxs :Æ9Z{ $Q/Iv>ԘpvXk3&MWLGٙ? eK'4]#)J8t$|øI[ 1ÄnzNjm5<_OiaO19Mf걁"; MD@c$aɀPG͆_nӟQTE8IN;EIqSr+?`eWAYI9|9*8e hapf"(X驨=g+ vቑ]f"R##6x@(]IA 2O e3}t.ӥϫN6J1ckPAwzp2W6b[81}¾@"q&0lH& Kc 8DUP.{O93jgǜoke#e3ok҄w]8vbO1@GD'u薷ꮽB1ֻWr~(_!n% ->b]R?+u:mn_RGJ1`V2NfM::LV> B9}N!k3axKAsy/D:WȞJx?M U1HgEA~_7 sQ$[!+ oz>`Ui6 !AGt8+t.CڦY,x(TcIXc\W0j??D8ǡk"tϯJk-JNl45{y=gif|;uim$塷2>o oH~gkںv|,}t!?H(&$^}+p+5$ߪf(ȗ|x1Gr9U߿לa9sXx%mD0XZ a\޿\q;z{|:QͼӚř66h ?b,7>EOsFڳhA-#`Lb .m&NEFm,g^ahK@οcOl*8JCYV@@h-GoA#cl*iv`,`ʭsտXXvټ ʭ3M9K({4c|;Μ1܍X6"ϴK|w$而fx22˨qpP(`|I4/J߈ߜW. Vt?ا T/Q5im[~ ŏ<-砄 ru}eJWӐ|RP"hҩ?Ƌ /g[UaJuԦGc 4'JCҠIgcndypr_{7HOg!MopVK9{.ljD@Y7JX~M"mF6/ F7CGJ$iQE(|0#A3;לDL+b $Dz')/E/$ig̑8qG!AbD!榪 3-DRz|쏑"=ExB+*8E5C&Yurj£+.|~ç&hz>0258Esy{8Ѻpe]V@ĩ)`ꐨR~]bhqh0)%/vܸ! PtrmCL, ( WM 1- Y ,ΠsaE] z2/DJWE=@̹ e%-8:nU¸z?`7~u̯A7dss$49.rKpq(gYX[$iaN)Q#PIV c׼vlz-/:vYQ1̼NsrcK*f9c#]$HyWlz ~ԣ EO0Qsçq\s 99IB%xS_tr|ҊϭTD%SΤc+lp>dj>dpڮK@@=y˗_VWʛLt6dXL+[Is֣9ڗIHё瞓"EQ 6}Rd0Ԧ x*Pr7SυkJ2_fbzSQ5|큸aZ&3 ߺWw{g?_׻ާͭյP^8:;|{q?O'z|ZwQ#z \}{W`6^micy",[t^vnuj\DUk+kkUqi Ѱu\Q.P>}mB?8ީ%wGgu‡T+)Ǧi`\VD"z\_41W{g0{%rshL=ؑF1A.Qt@׉o_\Ztyݎ'TUq}. K6TPp h a {}oW5Ղ熼8puNɂSԝ>Nc(?H$)eޭv܇Cd?iϩ+Jܜ -b̨HفnpS͞L= Cw YR[-8}Q= ?5؋jW?z Ĭ[FaQ\{~Vn_I:K4\:He[qWA%%e^;JE]$}-V?(R:UG_hNܡfSbA s?@7NT4BrM-MPd&mY5kz?&z +YF @ P .B9NvĶ<J ̀~!lZGLB(#}Vvu 򙼞{ɋ[: 1dgQ_wH b3W?#$~uz^?yiVHnKLτO$D|> J33>?ՠAq |3eEþca}GX 1%P[NIAVWCoՇ &*L\Cp*~=n;-؉M̾cEm8H_pBre9}I׳[na>`ib31Uޣ$1̊q6t;+kHi&WvL#cw:r9ssM 6˜J d^IH/z#$wz ;xVL]4+v冦xspnEQaz+QX[:F^t9hST = 1Y8) T̾_NjM\0y208NX~ q7$I LH?XgwDTE :a;WX 0Rư=œr*;<F#V w瘈{41ן{|}O^? ^کh{)OX?-7f]zEq(^~jK'=Xf9_c:l <Kʀn'X0Jj+9Bd:t ~B=[FxrS7i8$"p*A`.! `d ~rÛq\GiMrHQ#PI2}l6ݼBW'Ii$9</,U]]X)ޟ%|)\~>IC ¡:*5AkѰɤ+[7iCMm$TC9†$4Bm_Wu!s/w..>9\-XgA?TS}yꇜlq^ϡ\r b31GS53]1RQ9rML 9uEsq#͔mrܲϱ=YOXN>.g5ق>ȣ 9RuFK:_K#wė^=d =чU7x_w(s3<#2[*uy]##'5Xh0ƾq,e`0Ȁy0a4G&WJ.S\uW7H9 j`.Q9ɉqǙc#ve4A!1 uKi;M~#{ud{tik/Wǒx6X-0g":f, pP]69D8燳(گ=fSe&lʶ%ۓ6r{"4xtİ6ϭ hѪ!,- PPf- sGhYA,w|r|t\6KB%r3d40ǸuJp`Zd{3O#]G7-vBy**NĒv7EM)V6lJ {<8CcBpQ?؍(EGw`g:x`;|y֑UADv*RHTZ" Aזqږ0W^a| \z1kϋ/ڂۗaEc.2U6:~yV:/}TfrNl^5FmuN$$WwEs&lUCM[{Ktq.hǦe>Ok^v02r̄%B%?nXY|9ן?_ cȆM_O*gE [ ߗP̡L%Hb [nъrϖUAw+k@qm>x m̐iwNS`벚e~MMtU$esW5ui̯jOmhElb$KXL<x2;D%BVp`N((}gpV>.?9a4\X< .>0Z߫V[T .ȷLN{ ]+=^:u-ׯ#Tj M]/P!$ɔ l:{XtͪRN^vսi- Ϝ+Өl`8T嫯vnYzQQy^p̈lՒ-WbԱxvT~9;;ygc#Έ/TMʓɇR*_y vAyÐa[+okNSw|(yD?9ٓœ3m+PNnՙΥ|hm aq4pc:6]h!AӾ͵*:GWt̵-7<e@4vu Lo/=bU37*$7ߒxFrWNƏts69nr|B&k̻CUsrsชJ2y&E)q40< BMgB"4_ߵ“/טvX$`ORڞo=`{n(t<:zTOT0A9Vrn\3 >lļsCivgܗciB,m(YUTn8@NRaw9׊d49i4ܣ)&|4KmjU5gҧyL=JރտUnlw[> , յ-"9"2-hVɬc6GI>z[0+V#.8>mM_5S$j'0@\`7N;tWgZc2+Fg?N9$dV?hB ڂ,y93# `qQ_ jIkCS|UA,|)W<ӂ Σ/eG{5Pj6̿VŸE-h)]7UQū=  `,FH[(NDt]_ ,rlS%zPz^J]GSEȑMqXFiT 9 H0 Ab{g"fDIYS=[@\,d2 7tE,lmPr# ԝjZ]鬬s@I<}s~>Ï܄!]nUza 4!bqć=ыPMqXp 6܂g s|b '.PL͹6`F,3l$lA%Z]75b7tI xsz֟i4~'3~?iV:'zup<e)6e!n!Ҳ~fεδZ+s3ν>;mąggomyKN|3l\wr*E6F8 C$R;c3aq:ޛ`y9Zf-YnN*vk!v~?1[ɭ_Pv,q g/@,ɥY(uuw,)2² `7T:tpwǤTR 7]Bdv9r媬k%=%7jW SDlJRV/n`F@jN;ooœ!g52]*MnxmFO)"Tѽ}tk75U.I1]ִbFO0 )\[Wtoݥ2ؔ&8w ޱ*T.& FضYMg*n%ԺTyޠs3{KmbUc @-AoĆ9C$TU$=ꉣwX9).|RC wMWoz*y, Ujr4p AͲ$|)! o-I偗ȃ g?ke<2ߋ7{yc6 Kxumuޒ <,gwBv?Ѫd=D Z')Ekm{_X$rhc<ˠH~Ϸ_h8)3e>M[Y3t4^:+6bt00j #.͇L#''q˞12:ppRP-Xe/rPwfϳYE )@C3Cun׃~i= Va3M jv8=nI(sV`f:A(Zj@B$I!x0<#_&4*~)7u&2Rsi;ƋeX? hBzl$'8"z1-ċ4[GU^~u}o10:n *CwAi0@pO]}g.pFSԈ10X jp&VM *l4~[YbGkDA&J˜s41_DMW;&qXVXr[16%|Jpnw>F/DziU1]* vk"{GG#vu.=\**+r`X-([ɠ'TQ5EkWoxY;ZX9ߒs/*>byUqc>Fc3-eG!Ϭ @9{)b p$؍6kK.ї+ !҂HDGRXi+9c #,4p7xX,n螶당*f w5reްړ^WBQioA/T[N 8"83> BJf=1}D'8S|U|5W1x_=GĢb5SO=a+nk <}:-Q|=Eijh]Xٜd2ĦP9VM EpkZQ;àw1?LuJgu;eU/QzhGV7vAZt0Dh'W'E$ӄ⪬JȐ&0;w)I,q+hRt{w,:ǜ?X|WzQ$"rW7bj9Nih@+s4h28 R܍÷ x9vCāU5W tpNGwP s[^^H{7T%§kmѳ`T~rLV+h{fkN%RWoj€"R_cihK8s c~R=`"~(q&fq*|ns/Y|5۪{xU "^9C&EMW|7*bQà\AO;xAܗ~#ٻ_s\loO̐GY Iy^$4…Afg|ЭnU krp3lz1áV4nzCX#b Ě@@uır]{BuNWdBl BFIv¨%/s;?:x݃"8%pCBVZi*~8" u孎5?,Nh=ʍX3^ ,ŵ-2&mJTl$ ̨HV3ftgZ_>BR0-uZ9=^=yyn:o_TgN}랜}:{gh*-zr+TB>m`DDPISHuqv~s%>;<_~|~$,u:S=( %ޥ% $+$~{o:5.&bߜ SHC!+1ZsF*C&Y]Hֈ۠mM{ Xp׮tLNʆ., ܜy%{%@hxɡtl7*QZt l.wxJzKːXyz95t<L2_6Y) g(>nЋ`k P. 1k-4khT~޺uO ww٤է1Z":(/\cQuhyѦ76нbn=wk%ouuyqRuX2w D9H02X >&pqso3Zgl,>L?q\Yf^dnP_#W^0=SHo?/a:.4PV]ء7_oiZvԯBX]c!h4 N^\G0Kgjf} h썲ymʑ9K2 f{\)=$t/i@A3X8ͣѨh*^Y=&ĆHԌPflZ ?ڏ$"#Dw#,zAEAsj+paӺ~AGFIFu?{{;/2xW ΘƼȓ^ߒa:Q#]"fe.Hޫwk&`wD29Ef^)LfsXZX%V""*U%d(ΨD![0x7tSS۷~LB@_f*G \&iWQ >dgW/ժwqWㆵM1H xo F8몤l=rg(¯Iz%ul2ݬx |lM43OyEۉOmѲx̉RShZ]cj)בV@%¾̌vQaUҚFﲥ3(Ȫ))k'\hhͺM|vl# ڴńYtl@`iQ}V1y"ρ@CB /scN :8¦#Z6Q[hP#nIKIB]IX8|mt7ܧ!UbjC[pڑF?Iog좙oz׎<6\GX6+Z$ٴUh㏿&]I/%5D,F(9m"]4RU#GcaaĻJT0 y7V8CbйlLIo4 @VaKnBp94G137Ӵuܣ鹎:?m_:ك̂my7Dn-NP)V mKKzyڽynAO WgkzQ&ݟ5VoҾ.&[wC0̔X /XcaW>757 zԠzʂ{\wQ$8]Q䊷ONpGеa*%@Arz1;l3e~O sϓ4)}L'.luФ^WLaj@+5ni"ƅu7Gw<`zɫZ秅YJ_M o#=aэޘ!z6mĊSVXEEkgQś`&"2 IBH|tpqzp3ս羣җ0nW:i2η)c2ߛ=#u~"ޙaqN&ʔMjڼ 'B蝇s\& j ]4DkaDIE[qHX 0SlL_Јq`:M6/~#10\< r:NC6XQ0Pψg5cK2eqm3.2 L: J:M#-cMݤ!sgf .;@h`8|$w5zK B`~Q TE\|!~ӉX%iT~}Dqt$+:Ikie^ۘTxDB舜R=$]@ @z|0uS/!bbm_X@aWB44k e܏~tzO4ve)[^>L>: 3sak+)k)v)8 Ԭl~8덋ј>Տ=g 7Ė$pnzsUIu?7HI6{Tq"*7'fBB mHjGǢrG{1%񆸺ٴ[Mrքӻ @tmxXVRԝWS3&E ;e(#r3YWR8E♀K2x?oS m=x?3^%Iy~A ƛ䬟pM 8,{4j9x=CQrQ)f1iaCt"Exu LRxAݝ1g9/lZ?!:k4Oih~G#:U. \Ȧ_<:3DdL+t3ʾ$~0:J q k,“0buDq/_#n+'$Q8'v"HvIm1M"̀h^8_^pW؎˸7'bp)7@;X[ϋG]nHJg6wڎ dk@#s"ʀnSw.H.%sY"vpMH$}tW[OV0vh|jf#m-kVH㟓}gn7-"} xe}ɀLOyD<:p MIc 63mqgR8-Ө~gKai/=bޢ;+H?>[c{+߸4[>|vyݶ] ?d7XZo}A$rO9uհcFüW52 ×RFBu̬KK:y~k++C4

 qD(X8Z]l+1;VL*lx;?Hk%Ì0a Pᜀ6UviV1v|2$̬Wa (e$+d15*Dޥ 2cHfSV-ب3&8|y2˭4$7]\ ѓ;\7L8W [ȠCufs?52 ӪRV,8M0l@{U6Y*by$xn3eqnMӁ7@hMi#%v(rH 6nA$F6j5΀QhGsة6D=h-DT<\ |Cd9:Xs.0TU| T ($W8āBS RCjt5XzB Z15?3Q1CablNxna N.?e5n#hW:t(d=c[W4i ]@(U\cH0#Aݝ!- ]"O%SGB^r.u_DBI/.R~Y0ZGQ밷nW`oc ŭ&\!iIgfw.!^2NW33m5;@pY![RGrGAd ;W z2#smSb|#pӢZŜ, tHĤR/#WQ1J܏(R1低޵?ٝ7zBd["wzpݣÄ(9hأ7Rf]4%x:| 2hDmSʋqE BC8ℊO46BqV!GgږF;Y-UBWdqDz I EG0?y2In b]*O99ҝM5Hd=tt: ?j\ވ 78=^1McFԈA4)`bǩ.1LH.R0/hnw]I QHGeμ&AL윋xbOw! xcAF[nVRȅeꓕr[-H)\fq.iAGo%-dXN2/T5:ʑo&؞?1.%ݟ)1&BeO-#f(Ҿw,Ϸf B%Br܈+w64i_ F~ sAh[7ȣioHP ~՗˳}jʔw_ۥvd‘}Z"z->\[K 6ގQ˕WnvϕZy| =hc+mNъb0^j5CVf5]6O:C_{XH2**3o1Acz/l+, 7g0Kj/ k͠QE>`n&쀠%a ED{z/h#l4a]d;UQ\٘+secl̕ogS/b/ _#!֊X]I`Vaۗ`<&ctf@x|}X˛m|FC-6w?j *wj5A|i<2VHGBh8* КX҄&'+k<,o+,-quY& q,LC94Xc'I8 cGr(@te9済D|KRya.g ]7DKea㤼`]Ha#3}Hm 1*l=I1@Vydg;-{7U2K?c#TZwS)g\4P^9rAgBHoWԢ7fޭ$_ܿw;dm?RTo#ާn'I~ k7[~f+G95Zp]zXaYKȐ7XcWӃ 4-V)1TRymNGՂK7'M((>tYxI=`]m@);޺<8ޮ#YɾՉLe܉>k:Rkx]ˆ1 nQF5Ɏ[憸Wbo[tGl_8zH߬:?JBF<ڇӸvi@ 劂򕳳cry~Rm;d4κuOz: 'UeH 1:joB U4)q =|K2)P6Gm\I=5et#lWNT#v,G}4[ 7AyS,#M=r "gj3Evzw^D|Fjl[؊Rrpr>kҝp7`F9 eCn vPK!_(EҒހDR&4tƘq,oX<U;JiZ$PQ2m/_x˷Me>5SQJ,KbL` La9ֹ"-џF^B13V{S٢(<@4D@`[uHKqS},T(c.‚e䌘,3znS KT{?F6Jv?qta7nf 絳*K s!10];i!א*[Y:"㡏pΗΪXVT&e *e)MölnW0f ա2VxxԻz }B* flہzJ꡽2V_`yMqhzȨA6 8Ml/E rF>2$#ȃ-WE-Cz,fRe٢>R~ h=G?s4 (hY,n`}qЍ}в)Է b1 yfBd oUM)]G2e r*p$P#Fc3o16sUjB'F^oe2 V?9WufNKHb#y7ux>$Ny+2 O FcqhlěF~;ӣmx00;u3t@b*h\hDfVZF"/W7/в u;pZ9唉(Ǻ͕O0McyA]k0\ NqQHZ@g>ъfϧlH@n'(K=3҃VK<êE3˜J8psFV=F!)uoA1{ _v6 ݵLT@L|`25F'{N/(Ͼ,+71$Q  =F4~$oB}bYAl2̮2,te(}/ S3gi5p!8܍W1\7|Ǎ y )Z f8~ߍhRO"""#}BMpTQ 2Јz,NrByݱwk'Vn1QIn`!gp!ޫ;xz9Ui A ,.h+O1Fj<ta; + Peb YO/k?<3pR  us}&wI[[Q#jl87JeqsTռYa6+f٬0fF~t٢+P/&_maɲAH̱U lW$<+;f3o<<^twj)p8T0l:1mMcs:k]s NjJHTQiJTn!q5gmF󔣈1?dAHnE&rj2{ D8aRV*gxڨ$\4V:O}`89:F kM6M#UTVVY2FO8+#2Fd6Q(ܥY;O9l!J<SȭLdBFO*.Qwo_*Qagw1pTi4-ApLAk-{ur 3W}~Sŋ,@ǐ"A} 2_.6ܧ># : #2=>#oK)$[j4]\~ݍb [d lnFCgI F7'~:E"LāTIa:UʈK8O^*ڀ,P#12fݑ ,lM#{KGCz?lhd>Zv۲ *Wj0&٤PL Z@03} 1,R=QPx9=ehސՌ HWKQ;Vxq^NOp$Sdo܆?i5oeZ ts|hyo)͖~=e B $}zB ɨOJ,g9g6} Ust[cd}Ҳ/:^KBhm7!#lgI>yg%9=ÿAE)QǢO>1[#gk=03rO}B (S|Ҵ=L\WE8ELKm% ψu;" nH7;k+qcYpI6c1 {{/' QcslrNVG 0BV64;gތ\%m]rSΡNi$)㟣&ԯ1"5s'7s> B`@irK<ŐcpFLMKv5pem Lrx!2enE^XrmF'+d6|2Jd=pśUQ{ z~RQXZ;n5.ȡ$tZ=^Q=U~N=+}*8'>kJAz]TFu1, _4UC|SmuMѦ琗p^o_9 $@e8 *4k%A%Tr#{mdUQB#'e{E1!BNhW4 L7X&ʝf3aΰ:lE `IPp oDinj=xj ,7<~ t JK?~Ʊu~ϘIOؐ+vaDYZ@h fH/֞;3u ]mwC/V{Rd + =F~G8 -*$Uv en8WW.ɕ)t0B$87MW]?ң}j,LlQY'ͧE4 > paN#yWL"?qÙnN'n[Qv^ ཇS&i7e6b*8g`d 8MA-!t IwZ9%+AUM3rpL@Bpz.!p9CBoA 9Ȧ3-gjTxwxu'm%\7LlFS`EkB~Jfx_^_K7/^gE@ϭv5=XEϭ-c_{Xgl53ZgENI{ ʚMIy_%%>H ^@'$O)pՊĘC#*$|,5dݓDG-w0 5Xu˚̨,0A+up'6)Smf:ؘrc^%1Qrx!]c*ZmȢN,2Y:v3L.8-ĀXT :h3lf>U-=<.(}iNB.YrY-l 0"b@,blПf~ Bm>~\eԟie>bLۗϗAtU6$ %}Yuc/REB VR¦"q4}gx2W˩$.1 $JY*B.n}Ի#kklR7zKܦВyݠʥZ=D~>cbI<**fTý8KD-Xҧ*6R-=~R'{zͻv4Yjb]*43+M z h ^=*Q}fb`^8:?;w`imY_mh|`wL7G>; kYYD[%3OаT>H*!C6ȤaUF7g:޿4ek8+PG𗞞^/<.1DWDdVE$HB&;=j wxʬ5QI2#)YIbccc?8 H˒?@LPD*ɜB0umX\p7{x =kޱ+k$9po-1"^eŅG سE}M\ǡm9ǽ=LL&`@ 9ɍM={"S1]'bsfMg% 49huBMVDXT]R}#Sqȯ_v_pޓWG*"43LtiO f4G14ن^iTprp>pd>0U)I;)E}Lz=ex礄#^φ8⿭$>9%(4& Ga 7 &9NY>C <_i7)-!4e B~BRȄ$ײz)a(b-5zNz9I&І09zCj?fIߺ2n 5n2+fUˣaB˕~_Ve5e}^Hm\H9v.IuB&֕,{[d[?[%ۗnARa[vij)~1-}@*Of#U)"N'ҝ$u *YJZYDއ^$OC?=N2ѰY+\PK:Ji$\~$u|c|' qcKP u{'ڈ>#om#O|6-ͬOpW[qY|>i'ˏa^6fX!Jm$>.OG9Ի`43(́bV5[% ;]`jI^6絙է;'ȁtcծoG }e4%!o#Є˺t~6 4Ri !JE_h.c0}/+ ͗oi;k_ߺx{({F5EGi.xmE{GNҿNR=t,!!B'&t̫ĎjvҾ+N7!qea%(om3:̚T0V* R3.q8,5C@jYTOwFQDL~'n&$p|Drɳ<tDәֈ p-n}܌x^Q guѥoe>PlY2X.:KLHY.)5}Vh2`6ؒ::MncV( 4 kEU ۓ)aTd7q[忝wt^ts2#eE۬ b=IQ8O.ag XNj$̵E6~c?y9 pD"o%I|4"'୎iTNKAQW Sus&p^8G.g,}7x<ȣ]8 )ޜ^M4܆Y[pp&\aYկk0F'w}4Lg2 l1!u0v>8V15 7Fn}߿?ae4P,lFބE6~L"OamMIV8Na`ZŜ1zYJVS:N,`wm-ftT# U{̶/$+CN 'F gvsST[ip2X>}*XsԈe*b4#mn׍ a[ L-W:&o+#'({TDY%5a"W22a6DNGGXQuM 2?|5Aw|㄀p1&Kn遣XTvǶNDf9샱fauJq3JDo,EL;'|C7y[q]M&q5(%{.`0S0a1c<%O;x$ `0`Ze/Mf>H9`\L r2m64}/>-m^+o9 oqb~ӿ`P%ނugCmӔA_/ +Wk&r|$F=o>ݹ9nAg[ &Z_H8B {40@0FiMB?~ kY,k*Vf$z-m#놤:{I;#OhV8lC*h* ᮨB*u.HoC~Ff"U%>FiM+uH!9$6;h;.Ɂg%ct*'ver4Լ2/, ^'?ڤ1%! w RKɨ[#[QH 9jm֙}'9>nH@>)bϞѿ9 {捊& baQ Jgsp-X ʗ pVUOz^ii.FPWMїH mrX>:˱j/H©K-ý6ץ 2u/kVاVLZNV88XQd3$S.W ʶ*m"R}ʚ3IROpxTtr\r'moH)w>Be GI3  X&GlJ2qaFh*b)l %PW\JC~1=ÍbY 0OUWN_oD`rzJBD21J9+H*+0oWbv"lҍh&2G]1U0 y$GGD#ӻ Wz35ln9/kE haOޯQ a<3$@@{VA{:}=|a6AQ7NZt2V6E}W+}ߕ~]C^4 ׭q|0H#G=dP %Ch( K2.c I ‹ d|rnzjs8ŔHt>^AփniQ3\YkZ~ xi3 a#O}ɋ66@.X,_=Y0A!_]ڶSp'VQb؎,S.$wGlQ.fO't nlBǴiÁ4rZdu?<딏$mcGG &A9NkEBaN|±Q\iYprq]b9N߽?9<ߟjŪ<m9VJ ֺl(/fLڔhHG9Wä57((Pqqk7']吉ޅ)b9-GhyĤ_E;]azCw~ I޻ԽHnQ?YV~hNEJ͇Xog *uԧ/Tb6S)`9{"{ fPȼiñDޢ ZވFI\yo,1x gf{g%N;Q2,7-3lb2(PF>u_IYh`esaD;+Mp]#: c4Fn|mݓ@b:{WlPT +sHk96iѬ}T P>t\JCguLC Aa-PF"RʪaZ^H+e x \%b Rܰx53[=Ͱpx2U$qYQH3j"97#en 2N\L#-NK{Zҳә!IFPX35Q!>"s04Tb)lɚN$̞E}/J&懋#? "%!щaJoĮB340tHo׳$VX~Q#Q XJ' oBlb?< kJƍ: QVItW6IH=A`EӶqĎS ; DG"1^F ms-u*+coC5ͼK3q,I_vDMA(fG^ ⵓb7j0CǴ\)/iO`L.K١\@ǂ;Jm?g@?K_4z4մ+G֌6|o!IMM/l0o*ie:y0=C8J[͵?dHq^O $la1dx5wF]O&&:)by]en_wMqĔv! 3o-d"c'/V4.b{{'3a*4gzᐾ՟1DP拵|OlΩc$9QʧhUز>9h-XK7qeFd̽`wwE3C\܎SJsHWMzfxE_M:7%7ʲ$ fIq5Cr'eͪ.d3y#$+t>c<:,̇n_*_yu4voQ:țyC I[v9-8h=K-x[O3=ˊ+h ZӪjw P!,'2z0_MύǺ ʑVа Hk AN^컲:)Kfx8b\5F KPGSWQMAGOSv囜Si򱸈gW",[Q+׃f1)\U3v2nvysZ }T8`>PU\`h_[Mo'u/M0T (]}گZd/~>{p/KR]N_(ƃ,ڦ]`4ؘ{b!TͱMƩcLr(eq/ kmފ ";,9? Mpӵ5l1xCQkwkbCxK3=jy6Kǝ|EM1-Ň5o*Ɉ:λO#ng[KDx[BCΆ9;U{6j{Q9EʹM$LOtRҟ2=Pvi.n߻6SiЫWg5=} 7,^/e;[6FV?#B|tvVq r$H+Nh_n4eiQ.T(Ϯ1ګM*wS5XFȊ:KbE {8OL'oMty02 =ܙuk2gi|;K('}eȢx5AX8OһDkCtwM?WU K bpΧpY: 1$˦](^Z򙓺o* 8 Il$/,Yr=U=oFS`EO-8 oJEO:g43žfPsX 1>{[[9&eh']km{m^X=e2THŘr }qM5ZNmFSnd.S=4|\0jZNã^&޴%]Gjen5\L3Q %дrYw)SȾH-Z=P H#O+L%xhFTۅDY6 7Mfmـ-)Ř6OL48*մzbD|TMTv97mp#Szf0f }3~ o7CR;tٌTXج; ~wg^Cu-BZHH^`(W rT4a[6AD<޹6þ :'݌)NmX&/{E)M#*f,=d^~e`FdhFwmpu;R{b1еpV}ph@6ՍT9&<( ZOɴ 89,oG(Apl GvH*V,ݨӇ葄t\sxޙ4Y'C9c, v4U][(%a*'SR23D\&^2ʤP7QJ*K%p͛aGݝa)v,g4w| $4Rkn$q."]Azp.rAwOR:_hml2cqi(o(LmhaOs:DRcFguq{(D^F2ui>IJq2Ώ@Rp.96EtZ1i/("66lwلV' 'qKyeS@*̕7lZ+:ETzrZeNP}LIz; ԅ3A 2`I1yu%=*w96ǙSN9g6k%2".7,Tza3Ypp\p=|Y@_fHNb8s0֣I|叶?+\o aJ~],ھ@O:?hamC8N̚|RuI{q^j́ }Xvs-E*cU/<Qe߯sRnew_DUeXJ7`zR:u9jp **+dLlDգ;O/wσ bYi,ƛ ϱ~>m/:)`2u7Un fr1}"8$.'!r/WԒ (ۆ 8ߋE $s!YYai`5JMp~t)wvI S$n&l$p9{'=΀@)"ZƢc!FHA=QD=@7x 14hM/LpBc Q)$6:96/<FqxԤbhz\d l;bMw'[ݷ0is}|6k̈́Of mCmOaPs(}cn;O]8=:lXaa0mHդ-"z6%9"UݪÑV1_QeqL[@ŒCߚ9chf8; Wq0API 8]wG]P7ׇ1B$M3rb}c޲IL44X3ΐÅ@q1B,HYH㿎ݹ?ߖ̕yJ:Vσ{qͣӎӤ<rIMD>E}.*PUd<,ϫ P;qWWZ 5 OO*Su3qL V=Eۍ`]M4K9Ce`wAU'@]LG{ |#}d~QLаd)ӥ};T&$TJ-GhJ Єko;rUFt1@<[|A[<p:M4KqR_㭓 (8gH*4S-4(x D7p#~?౼4u\nT62ZkwtTpܾ3pKU!TF,@/odLq-,fO dwL;ߋc%MWd7y9.8{%2صylZ1SƐΩ>CK2e*2DaLjv=|[vs@}5  Z^niӪFTCO?XZAm_z F8#F~ rhfbG gfO$-Gd)a5GYV=8-ؿ aQѬ {uYdI|I$wv~\a'OWH,a} [yMu}C?A Icm 'E| vK!+H,dĎlbJƹҒU+APA|Xqs+L\/Uٲ7Q1"q$,x9h"φhz\h<"bS{ G\Yѹaq7/U"t3mi"{rbde$)u!ٱzU#Ӌ1TuG?a=4f v,{LF%c"I|oT iFĖ*UXOMޯSg1Y2Sw`$j'?ZI+(U# 4GFFd|Hrl!8r{ps=BU_ʌ |rjúN1J/yl\ 5)88ocR pU*Pˢ^ݧlXPt#z1 VWmΫSRAfN ;5ڠbk^Z+K *#w mgejKҚ>7ݸɳ͂!V Qv^ L ;M +t`c a[B r{a s5NSH-XVv@R뵋 Whȣ pV6관q60F[0"#F0$,>Ö%0qpxʉ89MG|՛z۳&_$I2s%ö^瓕ቨYo̞ΰNq^VgOV ZJt+RV:XkLX{GCo0<ς'+Ԉs Ɔd(,M}QjAZ>BB:P$"MaT]OQ_&ccI>AP8mOv\TЖsy3kջmn#,98`j#4JOł_pѭ($9R:޺ƙ:JܢIL7[8( ]w90vb([_w_v5*]EL /:=H{mH{ewVb,}p } fزjΥ|c0"@O!6J?aSiԂQ%<ּI(&$g"#TlioDhrսjQT=1-KĆ} Gʲ ,)M3Շ- Wva„0&! KcLeC 7{&Z\+PVÆaK C3tnqEgz7Oc'}7EYhcyk^oW1r Ň~v4Ar5OJ3"}H8Yf38?Ie [T3@aLr&9x}Vln 8l:l [*{ qV ]m˜T9mN J`?o4syѐW)bJb~< o^3LP1#W3rECG8*Aj,n܍:`&3$F%Tr?b u u]8+w,I+7N^t#uKV}i "h WSUN,t1VA&l PcȞ& 5~@ gI7MH0V$_:!|Q {i`+";mk;Ps!'1rQaٓNGo>eP`Q8ysAn}%cz1Ph*MWm DY~yu&ʄ [?K Ck] e E2K>-ue7iun;4xK#9 gDl}S\LGmV}t%)xÈA5ɲlJ[N'Q/jKiV/m^9L{6%L^vUigȓd/1QlUnC<2,9$ϼǒ=uHZ.Fe9ove䎭6&B@> ͢W-Zqh`!/-,^֏6wJxgaZ 2!|5kH;B~4#ҕZ[^2%* Nc<tOpp&V2{EZQ }e}vf4F?p(o+_EfІ~Nč3ڄ:sm$Δ=xVkC: =oU~WaY:@܀}yI$pg G6>CkXFt?|HbOW"((6<翤0M{0@`x0rm+ciW1[ĦAJ3k}9=9_; 3N6.Lgɩ3@MZ04(`<~/癈PNߢ:7\`&g<]AHQb?~t:tksIJ + ē D7xΤT1Z]>EWޱB'gYsu3>¢`tS>'Q1c͌ĹV\t"}Q:sE}K} RƝ}ϫ>6mfpx*eY>Q-0c 4UO) ^f%[!slh0\[Ngy6Bg78c"U`3ЄKi)v{zwl!3 ~ &|Oq:WIha/ma~MرN:$=G.- ޫgR,es ViZP 0 r^MP#4*d8 e( B[0L\iH ٶIH;C?co b~q0kOHV ɵ^ZptQ,aNnZ~:7X5ϸWK5O)R%v p<jx`,fs &lY4*eīJH,u&.̒$¢KQYL -}{Ag(ỤҾCT"Co2P^\Aa8F,cI0 8Iw~G_HqC:d&>CZ~b;UqEྏҜs7!n33|s>Mnyڢ{ȘiM%'ӷs±й.,(Jw1Zq1EEYO$Kv=*1NɼK? v9b0҂z1x(5] /O6}wg'8* JVZ ̋LL3Ǭ$[F &i|(zkT%2t'wqzH9Js]vp{6`y2Mw@ kG4EaWk j49pXQ>LX/,tH/%괙OwҵغޟnFvoclS_6a\TÒJīq;ZF2&=Za2@ xKۭo1D .%{~B,̔4chM\ 2,' Z.2 &H95 ^b@iWPjFqکCrKvlOws 8iv0'oH8Om~94ӷ EUk^o=1kcsR !C>AxmCV+(FΜ+v80.J:f: $9 <Gg4FzPMB,78`3;W@זq}aEwopwxʶ@q5*10{tCg=g0FK:Ƨ}u_~`3r`wE.R9G\Kvv8ެLp&d[Td~*ڋ4Si̱?"L5pR T/g7 |5yU /fqDRKLH<&K-neaIQ-d\zq$2ZqEL>o\Qߪ%,Rp|Yd$J%ahJ+ظIPf2NE6Gag߫ύixQ!HGMCqN^3C9D=P`X8[8WYc]ݰ5dcX9J m%S/6&P2O]XAK0&^x򮳣e,\$ᧈ$Ga,N\)8~p,x`cJZb"XkOæx7Yx Þ`f?rC}UXZj2 aPrp IY{ki~HޥE Ix1ĭHJu:K )oJkD=<l hXZ!(Q<<-eL(<@p>$fIKzL]OfN%+_7Uy|n:E,rZ=mƿ:Dg1|!d9xeQ>c&A$79޸CrS8z. P٭ aeTG$PGG8槁 D`u#|3h[tam- By"A\=syG9m:Ὸ)+I;M!%{ xL)T|>pѫ)$|^j.gUjf*_h%pAsO]GXTH):pIJa}MXc+ USKden2& ҫb3$#@ӘCX9(/5pro,U&k~|SJh_%nxW~W4҇Õn# 5Ov+t!#Q;NWtF`Q(7z(q)lrEF-E{*dN|D[eLs:*̼* ; j}qE'n6h ɭ6d4]V|tQiUW*jd+C Bb Q+:dZEF԰[ܽеs!Wf70p4N3iƆpqJ}zutࡅgO; t,C?]JX_a[n _PǬ,}[>Nj1_":k;iv>@侈!AP"Vh;/w`\P5T؄mzRg*)ItEJl.g!|A8 o&E7\@3>Z>/0 (wS{"(q:9MW3W@o$+g zQ?,`8x=OH2GwSMIɵ֯Y47oҿlZ6c+[.~PLoSM:ޠ^rX)᮫?P!^nu([+qP tc{5i0Kb1mAO7fQ|?X"?!Li5 콀`qqqu-͋+E^v</Ұ+Ke+nGURZ1Ԉ_Uo:h>+:}~Y19\H՝,N*ۛj㛉" (Ky5R6VFPZΕCE>x31iyVL?dȘ}9_ZMB9tڻ;L& E$ ~6aLkhh$ R^蹽%9rae~]8~W cȆV:Y^FdYu Tbh2'= A"]zT^XT:R4YQ!]9(c^K$ɚ̎_:_2q&SQNaE?{N.xj E(z7 鵣$L ǂxqoJFIݱ]3׆KMJ򌨡86Un 0PKz4a΂4|ȋP;z;SȈ 7סcTAY^`X%$k_Fi2?2x3X2O˟t!chp'RMK|BݩJz Yߘ]=M9t5(ෛtRDY6Ki."猃$d)l|k, +Zk+j 7bޔ"iy"y}&e 'Ĝ"صG:C,CdE͓NKk'VS( NXҙ7R{oMSUSd360[k _]ݸ3u@g-}Al$ST-qmj<#iU꛿U $/4Xg&hRَ0@<Gilw#ή6 7I|y@KW:qMΚiUA7aLjﱓ);0XCov,uwhd߬fCt3&o05/'M C;Vɟg^y~?E` /\}v8ϭ_ŞIu<> /#X0c *|BCT2]"Cj_>b+,B1Wt@1Nxi#tdt6/M6 ڮ/%Q @,qXՍv4͵Vlo: g܁dd-NwHKo+ L]` iGkYJ.lqxo0NaA!5߯XJO;ͥ+p@C(ݙЙHPzl2G"ƿrnJPK8{, Z$߆ys!z:<]ŕB3)igthB6Sæ ζFaƵsQ",lUh K ݹ^{ VX5V^0osCQ>Yk,.>|2Y'hƪ07@z5P:C3#ٴa2 f [N_w VbȅXQ@F UK 'rl{z9zAay떨Q̸o?~f^QKD6c3˔v9>k ,U";q t>i3tDdt3X?m/ 4N؛^"? &>&s_*4q&̳01M]/)gY#vFJf00%9lş"<eq<]ey:6)- CK#ls¯J ^a'yG8lUh< Lh0Dc-#ȭ*r9dP8$7`H<27 AZ+XK -^leFۍAycYpx&[iu=vp; i-4  V-EC|5hD IDvT(>Kl!t|&5@ᬄ,VN8m2F}ĸoN=#Ϟ3ii?&BP{x_#E(\P}T&  ^+KY>t4U R@#XNSR:5\h|EnzNX3 Lt>A Hn`ol/R\ Loj? =oWjn>idw?ً;^zoLkG ;}w~9?/YWj?Lcd;x{y v"5v.@IM!Ẹ"궊C|\rO{OV { ,Cgx8t]9\e+vYKIhպߢo=jL_ڴ'Ȯ Z}AY>V_y>|{WQ;v8 `Vl6a,&%쁓tȘ#V Zɂ>8X.VzU JPx4l:,?W;=ҡCc&62nq2o^i^hTXCt ,F,Ga#P!jkՋ%IӌnE6*%2-OkRE^ rB<WDKRxmRm є(=- fHÛ֥ u]r1in$1rPtpA^fc }Zȵ>Np1tM2Ƿ/iTG=aer?4Kjvٙmx m6D &'?5Ӭ2l Zil oMf8g?Asf݀~[B,CZXwC#*ڊ->u p [\.E ! V`nr,xfxQ)`"HDk`yv:+,HҐxtK[ҺZ(ffwe T1c+:u},`8bKg"T[LY{r=IZ#QopHm' |' -\=OS.69aUo;`^C+[0BaiemWg'8Hl~d* ;/ QiG"Ҩs8>nT.=b%5|  6^up8ц4,¼5ƣq6;eQlLجЛ^Sp3۩y[@4;5I=6٪dj$3x!/rmRsM=~,<d !47;H^=AٵI|LK:{Z= &%ɦw:sik^ؔ/jjtkBC fGc9+@yb9xc !P*[%}; 0'|N!.|0\҇ _Io16ߦF16"ԓm§/VWuӨ,!Hdqg%S Na* I`lW(&9Q!\hء9-,ƅ0nBi_ FN^4obrFřڠ喉SU-;XcT i b.{%M0P7H]·'~(恉e x i.`Ƌ$8Bf)|"Dp#lmO!Ij3Ӫ܅/ -K&fYO'ςn{ܯ"}D'ڷϪ)"!KQ# ݛY?܌9K 7V)[QX4W .]3pZt5Uas^:)Ϻz:I,QGj xg9-JUWz3F\7IjHZwzqibܰ ؽrm ynK y;:>;v ʤ]#4~ēHrˣρS 4/B}{{l]wF`sReArŠQ)tm!m Ko`y+Q8SV$)or-.w(] 'A;^mӬco$L݃~-\9B<*gPqoNKM Su{|1dgb.wޑΧ4+i=4Y ,arj5_1> p"8#*agmJ)#7yE-x<]P7みe$7a1Vӄ{*?X uS'_gܼOo;U N(mD2jś,|wO+Y326eS}%$#j@k܅`H?]L*> O<<\v螷>,t~Іv S,n4ewK3VHd׻G W!9.mVa 5gxKcfEI ^j<4wώg¿,lRDQ&'VPXMw~gbY6C&0i (Hkx= DRj"9mMp'IX6si5 kGcЦ=[:O$ /ڪX gb\_p~ǩ\y$W;hk:pgzb89؈rێoplBzPq0fۅ-nj_[>~>;n$cC$ ,EBd"%\$ _]a#?Ž?~ђ?+0 -5W\>nLlZT'?'"Ӏ{`d Kdgl;Nx&%[|U"I|TmgT1u FQc1zon73|]@n^/ c av~C0 %8˩5 9*ZQ오~JPSM4rX2v*sK ؿh*tq}5K 0r+ Zۈ`1㿭> -Ab;yFK⼶~V]ngo[rҶOuC7;ђoܰ @erO Ju/GJV|dy )do={s.%MpgkI"qOj5teqvUkVo:qLn ˎI4=X( 괷= ȊbRr W$ ?.L Wj` SG[ˑq2Ar}#d.?ϭ0 fYYwa 7n Xx E F[>v ᮵~8=Q\T :@?e4VHD=ywܖ&U/\S͆ZCV\mo1tRqUEbN-!S ()Øjxg񅻶%p<+bcg@9tf<e7Fzۋ1*e Uwem;ӓ LI5?U`dOIгl:Ofj@՚Y7,U( lW x;? yDE;Xk(R*|˵X犲>r|0DDÈ*7x@B@VE7J0Kǫ*y9hNBmSv秷ތ ]`s)Q\YW}g%T8(̇}rO~ZJ$ :L| v>S'+y*@ l R(~.Jus%<$m:kM`q@M-hz, ZyJMkGtVj&2h6,<1^bAx;+łTE1+x$i D6lij:0uwD9ٌ#FM9F~6N oz [0!"#iJ%YrB{ SR{LagT$Li&PG&FI- f?Xv]A$NG5|!MÃU(+Pd[PSA~W %q+tVwJ^d , ]T;!*G3e`,H-Cm+Ūǩ,&6s.Vu+x Ae;wxۭ/o;W]Hg89dˡCzDyNNX)U=TEE@ɧXxa©uL]q}k53"8p!2ZEk_yFjp8 _|m[A<0싮חçW\x ͔[}a;.f|4G,aI\8}}< P^ӯtUX7@?<櫓%4#2Κu-GK6`bѰi83 !Fi%;m& ۤ qqGI_9Ce3VK!srosV};Q,!Hop0dQ;Y jGm|ƏUUSsȤK^>XxT[C=)FQڿkw-veK$!` Ԏ|g\Qha_x a[!%~;\O) ŷ4o1i&7o; 9 +%NIX7ܫ݂%WKKY>UȺ -#^u3myCjy!hFIH`"BAx?0e2`K)+“apCXzG,~uݛ' DpFH[08&y繿j]\Y'H_`ȉS P3E$"$Ib˧A5V鋗K{"B3BdM qTGe9XjjFqk~ ]KN:XpaXbk3 Πi̺u)m6bٵL=WSQwE@&'ՕHVtU3Uƀ7Y ۠H4^g &$d_ED9њ?'Vxdv!|1C]TwIcif18. կA9#=BeD\"T2_ ˻Q=S4}5K -V1~b`\H^foĘ{_S{?oqg}d, 44_ѽ j8Iwl wZk7;ǘNLecHSwi`Xel &/О$ġABGhea! Gr181|H#%ڗ&AD^f,,, hU#+blFYꙸ$azBD'eՀq x&\bXxTJ9VJ*5u6 njN4 N_]bwfY DCGE+8M|{ܾQxMXWq!{3!ieȲA$w0W17J n0D9Ŧ~j5sHu+9DO|,[^kx4^݅r%3DZvyV @:5yɣ>!_. Ս8YQmnڢg _N_cfn&t`K}S 1b;47Ќ-Y}B^2":DoYPYn|I` h_'vCE4H]*Ǹ@%Es7!m0ntTGT`7Gssjj#m_K" A'HQdJB2-;tpϝrKKǶgmWt|?(0*xɎ(N _J$8Kg'P{rNsM"T1vyT*ǿ=nȴ7}Rx2ȉ( sb;Yr\b۵I"56LLJ*Z3 zWp m򍲸S6a6WKWU@6!|a3T"xQ AbyVAOBe*2ۋhh]|zsrYaHs, lОGSm*AJ95oЕH+Xзl= 3ӣ'~&KE-ĭC<``]LZilH;܅vE~誛 8=*H4aitqؤ3ϬՓzS1V+dT4-i&gS5 O +'HX('M9'os0K'8ݦ8WT$UA($IJ:1~RA@ּ;G܂ALD[ 6ޯM ad5(!OR} Un10n4ϸjg:9**Y2Un`8^/ThN!k(TYXALG*zq0AȎu> w]Ȁ]&c`(s֔?1-׼IАrb|.}d;LdX E(pM+Xj a& u*5EGT>+$K'`Gײb>reY\78&&/,B@|Wq:u6;*AuHlJV"$^?&y#VCꞪAZ-KAoM%Gpx/G`C~3Y߶T,"‡B~1iisB(t_ZX:{/ Y_IoUϢ%3>_SSG:~x$^?ќ!-?G3<6Ү&Ϛ3KKBfVꭂ|,=_`RZO{T6 aN݀QzP@}5@tsV?-3wtN}1Z88/>\Iq܏V6  ܬqOV*HJ s4<[gyg!a1m6./ן5A1aUÞ܆'|[#&4cX&cuN!zý]ٿFɸ,W2j`\66Bg=qD'qLx]𝕐LGX@fD8a1D*crO]&z+[ R0xwXnjBMSOL_=w#gynXξd) t (2H3@u2[Mnip;6S2buuM"m`Jr¶ vM 헆Ҏd7n07:9|/x<]_' 6g֙P F ^f2mmە: 2!:*PaL8m˳Y_[l{NrZI8qg !2% @9j4#2mnsDyƁKJn{EpڝLI[xyo3c,n@;5Yl ŋ?|5D> 傡Sj ,`yi0&ڼyzn_8w+KdaJZC@IUx-EmZJ/(\SnUs16@_;+LfG҆_: YuHf$*ZmM/aA|apT(4L8HQǫ`0=a(B!+xz1Q\d=}h^V|㣏 itePVmmt05kE gQL do^?*I(`:kJ5u:Ѭ[k($-c  ޱצj#peױh htYn9Ok ާ߱FYJ[LE*ZIdSڱVIxZXPӄ/NM& )C [)3 jks\eŀC8.0~@=qIjK*LI27E\DߌA<l=钅gqoH(XԩۆA;F'қ&h)Z8o \ds#]܃JRLIv_5yk2_*&FP]-U(@PQ$)@q,>D٤08< CP|JD \Ů"P85Oz!c<]ey/'^mZDM;\k}R0gx)KzPYq_^7ۆ'`{I~f"Ϛ_.ߟ6-S/l6At YV\^QNh:fW a1vo߃M0rYB[OCi>ד)0E*BRݱ37"DV21BlWĬߜ^9SFCNC" |$I8zޱq;eM?!ϑOf8\ۻqd?sp7.;N$shc 4ǧxˋg _'S.f=&MqցIJ6!yN?&-()SqG vEшHϊOD:/N:AiŅy :cǤ!@M]Hc~|աÖǾ~ۮ1,\H#Qt~ʨ(*fE'th=:p䀇2`ezLjV9h<dc,i&Ds5jl~n1} h3_EI<(F<}ޘҦ8Gb%z>=>I"|ܙܣ7+v׽g(N81wcڎ.fǜ<-b$?Ј*ƤƓVo䔶ZdU202ykUOݫ<.?6t}%iS:|Bl5;SDMW:Fߴ!. o?3Aڈa8]K꾞'4N2Ϸa>O?̝hL2-:B{Nk"!M`B}(O8ophf*j|Zs)ҥH~~ FsXϏ>;g Ca?xy5OOUF&c?{4۸HWn[I?M: ]mtxN7 >/n C-[c\&&(RW!g2Z/=yLY'Xq6둸=l~i+pÌ1!mB~[S!:v'"FIͣ88c$!!A+y.'̨K61I 1&vc@d⊗uX甤~ux]cQQQ-i* #Gݬ?7K5JVq nKĞNUݗ3J%w#}5F q l=\Grg<k9R1.=IZ.{܆9Ht %VNp!f+w894y~ 8YMz׷NDpOt;V)9$upNT9[Hq?j'Y $/ކi5TJ"pD3SDB,hsȈ5OC[F}ZwwTb):H5ǁoҠrqXn"E?BP,ъ귁koWՓ\ؤ ${ywY5ZH~Yg7+F.UT-igwʼƿSyka.nѯ$;UØUb"<$W~Vֿ6k0NykJjpvr hsvPؤ蓸s|쮿G2N~~_~ mbow!-IQfL`vv<,+y3Mmp0_/<,:1| Y-o ^ϗ1W{F~J7NӖjTd.i#3q/$1 YڝH.T[Naÿ:U) ;6м82]6Ȓ~࿊sgmxNF5̯#-a*z4>m.cM tِd/fSkND\hQU"j SXHgπ#6Yr]Q F֒%fTad$ Kޗ.`4S*7J!iYTI,g*0v3An@6ϳ DV61,] wYX!(,3k.g42y JLj@p PE%Tټ4yv^Q Ij=elaQgQep0 )xҙJc's nȀu G}04g,e}pԝB4^$yзC +,h/M]Ae=^tGT/b?ܘu&+ h8` 1r15K#VSYiX"KnUm:/ZF05>. =Fr,a)}2ϬimǴWd{0?6 7y,?.6z_w(>հ7&߇Ž2jlEfP X{tN=]RqSl6᪎]xg;Z~d`!Q2È&Z̓,_~Mh]/e r̨Ќ * XZ0& );H0PÜZ$|x_2D( $xL UٞMݩy}s?Y]0֒+C o:J%=u*Bw$XL,/&)llNϒstH^yFb!N J䬜LYܷȰߏUMa!TuI|n!kE5|dk (ڞqoymhIvz(H`@Q>3-BŻ)D+)SF!9pj);(`WcbBZx>QS%B &y=t;hlCBy8 L-eE;r^c `s( 1tX (AscS.S༕?'K`V;}6 ЧѴxoN 1QQkw1EK-7'>NK;=>[CV7gPӾ۠%QP" F{ /.` zAw|z ]213TLD14_DU\ZUf/pwBc2ozhL2hGw5E?2A ptl(8NFJƐMԋa9aRJ6<@nR&U:)f55mixt;jFP=̱Ts-BJV*I,9m $R sxSR"SX`&.{'hʋ*!OQ$p1>@W2+ SBc'B'"n3$L߃Aΐ`O{N8z{ K9l G~a"RZ<\P$3[c *uGCES^=hMb:geFppig⿃Y> |snfwI h9a =sx9fgBJTƜEfHq # Ȅi r Zi': H¼K3,fQyVxŦ'%"S3d.L#L0gvoQ٥QӍ%Nͷ_ߡnfCz[M{wll# <P{0WkU-R*@b:P<şoa Ѿ"9{fͳITNwnJ`3c`H:j%pk`2,u^Vq`90"YF2itCn3?!Q?9%n0"`d%O4Dٍ81)k w'#y8cZ08sTVoQ0ȃh$zE"2%q`7ƕe# j0CRCP>"3?RhdJ- Rhy+oߔ|&'Jzir&j:SxEybyn*@YL.Ey" '/ZMMGMĜaHB`|ۛ:4vcms:IId *Gwy ~R-v7#Ρ;*'cœpY%ѵW3.OkF5I@R.¤ck_[4Kp(jZ#Ƚln$iÛMvV';B}dZ3i;72 t0WRs3ny`Ϧ/Qӊ oJYj c883r!lBR8@{VWpzwqXӻDUd9' +IKr kԣ ,YЂ)!/LrZR: }Yvy4$6mIZv} --CV5 ؓQT5W7SW$&SLݒgEMʪ 56K#_iݪS 6H&=4#MQDv}@~9P4L0?c[qS$~MՓ9LՅbrRRC)$[#I=`E;.ޯ:3A㡑r$+렳U{"تAŵ> QW3Y_#if% ob*ϼz<]=At<7K\`ûCDJcfRݹtH}qg$3.My~ѩ.ϭ_mӿ;HFHW~w}E?Sw˜!U<#AgD\/JTmoG,.vnU0 "73^3V1[ zwwR8WGP4ha{} a3/ _#:%a?D7a&#)%;KE_ʋhJΩn4W,P\cQ(4gƚH-,oMziPh-6Wo9]og?_V10K +16tȵ/2ls`Q5.rSHphdۈ"2@]OgۊBrgǔOeL?AKPFReE{ҾLw"!/? FO wF ?ET rzߌXA3hvv.&2nMl4^ei$#Uv?߯E}OtjP_uWqw9wϒ;PPwazY| i>Ӻ*1fLE 4h9 r,42`++$_ll5<۾ &'s#\-b:tp[1s7a !$Myba*<֞T[^X쫧~{> 3ebAsr(IuǛA0.mb3Jls%l)!-jf<>3 n 3[5/Nd7ԧG׽hrS|^Ua4~?Jo%weǼ|]/^+8?Yw$-*$kG VUTbʹ-<śf,Yʉ69ꀖצ6dEG2vTnUYFxt[y3>%i |Ugy8^/AkOZݷ59ͺ,3.%́D@!|{;/ lTNQЉ# taL( g`r9˻Lc?8ڻC#)qd9[ja0y$,=vn1Ch[U0|iȔ6gSʽujQI\8Aaq^,4m(#ǁeR6xC $+['dm fMmr!RPaX6H""zQ Mÿs BM•p# @Y 8 <7 N5H8e1G}T ʇSD!T&P <LϛMrl5L;%E>.Lv߹wfX :(~#J.-!gp `;D\hfZ˛K&JͰ\]R$O ,|y͸ؙkޮEtv5J~\64@hbyyL}wCm.``cx(h=3o' ~wUnh-Ε=OZ܍F5i{X­xdUSoΦ8#L,sr v_32xdPӋKSΔBt^|`iȑnILmRڳ)SFA0(K.*@&,o&q)&>f¸1طp][נ'Oy3g$Ig[2X7ͦR8kq")q"izKw3K\\+T*ku]N1ẏ`/iz3|qTܿAfŦٝvKfF\`E ߕ.`HHz!Oa >/zVVLju/ys*h<,:d <*mJ .&).{{;~"_@q:FE`nlڱ]&ෘ!ҸȀ4spS>j$& QIqMO2>xO\~=:q>3sS+~:,oa!}!x_N4Ϣ&ӫ,?-}?L+:#[9IyFe{-$,;Q&3Ĥ2}&@ <덿t iHE┾F W6֘cAOl͵wzշ 绨렗@ШOtɌۼVgx5Y :eI Ѫv%M=-dh~{j}Hb<\&s蛤 ^[Q0\Nq?|Gc޾̢͛#H7qfci^5m?X0 h7TrI/h -غk\Bc-\s|]r=1vi qA&|TWɺ*j%&!'r(-V=J=@H{|0~7wU_\+ؿQ Mr+ݤ%`6?l06E~?8`=vz ט5dUwO]BLПtyTo3J6Fz~~pޫq=ѹ&VK̙6cY4祲ACb07[^_}v`!~i '\ёa PwL5jcI-/p]0ǀ|$A*Ahꆣt "r90`sF$j1蝿HOm䂃Kg:6euh65z{j rOx-!*[0ḅ[ N:'[)A8Hz}іuMR6fVSf?HEa"6YukMSKxB|PV/_Pi}qU jp͏•˴A_?4/ =y3<"b1-FۨjhrN1AՂ$DfjU Ho3>] N-56iHƷ' 00EG >K06#Euy7 =Tq𣶝To.O$=ۓcO$zoZlc^嗣 HF9 W)=-2v wwgjHѼLffl7s"Wl/8hoJK66)%0k,d % ,SWymjnWEaz= !3,@feT`= gliY &08]mB3$!B%ė/-E/K\%{ 3ݻ'q&xHO۱{,NlL#ϓ(Po$OI8X&\kԵD"PA@vj pci-R/t{LQA9,DB3O.4} HuW2)b $,B?zMGٴӼ`[#p]M uvήgp!-p QPͤƆBh"#ѢbvkUK"+)/pz|*FW9TѼڛd?fs`#܉c=|mfY̷"@gR*r3Kxlƣh&AhLx-:"(& /S*X) `{P[DgҿζZXǎgҏ%K;FqClR̿2CV#˫!ok讝eMMokX ӱ{H$ܔx9H^vKz.=)4æ$!koeuMs|t[JpUM%IIMk^%,3N'(2 P5hV2#kxû{:;h2U޻ cKI%H>GK!+IR{5OF ʉ<~'6} e&̤YzŖ_`*4IXKwӞQ$%r$n8Rl[\<`I6ِ]i]e՚8n gs _ǒOԕ.ǒ6KQ4]Z@V&Uֲ!^tN*7J_?\./o6!y xf7HYoU$B`}3PԄG4ݣ Jޣ|:yd嚙Hq/Mwq,t59,){f*K_'Y0>leyH>Tu-qB:B2Z\HďҳLW}5 xgʄ/Qo] .7$/(Z!Ud#EdUF?mjZveTvtQM/I9|MAczCMy+hS@>YbW~n`y{ܐNoʯÞ@wi'bZQ]Պ}gR5^x6[H~p`q(֠ I<~iiijvQJ4\< &-a GtZg^,OhuQy{p-:&FUTMTASk2v3tJ_ݴ=afWF5h&L]۝ʎ,.6^ cyXs p {<ȧVlU>sڴnI8gQ^ʧVF$.J=-DZS$&j\>4uV6/.ԿYrXpuMf1QN;6yI*Nوl]]wPmISЙ,)܈œY6jaa1na$tIi%1XBg&%=HFV$ -ec\:(@<A^b'J^qUHb5ZC gCqW !%7;Դ5I hYؿ"cp1 ?M*c4r$bh fqIiۦ>ݰ;Hhp8v7b8(V/C/x¢Q4"5@?F-h _Y Ѡ~ŹYHO'{DRvK%]ǒ$̔?f 'WG3j5ѫ:u4}$ .F {w|ޑE1Z2Ґֆ;ʖА :Y{ΕiXO:>I @GV8Y|h2cn6}|ZBLnJϯ?TY:]VȦ҅rȗs/VhB8ĐZ* H .z$Wa0eӝJZhU1#^QW4hIW2D>#"IZRO:ͤq vloѷ .wf6G|Kk-"AguΰH6'+ hŤY?cP$nrE3K{^;?^i^}dW\$/9:J:׾1I\?Wsߺ>c}@/Si.k:n}mα EkKQBWF`M27NN͉3b6a nZsZN6(cuگU_kB#(O`2z SOx_E".G2{x<{d_5sV3kxpƽY@x#mT'1B{tC1&R[  9"eP ohP9V.@ﴨpCEOtHVBqՍ4'nB!o[j4֟Z^ |Qp78Qk|Gz)V1wq? ~q#q FYYn' [:9٭4oFhNJ^w3Z1?k;w5gaeoTٷ9J9!1ITeH,>#ǒ(k.,Kyq,m$h FjI3%(q8逶dyhi q}J+)*z=O';5(%Y̪>>4A&grD{ZnMC (!VXV3t#cH>^ĴX#{[s xV$:[u$瘹E-",@i|hp#,:d_\ȕXFG7}V[HԿg?%gH3TVk4(g4zOM5hƦQ6l_bS̾ _,SW̜FQyb~"6,]I{ h|JXXccmFg'.KOZc,>+a^&|/W˜]:4=&݃MF~݁/˫peP`]+*~g5]KwȎ^7ck1GG :8ӽD$Z|h,T)Qz^>'m >6,%y=( j9K (fjs*ssOpߗ'0݅C6^=B8fc" 6-\܎BK)lmSY8!UBd=J=N(BVɮE|ZhTSl7& Do,THE z\wGg/izؔ]WWPCCoԠNVi(yB *rEJC!)᠞4`%c-P\)FP{%`.OMNLoA7l'u4ފ}Bo~G,ukݤ8A]DZ<xᯤ P/cHk8|%H>_`6(kjqqN+OiL/:(Ѣl!{ݻ;-f_ ׅqp)q w~~8h=psz:n%ݺ^˃B8ri".WphRl*W]WTyT"9 ʾAf4#IY9kg7h͚lrŹ;*iX(Jvn6#A;%jMU闖((1U]r ;t9? eg72jciH8QcMxƥ# ډ&tx1{e]\ʁ)ILkCWbPw~T7<[A:|zҶ9Zu1kp)i[#zzg)%c>NqlK]pP~mZ$J=!d 1`X? ?<G lf_O/<ʂtZ +?=C2CpuOasVݔ5p$tm-[Q[ga3<5g g5# s,r!+n(#Zh7/ԫsN-r+$U6R;I2ow1\挣M7<|{ߑJP8Q18m* SdJ9E%KIӋ^AXSR!ԗԽF!4UL㕘np:63!Z",CU%c.x8sS@kLR;?>+E&Ip/պɾآ6qbâ?ˋM YXwbEpv;kP7Au Of.ׁAD;\pCbhe(H5QYT PM}^z)̡b p(["L Zh6 j,+g^`f*",xS{Y[a}vFBW̱̓-1]6)̚bsu39Y:yHxkBo==EX*/9G_ە|=[6S}w"9NAY33QP%ӟ⠕LSg(窋CtP7oIt({ܾ3QҞ?^`p|Dr|2ۡXm#*EzId%^t9pI \aCђFmqa  zDrpsd9՜+I!b[FzYb+MP!|ęF%B#L8)Za_X ms#e#rZ95l `J9-cCAG>DrV\$̈ug'Z0zŭgxG ZxBZ_qF0D>wʛG>!(*: DOBb 1A`P(W͂8j魧'rZ>C6ʆw- !֒ )5n 2؏t#IT L1dKPb 4=Dsm,c(凜?k.[BcJ8?utH/l&M0eF K ㆱYZ^aUVF4k|uڟ//ONifH4sK6S5-Cw`oҔ戮u; ajL! tMECm?B>U7$g `κ&;4AچpȽ7OyܧnNrhd[\PAb\A^7Tmk5y/^pDTw6mHp$r8|>@N*-Ə@L CзsΔ8mUa(b$:zReXLpt#JU܇pϮW#ڦmMey }r&fKgXC 2 ^< %bd!P-{é -7d[3 ,[ۚH!K ?rPPقy#_2Pդ? N>ȣ!;2ۖٶW1d&uu5RE<,jG^1{[ڲ*{m^ҶLe-=I^TYĮ&Ê"} ԋ[J~<@1,uz%=g5;'8cZ3:80WLǥUM&6;+01)|ζr(HRPK=dEū^lghF*;ݼk݆+@ܶozIA~ aZ!5m[E1S0ok{r}bU,rَlx Mg3Z98fe!л6a NBĵCnvp4m:d!nJb$VFMԅD ]ȖO# < Ҹ(+e3mV@R#F.@E %zQqM[Ie[wsBw!`<:,ʘ9d2Ӥ'>7J,ȭzNfմE=) ?䮞u55-P/ͪ3 DC.g4rlܙ]("0\A~OhvA JԳVaQ 0X hYNa}wn1 ꦗ5:_i!w,qM=H{6GM9qoʅ.iѿ<($xD1 ^WpoԊPNiR d+PyHu`@<HxkWI&YP%8 7P 7)f < G|ݎGX/ yY2fftiNMg!kM4Y"QB}0xlyŋ9WyCz|w s IAۈV'@AI iMIz 6ڑQrC:6hr6xtY'|%N8j&3ɩ{Ns)BI2~zY!'B#K5MWKפc*|U4+@)Mbe-;%ic6(`Ҽ,:j127"uZUXI+Z{U˰N؁>3s| g ǀXZ^Ev#vPW=Uj$R&$q&q֡&l/3,0z\#iқ],Ri,DHXJ~IyC7PHӗB/.vzC,eHVT|Q%mH2f e I˩xt9 h IIbZQpynh^J(T ?&e4Ї9;:V€f'S/p:6\vHC," cyRb⼢9Jt@LP)'H.I =iV]3( >5MVE5< WWEJ+b|I+f=7CQː&07c|(7)iH[Rۇw~Vͽ4C,uKTU'n&Ti--?1w^d&}G;ZCpw5ADO*R?Y]NdX4$3.U.YKڥCN#]|s I;DK]үܩPq_D8L*Դ՚e%Ԁ6OVAx $k&&&L2fDSKʔ'òVԅWRE-=W mA *[ Wa =z݊X;ֳ­lk=Z϶3&Z϶ֳlk=Z϶ֳlk=Z϶ֳlk=Z϶ֳG ūua8{Ylu (b3LCs}؃]fIb!~e{ 9z!xSWi:g'%6'=VpЏwh !@]ۙE#0)#آ8OpXub[8}i&` Fw٘Ò| 8l E&$Vlgl=iy^ݓ$`Z7r@J&ћ0I'}$ ]ӟP3` c|s<\;}yUv,6P~q^XHNdM^䎊1GLcTSbDԵŚ"Ms~$O*$b+'«'?|Uw\, @Tu`b貘I +-s4CUlŽA4p+͍ CǯJl!J`fgc/j8Ä!~&7a/6(]T( 'hqx"Q6b@v$kev83)>b@/{WFϮڎ!k$ʖHSLK5XYG4< {[HVȱѮ Hd~_N5a;+RbU~VmWp lW9٧ߺC(V=lC7 ֧-/"=C15.3S+o[3~q' &r0+-=riTȊ!_ .ӄ˴'$m{h[^qL dG7Jk5! 깃Գ#m--;N;:ޅuD^Henm- E2'4!(X$3^ex?9`L֓2r;-.Li.)K[n8%#L/p,|V7*m9.n{N%xAhNzט뎘M.%җ5Ӳk&]P?I]хĊҵ𼷓e@s=L8`!{,gPV 55{.d\;iBX,,tQ-Kl1^W5W hhӐ T(|7fŷ /q X`)Q2X۶al^UWNj?4bԟlM2񳉁Mԭ_;b:C16> r'Lq 68VA!4^Jl=? V=3,k9JSE[KLWe03~S ՘;bg9wdu->pp7~u$&>&dVm^i/w(MXdL` y"WPXW^cM 6[6c,Zь'<M(ʕe.8!Ym/4 -s}'&G4x]u>4LӃBshG<]p=y*jSG[>= hmq3 F6/o-p|nQ^7.mk:*-^{"k4YwMr\$#MڼUADCAE.]سƇHbg?p{ zǥR4>َLhGl'mFoC{V ZQ; Z{ {YO({hs{ {ɇHأv?Am90q^EJTY q?tOb7/J7hT#iׇOwb:}Pea5q?P? Z} _M* 26Oa,Jo8uZ*FD2(]眧dfmDtڸ.E)SKr.Zr?#Od67*! kA1ZfJP[/EBȰ-] zReǾ(Y,PcS)c1x}& Hԗi Z3LKX&+K~!uop0"xb`;jͅ~4|VOԩ*}L!9]$eQf62¹BEhPCkߋNLi\x}ֶ)'] >Ŷwbh@J.+<*t ZFF4Å}Iw^ŕ LkvL5iI|ۅ 'q f re{^5=Gԕ!!k7h'I16At35[k|Y4pv庂|]>7]Ja.}0UݭlO/( d={ɽ% 0i=b#trRK]`i~t[6d}3^ظj}Fl5qE-^niC:Vlf7G@,bPy&Ld*:BD̅kPC h!T$푥V %ɍ:޼1vׂ.B2QW얳AڑII;^gpx:VjafGatojid[ ֞c 1~'BҌܛx᜘`>4a|v9rTs9;c NQg3EĚɆƲNd`=hDIeWjM4^]ڻO^xky2֣}{( q~\i0K >xA3˫q'6CrVRxky,+=vrgba̛R̹zq5?4<~Fٹ_ubGύ3Z53EKNfX|r I8j2V m$PD-uxyDMv]%?j~)S樽sY:ph,",XyYRsX΃7M8LΒl1Xx~ɸ Czc] wPBȗN|׳n_/{ v/i{= aN$}pO,Bv1p4J}}KŶ1n8pW<dDJGX/䰘 `+ Ry|nxr/.Ok=܏O=/ǎLݖ{ IG$;qZC.vH߀l.O >zrޕ@tДe)?lCρ<#L^iXꮉ·Q:*sj&Hu%W͇8tr.U&0hHw)`:gjy9vfD!'[qg7_S1 @qChc WNH[` L.i$VǛ=u{JQmpD,S4Q:/WBJ@:-:,ʸtd9 Ua: _{pH9ȉ7BJ\-?< ަG^J,eoC@Kh 67J*bP 7WfJ^* qg PWg*Q7 o@^3hAgTq{G; Dpؤy衠R@_W*Ibg}>i|GC?nM^d:(tZ3,ӷх'&2S4NQPWߠ(d&P KdL: l S& GIƂIO@"<KpT\"ŏIjؚPՍB*r{JT$6MP \ZP.D"sK#c@~7R~'Un^< Ul\5eYM"x=͈n7DD3 p`4K|If/y\v+5KE*S/)SApµ'U3|PxBE1aox) hPxU|U~:ALef$%*B̬wH]Tv*  9.[iqƫn(_[!-iA1#җ03L8> 1lFU+,tz2!0|OPՍ4jiĝBDR?L! $vh@t'juG?Wi)IIumӺD1[kfF :nXy? % ʩQy9qh>mӬ ҰV!J T黋ʗ}6*LkY!m^Q SCPm ]I =Wֳ`yuۇy(V'iw{FRsIIU^=ɥzæ /Q<6!OugyB^sVqXÓL˃sR#7@H7q2[C4Ω!OǴYO}% =&(UK}1>53j=o $. 5^s!;6<591(o1K9/%q?>?Y_GBL>7."FxmGd7b$ICV^cD y d slK{sTZ(fnؗO9>E1`@֗Ӧ(&0572O~'/8,1NS<'A^FH< M,4Ú Iʝ嘊iy{ $L3 \KPvS͛YKwF8cXa d> ^@y ^<ȥ|G.,eA # mxM@Q;y.Mǹk9ua( OkWE72ȷH=^&@ yzY3 L ,A<\#\2tNj 5Q?IQBSLלv(5ȀMr[I 7(Lmr浣KgNN j"҄qyF޺#SvX !ǚ9 x9HA+$s>HTr>Sv.X4Z<ͥTk֓{ic2gib³ɌR &m΂ԟz 1! xnsQtwz꽹ml:y>{K&sWk&ۅ/珺ɴ ~ 6ӊO>)Y{p 6r[!vG7r^{L~ M,FQ,ANNZG( ,ѝum:yu ؂,Db<~k \hg4|\9*" =9-,Nml ; Pr/_32jϙk̸mh!橑EaӲ"cXu\lGa6/XNk~ 9n-3pnRQk)2ӵ/*N,d, hȜEk#7 MO%wGs"is1w蓌+L.XE#b|{14<HzX:%jP|K8p'rYޜzw,b  x}kه= 8*2vy{|q+w77M%@0, ^]ꩇ&@X']Mb9*Khr.lJ[}ApTtaMv, :JsA^4A|zr!nc0tf c oϭþ`F!;N/AdF=b|0 QX f"18ETA2- k7Ia%Uz*o<%$#;T^\c>%ՈKa`{6_є~h ΂" 0 3ťpJAfٿjX^9<2.VCDL5U[@T{{ )k|qlë?1GaS̀8tFuM;h|8[4Ws֦F=t  >UajyM|B|d3# a5v(d VY=~83&-~Q7+z.^vN'ۉ烴{f0CY]6ЬxGVxqPp0.]M\Z-)|4=cgÕ9,GvP JMUGuOx H[;1|~~Q>T"}iɰ9h+2=jwQ6h<GΩ +|]ݛ0? ;Rapk<~U,<3wQ64T A'9IWmĘat4 >lHl"%X;<ƀwZ n&F1p{ I$ӻ^Վ,(BaUoc'GO6TMIQa.{|J v\ֽ-wJGԇzfe1^v9[H{HHIeg;ԑ ʭi8P5Evy *x7%o _pz;;Q`>/ Tڒt$ *a6d@nͳz?T[P¸s12od~'XIPֈ99`qsu $? :'[Z Ѯ=w1'0ߓ~pJָǚ4< LfaM20!sAjO2sJ=Ϙ N=mSJ-6 S6d]qhwH'^;*%Yvׯc%8G:ƕ+RvyO''@زsc4sl@cd?}%l`>}o/H,9Ɓ3)IYPb$D$烃t\z m.#:Ll`g$w oI6 k&50u0xO4g$X~& yÿ(@j!y޿spY>Sa3 `-䆬 X8Nm ^ !HkV/"͎\ܼh O賫x*Xe42*x9PMG3w^E1T.B' WSCg|7朾7<:A6.vȼc?opW-uV&QZ+=^v >x&CAT~'ru5/Q:5Pձ. %pr\FEr hUF1 cSYET`( 2,&@yA{q6*T:mP98o=i2 E;#&{%sάHnFo,q;r0a&#u]lhSז6#FנmMF@Y##MOJw@<,'3l%ܠ#YyUҴhgQ=< [ #tձPt8e m!BwpȻ~::ѲeVzYu>:GCQ&`4VvttSoo[,K-;'—5b?|7 $FSD=eZV8a04CP&v3iytW9$pJe$=M:PM(0# `8t\SM]$r?E=w_Yv?6I}m*gaW#G"wIQon* U#2Kѝ&%fjHT3]alVYL!ЩZ{\A(gS 9lW}4`= `BG!!?qF]Gn8唰Cw#JDq4cłjj^֣~b H"݌RKq[W#|\D*Lbujk1$Byk7Lk^bS $ZA9ҍ: -e"oPE Ewm& v?r&CyVa bRe>z/N=ARw!؋$(W V9O7o@=`"mO_ :Km3M7X@H(u8ߧm T\ld-ʄ2F0eOz2y ܾɬ(Ig0DbGos" yhSqlOqإM ¶@nѭ-oxsC]~ ~B2-U-At>m|6neL\՘$1~k`p%o-Ȅmr02y` \Kpޯ"3Ls/wcdlC.2_C&MBOCWyޑoZi?2-.V) Y{߷E2b8b]@r,Pk/*V!*R 5xXhFWCDEj(4WkHk}aoDlr!Pra<#M.CѐL!4r4 9k:р^:WэJ+  eD0м'k;tgD!b L=z5Wںhem#%)doFKrP =ErJ!r0E s(_sz]>U<߆>l[ LZꈋZB.!m{엘'YJYc!끏d>=ˢ$o+[T,c9Yy#*2|laQR ucQ#d_/dw+Szes{]T(w{w6x6{;NfcVCjqG7>Şvl4ҩc"f Gsqlj)TAJ ¸-6.(t8T> :`oץj3ϑ{@1k`\H8|ˈ?ÐTA# JB<*22 x@p5'Q`X$0ȋ;r5/~F% Ř]m"klics 2%Rn&1H 8sH"=4-8A:7PDwkY^0V!&,x 7W$_#)pp :bBw%CYз|wp9( ,MZ#ƪD+޸GicaXKZ;HJj-@F:L>>hV=Łr^k4s`0&0-Ѥ~FUsPwG!U)(:y<{&3[yȌ&8)XU;!g$ js!\Zɱ ǔ{<>cظyS{EBV]oOGx,b.ZYV is"gg|.{zHbg8-*eC80YΏ)u݈An?H (F囯Bx- [/!)8ul' okG僿Z5b㘣&d)vgiM3,G<OMTz8Y i ~& `mz&Z=^Gz6}SN=I.~Z:o6xxƶ Qz@77[rv 9ҒI-5Lg!`ƜF/J18cp 2! 9atݲ=T~}y\֐A})&aKTEhhl\D~Njc|SO5Lq ,{luGX݊\|L|1b ̽>#GMpIB(,yg;nֽXK]Z"2mtG(r`<P2 !ڬ+bnEEyC\?^[?c̩nҍt]пZN S80$Mc-bMj%M˜HyGrOniA7| +U\Fm;ږC#c ."$ ѶSf"KpevSRa~e`^o!-k{^0ll3Ge`cU{= nR'a!&iak3͙s m!>'P5!.UmAzF*PVUU?)Iή&!QcbsZGxAk7 v fPO~tM %6&a(Y[Y2 6ނj>u |\ Q@PcBp h!B:\>~&lhI&e"0{'CeްWwXN|\k=- h!.RJ,NBz6In"gB32e|C;u٤*aev:5#Nr kXly3V1. t|uU﷑FIk 営}h-NX_nJ]~%-,BWY LnTk>Ī䴿ly*gquS8CpqCXAufkTbngz)xs`Sl_.՟ӟ 99魿{IZ {%BM8bT~zL^.'n1|dB*0s3pYpwL FS3Iv||H0yz6 )C*)lv&Z{B * $cN=y!%Cɸ*Y!@5Õ'r7vC̟$*uw)Z' Dyo1FgՆ퀎iet~rNn+B$dy/ńA\ftl-jNȤ&C b!48Z)CV8=ULc%FuA!aCUl|bf343}5vNQ0IL[KTvQG#x?$rbuz&$ZMK7dF eU&,@>wW^Zj:TOJx , JpG̵g?I,XLj" qCeѐCw4!*ʇź)]0>Wjέ ư=@^>iJڋa%m'7fQԙ}PwE:x3f qۛ~5mAeR 9?d$5fi !GjaOap`D{DZ:.i- 0]+ 48{\5;3Bs|0JJOLtzLmmg.j06nFc4|ttc*x~ݥq>8[lD?-^CsX𬧅T,iFZȣn0n1*2W6I3cOhhLT]ji(5Ap4\[`X?u`T 哄< 3 ٟjzR@dya_@LmLz/cZڤ R${І7(^d./SqgKhe\wX|~Lw|&)V2|93KðT3U^ȬhQ 0*'kf675C3";W:py@glc8\y( Ҳz;g)6MŨu,wkS9M0gD..$kŕܖ-uYl 碼ܣPcؓH UcX]T؈2K'DQgux4e{$7q4̆鈍`p2ؔ8aq121&9@BMԄ['Ѹ?܆],DR <ؒȪ'IY]cN G@oqm쒣V֋w_7 I9|f OS=,WAZf^rl]ѱO\!t2l\matSvy&C [jn᛺R/Z !]0NUHοir||U1uO:uE)'E8dJ7AxFhLl蒴J_!8tmMWZ\齻ف̝B doy|[|"dThI+Iی#Q69K)b2AT2T2eqrx$hEuVfƘn6Cz"^Jqj{LNf :8 ]sxd2=Ϡ _I-&kvfZ6"ݞG__Xxܔ ⮐_w~\Wr&Nmz`kk!AM \Zp2הMQ`BEv|>* a)~GڃK[\fyl"}O-)$?d<u){ۦh$:89qSrC5.xFlHAӝFCC$'c#3\3iec7Fd6'Ȭop,M0{y7aU;G IhfV>sݷ*Iʑ;RSzżQo}SQDm7*+an[Qk$(TvGS+QMXB,~z*wľh[we_@FnZ],v[쾸C"UPU.b/7sSǧB}=Δ': m mvT|oo=7 $ivaZ)t0"_=l@ZaeZrӀ/B p/ TTkpПz3ͨg\tF[L_`a>z@* _БQw7R#r*o$s"]0!@ѵ[HI,"`u_k[ S6K keFgQ5]:PrLm(MZGMp7j/#-S\ŧs+ c.^&&~ktv9w3 ؅ QXzʋݫ|'P̕aݤ%Mf,A$S%ڽ;# c̸!O;ƕM&5]lk&w2Ysi2tj^;ۆO>rLB87l8Jl k^iL3blUP+YP /gi&y6'MYgۺ&5\~mev9e֍tZVvrl/%-VGF-<Տ>ڲbqD-6Zz $I{@ēdpXXyA';1Fĥ #G*9,`j;N]Sv>9I2$=c3xauBb/eﻇ_<<_t|My1!%q$fD7\lG>QEI@VoVy"̙DtmN>z^.B4$\voU4렱2>h<k.6h:tH&go_ca‘"fn͑O M 8qN6iA2nweuZ7 Z7kPטXCljy>t2|2e'{94=#W^ѦB XIljlA' ٚY)ԅ"2j&i!{{eBX0)7b;|3:mΑ:8xԳLQ俣޹0jM Mmej3:B2X8DQyw Ҕ?dqziwnnn_8o$CZ Wy ?:t7c?$K[]2Q(bckkg&d2Ū^W;7U־u=ydUNz/L8BC9<$|4=Rͅ&q(kXoT>p9 D" X*I:va|S̛8B`Ɛ,49^ SHj`uقh4 }\k߆mo40+ vQ8W P4 ϫp|ql 79dI!=qՃ~Z8?St$[% #&K*z);(h҄|ABtyTn&,\y$^2ZF) 坫Q,jD^']Nz3Ἅ[|i&"3U0nsB3qR!|E}2 8+=)qҁbSHM,+%5Inpsx>j:~E 934E5 ʡUi0I{Mbu LpGcԷ} 0 Mb?Ti({^"сff$q4P 大1r0ȩ&Lumdnwf?,C _=\*?{~yznp8?2j01:ha  j*mU!^F>06P8 oqL=5[sg4nG*x7mWcݧ:8ٓ~G I Io:4f4UA̷* u?#wHwP>Q0Mμ>y7T`Y L^䳚hk(od<ܔs9m%4`:g  QX 6:e 6gI?q5.#MO-\i(ᯭa!vzΫdN]oy-V8g6q\Lc4q"jO jO$Ot˨Q^4ꈒ&C&5F1AXP\bhCf~~@Ics/fZA:؇g:J tOd𽳃`b4څ `2l EhH1֠&Q᧽XV?'<^> e% jʂ@Iw_ۄX[ yqv *oh5[ب? ^̧B^.1X~?)]ѓ;xP';M3YdcY} ̆z>l-)_F8 hGbR$R>Mz/hX i,`oBPővU5YsDE|''Z$~V.yVwtap C߼L݈]v9 Ղ zuAb6⭕MpuN#CNj'vp΀gY4]v`|l`faKz01B_σy#3m@m.ۧ (3 52ɾAId(ֳ&z*6HM KV-+ SAh3z)e]Eىj|3iф$y1Zoօ[*cV@$*Z/8j;n0Ltl>79AǢ-^JeB#a;y+ | 8|)$8i{$@.lA \t S(CeWQBfGE_[I4pIN!ZYeI, 1 }SGӾJ:ϊx!S:sFqs7Wx[̕k `.鎌?H[EBRMGg4UW" M{o$;T/&} Y4kVy* 8I(ܯ,MB?هIx><(7-wpr%C©Sy(^ ը̔;Hc o3E7/ &>/ib2Rߣ.㍎30P3vfl'Mh; ^o-.3j6wr8KZ8q{fR^4n0Yt /6Naji !\ \>=@0aQjl?N 0-9Y׊{+0ÌQ+KW^x̐X  a ӨgӛO /DR3r8 UYP3vkk_W02 JyVj8nR.P:jMqs5)g#|,sԨyu78/ySAj3b>䠲{G{(&p.cY߾YܽU$)b%-'fE} ~xuCFTuyDw¹%y1SkH"gQId۟1礖i 7te"z0jY{ʷ<AdR--n9$E= 'Xj#/Rub<en1zv+(Cw10Hg/IwpRF3l,Œ'[.jɔ9shMt!G:뗀 B{t&5t>BuSR#AQ6GEb}9#Um`o7/U+)'( RkmF"N;t7c|@wW (6I-!OtY6 Y8c}ߚ}*5ƙ(d p*%^( ^Z0Am@4Rg)K gICls6|f+wƎGXNWyESi cL@yyNwhB! ݯeVј8C߽RψLzyfcBh@&9ٳ?j/VHvƠO .bV69=VQ{/ #ͦ IA7SB*--')%F55 b +X'Kv1)1"1}{ Ns4A;Kz:؞37Uśó7rZjR\EubkC9m$ Pqm/Agno zNO?a,OqȾ-qmmZB/X7E;q杤A\9j|s_\BBRD| s\h g~Yw B_$1@]-q ҂Ño(Lv4i iXvM(D Fi&x'f[ݠm y^IS Z^#a@eΧ#FCF$FLZe"fM :Aͷ$EOZC\w Hs.} ̗u֛dK.{H̻q:Bs7;BMf(f.?Kȇp肉ҟM J7B5'3;k j}4v%Fq+|\8dRiZc'#0:u:%#1#:s|]wiIwh L3g$ ٹG(Ej65d 3\#SuPB>.HT~hb2 ;<$7 -aNY!V֤Lͼho26lH4ϟ[{e#A%ϙf?F OeΡOL>Xa^fG pᙊz1TG<(3H '*<~plŽbdcĮlû*n1L:a wSiEYDtv_J69_b=vEKVvQu'uĊ_}RVgD3P=Bu'|+&*zu]lC6M`dxY}f,+_e}.õn6@%t5Fy"P|z356,:$sJ~h ܰ TrP~ |r"ɔ{6),P?(Tg9As7J \h\.jxsqG="x6cP$AR7&z౭mQ_3sfYO!8BR% 9 /] *5OR~b]k $q"* e6!FRtax9>ߨ~Y=q,1RبC;C@IR~ΨgѳYgb&ϬL wB;Ѧ")6lbhV_ Pc/c;YZq,Gժh,ɋuy< ê+ 04YUгc.m0Q`. 33֥5OI3Or(ڗ C7 [[C9;Kq_lQ&QfT1 +J\Qx`ÆbΒidl BN /p2C[e2BGifo!9l:͕WZB&J3K䂳ّws0hzT&L l ¾=oœid$ZӉcI(u7㾲 ಾO #G09 l"J-x# XNټxU2<[K84J.4bKb!V pto2|J^3/br<ٖ8\!?4?Qc$r8WgsGi@c)Wԭ~Nkz6X6J\H,׬F naNIt/.,Z T3.PZϛ16LJc6$#Tp$G:0̰g"fM7%yH$-ѫ$ U!6o>弚=hQC}8U`Ma&*7H2!/Sq} ɋB+I {6Cl63,xofı+T iS M :U@N#o%=x8C':+RlhywiZ1w97Yce$IŞ oHh8C`28yUŜIS͌Q)L"k"EpfZ2!l]f&}2,WM3JyoV5^h֚m\h} &tWfk7cX# 'bn۶3I3%V9beHC1M̒K+5֌nppnt|:K^OΑw< $8U `ڰC]ĺőӞדT>ng DAnɡn$Һm݁e C8ߝ7I[y(A=>L8u3̈́ItM  RLoYƲ AݮbsTjθBBjc4H3 Kk;2J*dQF0d RVD#U]9otѕwe@V ){s4wV"tzPp1~L2|u oc tJ2/}ر+fA'03l?EAGPo7i^2>ÎnQa'NeMALGh3vӐag)m"O[&;uYY +1n_1lrF]Ŀ[Ag"(Q)<~l !Yywoo_m.7n*G>3`]wAр6 -I+-Jf \Lt!ͻdlz1L?EO?ktS$v!*!qQfERV9= LD`QZkA;2xfMƌa{=J*|!H1 ouULnX]2ȿ`PbZE7lgK% xa*tYQ+'弫8W踟vIp;?mv1ձ[:utpHO;{HXTg?38sQ s'hXm@h%Ő&hXݖiH/*874Oo ~ULw 5Ē>mƵf7Z eh{ iސM$G 0ռ'R^'BOc%1}uISni /߬2P# !: LIᐃZ|/酘oEṞQ'Mtd~ah5X#4krWل3$2@0Y=ݤEfa~߰MްnT@4d>ܜ<.dYyZfp $>NlƖeMߛISGv K%W9АP %hk"418#䙣W^/[t I}|ݴb窌D}aHY=3[P&w(cICyY_txalDyWcks(Kn7ƺ&eq_~ZL6H 8ouUȶkkJ ySSoHtr1}ۢ$ouqSLʇKADk7KiYܸISHiN~[Ru]3>ݻr%pWZqZ3{8o7k(l(U#r2bkPXm1(زv @J+IxZA0=8HkQ"K2z,KΟ[A:UKbtwT"MТpșB[{Ԙ3w^n-߭*vnK& ]C/ Y+e^F5q$G=>5}Im'ٹH)ik6kU_fd8\o5T=M4*Z$԰쫉~ ͷn^w #K6WϞâ8$1S'k)\&C֋ @ +"u+2@ -U`ky6Vuߙ} .]]^sP`!iR&*co$5 rT(i̪dtG(|@0ݟ婫p*1]갲XGbj2X%WLtL>AcEGԓUNj5:lQ\klj')|L^8jA0hs*F_Sȭl7be/ij6K50j 睛sa<4*fm8z+|Ӎ۫T`.Ɖn>7 OGFcv˄5By\tgTDƨ}+CJTJĥRӭ $W%]cYdEWKڜΠz󨸦~^_?b̮339~  MANB1hr/kw!6Q۲Ӂ r~(4zHpUO`'W͡f})3MgihWt9$exGލhtD{[Z9u18묆{K9N\\W%DO]%]%Ga9'a:VB Nq;EH ?֙pOURQ6-4ȵ.Ft%NUij$sB]LSX1*6g}Bv0"܁" y"gB:7lmQN]T?Eiig-a0c?kU? 0%l )YW/'Ÿh"5L+2>YѴ񟿞o'zf=g!u+~9 ](7 dz vW^Rއk\'0B󧙰!6d RCP:w](e\ETq߫d^41y8 덉i2#Z+Џ!.yEɄ炍",b b,p-sN W$IH(|iAԖwܛĘC:Y GQ.Cx.dQ筿 'k\Z)`fѸ"Aoo/#sn ؙZFA# 7Gw݌a6*9vt2K)\atOiΆj3 !XvZe%؀AOLCd:Wf@P;VC^j;FKr}1 Ɓ5&vrPIIk`' Y×.2C#3=t6 0"`o/Pd]ֱ‹ st s1\krՁ ;G@ F5'oqC,#:CB[+3_pWR?b8Rp:Rщ<ړ8VVmlT4zUpqG+t3Q=Otsl|pHˠ6s15T7F tC"7ӂ)&BP4s s@"L l-i6qPZ >Zoq}n z)TiS:ʸDۤY)T`7db Y>XUpT_>{a`fqg;g됰`NZ;'= L->n4wK5V IGR ,E8'_ (I`H`Lc-f"MH㺍-tn)!*i0nYcPFWO9mwx1wVɻ71И[6ܯ U9 [O5*qr~s7 U+Fyג2PF"om6m?AHփ(8˺ӟHdz$' bUİřlF3{WI#YEمu 9s.O:}T}#Bo$˾ K4|?NBF u[q/g >8g{ty* jlBxkw3N1(V&d-=Οb(gއ O4HP.iUhCbj*G/h8GH0E[<5T*Izb} 'JX P;,xc[똱9cR2\ԍ@EA0VgɟM f@IP~|НQ{\3x_Zy8Wܼ.֋&cwQ%%G9B-=>ez)V!Œ]I@g [ z0=1ɐqhyb!$ ;d=zg'*k[fL;n'BDl@+h䭈1``;"TWɥ1ogv9qhM$+2>>-jzt:QWp.X'=Ҍn)pQ- .: ; 0|9kLq:RaYD#蹨H[:zI0 WjV9S=ă?9[5; *ҨC6 y4FeCӡqh`7:%lG5:3YaI"Ӣq GHĞyJ8DO;8Ix3'Pg26gZzcU" 7` P55+]yٍ7.)zweiP0ZŎs?ERBEcJtȚʾ`vigQq>H$ϨL9 2MsQժ*QQ P!ٜC¡i9Ly4SPͮ+x..XC+ {| 0|ς+ujTY| jvRpٺ_3=8SY7§'Է6csh,Mn]ۇ\_Zw 3֨h7F&Bu*Ȉ05sQ5ѐàX VrNR ƗwGaK;&Q3[-X)8ܐL!Mz$#9R&{g{wEQEBS΄ jM5|z^yDUIja?mcAHgOzh+ЍBRjx!0{.=N%Q]OIO 5D7)c!xɘ::(|bN=d/)|^C)zrw=N3y*Guhwqh{扔aF0R枰%(5~Ҹ)Ϳ@5v9iAԢm)ug$pۻ~if6XzeSvj7%inBpӮP9:ɫ~0x,q|ʋxALo67!5nM2|q+A/eR_15챠{4Z73M$rɿF lVQ)ԷU0f0,`m^ WZ]5 e!kۚR)Q/IwOm4 ] [p !>(,t (nBG@AtbtZaZHHcr@U"j -j`@ixcꖝz KIN6 3)->0#xjY? a-׵vehV2UUVz-wGӳ~b<3tSSmFx)6ZFv>:軴0ps54תL<" YMc@"Ⱦ)wt^dMi&HPtc+hm1 H04g~ߨQ·>A`wJJd% DRBugޝt@:BH 5N;MmcBN)<@hdTABo`E.Pm +GR4/NGU43WV:&pP?q5^,`[?{Zb+[['BxrŴpe~1t:2g2[Y99SAE1Dݫ5`i 9qow {]ޗꡥ{$gNk3WӮMK.& o6HD8~8/(!p5#N. vXRNCIڑrUb܆'4Rw^_l@!9%u%mt Nfqnl:r(3Qě/219DQ Ӆ\php);HG@}] .1G _0ЙU5BQA jҷmrj~l_Kx 6F q4ѓtNc1HJAnSUrXӆq81n_\HZ{9٩0`^U1$Q1&W#G\V ,pCi1xDϳ*5Q@kBh^ NzY|:;H'Q؍Ұ5H kowI82@2b-lЮ`S.p i9`c|m|H. O5{*x ưHzQn,H^I!2CAcC\)Sxan9|a (*Ȥ[xO ,@`\5:/:B ƫflvE㙢Rm69&XN1s&5?\1m*s=-2*{e"NݢЇ DJWΤꆏqpM]OZ.!颼mMʜFN'O5ϊ]e=xQr1U4SNw~Fc֘~^;%^LoΑM&bGw8$I-oPz |Ԓ^E5=W ;IrU6jg{X"S;A lm~Նwd,ЫlE8D &]\);!+6*͋& 3\qZ{)x5d9ÃҤ<`82"N40rp~}et&vꎋ \XyF5%M#B4Θ,;XQսĕF0AGaUldZ.ϮcWӪ?'qM3|σa%;_Wf+fT;jrvTW^EE^p;seZv$Oٔ`VÏq/^Q=rfKlv~Q`IQOwtآp^ꝕOEP+[seޮ$WƯ7Vrﷸ{;ҬRa&Q,nvw)˱t;Wrν q*[T~Ҩu \]{ gN(ҽx֓ 4P2bY‡Hy *2U:-CliX?Lz$O qNjŕaS'`7٪`44UU16d' \=ECd`|ѻ# 6#&%qk>i+i"Ub'x>8s|#l, (̢9KjOkJ}McBsYHdP̍"z51rc2qv N GHb5zkEM~,@kj"U*!|g>}`f^3sL/6 iae(YR2qdS/w5$]"6ǿTaFKt$ﬕM&nBۜs(dwPv]iyF.eLb"SпQ ȩWbjRyRY4BV'UY"'@U!mjf|% i^c:UKLCk4r'.=\0ۇ~9?\ף}lQMy 3X.DD$kttsJۦ,fg<œ(jqs)ihkQQX"hVҭsF;"P,#z4K-ua~Fd1Td Apu4L, .t5V6)MJyL_]~] eLRgo)G, M*tA7spOóruW}vR0,^ۯP;ergG0=Hm|<<}̔^D+?,bX[k roo}R4 Qton-ʓ^G{ckG ŁI}<0xS]1XX.)kfxO, i15wŮ]4?爵{&.dCoKSձ߭+$֦PlW_[[NhN 6~F77u8bg|3(Q0\zY1>5 Ye!$`vk a4l6vuԘ%Alx$9mcÄ~m40T_~\TC=3%:ZxV4]eF:d,ʦ9{s-t x*Doʽ;bv1" i$uݝWǂf(H ;gx!^;#s4)Щ1yP2a`̰2fZ\/`S; D4Dg(RF50W5=cT6\Us Gz.v#a5]짾t=a QXq6/ *16 aPHWrԿIkï dܰ nyEO6QmTİ3& >`󏲵2̺ Wi^a,zM*='R6qk)dhyfQk.ʄQ&&SU+&ĈF]4m 6r$gemSX]n%!BrxꚳSցzǫb'x'M;OٗM?oozk$#ZueZu]45]7Py_k4Q"D=}Cƴ8/l:',*9G!v!f9aMlIaʢ %Jv<; f:`FR3\z"o,?Oid ]O7𴍕f={ã`}X̵wCwn Oޠ'(**~Dlq5qɛ;f|3sYnҬMvYI~ho?~?GQq3b}Y ':;*w +^KIKB+(Ȑ38C!~?ārd[~NA*Q} I=] Fw",$4ҤkCcN q;]v#%N]͗ZxTVe%8R%A%}e3b{2R~CWUע;SH⾢=rʟZrE},"_'z|Χ0.3;B0 2n9yDdl NNO.9A[~nb5;١3σyFvzwwں7*覾JhVSdV;x>+f 9=Xq}ZSR/񝔱giFsO³ .C Pz֦GN[1#$43Z~2U91K\[oœQ>G̢qnVܢ:ݘ] "SP}[)fFiI[A[WEJBF+0:Mɀ#|i[;D{v 8γ4grʑ|o)Tܪ%ohp0vu-PSk,g+lvt37){[J Ռkiv2%$>637Ϲ\>ȸ 3ڵMϾq.3ܪ B=s&ӿOoNH! MGu:o@Q(s8{^Ua`.=|Η@(?mlBԆY|o4i[✅_`r~2' I|Awd<As՗ GN|IʫW9d6$,[N.uF@ekLo~44Ҳw'{U:; h5VJ|/AST#”6vY7ٹ+ M7=qhtlvXf1z*Pg~-'=i 8S4c^YhE}%+ԿݷN=qT.IM!.QK(4jh?nzdI6-yJWt KKŒƲˮ4_Hbs_̍Á(Wв5ubԷ^wMkT |Mm0hT14tR5|ғ3`?Ӧ:mMb΢ħgFE:+E2OcM) z ?_jiyR#GMSd&>#Iu W:uN.RTzE%"3x`53}"2-s XrT֫< g6uXNKˋ)h]@#'O-vE6 &=JJu7Ac(I4c F5LiHoॱhЩΆ`>d}LsH.##*R9 n 7-"}CE&v_R#݁z1%՝u+䂶TZB+)$5zb6)9b8H# Z~M˾Or 3ԢAKhۻXtrM8hqE4Ǻ(9}c{*%iH$l2 u/.GIǽ]ouuuHK-wv =?.OFfq4&Ⱦ{@dj/Ẻ;|V[KO@~aqqb3<@D3\ؖgV{@uZvO:($hrϦ^c=%P?󨖠RRHHEG* `BWJG.}Kէ >Ǖ˭`{SH&)hZ{]A"h\t0}&=::lI :Y}_aƋ7{좓41b$7d|Y)P`BX=ɭڭ&nIYyQ:F %-si%߼m~7jFv=}Ė^y~b OR{6ynWN<<7`eB46z{A \;u<:aOJe+B-Y<9^vߝ?5Y\?&>8gutfޏh4q$hQ7 d\cya{t&a띒<9jyQz|uigMLK2VξϾ^-4?&͝=F_q*rofn}Vy-s'_ vĥjw}*[2uJ{,X3GluPߒ+}őv2|m-6ߵF_IG< F_gK"6i "_Ue}ZԌe{?{+mdG"G(_ lo47~SUt_i}d!u8gCWU.(Y|NnmKpg;+o;hK'޺mgi~'aYt6E ]Ks0R)0n&Z0qJ ӣ{ $q!wk{O&jHHBb@$3ҡ/<੯WũecYL(/*JAaq|'KcYcp.m<v椨S1)mV3o|a6 _Ғu^274HkelԖ28N՛&t(n47&mB,|jػ7з Nc%;{?Yṕ 6>ccMGoL޿[pՆ)$ZPMˇUE^KYb4>I@W+'񓹊fĕ73u1hgWPs{fkY骑T^9fۅ0ٞogMg׫3ݕ5 $t9;Xhd-\-bAf8a<eh ϖY@ MH$C$aw[YH0aw'Qq$\C6k0(F15|tY4u$ =IܕokWXV, kp=CmP!jBzN.Uř",A)u&( W-pypY ~ISy. cxQ`uJG$[闧W^̙pЪl +h3If{ҙsȘʃt*&~=O} "'ƓQbȔԎTL<=oVT3Btdm#-rAG}q#w@װFf(yt(c4ޞ yC2PM(t7@ZRyB`~$%[8B$Ԋ:m0VuyÖ<\sgc{g?,Lu9;i:l9>y7baG*jbf >{%3dN 24(q,Ʌ7}"oyeX*̝R3~y5_}0cf6!+hÙnB]iv=V!1v2/d%{jij EeY:,9j:̞@83I4/ 8Kn4zmCUɻXL䝴FdѠS5"knJJް 5"{ #TĝE ցb3p[4 #Q{1 o-"9S;ir !eA7/I?7^HC.]*C[R#\7(A:5Oi9  gbe4ɽAkEGPp5i~ϒgv 3[ }z+t"gX՟IMFi_:QܐAc~Dܵ:lؼAI~l1v$W.Y*~43@ovM_h8 Z$`hw&;W$ T礳hݻ.5ؕ"EM?\F.1ydGъъcw؛ͥ0GevtLX͗t Sjj@xw1@|o3~ 8ߒx$*ڷmWrhF*2> D'3Ɵi(FSTf,i~QF}ڂ%7.4OMNϩlJ.5@?~=#NE3kjLPݖ \d]D"jMVSJʁɠ uB3D"3Nw{ $U:hjFffxeCs!Y"=>NK㽎1Zw=G]ZڹVe PQՁR fԴҾUOYO3mg C5# J@FׯTN6DJ4.MɇKvi:w꧃ sbl=W469(re(uڠ$cnmL^*kiURw_QB?\9W>,]M+ha FtӀNAhh0L^BcK NjSk:$$^45 RF_睪r%eLso<^l+5 !m皬YJC:ٛݨuEfB'̦zUleƆWJy3Gv胇&zR<",ʦL7>+5;vE, {'^tv#g|#{?$ &uQu!|[L$l_p6 i&C)mga;kTC êk5 +NE[TkFR9|N;%rAH93w^U i8L"My{{>ЯX?x*ð!:3̯6.;Y \wZXqj9szw璯TP&ܙ:{xE*QE}& YNKQeeTX^V$D9TcH5 1ߓ?h{B/ڜ(lĶ36m6)wm^%΅^{Bg33rJpm%l?ZNi9Iy!vIQ2AEuzv'5v,җ(:y\lU}>o}hf/{HVFK caff a0Ynf\~ RIڅo^c\H璝6+s.T]x-ˬaq9g&s}|W9M`7AMq%}57pS'!9 yjq qlS0i&7Kc ѯF{}I㷴p2_otm=sF2v{m=x84}?^}R}ҋc' "UR>M֢@H (FIH7̭0*zǴ_r];4*]\ #i̚Ga+2i ۍ뛮K'r˃FXTB]EB=J᧽951ګrr'gt>Gj^ >FOn[WU>kc }>5w~Np{Y~āչyHఐCyLS#@Cl]4VvdIރ܄~Ki멹`:.)OENt~tE'_N_(_u>j7n5ۅa-B%f ~۸UR\a<0ʇn)" -y0Ok)HwȾjՂtj;kw}_wg{F-4#s5|1^C;Tr}-?G %$lEjϽGp%ĠG.`n]8PL?rF\z}b|SkMG~تs6 x1B{.qWA]u37Ox|G JL49I1CbQm.+958c7-`&Iج+H*D 혵8g}bB܄rzjHZ2dG8!"J~?}pQ\/~9;x[~a3OfY^k]f,*aH² gXJd}P ɴvDcOqZU1v~q+ 9gp)&0Ja(wG5$׵jq"ZI)Hr$լn ƻJvpE:Y/t퉝&z 0M!t0;]8o7Wy&fokÐeń烼Xƌ-n:m,hzs=7t=yeX'*QgqwY;rX)5ğ՗/͚TgC9ԈXoΠ8z~ >_lУ=~r 6y|.cI8mvZ <*rkâ/ubMB XƔ^xF^n^D46dvtw $\CE \s\*oG~[ sI-SRӾg1UjnWDoD,̆jp8z^q(0C#"AF0q^9rN/f}Pe cI) MtT`ZmSo(Pt( /%^-gaӪZAM֜YsJ+"8iR-7j !Ce~o`^(x3"xqR:1(M#םZ1Zfl>k5I:k7?N0Mߥjv~ފLJXQrn.{ҁ2X6ۛsM΄;-Yl}_aE}7^m~SdkPb̯{\`[cu_Y+w`1Tgfn9̴ ʒi.7HnHzo6Uߦ;Oi-bo2UQ?Ak9*[k%#'D|ftgom֭d.$t7VPvi1ĵN=;ScdMCL2/Qt+韹u ݏNq!?hr.zZR m.qf @'&lMZTd=I:a`ׁjdl=PfAGI{tp(،>=яhiF=-,!f g=@ tFu9#սǤ"4ulibzypp-17.36.5/tests/data/openSUSE-11.1/suse/setup/descr/packages.en.gz000066400000000000000000014201001476576476200254460ustar00rootroot00000000000000ۚHpackages.en[v8}W`yOK-/wwKر'ʥ"! I0i[u>6G]q>u.T~nff)VtIFWE_& {]5V  ?ĪLT *,Ku }ɤ'iH{b|`[7p3˫f픝cʊ$@sAX/RŔԀ/M^e9;z)zU(FxXǠQ!. ;C #3#\O$ȐOzi\sK3=a귆LJWdJ2kc5yIȕfL 1M,7ъ$+=IIƲ_k ĄƷ@B(3@^z "BITUPZc+4At G֐xنcjHd Ϲ"Y͐9uxO8!t6@A06ibMÄc_#B_RLKMHDKp&Z0A7UD٘lv)?$`$*e*e o徢RWT}yjr SRĠ9}eDr*2|1P}@H[@.jT9՜urJo.ζ"Z1H٠$[õ~E.[]GMi%&L6C.cª@K 5˕)m|x[HK+l]>:C*BT+7BX%Lڨ|~L1~׺ͷV{ N}^D~6~u=v*~ÕQefXF  Y_Hd]#QLfCn\%n %>ysx#9%T1u1O O[Ob4V`, T8ĔNIA$]n"ixRoOC?qw*Fȧ{VKa.0x")Vyk̩//2ڞ lC)ه2_> sHMFON[Gޤ,S CfqdKH]_UM[[snb4Kʨ~JŦɚx,˜z g=EFE,CEU1vU⛢S!H&c4牒E\k ϡզm|7۠rk<֊a/āIL@~> D1fhDeik]SujQ[De[]Ȧ*dnK/m_ŋRoY▅ VJbO!k6 (!.1zJSS*1⒌Vw `2g)^4U]dsk.-1Ӡk{u#" $5 97NC3t,A{Qw^$׎)G]˭U'9Q]éƅk\,+oEQns'f,QI2aSNG`.0dy3{Krpo9"BioYC2cnY_*嬶^: RoFsC+n!zڪ84 Ϟc,-8ډҝGkŎftN'' )_N^Go(&;N EynPqIMZ^N@c՚ERRƠ]#Q9fxre0Y 歬Sy:#,oV.\sՋA43ԍڂ)?r!G1L WQ+haE;6OLbW6ݥqυa\osm3^_*ytOxّEwco[I,Nfx*x%QrېEOd٣EԹsn.8X2k?BaGӳ>)R |){Uu!J%\1$H}{o0l^~'CszYzhZxՆeZNgkt2 œ-?'MU8q=zUƇ$#.M؃b<"~J׼-_p8_vGXNѹ-|Mw(pm%}6.+ޑC wL'l1rm[E ۀYOٖ%іi3ΩJQ.g@s-viEjj0SU}A*t~FqN#V]VHuǶ`MmR&]{xMC:D:c!.Bf'o4љ1t`CYGc @d/(܋GJtt3&>@d}@I(lꊑ1H ^T;8t|b\"mh>6EOZt9-'ƞ謥nיP+|-{-AZXdŸvή憻-<6&QNJSpBK6JVBzʼnKNkҭs?K8릩b؀* 17+iB/+I@H-&o.)w,7@XU{W)6-?RJ_&HZe c} [QϿe@uMܐ=ߨB& v"HbD(]Wm He_ۻ79ǻ']Emc 5%/vc9֞|qmɀ{{=m<ѯ[߶?&%?K*_"rs2yv5;†Vǯر:w3wo& _e? }+B_u?忱/NۧHOW/incIBjPfx?aaUhW0./ϱߙr~]7véR?I.m^xǷ)Oi=yj4l=|* uQ8w/6ջbT%FlmƄFod8ptT0 )NiPgbKY.m[rsz1XxaI2Dsw*Ntirm`VMa|tsA5?/!]psB? b( l}/NV"=8ߚEp);oty"6S+%h7ei:`%ӽy N_8h}OB-f7A'Ț\YTx#Ԣ!' hǑ;Ah,;WR'C5iZ&H@RۉF]Xb 8Ww'{vCjX止%\\s]P_ˋS&}P0/p ;AUX,ϵ /H`q$E"N&HTsK0da416O2cI! v͢sY 9;eS k U!WFvÕGk  Y 1[\YM@3Kyn-qBB*Gy2N^nA0ipCj!Gt&(4: )ņ( Aҏ8j!޸'::י]ϤXKS2aT`.J1PRÍ#LR<qtą!Yg+%:}R%|VW-G `>_4쩄ީ{BCtła2N \QNrTXɹ E#R2v7:_ @kFf N\ڨsGPaN6-{,LO!&IlLn"`|Se,:;V+ }uI(?1`ِ򟇱7p=`(i'=.=9MxD'ӗtL 3S3 tlE7_SDp,nf7 :Ew!pX2LNADs6ғ1ߢT(_>B:b#VY"C$ P|5不R|Tr*AxJT>Z*s.6Amm•.iC me@.u% v,ӗRT+*̴CGIj6!f%I_x[ PQTw&,G_'y#ٛ_1X%S61U 4ŜsVѬ3". s(F{n-~n)g00T5]EG k8ҡ- a ?CB#Օ4?7 gZ ZwX]xU+ @1֛!]rs uT"劋paH#U 2{~+F#@)\ha Gvg,LP188ӆc0\bҲYk"ȼ,XR| 36S8d(~q5شAOס'`2|2YAG*l)}t+w8+>g@1vҢ8Ο'께G+egpJځG|2`h\6 l|-y\` 4hb .Kct1[@q6A51܍Ip#{Złl|Wa`9Ɠ("Ҷ~fZr/ i+y!,:.M,B'9I?L^$&A4d61DI:T:C X@qBb)l HLwEgwf]Hj/xdkM!~b&Xwkw ví\?@*'$%Rfh$rڱ \Ŧ 1v :Wxԓ]6ؼ[5 P ySs?30.Yj|[lP-p0VY"C`YYOŅ?hA0@,w Dn(ZRi\;N\;A(Yb0*aӠw蔫 էŮZnDXAf*U9d5Dƃ{EH"cf ClSQ,yO!:Vݒ""콗9eKGhO[^Bdƾ*!Zb`397Dsݡne*§}^n:7R ޹J)ɱP"ͣ~ۇ@0(tB*aY:V14 b ɋkf紋oiZw!"^3:+w&Np(o lJ18mvoWK\AwXֵ@/T0gPE)icc& i53yII@JڔIB^GMFbzh_GI$ ˯,蛞@x {ZLn6R˾9TV׌qi9/QQ^Q0*fǤIݐ"T3JCT_;\M) mfM.``8L^am dW(\˾rlڮ 9Apf"KӾ/J,ANiڬ7),V=ήo@ypCy"=N!3D>?)\˩qR~ƾ !DJ3 ҕWL?͎XQ>mC^`."ȇG l,Ry|̧*azҖZlW)z1{`ec*݄э ׍OŜy|u_a'6pJqXcTak8CgT+7!{R$_k[ʤtn@^"$fL 4S2`SE@*Fm [t<"3@:~. sĻF+pNΎMlo+9 c$UܧW G)ʙ[<^.p!CM?\f+x֕7P:Q5(TxG[`fml)6MF~n6$$?8lgV%yJq/Sd0 #-v HF]I{!G܈y<\GH-5!/5ZGhk5zlFr[#L^5ZGQ[ѣk/5,5ZG(^G(^ckt7Zуk4 @U\lu{KD78<3hp&eGO>LAx҈Lw Uv1u9ln朢άOUr/2ޢ7WQsPٝsF]?LL~f2#lS%N,eMk^_w w.?Lf:W65oּE}L3M]z [ wQ@?yzX=PeK ~9(LϞ&/kblzKa7%q<;(?Ϳ[[oQqܢsEϑO۞8cnQ<@?lCnQ{ܢrЏEer~-[odE?-.,;Rѷ|ܢr]-1F{X>nƸuL %uel RyJ>h L? J`yLKmQ [!.bE`~m`%iV+g϶k͎e@!`Tï=!zQs"7MʥE 'WǘNQܽU<##͊+Ռ,g>t`hrddD ˋd8Ixg_;Y>VvD~/K! {(vRэN } "us7"j E&b<<8޿o0:ѬzBkurV"ܣ+ AT` }~Y22 [ zCpA4h Y!(1[0]>Ebⴹ#z@$E8 J| )+FGeBV1!UI.a2^iVEycR#Jb&(B.+U"z>X\ Sajy2Z[vRU"Ł Co:z=zC7TAsk0Mgx@ڭVk>O( >T+ĹOWgI azAw辛\* ʮ j!=5>C'Rggx%_K.+*Nl1kopt̑)W᳌Q H Ɏ~:vSuI-ṰݟEolgl~t8cVolڶ5^{V鑣)OT^" $摔]yvzb }>ZiRYXkX^^+8wa|q>Wӌ n1I3q |*!GڒEJ3Gg;ZEe\euʋi4a0Og{St UѤpȼQ=',27UCSk6ͅhiV铗Z\O`A9v\SU6AD;XIM'W\0l&Yjٟu k2;_:]^kƫzկ]q#cl(7L}+/mDyyY#lzfUH'=Vk 35;.:@WI*0m@?O;'D`or<Տ=9Hi8Lү;c]Bz&{+]Bsv_ q[E@rQSW2#8_$宨t9>"@%lS˴e%.VCƅ/%(D<F1M`PR= ĢtE15zcxwpB >j/U]M5k_a}UR Զ'g8\k̷)Q]lIZ[Mı$ 0}VDOǸ,kVkDv'%Nҡ3O0yOOӦ(Qu1pyǮV %B- m"oGy{lW鱎NC9W%PUqC^MؑtdcD0KY$NnX T[D8]`lй3t⎧M3se/[+ /Oܣ_x#ͿTͼϝV2g[3 2qg + %7o"@cIX gPEtJuӤ,QBlu%(7wN'XORUQ)y v_=442~?5?4C!$w`nۿ[`qMX"RAZ4lMhp&XL{aC]Bd(3ܬ95ɪHvk%:"_SYZRd:~3;ٱ(/$s'TACwV@h˭K?7S54TJ1b.S{7g{`bMSюI%m-Y}۳t #`ԟ2@5 MN+0+qL,?@ɷZtsyRQ5yu'_96d%yGk;7͚ uzF[mw5[=<6sX YϺ1`9Sg@t{gk:QLMk^"KsY[zQRᥗYL@xr#3vAcrmZ\$^b$m"w BR4""`z HjkD; aFYwFaW[巗c}hŅH&Nw0z7?/onMrol<`ƑlsXpxE?j`okv7KE+_IVd~! *߮0Kh.J~D \1u[{=tZ~ +i2?e=P A!\34y)pCb & !la5+~›X7̡ fyͤTT j_cH&v7 "I)'\qD%3} DEwvٸ*w BmjJ)b_ڪ\Χ޲ [촁> E90s8xjorPmvi,my.8UqT*Vi\9b\,ds' PŒM7s 9 -bIw0*mc!%mV74 $Ihx94kPmMP Y98D/.p^Kvå*qN>I{P ϒ4 TT85El:b댼Б\A Wh; }S:c|߳eGQ?(m,jWh 7 [چC5*Y \-[±g;}ߵY+OU{tF/eG9r/^DAJeGKɝٜ2lOCl}6Swr.`,A\93ԝL}FyL]|L̓eֶ^͸@byJm1*rt4O Jd}l42-s`q/pqn5y`ֆ1TOThu : zb}S2G~v~r(Vdz9tvRz:U'_P0=hKEt$ փ%Eb4>X[[#^% L37M~5[` e2sa6/:rO$^qa0 zxf RRlPЄCxa|}S"d@W[kIRv=nUt] ^83+aWSZ/G[D(f5AEF1? (WƲ]sAoZޱ߅) L3do.ɊvR;s痋o*'@TQK+ǐd%ɩfݢRz)['O=/坾qcTIaGi.b28xDT|9H1*eWg,QBB{ % "܄ 9%s8<5AQ?:9eIo<3$f td?(l=;u^tǁRV ~Mb7y0EIYgV>&U R'T ,th%Fi=}#V?+jWve; VꮌӘfW7Qs'psM3Ї/x4x,r{k>{p9++\y20ͱ3Oj^Y8rp(f)}IǠSnS_,pR`É R0OK <ߑLt*ǠvQNeta 47-C1mp_<}hڪ}&i6g/)Us`[_1g5tQ@::Z2&@7qj5SvrclR4_jX1bsS<N/G~P47J|HGWp(hRx h@r(̳Epܖq2u*ic&rC\ tԠUY't`k\͆|e _.k c{m܍r|,%{U04 9Hl5&_/Z1 c&IwsEL‚a%J[YD2UgP:l9"0ď$Uؘ 4TS';1_tz:;7&Lg |y9crm;u as;˔!a+0 )= XP8 =I/6Db2:Sc~\/dJ:3"zuq*'J8*LO1^F&)D})߯: TW%˔2`f^ Q}IQKN$ANAE^>uFQJq q뛠۫0kfțOrX 5mDZ%wCwݨU~幁}j aHA N} $ҽg/tnXMcf~iO```\;L tE! NzAFM$8qІksG :}x)42Qz<`!K*V~G6Ĝ@OGzrP{؞icDwAR%BVB\OT:tѰ|?[Aֺ),9+8_@OG pA*((RaB U%TK _ G`k%?6G g }(N f,ICȣeǚb ^T6)J~HvLB,$l. M]uQ:cY}硎Fa VΕtߍvc jO!I?un5fUbn"{l\=AE͑|aH:|Ib/ev%44Hx,b/0 {wѨڠ 3_#3,8Y5Uґ)~.q&,Ϧ8 A[l^Ar)umḓŻ!ȼ/Ys9ʆ9~7MҕP3.cmyQvI[d"bN]Xx֡sYWT[x89䇟ݽwj|=.,ݾegGfH6ߩ8GU*H&7S*\=ez 职>L[|F_ D801? Z_hY K 06hom_!O Gq Yh&0>x( ?42a1z-d$XNc-~'&Pkȡs&O,-6kYޣTqy HEQ<g !nE`͵S*O*ƞl!J%rlKC`(ІvJ:o8 W}M'$OE,)YXa}dI[[[EJu ϥ[ʺ[ʺ[ʺZ e)[[[::?郢c.̥[ʺ[ʺe]{Pֽ5DߋH[ [ [ [ ,]2n)閒n)閒gt%E/Tn)ꖢn)ꖢuq%n)떲n)떲n)~zY\?xp]uKYuKYu?>AUnMwUU!:/D5 `݇L$P 9lx0! rt"K4fÑJ_Y"p|՛&j' -;&9tzjl=uDsewTA$沉Ƙ惠<KQr6ܜϰe2PIdC$b/Cx7"!JR)n9Ls6jdkKA۹WyCmQ*}{ {gX[ P=.lpgvDǶRmfۤՁm6|P.:GExFA884fCh#\x s~~S w&f%>ת,40h4Y+W45,9Gg!GTHR`y`e#yS傀) >.=k˄u޵d_Q36Fc#t8̠(Q%"aE{(R6ИK*qeUPEU|W*y E,E[/j tW'}|:5xōR(|NQx4܂,vY8Zt¯.4ΞH15j/,_ zMw4*>1.^6Ƃ`nAgjۢ"5鹰>5uD߀@"ól,N[2C!YQ!y9j)̵-`HIau%8wÌ/3MeDd|^!j)UKq~ ~)pH7`ћkAJ#8SGpա@2 on/c80j+>Hckۂ]s{}d'j[i8 p^x+ˢlĕrRO,Jr+@PrA O,w5YSn@60)V' /hR?[1:tdmx_VOz[X~V[vƪm;aDY` CM6"jS&]tA'9>NN^W(ImtCJ̗Ϙ3'rdiK61/cJ]RKAqoQ9 *b|j;(c3cPTRw:!RKg"'[Q EQkڰœd4ׂ_[F `Rrtw0+SrT4JgAb FCZU򨕣e(zwAm ,z6$4U1*,@*?KǤMܕ2x[pb`, .dg&1*2r|ρ3ѧp$h׀+ǹ([Ŗ JnN]bPWIG"§ǟ-e;ҏnx|)A PF ;EB>6 @fhsq)}lNrUbKR^U01BTT*4VD'<a` {0财C.sq'! 6IP7j)tzwVf6ԕ> GKW÷i 'o)6E4Bp͖8;%=j.!"嫲}oJ.0x3p~ᱵ zsMģbh3N=]&u2/tƞ Z jvS!=VL6*=#;K0207/A97buj~9M mxb|@kC eh/@ 9N aK#Cģ2F+ K_& F^V] r>{jaOpBGrYIvŮ0-x:don~`DNcr j%fVe YK-`0 Q*N`Hyl#'{sLIc{{#{f p_u@-3hC"0L{Z5`;jql%?\w/V&"3apBdL)?0Xkz6&4EnMmc؇NC̰lr)"F֢0 aӉp~]Jij%7w.">$4P/Q#CCu]J9T" )a}|xCAm ݈X8gGm: gz,;>U^יšŏqWH2K6Bgm;qBC\Y`:2I<h-P.OX6y/@e^56 玈jg> ;apnr g7l3WFUpv!8cS̑'LA ӴoMuHYƹ>"0f:1)(m5( М=}`ѷ?Ki]Dzg"L [d/?B!&*G6+$.|a=R#) P`fchB|;OQX= e0v.s@@d`6ZFsi6D*"Z"/_)uf+ZU매x8<ΖH#`ppEG.dQt7ZЍ㶏9 B고X4eiUbX;HQ %:PbΥX/9+=.|,h7p.oIidmd%Bpz-/R'j|Xॗ`Hp[#[l]x:Y0# ^H`yL/;I tEZtd(jab?SGB6zk!b20}r"+ݰ8@Ǭy7t0 ݥD[Xt<6JIfR/4Ny;컍*7>һ= +q93}ImuI2pv0-$7gpJmZC ce;D|qyqpt6_ɺw Ԍd|}:OlyĚa Alʍ >~x+ 6 KT"i:v8@R@<9, Wz){L/s 5wA^FTnhRΰP$(nb!?J;IIIFo6נxm )g ~ c U{!ub7 _Nȴ-'P&#iFe2*F$T;C ~5zlǀB=E>^!O(ҩ*Z"ԥhMk vO"45Ec6&EhYVzc4eh-_ow-aC/s)t:ѣ6L%^ftynXm]vѳ6o }αPt9)BˣΫQxDkStB[M:TWzzSjXtFzI rLW{҆=bhj͋A'i^,^6쌟uHdz _כ^a{y/ýRYIHA#!EgHHQwD@ (7aDiDg%)p@7¡&Eklh&G ݄4xt,;%ԛߩse]؁MeRئƱb]^.|lP޾b7~9HJV3[zrfEIv;Aj ͉>1"LՙMI*8$2b@A<79¨A~.< ]q.?j1n.M3hDE&簼8R+b¾TA7)l /w6s.rb:=qI6޶)JgzU6 wIH3a4z)ˋK=#<kD6Vc wyFyAK1nv/v!?vQEx Bmv崏u%|p$/"QQL$dʔ9F#Q`L/dsC0ă9>"LxS}l~FA^mx:3^xRe; t}pPM!&uVӯ\fϰ| zMnM#.,?I\ۂlQZuKEoI-Zj:JlGl+j|𚂳DF'E`̗zy#;D1Oj>i>Kp#uqbC :xH|"J'):nٹO0C)n6tI S=h//Numl]1Su6a?. %fs`""u[?M|EJu.|{:LʅCO̜&=ӞS?= ȴSM g%u?CPs@sHwMEޕ62iVM9ÑKɠlu?xqf&3(\G'NR?={.5W/DttݕnOw:$_6GӅoZP$J! _RJHO]cXy f8M{`p툵=f=HGkb2dѼ]vqd7ul^9GKvY_EY'U kCh_]226 j  )_7^פX2+0ټE6m4OdGov׽]e?d~mo-6^\|rt8I[}J鲓_|Kdvzx|rFZk[?4J8W߾G@gH>ItO_FέHM̵&)=i/KӡyvH6-4<%-%+tws.I pyJBv<[ oW#WȏkYyD&yu2{kjh='LSw7H4\Iڷf-ԮȞ $7, dWwp^\1?&#N 9jfyF|uxe/\)4oc|ڄۧ ]kkU FE <,n"cqHqi-u}v.(- Bxy݂( U|m74.J ,dvEeZAWI }OUK`0W_ rm;i]N;7g=AI -'pW:NH|l [Ԁ?˸t#)NgͲJ%.j6_Vuط_{٭dvKNfiD*;RhIֈƕ9YZ ikt؆eW>\H-cW_hTJ=q9..io㒿\"Vš +RQZ)|7`ZT@d ʽnQSicBXɱXn{$-(#-6B2"Ŏג+\@NJX2R,nCϢkItt8)oc4-V:n{m} wZ)= 5A:Ej*lfjKgCMʉ9sBܩY̝\2/|R:&mC8j\~m4eQڕ eu~!OM8*4* ?[d&gJtw` w-nK?܅{3-{1Id}6ׯNɨlz֟x3#PDhcb;I{po1yuk׈dQJWR$QYHx5Œ*t+o:Y伲SIq\R>`8Q܄f_ CU^GwϺ?U91Jrjի{Y(|'=X\MLʕ~p&!͚e߬8̤ |gy03bA(UD+R%DIشHFW(P&I_^,DG;'pµUX`n)5 ejgqhM\쇇K5jnל{MI%kV^'6O%eϚX5AWxNWF 8c]HAFi9b8ܑz2rEjL=HIHSX$ҞX͗_4ĽQ$o-Vc+^ՄY*Uh,yh  3BFxï8P33 #i˃s}iC]g$C6z=ZD87_m,>ݎEsqqfxHGlJ. Qؠ3":^Ѽ~OY,_pZQ(kM`Rޝj=W$_( ftN>ƺNJՅ2m5\j9d\`FM4 KpX_Vs-*f0PW6@tyYL(e8i#0 AI֚mf|f+"O*IأFj|@I8rj5L|Tgr0vٻ?_nڠp* ݑ1=WVAnR%+AH@xߧbO{W*ME ĩbC3}@B~S=0]6 !Ǯ@tnbxGA!ɾtp%anz E9;9?JpF܊M&1bWKbq44ڲs==v_-|B#Lrd TH:<3E~/tDcBM@M9=<p~\h2hVښNJuiE/)+/Uwh%~$X] 7z I @gE>ȿt +ѕ:#rK(5Vz,J*Q 8OSGf[UEd Ap-:m!0$[֜ѳjͣa!VLJ\ pŚ1( z(@²vQc)f]-ްTN[#*-|S/ZɦX Nl,Bd(aAH,zQ${"ڛ {b6`aB P7˔ 0;״̊pp!($uD`ΙA9P (ۨSkԈma3ܝH8pl   :]Q?W9QfPƮ s,1 ?a װO#5\a-جױbGetj"uq pF/whs@iT8A1vʨHj*km7R? Ms]G~bڙnIM^,IGtMe(-x|lwٙo:DIo !'|uJиSmn)q]يF^aݙg^Y]e1M'3PK{Hê!)4V?=Xw  +`iʑ>} Vs2~>R5LroFh9Cf%.XZ{pꬉ]mnk$gp]VU⢳)ƃn/yQVk!+*5Ȣ"͛AHSC\!!dH7?*Vk]X1ꀏs^JMR8WhOO!1F(#]ّn3v:l!<t2w2LiCI <*lt<:ҝZ>ip9 jԵjNٍ +T*d aONqL)v]}1¿2fJ INEfY3c^RtNI䩲_bQԸH8f]JXUO#io[/g1O.u`/Ij5o&SC&UO!4tM0ƨth1igM4R2p brwu3&)ӎܗk_ 4uf~(-ē &|ŀ@xAq C&6+ 0@{,˹F)2ncҭD /]cKDb19~ m Bf'Ody%&^<|4{lTG~2Hd H\XgPL+ H|];+S~CX7v= 7 G {oPakcc{+3o{ԦdÛ"BTW%Cd4%²S 5RnYb̲Ea梨 xGeWdBB{eËC)W%QCy#tYKe5# Ӵ-֊4{ym]"iAaK^r9~:eC\I~1)|8) B7!ɉlHb0e;}{Uc`3 @ ^tk- +g|"|>`9~_} 6_F.%yj"J5ãGmA?RLflW͇\n/CXc`кn:U9PP8;Kcl*]WO2)Je2Ŧ(%^U2Ld:J[M"50S~ٝHF/E^~z/fZo2 jC襇 &ಶvf u=Xt&ޤ2Jͣb-ы* uL׷{S+*Kĺ\*hl[[%7DZdXkpTx_bQK i;(p-Kt%LoRKYdy??4mQeDO׀v9oUh]$JKפeT<;™-jmr&MoV_?|XJ.(% b^ߏr|CߒADT ʭ$m4 6=sֺzm: hkWekzzIc2u`}n #nA߹Q2{21o4V1M,1]ҏ9~&+ůKc˚c\Ľ`^B^ƾ %K &&^ƾ e+kh6} dcřua-h-r|T!.C4} D:ˈV `kQ7 zD+ [$֢1nh[Xu]"1~ 㛠@Əq"m{`Xz5.(*@dfkcn-,Zz51ڷ@21p,7z>s6oAS AX.ŗGg7AБJ:usV1|#2^zVrb~{\K0ܯ{#fhO}晸C3@)u[$ 3ZwWDr-8̀ż.2_\ %^yF,Cu}d2) h(N=dq@E&O#j }-BʬWKel7R}KfL7 RV{pb^6Z #]_u+cڨoߍ~zҡٸvc_mhQP% _:Ҳ~nQ^-0zC[,û\~G( +Z:K(RS_mo . kMw<3~7Rws_oS/X0;TUGr'~^9oc1'%S8pn, mއ^-7Z=;xQ,mD[ŗfݞkH׻Sœý@aC m a= Ȓ#H}o+)T;H\L96 xH$HL47N!s_%)gbdMG%M)DB~+'nJj@)$ 2>lհE4M ,ccWd*ZjGMtv N2}sws.vƖE 91 $sj0ʞ h оHTw+N#oT0T]`etrdf<_K0ND.˦n'BS]/G3Eb ^B5w7S6AOԑfgjcFvC\e~@2""I$;e<?5^!+V`Adv0.5(& sd:;TYv>C' EzBf ,?9 yUyӮex't2xޥOSN(e]w7Y}Sk{U2Uz%՜Rw6'DGvNŔj<Rf-S{4P&+7ˑ6Y;$& .{+RsO/77-٫٥*\K5^P ,( 3Xh,վpТ*l0+TNj i;ئn 0VH}+qt:BQ$:,7BI}24~rn<6Cd(iլˑ:r蠏ػV8u=DqPqNOn2hkJEʅiar-3NԒq]N':P!I/K]9ˬ1` sR+n9ygj];1x&? +ͳɉʐnH|b:Dh@My%H/v[E?rdJ!TwsEj4NPU3Q+d}Rm."N0U=m__*kut˷b@`'-/4x]V?b zVLʵ}^Lqy۽gk=MNJ-_zlYOrӳ9z\@vA6JbES*C$m>~XM] p De THei?Tl0$ jܝ'*罎H h"'P\!$5c4 pIL*&J^BtL6RE<fRVCsW8 h$(7?:C0$&3"1I⺢T)1mCغˆHm,@ӓ2QE̞IV+ z`$̤P^;9<[DZ69ӊv/g@t,S&"%b0UIvk_b[ F޽aݝ},RԠ^ 7".P.5C/PZl4nOu}:Vi:F^ZiyCBECrKFFK- 4p_Ѿ+J^g4ͼltGjo$,ؙᷮON*jI:OteC(q?ԥE8 oGˍMH; )-Xb 7܇hO!qNy"Aڣmyݯr,qßĿݱZ$0 ,vJL+rcXhmmotsccã;ǨyuaY]%"i[;>^]|JZW)II>D]R#>fPgٴ5uhG~/4#Wa|AM2Ik+"]F$?wW{kkL8.5kZе3#k ]SřnF9"r I5d^9C$ʓFk:CٯIԂ3p b)A#Cr򒢇@i0h5^uckN; (j>0|i 3i`@.?sw^*[fXJLͶVM=ZNVB8jLI!mZ=5%Qe+#ŀ.Xoӛʑ8=vlyߩ(%QmW_(u`G SMh9-mV~Q}2ꑈӟ-]JNاll6:/|ieM:ĐzAy lI"--ebD%K-9) W;:|e9/q)tJq lk' 팖@8Z'4vD%.Rƴvfsg_ H OgL:5 ~g_镣tccs0OI{2F˫^ͨCIıtv^V*ik,.e-h|pg' H{ HFߤs6Θ*o1ɷ7;ۃN8@I6h*+qq gqzZc۪MbCw65=j7h [ I=%C, msiU[+OL ħi"I>5S2N}鿏 " sMߡmK`Q/Ĉ23iσ'  S-3א61wa>ItIlq~^ -T&JK~Xg&?%Rp2Hq{m5 Y"W"l.n8.]%*XtVM)$t iZ44 ƾd|.ob Z6i1-ߝ w- ĉw9~JC-XJKb:h;QP-7ip oyR::4C*㣣#:|g^m6t4m UqN#XMQ8fW$:Hڢ<&vZ*zUŰC>T$mm&n2q*ՊMؕvO85FNB {G]֨{-sѻw5z׎޹蝛GaخMY<ɳDav3z~Irw{~F.qu&e=s) = ~i6eCG4DP.8c-J,PTGmk 7j"hkE1! :%n_dzSmN^4m#wF x/2#ʬ2/ԈWKO+U?! =Su0w@;S1.IĴxqΕ9 t5bfZ,2;ӛ^=9u_a|-d{|xz ]Mkm=~ je8: H|\QyT'~iE:JƶS=MlӜs(#zmv~n>߶(ܛpx?AZf]xbR/qƅ&M,,]>r>;ڐ)+.Nr/TѼ3E#(U'4epwđ2+ -sL,myEg{%e2=({ؽl-se?ozŃ=ɡh O Ra_Gf7f9$+i{6|v UO"Ue8ո>+sYVF^< b0m}I\/s̞|w"y?H_)aM-BUѬS; 0uѽ>MI@!TŁ#5_<x>ʭch(jtP'*5ơ$~Eg;1-6TػR~]|tt}q,AUy$BJ+c>> j4M;}|_&2Il"=94,Db[<#+p;vr-Ǚ& @tʿ+ BюBށ\Dp t9̳r_WD1+ hEgµ}НK\Fgt#WLW!غF,?Vֆl`sc{!6龆{RA>x?g~?{ms+J G Ӈ.K* ekۚ[{l̅F|, T:A啻.+vqʉiH4k/ZtLlFQui{nmzǖ9 X-imT&EIaI\o;ݡ[ֹ%(AP6C(tf5 1ӆUp(WqɋL2[:Nԩ&~D0`8+"o骛pwf֣Rْ.ƛbUrj, 墦Euf٧w pf)W\[^[uf6S=}Kg^6l5 efL%կ$Q0 ~\Y? V:HWKX;?#FpZr8?2r#ân=K;; ®ɇmF]~xoO\cVc@ 5 ) .աl{\a'hu+ ieP%. s)H"LhL|~cV*~7x"8H#j#SgF V@N f^*[`$  aj_R8=SnnDG؞0xSwz75~?QrX#(`|$>?6>S1:#VSq鰂 Z-h`Kq9a/Y>~cMoQG?ȗ݁eo GA-5܁ϷQB(X@Ϸ.W{E ?G^4oj|?WaN(j|`5WIc~$YXqfJh>ɊSҚ@[%㞐 T"#*?ӫGA ee䤽N?<6m.LD j CRgŗGt e6Zl43AoDaK4i5eBD6$4I+MbQTݤUBBV%5df * -Adș7G%-lwrob8x:7ĺQvb*1wRw:EU#g;7kB[rbȗ\C)(URmk4Cqmfq0]i{٧@m T_qStu--Li2"0[$3x*F*sfQX3&O>lsU朤}}n(Dfӆ29kR^Awc?Q4MBF&xlUB[y-ِtƄ.6@~#|\nU}e̔ʹegE,uP,owa:ΣfE"U~)xzm"^.(kR$y<5߬ Al_6*[hB/ES^ !w|_;ެUkRTVVqy}w.hr[F~y.u~x|Zp{KNƃ;)HsR~7[}hU5&R\QM NR{Q^؂+XLlEnȢeNxoQ: *qMo%5>A'`[Y>Ը?4EnwPvG@KŅ߫$D?hε:ȦAaa@*==3 :tu8ʑ/&wa׉T0d>Þ~rfR 8Tq+jբ2i WU"riVom&KӦaoklxW$r5~q2@w#grb"ZLa0o=Űz6iӒ=nQxf3pE;]?]f;G4`@|<7< b b} Me0]m_<]M%;@kV)f᏾f:˶fDv8Oܿ8Ա&J"[~1^}?ܔϗѶ qܺo*77(#5}&^JcFǛ :׊{^2"1ryZfaovr=RqܖwS=V@ICtf{,EJښ|5Gѹ($>uJhSILpLjg4Lb0^[;˙$P,S\0ސ? ^7Tij\ :qi%:G{64B]0:_aܩ$I 2`Yqm>0<}ኂPGej:늛{F;o "˩ʺAM4ѳ uǜƛj7^Ǔ8/Duc*3q$_.cQi) p"MR6i25 ®svtI2f\ZL 3\&%ͱmD9N~:~ M+SԲXJ:u _edgj[s\= `%9CʹHrv /.Z-î c.{x-| IYe^[fq̋Jl o0/qlEPo_\ 9HaÞ%Դc>Vޝxݯ qDH`Dȭ޳RD$: ~-[&rrVxdskh<\ it%6l=F׳PCM~\sSѰ+/~i#hq~QZ U^tw|nؓ=?;<=jr~k4 cܼOT;9/G10ZkǠdGM1nK[e $Al4bQPƤ}gk XNE:U]:w#}8c !'MD"ߧv6fteK"4%gKJp*=|+ g$ë:>SZ$"i(gG"QnЃX45kRA0n7,vLf{g* mߒia/(#E+z3gFtüQiziKltCP+_I>"}.R5 rN0_>pɢnw<I/ڴ%Is(5pЭoS Q`-;[ֺa+ Xm!άx[M/&QP o}3l 3 V~szkq?Řf@uGܖ6voj:V^kXAB C4@6TRa;Z qfcVJ06?|v3?#s}= B8٢99ဃ+/~μ(AvQpId]P+DG4bLB:vNfpByAPrOuN\#Jɔb*]A))&6z]uJez5ڌyXvj[.'M+Q[]"{`o{gY;}|'96;Qe~f\̉ak gCåNu46O`QCZ;!HD&Ou7OhZU/dvLeJ8jN\o>'qIV9Ϛ\qfXQe;T޷^0*yD+;>}}رQOoE=SZmΆvXa0NNE[dg*rw;;w}侽-ʁBe$T8~_cF\TFD /]o4޶؄h~@F0H d&C+vq{{zm-Ӓ2-/33[ء#ʲ#wQvl"iW4W̓(2>F .5ɕn; 8oot <7l' tJwcE{z._hnwr'9 @,kXgg:%78.6d1gÄ Gj_:_`r;HDȂ|䦜o?Ȳ>p Ӌ^==?:h^aķM恷BhPᥤ(u҈XC Kf3?%hj` VߘRW6^& jpCDHEx'i,d|Bj (:fS2Oݢ3NǓ.*/5J|Иx-ƠG #~%^#hh LDAc7uX݊-ߨiKhP/R+NC8WԟixO "L83wmT٣he&%2m#MPMu tUX@䒈V O~%"u {j7|82rwGnHqE/>/~UMhVSI tyz50pGOڦs qEC}`#nY>z~@[&yO ?>TQ/Ktޗ=w|S1}'PM7/kנ4Dk6(;H{9C?)}e|]NO, 3Fc9Xn_sT#V5Q dN;L*5ܐ:\A=/&0N4])jwYMY8)!ˊͯےE&7WHZQHkBSNKLXmn]ыxEBTWiBJ+̼ъ͂93LUx3 ƀ^!Yo<`}SZ ݆ueWAjtU0{::˜YDu$߈<r٤B/g6\ҚJ\$AC'K#re6^;APxYQyU 2>+!( 1`7u9Ǐ%&UJY5"nD"j8ÎzJL;ə++pZDOE@SMt⠕@"Pq,t_uIXVBhn]u^NH!rFQp9MMeam-Q]FR 7^FVmupw0 [MwO=ZƟle=>ˠ/=uiY1L}hy2+6щT6h:鈵 KP_V#='6WA E}1Q.|n:(h,bᧆMª/4gX ԕlf Oo{!L;*}-W/ѝ}85U~)r0[ TrN0ϋEl{'ч7ڧ[=BLMOg_@ +q[fFĘ@#kQCaO?:LVQ@8U3 D@0φ J\ _OIqf$-, 0}Y9J#^H+Pb6_H&|2ߜ64v7w^y36NVuF[{w| vwiW ZqJ=^Y4Qc]giKp=SςjS*̴U֐do8fҎ0s6H3ogEJ|6*uDm^0aQ֧;EJ\,\J#"%>Jf8) kiy8)ch/u>y,ziC4#;2ɽt-بǾl\4V ݩFqͭXZj#%i3wJ*6.L|sQQx讥Z;ƨ^Ex%ov(txGc6! J];߫Z)PcQ^n3BƆ};i E'Rnjg5O"Ȳf; LSak.xM5+)}WDF)CYL<ˆ~0 Mi릘xeD )OO`X?_ᙵ2ڌ΄'^GӯYDFrH523o/H4$܂-am\8q=ETMkPu?3$\2I5(^R1#KH[6 7calUX|Ln2[PZK_X?YޕhA͹쳢rXL k2CzZ [:f]+$k#C;E+%}eu~h!"Z_ 4Q[?xmm/7U@b~St7c2QDr `>v0vW ʯg|Dp"ΡJGr^sZM6\ 25:,Zr=+#0.̍Ԯ {pz?8t"zs6$ZlEч[/~~ʰP7/7/ij>"拯y/G#AdfQ6iQ)NT5ˢq[:w]N SVN$w:yf2-M; i5Ы7jIҺYZ9ZٝieL~k\T0W dz,x"Abd/wSI WZOt^KMDg}~0N-HTB :|mO>Lsfm ǭ:Mo.jq;V%S}):;Mc4gNK̿~(mi1{di? :$J*43~XRp ˆ>_7)҆:X]pٵ2:`˵1 mcG.lߵ%7~t0R|Uf袃e߼-dVDLE `G \"4xE06p2 NԭA"Hj Leݐƅ%=P,EGI-vYT8͚:,YRX#\[uu*uc:8-؉RO\ii)U%9*ۈƮ/:Z2c0IP*eMT@0ǽU/8>w(BB?H#9ǃIIjXRQ?^ >JM=:Ca vxCmQ޻ќ{Dɽ۟iU/^}w:Zσ^.-˻O}")TgYU$T.t@;s(O~A~+~n3(lKwU>ә ZcAmWل1Xu]AwLxp.ih=&.7hHn*ݍiMkJ݄./Β 5XX2٥}x( ]3Z}[dxψW:}ݫy}_&H|ĩ3#^cCno%db@4l>7|elqi/פx.\X`%D4/ASjߞy;dYE@wf_0 1*&5k!HlҳuT 5,|\2ul~<$#ׅlC^+n-ෞdbq| G_\[g é`x 6G|my'   /g` o^p~60`AF8Ͻ/!!,,~.t@R m^E^ ᝄ l>nf 1DpBU,POX<MvEh~X҆i0QP.rY1 Wіȏ@76ևR <-PәF_* PT-DbNi[֝G@>cc4WgD-qt=Э`hp # D٪*zfQPP $3T~}3]! C c{b}o""0DܟRw~);8S4/=ڮ%Ċ1|5PMOKC`U7ՁDDZ~ ]]wufiV ib% enBG&b}􉝙*PF]x1GJ'wuj^YXhuz!I +ZpKRN)_#0 8Aw$ 'G)˜v3*`0Ji.]2|YsvVYE*5nH&vr5"S0>vbyCs?n$Z9 4+$T7vX[ u ̲Kc=V}[AiDb\<˴'/8%T4 p!byw71"TUmh(ZP=HIg1bV$zZ} ~v4g=$QWzCꏮK%E>@LmׄH 0bT,۫5]p"$rFj2068?QQO! ^]+wp(% ܊+#cdJK9Vݘ~ÉWZ,>Wv}hJ\xKDJH溵 YHe DU*b񧴘T ptPZS\Ja9e-)jsXa\Jja0xb_ݴBH1sBxNpRxȀ#f@Hq)?k:OWA3Ϙ"IV˧"KWEL4C] N#>ld5b @qBa&Z@ΆNe xII"hec62#O7Nc9EFmuX,.e|>} 8s7F#$uQ>x5uizE~۩־5J"9+5z-RB2JixD59ILP^9ceV$SH9'>`i@#<}'z}XNŒA)Mn]ȪsAqY^'e+Qܳ|L}ȻMC?IOCk@IH(cGuFYVEJyë >p^Ubvb4:._)Son|ot`j#YUGh>љ d?h`/4F{bFiP4aj~$eL- 9uͼ E&g4"0Kc]&zl[.Ð4M $-t@N Oo?+r\+&YA0l $2쫋P:V8upѺ;U*#u4yH :7- t[0ͤ+HLPP  xV^oP#SGXD~alEFk;f%5#x'3%$"CO d4..pHa d5ekG'{?؅mY3P-jh\dC)$=M>rzLw3~BIF‘߿l3Կv^K'heavLXOa%;ypP5 4R ӫؚokɕ$x0T"4TNc)|,}x-$$MΠ,? f3P<"ܛ@(Kd DU5RT5rDc|Y>L ai=^F}HHOw|zrQoozq C_&^ s1H3tٯEθ{Sʆ7C(·ssh䭧K(}7q0P]Ao]w7q{@e;J1> w& Nfu_ [S;qx)>{w4ُwcWp(A~}Kfg\kVrlrZMos&, yPht%Mvw?Y^lI7p("LUO8_SAFTR}bB@Fi!F(9Oaz(isfqȊΓ*dK|I>qp7D,t&͹9]D]^lMA&&YAEMi"Q,B&:Am39)v`zD75eLtK&>agZYE!,'#(V6; ~iFpLjK@pLz%ӑyMh$Ea8bOdUWT+&W__iY dfjs5sA[Sb5Iw2a}h]w}зSfJ9i7772x6wԾ)Ɵf7,Ų8ΉwxɌnɈW;6з|S^i$l0:M@Div*na:aa(*?tWٷhx{ $;وC'igMaڋs},8u+b\&#BQgѣ~ OUc<CVsHDpeeNxSLΗY|SbAYu7r93>g% ͜s} pr &r3[l9ٺ;Gd ~>W9蚲|K L{_OA4h,$EeÌTR1yN* j& KXn1.&٥hD[![!,NLeC:}Mw8xͦ y*:Oⱦ4$3ֽ͚{Jmq˗^57EUcsil>HG/7x^'CUNDZ+El(̂3MhfA3xk 2y͏9ȒzZV1}}v>;4͗b}LhY9q>|3 Tܮ蘭y'G6LRN}KR3I=FZ2<!{9$V l<, Z?ȔH8 fTQS5Ei^Kdq8&7:o#(QUX{1gk&Wsm{iTK+ˬySx _]XIbPVTsRE@dՌr 9DUvc)}c]$Qxp+ñg!@#n*X[:IGHgbÞM,"gE̕i 7e/Z S*(8S1|T焺L"F \cQIeJD%[۱X,H9}n&<@s肳\2( ؕ{SgH(~)#,\.8K& !Ն= 5!eisCZqLٟ= 2S.bbT.c*,qOe+ωQIȹ>{3n/7͗ދ!3ٙ[>Xm@B4wϠߝ i [x{p9S'-U=8+aE6ÆAn{c\@#",zzR"٫/'|#:eo:B$DcX£ÃZ2VĔkEX6I64A!& 讅-͆8x>QA@{qeG_8K갡VB(PN@J@rr+&&ܼң(ٌ6ĔDy~'rca4AF/N#tM|qLkTahqA!r EBޝqjgפXtiQ`Q{ hJl&|w^x3;jj\.ICo5ǶZxU"k vn۱ 𑊄ɗxێà48RGSG~p$O p'$8+@2=0"-IwḲnj?>iHE#.҃w,NV U1]ީd5U \ (KT*b&<:Ipdģ+0Nɢ8 IR qbcƌuL؆&6 2=VC8k+-zd{Ԙ`mlddW3_ ,JIE͛{H T30¾qvl,^~X&:?sĦ=;jB;ڟVO!~?ek)ի# K%7]í9{Àn{|`ʶ5S?q4y3UɍڟmanT"5R_s66dY I7/>rn?A)!͔ c^ꨩS~ZA ͚J'm=>;7PDV㦕״i|@o_quS_&IqRoy}7rZx@7JDzziL UiY%ԇNKǸw#h6 ܿDWjbYiyϫ4m^s?N[n#Vɧ'ng6*6BN(O~FI"d; fT9$Q1=~%(V=zf7]#ks5~@]LUcWf xæt6dCߌYP%~ٞ9k*ʑTwc^ DSܭg[s̝u'W[ 񧵜"c"q$BKϩe4d$@RI?@iuEEİcpbT0K/R5/ڒp\tsu=8OY_S..5 zSQ=ҝчcE"'ʺi6̗o-~Ooq*>ԸVS+sH6WТRZ1rg5~+;j2U"4]U姯OWshRL]z7l ѵNEwxF5Ul1~QZWOU ZõM:$^!}́ 828Yv t 6^cpfGK6UjSFHNRU=JpqpMo{{;7C'B6OB֓wmwckshL罫/#៶6^>Oz/.."jḙֳߗD~ 3cq{;Pp^*A+jaWT>u1Ø9mc 6Kxa8q fT4̪nNvs}Pa\+g~ln$Vd}o*IN .)aR ގQP8h9Oo~!+6SNlpÃDG_w0Z*-FN؍C]\ۖ:!65$ Ogl K=ƶ& ܫYHA~g녻{6EY~y9@)ǎK b8 ѣ x>N@*´)DŽ%m <Dm+Bx9!!Ѝ,cn`O=ite$9mFN`+z#SՓul).voq臅jСڴ:vZVMs$*J꟪^Ol"hvʋox%{A[$+VK ]K.kpUbF0Z=X 䰆pH+:{c xj fArBB`ugDg"G77:4H.GŸ#7oE3LHׄ$ߢVg;bvd[=|$f9fרgG09KzS:.!Mn$LU"v}j8%[i?LrN-El%!xM$j4%HxjG&sJ;tOpغA$ȳg`ڀWqr:6azN[6Ïq2nyT6՘`|iޱDT;W Ys"?Xpjh]R)5YDFWm2p\i۴xְ~Ǧ3iO yQzDrϋN*p{g8 JU_.LLFʴ#be<2=$q̠fADQE1K@tQ6yPyceZYVꀧ;A+┫`N=]z<ҺMtPX}}E]Xf1x^WTSU( RCGRy "~?bvBM&GW51^bR)'BBOEZ0i{Qv!h[6vg_y/6h@^s՜OxUt>!Φ\M(yatpDmDZ3$nnUq^jKj^[V27L!_xY3,!~* ROʀc6=v9XD/ً: ){: n,2D~*0B Ҹ)[]"q6(H=`NF;Vg೙`\qjm2jaQ>Q|Jtw~ NLu'>{PO;4~򉡥^叜r7K2n^Y%RK C}=>ח-? ~ m(DlnQϦ* Hre,Z X|dUDTA +(Z$w+H_XqW|zYx[6AY -j_ק/9/_w/Wo^YŭgV+o^C,noӢy&fNͳ {Scl2J 3 &HשJ&'sj_l9G>F.g.5djW4qCU $p v/S-ђ?->vp\DÃiCkwШZJ̞8bȸPlb0_eLHwE:?dd_ʮ ֳ7q$fPSW8кJ6ɓuʰQQo)ZImCQW15Cyk=?vhu86{ϰ 6O},0rFk8ٹRT]|&[jH0$#ۚ$F a8͸@Nl;(Y:2j?VMwsW5+̦8_,ヽ@n!$\΁ۅ#}_]Q`򹯦\;n;[v 85EQiLɫ^vуޏ^,HPPC E.t|Ph^;[$ F SrKC\)$Z đ۰Pp3֙ia~6L*Ab_"0O $䲙VWoF&/\h|m .")6*d"`(.\C<}`KYm$%4l+:Ҭ潵n0۫Оԋ7lSlVqܙv/cO"W3v==֭%x0, 'c }<=Z,Ǵ+tiHnz$iL` At:Ih:0h%K0KDH^JKVId\' gO4NR_f`nL "CmΎ"=csɾI0[_Y)KZ;X苳:Y2׊t$0l#F h*Jq= Tyt|&-Qj/ϒ%!C)#sG\?3OTx eL;'B3!r}ɤl.?-lmf>)d#zո`=:ߒTy꾧?ԋ%$owQZ/k [ HܖӊJr?sA 535KPHVr) G$7ĭ Y~x.\~ejNn+2l`/2 v.Fku,hNrmVro8]_49M:91A;sͷ?-6>&/i=.ـ#"kT{3܇_nFKH]6} IH! K}ڲu''-2AjA5SV/ڔ~ C!)f}F$Sh^a\xav溵I edz8 55ĐB)5|)^6j,lk.n|P9$?/o }5%/$!w'"ꉢtq#qhwg>tg47VږXN| VW*i ^1d IZe*Njr>E8u@<8zu=&ypF*ZgcpMڻY%ØD+y%Mcc]I'D%<}^^3,ҋ45[XH8g,o&gΔM^} ;;B}mNׅSl9ctYe&/~/&G\A31 Cqb5<ut y!4#afXQ 68Z\_~4=0O@d%0aq9HQp{Bӈ >vJB\E_MB'.d͔fS>k%2#7&h6wEAIљʥL'*pla{.:4 '12./&45gX㈳`dnz@yH9Dmр\Ke'{#uwmR۪>.[@#3"9p:ef`}&qP۹/͒w~ f ҏ+nÅZ}q{>AL/)/HB_x޺Dbn,4f^{ ֦d]R=_~}Xٞ(\CL׿)ڦ!5 t4|TJގH BGI~+޵ .[] E&Qvz+1сxDii8lX>9T8{Ko&>ˁ"C-v](* iF}L"< 5.+8BT"04_kL2)Z;`*Jl (÷%DfF/B6?(TFǵ..-5J_J|Es\, 3X9-Ae&zN'@/u͖_$VcXE%,2w?tyLqoz~Mի𗘟zI0TTvQS>VIm#L[7{NrGasS a܊N.)]nEU܉1-;KN8n""н$gd"BnZu,H;+xMo/:\g/!-^չE%sTt,9h$Y7S)WUz-o+;7_1f%3Nj.*} gDw\Olde<@ڣst e)ĕ$SQunc8Z|? g:~1[HyZ"_P66,.UgB[,qxdq/U`JgqGwYzD} Xg5(O)}nds=>yz#.ŝD;y [1J]ѹ ŽZG+w"ѽf飭 oa^2` e-wz[3.*4\8s(*Ȳ&[;4ER]O݉NTi?DKG\|S9 ,1xu1M EE{- 5 • <-ۆǯiP],~'ÛEE{! zW8>:ڣtrMiFàh= |G/*n?Foa{wZP^{||k`$7#c^onW%Lr ࣪,l[oaֳLg($%(Oixy@6{on! W&@۔Cm!.ġ]ֵ3EPEým;¶n<|$F_|,Y'6w{1>ۇܠzպ}X #IJRn6q*LNA~FmU}̼Ӹ\H֔JM,JڟU'%W iAZ@0D.gBS5 Jv.Wd=RN*/q!Rk'`$P|6X.%%Pqf;zL=EBs U (ܤ1PAC dHfOLn@yTLQ&&8f| z} mϜ;/ #M0"Ē^`?O Hk3: C~"pC5`5tT~!JAg@;[/g3GBdV^\tLmL^uh;]5"eb I)IL8Qj`ֈ1ܨn(1ᢸt8ϊbEӉfԉC(w̹OHLMQm䞐!![+i5%w\]00ko몴|/ ]G-jQuLy!Ts{dw3_>y|Us&{TiۗJ,5[%L>7?0:]v_'vOGa1 n8iouƧ(TÝ5 7ҚSWtd#lẁ]qluYu;#atc?E4,qYs-g!=T}"xJio{ 8t'-_6&`[ t^Wuk1P><>`9='fqv75T"cT,q-o;?g=Ƕo.KKΧ?f W/_@dHID3bp|xzdwfTMZv`o/RtؾZPXf:$0Mmע8'?_Td?Rev΢2GIЅ%iԄ#,fKwua`܂ষbb& 9i>iUDXrqs],1KJâq&D+sh}:(a˯7'89s%pjT;)6L:;Ύݣ+]&ǓCٛdP_C 75d b F7'xFӚnKG_ܢמb?EruL6%M}mEߎsXřbvJO{ 7֓T#svppr]0k!w\k2 bdf dU]s!6  ƶxh:@"LJeT3iC$ynB Ou'* I9?os$G0+7U΀(-SIQ_=e5z⨨f`ErAq8 dguqJ\' $4>Z'R*b.;YG95ZI#^{gǿe:bK;,l"b>p(ÚǕ\`)[b" oa؞႟鄌T .?H}D1Y9l'dL^3/aXaɳ pYWDHSf^W1<4xh̼Y OyMN lVgPHU1VqqY 0O1x3)/1à9N:n1 8$5 HD=Xt4q)oCXA2S A(qA8P/]+?9/ {E`~J/o|Ndl82?dp=bFT%yFz? {#HR=fTW*zZO/XĆSN6!īRy{JjGw搅LBJM9Y==5D4J:>¸ uERb$ĸ{48 .$Rǔ$VPOW}Vz7#WodAr@tsTֶjsצS<$'+/v6B]8+v^ץI4iRP44͓$Ȑ |*+{fF Z;FFrG^ Aj<ʍ%^Pi:ҏ(Y~,׭çj3d.挥črZ̩Cμ|PRRDՏ⑮d?xh?(O|J[0ﰿ1?OI:3ɇ%yKB?}h@>hCzt1GGJX+INXb*Sftru+p^=pf6Xbw2H{wؽ vޫ-{&sz8ЄƉvm?E։kT /Q()/ܞfTyW|w$[AN`[EEs"̐No 6_0&o5i ގLj gS20V5X"f6#">8b"#,6rm\Sz+6YȍO-қ!1YX)9O͗'WE ѳ㳫2 ;;v⺆ңGï,Q2 ~iWW#f?=qN{ƥ)~YnLTȟtr֦]4OԏOMcSn6A)<)مWj,my BUQ MS7wso㧋=p418Jvy3х{Ƨma` YGmS4)jB"ImUnu`ۊPqlM1jDF6ܛ!Nɋ at'6{mz8 ݚFTcjD<WZI8wUp34/n/Abt^ z`E~ƑN;E(넽M];Ŏ_ XkʗzQ%l"U&}C%6iy6g3K6eS?id!v\`E,kM>z!څGNEulMLB4xVms9"C +zgFOa#5uO iRw7{MU6 7v:6Etͧ@nOGU,LZ~gSǁUnwwc5 +bLi)TLMqn}GajªS+mf%a͏639A<)E"՘HOr3a=] >:~pRYuVZ?˘qN= /hlꨫRxDa-R"!Jmi&L|/23k+E1I3R(aEy*G1L&9Nɠp0r7udF[TN힛Z=͈3bi^Nayp׵9r* =b$JM/\QOG$n6tLC_GQmӒQ4@\`EP=$T0vDcʞI +" &=3g1M;O s@0^4ѕF|e[ f6N;ޔl S]$inwj8^O;= [g ZlymΚ><}C@Qu܋86}*KBrW8X XW8h} J(F8 `3鐌nu$1\jsE?-^Jr*6\_ZtUD!Pu_ط6rajA.:#M & LL!"xh%Kxr/أ6,sᡅ+ɕI1*|O釠y.z lLxZKl-^q W8¤GZ=OpLIv"VrlYue&)v׺¾C4g\' , ۲׾DhhVv-ZZ{a'KҦX6f`9VӞFܑ)T(Ҳ 9h[p k(JXd l+@59.`(` )$4#1q6>[.NGY|z|x|{5ME&Ċ1+O3U5M^} U>2*ݟtwvgsN$P@r͵pDt^U`Υ[Meܱ@c>nőU!)amotD)@g &ewvFдW,q$d54t;ЙſX)_?7Q.Uwu=TzTpVH.)TӨLǺ Mu-'enzC6:N b㈾7zr7 Z>G]pWt#e \ ݚ1l]C?n4,zQhyDdIh(mKii?7vLSYW:k)ʛۼJs'om#+R<sq0V=iN84.e lSsiqÒu3 cxkFY-o ߕJL ` 8 <1P9z )iއyG%"D[FZدITrYh)M#xʁanT-A7:@[g, xJk X x^-w;hY;C2emV+qjXt*LCr!Q tC"Vu)NN Sj0T,yY bG(bwk>*E̻X 9];6N{!`AcBc6 :9䐃.F"~?l!!gzHG mq_Ghup3"+aZee:4XheA8}kS [ZW5͡J4VP]>{TҴ'zwx$Wb3tӜᶃ~Jlhci5!WCً?i:̥ltm\{)@ć91Y>=WE]< V+hƸZ`ř␼0(U"| "K@ $ g&$ybc@C+fC21^G0IёMb{=J,oI(5i8!i@6m4ak~x)&EʃUqu0p U氪@D/aŠqI7}J`#sEq.65ֶIdZδDt>-z(#vZ-lM6gT{ "s`:>Ȫt )k[vrSP PTj\yaP wx--M*tm ꐿaW 4F^Lp>vjE,}y,Ub16ae_-(* vr#Vtq_ku"'@-0&&8a8OƆ5JHfaCy>&NSg!vl w~6jf6Nd$Ma r쨰upT Ahi3/x2E3 Ǻߑ=H1Ki$&)&^jܻy~4ilbL`8=+#_j"%*j&oZoACR..;Tr^fD ,s,Liݪ?(~snfRrW]DT{t9 AFn}NwNmYa-dDPiAV'ꊙ$#D=XCA~K I\Yޅ`PGWPes;~Ԡy;;mg FA\NENQ@WF"#pZרvչ綬r.[ =v`Ù?!洍8Aeo/M\̈uSAJc) k&SzV4'"WZaswDʶH6J\)ItݴDї=좏w}*ŎZA?hj¦t5c9~C@*LLHpJғ[ZթLyYl%5S*ͦcSݫ`^nf%uhz@8$6,k(&VaԖicl[#' W+y*M]~KBݹBIuV(ixp 3)!$xlɰȣCr ګD׸kil1 ֥ Z7_$nq+<̈́``c N3$[ɾpFUC"k'+3-ez s<ǰop~1-糧 XY X]D@kaR jXc nZY[aYvxQM+a1ìU-- -. k @p-Ϯ kH.G[y UqDJ0FC- mQ:zf,(;DEb!}KeL`mNj)wRa:+F̤[i?BFugw$ytk9jT$HFAp8Awc+}mY̸_)^vé;%Jjf|R\0e"hV&qw(R "ъ!~id;H(*0@Hv ]f+|>Nҟǽ%c(pA93;esr^l)|M5犯be<4h-XVFZ"nji>OdzH75^d ˲qRHaHA.T<9 :E$3HJK kO V_c.hzJ?s^~ +5Xg<ɳY7qw~c产R͔K}3#3@b隥P_7YlK<:Nd.rϲA?r"{J /Im3O¥cNDҀG$]MҐ~(; . $uuPLlE eF_^Bu5Fۚ͹" Zv]49q~# :a7f9+Q*Nc 9܀_GikJ_ؚG0YtL"b3'`OrjW8Hǜw@o0҆-fٝ$O틴@L Ɂ@&O'߅>7cje"X #q3,ZbŚKZ,Н^Z nl39L0B㫞>cY "?Ō߁y}kSVX/ 'ac-tf;4כ֚$}C-,e{ :~-bM-6sڦw gY-r A$I)aĹD{'\(8 |U>$xw:k7"`O[ν?wWl{gѶo,|6{Ӂa/;w\oS/g3`&mK}9z|'hon 7CKD_گ(6vl. 3Uo/LRhU{Hgn&ݜA66l=/P3 g7O/HFdzYe?߅W!_g5U :I3m\Ћ5hgbP4@J!ǂ΢,=r wCWݩy͑g.:XUw~Sx!n6}:W~ ε)~yU`ơQ=DGQQ:кY8,=t\ċvrkݦ*|.LLO9$7}e aX8{O/H$1IkQ_)/kMP UixX1JOE?NwyS5ZchK SL8%!򂿰!wZDT#]kZDLJ_~?Cg@/?n_yVûqC`H=.ZJ0)Y}!,YoڶӗV21Rc] C`=p\8'el.SYm;OHQʫ[E"dʴ鹌,SMPߺ gӘ=m#܏ *(@+=uq<pŸ p^)m6ߨK&mq4*٭Iɿ%#wݒ_`:p܏Q]ڦ% j,mso&n^U_|r1wtrsat0¤ْ?`X%Jjv;2C>c\&%Qte1uNǂL|.)ݿ:AZu0cGR~ή%+Q0l>R'qZw 4"Rwh{ѽEݻ}6W/Wϼ)%4OQdUSS-lP 3jkcQ'lD#PT} ߡj-<9r3Éwvk🣆{-_6ama,7'$XrNNt耋%";(q 8N'ilՂͱ{p`c3jޙ5\1[&&ME: |jkmS"eO;y1,46iumQ7NrLoW&6O8Gdm礃T,̖0y$61-Uߩk5.*AunnlWE"3(rv͹n>Hl>` 0(ɒuPlOQrY s$U7'3T&7F: lB-=q>'*Z$'քd\Yje1bqK:I ā |E;Xs-JjP uJ?+F3e Vafb{"%w$"[60Ova˥'S64\fd*H&B$;3h-O"PO;1nl~6[L}iPX0iq.<ݍ|4Q86*sO6i rN"GG ,Eq*"hXqe#J9Ѣ],rsH9zG@MƟX+qN<BD\f\68O8 *:zeclt"e̛WT4vh:tR昞Q2y ҪKwkۚ :6 l+Dž[mHTpd&O栖)8z b8#b OA1Ƭf- L;V;Eq'KԸAkma3i~$Twy1KC0?Gb8qGt|`pS4 k{4C.F?Wy F[MeMa ZbzDХtʊkh;R\R-fҢ)QD_Mˢ&ւ| e P= 뛧wýa=T'C}WHhO܏Ib)I26Y|vw5׈9|9ϊPwQGKM-rwwZCֲDI0tjAdtOtUqZ,F d)BWہVJvCn/ :ɇԣ`p[ZC_?>LS_s(rf9<nCr~bN4 }\y,:;pṋe9B&|?p~a$t^-_^9g/]wJ]TdGi~gߙwyKσ @'Y(c5h* aa|a2,;˼eZ-ߋܗTd/MLoZJ+*K}%(3u>q'֕*GW i:n%yt_=e,O%W*:X>-xh%ubðGyg[y1ss?m5ř yuD*M#kWesIgucI Z'(ўoXzɛ84W1 [q%6I݀ǙD+Vqm[phVvFʈ3]-.R]s 1Q 'N.TqŬ%5' L6j-z3Ifh.GutOܧt= S+NKI#E/_+ӂ['D^l'枠{>li=/6թrOWy\tt^C%Ye7 *.gԸg:t]SEl `R`dgE Οz#"/Unv\a6puPP|2Y_m"y}S5@,gA *m}ZS 75ܸsٍSq7hZ 'eqH&o,x ]-'P1N:*nepw*X#ԽtܬF}퐻 &y4G]2{;(` zNdunzim ^}bĘb:V6xn?u߹$K_ ٘f\C|_xXWBHrBx&t_Q!O5H"WJ%s-s= qҪ̵^SkJwrju7hioSZ{C43'9 BΗ)iqh4u["В( $ |FsdZbTnDߺso; t |kH6_X=<̐0zYQ$ƋH<ѭ+ZNI@Mt˭l+$`ӶXᕜ)upwaOo* <q2'9zTʴ55B^T3/캛O C]-!Py&RBZm)}j?.bN>xH60]P\rf]K"p"ٟ.# 7NM]Is1038UF%,trL :qT. `]'S78ױ*Zb9tJ0@T`tiH%.yHFRb˒,1^D.# j6+7։cUt U;?Bw<5f֍<#-fSn>hM`[~:ۮNf'6gs_"= ֌C;g}5Z D@e$?K wgWHf5 h}]敭ț`VShDȨ ?n_g֡T#T'%])3 8(Q37S* ̬;@MAk UIw݁JO˘"}CQJ<`\* K-ѷ`>ܲݦɝE7O/@LYN.~6kaŨ4x0P3 : Y]:,:mk(H4`7pe'ƓP} {Xtbq^>?w?.>~xS' 1t445)v'*PSL\`D5}-ƒqv`fYb^Pჲ F{'XJz ऄ.o/f;=p; p ܛ1ڊBzzݲ^W߻)Ś7*q2?K} b}| ^RҦZjRi#n,S*]~LlYNM7XHGm=&Q5pN0 :^iY/_mQ'K^nF汈Q9K9sXR4I( V! fѫ@x4K~O4zQ􉮱~ZWJC,i|^&ͷ_4Byk/3hDUa?f]+qk=FͺF4gXGXY-M @0_f&!:֥q1 r8Ķê4!yWI+L%g]_~E2&(?{F㊧mv KmxSMPRV *.$Y?ʱ zbDvef<<<ܗ/_o8@ieҠfbzӼ >ؚrRږ9xG1؛fvƘhD$nu99{G 9O:Rlnx[ۨm 0hjJ+D/tMU;.^Lp쨣XkpH/~̾Vs%(,cZM?eXTz+((UTj+ۇ`d.a" Τ) H<MVی|âg(D!xfL{NDpK7hE-/uPeTutU-X{NZMU]هCiHP)p*ɺC})Y̰m#q)83&m]G0ؓlG`O9 ĠFԵXopSVƫ)`ί}3-K&$ieU03DTNNꯚ)j^B`O{k: Z'H*tL4v.¥ܯܕx36iٛ~ˈ #̫Ԉ! GrTQNpŵ ݩj1oogw{PQux@⢮w/hB5LhUt>aQ  ^8Dš.L՚ЧKiw+':폑oܴRR|ƒxT&y97u8㘋*4.//_z0_XṪ ca"LjtI#6-P֠ mn<pzs,WU~H0(q~i/?,gtpd"i/??+I͖jp &Up*B& 9@6UV/mCMXgZV珚qk* CO"&Oad^U䮎20?FhM7MLpW+YLI8HK&pҌnU4-X rw-+WM[曇;0 C aaade?iZ hɌ}tbm%v{l^t\%ܣ:9uŎ_t$w*c`<-Fj]y5g`DY1Sz4'^ۤUli[> IQQʥ;yJuܣ޽+.#lhu]ēF46%pХ2^_?~ǁB0 TQ ?ݡ]s\< 5a@,qH*Rj5 In9CU2=.2pzZ ,}MUI-+X)0ϑJY:HU0H x4@D}"RU/ށ-t[UKtꣴgiKXQGP M[q(],_A u~>ȦwWuӶp"M\HU2$ pޭL:WsWŶ(?]arwV[ϏXN+1]BucGM #pؘǣ;\ڞ7Fb!Ԃ.G&$)H`) U\S 7-恫h7ջ=Is7h?h"rO.#͈NMA麼H.jZ ETe1woWep ʂφn6pǕ0qtp'>9㬞U$0Wn/4RF=R! {c>B&\{ (Y5 AqSӴVpGͲY]zot$6ܣ˪X{'I_ @&6:Qɑiz:S:;A$y6^[_,]T,ڬ=E€g~pO܈HG1cR8PfVM9 836}2#&{R۷'*$&A#7RD>3֛&CQ L}ռF'㞬髪&= g1E*=jβ(%ӦߧX=D[ۅ5|g{pghB7R E*7UTZؗ&%Ny:s, Tup=5ױ_Fz.!USh!60qb tհ=_KnJEr R@s ![tKZ bԏAȋOAˎ":3YCo;3Kw6<sN,B]9|%Ǩ-)hȍ9,-ogi5aR34sݕř% i8WCvrqNrPEll>8WwF*Tf00X+ύVpm9" ce@xRAFa"/Io,dۺ"'?bdG_Wi=EjuR34`!K9_ׁ :Tons=u?}EVbxݡwVy HGH^XQnٶրp@!`h1 "?{l>{^tK阰d:v'bO_,[Ab7d-磱ۡNiP(AH)p&n W{Ba?ַ$D2f+^V.A˸HJ c(Âm#r"0,swH"]tV`du imk$[𝴈gZtaIo,i8Sho(e4} }PU2шF2HK&vP(ngfPM5Z w#abie4^6u`A.(nS[ "VwA6UɯxoZS\%̗g/E bXf|6v<,I ]=|_5TݝށE >@#K0r *br0\m5i)*^"KoYg3Ge#0`yc }-؊ChY4ahi Yu:Ď%(#6IPQN}c_{AD`n{,lo-, ŗeRq]x$4ae9|/+#iDE>`Q.0@1x5 :չJl:87U_̀(9 BU0ᱺȢ+`` 4ӱO(lĕL!: JPG(5$:;= IJ^Y$ )[_x[oV9 ٜ櫃p8xcIP2䑃=^5݄Ƞ^/In"-v/?7r bWrf\&#DHN)oyx*9[wU3@6#@B5Q%̲bwN%|U9-=^}9U|UO&Ҽxẍ930'ݽ˯!rý&0h.QXt9 j\"c}}9r.c$MEHM>H'bKȗ؊6"1f՝:G< $r=ᄔi#EHLJW͑!bqyH6u 2$@ʁJw^|*o$,U8#]r&wk^ (C:* 3~M/},f!O x0DžpmSqA6i:Ω(b"0-Ebu>BP6*])ufwmb I J'kZСqR8U^4SDA/8 Ā0f'mNcϩ!kiBV~hz"TohgU496g[0:!V!&#0C?D]6޺zlx5 L SQy2LLPNH+4\bkC"Cdbv*#.2,'Q4W6d};_&W%ɨ̇@,Aɔt!Xr΂z0G*LL>Ms?2 ,BUG^vM8 'vӛbąx*NY͚"I!:T`ojStGZ:V7@KB?E%11Z2nvadLCXllZ@C A40'!/ M|z%vJڠ,SmӫONݽI'TM:)Y;-ok_5!xcb`~iR3rnYۄ>Ð ^H؜&?07I:F}1oYP Rr >H8_Md3qKog"0IG,K`#ף-y39A$6R!Fp6ޭ!%q+5ãvFGwo1fQSܗ`ӧ >lE3zā0j`E}uӟ'!#RU+D@DDU3ks&??"?{ϭj-{PK;]'ר22l /?򲒘2zj4aDVQL/`Rl8ˋ@DhC9\=0YeޱYuri\LQ tF硳\Uhᒩm0yHljܑG={}g,YV@wb&xڭ=],8h?8-Ic'M@ j3-,hqߖJ^=\bCIg<Ş{!ۈ{ gu%Gd/mAtvPXhw9<C$S U t@g!di:u6G΀7ecE2aW#=1 e\o4 ؅ TT -Ɔvۙ#(@dKV 1pA-{A<4Hwy]b19$1 B>0(eLpdMQ"6*D ceUBz OG*V7 vs;t4"UcyѧUR3UiU1s6\ ڪ &rčҺ01HU$\ߡ6p9)[UR;BBv|b!Q Ҏ\/A<{Hw&5DmQ ֨ȗ!j~:6FKc}<͔@+"uxS$θP$4 +--nU;hm;ƊH(K|deCԳiuuD~2wۊ C>y q$!mIt@-`&7q<Z~AxC;B\WV/u&Ajzc$dָp26k]0,gR(+ Ǧ~2ؠ:XJ`;&ۏ6.YZhw歼!eso|,LXHԩ ҁ?HYʁ+QƏ~c9>IZt){pn. ܲ.¼}ZɞLjQ*'hе24)2D:2M$倖*Opظ76q|nWh|Z}_%yViL?"c\l°x|ñ^R>1K_ d174YxjlY`KYbV*MmZ[*sJ(e2 +:F˨rUӃos=VlϦQ9ꆶ ٪MH<I^Tjqu_^ǣlhƔd"Ä#Pj F(UZN-ʙFOmPf?+p"w6/B=1InXb) 8aI(in` CR IB߸ vMq9uN`ĝRwW4F)B?tŝ; 8I\ ;-miAk; |\5%[z1r4*"QXf<ֱ͔J(29apHf(]s(jdlJ! EdQ㏳gL%8T6ʂl}A*]I+ {t:jL C(O)6afNщ]3`m(2P`a=w_K!F G@qo&砌?Q471c49hz0Cdzd6m1fwkKW&z+e-b,]DˉQzx1ۤlm{[9FV Ve!:[R`GL[7Y)Z:v/&2XiUdta#ڟ#4-bd=d}[K0v.ڵzpwoJdo .>5k qHmW8 a}5*LUIm:YN cg~7]bͰ2&h],lV^Y3v1x/^XG9jNVƗÉp[_z\xRpc2Սas; SZ Wo|qI˚l:L{Rs?oMX4 `4 yH;ʙ#@gY?.uP\4[)g5&ـ!xMiI*iBݜσMf3<,;[ޫHAJ ?v]3gŬiXУL?iNC{ܼ5#?x ;Ѽ}ʛ/X1Ifbh6)[-E5t=I84ǕF)W{Nm ^Uboču6BLGi0;X6zp[d*Rʕ+V裴2I^;͵^%vN(E0wo#InL G&JLuU*g \Hg߿5a@d1PՑ`#Itت`4ؑ( %26glC{يRVҡoѨ7uYiH|5<"z?B??yPmo5?_ۨ1V+|Ηkbz$.2e:%PaV }qLp=f {I/Zl>¥n"YgC9ZUxx fC+AM|vC@O0:I/l28LԘ(Q ASnJ͟^d? 7Qp2Sءx,͗Dn/C*sΨ[]GfNi5/HYKYP3IBZ@hx&gB !v\N?dۯܝW|.OS7,Ԅϲ̫꽉 $43۲ѭQR9+PSDPH"N[aT`3$ڪ "ֹ/SX(-в 6Cm9f4Aդ_=^-M ]è%q%|0h|w!8%wr|JE$dqp! 4t:ErWWz9T7$2ݜz'~:owROM >Zyܦ4C;I8t\C9cqCYZDq B K@ X2#/tȳ!m)}^A(t: /y^Q~(u?NԘraUTwu?fSO8?D>:xm1*du~MqOHu-C)$6CY>Crd+η M0*$iXG-ֵڄtu 7J @irwܮB9QI,bw=}j۲l;KcOtJj܄1NJlکsX%Q!(Nx}3ԏMs?wܣp8Q=Nd7iiԳ:S TpEVlAiڏ#o1#ʿy΅BBX ?{㙺ҿuk|sAedpwL&JM}8DLuHDBݭL.kof祝DU:4~^4a?_kҢ3> m2Zc[&J&SފS&L葸6E&tFSiZc.uרԧxhTgb^#j,'Zŝ={& IR uB]y~u=j ǿD,x̜ :loygûo$6De =Vt,trvs59>!3;?l󃻓w1gFGؒEQFq:deR:^``CZWYhV=^菳bkYn*˲j{(Z|) w1Ԗ X .39GuZ@dT㴰UW$C?f9웶 iZU63CxW~@R_XzÙ3R"RB`%c]yu~_E.{o!/^m2,Χ˳JCOF `auRV`@az9@ JzDڻ 1>:W^}8g{fz|zvdFf@8`bMerkDM@$ܮԳDdhrzcuw!ݏ]M '6ɓj( qWK^voBVfE3cs+x5kФ sqp֥'qY+/~6N~x~"t\MShe5y>عI [viRc;]_p4Jnp9U:C&>y;&k}Er:t%/PәΥͲW!X%:n\ K&نwXfƦ ٮms+ylkp ?Jw7**+P\k4 Uhd>- e 7.ILC֍"R:~PFXu qoH*Rsd6ʼjm!a{^➞]0x# y/iUm#^'X-sR/q>',BEe)Lyr#<>n^_SU!m+giS6:D2' R9INDFa Ico1ߞpWM糊S|9>18Y5 Z;??qਯNq KgjՌ;wwƝ匋c|X; = 8{: :x:!IţQ꙳|笏\MMII|Y>]zt_~xm_2+szy{eU+P3ִ@%TN`cFM`yx 6h6޺-/slKlъ407\wuf1I,vG.Tvܵlo|c㜻X {]!-Xtqi Mf$ 4ǘV(ȃlI:KR*g%l4%5]qu@ PLf / $L{aכJhػ++L ҄Ө| _e?&›;fMDÌ˕"=IO`o0,Fv}N ]kvg&$?eG[vE畻^%I|Hi7sl,)cz8ڠX꥾ 5k\D>|=u^fNioHcTUݺ'+F>z5vσ$GnsǣZ)1.쳳`Z3`S[=fuGSݑ&xUa36gaVn?<|b `di2⾜I<zz#oĵo$\ǤkcVt C5W Wywq۵5V`T,p6sv+ljxI[3Z'X5w:y2 7;[.ݖ_ ֛{_oZ n|wct|JN[Ã+lFg۩2 s8h,Ɩ eԊJA $3$=߀1^Ȳ?Uq>g[Dn*22X -mM iIgb" E9[Nvt 0Kct Zi{$ KspZʐtZr[]ރ 6l!-c|}0sA1wek\[2]R( ْw17!ND҅MJ1>@;}W Crj3 q:=#qcIHG h{鍾E mjHMUzw$KFD_)| >oznR߽9н@!oo4b%=A@kP=:šA+d_¸vW/nT*KALICع{+8i"U9Ā%ux8t߆?p/Y3 w`# f{_q}9 )J]$KANF 6UMUviv+ ^.Qgj6(no mc+ f `( S9q&-tg@ vhs Ϣ!K705(o;ywJW m{;fHC_lsY>,s~̒7;~F+msͩ K0\{Oq(V]), ? 'pt)4ɣ-0 ["_{; 9'4OS|hR&?9溮]u5EPƦkІZiЁxn8ȢX>B-MlIǎ\#<@>GlG[= \BR |tnpjyWdR,ĉBz* *+ #Q:2qLwH/_M~zaGdpPiNՍrhP[PF8BTJSC72o2UeNyT G5vC@s~8=ج]~YdƚsFI`9M SyM~;|wpq/..x0{2,?W]sx~2Rb\ћ.'v %۝dj:OpZ{xx(5pZ4RUe;tjw' ~r:p7O"+}ْ&lt/gJH53b4a@"D`?~:nv㏗W{:ឩMpC'婀8*)Q*EH翽pJbRewW އiTY+ǻ^Ѥ@藜uoμ?H3lR.xG(j wi.ٓQΕmAML;!b)ąs00{U 7M!*r{O;H2uH>?Od1[eI" >mR36ѥQB~rNRcqQJV'ԷIlvb|RKܗ2"^ R% t6WqE2 f)4!G4K9*Q$\3_gC$&.DiD|~%N 9ǖBVР0K Qp5kE"\\*PO*(r;q0''m|.uf 4dYxuv9.g4q"3gIF!S` nTf]iKr3U9-Ysl3L;)5䲛{fe e:p$δ WQ$[rN=G`]̥4yZC\ad&@f3yعDNb$vߪ)tL':Uʈu+K\raҝ! "!a"6-ײQU43OwsdN%%tj4ǯ iLܶzۜYU#>4`Ҟg՝R~}jOӳPZ"cCSlJ?k^^wiK3m!)FAA6hXD@ e+ffJ$ s9FzwwyT\YpϪ]Y'v(2B>jn.ÖviǧƇG [1M%52QUZ7 uA'?200 i.\_IF$ a"2T%:rpY U~ ͑k@;4T;8`Pbi׬OzDyy`GH1]4EjJ!:$孢ረJn^^<#]mѻ$ GIA#^+:rUhB}')< r&Z/PazdSAIn`?ψx_!#7 Io OMu9;R[L'z8Io]b(sZި(dKV̮IFN%蟁 l$M7|ֻ qЬGckzJao oA?D ο9N}wu~ބeN o/} eNlYjdGp. BZSÂ<J!+-+Raއ?Tc -զq Ra] 跶%z!]zyV~?qm,XvwuNxb>j!7~CI&%UYtҬiƿNn(nZa'mFV&}8̀FS/gH T6[OBjbA?%Jg7Nl c+u_: =g?%Nvg' +~kxTLӪ+z{vc Qx?dkk6!qj;>+QG|?ͨ41W`@**)=V1P#8 \M_ݗ|JRIIâf/QlQlEPs$\uQrY-r4 'Yğܵ/'\( ۰?N]l\V0:ltČu\h]:Z[cOdeY5֬SF|q\Ylc)w- yLK*HVւvq^ciI,l I~näiB/AT=uS!vRkɰm1\nHy-꒎-[trf?O`$2bXM?#ZS"cca)Q+Xs)rhHL@80 w9xf_ݸ K#GN adߜR/<{_o/m9(xME-ߚωߓ d/T@\yUe!랟{p3n-֦fvhJWim&4_(;Ɉ'Kx 5îFx_>B2?(5@3`h-*hX+ZBtp;~`^pUrq3ZCޑ"Q.V7.R=Yƅ^'8Yy=l0iO}YӪwxqa8(Num8M,zwʸ * Kr]URhxA򉹧z:`I0+tOsiqA.2vG6j0 g8g7pG"Mlmi:Q~i? 41*9r4{/ՖV7 fb=d{osL%`W 8 W:qG\<"$Z\EuxOP,E(} jV1kK^y=l*bک^-2*kGD/I&\(6uՍiY^Юs%VI6oubvn3`CgJ '5%+j f N {0ΔQA#Ds}=dq2Ħ5psP;|QN2r\5w(P7 P{J2Ij E!kwfpkF#8Ʉ'XuH[r(CH.z:UtHR 2Dq&viz:)b\~C:h`.o$@)!1=ں&q;=5L E0ɒ tKSD&!yaؓ4iQpcSpL&>waSKr)b0SVQBif35*< g&,ľ?W*l"j%bhp V8K׿-\kYC,yDJ4I0:!p IXolZl@@^٢߫Ǧ9$m^Ya?^]8g|+_5+8ziңbBrW<|D㖷no)NdDɴ,Em] LڸR yqP: k7};,O?J5MpA PʅW9fO=esn"ycd:U]ǎJ,plլNT?j'&\L[>٤ԌTGX8n%ǂC 2.܇v툄p%1Vû2`B@_z23h1^D[+SVăF$n(yap"J~ҭ& R.$q;TkV1]a$^[k`E)0]y/0|E͈(Ysz%4`n͠)V%v|QAESt(]٣۩!+F?Rt 2:]Ox:EᐛeڸWgJFk'OqL .hU6܎t՝.ґͦ$qH- 2*CaDԝ厡$9&jL1ow^~R}xd(y ֤¿z5D'lj6OC%OĨ@sCW{0!5Q% B#`c-ݒL@)P*Muխ28 3(y<[u2S9%-Y4)T.x\@ l<+wThaPa?uQy kx3j;\_,9 Ue?p>.ƼiTiF,@ݹ91BL}8 ^^yC1I܋!y3,XIfzy\fCodb6Nݾ8g.`ӀVΪJ8@@۽{pUxFU( ˘,4~4nMkҸvc *(U.D Z?_~yK;x5&9K{ÙŋR!u7fA܍7 UH{q %yuS{XpZ Ӌב`o08a ^ը"IOlmH/YS5|2ԊǍVΆGm"2hRӳiL%>bhHF)b|B6B[S 1{H5 ttW}Ԃ͂  jx`8ZMʺ+ZtVBVܢ:nx8$"ô Ie~eDVxƬ.,*p0~$A 8ԍY=֨*b|8Qrd6{w^Yx`a68X7rP7o^{tF =xI`$0$pklB8{$= :GӒs!| oьG)^X_M)֥bvF&ateP Z 2AU>^/gIW[{XvP V19h}Ull,3Ǔ&Ci呴tDҢcGxzh17Onc^G KjϏxبHřlʑEpGOA'KjF-`1;pʠ  q",#]6c=p/`e%qIí<`H8s = Tx8=DC ּtUXb{,\Ǩ0Z|VXlv}WXOmuǂIhMc6ke9j^GO$"`'6-1K&,rF$ۭ' M%rnX5`T{#V{|HPSщtW//ǃ/2q`fl:U9eki("1@N+0nb㖎\Hj8LP` rwAEB|M K< GxV%h@{ ]5^|E@UΩI.3 ."(*ε=1Jsz*lgI~^sQl;ij fIM2NL|bL`޵|*}>|n&VY72f-ƚ;'t0ChU9 nyyApj8g DV NR/5}*L>~@sMPϫ0)b4p1j%ѤBPŌ_Z!Wh*!>U gdm߻$+:A{ &O2M)vdL[ʙI$},ݹ]b A+#\3I>kaX̓;xXX9J~:iۘWM;f0 I_+ n#[姓;[3Er1E۸l8|8`&밨Cm3cġ7?ee_󇫴sM&%1<ݸȞG3PImӻ`v9ʂs?RAN#ltLVv|3RRE|4֏>zpԏ7٥y7}e4awn;#ـ1y߄ص@ {q%đϫ^l^{LK~^N%'eXW^{VL;Cᤡ†t"jbRw*`lQ|.P!<R.պ˸\_JǴSKkU{\v 0H:@˥^nR-7ILszHK܎jڵ/_eP 5X}gqtk%EnӈZB<{OE걹Y蜑;$M˩H,v7{2#)$,ۈLkFF$UkJ.Ked7j[b-bB=#r_#Z쒲.bL Am^7@梯e4]UkWW&Lͩu闒@6jH\5F4@h=dT 52tbM.y&$HWAm7j{k•ߧj ]dQ35A,-!W[+|6Q:H=LB{ 8[s43fU6R3ab^Pq?"A^b BM'դe] V).ګlp&节DWV-'926 xFj,Jm,: h(؟el y}%0 *_$ xtI9#N2^C5"&>Dxhw!Nb>*ǮMbe*FF3=XȽ.[WSޙ+ `,K]9 3_m8dX+3K1dj3S@ \thyXsKʡ"64N՗aR劕GUo߾no'l:vWiFktqOGy $oko7 W}kWNdf'|wrǣF%/=Э` 9m\(Dcľ=~)&[})qhJ[3x:Its,2*0pc<@¡vsM]>s'1Iz1fNcp7h &wG} J|M¾*X^pG(t<*KJ+{ki$& rg>Hw$O,-9"`׏FW)M4q؂.-^~:0 }n o*}ҡ$ٸ!C@.v'A!']q-MM}\-́s-K~B@(Rq0eVEZ e'8=U*Ytaa!*RݡxeJnHg ~Hd^!E k|Y&q}lia%]Ɉ[o{>mx*v6{hhS)iڡq&:S$|b_Y! 41KfLe"F=)ñNt9dh#p%-F(sŒ}pTHUiDǛ+Vv8hWӚ& b!-"9rИk;%| k9YV6ko7I{,.ڇWưl/ 5_yQ<(-h% hvHFY{pz\x*~88͛NLW{'RQ:6"(QMuM 9 y*G7z#;T8Q+0U^Үp/}ˑX^Q\&0+Հ4V^!_{3GU: Pbؒt²^s['Oǜ}h뻖Q1O!^8[T$"{)}mڇgг}>lz=ۇC!NC^!.{w,# GHr Gsj,m*A YjzqT Q_3F6_;Ǿ]8&`Q4Oζ"(ХV bJ؞kb-͖y|U]qQ|.wd@, ̡8Yٶ|ng>cZ`B2#˝N; J؞^\t/:|UW8# L}֧í6% ٸ D3ݥ J> ؒ*i=.C=@M:Q^ꚯC8Y<-G_/T,_ijN5ܽ8 8wP2K(V/iǬfuߩF?>\.%.7B;XD f a v`L ^U5R!jU35M~ތ%O _vQFro$_04ԓW2i24vGzR|wN1u5O :Qz傐q^J:! [zF,M&tRx%O)m#ȭAÒΑ&LJ`WxpWs8xaŷՐ@צh`?TJg:/I'qlBGs8v?o"ŨLH9Ex) ʋr8DMaU 2pVu1V_e=)͊Џ)>O{QM}aWآ.!EA>,`++hEK¼FӨ)W;47<tNrR d;`e3R ?Ϗ9hZeR8х?i6pKVuĖgs_111O3 wו5^͝v$"ӗ{lȠ _ β t˜CWfMmv>U}C\9 QKO'M0bl`XJ'  )-6qyvA$PN#Τl͠)Tpd,g3{#Zy!Dm a5?MqBϜ)v&uJtc5b ./x@8|aAs,&9[]dkaS/%?AtkV70-}pT2N=uqjP^|Qӌlk^)#]gOIàD o{vL\0`,Fc]R)MOG}֌  ,ʼ< V{1>ACQm+Y $AQ@(|}m/;Z|f$S :Wޖ{Nu%ZT RE\V^jZVg5_@6bX(+}aMt.,h 9K-W7dh.^^>;kPDurآꡚk)F+ xsxU$sSC[5$ O(8oꆕٞdE b_4t\(ݽ`ߗỲV kɧ"˰.Jvf.z!u)mp[p7\_0![Q`.TȆ]_S&D(?A82Uu1ӈ^ j-C/-6,nPHoQ˸vx|=QL9/`Κk80gaaҲal0:Um+ԙH9"0YܘI@>L쨷 Xq QJ<u|TSV {c|SQ{O.Sݨ涻ER0C-⩨)lZ_lyAQ5]P\@ϟS8~6~[fٜ@϶'Qc5 Jl6t^1?TF-J!V1WӜ޾۾4l@VJV+ Zb#in *`_i5%e\h|WKPXyM׼35'ɓ81UFFcӔexKG<ṋ51'8С9YWCH@l[U+ScKoD9[ݴ:so&I%A^HSMEk[д~PN8(TƏ S5upOʪvInTwͣH["#]Zx>Y)lOw_񛒻F}+=(͗Y󮑣iDnr6V&/_L>C?ْ2i9ɿVI"IQ+ޣ;o+=U6i&\yj?B@* 3(0$1uzPf5v>FrMM/qx,6h+x[R#,k< s$(0h0}cx4z ԭ| O z!)Ha8ֺkj‘ QpcKaԇM&@c~.[^6 9'm:r[uǦ|nb9hŸSա0lyVo-oS̈́/[L` k\24ͲrY_&c _);+`(֋dԙ'0}Cފ{r_'#ӧs^@!)!8Uq/iPO׷SHiB܋Ht&_Y/G̤=F(\{e^3$oŽ"Uu0C6]=Sjg,Xq@"ˁ!_ߧ CBaޝ©|Ff8&kU?&Vwvp֔)X>2Q6@Yį"Lx:Urj3lrc K4 O Q'SȚ%Zw)Rbtܔ+I;v}#y2<7[1#a-R{t!<6,g2(am `!#|{ҹФŚQbwTNg=IW0rg 1n?]Yw#:ZLio3e}:T>p`idEݦ.즤`)KX6,zO8+wT͛_#-!&gB048+!)F6M4՝ ^|_=4qZʚΣ=qMm }(>oU6Z|ZGFȎulvesZX\ ;}qXU ܦTE*ٳNtȻ y?"nmLwEv[6Wo2b59t. ?%QO6mzuZ77wHl7cM)[MPHD슃Dc3D' Re]&wh n1W2߫x^Ppțm@ ,J2*S(ɝ$t2߼\pk\6Nu=hGJ3p0-ޕi6dtfhLO}UdR5 b$芶/d4S)k(a5ml]8u6eWZso*@+ 4 =$,X_G ^0UD<{g4轳OWUITz|+ޝ}ͯSa+#B{J@GY8qߥCF$xcVۆ.25Q_INBo*&90>2*3^&U!33i'Iz#d# x?b؍|T(LJHqxc08ZynALnxc%]c4PÀwvsޢXo$6{%nJT5 0Yg͵!U߬لԂ1s}m'Q; ,@B 4-ʨĘXV } TSh Qq IFtȆv:@:Qs ӑ#=`u""Y3CJ!09!ҁw a&U:(c"<`#<0 8inM`!~ߊ9 ثE9}e.%\=4tP~r!Q 9dOg E P :Si(5/m=S3Qf^ 5`:VվǀWψ"/ցWݸ Mmj3Ftz^#7FҺz΁y[`=oyi!%6X-px1jcX=5K&7˽DdacUe1-Wqkv|"wV,w+ߗ0D݋ O]PN)qXK6eky&-w6[uA:K '71% [?jL$ BTxX޺| 0NN0t\1mEٶ@hן>%!:q { I;學C9$zn }{{]`>^/3͹+/˟<'nL1th/HrAU31{\DFϵWfhNCq YAS) z4jB i?ҌרVR8eRHn4OdXx2}ʀ$-RePfAz=Pf7Hoz~[ӻ2FT=JIΎj ][\H΁s6a}gHmtJ~dФjªIۉ{Zt0,spaά¢ꊁT2S2mJDv2! Q!'(''G U3Rr,= \bs[_EJ:6]W[a_>c?N%Dʡ:!*>ڔ ƾT駻+'%(5kU#{뫪31ub-Qϛw)-ߺ2.2&y`CG?Ug٨"@||Lر ~)AJB'0 S nG8c!S-*a:TKBmwe݈$?Z!0V++EKmf4o[Bb42)*ڥm[[hYqMeȹN dO#䐗uKs4_ V3TeTkgYs*0#htamDSڭ"cL9;x(E,axѯ.,܋ZįcARZ6DUi I%1}u`(Uh oAuE4~Eg Kos-9h?h"4T?Dqsor&'SgOs]sf챌_n¬3oT kI*MM RN㲖x6~ 0^]t YРw#&7  ^22>z{oV4n#a`/O_ ԙ#~Ŝ o)ۄul:6:itp.,*w(Ou0[4&7DmTQYJN QL eQTAG`U'%eتe#MSLzuȯ py8? .t9"4@ ҄[ L u:v}eJpj !lU̍K+Cl_P׶:.kRi3lX꿖QJiIDHßOJ" 8`Pl6WR,̴thҶ5iTbգƬtfVYcPE~F#CG7VcjC\)Jf@P)Q{(s&'sq<~ ,<Gٯ#l[$,),dfAS503 ^4LwyQ۾ KIgG=g>e=zm-Un!A~E>98p G 㷷qvcg1JsFc[_GjY+Bvvk:O aT:GI`|1 rngH÷O6]/hpog~䱚Y z,w}P]joޠ]F7z~/6 _j+?# y|mlbpx 0n#%NJ-!_~5 :b+n7`F0o:vU/o{5<_[OKK^xwp 'qpmp`EUirR+åS9M|iѣot&Oݏ}SE/!NfFqsݹ&X](h~p:κaiJM@ꁎ}M^ީw/`ndc;b4AU򣙦%k 0ٮΌg4{Cޛ9 5*0A$bwU'3$|)ԾW0h,zB YA]ڼdQNu7VRަءā!O`0BQ%%!5+txn>b'Vc?7J C:i8=igH0p_youX6[A9#mo}25 őP<1@lWMi_Wրߛcl4mz>9z?%U)a>vwpSTudկޕic/]-S!y3=C3H. c=bD>,4z_&{Ԃ>-|.es9gB uȞ[ ÒFB?V%Mu>0ƺNd)7$ 4'- \?Z@X!/Bng_sOf.1[[;|%+\#L=gR&V"Rf:xF̢SGU(?=o0r?c<Y>1R tݠ"onv%Vi"Tm}mRmiqpQU蔻uiNˮoĥb}F•P'YP(#!3s-t ^0( SԼ$O2ȡo$яu18NuӉF<@0}^Ί4w͓ܧck_g&Iߗ=W5Qttqb֛a nt塭('3e\u6Xh&T 0y yDy |\l8}UF!xgva4ZḌgvpXzuӤ#*v㿖mw4^S&-XU%5%\ "ɕehWlTʽ5B<|D@e7")m; Gig=xxZ"P`oYs;3rqa+YIH1=ʈ%qyP[N#1b]:bry'a=*. :d<O]μЈ Zo`3'uv\(R_[0@0$ܤI}@(_F` :Lɋ',zʴd2,<>L6`XVv8IsCΈ=9*ܾ kߤ%uGG6g;y#*MM5L%<,b;-L{֠LΠ*.K[=:Q |Gq((+(@60gع=@Z:ۛޛyړQ/Ċe}VGzH\Ȟ]6:8Є4P?Tq֝Sbpt 5q'L}W.I'ydzˀE8jیPaQ3x}8Ͱ`1)P&,:tOPӤutfNmq{-NؐaoakcX1U&2-11Ӽ,.JզE\v2D)׵N.,2>\@`òَu[>c+RuYSe f3@gq ݕk^Z/^5TH"~P` gd;QUTo;[O/7|{Y:7|1ARuh͌V5#Y5{뾭XRf鲯2 0L=AzIo4 Q //XYWMI5u dz -+Ь#qyq7u۷@٨0LV[KPLQ^$7 |4:Clh w# 6njqliJOyᒹ|jC\cƤUCm>1L?X8 >ㅡCC 5n&:wĕwm\&]6u.kˤ P;GȝZiK-`f-l SĴŤPo"J6iQ24rG0HIb7!:*1Pg?2Aܢᾄf5"B;*IJJZ~uml5;(␹x (NJ&5V1V5܃.WYkjJVUZDn il%rG>i#H(& f)Ӓ歼:#&΂*w3#ugjF+\ f&~K]!aӦ/@!vL&2B̝̐X\m.~ʘvgM4?@) ͳ΍lD^V%1r-7uVA> neu.dɭ5.JW` w !fkRHq3$+3a̠Y"} dRMr|a Tfnh3"f )fľt~ Hn$Nra|VMT҈N_S_ C F^C0A3`'aO2I o}qfGN.*kE$(!Sx_# d!pB} u2PŬ;0LtMBCFw@S.6P[:E=}Iwм˯RhT83}_ێg 67]G!]TӷP*:itn`lc&fH$pGlth^Q22EyP-7|cDo_{$}_JzVi|Lf5BcDH"w(6Śid%gN;5qXF4gD/ p ] )ˎH;#J _9MF4R=HdžJ"9?o0.L̻QY\|O9~p*+Ѐ2XpHrr%Ip4цoU|&!ސٲ>:Xne/Ze6xa̹=k H&/$S_tenロ(Ӹ[>F'"- Z K &>?" [4z~з-ۘf9Σϲ}r~cQ~>a~w6#~PڰnWikM0.% PE.[ &3r'ȳD)Hr%{RtQ /@^#|K%M]y^jm:x?X$]דwJ*\$IZi9 Qb. 5O4RܑT)`1@8K2hӥb{c`22-3p!%Ke)Chi!IbПza]5ZARIm#y[mV/h3ڤF< Cd^.Sp)$f$ m$ ߊU]am3{ "THeRBGO__P 5Z/WhL_@VDbK*t*Jj'r_T^<ŲEG")Z:ܮ+}peSɻ4?@m 6gȳ lygȳ l1ly<@l @^y;ocq̸=@5DNwǭuK i!"K#*4.$D(˨tDd Q*ЍXйmf.!-,~L2I N%PFa- 2%3e&yWG2X7~GuDƆv.W5J! f|?KosS^gi?>-ǮbQPwdtL%8H8ZJK[%3Nu cpu&*M=Rcf@OtcL£ \`qrbDZ1O?]z )Wݧf _|]UWL%$aouHфozDۙGeuo9Y>kZfh y@ ! 1ʩ2,.j{Oy-wbJ7?_rP @%ued5i1)[LLbn3 N{J#s[ FG =La9H;9ݓ%Q8b~@b'Z`sfPWucj*;Y =f%J*(jqӔ599 ѻ͠WM8Ζ<3J -Ex@ +XTo 1xЭ|,45vvU'3otV?yE00S|rVq, bL,y:SzHP  _@!?,ii4LҜ< T45k)nl̓-?fǏT3}H,}$fȽ*6|J 4CT UjԧPRwq.h"r⹀M'%r|Xn-$5cMC۽n4 RqZ#zi!b%gz5Ua&[HǹȈV8əvumMӤai",(m X)әYOk>F~_Oztz įh㬻7}*8=._(K@Ťei߲ "OGSi{v8߀1y E3-Ca렮Z×FU&CDQY1uU+TSļu8dhV̳%Y:#<q_Ep/}{wp MŊ$h>Gtz%Y3B݈?ׁpzs-[bWֺjEWo}17FxPft%寞us J`/벏kmS;h6?v8}L-_A>_U1_${,ucb N5_|Ja٢.sKMZQ6NQ #p̴o,??iޭWUNU{셨tU~@K)~ӘT_ 7$ [Vv>T9JQV2cϦ$q1g.&vKنXQk]f+X;a;ԪfީgD8"척s ;~Aקv,,}X7UXԢ^FԯU'8UDCq{`6 S1Cٙ|ȋy{Ԕs5L1[K^kNXa)o&=g6`X#МIXÅVriw%< Q@* A(@@=_F ~/Ū%klߐ 04/ s91AAV|X IMX` .lZa@ n/ixO*tܤQi$Jp![pvD`3'~IבH »fB qIb~ĒPM3aiX"V[#A(;ADbcz?2 1Eow/ ͉8x]zK`0̙@a IA"bp !XޱO,É\62fCX)Ԝq .܊CN/cv_5% 0߾&xJ/-ny|gcy3y{r9ݯr1~dF,&Sm6q;|:FhW<˸2]f3w8[q9;Θxlq~̦I8;ahUVTKa"֚].&._^mݵC /yD>HxZ}XpItic X*|E7\6}eFQwz$=uЪazi.cW!cP:EsJQxS,Vncu*m ;6U¼aFs|iMv8z'E>a(J" x4U3ݡ9c!1?|"Na|+E"fn9K7 @g v g &6GK2?}GR$lJՌ# Wƴ|`<!ߐ`KMG6dSp=7_z"SLχ l"^K/ei`͞$ ̰L MkP}L~DAȓkޠMq_iEEc6;K,| 5LI |nn:>J Iȿ/]tW 2=$wI)7bxЀV1rr< ]9ހ6*"6N_S>C̓4 9q1&5?{,]ph!:̇ xL\~=To|jTLX *z_#& o89)+ivS5*#өV@a'tI3sO<Qtp\NfiNUScOa4nOS#kW44qf/F]K.S4LwFTAJBWiR)`0׽ `hlxo{wU˾,+#,*n8#N#i}h1g+yE|FڔjiZ{.m[Pd\U!'o]@ugj(tkKx]ĄzrqCQ@\d Œ`30҈z,`-ԪI pjSKeƺ^غ"`~B-~rdZR8Ԏ8|&F?Üz#m3dB'Q#N) @la3$I|CC"ȳozIeM`8C>L$I@٦eɐC荧7ae1Ҩ; B$ qdnYAhPA5Х60*1fUD$\8BN1Ωn.!},msMX_Lo>= 3uriՠfyrbB`VWi 5MFYʼx^ъ8)fzY_u-H㋽|$OP&uOL{72W@|cmTY'mvg<i+jM#u :R?P'\Ah#߾E ǰeu^iA]P).7j޼ r5-®U߿[,vQVfK<Bk;}w|5T] nJA qi1ѫޥ,r8cjSpxGlPA+~ \ԣY_'#39x#U>?M< VȊ'ZOV҉(.4} `\&psq@ic2~98D"u|ܥ,Mq[4"lD 9]%j7$`0-OTfD08m,I0i Y)噙T6 $,תWMYҤY9SHSޒ:Zӝ՝DJEbW0Α0 eQ_e }f@w-EƊOԁI)ޔ(cX=szztR*oz]aVr79z:dGOk52%ØWHH NFi^哻fh"2Z5w>Z+fs 3i$Py%ijhɧސ4^{&s٘݅V0 f@̑JK 4i Jx-> |䕷B(%^~@ d^n5k}%t=D@il4P^RO&N?I/XT/Lo7F6N5{7Qa^Qކ:iFv"wbzvnZәZl,qUX.O1#Cզ'\X>/H b4,Y|XQS)4_YFG7˙8xWWIVsq,ǩ{?)rqfjJ_{4{e+s0zʔ.t|GJ"LiCBDȥ9,)-eO}N'=I{jb(S!ut:z}p=-s z' 1!&pM9:qo,X.Uei!Cv'H/(411խ_8CE1ƿЋ<[Eһj4rEaj$v_B֌nsbue(WGZOu`Yg翽{c;Ʊ:;Iց&UݣZ,_XJɄfUu*sHXb򁞝Ԏ6؜Xh홡љ^NDp~ fX֠c:?Ij(=p*/)U A) T$"Rʧ7X0NtZ;Ak~? &B$Ά,1FP<ǚ^+6/LsN+ ioҿGJ4M*˴$f^ҩÔXƄ=m0{7tE4RH եC6,Y m$%i$jq]3$(Cb پN-˨Ц7=X aݫ8eʤF"D`Fz UZING.au|ja eTEd&F8j9ަI]%Xm_h!Q}7g՘s Ť6fjQf){w3}íʬ]ݏ#4p߃bLϵ% | Dk?HdFɦݢO=]$iq~{VNHc$LZǭiLsDI,Aك| ȇC5 .Rp3arwoy+cI^Ճ> beX(7ry`_T$ s7 m͠ݱjCcXI+epD{0x| 4<ɥfvf>}?C$칢! ʱT1O&p(FWAÂw\ 5"q sV C+Hu_ >#+\{rl>" F쟣ɐw;鳍}#!@Co`(B[4HN($$VIo !=|+)⻒G0;#'B|٘FʱƯBQܸQ V I 25,ܟZ7j f:AԄzs?Uq|f!\X pJVΩWᤸ U)f8AUnUߒŖs{`;Ofç3Ŵ3<ͷM `jlVH1<=moYn#I\EK@R$%TF>$%Q∔T]@fH"_7ˌnl6]qH/(Dddd<<=ϩrq6 u_@(AP7ACg RUeʭw&iExHBR|$ _>[ɫıS6'f4R4_d:(ͨ=i!NA8KQc+u_ʱ/|  4Q9,~@ne}ipR(̳RF>8Qa\ir bR5jڄ:g bUrԏH!rxx˝qk:֯O i` uo{TM myKr廬_|ۅ:JN`SsƖH#^T4մdn$B8$zn8΍4djMAJ3Di_!뿧dgi:a:DcfLT͑ы9mG:mǝ>mTMPyשws]fdSij.: ,{ n6U6.D763(])٘r>m] n_*[>5btü*n'~} EPeڷN6竄 0v^7< XU>qܤJrFCXճ(T=p[!Ms A5m sL.]ipnخ0{vg ~[2B-k+4'6-tsoވuOI)R|[*`HCLx/tkS'u~g24U2e}O6MpY06Kۙwd\kykyO./јֲp- ײp- $ 4 作;fb#V.]cPSOd1% _ء:N@iJ'Unb L:`Tl%_2~7!LJD4Ho/ ,7ibp nӮ{4w=:xe#$5-w'm o8[1]ڕ<`unQ*dz/mo#*O{^PB$Xud xc弄Ec3jv_1G%?5CEpt-ܑ;*S/[w:zSL#=O܏v427'j>As9o|Rj/iuw.qiP4L .w|>۳Z 6!-U3] liϰIt19t5=~ZPt A gpDBBC]*ܮsHM w9ie Fu샞(t>w1Gf0/biu|ZR8\4<Vr2MwSѸ6s̉9=4ZzZY&uH͎{+K[<"2rE:}i۵_z^T(.C=ÅYOLqEL(PnbXU;$t \.ܣ9T'o$B3ϹzoDO#[9x%u50h("%'T(OŌ7`dF&P 2oN9é "aB |Si){Y.EkL*LBH{*u?o,Fb|ClM2Pȅ2+#@SYveYdHYӮNoûYB{T8IGXG)2rbCp :̇]JAFPGΒRRA`tZ Oe>C)hk'Ֆ*4c=Y|11>5Okrͻ}ŨKtgG^Z(q3{ј愗QATDw83'eq_hzi^^RSf7a_.m5ҷ[kp$:K= Bs=bQ+ỤZIH` i0`4^M !e󲪍GV8L1%7l nb j萩0PlZEOi7#Nﺫuc3Nҹj 3 m°CĆ2$&U6iWNMY ^orth^ެ|/n%P6L|u6$&mvQIi-Z(<\QyGx{R4.E:b^X|x [ I0<0y?0.?nQU|:.EBU٭#e-Ϩ$r 2 VJ>ow%<7+4q/P] Ϋtomjؒ6t]/a^"R1 w7\[᮲ Fi`9䎚l{S66 fn&aV8uf:!+5=)i5G=-Ӱ-O\T.4P?lb4Myf9wxSZw}q%\ZNRHW#ha,p-9Ƙwī޽jWPCHкqlՅ\-j}Y,i;(NԖNd^b=ea.9VtI+`X.["bY+)AÜh]ք~kkFpk$  ≁s;pܭpT6G#~w#b7SLD 5\.t,mMv-@.@ҭ<ʶ$^.ek66ZWW9ɽqkoDu R]85ZS`je065(ABڀa Q{GZ~^jЬEYGh9@MmB"#L9{sװdرhx1$uxzaeTn4Ɋ"%DVAKqYFwZ.&$W.HŴt*IZ<<6]'G4T%QhSo:rE-KS:g,'> vdέV '3w79ߧ%ͺͭmlsg-L'!AXYv|TK=u|JsjvI%TDUJe"О!={ێs4& 㧱jH])Nv/UTivﹿLpHoF]DP < ~ڌLkN"NZcm\ڃp(S0w( oc3Ĵ["ZY16Xv_;cL3uc#IF3#Y!S3TT5¶[=RDPS\X~厷tǔʇ܏؎$j*+7 j4nK6(Ƶd;N<_=ވC~yJe|Zܳ3w0WEӐҐ<Y2Q@2;!=$-1,^l si\$;ТGԖn{JN oF~:{58,4 ;Yuy`):'dY08(_gCMN}^+SX֮'oߒ%{- ٘UiZ]\)EpZ>a SƩ^5=pmqJUxŊ {EĴ[~VƘ0I4YT<.X@dp@}CᚘN]bdq9d\2qn_xX.߃)#c-"lbG11mD*?Y͒+ށPW7] [d-אiVE\!஛{.)m} @ʽO% 焆[N6L.13e.6`;muB)es) XJvAmWUp*>rX'eCanyh[&2q_|=_q9V>'4Hq/JGYq8g4S#p>91!r ȰᆳAf[i G{p 'ja1a;J}'(P8b ¯ b ^bѰ?RArc{|ag=9e,ӷgxWhlTEAyR&npn|z{BNٰ!249VLx8i4$mx/x|n]E@K9;lޡ#juԊ]73?Os`BCdj'b+ڷe`O~AbOIh;sl` A HpF2d\ wH60(ݝŸ$aPH*Bb6zOG*l=<hSL9f ֑HՃo,zkwrL:须8a͆o4;<=D+g'=g`eï߬ "f"gLNM[ #J`RYntZ0:oT1wwtYoO);\ @b68%ԨY #u"H 'xҏq^Ԃ8ƍl.g<]Aڤm/p[vX 0%HHF0 TwN95A=/r4mF s=EܲGkW9*,sR ?P<l#;\xg:iV3(#$PD5ٗG75r!8ɇ]VX0%;o0$9 ʌj3ϻi/}a쬠424˩<5Ǘ3dO2ЖtB0L0pPd%۳-.%ۧ&;@1 ަ̬'y~q'L=▊r]/&,b NA}L؍cٳMSY[ `Y&Z~X)XҼy^0:0sI 2<5u}QxJH{)B:9EdL4"P/v22D$N3~&oB'`ק?9Τ,66dP<C4 &&m΄1|MG#˗ș QQ^1 9t2E88o !K=-3ˇЂ\j򖞁n;. ; LtJkA@]Rq@h\ #]n 0NuRviQ{lU͠ea0LPBҚjb||Iϟ&@;Ʃi'|%I("u! 엉{*fba8i+n}{iv1\m5G!-ppz6|mY PE>Q!5>|4Eϓ$'f^Epc7=ݒ緿R8 }$t "zXi xUzIچør'~#_qx=o`!6@˕@gD|DGg,+Rp+`znh SܝoS0h)Ƥv{iM0af"󫴚ʔ-T^AZAtW#] L$4H(d3HyEZF{^ ;C2-=%WːQ0H2ZT-\.êA3|ĊLrf6TنH \. ,o"D?Ū\G8zItH|@{~MnS%e?=\`5 FvF?ߺ4ORg' 9rCic}&P]!k"o0ff7gf}i of+fފ!)$ +[l;I$=DeG7H5 ɺrj< tmp8)WEȎ$1a2d̊첆#\2qg'BQ\y$n2X ׶:D krvqu8B{~d}E+*"7n -+Isc%\~9cVxHA:B! 28u`d,6h0uHB52LуEzj^n|%7XhhKgIw_HfK 9v9`Qte]M@b_-c;)[ߍiche&KM#il'xY9~߾5f=h&ɮBqCqpӄ7u(#lqLzRC'w[MpZPƦ<!.#F` o6ċJa͌u+cM) z 1xT90c~LFY2i g)\6Cf(J8_ cm OSAfy +$O8iQ4 2~j 䈋< -g"=7cw!M+ ~ޠ6H/^Ud_Oq/;G}AR9E`{Al] q{鳉!(D\RqghpESR=J udP̺] މ{oXA70I3YƟP3C2Q"NqUMN=h-c+GMb/E[T>QJ "UV'!ia^roin| vW=m|8D-'H#&L8NnȞ/?>1Qs+8a6T(A\!_7u|pF3_M4R/㱍:&H2VӀmhO('ԊTcgӥ(( pb ݷy7 ;X)] G/.5;Ɵ"<6L#ǻIG$EY> h"hz?M鴺Xtlтy*F#C7B9kc#-%ߖWSD4=w'Mż xԏXg|`R2]H!PiP M i}?Qi$ 'pw#KfQ:],,,-8у!%d)"꣙nP:n|d4,5LanQa,lx۸uN9&&o7WdxlTIQPǭDSGW<]Xݞڙ`hYn'UtrL|;áꦯa잫yٙ(9Q -:d^R-A˅OUNB^翪z=qM.\T6ڢyzΑ<7GK||? |jApU%8@'|a.A_i;\!Н}}*k$zIkۯ6" €S-"y$YI|T# I> _pl>w7_{?.tFQ߀/-LtONvQ8vlnpͽ [Do*xB $ziBrdGaΫiOUJ6KW|j V݂D"=Eyȴԇ#wyzfpI0[s*+|a=e,EZˤ:0hcX@::.oma,*ӞC.6kH41υ`ӎX(Q0X qױtiu%~JvdiD8 7xC\aR#NjF'![E$k#́pZcW+W$791$/zXw+-ZxpKEd|{jxF~=IE;)ϙg5ҵW^eF6`4 h[8<>9S0Ikd8` sJ.ZN;e^nuF%an4#샀H;K{An&m9) xR,1w3 +e Lنs;q{QXx"{aM`fx8 d˒r9oL2L}C`|i $6bX'j礖 }UQe>5,بw(@-uҔ:TQ+#G#_n ]k{#ٕ1CM.u }RS% wʟV#Ws d[7o|-tVՒЋS;_{C4iلJ]B#7 gmbwK5: -'IJھjsVs*ɩHe-F23yFb0E5.u}T.3Ғ>6@$^.l N@y[O︱kHf pO8=OfƝivq7yWǎ,{xνw<6.XH!7%iD;[xon׬gn_nYuGeCm#m}Xmܾ[am}{ug{wEΰ;zgX t;fh%a! qd^rs󽕕F"zN_;cdkb-οȅe$@k]uvM91t$H 4 |#kC' >09ל0Cin{1p߆4h_Y>A}p>*41'QJ WW|{(`rGj 8fV$,#3\(bm"gGjNŐf: A5GD 2gA=_vtH;sO3d,N JR6;as(S;3uH M\ZadpzGK)vX*W@u!5Zʟض! 5Vgz[_"DH1u˗ͣt"16va^ҥfO4&I&ES\C#da7*;5wswbww`z%Fϴ4SPLI1bJ0V>ԁ`))M~SslC/*QܑNˆ;rxcNm~ö,3uj=OI ;Sy VIOSN2i*LVa*ִWpwƑ|pbT*h{PMe)3\=" ߼ ɰQ4i$;DQC/lH:b {Y 93v%tOXELGf&*mM`YhAH"i9V9fRv Cߪ +( H Kk3 U,؍TUr( mO** R|C%}>Yyf\͐7-S}Q}wM T_.X7/}F+pfW$p BObci'WyR3~WBF2T21i[lJӾ=J-Rq)ۨ-4цqQƜ]ji+ԥ !ǴeHW+aJ_ J5k fܚ]E5'O@?Q ԰r֚0*1e* ʾ{+lӅIy'.M\W)5w_|2u%5qskXN(.;G>4P M4SrjAjP/ mUEEE5QjFP6_{n^/s' -+mhcxHoֶ]H~);LBڕKr.ĸV_jh\1)͝XUv S &`ib9$_vg,q+\Zo&ZHǡMώl(fhF篤:KA!\2:V<'%5s.y'$tTk˴$4yf(nc^O^ϟc>5Δr:S܋`S!4wS?dJs5}_fċLv:l;l"ıJTpHK{l \ȍm Pi$bՋl Tff+yκ[ irnNs#uґ7n_FpW'j*6ͭn"ZE5 }ɴ0ԯ@k6#c/~̀<Ď\b?.6 t)tHYc-ij]N_+E?F!M}Ks)wɇ8oCXIzx%{lj9 \٧/I\um_b}('~62vӪTI~Y>ek`+?s}N3rsI-{If1@~L[aH}XU2"!cZ[a,烼qsuO:MI #O|nfJi4"h mOl8<94$a8sla<(\6F\h;t[da GR :J~<yCPreb=m &Z\뤭G\THGA 5"Dʛv@yK(BB5Rԣqz٤tĔl@J}biLFQ 6e:RcL!@=Α~.,x czb'hb8 R`-4%?>r謯9inav}y{措71|u1X^`E?F@# VR y n?ܛY*?k*OɂY`o_,5bKhZ܍7~rc&qlnip4B8= n¹Q7<%s:]MSLe{渔ds9QFlnm[Ϟzjzѽs `bɎTHP _kRz'PE57*yKmb1#`:Vx  Dxtɾ2u*Q;$K:(d@ƺM|'dEʥ]*{$ 0Js 0L cSUuItSyіp[sf-Ber+j)LG&! R28:~OE5!yk&Bqșvu@F}WMl8={S:amYSse4~;S5 2GJ_iQXB hˡQ5TLTzWz=V;FbEzn]o"ҹZ+RNU 4'y~w˯g0K}7{[%"N+`֘ǰu 7^P$7\vCcܮś9{ͷ>y{p,=LfBp0e af#. `,hA?Fq@sps섴'` ,CRqa!W-AĘG8Ɯ ;kYXr]!fݍ*5; i/$(QI)WLӳhv|F_h7AXLvM37ژ\~nV"̬J7/W߃=>xϟr20|ЎCskEAGujh>o4xߕjyo~'M0I DHcDu*a>[өُ*-)6_T夵MqMy|X6)E3lPB(8B$C(22TM8O,=xn`} TF#^y`"wHfQczZيiƊ-G3S~mn׻Uk^[zꦷ=3T[}d `q <X3Y49ӐS@F͜+8ELʏy9s0Wm<[LH&=^ܬUmWѧ%|@ɿZ8\2PwP> qtXJh!95$~*ZRG$iߚπ&$iO*~D?}˔=d⼿#9QS~QRw&ULs 󣏟Sh_H }=,M0[ؗc&(4OBԑHxGUD aLrHg!S'AaC c#KL2KI&vRפBhnxSϏZoC3:'~&)hPkh龬*qvizfy,߲8 q8b&N9sg!evb A>\\τ0*J C_.3Ngl`eeZLT#'8 _B! beݒ pAki* J;OVM4kq4LLJbIr)xvЖҬt?8űv O5g]y ^;G#tTiE<b@*<&Bc23<^բST풆)R0[ƞ\ iU2@n;lR-hBMʾNn0EҶ ws$vX5K;Aw [sg}|hYgǃ}{mUUpR3CxG*D6WӔ7g :vhX39@o:c087] ߦcTvLIVu7JV :1n"gEHnRwI$3 $#@&*ؿ~=qJ=BmfU02g騄RӚGzsCX{6Vc VwYuӧ7QG0 i1;[%`Aλ>:u:]vW"&} T'nN[m<))4g;#}lq,Gص'Y < I$&6$33],3X|&\5s1`S0 \#)b]Wybb^է&,;s-F?JrS=(.iz}!yc T0[lfoݼ#VЄ&"2Rꑼi";a-rP Nb`yTjbxÔiQ (l[7"Ez]e5,0c+ו^ZÂlZhaiz IasnThΤ,66&YL/H@.l8N+ Q`yoBpRe|>b ~{>dpN;N9[E ϞUG[|[侪pԘ$D=@azܵKs)/FCU:I[_iGLL4" ̊aSLz0MM**"~r5esD6Ї]?R1BHǟ9bŒQ<&{'>~S1l)ss8H `'I#2Cy9lV+R:|#ɦ2.4HjpO : iei+QOgҕ\SJ=kiIgW ;_z&)R"5 fV TwD<$/>`_<eVE%l 6B*+++_  MaI@&ETP/,?Xn'2Ow'% Wgɲ(ly9߁+a$.ra0r16e) "SS;-yP")vhb* Ur@g_QE-maC,y R-T'2"m)D[tPNޜ6BѤ\Z>9:9/45~dS{cw-akxIK}7;ě?vs95xv\9 Y#|cDT} mmf8!S7orG2nzyowa3(IU<3b`앥zxNH&9G^\dI .|*UQgE2ҘܓC!$@gx;Ul~#,^ CM"aR4 %˫]&U.X1h4M::c<iRLvĵޞicţF*:|]c#'r=Ҡ ~:=I}"*@U}>mvg7)Ԛ0 ՕA^>=2,ZEYd {;F O2aF g}(7@ Q2 槢[NBY!v׿+WSp-h1a( XV$uګ?=K}58y"&jit<=~BEF'p?} ryj}߃-~/Z* J}I5bRKC i%-FbQ/>tS&/X'ɗ^4g0|0lB0Z?0rӶ y8Л!2(5SBodH41PMñ7>Y< ~"^|w_уv8/햭n {TSyԟ.H]MYhO8}UףT4)'kp"XIt(IJ9Q!&{dùermSH׼e}&y(EDO9a$`,<%acu V7~yfY>j* BLѫ5:/>x~ɉ9nhBFKMNhCS, p:sjG7/sXjcfAFi! r5z&:P6$bC@ ,7w^}e Flvh,G"RZl4DŽ!8eN*͙Eo:SۓelTq'9U9p4y G`(|\Ϗ&e_#"_fי0,YD&#k; W/!)N(|JWtMP kNg `$f&>->Tvɣr7VԵ~oI3T1l=f҃.툡uOv$U6mKo;F@$d꽁KM{.0AޏX Гa6^TNqi\-Tub)Y8f U.,ho:*Z[$IpPd0sڮ (LkpbW^m`s FlUt!ڄE5wВCWpoшKa,^{ cD|- =PŐhU;M.DpR KoA@guE%IӀo7ޛQlUSk'mVؠyBUmdpΊfP+š}嬳vmSe"[~&F(q cL$hop|*BV J$Y0SnSV@CnN5 vn:HǸZ %_B[{^|<6`:fc-25ԽoP5˒U$T I^&ohKBg)bȱboX@صƚC$?OU?yD1%4[6Nķ0jD&Ldq.bşjotsXP_ ?}$8~HȜ·{>~YUcě3}Ɖ;Ѕb'Fzr` kY8Mhېj9Fyy3)ID0^ә.SkH2npG Xшv {Gmv\z{c]rY{Nk=hL`X2OyyyF܋X,4l JP%D BbN R{plcL".T&wdotP9;F!Re<#!$/g(IZlFL ,NʟRiԌKl0wH~JM&`rQ!٣6R>qA18fZVVjYY-+ee<~YIOVղZVVjYY-+OYV/Wަ,IE"U/xZaU1ϒ1}l, 쯫ZP$vs{Z3 &A+AW" 1$-~}G٥@$ve=qjsG7 g!wXEcE-w8-k'ΒBN3J@#r֓ #wW%l@{9JK!H/m9Axg6`5{3&dX0x{J#|~N2zbCT^̎z/n=;=ꋿ1T, gz|eJliz|( /{y{ 29kpt7c?ZE2|)ln#eRse§J>jTUU=pm+YjJZg[l[㜙n7flc`GN9 AGCAɉE tARH'Vay3^-؋Y&1ǩv|3VpYB$6(@ŭ"k[o_ԢIl[<(]9o7C =)9)a|/SF.e;嬙`Xapdi8 ~̘VMX5ܗxAku!ĥi(N_n$J( Y'0/[p { B Gd|8앧J{tݾhaz@}_Ɨ] I񃯎 67`x_*qӞ; '="ӞӞs SE9=:rD:אq#}#)3 <%A"E:[ ƉhZFg`9&Y!r Tk<\0ʱh!P~mrIc⡏thꈳGksx&HwbGvO?7Xl̗Dj˶F20F(d*DpF1(H0wb*O--@$ZlY%,S Zl=k6BQ'c?Y09\7D`Va'`r00!{m[[z.Lx HcOt9 @ߎ$_dwƩ>LtBۃdNYV!ύA)`# .|.! L|Ӡgve\?$)07[7qPJ!/_N-u gwU"'|-nR2d^@[շЭpʨS@Q_.w읜>铚i(W+|^Zx#V@7 [Kf<9ETcCB#62ސ櫖2.s)~j^h$z|n%;T05]&ˇi'TMLoʫڒ1P%C PyJx~P).8r&o,5fJeFLg |Fpr太HSaAk;tD她^jm$5T5~Bbc:8WGL8Fo g4*>r̼ˬtT`+ Ӯ @y9`'0hA\tv@s C(?KT8ENԹۯ}?e*ӎj'sي ǭPnՙyŪ/Us^Xq\'=bVi#뗵{py8 5 )+b+apTOU< :ք?IF۸|N5z^!YX? $}*`5]1cXTHcVl /8MBeg|?pQ[yEMo]{[S.>B0Xg*!o݆4Y ,ۊpI>Nj7;PrthcyӲ;K9p:T$xm.D&\PAC\y0R{!8-$\BE^޼c\ЯT<%5o3MEr,ۗns. CEEl9qc4Rq\2vf4'*?.g5r;2`3e};Co1?uR*sų`2b~=.1Wk.6w'<)Шon$W#7U^|IHI,"a_GgCdwFTYMQ厭78zH:)vL)SO>罏4PWpĒߘ&A][9'q:)ZaX` n O3)5701kewTIeXԁSc<78S'Naeu(L#4)g}O-qC4N:+-Fg!%@ڻ\-D8wmm#Iyp{u4ٞ,0A(oq7bldV@JڢccI.Jd#++fT1=BGn&muh b~^N% ޽:K|Tt<[zޔ5u&\f}Z#=[#VKDDZs"29 g aLA3ԈXC6 b2[K[AiW>H͐~l3zh6DJ2#,)㋧4kBi4&)OD-l?GgD"<_VUV(3޼V7%>f8¢|y=K~:K jRLK0%qup)("hOϘOrV~/{.wzӝjVLnE$T jfFRүSja 5[˔apm2}. =\mǟ{ =ܞ: 2֎ ˜x\0Yaۥz [7edbG -A3'j1Pi`8k9/ +ci'BqƽxsƐ8 sS {sx50R ø5Jp8~n~,-0]鱲웞{<\;鏥!0Dn-Y-їQONc0@܆B/?JM$jfXf5& ѫq?ufz԰: ט'N8 &H]ZhEԔ jP:xu~GQ:+ҧ:yڹl=3m5$+HsK SCԹ+?c4#Shml{żD9+T#q[нH{0_d3|qNr: f81 }tdGH8=*$5(6:M-GH#|kc]%,-ЄbU8-[Ӭs_m@Clv,#q:l-C2n.@MGvX1^`HhD8c"yzѠ:0sōjZJ{jh=mq6bM8(!Cj-:+)1qq6=UfVD#D^`8kt;o>Ȑ:U@*l; ^=!#='u ,~0s*;b%ccdy.γ!4dž(],č߸zFWm_GU1&FhLd)yEopL7q*'xQv|"xpdpw[ yxt::inYee =#~Ueŋr^zу ) mɷF;#:"K?=2UVRڹv՚jJEO>6l]/i5GEB FT'NM<~C"/$0Z9θ؄c]q! K9&"K,l뷶2S'"ƛnfP Hti͏!L@n1F=vLr'BdC 񃟁w<ŖUuc$rV)ROIjt&(p R<oYa/242q#3jS\cs(@uig|*oYK/,i}TQy^t0PoJ& tӖ!HPlcE]Ax.ꬉū͊ITT !FR]{u03;W!64:"ub0 ;l~GaJxUNz="c:G>!kMңy.E3nRӈӭ,$fFhMڃb_RkBԘaOp;xXUNBj+@'v6Ods/^P;~˔jbŤn xUoLwZ= +n[ DAaL#AI?v`ΕwdnxD_JgV=^|gFZx|s)U 7EL^c#l8lh7);_  F8 i?ýŸ96!tZ NTrPU 'jHx_ KDvLҁ#i5| 2UefՇNLEDG+2IcE8@ K\TQcFbj'ݿiAT'DN4'Dnp6IgYugry\.3GFm:K^Zy?K_B? 6á5×rF+ ֑7IY|ּ\mK9fqc7dddr$Q+w8WN'֔sC]_+?q{8)hy`(f 7kl 2EzIwGzz[~01D~h3":Mwǧ;َ:s6Ҭ(fUnyԺe3'HzOtcاv?IRVy048aot1V*ouO:gAҞ#??K?zͧuF:[ovR63|nhQM' odb"R6[>LΪY5ſY>" WB{LpnC/NeZJTQR 8"` cg 3%In:*XSg&l,4(8JFg)\kjH=# D?!;y!7D`w+x/EG,pp\U i4pXd9$Av|V!ׅ񮵛M892RUw^Vhkx[>Lvu+{1 :EM<7&Hi#ZM pY2!Lh19&js@Ha)Hla&)QgSBuAG?p~ $ǹG}4tG5rG5tTn9>eR?Y#'Xџ6{oYL?U7>P>As罟[a ʈ1{\f\OS̽zz=HWzO>}1fݘGC칶h%3 `$Z]% gQ񙪞@MZFtc 3zùOI+>ǫ{\F/Z)RD:*y}F *DW:PJU-}Zjj +F*eShNq JKIQI8IPuQ}tjkr]-ֳW[ ZY,͌%{H$׻Us|yk=fUF}UqvsӪGM)/!q*#ej뉳S 녺K)jYhkk  .qTmL` #M^$8i\dE*֚lX\Mer9_Ed9WRYζ1ӽ'Dy7]:@`z@NGVYF8K2ę0*SK"ш*Ȇx$>7j3V,Yzc5mtS[gTM9f[I`_S/=2̿2:It q:*ǜs9(n2esN>T^^W.V3:zLM2iL5DTU {^y8aMM L5cG``@҅TLϠV X)JɴĿ+n#<7h?HMӛUB1o28WyZX݄qu̥^xL\ƇK6Kgͧe9=\E@ȑȧXH*j=n6ٞlT` 6\. msQ7n!&̀w [w=̒>UD .c,{zMƒŨO%Z]gÞ9VDdǟYR>i VݧsZ/*01=8iuIFl`Ғsg<7{72 =CsI r A2Feh~$'}IT0'2肘Qeh'偓312ŗA9v +'$cwqŢ!#`2NNԩV;z}KO5秤FSYb=19ݙlv;hFDx5ch8*)KX{)KID Nj^4w gz:Ud>KosҀLYl3YlScZx8RM ~Qo4Ieb& ѩ;#A.k)r\yGnED٧t9XaVFdc,8%m^0 0Ðgi98UY]aMDz>bA)\L0cmu9P^.N/7dj,|ɦ&m= 7 `{ˎcg Ƚx@>ē3L{G80&1BK;mXPWjpN&ھ:d7d d[r+G92nskb4Ёi0QJsZJ~uxAZ,ڶ0RC#O f1HOjcfzȞH6l:R#$m'm$Y(:x ?f;]N]N()]@hHBos ўՋNJQ)ff?E ~\;ꔮ3Ggg'"aI}Fd8ܭ%Yzf~J-:|e_I0PO޼kr韀ƗQPۯ8!6U^JIKz48)8y£zڤ=2׉=_L4!"a %Q"Hӌ@wЌŵF#E6y<"ERFX0{B`v 60h~34TV[&&\zu`o-bybp3Ѣ!Sф.::p].`6aνQY-\h YQtOY{$KdφŨ>0L ˉ4ؐR"l0 k)2[p5B$|uUS.@|/c zo1X b ml@`C3\|hKH. b! |KʇDŽ h2ai/rw?yF5+H@:{ڴHSW#zGL.\W6 eA{5,8XnVPrdeCe[e._n8:uuu6/.uP)C~;utN4r tqr=Toǃ5"6TS(J'rr=Ė$Ma MnF:9*,xefv҅K M±:L 6|A @Dl.OgJ@ꡭWE->Gw^ŢMEb'϶ZOfԙt/'D/|YfT9ȶ??Z)MLBr:QMN_ GDZHmhKi@RZ6&N&|Wot9Lt+J}?@g֠3 yɻ#ۤ@&LzF޳L4um]pOV 5T$~ߨ鬒2 Ǎtu=8C=>b: kdF4̠ՠ[Cfպfֆ aotv)Ҏ*lB G?qo8}{rd8@G28dGs~4ī_FLj9s^G>n:zsէs$~ikwV3.fQZc:a&9(/Qs0ϩ1fjtהK}o>I!qPW0֢/2M4F BǚϠ%uZltv? Bz64 2&y~oNbtEz=6&oۗp}?)w.$%*!F }Y=\3BPl%pd:w*Xtf]p Y3EK>TMƨbẋ*Ȑ)̆虷#vIX D8WPfZXndf@rvW,͘ڠvj7PG#3솟![.Z]Ak=`51JSIX3A_VKm윩LZSg&^}' $dӾH$6 8i+5!<36>aLlCԥ+17FsjklxbR!,WP&az]eՇ[` %5鲱A^&@7!kmV)&&ayiyH+cJ~{zcYΑ_?јpp~Xa{?c=у؄r®W}]ۛt A97.xmeZcх(I&xǂa=̗]fvS:nx$議+фO}9pfBSG W}|tp=Du449dTX]Bx5piAeg꤁޸2цT Lt4r-7 z,!!+'C rVT쪂wEܓ^q-]? J ܤ[|0TC󬝧VzۛqbVn\ly4O]qxpxlWGEIk4MY sFoqWtd5$5H]I,o*t;gͼM]Ԥ)3m=*AӜ4۹k;D:|c[^^Af$fUeK\F DA8Ut dsDl.7J'Hi5h"'| X`^q.}|beoa94sfMpm'pfKѭTKX0w3US5`M ̛ CϷ1~SfE#ԭGl@6v6lĩه_NȌ + $-qN)Rp5{ac47pQ0Il6\ β7I"-48IZݚq9y,qDt+"ܣ\~^e*b<E<kgnlw;-5jܖv^i ᷔU4YN^7wWG$ؿ9>}!?nm%;<"ah8}?gK6K\&{mdV_i5$6YBYP\78!%KWY>輠q((0hf֚s9k9ncji2?s[A\Le#9p{37\"Dڛ61gߞ$!y; Uh2I^Z-RɣZ ro*P%^S`}dGzIUeCaw4*Jp:M>b6̬a2 E/@Gd,9*Y+$ItfXDPƌk*RSk[@Қ a7,ȣa:P{xR#uy3%݁BBwf5k s2vi& R0A77j&wknV g7q#>Gx+~"2ſ#eum4myӌUs ]ʼvOܐҒ O ,fH:7FLF2bç͖'2V"0,L aVj\%?8ENfwfW#$}q\36Ql{VEYZ͋ qɉMw"kը@r%(gaH-U"<1!vud%1@|X\' h=WpWHūN~.N-0Ll|6j!7T)L/C8;>:l ̡ɲU!{^mC[cFMQVDU_=@$ʾe`l߇QcgA0RfMN+"`ޓ_*s ؈\g#sSh'ڭQГU*ϜΝd?%$fܢlq7+Β`$.)-$V`jI_t& ])}[&tz 5E[OE8W1a(;OUp<%p^K%#?R2ml\m# l^ԾpI q5bJ+=jUTe!Gu$QYddkW.]ph@"`{2? FK7G7(ׂ+k0 & ӆ'Z ~RҖ9˝HNѱ'PPM>tuF5ӰIeվߥ?۠B?u%Po^=X;:oL=. -<&4t:@o;ew9Ers <לYt9It2\A U@h(2/]Y`jT M)>?Q wGpC?0u" 5;yA[NMH|e 8V0%˥$INQ%EOA Z*"* 'K|˜F-l2HAr*?1zEwM 4Y$P[, kdPO4x @A{UhyⶭI! dy-u8 r(^XLkoM`iZJMwuhvsF&OG 1v6 R-G&j. | ilA jڼ Y:]ͣ^s>ÏI<,K{uC0*P4U # -♍yUMPxO#{XڗxTV#2ag[ulj0g_u/mLT.J,s[ j-l>p"?s~pT$u2uX@BHQqZn-{J&DFry`6Q`mKb`0I_ACTxDϗy;2x(xnl_GnXj*06^kv?#6̌ bd߇dJ!7SSܚA܃EӇ,_OuL֮b4.Rܴ(1*cJg@:lwTo\<91@+FiFVVƿnQl5v傉˖1V\jv/? .Vv3# 3r gd #a;kB.-faQ@ԞnD)1`.#EpC=cZnhX3LaU: [ y?շ&0][ǫf9gp m ː "Ҟ]Ԏ |x}pžy)| .Ss*.P r6Kn{LJ 3"yjh z1B^ 1ܤ̤7s@G8͒eɃ )1m[1gK/ܕ?miDLʊMҘ4^4\4r my-'Ջ%q1&Y&EL2=e GNb_ h>q,ٰq^J9:Bǣ$܂Bf]5,Wp*'8q/ԯ1k)lGgv2m6a+d[y=AȮ_4~&e=U% dT>uHeQ_t&-PB*\6xPb^, _!vu\ۀa:O-ߡØ$)L3Թ?w\)Px<͒-0_j~M3ȴl0"ܼz,?\q~ ~#Bh[%^V3,LUW%V,]6/9hЀn*-:_XAAO5:"n?Mga,JL|@?AR`h"LsRXGbHmo&="ٻ!(6n98N2 +IVA y^Au##F#tHENb'qi,bay33ސΰA.?@rnmjg`[BRNsRdP j0봻:d(&R`4ڎ>$G(:SbLe<`,o}1&ƺXPf$oF姉I@1TAޖRq пl]*w ILgA9w"zIK&8ڜzg{d캬cF/iu#|R8F3,yuc #R7 ;HfԣdL Ǘ,{jg|{/T0r hH/Nf*<XY;0r#u09;DpGxeEU # kw;Ւ&흥'/73yDG8*etɻ"\3f |PVT<%'F%bNh!*!i{'hJ1O>ֺ?nrnԴ6 },/Q{08&Žg@}q]:x< N%wݴU%$N"k!35>+\W3.;bjĞ,zIt}qOaop*`!oH)lu}ym'&&{3#P05n._+zө$mT,`,zlQA=G3";VjkV.u=g{jclKy.UP=P:c 2Nt^F_0'L2z6`Г 85r9ll&܃`hƻIQhȞԁ#lL)ьFPת?F=1&rn6B4I2>`ڜn@*5U:K<^oi3aQQWQG Qp'a[?GR%skV$b k+IqeĤ +;@*kNhy5>"P?nƭ6)ê^[(h*H ghfZ22Φd879mW#nz3Ysn-T7g$>ʽz%I kj 1Έ=4h1KxImjNf%{ՕaR -sf<ҍ"]/!GP7]`]"P>LJݶ^._R[FgJ0W, ϹxΟւ3gO= P8}*ly ]0+T0?S "j]v+G,-ټєBqam~T'lqjLi+bXj283|5zb,j.RqmNCl`-I@4㠹 SV-W$ ^~4/sW`کp^MFzعYJmV2=&-Y%f͊K(w| k6Jg.A^y)2t𳔷#?_¼n1Q54lb$ `FX @3~w B3-Ěd=[/DE <ՇShuo񧝑`2]'[=~>' E ~`>G\qv@`'D%1E.0ˀp?6pJ[d_m8P,#np?CY[,R@o\%ok_/yl/l>dz [HwT*t+ޯ{K}@(F[}m^J={J"pAQw ]t2kYHt{K50vaB߿BwzI{NY1g|P E\&fjja逓6<Эi\%ggf397mYCl:e@\2K<e*^LU*Dd3Jܬ"<9i;1B ^6 z0*E]TC@VnšI(}Zf"l gx^^qxMi 3|T.7xt ^KQ6WyMv:JhPaɸ!]"~-Z ^[2g@+nj[K)lfPšK\ 9j !vY59I4@ʀ;ĤjV~gdr| Ѳr Vx<㤪LX/-憚ů:5U䶰1-Ƚ3I O~6Ru-:koH@PAe[sǶR]ܫM橞o:3ZI,7P̼g*OlPb(Cә[86,aLm.uW>Z ժ7R77IJlQ{z v wٴ< \.%'` DagOlhr4TsUgCiO(*jY!j O$0+92H?pO;{ Ȃ_ 9IyNZ7v~p v1#&.5些LtirO=YέVIqf1C}dOQQ±teq1|4N{e zu2G~M'#! b1PJg(hPYq| zҀ*Wɯz WO,r6~o$^t'Qa a' dMppdD'0YJ]I Od)gnsu~. ?w;-)"1ˏ7REAXSr^aQA(|>&H4_Ais܄,4c3 Kᘧ|Dg7"e4ULi<\+H z"1עPwJ'_yQ}t3ȗtUMHŝ])&$UŘΓ7Ÿm%~/Q'ET@boY EDsnWż _+O ``ШD0L G.?V$;kʒtDY 1霽Hg>\H2Wac6Y``]z5 b@W}}]6%vL6BO -%aHAaFSi`e9+{{׈T~!ଈ|3]$szf_ў C:mH.1SDچP\%aOPfU<*S?U22 +0ÑSt@Y;)l'b63=#<,gwFY$i;Mΐ1 {/g+n ~5rVUpQ x<min(gᯛ~E'2QHT(K$b.<"%B*cΨS6A;{&{ONVpfg}@93asa2eeA1%DfBxh%9Y1׫hхUZӎ' tV0.wFm-ajLs6`@ЀrN #i)Wsf҉ЛV"}&B M#C,L+m( 2lӊ'mM+rf"lod1Q!M rPt$O2%",#5=4lmZTC`uPƟ@kz5Jz_JPEV!ٓ&gF_I8R%TxxFpW$i:T'WJ?sIp8¤^a|s"ynҔӓڕR l`DjHɭr>L}bΡCjc`Xti$gyCÔ  ^K͚A=Af!7bNIpsFVL7:Mj[ƫn kc=} <@۝ܛ"t1p_f5~ucgΦuF;\PfIT¤]#R<ᕩ^0o5hFnՉV@G81Hߞi{Q&+g?wgg#\H.j`~xwyFqǜm?z' VqM.)QWLJ2$6p.bf(&1wwWJzgb1גoàt8xB\V<\b6|Űk&{M}fF`4:^ ?L !Wo+%|6r$(Ǫx8ur`K`hRCd2J-=Qʘ8 Uܩv ]s@0km C)Xo-3ٕ>:>>,M>G*~^[r ӲȃCD"wZD="h":G]W\k?j%Oh P0SI[fV_yǀ ydj]q QuA䕨@71C0R綢 #fCxLu_3>\4BX^o.ƛn͆:;GCzr$FTAiRL> ȍ~$i*n?{{ph I-fH0=`;gn0 ,J75M2 _#8rH_^cj dx΁a[,lklFfM5GGϗo'oZ=\6_* +hɃcpnPu3s_MD+Qꀺӊ^ +1^Ypp5.7:'r?|$QB;E/~1;.Vr;PRÎE|l指/k|h34v] T^9ܕzX@B#p pEf@fQ&=dO*LNLlW{d=h%c5%:̠~в̃M[:k'w GL,{6&V+2X'x lt`WZ(Yh,(A(YT`nsq8QE9Gd0Bj?!*LwMj:H7ko=۹[[#` p,LVДkX~ZGʽn 5Cknm9dZZ5 v<ں2]^7T'f~IG)z<+t4BOt)[ҝ& T39T-W|Gx\vNG{撊Fcu& ?pb4[/0.5\4e\TT_ui20"˦ctoFC}(Yf.+ځud4~ Q { NFa6^U\kb sS\A.@a p-n:h_iEKʕ,?qEңbu&IKTS6EQǘ.A@mJPwIrջ #VI{7:?,fV=)h'F5 ͜I]uLٌMf~e~W\UV#M| mزXڑl$V=ndj,]Y6q՜x+]d0…U !8dfmFm_v$q{PwH)G[tʮ8@dMhF8j̀qπ͐Ir7]?Nz`"mV _{ob pSt 1245; J[q[oTGmn xϸV Bpە4>Hҿvz'B~<l&Ի<-"I$A:)@/H*?AԲI0hG^ILlp F\OLd `XTd_\ۊ"nt &^nR0㝬Mc(`k=S;jY9/_xA Zn4тYу&HcDhl2eNtBapǾ\|LT,P)[$SǶY! z+%aS`{n+s)5qWon9NDb=@2Q]TKt F1(Z(a(Q* 2H<, ]0-*̠cl36ҡ7.A[̴WڭmlvfV{ul(ѹ{~-BPN2 R)ci|TN 0F{XmWI*Cc|: D&lm:%z{ Bl(V  _]:Dz /-R+͇M Ѱ)xj#bֆz=2SJg!' vH; R}0'ޞ Y8j &}'1|W 7Q%~|mA^CH&f'ko1u?l b&aHa1 I ];_^]Uf/k.Hx=¦;bR0WVȁXBsqtNH- 1a6a;_@B" lF^837氪:IX;')q9 {=PWجwJ(;1Xr'(60m*o6c Y-&xNqu1~(fSAN?,Dn©䞃a>"zd)~|0M2iOm?!q^3&kTIW 1[@Rq}RGbT|}iMS2 zOLէeaYleF2j;[afI:ľCax͆z3 7>1L,,E1F q$GCp%*RF4!=&cM}Sx9=O?%ggTkLZ JٵYZ] =,ro z-*kA$tеbprat70v3(3lQys Y y"ȉ"( ߖ-r4U657%VwM7HkDmo[O߷f'[;{Jlhas%*&q=xt3fm8&|;szLb:Н:  9r\yAl(1"WQӨk0^fvEdB&a5W%M#)E1?#*z= KȜ 4CqlX/ltS LaG\Y3gٗ2w;~E2-8\~ҏH@a[E)0ǝ[ A糶)9Fh;6sw@r#Xm+ːWFG~FT|j'+FaY8K{yF=9>H6~@ m7)1Cn.gf.с1N|k޴,Q.ZnꎢIZ+iZ9;\[jEig ƔG?T$/~5{C\K8TXCj;9EUI 86.M6-ۊ-s%~= tImU%9G -[^RoKMd8=dMp/I=`feEq۵5 D",%>9Յ+ DljȊEv0g0g\,V~QU\ R>Jo4g78ƫc $8 -:hS$dw'ixC{Z~GW˿DAvݧidw#/Š[UsD`4,%1o2'.6s`(/\̉3I]3Z9 ^{z۴CBٛ3~_;FFC1l!#C!f$+K"w L35G&+m6є2E|+aHSCC d:jgx!t$o(.}ȣ!vaor=V@a|nߍCxJLZԅ`QǟDZIv6ZC :~R#=^>!fSu@7-^5jA0nqY=`vC=n^8Lc@HIQ϶[{[۽bP7②JaK $7_ǵv]c+H^%>Myi:Ӛ$V$ oCEͥUzbsA @Ϙm@6y0ԉ()INx]j"h;s2P$ҖQ"Pb#!TdY1EsBȭՕm *&}?̓˃}{z<1|‚nvI{tFCuv^b(lZ4i38Siس?i8eUKJoQBWY6'PRͭL j={vvZOf:'eİ}j,f.V|MM#uu}>I\$L mQwH~R;1F`i:t^.Y$4 _nQ Wh+M 8>UT6$,[A=`jp?2N_ }4vLsh}ëDWkXCLiJ58PςqG?D[>AsύGD (_:m+DKY$qN+ )S8i6iki\83MSJB:3ҍ%J>yk$Cp[֋ÈDz4갓Er(1}b ˦HP:D]plaړ3Pp(@3![2' B(4Du4DU152{( Lz:Ӱ[H >2YfzeQp<. Ü[S:E3IEXj{Q{;2lA3lA>~Y`}8Kހ J dg6rvD|QN)l+Eͩ(GWrd!]`wN[R.dxՔD]rH]Z5GٜM\H>M%7KXy3_(9Z  !:fNީC6S0B򅸋I [F4@َtZ|Cߨ4-uMJkV7]X)G߸ћo]yQE EqImKK߇Sl)4]ۙ}di0y2#pGx=}|`[DZUNF^%])qLJjߏXbۂSs=+|^&RG0[OH%XS"cu ,g[W6T=<@mpfXWlPUpL;5)^9o3ʼn փ6-\_&*g]vpԎ܆Mzf e_1,DZq[Pf1W6ku4hGpn|4\|{OЄ_^_=T3BƄp^<bH.mN|xs?HU&OҺ :ce2Ⱥ_]uɩA; k[f|^H"7CfM]Y̌'V1 CT.1E֓?M ϶fuIx餺6!+Jy% „@ 'n,A'i]sBa- ۳/qo+2H28;(q05Μa&&~ kpb*k1ZAgPʪ }G+z{k9B\wZo=XQW 5#CG1 o=,V?4 'ud:933|og,K_O6Rv6Hzz:KxIA,Qm5FI֏꿫4  >aA|supy'fٙ &y-~9ǒQq$ˉj>bNr)*Ia p1Y *J1^>gw{1u5:4z[Iԧ'(st,y)Ubr1?|UjE tHR̃cքSi~a]_ʻ?l9bf;EdVM!QbRLҕ_ Tn"K$hq; DZ5؏F2IbBz.Ri%]\tO9KQ@ zC5WfVawq0aRy>4d#`0wSz &LDId㙌Hs>7AFEq#J8"Dħ cIfc-0 `f6[GK֓=?ҷ~TUZQ52M0sY:{_[{q^x a,v xR;Cv?S*^Cb6IЄr=yc.Xه_NQU26MR*q YHO!nM5'֙Py   GgaU~ĒlBHc ٢YB8өQ$BO MĠi2}?ag "2vXfGr %\gSs,aF~uҴAr0T^`%~g* 01@s&2P')F~ֺge W]XbNh:ĩ0c[AUЗjZe6i8+V+ \A!ЄDs&qĆU,U J"3}#t j5BF*M%y*^1k7>80S_S?pVsU|? gCsLl܄y59HU6qk*mN 䄢jQ0hgqM_ 1s}݋[~z#r*v ?:aHIBW;`g_xw}(= +q~1vV/ NM:zG $Qq\et&HW3Ήk^2mĽX 30$DiHDiAe'G(f=D]1Ep<`kZ2XId ;5cy)uZ0a B.h E{V=!sS.`#g_gRz>>5oVjC2YL6ĥmƥ5h@>&y~W0.ġ|fE3 cՙ x8|z=Q$FR*W @*1״OSח'*~uDQ$B"$rAd U'sԓF3؏gR#q0}65@ Ms2hE$f87jNJ$4۔ш烄^n _ҩCDmu\vzbgKmob&]$cOTwGVf+R)/H=#I=]*LHCW[ɚj}I v@<6lQLyԐ1N!mdj81,%_sײӆVXC~ þdљH9T.1XBb .$nڮJm6%&2RcqN=Rf¼as0z$-HiZp`1vGJNYOh]/[NǕ9㪡W#cƇt?+>f7*vJ3KV ?e4 ĖS{<{7g6([gpi= j6gْcKo0Eοi d [-xi~ -w|7\zT]"譫fA<%g얡|c]yPV0F6P/q/'bRcz kh_am DO9'k9uVv|{3l xЫ+ eۢLKg/5W0؅ d_m#FR<; \OtgNa&YxF5*m$y; A,h`{s6Bb]M/Fdy5;C}+ݜ+5-\kPjeݖ͘yf\H)̎\CӳzK&2͢"0}NaYGh BF"P5_gYRIWk"#EpؓZP-].^f0޳,8;d?>;UdiesHdA?4 _, ' >2tl2jB(BˮW`iFb}4FGsP+tjp`d]jjBxH\@!4d/Fav? gs*K5 :*J^9 gZfCLvd*fEKTU0C2ܛHE ~B[}lMqlZ Jt &[X 8_巜=I(GZ@@Q][e\+|eX}S϶,pTu.16 W5i Ojӄj14o\dDV<j쩞&' 11/ A7aA Ȉ}a̫N߶/Z9\(4-+Ľ] 6~,I}0Ζq)]$'VY ~f]rl؈0^U0KNH 1TLa1g"$-  >c`gg4ִU|"@4#Q3W-<̼m߇}b#MH'Y;ek׉16QT<}*=^O!LHcW4 *vt΅xU.RK&JʘJ%Y0N TIJ^EdW5缡A=i9"h r\+Uи-Uy .!ZKzqҚ7()XoYЏ2G=1NpZ0dM7̪]8< v6 =.^J?kJ-.=25T"iv-]u7\y1NFQ J]TqTx<nث>fn]gEv0,ؤ[9 .b{gV v4o} #~7Tě^F%;K f @蕞3n|^".#L'qocFxƽQVnu+dP , "τk̠ H%j_̦x}DgnD, _HwfΨrBE2{^dChh`/2P[Td0-0cYK0!T3t|%孎hz>؄Dae'iZ4PHd&RK&;Nk{żöIfZt i}wzSUȫiB qe w/2$XCH\J-w+-6H"% j# G"ۄw 0H+Q:oDxGDo[{j)z>b`'"n g{l[M0}]uݭ6TpY\-2"3((oj Z(lѩvv@nJPQQAs#c^ ПGiGhI0g٢.QvZOD 3c;0h vO -+P *5f Z}톰`RߏQMD^ivr =MtZ9Ђ7{".eU`}_fFt|/@ȰLvfN;Mp.Gu"*Z1Qrr=ᘭ3$Jj>]M E)G1Cdd 1@"*t |u+u'\7e n{̏&ѷM$tѐqXŊ74ؠ|}La,(M)Is6&}b 0ʥGcJGq{A|$oDgxy}H&>b4v4!ra(dZ)JX,IStCHѽҸ*Xb 1Rwǁ$:N.dsfjNn  U/%EXe%}Q{l3L.\0{q2,&Sx (10u\q'K8 h6YwM(N=cj)vZ[EH^5WɥRox|f]j qȑ 䈶2a/m2&a9 'A0ۃ{[C<O_Β\NHy* >+ pŊz&)vV.E*ΐz2] \xctHUW1Qp'G[H6DerCliO5{]nCMmﵶZ_!YhD\Cǩ+R±yv6fC/Az+-i%9;E(h!$Imf]aE'"8g%9tZ7غQؾZyM_mZL6'Cuj*vv>ma?Z'wf9l=Sʟ‹WF+.Wo:g?s+yG?g~$̽b^{v[0y92:(L)Yl@Wě⮁ҭASIWӳ/zd$eyXȀgWf =( *&ʏ3]gq`Y.$13`_HSWz6BDm6b6Qm޶o LVL'ZTApfD4s60A,h{L$ݙs7HTfB=~cLZqci~=[fW7<|,?6qczt }ٙQu[#Q(kϳ/12vqv=&D6!vҙvΛƶvN^a +ڢ16嚩7&YzeC6mq@UԠrT"ӷxs, Xp@j? <#N֨hjyǾɜ}Z\mFI֋9n#4 n}Ϊ\ ΊP PPfcЖ}A/Xk1lPuul16LJl] 熊3i3+Zr9~`XGCn֬w|v*Puyp_<6殒}vǞ <>YBI5LNBCވbNL\&24'h Ruq,V%tMP$3fޞJvմ&?Pne#9"`I[ʃ^KgE )D]=ϑΣ7j* gqK"128Iw[ {Ӛ{0J&*q lEfscg4J۬6!Aobsu+=gs06[j&"a6uS)8Ć +3xSe![\ˬWTcV{[fhԕWo7&׬nYӞ/16?.zpuu se k`؏^e\(kOyqlLkynR 1Sc}0.䁌YsgXI"n07aR$t+fr6~`k <lN _GMFxy\T]SN0{ᜥPRGo\}f>=˩(gӍMe v&`udpIc"`d- :ŢTu 2 αz·SCJʗEI0Y͹Ht-ÜX=( ͭQG4]`~:_ݣ U.b<139S7H G Y4E|,|hrf.,(9q75/7†=LKa&Y*!`>UZ%QƵ|l,yZ1кi$*p+onAKرM'!3 ksVju[)ЬL̍GD +!Gn兏pD)c=a7EM\wI E FSIZKl93cZ( y@tc8gh dCe!hM8;C $$&n TB @e Ir4f 8ϭu98bY_Y?Igi^!k =/!܌y1M9PMj՗WeYy~^aHwxd2C-NQL䍳 3{6mL< .2^2S\0VBPHǠX:8Mi+hCxY. -M5ii(eO5^NgPd"ahE YW`ؼ`8(mV\d3AI" nWJ,WUL5KO3γ˭(kwWk^B{Ѱecfhu*K9`b)ׂmt̨!Tڰ3bp g!O~+ c.`&y'3nYpK.A'e&Q$ Pv4>R!1xfs%`n]t[bRy'D.c)~S&{ɫt+тñ:+'`#uoT &h1~kw>%'|VI$1_=ZDO N. A8V0pslc2씭g,isu,(a2r^o.Oԑom#ڋk$u*i;k"&CE" _s2l[ssk3 ^Z\rnJqjid06om?gc)$UveVqjT¶j۫`tHziDZө ͺ# Cuv O7``ڠs&39=C2RU;WRUR>}CjeyXSz2Udz_u2=t0S$/F3e-;szK.L[w@;c8_ա#õ7]tk!dX_ ;듾>;G{}GvE҃ր5`k ؃"\\?бmkXDnovLf sËqA&-[ [Jcu@YB?[ Z\N0ù=~Ab1[ޑEkha2UTL,8#= $(Աt"Ǵ|NP X41~&!+xWUZ 7jD^5bٮc'gqjg)!OE, V&|1uҟ}_m_O_Qj_˃XÛq4 Qķ6Ƒss`#gRL/uޡg8;.Oe}\eq*ewKtnSt=0B[W=4g͢#̊3kf}r'g}rt=mV{C.J&du4;]4ȎE.U2cy氶W-ϛ=R&3c43 7?;+)+!oWwQs!@?2Tf!Ep+p1TѿV؝Xp|Jg=sA<7ab(g&o~K?&jݽl3z%G?l%ݥc nӛJ=m@ѯQ Vȃ$mg̯ѷTt{ &+'mBXQ0'i6G:ްH`~W@?I0lJ]m|AnB;arkۏMäonMY|ED<'EE*wS Қ/S?c2F 3cǚs(<Z2rr#B"oke#NhI xpq14fƐH8-m6 =,]R(P\'9t &@nTWxWήߛ((NN05[G?xw]~DO,Ih6{9THtk6vGք.tC3VB[EЌ1gH7-7|ʉM9-R`C{Z&) w4EFT.^;sOOoyrD3,ՍMl2W+H)) iyYqNj{G1 R8W7F\ܚ8x>sq)Zsۋ-0y[Ik2tD6J_MjIV@l-|cŢyZLЋ6C7 oCHo:fx'c h"sg޷hVWAkbD I4'~nxqQIo4U4Y?Ń6ݗ}^\RqWVabW-8Z,ڀEq$=zi֚ Yj;ێ0)3nV|;xXB###8-$xsv^GE+qZ 9z8k=t ]ɡ{w cZPbm| l~›֔>,l Ch"jmԻ-2nh;R2dxV. jJQ(FY+ Z-YLd Mwz30bi`ԅRӐchI:lsʳds3;ɳUeu3A,g~B qƧfyG\H Mbdj5}j͔5:H|6޴ė}A{8={i>sM4")'r7B9D+QK6༰ٚ:茹1-Y4ֵ$ZEmS$.> =DY;GMԶiO)a-M~_1y0H tA2Sz1XdT:|w!n6a־Hiѽ'zj [O7JnzYQ!?d?dO'9--Qy:{<;AM?nr%uyvObF5@}\I˩٢l5XOHr\e?Ss3I$+ $*켢xw1ɳs3 eʹs^CaNnZ܋ihI{l@p=|Rk庻bq_^6L!q}sm;>;n듋'~7<8t)Dlb!gJu+ p8RlUi'&W3cA/ J7g #u@ Ґ볟hb,}Qo-zҀP"Y8'JÃ^wڄ)JvhcS^'-IZ?I;a)wQGKHUQN&MW=2}:kKZljج/uJ~6{,=Lz@8WL.^4je଩tIE'J)j(mniAIbDf?7 0QīuHK8\ٟ44kuD>͗va}/.i'ؒQ))Jw\D~ A/J]0; sE@0jo&SQ`FboQ+#*ҷ:TH/m:wec&^(SدO"#:d+4B:|1Y1&4-ln3Y1>l)6yi1Л^i#MH&;F:/&=i̧%(u2&ʗ@7#̕sFѧKom$9:m f_ 7wСU $, |kK]^hhm5dTF3V0X22$ԑ6jwn?cGDn]>$oZMdȾ/q6!O*7"#AGjd Jq˂V2% $â7>#[L ;+'Q;Jr棿xX#dёeoך~&pϟ -3sB^T TPZ ~Múc T$, >lm3Mxr/"ğCd`re|W,o`^oD9 {*EZCjm>YN'1$٪J" y24#^} _1a"bQ8 8BS#n?Kw=D;0rGà7=f%'0nlX?2^VvgWq\._r{6}R=lj&P+ں}2a;9$_@u픍aˡI%;110 o:] JXǵϰ# PVu>  0ά#-+bC?!e.k#NX)]:= 34 'Q&9"v5`G,\2SXE:ӫ |sمMkS;0؊VZTՐ GbOZ8.˩&ţ>#v=+%3`Q4 :$ >CvјP-vz$[o}?IݦEY:)`y쵻4#1m80o,]cf?_ ` ?9?w_ +2g!Uɫ$cDž$]?SDt.lc=Kt\{Exנ0sc bxUQ6.6]bFu܅c&c]~ ^ji6%JyVEJ=kŽ?|uÚ]oL`A?d 8j¿dA,\ÍW]|'D=&ڃYpH&&WU֚4#~Wg3">WV+^d{Z!8H%KINkzEՀI8.lNbz_CCSo2}htIvA3{~ra[u4bY<_q E7Jz'%;[|' pl൝ssF%]z)93f% {jEk{Fvg/յptCE3!h~ }f̴eovvXwHJ0oZQo :85"6˻ےىk[z4YQz d\LaSտ*!(H%6md=K.,յZs* ";L"r yC ǙA*rEU9pHf ;$5('R|_ȍdh" 8J4oO~|m}E:K{<)cN*cH '6sq"ud}A6Idv(a O},ZoC[W&LmqƻE-TKF9kzVȣ|l?ʘ~*eaP wf<=P@P< -B/۾W GU{UG f:WN%iF qu$a=`m#RLx6}tnOA^R@S* 1 &FveOf5&=[~0}-ňٰ!k-1w=`N 6fE9-1Wz*=S"%UR/is{G:Z֖z3K2*^/Q)X LLr'Mu%ME) 4RoӼLM|(Myz0'\b`}pikY :@̙s)I|K]y71mI<;_~g6vv!yiAKԷ,6HZ c4)VI]}]| L~CI y,1f9]b2̕JL  Wf"8)Hg0~[Xڛ .jø"1pɼWEN 2" ~70 8g 6 ©u2p% ؠdјjL6$]į-tl@/10I:L_&$Oqf BmRڬ-e!cފRH].mK,0,V!TO~Al&^! $OX9Ldg'۴X8gO foQ_u%| ᰊL/cY * v_S?t@A50µLp8/<4c (̆^hZFv { 2!țs@f40jrb p/[7F]ƇZmf6&qMpuDK83D^o$VV4/? \epARX]i?@&ȃX'xW* p- \N9o72`̘M¨ j7D=!>}cmlԂ 7H/"5c+D $Og \HR=ˊv&h@Rj8 #ӜД"z]=#Ϭޑٌ%@*<pX$?%AݨȈ؏e0p]uK~7Z5ݭQ^o?|( 8gBҽQ; jc30¬UJaIB|mѬ}gRS2-L("k3^%&dcP<R>E;af A|4&.& D^qB*]xg5zT5.RX-nPڙ?Hl b7öi=1\Wru=>e?37.O`COgEBnrkԄe0hb\K;ʃvٝ_N?Tl/)|Btݖޥ׆2qDҀ0dfM37K0vLL4.NՆ&Cm͸ ǿݎڃ-/ ۔*T'$(Ƀ2o q5ĜeִG?іHFAk+nC!I a z&yX@Lmߊ!DBoCuZL0X:6Ǣ [v 'Gz (5= |) [6b&_Q.hC?o\mWzo nֳ9;Ih6N6gU ˈk'yE}AcFH20JԠMѧ~Mг6o.j9X¶l%),=18)f~ۚXLRo޼=<('~'_׼M4$2r6.B ~6_e6NRJ R솙׾o{ Lˇۘƿ24Ƀ l0X]*@iRRlZ:Mҡ/l.`6K=ΠһO"E XP蚔RR )dzijdyE׽i'$X'.ϕ5FaWTv0&k&k&ɿ+I^ii~wN" ڞ~eFQ2/٫,?\&qbO%b ݎFm7Is׭&s"|O[3\gh{7A ,JݖEqߎ땵-p KY.^SC 8NJh#m2\ӉUBH1T֘8~fvDgT.L,)@kw 43>u_P꺥HSOml2XShOnRI^<@hyp~1"z=G*ُ&?NRQZ!jdQ#_F~tCbk^雤Gt9p2;K$]Lifgu_iDOrPMCQ|aCk>j&XvGƁF3b}pg}pO2Yi5v:d((|iݩctJEg+JbkxԹgh$|r+ιM`p{ Gg<@g1bN4,8dr05B^YQ&6@>`y&y,}c㜺Դ߂V?An.G?Pn @ ,OF'Oھس-}?VfZof$q6(Wٴq6g.47h~ف<88>1I.)OVYSDZT1NxL2^s7p_@nZQf30d l\ l+ѥm.:$h0\`iˊl4lKx=O ~d3 '8'Ii&i(}*\K1.2}ߌf'X"ln7]m̀0{Tdύiyˢ(upLӑD9(fro䴆nG 7˔i.7!M&1_lj+mQp3"k`)~gH$Ft)$HYK9]"*~+1B[wإpx&O_t'd0ƻ+M{+Ls6 \Ls9!&2Ro0"7:x50H]UJim̩l4`j J|`L'D&֥p i:>18|i[ E.vP6 ~Wڙz ~I@E 0{0HGɘdnMg]-֪*kj>9NΘ8>:th θ/\5y a1nb2;_Ɯ$\, uGH/nl=g%aOϼ6Deu%^v5zWF7R[mGv!‹]~Žd?\mziQHgt]ʫ rv Fwg3}!ӳ:]4J]ۆl0Oi&qwlUkH-e4 &KJuPWu:.gc\! <~H-)Is5zRu:?3&zb#֤V-:-:R0y(y4w0^q1F6QʛDhnb-JÔȾ] ü'榢.q.![;׽<K5I. ?< 8W4rM˒z>$j 'sA8K j̓ʅ/Siw&>ކA~ѣ%xu22APE坿iPN?UBBox ×S!WGޗUH! Ұ6(G-ufT2j֔bM)JJ 1K;QhD)P :]|0`3Y\ gnsߪh\6:%X]#qPO3DWUT{IWA }Jx^ֳmHb}~bIb r!f 2UgLL՚U{6Cn$!KsӤK>'e04] ~iRlb29T8WNBc5VNnQyK΅Tz͝؎(6dd4q;4uO`~ؗ@|)nOzJBL黰Ƣp^ņpKqE)/F0asT?Lw<+w,vO!z-& zL>Ixl' {L56Ύ֨I86 3r .e7 J3lmQ\ W\4}ʉY88&adT4HɠL__-O:p\~D2\ٻYdg/lZ܍'isL4/Փ|pvlbj]SR) XQ 8Y8<,M "8!($AɃ?rVb] D* HQ# RaLu(\VAI[S7S`5J|Y倆*}&ORnD ILK*àdaK<JKef8QBH89\k`@b}&y3S: 6tw4JĀѲt H(Z3$DLsL0w\%gD2J f1OyJxB ŤV`4QLf1zF]qh_v^A\ԱT跏Cnm >i[kTc:&hN4t:Ruj`^k# hhǡ@Qef 7Iu; W==ӎ=%^OJu'"“~;+NKER QѷeɍD!V`Б'iz򡭉 _)G 4ؕAFE/(L[,͉tr%V&_ڣ݈?XŅtEzLo? ̲8 !u-LɖBv'NEO^N(i ^ҜGEctE(wIP\r ۱?C'~5CUQp9-2 |jfI &:/'⭞IYT$h㚊2C|"㢲':.J: )2)Ur ^/,U7+Pql`h5Cf !X3i wVikK={1kHh0)%:lO\Ez*({Vd^%~&Oǁ]Z4 GH{D]Aԇ,JUc:f4~"0s Ϋ)mkН}7\6̡ ⨇\Y޹ɄZ~ R sAFizyٚ^ΎV *IυWw| #Y^+ěElc&oni}fe}ټ 34D~Ἳ2_eBi@p7 g7m?b>{3g-L ;Io xD]gHxÇٚ3sv.SDd^<[nTs;Tϑ2a0.u9ߑI=nͫrƾň_'EL :-^&[E5SpK|)MҳuGnmݧ O`hDڠ~~gіz1ĖCQlqNwՈY2v謱B4[T1-y'0 -m"5Q;5b%%q% rN'볟ktSYvu<٧YYSgy.cJ26>I8۔}$pĝh91A;ל6Th5IH b&;-u#g҇P ,4JZ8 ұڀ_Dl`Ac69}lVZ_m"Q o5dÝBBHc1/ḕ5ϷK0)"^JA;)a{@]@^OPY{ϪIGh]Z#Y%:f8 S@c"EWtٿ TXA qS` Sz ć`u51KuPdH*Mb=g:!V#p=ӴcsMeϜbưM<4_4]Lw~H(Y;UWTB!NDYoq1mSC9Fk!8] }#mk.utBNGzJ| Q:HoCZ:Ұݴ=[タPZIg5kkr&kr&krZzնZM}Yc3 lֳG//T 9>imU=! ,ediG-JGsĩShE͍o>W|>41=r\nkw1ۖpurrs~ ؞s1qqO74.Y+{N\1d 晧Ue %s]X_%HWe IDH>SLH=&؛ 9N&K]gd7o7` `T%/ I0Q$4F("y0[DKe\k1kٞ*lT6hFG|p,|ʗxcݏG)L&o6L x~a\"צu\t6|}3:ay]_ue3}@?`aoRx?$&ˎou3 A܉BP(,-tZ|Kb+Sv>Hn(3gӮp7CccxW_pH5zX_ :]J}3++qDd)$/=Kpj=5$J~F~& Y/7/. @ǐ-! sV2E9MbXƥP%mW?oC]: w5'E9b~4>>T(,CC#Hƚ Mj0MNS=6=$7EGpSmtr76^l:ʄfO# s .AbV#T4F܌oY1-:VYe+EF&m9`3/%XY:>>wp X!ω4p SÄbs (E?= x1ă  ǀ?ru?uY(YN#TP=h,4t-Gr`3IP ,lAsialn%YJ_:,nBB#(m1apI\X3;+"P2e](lMgGj8rG<"j֕i-^8HhP}2 F~Eu:KIԁScSKs&jM@n۴'M>5.OۭUK8PLIؘCr{C|8;w{X}zi;bl}Y$j9}z/7=imw\J]uMeHt#)K -Ra"݄Iz͛l G7(0Q>{-oP0?e$d]@akB}~2:M=p޼=N[gs6b}6gs}6lZ4E}L>zn?9ܩ:;9R\iQ*2jqtvKwtyiα6.NNwםM{Soj9R;ώ PpJ$A%pX܄GhW{œk7Us11 }C;DŵJ%cg'''j{Ş9iV.\:k&0,$!N#M\rU.Qe c:ZM|'awZ$u%fF'/χ`L7[LW%N+WD:ㄡSXr %[(c{7:LZQgZb[xtq7\%;QJM0L2VU469P aL!hV]d#;̐8+s#jB-=JQ%tC%Yh}~{-Y&6kb&6kb5&Of*b*bV8; /qG쯘$F:cEۏ} "O$"o32*L-#Y42_`7-͌48x?4K|g5 nekj 5rwn{a6M\I;ANdld42  AJ~|fjxao/I29!+Q-ⶪ*.-ƺ6.$W_kM{aΉκXpniC&-nHLm4rp= @#@؇%͞IBq˄Tq[eE1m8p[)>p7냴>HtWZOZ;[[{[[{jTRkb람7sAA` yCn L-uE4)X?W :"y@0lg  % ]#R9wfs~X}{TωZL 1+\&OGjca*+Ӥ/f9ereQ1ǹqbgT I$|& c}Hk K0*G L̷)L[YA[[[PdrP50KMOpMywRVXJ&Z|̔I00h{)}3 ziqt: ~ C̡ A7A2+ [F%X1Ooz>tb"~Eeg,-\+sl4]+_H wӭqzԩ$uB,\5,7RϐhL  doU:>M^sd}nt6IO+6`7tE4CJqE-R%1$L(4,]RBH|٦ekΜž DFN9==LQZeoSRu:\#OqA6WZ<ulDyqGL\-O?"m}ڝ/v݃%4'۔ ǏN՜"U݅#62D}\ߊyiQhT/wY/2oSNcnsTA'j&҉zb 3AL,w 079D+hϘ<kWL%I1z;EjuZ.v}=aex?!k5!dzqv7itp)gԓQs}qZf{%a؂uaE Zf'>C<w[r_KaϧOBJ o 4J, _h2͋K֟`XUu}U'q hl؛wM%x'"sjx4_M-V_,J^[/Zf`-_ٛ k՛eUI0 MhAtUc YXwu1*-V}X[>Bn>tϾ)&zow͓"a}_MGeJ/[xUK]YJ̱d*QV{RcA;3ߓq!Y~{|2NO.nUApGo#}.76kWF[J(Z d$,YB/<'bucJZډX3J p?FW %CqMmx68H` &_DEC.09HbԻ/:#}REam+Jq+ۀE>mjя+6=W"oyQ'v*tctEsһΈm.GiDBJ|(!kXWҴf4f4; ]Vu#R`c"o0mޭP"CgPe27ἥB~RV _26-KS itnw06`)J$d1yZ*O*&SWKE=Fy=: Uۛ%Od&GrEAWx@ ;I폸V;Lko8C{<*U1TP&wwm~WČ"`ߓJ넦<'ƨȗS;hM$CqJSoFcuVRKk 27plrUue/H=DJ-Kh(}Q,<* Q//R:\0ӬB'U[*Qm|+\!CjSlp8HI,;iOD!gio^_|EH^#e#/|F0^H^*0d@aq!" FӅ2ǠjDߑH W⭌ӀV`fRHdy}wo`Su ӛTj赪`&䎯?$.'+X a!9N%\byq첮'0%5- 8)vXr~ZN7DΙW :egXDсz=$Vi!-i$y02n(C1t~U:r$QVܹoqsAJI"*'(U:ȭz"|Hbws^_6T]5ݔ6%':io?߶_̓xZ0jvo/e?w%Z,r$&0ZE` ku-ݩ&o$+85~ae7v<Sz:?-ڌpeA=$&Qw(lmg*gH\fEO,)i,N$e[&ebhϢv8xrۼ")Z2)+.Qýv \d=]klۀV]eyQmaɼtj6+k\UzLDniU1f_ {4fj4eI_~MC\_pzܽl!ί7@?^p:ǃt4mC\^ݪOW]|ݍ],8HGqݵQ `F{ky/aYpRP.߫gp08F\2qwp ܖEŽWKt60mwҋ}ѹrLW%|DLiSWdr^*̏T*Q5+(o !ӄͧ^doLο ^s1+O\P`_M8-KQ8k"*M#?WOLawW5lC#\%.}`W|O_Vx꺲~F3vvՏWTLc ".;=q PoFPkl%5|.9pV``h̛6jà3^8R0+ ] XTDAAf"e2W>|Z`"ͩ@ÙL ILtb2҆(b \Ӂz|i8to{j۝t^50lDEҗGp+_<3>Q}`']4@i12Nh$Q:WwB6[tPOc{kkmj e4L̛ЮϬJQ>*R8dj$NMJAuz\Fp/N&v*tu u0KD_ac/@nJ"1KQ.J`g!&'qD; v&;pmLuPd►=B0QQwA}ev4'i:ڀheeqDќ#`Z8X}c:ΓvNKAhvx\+GsJ/Qhˁ2fWXR06(ݖL|RKHc6Y=Ɓ7G@mGOgtJ9/ONZG#o{ʪ7X,BΪ0H*K nObwƙ\ yֻb6D? fI.nW͟y[ղE#Az+Y#pE^791SfhIn7J.]D#r!C&VnTqip-yZNr9G5;2iZ`[jC^3^; e}UF+SMaB[ƃ'ٷ9^6dz7CBN9{+AVG?mJ_z,@\bESRzK74@3OP{lת&~vN'҉Z yS9MB_󾵃z4^n_-*uRJYO#)u fkcKw=W=eL)jh7l܉~=VGKԿE^.׳W7"rIgBߞJdVo ԩ 5BT-JC2gjK&U`4U{dTM_="G-c4DhwT˕]q-'YJof#uI'-.കfr"$Xcs WΛI '+G=H"I ~b͔2Ȕy٫ľogJepZڥDZx{sWOrxzq)_-k I.s&xLM.ZI5\nZCWoK6͜q[mqjW ,$r\-cZHzY.6g蔾sDecZi>ijT &xV^1I=oФi`c骏p߯m<׈;2S?eIHBOUuز|m̹.BŔLgq8WߛӺs*]U y}?{ٽeѲj"Ok(@9ĐM\!7%cU|y=>]|8})R[FOl#qdS:bL{lח]ەQ\wiOU}HVȵ0]4,`iOe8tl.$eHqܸ׭`HqEetދywL-k\ahr5ͺ :|Z}/6rsQU$x\=&4Ҁ sTn똷ZM"kU A+3\GޗHTy^Đ6N`(V0}6IuxwEX>[шè\Vr틃Jғc?ȼW kQDa%^*#lKuT@)3 (=Θ#/_?e5_ai(v9@榵4-H@lLcږȑ{}a$Jeo(6(K$k-u{^:",Xũ({e`ldun=#=#DH$2e<6J]yuBjMGЋW0aIVC~{=gs w MCKAZW2 _{/۟$ g$),M-Y,K׫GO#|Ne:u6H ՅmQ4 F(O۬MOO?'e_~^h@'eXg)>$sO  эPU u!$@]nuhk˜Uzr˄yY_S|]Ƃgé 8@6q137=ZU]܈׍}|]Ԁ Y0l'-5^5'^㌝ ൥ ;& g,ĥwB[[8$N;A}bLr>TW MSP#5퍿Ww;d5m 'GU\4E^,iAg55pKT@%͠A|Xy,*rw3ˏn{s3pZӤ46vխ[M o\ܜ>w`H(Joy~Ssf/ҙg1 ^_ -rOAv }]T 1ӅOZ O<,Yx\KH2rÕx-xȦr>!EePYfZm\_,TF8CK%fk }K鿬C~Al{0ov0փGڃ|W}W+bm2ޟjY*k<ģXppȁfާ s,o(n ȁ0 Ii{?xbC(od8щ^ۊR9eltpaI2KRNFYҜv]cpPB>Jo[n/wN5nu:pwq%7.U1IQgg_:dBKMFhO1ZNxp6q"~rF4W"K͛iӠ<<`lfX -Jl< Ki5R`b|erK~ccB?|^j{Un3zͭKte)pl\BviB7VUm"HgB֬IOݩ 3_b& Xx) @ 6\`-O? I>WѻJxrƅP5Ll`~nV3F&(iqDi3}pt3oFl4faс/nѴq|sy 2Pb_]ꮓvG=ǘrHMbN' fXr{lZHGEsS5Mv)4FqhdXRuĞ9S<51"-o`wxKjH6Qh MTҲC;4~S<5]K/!viOsS2~=f{716gQW$Ŷ[ 4e67Ƴd1a{⮦.$zY{E.z,NXWmN@fCPkS[V8۱xCvOXqsEfΈuM|9l uj*;dA1L66,lMm΂|S9&&b(X[7rꗲ U7YSuӬu//I~qten`l5ixVTa\ӱh|<`u]|fay)֡eJ'QBۅ]Q#roh%iiW3Azl6M^.rS}Qgo:fd2⨰܋6v9_mÖ|CdtȰtצB5fa2@i+sQlG *8`NJh2@mV9߅K{?! !ȃ;trV2RU6 2,yφґo.=G&A|$?{ˁѬARyK#Ac &—bO4@ <ęW)ſ]]d_XFNeEL'sM\ +wR'}Ix:@TeWLO5Ֆ8k8kk<ϯ9>Xr.V*fDYRs#4W)bO3\0!|U %xu,wwdd qtqM$&,¥K7дvHm\,Be"krk딌R+A{ٸFqHRi\&(gߙ ',u]Zɢk]!FM#d{! bc>8X#5.yUHTd800.5*R'i<?(D .`h(jFۥV**eZAZAs("RfiΧtJEZu[^†(Eۣ1QT8KwyHKkEQ4$ ͷ6"A{;G8BQfط.Q~pAU97Y}ѱSeT l a csHvrA4_|EV.tGp"'@NCz:|BO҂ +T-`s1 `gy%IY?B`AV0hKtKcmζf)+o tC" vttb)VHC;(%4Z@;O8RZBy-by&@ (qqA4ZN}D^ɀHfrECs c:?ytVW9rЕ{aZjnXl (D&@!7ctfŻg3$q^ Z:yN$G9 WHntk~tQ=5ȣڊoA%5MI6vns5ҏYgX_K;oꚶOs6?[~و^t^Gjgkg氹d5$OB_tuQ\-^%2WǍm;n>M"*7/5jЁt)⦼ojcww^o r_g+{ Uw*.P`ò:2*rLO*8k Yr4ZooqVo }TMuiy];3XڟOjh XJi,CZv},?v(|WU6E/|I[咂.,4+>(f(C.ú\P]~v??T;ۯzw 2( Z5x_N̥J/dd]B6Vqc}b& {C죙h/aӉ]Hôc6q9y[lloCnq8v0(+ܵ'Ѐ Jo Q|4 I(wh tKg |i6ס. 8]ٮW>eGCm2!,ek@ix 2M*V1e\/qd: :bA92A4"rSi:#=@4BRSJ@$ɶw+  m'҈& tz屣~ lD2@uc WNB_sivԐy'jؘӦ(x8Χj #Z**f jɔq;Jm&LPBY^A wcb|kƊiu;9B:hj657M4Lӂd2OD7z&XǯV8 9aki d.v#UVaayrZe$\|s pTcr O$È0)ՀeƆ{<.^)R]ofY0u+ vD-e~y\=͍FOm?J2_~V: =ӯ%Hj_+mO\P 1臱8Vk}$<!hJƨUid984iP_O5sD3)ӳP.$HaՏ CK]o˖GY`Ty Ȥ֜g-,qtV6xş٨:\DXm1eLXsſLt{G\;DH쿻AjG9*`a+\{lkڋr6ށKrUBwU^&Ա7HhTZr:wx -qdXZĒM*hc qJiV82 }\"< C} "ŠpQ2Rp9vR dn^&4I([.۾ηq8+]9v/j)aC-}sF//y!zް#U~Wegs#e:4װIiM;.}1#iȩfQ%]LIeI5וSZ!ԒC|Q`~r$: -|R{J-˫qaG~83\=+R\#%WI|%啒Km"Jr?g1-uF;2ge5ƀj ƀj ƀj GBn#ȠF52A ݦuHF 5RBjR2-ۜR?GQ) ed;+GqWpapnTٕs"dE#IQGˆMZDG=25i2Cjawn%'qD ywSb''7?>~MVJԀI"| \8|U lW uJ+MMѡ~J[3Մ&9_sFH={+W] \"Xb:98?TȸD}D(Ws)WNQ = K>4*2>` )c'YڬmXh-I_nQl5JYL6;`Wv zp~Vm$o~*aO p59jp M,Mc/?ĚtW[.%&qP80&DǷ y˄ALr1B鄬t$N2;{2٬EхYƛ]G)jw03tD'MNۇ1:4>`b斚7 ,W-7ɷmЖ:~2-]h28+D 8K?H^1-v߇nyF Q4Zk=d ɕ :MCo̠i+Ӌ){`* C=N`~;Ϋ+6"":L =_i gӴr᧴|NvcAc:>|TkFc@zvcaA+2&fC!K]cCRFFi8̴ԡgay^"C7.|nPFA.ЪIb&Y"HX99"0٠!=nv,QG;0AV@?dnw@GRKrZ K?Qn6S)8pMO7&piKv*/ d4vۥ2zh/a\zf7@8[C\Z"_/EDprk#F1ڈF6bTJ~+υ7Y_tM",KO<u:'t t ;e;CizB+2.C۫L rARJp>PHrq Wk)J[B{o^Ͼo/>~5ٸvOz@x'=dR#J/JE.[`2&hYxtޅ:$^))D7&0ûM?O1ۜL=v]# Mv% ?&[΄RUg>TE4∳A9`KG: œ SOKFq}3T(F^&m,q+SՍhRK̃ ]1ߦ!I/?rৼ'a9%w4%ԴԑuaPϏO q )YK4aM{m˝b vy"^ vQyoȔW۱|Yr:Q+7MUeF"J%4ۜ]xUq@yJ$iR:Of3wٮAJDrW mAlڡQp ӯ9٦e҃%Y>"S#}V5w2ƀ@].`h{ycybUW~訆o~7yo3$ "qysy!{ ̸"Ul`o~뭷Z֭V9|X޴JD\AAvih XGù"7ѫ7u}mOEe `}YA! )qh)sYZzB/D7/?|ܿ3kaG J2&T$^G6C-⇮1$5؞O'7D憯7zc|gЏ]Rl),ES!ay#i3fQ2t>u%84&wQ\TGc2n84XA]`GLBI $y~ h;Ke靡q-|gqqĊȚ^~^<з"sbPş`$r'$ 9n~*htY ߐ9 MX2 ,[uŘ,A%~(\*@$'3hJLnj"/ՔnEw`1 tIP54 QY5}~i7X9-o64/aTo(РLaOYN4 3X٫(GU@R?rg"EQC(Xef j鬌?ZW>6>~Ih'O=VP'Âsz08(]PG}6ԧ%j-J̠+y8!S96[q#o*tb̋`n˖Gɽa:!g]l" FcybCps PjHKR>%5/b[烧meۊT?3_DOL 2@¨r  >&ͳ f] Coe+(eJ 3P%NҖQ/!zsT01D5dGmhO eƨ=3{&ώ#Io;͚ꗂSzM%-&ϫLVo 4&]B>TۚQmoܚͭܚOFm .EOskbz=jճXz7Ց}V|Bt7Հ O'sMĉc<x$vHy}[[:(y1ؗa7Y c)!dȕJ[j6dNv̲O=?Z4lyc&| |5t)ǺteĶēL$uO=]ޥ.hvxqL7fr"1mhbZUYaeٙB;Vz sVx?ʾۈ:Z`uT嗦`WJng{A3=.]GILYu%ߔg}į㩨F0K$fκ )z/%J)S8Gc|jWeѱn(+5Gt={/rX[89ۡws$3^J I#.SH9֗k}dKsHC mp=7mRʫU\XYX@G8rFL qz$w;*cmD˳FA;:]M,( gM2ͺ6F*,z'r,g%f:D9f>yj8ګ쇲maJǩs5O;F%Kv2L[EH>p8RDJ-e 虀]̀W沭nH[H yEo /vaCD òXb 7josthɍ!;MO%}Lh;}qdjEޗjNUX*if-n4Ybi:m!L]m.˕th]*.f]]Zk!F;,vU&c.y(Y 8#evη~W_L/4X"iZ~%ߪ9">esXڒ$is&ޙj%cO[R " E*~6vXd% Y '~_G|!mfUqmrwq2({ަQf-nA(=׭10l@qYWǣO`;^Wc_f$Q?Y]ƚƯso塺?$TǷ`ygͧiK>|ڸukQ7NY+}nAN☈(j[ô ]vKqhӱ|23w66 /¡膣 p N3s1K~m?%?!].ϱ3'*s-DfPzKhn<bCulm{5İή&19}ja䧞Ap"*v~5Q[;S1{V0cr,E2 uUePdy2 ?rzlf1V][WƲ~>Z%=X@}@00yjK-,=j\~[K IN2J RU}뫱 _e8&Ot)!= .v[*D!2oj~ x)#Rw6Vh_?hb@ 3dEQ1/knJb)ag0S黊Z3 H@O(z% Ф-H?ת2CurwȸQ pDAT;QHR%=NG^jjeMdW렛:﨤l'fXs6l/Q%sރ)Z`cFA%Vc/91M$_5z [e0ßN OL^Ԑ$>3A | d( @ZѭDmY,@63-÷8f:Vj+Q2)Ccdꕬeq5:Rb+>,ј`MCf5k2@nh6!mX;~//FSen'#K&- RHsUօq8=1`!hjg)F9D'GGk5_vo 5!#g(ՠsll[d,_:kƇ5Eo(\YSjoX9229!y33*F!h)rysƛ*Q{jJS.к?F I>l9PF2qe̊!O\0efچ)LYF:)ky`/,5JagSaα >N'턔9ڲ"1?0XF:M^{՞C;l g @:L]VЋ09v^|_ hD -zjZNi@)mc7kg@t+u\dC'1b}0(f{j~:o]TUG] 0=6OBYXy3yl2;1גq`z[#SKdX ɱ>gMz&A֘5}& ,HȠz? oşF7*:C»t_Qny5f,RDOo Ip Qe8ip?de3/\0!s9{19\A0 ΅X]pa殳_`9գ¤xaVsc5 &$/*" mT VS7>0O}ingf?0-LLBc=']^l'uk`=Eaa ;[nɝi-̬١ 9…JB5g׋yL2lH|HflK ԄdPJn=P!!Q2kX5o`7:FvPq;AF@P6gU_렑,w]R6p`` Pqe(1z QP/4Ϡݜ 2rڷx! /xY7zsB܆@@2 "wO}!F$F<|}iIZrS v~U0"W!Iޭ^^KDIqY_srS"ϧ6 Hth:d Kj%U,F?U0y-w U*!OYń+Yn#T9h6ӂo֍U-,.L$U}JSmTFfF2̔F4|ḭu}SR3r.z J{h8GuCE]ҽb ?Wyi-̺{:Wh4q LK/v@CPX o}(AƎExi, &t>S5,~7tA`sp4dؼYG{_ٽ/=:9=Ҟ|<>Ş|>;p_;=tR!y})knFrx?_ jܩ2"w6q= !UIf'xE*:ۅұ&7J#=30(t0Z1;~y膁ai*!qjAF>2km5+xz}w'-|\ ILA'[YS] QA{|%u> Љ%@ {4ٴo@O:nQf5K}n /)4 ԙ0W1=,ۛ(5oV=<*Wx˘n2JbI\>.gѹ:FҡPIFCZ̔Jnbj7?6UOUY[^Bag%Wr{jj n n9[,s*V;NpV|aИ}LgJ2z;m+R/sw4LXs/THHU|aa΀*HJUKY5zۺ38Ҝ}Cğ.i\Yb~"VΕ} FT!gX[!lƷMG3hW"`)phF 1.]5iDd\_z/Z&yc%?UXϹCNwE>.&*HD6qHi}?7z5#RK٨װT_C{Jψ0)pwf+ܛ IZQ_^?A8^:i¹dBЪTFO)0vp2>ź5O.pv >JvR 䌔tO8r[wڤW8l͟)qS8?k\EsPa(GsΓknV{hՉ|\wIB9Nd0|EA L;f1%xJ'ObHh0k/1vdi&zY׍=$Őǝ[[`;یv-~\>Qe#"7Q|Auaސx+ӱTT! 7@B~4< |%dv3!_2ЌivN^EU8o\F}%؃σ֮6UaMsϾ ..5!t8ള.y 1Y=݅Bΐ) ߻YFC?LW]hՅw" GP$0W藸|#3X I66KM  v.3_`'|Ok&_IqK9'q.Le VO!]/18"#!9VOx|HvDi$Ӯ&̒ ^75!iߺ{*b8T΅:F4ފQuɣcׂ0C(fC8m8qs: GH]A$uT%F'A@ !0"j7-7vFse(l$c\kc "-#,s 3nbՃҀz ag(E-Ђ3jAy- OWʱ;zÓ*)k(Q*&n0 .͝aɜײ|{ pk@wiѠ_#`%2(F灋n#X Y.9wa7Apc恺HTˢM e|$otތ|OMDЖXdШ @B`LfA/są/+tD=Hy׋z2'= eN0݈˜\J[+.)S ɴDm!4j[D,ɁlTGDڒ _ЁG7a!/x+r핖h\4^Β|$; h{e!l^8z 7ȣ~ぉHjQ['v٧a,ܔa 狒HumB5ݓglFo(Snc\Iv3z7JkvIRC[\[V`y#M}/@_*#ja23޵ "K,ˡuRCCrk5b;%3yybԴ@H>Z4Ւ/LMK4Ly$Kqp7*IR$*YXXf">(b>uzG=@3;ЛOg$( fqr, - X%QqwH^_UBO(Z0q:nu)f<uQ #oe׹rȌCCҕfՐHӁu؞ʺQ{+ރhVò[[V[ZZPd͜kebLhM3Mȓ9۪4*Q$dd#zw.pН/xa4-> h2G!?QJ̫tV uG7B=<4$*0(CCQ-wG1##g7ZDGXܬлn>t4eĞ\:ĜU&ўC()a$޵-$w|'fW a^=P7[%K!mmtA J>~Cɬ*)v733p$T(T%zv"kn^Xw@h-84> Qk \%E*RU x((!cJ v  z6C@ UFC!.:>]*x:XtWY%  C<SxFM k)T.M8C`^l)R6FKIoFG)gj Sdt' 0sM d$ը}m* f” 2\4ٽgn$:.HVOt8CbY^:}O&9>4k89s@=a|c_,&S֓iR.w5n)*Q#%0EumЧ}*&;CԔ~vI <6v^=L8Fւ=WLׅӤC?sQhXߨ-s軴R,@IeJywJYp2wJT?ҹ01ߩߋR#?b8_G6O6#=v4o4<pd(86z\W +"*";%8Y = vꗉCyk q] B\hg,vFh~ Κ勐wD#d\HyC3;$ޏFhD;AD}/T(|]s4*$b9mC,zӿ&uݺ a=l[/l]DC߂esfl&MėcGF翯Dngn'BKgEL$29xEJELMjv<Ѹ\, u4ssv%9-L"b[c/"E>L3M:2K-h-%g$ւ^#Vސ0EvF` 9\<\?ɬ"*=EZ2 -+dB^x|^2m bp6ᔋ"fQ˖bϪӕqfdԩ9DN7+ ሮG86E4`>w$]9.DLʅ49Utj-b5R2Vu$?/[m V ^=]̥Bw2?DYS\T ZEc m}E$ށ! h \~0K%ri߇-պw+ vNDx#HSej/Z^s@"EgHf/S֐%[5, oЏk|`: &#*[.;]iʻzO dEqr%H [Ly_6? (g Ck_Vo L_x@á 6?1ѹJKGq6le᤽tԚ{k荔UQLݰ^Mg5|Ҧ[=rWH+akG|e|S5C*b' og&3Mנ3s~+\-je~sFrT%ܷ\dLq$7\=C}MvT[tUm:ORg)bp0UԹ,S4ĒLXrmnh-n[%9i5%smD_&J pZ,/6=[6 z>m'ֵk6Е W Kt :P*ֿSa1˶B*s dkJYLT|t 8[xōЗzo8{scY'enZ:v04p%nO% 3'ĸN9o7?C!"eUm\,Lz[^ASr-/3LG˟T^go5;NTMQZ'ֵʹ6/T)y>ԋCWe.!lX̧0g[u9)r i{-0jl;MȭqXkEæq!&Io E'=_Ct^vG/ݲJ^ 2FFZZ\ Dl?m%цa>rUWK*t#6g[e${Β,s[oKܕ1XzBd. ʮ|}`VwZǟn=@ܣ^S &xR}}!HB] 2k"2!XB\Ne7@wX-NY\#^rv{F%&Đkz }1]M%sD^1ɝӄiG0ԸנGE6|Epݯ$D[`J9n:u*#,!􁘧jG\@֭J {Y| 77%CdM:UtH&mqZÉkSD!&`&qs#&($^wpqz$8W4pQmF"K D-RD#xZJ~D 8Qn7Fn.Koߞ?9zB+1.J#[*9- g?iXNXC[(Qt0B[t۳a4_Nu쉝bطJkΝܐ_7 /T]#`.&h=IA9)*ǧliT{sN7p:[[[;[^-J7 E}qcH_~O$$ wg$Ewh'Ƀk̺gTlsEFFa'Ѽ!aQY_bFùmw꼮sfOTV?`ir<! IQ;" vnI*&Z~`!3 J) +hwT"z > Хlp©D%, LlL%/A@ڈ}\h<][US?1빥[><>_EjTbP^j-٥ IE6tĭ:W[+bB[+fR b4 R. 3b"9WV&{1t&[.M:̱0ܾKIwaAH ?ot&(nurC߿ lwBz* $.#D.B|>u &}m&?uy{J^VvџF⌇=tJq `ɓq%TS,{6A*Mug;EEP\/l(P?CF"EMJ.܍]B3+X"&,]? ՃBk\fuDaԴ^3}TQ\P,-"KUL +MſFf )5[7,:͚\ QYF!r;I#:24*L9sўtBI?~5DN:ƣrmc*"+@wNaB$%t 6FZ ΪGS_ﴰx|f<g|f<0a>O(j[8 ̔Y}}&ciLKK%fjXeHŽQnomr0Ap.\哔å`hG|>$Y; |YAE[zl&D79 UP<1`I&R`ͱ=s Ծ$.ac[]ߣhP#p8EYȅ'N8`Mn3:m5ȕS^d$%La]4e i0HgȄߏ7\q{ a]T<ˤb}ggxԨnbs= :MN 4Fؘ\0f8 4&s)V~_Ң.??>`O,zOɟ lE_p^Dy!\z HSuFR^q=?&@cK|;9X*l@5s"Ru!o;ӡ?%jpjQ d?mx4~K==RR elqe=;zr) 8bh/dWҲ3yt(@[hdVMbޓ몧 O&NACsx{ǯ[;_i˫scE z#?\%jHfF'y˹Ħ̘\Qkv)94tӞDPy#HRvkKgD]d`b/;'G`$kx{Y|0^mu~Ĥ4',yoʒ[~`bl{oy㼱sN赏/%jl-]܇ bi6G.8"z*'HEY;ftJ1'4RD޲ܽ$)GrudUE-.½4E_6$b(N{,>ôۧ~Nk%Ti4U Ʌ꽺\ucK8XE#Q.޼RɆMXNCdڢDU`pG/}Kcs䩠*U#ίV M0It,S6"g-D<룃$ơm/pXIC f"ˍ/i(MZ\L"`ݡ=Q6:'o4]L$&-j| =\Զswe`g)tD[$ py!Yի!yݱ{H_jEITdsexI)ʂD*hԪ; <7?DLg9іgf9ugX $^_6,TjW Y\&aG{WWu1c*XQ,BNH3\ʱI2؄V|)AxmuxZHT4St6BAƓV_w%͘@3ʫqfAGjltC/H1 K*E{nEwŘ i!u+fa A JS03ٌ=I;>e?fPdL" %J~HPZ^Kao_ORbcVLGEI rnhUǶ7G1cu"XX~]>}%FS2b$nl +-n ,H|X:ݜY\AK e8v|9$I}$D]$vb1!SߧɟC{  >NT%jY ziߴ^yo ;Fac8͔Nwnt=C NL-ؗo4N"?uИ}%ͩ}\3d&h{Z3HY%Z3Pa)״M ̮9ԪUjjT~*}uz˄.wbA@\İ&0 nFIIzeO;#m 0-M䐩J wLgaN~Hk05\VPTUGL=L#uNXfȪ>0˧>Os"8@WnX0l:S߷{zETxh%>lU)p%$.P3Z!p8Zl2>μ۠=,F$3/QݙYa@ߑP;WNWjsNϵpB/4'0(f\9T$Ƙ΁qdS,IT._jе:zŋs\N7cvfKUQD)\,ijw]jQ9cvȮhX0Ff$3%u SUrS=Vyns}Ѱy=wc\*Z[Xh`*byOnaB`{:6 C7%9T}xaah|g3sKg0*je#1(Š#ð~GTRDl# Jc h+ȟ1J@ST@ CR)5e~A]v+}xʺpB w*='ibWD+%Dӈf)-׏]w@M=*6!p.<U5Tl)3vw@a<ݿ46Y:,'KQGT ET0 U;%D?! ܓ`73)vvCZнF{,Y6ď"g{ζed48Y~_p.z,>a`fqd mW1^+ hc&usSg(q' Aqaa UH)kxxh~C8}MuwWS~A_aw_ }W]7"ZDS4J{3(N2B6)i=1P{oX&JUHRQ=V@ŤvwIT6mGisbyBBp4EgH Gݘ>rTu @?JCg@#JƒG5^݆eeD7tNۄ'v>޺${~prɍtC*Un; |Y>~||Ptw+8!Dӥ# zڧN ˈSbl?؎M$^_/9}H\H~NxO_z= H6MRPQT"KPI95[.@p-Lϻ~29 5$$ ٭v| +xvbRUv6IQj*'LjdQ==lg7žVI}rOt|[Ŕs-~jůuv[tMs#NtҶF$ot 5qw!wFtYd*W֙ 8'%˙\I`!AUbg!"HC\8/q@݊Pc^[;Lcikg[YIv͋+ƈC%킴 YrBJvARyX:gۗt hO =Us9ycEDW? Pȍ7&cQ hWl f#o){XZ`7܁hP+jJM4ey׏g_c^{<ϛ_yVʱ)MDR2zhWY=at7K#R!~4KLiF*Ww; PhI$',Dlϟ -X3]FWw!` Bzr{}b$'$~g ǧB!B&ps~!ߞH0cf@m4Y)&0=ρER`Y?Lpbw6m5oeDB GؿTY 挤f:`8"P6Un53DwraUβ`VCVlk?UNH,- q+_ir]DU3;8=(fGdUZfslc^ 1ޝ@#d(Lʟ_U wjP_ CN<t| }FWJ5U)o BX =F޽HwY8NE CElct{=f [@E&ĸ*+vKL۠TYw)Ra=%]t ӎ4uvTܺG''=԰'נaa=~6z.^i}9 -66 *"p-c#'B??glâ, v~vZ\0.j*Hө0|}2M*]t٘BX"8I:Ls /$xHJSE." '_*3CG"Y:?E }75G.}Qk] Mh[ (5 ]d1sFVɌ= =Jsmt)&<eUsm\k%BEѷlDa$GX AG%8):jz 64UR}!D-"06_!g̶/j&9L4Y)2^ G$9G&wt䀻"qFp1{AJy"xN[@ω sG30&~ɡ|-jީHH~MNBWm"IN^?%*S; ~NskwJhEa+lU5SY'@y ]3B4b䄼Ƴ {n4څز8@w˪_R2kĜ*Jh% /% ;!e \.F ~`Uj׏/DiM>BQ.4K# TL?mt;2օ 24in&oIɂz!=pD e ׎YOۖN]q`O4uh)Z2k=Vkl&wsN1rR:񢅎 ;PMt81 tz EMF^c]Nk)3טV+JKz̳;SD{CHs# .4 4R7^0w^@I{$nG/)",vvO*Yyӯ ɨ]\\,=g,pTEe=U[@| 2`$uQwF{QpCp161w!D!MKSQ.Z툞d("Lչ6?j~gEEiaHQ&)˪Ff@sݞ&/^h0JʦɈ.Iū>0eQwΒ- ~X<u!GφE4bP1 "._`y眿* HfQ Q1$*Uc̜| Iv/OY9u*mۋYW]]N$ҷc?}a3[,G1'UJ]hax奛kku" D 7t0VZ@?)&xizsVl O1idPLH޾x;~㞗ՙxRXׅ7Z0un\RӼebλMGER$C:]$-;Nsv"ʂ5U_/Af%l6K=W{xABHCH6ql;'Fvy|Z WHժ{nt~ݢt%2<)N4}LFTOCn;K*ŨgA$\rn S g! dгęj}j#0,ُv_n@యUA,nz} sjT+(&Mxׅsj'/tIx _ny=wb ȍݷCiDBqcF-)NxlI;튽Y is;:Rڈَrq4kYgBPt X)[?\"˵W|$ѽBPQ lo%E @ح? =/J,(h$N'%XQ8_}ӓ+Jl 8Ey^t6bCVHN*X *T;!a??.X St|qPZ4hQ6p*{Ls4 ۩Ln#.!yC=o E@>[7״3m`ef'c9tGr@1%#]5[!V 6#P94@Ë9iE ˙+iG\D$z2^ SRPwǧ~7);O1{={[o+o!Z# OslSfD2ZPk#SXàKFv_*i[ kYwx!ڒ)3S<[Aba>R}ڀlKƑpg4[- Jhf>ELkֹ\v,Nln HVٙG%=RVG߱mzqgA^h ,hSGgVJ y~~ ߇;q}Xt@FNe*tjϵ f@:tsRi3Q4!Ѐ4(FY!e%ܬ wYd`*ܭ58y)"|81v(7=Kfr=[i+ovP2ˆ|8͋AWYqK"ȺOCfA/'Ԉ9LͣeYqQ P9m^Xl=ﭷ0-zn~i-VL*gұH6f8U2Z5l8m%Nļ/UyܖFLmt<|w>uܽAFXMz7X_y}mB?8ީwGfmcMlfWc4F.+"=.ԘýM94ZH| (:Dgg|7/.AJ-n' r>G*e$8_rG4A=>7VūxȚjusC^MCR~\uCI : d)IBGn$ȕ*e:ĩ6AzmfG3ut\]Ak" uHqtV6a3/5,s,A`X*[&s@ͭIvcs⩈YtKx\ɋx ppQ7-l"pKՓ 7153-雵7nU4dxEYʼn(a8Jo\kB*}i;+6Wům+8.U%䃓Lz'CU7ξXJBоAДrs !IKu.#MFV[mZ*m5(-;|p~;G8Cɏo ܇EڙsJdc=N(A|#ss K+bRM2N#ݎgZu~M5{f2mr;H iLZ3#dAJK n1E9/``/~]1hnu>_Dqy1C@Z}$,M4sY "uo݃.qӃKKʮ5DC wB`^#H.* Z(**Q׭u^)꫎ ACͪg|<[nhd[:Mڲ8;kET' 5~6M*@uBONsc@M%'a6g2FO^1yk9fYQ"/3!>⿐4|&)yDL"Tj 9(ʗj_VFbAlƸ@mE+':=$=rY9^BUjV>5`2qaaXd`'62qZC-) #|5 Oc:@]짗/ooo=L,js8HKK؏aׯ.% eVL)^_CO#7zci+)IsԘ#ob]W8O c:fB]IvqgOB_ׂ@}w"zQ{/'hIوaoWO JqY8 X/%݆ gOBz)!+fb8Yۅ.72?;U=xh;v+ ;-\1B޺q 42ˉ`DBTI2lj-Laf rRkJɓpZŪ g&&[!I''IBf~: v#И*Jui ,ݹQ2),3DV!87j38Dt dL t{~YHVn.xLϏb/NELx hq7no뭷ǡS^99Z5ӨoIJ4anopca3Hh4avpXPu͘8/FwXR[r&`סK zy*œqߖ7H#lj'S!$;tmP&5%D(=JowD OBJ*{mkos}N+yyYKfHBox1R%N"Y—j񯁐34$Oʐ+R0|LRLZn:m[(jW1z!Gؐ$fb^K4}q'gW%,Jbw{?:-p ɀ%( 6|ā8U3I@% os#d "#z]׭_4w?L&-ۣQE6Zß-<"?Aq#E_'[ tϊ:rK|C!}xi*[O z%~880"X.+3R%8YZ9pR㌅cR6 qݎ~ 8?F롉y~7ar5^苯X"8qΞ{uFʹ T5HWwINs>#+[G% m(mH[Jic GO#ft#OH[}:ċj9t6fQ4 8FA1K*3fWu{?ߞK!ģ x@G&Enn`@VeLgThr6kY27x4F b+lۼoĴvYX* @!L9ƭSZ$ܛ!:i1˵+!d _ԫO,)ig|Y_ԔbeFp4K.#84;V/$XNPtz7 &yjqH,Xj×gYDdG١"Dũ;+mgm>YrƇ@hGcIS[T `EՃm}geŬ;PAi&t`UsAkܦAQ\MBB~u]W4gikvxX5$K]a9ܴ57D7xqϏl[Cg?wKv/[zAh:Oƺ2bhKeWoc7f\&f`#F6lz2V8+ZBb ͷP`-\6@fآuKVMj>;`65V|]MX61==_,ac2!XAk#CȠUEzT :!t`rvE[$pyb(k}~C[m%#R1 S39E)t S{Y\PCec0O7Q [lt@! $S//bY7^Jv\KMr:k{ yWYch{3>sNrJS ^YzQQy^p̈lՒ-WḇxvT~9;;ygc#ΈmB.Vۯkb9dF;$g@IvI419 >PM%N/gނ%rHBk+}Ѕ`@7ʂU>B+K rrd;}:CCtȆ*FC?(~W9y kW;ɠh"MTT>rZk@*]fˏl`3UFSd򡯔W+á+yXi0$@ZДu޶8ka2zN$0L[ 'Ԣ{ufs)j.rE[BX#AM)ܘMgpGA?o x߲}sF/s-:?e j2xӀafK(?mՌy׃$v[HX N`F>­RocKOhdywjNcpWVI_zxZ&H>%ᣛF9'A\[H$fVx:3TNQJay|omGGJS 8<6J΍k8ǚ-#wNrӒ];N'ļd yK=$j=}_<5gL4 mNl$w%c 8 3MהcgTq ;j\$ !$M,թijS N"'4)GwnT~ジdf6/'CHf1=ڃ:*搑0nBlho3c%ڀ!нIH㖬$b@NHqu܂}ȑXqud?- ޯt{gE'33vJ.7F*օ)(I5ɾ~D ؍MS~qgiPO Ncr824)<"(ϼyևjO_\1!|qfmIxoBߍ:&`v1m9pyqp=<8qSֲ@a!& 1:⒘@ir!J6 q{JXv c9t_{o`Z" c؏+ &4 e W$3ci$Bv1򯎍u8 _l)J8$J44*v)|;Q&I )Bןd -EF) sd 4+vw 4b€r_NI ɆƲa*4gQT3]Vf9NHgtr\+-dpЦepr,IWբj:K1Y({&WVMݽnFw$$ؿ{-""2-hV|c6GI>z[0+V#.8>mM_5S$j˧0ù@\`7N;tWgZc2+F?N9$d^?hB ނ,y93# `qQ_ jIkCS|UA,|)W"ӂ ΣUG{5Pj6̿VŸE-h]7φUQū=  `,H[(NDt]_ ,rlS%zPz^J]GSEȑMqXiT8 H0 Ab{g"fDIYS=[@\,d2 ["U6(Ǒ[}ԝju\9^kѾI?sG[nB?ÐE7Pi^Gc8yX9ĀqO"T3ܮ>q0mzBpdF _XDȉ ksnM%L.jfAe[0{dYLf",f |۽$}[׽y"UtoooZMMՇK20zLF)5-ϛykR3ELaG >N]رs6 +wO"'SG*Z)eAk=[NW2BJG)ޑ[nv̲-/C/41{bQ޻\ ;R|4cxH"9\hv0& 'GD M%&;qtvVs}b2m5gpo{ATJ,˦Ϲ_i<690rO~C75 %ĒguAyy1ZbE;T2pbO3[/Hfـfkq/Ɍ( vU:T0?COrROJC2L4ݹ-:}RT7ѱ7XPrߚ)09fjԹ':Q>`2Cbu83F ‚TΙA;^sʅq6 )L٭Z4:]5D6[M"cH d Bbzx4OB讶j×%N,4xH#Z7Ǘ']F\zv^CC,js)B>)CNn&10F<~ }XBŁx&x֏i^dV?:{S|OQp{\PU2$5}k{O!j$]MMES#ƈR`-{n'j`X17>&Cn]{g͛[pS( cZ|4Unx^Ľc[]`K{O*)A3:` `u3fؠ1~?=MۭjTYUж-^s\=YO:NU'TtrB]\u+SY| Ϣ!3w[gYfsQ"@.\W[qx6TZyBhEH3A1b~LS.YMv:˪_%sOю2kn6것4-S3aNԣObH UYpɑ!MvavSx˓XRg2W<l~Y=Bu9chy4H0E{^m-z(rqҴhV:h0keg9pޥo!aRBs5j^Aᜎf涠 D?o/JޅOg嘬V&7ޛEݝ K vݱl94TBӅ+D-R2pX,]Că q}bhHyϽ l"y^TE#xx~D"y7_ݨiD rio'G{gǍWi|SGѱM%$@Kt@ %9D[g;{^ӻGbrY3ՇoĠYb]Z @FdžvQ!Son"94"5GnB?iuڅđQm qwR?e w@䔯l(RiWBWQw)ShЊ8CA8]^)($ngq⎍$A-v@9S`7Ѓ![9Jүa<1?D|Qx; (%҄JyyA{e Qo 9&nޫWfNMt! a tv-Cv2g9UO͖l2qtױd`)K ՛wwSMqX9X(ceU)ؑp&KqFܢICF 1Ag'Ỏ{=a^{{x{B7"8BKD%b,?}5&ffaWL=ܭs$ٺ.v"\WUH5 ;u-MNU+|0~^TIHyxpvCll^D^Mqv#V9|&sGN=ĕ9;?'MR2hђ~EK¯)7*>m nu[G~9a7?07_h6Fۘ  GaQS$Y{~#q"&z ~F^u3ByHFk};!^N3ov/s5+UJMV(XZ'۩ֿ%?α8j5ԾKU.G׉WUuI-k4c!E;$>T9( ]_q|馸5o~H'3;ml78>.ԏ_ $ц<(I G}K_jƛš|Dk"Mf[wcDf|Cf<jN8w1Wh"ƐQ?H0}^ܶ\AƈȦET%3Η8\0F#ߴV(.GAR<@۷bKɖ+3#IK[[[[%CHwקHǬYy,A{n,.apM -C[fOdUUb%"bJ-} `Q%#-,w_R3OFJY_%{C7J>}$+[K1@hr|h|s]J~|0xBMQr aT"(i76Z%i.[:PO}b֬{? ;<Фg6M[LEɆzxtjˏNq/4$0~/2K2eqm3rp!2 L: J:M#-cMݤ!sg .;@h`8|$w5zK B`~Q Te\| !~ӉD%iT~}Dqt$kIuZE2KwwmLo*Qjp~"!YtDΨžT^Zn(=5 ;pv1ޗ[ ͬ&d uhͬO#&r\tXqdl v Ϊc5gJ馾 -n. Yls =S>g:ϩۗ!1/,0PY+!VuxX~…h{IDǿ ?I:'-/sf9ҕ5_”n}VA φjR{?T'xBhP˞BsqbK8{^¦ncR#-d2dAkR Uud|IEhB9?$zZѱQfAI!Y6V3'm5j1=/ey2^դj!;u$뮉{ ay*JxmoLNQx& یB0~}*gIFzE2v 9!\p"w)^PԆ\c fYL@iBb!>9~xB2kkswg$KLL>[lfbہ:B9Ǖ)4LziX[#_3s];bsq͍7H_Wqb/e b%42td*ɶ y&#qJhZJ^ p:N֫ FR?HZǷ[fRP>A [ެҵ估iQ$묿,Ң>e0`yGLNT d3pQ#~{s;(%J(-H2!>@ OԊ#mDǽ8ߣ'DMY %Ř6e7z[uyx\MOc;/bm=/uI"Ix o}0_[*$րFDݦ]"DU]7!ْU#(_o[]_]њAg Y!?0N^~)ߴMп.&v3=un^|b44&:4εAKᴬO6?awn.xf#il͎M| &/HiX,c(IWlH9t&K#3Etj6I SHtVujkhR@F4|gSViNv#NۮSTܟ\sUP-b*MQW4?꯱lftny=omv%`} .6HN/ 垟qZQZ14yѯje/l0r5Y tƗ6 hy|"rA(D3QqV bv8*T"wD9:J99a|)539ml4Rb 3:Gd|IY 1b2zwQHWbjT'Keǐ1̦ -ZQgMp e[hH}Co'w6♹np<4\A,=~kd UOJqoYp`p9ـ(lTe! 4'H4f0T!1q%5˧ov>DK^PYlL%IllW##9tk0ЎSm{Z6xBA6_#st 2]` "",qII^,hk؟:DcJk0ggbbn,ٜ|8O%\47~j xGNM 3+u_Qz@hRqUGQU'` F;01K;CZ4\E0Jn^]Fũ_\8(aߏdG`an6`oc ŭ&\!iEgfw.^2NWݳm;@pY![RGrGAd ;4jL/g9<П7Gy/dˬ*eQ.-CGx(8~yI #'͐hm E6Bw{?aekw,s1im#xއzQ#=^9uyPmm\| [ߋQnOQH·:` dx_5z%MB[no?Jr$$kD1tǣSdE;^~XY˰̵NqC~OaMjAsJw#xП(|o!rH ~D5(q?HŜ:Jfw myu䄚S\#d_w&^}$8cNO? k,1bCO_)/u5P]$*?Ѹ!Y mk[nI fn,W ]-Zv^&@$!Q~ɬ $%-wGO_D* uͪ9)4{0B OmH'ݬڑ '+c(1ZPSv',]t{ӌJZ֝ɰd^jFud#W,M= LWc.]J̻?SbLzc[ =ۙG FQ}&Y8o@݅J4OWlhҾArf^ RɃh3nh/G6/ nC͛z4/W_.2+SZ|m&ڑ Gi=po/1x;F/W_=W:k͏,H :G+jBacD`{MרZ&dv~Zq#,Ʊ71j8{'-[l*~'T8wjЃ~y:dJhтqT š5g MvOV xXNϡVY"A[Lb㔭Y囇rm9Ki`xaOpnAǘPz[8| rq\\kn*MIyFf ncx+TxڏyМ7Ɖŝ"FZR e>u>(ffك諭GůYi~KhEGΎvw^qNʃ2x*>J!ޛN/m+nوr+T" q#5;d̽ B  {η Ul7%C%G%A ,UGHA4}LlQa lTlqh|A*/Q*Z*3MM͖1wtѲKX^]_cF絕I=j9>l=I1@Vydg;-{7U2K?c#TZwS)g\4P^9r7먦ҟ=4]п=Bw|\fcTkN%4nÓBNv?DY1%#k¥39=@L,ڛa}@+fJǫ/@dz(žDvr&ԠQWugbM6qxnHպՈ=C?Q_F#! ey^p=``w.H8ڌrѧeݻ1;뫰ڴt' rD=хpNCG#j-!F'.џ* 0#1f8Ki>;:hs܏[#Rچ{燻4TL/޽xmSkOT Re/$l+؃tSުuFNu.F13'v37+%AK1Y1Ba`"tHZ٦QリCZ)ӾjK:G,hRoQOGϏ}ԅ ,М¡M}ZͼBM1J࣋g3քڦ%][5wvh|V¡v1fA^ͮMa֡b:/wRh?&*hJ_!+՝fta&%Ys9*CuD-Q8<^8.oBwzvOE/X@o~.Kf-}M8UB5-K϶M82J!걎W7 kѩGcpMgSDw3"u>͚'gPGGzE 9X)M'*gΒ\oAEl!i/IAzOhRB 3b@uʻMI7,nSE0a( (spG #^ܸq%(wW,5i_\Cne`ދx[>jáf8CFB;_V;ce|2ZXRIXUd7d4bIQ\]˜YJx(T*KXQ)@ ?jr+IJF5o6C) #pZm~C7š!fhTJ+,2<7qً'|(#\~Oe1T7* 2sIVg3?~ ]Ů&.*Dnboh96nP&:o~|}\oV(tD(/+6w#Pg7>N┷.`[wvHi398=7S sSGafSDJ>O&syrJ4أ<3؎(/ݨ~ } y`yXUhF[:zjz>(6$ҀзѠ#ޝ"Fb/7FcjR(ɚ R7~҈Ѣv)ٗ`9:sO7AgnD㧏 OR{,,'&c*-BZR{Z@q9e>sVc G xzT88a|ÿ/>O2Ek 0MI$PdV䖂s$/\H <*q[&Wei^N~HMW".L_ucrE*L̟!%~';x.[*`!i]!zu8Ɯb_]V2=MueYĵEE5oV Ya6+f٬0?{m]ah} 5(W[`Xl`P-)se&%Ûyx3o0wZud7& .E w[؜Fgy*8p?0揽/=!r[I!)>kJ6* N`S4NbƅDšDMj,%iD4Јny?r)cDf%2]d3?oO*ddOi!K'␻~x^{vyvG KtO t[mVݲW'o_9s'U(Ẑ t )":?Q!TņÿAsd6Y'aSXgd_mr)xcKϕ˗˯QlacChLR2uz/5wPc@H8: ?,y^Jђr!|Q)k2!vPE2j$YF}L9;^)`佷t4d öFQseλ- i0}ըcњMjŴ/h S>Cg "(kS YXd}yjzs8oŎUxA GM8KV}brCZ'-歌@KΞw;oyM}#ҏ'l^!OTU=TVIҒ6yݦxұjNs: "nkZ^?@'-Ct.V{2rȆ|i)1x P23Zu,,{&h鼦q>됞S1=-g-d9xɀ1,M G.e-/q_Q$aTVX#v cǃqz6yl]2: .fpl1X!zN~D!3bpNMN?)aFUUf&c~̛KKN?p94$Ers67FfdqALC(`0 @|Is>u 6nnpވiɎf-I/DحkQKYMhY]vEƑB0^Bcx:jOA\]O#Kk'm9_V2P;#*ʫԃo^)hS99YT 몥/4%7dh5Rjm %68~ygd_ }*iXWY+Q]*ykl8&+*9)?d[/6 pBdPOLOHfY2W4ysEa+TdSl&Or @v^E~#2HF1ݣwVrCg@( ~k{[Ψ iF ơ.-`&= ؙ36!Zl nzڣ "[D_YX78hglQ$Sh(s9 @rrwNLp$qu)=iz)FnS+gQm>- i\%xVw~0i3/I'~p&7I'T(k;C)t}2 1N302 }e?pڻPq^Fڒ Zܪ`b9\& !l+9Do=88K!R83axq>,Y# CGkefP( x9iG̑EjJ[,,d%Zw0jD@61k~_sy5?G€?ŭɜ38k8 58Rz l(5uĔN!POBuKZN(FZ@b9#E^a3^ub8ɥAT %"8}qT!c1e (R1`Z&Ϛ>pz.!p9CBOA 9Ȧ3-g}]57]~cpϢwDݢ׺&ͨx},[T?&Xdk9tN%>/zWܚiWуUd02uV3c}^䴑ԟlq+]R45DRMb WH9:B᪒L2YCF-o=Itr{ ӜPQ1^)͌k8jgNB>\~b"?Aqfy1/7a^%ҥIX =櫢VN?,j dB-Sk7-႓B LՀϨ6f>Sc삒!%ǻߘr S!,Q( "izw 6l(c`էLu(.1Mn_>_Y>TH>.$7g4e@->/_ */+MEjh.0&4hϜ ; kYYD[%3OаT>H*!C6ȤaUF7g:+&ҡ}omcY0x]hwm-:RA,+-LS̪lI @I/#&.jzZ{ch骬mgDZ$<%'~z@qT9aLʹ@Ao{ּcWD=HrZbDʊ g=D} '^雸C~s{{Ppy ۰>1+=7#y?NOLv9jJ Ff } 2  DN͆~'KR(*yBcyԥђef(0( к  9C ?uWfwWP_Br=*iq,kyI3n>N5j1 4fRe%V Deaw ̟bэ1myXhtΛ4+LQ@ /hdb 'SDbn㶺ٿm;M/޳eF6AYA2z2>p o]8o P|8 LIkmH5v#r&^DeBKiDN0[Ө^G ?Z 4Lq"\ΠYnyGpRF9li1b 3lLH _`R"N8hZe:@bBLa}pbj,>n1#8,˲iFY:ٌ ,m(D,4ۚēp8+Qo9bzέ^u6A彝(Y8kݗ Z 3YeF`m_"I"Wz[5pN>d猧طYd*|#TD]瘩!Tb%)iF'/'s3#J!Q$0[bu< M1XVFh)N Q&r>ȳJknEJӯ4~ed‚m؝"%^30e 6k$ (c2 MG m0or"c[,xfX4vN·4o&0,LNjPJfO-&]^AI`(ab(xJ"v>I`:,^^ME}Ps !]&d#[ۦmiM_ }A[ڼOWrZ-Z#dׯ'K[} {[?Άj;o)_OW MHz|xss9ζM.phe}a0 7 m=5/2`9PӚ~6".#&X֠Ul5EHzZlTiG4 Iu1 wF406p؆TTs]QT\ yׅ vB>XoU &uUa<ރ$Cqh/Jwt܁ z'|p&nnEJ|6 48`vW_랑BsHmvМw\1:ΜKTNRhyeݝ_7XO:g #Ic+w'KB藘QFD]/GGnC7usjڬ3q+9KaOZs|ܐ<}RĞ=sM â@2ڗ2 [/U6Jĉ)\zZ/ ){hC}|mu/cbۃ_ =SZ.{mKd"^O|p|q3&5)hK2agHm);ҧ\FSk[m[UD5grxp8݀Lyy Fd#LxPgԣ "1& Ր9]HŒ6ejHC &ssV'\P#O|,_o/=g(JON'p"R,|EP!4g -M#ؔdŒbжU:ŤSTJ8=F9cJ{ 7ͷŊ5`ғ%r0d:brVTV*a>+*)D٤Leb arHj$GNw18gjY4tr(_׊$ ž _/N#<_xbc/3tgHuzllǣn֝dl]}W+λROwvo)o+i&@ [*=`G0zz -lJQ VA d6-]A(8)N3/~{'+q))6<} ~)Ӑ zg<נ~=ɿg%)@8f@hQF? g ~?l,l\H!X8 zL0.ˑaB:&m'ROĀY \HHآ\c"OL؄|?iQwhfE~ x)qI,$*/:Ls"?œ&cй+"`ɳ| Ŷsp{r?fy?ՌUYy('8uˋs\L 2`uP^"^76$0t)ѐ0sVIY??jnPP;P%X-xoO!Xy S63^I]eŖ;s\G[湏x}:$Ih/)v4 :" Kp$wŏ{%1(o["7474 ќ՛i9TO_$mtSrD8uM[y/ c [Egյ.lZYpcx͌x}KFw([1geY^oZgdQ+}=Hb˖:u3wV{2Ft@h*ں'67bu_2V rymXӢY!// |k:ςE[*2D;/U+ô|q_1VArd1J4,ᛥ{-a jXgz7adHW7:gD$}sѥgS-3C2S6dfkfB|zE`wIaiRc)ْ5 I=^MG8ALEKRCDSSSÔވ]fh`>[gI/Ib/i6&c/G~;3O@ x2o1֚u-? 5ql$yz&"m !4, :v 4EbVաnJ[TV,n|MkyefY8숚nP4GLLk'-o` Z;iC*SX_Ҟ\Cc5aw0L)΀~v6m Ֆ4UVGAс@5LŎS}D lZv*]!5O۩ALŬ7!|gm5rB5Gv_'Ib'6jFpp LCMtS$?Ą>-?&ܾi)(BfZE|O^i\NGJBМ9C TXA/i>ZN9 D)ZC1VcNnDf`-ĕA=1=ŋK )rNr;NU+!]Y72ꡛQN}5ܔD( >~<_`&%Et< -fx:L4@oduĊ{(D0ц|%^\[׹8کӾE h"o1~f$$mA~؅G;},oWo>|\p,+kM1Cl\ 7MBF>7~$(GnkXA6 3{:y&4,Me͆sK@q/.Bv~Lmzx_Ei63{M>Oie_Kor:NIu"]lGx\ŤpAW?l8_Z<۵bƖ桞i-iR@Ur!U7 o5!Bpֽ4྾S-XtkkiI./]Ku-o8} k{j"{#`wycc S4N72C1aU&ŽC0d5{+j6(4Nn,:QMbJ%ʚҎl/ڂ ⼮ :e*’!lNyMԬt AD_HՊ |8K,ΰs.wR5Ŵ,Nּ>&.(FF&ʻQ-n.mm 9T4}F56!k60 ?$ӥJIˠKhBmة]گڤNORB^hlr>%ܰ{%l%Yz@?W99Ye) 7[Г#+#;U}ҔE!o|Ri(ã>>;ƴҦjʾD7M`#+X,2Ms,X~?]k2W61!e'7 rg9ˌ~?NJ,}!v Va$?yJZ\5P0^UQ,.=70RfTs}ouI7Ed]نoM9c6|j2Euc4`m>\ʵ7U[}1:QPg*0.b@좮R,vixh gN꾩.H0M>Qo>=LgT*4aZgfcNdb>1dT gbOS5WP9̒Lě,f}3 ?Ke3.Samc`7߽yuZnq}fk Ջ#"{_E[(Q6ڻm Mz*JLZbr.|Bw38af b#u4e>l06z} Fޖ}~zQc|/ TH88;@1N[-ET7S؛pHR@L8jV<'*HtrVȷVumX.)!"tZQXphwNfGjE^ryg,Ng xLn{'y@ 0CWun]lOLAHq)zh+BDyd*8,Uk{7o@[;L=+Rx)RwY濟h0I0i;Iy?0eDB~jፒ$f IaJoenz4޺E<_=`sz#kꇬE[ ^!nÁJοz7ۣ( _i y35l# !+i?OKT `~ppzc]c H$TؼHcdLw( {g0Mhd3RRe~cxLK4{Trvm3 rlJeE.]nX+.mL)j L7og>YzVV&"p`G>mV`,H Y}>Du~/Fڴq5Y¥@- 뒬-TAZ<8|UƐ^A1y0Hֿ_,˲:(@{ou9s,}7= x-T4U$~/V6xipzMXEfċ`/IyVSz8 d3Nlj&nMJjR0Z$ 18{XvTDmf))Cח1== Rh2+:+E o_8ocB1S/%;EA]B4m1N0zx?%j=zod)@ch$"_m)H@ >9SHltڛ3rl^x 2AI b_ew),)E-НA v Ś$N>fo1aT5>mN =A|i6OÊ Q0$  Vwbq{ttOٰ`RI[D@lJr^EīU#c&D壪d5v%5%s& ,qvF6*Jw v 5j"VTpSf☊AtgczjirH5Ov GGf)2#NO9>E@Ya#RKwLGI v䕎[)(#2 zwN諰=bxJy(Vu:%xi⬥['sPqΐTi [/i8QnnGc~cy9il$TUmdt;(f}9f-C4#NY"/#x_٦ÙhȻ%p[X805lv*KȜosO]l[q#)^ KfOe,kfM3(c!S}qd.Td˜\ēz$.栁kɅ1l /*:9,U~j>k۾i=pFK ?$RΨ :ZIc[1hS>9MCkzqZN4Na]Y 4;ɒJ}'|I$$BOX%Bc.x(F4l]<'|c[K~ LYfg3!:Af`ڏa΋қ^e2xسLllQjhs6Z*)/dx4T}|%V6VJz_`eoc0#%DHX"!sD!Eʟ yEŦi$nsG2 Wo2_D^gJoD (xńIJSBcFcN&h :z0i*&AAr5 Y-j]JE^5"ߨ!Ҍ9-U\_nc8de $HN~3WxX\ie[|PP$FA8 '+h{H6)GK9'CC5&D-q[r{BE N䤽Նuk bc̕^vO)O-R 9;kRbqpJi@^F-T$j1V.NA`se[Uay/0O-Xd-[Nwp,ޜXh!ߎ@ 5ͺ7+s(`E7 ˷gMIdgKm'+n]Qޘ=a⼜/:Έ\,BVJ;tNaט '5 {`&e'yOVf/8qE& PX.Ԃ|H=tb>Hx&SEqkVrO{O4`a~Ύ6Gܶn%QzԲ1 c]v5rry1 E()ܔ !Jƕ&Iiɕx\6XXV *CH>yZ=(CR 3P#G3]D czT,_!:dc}DxԻ$ga7\M~'9m}Yp"<.-lf׮wۄFXrpZ4ԲG&$iT[Q0 H-s ॐtu;$3u$EoqQ@4s`2=ϓ ވB{UޣzbX Z /L'|eX"SN!g[ ^ ҅ aLB@NJOʆhnLW: .:*)g  =pϨn,6FObo̳<ƀr"f,bAH#Mijf5Dfq}A7 U O}q~<f28,d]:!'MPs#z(OpzqtA,8U&%<# 9rFh;. p)2:~ hx(]4!R6-,7x@o ޼f,=bFg2qTT?FYr n3u$4h=MgHl!"J6L̅ 갻pWLK{YgVn>.G"!ZR3?2AED3 & --ϯڧȝXb :)=M  2=M8Aj:Βn8`H~u2B>AbVD^ w v&BOc²'|lpbtJƐ{+c;TΛy޽3Sj\H]kR"x vض2i0_QX/fA16n_8v,AX3UIҽP<2dX4..ڣ?>jHGHwL؄JV65:h5`S}kNg]_!a,{+)bD Յbd]`cLa7:I|f\5=4Hf3vtѬ2K07I{=9xj!qƪt S^̅άKM`wկ)6n6j'UYUg]s:N)$>m DY~yu&ʄ [?K Ck] e E2K>-ue7iun;4xK#9 gDl}S\LGmV}t%)xÈA5ɲlJ[N'Q/jKiV/m^9L{6%L^vUigȓd/1QlUnC<2,9$ϼǒ=uHZ.Fe9ove䎭6&B@> ͢W-Zqh`!/-,^֏6wJxgaZ 2!|5kH;B~4#ҕZ[^2%* Nc<tOpp&V2{EZQ }e}vf4F?p(o+_EfІ~Nč3ڄ:sm$Δ=xVkC: =oU~WaY:@܀}yI$pg G6>CkXFt?|HbOW"((6<翤0M{0@`x0rm+ciW1[ĦAJ3k}9=9_; 3N6.Lgɩ3@MZ04(`<~/癈PNߢ:7\`&g<]AHQb?~t:tksIJ + ē D7xΤT1Z]>EWޱB'gYsu3>¢`tS>'Q1c͌ĹV\t"}Q:sE}K} RƝ}ϫ>6mfpx*eY>Q-0`#xl&ͣs:?7%IYSK\^r!mtF to9ܳ.C<F̳Ilzjy!sSe3lH YtR 9z~1Ej߭5Ii҉_3zͬYnM}zcԼaOjnuV17`oI<*"*T[Ӌ1S|Lb/;[20&۳e[!eg2DFӛ4'>.r"|+B}wQ6=E3Eavc{Gw.sQ(nCEpRczi/;v{{O{/5˷ӧ(`Gb9]lz-,Il(-ĺvAUޱCsw< +JmD6t4(o){moye8m9ډewwWF cЉ(`y7sc\a{zlxTIœF h87P[$W 2UpmFILvNg/7ﮎoHE[V̴7>PF󏃳/ H ׊ .˚B@8po!n:i?4 nԏТWb*lxϐB,Ŧ-vDd.%嶳n i\࿛jTHac؁󰶳Oě́t8L0ygBoF*[,"{ב3K> .F6g'gO0 R& gTb0JQ9`^@axq%'$G}! |L4vpk9!l̞WY>Js~܆ͱ#4i"c]w4L B7b+,j_f=/)o:&⯉$pH 9Ft. ۾K>mߝ"v **efZi+0/21pb~l=jU+Yt1GȯVS`TCũ1"(qvm!ۄ듮7E-aqS ^%bz. tgy` ^G0c͛v f<}`Krz&c뢎zvB{kUOڽM!6[%O}لs'rQ KZ()NW6\ogH녢,[& &TC O@wyx$&%L"L=dN4l) IЌ{Ta% !{{vrn I2}/+`b9ewhFiBYN"iJǖVnp_&&*[}ivf '{ȔnwР]S'?%3/ ;ځOOqQ؏2K[8ًQAzoޓ\v-REbG1n}c3D7Oiv x{˅o׸NP2l25=1BKZ SJat ]!+dC h[Lָc^8 ~A-}68z5 ~lpyҡm|=UA)gx;*:\mZTJAʙAA%αf'^aql @Ug.^֮lkH!NàME(mj~^WKjω\KWJj5[@J(41 hEfe%~USaC[VDBBkɒ\Ngq"=m^c OT2QZCB;DbVBmhe\"h6jl$Lc/]sIu'!0S"lse7ep)ȰJ,k@&4#0# CȫO$0xa]}j CAuib] d.S՟_>m3*(^!e$>mxM?6O6Uy `q;Km2Qxi |[9spf ¸( If3pohv$K?Av6 Y{nRH\z_[N.;oƱNC_}q)fyըHB6:~sҥI o y/Zpv}{ KIrE/${2Ϛ_lQh//hNm13``I.LSsy@+,@aW5KH-1!E,"&Dh0L~suջ+CskUm~+n {3)?pHmrEzLp KpdY(yN)XRb&Al:J`}ˆ}?7E#a59z BaJtLo_e9IRwuXaBD(q'J LPJCCs"zl]Oh: Op70-z⁍*~kmcE<=d`f7 { eUaiݪxY(H*@ b, ':V17reprr6 t;G4:cjԍ\Tao]4< MRs$.ilV KC\7|⦬$76ɇo1OG1P F~y VVѪitqV|et첗HL%9<o -a_ibVz?Ey7GX?o[AMgM>&p]PK`ZQN8;<4u:]s^:!gBd^f6!,O+PA[7"G>ѪCl~"^Db9.|D,Sc wxK8'k.*5ûSʆD*\ś|p6VhYN*MP46^͌R \-衋Fž>;#AM5%%Zf}ϿK"*iټnxAQZ2kP |N5$zr{aBsTCx!X*jO lWC@]/Ѝa|,d%=0;Eb00t[oo6KFq;얪6/V>`wy@x\DhHî,c?ٻUIiR#~W!i&4UNceŌsM UwsWg/8noo&S@+,5Uv*4KX1Ck_gg:WC YNhƤ KkyX1Q!c},|i}6 i$3$I0ل279C*2HA{Q8ZpA2-jwQwr_-'_\^"~pXB0 ^ګeNl{l?@E':sth9$C2iSr`!Q4$7;BI!5=utd".M. Š] 9P nN/}kGI14-eޔycg4` Y0MQCq4"?mF.`~i`'OÜ}ir1tC*w&68w-nC?#F!K0!#I־$":e efʱe;?B^;-0\cO<4 #S_Ko38M1z/rjP@o7W[餈8cm]=EHI<S֊Y@,W.W nż)-=EӂED yt699DSTJI{Т"V:GE X6qI 0@QlC*]UȦl#Sް9# bLcTp,xRx낄,IF} [wV8)Өǡyuoedg1S~e;Я\w֞LpG$j0ϣ~.mGXrˉ"N =}Oe ^b4=#E)}mkB0KRR_V$=e,3gC#ϺiK ![wWg'ۃ-Ka<1 " O_} ^hϺM>8Ѻ\a`$vy4M$(G]mNzoGd18?lt5K)> {I7oVyc'oS'v }SMam":YZY KJfM`kF}_N<v '?#-μ~~:N^ ppܟ[=L},y|h H* B%ty1'+Dž(f>R6X@ l>ׇMmCk/?EvYxTn<nsڭje+`622 }a(Y]/G}Qe8AOjьUazao{jtЇgF4i)ĥe@V$3,A  Ő f ]ڗ,N(Y sރ,V7/-QZkqt4l͆%mRf)'Or|%@XD>wADS&X}gJ&u'fͯZOdžCxKD{N@'M/wt/ |ɏTA 8[DcU xYh[.3,xr#a%[3ONQ6~ nqnɲ8X2<yRJy!q69pc {x0Ǔ#rG &J4d"FVx~92(Ex$X hG]-G,%Z /2Fwy ۼֱ,{O|{~Scu ʴf[c`+"!IFls4" J w;Z*^pp%Ue:>|tkpVBT^Bm+Y6K#Bb7 ^gfwE\4M4V!(=Woi m}amad(>`*<{mٷ7qJP RΗa8XY/zO on "$.ۧ3^,ma0Xzش)~]}gC<9pB^~4Q-pO#+SD~֤> 8APdԘ eu!;\VKMBl߽T[i/V $vőI¹uUOaA|\7I?ˆ|وp** 4jrI5;լ^гr͢HxA5雼 oDeKd8c܋y ,d63A R_Y+tz̕&Sx t6"40lON:t܆]),'Y`).Xy>"shl='ЙhVY: lk$77n.SCT5釞g+5΁}OW}/4C2~;rO/~7&Ƶ _n\~Xn뜟u,V5ǟe&1T^2a_;?w;mAТEQu[!lf'+A=_\Wsӡ3,[+/˼T{U]q_(DbE fe0+6zWٰyUId̑p+jdq,Thv*T]cW(6+ ?jh ſJ~b<Oa$P5]"}9#!\5Cl-b,@L-Zdi8Jrvh:&\[ڗ4L2ry%56Lny"YՏCiG]Gd4LjdV67&3\|Ed3B9n@T!!- VmޖD:A`8-. "z@ 079@.|'өF FAͷŀ0!{]ic-!0@۴2M6⫳kY$6xd块Z촿z̋#iԹBnzU7KBMPӚx>G/:h?aޚMb޸yccɲ(d&lVr@ҩe8qbәԼ[-Vm Pդ|llUIF ws q9vf)&DvEmm|H[ MM ^ $ ZxY|LK:{Z= &%ɦw:sik^ؔ/jjtkBC fGc9+@yb9xc !P*[%}; 0'|N!.|0\҇ _Io16ߦF16"ԓm§/VWuӨ,!Hdqg%S Na* I`lW(&9Q!\hء9-,ƅ0nBi_ FN^4obrFřڠ喉SU-;XcT i b.{%M0P7H]·'~(恉e x i.`Ƌ$8Bf)|"Dp#lmO!Ij3Ӫ܅/ -K&fYO'ςn{ܯ"}D'ڷϪ)"!KQ# ݛY?܌9K 7V)[QX4W .]3pZt5Uas^:)Ϻz:I,QGj xg9-JUWz3F\7IjHZwzqibܰ ؽrm ynK y;:>;v ʤ]#4~ēHrˣρS 4/B}{{l]wF`sReArŠQ)tm!m Ko`y+Q8SV$)or-.w(] 'A;^mӬco$L݃~-\9B<*gPqoNKM Su{|1dgb.wޑΧ4+i=4Y ,arj5_1> p"8#*agmJ)#7yE-x<]P7みe$7a1Vӄ{*?X uS'_ܼOo;U N(mD2jś,|wO+Y326eS}%$#j@k܅`H?]L*> O<<\v螷>,t~Іv S,n4ewK3VHd׻G W!9.mVa 5gxKcfEI ^j<4wώg¿,lRDQ&'VPXMw~gbY6C&0i (Hkx= DRj"9mMp'IX6si5 kGcЦ=[:$ /ڪX gb\_p3~ǩ\y$W;hk:pgzb89؈rێoplBzPq0fۅ-nj_[>~>;n$cC$ ,EBd"%\$ _]a#?Ž?~ђ?+0 -5W\>nLlZT'?'"Ӏ{`d Kdgl;Nx&%[|U"I|TmgT1u FQc1zon73|]@n^/ c av~C0 %8˩5 9*ZQ오~JPSM4rX2v*sK ؿh*tq}5K 0r+ Zۈ`1㿭> -Ab;yFK⼶~V]ngo[rҶOuC7;ђoܰ @erO Ju/GJV|dy )do={s.%MpgkI"qOj5teqvUkVo:qLn ˎI4=X( 괷= ȊbRr W$ ?.L Wj` SG[ˑq2Ar}#d.?ϭ0 fYYwa 7n Xx E F[>v ᮵~8=Q\T :@?e4VHD=ywܖ&U/\S͆ZCV\mo1tRqUEbN-!S ()Øjxg񅻶%p<+bcg@9tf<e7Fzۋ1*e Uwem;ӓ LI5?U`dOIгl:Ofj@՚Y7,U( lW x;? yDE;Xk(R*|˵X犲>r|0DDÈ*7x@B@VE7J0Kǫ*y9hNBmSv秷ތ ]`s)Q\YW}g%T8(̇}rO~ZJ$ :L| v>S'+y*@ l R(~.Jus%<$m:kM`q@M-hz, ZyJMkGtVj&2h6,<1^bAx;+łTE1+x$i D6lij:0uwD9ٌ#FM9F~6N oz [0!"#iJ%YrB{ SR{LagT$Li&PG&FI- f?Xv]A$NG5|!MÃU(+Pd[PSA~W %q+tVwJ^d , ]T;!*G3e`,H-Cm+Ūǩ,&6s.Vu+x Ae;wxۭ/o;W]Hg89dˡCzDyNNX)U=TEE@ɧXxa©uL]q}k53"8p!2ZEk_yFjp8 _|m[A<0싮חçW\x ͔[}a;.f|4G,aI\8}}< P^ӯtUX7@?<櫓%4#2Κu-GK6`bѰi83 !Fi%;m& ۤ qqGI_9Ce3VK!srosV};Q,!Hop0dQ;Y jGm|ƏUUSsȤK^>XxT[C=)FQڿkw-veK$!` Ԏ|g\Qha_x a[!%~;\O) ŷ4o1i&7o; 9 +%NIX7ܫ݂%WKKY>UȺ -#^u3myCjy!hFIH`"BAx?0e2`K)+“apCXzG,~uݛ' DpFH[08&y繿j]\Y'H_`ȉS P3E$"$Ib˧A5V鋗K{"B3BdM qTGe9XjjFqk~ ]KN:XpaXbk3 Πi̺u)m6bٵL=WSQwE@&'ՕHVtU3Uƀ7Y ۠H4^g &$d_ED9њ?'Vxdv!|1C]TwIcif18. կA9#=BeD\"T2_ ˻Q=S4}5K -V1~b`\H^foĘ{_S{?oqg}d, 44_ѽ j8Iwl wZk7;ǘNLecHSwi`Xel &/О$ġABGhea! Gr181|H#%ڗ&AD^f,,, hU#+blFYꙸ$azBDgeՀq x&\bXxTJ9VJ&5u6 njN4 N_]bwfY DCGE+8M|{ܾQxMXWq!{3!ieȲA$w0W17J n0D9Ŧ~j5sHu+9DO|,[^kx4^݅r%3DZvyV @:5yɣ>!_. Ս8YQmnڢg _N_cfn&t`K}S 1b;47Ќ-Y}B^2":DoYPYn|I` h_'vCE4H]*Ǹ@%Es7!m0ntTGT`7Gssjj#m_K" A'HQdJB2-;tpϝrKKǶgmWt|?(0*xɎ(N _J$8Kg'P{rNsM"T1vyT*ǿ=nȴ7}Rx2ȉ( sb;Yr\b۵I"56LLJ*Z3 zWp m򍲸S6a6WKWU@6!|a3T"xQ AbyVAOBe*2ۋhh]|zsrYaHs, lОGSm*AJ95oЕH+Xзl= 3ӣ'~&KE-ĭC<``]LZilH;܅vE~誛 8=*H4aitqؤ3ϬՓzS1V+dT4-i&gS5 O +'HX('M9'os0K'8ݦ8WT$UA($IJ:1~RA@ּ;G܂ALD[ 6ޯM ad5(!OR} Un10n4ϸjg:9**Y2Un`8^/ThN!k(TYXALG*zq0AȎu> w]Ȁ]&c`(s֔?1-׼IАrb|.}d;LdX E(pM+Xj a& u*5EGT>+$K'`Gײb>reY\78&&/,B@|Wq:u6;*AuHlJV"$^?&y#VCꞪAZ-KAoM%Gpx/G`C~3Y߶T,"‡B~1iisB(t_ZX:{/ YIoUϢ%3>_SSG:~x$^?ќ!-?G3<6Ү&Ϛ3KKBfVꭂ|,=_`RZO{T6 aN݀QzP@}5@tsV?-3wtN}1Z88/>\Iq܏V6  ܬqOV*HJ s4<[gyg!a1m6./ן5A1aUÞ܆'|[#&4cX&cuN!zý]ٿFɸ,W2j`\66Bg=qD'qLx]𝕐LGX@fD8a1D*crO]&z+[ R0xwXnjBMSOL_=w#gynXξd) t (2H3@u2[Mnip;6S2buuM"m`Jr¶ vM 헆Ҏd7n07:9|/x<]_' 6g֙P F ^f2mmە: 2!:*PaL8m˳Y_[l{NrZI8qg !2% @9j4#2mnsDyƁKJn{EpڝLI[xyo3c,n@;5Yl ŋ?|5D> 傡Sj ,`yi0&ڼyzn_8w+KdaJZC@IUx-EmZJ/(\SnUs16@_;+LfG҆_: YuHf$*ZmM/aA|apT(4L8HQǫ`0=a(B!+xz1Q\d=}h^V|㣏 itePVmmt05kE gQL do^?*I(`:kJ5u:Ѭ[k($-c  ޱצj#peױh htYn9Ok ާ߱FYJ[LE*ZIdSڱVIxZXPӄ/NM& )C [)3 jks\eŀC8.0~@=qIjK*LI27E\DߌA<l=钅gqoH(XԩۆA;F'қ&h)Z8o \ds#]܃JRLIv_5yk2_*&FP]-U(@PQ$)@q,>D٤08< CP|JD \Ů"P85Oz!c<]ey /p˿L - )^3 rr%=,[/um3=CC] $K?f3pgM/OlxO٩y6 : sj}w.lAK4@3CԷ&DSH_ˬl!4aIL "sVvXAKt^Jph+Eq!+tboN\t)lpV016 ^&HO+ y.Mx\]8KA* [)hgχA!R!WgNP>$=x&y쟐\'3.Jg ݸK2tvIPc{ƹB4Q<ųTƯgS.f=&MqցIJ6!yN?&-()SqG vEшHϊOD:/N:AiŅy :cǤ!@M]Hc~|աÖǾ~ۮ1,\H#Qt~ʨ(*fE'th=:p䀇2`ezLjV9h<dc,i&Ds5jl~n1} h3_EI<(F<}ޘҦ8Gb%z>=>I"|ܙܣ7+v׽g(N81wcڎ.fǜ<-b$?Ј*ƤƓVo䔶ZdU202ykUOݫ<.?6t}%iS:|Bl5;SDMW:Fߴ!. o?3Aڈa8]K꾞'4N2Ϸa>O?̝hL2-:B{Nk"!M`B}(O8ophf*j|Zs)ҥH~~ FsXϏ>;g Ca?xy5OOUF&c?{4۸HWn[I?M: ]mtxN7 >/n C-[c\&&(RW!g2Z/=yLY'Xq6둸=l~i+pÌ1!mB~[S!:v'"FIͣ88c$!!A+y.'̨K61I 1&vc@d⊗uX甤~ux]cQQQ-i* #Gݬ?7K5JVq nKĞNUݗ3J%w#}5F q l=\Grg<k9R1.=IZ.{܆9Ht %VNp!f+w894y~ 8YMz׷NDpOt;V)9$upNT9[Hq?j'Y $/ކi5TJ"pD3SDB,hsȈ5OG[F}ZwwTb):H5ǁҠrqXn"E?BP,ъ귁kWՓ\ؤ ${ywY5ZH~Yg7+F.UT-igwʼƿSyka.nѯ$;UØUb"<$W~Vֿ6k0NykJjpvr hsvPؤ蓸s|쮿G2N~~_~ mbow!-IQfL`vv<,+y3Mmp0oO<,:1| Y-o ^ϗ1W{F~J7NӖjTd.i#3q/$1 YڝH.T[Naÿ:U) ;6м82]6Ȓ~࿊sgmxNF5̯#-a*z4>m.cM tِd/fSkND\hQU"j SXHgπ#6Yr]Q F֒%fTad$ Kޗ.`4S*7J!iYTI,g*0v3An@6ϳ DV61,] wYX!(,3k.g42y JLj@p PE%Tټ4yv^Q Ij=elaQgQep0 )xҙJc's nȀu G}04g,e}pԝB4^$yзC +,h/M]Ae=^tGT/b?ܘu&+ h8` 1r15K#VSYiX"KnUm:/ZF05>. =Fr,a)}2ϬimǴWd{0?6 7y,?.6z_w(>հ7&acZ$[aQSOT\Ե[@nYail0Vnm ˗_Z8vY3*4cf 1+̇Bhl)= 0= J)޳2S# EygSwjnk\OV1 $n'(sInyгr, * I$d>gyoIALE#i}LS Xց j?$βDw5Q^Owiu.vҾ4\v{pTBlxi\7:iѨzc f:S=}X2{YzNijDB {a:"RĨa`^X@HfF39+'z82cUSXH5~f9s[Z=p0kZʳoG[D^g[.Z./7=P@όsP.q.l7{ m ԁQfA$ZzJ.,lPuh-ccOTвm^琐p"Sqkfe `ΦWت+' %oLJоܘt˔;'8oOR4tDMq4-[B lT@Lfl ɹSxέf,MCTǴs?6~kEIȂ^ËKgE6ĤGC^ ?"H ž7($} QrU,Vdp `G1̛*:G^4Ӵ4mMϏ\̨͢k⚤_Uf1i|^!t#B#P#DќǻEEKpȔ-l {<`ƽ![B3fQ(bi[a`WslvYpŠak=c{.Fbc ˆS $q'kν῞IYA}X꧰OAGI֚#,`M4}Yq窶o z}}_AW RBw@ cU5ĥ.tL.A16}aς5H+ VgyZ{e)ls pݶ%*'>i !JMYI 7; 3o@:gwEG NS1dbX07xN?M"0?IխNh-YfzMۺpG!hm6QT|5q)s,h `KNel/Դ?pĉ"JȓpT*+tLPqըJ6T ba'죦IaF瀳 @3CD4`bzE3dS2ޞ~|"!_epQ@V003+LրA/J]PєWOz-ZuY6vڙh_ܢc&kq{%*yA}!' ^bNР,1g6|%u{Ƣ"2at\{,":aeR0/cG 8YTE^xIIH &0;ƴ54̙[ikvit#iD-2w1V}ޮcۈ C{mT%:l?N%O[آgE/es3ľxΞBY#r=Bu)]̘10Z L6 p@~i,{|2Xl.HL:~OHO&pI EC5a0%=m " Qv N@D ='=ڂI䈨g$'}̱,8v?b՛ŷy 9^$i%4G|hQq:wI+͟"qeeȽA Щq1T?,ϟIpB󏔯'RD|0Za}x|,e훬7e&ɯuZ\0;Z1yQX^۪"Pgf=~}"KQ^f6  VSIZΈj=3MNd))D73KNz #+y|`Wٽ%vZhtܝq77ikoP W\4<!i]#Eo`çM{ꭋH@BOo?7sѺeX#5xh>Z] ` #e"PcL #S# U8mrK%8pHGMJW2WBöt^ӕuy! 0 \I45>M9`{In)Bt a͎q$B/Y~?Hօ~VL;\ܿn^A]>PJpljwIRVk hZIᶞOp ۋsU+XaiTN֪Tl$ ۖ*m<>r/0>3!bfSի߉ybVL΍L)$EU(܌aD3w:r1!<س)KAĴb›2AzZN̩\,*5Pj^z&ǝl3F\5#=$Q3py[xI ݟ%$ȐUQz,%s4N7M0ӅiȖ4WnLLMa.r%Q֥p6I#*43j \n]Q)\9!84 Ԭ4qjR9qdJ2Z="$ .60031L(^LvZbC.X˝wS*:m@Y|Y8a4d#(O04 n;dq4:X,,ZmtF0x(x34aep5dtHM 7eI Q6]e$: 1s _;1b8O4/Ԧ; ۝wo[׿lv>b/4kQ\#*D Mƾ(Vl9=}v\CtǛK*އhߐHYaL!N5CQĠC_2eAhK1" ͟<_ɊY9 X&MmE`duOn-, #R<еtл0^𸇄 RKt򬟑~C)VQ7@[/aֵG*`waڼhFM}LE&Ld0HYS;!nUFC1"b<2b螺Ճz@-je@VD-Q$߄w!ј&ӿnXL֯5Y`jɂ|yR7FK `EJ 靖VB{]= M_D%]-HKKչ9 cd&dUmMՇ}͔ c"*SYQdBv͒q|WZ8ł ҲI7 OVp:qlL<{yY1]_,Vd>[<Vd6wn6ITMdɿcia<8o_?Ⱥ-G,h՜C_mܑOC}&g>]6_2M2 Gؖw_S/cdN+Suz~J.֥HF&x{kNc4>xh9g:CA+:{jPqCL|HYqX}f=53ng! '$.)(P:%;嘙Twne4n_\y}_& dw wj_GtsW]~Q:(U]ggqtlr2'ogqOHE7/;W!a?U} [$ 2ȍ錣s,}>l U#h!B=ᆴ Z^_å`̋$NInϯ.:MȨ@ `nW4Zs$#`"mgB#XobT% 0١f?7RE2K?G{[h1Zͤ{x2xb9?ENkϗU zL rmf /yT 4>e@p0b06r P$o>l2|?()1Sn,PR!TQTmYl/ӝHȩKOGS9CBQO8v\ϋx;,M'"& ?A6g̊|wi;&tG܎oC3fªVk]>-\paXa)I,A>o()p*~B%0*b,0M*^M4 R ?O9Ly ۳5#q)YFGC׎i,#Ӥm>͈;ɑ-C"Tܭ"ۨ5SX}Q!-x"R?L5,*aoW-x<[6oG6 Lsv9o&qJ3wc~G~q+! Xy1!ރ# ]> ڽ/G HX9 |X> ]_O{<|^X踐 y6=!W{#T@ 42aN͘;%"h!]lʹiސjӠJw!jxqf=0Ja@JbI:.Ԭl`G?B]һ"RRf`4ҰG- `Sv["5B҂㮧sxG,25 H ˴mR$t҅%(E|pڦ{9H+vQ%Ӣ%"TWc]Ν}T#]X6ĩu߂G⴮~`Y?SQi@*MZaos7 ]X,pA_L5qwC%a<ϴ\&2B< @ɍ0#5 /H# hls]J`+ȇw;+p(v@[\H.ۤ(B''#z/4V x0ot353\[[Hױ#qnFNQ5| H?p@&DQpm&4󞨽;4.MXJGShc8EXLymSz&{L1WPąqBۆ>8zX&U9a7@U~B۶jVO0l=ݶ!w" %a$"9!2u4 Ԥ-\ 72: rЁ#ϑ(0TXߍS>i}G`|9uA2Ju !jIP5`c!) <)VXc̴S]RddW)kqKygc4ior{ gICŌ&kvn/T /ER7@׌i\,NXZdIgW DžhC &昧1ޜw?46BL`iY Fj`K9f3;AMx w^[E6\YzIXnT׍5+],wLV:e,l3D"mw='a `e8'/OV ~89L)L7f6Y떤&= dbvj*Lbc-} yx zr 1pqti7}F6KI`EˡO_+ul*%9l,rݜȘ/ Zwܾt7ŵ2A&_'Y%C|hJ)F7GdVlڛo/NTnnV].~4(ثW{BJWhnVR >96#qҡ3HJҦpbb/׫AkT&ɦe2~! H3g 7VLRm h" w߄Q+s<0+L.!냗tU@\{ ޣ`3s?7RoaNB $JK,Hm ?s­3igTvBRnςie1IL*#ik0ͳKJ\3g!SV  2>_CcZc=͆I7U6c^nA>%3nZod.%-DML 4EQ_{!p9XYo6xaoE#r9ō:,Y{b0R7oGoI?d0CN+f #%Kk% 6-"[r_4a|:I,TѨ G(Esa. "HJc; 6sɗ@s[;tlljA6lI#6|S;*ZBTԷ`(G#ַ%xܚY og1I%hۊJ<-^!g#gyA@ F7q?:@3wwׂޜ]Zu&޼ݰC:*Qt$3,*&,ڢ;'pʻSaCYlu<_8y"SLc'_?rc=AKOҟ$q>'VX Ӑ_GeEwQR#_)k4;k:RF⯁~m( f$qD<]Ό{fںg)\$eA~A5q^sz7w ~11zFV7*g fIЛ4Y8z^ D5sNs-*/sFzclCdZhv(EJB†KFI'zA\L}hPH, 2oIMpDc}m]l}vt,NRqn5%i-뚤l(H" ~_O .:K+i~hx?_\{.SfyE3*bZQ(+c;I5̈́@s.,.߰g_|ZjmҐZoO2Rama274F $A|jLalF. ',oz@ +1.Gm;\# /Y9Ok)Iz;?90' H9˵`/G79_?>r:+>:Rz{Z*e<Ԑl9y__ ̆do(E $5_q6Њߔll"RJazqYD@A| z1qKX < ݜ=5(tX_zC fX+ʨ08s{8 L`pdl-ۄfI8CJ/A_Z4m^~K&~}fwOrM&_ҷcX˝٘G'Q0 'wLI qLu׮kE5hWx* +f(fނjb-^1P ֦]8^<(e>~〟U_gw&˓:"CA6Z3fԵ& Ga$g {Bw*pMZ|= l?='[#Tm^PQ*rXĉfpG#3U \i 6 2weR f&HX|'~LWbгiyF2 ]3BG[N"(IU & i^gɟE>FޣE!DW<R.^5NGU0,ry77ɄǹpG |}zͲoET[Ϥ`U&w-%8J*a&ϒ$処5\zP[4t5L]w_4`*jp ]ֱn`ڥwh$o LʣRa!χ$q`oL֝4xCރ]CI#4}_}WmІ"Kn9{sfoO)Qԁ7]*Mέ& IzFVҘ?lNlPlG2@zXV5h(LIV]݃Y"d)PuO͂Uso=uΚ'~ąRmt?F^ H2f,=b/0Yul쥻i(cT97xJsU-Du.$Bl.Ԁ Mf4MخֲjMzP3`9i`ޯUc'Ju]cMǥl.a- R}+rIk/:'Rn.^Wח7gG<<}3f7*z! (j£?\QQ%^{ r}>1/ߙTQ eqg}I58zYChWq1m8Pl^f!Y4ie G5C aHNjeCj6{ʹg, 35dXn\`vn!1M:r4fa9 i\djR6^9t`' 4=X-'HB<R:XffPE} @ j+awvU)bq*7l&z/b{ 154W ߽L1?ZŜnݟ%X@iu찌ufظj'-a-k[ëq=q]#ݞFwV!m~~, )v9Y}h- 8_fև͘=L=7R^MsW7Ίuҁݚү4snW xPgslf6 m5-AV;pYWl~rr _&y4J)Jd+]}?aNݽQLnHBL7|aa`{clp1kʨ.jEJ[3k^/<ɭ$f?80 8W kP^$Z4ƴ4 E@[NqA0⍆O#g:3_x'4պ<}Z*DO}U5XJ :b%monڞ03ЃJ+#Q4 KC]eGVB}T\{1<~c9 8=bS+a `6*9mZ7$3(/S+ nA~S% u"-) mFOTUJGn|Jsep,9y_:&_쀘d<$TFKh s\klD6.Į;hؤ)WLinLaάWcSՎtgdx0:5TV`탷B_ٴ,!3E$#js]KKRn1.  Ym P/i4'p*AhA**XloB^I-3ͶkBRzgn|+Ht0EuئQm6$0w‡JyJL8,s01־ 1:m?ǻhQð}3jX:!0pAʎ _2 >^.L^a[4gUh4;(TkyM"yJA{y`r3u6%#.Į,+M%PTkg;{w-731&KddDwi~оejG7OUt@f8SģiۡOM[P ~F%O8FZ8˵r Ĺ+bsg'gKF4p@%X ziMS͢-](  M hЌ@2Tí"ZffB(b mYC'!@5!!m1jdBL2 GSJ^qUHb5ZC gCqW !%7;Դ5I hYؿ"cp1 ?M*c4r$bh fqIiۦ>ݰ;Hhp8v7b8(V/C/x¢Q4"5@?F-h _Y Ѡ~ŹYH?I"QoC`ɮErA$Is>-37YFɺ"ZMujuN ˬ&zTIb\* 4HٝUte9n{O=m'Iv7Q?8;w${r@ 4!Ď%4dla@^se.֓Oz7@@Gpo$5̘cMww_>=!s#UV:hׇtċ0FࣷE<1wpA7R(ULet頶uU ,WT%M;;{:n z}VFf"it.-?8-k ?]5@>v@!ܾ/,Z=2y[.sq,ɺ&DGث*\*gƐ?@bb}4Mn fG_EBK+;-R B5S1i9P܀CCűfTX3VZub p2(6m]XZUhڸ=d qTJ#׉)piz i]_S& o1m<YOuRSu.tZ(kuXe"GG,q#iؼ*7 Rn$\P污`pEmL&Mg0+g?vhb xA *E-HĎ) dAM3)LA*|ҕ Q9H `e(ԓNa3i\b[fvBٶ 9Z|b3,cCk1Z1i@7' \F~o9/<ΏW>"`"Ŀ-bx:G3/ mKµo}LNU{%NS~(++ $QK'42MX1S? S{9LIٯ_d WVڑsBFu :+꒒>]ӓʸNj'}kv!(<S4G;&YtKfIef6Cm9V,x~yFKy7g }玺,*S7G=g"$## R :6rcXeͅ%y)06.֣~ÛM X-i2'ж,-zy<-u1Oz%?SEdgȎ:`<~"Zmc mdβ2d?bY\iR:"x֏҇?d#kY#& Y`OЭ6``U<3e Djjpnd INjK~}oswϊ[g B37;C޵谣eZٝ1 ` t߃ԀE >}aoc )' Ѿ} j}匔OR/qiPQ?49Clpٷ<1Ey\4Ѽ\7T}Odֆ뀖4iOBapwOiky̑{lBC5mȕ5 3Te[~̺ey%ˤj\KGF'Ӥ{iݯ;ezyv ۹KrEŏԽy'ER(w-m#;z=<ތ}$v-N$Nv/wymub2~ Qg;;V,Ĩ|sJEvmKRX'Lh̔C:`K}WM'wQLZ{eЏ7`ޔq,DH~,Õ2>g҈tl~*쌱QWHe:@}N L 0Ǖ#^1p;&s/ 8V v_ \+fpw=[X e?B5g_q&lS7=b[[&@dG4"p%fzo6sFS\a~ؔ/1Ȟ@G9]۔W˷ŭp7]xJ@ez y]@Ye8q\DUi4j.˄wLkSAc큋v턿w[qO]/|z_\#p"ǑC>Oqi C`{V9Ƚ Mjʣ@oT 5SAHZ1_^ϰ~?[_Ald+Q THKZEQ3v )Vk2:HDloD1W+7HءΡ UiL,;kqQ{HCb_ƑƏ n ^G5.-8-mN47.ٳ(RLIb:_ۧLH"-ZKimժsYKFVNI+b{֣֘8{7M}(Tqڍc^ꂃl"w%W q'ml ÚNA?A8jd`3- ǗzzyoAP*$!h_1h_<~ b_#kke}ފwb<8 9Y>Yc Yq@4BDyIզ^sj[m/O'1Iycc<2gm)|U ٌǡn Vnxx՞Ө S)8.i_J^Rb2 eW5 w_fb,tmױ a*`sIi];`Z])"?7Lc&~]6O%9d匽?/Y^,h1jź+3DŽSO9w숽X+ ;eO|2sl`t "-j%+XݴG+3@YtG:ڭj*OP|0dMjի`MO96`@CixDeZBchQxVe9\183+=6SyfX>30p8`͗F [ݯ3*`lcn!A%IIduӟWAH$ubϋXE2[+zQ,Ryqp49ݮKhB1tBy6(p *Ϛ !*eb̝:{uxLEi=W]2l}L4PEL/ '#Ex -qmlΨW)l8tN$#,#Hb0 4l I^#m[$˩VG4XLaے 6Sb[1l #4 F-(fIIՒ4RgĂdh#)є9gc,U-l & 8 "ͰgF;;+n=U=;?:_BZ#T6m)%q{U< AFWՁU 4~JnȎ lB-X}rm,8ǁUWKo=]G?B0Q6[o 鵖NHqcT~ ȠtIJv}Z(d2 [cȦ l+`CI.?|x<'q];vُ2<%&S9#CF:~am{R~ւiV8ygPKEŒ~yA2WY`h#]8!J-W /l]-%OϾ9 /@e{ [ 7MUCҵӆ05rp_ϲM 'q6ƾx~@4WPvv9' iGr(5Q$mi."CF,06I}q@~={=26%dEE CI!qEMgOMn9͘=2h>6N; LiN@U4?ƍ8 WOׇ[}dv;N8ALc`[>;n(rK =TU1Z[Ϲm϶}R x^`qQZJjt `|iN,ָ)7^a٘/GR|A QSotik1W6iusGG z :# JjX)c9[' X3uoF$+k)4pRi0~bJsi{b{D&D*ž`$Vڨ>4{v)>6mlz,铃61[:[G $oda (# jVNEOm$ؚae֌Ez<!_2fC(?$H )&=W/xop<_GfDٶ̶eٌ'w6XkO- gQ#=:Yu߲זVke-mLHr"ve~6AWV즠^R!}?fo+<{?? ^HGOa81K}&>8UrϷ?pq yRf:.2Hl2$p߱]LᳯvDAb\!+=(^2g>{D7:U=5^6^ru}mWL ʽ}ېx[[ i|,ryXۓgծjgYKT vdi:i1,޵ 8PЬu2%Mr;D!eh!y'tS p%B}7RMo. '|t}] B̮ǨpE|UI/nE9^)i1rqE]*b`.'"#%c^<ʯꦮ'Z+Js&u"@(Y 94g3ZHm >*Ț}(k ~ #0jH,qk&NGxD FKި )\m2yV)b40 IdFu4"(;6Cz$|.Uepbx_B63  uSo&މb(*,ut^TFmAN!-Ze*L]4.\o7-OǒG>tS &uwjʉ{SV.tI5n桞Guuw%cF 9`S}VuOpAYsx@&'QW_bb$[CĬkuˇ)D[+J|4ɂ*IX6jI1cQx=v? OYNsFϊ1]6{Oul: _hAR'\1߯՝ U f>;u.51өqӄY3 F$A[b}po"" Aq|'F:w,vGiJPc΋/^͹ҋ.h.Ч.໰ټkp(H F$:rGMB\NhJғf6W,@юҹA >/ˊ8+qQ3NNur3HbNyRaE?8d?AqXmnB_&e]@SYRv{&UOiqAw&Ҡi\9WoOi+hAV/IӷAieQCӢ LZ!xKd\u֘Dl59fFk8@֖f?Z.DLBŸ&5PH')6!0ݎC̖u0)-]]5eцgI+2iL޴gJfI'B*B%UKB|{q b,3E괢P(iC4.tOP)eM^NųiU@OH%MJRՊ (pC-RD]L1)>~yB4;~'.@bX6s~ΓkFQbǤb"Oiǐdw{ob[>qS5Jkɀh~`$J'fP79;*+ B$zRVjr â!IqrYWo_.vpcՖO!\z@,*~NdkR%au-W$(,iyxMېd (T_Ӵ707M%Wf1 ZR;(YwY>遷~gSM@sn q "_Τ(Iٴ\'efy+hǪ[gۚPl3N3f8X6Z$tuĈ櫖Hđ`Kn8,r7 t bd;cLc$| $1 պs@ʝW2ބH>$ip68tm[` =@b|!,0͋<`Ag'ňkB u"n$"wT܌9b*K5p#R선 0.i:#qdRq/U|&[9^<|9o绬`Y|Ĉ7CżD -N_XiRf;Lh6'Ewv [hno]<~U eQ3O=Ӡ`K~QÁ$& )'U6aD ׭nTDp\=B_؄=A#YD-3lLQ޷ '0;_fI]OQ1CH->,(kL;  _׏hy~/TIcc;]% B+*Vg`vx mv}K;>i@A/:/܃1d}`}:r",>Y2:3>q?w`kk.'Ғ#6O(5`xo;ML}B[4@v4yZ;N=;҂[Sg]Y@eTv}⡠ij^$yB3 %NRh8YX~X=` /m=)kpZ@/Wӂ”@풲嶁S2+/m?OK2ge|ҖӞYKǁԎ|$R"}]?:-+j e]H7.]K[{;kHQ4dR'ryj)O^\MUp&eBKUaٲ$v8iqEa^z5 nV? ɐqOR~|`f\|븠yrאr%޾m{ƖUu+OV )-SL#F vO~t*S?D*c(f =l@;L1c/q`lAfs`c>ÒV1o=T9_ n>N]5dtejP3܁ wW^WM"m2mbHk%r۴!E$7*~XUp~5phxtu_$)ضs.OK ?ע& `g1h >\^^` 0ԝ%̒qF 5vآt 1b8Cr21z A2d0R0ȆЌW1zqIpK9 T?Ë侊򕻿~}#f^k#nA-߶NtAOgSQ,fqηI`.xӣڀ6w88`To&'A|uvH_(FP1w @ڴ,MB;4,]4N4޽G|d>=ZowYC ǚ) R _է@Oʙ 3nsmugTh3ҮCҮ5eg2+Px ͜{kp}tryH}8c2&_1MMzCsl,@doLI%DLw9sBLem=ps`K2O3(P2ct9 E.A3hQktN1ND !b5pyJf6L$H R2-碌-3QHfc}0eRD* Y٢ݵ/Xx싒E^Q56:Q*gbD}u ~>ôT eTP2\^,7k+af\LKnJb;uIr\elf*#=N{/T}5{f;XĔƕ'Jmmۙ"{B/{ڥ.Ϲ?`xyȍNO3Yl{'v DҽMBǹe?llT @3\ؗ9\xU\iϐϴ>kgK̈́qXD'](+Mp+}qOia WUyTI]⾶+yCviA7Zh:Ɨ>ܿ ES g\+{~sܥfNS&"ٱNcGQ3Kxy!;=B''Et;ﻯ^֚v{MeM>5N;kD6PXW#XU!<2oVjv@͂vys{ UHJ(^i[ZʅuX._GLpHn̐;!̡X::_RH}K L°8h\IWr68>zq$3Wz 07^r5-s,I"YaOBQKZղul}95 ;_w~!?%&1r& G0^X0 ,ϐ _~[rSj6&Lf'"\%b;!ooY PBX;4:Flc%MQPQJw2)4 )naI̬|feDgs~ ?V<[_=m۝Zr1Y@?(ѹittIWz8^{ Dܗ%t(-D_l-/θpvXU]\ O[q 1Th}v |q¤ a'|$ w=0`vQGm*_L)7 Bo+$jwSwq1N׷^l3W`yo})#@fNdRO 0 WW-bHܓqx>?rp|j[mI>ٱt@ү9bg sn'!] DMYR,632q䕆,|[2G *6`iTW||OG-REjx88ha$|wxq`J=abnngNwUt\?LaN9:{ qftKHodכ\0 vk!  <=@q4—bC)Q,kԟ>G Qv:, E|; sOx)Áz#$,%mm( ^7!, (s4؏{ȀQ̔].̋bJpdjg=bpJY,S}AݤBKT3MϠ*#G1R$sAꚦvNS;8<.S[,~1>N5v[.=?w`Ϻs T2>z{Ő[nSp/4O/i$ןKh2~V sxr$%p*t M.MO!ދ ])hƍڟFzyg '-z))9\o8v 8ɄFb50x9IY#Y'u O25I| ~% bcLR*k@zHIPEZ0Tx#śͣp mti-1[6T$aV[ix$N"0zs5O`e G!y&H=b~pbuܯB{=HWP{do@ Mj +uly!l~X;( oV 3𘣒躊"M``y"Хߑ#ɜ[tNϼ2,J ߖODֱ cB  YG{g?a *!]4{*T HS$oL޸dN'ap|| C'n _Fw<}>xAeHSB52}۝]xb"CA;Ne}<~U/peX jHf K$`3V`?kPtId,xX$3l KG-Rȸi U("JEbNi*ݭ 咝MT,2mQ;Z??& ws}-E{";XfųPU(Q}^$2؍ӌ yCL O4 Fwėd&׸eoR[bJ<";=;'QP!\q{YY0 H]5#u'TΚNzP7f UW]ʣ\d'lpǤqsm3:%3RvNK0e*?V!`c׌.7pTu̎QoĔMn(} L0!Ǹ]XƊ0l3u%.[-&4x°n9GrI&sB$9Iz_MB0'X fԢd8&[c砩]]0@{ &؝ВMhm O\Lߥ][aS{%'h;ēQV'zR! #/շUP CY;{a؆ϿTSs‘ AB=W7ӀCuwj IC<@^2 䃄gV?Cdҝ:\q$A&֑MRf4oH篍[I'?^Hžak,r(nvDm ǡ r?{5NFL.HZ(1 wP^nj.*_B٨d3ag+yFE^c8L[A-Pw%vo+ [@^[ςי>orX|F#qJr%a'MO|Wy'Ɗ \ F,tbHCDFtؔ '>uI[ MzY=a O3.7N5vK#ĥJl?~<8<fv?u0T1.8vc̨#25d&Ԥ{υH|lO:hHOM: 'ܜN[Ct&"4GNoD ?re쀏Mt֢&R9b|uAڙ @OSPÖem(0Ԕ$ dv]d H(ƴOV! %@Bq9L"a{8^T05̀6̀hr'21ٞ7 Z+KLH|cgB$M[㪨ɯt45}ҿH +N9Ъ7 JbOp G Z{!gQׂZK$GYi-HV5?s`!6;2dEl^Z1M^u/7 ZY SJEFZ4[o:EZ՘A.G./ (!_[{4zqL¦hT/yoO` A[z347H}5z߫R5>m͎ؑ1;N8g'goe&kOH_ qXcyROh롷,C$7xX:!8mi51fj?;1:;&]I f,=T٥77"q}x6KU\RY˂zF$񚀢5 w\srjP Aد20nd(ozL'P=TfX7 y$Gd8 |k@~aD9g1 19Qk.>UIב<nPkG2H&]3E uGdk#@jOC5OsrE55VH>x]Mr2V@i|>|Rw|"]hxK ' E=Ƕe΀Pg9KLڜc?sUcB@r>o{s#OtL|"sLNֲM #_h uݓiݥ]7|lq%}R$xlt7r>C`o\~A)@YX6 *pQ0rY;'tY6,yh$ik=')hј6iRr8TE Azr&[X[Wxw$%0_fd<&ן3a-*9q(CS#lSM*N0NrT"0\gI0J5%!`$1V~Xz-t! ?t9i-5B`%}l-(ޞ[s}Bv:^7$Iaɰz`%Dcp:Ck#ًd[XB+nt/J"r TD Uyy: JHHGH[wЩ<2c=h{K{}1ueK6v+867_m)23q{Ep`~ġKW\13͔ ^[ǽs 6=ydr].4(|4NSk^1؁.bST&نWXcU13æ>qdxV0,QpL=RI>~; 'iz; E['&qH#4:ۤxBlTJ^:&ٍ k7 knL:˨ i;"?ɹrsQW $} 6wKqRhP Mz62HA|rM?#.,gb Gz%tÎ2&kxPTBz"^/ Q{q mgf5MZH+;O(oV\",45/,O֭ 5iQ >`lYiLiHa;ta\r1d[l':kSdWiz=+sX(凡*.ѕ=r8A;wcL61ߣ}gkElӒa#s :f9kVHez`lSx xzSc)V7a46~(vW 7ʥYg3yʯY3ygYvVmh>Ns 0ۈ1 8h|*ٌِE K0:w~My2M:c#%Hl;9:w#>[pkTT9pͫ(oK~iwHM]5v|^1H%'HoTrmȀ0ܚg )2*WqɳcddzN3"h5cmNΣ'hEςmΉ'Vj6q]~ d}d5&y& D3YX5LEuړ 8\R3,SyefE D M” YWy\ڝi= J~IV|cX/qԳ{ (lܫ Ci\70Pt~8O4B 8sqaJhsV& :, Gq:W*fns+sxC}K92I2@+wzGcRMšb >4s] ^o{;$u{/  /Ixx/9$gHybo\֤TLC-y)v :-!w4Ff®BcH7<ҚHDE!7/eB:4*4V${>̾ ^T̝u|L&ՀKȕ(j+ 9 φaM;]g72B pFU䱉$@Tic!)JO"g8IPߦ+ :|]Ki ƾz}?m"Tyu#.u j.7>ǴQQG\7$bQL-Cxrla3JAk,Pc^j` .դN{N8N[Oں5BΈ ^I3+1ۮQKܻGNy6LE]W+dc5<#e[ӨaH?a"H53x.'_.70:>[I,/7Hl^42%YTzb-1>H!mHn2]u, :3!;caYz[q#n߸NNl~)y_h~VݳeE 4=M,U=ztG7T=7ֳ@<˯R$ ej ijj_捂o=hh&QD뿨U24AgX272>L%6 i`LZs^d9ݕvF&)RYi)Tf)4u:̈s3T8zbe3OуAFW}VwDO6g%zF7@oy@2rHb4m.hbiԛ򃬴[ CfvՈLrtkYu!(=UbWzթa@4*DtWi8 !cB8x- vq__{HjO\D.a8N9%Ц]눥2QX;ڻW'߳(uC9?RH7c+yb?lboW;ƱSx?{Zk7 Pޚ פGhjPktNBK#od'T1vH݁vI9#*܆ P`ިUԟt'lfj SOTf"$ ~Ɓ5e$~*$tDi$LKUza mP?k?'A$j[-W5& X#\'=m[K@72a|9X:qm:/8 9X*ېˢ̗GG tdgwVknL n˦hhJCkF^yX7 e>˶U/B *V29.BZ=5 Z>-6Fc$|o%fB:\\/ψG"E47zH M*8}n4Ut ?}EgajCv9Qq>8 4o$Z#Y:Q%`SE^Mz.ZY)yɠ;s ٛQG!,ChOR=r̢q{fks(X8hC̰f/C>xcà`ie"0E 4g ԀWYJs4&c}R_]2HLR&»`3*&Wkuo&3jIf":' 8*z ~K5 { IJ k Zk: 3:}?0'H U?k}61 ɏIfgi8tqgѽwr^0D2r L{t!> TR̓M#]n1%=l3Bv;b`d ~~E]^HIɄt)08[kN Hza¼E5L=&V00 oˠ}{.g5$ j`lA6bd2 %.b,=gP@Њ2w%;ڰ D],Z̻,]\ \](uns%onv4e:,oHL8B= :WQW G?]o#7}5.2E=G}(eD0YucߥAf:w<4b]'e UT 6y>lZLDlƔKZۓW:ky4S$1PqzB?*.nt]E,C1Mg9ކ[}A+F 4㇟mvWoo- ^`?hߊ%ELn;-ofF_ DT㗶*ExsѱPAc-ٺs'Hh?Q@ikvx2z ?(RR9H K_`r?O!Z7yXia!_֗Lhz6 'r V)o;>l577%u2CF}\2`(5{RLl'v.Vݰ7 =Lb[d]͞wdN}]C-i14<|]CkDcU5aЮTsYɲ @l/;F+y!3N@=%i<ǪץC\͓möe9%[}H>%6~Iq2K5oNCz,jHJE2fS71"#V/y+P7 MIq'wgnS#ߪk9fe0n^Aj 1䯶tQiF#*>&hPq$=ɦr0H$ Kb㲁>@w=AC~l0Cv]J6sYوS0 ň$Ç< y@4Rన~+*“Cgfp֌iZ9PV 䨪&䥈/: r҅!#v)HhI-QfizSa !3WZzBu] U^,oM,(Woԏ\bk \)&&o6V8אm _ " Y"e=fjs3$BCӂx5It5 cmlnRa@Kp{E5g*&!~[2}ʗyQ!IҤ5Ra:A{ԝV?vʎn.~41RZd408SۊfS!畉ܽ&J?w>J cӢXM ZgT8} uw_Rǣ7j2}'xhmsX`rZurF6͕?2qL}3˚'j\A:+v09jo2N6.Ai~4r4΃ԔMӚekoٿ.l.JѦ{`u'n7ԓ⧥folk:ŏJaʙ4\ Jys%'nא#-Rtj̹iC#:P! jOO-Lח%m HDؗbm^<.?Ji_̈ƕ*1@I紪a0K6w=>$]|gA<ͲVw$ѭG0nxx#_3rxg$NxQ;Bwcg$مY!b/(?6+ 6"Ԩ#o)ib*v6dR&#}pjiK0lވ\ x5*8ėN9ֳ :ڲqr 2.N.t9_i&r& 9c!S7QכM҈VflS~;/̀٬˖g:SokuґBWg]5q~ldV? \ni+;ۧQt9TE]Ҳb/,tHKCz;@N0fR~OZW;U3Wh(7Tj&!n9O(戡b_7 6R9ݰ8G(ܝСYb)tۄs.F4r2nK>&sG&:7Wq4xJ "`TX=5o ˏLJ$! cn.݀k2 ,"0(jgG+`@83Y;X[ӠU\ȇ$7]d&)m/f#ſ$:Tt~Cv s*ْgH#.6|S)Kr.A4y/ӓR2b  TQ3\~"IN{Chn7?9JBRG{YAz@ct6YmVXH'_閺.DARLeMg/ֲ;{Lo2[/BӬʚ:`Uӓ[X_8Vb[>4Yɶ 'f6C?Wc ࿵?NߪLmu4ӘlL!G-V7gB @YմtC6myϙ?8ɬ`+P]aQc o[\%tFHM 6TIFadM%3fM]6P@g)AcG0d wL8 uORyԲ5J}YO.ӂv]gJ=~_$ܿ֫4:>5۬zd# /גU%B"MX6`5Ep&0rjzlayC4h8d3X d c7lnK[?Næv Fu1(`2Q1j?/Vxj7s;2#R~cZ2!n"ΠC Dhx7+ Hk~QDl h7lQͦ1]XK_[a_O0=ʿۓ+ =r [$Xy0hQ Ҙ, %W|],۽B#~<ϛy $h18=œ܊i. LD qf7}*:~Y+xʙg垫fĻb+7[ݕJtndMPvh֔9/%77. ?: YeZ@c"ZAIֿudWO ~=&q8h8\D iO )?a1mL^<oؒefe M7\9`׃XӦ,Q"K(ŭsdҺM7͔m0tx]gb0h$ѬƂB(֫l4:C^TFJdڨJmW, Ѷ%vkb{,ӡ?1 E}sdﵑvӢ?fb"V#MQ1tZ`5KX]GN^ЛΰdIc,4FР3c9rCokK)B=OqZ?u3zS8Uj v0yJ X[իe@d+ 쩵76K[6ZjH4kJmF}=|. PvW]e|muVx_8TTsn[NZ.}G;|5ըOʪL%ԉo+ҠGp\ -yJnLfYM#Ăń*:TQ ?ZMG|X+{AZ@n Q8Z>^vrc6E7{uWC=i`\V1T&CFRnr}`to F MwcЮIO#0#ސyA'xJ&mԆB=M(UHҹqmIh|BpUlOR:ew&Z$V&O~g 1~gBpo)984 K<Y:@ (z2pB0.lfcqS3d;#\p5q6( qx =Ӭj0(-msylT\2f:ȈT s9XNd"B~OilY\i1mi[Fحp.ʻ=j U^a8=ɁP5եIH-tkI~V׊@3QH#0Hl6wL],iۏM+o W#1<(ScfDCܸ|<)q2ϩs{<YWgTFAlLohNo~o~TZ\7y NT€x9HE(7t`=wvhE,2}yC% 69 ^G!.BFI-TڈVXkkChM?i\9Īפ'cb:f ZEg4 f#T8֖=$v;vPܪ~8c.0\0?miOaCeK*S=IG! ġ^Zg>x_mo; '鄗0;~s_|wŞ%cZ- =&KY R8ztib ',4xtHt*6(l {2BY҉F|񄿶&$JZy_/KvPcv4Ywҽ>XI, K^hEL} +)Ѣ%ӔG|wјN|<[|ݥ0;I'-OA]+kpO9Z,u0?ztH(t`;lX o`s<؞g]4|`y#XRݘ%Pz/HUStmk݆Xr^S zy-WyaYptԐC[c{js\jLNHɯkF,&I?#uL[7{w>%1&QD!]&iNtw^^!9/̑A u9|gS ˮHv> rS/RݕQ!GT]֚R%&a1,?kmT<ٰq,І`2V Y_.\ٸ?9@4 ֗1Iy/wjXDiւJqe,|漍3߻Iy EtijjMUNf>Ƅb(JBB:=q= ~n@BG@^gomLs7*W=;PェHnT49o44d),Nx<;=S{ I5V69v3i]Nvns|C7w3QQspސKof:wa})5WKw1EaEtv+"F0倽VHR* LO%kwd>Մ%4͒8rG댶%wH_fEmU8ʢmǹ;-b\h/Uh.V" ,z:1u|ڙ/ĈgLIx"BfN͗yN}fB) COAVy%7 Bp `-_on aOA07 7#ތzƵL7k$iy֍1n4 YygJ{#!w -51@/76Kbh8'"ەy-CgDC;\A1ɴҔU 箨` b}cZWG.0JAGxUXDeؔFB7cmH' 9q/[tSǗHY y~iTOq!#"˄nl@H`40%[_`xsxo21]˶{̑ݞoc1f.eRS^^< E@42f$E< &-/Qm_O6c "*iQ͛Ql.k=B*mEV6~%n^>J w &vFrDVKLLunxf7loMyyNoͱ~MgxѦ@@Ðw1{쁣6Vk-"lg:+Cm]=X?x`D@q{탓"ă>#؋EQUCXܒ݇W͋"4"_Ip}u$a;GeEg ɦx1l--w6%bX=4PɂK QDVej޹6}cҦBݗ0/c3Pb+XXHېecZɂj~9EON6Ϋ9iB=56foHYKLNp5'OP#YHqJyOcײ'$tt2Ϝ!'Y Eҹ8-YXdg$k;.[(C?ndӲ n{f{9.io:2j䩬~ ֖/muO #jAkM@L'Hݣj,cd&$z Bh>1֎ 4".X9BWaNVqKIB A%\W ;{){=z=kʋ (#1#9B`OdW=Apߌ*J}$d$ ouZvZ^$lHt䲃ln}Q^uA_pAԡ@29~ 76>wk|rHhlisH p\X] |ƿ3/cd8o9Ԋ&P\ bSx;)+G>܃!60Z`J dWc "<A̢L.IwW3)H /‚I1$Mk᛹<isasez]V"U@ȀVkijG/SP1ǒ$$ϻ#\ Ԥ̐!kHtssy#J%λ^.ߥyFy&Yڊ4PG@[[s`@83 )Vڱ]s# l-p3HleϷX}a !YMj._5FXBLx Q$Q WN ձ C/bǩ/B][ @|~!X^PP.Yr/ĸW~nٶ1u> ဌI.V<3f^u٫˷.ڒΏ`y0&gL^krGhؙ >I'wc9augf.9_36n1d:`BVD(LL`䲘X6l{㥁Xi*Qw\Xm8Y~^=Ϗ݇Jjnj^T3\2rfTz?Ϩ`ΞZ躽 Zxg `ϘF$)ab5ڪஔZo]R,3V5Jlf'`yQ7f9ͱ1g]^YPw2Jy6)997r(W 5g3\2}bbć('H 錫2su%y(@6H=U1Y^V+N Ey@{& Ǡȣ u7!حf!#o2/5Otf(\Z$tfAޏV3 ::r*kimKs6iAب~Tu#{ +*<ah a^M|BļobY-IrZ1T {],ؓ}fS7l𯱿5C9oomL s KLRvW흢xvEk-%|d 4y<0Ip`i5ϕ` -6 fO]~Q%/&ɄH@c8dӕ!E/ Rq"o ^m#m؞&je X99tNte B@F,q=`}-)^X o5~]:M'EL{ѵ δѨRUFrʪ':R:ydsb)1Vt2z^aZ2eLyyaGGgz!Kd֕ePgg>YS}=~u }.#tsfh(jC9@an< &v%81ƨox!&6a.o;ܪt͂g?fY0=7{TXpnwqda4bt.43<%`5'-'@MT'ڪC|`lqt3RczkhQTnƺOutq'7 &Gŵt hxi6m 6oU$[&F#ܳ91|j Za %gɝ˝y}?o"#+4ug5 P 8x$p3)' $1r\eK5h :EuHџ89,? TA+l u72m&tj ]DGTV#ZQ_[ÂCWɜ^  e5zuZ/ql⸘~$h⦛ 慧E!Tf2H R6QO+Xi%M. "lQMjbv Zu v_ʹ: utjP?a(={g |[Rpȷ\?ŤI0|G_ЌVuQ;X1^Yބw#xk"΋NNN I:\(Эzì\y{; _2rީ߽!nAS5UT9σl[+&3ɝbٙGfWNϲ2Ϸi4ؘ'|–Vab,;FfN۲]`jOP gjd}שՃzLU P;gMTom@:0[V 0ј?gS,:4gӢ I+,b8+ߔ 3|  BTTEHFVI+IUG$_pv8W`֙a|gosE[Ľ*-ʄF$wV:@k pRIq H*\6d uAP,Fˮzkͤ:4-hhsᨓB>8˒XpIAc A%/ }t-Bthdn$+52]h]FhD8@H H,w<)_L:|i2׬XUpt}<#Q_Ydݧ WQ| # yQnZKp)SUDQ<Q)w&f6ot__ ].8M>}x_<eeG]D AO g.ǃ'`8ˡf46m̾r7Nnsӣ vZ\gm7-p04D1$p]ޥ8ai`f^l0@͝C }8¼̎3b`yPfH@OTx"لe#OOƈ]2wUb[7t8p A$3*lrTzNkND N($8gzpSO`V;La+T*l)0*o/.6t 4YVG/]2k-lBKo,VYk-[kݍ`7=GE9ϑz3fkmXuxvfT+TKJ1E{u'_3{??yu! ¤>k;z3$@9 rX)A:g%e>+;xsmz|qJh@F, :L|Hk8a$AE%) IlSlY~Pl~[s&n|3@Ѹ]xB쮠7Y2X=K;W%oJT`_5}!,,IF:͇bnLM5x`&HAĝqAr4$0, B#Q_(e8=f@`Dg9k?,is?F&>"ur> ,5| ҏz$Q_o!{gEln!X3:ǠHg#+n M4R$c[o1!ڄ2)f<":Cq҅J6r>@_ATj RHD<g Ib+M"Yw0MERm`>͕5 <.W1W-^v0XY>U%0{Y|F+y5{6?a-Ѣ6p»7 :}LUn%dB0_J.ۅC{Wd*snvǠ9Izi=ziߕʑѨqx'd"q9ߓ<sRX EE*y2dBWNM&dX&grߢjwЬ5۸HQKG 0L`n*TFNܺmgnufK @XsCːf˩b%-hWk{6uLŗ #=xHp?asu?#ݧ='|4zm !-C*GIĥu1ۺgy_q|;o$Q|z|j qf@ ͙ 6 bH߲e$]V;/T1Tcq1"%if5<׈1vS+`eTȢ`I:ډF8r+(VSL7Xix`z)8 5`jacd5GkZ-cʪ2sXr045'V [wjrm3fNGNBj>|D) X9*bڙd4=},d^cMWLq8Nag, ~Ώ8 o4Ӽ!4e—}6%4Nvˎ =<*$mQg<$ܧ!OSEV5^?xMһ?vm3YC3벲V98bܾb*VV3)+Y$DP"R:)yhDC$ު$7\*o.Tj)|fGmݛ[(V[.ЙBwO)aIc4ZY>ʗD =H7CUBU̬#w~ bctH߷3vw!ODfqNۀ"`K!MаbU-"R_&UpnhިAϙrAkx%}>Zkn7 T!-H8FmUayOO*Kca꒦n^IQYYeelaFC6Tub!^*!%c 1%Pŋ8c'Z)N7&jα*Gh:h'L gHd܁aL0zI6aakݨVi|~9y\Ȳ8 H|T!/ٌ-`7JrP!9J6D:hbpF23GQqK^1/ӑ3A2fi!UˉtLI %zg0BM{QǒX}$}و;u1Pxܜgoau MʂY9H ?ȿ< lrwqꪐm֔@0-1|k0rcX%EI";8(I45⧘~unҲquLQ1N862f}wJழ(g 5^q >n5:! QQ.zF$#e֠vb QeVvJ$a)z0qּ;&DEX˗(Ze8Yҗ?0Rtx,E$}%uE7Q I3#%$@ z1gxvkoI@iBQ kl;!ґ hl7sےP \=dp_ͽ,͙;Hi@8\ Ƶ/i#dݫ*mYy8T,ko0M"&`ԯM>era}Z`'87[URjMA^js5r)WfˢjI;myiz'!3#}kچOsR4l 3$mאy*7t ] `wiC# b PL{C7 $I׍^%45S8$aT.^~-P T&՚{ΆO;;$6іE;֜8w ~+B r}lV(@l/~qdJF5EdI5Ǚ^ٳg^`]?>jPsљaDs.n4DOS??|ܫJ}pjoh{RGqi?7|=TUI ީaW#>o-ݼ:FlOﳗ=Ecq&I4;c+N>KfSL0γ!(;VEVeρ@[z0lH :/3\h'*Vn!C:LT.H& kA ƩP9SU)8霻Q V`01?SWT"'\caeQd mJƯ< ?|.^%-Ƭ)' jt֥9ւNR1'R3T3x㽆q6K`LwU[.oK^l k`Ԇ ;7g!yhTpRW$7:]R/|odj%:3{ O]mL1L 13kvyX:^϶QV 'K[IJDz6Ɋ*9AQqMlu:Xg?֙]g̓/ +=.l8[!iّkK]%fJHnYb(-xUl Փ Y`a#EᛧEA2EO[4tboڢ]ꝺ;ީ,Zq&=V[;0-}aڃ4a?~`J7@-OS40^4OxO?Dj+r+Wd1}|#i?=O?0zB* Vr GQo&gJd/ N`O3aCl@(tl:PʸީҿW#ȼP'ibrbqM716۽eGHV.C\ 9 EY:Y|[& ?I1P'҂-7%Љ1t6lAyى.1]\;>?]%ǣ[N֖R 5q3=E" 8^2G3`ԃFn nwmT/gs:ë`W{dű!S:Ҝ ՒgH;@B4`=67/6PK0(FɃW#,O*uuZsY%h Ρw248՚w[(g7*#$Fc A`RkLR'"䠒ړ Nj/s]d8G,f?{8 %m+aD>^.pɺc3$fӳbFNs~gwR]=ʳbk(OxHsYҙGt. 1Å&ձWf5࠯~,qtV 9SI[y&3'qj ۀ+کhj+3e-Wh94f{[ 0fAkmbPk6n<7DnSLu2=h kEc{W E)jw5S.[>l>8| f0SڥӦtqx%l?8BOI;v{^ j̜C6_;ܱ"b?3/}IRoS@-}:ch8-,z}r1"84vϠ!aX73vOR{SZPS}iVNkDrxn{UmC'9omu&0iLK;CMkfwotDGI$2tB_6jwؕ8T ҴRϿDcZM2nDQ~Y =c<yw677O!WZ|hYp:"O^{+PD[3Du1u0܂FSC)U`ݲƠΟs: h9mczwo÷cz1m_zrkT~`'o>pVVQ/%ek[sD:~m|~?Qqp[Su?4IN.Īa3g,7.-G4Ƴ r]{@;)vqt~lꯙU\T Dgz[K9rI& o nC.qqr㇯m;WΙ}kTZ4PxI`! :yd_KPs9 (haPO,[Yb9'Exmg]K%Cߏ-z~ nH&=gONsʳ"!){g gR{5m=M "{$hBu'=ONK4NZ!T)5H<p T=u'ƨ$׍A"бX1X 냗q>lxػG̼xX:4l䏻8N={D0#]SEsOlIYۃs8YA5L{tp^1Őp7Wۋ3'MǶ! ͌Vmiw;` jѶldV Q`H3~zm Zl{HAE=|h ƩJ;[547! iWqUc}<8jjE < 7 rL7H&Dݠ2X=O&v_6[*m3aCi6wJ+ӆ2ʐ5mmMrT(Rޗ$ԧ6Jt .|8 ݎ]gCF?YqCc:A# Ks:wo:0-$p19u~ r*Z5s5 04nuN=$'\|q0ͿZet; 2xVmS\+**zF+Ֆ#eP~1xT)xΩc6#U^O-UK;b]ZfjxkUKI&a1 Id_}:h/Xz Ҧ4l`$wE6X F@^|c$wbdzmoΨxDD :Y9PER<†FUHHuWWWr]ĭ2Zf(h&`VR4K;SO%2i )oÿ3N: g @a$Q1!Fxk{4Tq[ݠq7Z0O"q(#ďxQ#zi++H8CQƟX/Cl0-_be1˕-­!_.Wb#R/hB p5V[6pV5I?Ay%uHP8mv}W \'z1sG% 7*9Psn,iCw8svlys[KނS K+3fa09甔/ڒj(8pfLuIPմvE fL.:B?`KeWU{ˤI.@+^#iW#S5VPlY$(I tQZDyusPe2~VAjR-jA Y􎛤^e]AZ_70"5|BT 8C.H21i43gTkJl3Cb|;`!Bc 8{zT=%CI5ZrSݓ6M賁6fҟ] W3a ޠ9i-7;}y@%;wl9RmÓA;o;p^qppm@"1aL 誳EIh e1DU=]%6ᠹ!ZvlVԟ@cɧ`eY쯍N~ئ!Wo gVE yF]!$ nR;tY);tt))F_]y8)iCX5X ]\_ ^Z,t[!%ޠMpuiMIXaը1zٛ:@p_H5g҇ߙoxl_.0}1>{v?K9(F$t$+"l'qo3M Hapܴ&<6 œ)xkq%_MFNYFF.J; -̈́!kZD&c7M5B|J7[0avUE7(A8@ *lߎx\?4yf8Zf*޻tW(X`fV ʂQe2ʁ ;r8X6L]3e|o`xT9).%,ps}u fªsu'l 0T~k`Я_ l-{Do^q^G0莋 ZҘQޫ#B.BhmvmN4{viFi;pvpgFIb R [1N6hgef0)`̎ߴsBV 1>6>$H߄ayGKu =VjScX$YTu(@zχ f$/}O1V.ǔ)U< ʁ07y՜YHqT>0wp^d-LUNC[l]*9uw`ݞǖ }@uY=2'niuCa"+gRu8w.'PStQ޶&eNJrqЧgŮK(fzG؋B*)GgB?#h1sv{yk@? /؍@7Ȧ #;n7M{=Zn>sjI^s$Et*5_߳=,ީu 6^?xj;w cU6"mDZ@n.i.@MޝjrEә֋{8=<ScAiRy~0U'98>2n: HuEхVf.<q|&\!mǵSma p^J#0uvyqc2@ f-gW@B+iՏR8fl A/FJ+3*P_lm59;+"/9MKF[2-I' Dl|fG8Ŏ`R9py%6??`}⨧;i:lQC8eʧ" ʕw92oWn+k9[܀v=zpGi֏R)eG&BҀ?\yl CH!O۩ {ɊIt7!RG Gv i#[طBNo JߩxX30(E85m=$0so0DkZ"{;.Є3KɈ2H(*.,'D6J΂S[8xxY=TR`94t[|JNعW7!u@e+JORd﷼~o?l TOz*_F"K0)SEBe=m3 Wo@ 3N ^\2&[,悦;&T܆ۢ˶`/#zw&c>v;~eP~t7MvB w^v=8so|Yt>q)QI}MiLh.Kəlj=VD&FZzLF\3nɲ^siClVoςHwMSJ=9Do~̧̋pf)}ݷ!- TZ =E1C\jT=tEFĠZ$:@w񕖿*h䝵DMBb+-:Ѩ[e 1I _b7W595jrBbWuUJ3/u6P*k&CpbD*tPd豪8M͌oD"[+4"pLu)܀|hҁFn$åǖ fsϴ>g zϗ-)QT}|݅H=dRnTi쌘`'xZM"n.3E"p5*jC4Q uJ`rG}$PruPv.L#ڏ,ݒLTA?:ζ)ą֘΂f&Š`V\) `O3tkI*pm"Uƒ?A܂>}ixap[n.5;*NT~vaK|GLl&'hE,<kkm76R\QMێT}X!,M]؆θ$ Or3mlЯ Fƾ4jj4yƁDG O#ꑦ PHXlE8goBw[U\MwG\.3Z;S7 xI?ICηZ'z!GB)y][&}u($m?Cg?-TWYkQ1kT ſ|d[tB-zPaZIfY385vo' 'r\=`ʐ||CKC `!.ok_MbBF 'Ryf[06BV(]ċak4Dw?{e)VB3 W4EkYy&uh VrN(}\ś.g5Y=1cYԟhEmuLӜ-ڽ ~g;֜r Y8}AbR#aX":OK$sFa%DM"ھ;uYj*@:ј5i=?'K[>VFg-T=ō:Ty)HRݯG =X|=j; q_;΄&:5OY-͠rR:ႚzҎpewY7cit |a4"liM֋/d#uq[YU-8'X`,螻+01z"]t Q2W]Ƒ4U")P,l '֫כZdRqX'tL*J55T39]8 =$Bdž8ot46`|BLHujel7r|5V-0 8EdBE!TZX 5̓(%:(cya[#`>¦ZIʤ #JMPvSIBڝ>$w{&7_DH,/`Xx8WiʐXdǔxd Q H1.fgK*AN v :[jwW7Pz"] 7n"ʌʂR$;:0v֋*[uF*,_x.!_ 7F+z3!Mx,46NN`1]~%oxX;c8:y&]AT2.3χ6:^D"/Hiڦ3m4~j}dx<,cqQVfY7S*`b+Eϲ`zZGd`S&n-eӰ m#,j 8}E05ʄDjńшs ư|a&Y \p->q KҴ+խ`$DH.O]svJ:0Wxu37xP朗ppc?Co28dDLkТ*k&Yo~ ۘ6MG6ڝQ%=wn<36>,y 1),BYԵ'L$:g.1=2` sPKSN2K.+DŽ] *m|3lUSQGd(pnpz&#ABB- =d_^:H zTGyzLAŗ@Qta:R`.q{c?3FrIp-o&H1qLォKLJ G'`´dGng\LHjFz CO)mura@>zҌ]qaQ}~x0xl돹n΍!?EE5(??:ysgCR ټc8r_#-].<C{QޏQq8?^캏9⤖@g_μa`) xqIheE2`F>p~?āq8>[zk)\% <+NsRћZPq^chx̩5:x}`P/.sĩR 2w؊G*d3^ vSloXFo說Ztx_}GU}^cIW#|PNSK2;9CK\F?e7{\F|U&MS99hM^!g:awMZf<;55~cy5"ÈUN[^eWuj''l!ǵ}+OKs@92#1hsPIxe!J ~1?{$ya{fQO&*3f1qM3 Y4U֍*[tP࣫Da tk4 :-i+"u늾HIh2hY)#Pra/m5rHpϮ!ByLN9|<[M FB֮.EbC1jjlnB=~{?Y)aqMY;͎B䔤&v9gWaQV1< 37C"|[u_Agvd]'\v{!8{/@^@\wswI@?ನoq4A߿u^l5[᰽1,3w[ݿ[gC``GZR~toٽpp7= Bٿugiσg?zq}u p9AC0;roی1crkɘ%l3?ߡ3F)}o6jys:@2 ^!}>RY)Fn{7":G]`1hAOg M뾾?[~=Q̑2;Vڱ~MZz?ߡGw;o9Hvwl2[ڦI,IY||[:L㠙x?oQ*+Pw ƱR+O5hI"5&4h̦ 2pZc>(B5ʆ3ͥʲ,ݡ45x*T>ʎe]㘧ݳ,c[2{S#{\1(*ܜWϷACWdj3ḫ92rx^k>?gtS\]@<?qTpTd6Tǔb(QOop9(eHԹ*wZ頱 0Q7oڱzD YHOi:|_zp<)~+i+SrVq{ܗ3[?̖w|ۚe~kNq? { ;1#pzB =1`^t Uu)ƼI% # ahX ܡQ-Lrӫ|F6b@;u n!&Y( ,bTz4/B$W3pe/ɽ:ɻ8_0_noOեp3?Cߋrt 网*lP/ؒ̽v{ okଖk;oW۹w⊫hDW!''h":84m""ʏcȺytx*/+MBD.IV\@7-c(Y F5[8h0jHƱROvT. 3@0:D!eylecy0#8w{4 Xl,)6hh#GՍ9cDMpb>?yQ-{!y?Ʃ4,I?BYIxwIo$E]6<NCL;;wXyfdL[BBH3٤u3S1:Ó1,#1֏kE$G? a4l/XM5 [OfWX| 5=ٷrxwβLo{tk(Rx4iZ\V M+P8 a4#618;?窧+PC]d= ѝX:0$OetN9]''_\լhBrxG BJؙLcF{td:ʷN-@Gi 7qv N0xg4b:]F+564zy)2 ,Ra:6eq54^U5`>>Ya8G̷fv}.ZV v%w0èq45CGm9Q0puEk̬fM` :F&I* M ĚX.@a`g9Xe V&CG⒒-BN!4 w:)*P MNi<D騮^ ( _cg˻*6 '>H@ A08 &mbTQ ,\/@&D4!/"h yfd1>f)GSt+2-uCl7w}-% A;kҢ [ۯye{+GfUH;0&̳H}7XcCZ*z~򼦿'hgW3} u OC`[EbHӶ?Ze(4C|4ؗyD; ܥHsP5.2X_R[TIo+&>Yaes\s{s+؞Db6R;1!X?ruGIUHe*N9 P%WId :E4 t?67V4FҳWX ΩcR4 t̞+n;AŹH51 %w={X2[o֌DHzqӏV93FtY9LVƗo)#>^Iy\?.+W0C! hr <ۛ6w6iSy*x5ǐ̦DKɥbhlmI-w܏FZ~d߽TQgAfԊ#Z/6E>hj2*qDr&.6=&;wE ',FOe*/G4-6ag&|n`K =R٪mle4V; 5>hZ`ta~[]SoidU%2۷9Þ1Tq {9? ʯ|f! wg->L[m-˾]vsDSe>W?{U󩥓~Ɋ9p+y6c5r֤SsOާ+^{rٙv҉ Κ t%IU6^:j 64 &Q]^g`M@,)ܦeC;YI |a{IѢm6OSj$ çcR?]2΢|@0#>?E*J蠄Wdfty@Xlܢ~=fOYeN _sPYz'LUצ+Iw~izy12 (u{b΂VqDGI6=ۮv@'I&ҁL*v WM>',;e1Avj%YPyօ hRuk{:锺9i,ڞQw0L2ec)CFڙpYHb,PM̈Ct؞! sS2i'꡹i큙s4|[5ɺ4 %HKCj3DӆZ,B=bπ=:>hŒZQFFRd .V{O"6Z;wmR/\w_y ĒfJoLL4`V jz[8{y-ɺ=^,$sC>\Wxgj`IbH~1,~7N^,~Ɛ}+ uتVcNˮIg-}VxCk0JVwYJ HL]s1ȅ߂o9}clwjUS1mBk˽v8(@$tG'bw@-UԀA'¾ѻ/3xFS7{"]tқ&f36^,r/+~L'W#M7I5K:/JBGڨe.䛷]У/>FM~3YA9cOt5+:ZLAWjsw}&/]cgݱLp:~F\~5TqR#(tak'PS',^_iUwl]h0X%R<~|ϣ3K>1g3ǝgUo/ zD6$[+ts/U %}fA?kBI[cY߂{f?+v;zџ8kFY:-H'ؖɑJRsE{ڋfAjNtnW!{FL-L|\M/)Ûmޡ~,<<~,oIamc:2//vӨ7Nv-!&T5SZ*4YLdYK&{~~[&M~ϲW) P#7?Lv)BeF.7N-^ƀ;/ G LkBRiUTQTvm~_'yWNT⿉(5LOY׌M4Q40dm<#*kl6;l?̔yS'Pm#/"C_/6"팺i~Vƪٗ0˶Ǥs/s+NE.[M*^eSkV-u[e\N5_iv~%;k蛍[#8NUF-7Ӽſv+6蛧L~ID&MAcjClo'~-HkV-͓ft jV+1,]_J=ߢ7ؠ P|߭mitߺl\^{v}z[!,-!$8,'F2 @i5,1\k< ^@5cpm 2]rn-4M:%OKIGmS|5xh&^2qnXsߜ l.߷ŧΜupj:&mW vF/,T&KZ2Nk}<_]`mlRgizӄӍFfڤMȗO {wf60ߩx!|$z~oG79AtY@t&glcw{7v n0ę:Z 갩wPu |)˴\G8iH*bU2s8~2Wq،f.F-6j\jSx,u- 2]5ҙ+:l&mys'g ͟ pE,Hv G@:̘ mC"  idr$=Ln+ i6&?q[b2ndK|h&} (f[N4NӁ[')-o-w ˊE_a-xrg *_MPɥ*8S$vR5(Pd0t!E#.5`/i*R%a/ N鈷d c0ʋ9Z|zm2., 1SSKD#y-PQIAOx0*X ڑ -ԊjF胙cR]Z#5/nt 8^]>|3]!oHzIN(VK4ȌdpwKgYZQ Yg^ƪ.=yؒ'k8l!u,%2.p'MM#@3fQ lHWMlg^d!A&%%p&oTY=Ϡ k:BԑBjB;FKfL̦1d5pm8MZ<S2'=4>}U慓},dY"UM߽ܶ"KE^@2ZMwF?fRWsɍ7]m*yw a |6,45yJS$y`M6XI)AFrr$ʜ3:PY۝ofcDy$_RY2atrk> OY~4^ 3 Vi2?#K'J݃r0`,^؏耞YG9W5(i3ۏmb!566 VTfzhQ-Ҏ gvZL $xg5#!`rt{wݥRH9'KR%&Hu2Z4Zql{T6zF]ߎK߱Nq*YBcO.h_yFUa7սUY[4ßSE튟UNHUGRAz==qhd3 h장4/ʨO[D )98 ZϥH'5ӯGWw܉hfzMC 6i4ےˑ̹H[SIUЪ5~V~j\)s]97$cWhh@dPn/_JM 6lh.$~:]${i)w1F}_뎼KK;73Rժ3:\JVWڷS)2뉿~,"a\w$Tsh0U:iކhY9Ci)""06xPN9_xC'NtP~N t='E{z N}̡B KCu- Y+JQ+r'i38t|-23ш%y}/s/}7}9zM/D1XB7%馣̝( Ĺ;R- ~}%nG>̖uelhA/d "$7Vz4!{3wa).R { OܪRj,# XebE=Y8De IᰦkJ,UC@h8EHV%_e&XEbôʴ@6Ŷ}1*|ㆄ{L ޼ˏ3V2tFګ\spnNr5֋vvznGBC"roy5,RmSe 'Joi>yhǺLUaT/C [)acP_}P]|_QJGEtfӇsfǮH%r6y6ՃyīnLvd/G$9cޤ<^9Oy{K<]֞†U[#-d(%~1zsTq(0nݿ7I?Jf6Y.EU'/2q? HhLr֒nIy"Q>iC#=)9XڋČFwOZI f`Ę S]~ڳzx-y~uɑ5ow&ˁ.UUa>|{-ew;3Wd˭B%Nqٴ͜ustnzbҾ5 a/Wqw/3ٛG_d^*EkU}Z Yڌ%bӟt%QI%s޳۷OqkO {:n満/(i2S /4\h- 3-ez +!aiCJ"#ؓe*!&hS|I9@* ufh6i霊$r̩GW%f::Ӥ7'I!X^?v /\:BhEQ"|$s889 m +_:Va~`"yyV4;| qQ@pUD SNP)%d ~G~!ײϧ-~OmLp/)Aq3Vva,?8?Lì}>L2kmlK^/A5IPkq \fv6݅%V57>.dn^Ϲ9 66 $_F]|j$$'!O6"t!m*y&Suol!x7iV׿.Q덮עR^PzHNzO׵Mgv/>]gkOTzs$5SJʧɾ@wZW}Z8>9IFsRoKnkfP򓔫Rxadr:Y3(lE&9uQp7|}cDcy_kJK!hYG1!G4Z{TNNѽN;Hk=:Hҭuw3jG{x,V4A:ڧoѩ=Nc"kR?2ݏ83:7)xr(#U{<=ityXhֶԎL;{pu)m=5=]ǥV7i} S™oUI eΧS-xMfp17w# bE({dLo*|@aۿ+̖Fm@w8Ec{]}1{-.8Vٷ_m4ZuNmwk.l{٨efd.]ڛ3ks['´ĿDM(].಄օ+?iGȀKϵ`ZL|oj[VwF/FhE9*.c HAI&3)fH,y8er2wy`]E$p> 5v_{oeV6 㴢OV<#TCȜS._OIUK  D]iw|3=/gs/v/l#iw,9 ׋c`߿̵pEe:XXslb5\j!>֎h).[@0fuQXB?n6"6 .ۄqWTF)S˜vC-N]dT: b"tPVUAxWɐn|z°H[3>=dVsx0$4<x g-*/Ĭmm;p|˘EMgP\c Son]gɍ&,4%3ɓ$0š/2dL$W: fP @q\RNg"O6#+S{ַU%,r]#aWK:Yjls~(~9qaRCć z;Oܦ>υu, |N+ GY.y-yX2屳X Q2Wh  k͋Z5Lݎ^Bv!#?k\ kΞ^Xc(Q㽒tdN9 S~C0Rq?l6JM  z`}-(#X \+2fhD^$(Y?h_~4zF9N+U%lҾ_b, )ɲ.րTmY E|˿p]2lZU+ɚ3~nVI|Eq=FS?YmD8wp e[вa^/^jYT:`w=9_+FԌg}Ͱf> ITgᇶɗuI^N[1@ɰ\ 6^nҭevs?վ'7jh`iW2N\S0δC5s(} ZtsG3}o'Mn8tQHb-@zVonjDݠzg IhlT3ᏭN^6i?A8ͽMG|TEJ{?1'SP гwe~ѱJm!PYii``&z:Yj}goIz6E,( (:&a@&'_>Y=H}-Gevz$Ҍ ם R.->0sgjsL{pi^E:n%3:z#bq0.3~Mn֥_SOC@jͅ8 Ĥ} IkJs10I': :\mP,Gt<Ѭ1(6iQg<-mިY%0ČṻΨn2p?Zlibzypp-17.36.5/tests/data/openSUSE-11.1/suse/setup/descr/packages.gz000066400000000000000000022707641476576476200250710ustar00rootroot00000000000000ۚHpackages[nG}W/ ұ/у(ƨhfb%YKves"TUd L72HS{bqF^wZO9N埓n'.ܟޥ #Fɔ3aP3Q' 瓏~C'{-r"Gh&Fp|C w~~5re"E^O9&iVrtf*wof>ϖ.gw>RT`_aH'7o;5FdPOseŞh6R:fg?üm}Xy?.^.M'H;yMSb#}W?|~dnֹᛧ:Cw~G6 ?ݫ!^u`K5HDB^2Uy_u`Eo{=1H}a F߼]'#qܴ@O~nq}*NAOu'w|'wl\MfnVo&o'zwo?}x돫P1 + p?2FLḴ-}Σb2tO4LUԈ#{Uǜ!gTo37cyV&N@Q&"Y\ߎEgT<L'{Ѷg|G.zA {9Vg.:_ =ˑ^GX%_//.zb=xՓ7GrJrR^oPZ@^^?XR=]ozqGZSu0"˫:o'L[-`d+?RI<&~&숭^*z?_ʷ%~,Ҽ5-!|//H9[Dr$s'uI#Y=\R#)EUN$K%(|gG*Z ad=œMGlSLU5RFbGi6tn'!lB Z zD'qG]ھ*7Tn7a"t2QG$h/rľ 1d{ 8>'[!vV ѻp㮒[90K:8|9Y1十B}/l7i)ʉ3ۛ-XAmeo&@J*xH[c}┘'0aOQRwbfΫއ ߲O+F T;A(M6}M*"ݔvNE>]/;;X.xM*,Y=bgOj+uOnüz*\OUau(i»/OC[*-HAqy2wZYtq,mX}U(yy:%ٷ"Lו3Oǔb9ѹwUHh( iSv:*G[#XmӺ-ǢW!dfp(yM }pϖ!Fy1Ԫ)32S\&ղZEM9n_*R<%nNU_UdR ~^iy9U#u?:?)-"SR`\ڵ#os1{jo >͗FE4MvQ'xUfptfWQ#ԕWpwu&.!D 2͍ zR36qn 9{J<.DU#\of8aC%4HF<mІ=ShAA\U%V%VVPmKz، ʃi_74XŮK}p]9eojtHJhař HhD@Ĥө-`Wp̫E|چxS?ô9 r$I#\"&lLSӁμCx&V5I,H,$,--,ŚhFy7W^!,W>Nby뜉h!9vj.(A+Cx秞VAFL6jm7/Ӑ @ҩk8Σ3c$"ב`ڱʢ跩 Wq+&69 ^aF<@^P2z]6iOA*'A|i;%TH)15,fAT''Y<{jbNà^(K c9&j4P_}3PS{WJ Tf ?Ҝm6r #+*iȫU,zBl9MyH$0n!dTZ=OaA=ķIBsÌ0TҾ l.ձ/a;#o_5 2 UP#rN5mC`Bm>蠂 >GXr-3S>\ץ =̌=0:> [[:1uaTL)B/-SТY s7NᡮE,1]\~MSs GwcY;Eдޱ&}pIU9T0(N(6brA$b j`:E3Ac j^8> }'hFn t6lcuVHSLkxۛ)h!MDݍ$hEeX?uth$R}lky2S,mRZX.rw5RN Nܮi ^ow}!q@,qt9ݩܨx輙ֱ+,,! Z!͏W&Y$ULɳMb;fy :,x!,ϖI o\ǴU62^3v^͆!2 2P&iwj7 a]gމmh9D'!9A۱NDĭtb(=3j(엑h$x:M4lRrLCf^B]_ʷry8:>s @d15~!T2(Fϴ8̼@h VgifF$Y3Vkcݙ("4=ȡ9cdݦr9K"^Pbxū4N sivA“eQlO8CY&7Q.&JYCc ̐x; &2tfUnB@SP*((bKB:o$Tɞq'ƛʄJF"a[<ؕoc{IX4b*xiНX֡CO e6OiK}`=2W&^ `Z m#:ؒ:ނgJY {7w, yVlET8hTloUfU$8r2D,.=W}?mIj~3Q,ٖ<4%8 3l$W{)͔\|j2YuLeJv* &^o7-eFHx -d-Rlzy<*p bvNi< )p(;# f)֏ԟŰ8kRFS5- IbWKCԙZ' qˢqe`!0un$ ,>="GcJm[x*5)pR$Y9c %InSPY K;qMbgzݞ81Lt̙Oarb< 4ehZ,o7 *Z6{ڧ̴[1&`<.,ēd7ӯֺCj<3QHl]<80ÙŁہ@Cxf2t$RFR0pf3k$ (:s#4']IѐM}_I1:gn䓼PeU$L'mDSe]EyzR?imbNݤlcKTyQ-0.>D<!*p 9;*} `osj+;BY#Xp¼fEoYww @,Tg^}L 5loq> fxEQ&'0p~hYp6(:0(@č#)8ySO+ÀG~v"'3w18 XxdA%wLG?)o h ΰɐ(|m_7kaI;X/on'0uѠGm OX[0e1`ܥ +i (?m!|V0xVsc%װ>5(4L(lS7V6-HDE0O)3I$i4"27ĸYi%9[O{oJ7˦X ;0JaAddLM=_ٙA\V/uUAvE1m (bqZ Lem7aJX",Ac>n5\6mX]FC2*RydȬflݶP"İ ^g?EI vp(Z/ew%YУwﴇG`A1|c#)Oʛx(u%2Rv>TJ1" &ܝ 0u RNu +x0PS-RN01+{e"jːo7?ҡ&#dTrݵ/cC6(SB] uԄc_(u&ݞR.S]7br8&Qw|0Iq1xOqQqшK:tU_C:;ilUq+FN۪XyOcX\Qj<&c4&[ݠfU;Gx )X&\kI0Gr%Tc P6: P_7i et$l=?~X,Z[#~H3y5tv  >Ė& 9؆4x{i2@du;\˲b aɔ,L\3+'xNs%!ư>ILp;f `ēHRwVoAK]XK<&{62.M# ̲-2O25_[U+LFA. s)z2S,H=kOM2Ҝc|7~dHluau·lH3[- 88i\pѷbΧhe #e6 1OD$"J(bqg\ SO2j ?xFFfkmc.f@=IFuÝMLVMsy¹Q"S wWTF"Ϻg󯳱dEdߓ(ܭ컄eɯ~P*wuw3=5h!7bOr(SpkR)5!思Q(ڏOT`@7QN]42[Y|s~qҽ;G\hB}[@9WOoYIz}V:bT8:lG0WOƼK7& MuuDјȣA 0&c{ʽ9Af}_;Tп϶m7;!?@^z~Y޹~}}m-cׯ^B`=/ns'{xbSR޴-gmB.kt:Zn+[]{>}@N-0jGgҲxd~eުGX8B`oXRuQbFNyd ɕZDkI;-5yrG'GG\)r 936c*U#3&x )ِ8"V5粠a Ni|q.,I?qz̑)}-39iom L #_CбN?hnstg$>#[ h.cJD,b83j?e@DŽ}l\_\XU"_^[,/mNN3tsUCK~VlZ[T^!\ TϝW]b6e%6T8<}.Ye*` ֍"crFȈCUd*4GbIID93w"uaSyBO.u#l4JJOTtx/,R.uD oix!XB {)۩V&K8#5sYZ9P)3X?SH}K~I/g6+t`^|;YEK>8߷.֒-S2 __Ü1{7^5(JSSq E4[~L;3OjpkeӡNO/ָ ˵nΛQgvoÊ^| x}cѻ~=~$ __/YxT?nQgiIӶ^\7ESЮl / HuZ˼^+Q.>;|n5,jZh:QTƝ:wal AG{j鵥u? f~Ȱ/~죴r ksȜ'惔Z|_VnE1xԁ9OZ\wogPvҩ6Ku'UqWmM%=9P,U$fq< w\u"@ z5˺qfFU*dS=SP}GةL6Zb#9ϱP[>^R#8|닇0##tI[p>z?[y~jExH6L8[2kRwf|TmZذWtm'ɥ_~YAruWRլtp 0e-:]j% u&Bfe>q-w^+U_7 6KX9?Q狴xϼFoʭFEF|]%)9rI*A fֲhRn~F*a*?<0-\59#cUSrM/rzY%yѦ~qwV WM[w4k$ Bsv2SX =΀脈haW018@)!RG0/EBrpL?'tuz/Í+xf̖_D͋:z*fLY+Ke<^8I#?Y2F_!-񌣘*6~go{I`=}8Uё\"qt%}\R jYp$l|=PgIyRFQbxxyPr"NӔxiMC$;k .xBE2vo B7m[%Ihy~*99&4y K!QUz2GpMKnWQw8l:WԂiκmWP6Wrւu!L['d) Sz|?iQnOwC-:|[ DƉSMI R޶dI$p  rDJ瘁@ D¸EhIp'hqoa6CCWHp:ꟃK !G['=w]nA.?9s͖X)v+y:/4[9A c)$˺^Rα8 i,,jV%hv3_AhbI$ߤ96qJZwJb3p>j/ 瓱Afzd7o׎>n3'%wloњ^Hk>LnqZVwQ҇NMƎ&"o"+G`8Nf,TڦH=3]%K`ljN-gfN Ov5OPNL를I e)vє ~M͖̪Eo&J-fM:T*H[jsllٸRM~YҶ4r+.#-;{pw/,|%nOĻŻ-uPc֤m&O5{ڼõ*'cQ[9MTH-ǷNo Ձ(lǪ fK2ڝ;9yb2@W&}"Чj+z0dE<-ISr]GM Wk*A3ox;Op`!`" 0e&$~=Ӛ ^u95ΖH/]ഫbd^,jd"OAeXӁt(.OLW { DU(rRrc^]ב fvkUJ*DcgE )Hb@PP dOBH&B%k#Ze6T+*0=MTL"ʐ)fPLQPJ0B@HסW[m|vzR3V~Cdv|8!b!Tn3d(Ib꫔ e)RZ) cJ$"ed$Ռ^aË2 Aq~ kj_n$p0CHuΆ ]> ˿հ?ҏ.SB`!h!d!l!b!WZY"y?iN{nnO?a%Y !oڼ`Яap!>郏ezgݠ߫Ǐ#O/2 Ά)W%tޝ(mAɇ/ A=B4^`̰~C -ʂ @.κDLta0|o@%M2qG#Es.Aj‚J:,<;8PXbî @WbĵFBRzrUBWY* ]eR_ꚠ ꥶ^c3[1e,/?}G [ȦBBe A ٲܖ@M2sMBhAn3vR9(!Ph!j![An'vNm}vt"B6clp;\pv Ph!I~ dk,\5l+VhgP +. v2-sM0Aq!Ë^HTi|\#T\ktpKs 6^p%*X5 W0R ViHJ*0>"*HFP'Zx($jܰ܃FT)opQb >YB{=8WƼgAg]ϯ..%1! gT__ d`hapm oMb%VA}]eou 8W׽Cp؝ ZۦpA">]-DCiȌl'*0Xޭ]M!@tvf8ٹZ'H$u0b 1a/;Qe|5#~KQ|\'knsrM|QdU?1/-sY.K l^Ptm8 Z @40Z)XH*0E%T$YH9J2?cU4?sa <8wgGeAa}LJwwW 뀊"I)Er\+XfؔenL'"MLw1 dXdaLI'#!42 +Iُ.XjUif4  r%c8'.lr !g -6b:v>̌e);`ɀR"R tΩ Šjyg!NYvIy`|D_cZat>&J% 7HG`Kdҏ?+[Y97p`HrÌ'XD, 1aQtܡh.j5Oq8Z׫A e(;+ L]2~\k@Mّ_ 9Y=Xytu]jUhIZ϶8[AJ+( S %#eD"MbՎW,1)/@>+'!ڮH,V?` ; VY4ZD*9! ,LY8NADNvs35^- [~-Fղk=܊> =-{/D IL;RXh*#Qs?zU*]j.S1_a"2YEj!G+o&x>N5ԘUZOwc>Q;޵5m+w =کPƍ-?;:I6k'UJm@D$5BR)'T.A׸5 gog*clo_g`;96(`  n3RB.RRZ-fLRFJQqi,2N/}6kb v5h+YT^\Oy 0Ĥ(`H4f!MaQGum{Qh[O-Ԓ5`*3F#0ˌNl~/TQ{1G)"R&|$2 X+L5|+GzhIV# X¥iܡ Y%:>O%FʋyX`؈הIp) @}ywz˥mWW1 ]Jp'' ")+҈IĔ~CSB2~p_~wuZTS6{T9yqӵ|g}dGIY#9K" s;dciH|~mj b FI1eRIsYJ}H| 7p=Κ_w ķ3!Qٔx# hUp[$y4]rp!IBLPzdlAgmݷ?ecuc3f6G*}CjNyF6"$$x*KU*FG,J$҂"x*./$ !-Xul|iN_ױvvNz~j:؇ l9p gMK*Ur@G*{hP ]`WK`(!_/uU&3`2RIaA$!F1eIbQI!3xs2wtRzYFv[ Yojfn _۠/Ul'kėNV5 1VcwӈWXDx=HThS4E9/i"/VD.7z"SŦ*dNaWzDV mk0mL,&^f:S1Eg 9igN"pT4SMQ})ں;ٔA@wk넘6M[iLeܞER:> % p۔'Tu}[tC(y(}Xjbos&f}ƢO}c/0J9/l9OF-^SaZS6.".6ٺuie;%[m alStZo @I5W\17L tY:W0i ]+䖤S_Mfj .4YK<;j־K8ɺF|@p 8v C{w~ZNeQNx7W78,a A9x>z6kfl }ml_xFU?:X;=Ypmq['gi<[wEI@"R-{s&GenUnd[Ͱ`[fjoX")eF8Ґ"&*"sQ_hlu_OCM˛/υiǟ&?S`DaOmɾhqW<~ZW/O?;Y=vEÔOGuܞozl`i}f-xY,l+F&՛u9T`ƞ?t[U\;=mlar[My?}nzn>hk?̇ll ĭG;aoIY6n IA^""D.9\k r?)1~ȆΕHJl& QH%§~ nD zo4w0B]ej% 㷛T]Sjcfú[* 'e6<VY'Z`9űF˄u+ʐ#DĕFX!D5~|ݪ2pX@ ".gy%GaELܭ0ڳWr `c-Ҕm@%m6Kw"s tji/ͳ]!,3Kͪ2mDڬTc:o-)*;]fX]T|4m>yGP|VK㦦l% BG{ շv3=AeJ?lϧ1>rz|[ ط]w> sbRK7 Z4I(`F41$!!5mæ=4WfWNۨ\9l񸬣s7,\HSd7n-À0CKZ}VyXB ZBBYb"M5Fp#\O[[-Xsjч WzzʵgA[gTX۳:Y/ g87}YƜ7̞&0{/ r}>BhN?(IB 4TBIÐN(3"&,^娾ӯiLCީ7pmVG>>,ڬ/`]cűW%JUƲ?]t #tA_Ç-Ɔ3"CzɝB1ˍ20Ό C$aiHdĵS|#A "ߟ0/G;jzv ɻ2m=A[ RlC-fno/SL:[,vQ'Mxj]Ru/9 Vv'²1TF, ("}1Npxll4CDRB"X"#c穎0Fl{zQ  ZaA ;a7 {U,#8BF⢘9tsuǖT̒8Rat 0X14ކkIL_v񼥺n?w0itZ݄Gh+&ڄE1N LmC]w]Goأ1TF?_k{kNc#T1'b5AkBD  02a8S$tZ ]6DϯKIc)qXE JG,$Cvj Z[\~Z8\ ]F :uЌxݩ E,\&aS5o$Sn9ESyH|lfP)Cg}7׎hL\<=!8+bN CL"`$I)f"w0OS b;-t]eAog)_H3*&<[NϞY' =`#S,DD( _hATu0Ik$XUQiSSh(0!ǔ(nOO7i_]#|V-)s E픇Ԣ9q9UkX4 S(QFI*#nF+$k_;2ի+#O>Zzݩ'`js[8+n:HtD/S+ǹ oKl3:9*e{ o,iDBG*DP2#ow9usjM `C«~ !93[Mr-}9.YEh$[c%Fv~`zu`Cxzeғ8(t/G1h3ln:Zg.\ʇ4*ۄ|%l+*-Q;2𱽗tP}u'q`.-)!AbdTlzoh_]zay^^Mѱlmo`tIK*cS"\Z;ȲGQG0sNJt 3" ]4vJ&H+(I6ZDRichd =D@?VjA'Hզ{MM{)/Ru$9^F.Ӥ SjAޤF|R zjWbTPoR=%ծ4v>şA>N)T:MD2dKLp*5Ps.y)'qQH+Hp_ʩƇS? N5~j|8\ĩoh{PyRhA6Et6E良(ORC\@#rOxE OSLQyStC)'E] B)@ȗEPKE[8A=&6i4|Yn?cQ&ا\+CQ%^FSE?i)aX,<[jU)U%)r=**uQ\EU)¢:ѭEUILEUE'`_T{FPQKE-\Tu5zhQz*%喊j2ݟZuGDTijjeHiZ4!agEUEUIG\(Jf*Jd]T;*hQU :໰Dt+*xQUSQ"pQ!E1՞TTuRpQ=3An4U] )ZTޢJpIt0=ojo(I^^'< (!Yd,F~kPTXTtdDEsUp( HDU%1U)՞RT}QAEUw.3FsQՐEU-[*(Nu{yMOpNc,_N'A~Q{Ia/TZS!O>ßx}6< {vO>x}v|uwaMVSO>Cx}yg'^x}? ZSx}|g'^x}'^OF4 ("N;&1UiD㐱(L"U&(R>MEuUPTTTȺv.PQUѢEuwaQVTU$*ECjc/=#CQեzfUh.RT[=JEQrKEuCh>vz! CMMrZQЬߵeX:]31[;mqtat#7mhkqh꿕>Z~(f arB?`qyyvy@Pꍠ'0:€F`@6c.No3`j rBf^0K( (˨b?,|>I_%Z%ZIGJ\(Jf*Jd];D+hV =໰DDt+*xVS"p!%1ؗTuDRp>3AKn4h] )ѭZޢDKpM(F(r'n`I T hrY3I08Mc~KB/wWîHufiʮ?Z (TjUq.{LN٭啨2նRmSeO nJ7wR8/5b @Mֶꕍn[gK^Eg{8>3e:iYmt[-i!vߝҕzR=~=dԮobjwk_SԖlƀ.[)~k&ժպK7J+jE2!mJEE,D74K6zq$Op  "(^e7}BBl'vM3{o˷\2u"k@;xYYbq<FE`?H)za7v@7lD'jVSo^E'Bh/\z>>!ܜ<ܸὭ=rxވS._>x{J-.8y5El\ۉקnti(%/VOh-j*$Wl'b^m[/|qus6k"kqV}eby*tkir&խ7U`=T(n^+y+wmo>jLzמt_hYֶGVR3ʎg6c!F}aƎ*yV_Ϯ&h8+%]n_8?U4Ak(UYh54국v;iJI_kkzvBR |վ?Ezxm#QWjdzıxyj 0فE=K31Z6o&sa?k:,'ikX؏b{"Ni"ѐMJjvW)kzTtʿRơF\CDt#ZM_GoZʲ߮g-ցuL}WIH\ڱ5dcEJI9mNn(g^iDQ_h^\)0 -=ң>^{ SvwΜC@>F J(.|Ȳ3!>f<#LЌD}4tj әlRB}4#"PmA}t;Ѣp>] ;ԧ8SN}2>mOP%SO#>}8iԧUOk0SV >D}4:3#`fSlt\B}z~iO/ G.>o>R>RkI}@}jH(z'cGB,Y#Uctˆ)KÐOqܒp FÍԇp+íQnE}=&AԇPD}.[s4S.9>GhbӹGsOgPچMGsOq>ݕ#8QmC}4ԧ>ÝcXRN}w>D}píS@} mSnK}@áԇC>F}5RnA}ԇRD}ԇ>ܞpԇPn>J} E}8 c/ S`1`/Ic 4E &5M$^ G~8QZ#Q*8QrQ: ##uG)FRO㘰Ta0bcZm}e (((Q Q"kӹ,Ogt>Z{әmOb>hn  اS[`d}t'hOhn 죻ܱ}43ba>p@h> QR0j iVا>v*0i f*ا1O5bFg>}}،}j KOo>=#Ű>}#(GMGjGj-O-3`)2`%>R`>Rc>R>%#(q-F> h cz/18H?i4G9 0fP0xه۽ه-Áo7p}8>|7}8>>>fz7هCÝӹloB8`7t.0y.v>o0cfNm};7hvWsћ}4 >Z(>] Kcf}-Mooi=cfwxOc>7*8٧U±ś}8>f}yه[ه_f߄}&xO/qz>fnfnf{هMo7p}8>|>>+^lEDO("A~Ѩh2=Ecߋ(F!Q$N8 R?%0g&_RY'6J1Jl@ljĦDlڎ(Hj+b,cF FFRYeIl:3BlCl:tFs 6ڂt&[b;FHl.Fs[Nl(@b9MÎt>0,F%F6iVĦTM#"6}8iĦUMk0V &6Dl4:3b#`bfbSlt\Blz~iM/ F. 6o"6R%6RkIl@ljH((-MWR@>E|/? &Àx>BPY(KA,{%,y:[,OeA}*O>%ԧ2RH}* &>O>Oe>TFSAOD}.[s4S.9>GhbӹGsOgPچMGsOq>ݕ#8QmC}4ԧ>ÝcXRN}wSQʂT&S9P N}*+SO@}* SOeK}*0lOeA}* ԧRʆT0SYSBSYPjSRʉTR @}* SS F}*ԧ2Q @}*3ԧ>t],2҉Ib@OSПp8 3?yHb$b"XG$tkp^F^Tp^^tF!FyRZw915a5R5ڊ(Q#QQ^&^DּsYk35kt=@^;@F3xM5ɖN(<.F;. Fw- hg^Ű5k:3Q!FɁѾki=^`^#@^HxM3kZ8iU`^̼UyMcFk5kj!H!(2^#kzZG^ӋakF(Q xx@yZiZf5Rd5J2kkkk+JqKtRq 0f7p $J"% aR <3IiiV{8QZ#Q*8QrQ: N#N#uF)F9R8M8Tq0rsZmie(((Q Q"kNӹ,9Mgt4Z{Nәm8Mr4؞hn  NS[pdit'hN9Mhn N9i43bq4řӨpN@Nh4ӴQR0j iV4vӴ*0i fN*18M5rFg4iiij K8Mo4=#Ű4}#(FMFjFj-98M-3p)2p%4R`4Rc4R4%N#lƧ@)833q}8O؋RF1<E$@(Rr?Mu{Ŏ<38QZ#Q*8QrQ: ##uG)FRO㘨TQ0RSZmE}e(((Q Q"kӹ,Ogt>Z{әmOR>؞hn  ԧS[PdK}t'hOhn ꣻܩH}43bQ>řp@hߦ>QR0j iVԧ>v*0i f*ԧ1O5RFg>@}L}L}j KOo>=#Ű>}#(GMGjGj-O-3P)2P%>R`>Rc>R>% spS/Q)&1P>Jhq3yQs}v9&s5rs%p4R4R7ib(Ժ9M?HQ#*8VFY89Rr0q%4˒tFgN4نt.(N9r4i:LFwB9q4ݑt\84˝hQFs8s.|`NY9 4J4mN8Mp%srFjiqNj9Ms`4i4Z#itfNS F F͜p鸄N:r^ N7B9r]iii֒H 2"Q1N#&N#5N#% NS_)P[4dPD8X( hLi !^NPy(XdIQI{ casi1Mai )0M4%)0bˆi )&4)1M4)1Ma4FLS@0Mi.[Ls4c.904GhbLӹFs0Mg`M֘Fs1Mq4#8ami44cXbiwLSa&LS8`i +LS1Mi LS0Mai 0)l1Mai )b0LSXcBLSX`bLSb bi LSci )̘0ai 3)4ma8z$XaOiJbG,g!JSqcsyJhh~t4)A4%ӔriJ#)8MiiJ)8MiiJ)A4riJ'Nӹ,9Mgt4Z{Nәm8Mr4؞hn  NS[pdit'hN9Mhn N9i43bq4řӔv4Ӕ8MiiJ8)8M3iZ8iU`N̜U9MiiJ )r҆Ӕ0NSZsBN8MOiz1l8M4兜p҂ӔqiJ3)MpiJ()9My[4q/~!d>Miz)qF^G!爡0ȃ3?#%18NwN8|ɒtu 3jAzu "n2E8 bKـ:[gKGY{ IsKI>,8ٖQ DlX.RqL4DY-PWB_DC`z:(ӼbeYP;MFiNVhm1iP}ҝnlwVnNv+`x]ł0^lx[džBųx^,n<U/CA@YfQVhi޺^`0<᧻=7JF϶qZۆ;=_GagQ+z/[8[ٳr=;= ^ی%= т±iv?[_ołku(Lւt#,vԹBaeu8ւh U(Bhv\$ycXxߝ1 (c(:dv@[܆^6͢ ={Cpno);w!eu Eيq*Eȃk0,8v~*0$,6PfM{Zj ƻ]oeBGdE8.i$^&vG5&>ɉ%S21ޱ;{c5bc%`>R>R7}b(Ժ˱O? HQ#*8VGYưRb0a%>tFg죅>t.(죋b>}:LGwBq>t\>hQGs8c.|`Y >J>mO`%cbFj}qjDZOc`>}4Z#itfS G Gا`:b^ 7Br]}߄}}H 2"Q1##% S_)0[>Wãė'D!$}~}2p3!Iz^bN<)H0Y}nq_GiGGG,Cԍs>J>rӏc>Rm}} }jQ1FTG)LGO>љh!Og> }:b{GwfpNm}:-ѝPy\fw>]-r>Z ܧa}:tgBO}4+zGIGܧZqgqӪܧ5Os>}BB0Qb3e6G:.>=ܧÆP\p7qr>>}}dHHH W㖸ϯO)^1B|lqe Y4^$I|ӐfYD (2Y\ %(͚Uۗ^8z7wql6C$r\Y/~>X,׳<竍։iڕ2 qǸ9bo>&Qzn\W}bM5r,ji;5AnEZ.J5^D׍ut']b@^27jW*h-r=}ZZk}+oYM%^NCQ@9ޑ-bB'Z9I#e^L1 QI#Ѐd8Z%4Д-VָFX%4HhJoД ФФr_FB׿ -_`B5ABㆄ(4n`|;Nf|ܒq'`|ܚ_SwYn3>c{Y.Գd2q ,\(Q1E=ss[rm;zPnSJZr[mJc۔")unS.PnJXnʁ~}|eA`ɧ1$ʐH<1Xprp8PG/Ъ ZeHh8U rJh U LhSB 'j U76X+ӍYdbb]؞Ć9 y&FeIy&9'?<%9H4ؤw,Ħn%5ؔ*)EbSzĦ\t&yb{:H`1B" n̮{)a'jQ̋0$ y<"V{&c M%4tKh.5ф4V M9,['4%4%4׷V{NQ`Abxl;0)$E>SC1}ւK?=]?=_0w0wΌp1Ae8 Iєq=r?0(NiO~VrLsX }Сp<6;jCRv>>sD$1a~Ab!V͎7]8_4ipPC{XLVx;|t2h(#BbB}F(3LI|,yOʙʃߡbn^6p$.ui'i@RE}}4@,>ǁmxѶWskFDdA}9MOW.}k&?q8 gc"FѦ$8e᧏3(Ngjj#a:mT;j@)GUf{&yӴ?l>/Jn6y:e;_hM:.y/~sY34w,GMk[9>Q>OuS"D绌\~sq=1d܇} E&l4` (Eνă<4J9%8WA(_L,KC9Vm/8m>wu73vڜDϛ4.2w'""r6KvȹKȥ$,C0KĵV$_zH]Zߣ4Z w ')@4UCC ).0j{q?yq bky3L8Y9fŽ~[.3g˟?AQ^þ:??nV\Lyww9V_{pSߩ=lJ\$Jy{66tRiLR q"FA,{Cg;7Y\ti22Q#qy 4 T>Bs߳ͭH#MyZb[-?8k~){\ ~u>̷O_'aU @Q,6٪?O^2u/DWRj+)mܧ2oW^x!GyZp*Y[]|i.D}?X)k[ˈlLr/ >~8XQe' pwTԻ ;/9w,~_I_ߵM,j ~xvJԉ|{Pc`GE>^D₌S%R5uT~p0 iFXj( qHOe> xfշE}r-gm/o|pr,d,0fG=9 \ݾfWy~DĹ|ʒDMG|/ԓXޛqmG̩n@L=V NYkjyܧk 0Xr1\}0Ԟ엒$"ľSD(1Jŵag$[O ,jWrQ+7Unnm}̀>X &Ěy.Yi01 -s{ZZTr<S1&8 l&G_>W!e |ŋ(2F\}2C?yʛtqJ Nrpdo%1ĩo 4ӡ/'>^}ރeߓ}m'W/ -Z<-X~\h?"F ?幺fNgq 8ߋ!9H%~1\\a؋( H\J%$ӶiT:y1LRMT߼ڞ^uYc8g7N=QlñӏSYl3yjx(X>?moW^]v ۓmϷZ>b5w|#ǫlɿږն]mKZ[Wږm)ږkmɿZ2򯖌%#jȿZ2"Wj9\-Grq\-WKFՒQpd\-]7Wzղ^x^<]-EWKFՒQtd]-EWKFj9^-GЫzA#ḫzVͷ6ߤ.݀9It+?0eWʳE8E8;~0lv(yXi%F6#{c쐾,} #^ɺ/8/>Zx > !n/r\q}B\|_h* 61]f]vÛƬjD_'^়, <g6CpMm6۽z(f fb;>KJ~˪%%kOW|fU?;yjJbן).)n0SKg֝U_9am *)V[U{>O'giIi[IiuXӟb6v~=4:qN5w:i Nt^[ >qMZd{ϒivm~1]q'>ϛm[p4ٕbO|Tz'n|ӧ"9Yl5};nKOb9'n/|zjP\BylMLI71ip71S<Ol|˕P>?E- zϠzsvc| ;=N[@UK?Yn9XxIl5+JVzá6lmvc\ ng>SiTN7w<ӗ> Lb?l*x<'F 5laGolaM[a~ӛ[4 *ީ䙧jOEQ*,co= G<јI<ՓU',b?g}ُ>GNSOO{W4OO;$:f>k_EU4k_EU4k_{ghZ6s&-|׫_y6,]|>q_~Ney~8ڕpeiiii;PxA&wz]̴?Gي`6A- 47n;xYx5{3؏=m+Y5(yn6l=}(mʳ9&葧=z^]cֲŭ6xO~tv}~ځw? r`6N?Kw:-ǰd1W <O3I-𴽱9gi=yZiOx7mO ӲD-ȿ <1헁+鑧{kVM]t ;޾>*!ҊN\٢N{te9cwltq]iƎ?EF CFO}&g8b9xv+|mB; >m^e[eկ7faޕl=Mi[EtȠ4+.y'?lKٞߋ?b5ڥ{=eER]VlG~d-,_Wv7X]N{t&vfMr`v+]U;jdü}b?STVW;֙M6X?Wi~}t1ۢ=~~,&qN;KMiVAraīX7;_v|! {9 z~ӝ^*Ofuuիv/0vv sg=ѡ+^ޱ_^*l_XnZnnK>Ue=rzlqm3#)DXyQLiyM{eU&/#mkukG+וOۍ]O78Hn}zhpXWI`dTlsrv%=8f[g/.s? ȿ>V*wE6l-SU}BxMIwuPgX' \ȿaw~i[_+& OOlay k͞6PnNnE9%tۨ?t>Ԡevif_yk]lk]l859gez A[ZW@bGlj6Wfޅvp6wpSyKʽ6瞗`eiC,eC,&&TB{U^ګ[ܻ$7\μsbg^Uezch˸LKb*O}썷b ݯLX7=H %FR9H) %>R8H %6R8H) %.R8H %ZS@A!B g+Py5D{ {~{ua[^=ٟYwkʇ+Lw5bzY, %K3*lZT`ͩk mGbt._\nel :Odꕽlt!U,w@oL??i2vA Ҡ"A" .x\]̶~8#2 @G@P6_;3er2 pl?)fF/?h׆& TAkȔ4'4VqCJ臿^li6ͤm!1,үg_-{m:: 8ڜ/>|%#{BXç!ڮZ4Srj^|gZkɆN]}+J3;r!0 ~+M?ͼ0/˜/r"\FlMꂰӟۄP@QD`}nPF,¸P kYNp}[@|$t梔hkhxd071 I L8D"Zk3yL <+!_6bk1Dm%}|Q0d.w~EO$@x@9=PJyezk=D9H$sLW5k$&S-[_dW6˩ӧj І|?Z.> e.c9GJ&1Z^OWWv@6ߌ2*6pSlhC[Ŗ  L#HE!0*eZM1 lGGJFƵJQBTLm(4zvMr+^)rRz9.UaH0X3vJT۴f.cg#$;cGFM!@j@+1\1A RZ;~/'+Ɠf2_nX֩ QXi.<~]+V&uNl=^6Eus=(p*AOڝ o&$ 1 jD'Sc!l97COgfEzY )n""{NPCC_৅TU.bښcmmg쿰EEU ؈N#8',$upFm ĭ0;mD LQkE12v#zCyks6{I])ЩN?.E[; UV?[6EeR 9s nj-sQPj"̀6a"XccRh6ާٮ:Z!w!OyX?yTI[+#QMgo3FS\Tsfcl͉}2cGqňH9R KLbj IӆK&ȵ:q58[꼬Ze\[ ;C:PzU[xffE<#C;2qk>~Lb(a7u7!b jdbI&9d㾅7n@ 0b8E"4"Üe,teUhbC bӑja"{f=~V;1V~͍VL\ YN[ Ý w˻1ᶽڏMs7ܶKX#~B"}YVG6 ! f0<6TkT*悸 [1)Q1ҦRڙ{Vm|x+y #ޖzkʾ-2v]TsSXeU߄誂u䢟Z2N&=*sQI{p8|=uF=B;mõ<{c!@)#c֗p 8Se ;cµ )z.m-]MW.QaЭ꛻lնu7W!E2ۛ݊ѷ>a4(d+`HET(1ÉH8VI2hUYK!ZEy拃aE<2eT_|9GQ1t w,۟Q鞱ZMfeŰbלn6ڌ߸9[]n?r+v2yO_}x:hmů>$wv ˒"Bk',OLY~3?P(` `MHD&A6%a!@x,Q.YSV=i2߄݊Vrжk!][h>|tyE.Z ^і3\QD`퀃㬰HD$V3LS{RJBl5ƕBGm0k=p>anz,4XSF=ְ*T%4& 5&FB)Bbo T'~nfa-t1?8Z&p|.3'E,z<"=lsw j2`1YQ֋5Մ! hLx(M %n9B edh QFZijm?oO| ɦ- >]|/d/_v\XingօPzCꪪdX5BxVr5U.Ÿt˴z,O!ݫ-vZ}jVkrg+/ko![ 2-tu311T&l+}e{!"XN0!"GmGC#DJ4ڡ&;4qמ$_L.晱=C^5lWL\kfpRuecWX0ce<*BQb֣CE%Lkҕ)gz@,>.nSR6׆jʺJuK+ah/A&SKU/Ԇ5^~7_gm&v6W˭1Bm@'3ITJDj(If j+\hs6Ƚ͝!^Q^J҈:Exlcݔ)8c!g*a1qP,4FzfNFZQGOH8 L@t0|?!b)*6@!)C{ "Ä|d n;Z|JNqm0p~~~ @Q!5R" =\l3N6I;-;mcT:~~`I$ 0!pHn-qVOxLxUT9TwmߘR dmB$&DZ #FN#{(rۇ|$\aHFD"*۫펀`9pO|A0 ;agM3ZkCZX0hQClt[htؘ/x ́2Fip{RP+1M6XܴhXmЈdgޕqd+c&Huq4@#LƳĻEuJ(R`S>v0n}uVW~WQ2`UgB~G8PPii Ҁ=GYnh ks[if&uazDž薑FA -W4~c!il"4EAc&BxFYptSH8!a/eFmi2-Qo)_VA GSnVf3) "3c߬É7+h, C3T+wQNstK<蓬ٲa\ğYsΟ>_ZwY*_&$˫@mOhÞ|NsK FCQvr7yI AO:F W KK53i{k8?9@]NZyߵQg2 oCa1g)0Ք c<30 *:j{cy1 @픰8*]$,OK:#O/Ƹ ͂1ZKPUrMquIߎnF.A5/~rȈ]X)Gvb29EAN#b[U`Z2D&0"B[ue7I3fZ@c@GG2b"dTINW*K7@eNNQ6p%tkc8wH)pt@ݕ%=byZ=,˫f[U5x]Qz rTs}%%ͯIl^-Yp磧>\V,G w_{yxXd_dZ8\\_^&;qvpaJ-qefz'PNVV]OC^kW-xԒMcܸI>>ʪ-0Ssx)j7KE9 Q"t 15S`twd#swiJPyN AUJϫzn6.W-7l՟*v3,X aac9n/s!))a#jR{Ny$i0hsBdD)2K,Ӈ=vp*)3RRVL&: ?Ĥ;nj259eL>U¢jMcj P%H BSi@}m.o#-2h{@[EZv74 %P_5yi7iTU+л\-7)Nh<x^ml^,iq9Rokjjl8`{M>wB𘋨SDDAVwY+S*mFL%CI,2X (Y{taY`>:@%!T{1v9xpz5xp6<qފύyfN͟]]&!!Ie"@9Xm΀+(ͦA&P".k`_2c" czR+MYc "c8L2`o-e%Q &ly@!d>t0ij績Q6i~۷O鼬krg63m xޥ&n@t*(iF;AF {YmH ېf2t/YVs̴#0 EPXI@sPx& >nM齩6dl |/3q!OO.(ir^Uli)Z+?_YR ϫq\zC֣u\5w ׾Qmej-^r NA);=U]_@rE.=F1o3 ?ח7diH ;F}3GsCZ?rnƦD^"kI^{’E4|<;+aki7GV 0Yh&xR-0ޤL!4PkT`^Ka5SP)j=rJ4l6ݦ(_ʟͺwDLw̱ZH8i)=0k6> @kݏ zC'-g&ђs ZDMu04`0 SƑ "xǞ ?+m\sJ`@j1Y qY=i浬絹yzCkwtܼ-혐#/[eg'B O `iAe?TozR?u-_6V}|_afW0XyکQ+.*Tyr[NXժt+*@'WLǀ2Eo*&9hndL ۆc:&vL(8˶(MB|At281ՊheFS8$%ɰܩ]GERa МV^)6,9i"s2Z<UpM].ڥ a=Z)p:ZlL}'S#@͍-O:t,:z _6f ))bJpQ̗[mx 3_~Ug,LqJZ=U+G;`);aSա.pA$ ]Zfe9AHR aFwncJ&.)E4n'M`wJBЂPJ".fJ<Mlyq9HuaE<9If {K=QFin0;@F5axJÝe;2f"+9%'tŴ؎@G\H{S c[*ݿU`D$Z  r*']f}'P5;1m{ug4e\wksn&RJ̲939CȎfRe)x~ٱ3qmv y؍[-a?k2C@ =M1FM՞l' ʚpq+wQ-hg[Uvy\76Qv> ((CN9W:tnL$*]3V "aA/Scđاr79aly}M!qxӃx+gTh(h|C3RH<3I'6F+J(K Zk]jZZOӟB>m)f<)RVv߫/`˧qmNj^oN+YhW{*n꓌~ۭP\\vMʰ(O0BzR.L\}1yǞI$hGB@RyL"ӣ$П\jt$کnvᲞ,N8e<ӭ<c\u6 HENJR$UNv<yfqlZVDrF^e=5 `yo#B1x-=4M@6HqtԨLT2%VRSc~Ύ\':q`D.\I\ڏ>nv|;(ŧ u"ҧ&iH=NhDk'LRjBmXA)ZRQM`.V'GCNL#8*p\hub^!s㲔{G*|u\Gv֋;xJbs3 Gue"dTRmH&Z2ZVҜ7i 1))*D7#PG"b"ȶ:kT^rVmC˦D(,]x.>|yj5/~}ji/7᭭|IxzznyN|H=%}o/-Z9徲f88CCF?_RF93XRB Ii]Gm:i`,ODqgjo;ر_0GlC޳ޟIwBZ=v '=x̍Z8RZ"hLj%6KX9bKo~ a%ʮ w˿lYDxhvo0[ 'ŬJaZt eeɉٯb tʹhm~5Dqn:HKWa%?w^~})Esog0VQ u/+Ios5kcE3h<'KV@pk#\9p0֖dU["$^KhAZw_#/Ppk#!^erx))Dg$dF c@nOOӰN3D8#s ֳ޷x}z驏x}z6쌝fp/ g Tv"TbƐLhJdMUasՄ՛>'`gE{v\:hI(̶v|BP|VQG6x0ls!n.Te#^S|h@+ˢ En3{%%&B٨֡ux!Q]nຍnc.ẍa̋IOh1zN\Y%Ov3Om[ W1CVoʈr|ٹtpVljpar&!1`P k{>/"2V>juFbG* k(蠠u>zgg뤿쐜ֱSz4ON1-99B!m7|tj*iFdJOȺWvԺiL?c#lf_eNP%llAk,:b!*7ufc}5%I<t'䕱pЪK,iN#0ϥ&WʕSX'; \Aۈ2$[-2V>_v ƪjg ͐ia.x?]e.ZJy攂{u*S1T]VYkgCA[oxMV겂&b1 ̌u-xݥIagXoA,%α)6(Mh 2uCyeu&uW+]S.iǓíS֪t6+sR͊z]QW+8=UVДHV0g2'nz-oX` #ДLɲd.`;n˞w[.-ޭn9[]vVFXI`=TUsљC\蔒]"lkcTe#^뤠ώWyfgΰ/k92R S- ԜY,IB:*J9_Qm:LMNk9@,)3N.T$^26ANޫeLYkƃ4ώקImy O̖]ԕNlsIH;8]f"V 7i<;;]95ZneNYy:,>0Z0% - &1-^ ],d}v>O48efUӊ ]k,TH3yUWvo=滅kŃ,meQ+O,zE91El3b:䛑0F#8 W 2(rȫo=仃07Y<;yQpN",{o 3mYL*f0j.# UI(ۡ #aYJ9Eu xDdvVI2S<*mԋ"k\)$&;gb}*d@-]}DWzcm$'K`wUڝZ_2.NIx1&K>kd!\ t~ǤPZ?},!u&/ -TY}zR5AI9Tk)+eߛq2xRӢDdx/Ke[WR#b8& q~X XV^G-a.F>i&7NmDs8C2yq4I\end_؆h4*\++}T"6E@qJ2O; #|-mW-uL)bBI@TF2d d.]=xv'5~|/am SۓxjlSyyoVc*|;Zlkq,X3󘵗PBEQИkE*=~Xtމtez9~E=ڰK@C xٙ 3;oF)R}oDKEiP0j:_ŕ_f[P?YܴeZ ^ru1OCUI鑿ާǟ<gb"9EH 4 ̭'p۳ TM/sxL;]Nlf @.!ubwuƕb*ҫ]*GXBg$xY [Bcy6ڋՁ?Jk͘QRRyE&.SY@vv ֗L_) {{Jl \ni.eC%gV5Dv)vjsƱ: 'hE|6`r " ' .S^^aڡ#^tnb9?& Q(Ӛ+#u1f|`YD F"<<6NsQ ! KX`DRI'(K)RA n"XOhʳ/1i0@ L' 4R²cJ:cԂ^Gu HAꤳeMPR? gurj@n4WWuW,q# 5إRd u# %Q9]HLdx"9x匐1'<l׳xփJSTm5}GaT{p@ h$SfXmWW5TG'ۇql`ۦao:FIk'0G;#a쫥kCmWBu~؛h]Pb3Qq n*ʩ'3X,EL0j2]^Tiq'9r,=:x7z+_zK\ Wduw]Vrգ|/cׯ\\?j ī[LnuL%\ZUJ).(YXjrs[˶b7?*U~f'?N@\ǵȟz?v}c~8 d̲l>:caY]-]_O}uy9ߔ˴51`SܔccʹC]K{{ܽC'r^~b{fD\vђa`bLJ9G:1EC"iY |?sfnwRNZ}_v/KkɇU,?]d5Iah)wp[ϴl4m ]&Z 5 "_]YA.erJk1IK$soF ɭƃ#T<^XKr8U)o٢/߽CodEn7r{ysDkn7{]Rs)_h"IIxbyBS Z]NA˼ ͛4}S=7_^a~ #ǁe=^;۩ x.,=10ԿWAiE$`@P;@?&dD%s)H31,1@tW4砠7R)Q0~~׿7#u ~L U@RSȇO v)+>gH4gH6#;ssN%JtHsύ9~;0 .Lj~晲5@nK( d4ZM.P7h` --"cOXb,h0o a[Lgfi[q1FכUmZg@wW@bW_H•qӈ.V&-Y*9_1}?})֍B/IqWZLrt{֤ L8t PlXp5@=zqH{$K4-; t~#`_cK6ˁ.`y,1ŭJj$qN[ GYZWr 0-&pee~/[8Aߊbp=7+Z+I­̖ ܟ]X+-7mm*Յ?꣫[*/jC}TzVF<0.K xD+.L*`&򎳨)_eVch;qa~?3 -yIs"BzTCRS̳I-q¢% ENGw醗ZҚFGr;>zV4wr; ̢.Jdh 9xg>5)Kt@kNr`R _Zq9Kd;Eb) +M$тQgmn>6ݡ7I4Y1q/m֒_xiNڈ8$q9+b*PaBX^[W*va?=U[ж݆MA /1C3t\۽ǚDY65=H0GA #bHP

Sdnd%@Ҩd}Σ~S3M_L&$7fa]t!4UNjwHG3^ꏷBqtJxgjMYw8^h-Vlپ3E6i7tQlNCx{tNG^߾cfŞ:Q:}F@x4d{,XnXO>KWf/@eWz,үc9l/vjܬ.6eʫT ?]YT֋[=<XotH\&u̕rMZZk# VKm(lׅ-YQ,p𻛠ӋMt[\O&6+귕c4wk*קuG!Я_L9hΘX'rO_Yz2TʀP&KiWN}v*{_\/@M5>ճ\G܃շ֭#8کQ;ymV\AGu20*c'19n<v42$v{?E||cY}rO7\fɵFHV YN!-^)= .r ${Q}''-} Ѭ\B^.GI c Uz_xnf9Bo'p.ӷ°3G@N΢50T+c`asy%[ Rp*r \>˨{}K[3ȷA!H &/2@箁GJ} fyAuk#A:];7wfs&p۲ǹxZաn"MJ9+%1jtגy]tǷ]jrm.zS?cS.E9`͝'Eהr=1!L`lwT\ _ HB.b!&!U$ EBFƃ]_MX2}?l>iXW򿕔;`]F,G&<$5yS{;=M1r3OA's~V^'r 8@h CWClMdQ1T6IƵ8KfۣzSꖀl1«3ͽLY+MĆD2b1mO^ R(6$PI(4Jɺ8@= tj \|o0Yg}ȖWlC7){n؛m4L] t~*,C#4,» Hd]ZTy;+!/ެ]*us(J˅| gd5ˤg/,C(,H-aŜ3*)[ʾfq}b>(/ynuueuF1t0#:!8xԓGC#fƐ1H5,r쇥J~ iAvcԏ1p4q8>p8N!CFͻ%(2qTǁ"U(_P5ȹU >:~0Y-Ae/< G;{n\F(4?R}T<l (zj CNddY* $0#&!q =<$ B#$#/7/o'r6O e"G1h 3 6J;*J)ߦ40^/)8ҖF`iMAD֑ Xa$ & *)p-n),A^@ݱ$co2E\E)Tĸ&hČBkI $ AsC(g-J+x.8K?qOg$)j C80ѽA)XGiBE9QL@ LW@+imhÄ\OQ7#N$  p mUҹ?haajl<,;7++ap 3 !s PQCEbH "b4{9گï7tol1 yJpl+{%d-%1j CiGb$RXڸ xMJù/k:, yO\P4v1uO9Z* f.rNb.YH8 1Vbs³4_F23* xAӊ(#JQ_.~yW^Up?f\&q\Y0zɶCyGngm$,R`%kc/̖i?jn_V*]*?@#)\/|<LÝx7s&\= Wb|HL8BoɎH`Sn TPpBayAeX K]Zg^O(iK- an1{M1o΋mA IϮ ۝ D)Gy_U|ͳ$9!Á!`:PbE;phEEIsQl)Ս2=?5,Ԑ&YW^ٮPЭ{LP}g ZCpD֋l,KzD5ȨH+͠*s#m00V^Zlڄ%*_#\}3-Uu\h=w\es6UY־bדaصnA7"U'b/C7%C뎐>I,!}GxY9rSXJ;:b<rKD7%Mf n(djv=hF*PU&2,] 84)F'_u.uJ-נ9R뽪{a waUpIBm!F,ENCb^˹d^;Z9CB\{bCʵ` x [Kq2Wi@M`%!*YqSXzō.^Wqk:o:VɄJ@U ,ZDr\A,f,=҃0?b$=w]Dû l)޸6 Dax%$<:T=^8`p6#b.8_9B4%?^Lf|dX]pgr`.H۳ߧF%h9g%}`*b<tފhC> n}?$]Ý..U3^iQp":4FE0>ϵ~>OՉ%dzeyN}q]N!A?~#4ybS&bGŽQAM H„ѩ,UB_-u]qǛGDt;#*8H9ܴoN%Q(0EQڼ2 91u#@vܛ??tNkLJПgɽ.#FϷ=%yn؃@s5B(Ù+5aF6/{$Dn>0i4S;vwcmdѡJG%W>ӹ^;9jޙzVJ?Fש°3 uN, ZAyИ3j[sv/VkuVuVAzYj#Ax-X^-38ɝmÕn)0|r\i3 ?|/{ ZV~Y|[Atӹ1_Nld'*~\t`%T4 V>S OSԝܴMfQ(1RaLI{4%N9{"'U5c-ȧmjh!Z 9;dJ<ucƇ"lp8OS+ZSmJZ OUpUy D%gZзX+_Zh-婻 pAZKQ@ȕU:y_)y^'^'Ux>k:3<柇k뜻4Fh-4Q#ѹRBP+aʸ~ji,6>.> W}\[K\-A*5LVCbm(UH΁7\1mm]zQ/9AyH~s$X&yZ$yZ#I̱DFa|tIU!Hp6hIHKWMu./ Xj! JP"Lp=׊y]Xٴ6V֤Yļ6V6}-wKC:5`2- 4)J'Y@{kuO~d2;O:9Z~n1B l!F71:[@O,>+mjsMZ%g]* mKTKU)LOQC>KStR68BZY>A km9YNV6|=^UAM%g-n}pNkeH2b,!kC əFb:,z#?Yb {Jʚ>3ާHrm ,&IF[+9零*A͢yl& loku6ksv:lWE= yT>?-LfFh%U\2qS`0JȒwL2bNw-Jbٙu1WDyj|1o>qyËMޏ)c,T}Be84}1  e<]qryGtH9~{Q˺>>,=Hݏ[q:Uf3$HT4:Lx4QMP! p8&h: /O\@3R L;D9*0`#m sNЙ:m7FF%.TrUYm8{xXS~3|5ѸT޿ʷeXfŻ[/ʿ6ܕJ]=qp\4{mݑi|t7)xUR۪d>/}xVe__qay4{r5/ h,%[sv~62R;m6yC3Zf({epQf@-Q܂@Q1}9p%#&9'5=6OZ/l\`&鱒>pupm~g{Gң9(޹ܱ_kZfL@Q!GŽyy-yI/U0Dn 2BH ]zIAm$m[М=0/[l~77?oS_bȾ[ fK@vZN&{%[,7MϰɻLa|p@3<+->m3+12^hi7=I<: 6kITIvH-7D]`wUba%rGD uԉJ)4}βUpW+yG$>+z:Iɷx?|nK6 ws8cZG]:B 0DJ1ƺG^K|g؅uP NuCI6D*M3m=U2鷏zsTiAs2 HX~?=OY_O`O#BLQEԊpn׊%"I"bKwW̦Yy6qXJiedc ISt>Z7Wu]e;؄::I0 #6<$qȑ(:H9X mɕ@qDžVWbRQkK q\rs_  BēATx8v-h:2iAW~<ơjI((Ac' u "AqDž)=Fո,+ej\ܨb)X^f< {QNryQ Qv0S ́$ M@,w V{v-C; R0GͲ MńSR[XIg1qq(.4&,E(&XG.'!jRFC-^Yt@:}*s[V6T[b6d'2ߤm^1CHUZܾXMйW0IpyXP 6 2J %N2e.FK -HGT~YZNS+=w0Tbϫ:\N9!9 殭[|ݣQttl7H.l@X۠a׹P4_zuY-:0N8wj&Gĥ,ux7!pAQ*5ƙf=UZ[N:B;ۚ[rvD›]J}>h@ xuq+rt|V. NIQ=͍H oigvѠX37 鈅q8ƄMA?OYȅtCN2(fbar9\oyR4)[W`;n pj'ӯ'ؘڍWsJ@n Zf#en.;eaEӘЦ :d ӘSBsXk!^g{Hj9SS]aa4Sr].A}?ev:mT^ߓߌntw2/ SXM^9 ,.:p#8zrxG%A@$/ Q0C j ,URe$=#K,0N+QӐ癧h)Vž`y]R&,׭P<)iFxAF>ry, YXBp@Tp%H,IlX@D)y `Hy}\DvZ1|ȯv֋7<#)A'}4R/jI/Ԝ4|OlTzjo 6Eo4}*WV~O&Mۼj }0۸Qo2˖+mE4ǝ([˥Nf *(11R"Š'Th ǧ zV4r$ h5 0| E+QTfJt^hӋЙR4h 1rX]pD+ iFkL k#B$B%.NsS<;'oKxy'Aub{kQۡS[R |"R׹9 &[PUR,@t#, :͜,H5-/ ˱g=FWѴm$8驴mhc_ .3 ÎqsaA2,(9)4&Z0eVٹջPK:ǡYͅs:=wT'nKs/-J(R(ȼG)wvʃ+֊4KcE6[^ SgC +|\gŃX2kcl#O'~xψUۛMڡu hl΁IqT{,LAS8f`)&%)2.qS̊6{oÿ%j XڦwG!絿ޭC 8FD7 .A$M8 1f^݅?d4F &[_FLIR2kH܏x2Oz#8 A$cA9+.rey9wZ vxȘ<~lXJ1ai`2(m֡ݞ=ya,WՓοa&_0W__=_7"~G =&wtP m~',C#ry nAHo/3";j ׎GNaEuc)X.6I-vAd~9ߡׇ;w:^_Чu7~7S^0fFI5 E>mnCpv.n ez(<ڼg`/"D,>F|uS"'b}ݑY(peS:/71֥lRjQ(ӼVE1c/ٳ]U uss|w?ܹݡ뿐X,99. uPWO >/U#t~q/׎68 &31ɫ*u ÎÍI >LmL209˒XYèΐTl)i]|8K pm/@w=W0諬(5%kfrk~t/^~z;Ŗ|u׎6}  %~3oCƈ$hj,a 4,hlcaa"U gRR)ͬ_=<>oC '[:yyjaoӮ]%hav~h@!FdhX~CfS>1$XnTCljP:sc#fq&z]6e٣YCۨ큛 |7;=1i I")?&yJ-sAX)+rDDLkdu* PH-RTJgH/$>VTsc;hm,/Eq0ӣ|.ՕM)*,ܠdR3L@1 u%EX`|Fj ԗ|t?cOqqCMkvJ͊䶽trZgFK}|AIԵi4T0G ʽ 5J{R.$\52rJy>ZޚwBcxXn"ڰ+2@1JG8 T9PQ]d-Dg8}aJ9U*0`^5f=@%:\^*Yß>Jx^2_pcśb]̲ 7zήQYHXd1A+ۅYϊ{8މQō3܎JrnR%f)+i7F?2F5T `OdѺQY(Řh#F UL(Pr XQYE.)Ě2-0:1$X)D8*}@V:\y_¨q1$j ,/:<#WӺ+vGBd D.Q,pl5"S44)"&YB(0tҒЌv+&].bۺ]+fV1$S>{jZbjN}Agdk2]׹mU캟,MuU.L[L*nk G}2gY'08"%bNL. Ir`D+I[Kr2b510?AcF$P~Ń ~xOMts)ܮ^޵m;?Q@VJ,ziȇ];*ŏO0ȁ)OԹ`hN,!HLMMR H:{TQbʗ{gnú[q|qUi'/¾R:-jy]1S1@ӢmT/]0+u'Y'Y~ ԥ/1j{e_}DZ6q==H ,k7X=7r,+eEzQ|T{:Xpժ#hݙhaoi|حk髴X&ϲ==CaV{^LX `̞z[@ʼ]#_9Qr*ʕ殚( TΎxq քcFɰD"u/P^_4ElwġAҷ !nIY}xk>J4f[R#v$y=S=kb_Րۋ3zlWwuK3Trynn (x:BX%1 0 }B2IL;Ύ"4Ha `tzq[[Edz Zv` 1HaAW%CXUXEW`Զ}^]1:wQV=*#(xSք%QIFHx^ 1K ;$pq8jf9 SwmI׷Ǡz)wR0yIE`5ǘ%>4^&h p,zLL^ AB) {Ve,Ȫ)ʨaH1!CJ &L0Y9 18+#M>%.z,usZD}@$S $Zn!A2ZA6)S4֣m_N_Uv6Mts%ݶj/(z}?i:ׯ6;UyOI'vy\}:iKx۞-ɡ)_ej?P|MwsǰDٝC;FEqƠ8rio5aNPdHX7Kw ޱ'38+SpcKP w~-rP"Lc+MUبPrЎ١q']n 2BRO(UiZWq]A! "BǹIOE$.< gǷjEPmi~7㧦]~`f("-9Emëb#s&HvǦipB @eU{\$P)Zy/؇P)ø8=$j$~?$d_M]="_-W k&l᧟l'_< jSzk # ĭ`^zmCKǚу.Z@-* FЁcN4BwkN:p[AEK-0K%\%]G+yc払 ˺ׯ3s=ָ@bH`NOp;Vt%#oik-PF:HCJi&LJ-z25/q{ 폃Ķ+!IV\bG:8^_w[R=k~r9!HSbn:KA!<1T`} -M`F'} ix7ONj02w'߼Lu;OOY s8ѓ)YU򶨜ū&Q4 ܷq̄sK$:B:]g} esƧ:*hf]S]0cIzcw!)ے{&$8L@I.Jw?Gܞ~YU( CUK}}~n..^LLS j6/6M8^R\gY.|:7PVW]XMs3',|Y̵~Cgh/yu.;2 ~b[їXWܼs(l[L/F[j*Eƙv3ukXzڋ:/fj̖*0[(51rV=)˼NeZgQ5eY*33@zmk)ڶ,zI Is5[,KƇ͡"#PEum,~zQ_V?vmj->~X]j|+Uck($h=ӥ_$Ig9|-۴֫$e[t wȖirfպHhU+%Z%w]J^:m^y:OnqּNݡuKk$: M I(Y{6h#LNqB(W S f*kHXd[#7)cQӢq2bsj-S*:uxKjt""mOOi-R,nVf%SU X2/6JVb$-Xag MyʗSڍ9!14! NZfwCL]muHi6* Sj mr^}~lY fkgȻ^gPzꪜtxp D"ye9R$'8BeC/ڒQSv蜇#./Ur!ktYÛns;LgS:-sL:h$++M0,`1\YR{<4(NH Uq푱mC CD8Yn? GC^%mg3*%sTTK<͎YzoueM{pr,+D,1Z+uxu[/Ďs Si1V oVocǠ7$PEݼ9F%Q]DU!b<% NҖU-l?hZ6sk Z J^˩v_}oϟvr$f<kNY~}WD 8eV<(Ys8<fTQVCJKI"M:Ug )yyi~fq>rF&((^BJa ))5eHA2PBv~B£U&b^v\5tV*ӻ [´ SD?1< v5+* ;it< kHQpÌmŻx6OUضnTs?~zB#NF#NxoUNcV} ;ji4Rt[^Eρ)) WqlHOUP}ڇ=[p?-0-R}z`4a<Yh 8=T13hx iP?x<`=qx#G 5zr 垰H" GwэG>#  zN68TCop\۱O#gx =qx)ߩxj&9I(i =tyAB ;5ǿC|jkfީ1@ xAq \/Fy< ^@8KMhcoB2hgKbJ!Y37OHVGe XlO0&ϖ.eb\\p Kq% Z8qVЭ:|?Kkвn*ꏃmӿ?zG"v} 3㎈]~`XVaK8@Sa;aN 5v>7ԬR&AlPN:o Q+A[QxLIPLjnkn y#Ǹ8xiA*=w_77%|{_޶0K(EP O9[,Bcl)KWЇIWDR/ap _m5JcPt2cSv=]WXeX cQXhǀQ3,5& 'c,S/?dX9c2L&JᧉM +NJ$B3 0p \weMn#GWcsٞݕfbfuE5/_Y8(ٜiRB _fefee}sBSP1nOV1b J8'"{:AS0c5NEF?ӝa2$sTL2^?B)cTIr͟eP`N=ĻOs嗏"r h)shz}9[p2o֞PZ k@`15w2!ѿU1H09^.A!+dފx X rC5etb{C*<lQ(CQH*Ձqيk0P!&0N8@1mP,f!TMr&p#^!tZ*II`6 icr'!57LGӈ~&AD_ =G>YC8e q.(۬Y/F 1ar'>'Hh3l Zco8s ^քi>QpU6g|xr >q"y2\}<yZ`|>!Vf% 9XLӑaoQe?{ .*=JA歃ewMjs\d@VM=uqKz҉nRktfݪgfJ V&3{BO5)u^!QYIνICA DZAy{+DXW^u_^ނӷo/]CCIHa\ Uq#7 EyT!|d/K/yM;rNeN)`3{Yh ",g q [~v=WeX/"jlGnXpzj(^:c *lsMȁH+ϼǂ[D>m 8mWmM`xZv`ZnU@W%u2Ʃ{\e0M'IiqCЈuQY3"@sI<[ksl2n L'i-p/c6DkCSs>7X2)ӭ_{j{(g{/ӮS?}Sc ĎSsh+q׬Z*$cԄ:ô_m0zTY .s&9%b#`泜$1mٺXm7s?7>q+WjvN79 w.:D黍=Ih;94]W DJ1WBhr @oޛ۵)y;[P|E=7gVPg0X-wQhKR> $I̖Rxz0sGYN JNJyT1ꕲ#m%˱4*AˋKGCj5&K*dsWkz]˟{T`b Jv̺$ħI[޽ u酾'G}XU7;zg5OPU>_Bz(Ul0Զ 'rH xj9SOcgp\Pj8XkMh'0y`3M z:e RGt zĔL.|PՁ06 OB< 4蘌0$:ne !oZRɱ֊ʛÝ.?.l<%-~H#Ef|$0ft%,ve}ZAz-kJ'pHܺxX{3AS9TMEjݏwSR LkT<D]e:x ʠxhBsn\&i4S+,$+gy/ 9˹ jPhOrgirECmU:M1]u(*Pu;{eE0Y%fndYݿwIKj ܉qZBǥײQMjqy@5ry Q:<`z=p-s8D#{ݯbk?~:n嘴A= sȨڛak`9a*YxнOeŜBzs 1?nTP7TQtv.^uL^MpeuAWUXcm{`>ҪߑFOjDj0qIɩ?kQ1ԭ5b}=hKXXj&R0@=$3ge̮(g3o@(!G;cyڐnVgKNUE5 :l-cxMW1e)A]FI>)3o~$׮ZѭԭJ[;} (l_h &4g-En3ఘϾ\eU=k5(+>WŸ*݅;e1D#1Tv.k\ cS5%6wab Bc10H"Fļt-+NM  ևUxu$hH{'  xNafh5S's֍no;@mvнԚ#06DH5Wuռ]r]<(JPm+K  :GU7M3/6m׵#S{I&QE2'DCF)9.(_3:2msS\Ųl>[nO].٧ҩcޤMYrABc(PgJ|=!޵5qcw >nj6CVlɸ6/.\mV(RER3ѿ_h+=ID7w98x߇?[P)AޫP@'էjIw!N[Iݸ߰xlz! aڄ xFmeeY0Ϧ0SQqj2]rCţ JI)0^-L y90pt jˢ55.ݷ8W ?z{ᧀw,|7wm+  &D3JKcim`i/ikd:WKLOvR'=kڎ+;R]6^jT˻>4+^X;[7jdcO~ܛOZU_4La׫}6e\~q\mWvr*W\e)_K3xm3"}3qyng[nַqk{E oPf8'@+ŬD4emP/qzp~|9a.ʺaF"Vlvd;'Q/D_ ڪ;-4QE;%Lm(Ŀ]N>M 3Uω$c \ty\ڍݯ+ o7Z}/\}Ĭ7z/w7CO'[ SWٵ ,|~>nG5.U:q r9zI4 >Y>lsU[BÅy7r<4`rADhGOdtr9Tq@-"A!qHE9y[Ss0kF~_4T5Ч%:UC==nG|5 䶽_9 &9|9{H촖Q+(AF! )S@cS税N2);,oXV, O5jXSp'{]i,T#2#!x9[ayO XZ⸶VyRo˿e%ܱ#uY0&fL Z|yG d7|_M=jm ,_A#.Z:J5aLvC,5?m9*kǼ9YM{|Ϋ*)I4v*'AKgMᤀj~Bg{%֡~ xbsRyV0SM$jjycHf! N[ŬIo1y`K'˘y6-hatC3BbG5bʴٛ1,8OvD˜B@S>;<,ZN{hÜLHih+ QvrZuF; [O˭-8CaEIz1eB3*'!5(="QP $Bh%$`{Q 4bƥTlOukd)dw燛E!ߞW$-!Hv-ßM;{wXjg׫oWa_ܯrJ̺js7pu{ >t([RdQF5SAF7^#i*r"ioB, "uL=k#~9} = #_7DȘ.<w4"֤X-CS-TA.1M,;ĞQ'3L@OdDHNwB|Zs# J8rV`PySYIT q>9i5jWwMr{N \47JnB2P f(u݃, 2X; AЊ̐K?#+A.C;=bX2:?].d)LB"& FQ:gdY٪ȢP~ sј$L7,*Ĝ`CG41M.\:Y YFnëڜF?q#Idr8;`qwlà_meKdd~UK"iQ6!`lV=4S3!ׯz_ ]k/J29PrL$^TYe> U{T}j?q឵3Qr($cx[ j <S&%ی8!Nΐ:w# ;C-uT\)e}}nz#Y;SAD!tt>1i/IM 5X4ؑADm E|L m-HFg,}Se 2+,D3JN`V Xݎl 6vU#ۭC؂b3I9YτZgҘr,Sʑe{oel@Zr9ׁhk1n&឵HLxR_軚/z p ȀMقI*C2=VǨ1:LLyfjCm}j%%qi8KhHAEMa@ļdPH|f |?E:I#ß3 7=L\ х w@JSΦO0kۛCd"+Ҍ!7Zl&>0붯Ve9T /]ynˁeiډqގDx-m\4RBrخ0C%֝?ޔX,'E$1yyY*=I15`C`cNmGI*d%'K3|}ݭz3")UNj dFhMDFi~wtۧy}9u)a8a{e_Hfdc&3+ i~S OrFG㍎TمeO#E"CLHEt Z{*Q hșoIhE&a0UF!qЇ{Κy&`C.2(a`181162EH:h$*sLa9ay@&{ kk( s'p`^rҟ!/9g J!y8hw.<-k^eGim^˝3*Q(n R Z-zėBB63D"%ϥY8īPت_-F_]kyբG|5+"k񪟣[`:Xn%˴(a`Rym'XV#My-MY"]S݁cWȐvw& ắXKIւ+#R<:Ad3S"M VFzbuOnúXGpd9{R LY|!GH1A(UVflXxX뛞&F*b`,z]+鼉9 > EFKFۘSG:6f/rȻ7}C%mY4PfmРR)h1U.%=+)Bqsh}g[n_ q5#J?ҁKO@Ф RR:3LD%(uX5f윿?2#?)h>]i͇9^bfIm,-2g a X g͸;{RToXVhz`iC=A@{p`TR;]2$Q;9kzhv?w#{CNF.', >CX0ȣdW!N8>7xy瞣 ᙖ{x;ViiPmM2G>I*% Z8/ zd`5v g\ _N&7Yyf(_?}ކ]0:%etI0%18+JVd]C|z\]ʻ;l$H3LB}h.']aE@01:jH?h4ZсؾН4n.ľWv9"Y{5$.q}ҕu5ҵ^J=S24tJ>1h@.?ZHd *%.OUbfv@?[/OKu+ڇߣL:v٭ҡi[6_~=k :DħZ ADg3&Ɖ2J Cg3Z1Y ]d:jX?[/ۅϗi5So}uv}}~q<~漢E;]_֛p1<4?++?V}+-;]KţBXl~ ;kЗjE._?[lD@M7اwXR͌f^a\ r-0d٫0 qpa#&3s{ğ(7W􇲦Ž,`/g[wy(eK%obxMTS|}s8 _r!{D~V ^+i:t@3Rȯ`1Vj.LnS ;SB. .$5<'Ҭ:aM6"oailX/.w_z˟_E:/n'Ϸ;g}ks|b[gѷpPѿ_ZZmT_W h>ZYr /z?r^r6m\ķ~\[ZX/r0<6le g0coo*+p4{pK /« Ǘ= {p^e_lsx=pzM֏ [W*p'gmE[SyWvs3;ƙ޺%$fLcϯ v'N9G!rp`6Ѡ2FH{+k`j0wN\tM3 ̹-0Ћ'F#I喰\u  rWyUWLڈ3ѡ]iz?%mvWqWC|y*A5`쥤`F}UR9[Psխ.BW  ƛWbWJYݻTo/:wQhAS+J(7mbȱy5;"JNpÝ4FySs,p(t`sRY=#ùE"tb,X-v1?$Lt\PTRHSe5@YN~uV▖`s,K:V$,%͊ >Υ}F-%) Q5 Au -K"ȭ`ö/;5qz5RVٜ$;֕܈(^F= :ؕ`дw7 dAfԸjS-d܇ S.! /Օz^Wg'#Gf "gcpRsbachʧ#m9b!)D&4oR9CKW7`g㊦'Qưf=h j5_AbvEUgZܣQw{HuJVb^ݼ5rϔ~\ !" QN8G;"MWz𺎃!B2 T\'zpܕɪ;֩Y$سeԩţ+qq(_(5:<)#:U42*39έh,r5nF? 1&d.fF(m Z\L5 5 $s6},ÈB7-A3GnrbϳMi$%Y6/eѰJ:(_$PSm|7Ĭf6+7H6,cW^ãXųfoY nCv(]B`YGfI6+('Ⳕ|Tey3s,' {ZU ¨ILnͅ#|G 7"r7;Y-UAGWM)rF?Rľ "{b? eV`7 =(ڐT|o!<4rHA^#(}W” }ޞ<[zx0J047!m-{`fJ;@@'H%Qys<;׉y[ $ zB,ő+tm>W M1d:,3pɘ5޽aFnř&e\C ȸ(Ǿ1e.q'Z_ 0ʳ, t+fЃR(hO|R)o$i޸}+E`4$( Xx7I}$&x0 K2xbiK YX2B4ӣGW|yĽ>ch6%]h9&4_Uhi 2׋K-'>70\7 {nWfBv?cd LWE&wsF"Rpqyy]yH8<`NN5PL''ULjb~yA X \yg WFR?{zĤ1-kεsӺIWТtsK]Ϗu> _ԡ+=9]7uP( -; goO$L1N ru8 sQB_>hxyqӻ!D$I) xX\ \U/?QEXgUMTqq!""dzy4 v,۱zL\} +ps] m O"/`~;OTh]7WG`7,Z9|73$-a`_}]RuT-@#&? ؀(G03Ɔ21x3+t~EY,hSu<=%)|b;[GiNg<< }$!l@"kc:7^Dzb+ 3Olsqs^y$ME3(QQi rNpL*JPΤNgָ^^lx|Ҷji_'*lpBB iLBuIdw‘ܾIbX7f,Q(Bj] p^`r=8 aS^&XWǎ}'h仁gs"T=RPHC ~680g%a<7c,]mn RfZaoC؋sa?HH1<.^!{'ط=+=#з=+̷=+7=r៕=Fx۶(ZL:(O4t(`\:5Cρd4M_>Ieۓ4?D댧J/hb/)d/,:, O8gun0iyƒرn{¢'u}&Dzِ$ . Y$TK[gC~S*t0>l;P= Fv"К} ،AIY|EwM"y>B8 T y8H^*Z$2rT {qںk^ΰW :?=c&jtn0Ά9COlz"?eq}UɆk#raWܓ^keYzp3 %),zO;'ӊJ_ '5 uXQ,(8&L7=r5]gb3>4]o[D -XC H$KΙ#( lOWPr_5wr>MMEIlFb5>iVEA3:ucU=%|[!'dm; ~>5 IDk(GF߻|/?w4$M izU4ڡE™f[JýmX܌-Ķgđ].ոFvzqlmlplEff"k`)ɾMZʻ[Ov7D;F' nG?|&c; R.\n>sߛD|+7Ϸ _FhhOs˼~X ~&i3{q$zyp7–ݶgCcz*ZU$&EU*ݎj13D"ԍ G&g ku)^%5smQb([6ɖJe:ycG>8;jJ&vP:7tY%@ (tՂo"-״'c>*ϰѡ ̣]2,ygE^XCVzFQ'ahg[A%IKT]~td$`d`G7xd£.v8y"6%+|8#XU KtI*cSh8ϰ5 A$RZ(=} ;VdYV9ni K2iTʘDNr]~j$&iv2a w:2*ǫY|Icۮƒo;dȽb h38DUz `NeQ"_uU| &[osr6?_ۿƦNq։IhH[Gw=4HAisR(Qm7hsމ; TlIHM8~}$92euZc٥}yZ,C1&/UӔI+U@;8.$iD d_=b5IY7:,*K%5(FY^ tJ8 S3 XD)-$couH6+ piX;ǗƫE-*ItB>I]ӷS'qd酑G6N]{s6*^cnRyf Qe.n;Ю_i.l‡ɺشQeX)u[0j#aAK^{y YQeQC~ ! =+ĶcBH8iȯ<>XA'V:U UܲL1 ߷6Ə7n,_/e `d\@ #nۚYu\;3?Ic8.YNx~OK&ޏs0*tUQ79@+vS@S\vNNLW~y,/H IA&<ABw cG" AT[qWdQG=ݕ=lN®b%<^?z|Ѱ]3Yy U<}a7es `w-0*I>;cA"3CDZ'#HmͿE*V$q l|bGžZGM(ض)o%aII44 luG3`bWd]~KN߷ xJk{tKt91'md2xcP Ꞙ:S 9ESM) [:F] 柳t_u"=|D,N=0+C5T,_13U?PlL㗪7&!J ÙUYg3EWPZ9T]ز*XVӆq"e`:sD LR*30"![l6< G`>YNW/j⤑Mu+unb=k<ܤnRM2e:Z=Ze%#v{.Puj[+$%(GYl#0e^d8֯&5gW\)>9WX.nL K$}ĿԾKj*KQUK3[rEiuf3W\ Ӌ{itobokmN Ю2lН5Wv(W8wQ6Umt ۥL*vaۥ<22LJcҧ5ERhpt[c,o rpfTM˿ʨHI R3o7 tt5{ WnlzvF69E6G5.KAv,@R_q7vXzVԱUQi觝tXAs3$ >6sڙǒNb|Eaw3MWgb7Qi>/z\I5js(D< ,q?7M1h6tTc8b*h,Uubu=!^$0#PY, ȊlgT#༽cBıOR'cQGq}{_ +s])L kxG֊Y,fܰ͛adoExA夈0FA l9vjۦ|+IE{`׬*I5,/[Ŗw)ӽ^IVlcO'0qmF+1\!#cN'΁o;7K 6+oP)S{MQb],3ZA}D9K`*Hn`/ FgX۶]%-0C1]3_TENDL/$q}/ÈߏBi~?grDhhʃ5X] 2y6#q)6sIUޚ5=׻//qgy+k*d.q c[Ey|EM>^&_ئY:JԸ*͜`] ~ G Ns:Sf`& 5*ɖn\Wkĉaxv {+P_~Vk@[j4:vjPEsF-$ Q Q@a&n *_l\0+TѸ묑kLЕ HIC]dMZb˨sT#nC6.3MK\@7dY椙)()iN?>%QUA Q#ҔoV* Ssњzi]H 6mtEFBURq-3,%-<'jЉ[ym\7,*ZrC_-Yd2SѨn o**SX[yƺ=GǝأǗ&>WIV;*euۻ\`3m3"|]U#-4PU~7|x>F3+W5rOGv1*)${݇ӏG'g_UF <6qjIRMbb l~Ͷj<-jHwxvZk@?u9]!ԕh7j'݊ӗUWJ0jgj|eV wjߟNN-6J`gjKڂTu'&"%[,)mlJN.e0MC)h΅ z_zqϮN";-6(Ӡy/0'D!_&uUu3~y0} ś5Wkx#;Gfƺw;/ |H'*$M=C3oxU*آ\5WBT)/ [^[(|F(-b 17uƥz<9-?k}{jôg27 P(2gԌ-=bnJݿetS:CгxHX5OwBl}lN7bb/ $PȷbS(YUƾf?_~5ӝRw"#ƗaR}6i6w]LaV?gȧHl>^A$J;Dg°àF&+l9=Ywu ~Ih >$ 6b0,'xM-9[~_@Mӵ@~Fl堳8vč c碸?שV5Ǘ"`~,0aU%ՌLop^!9갌)gg)(Ok jp5(ƀ0 g" ۹D~Ѡ96OY-N^ MLn;Eg)dՐa`P05?ϿLf:`yseNC] wrfnWʹR4"_s$:Cӭ>3`aò%i΋ ӡzk!m7ft Ln-T08Q0~M)aXa魯)%_M֋0og e⨞~xsÑo9akݰluLRn@S/cp(o OSJ X7 ֑cv]?$UZ0,񽨕B|8b@@Z8چ)urI0UN' x:*ݔH L i/L5, m;EMR5\s`]@UhX3Rfl09AAs@綶K9s狋B`eaڈo%_'W$F8ll=Ew侜5>ED((+/d[T[(m]w@%dubI b[7 SK<i+c(? 8?B̦&`>i_Ah5lf)ZIٿhm1vIDQ_jUE務Z,כهssr)QZq, 39E7k4yEQD$ͭ,˅c t@[S{ u5(n2 $ j+"Aq>_53?FU~%::ɼ:T&|0o__ȢWzS& %L $"r훑I'Dp_ҿq>|[6%Kuqk*.ב 7^YU9v|^UG2 ,iF,}63J?8mE x9*PV4P+%Iu:a M߳SŸMYHslsrȭ7aOsB^{Eīnu;Ο͇]鬾,_5AΡo}zPhZKEUZ],aH*F0m,; 3e8*KyLL3FRgsXmRUo^/_|LDZG9HY/ Π LdE"QAb8!wcbpf3 `dIfqq71jg_|;4ӲGXן&y%VއCK~N|HC(Kxĕ$jy|8dL楪uVw7_W5S a<~tȔ"Q)努,+<|6W[/q:ݵ'b |ПBԬyD\[4 cj @, }]({)giݚ}x MVjMD@Ex4x2'̍_V#l lb@JEr3#AZnL[X43f ͙QVs4s,Q$5k'.)hKM8gQJP"1aN^fOgL 82os3#s`ςj%9r3 N"#H¿BnrlZ.nI͊,g ( d-u NG13DS|+lB:n@X5={><.V#a` MٕZ?h^FdD\,3ޅ59夒؄)keX[rdr6F 3#9-9aeߟt{}^뢉/1:Q@@>]wH]B̤F{Jߞ掵 GA0cCҽE`)Q:d[rJ qz%+2\8!-O"r+$[!yE_U3M> \rfH~,яt(٘m;c2x$\# x2 C `7I|iNA^Lk_9q $Mǟ]?DSӦpdh9&,nq+,42^8 Yΐu,L)o Rr4t+\j+BCauBHܖm!Ht%ƓY,ڗΞLGoKI+n_ >Nswfm+R۸ίݢA #/ ^m=[#j&mAdi+N+b 7Hqyқ"cRTAy)'U6g.LbHaey_-|ۘ>?PF|U7RuÑj'^Q`_VX>teh{II#7~Ť1{J;:oy+|+Qf>3믺`y wz qo}Off߀Q~3+|i)ЯqOSoiL+{B#+Ί9u4G@O(Di~Q"4UxNlg {㳉L x)WJȉҧ~j⫇Ӊg88EO ʧ,_gO3AOm?+ ]!qο8C 3Ӥ1bP`Iw} bYKmZϗ7M|ut'JkXԎӘZN J&:AXD)PxvZ:V|~wӲCsSv3Wr^ cV{i DH0#RNY.n?/~ 6! v|eB,42h@p 9Ph(!\QC5ʽ2( l't4ӕr#NK|$i$2xVhɱl-9ɴ$GHHe/-ɑ̥%9G0Fr,[K>$dzҒNɱ̤%94cI#94HKx< i d ;죑<ɱ/9qtǰFr,hIdX.Z#Nr gDz T)b nMNȧf3 :\Sɱ$dء*DFr񫱋u$\2D@q~wϑ ^GIbO*$9Xo;^ԗq(E59_.I?'o/*Es)LIɧ67 >&ౘY2i0 69e2包&|&U?ܷ ݍG=mpZCLIMzptu^sĔ}䛛]C8BfW:+&M\G ڙ#j((Aj'(RlXO9Jc3Zs#HxNU Vi(A~A?) )Y$Mc6>R9OR(etdeFNU nnʣsYVݬ/woOz"n4 ?zѲ|[W+}x {Pm֑˫-&[.22u {vM|.a_*"5r8('Hn{bv@|09|磛?ʄ6!Eb8bʪs7dvvk)ԌLͰT/g" +*5>Wh;G ­f lw?/:tN5݋#,[^`y]>2{OwWG:ϴ٧XXo"ki5b))Ԥ 3Z|e;aT@cJ!6{]g[,+i} %F\p1<_y{l QrIL("TjC|}oy qv]0\yp_ew ^Qye8vaKٿKsi@ٲVYs&%lY%afccAWPes9.3^P1Kfw~_~j% U(+$-QҞ߬_W~wKے}vwEI12_bCS}&TjJo !H0MY߻sƂ ^DS / 0}OU9*(ȬvkoBϦRޟr~PV&gN/Q7W{lLAQ^|m/ih`>stcCGQiW{?i5z k:Pm涘uz<2֩ _U*~gTEU}#]4j?:)D[].mW|V.]qU0CGi: 6=hӺXu4^?kped祱¸DsqF޳-#TIƍsrrʦvgw̍$jHv$H[r+$b7H@wݠA,=iÈ}|zo=&vSNB2קMgC'(G:cUe/rC3#E'#JbԺxX2+Ns0j ) mmE?NNca=+0rP˪`oۿM]f =nMxWעh\d;3,-$JuUbվlpfRSГ\ *UEfV}D~uk#W"/̧AX\"݀lY]9ؗä#y3]b|c'/&sX#.B&}(#+W?}Oͼ:}_:{7gfxLP<0b!3A0%DhE O.Y(w59w<LrH9P@`w'~f['w3c3 a>gQP #8d<9$x;d#w@!z7J3]}xEr gQztܱ!gG>KQ{1)$e̵@* <+H `z[z*l&3 uZ ꬟w }A\Wf׬/^aZ7^Y89+$|?a!`j7y1_ʳ7ŋ}_#ߕ [g{i  TtJlrYB2=3bӅJL Pi_3辄- S |AH)cv *Hy^,}WT"7Ӂֵ K/ w$Z/x%ܕpvDɧ, ~]ѫ?w#]F ^Rb8SE0<[ˆ#s|vAU0y~mָ4܅N‰;oXBlg{ޮvN6K=oӵ#?w;lݩW"]P+{:t`iV5軂^Hf쎁n\MZ-%/dnr/.nӅ7s!Z3mp^)ZEuE*_GU[rٸvՔoj Wn-TY6LZ8ۀzx\Sr6//G8G[%~LBuB\bD84G1e~"\h!u/`Y#}i0!%FBR&@S%0%7'e1ґ-vYs:i~.CDΘ6΁H7*1.86N/8<((N8[w>V t=}Ա:K/jhf%p൲⥞0)WP9J%*ۧM|=2Bʆ_55}T^GjPCpSc(p }[ ЅHDxPic+%A$ԫa f(3G6=Cg;7TˊT@*=1W/f>1R rcꓫ"ٌSSF\'GPsym"%E X i3t(|1M})t8G7m|VF<\id2]2]æf=NHTM04TbۊyT 1~η)TW2žUK;[?V-uimt wp"v%y~ F}|IZel xN;YaV=]'+c3p6ζh{[:{D}O8DG7o YD[+L'gc8LIDIcB+x1W{Ol,t{$׌3/afcPwAtּ0U+coE;vm-Pf쏈 LFo΅{l»I⚏^_T{Ū<7$-zdF7ÜƢ Z9e[lƣJQm"?C% H*f*8`$x*l ^ b/<[Y:CͫDePJyltfuĪOk0_GB~2j\oL'|߳[#%4[ϡҾsMW53wj'u7mcRbk,]9(QmB8jU1 6;I#Dq!9wCM6X5_i%>cw9mo.AI^_N?V4YihMWVn&%uv$Rͨzk(lq*)p7ۻ":o\}rZq8\d1ԯReJ#-ꑻ U}'=2\6 nJWkJ}y^Z24I-Fjf׉/pb1!\gW!gbE^k %jHKܟu:tF`}ktW//]Js>y-7!$o(ݧ-cXnKU5}ۏ|:e0D!Lx~\VL{8 )QQE$RA,&G@t?g 7M,SKk8)\()5xXsS';6^p1!lO&ZLW#Ɠ a[|0c珷hY2BY`@Z #W;zZk]S+g={֚NQ8f$IH!DQ#=DK4j_MH<~t|mDtqR`cNԧDSb*be#ߗ*c a"p,%(ئ*_]|ŗj'J1-+e~wˡqWփ=#. ׸wk>6qXlb-`m!^^sfKk}y{o(GνYyZd%ǛFgGb;.:Befb9.lbE8xuGauՈL&0m~<>"2CU"sv|r"UR!$7]q3ߔ>&܋>RpQh"2@qKAbch-PH/b:'Mtgm.V+N"AAJOJk?PV" V6|iⷝ wq!8n9ȤL'YDĄxR=d2&Zr/y׻zss*'<3 FEF1DۉsebkL!.>Hآ}{ü]g3}QBh̙G؋I`IδG88R:G)~F_BB-< ApOdV@I%xOgIzҥEH^RKK淒*ۥo30 ӜҥA -uM[rd0`?GX3bh 97D>'pĜ0Z(F`3iTfFZfn+TdJ #z%VG6qvrԛeN 1&2ZgVmkdtk_Ҫ"5@=*0!g Q]v"ȥOL'e&Y/g" ?[madD뇏WYbr@*CjEJƢޮcc%.>nA@ee5bx]US :k8*<=8.ծtwfQ\DV48L PM!h?"wi=EA0ϰaիYw!zWv8`H3HoXPr0ZTn UB1s48/RL^/HoYtP#a۾KS{]m#! 0p.yU ~vUT {;-w|}O]jЄ@e҇aXNv؛m'mrV>%K û~URVM8]@FyIU2'FчL?Wr .dnXTL@_I2UO Ҫ7;W>E 0,Fh lѡVpp!>ΠefBBHP,R$3vj7~ͦ߰UM4H1qkG/v[a `\\DyF.)B"I0=BPBi!4˱NkKraYkkC4=#؀/)~{`g=}9i1'[b%sUo}yhAuyEJb#<ʇ- feU^hİR*\HcZS\j֯t~*s%m/EZ5& p"rQ * %laBRnP D/"S4R%>~@\?d ޠ+>k9d~fmރ٠lSun_T*dRo\b/؏ ;}}IZz+eϦa,Ӹ۽BLr9 fct,R` ($A* ˥ꚦ5uk5= Xƃ,AVD֛S?g;6('=vzrʆYfr1܌䘎hēV\Cabc! :s .ܾM]Y&Էb͐ɰRU ՕL"¸[Dž?1PTtŀajxՂ4ß?R;?:JO#sd$RwϐAyX34Y BN7Ui1Ձ'i_8o˰NywH~E+_wU9MRwjkk*V&~F7d[S]bFlm,=]W ٥|f:s5)czr3wTRKٝ.Vߕo*IԸ)[rVĹuZbo﮼#Σ+Swny(ExՅ;G 3&NQNLQ@+@ZPۂ b<&&!9q~,BdT qWC|@ "nɯd;OisJ'/=xӛݒP@  'Sa^9ȱHb҂wQ#!\Zw (ņYpG X:oP44 D:)%n*)WUBħ!Hz!¶:TWIIp}E!0,%"\-d#9CywrWҵ ֵ#?M6Z:Zx'qҭW:>UTtE 6M;"~$q!xE/}+kTREKCEKsa5PQKNtjjӿ/IaIIg Ƨ-' h}8 xCde5=rGvEG6/" %pi75L2E$k@bZG[|J}/c4tO^Ji| XDŽf}H-Bž6AM)+DUK;l?]$+"x\]BD 7voZ.Ĥnnt.cvir]Xު|;M jo28J4d D5_MNc x]3D#8NEp 5 D CiPY8Je) CS»!_$s/2:qH)hbt ?qħ}"5ndb (U;E֬ۈHMl?ӲыDOFӨkom=mV+yvD˱K֯._4]XF9!b ދ"觕mMpm_>2FOo~GCM;۵*U =N@!>O|Kr 0'$>!l%f(B)e ;jX1\ J~aCyb)Y}yU:ÂߤǕb쓎Rٛ W97 4o9ꡬECn$$Ps( k MZbKTͫL܎߾|E<^c }D1Lp qN9k7G>T6287J@IVVr PBٝY[|8hGZ/m+k럯 <Ԭ%IM1~*1, Vjo vc"RP0rJ0B-)@ (ɁWk-5bkD. 20>%O$=#Vi;q~:`DAi'@#!rdbrR9+ˁЂKĜT%q9XB. *@W7nEBdSV?{NǠ0IHyIsbGqXlgtѨ|O>7.\<I;){+k`жKY.>FuBim|Ll|(͝߾Icwm,EvM:%'34Qt}4Jz BZ`&`4"bc+Ѯ9/qk}m2zWC[j@Uw9X.pO w6u8>/$cR]" U,@,jx 19%\hwo~ \d &*]|ĵcJ*'+'uXhg۵ꭟ 2Wo六[cifDԺM+&#a8 LAR I/BcYrk$J(j\P* 1XR~Iaʴ!˩jՉղf.oR-"Yrv4RTMxyT!. I)b^1@GuLCp`!P+Bs+91bOM$߰ӒtE .A6M[>-wm]lq_6 rœo#"{0 {?4a#rwi柸B,FL@'w\ ,\P'ar7H\ 9й1&wn-r{ zhoe>E^Zih#]$MdBVa q 9M=Ɣg'9ʻaBX$poM(אI S)v ǢOy??N>+'e!jB)!1fXQTXBTT*Gs!HJWBiQִmn̨=[v(D^ߚD;q&oѭ=uC< uOvʁޏڹ]m>khB9-A*k&eI%#מ8 ¥z(;Hɢ ʈq0gRsc%܈:eE'%ōʚW#iH4CQĭCayz {]ǒL7:1*tΠ!狍kOFzP em_1P@&Le*UjUfV:(T:]~oNǵM,W]Dڑ"Uqr ?__xaD$2%>e #}R/:_ʣ``9gBBNEB[0CILu<X dzS4>{g{ش8*oTd׎hsZ;t}P>Lh%0qXoVOSAzȝP> z0#uӈ+% 'r Y4FQ !9*[o[j[UcB[@zꂪ>Ffp6cko+a:[j5/tcB2?]HBSP9n# L(ČS Q@Ln7)wa~_ʌ/RY'| ;R{#R%l :r͋kVM:&vՆM.h=dY)q&^8>!I (ldEK:z&v p,&co:)5(,@c֘Ai܈rL'|^CndMwou4i8^ZzUIZw7Z_'b6E෯_wr&z;b>Nm*PqkX7F]1~װ5€y2U3$J',l-Tzjmơ~2pvu(MM`FxgdX ӭ8Tkf;^,C= T*M鲕[ҧ#e\MW*Otf}z/Y,0_hazF"bx =\ cyʽs=i2[D ",XstA4LR׎3ܑóJ:I3+u~%sňHD)E'Ia>A 1t< % \\RogM/% }UCOc)h_ܲ9y bE.TH#+(b! &$?*75KNyWg ~vZW~j;qTD!Vק[2N;xO:v!kFP:;%bџulte' ΕRYI rx9_AlmqLֳ6?W}4fR0g$z9U[b!a2Ӊ ŅtY*\R(=l}NܓB.b}Fް0rXmO/Au?8K,p,޹IUjp<6V2__F+9t,OTs vC>IlS3)W/޿#H(E֑5@u(Є[--qsEsS;*BġRՃf :,l'L}f+knzLj2e!,w3dR75/] ڊ%Q#J@QIP-wҕX8pp@|QPQł 3&Y>:gbhuHѩՅ]#R޻bK6u)Nz:yBlͼNh_>F'bhmKwA|Ƕk`;wvBz_)Iw6z lmh- S}؆۰5 ]gU11oPZxa#WD]u U kT=ªG]]uUܮWWoGBîXmAp;ʶ5CkFEj# ?89x1E:Hvy3CNW4b &bz<e)4%LR *F|U9y94 @xHtLpKӟY<(h Ǜ6-ݓwoҾM~WHSM/hߝ3F-H_GڰCUwlZ>:+-UW!H/jav}vTeζ,FO dݪiͦ-suF]""-bQNVkE6XsP5ŭ8b<7eD{vJln߮2ƎZܪ7;N>˹q/Ӆs2/Lp-]/P{7kQ?N4  LjQV F&hY,XDk*oo3jQNօS_μjh-nLu7>KjJj@<~ H[?Rq{j%/< TFW[3+>{Ϳ6M'[>`|}f}ʮz>wuo\Ŵ,[.^dU2yo33g5x}E7߰p}M?!A;.uljEʹI-Ҿm!l⽕ŜTFvUFC jB4~3sVFz.|wK;ן-&L19 d+!4DIP\AdPj@h\riԺ͹9cίG0c[c|zTo8џ08@Jt CWS}ex핣`nXmG$? %A\g?vGz'ӏ}hr" djy_V <'hED@]lb1,urĹc/*,vo&)2$DCspm4t,\WV~"Öρ; T:쬊5^xp8 b4PjNFwĭn]4[;FX.0[,Wud׫"*I7Zݲ<$q3-<1 pXITs!)#ЅJD-/ŧGW:=_A_o961ޱ1-Z,Xv/Y]~oj^\W={؝mӝᗸ|qy.u]z~ظ$JH.腽UW9nyߵ">ϒ^Յ#Hu {v\_P;f͐ |db19 *0 K P0%Z=fm/K='^|X 0Ġ B<8`9|\>qa2Xwf L;~L*Rh*tFs Ra8 ɰ15Hp-_$JDXp~}k.L|z]gzƅ(_qwwџX?X5 L~2jL(=;eUωT|gdz.;Z8'* Dԝߗ ]ܕռ.DPڔ+$WH>DhI&!6ux{q,> 2c8R-E?4:O@VG(\?s0 KU9uY>əQ'nUӰ]T Z.p nϑu]Q?}3o߽}3_O8jL bu^DLO XZȎھWp\Qg)9D4#,2c$368ǔhŰѮ5alU1$]kT\TBTڃqH1 >x? xGP=D$1 CCqId. \a{+Aj*7,>yl&|T4گm}cEHٽ(Lu]Ak #PEB5v3ޙ3RBǶ$irnQBr3I5<Ð&Tg@]g@/$c!7 !`@|lR&b ńD}[="69D9B 0+%r a|ϥZ.Rn\[|^uMD1(UҹAmwnׁPGBK$ MXƴ$3ZSp):7Y)u}LOtvn$"go.nFxug?W+JN*HUP[]府FLmJ}mX2<^̦岑PD+\P6ikv77 B7,++77|o߻AB:x^w'mfOo Xт^Zk4ll<*MfeqnVW.nڽߴ۝6WrifE(s.`T5+*l$oX\Z)M^ۻ-aqA vP$Uv080C0@R(m:Tch8p-o$/MzJpYMAT^uiR[6F.J_  ;!^%L@\Ks0P ! ~|ܻh+]4rG614db]v`  a9%g*Wc`%;[> ^i 0\(X<:EN`gTZy),B[SQy]~̺JH ՗M)/~uG맽#16X﯑`%m'm7vRr(eLvJ*"xbG~O\>i}va\`"!$kRk ]\BB-Z/Ԣ3\e'm箊EͳےeVv p;Il$#Q@o{_ƾ$Gcb1!rDZi܈0΁6iJPAFJf_I7O>=-Y0~G[bKB6'UMߌBo3b8 'uG"1A] u}c'vn!ŸBh:nY/͜w}g>sW+UR喢OQwZpZmܢϖOٝ\`I 0x2^ZS~-1tc3@h2\J?47eE`Li>fO\O~!ːt7(RiN9NcZܥ:tX`@ 1l<٘J,M9H D<yUl6GpS]ߠfvci1 h/(y 6wxdWo,G~MBp]"wZ7AcDĄxC$ V19`)f@d ʕOAut[iY;zKXePjⲃA;%>J6cYGD^-N\p_! ?)!VΣ sX:GKl}CDDy" $ϝƀBŲ4 +4>j(M6"V^m5ѝmz&㲚OPH!W _]}כt̓@@SmzXHAHvC]K8rxJwh:Q{ƸJZB*ʈOS$X0́Y2fxNu34e8Vyk]MvT$(&4Spd='(MvWjG0(T}@1!3p:fx RۭcDg_j^OƇ>mȰ~/Nt?}o1ء#,C`W< !nxJo:HD-=@R)%%t+'\RsN,!@ s9N,glP(Հ |BR&-RNAEMKM]KJ70bKØ pL,ͱF#@8gcRmٙj8煡Hjjb䚙.ʵ}{߱3߈y"A0M)XqC-s,Bi34,zʉ-['aZgj{$զ 紀y=ka29s6~pjp\VUp#`~Y ;6-ghdjqי=QW n,?iC +[}wBX2ІDT2Ә1b""m?C>8I K{Y"J8s`(:h_, 5q%G@`E1'2"'ߎ}s"`?D}wzqV}RƊ\oE">.ʬon%w6"q[& m'} C~y.ͲCMk+8 AH á" E0&BqLӱk-2֝0 uWo>+O_i .=N7Vփ.#~nZ zP)yc7R]TJFk5)Ot_HɊD[&e#+mrכzl$q-ͪ0. &xD9 I R C*C}܏Cg%]m׈A-]-{CwH8<7.88kѪ8Cgo_/Hs첦nKS:ÃҤ~Y_7g5퍾-=uq~teKՋKiA3V"qF>VHf5Éßrnwp oLԎ+f2^^Ȁ"ţZr\~PعCfb.XkBc@g>>8:GM^2.O iMuq>(8$*@DTugFuZpVo^&ڭ[VhoGlܓآ[Y#vp߱KYEqlc@ M|$]j֪Afrav]Uz ጓ#rH0PP<Д Io{Wĭ(YcSݱ}zKCn&G7f|1{>P!2J2v+ x~d 2f3[vs]EiVu:zLg N4"$Pd>M$CAS`uC?eD |Bb֫D{ogf= N<xpn5_]vE% rGKrś'>{|e :ڬ2G}|N 1ҟ 0>zh-1b݉SZGOr?uwLp!ۚ$N'H}oUI'kT虱ҪkBf=xda ~Kԩvc"ʮr)Vݪnc<97'LloCwƝz"39Yta{CW4b-(>S]{/hYћ?ݡb!N(3A@2 *0!' CP:k hS @Km)co:hq_rwïpXt0y}ɺzƅ1( 2l~gOAƸ䠀Pe cad)8"#$c@ln/;1zp>Ǒ h*q 9b.ܙwစA2Hd1Bit!T ޠ7;݀uo]>ßx[nQ݆0<%E^ќ3㪼YW [)0PpϚQ\uo" tl[K_#03;$"DkA%"Jr)|1y@6u2=a~̥۹ VZϬeϚ0g5<+/-wxNT7B6lDoC3D^ 0=,tnfD |eDB8 C!06B ݶAcCԁ)ד"yЊǪG^r781FhEd_|W%dXepszAɗ0rP^T'֯ԹLIma2R,j<--WI!j]&JW[1\jR]Z1uϨ&C2Ѣ[khI)4 V$X`jOW> e>p%P%U$EpiВ'jJ[3پTT3=Z2 |GLiSp5뚆[T3I獃_EirkMEUDr{t:{ć>혳zV-vbcT){* m޲GifBa,Oи8 |)=kϞWSRގ<=Ҕ~.L#랏؁ob0>ٓ/:C̷5AW5)6ڋJLQyrWr+8aQr1HނNBW9 6e65}MwT䓰ݒ´7`l4p&iҦ!+⛆+qG/TT; aK{¢sB ]/Uch+2)x&I SN6RBFA} . -2gtRؽOnJA0aT 1.PBbE1&q^#RE(J3|)ebM*4(>W1$Wi(2Hekp Oݲ坊N3]3"7n2)dA||Ԓt]%|D2)-Upr/._mWKG',V>xg_Rb#)InKR.D^ou۪w)&  Dߏ>6d]{,K 2 jˎ ҅8go67 vHDD% "Ac q2 AEzGXQm0Vw+pya{d:^{_󑩪*z^@{Uۅ`7Or;u Yy3no:tSzU312S|}5]ۍ==s/j̨~C,_ؽE?&VK|o \"4C"v@>3.SbXpKŭ TR920l,d}IuqiE RSAqU5Q ڙ>!ηXc5w4T!$e*cB)E>פ5.(*~oCWuK SSgSǤ BbS! R K"X @DB:~=tQ:^HcvP=jKPn 04W*+fZJ;Q2$@! b, sפ+NyDqdմT\مëd` =bjd^ZJJy~9OdiìMJUd[jrqK^;!!LAf[}fF -@aCCҨ >>WE>u#mL=3{4 l+O^EDQ'>߁*7nmcJ:[&tho}}߅Hz7']T|(Uqy%u1D&O EVz:UIڗ%ٺy,3Uժ~[MNWi)HiQwԤ[^DI</Uݘ-BեUv]1ҚD.̑JXib"YY3yK"N 7啖Vf7h'\Pv˹5hh%ep]|j Kl`I s;+Up0"2ō5.2 -ٝBڅ BnuQh-pѝIIMafekYL&>jv b*؛iU(i[_3nזq֫[Y01O+ٯVO_rcyFyaVKL3w~}<}p'Kc}reXZnlrF3`-s\ץ$ІSˀ1Ab Ra6}j)ޮ}[OyZX4k4Sfgwf-TMjl{WBwR,/%MۆOiGd{sb-woV2EgǜID~?\Ze[140%H6`J@N@=jkFb-Zf8(#L Eev[ž5?Ȩw=r\ɠv[Jm@"+!Μ‚_ss4&Sh.V8GV,IP0c M|5tQ]|/ sD7Dž4 oZyC#0j"z<7 &Q<Ҕ9Q͗1L!SgBxJK3*š6 3(RXB02$ᆯ+'+i(!x1k[ZQ NYn)YʙR0 JkNJGG=?Xe9^K7Q.0*V>eıIv^1AAjJ[(s+r*pJfpdNYboIЃYw `M^6AOUh[ڟ; nTs]9vk/"js&׮u=ɬe^x/L߰]7ePבRX/t[~ohwؖ;7R'㜾<:ߏn6]EgrNihҞ/dWs9F`A X(&crA3fBAOIEwJs[qv5Cuu~הi;}A懗Hv#S*gvdRhØ5EA鋀Nq.^=][)Ǽ\PT3 N`it6LK=%VY njyd]Zu4AǏU>1EKC>|{^ᗉ_A2 QMdn^C| V&ہ=j:a_ 9ҞYɤqj@ ?T<゚仕ܗ ج!!\ ]L/V6aR9)Rsw :G1H&ȬIVPJH@)&U/wCJ !!.lͯays~9pĀl@'b9o`)9a/]}R*6CRLsQN3KLZHb \9WHױX'SĻ)YcٵױGk}b1Gg6ud\˽hWkmjm IB; ɷktu]Pv0EKkI63y"\ȵ.e,(ٰқrQFJxܗ̗EF#\ΠaG8m;b#՝pN+-}=W2n<ƪ"`e]`H+ 1{>K`{IXsٺꗎtx4@\A^It\WʔAz6AWos߸$d)j]ud?z?2YO)!NA[A8#~=n9 ta̲ 2KEf};}`2%BŸ8=WUB{jR2m<-\ڏSz=/!i-i`LdNHzn.g&cq)3R2ű*xF}GG3@4B(Ii%5ӀҔ0*utr0lV)Vٴ:_Cy]qj4iC/5qsӒ`*TIr\*( @)7TA 8fjkPFkZ~%(wˍ2AUVၗmkkyM[ :xFkrY(vw</ Kc8<)\#DžlǻkO)8V9"/ O=UĬ@$ řK E T)h1)4_"}mz{#Múޖ#%~gwKkO'hp 6/*4pTo`(W+KaLl&$cu4+F?YOzR!NgI;2M&$chJ(\"frNBde8c/:3~LUxޅzwX# ]H ;bkeA zaZG:j-O ]|Ш:RT/ v,!ԝiBB(fa&[P}()+$hC*L (΄L XC/aEXyRo*/$ˌdVJM Mu>noܵƺ\ $˒xtbӋm%R q [Xf "m&)WrK 0M:&eP5ꪆ; IU|w:؞MbۗCUěTxA[ݞʹHuzA*^J?y}v+E=A Sكץɐ)(``#C?Sp4VLU(DKQBe!dJxc.ȟ 68[PS\ +qV@e%BMb_&NhgDt6rL4G s  RFߥXRLHG/).zpާhZ~0}|:3\G{juy6~9ȍvyF=;({%Tg=?r7z=.nf]ڻ庚ntRUȋ}O~so:,XC P uw'&q3Yn ?Z]02ߌ)/}C# ؀mJ¥,[C)ty 1(̪bAhSWf5BTi-L&Bqyi.Ĥh͸y27D㑛K}E"ˤǻY" VoZtn} JkY5M_#?˅otֹBDau`kn8fڻyXz^Qz]qyEWƱA0g3e?!F(#Dpx#nEL ֛_|a|/^:AgDp:cy^ޛrwDdE<dCQd)̰0!R}ܓ+HDvniH6,8ZJM8Q́u:jJ{+IsRM,Ρ\ CM_1p|썣WC#q6lY릇t;J[Gi=Օ0$yhsQ(JљT!2UF1P K 9y5c/qrȸ0B!ފMNY7H8A9mYrvH(JSD!(!6'{[TTk_MDd|ղvE-}=,քuu5'9 g <{ݙl.$Ra͆Me[Lsn0Yzt$$S :iߎw*3E<^tS"w>j^ {iaG 6׏](*aq\s MÍB,1,U;uw303HɜSrWr aiFZa~2^%m_v&<9G\Wxk.) ("Ӽ2k1_v}F:GCI^xuk`͠qw muۇlM'f"585wYIAG)*ES!6y`esoڭ9tՆ$8@)3'̥x۬ܲMS$i&wd,#9K@%∝^VZ[o%Wwۯl]lMc{q7uUpK>Aƫ?~X8 ڀ #KĹ 5U;#<0HIuAu]7[ c/_( %x8*W U*qrah@öqո0HxQ3d?0?">R o"BJI2eԶ?0GmD~Ŝ `v(_I Lǵ_qYw~̀ж!2%E?>/+%f|vͱD r+t%_X/[X+Bg2/nXaFH!-Oa<g~43y[f'2 P"`! jZ?xiFnKZ4l@9(h/8RabEBЖPa:It<:yhᱨ1M} oBPp%M3y;ꔦnMrm \KX.f\KH.8ƣ@*d4J!ڈ[t**FAgdX|[目a6ZYWn 6d gd "MH2?9?{jP͋9 {+ys=?Zj>2~]^&=Vyj4Ů$-[e8UJR\>Oնe__o+kܞ=Sr:ҿۛI{imftn;P٘ؐ9.ڈf1a_b05k]Ƹíߧ*> b08q&a @L8׼-L+W) rj^ y]r7'Zg5OHhws%6WH( yUV(Җl=D dJ=uR9ڔ2(%p:(15?ԥ䗖i]TM%>QF9NQsTSNM$2yOR &H (1bC>u*? Rd>:Nlԧ7x͊8OĞgqJp88YJ2f^fD.4Y(ªtX/,DJɈ ).-MÒ9ޟtp{ @ H =:A #W<$s `(E5D8Ějk<H <\:=ەPhzCI"&gmNcXtކ]i%\?aCDXu^1q:_SMPϰ`MϏyQ֣!ThE| sJX|ibo(1>컱2% }V6*pt$I@ڬœuHlO@rne:аME2\D3*d|Y}V~r/ ,)JJm 3xc£Pyptb̲)i^xU*|4k)@V|f8I~m u "#5 O9Mn+rDadjf99i$ZS" @衬]ύ w ̱/fjGO xG52ĔzTl+HyAHhPˮ,x5h@uT#_~* Lb{dL('s%i FVaJ9+RIG,)-!s!DqW.!m!'CimU&1S7}ɹQQRPKJ'-qH)mifD>p)|ސ2@`Bd2T>߫jLվ=s>~L gz@?S03BNfINWZq0)+$*U*Ki A‘*#/P~1w\Ai`sD&6wnzf٤Xv6ӢNߘOܭEZ7[\*xȥuS3: 4n>w2 TwFM'Ӄc#{nv11 a׿HWH8ϐ`M1U^3?syBHpV-YG5G4 B/x/7SpOvz?"B҇<+ &lS c_~G6jia6TH6-quM>Td"abI ô33,%3ęaa$~YC(ӬB!b 1V1$)1l5+sJoq 5@^a,gcEA-*5MWoݺV7={uic0z?T|ǏnJAݏYBi520?Œ' qrpULBs/#}B2'KL k2 cAY=R*b]sXկ"vs=t޴εOzex ӧmOd1F UנO(62@Hż>`یGEinO˜D㰶H'Q6AB?pf$µiΖ .0g^nl=7(KNt^H*66gUԛ|u~a'\oUA>)@V_D$sWћ_α@0O{/uc<9/4( B@ΫRRR%X; mY^/kgvsuLiH7U(1vXב闳z0Ixߵz,QIyIOJ2f~8W,ƔFI b6LEPOj. }W5WM]-®&.N༡HΠ+c"]™L;ב̸_)jueCNU). 1-a΃;-eyG/co*HM9:ՠXâŤ˻TP&E㖩z5Yl\sC/7juuy佺sZ2HsT>! Div|qXQT DV", iWKsa!2`DydxѮZw>_^5any5Z(g:YBgT֭yLed4⹾ݮ8mqv|:2]e}z5|8པq9_3SMjɽvsUDՃ9CŐ7oCpBŦ>WTI?K~9|k} H iq:=e-(2Hʸ3~(is_:(S6C&5 Y#JL-Q`&.5VI\J-,i}ĕR&xD^03`θ#݅!8|QDн.Ր0op}wen&M@Թ}# 1ib9r9Y-^I\Bp}`m'xiqT0{kqܔ))(@SQ'-CH KGVBXW 6}bTŗr_Jpռh^x:9XW嘧4'ȏ*/p^1' 0ւ!qb.!ĸ $DI(H{'e pgt˃S?gф7D&#Vo a>9Poל$=.N8`#Oql{gJ3H$I(4 JbX刷 %Uftq*'냛}MLL=;I1z;hhYI}9/dn$xgϱgr]NBVc9ޒ8J8r9b e\Csfmea់p?2e'*Zuhwmryhjd@lAW)2 Jbc-kTS bXA)]S1O%Ƶn\na B,ۖ)|VAb8%~HQ^ W=z "6c8S<+*zk5A"a8"-}+ArAk uO0+ߙ>=YS\4!%ùÖN&Ϊtlju@}S3Wƾy=#m{uXe߃aC1{8MS1`nY1V3zc# 5T #'3l~>bhA)_S1*6C퓘G\Gy)$Qd5@-4e<\Slp[jNYӮu)Ezvs[-d.ur8QN骍<4!SBf9*1G<}q{o~ Z6"IHEy,?Y7jXyscy.?!jQs`?I9Bar*}:]QfAo5<n>BE`Ì^m@ԥ U"ۄ" wKaЀi!C]+.C^s!`QZ5+m]f, mq%:P;%r_zA٫@mqV x՚:Х_8FR{2g-x< 1HqD0rZy'D&DH&05q35VEם3{qjY ><0hn"7BN* UlRTcJ.C:[v$ɧx~eԝZf(l Tpzwtnw+:stMCbe[A$slT3(wY~u*wU5Lұ|=d8pmgplֱLi%iĝJ+"1HsV:5 _%r4r3=e Jf{`1ff=2m256=gb뻶 '2 kwx-z'/dzmG_=|tXi,||IM) X%uȯu%A`] `jN6za5+/Sj@oZ+]ˍءleZ\e7́Fj7n*IMZAmcntT7{$U )[aCW<40Q bEI¨D(cuC-~F3plnSl%O3!,uWrr6r]q7NXyWfy ;YJ;,y%6Ze&V'U6rGEiU`~^'YqrMZ/s1!%J1酶}.rNmB V,k﹣+)&KuU5Sxl)\utr<۞LŕՁIĝhO4!\Y <Vp2?ie:cuS>&12!A(8p\h \Ie PD!_ןcux!8Al ][Iw3X!+S@# 1H L)TĒ "FMaGoc5KʴE.*I 0κfW5i.9]2C6 KG8 5+TJe"WA*?Sw\k!بLI\Yxbֻ* _љ7>ެ&YEȅ.ľ &-VP 08-0apRXA7"o1]jn֖ߌحc1jY8D8moyziYA1hbguPm&0c?[ٖ*ZIt!p+vRo{?_?@ʮAKe_gyu%te-rʄ^c!z^7MSEeZ^òЙ\gwjެGADRW$JBN CZFQbL{ zN yp<cǨb^g"T49@M'P ho/硻uy6@AvS5mQkAֿHI׌i>E1cʦx0e&E8#[=˓sՀBk,elj1FT(G3N i97Ρup\9 w4@}ѕ0EeY Ҏ"@( 5GTkz#D#8_2~bŐ/ݢ_TxS&V1l_ua {#t_W z?$uSUT*W88'6?ُ6i@>wfC.gSM)̪"w:ݷ1@ 8(BXdF0cpF&KY  {ҺօC_x, eQm9k; oz~l}niǟrJ+>Azo\Kϗh'?.`?tjA τL}'K"u`p!*<JvзfX,>Rp®'p\W0 Y+aHWU cf]#=M+aح5b[}+ەY2>屌v,iLC-ۛ5Z__Ʒ_BIaK]a4GG#,N]!IسۻK$ %XY0H,H"k'<\zIp\$&:G]/o(E8ze!;aDC{uŸߏsDh11kO3#2NH"CCX(1SRMc>OUyH3r6zC&#/L;vE2G&m=:v Vc_83fz })иk}WtRiQN>'U4}>QwMF )62ƤTWͮw\{@Bib-{h酝ΔXj+{ !aE-6/Eklɏ-E\Hë['g'VsB|TIL BB8rW4e%PJ2c5[WqNXGHc%SO\R^Eȣھ|z_OXl9:@HDRSCɅ 2 /(DbZ20!Otº3*'4w\뱠TN;Ts8V^`,v+.8i;ꛟ?<ww%[tcr\H>XY乲~$Bod2`mV11;g+n oScQcj`ڜ%&tw#[)}ⷧ#.s9Zlo TsPjѥ xWV`յO:ۛsK,S?٤Z3%kٯtv(T=MOcap'?, DՌVugFm/?+4pG#'.fm=Y!0Gag.KYlr78Z^+pS(U48Ȕ1+\gZ2+%u-&-!Q!L 8NPhaC7hE>ޡ:n|zg; C$׿(#3k/~_D[7=[O-YRx첞Q/gO`Q_ OM\4eK t+`iɣm9.|PA9Q+w .wOD)<֝,2Fwilt38 ĻDlEis#zUq61\7 04{=MH%nU+nD;#juvxV̤AT-yY$\c<(iRnE9 #ݦۊ}cqc<:(̛YX =t Y% xE#n)VBFSA-}>Z,^$1yxVw'օl"SB^dOUn 0U/VhTURlF+MSozU9hcbL}٪!_cyUˬF~,4 8jh?tyPOOv`!3 er\߰i.7Eʘ1JT }DTB< ͳrR#пv"wF~.R[wgBm3IOnM q$Q] 8\E@ (P(esR].60j9=CJ!iVݍaWǡ,#b>csro_s4a(J8eQHURrD#B SZ0VcVǘ٨ˡk]VӠ> 6 [#v YS㤍q71**j{2[Wm\.l՚Vy;LR#hI?o?+6 @yض'[-M CBkLT0;U$!b)2')a""!%}@Tk;/}X_M7neJaɎZko<+9.5sXj4y@Om Gw>g=x=@H~O}2O',2 Qd/I$YC'-$"" Vlo;yW<{ggx|2Ǵ&81 rNn^s[d77tSLQCF1DI MHK@*BA :m nΑ / fҬáo0;Ʃ6qh)ckUM6# DaK)`"aDR8"I Jk) , )Hxjq][he']/8 q>XԘz~]5aoష\sL-hUYoqy#岝dU\ReIdmjP+w>M^dcU'˧,2ȴT0!? J0SB$*$ܤMYSplfMVKu+r'fu{]\RX_}/*"0f=[))y`}TxVwji[G~'v56(mvayܗYou*YI႔8IYj1+U65k.ϵ ԠF[+!]CM\,)(o98F3YL}Qce }Fk'V^Sy8C bu S~0_*!OR8U14X]rB̟¾KWu3_3_=$ayHB͌"O]gkZ LSv$M`e P*I2e(&iĥJ+iA8%rUHi{hWYYhHK;~Tlt>vq`^Ry^uW^}sȨ?taÓ.K5P-cg^UWzC=06 5_d?!NR EL!4DA"JbYZN 0LSOSs'$p֚EvɍPsec(>lzQxCtjim]6tgErݶp'p]J17T lͭ=Cp&Ѿ Unw.n>k9aW^RdFkDbAK&f˶"^lz-MvT.hFhC>cUwHZgESGO t-axΩ`D ZL z(N(D)ƣ0N=һ/v7:'ڑ'= CixR1 &4ײڡOdDHGq R,()O!M"^UԧWo%ȏB~g;]P߄iD#I Bh(my(oY1 V8V9K%g(K=zZHQcMO LJ*5}lv!CeQ]EV' gl;OxrzMt]VkVAVkEHAS<+F CztI=p9GI!P"P`F͐"$:T-1QfpVl5,35e~[L8>yM8:2xaF`0E3Խ"@~qٜ18h+/:o5 qʮVwZ7~nnBݭonۍ^<)oNxz<'ݝm< I>`2(l8 g_k,"5Ҕ> 2MD,X0(r͸j5(i } վ!5 5!8V^' _R0OF>UW 5$AV/;Mۧ/ۮ~yygބMDMNIK}{G\.Oc럗Aw@WMkvtHgni76n%Jk%X-$])"|Q$QMWc:~$|]ݮ}eNcjs-ĶXMFuUIγi;z@ӋxLrBwZ4QiJ㟶UcCzeW J:6$0%g,)ٴZo7/5(lCW'Һ@5<ռY'b@eqfCTјk͖;;d ;e$0ZRz05~{?s 4,Kz{zo#@+SԸ S` 9>̧N' zGp!;Z5:B{T LP/*(ύ &ϒQw B6(] 2k±)\68j1!P l.KlcI34C @ u _Y^Y]u\ձY H W tubU PqT>;F=Y Ua5c1#*3a(3xꠦ6Xj <.#4|IqH~PGlc $6т$͔ؑw[Tgjn>69uW wv/B &.vC}l~;A=仞BzA=pH}엻4__W\(3oj<+R]#Mw$ԭ+(Bx_25:|/V%ݑꭹvZ~}A :B *z-%.Y#b#O uP0bAz`71QwYGx2|o,0\Qj" GFXA':qU7l\N@ 0:"RN)m S+Ge:h슟ʩjl_*XO?cbdLќvZzi:(͚Șs)g̑izR#gć!|"_`W8*ÑC]jotOS0V2PcU$Oa+{cJL7 es(ȅ0p+'L/b"0EOLlo [-rtQIG)w_eW^uAB#땘7(~OQdJ*>@N |@_/0X`0GG6U{ꡧas]jөe [VsAJ功|X_eEN$yAO`m"ݛL zɊq&ma}˜Կܐ@'.ж1G%\DB%  IQGD0# g<DVA" LFd6dO3UzD Re;a342UR( sIH}y>Hg%ىU'ķȔ _C@x9teY>˷jQϳN/ݻH.R\@86w/Eg"Xب<ȯ*#f?x-X_ҜŔ!@𻌌x}df`N9;p>7)\ OoU C-$~{}:(bFnΓ]h.~x_fKnH^>6N y/⏑]PoC,o@NOw o78i9 ]_CJ\#@6?@y)֎&Y.iJلhC.d[=ވYySن1fGz4|Zևjś|ԡm8.N?ꢘhc܋󁯿K(谵:jk@צ.n <:;x#R& El. p:ZnΆQpB،\XY֗x=>Iωf@8.snU7zl7@]F >`XRaٹYvm,|Sx6p<ېE9o%ɜ[jh_hy櫛(HNRMϨ0%ЁO-|<]N>-:j&8u;3j}<:ltZ=4  D8/e)R>dx|~sOwSTÍƑOj58zݟݡ1fBoA!e "H?KO$mD-[BkWJFJkNj5ϋ<'&Z^w (/Z4S}x}NHɍtgej6(YP$x56b5楅޼4I]fu[CUi [ 6OG1][H`N)F`3bZ @.Is$r=)dHx)qkc6a)SVb~'wXZDkG>ĭmHZ 7cLRe*)!7Pl`rI\ a"@Q p=gff1mqw`vc9jzسA̙Uɮӌ]+!MQUNap-JtMF6$7Z,m=_m!ՕvZOVO|.飭εmnn.#)kۥ•AUj!d7ve<խrCI BG҃Fa3O/N#hD e ~̘2(z{ECϓ!HS -eOʶ_|\%]XJ}eN6aOO?}zl~l"O{c;_el>Mټf3u:Z bX-Wm/JyWZ H;M\ǃ#rXӋ ESYCJDvGxzp$j?`Gz2}Q3Uck☺8Ǔ-9mGQRLtM9\ W4tXQI?JhbeS|sQ+^,Ś[R;A ז U D9lct > +\70!1M):s ( JU&>gs Cmg4_tN3I,Sq:Nfq׳քF>)\OiƲsqKɧUM{]MtRHVٹNr&Lͺi6(}{Lp AV(pz6JNRkTJ0]I늧,+b,CGՖvG#-If8r?WsLSq΍4KE(ؼ+WY&!ake6Ȅ֡ZNoНڠ+U~TiCe;n|39ߖ.r]Xv/R1$]c(]<0-@"<<O/X>CP@0Cqg )ߤUGWTmX;ڤwo1s:;jz4=f+iB+*AL:eRMn-Tj{I?FH5rde 1xQd>p=$O}APH=ć:Tc g G+ ~ej_U2S2vl[jTȌ̖Pj5AMˎ$xN\1zw 0H1 0Х2X5AȚua$4uU27<N>23%m3=X*9h1\V5վ3H2/Xyy&%!1$#)^@UKŃ'r嚯տ_Ջk]${G?d@̼2vuz{LF)ɜk~+wكk*q Y>1LYN6wՍRi6:5eÒ獶]xldSisWG =TWQ9m;oŅ!DcRKe.HAɔ'kk{mdzLj6l!$SL*8gwj_\ ʌu;"EIP=J#6@ݍ<> +*HBD#Uut9O+d JP#+&#8>ŭ/rKT R Djv rfddNee Da`v3#vpcO׭3ߢ>^_Ygfv4lv3wCQsljChLȧQ(J'6=TfG-uכ5r8p?[ #D&&m ͪ# :dƍ%D#mVkiS2rݦt$PC+xf댱Iga*wxGCv൱ 愜6v&F1,)2h 4SJZ|j.r_I s88p,\mhЌ(pqmrKIEJ6 ^%@=?Ui`# zp;zW8Syݨaԕe-tJ!'VEx>_?7Zr:rLErn)_@t1`> y܃ye:t"^j(4ED5"㌓TreSJmsEt&=^Rœ}o 2x8u?#]lnt ]$p7S!g'E7ICaX-hWP)af 6MLLa RNz1턆ij t"E6n,N?ިWpL ),U8%ZBiƑb65!`Qv,A _F6~\Jfb(9/zSιғNU EΖy1:6`Ίe\L#jfݩezq~. CƬjjG13r%tw(!_X%872cN`ŊYQ0ŕbuf\}[4{'+@)7~d]O u/*upf@~_.0ەvخb'C/3Dx^2#  ) RBM}N.1C,ȐD}1!3zGx}#LH}oHKhԒJRZ)A~jպ@jmY$ ܾ6/ L1:@; .$ftN'ƪ[:ڋWa@Z¬Z#„%1WϦw7uH*O'hP[b}<]6$F\R K)FdH%AHJN̹S!D}zSm}޿9r,}a Mݥqʘe-zZɡi Aˉi-Nwc/T?C u_ C OգȸPeI:$N7 &|e4\8et `3A>~0ܟ6?1+7KP? ) -[ '᫘pU~`{WC#~mM' \TӤ ob4Ë{g#Ž.ֶYԖ>]7-k3\͖rkvBZg{W(>jC@ߎB [nV!.ЈU8Ǟ~u$M9"|ǧtJĖO`#{$@5)_ʹs P42ŎSIVeXON r*BgA&爖 U@^,{l$eïeIqf3_uv^;YW8@)\ŴZ-}PY.; ~N:O7"yG$ɍ;{::1IM~m&xn#9" !' MRGGR! ef a5ъIl 20t'c`|;绕l%?=۶>{ A ICS3Os;=]N8oϘ)'N4 (l1ơ/43ԗ+4Zi.I* j?imj"X9(´I80"rIL<_RqhB9n;AtA$Cs0Y䗱94ִŋ#R;gC X>f2m""\KOw .?Entf+?#p鑾agR"Z}2T_ H3Jͭ4 q3ˮ3X|tޜԶ5k7gU56yw*j k/y} ˘apbM^.Gc3jOpZ+clX R ːC|\,0qށ*GrDZYj qA_@b ˈwQpz)epHVe1,lB%sbm,z"B%q:Ҙw74"0EJ !E4SX{8ag#dX.\,DLT]ټdS$WGm {/n>dLJLw蹡~j2~U?kXhm=pͺ*U5v S~TZ B nh X9xB'6)dxt֢ 9hPRa Ld7_o_.M)r_Y::D #$MioH =€Qs#B@@Ɓ`0Z 3%gH()9_=kZհ84hTsfW]]ܰcxS:$@'L1"yj^Lrb5^M Ԗ!a sbRzR 'wK/jxI:ŧX['Hi/KZ (GJ5?:ݕAewCboz}1# }9=L@ ct`7N`LiQ2P3f/H:6;FҊJ7n[;f7&xal -vҭuˢXu6miv/ }hgz]߅ __6sjdh trb0K4V)gF[{I3Nʘ]Q,&tL8N {Ѣ8!뜦JQ5ai2lw;QYf2ސ޺;?>T=6W0R}*/3"snhyQF2x\xO8s>@B"}?t}Zm?\RJh %M|pA '!N}nT {YAJ9|khWpcW)~Ω݄W?{Ru!$]KxK231޷kY-,T3Dk( qPkQk4"e"q]㩭DY)ԛE"5Ӯ\S+L_0nEؠ{K2Yc8$ЄﻲIsc*,G2g 1Rh 0J H#d.>O">(8ôNC$ Xn(U ezH&a54%tԧBx Qg!ƜԚ;%.tUbޱ"`p k(XYIj)?4_䴍ff 57޴?W̼#NpLt=e1Q0w&ɜS+̸$if.0sa}6QC!OӴ[_V`t+-zKڣ202b> 0 ((7d@L1buOc85$`$ v?}au@mN-{Kx^Z/?n~4JL)"/؆c:^C(֘1uߓ4~MIO<' ~hJϜM^($2mAFGDziB%\"CxL2Ž0EjCOEҿ4qcv%Dcbr!ކ!%Iζ^/ܮmquww{oUԵzitcXݺR!5y*6v6˼U7ϷNmr7<$P:V'JL9$ 1QTxgiQX୞s6AM:gZdHX3اL})o`o s;kuM]H^{P%N389b dB 46r7 r4Ip!3XBBc9/vgES57j.< zּ7~N ټ(GGJ=H7o3U+)7XP]GQ34`5vZHe&$mId1T2h&Z Z"&tP9G5; G_4X*qNa|'iKORL pL#O .VB a͜B8NԯQG+N@I!gABMqaz{j8ۧH!{3BZYrkӄ~M:J@857yV)Նp|dAwH~ċ_lJ9V"g(po-x3/[׺Y_8)ysYz;4G2[=ܐ9"Rh+Hb-A!qlBaSiRU9' LkGc[y1L`2.mr,Й$:ˌ Ѿ2>E>T''?3wLFU0zMBuypK/HfɌqVHJ/1;1|+",01Z#dF 2U!54uShYmmąƳH}L)~p2s2s#SO,? iSXFɣRy -CaTfI J[}FfJpY_b<]ތ{[jDx |U7`W@WG\_%e>;-XXe&  Iu,@+،J4BrgyiMY]U׼]K}'-0K/*W[wƚrGY;tPbe5Fu/WSjE;|V:fߺL]-vR+iuigaDY7Pe͉T%ǟRl+ab1W,e_2b;+73]Mw^`hEi;ÿumËX4 hF("6!d"$pT9aoMfN Ղp YI 233 mîRVL6p:2JHH]S))U.4uLK?G&5I; oZ4cg81zcƔB=L DKk)ÈG=%Bǵf&~P ,{oΊAzy]wǒiJ>)[\,- `E|RETSGPb'Tpp,qbjLqe/ 3Lcc:JVR'9ޣp6k92/B0tD*$har8!hI]F96Ý[ ӆ-]?)bJ`(v*VjcɨS*ᲨV- eXH-yգe%Wy総fq`&ga"Bp#Å*_Աӎ$Fӡ"vFv;M":KkಎM52mSx*-߼W{m^ eZނ=>\=>0-fdd끱rб&ks (VJ!ǀuTZfq3C3`v$L302N-Veàbm;PAvI-Fw:3{q1&f`0.'p&RqiHeRh2FcG0F0Ueͅt>#c#K :\䉇6%\^Wo?q+Tysǖ>*u怗LTg:<=L!m @JwVm1pDHRBG! $5VAmƴB8B!0=B%ݬjڢ~w\ٛy f0eoY%H00پ~D_aRrX`A)lWNāt蜮Kn#g2n=uY?&ܡ^H9Z-m|Qhi|Uv'Q }gNjiDR1-U=0Fx`ͽuDyJFSTJli]@Y5yZ Qʣ6%`?d~,t4_cuA FNl*ykbj^A1i#{ԫv^ہ w*a104Rkb0!5̞HjNY!OǯDu۾Z3# *TEFF?.k:*ƚ]tR^"!fL d y臊3 `,d8D |#os&?]eȢpB>mYn^6 S " CP P,5 fam}n5?&6^!P/QAjw 2+[rxgܜܧ1l A 0*ףPjD)dFjgDh^\s4yV2j'( ۼ]-o⒞GUmÝ6\SWQ[ɸDn귽{֗H (;xL54j ЉvT9pl5͕20R״+)]HR3BmB3&W*B {y"jS7>y0Bekzeb~7Am\=1ou}=kѮ W p#gwHbvsNJnT3qjyIi|ɡ X,F4PF Àp=l{>9*D[7<m[qPWsͭڌ5}:Wjpڣ̪gm9"k)f|=i@c@q e$_q@}3rxS"Z|HRC%ڥ6ٝYU,Q61ޯCľ0F8s۹nyn?0ckvUĿhoL`W'gy[s +\uI(e߽Z7`f^Ju}-y^ W MW0u' 7UoQ1byO- TbFAYky~"a:>3GkpG 4`gG^֐ ~j{]՟ȃq ̉\{np*k6t4,̈́y,VY8=!7w2Too~,_7:4ӽKqV+71*8>>͞f?m<]UY4Bfsw(ıXWx{o7̦GRfЃI]۪"K%H2"d?"%<*u$Om+rCωE>cq@l(ތxL@lv"Ĝ@@@CA$@~9w^XϕN,(CWsPj8wB&m*c>II#LV(=X2rє"\8Pt-#'_-kPx"YhJKZ"Trb+}.͗Vy͚RXͅn܊xzEM+} mJ[Y`THY_7?}^;| WK#ՃRP )$ͫr}fyD0 |5VAhD39ѹ?ӗMY{r4eDyjʆT]ì75,Ȥ zqd.lh4Ul>@,(ZA'>o嶮^W6?v}^4Gx/ T>M6Cja742'ҹЀ)\/޾)w W~0ea:WZK_Y; _6hWýwUlV,pnӴ| 3!.G!PI/'! rdHȰ/ł s\zۤ ӂ`mM浬6v wF|r:4G,t-/y\sq&z6=QkۮUH+*V`vVuZU)Z r8ym^&6=K+vԴ0ft wF_qΠaz h}/PR0`+#[I<%XcYud'1vR:w& C4x V"ѕIgMКty\DNjOO{vҞ•9{d 8x1F"4 q`DQB<FuɷiqXWބy1w=\Ź#k+zݴ *"`?Xl jlJl7cM2.NF6 "j켮#~z7)Rc]nxd!47dJc/;Nl-mc{?Ӈ NT:;ҷ#dc;;Yz7vH >/fFIà}tXvˇ_j( ~oyjĘZ18v/Wb a\ ;y;gG1bֆv0P{p pztꅍ]2ɈIƁ#=,aG 0nhXgzP>)-`10ø#NFwvGdI1S9bs0f%숩xv;\Z{+m4po] a v 7FH>ax;?KQ7[-":.$tJղBPS <Ă E/A@%Bۗ_R6 ?Ns;܍٘Qc5cya]kI`zm7𐅬 AD$㢫6s|agg) ֤&I|eכ칈cV:TI1 k;˖ʤ[O#EQA2r5 b2Mq \I9B*Ϭ"u\Ǚ'p⿽2,^ǩ0 [ݴAKJzVXUt˺ev㟫s6|~u7@q\ LMn]]| ?syڕb`Ch̀J^<s3LY}go a|DB 1S J){Zp>rjofv0[ßﶇT[2l{ӗU s{W19 fSۋ(skZ̜D.rO! Dg(A!!6$4E4cMcж!7֬V͊mm'$M;-&۵%rȌ]W t\ŝΎ m=Jl  y4hfôM5tbP{^A2L@#F KU`Ra{z=;WjÜ nK#SO<8>c>\i}7Qi3pV*s RTN" rXۛ!u]Ka:1p^mTiCჵ aQN\nntDvjk}9yH\mitT_]7QCm\Ѐuzuc6}iʓh]_%:Z} i9V_u?>_j\\s ?) -USZ+va{ֹ i4'=Lۻ$}Ԥ 5Z'@6.|45AܟYRT,q_d-O ʵdCj'u9"TIECf1kQ(Qa%~xB]mbPl۫J+c\UUpOīްZ+U4r"#RnPdͧ@zAR+BmY y$YW[2j%f9.lV nKcSJ&es:hi7wk g^Ro :$29['(Vj6g-rKRù$S<Y cO(G^@)֊F֗0~+ W #ϏN1sL Rvt,+R}{>'KX B @r ^/  }Y3?;* ,)!/R0Uߌg/TpaׇW~zi[b#- k#zA/鯇]ho/MT "F Mpi4`ܾxWs9צR.U["5椿D]>|M}o\haz0/_abV]y][sܶ~ϯc@ x][%[lGx-,ș!&@HNT'tFpj|ˇYCAhU O{Viqk :6-1ԢG({`B`0|fdZai?`Z i=j#rfot.Y"&zUԈ5z/5;53q1rѲC\b))Q94pMMl,ݲ=T;6[6*膛LgԉdL 84!8oST*x^$ `Ït۵;>UQD};JIuU _%"z 8H|O ODl5@L Bj%{@`Af:1<|$lL[q}3Ӿ8f,e=P'7Pt.t~Hg*1bi]=,EAbf.AakKh`k?ѿ۱M3 ?q9GlsM\rV5Bk8kRj6VV5n Zжňж6 =ކ lbؐnL_|h`.%Fۑ9D]&ZCJl *M 4 4 h1,u;Y1ՆL{Anqf78lLik8u0`dyfkp# G נ0drâ Ek03 杜#3rt5A^yǃnM*"@fР"H ߝ7J&G6>d99E>΋>p"156e oqoF}AV(g>wA  h*+u0B,7`bBD[GĘr b R@BRbYdHydȦLw"'tpo >RA#mě)"у޿?6E Z 1q>B̈I&je<K߿EFE4RWjJ;Y5Wsjgs 2p=(YRp}{7N-JW :pa` E y#B=q(:?:=Ci#)on#lc)t@;f] Ds$"2.Ö21Ϋ Cs0̨n"&u̳,yD}j3`HOo2:=;:!݃9hփyǷѧϟNoqO39?$n}Ȗb 5a g)118 _mtd%*BU|9 }|9:痙oAqmAwupLTPBl(S=J~nHE9d R3ʵ1b0+0?Nn΀T _"J *ǵma@z$HC[Q?i( ]#LEH 6#=͗Qt|TAE7mCMmC7&yR:(/_ tR U[-k \ c*6@ov9r53Toڰ&rGC'_Txh)_H֍lkB$𩖏λXǔbmfm>6叩FhpǘR?vk@_k':%$ Ov|]YַCP3 0=s^-еz)ATA:} 2p0b0;S1X*D}ob,Dgvgau!gg #goD gEU5aѥ"0I~+q]7 ͙7\#:o>TO1P!"P@.\r@re[@1@5m`َѸ.8)$ N@N09]"tXȈ=Hq{!;AY9d~ $N˜eq ſVW{n =|"faUhU,~ [B >7;^}˞Љ=b3=lȡru@Jbv. D}UoRtVUJkUP/?)fA5vЪv"\i*aP;OsI$, IJ\'G'dyBy}w0{!󸱀%u'6:*Zwۓza|T{V]P*wP06@P/kS &ie!s Yn7Dֿ~[nv֪΃v:8d4 i$un:4ض}QgBlM+lnuly w taYډuIgeyYM7n ԔX\䧑U ^}vYrX/#Wue~t69 UJݑu:E=Ϧ+"^9₍an"v3puu lEz3s1O96ܝn\ͦ8ro}dwa={݄X.YϷh1'Ms'tW%_ge"1-V|Gg'O'?JH&Q"4EH:xZލ%kqUqyx53b^U6 sU`<.l[p.Tw1׷Q1_ߡfEZֹsUD/_Ȼ*r'dtY}GպG\VJ{U6[ }U/KA:j1p*/bkDw.I b9]_ZޭnJYACqE演w/\L|yU$K$-V`xi ;Pm / ٞ`]KR, Hﺔvhsp?IR/ѹiTo?u{Z7ڮ$/g_%a?\=xs<=c'g|2Z_.HuzH *\Tf&H=BsԥJQWX6}#Dn]xnxbu ^`)70ᙛ.aBb }'M$ HشĚpS$U7sT ɕBfvi׭ީN hI/Ŵz7urlWE'n-VjWQQ@h^YAIm0B ͽM4iNJ$7W|ӌ-˪|-n]K\eN S&,5l*Jԡ~+N0M{˒ԵW3|Pl⢂.B6(ϓ+S%fU\[|*1:(/J"z J,0,k97D.mJWHfj#4kUf=p=ߥ+V]VıRHZybՃ`}:"I.Ƿ2Mh2@˯eY3bCAQg+k5XXP^ԯZ{7Pp_& ړ-+,BY]8] cZb,7hU\ylOD\UCAX%7եN*\oV?8,}-ݯb/j9U?A>B75HVBY} W=ϺaQVZ/Uj8d 7^M\?TZ ÍFr,{U*4-k5K|qNU0'G+N4Muɀ3ge&=֗8#?er"D&e&Ҫ'kZTU6n$1! ^/Ujֻ6 _4H1$p#RLէTXVYDql|7"鿯g".q=&w` 2ӫMCC;R|+!]wfd΂]|U+|~X!7b~M,3'M ћZLZ73oK\ꋣ=f8Gd4\R ! np9894ɜlEo􋢟s9|u}Isd~w" q꿶i%3VrW4[oN'Q9 )MowW?S'|z@+(҃:'9svܡ3%Ԏih;ǣ$OH9Do4;9iL%O\"Mj<1 XD2XisRyCV$g=XMh.*Q!Z^Sh5n`58ڦkjmIBB(e>ӃЪvF4|3v8sv;[ ߰'鉩wmbߢu[|:ݶpRN~ys.fWu/:;7,dq"렱?=١M^ؘP?"RlGxjy$rqyS,u=!!`L~g0>^n{',ܢuʨN6gLx.ƌ ҔwQ,9̣怈^lۀoW%חw)cyΈܧvipiݳQjqW8m3 [lO\ -ꊗKQc g <^@<&b*cvevJmsQ);})g/bY[j}sFWqSQT$Y1Ъ"$*@pxMB hˣO7cfq%kb @l|AWyryj K\K8V%ЉjtA'6}eۍjP(f]er$8b^ "1M 1R/ˑ̍)UgZEVf02ϵ6bhy[bO$nڥL돛Qcs>Zl$VQ{(0bAU h`23:%K%Ś0hJpJKSΓuaovU6ڵyiۏ.o+_2&WͱOYs~iz4a@f.4q6:qBP@ACh,y@l(:a+l :7Y !rF혗颢VB,ۂk^ujԚ} /ԾCjj4vp,tcQs[]q[0,d\a/5/s\CXi7eh f۹I:D_Ð=cݔcAslDD6nPaDFvb or@/pWK ]ճ/9*s:.VBe^)En2?vv*h'Z?õS"HcF\,"z& %#(Db\ VU)8"e) Y5Cy[?6p@\2;CφSW-vz.4y#b r^y5 7X9j#&y=ooL7 \Wj4qe5# CyYRV)hixNh^,sŴCIuC6blGn/.<.+&2ؾlD -h%$;;qà j dt[X7'w]q"U-Gna+~qve41꽑wW3{iKnʿ;t~>GWk(PRHW/j֦[$SmOMBBSs6{Ifw@DZ<~fOKwwz9S:ݫ.NE"HQo}uqQ]H1ienW3Okض}:H7g3؀uF0ũ˻e|"Ute(JH6fǺ SQ-RE@G9ǹ,DIR?KgҰiXfG;ģRق% /T0:`ھ>Dzǣu<r1P`By$*<5-k: Lhh }c=%aO4BSE}Mu6N 6@\jpuV|$Ճh?K wR/^?Gy]Edb6Aj̘ :ec[k5 *VGykzrȁ\vr"d A/O+f\[@ WHQz u*k/8XDKD=w^¤d={  4;LcK;ܐ ztt]V!1L- jnAT/pTZrT5iP=Չ$BE{+ߙ_ڝ_e VFNZk1vC` =Fa)ʋ5 *J"OTfTVyVʨSBJ)/ pW܌m}D.VndIU9w+t~%[\Xn5:㣹!˧[/~}qeߏu*w>۬9jk'VsO(XaIfScDӜ織*V\!F)e&gH)痱hVÇUXGW찢Ɉ1"0p }1fْ5Y:# eXUUgz" o]n_b*6$t|ф8Ave2 Z绔"'L(p5;j22ֵ{ٛ/Sݷ5g>O \gzfs0XUZcқVvvٮ gRbard &5ĉߊV> d-ywK&9#i,0=EkOtcp2P:=>dLƒ;ے ہ_2Lx,""H*""%Y%\E"IDR74Eye\9:GEztpfr8޿9 9xa|r ߬QA)+3|JNӞhT|*&S) HzJ?}}LJ:|8 ;OO75&@4E;xw!DG&'7GgaߝN/.Xч"78?7RKOO`'IҋO&|rpF݈T3c J.ʣT YEt*Ø2( KhnϠ3ҢƘc`3,-{ 3c p / P~(?Yy@D?" HRfN_J[g<"/eL^$D%%*yQ'雓 K6K6K["8F,%y4m` %U<OJۖJkJ[JJېJJ[Ji&eE'?Ҥ)|%H?J+J+Jɽ4DIpidI4J2QZh'ţIt@.aLi֤it:Zi.GgD78&JEYZkBtr>S1AXv|O˭-K4<2jk|>x*u\Rɻb9,z#?~4IңX|i}W!SpT . ۍrf+6P$L})lKKK҇vXO">_LNZ%*OȏxtrqQq-OƓP: S_Lo#Nކ9 ' iq'o/.AxchĽ8[2* aV >?LO#VmjkQ4 Ԣvuԃ.F3 !c Hf0}nJG)"#G7zѣTX=rCzxУ <>yXϣy؝pwt_%U]a0^\Eֆ aІflUf|Q")U6ʈL3"( =c:2|nAll!m,}g \S+W8H?~Vܡ͂ۿ^O.`TDRJGD-7ZB 2TJJsVTH@B`eIV'ۭ\7XoP^T^оaSįW~j͇9 O ,b=? kq9-Z243ysnL1-2骨J $Hmy+_xԟnp?m]1"냏F!g1GF\z HE"8Wvʈ\4duMRez@Su5 }ٺ7EflB~jȸm#kue^Q̤j4I%&ǟ^ߚ@{2{a.#EQ4I˪<7DTY|pS{ӆH.Zyy=ݴڪ@J07yĎ˟gojtWƶN{zz*M45r=؏X̮뻫GOk;^QGgOu1zFo={0?ƆB~ki1 j׽#0q%#lk䜖  7Y9fXLy,2ӂIh9Y;8B3gK!_%joK n8^MìeGXk-6Yp{?S^Z̀5 k(Y *MNTKALaU/&o>Fmv HjٗjWTBm` {*Om5d&_#''r3vyVi`9h!/21LU9B-3^TOD_wBl떌ٍVe/|AJ5_뼽[Y NH \@+T5Mfd#eEPe΍f(3h%JD(Q)KLn9d9ugTE`ewWO*o{cj>op!F#.v)㈽y-P%Ma],TPYXVjW;.=ކUࢊ>~! uJK2D"?7{M\1^@@29Zkk3:1B;+XB#\2"C=* 9g5 >o(Yq׺w@Eτ-mI&= 9IQa\VSי:⒖-ij̗j \Ijd^EV-@֬ϩ02ͽO]nѮ1|&15,pVz73k3\L}(KB$1Pa0 Dȉ:@SF4 lrtN$6*Wn!0\֏se"O7eJߵ`4議d9/~}c~Ʀ'݆G-N[mr5Hs:~tq?7Y}-> g2ͼ/fSH٭𻇘y+RDm$xb=}o _[<4|oZy'ߩJحz?MWj-_T%/k=`u.=~-'۴.+36ZuTw3ܩߡ/<2=Ny*o?ltc-kvP[U=d#y pm6$Rgm \PlO13;+T.w'_zp8C#Bm^VS?vU9Mޯ`"Fnpf0eFmW,b^,mnjCӠJwꗾ[Eyc~/ŴӪ?0_ /D%K[3.Pi+MuͳwI.ܱ|Z gC{;4| )6GnmDc-6y4Zn=j?X<ErGMe*,_>4`yrpw8~4x?e卬fzis$GS>y렃j{Ǣ pӢЕӓ%.tI?,Z>n]3)PX2Bj)$ AFHvƉԕs~_uaʗq -݆˅ ?JXEo[='ڧ6W=7Q4C8ǽʽ6O 7Hs,ǀpPHE:$bxkڴMFAm#^J/?N ٗ;䫅BvlɌg"6Wgi{1VKۯ6yL;^#MjpQ*'͚gN2 X'ZTpry#ȉfUjꐝWwOX 1b7NM.h vO)4{f9E:!C3P-[hum\>"_1;H؇sG!BOD@"'B?j"ѭ /OpZ&O!Я_6@f4jt(^ͻDͭM]޾n&YT:˖E?./B}۷z-x6kɷfobn/Hh/nL]Z|aYsz6^.p1jHIr֭. @!pcLЦS0Hb0`ZAF_r^`TCkՓ]bg`mAM!;Hty͋U.5 XA#PH Rs@X!ixI ~zqZoS?'\y"wq+7{qqa?MSnrÐMtMMvb DSe*ݳh['N1]·];1зk\Z.@LAgt (FlBbbHƈ!v]_6,mTi9,Nq=]ɴ7B ^! |k if|"C tLb3i$A@ĦBܦļbjyܲ]u6ynt~[]]-ڣU6~xuVoժ[GI~ZỤ7y<^N=TnIQ.Y]-<#4_j]KSL7[(6s!b{/Ro,bj`ǥQxaP8v\Y2lGi޻˛+ҶYNk夎xz0bmSrfu-7inp4/ڦf79LQ>]٘O=U=&َ/wkn;[rl-*6KaB0?If/4YllE BoRf`-;8֮9#Fns"oj(Zn`<5ct]3A` plN_bQz[JQrJT xq(\K *BvȢ|Qـpe] 6hfߑэp/~C֭{Wh5[d(kw2G6f[4gܯ OQF$M}o'l0P6`L(I@8¾ޭxk2^'Q+on7;9qde`B6fΆgwٞ֔kx,BH ւ :vϮ=Obj>ĝֳݟ1%wpb"F>9P}CI>65Q,3I[A< 7Lwϫp0֗mg(Խ{Q[PW 2ƾ<@6S(6'®k㎥6gVi)EJrE[~wǯx-t/Ԋz:FQd#\@gԜDXEƠ1sLC@q(dm91-6%ZhZK[ycx^Lo&ݞ)6DpbT%)pBf^"`Y y@"@ 8 TDP[ܸƔ6*E4vi+}=Y0 ֭0R3gM g0\T3敖@>˼׼ueBȼ}^SY3_:TZ!I$dڍh25*?`kö‡:1+Ё6+oC4ɷfj-&9_6He?+]cm2n;l2鍈37hcM+YbZf6]AS^ȮOȼUP}tj%j˶r9 ͘7ebw:_i|i32#:!@:jd 2%3 !QI<0SKdHAC&Zn]DcAuy<9s)L5pPm]5Qoغy'2nSݦr2tey\n3<[{hQl?~E/bm^,0ҿ#߻ҭ'|B'|N[{\ Z<η# EH.F9NaĂh`; S y,ᇂER E<>2 ]^ynS>0i߁ xRzvڛ>@+@:3 `$"t`=W$rIZ63p_moKEn{0y?=S3q(}c@š"E`DXcC  2+ۑ>2Sϕ5H Clgb&8aogƬXD8 Kt((ǜa "(gqyY; )FمSMe͑ڽ=iaT셚oG'sף3AVtT":>1`{ *m 2T!Pf c &XEBhЎgz݇ᷝ˲k Ƽ/'_*;DЎފ˝FiGr>͕e:O;z#v_&Hg]B?:/6@fHٮĸN>iJ;f~T(N2 Z LP8b04Q*JQu;WxY.3@0  (rʯXv׽!i&EoWuDs;<m*̓ sWn>LZ[=HK )%Q @8p.Ca> @” XXSq%TU |ӛ?-VT{-z輂΋m'ҽ.VQzU~4V}n#p\'*,Mn;$ɺ(m^rȼ HУ1 {ǭw:yiNCΡzZ u3 ®:K_=O:x׋UfjgUMxlNO6SFoj2}=ׅ-:6JߊTcuH w}3UiMx Ҏd,{s/zwYm] H T D\PE b#ŅQc xHx)+Àr?mXjL_jɈ V3KC]@ڲP;AJ(;@ H )@%+VZPTV)]}p{5ʅ1ͭ]vP֏5c]"7J2 xr偉)GjJgv)(ր 1`4Dhdz5gW&`8^GS˶g[s߈yOVx[ŭۼeoVyMJҦspo4u,"\Ed;v1 6" el;ޞleCI,Y+wWWK[;&??,hݬiD0VB­'ڊ[‡&`wgQ(-Rk8R# ĕcPTM H5bTcys);֔ހ䫗$-W;CpC@0@δCe󂭙VTkn טjRp@),+f``o,ލ- zsύsk0x~MWmHaMH0ÒH G. B*$C{X;d@QS2.u (ɗ '$YT:$'<i7LYpaeqC=] ]B +ʾ %FdKC: (#uOcYH 9`|[~K.n"PpPA^U%5bBs'~wz,a G;5+@:}?l@t3[M,o\PLqE1D*B\F =UQt=_ܠ3fqy#tF9iVxIS=;.h>ktHG,7.NuFC@L\sRomo=hȟѽZ_=ם0ګ6Ι" uD!E' ~a]=n$G+b &(&?Bm"7Aуݼ~&/`3RZ@NLҭۭw πg HpF/JWpAΫB@PH}3t@λ>$!H '9\=ퟥ {ҞV[w:6}Hbԭn l@0]Gn>ZA-FGJ5 $>VİԄ>l>3-~ζxUWFot+nAq"Y藟[_jli\tѲ>_+I>p3NV*W^fo'_6LX ;n(Z:7x<58v~_>[͋==?GvmMf>?ن?G3e4Svf|V%.PDvQ"(Z^?PR2n%fHa#"lXO6ݧ3S;1)6P0]@E#` jy'8@\p@E("A4V #e'詑]q]]qթR}wslS$ΉfkZk)p,4j:t}=l?|Y(@/wKw+fOd>&lDdZzS]!}T7oAnN+t\j8tGXg=:MJoZE.skRBƴ?jOҞz{[tTO|5Q]w@bd7_RrXzA_ý㾎g!~v;]=?Fr1tUvv-kbͰ-[)vL%Ng ͫzI.h">#;23rmF [nǧ>e܉].0Tr |=),;^2DK CT(PI%Ժ@LsTDVve]07 /_+C)CeqeqQ\Cr*%P oK,)Ãӥ69FCd%- [ɱ. ʑg)ȱyH8Ödط|dg{wzϻ軃 = t#̹"=m(p)B,.P੻+v=@wŰִވ ҕaj-sUΛȮ$ D9+%!`B -xXոVٜ+.O|?zFՠF06<*ص;p^{= @O9BLqn*bJf%E\j- Bީ[wC[B6:wxډBUЯNt!F$!_ZݛY ]2,X`VT *FÏ֨J´_C E}w$^g$O3|QYwY(s5Oje`9Ⱥ|_ޠ-heZvܿƧ};tcK8j{1n5*vg]cqaxC_/zY]eoķ9NMob%N^qn ckUl{4ORrLAn 1y@R%>"mIw%ȪYDpDaּҸ(dɅ"Tڟ-G,͏Z} hUxl p/:n9B:j]D9@8"{WB Y2 THQ ]UbޮN`8Wk^p"V34qܩ`5QzNهri HޕFkM\y2 4/ Ԡ,+F4cJlx-!h*6Uk$SQ*37n2g{|*k0=Lfo2Yaݺ_֎JPC֞ 7Ghzd7ײ}4:ܮ!-E M6+ߩXN=mk}\.CMϳ]Q9b:$"-/eD(?)pWw2@){ +%L !PLKQ p*H5&/98و9ԯ .b{FQ=j )Izi7$"`V)(Z&PE6V'Q$j6y1 AàjAd92xojb:㵚^MN|kTݓ ce!}Q]? ameiN{wNpK\irv8'Vrg[h3}m[&b,%9 t P/$`$T Еa$`(014XVq͵˺5ҲBvÑ3ӝ%^t Fͅ&pDvl0a'41{TԸzpJ("&DEiUKfXi6ҳl1+i?EOZf޹)]^Ū,݈ik# ׷5< wlT0Kbon?bkvBm783S9{fs9b9Jc`sw>&}zêq}Y`|/KF^-31w )ߛt#'#eoY 1H"1;9Fw xQ(aUɐBB$H`LͻuÌNiy0٢fywJYfe3D!b!2˥\u cò Z(ΥŦi APJ_HJˎD86wKkA??o;?8ᨗv-0>R}M~Z_wVAY ZIH _ h\M&ݞҽ6[ݘyz죊qNu)umMu/kFNG[CV{g:W"aK+ ,Yc|^_{_D5t8x^'GhJͶeFx1/vݰBϹrŞ׌,NV-LaS<9v4C&7& FR`kfn,Je0A)TA+jvqhч6ܫ)lVf NmQFe5*ʮU+(9GVH3trƒ8"Y= >H\T Vq*.J';Hoy';tԛK35A>/7 3A$ kӸc"n%6GZGd/jR 6G&ij.ٿ%0IYkJ.Ő t:7F .P$/-v[SHB.5(1,g+T0=ˇgqr֮Vs_ c=ٯ<{^w)>jO/tum$i6Nz7M-ϨG/FQ+xԌru/]XmGWinۛ[}2(J-dGJMR;qb;HZ")hޙu lRH1BHvr*9m|OBq v 5HUV\?MW.}j~Rr#e*cPLgFsuA 3*CZX7>ȼ`ibܻηx뙦h_zwQ,wrf7K Xٵ[͚\.7x?"{]k! EKq:jUy( BgZ f/8%4jYt#_;5#cVb\3+n`~5oS5a>Iy?2S1L ki9ajW{rq<޵54k rͤISoF 9Yt? c4M}JMn#;eLy_ % [*d DbYF[ <0W@2 (ˁb#x! ]Ɯ:OB:Ҏ*)kgnORo1.l_xsRgT,Sdͬdr1ˋAZln"6OX#iWZ`ҘNpz堦kٗ>4v+aF;̏G$Rk *0[̕[}xtu7PEÖOs>> #9o\ HF3Nv8=WNα8br `Ɔ944k9<`h5sHKyssx rrBH%h8.kY<(yC 45R JL $rJNW <?6h5XohEi0_Ql ÷4։nwA>^r16 6,wJgaWnj#?o>8ݑuLe{Y\>kpݱg'sx TߍXk<+oDBȷ/8״ Ѯ9@R58^'8A~!D>'82Z“D ES1$mBeTh%03E6a( 57EN9GRnu5_0"E0\HPq}tIPP*4 #uLFB9#.r1\tSkgQؾΧݣ͈m݅Pym *eRr,\'J[ \A4Z-** _~{9w"dWeܳJmt7<ܛf&~4ll*dzH^s4v42̦m[ 3eɾM!F,׫>ǟ^Gfee\wv^V{,kY~:+q5"G~kF粋gm6  ~j6SsU{ٱ9}_qłV[B> |s]MVDpz64l9mJ˞Qu|gW8]exûƩ1=Q(R)=`Ń=0(:z9vA4s%^S3!s! FRf$pnBm >ʦ0lg;wh30 #L|rj,c<4z!<ܡw[!0y+] YU>dD Zj*\K2uSV.F qzVf@sPd17 ]t~0 ]6bs 5 mn$n~tWҶ(fV[mN|C o*Gf-^|FcxL\a41R!( xn9EԒ5:+S_"|#Hg$<Ǽ0 h ( R\LU7ې4w~4 {P'!G3$ ]r9^Br2 C9[jnMtn&sr9δV(FBiH1onEӒJ=;.$~g$^/Gd;pMGl 8꽓(gzv5j^!rR/m#I3*񺚍c^r'Aor mz^/ʯ.w0>ne6ɹd';=z{$~ nF)'j\#v3؆&*@‚4`Bym:zV Sc~3y\#;l^ ߐm?h*(^Ť΢^V$nyA3D@_'Tix\e5?iN\ Hz-4u!)YXb{r K0G(XwOe`\ ,\Lu!ܠT@4Ӛ\Y$0%LQDŽkl7I9ʥywGٳɪ^z9wc'U1W Osoo|kIVz/[Wk8^Wd/Mzh1|m|]qaլGt_KG9o:܁ϫJYH|>ksPf1ǯ>yQռ~h{rd[ǛMM&GW`rzoZ"IH(>kY( <' BМiy `ڮ\>iu9>5ۿ'4(<6nr"/%x%{gQo=<BjmC.aQP EX^ bQd9Ȱ#WjЅj6d4GSyڛ;=7Tsف)ƙYJ'禚涏$?pV3ɉp)ގF{h3la?xr+waTzH1&&w5ƭ⸢lrޚ^goBW47cp#{~Z%QAدh<]}:=Cƥt3UjWc[wv7'~c9>.i}jx )oĎSLEpmgZacndGn V,< jvo K[Ct4|^i93eX`-vu ݺ0q6Xw®Qv W+;kY= Qrf&Zڬ.yx4 i7-F5PtWgĖ ΈV۽۶\۶ǫSnm~8}kS,]#hZMǪ6!]Y꼚.Wmɸ^FHοUm8 =]=}F>t [+g p&)i?4:.4P,s )\,3Ph#`Z 3Yd" "|k_&wIvK6]͕f9bKO:ݶaD*#MKF. #JL'(9HEd"w9>f괴5ge !^ئ 7I.e!_xKĶӛ; d=;9+)!_h)L-eq w_]M YL)7'J?jk _m̔7:j]-4{tٺo8vՏc&ikb춾yz 0Gxeֵ١X%]@eCx$p'UCLn)vi2 I9Q^p$( jr6 QǷ}XOz?< `wnH?N.oǦ>֋;UGo%%1kkΦRecmm6Gt!lxVWM5V215)@$H(Н?_S 2sPۢ~ Ì^\+TTXka!1iFnnYb ~~SvTә6ՁMXbďX^R9dd-RNflnKa`K]>Ԇ %UkLh"2Crº=ν`vH'9)\=>#}t$EүxcNGڃgo?cR.d-壴]$2M!,0`d:e-Ne[ RHʁ*,gPq[Td,\RGj[R\[1 QW!M?X=Ođ'JB%ܪxR~z|'w&LSLkmjECqa)E8Q4mO^j:h0}s+?h$3g&~bmZ*ї~Mt? FzIb3BGxmLr 69Y%Uy^` hs)VLmh\NTO/nO9;YCg! |&N`Z{љ}xF,?M3QA5-cҭ3[יS_:j^[l4>l.w|4 Ww1n mif0Nd .v %MA z7Ov+86sLj#r6 ;^y]uw$ےjuΕjStW΍_\Ξ.]F7C'P;X1f#uYqR9 8IHJ{NpIsn^z$yB rLY! C-~HVXd92WL7*l|ͷ>~pEcIdS_xS'u@p92ywKtZS \XpF BRgL3i"/2kG|:}|l_n`|v{W1YU`tj}0𩞓^l!aF9Wqc5_6.3}U>R֕x yJTI2r<)˹K)dkd׍u, a!첒#VAb0tZ`uZ.z5?zZeR.ec-|w^xz4vnZiљvm\ϟlE>.}ZD%S$LOՍnYmvg㥪W_c]]ύgumƻuwubgKV9KHc 5m>>mbM..#"< +ͻ~R}@Nt0 -csqT[<.břSb 8&g1 Iz-- bq=ۛʟv"cZBJy4xzB%fxD>)s~syF&2C QPa4+ UVsCDa'M7SI8 КHF 0}\ H2 9m--U‘-#TR&mdaԪS^m9J~NJq&0l/Z{X4 3Ntjp hδ(SUmݷ}7#B~mL_>_FbU@m\1f,L(C1;^WxI"B%2D2 ) HXE,=pJSXt9kѧ:ޟ]CsA*esoB-ǼwOln=\{q+"_q$hMc~?=2KJ<ԀeX(&dw2.g=wcgLAFn{k4XOɩlj_VbO#Wf'?L[XD%IL"rECQDg$§0!0&iiBEDDJLDfHHdT$!.z_[ |%Q?e/%V;29N~3Lh ˜6mk#£~vxAY"tL*"=x*( g<45yb$ P !,B'i3YsJ2Vf1o,vMhs*2/+Moi[i+h@"k(GYTijg066P^T2%P2NBAPb(a%,vY]eI]?w{eim0ū>^|~57AnFW( NnZj"Lw>x]?յ߮W>?LOwi6;ܘM/okY^HEւ7 >˜ hp:K 黣g*Y!$BQd´Ĉ&$4Fh{iyqUWɀy2: Ა_kt)Ƴ7P Oы| :K AY1 6t`@^y1א&$"X\U7s^C[e!WA5Fg~zo̼Y2֐a:2jI5лvﻬd4ovcByeD*BAoߙ@iN22,`&4 N>$I2vYeoʙIkRx"вG%R 1!eY$!W4ʧ°>[٪Xs#=1ڪf;yàisB8eMۼ_71o&5xjXO*[,vv+m7]fA?H%w(2 Рc`vP[" Zeg̃kUA0NJgH $#INI4$qSRL.Ɉ1ڇ;Ɛ?y<3,̛QӧOr3^BJ_y7~m2gZ*l{rSY?Em @vY޹S ]y@gR gUv&A4 "Ğ\BT@&ar+G)2);ד'DȐ9 bbYSA j~(TCeK{ƬOԱQN)86`@ǁk61(有8I`,P HN,.?7 gQjV_we?ōP <^ @u `_0j6^np'>6t(;}~ظ飐{n̍D65TM*KQB8t?;;a;ނ6]fer_!ޱB6]k?1Ǒ=yqEt 5M+%$aowO=ICnaDKeP2A(hćbEYhhF y QwzFq<ިcÖ ;LYlH2D&)\@>> Zm+ha \p#ߕ-a/6 я_|mհ4 !I!/[R+2%$\G˳kIcuBVET@2RXc6AsRZ|'/߽/!99?$^,u1&! ;N9a4<"3 "PHB)UA;=>}\aE,%0>n??}All`X@8&P3LLo\De"a*2Dy ${7HkSGlm0%&<D=S1~{#h_;Mt;ϚU@f|yk5~qmEi|h2՟9-jYV?͐Vu52mrXMP+9A<M</5tLAZHwϼ^0wQuqb#PޡhhSz?_ACZ#vK.KfO>;zZ3_xPXWe9ؼk )UPezA4sDdCiD/9dʖRA_,V@f?V.Gxc4b:оHnZm52JNizBKlآIbT/@u 4KZ?վIR/Bz-XcR!u+!Ms̽ϊV C<Ӂ̷SsҺjfčZX j{(}BiӉ7n&gk mOvu8 TXtSg&ѩa\ó |\AP2L$P#)6E4 ꤁)\\vSEU 9'F| {M`3*aR~9x|'*BziS°~ ч{#Z_RH1u/j2(oAg  ͮ#aE I'V%/XP+l'-$I0@c"yiцE0QeFo)$ѓ yH LI$aDJ%1!,,:4sReNs0cc+FZGvGNU!.׏d [csDJ 4t`fE5ƾyYjf %W1ļDi*c 3"FQSKD`0~F@嶞Gho-f\3W]lK<(g_[JǼٝÈ Ԧ7`^C ̓FLKP8n% c"*5L48O,2PPr`43,8MXV\ +Ќҳv';SA<K;&q MJa2&L#J4FLX8$rd^~lOU>$3>Os'9j45( Avmnl^^E JGJPLꝉMNh"C$iBI Bx*(8=\wk2w3} "~{@DAaBԙ<-/ɕ]?c*;X"|ow0om7iY-xWcQDaVo|q[m;.vqFy:^Z*Ҳi:-΋_D̫#vĞd?ѭ,rBCBNo m%wn q-pGgqy6[Ε3x ^N'NpLa{ w\F 4]~ȁi9/oϛ*~)< o ,۟Y@#cY)cַ)yE3dq Q@ `< sA#Sz( %^W/VlE'BlV2߼i:/ am8 ®)ִN`IoFZTy E&^%?M,#$D37nVF㰍+zu'4"J ,VjZ>n o-+F']ط={.z|P ?S2ݤT𪄖G}?}n՗FުTP^o4A*w7Y4ZzxaH7EĢ7jWseaFd\rF7bnz{[% 1`cJ}s-T]3]x;a]>,s7>\zGIONEOWNԘE_䎣Eυ$tٳ;>[:qԶn,X/I@}tz%D_q|]\j5$(,5Iz_XtZ.ޚm>EsT&Vmfalwi6_s:,GiͨNm)5LlF1a2(FH׋7결NS #(LpF@h"3!Lc7dIAYP#" X"qF IR ƩHU!`z{>#1@qǰB#8~!1=ԳfS="ɪ` v 99ss܏1l/oA0 FRrGR=9Qm#xǃ~Ƌv1c `2+{$p 16A17 % 졀ӷGO@H'{dm#iWq *u;2F7.ZN2~xH.aC;$AC!Cv]r!TĠPLED[blM<4*J.M[RR&F!AJ cz=,!96Z)$L)B3+1aHDUe R3cFb&R5c /gC*58lenXf;BNy;Ά(v5 'm϶6n6ve\kd>cQ>ilE(WnsiGd(Ǹ^t_y)$TSw1g)$Py~Μ92A=|H9L>|g1nZ؛$NW>ʇoJGf0DF椲XrȰQArz^vd A L;"H zz2'7ǖӚ s1#c^c8/`ðˎ,=xtăEX"  QHcRP 9D3c%)bTzIņoVlrLܫ94,yFmћ;ӦNVYm?5q6>`X.O"mmȡ31 Xe&U{ҞrȴrJňp&%令]R;VimRV` բW2դNuG*mF Z`qj{(qD xCâ&K#Ǫ haVT+StR"*F`il5oK^w{-f1?LoU6l]PzAއ0YQtX^KyjF^>!tM 8bu13(XAa3"% Yͤ:)@(M6X!PjK륛NMR(tv*yb헚dCZWN5y_b; գz$f:qHmbv1ucE=]$ZJkX5$^FR?j"@Fl5_G:L^N3kv^F;tc0>9cQNQaNjISAJTnNBK%1)5IͲlH^lsHWA$ACzOM-*Hu)P"bd޻85]"qeh2^t]s3Y/tbKfaĞ$G[eiʥ/ky4yU/ I 0{El0);D4X Q.uw+pܡMW@Z"q"TЯ !ã0$A#pH#׉AvYJ,(#X[UcĞggkO@~"H:.hqϷ},^~:HIKe`gZW% TMmY `L־reh~vgegbHo d$O{~+|x>R fqX *kcIkݖ":EЫhr0L]{h̰ΙBf6M4PbStF @$$=sgNoOs?+>.ƝDeZ/H?A$#$)xM|NHN{BP@-q1ʁ&Bjku*8 )*Fx!tkTk{^-' @}-)/-C=O?;-)rkAsJ1 R&,s eO^#|Q@z"P?|Q,g0%jå#Jk1)(n5M>>y?mǻ&ݕZxUMx0by.!y IP@;)L-jVѹFt~974}<36񨸛G?DB 9?N'(<1rXr1Qp 5i)N ѩHrlK!(ىB>=$j{8af}$؞l8^䥆os&- ˕OPƋKEjr7."~G$Af]?nԇ%}<|6փHRMh J儅DP;X*!`K@' *U!,~eeU~Qi/-uyn@a`&!hĘC똶1iU$cϩqE X@3WI6W(TP j5t+Ӊ'F+uad+Z}~+Aj<ֳLe585Ʊ9K48R#C^D`I6t '/Jb Y\ DDלN, tY5=V+) t6Sq^E_69*Ҋ) t-G%{jAPg0;&߼qƛyp3~SY"[1Q9ǬOVۤ>Y.tX(lI V`=@#BpH9C\JaZHRB3z5נtJ^1uqc#곾zKC/ KFF 4 v]^_NT#/ 3k!P**X bcM,b/g;sAs: bz.W9AחXa0@l(\ 1m*1 8RȨA.Se,er Rd%+aId.Υb*7Cs/af5*ٱr{ =ۉine[.[L7O(N>y zLp4oNX}c^ʟm2YILɫyAE-/?E9Eyxh~ϤTZy۵Vhv`!!ۍgg#-XcI! nS,' +EaiYaެj$Li2զ df,VjiZJ-㔶kHF'eX|E+(ؾqgڟK"_{◯U{ `n&i>C'v5ytu,obvU<%~08<٨yj9f"SyV#3r,46t>՝{6gHNn3G&Ts;j& m*pxەȧֻUvs~~ |Z[CW˶=iu)XdCĨ"ڔ5R@A'A 'xH@E"4EfbdC4bqh5r,%#i3x_ئ]}1ўYSk~!X׳hv:ce1?tڭ{Uӣ_yy'4>l<ҿn54u&# ʐtA4>r=AQ ]h-t2E"p: סRBº]q4?pՙSQcMWHJw)X/zp԰W;ѱ"l샷bfKӭN4NT%dBMqZ2+YK!\`Ԧ9X~i 46qj>ɪ9d=֍vlؼl8C+798k Uk-/j˙ie>]~Ok {oG^CI"!ck% !>ACbD$0>{JL9B4sb\ PbB*ra#L{B!Dyy['SM,Q=L3\ñ^W]hd*F*b O?nh]T+NOg _矿6;Z<=q}~nbb)hwl%kS݃EϻJX;+G䰋YJʲ!A وg^bZ0kᄆX DO fp7$QSXs*UМ'\JZfP&]}\},ݾ]W+=\!$E!Mwɢ6jnKmj1>tZ9:s\`MB4m t,bپg1BlG>S YmCx΂Wm^QïzMKsը ]=Lg*u?3۔LEG뜻4G|NNU.42BDCv]G5tQs:0h;|.B|Xl9+o6qѐz6yv 9{DV8.xRLm2VGpAu~o73UMwk}rH'V3x;bQ `k Fg, vŻ,YR Gxq-d.p"@|gi9 l l&u20=BLvB W~:L[A(B;8B6# < ǻ+Ù&$'0"w%AZ8ZWiᤙ[.rN\~U[BAWK?s:(RnVR 4|gA .d'ЏTsܤonڡFtr1 ~CO<١.E2E䢴Nv(rQ횴dX\KqR ,#z&"7rl;(p|ʽI+rrO,P51λt=wY$k9ͮJ7QA92sԇTUhҸ.f_ 7Je1'B,-e2\sE&¸>Ẽ(a2!6"OmeWxyXvJtgik[Q#8Ddլ˾Vt8j6q2(r/:YrJLNn$ c wp 6~Z$oLjgKz{r.zVC+=d`CH:5Ib)w݀A)c&Uqbj6xYϳ2nԦ=7[9IABY"픪o?²-K>tpA] Ʒ,ّT\p-iǿ#P1DW5wڛڷm;ׯw':-K'|@|,Wá)$;{Nc!#ͪdwf'f/o~4#~1f5r-"ޚzgb73lGÉֹ89%e<+1@%^q#r$`_c%jx⚍-d|+8E32A 4sXKk<n4lH*bn]ӄ/Edȫz{I3I HWXJq,&4Dd|ڱ8!U0EŊm4Cw,Ng]Θ*IRZ`C7 ,1cyY {IlhMژ.|n0qۅ.MHI0#u仗"w6XF,`Ϳ𩶻^Ag}-CKqv>q*eaFE3AYs4|c+igi3fK 1zC`ۇyqSgJ=pGwxCE8ɉ,sFBD vۢZy7;.>^> jS DS? 7ܙT_VT=>>xp' }=<)z-]EЮD->޿Ͽf|~"Mƌ;'5za~J"`ヺΟBy!*}}BYg8ypmVc~`VJwQwY8jȋ d{Zxl":+{&n_ (mr((pX@zm@-[麗2_/ddrTrK ^(mfPs,J2AsLfיͶ{j^zR5Xbbu [I$CFZ@]~Hpeߊ@Sgaւ( (r]osPw[-*FoMWUZ7mF,\Wն-[,oo~]8Ȋ i>cOK(t4M%91:hÅm6IWI|'8`,g>:I39;q .}l>[3@  D}Q@{\wNɝǕd<%#wy*/x3Z! VC @+7a. ,G|6c4$0*t%ߚ(/Z'隣aj7KrG'Pb܄JoISOdrޓW5-6S`4v 9j1( =E%ocd,c?'FULũ8Q&ܞQQK5zW>mR^ ^>3[wA46/!tw:밗ΆyP%f|) b[chVD1"@R3}#KxA{C9.:r%%i )74@jBQQ01VR2ûxk:稔Cܣ`I4g:ū`]BiʰFx{n#Ab7\Ϗ0m X"N 2*&e#n{/7qCtg&X:IGĿkA!  |gה\@\ī^L- K-( A]|?u qR=TUcW> % 4F%^dOM-qƩ .6:.xEG*QE%Q7ͅi2w;( *'=Kͮ5: 8^rzxQ3 6 m FgB"3{!^yy6L)L+u-Z7';TIp)`3# d7!K&7 7p|'qG=hK$@=Lm`gkw<%_Rm2ӕf *+(2"AƱlee6z?O-;=?IGpo* &hzB5_օl{a5tOt{nx0bBۑ{We_ͽeIҖ%T$n1ZBI bAl|Dg\~I ^TKd P}dTMk+gz'ǟ4QOZ_.%FVD^Vw`m#otkn|d7ZmYߠFR] $'zZx7^P*\|{]9wmWM!~ܥk}v}|Ր<:Cw2!KG.}Fm@lI-aCIXKfXia&3uG;}o"vή'( j-Цc23hZ8Jw݂:⩼FѱkiY]Nj+u'TVXwS8y٭GJd* y2o6)~ço̱mMIlYJ7:agٶ !M$$KGhʹr1H+ 'ɑ͋;]"-*qQ+mv#2K4q0mIpmu=Mkw5[ H6:gvA#{@Ok/nN5p3"txq{"1>qso XDj@bxĴ`NEbbŦ7/=~wu;Ѕ]l5֦}uǭ؈Rۀk.ҏ_7zj&l y9.J}F̎qeEU[ڻJS; r5\RU֠:dןy϶si~Mԣd9 H9:Iyf[k&@(qc1 khcL/z-I1ERG{>U յ'T޽vy<4-'^ʦ. 6).\=utaC^ |O S5VN =熦A쭀7p׍('~ۚmŦ3ZE,Qj™ M`"Tmj/\ձT֤+yEu+͚PLoZ5@Sҧ//7 (; ag&ŀӎ2Z}e8$XsFL, ):r`ciL(ݟ^yyGΥьY- 3Y^jeRrjN<ֱ1Nqr@/I WFRH1dm"% >"~ו -sO\KGnMKRR ) d\$oc?^P9:e;K|AI 1N׈#T,CV"}4񒇏g 2{{& zM0m\5!,灭#u>g5:eƌC @r7wl; M$l0#ʬ1sBpb\΄]^Ii/[^ȏ5MF5Mv=Qs*[VwЊuV2::,PH; G7?z7xK-Qh Bb U̸ `ƱP'oTRWs7ɯgq;뤿%v^i˰v;xİu:lJc꞉:}ُ,#05DSlmaZ4X`gٲ@yyx׽9Q]/.ίF$>5ԍ^҉2Rs NalVpI JA"5U'9S`nVǸ'$ % ` z1}C13;y[>1~nkyIv9O$ܥS2[7^`73u8NpmDZ4Gy%sW rN |#@e߁?N>Mwomϖ+\V(: KUS쿻i+T5_T ;: ~禨3ځ-r<YY!ș!L 1)! VB2@}0br"_[$+/@ګHB]];E \YγEp_;Tޤȷ&@5!=6:G' _G. pq2 L1=pXŗ1Ɍqt4%:Nƚ",rޯ+ER߂jXP:cɻiz4 =3Oj=3窑>'.J׷t?M3358@4s@9@Ԯe!D șIӞn. 6Uer#륻a4!0'Ti! !gӰXN (&A$wm"> 6| cIPjC$cacDb[ԟ0&쯵X?b.~}MOTrdž®r)6Uηe! pr,X^#6Tx۽y"jjb{,\ۍ<ֲm_~@}J) 1_m@RPb]>M̔%ZuQ…WTZ_Xge˽.Og86 ~k|d1FOgyYc4 IK *ї;MXyWySB9mFcەj}QuaM183bYC!HFo M$޵Ezh /6TM'@DR=Є-  8; /: mBb4aėND,Z(D0$Иxz1=gO41.O>l+j 5vEډU`۵6ȔS =!nuJ9IOU{<Q>p:$ز LNi$B9YR~~QJ_ YSh t'kǚҢ YY::~n M`4RNʻT4M@҉s8"qL=3&͝R.2^bx,$HacH&%BC'SޏڙG\y@I٦.L2kͼkN-ѡRD"idz]*Q'B- Y " 8˖ 4PkEVWyY5u"]Fe/*ϢUu6fr_Tb%l|{ڭ\g:m65~6Ti|Qlu {Xx;`2d^zѳ]'R :AϳM3Q2H|x*OO޳LN` Mdz&| _.I[E^kV`OI3,tEJ'z0;>7PvXPxD{+ׁa}OR>\k;@tPwZM'Ԡ{i^!zxA0T2^Z)#Itb鯿h}U:[J\냎;V&.uLջ׎[xBxACBN"l_c*մ#y|%@lbNbY#1Rpct2M݅{c5ǹjfwSuZk2N]CKvuET_?t 3|SrG^~nK;cg%DjI8jh8+r{y/=sc3w>#\>K:.y~I_RX5Ng3  e pS.C3'aR,`EYNO2͊]5z){_]2 >cPLaA'y^%]);=!|g!c\N:vnK$K(kMJ!Lb`NA$ ;z"^8t0ru\ƞSKx;䀒2NZD R+{C'%Պ n 'J!Nd},򔊭¬#M)G@wqZ2qҞDHkzYjWcd0&]oo2G9.:}IrED:qY\.*.kTֻ!VNϾj W2-?,U1P6V#Զ  UZ* @UErgw3lzurYM{Waç贬\:/]S7wE5wcg1 a.[Q76[Qw]`}I.6"ud`ߏ^l[e]A)7Zvi7U\us@BrNKQG0שhSEJ7(Nc78Xnj_ zP$ [: 0T1}!4FP[u]u5n{[,7fQOkrdfAHՙ?m_|qD*#Ph7j4덺KؗJ[8@V#y<:ߦ۾nv'ɛFO^ClsT%: :ΔͲ0qPV'pkĘ8T|OI|߲Raj݃l֞-.RN/zLC'6lmAi͌TJqSqqN'J¦Q5=<:;~CE͋PA F!ԳbK@}^WPPȓs1M +\Ji|oPgͩ{_Km;59T'?m/C긻m~{~b+($%I'ۦ1$? f0@Z'P+l^ؒP*K[=/g~g}|5u76&d$րǝ3c0b!BZqEuXjc'4s2CRTitIz "uM5OE8&x3msz i5,H2HFcrlONpb; 1!n, %PCAɥy87M=1zzv uv*fq1hm]Lx6l1iZ(#Q~@ 1r?^rG_/6~`; nB4V=ݫv&U!/'pS;3CY.aHV扤wE^=cIXB ^}SQb" -a3[DSW[j-:W_/ފm12rWM$!-2u:w yd fQ8U'V\UgV Z{`>w.NOvP^ p/=!P>\9 ;Z{yۻ8o9Śyd$+J_J;Hftss UNzP\Dm+Vf]r oUv5]2U9`hgWrZh[_ c?(7eGxE"Wpٺ [(ewReF&N*cui0GiՑ!/1,yryQtk܈7Bei hnHB֐_%maYQ*(D)^*kظ6E"UyOz*v0͗}oݒD B@cZ-=r zB8dK RF` )N{ Q+֟KYɨ }%ۚpxil92@bp&&@nrEHGIX~LE@㘑KSIZ0C(*NABxӶe72}$֖2X6؋ɥ* .83fŬZqnn.iwsuVqݚ,흯W;gc )5!kϽn_łLa,9f+,7!C1b NVC XiLL+IsT1 L"Ȏm1W{/=fo V^z|;g%/)JS%~7i_.3 m-f][g Dvfqf{?ܑ,H)ge`:vm'Uꍵl:V\lKk~Т ڿu'tEګs̱*IL-Eyg'Xc٨jB{bbJ| pN%vWN#^ %&2J%YD*2p` qM&A5PMRoBؑs]z.""¤xZ 2tݳv᝕u{@gᲴ*u r$ G%-nMۄ }dڿ_⳪9aׅuXFYlj|ex@xnKz_9O(dqm\+2֕n=UƼ%oNZ+ ##:"K;Bҷi9ќ#df +JG^*gIa/C@.'AjXyф UMlvNT*J2"оLq} 0n%{k~y@oni0\v0U9bsw;:b=2} YVeW*ܠfҀd6dx;Z!ܟ:0׸GDUSUvQ`J8ÍP-͡5qgӂ@ԏ`39'bƦ;Kv=TmݏYw3,՟Ư^l Q܃Vpev4% aJ'N\7DI=OLjul&ShON=}LnZlq )=X @2lZ9<gJGSAJ)(IfAh>:-֣_9iӎCTP@#Z()S(D R1 ېY>.R *$7| {ZQw/D^CwI 8&K]QY{!"&10+qK,1ƯȤ0lI aШ ߍw7\HU☤MMNTȔJaČ^jXӐWg 0:l`{X=~w_f5*6tʯl$,CRO 5GMüiGvJ#NJ)H[\qn$3lZk" 9QIjrVVpu*ʨ_~a @H~Xֽ\*'lf b1hnKVR_5&Ά_6Ui^m@̛UMW6̯T1f bPS+vr= zY3\p{/6WNޞnڌy_mH%H(?~z]ފľ1)0@ DKH@(!BLw^m?"{H6T>6%Bqa ǾʹTU J}$sKRB5x _ӽ=UĻ_C 1DxYFbvX XH-B > 4 pHxaՙ KSN}ʸ0gy oUEkvzסɣaȫy/Df9\/)Rfr k֚9"bD¾Qh=5:%[<J 3JaEDGvWTm;V Z:1#e<ǐ")V:Cގ|df?xO`'{0Wfo{m`/DM2I!Ê,b`04>c R\"ȕ`iNIomUdixWMEf݀i`u C&TU,;Bl-ҏV;ut8ZEbr2vla| zs(])C=_72i&d7C)|yi~RS)Ÿ;fyV/m^Nmszy_ZFɺdanЉccX[/M8tjG#A``' J̶ U@s$v>B0Dn RjH w XbSJjji|$j{%S-ZPd'=i6+1,5yYWM#dHjF~AԐscn\$'v'nbgS,U/JUʟ)+`eK@nO,gnnPPe[XDt\.L袝wcquèCH"ChɀkâN B2q5:l`E$D[vJ+53鿞}u`M*`rm@/=3êUc r+xEʂf{~/.J\^wagkS^u JADC&aM SX:Z'SIX9oQO["en"Ƕ02[2hxe ^p h>?6v7,Sp't|rL|U¬lZ=6ZWPMkUٸ%w ^ȵ =oN|A IrmnzC]`Y,nBt:6O%xNnLVe-+JJ ^p(׆q$n\6>ֺ#&v b5 1B"i9L7q[MO+Lk7̑Njr Ya xg2Lr^ɱ*JGPP3EMCgOO}\oPJ%'tGBh$ղ7IАSv |kN`AZ9-i@AwZ>'ix LrJT#ujໃJD_YM o@Sh Ok f#-ʖÇF&r0B'^壜*!ʘ|e]؛FVPp Q1+Z1PF̮k]y^=MVo:ځ. T;qbVWE*ZSygf) ϔjʏc)IG"Gj`0[^5RpA|t?dbbT^,8ʏ$lpit51X"%U&j4d\.+dUoVIuŹBHr nS- .n]ו^= m}&edSǴTUnizez*`r!&Uڟ nDaSVUڟWA5 ꂕh_?%l;m`MnaXᢔ0+Vݫͯ.@S&?e5_ 1STx;qH@B܆Gqе@2PGo-n#+-S|8Y`x$ .̯5_>gVdUm=֚D} õqy {;OC`O/2j~\,XvCʐ SWAo#]ڨNrwEە-z(14قsz~fnf6h11nx)cxT 6ɂ6,)l4rE6/!SF^8n2¸чv9M~ Bo V|2HFpfәF2bBpDoeU +ێ!9~칥lkw)wYx f6;ȬC&MM@YMϳ4Khj$L&&e ͹c" sB,>Ɵ)v2To)0 Fة.X`u}0)o쟂| W1;Sl<ᚤVMH՟@p@X6>,go߅e9`|: _K|fKLrwS;zs,qN糟,ԱiX 0 M@.nTM}1}\f;A (s<Q;n?C#R|qxZCbZ}AFQ׶0%+]%v:&q/UEQ`sd&|8%߮S_V@hLWR (-W-;ShögYНYx.| tml\1%e" tBt}Ya:lHuRLS}4%uH_@=z!]$w$/w꯿>I`hOf^Cjkk,{sxcxjJc3}S3f:E6u-恴|?)smaGS®r 0:B_7ļwZh2l~\kp6!W{ٻ8j10XMHIOБLM IBKWo !,=I7vv/_Y& pˆN؏ ]3% NSI̮Q;+ (10KԈP=#b#ƔQ”S ~ԓ8 el/k=Fc /V8F:! ¨AUK[R<[ʺw|{N=}8h5X!܁Ut9Yk۩rwo 3Xnk^aaFkpk+#״|`ML\m}Әq=8%%x=Xo` hP@u].6^Ơxc K+eG8*lڧ Cd=m)Tyΐ1݌O:v A,bQDtrq1+q#("n×p(Q OA-ɯ}b~x)O0@rba|9)k:]LFt8#Lt z ; D]uJ*A5kU'q,UBe&UW2l5Bf\}wRCru^}BwhM&4%1fqGc[DS֚x&p0`n-I*\k΅nLc:m{x4":Xd4r v4>W斑ؗmf)%̋_н'%Z[fqE7 nT^~]WJjwMfoJBGel2 oD&nZ;?n4ƞyyK}&'u`m=@ϐ.bHG>8xSҽW@eQ:#O5#8+`AiVۼ89|ocYY vMLQp*]\*#?.Na^H/i{WL,0:t,sT'@E \@k jOv956ʁa5QlKh{Otԁ֮3YB# Qj dZ$ozD+I-@}#`:<{0l%?}?-k:l@fUoXޒ=6􍫫`N ESõ=L8BǠr?Z" 9?DC"S.sM,gǮމz=jꓹ-H6dvN y隖e]5}˸}w$yZ"*Ɣ18%\1% 7&k|aZ)OY9~:keZ㈰ВCbvUnMIs`R‹釷pJD!w-0~ʔp^ء½WqJS>T>:@]YF~_] T^X`MSEK":7I&jvU $3㋈X4%ovf tp2Uu4\;j65E,G2xjWk6ݍԼKHl{5Kl]k@hT*7eB8FdX\cf$׸/ϭX^c='Q|,Xeyy[#JUdۇՏg*4tH+®X/҃XܴTrvsk^aڷM˗ȋp7؄se}kZzIH(9D  gs 4E.^[k6cB5ʆ_vR@?'K+;RJ0ITsl޲^}#y*UX2FuH̨k׶yBmT he0͗˄yty|\G2WYΊ걪t2DU)'t,:!ߧIb{Ŝ ,u~gkX֫Mde~vAH̿/!Q MTгPl4z~Tg3M\W23 =Sysܺl9˱heݢ3>gl!jӲ1Uo[FOrCk9kT䵶,ݲ?ݖcƹ=9y|]R~l|X\ҨmOesOj{C_s8[/]4o|VuIDf] 흊$Ř19 $V/&1%S\lLcJ1n w{1ދ~v!A{-sgtN/{xNP6}#] /m C~RąjTEx,ղvnz܋IUc9}ien/1ŴS]B |Mk|;,`#5RcNL9, a@r=#tJGѶѧwK08!s\dfj4[%UlgM5TDff =vYEmXu-@KT8:jp?TJ; ܶEa:h0\CF @ S/QN&; 1JQ78Ⱥ/c2Xƫ,r2E$$3htD*C6- })Yn-/[2 V+ӶƏr!/&UJ+yu%"KR',}'ig+LD^Rky|?l7y,ߟ.'~yO~߶A$?_O\}:qM:hs0h!HTp/iLW>URCAE1e]ܞ/v ExjWa|ѥ3٘{s$c"|>r:M+:c#ܟ6-T+r$?GIK{GD B-0 :T(*d,Y.6y{+X]^%{Jp00wY"-^j6O]|S;w1PtrݶcHٙܒ(3{I t' ְBp?TA1X:2~]Ti6y/DnWOT;qV/X,u[~2&/&Y|'x"#4sQ rYptTmEb'.U1B_5}WMT.ߦ)| :s)dL-&/_6R@OQMdԥ[Q0^YO]Y?2XqͭmP]ϾtKb u<s=]䝌s-WYl#S|%n4)媘M2EB3uU(‹-z\tw Q~!kަN#)vsj1;Bn8b) ؎-HioEVI.Xjuio̺ОܛkD[-TLV`|c&F) a5esO"E[Y:>-_Ր%-꿫u_zaՍU8. wL*1^f>_<3{:ףK!È2uCd#XB5:$[=GŧdLfrzZՍºteRLYeaS?9 # #f(,Bb%J8pKnj73WӽxaőD%tY]S0mv^ϖz=W1kpdYTO'<'M-07"5Y^&?Z(P;ت1}Zgfb . u|V汕wNhѡV {Z 3˙\GuOȘ0_*fԡJm{Bcb !S[`u^OUqX[m/Utz+ |"GTs͌!B$hPCAN8BL1&WyZPD`kei PL"4aC1GީF4R4+Z]7p 8tAݳLHcP~P,!҅xΨx~]ǣtDLr1`2A"K ycbZaMtNA-7s"=DzWIHd~AB@b|GM֛Er /R#1JJzWH-%U. >ŎYVVk*@SX)cts Vs oҥc1ꎙrLjHq¶@r;teIJ!Jr!{Wx[/k?~nl;[s7Utɖaw{/uQB~n ЫkJ0ݠ6 ՈknBs<2QD|=hF6z4$FC-ia`]qS6 Wϟ;9 gSP+=CHf9#[lBz ;stE| vMuӮ!(Wl`7yS56#TMTP7߾xfM7WAZ_nۅuUD#kI7~qtFe3YҫԭK6Ya‡?NIH%CA5I_-?%`W^u)Hqo#R, }[ۼ*ϻλbw5u89=wbN5Gokq&qKbPy^u7 fyu+br:YrkJM|ΐ-b<3lmwb`9 iQP?qCv8]:tVYוWa 'bB@ֽ PvN7vBS]е$":RhQc]Uxzl :]mpV]Fٻ8ŒB)B.sp-G! ",[KBi㔐{z_d/hX]k#>cSmЧ-:j1;MɆZNQoA@M ?c:ܸ&#삐b6+.dxyhDA(F= -zcp/ʸnMʬl4dA*zUn.)~=" 7kj*G0h׺)KzFj/ z|0z2*%L޾M93T,tஎ4"m?Zmq:9 F~<0S<Y=e`C{iO|Yp_)0s6SP!i W؏eIJok({֤O ̍0r'&%$!i @$KI0zg%jr~T8 v1HPߝY7q|s w?Tti}joF4QK ,K@$[ qXvY=z@<@^Z@4cx[ ۽o`Q4?Px}( a)_.!  ^&:ox4D7ım$ʼn(Ah̽$V愑v&=a{PAq{xXĞ0γ]ciKcT uip oQ~V O%Rv#L `AK2}]cAV$%#C @[ I*- TکS^ѷiك 7,ug?(vyJ#}~,m#v#y7-YFk`WG%| 3 ʭy!PLqJ!+knzrr!LnU2F$In.hZT%A) 060aΓ"['GF$ڞAq!ai>f*0OT](ǍH) Id0@Ths7JS+YYSlJ֞(Lv23Īe B1:s6z33Z@DY)C,bU2 q`>;X2wvkfz6}>:IRDZ1 sDX݂Q:qE+ڄhaH5"ZFop 鱨Ǣ..Ur*yѩB.Q,9$"4V?c+69ǨP$H=,8P 걩ǦރM~汩}l8x-ů,ZM+!@hX(zرJGɉ~Q@Xk` )c9%FYY4*Ot,l&^kw[6z%U 7a,2u:+lj{{%w.ԥ7}n )}u1ܫfQe9kf7ERo x\sy&&MDZ7*{gRrY5cX:N伸Xm_kcS]sb+>Sp "gD2!@`\nHD(#0(1&`iXhv_0~/xM6lU2~BX `ЪqkHXgc{,x c `ݣQZ< W:IK>J.4e>tؿvyӶB~s9/(to0g<:~[mY! +/NWϨ'BHB6`ImRV{P *h-FhlțD`Խ=x"{Ã>e]EM]73ID8GkKJIڊ#G AM0C8Ò!ΐV$-@M:4*;wNF!k╾qk|}vn}2jz#H,w̮va~ RILI XʘcrnAw} bY]}\Atzn QurI^y|\[SGõǻ]^d|jݤ~9ެQWVy`0`0)I#gZ,XN DJ Z2+9q\ՆXNtF'"'}$fyһxRwuob>Vbs&:Za,H#IlС @9"#ilu4hrO9҈#MrN[8>fЋSF2~*z^o k:uaZ^[m8<-wSW&fAe{}o$G;;eM F\'+ٳUbRgc=٩A$BwhB a;,Ƕ)$hݻ=DHIr9:Qݺ([ K\⩢3C 'F  h|~)ST@m6rI(@S{em͢y]1u&U#kH[thpm ԫHիܖ'( [aSW.we%4Fb:Pø584FBK>}Ɲ+?k.}]PDxG۵޻#&Bj+T:2Ӣqì{jKL]a\L]Xw %si c]=/Ϭ{NM<]ɼ*~Iq,3Tf/otn 6+ 7T, cOjeS4'E.VsSQHۯy6VtZ7"4m{oEy 6빥6N6dyY8:7nT"NGj;Mfsn,opY E8XMߚe/wUZyEE4Vcí'*} 8EG8Re|4M_!Ӌ+p;iToӹ<Gwq{D[զ]ؕh<0h{T/ԖEZR5z;qE/\y7,ݲhk8auvTrۗK}e2.P533<5ǎƴ7pF@6*ݯmokgos_4Φw?hj=@r[`4!DUk-ֈ`΢V>BvBYBi Pn5BP?pȁ}r?iYgቇn4} {9GOIYN.U''k֬nP%أ՗$|#ز4j~Q^;OyTBpOf;F _kfo_L*h]7:Dw7 Mdթ<>)ct yoF R?]nbK߫!VmMIK\Bxcŧ97a90H DvT'J%ՊAm$e@". H O&/lll9=}%P[%SK%ONs&۷%"ɱd&Bɂ[F hJc5SHP=A-dגzNVINЀ0')nƖ ' Z9 l'Ͷ+45`w.y)[P˟crfb>XJtDBRo0! !-4$B+eXC&PQ"qo=DžYCbo vOFO h5w'0"v*cQs3sB8\r$RKvI$W-VҦY}WomZn>G*&Az>#)DQѹJ'| +wKK\ay_)m6 cSu=//"(m6n5W0NC)3xMZMMT7؁`4ZD00.rУM|{S=X &cfۛK`qVڜڬN8fhݣlʼnQŬ6\)bh@n >Pø)xX%@ G+_L:|,m_r5?ɺ}lyܭ!FF1bN_|D1Uٙ@JZ2G5 $9֛@=>i_=ŖjYMMcnu'1vha ( L…dRy&Y u\r"P±~+DS=L].LGE~oZzngцu_rdgiRT2@$K=k @IH q?,lnĤk?ߧñ~?}Uj!ߣej`{S^a@.r wUcGAj*mC kTmjI(jޜM,%KJ1a'߮7[/`?ogfRg.m2n: Fq cn$8 d0UI=ʔ6|'q>H`AI &e'FYy&`V yaB$"/+AcXx,ۘTRyt'AG%OP%n?.+Qx\yU}n{[vG0unnV A@Fd,rV'vab#1R$:q:=g(>GP 9 9N͓AgU,WXQӐ?6v| s"P9›Xc (&֌+Jc-5JӉ{z{2n"bB]׺8T }NaT8Jf;;#k ~x(xx9-@I,>*gZ؉\ I K8A$RoR-SB7?( c ;7)Լ QO7ٿ5gZ~ɳodJ0MÉj:r`ԙ̜VExF$B#!SNP#W-@z8/kqAf~څǏzzv\c okޕ}W2+Jyeqr ;՛:h{_(޵59n~O~Irvr6ʵj([cYHr_I%/jDQ$c^ՈiX^˷Mo`y{=tM"oX3qms/[8,# N5#a9X!" ~oS\ܦ|6ïc(#i=詣fWQgT4K5#KQKhxSM{NêmqSӬ(J+q[HVM- $&[_;E=?}c :B MM{`zn"-}☮f_|QnW>Y\AGqˊ|ak&  fnٳyLD̩ ^f4.~*梹SL䢬)5?u:,a|0.341j*ǎ)-RMA,{ʹ0<бde1N7{WkӰIsM͜nhv1taK,; <зC4X> fBOIrV)A0N=7/r-*O?@g/ů1~!gdX Y-`9"'i!so`:˜%ٜ|Uİ"/f+,4\{~:}$NY=f&Nʸp}4R{ ֓&]Ql2}PY`D$Yl/ NR**E;v7);KA_'(copUGH#_]`̨#^S3SێRJݥfc)M)uRSUl*5[I"B$n#k49zlJ7CMR|qVA5@ Cw ݙ8-z뾩r<ǹc8t4q.(尐i ;FWIߗq[ }ykg$ }b>s}}S,zd(upk,DtbJw3;|4" a3qqk4G C˄:[^8 r4BcZp|3baHS2!4^QM?|E;I_XW?"~%5PځܯXgv~$.u֡[ni{, |M &l]h!7Y,i3k}`lŔ/t~~Tz~H8B}灒'.ؚ H"]<с /%ϦI0۾$q$4h湠n-xID{u<}:˔q}N"L٪~Xl?TfAw$bdrT C<ʏ[1_dEPuTjSd8lHĸL;2@T lut`^ftwkHQ(8m{"50vLw&L#f:nL_a+6eaENG^`l`_7 4n14,SwLٟ#99S_ %bK+xm3F*[L9J!7u>6>x'+d!wgq(TXJإa M,wDn>xJ$âJDk}C:(  E{KϘG~-5kWA׳|I*)8vDB> rQ)DZ=K_3F͎2K@Gc /زb\ T8A2٤lfi\Q_Xd!+#Ǹ,N|}*~`,b%Z˭'ܬHl;.)D1h풏>[:: ]^&RI}w^VlߵHHzb!{P6}bkk~`RXW9*O xk,;ˀ; h6GE>&Yk3/ܮ@EiejLs}.qѧ>KcpHKYr1$!_A{5V;$8e(n `aޅqKqṶg vF! .*RmrHD4LÌ,)X`讯;._2aiY9CTs*c`dȡ϶t]=[|f% KqRhxJڀ3!q bPm3/K*>78bE\߶4&025<0l_ߊЋ/Tv)nvyPt׳^Ӂ@ҶHu>B@PL 5[qo8#$rmbƯ?&1xq[5z\gիu^i]Z QH"kp?lrHZwl/xD4cq)xǬ01d1 %gשVYS­@24m98<u]ig0sQߢSV< 6T)kV(I¼U|;u͌KE&9E/ѯigƠF[M RpnyLjY'Q5ӻ<^aϊzhC1́R:MX`(N*"Y-dRϐv>fH0Dx} R%i@cٔocLq]*:du4jչ bC5۶@Kz YxkUA8W<,,QFƄw;GwR<:r!V䫎vTL;:rjT`O% ŀPɊ%i*}{˃6GhR(I^qbcZupZJwX&Sa,A}B x'",|q*%ɩ* Ƭc ӥa<Ɨ<`$|4)|E͒,Xy)&w,!L&(Q$:P* 8:Wf=xPUH~8]oY<&R:C!e"h NN0!o1+,28{2Q>^3$[`3nOQ TH=y8 PaY_\œKto5g'4 Wa%\`<0.KGmWT5*װCŐ{z}:@&rPb.eJ_t^/N"/Ss480#vUrػ&m޿wc#tލ'<㱣;ާ Jԙ)SʮKERu"HM @|*|c)0nfk:7 P}"/ ,: 0G51btfqTt=3RNltS8a7+%uOCo]`AI3EBDPaDrΦ@:Hr[ZUi 90W@4 uU}Ap!Ըnj->E04A5ٶRA-3͓93LeH* Aq<acWmVU 5~?aOsWQ1=.ߘQBޞ/n6F+Մb0]0{\_yT\[ۋ0<>N`όYuLLw0!Z=Ipzھط*&#|}mؙq|>%*x ( W+x4w_ ʴio6T4VwͣφZl"خ1Zld2* cN{YL}¹}H,ʘF#SY*F"(p6TFhoxBXu^C1LUzI4$պxU4Rm^P"ajBٔBk.y Sz'xM8.;1ޭrEpVooVh_9Za)M J^S`XV|V˶Vgƨ pր<8_KҎءE^{ ~"K9y]84zMV[3e- {/!6 lYP;ɐ1nde 3֞?,K*qiۡ]EVN)ca30|?iQ/(0)("hSU͝GR4[mMlzڲi%/`-eTZs(&lZѕwx(ǿYM<80K $i~j 'IH'tH>N/{L )i`}4aWMwubz4l=7G!6_/b#vn cBq}.bT 4v1SƎ  KS)bI4"70vN{e:4S)p/o̒ & 3c?~b|_AEWvŞ{m;ڙ̊FvfUnBвC7ȲT;(9qF`?W=>S`cK=joi~i1K#fi~"ƺȿa}.kËŸօ[nVwI[lHl,-)ޯBH(W *.C9~&w dJ]>X_mDGG >y*R83MbmhA7`#R\[h yxzCHu=\%O9%0K ǧ;^+-'Ȫ(;NlURPgz6شUtmawȼߋ_ޢg6?dЊ7O ,wML2+8M0as}?NӘH/Cj~Rs-J2&M[NS;GC^Ť#|;7Ӗ#-/Ϝ =ذ5KHFB??=۷,詑YKypwc rg40/ s5; iЋ*umt~ ur\ :xc:C*u;4.z/+H<(wXDSV9 0rb7 /)R5ʄ^ة<;Ol7 I,5uH[4rm3VHJO}gXf-1G\~՟wzm21fkh/ v*Ҩ.ik(9ut12^ÜJ>S.Pµ]W)e舊z)\/-Bp][5c_#t(t_CY>V%6}+"5"!%m.کM!IJ 8j->mJ4Oz)^'Aܕ|J6Po!nbGl픭ڒslbǻNicʱ?}ҺR#RZ"IWO՞䝑CVTBܦSr`A n6K̶g2b綷,W=R84+v|׾C%E{NŪӣ~!J{aq Ρ]ULMmAA&] MzW`K2N\&B6@! y`{e7wZjDwNr`\:u;k+*t,ls(0) ^'P b/pEe3$N,؇Τ9|($B>cNAjӽK1m\v@`TDKyAV3RlI.V>=a c`LQ6ƭʦT+B8Rx0w)҃HHʂ EFXN n8Nd͎q-0 ds n\VWHtQvgt7~oaN ǍžaVP8jIPj&Ct6$DnwTaxE^ˀ2DD툲{dCɴkۻV HC> :T(} %<0q;97xraϗB2-L[m.c/1-x\m찡f|ic``qyx4eH\2mp. ?Klvf9K,)`;>SG32%։7S"ǰ5[~/;0@yl)҉+QXȐ%Yw&^^zN SZTLݾG\Ll\GlM|Տ|j Kins珝iHHHbQ{~gcN XgvXXXoȗBz#WM5]r$遙FcKĽ\VDynCSqqAd'ǟIOx9g}ciAH t1PIB'$t;;Bb5{0H/Mњ<75?Ŗĩz !x_Kɏ"C3ˌꞃY_Aa t"A1=dC,bv_V bBlK5v@u]o8_އTX,P;E/1XKʲT,!:,?~6}vAe01Dhij'<6D쯟DFaO{bWek!Vle|Ϸ HNVug7iVbO zu=&~&2YnU|rdvF@X-ni3һ#vl7[⸓eG&}{17I>l6/ۻSҥ{^HIrHԌ|ev @ݯx9|z׻^=R]i `R}}kKp=p (<͍a}&M4GyDB.«+u$i?0ExHlMDvf1)FQBuqF2|Ĥ='=?.B=!*f48@@D JSJ%rw= |au#$r2LʞQ%U|A6s8U<8An Am;c;b;>.68gX- G EƔZ.*V^TlȰӁQUȘhj' J4p81)?p`>]3'dHf I4Ť)WdBp {@灞o2pJITb/yS-5z~}Ulrezmß-m4ONFr #gμFDaeLNrS]dDD2sTBHQ0̊4K+ԛߞVe1;׭Zr^hIrO:+l"Rc*vۦ^x:7c +5sﵡ]}Ǐg+\AI@t1ۻ|¶KCn.p\tNAzrMM*#8u$EL&"C"2Kzg^#UNϷ !~p{$>y^:~'OozOŧ}O8#Kq7QTlG'4k$?wenv#D SRd"cRR/2_{Jq_8 S8,SefMf;?D[ӽ!}pjX|Dw7tl6lUc7غ wQ5ߚ])#[w&?s:3(9ׅ$ < ;?p-kW q (qBQ~j43JJxHIT6BhWS_ o5SH;%5`GaD|=g 1T>tD牻5c7NVqVj mfʍwg*~1q+@扩#ōE*1CMPf4dBr u4Q>{js m&kt~;j>̾:꽨p!YAFOgHa2dyeiBDT(S.P`븑a7mW:dF_ݏG\G8#uLo/Z@ְZI>^q֨yxvQ oC !ز-t?-}]!W)녱hrgaLLA)Y^"#𜱷zJ aC$e}p$ U>y}Ol\Z˓jlX[>c't[YPsU_-bW VQWuɍ kMXQc5Us4w0Hghz#[/] ku=Wjt*W ˳BU&1K}mQB&~UF %˷ذ7;nĈ|WV2M㖭暥 Dy@ieiٙ2$FVSDY~ h+jv _Iӵ(?~@ɜC}y{Sk3>p^5LC.e\HE|ZJmӞz!ZU Mvm)koWl1]{&Me /&~y_S(^l{rerb+$>rjfDޤJ8G9T?D"1(H&Śii;RǮYt11=q%ZF 4êR,T`u./}hE&&1?:4ܖN@忪+K@rZ߽\ݙ؛`-r{"1 ޠӼǹ=ٯ2-Cޠ5{ٝ fAıP)0/4e,I/s9(n>8࿟ؗCmT&"ห̵=_b|^ ^QtIf Sz4Lb]rN\%IJ gT% J).GG? 4 [M &$[,C)=|oҧՋ4*h?0^$6A촜UnQ. Ssc&XAPt/Z^h -ZŢ6gծdk嘖Љ/m):b[W$dZ2mwreog5u{S.myk9k _wT&Al5Zy^Kmtw}m{'noc{-ㅜ%ێk`tB4KgP'$#IF|ƻC'`3RD$BYIaR P/niͪ^QrL_vFݗw(|S ھKMKW'IV ă Gl-wUSO>bŸGWbڔ|/QJV=8#Dm҅~_ ƺ߸$Yzc5 M6j~jHbk=2策a,-azBz\GRncԻ2BU~=rCEZ F>y-cTzj~ۆ}Q#fu<7sM$Ϯ3 aּ<»r7Ei!d&ri*ICy"S>!颾7s'HUu bl6'h]  1JqJs|BA IY"F 2 %yhrPa$k쳗vy!3 oOtI} L|yC+/*jڞSsd oa Q)0 DCBMiD$yEZ0Xiƨ$(e<gJʂ7AŜjV^#7ns`ffٸ}?Q }bf}/ˋFb`+/SzZ33jjH+jN iFv8-ef2wPmU3q~1hqzy_%8~nj^cw(tOnx0ɼCA͚aJh@ޏPѾ#iQ54O#hi2?Ȕ0?{;0n65@.1EŎ|i ^ %ThO_~2XEc/Imi7?}oו = 0Jd|{Ρ(E[o̥zͧ'WYnqmv8 Z!L>yH햭b}O tlW3-yJ L1S*VQz[5]~>mͷgH״u,uPW9Kd}naE) n\ֳۦYj&*<=hWXv+}f@_ZylԐ0sjܷ [-e[(!exTd&0uXUS glmy[Q$3,tPaޘaΆar1FE<c_sۆ5~FE[6Vs@跽ƕiZre^ӻboz}8։v_ a>ve[ ~'>$/~{VvA{31ݖ[7V_]Y8~_ \f0T tffP$TٖTٿ~IQ|d骭eE0um;EVߩbΐqVYrǺx C9݆u{u]ui7OEs ebo>(ˤ\( owS?W| ~UpyVן#"͹4hU Bh7l.{.WuUƨɖ$o*/ s@^oWrjw$EgX1$+F:m=05@5k̀BR D'N4ymIk\|X)ِo{ݷDORYNb8P$X9U q su^} Y ^aNV-lzUF!V8r]5iIϒkU5nY AZ_>]%Ğ{q(ZtoYSlj$Ģ X) 7uIDC!tol*aW*HOc/MW4w%dS}* *[|qދVy܉F_OoN১@ǧ\+΁6E3 Do{ʛ)AARvI$L, 2}/5#m 5c?/"Lmri.уR;b՟zPkQtkskTkpA{|Xu08@p>:Lnjxy1#GH( 0h\c q "qsP򕿼duLk)cg3hicD:c|8 /.on=@G[t$㴰Ֆ-mL YSݹ L/086ؚAi#ct.L4w1ڐOB\ WM(tIFoAdQ:2 UqtmD0VaC$گqtĦhD(p 3C h;^C5r(#xjfbແGzs4(0 wvOl팎++!ss&nnyځe_Ee_}O: RtrL gˆK91~kJ-GKZiJG=0`ܼE#.inF܍װɜ??]W̭Irj:(CFdD{w©BI,"$R'<' 4 $c4vq#8N7F #zѩ6P4؏Bׄ 8D- }QT@B_:8b Gg#Els@>ԋq(2?( }?尿4i[gK;wxߔQ[>.g<"R/hIEwG{Ll/'mj\Z Q-X녻ОJN+G?/~B0_߬J!y-PpE6iџ]F)V$3G;wr'p-%ߵO\u?x\5ʏ|ǟ{_co7 _xW%QHr!p ٖŒ `q ApNa"|mKhOYV~bm˾cR8YW!jK΋JI?b")CE,0?i8$WFW͢^aI-kV[r1Kp7jdMx1n?Lnͥd[=:`4ΙAUUsǟ2Q/igEk-ˋjB$"18w۷ȉ=$%qxGw1!^GJbD'1\v*weE)(-N"ḝ-t!4B&vg0nnw^=%O=ĉUN`3XۮN?A2x@k{ Y (S> 18Gv6ɿCSJ[R_!Ϸmn82'hZo潖%9P++D(I[KS3CbYLiO#U d GxTΜSt0~Źk<1{c'r&Hi?CƟkM۠[9NUk73@1Qve]Ofz㌱d/Ԡ[/SP@Db$Veݦ͘hcoȥ|IdɁ$!_.y_osTf%{ PܰAp$ !O6mو-uٷ4o5h  *fScӶ2Rd8KCd M|jSx7JE;'M߁mYlBc쇺l*n1 3O'JM_(;D,bNCf#UXss&DNdvtI&ͪ,J!¨wns Ͻ3@,4 Ƽ}W<D(>vؾaD[!fy|ʱxaZ^p@ ëyqf@sO/8׋Y11lV&t0N3v;$4vh1NeCнA"ZbA^d>1D I&Gsu;1G}Q|7F3NI@{5,$:6Jz1S[n^n+@cbqE}JAgY({z/KC3+RD .ALg2? B^C .00 ЀvSs^ )!mrr0N3& Igڈg V9xyU5+DS ȋqRTJқ J8Y̨$ \I4},؍ !m"VG.eҒĺGە Vm7'nSp9m$L37k#$ {!3\+8CKĝ < ݈#@rQK\8bI]x =/h%xhr`H5gZwJ~~?  ^B[_JJrh_a8r@])1FsDc\XBatJ (\n0S}3 Bxs;BNNg)Aje4(hf[1K2jjNUd '[ś7X@-e+^DDӎm0 ;`Gl!͐B`,.|>|9= mu.)ғsCQ$Sv5Lή*ޤfɅ(i { FOObW+syxn!t{ȋRK~ޯYZ>:>!Ɣs:8D$X_:-s*ZL_Gm~g af]|]˰_sZ3l^]Tv3/, C?ϋU)TA)! <ljuQ#]"&y#oM8IlM(ZMn7s-˿ ; XRF+q/|?8/D=pX$d~^ 'HMhQԿ-O֕MgH 9ͅ84Gȍ8ΜOp62 bN̰f'(\H'$N|;4AG .N%tHHCe$͒4#8 c#4HB4;tM(ӽxuS?+Ot Mu >W)gNA ƺay=3Km9*qCBdZ/z^ !Z-wP5tH(FCA\IB9e^H]aHfGcFQMBB[uxgȝÿ.xw% FfEE}a [s w ҡ^'_6x?wQE΋G#{Dw6<SĐm&'IRu<-&{"laF)ȨNʅxko1x7kH\fFaŻ/{iNagʢߵ`&ox~X>9:[S: 8pUp M우tG܇QDOy@( >Mb8 9!옗qoσ (L"*- /'xSH!q) ڮaM Z9qyi]Nw ;IL#?$IL4CwEģg`559M^?'0?u AIqu[}acQـmPxz6_Ë .LeݵȢz[TUrhq5ަX(Se;*2(w;s'NzeGrەulڧZeFsS{ 3puMw o9&Zyz/3H䚭]BϋT0|!#ʱ#7e`!^侚W ~"Dł BIiCnvj7ZQz߀h_ k6ov^7!-Q͗u%D+&~(O&q)cߊT:+B'qrƢnyTQ4ZhRa^ {oeGVBɕy͠lL%XR!_cvx pAvCӥ"k 1k{."5ʢ`D$UWCBdw:5,h~َ湵od* ňc_&Ң\%,_i\?^ٟ (׺gRvгh7 Nm=P`QVt# zLl< vCbxsଓKo_ 7YM:=}0q<'.6P>gZo !m 1An+ņZL{EEniY/1O3Iо*ژWuȣw'Jwe͑8ݿYݪݙݘ UGuDÙi\e.yLjӰ/:dzPKk 7`/u x<_ii{~JP'M=Kj**thxxduE}yJrVԯܼЀ9I^\%q/-Gd9Ӷ^砱Q*5ݡڝWb- ozXyK>|lr5N;/z0=37C1l/n'fs-bsD^P<P<:yշny/oXJ7_:GWDUR *ctɻcX{3qz|u%o_{ 00r2"д s֢G8 ;f>a'=j7x+nF݉*,7My'&G˱g97}$),aʂ8%ʱ;d3kQ:FwdYyV0AlEn,2SP/mʠxpUgT*AI&Fy LO@;M1u:xFbQP?+zKOga- ˢ|qM'> _('128$bfrˣTϤ>1|+ˊbnV gw&9V^0C w[wtBFz{ TW:j)Sj=E_W ўP~_&x(,۷<4+;^rIHMf̀X~8D"z!u PgܸK:/q!ߩ|vsKYnγ%>_+mDP2%'^r;u|cǸ!Eumףnj"9QzI 2bfC^+Ɖ$Φk΀#4o' m2]q^ayjHσ~2?&д T͉ܶgcxiڶM0v>[ΪXȰo"jϸy%4Em_ɑ/{z+&c =n0?ҙXFˣ YhЕ@ú*MlIRD+VC!RTYIDv4/G6ҦPi0N_~`Y[$om+G@B/WB% ΊiwtAL59]7BDs^|mc{o&FI6jwzPaD񍀅60u#bCSj~i]j+4Ѩ= ֍urȝ5TKm7"VG(߲dR%D{J~ti]s>|A ܔy2 Zhhj$01 /| R/UzP>GXk>sB}h8@R[9KR"%9D0%I(Y11Dr1TUۂD#i"/7\cN]qVGäiqi[@]m%/,rҧH'z1uuNCuGQ ~yƏn'y u"(IS!Y[k,ɐ0T- áuC#BWl1)SAvk5f Fp;:*=l $yt§^/7%F@<b墈[ʗMhr[eC# ]&uA[=wbΝ8c;# >Ek7/=]M]B8FkM;T,d+I!*FUw3UB|(-z#RZ68( 3v$&&DE[ kEȮn,NxʐZ$J)uWOTdJ ځZﲌ`y%PV.ϙjC]V3i:&F%I3H%HR! IFJGf@Ć nBl?eIVOWluX?l-',WV=oEnfh ?Փ&lb KQjU9@b<%uS"W5zfy_xiВց[ItEh=&%p6.O;O)ΗKO{ &(6  >A?Y^DE&.hÛnEE="W_,r+A8Mp3zTܚ+׿ILl,s}Ҷ2h-Sӄ.H}O oUm]]*R|Q siIhpԾy{i.(H92(ơl39B3N9]6exfKM/ضtaCs< d+5rvTn)PJL~VƅA'IT`LvzMXkʇjri(4jiB]N $Uā |W²Dt8AU+{h bmmm]`L_]~H1wJk>oB`Ɇ׍K,5kE?6K5Km߭?Њ.CrFᘾeO(oދ ,> r ~"ǀMf9&M\0;.` @FX+#%}9E5 lIv 7tBn{#~%/Bd^J%u_LVxY}VVD0CӘ6$fe؞4̵lNy91|$A':(΍ӄA{}nB$g/St7N0Ǵ4Q{SWZt,plӰ}0m:pNV-KbǮeEHH" q#bǴxHmwF,|C)(֨8jPxjM SiZA:փ]#$' Eυo*oh( -tC>|=j aPX c,Lӣqh7arBS\o(Ї܃}#᫉,kjDzE,V|kuSНqP, E;V/(DTumsky.}Ѣd#t{۰rc2ߧ&qLQ *A EofDچ>JVvN6yzHϴ)ل%A:8] ʐAY,hZ-'LugD![*r&%ϝ#U%2J* _,O% U*;^&3A HD6Wqv&M3#Up*ms+Q>Bܨi$[B" MRjcaIg,1nBg놈sI?Q LKlUVW*>.]2_pIXMxw 6 <%lwd:>TB:s^{ivz ͪ]`_֯μս&} A'A  $_n_G/0w3ųiϚy)nљs& d{^NZeOLI8# ˜P!#i)m|vf4#bO\I:YhzJ0Y2Ş(ƴ8}Hz UpiMGR#ᠤ>~J?Q0eQ4YuIr>;5$p1g5NZdo8;a6|X,QPىorԋ ۶ t}+ '~]]#N0ݓ=y?f[n;\f'Nx?s|ip!E5۟ߩSfR> Iް$2-^>[uio%Sl/qΏq|9 =d,4܈ܢ.\+^ĜĀ0C9 #6>ꧭNm-Xm}@M3nMm ruM[ݯڠ57L!XRqrI*k7% nK.Q+’<ɝ{!򴘠ڢJˢ"RTP3z2Y gv%o2*l7Ivc{jY1ÿ7?@:SV`1nq€Ph&7؏,5ޟ Cg"2y9\4GcBaxmS:oOGƠs*mV[p㠖{(pr4.k9\oH1;^YI_xk f<שܰ)J0svniZܡsI34fa2J]`iY"T5%7^a[>gvǑG0$ 6$z~K}R:t'\M1ƣ\.%)[UjE(8i2"-QGA4\tMAసVhPޏ(X[޷JǗ Dn )LyJyD**%uC lӪA:)vy~߉\nIYF@"!`EhCF)!|E,KJUM팦)}.CϟTF,D.,CyґSo4VP4ZJR S\ NA(^Vt5u< U<0cC^"]E.:@8$0<|ceFmC7/GFe:&5 * c#z;:Vt;[7tIfL3vydnѮs}$]ZEZN)*ȋLg-n}<.c. ۑo27Ab&0<1%PQyьOP=$6v O"DX툽Œ` '>M ?:xL}Rf'OZ?8:bor}əۇ;AH6ʩzagsBè=۰Cw4TPe V4:6"O'(K辚$Noc p=˹ޓ>kB)Oxj(؀:ߵ9{Y‘J3$1<4I%%)=_ER-i5xIZ&ßQ֭:4c}3 3ݷ ٳfQI5u\eAvI(QSs2O=똺`aeo-ZvN!i*kqGy98Olf1`boNmYed-JW֣zP*âx|A8dcVb섯ώJMՑf>f_y>#4|BM%\=}XPL ʴ%K ^QmI(3L[Z(,|YL̟='5NO44 f_;x& lb[ JP RGORO˸J,bˠ}b0BNȓ<Ý)A?GmWYkvYzhO&C0N~6@qUv5& Z'  0M40xy=<ʸ/Dy%J%z湓&8u!*)\cQb\IV&*k |cEߙ. " >f\ݦk}itnǻ.UM|+Rg!q|\{2In[>ٺs@8k;+wxh0IҺ;cWE~cfg֟bM8b>'r,.(q *= IЪ;ޣ 2\qʖ\Bp6”pYXv6׸F+X_Sk.!ҵ)V;NT;ԉחD]b}MIUQ_[~RmI4jSn\0BP9nBbꔭOHPƭT=u< }߫mj=1AyTٛ -AعP*AVC1ލ7ycM bfب d_#;ЪmrU:Tnnq#JivVCq1 b{Kp;i *7F Q>M_Ϸ4 FF>EH C.!"zud1y묜-Xۖi@kd䡅ɷkk}{8_EwFjL}s=_}w-5]k׵uV_`jVwcQNTh q'ڭs4ahv=mKb:MćC2S-v6AG=7uؗ1i|u/yqIvr s7fz&He|~aAK8LW a bAO>=e$/y'E<ֹze%\! dF^f!7sN_N8>z{}د޼t<q }PFa| iXkĶBRnC:)smeӳn(^koOu74TWOeyT3=_ؖ$~_Qm$^3ݫ\P$)˜?&z),R֘]&6AMBN'!mthRaqk~ ~$@~$/PC)='@H9  曹ͦϖOQW²8gɆpN·k sx8G8]?Uc$=72U8# 3AW[WMql? T@=$H HW5;oKe6sk7BPIi/)jޯ}~jhxR<$~#{]O;_4(7A i^_?[mӃ{tSu[ oϱx]^/-0X3,.仮Dу|~3 Y2QXaurEta *8~OO쐮_Hf6~GnnOGI"eJf^&.tzߑ_0Ao*s"l>DK~ijةONDwoP>݋8* %w܅Eɴq k:J-_$+7{̆^Qާ v7$l 7>2~\ZȱrjQ2F㒾HXơ02G"0(",(wL!V ^s@M\٠FaXO?r"UDԚv0}x(͓6Í!z٩Lj3On|:q0"?fdћ'tT6iPgq5ƩE{Z$ _a'Le)EqBiyYbA+ p<"lͅ'ċq:n߁FA[] U'-qРMuN߭ݳ3C;J ?p/L6B178]cn$+s>b/+_I?/[yĂ^~p!!yb_0<`x.;` %ZDClN=Damomx~8Gu5;@BpڽUgldOs%j~D,d=xaWM)ˇT*׀Va_(gscTi`WVO-8ƍ[Ƚ\;,d!X/[_-]j6Ck SX-ʻl:>lՂJ?o)T)^a\ s f?V!݅qQ⒅ιtϥj_j$Bt{YL~dLS9]B Hgw*t']p, *dGsFLw QD6A̔ !@qzDJ"X9>c821KfNL` PUI)cLQF*SK%&k~i~>50aJ9krXg/SK!2\!CY)\UsX}| Q a\SceC`3,9u_Z=pV9 vģq(el'cH|oDk^kU%TծPp W L+rYo} 6eg@P)prL@t e5ra*YŐ)3=8j #>- t9|hmQ f aX77d#jUbX[OQ,:-))svyss]F[0Z 7L^]r7ϴVuqi c@*?8Yhd ̒Z^1o# %Y `?٫VEwd /,f8ݗb8;`b-x$H1s6R%XZVˬ8G9sc,,k̘ U`[g+YNJ-u`EV*/ݡc:O-޳ۣ^"g j N<5+ƃRBd59=,3y. /1:knQ{G9 nx߇@~M"b<{WkLTIc-ƥ&V4+ DbGK)Wt=Ҋ:<R2xDub FEAYylm`W>! 01JĄ"S">0 `FTX$U2UK%K{ ˱u.{6=QJ[➹U`UhFJ۶tVyf6\! D-'ΊzcHJ F,_3EI4Tm /}(Z_lWr?ĥ9Ex?@oYt{nk7JBd(`oAk!=*<@PTaIcvTqZ%K!~*+@6  ʮ`|ɺbM 6jfmGaK#N+i+O -ORdڢۼ]Nl Dْѹ[t4؇O |&Q_da%ϙpwPXC%p/eWFO8Cmvl뗖z<5簼|F+ 8wOal7ti0#c!ty|cwĠc!yX^E+d}1 $0<;}OmXP<Y͸䋪a))c#M uRFiءBw,:Bm Be9@{o$/^3B`i^iI?dQS! iKɲHyEAr4ru}oy JMczO%`\Y=wi)bX@ ޚ6.p(J `vAkqqÈXHQ ><ŀl_+@eYva"֭^[(TJj BѴf!"0 %۽j, ,65/n󸫣ّ 0Ar +lJ ػ9zW8:e0й`KZP ׳̈t*6#2#=myn/R%Ms4@yW)yZ^ms| "=:戬Gz)ݣS}{F OyGNmrvqPt]HCS:ݰ=7-7O&V Khi?FV]"s \y: kMXkFs#9,@jܝvpa?|qpWoxӯ@>)B SHFGMD/A OC5 }@֛,bpTKyQw( HBnR!< :wZ27mPA\D2lIjL5w({/Osld6TmLx<)]Hb$u4,Ek9tAEZ&]~SYK(?p u肩d͝q_>i> ~0uDzэ#è Լjyy9˷,c!2|n0cZôe4i0zW25LƢ_ <ҙjayM>u^~OoD$=a#pB1H5ե4љ6;g%% :F2MS]2s:fLB)'n!eY:2y@47, %#o|8pjy5T~8,?%Z6 abi&SXzIUܒu=&Qj@ nr2c*94=bZ;[|吣 0HFW)m!&$[Tc>f?~}|q3=bc᧗t \Bd5>^!^Ny8s9;/1Om|nN)MRDKn;{n >y k=׼2?pfY&W$r)ps7_8+UaO%yj.v/~(Xsr㻧TqIy0W Gz*mT3&qK,RVKBo(Z>/:;r=}A6yTtzfd׿x0_+׼;|,NĪ6~[i#,56pIC q=Mz/?Q~A7y*TY9D- `+8RS- %,>x1qg>Y\w}sҶ?Ov6{y~XN)?e?6%+Ӝ>^NGE WڶGm_E)vV Wس!!؈$T vu| Gί oWjKO |C~\1ק秣 ?uûJ_=%G&CQSCmpB5jR^7]scOJad+(1ŨyDE.:31'q00/e 0$Y'un #EH7ăi-use;*!WTV- _ Kp2kT~3%JalU\1o7.B`W*#L)\as:x[UIzw8.]>q`-!{K&F.Cds[d% ]m6Xj^ěsU̜YVD(a_.f".LV cš\P3N=XR(DTbt"5$]2dogB )g̸آ&8yDke1-)Qy8mE"%V`J+Т$NT =aql#Ɗ*jSVa Vđ@ن4^Fatk hPo.#Y.Laʼn,!T}"5L (R bPa`]XGȹv&Hf.K5 +r vyL@B{ b! ,0F{WJ1PaUu)HipYh-Es1 )@hd;#"ՀZB | 5/ƠCk@MIJhc~ݙ}Befs{~0HDCrCW6rՂe'd $^ mr(334^$unM2"0 3i#Z~ƑF"saoY]14JR kgd&56K m?L7sɀS\:nTwgS[ ;V&Ɇt!Rc$:&./fXf8h-.DFH5=_{dM`*OG.&tX"GfSǁZ yw)!vb&9~_/e\OԨEb~,b'GL1 l#ܳmv(LOc.kazH0XcyqVvQ[,buj[f_8Jmr:ivhdfCۘfq(/\CGCw#rEUA`KmWyF(C}6XZ#M z|dln9Y5j~$eklsc15o$DQ9Ñ\lpHg$%24ggʡB+ޖʊDdz{MWU5 !&PNY!pt{ Ml Md)U+b7G&FlN$F_f[0`8DiӍ ƥ7yř},Cv"NN x?d@ZԼz Q̺iDuPbꔩr|ȆmU&OukgM"R'{dY`lQMNW<1,yU!ʭ:l1R[z|"#6v'VE6aj9tϨ&ȳ b$}#^prvtĤh-()~;bD( *<4AEK^2 4 gxw_a*ṳ.^kh#hgMOTY6Z=lj+bL45~86%T-cqizXx~783%(zr˯pcKBZ hezMąQj 21,#%Y{rA_"DSXS<2HFsu[ձ3/^e8}ۊ Q,րq z.ԩC2Ac鋯SߑysV> ?~IŻp45ݒ|{}Ҳ1(;3I.VrX),3"k'П='?x7<>?"Dzag[)i (٘tH}FZx~o1Ru+:N{//?{>V+J/1_i©?NwWFte:S' 9yD"~:Q·eɺ۶}c26d2̤u{o2kITIK"q)K$ H~;M;ŶpsP8>UF2ӈB λnG9Z/4hh^VK`t `Q'J/e{#f X.񣋼iy779p)(F(&g,QC㩋lύ.)bA6) 1y <%R_~P)8;~|*[S"Q8rhSsSfK}xr]MXx"N7hX@9Oyi3i._HW{ W^zOqFN֨nCCoB C&`:&\:6m*BF>W#G\2,g " vzb6@o>'"]f;; -"@(" N66ӑ%5'7R *s@Rj˳TbQ'w'M\b߀]n;fvP99^P* vl#ŜC l@kry(V ɤSΡnJN <`ڵAVr']Zg E*^N_O^ՌkO}*S\ְzN,2@vm1IRّ 5e|lv= P' !^DQQύ ?m_14[j2v4lm>jQ\.%fS5m~ݪ%wwI:s0>]KӊӻxQn.O o9S_r\vT]I[ "}byOKF]6ˌf S2f bUn:my0&x‘a*2)&gJ⻌Q 1BrJ-"VbZl˿=JPHhw=V ^ZH6I\k,|u̪{Qۣ~B0@ wJxըW:Yred02ݗ/_vHr6Bԡ.dljH8BFMeb(Iu]v)cS,4Bp{\aEH.vs]lUR ^#tM1zkˁv:X&u~h\i=頋_cRr!- rYR8xP1/L2-w?dJeu]l_m/% e3>n_̲`'yzz{U,K3x8ãhK=/.RԖ#bz!}&aHyE ;§ <k`cmҟ%viu?aH'51ͮB$AtP)_DXh{!ҧFF!yL} v=x!Ğ!30N5E>26ӐݽF6:5jb2ӓ m++aAn6GY(n]s;w ="WFt *T?#E3M WߠdӐ,Q^r O55+MhgDj/e =ecxg}D ~P,pȨ9=r KF%'\c]|6 VA!>6i\/~rnEDq4ER)GdC帮yU7{~w7^=H5~ٕL)%A NC Lqu@i9G*-=XonAzzDE=8،/أ >ȲH#/ffSMw9V!R`Ռ'< ]*Y'T.d }g!M'ͥf#;l]CGGi.4uelhHutirh #1hA1n@ `d|жyeQlh̵1:fs\BD^4[b%3y]6SC $4^-ӻ>\vdyl$vhu6< %]Ug(anIK‼1OOY@W?mgo!)̰ TzD/x33&ta(JZ )07(L'ujϪR 0?"!Z<CU _fCT O*>o@]!B.QyUt͖2L7^m{}Y.k.fmf>eŪv$YqG Z{[P!=L̈́ zHȜiQg-e,g:q WQW"4 ZWnƁ aü 4O`V~Tc= l(ā[n;{D񦽴aOJ~y:YԦaN9Gx>d#Am|[,6up>?|=-W"^e;1oJ]^'Mm)'GysS[p[I z.~E8@}:#<ƳڣYM5H|Ʌʺnf@?8kw[pOɬqU:g͖xBm \ۖ/2fK) lqK{2((Q αzlKԵnκl=o6˧ƕ!Օ)@gg 1f]|fy<̓/}?rͶrռyayUҽ5 @tk{_ 6-!ZA^[EN!IV37L7'[ t~*-qąhzXob1L(\Δg GJAeGJ]ɋ"/Bjc(yR#l2|m_9Ta(>,ND0463γZS{k2''G}yBFjCOz(e)?/5)0A^JPpBQ&A00 M,~Hq+߂P/dž?5Hٍ?9?=O8#젃zD/vᏈBW ±iip"7]M=OЋ3:tuvTj8#UݳsTK T8CN{ B`B4%'yHaK̓>tU` ~cH/ŝ$SƝGfHc!jBrWYa2h${F9"DBG }cHaᤏTunqdE*wAŔBP4,Rs\2ɔlR 7O }{vOw#O8SL`VZ]cfgԅW /?%V<]v%LVͧjtشJ_P8YfEcy7Zy ],\2a.%JZBp 5QqbTbOa:gSnK5Omͫo8ij?WY^LWz>`r{q]n)̝0EHxd@(?GV1&2Q cƢkɑ(*HXG.CJ6VɱO̎$7o(%%Hc!^ZkBBN1ϪܢZPe:/ol76ho,Q^aۣxZm:OP?';粤cz.|A2 jv2[@Z!.|K[ִ^\~|Q/"39&:uzm}PKFaFkۙG1?qo謾/rFP(ǣ(`ЩHp$ǾFĐn-_<3{ /v [Mgۛ &lJ޶#U |A|T-E/`pЈ2[Y3Li(VR.AQĪ،F@uw2bȨi;`2]@y*z4ž 0b$gZGRx7B[Pue 2ڨۘ2F稱%b6u)Xg%;81ix|կuٌ.;Yb ('Ff‡Uu_&,؈-lFrϐBᇌQh6b&2ᯮ/\fUu'xi"-@h k֬OVNeg:gKڢ%1Q.{gi.43ckw@ Tk`f^D6'͇E5 <,?ޅ̯NfTޖ[GFd7C7&J21SYT8oԪGw>V1Qa" T(( J*wzkxkPe^k}.2Cv|r֑0>;BGQ2fmY&zv1*mv뀷r&/[6Ym9d %6|B8wm͍}J@ʞ*串IŖ}5 $X$v_\I\i7ڭ0&lfbAp-FZ㰖1i, rH&,ŚHkF |O\}CaW2{RBT [ecXl[wOxf~ŻiK;jѴ$!5 5e q 1 "H1$r1ǎXT)b3}!bF3|1Sh>;M] 7_9.6SzEդ^.o7箾3jqbpkY5 d(GsK޻4!=(r :M@XM 34aL橊1q\)'9ӼӦ^JSl 7[5/mmy'ʊ/T3 З^Gmm+n'P Ȉ(8;K8XňA{%Racj j+D0mgq>q ߻v맮fe$+N+wE?Q?Q(xz62;{fUࣼnLC MCSDGL)u1kj2(QZlNsMUb[J-ԈM:~43U3O#:4٤RƨS3 MtTX'*V~Tco(/2Z;M`0'v6fsgM捪/dx~ݵ.!;p.$lQ'g 5@aGP$7,#xX5R\kY)b1w18bdk3Jcb05QJX*v&fuv5*m`> pK]P,-M`co88 _y:6mO~Smk?Gl4LHX,Bm׿'{O2?w9?U {Ѣ_{ӚWzSrXFv ^jlP3S~b$m벙5ȟq,Wϓyѧ}x>Gr2'{mr>8r٧}xhmh4vƓim̓Sxσ:c76kx+^o=2lxi"R=HXsY@+6kBP@onnmk ߶Fȏ>|(xH5 51 \Rsb>-(/G4f[Jd\IkUbPAX*D SB"c3LAvw!zGSU pr *#UwGSU=mvP Ha % $iU;`980a<FGƽˇI߾0/AGJ.yh?úaxX< % *<{I.Fz-@"AHO,-:8B4D 4#e˺e?,LY~kvk}"h09!",3 MbhJDP5`>HG5VLjbAH&R Ily'W5% 9[F/e.3z#orӶ~ͻiI.{Fz} ҿhQ 8& -"ԤzV,6}?=Uw>`ʣ->X󂧶9ʩ%f4? G" 8ZMCʣxbp}Il<ݏ04Cn  f1&ZΘU Mv1Iu %VD8ňJJZÑ";Z=*3` ;@T~ݧ7,Tjr{}iz!YUx;ogf:]N@V]{9>$ijꄨ1T*ƘpsSe!Ș#hFsL,FkT 'B ;EZd7&OBF/A 'pgOAi4Fo;\j E}v,'m \O1Dzbm;υœC¼;0}jI}'k]e ElLi/ jMH[Ӂ$Kx|03geFHqvTS:MmzA]UƴMUGCdjC>sv+ūl2qQ9֠ODDYj1)$<8j6E L!ݴ DamAॹ.7k}H 2HR;% Ljϼp4t-N$AK"I"3S*5 n&蓬Y"vj~28IwK] 5+>1~ p'h94NƳMy.yt.X: toy>tRK|ItRͽֹ+LgV]i"U Hue;(uSq ^Ĭ898j{.~Ի =ې鳁ݚ%Ѻ+ #à60οy!;QF_}!V$F7`Fxt_Aύi^i|NLV!0 FCdC$H[=C I:LL d}^'*i{ZUM(3>,MD@Ko7M!T1 D5tUa: ѦY%W?L],y0A`(~HX&A1%!g Y/Q=2&4!\[bRcht;* !ٍd'+mZ+g[>#|S:Lu=;lDJ޹xus5ge7>R58>'j 2sB4-z.hؕsUtH9@/=Cdg&-Ͳ)A翉$G @\l5E5pl WYryT%0%[S"|@+ Tз7`Q-aLsy'Q1PUrr$yyNYeYCU:Rfe|c'OdxVDxt$TGP&60W:`ҷgy@pMr{FAG5gRsZx'oΒ|ѿ \Z,/0WF-fS.jC.kkղ;gC{ [OSl-|43Ya $eX*P'$t;4e0iQL$Hmbv7EZx?,T`adv,mZ*'[G `ڮXMK^A.>_az< N6mC:Nlm}%_R筗;:4zeU+"c\VnҞ3ȵڪ'{ƆkfzODIĈ.9bt[Uf_Xx;:u)""Q0VsLpZZ)[ϒZ~ˇW'{,/&$G ,*+YsYI6hsUաS&6;$I(ŝ. 8'V M-NI`TbEF5&OTWgiDh sG_; ILs"t*zXY9onOF%'3# ]S+L,NnV`xʘ`MޓcݿBw1(ј, vB'g,%yȪ`ɶ+٠eE|(K!b:P9|IR:`BScΓW6]tX;eKYFzl7#Hvr|K^vDG94q*c>>szm+⮳-y*"I"GbDN{:_l_̜õp A H2#T#LFfw3jcT A"Xd&]l3 N[¦lw;b%f}`a7EjkьoDޘ/w\%cA\4<(nn2D ax& 2&U#D@d?`O5t0ҮYyrqJ3J`@)--j~WΘTJtts *"ig577 cHnz JNSD- 7b>i&`(@Z|EAG̗ dkVn$ ![kErSXik$镧)?aʨOEļR0&[Bm0r]ϧfنZJ. flq!"ƺ)ezĈhI尓|_wz-Ə|@jL9ɜc)c`#I?57e3%$ P ANw{w@V`:,0%ص,2oō2{oVmՅ%<^+} 8oU&i:4fg3~[Kd-ާؖOX&[E` l6|w1 ʀ/|h5̂G#VfsIωXffHn/e)FqYH["`` jO9L.)CNǻϿJC7g^TP%*]Z.-jVr˽ŀFTt'8RB5YuNӏD,KxUk#3SM.@p1g~woVRҮQx(K^ ^@KV#,Ot 镦rF0*cR38 $eA F`.G-2AI{a` [Ӊi]sտ[=Ŋ!}?hrѻlg43ݧ9)/L(S #1?]/kW뒁 "U k0 )-Cr1jC+-`䏣Z?e2)M/72-X{__5?i9]%?|7L܈-HIrx͵t̅3Z3v̇T^,RPn'E\(gT;c QĨ` لb.OwOn:׋Ouqs` c?d9;RBg#zx]SD) \NG~W^yt䗉lx$| >(~:Nj+<6D:$!bʼnT(TbNg3qαJJ;*9`X&P.pk2:υ axy7A~Gb(* .6LY$/H|IHjE$ui P5Lr'ա!ג(:Wj")A ASK2 _6U`,J xUK}^%^ukIۙYۿI~i/D;yx_R Qak&DNM%VzVC_~HUP2e**h&Z2KyT…3ң40¥4= ^XBL=%-iV2XC){R+Fh%Ag9쟯ȈX6Os4Fݬ=oWE㙔"eR/U%;qg#zu'J b}>DhEB%$jgb%ESS:y۩>j2ШɆAZ QS)pbԌiu>z֊^!,Ά(0csЃ"4t.?׃}M~&X+ԷBd:?+}EwQ2'b1H\h8p B Fn q=Rft2Ø_#L^ aITZ[06ɲ~2ecG98ʹ |ݤd}Xl7n {uǫQ%py$! tY'.u0/<¬r*'Y1Rym6JLR4a=_WdmRex]SHίu;s&˿g7+],g?mօUU٤R<_q2]6#ԑ/.%ۋΈgFm,]ճJipJk VPf8pE ?&%-f x[K>t*ic Xڰ3=l=~V6KGtm VzRR<u.m?ca!E$y`X3}r@r1O# , ȬF2pjbF;zF;Z恸WQgᨸE:^W u0L;7.E !85S)2-RԄ&H|~ K/i1K6Po(:̱u"@ eQKgD+ƏAD t@ ]/,P/JJArԥ; $9} E^YhT=8l@u\tF\w-b{L!I)kJ@03{}웃UNRP[Tx?ꤑFq kLb"*rA=GDWb#p )n[@V z+BNA<@*\i;wjگ)5RI9U^7 .,ץ]f9ȸ TJ0Xxkj0?Z*u.Ea >?^}@(=zI8C ny@KÝK7Eelw :x$p"s u3&i{`'x &z >2o/y۵]!x*n ?rVZ0@ sCJu S 4: PSrl0l|ɚ!#,Dܾx->9>9[4tpt$QJ;33LgTァU@9<ɂb8omc[W}C/@4= n}1WG"HrןR䐱(ɖ/CcYo]gY$`)h6L:ĂC,ٻmbg%D]xPs<^뻵6#s7v{Wx_3<*UUә!E2 cA^,+DZQ5PA#'Qc=^`ψw(7DBVT]e[q{t8<&nݱ~J`f8MR92Z5i9sl\g\I-&2d##jn<'K'ElYMfj H]_W*E#+IHؠ cZAFkA r:bi ZCIv,W/]W-I4ߜ8^%Ȇ<c볱Vϳ)z x 7̈y!Qh!R'FxJ;u*O}ׯE<8oQk7Lɺd[&Kæ>؃2h`.c"r2hTKPs1qTb=UBH#, ֕r/rmpLK$x2J-f[=0DN' H9BNU'% 9anpc.(+L1WwO.@p-UB~dO4YѕVIǰB E3ED d90T;!a4U - NMGp>~;BzF l^[%ǽu CYJJ Abl|b;aΒ Ԩ:Zۀ(圢BnFό;Dy-aL cQs<0Y*:Ir=!S1q-/aWzQMV\` ?FږAA.!@}cX@{˙*IL{\%+ *X=rp.;02r)׳K_9~D^4n]2G8/W7;}{ϖ=7͸#2f^U}Aϸd}IM>Y^ر0P2(@L(pl<@,4 Hù$%QerV(4q+̈́̍_5lw\xh2..o}wӒ]rMSrn)a{syXQMd.b sza3ѢGEhA 5LtyWs]3,Hɳ lUiPQ)b!:41Mva/<v#qDBu@hr0#e=ւjip ~\rM\ ca%,z'P2}"Je"텦z93#sa%5?eO|\XϿl~B` Nd #,xS@"0 9t&كR%յ`iTr-LE>-R[*jyNySDF鎂4q;)v 1m ՔjJ~>FdTh+Xk']^Uk`fۚ7CGGr" Zϗ.xob4 x„2F;AYe \hʡ=y~]hP41WL.nڿL) 8$r3U^Zo׿o^xyOWr'Y//Z_瑤8Kc(ֳB^\Ԣ)*Q؎nЈTOYW9n[VgKErc [n\n>,vevx0ȋ @HteH SZfX$3;ݺ.RKX&bQ (0_ ߖ:P:hCr14SQ4 F#\,2vo},$[ChܸåqŨU;u.0 Rq"?:qc׹'oG *pEAX%iδ=n;y62[%;zSq!lu}q` 2%CR]Wͽބ/z>`u߭[}<3ᦨΏNnH 7ݿb^4)E$X/01L8Dԅv+@3BE$G) 9 0i畏hWctk3o\LoK^ Rt[mq7oċ6RP&@2"#5y6J12VU M5IĠQ .a-TPE4{vO#O\Yl^x4v55wGPzU'l0d.TKNH,t9G IAŬ jXsvWGOu>[|md8 Z7eyP>8T,E.{ 1Kۚ~(NjYI_l>7 T *0C{L<=*JP[{>}.3EuhlsinWe˥U_un#,[w9̳[3c®UL4gf\3 Si>HLo+3򘶚o72$:Vr }ʺ_gv rS0jM{o{͉srеS%Dsj:Xs[o.mmaNcʻu '.WE( D}*kA; P@9NMPɂE nԨ6meh^Gu emS=ڶdDSdNT^NuWʪiD4N>^*f{X%R*XVv2Fx&F]L_VH lBb\z$Nl+PEU4Јok먶 k:;?{ތT6[fL*['wRx5/w;huU@9uz $B)8\h@PCn(pB;ˤ k5t:z =X(kEy%U%z,H`"|dnc6,CLX2j pz@A Xdb`Ql]96EVb9w]m??:y+ \|d\'i0E cw&iQv\an ?}sd\" aلrF LWuuP!Bi @'XxUghZۭ`#SIچIF?m`.:(CH!h fnOko'4%- ,$g A8G%K>|ҀW+9kq-Y?58͂5ӄLI(`YNQ&0jXګHHʨ5ϑF*0+cK2 '6>ȞOs`QF]äXhqT$짜)ݕzDNi[uVs-ӱv,qΐ*T x~"B!KzFNroPfٙjxdS!6V4f!7 !YbFɰfrnk q $O57+WYgeb>+0TJYЅ$fPFGC6dM1ɍZr6 ^̴I5 8ρ bCYUB=YA♞h.?|:{7g՚ArT8~vE0A TcK0PTŝwMB@',Gs {9%Kdmy|OP,~<[ndB#Ã.D6zm3M(D-dQY~rEX.8egb:A@ nc|2v:-n፦#hCyC`߾ N侞Wj5z Vi`I}NCϩ㑅ZI3[r }[4kY䰳V zӉ e'dVM6>}9B˧ nQnӝ98.~;;'(f[ɩΠR{ y Ka ٵ$N FN*ȍhlMNv$U<-X ?{Wܸ+8c5uD/:e)CR@G E'Žh_fVV)ݭ_nՋVMr$vɹ D!+r &-X"McHI儓%ȨB͗!.naq1VV D6w11߮xn>i~' V`{rg)k;å̮-gM=H)4W:sC M: f{P߉\{Lȸ L 41[]r\TK+A /EFHi0 j$ѕZ$dFEe0S\UE eZ>b~CT0Rsm<㒖VSDBTm1a;hH| #kJ.*Zu`Fj aB=zh,U@=oeȕ `9@_qu8D<#9Oa<8oP]3:2b9pWˡFhɥHS@G6u%FWI,6F7%Y';|Y0 f'c=wY17'QrbL H]fJUAGQfl ^s0Q]\ۍs gӫXb^ j\oqUQ}樵1azPtb b/$BNxdEo.`2!%kp ;[ 54z[xPSVQUu!Ba΢dǮ]=}z-*UX(i*؄#A,y7AlBGfڲH6I$PurY㊛dk*>ΟYT~_}M?O&dxk`Ȏ>Jx\[.Z^O˲AX&xv9%Ry[k^k%$h"%ͥB!3x(Y1*לKۉ/+Aаp{MtX2y>.xU`Q8դm LM22M0V)kP=Im mĘa)pTi.G.綟8,U?u-T5lM`Sw {A \H*TM2E+9u*#@@v&0EN X O} .*vka᧻ѕk?_cę]Ũҩ8NiQ֎IDRҠT"F#s-"SG._X+m-3bt\/w]cf>b~۞4R_/Wpyݓx2媒.E)]cOu"-iw 2QU>r+, 4g0 $(vcT1A@3 |BPJ'A6{E9EnQjoM*mn:viMa[vĪ]'ASѠ(SBtM6pT 87xRtTJ+Y坏H|jW@BM(QZt?H}s#-A8Z6yRc7oU 2yfo_+ :`uT\ľç-^](Td XDoH,Y;Iu:ȼKY(5x) Nr4BW빶-G zv]g󻹝ȬGL:1ig[?1hQHf:K3팣4[(>b/ ׋G{Ƨ󁁙ahh<φ߆Ǫ|X}X 3wf5|ʡlnn=@l/

^^ܐUձzAŔN/4Wdm03*1H1(ƬaSlFWم}>)DžHc~*Z~CFOt f*$lK2R ^&-mQR(%gD2F>4VMJF%ζK-qJ LT& GmHm\bk]m(YQkAi#i635Qc>ҐO4Tݡ@.4eL!Ed$ >äў>\yppfWGT@A kF&Z`)6Bb+L0ԃjAᠱ`h ala'c7/VM'$c]X䪆HQBh%W땄vChғ+.U2XKCO8Bf%^vE8"E"h$5z#gSbmTS'6M(?^o_N~}=o&_27⟮GYIaE_Ѡ.ꍍJT/װ.MY*PX0uÅS1&9L6m>~&Q5xH5bbaM-rZPUѢ{M*/AƗ9$"fI1;p+,B<r` tg#?Eldq͗3tTN{Bm{ڏ`r~jrjWIt^QID#! 9!XʑU8QJRMp!kyd*ŽSEs(ݟY/s62ڳ\We=bY "))^R*w*X  9bqc'`o@.d 4aBI'$o,?Pxꋊ Eeg&SHƣ%_e'd䕫;l(g7H='PzFYw_eÏWG%GlgƵPH/@xX:wΩa #;U#AXjQ SK,g:SK:{m̓=NPI$`0SiwƩQU){4$#U$PmuX̗ Bh"Hv.0"aĩR:5"/J{ ۼ2zbښ6~UKyg};vqϓj2"g $AQ"eW*{zz߾ϻ_*1w#do {tu`$鴒V:[yݣH_"G- 숊wm &xp10~m'+iI8RkA='Ly,aBx<[0 pډeY!%AwKoӕN{Hc P(q t.y'rg$Uymzπ֌2Bv8-Qxަ~\i(a!evJd6bOS1|*6l;|jyo45GRoy(l)I}ԩ%ED&Dzeh=BQ0V\i!JrV!OpY5 C?tKR|N*P!ĘXo`Uf 681J@mݩ2m5t"UU}'Lfr({^yQois= FĀ~Չ9S@%31b[#ܘ@VXbAs+ l<釆cV&w! ?Q2k<{/wvHe)V !5ԆlﱵB_}D[ t05U\ìMr3pBZ{n\0 dp17DDQ:ca'P{jylViy 6'8mO_0P;ZMkIGo)\g:#mBp@23h {*́E>Ƅu[F7Qy6q䣺XRezwFv2X~hvMۧ*M>.n:~١r[/*Ys5oo{'mL2CK{?P${/Oͧj6ߠKO$3MLEPal*}[7Xd Vy䓺VoBLI{G*ƹn.HShG.+s\`&J& 3X9@L[ b9+w&~+)>0m+:}͑GŸT?fQVKG J_.!Dtr>VD>bk3 @apheB7 `I ZH$@'DvP-m]p2ƹA?T]6p`fB{tLSA%p%.Q=vQI_Կc~#{ Hm#%.B| ZbM]a +9 Ԍj39Pq77WmG7&2#ikZë?]Z`Y8:'ڿC>ޖ&[ jԑւT)Qw@A.@ Sl *#9f X ϴٚ rU|·ASԶ!cFg1UAI1aKEpnª_TW"sy)l 9 ۴w>N'f6 `zuqQ.MFgSzBN5]g#v8!0ﬧm6~=ٚМklhf˙iwNIԯYunI&J-)rf P{2Ybkݬ+l*:!pKZl}-̓ bOʴslS+368e=k%F;UiuDgKӍmu}$̓/ÝZ;ԍ7Kb2j\7[O PAlNM:}ĤhP8rm@A +5YEBBcU&+IYO&xWX )=~L32]WTTw2V +*)2xYީ +Pg}7BxZJA8ASY \wFQjkEUZF .\~o[Tpd\:PP I**>_cg  2lyAנ(Ǹ yd%V#Ev~VY@|qKlef)5O9ܷ5ɑ FeCy V6|GA~Ę7%fNVOrĠ`p IS!D&ڬXcCxaTZ PJ% Pf( ;Ra-IE&-qV^P˛???TJGH(,xm'F/÷^jD"F"`)FH P?V;rnowU;30 Iv*[KznTI‰V9a"ɘKp֬RO2("* Ĥ!ÿ9@8;?i)Iv*)yfSpT p$<]=D!T<[ WdPHXA $eۂ'jҷ=,kגëvP=%~{9@ l 8g^n C1-zK*ԁi2@iF#yzC[$KWw ))t_>L)E6dO.<[r&MZOβׯ jVk)c13{؁h䨯j&YI[\ sKo#Uav HZgLʡ&38t"iF]nM=+e N2˰Z1F\}]EiZ%2 E=0Gʞ<&c)s,7Z^|z]s){4lEɬɽ&aF>ʞ÷lʐ@gG‘3V݌19 c=$U C][n6l%M!I*ܲWI1=;Li[;43ij 堀u2!#)o e0n LvyR PǚJ8'p5/WHW&KΆdwE= wdJ"JդWq2܄E{? 0Ic\ 2d#:^ )&B 2&`%8x`)%Ukmo~tJ&R1ɥbLƀt鑏WLq>5 -"rx!3(J $8;MJ7 zf1[+SK-=A,\(^y|P#]l_"&xu6VZ$k\hk0d 6QҤPr yPۥV)&!TG#D3oCE<bm,[Q;%]d۸2A:SMAZ?A$!~5=⏴fQWa_p|p7.IFfą D# J"ZjT_C!$C)J(^HuDHhd8T)OI8P_a #t$llϙ.*吅&sl4V U&cSB(t[rLn}v(d60ҽGbs^G} Tqh~٤\z-5'?cR&ۑ*3G`^ )AH4r 8c7\ܙNq\{ L-\ߪw~U,# <$ՠRu߉1{{gSPR7]ͰV uBKIsmt(#@ 2/EzA%^9ô^mQk+&j?{㸑+_'@8&ԵGiO)RfazYEH{b|7*i]^i~]{xޮ#䤳/xr&ƙ+mV<>lKs ?*R8{Vg퉵l.޸ՙ٭l*PsOVD]C !%mVJ sh @{)`z]./ڴm68_ر}Oe#vMGʫly).emֵm345o3i8WxnE{E׋L \`&;? " DHI!: Ʊؙ {L[+^C6N'Cs|, Wb0~y/]N/n йNRޔ鎸Q_Uu '"w.,嬐I>#[r ȡ=V8k/9$SP(yB3)%ԆY RxpeBqJ3>@ @7ᄡ7 f{_3CPR31v\vg5Ip(jWxp+܄L*9l j,d!@$k.|^vO*dP:us Xh J I$J ͳR\xkH '0g$>RP\ 8 PV@*5\S:"y's3 1тB&Bs=Dy IZ#uBI,#Jtɖq۝>͔XvS? LWX3!LA Z&l6=Yb?i Ovh%]olxO>qOvr.Yڼ} Uzc%_'yK~v[@K|]>Kq,w QKEVG|tYM"f] `<,.0zFA쓝h$D lJᚙL5U"]M\E%۾0mf_8BA.:OX@ %!֔{cbIA(T 3EBuqq+xmw /1%/5/j8tf/v/=1m&zR3=󹼯Y$.VnVle-*'^F (w.Dֽu^3/|` '!o94v;Ůk _ qxt,ǧ?n^z\rGzE(4P&0dP{^V8 ?F1 h3`\DB >/F:wXA H^_z&H0zMVs|N ͦe,6y /k^0V` ĚO?_~?]GUi27k<\"A2$YuGfBhDTpvS!<Ώ{ۣWjJ:*.ٺ džWBkuOB S P[=mUR)4RznZ\:%JR$8b@M$CK)tuAC-_C;-` @RwOr&Ji۷xf) +q}р_)F_k0N(`]X1 7+z-h8n<ZȢ*ކgKp>X ꊎǹ.U #eյ5b "ՕdüėEV#N\`aJ: Bv{X@ar^)7JDB -h4EoPaZ`Ab5E>ܜ8LR ptc~~=86=tg` &@ԛჿbW45bqV#Y0e}ԡG] R8alil E3o<|DzO+L쐒43.c2R`j헻ŦS읔)[ޖq7v:ȱ [fzEDrck2+tw7겋CC%Di,xKUzU`’fT1Ӟrd$V0~MN&R)f ތS3EbZ.2EF)πQ"#q΍TXLbD +CL1#BQ ~QuXXE=nid.R@z9W"pA3G7k /t<,Rg47WtbG{-"4f  E*NruDlWxВC׏XnpR*xFd삪f CuXBix@z^s/1$$m $M nVW-mۡpwG u%^jU0u3`#2}Zo Y{G~ ;H|(VZt pAC8&(:2%v1oB;R5GY\5k/I<mtWgk3rg>?#gHo^Z˰Yk%)FX9.C!"ŸH!gZ{lW4q[emi]߼f+7toFc^xѸf}/ݸK0` -^z/莽-kӨxKB0bQi~hI% @zy sNǐ\nSƷN :bLMp.nx0#$f`]`hC(O1kaFc@zF6?G谏Y2w;9a.T Q!a_`5 5&^I-13c`* a1לh*&&1L"JJ{*'iLWIOGWgUEZCy:Rj %SB/D|RzW\oД-a}ke|Zд7ⷻL^-)SI<2 Rq^L#gEA | #X(gs3'ꩴBkM**z#-9.Sob 4@ [,~<75뭄;Q e\ )u(0G]b a ! %+({X-y&S`{8HHA( -sɇ7U<,SDPIY?E5 ^kd^y- D;rA'օ_;q?o?~9?/$18?oMǟ1oñSX7 18ckW`nxvG81`aNDq̉$5`:0WvKd};!8<|6jFLɵg<؜yr׌➐3h'q4bpjifqI9^h@XBJ fU[r׉޲K=h'ғzqoFҍ˸ҭ-O%GO\7.NKx?Z.}w{У S$&z4U4n@v8P@)`3b M\x&Rr'/ى=gDz\W_⒧y$[߮.KIBǘUq)wem[ݿ]r^'p3ƼJ%~쭺%(ذYEVWw;MXurLb"B\34w1C;b,=0zF:Ʃ`x}^;uާ`! j wɭL fc TL\{ czn^280qМD=y1v~疼چNd܂=kWrUS @8k>_8clS]jFU*.K0\G* 56X2R~Xx1;N "=RMy֩F1MmϴI =+JGĭR\ 0A+Hc @@/- Ifd+lHg/7IJ }]yoP?. vFXV fCL/0PrļXhL8DH_Nz/vIo \/wXG2z_ 6n+wܳ[VOnWnaQ}+ܫ33G=n}jg\dIO`=K{p>3ۅ0l_g۩d(+n٭6&ր[ ֠m8o::ZYq¨v+l^<&oGg1 Ww|93^ Hߝ͹J 2Tᑷ,;~kT۸3Zͷa ArI*& /4bV3{.#s<]sF@Ҵj33yʷj*cn3+kchJֳ3=-/QfEfxȟgvk<S_-6me]EA$}XBk_jgnnL6.La?ƽzlMk I6c.Q;5שsN;4z^!*i.HB'X9,; ll 6JlV6S0pR2 .P `Ov*6H@25i6\i41I EZ5ިaF." HC PÃ`Ƀ{^yNwuwSe75uFAgrFZRmچkOS5֞Ҭte[E&1Q =Xk(Z5U[WًAb92<,\  aCy tp0vi4d“`J ]T)GMJW u^_.ZƵUW/)jX0x\Ku2+ xp0S#%!{! z[' I_R-VBl}[6̾J?C)Tg4"9ߊgBa2X?^w3SKxVd6 XEӂ{1H\%$Єb!Hf۞ϯREA2$PaqTA%R?ٰ5&~|?;ֳynb9=Xi }_yF5:tF)kh~S_0'eq=+P03p9Eu2%^AA;ל鼒S0FYB$iwX7"#!Eg ͖zev `, b'K-jYPy0rdVy"Az Ht)uRJ&d쟅W_ϯgTNJ| oSF;uݩ+;[MwS:2fAI &2֪Yw+Hl wμݭ&[;09@ݗu+nߔ7+e54, (zv˜~H9o-u90e278m^C  Ϲk]HPXR9€* 2Xm;| *ęt@V uJN9 rlyI_\F߬ ͉۬^*>Yb&±#!Fj=iKFL;hB|sNb XFjBLInT p4ׅ+rWY À1P#@SG\AyӫnχU;ެv+Bb[55Mjݖmi;$2isW]Qd kxY܁j]iFlFEDK)O} nHPYH|w{+(+Ƨ^8d$u@ќ6r")2yQPn)lTbuÔ &B2T`7njVP!Q hQ8,徎tJ?DGtx!ݦi\`BL (z+ݢm8Uz!(WVBS@g{ЖkA?U9rzn1F7z]^otj ފ8s?Wy){9GTVbD|K2FXJ-Wy(W50wgvvP}xs2f`cgnOT&+dѥj#XĻ~ç3xF# p8{ l{U{}Sc ^ϡ6U0iLii0uFܭօAS!R,S/xP9k!h+n"(0 J'Ō5TXݸ9H#ao'W\EEyÚg5 -^miP|@*&LAYe4[ { T*0ϽqPD NmɸmCܞO ))(n @L cK3Ro8--Tk*BM&;',$q^SUڹՋW?ƚOJO\,O@c QojX-)KRL)ȬVa-4$2c$1 CJ+GQ삦[!Fȫ;agTk'l 41z_rA! |lN.i¦t;NHb5#Rlj y, 0 qX2s>1i[o7/juZm80eIԂbN R4Lj`icGLD 6.SKB༢q%Q.0Dje.؃qjhDV2$JUNJT&uDQNONtLt TtDHKryYMI"O%h :y1P l gH,aF (dbIt Ek^I6R.j{}P[)M;nD !\يUQRH:.8:&\b8+U} jl$([jS0)'q@~o>O =pX7Qa@n5 8gAY~KύSҷ7Uy^'pEɵ2ܩN_-mz5Gd|WQa١070@|"W+xbV4"ÑJHF!@d$fi k[E$`媸@#oTh.\=WZޔؗ%4ecвY֛UHP2 \%wg)*TIT j&E?EP G:fkۇUQ)ȪQ#ʘ+a?426)nfZn%DH`4!W?ˮ/"`وbZlT[_:,rS2Hun]^2ʋ6T\rrc&@8Ű%e/Q`rT 8 8 #Z!cy0OYνE0FIkH`rCxqt͏ï>߽>{$O?LW?5$ ᱍwwOmugdd:bK PDbbR1!+0qN u܈qi˜mw޾=epk`98 ̂+S|۝5gu~gʖܸ1ؗF-B15X%&Z~U,P'3O޼'}iw&1F%nc8-[ŸF%!^ 09@,S1-.OrdL^"C iG״D'nmwC!ӏ=hOW6zK{e p;Ru#2C!Džv#R\h5E R91@S-Fj)\>mIIS T!!n?ʈ4~2yWG#/n!6IW'\Ż׻! FZ! $W#G2#A\3!wN-yl5r_t][~WHT&!SGja^%"8㓀GNJuDg+f^0$I BZM.*1 ӍsӇ繥oXJX&)c# !!L R"#ziÒz1Xk7wI:k)S\8 P^PvPsXnڭbVMWDnJ窕b`7p58YV;m0zY)FZ>Ԩ 7i VH#IOe&%IS9k~5zl0 FF:hhnwn; Nw؁`myaw&f޾SgX-H7c2} t`J7n+K'&ZsBV+* 5$xhcp''y'{N:^9!%"FbiZ&ŴC)r.VD z޹#fAV#/[kAՃw^xcp@Dß+, bC-0hg'K|dq$8e'S#Kq$qy4pmN64& 9 G{~*\~HE>5A#TU1`OGX{YV:0v5H/%Yb@L BTAi< Ihc(œPjh dE0.+U >S'y6 ՃO2CshY=aHXV2QǮNX%CǨa*BV)}zUZrv/q&m7jke[83He&k~cljnMQJFpȲ f1&_&6> + p"(QH_&㇕۝Ya71Zy VzY#+!~]/6ǼZ WG.TrLvZFQ@ ]?:CK5G3V4GE"&Asii읶+}+NBZlh ˋ>kw8 k 8uh [-@ymU 3ֈ])hH|u[ m]w<8Ddv @N`b9Q7梜"@z&0hepg̴J1{'1IZw7hN2_VLq:^T#iq[{KE$Xnlu1 qWG1nQ "9Aw pz9 >!?oyH~WpscluXȴX`sTr  ూc&aEa cOsZH;¨^<oxm( 'wMuʄVO4uTlAhTDٮ7;;7sh _wk/j>|w똏:5bPcW!;9ss'$Ij7@R4Mz>[zԺHu* [S[iMnϑ/#25þ(n Ý}+uH4>{fI/ ddd"η"6W3@ĺ1"!aa`|l*ecMcfe oR(lcq̅vX%a0;΄Te![A>=W]k^\bҭX.[6r'8>CDM^O\[?kɣ 6 #֬'c.$>1 <S?0I)h9|([w&2\tJd'/ùe)IY6!i pfIJ2g%e  5Z %9 ' QgZ"gHyq^E2|Y?5].s?m:}H.9]g)j^n6\pQQB%me>z hs!?aq [Ϳ/v+hZ-3˃b-]yydq|y=]bI( J/LJZ>l\wj.ܧM-)fr1KǴtȋ8.u)`=5Oj6sVfZ=7&8-RO.:5H/<!}PNdg/ L N%bwq[G,IFCōw!e"&gLQ l6 ]7-[NXʟTQl)g`ZFU4զnȳ2D_wY-#kl_M܊F;mW6"U5EPe^8T/0Ew/3)[}hY- I," 08һr\\9 ­(5NjSSf;FC{B]O ~p&/AիiЏH:jxXMXczC* ,$#㮻<2TzqCcFyG1ZQӗܴyd{CQΝ\5 .v^->¤Cv66,sȕyGPq|_dM ))K zsX ""`.FXO;kTb$uS{yhfM3`^mgECu//],~gl8d.w"p=es\1H΂3i#E #4M¥ &B\ȫ|Y*zc!t33-GRQO!?(Wn_.R۬6WĈ.3^/яpW >>kŜ]/df*q-WX%zR85-6<1/ jk'8-c: JJ{MSz+ ,K BԽ}EL/* |!^"v#(|^}T0&c* w ˣ/ kg ǖ<7T7mGh}}lO|v+;tFKZ*cY`MZڧ#MSo/.|@ũv<Q P آNØ0(`<@+2zHt؟j`~edQwV ˕[D`zܴcKƿZ/ 5zWAmw#{|}u`1Q|o^8dV Zž 9@c g%M6s[op[ŕ[ R=e5Jؓ?Y{0\ (e5IhqFAM' = ^C&Ƿw~ӛI_d{$V ;d'eL TB*.Mv1[!4GI-`GysCĪG=X°[z<5C8bc35+8 8͑J %P1pR(6'!9mHؼ}ş 7In ޕ5m;w =f_>vfSpǛ 1VEhG=OHiFQ92@lkt7ݒKJ5P@èǛ p (XU{U➌J[;Oyq h.z <V8ӻTCq N<=;ڜ@W1W| c[jaĞ' QP M`j$ŀC.HaSN9%+Q5Ro>:BYT.„# IP ~ "EB~/MezH&&P9ko i ՀJF!##,~nѹrmJu~ߡfE2Hk"޷HPt}ݚ..xCUs$ f EvIe]+n5@h˨E$K2P ]lM_㗏{_dk4>##gw}*?O-=dVsKl#:dU[ 5Œs0lmfU&^@\2ل`R:d0ԈP$)GY(jUf^z j}˸Uø;[ ~T٧ߛ8a}u5@5pҽHr\0egb!HKKAkLrllhȹAk P>?#9\Z @~[նzqVJ`NYQ,AZ`H|5$[ kz6%AO(Tq%YK%!(ěj'VP3d .{ ^cqzQUjx6n࿉hn7 $AMA7ӻn6j<4ZCO`vC,1.WgaS-A\v ծZ4X8譑 h62-ذkuCY^&[~s?sX:XH@DP8xN|f(r C! NCdގ+ž-eW[h]#Z^ M gy/=@I]nx67%%K>5U]3[X.#TJc@!j!m)/\]fn^۩ϔf{64w`{ΰdµۥݥb\ivhs9 ̓z sfZ`]W7Wv yUu"1 .7]>IVUђ,!u|,|ZMvaܡ,ϓ3BJTK FO(R] +HVPC@H9H*@ :LV"|37́Ť.?뇝2۫'^Ro?A)!A y)&SlMi^%:ݠ}Y:V˶JƠoy,vlRJmRj" ڋ˴}ͷ~Ivw*t˩KʴIۤt}^g}Tg/xpWi2E+j9$B2) 3l:匹]j>|v i{>|%mI\SYΚ7lxM7_Snu}M L.Z!7Uk5TqD!6cou#M6He@F q̔ [TL;k% |ANzjΧsz'w(-JrHay(!! `\<7W 0$'k J3 ҙ 0XW#q y>Y"cUT/X?ZS@e Y[vĉ_?\0J;[ՐBRqIE<[K'c4 vZ)fRmk,qdqa zeh'<)} 'DXaޝ3CMHpP9hԊ}:B_OSuZ.5P9f@LjHbHA&KFjݑ4R21(ǨTcQHPeI>'LBO˴hMOƘb~Hv;Z:6=yahN}+ u[DI Q86B9.Lb &ln[W8 G9 ӞC%'^z4.}AK'EѼF ³ V`k/"Ev=U:kVelu3[OL[yan,dYౙ} ޤ$BKsS\#:KwmѓVWΙ"O&P# Ł0kÔqx|(M?Qv2׿֟;7 7>C`Dn=:+y{ i"Hd%t#.&H±G[tkY(Qm ~@J& S 9/".mYJvpyq!4C>`JH鲥_|1q童K1D5[~VF~iΕu9zuCpXpRg_U!="SMrUвbgUdMͻ}ͤ^`+tcyjϓ}Cuc ;_/E&{R'hd(\`aՖR8VHT"R;f95kn/X{K %D^}ٯ?Yݖ8!Ż/p\|koRbJK H9*`k)) "s(=#f^G߰KU`{ ^Y#lpf2iRh(plfMH[qPpP[ yX S!{mANG{)ژלh߫gumV:L 'ŧ!4ogBaش9Xs#k $.fU֒C vKd'Mm™"Po%H>(<_ c4^t"0B ՞ !%-/Л]Q h0$"P!M1RKOfܠ(xt35N1Nb8J-EJ|*~Twu=߾my(oeyyAEG7hSrh*&QR5]eLZR⪎FHF'<nW 2p I =D;TP`c;%k:ԅjg?tɑB|W5o&Mt:Ӊc?E"v ;UrKV*<:u/6{EU2^iQudaܫW&n5)ImDZ@b(j9t{W5oPX ՠ] P:D(,bbwaxaŠte#k: ݚ&M‘[t#L!Z4SK RM혁߮鰽+{tveIYaEMg0OH=+i:ٮ7+젺B!UW )Bbù !0imT0Cjnu S@0K3{+_7Ji.);BJ4J%rw%m$_㻔:zsx@Oc杌\e(RCR^׿ZX[J% XZ2*X2"#:>\AE\XQTdjKIJ 3&nIs!B((Q(hQNQ[|jI~w7W3|wc_7U'X﫻M wc@0 SP|)U!TA)c qd,[Ŝ&U6\F58C/E/-}H4E9il`T$CSnķ(ITm}0R06R9€)9Nl4t[+6 4>&;FK8,$+l/JoKw`aT/hP!蓚0*?팔uS`Lr0%:Z1 奐pq$zAdSxύZq)kY+ <8p,`[[t?S%EF`!? }y|H}gކxr\}YhtH =nOf7`a1mGv@4:g%|S46~m[s;vmc(r !?S+mr[ЙNN\B0"X3s2  6X̓<8JtԲmsiH8]g^2y˪'x|}zeEQojjVJ+fT2D8jUDVaC=eX$FV?#eeG^WzTt}m>j*&%Bf51vYm ^ KGnT|0.$&X9E"kɴ7;+%L&n:w&%jބղմȺyFuZS4ۻ(h VWz8h|?vVzZELJWXkGX]_Esvʊ3$o,oWy(%{οޛeiGSˊ˄C'}-+ qE%:iytOޙ''\lwt͈}(KUjZմZ>%2T}diPx4%]}_ֽO(O(/DGƞMF^SoZ@^фM)FgىaJ6`}*Ɯ'3ANZAB""H@5)a͟Q臯$:3i&_ l%Ӹr,I;2`2Dk꣔2F;s)rl!B2SjoFo?g0E0Dr񭃌!Jޫ(.(:! R5a,V*(q@F;&SwD;o]nxr?;wacOlї3FlߑۇnʏtԻ:'CYfu f̩,~g#zi-z+c$ 'N#;j`sOj~rݐUwwg|̌Сߗ8$=xŘ\MT1͊&<DG9A W*l?|콷Wsx'Rn8H>*MЙ7"U;HT\xN^26"̢_8yIm3Ϯ7cMLcDR}RQbi$y.LOi.G=%<'caCejJį%E(u%griD%/!"QcQ"tp;F-'{$FF&AEAOدBJTYGȿ7>JĘ}pzђ:%(#3So@do[6*FXHr1܅Cbw >[k6eE~}k>AN񫡔D!HNEe !9yA۠R'LQf<|M?z{[Wό>(9fd]79Kw(qo|PCL4Ckp={r++Җke 8~qERy`[~[N` 5B@fۡ0XK=RMLMϸw@mPpiaI5 "x!\p;D%WGLlvN>ml/n 6#a>jz̜+B(5PI AI˹R_hv.?{o،]fา1/&i\U>^0!&#A =щ ۑ)10ŭfIl~)ҝE䤋^]mܴAPNɻt@ m.UCTPKS $Xf*&PR)5xRsbJmTMaoZo _C͋vʦ iYǴ ipͨs C2.$Ս~T΃,5c1ؔ["u4G *:&Rf?ț3Ɨo|GVJS9S]eyȝBi%0!ϽD뜒R8|[)L;u;ܓpp[zD:SOϥ n;-ly+푿|OdĨOpe&}MS;:'ݨxrx(kJ |( _/3;󀴡Bz$|p1 +R*}r8S{4 `R_"Y=בC"e,KZrq#;ḋ$]m#o< Xh2L 5HZMMBAx1.ńU$8B^9 MaE\)^wVqqTwp\ zmWb?39Qꏪ)> _A@ w( )GFz*Lu/78!gm}"~M5SsiqCx mb1:}*ױmvxhl:oYvp5ފQN+\Xo7pt/n=alu}Ƈ : ܢCl.^Dˋ%N״f, yNh*ᠨS1R4"gH.;l6 ʊ*ܑPk%V+z#՝jeOW %@tPt̖P^#T:qtb/wBYFƃ~cО Bt"! w)b"`x p&I/e8cl+ z7Y5CDuM.tnh]՜qf (29'W#jx6l,bL}E@Q \`a|{9K ȝ,rk?~wq\3[ HM,%7:9Cd:R$i8fC!MXN=ÿ?0b[ZysP| $X$*f vk!`)_kJ9޹\W9a zA?y'>tu@#SV`Z6>=WhcFjc,NZ '@aG):z*R!l>IWSq#s JD@Db X `tX2TUd/zQ*R*ς@r|1h@pguzRwBPwyz.h`8r0Z"iZT80^Hk Nok1C/Mճd/X׋ݛj: 54j.1q<cFj7hEKa&"L3Aju ,O0xͺ,9B !DE+1AO36-m?Gi}  %O"O*ПA'Q<`׎=h=1Թ:wpV,WDNU*59!-cj`z/d3:RE/p='b(L>g&;' ;2w//? 7 >L(o^7_y֥Ȑv3Tg#T(Sy쀂CؘW›]F4H K J:-9aD'݈:xpZD,4 LjK1Fo۔ݝvMp{x-)շ`5581KYch!~N-eўkdRd)Arj(E42FǡYíRB޹F8Exy鍌øK1:P8{- J 4u:J46xOAѡ/ۀQey;-d~flxTY"R][s6~ǙqdMRINyR7̘ݤl_dwRdlU"l9XFuV| z4˫e?|0p icߓL cp+feֆ24vD#Oqk`ٙ`DKB2tvo8"c 0 (äIȇTg{7? k_k4<8&G'}`_nֹq@XOa z~ #0p O{hora‘S8, X%RrNҍi/&ʰIDI`4Z(^I$ gO6T➒ O6Rznhs8Bcn.f-va6I\pDO6|{5܉掳(P=1Z EmfT տ)N!Ykg1Q o0ϲb=0'R$A*GsLɹb|"u< ىC3jTz@;@(!(".zp"QJm[@o_>Jٷ]5?i o0ҨƿDhܾȽQLEvkFʍ65cI'OY4/u2+=ԞZQMet t eW- Ukڿb4 BmȝsӾT uo^-"!xIN6UJ 41p$X A@{(c 3;PݓSKo}W1#v  f ?tuɱ ?ՃrDqBPO; /*@kǏT9FeB)^ʫg+ȡLҀ1}onwbimtȰ8qnQ-n7JF1Xky-$٫DJOc:_~υHLn `A8ewv~~\߫{[ަ //\&c,nSZOݤA̪)o"HS\Lǟn*݌@m<$Q362$fbX 6 Prd[+uX1laGJޫ)ޑN@{[2 T1ƿo|1PBz6B>S=wS+fNjyR@xN]{yk\ׄi%5B9hRju^o<3dpOQiu4]%(y)Г?B;Ik )aH0bܫWi9@e!9&x29(U|_ _s0Y*#xS/!Z?Nt%J dvBJP@P ï~}ќي͜Kπ %bwQjo~ 0ۻݳwo^ٽ E#^ vs`IzOƪ@!!Ohm".%H'Le= j.[HP7T=*?'Yퟰ=k)f_eM0,gQb1q1s?G@?z9FH&R\OVRBd8P wg5B:w;UnN?x|(t== vܼ!8<{Ps2 9[P fb!EaD,&Bz3@́׏=Fg,Q/{/GfEioူcp~A^`o≗O._[M* u'H*({ R._W{iCN?pFnLs6o=A[qgFfz6Wx{q`qΞSۛ= ?^Fk˦"lYWiڣө ;~n_}1{B^;~1PPb.X$s OHʰP0u`_hnp0D -f?iS =81yb&00,zY\@2@BZe;A+%Ov [/+kt89|X~p"|(Oo鮹=2<j8?%DTyf0C>״tvcGepu2^Ӝk9ƞ *4Ւk*i 8"J IWm\bi)0VAh 3<&\U1[7AU@831Z:m d 7$[$ <zZ8R^ۖU*p{MݔMR&"2r AȽnJEx['n>Xd2?~:q?sTeg%d 26y ,@,gw@D,6+m ֨mxpL& p @`I)~xpx3qƏ&2 v59F&ph~/o]ŐwŞ1PS[ YAXWwY"Z^oo5Kwz{W{@%_J;:Yj?XP'9S;t%c,[-@ >Hp&F@ÐD@hPi@)<β!E}TeKd#tn{ժ ;/l%ONB\LKS흇T}aZrTл)8ڹ韓JךOo,~T֣Q7THSÓt!pbJmETapH }̄H%#CI-si')QٔUh6i8d=A԰vT6ZsZKb\(dYP$JP|LE2X6!>KIVȬC (LRNKX܈̕JY vD(IzEji猢jB֜H;CQ% #gH'WO&Ƚ3}7 ;/y=xYƜq`B!p“K8qmJ$g. RcƀY '락7rY2[Җnc{2Sur=M[QXF-Agw!kzwd~7ioLmZi'FdI5Wv^oe{[eyAH5SF Ux2lE3yC):6MMM}Q*WZ֘u^oA~R(4BmGPjؔ?f|y9lIըi37 V娖,U\m6‡)(gbѫ+ߧwMh/Zag[,o~y?uh˝ m9FZ}o{o=l_W^W^<֐kòԶb;juoZ]Kυƥ+,l^={lnU/kjk \v<%lSͬsr̫  ĉ=4qcs;S!tcj C\0gA,'Dbzq]_Z]ÆA3_]uB *>7E#^zG6nOQsg:O ō"bÌ˅M(/rb!B5|Nm9F"H cd"ZA(&A+DIF<_ |jljKX)刷^K% zP;XZegUyg2C +PSn,2<$%r I+3015K]VEAѪ}{`2blfajp[a#S_fņs@u_m>t.ۗDbQ/ǤʛWan`,Kbܨ34` UY e TR2 Bv">_E@"MUCmTcp {Rh(QaU]㞣z28 ,={YtJŸktU]h>E"3$Jyoj>h*Щa:?R@BvZ$U/di9O%U5p Z ̀r !ZڤξCc|}{t?wsXi,|Y~\s๨Ca1=81Y<3L\z'+MHt~@WX2z?Ǫ}~Y#:(,BH&M 2Ggpu{E?_~&EĞʆMqw?--(t+̀7yW]ͫR*Ͳ`ͅKK8 +,! NF]yω4N-:4S4&ѾZ"^_i48@Wmp^W"Vl-k ۑOO96j'^G#А> v[EU $ADNAl4 `E!2H$?wqp|Uhj3q<&س/# N {퇄jo1ִhn-/vecٴuBu4ITc2`Ƹ o×{ݾ84y[r{٘4ӎ Lϧ֖H9;s@2sX$9͵t=pRN-DU^Tsէ|sY''n.jlܳU!G3mSNG[J 3on_}MZDg*‘ (;Bkx9c|vc-zCzO^2s};r5JUJͥ=En 6-NfV/l[uk^]eY@[E>_tZWCghUޙFwM}cf#]`L!:0@b0\2>1'*7}KC)*aHSkT'zW>)3-oZ@Q14*˴va1RRO>aH=t6rg}cɿ[(uUUvɳ^=Iv3^ym/Q\..<mK3Ϩ#- M+若*_6tLWyY/m*(@W=\zjh7]僭T\o'mHݿȶ\1kIv3NMS5~>-EZ,$ͪ>3 yfۿ3Tr菵dbCͫK# eyYF8(+@%\#Ԍ;5s0CIh~WoTwAW>pX $'@l=)ӺSy 63&H! TX.rH9(X)GzʫW>r4>zDW? ڳ.V:ˋ}]u :&Of=cq))D3D$ T70 '5kJœ@"=_W=elĵi DY,Iz~ov/ٌ0JE0e w#m5\Z2z]Cw( Jp[XBg(ZnW37P+X`{V8Gq-͓l1}j L Ui5Zwj]LT(" 1|r}G78j5:)^ IaPFr:^d2'-/ʭṊJӰT`1TkS4 jY@4jq"xo?q ;(xLH5@,glo%<Hji[?|UUyUܪfIvU}ZU}3թ*5*)8N2q]J G 0XIcf "g002<)5$qF, 7a]t&`nOfL,X7/"\J(t\CjA-3iP U΄%^ҞV4ēEuK:_!S| )nGWjAI Y%rgm>;?|;LzZ g4\捰f Pb>K2mHslL]T2i!wRCz^v"h:tKixD|0׿/A ~jMGuSMDSΞ+W:ww=垍UO27:7w| RW4[W[gwFхbnnrź5C.5|&}xޗEj,|B쾌~?ܱ놭:鰶&4nϵkS>љwNsepm07Bݵh$\N|^wv7/ۿS6aQsDgH;21)'Pλ꤬y @n&ß {j]CS(IgB8kcl09`fQ։b-15;n 5bB%>ؚ~f߯ }gvpGt!I0k; 1w.nSZ~䫔# V(P; iQzrr~:߶~%[qL"9]uû_J8=1zTi {kC-,1b=NZ2a 0.9o[:a$yKYR"@%j9s"+ޮ@)F}:!Z%!d SQB%PHNgO03}n]sBOH ZH~LG$!G4q1$6kbI2 ~){INKBqVK #= ,KbכYeS<65;Ee!C%Y (I1tnQx-S3N&HI͝s@gauh۩: 1Hm-n}x@60겉fZ^JE8M#9 -JIL @`]ܬǘ>"  8nB*u_Zn4O~8p,Ԕq6 hA'*NGKh1I֒YcGP91Ap(qz#V!y锥DMڦq6&2 Wj^%>&XAwcpj@gf9uG+p@3.iBgt eVØT|0' .9AYSn47q" 6ks.$:ZϨMCHaUF&I>1C[N%UbvXzLQ15)G0b8B:@<\-}h$GH i7K00NAϵw= d4muR/`l/@MyA~  ċ@ tk#}Fz9 Yߐ|(dS3&MZ^9 @6+ 1jY`vpq2f~K(gAMƭ&`S|4^Ԝ*KG` s℅x=ʙjCܤ4]ޑ.*:%;B<\V!Cw4n .`m`I521 ;FjN*;0 xQjpb3[hts!A{HGg%:_B?~(NRKB1!_LL1=<.RRkȴ$r vP~{tH}XeߴMs'glTqQfMD g`&5N> PǵĈ AScp&R:rߨ5D2rq*=oVն;]yoWwۏgGW=Iٸ!IY^ezcI%=.Oْ$ÜI&irQ F> R9R`(i/9?aG|$/XN,RJ`2JaDA!9$tDnK+$HS2|HyO<I6E Ip?}3DB Y RdУ>7>#—[pױo5 c9Txh*c\V'4S7VV`[.~2dݲ_@DM ^l*\opTY ~y2lE '*\AF1G#O}N)wm=JW;a2vKKlrlzm,s$1vP!HgemhZ>*(qD+%4`"L/h;~cYb9|0mL*z~#c(ʘxF!$3)D8{`FwX`&Hn^X_[~ѽL`&`-OĶ w~2USxA#=.;aMsU?SePfS]oL-=DkRW V]}oһՉ)lO)ጁ̗< ;屾zHE.ǞT g7,vyefP\W=IA *#n9/)5)OWZ;w\oeBETr!u)rh3> ƴWraNeP3d#6c.= /*u(%T:&0W*[q`ICbz˫zf\"9m-jxz'&'G}k)14.$ɕf%Kg.j]* K'3@򏢨BI@5̯wߡ64#B(1uig:~6m5t_Y,fUWQbD#7N` dxSTbg$}&vhSh^c1oan $cBbNJ󏾟Ľ0vͥ[Y߭ 'T.\5;l-\_~}5ZE_wuWpwyJ*ڭsV;ܬ~iCDl^.0U$:'QP8`Fy"l$F5'5 njq~f q#IWqP}a9;SE<*$q Ԕ;2*K nmPdXPAx*dʝb+%F+'VR/T *)9>ڢAm FNLA*HX-C^ }uN7hs/X1D~Zkl lc-D#zX᳧^,{>$)2,fL>Zo X` +K"} B4BQn\DR̨ٻE3-EaLM+T,AL^ԉEz3N/~(ggOlUIUSGI8᜸bh׫YԵK[;oG3_)$9kP||j)Ȍ1 N<0 P {Җ,Ƃ3f#amD!O|Zg>|Z(DYp*UUL[ܿ-vc֓wup,o&Ed ዟ_`;t*b #kE]Rӹc拥IἌaxdcup  5T5_/ 6򿯫6oƸY)^F~_2{?^ٰ_̦NDڝ~SjbtYkjޚ'G?aanG$3HiɨPgJfXqưۯcMkQ"EyӬE[|gHs=_O8s ɰD܍"&?KDSe\9QVr12r'.śEH^x-nyKYȻ/q h}s`p"( Ggߗ`fAh`X  x4xhHEV )[%d)Vi}.YǗoo`sɽmeb ?7?W܃r9_&JGg{IrQJl{Nfv8~4a0 CBT{ҮZ!Y)A Qi'5J(ʅӂZEE8NΥ<>BCԆ -CP˜.@'`"%u T`,.;HtLAn\ÈtXd@2v >oWmmȉ J .)LYoiB|}46P|EFlڮYMÀJqȵshipC5B*LR˚c8 ZwJbm8RX0'(Ae#t, \FnRf;\$F@LQ4'H ?ppeؼxje<ئDhoJˣ+X\DOG&GnRK[QC@Dx-B:J \f4<Ⱥ\uB]-zZlJ.S_ΙĴ[RyM iEpFΙXeĬRX4% )y2UpL̸?#m^ Nӧ.'LӶW)MJ$rpކ{Y7@IAba:kŤCA 1$d Kr?ΞD+yh YNesےqKY\Q?vͿxCOjU;Q(_EzD4?2X ]\9$/*ZI9X~ ΄#6T C6qbG׽yh"ǭM{rlt&ar7^Q;3;tfkGP7UӈSmm&^:-:[`lZJb6Bui i>k@Fi 8eoq7>Hw¡eI*Đꡇ2fXc1MZ )\Qx~1eyxuRC!$,Wkig\ztiƾLhد#v ZCNuHrX!'CN⇜$9IԲ>(e4 ]tw٣S$#D+3<~>oK^mb5UA~%\/'K J 1P* s\l7&>1b ;CoP>dʩyKNiKavV.loW>LY^c G~LޮoכI_k7gxMHyD~:Cjsd_yW T0D&a\T W,H # 1;`":BϯESs,#8q,j+`ih rI !pG&U=4/@T 6x $9qL9+F^+7ú{T-9JA8ISM=Vtp#QB%n0ʵSwu~(]ڼڟɻUŵj'U_RżF'07gD8Jmk1^ϧ,ur> : n A`BH؀7/K؄3s;\R"EIY@d X{tc5G?i$QV[}Q+%"Xvql8[0Ds lVQpgUhvJ3B_!AAqRcV7Pte= Mֹ&PLpd~|L3mR)E)'T@P8eu~`lO>-TЄsޮ׋*l+:mq4]R0 Jr`%+R­䡌lO2o` ,vߌJ\No)jJeaxLELJyI^(LNj Pv1[d,7mhiP46պ:[#+C#I0G:r!181 >ZȖH9OoU"/og'wfLz!yw%! \IKU9ESp ẍL׾wDa#ѐ(O30fK"R6s3OX\s]͗zˀt8DI/n-%\1rG'"~w\ Ρ  f~nח^eiKl+7$$2PPbGT"<ْ0 檓@-$B% D(x7 >956&i/6wExOZzO#J:%R $!P1sD< 2N록s iH& E\0Tp1qmnzãf p\0u/w뱍5HXf$P0c"c#,B#(ʑgRα6gIX1;*N=t6o2hhm$d[R)#(r],C2  ъHhTB!OɼUc㔩EjD#sPsHftC:&w{.%38 E (\[ ={7GBX;މ =1V>%S9"BR>U];_r4hDsbZÝEGҘl̬yPrlo][WJ^Ou*\Mj+g,ϫ_擱 慇]sV5՝z?ζ(q|:?BOs7 hYk2hT\g^_oAYE?g1|Q׼w_{>0ѿ#wMxEy[>Y gh*y`Pe)3wW{nT|7_7VC0-/T Ɉ2\m0PTzD<lhG(A-g <[MI0H5pDE(_uR(Hq'"#x%̵r0#10\JFSeE8|ه|~xXn$WD}꼟|xnXnM '瓱u+7[)3iz/6[}r+X$w֬Al«9t$CތoxWmq\$6=^R(|Ԉ4F;ʩ~[flԘ~ΙKo}% Jy yغzDo`Պ\<0>A½S2=`bͻ(b@:a.-jij( bTB1PAn୲NS5Q*SJj"ŧunWnkwT6,MeR=#Yt23 `p`ۭd=u7Ent2AMZ(e0WJ#99$g=o98"% fy%d20iX[wanL^:NEX¡gEq@NN#H#ƈ(颃A<{JL/X<$K$ؼ$IWL lg-*83yЕQDkh%k,#9hXf{LOX1gk(yh716jBŦsKrC_oG͙h\uلBaBx}"DQ] *6bup>R$M ;M='^pT@vpb9}I,_2Ch\Tcu>!YT;!5Q97y\xd,2 vrlV w7鍌G&qZ .SuӴILO~xlUW=dYQs x O~t}qI`4M>=Qiz{~[R "VHd/S 9#) sO}P+$zU0{qo 65S 9Rp-|Fřɍ~fdE[ab@ ׿vl^j^4/}bhkbVg|l(jq\E޾P 9Lxak7sK5֓ٴ~*+fw}5`Ծuj`֍X' B[l׽}m3~xȰUq:UD.z R!G0q>>j,kͧwF/7]|y['~q_QikUKM ~%^:sL#$c`եeJaM (/$Pj^ )#ԏmݦ`{s1\.|3> JXڝ>&;/L{z+s>ԝsz{97=hc|ٕνU2G3&T%j85$. k.GR S1EUgAi}/6'휝%[yA ,̺eZ@D` hZŪx14WakB(1Ei1Q:hL\j5= )y׷a;&ï˿hϺIlj_bbzjBb&R;׫YۻKwH_vףK`kXw9cQɁ1 }UuΧj<觥sjDu!w\;-mjʔ,^QՖ)iC0UL  B!b1%Kq'%c4$o`vc|-{w:} ;¿fw]m;Q   htˍTS58 ey%D*5V & p{Le9NJR+7oIѲ H0RsgFH.gEuASPc9O}#5(ُ7ttGhZzzF6C"H2-U@SIc58J2lg.,Lؖ x}?]ݸW?q#6aY x}d q1u4%qH٬L8gFfr)Yh5Jn0EƩ&$UHχO{CN뢴1jP2Ww6kFNGAI(9GgY_,Wv-gژG{zc@Ś^V8ta#ED2,,W)#-g.8W$BˢZ5,̙U΋"5x^Tj#1ϳAX]fWjs땉fˋLա oP8<2ǑFEqjW\G~qw*8uagw퍊TͰ0SynvT=@_@k*ZUԄG_&j] 4-*_;ǖ^2ֹ'o3S33x!W7ׅ0d0sw|?F_,=wU@+} (68"RT9o`?:IֽY7I w?`J#gc2Sp<FBڄ6-kTOsÆ[?w-gO5 Jç0fBl tK}DPvwK6 BSFc)23NI+6ڇLILΈb>.vbCZoMB@e7\;SUH2q׀LZD)g>$d@74Ϋj,{^>HH <\|Q"N=p* Dx""蔝:SZS:jLFDIl҉Ccd)gçj&w3!bV,7yW[1!(*2=sܰO [ \ʋN1#߽%!8JEk)Z 놔R8C,vec XK4uSH1A ]o~%55b""'%B!zu-N}ZuGH:Z#M;TA&8lb v`D Bƌ!aY"1&z[o#:]Gݑh1-y c)@Y5R#tʵЊKَ ,GW8jCg`=e*1Ց4p@[&8_',@4D͘ ǣv&D)< 5ܰ?oleYiVOjpKG28B"`HO>e?Оl0#7X0NM%(Մx#'LHq1^25'3kZfR-bfJb^ 9%IDCI;0ˀ0pfPI,W aEU{GmKMhw?gGBP%/و|n7My6`'tdH:f'PL_J93>`m1b|۬=AQCoP#a`&euk?N_bSh!2o0 e0.7יv7!B+nYv߳ >`g5"8gN"nԗf0PB*JSmQRZB1.cO=:SϞM*3kVu*0dT5?\e@|W‘oWEs][0U(ɍ8| P+='AN(EϗYk!tA4D3,)e&&#\lwa3uG!m&_ROZb2+/f]/y ZlCiz:dJ%78-lkjIq+9;WkJ櫢6>Œ&}[!}h<+HS= >_H֍v l$@O/*7G$gu L9;h%"K)Udzq/#{Fӵ'e&B4kn5zroaum豪>ȭͪdy[/%r\Pu2@4{BH>s8^,Eߤ/`un2wvUQ}ml#|+`,UPI"7ʭh|uvoϗMԴK,-UWZwf|ۂQ@R;I_U8ll6~RNlV?UL#,0bR:Vᐾ/pLZ*$D *B0PD.+#[bl^|J׹<"/X$ P\-k~$A~K3]sd5OJ<~ɮ-Ch.7`E_?HRuP_aؚ b{l^ߴ&V`NOu{*L,VrV@ * 8<[kDmw#iR@h:B}M[(q)#B7Y''̦w[Mb#.uΘ:G3u<ٰTXl.p\D#pFː<1=!<H2(qI~B:*qA 3-2'd(3Ý)‚c^/i8߱Dq*Iu=(<c~.~Z;+?o߼54OEQV7oYS_ס{vvVx/qulyp 쟭^j_jUbW9%)e4oV* sSAC16:P:ʏVU2&+=ΛZgޝ{8(XX3bڭĨɗK[i4CݽUý_^^ ⼯^污^f }W?Opn~YF?as?8GGڟU>͑T[2cqv:8*-Ve3z82ɉOe˹R*H`%s?}$t]T9McP"Xk$5kl^WjF=,'-*in,6I!R%L*B %6{>ΐΐ[8Cq-rݜxՑ#LU[ύ^! )Cj@ 0 jfBARQj~xDGdxEs]gdiV(Wڊ US}|a8.ҡ7fƻAL!~?4 sĠ~9L0plfiSK&0&~/z*b./N)t`O8\@ڡ a S u̽vL!8p ,K#Ѐ6CK[_Pd*Kbվ!:wĬ'k8YZ g;Kjk_qyoW)W[/pz_QpGUIwaN0FI%p⌜`4H:+FC2jLA,%X2/<(1_lk iCk`$db˅=/8CM?-{m$Ipj(JIy.] @p0(j+n="m+RR7fۖx d*bU@mcBx{0`ZȆ $V,%8 *BDAEHOT(}=fMVN|Z/b (DDZ)UGKǸ**|Q`Zouww[ Z ~LYGTao}!ONӯ/+_Z4iM>\8*& :i.ucks(/"♢0-WоH=+v#/tndJ_:7xS.(4GmxkN ڏ6vJ|kw󢵕Z@ y)łANNm?y8oGvݳ7oy,O<2F~ ?vKW"7@Z)ڮe]Kf6y@0F1؂PX*D'aFZ3e׿1F|7ܬ[RT?c8uv}ayۮq|}*0Xs88'c*SFL~ ^bEc plV_=Ri ;Z31A4rJ@0Ȍ(jX_V6+t0Гfr* UҕkڻKq F ÝX=aYwos@e},;w.Whv࿩BbUd!6}}k3q,fCwL޾Ϩ"Bt!,^b>^?bǘst#\=<X\9[w0gG̹:sna.Տst s~D^[3u#\œ0_>m{.H(Gn%MpN,iHPU8'I*Cv =qB.>iTa7$/Dw}9vTWcQ+C{n`{B=RrH8$-N85) &NZ`D8luatlPQKۺlA@{؆.78)U(UDb E$9NC))lRi|aλJY+Q_`v5psY9P̦9m " }Ѩ~ұxq( e(pLm^wY)O;tqAqR//RƆ2F$=8DL(#.Xs_($p?D*m>nàE6_Ar?.[\Yjpt۲VK^U;v?L|ŇC9UݬҳڍYuU7S99?١>UzxSR?U:Q6(vd.hNkAӅA8#_rSIP\i BL14HuHC!idNUx ƑWֈT'Uyki-B'q|_hښ~W%BU骪\nʦmDU%/>>c(œWݯgx WzurȜS ZyU\y[:3wQ/+#\vDyߔ*su\fUu}u6_~=oʊ2+q& ٴ":p.-wA;{1 a=N_4Ɋ)$GP<] QO*O EFl+*V 1DM%a- %RC^t6i+@eL>^k?~x"}[wB{i$g/u r'WծZuqJD} tNX78PٌMA(^4Xr Poa@=rjDKJ\55z{hH੼ >҄G֎%uN68TuȊƭܹbKE1#Fx&FG.KU $2DX0_adTw+QeeIOjPThqk>W. >,]J+lUd q漭6'N}Z\uK6;Haˢ剕TnܾdiEײdžqCQЃz CIGFJ5w_bUhA3넇Ъ;)a$v$3QMՏ|:S&ynAf}*@H*a z l$ Zodw5J:[{|,Y-_+vw6h5+Pz,-bko˛m!Pp&*hOrśv GLU,-ʳ SPKweN|;XBQ6uي@|o/کeY[9 ԯ*0LcלY@e5U,;ܖ{{T۞zo#}h۾'=}1>"9-Kƒ@NɁ[w67ü+ V?Rҽߩ9O} r57ъ]:W&ڶׇRDUm 6O/d:jUYte@{.yZGy'w(y-ΦjsL͸q2*٧\8N*i NsNp&-$t^otӄ)(B-+OWc*PIWC#zDe6lTj찰60vX]E#]dRSAmƟmYVӥYGLnc?\=-Ҵ?k~@Yt)! (=Mn:g)}E*(y ;0!O "`fBNˊIWf;#q\Y[ks' kܹh&-C?B( Mt`?ueF4`%%v 1* $JL0M̏E3OZjHZϦeI`fwO+3@FjZ¦9W9beg {CW0%ښ 6%IB(H$U2[h~`c\vbB1*L)odsNC2`gzQ.JED }'?a'ؤQ|?ݳ),~b80)a@B@u'kAuhS d;S)&' (LXę.,Xh&﹭zz&On?qgw&#,p=w̧4~Dwh+,ZV%n`),b8NcSGXXEB,:MFQq^A?&$\\klSHU;#M{e>D ўōҖ) ¥=fˬvc0){m8@(aC!;+d`s:v54OդՍո%OWOlEf1x}v{ol ktl|Qc< Zנ5 7#ڨuF`?ǩ<$>aSA'G,S%Ĥ سqB0(S},9Ƹ`k*Ă0Աi2/P$,fŽA#.{':'[ݞKHf߇~Qh2cUGI~ 5pHC(we=m&(hSʟeV. {1  ❉JU F1Q4LjL U=E8œ'i:[,x6=eWCBs^ u;6z֏YȚF =Bhi&i$PA 9S*EK~ BWI"@*ӄ)S#2(L'd~em񁎩⬸zms0^x*NS0L(g 婰"%S]?UWߟÌۚtXTdVDI(qN4MD󈮯Fc]ό\oNu#C@u*DO1d(DŽh{']q(^ &`9b~fu.?!S$JZ-P)DpI#$2H_SLcE?vϷ~nHFS}ٹo]/ګIce}!wuqF]3$vrF,x0K;>kUTM2<ӻ$ۘ@@2 8Zʪ2dVXP 4(1su1.XT"q`=fQlпO^ǣ]x5șoZތ:t^*]֖|5vTU4i0g/pO:p`A҄&+jTʄ]#Y-Kx ( i J"BSY/&h!.]x 'unb7Izwy8y(k՘j< ^jp[ɶq|Yyγ7Lሴa-n.cIhxӧxEtÔN ߶Emnlx+5J.Q .Ѵ$#Yb=LzwTZfJ;h`MUݷ-԰=\ }\WE-^.ǷN/k1~aY|Xk)Э\vf[w(vB_ u(Pn1&o(^辭_f;Y/>/]x]@>޵Z t*,q_.|}Sݯ7P 7[hIX.?l0tVwjewmLhnŸew+k"pW}+z$`s}.[)a>q<ըvM/U틻\⏡!3B2=EO[t-p%S)&zi2?ŠeqEPZ29v&Z?dܨqql5Do>y4H'jzVazK.K:- B&fT)KI%?ż}y4_%< i2p/ J;3[zW#{Ů1Ot͠È;Mh7&USIѥr7rfZ$1 L 9 (Ә%Rɘ˲4`Ɍ3ճYo`vVTd{j՟~9iK?.]8>{ {Nby@wwDc3RdT~O$,4A@m>e6;Rf f96jsP_fqoB(ի GJ&?0=SyX(A,A)Ψ 5j M/)P o? 84ړʛ'\uCy[u1 ?lZg-̰ˊ2mې3byib =FF2ŚV0a ~M".U&b4Y-Lq.B9c4%S#*s$e9{.[YhRaKnBODz^؇!]9}\jhI *V؁h8?'R}9g27ǍQr 1sjP,>n1^LݎD {=+?W&8t`0^˽пoyL/J.n?f~#ͥU}u_52W xc$Ed$'! 9a,̽lhƩaD}*b(%D%dfߢȨI"3%<3UWIڀ9s7}ͳ&t$G~ #_* ^NP{yxbȓd ˑ^fT/=l,8.1b$;HcE ˅SZ1_$aSu$'oh cKBJ3LRɱtq*2&EJ,QVu쿱 _hGZws\aqb 3aSTE|42э2.sCb≌1UH4m,2VaHks,P̉<󅈐B2g+)J_f3U[Bb_|*⾾%~bkyk'yEMޮwCvʋj`sK\HK Ӵ hzVa.Ev| 7]"/ޗe~9c5HQؚ~.y}WS`W2D5VF?DYJ[Y%B^Moj7NdqB)> kZ=3ie!,3@am,OD,IDlP/XgSZ?"8op2Pi"٪y4e1x3}7 >d)AkCf #yn%1o%8uOB/ۘO4I.z]&[JSbB\r""%\HT,A1DYo[%yYfI_hrYxӱEԲuEZqjBmUVhswӑ4э}hFJM4oG'])Re AI׳J^ЈފJ*3㍸ދw`SB4#'J۟#ɠI&~7>u[my-§h M/Soe6ͪAa6EmKq ȧR튝GQ[K9b*kΛIxE0$ +="ybp.V C1q X#%1.řk5P}V3eN<:~{q re[ 4b9!ڕV6&O6#*j^UFUP5!hEM=ԛ]rt1wS^kqh!_-qUM*z[^,7V a(zU:L/&MPAw{/ՄIyt~WOw(-ThǐnY%tfߔ u{gYS\2!}f? `#gfL)I)WFY8tEIxƐDД<+QI tXu^&+8ya235!,;1}K *je@&b;ܧy0fIIsf?.$!8sܻ3JL Svjp֫\P| e8>8 KbD8C?~S*u,a6pdQnD?muG;l fvJU&ϥ|mo~0U SU-8#p&9"$T8UY$Vd`stf_}x<m7>dQj}.0J^{vU0^7պ4֏_vGPVRb`)xCmX/Hh)$ͦ&c]mTdP Ѽ4Հ2jT 1H8+!GNMױإdzRi45]4$r04qӍ Za`/ l (K XD@XEC@@)#)b ],[ȘJvs{ڙ9X)Nko] m XW"\t3;F=pn{ ,x`|Qm2`|!ʃȢwZ]2/;;2VdۏMu'gCֱnwWмeCť3}t 'ƻnĴ%6?G+N›Fe-/{ m>v]\ߨNM:MS.#qUvYݔ{3!l7u^ߣ=Qm}Gjrji7CVPlW+t{7ӳSL&2즔ߛ YM1w936.j){QCv)n[yRzЧ|ww]l1fJڠQHz0P (YK>޵ h[7 n_{?f\" <`nyeh`fI%h X<@ P[\+Hc@ R{pBa~ 5LD)SCg Ii23ro#m Z4/!cN&Į.R ۠nA\Y5g ~g \cCH`rf˾EUQ@efV?l#,fxumtmt]nھW}$$yhӴ'$mW/YB3dl -!Al8elI ǻJ^DZοiqr?3gA 8p!zw݃~5=iԖ1>}[5 ȗ*7g(MÄYIB`vO䟩C?)_yZj r2e.,HÖT~BoD\عۖuU2QC+ qZp"֞.Ip$Gլ[!bF2!&Pdy*` 11y,gggy>PK-W/K캹v|WocgctUk7ߌbƏs@baJ)U i<>LD92FQPAAHcr)g<[8>sIIͳNs 6h{ 1#ЈXKx|DTN8<&arh}CWrz,wȒ0m=JIf#*w J sҀ2mjm0VQ ow!~*;uM=67?2U2X/6W*K5n4*FS#_9V\muqQ4zn쏀2Xƽpk}#)ip4Mv8޹C{ ,RQ#:~ 13̉_0y(! qΒ,E1nQ42V}hg"aݶ#Ke=&[D3|\Sw{zƋZH\x @,2F 4oAp,PJuY5|5Џ.J+Ϣw=ΊoHuRu a Г5?|pzS04r ꐤpAC`K2P@ϓ-C,BF׏&K+ i\JDHSsDuۚqaLCxHHoMCG"yf1Gdy쵋 gOb-3wf }V0plQ[-t9q1ѴnƇhk?z]7V?o9kN׾v؊ dž.E䪷@;a-qWgmSiTLowkF-a͔Mqkt#goayD SPҺHcB|u wq)I1")$qQ"`R@()G`JyS1˽$G)z|klD3W?v(tB3_?nwg ‰tɽIA@"HH!WV-&OSҘgbAK#RLBQ.e)Eo'-h"K T_8=mg3i(!Fmk1HBIND' )sٙDox"hh}%1k5m[\6ph|7):q,RƏI}|LLRI%$h(ԶԴb?C@Q,pcyɤ \"-Ml {<3zF2?N! 0^J< NCq2!Sr"mxfSȗZR؋ zzX&sb)&XJ$!|=J-ɥ0 (AfiN@3iQE0(c~id6XϢn tYwz͜pXi5wcsvMf"ŗ$]b?!A]ۭ>F.^m6+u"[U:k}d8+G.|\xCQ5kBqjyuv$k_·Y%MlclxٚO]\Tyi}ݻji_]yai$v.5ZFB%\0|hqxp Z5e H. 8Q;Y`0="WlU©UMQ9m[";갡 iұa/6^f-f65qvM4k0OX7)hѤqSb$(3F*Lj11f 8N"Xa `$qG1Z@jv/g@-N*ه:u{7AwH<_PKioi76r4"Z}|7l_u;mdlEAtʧP(NzSn(}G.*8!L"f"$3U-;KqKOcP /[d^z^/`RM6EQ4B(FGN罏NjiD"iE!<<s$ mf[ZM_҉WF;t=:t|K+-oy8XsDL HHڬI <'qqģ8YRgCB<;G·چC6'3e%raRM/Koyb?w:*iLG'%3P(Dargޝ&Y19!#DXFSPi\&ur,DI?ӴI Nf'ɟ ?W " Pi4ެVK+WvvfK1=l[NRbNACi#_ /^٭#v"uB8Le{Ľmcw߃B{.4\zﻚ縞V"ꂕ͢CLI'/9LG+6NǓ1X7g swbQg #kJL b_4b aILTJG#2È1"h5VTٺo~z:|zv|Çмq=,llW9{[ObN1F "CH.lL#K(, B,76ƳrF"2#VHe g($9iۼŪVV3U0/Y0X 1>R)jRv`Cz@󋾯UUl -}W5E/UۦpzXc*>)T"xԩ|֚6*I+ % q "K4$,D[ D2ƒ2StܨrԮT4TqU 7}Gڋr*tHKG_5/t*ߵmjW|=oHkq+]E;GK򔲖{#`a{yVD?%r6E gem-3*aK^4eU_>?, 8!6×Csv6(6>*р|Hs'ڕRu=H0)m\,# DS6CS퍃$ҠoD;)oh(C $h ժK=xpdB旷߷~ e/}Ul9Qm]]{oW;豝DVVʬMkQniC˦ zYS2Ԛ#ފ'h"T kc۩d+cr\NU60m~hnsiq>bRK,]Kڳ虡h~\xDiႿy[$%a5KZ_m]ʍ'`tl*n0N`t}~꽱_]/o޵m++A /"%M4l$E˂(v,{ɯ?$K$Eiwo-҅9CQ/Ù;StTB/ }Н%&?ՋfZ_e⢟&^DnNXA1=P s>~co Igy 4%M',>A$'L @>GR/!B_$dt"lG&Eb5dޒe}^ ;B]TmAÏ-djי :6"u4iP9Z:/'Y-矛j޼5s3zlVW '8:MCgZH[G`ˈO.k*[1+0JK%gCf_OmO˻O?}xyËrX;(Vog!2ZvG,"Q8@`C-^/*jiD9@s F,Hli'AmJ9mu\}.U [=)9|)GFۦ\~\$H{Q΋.qndhҘra,cyJ(OX(UFiKb mUiږ;d.;9  $r 9@f2A:A`ȯ߿ W7rph9ܪj0^&t0W t̹~j>̗o>뿟b5Fvb]y7X.W׿^Y͏^!d1SwDViu@_Ch 6P? aJ)$\( cK'c1a[Wjؠ>sxTh]AjvvE,tv&+HxŨV5|Yk9UEad`rWoGnila季ϯ) CB)004N DL1PD+G }>0x9Sa0eʖ@(0˚dvݿ8y:[MЀ/"mPXOɼ5"r܊ P  AB SCK(i-fg 21ZG|9ʉe=zN=#YU!Q^}ڈ"~\1K40 @ДD[?6h_$b1W#Ѯ|Vt`ﲛ:`uU&hgvVΊYe랊&;ҞW: ;F;^Z҂ FhvAV:_h/T٘cF.+9 :gf[)ձSԢ0ySaOi$>]ħg ଒ aŘƋk*a< :-(=[?j(G:6!C㶵 SUUStjw(˖֢6uد6ׯu6%ׯ6}CuT6PZ4ԧQW?[΋dt;9*%u SaDTQPbY< !BrH@ID{& c1<;Y ,-.72sj*6m' PvrC\`*xQ)1ĄAhL(j}8etl4SQ{L:&{nڨw?Pa=; ֋m.-Bpx9&蓓a~ sh8֔;"m{K>g i-+_VS1ZpR*2HHx "ő!"fT" TM3G O>8F}hLX̛Abڏsʏq GV?YS;;sЕO%JyMt;D9VTG7rmxP~xWWU✕M7b><+OdM8~~j!a0e[jIX_Ҕ/nq&Wɷ.|ߤH];k&4]iFt᫦I;JX;Q~1j?7 `p#MG|bȧ=ܴ܃@~qMC ",!#Ci2;A qQarG-X]! z"8 eUP* Vn4wqY'}c@Ռc|כF-*Aڃ3zIR)p!iSdȒ@Ia DrF 5^(.~b~?Mh3B ϟ1g cP ~Ʀ=bS硚mUh`&݇A|;԰{6M8 {_Xc$`7mUw|v4ID4_WZh#:OtS)nGojhԷZɮmiD4?l!)8DHHpc#BA֦pQR*uX0` A<[qpsVΨ+!bAQk`v]E/htc>oa{݂ %T.4M$$cO7IMpiDA@Z.rs~&f_ A(G|y{t'c|zgNf~p;@3 >} {> =Eho7=j[WCΔ+I/kbYwV nd#KvԀj KQ {7rMdo'ZNLp_p@|2ǫNH v us|s+j L!م>GRNW| g5% ~O:re) g?XXC`ޓ_4C()QCB.#q( ҭw:v? o=Ҷ%ylG< ʎkfvqb87Gkړ`*!нa{u]U$$&8V2 ł#)"C&X 5hjV~E `ndሲ7  p e?[J+c>.C$%LFd<O($ :Fnug\#YF2XQ"BcMBS+;f.C5 U)ľx})c ) H CB(a %CA9br$s>7~ю0iYniTT՝ӛw_3|~SP!^/s5LI7_G>o9_42 Agj P5KMMdt/Gfԏ~zECJ.\}tu ~_d~ dpGL1(v-]ky"gvgE.^"Eq?p:[jߑM`/wgIY(?*o#>β(^%\a:cbCbH4֗Ee XjD$Li-kOO0_Y(aJPb88+_k, LQRO|*r4hRp oj߳DGĿƄb$ PZmfbn81:Ds3iUXw#ȱZ.t22de$ BfV R[^81?g2[MVά\{XH/nfR~y/iGiH/?FFS.F_~XJ[gr:iQStmZWt) Cnz;7ݙi@y- I_$%eKI 8hfgӝqnz;gb08%1w]jLp1B*GLBL&i"YBe6_i<ؖ!)xS|u7gp3"5$ Zم U /6 w+B{+fޥ+ȴK]+8dCϑG0E1i4b|y) i0B Ci%,Ï '/Ï۵|[m5L5#Kϧ:X㙜F.7$-1Yf/_aR%iHvp֛ QA74ŏW|F{vW /Mg`yD_x%?{8Av{!ʹ=MG {JֻP<4CD"ѯq%80IBTD0m J7y"&CdY€lc.;c]lR>Z51#Y#yV'8y_GzY]8ͯÌ:Y>bjGMV.@VZ3!x0&XZH|q]ꞯVHЦ;ܺ 뇅M*Uz*^,Xܺ =jdXlPki#dƭz@w9\:}Ĩ?v!R˜U܉{]R6gu!ra#hSfҪU~;`Mgj&nImۺHj-=p)4凌zoҵlV}\Ŵwv{Bj 3@OD:@J" @*%z&!`Ϫ^&_ 2܉SUʼrf.4w#nt%nxtGP.v&z)doh~j 5,2pJZMwjKBhZ,HXgnb*Zk-ɛA2-%1ܛ'{X^}VZ cÚBY~;FݖB5 ;QCQB[UP/<7lvN~60C7Ln=c% cߎ`y}Y&CpE#2͵"@E!MF@i AwwW\k7 ːdŐ!KuuX ̗⥊ܜ#% | 'ۆyIk$hzUVAW?Q5_P=SX_of9'$v#/jYLG<2MjOɂ/jI]k5O_<\Mmvb)ϮfyЙR.9WlR9K80+vuеfO2vճjtľ@q)pX';F'?[{ NTGxR"t҇G<Cm&" nt-xuZp z6ٝ`וV׼pQ- =TFizy7s@Euc(Qe]؞F6  2/TYgjx,b?#tL}X;ja_iۛX*戚!09]eK,Ki*Z (BItLR!ν䑡LP|#'L0b>>8fH|~͕CM[n"O!7$y pF3S ٖZkijQ@SJ1KP&X@ )c8<7fTJ&_fb1K7|+|1wX^=:VÏ+Hpcw%4Rdo0#moQ3~_ޝˈߦT g(bglSkxdҘr$Dޗ;0(eLL@`J:Kӊ5]hEKv驨^w$ۍ}Xn~2"v,48& cPnJf`$bHP`PH"Bgqj %DBW[S}n_ی3M.(yM洬F8S '糑3m<1K\u`@|Ɓ `Is`yAypk'шsR yK|_0SN^WiΛ&ۏ/XEkF@b$T'$wyG7.sN2#f>͗/ZI:uSWS[#RE߬g¤|UU5*Nb૭_穪y]n<DU\faU(%=M,wn~ie-49bIL9hJcQhb@rx`GpPqJ:@qHI O T<DP3L`+k[^9UCŏ c^>L̰;0`cڼ@("P%"0 <& hyXn} b_ G7|6l}JDlԷwzM5 ~bYC"'BK[X  M~"͊`#70OD:"1)<,3N>NaSqCD4f QX )f_^&5<9qM޴W9;eSL^_kդPu]i)b!\ I$ g F_KP; ؙS6M ،ЬHu Y}yO`(!(VZD i"2$ òyi~TuխgAF1ۧm/:a5o}c(ir.b(nRdU9bv<_6udIOhUgbd:tP`%M`>#F ` "1Es2ˆkX@%`XI CRuj/ d~ze,Z;}Z^ zaļYhBHCWC4XY9&5&:joU!XsO^`6 kʅŦOLKo*Ye?ky1n>ٺ wm {3$⃁i؀ksu<-ܛ׀;ڪdV.=]Jji!&Y|0S+M+A&dؖg.BM= ϫ4^]nZ)a&7>._ 4R|Nd]VE6juX:1?0XLG*|3M"DvюWX( N80&%U$MJv".| z]NpU/;|_?xtW?ۺh\x#+N=ap*g FUM9era (%e"F;kP+'e#iѶizp͙q$, $ 1 "2N 2nSfY,{';8Ѩw&\  5T?T!ToiZᯝhx_rDc|{FCQAx;LoSBACe}jLtFr` d\UqK rNL~H9_SRU}Ld(ܓeL8׆?%6bã:[B·RNPb>z$q^)U׏KHB}7[(o7 Dxj?u[Gkwu $ 7u؜5˼Kק=\0G'5=OOQ{g߲_vsixJl ױmv;(ّaH$ p]JziX2:rU3^VX-Â\2f\#6g@}[{5'/Yj,NYj}>u[.\j_e/td]&a,سlNcȰ{'\n~?J" *80vF؍*/}0RSɩU*ėL3m 9&{CDE>&^8Hp"9u}fSC_^͛np,d]n JEeeQ*XtE{aQK$aNCu^,堆[ ؁L6e\9u8I`G.]rǖvD D,/a<7^|L;tե)hSeGkG~.k97Sv1Zi0їD?N(׶,GN5,$#5O6cQ%E@Q71w„ dKc-E3'qQ7Gm#E ԅcIoۢ;&iƒlcֺZhަŨ4 ,cD=ȦHc !%Kk4v ߰\o +_0Uo!;TTx2ihW  US$t M~m5`ں֐(~U:ZZ@@V{ލ(C 9C=ou;suNK:"+Yl*![nmM^o)۶BXM8HfjeK!iK VJ7Sx0tf}iT!Pu{ƚ-B(6D>¦PY9ހ "~v%~@nת+*,eadSa_IIpwK%|8C%i;&@UO彆!a:v5oAYozhQ70n54/Z"ҟG6Rt@;U"i{~l&vU2v>*8X()Q<'yvx&cnVf T[D&W~$rĸҭ[N(*C=S~%Ev}J&-Ҁ?[t Z C=q@T2 Lӡ2MNM!DA5HQܖ w ]Q]#Nݤ aZw7RV`SUAV z JJvzD RdZى+%F&hpe*eV۱ƝzZh&w&ϵdn3uvw~~bKO2Kʛׯ3R{p*?_*w]'){,ߦU&~o#`ދA2$TRD?aI7 Tآ4HKה񛄾c-<-P.YTd\'#;>2ⅱK\+vc&+<ۉ-'bۧV:{o+-6 Bx)Ylg9'gZܭ=BZ6jtmSS }]sLIsBD6X },et0!XD3Ia,0 ʐYL>}+OjjҼj?ȻA,aIiQT葃RdžzG!s^{U1I/Bq~30 tكw,(CZ?˴aBU& ׬ TƌQajjXTֱOAF8T쥄5-_jڇq" 3䀘~wBJKqS<7t2!x^E*j֘Y30 ^4pCceN=EF#Pap7m4yLTXc)h}F% aĔRL-u=0:R E*y ؄5|5h5q"ب~.Rx9g{Sݶ-:| \6UVzaLE=t4K5 g̒LNhkD<앭쳶{"D;:QXe$_o5ɔV_h5ZY WъZZ&HRJQb=Xo[P%f)8ըa0{U]+PqC~=P( ]GZZ#ϳG?`EB>ËWbxR~>O/f| ai2_DJjоss륬iF}Q᣻މtO(h  by} t"21 v|wЗ1!@R̄tjAM/hJ$sg`D]+4j\{⹩B=\U)dz3H~2 vVc[է"qaܵߌmbTvbZYUͨ:Ƥق" :ƖR$MQiTIPd%}7D ޝM\,LiC J l] J=\v(GHHߊqc)Uz7`>K= <@K ~n/igC޴ro'z-lHA61\:>F6ˬ璘inm\p\{#>/tMnfA=:fGXĭ(^2'Y$#4f oNK[]8*n~\S^i5׬<:Vp&ܒ~Ʊ  /PQ-H_d0^ *OJ7cu.S5_+ v}O\nc3WI 9+ 'ԵȜw&C|y7^h]Us~@[3r_F$`a}1z4p}n^$iDL`$}-λYbW𶨡)>5XOGpE4r*S>VA ^@=TÉn Z7]\TfޢZ5tSkͅ²V$ূ:bCiH̕/QQa)”<"*mbJƌEswOPdm{/4A$3[_:mYU1g-g6Oٮ66_b_*=gl~#.r42LaQ1_-{hEA8erϰ5Ch)iG;69F8"[`6/oaa>ӢM]2Yo 7ikkV޾Z;GN ̸BfPך}Ǹ<`xDLἌթӾ%C9ԋK5,88r:L;\ozcOc&~߾{T򎥰׃[>?lYͪkB@k*0_<͛u V,*n~+)ָ>Fd Կ &dnѵn X읬ǘr\ ت7gRn9zܯp"zE\!8K=j-h$8{h@Q׏li;v!; !q8MeWسw2i*mm𤞄3^i]>TйIfuYb9k܎01K(ǘX~vhG~tvVs}ᐺP7J&}JVY! UrkG_S28Djmh)8>F:9Tк[1-FpuL{EP;%$m/M.5`桰]f9\q h ~{l83n`׽14'nM.,JK..}뷑nx]Ysܶ~ׯGRc_T9:|r} @if[ɯ p6khh nDQiYkG?=-αl==#zRчk!s阖 78yX*xP{4> +y+$W꒫Nx/Gǣ{|~dF턨rn ADBqJRjdUNp) lCvPb||3v޼PDXȔgQ &Yd&3&1Y(VK!e~4B/.Lٮ|D-GmiׁcMn8mHu&INN{'1ʹ-LPƪ+.QSI@ITi ZsK+ M݇/V=}]iF: o d9úhT(4]F$}@NZ`bT~ksu֞"[}NꣽmnTx I*sO=!J a!jDqQ$a8cة@!{mۃ* hhE(@p}=.Yki7 ߞNW$ 5~-{O,m:o[o{!Bx!H/ 9)Xv엂Nd)yI;edTQ. 3J?ђR`M4J\#%uSEfPBTvKhc,H7Ć6wf5V%.z=<N(i=׾{hz]qOo b~ZzwGUZk}Fܙ'lurcfLzs%BsK ͒uDŽhNo>&rb06 >+*0Dʌ1J}'Ky_#kԺjݎ FQ!{5>Ǿ5;ަ(oZqtoq[N|l9Ϸxnj~ [x SI`3‚59.Kpz~OIMrk&W3=+ҥB˦GF/۾/hTSͮ-!p2sg aQ j)),J%l͋@nïɵӬ~[ݕ}{6R7Y9J,^L5(3-o>Oo^sԎjY|-rϳ/?>fqdAQ-;]@r1 8`ЧX)Se2m G*"2" agg{1:k=x6,6$S |R ˜^i!1a3"$~߀ɋЭ")Q-pFALt1C 37c>2-H@f *sEQ Z3 ũ0NBk{dSNd!׳_8,mB3j856ވtDou1MG1 {X6ߺ;wpkֹ%f{<5}jd#ލ N%vpqo7az@[$dݫ~`w5%J[ Y,gB1lJRY5qB3W.fT w.nߝp!wك u'$Ǽ 셷] lcN=\ӱ+lٻ07ƣiߖពܼݿuq3 #Al鰮Nt?j%^M0_+-vR>ʒRlZ|j@?ۛ\iUMiGoQtZm3ƳѹEp9rOcIV/ #cf[:\ΤAXI($0 !t0AN?gzalj3J")X )jC푁}0 ˿s#u\`Mً_ԍ!zW>?$d'mJ w ;n"p`HjrKK Rehf̀4p.T;#͇p^޹sM, v+ĵY8(D#s¤E-rb'W鿹u1MqG6MY^;^[^tO}.WWȚ'ǎm)}uu=g6l1I)8M1YeXmZ[ 9G[.z&ɈFyR{rX~R}056[kxj+1l}@$rQ > ?|vq9&\$”TI㷪5ׄ.rty2'7.Μu Ʌ`DZf2R>-uiFMEI9*F[e~u 6O0}V([1\wUxFaibGB:ɜo7?ca<_[h[B/w.lk걐CDK@x_4R21WRg(-CSPYR-#eYϿlI`ґx61{|bCW_^1͙>Ovw9-saF(g Z:|!֯>敤eUZzF~Ig "R{T,  \;?Zv LnEBh_;:[~yUY1i%7ߧ}y(Ṗ6[\}'%+ďtgy`vJ4/# }S:ΩhcOFHD#H6SRw4 D2c,Z H "5#@PDS/kZEEJ1u1^BxWk}c8zu=lQ͇/^㧋_KT .#HkhȻջ6tͤ,,6zǻ*2ej,Vg;tƫIڽ79i=2a~hu{jv\H$|?9i7C:mIe }=Bd;k4t:F)j'/WSk偆#:%ܮf8דo +t*GjNIY#&57>|Hb,XL(,'<y@+MF) nf#NϓY!GXIc5[Էoojq^p9dݣXvD8byȼdur='flcOYJ86ܻH9FH9Ulb[tHxVtŗIFgf; [0~;TNc*ʚ=@vcs_LE{$ؚA.W #=q 8\/Ǟ3yH^:bw7 xdzJP MgNcO]*:;1 ; Fޯ/"!fhP)RdADbu`h̠,-;V <"әn~{1|[tʖEOο/,DQˉqT5RּxQIs6%gKi*ry7? ig*Rbr&RkY2!4ar?8̻< EOMbɧJ&*4{ ,lyD7K;0 ?{{c_&j ]WHum]oz Gu^-܍g~1 sUQ3.!_^AGكmf)Gs4ˈdkSi* C`oˠ &V'=BD=F8uwX" q6CcN\JN㺉#%ߔRHG KBe:;[jIifj!JIf51tZH}}NE-lqcHe@Q4[ L8u#szPY 00,UXP1"b)lMI-_>f,Lwe?O$o5en74%RW^w=HC6\\U7E6IjX쟩].y Kwsz{Pdd5ub^Fatk~EQQ?|V2_P7FiZmJMv|v#dY;\Iƃ cB)vP8 V8BGNoV†C5gNg ʰ0UjAA$c@xO 2 r@:#ߵykcFViňNZ8.v=[>v|_.1Vv+ S_0q7>`z׉#ϱGGX@;xBO:qihy(p0&#Mc&($W:V݅aCIw;N vxXkC QdGOzoIrg " mh%? Rwn7nߥm'X&KMw382h"*4͗]* fWu]h_y9=9X8U C9t8$y,RDгZ`䷅4E_9N"7ajag`M\'v. |Sϸ&&n&4f.l6 Ăl8έL;=#k U]׀٣}{: V'_C๞1r(r$Cf%)f߇QB]_RY&;δY'|sB+G{ ̳4e%[?ccgE1q&Il!J0HE䓔b]_xYTf r6Ř%Y9^Sz--_&3ڻiH23^Ko<6M;zCsc]ɃrVoM<,YUz߆DE ]o&{h_lMsG"mcߔ(/_ƶ-%[(@:30r}"$0EYoþnYQaO=s|SXDAREâ9%3ݩ0 4kWK8XG\ѬZNbpiW4Ŭ#(|ZU zSU^aCn2W7PWoU_4%N%8RҒ9_T~"p7.-DZ=\ucB@Й0nG|ۻ1\eީO2yj:39a)ʌ9FA=7 &;pBdIX Q^l ZHq7Px9NQŚkƚ--t铳ӯ'ܸJP|gd&5q؂jA ԡ!Mhp=-PUk9zb<V~8r}>G<&In71QȏvNCvD#ExiK#4tk0_oagnx꺫ǚԳvl[>-ӼJ#f w\)ͥ3~B NkN gYq$HRB3z$AB_%k^V&z"ȢmnoSSt7u)j:vȈ~P.E틭4 " Dm6"կx_ثx,`tI Z ;LJY9 Cu~ PpP0EfS~q'%7%c4$1|w?^}RA:I6%II-ME X}G7U,R`5`==W,H鿥U\//"*;+2/T &ƪT)P9cZ+ d׆@oFJm#Pm~fmc@(Ǿw#zռg9fV"IExg(%IJ(iE1BV0ÆI;2׆9!$9oF8:H{\KYl~.*ӛ)L]}%z7 X{^uyѭPx7nsН ] )m6qbUWL913ٮs zSշ -ߝ}4QXx [ i:jX/0}r+;\PM;ܲ0. 1/𥒊'՚<a>UtHZQl_ _Po7tV-}E0wH%<': ET jÉ|؅[#$SRXaweFQ>f%#XG%Dl{2aw,609q;^MBE>#>XVZ$v~&!ND3o3Q_XyՖ%߷NY ח.Y~f%$OS\h`n>!֋uYni!G[.?) ~VAQLsQ? E~a+EuEi}5J7P[kEe荨,n SOUО N-Ljȁ?5.l6/Y2f;alZj^ GN9wC]\% #J8LRJB7q=F1lM"4H8T_ ߟ~щ`ڈ8*72EL{}(YƼ&-}{|%ZT 279|Ùټ2/W/N}V\oYAt74Sǃ=,D8A`kz 7x|7lFhujJL>~H ATI6)dz~cy`ȶAilݠ&)I=СLdʲ:.ʳn^}aYz)_y/Au.fs| LGSK%;# -|_*Vk4aGm|u=na s(ƩK|J0{$N#+|W:$gz)gNj0drЅ,$zL)EY $y_ ?Nuޏ17C[@_D{3%yV ?Vl#-u/:艆(ԧW픁7:7a2`'v݃ur,S*Fljv4h'*D%tȴkQP$\)fP̂udFlqh^=\*W$x3KE :"D &7F!&~ ']RId5SOv=[,Hh x +ӕA7rEO>fD 󥒌)< ,|TKL mw|$cy'!jF!.ӦnO5Gn 2FTCkXɄ0V@:9kJK%lB=t8 bkZz n~R UfBz8, U΅*@CN󥒈NUc՚ ;\o9鮁}Mml _lhA詟w?0lt ""F#j>>ctE EZ0'Ur 9Jٲe0ѻ'|}aϐ!*ADYYQ%3z5;ℿc-g W7 O!yQ f$6-Ȁ!"ZVJO=ug0p[,HJx}41[M 6dN%=}s(ԋN$SQ "beMr, neY)s p9aX@|=]JYAï@kwkTR0\XB-wt&; UT BZt-`fZ>!"x ֓ ?m|$aov+e#CrЪ_ V Y8tN|F8@*D%t6Ay{!hbZ*_^I@M8 ^؀4_WWT"[,te[Yz&=("vzV`g$a INH @(w zô OD-Iz9=9;X=BLcWÆF0G~ƾ=}Q7N֛XIGpX^)vS5EUikڟ"\333+TX5{EQd҉:t:ͩvOGeUK Gld?src8ֽƏ=ՈٌFqec;4&ؐڗ-粅2vpMÇ#) Cߎ=:A'>q^X^AΙ;$޽`L>4p]~@-)P[o.o[] ́}fC}3 hV{ V0J() ī:nvCQ~גNpz /9~q2 p :}<ZA5 mV@iEi Uw>9OmINux/ͯӛЗ># K~3pl^Y-S@Oj 6jX7:OI ]$ͩ)u^}z/'RVHw=+t YU1ͷDS nZM!P=ے۸rzuJ*jc8[o9 H"CR3 Ԍ4+-t7 @߀gۺNbVlbg'YfcQYx\RsD4DjYbqҶ;>S'q2Z_e|>A{V2hyV܂mX{-^+i4kK@g( ƀh.tRU~k5><|k*~*5|D ZmOWc:Q_?OTvT.L+ &0P.L+ x0^TڀU~x_`ST,U~k?J7`9$ 9/=Č)sjgΩ2n\7~3#[bb~^픘o c~7kl*w*5<2EXT2@$#;21j 51@TQ"OLQE=}jSPvLmH'dNW;2E'dN :^N:!+ _?|W;RRR*UdvRe*UՐ~Zm=)jEnՀ܂4`h@{S0S4`h WSͪЬAͪfUږT:uTсP3y}˩L7rOw{J \}nM7u ]SFU.1pF`*I&U9z2O[×R=|;3ݑk(p @f@4t ivhGBꑷ 07{du,pQ>/*|gUhXImm\ponc͆i؉ihy{ri[AKU.Vܲ!ǂP=]s"TŁJLF'@d (^܃FٍF!v}2b'^p q\Dp0OWOyz(7ާm$D (v?X: ӓ_L=n f}}s`{Q b7H^B QHǎ̙`ЧxpT\c;5%:85웖m)@3oX+9@ "{J~qrsHZ34ljPuV}s ; ɆNOؚP:y.ӈ:=. } xz9DZ@Xx4o3"Y!oZ|?O9N1YT  )zGvځ q0nZ7-I@`]ӳ6ueB!0 B$]L p"P*|DkUdz/qzh)[XT7VS}?!SB8.HWyAF;@ ]Ј:MyBE.siD<ߥFWf~kx<;<&zon3B  lB_ݿ@9#ywg޴{a\mMxx#~2^h{?̔{J`;kVlȟ88:؝WGE9 h "bDI{1(,DO(1!:SDOV,}EA+*{0t pNM eR m--mb$tm|_g_*ś ~IQoxmm͛ҳYTr$PyU|B{qkz ڽDqjm\6(]\ޥGݾ->"Z,nAi t"Ciϗ:jWn0I^՛)Fڧ>|? |H*Bps90-c#(M zRI#bqz=I7(/,t- UD&1Gc7m{%! mj$1s6-dQD7Ñ:GdGlY=bϐ.B9q NqȐ`F&E8ǡzp_qM X=m/풮iUQ9Ů8<%3y۹7o^kHKU핦{UǘM䒭ʖ#1COgU1WZ 0 9q_E+-#e~p⅔ {Aa77DE7b6ЧC\|A h5`CuB<r s]L۔]Qg܉X&<FRquܑfնrX`YlSj/xLlȞKJP(6}8{V䀎ly&u!k|Y`߫ђ/‚ZY-ik+MQT=~ô>qo9H}T%/$n)/aMbāAz>mZYW:F4c1RoD~Dx?@aWwZj{Q"*׋uymL*\A| @~A>5gd֫hkTzQtVSk3+UIuMIumWG'@΍E0Ȥ0Rx˜^W@doy8n`܄!#sB*Dp",U6_%㶈΄~*%D׷,+/:L@=|beRuM5/G_{؝eUEv}[& _ NSo}FVy;~m{_Ў=P^qm)Jt*_el_6|L&j^5>ԝMB2}+R*^GuyrFeűЊDq?z.~\[e{݇(0Wmj{)J~VXVEOw*-BZ%aJMY5/Da>̈Ԍ y6E\ޜc`; XE~ Qud// %Y l3~}^6տkBݠ"r|v1 %^Hqu+ߟhd3J0M1vcHx%T?!0gp~TW_Lطfj EYIX%2|/MZ7fM{;լQܲ}d/dGLA.Oq8O=Lb,xz-pil~&\Υ^TjTӯ|Z:`Ңk*AO |1~+=,K)i|xA :x `Qfwq͕l{4ңl #7hQ8E2VOȟ!x9ri꿯>Kqśh@-DZaGKPCNȋ4V9gy!YmhxWL.uI?E,њx/f› ^Aۚm𥪺l|E%&k_Nn_ »iș 1ɔ4 )} ?R&*բYk\rb붸k݈D7uAHj=Ր/ZH ݎnl GP q#@jawlJr0yYP `68(Mыs@4dcZL@2L81){Q;oOTwok{O::N;2$:{E(?j^|J̣v.]͢DMu]-ַS mL+Y *W#H2)^aL|kQ!)+#nw)I~>| #rJwVͰ 'Z8tI4Fi<' < ;!g,#wX[IkϘ( v2aaV뎌neu#!0 >Beu䡅$2I 5c+ɹ>='%L6}m2Am'a" Ba:1r )OR'ʼnClg5x mxcS|+ ƾ/*@3}+ָY^o<]F́Ti(' {s`,|xa"%z', 쏬zq2މ[ɓ8-z+mśeAj&>WAfDx`pҊ 9jԄh2o%ϼht,0ngM-Ƭwlyo뼹RaWu^|c@GPK.tOZk~ vD ,B=>+򃳈f@ Qx (|!cBL]K#X*Obft_3ZO`$y]QJj eBSvDXym&c0^tT%+ D,EY!U-fA ĔhJMaĝ!M|&ܷ4pryyg-}c ʛ73d'xÇ޼==e\KrC=](@i]0K~YV0: A2~jbu|[mAQ`DΤ3wɃ:L]s1QDZ0<0hcZ۶w }lG6q'zNv&M3ifs&Z&EA٢-GN;A/:⯟Q˼*)_:?<'?NuH3QQ.u&`Es~7c'9:լ:ڍ1ܲ* Ʀvbt{:mn:M[7vӥu&`*/ڹ+V,ߴ 2w9hޢ11u0/}ə0߯`q逪 A 51B)G nSsHk)S s1$@bğ |?Z'O'{iaMOʆyJO>A)jɒŘ04cG̜fjԹ2!D8Qbs"$"LXV9{Q'l ]MrgrYT5 idmhTE]T Zсz)mqç]8pHc:bT69*F) j@e8g(aI*RCqop ' =!Wk*5^rZy[7fr}qr~ϓ=+YuQ9< Es}cϭvvbZZz_\e.w:1ilCaqLb2A椋ЈRyQM 3J`@4((I@ ʖtz_'J_;Way?L',tGM{O|,z (;g[zV,/J\t@KS߳;3>7\ gF\BM;BCdI! 絟7oS%GV"38cBCl5BRDŽ( KSDY8kFRP @U͞vHmP)10\t+y/Vxt4mmϪ?U#}[aoĖDh+;ͳt!jZaށ *HlŜ.#@ c3jzj!͖DA  xJ0/:T/a;!nb2!sANa2mtmod g"ha #4c7#a<p4Jz6#)KaX 8aDr0L h>o=D25Gt9]`pa.߇Fƙžlb5~MY`;qb"jo;pp{|1 QHaf9vju@J F4KIü$DZ+r2L\8SI4D%"-T31MGirqWܪ.b>@t髵k2ڊ.`ëϯ/^{#2[Ri0J[dG)R'Ә"RP ThPàX0I0RX'y'2S]k5T) C`Ӏ~3~;);N/eϵo]QƤh*bo:BU wY(fkJוsw\|nn05pV\ hV5w-tϳkS:j_Io2 S{bzn.3Y,wovcmc!JuFJmv34jۚ:+xic4>wVq{F ^͵E6. ZZyqyn=I΃7(}sQsuA4+\sҍ4Ce)0R/E.Hmn, w\ ve|jPQM ,#tbifcp$8TW)+"jabmmxLS-8h.+@4=P'cQg՞V{C Mv|)5/KYl@P&w'oM䕶 Ĉ u@ܦrb+E`Gm0 2TjҼD(VEɫA -baAyp n1xQXoxf5u!k '-9{i͘H*R]|^gF6-dʱ9INf<SK{%)8BDZ0$03,TE6\ %F U=: H2r50Vs ##^/^}O}Xqfn߱םܳQuОlݰ^l2>)?̤5oFyH{7R겫0͎Tۡt .9˛~W[k:J4Wry굹,p֪z~\yygzk밞l20sdRw;5^_ckxmli=xסyί{ͥ̈́kx>J"sYb>"~۬ ݞB,ُ$(ǕoUlz>J䔩02br¯wU*ϑšchvɞ"tr|9o_[w=:divNK^g͘veVMb&W6]vR9tp+NG/,\×<ޏpA.~O#B#kao_ x>ànOd\ɣVߴn&r/0ѕ٥ :q{Ne!s,moƞ)=C}̉5!G ANhkmfh@NMN&4 !"ɸ6.[OAnCO*m0#nJGKA$f8.2LP܍:85L0'h"Z4`3] >UЪP}Gʀ'5iJ.wG_opݞՏ}E5kO^`MkV#lƛSb5wvv"%抴$|O;WUnxKBs0i3PUcB%F8R:1vj!Td,aD`"1OLD*`zWmai.Gg鰝Ot SA&rWB[<9&AvZ.!UK9 a̩#;KUya54Nh gTTDPFI#9 o=B'5^YpOI? ;Ɨ_>_{V|f.Eҭ$s1cQ+$Xؔn!c\Qba| ҩP$'^~!9kѣ/n/LzֆTI Iukl'$ (_Vhpbbkb%t) k 6'1R@$Mc$.םburExȎ^|y??||ڐߛoY_ye)٦5%p~^} ǴGó?L-hMQ,ɇ6Q:ʌi{4ʔ302.nFyrJL$N?G(&jA%BԪygVО:8ym7|ggv2( q`w koc^Yq`/}0r{Ϟ \ѫ%?ZA#Q}R0+!<\z"u_~^ X6jew5e=6?ŋzM(y^`7|!iyYS8( F4$annO*M:Iwm_vYBSHJn: '_s?{n)DE^3m+a̗:[84VnYlA+#@Ui25FW7]߶,/$>K 0FXMdd&<={ Ϋ8C Qs[i9A%{"x.=,|=٬BjX7lS 1~9/o lIic{fimb<'(,"hp6w]8U9\OƌOYpPDwCK> CNv8:7坣tm\Z, NUn yVN+PSvUdl3(!T?n e I8JPtX#߷w=(\*MRI yYN2$eRM E@iUY5ws1Ϻ^LLW7(GzONB#Ug5&B\^ٴgY3>y yY3"Qz E1$hҲJ/@Ϸ%dߎqƲje"{Ȳ:#ȶ`v9(͋GcNh PAj9Ś֠Q+]{K+gm\GgbUثbq YV7[vúneY;ȣٺ.?7u%Wj\@xHÄ&DR). 3σoF縝Ea~K5x|Nuɼ-(~eov0 "5nG0e9d(Ly dY""/ !D).#Y1 x:ϯjb)QuBTV(Uww_ϑ.9Ef?[5l/c $[..NB'p{:^j0yYځoO?w\X>tb#-Bfl^<9qŕ$O1yك)Y4/־(-+ơ'8`ƺI\BNmaH!l3OHFFQ6BDw}O~r((EB Ku<;o#^ɛ ˯(BHyo]=6W#/#}{\^H+tBmO" #7@4fቧz9L8w֕CqRB.I1K|MN*:yx&-l>>Lu'Wzux/Iq}O8 {_JnYJ7]=,̕VpNcWG`V:e3-[Qˆ@> Eִ˺*fFXba v.(NzTN{K-bL7ҮJrK_m]I֐@J߭}0mW]lU{[.S 2V>x'{jPvn9%$*eO e:RuS4yW}ݢEҝ3H$ݝS:k; N upԪo @7u׫_W51l6@~nS,-UdY!+'gWr0Ō_)J -$q\,?۩:9A??瘣u2o$61WB["r+ iq;œ={k*-XZ{x%@Z]ڬMjyujۧ³L8K_jQWWiOмjZ{yQXZzv]]ovj+ͥ>ή>rB..qm6K-ki7ͳ 4w)A$eŔ{Q(` 1E%.$X_2Zw3>hi/j7]jeɒ|Ec˖ؼ z`mWjy>oE,}p#Bߏ\N#wD$ Cn/~&qRaz=՞2na$5okwv*vgTH9~6ݨ<ȝVs, hDfVN/TJb<"hWɰ!\xc8! Qz?oW<@G'ꔙ^Zv_u]͈fvZ)*x՜:v|9VJA5Vc2G6̳nhϩAڄ8>眨 @<B|)(H:tp3ԭVPQnj2eZXE0^4I:Yvnh"DBkΥ=׻{'TVC4a8cC ?>U9Uq:gRʦgР/{@Tq9Yܔ8xdr)j#sz*WBԿshtʾ_WAWtX^> afu,9dWTMnCM}-..Vz2Aټhllت=7ja|0$\w B`|d-+CLg9˾ j} %TM`*3WmBfE95UIxdhOMzl=dVH+Jn[__yȘI<:. ߝa<~/\#V9>RqAڹjOii`_u¤S!o_0کl tZh^=Cc0,37\US5]V-![6ΧtyQ*í;iRK~i/Jdv;D6Шo_@g:L'I `v6hV 0n*N[w!)_ʉQ`|)3s\Ay;pۘo_ ڽk9m5EPXƯEvKp\cIr+P5QsP(& ֐tm3%=AG4J8eY1K;4F|4m 'Yuuek(ƒߡT{V h|ZwݾbohC8>Xf^c:e(R^s:BlCiRB@Q :З׿\iR&铥ӥ7 fZOp.Ԏ#p龭{{~)mxp\2.l(m9! ((ijӃ/Gw:ǟmӃ6Bm΁AT 2DW6^E;YAApTPr1.q,>͵dѢ7}_7g d9ddm C_QFt0 _uP+Wa 5M/Ca-/ܢf^u1X{W>oR_o2D^CAՎG ctqZͧլgupnmVOXv:BU=*р. %ݵ(>Nḁ3R(MmoIdOل^NN{I ueVmI{:ݤ`%$?&Ef$׫eʝ`돾1mCވBa*07Eܸ0s m#slaښ{~Մxno-98yq,Kfw HɎx_nh4Ze̘gi1T%#Lc `;_L`Con]='h:O0 JA|?Ng`i2ַ'C0{`>G8nok/-$_A]`[%VxR>QקϊvUY w*W%!u[VUPo3ZMCv_E&L"[c^(kbP'(CI۬V%1HAQ[v0Uo݀^G҉co#y$ AbW* #jVus;V oG񔹐z'kU,Z=y{5K;eܧmW9`8zy3"q,|Ef_ƾzޛGlT*~-=m#`קx(݈0SȞʡBe~jd) 1K":Rvvl[td}+P~%]$]uyF(}Bbѫ"D!7JmjsY,Dy0mՠ23`=p%\GWI硓E%Alð_' $XlFQ(w?_nuCgP oa,i {0Ty] -wcljtR·78οژ PYB39suɎv<(À_٬4PPL6`:Ë"+';Jr00s,W>MT|E>s}}%!688^wu/nnae}Sn^®8v3=x_Ŷ?yA5Gnv͋GV95v[|* _. x9"L _%7Aj$#6ֱUN$6]l zУ)7D"&,'ۢ0d39i)x80 u~<'s+x;O4/'Y*a${11*ps"@ u*~('2sZ`/$[ಯDgZq֚<:FABL\O\)JTgP#FɏզA2(N-B YUS!rһSTg=UU|Ѐ;Rjo|)puvy*OOȏ%P,Ltm'ydݡIVL^Fl ExR!&"=#}lMgwzR4^ >^tLXhdlؗU=COaU>)I?L=ԉ!r*.C¼"8%=)Q|*hu]=kvht$+=-׌܃>ly7P³1ӡbC`<ɶDt:Ym9bL fˤnl5aM55J{B}ΘS?i:% .׳2G2K֖*n3,fk p$UnjHdQpߟ`V$2>\[d#⤎Q/q!/EX~vdm%|Xp4Pj6=C7ypct*xNg-R(X :B~ȹxE \` z%i>H!c 䫓b5jk$ jm䙑M\,ʞVg0LuT_,:Yԣr\ڦHxA3 WQ(tޓZFq7 ˱HitLY>0 19.&Ϥm hr5MD^JܦxW6eK@#uUn;Ac^T|sM4G;,H U,v2fv|[\2Pjo)$*TmOϸ>qoQwk?w,r-;]b }FF'$ۦn94-!(L[mZ|$̵LVx,3\zģϸ6F傦߮,t+~Fse]_Zjm7僈hiebfcں NF BxtĎ|okmrK#΢%j֏/X'*X#WPJ9ᆵ|ѵˆ{|ٴṛG[VFa`߳Amm;MVP~RbM\}R~/zr,:(T!c%+X1[UmUZ/jƍ +ɻR6`qlݐ0(Db`^I?i4:2/ #~jM2 "+6?\=d~$#H?fR#'WOJ,7ANtแ5Iig-l3,d ivvm7IE7s, ď"N $v!ip:;Ӹ ,^^@$A܋@i?g)EUOMc0Q"pt- U`3Iy bնb6۩.E:V5F,3[xY=?~4CD26T,%(uŔgn[^U a%O#^FBQ?m}+ '2B+HTmjY|MWZ-q-=xvUoƹQՉ!-DeXu}x(gV80b˹ՎκWs^w4Yޚf`l<#~dݙ8͹^lyɑhld~U6I<+aQR'Lͼ"1Br?<~'ͯ{fj˝;iF.l Md̠}8cGxÉj5|q}ٯFt~HҢx0^uG{ؚuW- @4"0FyIE4nRXVjצ\! 0$$AՀ@MnzY#FgE$ O]A7O|5ODlRW #w.TC[&!ށ*M'TPnu/.@4wTSi 45wPS3ڹx2{2Tk_7˅^a>״YS|"&m* =@/= QV٧o6Fa;}fle?=>8q_#&X1# v|0 ɲ!Ww5o?|=)J/7ģI=+N?W}LSq٪/XTdW_6>׮eOH­s r!k$k"W%}z2 EZ rH̪P8}FOB0(A$=)AZ:\P̏rB\4L Wv0$JS|0'zF@EoWRPjP*+lwd~ ss[x˳vt]08^@=T?a>;!kF&SAGA S QyN}|{'TZ6- ϤQiȩӳa 7rWr'U*?oP,tFbk"iU}oJ틨:>jy타Aw;ܨme a~{>y2 -NiqbAgy8I()e穗{_HDw WS!Aݞe˄|< 95ˑI8o)-Q|xIٌ~䊞67E0|AY!yD)X!931-<*t`P,,(EUѣ7eIv'@ CmhE׏ }x^WU&1?NO4!p ?ɢDDxqǾ'qn|@Y%8Y/z%N=K^WQ=2x K%ϫJz Gv;(L"ukIMs3{&RwgchingFm-Cba섯V~ MMp1 P^AE/ȜnN`bGxV/߁n'2hN]ybcDC@#*o8_w) jّ<[0 f8Mʺ~5Ş-M2E%QmyHuƠְįGJ\7lV  D(j5>wS Udur 1}yD-^|ufhy)qͱecA{b3%I7Qgg& =`'!^7D*^gzfkռ7}GjN?vqL=x0Yf9!<a gV6Cuz EE bٻ6n$_W3~y-%l8>js"5@_4eQ`YB tW}Kb[,_J#ÀoIQE>Lϲ"4p_\5feXNxg}}r}h|"1^)X,q:AՉVq$P;*Ët2 Rh(!v5};'[Sf䭚6MBZK ̀&!q>Lwee]]lZm[8 ^EQcеMˢ=\–!,Ito1ʝ[#@3J% 9XT{@uaQtovUk9]~n֯קベNtu[g?n|sV &7(*=`o*L95j^l9rx=l{~uƎLf4Bg1XʼnHK$#Vi>()1EL窜P.cB5:s??ίOrMƼ#sCq%1Xb@k ò=mo H6jI۷Ĩ%Pݧ5mfx9eWx諣7a:gZjy<k̢o @4*=WvN|PaXh 1^9G0049$r}-ܸ1훳mf*)Lsos|i!=k-68 B =ck<>' uܬ"Ƚ)=q^we~nk=F#(fV f)̀B[NNgǧ %=,ycvYO}*'KC>?E[͐qP)ыtl 7cK&}m3F?:90|,:g=-Ta{AWGVE31م2$2# 01VѰa :(ȰʓĠ&9h<=IoKv`e8\$ek\ȿP˾GLe 6#2>AЇ.fy acaSǚZKҚ$0vx*jq "{fJQ~<>7$KJrŢCo) 721 uik_O4*Cʸ)2!wJ}NߞjcޥVR*d!0 1*$8PCa"4!׫^Z":e0O2<*=A SVU(p1DS1pC?Lo{fl%=V;t (a%F".ӗyP*I:9`Y})tiVcb(Y@/nk"me`zm[lqfĜ챟.R sRFH25pO!*K2H%HJPn@m,wGz4YsDU@+~t*[H.uTMxkj F0Cz C aރL2 6}AŸY[{C<1T 0>[R/>͹ĬD{^QehFo=-+f4ԬhKi R6#O^fo(s1$1'hA0`Wh`1cyyV2bv(~z|{}N,/ob4;L:Ewni V2EZdJEuLF ΋RT|RcnrG&U5 %(Rz&vs_(I)*Q4 [e l4Ӝ(hN i7KBl0qh-ɇ'>OMxW$%E.cѯf;=Y,!"aبhƓKECdL%EYC<~ I"Nq^c-xX1iDn4V E"=(yF};Ϋ[q}Zw~L%~Igf R\wښ.BF,r3 4˝OC7a }6D+Y-Q$i}yt .xMb3L`Py0sw1VP<_ W;QpS ;  E^aŁ:8[鞁c [2!'R3M#: ԔW7Sv>CR͹XթSƬհt6Wlggg㴷]y䷟!ա}6 bދ[<כ]]-#;Z:H/lv@#{=(v"4J͊d6d8aBD7]sa"H1I-EcERzWbiGqImE$,tzaLe`0I,Z:;U Wzx?cjGW+ëò\26>!Zͧ̈́^Bj&ϨyZ^VMysiڛZ^]y $h{Mr|3/nWk.ʺ/$2VzLOūuj6ؘ ϚJߪx͙yX_2ĶTKx鋇hzy|tJaЩ t-L!Εl~mb37Վ RB5qe (MZZT\-kٔ5$!J`]vZZG g~r[u+  I'; E| !=$A17/+zwIi=JjZ,iy/yGZkxm\Et4 !ןʯ!TzZI$eVe>Kga)w䴽/V痝2l17tà`` ;+6/5\srwFūڥ{al S̅5/*F!aX"knz`ty~]UqJs8|q"kj&:noLr΂^^Ӣ\F⃀M(K+{}ЀgP(M T⥁GX;OWK{ŲWeU4 ֬K;tfGv6Q.VÐQ7EkY&3H=2H6"H,=1Y+ 3!5bgL(l0ݛo,ZCSl CaIIaC173w<':[f3& .X‹$=fI " ЪxdpL-^%Q˛+51謀(kCet:f@힐Gc(6VŽ$i,/ 'HfXӿѓ$wݪؕD~Bq>?/Z7aJ`=,9P5Y3~i: w~_^@ă햷tYd,PI[PDkV>xƧKI-Oo*cT^WSnX$0Tjv5QbnzYܨjT-C _JOTT5jό.??O1ǯ3ݰUCjI-{9o7b)#^&@׶hF q.[G2 lVCZ`Jp! h+{lq&rO ׸]+sɗx[\driXr)GUQr*2(lٻ6n%_L Ud+JJ `d)K̍3ڦhEJR6F7nO(nu` \fsAk^-~Gç[;8'Q5q>B~kΫKуI29Qa8̬t, A+s|l(w\+cً>?kn,<Cvzb1PCO?[52~^q݋5"L`eC92j+1p[vͻm o4TNVW؊"ـÓz#$ DvͶY'fjwķqI$t-S4%&0TJ+bfĒV}ryp!1po  zR){d~qioW$"wי;(̭[:teJ%H'KWN'-i+9lp3yKG0%bیsgi Wj2u&e"?"Wx8'SLZҲgpxL +ۋ7=S?(g?.iM+g(a!!6$H+ LJ( 3򨦜8Sn25g4?[LMƦ}<}=I}nX]WD[o!g ݍJ)BEwq߿qWs!7Lw@ ˔3 E\iO*=+!߲8 3Jش6V2b];ܹ⢓Cy7zYV7yܤT{r98麞s>{jooIlpS{c>r,^:>OnT#*gS|>]W떢`;.'> J8 oеu1wPa[; ͅ(&ȻAh]//ke2HD٦a) P >IFڂer4!I^NjVKn/j}J~OEoEqy1frkMy1Lrk^ {~IZ"bսP7 z9(i&ԗy#s5x6;,B GPS'RL@ɰTi2V[򠹥ê .~ G\όMؔxPзt"b݆[:lyF![N;6CsR_({Kq|nf\8։'b "2e:c8rB-*e4@g0j3-\`:n[Z>ی;n ZbjXR2CوJyG|'glN9DAf-M%2Cь42(EU¼hO-_{)Ol vlI=;H AF83pG_V1 `*)Q`ćEGġN۲ơP Жx3.ڪ"brfw̤rTҚx, xD9(ö́`|%䈤Ÿb0Z!QX=?anEǥU&N\v ==8*]kyA{lgIi9SFz>7'UӐFysЙdE?XV7YB]k~3*~+|_+9P7nH,&:O?ܷ6η])HBrtq:\kW-&vhSu7_8z7;DuYA:6^v>~ۻjPWsàۄpw:Y*}Z\2Em.#3;[SЦ^U>s̟8(kB.@RK۰!-uכ]qm" JF]a1#t[WgԪ9w֜TTmoL$kca>o4V=*jVPz=_t\&Lu7n0P3.if çxz+^88=/o|~ahQJjG\t6XKF|0>V0ؖr^3G"*OO8ZpLr ^Dh%@Tp~36~ F 5*,cv7:J(Ȧf6* wŠp6 Qlţe)Oz=LɋDhGrW;+)Xes(OԦNf^R{(na_P&^?6-^Z'*S-$.i],qI=׈@1BkR*샋gG|;{B%> ReJq!$ hݯQqݗ{zBeZ[ZUqNb¿m WF(" I3X6V)HDPZ~g-4T"˸$4nOf4F D*gax(2p-( ԷA`\}""fbL"#d״M։ʭיi jnVC) uf)6pwž]LH1R͘JU3"x\!d? JMUd9.]#` KN K& B#۪L褞Ua蔑l,0qo!="!D"P g g4ZM@`U.SWiQ"Ki<Ηy?CqU)qː8]U[ ;(_rcLGoV[=9Q F%w vnw<9:˗ + YN2@LB,t<#SH6ʿ:d}95<WY&݆௲4j EGv[_n?c4ڴ *|ЊNv9^wnQ??"mf;:jǽ}گ]KQDq$"_du-ɑ7y&<#v۩\ 6NŒId(eiƭY(}.9y\:T<<}dăfeW 2wv6zb1g'ԗD9'JV&qz5ba>BHzŇ)WAL.%\j+_O &#T N 7frsr~R\[f+c&%qBvḐapZg,t磾R@Si7Kɔy΍R(n z>ud3ڜBh.wc ^u~u6'_J-ouߡu/ ܣX1;us[HքbJ#dCwVC= 5 jnG&mooI̜f6J(mA? &a9 \R7ZH/ߜqh ä5S@Bg(|*B-Vj`eJD%0e0Cfqe|z(~kI:6IE5hSZuccM? ½50'!ט߶T:ڕ)jy)B+=}iĈg>+n/ocoΟ%;Ić|6mmƫbnC_$參7G{_~·C?$0"Fj9@'nޓf`RM/}2OhWU|F jHa%&Ph)$QL.HFp2O (j<R,|Q*^sWDσ!h:kIZ 1DL`dϑ"?~ Of3YtZMrp\5(B) ƛҢqmԱQQGwۧNOYc3.iڗlƨ/ЋkbF4"Lnd)H0Ѿt018BgJGZfR%wW<;݌&:_+[X)H7ҧ:ibw>ydK5Hmn7)z3W}?7Lq)pd._(z3"^M/]:`#gٖ㶑}W.lNnN{dE#9O*)ϐsfF_\x'Hci8uECt7ݍ<Nɏj)ʾ l_6j[O[6mb@vn]6;)?( $`a2k*}f3$DFH` cR,doͯ=rLy $Zo5!-kGx#[џTVb&+r@Q^iU H>"Ȅs@L,}>WiY~6bZE g 4-Aj`d_E~sVX$=hG-/K2-giokyׇt]AEzg]+0%SvL7LPQ0BH(Ihl.zcH vn_<6?˽5}zKAMg`Evhqh́.MnfaefS'a1 qy.|,*Y~Ӛs#1Tt^M}ӷ-;s`9qå["vXf /n=@fwLJ2Ug 4; [_k]ş ̌]Mۨ)EmP8o6eaVUp`Z{JʉAq|xHфY~llC$ea T$&b92Ɵ \^\x_q&piH~(4 cl{ԢGjC|O+6oygG]S7|2kc ppL$$HLoB+yAI'!Dz ۼI[d>IFH9R 0a@0FAx݋)^Zl+ÊE-qhZ\9e2 5~P!we>Be<(_lΨrA b[]ae:_ۚՇkj_ث.[pL4GS]j vP߷kGJ{S6V~[>Xb|®^䘍Osotޅ.s5_g1Qˋԏ pQ=>08B* HJ9"Jhi\e7/Ňۦ#^* p{O=mCyVDG?/u*9[Z L<&h~I(5ҼR|9g!L$bΑ *!Ip?_/f"q$*9tT^NoE2pO,+Y`{p.n'|{w"S^̿YjaJƦYn_ _WWbm٘VE qVeHĵk'`G.(^!.t(lgCH &fm1ц!%P(d"P񘆒!Syi]daPk~$3YN˟IwN,5Yh^EuoݬI'ДklPS&Pa40_c_7U `+$S1G.aLQ4Jp~CzNo~iqi/5לhjv}0;:=atŸ=Y~W=v;!T(@ ٛl*ɱ07c^ Qs J9E!T Loz.Uuz|4 fP1yQh ׻éMeUPi2M 9&N$iD/GtT7,|[1daX̿;Gw3-zV꫺(ƙmͥk0*pT!Bp̓NΘ4H$F!%&OŔ'D#4TI#fRB)"aȔ'y!^Iwl6o71p;_IcW pm@ןo.wùZZh,`zaͭ}nAM㑹cGF6`'?4)I Dhq)) U ~ųy.B6+fVJK^)T?s }frzԦ 'Կ0O]Jx%)"P HB}2`}?Ղý:@`Vj D}|&uzwwp"J|YmCL4QaXM%4䔴 \`vP\}<^?NOWD_n+|&Ǐ'.86(\ӯC15 -t/FW~naدj䩅!6,oTW母>8Y̏1Sc0ۊ洦Q1znUjRׯnVPkSCBF'}z_'mD4am3"T)D`(O(&y]1ul0v|~6+[iW<dK\M.T27 y񭽁?婭":כū! B13h_D*ѮsZ٪֏G_L1fr IX0 \'LPi5[Q?c;Jzs0 >ײjt0xznf m1ϫ?|z!-@E]F/B^%0|zu< =;'ZwАYF;',mUR;/iAEgCp41)gx6MgsqkAG%S?IW#)mIVxhL̞{V&[BWeb3^׉rѼpڶk4eXYyN<8Sv]d4}rK W6k ?NZdU`PmB,hZ5:,nᓺ$:xThWt2O j= YD \L%nMpaR¸6IFB(BPeKyt#DMq ޏ^S7g{|^oj$ u]0=7n-%% H, cR Qv/z\ PYӂ0@d@]MK,/q!X "Je L3H4IDV8/Ίґ̭Zjvc`Bk71hPl9'-!rpnNh8bJhB#PF0aq4TT->B́|&hPqMX^:=GLlV4ȈAB,L\DͲq}8غ,U%n-b>=/9X`M7j{sk@/C=Bv~$.F6^"\ۯ2gɅ2-^52Ss {>Di@IO&՞;V ',u'V+s~[> O $&> HeI"{q%+Z%_5d{#K);SI %jHʉ\x@R<3ޜEn @7n?4|⦾x hC6K-!A} Y9ȤE3I0䁛hƔ;"*Qp5BSH@\p̴?,[GO-{bJn/hߨkf\S4hcCH\4Qȉײs5^اe} |M@cm(2 |,.@"$/b~>OwcQ 5R6Ej@ju`.Pc_^i𙚢y渋Th͇ZCCheoT#0?=A^T&``4"f^e?9ќBj-_˖uAhw, ظktkz,߲ܗQ[MMjn!Rv? YHr$\ώ\ -Zޔ,LڀzJ`׏cnw뻋#R5 ~.: 46Wl_m brN0!{q%K.k 6Yv& "x}o,S2p6 -xƴ[H`w7TPߖeDn?8 (Cp/zB[a&#!Dx2rM 8nk_=َIGWqve Jْt>9d~xޥ47,fAkr$*OjY4|/Q .c~q*UT"=%r*Z(wBQJP/"U6<5A:pCA###QHځs}R$2 7h}t2#Zc*yQ !omS|g>R(CJD5xT#Tj5pǰ#_&<"fLV“#TDU],du܂5,"8쉣YV LEeVjT)t[v YB6(:hDGUJu!Q,1ڣ `"q9#jY`;"BdF|ÉBD TzQP3%wr'Pe;!\Z nN 5h8F9Y,#&f'fCG6+xuP~סtd'R+{Ѹhx7Ďp]Ҵ瘺شOie׽wx"_uϳ(uӊA?8m?IZF( Adia݆ J]kwO؊B,o| WǷmCò5DqCQ~o ;~;ͷ 7 -csvvR^m:׺16Q׳t;/j L4h M0u} M;=#14/ݖ_;$YU0/Xn"$0-GYa 8&K Ab{Sjzu7aOM) ^HwLXO "&:#l %тMsT{qmI٪\ Ib02mCq&tu/H0z0lA[ ؿ$ooF[vd<;IY@M6`D,RCE5_ۡWenj)2fr$؃ ImѯC Vil)Q=E{wmM͖3=%:dz/*t_7R$\KlBaؖf8QX|=JbG{S~7h$l^9\ǫU C*KBjyaj,HY1Kc:]u؎zl %?I.DӒ8v=- $ FS& ]鱧v¥Ld,i-6yV7k_g;3TlL4> ()iYצb7ڨ0iE3M!q\mʱLwd^;osr&222ױDK\ρ=a@t|] (4=WHNmqׯ_-o]U'D# v[IMjXT um$? 4UvX|4L=KX@%Ac|ܡ `D,( p|'BC: '<:2Kv<+384a='S[$gW!Hӳ @(JAӋz}ӡP۠GL-gj'u..);Iz|؛$C]q(XHKi (>2?ȳ(Њu`9lCŠC 17v75O~j5\=.>_*';ڶ*?GոF<0[ܪ/h77j'^/xF0Yw"4AuK%5Wˣˋ^i],e<|);-4mݎ\riwD4ό$l;EH*ngWn<ر^_U#rpJ`3;Fس6Z$nvP s$G= Bx\) Ѽ〸 MY#HAu{bcO2b/+Ac8qZWz@K>`˰ͥd?aQ))S X b,o%PU-}?ڃ31 IjE J3~x+8 / 0HC9hݺk A%\՛:H'SI׫G%NBh&7'Ѥ<׼HPG3.a_\(4-՘S/ߋNcO|C9+3_N.S/KŸb6_+;bOI9]T_+sw|7U:>B"yA]ĞritQtW;(Qj< P@'f^;ɫBOUx27TQ{MgH6Z4ߺ wpIϦ]g#nDH)=|Iz:68 Õr;)AKN:m͓j"B&;^AߖL/5est7XϮ!uVtoۡ7P4DwK-$C PNw1HtyO$3Ȃ*92˟1,=c>qZqq;DL|NEKF] |CPDŽq)>deIz`~iRUsHwU"Fz*7y64zMSrs{q)NՂoUaܔlRM's~ IlY4˯xNwzm6- 7HMCJΝl P3%j1)w5DAM &Pg1@tCb%8H!$qKjU!=2RdPun(0ٷjΡyyΒIJD{`=\"as;e`;u oS}e$H=WO1>ן,)!ć^ 2ـuތ'\oN'+JTt"Մw X]NY-Y4 /:~֎1V$FX=«VG lPy7-]v|I &+Q5Yhfe ^3lqۿ2_n{K󛡹3&X4n⣀HI :44 z|'cg?=+ _IZ"-yGfwd/I"}F{n2xwpGRwrd^rT7b{$WB˂$ȱwwqHz!~HP6lOՂ.<.[wŖ=}4,=Tr5 lq5|n0;)>,@;5 罔fjHO,?q`"C\_|êWֽ]{Sqt=F19 -G 3 d-{B/縮cQy}I+_Sg0,w [ ر@nEhZ!ɣ vsPn21_Lo􏠻( c)4Z뉸:$l}&ж^]fmEӦyth%T/⯾;u)l3u@SQw}VC;ʡ$Fޚ:inoFY0 U׆꘲Pj6VKIEw'QR<멎\0Md"N^3-:Zz_rS}%Ar3RMUv4Qe+:bR4Z}:iqx[\_;;<2X;MWC:ZAHt:Xv4^br,CqFBReA &i,jbl J:NlqXK; _=r8 =V pdNU;INK $A[cIJT/.$(mgKbu7&эnf㪎>ߓ+Z>Ʈ.ƢJ֙{rV)hOۿnQ 90DŽqn3+zZIz7r`'a8e7.7:&gd2'11Fcύ^dMo{tIRqhn@!ȅJ1A(M!+b4 5pȺnP4_5qP-60UҰQQI/us[ЅLPe_:̫nuu=/8 L a2Zi\"/+1@2<ߨ[%KP8kRr۸n;m F)e ,@ 2cQ0CPH,1n6؈퍨ShJr?9&2E#o+hE-" !.{,D뷱_r*R edgL+^ 4WX`KHv#\H_f95tn6Q8Іq7Rh,E/Zr_-aaoĦpȍ}^ngr^v9f<1wPj) !Xq2EPNhNrR  ݟw~>8'~DGPIZD9Lpp\0Å 7(X2)22Ky9.2 JXn]ݓXeQ N& b䎊d+g9fq "K~y 1xÜ>T7'ONo,C61Ixf3!%aӽ /^ֻ盳=#-o{sڥ*o矖߯<ٺ{03ۥZȦ\,Rկnz>_MuY=eypז4{oeAf WYL7seo?LGm}2#Ty_͗fƾWb 0j3V;lX') t/vS'K6cz2|RmQ rQnl>6b m{u!FF>Ew]aCn#XVtqR55=" w=F7Or} woǯsQWr=boFH\=#.v+wAvoh?b^iW>u[.?2&s,t g湧תn0"oK!l3Y`v,FͦU!c}z 7 < $0/tgMhJ{oz74* "ާ=0σͭCʘۼԴ!F{Wjp!fMN21o6] 37Tm"9MɲIi yȦ־Vd\_~R7~2',mEz{6ւO(]Uӑ&ߓo"s=ڴ"62L5ƨR-9QxFb=_EϦfƺڥ ޅ3`Xl]EoqMjOdjx7_4^lt\v$Wn{u&J7b"VH>e]F-]Hvpe2ZX'P;evVY\|`T7:^U_!re) 7|^g&R aM J،]ͭ3Adh&E6LTo ƣVפd4! 4ie>+/]bX41Q fa@saث AQL)85efK@Tn6a=ɩChU@;,,iV2 ' vto_o6V-LQ&+r4:EӔfxJP_0ƣ m3vVdmp%V]\}0^BY@{6"<urWW0i[~ӥ eW CZvXPփvVm PMG&lu2wch WcU14 :yU|])!]P=ȲGҟW}Vef4[!]T߇9۶@^tO*9!jc`9 ^ ë{/"OZ6bS^0#Tv?a|/ q9K%BDdc X{עk?LpuR^볁V,<,L׹\m_J2QFJAue6,̸q{7o.gBb԰Z͙XeBf5 dj?F'FS5'0';pзuv=M Pꉝ{R_7J:!Q#ty29}}>sp|+p@ aK iAV_ݮo3>}Y4}w"vI=DϽ?IH:M؆lmF=A}ylqO &r:KAE6lKhJL!m^d<ϜG٪W'ƚi{q(+9-{cdWL ԫKϋǗcfnKiW-ikP/Vjˋ;E_Ï[#+/;6 u͒H"D?e{g1)@@Dgㆊ)XfhMR07_)4ъ:* l='~ޕ~кmMff)Mó=ƴ;Cd@CG/{C*ߏoR{iSyy[9`/Ïz>^ovr.\~ojv8cy𷘱3pS]e*2cc (,olpq+  gD1.\"T m~,Ϛb<&c{ˀ!tC1;;N4>*xBZ]33ftfRAnްWU\K(QȂ0N#e.J!u*Є㪓^:r]4V}E]TbSG1gT q9FcpBT~oH~ox8~ޖÐrO= Շa@G5mYqQu]V1= Js nC_g3~>d3SVIrĕP9Hqf*sKsg 3a F08iKSm;nw}E?&g$ɞ89cgzt@\Zt-K d7/`KjK4_A(TXT0}ѝ)h~3YW㭀?̗V3mƐwR緿r8e=:*xPdD,1K 2 a^LAr$/ߏo^;ݥLI J BS$iG0ﺪ}h(plfس+:}SZjR ˼HteozC5ج[47bDY@UA s6oYBdDt-nv x q%K{[-S !DH%P &iHSKH PiLsvg[4WNLDjlW'ˍ.OTfL/] ~T؁ 뮍g%K !S|ky#> '"8\<jQLk0"SSL岕uKsNUNSZ^\Vm3_eY g8hRAVrw[4XP>'q;XUͷkeO]a8y`d, `bT3 cH4 tgy4FhLﮀ˛X/ɺ_*_FPxx?_H?̘g4ZRw䈩o5Cj:{ǫ}- ֑O z$-!f4 I,w#~4T0 F.AJR 0l-6c)l{_ 9﷥i)t벘 בnoO"}נ_>X$r t:-Uc+jmbRXZk(,\k*h !,>mZ`)[OO]y#_*rD-:J_E:/GE~r YcbB{1c@Sib8SEn"RmOk=aCS2kd€k)$H!O^pޛK)ϫvΟהT.`vU_2Ï?:C9]ghmf.9P 'r5BF|Bj=I fAxzցWڂ,|W{lU&|J7#Q9йpck^ Oln?(ق4Mf !UZ0&',*}{M ڡxN],A_}β=Iكa~hdŝXOۍu k+%`LnY n`>cş:-]ֺwcN"S:#R`} + ќKk]Q)K&łt)^#1\Qdzڠy)"7S^P_*4B}'`F/7bˆa)Hbj* tƞ4Ϯu5 f+:nFٸ0Gh&aW) PS6>h]ߔz:k*r벹T {UKco Ad&`2m^4}2Y^,y^ " KCFz;rΕ$by5<޼BLQ2fV˕#Y#XiVcH9lؽs9Ű cV 4<_O΁ h2= ̯j{]Xtj iuSYXA2ю[Ä/bQU~֥.VNJij@SEVi ƉҲ7#6>YwDZl#EOΊ> 7/8h 3b&޸d㖵cyͻmBϑ5h\X{]|÷DH A܅:ڽc(n.(Nb!nv|ń) !@ eJGqGiy^,ziG<3; Xa,eoh_W_D!gͰRaH6t \Su"w Yh]س7~ofDc1FBcɘ-\{^|̖ԅzЂZ(XQ,URBPqjGp*a:B))|EA<6vsWw]IAQ{cXi!}}j[IK7 Qg/sd&t5c nrbV8stbZ.Z];UFP RɔaB FBDg)N7x,'v]SH:rYv|;]W熀2c/Aҋ;7e?m,?&eѣeCBm)qmAHT K[HHiC3fϿ/o?me~k_y I"k">uh+}egKߪ]hg"cu_Q*Szv|(Q =C9tO fIyX)"*Ŝ)("ClpIǘ4;7Z_Eise=?%iO8;ϻ mCphvW3;jܣ)FwiY}盅m^D9Ӗ?Ey.7֞:t->Wy3.Q&[(>R­2؊; J& q̘M!=eU2;ܤtxy+F2Yl&q&RUyNy_?#NMYAQbS vn\N^ugE^ZmգixڇF"#&-XqZfk;:L X3P2 8,5)lR3;vW 5zSWGTX:6#;EŞ~;점6f*E 3e'"ڤ6EH.7a!>2M>RօX=.kgK̮ӭg b>ԕgش5.V:7ZdWTԗUNq[=3\ʜ"L h]ĺONl$^+}jJߛiW~2Z>;2s>k1qH9|.`Ae);F~Wȭ2[RBbzë-[n,Q"\C̚.kI +jW*+l x8HclѹtGOu=EL^BεlجFWei_۲|Q櫴o`$'*߲:dAoaY E7k;4׾'6&?K%^⍣'c{r]Z"6:auuFϑ ;CA7\1ID$,E5w=ͷڊy*FcUHONq~K ʢ 4uJ#wu[PG?^] 9!o`383ނնh^N/5'.BڑFBbZu95Ỷ<ZiQ\sXoîjnmCׅfgue6G87 VRoϽGf`WVbAǕ"_Y9EQ+=Y^e`f'I\AfWĢi|ב$6}gUdn"! $}+V+> P `f1&ƕH$)ZŌ `,N]tw׀mHK|Ug?4? ~ 嘏rF,)ef { t sCdt SXs(4JQjTbk-RI9 ITj><#<^y$v|F١׌xh3m9Oe"/M[st2d[DX{בWnA( 0:x-"+mS<%FcOfo_d}vIpg: !DkuͿk-l2Q㘣>k;x@ ½eԘ/ һAwESh`J3mbq@#)0ͿQeK%ԪNzYgFv}@U[]Sp6`xLJ!{uwwD%L("(Iq=]HkSS,a*f),!`wt^\=Bf&[[x}0xԕ ?`\Fڵ $M{xG^0ೢ. mX=tO5fYje_ӗXmM[ȋzGe9ݔ&Ap5W8X@kE$ӍE`^3ݣiuN/l[c2ވ}WIy 6 ĵڻ\ ,ƀsn+Q{Ls6K0"! &T 0.3 &\w)vnEײ2Fc[aDSi[jL1/E͑[R19x_5NC`S0wC"Ɯ҃?{O8nJ( Izfz&SNzڼpX$ί_<L^ߍo/r3Xq}G (pH5E?z 8lw+ߜ#OƫV,pRNضm BHݷa̪Q x1 la(a&V!>-"<;en?[=c\֛Q;^?gP_ʋ`sVq֑O!t*ww#G<$=P 63N1I+|j{8]NJKmՔa3mɰ2)rю?G]w{.0&dm?~w?oJt,Uo]=uZ~~\&ݥԗaX%y7eYTfo|W|E;<^noMR1;\j7|QUnM½rI#EgFݣI#,wtaܙ4B`*#"͎Lh7i 4cT"4V)$:긄>^gmWs9̶{Y/jUoښk{[_}n4Ԟvֺ\ލ6Uxa;{Eָݕ},8iKFXe_G49z,}Ub$2/=)x:ha)R6zB™_)QU2R2d%$J@)qL)J1Be0uˣ_G*nJiѧ{۶`[W} *r?8~.e$H4ٱ@Rnݢn<,6yUF^UեFi7C܍F;G"ALĺ˄fEmON,4N6E=qМ UC/}ԯt5])cq r`B;OriSvR:IX~Shcz~WۗuZyU w֝N$0BA?N0oH ˊK*S"Y NgUA Jv 8}؁F.qbQ$.7lrk]cG`ͷm=KcxaR!掔#vWCON8SXXEƁΐ38aYF ZX %paG3 no= }a"~TJPG:UB|&)g;E3fę1P%ɨƖZH U/ZL{Y̘zl-l);,2:bRei:ƒW3)SE^i:oZ:@D&f[G4.*.jv~!5b,tJ9aSWyPVK5s$rTXMτw\N(S!p{mZuulL-4=M{:Ƈ1ޘl2 |,tO g086KYa62ɱ^$Z:^ @  +>fv'xz_"9[p,kΩޫ9_Z2<'jN l8'b!ί@yX7Pq0xEEStY\N v(ݝL *iSib$2 r {}{T7;էs๲Im ~n]ŧ!{~h!v̿_hxKփW տrCzk YERX/o0՟xlW[pxLyܻgbX<3`Fx{:Y.6B0F·6J1eBsf)pWXRjFΌT0)1Jw@vmyL 9zw {-Y㓲uM@֗rlJ_c2*oCY (Br;3@{}sف5%pr0IہoÈ$%vEO\B8MOIr+-H<9VAb"i(· ]/i%J^(E(5ġ]LmrZF6PWP oD [OΪm1?DfJ"ΐ$VD@ε,Sإx!t8c>rw۹#.xH!boIP&I ڊH7C @F a$lj!`s̍ kĜ%Rԝ:/*Gmmq|9ًWb>Rk_!gkb$b)ŰS4Jq/7Ug/Mk!$wW7^>;z?tHfăyb*0} /-h95!rf:Y>{>}&@gb bR94X _.j>}?5@*xೢ&^*?~^/⮪?{"Xܜ 7O$E4UJ zJeԦBYjR\-ԉ*!PC*+|现tnnQUe3g8v 0+Jfy{UhSCZbW+{Vv1D])mtvugmO4yGzq{:z؁Q%/G/C9]E$fqWBXd7ufsbhdƫm??|\mK#عͥj gFs}dK7e&$q&߷>Ws156.e%wEר<~8Ƿ?)..RkS*nvڮu667f: vm1|mݣӱ+_)S+.g+|_V^[7PH@ytY\$߽}91"+պb*_b^Z"c瓗@w?+r9w~6t}q5U.m~d\_@ܖd+)2qL㙑 GN@,`㫡q9\~~V 쑩?O1eq LMfD܉fƝz : f@:.%Hĕq& +4%? %|Sރ.}Uײ/+E@9w#%|σ~> ȯ}> ?hEG qX̷Dm|l%P栟{H0X qpv#o&\}ˈnodXU,}%eIRf22Y8nM& @Ŕ$ "K 2m31B~7Ss|h9G L#{|iͼ <IN>.VvA{zTa\33Sq[PKsa=1u!BWc&N⳷*5)j?EL2-D4iR(2!Ehޖ`OZXQ`| /@4L1pp>+ߞaaK")+IU,Mn}#QX \"# PeB#.U(@ |CYr4JB=dH-v )$oiMu\.&iuxH- an,2Z$OO`0ԲL{]M8n/֍FMQ廫ţ4Swa9).˕*FK4LK!t(2ι|4OfdCk*p'y ;\69g7`fz]믤ʽYodf .B6l4i9,iPef;ems|jp_QζZ׳ey?2pcYEi+2Xi' _1*XYikM^⓭LGF6aO7ßG/yV dV9AFbh̙i[ >ģk42j$X0'0H#hJ2}"f N;ƿoĽu藧_NzG M&ˌ=e|SS:kXO7F6vj\1,b`JӋ^'ѷkߴG^;ٷfYӱ릜}Ʒr7U榼e]Xg8q~Qz/8@b1iMi2J[hz<6эY !L ÁpT‘)jpa$| m/AdS\6ۙ"0MiSvoCHٌuSmf1W0qZUPJ)#'\ 0L i2˵_e^X8I{4#Ճ]Ȩx@2) xQQX)WTD2eeHi2Kl]3M(2k*~NU7ܠl^dsm=IEKkb#|vؤmtLd*f+͗f;MQFgʼɊj5W ~R۝=v,Gm2]˛M}>&QCPoH )˺ Fda1dzu_\گKYa@{nSxSR K6=Ek7~ʼn7DOa@ BiᩳUf\(eCfʻ$9*I)0gl}wg9hHƮ=1^#:Z݄t4-Qv.eRȄ]S3vao, 9 -l 4Igչ iFL5x"ˣqq>Ցc G}+Ǔ]g)#NuЂrϝQnzү6ԇϐS}*_*&1r2$bH F<3PGw*@B2罦ta(e$uUWqZk&`Oba gjqqs;%]i:.X65gbiQ; ^v|wgGYmG<̣M.OeÆ?^qQۉߤ5|z:H.ף5Sgdٍ*zcm+wT3ű,YT>we+.uE┢L5n3V;91&RXCR"vϚu7{;{y"q[Icyxu7@2$t7uZ|,'$E˸ q(HV% VwglKu afߺKn^6,Pkh=}0RK G=YARRntNT-Z1 BDD"H2&G 0b>9<(zddY>#z<8pVҫ[qIRo{l(*aQyZuǙiB*`-ي7YXc Cc^ߖIap( J*j6Ch"`Dx\(MYHErvi 01)3ܣ&Q ww/?B*NU'o0J[UQP):禪66;s5gt'õt0|g`&L ONhdwD"8IQ²0&9 qNEE$ q{y";``:KGhG6==~yR<<'NY5]?'?WqYL9)y $T]Y̕!>l.u阏<-LvGfVxnaR' u;DNy; XT0!I3RHR.B-q"ʂ^p{ =g2RRUhSyaĝڙ%ncw0/&+"̡lj)#ơ ظn[2*bXFjb֗mjZUJlYLod-o/ H<)XcUuˮd. !61]w{PPh,;iCks5S!Ȼ(#2SiC2'q$pKjӔbڝ/mT{4o42G\))o[Y j\]zƕ >2wLCpF(O:+kAv"ٖ)y>2B3KmI9E4Wr#ȵakbsϹ]5[[BjO;٤1l3de.轒u-sP1/xez*aZoA|ҋJWb=bCبhٴ'gUQ@Wed]E3n^r1]#IUS <}sohRr$sQm:O7Mn;*fϢeѥ.?~cٷK=y`hL7nO% yՊ:u%er[zE# wV46m ev.)<֪nMuD5@њ؅Q96Ljdz@Ⱦ[޿n/qM}zW_R9W:؈{Z)JN(EQU>\JI@1C" x`g^>}wתZ{|{vpܺh [^}7ɳk C)Ygٿ3܉#>.4ə`"bQC!@">CO?}yO{|0^ʫj {An|+VEeb˼eU<i4 *O28§tϑQCaMc8$1ӔSD0Ǩ~(TDv=бX6AuB1=Fϼ{ a+~Ӝ~k3ZX+AؔX } Y[v@(<8 !G<`DqNLOoT,LB2aiz*yX"9ϟA'Ѹ;Q, .QcƘg)Y̨*w?E17)Ok6e9۴wի^988SOʌ:zݟb[E!X$B(a G0J+Üe,/j *ˣwj|ܑ0e[!Nq$uȄq^W`O;l5B0y}&LǔJ۠ A1"2wc%؛S19{C"źvTg32Ʈd7iVNw<#y}e-ᄑlɟpo-&ùvzˆsVs>% f]uiF٨- f^o3/|-QдηGIY4)'e5H8~s_x F' ) 8Ҕ<$9^^H5-~W7Js!nn#nY12:r錹N& ~dzIDu3S|yOԺF;S min?nwwCF4I~]8m\8穧|+«ZR˟q<)~yqKȀ[xL9\tdN`q7˦ ᬍqR_=aBzUBd#""Ka}zHhԥlǤ UzJp"ShjT:ZL/UeWVM5@fOXB6꥕d;GyY1R .F$9FZ vu|[;ͭut[l/;{4QFu*r]xyv˭uPΫ=T?(K7!2u7{U*D.0I䔰KV/UDo:8"ɓ8%P0 EҀ Tl/F@>U9VZFI>~@yA". C< d[:#s9e8 ycaNL(CdI"0Gݕ;:\>sPqx|4')z͑F {D%LY&!_%Rv>0 ڨ ԑTյC K}vbmI֭ O3Zs7Akp(̧U>8%>?|~>7Oo>~OF'ϐҢ8!Իo& 0NN] v-30OU2]}r'O:ޕd&$B%#X%Q\Es_2#*!Tq4b*iQHcAJv7u9J h 4l'b6һړ>A8ܱ"(=rtE@ V{ jOsC? -:.ЂVeϦIDwJZjxA=ʾ5!}il[{W^rQW k%_o%*XkQ8-i NkRqNjm|fMUïH}UN^ Cr*rZX{ڔf[]tyx*b[cph^ĺt@1,\Kd%vZzl*GjVkG5TkeDզHc=E%m֞snwn+tWpDuJ6v,NGzw[hx.UuO΃ױl좆A7PmKqV9>?IVEeƨvBi@btuo[php'a9֏\З:&; |mzj6|bOnu`]CtP?- #דZݶ&!|AkhWVY*'!&p[0}lk4WO@#iJN(f`hAv} ހL@ m&ndڄ ٸc= GX&2FiM{d@9A@i#`Z9P\Xa_e$D';Fm5B/sF9$\`.(89~Sm6=`+_owщV)P=:-tl[m.hYdkx{/LAj O$HB &t޾F8Tm c R$AzFQrLPR[&|ta/^t X_$ YGHlv=~(r($eCLP%!e;(r<}iNU6js|Q`|D:>]aJC~D^u,VCZOFOG+a< Bɴ(OXp|1V3wuYF{z1y>Ci}d6Ni;w݃=PC6dLlH ' r)'6iih{E!ꤹ"Ȯ |TJ^BϷB}DH|pøsŦ|_TÉFB3YߐzDͺA*tB`_y&xut{ ]Z=$)ղWQr C+tTO%] IgF8ql<Hݳ FV)2ud)>޳-{Y/CzSqNS9o,efːg_II$j$f,_ @wїH^CaAgC$3 UL2 6U,qO.)dB|*"TJk< .B"qƱH[chtE% B0 r|5/ 5_-%ZB .w-6 *__O׿^5N;1xh&[^~,Иl߸Po;MOΨoT?:?,L%t;OTZT^lt3j[TrUu[T+i\ϋMj6z9`2۞`cޛfpBq9@dal29@+qIFB@Ad0+.d4lXq AΟ!j]XCncD)BZaRcF)J %Pp 1I7j,PXC?Oxx/gGѝ k3\]qHvo,}ge/ۺ-׼M2'F^a%Ś=lZ{XWrݦ#aE9q>+=!A^w:8+w%{AޔBg X % sf'9mL3H9g2(%F(,H8s6ڮmĐ_X!uH_/pR=_^ l=CxSeVx+\ *0$05 J5H2Se䷍pڿ~Y+#} o>Ŋm,9oOh A@Aeod$K&=ۗ\MgC7P( 0IEW"e YU`l=LV@ʅ/a߀C_oC0B0(ڸ|.M/ mݡ $BTn'Y$W,i 2@T!&rEXWQ͒8;.pLj߬ڷ$oLeo`!˺'dKnmH៻03c." ofo$ ,z\ ]hxD(߹2&3hBb -2#)Q)C{SA^k #JߡxQLzWhצل# b3(OTcrbk tpIlIpi19H4, ַm'"8Tue6g:U1vŒɄ4њJu1KCzSEӴĆK[*3U_;i;!gqd_Im5$hSX ˏf9W⏓)%l/#"+1'q<~n@`^T6JT)hFx7 ,>z0Dq8[ћ܏g8%X>]^ְgCH e8ry K)-4XV,$B?ؾ3M& a29e;]tndmg_P"D2[gA%$,(%.?.Z]0]Ү ﷷs+_9`9.eAQFM5V`P79Mr1cPpM)7K$EJ s":#KjWgzStx2W(6[} `(4zh<2$kh9䬪g1aEi!IdLٴmM7x=b NҨ y#!wMw d:"aNӉܦmV`Y BH 08 M ]]޼O;ސo;'g25h !u)`=OM0&(xꆋS&" `'Btzj iɻD+ )q!W$F9zl.F~9-#WQK}ue٩vr$+xZA^Rt3ːtbIrW3F,M.PŒ2j)MbpFx*(ϲ, H^44Z 4Dxt|ijv,:wn{\5tCʇƣr,.nnWjMXyq hb|h; #~^mRtg Hbkt;OH#H0,J+ˮU/j[Z9\i bQh͙F$Ҟq@yj2Z,9ByK=}_cK?oC'4tIEb; !c=%@D"c<يqWM^uu8D 3D/^iݛB;5=B+Pyzm,'K(a@ akILJ%8IQORHYb%MtiZΟ-T0 y$6EFe${:`rlӕ:Pvo녮n|_p[σ"owӴb,GUj8o ?pH&.<^O{Sn8~ &TlwSPfBKM&&@@PayǽۂݑUi1K?_o|wk!l*-Z! UCXmkـݖI6 ƀBO[~%iUmh g+kV՛`5zӁv a֑ \- ux_e{#l] 鱸>אtC&]˦I7leG9Fm2:„yךW)Ь; %+UZWz濱3 .c.)IE1Ys$DF<ǁqiVq-N({ݟyaO AxUQ$.nߜ.!fkOwv`æ M$C\Ik8L"SD%'eDe`mJчLxqxn+n:tydptu꿍G ?S(U,,ƒiZ*s^,2OE}Mtf+hZXVš!xϿb^0IHLMy0c[*qeYf4| a 3yƈapcL.B֘19='UKh%o:26,tiږ:^m zW7td7V#]RrNh•ytE URRټDj.&LJJbj LE&cbi rNENP0y_t#%:b`&Ѻ,T94NEz,We̿nq^幞eѻ,jG;jfzJ<Xl&!]=XCv鱑0{ܼצE ]au~ Ve!J.cA*K`b$+cR-5o}ugN8D 3ۋe ͒HNJ7鸙B 0*c㌨k c 9,)Sd?qm'xꢒOg{Nw  $M͓ޜRű.w(2Dd 1$McJ6dGN]M/{NA~_;>mw|:G4ll?@"`,%:]฻Mu6L HB>F$ՐCJN4c}tVߠu/:lݣQO5Ȩ#7n+xijg=˿Η#>of?#?}ݪG*M5ycFO|nW?uwIJZs7}e C@l6OU:<^E].*rv@4w! 9"|0EsC[PsCQn7X~]U9-ޅ,{Twfs狋nT)'SɄ2%1`B!cts~[~fŞ-2I4Oq(x&5S?{W6WR><[nwc};1Q␹"U.$%Pr*#bf~  S0owDzw$N^wJ%3J'BkРD\HtuPRNp*W&X0nL 2cMf%0NJ#ʭp+U-1 [Wη<^Z ɼ];n2VMF:ww9g?t0sτ85bHp8^Љ2 X 40sJ d)~aegޓDu'r9jѓ+ٲOVissOVu, ;$_]%he.˝~Pжj Z#!ۛLf )1tY;Gag <4Eݵ}29.>TθyY"&ST' HYjP=Yۏ!Am^SQۼhQ=T\.ŗS>v a`t0SY%qL>GHZqCT}R <@-}C{O7̦"xtSPkC#H0:WY!()HjT33z2<m͡po? GR͡K OߪDdJ߽3!Ey (H8sL12H8+BeYX2S@~ oS`UL7v4A *WvPq‚rVzi6/Ӫr2t&Y-r?ҍ1ˉ2BmʵR9}17{L[퇽X?O۽ (@#! ƒ~ `dL)gj,RQQ@7aF2(7;r+E aWK~.Z~.O zUo<+5E~߿H" X?YqXdܠe=Ɠ_,Mեyj} HV䟧-tul)PH}4=`\q]5*c 7*(b4XD҈9j6 @)G@VE ڑ$*_/ EtB*۸=rO2b2{[]i,J-WMq̮iw%J~.HGu-!>8$n?~=Oo~צ X6 a4BqyKAUĮ)HA $kChrЭdVx]P5@0> ':)IAYJGv|̣.$d ɨ/AdǨ}؟$8ߗymV'!k.QĨ;W g#V`Df_w<YLsřU27v.ˈR$((Pی˒'I7剟Y\V@Po`^o"/}^Vw՗\?{=:nFjȪAB_CH~&(Db 59Jdin M1w3PVALW':a[ ?SxzҾU~fɦgk氲2U|3\ףO4Q;tb`Zy pƝ^ah;WA&f Q&[F&]+Y87D; 1F vҫ#-!2Nr~n Gm1{>D'|q汎!FNˀ.zܿxV:֋H&UB@hA7[_Vϕ=4լ\Wz_eyNɽCu>-(=o3 [oLIQlѮ>ΫN$"ğ W-vq9- Fq FCJ*+V<>sQ+-@1C5Cn3Ĕ0vu==%UwZPD*JZ;$joFWrQ JmlTX*8-o'(Zum 1NJ3"Cqe),F :e4!A2px–ag$÷w Kx+Rt_,k;^_Uduv*>K8,u1ވMLhǤRfj)4Ddr@ATdfý:6t\}{$Kݦj]tt( סdпCЄׇջgU-Fy~ƆPY 7D x76!:`|t\B j@`eްĒa- Ȁ T.vqX>9|J2=ݜhU26$u[!,5qVF0ZpۭFK۔J d6+p\02 GX""8թL+A&R#gP'`VgY3F-NjOIl/lxlr1r:}8pI:ӖA3OC5aDim_|!AhĢ͗ ,&cB"͸u@ jPj#Z(ϯu~|qg:Fz+->= <2m8LLdqo>XqgD? 1ϭ^bI~"I$À 848R<" Sߗ9%}U]82KȈmMڍ^Rb Ϧ@(ڶ4m?SOxActHq v!МM0I9z1hJ#&vH !-^4\M\e|< qAM6УSVg5c+ƪA6朚 }1zp{nIE=^ aW崨Vnnq]sVsgF7pҠ"t3 _  (׶,#f^ YNP#K&; C U%y'>HApxcL 쓗cAg"_|cbo2T1fKWiKd4d|PrVItm--nolYՇ\OD=`MW?xٳfc"׃jkWڿCI78aFPl1#Q*.)B!zۺamΗ!>޿yVhZ#"f[Pc E9`5eg\ly]:1uID]Tľw[#z»f0.dVTckNpo 0>\?(dT'6:a.(Q8qK41s=FR0~6:s;m-[-|QmOW {=}Ұsb3=FI)u9};j` Z/b -Xf2&q!hS G~(V {#xwquFΣP>Z8JOѭ;k7/Fr(ڙÈ 'ԣ=Cy:azϬe+NKY,N3X1YƔ1,Be&Y!W[+R19R+Dk.?mf/_/ k"Ina(hzLd[2{ j3p0Wyf)a&2ԋ菢tgIi1%MUh$#*;;фٰJey\3~^z_k@ \bH٢`:+rjW;?n#观٩p~h!2L~O.҄uQcю1hXD0՛崭7KGY)ޖ2LSER鍒0J0ҘD4W.bpȤ XU.秫fܞE f/r(7yvՊi.6/0G։{827" ml"4m xxzp3b7 ۞^x͂>jr՝—:^(k#~N"]$ȋBNj(݀@$batn/&d2Pt’s 4$$L2bh.D S,EφΑtf..ʉ /<ïEq^#lqilWQ 뼻v>޻ l'wphXOߵ)/7IrJlGuntI'mm fD<(ӂ=4i3j g&=VrY'dg L+.8"SFScEhn8ŭjZ?Pk:oq;0U-RRc]WZvq}`)q?;MF5^|͕Nq^P{+}_+YUo2keqḅ> I皺}`SbDqly87w)Ki=T`IʤXO(ϙkmȍt~kit] ]C޼UZv[KY`cp)0PXrt& /Ź'؍| $1;sٸE4,NX)qH'I$jJn +%Hũѿu&S˲j} B.2y](AP6ߍӦq fNΚW/ Wz Mowv RYBH Z09K) 3`r)c">=1,}Y1t,7a&rя4XhivkGFէO:ޣy*:4i{#Q7Qo֎!M]e!pҍ1vWR^m-u׫ʞwؒ(ci:%1E30>H CIiU$(SBKTXLemN_$%+xۯ¡wń1[/Bu}UXv7m,x;ë!4 9!VL?jQ6)1j42&'q2edQ,NeZ"&/a*3Mo)vM;N~w}a`#!LrܸvL4q7n8xz,HT! =x $MY('$a'y4 Q)w²0B-[#Aٮ;qI2ˏX?e~7ݒ'*;vUk.c B߿COe|Kf1UFܼG1۫pԃ*x.C'vDZia4Fk0(F SsyP=~xr]\g8jq7>a\ͭA+ )F+OYG@2ߏ % 87)SrึJtW`+y7e#fh9nYuQ  2kWo;5+χ.^5~cr#~ >paqes鹛^mnORzYbTlYfuv#lnz`^IƤY`rn/kl~˚OqpL0ڵ58׍wmnؙrQgD=ʈÊT:%j;o+E( S$)UjG6vqEj15X)'(J( %WO3aCd q @-A,mʃ (( =_s2H>CԆAyl$[(OJD#IȓkW-S"@h0Ϙ.ܝ'Q,S#/e aC:eVZ'MJxFɴW87^d4a4pBYF E!`"={r$3E7AYMUgT7Ӛ_V F=ɘgUA@TQJ+{Z=kTo5͛dž[*M~Sƨl_sI`xl=_[͐ö ԁW -ĄeP v*Zx6r^53B;9KZղ{".C&8sQ ̫c>k]yO7W_~C1LV&tRtndG_KVh=@Y](rNzE-P׵riO#n[V.X4>h` ߪhDRtvZުe-s\PW'])0rƅ7OZWov94;kԯ>]w<*-9, 8p`4ѐG=hpc(, q+b'QÅHK~cp81l8$>lZ44U `8=Wc7 DH'CX-Hdc |!8Eeb R*3e" g1&Q&BL3)txM{WzLT~U[{č)O5 Sh,Y+#!m7/PEҬYlƫzxYzyT3o޷ $9_~\.jQ{vQn&RsXg<ĺPuPx*1QbDl d| /58D@uSf%mڡ11d`#LbK`VUg6fȂQ~nT?=#ژm6cyyN#IAhwIG>g(*|7G1_UɋkwLj#$)LEBB(#h1> Nms yf(:Ra!T" oS9gr;/mt8WWZ t_+ eĘBᑆU;vjE</o2:enP p ubbP]$_U7mS,RLs%IDEIҔ,&42w: N6>^{x 7X$C'EKgU-`YX2䑈1$ 5Uf`99Z(&JQ87-lY(J̌ yE40iڮIVj i}*j{tz +mM~֒Her^B:զ̐'1'n RmkNirRht3R|ISj E2 $ ˵gy #ƌq:+lR=~A>܇ZRTEw{q.C"+B5`d N(%,IZw9pИd$QhƊa(' Q1&'icKo?u_o~{N٧ɇvO-ZnbL6`sZ)V {m|JB>@kǰRaԬ!x]K{r͵޼}o,'N?rSx ׏K MF{&p> % ${dž̘]vVEF1\8G)gL`FX"S#DX$Yz5џнO_ ߐl~Ҝ??_l&"Tړ0162{4{]@> B}kKxpMU+ ߵڴ@s=Ir_ɸ.zլxɁW|)Z(כZb_ z'sϻ{\BV@(}9maG}}}3M.ӧ Rv\S W}ykcto-yAsr>$]O5iq~nv0N5܅7n0˭Sl$~_( c^pRxD("i<]9)ZEZ7M0F,puV!sfgښ۶O~{f׽4ise@K"Q_x)Gd9U X HZ, cPaNq&gd܁}݇iɞ>={,Lfdkblrg7AHL 0Vp6  B)!^5ڗTY{gHV245^8>yhi #V+SDx];ݛaU3>3Fn$44 MgVׯ ~Rkv]h!VTEQ*(l$ܩǹɒr:~.ͬ~ms2$ZZƲ'z>)jfU.e1B[-N_ $b@ ,*#PaD"%e2s'[geO?Z}سՇ/ e«_jF)k Qؓ7^cla~ݜ]u퇷o~S =d&Eg?W^aNaZB'p=wruuYZ[cOM0SJt9x5ZMp^t%-p XO+`z*X kU۷\3?q[Egģޟ븞,fl끘A:bSgRBB)jY},r\#54Q$C DST( 8  /'6Ӆ;/l^Bl8ĸ2eeugf+{ٖtlzR59n#Ŗxmm~ÄLuf طݕٷ[XAu}N'4SiNA(睛סuKܗ_|qM }hǃg"^[x٢)iQ7Y4%my;l}F}6;l;N.i~?FMIkF۹mm;-﨑wԚwhֶ>~hJ&ASҚQI%ln6maZY_ZWh#62kJ5]k:xWء^a^axUW+hCw"Id^\.g n+TM\zck\7ģ"yu9* VVT +q\׹U<bJ@cf1J჋uNzBK;C "@#JрB@ì1a&c<U3Hh8м}-^OꇳM3R?TsxY/r\g *7m 0i Q<B0f?O0s{ø0 S)4"HÂ#d2 B#=˜ǁVa|Z Tz^H*Lmѓ.6lR"6n/խeU/խ⥧6X *>[YmPQWT| VVYT|խ%U\Wڠc6 *>[KuxY *>r[ˑmPQeT|Y8۠ϺU4ZJWTP[VRl*LF6mbQ~+V8BXbBds#qׯD$!UTxx) 0d= 1IC#!DȈА@"d4rD%Q-yܳusO7s*8/bEOi#Y%y:ЍPR4Ģ&x2NZb͌")-%"n F)`Fх=BfM~Nm;ZNmj(=1Fۂ;Oe[ywg$Q!Á4# %"$\os_>cyP4Yy}ٯԵi,8DBm !Ol-R$wFEQ7)GBDP*Jd aLDA.\].x# ^8^lsI(XFj6PA |Ahf40D n p6ӁC(6qP5 ƣad4HT l1w8א*y=C76ɸ e\&DU!d]]qs  p@-Vs飧)F!DZGDTK 3i'z?jR z>pcbϑhM/x)`y08 Z63Y-P($ӟ[ qD5C. E #Bj-TX^]`~1յ_p lrW!Yqt3}DMo6{q `Uz]]j{طtۖ dt|7욫3Yh9ewCFZ<u[[=.VG8.mr` Z>*a* %rcg9 xD2:R! D0"J2.<svy}##xgjwO9BsZs&,}1и^L_MU7v|9?'(Nz/é lɭImfxPR20e2"k%4BˀL")X$ `Q9Ԉ,&^0b@kч򯵮[%BH%.Yvxo$eLE: 2HQĕ_  p%^~|P-Ym7:SKjAov!xN>IӇr[UaSy}}\ab={qhuД0" ŅPCYܹYz{65q<Ǔd8fOg֔'n Gx!{mdDY0Wힳvp k'Z8oŵΜ[|S.:W.IәK1e_畬OΌ&ӱIWowT_%Khx:g31i+뙥Az-`[ǘ,lg1IV7Qj;VQɤ-x I; v wGxS+INmUȺx.^M'"лz5u沵%NMj}bd{d. ĂUm);\^X{ 'x*I˩yGkvWb!Z0C,IiHB&u3:?_mg/^^qXEzWQ`g^|qԩ'jP/v9mo|oPXf^[-^pU'.EF(`5ӦW^h2Gc ROM 5I^<=y-Zq;ococ'y7Rh/rb#p5Y k+38Hǂ ]qF/,pe$f.y Rex7?yҐ{%? n*f[+H^͇ٛ2R7Ԥj(C=(8_PQ:#I%);a 4D[(B.E_y Od.Z ):5ZR[HP]Iw-v IUbWh\Y;1xŁډ.pVoZn WTCEv[w΢L3$#^Q$a:SX#[#T/P)Z2^^ͦ_9:߲~li1;isڱSЙ:+nǁ8P Y[g.a'JNB~zJLzBu//7,g/X1`}T!-mm(ZqAwvʾ%ٰ* R"a#ȣA'p}zL#Q}֑xJ] v#kȩG`QI_oX R^ńxbQT 4{j;? j$e LaٜMH QtTZ\Zrת+,2qCz0[ D-|A5a( )sr0$QFqDz ϥ\\\,%iP[8ja*ƱcoB':X7Qɴ_c-T!q&sQND1r®',NS!/I韏7ny.mskOkA,D0)QUg-7f+c|JDQɖ5E_|$@f,Bb%~"tp"'F 2o {WXly0#?X#~1m\DJTgn-»=*w#, ?\~3]zKheFs&C ;" :ngȳg/_KԥQ j#U*> 9 o?VBS0biRc2#'Q+k2*L>fVm.'=W󮫛 FjU^m`a^򏜲z5I gݛwRF_`,q}e&c-5ZSȲ9=l Cɕc Ni844u0H!1%Qlxp;AփP=)bUvNmp"' VwC2r^7-c,EJ/S2!19ԍH;1u,H=]-ړ6.Xw4GZ'ֵ*﹈2kMiKE.yNU@[e]ٰqNjܿ7T&;xɮ}#D39AYe^t0f$NqE^'K,h]S]EY-<l`k)Qߖ$9QB/I79L.j7c8rY\1G#VؙRV6ij4}0 ٕqx,C[qT=5OkMPg -ɿ)[꤆iĐ/{=2]dC?/w?얭E3D3mIb s.6q 2G2(Ta!Q|\·+y%ڙuORD<ѡޙ 蟭EXd[{u\5=(ߎBv;*=}͏}#g8oΌW"5$a[r!i4p?h UyɌ@ԑ>$ڋ2ihE 5RAYqަuIg5LբB DHox C%1 2uYٴQP- VV /Xq0akLU1{YkFv1` w,Kll1R x%+4.?$#Km1בNK>45݉ywsuW<^?Yr0k[svb޼\>~y݇_M!}gic Ca㕏aLkZ"^_y!ᘠa!L %Q>Nv,SGw))>45)_& eۓw2NԴLy:z~ƫ0vε̛t^4#JK2ߋ|1<f;_VȊd|||x8rշ~)B~D(baG$B44N(a覊~be㬠+ۍ9ȹ}qݗY@ {VSx7F3. jQJ k"2.բLŪ|#e8A«E*/͗-1@3?9& 4P +dB8) VV,UʴhjQpwiQTT'D(@̻\夡l%rނ5R1` QRcdZxHZ%0i-\'RhJj.P +4 P,sIiAޭ,KQLIcL5@qխeEʢi]|b0CΏXxQ,` I b'i8 ' MyKx(/ofi-X;)bv.h/C A󽠕!t:[hL` tW^ X${*^~&?Fԯ"#t@fܥKV]o"tRaB$8u̯MlxŒffe=cCy~t0)=1΂!)ƎGcԡ>:,(GpsR~r/q 9x>Hº%ͦS(-i:TD @:f w!Aju~ ~CXpFqJ($D>>2%L٘ 뺛?l^bY{{ތ=k9a51wzS}@MR|+a!  Xͮ&i+;nv gfpؿRSE7@ZJǎe]=;:)HKyHN ,=)vdKo'daH.uc+?iQ"?<a1ȋ|/7XJŒMsw_v[)Wۦa#gP̫V: x+d/zMM;~m|X&|med e;sΉ63h8Rw&ƼA!0q="?q/..Mf2rkKZ(`;h>U-_E3ZEz&t-aن<Ⱥ"ϫ;'hՕ @O_z{*d2ȹ@vݹVuFh$J 6bM:ȫq k `]R:F̶[W[I(7SapuUS*s :mǟR-~u͎] G(D\M'R˷g,K{tq[Ґ@4&ti4&{=[o-ȧd 3dw/hFTQgߘ]a #'je27ji/+?ڲz,{I!} <%JA/U`LjRag:/@G[9ћ~{3aaͲI'.!ɋf5%@Gō޳mmkcꢌ;d:3Y9M笾i(HUl'_?(J%_3ӗ A aGusi3D_F̌7A 7Ūt $<[]Pa.PۧXli7CYW;^'] 0;znó"V<Z*{9@e_쾱I{^4:@,Άd1ճDjM݃]?8*d0yw+3#m̐6nne]ԃe/f}޼nX N儡Q)l1,dpL˫XVϳo L |{ cB&pe>L֭ݝOZ#SB,(@GLAǸX֐o_,UZ]duA3ux؊œ^)[:6+poʊHWZ'6M:m UP2dX?%3 fR'g(6b ptJQݐ)Ss{Mb*"nlyL`! #Nd8FJc m-i?Z 5w4Ams? ^d ڪ>tF^+-;zm8t$x3ћw+ye棗5GpҡZ>0S8d`1^sf>>J&X Abbs&)!LK'P%U+m ]8+nbU)ސwSFb`3JD0aD{:Ð3c`tOC~;[~<mc3Z6,D.f7?eA8Y[`ʰrjp=[TMY?t{zĽ=NhҋzZ7jT/0jSO؞O`"C'!Zi3.0RO7Ihh$*(DĂX bOv5筛m;Wu'?ŘfȆrX{u Ҟ,|huRVy]Ի!UӣU5]{:ˮIߖ>4[b ԅV >ԣ:0(O c8.fSO6{! S/G!aS*qLX0P0ӾN|-8A=Y*vrC {E*C5Q::t覸&$ڴeYe}P/ie)wN+}`hr7DDI<FI'p &UzUnNfםQF)#h,AB #!@#Nh͑11xKg$cɋ'O :-|Uڸ؟Kyl_0sHglR tyWGXWE[y[ }I$]ԕ-aGϓu.W10D6u/z%ucmlzJ́-}"v`;8_W(7!=b\.f_ PN!Vi!4!\0T8\' ƐCHHo\׶QzUnouY^1r~:F;h9|hW5-xEu0HG m5ȍ"4#YBbLQONj^@OoiK^@rMZ図e..n2$LpyJK@Gb$$eV) "_ɦzӱ[ug.7ʰJKYmfj٬sCͪ$cmj3e/Sx ۫BDH7j{[ln=-JQ)w Zxm6DK%Գg]_Y2޿{u|E-:F};(GhˁMJ<F! y=< eSS Ti!aDÈ+"9) 7+U[ה"!s%3Z=ޣ*7*N=%5ܬC^f9hzyz'/68Zvq؎R|2"d˄l=*RN)u/ʄڹ5KSEc#1 cel| 4c˛$'?*hyɼ3MqMnlZ{x 0@jOIRHaA13g3l!Mk@,R@26iԚygiI1z2ළ|C(vl8ٝY;=-YIm;?$Gt!Üm?s#N -2-dLSB5$J &hz"IchdC[~{׎w%vq.{0[*wϱ;ķZ:OL&"WMiǶ~YAf>Zv-;A$_bi,nܪBy&1)I(b `u#Vpj{*iĞ@bk4'[$|,*Q8V*>pRI <7#w_:n^0'ij)VnӤ.Ǖ~oVGmFpƽ Xtcc6̺A6e0չHhز[Q_*e=߶ 6mVFq0q}vߥ㾗?|x#m {XO{(u`ãOSܽsS:ԔĔ&_ 1:%4 !RzY<Ge;*vwx_VYs6 aǿ4gώlX?.".|K{4r~d?HWpyyzWBd]z$"Ͷiឤ8T/Xw1fWN22>-FPz 5V`~xױZ#}b}F,JctTFZI߈r!P7[i#.+{2ѱ^l-񕘏!kn՞\L&p+XC3zayy|RlzDcqŲ:r^#+߱;.&f/;@Gk!4ANqGm?(!-Q=wKyTx1ЋA^w+ojCޡbﺯz-P(v ՍUxa띇wyzOWvkZ'P˼C_y'+nFgƬT2\[;ɳ&=dwkZ;}/2m!\+Y{4Rۛ80 C fUf(u8HI:y3fÃ(T4a!;CCYZ=<Cg%ʱ">Z>l{p'=_pPbVl"$]l%Y/o م9_Օw2J~3Ϗ~7JHyZka 7rИY֡Vn :EvQG0>qc:t$JS8 p}Or\ R}]UK7MB.=WD[f|ƃxZ2r4Iyt4vǦcʳ--ѷ"m( o}zR_ȵ^E`W l.!ZSq4)-1i*̭rXphK?ėN<k'@ @1v8(c @':}&qʌ@@nh묥yC]c wfڔ:=7^u~.ԺIiNLEuTHpԙ b 5ĤryҘ1.8FMJ0 1e%8VV'}>|8|AC8eX)JG'ǩloǢ|4޵YdȷXiE]2 aGmBmc(-8%\bA^8]Fj.o^ez;{C ݏɼ-"M&i jDC{|SVa Ґ)->I`FL켬un+_k}1q`7xQ;'Ug8j !'Wl/N]21Vc<  X*52X y9L鷎& gt˥bXΜg eö63\i7N 1bR|c%8&`m嶙g'_>A0"A8I`Sb&a ("@HXB||Y>ceN,rjRG5ڏh|i}t@'#*16ңa #X[:5v@sUoF.khqS.Eܾjdؙ-Ŵ0_aB d'`M=Soml-jSm}1B6x^Ub@l)ze1s'uSv)ua񥬋덚!"+bWc`yIallzXRm]t$+xv2ՁA^as9FӶpu*YovݸjjmnhG׉TmVyo^7,3O"jnӗao(;.bp O8F0BBRxɀz2yS !e'!R;$jGԶ$!"L 0A8,IGzO3Vq6Qh1n/ev+ɑm+wynKo`{o 0: Krh!YH1ae0mE1$ ! $L$R  ) aR:[b"$W䗄"9!0I84Qb DcRYZ0ҷ O㌒A! CrgL-=λl18:Lߑ77dž+s5xcJ_쳳 \ܴ%6lu+~wDm(^ zR}_hff-\>[p#vFh[PWR_Kwv#nQa=*s#܈e݈߸5 Qex!nׇ: ~}R> ̚ieoiV /̀l Ul5ٻ!Qٿ;2ޕ4r˃X#kgjgGCU(<$obJ1OxNB0 DTJbJ9*T09{];H (e0&W*{$PL IhL*RmH- Z ڢteIR`9V^bM<:Gyޯ6fqͣ чK+?faѓu}Tѥ%[t. "vY 'i5wa?C!rQ5K^vژMm܋oߧY)J UNʸnE{=0=}vUӴ6}\Vy~_]nxD߼9}nMup̻3m 35FOO~Rg2NryږRSIFYCh]jwSr" (K&^ ,GG,TJy`(–(&Xkx T=Lq7OdLCEou-&ebôx۝?mz[wz'K/=}4"o|ׯlׯ?`?7҃g_7)8l{g~O_f Y^EYHR}V+ve5D-kdpnmכWOuުq&=ΙC9: o-NjB}C^J2m_Zq4.w.;Y(.DIh ]%fܠ`ן|Tk+Rx0Ej3ї!P)݌+=r (ąN^:0jmSkȁ-՜rB]ë1lv@4V U՝i⊭_B?ago̊ZaGjCChD{qN={l)*պcCDf!TJANW5`Z8L9NSTvuK)NH+!lgKPkxc)ǷT 5⋹)X,JjNi\#>yCKjMlbQ1@uS" "!VIp&tjS $NyAL%qLI, bE !)Dzx{q\ ^ &GyGխ\kLIqïe#fh`Fbr\ąN=c҄RQH QXS Q$څ4gV+Fqѷ:: #`}N)8:a g88Rf,$'t[b$fi(@)!J^pzt:Rƨwh:io&:YfFle_|䋋GIrUv2Dz8 b>s.dutYVf&)2>A.kTafP $ @( qʀ#K,w_LulVʙk5-?/Ԫ>AكġrTsc"gi=鷒 8D tJrW7SB  @)j3󔆄H.wkGrFyU`3bY,Tnj7~ Ի ;| l=d]NX+Ik>Ki'm.|Bg @۵7&0q%l4P]X^kӴu/L_ bCUznȡPgap\gDGIit*2iE*[&9p-o嫬(m- [=Iڃ܋es,=Z6tB݅DӍ*\b,tR|OOVh_Ƚv*^fE]^ic4/nNZw]J!w19&jg[nF_Ǥ*q$凳$'UfgL `+DFv~H hy.d& ݍF_\Ypj2{ԭaLD+U9\gLzyRyq mw{Ss:_]ܮ 8@SHpOgug˓cnWz}Қqa;3Z.vYFBF 'H;Of=%p#C_|;fk} ѐ汼H!YzdNebb*Fd)84Җ\F׬xzƺ^6un+kMUռ {,֜j>#~wa. ®RsYcemFm=z4 7ݰeSul 1e{m]Rz17~g-p{}9WeHsQa'u.7d;4KN!] P悞Q'g!͔i@9%42K\!|Şd{w"˱1Svz@L];&q3ٚR^G/mML;[4:oeI6I&,jCirz0H3dVla 锣Ygp@PPj|J[?6銔kc`1"E)6"r%9r bXjmqFYͷ&lf/|SlNqGs{QqN"]`axk&QhE2'c\P*}bEIsf~;!VHIp ,qv 9  O{޻`s}[3 #ʉ =v9O3w䋟] L:poǚ osbZLCh ]NrڟE^WbQ,/~T5UƘX ~y?iB}Y?xμ_Y}bץl}VeѮ˾+4toyeND:Xb5],Nͯ쮳T"A ? ɤ^]-~՗M`HuW= װܳB_xo}8RƹrR]Jz 04O2;/@g1'%ϙB:!Qͼ)])48%+hPQ $ 3CH3Ғ")Kt,g]#ZVQ:65 /vuUG[>"@X]iۓeM!  9ΡxR613pFS9kg-A!z/jC Qŏ t2hMLJ5 eVz;[]|b2<=P,Qv3!P$1uYcJ YBb$wV{UBǴ1Few#3abiDaq+ &q|g()MS0UiW v9( X3 IW}g[*z 9rϭ8u8(t˸W#=`k, 1q7I#z>HY'e+,X2q ̸MCqjEs2~PB$F*(%}$n T! &/(z)FL. *8 G^{U\ka^֯Z\! YDz;@={=уg'gt<{L0 /1Xu"cUΥ$^Arޏ~8e%s1t2lMsm/_~5Y[;)_QK=&⾤rF4x{Ox@`S.=j%И $C7UJ?VVXX*.C^*LVL7r-ے/etV[ě$@mԱ{sK ~:#X||%;Øߟ* qk[iD8p5rLd;=\4T[MBgfQQ")|QA2.G 3l!޲ϖmilScuXzC9ðCHj!G^ KW-{R$ d!,)S&NQJ@ p^g{ 'c[oxoj~AŨ,bT-V4L\!]cH8[a3EZ٦=1cu2,;Q'ҭw<<|}X'R ψSbO_rBXvo * V gjgB *_AjiTS^\՘xif',`^ꁳx{S8>tE8g19lMco_̋EbPb2Rj ᡳ :#'܅Qe^o .a#FZXP@IFJ9vnL@~zGWk=\M~i>ujzR^$FfDLsGBN J1[W=+ I0B,7Hh@H1k:,LY3Q?y,&hZtEl}(7{ڈ/`xl a(Um9w?-S?tVG+SX&#/pbUYw˦% ~7Q92Ipt>ޑuR HB9)k\q,s Zcps-t"sRXV[zJ'ed69^X+kcɝ4o?ċ=G& h_я1PSCsa" ,#LsMT){wrR#!@~l ʐk\H~ھ~<׃٥]j*bT1SBze]zhɖ>Menm:s)6)Cj/+1g)KKF 2sqP\u!!yǽh(G@K p9k"~_0WaP~n vܳC=xP;^^\*uk~ʩZZ8@盭G/'kNG,Os6d2l^dy |_~meQs&)u9{⣶xϧaF*,%]lja5rSpr TGUmcpueOU4Ys> Vy4;W#f(mŖ`^H9= S(QPZv ]6+w[2ƮOOp Ά9FG#D 7$[w#0`Nb>MJUYrg4 ̃@rܧzӨt4Øiy/E4?,o46y1$[Ϋ񴢘{`c7gDX齼R#vM|{_< Vz{yuvz+~[,6n 4.a$6o˵YD_ŋ*GD\`ڧe14AeWov\BɗK' a*YqU}Vjɵ$Hk !4r9w6K/v)VXݽ꣏ڟgn4h22 f;"0'?r8C""p̟8ggb0nÐf@Grm{&LfhEz%N2{4X(>kD# q 'Ag'Fc4hr$d v`oǏUsQzQ1gx8! O{m4W1V."`v;A:@KSeXr;~HJuP.[.Y4PmDpdilaJʋ8)帄cDl )PCU,Nvw[ᮝ v{:O[$  \N n'*G-~HUo|4hsG! bb crO4ޗ/LA'iJ$4JKh` SDA14o&}KTH\$q3s+82*?'?p$?t$O#_F9`^P'*Ly:( ** `;*IU1bF + gScNpWQ}Ǫ'vx{a綋22=ga=wYA*zpٞش=l1[#~y] i Tnj.tYIX흙[\w1|gt>x?~]ejX|]>6,tKs¸hR &E}QUr5d`rMc%*R e `(D" XxBnHK'K2Ss\Z-EU)=DV =[zO%W(K}Rο̸lZD4;8:&HNݷܬnv4:ny]'-t3}rҥm"$3]tXD#v-Z.{.+BT'Cj+,1$ iq^QQ~1fd=>zLqFF^ƳxJ8kt%[^cOhb  ҥRqcFڙ4gG}+a6 <_1ǐ!J4&I(G18ЩH,a<ѯ^eBp,A"tcv4cXD#8z- *8TF87&sc>ucl*ʸSL+"$a2iޞxzkq~6p:s & N_w S$QQbH'ZBNplR y]lS#7.Bo4 @ǰvOhmr=qVR/8ܐq&XM% ĩBZs^?]DTWh2[G'-/:|E@g*ƑudمOcx㈒)nҪJ3_3o<߹B.gy}#izG^b]fI)e[ɨWwpj0ӄcuPMX,)%0p,}r/ a]" *!9$X_6ުEr1! Ѱ> %XoRaJ}J b@tLZEvnxI i,뗩&ǐac(%Thc[ck}W+ ֜OtMsw,Y|n%ؚ7r8Nb+\ h6]9$yBw$y"kW~ݧW3 SY:mgeЛ5_gɶ&CVsd WܨP9 F}g븖0$tmKbt% C]0dl\ ,M:r;14(`]TJBh pR!h9bt՘8xf.䶣 .9z_Wab\#jNn[Qs=b,i4!kYZt[f ն~VRiރ/v:RteI-Vε|Pmӽ]^ϵx}mn+LiXYa8'C|0k#]c@Q3jiukTfwRb4(k*QLS` )@8T0)Χ$%4<|=-EKt$.pF˝NE~-uV< tm?_w.ox;>+]9w w9a^>n[ɢMSwn4=dT>Mf0y`#WK3h2_B k<;0lBEe0KCBE4=+sk{4vyȬ:FO?S9sk6[]}!_'Y,Uo2S5*nUq]ԥhXa/ L|vdg{#tgv0q{$d зn[ 3L:e$  BhIX U$ߗ̊| ݷmHGn[r_gY;d~~ 6xU~09(tلNqgA@Tr N!*QR81(N0ܵj6UJ-.y̫b&,r0Մ.P!e_q0dqL6$b.TGEbD($@@F1L`BE%P|?K ]s^@q'+~+W$@Φ(zlgYtq{ =ʓSMڌhVVTYc tוT|.WpԳ+s̖D>Ó?Dwaԇ\L̝[d=ggͱCN/οw/SkSV{b<}1u\%$*ؾς3 vF+S @r:Է~4;rpJRn++QbdH gtlZ<ݯo{π#JϏ_BRQeC8Vm=TY1na&pMWQFeipIj%V`* 1 " XawG+e/oij|~ذ;Yn%ս%AÅ'|.C[g}yCĘ@VVg/E:ɵ%;ĝs"[Wid;v1oW9`]]]{MC/x>NJAB٧=n`dn(@c401%;\U0,LS11JO@0&B3Ctv vnt 'ydwU>&h, :*0KEA)@f5,C28]& s'bNrIdZpJԆ s~XKO/#5m/  O*qa^7egYȽ0C^Z.ٺ\xmNL{ <{m}}/pY&M9{X[@V[`xO Hj5{"7{O({~{N $$9sl9/*\TWB):/+@{)QLcC&U[ՌһߘEKzm c,4Cg:]~7q~;pxey4 =s Z;u,@Փ`?YIutԍݹƮ7 -6Lzz̊[5=eN->gّ/\.yG4?PE}fl,jG_ͱ\yjK8L2S)goU W7r0#:oFr{X!Nyj$)NRtk=AmU.fkʰϞY쳪nz4|Tʕ_Pݖag-4-j>k%>cohvF]áQҶrafntnj[;Ȗ;>WM#k-d` 33Oz}$r?h5NIos߫_-RL1}PETc}=& tbq4NޯSHEȸ0aX0 G .(jk{о[o`W`>K&֮#!; "b96L 4K_-P$JI B BR((M$ND*FIϤ4 4syrGkh ,+[)Yx*ڋ땞4@>Y<cgUeVdp8$;I</Co  8C,P0Q~Ɗ۳"2 eX!!CFф|g lM}#J0aqs\;1?A7 N߿4e7wxy^?_ n)޽/n`_tG5=8= V)d]7v _^i筮>ٯ7V[L-J 8'XkHˈzt2!YJ  DB@` Kp[(aweԢVM3ß{}FpMA8'e'_<7\PgK{:5 /Cm:c*b-߱Q|}K@6O;@,b7(usE༧R} g[=i(J!<eddn!ѿXgxurB^rS[,ld`rb@577PRg~e8JHA~Z2xN0Z7HL_?>ۊL3 ű'l/0\!J1UZ9 7$!R+@%$qH*"D "IV2{MWH+=ˉp|ϡdF\Z;'L[t8o?6#ڽ~vD"c6$ qM3b( b@cFτ,`\"_FA4aP8i !R%+"SzqV{L+*׾Z/{gorSq'bGi~gk|bÏhJ_j~]Y2Ud%$9rPM{ͳA Y=((s {uyȬ,{o~ofmz9.y%),)C uc5j4rG-a Zqru5oF#ʮˮdPY P۴߽BM{zƤ8UEƌ$Ql®!3 kLD0V4Z:8K0aB!Tk5%ul2Y Aۯܰ"+j{~Wv[ՅҴmf^LBS XObkwiLc4C.+ߋȶ-/gȚKy5A\[RG-lYJM[ժX,X6'jQgfU:9b~]Uk {^MɥӒZ5Ve޼Q%!"=Uer9#k=2@fd̾WZ "fOY{4IL5M3OnHEl2JIO9VJ$!DJsyӧ?@G#MS1=z1'e웩) n1tT.rI?jL (V笐4u5Ut ܽ\aHG9HpWĻ}nBi&i粇6[CIxBc(.$L0ATiWl7f}3v= e^VKHn}tFυ=㍷nykG) git/]ٔ_7vp9݇lX9{s8M`ϝhD"F6B.!1PL$B%DD!JXbͨF C r-rF~Cs!GҚׇ#=fzrϭ3fF438`IB~6K-3u"SRd(xbCLBz2mhRm8VICI~I'I9l;Gz:yŬ5wSL޲R+v̶U xf٭_Z8bu._01kĝ^=z,V&Xi#C g9֜d9FYO qĝa3- }jYfͰ*WWm4gD0\DɌbeS`qc!黀b3O#&Ҕ)VvbJ$clK_\}u͍ӌgHb:b[Vo=J]ODo=[i2vy" H.Xq.#bOEWc10R IWQ")$1 &㐪TrS'vkkN3T;ꦴ+`c(*jC.j ʏihwzB(`N"_7zG.Dq"(I\ @P#@0+3Bhռ^Р]O7о֣,ϚIgMeB  ZtiGHъ,3+s$Y0> 'Is"%GOxz{EGߨ6)-Z-Z8i^Ԝ:u z=.AX::5 4JU9quEV|A|Ib PK^%XT2 S@C@)G__Bϙ_^򍂰gGiC;RXRP!34:z"MΓR-DϢMC͜WB"ATǤaT%0(/!2&t#f (3ha9͡bF`0/zz[|&^ٻG4CjCWփ5d(< ɲP")c8$8 %TDHaTV8'm]Z4uqZNgA4Dis6Ei{A'n)A8밧~{3KPա'!NxX@k)RH|"xv=1a껔}qoVԞWfN Wqsf*X-b^O]2 XU;L95-n}vN3Y3Us>,WdC$WsM(h#BH;C&'LiʤP<4" %HEH>Np]/3 \cWYn_{NDpFK Ӏ' XÁF7^6.#2%C2#1c0 #f0ߣ#B1=*:EEZ_L;נ7S_2 A4UJ#/\% RJ..D ƅֆb"(b.8 :2.:^7g,5hXϋ9*|h>[B\8&3]%W n)_Gd"ID(`LX4J( !A( BR!oU//je 9Ki+pHM$`t{ɻE-s`EͰ\rѾBʄ_Ahy9:H5Lx`vg>Ta°,\8B.AW6L+Zvy&VRٚY #Jn YElwp梬SfJ:22a`EjvS=fi&nr'j3N9-HiOIs>Kzٟn8@_ f8ϱUpͻ4-$9%pBqB2=."&0F]/ͼ.U::8W?[OΉ6vH!P6MrL-\v۹zܾˀn<[0 j.Ε@x{~ZUU/i:Sjtux5O <'Kx!,IeIfML7qY^hNvFRTb=OUg]"ڲ>zsC#; ŋy#wr\B2LhD@69E@/Bģ~,%c#žPf ?A7-7f!JFhrǤLDgΙnu.5kg hwrtV.۝ ğ~'G.rV 3#nP'Ilo/AsK;3QaA,o"C8W;a]y-`/ٞ]2[|ms~:oBT|\o`9_PWs.\A@+T+?_2kZ\]TeӰj9uϋy2^T0#Ԃa zj1#4׫EZ^?n#|Q_g3r-5~tD6 d}tpAaC%#hv(Py@ {*zp^wKțs$:kMZ [Tl-1@څs4vih$97d{}Z"F}Ӭ[_ȥA@`tK&g0QbXq\}/.P1 bltgWܣ?bI}>l܍Hr7 ;K;45y ) YUb't9w95ϯ*.qP7q i5/k@3 `~,:_t@:iRtq@^oxޅ`,Jh9 gqennur@>PPMondjLuPg?b%#ya%njmnpuثOoHpc%1W{"r|l>H{PĞr)D0_Fb|_q;COqKpײF֕QZ0qft\ pH[듏dЭqD{In܋_jf3w:L3iM:'VtgȀM ~Afo_GE|B[tkfS5^6j ""K["`_s\O=BFрR"p;Ì`{8"/}uA>:hSzPh0#|]Fw5ujo|e3],qGY`eiCVgo6oPx>R[aQ= #Ax@-?5t*xe90K^s$>K0_GBE"~p&m#dƒvfJgN'Ll$"L|ɹNG@H44~эe~hF|ARV8qRzPVxL,S}4s_ޔ{xpbjøuz^UݖsX,QN2_eVKӚό`bk-MZuTKBkWx3mzJihnߔ}3WnO{ܲI G +.p^֧ڬ S,vc+%g XBr4o2X7݅~\hjPWfkm'ֲio]v$^/I[z 8|Om}?Zc 9_T2a.-|VNCgt^^ d&Sm 64`oywybيnb?a=Jt xGǖBg֚sޖ%/=O,k̒ԈS%SǶ3K`=tK-W@ڂ¼+"=Ǡ6!(mՆH#[E">o鯍$Ɣٕrf2\]q$IT/gXsdw=|Svd p6! ef-7} _0OGz/eD<@IZh>5EϟZ" ɗua?uͻ5")Kdz SSGeYjQLUagAWRj*?)#q-qPEmEM% /P0MmնP=LSN !V G0nA;}HHQqr bHxj AV <ɮfSR>dzkMr_6F4e Ƭp`ǁﮪZ)h[qx H*yʓ E|tS*| lw6eRhJrX][WYKpUgٺi4I.fftA"k% jGkv@HHS}JD"HK]$Uo-nRU#'v)AMM.oISxc"/ih$w0nrﰸ3JB/p:$%hœ(t\t@ƈHsd ( 8!b$7ΚrW8+~^-`zRWQ;t×=Й* S?>ކgg˝6AKQpGOR,leQTT/Ͻ-Sxl`O)4앫8,{/OxLgJ$U40cڙI-8v* mW uPuTz9P7KP WXFPk)?kN-х~*6 s Zri>MjF:kFw`65Sp =r@ 8^C(NE pPY.9Ȉ@bJR &fvч1/ErI?|=ez̈́N9iuu&u nM43sP%ydK=`( = ]2 y |TIW) <,$tIbIv煺LfkR^FM a-d?z#tbLjU wX$ZpAG&vtYև駶R .},s@4) Ṱf1IHK>k 9)SB.Ԃw }^Ո1gBqyhcR(Q4X-K Z(:[EfQis`a"7bBCE '5˫wY:JGsJ#_"n3#1ҏ\_m,N`W,{-mH\caJ!hq R{Uښx\E%W*L] {iٙykK{Lg5@jF^*68W͵ʷtC _V]P%ܡ8' _MFV`U[&~l>53?yYpvf,;74 [;lI>1JT0rݘ d9l7LR:a8Z"u-x.OTh q/"Mtj?NzeiVa;Tմ zIZN"9ԣ5h3kh_w*|nLGf]s#hrS̔s,;=1A Qp{޵>m#+nFƒ ɏ\*V.UR(43d 9ek8HAMx4C cA/IRfƌfPnփ!Nk^>)؅q:qmZb;ګxjAigfwmXkjҙNPPs:]e}>aQGPgw&Qw#Ơj涭ӾqB'$LbեYG''d&'=2ԋ+M9Z"bRYE؇; 򗼿&+Oݰ 1*vpzo۱>,{QnIj 7jO|Yٌ@)V"+xb6MW !Rc]d}ѝhDה0I !#Qmյ\S*+F3dfS!XDȌdYnm^V/3 f}wzz]m%y dfn+ܻcyYνmq00bQŎf&4NBf˲ޗ9%6[q@fVӛEϧ{ 4n "~#(Ou==;jϗA6BEY҈Un@iǸ%SnC6mk5[tWlD8w./a 6txLgk II$MEb"b`1i5;Ht `7Vfs37vvU#Q+:[M5L1M&Dh̝ttP"P!idO+(kX44(_/7R{=|݋@i 9p@7>6c*xиG쟍zs_vf[tz6e,{;?2m&~PCo,RNU>D]V5e]\6?rW"WEsu_+Qk\}L5OeLˇiQHk3+y-bM4#^$6f_Suގw# `?YVrsΑҲSgsv_z!(7"D(JT3.CN(2R }3C}ӣVm:Hmh9} +@N8E.L yO(V\$qjDsea16wj:7UNӤh0#/{B&jw*<;l²'TÞ1vkVlJ^ʪn;q/9̹! 98٢6+unδ;m7mBA?~٧_hP8ۗ٦zi:Z2;|]qCZ"PN:m쵃@Fs.VRSfv^[4wk6V֟z>-fڒ¬]UtפO,tKڦWªtw(ޕUG{;& t/2_#9똺YW#h;lSorNihOb$p,FlAjcZ34$:&+Ub)#12p*0"f$M3E:F?Kb)5 RkwU]QrvP ˙5W7*ul7}թm:K.LdGVvTO/:yoN7#!MԾ hG+] m4 TT>~EWzi]iuN/}릶UEo^Յ:D t/JIP2hc3av`ܢ$.X**2F 1Wbc2.oclфG(>B1:#-Ig\9i^ F(H'z̫9_<[܊]Juφ5p`Jp7?g2m;$cQ<5GV *} vڔWfmX[4,?~=Dٳvy 9 2T u%^c}n>baxLXD1DRdE~2e<K]upP Yu_2Zwzlb` X?Q.k0|R8>=‚u3@i#喙PU(d+_+£Ц X~~|I'j1^s\־3`QP#r9$5YYa-WU?źaȵ9e/_x:߶FVwj:@vUVwwDV9[G:}vhxe0Lʛ%j)s,*^wvYG=b\^- hsuBci t҄☍^p!+c!<@l3Y ֽmY,XI v撈8DQs}7)O\U饭{!䱑$&Zh;9^ \޹74jU4%Lk| en/auE͎)&]+kq3Zw<@u^Z^F$i7y7R[`iaL .ERVUr-LX \6TAΖBœ۴j*FhW7qٜ7T(%uV]n&oBᰓ|wD-õa-iA~)E.=p(>wa$w)}~^qIJq#Bop-YIi"Kr#'xgc=y stPOը >8F`2\p>ra#+^<`;>'AA%x 7ݖ;hܲ@qCI9Dxq)qlwqffH%Fq'X}Xܔwӧ>ӻ ˗\|tOZ:*Pc"FyMW]%!;!cw7ߙmBXhe"Hj$`4NȌ uyU 'l&X, e"فRPXgRL>;PgvWWb}v`* {@XVI ;kTp#Ï)FI21D53eo` h1Nqߞs||p4΁f9s8w{ΡݞsY04C͹=PSh9M=Ph9Gm@h9Gj{fڎss1CM.2sIj8ǘb{f؞s l~8^;f׎s(ܲljQEU<%@ua;(!3Δb4<:LO-St \:TO{ou#PW5ԆSB@{߲:@ʏqbս{k{O?(3!'2@Sx*2"bodLua $$ !` X&a.8QWhoaGp;'F\P~׊_^qQ]ɀ =,h/\\VWoPx'w!7XuQB*tL2'vA{; `p~B*F'TrpLr06iib3֕[|+y>y-y ^KFVx,@Z$\ϳf 2x7ӓy@{r3|F;uW2uoHx i+,un͌\|wQ[1~uzȷOn?%_2st6n-.mpIK`w{k^nД ymxbqN!7N.0FNcv ПǙQJH)<R*(㌛(aJ/iRywbOiFSB 6"DL®sEvvDxv%ZND:%pG%C%eY³TfJ+Id "CdYSixVܷڛyIطk/-]7tzfF;:$&1Pr+e,Hh1%F(L!N9J!M,jAgȪ-`g_i}ʄszi gofT`~ w;fUq]l~7Zo,8foʝr-fl-ঢ়Eù(?';ÿ~}l0LĨKAt(@ !!T,45&U0ie %I}5}=}3:f -ֱCy}`hkoH06itN: 9ngz*|rݙxf܋2xjU+ҷe:P]n'Ѓ][baO򯺄+xG}@ ő+7b18KQ/QHh][6~cj?$כ3N2Nf̵$jEί_ԅ$nuNLZG* UOMvYJ ^#ʃh%1m*7HXeY0'O_Ć?t&d !JedLFRA KD؏k%<`1JgsB3E-v/sk`Slq6lgw4ͷ\ݶҹ$W?߾yKsGm698^9 ~R{j28ԧŗV$4 :&[;2֝G{tDKh~}(VgkT?6c[PغWX s]$T͎utOkE]w?2M> ̱Gς͟Mb_,HͧM#% M0b?A'P"v$O"x[|LDZnA}K.uQC}On{pЩSG/^KqSR}4[._DWiA$WD߫5&ee^ {mew1|`q8qhlO &5Brc($9Bc($=zB1 B1 BGPVq ;l聶mfC͆ *l uD/A-l@P A[ 2pc1+0c130scZM,t pV $fBb6 $fBb p-右`-13lh3ņƌѤ+f2 ?4D}O1?1V_rCu]E;l>GpB13 B1+ sBGPV\/rAN`,fb^`,fbn`:XkQ1,@Hl@H,@[sL|4W cmabcAvvHk ؅NA(fb@(f b@ *!6l@A-l@P tlz6:9cYrz䌅+9|B̮ZpbvE47h*pֆ)KN']*Iڂc?f/#х9:ȗkHinBJ(O?d,MSxOa7oOyy9;{~~59Y`$ȴ⃡v$ N'za{86xloچC=h*t : G t@(k(Cx(e1b) ( ( ý_I`8kK5g!+RDQDQDkQD+Q>7NR P1S1S{m)p ) i9ﶊۗ`B>X, ay}A| W/M뮰s "! r"!_ r"GV w6#?DBC$?DBC$?D軭=9om0  n=5*6۰V4 9aEC~Xѐ+VHU7 !gw 3!O!'2{m) f+ջ0 S1S1pזA `цht):lQUZ@ܧ GÀ3 oWR&x{5'/zvOydl Vn#D?VK|xo ip[sj=a2ϟ ;}kݥB7 ̽DS FA'rA0t𨹘3SCqQ0&'N=;;1zoB(׏ٙп?M)7G),uˮ)#=uXdjmI,e`*~C==I~|95q<'sg.n)ÕW4LqJXDzqJJ*Ξod=q(XbcX?^_7܄AiY`nmwTO`t9΀]=K_p}KaC1Hns'z<Lx !ځg͓ mWj젹4|N]^XSe]֪Gks!wu@l8NS]|P۪}m}JZ*wZDD)Kj=uҏ*]2JF z:]Xz?\4_pzV7,N?qXwll.[6~fϛU_|R)R6r|'6y^ W76 *F;#GF98( Iw{7cm/&_)CW)^QFy$%JHE3_wcvܽjệpg;?`\ҘkVmK"Ȯi0DE*&2ʎГv1gۤ:k땧5J}Y*UR'ЬoƢՏ4#_8}kHl}듋˵V%=L|î\7]I"'LA0 ܏I$RFw=%+"R?A|5^d4?j[ -ಔPxI"c_*jADkh"偲|_а>.tqk_e+*w햗Bog:~K:aU,mTzoPw_WTV,4hw,=yn [.Hۧp~Js#{/ۏQY]M)'*Xv’7|.f%v,fJ. a nݫHgnG=/ O&D9z"1/cJ/ɫ+?1_KebYsax@hȕ0!LxO]0JLJ%<"?hmfeVޫmq3 BWq03PˊWy_g,vbvEUd|9reIsU.|z\s:4ggz1J1h|'<<Uc `R\hbqo6TbӚ Yʥ|X(~$e[^XU)~ wok45pVE0-.ic?s)wۜ_2R[=f 4تZfԷBiX_BlZ5?Z7fˬDm6lf8c2j-6iZ8n-9iF@'\MK(dT-xSoOOW|f%bMS 5y`1.YdY|8hWڙ_pNvwI].F؛F(J"&$"R0nnK== *=p~ГD=Sc'6Ƙݟdzf:&5.α]@]J܉VIoL jL:ħS'&JZ+m=IS7M@ IT1MSNQd jG?^ust*c<#[į"-{Zrpw#zLS:΁k&jKpLF~7 ׸y7. kfzfJghmڍm%[rTՒb!j;n(jd RGpo4Is|&H;u#3SOoTrt}fcZQqh,;gdOmϩ ]wg^K5Hԋ̬@03BĂpˆcb24j~J~|Ua5+ ,ӴdtO#hݙkβCP?DŽJF8Jz*d#D|+9:)Y!ӫ2K)AKJO M1]-E .W+/ݴWETfZJ=M^plQ+Vz[tk͔Ϣ81aEysg %VX"oyp&Oto-|]Ui*sn~)ͪJjRGW@n)&*?[4Rs!Gȗ?n޽?qHW{`5ki׎cցg$Q#R5HJ$aK]TPB&$ |@&2?U]~=G?rojn_zm΋ qsuy,EᎽ|i}<@GfW6g j jKGsü0żҶ깗%r1vYsiSeM>e竧aB?uњVd7}n&ߦdz 3뺑#9yH]eWHnw\/O/2_ƤIR5#opjLݒD׺V6. fTMZ4ƑG6gOpv>|R%!@꺦IVa Pw7˧c+keߎ zauT 2:osЪ|UnEEY$')hզ/yy,zQ&盥*"Xm6]}U}==iQ־mTqcގ/V7}s3[-*)'ՋM:i=qhq[qN|}ҰpKu,x/'1CǶkc>QbVڸqg1{5aCMxH~MRJtPd.9#q=a3o-ZcAsוO9). 6YtZ;ItuT7;5_^9#uNc.'spfa Wq/n{fY-@e!=|aVyF@pЧ rxJ (ZBI4xIZú4Սa\Ůɬ?4je (Wz܈W_-@#9,DI|_oIS%~|ZRm:kgHS>oWjL=PSRdk4Egvο! &_NӉ ύvwJ6(=N~~"6V7h~A4&KXea}Cq^CJ߆:xփ;}7ЎCf2С}ߢSw:,ZY tVz)܆,u-Op)S:_$ۈc-G7e]ֽ5n1LoXVg'k⯥S (E"L \hVZ?L;@:@%׌Q (#{G-p*j'iӏӈ |vKm Gd. ;n2(X )drEĮeO~œݛB4H%ЈcDcaK|V8٬d}/k ʝ 9 GwyUϏ< HZA$[@6ZxP6V Vq%Ç'|d'^9:7[LZ̔P !1'%V ļ9IbڹA&+9:o<) )_eb5n)Oq˜3ez4`wdRݚYX۱xYK a}^k~u=k_l5cJg@S*$Ђ Z8$G@!M =P ^s hYKD@!g"FӄUO[%=>j eBl bZ)mXk#o2!Fc=1GStYKsbD201]1~aFc"F9CP`!` ~85/';kflUcdVK$3_u/43hD [b2+&Dz%S jh8X{}|x")2q 瀱5ʎLZҥHN J'̭H F8TP/z2)$J 0OTi2gxUM:p lYKY0f!{YMkǝ eQ b1Z EFr cv`'l_kJ!峀\:G@VڰvcŜ`PQOdBhJd^(D$:+#k¯ F_I[Yn@G@L c vX==J,6ƹ(:\" vnCw;G~w=Əfڵ,쯦8r.W XP_u8d-|4.p>ɘ$L,رt!ٻ|#z,-Pk',Vs4dak0mvnp9eI;2$dZ%Rp ،@0a<,7VY"  qJ !soGq 1q.2d_k"@%ayJozc=1LjWe֒-y ]x V2H %: 0Ɲ@R,@KlJ<VW}߸ +":y\ImPMy^|N N*y Ery:`5v~-Xbp5/"zUE'9+R,C|Hv;ʍ<.{ ݙc;/J^t|}D3A9u K% {Č+0 -:jlgodYKD,LI岨?W ts/%:DJZ3ԺkStSM) c{z[wl"Q%X*1|zOԶ̋Rm&r9_پkv4z$2ߜO6g)ߖ(W^$@O=^)N,I]VtC;χO06\X~`&< !,Qq0787 j wySFj] |la$z7vSJ J tBBkO4%*hN7&vT8¿i] ((m!(feGwdhG)-†~@XGIs|_rz;HArUu4"1?B%W+Yͥ"L}Ck;̠6H8KXGb},!, BzN-'S`B&(p_(:h]#`S#xZ?;<`{(SHw–õ);)Iv'g:97-ɑP 0'y\If 沓5^ ]m X $YlfvYiiĽ?ۜ-DYIq/"GGyaD334)Js,YuL36s=1 ";Ա#5<"BTZ ~:?. U/.i] Dxi Q5趬MJ&er"W;=r_*Ǩu* q_w*>, |=#{yLd' `~ɡQܗ IUёt;Еs( RG1ᇶ3A-8G)6+gB9\Xel19bqBƁcf5_z qrݚ,E\Dx+ܯdt񲟊s1{.KԦxGx `ō`h"ݽd$w ۡi~ЩKy<ۖh`.#Hf^(?˪X+L 3]Ql39ub!=?r|jt!ICxD~/?^X_ ܗW<_uase?qM7 hM\KEE*^¢5]scEy;X4\`(9fg=S@JCc -VB13sӌ7D04F`meP-_]N/yl51[pef^0?Nd˷]O9Y^9Ɩ1Vkh3cE^2F1|LXCFea u #6?1' =c?Ε#/%9E/ɪv]&Yq3n憓 ̸)M]VLV Q캀{+FKK ]9P 54Bkf[m*7l&-Z#GB\3|Y;b0Mr>EmyAAj+P.X] T渕#9/Z*}|Aхo bT1D_$!/Oy;g'͂-t#z%]jsoY9aVEqkԔT G BZO,:#H>X)ISbE1<10Ex6F$_-;sޟ]з9:b[Q><)a7vHґےR&l1 +0Qe2 !-'/ {\ `=|VY463 ̓Io;|uN=K!!xWGJYмcAGݡGjY/ͣPᒋ뀝A{xqw_Q"#I߳`jߐJ:RJp\D̶A{6ω)$ݷ2 ǰ RA>5p~Qj? YfG,)Db3L'k(zJ7om5?j6Hɼn{*suצ:rWWףoxd,UNd`.lg4Μ[ULv >sT7u5c̆764lϑEW̏MAxbsHU(7f&I|pQILlT ްaXY?5o?axtuyW?a,eg"<a/;%]v4hIQ^gۚgt#nv O{Qf?̫ΣPI/i,Ob'N O\߈D ghsjl.0ێcڱfcf@?vmv|۶<3r?lhMr2)MYt|:%MIWJ6t,X/OKA!Km$5\<io|Q=Qw})X夨:[a%j@'UX(s:#.ϲ;Psdħ}[iߢ댌 3"§z|@ĭOD?u'x'_ekEmpŚy+VXVg SY[Yn gUڶ*uhYfWm* 2d>&uKQ+"V9Ƅa++_V#̠OEvw!RSULf<&0t8жU,ajW('jŏhӵX!UL),߃5KiCů^nyZQsPUn7뢨y6lӺl.\ 华 ŕ<1 < m떞X`(6kƣ{q|<"]yT/kBᅠ J-*AQWgJa-&\!ø*C>*y?Qx`{Ci'TT%.[>/#kRJ!rSDٱ)J*j-t:_mYSH[gс(4cAA{9߅A DJ l:ΥuZ;^JJ ~&; >.DB`I5jt $9@3"ZfG@VW2Ѐ|#蓊TH{͍4WD2(=7րN@K#B7鵏X SMTZ'j^).䯳|Ty*,矷24m.dJ^TGY)"wrVX8 iA\_jE@3w[B+Z,CN7Q&MMwL)K+{drV+ i<6+ŕi 0[b#J)S䉕v ʹ9MQKiݎL+hY(_JU?jߠx병 A~J"VK0&\Eʢ VE\(SĪT˓FPkBR Y3nf &N?.aݱ>F QV^Um@uJ\#UTr\i!2CWF8==Mog%ѣ=еb3sZiiU9/ZiT܈:^#m1Xtd#.&;IjzgDLmk]r6,piI5'M-D髮o8?zW@lmjtrk;LlN_c%`daLjbڂ*LJ܃dOj ]&34m߶gn{/'&gbIymFhױI=J M. e أa(>\X,NfUY?GWѿr=H!{AYtNz0̳o#㴼D'fKǰ'x1y@[ dl9wΧ^LgfpIwbD|x}` #&w|b-{n~.%M:s"KtZtk$\G]zy6i |0{pٚ=kv:3v|<6[F~^\xGV((Ʀ]' cg8 äU0r"DU#S-BpF& .,Q&K\ޓ%hJܵ/XK N.=CH_- ww?ջj]Dww9L_16IrȆilC0z/d32l׺ǐwƱcV]Ks8}J<涇FDmnoK’U A$@Mږ=m&e&3_&207V)84eS,ŷÓg||,$|;ߎuL^YH!͑"S&cN2<ҧ$ڊܥɄ&M#3JvX:HǸ}͙ڒ~kis;z6~7Nb PRf~r|FuzZ$ؿ:1FVaH'T 0pN3yҔn٩7nmg]k,U[40aNU)|EWUSpc(pe98N#dH~ )w׬фU!N(zjtz a(:^r($`"Q!h^k&z:%Lt!.8Xa;+:iJ>7XZ V3DFT^D2 vV{go5.1uj!GgI0.U~! Fv bNjy#2Z AR1a!Y-c8!IJp:y׀:nܭ*=y W$Ydz ZĪŤVȈ vDxf'_ XGb33U>6eL9SfϢ$eDHoj//Lf ?ofB|ҺԖp9QwT<3Jg$mxRjsGs8YYk@{Gvw~y9-&/FlAid~K~G5vܙ/NM?C?wgOvڰ"rUjO;ew'Quw")j)Nk.;j(ꚣ$>}gNӏ]Nlq!;qar;[?ۣǭ4mږ/dE,?kGI>wQӼFud#Nmu߲< Jy}j/j)Ј&@d7 e9P; y P&aYn.d wp*GZj[[N}+iIRHAn5&1 V+" /G8IP.J]Scy # GzD YHG5ɷha}Χƀij0}r]Q Di=ŘmJ9 A !h.5jXZU Ib=XȐİCՐ]%8YhMX2$ 4mgI"*BA5{7Ovb)v qgd?7['Vn %wޚ\ЋEyuX\& ]t+%AlQB[ӤWnic\M;Cbmdp@/)3gV$[&vgVPhnp<.o{d#N(%3#nK5% .J=*1 b~7}3~\A_L0__f\naL+Q If'm(jG Aj¸3!"A:E?nrGFqJå2*62weE~=<*1= ]zNUm*)  GR uҀq2yxbqL-6=)Mj.5Ho.'e}@%eBL\칠<Scu{d`!v|vV{Pכb]mp/RU)<Đ usm2 BgPcx(׀n*?\u H' dtsW9^sԺ {ٜWX9V-J$ a(Xyi)UtMheOzd%n,dw5mhKzx22;U~)cYp1\%Rqc V(P D ]Cs>[)e<3ԇ"3vw4M Q˄gQ1h&b@Kr@?obCZWYNa:wSM SKؽӒXz>  L B9)OyۅN%C0 JJqOކGh8UB0`1US,GLDøQH#e1 Rx4 22km蜖-k.L@ (VD(6-h@=hB{. {40$q| dHnV+yzBVmf646o&㔬0Jiٖ2x*P"2egyAcxPځ&g.Xd=t]3-Vvs;;!I%y$ gOmxbQQt7!i+nKě~ea/Q613%动n_ZM3A4E.H.-w@wgIP"]xt[ML+۩f8Q"M0V8B8L"n|0c&`ep#kX*Įq\>nljͰR_ APs,.$sDP$]ia2P}MOxvP&ɸ.99}[3qV'Q.u\d˹.fxia\C(^i3fl흶6 e{_c>?-0Gn;N<(RG \iNC:1{IԿx&t0}-( q&fGPMyOA೰WBy6EπFᗨfym-2{ EI?$pt>73eMrFq4`IQQ/Y1e~G3ƶo)ӧTZot˹e[q dشCرY#<~ܘ< \&F]X8g^1CyiݵgH>5W S=g%:o/棛Gvhתi GP٣YҕEX- %zRЂZ>(e9/^}GBA]Ageݩ~0ҷ&?HDS# \Np"Mf{[)/^zj=./;-| KKЏ ?X|9Ȑ|~z]ݍ[Vhi2O;ә72hFJ4N]t+Y] Š;^wԣ!1D+MUd^b}3սϙjj"\K7Frg` 1< "F`I"&h.(Ӗ^ԴtxtmNU|U+MGV9L|!yR[BzuyJxև8;kw-oqM9d Tn~'ӵQcGXLْ!J_Շӯ5:eHuk@\qݼl?~՛- ~zCYk@jTT,R5^緺Vm!Wk* UIZBhۡ{@me`ܠTYm2uk$֮Plvn%J@ ZVpKl,JFPReg]Yc4FWX/0ڨN#X\ #ʆuhBu9h)Q E[ Dqk$4znq*p"fV5%Nlՠn?K]'E(ؗqv(k(Tt b4i~C9Fx kɶ t `Cht;.U.hYFܨfm^PL,vW^:/V Q2UJF18/: bf8F[\B}۠m > UwD@f9oL ;UִRn* (iHjeBR ^5*.:ç+ (Ilšyۦ@pw- תQh > 7z:s2TẔ[eKu@ :uEQWE#*6[Tf/E\m9^AS>tGbB懮m'ex50-Sƞm@ X_k <֠|z]kT|!5bD_[^cDp.nh A{.09C{:5Cl.,eӨ|&KKz($*;*2zg ADEO(}qD J)LkQ6.D#x3JŊJ[LHѲZ֨SbU)+5VͽZ62q=QwhmL7j;sd䷑f 5`7QTL:+QDn+PWd*CR4wz zmgx #} Pе]MG@Y2'B>5ᨁAJ[~ 6 E~V1gQ `_ޢBU&QsaPHx?Cۦckԭjo( WJx^c]yZFFVfiv%nVh |>p(<[cV`N _V_;֟{fW Ąl+~q!.jS+ 4 ~^|i~9Rfð {8ͣ!)0|0/ |ꂑhR3 *?q,]s/jڴ5hn7YpJZEN_M@_nvgsv" Ya(hj֍* UC2ʖpaqKО]q̷<Թp5}|"nYYsYu͖5(^V[G(/Wmox.3Xl0X$II4Q;gYM$ts]q3^m cE" !qA%4R? =S_dEH̅ˢ>l0{SKW=(ξ(r20;c8fh%qY3 c#F„'=j%|E0H#o}Y3۾J$2`,"EIrh"I.+yA+|ZӅX5 /8+[{LCfgqk;meSBe!uIgxf.=@3=⥘RB;. +Z:b8ͷQUiv"TJTlCBPOWfr`Ǵe=O!b4.sfrRj7`Nq>O&bK9'6']ӿ+kF8vDU>^:gǽvD1&g0U<.`QbHNL148LrDU `H iݱ ۹[}nc}d?kAuWX2ֈkMqz"_$nݬ~'V,QQrPMAg8W.:mペZo̼󈪤Bm4J¡r>ϋ$TRCp CVȵ?YWI+: | P0Ta`*E Q$|wu&?[ 2Dq+ :ﯗ l+RJMadI1 =RGVZsi^^oQrIwA{/N}FП Z[Ó5p軱U zPwĆ;;@|of}/ܯEw'(OS_Y@e D8IWfI c`-9X0Ԏkp0æcR %rR?>&+ږ^sBgQ((P*~a}=Y9ݏyvsUdWEz` &F1sqH`(CsSOB BHHj<-V7M9 ɔb8E$ (bdJ"ʣ7S>XgXx5a_1{}3 zr-|^m7RndOW©'\ Y$@?4Z̥Є hDՍ92w1AbOc:cMPX354r+)EqDUk V+Iu=%vخvv`i*^"B'`M4*D SRwI0S)ƤǕ"}rY2(_uO >Ty7dX~c*Ϯ:@.?AWHtKCHciʈH?π{B,I="}Qr!3RGn18~{n7-UfM0S"_~ d>~|?ʜ: v紙S ^s"r4xP>lRe9)R>#X,HW؟  lyXtF ȇ@9BEj gMۇr#DI&Qr[{{(`4c,,ŀLc pʙ#6) J@mIjN,oA) @wڂ캺wsohon5,.՟֟ #!5ֿ@ޡ4|w`c f_)R4h6QXnS,1?2%fHƨ ezhmSgX~3\rPfw\01y3V!z:. -F}l5PG c"Bݳpճ FQ@J,pو콷,A`M8fDi85IKR5Ü9*r˷-'W2 ,Gp}r%%xRN% "!#XO{I$ǻ)ȇ%p($mχs$LQFPD( Ce\g Y,֬ǀumqSfjm=1Kqjkjٖ-G%MVݸ]XHr}.&PE8HXꃻ$p#sR&ݛ賫nDwQ:eiı(8ALG[׋]ih01}##vWfP)6B;Yfhh$pHy];*]zfaօ'|>+# >PI9*`OO{Z.֎c"f HѷZ(4(`h-K0 X .S`BS!G}?PW ;,,iye A=*m # ۠4owתV8- W𑸝P H7PWٌ/cR6f8@:Lo(3yu (SнU G(<mh7GbcETXr ":ShBĶ}:]w5XoseQo9Eln-\F|oЛgx7ǁkO__˻u]C|qkM3i$q}y9kkYZTuӯ l_W:)_%eg3$6 Sr "}Tt}["8t=1uhÖ W&{"IpϦL$ɔ MRlj;|Jlp̼돎Ѯ52-oK-P CӗK҅%}t0cAhp]]xQ2Qe$$P"SASSyo`כB2'ig c>݋Gt:[_fU&4ʿIZA3-u[UCݏlGYΛZUժya}5z)f[7hzO4P Ӟcwv%T\i}¯XMs|6D̳̽&5%dyJdvxoF5ŝgyw4VH `mg Ukj"3pWYvTD'Qf6OSirXFK螘A  AKʼnKN` ǕVW9Hp'[fcyc\ٗ3:EL<{> w};HAdrB$!pm~YwD[4EFД 1> G> 9BO5\ÊB%/FDgD_1|n@]/}8aV`'xvޏz7] 6Ӊ0|̸˙nK&k%1j qXClxZN#pjKus0?m@vq4y'0E\. }4h]op:tm Flxy=:vxת<fK]-&rV@=P_@Gqk5~ )i9`MWQcL0嘵%uȄ4AUR| z_61!{CE0C}=*qYmGZϧ@dbP<ڎj/QcFZK7X!(&!H!JZ:M&V8Pλ4mey]ecjcqw<=<P8UH.[Vͯ"BGWhZ>ft?ɹZצn]|'QY-yѥɻv?xuZvxeF{PB !DeVH6>D1]D :ad/XnPYhIU%KAheC/#a)wr8dMw uuo4||$TLmkg9(B!LH R`S(Љ nn(B-wϞ訑\kD?8m<Eaa$IZiu0M$u JLU[VdqQѐɻL,xFx+wØs]M={  B'9y{-wWl0.?2b[SJ HCr(neV"E痀q[{e}W #T0F[6΃\si9`wrfCyi};4EGL.^po6@ww꾮U;׫ؐHw5_ ]7yr3Ym*ۧnVߵyO Ҿp=2F=S),9!󙝈Oq%ǥLݕ$Q6U>?M@h*EJxK1ysNޭvǤ#Rz8"ƴF~34cZ !6U: FQh[&c*dBNЋlrvg?>j<ލ2헴m{$}k\Z9R}8')v|M(nO|3Rӷ`:N×YYhamo4Jm"H1'E 'yX]-ebȈ6N6}3זLͷ.5+Ւ}yݫnHϋN G>o8h%1f%" !w!3n!d&P+C$ Ci(huJ-¸kS' 7Yd ,Zmm']6b%ِl"]mXu1@j*^+O^o5v]]msk~vAC,^y9@_O:: u #Gr/ns_L?V6,/_niwr;mޕ5m#w >+ qJYϦyApJT\~)NMj$Hth4("č'OBK˿E:[4[L?N?|=}e֊<ޯx=DMW@<7/r;oj@  X&&[E.#Ԃ!Bb$"2UU}04Űx@o.ޖ<YՐ?vp;FfsAv_2F8 B .7bBF3Q쥣/В OCSj9+CcR{V+e~V}6K1ZwgAvvGN_T"? ADg p?)Qc+>E,03x ]'L%^@/R.$@48\4mQY[vvRKʃ 2Ѩtm*[*@ <6)WR' EV|^J@b$@APaU r%qV t,E2Kub?F<y][ʦ|,}?-r/[ Q>WE))Y_؆:Kqϳ?~ɦX,L5[Z"7n".lд4 2@jޏ/%{y} W?*j4^]'$!eU^J?9v/9i!pЭjSfpBo;l]tG{VhyK٭5Y=4|W uK^l nLV,Khe)k ,t=iMvf 45hYc7Z+|Oe-KaA.ajeM֓]ufBëuޭM@kF `onVQ˝|Em ^ٱx^[ )U2WN65hP*ǕUOu5iyQ,6t?؍ܳ:V%uXtzI F߿BE"HC0bI#"c/7S{ny–fƊw^^Z?bPam7*,ߪcu5ָ=1y9ʴG+e;T5fӃ=o"qlj9fTA%1[\Pq]f7&9[V*|s~hG/gƿ}:+h2Ju`@.; ˌӒ<b-(96w~:erC$mv?| `2<|Ŕv2tg}_ EN2n49"+qlvi4b!RHʹG ~!7vί.^"m7j85◃x+ww%Kfջ?Hˏ>e"7e2=G2ޒVz:Cu+? A?(9!N08vls<4Шj0$G~`JN@xA#J8H(d>ǡ8mx3I-/Ne]|kaɿ^7 z7@70yt?p-O3AB9x5A晘oX2b=kRwRutެ=hl=(|uN|0lpd( YD:in,n!U:)n$S$οju€(S@?B 'HISh*ts~f2i?s<;zY*'ÐJs;v %ue eWvDn7,|֢([w=B9FQݾeSc P\T1v2%+߭<+0|%#Cߗq¸&%qgڳy_efE|fݓlPϜ_Љwv=wn/ЀVҕk92es]ίvB6|B\J1Zvo(t< ۄУL*s/-JRرɀqBpr&yeB9d{, &>rj^035+~ :,zGԑ=Bʳ~">nMOs;Ͷ'a?x+s*ԝ_N-?.eyT󢬝jXVź_ z\ǿ~euyOz(! ts78ÒTbJPJ(!!Fn mt#@3Ba ɼПEN0> l,=80 (`#$<1&@_ڦz8S; vfHQ>ugh6}_ax ixJKN4vF: , Mjȃ'H -,MC)KbPZeHQd>!0t>DK>++ɟswSۈXK切bQ#Z.q< WTR['ʼ.Ĝ==#QԱ=₯.Kyh+^·q52Y IB\j> QT|294~kwmrHOd.EiWH`p /P?Wr|j \2A,$"3DRo*tZhY:՞x/dȏI)S ISFcF2UYQd%  Lcjw~gq 8‡]zrk)>w>Ic~~9Zy~Hҥ@M 5+G-yYJfM ͏UM-LvU:悎od;UUBb=uGm6%&VGP8f 9lw>e3`gClibzypp-17.36.5/tests/data/openSUSE-11.1/suse/setup/descr/patterns000066400000000000000000000000741476576476200245130ustar00rootroot00000000000000dvd-11.1-46.1.x86_64.pat.gz non_oss-11.1-46.1.x86_64.pat.gz libzypp-17.36.5/tests/data/vsftpconf/000077500000000000000000000000001476576476200175015ustar00rootroot00000000000000libzypp-17.36.5/tests/data/vsftpconf/vsftpd.conf000066400000000000000000000057511476576476200216660ustar00rootroot00000000000000# See vsftpd.conf.5 for config opts. # ################ # General Settings # ################ # # run_as_launching_user=YES listen_port=10000 background=NO # Uncomment this to enable any form of FTP write command. write_enable=NO # # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. # nopriv_user=ftpsecure # # You may fully customise the login banner string: ftpd_banner=Welcome to zypp FTP test service. # ####################### # Local FTP user Settings # ####################### # # Uncomment this to allow local users to log in. local_enable=NO # # # ########################## # Anonymus FTP user Settings # ########################## # # Allow anonymous FTP? (Beware - allowed by default if you comment this out). anonymous_enable=YES # # The maximum data transfer rate permitted, in bytes per second, for anonymous # authenticated users. The default is 0 (unlimited). #anon_max_rate=7200 # # Anonymous users will only be allowed to download files which are # world readable. anon_world_readable_only=YES # # ############ # Log Settings # ############ # # Log to the syslog daemon instead of using an logfile. syslog_enable=NO # # Enable this to have booth logfiles. Standard xferlog and vsftpd's own style log. dual_log_enable=NO # # ################# # Transfer Settings # ################# # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. ascii_upload_enable=YES # #ascii_download_enable=YES # # Set to NO if you want to disallow the PASV method of obtaining a data # connection. #pasv_enable=NO # # PAM setting. Do NOT change this unless you know what you do! pam_service_name=vsftpd # # When "listen" directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. listen=YES # # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 # sockets, you must run two copies of vsftpd with two configuration files. # Make sure, that one of the listen options is commented !! listen_ipv6=NO # # Set "ssl_enable=YES" to enable SSL support and configure the location of # your local certificate (RSA, DSA, or both). Note that vsftpd won't start # if either of the "xxx_cert_file" options sets a path that doesn't exist. ssl_enable=NO rsa_cert_file= dsa_cert_file= # # Limit passive ports to this range to assis firewalling pasv_min_port=30000 pasv_max_port=30100 # libzypp-17.36.5/tests/data/webconf/000077500000000000000000000000001476576476200171145ustar00rootroot00000000000000libzypp-17.36.5/tests/data/webconf/ssl/000077500000000000000000000000001476576476200177155ustar00rootroot00000000000000libzypp-17.36.5/tests/data/webconf/ssl/ca/000077500000000000000000000000001476576476200203005ustar00rootroot00000000000000libzypp-17.36.5/tests/data/webconf/ssl/ca/ca.crt000066400000000000000000000037241476576476200214030ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIJAMhg1/NG0qqgMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV BAYTAkRFMRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhPcGVuU1VTRTEU MBIGA1UECwwLRGV2ZWxvcG1lbnQxFTATBgNVBAMMDDEyNy4wLjAuMSBDQTAgFw0x OTA1MjIwNTU1MTZaGA8yMTk4MTAyNjA1NTUxNlowYjELMAkGA1UEBhMCREUxEzAR BgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCE9wZW5TVVNFMRQwEgYDVQQLDAtE ZXZlbG9wbWVudDEVMBMGA1UEAwwMMTI3LjAuMC4xIENBMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAtKq0Eq6sbzDfLsiXByFLNYymccotr4T1wYIeYVs6 kKu6zrT/urvy4Oxv7DqqhmXtyZFE/FuQ9uSN7a+04cJWke18o3u6g/Wj1tuL8fev zyrMPHqQ0eAsfYXssxmVdWULs3/G8lYCOCUJiuY7c7xAR+MSQ0vaCcwhqi6ObNxi d6NnYvHNzDy97KBYJUk6L0EVFMsMYgPv9VqpR5vVc/R+DBSDucGAj4DmnFycOlip eFna3lJr3XvmPrLyyJtS76Rpa51Pzrs/nrYZErAZOjOGL5WQhhl4eMQuKsyN2sK2 58pFg+euQwjLc6Wxj9dnJ3fWIXURy0ZhJRp8clYpTkShmXwO0IuT3IbZZ2eSSqKH +HYdeztZcJeQFlY3+VOrTb1KkmOYtOzBOR9aveU5xDJfn/i6NxQKO5dIQP2mpeyf upH64saSqvh0qcJwwCRIodl+BgpwqJ66nQqiIDIyA5u4zSGCOTfUuYKnD1t36Goj Ni4S2wyQ05nsknnwdakLJO7k+v9G7HNvLT0uoiySjmb/x7BRD9AQbNYCBfdznWhv aXdY/RB1gUNUH4Q8PGyDfeYhMZWupnWmBA9oGN+OVT2eYqBlYJ9zNanQAvraeuHp rJ+cSw1+hg5tqkKqQ4Uf76xkzNPPlygr7X7wQuxDdGtRSZHt6Qj07+s9tqAuii4Z NUkCAwEAAaNTMFEwHQYDVR0OBBYEFI8d9N4BsjyTRjV6V6q4V5Gj314eMB8GA1Ud IwQYMBaAFI8d9N4BsjyTRjV6V6q4V5Gj314eMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggIBALBFInsHdwQwHbT4i28LfN3SaCtXO4Slznx8pE8Us8IB 4F2xLry3NGZYO03F+m2E9kTJ4vYmL9o7H6Wc3cVwfp7itCAVP+oSR63YO1nnjJuq /3KoLVHSC8rjBV7zutrVq4iPgIEFOVLcRf6a985NQeIPxJK1DgxYdTHIawwhhPZB /T8G//NmPiBDz93OUN0rCsGTmi6DqdcTlY3kzdhTtSKJizUl6jlcs8GDoLHt324C siKqGzTuRVmatc2fVgGJe3PYuMIvoVsrTAAZL6qlqdpCKljac7yz5q8DvAzXoo3p 40S/py2SQWsQOsSJcEwkg5IE/vgG7PadJ/sAuU6DPH95vQZjWr/pWHR5xG7PGuh2 8B8322OMmpa8E5DnwUvdy/+JveoNZmD133mWup8WORqiLp7HwxJ6hwPj8IgEkdFn E9EUsMwgItHD8sOdUTegRm965ysZR3xIkLIjXCTf+vsKz1Pj1YWu7EEqcaAJV6JB 2a+G6VsQrqnlxp76QD6IkUSzdztC8tvLYzwCLzD84vvfuhApo8oFiYsBF0m3Cq1V fr4gKWZmn84yw4izVz4bXBmoFinmiBF/VwQXZcJjs0Sgea9dsql4FeeUhfK0MAQJ okZWCL9+DvgLCW5k7q17GtlGUExI3QoWu3n1dxptuA34lj4ybmTHXqn/74jMgnGD -----END CERTIFICATE----- libzypp-17.36.5/tests/data/webconf/ssl/ca/ca.key000066400000000000000000000062571476576476200214070ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIJKgIBAAKCAgEAtKq0Eq6sbzDfLsiXByFLNYymccotr4T1wYIeYVs6kKu6zrT/ urvy4Oxv7DqqhmXtyZFE/FuQ9uSN7a+04cJWke18o3u6g/Wj1tuL8fevzyrMPHqQ 0eAsfYXssxmVdWULs3/G8lYCOCUJiuY7c7xAR+MSQ0vaCcwhqi6ObNxid6NnYvHN zDy97KBYJUk6L0EVFMsMYgPv9VqpR5vVc/R+DBSDucGAj4DmnFycOlipeFna3lJr 3XvmPrLyyJtS76Rpa51Pzrs/nrYZErAZOjOGL5WQhhl4eMQuKsyN2sK258pFg+eu QwjLc6Wxj9dnJ3fWIXURy0ZhJRp8clYpTkShmXwO0IuT3IbZZ2eSSqKH+HYdeztZ cJeQFlY3+VOrTb1KkmOYtOzBOR9aveU5xDJfn/i6NxQKO5dIQP2mpeyfupH64saS qvh0qcJwwCRIodl+BgpwqJ66nQqiIDIyA5u4zSGCOTfUuYKnD1t36GojNi4S2wyQ 05nsknnwdakLJO7k+v9G7HNvLT0uoiySjmb/x7BRD9AQbNYCBfdznWhvaXdY/RB1 gUNUH4Q8PGyDfeYhMZWupnWmBA9oGN+OVT2eYqBlYJ9zNanQAvraeuHprJ+cSw1+ hg5tqkKqQ4Uf76xkzNPPlygr7X7wQuxDdGtRSZHt6Qj07+s9tqAuii4ZNUkCAwEA AQKCAgBet8w2qzseBFpOFb4Qb+UVSwsMRzoSdju92vEAi6q1pEMJEh2skdLxFyRK jitO0OuMrMulHoBu4D6EqYTEg3WNhhu9PiX3/vWJtIq3LesPStnOr1dzoPrSSD9j WntgE7zBu7Da5jq9orVRDAmJUN3GkobFn2PNlSblKQlki1pYbOPMHQePFx1fjGUK D00g7xcVUqrITFYmpQRw1YNgCoN24953qbo0AhllSqxhbpBS15EG0+FXOhjpMDpW 8A/YMbNPRydLNCJTnBajFI31VIP6OIiPtZTSg8/MgnewhDsOZJ5zXCihXmAD3o+r 4Ptk1s/9tHnCv8A4ip1J+GApd5PcmW46t2VpM9HWi4fENsH+FbA3yujGEK6s7T8u lWbhd2pgivxdMEES+Xi5fSzeTr3H5ekpZFNga268DLkdTHvp71vhRmktiQGa2SRn u9pPhxRTF/rBlM+ZnrDxB3m+TPdX/oLmEapGZPYa3pA9hidkH4D+BfjhtRzwGh+7 jlW4l4J6yq5934+aEozd7syOlBXw4gIYuDpWq95GMnEP2sYy+rysasPalda9zTB0 GMoTdipEBljBl4ZhqwlQj8v6LRsFUPIwIW34rtbKFiPoKOHBQOaRd1XOehisJ7GC F/+DA2tXIzzAWmheJqLrNXqWXL8m06+Qj34rNiVVHd+TqHaizQKCAQEA3h+6oCo4 ijAZcCstWL2qxqmfba7oSH8dGkevA+BngiIt1MPyRlTvlTcFq4QjJ5NRdUk8pKPA wH8YmskRYlyyd8a+tsM3JjKfUz+bZg46+i3LXJtJXL8wB3mpQ92JZs7qxjxe2Myu C/BK9Sqf/IE1tc3brvF7vL0Bhh2DXs+EkKDNywrIDU/sN8HtoQa652wogsc5mqch kN0QoHpPFHGbd6P+w6zNNHdNzJenicOi5QShjJoMU0182JnLb/bUMzCaVTtW0/xx Iyvof05Eoo/keUMgMLqPgBrZsimeCye3sJcSOpUcQYcWajyDKQmQLSWcxR1CZmeJ ASli/GO+vkva1wKCAQEA0DhiidCARDITONcfkHOXyQ0ScjgPOTUv5LJ1NW2rUNzq x8NNTcPB24ieK8JQZ91Xfm8ZMhUa0LZXTruAGSaLWkJShbzAYFXJS13uTHCpqlE/ qUwO55xZ5iXtC2HSxLNeD/Bw22lZ29EXh64t3Ql0C+XLpJdpGuU+VKmay6C7yQUe ZAlp1PxOJ9zGlBDyG9CXaDpiUyljyA/OItTmQeK+1GIvRyB6WM8Ju4fApkr3Zbao TjAO+2anQbEIEZTw80NVFytPz+8Bw9aANUW5xP7K2Xr3/UsbJbL28q0N7LL03itd m+dx0yPTkGgBiOc79yOMpr0knn5kFpQgl9+OUWiM3wKCAQEAmdcD3JYhXqP9mlBt Mb77HmiwgLjZLAzNzTvEnTy4s8qUT33+uHNvE7tt8+Kqrmg7zK2SkLzRbQEZu2py 3dsxx/8ga1g9Q/lfm7q8GCzW8BrzdAog/1lzHFpIvzYaSdgZhn6dei4YhTBB2hdR gwLCfk47Tqj1eDy3Z3ndWLcFK14T6gJnl8C4680mlZYhsNKaJClzXgdPGhPhxiOv zYr5kB1G/6MY5LOUcJTAdovGsDNK6CRxUOikBShPXBZp1aJd4ZYdhuiaOy/X8QP2 SVi7drjk/JrZdHIkQF7OlQ9HC8k12NkZHtE+1wleFfgHoR0hvOuM53vhyaouYnt6 yjWjNQKCAQEAv7CJFvL6gs3O4G87wdKJFDCSoNB3Q2VxuAuK2CskoocfJdTo4ASt /Zuicgqr11Lwb5d8DJ1dWHPloLgBUCYp+GhCbJi+SnHvpRDOh1TY/dFa2FMLDbLl GHol5mqijS/MEsR6QaSVc0blcKWr12gSi7l8ZwR1YKtXXL3fokNRXdj2h4YbBldY 5F3d+wY2veCk4vGM/56FG/NhBLQXXuSOZhwWBlciC4xfG2P4uZ8eb2dfPswDnvJ8 XH/MO9Nwl6OPPItFKNqSN2bMFT8hrPgca2dH0spILca6jeM/hH+j6rzlqtfB9G1x Iep+Lzkh/X2eyQosIjWdkyO/ddH7xXqI5QKCAQEAlF4txkOW3tkLmp5SUOFXf3CO 30OYhhiCXZqd9E2wWAgLW9TLQeTQYu28sYQff5guzdRGYLMeSTao4DQk1uYlDSV9 zSIyJyGFkhUe2XGzQNnAm/z/lSu7FL6dLBcKzPiHjEY+e7yAxi/UNfqGfLnXU6OW UFbt+UORHqzZo48RjB9VCkpI6kJT5evRXPKwKC+nJt0AAG7HmigU+imG1fCuVuDf 7M8pk2oC+qZySjXWcjNRlQ0JI3SLpnoX0pgbwpsQ68r8G0NMoV3qifPSrr/Y+hO1 a2VrN5XyWnBtOA7iPd2Xf+9sB/N1rsDuEYtGWgEeOPhIflRKeiCrtbXwB2WUuQ== -----END RSA PRIVATE KEY----- libzypp-17.36.5/tests/data/webconf/ssl/certstore/000077500000000000000000000000001476576476200217275ustar00rootroot00000000000000libzypp-17.36.5/tests/data/webconf/ssl/certstore/7dd4d2a5.0000077700000000000000000000000001476576476200243072ca.pemustar00rootroot00000000000000libzypp-17.36.5/tests/data/webconf/ssl/certstore/ca.pem000066400000000000000000000037241476576476200230230ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIJAMhg1/NG0qqgMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNV BAYTAkRFMRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhPcGVuU1VTRTEU MBIGA1UECwwLRGV2ZWxvcG1lbnQxFTATBgNVBAMMDDEyNy4wLjAuMSBDQTAgFw0x OTA1MjIwNTU1MTZaGA8yMTk4MTAyNjA1NTUxNlowYjELMAkGA1UEBhMCREUxEzAR BgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCE9wZW5TVVNFMRQwEgYDVQQLDAtE ZXZlbG9wbWVudDEVMBMGA1UEAwwMMTI3LjAuMC4xIENBMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAtKq0Eq6sbzDfLsiXByFLNYymccotr4T1wYIeYVs6 kKu6zrT/urvy4Oxv7DqqhmXtyZFE/FuQ9uSN7a+04cJWke18o3u6g/Wj1tuL8fev zyrMPHqQ0eAsfYXssxmVdWULs3/G8lYCOCUJiuY7c7xAR+MSQ0vaCcwhqi6ObNxi d6NnYvHNzDy97KBYJUk6L0EVFMsMYgPv9VqpR5vVc/R+DBSDucGAj4DmnFycOlip eFna3lJr3XvmPrLyyJtS76Rpa51Pzrs/nrYZErAZOjOGL5WQhhl4eMQuKsyN2sK2 58pFg+euQwjLc6Wxj9dnJ3fWIXURy0ZhJRp8clYpTkShmXwO0IuT3IbZZ2eSSqKH +HYdeztZcJeQFlY3+VOrTb1KkmOYtOzBOR9aveU5xDJfn/i6NxQKO5dIQP2mpeyf upH64saSqvh0qcJwwCRIodl+BgpwqJ66nQqiIDIyA5u4zSGCOTfUuYKnD1t36Goj Ni4S2wyQ05nsknnwdakLJO7k+v9G7HNvLT0uoiySjmb/x7BRD9AQbNYCBfdznWhv aXdY/RB1gUNUH4Q8PGyDfeYhMZWupnWmBA9oGN+OVT2eYqBlYJ9zNanQAvraeuHp rJ+cSw1+hg5tqkKqQ4Uf76xkzNPPlygr7X7wQuxDdGtRSZHt6Qj07+s9tqAuii4Z NUkCAwEAAaNTMFEwHQYDVR0OBBYEFI8d9N4BsjyTRjV6V6q4V5Gj314eMB8GA1Ud IwQYMBaAFI8d9N4BsjyTRjV6V6q4V5Gj314eMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggIBALBFInsHdwQwHbT4i28LfN3SaCtXO4Slznx8pE8Us8IB 4F2xLry3NGZYO03F+m2E9kTJ4vYmL9o7H6Wc3cVwfp7itCAVP+oSR63YO1nnjJuq /3KoLVHSC8rjBV7zutrVq4iPgIEFOVLcRf6a985NQeIPxJK1DgxYdTHIawwhhPZB /T8G//NmPiBDz93OUN0rCsGTmi6DqdcTlY3kzdhTtSKJizUl6jlcs8GDoLHt324C siKqGzTuRVmatc2fVgGJe3PYuMIvoVsrTAAZL6qlqdpCKljac7yz5q8DvAzXoo3p 40S/py2SQWsQOsSJcEwkg5IE/vgG7PadJ/sAuU6DPH95vQZjWr/pWHR5xG7PGuh2 8B8322OMmpa8E5DnwUvdy/+JveoNZmD133mWup8WORqiLp7HwxJ6hwPj8IgEkdFn E9EUsMwgItHD8sOdUTegRm965ysZR3xIkLIjXCTf+vsKz1Pj1YWu7EEqcaAJV6JB 2a+G6VsQrqnlxp76QD6IkUSzdztC8tvLYzwCLzD84vvfuhApo8oFiYsBF0m3Cq1V fr4gKWZmn84yw4izVz4bXBmoFinmiBF/VwQXZcJjs0Sgea9dsql4FeeUhfK0MAQJ okZWCL9+DvgLCW5k7q17GtlGUExI3QoWu3n1dxptuA34lj4ybmTHXqn/74jMgnGD -----END CERTIFICATE----- libzypp-17.36.5/tests/data/webconf/ssl/openssl.cnf000066400000000000000000000012711476576476200220710ustar00rootroot00000000000000[req] distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = Country Name (2 letter code) countryName_default = DE stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = BY localityName = Locality Name (eg, city) localityName_default = . organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = Development commonName = localhost commonName_max = 64 [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = localhost IP.1 = 127.0.0.1 libzypp-17.36.5/tests/data/webconf/ssl/server.crt000066400000000000000000000034521476576476200217410ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIFHDCCAwQCAQEwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCREUxEzARBgNV BAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCE9wZW5TVVNFMRQwEgYDVQQLDAtEZXZl bG9wbWVudDEVMBMGA1UEAwwMMTI3LjAuMC4xIENBMCAXDTE5MDUyMjA3MTI1MVoY DzIxOTgxMDI2MDcxMjUxWjBEMQswCQYDVQQGEwJERTELMAkGA1UECAwCQlkxFDAS BgNVBAsMC0RldmVsb3BtZW50MRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnw7WHkHubXhBV9eRQeWk9NDgDdEifF4SP 0cLxnkIIgULs/h5QSHRqIW5iJW9D9/ZLZPPWmrpuyEQMsDttHkHDmNDj/k5xYess uuD4q+XT/rBgeoq4Q7drhqIKw9Xrv2f7KNiPwrcP0FcEEIrA9rRV2iw6mLjOwZVg YBtlMXKrMssm4BwwTKUFKx3qWsqNVQAORblCrgP5fIgHmYNrsAaHq+ig0CXiZ4Vr QsazMcWwClCxsJjlbdyO3OuiN6PMoceJupfcZGr95x/t7YeLu/Jb9dIepFTXmnT6 hpl4/+YRl8Ch97kgC8X77Zbd+rniBhJ4sJfsL4FIZRzyQ5KPdpIK14oCDEH8Vtkk fN5FBU0Wc3vrcGLUgS4Vp+98g2ALUilg20CNRaFCSdWTaTLE/eBsqZ/F1Qdrg/Lc YWB8et9/6lqbRUxqC5rAYYJLAiDmWnIbgSoNBlgLafBmA3rIeRCu5XQEJEhmYTFh dzAmSgAarrMBFtImx0r2H85v5LriR8FeJGDT7D+4Y0GfxKGhTN7vQ/gEJQ9m+JSu 10mYY/W1lyTuakxsczm/R9g3JkuPJy7gWAPaql6PH4kLlkyguD39lc25wnqpSJuN n4N0O2igs6k69yKQOsv2124A6C+KDNkPRHM613FOMQWtlFCqd3gxyJVzqzt5ZO+x Sr14lqA6uwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQCKUUNolFpk82x7WsgSHeNO OEuxgWDezKLJSb2yrJ8Lg4P77DoffRSot7V6ky7gpdSbAlBOVxI/nRvnh1hpjTDg WtpCJ8MsLkg8Y7desEtMOFNtfm2+LG7QMG2egCOEMT7R4yZmmbXVmksU6GykHwM1 9w0vJoT4wk6nA/s4SQN+9Wewm/bMfdaRPEq0fzUzZ9Ok/PR/En+gBJj6x9w1CC0x cv1msWJDf8lWJB4iEARb9vsfkyiD6ydpoDym7ZylIzcW9JklcfJFJS1yBFMYmC39 bpdZFlFeFAmm3bkqTx7bKaIdMA01zHBupj23xs/AI8aWNxP1sf2tRjBAEBM6AW0V yIFO9JnQ1meQGGOmBG9NT6xgRkEcTImzqI29ImCI3fSUx7WbvcanNzk24efjwG3c fSf5E6mrdLg1siyanGXBvWDVj8y9yQYiGo1W6jiZed0VNkDvygVyeNa9qEQPJ1gf g8LSTtqP9NbetZS5qgxetwIEZVeW3jIH05UiYAN06qvym1Q6fCnLCy+19qncn+n6 ms464/100vrCPAE1aCPsvPaR9wJ5iS7QsMFykSeL62MHp3Sn9n35aMGgqnYmtp+z bVelf51ZET3IOgssD4g8L1FCo7l8uAxvHXrTdchlCa6/RaG3EYl9QFQFE3s1mnQ/ spyL6Rw6a4l2snDGbhmjFA== -----END CERTIFICATE----- libzypp-17.36.5/tests/data/webconf/ssl/server.csr000066400000000000000000000033201476576476200217320ustar00rootroot00000000000000-----BEGIN CERTIFICATE REQUEST----- MIIEzjCCArYCAQAwRDELMAkGA1UEBhMCREUxCzAJBgNVBAgMAkJZMRQwEgYDVQQL DAtEZXZlbG9wbWVudDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAp8O1h5B7m14QVfXkUHlpPTQ4A3RInxeEj9HC8Z5C CIFC7P4eUEh0aiFuYiVvQ/f2S2Tz1pq6bshEDLA7bR5Bw5jQ4/5OcWHrLLrg+Kvl 0/6wYHqKuEO3a4aiCsPV679n+yjYj8K3D9BXBBCKwPa0VdosOpi4zsGVYGAbZTFy qzLLJuAcMEylBSsd6lrKjVUADkW5Qq4D+XyIB5mDa7AGh6vooNAl4meFa0LGszHF sApQsbCY5W3cjtzrojejzKHHibqX3GRq/ecf7e2Hi7vyW/XSHqRU15p0+oaZeP/m EZfAofe5IAvF++2W3fq54gYSeLCX7C+BSGUc8kOSj3aSCteKAgxB/FbZJHzeRQVN FnN763Bi1IEuFafvfINgC1IpYNtAjUWhQknVk2kyxP3gbKmfxdUHa4Py3GFgfHrf f+pam0VMaguawGGCSwIg5lpyG4EqDQZYC2nwZgN6yHkQruV0BCRIZmExYXcwJkoA Gq6zARbSJsdK9h/Ob+S64kfBXiRg0+w/uGNBn8ShoUze70P4BCUPZviUrtdJmGP1 tZck7mpMbHM5v0fYNyZLjycu4FgD2qpejx+JC5ZMoLg9/ZXNucJ6qUibjZ+DdDto oLOpOvcikDrL9tduAOgvigzZD0RzOtdxTjEFrZRQqnd4MciVc6s7eWTvsUq9eJag OrsCAwEAAaBFMEMGCSqGSIb3DQEJDjE2MDQwCQYDVR0TBAIwADALBgNVHQ8EBAMC BeAwGgYDVR0RBBMwEYIJbG9jYWxob3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IC AQBvf/UZ9eUyzlkSRLT31YiWgYb3bAS4uYQGu4WxHJAD0RI5aV8C/0KOdt5vlxs2 BjljDUNcs6ccYHRlFvzpita8M+H5fB4nnlRnOezfIid24z6avdxqUr6rUvdf9k0I WrN/tLA2tWPz4teTx/bHgaiyexyj7EdgA6HqxmDWwoO7OGcrfS0PdMTYNxPi8hL7 U7Z/ds1n/3JkSClmtaZeNSVhtiHn0dvhGuMeyd21zc3Er5E8KIcQnI7UPo+EbsTj qgRJaU/r3pNRYuqKJC4lOGO85Xczsc2ufKSofkyKoUIg+B8OV9eMJok6XtmSM0VF KX4B4qFXyacRvchNIjrHiFxYP8Swj0r9viDjp4SnxRh66uIvMDNuz7ycd5M+oDJf HsHMzDRD9ORXbLmgNNtP+hwEh60Zb8G5SrI8W4DJ3jowqYl6mGzwefwnxegdccxD Gz/DFsAD9cV1TBQs+fcOOjPcrCH9jounuAJcbt+CSiRgL3MlwYdA96bbbiqfyCEa 1mqz/qIvP6i7lHe/ydRUgJOuUMmA0/FH9nF21SneQ59NHlXE+dCSIRhPooL9HBqN 61TJ7SdtYrTYtfMz1QPKRRll55IjQEY15+NWhLA/qp8/tDfyuUrBT3W13P6/jLCa N1xyazyra6L9ussjQkrjtEW2S2hno63iJ+7OdXDCRlu38Q== -----END CERTIFICATE REQUEST----- libzypp-17.36.5/tests/data/webconf/ssl/server.key000066400000000000000000000062531476576476200217430ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIJKAIBAAKCAgEAp8O1h5B7m14QVfXkUHlpPTQ4A3RInxeEj9HC8Z5CCIFC7P4e UEh0aiFuYiVvQ/f2S2Tz1pq6bshEDLA7bR5Bw5jQ4/5OcWHrLLrg+Kvl0/6wYHqK uEO3a4aiCsPV679n+yjYj8K3D9BXBBCKwPa0VdosOpi4zsGVYGAbZTFyqzLLJuAc MEylBSsd6lrKjVUADkW5Qq4D+XyIB5mDa7AGh6vooNAl4meFa0LGszHFsApQsbCY 5W3cjtzrojejzKHHibqX3GRq/ecf7e2Hi7vyW/XSHqRU15p0+oaZeP/mEZfAofe5 IAvF++2W3fq54gYSeLCX7C+BSGUc8kOSj3aSCteKAgxB/FbZJHzeRQVNFnN763Bi 1IEuFafvfINgC1IpYNtAjUWhQknVk2kyxP3gbKmfxdUHa4Py3GFgfHrff+pam0VM aguawGGCSwIg5lpyG4EqDQZYC2nwZgN6yHkQruV0BCRIZmExYXcwJkoAGq6zARbS JsdK9h/Ob+S64kfBXiRg0+w/uGNBn8ShoUze70P4BCUPZviUrtdJmGP1tZck7mpM bHM5v0fYNyZLjycu4FgD2qpejx+JC5ZMoLg9/ZXNucJ6qUibjZ+DdDtooLOpOvci kDrL9tduAOgvigzZD0RzOtdxTjEFrZRQqnd4MciVc6s7eWTvsUq9eJagOrsCAwEA AQKCAgEAlaSy1duBBlNfSu3s3AOQZfGgTSR6ar51ljvLIe7ChAeZBQCfVYlrngd4 CL/Pgdc6sIG6JyEZTxv/5zmDqI+mpaw4GEaM/gIT3nBLoETk2raB6W0lM7vjblxH SkbpGEJBo/0JPyK2W7rBA3Ul732f2jyj2xjDMFnovnC7vwXefOrv3xtkyYh0YinV o2ec6Xh6dkCnQd0q2m3EgNLkMThwerBS7q78O/mPPt/vkYPCDIcG95jIqU3XwO86 mBX9W9iqviXcs9A2x4hUKM0JbREW3ARnisGWlELIOXe6if3o4KR2RYNMdFNMJK4H NrYg/IXiEBmlSh4Nud/HdCnmH2XqWaMTwMkY6Nwtyaq8XD1pQELFqfTJDgFOjAkI j1Xu4ivEHpNdEhvfXqYw/+FyqkpJ/UWosBuwqTvcWTX+pa2dGvp5xbfiSfypw8aA 74z07HekeA1NNdjXIlLum+3oe5myzSg/0RFLq5BllzfthCJ2xc0BtMkcGf9as4eb NUFjhfZAecdN9lA8N8i17jp5NwA85Px1zgY9vBEOiL0SkdfyVazmHlLpyLuqZ1EA pRunf/utOznGj4bnh/DzgFTLfe8HRs2Sx7j3MnI220fqryKKnyeIdegayHaEmljW vXrpvGB9VI2qqrVwXIesvRDH80SBHUfI+Y8Z83LfmlayJ+R2QDECggEBANvCkUL0 hOHYcmkh9A9OGMMcLMCV6TrHxk2wOBxzdVQXStfUCaHLUWgI4sM6rVVbAYrznjCi rm2068tGlu05oxacT4eakmnERiunnsMR5QYDmEXtw+YKAZICieuiKAMoBrAt7dYB +ybgdEREK4QKA14ezfrsZpoOHeMAOK4RZ5naMfucZpWCIU2wwmYid8CrxXoE6RDm tPOG2Jxp1uc4bXCMX9tDsoWdxkZO8l6RaoEeNmK288ngPvaqPgXBLreEdzYAFo/G HhoXRfB0myvQtO27bG6x5RVOPOMJoU1duJ4ZDuWRnuXmsySn+4Iqgwzwhcgosyuy 4KbHyJlqo7FLBkUCggEBAMNuFnT8kLPrn57spBaP5opT5nlqPAIyBCwLORe/Pjru gf1P4p734uWRNhS5y32n/WeRq58HrSKwg0eZms7KJWs1UDEYfdqp3moRnTwfWdcI gSyV/AIOxXCcVSHfbyrY7FXVVYukYl0tqHcD7MKIZAEmofX1+abhYGdFm1QWQMCH v9PG1B46mV26UHG9zgrCchnrWjoOxyIBu8x8YzEZ0PXxm3AXELw95yQzxLjRT49Q a9kJs5cF6oZXuZXaY/ywxqYJ9biXXPmOvWKJKdffl67O8cz4xaBQibK78pKZT9VN vkQ037T9YE4uFOB1QoV+2CYg813lBZs9fkAOtL2uzP8CggEAN6ghTgnLlb9RypqU y0OGNfPuyZ+t//sUmBxnOZ1sO63igKLtBZMOvQBzHerAd3ui+mQUzlCFSLeneEYa d14/lbxkz/0v06Wn9+pt5Q2lKU7DxAIhuSMTnr0R3SGmbJY4i2o2cBr0VrZF+/wf 4UL/81ht5nz0x1OH8jPeJwe1a1u9iPHlcTwR3zFDKsbT+XIHg4220Vb8wSiHt6V+ jfTWksiahlew4PJCgw//hj/h722NbJbVS22FxMb9CkwQ3t2nq39+N09/1C/MwMdn fUNQb10mayqW0DyOYxnPRl7UIQZLpYyp56Pz/vakViUaJ67K0xSrvAeDqfmzLle5 uW882QKCAQAz/B+7JMf1JDNEmhwX6FVh7Gl9WJX324gikyWvvG54TKOFV2+n67aO bG8fWkDX/wy4NRaa6fbTKHLzY9e7NCh5+SeIt8Qam18Phfn2WTyTp658xrTPc1Bv 4RYAOagflK5hMqtbxvFnadLLPd8H7DH14GnqvHCZRJBZSDnGR1kYHcQYOGaKV/od 5Yaqitu5HvotDN7mXLH5yM5E2b2k/QIJuigny+rmt+y5Q5ALvZnVPIZDqIH+JVO6 QrGaPAqm1/svhay4WoMf2yljgasAwnhdxqypYm9ncqT+R2KCPofu7Iw1Jn9vbIrm oPlqr6ZvTkt+8PrruhUgs13W+lJ3tnzPAoIBAErt9PSnomzWlTspLi8Ep45K8/nV 6aP3SXJ+EVawhr1EL3YphS+C1FBy5Ki97hrjEBnxyYWyJ6H68SLqe5O3V/lO9XLY 4yD8pY4hMTf+S2czyQZvadaDp5dO0g3f2EpZLZ4JdxHvcN2QJhLCEvV1esad/2hC xzzk1Dpfcy7d4SjOYmtb4KdPiT1tv3Gr7KO4ntrAdhmvCCpfhSYkSzhhnjd5VYcW 3la9wzuqvst/Ya09oHE27xk9T4a2SJ4JiptwmuxxCDMH2JNCHBtT4Q7c00b+iUx1 O2+q5IipfhQJBfSAL1d1v2eHfq3aJWCUUnLktpaiacV6kRFcmhPS3UVoxDw= -----END RSA PRIVATE KEY----- libzypp-17.36.5/tests/data/webconf/ssl/server.pem000066400000000000000000000117251476576476200217340ustar00rootroot00000000000000-----BEGIN RSA PRIVATE KEY----- MIIJKAIBAAKCAgEAp8O1h5B7m14QVfXkUHlpPTQ4A3RInxeEj9HC8Z5CCIFC7P4e UEh0aiFuYiVvQ/f2S2Tz1pq6bshEDLA7bR5Bw5jQ4/5OcWHrLLrg+Kvl0/6wYHqK uEO3a4aiCsPV679n+yjYj8K3D9BXBBCKwPa0VdosOpi4zsGVYGAbZTFyqzLLJuAc MEylBSsd6lrKjVUADkW5Qq4D+XyIB5mDa7AGh6vooNAl4meFa0LGszHFsApQsbCY 5W3cjtzrojejzKHHibqX3GRq/ecf7e2Hi7vyW/XSHqRU15p0+oaZeP/mEZfAofe5 IAvF++2W3fq54gYSeLCX7C+BSGUc8kOSj3aSCteKAgxB/FbZJHzeRQVNFnN763Bi 1IEuFafvfINgC1IpYNtAjUWhQknVk2kyxP3gbKmfxdUHa4Py3GFgfHrff+pam0VM aguawGGCSwIg5lpyG4EqDQZYC2nwZgN6yHkQruV0BCRIZmExYXcwJkoAGq6zARbS JsdK9h/Ob+S64kfBXiRg0+w/uGNBn8ShoUze70P4BCUPZviUrtdJmGP1tZck7mpM bHM5v0fYNyZLjycu4FgD2qpejx+JC5ZMoLg9/ZXNucJ6qUibjZ+DdDtooLOpOvci kDrL9tduAOgvigzZD0RzOtdxTjEFrZRQqnd4MciVc6s7eWTvsUq9eJagOrsCAwEA AQKCAgEAlaSy1duBBlNfSu3s3AOQZfGgTSR6ar51ljvLIe7ChAeZBQCfVYlrngd4 CL/Pgdc6sIG6JyEZTxv/5zmDqI+mpaw4GEaM/gIT3nBLoETk2raB6W0lM7vjblxH SkbpGEJBo/0JPyK2W7rBA3Ul732f2jyj2xjDMFnovnC7vwXefOrv3xtkyYh0YinV o2ec6Xh6dkCnQd0q2m3EgNLkMThwerBS7q78O/mPPt/vkYPCDIcG95jIqU3XwO86 mBX9W9iqviXcs9A2x4hUKM0JbREW3ARnisGWlELIOXe6if3o4KR2RYNMdFNMJK4H NrYg/IXiEBmlSh4Nud/HdCnmH2XqWaMTwMkY6Nwtyaq8XD1pQELFqfTJDgFOjAkI j1Xu4ivEHpNdEhvfXqYw/+FyqkpJ/UWosBuwqTvcWTX+pa2dGvp5xbfiSfypw8aA 74z07HekeA1NNdjXIlLum+3oe5myzSg/0RFLq5BllzfthCJ2xc0BtMkcGf9as4eb NUFjhfZAecdN9lA8N8i17jp5NwA85Px1zgY9vBEOiL0SkdfyVazmHlLpyLuqZ1EA pRunf/utOznGj4bnh/DzgFTLfe8HRs2Sx7j3MnI220fqryKKnyeIdegayHaEmljW vXrpvGB9VI2qqrVwXIesvRDH80SBHUfI+Y8Z83LfmlayJ+R2QDECggEBANvCkUL0 hOHYcmkh9A9OGMMcLMCV6TrHxk2wOBxzdVQXStfUCaHLUWgI4sM6rVVbAYrznjCi rm2068tGlu05oxacT4eakmnERiunnsMR5QYDmEXtw+YKAZICieuiKAMoBrAt7dYB +ybgdEREK4QKA14ezfrsZpoOHeMAOK4RZ5naMfucZpWCIU2wwmYid8CrxXoE6RDm tPOG2Jxp1uc4bXCMX9tDsoWdxkZO8l6RaoEeNmK288ngPvaqPgXBLreEdzYAFo/G HhoXRfB0myvQtO27bG6x5RVOPOMJoU1duJ4ZDuWRnuXmsySn+4Iqgwzwhcgosyuy 4KbHyJlqo7FLBkUCggEBAMNuFnT8kLPrn57spBaP5opT5nlqPAIyBCwLORe/Pjru gf1P4p734uWRNhS5y32n/WeRq58HrSKwg0eZms7KJWs1UDEYfdqp3moRnTwfWdcI gSyV/AIOxXCcVSHfbyrY7FXVVYukYl0tqHcD7MKIZAEmofX1+abhYGdFm1QWQMCH v9PG1B46mV26UHG9zgrCchnrWjoOxyIBu8x8YzEZ0PXxm3AXELw95yQzxLjRT49Q a9kJs5cF6oZXuZXaY/ywxqYJ9biXXPmOvWKJKdffl67O8cz4xaBQibK78pKZT9VN vkQ037T9YE4uFOB1QoV+2CYg813lBZs9fkAOtL2uzP8CggEAN6ghTgnLlb9RypqU y0OGNfPuyZ+t//sUmBxnOZ1sO63igKLtBZMOvQBzHerAd3ui+mQUzlCFSLeneEYa d14/lbxkz/0v06Wn9+pt5Q2lKU7DxAIhuSMTnr0R3SGmbJY4i2o2cBr0VrZF+/wf 4UL/81ht5nz0x1OH8jPeJwe1a1u9iPHlcTwR3zFDKsbT+XIHg4220Vb8wSiHt6V+ jfTWksiahlew4PJCgw//hj/h722NbJbVS22FxMb9CkwQ3t2nq39+N09/1C/MwMdn fUNQb10mayqW0DyOYxnPRl7UIQZLpYyp56Pz/vakViUaJ67K0xSrvAeDqfmzLle5 uW882QKCAQAz/B+7JMf1JDNEmhwX6FVh7Gl9WJX324gikyWvvG54TKOFV2+n67aO bG8fWkDX/wy4NRaa6fbTKHLzY9e7NCh5+SeIt8Qam18Phfn2WTyTp658xrTPc1Bv 4RYAOagflK5hMqtbxvFnadLLPd8H7DH14GnqvHCZRJBZSDnGR1kYHcQYOGaKV/od 5Yaqitu5HvotDN7mXLH5yM5E2b2k/QIJuigny+rmt+y5Q5ALvZnVPIZDqIH+JVO6 QrGaPAqm1/svhay4WoMf2yljgasAwnhdxqypYm9ncqT+R2KCPofu7Iw1Jn9vbIrm oPlqr6ZvTkt+8PrruhUgs13W+lJ3tnzPAoIBAErt9PSnomzWlTspLi8Ep45K8/nV 6aP3SXJ+EVawhr1EL3YphS+C1FBy5Ki97hrjEBnxyYWyJ6H68SLqe5O3V/lO9XLY 4yD8pY4hMTf+S2czyQZvadaDp5dO0g3f2EpZLZ4JdxHvcN2QJhLCEvV1esad/2hC xzzk1Dpfcy7d4SjOYmtb4KdPiT1tv3Gr7KO4ntrAdhmvCCpfhSYkSzhhnjd5VYcW 3la9wzuqvst/Ya09oHE27xk9T4a2SJ4JiptwmuxxCDMH2JNCHBtT4Q7c00b+iUx1 O2+q5IipfhQJBfSAL1d1v2eHfq3aJWCUUnLktpaiacV6kRFcmhPS3UVoxDw= -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE----- MIIFHDCCAwQCAQEwDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCREUxEzARBgNV BAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCE9wZW5TVVNFMRQwEgYDVQQLDAtEZXZl bG9wbWVudDEVMBMGA1UEAwwMMTI3LjAuMC4xIENBMCAXDTE5MDUyMjA3MTI1MVoY DzIxOTgxMDI2MDcxMjUxWjBEMQswCQYDVQQGEwJERTELMAkGA1UECAwCQlkxFDAS BgNVBAsMC0RldmVsb3BtZW50MRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnw7WHkHubXhBV9eRQeWk9NDgDdEifF4SP 0cLxnkIIgULs/h5QSHRqIW5iJW9D9/ZLZPPWmrpuyEQMsDttHkHDmNDj/k5xYess uuD4q+XT/rBgeoq4Q7drhqIKw9Xrv2f7KNiPwrcP0FcEEIrA9rRV2iw6mLjOwZVg YBtlMXKrMssm4BwwTKUFKx3qWsqNVQAORblCrgP5fIgHmYNrsAaHq+ig0CXiZ4Vr QsazMcWwClCxsJjlbdyO3OuiN6PMoceJupfcZGr95x/t7YeLu/Jb9dIepFTXmnT6 hpl4/+YRl8Ch97kgC8X77Zbd+rniBhJ4sJfsL4FIZRzyQ5KPdpIK14oCDEH8Vtkk fN5FBU0Wc3vrcGLUgS4Vp+98g2ALUilg20CNRaFCSdWTaTLE/eBsqZ/F1Qdrg/Lc YWB8et9/6lqbRUxqC5rAYYJLAiDmWnIbgSoNBlgLafBmA3rIeRCu5XQEJEhmYTFh dzAmSgAarrMBFtImx0r2H85v5LriR8FeJGDT7D+4Y0GfxKGhTN7vQ/gEJQ9m+JSu 10mYY/W1lyTuakxsczm/R9g3JkuPJy7gWAPaql6PH4kLlkyguD39lc25wnqpSJuN n4N0O2igs6k69yKQOsv2124A6C+KDNkPRHM613FOMQWtlFCqd3gxyJVzqzt5ZO+x Sr14lqA6uwIDAQABMA0GCSqGSIb3DQEBCwUAA4ICAQCKUUNolFpk82x7WsgSHeNO OEuxgWDezKLJSb2yrJ8Lg4P77DoffRSot7V6ky7gpdSbAlBOVxI/nRvnh1hpjTDg WtpCJ8MsLkg8Y7desEtMOFNtfm2+LG7QMG2egCOEMT7R4yZmmbXVmksU6GykHwM1 9w0vJoT4wk6nA/s4SQN+9Wewm/bMfdaRPEq0fzUzZ9Ok/PR/En+gBJj6x9w1CC0x cv1msWJDf8lWJB4iEARb9vsfkyiD6ydpoDym7ZylIzcW9JklcfJFJS1yBFMYmC39 bpdZFlFeFAmm3bkqTx7bKaIdMA01zHBupj23xs/AI8aWNxP1sf2tRjBAEBM6AW0V yIFO9JnQ1meQGGOmBG9NT6xgRkEcTImzqI29ImCI3fSUx7WbvcanNzk24efjwG3c fSf5E6mrdLg1siyanGXBvWDVj8y9yQYiGo1W6jiZed0VNkDvygVyeNa9qEQPJ1gf g8LSTtqP9NbetZS5qgxetwIEZVeW3jIH05UiYAN06qvym1Q6fCnLCy+19qncn+n6 ms464/100vrCPAE1aCPsvPaR9wJ5iS7QsMFykSeL62MHp3Sn9n35aMGgqnYmtp+z bVelf51ZET3IOgssD4g8L1FCo7l8uAxvHXrTdchlCa6/RaG3EYl9QFQFE3s1mnQ/ spyL6Rw6a4l2snDGbhmjFA== -----END CERTIFICATE----- libzypp-17.36.5/tests/lib/000077500000000000000000000000001476576476200153265ustar00rootroot00000000000000libzypp-17.36.5/tests/lib/CMakeLists.txt000066400000000000000000000025101476576476200200640ustar00rootroot00000000000000find_program( NGINX nginx ) find_program( VSFTPD vsftpd ) find_library( LIBFCGI NAMES fcgi ) find_library( LIBFCGI++ NAMES fcgi++ ) if ( NOT NGINX ) message( FATAL_ERROR "nginx not found" ) else() message ( "Using nginx binary at: ${NGINX}" ) ADD_DEFINITIONS( -DWEBSRV_BINARY="${NGINX}" ) endif() if ( NOT VSFTPD ) message( FATAL_ERROR "vsftpd not found" ) else() message ( "Using vsftpd binary at: ${VSFTPD}" ) ADD_DEFINITIONS( -DFTPSRV_BINARY="${VSFTPD}" ) endif() if ( NOT LIBFCGI ) message( FATAL_ERROR "libfcgi not found" ) else() message ( "Using libfcgi library at: ${LIBFCGI}" ) endif() if ( NOT LIBFCGI++ ) message( FATAL_ERROR "libfcgi++ not found" ) else() message ( "Using libfcgi++ library at: ${LIBFCGI++}" ) endif() add_definitions( -DSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}") ADD_LIBRARY(zypp_test_utils STATIC FtpServer.h FtpServer.cc TestSetup.h TestTools.h WebServer.h WebServer.cc ) # These headers are in different subdirectories depending on the # distribution CHECK_INCLUDE_FILE( fastcgi/fcgiapp.h FASTCGI_HEADER_DIR ) IF ( FASTCGI_HEADER_DIR ) target_compile_definitions( zypp_test_utils PRIVATE FCGI_IN_SUBDIR=1) ENDIF ( FASTCGI_HEADER_DIR ) target_link_libraries( zypp_test_utils PRIVATE zypp_lib_compiler_flags ) TARGET_LINK_LIBRARIES( zypp_test_utils PUBLIC ${LIBFCGI} ${LIBFCGI++} pthread ) libzypp-17.36.5/tests/lib/FtpServer.cc000066400000000000000000000223011476576476200175530ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "FtpServer.h" #include #include #include #include #include #ifndef TESTS_SRC_DIR #error "TESTS_SRC_DIR not defined" #endif #ifndef FTPSRV_BINARY #error "FTPSRV_BINARY not defined" #endif using std::endl; using namespace zypp; namespace { /** ExternalProgram extended to kill the child process if the parent thread exits */ class ZYPP_LOCAL ExternalTrackedProgram : public ExternalProgram { public: ExternalTrackedProgram (const char *const *argv, const Environment & environment, Stderr_Disposition stderr_disp = Normal_Stderr, bool use_pty = false, int stderr_fd = -1, bool default_locale = false, const Pathname& root = "") : ExternalProgram() { start_program( argv, environment, stderr_disp, stderr_fd, default_locale, root.c_str(), false, true ); } }; bool checkLocalPort( int portno_r ) { bool ret = false; AutoDispose sockfd { socket( AF_INET, SOCK_STREAM, 0 ) }; if ( sockfd < 0 ) { std::cerr << "ERROR opening socket" << endl; return ret; } sockfd.setDispose( ::close ); struct hostent * server = gethostbyname( "127.0.0.1" ); if ( server == nullptr ) { std::cerr << "ERROR, no such host 127.0.0.1" << endl; return ret; } struct sockaddr_in serv_addr; bzero( &serv_addr, sizeof(serv_addr) ); serv_addr.sin_family = AF_INET; bcopy( server->h_addr, &serv_addr.sin_addr.s_addr, server->h_length ); serv_addr.sin_port = htons(portno_r); return( connect( sockfd, (const sockaddr*)&serv_addr, sizeof(serv_addr) ) == 0 ); } } class FtpServer::Impl { public: Impl(const Pathname &root, unsigned int port, bool ssl) : _docroot(root), _port(port), _stop(false), _stopped(true), _ssl( ssl ) { // wake up pipe to interrupt poll() pipe ( _wakeupPipe ); fcntl( _wakeupPipe[0], F_SETFL, O_NONBLOCK ); MIL << "Working dir is " << _workingDir << endl; filesystem::assert_dir( _workingDir / "log" ); filesystem::assert_dir( _workingDir / "tmp" ); } ~Impl() { if ( ! _stopped ) stop(); close (_wakeupPipe[0]); close (_wakeupPipe[1]); } int port() const { return _port; } void worker_thread() { /* * -o vsftpd_log_file=/var/log/vsftpd.log * * ssl_enable=NO * rsa_cert_file= * dsa_cert_file= * listen_port * * -o anon_root=/tmp/ftptest * -o local_root=/tmp/ftptest * */ ExternalProgram::Environment env; const auto confPath = _workingDir.path(); const auto confFile = confPath/"vsftpd.conf"; bool canContinue = true; { std::lock_guard lock ( _mut ); canContinue = ( zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"vsftpconf"/"vsftpd.conf", confFile ) == 0 ); if ( canContinue && _ssl ) canContinue = zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"webconf"/"ssl"/"server.pem", confPath/"cert.pem") == 0; if ( canContinue && _ssl ) canContinue = zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"webconf"/"ssl"/"server.key", confPath/"cert.key") == 0; } const std::string logfile = (zypp::str::Format("-vsftpd_log_file=%1%") % (confPath/"logfile")).asString(); const std::string anonRoot = (zypp::str::Format("-oanon_root=%1%") % _docroot).asString(); const std::string localRoot = (zypp::str::Format("-olocal_root=%1%") % _docroot).asString(); const std::string listenPort = (zypp::str::Format("-olisten_port=%1%") % _port).asString(); const std::string pemFile = (zypp::str::Format("-orsa_cert_file=%1%") % (confPath/"cert.pem") ).asString (); const std::string keyFile = (zypp::str::Format("-orsa_private_key_file=%1%") % (confPath/"cert.key") ).asString (); std::vector argv = { FTPSRV_BINARY, confFile.c_str(), anonRoot.c_str(), localRoot.c_str(), listenPort.c_str(), }; if ( _ssl ) { argv.push_back ( "-ossl_enable=YES" ); argv.push_back ( "-oallow_anon_ssl=YES" ); argv.push_back ( pemFile.c_str() ); argv.push_back ( keyFile.c_str() ); } argv.push_back(nullptr); if ( !canContinue ) { _stopped = true; _cv.notify_all(); return; } ExternalTrackedProgram prog( argv.data(), env, ExternalProgram::Stderr_To_Stdout, false, -1, true); prog.setBlocking( false ); while(1) { std::string line = prog.receiveLine(); if ( line.empty() ) break; std::cerr << line << endl; }; // Wait max 10 sec for the socket becoming available bool isup { checkLocalPort( port() ) }; if ( !isup ) { unsigned i = 0; do { std::this_thread::sleep_for( std::chrono::milliseconds(1000) ); isup = checkLocalPort( port() ); } while ( !isup && ++i < 10 ); if ( !isup && prog.running() ) { prog.kill( SIGTERM ); prog.close(); } } if ( !prog.running() ) { _stop = true; _stopped = true; } else { _stopped = false; } struct pollfd fds[] { { _wakeupPipe[0], POLLIN, 0 }, { fileno( prog.inputFile() ), POLLIN | POLLHUP | POLLERR, 0 } }; bool firstLoop = true; while ( 1 ) { if ( firstLoop ) { firstLoop = false; _cv.notify_all(); if ( _stopped ) return; } //listen on a pipe for a wakeup event to stop the worker if required int ret = zyppng::eintrSafeCall( ::poll, fds, 2, -1 ); if ( ret < 0 ) { std::cerr << "Poll error " << errno << endl; continue; } if ( fds[0].revents ) { //clear pipe char dummy; while ( read( _wakeupPipe[0], &dummy, 1 ) > 0 ) { continue; } } if ( fds[1].revents ) { while(1) { std::string line = prog.receiveLine(); if ( line.empty() ) break; std::cerr << line << endl; }; if ( !prog.running() ) { std::cerr << "Ftpserver exited too early" << endl; _stop = true; _stopped = true; } } if ( _stop ) break; } if ( prog.running() ) { prog.kill( SIGTERM ); prog.close(); } } std::string log() const { //read logfile return std::string(); } void stop() { MIL << "Waiting for server thread to finish" << endl; _stop = true; //signal the thread to wake up write( _wakeupPipe[1], "\n", 1); _thrd->join(); MIL << "server thread finished" << endl; _thrd.reset(); _stopped = true; } void start() { if ( !filesystem::PathInfo( _docroot ).isExist() ) { std::cerr << "Invalid docroot" << std::endl; throw zypp::Exception("Invalid docroot"); } if ( !_stopped ) { stop(); } _stop = _stopped = false; std::unique_lock lock( _mut ); _thrd.reset( new std::thread( &Impl::worker_thread, this ) ); _cv.wait(lock); if ( _stopped ) { _thrd->join(); throw zypp::Exception("Failed to start the ftpserver"); } } std::mutex _mut; // _thrd; unsigned int _port; int _wakeupPipe[2]; std::atomic_bool _stop; bool _stopped; bool _ssl; }; FtpServer::FtpServer(const Pathname &root, unsigned int port, bool useSSL) : _pimpl(new Impl(root, port, useSSL)) { } bool FtpServer::start() { _pimpl->start(); return !isStopped(); } std::string FtpServer::log() const { return _pimpl->log(); } bool FtpServer::isStopped() const { return _pimpl->_stopped; } int FtpServer::port() const { return _pimpl->port(); } Url FtpServer::url() const { Url url; url.setHost("localhost"); url.setPort(str::numstring(port())); url.setScheme("ftp"); return url; } media::TransferSettings FtpServer::transferSettings() const { media::TransferSettings set; set.setCertificateAuthoritiesPath(zypp::Pathname(TESTS_SRC_DIR)/"data/webconf/ssl/certstore"); return set; } void FtpServer::stop() { _pimpl->stop(); } FtpServer::~FtpServer() { } libzypp-17.36.5/tests/lib/FtpServer.h000066400000000000000000000027731476576476200174300ustar00rootroot00000000000000 #ifndef ZYPP_TEST_FTPSERVER_H #define ZYPP_TEST_FTPSERVER_H #include #include #include #include #include /** * * Starts a ftp server to simulate remote transfers in * testcases * * \code * #include "FtpServer.h" * * BOOST_AUTO_TEST_CASE(Foo) * { * * FtpServer srv((Pathname(TESTS_SRC_DIR) + "/datadir").c_str() ); * srv.start(); * * MediaSetAccess media( Url("ftp://localhost:9099"), "/" ); * * // do something with the url * * * srv.stop(); * * \endcode */ class FtpServer { public: /** * creates a web server on \ref root and \port */ FtpServer(const zypp::Pathname &root, unsigned int port=10001, bool useSSL = false ); ~FtpServer(); /** * Starts the webserver worker thread * Waits up to 10 seconds and returns whether the port is now active. */ bool start(); /** * Stops the worker thread */ void stop(); /** * returns the port we are listening to */ int port() const; /** * returns the base url where the webserver is listening */ zypp::Url url() const; /** * generates required transfer settings */ zypp::media::TransferSettings transferSettings () const; /** * shows the log of last run */ std::string log() const; /** * Checks if the server was stopped */ bool isStopped() const; class Impl; private: /** Pointer to implementation */ zypp::RW_pointer _pimpl; }; #endif libzypp-17.36.5/tests/lib/TestSetup.h000066400000000000000000000276541476576476200174550ustar00rootroot00000000000000#ifndef INCLUDE_TESTSETUP #define INCLUDE_TESTSETUP #include #ifndef INCLUDE_TESTSETUP_WITHOUT_BOOST #include using boost::unit_test::test_case; #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::cin; using std::cout; using std::cerr; using std::endl; using std::flush; using namespace zypp; #ifndef BOOST_CHECK_NE #define BOOST_CHECK_NE( L, R ) BOOST_CHECK( (L) != (R) ) #endif #define LABELED(V) #V << ":\t" << V enum TestSetupOptionBits { TSO_CLEANROOT = (1 << 0), // wipe rootdir in ctor TSO_REPO_DEFAULT_GPG = (1 << 1), // dont turn off gpgcheck in repos }; ZYPP_DECLARE_FLAGS_AND_OPERATORS( TestSetupOptions, TestSetupOptionBits ); /** Build a test environment below a temp. root directory. * If a \c rootdir_r was provided to the ctor, this directory * will be used and it will \b not be removed. * * \note The lifetime of this objects is the lifetime of the temp. root directory. * * \code * #include "TestSetup.h" * * BOOST_AUTO_TEST_CASE(WhatProvides) * { * // enabls loging fot the scope of this block: * // base::LogControl::TmpLineWriter shutUp( new log::FileLineWriter( "/tmp/YLOG" ) ); * * TestSetup test( Arch_x86_64 ); * // test.loadTarget(); // initialize and load target * test.loadRepo( TESTS_SRC_DIR"/data/openSUSE-11.1" ); * * // Here the pool is ready to be used. * * } * \endcode */ class TestSetup { public: typedef TestSetupOptions Options; public: struct InitLaterType {}; static constexpr InitLaterType initLater = InitLaterType(); TestSetup( InitLaterType ) {} TestSetup( const Arch & sysarch_r = Arch_empty, const Options & options_r = Options() ) : _pimpl { new Impl( Pathname(), sysarch_r, options_r ) } {} TestSetup( const Pathname & rootdir_r, const Arch & sysarch_r = Arch_empty, const Options & options_r = Options() ) : _pimpl { new Impl( rootdir_r, sysarch_r, options_r ) } {} TestSetup( const Pathname & rootdir_r, const Options & options_r ) : _pimpl { new Impl( rootdir_r, Arch_empty, options_r ) } {} void reset() { _pimpl.reset(); } public: /** Whether directory \a path_r contains a solver testcase. */ static bool isTestcase( const Pathname & path_r ) { return zypp::misc::testcase::LoadTestcase::None != zypp::misc::testcase::LoadTestcase::testcaseTypeAt( path_r ); } /** Whether directory \a path_r contains a testsetup. */ static bool isTestSetup( const Pathname & path_r ) { return filesystem::PathInfo( path_r / "repos.d" ).isDir() && filesystem::PathInfo( path_r / "raw" ).isDir(); } public: const Pathname & root() const { return _pimpl->_rootdir; } Target & target() { if ( ! getZYpp()->getTarget() ) getZYpp()->initializeTarget( _pimpl->_rootdir ); return *getZYpp()->getTarget(); } RepoManager repomanager() { return RepoManager( RepoManagerOptions::makeTestSetup( _pimpl->_rootdir ) ); } ResPool pool() { return ResPool::instance(); } ResPoolProxy poolProxy() { return pool().proxy(); } sat::Pool satpool() { return sat::Pool::instance(); } Resolver & resolver() { return *getZYpp()->resolver(); } public: /** Load target repo. */ void loadTarget() { target().load(); } /** Fake @System repo from url. */ void loadTargetRepo( const Url & url_r ) { loadRepo( url_r, sat::Pool::systemRepoAlias() ); } /** Fake @System repo from Path. */ void loadTargetRepo( const Pathname & path_r ) { loadRepo( path_r, sat::Pool::systemRepoAlias() ); } /** Fake @System repo from helix repo. */ void loadTargetHelix( const Pathname & path_r ) { loadHelix( path_r, sat::Pool::systemRepoAlias() ); } public: /** Directly load repoinfo to pool. */ void loadRepo( RepoInfo nrepo ) { RepoManager rmanager( repomanager() ); if ( rmanager.hasRepo( nrepo ) ) nrepo.setAlias( RepoManager::makeStupidAlias( nrepo.url() ) ); rmanager.addRepository( nrepo ); rmanager.buildCache( nrepo ); rmanager.loadFromCache( nrepo ); } /** Directly load repo from url to pool. */ void loadRepo( const Url & url_r, const std::string & alias_r = std::string() ) { RepoInfo nrepo; nrepo.setAlias( alias_r.empty() ? url_r.getHost()+":"+Pathname::basename(url_r.getPathName()) : alias_r ); nrepo.addBaseUrl( url_r ); if ( ! _pimpl->_options.testFlag( TSO_REPO_DEFAULT_GPG ) ) nrepo.setGpgCheck( false ); loadRepo( nrepo ); } /** Directly load repo from metadata(dir) or solvfile(file) to pool. * An empty alias is guessed. */ void loadRepo( const Pathname & path_r, const std::string & alias_r = std::string() ) { if ( filesystem::PathInfo( path_r ).isDir() ) { loadRepo( path_r.asUrl(), alias_r ); return; } // .solv file is loaded directly using a faked RepoInfo RepoInfo nrepo; nrepo.setAlias( alias_r.empty() ? path_r.basename() : alias_r ); satpool().addRepoSolv( path_r, nrepo ); } /** Directly load repo from some location (url or absolute(!)path). * An empty alias is guessed. */ void loadRepo( const std::string & loc_r, const std::string & alias_r = std::string() ) { if ( *loc_r.c_str() == '/' ) { loadRepo( Pathname( loc_r ), alias_r ); } else { loadRepo( Url( loc_r ), alias_r ); } } /** Directly load repo from some location (url or absolute(!)path). * An empty alias is guessed. */ void loadRepo( const char * loc_r, const std::string & alias_r = std::string() ) { loadRepo( std::string( loc_r ? loc_r : "" ), alias_r ); } /** Directly load a helix repo from some testcase. ** An empty alias is guessed. **/ void loadHelix( const Pathname & path_r, const std::string & alias_r = std::string() ) { // .solv file is loaded directly using a faked RepoInfo RepoInfo nrepo; nrepo.setAlias( alias_r.empty() ? path_r.basename() : alias_r ); satpool().addRepoHelix( path_r, nrepo ); } // Load repos included in a solver testcase. void loadTestcaseRepos( const Pathname & path_r, misc::testcase::LoadTestcase::TestcaseTrials * trialsP_r = nullptr ) { zypp::misc::testcase::LoadTestcase loader; std::string err; if (!loader.loadTestcaseAt( path_r, &err ) ) { ZYPP_THROW( Exception(err) ); } const auto &setup = loader.setupInfo(); auto tempRepoManager = repomanager(); if ( !setup.applySetup( tempRepoManager ) ) { ZYPP_THROW( Exception("Failed to apply setup!") ); } { base::SetTracker localesTracker = setup.localesTracker(); localesTracker.removed().insert( localesTracker.current().begin(), localesTracker.current().end() ); satpool().initRequestedLocales( localesTracker.removed() ); localesTracker.added().insert( localesTracker.current().begin(), localesTracker.current().end() ); satpool().setRequestedLocales( localesTracker.added() ); } poolProxy(); // prepare if ( trialsP_r ) *trialsP_r = loader.trialInfo(); } public: /** Load all enabled repos in repos.d to pool. */ void loadRepos() { RepoManager repoManager( repomanager() ); RepoInfoList repos = repoManager.knownRepositories(); for ( RepoInfoList::iterator it = repos.begin(); it != repos.end(); ++it ) { RepoInfo & nrepo( *it ); USR << nrepo << endl; if ( ! nrepo.enabled() ) continue; if ( ! repoManager.isCached( nrepo ) || nrepo.type() == repo::RepoType::RPMPLAINDIR ) { if ( repoManager.isCached( nrepo ) ) { USR << "cleanCache" << endl; repoManager.cleanCache( nrepo ); } //USR << "refreshMetadata" << endl; //repoManager.refreshMetadata( nrepo ); USR << "buildCache" << endl; repoManager.buildCache( nrepo ); } USR << "Create from cache" << endl; repoManager.loadFromCache( nrepo ); } } public: /** Detect and load the system located at \a sysRoot. * * \a sysRoot needs to be a directory containing either a SolverTestcase, * a TestSetup system or a real system. The provided repostitories are * loaded into the pool (without refresh). */ static void LoadSystemAt( const Pathname & sysRoot, const Arch & _testSetupArch_r = Arch_x86_64 ) { if ( ! PathInfo( sysRoot ).isDir() ) ZYPP_THROW( Exception("sysRoot argument needs to be a directory") ); if ( TestSetup::isTestcase( sysRoot ) ) { USR << str::form( "*** Load Testcase from '%s'", sysRoot.c_str() ) << endl; TestSetup test; test.loadTestcaseRepos( sysRoot ); } else if ( TestSetup::isTestSetup( sysRoot ) ) { USR << str::form( "*** Load TestSetup from '%s'", sysRoot.c_str() ) << endl; TestSetup test( sysRoot, _testSetupArch_r ); test.loadRepos(); Pathname solvCachePath( RepoManagerOptions::makeTestSetup( test.root() ).repoSolvCachePath ); Pathname fakeTargetSolv( solvCachePath / sat::Pool::systemRepoAlias() / "solv" ); if ( PathInfo( fakeTargetSolv ).isFile() ) { USR << str::form( "*** Fake TestSetup Target from '%s'", fakeTargetSolv.c_str() ) << endl; test.target(); test.loadTargetRepo( fakeTargetSolv ); } } else { sat::Pool satpool( sat::Pool::instance() ); // a system USR << str::form( "*** Load system at '%s'", sysRoot.c_str() ) << endl; if ( 1 ) { USR << "*** load target '" << Repository::systemRepoAlias() << "'\t" << endl; getZYpp()->initializeTarget( sysRoot ); getZYpp()->target()->load(); USR << satpool.systemRepo() << endl; } if ( 1 ) { RepoManager repoManager( sysRoot ); RepoInfoList repos = repoManager.knownRepositories(); for_( it, repos.begin(), repos.end() ) { RepoInfo & nrepo( *it ); if ( ! nrepo.enabled() ) continue; if ( ! repoManager.isCached( nrepo ) ) { USR << str::form( "*** omit uncached repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } USR << str::form( "*** load repo '%s'\t", nrepo.name().c_str() ) << flush; try { repoManager.loadFromCache( nrepo ); USR << satpool.reposFind( nrepo.alias() ) << endl; } catch ( const Exception & exp ) { USR << exp.asString() + "\n" + exp.historyAsString() << endl; USR << str::form( "*** omit broken repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } } } } } private: struct Impl { Impl( const Pathname & rootdir_r, const Arch & sysarch_r, const Options & options_r ) { _options = options_r; if ( rootdir_r.empty() ) _rootdir = _tmprootdir.path(); else { filesystem::assert_dir( (_rootdir = rootdir_r) ); if ( _options.testFlag( TSO_CLEANROOT ) ) filesystem::clean_dir( _rootdir ); } // erase any old pool content... getZYpp()->finishTarget(); sat::Pool::instance().reposEraseAll(); // prepare for the new one... ZConfig::instance().setRepoManagerRoot( _rootdir ); if ( ! sysarch_r.empty() ) ZConfig::instance().setSystemArchitecture( sysarch_r ); USR << "CREATED TESTSETUP below " << _rootdir << endl; } ~Impl() { USR << (_tmprootdir.path() == _rootdir ? "DELETE" : "KEEP") << " TESTSETUP below " << _rootdir << endl; } filesystem::TmpDir _tmprootdir; Pathname _rootdir; Options _options; }; std::unique_ptr _pimpl; // maybe worth creating RW_pointer traits for it }; #endif //INCLUDE_TESTSETUP libzypp-17.36.5/tests/lib/TestTools.h000066400000000000000000000011251476576476200174360ustar00rootroot00000000000000#ifndef TESTTOOLS_H #define TESTTOOLS_H #include #include #include "zypp/Pathname.h" #include "zypp/PathInfo.h" namespace TestTools { //read all contents of a file into a string) std::string readFile ( const zypp::Pathname &file ) { if ( ! zypp::PathInfo( file ).isFile() ) { return std::string(); } std::ifstream istr( file.asString().c_str() ); if ( ! istr ) { return std::string(); } std::string str((std::istreambuf_iterator(istr)), std::istreambuf_iterator()); return str; } } #endif // TESTTOOLS_H libzypp-17.36.5/tests/lib/WebServer.cc000066400000000000000000000424351476576476200175510ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "WebServer.h" #include #include #include #include #if FCGI_IN_SUBDIR #include #include #else #include #include #endif #include #include #ifndef TESTS_SRC_DIR #error "TESTS_SRC_DIR not defined" #endif #ifndef WEBSRV_BINARY #error "WEBSRV_BINARY not defined" #endif using std::endl; using namespace zypp; namespace { /** ExternalProgram extended to kill the child process if the parent thread exits */ class ZYPP_LOCAL ExternalTrackedProgram : public ExternalProgram { public: ExternalTrackedProgram (const char *const *argv, const Environment & environment, Stderr_Disposition stderr_disp = Normal_Stderr, bool use_pty = false, int stderr_fd = -1, bool default_locale = false, const Pathname& root = "") : ExternalProgram() { start_program( argv, environment, stderr_disp, stderr_fd, default_locale, root.c_str(), false, true ); } }; bool checkLocalPort( int portno_r ) { bool ret = false; AutoDispose sockfd { socket( AF_INET, SOCK_STREAM, 0 ) }; if ( sockfd < 0 ) { std::cerr << "ERROR opening socket" << endl; return ret; } sockfd.setDispose( ::close ); struct hostent * server = gethostbyname( "127.0.0.1" ); if ( server == nullptr ) { std::cerr << "ERROR, no such host 127.0.0.1" << endl; return ret; } struct sockaddr_in serv_addr; bzero( &serv_addr, sizeof(serv_addr) ); serv_addr.sin_family = AF_INET; bcopy( server->h_addr, &serv_addr.sin_addr.s_addr, server->h_length ); serv_addr.sin_port = htons(portno_r); return( connect( sockfd, (const sockaddr*)&serv_addr, sizeof(serv_addr) ) == 0 ); } } static inline std::string hostname() { static char buf[256]; std::string result; if (!::gethostname(buf, 255)) result += std::string(buf); else return "localhost"; return result; } static inline std::string handlerPrefix() { static std::string pref("/handler/"); return pref; } WebServer::Request::Request(std::streambuf *rinbuf, std::streambuf *routbuf, std::streambuf *rerrbuf ) : rin ( rinbuf ) , rout ( routbuf ) , rerr ( rerrbuf ) { } class WebServer::Impl { public: Impl(const Pathname &root, unsigned int port, bool ssl) : _docroot(root), _port(port), _stop(false), _stopped(true), _ssl( ssl ) { FCGX_Init(); // wake up pipe to interrupt poll() pipe ( _wakeupPipe ); fcntl( _wakeupPipe[0], F_SETFL, O_NONBLOCK ); MIL << "Working dir is " << _workingDir << endl; filesystem::assert_dir( _workingDir / "log" ); filesystem::assert_dir( _workingDir / "tmp" ); #ifdef HTTP_USE_LIGHTTPD filesystem::assert_dir( _workingDir / "state" ); filesystem::assert_dir( _workingDir / "home" ); filesystem::assert_dir( _workingDir / "cache" ); filesystem::assert_dir( _workingDir / "upload" ); filesystem::assert_dir( _workingDir / "sockets" ); #endif } ~Impl() { if ( ! _stopped ) stop(); close (_wakeupPipe[0]); close (_wakeupPipe[1]); } Pathname socketPath () const { return ( _workingDir.path() / "fcgi.sock" ); } int port() const { return _port; } void worker_thread() { AutoDispose sockFD( -1, ::close ); ExternalProgram::Environment env; #ifdef HTTP_USE_LIGHTTPD bool canContinue = true; Pathname confDir = Pathname(TESTS_SRC_DIR) / "data" / "lighttpdconf"; Pathname sslDir = Pathname(TESTS_SRC_DIR) / "data" / "webconf" / "ssl"; env["ZYPP_TEST_SRVCONF"] = confDir.asString(); std::string confFile = ( confDir / "lighttpd.conf" ).asString(); { std::lock_guard lock ( _mut ); sockFD.value() = FCGX_OpenSocket( socketPath().c_str(), 128 ); env["ZYPP_TEST_SRVROOT"] = _workingDir.path().c_str(); env["ZYPP_TEST_PORT"] = str::numstring( _port ); env["ZYPP_TEST_DOCROOT"] = _docroot.c_str(); env["ZYPP_TEST_SOCKPATH"] = socketPath().c_str(); env["ZYPP_SSL_CONFDIR"] = sslDir.c_str(); if ( _ssl ) env["ZYPP_TEST_USE_SSL"] = "1"; } const char* argv[] = { "/usr/sbin/lighttpd", "-D", "-f", confFile.c_str(), nullptr }; #else const auto writeConfFile = []( const Pathname &fileName, const std::string &data ){ std::ofstream file; file.open( fileName.c_str() ); if ( file.fail() ) { std::cerr << "Failed to create file " << fileName << std::endl; return false; } file << data; file.close(); return true; }; const auto confPath = _workingDir.path(); const auto confFile = confPath/"nginx.conf"; bool canContinue = true; { std::lock_guard lock ( _mut ); bool canContinue = ( zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"nginxconf"/"nginx.conf", confFile ) == 0 ); if ( canContinue ) canContinue = writeConfFile( confPath / "srvroot.conf", str::Format("root %1%;") % _docroot ); if ( canContinue ) canContinue = writeConfFile( confPath / "fcgisock.conf", str::Format("fastcgi_pass unix:%1%;") % socketPath().c_str() ); if ( canContinue ) canContinue = writeConfFile( confPath / "user.conf", getuid() != 0 ? "" : "user root;" ); if ( canContinue ) { if ( _ssl ) canContinue = writeConfFile( confPath / "port.conf", str::Format("listen %1% ssl;") % _port ); else canContinue = writeConfFile( confPath / "port.conf", str::Format("listen %1%;") % _port ); } if ( canContinue ) { if ( _ssl ) canContinue = ( zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"nginxconf"/"ssl.conf", confPath/"ssl.conf" ) == 0 ); else canContinue = ( zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"nginxconf"/"nossl.conf", confPath/"ssl.conf" ) == 0); } if ( canContinue ) canContinue = zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"nginxconf"/"mime.types", confPath/"mime.types") == 0; if ( canContinue && _ssl ) canContinue = zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"webconf"/"ssl"/"server.pem", confPath/"cert.pem") == 0; if ( canContinue && _ssl ) canContinue = zypp::filesystem::symlink( Pathname(TESTS_SRC_DIR)/"data"/"webconf"/"ssl"/"server.key", confPath/"cert.key") == 0; if ( canContinue ) sockFD.value() = FCGX_OpenSocket( socketPath().c_str(), 128 ); } const char* argv[] = { WEBSRV_BINARY, "-p", confPath.c_str(), "-c", confFile.c_str(), nullptr }; #endif if ( !canContinue ) { _stopped = true; _cv.notify_all(); return; } ExternalTrackedProgram prog( argv, env, ExternalProgram::Stderr_To_Stdout, false, -1, true); prog.setBlocking( false ); while(1) { std::string line = prog.receiveLine(); if ( line.empty() ) break; if ( line.find_first_of( "nginx: [alert] could not open error log file:") == 0 ) continue; std::cerr << line << endl; }; // Wait max 10 sec for the socket becoming available bool isup { checkLocalPort( port() ) }; if ( !isup ) { unsigned i = 0; do { std::this_thread::sleep_for( std::chrono::milliseconds(1000) ); isup = checkLocalPort( port() ); } while ( !isup && ++i < 10 ); if ( !isup && prog.running() ) { prog.kill( SIGTERM ); prog.close(); } } if ( !prog.running() ) { _stop = true; _stopped = true; } else { _stopped = false; } FCGX_Request request; FCGX_InitRequest(&request, sockFD,0); AutoDispose guard( &request, std::bind( &FCGX_Free, _1, 0 ) ); struct pollfd fds[] { { _wakeupPipe[0], POLLIN, 0 }, { sockFD, POLLIN, 0 }, { fileno( prog.inputFile() ), POLLIN | POLLHUP | POLLERR, 0 } }; bool firstLoop = true; while ( 1 ) { if ( firstLoop ) { firstLoop = false; _cv.notify_all(); if ( _stopped ) return; } //there is no way to give a timeout to FCGX_Accept_r, so we poll the socketfd for new //connections and listen on a pipe for a wakeup event to stop the worker if required int ret = zyppng::eintrSafeCall( ::poll, fds, 3, -1 ); if ( ret < 0 ) { std::cerr << "Poll error " << errno << endl; continue; } if ( fds[0].revents ) { //clear pipe char dummy; while ( read( _wakeupPipe[0], &dummy, 1 ) > 0 ) { continue; } } if ( fds[2].revents ) { while(1) { std::string line = prog.receiveLine(); if ( line.empty() ) break; std::cerr << line << endl; }; if ( !prog.running() ) { std::cerr << "Webserver exited too early" << endl; _stop = true; _stopped = true; } } if ( _stop ) break; //no events on the listen socket, repoll if ( ! ( fds[1].revents & POLLIN ) ) continue; if ( FCGX_Accept_r(&request) == 0 ) { fcgi_streambuf cout_fcgi(request.out); fcgi_streambuf cin_fcgi(request.in); fcgi_streambuf cerr_fcgi(request.err); WebServer::Request req( &cin_fcgi, &cout_fcgi, &cerr_fcgi ); int i = 0; for ( char *env = request.envp[i]; env != nullptr; env = request.envp[++i] ) { char * eq = strchr( env, '=' ); if ( !eq ) { continue; } req.params.insert( { std::string( env, eq ), std::string( eq+1 ) } ); } if ( !req.params.count("SCRIPT_NAME") ) { req.rerr << "Status: 400 Bad Request\r\n" << "Content-Type: text/html\r\n" << "\r\n" << "Invalid request"; FCGX_Finish_r(&request); continue; } { std::lock_guard lock( _mut ); //remove "/handler/" prefix std::string key = req.params.at("SCRIPT_NAME").substr( handlerPrefix().length() ); const auto &it = _handlers.find( key ); if ( it == _handlers.end() ) { if ( !_defaultHandler ) { _defaultHandler = makeDefaultHandler(); } _defaultHandler( req ); FCGX_Finish_r(&request); continue; } //call the handler it->second( req ); FCGX_Finish_r(&request); } } } if ( prog.running() ) { prog.kill( SIGTERM ); prog.close(); } } std::string log() const { //read logfile return std::string(); } void stop() { MIL << "Waiting for server thread to finish" << endl; _stop = true; //signal the thread to wake up write( _wakeupPipe[1], "\n", 1); _thrd->join(); MIL << "server thread finished" << endl; _thrd.reset(); _stopped = true; } void start() { if ( !filesystem::PathInfo( _docroot ).isExist() ) { std::cerr << "Invalid docroot" << std::endl; throw zypp::Exception("Invalid docroot"); } if ( !_stopped ) { stop(); } MIL << "Using socket " << socketPath() << std::endl; _stop = _stopped = false; std::unique_lock lock( _mut ); _thrd.reset( new std::thread( &Impl::worker_thread, this ) ); _cv.wait(lock); if ( _stopped ) { _thrd->join(); throw zypp::Exception("Failed to start the webserver"); } } std::mutex _mut; // _thrd; std::map _handlers; WebServer::RequestHandler _defaultHandler; unsigned int _port; int _wakeupPipe[2]; std::atomic_bool _stop; bool _stopped; bool _ssl; }; WebServer::WebServer(const Pathname &root, unsigned int port, bool useSSL) : _pimpl(new Impl(root, port, useSSL)) { } bool WebServer::start() { _pimpl->start(); return !isStopped(); } std::string WebServer::log() const { return _pimpl->log(); } bool WebServer::isStopped() const { return _pimpl->_stopped; } void WebServer::addRequestHandler( const std::string &path, RequestHandler &&handler ) { std::lock_guard lock( _pimpl->_mut ); _pimpl->_handlers[path] = std::move(handler); } void WebServer::setDefaultHandler ( RequestHandler &&handler ) { std::lock_guard lock( _pimpl->_mut ); _pimpl->_defaultHandler = std::move(handler); } void WebServer::removeRequestHandler(const std::string &path) { std::lock_guard lock( _pimpl->_mut ); auto it = _pimpl->_handlers.find( path ); if ( it != _pimpl->_handlers.end() ) _pimpl->_handlers.erase( it ); } int WebServer::port() const { return _pimpl->port(); } Url WebServer::url() const { Url url; url.setHost("localhost"); url.setPort(str::numstring(port())); if ( _pimpl->_ssl ) url.setScheme("https"); else url.setScheme("http"); return url; } media::TransferSettings WebServer::transferSettings() const { media::TransferSettings set; set.setCertificateAuthoritiesPath(caPath()); return set; } filesystem::Pathname WebServer::caPath() const { return ( zypp::Pathname(TESTS_SRC_DIR)/"data/webconf/ssl/certstore" ); } void WebServer::stop() { _pimpl->stop(); } WebServer::RequestHandler WebServer::makeResponse( std::string resp ) { return [ resp ]( WebServer::Request & req ){ req.rout << resp; }; }; WebServer::RequestHandler WebServer::makeDefaultHandler( ) { return []( WebServer::Request & req ){ req.rerr << "Status: 404 Not Found\r\n" << "Content-Type: text/html\r\n" << "\r\n" << "Request handler was not found"; }; } WebServer::RequestHandler WebServer::makeResponse( std::string status, std::string content ) { return makeResponse( status , std::vector(), content ); }; WebServer::RequestHandler WebServer::makeResponse( const std::string &status, const std::vector &headers, const std::string &content ) { return makeResponse( makeResponseString( status, headers, content ) ); } std::string WebServer::makeResponseString(const std::string &status, const std::vector &headers, const std::string &content) { static const std::string genericResp = "Status: %1%\r\n" "%2%" "\r\n" "%3%"; bool hasCType = false; bool hasLType = false; for( const std::string &hdr : headers ) { if ( zypp::str::startsWith( hdr, "Content-Type:" ) ) { hasCType = true; } if ( zypp::str::startsWith( hdr, "Content-Length:" ) ) { hasLType = true; } } std::string allHeaders; if ( !hasCType ) allHeaders += "Content-Type: text/html; charset=utf-8\r\n"; if ( !hasLType ) allHeaders += str::Format("Content-Length: %1%\r\n") % content.length(); allHeaders += zypp::str::join( headers.begin(), headers.end(), "\r\n"); return ( zypp::str::Format( genericResp ) % status % allHeaders %content ); } WebServer::RequestHandler WebServer::makeBasicAuthHandler(const std::string &basicCred, WebServer::RequestHandler &&callback) { return [ basicCred=basicCred, callback = std::move(callback) ]( WebServer::Request &req ){ //Basic dGVzdDp0ZXN0 auto it = req.params.find( "HTTP_AUTHORIZATION" ); bool authorized = false; if ( it != req.params.end() ) authorized = ( it->second == basicCred ); if ( !authorized ) { req.rout << "Status: 401 Unauthorized\r\n" "Content-Type: text/html; charset=utf-8\r\n" "WWW-Authenticate: Basic realm=\"User Visible Realm\", charset=\"UTF-8\" \r\n" "\r\n" "Sorry you are not authorized."; return; } callback(req); }; }; WebServer::~WebServer() { } libzypp-17.36.5/tests/lib/WebServer.h000066400000000000000000000102421476576476200174020ustar00rootroot00000000000000 #ifndef ZYPP_TEST_WEBSERVER_H #define ZYPP_TEST_WEBSERVER_H #include #include #include #include #include /** * * Starts a webserver to simulate remote transfers in * testcases * \author Duncan Mac-Vicar P. * * \code * #include "WebServer.h" * * BOOST_AUTO_TEST_CASE(Foo) * { * * WebServer web((Pathname(TESTS_SRC_DIR) + "/datadir").c_str() ); * web.start(); * * MediaSetAccess media( Url("http://localhost:9099"), "/" ); * * // do something with the url * * * web.stop(); * * \endcode */ class WebServer { public: struct Request { Request ( std::streambuf *rinbuf, std::streambuf *routbuf, std::streambuf *rerrbuf ); std::string path; std::map< std::string, std::string > params; std::istream rin; std::ostream rout; std::ostream rerr; }; using RequestHandler = std::function; /** * creates a web server on \ref root and \port */ WebServer(const zypp::Pathname &root, unsigned int port=10001, bool useSSL = false ); ~WebServer(); /** * Starts the webserver worker thread * Waits up to 10 seconds and returns whether the port is now active. */ bool start(); /** * Stops the worker thread */ void stop(); /** * returns the port we are listening to */ int port() const; /** * returns the base url where the webserver is listening */ zypp::Url url() const; /** * generates required transfer settings */ zypp::media::TransferSettings transferSettings () const; /** * Returns the CA path for this server */ zypp::Pathname caPath() const; /** * shows the log of last run */ std::string log() const; /** * Checks if the server was stopped */ bool isStopped() const; /** * Sets the request handler callback, if a callback for the path does already exist * it is replaced, can be called at any time * * \note a request handler path is always prefixed with /handler so to call a handler named test, the * URL is "http://localhost/handler/test" */ void addRequestHandler ( const std::string &path, RequestHandler &&handler ); /** * Sets the default request handler callback as a fallback if no specific handler was registered for * a given path. The path from the HTTP request can be queried as the "REQUEST_URI" param from the \ref Request structure passed to the callback. * * \note a request handler path is always prefixed with /handler so to call a handler named test, the * URL is "http://localhost/handler/test" */ void setDefaultHandler ( RequestHandler &&handler ); /*! * Removes a registered request hander, can be called at any time */ void removeRequestHandler ( const std::string &path ); /*! * Creates a request handler that simply returns the string in \a resp */ static RequestHandler makeResponse(std::string resp); /*! * Creates a request handler that simply returns 404 */ static RequestHandler makeDefaultHandler( ); /*! * Creates a request handler that sends a HTTP response with \a status and \a content * in the respose */ static RequestHandler makeResponse(std::string status, std::string content); /*! * Creates a request handler that sends a HTTP response with \a status \a content * and \a headers in the respose */ static RequestHandler makeResponse(const std::string &status, const std::vector &headers, const std::string &content); /*! * Creates the corresponding HTTP response to the given parameters */ static std::string makeResponseString ( const std::string &status, const std::vector &headers, const std::string &content ); /*! * Checks if the request sends authorization data that matches \a basicCred and forwards the request to callback. * Otherwise sends a auth error back to the client. */ static RequestHandler makeBasicAuthHandler( const std::string &basicCred, RequestHandler &&callback ); class Impl; private: /** Pointer to implementation */ zypp::RW_pointer _pimpl; }; #endif libzypp-17.36.5/tests/media/000077500000000000000000000000001476576476200156375ustar00rootroot00000000000000libzypp-17.36.5/tests/media/CMakeLists.txt000066400000000000000000000002551476576476200204010ustar00rootroot00000000000000ADD_TESTS( CredentialManager CredentialFileReader MediaProducts MetaLinkParser ) IF( NOT DISABLE_MEDIABACKEND_TESTS ) ADD_TESTS( MediaCurl ) ENDIF() libzypp-17.36.5/tests/media/CredentialFileReader_test.cc000066400000000000000000000014711476576476200232050ustar00rootroot00000000000000#include #include #include #include #include #include #include #include using std::cout; using std::endl; using namespace zypp; using namespace zypp::media; typedef std::set CredentialSet; struct CredCollector { bool collect(AuthData_Ptr & cred) { cout << "got: " << endl << *cred << endl; creds.insert(cred); return true; } CredentialSet creds; }; BOOST_AUTO_TEST_CASE(read_cred) { CredCollector collector; Pathname credfile = TESTS_SRC_DIR "/media/data/credentials.cat"; CredentialFileReader reader(credfile, bind( &CredCollector::collect, &collector, _1 )); BOOST_CHECK_EQUAL(collector.creds.size(), 3); } libzypp-17.36.5/tests/media/CredentialManager_test.cc000066400000000000000000000065501476576476200225600ustar00rootroot00000000000000#include #include #include #include #include #include #include using std::cout; using std::endl; using namespace zypp; using namespace zypp::media; inline void testGetCreds( CredentialManager & cm_r, const std::string & url_r, const std::string & user_r = "", const std::string & pass_r = "" ) { Url url( url_r ); AuthData_Ptr cred = cm_r.getCred( url ); //cout << "FOR: " << url << endl; //cout << "GOT: " << cred << endl; if ( user_r.empty() && pass_r.empty() ) { BOOST_CHECK_EQUAL( cred, AuthData_Ptr() ); } else { BOOST_CHECK_EQUAL( cred->username(), user_r ); BOOST_CHECK_EQUAL( cred->password(), pass_r ); } } BOOST_AUTO_TEST_CASE(read_cred_for_url) { CredManagerOptions opts; opts.globalCredFilePath = TESTS_SRC_DIR "/media/data/credentials.cat"; opts.userCredFilePath = Pathname(); CredentialManager cm( opts ); BOOST_CHECK_EQUAL( cm.credsGlobalSize(), 3 ); testGetCreds( cm, "https://drink.it/repo/roots", "ginger", "ale" ); testGetCreds( cm, "ftp://weprovidesoft.fr/download/opensuse/110", "agda", "ichard" ); testGetCreds( cm, "ftp://magda@weprovidesoft.fr/download/opensuse/110", "magda", "richard" ); testGetCreds( cm, "ftp://agda@weprovidesoft.fr/download/opensuse/110", "agda", "ichard" ); testGetCreds( cm, "ftp://unknown@weprovidesoft.fr/download/opensuse/110" ); // NULL testGetCreds( cm, "http://url.ok/but/not/creds" ); // NULL } struct CredCollector { bool collect(AuthData_Ptr & cred) { //cout << "got: " << endl << *cred << endl; creds.insert(cred); return true; } CredentialManager::CredentialSet creds; }; BOOST_AUTO_TEST_CASE(save_creds) { filesystem::TmpDir tmp; CredManagerOptions opts; opts.globalCredFilePath = tmp / "fooha"; CredentialManager cm1(opts); AuthData cr1("benson","absolute"); cr1.setUrl(Url("http://joooha.com")); AuthData cr2("pat","vymetheny"); cr2.setUrl(Url("ftp://filesuck.org")); // should create a new file cm1.saveInGlobal(cr1); CredCollector collector; CredentialFileReader( opts.globalCredFilePath, bind( &CredCollector::collect, &collector, _1 ) ); BOOST_CHECK_EQUAL( collector.creds.size(), 1 ); collector.creds.clear(); cm1.saveInGlobal(cr2); CredentialFileReader( opts.globalCredFilePath, bind( &CredCollector::collect, &collector, _1 ) ); BOOST_CHECK_EQUAL(collector.creds.size(), 2 ); collector.creds.clear(); // save the same creds again cm1.saveInGlobal(cr2); CredentialFileReader( opts.globalCredFilePath, bind( &CredCollector::collect, &collector, _1 ) ); BOOST_CHECK_EQUAL(collector.creds.size(), 2 ); // todo check created file permissions } BOOST_AUTO_TEST_CASE(service_base_url) { filesystem::TmpDir tmp; CredManagerOptions opts; opts.globalCredFilePath = tmp / "fooha"; CredentialManager cm( opts ); AuthData cred( "benson","absolute" ); cred.setUrl( Url( "http://joooha.com/service/path" ) ); cm.addGlobalCred( cred ); testGetCreds( cm, "http://joooha.com/service/path/repo/repofoo", "benson", "absolute" ); testGetCreds( cm, "http://benson@joooha.com/service/path/repo/repofoo", "benson", "absolute" ); testGetCreds( cm, "http://nobody@joooha.com/service/path/repo/repofoo" ); // NULL } libzypp-17.36.5/tests/media/MediaCurl_test.cc000066400000000000000000000157751476576476200210710ustar00rootroot00000000000000#include "WebServer.h" #include #include #include #include #include #include #include #include #include namespace bdata = boost::unit_test::data; // Globals can be broken in tests, better manually create the byte objects const auto makeBytes( zypp::ByteCount::SizeType size ) { return zypp::ByteCount( size, zypp::ByteCount::Unit( 1LL, "B", 0 ) ); }; const auto makeKBytes( zypp::ByteCount::SizeType size ) { return zypp::ByteCount( size, zypp::ByteCount::Unit( 1024LL, "KiB", 1 ) ); }; bool withSSL[]{ true, false}; std::vector backend = { "curl", "curl2", "multicurl" }; BOOST_DATA_TEST_CASE( base_provide_zck, bdata::make( withSSL ) * bdata::make( backend ), withSSL, backend ) { int primaryRequests = 0; zypp::Pathname testRoot = zypp::Pathname(TESTS_SRC_DIR)/"zyppng/data/downloader"; WebServer web( testRoot.c_str(), 10001, withSSL ); BOOST_REQUIRE( web.start() ); web.addRequestHandler("primary", [ & ]( WebServer::Request &req ){ primaryRequests++; req.rout << "Location: /primary.xml.zck\r\n\r\n"; return; }); zypp::media::MediaManager mm; zypp::media::MediaAccessId id; zypp::Url mediaUrl = web.url(); mediaUrl.setQueryParam( "mediahandler", backend ); if( withSSL ) { mediaUrl.setQueryParam("ssl_capath", web.caPath().asString() ); } BOOST_CHECK_NO_THROW( id = mm.open( mediaUrl ) ); BOOST_CHECK_NO_THROW( mm.attach(id) ); zypp::OnMediaLocation loc("/handler/primary"); loc.setDeltafile( testRoot/"primary-deltatemplate.xml.zck" ); loc.setDownloadSize( makeBytes(274638) ); loc.setHeaderSize( makeBytes(11717) ); loc.setHeaderChecksum( zypp::CheckSum( zypp::Digest::sha256(), "90a1a1b99ba3b6c8ae9f14b0c8b8c43141c69ec3388bfa3b9915fbeea03926b7") ); BOOST_CHECK_NO_THROW( mm.provideFile( id, loc ) ); // if zck is enabled, we have 2 requests, otherwise its just a normal provide #ifdef ENABLE_ZCHUNK_COMPRESSION if ( backend == "curl2" ) BOOST_REQUIRE_EQUAL( primaryRequests, 2 ); // header + chunks else #endif BOOST_REQUIRE_EQUAL( primaryRequests, 1 ); } //case: file with authentication BOOST_DATA_TEST_CASE( base_provide_auth, bdata::make( withSSL ) * bdata::make( backend ), withSSL, backend ) { //don't write or read creds from real settings dir zypp::filesystem::TmpDir repoManagerRoot; zypp::ZConfig::instance().setRepoManagerRoot( repoManagerRoot.path() ); zypp::Pathname testRoot = zypp::Pathname(TESTS_SRC_DIR)/"zyppng/data/downloader"; WebServer web( testRoot.c_str(), 10001, withSSL ); BOOST_REQUIRE( web.start() ); web.addRequestHandler("primary", WebServer::makeBasicAuthHandler("Basic dGVzdDp0ZXN0", []( WebServer::Request &req ){ req.rout << "Status: 307 Temporary Redirect\r\n" "Location: /primary.xml.zck\r\n\r\n"; })); zypp::media::MediaManager mm; zypp::media::MediaAccessId id; zypp::Url mediaUrl = web.url(); mediaUrl.setQueryParam( "mediahandler", backend ); if( withSSL ) { mediaUrl.setQueryParam("ssl_capath", web.caPath().asString() ); } BOOST_CHECK_NO_THROW( id = mm.open( mediaUrl ) ); BOOST_CHECK_NO_THROW( mm.attach(id) ); zypp::OnMediaLocation loc("/handler/primary"); loc.setDeltafile( testRoot/"primary-deltatemplate.xml.zck" ); loc.setDownloadSize( makeBytes(274638) ); loc.setHeaderSize( makeBytes(11717) ); loc.setHeaderChecksum( zypp::CheckSum( zypp::Digest::sha256(), "90a1a1b99ba3b6c8ae9f14b0c8b8c43141c69ec3388bfa3b9915fbeea03926b7") ); { // no auth given BOOST_REQUIRE_THROW( mm.provideFile( id, loc ), zypp::media::MediaUnauthorizedException ); } { //case: user provides wrong auth, then cancels struct AuthenticationReportReceiver : public zypp::callback::ReceiveReport { int reqCount = 0; bool gotAuth = false; AuthenticationReportReceiver( ){ connect(); } bool prompt(const zypp::Url &, const std::string &, zypp::media::AuthData & auth_data) override { if ( reqCount > 1 ) return false; auth_data.setUsername("wrong"); auth_data.setPassword("auth"); gotAuth = true; reqCount++; return true; } }; AuthenticationReportReceiver authHandler; BOOST_REQUIRE_THROW( mm.provideFile( id, loc ), zypp::media::MediaUnauthorizedException ); BOOST_REQUIRE_EQUAL( authHandler.gotAuth, true ); } { //case: user cancels auth struct AuthenticationReportReceiver : public zypp::callback::ReceiveReport { bool gotAuth = false; AuthenticationReportReceiver( ){ connect(); } bool prompt(const zypp::Url &, const std::string &, zypp::media::AuthData &) override { gotAuth = true; return false; } }; AuthenticationReportReceiver authHandler; BOOST_REQUIRE_THROW( mm.provideFile( id, loc ), zypp::media::MediaUnauthorizedException ); BOOST_REQUIRE_EQUAL( authHandler.gotAuth, true ); } { // case: User first gives wrong, then correct auth information struct AuthenticationReportReceiver : public zypp::callback::ReceiveReport { bool gotAuth = false; int reqCount = 0; AuthenticationReportReceiver( ){ connect(); } bool prompt(const zypp::Url &, const std::string &, zypp::media::AuthData &auth_data) override { if ( reqCount >= 1 ) { auth_data.setUsername("test"); auth_data.setPassword("test"); } else { auth_data.setUsername("wrong"); auth_data.setPassword("auth"); } reqCount++; gotAuth = true; return true; } }; AuthenticationReportReceiver authHandler; BOOST_REQUIRE_NO_THROW( mm.provideFile( id, loc ) ); BOOST_REQUIRE_EQUAL( authHandler.gotAuth, true ); } } // case: requesting a non existant file BOOST_DATA_TEST_CASE( base_provide_not_found, bdata::make( withSSL ) * bdata::make( backend ), withSSL, backend ) { //don't write or read creds from real settings dir zypp::filesystem::TmpDir repoManagerRoot; zypp::ZConfig::instance().setRepoManagerRoot( repoManagerRoot.path() ); zypp::Pathname testRoot = zypp::Pathname(TESTS_SRC_DIR)/"zyppng/data/downloader"; WebServer web( testRoot.c_str(), 10001, withSSL ); BOOST_REQUIRE( web.start() ); zypp::media::MediaManager mm; zypp::media::MediaAccessId id; zypp::Url mediaUrl = web.url(); mediaUrl.setQueryParam( "mediahandler", backend ); if( withSSL ) { mediaUrl.setQueryParam("ssl_capath", web.caPath().asString() ); } BOOST_CHECK_NO_THROW( id = mm.open( mediaUrl ) ); BOOST_CHECK_NO_THROW( mm.attach(id) ); zypp::OnMediaLocation loc("/file-not-there.txt"); { // no auth given BOOST_REQUIRE_THROW( mm.provideFile( id, loc ), zypp::media::MediaFileNotFoundException ); } } libzypp-17.36.5/tests/media/MediaProducts_test.cc000066400000000000000000000002331476576476200217460ustar00rootroot00000000000000#include #include #include BOOST_AUTO_TEST_CASE(compile) { // make sure header compiles } libzypp-17.36.5/tests/media/MetaLinkParser_test.cc000066400000000000000000000057451476576476200221010ustar00rootroot00000000000000#include #include #include #include using namespace zypp; using namespace zypp::media; BOOST_AUTO_TEST_CASE(parse_metalink) { Pathname meta3file = TESTS_SRC_DIR "/media/data/openSUSE-11.3-NET-i586.iso.metalink"; Pathname meta4file = TESTS_SRC_DIR "/media/data/openSUSE-11.3-NET-i586.iso.meta4"; MetaLinkParser mlp3; MetaLinkParser mlp4; mlp3.parse(meta3file); MediaBlockList bl3 = mlp3.getBlockList(); std::vector urls3 = mlp3.getUrls(); mlp4.parse(meta4file); MediaBlockList bl4 = mlp4.getBlockList(); std::vector urls4 = mlp4.getUrls(); BOOST_CHECK(bl3.asString() == bl4.asString()); BOOST_CHECK(urls3.size() == 94); BOOST_CHECK(urls4.size() == 94); BOOST_CHECK(urls3.begin()->asString() == "http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso"); BOOST_CHECK(urls4.begin()->asString() == "http://ftp4.gwdg.de/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso"); BOOST_CHECK(bl3.getFilesize() == 120285184); BOOST_CHECK(bl4.getFilesize() == 120285184); BOOST_CHECK(bl3.numBlocks() == 459); BOOST_CHECK(bl4.numBlocks() == 459); } BOOST_AUTO_TEST_CASE(parse_metalink_with_zsync_hash) { Pathname meta4file = TESTS_SRC_DIR "/media/data/other.xml.gz.meta4"; MetaLinkParser mlp4; mlp4.parse( meta4file ); auto bl = mlp4.getBlockList(); BOOST_REQUIRE( bl.haveBlocks() ); BOOST_REQUIRE_EQUAL( bl.numBlocks(), 246 ); const auto &rsums = mlp4.getZsyncBlockHashes(); const auto &csums = mlp4.getSHA1BlockHashes(); BOOST_REQUIRE_EQUAL( rsums.size(), csums.size() ); BOOST_REQUIRE_EQUAL( bl.numBlocks(), csums.size() ); BOOST_REQUIRE_EQUAL( bl.getFilesize(), 16108851 ); BOOST_REQUIRE( bl.getFileChecksum() == hexstr2bytes("702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121") ); BOOST_REQUIRE( rsums.front() == hexstr2bytes("52c0a614") ); BOOST_REQUIRE( rsums.back() == hexstr2bytes("349ad053") ); BOOST_REQUIRE( csums.front() == hexstr2bytes("b9f77f48f4a49f3438fc1bb6de90df39657597aa") ); BOOST_REQUIRE( csums.back() == hexstr2bytes("23788c5daf28813cdc6a14f1f02add712c020fd9") ); const auto &mirrors = mlp4.getMirrors(); BOOST_REQUIRE_EQUAL( mirrors.size(), 103 ); const auto &firstMirr = mirrors.front(); BOOST_REQUIRE_EQUAL( firstMirr.url, zypp::Url("http://ftp.uni-erlangen.de/pub/mirrors/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz")); BOOST_REQUIRE_EQUAL( firstMirr.priority, 1 ); BOOST_REQUIRE_EQUAL( firstMirr.maxConnections, 10 ); const auto &lastMirr = mirrors.back(); BOOST_REQUIRE_EQUAL( lastMirr.url, zypp::Url("http://mirror.internode.on.net/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz")); BOOST_REQUIRE_EQUAL( lastMirr.priority, 103 ); BOOST_REQUIRE_EQUAL( lastMirr.maxConnections, -1 ); } libzypp-17.36.5/tests/media/data/000077500000000000000000000000001476576476200165505ustar00rootroot00000000000000libzypp-17.36.5/tests/media/data/credentials.cat000066400000000000000000000006161476576476200215410ustar00rootroot00000000000000# no 1 [https://drink.it/repo/roots] username=ginger password=ale #no 2 [ftp://weprovidesoft.fr/download/opensuse/110] username=magda password=richard # no 3 - same urla s 2 but different user (lex less than magda) [ftp://weprovidesoft.fr/download/opensuse/110] username=agda password=ichard # fail [http://url.ok/but/not/creds] username= password=any # fail [badurl] username=foo password=bar libzypp-17.36.5/tests/media/data/credentials.d/000077500000000000000000000000001476576476200212675ustar00rootroot00000000000000libzypp-17.36.5/tests/media/data/credentials.d/cred1000066400000000000000000000000371476576476200222100ustar00rootroot00000000000000username=helene password=elena libzypp-17.36.5/tests/media/data/openSUSE-11.3-NET-i586.iso.meta4000066400000000000000000001211451476576476200234370ustar00rootroot00000000000000 MirrorBrain/2.13.2 http://download.opensuse.org/distribution/openSUSE-current/iso/openSUSE-11.3-NET-i586.iso.meta4 2010-10-13T09:39:21Z openSUSE http://download.opensuse.org 120285184 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBMNZQUqE7a6JyACsoRAlr2AJ9o5fkD0DZ2MpyWC0S9EI6c7BXuPQCd ElMAtuZlO5NgYvG2bQ8xys5iWss= =WmmH -----END PGP SIGNATURE----- a0dc5f5132b0a26218f533d837d4fc1a c7827b5a8e62d3971524ba0c438e9574e892103a 7db356f5e21547e423da0406b7ea36e3c6e4ee62975015294585593d3a2a88c8 c5bc4f75f550e44491273720086bf1692c526cbd bbe1177d325d1310868d34e2350666f9cb119e94 2a167f3a34a9a09577365b1015ca23b823f0a80d 48d2ba5258254dcd4e49140ac7857c9fdb38ab60 bde60d0206ac5a0198e898553b665f9d9c60babb 41437180a223068413028fd977ef4ea033bfbfce 81b7da73641a5e3391210bc9e3de1568a5208836 6f9c2895ec0a887fe2dabd521e40918244da0059 8bc4a733263a01658a7c58a53fb777b4c8b4ff28 ed21674a98ba5af37df44fe4ad0e140c82ac8d1e 3772fed4a8bacd4e20478375c9dc8784f9fef98f 62f0024c67ff6830a3355b9145f043c4d60b2f13 d9ac81f6753d14912ec643ad8e2982bd1e128c95 4f5369273b928b9aaee69736140b814ee9a228d7 d6b8bcaf68d07591774302417a3d2b4ee0948e60 c2a98d8a80ada0b7ecdf214ab6bd3331793cb120 d0725a3e8f0053cb76c1e4424cb2496092063836 50d34d802241b3b52937364a14d369f2644ea4f4 553ba2491229a1ccfd23d01e00df4d95e612d442 2943c0b02f824925e9b589bf3129f950c1e48e5d 5d4f21b818057eb23d9aa0e27e8fa5be4c1f3594 9630c21e84b85e27f9ee19e59ce1a633621a0b1b ca3c553ec4b1310c1526b684d14c85640329cd1e 55bbc2e9d0a627b7481639f4d909118f6b811fc3 7843b05f31d95adac6f781f0de8e8af868490a76 479d93353bceea8744c7f1b4eac97b277e29ba30 28db10a11cf7fc317510230237b76df0dd0dc35c 128a62f1599591f9d7db1ce53d551a00555af265 582ff34a81fe4b3da54defa2b890946f1fce1646 03855419b291564e13510d81083d79816179e4f0 0e5a6eb83c9f358f4bb1e092f9a3bcef95dd0a41 f3e6e901bd37e3ec8d405a96128cc85bff450a83 dee45f794ec0fb5fb5a20826ba2d8d191a567733 390c6d1eaf5a28f93d7e8237e3972b9e93fe5cca 20336a02716605b12e6fafd18855cbae411a09eb ef22857c452d0043adbc054dd4396c0838426ae2 574c3a9f656391757acb83fb5091dabeb78e2418 203e818753a68b0bea326ea1428972a92036d9d8 5b49222d21afb87a5de922e9c77ca255619d21ad fdd7b232c5ba5fa75c30f0e628e506725869df25 360bb3a824926cb73357b7c587390867e944b28c c0f194a68b2c1d8693a83ef162ad85f8c0bf93cd 25079830fe5d0c64d5c8f65c6beb61f2832995c8 fe5b97a5c807c66833a2f5c45a7c511299c8e7c5 64f287d9fc0c64c68c9b9f61711080b4072b11bc fbd01b40db0d0d73c4346bfa6942cd23666d08d8 e73a60b7a8efde3d70da2935d85c3ebd6b623651 414299b4a2da9b50700d2d7d7721139291acd2b7 e2c03eac8cbd4ef1a1fde5b60c32f26c6760a32b a44b4d98688b7dd787ee2c3029229ca3083b2633 635ab22c1507403e3ba9481b92c7637ebd58bb2e bddcde253a718b50ab3e2517cc33938ce54baab4 bed44cc3cacd658389c4807edead76e71329dea9 efe42d31f00ced3aea5a9aef9a3820ec20ba9e73 d1b1f83099c80c9219386b38063588a94385ef5a 670abebd7cd7a0a62d4aeba3dee78c7512d2ea8c f483d9fbe3d513be20aef6e8736c5755c9aea29e 46b4ce6520798c362a16ac3e293cbf94f979603a 8b5e93ad34582431b3efb89ec10e05ff4257c166 06e09067668ff5b9ebda474a71db44c9b8386eee 395843d5243a235c7803bba79eca803bb9c5c5a7 0a2cc9fe1a1a4591110f7235b1b9ca9eb4e59ec7 fe5ef70a92427bbded4cadcd74f648b7e33807c2 c743ddce2e930bcdf76db2f08f5a959f6f3cecd9 d5788b2dca4a6cb5d75cce8316db1e761c914da5 cf5c83859f55714544e42645db270d237b6d4499 497214fef565cfa04c2b8f96704be999b93df93f 2f4c7da4c7d25e6d8d63a995f5296c8295bc8d01 95550875564701777b6e6e02854865c991a121b6 c378b72cdc37c83d4f713e55915863babf949ba3 d67e326f31fcb79000e96b3032c1e16183e79d84 53b0067cc0e8eb9b856a11af29cf69ededfe4bfd ebf37f7028112f669d244d55ae0290c003cc9cff 56e6482f5e0162ee16ee77496e583c9a0d5b0b31 772fb29f60ecd14b3c06a317258e86b6802a1310 b43a919ce9eae4c3f1b18f5d3f61328a9f67d885 cd93972f4cab7128bfefe836ac5601b2cced8a42 fe20173622a73d64f586f9594551bd5fe56ef690 2f22b34a49fef60f54f8f59789a439bc5232e0ab cc1e04c724746e6058429c0610dafd639798bfab 95ba6eba3b22e6b473f7946c8c7aa66da6547ae7 2b7e254485c22686e0408ce76fa6b267aadf35ae e35351bcda5aa019839b328106a60e24db7c5de7 47864400bc861e6102bdde3900342ee5ac9dfe51 f7bfb5331e63b5de7826d0fe5abb0a4e9dffa9b4 14cf61a6d461a67f569e0f4b99ebd21ce5925566 8a250ac80584f8acaf8af9a4a8d3f9f014999a12 a5731b1360d3a387576903da16ed50f390f00864 7c9a3b9f00754bc4da997730e75ddedbcdde5117 d3879d057ea46050c6286f6653c2bf86fb8938c3 a03f375f255e325f6a603934e15769044ecb25db b8ac8d69c3bc16ad657ea2b4a7eace8ea6c60fd8 5c02fbca54bd8a035d59145d6d1be0be96f2197c d43671790be7f5c39af346c8fd00003c135491a2 2381abd10331dfea9f5817487cf74923b040f307 734168c76e9770dd3f86338570d3e27ce7223251 859bf6ee62f7fcb94f052c594d470a61be63f084 98b4178ddd01b7959b0a117ccff0688489b8841d 954de9ea519a33bb4d32ae89f7cae93821e26c02 f41f1496594933eb8fb6869bff916d330f1c9152 d523b3606c19e8a0b161008846dac2d30fd92e4c 3fdf132ad91dcd4f9b466f304d51067baf2ee976 3dbde53bdcd43b022ed4575c40fa65ecd67603d0 cf977d863575f6f74a228a40e357a70a69700189 8c1fe8d6c2bc09f548c2059409d53bdeb5fc7d3f cbfbcedeea1bfc1be031731f0c6de6b0897c84cc 0124bed97ba6c2970af5bff8ab82acb8affb4611 8cba87ed1e345d2312dd341ce7d1810305ccac41 6b6c38964701ba72e7838cea1d91c7ef91ec3f08 1f371667f596f11b40a46bcebd0ab6a90be2913d 708f8af393a828613c45eb5e408c0190b4c95622 d7682ba55ecd3abe1927b9e462fae1b4e9334800 459b073f48c2ba332fc39d3f47bd650a04c511ac bb5d3039b65b985b375ff77e048fa690eca45cf4 ec3168ae0982393770fee2b55cef963a8c503644 0ba5f37dcd6bd6103203fe230d71ffda56502a88 80c37d76da053147a5267d03ee94e89d93fcf074 db4dccc57e290094edb2c9cc9f134b2e3077d22f ea5981c1f1fb5c214ba0c9e82ec030c2a1bbf0a3 f92cf79330387d5b51b8efd6300179e1be15ae01 38e0eec3af20d607b15a9a21078373a338c1d4ba 9ee0001d0ee983caa4e1c469cdf77ed51a0ef9f2 c5a803fc6dd74028f63573e325d87c19001bea8d 11992d4f3a304d24962223cb14aeb9c67848e027 d7bb416faf5485896af7d349982a92cdf98e847d 632add982c1641009bafe85f691f6f21385cd34b 04bb6d36962f76334e71f90240d528e8a3ad459b 32ebc900994d00f4eda332631d687edf7982df0b a302bf465ac38da7429548b80b288c70fe7f9ed4 ed87a36bfe5abd2bb0b0a4efb5932bfa425f80a0 f8c448216f59f523bcf33d2d99dc83e8ec7f46e1 82f5ffb770451bfd840d816946d9b59884d41b02 bd8faa855ca9377f46161b9427027ed8400eff3a f680d78b7854ac0af443b879a880fe3c22cafbd5 5d357bb06899857d3e64468d79eef199882cc3d6 4be3cae2cd41742f8f33f80c41797a68b1510fb5 6d70253e7e22c6a30570d96b6cfb36772b33354f ede70be18a4db080c3d046c5fd9f0bc6b625a772 14c8f1675f97244b14f12d6b32419a19cf814dbc 0f9943a582d5d514e9deb1253d4806156ad37c17 c0086d20b74ae26693716ec7bae9b530237d786b 356fe043c133aab0a922153f9cef068d90bf3f89 0d2420bcd3eabc17c319e73cb1c043fa47f8ac92 7b9496187417464ac70e4fa7a63a710eea14202a fcf3ada8b083d0adffc0c5ecce437aaa483d4109 0b14dd454a228bf96d9a177fcc65234db93a740b a7d2ed2809de3e928913a6a3f8efcf1f06f1f3ab 9752d14b59c1b60ad957de4982d84e0f3a398bcc bdba58965077db889544e8bb086ddfa8d4394be2 93fa8444acd84d0a5580b553b9eec85a354aa4cb dcdb227911b0bcd0ed6074711eb9ad6f686aef46 6cd9e2121fee8d0c0982d9976fc8b5eec99bed7c e74ef9311f1a084f8d2625369cbd245872e7c7b5 d042115bc6a339f1bcd58d526c3617cc125311f3 fb68189e82b480de37bcb09a2e6ac699d7d81533 aacecb7a31699743342dce7e031818a809a6ef8a 431b9fe43c294a313042714f99e9a9ae59663992 fd84701b8a4453d227dffe54761824c4c690f1a4 a0d69bdc1b1d99b17e42fe9a0e48918344aa4e4e 3962f2a34b48853aa3885a25c5282640451b8935 66f1df2058e6b061623971b3c25f49a35a856f2e 06531afe357933551835fd816ce915c9737ae8fd 3642ad5a2bc42db69d495f0b4f506f5059761b94 7756a6cf4264d74e727fc84f377d4a7472f91469 a13af573eadb2998648ea050c65bcdc78e262ada 9ed650662bf9b8b236934799554d03b0b6ed64d4 404d94a3268699510b0dcddbc826bf724dca6658 85043d5ae0586b322f97310bc299aa9007101ee8 3c39c196c6ba4d90ba316ce3b451bffcc462a9dc dbf5c2fcd32b32023a1431960ca8eac207b3e8c7 b2efc9445d6af07aaa64eb736815c1574abfff32 9e7443a1d9daa8c5a8e1db98e68fd839b7dec99e 92317de0fc58deba956a7c4cf23cd87028362826 0e53cb81bda4774c3c5ce8898e2a85d56704fdb6 d4b76a8dae36403ffb6c9bb93a93115c4fd74f18 cfc7ff0056327d1eb3c401885e49ee514acb5ea4 3e47d6f3d4512b56f8a48e028417da53a8f50163 fdc51eda2dd4f784e086e05efd50756e0e2e93f1 62b0642dd3583e46bc4a4a4e946f9f41a85316c5 1d699a2de913e0512b3069a56c634952e206f725 faa1518829eb7b7bafef580bdc7a375ab67df6c9 79a2069008732e01fafdc6bfae5c0d4878191cf8 cfe4b5a6ac9633bb476be67f9ce7326519498f66 faaba329d20c0fbd04ced467c68b4b466bdf7674 22902be8a6d4dcd61f2d5643093c16d91591453b 2bf01ec12eec43da8c15e0495a27c8e2e7d17975 d1341a1129f63c66136d661677f34aca91eab3cf 057e65f31bf494c532d1299368b273abafcbe24f 1640f880ba910be403d511f39d7d610a2f5aed92 4bbff42ed3ba0e6fb23ffc3170e884c1752b7bb9 82ec7855cd32e721445c3ec0f2dfae9814faaaa4 ee6e7a68f2c5b3cb3ade33066182c3fbc49317e6 542684dc2cbc3f02ea57a7e21382ecbb0b977c5d 9ee8f8ba9a51f1a2ffdeaec56b9f790a8246545f cd0895b0a6f8c32ddf8e1774be61c2a448e113bc 4871e467373ed699071396b07774a1591d36a421 35b5604b108a59988aca58e6f4773b2f4cd5b88a 9c58cf38b6958c7e7400d19e8c98db2f5a43325d 00ee7a8491272475e6ece4cca82b7e9c29f740ba 6f7350658904cc01c8e9a7aab19a44c8c8f1ca4d 9b640920de57018780e3919b890d17ef09e8ed8c 17d551e8c57570bff19fd2fb8220bf101f3bc941 52e1f2ed6f21611b2efe4d7ef325aa24840470ad 863df77cbc0c93c5fc589c0e968ff7222cf2d42e bfc8699fb1f8ee70c74e8914cd76f29ccf5b814f a0ab0bccc949c52049273865495dd18b0fd11945 548a1690e5ffce54983a40f583f968235e480f45 4b88cc0e5d7bd519b6abe5f3ebc13b9c1b166506 5106ee73a301a0d38eabf0e71cb0fc9866bb8b69 032ce62bad50602863ae3f8409ae8b03a44fb017 c480c521a00374c0691de62fa415e6854ba3400d 3f63504eb9fc8fe250f7441699508c4c3704153e 8ea4edef9512aadc4c20dc54488c1569322cba72 69c3be28a635b360687e79a7fbc945bab87f7e19 072f4d5484893b8b995e19e31b192f414908ce46 e938a1c8e19fb02d8a59809005327ce91ea1453a d30fc4f7643cc522965ee3c496d3d7601e73fb08 1ee78d5f582629784ecb286c551fcf3b335e74a8 54fb2f5699241e407e272d0e79469216d98e6b91 e7038177e7399d30956ebe5db5f0b5b4946528ff 68f175645387cf47fc0eed8a973ac4dab2657908 0a2f4c4a6abf92231d2c7f9e1dd8011c908fa356 741f332adb152ccb781c732755b551dd7c1481f0 0cfdbfaa362a5c4d22a1fe7f31375bf57ac7a1ec 3102a4d3fe18594ffd62696ba07f8ea9321eb222 49abbc86515bfa01e86f62f32a44f5663b3b6f27 e27321dd4d10129f095a0ab8e748898885869ac7 a4de9b37ffd591118d31be1602d2f20ac434b1fa 1fa1da65287c26594d76b478e3f5ffb5e80d61c9 6a298213a3bd89bfec478b5f265284cba1f09b3b 79fbd7d3834ab562828062d21dd3788c04c892a0 910b55f1f231d98b29ff9c8dbfe51c188f7edcc7 0a242b36214a6f44d6c15c7021b649793e779313 d639b6a1243d8b0536bc0f4c29bf1abb74aa541f 97ea28452ee779b1d146f02756f632dbca917a8a 58ca63e6293b38ed450683c0e2d0d778f6ea2fec 35989c2ef34043069106d0790f483c88dbe5563a 110cd1527cdd1ac7283f8299a3b57a2b6edf48ef a2174fa136d4231799369916f9a07d7c8e02ec47 952eb637dbeb2e1366747cfa94cc70ee1e8ed493 3646a03568c6b81917fa35fb3733d31f96233f3c 7ff65f933bb17b5e413a892f81cb3f3c8ef6b9c1 06a00a18679a4c1524440c022ae4984fef35b937 f1a6a85df1c1ad73a4d86df3dfe040ad68cdf89a b2d0c85ebfac8204670291cfe1267a0bd2053ee1 bc7fda6813272bf14a66aa38490310ecd33db06c d518fe952e380e96676fa9d62d00ac328c332a5c fb2c624674936a90916a3d8385325ef92201d317 c67d2837b586016e4898c830463383860d265adf dd6d14ec3bba1d23c7234bb4af3e59462170d675 a771b7fa4312921ff1c2a19d82a90fa77c05f3e6 945d62fd50fa90858a0ef8062a45e719dbe6ee60 78ba1b8d5aa6964cb9ffc3632e41806a14427d58 e7dce40ce18becf249f9638c2ba294cd1805478a 2c7cad45471143608401188c8dcf155ba7a790a9 bdab487c1d4c977f5a6a0d1cac8f2d12679f6d86 d73e478a5e1b09047d8e3911948976f559c7e915 90a75eaffe4c4c870d3fa541a554a68d61678f67 7b040bfb1fea7283b028eb79341fb1f229f6054d 780282015861b75321929ec63433bad711b66d66 22085d54006694927e943f37bf856053f5ce58b0 634f46669410fde9a17d53ac19ee5a7d1d04b1a5 69dfd663f066f9674a12685116109098354d25f2 21fa816492c37c4927d5ea2a1cfc61ff5c2f847e 14cdeb8dd583856c9935be5a58e33187ccacbc66 71b0c9c229b934f78957235be17e9887405a37d5 8d744577eaa8d208f4b258197e01c65ed3b7e999 c4752ddef02d57f8409bb54053259c358f90e327 9f13ac8ed18542369833d5e4c9bad59be5f23db1 a869be8eb4e553fac5ac25e058d343dffbf601af 56f40091232d071f7a342efeb178aff27c70c29a 1a4f6184f9e69117990f5483bf05045ee7e17834 e7ad705497f2f07a91974729ed986e906861ff81 8140bcb9ce68579eb83ac751070d7a08057b3e3c c463b5925b9f27d7f077bdff813cde19d3c2bf09 06e20fe2ee579bdd1e2fdef738485afd6d999418 91c259e944216ec83ddb541fbf53bbbd518d927f 8340d1cade0cc8ae45e8136add447649cd470607 8241dbbf5ff5cc381d7d6448f2c1348abec45203 594b9ab10319109e782cfc0eaabd038a8e744518 a7ade46fac338fd08ae322f9575ab95768fd4569 0146e3deeba63989108d1bcfcf0231c05d8d7a2e 07d371120735553c7295a9466ee6fe81ff46fe51 a7c05b98e519af4a86bd20beb6b964c94d48d0af 9e894b914ab144217181dbca27f955206b3c37b4 2205dd2085dada143b64785b1fd86b0d3a765bab 086cadf056dd73a5209df85f0ad2d3ccf7d14f7b ae73594385fb7e5195c9c9dffc8b9dd5545a05a0 277ab18f0ff09f3a1a0a8d68715f7eb22eaba249 f6e148ba5488138825b8e2a8ba88f4cf7a24deef 76743b6a629f09b4cc06e7f871561ee87e518ebb 7367aff187fdf6e6d4a70f492e0cd907d3a4ff33 19ba943536dcb28b3e815c87f8ad9d910948a975 1db42e3489d6db0749401769978b04c05cf0f137 a3c1099e318a4915204318e5de0a4276afe0ef02 a7a87a47a61b0d93591c94589d39fd079a206ff3 a4eb1a071e724dca21ad02c912754edfaee1ab00 611664ce7faa6e14fb6a167758a53c52dac1084b 344dc7036a6e2d0ec784d3f60132046d021a24a4 02bf376576b2f7ae650e4d2769cb3caf1764a49f 35b2549570666e6c1cf7c3dbbf70e482c41d714f e5fbe9e59d967812a34621a9b104968b0c353df4 2b8f1ed1d05393b612a433195f3752f874f8308e 647719776245276d1948c44b37003d0adc8c53ca 25c8f2a87b48b1e60700764054ce4aa3e5d14c25 271744f02f7b00fae63626940cb06e19c75d590e cc6ed725952f3d39f570868692e86c0941de1c52 a081512a675ac3fc30bb21862feb2ab6e8094b55 d46a5d5044f6025a5188c3e6bdbb9f77ed98b1b1 891ed91b426b1c415d613128bc3227a350fadfec dea127f7c5ac058465f1d0264b27659798780498 a5a7f6e00c529d1272b071ecbf6bbedbbbebf89a ed61db99d5a7862a643f684e67770921c03400e1 b719a8c73ba5daee78c4b5f7de7d7c3055547f12 b6f33ac83b8a1db1db0246e15b6c1ac564db5a5b c084dc77d693f6d3b3f72f8196cd3583d60545ca a09e7af08be0e060d48a863d81eef2fc24456369 fd15cd7451b4df224b3076462cd3532726ed5700 36b5a41a18b7cfdcacbcb0def8957dbbbf443df8 1b810d454152f6e07bd161e02b40473bc0bd2efa eb4a3a814b45d248bf3526fa2bf162c72a7d84be 65c26fe1a5ca80972835cd3546c2e794deae62cd ddbbf176a6f2a6b0e856e50cc969bf157f4b8706 3712dda5fa2838d14b942e2dd43babd8dbd8fb71 2bb88a6732a8257da53fb795e4d2a1dabd44948c 322e7ced7dded5a26b775ed4dd425009c9cacf1a fe863b60a63f8b844796455dede6206d057b3f7f e023d908e76518afe0a73a9284691fc51d362673 9c4856b53ea1a6137fda6bbe6ba3f29355412c94 d733e415454ab0737f61ab6545a97aaa34a10981 b7aa3fe75fba78e3ef7a83657b0deb6cf563751a d8226fae4f14c31362aaa403f4d6a8b84b89dfc5 e8a1cfa1e616e1af2a63ab32845ff719ed98c192 b28f88b4dbe3017d2194b3614321b0e85b1a817e a4e6762a5454c1623ab580b1cea66e98d47a1207 dea8eb3fca200ec89e5ade0833a5954abdb3a38d 84f62cdaa7d95f934e355abf48af32f8b5aa6a92 9763c01fd40bd56ebad6adf07a4e00f670508b3a 35376a957ac89be433fa6a5af47bbb3a803b8439 9fbb9ef79f32e2b7e71cab55991ac6838f3cc727 d7a088da4afedcf3a6b2bf7b6c0405dee40dc0b1 c2a87610d343c57b3685843b722ea6839c2482c2 6698ac8c767847f828b3027930b3840c6c298da9 67f27e3c2aa7dab996b38f0b020e9e3a1ddc1a7a 5aa3383d759f101865c58ae95a7d28cb4bd90912 ea7bb4593fa94b3731ffcc0471f23e79487d90be 587d61a2389f0229988dfa3ba6356d34777f7ad7 96067e7f71d24311460e6faa73f43af14e1bd09c b4ad2b6d784fb0455e0e3ffaf77ec6a5d3835be4 3c4a0493d869fb12d84fc84efbdf99d721e32795 7ebfd1a18b889c0ead28671811c3bc912accee7b d279daafeba573f7ecff882f696733eeef1081e2 ca359bb82bf59c190ba4ec30e4f79e61cedf6216 213d1d15b0fdd65965916bae093710822c2f7434 20dff502ccf9b1dfae7f8c0b118382fa7c3198ac 4e0405347af59ede2c53c4c1a527ac46595829c5 127a4491a7c2310495b68127e9c6570b66600820 494ad84de129e62b21bba071d8051a6238a51a5a f09c50833a58feb41e33cab11e41df1de8eeedcc 30a03fe42d2f7336b0ed8648a0db70b1462cb76b 017b17715d7c6a37e4839dbfd9f6498b3b17826c a4720889b0785c30cc5b9ae56f404a55170d682a 5c78a48362ff5a2e28124c9901ac7ef2497fd30a 39e371cf264039216d190a3b7973f6ea9d745775 6894cd074f39c624be1f0efc4a4b273c1a579bd6 50c637cb403c92e3f6784162069d2604f1225725 128d969bbb6da6a34e838e3d95d68ec5dd294867 2114cf6fb464efa725f7fa5b8cfc1caa80e28672 ca7d1683820bae83b8690f38e5aaf9e1d636abe2 3257813fc3444c2e606b7f9969bbf315dd63fa90 1597f152441f6b0a3ebdccfe0c8350e2242616d2 35a4b71263aeab8206ba33e23c77696cd36b4518 f6334b906ac6f4e068ca73b39fee2e7b25bf7981 8e91d3f29603675132f56aec4fe7ef6d6a63fca4 59df53686a09f36836696d627f26f684bc82afd0 b5fdd020ab89b9eef96fedd11924eab2f33fe1ac a10410318a1572e3db0cb85b8535493cfe023016 51124ed652ab51c6f9562e687b70c89ae504529d cf873592a2b70ec6033e1165fd67a321003464b9 d4315f51b5ddc3ec94a0183674dca9a400be10cc dc2f46596ab80be510e874b19702478a04f4e5c3 5b49e74cf77ce61c433a1144e214c3f88910962d 3ac5906a9f85304d580b71cd9327fd61edeffa44 81e74202fd189c83953fab52df68951d8169c459 bc472cf7d207b3f2c8b5ece2409185091c4fb98a 278be38283d7cfc425f8d2d3ff878d092d9abc20 8c59a07a0f16d2c73b18cf9c094a217ac7549b0f 717c55da1fa0210d630fd39d903cc9e8d1f819dd 724c8b2141b7be2ad5d8fe35f90db84e634f3caf e35c251905928e7cdecab7d5335420866e282099 e9f39bf25ab70cde0ee6dc97803566fa72ab88f8 07e733a23c110efd3f61d00d2bf9a932e5b17b3b f8c9efd365ea8e16a6bb7960dbf2e8923b6daf38 0630f187f5d846a3afaf517d2ffeeb90d48c5af4 46d00fc1685b39e7a46899416ff11f793e49c722 444b3637266774f24ea0757b29e9f4ba0de3057e fc726962d0b4f888edab8d6088529b3ae4784d28 98a01edc5b8d0f543df51f98b9eb55a755ebe364 05aa7ad756232555f12ef6bb8fa8356bffbd435f d6afccb033d4708a3dccde50bf12183072baf439 a26c492ac46ccaefe9dc5c7c9400aec8d796e261 ad068476ecd3b0483b1e15dcbf874286e02707b3 d3a1206d02257a61dc3afc496d6485c4fec7638a fe449f8645437f64f33b1f1ca8f0a099cdef3a0f fd07b0f9ca72b8a0b1ee2b6f919a27caf613fbfd 3a1a5eed724e229a45512ace76fc2c4cdb4aad2d 1e018eb2b2c3c53c9a51d8ec518d051113ec6529 564393b0a9363665c7362f0a5ac71316f4a9265e 17a78772871dc7e7e5c978f91f97a9b0660f40ac 80b40c9929082efca003180e089bbfe5f8082d2e 0944557d7186e1316b470f41e268b5c4a30ed206 944691065bdffa40bf18cfa3da7cbc2f5356ff08 f85307e1e85f3769ebaf8731b3fbc3400fc08108 af7354a57bb251dd4bcc0c07cb77993243be5e87 eff8227e4995441276416cca50fd14fef2ba428c ec673322ba6bad3b270b19d3ceb05305a6d6af45 dd59aec11fc5b728aff4998e12f53a1112cfbc31 252086811d30ceb5badcaaa69c4cb32e7303b7d2 0e00907a75b843cd935ef6a451b3c82af49e3008 2a4a79d2c884543a3ba2a73afa47eb9f0bd29698 9aa7bafb92bd0e1fa42ca81b34828291174cfa45 50a700806286465c356dc6a5aa9d77646be2371f 0d5c84f521e82a262bc5ad047798096be0ad8217 f9009d3620cb8bf7e644cb35868b26b1f9f72e93 22174bf7c7f885afaced65e3af0453917aecb803 b4492302cc57880ca4c32471fb531b1ca41eb2a1 bc9a39507de82e1190121b248e032384d998cac7 08aabd9ac83078444ac22dc9dc0936c8455ec6aa 045c55a19bf74a4c09cc350d912287505f49bcc6 57cd4adf110b641b0872349a1905853ce7c3be6f 73fd179fd5237c71f0d69ebcaaeefddcc7372034 02a1892f86b351e7d25c86de00f1976fe4c36726 b4520a04516e18d6484cbb97d494dc301ac4150a 5b1ec54158bc5fd716dee1175a5b7a69c4f67f97 2508fb878c117c6eaf1adb44f047463d8302bc27 1de3dbd76c42457a59daea2ef4f9bfee2677cf08 9fc5feaa0027b690edd68f9e184388d586ae3405 1fa4c67e95d7a6ac3c626c744e703bcc858968f8 138631842aeda8e493affbfb915acf75ea0d1b4b 300ae5f1277a0374ed60996a6cd166f8ce19cc19 4a9578fb889bd57ac08f383c501887c6f6cdaacb ca33f2402ae60e2ca34a082cb2ff57b251fae0b9 797e7fffb8ba0b568c2b32947bd27459e581b931 e7dd92f6b9fcb9cf6e8a7aababb4fd8d5286438f 0d86c365f6789a0ed89663c9b4ce2baafe631198 d13836d6d14856c6322e7a02688191f8e403a003 f76040312df1f9bffffee5da1f3760bbb078a9d5 4c292b1cf4f0d198c7a0c62feaec65a7209af089 5705d5b44a8475dc9e930e25c9131860282eacce 7900c7881264321732e18f13318af526f19a8302 652da028e5240027a861cd0089652c9a9dd47735 0799bdab13d97e3acac01947e581260d1ff96dcc 06e826c833a096daa1c4c209f09b8a1bb1bf0e88 3f87b9557090c2ad7bb155e5ac2a35d242831f9f 5c2d2fc46f2b4867843780a9925d90231b80ad2e 57b5897d995a27a65a80e0a63f0625f6a752c081 6dd50b9ba1a288cf2e7765e5dcc5bfd80ba8c92a 2a35d531b30f15cbf91bcdbb6eb715f1656e5a0a 69f3e10e839bbe57a61afabbe32f4c7e125e3874 http://ftp4.gwdg.de/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp3.gwdg.de/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-kassel.de/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://vesta.informatik.rwth-aachen.de/ftp/pub/comp/Linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-erlangen.de/pub/mirrors/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://widehat.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp5.gwdg.de/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.intergenia.de/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-siegen.de/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.uib.no/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.mirrors.proxad.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.gts.lug.ro/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.klid.dk/ftp/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.tugraz.at/mirror/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso ftp://ftp.pbone.net/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.isr.ist.utl.pt/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.linux.cz/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.se.eu.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.ovh.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.kreksi.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.leaseweb.com/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.inode.at/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://fr2.rpmfind.net/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.lagis.at/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.ynet.sk/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.mirror.garr.it/mirrors/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.ines.lug.ro/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uninett.no/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.bifi.unizar.es/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.roedu.net/mirrors/opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.hro.nl/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.isu.net.sa/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.umoss.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://fundawang.lcuc.org.cn/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.mirror.aussiehq.net.au/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.riken.jp/Linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.novell.co.jp/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.fcaglp.unlp.edu.ar/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.cs.utah.edu/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors2.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.its.dal.ca/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.kaist.ac.kr/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.xmission.com/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.idrepo.or.id/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.mirrors.tds.net/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.osuosl.org/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://www.muug.mb.ca/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.rackspace.com/openSUSE/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors1.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.utexas.edu/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.nyi.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://130.57.19.201/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.rit.edu/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.chg.ru/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.internode.on.net/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso libzypp-17.36.5/tests/media/data/openSUSE-11.3-NET-i586.iso.metalink000066400000000000000000001421711476576476200242330ustar00rootroot00000000000000 openSUSE http://download.opensuse.org 120285184 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBMNZQUqE7a6JyACsoRAlr2AJ9o5fkD0DZ2MpyWC0S9EI6c7BXuPQCd ElMAtuZlO5NgYvG2bQ8xys5iWss= =WmmH -----END PGP SIGNATURE----- a0dc5f5132b0a26218f533d837d4fc1a c7827b5a8e62d3971524ba0c438e9574e892103a 7db356f5e21547e423da0406b7ea36e3c6e4ee62975015294585593d3a2a88c8 c5bc4f75f550e44491273720086bf1692c526cbd bbe1177d325d1310868d34e2350666f9cb119e94 2a167f3a34a9a09577365b1015ca23b823f0a80d 48d2ba5258254dcd4e49140ac7857c9fdb38ab60 bde60d0206ac5a0198e898553b665f9d9c60babb 41437180a223068413028fd977ef4ea033bfbfce 81b7da73641a5e3391210bc9e3de1568a5208836 6f9c2895ec0a887fe2dabd521e40918244da0059 8bc4a733263a01658a7c58a53fb777b4c8b4ff28 ed21674a98ba5af37df44fe4ad0e140c82ac8d1e 3772fed4a8bacd4e20478375c9dc8784f9fef98f 62f0024c67ff6830a3355b9145f043c4d60b2f13 d9ac81f6753d14912ec643ad8e2982bd1e128c95 4f5369273b928b9aaee69736140b814ee9a228d7 d6b8bcaf68d07591774302417a3d2b4ee0948e60 c2a98d8a80ada0b7ecdf214ab6bd3331793cb120 d0725a3e8f0053cb76c1e4424cb2496092063836 50d34d802241b3b52937364a14d369f2644ea4f4 553ba2491229a1ccfd23d01e00df4d95e612d442 2943c0b02f824925e9b589bf3129f950c1e48e5d 5d4f21b818057eb23d9aa0e27e8fa5be4c1f3594 9630c21e84b85e27f9ee19e59ce1a633621a0b1b ca3c553ec4b1310c1526b684d14c85640329cd1e 55bbc2e9d0a627b7481639f4d909118f6b811fc3 7843b05f31d95adac6f781f0de8e8af868490a76 479d93353bceea8744c7f1b4eac97b277e29ba30 28db10a11cf7fc317510230237b76df0dd0dc35c 128a62f1599591f9d7db1ce53d551a00555af265 582ff34a81fe4b3da54defa2b890946f1fce1646 03855419b291564e13510d81083d79816179e4f0 0e5a6eb83c9f358f4bb1e092f9a3bcef95dd0a41 f3e6e901bd37e3ec8d405a96128cc85bff450a83 dee45f794ec0fb5fb5a20826ba2d8d191a567733 390c6d1eaf5a28f93d7e8237e3972b9e93fe5cca 20336a02716605b12e6fafd18855cbae411a09eb ef22857c452d0043adbc054dd4396c0838426ae2 574c3a9f656391757acb83fb5091dabeb78e2418 203e818753a68b0bea326ea1428972a92036d9d8 5b49222d21afb87a5de922e9c77ca255619d21ad fdd7b232c5ba5fa75c30f0e628e506725869df25 360bb3a824926cb73357b7c587390867e944b28c c0f194a68b2c1d8693a83ef162ad85f8c0bf93cd 25079830fe5d0c64d5c8f65c6beb61f2832995c8 fe5b97a5c807c66833a2f5c45a7c511299c8e7c5 64f287d9fc0c64c68c9b9f61711080b4072b11bc fbd01b40db0d0d73c4346bfa6942cd23666d08d8 e73a60b7a8efde3d70da2935d85c3ebd6b623651 414299b4a2da9b50700d2d7d7721139291acd2b7 e2c03eac8cbd4ef1a1fde5b60c32f26c6760a32b a44b4d98688b7dd787ee2c3029229ca3083b2633 635ab22c1507403e3ba9481b92c7637ebd58bb2e bddcde253a718b50ab3e2517cc33938ce54baab4 bed44cc3cacd658389c4807edead76e71329dea9 efe42d31f00ced3aea5a9aef9a3820ec20ba9e73 d1b1f83099c80c9219386b38063588a94385ef5a 670abebd7cd7a0a62d4aeba3dee78c7512d2ea8c f483d9fbe3d513be20aef6e8736c5755c9aea29e 46b4ce6520798c362a16ac3e293cbf94f979603a 8b5e93ad34582431b3efb89ec10e05ff4257c166 06e09067668ff5b9ebda474a71db44c9b8386eee 395843d5243a235c7803bba79eca803bb9c5c5a7 0a2cc9fe1a1a4591110f7235b1b9ca9eb4e59ec7 fe5ef70a92427bbded4cadcd74f648b7e33807c2 c743ddce2e930bcdf76db2f08f5a959f6f3cecd9 d5788b2dca4a6cb5d75cce8316db1e761c914da5 cf5c83859f55714544e42645db270d237b6d4499 497214fef565cfa04c2b8f96704be999b93df93f 2f4c7da4c7d25e6d8d63a995f5296c8295bc8d01 95550875564701777b6e6e02854865c991a121b6 c378b72cdc37c83d4f713e55915863babf949ba3 d67e326f31fcb79000e96b3032c1e16183e79d84 53b0067cc0e8eb9b856a11af29cf69ededfe4bfd ebf37f7028112f669d244d55ae0290c003cc9cff 56e6482f5e0162ee16ee77496e583c9a0d5b0b31 772fb29f60ecd14b3c06a317258e86b6802a1310 b43a919ce9eae4c3f1b18f5d3f61328a9f67d885 cd93972f4cab7128bfefe836ac5601b2cced8a42 fe20173622a73d64f586f9594551bd5fe56ef690 2f22b34a49fef60f54f8f59789a439bc5232e0ab cc1e04c724746e6058429c0610dafd639798bfab 95ba6eba3b22e6b473f7946c8c7aa66da6547ae7 2b7e254485c22686e0408ce76fa6b267aadf35ae e35351bcda5aa019839b328106a60e24db7c5de7 47864400bc861e6102bdde3900342ee5ac9dfe51 f7bfb5331e63b5de7826d0fe5abb0a4e9dffa9b4 14cf61a6d461a67f569e0f4b99ebd21ce5925566 8a250ac80584f8acaf8af9a4a8d3f9f014999a12 a5731b1360d3a387576903da16ed50f390f00864 7c9a3b9f00754bc4da997730e75ddedbcdde5117 d3879d057ea46050c6286f6653c2bf86fb8938c3 a03f375f255e325f6a603934e15769044ecb25db b8ac8d69c3bc16ad657ea2b4a7eace8ea6c60fd8 5c02fbca54bd8a035d59145d6d1be0be96f2197c d43671790be7f5c39af346c8fd00003c135491a2 2381abd10331dfea9f5817487cf74923b040f307 734168c76e9770dd3f86338570d3e27ce7223251 859bf6ee62f7fcb94f052c594d470a61be63f084 98b4178ddd01b7959b0a117ccff0688489b8841d 954de9ea519a33bb4d32ae89f7cae93821e26c02 f41f1496594933eb8fb6869bff916d330f1c9152 d523b3606c19e8a0b161008846dac2d30fd92e4c 3fdf132ad91dcd4f9b466f304d51067baf2ee976 3dbde53bdcd43b022ed4575c40fa65ecd67603d0 cf977d863575f6f74a228a40e357a70a69700189 8c1fe8d6c2bc09f548c2059409d53bdeb5fc7d3f cbfbcedeea1bfc1be031731f0c6de6b0897c84cc 0124bed97ba6c2970af5bff8ab82acb8affb4611 8cba87ed1e345d2312dd341ce7d1810305ccac41 6b6c38964701ba72e7838cea1d91c7ef91ec3f08 1f371667f596f11b40a46bcebd0ab6a90be2913d 708f8af393a828613c45eb5e408c0190b4c95622 d7682ba55ecd3abe1927b9e462fae1b4e9334800 459b073f48c2ba332fc39d3f47bd650a04c511ac bb5d3039b65b985b375ff77e048fa690eca45cf4 ec3168ae0982393770fee2b55cef963a8c503644 0ba5f37dcd6bd6103203fe230d71ffda56502a88 80c37d76da053147a5267d03ee94e89d93fcf074 db4dccc57e290094edb2c9cc9f134b2e3077d22f ea5981c1f1fb5c214ba0c9e82ec030c2a1bbf0a3 f92cf79330387d5b51b8efd6300179e1be15ae01 38e0eec3af20d607b15a9a21078373a338c1d4ba 9ee0001d0ee983caa4e1c469cdf77ed51a0ef9f2 c5a803fc6dd74028f63573e325d87c19001bea8d 11992d4f3a304d24962223cb14aeb9c67848e027 d7bb416faf5485896af7d349982a92cdf98e847d 632add982c1641009bafe85f691f6f21385cd34b 04bb6d36962f76334e71f90240d528e8a3ad459b 32ebc900994d00f4eda332631d687edf7982df0b a302bf465ac38da7429548b80b288c70fe7f9ed4 ed87a36bfe5abd2bb0b0a4efb5932bfa425f80a0 f8c448216f59f523bcf33d2d99dc83e8ec7f46e1 82f5ffb770451bfd840d816946d9b59884d41b02 bd8faa855ca9377f46161b9427027ed8400eff3a f680d78b7854ac0af443b879a880fe3c22cafbd5 5d357bb06899857d3e64468d79eef199882cc3d6 4be3cae2cd41742f8f33f80c41797a68b1510fb5 6d70253e7e22c6a30570d96b6cfb36772b33354f ede70be18a4db080c3d046c5fd9f0bc6b625a772 14c8f1675f97244b14f12d6b32419a19cf814dbc 0f9943a582d5d514e9deb1253d4806156ad37c17 c0086d20b74ae26693716ec7bae9b530237d786b 356fe043c133aab0a922153f9cef068d90bf3f89 0d2420bcd3eabc17c319e73cb1c043fa47f8ac92 7b9496187417464ac70e4fa7a63a710eea14202a fcf3ada8b083d0adffc0c5ecce437aaa483d4109 0b14dd454a228bf96d9a177fcc65234db93a740b a7d2ed2809de3e928913a6a3f8efcf1f06f1f3ab 9752d14b59c1b60ad957de4982d84e0f3a398bcc bdba58965077db889544e8bb086ddfa8d4394be2 93fa8444acd84d0a5580b553b9eec85a354aa4cb dcdb227911b0bcd0ed6074711eb9ad6f686aef46 6cd9e2121fee8d0c0982d9976fc8b5eec99bed7c e74ef9311f1a084f8d2625369cbd245872e7c7b5 d042115bc6a339f1bcd58d526c3617cc125311f3 fb68189e82b480de37bcb09a2e6ac699d7d81533 aacecb7a31699743342dce7e031818a809a6ef8a 431b9fe43c294a313042714f99e9a9ae59663992 fd84701b8a4453d227dffe54761824c4c690f1a4 a0d69bdc1b1d99b17e42fe9a0e48918344aa4e4e 3962f2a34b48853aa3885a25c5282640451b8935 66f1df2058e6b061623971b3c25f49a35a856f2e 06531afe357933551835fd816ce915c9737ae8fd 3642ad5a2bc42db69d495f0b4f506f5059761b94 7756a6cf4264d74e727fc84f377d4a7472f91469 a13af573eadb2998648ea050c65bcdc78e262ada 9ed650662bf9b8b236934799554d03b0b6ed64d4 404d94a3268699510b0dcddbc826bf724dca6658 85043d5ae0586b322f97310bc299aa9007101ee8 3c39c196c6ba4d90ba316ce3b451bffcc462a9dc dbf5c2fcd32b32023a1431960ca8eac207b3e8c7 b2efc9445d6af07aaa64eb736815c1574abfff32 9e7443a1d9daa8c5a8e1db98e68fd839b7dec99e 92317de0fc58deba956a7c4cf23cd87028362826 0e53cb81bda4774c3c5ce8898e2a85d56704fdb6 d4b76a8dae36403ffb6c9bb93a93115c4fd74f18 cfc7ff0056327d1eb3c401885e49ee514acb5ea4 3e47d6f3d4512b56f8a48e028417da53a8f50163 fdc51eda2dd4f784e086e05efd50756e0e2e93f1 62b0642dd3583e46bc4a4a4e946f9f41a85316c5 1d699a2de913e0512b3069a56c634952e206f725 faa1518829eb7b7bafef580bdc7a375ab67df6c9 79a2069008732e01fafdc6bfae5c0d4878191cf8 cfe4b5a6ac9633bb476be67f9ce7326519498f66 faaba329d20c0fbd04ced467c68b4b466bdf7674 22902be8a6d4dcd61f2d5643093c16d91591453b 2bf01ec12eec43da8c15e0495a27c8e2e7d17975 d1341a1129f63c66136d661677f34aca91eab3cf 057e65f31bf494c532d1299368b273abafcbe24f 1640f880ba910be403d511f39d7d610a2f5aed92 4bbff42ed3ba0e6fb23ffc3170e884c1752b7bb9 82ec7855cd32e721445c3ec0f2dfae9814faaaa4 ee6e7a68f2c5b3cb3ade33066182c3fbc49317e6 542684dc2cbc3f02ea57a7e21382ecbb0b977c5d 9ee8f8ba9a51f1a2ffdeaec56b9f790a8246545f cd0895b0a6f8c32ddf8e1774be61c2a448e113bc 4871e467373ed699071396b07774a1591d36a421 35b5604b108a59988aca58e6f4773b2f4cd5b88a 9c58cf38b6958c7e7400d19e8c98db2f5a43325d 00ee7a8491272475e6ece4cca82b7e9c29f740ba 6f7350658904cc01c8e9a7aab19a44c8c8f1ca4d 9b640920de57018780e3919b890d17ef09e8ed8c 17d551e8c57570bff19fd2fb8220bf101f3bc941 52e1f2ed6f21611b2efe4d7ef325aa24840470ad 863df77cbc0c93c5fc589c0e968ff7222cf2d42e bfc8699fb1f8ee70c74e8914cd76f29ccf5b814f a0ab0bccc949c52049273865495dd18b0fd11945 548a1690e5ffce54983a40f583f968235e480f45 4b88cc0e5d7bd519b6abe5f3ebc13b9c1b166506 5106ee73a301a0d38eabf0e71cb0fc9866bb8b69 032ce62bad50602863ae3f8409ae8b03a44fb017 c480c521a00374c0691de62fa415e6854ba3400d 3f63504eb9fc8fe250f7441699508c4c3704153e 8ea4edef9512aadc4c20dc54488c1569322cba72 69c3be28a635b360687e79a7fbc945bab87f7e19 072f4d5484893b8b995e19e31b192f414908ce46 e938a1c8e19fb02d8a59809005327ce91ea1453a d30fc4f7643cc522965ee3c496d3d7601e73fb08 1ee78d5f582629784ecb286c551fcf3b335e74a8 54fb2f5699241e407e272d0e79469216d98e6b91 e7038177e7399d30956ebe5db5f0b5b4946528ff 68f175645387cf47fc0eed8a973ac4dab2657908 0a2f4c4a6abf92231d2c7f9e1dd8011c908fa356 741f332adb152ccb781c732755b551dd7c1481f0 0cfdbfaa362a5c4d22a1fe7f31375bf57ac7a1ec 3102a4d3fe18594ffd62696ba07f8ea9321eb222 49abbc86515bfa01e86f62f32a44f5663b3b6f27 e27321dd4d10129f095a0ab8e748898885869ac7 a4de9b37ffd591118d31be1602d2f20ac434b1fa 1fa1da65287c26594d76b478e3f5ffb5e80d61c9 6a298213a3bd89bfec478b5f265284cba1f09b3b 79fbd7d3834ab562828062d21dd3788c04c892a0 910b55f1f231d98b29ff9c8dbfe51c188f7edcc7 0a242b36214a6f44d6c15c7021b649793e779313 d639b6a1243d8b0536bc0f4c29bf1abb74aa541f 97ea28452ee779b1d146f02756f632dbca917a8a 58ca63e6293b38ed450683c0e2d0d778f6ea2fec 35989c2ef34043069106d0790f483c88dbe5563a 110cd1527cdd1ac7283f8299a3b57a2b6edf48ef a2174fa136d4231799369916f9a07d7c8e02ec47 952eb637dbeb2e1366747cfa94cc70ee1e8ed493 3646a03568c6b81917fa35fb3733d31f96233f3c 7ff65f933bb17b5e413a892f81cb3f3c8ef6b9c1 06a00a18679a4c1524440c022ae4984fef35b937 f1a6a85df1c1ad73a4d86df3dfe040ad68cdf89a b2d0c85ebfac8204670291cfe1267a0bd2053ee1 bc7fda6813272bf14a66aa38490310ecd33db06c d518fe952e380e96676fa9d62d00ac328c332a5c fb2c624674936a90916a3d8385325ef92201d317 c67d2837b586016e4898c830463383860d265adf dd6d14ec3bba1d23c7234bb4af3e59462170d675 a771b7fa4312921ff1c2a19d82a90fa77c05f3e6 945d62fd50fa90858a0ef8062a45e719dbe6ee60 78ba1b8d5aa6964cb9ffc3632e41806a14427d58 e7dce40ce18becf249f9638c2ba294cd1805478a 2c7cad45471143608401188c8dcf155ba7a790a9 bdab487c1d4c977f5a6a0d1cac8f2d12679f6d86 d73e478a5e1b09047d8e3911948976f559c7e915 90a75eaffe4c4c870d3fa541a554a68d61678f67 7b040bfb1fea7283b028eb79341fb1f229f6054d 780282015861b75321929ec63433bad711b66d66 22085d54006694927e943f37bf856053f5ce58b0 634f46669410fde9a17d53ac19ee5a7d1d04b1a5 69dfd663f066f9674a12685116109098354d25f2 21fa816492c37c4927d5ea2a1cfc61ff5c2f847e 14cdeb8dd583856c9935be5a58e33187ccacbc66 71b0c9c229b934f78957235be17e9887405a37d5 8d744577eaa8d208f4b258197e01c65ed3b7e999 c4752ddef02d57f8409bb54053259c358f90e327 9f13ac8ed18542369833d5e4c9bad59be5f23db1 a869be8eb4e553fac5ac25e058d343dffbf601af 56f40091232d071f7a342efeb178aff27c70c29a 1a4f6184f9e69117990f5483bf05045ee7e17834 e7ad705497f2f07a91974729ed986e906861ff81 8140bcb9ce68579eb83ac751070d7a08057b3e3c c463b5925b9f27d7f077bdff813cde19d3c2bf09 06e20fe2ee579bdd1e2fdef738485afd6d999418 91c259e944216ec83ddb541fbf53bbbd518d927f 8340d1cade0cc8ae45e8136add447649cd470607 8241dbbf5ff5cc381d7d6448f2c1348abec45203 594b9ab10319109e782cfc0eaabd038a8e744518 a7ade46fac338fd08ae322f9575ab95768fd4569 0146e3deeba63989108d1bcfcf0231c05d8d7a2e 07d371120735553c7295a9466ee6fe81ff46fe51 a7c05b98e519af4a86bd20beb6b964c94d48d0af 9e894b914ab144217181dbca27f955206b3c37b4 2205dd2085dada143b64785b1fd86b0d3a765bab 086cadf056dd73a5209df85f0ad2d3ccf7d14f7b ae73594385fb7e5195c9c9dffc8b9dd5545a05a0 277ab18f0ff09f3a1a0a8d68715f7eb22eaba249 f6e148ba5488138825b8e2a8ba88f4cf7a24deef 76743b6a629f09b4cc06e7f871561ee87e518ebb 7367aff187fdf6e6d4a70f492e0cd907d3a4ff33 19ba943536dcb28b3e815c87f8ad9d910948a975 1db42e3489d6db0749401769978b04c05cf0f137 a3c1099e318a4915204318e5de0a4276afe0ef02 a7a87a47a61b0d93591c94589d39fd079a206ff3 a4eb1a071e724dca21ad02c912754edfaee1ab00 611664ce7faa6e14fb6a167758a53c52dac1084b 344dc7036a6e2d0ec784d3f60132046d021a24a4 02bf376576b2f7ae650e4d2769cb3caf1764a49f 35b2549570666e6c1cf7c3dbbf70e482c41d714f e5fbe9e59d967812a34621a9b104968b0c353df4 2b8f1ed1d05393b612a433195f3752f874f8308e 647719776245276d1948c44b37003d0adc8c53ca 25c8f2a87b48b1e60700764054ce4aa3e5d14c25 271744f02f7b00fae63626940cb06e19c75d590e cc6ed725952f3d39f570868692e86c0941de1c52 a081512a675ac3fc30bb21862feb2ab6e8094b55 d46a5d5044f6025a5188c3e6bdbb9f77ed98b1b1 891ed91b426b1c415d613128bc3227a350fadfec dea127f7c5ac058465f1d0264b27659798780498 a5a7f6e00c529d1272b071ecbf6bbedbbbebf89a ed61db99d5a7862a643f684e67770921c03400e1 b719a8c73ba5daee78c4b5f7de7d7c3055547f12 b6f33ac83b8a1db1db0246e15b6c1ac564db5a5b c084dc77d693f6d3b3f72f8196cd3583d60545ca a09e7af08be0e060d48a863d81eef2fc24456369 fd15cd7451b4df224b3076462cd3532726ed5700 36b5a41a18b7cfdcacbcb0def8957dbbbf443df8 1b810d454152f6e07bd161e02b40473bc0bd2efa eb4a3a814b45d248bf3526fa2bf162c72a7d84be 65c26fe1a5ca80972835cd3546c2e794deae62cd ddbbf176a6f2a6b0e856e50cc969bf157f4b8706 3712dda5fa2838d14b942e2dd43babd8dbd8fb71 2bb88a6732a8257da53fb795e4d2a1dabd44948c 322e7ced7dded5a26b775ed4dd425009c9cacf1a fe863b60a63f8b844796455dede6206d057b3f7f e023d908e76518afe0a73a9284691fc51d362673 9c4856b53ea1a6137fda6bbe6ba3f29355412c94 d733e415454ab0737f61ab6545a97aaa34a10981 b7aa3fe75fba78e3ef7a83657b0deb6cf563751a d8226fae4f14c31362aaa403f4d6a8b84b89dfc5 e8a1cfa1e616e1af2a63ab32845ff719ed98c192 b28f88b4dbe3017d2194b3614321b0e85b1a817e a4e6762a5454c1623ab580b1cea66e98d47a1207 dea8eb3fca200ec89e5ade0833a5954abdb3a38d 84f62cdaa7d95f934e355abf48af32f8b5aa6a92 9763c01fd40bd56ebad6adf07a4e00f670508b3a 35376a957ac89be433fa6a5af47bbb3a803b8439 9fbb9ef79f32e2b7e71cab55991ac6838f3cc727 d7a088da4afedcf3a6b2bf7b6c0405dee40dc0b1 c2a87610d343c57b3685843b722ea6839c2482c2 6698ac8c767847f828b3027930b3840c6c298da9 67f27e3c2aa7dab996b38f0b020e9e3a1ddc1a7a 5aa3383d759f101865c58ae95a7d28cb4bd90912 ea7bb4593fa94b3731ffcc0471f23e79487d90be 587d61a2389f0229988dfa3ba6356d34777f7ad7 96067e7f71d24311460e6faa73f43af14e1bd09c b4ad2b6d784fb0455e0e3ffaf77ec6a5d3835be4 3c4a0493d869fb12d84fc84efbdf99d721e32795 7ebfd1a18b889c0ead28671811c3bc912accee7b d279daafeba573f7ecff882f696733eeef1081e2 ca359bb82bf59c190ba4ec30e4f79e61cedf6216 213d1d15b0fdd65965916bae093710822c2f7434 20dff502ccf9b1dfae7f8c0b118382fa7c3198ac 4e0405347af59ede2c53c4c1a527ac46595829c5 127a4491a7c2310495b68127e9c6570b66600820 494ad84de129e62b21bba071d8051a6238a51a5a f09c50833a58feb41e33cab11e41df1de8eeedcc 30a03fe42d2f7336b0ed8648a0db70b1462cb76b 017b17715d7c6a37e4839dbfd9f6498b3b17826c a4720889b0785c30cc5b9ae56f404a55170d682a 5c78a48362ff5a2e28124c9901ac7ef2497fd30a 39e371cf264039216d190a3b7973f6ea9d745775 6894cd074f39c624be1f0efc4a4b273c1a579bd6 50c637cb403c92e3f6784162069d2604f1225725 128d969bbb6da6a34e838e3d95d68ec5dd294867 2114cf6fb464efa725f7fa5b8cfc1caa80e28672 ca7d1683820bae83b8690f38e5aaf9e1d636abe2 3257813fc3444c2e606b7f9969bbf315dd63fa90 1597f152441f6b0a3ebdccfe0c8350e2242616d2 35a4b71263aeab8206ba33e23c77696cd36b4518 f6334b906ac6f4e068ca73b39fee2e7b25bf7981 8e91d3f29603675132f56aec4fe7ef6d6a63fca4 59df53686a09f36836696d627f26f684bc82afd0 b5fdd020ab89b9eef96fedd11924eab2f33fe1ac a10410318a1572e3db0cb85b8535493cfe023016 51124ed652ab51c6f9562e687b70c89ae504529d cf873592a2b70ec6033e1165fd67a321003464b9 d4315f51b5ddc3ec94a0183674dca9a400be10cc dc2f46596ab80be510e874b19702478a04f4e5c3 5b49e74cf77ce61c433a1144e214c3f88910962d 3ac5906a9f85304d580b71cd9327fd61edeffa44 81e74202fd189c83953fab52df68951d8169c459 bc472cf7d207b3f2c8b5ece2409185091c4fb98a 278be38283d7cfc425f8d2d3ff878d092d9abc20 8c59a07a0f16d2c73b18cf9c094a217ac7549b0f 717c55da1fa0210d630fd39d903cc9e8d1f819dd 724c8b2141b7be2ad5d8fe35f90db84e634f3caf e35c251905928e7cdecab7d5335420866e282099 e9f39bf25ab70cde0ee6dc97803566fa72ab88f8 07e733a23c110efd3f61d00d2bf9a932e5b17b3b f8c9efd365ea8e16a6bb7960dbf2e8923b6daf38 0630f187f5d846a3afaf517d2ffeeb90d48c5af4 46d00fc1685b39e7a46899416ff11f793e49c722 444b3637266774f24ea0757b29e9f4ba0de3057e fc726962d0b4f888edab8d6088529b3ae4784d28 98a01edc5b8d0f543df51f98b9eb55a755ebe364 05aa7ad756232555f12ef6bb8fa8356bffbd435f d6afccb033d4708a3dccde50bf12183072baf439 a26c492ac46ccaefe9dc5c7c9400aec8d796e261 ad068476ecd3b0483b1e15dcbf874286e02707b3 d3a1206d02257a61dc3afc496d6485c4fec7638a fe449f8645437f64f33b1f1ca8f0a099cdef3a0f fd07b0f9ca72b8a0b1ee2b6f919a27caf613fbfd 3a1a5eed724e229a45512ace76fc2c4cdb4aad2d 1e018eb2b2c3c53c9a51d8ec518d051113ec6529 564393b0a9363665c7362f0a5ac71316f4a9265e 17a78772871dc7e7e5c978f91f97a9b0660f40ac 80b40c9929082efca003180e089bbfe5f8082d2e 0944557d7186e1316b470f41e268b5c4a30ed206 944691065bdffa40bf18cfa3da7cbc2f5356ff08 f85307e1e85f3769ebaf8731b3fbc3400fc08108 af7354a57bb251dd4bcc0c07cb77993243be5e87 eff8227e4995441276416cca50fd14fef2ba428c ec673322ba6bad3b270b19d3ceb05305a6d6af45 dd59aec11fc5b728aff4998e12f53a1112cfbc31 252086811d30ceb5badcaaa69c4cb32e7303b7d2 0e00907a75b843cd935ef6a451b3c82af49e3008 2a4a79d2c884543a3ba2a73afa47eb9f0bd29698 9aa7bafb92bd0e1fa42ca81b34828291174cfa45 50a700806286465c356dc6a5aa9d77646be2371f 0d5c84f521e82a262bc5ad047798096be0ad8217 f9009d3620cb8bf7e644cb35868b26b1f9f72e93 22174bf7c7f885afaced65e3af0453917aecb803 b4492302cc57880ca4c32471fb531b1ca41eb2a1 bc9a39507de82e1190121b248e032384d998cac7 08aabd9ac83078444ac22dc9dc0936c8455ec6aa 045c55a19bf74a4c09cc350d912287505f49bcc6 57cd4adf110b641b0872349a1905853ce7c3be6f 73fd179fd5237c71f0d69ebcaaeefddcc7372034 02a1892f86b351e7d25c86de00f1976fe4c36726 b4520a04516e18d6484cbb97d494dc301ac4150a 5b1ec54158bc5fd716dee1175a5b7a69c4f67f97 2508fb878c117c6eaf1adb44f047463d8302bc27 1de3dbd76c42457a59daea2ef4f9bfee2677cf08 9fc5feaa0027b690edd68f9e184388d586ae3405 1fa4c67e95d7a6ac3c626c744e703bcc858968f8 138631842aeda8e493affbfb915acf75ea0d1b4b 300ae5f1277a0374ed60996a6cd166f8ce19cc19 4a9578fb889bd57ac08f383c501887c6f6cdaacb ca33f2402ae60e2ca34a082cb2ff57b251fae0b9 797e7fffb8ba0b568c2b32947bd27459e581b931 e7dd92f6b9fcb9cf6e8a7aababb4fd8d5286438f 0d86c365f6789a0ed89663c9b4ce2baafe631198 d13836d6d14856c6322e7a02688191f8e403a003 f76040312df1f9bffffee5da1f3760bbb078a9d5 4c292b1cf4f0d198c7a0c62feaec65a7209af089 5705d5b44a8475dc9e930e25c9131860282eacce 7900c7881264321732e18f13318af526f19a8302 652da028e5240027a861cd0089652c9a9dd47735 0799bdab13d97e3acac01947e581260d1ff96dcc 06e826c833a096daa1c4c209f09b8a1bb1bf0e88 3f87b9557090c2ad7bb155e5ac2a35d242831f9f 5c2d2fc46f2b4867843780a9925d90231b80ad2e 57b5897d995a27a65a80e0a63f0625f6a752c081 6dd50b9ba1a288cf2e7765e5dcc5bfd80ba8c92a 2a35d531b30f15cbf91bcdbb6eb715f1656e5a0a 69f3e10e839bbe57a61afabbe32f4c7e125e3874 http://ftp.uni-kl.de/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp5.gwdg.de/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-bayreuth.de/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://download.uni-hd.de/ftp/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp4.gwdg.de/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-erlangen.de/pub/mirrors/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.rz.uni-wuerzburg.de/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.halifax.rwth-aachen.de/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp3.gwdg.de/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.intergenia.de/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.tu-chemnitz.de/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-ulm.de/mirrors/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://vesta.informatik.rwth-aachen.de/ftp/pub/comp/Linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-kassel.de/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://widehat.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.hosteurope.de/mirror/ftp.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp-stud.fht-esslingen.de/pub/Mirrors/ftp.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uni-siegen.de/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://anorien.csc.warwick.ac.uk/mirrors/download.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.esat.net/mirrors/ftp.opensuse.org/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.switch.ch/ftp/mirror/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.gui.uva.es/sites/opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.ines.lug.ro/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://www.mirrorservice.org/sites/download.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.icm.edu.pl/pub/Linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.heanet.ie/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.kreksi.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.belnet.be/mirror/ftp.opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.fsn.hu/pub/linux/distributions/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.ynet.sk/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.ovh.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.lagis.at/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.klid.dk/ftp/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso ftp://ftp.pbone.net/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.se.eu.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.sh.cvut.cz/MIRRORS/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.inode.at/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://gd.tuwien.ac.at/opsys/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.mirrors.proxad.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.leaseweb.com/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp2.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.cc.uoc.gr/mirrors/linux/opensuse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.karneval.cz/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso ftp://ftp.man.szczecin.pl/pub/Linux/opensuse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.tugraz.at/mirror/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.mirror.garr.it/mirrors/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.linux.cz/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.uib.no/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.sunet.se/pub/Linux/distributions/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.gts.lug.ro/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://fr2.rpmfind.net/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.isr.ist.utl.pt/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.bifi.unizar.es/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.uninett.no/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.nl.eu.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp1.nluug.nl/os/Linux/distr/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.ntua.gr/pub/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.hro.nl/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.roedu.net/mirrors/opensuse.org/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.estpak.ee/pub/suse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.cs.utah.edu/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.kaist.ac.kr/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.its.dal.ca/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.kddilabs.jp/Linux/packages/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.jaist.ac.jp/pub/Linux/openSUSE/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://www.gtlib.gatech.edu/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.idrepo.or.id/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.novell.co.jp/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.riken.jp/Linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://www.muug.mb.ca/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.umoss.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.osuosl.org/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.isu.net.sa/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.fcaglp.unlp.edu.ar/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://opensuse.mirror.aussiehq.net.au/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://suse.mirrors.tds.net/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.anl.gov/pub/opensuse/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors1.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://fundawang.lcuc.org.cn/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.rackspace.com/openSUSE/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors2.kernel.org/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.xmission.com/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.utexas.edu/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://130.57.19.201/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.nyi.net/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.chg.ru/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://distro.ibiblio.org/pub/linux/distributions/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.ussg.iu.edu/linux/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirrors.rit.edu/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://ftp.nux.ipb.pt/pub/dists/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso http://mirror.internode.on.net/pub/opensuse/distribution/11.3/iso/openSUSE-11.3-NET-i586.iso libzypp-17.36.5/tests/media/data/other.xml.gz.meta4000066400000000000000000001233501476576476200220470ustar00rootroot00000000000000 MirrorBrain/2.19.0 http://download.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz.meta4 2020-04-17T10:35:59Z openSUSE http://download.opensuse.org 16108851 b0e3ea6121ce4a0a9efc732fa61498b4 9bf6ebc95bbf7776c8ee2a7d0a59ec94ab34953b 702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121 52c0a614 1d1b0484 a6eedb22 774ee5fd 48b1afe4 99676335 237f7e44 6716b34d 9de0b6b5 eeb79c2c 91a32ff3 cb7d3528 6821642b 4afbbfeb 4b3dd85a 06d847bf 0d4062b0 cf9421e9 ccc6bff3 d0469103 10f29244 078e5f5a fb01f0a1 a4cb6923 b08fc953 49caabcc 1793fa09 b36e811d b1a3bbe7 2956918c 53523172 254f3914 7f220a9c bd30c70f d8b1add2 d395e95e 3e979f77 930b076b 378c8b81 30ef4edf dab0d9fc 5e391464 6ac489c6 36fa94f0 f3063b42 9f566ad4 6c12a5aa 1a25ae6b 5918c9ba 259ac921 f4957810 e6d0f681 7bd396e9 ae538fc9 f89b0b44 03d057ee ab803b05 08b08ed8 c2917a7d 863d0b85 aa1f9d90 991afb80 4edf38ea b5e40f1a d4d4e483 f65e306b 7912c783 f6819c0c 04e266f2 187905a5 32711d10 86d5f0d4 850439c0 f804e0e4 ead17338 171a26ce 1140a195 40e5ab93 1c4141d1 65375cd7 85dbcc3b 4e3fe5e3 b39121ef ce4798ee 712af259 2ed654bb 749ed9d5 98e286c7 6cdc3999 1992b5b9 14a34c09 8f2bdad5 adde2ef2 fcda3990 af59b0b0 d6b197ea 48a7fc22 e6303467 da1fff7c ce22618c c3058796 15225499 9f1bf1f1 380172a2 a1b44a09 c9d9f6f1 a8c78564 9cbd2bc3 64d0dcec f465da8f 6a9d15f0 64fdc6da f3dc5c56 11c6fc79 08d33205 39f3b762 fbcabbba 4b549193 367aa49b 0066daf1 2c1762d9 2e8a4128 358b5696 101e02b4 01b563a3 af77bfc1 1baa1682 21170038 bf1938f8 fc833941 4f4af457 2e69237a 339aa64a 6fc4603a 2bd4258e 2d96b5ca 5f1f0d5a 6e96399d ac0c374c 3b1b78ef 13ea3a71 b7235e19 983b7750 6346a1cf 1c4674f2 29401c27 d20d75d9 58fe3a80 36046fa4 30f1bb0a 0d6bfb04 ba03494d ddab80c6 3ebe0e52 717f3b33 4c1d18b4 194996e3 c0a5b547 46701b77 1fee6657 5c0b188e 36b0b261 542d6ecb 8075ad43 fec52502 58b78958 3cb977f5 d723f5f1 acce65f2 b8971b43 284701af 7806f59f 5d316f76 0744df06 74a71b65 af52e37a 36182408 dfb2d5e7 eb1837ae 06ebb86a e29d708e f41ddba4 3ca24f76 3ec2d12c a05085e8 b3901429 5c7168b6 3b61dd7a 8ebabd02 27c0e98a 5ace82d6 321df0de 0b8f5b4c 4bae8466 68101f66 980da2ba 81d50c1a 4e84bd20 9b61208a 205a556b 057d34ba 31f20187 9e718b2a d0b8e062 0872e972 b49a2bde 760271ef 6f76f48a 1c611d36 064db936 e7329863 cbfee98e f3bcd1ec 926fbb8f 8c385a88 1b24f948 d7eb6751 f4d38846 a8599d87 78b0a47b 07ae8db1 f186b800 b46b9174 fae79ab0 737f9ce2 09cd0215 115a6c03 20a53586 d54c989a c80e7714 9fb08412 765695e9 f7071fd6 b0acf700 67ee5560 fe631438 fb4f23ae bb560d0b 60cc375c 5c02ef6d 58864bc2 232e0528 2851bfa6 24a78b42 54f4fba1 349ad053 b9f77f48f4a49f3438fc1bb6de90df39657597aa eb519d03cea235bd24f57941495cd917f84bd897 bbc848cfe07fc2588d94115dca1b6933b5b2c3e3 8cef145c2e633fe14f29be5692683e55aa70b543 c508c1c5dfb4684fb20ae91cfe6231fa0e6ba174 23ac327f06a38b40f10dc9b8c26f6563820fbaee ca25b93d0744a27f31b9c50e680fb37fda988f6a 027e02287e26a679610d4d26f27ae03d0d90480d 9c63ede3e63de810e41d88b99f4ff29d236d0765 f5f60eabcdea574a4b25ed7892e5ff893d28e3e6 cac3ce8115413ad842cde8a8a5b3c376533695d4 b7ad7d09e62a1a581e58b33467a3afe012c51163 898aa214396d911d01e84b06ea7606fb834f6f82 664f445146b0548ac6b62400681d0ae651be8d59 c39c214f2fb452b1be664839df1a371f863970cd 5cc9e11746124ebf0282c1ea1f18e72cfaf6b60d b3f7e9b52fe2a3630b9547e495e847ca530e283b 0ddaaa89b57a47a76cf8e870dd2adf3064c5b7d2 6863ae28830c18b39bbe40ccf663f36178dbaabe c111b32adb590650b10c6131016bd118669fad9c 8a2941fddacbf7b2a144eb246e761c7c48134fa9 d222fe76b95e9034275121b86a124977a8a2a0f4 7072c00f004d82533321d0c99a6106a089ee4acd 026ea21296d66729725274dde37fb07b25a6bc90 a799bb63224e7ae4e2ac48c83548c0e7f4339ed9 090f7ed2f2a21712f1297ffbffc7441de521c72c 28a25cbd545c6b8936a58dbfbc6f3df66b1ff1f2 0b2df923da1a425330738bb0690723db59574ed8 3787396a99a302e8020a4936484a0548244e4696 836809523b244b31a70ecc9b8cfbc92b6189703a 6d26a0b6abe7961b1013540194dfd1568246e39b eaa06966730e2960dff6b318739c47f53afb48fc 25840fe2bf327ce91d8920b595702de770efe901 0c5cd1b57bc8d833a0ec6cbcc2e983851672ff8a 4ab9385e1eea1f6dc45c4ea4cce55bc1689cb162 28f0d7c20caefbe1052db07410d6a22465a77768 0d52b5cc32cdc5ca3589210240b0e5b7173d71b4 b6412c472de727869867918d2186effc129334e0 c193530764f9fc5c2b008ecdc0ed454fd09a2016 325e3e4211f9815b4f647c3cef57bccaf3e4bcc1 e5583176f956725ac4f0d6618a22575dea4996a6 03dfdb60cb43e5a55d0c61678ca4698cffb403e4 226dc7d7c836d0397d0aa96b2d29706afb1100ae f1b6075e2f073a270dd22e23afe0f0a68f685cb9 56b9d3b2d8b4a574d17d5e063f2a59e3be39c10e 8ff09431921fa287749cde787c7fe730826593c8 e24b0cd9b8fe9485d269f46856fc7b67689b8e93 33dc95d1b5b070010f08aca43a4496409168fed2 6dce6f86912a57890b0c801a39c7bac95ecd4304 7d7cc195b098047e04c8e667a5cd91649e50fdee 3059a0a978572cda808d4ddc402df2b67458733d d9184e997d4737bf9966b56dbb20b9a5c74f6645 64addf29c0b35eac2ce21ae2fe6d8ce232af8ff9 2170eb72b643a229e1e33a28e1b7e554398b423d 4b7bacad11b4762e54cbd412d41ae043b7388706 4c5f8f1926419001ff88122a3d426dff0e2fcff5 ccd0dd77c83da20d7f4ddf13dab89d472f816398 5a66f1fdb6189de62f91e3c13b7859434eb2ae10 362f956e4061b1d4ae60654c3b59bc18a9aa8b5b 9712c3dfcea2ff067a4c510fae5dbcc90599ffe6 699440f8b691774ec9060caa988d008b79b0b272 b0638b719cdf6a634516b2cb7ec85e41b866bdbd 49afa1c7fdae319b4325edba0e19814459bd3d9a aecf9ee3948c3530122e8839ffb450ebceb4df5b d9709a7431c3c9c4ec42e76efbbbf7e7a2eb964a a254ba5f983e12bffba48af2cae35783fbe3da6d 7a6ff90e51fce74e528ce3968507ebc6000614b5 44aea5f544bd0ea25774f392eab846f873e5fff8 75d7c5d1e09d73c368248835da602ed9bb785490 eb8b75f5ad07a6459ad05a9d88e22f529a21944d 993b71f98128b7f2c929d56b430f5e514b7c457a 72b582d7cb77f901f86e405c84b3e8eecb2bc22b 49bff42f3e2eefa5c53c03b698488c903f76fe55 248bc7caba7b75ca7edee72e1645e6ee0207b8e2 156215ff516ef914f28268b31dd27a360b4797e1 fe0c489135d495aea711c01d37d31f40d638cea2 5697a51c38f075aebea5e0593d48e899e79f5054 a146d446f52c08a4aa2515a76ac39003f62b588e 619386f78b66eac122d61c8028a992ca3cdf6eb3 ec216f4ef6a5983c448d1b63de347a0753b053ed 83e08e5f9d347d75337d77c01b38cbf8326e3982 5c60ba2c86df1b65e41eeff93481b99ee90e7a21 bed0f7975dbe0abb3e09d76ca239d5a8e8231974 a245c5324a6ca6626e0903d892712d8cd93cca84 cdbbc69c35540f4527ab858cb547ea599b5dabc4 e8bc63208646ff1db2c653a931eca96d3790e56f 75ce34d9dd80a13d00cc73f30c63dbc242ffe187 03a1c7dbd3cd99536600bf19b5275c4c58b82e58 f0d0d1fc1155a1dcfb804c952166ebdadb30a926 31e699f38b24cd4fdd89440904887c0c6490b2b1 387c9fde6f3d817da8bfbe791967ac7bed10b0bb bd18d25208a69f60bc9ed47703b0598d05e88a65 88ec754b99b1d1a301665b52d0f5078a8313ced4 5c8d406fa3325410513c3f82abb839e68bd8cc5d 8fb9bbf106b201846af4827ea8f18151d1e54f1a 4d4a23f492a786868b2a8326108578eb222915c7 4c9a257ffd6aaecc8649f9fcd7658dc12886cc45 2999f114c2afc1d381b61f393ae9041042ea4c1b c9f20744675482835bb4e307df78a0eb33ee9597 8f5c1d36a94e28b979232e75f5a09895670d43ba b80f0f22d35d561a6f19ad414583692ad1a6baf7 d2e607369e972154e5cfb644b6b9065fe0ec8cc7 f8dfc2d1cb12c28fc393aa01db2fa4b6a473fffb 0695ec9bea77cdf4cfbbd40024bb23f415a96846 4e92c4015ac67f2ece37f29f31fc14ba4b5138fd 629dc485fee76e0f18dcfad4b1cae81e9d890cc8 fc14106f32b3ffef1bc04efc9cfd517004a0bccc 25c13c97f2a16b1fc222ad65a87adf1da03d3f13 f512eab85491096e799a78a22dbf18cd52314f05 12b559864bb0932a3773077a5dab5753479ca4a1 7e44c02f91d0e6fe04687e709db3787b370c910a 9f6f67023a05fd7bfa00bb39faf367ef00303aae 39c467877e9d220a52d570f303e76344b3a2608d 174a697aecf5d38b0f114b9bfa372a8f18c42c81 9f879aecaf6569cb3cfd164bc44c725ec0c3c100 a0f37fcf36cc62ec7028b0136a601a9743a11bb6 28d780cb009c6ec45f3d96f061d342cfcc39a116 f91a54e70e648566847152dc6da160a43c354462 8f1356a866020fa3403d001b1b9d8704c9ec014d 72d1935f0dbd5bbb4261d642b5a84c56fde79461 0019d698709935d84730ead1e75a88ce34d56047 8136920b4ec15543f69841411497930b9a0756ea 8d8d23fdf4a45991475bea88f8f4ae41313204d8 270ee2b97fdf893361fb0d1e6cd2b3dcc2a56cca a46ed235e4e2350ce55d929437bef2696c73e58f ffde235c872520ff2a4fb1686612422157b3da4e 70156892aaa72c869cb4de9f178211acd91386db 577030eac9eeb0149484d59e4675a0675ec29aba 51b73a522f31981f46fd9c93088dc649c9e18ded eb1d66156a4de48f02550198d258c21987272094 8bf73b8e4ed442733be764995b19854dad16ad74 df2aac249fe67e78ed7efc88cf8373ca9664d25f 2087445ccafa2f380f8fd3083dd371be0c791011 dd95e88e8eec80074466a5629cc2bf27c0caa405 df0ae393f8c15b6c79764e0c20c23a63816b265f 6a3d41b1d89219b8e55f92d0c9e6d7c490ed3a9d b77f200b3feeac052155676bebd7d79ff7c521b4 40a85837934de7349e4b7d499e45c8f0c89f0380 86f4ec3d1997356df228c2f8e12f7ec34376dad9 18b1eafaa4cbcc5246341f02120ef5a751b2a07a 4bce3c8d51fd178c83b92856d5a6d91a73b8c270 77e395ea41c389823415d295d43654c1ea0a13f8 0e5bc24274fcc33dc0bad9e793843ff004d14e6b 1f8e4e250a637126869934b3be7ea2dd4def9697 6c9e951e83951c7189f9a7cae64114f2d068b149 ee358a80270841ec34573070bc44a9a973e975f7 52bd4e79805c4b82c582a0e54a16eb64a41e0265 beeab96f0955f21d919047b1548cc63dda681e99 1a1dcc661db31042e679d8aba08050fe4ac46eb4 50bc05e6b0117a66737fe0ed916f7f399fe99e08 e3324f3cda3c99be671c6fb194b6333f6dc9ebcd f8a657caa0609cb1735b2f89df79a58085692fbe 68e81283af7bfa5be9f34c2a20c7e1c176447f47 c9b06b781e3c1206f98efd4e129d500e84140aac 5ea9392a721308c336c4947f650ae1d67e0219b2 ea395621e73a3cdf0c810c9b66fa14db08fb318b 80c5e69781257a49808d7dd41e8607ae85354230 798c5481862e497135160472d11d9588a2d67a14 1bcae9f627068040e89bddc27797dd9d9c8db03e 2b47afadd5782554928703669796bd39239271b2 782bcea66a64ace7c2a5a0cef1f9607bd8d27520 5cf8116d576d670d6be3a116383cdf7f0d9c8484 c721d424f73d1dcb1ec1964a7b8274d01932eb6a 93240a9223131a0179d979f2dce69a3eddffbc02 349abb4775ac5696ccee9c69ebcc609701bd58aa 5add463a4edb0ae91f7ccea535dfb7746d7d6dd9 b1515c806cf9b3e5d6e4583983469830c4a280d5 b3673a2dfae021812831b56f0f5b728e9ed18f16 d8334d5c17258b6ae3b81e465174543d624f3d60 9ed0e5219d14aac67748cd5224f6348db4975cfa 4ae31784ea2ed429d97badf0fcf4c0476629837a 5fbec5ca9e444ac869e307ad9c202266174aec52 9c76b3f2f5fe557e89935e83239c6f077b5a15c0 89416abb164886ab6d62a5069f6372dbb1d5aed6 4ab5bfc5a77c9bd9a02f4387a2a156ad435ca734 5e4f901d92f1a028a8600ae6d1733d1a1447c30f 002ca76cf81c26feb9e45a0f839c89ba6cbb61ab 3e200848aaaa4f6c4f47724e81b7ca756c41e843 e7fe994aa2131b3daff2f55c5b3e655089ff91df 27147f6cb293f64e7c92dd8ae456ebef7936b40b 21622d7ef1ca2927d6228f6d22e9a9ad840decf5 189e3e39639d1b21268c6f92bfb4c76a6d9d1675 94f8084e4d6439d5381fb008061c68831d54eca8 468346108131da81828a06effb7105fa9908570f 6a2c40a1161acb3e3192ba56f114a287d1bd8075 8364b1e1722b18c25e013290ac83f2e9826cd0b0 085a690dc2f967ebef514b0eedbb65b5acabc6ec 23c83426d57e5026a649aa567f33424c10ed26a0 8e64b4ff663e3f70ea8f78df0fa1f4c8a8fd6964 71a4e3c72ee14ebc3790feee49c1f9171b2c3b0b 07505ef63db167bb46b17ca93f00f358bc0bca70 18376e3f57aaef28a167d53da5641aa6c52aba51 25f657d2985d243f908db3e10610ebc925a871da bd1d54dbad5b26d69f0b563f1871790814aae02c d441456e1f7c43e7aef24a7eaa4a761640e0868e 9f8e36d32e573dbd34eaaabd5f55c50a81a597cf 3f79e9a63d018fda063efe1367a1933bfb95cff6 a3eb8c31e8fef133e1041ddbb645cb18f112c8bf 00eac6ff6914ae5fefc5d38f62dfb2f702d3438f 7837845b7cdd1374ad35543094c637b8a61a508d 9ecb417b572d73a8698e009cbace10d0f49bc1f4 58efd0711cdcb0d59bf63ac2cecd8b45b4699f14 f83e6c8ae5f654a7f62974f8cc48f7874e87608f fef21cedd6aeecac6c65dcffcb07726cd7491bfc 6131018fa558299e5df017d50d206e54d12fdac6 9ad2d8009f5958ee0714f7104cf73b06340c651e 99bd899a87a9ae07e50cf0a8eee6b209a5ebce49 c25f16d3deffb6e9d362f072791ddc994d0d1a70 06a3f40e2a1ed91d4d0b6bbd1aadbdbe8dda9b95 ebd13b83c8a14249ed95fcf6900e5c58de46b881 81e55b598eb22532f5b48898f59e1c0a4619c078 ef81c3884c81def482f667886494d6f93ce52c1e 555a16832d6b8acb9c8184a5eff52ba082e62000 4ac5ad095910ef4148dc526a147edaf38fc894e5 78cf92a1f62daf43273e0e5189e4969b3f40c284 a3b9ee6f0d9e00c5f2b0155f18288ec5656707b8 f7e7ae7cc6d63c8947aa87a9dc37642c13292401 7d6d48f8721f4b3c9b9dedc95ad55b1c6573d71c db8bfaa26b11df13d8896e14731861fccdc477b1 848ed4b02af9b094459def417cc7c11736975d85 02d15cb753a295103146621251e51d61dff48351 55fd50c584c10365cacaffe437e60b01883687e6 52e09e6ea21b615131a55ccc3c3889693d357555 51f4a27756d001bc2861e09fa66e1c61e733c96a d74b8360e3e79fdae041f352dc43b5c47fbe9d6c b1c9de6514a7b4674aa1d902e4ffcfb5cb3dd653 76e85afeca22666bd9fe882baf184ab16bbd42d2 654e52677ceb84aea219d4d4fea61e79db34a631 7fa1c90807ca53c64553ae9538dc9b3a545538ea 2158c837a32a3e6deac4458985898be39696cea8 d6499e8d4d0e6dab8a9acee357312be7fd93c195 e92698d28f58b976527799619f68c98fd6b1f365 5c706b017ed4d74765d3c7015ab76370f961acf9 f143b67707f982a488d864a2d1e148f07eef1dd0 709a783cb5ba13dcc0b309cb12b8a5fc9582d1b7 452244a5246739fa8ba424b1b754da9fe5e8f6a4 b1b3bc21c6054382d40b6309de3f307e03ab8814 863a5fcb1f90350550bb366eb2b5d9af4f952beb fd1100fc41b85a27dd5144a64e9552a09cea327c 31c2f06b23a797c8252b0efc6cb55e86531582f5 91ba8885fd33e935ea57f4936f41cad8afee735c 9320db884775a370709c7fc6dcb37eca77c46dd4 e219dc3a4cd44d2785fa6f4c7f930f2eadfb37ff 2a2ac760f2944c4e1b6ac7d3001ecc09ad49b1bc 693d0e7a7af313dd849c48222276e25d635512bc 23788c5daf28813cdc6a14f1f02add712c020fd9 http://ftp.uni-erlangen.de/pub/mirrors/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://widehat.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.uni-bayreuth.de/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.rz.uni-wuerzburg.de/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.tu-chemnitz.de/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz https://ftp.gwdg.de/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.schlundtech.de/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.de.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.braun-software-solutions.de/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror1.hs-esslingen.de/pub/Mirrors/ftp.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://suse.uni-leipzig.de/pub/ftp.opensuse.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.mirror.iphh.net/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.uni-kl.de/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.tu-ilmenau.de/mirror/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.halifax.rwth-aachen.de/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.sh.cvut.cz/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.nic.cz/opensuse/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.hostsuisse.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://pkg.adfinis-sygroup.ch/opensuse/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.xgroup.si/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.linux.cz/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.karneval.cz/pub/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.easyname.at/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.dotsrc.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.klid.dk/ftp/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.man.poznan.pl/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp1.nluug.nl/os/Linux/distr/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp2.nluug.nl/os/Linux/distr/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.nl.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.mirror.liteserver.nl/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.belnet.be/mirror/ftp.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.mirror.garr.it/mirrors/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.pbone.net/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://quantum-mirror.hu/mirrors/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.fsn.hu/pub/linux/distributions/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://fr2.rpmfind.net/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://tux.rainside.sk/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.mirrors.proxad.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.lysator.liu.se/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.icm.edu.pl/pub/Linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.vectranet.pl/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.acc.umu.se/mirror/opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.hro.nl/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.coreix.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.ox.ac.uk/sites/ftp.opensuse.org/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.novell.hu/pub/mirrors/ftp.opensuse.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.koyanet.lv/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.rackspace.co.uk/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.ipacct.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.netix.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://www.mirrorservice.org/sites/download.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.nxthost.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.acc.umu.se/mirror/opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.funet.fi/pub/mirrors/ftp.opensuse.com/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.rnl.tecnico.ulisboa.pt/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.library.ucy.ac.cy/linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.yandex.ru/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ams.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.ucom.am/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://repo.iut.ac.ir/repo/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.dc.uz/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.squ.edu.om/opensuse/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.mirror.liquidtelecom.com/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.its.dal.ca/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.siena.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://nrt.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://sjc.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ewr.edge.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.clarkson.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.math.princeton.edu/pub/opensuse-full/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.c3sl.ufpr.br/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.us.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.vtti.vt.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.csclub.uwaterloo.ca/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.rit.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.lzu.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://plug-mirror.rcac.purdue.edu/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.ucr.ac.cr/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.cedia.org.ec/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.bjtu.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.tuna.tsinghua.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.rackspace.hk/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirrors.ustc.edu.cn/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://espejito.fder.edu.uy/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://www.muug.mb.ca/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.dal10.us.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.datto.com/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.rackspace.com/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.yzu.edu.tw/Linux/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.kaist.ac.kr/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz https://provo-mirror.opensuse.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.cs.utah.edu/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.jaist.ac.jp/pub/Linux/openSUSE/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.kddilabs.jp/Linux/packages/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://ftp.riken.jp/Linux/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.sjc02.svwh.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.sfo12.us.leaseweb.net/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse-mirror-gce-ap.susecloud.net/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse-mirror-gce-us.opensu.se/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://sfo-korg-mirror.kernel.org/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://suse.mobile-central.org/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://opensuse.mirrors.theom.nz/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz http://mirror.internode.on.net/pub/opensuse/update/leap/15.0/oss/repodata/702d2a63e32b11a60ef853247f7901a71d0ec12731003a433dc17d200021a121-other.xml.gz libzypp-17.36.5/tests/media/file_exists_test.cc000066400000000000000000000063261476576476200215320ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include "mymediaverifier.h" using namespace zypp; using namespace zypp::media; using boost::unit_test::test_suite; using boost::unit_test::test_case; BOOST_AUTO_TEST_CASE(curl_params_reset) { MediaManager mm; media::MediaId id; Url url("http://ftp.kernel.org/pub/"); id = mm.open( url, ""); mm.attach(id); Pathname dest; Pathname src("/README"); mm.doesFileExist(id, src); mm.provideFile(id, src); dest = mm.localPath(id, src); BOOST_REQUIRE( PathInfo(dest).size() != 0 ); mm.provideFile(id, src); dest = mm.localPath(id, src); BOOST_REQUIRE( PathInfo(dest).size() != 0 ); mm.doesFileExist(id, src); BOOST_REQUIRE( PathInfo(dest).size() != 0 ); mm.release(id); } BOOST_AUTO_TEST_CASE(http_test) { //MediaVerifierRef verifier( new MyMediaVerifier() ); MediaManager mm; media::MediaId id; Url url("http://ftp.kernel.org/pub/"); // iso_url = "iso:/"; // iso_url.setQueryParam("iso", "SUSE-10.1-Beta5/SUSE-Linux-10.1-beta5-i386-CD1.iso"); // iso_url.setQueryParam("url", src_url.asString()); id = mm.open( url, ""); //mm.addVerifier( id, verifier); mm.attach(id); BOOST_REQUIRE( mm.doesFileExist(id, Pathname("/README")) ); BOOST_REQUIRE( ! mm.doesFileExist(id, Pathname("/fakefile")) ); mm.release(id); } BOOST_AUTO_TEST_CASE(ftp_test) { //MediaVerifierRef verifier( new MyMediaVerifier() ); MediaManager mm; media::MediaId id; Url url("ftp://ftp.kernel.org/pub/"); // iso_url = "iso:/"; // iso_url.setQueryParam("iso", "SUSE-10.1-Beta5/SUSE-Linux-10.1-beta5-i386-CD1.iso"); // iso_url.setQueryParam("url", src_url.asString()); id = mm.open( url, ""); //mm.addVerifier( id, verifier); mm.attach(id); BOOST_REQUIRE( mm.doesFileExist(id, Pathname("/README")) ); BOOST_REQUIRE( ! mm.doesFileExist(id, Pathname("/fakefile")) ); mm.release(id); } BOOST_AUTO_TEST_CASE(isotest) { if ( geteuid() != 0 ) { BOOST_WARN( "ISO test requires root permissions! (mount)"); return; } MediaManager mm; media::MediaId id; //Url url("nfs://dist.suse.de/dist/install/openSUSE-10.2-GM/"); Url url("dir:/mounts/dist/install/openSUSE-10.2-GM/"); Url iso_url("iso:/"); iso_url.setQueryParam("iso", "openSUSE-10.2-RC5-PromoDVD-i386.iso"); iso_url.setQueryParam("url", url.asString()); id = mm.open( iso_url, ""); mm.attach(id); BOOST_REQUIRE( mm.doesFileExist(id, Pathname("/README")) ); BOOST_REQUIRE( ! mm.doesFileExist(id, Pathname("/fakefile")) ); mm.release(id); } BOOST_AUTO_TEST_CASE(nfs_tst) { if ( geteuid() != 0 ) { BOOST_WARN( "NFS test requires root permissions! (mount)"); return; } MediaManager mm; media::MediaId id; Url url("nfs://dist.suse.de/dist/install"); id = mm.open( url, ""); mm.attach(id); BOOST_REQUIRE( mm.doesFileExist(id, Pathname("/SLP/openSUSE-10.2-RM/i386/DVD1/README")) ); BOOST_REQUIRE( ! mm.doesFileExist(id, Pathname("/fakefile")) ); mm.release(id); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/media/media1_test.cc000066400000000000000000000017261476576476200203530ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "mymediaverifier.h" using namespace zypp; using namespace zypp::media; using boost::unit_test::test_suite; using boost::unit_test::test_case; BOOST_AUTO_TEST_CASE(verifier_test) { MediaVerifierRef verifier( new MyMediaVerifier(/* "SUSE-Linux-CORE-i386 9" */) ); MediaManager mm; media::MediaId id; //id = mm.open(zypp::Url("cd:/"), ""); id = mm.open(zypp::Url("ftp://machcd2/CDs/SLES-10-ISSLE-Beta1a-ppc/CD1"), ""); mm.addVerifier( id, verifier); mm.attach(id); mm.provideFile(id, Pathname("/suse/setup/descr/EXTRA_PROV")); mm.release(id); mm.attach(id); mm.provideFile(id, Pathname("/suse/setup/descr/EXTRA_PROV")); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/media/media2_test.cc000066400000000000000000000061341476576476200203520ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "mymediaverifier.h" #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; using namespace zypp::media; bool do_step = false; int do_quit = 0; void quit(int) { do_quit = 1; } void goon(int) { } #define ONE_STEP(MSG) \ do { \ DBG << "======================================" << std::endl; \ DBG << "==>> " << MSG << std::endl; \ DBG << "======================================" << std::endl; \ if( do_step) { pause(); if( do_quit) exit(0); } \ } while(0); BOOST_AUTO_TEST_CASE(strange_test) { { struct sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = goon; sigaction(SIGINT, &sa, NULL); sa.sa_handler = quit; sigaction(SIGTERM, &sa, NULL); //if( argc > 1 && std::string(argv[1]) == "-i") // do_step = true; } MediaVerifierRef verifier( new MyMediaVerifier(/* "SUSE-Linux-CORE-i386 9" */) ); MediaManager mm; media::MediaId one; media::MediaId two; zypp::Url url; url = "cd:/"; try { ONE_STEP("ONE: open " + url.asString()); one = mm.open(url); ONE_STEP("TWO: open " + url.asString()); two = mm.open(url); ONE_STEP("ONE: add verifier") mm.addVerifier( one, verifier); ONE_STEP("TWO: add verifier") mm.addVerifier( two, verifier); ONE_STEP("ONE: attach") mm.attach(one); ONE_STEP("ONE: provideFile(/INDEX.gz)") mm.provideFile(one, Pathname("/INDEX.gz")); ONE_STEP("TWO: attach") mm.attach(two); ONE_STEP("ONE: provideFile(/content)") mm.provideFile(one, Pathname("/content")); ONE_STEP("TWO: provideFile(/INDEX.gz)") mm.provideFile(two, Pathname("/INDEX.gz")); try { ONE_STEP("ONE: release()") mm.release(one); //! \todo add the device argument once mm.getDevices() is ready } catch(const MediaException &e) { ZYPP_CAUGHT(e); ERR << "ONE: HUH? Eject hasn't worked?!" << std::endl; } try { ONE_STEP("ONE: provideFile(/content)") mm.provideFile(one, Pathname("/content")); } catch(const MediaException &e) { ZYPP_CAUGHT(e); DBG << "ONE: OK, EXPECTED IT (released)" << std::endl; } try { ONE_STEP("TWO: provideFile(/ls-lR.gz)") mm.provideFile(two, Pathname("/ls-lR.gz")); } catch(const MediaException &e) { ZYPP_CAUGHT(e); DBG << "TWO: OK, EXPECTED IT (released)" << std::endl; } ONE_STEP("TWO: (RE)ATTACH IT") mm.attach(two); ONE_STEP("TWO: provideFile(/INDEX.gz)") mm.provideFile(two, Pathname("/INDEX.gz")); ONE_STEP("CLEANUP") } catch(const MediaException &e) { ZYPP_CAUGHT(e); } catch( ... ) { // hmm... ERR << "Catched *unknown* exception" << std::endl; } } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/media/media3_test.cc000066400000000000000000000065771476576476200203660ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "mymediaverifier.h" #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; using namespace zypp::media; bool do_step = false; int do_quit = 0; void quit(int) { do_quit = 1; } void goon(int) { } #define ONE_STEP(MSG) \ do { \ DBG << "======================================" << std::endl; \ DBG << "==>> " << MSG << std::endl; \ DBG << "======================================" << std::endl; \ if( do_step) { pause(); if( do_quit) exit(0); } \ } while(0); BOOST_AUTO_TEST_CASE(strange_test) { bool eject_src = false; bool close_src = false; { struct sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = goon; sigaction(SIGINT, &sa, NULL); sa.sa_handler = quit; sigaction(SIGTERM, &sa, NULL); // std::cerr << "ARGS=" << argc << std::endl; // for(int i=1; i < argc; i++) // { // if( std::string(argv[i]) == "-i") // do_step = true; // else // if( std::string(argv[i]) == "-e") // eject_src = true; // else // if( std::string(argv[i]) == "-c") // close_src = true; // } } MediaVerifierRef verifier( new MyMediaVerifier(/* "SUSE-Linux-CORE-i386 9" */) ); MediaManager mm; media::MediaId src = 0; media::MediaId iso; zypp::Url src_url; zypp::Url iso_url; src_url = "nfs://dist.suse.de/dist/install"; iso_url = "iso:/"; iso_url.setQueryParam("iso", "SUSE-10.1-Beta5/SUSE-Linux-10.1-beta5-i386-CD1.iso"); iso_url.setQueryParam("url", src_url.asString()); /* iso_url = "iso:/"; iso_url.setQueryParam("iso", "/space/tmp/iso/SUSE-Linux-10.1-beta7-i386-CD1.iso"); */ try { if( eject_src || close_src) { ONE_STEP("SRC: open " + src_url.asString()); src = mm.open(src_url); ONE_STEP("SRC: attach") mm.attach(src); } ONE_STEP("ISO: open " + iso_url.asString()); iso = mm.open(iso_url); ONE_STEP("ISO: add verifier") mm.addVerifier(iso, verifier); ONE_STEP("ISO: attach") mm.attach(iso); ONE_STEP("provideFile(/INDEX.gz)") mm.provideFile(iso, Pathname("/INDEX.gz")); if( eject_src) { try { ONE_STEP("SRC: release(ejectDev=\"/dev/device\")") mm.release(src);//! \todo add the device argument once mm.getDevices() is ready } catch(const MediaException &e) { ZYPP_CAUGHT(e); ERR << "ONE: HUH? Eject hasn't worked?!" << std::endl; } } else if( close_src) { try { ONE_STEP("SRC: close()") mm.close(src); } catch(const MediaException &e) { ZYPP_CAUGHT(e); ERR << "SRC: HUH? Close hasn't worked?!" << std::endl; } } ONE_STEP("ISO: RELEASE") mm.release(iso); ONE_STEP("CLEANUP") } catch(const MediaException &e) { ERR << "Catched media exception..." << std::endl; ZYPP_CAUGHT(e); } catch( ... ) { // hmm... ERR << "Catched *unknown* exception" << std::endl; } } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/media/media4_test.cc000066400000000000000000000041621476576476200203530ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; using namespace zypp::media; bool do_step = false; int do_quit = 0; void quit(int) { do_quit = 1; } void goon(int) { } #define ONE_STEP(MSG) \ do { \ DBG << "======================================" << std::endl; \ DBG << "==>> " << MSG << std::endl; \ DBG << "======================================" << std::endl; \ if( do_step) { pause(); if( do_quit) exit(0); } \ } while(0); BOOST_AUTO_TEST_CASE(strange_test) { { struct sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = goon; sigaction(SIGINT, &sa, NULL); sa.sa_handler = quit; sigaction(SIGTERM, &sa, NULL); // if( argc > 1 && std::string(argv[1]) == "-i") // do_step = true; } MediaManager mm; media::MediaId id; zypp::Url url; Pathname dir("./suse/setup/descr"); url = "cd:/"; try { ONE_STEP("open " + url.asString()); id = mm.open(url); ONE_STEP("attach") mm.attach(id); ONE_STEP("provideDirTree(" + dir.asString() + ")"); mm.provideDirTree(id, Pathname(dir)); ONE_STEP("Create a temporary dir"); zypp::filesystem::TmpDir temp; ONE_STEP("Create a copy of " + dir.asString()); zypp::filesystem::copy_dir(mm.localPath(id, dir), temp.path()); std::string cmd("/bin/ls -lR "); cmd += temp.path().asString(); ONE_STEP("Check the directory copy") system( cmd.c_str()); ONE_STEP("CLEANUP") } catch(const MediaException &e) { ZYPP_CAUGHT(e); } catch( ... ) { // hmm... ERR << "Catched *unknown* exception" << std::endl; } } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/media/metalink/000077500000000000000000000000001476576476200174435ustar00rootroot00000000000000libzypp-17.36.5/tests/media/metalink/metalink.dockerfile000066400000000000000000000027441476576476200233070ustar00rootroot00000000000000FROM opensuse/leap:15.4 ENV container docker ENV LANG en_US.UTF-8 RUN zypper ar -f http://download.opensuse.org/repositories/openSUSE:infrastructure:MirrorCache/15.4 mc RUN zypper --gpg-auto-import-keys ref # install MirrorCache here to fetch all dependencies RUN zypper -vvv -n install MirrorCache \ vim postgresql postgresql-server curl sudo git-core wget tar m4 make \ perl-Digest-MD4 tidy perl-DateTime-HiRes \ perl-Inline-C gcc # dependencies for hashes calculation WORKDIR /opt/project ENV TZ UTC # let pg initialize data dir in cache to save some time on every run RUN sudo -u postgres /usr/share/postgresql/postgresql-script start && \ sudo -u postgres createuser mirrorcache && \ sudo -u postgres createdb mirrorcache && \ sudo -u postgres /usr/share/postgresql/postgresql-script stop COPY testfile /opt/project/testfile ENV MIRRORCACHE_ROOT=/opt/project \ MIRRORCACHE_PERMANENT_JOBS='' \ MIRRORCACHE_HASHES_QUEUE=default \ MIRRORCACHE_HASHES_COLLECT=1 RUN echo 100 # change this number to invalidate docker cache RUN sudo -u postgres /usr/share/postgresql/postgresql-script start && \ sudo -u mirrorcache -E /usr/share/mirrorcache/script/mirrorcache minion job -e folder_sync -a '["/"]' && \ sudo -u mirrorcache -E /usr/share/mirrorcache/script/mirrorcache backstage run --oneshot && \ ( sudo -u mirrorcache -E /usr/share/mirrorcache/script/mirrorcache daemon & ) && \ sleep 5 && \ curl -is 127.0.0.1:3000/download/testfile.meta4 libzypp-17.36.5/tests/media/mymediaverifier.h000066400000000000000000000027231476576476200211750ustar00rootroot00000000000000 #ifndef TEST_MYMEDIAVERIFIER #define TEST_MYMEDIAVERIFIER #include #include #include #include using namespace zypp; using namespace zypp::media; /* ** Very basic example verifier. ** ** This one does not know anything about the product, it ** just checks if /media.1 (limited to 1st CD) exists... */ class MyMediaVerifier: public MediaVerifierBase { private: // std::string _productname; public: MyMediaVerifier(/* std::string &productname */) : MediaVerifierBase() //, _productname(productname) {} virtual ~MyMediaVerifier() {} virtual bool isDesiredMedia(const MediaAccessRef &ref) { DBG << "isDesiredMedia(): for media nr 1 " << std::endl; if( !ref) DBG << "isDesiredMedia(): invalid media handle" << std::endl; std::list lst; Pathname dir("/media.1"); DBG << "isDesiredMedia(): checking " << dir.asString() << std::endl; // check the product e.g. via /media.1/products as well... try { if( ref) ref->dirInfo(lst, dir, false); } catch(const zypp::Exception &e) { ZYPP_CAUGHT(e); } DBG << "isDesiredMedia(): media " << (lst.empty() ? "does not contain" : "contains") << " the " << dir.asString() << " directory." << std::endl; return !lst.empty(); } }; #endif libzypp-17.36.5/tests/media/throw_if_not_exists_test.cc000066400000000000000000000014631476576476200233110ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include "mymediaverifier.h" using namespace zypp; using namespace zypp::media; using boost::unit_test::test_suite; using boost::unit_test::test_case; BOOST_AUTO_TEST_CASE(http_test) { //MediaVerifierRef verifier( new MyMediaVerifier() ); MediaManager mm; media::MediaId id; Url url("http://www.google.com"); id = mm.open( url, ""); //mm.addVerifier( id, verifier); mm.attach(id); BOOST_CHECK_THROW( mm.provideFile(id, Pathname("/file-not-exists")), Exception ); mm.release(id); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/parser/000077500000000000000000000000001476576476200160545ustar00rootroot00000000000000libzypp-17.36.5/tests/parser/CMakeLists.txt000066400000000000000000000002571476576476200206200ustar00rootroot00000000000000ADD_SUBDIRECTORY( yum ) ADD_SUBDIRECTORY( inifile ) ADD_TESTS( ProductFileReader ) ADD_TESTS( RepoFileReader ) ADD_TESTS( RepoindexFileReader ) ADD_TESTS( HistoryLogReader ) libzypp-17.36.5/tests/parser/HistoryLogReader_test.cc000066400000000000000000000033431476576476200226530ustar00rootroot00000000000000#include "TestSetup.h" #include #include using namespace zypp; BOOST_AUTO_TEST_CASE(basic) { std::vector history; parser::HistoryLogReader parser( TESTS_SRC_DIR "/parser/HistoryLogReader_test.dat", parser::HistoryLogReader::Options(), [&history]( HistoryLogData::Ptr ptr )->bool { history.push_back( ptr ); return true; } ); BOOST_CHECK_EQUAL( parser.ignoreInvalidItems(), false ); BOOST_CHECK_THROW( parser.readAll(), parser::ParseException ); parser.setIgnoreInvalidItems( true ); BOOST_CHECK_EQUAL( parser.ignoreInvalidItems(), true ); history.clear(); parser.readAll(); BOOST_CHECK_EQUAL( history.size(), 9 ); BOOST_CHECK( dynamic_pointer_cast ( history[0] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[1] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[2] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[3] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[4] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[5] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[6] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[7] ) ); BOOST_CHECK( dynamic_pointer_cast ( history[8] ) ); BOOST_CHECK_EQUAL( (*history[1])[HistoryLogDataInstall::USERDATA_INDEX], "trans|ID" ); // properly (un)escaped? HistoryLogDataInstall::Ptr p = dynamic_pointer_cast( history[1] ); BOOST_CHECK_EQUAL( p->userdata(), "trans|ID" ); // properly (un)escaped? } libzypp-17.36.5/tests/parser/HistoryLogReader_test.dat000066400000000000000000000017101476576476200230320ustar00rootroot000000000000002009-09-29 07:24:46|radd |InstallationImage|file:/usr/src/packages/BUILD/openSUSE-images-11.2/gnome_cd/home/rpmdir| 2009-09-29 07:25:29|install|update-test-security|0-2.35|noarch|root@opensuse|InstallationImage|d99de2872270cbd436b0c10af85c286a1365a348|trans\|ID 2011-07-18 18:08:09|install|kernel-source|2.6.37.6-0.5.1|noarch||repo-update|7823612d9ca3de086c2cd4dca936f6a3f3e9313d| # 2009-09-29 07:25:30 filesystem.rpm installed ok # Additional rpm output: # 2009-09-29 07:47:59|remove |PolicyKit-doc|0.9-15.20|x86_64|root@opensuse|trans\|ID 2009-09-29 07:47:32|rremove|InstallationImage| 2010-06-01 16:11:17|remove |xchat-python|2.8.6-43.13|x86_64|2848:y2base| 2010-06-01 16:11:17|bad |unknown action field discard\|one field discard|to fields but bad date 2015-08-11 18:42:49|command|root@fibonacci|'/Local/ma/zypp/BUILD/zypper/src/zypper' 'in' '-f' 'xteddy'| 2011-07-18 18:08:09|patch|patch-name|2.6.37.6-0.5.1|noarch|repo-update|moderate|security|needed|applied| libzypp-17.36.5/tests/parser/ProductFileReader_test.cc000066400000000000000000000036361476576476200227750ustar00rootroot00000000000000#include "TestSetup.h" #include //TestSetup test( TestSetup::initLater ); //struct TestInit { // TestInit() { // test = TestSetup( Arch_x86_64 ); // } // ~TestInit() { test.reset(); } //}; //BOOST_GLOBAL_FIXTURE( TestInit ); // Must be the first test! BOOST_AUTO_TEST_CASE(basic) { parser::ProductFileData data; BOOST_CHECK( data.empty() ); data = parser::ProductFileReader::scanFile( TESTS_SRC_DIR "/parser/ProductFileReader_test.dat" ); BOOST_REQUIRE( ! data.empty() ); BOOST_CHECK_EQUAL( data.vendor(), "Novell" ); BOOST_CHECK_EQUAL( data.name(), "SUSE_SLES" ); BOOST_CHECK_EQUAL( data.edition(), "11-0" ); BOOST_CHECK_EQUAL( data.arch(), Arch_i586 ); BOOST_CHECK_EQUAL( data.productline(), "" ); BOOST_CHECK_EQUAL( data.registerTarget(), "sle-11-i586" ); BOOST_CHECK_EQUAL( data.registerRelease(), "whatever" ); BOOST_CHECK_EQUAL( data.registerFlavor(), "module" ); BOOST_CHECK_EQUAL( data.updaterepokey(), "A43242DKD" ); BOOST_REQUIRE_EQUAL( data.upgrades().size(), 2 ); BOOST_CHECK_EQUAL( data.upgrades()[0].name(), "openSUSE_11.1" ); BOOST_CHECK_EQUAL( data.upgrades()[0].summary(), "openSUSE 11.1" ); BOOST_CHECK_EQUAL( data.upgrades()[0].repository(), "http://download.opensuse.org/distribution/openSUSE/11.1" ); BOOST_CHECK_EQUAL( data.upgrades()[0].product(), "used on entreprise products" ); BOOST_CHECK_EQUAL( data.upgrades()[0].notify(), true ); BOOST_CHECK_EQUAL( data.upgrades()[0].status(), "stable" ); BOOST_CHECK_EQUAL( data.upgrades()[1].name(), "openSUSE_Factory" ); BOOST_CHECK_EQUAL( data.upgrades()[1].summary(), "openSUSE Factory" ); BOOST_CHECK_EQUAL( data.upgrades()[1].repository(), "http://download.opensuse.org/distribution/openSUSE/Factory" ); BOOST_CHECK_EQUAL( data.upgrades()[1].product(), "" ); BOOST_CHECK_EQUAL( data.upgrades()[1].notify(), false ); BOOST_CHECK_EQUAL( data.upgrades()[1].status(), "unstable" ); } libzypp-17.36.5/tests/parser/ProductFileReader_test.dat000066400000000000000000000061641476576476200231570ustar00rootroot00000000000000 Novell SUSE_SLES 11 0 i586 A43242DKD

SUSE Linux Enterprise Server This is the Server product of the SUSE Linux Enterprise edition. It is an alternative product for the Windows Server and other UNIX Operating Systems, providing Server functionality and interoperability with UNIX servers. This is the replacement product intended to sunset SUSE Linux Enterprise Server10 which was introduced in May of 2006 The SUSE Linux Enterprise Server 11 addresses very large enterprises as well as large enterprises and in some ways also medium, small, government and educational needs for a secure, stable, reliable and high-performance operating system platform. It is the core and base offering to provide a general-purpose infrastructure solution. This offering is engineered, tested and proven to handle mission-critical workloads in the data center. Developed and backed by Novell, only SUSE Linux Enterprise Server offers an open, scalable, high-performance data center solution that comes with application security, virtualization and Integrated systems management across a range of hardware architectures. SUSE Linux Enterprise Server is deployable as a general-purpose server or can be tailored to run a variety of specialized workloads, and it offers seamless interoperability with your existing data center infrastructure. http://www.novell.com/linux/releasenotes/i586/SUSE-SLES/11/release-notes-sles.rpm openSUSE_11.1 openSUSE 11.1 http://download.opensuse.org/distribution/openSUSE/11.1 used on entreprise products true stable openSUSE_Factory openSUSE Factory http://download.opensuse.org/distribution/openSUSE/Factory no unstable sle-11-i586 whatever module SLES false en_US suse suse/setup/descr SUSE_SLE

h4$YGʜSly59=d!a^鑹$Fb :?qׯ+?Q~H-g>!2'g NQog:;<*֌+'ZD+/9;$ By`+yY#k;v^~;O?OyD>B? f'HV0(;׫*+RZ\c 1\Y۱¡+og6߀},~R ^A %^8ZONq`ЃP3 ƹ iS jp+4qWcVzhSiLiStA'+k:ku0鶕JƱLa$ШKSi|8]b&9LƷ ׮ZAC&1X" ͮ8]+; S~pՎjg45;~pAföz,"[C$h9eMF 휈fm}PNqP4}9X*[{= Y*rTXO/q f ܁q{ϼUMdh2<4SxW1N &0#0jᮝfcثfwUF ś7q,vLidxyW}7ow1([OHmZq\!Q)^^&`SgM=xS 9ڋ=b{fyo尅b 1#>J&s_`T5bstS +~sfW)0KV3b\d=!D`b?9o'U TX({,YQJ]ye_|WO>8ǜј t&3plg=k Nޡ@ 2ՖtнK~W}ddq:C,Di{!fd}F$h%sYK9 "X1m?2)n`HV =ؽ#0CBCGH4Yus4$s/J*;[ J\/z@Z}r \$Tk2K2q9ܝ2y5Lkl]^V}p>*>f;YEm Fche9itD"5hݵߥ,dMv񈘝Z@ O<4. 8D K2BR %UOZ}xW?3_k6libzypp-17.36.5/tests/data/11.0-update/repodata/primary.xml.gz000066400000000000000000026135331476576476200237700ustar00rootroot00000000000000HII[s8׿凩tMK"@L:IUқtdR \K|{@]-Pe:fmwpppp yfǨvg&_/yӣ-ѥ@|T>>+O MfrnLzs^ (Ua~Ý@f5P1)"(A"u|&\Kv&Ŕǧz 1etHٵ.J|ҫy|vZImxVсgclx"E8vqo$>y1βP`|Or|%))ANWsj$Np00kt!E~ ULY?-Da&`.~yyٝ ws2ڪ00aDB 3}ę.}-EwJ+Y* 1ǁ0 ;}_e:癙eF1ubQd{ iϳK=\NV5|饾߼[ 3n^Ymla4C^>Ty54 0`(;WŠSEY[ˑm Bw7-QXSvQccy Kߙm;w3џx&5zU[埗ٸS;;\G߹BնKv5A+/8g^мe 1̠{I( 44",ݴ}Dd0-s;4f1|b0g+*~XDq%]:H!}'Ap1<.u\Q~ɴֆDD!cPhEdIL֩HeȂO0-hJŹ_VzOvd Uy/7$ Kz7nL{jo{^dK Krz'M#E+ > ZEjvTqs c1ݿvUy3uf=o{hN磋pM~"JM+732Ֆ:3ĖzQ:g Po-,3K0l`{~$u&Ӟ-^:JˮY RSSH2M Ra(!QX%䘪V*^pr$9S/'21&ᄡ0ZB朕 T/ LI9«/zP&q ?B ]a6'q?j~ 0szJx<=]ߘ7j&I\ܟ`RUz{2cq%< [n9cPos50zme2{].ڛ_%Q-֊(ʭH0 ܶIײo>d<΀T2iq̡٠9o2m",|+Q8J%\ɖpX>41, KzہۊaHqnʐw2kIwδ7v\?3Y EZ^~eC u:}qKɼqK[M_|*Ty&Lbkl#CPZ&nM]y`fܞ>c?vIrp7vG.h 'ȴ{9e `d:u:w8lp#4HVlcIPf#iJe44,1h$Bʒ+]R[<&-.~5u>^ӍAs4{htS`۞ͨvsso'd zj x{@<V* `ZEX2v]XT7H5yLdXY0)ۀ[a` L*BBJ ڠɪ{<9J$G*x3Öjn4zt-tzw[0GQ ӱ}2Gd(dY06$a`qdxtߑPj$`!ffs0}XJ(]ޅ r 5Z3pl> &G3=ӹ 52R"N_UMzn(zsɗݰ\{mvzs}7Խj}6ު-w jm&;ίǥi 'UwUW0lꋎ)<j7 ~wSMzQB=wY~hdtƻ4qcB6yyK E~j 3i7S(A^NөfYejONmJˍ`ٓLi^`uηq BTzA*Af^gin ㆵjFdX2#9=arZZt?&h?[֠f0zpE1Tbx!0!(K}߰Tq\y9у=6SuOHoՂY{!/cӥ[K>mVOX=9C~W-|ՕXcNM]4m8/P9NݍK'XGȵzf|K">;%g Z&<6JBgP1[B]Q^.Y U/{]qR0TϯKum:ڛ^ZǧU_Gۘ^YZƒ(p'DD%V%Laf:R* !l͔V`z ^[t-{5B^ժ [jՄU~j[%hsqC3PL0ڐȄ F;KUdU1ELp-MWIvYVW`$lZiŧUU{; Ri$2 #%mLH2DkOmOǐt/Н T,_A;[1Ȧ$ @"l^{6=מ>q=מkgn~m[/b>rRR'eQHF k+D$qlkƨ].6f#.Xt@pwf J؎#t;UN^Y/^w}ൂ~wu̝݂(Ii{I;MfƇx\t86b$X0H$"bCpM%1\Z[&r:OS5<oÕ߂ Rk_wzRk(OBZj.D(x Cb5Mq֗sV~ e_ҴmR$u_`m \mɮNnc5( 2g,i 0MlP8M3@a,\;rRmhMk(~~>nZir嶨BʐFֈ3b 2JX( ]" a~Nn>AAFX.gWBU5!Wg<(uVr}esuwrZjɪ%  j g_ 3dW0v/KE5o&bf)cZFʸ& uh c&#b_/Y0vb~\tZ >Jo۷0c6l"$]H(L ot;Uާw\\3}Eo}^oa%sl=_Վ10*%VLI ¸cKT'\/GrhK^iOr/Q2'g~0L1K\:* zin-6 -b=dϴ*u*Y4WK³^g_b/9߲\i&xtSoב&[̵;8Z ;V5g1MB[ !VUg.Ģ*ut7edב0vxIxq> oyj|4oKDch|EG4л\jχzHf&&)plDԲ#8*fD^gM>̻fmŞ>.Q|>~+<}gښ㶑h Af_Q.$e<@mI.m 9r!.32Rw6 }ωYa쎓s)/[0x@'dog|~ +Rl`1v&'u[򗫤ejv؞p 45gxP-@~ |`ߍŽt^tM)I.Dٍ,1 g(`bbv3ë,fY-&l12E>XLC۵jchJw-`0] LzՍWv~X]Wvkfb4@<1hx >ξ` WdJ}IR"}}@1 }pL&y4N7Pj*MߪEO#1%qpvrP'5d%zٜ/,Frb@ shA0vĕ]xhAQE{v>MGTGVN#miVnS؄abGk_/oă Y~+]˧ڨe^E>JkmpY10u 22o8FӼlw{mȅW,m6*cg)Q,HSfP8Mx2AvڶwS't 1-'m(b=0>6`mӾ81*ܒb`<,d!2t~6ӝ=E{O#|)S0¡Y48ZgШZl6Y* FRgYlpYl96Nk!sXK,\mߘXƥΜZ8Xxq$l>+`Fgٸ?S ԫ"s^N34m ͠TՊ-<*BVNh m|6NkϽifZͼhy/-<좾kyǸӵ@+~8ĮVp ò=lƳ!h }ev=Ş͍,1g+8y9y߃&NwO҈ NPQX2DISDȬt[;ōL۞^9JmA)OU/p T19sx71;)GHSMc;㨆^$j1;W]=uf2L>7 O L{|g|v+>l>KPրq\8=9P.0C1j⴩dR_>X3'#Ny #4$qoΐNKf*ηi9FLmR^]Ys<8{^pŘt m5ܕ{Q0A qf E!4" eFVlcD$Q@OҩqpCt rr?gAlx1=`evd̔XV{gVbuO̖31Sv nQ?(Ro#;\I_DF&]99oGg*(B~FK) H0c,I\}K{cݒ8 f=eG_UŦc!PMni>S45MvMw 4y䨱"8ʦ!ʋEie&|iGI0i ,LLV:l#Hp GݝDa)_I^37Sn6H/}M;d]`%O̮iuk:ص Bficl7Mv^aV[t&6M7 lMM omlXoym8B׭ ,(^&M.u`tz7;~M##Zr׌غ_5ǝnz-VI&}-x ,M/x%}vd*)nFCP\yix۟OOωS:Y<|lah5P'SXN`*l\`(5 ~5 >Fڶg%#Ii$DK4$eTD *m J!.MG, |60ݝW$+IۡnIA0󯓵 8Y9Y1dmSA.dm0OG0SLiHȓ4DqGRY(ͪ 7u3޿e}_,nJsQ[Vq8ݷ^)U!\x6˦xYM |D|@]3Bh,kH-/D *[6Gȯ][;Pwƈ\ܖl= UgyYݗwRv.޶/ʮ1X*n18^\J`%iJKcPO]VsaZ>]!GA#1rOu2b+e%ҿ=^c}/>I\#1ְ!,ҁDdVOn$s{okIm0!a'>%"d(UDJX bw;0ŴB,;XLH% [R@:E)GIk(zc@c,4!,#,Q+yg2*P3nw&+c;kdTʥBHc\+` jĽ)2_TU|a](pfi婧O]қ|.K>O~q &KAM fyeEz׶ş7/j[**ʧ,~0/d.+;Sš~ i}E}(9$ bi%N{'<~a\m|Ri#"LY/vz i<j9⋹2:ϧ?ˋYP; uMK!->dJjkЪmvZ{o7eЬ|UMk_i5v-20k٬cLāXNda/ˆ0,bR? B?E>镯N8(!ݹ:1[igXpM;pX"g,NK=m`ɏ;U`坏>^A""L[V.~-;߻FnbM CHNL-L$IɔeïY,6 RSqk|ƅ%xE>U%y5lsU4PP}w;U ixJ}8TI`>-p` x0,*5~_|a=K^﬒<|VtQ|½_Ojfϸw&V]h'A#FfeHI5D MtiT ?I‘9aV5kڱP3Xt+9sm `ksTfq?g᤹>XG"OV:Z v̮K庤a73a1aV՝]Mј.s]ae9K` g.\왚]Xkcn\#mo7Y- أug%\V'u(rX`F}0Gnڥ, Nc6I/3 naoA-7$JMӗ'p>| x5'`cuݻn$W U罜γ&_@s f~R͖nщb!?x)M0l.WemSzGfVPzl1ϗa5gfh:VGV T|# zNi`huM O7kyK>5:H7)"z];GTHBΙ [vCKρ- g%iQrxt0"<4<2PL ?{ݶeW豳:y m4զ|IgZ"Ux(9%Q6g}.&qm&z%@>z$ 6;TL]YblF}G>jQZ}s>ԉ{4ZJV"wi%R+ZcB+ZLHDj%R+;J$8p!p| 0Gs(biɂ,K"_ۖmu 2^!R&z\_24[C[/&{Ծ^qG@cEx6-1w=_WP"eq^i'[y2gxvعi[w \&1^d(d{ -P=C{칃]7]7k ]7uCnh RnuCnۈ[6gr<1Y9jY񃢢1Ե]A@|qCYԶ< Qx,eO*MLsV,xQlJYEr5)KODM~. &_8[Th&ԅYo{%<7(n[k[OǷ]Y!naos'-1[`+0!1I178Lb a<88أ Y=ɣnU3;%bϾq[SiXRmJt؝` ]aK|j=\̃]3d-SfJq-|˛,R4Ł;ʞa`Bya_(~ϿMML _s_NQkdQX;L vݑO緬^ο6b28sً,H&IYltvD (v܎EEc BDg^iIK.%uIfLs+&l@#Iв$-& |*Z7. [\27k[ܬjY=ңf)bV)T9El];%7i۵m++8W:~8n5"ת%^Xqz;> h]T( Ke“ =A0) Bbn^ C!*'¨Uvayb¬'f"sl[+5T"YgdZ87HØeYMqK~.d܆_dA @VXdEϦI2 {5и}{E!$G%̈́uzs# QNQϗ`"z**I픎Gr1w _`D2Vetۉݴe-{JxU*q$?Ǘt\ű dYk`dtq('b8؅)?=kXP[EXGx~О;-~^FϘgcNYl #/{Q|}L*2Xo]_aQ_aOm-'jJ k ģ S:c*RSd+%Hpr%G VD8s4|ޒ-=ԤXOW9 # *@"8a9#vJY4[[ :Cz3S}p@r\- S{XPK1gKXT֋L88*kYꯄ??+1CsSy32LtsADC;i;~@EI$G 1iy|F  4\aCܱX}i/&H9P$slVID%^Ezӱ`|io.]BD/ƛѳzL@RBw@'9(8Dyl΋ϖqtmrhEk-?bƑzd.b.L #S+(Ou\+ݍ+8oVlw"pՒ(XY(? AtAQ\Xf(JZw1Uym0#O{:\;8K8Q58t8Թl9LvTg$j2<1;jZѐEEVL(݀܉Bvl#A o.[4+2"e&WUײ|rE)%j}G] l@C"˱H?2"QIfaz^V +[A9<x*R. :lL=8x5LqOWEK6VwQHGbP>鋭8jMLsHԡN)W}xrvpa9tqm άA9.4|xuő z)$O3E{ÇD>Eq.oxz*wr MzczV,$u$p)-?ĺe4|RVxf-hp-1v4.iQf[cDlRR quHOlLefH8VepnfiJ-ϓt-"kv8ĭD }2[,qe)D(CShkX/pޤ)uɔ9#+ns'9B^-hL5*\jfV3N|4%=keRdaZ@ Vu#'p8qe 'ďF=%Vi0ω81 -[4 ،8:7*t|ˤn $Z3B+Q/υٲȳO[otNtbT|B2L'FiJMiy;UIMuLΦz\YgS=l6T!:a1AgSG窬>j )ddʭ 'ʩ4v(x8!3m.s`9Ue|倊5I0ŤRe;'Ju1Vm8,}5ǁeXUƟδz~mĬ:y6E#OJ NAuսδ3L:MNκK?x1Yfڒw9_d%>ﺏp]r:zZOlfynbߧ^S͞5fUGKfrE34,Ўpv6y3 K!:Xb&,qEPI{*rP-*8n,6ōrc[kQ!ZuoӶ-|%dZ|6.OWp)ZcQmSb.0{,I KRwh=ggnz'T$y%zXl筳ƠsO۵ٻƍ$}/U}[eosK$L@(O.,!"YH /KF~{P󘱝އqS܏ gX雘*YJfH3`f̻1A{ʛ&CЃ`83^{f^=pfe|[lzF t-YW|SK؝2@MBZʋ[5^=N± t,gD4iÊ3FBQ5 ~CmK$GdER5Dذ8KS-U "O \5e`c)57l4ɷ,kn~` pN0T 'jiq>iNɤlXwTR+ +E ^C†-lWc튏`&qqL-RUYg ,| 7S90ဲRS6gq.jG.6d9`]"%EE F~Y^2I*'u/[>JoXCHI)c1LTgsۇȋIDCaƁԠ1=E ̊YE }} J2w(5ɟ9k"B3xkuN1?~9]n6*^._glqs'pZ`ő5jn9en;DtU.Ɂ :B043auB\+k ΠDžuE:l:iAp.WvvK[=vv"*s0_i%nSѶQ@sR9 )@TFkoHZ\IzL/,qhIhz1K)ȌwIXNgq]rp#ndZu`qm ak{aRB כ 8:*|N,wyynxKl==J48@mwG"t) UQœ-4Baa[>K,OgrewC'mΓ,Gm.H}Xom!q4Q,7oslz8a$qovuSӌ j+?Oh7hl:.T!ix7𓵣qgs5g&永SF9,↶[ 4,Ŏ:a޸jx|q#ϊì@EQ#>||҈jGhlٕxs =p%YS#Ch!U[*&'4P/ʱXQzwTY?I,o.sl~E4&OY׫^ܴNiam؉g ixd_L.bt 5gug^PHdEh;mє5j! ;a Bi-zqqvz= C;;=2eJNhMt0AVe2c)eY3Ka#{ ?kV2 hʜ"T` `{ gq?GP(fNy|}`d=6G ca"; خ?K_:$1XGVL蘀pTMƷ?0lBmF'颌kM/oru3 +8R-Q>X%%@at:PZjv* FMiV(~FcQ7TOʊ4ee\$JiYOLΖ<{:y aboҞDV=%YbS zm)c 0no%x%K,`:=VtK`,<84ã{ WHBlX{Vϥo`pNК-87[T93†֙kptXh4XodyistQMeߓkDǜ vGiH>zQBI2`azð) #2U,3FbIi`Y:GRbgGّrB!U͡s(vP׺XCuZ0?zۀ,HavTPA>0{ПˏꀫRoקpӍet)S3wWޜhN m;-3nn"d]vVEB}+Pz)@4w6[u%D7<ԒW|yX Һ&Q(EUz859Y5 EFkO{_gN614kKz]^)Z<;Fv9W7G.n&yO$\IZ@GI! \ r$D7KRttkqZA  EN6Y9@uغ5eǓxDkuِ̚1kR$hɻHn:څEȒXM}:kdXQ3pwgz2{H*pөHF>,~m!Ne%Eܨ]1+()G}H'LFy 6~mR:UR4aYliI:D1䓟KܢH,{~86{X=a,1S 'cbgfO 3B#HC7M۵mE}B8e_gfq2^a[OXjjcmBd 4:g yBg:hPٓsU:4ӈUw8)ît7g8l-rR`ԃNmKoOۿKsX\B ڻΒX% }Յg/2ׯ[HF Bl۴H ?I|$&I4_b~vN_ٮ^[nXC_/AO|k-X(D#&Ov==yt&ncn tg嘮Z/mvzuݯU*{sxCZ2RP#IU4DRe#47Ȝ5Ρ;Q9)9(n rRLC.x2hLcDw7wa]&-O^"._{u1/r v}pb(/c3 ٤퇥6BA]^jXIIS^Y=ԥ4&>Cq1ӷ=L c Jl~.2mDT puؼ%08[p\h#R<0CBt쉬b|̬!%v_?&3o$_C&M 2,Nr-d5ъ=obƭٺl^PxVFyUe"AeRA~R25C`C{N\ !BPBCmh.3.ܙyٙ}CpJdݭ k_:<; .< |¡@_p2wP\ CC$ES:.@ QLlQ`D!#YI23%i/h=&du۲{oo%_yV9.UA#t{rP6i1? m, mA`|I͖kK9DyPSYCv%blqV'/e.KON]Ǘ2ͧWKu wYufȰe%xlbPV?Át Xd r⚫ ݂MN]9>$^nO╲"kh=G B`>?6e. U;BYUAf/[7adAžV1"Va:yf5>@i@٠t:B\s\P 7upӵ]` eڐzWX #\DVmDl-v(a)%*gaU-zǠ=f-+`1J}Ŀx?=U0v 5/R`bjrSo@rPZ؊ plXr #ȥxSjDP~E,l]n!f1D!TDoWpefM9S1> )Q?MeODqeASbД2kT@h%%@r5P@{{߭Uȋ LqDv~1IӉz7^Kez@ Ȃ}*гڑTPsX6w&,uC@޲Cܞ7}eAosb{JoM]+A *m6`]ڷ/aA @_!}E_\6gDhA(2 Qg}og7-|^&W~^lԂ6}T Dó\ؤr?i ]=tc} 0ʐT,M ~iEWJK'Aس5Y8Ϛ_sgǸ_Ѩ7ßARh75l( #Av9iǬm_ !DgR7ן8nD3D dΞ;'y^êᨯ HI?ȓ e?N˶ _cO͆!QoANw!͸f WUN:wIʟ TΈ)8' e4eUE}&:!\k攨Ȉ};S"'\,kdy5^toZ!/V@a&'E}&%=@DV~0'X$JLaCדM6VSç:r`OUUvrP)'r,*K%|5YSi ̏| ѶJHâmyv<5k 91]Al'^j{E,)1b =Le|-~vp9 BvV]Oj1|96a[a0p00JU~(P_bI0:KSFH|vZk3fXtx=,.blsqHňq9)aϢ~wHd10C4Yz6,qXĜ9ϰ}` (.0" '&^M!Mp;4j:UCޛwfB#EIFfjHr=?43o6;j8 oU:UyXQޝZQ+ @S*z"*b cUr%D@\a1O, c1P{GX sE`:Vbq7 .lI!>sJEq;1Cz~\\>4E>yh{P7cT7l?:gz7c.%5޵mm#ws֌mcFaޣ]vϸ!9,&A$Xc69Qcs)9UM!_E}`Cwj`q?< U^:x#R캼I;uj/ң.쉬~pzMYᮟ1'ۉ3&d8^Rׯd 4.TW V>RYew.aK<7`_$!Ԁ _݆ۻ: `p5i.A1 8={ÙpO4I>/ONIތx` 6o]ad&lEzSKs5lꋰO]Tm(z[̯NLr=NF"&A,$q1 W#\;qAjGe޽E.k3g뇶(CQ7Νqdxr9.Y?<2+m{+Gj3룳``.%g#6^.)ǡ3L.RH>9hc4wXFZE_ox^]6lO}NQ%'"vcf, @"{jwIp"0JgRTMQZ㫨jm0c!u{1 E٭\q 1Exl[m}+%do4I4s\2Mi-;گ_GOw9 ِ1jLaд"/33Ml= T<ᶣfbn(98yj_yӗy̲>O]rokjMɮ*UugNz`KHu%\sMPDg c^q+0eۍOj2{j^nG!r5ֵ j5Ԟ*CAΈg >;pLO5 {ʠ)b;uaʬqpx]( Ib&H(i2e>r Ѽߚ:-08ro`eH0U';k]2.LKZTdz_Zz݅CM@A5Y^j,nWE&B`R=~Mg'"Ey5ZSVkP)8mF h4M}Սach&p4[VEwXz*ܥ%dTsp/S ֛=@ M=/5% ߞL u5iZgwWMsD: iun=[ޕ>Ei8Ԯу"mMPW*L_vBzk8x|oy BW n3Hb[GAq;{u<8յ5׹E /]pZZ.Sy ~t 5ۦ+:ت?CL?ޕtӺ+cPSLXx۷&:!*!AKi}pH?KJ6Qب9!`h@3UE Oė U3)1$&_qۿmcbUܙ?O?qA`wFdxd<=AR*禇 L7zt*͢7{IQ拭e3'` !0e$M/DWէ\3Z0JAj>x fY@k^j-Kcs);(tF~kT(Q |]YM"3ɈVq+YRI|'- Fd_%K\KYVn{BZ>+Т攣Zc5*aYhEG`5}yYGA}ݎu +vrɝeیTB T?o-G[Wlh|6x߯/.U6(p8$WڑqqGO$q… vܼ|P1M!$6jkszQY"ˊҺ/vVUS"ݾiW꟭~AzUc_o2?ʥ"(T>_7kO(Ltڕ2z_g9"bmVLͲ*אdX v8rvn'RCEj59\$8au;~Us~xn0a&l+]5VV;6gweS.D:+OxX *,ahi֤P:႞M4#x.<\zti7 pjbI]["?Lt BjS&Bf;"aT2J=")6=/hB9]T̵${fx![h^UBݨ.Cׅ|SVsW e-ӐM䮥I$SGBBO BF`X\!vL!'n0"O53HCFlĽ@w_^@I6/Lalno@T;]|z^}#9iXlJwiժj[;Fbm/̚:r[^V]뱨$mFs,w6uJFm7iYD+P뗵_g!=ض$4'dHd(0᳐ μYoAWƔiPnQ۲NJEb;(Wsfz^Xa۳=fl2<wùwBۃȰiĶ U?52K#=LimeBFJ%RX*պrPa¡*LӤ ]Y#M3*H)z%G~!/]9dڥkzz_8]P^D]:2,f \" !<[FMC?_+kMgm%PJsfGb cC:/qa#>RGf?}Biq]8"#Y$ڔ5x$br %ؾT9bP=B7O¡i9PCZ; 0Y= 0χB52H:>$8`vvE8h!1p,'9+S. ;b֧GZH>cGt,eqšZSPE \ hOb@iXo=p(>(`1C0 k Oc#pk<y@Xd hO'c@=vG0OyfPƨ?p؞DF`2,bCP̸ j٬jiybWs\~섡qܡ\#'K"^H@_?hXwV}b7g jэKkWҪ 5V3g@V;n_!j8n۵ԃPՖ3RsG=wpZ i(>bNP׆6Ե! mhC@ =`j✹ɼ50cs3̘aˌ_cX^h*y&7J=7#D$"n8^)395Tߣ~U?%B9s)о3(% llfaf(%ZvQ2a d%(F麙 ?ϖ30}ЗNE.x '"J8$c K#bgx/Y~?c1ME}Jdyȓw*K>g|(Fl I<>R6(Ak' 5=%q|TY-"=a*q'Էm۷$>si\aȩ{jCz0Of~m^{_nuOXбՖlm?Y̱uM]sScΈCY=L ˆ; 48ݨ1֦Q!QJd5 3Y @@M q|j衈<8plssP ͦbqrx*A]gK`u[S <<*:]X)5km椣R][Dxeg;^ƏrP4ND8`vP{<;y҉) &3RAw/fK>lPFTL gKVU瞼y!?$<:Wq"2|e$jMxo,XW'- 3\7ة\V>fs\0v+!a2Dh2I42"Hl(qA e)2x!AqZn2}# SJ/9`طJ{? ѧ^_[TLpP_U]))0==%[u&.n []Eܢ\r;֞!P0_R*ey=hЙ *ekVvq@BN?\!y^Zv!VY Z>ɽ\e E$O$v[.[nuRV|-1ݤ/E^~df2tUqPfk}cpwbH;|CNp`}wi/2QÛ;<%E@=n*$H0yyZ-wPj-ԺsHU^g C>2H,W5@%FX?&K Ҽ87LWe0V,Y7{n ~AMo A$s Ɵ3jnOԾ\d 6<[=K:\68iy|_&fPG8~f:ޗ yCiwIǻ95 0jq4ϒ+MU|~0AL|;K&7A`a3s #z)x =O~ ~rMx\+VYCOuV>N֥X\%:٩zZ.O_]x@kC*UHB76`2acFMĩ,L=_(q9[ |9Wkuqݣ~ Sj*U~Zܶ_]YptEӛr⹎Ð<<}bG!cOUW)]]%͚{2vjፇ2!aSLm{a ok7A:BʷU?mDvݣ ltCVomӐt'CXJ椣CkQuաbQ.ʧӛ;-~Ufew'JFS{ř]u2KS,9b@מW8BVO:*~RT6hb8+>igR=sj˹FTEuPeX{:a%RCU夯H|NWIB NV5ZMXLuE( zyXtպtٸu]sE_z[KB?sb'MØr)A'%6iUd}GaY_iNrj-E}֟byPZOŽ.\CqM}3eXT_oUOڈW`,зSJa~[#k[v]q{iו;ݟb.yQsc I4 R26g4>=Z,X7$igCê..{SYr V61]cxWUfZZ0 "i8[# 4Q 2ة2 ,?G`J6ew:p9c泭pp4 F#H\ BQTQ0"=Ā(n0D8 @}^kzEmQ\&g'i%ķmq#y$$m7ba'dTQ΋BnO(кuridĄ:3ْ-7Y^W~4% zDm t@Pw 4.cȍ;$t)YbؖD0x0@h 2CD`IlimA{_ ekH?B"B$YiCB.@h˨K'sdNVԒ7ĤAGb' 4 1it!"c("$j_vNH ܓ3goϞ:.%`}i'}F_*IqI 7BW(\v% ؘCrZvJ*m [jpm'TVt 1uevP9] 'Tι 1lB%m}pY{L+*7jL,&k +rJ3Qe=c0IIV2Ih[G(%uL /Fm?Gm͆ Z  GYw>\PB8ᵆ="@BۖH~Zvb4u =#@Fs5.Ypހ.BXxVIc IP(*>\:4V{ X/$j:␭ U=bحi ZlB] g*1Ud_~{j#.;D<;pm(|ClGρGws8Ըwcq;θq*Y9pe ߦk)lOr'H˵jTu)r-mwSob? >?kJKU5w=[r뗺{]ڦ@B1^Ԏ6AC;Gֵu!v6OU @zQ HQB׼j+JߞG T΋GL\ϯ_+ <$㫝"^mP3% Td(xݑ#qW{ڏ;W%ʕkQ"J,Un=#XHGXm;Ļ=1# O4=+]}@ *C +:yGncX&[wz7qF괽eq?hsr<^b8D8$~xs)[CiQ`:냼RTBxUuʃ0-E!> ;R6 CZmcش;|TepoW͓3Ď(Tt꡾+0uVݐ4!0.O`y ]b)RC<8gpK@P(Ny=`dG{qј.QIP=yr(~Bm!3Nns"(W%mk)o)$bhu|@\ R;1 m%v(tRP/ }RהcK7&]OH4rܨ9vzۂ16/gVrn@z(uUM<\ mKoV)5 [UIr]lčyLR s}i+Pb蟜-9yqe4嗇r蟙,E'ရd1:gs4$#0u/jqSЮJր^M}.i&ͪu;w6H}?m[_9{{x~HPh^^A^ =W}?cAs8~KP$"1ɱHCP$M Zl9 ׿nZ'}c3;y||]6hcCCp1T\`.ÁM5#H*l_ ݵQFM%j:/bpwu~|qzfnCK )# 'Nھ$ r\bJ)♲xXGVzU-WRmЕiQB=Ct%mB(m!8viJ55?8!R9MZwv绍 /6`u>E͛]~6.ł 6Xł/Cp{)~Wl'w7rvEʜ1LΏI|gaOYa2&c6hıI }D_bs P! Gv8%64ЍO$9N(&Ls8ͯ%7D*B5͡7x'D='|PDp(E>;UiMǤ,Pe)ce mGlNXEWT "[#єRޫEb5ȟ)5P _ Tx.oVVsSJ/NMuU$Npprz5:!~Bl \6E.y8yfbɽݺXm?Z /)Z/-лOxNtY0j֋\/qpvLNTu>> '@u圕 a`{#cIk{sΠ]^,'Q9$x{޵l-6Wk dslyvB=<s4t mA rakm;/ 93k#.hWn z"ng:w*5k.pBo!{~ESk }?XW{=l.Nw-OTX#Oa3[‡>:Ӧ<:&~q66l=VSnxY8k^WkP^83F__t2@g sm5lj\P52ZԖێ}9n1ԑ#AEAOјsKc16-g$qf g51FK^c$1FhN;Vt9.GߒGmc4xZ^FV3oGY cGZoaߟMcY$mh1FFѐ`GG[0y{W58MѱCM.643Z*g`EXi#V+hd fV5}]F`M:4a6F_ŇK;`4RoM?1yˬYi[5hx { +.6{x~L90 G&a5җqI>UV|f阣9:sv)~h !]\ b3+8Bã k'K A0"p"J+ۂ#r8J1)pa,@/ EH AA0 13q9#@! 4(rvdy|'g3p '91  :9q`QWƱ-%L#4revA1ێ((F9iLJ7:q ' M@RE9 ki^|_E`l=Agd6uJ TRRNc%란1U#e6L^dJNo5[oxKc`[6Cy cᄄndcRP (0tg^T|p]6j~ |P99۳뗳sgNM|K}\9ǙU*dr@8'yymo4X[(%E{!)KJG/fTp1PU}G$W̝{WՅ zve]ve] oɰ#Q0-%#>o$6ck {(~-M?d M auZ' 2SAvjl׈LN8ʿ'i*wTnL~YrƗUr넮K׎eL0B/";AߧTx.>VgSGEVFUFmdT.@,KW^T2yKc4-&_lgb"{MZڏq~W^t]u\ ItfQQoE0D^ɬe뵞:)^E2MRÒlQG7[x*l~̀9MF=[?w=”\&L qi=ͷ)2QD}ʩ[~R ׌'2]zA?O|?>\p'B7.jC8^#U|K1rAX "1@]@W?} Ndz1woջk9h/bp~僛@ݰ(d?Y:2Vt0.~i0頸 ɠ|;('/x!jĝ> TۦVz hxgB9ָD&[ID&7ֳ|)p]@qYw_ᳯ_C b_j 0p},+r {c4D 3oy#| NTWiJ ¿u?7.imuCY|Z\f${s&O o<ɿ j ZN,8Wsl] ylݺg ['5Ou{Xͥm[&. nq˕ʃ1Q',G9 V7;Sc1e_5FH>M=)5f%G4Liٕߒr]"{cqjq;ی-,{/-} [{$ޡDf33kBgi6"e^Zn$T׭=6ju!г}XHV'IVۦg 6l2)Dus)M<%|~ǽCaHAc +X0*X[]* xyE%Z5Hݫ_A`h8 8Uh6s XSwDzda,ŔǑ^m' L{&25p0G6.6}Uɿ\p"Ϣ- ?߳J<[OB?F~#dNq8[=Vl0  }I߷,QχfkQwtxv<3Z}dk,YG;v%?~'gw58DH8ck>q]NQZ ii]40eѝ}pvK6P;ꘖ87w]Ժ.jGQt׃p']8=Ԩ-;DPGQxnڂF, SP;j|@r\2K*H5LD~ V&R͚ 3M6X|1[0;UcHFI*&:4M2~CU_($)KZSM7%R0TL?I^ޕsM5/*BU: LڧSm4)O+E(E, ͨqzJ=B]Sj*ֿ?/lDGķ,~_ep5tx's<D=+]U9Joꝥ}tOZ6o1rodv~iyŤZLm#7ꊐq}g:qxa@e D]uC\ZP51s j+<׮=A0PiŋdoxTbY C1ŃTHjrN'$b`#䠫k_@awu-G7=.Fo !Y̳BXsq$,~`wغS?8mǭՋW4VnV4zNC?@)ߥl_b&3Im[; A'!$`# :{Yv%3miA-nX2r7Rl5OLHtÈĖbŞϳ{q~ U7cʚ^qU#z'o(QǨz6{s͵6"'ϸEtMa2LoWϭ|^1_JI0DSv!ֱ}oVSo@:,ϊb4ꠗ]c߽әG-!d8{2^=) ONp!Ǯ;Ǩ]|;Ҧ, 6|QOk}Q;d]kžj # ١ܖ /m6lp|jaz[pt{]o ҦBE//E:ҏ}VX9C԰4KصVg= ]^P  mgZAV[뭀w';OqJH$(\ّ+}0߉C=8ztӬznIU#[,uoOOϢYvxb 嵕Gœ2F=3gu2xh"/V]'IoY}" PƌdͪHZ0NtN 촋DW9)eQci04Kz-{dϬ:Kɻ(c+5/pzUf}@@8JLPmf PQ@'Ugu:VT2潕е&N֒mj+LVet"5" E >T|KFDkJs <^>mHdƤ֍@?W?Yܴ/5c]aܽҽ*D:Q*27XŽOXrTY3KuȁL[F>rh- oѴpoa:o`%}zw-)~7Bm!.)ˡCKo@k6Uk[Am-Y&ee?Ey1aZZ O,/xD>28.ӻ#)6OLٽѵO BZ(6CKu\5"\Dȳ].8) Y e#<?{gܶ|wۙXƾL$=ͩ͜Lϫ 6lUKR_FYHJft:- Ex~? ,%hex+)CH^;&XyؽK*#9P<^ϥ9W~/cX|ϭ}0x7L?cp]w.r*?T1@}Pf|%˶so9 bIB+ iʥXTMwPe=5u[<_7qLmUfK'̃M2LZ  Rj¹hñN04cW8b= ^,)a}MWrF/p1tC{=qNz w8Շ靉g@笄7{ EqCÝRBrksPZFښmgij+M)k[آ퍶hlbaCCQsM %zqFngzW`=X#wT*h doW X(Hiꈵ3D 12"^=WkWP"Rw@A 6dO'm/, Q1$F.H e U`_,n€(gC i#9!$e";@su1|]A=u cB J _E &%J"4r{Lb8`7ʘjun'_'3ư*P;=j;n]u 5# E\:H?bBl_ NN𥿯,'/>iOɟ^}xwo}FW7ΌJP6֮.MɾyVƳ)*gڵ +\cHvdAQ]{fyN{Q.í pI>ʻ FG@ q_3u?scȣ] O1Ff^Pˮq[8z|JGpUǰo@8[yadn>L;QQqJ&DMUk*@}WQma\̹h-zן>ݧ׷?o7o޿{lwj,t,_#}Rej勇6`k>8uKaE߽˼aVO8{)k|J3u'_ ~4ՠ櫊_+6w`1yW}a iygwWuhi3GPwqa1,I(ӯKlx?rFp U/[v>P3_Ŀ T^kzv^up Q+bOb>U 465 0ZvfUjfeB ͪ~avM*xŞ5Zc+Z/Asq9+ C1"maB*eMQr=켖!L%[,9s*>VNOCrZ{WމyJO&7^vc8JQp4'iģa iMIt4ՠ) *ʎU6v-u]劬(UsG;Q^sIhc!j Z0"i!2 C1d_PYE@ۅU(zE~U^geU=/9yR$2X_cՆ#m{!,A)Eȥ2A_5 =X amע;z; 8Aîso7X ],sI^ՑKuP8:;:#DwtxGwtxGwtxGwtxGwtxὧb pR$ȤL(X2F6EEJ Z5r7qyl+mdUD4&9;W@O/Pt-jfkFPLS6\k.u(;4a*1_>F~} '/mWb T2sHw{KW*o/{Å2O`p9(L xm?f o?U?$~v)KlQ[ڂDאl ݁erOO[n+Z¦ ,DDSRCoTşl'!2s]7VLt7v@o:_ ,߮߼+MϜ$]rDPP&2AnFdMDOHYX_1pMa&f=t2u4uZRKҢgᴝ#`>N !`o2 9`'Z]gq:e?EM״~ #@HI~q }\fYiCP7!K0,b@ZTySGf%f5aog75Tl6{&oT/vDEgߡ=4YfhV5,j56ﳺ1s0Hӊɔ vB&BXNIJ 6{:ya8rS۩Vu|()FaiĄmÙ5Q:5E Eoʑ*ZU$QHT$>V;@ ,K5P)͉TjR;Әkܣw;DMuO罿Fͫ js.ł-jWmHϳ˲N:Eڙ?rSn:â_ 9NGLr>OЩ7%q^5$(7ns>vvv7`יQ| } g;,a.}6 /̨?Γ x&!K?~']J󟊂IqOf" qd_-g4컐Sg-&Cf~uQY-jz<ܐ7D<5-p0UUIf*֬fnaF0 'DU F+>*ˊƸJc* Y]Z\aBCK$А-S'qCZZMF ;@}R‡960P]}?I%?vT)WF1\iTR`SшNohDmMfiҬ"FKVDB1^Ws8VQYԝL_Q^ eyTGHhX37{7kSI:NWwb Rz{fmTB.-M޿Pv4|W/Kw<="e5H~#t_9 eQXJ+~'uhK?`ȦAnu_BL}^P[T؞0njrς`Y 72ϳ/<0Y} SG=3o )?h.1^#>͐P!li&Q2?HTfP#!d=p_V়faq]Fu,:n3 [˃̱&yCه"=UYGCuyԝ8g==X0.u4WPh@:u_-~ eݾzv>W6s[w_J ,DScݍ:n/agֽ暺GR#'deUL\_Wtɥûƪ{R`V#JWB9,)uAG_ qe&RiƘieƊo>ژ2ogoߝ_D*X;QIV@cyn[=_N)xԣfGcmC=i3OV8i2h%mJ0nb.Y 'E@(O}aF8 աV$NJ$*[fbo[/ۊPt,7 @_B6jT1h2͹@7r7\饭ʮHȊXe ʬDg)s,4R:eH;*bOBѰ> (ƳJa`a(kbPgX%He&J3iio2ɦeh;{w$ iPr>p Κ+kve1-Xc]y ׮]:2.p3%"d[0O,q # U-v'rX-|i˙4Bu-#(g1Wo>=G]jZP`t|_J@0ŭ>:&:5nfђ{i^+{r~ԝ¾FvTBFHj>+<%EV~ +7{cRBMPz5][~ VG?1+4vϮ02jh;Z-z*<CVhOӥCD!m,}Vcj4|JfJhhۨ# ׷#[F`~ƭnCDž<{: 1k&(6r'ezn iz|gy>DYKP7JwP9A0#W_m ֻ_Ĥ{a 0)8~]Rx"`n{0ͪc(FS듄2u .5Ouaz`K_ijVmb߷ݻحaT&Nc2QQcn)h%nC~~Q][zgi]7㬩ۋ$b%Z11r_g*Zvu$]]@ *Iq^~$ց|M b>r,ŀ=8ȡ{̏ T`zq.Ѓ#v]TAٝm8LTa)Kbig6I3ɲ-Tۿy);j(ŸZa9*G*D߯pd|:|{A0d1 JM$ƆЄZb4SI,9IY-߆Ϡ/Ƹk Fcb\WyS/ c ; ϖKI{շUMua1*K5Dsi$F&fr3*QYfGSU3˻^nlMQ@2s hD)?/9YI{4F19t8g@if]5+94i ҳUyW{6;H%G<58z 5 1 +BDosx[@w7,1nD &0-{090D|tR Mڂv_|W3]Kth.<Ŗ KcZ`Am*qdJ$#moKCF6;dF]L+{cd@fͲ7g{jܨ~39ZH싴%?τYq;(NJ[L /JRc%28 fk}C[B x ߂6[&pˠwdu0W0q4Y3I$FT)c56AK8,PIsEG)8f`G5oíѻy>'7]t#>(ǾzEvp'3'w'.et;ָ Ihw7l8E guW#]տ7>y o.1N'+(ZW|.i҇HD7pj΢x^,tD/=ܔ:\-YD"ݶJ*X$*s\#t <f9p@PSTr!WhbyX_;nXn׬7ekvno U^<vx;Һy]9r,64Ɓcy  YD2)FDRJaIny~ZoV n"շ'.tPJ#k=5xx;XD|<(@ rk3դ A7UsF= )9t"qK" fe+jDa\a>{)h:vE=ss5y$\vODTѮ(NpLS& &iʄQ`"8AjK棅>~FW*?Nn+\,=66_T0n~W^.iF/l@1ػ涍,_ڇJ~yYǹq3}q #Hԅ%}>;r3#5ft5#5AAR=M5kw/Մ@2;z s ٤%j|QGS8ʀ&Z8)6XEKlD-Y4g_FK6䣇& zC [*.Ξ>oeMy?KrlRZzXÊF.1oؙ-.%<9r´frlx@pp9ruwZ#KV e1AU,1MH/k.ާvTFV!- ]6 xS-rTL(MpPo)ht~`a` zs:3 :b f> i9vۭ9m>К ͑8sQ] X}S`Z ľz _P!O׾wdY0`ֱBD'&05Z# ؈S&^a$$q&cJ~U >~Gy CqRgSwRG QQ)!4zB֪6 r" q:wQI]AGeP!&tH>vMpg\FrIӢ8"K_)[n ,< F:&6Ę&|^e$qY1 2DOb=2aOK[XL{/࿑X Gn?H.&>fhRbh(UJBNp]EUwQ`%  E9٫b*B^[.|~. vV:F mv쀪aiě!kAz%~wQ-t, aOW`3vbV( 5{_ iK{\nN5KY9 :5MM`* TV6(eU^Bx+tX:b UT0#~Փ)0T~4DxY呺Xsį";|WMN9ovl4i`+rΉ\;H 0sLuhl`,"o' }r_)+nELǡҏzצ@磳 \ڕ< OI5bI37Hgl\Kg18=08, >Ki|QO;.~=*.sڀoު)Ge&{D|qrX̳(È4 ^`NSH}1_4&]9 g|T,Jɗtpx{yZTR fi;vU2fu=l՘ Xu\z긏T-)oO oM5DSX [7c4Aqs!AP")Pqv~0D+v712j'svZj]DZ?RdE4I Y d@S[E ,` %DXpG1XUk ,eP/d`,Qާ ,LS-i*HZ yNk}4ֵU$Vk h,#Hr *7r9jZd8v %+ʷj#"ׂ/`_<17 y~46A:IM}."=1|tL\Z]Lpok7"\UkD3XZ|X:5Ahll {۔D>qe0>fsPTԎjP ia%$b_;5;'T箐R٪&X\G  HG˥ݾ_M[69n ketLJ1Nj̉f"*Pi:DF"rUp{tE5a'21kׁI6ƇY 7frMː]N_~{OURNOU۞NB)Xf*&@!^.*I.cX̣V%#>@8٬wbnK\+=n nQh8; J7B,JPD&VI+}b=n owI6k Z{Y1u냕oJR3vWc[Q^lrֈrɾEtK OZ#LQ9z(ДAb P׹QCkQR=FMIU=:z=(zwZ)JQNc-sR.mPM4 mD Y*L!V,xJ<*ˏy6^A*e$]Kʡ{96nsyUD5[3s__5^{%;9YJ#Y-?óa1fe*n~+LfKM-9&vXkkiUolh&6+͉>JH ξW >+Eڃ|[Ԡ4q`Y\.f ;E^8cZ㩅qΉSo3.J \ruB3)=PB3K[|k :jL pz 8zhyyS^;CQx-s5N|G`]|'\^mUE-Py"o*VܹA{6Ϸ}ur $w)ʳ–pD(Ns? A&4kqNsD+OF"YQiFsǻo/ˈXL.G/x2 'rmt:TZ8ӼO`OZR;4 E6}@THU-;%O5Nv58q2! H5V@z4٬<IQs06ؓc+HN =x7;B>ԧc/{+[MVl#Ф].>!HtժnugAZ X0ׄ1)B1MT ϊF.׼>ͮ2ys]+v-7#vB I(aGi͕`BwZ9SnyBjIH{v'2bmoTQ0sVV K[o+cKa[r\T9FLlƻ BHO4 64rPĦbB6IXԎ&{yXPzrwAԨ&Tz|.H܆N.q !_ |HԬӷ='ly<${sT-ùv;4"FXp;ypAУod`ind doIڴ P}F)qglt&z7_Ft8&YU$G[E9%Ϲ?.fwI``.~$Y^~]1Dӎ6lFJ%Lȫմa%:#i'5ڃsc5]ފiSWs7W#탔(o D,Ri.C(yP#8ð4VVjENβ~{}b9eetY\\7(/vMV)ͯo zCu9b]Ϯ&t(cMj›s7e2˻H]%.-^0W張*Drd!L;2B4ъ y 0=79\GiZBDQIA{!w!Z\F\ ڛ=4{JbÌ{,<9V`dkK<f~ Ҫ]Sԇȧ:H9m)UlG㴛ߤKr46kE?M|-U[k;Xc A \A0?Wfj >\< ODmF^rxUD+TXbtaE=]r[@_`|WB=/1`Ң)cTk[+-<,L{ɭ#"-F $=lN ۈa,sLrրk1n51(qЍMQD1'6g"|4lFt $#Ęt{DD@ڧPUԦwV<g>~b Y>vMɣ_+AZ|6č!ؓm c2P^bͪ]ͶMa7ҍGq]; nub jmُa?Jhr~ӽG .",ik:/'j9S^r#{5uaG}D) zup$5jѰGsZRdf dנ_ӣbWjؿ} H|1^  sHwy։sŁ\tS:oR_vAu Vi~`JB_}S gҸհw]tumz݇nyijxx_ ~y$/< j0ɜl0ZzJ D[m JƚD$54A%I%3(7"Gÿ^QeUY"7~p~$k WgQ ٦l.84iZXz{)Ǟ\l%oſ׎]c$1L&:b1[be{{y][Ic UERjCȘGa]; ~: 4}qqxw?tN1- 3O).vEI"$&[AE֯jF ?7 Wԭ:E67WJd9?e%XuRwRUG_'nqK(E1Xe=^_y?@|{#ܡ2 EƉp 9T6u60,UA-zа C)gU3ehsЃ} mY!6 aB_#U[[`)IJtb,c'"'1r)ScKϏ)?Ȣ)p 1, @0V *1CYT*^Ǎ}~{DWBn~Y!̚z,cOaOrc|Ws$wqnHYj2&& YCSShŭ2E?gFnuDŽ8FdUe gWW5*cl"3_Q]f#+#Jcu䧱2uB<1!V gTQ¸yh"l`rDx dycogM|f5^ +TrޜF_各Ftnh}FGJ@*@ZrQ 4wfM47nod ,o٭,{២SJ2jn_ +kz$Fuʼm@//`EZEOߢAAHƹ;x1ڍkEJ=}F5}FLPx/ 7'6fbk.yKo7u _jo =P ʫG MMXd lr|ֻ:CQb p)xZ?FMa{SXBebMɸ& 2QM6(g_MÙVAݟeF'X=:x|5[ B2 C9)qsJ~aːST\܉i#c7˝Hy2z{jwbm6^YDp?9[E `gs'4='S~ Pw4vF1N V Sa0ל:IC%aQ{8Mƛ\17eWDH,4ǫtr}l:*7M mFӋ+h% @iԮ_e97#2Mz+>O#4%!^s^gOE(//=/3oG&/C?dԿ9ttxc萊XmVBa1Ո!Cq]pC× COx}-BGK/&'կ`1҃ !cfG2B1#:9IځϩE 6Ls)U9 ({;=p`q%Io s_|4mGk%H. yD9MHL5ڨfel;ER|`5M?]l C@Iw74,M/e0LxqG~t~7* d.zMe?8_hf1)|3|z㕖_RQ DW3gFW|<aÒ]’j}4 }9d9  eDu#oh2}X}}ͬ{9?RxRa/w%,QyZMLtY8$ 6@Ţ"qd 9 7XHA*14i Bo=8[7@w1D;Z[dDJb&Z"biU`x~}'ڠ4? n8fw:Xb` Cew37Eq,%W ppoES(8烕EN<㗙w?|nhxZ}Fۄ+ BM'@D(P{<.?zA `?NGVAR\Y ,Iץ2eH}+>*J3PxU+=[VcF)}b͊I_bpMJL'P> {ok}Ae9_Ŋv/u=HKt[{=yVKrّ;|Bz=iwÂnzZT/z. qN&$v)‰ SjD,R΅MؤL;$`x|g.4?`?;?;~u ڣɉt{ XZIpJ-B`s0 \c@}][eet#) S3 x fXSU')o{8_ T+Ԭp٩ { "R<ęjbaNs8sc!Ir1 ߖ ,x~S7x+(:~:4CG.VMp]pAh1mv+OU-X~.knߢaz)$ >Su*/h\g#/H4v35;b#bd$F% e4vc*Tgѯa$ר8)+gCm<BlZpu.;YVZ¡+D;ě!.D^W[G%ћXk!^pL1׾b^^?#0iX!c̔Ti:rv:?t, f=J8E\T | lp0{Ƈm `JվIk:5tR!W-\9%<8vnN;9cIL9F'9a8 LjFnͮb1_nG߿,"Rn(17槔/-ˆ,mA-'gz} 1̾riwׁEBHN0 !9zc&1BzWJkAP,`-(ܟlpsg,G \K܏)+Yi*>wo,u^~|Ӏ* ເ}IYl6)^= w(U$Qb%$Ar8):^r)o-C`C=[ܼo.yp*(%rUo!eA|֨U,oأYmh9ufx6i_Q5h_z6oAW25a/cP-~9|I6iZ wߺRrun3닞4eWoȻ2Wⶢ LV"x$X~QE!} -d^ї VX5 `m&">X#G{$ HIdՒ! ذ{,MwB,?]YF~H1ݚ:P:bcekWGoȞq싣N6-^Cnn/M x`H 2̏ܪ&mB+VF{(e>Eջ ļD20w6N\`,8a5XBDJsVr̡cJ(|%S~ 2J9&Ü:b̯:R^`D!; e}2zEC߬Ϸ現tF/{Jo8ijYhPq"7Z^>5_}SPZ#_unӭFƍ.˽EMjK%VJүֶ4)JQjm=EJy$2XJMIoT4zrj>][d:3\-zѢx[Oiž$.E~؟E|j3MS>#N1ll8pIkUǝƬ)t9BCk`Q<" ,K2gH I"` -T 0vx-m)RAPrWomqWixLM0:%_ڴF#T2txnIi%>6H"k'R,uRzP-'i=A̷s;p)K$?g "2D"A] _l9wD}Mhv(X r+@LKkW 7mRV}߿˗wP:? my[KPE_j 6f3y'$n[>b DS Ēl`2| Ļ%xr.&RkmHq X;lw04<0C8bäWU+}]\bFX6^b΄'MtS$Y5OF/+2y"k|2=Q smjS :RT}ՔQ yd@ ޤyZ-!CL0nűsY)dK"Mw,(zx&/%\/2Y:v Ҙ,$I)SҴ)&j(B=KID"qFwlѢi =,f͞}LhXEM8EU'hF?c[%pՊGVtnJql 6pfrNpmAxђ7x@Ws5&|}z?x}..9!OrIaAg}~%3b4"! NFu&wc-%{]'$`k8$n5)br.VmPrZ]Y\!#EyfX'm zz)AE\ȩ@"eQ!5@~a>qFwA'h aCA?gbBKd,V:#U*1Vid sb $[Rz(tww7`4Jޮ̩],IJa4ɯm)\Z*ɱ &.AU0X{` A NuzHu(%؃JgMlPhO@_ [ϩ[ivn[7gĽ{N!3{>Eh80һÝ[|=? =l|ۇlGILEPs)V#QZ!8"i2ǘ='g?t:췠d@be*I]NbAa:"CO hnO.6cTCDkp0i]V!h9h@Ki!d}bZeW,_ !{ygvO33*$uRaC|61MW.^. %yfntxc+نÇgi/I<) RkB.Ui}=`]` {2ֈsc{5Q5@ 1÷e IuK, a12P܀s;H_җlj8&IH*-^L fd8=|N*|ٗ E?Q}о|lо/Arо|pо|rо|tо|ڗ~{eZsxk [h2 <Q +P=E3mވ7KO\C.ˋ^%~zSW6"tSHcOv d ]v8t-;*%ϙXzX#^)dRIVc^)Ȏ'׼r2z<,rFw8Ҫfe3e9^I6+cgSU gC00-⯙>_ =FU+&Pk^'w&.F]>[2%b{ ֥XW@, c= QN-QJ>DMo8K"C HO@&]l6j0г tv5=VfTL𔥞i*SqKbt<έ"ٸ1O [_Nfp <MGn_(YHh* 燷ߟ$g~8I~5>GM"*Vy[qnZ1ɾ}1&֙5ö7kx3"508i(YTxΐsqBEIגVS;Jہ (/Nf20}\d^Ʒ*_]rw1NszӞĠN4[t᧳3CQ@>z'Scg|^Y28$Y**IR51z“1aJw0iˇgQr#qiHq_ eW4h]P*DZS!VӖDok~3d?zHQ3n{*o3**a1&v[bc= O]uUf/'#7Yݻվq:%& *p w^Ta#֤ =~o&(RʪJ 8mwJQ^E%%޾׺ߵESA iҡedJdyECltQGtjrb `q v#7{MwƦ!EoѦ8J]ZCqM߇*${Ɛ׈!EĐ`!tȨobޝ'IVhF:I i(b,ֹz  Etpܾa[#8aE};%6"Ax Scg:vpQ}T!I I- 2HRG#BDj)D㲫bAG}c*o4UX|Qw]LW`$BAh"fS,cJd6!dznEH}MJ θ OF˗:x^.n1YYǿj1K>;.Kfʭ֥۲ DdWZL9靯zRhDEDAu=WOFu:xf?ViC*tMxxNK3ѱx|K8j9ߝ&zP\϶7_}=kLk¹[[ GXUu]u#ֵ$tu1XׅU]u9`E C#췹뺇6z2X')K9+ǩGKGZTZM©"oAâ:_d}~/]%7m2d'eio(7<0Čd%jBH)nBHI=6 Scy|oX(u=hîM48F]i "8DҠGT!)4@8 D,e.>?Q8T0^ޢLm24&wTLϐ=S=ӹc.j8o!f]pxj@]Wi?qFGٽډN(!6ꠑ5FZUsG*%WE0~NޟJLras!Z  0M } +}r)qFwlѢqst;&RLXzyy+knuEuɱs3VgWoS-)~4HdMI!DO|8wPfv8$rF+L0R&7h3Vt+%W?lfgVO%ތ=ȤT@lŌ e-lMK5!s:Mǽ?ZmhUH)͞tUkG.eݤhMa_ѐzU.Ud(Ïegl>{wОD>Y]B۴u ;ѓq j˕]HĘYJSyFRBģ̈́ι0?N^U=)Q߽&^ȣeSȝru ,>d!d9IKHGId)+¢^5XMLdXd:#y*s(ʈ4uyDaW~`NЮrnD>1>@NN)Ch5ϔƤǻ7 Q lZfT{TT{nXk PwaD< '9:)? (ۅ@6:+P@bT~ߟ&fRV`/ArQzGò:3N(,I> .)G$m=ЇVpcs5TEBp/6U '~9C(4x[U~Z: #trDJ|rDBIOlV/^_:( E_[PCCάmXJAzYHCj LEKm]_.;{jXwn^bB#װYi:~ҜV*^|Oy^Ѯ U? V݅iTq3L4'D j eTVuv1 O8]{Q.{uv!U]]Coî֞NigQ}ή9jfUtc"1(Z  kM(i19AY5۰y@F)y6opVA9?'*M8$ SS?|TPYQ$eQHxZǡkqѰT:7,85ڤ9Za[Q2F Cz&e[@%ؖ,͑2MÔQ-)ύ?LHZ)X:vcѴ_Ae nK^jUp; aq~Q#i~ͣXܭ 1n:fLCX ?koߢ::oh(8w~-{`wo}) 3 H 2LHd ipqNtqa\sUlXF!ܱ##XXD NW1HЭS&LB QO5gqh4 K$zٕ?9N}Gy`Vɔa \:I5)fMw],qSQ gr798I@Xkq1jNr#tstH@@MI u߬Xp' (~:lyl-wp ybuvfTwIEhv6u vc2%,E;W%kw970Zl$wUϫoO[H CoϞ&WDž_|۟oKu5|\T'ˡY)tdi_xu@@k޿Ku99;$j)&#;g_I\ ܫ_Uu`Ev/w;5ܲ=L$+|5Qː0$&L0P mMLJz:CJ.(1N1\K# RQ9w>kLG8wY`, y=iZb(> ϖ hs=>|ż~VƂ˜ùcQm*3c(EҔIjPnE/?.ϨQ]2+ʕv4 644YWF+Wv 7-|ixgD֐F jȰ=+yTg,w;So FS@p| 26/h߇ {{w! ]i.vX"C6.79;pD_1 dJ" c?jM5@CSW` -.:eP/gpe~FȾE,XN{TJV69w$fUcdV(Rʥ+C$ͩșK3w/1j yOOo 7PU3MT@يE=X+\Il WRuxڴ% w(InvBbhv"ڦ,U?,֊Z*ED\h H\BT@gSG{VW6?Ȣ3青A JE[$˳O+M uGUmSCo\ꃀmbV~|Ӗ( k߼RUPKؠ+k2}ha G?\F-wVQ́SU̟N{RՓBO!'D\y~P%ؖ 2p!%TC}*|9504i UBoUz@#u]4QJAHipZXfx լR) { &.!9Vg (DJ[jgc,Uʱu F!: :H!\CE#oA DrEn4t23 |/;B*H B"da`09nj #C2 TsFD(ⵔ\( B}U]1Y8{JZ`[? G8ߧCf{g°GݨLߜ7(I )e&]LG؅96rp~j=cV{b;lDC% BX9VkD@QH)`2&xkm<+9I Ձ3l=Z%TO$GC?H  `"!D  ot.D¡ ]x`.ldIIFzI"$yG %@!2s 2#$dXH )K@=X|^ MCnodiKzv9` XHr5^R/ i10`,4VB##I LV,jG!yq]aSXe:*3XQԽQFeF{pKr{EeSHa35LS,bjToY懨C֠OLvDxDU d i^~\y53\ðدI2Mg>IY&!x_Ožw}Ѵ녝=٨Wv?,m~|g[nF_*>*{$[f& f2ÑEq ;w׳wW+'#w7PP\KDؿ?}y&4~zkHA'v,Pn̺AzߦMeZ:k5c(ܕ_un/Bs>0x5>8z4/^<>/~|ؗz>|󗙺Zw6n{ԓ{YZ ^c3xQRZXWG~M3ԗ`kz'T%R]gc}ずz}XATE,?ys|OW~IMkwyyW'шtkJUYa+| *eð)V@j$AXfYnҘK%Kΰ+{8ƴl멷̷|y/W3sOFWDݩtPEϜdvY\ģW3$~z4Kn)ͷM7̯ϋa2-MfX{3ŵn|Y3<7vkͪz7&13 E۴7 Ik=e͠#', 4I_esz1G-olʯJ׃/l~{GY؏Fs68l۳W5쐀A@-;nzuO=ê(͞refS/N-2MNY]B\dσfŋ)+'M+FjJS )!SagJb :\Jt, t8@00AN?w1߾@v+!H d@2zK7"ARF"$vQE#D"AHX#D"Ȭ&!RE:0J*$ лZ/sA;:oWF&>7!wvB$1F"- X ABO ZFB#&&Ո&uo'hŖ.|d 3H SHc\p DS:EJ*RhG$41Ʋa .:\rHZސ 9oH$tx;8`/F"gPx;&An0-lwu>Z\\We# v{GCP=M %P2$4J.tKϋ/v%߉;&qWaLGYtWI2X,s|1gv|heSQ3Me۩Y&Y}gMr=R7l[$s>3ߊiiԏ'6ǥdY󬸭x2 Qu5nW&֤%yXCq6Wi}uEȚuѤ7'jΰ$5f.Ȣ5"j49+z0/wP1ܸ[16McqM6Տ(bͰn{8;{?݌7Mݩ0I[ske.g?ҟf!}SKBSúTyCq ]Խ-|Xjr<ٽVӾQ?>Yyo>|]r]Ks|)$S{#hr,%m IRpYHI i8|BYz|'Rpl v(hՇǻ3udB; lW \{IWyvO1ĚXL-iakJ:HӰeb2f.Ga+K%Fxk!Vo W+e&| [ ?5bY(lh\q=Z/pJ(@n\W3v[{O }gXzN"dx}KM!|oddŷ_~GΟGA\Gw`6aUB.*v\~ĦF'Wgn^/ C]~Yy>-&Hci9W~sQ )MSMӒmyn%*g+w8 qr à]Ѡ\SFw0̇ٴiu.!/_K ε=bR_0mV ]$ zUx ǂ!ΕbZaT 2a1Y >c >#k @w21ake,㔋f`'UOXCPb c =c =c =c =c =c =vG?sy֘g}<9b9K5FΩZD HKD4^/sp.=;^^bKdxPEκ~Zu .tcp!>%-> k =c(ĀCfAb3}9g={'Ry-Sk-Dv]jO+/"h۞a~+joBOWY>CI|5a's78BS,S i 1*= D!˂L]YePw$w\;C̲>ʱh>L:8X`GzA;H󢏹|+9`F cv;ߞyfrlKk{ ?2DM>ԓp)T9XJ d,SJTJ`,uFH 8:W?['LH~(ڱ|LYtmuosSٝJš @H@jx y " rJP8)^mZ_̬J~rNBO]l>~ᆰzZeB*Y˟-_ٟh2yS^af4X Kީ_ .Z ](UgMVwƾӷonfU+e$AwVF @m"wD&#*?{jG(y@g?Pm-&7eiFy<0+X=ʫxJ >Zou죱CfObġTc >a.#<jt:YءK0Xlcv0p"1V)$5cM1噐PRDd0"ʓE6݈RNYָY~@_^opԉKS ofr5Uq'z r-2":աõ #ώe 2)#9TAC@J!)$X) 2 J81Yv*J8|ˠ[ͯ0d)K4} 9ߗ&~V^h{p-PgU\e g.PedmYQ50O%on KxK[ xwCR ۥ/0@xuGT%tpn6/'ދq_<0+wƝ[Qp_TM#-U/W 7>XܾmO4Fw#!eveAj(V<BɌl]]/I?]]XPZ&AhOIWauB)[*xˊMrt+X*̅Jrk!!`,R\Su c4W}p>$r5_(&|QVAݬ[me2zkcɳzǧ6C,2 Czu(LISP33 cRGt{](1)e:)hS'>'{șW}Ng Ќi*$C B0\n?gWG $B~y H)(Pi3Af_bܩ3VPݹ6L@@[AY3~uj~E@EՋee3łgan1̪'*Ծdz?o1=59`3jlCsdE^㉪9r瓉[ݐbt<f,uKSǢӒyt ,(mU8JdI*ɖlG:dX:o>864O~V8 ?h5*=\~:=Jks/JϲN-~^$M0! ~B0!y=8|lސ:ퟓn,7,ۛV3R>S誶7t}+OQ1ٳ>})h?#rS=((1im- Df "BڔsVs#}-G~fo=|/ LV~f$h,+=>gNlz:"67g2[ Οݓ <)ƙP(x+6?N[?Rt_c_ݩkwbֶ7GP̀l[wKpD]ً3vN7Sι[ )2(q&RũІ%a냐}4`،F$eۼ_Q=|G~W鄦qz>`=/!1^n r<$K~=a)d:-fݏ/{haaOˡ%A.fDZdfRHSOD5~Oa.(*F&#xB զ=.>1?ib.>FAl ӜI[w[‹Ya‹w<_`e\IQ%s*e3 >'/LI|ʖ&/雤!1 JH{$5=H"42)晒LL4j4 Ajy*RHᏣq V(.eZ(~+H4񌃞4>Ƈ^8Ԗ*j cev`O Д" ]^xv ¨؋B8 E_/W4{ Oꎄ8Alh5cp3chLSydʚիѽxy1u_ի}]:Ԟ$s\)-*, PGf% -F/}꒾/7#/ 䲱 %mKhQw55饤TQ9p׸-3ޣjF|U4;.27I{.%7!޼}_s#b3 lqSRE R a"XuAɻw|/_]| z^\=ߟgOn'}hsK5; $w?U-5Q֩bŽ$*.! C$dͭSD lm^ɭN>~uUszk%λOMvW=>׫Bygrx֍ە' a?ߗolD^C:: 8sm~~/{6 eL s tx94vN]qha. ]^_7{]E@]][dOOcyǻ6|Y5 P70 k`:vñ IQʓ/Ф 4ǁO޲$4zeͫ:6PeBQvޝ C æMY@E˝WC!}tEEaŭS{ض72qɔʿ6ϵ-V ?i5[[[_.v1j=qhe>-sì˟Ld^,'DΌnm^{@e'im>YgPǷd=Ri3O$שU:p>n5-Ɠ> s [-`mOҠ\4o5QpF}xyft8=it9)[ݝͪb45f] }3S"SN㡉 )V0*T&LZ`4XT#4!Zt-'!KTz6ugї+bY\˕q2.W.Mrem\˕q +c\uqqa\ulqnǫB@qTPd,5SVt(brL LF՞}d߂9,ˆc(FwUx nw=5IW~7)v8ZYҦX;hh]E:g+1גi&Q{4*ef.t<âXKCE4iMwF4Q7inZ&ZlpgS5 SPrx֍uʿɹQ&iaa$"ԦLYaN}P,<4H:o_-W/gwJJs{XJޖ7گGP>g8TݓH*1Mݓ *Iзʦ@a3cD=%;@rj̸_hXYt=XUjs:#*K HgL350.,Ld(ei#ö40͛՛_+7@bw/69>{-[[[~/~ 8-|-Sq&5ñ-iorn5[/ݝG\ ~ >+3gpA"E !` S9)NP@-38Q]Nrk -78۟3r(9!5SkXsL`m6Ww0%9$ ÞeISCs˃sM)˨ * RgZJJ]›]{'o~K9JА_;F`GyUhՙ9xqGY%剛#KYH쪴/Mҟ>C/9*y;vd۠6QT\&ppfr,:M~^]m.}]&CϽGsUcϣlZ֍r^a/큈u1r*Yj4-z(fIjnx٢` ҅:EdJYޝ7tH06gI8 7k:qF+)$ (GȿdP?5?MdA}W*W19PpHw8rR|ԣ8VVŔS+zfmAh+kC9âZ,<(b_֫!\G~wjlzwsQ_[(͊X Ntny?snxk]C% Ҍ D}OP2l!ompEԽdE֞s ]ĐrΈ|"#5H%`2é"qt1 u.bddjjmkVW~6K׽g& "Wa."8rޑ w`POs1^lQd4847"#CArP.RP1 k nbX}]GYbਁ F9P1#_4sJÎn"V+U](9Cz?P'L PL(bXBQU@fZ]_svo_+thC({/7Or8GMxi*Xʿ_>\odDJ[FJ*v^M>[Ob,s7sWo͛].|(OkâSM~9l)w;GûډU^p\}٣al(c IrPJڪʽP=6-z 9}rtcIBӟBį+ڽ; Cݕ}wߴ{ Z>F?աsf}2>R&$ `xmON4)G!W,RR%@mJ”3A)GM9B۔C_  ޠBHPq8Vۖ3Vuvu|vN@>>.ə8 (atv7HR\*eƲ\4o9#cRbiʁ;2LMd,\4c!H"/p m$A 뛑={8 g+=RRIHTJ,5FTGgPS͸ JRb :%K%nΖayj  bIfQG p^ IBIW!hݼ:L|;|ҏEż=ԏ&~*pTc,"1xE{!0 .b[#EމR.1IGFj^TL7_N6 E ofB]fվ鑽coڭ+?׹QH?bT/0k@R!i P0)QhFa&<'>$hH{Lo-+^z $5m 8p&͐P 5Y bohcѡJM= 8 wy5^RBUQ xFIε`1#8C2E1'@RA !.I#Gj+E|׀ne7a!Pqq0\0*_lۙ?͠vRr ȅ#LrH .3Sj(Dp"lqDb'O-`ݫ{g/S&YD[b <+~0-hM\R!IRZY#S3$)*&%AnN}dsoOh_= Ua nVEQBs3MϟSSCWϣ2M .tV$*]*7 kwVQny[όQ;'wՕ\ݍL\‹d45ߗbVnZnBn#.P̮TQ][s۸~ׯ$;LQmI\qLj_\ ڌ)bg~v,RP#۬E /fU%+ʚq{Zi GITҽ2}9TA)RLX񳨌aw!t Dq\G`=kJF +MmŹ/VR$h8O|\@Ez`a㨚=NqsIi.A&d5N2LWoA&"gY׷R^ |^J'ֲQXWBLB*''ĝ'R W\5+}j8cTeDOz"Ydם1Um)ϱ/2D7:'J?1}fDŽ=kسp0ჸ?gօ܋+(6JX"n͸n,f)XiCً\2evlvN;3 s\9k[At]4m♠Ȅbyzp׃'N ʠl&P B28yd3;]>v-6Z{@8O&EO/&YV?.#ijMyirb6 \L׃PU9Ա|JB6}Fle4]@;1P` 'I![VEQj'Ъt멃^[R0?ԃ^Nǁ2-@ƹpTnX(Q3aF{x,l21*lL(k1l/*rw%'JsnCzA^>d?"}!<}=vUek["vDfvD`v@_;-,"d1Mf7n&e@)|F=]?Ԧ 6Hؘ6&-D-lur۪kZWuڳ-} ih%H{A,H!"A8uPBQ BUa(^zmq\o ᄫ ,K3CuOFRcJn^'#JKͮ{7N(uJI튫>KV %̃C˰Bjax:9C<<桙ZmuݠN2zHgG=DWS.LT4!G` g#p_݉y&<1j7|:VHF<7DODDu 5[mUu5W$D=ȑLnkKGr'&{i`X)p"LbY`=3OB]޼Ѕ$$[BHlzDo xZf ʻQ0`<+}%&2+T5ؚfk{e VbB+x5܊XlbP"5LUJaܟ:BVd4Y+>Ms %b?j?~!*Gט0Ʋwq㍌.1 5,AlM_yI44ACo(wM5l+` QK:[E|Mg'JX}ylf 0avfh}Mmhգ! MaT%MT4GfR_D-PGhLj]`Š!tKqQ4vV3i:kB9 _nf ڡXmfhZub u^4Tw` t3k^IEd'2iOU+ODȝ+ \'KuMÀ:z3͆ ޭP6U@D74,ohΔ8"i6ᦪ3<U(3oJ.F{nnnF;$k?ʍKs\&DTb5xWrǁ3m' nj Y;9=} ho}dzOg/z+\LǧÉ͊8oDd*apߍnh!ճc[vg I,o574)VUTo>oWy9+k= =jOZ!ݏJ'%MҦ녵|&ƠYnb_`P|KE&8t _ 1ώEA޺o.Ħ(,97/EaVf 4 rM:~б,ݷ_{+F5%"\F>Jh]YF.H5~&S_uZ4{4Bŋ]O0O|qj `DY%DvHsePیe3`[8=>lL&eAT g u&M<a,JkJVKCÁݕ)r!Hq(ٚ>#BO,m9q D}DKA[+dkgdgJ&hC>1uœ#5lq/hfǽ$x($1}X}\MAa1yE3%smy"-2_|:?e@D {$$[%$r4E%Dє0%,i u%:+:0>ϯ'aPXj2"jcb˲D&6E%v=%#ՍЀDj.G%zE!2/!!4HOaQX*]'nA[D5gh"eN؏a˵rG\DV9KQ/%mr7_eM  oGU RU|*wŖJ pB}ݼC质3So>=4J*O^ޟUs OlWٝQt>,?F8cTq]^eye1u) /жQq ?%7 xs=-]cu]'j3(1R$LT7I47\og_:óT[qdjIm?ב\\˛rmoʷG`M>yB퟿ $rwQc|P10“L;ZF a@D-YFkYҳeKo-s"N+,◤$*IF$Jw񔗲~5wZpkOm/z?Ļmpxom7u5]%Zj+=m]۵p8w5Sspj:yBzn} .It`؍K=;D07?0y/{tqܣQ{W<=>T-RT 5t)n87 C%Zฮf<7m_#oSD,UxFy1K#R9g4$S'#bNa*uJ*,2ڃbei^*~U5ZE]v(A#ĔjѯpuW 4Ϟu~q?#7!Oڑr~#T]߸a}5k0yP<*Nj֑::6g[wUW32蓦[mWmMb"lRVkq[JK;/H9ݍXjlֻCފb}(sѯ^WuU- BЩ4SUL xc';f/)4*I#',*Iz`x%‹alJWY @@¬:H)IM hHc'8 DIz7p,cc4s5i!x89]3iPY,OYV^ i mZ kÏSY `/mwgASRΧQtu;t:ik㸋mtʹ7fQ>gs]z! 弄Q bwhjuyüzpU7jv> aot:2 %-eJ(lC b\A<Ğe,0=q̔s1lxұyCcw@{G5tG9KѠQvď:%# 4#Q_:.+6qf$#0+ډLqӪtAYe&q<]4UTwϲ Q7H)gi^u`aef(J%[&i2牂ɢ(&|RˠQU^Ͽjx`ta\Qd*Oo NIj磊ᓱOc6!)-"0aJ &7{sr L/U8x ?.fn])Ѣd,YlW]L~7c5SiHR-!_>C\8wY57"=$q}c6HP,Oe&hV 29:Fz]첰?ζ#mgwӪЗ_sVZmWnfv'UǷ/ɻ(G;_ßt|=r\'8.>}'8ICFQ*Yy {u|:.ſE>.~\xz='_Υ5A|-͡{gnmsmv2XL7U0\\,V0Z;6_/w$n%q^*ќn٦5.hYKq[9l]H=tZ[gV9u *`r0eR_C3%vPTݒ`dw`)vzntQJֿ"s&T/Njw%MnhBs鎱X2ݞ =UpӪTJ ҿ~R )Jm)TD٢G$ރOK۟>§%q:JPH:CPF".e?28PlI P܁3sG`ӭ?P U5pptj4 m,d`%|WI >GpnVr܈F^U32N茸< ΏodR=R:M.W]뺩lޤ,)YEQgD"LV(ExSbue_٫)sˏ6V&ؗ8`%.l޺iqͪ6k۲ YBϊEWj7;q%@ [B"@N G"vP5l*_kZ?O.$JpG)J΁V { ] nD S/:lL4_p4@H0Â4Gֹk*tX;u]Hg.CV_ew&l^}O xr/RG8IUEQDSNJ)i% AxR[(4j&S) xSJP;RJ C5 & @!(D/9Py'B@Ӱ@[Eoӓ@Oz1l[#N'2B8׉)$sĔZ &:RZΛr֠alJ$]>2$%RVJŏ|X &ߟ{"+#zAtAYW_#cZ?f'+ `+v'ѣ*{s%7Z߉i6g(O3 &iěsdSP+$PQnw}"KKr ½lyl>Fe7`zAؙj&*k|g'PG/lw~T\bG>%+gnGp pȝ˹^ q VwHǔ3Ho.Y+]nx(%gĖ ^x\` #k#0:c@:&LTc'?i휊$s)`:Gk$gHbs d1P"\%6V;N-ԌU)HDT6#UQD9$UIO]!hT(=?P PzJϟFÚ(Q͟)1пBXQQAD!seHE&2$ehZvtnl]Wya]^v\`֛͓Nmh{_+-eƍ5?l,l {U29myir(G>`5nχBաVƅ̸m>R/ḘL wu=?N/Z>*j < LYG]U"O16߻nmH|y]*/cӽr88m jo~[kl\Zod«t~i`5 ܶx4N汝8"W(e@0(í?HrAjR8U59@j<)< ݭ{!Z$/3/˜N"jB8C S'LT!*LrF05({qY]AL0Y115KS1Վt9R\ܭ˳cV{ca-ڋ"[cꝋJ*Y$V4R:#1(cRsfYrPtHs<3/,㲹?e}MMve-»]iM.]Z]*S ;>'J={Ϧf9Iޛy^>%D$[܇c'eLEdDBf,<IB5͑T2KHEc'p#Udv8vB nwNP$;Vr%.7ڟ7D޻X%D'Pl &P@j@(zEO5 =8=G'9[tc}B&-^_b`! ,D\8k?A`!  nh`!:Ao-\[wίķ+1ۿזjBTQ$Xrc(OQ%E(RM.zZfc}Lǣ2woۙ-V2^*یq!Mfqiӱj1= dT ȃkHb,v~ET"˒lV%Y}OLAZV=_^7𗮊C`6 2~?e;0+v~k癏K:_֬A !}6bi1O3[tMht:U7 3Clllv~缸zZvYV@f /W=/*v " 6oA& O3ܞ0wW ' ='@p-w@P;lD$P_]->BߓGg׃ Xy}+Xz d@ ~@𑬜~ xt?r Ⅽ D@ O||09 u70mrBU3 'O yXO|Gf@WZ#FCxu:p@V#%Oӿk]6k>]9˸nQy:í\S!+b2$MyQX)Jq,)FH4άlF~0(lR?&:I>﫚F19!SR A,E!!< PzR:=ٔa2G3#FDF:{ q9r8 V[|en9"iQ;Fnqo!|? ƥ/?g yq^ fa-sR4ۢJG xbv X3ʩJPLFai)EA2PNRH4["2I Urahhm3lPCt`2Y>uc+IUBeI(i,e I:6ZEI]V$VLD̕W<,lP=3,xQ v&Q$R,|]'5_Jv(~m-?qWV\N, bt8"xOr#2/ױ2牍a%TTHGD,T ˔qk3M2XxH).*ھUܰ XwBXB `aYdPdE?({ N,.cLT(KA1љFb3(ͲegAplg)g-v; {ȃw߻?tF8= [کL(MV$㜢qXX\HH+ bZBou9oXPV>{ O+gu'ƅM1&31s8.J*ћo߭X [ҋxeC@fH``Xz.ٍo[-pZ~\gR?_OUY[!Z51 !ۀ !\ ,s8'D`E8nyZJ[lQaW泱ˏ,ʺN(~un;Χfoޫ:`k -`nNpŢ+n흸$3r]}0[܊דk3*UAZȴjؘrQ27 H1lؙW_a].R ?d\d^DžAVaW])h]/[}x֍w//ô:k4{^y<6>rpO$:.M!wZq\;dp՝G\޻6;tsX in#>\ZMnw&l"-;4jCVO xr>g֧}\"9r+`2M ]:͇Cڍ̪Uh)!5 ގK.9=g%9y߇Y2\ /gHQyjߵc±ujˋw]k͢鶷:6. (0̓v>.,~A#X11]ܫ6;!m݈/s7áy/\yPrrÕ>>gLktz O ِ^encVر}M؜DZ#hMx\/q:C<'%tOS8aC5^gh?{W6TՄIc_Y-˒K!GEH0AE*y.}?6% "!A- ʗGxv kOʳ8WjI9NuZg2)ǩBq+j-Hn>hn ?9Hxϫw<-^}ߒg1 ޒҷ%цgCuno'j[ z.Gh+{71Bя3@n:5OWx~-KE$7k3A19ޞ=X2m\x~}o@F;&"9DtQ1 4C5EO5GL(fϹ[TXz-iV5rς ].!2pum Ho(V{W~U7&\NhPo2vAa7g頰Aaߗ86ځft):;l^4M݄݃f?&P\籒蒦JzNUK4Ktlz"1cwVW`%-RV2TQl%3 ѐςeU-S $YuF1~,U+~A^C@y}WU><~?[y_wҴ@ܟ= |l6boGU1ZK`5Wux>jˆn8eʄxI$G4=CEZS>_[Wo~tjShKCHϡjn`1-IWeIULSȲHzk}leˀ#*kVK̆5fl4m3),4;czΘ(Yc~KR;{ʩ'xzߙ R/L]޲ _3fF5w8.T[TóU]셸6t (_?JoU3 Dc $)b$a-=c$h#GiBȀq0>@SoWӲe(ƴaIhHK1:$)T*I]}t~-,`v`ХYdƽ2 Yel'MuyaGqaM P4-yB$"~6Ǫ0xy 0zġ{Ԁe{fUn$KS5f3$0䪓 oc,Rq{~5v? naQ6sCqGxvKkb<k>Ovm"iLL!6oLɋ?f< iU #_S%it>%ʲWT\SMu [QQC]r `71+NW8_(n*,*(h{g TE_*+*Xޞr&ox\~>5 wD{EWr0`gP>f "1fPq@*$3,1V%!N Y5| g@H?,d yOo`xK9vYAt9M8ZD\(+S;> >Nb(f,), eC6fY@bk, eWwђl9$cJžMPr6xK1Fi(>(c{&vUqzK_!?-O#K,{`h` ?+x ^Ca,i+@[j ~PF䨑d+XRY >,C&'*7GXE0ibJ6d!4_`2DAє g}]|GQH?y0^xpM%H.`Gpnf?Xy p\ĎiLXA 2^ aWET'0C$e 񬤜NApNFa$ЌӸ'$>i ;OH?&SpCK9%g$JE\H -X0QwyаF(R`υhҼh Cc X K4ȋFaDs((&D8gs^&pFr epdDy "8GO" jPtI+ n2!)&C)jTE Y}aI~/݃ۼ~jvm7 H1pvLN|)Tm2OUYkVa_B,bڴh`)<c\'MdsB6xI3|Nb}pчV@^a#/ԍ4}M;Mr"TBd>t.Ѽo5m2nKJv^2n\i섦x]+>R7 [V^RzIݪ9|vm*f#VʰOsd2dI,uILU1E۱eӱ Se{l;`/G7889|\̯z|W ,EH q}a參&OsA`d+RB/q 雸cOIm K8 <SZ NQ*=R"-΂fCNhhbZM:Be+ Oc_8 Q - `^$:e XgQIDp@cB P AхZpS= zH ?!a7  i 4'HlZ 0 H4/($aeєTt  !N8yE@*L+)?(r儜dFc#;T %INi+H*T XJŅk.”і%%p.̅O](]?wj;%*1]Xy 4o VMsTbEJAJP(#ccNt]G@{~}ݟD N6_9qKn,yRB`MedpEXLYsd}ΦdbJ.h âƉ ͝I D>,0$6-|O`#^u?yI\ ,¥ tZr -ή!,4H:iQ8$t^O-,|HpβpARYi<*+CU \tI4UNsz,Mdm;=Gu_3kΞNS켏CEL_ .OGMf-H*A eD ^L >H܂GYr.KK2*g$ ;1#Aݥ$;_2.jqS|Oit bZfWefY~$YǰyG E03  2~ @Nhäyֲh_8〝lc⾽HQ|C>F8xfFI,?kr\ ")nt0 Y9ɐ9/URk%N@*bc7?S ϕ"IP#МsW(O]7 d,L@{.bbTc|Ubl;>(lep {6B>8Є(UܦslU1B|{IUdɨB,W8!eS6t6wSk"~B ͡ i V*6:SϢ,VQl-Gw5$2 #fPG=3gـ3y"U޽f"E>&9RX䇿f'`7>]R G4{P%L-{zvvG_ `Bx%rޗo6VYx ]`􎍌NJ٥0.e̯ߦc!fa Kňͷ07g)CjUՒ[!g&oC* P[{1Bp- @o;{wY~&3+%jե:$u uӶc`ZƹU=c{ŠƊr[=cˏR9v|_úзVmWil-&r_&\8Yzi_V*.YLGf~,Ooׯ߿?tPXz:F1^0fv^Jjoo8Š\;**:[؍]U>уMiM͇IV1vO !qD0V$P (ec'*a;W9k&j< tä K!:1i!+du^αV&pnMƠ6 [f@mjMج5ɶA6ȦX38 `0X!`Mm ځ5A k%X38 `&X5lk X1gMGX4:>p8VS z@Y66PӇ pj;X) bgSPlatGu˯mRL>#"bBp1'D&HR2 <#eY&eY&eb \P`'7 !u E8l%<&>^K7p Cd_׌ד{P^cq:*l;adJq%=a 2>8A K& G5:`oS1vjIu Eq0bG?úHQF(Q 4)R0EHcL`6f̏GO`Sc<5Sc<59"L13b+ M R fAnh0Вg #*uV2~=,swc$njūh dK&uY>g0Cu,G|?G !+Ȉ;6鏏=na_l6A@U4J˙j`sǘF)1Q 0 zxNtr%O=upG`UUAzlD'jFU݀VuWHT_clpNVC5 UZA+ԠA ARS֠`Kl Zr0]7hT/xT4A"0lC0!a \ϪKŞҴ/7 l.Xʃ!GyBˠ̦@1-#%+'.`l} ?j#iJl$RQSSID01N! _aJ (.%3FG( jRzU̪p:U/8XA[78 G'"NFx?tNe;Ao߸{h>\KyޫϹ.T<=I{үdZt\Ovβ=Z-+_â ?ezsbO:X*DzgnzT s,a$eXUIPpȣ#„/hG3=Lf>_4ӑ(E+^%8d{:/VVzq}˳Ёd_>×W+|թ*4Y8x R8 %HGIHHC"I̔21Kۗhu[bWl-_+-KgI#U%ZjLϢ:h+Vb^Յu#UUfN,[; N'R;+F:"QőP, s1Q(Ugt! 4O#4O#4O#8k8mv@F S5: 1ZzHBC 7S3|¿[qE&Q$\{X6.:k|侕^ xbۡ2hI걻V 47I=TIPP2I0QP8Lkvxpǃ;wo 6s0Do/>mu2/xHVH _3BQ鄽,qM>iJQi׫K\FL\ƭԛ ])2 )TD% !u p(8*V&ՙ?r%΋x/:Eg8!M"^" 9@+ԇ9s&tg`ج2rG|̝Tg[3sx!ܙd+ecF\Ʃ4]h SHp$DP`P$!E{5WO{+}{j3YxK9ͮj~p}Vm'Be081BPJ$"RFd{^qP$Lb$Lb$Lu¦=o5\'=luQU.q#0 @p">y*-<b,*]=ShpT! H7(A8%>D,שSi|i|iRM]h#ڣh-c= 녣%&AÐ}̏PTi=dQ<{:Z:U?@jW.;&˜aĴY H9:SxW_~˯]~H=a;3ĠXC0A Cy ).b"V@ UnB4~VaWG~[fx"0%~o,xOAw[--xXkr/ 2,9C$F[@߿Ox;~I_;#͸&/4 2N^a6inN[=ؘ;:[YA>i׵j` e‘)Q( R0i$`0L"b"Z_k ZKL-B^@h"@WʱTY/BEu,"- R08 D$Ȑ aER7| BU W!<@! f!a;,DaY=&3n^/a:DpgÂ;߬ޗ#4}oVcoV o z\8J8Mi$Ha( x0͞ !ffO=M ^Ot 0wGibm{<{ĭӅHԡc/)4o#%6DN:k pFB"3,$91T9k<#iz_y|=<ݮAҝ<8b&>׺,9Z=ϙ^TM6*WE^畵뼵=G*PI{4\< tȱ[7A#‘ E"8I)%ĐG Q L(E7|'}'}"0l#Ɗ2h}t"v Cwߍ'㏝w~~Jnᬍ$øZՠyz ,a,pQsܳ8E̽iaq:=gĂ:`/$)JCFs RD0$ % 0cpD1lQ̋wθL=VLF nh?];'zsH~[y8 _0x;:80̏Uea6W7Oq1k~k72SGYӚ/w> ~j4MK/yvH3vXSfV8N~ fɧ0Ti~IiN}]V\=n;Xof( 0alk(` 6ɳ q(dAE5OUizbfrYfa:B -GM1{( xE 1^w󷿙_Oy dٍd}N0 ]}Wp!͐4-菮FAgWв F]ed?WGXZݩbnt+pauqeKh3m v-L\r'C>p;ݼ֔s2_<~U:Al|5à󷍨aк}){n*?kC"ʅ $1e)$*&nj4D4X) YVP>S.O.x ))Ha(KMA!vڃ*gU IE_.S&+6MpeeX<ΙmMtgeE[ZF_}nt2ͭVַb7&~N䭲84.Ё`uWO*P})$F!e1W(Ҿn1V*9 clڂ8qڭ4U3EA65<ł\W0 `e_`NiqU;w> ulƅ7PjScU=~ѨnLϟ Vo0Yۄ וoo6i(ܨ7U^ٰ6gϤިz'z{`-E ~d~<u^ӤZdlR?]͸0+rIG[Ixj .g=?` Rr%91KBP,\DI2v#:OyUe"v:vWڕ~5?0Yha2GOVj0~?&j4b kfi bRGCL8~-UWzs޵^g/v#ʋD~:lDWy'aѱk)ɥպ(}Y@WɾϻkBMke_:g w~''S/Ј%2Y\nEr Cd{#F2*y Ws7ȶh݈]9[TXaH*BI1!QhFbE ۳'  F_7@0[0q  (#|E(@>P(n`єdo sQ'!ٻq,}`lMl U[qw&tNW{R JlQBRowb Leɒġ@?|2@r;Z>}o`"Jx?WT<ªys{믟~:\P:b6v9qR=.R<>@G4w0DizPR2LKѡm`ܖuV%T+>Fvrv8LphGD>4hY?L3~WNj w-xޮ,fSk:\(N U8:^޺a t" 1 1rud@:63޺/[z* 9K{ xVPOUՁL$ ]6e³ы/[Pn8vdqJ5oOK7{2r]{.|: C؋B1 ! %:u]]~&Gxi" >уBP;=ilΗW੕;RE4WӇ4^:(uejޝnrʨcٻ.<Ǣf;GsL9-=xQ1`m'dq؁ aSR27utK[\GCZruG'2v->'TYitqM]cT[/2P"+2{zD de\D#A : (2 -$l+acl2=Cפ'pV"Wd y L k)MgzOA m8vmgJ%VڸQvN-"Vunu,Um2IPtƉ8ѵG ٣.tab xeAugO7RCdUOep =UǼ1L7SrVHI(׭ m G0aܧ~"!".B|36KrYGB'X\ʹx=D6- 3YC4(c4[ ``4~ mDb ?8 -A#bg\REF'k S /y90Av?Gʉ@dғ9UJoױI,DFzi~d| b]1R(b}U:7xp1B MXhsqf\7sq=uL*"Yc"vzI[D fN7@$ }0BGq 8'4h j ehI;zIeǤ# lQFڹQXZTxu/$Q[0VV:c&wm eS3.avd>Q 23Z18یsaSyģTřp{.ς Nio}#a[h߿m1B2б] a@/Hև" *D}zI_,͂Lz5rLn_· ;Ji~ΧXfSNz|~PZض c{ҿ_[Γj̳Y\FO彡Akߓf>(yDI/ hjJmbC6tSK65lL_Xv.po"HΣi]d"8>68 buP-/ؒy<*omΘš4='+)3i<ɭ$a4I8_2~6)3q~x_teȭ6,Ƞ6礄@R0Ы]P"K o%v>[%r}$/o%/h=.՚'֘'@\B&w9WmS@aͽ(ЦP5FqwRiJBJG\)C"x{**UG^y>7xkc~I,"8D4^!s8>BOC*I5JB)a-Rho26< )Ցrΐk" k[e]4ʷNSԒo7O4 ;e #e8w|IIrBy܍Z֏r W$ {!$$)!q`E?D˯$]b$YϊWV/}UU %(D yaE!e3Ns&Nb- @ùZb,.ø?K,aA<**~,jټgQ/-.~ϲ9Y^⅏Bpt$" ۭ'pv1N!Wf-[<\i&VRl=Jz,ptAg $0D-S Rų` `3o;4C*NeyFe5!Nt_ *g"7M_=Hh6b4H|ᑢ(gUa>0 X; BT MG&3Bụa=Yfj}b$j](t1SŠjy,D*_rʡQeeTkՎ ! #Jδ5_{~q: |puM.^>tz03N0 bA΋<`c!fj'lApOm'.` 1p)v)q`@u}64$ Q= \ ngp XlZp;`9 ZN[țe ?VQcap4]C3 lv361n }3H"}:vBߎ"ۏ bF0π}4\Q'=b# %pvۜfeVqg# R?>! mOQb#ZP[%i,A- %TeY uz2!pCz\3Qc$!E:×k{}Uvy5u/88t ip8}NXN5#̾4}#` `i`ٺ)Ŭq?nN 8 awO%W \ucK{J(ۍ(p[#11y9r͓~僄$.(W1,Llg&' |/p5:4bifZtm~bRi GPNbxm@|ŚӎXFdO >Viy0riK\ڕKX3) 6UBOA3hm?rLJYs 4Bq.>uOI$!$: JН}VwPqf` %{+K4)btX )gAF's1 { p)P&wd 4>lm  )|ش( &6_4NNi;QCがg=ͨnFu3['NmpFBgG\78r<mBm䅮217x:oIP/ec6vfc[]yWI}ONc=q`jtǢyc&}pn7F;&]TzaP){xg%KUL-)e:Kڙ뒚yn;쫦*Hipϔבj'p3W ufʡLK`{Hq*y6B1^#zU?Y8̖S(!(9 E.v=q@C$T.~zʸܜUJ#W|T2NT[ؠ]XW·qѯXՓQ(ܺ-$SߺG 'W,Bc+aB~PXO\>KgG1s3&~*S(^64561~T{Ǔxj}%}..qQW<ֻIREe'9YX>Ȳ0Jj|7l}Vߟ=(ːI,t՞32weEh}c}ԏc-ūI](~<ţ^4u.sHǭإtHm\jKZ:uؔb[huZֲ35}~V~.y˛_I/&.ժاHWA_'P=Hֻwb6@{*% {YyERҸhTW,#Zl_E6]ROq˸"TzO}ZW[] h¿dl&,qx dG]dLj׫ [8 KإUt X$S$Y*wLte0_D0*w,fZ%s'N!'d+{N[>wqM#Jž|8/uN5waMNW3 xd4oX^3e.|+B/Q.UIPӟ>KI2 ?!fxy: zS>#| Ű_@asQ/SgJLr{3㥘̌t`˴W3Y$S8 Y^5/8ςG~ci:S(ɫ?"`#ŝӂӢOH}]V2M |].XoY,xfq m,W۶vk.8ڶ[voaW]q?lXۇy<54I5z/7 y&.p+[kQ,hЋ$~2a?i)E&2uO87{ܾ%o_y{q;}N`vc28¶+(fԦ{ 4PRmq ԒX̂tm PaB]+?jbģcCIWe_LKtxx " _q,Đˠ+c&]y#]wy]XW1+~Wfte{ݿQyS;3J]yF?qڋwM:;KleFI"2K V$`Ls>6';0./z% }ə4ԧ])WRƧ*iry'}Ri4~8xf<{Mł2.6 a`5 +kF¦`px}٬e_${7ͣ" 55BBPy|@~(LVJAe $ djo.Y}.N7K run?J܄0bhp_+a#^v,I 5 .zgC(qˍʃ^=˝[qKeBͳTB0 snnaKR1q|CAh_ed8c;XnxσbqjCYfmJs}U?bT/0T*y4"QQ _ey^`\(l@TR18:gc(yaV8,@d2ۢЍ#TƎf76=c*-`L>%Ei,(*ʲ*|ٻGw)Eq)zć!Ŋ+^ΙԮxTIb~[_ݑe yԵ\])%Ɗg: {"ॢJ0\t>IbUm6#ujٺkSW~*G$)G$v6 .GQ&vb<}Q!hShQp\q.^޹QKlooõߍ䴝ފ,2$bwN, FKy@[?VA{0&\U/hqCrZ8L{C]~~oYE-L`uA8k_p>&OgGnj4IbZzd$ȖQ3}>V_K:aj5פ-a_ѱaՄHqZ{ycV=&]%=<]8Um{6O NFƹf &(79*QC נs\\`G"+] 9~Cl^A*"x:F.w\f\fg_ҳPLc.G%JURMRRIR2Iqe̢he%K $ : )[! ),cꂉe<KXƲXVke4+JcYi,+4ƲXVJcYtqcYi,+4ƲXVJReʳTcY9 5beUƲXVJcYi,+e J5KƲ2{3fYhd?m*~ u{p맱8O_FQVn½RʘϣcL绋s'*@̂ oO;5sxZ6<ѓReE%}b!P&3(j& %CsC cK^w.4{g/;J )o>7 ̮Uw?Wn_ eO@~~%{{}2g`7|lyeybc > q2 Th2"m"Fsqġ% W겊NdJ pBzYEs$G0ePd%/Qd[ADɏFᭊtoO*XVEo7yyuH'?¿/3; :Q^2Q D9ֳ:>x0)&Gٚv[~=D@GAg3f,Q̉oV[W_v~v_ϒ(yӿ;FL~7#+$!]W~_]7{h??g[QF `V!9 ++-?|BJF_=*@e42x# TZ7@LjJ4X6f. $ֹ߭#{h " 3sg`0Q37%8U#3>) K$g\9zuz!31;q9KXlױ1!'E QofER 8XsLQp~ub6:8P$xB+^i̽AgVHaA8x3ÄgF1 ~tu&/D%jKY \JPYFʩ3<UG;3n 1A\CLS̻]&.R)c`I47<gg9wG-wos.PTA*p+ !(D0Όӈ1Pkg|RnGp@x%#{2;E%)D oܺ*y4j9&D'}e+ ]xo8w9[Rd#hA`ƌA(gnJ|H˝ J *hY,sD(1*?nlƒsc;Ѱ26Dzdޘ/jɦ6xjJYo'MNi8FV !' Hn{<5 1i|CVh, F+c:Y((b[-͹\KwpSvB"3 L#sŖ"4q&/(r+"hCzU*.&`ƂV eMp 񟨴rP*cB@:P'HE ;|UYLQYbbױ[w  =אbR*s*"v|LEWP p949۷\ ^Yb<G!Y f5" d{we}! r:]a9Ko٤\J 4D5!]0r':p# 7–6!aL:dvn` [ ^:7ASuL;MtڼT`b<)9D#gǙ0XڲEe _RS>KHs:»U|W/r4}=Xp&˃70)~VW-v$r -d/;;_C[vA{Gk7NcTJ/, pa,6`hrw(t`mX4&;y2]nƖhe`ʲBK ΔS1H9Rʂ.L2.^WBYJsɐXFR#b1Rŀ`c9v ?e*嶃KXg }aNoZk $V@\ ٫q0o"搨s I`"S2EOxB=8n%PS[9DNOsNb̈́ȣd1i e PH41TR5!gJ8woC8e9ik=L3z~7kptDO >#3pbL{?Lq֪fd|08 qGVƂ]zɝfs@ac 5j|qorEp2&ESqGUqr L7onz׭s9<Ӂ(t0Uy &L4A(kr&WTs'-RʹmnT 6qpќ/W bV N|o&w":Pfo}v5L~ FSQS}|>R ,F:Jq(Yxt= 2&{8(C60F9pX^I (SGlm}"ETԔbm5bdR= y,XGT`8\ISa ! G3;a j"hpJ=eG+&c/ c6g-ċZj%y~ȪVUudfDޖ HRfVdyHLͳ㐢MXd'Te}Lu}Şml`UcjP#V5ƒ:S)uFK>` `GF\t+UK` ?qyEgI-W ʤL ĻyDͩ*L3uU4D{ӔJ{c r! }=tX`0p%8*rzM=8y)YαG Jcɼuvcu הu(-fJξ~V{WBA\WĖ^l&$Tة ;A8 כ s8Ȗ\u5D8,ZI=oT3gy'~h eSd / ̎("͆VP-DEɤj D)C{Jh9ˆ'EZnP-I|v >j|h=9Bin+865J3葉T0Lmvw#G w1&mԥ-7v]bGawOmKy9.iY8~Ai ߌ '(DQX0:gϐbȤ/>Ǭ4j8NM8ah7&jͿWG޼m &o?~moehեj۷{vۇ:~:$&RR:.csG~ո?^7noѻ{<{O.¶Ig>_By/r^>jRח`~ߛoi^tgI2wᕅTn~>~od>AvP_dYP4^Cy&OtVeOB-ǜ0lʐmt$1h3&3nR'ٮ?w/6s=<]XxL7' 5Y]z}xף*H9@<+_r }Sղ_HˆkѯεD)h.Ds 'A\e4կwNz%aߟkBk6fXi#*Uİ:;v_BItWY/}FEH/_5$kThӃQٲv1ZTΨ,v_u([5j.ՃY`RG{Ϟ)l(EJf7yz!F.x+28NYX\&? ށ!k3r̃/tU@Mt+>Ybp fVJ:v2}`t9o@pۓr1Żjwk4ɨDŽE.H*5*bYy@ݲR˘|fl^#RRxhg3Uq@ZoBlr*5s=giʱ g^R 6%B}09hrTc(1=Jɼ]cw*۹Wh~c]d᚞B{'a8uerﴊYTuTh ڎPt[M4)(Q)lDT6a eHZc,Z)ʦr=ۻϩ TAn5;Q]M-hzj":Z< cn8&aGè@ x39Ì[v] 5: EuYq{UbVՕPg_>/-I4шh7uj8 _*a2X#yĠ$ 2W/v߳g\a4ʖy, :9/9j? ZrG̾jLwqQՀ,m(Tamܟ41tpz/{Hhu͡˾eG[7rtLjEq2GU+^D yM 9h+rU2;o`F+ή=[[`$ '7{6vAXJHJmS%_UZ8`pTt!ʹcfA6]9|_l‘ݞd#%"92xW 5~lf;X5|pAaH+L;:{hQ,ɥ8q[샺'&-\^ G{2lKG&hyݕlPNJ%MGF!O"ŴcJ[lݤPZ- PaGUjN/ m-K6i:z 52~\q:*4td"7'l]cag/5'HZ#xO5KjbCagiOQV{s `?(dS\M6Twto3V»Vr>L?}%iKTt[+lDayM1RP-p { W3gjZccAB~yms\#9 h a%t~5" 2/߳tf & ֊ހ.;4{u[xBT+Q}ڠZpr%8_ճ/3C2|~;^ǖlUlr͊WK Yt8rmK&JQ(m4Uʌצ_S ]@<kdvJaݹ"/|ɞ߫NlqX-@5oCPN WjIGLJяN~(31b74iW$I5CgvluѦ3о±XkJ;fNQ;[@p2h+>ՅοCUo$G C~+LjC16v}u&̆񴋌uYע\2<-;_*M-BЉ8,y%|Vd|q @ڠ0#(stGYkه.U$}»z`W $ot[ABQB_HEg:Enɹ֔ 1gΎj_En-Vɋ/mQ#3M^=CvT^zȌ 㴝Қj1*njr8W µFjġި&\W!`$ØaZ1WҺl5oBG*4LsYQ*]Tզ0)b`nFzui ќ^:?䯮waz(E'ƶ HQ($j?ؠB1Eee};8 )jakM/׆ƝAdU.(RpRL/uTye XdcoHX|/:f+H턱%$_sr ++m*^"hAkh/&[%T-LJV\LE^ % ө >6Ȉ !.}ny#uu zZA25Ҭ+xPAZ-=VQЈ" C7{`V́FZK"7;w+vjܻ-lS,5f 9/,Jߤ4)e{oM+Atd(/{n:fϛV=]4j4YӮ^d(FU4jMR f0Z-I8(r5Ά d/c)(R^-7vJ"vMνu7-76M ʐtZ٘!&WhL&8:n(g;ۤ";cX#8nF~<#ok$|6QpkiC^K[9̳jgU\]9nQUH4f5wBړH1Nn!ml>%L`AĒn$*DnKP^ujKQe,{6Yt z0j6[TB.,Sr웋_$҇|f"z׳u1ȥ4rWPoj {;%O 5wIzr>(NZo"ьz X0^jݥ‹fKL[/D(LIVyl! rw4'|EUR$l+Z+JmmĐzm*crvgjw`&T+c?eItYe*ټva% $sӧz7 s؞݌j<I:*$C{(͗h[!TէF^'g^2ؒ ;9Z7Rdc df:cX(k`¥&Eis|IdVe 5JKI!R`{%k2{ợfݚҠuh2F*˪JJ| A[RJP%+$0Y`ӥ//*LB1.f%RΒMcaHwt+݋qD }7PA}_K_E6F紦$dg 9LA}E~Ay?R^_kcݤ?>LDud~%_yk.q6?m ٖ]臧a|?='~/ᗻ>ym7VmIfm|͎Mu{$/=p仛~6[y|sFu×';G~|/_ }_nzӺ_w@ A{Oƙ~!#}NLEU+<<6?WM={?0?m_^O"S) ]w p-ꇏۧOٔ??~?F~n?axƝ$M8*yzl{h$NrԾIRYH\}_m?2b2̿+6%*tt>NbKq#;xgQR&WI!c7`*vw{a׽OWH.\![^.Xc|"Wx<peΜDe';Rr+ |Y /ӗ]0zM/+?-UϏs[tov}!'KǷCHj|pJJN(HC#ߓJ8Rᢉ*אPLbV|Fs/>y+{Z̴lL/:Kϙ[UąSxB&s0 ސDըܡ@Y]?ښH.Րu?2Ĺ9:D3C6t=}t>fR"YPŁєFhPh(~ĹYnF3ڊP|K ĉmh; LY+44Nx#N^ FXV@ON5eGd/J)1D$H89K xqOP2Rjdry," p+3R<2;>qqs&1Ochw (8R( , C#>&ZZxUR q&Aeɿf_L Յͷk`-Nr<%m'ht8Et9 WjxePcQZ n=Z]?畞LNQ pa5!%g[QDQcS(vtuC[K7Y/C(BahةG_@6t# ~_fP"ݣJ@ƄR6NA=M@ѲrJ ~7ۄ`يXE5S' k%qb.9qF$>/*?8Ցuǁ~/ m³Ph%PI9@`Kpt5 qdO$x1Kuy<.E׉'SГ)S+ aLZL!%iVku c ۮ4` ]P7Jr[%%""@i0 CF ԥ2f) 3wPoRV\ !"L kFE> p׎߀!p89Tba;FGD#=Mĩ5tοN$ra SM#FǏֱFDH(!o%oho)\ᩗ $b"K+ A$D01:N.4[uRJ%GZbN.u)51.hrff I <q.NV(0 ]ïIji͒;LUἋVBa=]Qn!@4.z,j=+EIԩsM6o5cDYe0(JI^:`6'upd0!Ê΄d(Lү8[YKmM9CS{.fiTW #@sGm\sb ;p9O)W]j:gxM%P&ݐ\[oͣwB5-oPXуsFGx@Zq;>6y+ ) WSZGI" {#_%ix*Ձ9EVǂgϦ>e,i$tgesۇx,Ir#DGٟ[$s#A'v )l1)kUW+:3%_@%OAuAǻm:ׁbp -4H>HkYn.)-dmy$4ziAr)*@<.6z|v{]=rK6(؈LF򽴓)'-,h | EGCߐh{2}#e"yMjJ6zǩJhǩRa]&J BkQLpaXOwer-pҧPc\;߯A)[G֌KINNJZ,i!ј1P>OTzNCiE+ڈڋCOF3Y<0oW~ t`6BY8G{缾aw6VC(l"yRE"XG 2!L]]s7r}_̓m4F}H*gUKbEHi\J%0I{H.Kp}}NMɃ$I2^߽}dZOH7{yG_Yϟu{ߔ"G`v"&'O)5P@"zz`m~w>e50?-ˁuسr\)O}{裟~(5߽}'!t{ְՌj*|m{c &Ya?uS3n!bUԡE_~x"[,U(Vmۯ7a!1Y[9FGL뗑ńW>j\6ksι23PmȓkTOa^K`hʫNNh㔮 v2lEF V:]ݦ6eymyin3>00lXO:2* J2"F8u5A88I>}q_uL'"I| Vj*7 [9>c*h1kr2صNJ%%׭hJ%kݪGg_[Mw&)4f1Ͳp# rT[p8LZ^ ,0/p1uu%&ޅ)(*Zq~jhI6,K^UEe1dHUk277F]a_@)4bր5\x @oGǙ(K8'2@s#Ln^Qnލ$s%+Īomx8="ٌjf5_1;8n}vX}<FMJ`b \#->#P'mK4/r3hr^\S5F7' `C.}:%KSHd2ӂ@$3L"A@61^ dYmaEKd "ۚ [,=]@IK/J[1d95ku U&CҜY_;\XJz%SjNa9!hWx@m,*l %dLO2fYtj[1wB`Q';vtU=.FS-[?u\/bܤX,53./mVI2{Qr,qŽ E6lT //װ0dGB""j^#'\d¯&.rc@f.0.QH3nL ͊xR9=%SUsN➷Bj0>Ƚ]\ ,m^ݍh~.D+F_PعF#M$ǒUC S^̝dC@"h4?`V}47MuHxl:[rF3 .A"~C4p# m:/CEUdy~n-XTlH&*G+zquMH[!Yq}s吓 B.vQfQgl!kO(s^F8Jh^Ԇ#1`TC{}p7FB[SW2X[ ^,b9{$ ){Rk! /_3VQe)hyM'{q3 EUY^m]rA߲0坿nhIy?&a0Py#qEԨw!kY_{ 17q'j :t!sxq.0 wSGP GOf ]fnjĄݎLȉWNՖ%!'*w7$we9/z dMf.5EFC &Dg;gVNx2$RK_%wJ'V Г+Ʋ9k]FaWI +yک6nD)X L8/!)-X͜JTzǭQkB{^A!j㼷󮋗s"WDz@}t1{\[e":`> aJcs=huL`zjCm:Ii^gAkS9vAlbbij!x!P0 9=0UWZ`I {kAQl O)7=*+tzh ;nRes3xq^1q4^Sa4Zޛ+ڤa|mys=:t*gI-f7o ә}*P%}}lh t)nՖVkVqhB$`Pæw6F*iVW/NҪ # Ʀ9vvQ0٪*i!ֈ%1cv#{CB"+bB¶ K6yeSN^~/p>u>se/_s0\޻_6o {Oɴ&mոlqHVU& ݻ_X1XDಙ9:eG sᬋ( ]MAy47LdZ> ϩ;}A!F1ز05.)ltHL6>xe5Ssg& &[olCV<y`쿑 v`72f 'tiZG6hf-uH/dJYEmR꽤B'hdpcV#ї藬Kg8hkV_|S J `p1~/A?cudaf5{=afpuGNd JFtx?[cHك+rV)JɺǐcEmr1GU8\Ѵ*cCHqU|αEL FdVQOu*,18_|LNNћ3@,I8P'`>sQLx4kf)cHP٤읯v0vUo6UYh«d;x裡? Iu8؎Q I`?<`F%4"SQJ\sJX  lyܒf69Һ(6E‚}LL^D6sSVZiUjP1deM1D) hnڛJY\dݯk0*$Teb8Rv*IF+EOY+aɯKFZW]Ԭ彟ݳ`ڷꤪwSP`{UE$ΧH @MR*fk8O C WIڢTM1g=0 ukƀ Y-qsۓCSd XЖUF'`|)^Pzv 9Ajm_l(iQ$I`&~Y a\"lF%nE;Q%d0rC,Lnu7T@b.z~OxkPTDGFS2X2PUJi]7KCCԭfПkЭZ#Fz>ԫW{2EQL.]D9-4>vOfwN$ !eS۶Y ?}G4)]i{[U(%$RcZL;9#"Vf3Z]l 0/{׶$Ǎ\e`m\}?+2HaQbdyމTI+ ̓s"8 n>]=Tŀr4ʹB!Ph7hU&cObADBݓ"yϔьgQzKrw^*G \M@{W ^| NM6Gu ,.%v<]h4:F-NƤC>S?l/9l)1w.2vlߎf m;48ؓx!||> >"F0XsZoᖭ v@0PȄՔ唀iupj}S50 ,Y P0BYє {۰b 9Wmgےɲ9%%z4 Wy_}iyY;뱥yq 4 lNwR+S+"}䬾^1RUƴ!ܳ8!Y>xQ$Fcws*tȂTcz4AS`V}J606qgQ" h,C$;9tOo(Y] NFPv-OP{G# 9;Qy!BկxC؉K6&Gn jzF7%m?5VTس? a$\͐(&!ĸi&@uo# :&q(~w cERi(z_1ySIJQԓ-7Eˊ,煹YoX;Ƀi_]Q-`g}o2_R?0B[ c<`7 Vi%(i\wSrtb)KOwrqVr̰ pcNE;Ԣkj![4+Ӽ3"䩏>pc] rP|(>YT>NK&(]CE'q7*E5B%\T qѓ=TmhuZӈ}5*FDZc\C(6W\GO/OO!-J,򘹫T|蠯a9) ]jךHF}N@5#yg"QdoTrTB=ۢ9wAгGKIegLXO9!oBAKxRk]T޶buQ05`lX4΢FUA7:]jR6ֶްk<մ PFR@\I}u[v{͍ͭ' K\<cJ SE3%<)ᇧW2B'}3u>X;y@ чFPȅ*lxAtdr *? ^zY=q貇:J?/7!;=OA`{uꡧ[tνz<6\l=~X$xvYM Q& i k ė=ypF- $/Mj s qCW1$KM@"aE/_{}1J&O,mŠXJ3e=1K#C)Q?pM}L9zClwA$jDװN ȧu1y歄lVdQR"D6km@CbfmkUR]©%gkwo\oJO[;K=cCzQL[s}P9*bد\qX k$/ +ۆdɁ5!"Y3;Yt-X ~aMTjd)/vx.Qەev,Mih d*7'{I΀H1;m2-yRlYD}٬++P@lb**+FAHֱKxhR_bWuK540{r#;SC׵UhSyVCY $RXųBˏ3&Rk;{: +.$ls%B٥ Fpv$*Y7Tm\kGʕy.Ee<:bܺ, BYA|a?_.-/ؾ2}&Vڮ zX4۹~3)0碵*ع󾓣hG @<j踢de-|(*LߩfP>?:gsfJr \)^ YUF4WxEԙ)̊kYӛGg'_~>$z.…CK2$/`kXDžmg6SЃQ:c@TzȜZs6 BR4">ӹH EJX;^L&6g%.:N&Fӧ욚jLʹ0"ItE(ۑ"F_^E1 h9EWG;3C@l1Ү]Ź֧EjȚgcTȤl-M+H|"6 D- 2X3FcUD,E6ކAz} 5d%- BVjl/ñ"Ъͳ-EPI4K\?֦3*6jx{85#Am;3-Y$D~D2RV4Ĩj!kQ VUရO [/ T.ؑpw}IS6{dHFI=ɵ y/YJgg)oTFv_ 6nM(5Dhb0K4:+ BL[[h6hdQņ0#A}YF|,.䎴-+骷F 68AQ_+-U:[:3ڤyCW,Mjldk\NR5.]`9+ jPJٛިw,'pDb0yD4`34hXP[/圹kKY@eqR_&Ңm6`oNdMM o) ّ԰%W"e PEv$*炓ՙl($E߂/(RI 8z=Y}4;X dI#YR+C8!Ղ}LWPFј,XF@LAV,YML`iK=~N!ǰ.TMSgY#8bI9VM`d O'U ꬨ!\43>EfnH\HgSHb!#?ɇw̋7S|^Nt#ܿl^/_in|~nrko6~tjqz6G% (WYc^ߜ"XIiz|րO31ۙ܌~~~郾VKF?W/WOLngf_nx^gr? ՚SwMfrBjz[k5(gwE1Qa#}M!̶v§O2 Ch|mk?Ӗyz>}ʹC*HCKfKয়«Z1cb *f) ,lܓ YNk7 UZ/!Y7rGώjD]x~+uψ!lg!yvn1H4-zB0[|\N}xjI`E"xtgF|Љt1G0 $; V:Qŵs˳nP1%r(dZA]?^)(œF#:31& x/k`0 HFDnϬQwbfkփ.Tbf##=RZ4:Vnp!U'거9r_1a3E_10 ;0*c HyߪГ{w͘ 0Z =/^кd\OiȎ]XB0I\I4ߗzCVLKt֬ZOBN&>ʐD7F!SVk58W5v4bg2V9ێtqS֍Fj+]ܻȒ3;6EBM8%?}ĚF1&*(~aӫ(hܸc_.](`@V\7)ʣ\*[x69[(PޚMQ)XWkWTO{u#Lx,bTC$mR@bu Wn jS,"elVTF-f֣ ՠ̤GuP';W`K4rg]m9y|cPl)th겣)JН>cd2%ۢ|.QG Jp4[٨?%q 9eǟP 5[ݸJb25wݿkׄJgv@QÏ{!%52"KQ.952Qm>8\srָd0$5zQҐuԬnͬotM3|R 9Id!e c2)((վy̙bᮁdՔ]ӳʾaQc̮4ˡz%V`sU.o^yѧ6jه_^ !6R/ Jx=cS[[[ů֧{ŶmoM So-' ~,D|Kӟ>o7rPׇd?\oHԽO?u÷:᧫c:ķ|8F}jLWã;:W?|Ywդ?EW+%ӯ\#$If} Uiү69!.=#QfN3P L0ECgO]߆dG{Q)it>ޏ5#չHeeČs>`k&a4ތ@,Y:>uK6-V0}QgՁum_RHRe0%ɜ/W(Um?gzIe. &f K3"41~DŽ' ; AMliS֤3XZII 8wtλ֣8+giGSER]Yʶ2B_8]|={*'f^쓱lhblQ%2SؙDLol2j-*!ln^KliVK,9钹պLE>@ ,fc۬ =HY]^jTO1c"i"m΅؉']tkՇ.eqDMi<#rMK^|tGMa0$uVaiA}Y0m8;9K_u[2-r,HC1zswB(~`],cV_s=^{C|`R!-6͏|:ʇB=n ?Fe]ʞdtdlgV| bOp$L=S8$Z>R\7s\qMl ~%d^uh, Tؚ̐m:"_~wWޱ!"7SrJۘ[s1u4ۇ,RxIAJ~y'|4.]1JVf2҃nkHYӷAI\U6 =/O"B+zjJI:uɮ(ܣY=Z^7RP!hж\ f qOo*QY&p3YC6m/PYȡy5D"!(v7ޒ](B4ʱ-h4H[fB򺯛q c2od L`\D1r3>BR\Mbک zcˮyt\!Ӄ(R ;IzN#Co93\D5FVj,=dD*HD %PH^5و_gh;kICqz7tIՃfM؉EDoli*kdbvO )e >kT=ZJP]}β玭C8NrĶ7[AX ͩhKRbӾ@((o |1F=Dםɞ<\O(jM}Ÿnh%U0v{ujPa*>sA==NOCj0z! *n ILՀvO-mON@MME܍_GKbi/ $ joY`fj6*ar{>  "P}!YK%DNp r<=?7׷Q`[+ҊOvՓeG c"Za0r[ V屙Nwe `lH*` Ğؚ`_RUI>l) 8]͛k^L`t+Z8)R,X3I--lg,"ƛ5FG5;o0פ4.VleGP70JwƁ0kcHh,o]#zвQe<1sFQD !@qV z {Ǵ2[l< q}j[3q en<;]-C?1Wo qG4N2q&鞥mwh@8ro_#ҬDfe?+ {IZ-UZ=V AN9={1!i4YȺ[\Wإaz$}γΛIztB] k{ˏ6N4E}v_wsDZ`P'J&ހO.QWEAbg.Ė*E  9^P< ffQ.Ʋ<6 {,aSF~y3s= wuV,FӼ®lpMw͑uMj_j]vg~ߕȘ rJB_ԂךP DP6 ^7tU6 ޺>=%s|4;~oaO8cm|[ Ԏj:_,ͫ0 ~/zuڡ7։~C=RXb-X0Ʉ8.Q߿_/|}o6LJsDҧK8҉/xNgEH挦/nH/b)\"yEWKIb^kҜ0FˮH_l=ZrhmV?¬m oDݻ0/c^3s i-JͩhDU ?{ΰ.KW ibI1I궜=bPXJT,FfLΖ-İ`ɱNe[M{c-7;ۨkoRŊ?_] w /8[}6C-I`O{2'q:BQx]LĐf)Uw F7y*`&^xXdjm9,-bʼn;&rP>tB=t0xPM/{׍wyڭڕ=8Im%[j4YeTq({_!G!ǔb;rْ,8gpj4G_)+:\r֏OxbG{zll!<8S)~k:ۜxū{(|qM',q"9͠ptEό/B%!ߺsZVdg21͋2{zmj7zXwh!|`.SF83%f[vh6ە_cR`I)3to3_Yr9c* h![P[zNV@_b[Egt1>ݷ0܎@J v 5 MT>xMcY7Z*'?dCHJ'lnm#(wJ+A>sUI"`blvöTQ%س ɇO͍~R,+ׂ^XAo>B3+pvyƷ8ܫ< 6rVψt9ͧO|&v?m<+ z+1zO) @=;YO H)XB~(b9F)\ֵ-m[ZrDGiE{(+fF;\]x vIIٶ p'g)&I9 F){؋ҩR.ՆQ=!Kʥdƹ|ĺWދ>vRJW5,!ƳubkHM!SMD~8x1)џJmMKAіZQ%ooIgNm狝-7B(e6apJה~熘rvNdsMeix4JL]I"0jT>AfbC6,l1OzfK3cQ&^W1X֍艉![ZבSabkURrwTRu:V?0ax j_mƺϸ5"yhLv =KWA -Ub1t,r Pʚ̀ rOr3iD;V<3BAGv#[䮒>Z(d?#2{6:)bt3G %ZH-a 9B)3WwPޜIК1!ek&3Rz \Fm4MLJZY{aQ$D2X'V dsmmT*%g,G|.UtG]4/UxH*JQ'gqX%w{\DH̳Z7[rs:(+c) 7ZRn ~`EoF]V]f۽T'K7lNn1RȞ7пql@ll::@dϨZ[WAD&. aܷo}i S>Ux$wA!QlƲ~tȽ:ao~}}=瘛$/춓 m7gaU4U9^!93H9v_m_wlտ0s- U~tnno^[^ػ#lK 9쩈zDNV%k &.C:iAќ%,7˓-&_6˿AJnD=g c̍˲!W ^b]x\%gP$ATJ!XiRh! t%^aw,ٓc{ớw>*~iLx}G>Z:S?6)^[eNԏJ=Mv[R?^sQ_ir'-7opYgAx䣵?K_n91vHƋy]}h+Ѥӏ 9† 0ǯRkC[`/5h`0Rz|ufN-id^Q. $Ƙ=uNK*(BP!h@~uRD `prӬ])kS4B:hړ!Zuh#Y'ubu ]V؀3x~:SrIꚋd<hO޷łP%'ӆX1e?L" ;V $<:ӧ>C}6:+*>N[ͦI/jUc FG f3$$TY!’?nL vٚne_fS-khwvrlڬ=`8'o"kca2Xű6mǵ" Y%LES5яrO7ZMS c2NAN0!;iGRs5D϶W*Zlt2Y{ [a'2 Hf+@ʦGC ߚ*0Ⱦٳuy0*U&Uz2K%ЊOhc˧J_F 5Ioq!fmҤ3gf?T%[ɩ,2YR`ٸM1];v+]{0d$~”-+޹i4oxnǙTx1l  7_9WW^FѷVdDPLڐ7)>GLplA{Vlᤔ]UHQ+\E+@_-.ÞleTh!+JM*+k56*Z,NMz,ДK(CDTyS~1 iyřVQٝ>(6eN\MPO!<^Qƍ‰ץ}>[TD˼/[F6X$Oа*nMt`r)-3ZR@KA`8=: n~uB ƧaMgraHM >t#H| WHdۺR$ZWAn\zf4<_oiBv͏Uwa_溿(4i+@6uB ޲k璋֐cQ,:6J~Z@ 0,FX%Z+ʗ&YUlM qß^8YpQr耜қ~ÜtyYӪiQ6yWu7#cL>fͯtѥXyV``1j0ڇiuM֢csц+rlsȎNm4pH2(xBXOq]F\P7NJ <׌Q.o"icf%+ݚ|Հ1fz ‰w 6S)[C=^5SL).|r]lxXo5Vf=:u(6h;۳^ 2Dnt֋>ftng.ъJʞ|f(µXeY H2ξXRpX>Cl!bml7-HIeuu|E#ܳ F^B9J Ұ^56h+51lmS^go{xLgGRV(" z ލ(IDH%2 beq\G<y O) g=KlXD$$3[?ub/5п Nzgc_N3N=_zUŪSIU1됒tjN-QShf*h@ܯ?H AwxFqOpk?k,e1WQĻ;/)}bw;|I)x?ڿ}W'J}_nygui2Wjvw7ٝ~ϱ!_\acy^n|Tlɐ&H˙?*wy[><~Z^NЫCzkoen+Տ%{Y7,+s):}?U f+y}0k#7vP!WgG۽zx}W,ϸY~T{?\VO77?^߽'w|u=?-ˑ_09*S;S SAty P(R\wR~_G|_A6>gM?Yk摼'vûg(G Zzx2g0:Ae\vș;SK d Ei -CgO->lJ<31 0}au!~(k4peJWKyOx8 d]YR?zƻY~< w? 9í߾hOVI$,d8wjUSHe]L?)MKeCj3]_Rߟi\C#&en t_D.- h΅Pl6w$Ey:$K1@+ u/1(z4s` w(.cvZF-v%v Eof%M.7{EwTˬJut R&'CVj[Sh.6:5lnp*&Wԡ#xoOxŁ WlQ v,'x\zl+-Xκm lբg3Lj ,mMBTQq<.ɽe s1mML 0J$pFɹ蛟̦~oAhT+M@1>(t}ޔRUaɊe Ӷ|0ZS>F~d7;JlX٩Y&d99S9~l+Ъ& s?^] yd*d&|VΘ|s۔)XK$DC5L\/Jo^Vtl|u~3}nK)ovG"92@:_uF4CXm)N٨sYlj{N@Ineyqk͇a6٬82l2"..)#-6m akxQ=,Ք0:Oj9*5f]= خP)Ű n ӬŚJ/!,VNŕ ~>(k֯ nj٬Ҩ.6VOiՆ}{w<=j#aue kW9j2hܼ)`:dguWu%Qv&uUVh>舛BxYlٚ&-F7Djwc{*fYڢ[[)+ڹ"NW ۛR0:\h7۫],6񶥣XZJ EL@*d}h RPsϿMөZz~_JtЫ˱XWΆʵ3W TU71t]jmw:T*sx@ 1E+| J)׸HNCL5!dp0DR;ol2F'EzƋkU(RsΓ&SDZn2i)6K¿xZ:![HrDrLU86D%rt!˶@Q8{ EbU>k`׌OiCZT‚K8}:@ ’dVls|P$Ap!pTc+cgY$C谈9.+"lQ:@#CcM4mL` P#?߲ %@lN'< R7u;Bus+$SM B-LqVӅ.gqF뚋=^x+#iC?93R)cmQc t-ۧ +!tbRbe4XuX<v{̦\+){ Nwl{,0|>@JUPUu,[8Z4=4IjdFLGf. c$YU@0t(T#-ž1MZ}M(^PGզM_!kТ3ҞH|EnWzX ƖY`MHR%êoU)4w"-Gd0d05e ~]C-m-I&D͐CǛ7Gh-`1֘'3]M+G_EDnc(J.9aK"ц'R*$NԛQ/6~\=+8kҜsf3cȮiΪgy)hlhhҨ~].S˷`|^^kZkfc2Q*PEnd]T7FFggrhiۛOcc9fH#K>XĈ&=ob_3&6S.1&${N;>4<-6>K=ތn:D6:E t| 2XAwΛ ̌7 u1LᠦFyikfW^Q ũ 6!i\t@=)LGX;']aq>ĮXko(yF(G]KIՂӁ(ɖ{3GSk'O d6YQ%& #in^h7q}5t v*joWC;hB jlǐ^kp`բ784ַ8'Onkw77]_ʚmj*c=IiU5LfBPD(G.H5w+q~%5=߮pH)jhUdvfD,4vƲ@w>zIυ\tQ疃G(xs)#^Mj1fOub*/hh{~m/ /鉶'ϥ-R jR$6aស@}.q<8_@_tJmV=lwW;n4zs''$wƨxB\3a;f{SC⚥:)l+!.k/Bu,Wn@ż}r}^~pW7ܐ[éjT5l[9q¿EhxĈoު aKZϦ6wkԵpZiZiZܾss|_0=ۛ<rz!UCQvq"rV lc&RҪcp {#-ǫXDc|uM NC~}K~uWսL  ~ޞ>R/u!t-\9s? z1ʏ2F~ih]0t]eaLY,1q6YrvBeɓD?F"B?'<_zZ' JblAX3\[Eg[ݪa_leZc|B6F4otlwP:& %Npuڭó Y l0$3K{cJH̵#5]N"y֫2<-- l%4k )c-~V-DՄ(EQxȾ{Gw`s0Y0G7G%wV_$,T"~; jacQ4wMH%`r,vT/u yR$ͣd#!A<2Fg;\BR A Sȝr>E 6blSзŐ,~Vno#՛&j^8]kdd&*k095NR8ĶZDIt6V5la㷅p>^+Q_MeV3QEY?6[5XhþD,JCUg鬣Eۋe p>,suKGh^csxD$"/qT`諈 4<8^ՐNCCx'9Qfχ evش] BqWn̳X #XJ*TA,sko13jI dz`idB%wKKwW+AOơj0 )TV,F;հDukZ[:n=ƳM9)buNbL(PgwP փZh Y.9AަV:8 %;o( fSJҥz!4F^e/ XbA-SB3J}4%v,qz) IvET%e}x$K[ξbu)q˿8DRqN-~owB/;Lf*O~ %*B쒑CV&CF,V߲S$\|1Rm$˳Qh'tBPϢ̆ mXltE6Y'hrnq !$W==sDõM9g UD6ip2G^Xʽ֭8Cr,}TTzlCRG\̡NmL²4/4kSc'KЬܳ3hص1Sn r e|G&hVBuɭ<-{D `T<9xp+!⹋OfO"gadw'g{J_m1KloDInNmmwP hQ`|ݫ\kqeYFwP$% F? dJcp⣴R':&0mo x p+L:,2 s$u,P}O }`X?ܘ+knF|L*2O='7Νtq ,itJ)HʋlRIl H5[HD̰I^Wu .8fj[>sۨޠAq$iW~)ȃv1`&tG4, PEl[sw/٪bnQ f?[Zi=IU˚jt$ k+5Dx4p83B!(%Ԃ,`7n[ewbǣp, *KpA;8M%e%;_klY*L%cn..7\w]En]Ʊ,̔ 6B+;M>J);7ó(+?@3,t #K氠X老-p;TNP*8tzT3尧#K*8ee8YΙ |"4I" OQ2ִU,mUUoR&hm%]RkPib6FdgtvTp(_*t:G" hl+۾e{FT F&~fqN0Bʵ"qkBL#hk!-kPCT M`#W~h&S!-@]l}NeN5^ utmOu\s?µU<h.|1^&Cu`ipyX@;g5*OSi4l|厇^i%0H'LE ^#(yt; R~ s 4&lOܭ9O#`a26 Ffg"%rtz56wG@Nd҇HpxXކ]욚"c6`X愻N0܋4„c2JW 7."=NM*"-o6t! HbYyj6&ԋ@<K^=3ךM&q_>\lRl$9ǃ;Cc_|aC ;ﴟ?񎣧6cνHQA]=>[+ nh'+diu`y\saQk56 K񃷭M7XIC}=F(.U~~?C@z(20My0΅!^?G*>p7+WmeVךךX0".Fn^^61AR7a.Dkb>NWE) Mví/3H"sLJ/TKlI52(R,ݬ/3@6+1Ë_luamIQ}sWt:;3*U>"]$|3nu Ckொ긫A/}o0'(է~iz/`[(inp{W~rMR] CٸTv,I;]ԐIf ޖ#zaf4aX⋯:~'Ue2q㤧H;Cq*C~<I.FTBNI|rJ"]E7J`A7cVXv1;sZ\(%VAS5Wsj撫< 7Wsyhl\Z *cGpKt.K‘#t!(El$4 [muF8 3lYNg%'0$;v=eiCB/եׇ|/o:~&ܘMx1_Om.,~)-??P~ןЖ`M_|>XI߾@aҚ(Kji [ 1[~ 6*+|_] `dVNvϧBf'c;voL-e0ſ @ MoVwhNs7uzycx^|JW$-o|cp`~]^v~yp~3u ظl3\L>؁m @d`GzzI7[>LkWXͿ'0-[;O)X35*=ބlu\-> ˓1mTʱN*Fz))L+Z&j1YE^.K҃v~\+|&& ݇rm&0+J6^cv14P@ׇQP gѲ?bo??ChWw=פ|;TchJcH~Y.mPNo!t;#:{{pP*QP97)L+LZLnVNgQpFt1òjL`W O s"C̶յ!pm ;BB~z o!y僗% "`$‚GVcHR#H I&$ T Sx8;c쌱cc`l&Ȗ[l`r{WKne_m m/隆֞#~YOώק'ŚAsLV㜒}j"PKsՀ־אtey>]/ ATP 2U^FXk'zDBb[_FnK$a4Xୌ}Cv'@($? ToLJXV%(zʍnZ2fa05l0BJnpE1=XbDw|HU@w~3պXQ"SL2jOpwd͠8JT3EO8!ſD}C+3 Эn@ח+'n\KnĮMi]ZZ8Ah4R0ҶiscM;<ڷYOoa$˰Ao}|pos-ng;8eyRiu9 Iaeeť=K^E -8dFcO FD〔XZ3>Y^ԿS:̳ ;e vr,Nb sݮ@\vdLğg. q6ȨE,e-T7c:fR~g QSܳ3&;cggkqƜh{Vʾ,OD^F8\dT32kOmc@ĸ j~Z$V*-m"f╈_IY\0ʅU+5cf| tw)?'}mi޳dseaEyUx4v{\d?ݫ wv1ʥ;yr-|;fO-YZi&sm4Drd|Fe,jͤLzVfNqVJۨ@%k92XOci/Dn8 @Nv+[.=Qԣ2A!hR0 &`)QJ2RqFf{.W1b)8l-xCS~81{Yݞ1K 5ܶrtGٳ{0Rxt \Z|2xIKLR@eB ]ҁx&A ?+ N9z+7%{JF4=}kv?piXY[6_,-Qހσ>6!R-xhGp%V!v5W^K{>r矗2rJ+lhi%ZAї̑!/ %G2ĜJ&W $(Ir:c,C 34>#hWz\a * j&Kf|b5 H]5p{ ܲ[dܺOhQU4ֺvljҨ|J8uIY,% ^,p섐H)DZA-/ Xj*g~>P\ȭj*|S CJVc ^9`ylDH.I gpfz6s:B7#(8#UsX=O*H2xVnw yEu=Q^yR'af.v(~O";OhNB]c(xoU\8+RI1~hI{](I).)Kdɟ'}?õ F{bHJSђ[9eQke[\ŝ-FJ*0>Ҟ׶1N1)xU19yqOdYꢺTk=#Ndʋ^ <"sVJWD1/Qp8SKY( +Nh6pm:/ؽp*H&1ŌAj'nUO8XcC vYAjhEWf N JaVJ?{F+}~=v.6٧D$q,IV,Ȓ-$TXw(M4@,=!|KJl8FB,!yVGQI&>9ìUNW8"w;5$D, +I㮸 +hzXv~ n˭HQщ1}'̀>eNy3٣ E=Ƥ|ɵY#Y槾K~S{9NJ;b@`=In=_B7ЙPK/jIA)P O$^3DT +^͂ *&Tr !>M!Ho)!َGjtVh83{[gz nSP/]3~{7/d=NUK-#NaD J),@_$:lîu[N-Nݳ5_|m7U6Yzx& 9P],U{74ylGdr;6XՅVAw&*fo>n0yV:\NnX `,j>Jͣ5؀gC}WMٚK1ij+6P1ontm2Ս=Ϝ PF?C~Q>Y%Js.ܷ'߁v{pM'ӿs d>>"h\}"covOXP&#Fyej@qrƅ˂.] KȐMx$f$0uUi*rKlAoL܌lΙ4ݪ+ٸGH2)Q'\eLA[N30)/Hz4\PĢ矄ۣ|B% $^0:aJj3f(^XZA`Aa] ; 1lNq+KWf (4&C 3p4OM&oSq]}8v%]f2CW+Baw߿[-3 cjUһ.oV0򵳵}(qJf\[cy0C6^8& K),k"cud9`zQʭT@7{My)]:tj)' Ř "\qhFHE0% dZiAWLMA (j%i!miZl{u/,*ˤqfdoUĽ%v)/;uBg w$^qQo0}J緆96!RC3"-O)&F11q=&$ZF =R+V|W.f"(fNK2;lŽ2ʸZ:U]=`8unC蠅cQ)Hp%-ނ{Jx^PQ xWco,֩<8ә6*=ծy;ʟ4kWyv5SqJo7L 06H&JHNAP=bٍZק\cE8up)b'fա`dNHN۬8ug|mpwg W{f.@ db! cX>[G|4+ܥُ#һ[;r˥; ,ɫ~7MZduBQh0HY=TSPox؊+m܄.QIw:>NR<IcJBE2$9 NCl\q/qvbؘ6A5lLxd\=@~52.WkFy嫂Ts騶޾ؖ(1=0Rɩl[Ua[m9miV'Ƃp{pLP阤*W6p|&ޞ.v鬧ߩcS'eQ+᭯K_E4 Hbz4^(,^2f=" "/ !Y}&_l=~.|ZKwUe.J { <3i vR`N#^h v< vkFwvy.h} !fcݜ6 ֙C?Y٪k,&|cp(S;8b3~4,UIFVdGr^M|2 X(8\TNKX*& QLq@KEp8#@ѯ~)@vl B9pcn+/1¸^K'V>UY?ov1o'G[DI襀J *RRk p:ӆB!|Z714X=!%8Pa%n|x„ #I/&ĤA $vVAq$=,NU|PtT}7ͻfjͧ|}oɵEDՆvnFYƉM?"~\cP($6\(!b(i@KyJ ۿ~>d_?h4[{?~/>,)nh T|y;PW 0cjHʱg/]U:} L ~0Бz3.%Pۼ%NΣC?3|hk:aalq:yG:LܸZ\2j+?[o}5v䩦?:%Ӥ}Iav?y zqS4ট[7_^@Z#$nbz`H]:'!Њu;_ fiޛ>M$߇mW$UzFޙœ-~2jʜH(J n^4H҃*MTٰ&RE+j?םHa:]5Qt:)̾MSWF6k(%Wl,Ѭ SM87_pC82cFoı|O ucp u4aQmBqm2a&Mխ9%1`9SR+4dBDcM)b!d'1 gz7ppٗAEwcBLbwɖTeVܺY§7 x-c4fQQp [tfk Gd+sAkYcΓC:]g] Ci, G;u[."döߣA$N3r%IZ6B;&ɹ(Olh3{mi.Pvɼ$lj45x%\Xmi:76\:MI]&>Z}$yB?ķ_AvgyPid&NEIY4FҋJϧ8}taxB4YX ~e)DflX$^y;_Nbw~=|qDۼq#&]rg'{JRն˯:^É(9N~i! X6UTW].R!lw'c>/'b])c%9&۫3eх[M{Wc;˲xb}?FmCՖoʥoKj d=Irn¶v.xH>q(gA.&cAvx'-Ebx[%F_$&ɬm&wфMoթ/-bEގR^CHij[ӛ70!a L '$z `6TP$[ nI]"v^br @+bGr^'rKXIT,ċ%<@%QEE)Hݗʴg[ɤh尢Psh `jL&>0fx&C$Bޠny^gDY'Y.%PnBTgT }_۷& }t{Ӣ}H2BC]$6 i(H,N Ή kFUt#(NDK}ΘJs&$/Mil)o*Mr7KySz|7@Q)o*M7%'VJ)oP9R[Ox)o*MiH)o:=mG` 46W* Za-7N@gHQKdAܶ&V2vcZe3-\1.fbYfe&P~pL)m%\%m(o7m_gc$QHT2)^yϼK PG$DDȂ (XRoM崞>aئ= n7Qn97'U.t&B x:/d/\ZQK%{g.#:nSP$zAHH bVCX3++bt,9E}DRTonٮ߲pa~x])Ώ=\$h(G+(Gi}]S32LضYw JW͍I$`5VPZEJܻXg '㞳"f4ʸFPPn"@ViF" S" YcbE3I B,Q:ҏ]D'!=Hݺ# BΒ!uP2TT 9 gB’pQ̓ _;dMTښ!KtP@d rV*MvT&MDV/"KKޫ U$ ı/?تV98tOŠ"G%a:]_{'"v+ˆ,p\dыdq<\C̠>ևPX.aoSD!"HQ3#f'Jz]]w6}tM-D45MnWfݷ.mղɯdRD%JFLH (~9ǯ|zhkH5 83l>rm`%%tdhl{ <v.9hN iOA++;E9w6)JdD@`!8!8&G6Ћ{sEw;L|wdh"hãib}=y45:Zxn"HڟR餟̦2 +HF~UWXA/*q3wpg^`:rkȩdd=i]?ogӻ$r'߼nFQNLGw_ϔ qv;EW٣{PA#*2jEdNKjR]EYtOIr?\G@H|.d4cDfcπE o'wjO&S۷{ zZӲ+7 58^Onpx0 OfjLcQEY^bz9mzGr4Mnj޿7}K|}5OڎkxQ;{u Ci^:] ]Q 4JgGv$Q),Ntn1,  ;91:,A8sg>_C/AA"Aen"X4<#l:>ΜXW158LN=ZbFK<%kDRr$⚂cywsPvD/J`Q#Zi@};WLK( ‰QZdb!,p"Ib4ڲ]3mv}}7©}gڥ+ʾݵzlpt}S,cs-/" =nł  vN{w*Usb{j+!N Ć2쫑6vاQ/yW-ʑ~r o-j5ꃼ7npj6iqm$|8IA0B!MW8fZs&k:-֨mT|E[r nWp]e J`XCE ̺_KЉ @speN.WzGmYhŦQ*JF+i<˾˜u;Y4s|L³ lsZ&vm&avC宰r4O"=#pf, gԋbRԶסߨeti_{. MR!끨ԂBHx!etL1ռ{J{J 5"\SwR,DsTB-)5ۍCrPrPwHtoE֭2{)|J7q-XgvECSQ7 W6ltW\ oor( U3sC8 J+aH,ʆ^Yn6Jfhy4{=t'[*B̽YApfƴC@q%Mu )I Lbx,Q"FTs!BV Y[UZ[«eKJG0:.׵;+#I-?deϦ2lVF]a,Б #)G=LTS0714, 9x<ɖ΄Xl%~B0kڙ0;8N㖥$e#p9;Rz`mk2=4k۱o!vBu^"+$Db+<":fřNPHIHg %}UZ5O8㴖&?[N*;^jt=r 9qwCi4$T¨8UID"NuK*T*CEV7l2 ^R)JR^;$*=Mq@Tʧ/:KT),„#8@1ր#(o8 Q$W 1r1Q}VOM- h*ԑۢ-nmCPG.x׸ܛ0y"X zX~dd\j\jYYZ +IZ  -54uuCѸP4.^$I,D$ѱHRBLؕC1B_C橍\P⺁!)$J2#֠5h1Mh ZaҎ!ܣr @/_hƕ$%VR%Kݞ}ݘݦ攥ϦlP}ݣl٭pt}S,cÕYKnqhf`u/;QBbAn8o"CJsYE9wZ>2'S21џĠx3s,d&p-W!ztD*J\e@MDNcbH! K Nvt,ږZ,gN*]!lWv׶|h9<&1K$6LoqcK_V[nA^i"DaG$qgڈNk`v=}%ߐZžhڐM to{);b,QZsؤRjRf0NihQst,cٵh-jdy_SW!Sc^kO|"7(n3 KC-?͡_o_<$TKH #$~b& hjBtT5i%RD@rZ Rtϟt8'[V¦OM[ܱ& x-Jƍ~,qRWϻC<[q\:鼛Kj{,k5Ek*rܣar5r mMϕvd[թ}~qmGj4ga1ωNg & VDb-d1i qvSLJ5c_nB=a*Ay":x4Tn9Hp_wRTv;`w;`QK4u>rù‰bZĆ H0JR2%b~@ ڵNdfro?X=ʆrݍu P6*ϡK(v74F;8f5o&fcWNf qΑX fGz.DH,}, Gxn=]eu@0\3,TȾM[lS8)&wƟbL룦A pAHSy8 lA`m^VR Dm3yIy9S%'vtW,KWlNsHk)VFs@EoNΒ7 8|KM8=p+ |I=JNrFNғeAmw?^jYvZ-|I278Fo@;9΁v>JBԀK p$jԯHq;"N%9ޙt?s9JNkؽmn$m'2ITIʎ_eQP,;餎s s0mڽQTrmh]FNtՈAU? u5Φj]d̔)ɺ$zo8mĜ22DጮDΈvV$g񤋡:/e~ƚ)FY;Swy%|Ğ=>L ] x<9eZ,b({z! Q$(w(L>pKF)W+U4QKjѻ2cd وncWr9oCfMmG`*+Xh5j}Cφ ÷^o&yBq`dO5C_6y8=;ؑ_3ݝ\_? ͯW-GjN}9'eлtKY^7S9L ldTwW4ծ\;ž$RLfÓ7ũ*+"K0JGٹ2.˦IwY\_Ē>J_J^ m-蜮I^v [Ƭ^Y; ݍNV_EYeJ47va:d uh%ZKԕ 7R[I|.g4D[dnW6槎̶l):d&.Fvmvߗ֖o\w]|QN>#CY^R1}43eL5W{\̶3MKH)+<7wn.ŕg~Q?j1iwIZXܚ=ZZ7*g3:ۇFԘw~4})m"m.m~Ӛ|pvoXIRGcoS*~tv!ԥ>6ptC.iY 5瓥g=5+UY,c yWyF}6I+lPX-{(2:z(CF|>y_0*L2ٜD|*GӚL(9i K׀B6Wwj6ί֯*o} ֕0ɍFl:Me?ZE>=8R;[;:fE.>Y1~xu]|52w:ۺz_wk[i'{Ub/= Y8w7u"~謑xسcn76yl\s zfOM]寋f_8ǏaqHp C&T(44H&)H 2WBH-qܾd)&P{27Bޑ](q8 ׆ɼ37<{'jںkER5\'.q=uVr=T'mSCe% ]=b!6 A!v\ A!6ц ;gr A!6:( ږJuA=Cm?Dh;dCND%h;CBuA!6j ZD&BiSL5W@c rGaB0Ԥ_^H piȅtNiB:MH;V4!&ӄtŐNR 4!bHiB:MlH)iC:MpHqS4.!&ӄt[N"DinOC3APF0J!Q$ZDcE%qD:  6xoN|2> YaX8&*OmO*wdUJ>JDa|eƱfA 8Tt`Qyt`ǧ^--ӆّd6]8JjXF4Mg`( I!?6? pjZNYb2QqYI hI]FѺam;ND^vG93pcyL}dv6;$B21?5UF,%)4Hb!Ua 0هߘEm2Y{cԐ6f{o3Y&kVvk!p|OקTJQO>ĶX}ϑjurS8:r *MͿAJ(sZʽh)`¶C 7"Ru͌ognJA `'>yOQt@:+2{'фbr9 $DE&(v2{>] v;eiB\'7Ac[*+bl~ڠ5w&21`H1z>I&t}1]VO6/k(/Wf& Jqc2['Gv 4]^x+N!x-!BqZn!D~!ɳfe:QwLpɤg.yrqkm}T֤o(C]_~M@Z;-72joV]hJZxF|ե]=Q*2E4#R| ֙ٴ՜d_ogZ]Io^_b*4<vYu3fc݇ +z>κ!m ôl uUI/[%]؍vKo.W2u)6eJ \~i18i}k}D1X8Wv(Υ}3҃zXz630;LbjA= t>]ݸ$23T^CW0杘_}P]_4Tr>/ wu닫B-ZHu/̮o%->/^|4=])0<~ZéjjLIŬLYET32OkPr sf '>}Ȏ#~V+D^̬3دj 0K??J,}lwr<߻xL__/\k/|ܵ݇Q|~+fY *4*$☋T34Q&%  B-ջEnp.Xן D[-V!![|&l/=OX׾i~ִp{>>|Ã{>mU&8p8mü^kVoo}s/AHnmKn ~=Bk t} @K3yGpm?ʅ]S}Vz~\ة79TDHK,DD1C)Bh#y*(!1kN81\D`\}oa3e-,?' vE_Vؗ f_ow"M} ^ofwRS/cv$͓Nfc,pu0 |-or%{0w&O\j]s!;;ip4, &LBRBX5V"ر0PhGhv'D,FlGD(* jJkRPI&hByکp5Gi?.b0Z xU!CE׾˫JUv"-= p7yրZC줊ԅsgskgbc QDbr!G)B0d`tn%noZ9񓊨D<:. zzЕTT*%(0 4T T"bEpe+sjsnAWPh/H{~v<:tT N~WS1"`䱔Dƌ8I08 Rn5Jx-uw$f#]Ӵe)gKupz:YOzB:D Q8!:!DM ,V")'\`I #JV1 GD7=aGDkp{8$:)8 DO&zVg'wj4+S O *N L%D(A $VEn5BLn? s vES&ݞ^eAX}܉l(u}?_i } l.{a^W:w9_ǃO@Of.٫*0{^C shM{0bm`&+(h~ä>]ܸ7cP%I[32grCJzÜJl<۹yaڲ($o6 gW?KgtY9 e_ɮIݶ߇Qo0sɺ//5WS眒CF^ |R,3tl~"rԪX~ʬ2sUiٷ) iVT]X;uWY)+nEϟͅ۶X ]/?,^<0O| VG7+K@9!Dh):0,&2ѩ8NmN͖WfΦn•3KzIzYyp3;lQ~~Qj67'%ߜ_]E(wɸx|Ǿc|9JyQ*V ZnϙkY96b~76v3ᝰ=cxbg>u^LCA!_) P^UϪDs="KߋK80> l  ?_&@0;tvvBnMF>',y|,uݲ?|ֿڻruol/;q/ke aLHJH 0F֙cE},Gb-WnVA1V71?aRq3n^%cѫ8j=8z(\5v=}*ȸ9I&U{8U۠W5N}Xϰz^DxZ6q|/ʃ}|Ah@0Pu ze/KQ".DabyUjHE$Z'ak5~z$5󺑷5+žΖo76LʙŶn|Wa̺׮/J!b&iӶɂWL|!ъv8+yH+%c„ȞrWuKmUh <R.*Bq+X1j +X-ٺ/'|*9cG:CE cFF Y!3ӢZq iy9/rhL?L 7 ٷەL#X<@M,7W3$h)AF$lwT0ᘻ^mׂ*}wgߊZzh"UH'c5/um41򞟤Pmi>!_t)i-":'ۻ! UF$Y(A4IM\9#ma|t%fԅ'pl+(\Аb_h800}-"6BۃQgŞ؞VuynX x 8.=bfwm-rY񌱔'*2 FrJqpZK&&Ȣĵ?b+-R[s@N(VymH-GO1M;@b<މ+/B Btlw Zo; ĪF]gW:ŭW:q 䊷BU"xJ|u"s̘#|k]NýGU)'JseSLJ a$<܊tgL2q ׽2rg.`5M,VodlYcFr>2֭B=Fr駬L!ٴWPѸŋ†%vPNg\d9ޖPNІRqhacQrw䑯09p>KE#שVm7׭$ LjХ5h{ ܄,9/MՆ YZ? Iq8{u`N2dMP8 *8H5y5&X\XG;31sB 9k9.e̻-癩VMgiNJM&ꚈN[:/Ӡv˻Nͧ`v5ci]Vг|8O8 L0!,:Snob$:C4-x@a@/E0UcKuOV(\ ( uc-=Aj MQm=9e&C m 6)&5Hk^` ]ļp8y!pu[0G]&{g7h5(gLB}U1O< ꚚN"奝*GPÞ(5ŔsYdHiT'@ $2b3܍tpZ>.'8ly~r}a 9Ԇof5EK!篹ٻnnnA ?-m.'ŅK? $P }!zP\Ěׄ[X%E}[l L>[!7 l5ۢB<;՝$l^`þ*Qi"E$g:WH')JE}gؗj{#7ٰ/γs=VD|{rI_;<24.oL t .C,ҡ XNm&CfsRi-9h\J#JH2D"hAM.IHX?v#YT9#ǜ(JZY#2,|#yy;>m8tkhC='_{SSOI@ZƼ?$)C"?(/C=,k!!2𫐈F+X@4#('E>::e,?bpօ@H.:MtWY&knԿ-N̅mt_=YWc"YfwT<0H ߱';C>nB|!Z%HC mY5d3@l|1*(C9HKIR$D(iTSB0V"p|AID{L)^R4z#pnhØBO/p3Ly, ~\X?HzJdXB&( >$8"B#=ip`|EJH"dd)JfpixksBtA#fx^>h;Y2CSf)ʳRꋲ4$,ac9tۏ]X,7TK^* RPL8LzΚ٧2$M9*OG務먾)xT_^:՗!1S_ >h@Hmv<yyCtZԞ{b'2ڤT8N5O3Z0J(Z+t zʘMN7,a!ymy'Vx{TU=(q۪ݴKG3 : Pyо?V]L?7yϏv cfV u[\sgLDu<&R#HicQF)49\kBn[`$WZidgsQ/P5}_tq<]=;ŌvWuk5o;~_rn=wY]EMVx3O'ˬcAM7Cd+|ҾM1SeqR^&ogsKI[Q[_+ݝÉ35Ʃ)mHwZWyz/A=ABw1kC(ݾI|XݱKiU'_AK2bw-O]Bj:-ҮgeugA 31sC Mp. s "K 3xS;7AP^.R{9 ~H~Y޽m\vә$L~.v{ W#m2_{)7q)kޏmo+6U{8nLJ`-䯍"97pl 9V~R\"gFLb\摉”gSR)%l$HtNI|uA/}^*2>5לW4Ic"C6)I7ήM:Аp^Ȥε2eH3"i$ "r=請vUMnk û)Gd2L\{ zN+!`vG*+w;E}3W`aM ֺt9/Di}7YV V,jMZྲྀH8TB{7층.-?U夸oPOږ\ Y\K("%Jb2AʔT?8Eyly.ݩvz}*JQIh5N$^.&)p@R =3y͆t嵺\7e- 8i#OTNYHbSBɌ>iRP橱yZYX ow4Lk5CٌИ"DƢ]<1GꒆU:@c/ ﷢6=SpnG:ҎaTwXdG@5L>ac#n=:V7aϦ UD`]D$U8O³?O8;^a:o̺8Z?my;!b-I=iv(껣ksN]=-7ޮ"JmF-{- >mwyv p.΄8;o zt9ZsjiKp)It]I!/<>Sٝ>|r\q5 ^Gg. +B XNrPGǟq3:l: ?!/_r5SV=>~y~->3pcc^Mv}xJAn mv[3B=Wgt66v|?X}#&C}d}6٩ }Տ6I}c'/} &!X޻S;xu6^tE}~^0TkRkǪ'|O/њvZ`wk4*};iCbHYCy{݂>E "Sx4?ܚlrPTbc>n"7EmtHXUO^;Ye'VW)TKg5C#}IG’,om?93X~1Wp̲Otq3"T-&)3Π'Bşw}ϭk"ΤM7II3Ӿi@yDHc篿)J$eXZ(IZ Q HYb]HNSs}T}d,6![d)%i7{{ۆ_o~aX:A)v?ұڦE5릪rR\6.~A">fb؋%=gmNE}7N^}י^ ճS_Uՙ#{̣X{Lv?|і`Mhhv}c6S:AQxC>n$rV"\Z|^I ^aka.O{ٺ^o^G~);bOP"cESTE# 1G ^M‘o'5Xctn \Q@Kj{/g7O bЯ B^$xw ٯ,fLG+_qJ"/2BHzow?nIXy6aW&~q7F0b^:|mqBB6qD) u&}`yUEAJd#Ts[b4u =:?}3sFSg>5C-"cSPWS/ Nsȑ.9>RuE=ܬ'P?.Na ~}gՓ%~F>gPhP ?T9빍9 ߗ9nV9 FF휆WEvCnIv%E艺9nQQ85`;X@.NC>}-6ܦ2"sS*L ě%, 9‰pB3 ܉.|V ‹8AX3NpgH#&B3 \` +bR \~w||sw{f=BpKhvC8| s $8)8k111cp|K4FWJuB)2I<= HbcĚpI0VzLaEisU)%:Uu>u F]cVܘ]fj1R3/|lfMfl:7lԽ},1m%+3!#`M ^"}f"~Sp`=H| 7tX\ai ct1q'Ȗ?kk'ߙco= MJֈZNq)N{;uW5Y/e;}#"h=vRCc:Xp-="|ˈ*#4"r@6%?{Z5?~*X7V'b}l >6&ϼۨ}NMsGœ0/J朵`XrD9n6#>ky*Z$sW ͇zcXъ K>#`fu iá7f97"1Ia]*:S"̲E 2SPW}t ٵ{CRg#R(Ɍ`w!25% 5Lw(Dkp&&Iz^ɗ5e5Y`ԐŚw j`6ML Pscqg@!&ʬӜb*{颪n<_|=qdixZ6-*Nd*Q,H<]o0~* $w :Gޭ[2UUvllEp\2v4f\j79GCgO]]*oU;`t~m}dT=Z$IyrWO7XIu@p,hl[h~b䵩]wcr7cp|7x=/`.:/6]#dO>˗.Br ohe7_Р Yz )TqP Mc/wlc"+ %@ł"+oonIl6kJC8hD=[>|e/PB[Mr.:n9HXaW-zu Ki5kWMYЭ +Xr[ JT)n݇<o"7Ɉ*Hx֒bcF.g3p\pk2XL痟8Mϼo잊;:cJgq<Q(7Kۻ2rdN꾁փ4]3ZffZ9TW+7R-E8f[cR"YWXv?w[U "r*xa(#"eYQ.@lcMl gfy^Cx;D/!]>qV@x3U}Kl[q/*|OE6^C^Jg&[E_fz[F;v({i>m+"cfKU?S)J %CKk;zֵ ^Ҝ-ߜYD5 l]K7գ*=ZTwMד/vuj7ag4/f'kCXq}/XӈQ!8Uך*쮸Ž Nθ|e̗ %H2ZS TGY+quB/<3ϥp'|r2.cWyZ'c]r˲ujw=/eEv|IT.TcIfSAibhhYPFvP"!%Z#G7-JGrչqTo >Ьx )w4~Ҕ4R\ ?92GL\1h=Al[7%#3{4lv?@Xvr-KiC#Q ݆hvAb20v73HIS#|r 0Mf]l'K@$> PnsAeHc5 8Ɓ|@q_9f~3snk2:)i+t"99A 1nãF&xvԛ훝sm$ פx\?,%-؆ ;Hi, R"\1g]ۦ?mX8u,q\4SrS~8(cNl59u;3=[ yΞ()%*0B^2XJ)!L%Aoa@ϧ#{6,x,_-2׌a):Vxqw0,Fv튙& ~^.ގM0˿RPmXpyVs"`[ 'É]IqA3 ]񆋟  5Hj ,U4PcgB0k^̘4Y.Pv:`98 "qNUy:3c2 cwڮ4k^a 8k%0F3 PCٺ`RL!-,E !g`#]p | j5,6CrካKֳzN# CXUfENc-i]y.5͕pf+أׯ:_gܸ.%3MP{w2u[K7cR9nӸ4}D¯o^mR"[fdM.%Aq,"  #ˏKKd<޿x`* 6L"& 0 y\I"6.̔v~_ aM<.Pn׮7*aY ru)ԙw3rG4B=:*w䙋i Tz:FSaC(^0/KܫR,3 i8Zo폷f1 A^ PL"FN 42F/眠wC ۦ7mkkD+Д/hHHmr= &r&)tdӀؾB̊y*N+rU 5JCgi-`Tv\8 =Dz!5R,9FO( ￧,ÈuzR)^) Ʋh QD[m0M[եL2Zgl*SS٩Tvj*{ɦ)_7 I dOq ~CF8 C$Gkzt߯'FiKwVɁ^L+c)m+7BDP̎Mze]eWрw'j#bO:ՕVa_}iw\C&nuƹ&8_UGg s"U_|HVnq]$pPV/'~D(Af%*.ƯͱB+mfgN@bI%33%fm==~(AM]d>6[鬚nd^{j+S)((ہ=IBpQD$*!|pleSd11'GaH5mGݓr\n .٣%wB c}ˈ h͕1{Dq E46{TRluӒzo‘mTJj(6 Ɣ/@h37yP4|oBT_b.Ɯ n[8߽8/zypC`Y Bu{͇8qoAV2h>\>!`S\Gaa9R*e|3D_jϛٷP27⑝T}WRGzϺgcS'53Del'j^m?@>ܫCoa:UR즁YN *Ώ&Uld5 6秶E#+Z} ND ʹI00׌/c!w:­={.ug7敾IKӽN׻ʑ{1NoJOf%pOHMVo) |!E/m.Y¼jz-]XK!.[ ;9j% ;ɟ?e=' NI|?#߾&)l;Bč1FG!&LcOyf%=GɜT졘%Eq.]g1٦ŬrMn3zXQR|=8J;Xy[cks$Uo&:^nkR<~v^VUCo$Q`~G9MVI5Rז}0ՄOtgmIU(AFMh 21&ȨXbá )ĨVYUbCx`S[In[W5ݍf6mbCLƳ0nCZ%f :pQ*j AM.fBQb_:C|AOb¥D" d )W,,r2-'Nlfy\67Cu5aj#Av53_35KVz 7I-gwқ7Yn~TyAn7ٟ$}}ҟW/Tۻ;*h`3K0}r0.@8ed";KY0^͢OPiZ*_;ksv~^<4*m7#j&\P#cƘRQKB0eg4;r|Q>Rvv nÔ>H1j*Ft`6„4%ɤ%x|]v@&80m?{Wܸ#uaf~qxv}cP M,llI  (d [Rf=!2#r\#6Ĵ-b0N]\۱A墀q)baa05$Uڀͷ1C-2löqTD ] F R !<L:'an46['q do+aq$^5(H0n`q Kn$*oo^m O&, s <+&݈Mx#*bKV f 9GwHm/qzcߓ>=xJm&MOڅ&ct 7沐|ǣ~F 1-1$X!,IoM%i !Lc"g2YirϽ+ 53O<-iؖd=)sq(>ɗZθAUW`R.'EjCHcH |J}$<g`!:|2]w&P 3N #CR?ԑOƸ.-K ƿ.OuEj%Bڞ&^P׾ZYr 07a^V($yrpOd%tGuql:GSP u^EUEpC#v)4yRs(סyHS6 /p "mr~%aN$>Lݑ;}#iyߞ?KJH;,8/_0,-d .& F5=WMQaDΌkz!H.5KGn*yʣ0 d sI_pJA;t&I ۛ/?^_ruX"P^C`:k;V3? ˶cFx$?=APE_kc0ݠ_x),91q#,]1)ŷOPff"fH)fWyk([\tB4Sn\2xФAڬd6->&~> a]>Ќbes/t}s,D>xH_D4_\1 Ţ+3.TsxCYdo"Lm0sEZZ@Y71 |lO,FoFw}l? IDd/蠅/xFoizlQ&ƂmȞ{Nrk􃃯" mb|zQ`4Aa' (`ve AιLa.SH jPeгi^DV<]*dQS[0 iz8оor&K! Ӎ\7 |7رL'O~{ġs y8X& }߳AR'}hA*Y`( %vsN"+\dH_uJfNTg{ATl8X rPVUE7r]/5bi.O ~;tB!9;+dk>'fV0_V,2$Udc Ev򜑾GNW슫[7rD%0oN& nǜpW%JNvd|RM2Ҳԯew_w[+3=iM^WĒ?[}4̇Aխ"z5 /cf+.c`TR)e PlYmkVPRxݧƠ'e $FH40N<ԶG,F[2ZT\2ylhoX5ޤ2n6+9A. Ʊm9fbpQe KI$\ԭg۔z] Y@8VH"k=2H 4g?(~HU3_y'v}5ƇnցXz]YNI gcjtD2ǭLjHe=Ô,079QmTbs}D#@:_sO_C9u5&?|;Vܝ_Aβ]UCD?ooIicbmp}b,0ڮE x%9R)/(ERQYYUZJIIs*նؿJ,$=RbEa䔒|>S!}5 Z2MB%뻢Qӣ'kѺ)FW!6Ȱ7 ~*x,(W1:X"5Nx"rPE+˓3ќ:VVuV⡵n#J:I. <ؽP;F M#n@|=+q;-#Kr癁?Vئ8$֍r 3㴗pnE̼RLE09lPn-|yyhkCv?CMUyΐƻ;E€ 6{AM CYRE؇]'PA|;1# [2 ;Zԥ+ߍDbD~JAvj'Z*QTG0I*mJCo VcCyXy{86{RQW'2C3o n`yv%XxuidKMsI$z4=̟f^>=JBpDZP;0*!Z:CP}XK:W0++%sWQDѝGZM|/L3M#vH me#4PaUO_@Os oˊO9Pb R}nT_@ S_*u⵸2+Tf>6fF4wv=vSD'L£EqT}k ֠n`E E,Lkcbʽ0&չFhΊ 2[& pT`^b~QbD=db*6Q3dt=džOu !605F؈psme wWő/J{m7]qvƿ- w."ۋ(p =£8r(5ۄg-/rߋe)kt2mqZ(v&;ݎh_yn{ۭTUkG`u_z7uZ#X,i ˕rbrYdc$4q8p}|uXċӀEDEb` qUw"B55R٢.-Tc| ]}X >eI{XWյW8.3w"pOSaHq3<[xz-<ɄE$^lU\)"e MDYꠜ^d)tb,Q0~ yDVSyZkZBDmF&h nfh.}+z3h y?Ê.3s~%Aj] ׎ b{C; |Ρ8K!CcO\0C ߺ+=YXi3`CسώSjϚ$Vr[:ǣ${f~vLua^mIF9Zrj-%o ֵ8l$zc_:+&RKj"t$ZQ/!Fh΢hME3&}OڢPySdD#U^ m]a Thz`VY@|D|e\S8_OT 31 w8A,!h\IryS>:3²gcMk1 ybs#~r+UnF]pJx~dv4fxqlb]pFQ{>keXwќH@Bmk>Xew%]nZz_+l۽ '펓st@TDHT %RRtQC Uu?u 7ҔX LrJ臃|rð_Z 3t[i:!1qے"wPMGzgP\? (ڑ!8iz# *s.!Kij$35 MQt1+yD9ק/gXX.ݭ}5Ԑ$=f]SܙiK$qJML 8&c67E\ek+r>/`!KiREf7WlYtgq`[gmv= _.d/$PMYg zDۊ /yz764?Sۃl^K#\:if0pe4KYh-'YΗ=Rv4|]#P/ے=E`:s>z8x_T0=?VdF&cH{llFۺXdtVO"Ȇݦ9avANϥ]ߪbHH}_!Os*Ew#w:_֡!QL 汩s{.3HIFe]dh<#J9VFXS. Q/={  F>|}l 4诶:z n;{ ڇ5E]"Ҳ80;Hث\VOrї{s &5sB)>ѱAG67"6Q"r`p5g3O]B v6^- A1t1)T1R}Hx>݇qmT+ߡOZ ;`>6i@k Mst a~6H/ EߒIŏiG0TVN4A'Pţ&R4b;.Toմt}fEä?b$QV3D3cJRdrzCeIiE!|Sur^o pe9)ꏮ_kÕ+T4VuM+[Q6 UZR䥯pjz^_7j߾ b9ȉ֩s,王"x*:c:"z`A,. К4}g7gߑd)k׏/#pXKE`ƪ9W2|ub8*A+?oen^CS $LudO5G=葪3UܞNG?@Re¼xŽg ]!sEwܱcTY{l uL4Z3eF>͏^d~ :CRE'RV֝HW?qq^,Xz ;'Y&\;?{|&e>tϋHt׿m׾,ǶՆCd#gYE˘q[ {i *I@ŊPGA+-` YaOZS)73U`鈂%jy;JAJ1UbUIJ 3 J8R{'%2@T2'EKJZa+!CWJ*U~`ۥj^Ilθjv'E),TNQ%CUS߉ GE )>T}zMGoL#xQbR;<# Qm&mڦbόTy߯ך;?5U_S׽XFwW~}kٿ=W4ID9*~ =lluOeYEنtNUhv;sW]ǿEwѫh@N!X… Zi|rrfl 霦fؚY4;>j:fMM<_e+NȆž׍^o+ 9C+eņE'ىwAfU_a7tA-XAiNSq9!lJT亭)_ׅHixi۞0bۏbIȷ qM3H,ϳcc⥽j^Z;ܰ@yށrFh]^Z4 BshUӇtdCVQk!Iw"hwWNL+iꨉbV2Qv$&٣jD/{ zYVe9N^h9)jed3L2'Ip6!~n#&Y${9} x@r7 {VaWyk:Ǘ??OA۩1x):So8z1RTdc ЍugϮ "vd`ԽTLnhM|Fc'0('c2$9ES_;h·q&Yͨ Zl>$˼yaqmvh B0-ǷnOe8}dC1"Bk%r$O= +Ӻ*p*{l%H}f -e^2 YdV&1CS͋,RiOVȒ@@UOF>BT#bǘIFKn1S ),T|X[H5b%KTW.Y hd-M#RTH v8Q {{<Hjl\>zYpII*ŚeٜYN :b bܽ&rF)jGVOWEx$rфvJ5|{׽YNp~Nϛ_ot"ÎAzUgU NbXѨSعsLM?U4O<;xos߅?ɋc0䕇r4ZMgYL1z׼'߭t{o50 ,AlVVV\ynߣ5WT-+E&( Ml8EGٓyKށ_AS壒ris$f] "}]ţa'!%gCDB|v 5y+,J*V`$ULGی+d$ ?WnCL55#J&uy\d٥]7<#JHY! -7} L+t]~(qUc|ïKuj'0iV2=-;9cS31zƕ^B+IH:G4m fh@o۹BxٴDӷ^Mf./o`(%(=?뮭g@ A>N`CL6q$]!ύDcǝ[^L{뷸Wjo$!A|FǏp\Hı%(rljO9(!S;]J pLt00gu27 ?PB3jePNj,W!5a_d}WQNRD-_(ol8i yA0t56˦Q"Dk;H"{N6NoiYW>R&)|4_j\C;lK]9=\э!ߌYHG"nɊ.U8~\ YH7h*$۔ ӷYssߪb଀b}SmѐW zw#w:_֡!\mF8ͣcŒkMRњF٪9OȢQ&._L]k%l.`~#3&i[j"_m?-Gt5aؕ7>Y,QEzbc2FF?rvz G}&͒5˱<]QRgO yD*ng"> A2%5)Tj1l>݇qm$;}RٻZ"ai#4oM`$p4HCΥhS<c@ 0uYU< W_oF.CBVM JW7jQ4L:/',Fbe5+ BX{Pq+I{9 m[Cexg/=>a9 }*\SN8=#>x\LS:q++nn?;JO ԭH_kU߶7L 2UE\^N8BRh MoyX 2Z._ jcӚ!'jn3 I/(F+Lrf.Zs~rߐs5~ݎxH9gIba/-OE#A 5&#@0*Qk 1h=|˟27qZZ'~ɴG=uEϟin7#SIY:?UHT-0@\؏=6w&V_ 2#Q^<t,fO; x~2"eX=^)cp'Y&\;/MU~§/N"K^Zc+ضolSSL,lU\U]*[RjΞDTe{Fr wKE CžIV~gfbE5 qbxᖅ`)EP5˥%r"Z&dHyI Z+u `b UKɽ%$3vq^5;N.B*AeNa~2ͻoV )?`ů[Q 7z8N,!n:flQ̷?,]zIJ]4Ç\"<ͻivHfML9K;$QQWZݺ?+MzCq`9+ |߳͂qT͂ae?\6 pC%i"f`蕶C}˚.啴6=H POd*>tr* rz輢>ߔN-_w92ag}]l:*ʘKs\1]gw<|97ј\Q|߮L0=c o/}ܤӭ-sIY$igeMSzKL_2ৌ)bʸxeKrQJpШֿ{t&o=~l'fxscc9M='IXAٱcfdfKt*/f>T}>`r%y{ SW,{\uYWx 빇LrSL;0|rж{=RxR$]D_}UGI+:NSwU;gtF$.iΰ  &@8z%Dᎌk)upgyٚ}Fo3|M1ޝd-pڨ)ZH',_.T,g;2$q뇮AlGrg? {噞t˳F? Ko{ڀ =m`+A *-܅+.ܺlt_11 *%JbDbB0"Br(rulS-ߖU3t}s&r8p+r( -" ?oXvhys|F/"7ٛPق Ц""Jg{;rq1}I4|ߧ}ߧZIkHg`@t07]:O# SPDzɃz{āfָ%W.wtAEi@Er#hbI0hZ SᖹbaWc4c[@2!!5ߞ>,@0(421a6:GtGչ";ﷄmK\e>zL *ݏL)9w26jdGhrWwouP^7uzEW "$3@D8I @) 4F<,bƛyMF!c̼00F!F]Vyc͘zA7y8zYE7zOxA7/lv&:k2X%L BT,1HP8q@Gy:osajJ:2ZԥU0"rLĻ,MR3OIlT(8W*\D1ĸ]G:~U^QzÎj>jE v INe50㚆fDòcZ)[i\6 ҲcYmZ/zl u빞R0I;A󸺚z 2+VvE/˹-/4/<ڲSLNy|0tvR3mcZ}OzxFqZ~4ꞫjzgC֖N2K Pf, YֺUR6qi-0+_]8~_1pYaܫŷ8BXsU}ԡŀ:B9Yz<8ݰ y ~VnpKk 6 }Ca7Hmr:=@4fxtNPכPZ,ۇ댘9ܺ-mm&pE.-B ^u/HV520R \DF2 q@y4Y? 4t֙~l _ڙwg2& m7@q}F`!l+Dߌ[K?.v HHbځWEB8 gw:ȹZ%Sϙ*NM>^$ n;^D2SWf1fqmKSxXESA|,qui(B"q0bcU%ًlM8k|'?uTj_7WJ1DjOB-SOjNv=H0 Fv^UT#iƹwͿsAs 毲9`ӿm+raVse-$jkV DRBX5yaw/13(}Moq! >CZm3ۦ?zTL3˹ޗR%zEsKQ.҇艘ZQߣٍZ}aD5ij%Gh 'zQ^nIJ̧ S3U~&8"ur,8&,P(D0L:L|m4T^l?PM 8 1ݥ /9G֐v5 =z}5͆r,N˹h _E[CSE[~d[~lxˏ7OwzuU5e$ZwuHƙ<J2{sQ.9lʺơO&[oE|'k-*2y݈wn>~%n/jN  N6BYcc8CI,bIɢKʑثuYGy9lCl+W*4T&0=jAt‰Ɓ.Aa']stMN>FN 1l xne5A,4ij~N|U}x<+ ˸i?o=Pnsr~SdMS,/k ĺw.3gLed ȋB)c_r19l\z=%'8c77νsH;F8:||Vˈ/kn{G+u+II}]:!^\㏿}U'Z>YrDDo x՗a#p/-Q2>0wNLGkY3mvGٸN|7DJ#]&sBNuk g% cH I.H8G`x^]}k@V]2nBAH :J;oؾƝC)Y`4 9W3EmG<4ObW,hpu:p*Ba  c5C(! B3ec3}}"1wPjFnzPFLM\ᅈ@dfBD@ޅ(aح ak! I X끴KkޙLvQǼ>%j ? Ȋ"msNkm֒v*arA:F$ !JdȂH4!4CRo+u_.]Bۯ&X&OWCG\l;"_N ektpxT\j˲ujULI̮ؐ$.qy:Zj:^j* PآZxZxŵJ|-erU&+ǥ}|j[5JpQ8xuyn@ UBB#@Few?MoHpX* 9.M $H"FanЃ-zp]:`\h>hv;`5H2P"BF?YD]& ĐLNۣΏu/Avu]`m@b}}.iLkD hks c'FO^T؋%\֯㿼CVݛ|O ZSO*N 0^ Hf&!ns.r pAy0ҟa!cBCc%jB^e`ݙg@ϗ65Q&'ߪқVyp{c"8@NfzѷKq#^bGڀrjX9jy,S=w ssoVϧ|oWkR}u938닓+W> r;}>C%''J|R'.[V lgq:J >FF@i%UY(mz=ZZS,F*bϒ $A0{x׈:C:$U[#!@6A҈^v>D-_%I|яiLNvk_OD6֗d/DkT[4{S[tZRt;Qi 2t\,[Rc|mO#v8H[nN6ǍL-B潠=8-=8}RpsnY%;5*{\VpAۖn^J~n ۶şu뼟=a5,K6PΎV/bWG9vwGZķ_Cg];_U@kK~RGX ƒHB@DX %|&W SBU+ZKYM U^qr^gk)@m+6gWgݮ{(#iYF۰P;y zܳ [N}&:)_鉘> _p|Sۭ{Ae5c5EӸ,XpG\$$V@@&8$I((BrXOb'_ēoM,޷h=MoYß<7sVvZ)@[f`Sbv%B|i#s}>򑹏}dI]NC0vAуMz(˅kmӿJb۴LĶEVZ]I6@huHbjWzKgSyV_EZ5{Ps:gjfP`wC/xLc.ʻw~Uv{cy\8Z`1 d@dcA\@R/籂s\QԻ+XkA5qWóϟ#|ç:|ç:𩎽-}ç:|Rb@(C Nc&*!f#@JYU:Ʉ5ֻVc:0AK$ m at($KYz"V<ӇD8%Bu;3WП|`~mtDu*ӏm}a8jNwCre[W餲o;ɩO&f&i&7mƒH&%K(Y}pxA>y{KZv *Ƴ|d{r,*7a.ŭ~qd>̜'O݀ǷV2z"6|}?w?ڿ~hgd2%S0L0I2QPfsC٧Ey1Q;:2r˸qq8CZ6{yAxG۴qՐyۢ(~+xPM17~&ta^Lm~ѓ}ee9-|ʻa)Zey,F?i{NNe|PZw >3||||;ƾb9j=Fǹǩj]v㇙ZZgH hWgVeD$NԒ^)i" W8]d?kKJ _9> φ>凐ѥp{vdW[;KY)ۣ}65ƴ6'~=CU@VY d}W -Ce˷ƚz$jCgOM#Č:mf$",1) Unӝ%V=wzLZsnjNx8ܑ[;ywa9@\_9#X'u"X'`~ ?H|i!*đg6TjUKs YB3K/C h5D2%کhOB5q eNVZ]TETr1o(wF _:rZuo儀Y888BkNZǡ 0xIi^?[<|yM}|}5rϜPAR Ba$2LJ&FhRA9hnTEHr*vj?nI/*tjtno()00̾BPyaYqW$jh[O^BӲTV#tW59ˍ->?z__^z_RO~r9dž{ZJ2/YTy[9Gj^Ү-Z}*e U6el]%FyWzjdq+6+E[J9!!/S,CMk㵮zI^8:2/oOKpIZ"3ou-v2 F2 }{}}clg>]_ Zǡ?2(`8~ӓ=iۄ2?{ C[/,ӏx5 J2:AWFUq^'l7`T'fa|7ta |4 A^+ !!q%nP5أ$H&S @Ha e =^k=&B1U[6UN7ʹ< Cr=JC`+W1僤P'wYr(G~^#gȕx3!,wws.ܽB,ЏyF|<"^n8Wm9t\rRgP:jNt>58-ŧ}R4f Icej"ԔQ,8e҉ZbXW?f+-ԄU>CΰD2QkDAl2W3s&vxzCQ2x t)NlЯqG=PunNjl,w :z?ۥ7Z}7?ʲ#&zgaz‚N] ;7W}aP[r35F)vp6SˊNytM9*V.C+){kKə9O\%luYf|>py4+6|}?tXiG 'B0$D&1R&44LSu(W`d|7 kVe"1`x;7s"RoGTSY@:DL~S摈d^ͲGR>uQW/| iI?!-)%wt #aW$ orp_ܣg8!ɖi 0 Cd$NT  -RlCEMyl[<\-hzjzGG5J]mJWCL Eܭ4 {0S8Yui^ck/KwE8y䁓NMh&~MXwC`8W+4t^eCfCm20ۭ"Ba!V=MD|jVҬ556|gޛfRߔioص}QF?DԳ忾-yjүf?a^𭾜jA(Z1HQkqdB|={ws{B6;?ɑ/oJۓTFٞV'!V`fJ\=R?< |k"uӲت<|^>~;0dHPnDDR|(e[V#{0c_@M`sz%Wf5=qeeE=_˧𪛍m%2GwM8O_YWԀ jA$K`BbE4Q+5rkAB Xś,QF^Fn89`[uM{-΅ @AaA8MI+ hRHscZ!I 8%)D,:}h~S_B*5*te;?7/:&qX xN'i41' !D~q#x=ՏX5'Ϊ$zs՟/+n>\+ϋq}^6?pęp4悂&.oXĨ/(wD7m8jfܐSo:~<@]οh_k%iesuW' 96V9$mCUdv5]6 W~ߛ+X1ٜ hF4rZ^<4,Unli`-c G<*_؝2PŦQCdH\weڠ\%C(#/;]^ak5d܊YU'[_G~|v/Fffɹ\yqɢʻb1VQbr®̕ #;_}m祹^"NXfT#{Tɦc6uXrTBn}rׯw\A0{(lZ8k/;Mu{~Sq ?|3{4Gh(b4i0ʌ(Kq}N88bPk6q#'`s80Τ o _8ʪ<d O-P)GxDgAe&#w/ 'zc<823b[Hic#+ek&]gv`Qs(C_#zH';< 3hc~֕#ۆE^d/:?[v_jQw~QJ.g [/ziH{5tǖː}3ە{:9/<ÉsVCbL(Hb-cOck1 XI>3뇫qNڍWfخ|?Q!>rI*d]x"N sa'34^ҟ]jbtUGOп=KvyAGm#'[2AYX]K_ݏT4iV9ɣeIKP$(TFf e(ഀNz4٪s ϚDt;BeLLAC;s뼮LlOG5"0\JSB IgS5dD3Cve.SLs6RH^1&6l073 :bD it.^ r s”n0k O ;!tWo_kw~Soͳ}#/N:wkm`4/Wⶱa;jwzқE~c41xBZ~/ctQK%]]>n=>qøMӛҫ@_XcbǚJ]~nOY|}ۿv:7Lp 2=- 6Sǣ)Ղ> p'ήWpF{A5Z탅$%޵5+ڪdkd~cgvR+>Mp-:d;ʶ$"([a2 @F!Yfk+(UHӼ>&+,V3z! ex K- @a~0kU}=0,d{0p#=M0v=Ks樓eZ=awJTƤ'i0$)r11sfbuNuOOޜ.4ϓi9y hɔ㘶C`H9u/ $"J^}ieͺM$/>< 憵oM'w[o޾$/>z0K+]x|K`eV6m}x__g>q٤M&e5xɅhLgcxcW _Ar @k I!My MOz8/}cE^x@fUEi캹OMZsolZ: xv:oyI8>FrX}wqV3 =~}ss Fe=簼b̪Ax¸4F0'L, u$俆YɗM«So}ǯ'8y_Zb ^d/_F~nx'lׄ\ƴq͂#af Xc聹~c@ɉt>K/ONB9w[hԂ 5S'i$Ӗ}rpU'( H@qnf6«A]v*z߫]s~tӪpB-VxBŵaw ~b_Aޥ4jteW(<~7TMFw?ߌ| gE7C L #wU3}33Kg@4{/ ^>i.!x f: zV2sij0߂z' BcBcXtr7:sAC%ƳL0Wۅ~55jj z+iڗp5[[`LZ^?'!Tp*lm*)"Uo;;cG"P\><tW-$gIT 3y Mtc@K`~=|Z܍-ϑb#46V!p42i9|*D>R:$B0 3o]sh_ b0Te{Ęd1+޶',IڳI֠?& ?"DP7[FJ4We92g)#K v>VXY+ace\qk2-V6RptATRD]q?gvLlCd-[|&@@jm19?>I`鹋#0&dIud002Iw<M3};%vYޝ Dؖ|FF\;\1 :jU.ԑ]") g{M}8z[y V[c_q =՜L׌ʿVtvUibC@<'/`|1\1^F8`Y$/wZݐvnӦFW@|=Laܴ4I_;!Cc|`$h 068Γc{Q0VM[huhу4UUV#SSRMgKŚqSuޡl1>Qbٟ*SCgBɇO gaGc6IᬞtI8R _u|wP5+- 3fC"ok_V<26J"6ł"XSd%aæS,X䁣lpw̷aw4&bzVK790 SŔmxz2oр-qjrK%F;{`Z7NK߼llL'"VeY\Ib˻0J!pBtiC4Kc'0Tlû; A~ P_{ a׀6n4j}T"2ATkۖ@пnG :k#6j˕pE2L$%8sq׻p{pu{ veY{{}Ea˞ລ5G@5[c-Uxw7-AV&f\7IuF09C7ITs7bG<)F;:jKJαuN@)a8# U:szK1BV,?hRt%5JBK\Q׋Jc'Ft;ֱnэ>n["[N Op(b2O3ڶS`$4b52W\<M9bDv$`&5c1.nqJ,jRThy1 S Y*IHNҧiU:3 ÐmZyGb(3:W m![B7$+ff7>4q$V*ΐpb,-0>zcÃ2Iɂђ8/r H>:G36$`wJ쬿Ҥ~Yn`FLhg'J{'f YB!Z OR*A*~nHs/'죿qlܺm2 FSҔڤڤ4n;bu]=*mƿ%t;Y bsaSGRf#b=qLcýu<&;]C9+1k(K(c–:.wÄG ߚ;}K?n<M5A)ڦZ 12WDXF&Oc*]5r$;4t\h>Ed,?tǣ=t))ΈLT.ۮ|tbȥ 3T,9emtƫ3(xt&*w4x;%{,_XHjS BQyvs U[oy7KRɊq^>b!V.V8je#"jLMSmHZsl|MNtx.Qr7~AYNBuRG~ԛgyʦ%sM&c1פm2 ؚ M'5|= 3Nޛ!(qlߣ O@ .n7LK )|1S $-y`5һgr\cƅl U٬]ug:NXsL 7d6YYJIʜ0Σ{u V1}:dj)̖iEkq}]u_Z3^q|3yRr85 kX&-PaO ﳛv3W](gwx3u5m|Ku_MYZ܈ YKVl庬]Y.)4O3-d0ڔp%3"=STuJK$J^! .όo o w I]=ZO㮻dlLW&Rc|ͧg6@pu bF#WfunG oXz_E3wq΃)MiDrr5K<;̺Q6㮦ݙ6dԝYUg7G;޽ n,wZd:O̗s{7/6 icZ {{QU(r軭lXLzrsϟ!LrZ;m< j?lk{D<[Y04K)OAdcغ\ bCc҈`cBx˜1`)̀-s&:9ˇӮ?tE?v,_n$ x`I+~ w˭IC|MjÎ(Nhˊ "KhG_^peUV4(J,wL,ѸLkz%g Rtco?a(APP"ښtcaXtm0?=eppH) v"9[e[ ׍7fǪBW&U9`I!egYæ00e6f9@Ts "EVB?)447baR> #I )qA{{<$݃?4 #EhĨ?ťAtoxz ȑ};OU <'^p*i8JQ:qAIR_%AT"Ib 2`4Fk+}sQ0 #20:/J(\oদ`"cO]:`9.aF} F/2glnKsNb b2iGzaڜ+kX̽Q-/oV\KU񴭻ؤvMsPD1%LP=2?B Ũ  -C"9-o9·6i7ڸ`/9 Q!PPE'\Qq"$)}v:eg[ޢCo>[7 ʍ~TX}̾hSf¤#;$kϫU}Ul`U,z 0L9m.u9눭a5QSM}zVB(„aBcǘ@I&"ũ "M{iRK_ސ!0PڒL'AirUBN.^b>'K8PO' `zMx S nRưUSʮ\d Jr mYz첼hq If>} ەҳ 6DilPkS୙@Wzu!OڏAZu2ϖl]¬ ^.n>5F`r% 9 -sƀ-o0? ތևᠽ|h N騳܏ٟY=UZA~xP1L57wd|_ˊ!KhG's9wr gƧIhj5RE_$ɧ5o~ Ql,qQ۸lg[/ )w,տ7LYRo+ueņR~_ѹ$WCLz4!̞dN:8K^Np昶fyŀEXdyIW<1JB@\r *C82FmBm>!]@! ۡ6wCm@@9N1F|6KC %&Df/.9p}fɁCG*+ZVpLRFFiK?,|(08&I,hÔ/ QcI*8$Sq>#Ee#cNӬ\Zj9`ġUխj?Z"p@S 镅čءP$ת ŴKGB1PLB$* 45#x$Ҫ" ƴI1u]I qNI\Ҥ]r= EU=9@T$֮= FY͹˻oק#ۅ*@#/+] jXb`T%/oiUu*_BA`Ⱦ&`Hܪi7mﬗ9|bƠF^SSjׄb*`DSn mMN0] j䄂ڜCN0tG/N0.1ϯQE'JE৊) LP a) C.HJCp-{tt@ {GѠrGq눞ֹRT ;r"]BKMq.{e3w;.{аTqѱÄE)Oh#' ID0\T{Nvu@{mf~*ﶅ,§mm2 GfulJRK*2 @-bfةaFl\G TxfKzF ͦP^ӜuҬ1WN}cZj6Xx-fU0+׬0db5l`;q6pBTG іk@t۬PZ]%7Htsn.D?BbiTA*{ٷiVS~a?;8͸8Z ϣ}_r;6+.QsǬw l8%6|(߮EXf 0pS_skN}nvFkZ,sDɯoX[(qTJ@8JSJ4Q0}W8c>/k?Ks%Kxpzhl #+*xg.t6J͋^|S+(xА޾q<+4.uf.dn.>[Ӳ꺫 6v^l=q%yլu/eJK0 5<ʽγkoM)ӝ\݋[oKWeWN0ƹZN-eV subnVY녬_mg,9(ōѷIP"t}sevqkS/Q]zF~Q\$j /~gzxܼڰֳq6vS7ke~^YIB?=濿(\YJ_ ߋ>WN* QG] #_^I@iI 9"4@%+>ga@RFbY qy"ûGntˡ `jkƇ^5LJ+vwïAw՗Hq lfmsn="eu0~|~'ыk@S*عu)62ǏOo'sˢcpt%ֺ_9Ƨ''xRUIHb`D#2BEq@dBw)P KЎvו&msyjyi|BG47THK*dfw 0kXi~*xVDZ k=.X 0.1zrѷR魳rSݞnuG=}әݢjCOzت} $]y3k0|-臭aD6s3 ?"%#!f;B?B,w qv 8#j*o׼ǝKF:d7o<1kȈW]2b֐##n ]2"䤣g۫A8{Y|G~#P]INkezzjJ]7oWK|Y1'tnYLRV֬]A9P]Y? :6>bqbݯ!a$\1QbS RqʤQl\n,]Evn9=D]C3vxzfql3(uMtQjvQ3Rs q -#DJzkqgp;Fw]1Uy^yڹ]G~&2i BN OOSL(U(iƺߗ{_)L}Δe #3&J ;fa&Qil2i6Y.K ]%>B+whxR <`ŹV8T+3x u ^bS# . SI))q'4<ܥ ta.҅]KvE|wӅd3 TaFOc5\Kė!uΡssC:9! Qnʂ{ϒ |Д7d}ޮR,ōuAr99tΡsOg~אĨIDHď Vq)iDdf쒙]2KfvnØc-/"Wxˋ{.^7ywFi;N~_>C?oŷ:c'y<)&2&]%V%T8bJmK?~j_[cqRLeRY$)>@lk:ew/@JݤZ])5|9;FgFI>m񐈇D<$!x8!INh0!N1qgn[TRK)j$0ۋzؗwl zHAGU>̍}F)zfEy1 Ew{ v JS\zuȣ-ÒBT1Ƚ0לgK !)!`s(EYʹ) 5RQx=B=D$z&3KֆcAI3`H13:4tRs314H)nCH`طiRHyyS`?N%AB<}ogEw~ <tl2 L`Ѕݦañ;z-ij*#p+HD2+r2Ʒd@ 5s \{Z^4u)riYSuVG"S 9ș4b!|9X#b{{tKbI#}$$>!Ikו>朆R}R<wMjat5oo泩+yqy?^l]2\=v\ w&Xu~?[A LILN3ÉZQ2$2SJW.aRCH)ᘈAaSJ@ A`,&*CLooL(MJH qXvXqxic/'X~k> =v3>y33󑍙1eu1#8M3Y+9وII= oә#v(d4;`T ΓFJi Lf<:>;384Z%lKNTc0$djq/K`T٘g Y;}_yM.nϷ 9(d8*&*2Sq7 w]agPL P4u:AK!A9CYʕ5(-0 c'&*1QJLTb Brd(DQ@ m.TZaQb^ Ѥsc]Gi2ڸ;+8QB kQJM # LeThTJRi\*K|M _Ül6nqDq6eѫqmt}KKq&~Ri\b¦JUnT\*Kq]+Y3QU\N 4y0‚kPHbc*M%n*qS/M-`}8FWq(X4:3u!;Jqk;Ntu,&KIJ]J.2K*5$?]CP9*y6[Ό0,y"vD$b';aĄ&C8~f#OYGY'G.:JSE(#orώZja8us@M*qFsp8SHX-*ߣ^(D% /QxGIbZA1MqTKXh=9bnUzrM <0 Q(|ӻС>"tlhEVA?a8hyvxL?_LK@Vq?^s aJtƀPXB$%͂Ów=e.e~j\xmGQb' HVD $^"Z$яB Bp([5H_יf7 )1*(ߤ2[Df{ ~7flͱf*uvT-tsܸW&4*Bi/IhzzC z[Hl} XzA淥{z6IXzJ'v[#\A8Qi8_,!+Q瘲 \J 1L58pL ǤpL ǤpEC `frEQ DY $ێ `W̱J9F4)L)j㞦퓀ciƷ}]nWEccQM2fފdamhFXv腴`k*7yf"mVVJs3ʱP44'-hDK$Z"^Rɢ!L%!%y% B';D5(vΒdbp;M^^-yқ &7ز7*j]|."GS! H T@)ʙʈ'9}u~sbkLSsLזlvz1%y^o>=cz; ^7*L{@[ L"h^yz5*K" K@bK%kHHxK.U5d+ xvmg/7pB W߸h);(;(GcDeKCYDfɰml[ul5+|]˂DOtɥSMa;睄QDe_C}*F!upŤEskΫBf4JAՄV @NkesI$ɐ$$CrmdQ!(ND TdF&L2$O^eRFWA(ٕ6j Y] ֲT !R$K4,#;.xZӨX˄d i42FX[1^{>LqT2R]Fx+RbASPmeQ#MV;F&uƜC+\l-#w6I#Eحwd5&5鱭dԬeɈIF3'cZOL[Ԍ2f0{)c=԰2^, >IPgsˉb[[_2bڢez|7SN8h9˜L}|߿M,'ܮ,F 0,('il}ц 3Q`;S:&~)O8S.xz}nVmoa4Gᆔs42q7u>~}{DP]VX;s|VL6%,0l6v>8GszKE OJf<䞗zS"ڙpžt \fYf 2Bq Xdc!‰wLJίjqL(F kxK7? !aRZ/J&Ӣ ȏn'wtWey%706&yTel}enUG#ȿܗ5V >#+zƓ/j\^1Vy%Swne{Uͫ{c ٽԗI/ãsW lZR*J1qѐ&\\@z.ދhAիt%At7Z2=kBޓkZ^{66Rr>F>[ӽ33>4Qdh}{P;jx6^V bՐuIc2EDFF=$e,uyhXf8¨5`8M,=x2favZf.3{8{}lDC ,sQiʩ \B0$P&`+A6c%M$ֱC"+'Tr]7RLf}N%eK /% K $¡O\<ʑ(i3M2OB?G?ggK$e3)F&iKhQ._jd Cwғ"K( xDsQ':%...iM<| ұKV!SgjvzIGNR`Uy)J2ʜՇL^8'L 렕ZSNLBLII uuO3Դ@ vH[5m[ g <.<t+k2X) 0>v>+{p{2e +oމyxni->_?9r\|z?U(fL$D em#Vr(y-W{wN6g/tHC&ML1 D[ȧV/S,rGAwm7k|/LISJgr@]/U-F/,Q khx(7]_\>Ge_6 4r؂cC%Q#B!0#(C*aЯo9Y% \! d: %؜4pW+4`Np!̥-D6{3 @"Ǒ Y,6ɐ|(K\Ӝ4EKS PcˍP y &#Bj-DzԆEFo1E7l4Hoxpv-B'&ǘ%Zl^"Nw"lV\q" - 87yL@Jd 9[g"1a5- d-=A}u~b b|sE\W"i]yW{by1_􆿖+K0iVHxf0 )J |_TYQg)ϯ_֥GoדqQz__[_#';߻?}ԏ{ ck.3PswJ6c8Ab BZ1:(7ـ^n(mߋhX1vόKcXcߖeTyHPF$%Gk8fF~Nۓކ0Dzڃ%z~vUM4Mk5oӚ\r0{fX:K;*HY. ڋ,+ P€@c, MCǻjN IV] Aшwq&Zz-2x돇v4n9\ʆ9TCB5R\'EilP( dd&Ŵ8)QhmV%FE4:p {[Yd\i\V;hu:mG;xXx$b,93S7-Yչw{\:m敄[gZ$歛fqlsB"JS4ϸ!ޕm d0v.8`<엠XUt4n :"%5IZ.#GͷH"Á,wX% NZFϴ`uA%jĢ=k ¡V#_HRYIxe"9铓>9铓> ]5$;L(9H -EudrJi%A>`*rRQ +2X5&o_5fpiqr`V`]A-.nPMq@`fn*S &f1wĔ;5RʼnJC(֙DӰ%%x$9u@n󫘟$]2SX>W :狙z>k/_B cgƮ#ugk}k 7=ˁi1xӅ˔ lGx#. .&ȿfb0J 2C̸F\S!G6,63}hu0_N3xQ5JAULr]k}a4;YJnI*,CB1a>c3fbٝ`4I@2@m3ol)r>HѸ}I"#iVQc!'|{|pJw1c*484wL)A%jPxz7d&|R`9oTBTPc^1-{J rM|rBGab#8 ̑/w\bDAfb˶~r:);V맋$ՋN%":^}S6|i2Q8ݦDQ2UQӂcG{L_0{d;GqIhΩ6G \Ύ-r*͑*6Rh3jEƅɄ+)U{5}5J|07}`eF\8ZU? ʊA0Ģ%U_o܍Z7AWkFk@}.8F?bUo뇏liP wz+F86/OQk۩hc6elJS ݆f- % 9:#szֹ0Cnm .2'?¼SM8N }^aβiF?[%C U]X3lJ T-=v[%s[-Bp3cD" ckJeXR4|ҽбwX}]}Վ'qxkޔoiހVs4oeRI@FݾWS˭S)hWvrw)w9tLZ)P V<{{v2ڹiaauwJv;VCwDC PCYe*,T|ΐ~PʁMd<<F@V#(m_u,F5PY0ѣ$1T PLxMsv~?ļUe:x'bx"$<"10~$. uRnh@gY^WϱO[7'ũ Z]mɴO {iHb]V3f#5V$0.' bs%uRh=6`iy4ٕ{eWw `9ю~hGzcD4q;4ehD)4@A.}9t4t?odpk|-~ya2*p=)6/Hzޗ{3vsl e;'cOQ{xkA:;ZY~>w40jgAQƨ67nOn*vGҙS+gr7^tGh.^\+ ȄnASŒ$‹We=sE=0ӵ@^H,X o}"{VGO/Ņ/4_a\^)ۏų"zBIhqP$1q +zE-$Ll̰& ʀh9HP.`H I. %DAèSŧT)D[e7c=`5Wh{IH,V(h_GcfLJOZC6iFrҪ"OG4bq޲Pq-qQ+Ր|X?V#UK3~Y/Sw}lҨKY5N ~`1sj|\UP Oץr!q Q&V ttj9^7*R/1@wOWw(l;Ϛ7(kTV-]/J>=ޘKeA;STg#qRUFa:&)F*u:ҧ4o5[Mؚ;f)z-8ݍD?GC.Cbghʽ: ,hλGQvR5ۍZEn}\In;޳YB;9r+gJm9"a2MP&A$2de4OLWfFy2P: ci Tr2$<HYclKPGmG&/\*JŢ:z RMA9MGgQ?6~,PS)" 3ge fHl?}{w  u (hA~fm7 cu(oػyu7'o rT(6,v| `&T&e!9 0*z-i%ݵS}i'syv`7ϧ4S&fCEx@x@)$ ʜ  DX(䭅wTsBw:x?]kQ yti?/Ãi8r^wZ'W8V"N.r(~º-OELKAcA J.-k fP~(% &xzgWxI>(d㺹 ckYmuE|=RIArw! tE3U5fw%ר9A}ۨkrqVz+đFF-#gQ)Й<s=GxAPQHk0BaV҇b$$9+s_;_[NE |8;Sk)`IǮ93$,G*̦ڻv1q%a,F8%"xN)U@JE1є"o$=x̞ugŸ&-ٺ{}aI^~v58. HB뵕݄%C毈Zū,ͪY5\ ׵`Uy=ʋf:*k3]֭pfbE3 r>)jBԯuⱄNJu\̪ %V 2+lLkJ(1T"z odŘ6]"+n&N˹p*R *%'*X)T$lZuFS7/F$ XA 7Bie)2P:MA8fڠNph3v=miŸ3㔆7ͬnǡ"gz+;X/[YA  XrKXCZHe'jDr"=8sO̒<.=0Y3K?C791K`,"e @h-CYi拐QCӷ7ܳ?tk6q*HJHd=LI@D-PVa;T75<!7Hs!EeuoN+jPQdrN㣍sGq61yoۃ]l5&j3;uL8/6,&z2FFD0Q휟#G~#!vU]A)'4϶8xYNq}2#_tPb掟U\G]E#"^؍p3CAZ K:5Ahm+Acs/%uF2L*2u<1;f7 tV-ո7޳ux<_bn5 gw6:~n;`Bv|^)qӟ5`]{t:| ayɹs+O9ŚtbNG9<G& X,qgx J:: 2kFRZosxsFΙ{m I~jSg݁LޛƋ?bt/"SoD8ߏ.VK/EM6ɛgdwU~fjM[lMc Nl> s8m|*Qէ|X]OnbS_wﺷ4MU[n%&4'/T5bbm"+Da `L a"/P8N(%p}9Uodckoeܷ2~@f|6q}+'k+Č|Vɹgk.*9(JN46P#7=|MZt?o2|hN q_tOQŊ5릡eқ&2b*mjZf{~mޫ{zGҳMdLGxojB7)RF盄cyI#)@&a#{$ }$/UI$r-A$8'=%H-sb9k.v-LE9qⴊuk=~y`*(fV5M}~:ݢX~"ls0'{#䩺P(9a]HYG܀eQ N{IH|Û$l#.Sc}-i ;fϑf})TqMzʅ7+&%z/oFu0T=S`=s?@XOJ@}‹K]w)R\R~DfhSJz‰NpO,XBTey?]# nWW֞&BS"p5ƜծwPx_HخwV`Brd /pԢ>xT4Zf: A8`P8veΖM9U♛~+ F/fo 4&]uSk>4p҃T AE]+T.YS)j j7uܦB% l)Vnԝ򱳉-.z4KWmwZ$\&CQNciz>&vi%qk~2M`oMYËn2Ar5zaZLoR.mNNq>jP7u"L̼1p5< rHP[\l~7Fإbe H"gpKK:uꊦ'Id) :g_}҇nZ~zEjx J~g l97hJ/ s(DԘ&[T1ۥ)$Po '`9Cdl4.d E*u0 G;^F_֓߻|M&%<GanOTt6 +߿WͦDᾱ ⛹cuX*KdhfGa&`΁\Mr8mK{g$T( 'I%@F8Dr'ȖwW|ykW?ț UӘ`𡉡\/6`R`,uoe^An`s}zq={l9)J0JNS )*yKh*xɁŎRLWN\˿݀?zx\SS00cC/q ,4r{e#abwGtl^ZYN'1 fyLyd#<0*~P\8;WG=[[ZT}vm0,Ab"F!MB6KAm^̌-%25ØfZxo3TG* (` ٿ7_ʲٗdS'@ĥ3ƫ._%t7e7qyo?~c `7;g~lpWX݀ H1};o>[@ӻ1Fgs87Kcއ }Q mIJ8[X*8"qF(ir}| p?4[H^3f:żwt#sYt6=Țۘ޻잙XKw )|DD~IQTZهot~z,Wga)4S>|db vqi([~ggycXN ޵ƕ+|axSp8A^dŒ[n_SlYvKMiƙdbdZŪU.nmƧ) gJ g,z8ZVq]) FvWެ`4=jz5kSR==Ĉ y h8uCX>M[wu)hїT48]LH,dpA8׫l4تHH(2|'. L972G@B@O$n"/퐽kHXLȁ۬)~)snؖ. Awq 6Ǿ{ww;Bk lv}rSE:?XݔK.(L ۍnڏ-% p}NnKu(vԫ$='%D00Bgs Ux S~uD:ACT]>阹uvJQAwс,Dz|u?ޒ)9X炙7dkwP_rx< 4f"Pv_= S* 3Rf!A`gص}@ⳂoU;Wve,n\,OB/# `GWA[o𤛫]?NP:x> {8{}16*eq?qvFjtG,m8Zq&T-}q"7*Jaֹut8tϪ ;Y]Zxrq%Sq6vKm];}\}=j ۗ?El!)`)XUĒLm+GMcS)#eqXڎ47-Hw y$\]uiMFl!Ll=7T˘y?@8BAMjҒrGbe';{Ht2@)qSrbE]@}p $9jZ[>T=J!d b[ıF lbGZ=2޾ttc!&?5$roy:Tk3(\-61LUsknWB«جȵj%r1I9m2їV~:*(m:[6,tsI0׿ڛYVP?٬6JSʶ->,ɮD6D&NPYzy[]қg''1U ާ(EW3TiKw- έ)UK +1\-ˇ+uv|{pW7oy;6ۇv}٦_R?,Pj|\1_|e߷%xCww[txʏAZ3}9.O~~spV|[h#OMgN)}c7_n\w؁+ 0p=|_K5֞u,.տ?.{.VvГhk"m6bBd[m㪣VZ2BhpHNooT꡾}= M6̽$-}|s'px󏇚O?$0v|?ȏO{۽Vᕛ?ɡs9&~^DGjhJ&jl=j4_ ?p&n(Z瓽(˿Sh ~ LOԮDq1ĜuBă8ZE3s%M\ͽ.aԝcGFH~o+NO8g[qi;9` y9u!^q.y?$fwV/WeUӡěrt #|inG m2^xkK5[t/(>{c^ D4/Yٱ7_^ދ|^p74Zlh4 Flh,74+zwCw/7hdn_dcU LQJicu"ɤ&4=aP&$">4pBtN㼣zxåQO } !<ix+mϓ/ao l'Џ%M6ǹtvMt[ $ 2nqYR.f Tea}:~?=)MK094Rc]OJW(utuBp_e]5t3Uy:v?LWraTC,|Pښ%}z~1Yvr0le`0uځs޷68κ` 4#2Y^> eMl׊&wJ&xM)1E>&FsB :GO ,nr_Aj`X38B]zfX쓭IO Q]/RZ0(7uE! zJa873T霂uFߞ"l7)+G=WHW##+Vb؊5H Y:Axc TIVS2O_U԰ZCbh[VmAz.oYH C8 M ([Lӽ$,m$GeT 6Z[M|kЬ ])*'4Tr,z_dJr:;P *T@Nh`kW40P6`_ O ilMхZmkU :m:Vb#;Ip^Y֚ oOeq F%%nؓ 2u)G^JhYnLE:PHZN~Wo)ךWɬwPT{XbL*\8_[) 1Rpi^ZW9`ۊ5j1zXlK mUhBV[UL;`ɭBx%c^n,I0ɩ 1ة|9Q> -?8LsjTTYQSgB@Mt%ÙCq:Xo ΢44NAUE ߀[g6Bo_P8ꖭ3iz.ki$&OY+ 4XhB̶ٞX֜FFskEU!TtFJAW|L1Y3 .6ĬB+[8F;<+mt2i!VQ%GamͧޑgAKLήI7u'P S`ZxK; ^Gn +J= 9BuEe7>9&į ݈KT䗞e0ZA`62˶NKbBZDGWQʡ@t ;]> D"%vA~^5B|m+LB4lk9Xb>eS>7~%kEe1+k?QgfEx ao- z.7EYCUN#V%9;yR&=veL\l ņ,7ݔyjbyzcR { V`Dr37X}Um$bZA%B[Рw)yZ ^HY,5"l,)L*`k+oMҸXVj/73 R0o"o"/_{3s2Sˊ0ig}ik(`O2Wq 1rJVJ5uz>m n7z_~ovvӇ 6vF}2ﶷOoć/7wq?lw߆nipZ!4}O&p"wwӧr?J|nWUth:H/ M.?=h&Z)P!94ZV+9Ң!p$O=с_vkݜ^ktJjKUM?>Y;eU $ޭѩyտ\ͪ|&Ylv%ZuᅪlGӪ? OOKϟz\pby].]ֵ=7JFamYnqs<ǖkyZDA# |5cO&Pd4dT{r#R&c 9@#X.Rd؋:}s8sΕ-B7ֽ&(\@;7_a;R*'z)ϯfzQ\t13O^N( 2ͪγ5q6=Km*U;kY.n` K6{˹Ͽ )̀Gm oϪ?#[u~6 i h-ào4'؉6Uʅc m12 +7|gŤoӣ', -J1ןY>I,[Z}.JYBoQvsɵJVEdL6䤤Y+Hqzvդ:Q0V. U z1Fk`(?0C )k0rVU Y5s}&v: ß_|Lޫb$}Uуo7l%qs 󘀝g*TIoƅKU6;h^LL1g]¾U C~Phڸ2`z+HAG4e+' (r0| zq8Ƿ3JdlJ*k0EBE 9[4֦e}xbC^iF}FSޑ[=Gix} %CY.pm{\>¶1V)%^|HUtnsME<٥{{oWXF2;vmJ@!Z$.Qѕ@{4f^H0 Ox%QudʰZc}Bg(aѦصTsrr$9L]F-gQQ4'6$`D-ḙ$MI4Zq+}}*Y[嶨Rzni1Q=_c޶@>P f-={CF4|ئDA5֤{ۍګ)겥=s _V( EYP7coZ^2᝿fh* VFSedW`eLUDM.dEzdGI?}SFg]Haˬp|÷@r7+3qWm&O펝 CM"Qvn:ݑ% (O{RC_{k(xpB% @/ W)K} zeо6noeטJfH܍8ڲgefD(aVF(JV׭rq"5w)#0l|vQl2UT5{!6 ˉ% +,V+[l~`=7t3ЦxU)A؊ҫ:ik@9F%PfAߠ/ tD&:~&_tswhh  >x\~%'RZռo5ٜvިk{koGUeܙ-QI g <SQ(3    RJy +He-]x/T%2eh:̄GooOŸ%ULb{U 1BXOM}(gA띫H#x)_#_Iw)4'B;;Ox{Ve5Wb_vag6:hҒ<j/QZQL֟EXPJZë8L%Ƭwavr}%~Y@&*- 5qHFK6EuTH[l&";@mPY4Rل9t9%Ǹ,R\цdq9l Pd au0iX%EIXy/ @`q-T`tp `.]ɫzXr'E]U[+I&:=U+lQڊa4< k@(wEK8WBw߯($3< ?n$HG9˲/^dHj>jmAoZ!V٪ ..Ah(e8JJ%Pk"&W7TIɯq?~9丧X #.~CV$f Qlǹ.X)ZlBY.T2l^tq%xvtC}֙5[vC0lwYxN--@DN᪞ąh9m+un#&y_t'(Rي`'j?):Vo3m.\G{߂J(ځ-v"\!x\؏=ǣx?A O)b\-疡̬z@Ii#AsvV; 9xC }ۉQ|q[uQr78V_<@$-}fr; WjsCo1M-FSpN9`IjsJi^_|\vpVP͵OZm=z de[ؼ;+e{{|6}_#vù5*K]O?6C[Kfb+^ztHcV{@Ov /1THR('f:Z?Vv=ܬLm\ _4ch"NՑ5; R>aLwDPCV"Opt ڥB.;^S uU P_ L~l$NDH!-1L`WU /gw*%,|GuGrGٵO,L g^G ݻOxW+lDл5ۓG}>ɟ!ؗR6,\fJ)deGP%Vw`Lȹ`߰vX(zH^_ӣHvV}Y_/(V| 0mƇ>R2Fć]Oh]uW釟u4Y3Zܚ/i@ ;Mjl菬n"T۷ͷ}ۼ8M:.mMRBQ.cevJDۣ$5mIF/4lJzv=P&8~=E5؊bۆT#-1koKy{R=` YA_s} sݥ[=#B>:Dk]g yҴ3-߾v,!Nv{}Rt."9+N<:Ц6wxSjɢ o42eF,*D^ey>1]J9Vw٠x1n«-C%@ 5 V$2{XW_f`xij?6Bl{D6K0+z;Fd =y )%C ;։B-Y`~cvd0,gݢ33B{OE0:1X'BQZQ*A_p14*\{u*=W-B 5oӑ ZH$/i+2V(17ʻm wx}ǚ6=dٞUB.[m.Rl$)l!E&؜JN:* >\i}y;vѰr,݉Z&^e(>ԴE PjyEX̎?rYsNua̰k׭$J~<ɞ`K}7{^ z,fQ8.'ׄ4a4=yWDJ-P蓩7suڼ= ح-FD_ǝoyDP3W1`; JwAr8ɋr,\np.2=M­X)M_fd={+{+aziX@U:!^Qmw2<ﲝZՈ z;:a 'X>f8B3ȕ՞͹{HI[0b^~s9a8D,ňJe6TYe R}mJVrtCP>JIJ8v0|U6BۛꥩvBFUy/u``酇-ߑ^G(BV^ܤݐ`j1 LQ"avUbƍ}9Q3C ЪF-Le>I#QVtGC9w,tr]Zpt5]{Ԕu69[!zwBM@"|NJ܈'T{TK$މcdה39s1F{~AIYehĮ<`mQKj_K\дӲ@וTp)0\LС|fp?RxbySo\̖_û.94(9- \:,ֶZs Y,B;_?VD9 -UqцOCBe GV%&F2R;HKr1XsIҞ̉YmM2Tjvǩ)t6egCxU fׇܘU!UsgD ,j9&D!;L4\ЮCXOƜkVJ^cnP@!48@xݽU ٹ{7y| N杵0>NB|: }=I9FZ$Mj}2n;o*#o{7_y} "|*^a'Bt=?z+LC?:{ƀOxذW6+h?o2 았.aasaN(uȃP.U=R'z%e纺_M0پ)c&eۚ.Oj9iĎI,W\R&r|CJ]-B'ջ-+_ }Ak)ݵ;RW,Uf,wyv6̈́oSGsB AFHҜRW=#w_%g:?N6QPΒR|m`[!7UZ.u6ϜRKS]I㹦^;Wrj!2]-n2`HERGk -W^.(u1K޲]&,fwlJZ5Vaד]PGOn6M~51) X]FtM)u + FQ^n%=9CzBŇAx݆'=BAB jQv Nr!8eeMpL6<B\%u'U]L=+|$z9Ǫ-TW)]cSA鶚m_=UM])*|熣vMkQS @o [k5n%i/':PE z]xJYc j?%%Pg:29Q9@u]Gc&Ѱg (nw^{BK4 bѪ9.<Աt+*n88,VVn/㣁O)u.ڎEq|gף=R7LG kpbEb "_(G>R7jm"Z-޼&јJ{̩{G+i yd_r yERhFn8kfĞae{hɭb7/UGJ9;f0)ufbJ)F3i6!BsgJ׷ˊ)ES39Y82.IC Nb[  IfS4tsCS2g8њB~h}0J7"ݝ:Reѭ,=iGY' 唺\CIdĄfSdԥ\T;=.U&ٔ:"?NkH*=7&p# :Œ{0#)ٔ:KmSS ;2X?r\N# #.g[e_LKֺȤH[{ PVrvIEKJQQlP+?RnjG)eNcs)uN`l}kY- !Z 𡈎sUla,Ddث|RRlcGv8-Mi>zD$| 'c(&݁w,6 tN7W[_SkJkJOŀmɩ{Q_'Tm*b>Aj ٤rd:l_86SG}269sjmtĩYIǢ/5w%;Pl%ZZwtMC^7}~Ef?,_󪋛n_6Ow)>t_~mQE_Zo-uZ H}pc$gK+'ȣ-a-t iK8N\퀿LrK'lbu_ۏ鏏)- /MK٪v kc+ʏrkVf!۽Du¦ĥcmR*H⏿:wj?NDlY?K-ʼnO5U΍7]^ښǚ6kZ&[ɖil[ Xߴ]o%/ȖYs^uoNXwڨ/-wiU6r"8pQi#RV+dnESngSnմ4qL?K/| cNcM-9XbRc2^Y+xe,eoe|jp,K}NsibJZBeYӊwa\7nw/J6v/og4a=@a/[ ,]3Wv M{~5oݛngZi {}۾m 蟋`ϗ7ār"4͟جl#:5r :~mK{osg{wM9\b$onȇٻR|3;lwPO͗Nmvex+1讖v]mV6?߽f@jղ̑٢btVV\',Wi4-6]|nXޭL=kxCCvq(]N딗1Rqwg'}]:)#MNe4'Tyښe/.}J.Ъb"Yrs̗@rƪS, k|pmuk=G-(kWP1H!lU HSMQaz3\W+䭶8kgm*B=rAi[K^l{g9{.+˶Sd8Bfo/ Eђ@svZfԏw:bqHpy\ؽ,^Bf2ͶG}ˉ\Ylo.uu2'=S*Js,1/84W/;"EYpA9Өv.eDz<(A u{Ie]ZCB `[xWdf>{4LɊ\J pLȕuy{I8,VT2% Q(~]7jp.G5Ґc(9VŬo+ٚ/r딨bUWC3\#\7n?`IQKRh^hF )!IESȶ<_jG"re eLu=GE]gEB`5H]ZTaAʺ\I a@dlRGժp2/!nUтrƒ*pDU 4=1rkL>+Kń-;N7p"LƓ=2޻b LWCkGҊeLZuj y2x-˾U-jYc8&ØCܶ*۞ļf٤dD,~ljKRlBa1!_sIx?,9 &SŤ=a9x]%&Ř l6~"MF9˺AB))P*9-z`h c$•Y5.C)E/:|H۵2 ʆ!a?_$Xg*Jjn]sQ }4ف/2s]7 Q,Aiv*d֖Gi=< ,RFTQ[_Z6H[D"i86B25&IN;B~DEe4IңVFHs4!ynϨeM(|V;er!h-֌1jl jу@7y49ViYcเVjƦ*ԏP!jg4ZKoeXPUC}ڎ`-@f9m/6 ljo%"#&V#2)qZ!UGjl$eㄷQ$,x$HZ\6]s-*V i{&zqE=D5_c"0yRz\R\e] rN0)"E+ >BiUŠYs 0b6ћJ-8EOmXm+"dA(DZdv2Uʠ'Q: MZɨp4_ u<*U[ Kh4eι1}IksR/BJ%ʆWJbA4C00mAi|:"I0vXܬUn!L}tT)N<-A>4 'ik1뒍iuhJ-׫btǀZBu'_rt1C9{C_ee:&n*M)8$V }x5Agah!*Rȓ!8BC%'*:fa 숖 ţi.|{ N M0PP$H5`J? 3h-/\Rm< &*lGj}7pl\SSΗ&پP^s1ky< CU  Uvz!l󔁸|I_v!U)ER ]Bi"MQQxL>Ӫ{w 2Jy̏}q0RS~:p0i-6qk$^b\XD%E؆YZãrQZsri`x+3bQE 씐UG[]ʦ18/i >`MhqW?!7w.+ܢsGzA?meDyuEb}\'& AqQdBQgմQ$  fL /di$@0,G)qƘN;op:DDQɂ$14OLL\;1r[ b' PJ"%@@>r; #c܏25#[ܔq# 9 S"31rp'xPUKAR_MNJEV`iuE3ܪO΂?5--r˾{4F"^1CQWLEePM44xߴ-ӷ/ 픍l1CJ,ý:>tEwoL`\|f?d6P|ho跟6#-?ɸ;-9Z~-q#-?J9#{gmCIA"n_{^؀mTW$|~b+^X~!&(?Kou~6@~aJ#$Yҿx=VkYV ~ƣ&qqPMo8!]XQD}m.bv164_&51a۪^S&9YcgQ.{VdQw%' W[f,Vn%EbRlzA(Tk9iU<`3dRXW>,%۫f }2yuʈ//߿P3$V?i.UF !|'Z\@YZEhIܰ:_/c\<\#0ܐ?NLzƉ)E'&Fp!Jb^I*Fmxݞ (an!Cŋ/V(Bk ula@o }48o-3b9bjœ2Tlf?L>͈UW{;41|YhL:|}v*Z棋|F^pDyiuI*-w[UflƯi, %qV4Mk"-rI[߭} < 8(XdY_8ebyb llGTTf5eyUnm( @!\-ݫN^lgbwyK>2y4s)znJ ҾZ@LsE [ia0[-ie缿}3h `vV> \s*hV kpvhQ ٖ_i/f&ᩡȁ} *<~`#Bz`WI0jhE U o' Q'a_|180VV̱FN#=8֐&qT[e%RH--BUJ VUGy23N{N4g`=Cg$tLⓆBz-ͽ\O^%/X Zf Fq{Rj.iCk],l=[Y[# 3k?8]L8 9w+r a|Ela=#^r}5w=iI+.n./j,eT;iZ@:-odM=1tY8 oCho<1x#iId6ŶDqb0bU#tim S~w|Ya&žhiy}u7x h朔[Emc=@>,gۡˠK:i qN͟GZq%ň[8Q"Ygv`ݣ!bq!9)W}QJ]7K&V/Gk( T*Jcu+"\PɈz_ocsfQZs u}ͷd5 X%.~+Pܣ$9H _ɐ Y*52hu&t-31cj` r Q(H(͢ڽAD6wrtat.ez`<*<83*oLL:談_s?,7 ԚGvsɐay xwsCw6< 󓏔&^Q"#H)Dڏ@rd*sefYd#tuScg fdDQ6a^$$ ӍSd9Ą?=#J/m;W{j-s,([}"/du[Ҫ,%bYK5Y%"ny[ vzF#ժݢ5Unȟ?j{E1:̌ϋrQ`ձ3~7'&QO[rІs"Ws?z;,yIȝwzm3h!^ClQw]c)e\F-5lSvjG sA>\hjTMj)ǘWVRCRbg$:C\edʯT->(DKpSq_Tl^hgb ڈNj={JÞi.zͬˌ=P8aLQX'2qj-P'1 ~l.m~B(AF NIQI >jiGծlEy=`d629 Ҕ9i40v^^9g3eIC5s6)nnDF2}®>I_f"EK,:B=6>*g=5W!DjɉZ޳Gp 6JhFyf:&GmoqCrDh+ܪuM}b;(`Dܠwn[ 2N#ŷ#)!lUȢ 9Yo61nIIH'lr1Q; ;vGT^kx5Rݾ6a'{P_ Tﻒe^RBDRϚtxKGrxnƇߑXyYd̀NB;zUvZT_憥 1 މ?M:8,* q҂hVaDA9m !y͊HEؖ'(A7w$&M,C!ΰ3q6Fs6cQJK cMgij#iÔG -y8V·8H2x '=yN8Sk&;aWK#;;0%Nv7QAcZ{;+qc ƷO-bv1x %ZlG㸴 bz-oTٙpsTվ)A<(SAYCœJ^?Kթ_mk%ۂJޓDag<$`s' y{ WN%±y@#V3&InW[-"w͛ "{ Gȅ+yĔVY`n^N]KoI -[6#kH8&y2BM vKg7;: zv6!Th$V;*;ʸOX֜1ne=(΀1B3Bjv` sU;4Uj撥LApҽ kӑ lCbNѫH~b^D8C5R"`U<(K%[t]OOD:t2/W#,R>ehh >chiyғxl=dUޗt B3ŝ TNI4C,~d݌F`mAܠwtK x+E *Oj^Ǝ&=LÿHw$FE`d9_,^[1WwPhdKINWHf~(ӯ.Dhf:-E9Z's_,X.9f [ښ!m =sdh&z_Ш9gm&3>'45?Lxݫef5Eų_=g;;|Np/scKQRRH~{ JVNc='r|Z-#MX%5~3^ahլ; %Va'' o;dyf =}n(;1׳w<\Tl͓dB[J-sG*Wt~ w6rWܥCB7.,}HeY3%]͔}+nn4yv&44 vʋWi̜տͿM̧QU[iXvqcK !7>#j/'Rg3n52\:s}x8DIzEvzBO(Ug;;RAZQ :5ЧXUȋu>HgCs"vu9:BշF$+ه4뽪f4]@d{&|>nj(}IA$[w(GúĞ%҇1@ٙ9%{2JhUNٝRoʢ:`At ٽb_8!E[d-AAqNuPIw w|*>lkqx`L-f/X^|6YNJ Kީ=|0S_iX]?S*\pjRT ] +z0C$H%T9R2ĉ.OeŽU81U_U9z=;apkO(oHVCU7J"'B \ؔ=YND90c;LS_ymymajW Sݷ ?WjDrj^v Xoq!n˧F 䖐Uh|jS B:/Gyӯ]=Yf~Xwo7>K,WLJ7><>z+vƛ~x;B>_FpaPomd d.F\0TB_Fж_/ݠFk:оj4mp׶yy)'yN(pk.޻֧dI%N)kM6FlRLhV=؄dj>8_II&[MޱqXrXzE9V=7.;%MmDr|n/[T% *q*YfDMCP_ǻX٩9 )7:"7iõ7BHOj&7)!X yFҔ93jhV⅕9p7cbVTVg۾|IͦP'W>?}^Pz([f :aSSVםrr{NunO #U(Ĺǫ= hdl1nq 憑B$޶SZTƁ5,JdcS \E*,O+H06ɲR0b 5NѮVӹb#$K`}r=E-S!#.ŒQ袊2gTpJ,#nv\mPOlQyJU>KC.jJ6e/[, hmCҬIiZ8J>} %(>E4Z{16nt]jUZH{ɷ{쭯\zWu:wvl<(zȰ:t#ϰ@$!##4z bj3%SXI,f-} L82R;mD d*횅qyOfmIrIoDvpBٻ=&Nb{TнR.?Bd:УDӣ>cp'1~GtJ5Ʈ3gXDO^->x]ޭMt˷|5Xfjm|.dhX): wH*YTzdJB7`g}Yzm L%nU~qPn Gܖ;ڔ*긟f-Qe]VGYEATS%t.&P*jm57Ѧy[*k !ns{jo1Uzo|3ܳZ=1}/Wf2ĩȪLf3Ѧ-.b꒨Zp&G(4cE"GV#KjխnOUl8u#Jwq}_,`V/?7WWuJd: \Nx o j lM.Rs{MMao.֚DTuɩkOi&>=6&Ue9֯h.ݛK w9a4!^(f)6zF -Oٟy{B[jwa:,D wTZ U#%GQj@l [rx"CR1z/~iapm+}H h W'=mO SKV­]<hV6[_*Cg53_jx.:%Te+07ٳN<>e.VjrC3'tPIəzVhCQw^xVcz `o&qTU# sZZƣ}HSЅN{R_=Ϗo@%>FlJ븉Dƕv []0gLPVc:௰Yj:ҩ,*b5z8$^,346eq2X.YKMLC Ub:yZ^2@_>;g ŭD=]3,70So?< U E #p۾k;]blSf'ig}.WqG7ϳٷ-L&G}8Xcת? M+'qۺtaFY[+E!wᖦFLFe*;-ås۱xVDn&Is>T)tŝ-trf k{]Vho0 KX=089!gr;;;"QcO;%wG 9]r8T ^TUτ>KS/ 7_}:ÿ<~LJO覟zcZ'OO]Ѿ<\ѾqoMeb6L2I# k}e}OҾkJ/3?4s}__ckJ+pY 5ԨJD~Ml fV~k3n^9q.2P`_sPGuBZ+n1xsjVj$<(?VBn{}vuIrh߸R=]|&,v]qb>G_}a׼ݦw;_J#N8[ Yq?@m32Y햿xœRW֡^uSha&bbSŻ/:(k梖[-W_٤]hd&Wm(^z))zo;6!A4@8gӟJu;5WovƙF9TQՎ9~7祷(s5E/^ Ո7hTaTڦGa;:}2SnMNd61vkA&Q[`7_vA]߹p/9L(3v-%;,i=-}d&| w T*Vאָ^d(>X N=I'=honTޅ3<ᘖbXDNj8f> Ꙗ/9vĸ>ǺUũi!RFyҴCŨCj+0[樝 ^w1bM3&݄a혙ؐm$ RTB!3l ~R[jJ5Vu7=% f_;Vdsmi 0kc7U1:pJ/J^~a֛A~ psO.KeuTdѫCnVJF#![¦f u b Shme}Xp2e;SqH-1K˜SwV[v%\ ~$"Vnޤ"%I!]nDmQ)RfXt֣~XLE=]aPmw^5zTtls dNg7&*QD[ q՛4ہVB4c".:cIb-;w 0rep*ov< Y0zyh5Ant'MF%&CXm| qzJ%*L?0ӀE8~yHkEM<Zݓ@ژq:*E pOnRlWma{8$R9HևqnLoRqѪs<UN7Ğ0:}rTL8C|ׄ&Ҽ~eHaً^ ez亍V4R y32 A~Ou!~NZgl#@~lWCF[ Xf_GxrیaɅ!:/] UB<7%ev=T 51_;șll5PsLemP >tҰgsHqDY5vMqf e]q:fY[i4[Qs\I5{g,JsdKڂhݢa</yԲQI;J5foCu}_JΖ- 98K[Sl[J׳]TiAx0jntћ #$V?`pش& oŔjK J$U cP y|7n3l 6/g]291[/FWJ(iobZPVZ,03rxtс'p>g)u4Qt_'dݰ8H.5wdˆT' :qBC(YMI=%!r~oǽMOb(\H,u 2".N- zfH9UyAԬJ -n^h^|y"[J5#9AL5?b/6AsfC9g8NY wgYJ~pqfXFP(4޷`mc@IjMޢMNNZب f8q7mV Đ״3l!bjFWg!Ks!YZCFS *>obo䝟^.KN1WS,>"A6"- 0tzXػE3i/^t5ŬTUi_4wVvg)谷|˅7kUK 1=.tecf\'mآ`Ew6m3w۪+#۟e,Ժz4['-:cQzo٢9η.` {$͓e8ӈ^dgʆӉP2[rKG(-Xy\)Թe[F\AiJ# CW٠l/վRtʂʂ{o|y,?mllہ=!탉DhophW6_Vb F<DŽѢ y#qoU)_o-wiSϮwz<{sx{}p?Uz}xEo~yvV>UI/V1BW:|Zxu׋/DkQ}o_^WD]N nm@lq?Y|_h ǩ&͞1/F:C0Vc'nQ`LMO&:C2N!,-;#^lfJRg/?NvUF#8H-/ -lfmnlUg1q-e2@D9+F\i3R i. +*&[̻6vzS1B=o#GY#d1\ve!ZGҫY+|Lt`矂n)A)wqINA՜q =Wa JtoGeҙ+@2pyuψ9jS6C\ l*!dlՈ|hUiV G-faלtU6W:SNr*ԝVZ8Ͳ9h0AϟD(ʞ1?2S{p6yjL#? >gޑ11Wr3שɖY\V]{P%,&Y9p|Ù;.X8D}F}!(|֒ hq{=.)OGC[?Rtrj&"V!thdsUPneg@־p*Xf+M%Tyu/;9+9V"mL0c nq_OafwwG@kĤb$ʩYzqy' 4yY&U {>d߀>j[`F(2}%Q_Fz&0f*=ML6q.tݣ=7%-RJkhbCe7qXQywN>8Oe-^!ϊ^IF/ "FѶqV--ՆA)f_ 574~TF ۤ8]uBpuc;3P)?i(Zz A+Њ+%Ͷݟ @R?ge1iAyw,@xLL[E(zN}f 5'J_.b`vӧ✄)!sl^0hrZK]YNx“5snMnVUKCmswݻ{t}%*c88eSͶ?-Ja$lhUvY[m,܏Oݍ*Xrt3h4I脥W Y 3Ltn-H9* #gwORrsU~~}.X>6_IIxXDv!wryO ;sYN:-S=ٔSܿrn6\q(Zl>|>5nE}%E0*Vl# كb ys%Q `zc&"svbQz{Ѻcr(ۤwNc^אVI-M3NdT\w:am9wճ:.}+Ր yWO]YQBYETjljR2lR-;h-ğ'CX9̦ݿ4 XJ6;RP  h,;+RIYt-V3`Tt24#ro*sBRK{R΍,8v_Tt< bu)>Bmhychoa $)8)8_0W6,hHC\\E(͑'o-mE:x>~+GOc !ZAKej;i|݅h”#:2w*m0pnljX4,<;CMhTrP€ӷy *h6]ԬYX)*XZ0 Vrt-a1JҜ3 磜Epk|05VXff3H41GAݱ MM!UWfo[l!4YtI("e VY2CW'M.ʫlԂWT&pؐI1Z Ѩ(Wnm-8UDJA;/Y+3+3}1Wvq#W7M+,/a.r> nE>ǥSw~~<~oKo<;^?s[Ԯv>x5O{3M0zrWZi}o }5g!Ȯ|S Tj#)\ߏ/wJ/o1q9kx~-> ,WIp[w޾97?^^w/?~?~sGwǛǛ>߿Ζ-g_ ugi}zD>)&jt'G{̟ ht%_|"|= G~mx 8^'a@Ǟ}$WKQr_b՜kj(plST0@h28ӱ 61CJFc1[ௐGXKμj~QH~9R^^jʍ?-K,qDEܪ">>wRd߽s>2^@Q%̖_v޵5q|:T]/uR";rTV΋ W-%$WO"!0U6 hh|ЂpgCt77-)kbH].ER X fLY= qQaCma>pOwV Ѥ!(SQjvRQ$ jc [NkdP4"M7]JZԾ_IDs@tP8t6$3n)%o@5<-^c҃5yLqST:<zGy2Xi饌 DG$lʇ !G/}(v=,6Z`5V'EN w֐W&bi Nʴsb52n- P\yIMyPüX,3` [X*f,\`Fd̜x%lhY '<zn'O/i10CUG2Βl"3;#˕3*au'HA@Jo*fF[tDHةL2&CVHtXL{$#kh`| c &wIP"56`]x{gyKh*j0F۶31dd9`{ k&y#ڇzTC}@LaFXݸ@\ r{Y>&e1K8" Ͱ'߂0`K>VqXF6ęꔔFH/6'Dub|xՁr%yrZRr{nhe%+F]$foX0PHRVTmY,ӆYBwSj 6;6쮕(@'u{G孄oQ)`b]BY8Lॕ^;EQ& (`1>yZy<_r,4JH#_"e-Ѷ#L J3t$L`KQ- ]μZ/n5iMۉh?pybN8|sg%"d5Fⅴh3ߑgQͲ4 nWDL Xt#L6ܬ [+k{JQd[agW#<0d/~u ':ec4^yTRLUNam/VG؅CZoՆ OSyoxV Jh@Ob/n Fu ]/=D8FFF-%iqS'=̩W9VXi"G!9?[BV vAs#$̉M&~,}#p˝BX)iZOy !{6 G"58z `7sըha7R"7p9Z PTIH O`Qғ(ꃗ!KX)^Tq] l=%9箊BI)0,*ؘA=iW̐"l*;$bD\ʬ~zN+Ý)+74V=S4=4IM_7,jH"FStA04fjw C:"kbfLenM@Q>Jzrn+;w!ڂ2<)e]o(OR}L[gA[ < ƨA{gRF`"ZX'dBl{-B(S`op!w;Ei2.laJ[:0@J\.3w&d"~( m˙9. ӭR 4ۏ&!T$']J Ƽa,h"mL)x;;&)^LBg4ଲ/ LWnu; ֭Q:D՚x]bL(XЙ";hxp/>3`,@+8'G`"kUp<`ec憗&k?ھλvWdTڈe`ƅr7}U%UنV_;8V:L (BУ1^[Yug9qV=>gRPpv|Q.h|OX2(9%x(!0NZ)D*>h͓ Pׄ"(PxS)o陛)LdK~Ha熠'Ea\{Ip˦lys_['ϓ8Kӷ݆* _Vzh4D=Z( U;jJ-#bK=%ӂrs Db#㭰6Fj+p9)j.z()n0[կ7nB!vtBYjz3BZaaXesOYZoׯCu:9꫈*Cxjdž~~+^4\™b {XB8(]vYšǎhX;'_=}U&qj3/_\KGMQk vI0mp#x1ka ˑK -oCvwKr70.8L)9gZ`Я5L hI2d寣Ƣ)VF{LVs/a")9k/GtvXL8Z1il: [crr1_/G,Aiw6&S "FGܡwָŇ~|ld}{?_)5Fm磧^1dmPwB|WxmYLFF7i4r 4#׳@;Klg͒yI _<߽[͸^\7?M黮}0X|㛹jZHh$i|én춻{~j3C<^w0n@ ޿"͗\lg qFQM-@Paff_MҶzWn蜧e|3Y_N7o'f/Y7x/gMb18qp;3޽_[-֓y3 %=9<+<2, fKtҎk"e$Y*DΊ}2OfɌ>'37iFs?ݳ)5jwϖ)RݜYtmHϜcHcΛQ~`~77-O|5/-?~(8VtBvJWڦV}}V6`M^m*s(U\)]UkZ{yq ^­:5rEMp}lKVs[esI5z^>{^֭kzSkkA寞~UԵM^m+B[\ הWSi@~B~+\׻Z_%5+ kSsPϯyHEcSsR~Xưnߞ i$ 4.}NJ_?H&]܂*yF R=]n<(+K 8V2nJ oԧ8R4jԍc8̫6nLT~M+1<+6k@߹%ƶymntLǃy>=lxL[ǴH6۷*o#DKJ /j\|tǭߌ)軲[PeSxsjMؘ2hz[jBH1IJ滕*Fu|ӄ85^-&uT;ZS;uMu=iYyl5.k|֊Ezfh2 6m)\տR_YN6|97FGhuθ4.KW'&-/`y_`Us^iô2@5 0wQ;|6%-nZ5M'`EN$PuI+-圉E( ȵ໌fQ\o&,}Gw!-#[7r~(}ݦ(__]srkz H95QYWdݒYo_gu̲=f5q6Jdibg`&. /TM^w4nO.^f|U NS1ڧq{*L?8u vZ[-`6:x=[Ev(ɇ8%S]㗧 Y3ޕ:~=ğKvSqyr8K:g*o[Gz'4BN^"eښƑ{~k_vddBlթMON8+v2A暺D,ʒ6jkg2J7I%ŃRYeԽc&[dPpDyLUTi 0(D(ݘ4ed@ML9"(W89K&{7@k'ٞpUrXOD=*u)К2RI XBi,DSLi0TS/Z-:0\`!@"*. nJ1)@-<:ڲnfhb{:jgKmMakQ`{I gq4$Q uXEȅi./YA(# Ԓx kh> >MYML5)UǬ( g9MnU~pm;*qpdP 35:<*'6 p9|6sD-+F.] wp*󬍵o )@ k{g0J$V$&'d!X!oߎ0ԆaDq9E [f\:lX 7daKoz`M³ڶafy\useuD- }brOZ\YJꕜ®,zmZ[ԥ়rɌhԇcF+ YT}v4?KdgBr F2Wh.krU^9^VKOɬg1,zYHh, SFNl-wzɮ˲6lZH19jUh(m'31kWhʨa2 x 9zּd)^} B H+$<|=Fy^G}=SfOܯ rݯ/;:*{KKmu]4g>Q;G[Ė;<+zsTw']Υ;[u\.SjmyI;.uSM]ԜW߼'Am'uٳ`o9S9S9}fF+nlQH\* 4$i0b?F!<נyD,l:-wW`wݶ;,^ts51$0}pK]]U!%!a!$ 2P`"/J]{r}=2 2e?O&}>G^ofM^NgCV F/bĹwc!;[O>qʵpA#ځ |cUq'nmW@ H]>[#J"o&kn7MJf6sUf; 1BDa4HQ3 (EŠ:޽-KVQ"ߍ߃㟅]F裆 6x П|_FO (]t?*Ud&/$ARR'|#;#ܐL0ɂ$F~o`?R9"ҁSûf!3FEI۰Yz.BIU*ycTYL_47=7=XƝ@ S!=J=N8>bSvV%6kQ[@ƠQT&Togڳzvwo{W>Eo8>w᭛tO?|ҽRwǮ:_OOtW7ߎ;>;rBGT=aB>BG!t6 0H2pICGd <pu˓s_r>`H Ewv.)BŒB(%vTqHS[ͭQg0 q܆BJ؜ !\O=oQ9^~#8mGi98']o4Vr$VvI>lGE>`e(D/ (Ei `JT@PFG!0p=X14 |>j0C[Z3;Ķ6Ķ$}bFYvxnG !R%X!%\SgcIe)虳gO9.w!#ΐDSg cUE\B_J%`4z$Wn5Rw0+Yikj V&uМQasb)uhm1.:DZGt;x]uP[[p㰷r<%J@$B4a,$XBȇ@ }lt1j9.,b 6<]$s!{s1ࡉV}QeCQ[ &ST,^兰ieTO4] AcXYu46Y"Λa)F6ՖQۻ]rmT;=\0jQq(JF(ञA 56vݦc%%;szt8q"GLmcFc&G ^ZXc`hިmG?wGm\#L<(}wKMtؚhx=N̚@z&bw?z=Xť*X\X$lջ,kc ;$16J]q:-דl. QgI'ΪHЭ>{=er[׸Xl8Bq!Ƅ |FJF!<33  gPf}u~Fey/m3On ^9K=L$2Jdd1LCcd$H$d*,U|JvܻΆA-K92i Z3Lcv.fXDæyI#sUw@_?=1W%UbX@fЖWI 5{ҿtͥdhr^5n&sYyL |bT(CeŐ;h8kS/[,Q y{T>~''oӯoO>i}tIC_>~:=NW6M9 qxcֲTȅ[7;>3WJ]/l5bDֽ4p蝬K'jeoՋ/zϿGVq;V⣬;(j.2Pu,LW8ρvc2R <4CW$kKJ~Da);JR6tv2;]~p12 )lEEqeۨ~CV kӶZَk=ӲL{o4Z|G{K +cu͙bXd"74:SŲa|i=/Tu*B26²0YkC˲ =ڕEhlr,ہ%fJac* mK\ aSu=nX_gD ְD/p^9 %y4"(|J/OXQ6s!YW^pcj> 0Bt8cn~6@V}5>_]]^x69 ,[=WȠfN2MlT~3S1Ӡ~ AM Tw-!9*kOz,~Յ;g;.mϞOwq&gJ['tK nC jEg&GJ 8%AHyq8f(1 i'Fmd[lb@%hCdK5Z7ʤn&mU-`ŷ 9R%ұx-6uE*ڷvX{gP%ՂRx)\-J,*Sp 1+GZ 1-ŝPbYD!'@'"ḤU,l,WM`o6hͪ:ٗC]qg;X)ϊrs$ҏ|S%/}3I}n'U YH.^o:@}fC}i[43 gc{MA"Ku'Oi?}WFcTd 0I=D ;|VHQ6e&sS3;u.CGų9gy5Lv 1YɉI\"Ӌi~;LiZŦeS\K3Y B[Mh\}+rcj/Em{=7 XY9Ux;_BNʷj@׸D8g^5H`!h  g6]R^zJbרX$λ[.7hzTܻ4-xZ[mj3G&:x߱efɵ o;I_ƿO9@RdG+ ޸>ytA~=7nS809*"D>crQDD4b,T'`#HW`4K ppub7atd/t H N^ŪoPttF=qZ3|zMk.)Pf*pI|A 7-~O1'OU@T2G1:3ouWA ƽP8Ū=5}_4vS^q/yS.[nzs^4޷=zao~7C(0V~o4}/qO{yzy{ۛzqogXfj8tX~Z*Ŝ 4lo矾4{7Zau%F66ynk 3iUP-Z]QFZVnӪX\ EWN'HȄ! ' ptzmed} c@ $Elw=9 *SZ= {=0S@5(rDLWx$K}3fm XB쮖iwζxGCФBC:? |$K@ͪ۫SV|*.Gڹ)OH x YM:Kh>з;BG3q[/s~xgB(H$UEQ=\/ܼa MѠ̘du1N*.mqg{:ԟgq~G#2@$7--MOi8Ʃ' 7ϐCev 5if 4yiw#u1g,N}AF\zAmҐ1#cuxTJ!c "S<=Ul!yZyҘ2b)axҍBvԈM>#֓g:3)_f ߯NSk#=jħC!c!BL"  c_EN ]fR{S^ D &4{*:} 3 Uj R6j]vO9"eL J/"|Nc0famXnP%2<\grfo1/Pxfa[zmT{X5Mˉw&abNʛ$i?"BB(RԋB!,`Qf_7 GW\[ hxb2AE8NHʒTwfRk&#$aa9J@xLVi0C+g5yo^gzZV`6Ɓ@^2Ôpג3Jrꎏ<w`5di\O$0l9y;0bH:cEDX"!ch"sL}8N":6GR861 qc3ϸsm.$꥜CJ{.|Ӻ8SՐ  Qe{2"+Ju-~ޙMcqga=MJEJQ65Ƹ9E<1 ^wt׫n6|2?JoA:^q: #tlhUjd5 Qqݑ~O\u>LXݸ5مw_k45qF@&[##[kpi(v9h*/%[6dῈwǼr8ci˺*0Mۊ@z+}׈vab[^i;Bne#`IȔX7@|\ Rq,wmZȭnY{Vyq+ӖUqmpr#ipu NS}?w{ө: ȯ.O,fJ}I#Afo҈T)EED8DZRbHF=& s6MAٮV/ Ye{x &ywgWU^Px&%erAmM2@4٢MiF6mzRG%IFT (Æeϗ8Ld:OHTZV<$1CJp_-grr>bORT<60oGtٝ RKJ1SI'80PRD(ʧ2VIQm9{zҾd%W8#nᨮKn#;ZPX9eԖz-3 ԣ7Dh}A8_yu͖XeՉN|cp4GZxZ5r"? 5e0N5<&ďby¤EkrMP`IRȪܹO0y2=M`Pp*SerMkS$ )~[Ȩv@F,`BWpeTqU Ouq-g7 TհEa nI=X:11 &m˶?FW$q I0e;[Rq,<6 &;u:.} ]َ 4)rD&Fl:7.j9*.}E2uk2<:62'.=c_P_$CGt9O۽K-'k۷.Cnd3#lډQ}@br76=y_e> Zc775@6^3A^3p#jق6KGՂ-8>n0vMd=͗'ٲcLE 5Y |ven&ٲ)`eX 'l@S{Iaf37<К;&i2Ƿf~͝?6.xK r29w͗Zn18\c߯W3E+`G V)e|D* < `_D$n!3ITd3- 3 y%!PLn%7Bkg| hԀfv`C;X! fj-Xu?9kBa|*m-uDA{^xKz:1) s > nshjU ଅ:x5 Dn*:+-`x|5rݑkDʧLWP?ӌu?> TnD ]- `n+m!1EGC@>Tat4t~H#YnV4>խJBrVIuβSutڭO!Va+5k_V/#XF#1- :6V'4A\Qɸ' MKQ,k߆sc S;u. =ϫ1n4ZiwZG%ثnpeE‰Ow̿cf~\yX00-KϮlcdK%=:s$sq;5%zT mHpPhn1 Tq+ gsnj# jܖI.YK> |ӂA^1a >@,0?f:fslb/ԽbLhy8z` ۹BHkG~Гls9d%9J #@Hh}ig_ nQ~w({F-cYzK'dZۑ~֙KW'?ˆ폪pgCf`NEޤ`fG l~3π>g@-xştJZLrj#TO@"P[72"*cX^PR:u;[Bp!׸O+|=.&/AL ʼnLzOsU?AMr-tvmlU1agny"5UHgO_)Pc8`C2GpD8X7/,cV"ag_\dϻ4?,!V;@j{`^Z$,+O_Ⱦ`zPæo$7"ώ#3I\' c )00eA0T1w, |~kTTq ?i fA6yTZdEtƊ{J0J#T b'P* u J4KedF,!Y>e"I-H n 1jb p!f1@K8HK\QY.yT#@IF7<+ףcnEkݿpwjC/ԃ:i.qzސuGuɗ /? YZ|S.=boX2 UuHp/һu-Q to]v'fM! 2TiSW#ԤZnG!N;Wpz5sRpumZ1#<"u֘]1Z#ä/)/; /.WWO %PQK! ɮ|[b{AV`|HsV,F:U6`9 |1x#4qGRd ǢO߁2 ʇd8=2#cNnRQ>GmeJȒ d]5&1EݑL 4?UNiMjHJ׭Kb rUTk{0nnjmv[tTߢ?XqQ a. +>>kJQFj1ZM02#F!XW+E̶zowpOC@(8= -?U5c0IiE'kS-hUje 䕨g߈ni8|`b-UMAfзқKv@k߫j8HBLN r>Pqw[EvNmeQ~;@Ѝ?-&K?ss/a5Tf,kю˯k? 9 lV8XH?עRۅ: z`;`7U$bv: }\f>m+/ʚ_(KijF4G?pyjXJst%݅!Y"|t+ =fr4 AwЏ?mc Y }:P҉ѷ:^ZkVI32R]-Itb/Xk+W0vݯޮubi(dKczٷ,(5iJ/4Ne[h Hk"0+Y#3mZ;QuO0Gټm ƨfSv\kYq{}jjRCvڙ\|,ZcVw,t/cݫӴt|ﮝ-}͙qdQbZO($vh$$'VE.5mFxbf2F 7 w(kxfZ}y}+su2|ix wE~M/ˌëamS((Y7G²nF,mAtta YgH- Q=x d"9n}_pF{qBM[rkqMqz\'6N8c=+~e6ò!-%:[0kT̯\V?,>W|U ެtvH{; t< "MLbQ߶ HǑg !7->gpŧY||AxھnN65._N=ݦnSfyw/|oG >& # 1Ď8 -v} # (盁[BC_C̸;:N`ۨ~\k_l@iOe1m<[Nq' WjsL{'z+ An .MdG\45-`:܇uS 1md2=uL}c^!-L|3ou.a[yK}ORgzTDaz0C xn25 HZi_S.ԡv ћ`NSxjަjz!=}AqqUk̯xmhN>T_e3o9( ԛcz1c 0  vU@PrTxDߔg(ީl=H>ܻ\#A2zV=b܈V 9A+,6:!;m'z}/RF Zx#$x+xЦ^Oe*v8:([R{tzH_`*Mٮޜ Jܑ֓.7&uI]ɤ.7u֖٬TLrL?$Ihy! ߦfb$HH` I96'sYՌެ̚Pvv3kvCJ? w; ]s@ ˰]?h (_  :GFʥ } gZ- Lb>cfw׽U93I$1Rr'J?4QMjgY=?yfWٵcf>^%9ab^3M1#H/$ ><ìQЄz6K~PGhe"a9}>pӎGtsv j|hgzߍgxxQ'+V`9H,$>t,Ivf_@۲u>A R- Hal *֛ MydA-*iyFVG"󒏢H@`W$EZ_  ^;Cԇ4`*DZ#g{1JuS/i^7^:Ow(zؕY+.R8%Y FRZ@/<#Ī*xN4KQ1m"Y^rAiDς_i*XpnUr/D<up!8 pt "6iGb(;珉s!(WO8;UA/L|.Y;wAtգ8@swʁT~ں>s(ХGmY>u#;mAHIGOEW5KܥqýFҸiNwBv0Ul@ewm i- O*pEq;6N=W ;ωZmO188twuI:lHvwbCp A )%IR"B ) RH>hJ1ޅ?X<"T_z;QX7_DHu~GGa$Q/(r@eܴZSsPSN~D)I(x^V\79[/1I-NE°S Cб$Nl~&;!g`=ZugoVf#Q¦7\sǘE1?jmHiJi.)%i@ړ/\p#cF\u(c=q3jםڂuZC7j/:1 Ǐ-c~̎0`(q\֠u,&?vx;j-cNڶѻwbm=쌟S jw妞iV Y *˙:;Ke>S&3Qȷ3ɫ.0-#[ˋ6~qq`ڡFр9mL0W cZv08 k4ޫ+o>oOm@ Cq V\n:M]?EȥHɯ7w'?u*GԷp酚/?lԤQNLb02%NZaN@vb)56qn`icZV?ف|9 >zǫfcO&i<6]s]֚| ;p@4逈43e(JdrJeK2vb>K %0=NĴaSm^ [X.-\CEv-mV<-eQaeA20 PзOYG6|ldxUT* Ý҃P #;L)dH@C:Y;$?iw9O\DuN ycNzS2kKlXnL  `߱W#&ӆ}jgpQW:r!سmGYdbp +o Iz- 8D?Fn{m@p9-m`HB[N'. ]s.rdi&>hpK[v|閦߲s)`{}eGo#f&o5-fg1|iv > ?%d{v%~ـu=394a9'uL3_9hWk~={/-X(ڧn9mNۆӶ]tyýCh$Dcpj_؞{֐]3d@wkV1Z~LJmnw%.?(K/0u:Iv .Ц4s+B\FZq-FnzI<$ (|#mf>uiG$ HxPWP\?ؑrl>4Lg\<3J1]{>%/rRr\&%Ou\^$eaE!؊\£^q/Ki{\pھmhaa87ö|mpNev[{ll92N{;޾lڽvoi`-i vڂ=Y LװFQbxa`خMM7v}#I`QH(i o{W_MMXKi*Oda#uTܧu50ngn0a}ixWbp I*?t 'HobH$G$>=!].)j>>QBL2 f*QY.y8p % \cmI1^ݛ>^1.ݖC/DY_l  e@Q||L!v -% F\!t$@ tkkJq%@ 26̀5ཛྷ=҃b V?.aဴ֥B)|OA6&ΡњTmA<0")LK=9|jM$[jq/4q %}w;t1B{Q#""!l l*RU_!!R mi@MrJ$IQ)` YA/3..Eg.Xcay)R'HBO;AxO ӡPܨiAi>Q3a*{ـ?`$Qa_ƢV견+-;xmj"2n5Ks]Cyցg$i.ݮz_7bzGq0oߗ%_dz(P#ЮtR<,.1-)Q0iOh/yNրmNi=:Z޺x3@"=!v6z6ry,b4Q? M?L˧aǑ;߀%d+aNTz~5,Cbl֫"Emf0#00vIcm#I5*F+Cwd(tt,Kz.nGq'u1ZHZ,Fe]p-,W d {Yh?#@JL %,/,') %L\nYnY=r=9Kx>¶ :(gc=(t7xF nHNxpǤ蔕n)>:| #b@cjȖ|B5,L f˗ǖ%vlQ'qݒ0lG3#.rC:8ܷz~M,cԏiZvW.H#v('5?\c-͛/ehؑAb1#DKM暱ͨ$G"JX7.ar x=^iq&a[ 3.;rz9_E/):PŌ̡N))9y<9yiͽ^И)̅g^q2q(wiȮ9s+;$v]5/ɧzZa6Kʯua9=&r':mqltg!|?^@)J_ꞾɲN7qA&8B<*m✞;9=ugrzNh֐bj} 2\DnFecjҶwxWF'Ըg&[KN֏n*72(\Ԡ9[Fmx/'HEpw&ӊ楌U[,O;7W6p[Qfw"qouqp}yc2&z)Z$' Ϡmu\.w1aRnλ~'Q9Բc#LGFIУ\w&T$25?͇TߵjYQ:{"]I۵M4w+[̞,./HQ7_ݥY&F71ļo{׳!kr-71 |ed(S3_;M\o\;xF참Eb⫌{ߎ_sJ8WOu{Ma:KB;i[; =qHF6.ȫddhcӻOk&eIfs\>mıEs^ڤΌ{lҪʪJ#PIY db܄}w=ͫD%ǽ<τOZ:]4?zqç]|cڶs+F녾 ex7|!~+j[l- W`-tq=kxWpSy˳IBle G؆=l5¾if)k# '{JxDVDM? P7ۢ&Jmc{OmV3fu8#2mުɋ6 +)kw-ȆgM# mLv"344U2;`L#es쑞(:ǿ/WxhS%[gM%*>X3ViF3`:D8FEvW@72][N c#v'0S.^Q@VZi8HCl)g]-g ~e;9P|)_!T&A|E91R1;9}K.'V0Q0~ ??1~ι,fd"49•θu1[_P40[zN*[g%©>F+ӡ1ԕ l*ReTcʋ,.3q=pa5:|D|̃ #YnŬP{9ɣvG rEYYd59!DԎ ЦAI $K#/Fle7 ߫_4ڟZ>w)k3ǩ8 fJM])xOL]kΩ;n4ێi ׯ&L˅wiG5e$ D ;g픽 Dnoaь^ڂO1>1Z#sIB( QPDB6l'"R_u;̜s%t@g@d B\F ӉȏA;&rD}WXx$Trta?. Bmcˍ‘č5!y#E]HqB>6|#6|+ Ly~O m(xQީFYj$n8@ݛ bȂ5yy걨T6yn%$1\#"^4,$rL]wVW-Y868э+?۲]_ywGXfKGy29^K®`G ,7wja;-^t/#['BQS7䝳 /΀C!nK]/;OQۅȦ"Hrs/ :uǚOnuиHox><ibi6uPjA?h\mD̝5`{0k1Abg+¥YkD|2^c8i톯$%/ZzV옉g2ߢI&35vF@,X!$vlbFӬ_7G_%NL*v0{Rڡ1._ l|=zJأ@|6ck?vU0}b|KF8 Yb9sGa3t~tPRl1NUFJSي?mߖn7lꠚmfLt\r5eüS ߲Eet_< Y83b%$''t7hBԀI!۬ѡȑsz8M̡;Gsqa>^LlgzFy;fm,I-Tʿ~2D/d2l_<#"6pJ5ũ0D$jj8,S'p `FD;6&Z?}KwQ8(WAHRR5P9a -D+G5n^TԓECYFΓI`ZXViƾ8 4 tB?ajg ֠K#xH4rgI"8+4"=[D$|"D2Z6'BS;Aʩnhz^ف+4_$ W@衈&ֵs|2[xoٶ9 p%n5iaP=C}x,/<WU,hz}=usXhV~;q0M׏,Ćpma O TB =Puojm |[x~}p G;Ч'5|jr8 i("Q:E}mcu, ],昡Dn% ñq`Z'+DCQ_KӥfHUR}u,PEP5bcP$^5<ӳ S8HW .qѴ.^Ogɠ!*T{ԣrgo%l92pC#v/đbKy~O3&f+eP/E$tm-4aalx"4<[^COmϴ>2ToE Ԛ"A<(=?ߪ,c.bb**U9..ypWk`043. ͤPѸ .YclFHK\q\9)W{L;!xaceeaN`:"j95,TOK)?b fkFVam[c:Ad `[7HYJMJ)_\1!ǚTFij۴y'fZejSLͦZ;uI,{0̲Kf `'.b[h=`se!0|;0(v}K?t7"cZ[Eۘ(լHh{7!]Oqk\>t%^ZM BOB_QEu$֗L ;-WMAj^隉LFu@׳%kSZy35v:P=[$HZucٻz׳@rVHx)ezwl2VEuOjVEnEDSX?7;c q=z4Y\on &]4Tsldgyi ӳ p\$P tJ:ER,o HLގ].j䋿Rg$X煦cŠMpC<͌CG7Z/V6س~CH!ubSx@2TƳ8S tyT7ʘJel-5͠D"Ȳc׋\pH4Jd wmE.'W*m}{ 6gmUkqj]MJF)yAꯏƨ %՜Ƃj(TR$z!U5/nB,⸇1uY=۶,24=)ޗc2 W;VYS;'! bT ~liZ"|X7rVe?tfD iˁIi ผ4j`h0Sgk\e3 P:/W'CEna[Dr립HŜ"xFzM"SH+kyVnR\Ty GKhE.Kg5)`;z1 |TT#&rBnwtxQ G ̫ }Ptg"pJPD0Jj{ thJkUT7zl˔A4)qZ\tQ@]ytb.*Vm .Uu#*/[c/џ\FϕU!%- Qp9Y. .%u[5trZQߝ2M TcGPEʂr iJD]z(8Aoz6c OLTQL[ʜCf^JQ •U\ %T Aih֬4Pcwk<Ҋ rҍ@<]KA8cyTĘ"@B )YK*JЂC}X"]VHB4#xoG{;D!ֶifdyHYlxD1#w#0u<.o{&5׃ײƮW ڹBO%ɤlLCH" M*FU7xUqE }j'gESC')TG/J(뫓eWף#(^qtF^?~O ?RvޭwY?TL"TUsA:&EA8 |xj9y+]|Kwmgr)'XFfN7o=(xbȿS3VϸF2WWENl$[LO5 *{>+kId†!kRI߬vwf 5ƨ|WySCǨ1iL?,> r.ċ"!Z>5ۧ6`&W딃l*[^KtD&>bcDtzw[R;9CUH2߳3bFv!ihDWpQ>>}.јo<ޙk!tcŠD[2v!p.꠮B&[bTgLz/.',10 '(2W?uk C hf{a}sϢ )v0Gy+BΉ{(nJkQ.+Ѓ BޭIw h51Vh TiɢyL u|7ּt[?vt>0IW?aܕ<p r]3pس$"Y?L=0ȑ?FB}P %p{M5RD LUz7P%ڎ%e͈2Ve7f_(YTe7l hb/ %Z}r3s*sCtڃyayDe9A懞&q# M: kePs i܍oXYk5Jz׹bb} upDڮO Irt%Ӿ|Tip~/K|Y[*NJ'eZ,t4f1&'yIAۋh;m~uE/A1Rq՗Xq1v@l2.‚TJ$H*}! 0Lu&Y '`y ~Ϧؘ eJ,Z: sc*jŰ5ĆG@FcQ? QOΏd<NJ\ ?M>w>MJRrMUtȿYa>9دLhqe܁xmLpI"nc( lO*(ȳ]w?ªUyz$pKanh%y"ւX3ew&&\#6S] X bU 0 o`666_WU䚺5RWUG˪k0>=wV j?<RT01Xqw՗QI,{p,67#0@ZjU0pMx0$Jn4tSUw8AqSǎZ7R=mU|-5g΃xRda0ox;ɦO vykyIJEk_03[q֘-Zs8=_I"; C/[n8iG:)P\IKe;홺W۵4KwݞjnXN70E:\2Aީ͇j.ЬvQsWELNs5iˁCE-8Ұ`U$xHZvL $Ud{aLrZv|cg&@Mgh>#<UjcX `@{ w*0qsĔG "7+ApA'A7,"N0+vR%dECP2 =PHCsz5|d氏˄76(Pѵ}8Xpe08BP!+]`\Axُ=P5zNW\5#djBaI2|0!B p~5P~-f"s+Dޜ ۀ:`$yλ: 42#k2?tNdWl!tԃ ˿/o `?L?L@C\C-VUԀbu,p[할׭?<pAn;#@Q6@#nL[%$gq^ #Ȍ7$5NЌG!P;;藶};>`w^!mVhᓩFp6" ؉Xvmîmvm㕯m )DP<<a֒iSDòv_ȁ^o<q>2g</BS}# 1#&1_y6ERyʀlR{sEbWwS!i2|mS\ Ϋ0=*k Je>.CU3Ľ0z `fSzL":IoJ0>0] Ǜ&Ayff`1별I7qF3x4 m '@cР.@K6[fbr&ߺ#s}62ٚ ׭u+(̜7 3gXZdT˹y8"r%XXJ dm9-Gqr}v_>~%r[b}Xh9-Gq(ŝ8S<7SqG륄X#p=%qZTKb*P-%~$L[lERՔ2-%$PO-3[~Qp~ 6*a(^"~1xnSO1_D*Tp)S SEH߽co+ Oc(Z/w*KCo2oOlU6p* ~e&j6B5ƽ@0B83D$86˙+/޵=KF{"$s߸<ml<4̻Hml!0;ꇒ5#1 b͆@ d2_,`A.y lCB$ $d*Q-C̰b3Kx6K7/R"0| FSXM̛ A~^$[aD VK*Z|i2!Tv hy%0j b}HpH=GsA :cM +lzc>rA=)YT=߬XpE *jg6#P&ш-{O~ώNv8J&HUnJQZ[Ts:iK C{ 5ra#9c>P 1bpmx=a={ԫ} ֋EtjO#"+1DFsPpQe!1+U$So^,˴k/+ >F]=XD}lFV3NT,;Bqkk1B(^㹂W醝va="ovn ^uZù9ĸ5u)H6&ϝns jbӂmG@ 'mA Ku&P3ZR.,RKt.=>=14 ~KvI]UaaKƙ *1T7u=G8oqWݩZ٧ں}_r1{e]h>]0vGklqwha "() 5z^Ƅ _@K^/ +b _ƁvԀQRB߭P0Q ƀ(6C°aP[ad/~ay|<;~S|ۣBXj۝gܩr ]z_XHTl%BB^c uY{roBV*PʷKC`Z6]S4/\_qz,jYNI!x%ik\E۷f1f4'.uQz/T64-+<**_Q&D ֣y|P`ǴSu D6<\Y'зԚ#xV:IyvIW=K.OY51EKtiL\DbSiJs*m!NMgk u*m{kWaܡ(=%z 4X?w*?1 BG$Q̜(Ia;#}N1WiaTPץR"5.F|93"8 =,mMkϛBE+ -ҩ{K8%F;4,1b,1>%Fb,1b,1.Yb KքYb=XKYb=`K[b KfѐpK[b}@KYb4Kfю-1Zfv0sK[%nɲ[얬npK kюB-1%F;hp%FB-1MV:7Xhw?nfSn{ծ8qItQ&h7kYXR)% G gN@{{0C(_^shL<]zYn[:YlIhx3OjZfzPM#gJX,hHm+]+}L|8>ɞQH3A !u B[A۵-e׶κeie YHK7x"tKT0O*DeIV:+zApD^+ W,NhJCQYӻK 9;<4zڶy_?pMYHUֻx\0 ʂ^2-?7*nV7U*T-*4*Y2ſ 3(`%PX!*գix5_Ɩe+q\=^..%;9 g@إ#i~A2~B_~&aLfŽã g1˪R6aED´ ymckV}a'0KW/Bc\Mh;&O#wZ x *J "@DŽW\8g@gCb-!7兔>¥\̧V ae>Ċ%4i=d[ʄ{^Avl@$c=o :>pI11Ń:\bhoߡ1>/Ãv YW;V,qf2?wt4A!ek0YoZAy ( w{bq#S:Z#l;|NS.\%< C0B_K hpW /(iコ8H@W\Gq\i;6{=q9{nW7$C\- 5%:#(bּev Sw`5o#B MŶvS n(2aW/G ;(vtL:ָnO1 S--} [s=U$g0{a57ޚyd8B?%E ;sBGzZ* ͬC3%4$<{ .ϝlI*- vÒ\`YpJ@,  &e/T[JBm(lcD؞L#y$,m{$|%,fYDMM9$KS!MWB/2i7{L#n0MZ,FCh[C[6b~u4Ӷk&mMڮFOz郒Kb~lO ff8jY.Mo%۔)\[Rp)GIJ%D2 iA+i)ʬI6UNػU/KLR$$d'i>cO<Ϋkq'J(Fu[F9N|*{hm|J럶p|TSs`_G9LİenJ}(jWMkYQZcmCVkYg-V.iZ-Bs~;#eU'+K@S U*5Yfd.F_dvP:TNc߄0ɢ0aN/L#vN=$n3Gۯ"/*+2D3.ZvO ?`NM~C91: 5Cc:oh.>S:Z8y\N/aE" e1L$aNGRSp`qA= 8RG[zD@UDw[7#QSFw-8pV 'Y_q:lTXD%?_)vϔt ftI@QzׄSrڴX>o@?|,z-%NBRG"W&#ǷemU?<'#4\vDV{LrQFgИK?ES "OT7_\i !U]3ĞP}gӏ~}~.ꗙTo-zn`Z7wbJ.wwFЃ46hk <;}st;n1+L\O]dŅܞ&0¡D@<$$'RFl{caO#xyR-~:WkG1? ێWsNǜi bnr)bnn y0 șP ό|R[nMTN[eio0 %Fsa*s(/$D@|@xΕj<ߒ``%{ ;`|jHXI kPHj s!P5ǞNEY^6vnQ-ySUAІMxݞ%wes^&t*?=%׸Snwƍ]S aWRY 5KRF stLqwCϋ(N"2L"DHƙJc N7 !fӎY!Ps/GbjhUJZDx ֯rjhu[DkhUd)V UJmmrm|m ]"iDy,aq"R0峘zvQ>R%;]W]".JΩhtQ.J=Z(k_[Bn墖8qRQʶkg+JAy9e ʋg(l%Zn Y+ F/Ãv Y!VlB㊘;h+MpPqP|'|'7ǭ: y9aO%{՝3pԯ}!7M!_[ mr'gqIGf#5Y)4_OBqCQG-9sk.[ ܗtWԏIDQ*֩T/=/c.5G#uWXx$:~/?AtN{S/z'l-NxoV& B 8K"ĻvI}ħj*"&GuCAG$MxHup Nb0`'`wt6&0Qh+ԧ\Pxd?{{x:.drM6d!+ lsGO\~\\|!(734$r cKuG?uWcZ㹜ԢtQ~ )Wt+5C ۉf@qB<29=LzP6WSx:9ՙQ1u} 'itWENnꋞIU1WT뭺ֶ/Zbb{h_}S-aK_[כM=m2  '%L4J)DS6 0Hx|'e03S`:]9aJ# 9齺Hx9[Om'Kp,9W~&Eʓ &# xPErQʄ6&z1NLnbpkJN@!{k_d3l8]V''nqQ>$l*"Q# E8^3{A ħ!I,dLI $|K҈230q<8Jܮ0ev0O Zy6VAy^r!~8Z{5~w8OUAcЉ0zQagsKå\ܛ E?ڙ'ƣL;TdϦԼa~= gr4Yo|~K 1~9Z#9wt{KҌ;{|xxlr)2ϡԜ"NQǩFa"?33:? u& Byz|38?=:服O,F?'LzLN3)ugh_Z?1_G} ԙ:JN>ѷ ^Yޏdr Pz" ĆVh 9О-@!Ls"36D~; ׫\0,2c3*rz ~Ey@P ۲B8aaݭھy=iS!X㌥'#[u2OAv݄0_ *J1Hu+c"N"Q9W3-g V%s9/fLEK5 tlm{B "&Si> [E]*?8*o~`{alZ|o% Q߆z@I4P   >A&.C5WQij7^MfS1o).k*֠ֆl%qwˈ\&"d4vbGn̜0WEn mˈ2"aJ(#rx Q$AܠX[;XVXT)q>9}DB-&be1QZ-8b`#-AZ}mU+i-/":#U)8bhf9uE^oxJ="$攍Z$,Jb$u+1zlT01F)B$3];P^ %Q b0g'PY-c+ESXzzRQj=<*Nj|M`Sx<8UZ $+^-صz˩#C|7sa1Јm[ꋝ&P^aFlVo'WWgfC2$r7m6zYnmn%[xWe;c;TaWhA]|M@AtUqU|SY5K5Rti_BOLZ9MxI[TD-1NUJ\yU#q5HTsű{QcVZDWDxQ6W EBhmЖ_cIֱ$ "JP$p=?$t9͖] gL0Ƙ{Rdnȫ9k+o`mZ]5! S_xS:@#zT軧IB6G( aA o?~)l^/#Pq:_I] Е+bb^]$C.edy;^Z$W=J/Rqw#_ 8rN{Y(ZW$:Qi/+B]m z3x__zǥҞּ<){#'J_7vK^zF˞ۇ ͦАU?#=>zgigݾ^l6dj昫­ԟҵ;CI2~c?Xoj7sk|]=LlƝ{ع^l/VgoFx;[b9u}9#YvWMQgX{KK~OV(s_~xla{BdqGI,pFኇpldEE$7pǧN=2 f/_%20\#mNZ7DT0hmۓ"1K ֥f8k#p0$` Q*E~PK`N0 C\.@K}g C(MYJ{N.\YNՒ8C{4bwvqړ#ǃH-&37ʇq[WX*ӸD5)ټ9٧bj}Y,'esrv{Y<9&x bߍ(\lGqˀ$̆ 6L؄ &; <-!d*"M(=rZԃt9j[ %QT8duQWGh.Ra`9YZofkq{M ]cVfEڼ՝ ǣt`fupaZh+c|;8y&2jVЖ۬9 H1tm5JKiFz͏*!=rI@G͗9|9svj _0t@H8)=*F(MCI_$("qb]\YwRǹxpřSwq-ŞN6Ns~fb Mx8!`QsQx5ZZ8SLG6Ecҫ9cҟ7\0g23{W>o{^k>kif@ݽة1Fql<(H4BJ"XDse}jRZmqkٟϛٟ!9֙.Qt?,rбqlCoKQ4-v,OSM[Rz宒ZII$rJ(Zk,8I$@2_u{E],⨾1GU۪7X΄r,k?/IiQ^ j_&2uEP;ִԮ}jW~"[sQ' KQH/'9gqNxoL*cߠ>2e#o0jI`-6nkcFx^6<}Q'.=l,v{pdZoR@iTΆȝ# ɤ;C&δ2i6١96[Jαԙɶ r1 ),rC<"c+kuG-B(-t,Rŷ1x~ ͘@0jR͎g ~QL~cAG"SnZ|d96U6+A{tوݻs=tdqɬ"V ʽPwH岚 YmKpLjQСvdK2Y se\1YU%2T^Nvh/:*v^3Tmg*ku+eY^ygF66mٹBErFSΈVVFʀTǜ kyMzL4qaH1=V̸|^kPw>軕oH'[ Mڕz Ɏ/W/bV],ECa%~)W_[Nᕅ~9{7*Y֯:LjN7~5=cFyp AoI7?A%"xA9RuETԏ&kpOhFcމ|zWeU_s>Ga^v=!grrV~2Z[GV0jszHܵLeqX4i^SKDž-Ş&+\[+nA?Oץ&pg9xNx gi]f }i@gbj1HQPCݭ %(MK-^?9 ˑ:&'=L) clf*PF/S JiVJ(Dm|MB5yuɯw(Y/&((\-z~PHˤe,p8H/X{D0yǣRmc*Wa~0?zpVɼZI{|E' }9Uq{kc̫V EypR.E?Gŧޯ&.aDbVLwU0U,^-¤[:u%&l{ ޅŬ/f~YNFs~55~Ε`Hזtδ%L\Le êi]_;U5_ʙՊ~/0c1+#vOoTu,Yn<#s((^ֿ.M>vR_3&8>pAGq̔Z2A$hFB!a Nk1/Q)d\c!7Ϗ`4n l|!Ӽ4}Ck4HCn 4]l̽&81pF1y";濚Ňk1杦jCs: DhJNY>,њaoG,e7H,Of7d9u!慵"p9E Ŵ OG39aIiv$J#m:T"7"UNm$ܛL2ɓI>^x'cw (@'ğ|9iVuA%oz%M% 3ƻqq0>&b|0-!c<qvA#C#0 Z4x5@ӇaY+)/TWok$gHq[#ZYfy7Y.g,DYfn f? 6G-G[8!-1$VX'VCMTNii {eH1s/Fݤ9(4_Rqii_{qI\F"69uN gqS#xZ؋þYrXΕx+,U`4-| &1%"5~ -!<4ˉ.*ӂ2<"KJv3*`]:Cs1EukM,"(1ü@&98R-y$d'IHEpdde (׈Z \Ogx~/'8ooNby8j<()BT3$d'|<]L.+O#WRbjM{LtB+!杆yl-KJhծխRT.ü0XWo9Uی2ғn%ϙkdpR <G ?,+i"c䁛ΘIr} (s\ou\(U;kf0A󸛘Q Munbn 8g;(ZD3-UdD*2"*PV8{,ycb2_9m]"TlW\نaiMKQ"K$<rjl7H(Omd~vࢤiA# cI;B,L +fdw㭂=hߨk ia]8yABx2?n%#1cG U"JQ3P&t[q`մaz7t4'uj%gw:.*׊ï^MŌnb^`10_DWm3wKȰO]K-bbNF3B W?-ew譂)猈cky^*9Q~7D& wDߍ3wKDO~R[,^>p+(d x<0&9dwr IV|GV*pQyQcw|Z)u+6H(O's 8B訨E+1%RfppwNc9eQp 3Q`Ufsw`3ge`e$sXr2;VNvu $Ĺ6Jsk9%.]> !<Dy:X56rg4z}֞P=l95BJn>_Ʃ gյ_5{ۛOSMnq|{@A `r^M7?b8q)L? X{!P.WL]̬B|j DF;FFv0jU}V!:Bp">h>\!XcWPX͞$-mI}q[|)^~ \><:f 46ФJFq0mZBOh "Hh9iB9hj'Sݢ 3>E6}q">M3? F10&G>俱ɛ`/%9Vf쇳7aڮ"P'گ߂9Zp]~s@5<0`].-/͚K WB G jFiȁߖ&͇N‚(#TnۡLkGpl25G -=e@\5 |xdQFCCqVby`P<0 'iQT" K7+B3Z sJK1x>LM1)5$d'||IKa Fw~JJ#Eu잚啐q%V`iu`g1U ;N8cABx2ƧGv:rN`44iY%|wsg lD(*X]b_y8=%ew魶&xXi\ˍ$nYzL&өd(T/2wKLOAqcsLF(z&Bc9<9r]Vb2;MVI5l;XZ1܎ҜiR| AByz%-tˊϚFbDwnmY~&J};}TmLyL='W_%Z)co$ O$;)2IZIܞIpQ!})&Ӽ4oogIK(] \{Fst7BnRR}QͷH4O4Xc惱mMÚ"]LU| D5[E5N|50` ~>Np>J*|d8eT*D" վ9L0!5gt?]6ods@B EWsh˭9S !X'[Rr}dSL}PP ;>~BҀ"VD|i"*+s\o^ \OJ4;`&Aɍ({uVh]pݤ6y \4:!׭wFWRjƕCJQx*9cF~V}{2{VwYJFgi!?2ItBq7kFD4D,!=})7ҁ %0& Egs("%hOc#R2ɟɉPac_!HC/zOIND {eC"!<οwlێ2%A`̀crO//w?Ͽsi|v3%[8^~/O˖׭uvG F.y~/c6NR@~YB) AYc"csMPg,.92{VywKL Zͺ#vdǹ&gLKK'qjM8m Sz S,&) cMg%#8eUWYm΀ ٪ge{JtQuAmE"!=WX3mNv 6P؏ГIML^Ӽ]xkQy߮"jQO+:_MI~5$,!<96U2N()Hhǿ = R2{v^ ʅĤ1녉1or򞢼R++"!<0m ں HkFОQ~pRLyi޲ Z+Cdb,' |V$|VdoYpsWc 8 AZ@;kܶcYk/)sj:C9S yHm9r˹-2I~4Qr UX 2:E(r g_GLCr@Iќj9h9[<7)+;ayjSlYޔ)1J!,m DK!I5xuvcs´[9潦y4XjsI$[uˏ9%p4/?6iYByz-1`-))J3$H¹t8GtL x/dr+ 9id*۵f}cdj>,,!<)YnAa0C( {U9d3QXQ<[9y+ϜQ@6EUV;Ey`~0b"E S.NYfF75!XqǏ\;m>>NØ;Ay0C%(ZF?I+I7s:"|dON-FxBz$ >[7ȃuFhv?Ig,d"튭mc5?k9jm w1NJ'b&] (\ }0TrYt H9# i,gQ'M1*%eRE$tB0ڛ*E[\z~C5B\"G.} T?FR>]SWN@@A1%a. /#E3x%:L.:Z_&=a3x[+4"00rFH[&np㝾^khbG7se\͋mr` +I|\^=Vx29eRV=1VkG@|$n:}۸ :KOzgh>ct7<*5)ۡEYǼ(HSi ]|W4Tod4T 7&n2C뫛J$2enEBvSYOr,y 5iI쎚ɞ[/ mFe׵2r0|mxBp!TB-IWjk$ש$י[$d'OHr0;hYH%8)@=sB2{vcÔ|m(Q Ek2g\(0NK.85lIYB&y2ݣ"y`bŸR%L d\:4R2{V>9j%BFr`u;YO $Y'i`'ܵjfyf,S3"w,W7h?W9}ʭs f`)hg9*-?K:4,!|;͵}4Yq7RugOY g;J8n \Ґ66,>\Y;2dt3)_߾mڸ"⃜oFLES o*O1+u-]JW7^G%[D\*3u =Nr레 hx/sP;+ǧ|=>C-Μ͊luo޼j u[*;b/!oussXiE,CA*@F릚*?DiW^OxEfd -*;seIT~aWvKu+ " m,McMr0Գr HM/yi_u3B|8Rx̏Vݢ>UWSs9/~:3ndn?xǶzVI)&Ė&8x'0 D V Zbi/K&#d ߼($ˑlbq#!z:*U1_0[/pȑZ*<ј N9[q2B/wpjwCǨPntLÙ+:yY9cUU]$uIcRљ5wOw|lPD0qPIbSH)$8m]=FMEǨXA4j1mɛm}Torzǵ%\/5ҭݲ Qd0Hğ=ićf0%4(ޖX2.0*Zb'bn-Cc?_WOs)Ǿcϓʦ ("MaF2§^ڍBhs֪[-o&w;~PZb3Z$06~VN<|ǔT 7Q%[jՓv.}_Hb]f([&j?Kj69@iV4NI|9+ʗ+Q ?c[!r2T;+0tB*r]I-Q ~#i(ΊU)tf"ʙ(5<62a weA7H9Bܮ轮5/+D5J$[)^B+vKri/prMD:%/ь[JD3':I`,O4g;n--7sd mG:ATAțo'/rm89兜q= 5n;iZz> M]]ztٞ陎6 jߠo8r{#'wr)r)r?U;rrP3zP35sP3P͔Ѵ\ y9 (} F]ҕ6S5@aY.le<`@+|%a)YuT_# Njwꛗu(TrK_TPd""0 p?7Ws{VV7`N NDz %>>8xLXdJ)L+#R]JJfMrY3:"hyGDdVʪI$)hP}j'3I-YM$| RIŤw'?cbZfy#`}Qx= $`M;(+ߋLo%*6r.8ցHyW(7奔<ʂ̫A<qPe#ѥfx#<+Ĵ.M: z`! _o%Ew4-* LDDBXai(iVu Ffr8Jp׉47_8=gqkj_ }#w XzciȺ&YJCTBUcOhە~b3YJ쪀P6"hbJ =Ʋd VbATsL%eҼ)+'V؞# Ҩz :XeJirWlz$  6xefzBt+v+_?_\^YV 9و׆F5 D*ſud`4 DuK]U: F`$ǰ$JvPdk=8Tz(#bDhGNSG[P @2DX 2D1#: |ϸ^,S(¯Wf ,{%XF3 _7KIW.b4\FSa<^ e߸]/ W 96DVLJ"H28o6i4 E!nP-6VjۆXaUc2m핝nraѬϚ-ot_=_3D~ۘ'}3Ts>w| ,7| `愎꾡ތO5fe!7gKu]jv5l̮֝]uKU1 7`I{DuT0\Gt*X!74T#]-uY>*hycfͧ5]ͱuԱL{ԏئf2eg?gj'DB^y/>2DUmzSsVavCc`f1.r߳ :so pp`ڎ) ]svU]3wUS{1ػuҟZ%z02& =h[迭ˡtc0fت ޝVTFᡋ/jnƮ6KPsT)$2w]anBmV t >JZ$O& byom{j4=S8{-]zZRř To\R<)˰J;+ײ8Po$IֻE N7$z"kI']yW"x,7<,S.OonA'R"o\6jPYJcߥ^`9/+#yoZ''44 ՃLoT7s%K(˴5Y人[7UZGр,vM_6OY`ȳ ʻybc-6?g~fKG)(e`I霗i~"D(?ePPui| 眳dhzNacaLX$_$,&~RYU) 6KE[|e09ϳ+k?dZ(?[1f?2_&1QD<^򢤿ch&͒yOY 5M7]f9? pksk HNEYpSeǖO\e=ꠜa,eT/eG}l&Cۦk5Y1.FQ+Սٻm4_Nee';5IMd&o*,ˢVv~$%$K2w_zH癏l83Kꤙe7%~o]٥8G[sVS,+h+_6.z,acٮZ7jhXQ(L+}9&t).Jdx7ABH )XF (C: Ę#%^r|VPS7Vw`O[:$ye Ďpy`KہKXzg.~rG-}:$wQb2E{cfzNW W6xmg|ȍ,@S^qnsl!O()2CjB,Ĩ\Mg(s_ 49GhFPxyKSkO06q1oڗؖ+.u{d♏݅ (0$&s%r@BE8/m{޶mOKɌRQ@I#0:m+ B;"4inךK1Dߖ/s#MI@^`q?-蟍X ڤPA &{Di/lO= }-~b!u΢<YzqKuyɕ߂m섆Ќq*AXj!0p |&ejZNݒi|`,7l`xUcwQ!'E. WI.F THA4J)PU.,0:^8Sܭ,##hO.Z?%,rG!7Ta>x}O}I6-tHGK-F7ϐ(ܮW!lNR67QV7E*wСaUP#Q:{ޛ(SS;U{']ǜLFU|fÇ~>sh=[!$qGxFx%k1$FT|t[6yǁe}NL4ܙC>d66^7{|ʶv}v5~F{ U_lo^cQRjuO _\͑u' puDg34IXD&G$hRB"ḛd^_4-(z%(/3M )`:蛓rpKy."S,!{57QTl[8ڹpfPހ@-ҒcAO[;zH=PG9mkҢRUo%8枃!z }Q:@Ҩ{u>z2M}´N4~x4ރubw,`*Mh;#T'.:~P9-$>×/C\.y-bL?zΛZ_>PX_~Dਹ)j7TX\_kwf6G(2X j"$_ Db`.şjL|z Bd-]bx;lT˷Jj!T \n?~A߲,?)/!Z֩xv q?-z6;sUZ_}}3 3D7sYS]phËΑК%1!nSF$8yD ?QBri/XJoK,xBBABGuĎv}3[tTI-XR5Õ+.H;VKOӧ$G^۳#Xpg+,^3ϐH옻I()V:cP H ኃ$ox G`q; 1FKۼ\<}p=q~qR;Jq7z~7.\(G_\ĔAHLjA. !(@"=Kg>^O2x <ͼ L9mx`ݚ88w@f~oةfҨ\l:y8VuHš`(g4BR# 8?kfPl7[>̶wȳ4vtб`ldqccW&VG9Ŋj6>~m@x 'aED nQ![)\P}Q&68BBͷ|nix6ҙ9+Eq~.|Ot ¼6|mO]t"##dDhHBmTL $ר/Do9L6K(.#0ukPQr' F)^e^-祩;n^&n׭@θv'ĉ{t,Wy{&NOCAͅYpwljoF#1b$X'a$h$$Phܭ7w;`7 JyM0Dyz{˓*u.avȎ?mۻI j`:Ыt|Rwu}ضoHdVw:z̯a,(za茟S=dֽr̔F~KC7-z. Zn!fOQ Sݲ[n)Bd^>ХąUZTgE˔ JȊX/fcMo,-ŒvwA7UڰX*v4JGexo^LML+eJm]_]M-\ߧQCۛ˥&KՎ\Eq5Qӊ0˿QyDd L%#, G %1Vazߊ޷b w? [A,J%\(9`7L꟫EZTXj҅'RkNXa~䭲;+ lۑ tbSHA# '0Lnov!lŁ$=&-{ۇj__u8X괺fK6}؁GBk 3؝*k4ϹuboFP*44ė/À[^0Omr>ǏӲQPW($03tdFܑT%#%/ %.+I;*Oz"\c|?jWUpՑz̿? }s0n&G+CpÁ7^Aܭy8,oCAx(܁H;`p8C/fʭr80-aG V 7X= @=hݜn]7 K)iO"TIǔJ07 ܰw&$]$m7)i i ؎İf}ƛuhF—5I^$]3 ;[G{uZ-N :tӅ}J7y,=U(s4\k!m ^NB/ػlkFsNl}8Ϫdtt7w n/QC&BH! M#"a"\ {٣}( BE)MID? yTߌ.x wAAhS\r_+ gįr~1۳΋P6PR(q" 0RPBR@ D̤JwDYlVj*QyH](llQ\|%QrRHQ(P|'<'GRt2꒓8Rb:zSڗ'H;4.IhY0LBQy7ҔJAv_&&,"0A!Lr2gc?Jmq1VеC&r=@?acYg#3k,`u6\32 P1^{#16&IchK` CT_`͠<};}0mxچnqܽ$;x茍F_Ͳy:0i6櫣6s&Ad#bRRwaE̻iNІT^r2(K~-eGkΦQ:kZ:-S ξ}5gD^v1El\&O"p-$:,6TG\HPz=obCY/FTcKB>9وI+y,Zv Zːh\)kt @ǁV^n`t6Mo:S#ex:^v]k]r)=V$Dli{ƱP s̋m^BB&2cIuN dw#*-XeVnE1ϔhpuu5#ݓ"Vese"˃"[5=,)܆QXŞ~}*QyAKNݢU3}cQ|ѥٱc6|r rP/O?4?i8 Gd03 O{2 72]gKL?G$Sr0ͣlJszCSk8n.^Bl~ d)ILab{u؏qTV,gcQAxY3J˞ %iSP6M^9!؆Z. )-O es@r$'D8ecCui\=E# lTXUi %gCdz=;J[pK'jo.-ӚB9oi8|J-,(r@`c't}Y`vGadf<&3",?sLeIKFP4b¤1hP̙-:Zd&/7 Q%| f()"qRG丣Iʌvv<6" G,slQ=$'4O IxG+ K5^^LQѸQX$Rb>D\K^]])N1՛bFlk:伭_)-!z=e? p>*//#q>f>~'O̙M^? >YQPP*15sQ|wa?OT&}Gh,FHk;9-<9rC?P+]&% rYTD _od_3BNO&-}]fY=ޏ2Sӥ+ד9a׼ciOJ[\$}ds6N]˱ 遼›uy#mvaw8z  RJ{&WNÉc>UqV`m7Z~N{P+kLܼ|,2ZtB'(pR[dLwc4^&Q8*ŨO.=Wݤc̶ŵg43؝6tx[}=?0C`g(|պ?1jm?MOu}6{n0M9'qehtHZ % Iv-ۥmhk/E,%ۖo1YزҦ[I1If\"yM}I`@1ģuqH c̤%VMe1? lbgB.٬sM& |٘'~&ze5:344 s˾P .IQqpTSNdݿD";&]𦂔ŦWBn'`ph@tCeKt447q:wm[=bC]{SoS;%(Ӝ3 PKZ/ N2{e V~0+w\m~a\{.藥I0{r_|o,*OXhNBpQ}vQsoV]Ž%fFKAړ1s˅Uf3]Ci揆*U0N' R U&Gs$Ҝl`Zlggƭ cW)dΐ^vBISele8Bx#f`X"8 u!u l5I, C/rƣRAu2zCۗHH0r`9IyJ>կ+V7~}a6>;S]hx$W܊`yȢL'49{0O8kķ7qM|9]l8mk4-s,;v\t}wWϵJ+jow||N% fmi< E+:Q4wњ]N>C4~ME^Ђc^{+&ְl%ILG 祇 =Xeq+({>K&%o0Q3ea-Uڨ"K훯S|`3Up%z(feby "/[J涓-\ ؅*ꑹ lپv/^Ae wyh}?G,.܍3@/کH^g=%yVe7n?`(1]- 7c 7On#t @2\n=m `PӵF7`?tj4>[WciE^ŽjvDqBn1/H̎T] g`yIl(8r}go`xy iplB45T?W&ujehn|'G祵a'uG&g}~UuV&U~hxm6>u6B `؆b0!ijLãk}#zs,B5,!E ,S׀Mhy.2 `*d r/  1oukl -4[ll-LY yx Gыpz21m3K%W*WLҬ^I?ͅSҭWZDN7s8;%Vc%] Pdd޼b@@(ΩTyr{ZNh(.1T#oࡋ){:d0Q:"rIQԄ-6 P]Zdo Jxar6fwr׼*;,۪VDZ,dxW:u#]LyBQ!P,܂~M 6x4Iڡ帞 hX -zJef(yD:nv6VjQeAYJo}?nqkM2= 2Q|>z%N[h#~ c`Fc]c@@W>+nC^8y1W'Y{fNT0q mɺ摨$~")W踰<. `fZ1w2ͮ⵬+d O+WmuC`g;lGv,eB.bW}܌S\>|DxSc. */RvVmb7Q(~w({5yYa~=&H穄%`(BH#B$VG:2xQ^.5o! ,z/ ʜ=r` ~R^;*5r\V/a?DWp8Hn!hCL_bn@mA%QOOc6XT>^'}ӌ*o0nuLLQ/{جnաXka";VDk~^xT?eSAe9%H(k`+A`C ci 1]@wGms5wǘ^,3wI‰Lgɻ14ƙ8gLutH1チJ3# 0a8؄r&b(*Df&DX!!Ί)Y >i;8h0kQfE=cJ2gV2Vï=2*i7*ʬ{QڎQuTf=؍ZBB\qki$2f:Z|"wÆVgS"[խb(0.U(AgQh.ځ(yv* #7ͼ*7f`k1e^xaF^:"x{BшaChc" $FK"&9{DTyqK/@(r]-C@YSaZu ƪ /~kUW6ډrŤ,y}cE4z)pxÀ 6]B.â(Kں:`[*<5qԼH3{xl ٵ3ÛPo|hcQi{ܵA/! f.-,j~;tr-h4+ounyG*.k̚V gqRPD\HcyAŽSiނ*ؠi$y k=,O.!S:Oy&(KkFn[k^gIj`ʩ}9O+;t)4$DfXkRI:c$/ҥsefv2q93"(tb74kZ-quE9TY/]`MYD濦j6BN<-+wPzpg0Hjd,ѹMTd>{}VY[Yhuiq[yd&5Xy}E_|oq?z%%r?C8i7e@6y3R)nڗ&~ƞ+^n.WڽUϑg紏^ݧ$'mϙ/˟jłcYW|!z.2FduZC>UkGcUƏitN7~|,NѢšQ~p 3ZN=wevɥ`|\u8nrm$?5m!"Q$A&q daD`ib{G~YXYrU_OITMB&sv[X\R#^:?t鴭!iYyY~}NJ"L+t9WW&65EuWXW[9խ#xg6ͪMVU{نǑ^7= q~뷡t]=>~ǟd.:[vYdݮ/|@&>0l{%pamr:V|i)у5T* JC#b2jZԤoMdPH\,ȅ%Eb導p`#3 }lh־k.qp]ze,a OwIHCOyvbaP/)B?5d94Vsr;{(⇤3AM4P #sá"!![WYRKtYe? 4t7~.]Y9 _鹃d: yABWsUUP{>zփv]?,+,,=+ᶮ_΅̗-;~yyS8^EܶJng_/e ֏hlɎ6C5I,#q?oMVrPv<(; 9Аҏ#QN\9C ŤckdK'%{+30iDŽھ"E߃L!g= cFBn\K0{,ˉ+Couvz}9e.#id?=0v+QSLJNz{iVL8默"Z_cn .tDh84@2CCr0 "$&~'k<[ \첪ىIX`5m5"XC֌Bp"#Z"N|k,5()3=IiBc6soΙjIo26/MBUWu߽UFO\Ioɢ:[^*S{)~;z$oZ6;yT| I,6#nH/+DX09TҘB0\c?}07.R:]]ӏV[t2B.c?rS?,5vΦy/IZkJȖ7y|p"gN!e6tu[b.#lɾ.Β1!쇏|#ܰ݊#+͏%obu~[9ȝk_&KmGtW9PUr=,yO}Rzt*5,u6e!}厼O uM{:~բUsk^ƗSsyN;C%`W\": aJplF 3IFrH6hn~Q=~UT jafN\+\{UJ&ʓiK;|ɶ[(ܟJ꽻c3yzJQ)T&+'.KΛCޔBO#CF_كH OJHhGs|d^=%c3멮VM7_.gX,hLe}f?߸PZd舝]_d~628aSyv1ܳ>X.(j.s/>]y evQv揇6jt|[nɼ0e߬?mlk>a`3^w -aWg5M3>?Ux=4)аP##`3 aM-7XFƯd}ԋ,1[ >&{Ǡٓd4*-Su: zLnb˻hz%K 8D\;R-@7 7ؽmPX$g,q)cgGʯ,ue{{"p\LNefh6K3WᲞY,->R=rZV_ltjG.ػRPsZ'dxyh!ZbiY,C!5XGXDuuy]/:6fe OxOBwwu| z6FBPL_ð~Kw]BTN}>Ďy #*K-¡Zaԯh]zGċ ߄~5 kxۣ7Ɗѧw@ok>.^PG# gA:6i Q?w#X0{4l#ՄoT-,Wb#/^yWF<7Z^@ib\^ƒ?~f0Kr C)¥!kBLt 5 _ݠ}[pq'rD$H)]z!hC i!aVSGg(&nWЩ}0jv\x6vbUIm82^wi>Fc^3\LNa[q(, ڳ8ku{1 n/Py6gPͪ4dTö^-?iҮ''1Ӗs*fJ{2qNXyGC9G>1 &RbBYI) | A3%(äСag엶!Bp=&Ӌ=wF^qBm-#☾~A,A!NxsU?q(Ռٻ8n$_O}Dlx,y5ڑ}b*})>X'PM6f, Ue/%(Rpe;e6%;Z\kjYb9gTvtR h[ 1V8T@A 3-s0Qp:FLDD;`А(|]uKq/w݄vK<~ǟM(ꂻ݄nBPP&A.ι0J!DŽ )hUAq-3'q(|St=lر}?A.,sq^P82eFAh)bx'˩-v!K82#@Ar]&e}b D<8; BruNts`'tfR4.RM 'lr&lfs.J۱ #WOt6J-zF{k)ϝ$~*/#Uyb6B+5 fk'(QX:i%&TkE !qvwՅYƯU!Nf_}CݾOIZDqb/?jwa/qq5ЛM0U5UR= "P&2jܫ*%Uߛ5{#ʱ Ucnf?8ؾ`cy Ɡ >jpL/և/>f y k+DUVg?:f̫}o!l _2+ET^SLHː0Չ[a 믿}JIBO&s}gGHRO KRlM>bX`D܆8 67 a ',z0_-O10i*϶uZ擇Z'`o-aS@K  A!A]AԂiA V%-MFC{n H 1IlM")|aT2>DqV_dm+sG**_ErxuNofʼ+{'W3wua햟CIZpmS?|{zLJwsf_0uuR; ;ExZRK.&eYCc $B )H@xҭD!ڟ(DB"ڤ6 ?J)$Zo+IYW)H@C#:0ʑP!Jٜ2 Bs$1q[41B4G*L8(A9w„A18 ,(-*Lnskn+ĽFA`A(KQP.'rҦYvu z?Ejʉ~O~bڏ5p~wc7R ZL=*/W>Ap%":p{~5O9%8u%i[_jJlӇ{+ S@trRvy/kw iz7 r^:7g:Y76H '"Vtv.ߧE,R<(|ߙ(1ƫi9.VS$S-\a4l)QP21Qhw#XcΕ> ηxFXQ$E˺d8k?mp*k %G@C Lq" Xj&t0ǘ!w@z*z37A/TM6C ~(zq`Tpc~ U;{eq6&ǯfjtPR+)"$ಹq 0gpL3F9WԽ\hYCIh>,<Tb'*өHӹ`N\d*_@!sAa0bSAٻz?fF0~`VF܅uyݷyٗ)M&FOSipᣇ @9l榸@qTE\,aSPGeowb*Sdf 7=BˣQ PeHq*cOxKy?>aOE" fl܅).+p1'Z]nFWnfag\.~eaipKFybrg^}vNJ `12En_$5#o+s6ߛ/D؆T(P+'a+]yl~spV}1nwʄTVS,f43Veq8Au+t;^\XNGդ'%1k.~&Dvz`ci0T^yn\ay3=i>fl;/fa؏Aq QyNH #Z 5זLYktwgbZņMӚPB9@,{xto<xˉfoG<(aكAzj)@ˆ4#( #!p,"A(LN 4ӎxO;yx9ruC5d s:7!V_!$}<ݽ4gi;y[iVzCh L39:jJ 59l)v! t)W t2'޷5e!$xbh&2"L2d(J"2. 4ae)ֈ*Y1#2#FG%iT2ؠd@Hݟ۩ee3,3Rę6v*Rj{bw[^fl14Y-^,Xww7Τzz:a,i=6edS#1R,e,Gz 60ƭ.Z iR 4n9AnFQŝFQݐ]0 qd!Y# qd!,ıkP8h8ǙO$>IQ @ $V$yFq .$TDӇݖswHO3;齙|Vn\<LrB%AHq/A)hBat25zh˅Kncw z (@4Wyi ~a$1_Kݏ: X4k(8a#Zͥ&NbGJq[5|a7h:tAda_߿ksqXs?W18T!>Wv0}U>| ?]̖?֍eד/~(4G9&@T7/_xrkrRiC* H,PDa * glQp{eN0, ^^O`- #& "qӅ\ҡ*J˹o@m1sW6b:㮁1X\VC\\"gCL.䧁Rr4 XFsP0i76@.u@$70 @qwWRQwR"ēlS:˛ALț]FsE"cB{?ehm h*w:XZl91lx%zpA ^Er$n7}S K1yW2t)#&X`j_ԩAoFe_-AѡI9ȫ?/q^eg` s cocߢDW:?d˛AeTGNa{i2r#>%,\` [hNP@bs爯c؊?͈Gh.zrti'}uƃE}b5rץ/]Rq4ΤTԧ=n])RF#q!YЍ,eF4Wޫf "ѥHS{= j7_N ~'!㧸M?E)aʐe0,vC3QcB#v1)('T ^0-fBSeî`B吱[!x#dah!V%Օ%G޵-7#wcvc n/3S]UO Zv~^$R0A%aKV&) p'誢M6;^v0;E!H+6A< 7#7R}#7R}#7R}gJ}RƱ$VYRKS*Il+t#ńe$kxCzmf)L8SDEt&JvdOo㨐q L 祬la~i2 v: oܼ23;a`UҤKk<ap6p'$ðdzˉAB1;Hdl ceI[+1"DX+ zǭr7tbGyC+H;l duU*gn tgn\GHI-UzZb/}ڔrkPD(Q!P(!-F&EpVg5usLoOjuPݩtX֝ry7D /LZ]}q'/p#'J{ g=`APգ M$(ZDi-K117$2ֹ5Qc~1Y.ſWY_~}.UNd{28}dgGV4fjr~[fܪY3Y9b/U}:ę^L78+x?kGՕE+9ntj,_T^ںDVаܫ_4f&1W؇85~8ALyܳ4iݮ~8.W5Z\fWɳWߣ^90]Oer~/eyZۧ:P74Pϵ 9E|q!ܿCC$PfP XʼnYm,-$2MpD0A_Q!AA)ͻwwĽ U!L%+l;~v>8v7w3gP?Eo&>1>F7B?jrgkS ¶ޗ-w<1Yݯ}<=!+b-:+]KV ֹv3W>ڡ28Վd<'|`K3Ƭ#qG*N#?2 #,!zI'Vm1)N/=^]m'n{ۮn!+&`/+C-Zu!J@F7C`)䂦{2aHVx 9KrQeh,%_-נ%n&[mKu0[bx;4U~c 01_'2oC`ָ+­`ƾiC%$W+p'3BF{?)<س**\*ys 8'-1.0 2.r;VK`ܘM{C_vh~:Z񵽴jw%o+>|=$h?$ T4H6a&=O $0{!?|2t "z\,-뵃#W_PyڲwW04{8#{/'ō'C^s@-.Ӡ rf9G =G<Å̅ί?m],tM]agsqswhJ%:+&T8DrkbR)ABqE2 ">]^t^b17Z|?V][CcדUIn˜OzLٿ^㫻jǧøcD+j'm^8<.BҖ$*F;Sy_7[tR3V_=,918O8  _,S;Ls}TnY\Wz* 03`3&4 6XDefwӔQFD8P#}%:ٯ7[erCw'X\۳_7ȡawVK xM>lYG` EM۱hu,Z8EOZEEFcXXqHj҇]zʱ3iَuuu:'P9 1}5сԺ]Zdf}u9eA]6Dءd|9 Ö {mz- *o1UNO^&cO&Hi3o; uq}Ob3sC#p:rE~M(ĭm>>鷠.Tp@$ /__Obɐ6J!X"I(œg #9rR^Ȥm*%5)H)1LpocE8أ*j|IRʙ3Z ]S]r;9/g7 r 5-^| 26 れK2]]̾+B$,=&8:\ tSθJ8)5:!XDS7k҉{XI*'hG8n |qtf'ޒppꄱDۃb'GdeO~D(q/PZ$Y2,c\j<ǖZxL;0-%^Azy-8Bé$Q%Î٨J xo<|s8EXPY(b!\'PL PZQ1i/DGz*pBxC޿ >pYu gv]of5Up{YSp_9*bR7F% )`h.R&:7dU}IwK߽~fE.g/mx_nnRTez{4_ d<^.mMQ6gÍߊ'w175k3Dx^$R6d1eۆz1BNEcy84uB9O6=&!|YSʨ:w c6f_=h>tjN&1#$ 2hDį-ʔ;@i0njN FbM;9ш~HPLbPƉIu%ISMJL).n ! $!R,Z!!!{1&}ŬppБ-tƼ'F-ҩcKD*#SC`j x.-OrXap-yd}DUUrn/ѪSzڡO6kjYeioNy7+(GK$L*pB8E?,>W^`p_~.>RQ"7esFJ[:Ѫz;6ZٯLVμ( /qnW't|/ՕXΣ[;n+TLЛj'C E.^ѩh"1L>/?cfc &:s]Oer~/e:<Ц9]Yhgk{r̟0+͞"ZR"5Z!xl 2B4eYJ$"7G\B\#_Bf\-ss䁮VDbn ,ҍ@TRĆ c2#l9eILIأG~,oN?>Mf7euT Bר}XbAE{Ea7W:6~$yQ&pwCK7It2zq= )̧ ITfƶ \1{~d(f!\e2DSD be`i$e()rIK2M]VY{}摐  HG2K$SlE pF3DdlJ%:5(2($Ĉ2!ΐ%̅lCॉƞĆ;f)vJ]:B.@Bhm:j-@Bh[ht,V ̰`ntY7Vl*+JFSr#iX+tNrtndR: 7Es9@E}eؐ@2*tXւ']fÆI7İ32lhtV]f-Œ.ìOe !2 `xՊ%]p'3BFASţ׻%氧]tX$F I.˖IW uok;-7r#]dvmQ#+EH*.Zrn4ezCۺ"@+aaTjw%Co AQ}X\'ytQ=X{/Kmht;l]F 0@n@bK Y[Xs[?)!Gz2CLyS`~h=o/RDr8 8.:j#s(K|Z<Ӹ":zֺguaSM;{C5Mdh5Ů5bW|"Bf|ѳ`E ьe"8C&=Fym2e ߚif06o7ۥ׆ꡚp{P-qɨߏVף|?  VzpMą׽R-zGxExVC%m<{"&;RhR$!l sdWu|mn,G}^?nw/x]4-~73va!u۔yh$.iG"9tZ FlLoU~eqvgVz {o0u䆽6o AaaMRՆM/*vɵ1[%¿QQ6iwXn{z.F]l l"M jCђ2{OgCr&5)F\.IĘ)63ϚL)JZ]nK$Ʀ0%5wxխe$/ɡIx֤H{6佂pD:.l4HhZI(Hs Cvv8 I$!pQ a[dŖ8;jUĪ"VXV` T{OLBHuKh$LQrLާ8%V),)Pĩh$Oզ2},MX=yƚTM~w"Jrp{v_8p;&b묑=)"XNĔX#& +9ԙOrd"' )RHB</bR`V:)`=|dbd."\HG(RƢx`i{emrБ@0X2>/:ް7iCCc++qG)~x֨}]tԵ\k 쵍͈zVua)ZŸڳ=ٶ ؾF!^eܑawg|^!ٕ^>q˙ EFu0Ľ]4,cdBIEr4R#)u1VPLP*ʇeP0[Jq=$}SF(p&??>XW+^Lg}~B 3ZJC;gz(| 䂰erAŹ?G@yY7.ksߡ. cZǝ1DZv=4= )l0)Z6 BQ+&VLAGw}2Hy@ dlOuu *-,{o2sJjBVE+JQ[^!$DwM_Kɔe(ǩQ0N'AY'8qc1ôK9l*{|)UMƷh p3YQ/ a#D0IFr&&`io󹾭NymjjI;4PU_UuuXu5]o8ub2[SޠudӚBZ:}2ZU5qؔh~4b뭹$i"&Qj.58˺ P*ݶn=pդ/ =FihݎLT[fidמ3l9? o_}A77qhި :^0V=.a>N]5͊\}^D7fCLCMF&N8ys0ԃp|?_E*Z jU1ۣ :1f0UޘOZ3/>~s3qZWJ9@\#PV77}MB6-.G>l9Z#dUo3jX`^ZƆ84@j<̉=KG(*ׯsJHشJi9DUYŮ@gux+TJ|Km%}nlg)np pFmz;>~(pVJdS2Y % NB!H`Tkkͫgٮ6SWWPvAl7_3USz>%#rߌc?2]Ԣ@֛ t}Ix#՚{lvCE"s `ä@iF|`_j-+BiZcZ[&Q3ZJ|Q=_ p']۠VAm #ڵ)&x'd!F]e4Vy(?ƻ^ z@/0ѬzP/@DnF&`&;T*7vQx0>w'V(jWF`qnd9'փ/ėq1H f&yt()WU8ƒbwVݘ8kjӤO[Gyu}YtZ^羈ydl7w8݇JkIWaut%#"%N[<|pӹ|b r h>ha.B}VL7VgĬe`.;'~7ZE}&C e{QmN8!\o7砜>uC <8n ~i,/(PyQi?'hPn3U~V< |cjzW]cH΅9 YDzOtk1p뉥Θ 2Ru73{EWs2fn6̹dp3"{ӻiO§MLrryd5q=lo|gVXЏ2F5:XƓz F4+Tt$+kSǺc ai0`B!v[XJ^栆9l0"ږaYԃܪh^uB" o."LaSD"œssYTĜ"19E)bNsSĜaE)bNsӌD1$n-R㉑aai@ -h9;.q}`Yv P -xS;IHL4EHVZ%OZ ;[N'n3H©0M 35 4XN;wvE}̄>u7IW1%/={r$Μ;[KQ$ݲ-ě)sb[iU4W6j[q.7u{ŔȢQe]RuKAp7TQ]3^P_4='5'Kzۢ}W鍷Åo߇Iv髺~]y1mnYi~TÍzW}U9} I+wj|7gidRqտtzf"=ߟ:15a\zlbh*S4#.ŭxۯ/hwkWq|_V]xv Q}x5;2~tZxΫ89!1/ /=yW*|녵1;O^hoxy#){',cEA |v?P >rst坒 6 o.'ԯu~} 9od$/ }&Ӱ6)z8yV$P_)1eBf0dZÁ*# QKh2ÀDɜ-ݴ,uo)_RS> )@@6Wg%'U3Y:?/` MoRpuUi,K!J.*U dqAUûu䶯LK].t?RtSDW6vf0 m6̍i&d+g+pK2#JJyi E@S; :0xCXuˡ^M6ll격ۡ}tA1(8 c:vH#L^hJvKi$q\tbH.Dt9D; fvH3ʘғ]W$J$ -9v X5D+Ҟ`vi6z4jI.peʖiOØv,Y]RJ0qP (R*,ZP₥|(ȼ%1NbZ>)Q=iUaZwlJa!>|r? ! 䱯)bE,"$Fh.Û3nlBN`B<"_ʘ2n s!۪G)ѽ ;ᐤ0Ԏ$JOE"c!\3%rI\R2|Sj.%c螩`D7i%ouԃ]ZM)0B J%J%d*?x+5o(޼`,6_& %$\]2\]2ABf  x6WOәr;JDdDu HX63>O=kG?iC20@<,Fw>c"=a swr][g*u}}7U[ڌԸbumݣ.y!np}5Y#d-TAq7p1ʫl7,t szN䕅 tQ}5%"ELxZ $k72F#0rT_X0:,}뿵:7QzIhA-#mpHg_̫GFAf-2HwD-)O3lj&R#2Jw12mtx 5$b'wI%B$Gh?OKITc;4]"U@m rPewFO\I ,-r4``DI K8zZ.B\J#U۟ZU8sXXlS0+W >emm-3+1%  a,-T%WUr'rݾzc[{l:wFislQ`BbSJh 9E,F!ǝo p OJ @0ƳHb}"FooV.-2"-2"-2"-VdZo_ #X L0D#)1ZF@a 0(UNG)/T5<ή_7S+mng\\{& G)&b]|T+=ˉ/T|T㪅}|7?߇6­E9&'2]SF*+?-3Oi=u+uWj2dz2c_cuf"lB yr !M4U}6v=Li Ǫ9y=Xϲth~":߬|:f^`LoRcMvK .x.H+{FQxuĹfd|jbCo=e또u䥄@b$/!VRհbMHcocUTB٢_1b#A>] \< 0zgDTNK2CDZm5{ˊ,٬m X<қ3YOĺ\q"geGw=y.u=&bbSfXRboo* ČcD%+! ZPTqg_g& hr%kLnK_09Uaz۲}vgmixk?+ܸ:+6moNle &lMm0@j4:BS#=Pxȶ0vҁV~jO ۶+e@E4T|5B *#<0$;f@LW5cp -BU}ag;+~loEaݺR.a_" n:hQc۴2if$r~^ wneecY?ڀ+jF䰍^EB^8FYҌ[|V~og1cIynKw.Ow-PEkKϊ!Xcdwi;CԦۯzDK haqxqKr9Uslg'xѻM;瓏(s5M>Ʀ EGjx=hl$j?knD4vKMH·BRęn&:x42A?a lvd[q07Bl;d s%3lddcx+FtG 1;XoMuS4g.ͳXT ՖbfBa)z`@*7$)ZsAr! !la)@rVL鄒sE1\b=8r2քI''.*j+PjҕGd0E=1_b CAN,{@eaRS: oZH)u,1s|I|=_]UA}ÉٗϽUF)+ !7 sʙyh ivi2ELwJՔ D $J% Zm:3M:ODž ̕RD%i3r!5ҙrǧICi9tJWr<6)yyS^|LL5ώ)0γ "(MX4PHHCBW+Y4(FfA+b8><};ho./ݸ]M [MX8#jZZ?bc\H^D,OH ;WYdg M/|1gkԍ:ym}U}yh{h Aef"qM'Ԧ/IŶn#ʱ=~RI2ʒ%U}Il$q9ÇVŲrQf [c5@ 7 7 ž >қ6o'Qgx_M{>Q(httl b1E1D!#'R)$XkmCߒjbe[3.rinwz"s/- ?Y7qZ]͔*N6/ӑJ3-/꙾ii{v@m}4̓wH c(c.LT1wZ~10431Yuʎ;VQ툶Vf\m'u'C'N,yiA1 Zc]#+gV`֊E>J92d1cUsQ;(]W?Zjo%-2 xӏ>?m+ts\m_b-ׇHVڲkAʋ?>~_˹[%Զ紕j۸B>c`K&oy쭻0@4&3K<%BP R4"+%^ҏd)̪EP}&ud !HeRi-YqQ6aDukB"E>$zeeٲœA( EЄaʑDB3yH Tl3cS]06qs}ak>%=ͅQ/CʶyQTD0H" D)414HQ!=fS kP!Ѐ8,DtT. HgCmd:yӥd7j.fK{>k[);"2oBK.׋l``]AZȫiNm#kGEAZ8Ne`r#@S*T o= >EV2L8䨒|6E7@:ߎl!}{zԇՓ=А]WQBFTHbHґT2GC0qCvoW҈T.S/〓=rvv\y߾kv qyӾo1TNbBPA(0>+F\E'﷑)0X,\16?@'LC?uꀐxDcgGJ60dLhN 5Ψ&(gR $X2YTq isǤSG7O&7\ #ʑl:81cq ӷ;95r:~PGl+$#'P3l&X 8 _>W9\˧ BC>pQo*&굘ZL偰Vh3-jg!ސסY$TjMycq2\^ͼX#ezqcڷ̦,YL JeidФ%*\FBCD܌Y^:{{6v@(O%l"jo~Y<;ꉶyӅ5NO,̻W:b0̵EEL鏩@ |<),~{{{:ڢfm|n/ZsQPufٜDLQLzIE%aܠ]IFK6'7]H]NS93G6j+6WE\bթm9KSҡZ!,su69M-TyJ_YlZ[C5ٞ TP$LdˆYYwcI0"%~N㹘rkM3[0h>_ɶѺ+yŹ{`Q-t4nftVLn&ʸܯ7voǸq;6}8%-3=껱dSvy,9b=.~_(jWiMso-D7f=o|O6GiŢa=[x O?Q ]ݞy;'P Un9pͶeyVP* D&W9 k0Η):Բ}N|wĥe؝ih8ٲqzX;37ht{eocgCUG {Nw6#{@*sEf a|a|/tZf?`e1Î8+@VEeyuFnnRuh[&W~Cޥ%`T:+@ UͅJXȡN_ M˞hb5ioa"y}x)1^R1;y,3TysMp)n^Ǥ}6*:ubK~G.6+Ɯi; :WBXAOt=1R:t JH $Jǀ*eQqcb{6iB 4R GPizFM3p%&8e%H*m^څU MӃyN{}׫ሯ|L>&%??Ck@_Dq@ZeY6 ,ՄL늂^8kYZpZlpO#ʄ }P>< x X[I5%FT'\RY`[-moTIy˻kJda5kA3V(b!b&aX3hH(gLۓiX!+u2*Ӗ!ӖamSr:7lϲ"*.ٞ;{lI/؀0Ku$uGJ{F, :cJY=+gV=^.dRJ$#fXs)"bIB&r|^7y 6XlCW] u0Zw%8?EENmSViEW]û-rNՎp#>p#9Fa[BD68rYəzh#16G$EﳉKFvA0?T'2s~SYKEPH$!XXLpaĨ`w`{q(kfY_%sU {twtbY gqeYkSܾV7P;'/rNdnLoOzR HD85v)c}E crd(0:+Q:NZICqǧY.S|͠(1WHGN9Sp|&sxo1͹$Ie*FCJ}&[1/;Qha'8EҊ:J*GHBHjHDmX\Ӂ3}aw]crd.Hq$fP\Mρᰫh88k"^6hܦU9p83յuJ2Gߋ6`%jqΪ't'znZԵ˸t B< [ |׿2seeԩdzBShIzl0u^ Gl<[(8~R7}{çKul?˷o# '"Usfqwr>UgÖy\N'KS%D"P$Q5 >N^zUZBy',rSöl9xO#Rˆ()êS)r)QG}Gah5 WD$"0BKp8DTɰBA7a>}(%ջ65@L]0fUl h.%Ujziwz" Gq*~pU]P=4-j%}*rWE} UecΒ3md?½Cd<ۻ6^ocDޥu 9,O1v!I5Ddةa}}DO'[-@X",\!9dGWgښƕj+S'RHهe'qr.缸@9E-)m-ɠ [x4&}׍⥒Yqv)-|rx<殺{[߷vNLyD]~o) 4CG޷@礣ۼPmO['i?7$uNyߠ$&a~H,,n_ɳ\t˄gg JfۖdC*x ^zE {4Gyd J}tMfxWo3WG9toh%"|1aL3#ץfD(ouD )L0ZLd6p(D+\ka1ۃ]#}!H,R,8϶YdGk kPF[ye`i`+`F mr6MG[)rF's*`^DdugYEL1YS}U|'Qk&BoNXC@&SP yTujY HޟT$?247 . CX`y4rj&|[S_~$tX<"wuF\ְ4*2@?, SD`$4d}y@接.`.󼷣 .FWI!p ,gL,|?8-~Wrm'ļ2s6D@P뺮, Ȥ3p@v)zU^1V@K 9ͳ=޷u{yJ( k d *̫0¼O%zBX0CYfDy/0Lm*ԫPB %z ;Ӽ^yF/H WsUW!8-'6gCF=f̡( tG]vUhw{f;&/`#m) ~ a| z8Bc_>Q 4V !P9C]]459]0꘺0T /PbB5|qy~`ȞQX& W< ~Hטt#^H|nF&QQD(8NҰί8jQ.4\{2WV><fƬ6og);1WIܚ-ѿDmi̽R |@]$G+a'H^Qq״H,3tu@9P@O d1J&]^=j*,N-ԩEIpjbS0\F05۴0K/k]ſr8;Nb(M-|F[g4)Juʁ!tP`=eUa)4%䆦sw>ñ+\۵ sMYegh9/cU\6C~umCU^B;w᧮ KYWr"lSwC[嫲ēd5K_*ދOzu u훦a؄Ch؞Pxv l\EEz]%i+5E5 ur%<϶=, Kxd륻ZQIxݺ(«"!JS0jNcUEћQKhU+rVJRYRXb5*rJSSQqNhw5*I PK] >lˤ40( l]<3-S o2WVQzֲshe 6% zo(yO`}hQj擟J;׿y*I0ѣ`f,{V(|q%VH$>uT]Binh.cFZ$Kg/ϴ*iQxZJOL=+cU{DEŲjUVdWߪ6Oi3jEۧYC^:[5΢VdXf,' ,͵Mjc H"7-3=Շw*"Dy[i_o(ř í` _`kxPJ]nyvǓ<=g[lttAy@4Œ-q[0O#E/Dsz$EW Ą!wBE |&~u2~ՅǃM}+f& } ѫ2.˳hWnx^ETMq7!Ͳnw-|*3'I Ӗ,vOcvW c3/|)VYB䅳P` P:]>Dr_5-8vaè"uK^`aS.|VEp\g%D4%z/˦%gFoQ,q+NGEyUD%I|{DsUcn{Ʋ$Ѱ,ʹ%ky"Q2o&HLi6aq$B4)IJ%ITĥJ$J$J$^$̉$*I:gJXDI$QI$QIN$q%I|FI$QI$QI+͕$$ OPD$*I$>D!*5V_f m>y$r|beV`2j3۾y>J(ZYse[ Bʸ%'ep&;5|[b} r.SGyi2⯭~WMit˚F0tV,ڎm.]C<3D< khk=ǴZP;m`3ڃ{yj18?ks=$Il){|Oe#9>a0s2HoYs }JSTׅVM9T{ϞNϱ]=XǸo΋+4[m5$k?6;6TbNDޑLaX$ X"{;_"afx@Ƅos#aiwPiQ&΀𴌠N\+P狋nкYCJl(sQjpAN0.YwF 8%IgOϛ .hO͐XA$gʢG;0]\ ii\`y$-bo v.δʢ z4`2&es!`" `pgċ7K}I]ӡL_w/N nlL6Iq}M@(N ߤv7Z8 Oz<mw9/x}`_oVF(2h~~@X}ΐW1 \ٹ#G9 D'+|Sd^l*R2 wpWV 6> j,|;9xRu\JM(I(9wU%CFjB[72xm1E9ᚇM?nYt][յ0~>?bo54 L фΓ$(X4fM"cQ/>716ܾh!e?`h:Jah&%sp(8HCl";.8{OIrUk+*\8Dky+$GsN?'#Bwpy(a2 t{!I4ⳤftV|GwR>tfNx\Li8̝|Gar#&?49fqk}j+T| '@ 6$BѢ%AC-m޽lllsOݭ~>z/uW*c=6" 9CՃr6vyHvb ; n~91L`{E9&4fZ:pDi |s)6}op4:R+INWmp]GN\!$XTwdiҜ|WO)K|+奰K}aCd6*Y_ JofׁLSUK.’ tek]1Ov媀GY )u:+bXYO^(AFGS:~yD,̧DõǎzpK CάHnՆv#"Q,yQ 5Ԋwb(Wjo_Je:5@c@SE^+M7 =`d9;ؾHj;jNCn>%1H\&>%^RoU.l^(^ F<) ̔Vh * % (ϳ>p hiKOs]ΞJg^=-D9_\aA|XJ%c% F+s&TJ/xvHK AYC@D^v "ȄU^*f(&DVEJ3UGJS^.)"WUy%@z`UF!(T0k6]P9M mVpfmf)^9"So ? se`nC?Ez,?[tz3*31C:B/^\2KIa^y{"PY'\Z)qfD@ݧ U.Q.4`_2c@$Km&WbkrTMkK2UJԑL*!sy+ +tYDPP @m3{|9ׁJXr$FRXIx<.'֪JӒ˾Zu&~F~Iir`%Zt1W-<FSnpqvX3ctVƑ]` P^#]wz?6Z($="eXE}7y&+>Mt\fTN]Rdm3P)d0 FWPrE:IpRON;*#/LR}E47P%Ж",@}\H)gP,=9r5^(J 1^ IcCa*LlZ(R\9LRt`0 Vn7}^&Sx>E£$50,g8ۑ -ɰ42%L&N@.V 4r_>d7Фz"-̊!$hsAOYB|_l~h=;35J@ ` d29h—m#,@@cO:ӈ`Um⭷t.3,}Rus[f ěaYXj)R>7mki,VC $,oC_ZZAjG?hّ /PtR%)\e,(8[ftw1TjHWաU`M m|偘h QȾ) S ;8S:EXHpa3ƞ8(T" }U%#xفW`)?!7 2CwJU hP09UBmL.`0J?v7aVNY"HShPީ~|Aax (P_A2+=@6BkB_Y'"5 Erqg:-Oz;YmX2D:6R Yܦ(9U0V6 e`qb0]'eP <)G:;Xt eHfr!؜s& k)#pxxtW92v4<|O(Sl ^K/{L7JAP#it!}o@CF/BfCzCdYi( r!z`wWĊ6AzN_(*RܺvH)Kt`BQD 8 b`☹T 0M cr K2W hlN*FtZA9 :x{`az%6y{U=#RVRs!tk " )P:x2I z!]0 eZɛt6zH8L߱C<~[_D 6]ft\1CcE0_Gsbu@8ISLjDr?!b 5Mlh #O ^lGkn?x?dscۅ8$s?i?-mFmϝB+fpyuo6F4oD.#},Q1RDftezw3:m| G\2=2mVaL ]s.<"Gܸ $;yRQS%7IQR6!DXJW/~.3w'eHx=-{FEd+HLUEFsDbqMFU$&ůiF^`EPb:y @< ʡ35W^M`W4i7˨ `1%" CQDGBPa),da>0.!b#-d5DxIoW"9|3{O7(Zb ;~ lf-^Ј+!fOa{̯9;ߓzXIO<:Sqؿٟ_:Ytunϑu=9'=؞vslW"eGo?|?{ƘvpX`&"6!Oze`cȡx|ۘNHVF@< *Ll B/d'Ua=`A:BAs+ o@h0]mPE( DE cEtY:>Ӷs>2">d6bMct~(\_/P~8+u409m)?#gSf5r<;r886 6<.?!ebdX%܎ϩ;_;BLR̃$ {GAu1nIɍ~u:1_E?-_oMl%kOV=StYfd<1qSk=<~wR1-i6f9O]4[w!~F :iO*١ۡtۉ11F{1{$V[ km% Jױ$rmȸ?j\o'ӠDH)yǸM`t.R:Y,_Q?dq .ạ-IO Vl%K:<pCo%%yL m,X6γ<~zbCbQ<fG!ݦo·ӓV^W]: 3Ǜa/ÛMPHv\6 V:TW# =ϊ>\ (!=Id" 09fPUIŤ|%HŔ4OiJ|Ŕ#xo3ob[8]UL7n(@ɦ~$PyXL t4SnTl-ldR1%3C!!TdqběADܭeQ N"~$Ґ` j o\a6)*1@0:my1Be@nRLW9]AE݋SлTiǍeG ]Q`hWp߻փ<,IIX< x@rz&G,C Nk6@B̰~|K{=d`a,^ :ćYT{i>R@A-cMhgS &ľSEHIR 6E־֙*xxdIS/ 3g%-LP#扦ʲ*˟,ϲ-O2:Wb`/dPͤ}k1;c_%>4×WxY(?RXzxeC#d-:L. CG^tU9}u*u<(EoOq^Ĝ`/(72*mgv6-6}zW:K',.d\).O=Un@z=+ijo`5X,R*gf3XeJI?}e>]L?sMW[8s30 |ȏtALXbY`cE5 vsU@C٣*| R%4͇$lSz7SXþj1&hD\S!S"EjwhߴFu`Н/)HpJL=en~YA)JeR;HI%;eȮŪZCޥ4cYQRP9S>z>՛zk~ziƼhyA$֚zhOoyC/7rzTuQ}q7xnF:l3+}Op}Uȷ L>|Sʝ" 0āZRRl<=2T=|K/ۏY'tkw]/pUm&p KKEhڋJ$I=9Ď0I%AИ@@[H p!PVAD 8z=(EF.hHzJ2^$ P0B\9LR`0 Vn7}^Qx>E£$50,g8ۑ -ɰ42%L&N@.V 4r_>d7Фz"-̊!$hsAOYB|_l~h=;35J@ ` eW&|&04 4#e* oa) KIXoD,.'^o{ ꈴ̓>VY;rjC*$_+Xٌ.FӁjA ?J:41*u2l M"Қ<a9ww>:exa2v'3ߝw AKpn6L~gs8J$uᱯd ۝/;̀<'D|Uf$@pRiJY&J,F wǁw&8Jv)KC ;x;/( u+AfwS(Ѧ8BhMrpV!$x_F(@A6 CǴ Cs'v4 K杀RfP!2T %Jf9*x&x,Nl넑Sy!P"g;HgZ i,ޞS8$sDa ??w*'PG)ea˂cEr)F`\6j$.D2ޱhh?^lPo,k:47C2$T\x݀Xf:=\ ճZE*[R0eNL(²|GA L3w*)~,[.Dy PjWňN{AK?#ǒ4A7}"zϴSl^8LU#3\ځg{D\ ]Jj΂@z;nMTd!63C/W&9B4^/PLR 23yC`FOp3 [ ;vϒt`SѦkތnp4yhfhB'iA'Dl{DiCۚ vd{d =1hg{Bnupx|2-aPgt?_ .._4K42L-})V4 L ^EhJh=?j7:@2rC׎\\sqo sw9<.:fw$e)#dIa@WY8r.\ ›Rm#Bx)-0y/r >D&`LH$x.Zfh:;Жȷ bp<|5mjqLE#vbg0v_ b=8Ohh>p+7BEǣ4NCxƁ}A z;E@?-pTlxMHAO@^Xʫd_z ) g.2WO* \={\HIR'V6 b^"Hz 4D ǷM#_C?j-tBE'-y*ԕCgSk"6"h~y3Q@3Ob:KDz<OBPa),da>0.!b#-dQGDxIo4W";|3{O7(Zb ;~ lf-^Ј+!fOa{~XtsCW~ JNDÓb ;>&mL%ǥcvgzN:5Og&>[,狳n۴8oV;N2hC2C=`cLd8,jJF ]gf=01AVP).<@mLhId)ăB#H}qG|7JXr6+1p/X9$#8G͞b SeP0AZ00A ZD{3m;=##BcH+<`#8 9OMg551mbXRoU&#z[Ĕ|M\D)4`A{ OqȺx5})sWħ"#IQ?o+r_ A/g0~r_]dN̗Ow[&DB$%Hϸ !F@%OLܔZ(T̶'Eͮiutq͙ .~jZۉJޅt~;4gnp}~mHOy9|0&p&R?bA`{ʆ{?0u,:*f<3n4e'hJy3 wӾq3} Nkocc1Yb\c漀KhKīv[ \P9[`Y[ޯ Qn _\!Ď=!(7tybm$6B%aM_&}ͼ;Br[l"P 0#A~5!Z%kA/00+N<:,i5 rW' ,ĿO4h,c9hܖxH80m3`C4%:'p$K7tvV#G  ĉPCə L?iЧ^/,Td,8pJ;?h0$nOҠvrq`cD&Ҝvi^΍Sf&p'j} 5xkzs+=rflUm}1ѥ]8?^%p5z˵ܪom8kVe>Xc snL[ &W}+Sp" STa*mEW^a=;==k Nb?n)Zf|;lrŒμ7uY#(\ƌGs^dpkNp4L:XHL%s0}?wۯ5|'3g.˜7;jYv vY,wHkWܵTh*pr~ڦ' o*Xy@I?AivO/wPXLs`AnpkMö4-in7iX4c61) j. 3غ7jAmY0r1XT0*4FmP`54AK`Țr͈/3"i[q"JEYނC߂COm6m"<|~vrb6e[bnw-woZ7-d윷ON9-bdۜivOOgۋu9͔il0gϮ 4%% |W /!"/~̫(5cJG`(N$38(1hVTj6@B̰~|1zBɦpk|^fyƦxE&FtQ%Vl,'/Q dOȿ[+BY+'e]5{?3}e ,q6֣|K!a4W.1Mtp$q_z@TҠ_jpL_ i6r:fc1XbMsơf.3G`Q ;6ȏtNYMkp^xvRLO + +`&7MR7f(n*:@Rg Ag v n_49]/Vb3 ŝ&ľc: ux^ʕa"QRu ȕYwdhu 8+yJe>b^,{ګ(z~n,ύ&X Y)l3iߚdXW=u>)vʆUbԒMx0( KQ rbWyH*4ޞh0 R+L9^PnehUvZ %m %< .@|q.;TͻNm8nѨ"m9~2kcJ}m8ZUR5Κ a3RlFo'at15_nlܮ0}L±M:ʠKc&,g\ +Esmt, UrJhQkQ z_?ᔽtW9fҖ Fh6@S"Ejw؍<ڨ s%2R#\tK+[&{HUvJÓVKvʘ#yX~kQzXqUyL)tZ=`@M}R5Oz=4c^t0RMbF_7T2z#'GHQ]k 7Zn>݌t؄gRW)>(ZoA KWYȧ =ڄ gC}Na<-=FWq2as5vyȱ"':U8cu|;x_Jh{O fap _C8 ّꁷyUxl}A(_hc|Eu%H/𺍶h6`{E9&4+]3WX'Jkd+L{s,6&N! J,!sxzU[s18s[kX YkZ[mP̫%RXWsڇ6DV}`nfׁLSUK.’ TPHʂ4=bUmStVaLԬ'/ˠKOf) a?<0"HSXOcv= W B_8Ivi!zEgV$jC;EH.$0fkqGR+¯>'@lYxBʷ/2  W1q)"&'l@{\2G}uv 4| y ai^77MB},vUqp+bhʅV| ū;(6t"%$BSPM(IGyVxϗGH[xk_uW8zE`9\η^o!ZB_kbW*x5,mW6_+7R`|Eo"Xv&̈́M2Z=D!i`~ |LE!5lbbBDjU4}\u4q2"yY5^W+ )ϨXeҍB lۤfaqa2#zI=ea#"lZ̜*8JK,Z]Wo3Z*$(cgiE<MV^Hm2r9kRdm35G%-vgv: qR=Zz!_INIQ-I݊Re(WR**_MZhN !i JyAB[k{j}mzEh-1dBK͠?0]ܴAütAT]Nb^c7q]hzU{o&)'$~5Hܼw |hIn>/Gz7賳vG"]*gGN-u=8pHD{|hLQه]&TweN!`:!ZHpT%3dOU4kTDRxUtv[+F<%xɀ|ȵ(+9u۴@-r|? $qn=Ib4~$>gFݪ;gb0"O>H}xFCE<B[( d(TmHtƽstͩYG;*[%N@tch#(Őm0HS{ Bmy8mt #iSYM9BD6=vʑ\,y 0#cX=K8朡4uJ[H}D8\I^O|ϦE/K"R{L%¸ zMT>7{!^lWP5T vwy6H+ GKZe*kSaZ':!0YQhN6HoőnjK@yIj!ɎlsqkaL(~J>HQ&+i*hcQ翧\ڻIe/Up)u^Kq!U4LBtuJdOH, ҠOB4 mZVW` =ݽArln=+vNJB;7(* sF7rd$eovc+Ƒp r, lWxD֠]ZAњeWBBz6$㝈<-dR L{{quDRكT݇ϴG9{bUN)ӐDb e \Ck:H]ϒ|xC3{@,-!:; [v^_Rj=RsUHHyJF R2&2 c@)HiP9B"υԌ5Ϩ.i LF/Qd# D܇qĢ4g֥x'>GwaSQ|J'ڐ?qTޯ;4)l3K8Pԙ8/+7I}cY`EsN[ 5.Ϭgxrߖ _pO%-_Y6rxb?ߙTy0 v =gbx7VƏ>!c1(wJ:D͢Oz%S0xL>na 4B角s6XāߗHyr~Tx.F^?bc壊aԷ0XRouĜU|Xk2ǖݬ6[Shƴr:mYF}l5.}]iƁʴ )˧LGs(9հ\1Yh+H൚fTU [p"0Vj<֡~.uh^;*ԨO- j@|^;T_K6t(`% zM՝ ainL}~XxfBO.!A-'m,-5ef@քc5;ь2[4I$iMH,I"6WM CKhWU1s3GK7*8|M"}\ETOhwVDAX<:\*Kz]Ue@wK5ZJ溒ATDPA0e6lRCK*hcΑ5s4%'it|hٷI,bYIqW4D¤6, nC},ϔ [O~3jDF?KX-OaE:dfmF{ j2xrLrrJy-M j&]P>t$ ԑRN~Xd8d jW})U Ȑ!f@Mj s3M]B|ҽ@.5æ7aS4E\k7?gzomo<ֽ4 5?^-g'qO4؂As)'"LIYvshMj>=rcbקJt[5Umٕ?F8Q]uw:fz=~dIv#wBO E̼@ 6ޝ *9,vsdAJN8(ecbK.tvx=tRZbRNCs;\tnj& ^*J_'ߪ!?m4T*nF5MF{ժVu0ij>ں]QܝRrc {G6w_5rZ>m$U=[fNgz ""2F <h*$0 G(V9@B</M+\OȮFgCd xKe)CbR,1߅\$0ĉX̻^sԹ5YwYbo~E|y˺&Խi0.;=f7`ڽunǮ:vnΐ;.6_XQ`m?v߱~Knr%%#Aо F}sѨ35t:WXx5 i;mܭz6p ;+*\B|)/P tcvg?!ꚣan$:c '_օě8qxy1K>_p+>6?hͩ+A`@ax"҇,puč1?1-,Hho0R!Rm*=.`r8wdb3cOB`Xpb #g2Gf{D0 ^&YEP452 dV+pZb[/⠸B:ϓ.7hc`B2>, 3ma o%DD͸`dc%@B( DQ6Խ JMт ̉ |BE|2|ן=GҌ۶vr%"̌:ul o0ї 'D_7izj?rN-1!LTm=`o0X[@YIOV1/ Cz.E6xF#71K5 x='B*%lw, j!~]nG*F[,ĺ]qU{ƆͲ$*Hsde  hKϙnIF&2< &I?oG UzmOa1#6.h0}0gj-ǣ,kف7.n‚ɢ7QWc. f~עjB$<ʨ{znj)jxWЙ^07 >:p,єA@QO 's6 /Ԋ"Մ-/ aF|U[]_ܽj&|o ]A&{H ̌ waS){;x-ӹi!aL{l}AZ[?W䵽gk.z/mn(3$;5_rӄ7Q=r ^e\p2$מ"]Q?)5t*orq990DxzA=VSIVGfK^ eRy ti{TԗgW/#WxH]gh k1aH`_E9"8=oM`7OX`2&Z?Ec _SR Y\΀1[0H3 Y*x8'C7 VӨ[.˗ʱK[wtw#6\p ,=Y35'{TF}e2mM{r-؅': 0]{g œ Y/ Uk|mK&>3Ɲ&}{ٿfX^\8*ѰrWg}#n-&| QMt(/D 1icFO+.JP85gfAfvrq6(j]c}#8]<pqifWJKaW0҂@pC~.x$MFٷ3pNKD!ObNҪ7Ŋ,Jdf2Ž%j P3EsGW1T3ђ4v9ApI9+)dGT0Bp #Ѓ+pd7.peApeq …7p^h'{Nv萰<>Ձ-VmSr{QZ t_k.Nmve^EH^H˕oX%||gwܼuqcZó($xGKwS0@,ӯ;O矾\`p\9\|UB.R+[;mŠOM8X[ܪLl|R i>b`UL;}6;Gy-rw3Ŋ }*>{n˥xQn}3oyC|:S:s U?Ok/'ק_.}9n!_'>A2ZW -. W . :x+~""_?Wi~>7Sq[>/q3~9tƿs%.(^0t/rc/˃3x {xV5;<.~⴩7fWq_pv vf <]*,>x{%jگ߳!hՠr~q)oumHX(_[8ju-FTQQ<:UP|CKNqxE&9˵ UvذMh]>3.Nk'Cq-D^-"MWG kuy 4Zqi-[f`Kv(RDL>ы戗鶮ȭr2Y{|ȻRM b΋(5nJ[s^(ϢAW;wVBiE$ pC8暧 orWy,‡6=vt:XxWHGbf\F7{F<Օ拨y L8cm[#ŵ8pGYGVq 'ZJ.AO 0܌1G`7L>]< ;n &=N"exc;.Ti-8z%n<< )v5-O9a/|׻RyP2Rn?fyZi 1`^싫r͆UٸLZ9h ?ShRV /|"B,oWc0y"W,҂5,iy^Ț37`āhUU-b/>eM4#ںO,!a[īz2eQS7r??>KBavC!wӢiXs\bM=x =uՅi]|LUV *SqL]2tQ<*,YQ@sUj@D'dR!Np %i95q+lk(/SݓVqZ"U6QyULk ohi)jZ[&.w,,R/퇆tTA\,PH;1^uh*mS-vA{MRVE|6۶6?I y"-~#w[z-GAwq7vw OψؼAPfw,8:9tQQ[ $Dp$RSjSX -N>R2eQ !ZlIBuO%R^0 {`,VUviX5J>%VZ(^Syp[0fc+e:Bl.(:Xw:W8?ttډv?|'xE?nn=#<᮴{ӑ|3M-huIpu3M4ݨv,ݻ4O:E ؊⎴MPP.4u3Ji7EGA7otiPDi7+{yX/q|Yu"y} B,j֐> i}ևoەy}ixA2ȶs̛{ˇrIx /ʂWJ=wj7(obXK V~S1?$^y1.R8=Li-d_SƧ!h1e ?i*Q]BmքEUFf#Kc}Bf&!tMT",aKEX*RT",aKEX*RT",aKEX*RT",aKEX*RT",aKEX*RT",aKEXj #u{Ϲtgfb߳ IOqCfۉF$$J_?tz)quT|RMAEMQu,ۧ5c8:UΩe|*uJGr6+UCx[I[_r-_cQwmp53U38eM XMpHCnD")H1D!R bC")H1D!R bC")H1D!R bC")H1D!R bC")H1D!R bC")H1D!R bOX *f:oږ95pLXXFȗ;`!Q*}V3beKKPƷi]6 BW&~(rhEӬ^!qzf2{ ̗l:X2oHNe+S:~,/ݓVq^"$EQfbTQ,q|rϡyv\&ފ:d_<)\ _Yؤ__6% 5!k _jՋ0_y<+rS`>ގk{ܪ#mpDZѥ3ӎ4>;Rt&uTu8/Eԡ8Ru&]<~t.Ҕ+]פJSpvwotXQް8KJ[:N0-:5 z+E"JӎTfyC3j]i.G>JnW+H#xHc!in;$ֻ1vo6^;zzzzzzzzzzzzzzzzzzzzzzzWyRsB?2\7}a.]˷ 4bӵ=7麡e2|7g U^ǵ,(s6Y*.\e^^q=YH-n6DEJ@Z!qgn2fxH 2V`҂7t:2.(eF@^eN+H[kA!0 /$DˊƦRvE#Ҽ.X'_dhNl&YƆy_g?]ݚ?mePu}߰_q=nX8 ?k(k4A?uRNFDRgfjߕ,K `x|KqkA[ɢh;ۢqӘOW&Aі*gXNUkf5Ԛ*jf!}\[V)ʕ*mon:0Ag}ȋG^ң[QҶwKF#v.~I\HI'h+ulآW⣊ M/,aj!Dgپz*UkRpII$^ɖU>+"eZtѼE/?( trNqqե_Uw9j޾z6)%.2fLu=mX}G|7ifH⣊Є]K6lӯRrQEHUdqV6ڌ 'G)/#V6l1JrQE2|0՛jr?((O(S3K369qjK}{ӗg߾+g]Q ?j lצOixO "H+n EzM[`![ ( 4Q3M[ e![ W7v-zV ?mzwټ)a4.>kq٧ F:}yWw~Y~+dSզjÉjCKO զgZ }:t%m#djoCn+7Ժ2nzO 'H><션~Val^kgVPe$I8TsswRD7no$a: QJՈ V.0NeNomant{- h*wNm!PDԮo;Ud:ڶҵk(ήL_]G"úzԨ5tkT3ЈHhHhHhHhHhHhHhHhHhHhHhHhHhHhHhHhHhHhHhHhHh ͑ -G@!s.x <ߠ^,8` . <ӏx?1A\Q:12Pg0g*qPtj&븵ԤöljyXgv jn @븰lZfÆ{YFR 6< dzϫ2cT^YƌPQ+yq~''߹a}#[ _ZijsH],,F sʴBE`K$[|YOtފ Fk7M[ֈlkcut5bk[Z"El-bk[Z"El-bk[Z"El-bk[Z"El-bk[Z"El-bk[Z"uaaD \GE#.q?CǴ}'TBf7pd:q6MLfpǵz m y( zz8Z&*l<23C ʋAi-YXf/K'2jT6(XQIj2 .(eN@^N+H\{" T_*D&ZV8oiш5/r+I N݉$kXЕ4ц>aHgSۯ#MzZA}hkn:Ŭ= N ҰV9+t:4eW=^hģA:xAV(Θ`FG4fUnS=(-s& fTRkf4{m>vR+U]%r{Vv:LٺCxlQ ;ݛ{iҜDQ+4dM4<*֝,>jN/,a$ޗ_jvIA^2I5W@{)?#gngK[j}VNEZ8wSujГ,'To ?&*єl늁Fͭ,>^F%p!Mw[MIr`QCv4i~*-,>jnwl65en5MR-LIJkH{bW J)$iv!7.7ėP3!ziNűW ~JdV .4"VRV*_gc8K2ؕ*_J5RuKVqb+qWdo$0C8 2ֿbۭ)KGi:\|V5j>qq$sdSawO Ov?ՖI%&2sW(~>%Ёq`5asVJ>(Foۇ3Btq fk5 8`l͟`Aw$ [չFXf!` -Vm^yF<1ms;:^j,!e|WC*ou1. ӢS} P]qѥF !磴Qsu9ÇJĎG>54wSwdenvvA1#x5sd_T]bST i*Z,-}] VKc(@ FiXC"5D!b kXC"5D!b kXC"5D!b kXC"5D!b kXC"5D!b kXC"5D) Rs :o8yal2O8L yQY \/ptx52^ʹf=Ws<߳jx5ǧ>}LmvX5DͤQ6kLSEi# }i!20Ձn6! amkCXֆ6! amkCXֆ6! amkCXֆ6! amkCXֆ6! amkCXֆ6! amkCX#aزB,01-Fqby&#kO_a[wpi:4a3M.A a3,ӇC!CuADnjmEʵ|Gty L XmnCnl{ɐ m%1D^zTbz\0 AucLKd\D62WQD$UewA#SоRd Mڕ~jgE~my[rS[ w4FX>H2CxԄC&P,pC xsmh|LOB =PX#v~>% Βi!20!HQZX:Ė! LB6 C0;"3c׈#&#0V_+1a'-Iq/6>5O5c"xpUzu caYt 2F׀٦2!c -2ߋ=p5 _+rߐouuVh u*_kc@5&l] vKcK rh\Oܕ/zoHCsCb;9!vsCb;9!vsCb;9!vsCb;9!vsCb;9!vsCb;ع`b6aRs9e~|;&ad^evD lËsX (g@+]㠑q3edЍ8Rb%lQ8utgdzZFmb[Opq>50*dAmG̛td_'߹ |N6۷钂_U;.ϛB~#X,Zl˹h?LsU6ֿ()xJ\he ?)( R,(uyѶEokohWy^դ]]s:177o.tڹዄ"E((BA PP"E((BA PP"E((BA PP"E((BA PP"E((BA PP"E((BA (d8J{>#0fk?Il7i) 0Ĩ ]bS޴8WRHTnF?n$.(^g'%Pm3Y fK@| T_#Ս&s@*MJŕZ5dT WѤUQ'w||{^'yozjO0R5[_7<1]nni]5lb1wg!j A ES(PGP%h.%0'iS:"S.jiUn/ Lx(J*7IJQ<-췼`᫬bKÑAgwc}I#Zu* |ԿJxe`F6Bmn#tF6Bmn#tF6Bmn#tF6Bmn#tF6Bmn#tF6Bmnon,dm){ϹtgoǶO"$$&'vHHb'bcAx!,r顫WwwHWVŭp2ndPr8+cҫZ#+2.:yu˰o߶7¾=$*!k@?ׁk0r:V.߀&xY6~o1Tߓ,G.= Ч 8Xg)0:Wݿh+?@ăXCB³,g!< YBx³,g!< YBx³,g!< YBx³,g!< YBx³,g!< YBx³,g!< YYl_hVBkE1rLj|eId?4 +}/>Jv:z`Q @1q63V!-˸2Cb,fEӋeUE,wB. .*Wv&ǯ)2EM=ٸL`%"+z oEeF*'em`#!) bhc 1s,C-˦"5 ZC^ MJMcJw_oW+8|YW }+DBm[YwЦ`5]ɻ}WȄX\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?\?~FN#[~HL‚$ ]#oV "[ HD˺"_Vꯗ$Thhlb7Xh<0|Hh 8w73|?cVw?;ol|TQkɟ,DQ7azy)&fq"$T޻8)e7f/i@U;_zZ*L\`JO{e6EYm$"FLs16+d\PtJ gWWڇmE b2TKಃ-pӢf^ ArupSH0+i^AÎgx˰cסa&:&Djc5c6,#Ce/xz8ḛKV%1[m rqOlW:F`-HĆMyV)Qgy! XB$"H,Db! XB$"H,Db! XB$"H,Db! XB$"H,Db! XB$"H,Db! XB$"Y? Rse&l#&M<Pvb[nbb'd]|LsKfl!&k-}CL,P|YQ:sTjD'dR!Lp̆)M2AM=ٸL_g%"'z OYnEQEFʽqt{+*}(sl4p3$daBDk?t"gRϲp)۲-B]GKY1<wF#~76u,cjTQsuc좾WcuBR#UP gyݗWU~!7`{:>o` +d閩{OTNW Fco㙚EמxI;Py ZqDz0 ~OWOBK;pڽOt`(\!-DX BrC/˨ 0ݾۭ$.8.DEאnUZkVpH%ȹo/JUځ -@Gut*Tl:PK߮jpW Kʏtdx';?|6gY**gTu<۴юznRE4(t;] ARU kwqsNUzS]1Î n@ޮj!Rnw8$5g6fB&Ff'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dvBf'dv'dGbvcymÉ\Fl84#jC"4#'JN''Xy+ozi8IŽٲjw`C@o+NJWw)i0yG "TDEED6XԩܠBy Jye^C Rk,VKc+Sh6(힖tC8Np:!tC8Np:!tC8Np:!tC8Np:!tC8Np:!tC8NppuH{Ϲtgҹzv@]pMMa@c)a N1|8ߦy&1U(Zze6 jN/,a!־u-Kյ$ÕV$zKzV~Qt=IP z)?#gngK[j}VNE8wSujГ,'Ts Xh|S^^"=P#=HϕTԿhD!KW ܡ{KҘG[*X|ԓ˘2~7Dw@CӚtv}&-%wT!;ԴJV!9aW}-%wT![ݭZɴ\E+U mJO҂ַךr;T%q8Z,#%.SVtC}jP3(|I뒗XבBXm&G)оie^Oݻ:NwuwW] j)?.Y܃l2;PQ!?u匍5;$~KVR5C_o CXQey.u^%a:`u7j;|dqGCnMG=OeRm~~@N Kt`kA/r8D|s>Nf;~D㒓5V .PK.K5RqK&HsBGNE4s^ούژlckHȏmRzye S+(a&߉,NL ]@Q]AzC'$qg‹:;&Gu(֡:XP` Cu(֡:XP` Cu(֡:XP` Cu(֡:XP` Cu(֡:XP` Cu(֡:XPPOp݊?` ,^+^P vX3e&U^rOmhmJ}ȵJr+41ֿ((Pۈ Z`ܰETPbaֳZ1mX%z[wkɉ*dv-R[BEDtPo٪_kHlkTklޢ[E((giۦB(J[*bezЃ`UWAq>nB(L֞sM]rE}=ZAE%z%mZlA\5 zmmzZ>AAHMPiX*hf#&BTҭ@ټE-aج]-n08&pǩ)?, ӗg߾)B.WQe,8\{A]>-wP(ާ矔)kѧr E54ن mv%M[uCsZ-vAY@]NP `фM X4AhB˪VBTDaUޠ~hϒȀ2[dhSRƠP/h>!㓟!=yHpNNXYa{zZ7uHwh_Beivm=!cŇ56(+Fl<[J[0f[mQ+W(uBQ [@RUjrtWzUG8ÁU8 V*Xp`U8 V*Xp`U8 V*Xp`U8 V*Xp`U8 V*Xp`U8 V*XptQAA~ǽ\:j cZv ͭ8qm&GĉCp=ĦcX I*8?yi + OuK` _iq3&A1?{13'nvW›-a^@`"#\3WS)dVكlZH+ Ƌaί!MJ ;+ܓgSұK"HJ_-V&fw,Of^q- ' +BUCڐ✤zй<},ɤ刺< z'5/;*g] ˰Ëu%~?O_(C_a XɃhX+4rA]̵ B m+o1 ?eaR6_bKd8;(n %ܘL^`(' ;HGσD<x;4{![ܜCuowkܘ,| oq?AQh0[t׌W>Ba6f &¶1( ؍HbSIq3?wUD< _9 0 74m-_t q9h '̊5>1N!f~͉+7g?AK~b-iSOye! Tۘ :_ 71(->co *h/9 ?1Cѹ|wx~JA~ vS lWRx'a |OJYVt<+ʼ(TW!p[p̽j-|v}M29ߐcw<7lߩW'U{wfmA,V}džv}]i{|$l#o:w~Ka(;>ǥ Wip5G )^ ;MHz^5jo`95+L%O@1&ŚUt$BDNr2|=)BCHGM5Du6֐c:N@ q|uPB EO_L#3Y <{!oRn}er߶=imrz1Mơ./ʜ- 4ͅ(b7ŧ5(|3hƆWiВ*|ҋsWCzFk'M,1ȱm:Ċ-?FG 1tCG 1tJGq<@v3M`/|1ӤԲ51δ>O6jZrʴ^Fj^j:zrNγZnX/DϬƬ~ulcZQH?6¯Is$ 㪝 \[fn#Ty%EN^ưvr~NZv6f~o_L__^t^,^]Su5st5l[ffjg*_YRt52s5ruph[fݪaW-m!6n.m3p[* Z+Y#3<:FB/"diO0 3 ~$>8:KP{z.@ؾc:G=2S(%V9eśBGzdi{d6`=Geup7(d-6#ϱ# $6ñ2X4?0]ĮE\j|]S & WoWp+q /I?̲EAA3nT ɶvʦwum4|nթI\b5Q3.w׬.lَƾv&US&?M9=>Oqܰ^<`]Fv{EHo"4u*ĝK ҕ bH#;3l!7O\nMb mbQj}]1-.[J?uXw>ԥoDSOꞹr58տl%B|Am#[_e.-B˭X榦/ ՖGW|ڼ YZ)t̟|0ukisRJܿڂrj˯WG.d>nYLWlqYt8 6 p`oWkQtfqۏmpE"& H)+|vWef,G)'1,n-kXeu$9mgi_nV #iH8"/`7U3Z־`MJ~.Wڦ\kr- "]8frr UOt#fĆA :rKVQ8{ {%]mR,WG(IzYAOuVTo)] tc5h"5ҽ[ {62584K{=N8Mk#7_Pw;ឯ1l%жpSPØ`+؄zHW@na'ø&Sq-Z[Ӵ+y 0א(FiNͅ۷,H{aGCRugʩq1QJh? 3PK"drݒM(IdGnuYdXyc&&L6oN!u˵յlRtzk%jSh$HԔ4.pu*\ #T>Պ($lUE_Z ߉i0^rJ@4-yGqmi9,벂8[QKQS(6Ncd Qi[+*Rm|~[ee[kQCIqq57Ynv G 퇉g؞8K nLOvCEdXՒw*JQ֥/0f3V{ȇ\+L>țL~'ۢwF׽Y\ .uۥW b[/?'~Sz9-ۦ-Gc%d5Ir50yI*`LXgy")sDM e l^IG|a>^ZT{8H/U%r™ܽe8r/wmD.vEЮ v!w w} $ȱ"7qP+b1c Wh:] ŒAo'wNJ.IM1pI1Qq1Cj̍!bFmP3+&GaaK 8B,B&MgȭmmJsCM3}3Mp}oͦ2lxl[ cA-)2no{[lE~{&ߖ]c^dbk[A{ Jmۆ׬ j RGN6sۤK[Rx洕iyy/%k {<1/y"Xk̋!c^+Ƽxyhy1/WD1]Wۗ$0瞉殳ik{~ʼnDo22(as/#}#IA+s9-sV"or@8yrP3FHo&Pqg,ZaF7ef'5Mo )f=mij<ef3q np-ŇbSGiH9`N#1s0D\1n?&~9fz_8SdEj%Naam?L?e0ӏ#ӊ^BZ bЖo8W該0gSp2LJo;@63l :QzO-3mJm;X0f,bOB5…җc`'0RՐS.oX~~Vqz7MXLxPL٨>QY2']1Uc~ioKG_<c~c' bfzt6W\0.As2^gyQ9|-c)Y[ʝcZ`$1Դa8Ԥz8r)Qn4}ðMP3sr$gӁ? ނbjgN͜Y0Ӎgni>vlɦ!Z4U"LIBP&0ô֒/F Z;WY̻8a_b¡3òϊ ߰#_ E,͑| 2^WwM9_[] Ѱ 7lW|fbXÚ-n}^m~ b2= Џ,X>M%Ven1KB/elܸ&Mb[b[։mPS%3ň-oJ$ԧ-`XG%Fk&0Uj'.fx3fI7NMiVhcfLϩ8VKǚi1 SlEHXc!6VAe (MƂcJmsLܟu$ǩcN=92FըH7bT7h>)QBCp-I(TZ1Kp{w#nOע*>eHIn(훥'x,Jay uo.Fה0Hm#Zn,#Ő4&ٲ}\պpwivNv)8lL.WhͰo\4R  eᷛ˲ZY'=(}RMg`=JFoN@rHcgQ8]~l{r=TluMQt%f F4x̊o!⪈Mhqv*CѐDZQIׁj r E54_Gkz'M&+gPmYOvz`*|΃*wb1+"o]FŷgFsq?Fؓ*Gb:ª*{/q ~=L/~(ZC$tV1߯~p%(Xsm8Qd$M;XhV#b6d",ȹmh@/G0ٯG܇JdXxғ Cvb6绤;`:g2L-\DwޱK"YypOų:'frKF`(/)ij4_Kr 4ӴIKjڳmc!ZHh!iYH0i.P:xCiW]̣0񍍲0fj?ġPH 31 A+o8r=lyr|P'7,ai9[%}gl|eD)^;h)wSL}I=!sh3,T 2BC!5OOВY)tĚm$9md66fP{g#иMY5QsU5VA.$n}-(Mpm=%DSngw5Nn`vA +vo4GZ萦Z ю:Z "]-5xi GD[. IW~Jj!Y4%ÔvTnU&pٶnRG֯!C Nj{IZŸlD2y^rqGWIm%ݧ>r?F{Qz5GisHEJxDnՖ3C=lZz'tSTSܵ tґ!w:NJU&G[Lfzo nl%Pp87߱ċ0̀z WJ6"OG1T;bRa0ƋGRA o,!E0x?Gx{hm扲[3W`vfuFA:fBr>s$1m[f|ӱ b?p`j/+}>U|}p&݇lB3Ir6 d/MB5&zX߼dLv&"u ΃sf#SsiNnRgFNڍg7}i# 6ҍiyp4H*zJacI`mS(KT y7 OE,e+fYYXdC6i_,C11vd2#qb?p|SQ7# ެK҆?s+0R{Y; ӣ2bSΠkpy=ַ2Ą& tHm Bkz>HYT?/fI/ܲYwߨ믦Y:3>=ӣ0(ÔE%j"c5khQ϶i݃\?kmĂZXPW8=Km@ !|@1 O?C#rQt~vdR3,/ag0ؾe$cJC/r3lXlJ&驀@ .O6ܛOjXQ6ܠҲg}x<(0%ōG:P c)g (Y[Py5^Ilg0 Ogka^@7X`Y]!ԄTE-O橬ҊCn,ĩ8J7f`[*W.$B$ZO !WW{F4RcO6ȆlA3ʪA#r}8Ky2 < ЈFDLW Ϧ>|x}|_jDKMZ>M*%jҖ\S+;u 6nvKRUe͢&~U_Y/$#Ye5S^U1״ s0$ia1$:BJXGFK7BVﺆߴBn6P7s`/ jzw#EIB0.4my#ќHG|:+ѶN}1WC6KRIR}óo[OkpM(;,l,;ԓ_\I,>fth:{ihB>ϓi8AL7$ }xkf8XVu0F}m$ԴԖV~7UT `>x܆j|P>:>Wڟδ|,6yu{z$;Wc&ˑ(c2/B#4 "Ȉ2[-UkQ{%4wl:Q{KвŸZC)52uرooW\ "V^bA(B9THXv/"IWZ;L$L? =/lpȍ$c%4@^jfKɇgz!0/ fl!}kѳ;Xc;}HYƴ.}t Y)v}ѳ#^j!.J$/yO;Ɇ'w@X~,V+y{Lwi`q F=#LXA`4+0Qr?};<5p#U^Oe g{j^3lgK!ki8|r k8מn|>\m6tIsW 1e̙(e^`ZN3]n<6lZLBc&nWePl>xxVSt7)4X'+/ '/r#hL|cֽM2mmh`4ˈH3aRkիxN^^u=bYwhpɽ(!Sev>ny,O͚/ajY{DIH v2Mb'69VŦO8PAުWw c[eyV 2VY^JJ o Xm[d#&0m2ˌZ*3fNݩHٲ=F#+ZV+z.雿\ޫuy?CjJűkG$ \bہm 3%#J\ l%eFKB蔿ܣIe:^),˧ܖ5N9Ǐ菫6XP{w:U:EPj 3\ogW|r.Au0TjNJ !}(`*6]X ҂PlGJ $Vj8IJ͔/"E/Gl:r'c-YbMwBP$fN`Baj*"Hy7k|T`sG."~dztF?ۖ0aR)qT!vƽy2̯sQsRѮ^]!ԄTE *{&P3Z$"؀ G} -8?ٴ<4q" Yf;"Vbq ~$]EF丶D0c{m4mLs-תI]$Z W$)ABDJK._ AoU-/OsܵsA/Jy,nxSYij<#VS7esX,!m膫]X@c8ī?=UDSĴ&Xfı) 6BvnAI[0=IԐ9pCݡ,zν@hЊ|C`§ T@^u15 dX1;AyڞDD^__) a:}\fByC95WqX|>.+,pMӨ;gmqXpΠ ˧ove4K^lq"ܫ~9F_{uv۱"`BZTʾ3ֆ ^b^Ql19ɜбċ2]1,p{>%̀^$2vcx&V#J=]`AgH@&<X?Lv|:TI< g#* {.oc4vidfdYK5<8Bg>9].&;~vp%mlGl)i3;T<u!`ϙv<7&*JQکEW]Y&_,/)GI(.MHvuvFI>ܐ]Iq_Pd~YXۮľ̍C?H QZv2 qp뷟)Ռgt^fFpvZW !?X4Ց6chR]DqL^&rLGAi$ d%"jņa~61\b"6u  01oǮK>q2oYoW#Rw3آxe'V[x-He*-%J[ VRM1.^нi 5@ad0$3tiEcPYY[ ~Ĺp O j\Wog8ŏ(g[AeiB?1=rxrG8~m+ĉӷSLiy=)-Gz-yM Ϭϖ:%U7j:k6igԞ.UOOk޼dۣ#G-LC:[ڧm -l=! (0c#E-Iℹ. }B1V$ͨcFifS2E mN͌Mk >ȼ`B_cMJ޶6eB6j Lf|-dBi4W}G pg~)3ydɹӜ-SŮQ(1/f5fMʜrJ(fl뉦 3sb{U3Fk;vF f‚v9jZ FGi6*y|NՍ_&,쏤NqRl3Қvf{& ^\i2u]G sS2rA弓eXG,\"A; F97j^BAM'G{?qwGxOb =:~>A: ܧ9s>yInjxɚoΑ)ܺ$m7ͽY "}T/yurkr-lm7ꪍq8] 鈼N_I{W1Y8,8mDQfhQ7U*zMOkt,oZv<竅kcnc3N7I1 w␁i8}ߺ%- :q4l -ό-7Z{ a? b^_^'C~MAgF)Si 6*\1; xz|3B%%Bq4 "n=<bEyGgWկ\w\!\%+{[}u[\6S_\ǵU'\DLWi|$&QJ m:}8"CXLG=-Ye=neMD%X><~n c>ZQlYnc:o]:潉; gh6qdۖ cFH ƝDt1ID,C-??{ܶ׿OScξd}]$gNsjv\ :6_ԅԍmT%JDwuyCk$[@{[<E{lti{sKL8sb Yc:-rfΡ{xǠ-"DæG0+p,qs=-{{,?}bwVb.׏_O/wsDi)>`q)!DR4`X!Hd8wc_Ҙb@ @e{rҁ#Ux[2B5px 4q*HQ%剆,3h^_H.+zoB!J\h*X%-?Eɿ;09[甙ZtS~9ܕh,2 FPgBb~$nn,-/|sΘUE[uӕ1E< |c/QXI#ik~Go=у裑5Q96f^"`~z JT4q!Wܻv>]/L猒M&Avg< "\QwOeg+s~ z]6!g[f/>yX~ъvgoCØ5 m;6Vhf${{_?Ǫ5!]{HkAPBR-B(ә3Pc2R'{ *s+87قt9c <3Xrǒ#1XG*rMa *ѱV\%Z~C%X#7~&y$C<;Y^r)b& Ych.h&P8UXAN^~+B?eʟ Z%rJå giYum^Q1k_|a|r&y泴$+8FD[3ѫPT$%b9Vv6k#Q}6)d) ֨`(ֿpq٘"̪l;3LEG)*^cK+#9SU ů}-.aaY[*_:POD?*mxQ kNfNAɾ#ln-浏~~2Ѿ9:|{$ɤ(VFo,6XLi Z7q۔Ncy-RY 9.  Mm &5-ۑ0_@:)Yzh*qkAEz,bگnoGr:17VR:H #a߁l;l`tn~a =55Ayh&vx|S:i;˱:xT׀>ғt4N5o`L1y9hbSGqw8z,;r .$?|R/8 )1>~?9rH lN,mBcAhp'GQ9y|@WMYa\35ـ״>xs1?NRxe#>T~_o9,WOX=r]M?Ϧ~ra ^P߸kr|TCܕVwKHu0wU| Is:]#IJh@}@fLQ֫{-ou*Î>lLB~ONFæd*zڛGhy|5WYް7RumB&5%[)kOf%oᔧ}wz\L=/JY}֋DV fs3)ɬw2s4ŰEW<(j{ XiҎ|Tp/oʹQM C N3%RShhC g_,& M^J J]9-] 8Ǔ P1}2- 1V*I! @X&54On]d,Hm+?Kr(+}m*D' |^9wZ3Ć dqYlTϿlvfͯ n~e8nJ!꣰RrH zA#!+T}2c"+DWysێ[3vn2͘JZǪdcP6=vc5ݨ ̳T\<:(N:I YR5DC8NOV56Z0T5A`Wm0q\l0DMjL2?l;h:^zp1B̝ {Y~9͆[mCrpch`e#ƄJyaƅI4-qU7G.iP 8;`?3+*j`/"%@N-6?gFC>Uc->E90g0 㔧Yc3UE',aZc%P$sL|z'psrQIr@̡`~\GC yDrCEp~? Ⴃ POCBI? 'ͱPo '$ԟPOvJ]r$ԟTL`P#Ma$K"$Tr2,뵙YfjB[$FITZѪn>PjP{DC7i|jvݑEElX+hRg]-OLQf!gFK"@J JIeı{NivE&2Cu2~YO reJmQЩdlu4^eu=}f uW6O+_\x` LH b_ 0ׂ@B~Cko˧qU?p`/}{}Sܛ?|镴flU_NmѦ6ER9; )RL4NbXha(h %8,&b<6Zm kn=UN4>tMfhEOB&#ҏlM۟迿h%=G9 ωyiBו`@̛:ۮg9`GE/#ah=I$Ɍٕ}*+s z]mR=_)⍳&>9,Vxo"vb8gmJzzoQ._vda* k4iBrLOcGՇI–-:ѶY0ᬗa0UX18k* rX'kDΛ/'Qų8 –mЗ~a:vnKҶ'ſ })((y|G{&9gV>jUJ$#8qB)p )J%O`y$;z=l>1>=R1Z._LY]Gu6֨vKNx-7*xH;OR8`tB8eJ hhȌic͍4˺{[H+#~NL# U&ip)gAp)ӖYo됪ӳ^A{y}|< Xyxk;[yIF6- a+MEdi E')! @y$g60|^Vb){ f1S0*:KE1#vG͆!^3$(H<+S5F9e{MT8Lת*D0$B+cl蕱%/~7S9q<$:*)!Q0eT b2A) ^{ ձ׽BKY b qE5KA8Ղ1vK^W+uTH] ~q_8 17$Ǫ4NK\'BSEDX r/](L2Kͼi@A\&P6(/ҿ 0K C _qUqbXkF"﫫 gz-{Y~9͆6i"AF5IJ)CsrJ8I~bԐU7V  g^Jt/psʳxJWE_~,fnY>3_ȳ9 yrHeT2۱w=\l[?_7Qq={牶PYw1]jO PLcDl/P#50@'-NNYQ {j |nuBhCX J]G*[B?~v>;BzP:[V ץghҤzԬQG)N1Jn{l)"i* (L1"Trı mT*Sx L|%4uJ Ҩ^=*Q 6Z'5/0p-@8I"852SgX$X8)6"s\K<~2{b.v/Yl̒z/DP} LŮbO[rO/}1AӤk7UwA=y=5 ȶ14Y&ugz丵sWSKr@}/+kD2n$H ^eʐSf2٧l>ed)OSߙRBT$uaǍaX,Z[]G e#1E G<ޮ4bw08R|.=ϗ}!V@o? (xa DA.Z[- ǫx6Eà2ć?J Fȶ6Z6yAlCF=vOW eΦ5η5O;jm ,Jw9BksŲ'I3A0k􏡝rKtI}nt[~4/QNqA_VIC9-Lc'0#$F#7q\Bp y+ 0eS&Fו*x g;d?mG>utÐZ@}r[7V^IE;, Ѹ`C pL*f q;ŒmT~}^mڼ9 mluwIefPXId?^.]l.7%^Lss=Uo?='Ϟ#yc{8m G5RImQpQ%!ӂ oe0֋PY=/Suαg|Gpͻ} 9E XX:&iƼz+ܻƬK/7f=NJ!Mk5! Z`Vds\oHv[ lcںlg~]sQNm3qZA .X)3=3=F+ۈ0 o&l!a7Cm.zo!Hh8 ϣ84xy <L!O#Ɠ xXx4<N|'" 艽tYv_/?&xe\QORL4^|U?:싷?R̪A^('#AT\yzc+޽Yt<ĢݧOy \0'\#!䃈(h $;ɭ-V;󹴎OxTrRӞ1ف1:$mgG̵2vdz:={ s5{&e""yQ`}K8BB)*4W6RP|<zbfCWR ? Gd&?$/}ZWQ2SAjBd-4ӝ2Inv?/F"QQ -qaiIdB͝.u?-f R$˧R-c*w]ȧkl|Emʿ]+,UBS.^d~fCn VoMfXyjG9swzq9syjC ܸjB{Wp5FPζj#Ro,( - %!WK%,S*fH͐6w5.?X9O6! p맟>| vµGn :IB"GuTc:n=Nf)h[Aa15%'7HK4KB_cV)8b \W% ?/Y/%\h]Q=rKSbehF!8AzVQl1OҶFe-[d. 0 kf1P8KXkC<_ 8:gw7SFX|?Xt"z\ʥ`tTdU7d-Pׂ"Y\/Nѯ/L-gZNz)/Z*F_?{?+ڝ(cq[ɋ~6x;Uܔ:֙pǀ5NM}ݘ<ɨ~r&1l9?ɤ8=ps(ȳޖ1M\󨥝 L8jҤgg0ځgx,(dAyWS C ,Œt:}UNz=}woO#ޛzVsZL^BUoxܻHڡG0~G_HƲð,9[ ;h~RñwοlEzPο6a1yoȵ2K+9'qkN*yԆJ.b/7mQ`Yqg|iސҺdm@޺tŎ&fQTN1;W0Z"MB˙0Bj>}{9t4lzvwqpNZ)pArV0FUI%8,#\lphr0)lu,E$Vp|ɇkO`] n$LXܢ{Llqcoƚ{""V0sdeQb:i5\4kf6C]f&q. F7+Ghw\m}+p^P>֒Aw=!K9}yS՜I [A gpK ! !B`R7$XMZWtVR|އS|,E!,$:UBZ+Ʒz:Łxq$ieRs"R_.nZF0y4^SG7mj'!Kn+J,NarPgF^"3r{~sMj"xD j#4o3M|vEc<;A/jqkԏǿ}Z\.w”V7='bd޷Ya.@))o(_v1k\|0J[Y;qϊ jjc3Jv Hu0 !F+ QX\j^@A8"8%@d`2l%$F$kjóKu6" ٴ s%˞1\W ᫄`0HB ǎ:I1<㺀'6C׽I?4,lJ!Kvtp.`5 #Shg'wUQ})fH_ESID;"8l:/Iv5vrBCwD_}IOwfee&_(&F#BJVXA'U ǿ7^T 4˶sMpګN~tl4imzM3Q*Aw*A1܌-a R/z?q a3t{EݶZ(%;pY8e3(щɍ'8o~_DMQZ+ M&Ou b7d*b%urP{Q8fo0M+/އ 6$#|AUVwYG^ïH)v"Zie# /k@ubմh,7_?ѯl)կfקS9dY"-&V;S]"gIAjwcpsP 7$AA;0ؙ:  ph(t*Ǩ?J Y_ $8Jؤ8"sbB;_dLyp[RtAQѭ24hѿ-rWԘ .[x\tm9m`~8)nޫJ &0qr # 2t\,km;6ͼS̤J YT)dKƊTMǚ] .a}vIBQrM)}p3eZP@jXF^NPC 2+|++-MVxoԋ )G%-AJo§#DtHwyoBOn`izz֥7e t‰Rڂ`N%! qUHP"u]lFoZ)#kVs=\ٿ>"2;d:֣>k B,fYŬԅң4_ 3GCq+_WU,QMunښ^KudyMzsӚ|KĂtN\ Dס2 ) P UKW IEmO2XB@AiMQ_-M4|55 E/nu~n9>z;/:0H0NY5^8a ۛ>|_0t}&-pUᔻA]Ԁѣx℻6 6.cP;nA@VmTPii!O],zNhXr;޹eOvBC QӊZ5XiV} iV2IŕB_WE)^З&TiiC69_(͠d a ;!MS{׋G?3}~!@Um 0ļ)CV?G>k=HT::?5fC|Eq*ڄ2S2zr.;aB8ʠ")AZX"#s֫:lY$0"&#"yۛzq]/'RM]-. ϦŧfWdu>k\] dS8]`E(q ?@ x^{ ^O2i;CX" ZJ@se ^'\Ӈܟl7oHobI mK?o >&56ݪ8NSN5v6ާ.5mtq$JjIݢZTbAsF*pyx-VYfiFb^ĂC BS{µZ-V{JX !B8n-B!~Ĝ^KgTfsFbD:\J1WwM|wzDp1ޙ:^S.ŚkYb]ϳTJ։.N@uBg.NΚ;V.*&Jy"#2{2c)rXahJkIQKR-0FRSC]P>8 \dD TeR(Bl5bHT)jeZ:#eq"ٞ> m1Ż\rt ]dB|nCӫ4%t:5-}!//,y@enINp[7G_85&:uⱶWOk{ b--Av^|G2M`\p_\P@NyՏ8iJ"̅H~\RݧЇINk+BXe<)O;#C͂/D2(9 La~R``?0IovpK k?U[+q;{ϋ(O3YSKXx7x}q ,v1lsTުxu#Mz*|_E0hO6qJޅm h kKW_*xz ;r?nCh>CRvfJ"ULVuTIƗÊ\TG_WV[Qp0cJ}X:6ݏ Gb&dnd3lK*rS.z=`=6l5M9W'l< Loiؠv'&A?ᆸ]6nm⮛.Cf`i jwv7m%474z"G>~Q{oM[q97p aUz&&w3ãlP~JYHJ;l}uQOo2Z̙} ~iS>HB\ӇM-qf d)4~d͔1}i>o>gEw/NP+}ͣ=*ڏh5A3?OGJg<)qnd;nAOkc&h, qëږ_-~P iք[چ~wJ?L]hlI.ῷ dG*#o?9˃ޙqd7oH 7x=oɲCGT5jO L@\)gs"gJY"N(3έ:o}Z0$h+* rgx$9_PNEr-+WE:Ŕ>˺eXN7@(n:Wdƙ &~ ]`r#M)`ی5XSJZ)]10jtN4K9bW\Ne~ /ظN_=y旑vuyx&m1pg3}ntRnVC!T`m-G]5pz5ܺ^ T͈?ސd+w2܆fju4.lC}ya`#3VԎvN{it#IzW\l^=6j;iUH۹lCw䄟5y1 ǫ1]v;- "XƤTJ*'[-FTiB(P xd-gDSv#ДhB,B'YD&q?aq3=Cxț}2KWr$^)U[ԺCnk=D ')wM>bk}ߧ>ۧOOܜ3޽7^7v\p5㉳KU{_}O˗Fa+ jzm^C]Xiʙ*Cf0l2l$ǙO Y=4_)˕,+@ Ou8(ܒj]nXmS+uc J AR _T_4;\ W8UKbD ZPAR7~Y_B# Kt4.1c4 `ZƵ%v7zwg~_f1ZfpD#ʵaPO VKu+uS\\z,w,zn/|zfQTGQ}B8Zs0w,L#~c*^ҽh!{2͈l⡇1"+q>p",dD#ے^h#skmSw2{ֻv^ic a'{2 )c%6fx"a*"t|{mS-DHng481y˽E Q4CjzΝ$4^E3h+u+e; }TRȵ/a{ʹzKoA5ğO *ߎvK3n45 nsS7#2,LG%[;g[>EKM9&gV+14um&6cӽ(ST,Z`RuÂvR&K+N8K][na3]GO4?kY^(Ab&.f2/6$ !L{:L5jN h2:T汸ZeԅGSN! =)2~ %D1<'s"ly.FYjR8Kq+ wznU@^V#tW<sNt7x74#"K™3zR$NS*$[qQ.ՔP(K{T Qc`9`d*=@=zH@9tg[@"*ڢ-*SѶrZݶd3N fیP|2#LL4Fs4rR &\pwo7wx wno%ȈcĦ<.k;ye` CyULQ':"S+ıԺߗ*ֈ99 6XiE|ص B2׹,! ;H{ $<|Or3I~X@XpMb/cJ_.)]aT)w1q8l5~7 - `mQ@kQfY]GФ$@:-w#7s2'cxUL7xԌ}Sp:s.:aHf&2  ǔ@$zvwxl˯J_ CNjZϿ~xLɫV F{ gOp$>=t~r1Y~]$0p\ {&?̶C0'F/ի0/vFbQg2`vT$o_Ac;,cf i8;iח؟vpzK>3o޹.t+Non KtsЏ`Jz{6{($wdfC747l imkHؔwfI2غ@aai^CGx +|^p7jy,u;}Yopo&LK>hgL?wQp[NNY ?u'ݍѝPb?#BT1+ Ak!;!ɞYcI~taFA ((%2!J\ DձWnSæ+aXj~y2 o.\o^Oh _]͕lp̳;9GGqO N^xbqe&ZKG$x&xPL6R+ăYp[J<V(hXe/PU\$sѰϑ4n5\{v,g`Ux6j٠~C{O(UKC5NkbN1R -vʱ^#|4`l/%C^P!W0R8fm i6'ݡMK`|MdLOj 0 ~WqwbNR 1ehƼOtTf>8Eʹq7s (w9hŗL DkBj/%<~2UN^ֲ)P?"x$֦'#xt,T!,uXTyɩHPo!2c@_Y[ʠXQsfY!,t2@"[ lusO:Ppx4@|sZ(sI`ɍM%%i5ǩ)2:8S}ǑV%0"z J _s` ooKZ^i.%yWZ;'u+p,fz6IL F<-R4<AY Sp=-fb-fh1 PR6iV96h5yO y6VE)'>kdNtG: /^م,5s Zzoч-Z lOuJ90ͩٻmlPTMq!@q%LL25/)e}3mKl"I*đ66%bӐAg8?m>gx_Da5I{AZ>].mkg;fC@F$OGtiyD bP?bz ` Ek'rT:c[rtJm (%-J;/Im#X ռݐސ6OЃE=rE  !|/fg ؃̃{x;ϨMVKV2¬꘧˱cc^r9ѻLN:Y(>B%G cʹ0 AfY12u1|HfWa̲V]*t9м}2_dދ/$ZnWk~X,gkV~PY 6\_"ܕ8|#}G-իsվL7rFs.DjM2Obiҿ Kf"]梳jI~ȵ gbE;G{ҏruH'\TtrH<8,LϪNBS(mbZqF^&H>l!Ve*+nktdRt^O{Sh1nS"-It!0]jVfۭ_0jReۥ"Ayv>5!zD(L"L-q7m{O.폏?Xxd?'8"?#>20$!>G=lGS׊w%׀uGz+ } BC\nA"o+y0Krqv |8bJ1x5GXKI*^!DŽ^{h[X{+퐂Ffq~js]S7?Z^b?E6GKɏvũa#b?IJG@'Lxf5}._ts3u0kBu2A`z4f;壑G15+갷h=*j'ݓ̒ʙ!ٲ5e>Y仚|> SoE_q/hE'F/E4)Il sTxz]JdFxPyܾIQkYpff1:`suΤMB"hQkwҰbQh(u MVa}CXl745yjzBemZ `t:ئ]2 i(q |ASx IPi9ҙ/׼=0/9v(&G1Uo^u;nYuK;Ӆ29mLt֛g9=DܓA()"ɉ>bQ+js8^r9@_⵶Yy~WE-%V*V*} 8>fG@hW0+s)7+} 8>y>^;,u]򋕂hK^wa}?wzV"ԓWu2SV)2L (0S6U;A[j=U˨v뷋 ̚XQ^ۇ"[-m\ utUOKPZ[ G+ɢ~J_k}(q͆IB %u$2Fqn kм//-EAQ''nO-"6҇X%(TD>hp@2Oh/e}Mi2E_Z({Zm[OF5GR&Æb< ݰ::\F=M{h.Hp 7Y*hͽo v(3ydumslKyxjEO~0ի݉)y L:}Th6Eqûh!Ĺtl4`S:9d8 {97xyɪ_Klzu;?d=@FNe~_zYw-l|{cMZxk+Xվ3TUv5:A<~PTm*5ɢMm)4i{UDd`4JTbX b44լQ'bMdq0ipB4h<:r+i h2Uۛ_h3oӴe(J E z_rmR۲|-bwtgyb%AOHK(|F@$R0~ \PuP. 9 1\_Gl?蝴W*\ܓݓ d"WW>Ж h;%JfN6 (Ʃީ0xaƕ {g-Z- p/}7(; B 0 m)$Vٛb* J܊\2@Wg}ǥoyV*ju۲ݖ HcE~=M~,>XtE^☨z#C[*փܧUG0uLKWudGs>Ne>4 !G>G>e^/0fP;e|CwSz UC8BA]8:{X![lMT=(m'D2J: Vimhٹ8N9"BtA, ҋc=!Bg(@y 2P0E @,Bc3⁍⌓q'2O<Ȼ3Z/&:25o8 9T펪C:-:K>_oH%,gqM?g{b,i>{%V/FD88sxkF-٥5YÇ5~؆Is>BL@8 ÐP BBbFt`3jLXzQ-`*`  kBSE a)qZ5Qℑqwa!q!> NUB{ٻr9};leYWgIw o .겱={F}l4ɛu* iL6҇LٻFA4}0zd{Vs,噦1!I| yYGqQW '97Wٽ27R[ @cæU8f &kKgxg6- :T-t_ʭix1qxPRc,0F<0sɁn^?r!l;-u043 k_#χ{‘Cz!;%:9fP 6C%MYDMr}~Sa4F0 jnwUq"f|M՚MI|سРL/njkѽ CEݴmSxQ^aQ[imj(-53,4du9%-5mFD8Ve`'wW:P| [ZLg:E͵" ƒUvn:^L-+ >~L#^ЅY+-hSF ѕ%3%.x7%e?z߉O{lՏr!ՎL"[ݴ)@C(P/ij U+.iHdWf>kh}zZB1 DPGY(\؎9 =0c `bAUmЃٲ?69_M""0Fw &-Zhc! hKؑ:D|]1ܦKPo>{A:(L\hVRh߽Sۂ>T[ZzVB{2  }lN%6մJ6:iJr[_:m81NV(4Vp^Ϛzp^RR>ɎW!v }*QXX#BZ\ ka드ks-tεXεй:BZh˹:Z-c#zks-t{jcHH.Y$3 @Hz;fS_1͌md =LKp̪I00/V#\n1أw]Zu uNZ숟#~ԇ0ru/|E]߆> WmlT.>V Ew2CwMstV&h Ѹ wm;::-l@ WG˙M G(LR"I(=<*|i-]ለBMNE0 `I1H[jԕ1{kJ>}(*h(nm"ꃸ1ӻ怉DmAs*1LY[UB'0ϷlيuxM5y(2 o鴀l_T:]EAK.5(솲DWi鐅:} ]r6d1;2QFF9gsN:{DTdI->һy& " UGG5Gv}M^5 WeljQv4kGjϕ1Pj)y><`]i3z`ZsI|OFJ>|Zxk% : ӵM4YknIϰyX rWhnڵu*V@Y'i{ Op 6δ,*O !Kh [7 nE+[N~_h XP7rw[yML8&Sԥuxz:t w#7h͌oc25՟>2̤MTȢp~Tv|U j *ohk&OM׺U KOǢ, ׇ9Kn&Xd|0kOr]Xٕ&pTDQj<|Y5oE^9zPWOHuaA2xIG(B5H陵CP3\9MTIϴtGv[PJ4}I֭J&N8I9;@e+ƞɯ_4 )"GfZHBˎu-JaQPfP0RD G8 +[EAw{s[Ohtzl#Ok:Br^w}뭝beΦZpšKB̯]MKȄ%,eYJb$jTbˆ#2Y;; E <>d+$)22wbZc(^VvulƣkRۋ"7~z/fayn}}>a_l # 9L;)3Qzh _]9Sf}bZ: X蠟|_WGWECDFa(׹JmvE+IDYWӋ1`q6w૯F+/Bԍ0.ՈjOk^ }򲩁'n4)&OOM" 3Oy+?+}Hx! 2+2R_<'(oAм Yֵܰskj,vvtf }4b>i *?scCbxfH᠃6GuIvvm~34B!Y  1rCh@7XC'Y %PA!F!`$$&;% bx!'Ĝ0$ v(hOեY墶nQ2+=7"U3}^E8,$R1%$͡{e.eT^ר,Jkz0O9x<8Ǧ֑C8ܝBfg!stLOɝzC%LW*@|&SKz+j)V`C´9߫HѰPO Xȅ*2@ĐrƓ+V d"S qΟ?$AU&DxxP # *FHA81ʴ'鼇a_|gNKzШ?Y(ԏu iSA8qAx XĄqrP{D DO Ġ I {m#rwߋq4 8fGЎЎ#88qoz^vB;+G=qZ 8;^{bhqvNQGhZp -8ZOGTvj~ǣabhh~ ÞN#9d1 i\*A ¨L@,MABv,ZaUgAX/WF7/!VB e[{GsR‡F/.@,nu{f1;E8@\,jҷ ґym|aްR,Vyre=ʷ斍_kOcV=;Q4=V}]lLEc6^\vWspɊ#vRh\Z;vejKJJQ^c䦨 D10aN?ui}6 LEQq_Fyv }{8#2/nG+yZ[Y,\,ɔՃabك- Ժ} z/JcZyYU'R#PMJ@2g'={/#tL }&YLFbF7^חLZwNխVr$IӘDҔX,,dʓ@Q8G9$Qn17E*hUчyYiO[~A71{xкyd&.]7OZ5'ɬ&hBkȬ7C$Oȅw~ݟMmlw'{ޕjzěL},O^l`\Z{AX~̯|N\ɣÔp*DH(LD(QPơIM7oZJ^.ʺͥTJ7/|ӵ4K4VRnƑ_ϰֆ͝%I)Ae!Y'CP,Y?Aq3g>ٯ^gBfbnEdr| -?'DWxzâ?">*T^je>)Ԧg_Kt@ {1k IpF9(P)HdLq b& ` 48B+‰@DI56 ^,&g $y^?'k_w@EGpoPnHpGQ@A,y"e@;.* #DwJs]o~8/Fol2xWh9bW'P@2#pOQ!&(n t4:CpǸodEuӿnr,ћR/.:krXOtohcc}vƯnVz+f)ġW} Zlzta@'U׳mjЯmqvRH;v)z#{h}g}uIrl:W@l|Pө*mD {|Bd= /ZfFI?R˵gPl;L?ʗߩL\OWkjA͕QX˛6&֛b9'mc׷eY[:зU{ۻm+K2C:=hyM|>HeLy(Bȥ0 )t /}-w|&ýRtM\ eChZm3PhڲIU~4_X\{qa-RP/d?#KQ:_}Cp03ԮoYYjc6@7a~ |wh2](M ׹JbF",+lW_2%Vzo~an1w!b'ɵ^ՅTsy0=ЫA$퇛$ܑ}I/؋_-ַ!?CAeA% d!Aܚ[;L J,@?bAT>M}1D~556؇.݇B5 !_ӂLȵK ȷe =:#;{ v;A1iFiH!"S%bbBj(  b'-}h)9l"|Vo_fc?Mv{4^ןܬȇOuR9}(mg]z/dC C~&Os|Xu2(^+jPQ:?f=V{ g(w)q\h4]FĐVș.O;u&ȃ[OӃ/s;s:็όgSnA4ͼ4'~H꠩!Sgû]಼N[lǧdqyMR?T9T|Pe".!gfgr!'%t2/j F;Q{83!?L1#4C%/3l&Fak6JlM|wM\LZǗ-GbնAWPOx %L>$)aJRE$TH2椝{edT^֨lh頜;rQvP])EAv$uS" B)AT\~$0|%9o&+ї*٘~1,ɔފڨ+jQ6!EO!!z\4}>ʾ˥TPD  Fab2%Cb1fnCAx(|7݆ƄUIOMe7Ew ~+Uԗ٬o8Wx{>}W'R޸ !{0$+ݔ{tR┫cQ EIBE*A'@8bpW !1bQKq/xQ0iV?t܃qJo.yS}3=ҧߛ;lxt[ND!$!E+XCˆ>dX$" !̅Ak77Dcv9 f% 9 !<0OE,rV\mK>{nzSJQ1Nӟ/һƾ*ޅSlz,gۼڈZ}*:nbOT9-LSe3bg=:-yXQhJ]>0=΋Rb}.>Da5D,@b ZD$*4M$ffa+!ƃ\şSnJ l2U[ٹހVjM6'vg_\Ʀzձ՚LRw A!`&hY߯6J,@ ,؊ޔF +F"e~{TOl5Ykklzv=x`Bͬ5Vy`oM=ORSl11lOo-;7]ˊb]_roWliC,r?+Ibʡ;]gZ}&'Z3Hk$v}3uQ혃mi }z_׫Um%ٶUޥCf(LzS6_ڦƖfj?naa7ٳSsL?L>y'4~V4m;N3.ܱV8gG3ގ9!dq^6zxܸ.tWI%fSrul3Ǝkh#MD`}j9Sڻa_ \UWUv+ZMU&6O-j4w:QUqO1eG:~Pկ]<ڎOIkacMs bLd)+D򼂁anYmfRvh]bKE2(U;;,jMv\:p;K5ڮbKeNlbmgKYFz |@Vs¦ڹkSx齵(Ll~]EkQЦ󮑟d1rv[zv;5>WB]_^Ju?n<(xGOVLšJpe1G1d&B&ʬ:_{Uee$TXlnZQ4 g' QU]MʲO/yaN\E> f ZFŤHR\ 4|Բ,]*Eub*Zm$^@P7hi}}fYiNi4HjIYaw6–} &꯵+esVd%M.TRE5Z/*=||w1FEHV#BOuCԝ0^EYqUULnoF V4S3SaMqPqXwu|9{M5aa9@q;lzu!`}m^g&+Vc=MMa'}RhlZ.8.vqC?2yKc k;gcu-eQSdRHfG@ )QӐcIaܧ:iX(<mc~A1ƌ?䀱=˷?&=[[f-}z@HwO9`8Bc"G9,NhpB*hL &` HP#O)H<Իx=;Qk$n2n:iDhIB:nYOz\J~v@COj1ԥq/5=;찔s2ovu"þi@!T*b(" p 1eSADU #VzZJF(|% )B% C㮍 G:-Gj}$'#M*/>Y*`*C]{lַa~)^߭>Oؖ6ŭV/ì:SyZvorZY>M ?8J=';,{'/ 9~[LObwܓ<:N'٨Ϲa^Mk:;F S.Ngs.})-GK^gj~qBv71V1D L2 -oSXȠvf MK zY q3u-lC8=k=FoVeeޱ+^-7fGmnnxFw[Z>RH}3g~٘[nEgei b.m[+:ؔ|c{NYB1I$R0""!TF"F {Y!FSq]OÇó;LZ1k Ƌ cCUMA =/o_| ajPC.\\.<{ч;|n: 55i[ץ&v5֤q.ٵv^}|ۥ^c9C9 aBE44R*T& ʱ5E"BPO.J!*EpfZð ]% ΑHMAa[!RzRRK0= ;& ::}>h >S$X$8<$1"5 8T4 Ilw}@l߇N=߿h(}6C#]jM{6! sgC/I=(AW'_l|=G5Ɔ&Ci¸&?H RT`l.`CȐ}z*tTx Hw>9Ś(fbBт*ۘ^^W lx^Lw:KU|%E |6*Gz0N`O8C:>Ņ# dNyJ`&# cJ!KQ(QJ@F ),%&I&kjjƵ fJ%*Y֭;i~}= + g}P.ʆksoԿ/Yw,J)E,$c{b6bIVyr <a\]}?W_}u~(}Yf륞ZVӮ ]6ʪ U5W*}Ƈ#aJr%bA" 1O"Ec h*aLXBIo|x\F#!H(iZ^`ї}Hch.m!Xxq;drop8Q JL  @a0Ў@[ (!v($t #kjHC)j|'Hw"[:g7 C<c< pr5*YLE)$@ NC@!U| V.ʩ!%n2/!BL# $$6$6x>~}]yH"dRP&!U<*" rrKU&^e.)1@AV0$7Ukr5GLxzטxIp*u&1 2 !dRi  < #+}w}wҏ3vn9?㛛/Cnr52 xw>Y;TwV^g* R@xHF9W*P0R!Ȅ)x2|wbuW9)~NTzc{Ť]}v^U^/Cͅ>gU09,2{TmU^\5vydr; C]y瓻xm *N*H42<6^UKo6% > ~]^zՖrIeIZev:CFy-D~ծu7߾y:jܪ_wݻN{owB貱xA/zw=깾Qu W՛Rި(WΌ{S :U!O XaT<`A0`}G__Qd/[>,[q3vGṡ %M#JY@aL0xCR'_j0޼`L5\]O=D{;4u8!8dB1{TB,Dr$pzs?3Cck|'[6 7Q(B%wsHmGuBg&Bv+w}^$,9(␲TP%`H% a*wax]2Rˆ,rbxq=`@={OdxOΩ4aD` VT(2 $ FJ 8Mcv]á 819at& y$dkսVkջL[n/QwP tns7չY=\~IZkm^:6^sw{T^uWBEGwEZs{AGn-W=6]Zo7w?Qmvqjd݀GE)()L)Xq$e 2&y/5MqJӅ)&wm͍Xk&q#8[q2tw=ݧ.-iQ!);_,%XqS 8p.Gm&CS;Su,9 #4tc#A:F1t:y:F1+E#CFZLl+NTy?IR" E*h)1Xq󑎱]eCyo&»ղez^f=`5ƚyټ5̾9({;{ `~I Y̻U!TOE{Vw2=NyEvc,򲮃Tz?|'O=?y]r }}aYWEj8[ \Ȅw+e6U) sj%~D$轆'řVܥuU; n C~Loޜo`Fۙwj#n? haNm>*cx:36~eyU0nұsŅ6%_[}j3'fYD@lʹ^bT>㟢=eCy?ZU'15mG) aYr:zx7Ow`b"UNk+?R8wVFi齁WZV.k*‡]a*3&Ϯ<2~6n?O<^>oٽ.uQfY5SoyVNF]qDZ"MwsĢ5 M<{Ӄf-Ĩil]W0iʋr hѳ1=fRWh]0JV`A'iw:Se~@:>v="a4wNNڒE:nwx;afqQGE %"VHrΎ)}eٺ IJ)KV 󐄒>ʏ Ed;Wrա+*$|E*t+_~DWuD̉Ĝd6Qˏ^9w̓"ϫ~LƞEn CgҢ @4C@WfU:kO *Xgg EYbGV'cGXW:?3 >ėb0)K1݊& #gĠzL|}^ڹx_/J P\9+r+ "͔i걸9AZҢ}R8ױ qks&o$sS߭",*Rv2Y$"]O#|F;4ZK}W|N7,4 4;:-9]bC>Z/B7Ob[QC8}#K7C1C8vogԭFMi_; 9߫P:cSһXa lM=t݋_^N ?M` ~},ML #x<O,5j~/ Y`DQZ57xr3HIふfwglE8ջ=h74 kiu?ӑ0gȍ`*aUBɋI5\5ֹd3MQ\rmY?rpK0-Ls+?&y%jJ0cq]B.yģsoEH #S.2!cA 8D J7:Ǒ?/!t+) 'D!L~%E/|.pgSrx,G~z'SS"H#9DPOV'dm@m6cx]ٝ崶[Ǒ=YlG8>VlMCH$3IS0$P|lflq[lB i/*~|a:q=yZq=Y&8q=Y)鸞zrh!!Oԋ㑉$1"R!,> iIepL8_yd$55 &ؖYÊ\;,+Qeޤp5j(*jn$H'ȶN,!"Dy7 q|Bo&YU٠^*HF~hK)}[@ L)75%oa ң|ڐDM"De#0;]i)Y'ߊttmb("vLm"q'NxiB4-o[7%j|s=U;*{ ]om1t =v UJ}S̱$IISiAU:6qt7pQ"y.dYG"BQK•( פ7֪=-_VNM7r\Ja#G.>&̗ ͗snρ'N^ =GTܺ)75O&La jh(#Qϴ DJejuvx߾yՋ16Usܐwy6xSZE.`& jOs}I==dx;ܠ;L&ԲVig-9mQ0mtƺVM;kwNup,ib^YV|0>Wo?ÉG94gڠrU=FAj(o6rkfr嬤noTZX 6gSd'?YMm~gաFl m䭍T)WnUևjuMtE(Ⅎ8:QQ8)E,pa#?V0_cieN9$Α 0=_[C)%L01( k _FHʘ(SNZ3NN-̓#ڕ qa[UU~QoZMS6x)x2fp}{zsWèYO4\%l_d #15hy %,_2n;nZH >o0hMmv͐&;ř࿟MnP'˛4r0'<*P<~(6=dL8}!9cDr#?HPJXu`rޞ'GEm< WHQ=t it=EBo;v٣e7H dˇp>Ӎcܸa;_ݘƭ/DOw!@r.^b'38B/7`@uzOy٧a;6t+HsNSa&sy~GL=" 1f& b QPIcwe/wK1b|Ph~>hos<|H6N(-gK+pIK N,3BӒb%q%$qUk w ysp7G蓰#.#:Ep|0"!ŭt'rxu(/,C+/hNB&"PTDR 1HIC;Bߧ P,}xNoN]l;m3Q$$R$A81(> "@`'DHJ ;ų룳(v}nH8n9Ϫg1| u䓄I((DGG>u±T8@N >Z 3 tЪTn\PUsU\U*WjJJDCr.%{#wF3`g;#vF3G#v s 8LEQ4gҔXXc]"-0vZ;t1\wכ;>s-,bWh^e{6GfRGÆ;!*Y "PI9KbIDGAȃ@ $w 3ࡐ+z4w(\̋|zqG ݰ`ˉ0+}+}~rxjr.߃2FOaQnsOESGcM)A'BJ0,Q"ˌpU6O&ٜGTlݽ$b؛kfu&Ky!͚ "\vbpzVfHT= У4pu7ФОpLaW;#v oPewxw|1{haQR*LUOo_j + $h+p퇉O%jLWGxZ#:6'vsWbZBCq20j' XM0(mZu".Bͧvy}75q{0|;!Sa]\i9) ڽI 쮞]EoXd 1\oC=k]klʼF떖ׅZIҧk|k) wx l\}Cv^zMn DT?/| Aw.9I87o UFg)Ø3[4*7S(WHӮ6KwN[8W5Osߝʁ/oЋ5DՠJDcnV7}RY뮵ψ=󉚭B=#" 2V,h#RP%Jc$!!???7= RKk>A\)&B7ĉ.|[SNS#WzԬtWlxlZM!Zc?i焎P'i13M4'|򩡍{F), GfR!di@St^:ƨ0^8J \!S\ͷ*&Cq;v|geL?iLw׫==pNzwl1(lU9~f{k= %k ƅи0 @9,MBxFdzkh&8;<6=wEv[]"Q"r|,19wwdAb^@5/WS98/|ΰ;LʓqL== ;J&+ Ƥ1%V`.3EYٗpL )$OrH#Ef$q H˜tO,r~DW/>^/ CG$BDEZ복 Mz|)(DѶ|pJa}AP*֍kpͬMo&'&zXz8hV+ 8a\RgOqԨ` #CP,Bk!=CȆPpXj' '~mR(dc4[Kl:7MƀaFieŸݎƉE]0zڳtXq/.&ңIc/ʰv6GpmqLzvVk|7WI| }{o d,E93),|*$>ff7@`bgdt;1_N5NCsQp1lUB5:3F0(5v'%۪ QZl'R]1'f4͊CsPj; $b/])Z\SeUXkSyHg|w]6#Y._Cv_# nXL(ghnbz;l@a7n1,(ph?'榚+Ɲ!QrTX$0l7쿘o\>Ol1 pL(I%*QKCJOa]LbIbOr@vBSi#=/#!&%ı o >4;:R֍NW7h+{uZq'ѓ)K#~K8Iwf{ cW93yAG= $3V!ڲkKҕտlWYn+?ʵͦ_7u?jǼ7u*2Z nݢn/x&սQFR«j P5֗m ~Nz^c Z}q1.%}>H|X-gPw!MzaitIi )5XV(B(pO3,)`tLǭM®f ɴ`L闌6O4ZLVF5oKX!U}2cW7eyZqP%tfe{\L.韋V#ĸ[4f-!] IV%pWWM=l60n lW\7nJf`~]>vF@hٛOms};!YpPkk}>nz'ĸPA vJQQ@K$ eu%gDۀb]uއבo)zH,QFE{x+aQ}@/bY`fq(NMX»׺}/}VK1FkգPa[r3oH_\'Ck08NSbҋkӏ? rz8@Ú/`zc-^ɶaT7$L1B߈"-Q ;`%=gi0Bw]u #>:?f'?V<\H3H0FVNB3ՅܥoSϿԅt\Yϫ.bפ*r aB{ >󋁙-p_U%cU) (?\  "Z',,evDr51}\r^qL'p~#5zN1v[a`u|aczuh(Α+>o՝ JY9) _ 2帝c0Ų>Eg[UdH7\P\y6?nM4c3 H ;,ùbYpI,MsyZTG{-c>9~yg>nT*SRE'pf %@aƌvJht;0e^JPo@y?R[O汭Snq ΛKw1gm窜dh37g/*P@AtLMjx jL.h泡Yh]x2|X/ ԓ4C-@ISJw(KUY.r: YnTZ6NW.rRNwsy܈J~- L@Xָach<$V[=`8)C}W~(c߉lW%925IXw8f(Ǝ ӎ4gƞ)؏  O`a#J#U"P9ܧ-mf#P-M{+E2+'h*앂ld'2)o1P" #Kyh#Xnr3y!5yg^ n䅍r|Wa#8 wjt hJ ,}am MfX=kŪg$K VuzjPDu$ƾA5ZU:;ftAuQnZt[v̹]uxjmt~ M4C#g !˨XQ#|,HdAQoIz+gץ[=NW_'] GКԲBoLc4_M/|RzȻ6P[QPaŨv k~o~'#]r 9`!9dȈt2:O84#0(?q=Kgz+j؅'{-.5ގnK,4n-3H Bjʐd9Et6MkI[־HyGv 0EԼX/[p1q+??MvU0USL}Da8%m@U,n+8et 7$9d7L#8̵$I(?$ .&6,")spekvnp^i_X [XtW,7raNl"\DN?v|xƶ^)ΆE8%0S=$!ߜV_*?K[ RˇJg2&\"VN(6t6I,sP~DӔ:q.}\'O ZiS 0Mg|r Y8QiSVzZ̧Eb,'=3]TWBKhMXh+0k9 ]}@f ͼqj6rI,)[>k| e*|i>m/8\|h>];(nt4ҩ@#fmtOb*e _M"I^,, fx .& t%KKt ]̜{Kwn'Dmy1^oI|5t҃4o90|NAO}SI{y /#Ӥ՞JM]( DGRj+^V>\O@{&"CÅ(lۉ+Z8r(tx܍+>n\la"DaA0bE(!k/u{C.yKK^Ռ &F* !r6A tAt@>Aꆧߊ& {#U0?MN H"h[zaBr2 F %',k`לd !|^.C1^`j5Ɩr+ `Et@\ V){O D{S)% *u?o* #"gvgtZ'c25'*)FQ xHs:C/P_GJ=Ra) ۤFaD⌥n ,4th\h(a\.4tɅr\h(ʅڟG%-U*˅Ds4\h(ڒ΅r\h(I*ʅn BCP.4̅rN\h(Z ȅIBCAy J".X JAd3'}!mVJ3>:>)0sl>śY? 2דY?3;l%|soj.P­&ǖ9wN9xs6J2>Ս`ޡ'W٨2 fPǩF~s>hak#:lI9y%@*= DMJ6gIᆗޮ B6T}GˆYWڊ˹OĂ[w.Jq_:l\Lh5n=Onr&D=־Fe-*Xk\O*|<$dֹbf n aߝe YGUQALW*qMSOpr]L"qKh踩AQ&k]Aok򘝥ѩ@3q}~zf^TvṊNi=M+Yi[ݸ?K׳UfaՏI[ k &U ~16HbM%9yjp?wi6Xe0qyV#,ǹoMQ($TaE"Ỿg(Fy C[_nLޱbdkML4 zƩ'|Vd9FN.-=rxyڝṡpFWX f=; ;g8>V@8"VXhtw߽ (!]UYӷy#ntO ϋRIX֭z"Qla0ᑏ߽5e9OT YPIҖ'̿?%v5(WPT+`K7E!!8A,- NOH@Y 1 ]fGWRjJ: km3ol͌,N|8!k$É)}\g f$L+r z%D0SzUx:Q :hR9qmOQ|"Q>]_?BD>ekǚ[1ݸP) u5Əs?So $;bjlʆ0ؘ-HŒ< )G9^pdAbY_rBkIĮ1 EaT_Zwe\%wqa[$m xUD I!˭ KSDžRMͬVV5&-*˶cr.$~?o9K*rv@5koۏޙZ^Sv>ﺥpђ-V:Kl}%YO8]=1 08SWX^Vh :,_V(JjR C TH D< oUH'!YrnwltJ>ՠtO[W0E7ܸwR,*_C=Qq,:8lcu1uˆ */@U;#rQ?UB$NJP"q$`trH$;B^LB(x^q%N]STҥVgTF(ܓef5[7Q5Om=vJ@IH/أMZlIRo.2!&06I%f^ve꺑/qqDvإ^M <2/ny=HEb8kpEDZ^@>k;>NN;^" SԵ5oㅪ8>q94sr߅G$*K%]Hvg AK}qz;8+H S^d|lZ\ O;:d(^Ahuہd@sBJh [MԴx@dnaZs6,P6{MgRľ(-88=oAg1l3 Ө|b7YnHRյ8ݼgA1+!z0ݴ{ ( a]?Rbl?ΨvR7bJiEF+jUgBpW8ӗ.V'DKmjn{N;.xO3n T,h5 ڄ'Tuʶ(KԱkH\!? _(v]酯y}~Us%Bn$cQe= Hd!AN0GTD/! {'ƞ(Zcق_~bw<< tllcuA`,R5> ZgF BGÐr~wG]׬oqueTKHZS_~n@?O^>SX* 6i8Ik8r!h$$ !Ηkg@VLΔ)^a#wSo&űByVӅYu"p}ŻG+tHl:EqzlfV6 WlJ깏5OEsk/|LIŽvÉMw5ZHT7~V[)Px뭬Zs뚩QkY{=jv*,qkX~V*R+tޜWI(ZL+(ٹ,T'&N!Im%qVtEgӶ\|Kh-+x c8d"Yĭ2q:D]~̶Է%F 4CqKFjcXE7Йөg#@,V%n"3KO]?^AmλQHuT)U0mz5Qr>2CаEkvd=?-߅R716d%攈Eڀco0-޴}A{#GIwDz^r׎ᘞO}n}lu >uA|I- SG_$֑yӇe+bӧEUʏw(M5/lѤë$Kjv: Oھѧ.Ӟo&]34Oslx~Y[L$.bnӤίS<>ME"6Yf2{of&A7ao%t$ z~R7'AO0(Y~;X9'_4 ,pϗ}PgM/. Ynjza:uFI$FZxyҕT&,=k&¾vՙ`l+c㙗|tp ŒX/,mBx# DB I[Cڋ-R={\/ _e 3)/-[wDKﹽvg`m1N<,m챢oS1OvHK%ZK'?;Br.՘!cQ0*Q! FջՄ۝QMI!%q`0Z.S[ cYza̟TJ[x8vGCE#]]7nh Vk`-7zKfA6^:Ę7LR BʬB&)C_>:^#X̞$c0W Ӡ]@F±}R9Rft$%n L9H+D%؇Y<nj/"HH sQ(h~$Hv+d1ė@kf IĴ \ɣA[GZJ/^Y)\+6"0(Ycy&f~91;m/2Gם8ӋdsQAjn p ̯ҳkFiOR:X_^5IB0<){_@)KBh?JVeD% J$CʬtJFBKQyا{c9:]*7xY9B "E,+^'42B'+b٬`iFyc5QB& 7b*`m1:OE'oR 4*(r:EMB9S3@]K>}$I7uT: <;,`Zj26JTa+ ҀVЇkua rJʅh(Oi2z,9 'ow~6hQ%;GLɣC=C4>Q2 byn9Fkr$.a`4ʙ*ʙ Dzd;J b1҂g%ըpRhF%e,VfeFiPY^,h`j1=o-U9F2C`AS-0qn i1DR8J{>Q D01.Zf`d9b2 fI9cK;fJM}|is+q_KGN[d0e{K[Zg2Zty}M!ǔ2%9ܙkV 2\`*J-TQx!d䫺{HN U-eO䔮TY. 6eyy$)Ht,J1s(y?bt3&[4R@Jj. _Nw!_>4K {\`v>ΐ ƹ8{`Ž $-S|zք5Ruf͹X zI=K ;?.b˞A[}ɹBps9G M19a*CV$+*U"AE7:JxPEKSٌhґ$rM]3䤇ӱ\V)P (BVVQ]*(maT$ny7̽4I+eN- ENlѺP9 +;Ew~;EN,aKv$%2 1kl U[=I5}7r r"C a{oOv{LJ(Qأ7ۏ~Mx;p7޳7<6v?&<<?|OtO}6I6/-=|ꯏy=g_FUDțji~vOﯸ#7?їWzscZ~mv=!{N{~Ŏf_Cu7EoGڏ#|lv\rkg[ txG=\mců~twܿ}n˫?[W{B_WOu.8%\8 :q}{B? 1N7~'vݖ+:x딳ZOA] bݪ o]3߃`Wr7 &9XO1M]Z@ER8~'`هJ/P](X8['I[;LlV{ i!؅qi֊n-wp ^Y{:ﳺ>qn?o3}zx6C@FisՈ)As5gn4ml;\19W <_=!"Qy=ztj ASQ 3㍪_ eJez+_D'LqZ1 xtI)p7 ,߈Ԭ~gg 4!xD(Ƈ*.:g-Y2ᢑX̓mO &ЋHKV4Jr{fOUK[ ˍtR"2_s;4Jj ۮ\wC*FV QKhm4@(Ŋ x5*c}j{Y Ē9?(?י6Z"[cHH&/5(gZR$GKENh񩒳9JUֻ|< 0C!WFpi+uɓI5 WvTOAQSQL!~و_+JPrṕ*CGjF2Ξƴ:檴@-\=`4hU8gqC$a7^-VH63NF0F`muH^Q.j&cD ?9.ds!e< +_r(ˊ b$h)mo '@ Q]i"3xgڗ ĨP{cC$bVJ9VMDM97BYà ~rݴR~G݈E0MxhŐҢ9J0~j[[Ș(;YgV;lťj٨V֖q*G0񰮘< \ qS(֩ᾲu(I 4I9=+iNr2QL,F+|zꚂ+5IP}MF9+D.[m+fco0%ҕw`6j*:ZgOz*>PGTQN,J,Ѫs=e"sfߥV,iU 9-Q>*Ҫ2bPnF r;h]R$~$EZk~qi1dH%aޖ@Xnd"pG/V%+1R= ~T?kyrD~ idQnGAZ7ɍPԑOFfJHaM?-{{kDBE|rr6"39I)}ֹt0@8hUsl*_Ty-IjrXO; `A%.(I'>Ξ Bl ު _;+wV`!ͿߑJmC Sߋ>^뇥/QVA>d}q1(Fm \eU71|k_b/m}Ƞ=J׏<`"+D_Ȍ67pA7ӂ)8e~ɾ>3F{;ν^JIGk4;ZJ7H'eUUt%ƈ'ZSH@S.*qm\]/k2:] h1Œ\L?1p1qfڥwZu"H gbƵ=C^"ؿ\߷&Iٽy4ڂ%Ԓqb34gQ6wYRLA:9Z} njq˂޵uw<&@b #H*r fHקjrާw2À>}Z.WSANFWb˶8L4BR2VK_c>QLDW+>?&r,ݯ&.Ĥ tǦH%.'Wd^-\;D7b=:Rrj':iu l^ٙIpKC5>d:қ Ua no8B0L! -ݼZ3c $X<8i. F/rWNQݦt+u7^师"s3xq/iLoLz!]˔\*2v8*Bs1ss/IȊ"RZ/w:,G:t W5<.z<㦙M :|S*pQ GX-ݼr\; B Mt49Pj"49ѽP3 sfrM:϶ f5@JLfm(j1㓧8ZM[x94,ܯjE~דՋʃ8h.\D>|x=l)8%?`U d0 pUlI;+QN=j6&JY81$FW#%my%9g< 2aUf[U!oo\ ԓ[ &ddG! p;|x'7nze wa'{RT4d<_Igf|饂Qôl65E?P)TɂI iTIK 4top K0zΞ+I!TOkiZ jpVvمLAa~C|Y|mVK!ؕAV>ߚz!Yk=<`}>f /HQ6l͙z mN[fm/ P L3ef=A=,FV &.C0˜H}aWrV.ۈ:HݪUPUz8m?=S5lFϮVa'Ɓ/,^+n4Cg# Xd||.(CဌgU.0 j^`Xu[h1 s}+R*`^Ok ёGPO @~ƥ>0? ?< h5hAГEOl9Zĸ(z:bIn2(Eh:aڲ*7aY}S#fqvcBW_G8vQMm_Q;zYJ :n\;qȹc<>Pлz؛`\3JBiw7w>QW ÓB65b[)X+3'3F$T9K4ē%W v#w=GWY`cbv Fshı Z`&I9`m1 lK=ʶ9↩Xyh-/?@D/ {ӟ3&aqh3Awh]۽VX5KMT5Lk- +t(K|dճ=#,Z\v+a{E 4@e"M{(#[6! 7f՗X<, #0m<Ï&6n@hM l;h,lHY\ÇO㕲b )CnگGIɌ3L5-zOnU9}|) XhY7:kOLpkUl(ә sZ}#j w0)5~Py 埓tAp ZJ ]s>B@,.;dw_?#%{'޷w?IT57|Ƿt{Y>拶ߗW~_{J ^` M?:љKM?c\֮G 4TҤçç6eH e¿! f,'BiA<ТOS}qO#wp2ia\dJ2 1jG#1 ޹cO0!D[3:@Z OJ8P2\7^"P)D_,҇iEctծ_~] YU9|ՏfwÝIz;<"TB W+_irŸ*Ţ-Љ|n|>nXzjv{I/-变9#(zL t/_kg,OZ폟G "*bM,:9CՓ\r4"΋E?nd2("+apUd0U ss,b6cU~[ ӕvZ-|XcR(0xKXXD!0N5x+u>/7бb2]|- r|fa&2݅d|klĝvUC'0ЉD(Ͼ[jB `kbu$wTpx/ti|XWe_񙴹xfA[B;̍/@̷vomN\=hiּt߆X=ˡNe \|Kˇsak>աЬ`bdOxn"8!+vpm<۔y9ٌ*72CrԞv?k\%)ҨܓV' 5 >?^ Gg4Y# χ ; ?AV(s:իTӎՉ/|\:>Ov jY`XʙάJ3dsIe4kU/b58_mjFbrڱW挕KR2JW^z/#)v/S.熥7ci/;DaL6DMTG\5?u9ALOpR.c׸ʐq:f1L/PxʑwYpq[[ iL{lѓĆPW40q:Y[etN^6F?_cq(W"b 6_'&Eo!TФ$Sc] -ovSOd! 20mN`G_]ϾITtgzgߘ B ;#"h:zsD h 2lp,fcGaa*BO5ȥ2+Mo''=U 8"yNlڝZ[Ĺ ٬*7#"all; JN7LMHͽ(PʪaI tHT9S񼓷 8R"qUzp~Dlk A=lNi~[Z r(:L9[ ´Gp~谛SG_n(KӐU/PIs?]`W&A8Spӄ1VLqp[lqM2ۮu[fU:5Z+e+#4[t&s *|T8l/NgI /b /V~8eBc-޵Hr#w}E=Z2A2,ֆ&44ٕVijY̜,hAPa:+Iƅsst X,[ND S8mBqkXk4HN2inkO;NjkU!;"hjG΢@s\tb\+o%n[w 0Iኄf0q -Yk>Cp){];k%Um\czg{c@" ٹYiGL2%  *ěB7uC<͒Q9jXӽ>~+{V\,2|UƽD] ̚Zw6!=  E VfNj xX-kBӖsȭEeoxG75+:$;eX OĦS,$̥ȝvc}Տ4 }.÷Zݩռ/4ыr][?rP~ >$t"@-|cI3){BCr}Û_>Sÿ/?<ߑ|4֏Wc}XO~WL|⒉}%fFs&>Ld| l圾 ~L|壺}<|"\|۟rp{"b˛Ǜ{Njn^5G6x5}Ne'#ߥo^k1%jorpb7@,_tRV\Iً0 &RoƔ,֒ki{!P\.[oas5vE̞ !Jު:A򔢾JLb}cgDpi3t-ե$f/ !]|DWx! pc<ȳ)"u)ZR% i%7KmPщBUmk(H* RjW[x˜NO?HCQJn踣BXn!$Sbi fD51y)|Xt 栩 Z{u`E9ٶ}KRb):uY[McNrkj2Jo`|=zAשNKjpګ5{#p4'CҒQcxԻj-XN; NOFIBpiްV,ټdOPS٦̶h쏣-ij3Bm_#M- 9ygؚc⎱uĜ*Y*ձV:Ȏo>M=4ewqީQU.kNS3\kҒ"i/-CM`!͕;>K,uLV߲k;zs.\,kYZWy !e`rxlf^_:1&{B_5 9ѕ]D iZ󄊨` 4퍞 Xي3RS ΦgIWɇ烆ŇY\xe`\oZ2IOV&G^uh͵}[| > =Pfg+ !sG ,^/lÔ].eFo+qۘѭm:bQK]ךW]57uV#k(Z4gm@^-4I0y`qbĆ`C6m|cmO@ƛKX9~1̹KrwET.!j%!H76EnRhUxkt.u^M, ĝ΂F.//Z̭SfOD .jLc&f1UƭL^V0=e/~rfdIPjiX滴χXc:=bIfHG22֢֍;傐& 4kbyc3EPQ8bz WCȱ0(julJnweChZP e(#}([m@sv]GFMZHlݎ[rddTp3q ěC`K9=>rez[٩3UR44H_&l2Xc-4PJ줺YԹEEJE)oC#I.1Vv; W ?K[Bf tާCqq;ήm>|6Jl6i!N{h23A+PV}Y΁1p7jmP'R.7yI;|5wدd?_s!gr-7Fg(45W֓՛\8CY%m MSLCs5xnM =,i.-Ncۮdz*~h޳M6BO/Xh0(MUz=m29hum#erys}[B!|lLWDZ|L̹O?yBnWoHmWBxvocy?JLڒ9k^kCٰ ]`»O BtwՕlß?J?ܿprȚ#u9$G}ioɟ>hrMz5B݇~_x MyLOodh3wovG)?]]f>}tptk/}C3G2ѝsU@:g?[Ag'q^}"Ӹ@Y{8%AD=OyɊxd:C|6eԩx1_06_,HܴTB%d 1 ,T4=URVaMb @X%gg_Z_tF8{8<2LjFCR^ "ъPK \0&ۣLb5r&:8O%YK ؑf O^Fx[49PQfFF4[#lW屪i*i"ZKc`K rV#1h~h\˾f/ȳ|dLkNU!]< ^Ŋ \FSQ">#&X-e,CwX0lv)׆Q"KZWcD%Zc N+Yg/lt"$iN.\ru"G4ж 7FAjju ⬾0cyaB 05hU!yU5Z:. {<>CKg~gx|W=s{ {^Q/*D0x7;a^?~^ZVs Nk\g w/P4Bp5;$burgQ~xq?GM+֖~0֭/o;4V0"-r?%)q)@))>5m{|-nx RܹsO7G烈apǴso egֵ7O%`'(xHǭHld]'g.W7ɑ8U[BLIֈD%A@烬Rι5],g}ꪯ-htZz3N`Tk\ dL\2@r}sMluHe/ "HqvySl߬کc~Yv ^CJH L^$>I(i?|d1RM9sRƒuL 7%O!Z)ќٛ0$fe@8[}a HL3X0ުcst։cؖږU!{^Awũ%Є0ަS=DDKxL1 = 5[%n %T%"jqn u#G,E t8' -}4:(K[NSt+Y=Y70gS X'9EiQ Lw=ޞo8M݂J\͕}Tmo7#6["б5"X63-3'gNכ_Yx$a4?pD&۫P,q#UM?IRU# h*ˇgv{wZdB =ks4&sΒ7J28@M[3FUKk!&`I_:TK$ Gl \^rSLzǂIjE1ǢLZE ;nvtMjFGۣhFm{ f #"d kTlx"G)׾u)8oTBzO+c|8A%D+{RϽz')\Nv6tHvb4FfO!L8yJ#-m07 4H~WhܥIdլtmTtL& T"m#z2!;I $u[l؍d \՗E2K4ļdBۛrgo㌀P̈քPY25?<'Tt6$|v_аڬ䣵/lCĚU |;;`fd 6[z1x[J$H C^^ SFn`~T d(ՒgVɶ0n.cU̚^|]$f6c FPȬ>KSn[y!r6&Laqfm!B!X-2yNPIҩ2 \Ȧ1l@VdI%af$18+ZեPw2րK!\sNI4)dPS$pa뭅̆| hh%}Bdє\BQpS}ˬ8υ6ș#xܲKM)j]1~&SPjd3xg"AW$H W&鸅cF&zhF!sݕk`3mTґݭ( Zߗ ,DAʐ%-q^[ZŪP#m10#6Rv(U\6::c?:&%ƂToe/]hsN="r?{+٦ \6E.D>*|:o]Q۪|F ,f]EYj$4xVz7\=cm{ggxeVvusСўuavO񶫟֛x?{ÿy/_^?-eayݤǥ}O?uڔU%&HK3Ferhp VΉb_k~1O_r~;ˏ/_Y 5g_(9mr|x-~)ٔ,T;tov7x߸ɴ)~ZcX5|]H߇3{Nޒ8*%G[hthoƂk5V7}ѶGm)BH0aڬO-vqc=T2UB'k!,E8 (Jxfv趫?{z򌧱Zm^!>ܧ~X&qsʟVoɳq%yL^>vk{ګ?/' Ï{fIw4rOć5}`X*Zw7>qGb]v['u_1nC37Y~-C~sUt>W<$Ii'{ȧՇzuܧz/ϻojB[^5n_Bz=zcOz§>WHq?AbEE׻n)~vayh-ۆ4y{: *!崐TPGl .Lf,[7$yl(}9i  ؃7\߄EUgh7q\~@4̫6H"Z݁a3XޘcO/̨TN?idܞ{m?p|RVjqﮉC"7Sv>o[)cgZm9}/Δr WPGco3:1`:sXZYS־ϙD*Z*[j%*Ҕ dѕڙ/trsdդϲ68]v8E"/ܦgb%ZPJ+LܹLS}KuNx4MeFjry[8Yed/YĄl%^!cO0|TƸ;kзLL":ŵP]L;n " T/p4UMafNΕ|QLdmI{Y4"Qhf5A#7B%ɈTegz_|e32ZbBb[h@z 3mPYަ&kݮӚЖ]:گEa(_LӜ4|&Y::t|ТhƦŮm"BɒNVYTwZhȴFN M( MAL^٥fz"-[xܸKN IOShG#kЉM& tlP"{0'ą( cL/\'"@mFdRG4&LnqRO5)rrHOU_ى6$ [[{=zh1[$K/L!y"ٓqѦe)k4$3y*%,U^m,9[Նz6J9 5^E6Q< gzѣK¿>(E3d^;ߞ>&q~VDhB)d!ڶf_2k,K, .:WkWfOM! jP ŠЧ^qe{VЦ-ǓNY 2:Mzたr$Q_|0[>X)MzĹul2b(:{^%2 ftZ>"6D-tEq+(kqn~{ןÖd^$^o߅J)[ qji9uر5+Ul%pL}ߎ.L^7>.V>:Y)[k(yFk)vyYPC]9J&Nw~~qrNi^<@Y(y B4wւA6^.qu qw#um!AnWۼq5!B9Ŭ5yg7KĽz1|F 0YWքY[X bѷC=`ӗs]Fo =EWjx\:tof 1DVusePS*t"fY`C:zRdėU$>xl Ӑ^-e\a: |4l*gQ:|6ᯞ$ ??\yC^5Ss(7P0.o+VM^: NsYEzb zh]SU|?נN MY*i{~w)44aG@<-#y {/nUC?¡˲iMٴ{4-Ǹ8|vl+ WSfO7W>DU|7wW)W޿^>xww^]_M~fNﷵ;o?-Cd'd-VS}&̯F<|ˉse6$Qִ2 Z>QƤ.IO@03iz> cl\'AYCZ[qlb%3;\wlA 1ى$ٺk_ג`z6ޮ4( g{ h2K-O5+}D,11 xU].qdXߊ?bbNɚ<{޵X"0h~`2̞S~w֯k]C׊Yq8v9x?ޠY' X'")ք3/Ǎ^%j6||qjbrmtḳ+&Sks7~`]w&h69VˋK]>~͓rS@ջ.Z" *,y(n~fIiZD=.8̓6YeC}`FF +Ź,$5Xx`ejsJ*[rm˹tE xvx]*-m8VWd([|1q:Pޑ'_lM`TDPvB4,Bc#4fyn+5OckšqYj"MqR!ˬR(z@l_vY!&J G@︟ á@B] Ymۇ?%ca!PCu}z:}B"Y " eJTtZ/-t%+hf(Fxn#!UWc0v jG˜ ) RJ^W”4#2ǂ h=ȽCC]AVܭƝHZ9Jy*؀nF KJ l2./&d eh&t$H oҢU[h) \#W?H-rPmnVq tp bCjWe6MTx.{U[rJ B@_=}qQt#hv#:Ʌ|)yJwwX.85&'YTZCTvjz5#z LYsU˻F3F6*Ugz|!w )Vn7ED.nYIǵa &Ӱ7yԲνFgڮ\)OrN PBgw!6"K#m(j~9xcb]6{6,2Z dǣ|Z*R>Fw:AE=!PU"vD +=By$VX"hinCЉ]~qA;KYw(T;W`iecLnR\?lcX5Lj!O:3@&뗨cm \ZfLAcq-P4F-@)v~Q-<mGpF< ]Ze&mkB 2nףC|]k?F\?ݍ@\V^_) <Cp{9{S(^ˎ zmܲI!K}qwd7뎆DR Iu31GKĂЪocDЫ22)vls/ggL g>X=Ue$G.JWhCnNyDՈM coꬱfe_k %1$WI~_O?}EYswk=x)E]"OU`X/O?+Z旷8z˫{ݽokO^͋ȇ~ m_Urk_Ujo>gW?T5Q$Ɓb0%(]!"W7x7ӯ+GCh ³!ܞg5,vS7³IiJxP/قBd8}͎Ȓo2c<+G]gW!MAc rm.bsZZ.SӳQw7,϶8X6fy|شnʕd22&ΙhK!h+51O`jW⭛mx{'Xw[ݫҌ8)J2՚ut.:,²MT;^OK1~{caHb|qٯ:= 'a,.(h;|{[`ܵǞҫ2pSN )İT~}W-}^v6 bCY@t@qm5s>W:RCUu,65ThhwA"n`1Y#6f$ 뙻Q$ Ӈ3@sOܷ_GYEBi wK kxTRj,k[{k>E|a3٦BW:$U̪m}q֮{π>&h*LպrY߁%lҵBf["A7sw}VEnfC?g>k>:rl(<4ĭm_mD_P umx6'JtZ[rX[^6IKO 6."fLCeiZS Y_4(ӇeAvɜSnhw_\? NҚ9DDbHBۗF1B9{X\J+&Wsܠr?ѥAI޵c>4]<8QJgoK{/)[ϕH@$Z^SM½?٠]g ט,RB.톄]İj:BԷ?pa+Et DxRXKpf841'AFf~ϡQϹ_rrx`WiUZ7a- yq\{W#Gne+l,` ̼{y.yɪDWUj2ԒޗH0"T%@ Z\=<@i,1vAca!XBTwd'E `]F.LѠ: V)L"fV"BNUϝDr^,WU:ZrFJ@>"dtIQP/Qbg{@|ENjVÒ!(iAI WOF]S'e:̸p3=|-M:3]=FsjYxt  gqyG`ETƱR7#)Nߝ(j ~GSiIzZ8wRp &x[ʮ_HTtLŀRBa*8ԉӒnh hܺc^4aY[ uѨA o d^^ r ;gFj`lH@*nfMX)BP!zO3 lCDMx3*qM̖]0jX3TM,G4WsLORR~8~)tb6U|̴Т'ufgā[8P}9g.*vR;BhޓvuD!arI@3׌mdBgYv\;#vMVTy-TJ5Y%4VM 3!=!mѥ]7'" *[x!x;}4"p~!(/lu= [I:9nz+̺dNTԱ- cvCHI6HhOgcz"%ZV,\b_LuTFKFꀽ[cƨ ^KZOrx0gEΎsXmè%@X,P(;0&`MD8,'1(q&%ɋoYgn@[)oVv͠~d".% vw z"CΔ{6DKl@bI+ۑa$Gs7&]̌F_z ԕ-1 zeQ;*r^jhfJ&!oʚH^~m]%T*$Tn{ʀD }䄥13{Fl}L4aX5l7[~L\i2FrT7_ɺDؐy~V˛Rgko\\JtPVZACf)?r83&vrA e1[(0L]e$Ad1=h3+C4WLt6ިG:ꔵ-;Uo8EjlJʇ]׾IZF TgVs '"oHHk~YcZ~YC""JskbjIt2t|(C6s 3z8>+N '%EP'lBz(AEnu "(-r չ`՟Cu6eV[k0d/XVTqʝQc 碘;ǘ028EKmR-N?hfhWM^O+ aj2Ⱥo6Y DˌJc@*UiATAޫO#OV@Ze߯1 SKn\'st\R"?;w{e-T=,( IθP T9V=zR$P"SdΗ~VԣL%5聾~ߟYD11M]EߺZ^kXAE,XȞ[rMfo#B,V_GJ{fYfNpQCɔfU'קjT,~^=n?o/ t&f?x@` ADfBQI\"jC2w&H| pDQ8ʞ NI"G?jNm?O|#3 4+Վ{eDAioeSVPh޿l\{7 >5Y.=|L}]N zH◿mug}6ٲbTCw0?մV97}lzISkj|5֚lkLS[-Ԗoh=oۊ)oim!N<@\6.צ65Q6G-(Bi)RŢ頳N)AhaID1CX/n7k66_l6f x%,_QnYs|܏ei[vޥW#j^#jo[t~|ۛ-zceBʅ x2fzn,V|sF5@Co8BI&_HGxozŮ$Izq{|㏖nI}O5}j _-N{xC?=oH`։2+1<F:tq,@ë>DZ=@GfXPH^4Z[.n`{3]|~jK'R^QӳZ/XW/X-gZ9mHm [޳JKܩR|{蘆a ۞ ch2ٓ {;_K rM߾A"D hL6̰`c=~(Rǔ1#:#̞y ]_zh+ 'm]`@G K(pw:e0ކpI2,e,:4&:t @zUJF :&o=W >xnF4@|YU H}(1F6^9mv@1gh0hoS+11@@"V^T,v^fql*܃i_`[rn4)v0Xdi|D qLu2MtFH0Bʱc9q ڤVg9^'(0= Xv%FZ"KJnV>12gY2I`kS!A)׭V6ѿEFYd8qFZY;md9["3x)PT5 *rb.8@][1ad.ZmWϖPRDtU4=mAr܏;)At84 *7TWosg"'xό8+uD yn|Ai-;{ܴAr}A!|/;Yl=fuV:[Na@T %fx3s{]ÍvIc+x.\N$zp: Q3jx~hg:𳛂 !C0UEUJؠ3hQ$=={/XҌ||]#Am`QtNZ2r)|u9jV ` L ͎kFVr6KIdZEMYSѷ\u.=`}@j1t0;Zo! Y0\ 27UD )e]a 4F؀'>tKeȬOƺQUq:nL"ӕWbTA jw3TKD"0c;FQafYdƃ Q+rUHV8ۤJ`%V{럓N0AKYA, ARߕǭՅ 9A,F32I՘0h/\g*ʍ[>mmCH @ČB6oG&dv@_5ce7a@-8't;li+x{. ])N@\VKȫeٜ"Ag;:zس;d2'0#~1Vt&Dn(pMgmȿ#DST)ϬJ!4MAkXǥAz#EjuJ3MLYjHx?2YT@r4z`CC~y{WK͊2Ĝ ^x"GȔ1H ұ `JL_VvC0X挴f E16p3 R.!:x^Ԋ7i1ek1f3HΈ7`}4A[ f8\ru BQ8Q\;(Ą%/9*ϟzEL@\1eS,GQUZ/bug2eW's4|J\"(>>h|}WݗCM[Tױ52/ ;cOxw~KS)vUkKm˖#8COn32C?LZ&3sTVV7+XO& 9Ե'6>etI,*Y hz `z5*+we&f,sn7:=Vh=d N({@HtB#{cg F29X6$@j]ʨfɨgaViu<}z[Q,g2r0db#"ΪGUHcƎV眿wm;v}u8@#yDn =u>J{iݙqo]::kt%b"]ԃCb99OqZv}_u=Ch-͡./t?-Q UW])/qeoΈmӻPnflA{mo.iTzIN^j!;bX9PKt ݥIޙ G&lOcC`ueGúĞЧh]cCH,(RuZ ,:orzy)/_Ƶ0MP k >+/~.-Ƅj ʳ-YnQzcʋx(8 8+YhmzkŻciHZQ1{GGej&<.6H& yh880lS4~e72עKPw8ʲH<|K%9R6#Sj@kj}(+*ā9z $ZT07j٫]BuS`h9 |شr=0c! "jvD|W6/D#8pײw4vx _x ݻw~_~ { ߵ?˟vqn~g[?gf\ݜ!.*x袂?-hlr,TOA ĤA]gvH ?~:Wkht"b> .w^7_IIp#wI?><A 3!Bb>A qjgg)XX.N_3aRk*A,g0wwͩ $J^7N. ՙtN5sл2~|8/b^4Vtb p;5w0M4$Z;`>{\kFb- z+Y~YSGil~v] ś؊q2! ;ɰELXgS:#e]m[dIQC՛$hgato3y 4Sp^Yϣ;G! nY+®.ܓW~e@$9R4>Hl/f N`º;w`[$b5MϼC,I6nĤRxmZg&n:WK18?]T(EXUxciۼ~F W'_:jk(°y<>HS~A9BziK-dw[Z!I5mx'F?b4{g[$v0rtZD81^{&Ea[*''~竚BDZx]'o8 WW |&+:FeupjŎ-BB /L;_5DuDs/&" pVReAbF%:]yn.sz* uPoeBB'n5@͐]Ct!hy iFNc:zG(j`{(8Z_mkkpہ KryS;êɬdy +Qv3yW\#"Y?dЌ^RG2y;4T\I?0MGA- ;';A/BrB?]ǝk"z>BيabrmYj/J6Rzt.NmA ӰVtz+cXxNV ^.b}j4]04N>+JWP+%kQ.rSP~v8h_-]_ktDE&er]vέW}Fٰܳo;B5#C2ʂߘ$-=]N3)FjtʺxYqKPjbB5kX:/:SL{XMA){gaLR)l AVƾtM#teRMJ0x2]b8FwZYA[Bɼ_jrږY./WH~BL 5ʳ0 l)\|vQjsrMFQ\-UcKvJɽ mew}?|kUŊyѬ;oiܒ)UKɛ{M j{gp!o%s׺kl6uG$hsّVÆZĶj2Es̏iΝH5\U;R kץa"5hE*cB[Ԏg6S2JU$0k, :Myv)G\]Blk}{ECcw8siKt%)2[a>FP϶= LJG6.d@SlͻPS{R,& s@3>&{vp i)XG.yZ, ؕ(&{Ws9O-)bm/.=t5"{[7;$6+P yZq$h^ aNޗedR iRwᎰbjgWqUG"4D)uC՘b]l Bz3WUm()tRc9Iu|st,ѭH$ц16 錣Ak9mX} {c* L%b[@^oK~e(&z.TH#u7z U|L˕#TO%Ա֭;Fs7?= ;7n;ka yl|z{rEEcљK 5&+orV`8vC>7O惜;]o~|{sZ6oo>G-,pӧ|/{龓~?7o޾o߿'㶽{{!_s[v4& pI.jŔ cGB/zNvڷ26 :J+:XW` _G8߇sIh<p7NCmޅ2+8Dǣ%v]ǵ η}Aw1Y1wAϕt̶͒\nKF:PLR>,L٦2Wq9ߝD3R沛yvwibBl<[n̳l Ɏg{cY&ӈ_~StM$#vV) 4"|^ BW5`%Sll]`7Rnr1IW$olpj%HyCC}56Th!X5i  lnrmFmQTX(2p`6T~b"W'Ep98 !X nqh8(erk5#DJ&Yg>b>31zڏ|km("P/]^fDC.N2ٕ$.(z8d Y ;+PC?&Ђ)$ 'zŶXvT`o8^ǯþ<5ZE{K`N_Mehgva=VI^/n-M\#x {o`T8ξum姌$a&'$)Βmm^z~V鳕0/KY(Cjmto^/HT.1ώI%dӚ!Qn}Ye/z1,Y㜮C<] XW 1ْt \Ybؠz?u跊J>trF5?ts4anw.neidj%کl^2Wh}p:cw3@8?^)5\-)mq 6ٶ1l(~mzP8j@} mKsi6^bG,yT*5T hf$EJɷnҖ{sJj4BeI=ntBlNn@7 [Vb?Qx+N⵴ h c$a÷U!o OzSrWvRUP*^T" ЖAcihv|+o%9$9=lmݹ6耐D;l%zG<?:' ]d [|S& `_) Z69ioW&rTႂ /0b;&EFg&~ {鈘ɒZ=̐[.`[GH|MSoo=ͷT sΧ[ΜsZHhvW4aY'GA{/m27GXlր0t'JJ|e/쨰lDO[ne^% CpFxPslQQV1 iqأbo{zW'?4I5&Tl1r4KGtwZ-Ȯ7G:;uWj4bk+eN5u _*UjsʮN[,wY{$gC5AL>&HGWJ8v  `s{vIjZQ)7*].ĘKg)$@*DvHq0"EWo 6[v/(ŋxlQ@z0f$wrmfG\hk,RUQ]Xʹ8+qzg?^!R$%]6~VtI(! JWfŁOr]g/EfD5r3a;F/; Jlhy!J*X R?g#Ƅ(B RY>dox ->"q,U+3ضV(x?n'ZͶ2ͰfEvR!я@t~MY<İk :5܊h,|y 7r5HZ4,l%g]:=fD'61%wΑ {=}73gfWvj> iR@1;>K)b*b>1C)޿ 9\`4xUwc }hKSH_CTjlsdO_c31R͹!k=|d=d(g/>?;>Ghfs˓Q#ĝ\H?XsWx5WSsbU9 QM柍l*ň iZs \L*Lޥhgo ??` k . խ~^}U5>,"|ǥl|AG4OoIB͖:Oe5R"L0֯jŬj:KYuk߿$7RAklfN(ۦZYN[W\s%bvV .7fPϢEφtCa\m\>ap;R@P9P4Ҋj/T[Z9gԼ ͽE&j(17[msz*9Xo)Bɜ)J80:UĢu76Z_=>e] OPS of]Sيl,{-bjٜ,<(n<(hEQ[t+sȊC(]eg\"4~Eok 671{`(ĩƫC"cYI܊Zog*aw҆ĺk.Lx>O 'd/j[c@ meAG% ȑ jxƪbRڨd,%:Cx`G JSG z5Y5GURY]rvmG}? 1*@-;);rlY|Gܕ`k8HwʌbM9Ku޷t,wv9TߴkCFl+_.v&@ *vhv2*Yז{{Zj29?jݶQI;R^PtLi0QlG]1۬"'Kr=6-V_7H[H}*V^#,(6Cʳg_`Њʧq5A)N+:F568 >Gl4<<5m fw.\E\9LKZa98]W%-kf'Ri8lf/y~" 8`iS#$brkUA&ϑB}[Fl!)cAϲ&CFhޠ7>-*q''X6KQJ=+塎*%;x(+r| rr!U }fssiXݩAr5;:1N&XvOc]Uc AԃyyP%N"7Vql25՚4%X٧:-sp)XFԢBZϳ~b mBUXV\J7tͦ6-xdܹxbB!T۷z_ o6>Av/ɺsSAv2pi) F,|v^` MHX[ '}CI,,vl&q4nVP| Xwרm|'T?Rrl?mZf%DAsP5Tv W,Spa3:Ǧ쭕Zqm3t9t@Pnݩbn4‘Mk\duB2$Dq#&PO|VmVlYi%F:Z8 9)I;5K2hrJz);%lh}) eiӪFhrxEZ0a_q ɑd^H6SP`0Ob gk|jRAW$2D"HDMM~ch[(zh2RElE;iٙ~vf)&s(X5'ʩWtW׷\ǟ zc A ̤"[NJ?o 1Y9//ϣn.R+YQߤשtablnc9{K>ˆ/Q,ųnhIʬ|rw"@RnaKYM~h N[DѮk#nDò@aϖTFt%;y6fQgUS<֗$쌂YjI73&=bOa_zThlɋ>𷫿KwḂ-7_o~͇BIeymyg ~#FI7o~?w;,OO]ͻo}o*>3[NwGO7ޤ9=?czO5۟8m~ /?zSO7/onۿn'u*!deʚ8;&"UN 6"RfuT죪yr-DeeuWבU旊}Lx2Ҍ1d*52HQѤlDŽ9/<)Mj]3|2fm>tmcx/\ avHI2Oװfz>]o4W|^$U5 CHwJkiZoߺXݮ:戎J6,JPoWmR:"܊$- vj+T \-kCg.)hN@8$6aSimһtᦢ!\gB~BMeXdok@4G# Vx PAX`T%Pi/cb"Xݩ>G%E˼+iQTTJ9*Kِ֢S E +$\8@}gIY5lP}ِKuV|r+¨9#!HQ]xEEvKQ T 8@q?-ש7a`pnhE[=r]M徃 U 6Ax5[qNU!t&Q{NZhg uGeJIaa7Ds(ptK7]0s1$0=u2L ɬ/%z4ut9fs#Zt j#)Yܦ{NFJrؙpp}Rhk@'3Z%zQǁI's:,uQ[=9:9a6ܩTJdT/+T4bgpT$Q^Xaoy FN >3#zJ)msdJ,b60'(+z0 ("G)7c_m/`9LYWѠqsuxQlIK.dzr NepMIؗ]d#l CQj+ޤ:|)-T QDxar<M-_+Ʋ؊5IgyYhCoM$m_ft I;" 2oN^MHze7],~RJ)w*[Ga{9bȊVK6*%j3WՉUt֘PjK&wme& GfD]\D/tsTMk+sRG]Ta'aE Y좿pK\DZS1`襒h.:$!Ჷ (,FÜTes>hML&o@)Q-LjS+LjǟvygAZ>56-ҼoK|s%2ЙfވIG&!%.FʵԄQzu9?T[?痹nRߪ̬km*~6KgK3_W6e\r~IGJG..I.Z`}e./{xufJl3o|m 83+?IY^-.A&o| >{ifyQ55 Uo~L]S:|~nNғ'ߤlٛ40c ^)%qrߞ‡ɏK8XlNQ!9k٪)+7x_\<,fg}zh$DT4 <uFl/gׯ)kD!k%c--֗XX!Qv`]~zspWCNr6vẇD%=i+v7ѶgC>ӾW|׿7k\_7mj1,o?խx;<>~ոuKKχ՟l8NGr wס= ː}j> ys1v@nyF-i#r G6T:Ql M\x\Q~+tWѮ5<м4g2G0&<;x CƫT; )zB, ޏVZf[(T!2s)bw+lwWE6e&r/h,|1;S<O=!2ÔL)k83pJRl# hwxK+YݓФjZgxXRF=?~QLs,`/XHYd٧8)yX:!. fZ)Bn!DB` u_z8Ќh7=ЍqP#HiUd> _C5Η,Ewr:]jSޛfk>? o *z*Fa{6ZiVx±TnW$RyDݏO&DΞp$N~O~}"vw5D3*gB-1VT 6G$YV32;W޼_%p~oy;;տ5O?`% ' 3Hn5,wzȵ}sbuMq%qUO_\A/Owm+}%p!:Ja3v.)eJ4ڟe-%;7޻z- оCN.g>Յ<|.M1A9qZGʁtFV…|&z2!E =3\zudZ] z9YS7CZDC{ji&{)!wS{mZPyfή"\6"tR5t8D2a?&9 >Rk%xؚ+ _@:M]HT/. ߤDD8LʽY^sCźRTV+Nu&J,L0?7aLE%y\W ىwpy5D.)1  MY{|)'/G{5|9 7_4 /<ްoT!IJn bnZv1|DB_!, "DmGHkeX[b*No:f1>dKg݀trc2}͋ɻA˵v%8?' cj&B`LbEBQ8Nx(db|f|)x*n>^'L_n1jx&d~b`ryoӏ%E JW1Aק9ۺo+9`9s;Yނ)rW$7I/$.>I&>O<|x:n1pdi0#T#O*5(jr&`QPHi2xPJ;G `Cf]a>^D}n5 5Y4E3Y4LȔ6uh 1BrJ'eDv$ZILh2LKR[ڦŧkczuD׶wtmR5KېP)5dVtGB;! 3244kCB5ѐoǥV' fN;Gd>[kMֆ%?3_gjF7i"&PG@=Xw^c,!M{OP0!N3ygP_'u<O(Bt,X'"!-2$Xpƣ4M?{W޶eO|TMb7Ii紝ĚuH*F9fdJ!@[Ē ^ kh,mJ*͎lp[u (;H"l:Ȫ]3pܑUW7BVYU x?s) (ȱccJbfv"D+bJQ35+2jzdSoQקn ,21a8ݢ׀k5qC?;7)o%GMㅅr,oD=>>!/W{I(`4e8"%,)z#WDgr,)eƶ.:|BZԺ)RMA}Su7QMQ_ijc([k݉&,iƖ0=At] ;ZSƏYT1@X{2X7*HlnY= 4"?n-P{kfuG(' - HgnmlTGu{ֹj> b|!D~ßd??abVZ\0RyQw!P:[S2* Jٺ'sj͏ yvyy9'Fd}582%gtLo %2tme}Xy6ChSeo>3>[r!Ne'7[\!ދ2p&r5/.}Vv>}fHNw=؎"iG mu.r?$ݺ~w3>]ijd8NOteS1KRC]Js@ ^$(`v`Ndi?zk&@BzdAɍ/`]?9݇ }Z'sB߸C:z/"ϣkE'Œ=r˷8U;?b#ZCmo1^O؟nc, D Y99o1#G XOmA݈ľ2?uCX-f&܎L\ 7pe8oıRtZm'P~#i w#4GhP9Ӂgo!sIF 8 ʌP9]3OWUieH Y Q"| Dׁ,dwp猙1-ǡeu\N=+ԴY!0^u!C4hr=[4g9kn8+=xݞrw4>aQI0>=ߊ"maY.8|IiXfaŮFǧU(8ea,TLB0 rcQrpK `hu'8'adїoώI3)d ߰ "ϣPsl=SpiOS\/Bv \2ë?80_ +e>:/ I媔V1!pKR'Fhɏ|}F/:2a% 7"J hϳuw5beنY)qtCf0.h1Kkc)j=~yY=N]䴵M#}cpC.[CjTK߭rd L%Ư3I:㣳$̳"K9 Ɔ]=q_4GfEt9ѡdK p->deR4 \;ɥ*\9ISŹ(okMlWI0T#L~x&OnE|3:&MU\ͼJcV&xd3/%卓15.6vJۖٽmu,yguZu(Xj P]+VjUZ d7c(aZZi]^Kr׵Fsm8Ne;]GUPKӿU{Y˾ϮۨjB1֞X76@fwuE ѷ.'`ߑʋ Mukl:=ΦɞmV}|Vs[{U&նi5qk*jeB& 5qFlLgy6/m ^ǺϺnA:d*4p/Xx*#G* Rb :zevX^V uL:#>ٸu' k")/~X ǎLأJRإA aP ">q7ps+k1| Q#i H}`$ F`$CR R΍SKD( wP`zC!>_(nٞG@хt cߤ$8N0̆#Pb6 )b1b!C,X찱_o`1tBcxP±g Ǯ(˞JТ-,pn$6 Sxv"vm˴Lg OƇ Y;KxǐoZBEFikvȣR5`%p ^y:> 'ʒ/uTd]woDy"D@vt]W:=ć]C+_~x2]+|>pnxׇϴȈ<ߣD0BzPw8S 2L0YGpL{y<I"̈X$*|NCı.=05DflJkZvl>Rتc~-uK'@~ '* ]`bv[ jD0i h yqي[:}"]5&SR[;VR!J| ax |ߌ0&NŶNxg0:@> 䃐B>'惈67sPBesPM@B.uRIstStjg6(Р+:AgVtl("o&*:AGV.ԽJ;Qm:@gES tXlfj-L 9&I ]7t.*KB&9BUNT %ݥ7o{ V4&}ZLe (nxml o& P4 `J Pz VUK_ʿŶowW-vMu]Qnk+Y\K?bW)}-{+1}RtbbM|>BZ_`Pr-Pv}0-'rO[* E[ ^zT}m :VWSJ^J}"75[I> [7njB”znlzZd=>1,-[w8ܝEB B;b,<ˆጻa me@""DD! [qCb >(uhtBIA*VAbY?|G15|G1(rV3+ŅMGDa!bq$SK8 !sxiTRPU$!Z;ҩL #W3FqM\%vts@iIHZ!V$ɋ";0% XptNSR0=)V?$'=hѰlkжjWq,*g)C4ê:.cR2hIޭg9Fg"n@MԭeQKv Z:qȭcS͗:Mf<, W gTGHbwȤ#qDvۦLMԳH#/AZi}.QG2ڞmub8솁AAWA;⛾I<3rőGix1goH!eR'bOĞbOM$չt=tK++(Q{2H221p1(10 P4J>=L,nǤ E#L+L? xnE ${^bOyu#$L/L/1O½b4B#ziL­,,X,,++8>Uulw~-w5UI*Iy4 tg2UJ ,ŒI_?UlKll^ 6gT:Ia-6B |y˼}׏wF"\M'N[봵N[봵N[:m|o L9ٖ|o&e+wߖ5ĩH_;,"rl6r5!{ݗh6|Ս93UJ!TvIoH3߳LFq$sMk;kF§vDy7y7y7xq9u-fy 3 5am;ZGmKcP9- !- !ѯ jZmPi$3QB'B^ Jg* Y๞2ٞZ0yutǧz8Infy. ,2Dm9GȱȏaBFe/z7`- ._J}vQ,Bza:wOYo@`*L.h|~G_&45>)gR}?̎}DS:~1:1:1: =tV:ƶM7mHte6뗊2x(_zj@iY lFⷠH",|8P9dLԋ,)72>G | w6^@-!L[ HzyBCJm!}/!~ξ*_"3a6 ]7"JLK:P1F,x9Y5-c_Q2~xbNܐGHþqqt2X]FWhf,b4&\] % *hFfdhFfdhFfdl#Ci;#Șe&i.!c qE.cl1jGgiKA5 +֐ja6Vۊ_eʷ$oZU{ ұ.kZ':`aMo/@}X< Z+Dru.PN[b'O,r2WF(DݓZE.Y*r'7Q&hT̲j9JȒQۜeF2|Kɉ\ˮa;Y[?>,C}{g)ppEo| T#o b˛PF[seܞ4;a7 <ePDejlWثAىb$6̮T?ůCmlXNaPHU>qy!*Cts'q!"iR4ş@-ΐ(AR]Ta³3Qt/UxWLl>jyrެlA 0CeAH&Iɉ3˯088Ƙ~B~i̔t7`,:+`?Xٷil2ᵸ#:ORs8^C`cPH"B̴ ٪ESНugke\e\eY.R]7Ngkd28Uja1lʐx nkMj[v-e-]ZRƺ>t[{XQ,oY2H&+}MG:#BαααCr쏵Rl]6M,yj~ZOˢqp}& m Rs 3V =CψV:g`tBcB@!(T Fc3hh&!̥0MT`,ƶQ8Ӗ52ӤcP\hUCAR|&` E15n\CQk̕ղ+NM^o_tEM^c|5;LSͅ:ooAԛQ1Ƣc ߪt`47S@*(pC'{ @@=Ѭoc`ӊ7 2#=+nZ`p>BLo(z=)(xX7昑 Ӧ|72Ir#qAo z&~Jߘ%1Z@O`3-pΦ rTi?>pf{ܶ  Ŷb+lʈ5chꉦhꉦhꉦhɛؖݥXc]2Xkxx֊)Z;x"&nD q %0Z M%`#@)%P: `R}Z(؁s h`j`(`falX F&Rh"&Rl/MR Д<__¾.\ <Ţnjϣ(vsn-"2 8AO(C. Pd0#O@pTՖ(iwzt̓d=L CCk6J:ߵM[L,dqd9weR&”,TC]qʓP.ʽQ6MqRGS?3U7 \N<:/լ>Qs>yԒk7JLjZUOOQJ]O,E 7|0!xvxwٗlKb?Us~ϱUXmD~?nEY{{j>3[5POR~maF~@҈ OeW 1 G;Pڠ-D'H6Bܔ]`Ω ] ͥ+)K@6#`)0ߙhkEk:aq񥱬R(5 (7`eA9>Jo}mpk@%f<.tWFժc2>DtWYCܵ8]Jwo\ScVr]Wyz Mne nw+V K1opKhOGG: [^0jWUtDߐx .F`ub|G﹨W0!9ſ%no x5bB@'RVo#4.= c.Oe3(.)}gワ}"D@4d6XLR-aZTt8Sb v/F3]d]#yv wG߾};60 x|ۓ_ޞN(J x7K7ğ3W#@^;4a4i*=a(9#=rMYdgieR5bʣ@jB ```%:\ Ao YZ7TxAH2koХ͠i?mHj0`@s a]J.4@?,ϼ!`/:q$ fdW؏}o0_[1{#/wѥ@/ C|-cZx&Et Yd`MQkz8vWZh =L"Sf#SfzSۨtY5p``76+7ii^Φy9ZFImcn>-N빌DEJ-E448'LYFGs.bJ٘)At ~W@q2G+~yqp=$;df0 .>`8Tlb0Ar4L_|xu~d\yTRmxC w"!"đC=ˉ.l/ŚQ1ޓ4c].[r㬟02z:LZ.tc-N%2m 1tootZn@iqW%NV!\[ rqAZ.rqZ.mi7|[j7ҍsK#q'did\ؔsul nz̵|6BM,q\-n e?yȴ"Z2f^Ji5ztL:>bv .EA"[ۮRpۥ)bצ̉cLpߏhȋb>;Pz>P6c?8- %4y1$JpRhWחrecyyz{Ѐg>iĈ%B3±mp߂L+BB\<uW 뫪he ɶxY4HDÐ )زtM'қl&\Ǣa. ,jvM`B^ɟ%Ty Yo{}4@;;"v @5}e^w =BpqeEXf'EDzqBŢN1BPߏ/ˆ:A̩E?qюϮ:>(|*[ O옑Y1[x!wE,#6 c19zTw=04vR4I7ho͸>]::U^p/q-B-؂l8Q,g>ͳO([E<E;Xcɂ3pAm$δ+ibr@7BI;W=Ky\%C67.G!6,g"P,Pm[u2WGVɒ bep+'qGw|$`.-LQN-A.zlnk ޹)ι}gk-csmXq}^roiqnj@Cc\mP1(WBv4sncmú^ 9A=زo^ \{@ݏoaQ܂uAD@8W!<>RCDa>.j~!ױe6{T®18We6EBu`P \ctn0*;C5b f \c 1W[#M_Z:GEOis0 uMKS[_,vц96G9Oid:(G; .`;Tlq..Q#v0@Pa zLX鰜Y*؇ӵG9E4QNlQNP#t4ą)ҵ>'7it @ܪ QN5՟ f3kX:G=s؝0N5_z v}sNOb#0Na743a9jQ`CT]itUr]?i~6 pWյGE4Q.ؙﲄ%z})H#w+Xrarqi O@9n8h6>]Xb\bZ` 89Du Q ٵ*7Pno> kn2-GsD .ui}! Ldx7[ 4~z1{Ϧ3 ]#\ºp_鹝v%(7ȵ3&}g9l[cz-́9h-?Z.`=B1sxIDCS棑wea%w 75@'W8'[1 >ߦ0auiŵ,Oxn`Ncb1# Gb[ Tyun֠VMjU^^r+d;^Kޟ~,`oE)ԲD/OP]~ 5dV Lǣq:?\jQq(64Na-[SRT9_]-ƣVySm t]Wtm^]ً9Gz\Q5.-0*sv1[*L>%p80]S"i8/Qtl1 Bwo1 . ]yE4"B#b4"#o6n c#зeFWci+Bs<Bwo/|2̡jT#6ol)lX5[X":>$@:5 Qp6v!fu>= 3 ''x,znjruloLJƓoETQqDD`"U !Ōr%hʩp ^/.eP}wnj I 9I䴽0%5eP2'wrxƋxq/.e2;B2^\Ƌm@f[/.eev'@ xq0beȵ3&3/. 12^\f؋kgMxq͘Y2^\de6e ڋxq2yhk2ge{q<ȋl52H7 IlZ^dl:^K ^K٬@^'eO WaUp6M _NW碜fOC3JB-H04IxZBsn(TN$L wsVb-PFž߽Vu[g#10LH"EG8,i3 k7WƼ^ 1Y vYLי:y[ywSGr|63Vr2yw2G S:$ 8I tsC$œDJ%* %@p+> -pjA`+[lKWCNFK z @:F1M  R tC9ܛ*6VBn(hb\_Վ!PmA76P9$#n?cW N oi"bZ4…N '-,5  x7*(ѵ!g_XqY,Tؠ.e@.nfĴ ٫d@NYRaw#V7;:`|GnGx;qFWE!,@.oъЖD(<k\Ӓ#G4$t:OyJ 6AJL n M:|#'qw|%Z".DAr-J4&97D#ښxP3᭵-PW]QFO~Mx[]LgUԗtG okq|Z'ݗ<;DRm}'tEWWŴE\J[BPW[ki|`(mr6Z@[Ȅ:'ҬF]ꈬUD:2))2:ܮ~) #⧘V TvƦFjc5R[w%i"X*֨" T Q@ڂ\KYcADW*דaE7coj_R8cCw%wbKT"+P1mQTLJNZb`=UQ//R?N<$H1Ж)%ł]zL)+EwKq5ίS9JU{ZUl2<`pq(\Ț %:uEZSW,sE:{_ xWʨ8H|$K=T7TGEBWLSسEU1ZgW1h! .XQUNu\m SGӀb*9b.t EttRu!mGolOElɜZNijag)uX갖BF.ȥJ p C jxu{ê(4i(0,AkEJ\x.U\^D_m?R'Kf&b !Y"d.ÌD*n(\0Ƣ0QRou5nԮv#edu\g z7?>x۰?>V&37RT.mVg5ƽw KL`I1* ԂufA1&C8t5nXK=,s`ku\;ibveɰ]] svv7G]Z?k O>VHjLoV*al-P#tզHPwK[kry]ެϙ זd}E}~[;>skoIva-4E??ZS?_\7?OT¾Ү#- ,#&a$2& FIWwAbj7$Ww..c@ݶx=nXub3 2Hphn(rw@b,wÆd ׃#ĨO}=k43ZA8n҄O%vYԋX|.Tf)UW4DiI)׼?uuQ]ܳg-T۰2DiK`?tTjtoL?Hy12N3$cX5Ϣ"))XtX1 !=ʒHv8$J$-gX>ܦBu't\ {G;v vpke@W*zǴLw9BSqxS<| v # yxNUrd^PjcQr{K= tn(Ga[@7wV[TaS=sUvrUxhozQqrws? ޡ߰9B0s,7pBwm,+ x7xe>K4v#OD;:S*_Jr$GpgNzMc(yeah A3IRQ4yLhi+O|)k+OBy"}WvCsP=_$}ՉV(Z9A~qU'H#D(- %KXTKQPZE_rSNIܫ"+`}9P+699Bd-^!n8@*C0n  j1J>k=pu*+8@P8VkTp(pC_<@vzY\_qpa±SV1q@f4¹&SVq@*xKUc9cA/¼bW*;pqp/nW55 7pҥ R1,a3䑐<-)҈s.ԋ!A1{)1ѫsQD:u4=U{)mB*?෺[ݞG } W鷺=XLC.C.FC[NްKg\(*2E48aQX(?/(U4<+oil \^]σ7JMdÅ|pbb-n/&~ڜȺV;"wevyކ"jWt8{u5]]tSj^|zfE4f_e/jvmGZb~R]oT/=Z 5B= ۘ7?`Z|n;mj2ټlۛ엩_]ZqZsso0M*i/w|yegW+.gϵ nfGJ/gbEMUz;e%_0va~`.qo0N:['{a )ay97˪GDj8SsPuQj-JhLjg]>8c!}m}ە>FƟf/=zQv;*x'^~flZ}-XÓ;J3p箜!u,RaXjLJ r!tJ(JcA !銴XDjٓPkIА5(r+ BtI(4ab{hh5 ZlWWTl!“sPFE;L\Ng8zvdQS34'nq}hPK%`[5[́6'=˩A/JNle#L K6.4d悚w?# |S禊hGEy|6 >=W >Nʻ_4<4g1qj09}yE'OPL47Ft?}`@+ж߽>Bnn#yg,eQ}v~ӯ(sztFr{g꛴3M))MHmI\dWeN2po$YL %NU+uFE!Jb}~緾noakm-(z$&Vd;lJoHr^- \/NO#8o-߂oomom?{N'JŅIQ]<84$e/bs.2a:4ƥłLoM|L-׈/UL}k޼`L̿Zc>9ɱL0i';&)<۟ό@fLUhJs pRZc2~j.S;yvD[~9*-+3Jlolɗ&z;?~2#i*ٿ>vӰ%Ͱ~g.],lX@= fW{VNdزB|yrv/-IDx)* `lj'&0`0c3!esV,5k<2&ЂFc*s\e b򫹎H8-Aֺ݀p25zN7y.GƲNۑw66C6|b86xrZ8X͖qrN Uv,>a~ %Ri;lG20vj_2-GsPjO%[r'lF'm ܢyVI$S2"RB)G1'` )$fe玾% I_/ S$ xyoG-@8rGg'*+-zL',晠)BPs,73.Oz^%Z{ہ9&Z;\~\+#>s}ʵnt:LH8"h)3PR^$B:eHiyUgD}޴E) ]H%#IJ]/hN *1+1D& eiktvBlp(Iȳ[{YyiiFsɵi(a|ݘ')63^#);73ucauc{Uc~/+cđbaVs_4/; ^RfYN9DeY"SI<"Z"%;n4_}cϰf̒5H!CJ#.H;eOI;7yq<1A m_5b4j0SyV C;q>ՈGz5a C] 2l&wl[p_̼ CUkhtvbFm<Ǔ*rgˡ@ײ.?,O0>7RGiт7,BiRg"f0^ϙ>yOŨ-}lc#,^'zq6P`%e,+< ͒0TGHQR$)G }!Y?Yj'?GIo(I2ݜ"nɓ%ۧI>Kj?}嚆1/&.卡D^^\0YET4yI& f:\Hu ( ns$,LjZ#3;366dX%`UX ( Թq?lŶͫSgv嬸 Gx(̴lXmcD͈֠z|Q33RifLmj`ټ!cYe<(g/F/ >h3}jQL;Ϥ/Ӂ3=za~aMi`r]p2жk7 `]9j;i>̴^rs;­yf7 Y>`fGmoYu$2ުϸ͉>}4l[5_5?s3GeicP9F./zb6YY4Dz;Eene67O20H>N-:zqh`0RݶvƓv(*rhcǟ߃|}orށց}W*CƑYfzt'2A;gg/Y}rqU9TWt9@2N?SmSVә{}=5 4vXfם p>uPhͭ4l#a#l̃ͯO\)kzV8~rKjӫյy:M۾cv\ٵ!9 2\y0gֹ7Gu;(d|𤕡;67>Ѣ#W`=jt tv{yk<1=rZFij:\~y;\NI]s ́vgߩai^m_uU+}Gߩul^prJe7|LPW葫PK\hkF#J"J;!)tlg5%쒔Òص;SU/y.o 9c v[{mِlpk,Υ: Mlg]147l]HCR"a1(8a)ORZ4b&)0VK¶;F,L0jK0Np_IjD;rCM0N;Sa<~}r'?AnQ;cɋ8Cig"5HD0J.DGקe#DNMLW3Uإ ;n)ڏ~[W*,ȖD$iD48öyn0RJy|A&ס÷WI!xwZŜ(l1U~AiGgz֕qOZW=vPNH0.4L1*J)Vsa8_|q/qlqq& GA4$%a$T==IvtKq aC2ѭxU|f< 5'[z`0j|a @ D(KIQ$xãYIf*2C8%I93(Y )}C:>txv $}Сt8]V)CWG "+}AiB"J*R0-D J3j?#1G >bںHHDEhz&طN'b±E /#}ķ.koby =?@d[Hw@#fN ?iȈh.(R$Q)4lU BˢHʼ}e-hG8!nC0ag瘛5K/!3g}(E~r?C)`FO5y('2ϩ(V_-L&*jjjx0La'F KB53L6`c\l|?7r-g Q·}m1NśO" gG0qIM!~\aN bx5 BFP/ŒCؽTn]04!03c '?g%X~z;Z+1>rmF0FY:f}x3MՠG9Y+˜6dzbX L9 &3󫃠iѴ61\Wd[Y6񰼳?fȐuK(/5 LO+|,]vxb';&y>(C}/gHw$3Tԣ:TPF㸻V,"fiD,q~z[ 8Tu3 1Ɠ*(A&;ٺ; eM'b]xzp#Ou}w3 t6aYu4 ⛪n.yif"y93˪IOo L#owÊmˠf,?u2k3puMdx3}m74}Z\L5#2IX&n!Iq&Z4Wb1K2T=Sua5~RMi$\FF",ٯiXdjh ƞ%QwgDM>QCTHct=Q={Zƥ TA2IFJIIigQYx$cv5VpF2I eRMρׇv5(5"O"T,&[]6l{9#$w=/Nq7 }3EvG8WXe,>v>6ID&v#.Ѝer3 uLo[}ǤcyLӗ}YKfwHa5h,,FY J&BTkⲴW)vn+~(3Ej 1˗7Rtm:i})FHq%ySL)i4&&5\E9#ō驼r`kə pF drnh)ֹLeTS[iD:/_Mt_|2y&%a>n GL; vL(Ӽ;nH g<[^d W?ٸxgL~ }X̀z\^Ks@zp? g]Ěk5 AD9bT5 Ox_maO`^-Axk9X _#|&k {> <~$ -S5>ɠִ!w;Bwg0OhN#@_VI6p'e񅙺>6y 0W(o E*ebC.#OR) 7[#-C̺\ OiQGgTਦH2.\J/BUr)n`|f"xC`W}4u+70n^A͎t Gj\5'{1L/E[ۨ? ‘1/`aNaCv \4ўĞ`?΂qp?}tB4 )X+-@*?eUC;j)hG֣mԛJzπ3; {!@ geBD3g3+̈4c2; u3EKYcKo&dޔytγ+ .G\L [pOG X/L^r8ь¿|Ͽ 쏗$E^tx~<|j` tV!iD".HC'wf.uh4$jߞ)Փ՞ڣ?sԄz!Oqo콐y6UA+|8Q`̍ ? B9@M09dHӹ ͡Y o_= `!h;V7 \uXB5,s}{W \ GE'6m \=!2!dZ(?Fנ,dXeО;ʣ$Č*~H޽)v\I2K.Xᳩ}o[b[*8й E r:N\~MXոa ,OH ?^i>3;tJqvLrV Zu^hEO7j{â0]3 G +PɊH@ӑ7ijQ_E=+7]\T/_傹='ն;Va`!sAeB?Rh3 *6O_r0ѪkhڲNYV1!.@n6s3@5i{TM +X:YogߴH_Cj ŇNvhf-V-oS:1q};}pT+DI427 ;p5yAҍt}^}c>dv,9iկ4|,@sO <i*TYRO,V;+ ƀb49a"x 3 ۳i-MQ׃gnё| =:*=^mɵO^1w{Tj5zXI4T{x5a6zۓ&ɌcΤEx똧VaR(L6 cZM\6N;tkfE#F@ ]Cz%z|ĸ!||ֻ(=$%{Ldal@4 1iHnD2&,_7[]Nnc'f/ŝ>f"ze$&cͨfi2}cp*ny.D$(=N)A)cY)mvc_b1{ ּ| 8"à}a_m#Wm|צ&DllxIhߓ~{J&PHzqxgfRQލhY*˪bU\K3NALxV2_6 uTu%VהuNSjUkN ,G<hzNs;2*+_2<:W 0ߙw>?qI'eHq*02aYf5Mgbnf2$0r~<}=H~_O[M_=JkM,09͒9+t~TC$zIWI51!W8Zg4akw4ꖣ c *Njz!qEn}nܽCe {74nν;r21d4jr SQ[*Db|SZ&u2q@u (|nOo^< 6.敨z p[^^]f(Bk:]R#$+ɏ},<<^K_y,y4&^pYPLrR"&njsFƈ} C0V>LPQYs"iMuy"Ax LS>?C1",.Q-}R7Nc+3~\}ɞݯp3 +l&h5+LrƏ:-.ʓѦ*aF>I-ՄlT14ye KUm%3uI۫fp䂔kf*3"1-e*߀j"xN,ừAeFP'T,a#|(~՗\qp&Q鹟TyoZRy2hwo⻖\8wf;kݝQwTbƬI3grI/o4|k >WR2n32F4=ӇWJ$w2ϒח1l͕nkf(&6KD*-UQT~g1Q:hr4tdFއKN߻a*S#9Xo L.E)I2DfӓeXs˿}x.yl>ĖPݴ2 &܌fYA˪Tar#u@暰E{gږƱu^:]@͓ONⓤ%În#x~.#RIZf^" HZ=ؐHBvB"My'"<y'w?xtD JbJ cT\kUog"wsG~%˞y|~OULIN\:P9ԳǮv\TCz=uځ]Sv\@ځd5w)Ns[whד^: p9z GȞi ,w4,3zj.o616 El=G(;<.֣q~O.faAoPȕi+~*RaoyO>V6XXFĖEZ'FYBj# P<5N13@uΨ 17[fzNi[Z4Y9}[f7S_ouU~7ir6g̮}_`怀<ʣayx"2_\D0?4i&")7 ; “CFuU0eu PBUT+kB(!FL&3,YF(BHb.t"[ a&? /T2zT  <^pDV,r('mY\Q Y&߀ FܲD2ܴ FUXFX&WkKUBu 惯“,eгݜ {,9hT1đ!6Ԓi>`C)֍( u9*xZd^Pɽ.Fn~8x˧˟9$?,͡_WBమ-zOe>8sb|ʮuf+Oe~W8:h#p" )eE#T/ gHse c"5aeĤ>?n{TTgB?qL& (Q"(F!Ü*(@*Za)!zDx/ ʕ+3~Wg7/` lAYr3ݿHY;@ scI ?]l 8V)aSP"bٮWm=ݘq0^Z:`,e{|)/ Ժϓ3Aa٣];ʳgiwBn7hI;fF595=VE *oԽ1W6iKۣ%KsQirT#ذr)jTc SpgHi~G/U |(ϻI}3e!Jɸ[+&3a<#aԂIʿ)Aɾ5n}$e3pH5kf5TZ֮sOylM:DS5 ŕ돒TaMS ~[> 7Kʵu(0gFI N$1id[rCㆊ!}64rˢMdS֠"&RPq+=Ow=?h:ΗkՉ縑vlw(+03i3Y4\XiCki,`+4bk2$^'\\g˅a/˓ 23o`~.V?n]8뫵,?gty[D*J.N2"u/K#[d{Hs/ %l) J-N=<"J>z4#T^'B0.f60z"D!/fZaEht ?=c: Չ96! eDS9±umw0/]G^ɡS欼 ʣUA`bԧ1#"? 9[,%xcG38MQÐ2>B/zR|Tca 卺cW\`% o>a= Aurč4,BXF."YKBD@^7.Qd5>\:ysyf]rĠimj؆1&T|vT#>[ϓdQm:ݰɤ.jpȑr{6f#ONa[7r:{6"Sd&0Nh#7jx`G=dpCzhn c(y>w 84=3ۗ`tۑHHG,}δp ipk! "?G7o-1$ԑ B sDIe&&FDu$8 s{ڕhlg18Ӱ7T<,&}JaYۡᕤ!O:"k5qb-aR$"VLĦiދ$*B5;vdvYr겊q|z#V4 {UQ"q 70iJ t+ٗi:Nxk) ݣ3t 0 !-b"n)QBq(C`"j٪G>mWXl]ɒu?A!>ޮw]*sN̪0ٴԃFRGE&6J$LK#)2 ;!!||Mw,D!'£ nAv7NB߰> kyW;'ڈ63茧,-Lnwe$BP8B!&-f4$Huu -,x{vRh<b#IRiM[䴮}EoE ?Za[gײ. TԠ\]ݟ8w(!Qq0<,DBb9(-3/ $sAe|@}zkmMPT3\&:]$& sIc#^[M]̡6w-q_f7Ael5PKupbf/隣ׅM~Spc% 2mTﺿ6/l{A poQEWu޷Z#yE]]s8}ׯK'5{7]I'IK6%cI_$KXdVuul?sHRcQZ Ȣ 8WvŻ{+lj9l\/Vm иNEiCN;ɒZb`LA7wv+5-bk3qeff7CXYb}3w &Zq0 CBς!6rNͰn[xU wB #|<9=RC4BcČ S:?pq%5J><[k ޢ`sF\&ahMCoWd^A؜sFf.<5h E<8MӘ(rU#O~oo>e_γfT30hGf9DZF Ȁ: ʀ!Ц)H @cOIHӺ{B]1VQ$yTp$ ,QB:o*dy?w,e ^xo"S^Mlaac!$_4V.aR$|ϹV ,|m8R=GH5G u#05q];ݠU׮Fp3) ϸ;e/JFqSq֠e4_][bv/N݅RG)2Zk#rĩF݇h"C@޺H MyNv8T)*rk1G"AxJ70V^ >p{נ8LkR(6W^H_ T}lDO>y0JF oH`m'ir?ӿW_0Br<o?֑ChGB&9} E8K7.*Us[ #4'ꔶgZpxj)8tcmآ la{!b2  J۾hq­~Ŭ&kř2{CYBR .VCbrz5;-#9qq6>)幌{-JƱ]VZԕ>r>ncWK"B:5 W vJ\hǃT}$3ᯢ51$chj|q ˜;3_:6˓i^u7I1ϥ3- T)w9 @hbn_n}{yMkqf_̕^DNx= R +\}ܺ7?fԣy-ly<ڢ$OVB^4(jv  Lײ491c-ةآ:sqpө#s{Pe $gyΰ^XhIaCBP0\k2x9ZєIJ7cߡ8j[cl鮁 "m1h'=pϰž昺xZkcT kLQ^kj0v>l mܫ!cVm$Osp~k2+07一1 Í ؜X&%S)CS;`[H@"ѼXxMً _NʐL&qdr9Kč8)*ٕwQQ>u).;>L/|YQC'_RO#8N?~H'Uޓ캄Tή?e4F@p[tйU?2(MHm#ZcUQ4Lm49&-DsOfthźx" 3Q`iL*LOʌ̢BCq!evq1UJHpQ$qԊ@”siIKD2JzG Q -#i;i 6׬Ua3t^(o{QNͽA!ulЎK(X@qK;S;JNցٴNXI Te"f%BnI'|[8ӄ9t5m%Z)P"i]D"v6‰0ĎlAP:- [&ԍf{?D4>/}-; $5#tQ(n2@:iи^wZ2"q8U{-v׬_˦u}A,U~t2lԩq͚CK4h:zI|C!|eƆk8CDCb˱\Pn0IJ&,gD+}xͧq_ ..yJXRBHM%9M)7E Цia߾@ʻ1U} ㈇x]Tu.F[{r'9MЖx-;k1R=@.}:QZ`kEhT^n:6Yp8gg/J_ &e[TD`pDC,ךɬǴAt@+}zyBPAȆD nG3Fw5"CL` XJ̻swlLEP17YHnQ҄\.]8ꤦZI_e?zKbbp5dr_FPXٌ:ij!׋ * %59` f +05 94iR. Bk¤sP$VX0[H`XYm(h,^ihXzeNxн#pN͊F6L5 &Mo@V97Z"NX,Ykݩ*gM^ g~6- uWtU1"~G6M8.s׸h6gӿE5y@B)ʴIHަ%/toQ{[B16C6x8'(S>kKIUPǩrU^R@ =r\b֕ԆlS*%ŕqVl=H8)^_(nQ_!&i6΂Fmy¹Ukұ30!==k>x'>=VjD񷢳0gRKo4@ya,^Aa+.u ϢL"$ |Y::iʼnRZNfExkj"R8hU4‚cv558!V7IyY6;yBH !JFDhk,R*;VŹf)g~={sIjHZPt`N_$Wq'Kq55UӬy9PL$8$v#<A -;vcK\h "twؖZ2wn )ژ2ҾXج8|vh:Nhz5|Hְ+K4;;-\M Rfo0jڑ>1p78sg56OCY Lc:zd-Y QR`S7f3썟-F;&pcF7$kyfz]V asєqߎU\wSa&= q8;}uS7ƫ:0o_~xyex+BDBBF$Tbzg/P8}z>Azډܥ畦lIj8&N:⏸3s]Nf"{+hXCo5G$cz=D ֢H)KPNiO$E9آW;{^ {6ndA5u6Rj{W(hcki-7LYC0Ni|R˹OFͬDĿW Y6<Φ5V)87J{cw}u`vxдH @XUØ5' vzFC!TiǑ4+U`4PG݃Pe9IJ+QI=R8b(]j_ 2XgŅ?NzybPq^Nitgy6z.khgXg7 WIgӸm>|oK~M(Lc`ZU]\a4Lh +uO3hҖI` Qz -tM,e'rC6g$Tε4 BNH҆HIDB)iql,y;^0"LajlηAifڠ?(7:gPnP8<(JXoPo磴U&$x9L *D7k~ůZf?9mZ^C0[=Fs'Q0Rum8\p0= ~Hi`ItIBv|q? &u,wD B!P¢%!RzrBɄJisv:ت[i:ϊc{3o&e2\i92K2p++yf52ld!|n#λ>Dk;EFf3ǀ3cmd0S/J-ohn~[7otYUL- K DΦq$%:U9Ǘdːf!C)ț-, :/ʋz\Jp([E.RYqZjA:d=: G𧃋Άط>|9$Ƿvy_н!,s/ 1YQdMOPav|Kc {9.^N(E/'ye OLs)٩3#? qThv ࣚ!Qj u#=KYo* Ʀ{jKi*4fiXbIh/R.t\^.@?TZWk+ŠtfO+͚jR_#A ځ 6ҾEKrFj\+S=}e~HbܗKMV)ֆ "  _zOP[0.6IApgm-\lGVie$~h~Rm6-|(TΏ m -B"DSە^bqhD;E`i*7̓#TlBBNr8,=&nUi+b`X-Tsfn江8c@B'[o}/h]`vd%/y_߾^^lße;!ǿ/L<ۇW£CLZxVד8h({R- 1OQ&icA>IO^-_\Ẁ7CIuapWyGM람Bؼ<ǒؔ!NK0n[ ;d,K5O#.Y= iMs$ f- ~ۖՍj|ɇ?K~1/8 F$b KHjn<~vn-w%~4s^c0<%Nf0<j3Zc@f;K)mr.[u ;0{j_FWyBIĤ,VιF$`*SUvK"$ytx.#qSA*ގBMG&-)i˼)l Oz'S=~RW 8ÃrgnI7^0 ?p)wʥ&B4C  v[)l6ss:ǿ cWS.qYSPLL'ID)Xaر( *+\t_} '$S ;I)(լ h>iyφctΑ ݎ𣨑:&",^y.9-pgaƜ :A$1VsEe)NLL5Fǂh}~fD[sHێs^Ev0E!cO&oSP:x1|W=]Z0^{BLHuE74],.#S=o PWLOs,*0pcr>yp/68|r<{ 4t 6neWWUy,lr?ozI6/ 0"Ͳ|9ټJXM﵋:|:]L#v-amjuoӔ B6ת/Yq+`}.~uV>r'T 4v%RVUm٣GL[\Mݢm]1--ܪ[`;Pݝgޓ㗭nl6L7=;kɵlZ ;ۚo~r ۀή' oww}œnuvX:p1f+p `Mp Kב߼I%.{ԆbNzU@?QzMldF;SX4\)mЊM 4nM&lY;vvMF{ߋPu62tR\nnx7X[YZ457}et!,-,WZ&0SӔ:5'Ջm1]3Bሌ>yn5"X4zۧӗy^߮R>lFKdaZmgo){Me7-9~5arYt6߾EW3t\ 8cx1C!^Z&e)1P]0$60Xb!719x\|]rk0&h_|x;uep)U-hfXe x+]xdYY/ҴN'r\l<:r0ET!}(Ye%^,w4)xH^V7/ HRԈ³8_Q,LYk((Q۾=Pi8^ OHvB5@MɢՃcC"]? }+{BBZFe:8q2 4r 9%cSK=-c.ELq ]j DqRt'{)Q q C%Cr'PbR )3E,e rF"^e^eNK0GOߞD! m9z2d{1|1?(9 68=fyx33jT!&j3iěNRTbֶz*<0P ZmυWFl"6[{;;ر^),K1HcmmDkeTI(+ُMY߯ I!{1;j$Dl=h@4EIn  ^V.>47|zTnj j>Abp.φt ݎLs.:8iW'l?1}.I9$։֒"MDŽX'X:L4aj`_޽ _!/[wv`m텟-_ M$ib z 07UʍFF'2;i*M۴ A_?L`)%`81aPO[wAi\^K荟Ѳ^%{R?%g;BnQTK9N;N`Npߤ%Qޞ NC$S lVvpo' zF>X=$13P E d(\p!&݋+ 7JA7XBM^"Aң(=I#HLwys8yf_4O8U$NH%d#ccbRD-1>Q103. ^%e( 7 Rj/#OEtm<;`U]/0\yq qD|s^u;r9JT(/-*ў6n8.kDAb>ޭUJ/ᬘd l/o~o:LKŏ~fVYR?uyZ7N]Y%qe>/~ :va/L~i•KxdYXeyX_͓K惗ϝ -<ƝJRʶtSߐuTu9DkddjR`ժ%}>9#G=OFǞu3`6pK0p,1F CHcʔ6"3,!'[1+L=%}tz|lIP]!?= A,Df/ny~hr=f&Ƌ?jދEr͝M "pDVm1gt*O"qMZPm䠽rPuzuBϰ&Gm"}҄=p~tE_ޔ -5'IuSO.dU\_{ּ>)l{斃r]umԬTGU\ygS a[OJ)u؏>mcyxt LtH- y:jPMăcbwQڤ$,[UV}p|Jg_j?0|dOB0c&e2 M8FiIaL9"&tV<ٓʯwdR 9|Z'\P -Ţurr8;( B cgѱk2z&OpH'ws_!wO\%qg%bN mNc&4 lTv_@F)eA=UBżvemȋO; L_wmmJ]grf3Ϟڗƒ8ί_4Hb;&heDYfMĢ _w?yx*ZYme/G+?- hnѺ(ͅ7F}qFl2_=/NAHV"!ʫ% m_rW-ܻv]2 ܛvIӟ{2E`C&=K$;Hd@OYƳE\y$ R zGMt9Ie,Tk1 {,L3l-A<) 'DyVra.$l*lVjw;p,i\ii|ë/Ä5eJJl&m^}v }6_Oiz:LM.asiiJ~PXg?ua6:ҫj2FLI1,S.l8MyB6¬ ҝݶ`q eE coP/Hst8&ԴTbKpxDb=xqfջjQ,ӌJC45"BZ2%8CFRk4K _PQ* =ubU4DE^BvZwtX9\n8~()" J$RMG5Ipe懈ÉXWڲ>;g0B+Mi+ ,C*6 y<$Xғ_Wŗ+gu֩,!4&N22Y,X 1'M׃=+r#NF{7lwأ))\m{zR=,*M>ؿ|?YJ$;WLb,1SF"p Yi gߩcoGN#qKM}(lC [)}ǻqoMH|FJSj5#HJpeǂaih}#ނ2/:$WWO!koqy!Lvqy<6gW;h@˺msEݿwO&!%̦T |T!SCH?Ǧ.pkd+W'W=)Q`b}`yt5F38;DmLl&\&-q(gfw:8wI0{kDa%L~iЯ7{~M%yuڬ'бZ2?sbW\f2)ՙqb42%YԊ!/hpl]jHZgfdgnUXva)Կ*If*A4ڼm"dM2ϧL(ꋿAiB2ucUVگ^m5NA$`V}1bu2>ĘbsWsߢVruz֖PzcV^Su+ُDkS$ f2l(E* kcزL:Mu%mKk瑃]U5CUS7iIlNb7"4m6"x|C2y$A7sڲQ7b]M%&`VrbܟgEQJs$tbDP3myk#Y(@Qr-FxUHӖ&{| 8~, c @'u@| zRj_<1YnbbRNa4U  IEe|?,f=2}of/"H{ aޅ[Nv|P;~Xz?@+>JnV̷kGtVo/&ߡ]zv" i~M($SEiƓPb*$eHc$$$fP)DicJ*~˟Tx$5rN <2/T0+mb=+M)j9--5{ DT>m^*ʳs~MeN*[YUE|f{iiqQջקtMպY _6Ս5:<~wWsГ g;ne+rJz;R`sC9uюNEڀ$2'bn]O)@ؽe+Qex00aH#>v?MDHHHm%i.ׂJ M;ng̷]r^%)P%L. v%p6; mB^>楓mzWg͓ͳq-nW `RA,|I[E R8q7k)A3QMJHHf),酯wsgM]RvL:UK0,-d : SE/ܘT=Iut#yј35*'cV㈄gb3ga;4l^&>S7`=/btv6qGa}5BqPQVabj6I87N8Rdn'vI2]8T͢TKHv Z*4sF5n S*OKdž&X1qfτҌff2Ņ~xtvNHIeJ^<,!BI8?iaQ ug ``H^A[}0{]|s}!"܁I p@)2%FL2%(yb@x|g7Th8jEV 6U;|oXTM|B(j+:m@,SjbJÏ;2p퇋kL0`i2kDK'#hj^ 9~`u1d;Ll7I,\CB'h9:Id\D;= me:dkq dR ["VicD-֊r N{j/ޮG?aCy'~ ZO4f%ӊ١ \T@p޲E-B C5.;흱n͕_BtH=`'OM8xPp eڒ$K2cИrp#ƙTf,ס,rƯ2&ֲk-E4zX%g?^> 4(͌s/ş}b$Imu*R%eV([z 6 o&hILfz /[# Uķi^ "AJ/u6zal8-].Għ8db$X[XX+qYYg|wv iфw'J+y_t7+-4SN*{^ŝv|`K@96̉qc3kxG8mQ4พxOx;Ɓk (}eŵˀY.2,؋D-cL)k'N#c)dJB.: 6:qwTb)B,! R# $!hgV*eRM @L*/W*LCi>}z z&<}[鋘 ,abad0-D1m@4{E43  AAdžI>d9$A)<\h.g|;YWChdqOf4y8jNVy7UՊ^ѨH-O-i1ZIkZsEը!yVA0Ooٻq,_ڇeIv&IOvH6׺EdSwP%SHwpښrGlsRi(htb8(!09J-1a4jt >o31oѕ$t!<-<}ðߍU\ɛcwYտӏ-ٌQ!D}n WT7n%qa*5_3^Ebp2,`{Lbyl<Evԇy#}񗇵zzLBœb"S4,+e 'cfc1W] Ԩ%`|/2N[G,‹9Qv@X /'˽jxB!NP C"d̨B6''?J/@pt[f{C]ЇQLdF :23?Mi/O(3/SX'%K#RIn.i Ih?[rTegMNO n~P"NԤT8wpS)X@GMyb#>7}z +2ckN0V-%=;vaol_5?B>=_0ߋS @ZVTjb$ EPAD/y_?4ZW);o|o81PͲ+VxܟI4^A@QZK-}zkKQZ[hYLbKS\Y D$j9濆=r08 s^5ʱ JNN@2H*}Giw\#H |8 5L#im{뻄 ApB$ Vjs='k:=dC9RABeJ!Sb(V k|Z5]^Akݵc q$6 G`B WP-hRIgRwl399#ˈ,#<q"/H'd @sJZ C+Ή%A[(EBc}:ɃEEK;ʏy_ͷUe/H ^ȼه4KgfT3,>hWW@n5/脂`^/F>0?nnɺ7c&ܦ-RHmZ~\ԧnp >thh=ڀEXpȔXSo.SKPJōPajjڷ6߳/<^pc6Ne|V[ ϪaUu{H[8po꽅Dn:_ T/'?Gt:a_.?W_lh ȀA([a&R,)$YCz1Wm\v]|s4qcS MVܝj /q_9gU֠Tџa#0JڷQt]1|rN͚s O @]`L1Ri1+&anwV Za)Az 6|;O2׋AFAWQ @t,&tt,& ]_ݼ Qg*q>rLtRYZ\o6 /'9Kᙏ< rNyy1/ :=]GJY+"A8#T'Ҕ*J PqMq`j)9/ā9,u+%ջ"vS(Pó/]Fg3= ^E9P@=1r@ؐc$ZQ.ɔvХ!#LdBh%F-QH̤l~1ttғ#HX4eh#-k,b\[VKmǪt}ogItd&0L01.Ƙ@"D pExyXp#h@$_mB:XUjĄuL]o"OkasHr5Z(t:2C Z T`V9#B#s0r:e@[4GZ[h#^#c9Y!cW/7@s0o8# }%k@mVa!DQl4 N&2 8S+昢oKK~)_Oyy9B,:$c)H5B&!&8>^`aiDl.E"H,ؘdYFl!L://)CBX=rTeo0@jg'& ZQCEX)Є(,2 XHX [>1K08uv7 (6kL0H,VP7ܒnS1tPװ4-ҀIkȣy(U|f~AE ]4垬DiǕns vHhth&x; tjYd(\^71op^4d{5>Xడ)R{(դTj>wjou`YoMvWʛ?6ym%HUoΓʝ܍z'vIxtI Pa5<&dIwޖnP^7lg4L#=mJO7/fhUGȫe| 삾s,lz5(_BF:Ǭ}|"ܺj`Rƪio7 l[3Y".L4g\T{a0lH87n͔1_]el0ٝ'yfw 2'EMocA>VNu\t7٤nHs]-˳[:&s?T STMF>qN!̈́IqNFYM$(n SIn4=M51G+Rb[L(D!%D:(rtLSPI"*̨T !I96~VǮ,N|uݵϕd-ꮣ:ꮣݷd먻WIO8ꮣ:7Gu]Gu]Gu]?/ ֆJl*b$@Ibb%( GŒ,TTf `Ғ;ʯ[( Bդ$_1U4v)=5}F?\=1@8& b0& c0& kH_Vrt{ƒ6kyM̒nG"u .k0>/ǐNjsz>& ]7je$lpz:1mӆ[ c0 c0 iíf1mӆO6T8 OZPWr0$ILj,`R N06,co#iyMa2 ai MC'}0Qv¸ovNuweۚIVmN``&?y==I^ZYn%]gݽgo"KYB,!ŮqIxD%?|ܠh^g7f}iŗ~]]Mߢ6*ƃQ!cΛMW,C3k;(xD:7ۼ_G㏷?MǗ?.7LГS٢v7nh\-.7T ϊ_caD ؓQ?$]i@€DPH#"BRk3$[*ZDgpgI 8+W0N8[ԶmpW"K+UpUyAJ-.qT8Ei4qIx"H##{heUy {!yp%y!Bk=VyM2 ZESΩjwkα.-%~d% PTbKuŦ }-iu붢Ѝ;m>cc#:1ؕD&700zޤG{_l~,h ϫo;T[ĘPnTkRm $FU꿥wo_ع5I=q7Aw;~zm!Oj:q %Wn,}~ao1<+_>Țd;J[AӮ٤ZmF7c_ifM.WnPyݿ;6,h`_8=8,nmuL\6i[yy}؞jޚHvSl A [:]]]}_:U%nPGGt1r:>Ƿ o0/67r۵.7hfq`]fw}|aW/-mp"2@ M>iֆtJ FG6H{7ׇ@;%^o^ <FPG<TL&gHB[9b5АspBbbRvWhRt_gݴfZ^_KK'p3u]HçfKtWcHA ΍0E d=.QB7tWiJVuW nWXw%~mUm#.73wg7$&6 #RoɥυBs(9EZqcbGtqtKDL}e`.p@(&%2jl&7)I~Rx›ޮuӻm9`'9(Pgr&ןhsJrMIH1)^#4Yc4EaUInMÉm4]+u=7v.x*Bդ,$evȅѱ-KR숴l!gf3AaCL\. t}x `a#`)?~iyY$1p+9!dI8~WORJK DG]4TxIH*m cc 3sD[BhCbn3(E[nsMTgȭY[tB%|*FY$,ܾLrB0sz!kSM'*@ë 5Wjlw,8 P}p`i*UTëKۇW;R?Bރȑ[%cO`8NHaU>]9 WHDJbUY~ - @ XzA 'ߊxT Α@A_QZDNhJ$B@qw=Cx"zk<26F]S[S 'v}a4eNZ- *)Hʀ8Fp"aB:][6PjkhB H{&{9vJn0^9qAD" mdܹ5Cn0GGi~Ci~ڃ?Má}`S"7X0Ƀ0Xb6. w`Sj >0}7D=ڴ`#nv]A[Mԝ6FFy$$'0V>h!tea4=-rP6-䖘2oe9'7nW=.׭~|׭wH{f}5_Zb/}zk;OՎNwH8<" (L sOfB JD2fQkWmꗵ:gzxWYy/wi@+L- ƹǘ@9R55BRc\xy|A#.½؝ N@Hg嵴kL:+/w鬼`ҿUSh$1E=.AlsLCpC1A2Rɝa\o7@y/8s{Лd-({ LSaeQfWS73h#?Azb|}]쭹&/2Wϳ^=)?Q~cFO*k$/dhƃ87H{p͡rOm8$M*[e/?e{΂N<&gTFh7U2ԙn*) ̽Qzs1rdeըF~gWܚewSę}6?ps˨"U)!GB/p t0ޜ (<-8/_|= }3f^\U_^Ebp%/.෢3kٻˊ m1+ngehWUSgN 9T\l/_K?^~/"支ʾE M~Uڄ-%W]ϲ*6є,>FZ O \{;n)NnS>Ewh]لgpҠE|> ?lg~DF *$ÃꅝL66Й{v:ة*p+kOE$i6BjE7?4V0XsIqU"s[hvh+l4ݡGGHE?*Yy/|9vP?/kP??&f_eԤtSbӯtӒìh|Tk;, rZ 6kǃ:cě!iU!A$V;FLl|8{x@嬁[[mLR"lvz:ϵIŌ)タҙHxPvpZ™BMY #y/_e|7/+Нl_ ?{l3]C s<(5ipRr8H Cpb2cFL!JLTG\PjA ~1rޤ`;0]sFznfqTso Mi/>wmßBϭjm"YW5kUZ+='٤>T|[6Ei:60o ?p㈃!(uR:o($K=5/M xЩM J\xh)i$Ch-%dǎ޺h}ë"{RTJqP)*AR {*;,L DV1my\I$w*˜)OnSZL^#jL5/h}aRK,VΤ&bDX%䪭yQpkz8jL:qzէ)Xz~aD>짼[i1 r?bjC%3'#<҈#(fJ; *ϛeN@*}Xܚ3i P), /*mbM=c %s9AeV{¥'Kim:Ӫ/Bn ;} G@!˞V ј dtS{Cpk&`*&z(u[pڼ6υ+$E1xIQ2yi>w1\cz!O&m۾Wޕ:ǚsӮOY jdI8_RHYʒ((8$ER9u":shW2bҺs O1͔J1ƅJ&j1F'DaRAѩU+Wl!]E\:(q)n(X )܆4:UP&#v~b'9h&od|"O|2d2rC3Sјah?"\tX~jA!bV9U`&|l6,ҳN_kT-Fym= h+DuCX^hܘk^8JB& L0 MN4FY qc#\yY0{լw$ugܚ!%seFD|o;=RF|jܑE[SQ!G%3(Hp$}&CѳQr -$3M?C³cHYj:#LD^h@A@ Dqb蝳KB5=>Â##wr^I&gUueX ^3?޻T~h yхjf0qi%S\N3}jvKeVK;$ET>QrGDQYQqu`T\l C).U` RF3Ā 3A A΢".f(iF9#ZF'94{ϛO_zѹ3K^l;M^DŞOu>o=&{d Dni 6)ѐPZh2! 0~t\-Ez̿_J=Gq zd0Q]pO0ߜ3yэ*sIw>~34Ѿ)'g}n;EADVm$rR뻂A&F4vyp/-֭I.Q~6?]ϰ2Cn4nu0C<ǒ8uO& ׭ r.Vˠ.I@["|r b T.߿?]SjĄ>E6w(8dlP][v[v4}~qҀ W;Z~OaС_ܢA x#O;3-.&lnh"{i4?w`Ͼ"D""HLRFR$crjjE*:XV-Br] ,W 4V'^(LY%Z7ɿ(F ~Hk,`' 3|X xf'su.Eb4:Q(U *iWe!3ɛ-n~7m&4.;[nOƾHMՄMkAly?)(׷'I]pI$* v._ⅼpb۾p)h83`2+sLWk7~=1nVA~$SRKCC~U>w{ll 7t)/ `CHg -|wd0Ls2H ؾ_a'o>,ahRqud*"5Yf Q^˽]I{w%Mt"O*Km|Ρs\q4+e԰8Lxk4{з˱SƃMèQU?EJ Es&!$!DU*· ?p%aM6&Jc(O/4і6W{_b<(7O`ρQgt.s_ca&o~z"hap׸ U7&HOGϋADw''H"Q1J(0HH $AYB۔.&՗`$4-g@5\WgmgJD"ȘD$2&1<$ KGkkJFX 2`"K`g?~즓[߸G.4OIx=11db*D*I\4hdYO`IWS=J/}~~&m\=FVDRcu/kb_QYٕŧ8he_·^AYS$ٞ$O~[nQPX,;yπÜGg#gw%᙭_oӾ<"_z]/:KgS Wvk9\5C.7csr5~͗-r;]}_<d6&?kaf{?4u|.ij;Wd( ۲`yޝ b9w2ՠGGJdaA s8y˽sO[#]tC ҠοVۂ9;OU,W`Ʈ:& Ǯ/q15:yj}>0衯dže<%LPH ɸFaDHY!? [}ҵӉzpC?1@'Woҗx BFs\@R DwguٝwI D׶!A-*8|w8C#j6웮)M cS{b4ʴ^/Гô<|oVG:'MJE42LDj29o*\fT;"Au5Tڢݻ(;k|]+fya\_1&{I\s[BVBÔU)\sk й.ͰV9Лᅥ~P6K(k(tˌ Qʠ`daz Z72NqfJR@&R䫑;xlm#)H>/ynO5cl!&$/'vX~q 13x~^ڸFF[P9WMdfdy1 N00v Ĭt t^-u(iCDogKY!ž& ;m?ifXvY^ZAr=ý۳0&Ÿg~sn6~\۟oIq~hψJWϸ~rrt<πWͲۗvTOMGL?"&2n4\(ͳ7츛a* }U-q7lH`g@k&;!}< ZCE7Pp%\ !3ʢ J xuUZ\Q8N@( \:4ֈVV}Ԥs@D5a7 #{= ^Oj^ *ZE! ( d6(r]!U*,p_E=XAQ |*(UU+͎ >7‚YPУRPTEBjVs/ bTC穂!qK0(j %je og\`e+HYHd2 @[ w]< TŐ/YpiUZW%'{?0n|BƼDAt*4TI$怢#$C1H? ܍n Vrjo?6Ewo}riq_\iGsH&! Ai@(ń`Cf}[hnsg"[F^?}`@7wtl_'s9taSq1vu?s9Ms]r#j9+־͟VkN jR6Un%eNP"{8X@Sl1$HStdzgv4;"'oh+AuFaM,>>FT5iq7bNǞ|~~q>eO%i}C^PR|:v/v.8>1S5p -nN$=!V"G}$o i[ȁ68-Kew}42;@C_R]H F@M ԁ}~FMMӰ8UyӨ;:blڣ%1r5Cvx;;B;A#w*4nM0L4  IAj4tQqf Vc(UxpU!C)ݮyZmƉNq3MMۭ]+ nv "#k[#@p"/* z7udoNy!AImFԈsl3ntvc0t_°y 'bd40MTLIrBd ͐H5Rّp'v#1[ A:;KD^P`BHb-?t;1$wJ$)xK,ۄ=%I:l-w)%#[SbiRcT\V0A-\ZD t-NVm!Vkmc"JVU2$6Z ȩʃKQi.,dTdsK-~3ʯ+KA" MOsq-qHe]@5~ehu w=lSW?O;Ul`ÈYߤ pS=g`8hN%!5N?:q U90@];uN k PQ \* KYX?*zX^6~P!A]ɞS(Haj24(3$`3.u8:>B *`H6!.Y-qA䵢YՔDr#x['$ 1>]@z1_7 =}^8LM'd_,| c}l?gG 3ӭBx49WILkkrF}Ⱦ۸_*U[IN&dvOS 5V:ڗ j5ɖDݢH N4@R;8C&X\PeJ4,IĀ_Vs)h3 s'uyL(b~DZ)p5Rǵ:hEonqZ62M$0OLECEQ-QVnMuKLiL'[\wCT3mJr-柗sjD~i#Yx;3 (% pfOf !2  3d>cʦZ#*8¬8%"X 3;iϷEـɝv}B4 wJ0'"Qb2Q;k)E=Vkh` bd8 ,Bas.sJ]]@r{ۭ%:)"- E ԟDA4859AIfV7÷CCV5QuQo/2g:lZ/dJtȴ_ȌuuS mݩvPu W4s寯QՌzhQ^n)z 7Iєz-^K[cіj^[|b̬ p󷶇@ICχ~{;xEz}O}WtIr86GSTA8eP,C P\O\RPVaɬzRAkV3ge%UC+@̪OH 9b2*Ɠ#m! qn@£iemH ,(FeLαG)aȯibヤ6ýWNZa F N@zRBUYPo#sOCAv dHkoڛei:~f 9Zg0؛6NzmNY.aOvPA}n$1FcϯO.>s >]{79N=& <޾ A6/F5j44Zev"UnDqN`P15hNG.G%ZhBț%,Һv DO ȗb W˜GuH-Dۤ0Pm~ޟw`Px+@?>̧-Y#̇ԽW NJxM[ߛ!=o?{Anr (3p'Mr,A%9|i$-#] %ckt &Bg-普=h tuS1tX#BL`#0 dCVzS'eVa q@LY=jhֳ}~iZ=P௏@ a`U!\bqi$@S!{;ה_o~WiW5hr2-&_|VvoıI6p7J?ϫ`&y7_}k|Fٓ|nQz/7zvWR嵉d@$)_r._X(ei9_Tr`zre\ca2"(dmư5?a jk 5ZHA8hY2?\;04@d**sx_%'D# =_yIHc]iwuU[.k.>ߚ~`} râU3*H1!=ݙq3JU=a*=i1$sIҕixJIew.yo”B;䜐>ԡlq r5?kmV]cĭ f.եqMޢ/^C0dw V~ګ9]?n1]vtlMeX2Eΰs̩$9DGO%ݛU %"lVCqQJ.=Y5lPSib!¸C?WzFk>J_.w' G0y5hqt|qn/X`2>)(Df$'fX "ei J.JS}20 żۡM )Enhtn{Fgp(WƕeQq!S;ɨO '3Ym HDw%{8g-mI@ &eК Ne$HIJ=΀̞ZaE J<ß?L n?ty,/g&ʅi>!H8ƭMYskQ6h)~PceV2ԑiٜ9Ihٞ!jxa(#K6ܵ~\NoVϦ/O̖A6|V W3 nZҵL8GjZΘyj8_Qi.7dEԑ!3"fK~8 / ^5hJ:CQeaɩtu a_-tJߝk6[$.1#ԏ1 \.0 4v@>i^ ke^bIkPxB)[ㅠ7~H@*d+=>MN?_c;1a]Zpks@E"BkD&" n{ސHX3Mu[JՎ7ݳ %F]RHۓm>mH=:o gdRy=Htl | v:G?rB ##Q!n <~l}Qޮ25011iXFBkWP1Q6\BV Ynl 0ʶ[y>i` `FoV75b̘ՇpJ݁R.0jo{N{#ӭ{`}Hm߆{L#x* $ujYw7" q!%s& %f9!?c54-dUULVF{,FxVW=(jzc^NA>9eb~=oߔ󗿽[oǗ/ܖRtcNg_-2|g*I^dsykWf9/ufηf@/';'rSɢv u N>]Oߋ/'~r?wQ^r>Y_N~m9'L}llY7IUՏ߿_.@ڃ?w,Wדofo?/C\-LBܭ}Wz>c7#>8U.aGy˭Vjq\=>Ⓟrfy"ӛbe5Ƭ&M`ӕ7"Fvk!c0›i4GbUp߃FM,tA&.FFo߅6W}Q!@jɐ$B#Ç1ݿ<M o=L0SMP<9XJ77ͳZ!?tPܔ 6N~]f:,p˗)j׽Nu~Y’.("ŝfaS*X/^ ʌb^@A\Y&,28'B&\p}{p V7=ZA%hX0EGiLj}NӍ9{D?̯K)䑘uÏm,Ug>\?X{b C(@0VS17e(ٸ!Ȥ@fO oL`DJ@z>0yv7;XxLLia GD$N(ƙڕ b#ሠ6B8*#$.B*'{=io $k9pj& $bŗ< &Y|uID0!r):(%QDDId%'Y2DFsT%ʠ. -\ :h<1)IA F2$V7I109OI6IT)QE~X@O 4gVfKK)D ^q)XcM RT")3`ьBuoi_A?"k./E|x㱣P6Tpn֮ǜ0 i? R,*ʡ 9U1pAKR/ 3hA2-NV.徆86wy<)-[&ؾty(,(pq&N٢ˤXfoe7(kys0FD粚Krs+ɹ.JI`V$J*OdMg(Dc׳MP%AJk)0R)5RSY"({K)|ZI5D] \&U*TĨʾDUdi*eV(RTU#|`C;Fd} NH(舭bwlҡmڥodA[69cnUTn9j3Ȯv]ay=Ջy(;y ?{6+X]ݶq!.|tRۗt2nv_R ,S;~H"e䰧{ʒ.@;߹Ch^y=@oWVM^>!zklDZd9ih`I-"T:\ *rIGBX\ŵ:܂y¶C Pc[ {H0_Yj! Q`6t% Q)N[K0ꤻi.j/üp#lruܮh TX;mQvU/~M_63= -ViT[{_YJ=u :JZzɟVַjgYHհS"ͣj+&m { #^B"nerbՋ+|E΁̿LW6-gEG8;.Ӻ,l#}jnɫDZm:ǐ3J8gȬ b %]e ^;é#,;8F6/7D?iPʲ eyR!S|nFn"tQQAfo*gwbH76MQ*zr_0Qz v䈇Oo Mb^ƟsKJ5Q­ k K,m̍I0$NIΥZ"k@}ipt:ZA-6ZzU֔ ̚٢ו Bb,ΑH$K8A[7 wcAqF[; f&̤#!X2M@sZ2;it}RgPIb.Bx8Nb7כz_=UU(:˲anF@W<:Xh[Ā(&<8{$4`BɓXO!1+>A%vħsLV֑*,1**.b6cU"4т306 GFe7 #q5uxȨ0&3*,;mH6=O)TlBOۑ?U4Z׾|ؔK| DX2X8# f;XR?WOyZ>%+1d=+בQAI Ӿ!/4-NE-m0#O`?w;zy[Vx5;gjֹq?}j)hD"(I2$a4ug ?f}/\D 8^IP:s1 ^Kf0f_}w/9d=qݸݸwJ G`3@T`cEK,Ɩj--h>Q(hVrb_DE~n4\unFp + MM&*-L&ZE_qccٴ,ӫ[R6yeJr]Gg gMTN3Q=ʪ9p]z=ly9 >^Eca۶3jPY>^Cnp|gZzn}=p|;nl#H/,LWO*`;:,/*ɼ^ڴύAQXE?2Nϳ:Ç?m^ݻϮ'n*vNmquS*o_{V'Vz [xv\ ɷ9SXV<Ņ׹e5_2[9~Wuj@EgUy,!ϛr YѰՕ">+GLgu1'+w(a;nRQltO8GС;|B/nwczwSOɿ>~R''NyshOm ;p@O>?Q _Ns&驗%IaEjsT׀АP)-ID(e jK5TTRdr8tġ#qC nC1P@ `(#QwB_RԻphxX>B[`=AQ-3B\K @zPo7نV~XKZ_jXW(Ghg5.b&z\AɧI'*UhPp66(Ef:t ُЙlY`g5x ˬ_l/SBnE{*|]nuDۢ{ͧ٦83'V~jz?t&2H V1 !R뗶iFhFhlɃ̖,B 'PU.oY(w1(Hmg|:(LFyC#-4B@ A$PB2=AO3xJ;ұLj9Lܒ/C$<$|ɣ-&&_bi䓾>;YC餘 TTʹJIEf nY6*jF:iF:ivNhq;oI%#J0}: !^EG2%(*[%}dB - #tH( P Pz!B΂~ jF.J 9BpgՐ8x?Qf#3%H&h81G*Iv:H8z :U{ɀd-sZC{~{ ԍ?bϟ>/v/A1$k*8|EBIT!:J"2EV-=m}Tfʼn$MNL!ŵQO Q~FAebc믗1#,Yʌ$t9p{إ;92[ZPyDs~ ]0yX`2Ixoͽ1yGA{-ԦkbIJ f<ƸkMBjG 1Ips%[ܰ!7w;T͋b'Ѷ#G=m,6gz/-'0S$$24I&IZR-,^ME3xTwڦ KqgBFDι͊+>(B=_]ğ,nmJ8eySڴ %w?AS$-WXAM+So}{pʫDya>jjI-'ֵQByY0;^]߇ "4@Ԓ0ׇBB$YҕK^%M] !"o?vVewoMu:;T7O{?KZ仼}.r5t,f:E1%8MI:F,KkrF+9l\Ipl$^ϬoI`7cI/@JjR-m9U$nPQTmmiu SKxK$ zx.}a^sئkQ5=i[}912 ˞ƹZGvNu4\[}XK[^Ϩe.Qd]8pHL"0.TX(ʏ(0(" $  aqЅ '=vcl,p*jbWm1RACMD?!Q(+LBhȔ8{RKuF(ߟ$ƻݭ2qEn\vY!N/j#c,:%7+?>J!yip뱞/pcf5HV"׌碼& _5 /y95w"Q5( eD)#)QQbS"H:rj@D 9ϭK/D9J9{;ܥl=[ֹ綋;s]=%P%DABaD)W BT.;{&9i vӾ|s \O`[eٛOm׽D(#z$od߳4U7jzt74.AG3ϭ޴_魴p-Vn&ŵU4*|&P27Pkw:-*[uy H %t e1cQZPA1pmCdQUlҊب3(-1l؋qR%-pC| }2l`+lE XۼM*Kn3IyEhԘ6;ۣ=|/O5DTUܸޖ|LEdbo[nH>}F1TZ6t+\ā/$Q(W4L8 yE)gR IBYgr s9~WV:&|h G/w 8z56[uM JcE}BNEL@s#:\r\B%'E7~'Cfl74YLu^\!ȳi,S缰@lvs@SB:cRulJ/6Id۴cdب,96*-YFcբبux<6{Gfc뭑~ g>Mz$~$tlQzlZձ#FiAQY,ֈ@6mF^d٨TYC6-ZGd"-E6Jk#ZK:VoW4$[Vy9P\*٨qTm:NVeIpPyd:Y(Mlw6JeVZܒeR4D) );uVˡnlt*^elTV+%FM6̷HY6cY5m▍Nef.`Βe5H}s`QYR,tP̑Ė8@l9;BASH GONX$Ra!%XqEaO60=#V Fq^*z ."/8:+\Tw(fj&B .=h-ow2z=Rٴ%eA͆wJ_>QPy6YR]7xzRMc$$ 8`4FL8OyjpY܊EYKI|)C15(h0g`ğPe=Xг  ǔX3_GlK a [<˛B\)Ef<"$EA($G` )¥(TMx.&H.&EB1>mşݕLw%s_sd~M 5Sɤd(U! /hBdDDUHQ$wQ@,BV0@ AB&Ƥ/1WqzH3ot$Lw yhkҝw$]^W;7-mbLY##rp9wi.Gnq#})ro \t#}ˑTH?f$s6􈿟&ˏ:zmOzx=7޽zeSTJ\>/4xO u>[z=nG:{y7ӬnU54? x*/+X2+/O$+|+ieI_zHT7#&Wa&DV\?5~TUQk^m~F>eJ5Y%WwKQ2M?Doa㤟5X?nUzX U1gxk_?k^}ɫ{}=͛LT7+Y7+cޙxbkW$^Y8+LvVտϝ+# ^9/̨d7Wk/Rz@HkfPʌYe:KW )Iyii9+nhtM培F\ۃj:~^vGq ڎ4[#{ɂ0>!׭Ffۏ~;v-j'g*߾kvW Ҝ0Siag 8;gZ-gl^O;NDo,~oc| q5D-cOݞn၏Z5}Vfwaكq~:`ms(!fi$U d(AÂфq5JN;]xJp[?NQ\Î+7U}J뙜h.Fe7+TG=_-#|Nv3Yi,gkq5H үnHׂO:7WO8(}ѻXخwڲ|5ny}~j.鬽yuۍ^V,,\Vx'^/=Qztde&riD_U? 3SmOSxz|Mx[nݟ~a-0h4Ng°HıdA, "HA(!}}JɄͧ5Y@6g8#e1X1x;z,]W]Mp5.HkjŻkt $`n'mӿ~Ok1W/h#uhO杙\ .ܰ*LKNy/ǎ'~2Y8!$0>0G295Q5Q5b3auj 79 b7^:5+0ac ;m%;' f}Y&Zqg6@pN΁uol ?R)'q,cI I҈EiJ0h8Zrm)B[cu0M~kYZ[,u#''vpEȴx&zdX:GW}RfidĖ\q} jUb`14}F)Tn5`z\/bkKc V} pVQ 4 |1KĜaŢsp 'h[h[5$A63ڡmjاݐX֖JuJvp^q}:ޖm9Ti`],k?͟ OMdJL&P 1ۓMTgF6V\leNv6^tN<"3jəLaǞ&Lc{H|i0UC}e%;K>-6J~VXȹN2 VwVvOU ڶq_v&w%Xޘ^Gǘ'O Mu8HDTq&44~ H| |_]._03pY918^~C Kf=e:[_?˨\ϿSɥ಑u).Aǹ@Nd22 B5 %q8F^.i6r $R&j!֣~'Z*=,.JK-h{],\, 5Χ$RI\1c߄)xR*T,*LѾhJ.fKK EwտȈ%I 44iÞXMt.`J+O6Y,{67,˴MLG7_]:{DMl++V\IHeTKӦOHh5Ke1d}e@Qc)@Ea1:HoD4l,,OmAX!ȼN@L4+W1,"hT6"<," rX023ur (JVW"Y wMfv 03XBBR[sVB60Vh2Ȑj 9`k*Hs "p 8lFAf&G#R1mwfuQˬTsgI\v5`5{VF@Mp]o|@Pthw\+o>gtIqsohF1R#_d~1gP"?2D"!>RJ(JHK B&ců]ů]zDp@vK"K"N8{"G <GAgښWa6+tg{Sݼu$(M%~(6(Yȵ-B$|h_Kamti!ݸ̠қ7Xc+41pN6QqtK/l{0J7stBK7tě:XzfPy:M*ކmL,^fU"gzUPGMH.mVA~|7x׉pi5ԤK$ omݦ@ś<p XP3 6or ұ׌mVm*10Y-MXzְ9,4Zw6[nlgauV+ɆKOm&?զؤNN6.nʭ+mKy.\ *).o-;;IK/ltmV^XMQ6  r 8,OQ.Xsua1ƎdnhS8T&c*ykWҰP]kX8uk9tg<%I*b{@JBiU7t.åusMEgE2A6i5n)nN&:=IէXgj~|mޱmiE oEd3Pџ*޾ DyX晪ƾfc=yYZ_LxC &h!G!HR$ c̔d>s;Xɰ|-O650a(}XP:3[x"G<!80Z?h\:umI-OH_Y)w S(dH**c>S4&~!CXr/ni+>>c]}tɊ̋ފk1/6dcbe nli#Ŵh\oSscoC}x}{c/zZm5Տ'˫.*>MAls".nal&<&Ϸb}.ץu~@P$z ; !aO5 Oz 9uisaAl&09Wv}^gua4P8ӦJLUCAbiB8"yșș5}3dcovymEΘ[c(pv~qS55|q Й Й ȝbW$NV2"$ <%2QCa*U893+3ʳ$[L '[9lV{ΆouNI3:mU9*'W䪜NʩouZFŞqz#HBROc{Tu/;ܡr*?Tn;0f6*'{*'>mo&&(>5W1b~?/jJ~Vs֑K{x-@Zb(w="h$2T;En?۾:dYy錏}"$A"$ a$b!=Dq;zƹqc0vqd5&Q1x=8 F>_[N۞hO'9gNUhtNӫvݦȧP*BOd =QHUHgrޖT2|T䲝k\l[M#NI}w+y06L;MM匭G:,5ޠ3PRM!|"yE*~Vns/3 -dx3Q Lj6E y X.4E T&`/'CznU-J,;&SLϹ7l%d- S*+5ݪ\1TS@mBn6B"l U=j# T@nVSB!ӹd`a}r; Xdž ϝ_xnX1v$8<&%rTtDpZ?$Iy+hwu ђ.,.ܾ{<|3@ ~!}ko~>un@ `_Ȱ@YZK諭,+#7"ZeLi  8S}05cl+P+<<msz =W[@)|y*r7Yj:A{(1L'rAw9Ϋɴ&&*) u:E~YZE\ULY$/ u5LgM{^)3vJD<t i -d1,.b2YME Y@6´K@OYF$9' V89'w0V?:ns;b 'uTb9(YV*Vv +bjMdžuz̒w8Bq.& <?%OEDK% ,6~/60JڮVx9 i? _/ƥt# & y{d+^b-eEZSUŗ)TvO@aK\ 8&n5wco#zRA7Y]*KS0so_#LқVUVݾXv݆X5^^0ܸG4׳yd6WL/wz['M!؛'Z]j 6~SJAT.чI!^QHCcD(I#꓈iMGyMd_ifR.0_=_Y.M*ee|*>.,M?O[iOdUfuIV+|i|WfOy'jMw83mm>(ӄ&SyZKWMJD#4Yjd<& i~eو܊GbeV j[hϼ-\c/2ͪF=E^KuBOJyϲڿܽ5ڮ}4r-=l25H$:I$1i@CʌSs-X0;\V؉da 2Zw4;2[!lY$B>ռS@`s;8ern{ESKg+7G(Usb8m}*ԭ4A=zΫ~#y:O H@^OGzs5D Xh&7a)(̽J}UҧIornqwV*L:fҥ)ib),*b흇DZk+=eQ<2^.mWsqOBa^F%@0?'O" Oc[MRrN>%z ߦ*]"U|' 0B%$!g ?C CBR,qQ+#Ӟ{;X|!M-Ex|14<;&ڴh]i .ڴmQ*8 x2)瓘q8$xoԙFw4qPJ6o Otu8vUCR57F *8(GvrQ'Nv}+N/F?9'G4,s$N,O1.b* D#?^G<&qy-Ok?1JcI7kA{y-[כsZ>+>~aW䘊j|;M}HǴ7e|C.+} J&IEr6B6$^.Ԑ#1;B9^?h)]( /4ezz%DF~>}1<$Ft;<'"Ȫݧ>~皐5T$xeɒ(B# +!T֌,2#c8Tb6Pqx]D<ʸ 4@pv-c2|opPPg `v9kM+=ء oo> scJ=FZs 1Fd`aK;0F5N`qQ1#=16ku e` l@=:?#=؃z{Bh]2^5)7i+(*32clTuMZeI^:hIi^3K0I+IH+NK"'qP & 9˳󬐏mw/vU #աxGwew".;?R;<zԉP]m+GhvJH-J]Qm-*xeVե1GҝQJOn撻eNu`UiX~)mB_ݲZgg]Bj%ZhKO[ *'}MV;C_ܳu!}=QHQx0儅L<"̣J&Drasln>NF|n?{׶6mSe$ݓsvz:3/.m.TTbo[ΏXneɺ'l$A`^@"u rltUm]ÒX _qe2QSM tLv6 .\3n" i9!` *Ld WfD$ P+hoy5O5Qgvl`6^'dc~ @/LihPj6rU-6Ri>yTβu(k7HfNB2kKTyR`:W+]4`'ʯ~5<MGߟ~_bFanKaWo"J*{:H@OTi\|AX~rջ4fKML:Mp]{s@ ~>unm$dY| f>=m=8Q07#g]AM*_m.V^N!XŪm$Vp o9fR a01 uL1xS0q~Og>T2xm s (̈ѽ4vcҨYE2L{1>Y%7_wo@L";?kA@GT*rbu0 c5G#lfc]i!fֽ˰ W6@:K蛼*-b+gxoO/LN>6A;\vRmQԻ > rֽ[묛mqV=ԥW?m=]7n{v6:~LΆ uKSȶY=-?ĝy;m Y N@"@#ĈA)2NBdͿ N Q:kBa z rH" Q#a͓;0Ta0a0aSwŔTD%@J0(IP0NcvHG s9 @Pz]YT?[:hq /2KMտGwjUxnUEXqc 0RU;`zoLV|[SGf}ht~CfFJJicɩDs̀Ah7hԩ]94K9x|O+k5ߴFTɗ?*jqMPöaé~O\4\7nʮSIˀ5e弜kz=2*'B9WC98ZF7& Bl#'S`V@o*,$d? 6 1/\!+k'9j۵5Ȳ94X͞^7~ZA\yRײ4G/Đ7v,%&m5wFDZ@'t%nz 2#Y0un]Z^BCiCDF (e_ˮ^똦_*kosG? ۹3 :/}aXLZu8s5y.#MhkT`Nch.Ndv9WO1Y2 <#7fZ?PDDpbC QD0PScOW)T9c#Qٞ3vvJWK!V*(*gR{jSc}EDR)xbIgP 戄qZ/zbcO \r_%s %bLHqYM@)1OyJxZ{JY(1[șN:`:&uDެLfT5N<èP0*#Wsi7w͝d)5W&f͛entWMr -婮={n,*HqWH($TDP;$ўsA+AR8lJ^yd9>=)n ܰ$Bp #NØ@Xti:@0PNaBF@ FoSovSŤiT_?QV}w.͸1LaN p׃M`S^8ccSBNx4,i?6<%#aiq!EiHB؝+(@iEeٴM.zYQu__e|}OISnW@ۈ F, cF$a q4$h/\^\omڸ~g}$&ܓt`lk&Tzǽk6R}!be>T+ -< V Ըf (䀬G(E֜LNWazhfU2F;9'&`P=l _ذoӡe=H=_@DXxIWMt ,!WX3N# m+ cOZ0VY% AED1e `)'B(hl 5 `j磀o_ô_}pmWM! Gw2oDo(N c㡄ig5荺y{-%elm5=e nлG`)bu^: "-BlۚRԭ} 5R hM?ք8H#W6r|o^ۀ']{([ JYzmN#9`Q;nv{zU7wQe.10 Zz~ s˶E^e{f@6IM^`AN yǶ;+u*!z75{ wnU,ʵle4 @'+B qmg%-c6_ZFm8t!?_Ė<ֺnn]ѫW7خjd3#|sSiH5-@YQ!te,ۇ5. p}_h3 zň(ew -lat-spݢwظLSx|^Ζ7$GgQfX~L]C23JvlaeX˘XS{0zYfO<խ5ѠOv2!ƸJIn.l]H*긾&ٲ/[쵨q{?r㡺Wr\.|E3/P!1R8X&!g,b'KN(c*V5ODzd^^ GFA:?VBeoqvgng/b5lnUR=ôǓk1 e7byn0sKeQgw|]W Go 9¥q)Z6ʳ,ZRV:{vF}$^ ifiưBr.< @Pq%WVCw8T@ Ī+`qV.*Cᖂ+]lhTWHPZ嬝W|QW]9 RdN9osʓ8 b` 3 *)OT FSI/R4> q>D|ȳE7L-=C0!L~~ N9MGgFe걜 SPY^2τ`A)GqQ4WJ"H;1LNEB6vXi)tɯ^le[*2V݅߭&}< pȀ8ԾA"ƒ%%U~ T@Lؤ9s}T?rO#_]tp}fԋR;K, OI N%qA a)qG WO<`rGipZɡDԄMh kz 遤H|Xd x∀KpNIDANBN#f+d݁>58`朥GxGhXO<%nM^v%7v/J`iE =I݀/n ^@m˶z-J/̀,mKm &Ȳmޱm*m m{ 4RMջm__ҡ2E_UR=eM@ݴ#Ri+|^`xWqUĄ>w/vg@-ԸrbY]򛬏^ө;~Nԛ`b}9;g-ٴoѲXΎiYh.bJus7 N>tӻRIzB$Y8RzBbPq@4$ Y*}Ϡv^Q ?ԓRAMwmG_f!L=F=V9 >ɛNiYFʟBPfyL#JI&hSg$_)ȝ'aIG_XM`}9>e27"+Bڃ;A_v}y<+uty!{NB< yzyN s#<^ tAzy\~AUXm_OiŸsw6.BcD>gPM ~s,ο]uh\c+#;1f|딐dAJ "$eP,yK.ZpYf~oM< !&BuF`/F!5M-JVJahI݀VJU&'Hg;؍!S&nxyԱyNm'H]YDyz2[1.dZ. GY]7Vz0$CӁzz"u1̙!7unb"zDe!, rU][|vw}49U=UQeC <_<ï㯟;$Yfq]f5sL扒׸eE^%s2ܟ|k'I v@@ĝU`)]a G^h|&XC{_op9T{ (Ǒ KeATȂ,/HSY>gxN3$!9Lhӄ2+$IԇRqr !B1rw}?dR!+:j}2bF+Xu\pAŠ",N"Ms)4KIg$) ʓSLGxsxe>Y(R㴔Dgl( I4¸}N JHUN)KrJg[+ACb?}^+㮩εhe!␧AH0Iˆ!( 4|v.=C ٥8aQ̭zI#TC٥=K}%0˕΋i˕sJx.^"`Y1ccD&r|EG%G1GF_Dg@O [eR)˂ 82ee(Qw,ҸS4P!xxt|h1 tG@}^# m7mE냬Hg  #Y٦%iq(CXeB:>@ =Dt`:%Dkv c:&.@6w"R"a|/}betsޑtΓn<需Qu`'ezB 'bp?!o6(iB0 u`-/ ̡7K|.Dc!Ȗ Ax'k-'gP2!!03a.E62\ M(̢qBqC ; OCAҎ ~8>a,Fې"f-|P,ah `.rE@e" $$-_X;Q=S(ڤBlbvئ(Ж2U!߇F%0ԄB-[%PIh(`Pu#7CPu38›:7ml<|X"SD#\߷ݹc< XWf)H ?N㘤i.ŧc~,Zw:jؾøYwo霋='xx^yw B_[Y*|%=J:/2:&*d< q`/#=kDzƈh>I qͧ\8baU?%8QQ"BI4HIYd@7ba{ES r"0jN&e羅i;Γz2ϴB$Nxb ~`?I= z}_/m yip 0$b^$y.%)s²BjY fi$A4_*C:=?_U5 2Ձ_mX\̤M/'ڶF~_'Na| ob+e6Țw\/F=E;7Q"7fi楉6$IK9խׯX|?*m&7_>6JTz:HR_X^땬BR\!Aj/rƴN'bab7͟ [fY Nj\JQa}prsb5 Vޤ%Az{&z> H*3Q+0v`C >on ezkP}665"}"w؛ bPQ!賁 z[ [Ue}6v݆,*zAѵXM=`= ZPo m7hq [-DBPmg Z9stPH-K ;D!z||hw(Lwh X v} B,L4Do6*ʡBpt}`_<¨ --jVDeķj|__`}6%ѩmGMYM?BnVQuzDh2`Bo 5>auAۭ݅Zo =q[Y#K[-e]cӿ*~`  @f\u@v>,Ul:zj,L[bP=`?r; HĹfC0؂ ` BeʁwwwD1wksSPײET9LŸ& qnl,IDDca|!WAD\m`UΞ*v C[?#6~ A| 5>w3)t |;d{D1wk|:{ 5>Cmb0mV `a$u~#B}hUX? cT b߀l@:+1=(ck2˚sXkW`&ƼCoBEMɅ<;@Dm{G-ځ7߂!ꁙN`9h5:?)ֵwn^@NM#n_ ]} !V^S; :a`Xh]B- \+:f; ڎG!_[?5iX5 q&3$܂}MSj>]xꇸttTħU-=H_d~/x,ދEM/سe,b}PE$Alj|!ЊdrRow4t۩=I -j2NhB *(ɲA"8%eZIh$e 3_r+UgYց+ѱ>k}VKMm ڻ7O?y;`d_֟n\;b~e֖s+z4ahWHҔX9'C\)-5 BWcl@0àz 1@#|Y#K4wMwri-j|vD/qЎ/q)|ִI^硡=B$TG_IIrEQěv0{2hbIgu \b +CH?ozۨ>|E:,^1Q~鴯t:7cgpRVϞ=QR.Rf4HW)5!M SĜ-OزnoIܶ-:;Aa-3(fxx oF|aMdOD)AJT.Q&I"ڂBYd>8vw5xLڽzz2);+Ԡ~`>gwٰc3kUn;Wbcۇ]$dž"&>G#mk˒Y&͞| :CGw,~ } o0o'ߋr v{`<`~a}ID #%$ cI(7&,eF$$ܗCޣLx,[̎iiFc"Y}/L|oOegG(n%Y`S\"JB~p%Q@Ec?[8G`T.Y bdQAQj?4FUeЦ%Q@y! ,C cSGC#0Ц:+U`e 6$)Cnp.To[adAutQj@@HjJPHWUppIj;}_hGdypw>y#k_۪MUwpQxvfNdhfV|ڶc$/'qW+$|;5ֶ݆2v# `1v yT"\_~\ׯ? tG3;Wr jBV dsw{VX+ 1)*bB64G!oRKm'~`Wfm#Ko\ 9{kD-;dXd4UϜ5mZVwiL|>?6W&@-A6v ?az8$ŧ(We*q$I$8C 359/nȐSiXDa*ٵ]MQ|u w9O[Nى>;g'^a}vNى>;qog'Nى|vNىϟ4D941 SZ$$TTHB fIO]f$AeF0s~F7zςx@mpfɅт*p01:E""(*"3)k2 sca.=}qO&z-wG] ̽gU G|/=CvSx.(C-O5'Q(DrI&IJHj73 ֚Lm+5mid6{xƞ䟊/N3-ST9 IGKI 5Q&$~4,!l%u6%)jS2Ԃo)o>e>哐!QEkɲ p pEi(Zx>O۷<%DyXBDM־e,̽P}'gH,$,?\EOPX'.;{@u;A)]C +lTmڧa-Q-!Ch',Bڈ#k O ZV!TTZZ'IF)׀OAm|r+Qr+P"7ghpC\>5AEQ,fkPY_`66zU@SΪI516aSx}` Yz T +Ibyu #[ZydO氪0)\s*)O!mZC,٨UXwlc kBxRIlADܚa0ֲ85uSrKYr+T QRm%QliC`Uk!RZ1j-@/ eTG9K} k ˜}| {YZkTai&E :@FN@$11c( 64EjѦ^qi|[op|K` ؽiRe _oQ ʩ`57YkT |r{X"GH`#B>@tW.Fp(ȭ+&2L`ː,J u+C\"U['0`y kQbKP;L J%ds!r:q ,֨:MaOv!QjXA f4Lr {^]J.v5HqI]q tFhTmڧT <\@/A^HsUL莓Oj: 5B||{mf^Fxڒ,dz%[]߿Ʒ)]8+Bv쟄@%37+Ah=FƤ}S 7Ű,n(Pm5  '$_R\B(nB#$<Vt`ʥ u1MƳu:̦8ջw7 tPhQ0#>r{ċ/0$ ۋoXyXe7e-gc%0j&0V;U01yLW+ F/ #]8~Ja~&bB@7A6mdn#"41!#>a%ƕ?~j< LZ6lF1G  tȾWBo _x9)gQ1(4j R;η O3[o# ֢w0€LE 8,1]^_azrT4ۭ/Cƌ.M<WӅgqCQ >n RHfT:HhJ2BR" K߃uA(GA@C E=@Jw"?{[Xrzڿku>b #C2@ŹZ 5Q7Qˎ2RҰڬMWŽ9G U}\[K[8:U JCL/T ӨB%2n]<#A1s6e4̳}ʩyQ ׋/{<5U |^RRtЀŢA :ή(AiQPl>_`B`v1/f(=hie^+7{p]ۙf:^;k^]XN&v }vzS- #wOL٤k."LCƞ}H1h6tJ3CzzZj:\K" V4Yc"M2êRe~s;M#on͇^my۱kznWokP篼N+VTU|k[ئs9ZM5)*J[*#iMyBsYv9;)&kŶj;tX!áTea}vKmaJ+6LiSkAe"m)qK/CKxŬ\pz%Sw1]-Zi |= ^oҥEmNlfMZi^,'EqcnY/0p@=Àt_aa/;U0UGl(Hپ%vm>ɩ}н2g aqEchڤQZƊ2w.3vK\MGK1i'qě.yNc"!]W=Y) ;Mi=%ݻ[޻[Ԥ[޻[޻ {wxw{w{w{+t^ʖtHEL2$iCd,\)AlExׯ^f*6Ww;6&5 hQ7d*VvW=/~ބ/;DsԀ 44`G͞{(}1WkԳpL}IZ}Lu>Vy}xq=vљ^ NYN:gn..bW_2ۤ#ަՒt:hz!.<:45wx(d8Uv p &bSD$&edl(-Dvw2)G%~ɸ>~R]e/"C.Bi(j-BXD5֠ ,I![/A~ݍ/jz|wy>C3׈?Xޓ~Ewߚt_kFv_<Ll-T''KTO_0gGd\FGcKzlx4xd@6R0/fm0UIBeQT${@/mR+:r,0u}1FM*B;\1\ 4jfőnUH@eT_(7jA_X Kªg)ZU] WuQ.ʗX=BvyF}$0$*b26&Ԋ%ABY ѠZWQk%EwfZǿ󈷹5w/aTpom LVB=uW^sW/멀_OuHS~H_]u]k TSC~cX"l>-@s2H'ȸ$I IbgEa$zWߐgjǕ} l rzf';3LH6ײԌ/ɋ ARmYQu} ഼)[]ƹ M'tj~[׷_GӬ_ʟ\{A]7=DJ}!z8Zյ蹼=-@H@=YzdG^ݨi=1s;Y39Ծ1z sIeeՖO`2ɢ֗b_&iaqk]UFJFZUi0\B,'*mo&.Li[d_{{?UTAɼc9.sȉH17FP*vզ^hjnaW_x@s |ѤxO˦D ÜC;gSw;smHW;{i.=S4 XaD9Dh4 (~znĮ&;jѵ&St5鸣NKߡ>^ZQ)DHQzzG1]#3?sksڕZC+ta[t/1@^dBKp΄ ;.8Xk%ʼn:gm5`:~@}ѦCINv?=G߲Sة֡;U  m[זkjk(;+ȳdGQ})^;Ci("ᓄā$ؙ-v6 [qx';t6ꝝ%ώȫr)ϙ?[liikjͳmPmji$y(8L(JOIPN鑀 Jĉ -Qu9bN}n^@v4Ou~GmUt<\ғ\fYwǰ3w-OԩÜ0 kA, (p$".O n7؁pY6e ^'N<ZˮmpaNL0ǤRTK9e*MW:|bn*}r_;-~t%zs?X KOqE0p$#0h9_n|Z-%-tEǻߪcN9*jŪPߋR^r]QFzzGe6 ,\ξOtu?|xHfzFuT<GVܖ߯S=i .K,q?2~@KUv-VH"H5h(mox0c 6z߾{?{{׿ߝݿz}_~M˻EY=EY('1zU\XY7lM;9m<+2?_b8K0PVZ#;v1,T:2tp j~$5U@]kc:ׄ?BH嵺 U_#Pӛ424t-f8 T!ۙ޴\N氧Ar]]1f@MX# gjk236d2/SS4+OZ"l`m{:ȍo M3[utej ڷٵ]ЎզȎ-@Gzwۥ*`we`@k1ej 7Y-]WFJ求= [@oom!F̻5&C[#u>TX_#ؤ0t koo&V?q61]l:!pgup>+55_z 78`Pd i6fE@IiY{gP@QvJ6Gmu>erR|*K=B"utSůLMc5ҝc /i1W-YG%S֞j5Jᷟr -=τ@-Ȏ#>ȼ2MP`? 2&.YM0_ᅹ4*nlp.7O?^Gy|un0ܿ |=+<)/6k\\|aA7Akui]s2N<{hėYz H&Ax#9* 1-p@.f5nL}*˄;] ,_?}ү; !Av@ # +TYkh\o&Z~G;R9ee_m$I\-[V@Y<ZqS-Mz`1u1wk [Qg!baWA~a? jg`>\|sh)g14q[P?P֤~#vJ=0~+X߆ eΞ SM̓9D PO?'k%\e߉F6XCqZ4`A 㛼a(|pE:\-( f ~;p}Cki!:EӤbڌ@{քA}EaŴ` 6f+  6+\G oMR 0>z,\ \ďz?4~<2-75u leMC{ nE|/5"w{Afz-{q]^OUƈ-Ē؈,Hꈁؾuȏdx\n`E)?cQܻBu 1ѯ&Cs\B̏vH8h]AO4C 7@C,@ĂN"!'b" :ATပD(4Ef+P/ҡ@ĝr坻Lǁ@D.q(p doj"19dIbM$[&Q@9B ʒYD1%g1HMn`(lcZ#&%9_l%A&=BTy۸E~# #)B_IEˆLFbTy [s>R0F\$? B<.Hӣ{nhzy~"w&{Ը(?Ԙ|8b>871@4IN74-@_i_mr "l66/mI<6Tj?P81 >C,ԕN y<.I"W}$#v~v65s'/8H5~/;Yk{^7R3_ls \d\V~zOV~Oo[Xindt4kOr֏oiw.*Z}kwZ[]`Y]*"Vq*AVq*Z}Vq qO 2HO('TkB8adҗvfv= JW7nc)uFGb>eyތa^y9RF߮Li]&&{ҩm5-,[|^3:3mDa#B>Xg慳38Lm4>NY~kߞ@̣pG_J.q7(O|~"7~gŤ"H^ PQ@=(>w_„QW?vc08| 0۪=0.ØW1v@a8q.b.. 8n(,vNgqqB/HxDEhs;TD?zPQu< ɳgťg2ly!BVՖB'd Bђ-/6?9۱lyVjӖlyx@兞 "#v&KmdfeutYj(^;PSY^C#M98DƜYfgÝ-~Lge[kk;kmQL[k/b5=J]VM UH*( j|0G^VoE\lV1\1 O_H<[dE0vn폽co`ġ,h{eҌO;őy7f}"0 sm>OTR%kG~ [6ͧy)0hO~ ɽzg3'99pdXJb`k=Ld婂?E^MVui4ǪY.>mi3_gWoikCORsG $@x!Dш ?I#I"B?•(Y2e'sC =~s{=AV:}ǵO;e^'I)f> =P.8 C|𪍝F(Kڊ{q?p+-p2FZ6jnf7PH2:|RlT"ʞʒMPUa u}#l4b;C^3(J\qBAbO I=/2Jb?>~tWq~4W[#u}}nm䋐yZ҆|x֍nu#iHFn$hHF.#8LT@ x쎭8p:Nǩ#ܠ]q%pYqCvKg>?j >1kF8dOh4Gvn_.{)0tpG~`Ceܞz@ZcN~hW5QƘ+y TGc#hZX{zeM1NAk{)kۄAZa6E}TGc:#hSGuO#=.@ -R@#TAuZ_gnU~xCKe~pS1g^z|!Ty@v 9x-jȻ8cu70Vw~72_Ru;oٔ^. MyeCJ`];z-xyG[;xvjv?0=ԣD1>̛/ 4Տ 7a;XwA>4A8DC*hRbsgGCm{P`yZ2E/7*`õ=B@ܐBzU"<47^᥼<ʸErDmy )9<#o%]@Kya؁[ygP lX( Kv)b:c &YGA&ƅr<s:13V%Ώ+,]Uo8*,M,SN Q I!ܥ>+YǾr8_K[ҐCZnTkrzzNzqjvp3F4B݁W.mYLZ12d0NiwijtXq1JANzdd:z!ޘ?Xf YNGﲙ-6WyZuy]ULm)7tye٦(9oo gWv/tft$X=1Y~{>*vձY8_0L{3FD^tdR{mh-9^cVޓZ$_U-˯;{߻]@h39wKq BΪ0 Vsyؠ\P6{ܚL^Vd8fF3X˲x=iL_k3|ͱ^-z]eMmɏ,$F%aټt$?#<+달ճ퓦JjJ39(R9LP*GTo }sR(t@/i 6S LgnVVYpp^ 𽨌 9̵*؊QMo?v>\KՃO>fvn1_>IKPPCw 5Zݙ!Џ8@O B'XQ,?ubH!y<7g)N_ް giVB<nұV))aq헏 ..{,o-Tk`xp]gT:;VVG]@Ԋ#"U"Tgښ㶙WɩR0OcoM6&'H#pLr8~^fH΅hFm Ѝ>8M}]h%wXݏ:KS陪ު^Mocpv_e\1~gr'^*},i]gBX?\/kX.ո iY\~Ȭk1_N&喼)$9 I#IӤ8\+FJ->;b4\kBۈC=h]:a.էr1sdY!)FcRClƎe^y5qZZʙI_dsR>Ujj\ͬ@jT񬦘ekঙa(%#<΀eq;B-E%ŭ%-?A/)ר2̲;,&8L~հQeb*X&Hl>XtIO׃U%'Gr.Fp yGL>V%no@gBuXvKqn5ѣ~ǭW^rHRֻf[[عS9,+e^ϓl,zBr~?_8Baʿ(4pX8aT`&հ;8L߾WW7echhπO!4~e=l ctgI0C?A?ƾ;QnqهuN07>zS>/̓#>!ؗ9A~kR>&s@;P\qUF]AH]#f&S̟l'LISa3AoMؖ|4+1hbGTm9#|G¶,#hb_^ f ޙi45ot& eP& u"Q:XY+w2Vb`[g&t>U\M/ m | '<u f&&6;{QzVi{OKqq˱mI}BN:UJp{N=Gs2DcC4A>ks{0R{=ػC5~. s't6JdXĄ 'lU xĪ qsqb>㸞ѩ1| LD4tljb.宋1 c!iꃨ<A}6rg06i;~ 9UYxTQr.pY㑍6x%:ᠵ,R1}a1(ڌr1^".k̪RmV~W "*ѮQW>n'ʻ0~U6P)Ҹͧ]߮RrbѝYz=KTz_Y^~kh5)z7\Hmauel(n@rOۣҔ}`.Ga$vl!μw3.qi7.qi1<~;=.H׳G\>9ȉ㖼M;SΔ{<]ԔYwSNB)yؔ۴5%LɻƔ3%zSnĔ;wr\g*יur݃Ex  =;b! m2B0`T0 ώI1=  yN" Pvv93x RYsDSeuNN#N|7ȋ.B۔B1P= B8ƸQ 1>O3bwu&LMW0nnã1#LEd^Hu<*8'q9GQBd4Dp6l1r{/o$ѯ]q^z\zbabN#xZcOO]±8aƱ|A8#nyTnj;p&A1}:kaJ߰'V'!mz:[F)sNniGP+ |Fh5} F`rAu 8c@`J$= 8nn`%@FБ>ߢ3 A4z  ;=PTGMVhY)@x h$P+v C$y@6 ׈@@#{S􁂧4r T@_ZO\ @3$9-rRK }M (/EwU V.u@Z@Y) A@4  F&  ` ݄u󴬨zmV(J +>\4WVH֠m’UfR}VIPnu0U`oUWo|cͅ5E( yU/._]\[Ung9/^Z7b.$D>iaɀ EY-DyAur^TmQZjz$鰼e4rU i_d_>ʟ&[7O^[,.y{Bճh@>KՠJK@mWέsw|Sq }fIt77(@!nv{S_뎨ֶ"tךּSgTE%gr^VOvέ;Evx_8cd.Eˊp_M"wx,|._Bߪ7Y3<ݰ^gyZwfgcE-F`'uM$s95T^El6d,ndqai { F:Ev!.ӛh'}cTW[E7ҡ#ܲT|R6C=Igk}k=`3yZL\VX>119ŏ%ɘRcR|VogLc:a)gmn8dMVƣ }5?OjUjƢ<+VkzVd&nu!tN@ӬԵGpz6 Q.{-+gr!НbX 9k>-s1!AQ̹8p9GmŎgbJSĔ#y1wƔvAC<T:J`g<ɣ`ϝ_J qDG=Eva!5%/a|ԗ𑿱?-ۡi;LWInghx|gh[DB5mmMw'T>N-hl3^HnM 9m|!BA.h(-=)?"f!.pф&\m5')o>׽>$ gr*-ʙE<+k$ K}cN':mOym[3W3k 6u)5Z܄9nmE ̅)s`Yh~QQиu55VcF6.S^% QjV0ʓz<),y{]C;7{]{  %3ۊdʶp]\%b9O{Qnsp}7R7m-=qVZòQְySӟmX˹ӱKD\ltL.\w*ekX%R]˾,ux9 <rE&;RNEz<hT J1iw *,!S7Ox%5:UX=tM.T^sQU9X}boLtmoYkd/e*нR&U[ڏ߫LM堁iN.Abɢt VN:OϫgȊo]®mGf z[:^v5^ HT^JM;nհ^ӂb0`Ww7,g/!2JVô7G.?6cG8 P3H:NE6c yc[lI`ly*o2!B&.&(ҝ?֥?{}dq/?=>,RIkW=2ItT&nGvP(8f؎c]Ǎ k2ySl]٘C>OS"he2р%2'CGe2!d@&.a2&a2&a2&0 4rɤsd2L&dj- ibLɴ&v0ֶġa2&Ӹa2&a2&a2&c1wqCQ ꐏO|ʎW)29Rjuc %};HM,܉5;R\g1W -.lëeW|JRS_Y6VB=lvAYu)GpjT6eٔe |j_HxtR! zK}בWg-1\/f`D Y*}tZySZhuSL)({Sro'Aƀ7.AneMou'&@kJ`6'Mhd&76æ. U0[P&MB/ EO1J Eu8@褹s٥CAZ8IIBa!a N;f 8 0jHe74Cr-hGmef3LK@4ђ!= thX˧`jN p!5Z! lOІ [6AԐ }Nƒ+g2J<>lĚY kϵ kè|jnE` kR!k0К 5tleC@+60!6!H k7(p1!537`>=pM8"1k8C@]Dؤr]!S{C õX^qoE%`ZN9aoQ63ӢzS{=E>;H"]"Qb ws$<ȋ?rm͉k^YVX~۳~!3 [')oFV]"%3-y 12_qQ3_oxf!Sgښ۸~E>l9}v*Mm2 Ejؤmͯ4I5)^H(Lդd h4wnû6o_W. p/zZ_e0'>~a9M280+ Op44rAʾ,|R]Gd~ +B ?Onlf-gz?ݯGmʎڇ?7xW Opz˾Nm$2X`fLyR7 AK:c ²\_&S?npu5_2\v8&_˵qMݤ}&:Ut nu]Èy[4k}Zď*.S?FɫQ0]CGz/^;Q󱟈utϙg3,hXە2 Vm#J˹8_gfஇȯc5Aכ\ܮ|- $@W!L}?fOޝ_$w֭Ѩm9m?`WW.?92wY[7p &խI8OZWb`!-*S_9utXGz,_sA_g{Sk]ݸ^ F[={%kj(?7oDTkŸ` =9$HvKy; A[]WN\;iSsY;gmD޴r>HdRۢ +%{ZZowo Ry>NOᜆ+:05^{uzRԹA? ,_g\.A2Bd3KWODNhVI3l Gsqiɽb92a]݁l~m'жl kw],Zq5nYq0~6ZyG&2i6q ==.\SR bafa0cE*V)$*8 i8dfHfdfHfdf8!6 \ȝfa]$ ~bٻ!Zs|.49LF X574{~bËSj~xdI>i$Vr,JS#dYni+x +x^%zLmuzB9]/hiu x׽< }gOD 0MMq5Wjuۮ3JDj-\-x`80eN߹v+^P_Hr8HW] &9m8'0Gnէtk^Fߎ4,_32R7ͧ@AIGf -=)fݐp?kz}=O8C2~ Zqh-Koz>Mm裝{ChٱRǬt*OW+Ob`ݏ]92K6ĺEMqphUp@/xaLn7*hƴĵȭCþV]ztqS}'z;W~\sF 8*}䝭ԠN#}kۮ^g`Y?}Drӟ`ϋ;-tnvzVۧHpa,+z43>"؃0O8nAɝcss_:l5֦úu울.㬌?Ex{;.* EwW"Z|+<96@}W7>7{_sܬK{AlH^K/ !Ov`ff_H}`DT+eҰ i /bkbǒt@R\Rؼ22djMLn+K4F"qo5w~to~lbOX3\d -3۴)'f-հtx E4d\_ɟ8ɟ9'J(ڤ(|ɂ zؿ r[vxJ g=1㜡u%-6jCc<[ʼnoq=7 ib Ɨ^3[5*>ȫMS tf{N&$f%UܰUĔRZQrI,rLl*|uW/Y2wr,bX)*~ P~hkm}iqqR$B\ԅݮM#S ~2 ww]&yOAttsMEu*=>.[,K7xVM3,^0^;pQ~?MuRV %0ea2 5DKCI\KH|w]J,49Qp7ԍH|I>:N%qhG ҭ}6S+M$=981ⵒs. pe2td 1/S OUH!^fxLFzƹMQ,$]uzQB)5iFOZ󔯗% R8BbʒR/Uk]ZsPe%h.¨eR‰$w m6!ߪAy~ Ba]^o Ox~ 'T ).r9^]:W7AGizRVxN'4^( b P\s@miJ$lӃT8ʩh07(:W8bcۑ<]$nEx0#KM.(;_+EHIBZBHKpI@ʼ(r\RFM;= ⟰28bI1$òtr:z+['SVۙ#\p ݆v8nͤq swA&厶4&O ԏ? WWW?c|߿8- αZ3_oqRYc}&$}S7y~~|_d7#rO3'垄y⤐KSH!1.BpťɩĶpcx-Q{:0M4˖͗8 01@ HSZ9atD|^&LiNiXNrn&Y ^^3aer{8{2.r1y) `o%A%2qVXX¶öj'%caC ) po86ǰ'L EbSY52 G[(WuN '$|Hxz#%4O"#s$.4҅R`]pm.[j4QQ4&hC|uֻӽ,ˆ9 km@ï'f90 H"eP]iUTZJBWT=,U{BT`v|zI7AΗସ )HWFDp#>RT;@T;%"k)JNXv[WE.xU< ?mqȽtZTҭW?B ;z,<X* `~X* ؙ 3D9 W8G$RrVNeV8" ^@Mʈ_=T F{-h<qT_ S\m}l/>8$ӛuF\z/,L:$/:ztkWaQ /Ɠ}U\^U\U\U\U W~ Sʙf-RVP,*W%2/WET-)%Z/ωA9YMFA~Es`q/#5zyziMǪlrTSq7 ݀(H"T40Fc- 4GV;*p!PX9C7rNH$@j N%<WHЍ j#3FQ?EM^t殶J@_M%HN.} :ќ2L-))fBXrLaJCNű)"{& UF!~{fǐ=PdTT~;x^{^~]SLwia*uUYH*%%\JP9+0NdHVjM׃sH&s:@ۘsЁbNɼ@{vl3rQ? ۏdp"wwǰIO)I5";bVLɱ:5⵻1zt@Ȟ 'p̔U&'HJE5&悹XiVtgA\`/OuKLg_ sk$`8`tKdT\h,vw/0C+at]y#Q7$c}vԧ&R]ѿtjwT~T m;Ea"l** T弪P+TToۋmT7Li)%B6RX?zlynKhWK{%P 5}GmEpֽ(J[좤GBY+\1'+z[d?N'_pc6k/|j=Mf{U(㍢ z_7 j>]WVϠW;e0~}WM1W6 9fVv2Κ4@ÛۑuT+!p8&SVE0a9#(xMWo~;&\jnKsFy0, b'XRr%X9%E0*vmkw=S}Hp,۶Woo2o?10MA}PVtخ+ǤuVRQH mYTB\ ]T I]du  {| "D׫K%mDa)}S[q 냺ˡkzsDzRR/_HXh="TE˘Gh˦1T3Âu \2tO Z[r5.ྑ|샟 y%+1t]NCt[; <>d=8 >ӭ&Yl:Z\d7kE&~$M*f'>Ch~ɉi.uk4aO3S3o?N/p#Y=oݑt$^*_Ը%V"sЧ쎚w=B"݂^oЬFr4r}@SjPHhRfF+Y CR @gԢ ct=U Q6rlBs Cv9?")" # :`7!dX  b e~5tHϕU~Dr"D(=E 7: E;|G οA[jXᩦdJa KЫqʘoux_?qe6yv(ETN.r7n.Yl"_OZNeNXrA-_AOX~/|Hǹۏ/hL㩜vԅJ1tvH}|˱o\0Nl<˜\4e}/`RJ0?֚w0t(xɻ)=v8썯s^L?i.AtK1-Xs]jc`0_74.[Zn涳HlT vsyY|~27<<=CmPh*ϲuO `t 6pP^n=llu7P^VdPC-]> w_tnawJ amFr RZlH*3n 9DXm<p3C?&Xc 1^U0EBl)e4Xho1==KoGn L|EaX9g}S1y WeaްCZ{m}C.ck}\IS: E;4%i7?GVfk}6Cs  U_K ss9 [N:s$fY똫^FΊ ]ruPEV?-E\wIYuruLǡXuPP$ s4ӆ̱*1F=mZsjтD!@,(6W͇%q鱨M(Oik}},Dh@"y7_4DJ)345Dh cJa2 )o ej8C@1&oh%ڛBj=#.o/B`!wG(z,E$f?Mm'Bݵb.vVSm4d:THm *¬2Hb'm\;YB(ma " l]4' OUhyx  b?+Jv"*OxMPpͭ@Kv#;]c/QX'hy\R]^ae >SB2hG 0!if0ES--' a㩑Ljs#&-}`)2x_%jկQ{ 4c*0DХKd -D‘:aقOrvL!8%V`qC*n$ v3cյnAQ2%µ~8C+mvJ>nike5'U>Mm&C|lx@پE ?MBڝ3sJbA/.|>;FZqV;cŻ0;(zN ;&OQ]%hC)͆ӷA-'z~*$fFdaZh BG"[#[W_B# %N«D ȣ"n)Ĝtfg PY 5ȸIĤD2"wum!CVĐ!>kcHD"1YyO8Bh"@cSsZ)T;CP |6]q@k8*q'3#㳲@ &@IDF K0pΐmjfTjdqYM4B{(hZikxUՄY&әsGmO);=?O)Mye*G|rwY}i|踏{U/?Ug痩6Rrj͑UBl\M/܏U>xVy[<0f޼Wa|۳ۡ|]Km##kiBP2l 4DNρ5?_v|,ayƺo>SBnTwc7+8O&Bu+> >z\1EI(˸ $ ???}(ݮ:axo7-_s?_^;^LNI嬘4}uY1dWVF󟁏ן>ac,>}kz[glVNթ&MMLn:á RBF G# 7)-' JI*ꭞ[~#lsn6b7s&r? g:;80peoN  mjUX[Aмac8tG۰1 !CcR0)NA4 V NY [4l! AlhˇoIÄsa7Nۯ0m9*<2V^Y[hT;UE.vQ[.vQKj%ko~6E*0$aMUF $hb s&~Co˞ S7!uV9#c9xh8oqt(~}=۷Oѡ:tx=7{%2[0@N7# oz͐E‹p_Ы"}E";doEA`{ejV>A(u?ƌe)d,* bϒ[#*?|ڬ!_Gc]X޷#w56U u|ְMYUk64tX4]Nˋ-vfʦ)&LPxU f:J0BB# B!w[,i xwu<*RCL`΅1Sh6οn.|᭼ɠtF\Yf[kq6:FYfJ42%`ͩQcXQF@dI0E0,eaLOa{.MK;= 4[M-NQ}h:ڡGt޲;(7Ml98Q'ǜ~b:˲O}p!wO7SτRpL!؃% Y+/}H7v %;ڤK4hByoq@ũ0 BBZF wDk,E%q jG,$4~[>zNE zNEϩcC+zhcZ5dHGȓR-v,@ AS%$2, p* !)IFaM>ةuhua$zZLc#8{y{pmurvGJ$:7-x "p.wP "9<;ns=-|t8ׅpyєM(jwK^}xmE/O,eK}?>4"(.%h=ǿk?+2.FȎǢmr迥;ER:mG@ɿ”u!_MŃRhؿ_f4l&HZY|]'L֮@8x1Hp:jcQQyknꨆV ՏA=SdzjX5հ*:BWc}Y5 |mS zx_?g&sݡjos-,hucQVJdP:bx4\?sMX[GA$֚kLmiq[}̝N4\?{4ºkO;YyvJ@)wL{X*nmއ~m_z:S;c^ PRyx>~Fb.=l}b\"ͥ_ # Q=U敹3tgͷ 沎qA_m[۾WpC')&о$9IoN?S$@$ P%YIɒe$cK"n1̿&M&&yVm33ԧT7e<-~HCWbvm"l(ha|z6T {mq'd4> Yx拳mE:6|8_ *|y]puJ6Aij IalxNEr5Ƙ;DZ>5&6Gr[@wt|w@t<@7& t4tMVg%ZqF$['$k:&@ȟ!_FM]wqֶDžTrx^ɻM}lH_6 #(0w3Q٬69X{l+}5ߺiqI>m+|`1mܱ6z뼽Me&ouҷͶfXcmr6Y{O @K@یAs`ߠ?4& gO^+' k buJ%Q6F~>z\XG|oEz陾~uq_.44wr/ܩMuAG.zuvtHї2?ErYzTv~ok[O_}PWfy4_C=n+ӼD.p'D<^^X<\kG Eqbe⇝JԛAbHD݇4SFT"2I%k0&\FoI(zeSH^`UjF*tW7|PL& mjN!{d{+&V298^v UsMg6+4,k| yK`G y~QBuz|q|>r}FaX$IOc9Aehdseq\5;C 1^`A/7 ]Ã/zI#O0=&1ۺB0ԃE3 ({~>#;iS_-Qj,zX^{'ly.w7{tzvOGM˂\]KC+eQ? i:ɰ]&)mk]{rJmc)5iNg!Hs|\SaONd{wy~CknTM. tsZd;#i2IҸ.v)kainjT&j8a6~*ͮvdМ1ptivDc5j0V+9Gե3ӫ__Nߎ:3(9ӫץa.M;iJ 1fJވ y%iqݍl4I26JrLKH&N#ғ+j(%+Qe?<8<6| !x], >9R#:h[_ "~<)Ay#i&3ftQgsC kcId,JߋK1] K]ͱ`픥"}F4ʽCx/?K }E!}O4slOWn-ԩ>[nTqnGx:\ٴ58xd#;xdo>xdH~Y">v;Awп6y;Awп9sп<icE©LN3PnJXf"8Z !z^:IcDU 0[!<*#yXGDvtBrvr ꆾ"[n%&FR%De2 FpbFOrf24xktWFn-ݪkn:u^_S|Y⾺U5ȵg6Ve7@0vkdyYsZ pf[`㶤a2И=/V܇;Cp7#n;[xM5 DxWF:YPލwzTn~-U|5fIaiV-,-ld#NȤ+E H /v7yN8l52([RAvS ڼVA\{|E퍹F-f, cXfkfwŠ(ˮm 핷Iks>=`ƁNڙEN%!VsXrĈi9'Ƙ9F uM;6=vA[Aa![ІIGx`8`퀵֮Ā֮cy73B1BYbBXLN )&cIu׏3 q3Uy4h@3ߓ/yz]! 꼧x f<wp76-&lx.4בo!7L炦[ !*V4+g?$57/04ysyNc W["˦㺒YN;/xyK\wlXY:g P>'PC`Ԉ8J ͠k+KeLcfA,:?Xj .XDahvQV`tU)O=у:% (vL@Gg)l%dIXUD; O\PZ_١HȚUK*@i>mا a6Ӟt:z|c4"5&\ä6e$,q?s~W!v`ˀJ)B4g"`fg u_{lF$"ܸ7.:7Nm'$9mF-^XNL'hZ&VAyz8./h{e<Eiz8rSF_~ϗ~H=W_X"_#;£E.wjE0Fu˗n..B)b =Wx/q)+`ubws;($-OzTLREM-y1 ;=zَ҇Ǒk))lGH # ^&/Ii&2k|mSs>+er]Ys8~PSҖ/:L*IMfnW@ՖDH9d%e-S,9u;sY~fCw9NϩL7,q{]_S';VZ-OyٝU Vd/gB%&93 Kb泒e3Gq|'*#SϾ,ν430{/qT$%1 kWrʺ͓^]W0]H3eR#ucN&'U2UW9(^}Z31ƥF¨$QLWՆdJؗ{ e2' 6C]7P!TS4C2%,EWնeR=/[{Nn9 uNu季 "nӺFdlы6Q {QvZRM3_Qei2-S;{Q5I^͞Dha:yTC|З~Sܫ[b,`+A-˜:0&o:K/Nf9z8"&U_YAgu*܉" .|ruy``{M>_sAF(UCF5kՙc},~w4f-X0,}ܜ Iss2nCvC:u`h1 fܥ "8$vha{4C%)ÌHh1#h -@( =h4( r4Ο˽WP@sڑ(5r2'4C%Qw74_^IuWwͨ߼y& ^L6[JJ,_lSD囵94i`+KF6}A ?>T7[Y>asJ6IP{ּշm9!{.wk :YDE\#(%a֡.V'2VǔܕYΔcu;~HX]VMV,JtPbP³ŘFB+KǔPZT:p)`%.R SD( C L-d F.χdqcyx{L[FbE->YXs-n!~:S$&ZVvȧTckaջ;n+AZGj=N|:q5L^dc1m]>913ns~zYGB9 $LC OE`7=T7=dn `;jBk TUėY2s G 8pwi氈2mF2P묨 |A+įwəU{؎ه!m uGzsPL#\t@^:kp_L_>)/ 7 e Y9(ZO狇oF}! >O^RA(0ؙHrI(!rG$ff1(f9z@LaR6g+{a2|.>g Մ=d͵Kmt]D)"("5b R*řb6]@ 5 0Zr%aF`yC$%5U-&>QumLڦ&(D;{ vAу1Gh킢]P wA.({GN=ޠn(sJK.c@4AL1Pα njM*v&&zn1OhO*{QBfb!p3165t/|D*uS+,sC q#Q ^L*)$J;%&(($qB"Q`ufM =XtfF*wts ]M,]箉s-kĹ,s![ּ9A|au`)btpDTL#,Lɉ~9H'augm:d@[kȸ#S;Gu (u) 00y*!q P2AZ#ECWRD7m5ڄ1J@ ! +@ IہC3>֡qiԉ _nU|`GU66(Hsa` # Ai5k5DrPW%M-otSNh[kAϐ,% K* m_dAdKJNO{t jvŨ-S ,o62*<+ V.[1- e&oOϑl Fhh8ZJ"8Gkɕz:Դ"3IГ;(' AO5%PT@mJqRr-b 14v c%-<Ʊ&21 +l<ݍ&_ gw2VX]ۉ,`&ٴj``QJK%qub 'Mqw f_j0Q%?oNbnh}_N {LM/5dF ]u2Jfyv@=r:q1ƑWY2=^>+>hRmcR nx FJ+bX0Xwp4 QDYS,^MŒE^ c븏24uu:MuqzbӓIG9D'c.HkJ. ;c(<56 #SJ%pڠ sNJEz8u-c}GTf8hX?Y[0O[G*OB!L /U}Px c-Dıf"&ˈR"(,u!UJ۷ܘ@Lzx P쫗v, F+zn'6 hsƾ kP@eHEZmp0)8L_Tv@iUeSę,c1XJLC:w-#_wjy#ėvqrz5mBZsnԑ8tL'3A&33hl/1d֤yPڟc|WHlt$N[PZdc2mԻ'/tԯsNcHyB[n~M3)~_Melibzypp-17.36.5/tests/data/11.0-update/repodata/repomd.xml000066400000000000000000000027671476576476200231530ustar00rootroot00000000000000 c1d8b4a70e4e2ed3cf5d68d27319974cc023cf03 1224755528 5c8a77e4e4f57070709f995d2d2ebee13b052ded 630e1f5bc7d12bc26b571e35380191835bf9e5e7 1224755531 726ac5ccf337abfa42bd6a76d032c3ed7a923ea8 958ea074b3c3ff7c57112e292ff1bceb07c6d682 1224755535 4a44c8ef91cefaaaf31070d5556ca94b27525dc9 7949794d363b7a84c2e9168649613bdcdf9b2b91 1224755535 f26bbdd272a1f51f750b76b67bee6f178e9645e0 da21499c94aef90694c8e9d94eec39ab3891cbc8 1224755535 7314b359cc9b5c68f22cbe7df2e8cfb964224593 libzypp-17.36.5/tests/data/11.0-update/repodata/repomd.xml.asc000066400000000000000000000002751476576476200237100ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBJAElRqE7a6JyACsoRAugdAKCImJX9Aop0Z5ngfpYz1Z6ec4637QCg kDTnvGTdR3QFlYLXDEnK2UpM3hs= =QwmG -----END PGP SIGNATURE----- libzypp-17.36.5/tests/data/11.0-update/repodata/repomd.xml.key000066400000000000000000000041751476576476200237350ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff 4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiAhsDBAsHAwID FQIDAxYCAQIeAQIXgAUCSB80OgUJEfKmuQAKCRCoTtronIAKyuJlAJ0cWZifmBO6 Eh71jattipdMhUYBTwCfSXbJJtuF3c96JPmpmT8be2LDo86IRgQQEQIABgUCOnBe UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/ EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5 +D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z 3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4 l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0 bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L 1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ 1dbriEwEGBECAAwFAkgfNGYFCRHyptQACgkQqE7a6JyACsrv3ACbBLhafFXmTjH3 JJWFJGWuIOaZUosAniPs4feEyN46gjXGgcZc2Ai8nkm6 =mY6G -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/11.0-update/repodata/updateinfo.xml.gz000066400000000000000000001725611476576476200244420ustar00rootroot00000000000000OII][8~_9gc_ju2mwo;o>D&S$broH@&*@ } .(eVV)_\kYI4Kd/kY=lr %`??!, @ Z4,m˼l$X%? [ٴ4D巟:ڤ?B+[mlR| YIodur[9:(`GkuE0LX>ܽê۰: ݛaZf: nAgɆյ00%Y 6Fj{u~Ln)ՌcuZ|N&h"s: }ܧ'~.όY\p0G)m`C#/0l4+ʞ覿ۆy>)ϧ}$ ΨaQT5!߲x5hjM ]{aFXf,v$U9Hl ֡e‚dfX ,sAWY@4bO/Nacj5֔,".'}xjrUKQ6/aMdOMNa5֔bH j7FՔjTM9)iPP#40*6ux)M#xA="Ӕ ਺2č-пbEnQ48L&5U[b /XIGK,gW;bSҘw"Hvt_^,dzZKtQk-- 4TDhfL̎dkVoXsLJTEɁ]En,H_ny}jd,$Xnv#8AxҪdE*׫[LI4KX}%y+kPmiI$4ϛ6 eZ[6DjŅLXd4bɱZ;Wϼ*X&)?w'v=[A38qFWs$ܤtW/?#A"P"*&ap="b YlZɪ.8 `FI.ST`eVȎir'Gr?؅k7#L(Y;WqY:T%v@[00!h<& (ź\"|X\4߰ WZZ bUQ|2pKeCY*:Խ%M${jCp|, qd$|,1nxq3?ȶ :c7F##qѸyzE޶y&iM1'&74KcǟġXB pB<ѼQمŁU MȺ$06]r-u~kC?^b+Ikh"aZUhJeĦ.ǹв8N71ly4;f`[ =txd[ڧmŋQʻB8 m.wⴺ>kZXhw>=ټyCkiu:+pTm>#$Ms0Uɓ$f gSp~뜢quZ&ݷ/-F8U ҟ$R}vR[bY%(N_DSz$[20KA~JPZv4WU6-vÇ4cZrDZy '69^d{G('V6~eX7HqDfx(sHA1Xbqx6Y.97:Пi&_jܔ'bcK\ W4͛ܟ,K1i7m,R:rf`61l]hE1艣&Αۖ9ox':AtTy xD1|oIT࿎YVYMJZYڬVay$YLd6\rC0Ԡ:^oȿSvq3cO(:D|.ܼݥ\M:<-GǍ1XpqB:oR+oXarq#e4Kr}meĜUk1*ScQD[oj T`%%κ|o98g6 '21$ <Id^nz:&u庖˭ #b~ÃrU<m%-{7it =zpФ--cE t+px^@u ZXY"w fA۝$l* U^`C)V 4\NP!D'$>ystJpWX5E0e9%9EY>?>oYVhqFKig<{-<=yZS'pG'PxC(@UOHΆD~_$2ShT`LaUV9H (a2?yc8 SJ0 GrϭO>~"cx|ѩ=pq2#(,a1Nb1sc2s[G3R6 DxO8N_ >#OE~ gifƏX?h§)q}Nix c%F2"1gρyzuN"6\=-#Ħ|[?%oӒ%8:_oV)0lZD[%{K]q\~9D[u ^>m-Xm (]I2Fe*e(Ll_ZO#PlM㛸_ 5[4*s#%/Qa:nL"RIZӷTN{qU4MDjE8vn!*i F$&ۚeǡR|m\@[;Hp4N9`< s`dMXU4M fG0uH̟A" hd-z,K-L\,>y,Ke4g>xp4>x4r0{dp)ÔPMfGC< 0VL᝸ zqvQDغ%uܐ ]_1 _Dw69߱dnQB'}Y U&G`D%Ѧ{+*dεV}{qk׽ds /q p"N̋4(-.t{pdЄ}Os*^Ahw_Fw[^=wٽ6M\X}'⺵IPE4ּ$h"mڪM$ķ7{DǩQv[䯶< iVQ1H*V"^5QNu0cec 0BicdC#LVq'%hhc{~`ԉ-/X8`lLl$@V`8V]$(̰u` Uk㙺..t6)kӾQA׆gmi5yW7nh}/bظuB+qx}Y0[G„G/"6% 1V %1Se.@MJ ]E<&2lZf#s5h"8Ʈެ_'v~њnk)RU=@5)S\H<dlT>jXW]BFD> Mӵcz`Ì8P31aP-3? fU%w9UcۦY q]St7 ı,[ ݛgw|S-оY"F|(hO@Fŧ@)oMN]k@\&b/ҼC Vmn.~tU'cIR͇77o^%5tOlt¶bbHL @0q#339ks˄j2+ 8t8U #7d\Dp3|"qoZhš'9S _M$z;2h(|F2t2;ƨDDuUöpeyS#y>6ezGpݗsO $!3æF=dʴTiC`p:l􇣫-p<] gB+ٿp?է۳p;>Q#IWdgj㈍h xmSG% 7P#oߺD@Lam|U_VV-sk5 j># 90p#8. 1648cdPR5p(nHۥ^.B k$_Bṫ8jd~`*x=s@Cs;Fh Lv,8`8LҮsn'!s"{] 8<,0xݣY` ;"qI(ՠ9#Ca5Orn;(\^t buppflPjux8 撐aBCu L j.1ލ$\V@j଎AYZdXmKeu Ī U  fiA O@#2=9H[) ig :0:@';! 1:8vjP-Cҹi7"!1| α%D,IqHpcѫAs;F%VjM˶Eͽ0dnU0z/"0|:-;$(\t upp~lPvux8fYUg\`Fh8|RS\2鴀 SwJ@m $D!"tx8Vm>V|\2ct0n5p܎pִjB2 >:<~t`u( AE>F4\u ' ™BvWHKFB. ::88 6(:<nKS\2%) %* /jƫAC`[!~ҺA/ [!^  >8:D?y[IY,+`$8VЁ)0|ر^2*BXVio6yVxD4[t*!g #|<xa["ϻxC˳#\.cl z5hpnȠjpX>2"-!󫣄<i# (?e2d 12(8Vj'q^<F(S08SJYl8{*/\SwZCYE $ *F/`p{3gݳx;gw#-<1A|TB IBft F 20*H4:X!>6 -ߧ$p f$./gQ9?vV{j#O_~2^ 泋mㅲgF)L>#ܚdu;&$y[#2*2]G_:^,WTO#EvԨI'ɗN ~u*"3u۱ ZPakݙ62K&httZRM(8ұ]&քƒv?'u)D.ZݻZy-/P }! /T4 2.\q"1J/N`{cmвOg/ M2U|rx¶ӓ<_ 8Z5=]+G\O wns'9\G#mȆJ2PdֈLyq5:*ٺhIy.c^4鸏OYwtu"v`:L[Lۍ7(ØY#xfX)_4@;4R7E Ah AB uc+dQێi)cPc||_@]7BBx#( w0<;\iD K)t1?{'N!'l/q|+Z^w^HC4܋hh+t1X3OUr0A0egeƝ uOKơJ)g/Zf~]^Ovjc:cj2'ńAJU2 )_$ ﺍwY(2 *Xw?Xc֙-L4Ђ(-PXADA8 kX,af$ ,+UJMX%K,yAW홓h6EhCQ҆$y q_dx zjxg -`E-ddҦj[Wxc\~);>5_Ac/|azZgY?ڷf;^)_a8k)~1$>/'n1*@Ui=g2Z^@܋\m[$u,v ԣUhPr~5K_b@mŝ~^i^ƛ$MB/ 2Z$vJ=wlJsy~?ek !y<) ( tf+S^I* .jNu (7̿g*N P]V2??2Kf"@r`@C lV6e&aI۲6/6MK?wYPE>C'cAڝHs1mmpw wltDP^On ws~r,/ ̂Lx\LGbW_&ޮXS?~QmmX3ڽ3i|mXMUu_Ǝu7@/m:bsSzZd0/8rߘ4bÃq(F֐mU |)j>e#::׎e_DoNIؖ3Sŀ. nMiĶaꤎn b+$[SAynUmQ5Co3Ldke|zH|&l S~ֆ/ښ_ʪIU}{=:2!˕S]nOFp#Y&|Pu*U- Kث['fp*YCCo4$G U_3u?QZh ;/4tegدC)4r2Li:0BDIӏEw8;ƕ4f)q#D*ҘqDH*c;-7^FlC0HlǎxX$ =/jzDZ'JsY3Mk0,;6֡,t²(1 q`9%W@"I:^WCW+nPY~/MP45vl=~e^B&C+g"KXOMn ~.Rd1eUٜۣ 3k}i &]8@ЕMlא-\ǒрI(0 Q7&c)$x֌-ՌxP`GLɟjFU `  1~a^rv)W6G XXBn\_m](wE x;ێ%8`}Oil ~ h] {/`i`Є^%5wEKUUmg̅4Bp4BA4b<+3C(ؔPS0X*E+NA^s}=h b-3/ġ-BǧCpcߖ՞~" җ J4Q|=KJXTԯZ"O,i_,2Ǿhyc+حf0ueI[pW-r63wiཡj,˧E4ٸEDْq>5MUJیsR"B:q~9#twl7)pp= k.pKNi:cCBTZkmK71{o"Ap[Ro!oc[ WASZe4wV/mhm۫N"]w. I";S`"$Fct*ۺ G ]<gooy{.(͸XPWJ>/<ᄕ>'X_tddWyk[(XX5Cs\,Wke<4;% ! 5ӕix$|Xd2I9&3fe11֞Ej99_H= Z_[I8'oGײ[|Rk+1;QSI(`PnyjA&Ƭ,ݾY@(J'$Jx{ijZ&4Lp&T!=̶;'mxLg}-@Yx^dH.t9_O,SHgq=Y޹uevM6\LzK-o=oycPN\9 w]Rɪ vNw A~Sg טK0N`i. P)vk__w Uy{PymWԍBf8qjIKԌ3vLo56.mP胊qYNn"k?-2u9gת_[z>ZhK.L|,NhV& nyKhĒKs=y!cbuCD478[{s;5 .k>Q|<^ 52#M-#4˧ŎI:粺~6͉/m_&{:Xz$={J܅TkCOu-U~-x|8P^.L)21?U+ dEY]O7P8^p44pTJ'g˟}fk`4`iy)c2cߋ,72&&Fq{PuVNb:=~C1Mv h%NJ^'C]Pui̠<2;Ӳ#>rާ8J.gv'ߧȦcR%Vj]jNY⺞Dc{Nq{V3ˊgWQ3㭔xrk^5o5?H 9lߺ!>V1Ƣ1ZSJb.+&"uLt 2Q4|{VŨ͠QP(`l4/a~x#ۗ YCՐo+ f3`"E0}\Gwy0.!8wSoYaÒM{~jgCd|0IvQ m'ݒ"ITh.Ϫ*G 6ۭT9L7!`nTRݞUC2KEaq}fKU{Uv qi_C[0}HU yM+ZM!%~ U5"~\1sT틙~U sT g28!b܋gį'ӷGeݾINb}) DҾT Ye%f3Bf^ڞIY$6ui0yYEfipsW1mbz*+ȏ"~dESٿ4ܛ&(< &]YpZ{Ͳ5WRh*kցkvݵj-j7L:SlEc+LNg4C$X;")7Ώ,ZVl~lk[`+6YˍVȑT)fKjXZ[bF{{ZDJ**oGv&G].+Q." q,U=^Z2VcD_ i'|ZEN#@sEZM=Y翟DUy qr" SVA/o 㚶imu ׷N ŵ2,jm[j莜ʺ8e+ bPmZ$oāJȪy=#1ō(rsqQ/ʥ, _[}Z8-o}HSǡ2Bm@݋>sk Mq7Rs1 jxP׀r-3>Ʃ &cπ"3eji'xԵ`1-b.N^\2xb *hmb 5ykV9&MJiV NMH3jO8]Uڡz}yc$K DQXNdF/ xTr3tͿӑ,!L(t J )eK rG".ldLq|C^f}jaOp0 <3i_??O?ʬ. >ؕߞ"X Z.87at{9V:Hي~$!SӀdžfKKȋ V%+x2:ǩǭ6s|+0n(e\lQ׆>7SL9EmC,cl;\ڒ Uk8by-BuN)8}fشC%̫pʥU":“<\ޏMc5! ͌pY{8snf`Aʼn9~F9/Zan\ >Lf7J>m%.wnvP׷]qY閡j-I)U"TBI"$_"IMNac# aJXЛ=Gsrm=$΍{[:RKӭ 0M-^I˙ )^JDz [q,tl ] "+r×D!;Ew=JpzI&شU{@FQbEٶ^`'e 45([lvUs;Md]XY$No; *B=Lnn~wa^oA^zmI|KX>iLYN!]ׄSQܢT(r#t&{)p1m-ܦBTu:^ 5\ePeCF4hl'NOPiĐgz:4ųB#4V iy mɥ>Y"+O%ݞd){65wA~KZ׏#H=F)G8;Iz >h4-dkBf~D 1/сp^yvbhgև)W>;R`s2}kh.'0_clŁ YjٞIfx:Q{M~?5c!cdX{2w,Z ٖ w~x YN5<8? o6[hVx\S9MThɜ{ܕ|tkSpLrM?/o`t>;$[ނwtzԦsmي'pcC-Xpj!|Ae癞 e!Or8k@E{DOo4O"y%_ X@ TQT.Z*'𐵇`H RT/s%MӐ} ܓ؞ϫziY#4f)Wu,Eg'h1,E"9\$[lhFG±ӥ}:'F2W‹^7N|INʨ4 F ;COC`p+*Ӭp 쁵ܱbX='Z@4aX}yBiOukvSZ5ݖ ~y@[]@D0j" d`Yvˁ{DnV 0AV F56PMɛ)EjۻpTU&NppfݺP E}ȏvЭI=66Y,ed=9RBh'E=-@܍8es0|`c|wp[ G \ug5탛Ęr6%2ksjlC(8@KC}wlOh\=n^==ؾ|`C,-T7Ѥwq9ÏeJۊpf/Nq=׆ՓS!TAdIR2R:[|1ΓDl1&N85-S:(-TJˢ.Eq4|և9BDa|)H_Ybg[)R`Ѭ[wB4N v0Eo*80Ŋb *hk5/{g|c"Ww.=jvƷfE}˚Vy!ztg^^ ;Ϡ#[PHU$~UӈԕyI]lۂrnf07*(Z[xߢfuriV9!W PGg:I]R3ˠ?B|2pX#P+;BO$ #(tOaq(ń1q>8$Y '*!U g\;ŃavwPh!^Kd0~ H|Mb &]W+ a|j=>3g@_#m^@jڱG-׏ #Sץ'%Q~dMY6w7$r&2~̚N-Dn2M4Ir^%poVwhVJ.=4Ne$I@OB'fG\>r% rɳܕ={"u?opɛaBv_ $*?Ф$%72pȚ6ՁrNBa( ދ[N l[O?= z[>3zԳ ff6]'{)]kKd[۸b)/PrC~>C3\ U8gvT\+ӘʒK dN>ZefJ4oҏ$q% HD ]I-$05a޸e2D~&/o\1"2WV%WG .Y5-$Ͱڟ Olcܳ -fObAF(xcם4%_*Qi.mIk?;yxGQjyya]o+NoUSO,ef^\l<>ŎWCw,ޫέ|/!-]m&(wB<6gʚ#E;.[!q9fkV}l]S.ٱ 9G $2UtS"q>pp➔WYqs $S+uKM{;w]h^5U ÿlqbHP!AMw/`l!Zΐċ ˉ0)K8`)wEC'l}ww={yc'!㵿`<Ηm6_>;c離!(h ,8w Ol < Gt\WPq`Id0N|5 ^gp^UE~S=|7 D-U GOj(rϧ5w$L3Wmbvpa(S HXZ >"?jgڂH"ۭa'qMG͉?T]V`.kIYw5LJE/\di)t<}FQ|3%m?tIyoQpW:JH\ӝ̗Hڬ YAb>\O⭸R4\e[:_Ϟp|y!Y玶]m;v#6ViG5n(>D)}%4PvP$G '/3o.ԟ>o~䐈o TI8N.4h  ]abh< ;P2ѨlHz&nb pʂe!c)|}@ X jV`WH sN|ҼiGE5+{X]HHG4Wnvs,>50˜YNG^F "*<#ds7c+|[gJDָI[R<]_+e!>e_w36̋6e6c -g%NN$6gۊlL^4u? ;`KYp鋳Nf`GWXBs8;|`Z$pm2wďZl ÜC8Ħ 9$xrrSRo~o)HJPyBd.~-t4 د,q(fE,q3^.wW ׵Gi=v(ƧdYI/,?W'*D󪶵u8Q&v9,/sy#pL>FkʈG@m+>%n&u-/c S2=bX_LA* s5cRbVO? ,;j;64 %nBMꮵ|XpWv0YQ[7{%bK?E`tmܦѭ%1!/dI-=<սK*Z< u )w `yhY#)Kk+dXw4K,Vy{ V 0f궣AeZ|Ⱥt?]|[3u#i kȢNN;^aIE1YbՖ1>+ RՅj/K:닩܂i{GJn6x2*\Q(^L WgL K!g&Fc\/U,ɽ89vEfֻO0V76ȍ4W/W뷠B1&L"#8[I'DQodnr`qÌu85k٫`TMηR+\0·VSL%I޿{OkYҪXBԌc:No9.]qldy[ΰ:*Mî6;p~#pP.YkBOYۖq~djs(s#Fށ1yfʠqB h Λ:e MP,M˥7Rz-)Ҝ[GP?ylH?%A MsͰ p0k5`X @ʉƳ?TZacYx20 HCp@6yqlQt"u{2'm 8_'pB{gk@(6d+ՁKN5YE56ۣ(('U?jOC;^S]cq%i.n>KPƗ%'^ia'd/P )49xD\CԦ{j(Rkҵ9I` $ H+Ԓ ?rt.Fw:+cqTK~>\t9=\c/˿e!V\{d'(Cy'{mU}fLǙU@LKvY$QS'JMBD3#R<,ap4=r#4m8gv`0+]`09w;ZN-7yW%]KjH;em@W*KZL-c%b Րb5dP y2ς``@S 62nHR5Ck)()l e`&Bn}ͲO(ny9܋KO5\yJ+.˻4bc-1R5}ƒipV4”\n۲2, {+Jk~-G՘J.۶\mr~jCB|W)%!t1/br|^K:Mt4 T庪| =!j$II=J\z:$FpO$Q ēF "L뒔IΘI׳MLFw]^<*-KQUwrOR ӪpC-k/dD1ƥKic_z&t=>0kZuh;X@ݳ~w҇h2v|ܞb3?5=g[ &Aw W{=3)j~KMvh2S cn]#WǷ?iBLK2LcN?tj"بqL-z˞B޽YVc?gnT+*}2e,d>EwYqp`%i[C BH[f~h 'ǸPP$: B#&: }W`䚆KDcݶ0sV0jo .`8ZXj\0,zZJLYVjkŰLJmN.:vT_ -3aȗǐ9w lj@F}\rS4_Qv =CWGBWlNyMI,3d쿓U45Z=&*81eT'qSĸq@׹j0# Ac#7VCšvLVÌ P@{5*)9G1%Sn -YA?i&;!|@\v8m Q:JiNGiJQ%˒x_2)Am/ ۍ ߢKO {PF.\&z9]^~p~(vϾ#]Pp9 mckCO ڥ;Pz 3@w !نzv?k`n\դɣ[g/-F+$Y q -iUH-? ?XTs4jfEtWZ45k%|{-4\;=xom^ W p⷇rʚۍy%EߍO=ß_jI/P9#=w%MrJ_ Bls+.ɲ̳le\*YdKZ~Z.$z"&" D2$1Ihք yVpɦ>8GHR-?zL7b$.Ro ujS ȬLf 8ɷlV Zֻ߱vM3knI`Y@H>~(Nw&gusg> 浅4X$͚Lfw6@mw'N6v.x;g8~(j-Eޅ1xC~OMYu5< _"O}V']R&i>'3?_8KMu ߞEYvwyŧ:|1VԆ`bcS5#D3Ajcڊa?hlGUxBY :4/ZV&bkd\B=7+ KWU#GŹV\8n8R*?_ ԎK `%〇ͼKfUKӼ |_VTT/6~g+7鎢P ò@Q8}ppy5(Ozk,%Yw]o;,W)uJ'؍nKh g 7)^u)zd?6M)¹qrtt^G7%9* Mj#[^di=MECL>/hcs,Bt9 #l9 p}r-.`Ψs=ZCڟw # ,W>IũYEqDxe8Ұ@+9\/VGRj.!,φSБ=2x#~mX%[Mp&T~F`KҲ ތ+wQҝ4 B3 7M-˱'RP F䏻B'm(ys6Xum;J|ȭjMi % :tY+`|KC܇ j H%@90u( ݍžd)]&L֒oY6 | wt {32Ky$|5{-S0L?Ѷ.w07 cb:%5d̒5|+y%!"&!twmmM%^$4$8,>rvJ~X#k/l = !%P="KhRzi~ TA8 L_zEG+58pP~^+p z&ק(1& C")d^Ń)Z@cKGl%t3L2Fxb U*Fheb 9V+ga8o:c:ǞXg"9")Kgjk**(M/ӻmB֐{^rו8ސV<3% <[ZDýOו\;'}C,6Bs Q^‘o/v %?߿ACJdL063ܺ7Ͷ.eZz_Kw1͓ÓM4FVS|xpRql|_tppP0.9AU$y]WhE5aK_nYl3v y4O)g׬k`]VeV2%=e6;(1.`/ ]S'3 .ElEJ,Dx\='ևLi]ؾ9M.l[gt~Fc|)5gm`\da>lexk[;Kv廑a%.ab%Jf9MJ}t\5-|E~*؇zj'59YofrrsrX69u%2gYmŠ<R-BϺ~9L{ ] qWʶ""@=w oyb{ǖG0x\֜(LIgutxSrZbǨ&59-D'OGt(ir8C=}#(?Fq8fQJ]۱ ϲdL5,Doks9CY> ̬pX5|*HħĞ ԰ iyO}EFQsP`˫l?Sm|njX"0<]0}1̢&.nCv>ڕ(8y٥W%g ̊!8SV Y!َxgkg"?s!];5H+wXmt3nR8-ovofű켝S)ucY&9 f9+NlC6d󚣳y݆H]lB*ZWٞ+IQ>L?2sGFm˜qCD۶\m3qFۼN)&̒6t^@Xa" 0YrDW5ka@ه>L00Qч XNT =8϶}4\ㅪ/`s1EsIU9i0SSKU`{L.Upy9U̵̇b;`r)#9cTY0KT 2C9d*40gTطo b{ڤoj? j)ДXqVY^` 8;fc+E׬kNí}um&88B/"#uW oD:5;MMiA+ч́j}Ё͡Iz4rnp.̳~M/@-sbkn<ӽ7<7s#Ϸc&vb )J4T4vxIApػ,h]'Zu A+DF u]V\ ͉ t%p|\z1}{ŸW/_;apn<|F7Glz5`۳_.*Ln8([uWq^oj#riy,sƢeѥmfX1Ujaŗ^|1´dk2--彊,zsQ݆ lx\s-(Lwx~%gnl8i[ֳsoZm0v^XS>Òm^mzMT ^$Ҹ\5Kq+QK  n/hy޵lT% \=!^KqEV¢`b7ۂnڂ ^Щ<*hEg@/r1.`TcX;TcX籒6.!aE%^)t 8Ԟ[3C@A#N^>rx:=pƉLQ0~T#+^"qG0h鼖.6\ǔ't+ںƉ륑в8&ĚTc($k.Sy]ݗ/#UHe0oOar U.,q03V*D= u u{ +ԢηRt 0v4w)8ٖj'0ΰ LDzr7[VKb% 2vJd9FU+yrB9㸊&EI\@ IL;*z*3i"&4m#e#[_VV"W-5Â}!U[eG<~΢Ǜ "'q)| ՘=s)3= 5l9I?*sud /΍q8]wmCTy,Xn ;CM=E;zHٕHCvy-y@Wt {@<@W$Y] nQkbW^e'JTv/D.+Q1 l@oVi}Za:8*w1vܨ\GbF([$Oyбi]{qp%wY݆9I)M"˗xzM?Ѹy:]jH?xvNp-E1`'-/t, ,hTCPDqOa` 2Ssc`Lc-XW&iʺ"OYw;h0#h @y  rF+VRd Pkz#k*~8e1Ofs h~IE9U\&imI0#E2­8!Ӧ-}#v @C7<Hg'ȤAFs<.7|h'pV$6摱a|MG$ߕ6S>'9I~yMʫuW8+[05$ӻ1=U3UQutSX"դd/ ,g $<|GW#=''cvgv DŽ^@ǕQ|{TK#)U8ڊvePqc)J.\XE =Ԣ[?o aH/?UwIRGG_Ct2}: ܭyr 뫳ĺ{=|N&^{2C$93ž}_{'޽4{.u9yI^=Rp:~ƣ[&y ; a4.wOhYäp4ZLo冣wcА^y5vf̅r}yveqry=F;^)6 _Ā'>={fBI{)/tyg/͐ ؋ ,ɢU4`nkm_ʖ5fm”wy.NfTYtC)U}|5V `_Vfwga5UI밫b~U R^.>0АZ:nEY9$k⯼άwf*Hg߸+1F7gمֶ[DaEqy] IXےYL1_qSa: <pYVdwƶvفqƒ+ Y͹5)R`iO*<Y:xqjMaV&B/;\xK]nQ,"K"q؋F-$)wO t*O 2m]BBs \0za:#xZ}k(D [@ x`J|Xm=-׶# !^m|@8|4G >'?5`P p)`EZ#Γ[aUMc!bY/VX/6O˾ᗂjfU!7F2Rk`im|2GY9vl_)v3oWLpb!lu2AY5p )H3 =r )HS.<#p"D,s7H" zIH܇"CI?&bM˻4?~ID9apSBg=J[ : -S͏"NRTEg(;(i"JY 5E_Bj /̳$)cYa4f+3݋57[.i w?c bő.+B񚳃D>Tv,B9M2_w5!m}.3!ܳMv#m1w\xR 3J9Eq#/ i8 }Zay^52:Ačzgg}D[tj,: QЎ(k,Xںb1֕Exв˓mwyi;6&/&}a- |..FjG3 KsQ6572A);sGRSa*ojeƔ{PS*h=ħS|\!{.NGձ2V"jF1"% J) ":z91t" :)":ogxY%N})}|SA:| ݥ M J$N".B; rDYnY ƺDf"/I{, jdCKVͲ=b'FPtxYhI01)M{#B\ B:x3sv5 uRPMI6Ɵr6eG<IG5XH_dϴ*g9l" Q8\ꞷk-92iŰeԂ K/w* k4t2jN(&XgоVC%OJB1_b"_ɴU׸V@%C-u@%7M+f.HcI$$gFq۶9fw![cI{rfFkoǹ! $I#IBtǧ,25&{OÜtPd>G8lS=Dm1IOm.?hR3=3ٓ]1ߓ;@+~Q">B4MsidGS&K@3[Ǥ1 dg,R GƟCJl?,{$0&ڲ#9nݶu(7iR@' SvCvQNiGuQHjiEx 饤>TK8%:;PM5}'4%^\z N֠viT|T2fP_gqg~c1( sFqp r&]37fIjHK"K/0 O!?v"3+ ] rt:$mfeC;x0T1Lm{~YDߔE_on8oMIjA\)L%UdH:%M*Ib$K>yܴ<RWUKP).D*I%/6(r;qeB,r<*4ocWec!9w"D>`so mRjEJu\DsP YY(&ۚQ^I,Ry%"F ll}XYD^>>,t50%MG@BF7~8Cmۏ+sj_-,L>}*oF\wӐ=`51[J)$nb-CXXlCz=: ⨄2] ޷-i,4q՜iۍa׮^m4d6U3I2+ak[/ٛ U? hWycfI/bYO̬1l|¸6BY4(|Q9VK2kv;: ``yB`6+mRqHܬOnʨ6V%Dڙ#Z[s%r<"b7(²; 1x bij*+ q,ކJȊ*%H'@-'IwȊahY/ +e!t|3DmUsMUoćOn|zh5CBQ ]) /J/<yis"/ANȟ1roy&7&!B6J Ez=xYdVk.+ z:2LcUXE88-y*)E #jaLB+o)ib/Xl/J.Cl%y<~N;;)Gytv6Dv0SJ_+%_V5-sbOrfԎ< *e7Գgb.:J1Tix/!N8(N!dzq~^ލ%|VƽWRt7bybaz Z}eLQl8은_E 0q)΍a"a'B232*BD,;|w?$_4{)5 'ͺ5u5tk`JDD +Mw^ԅɬ([;kHC>hpא'37LhOuebRiy]x7旪)((yo85>Y)d&cG"U128OX W;}gC0ohF%*a"]oA_i}b BpoVxLGd: p@L> "6L/#'چNMOHNDxmiȾ6a_;<1aZ6}6ޓe <6~&l6| Y61e;o"7ƌ/p?SSx@ze.OO \Μ<yXtQH$X_~c~:V&C~gc[{$-WXڍLkҠ$R._I)Lʾ1*%yd F?mKd4Q;Gd)75Q0ҊAEBKSU d0 h4M1!+s>!ٝ}ɬ (m>cv뱉xNVr3ʻ+Hz{^Iˎ7#X T ^O |Q~OؿE4|QԐ5>u6=fsO]j{)rBdԹey8] ŪᣘA٢Pf(:R[=i+]/^U׮A V` <ɰ |u%X2p.z!D8bR s[-DžT-_~ V b <],įE]LLk_AJ{/47<dzBI#? ylC yL@w؟Fl3twsxW_<CΆđDmKqw&Ʃ )`]'ͅ+P-6EC꫄Ǵ$}pb2<5hdkGiőj< LVd. =s#=d~- ~\ʱ1Y'HdwճX6S+ֿnr20QZNtƒ e: o 8Q*_{a 1} *l`.YO<v Kum.ov2fFrX_7MTMg-r8$(c*/ֲ`: sie@<,a?]O>|3Wq>^ F)D(˙&N֨6F1z>gaUX}dseZe"QgⷬSװ#wxyV^FD=7kNKi)Ϣ1&ǚ#{wLl^n'̀ 6XV`wV%/\jɟ*¸soۦLfTW"YˊM%eDON'"H4$ȾS%Ko #%YV;ϑw}I\M3yσEЂ@x]D_T*s(ո_N M|᰼[Lj rX@&IQP[J-DAEI-29tCXbuC`HLvpu0DW[ǪPPשU5]tkM"Ў9?!yVssqw/åkl n JUӤ!N}mZP$ED9jjA;*+\].Hj !kS*S>6>f} *MВmԳ"K8 K(n+Z~&Kѱ%̑[]3X猒:mFy=wDH޹|ʻ6HD")72I k1Z}/o#Xt;on;։SycrГBO}5bWlo}-趿 y-FD{PL{ m^۱b@(BkMQ]_gPh5uXq>-ӵ(fD1MЦW55gFN}fj¯7<ꎒCn)کڦV&)Tq=IJܹNC/=MyW.<6Yk&!b4^#;=.yi[ n? - 1P m [?3s]!Hڈw66>MuX#9a2ϏנCXό26/f͜O6Qs K??ex=ՋA+ &8,&:nqY鳡}hDvg0E MDs{>2eQn l0^vbDz1)X)vAh$( \i\>zu_Eĵ) fmXDѴEF PmN!wukۑYv}:e@<CUD{&L*J]>ze]g V|4o4۞ +V&SJ`>_it22QE'8慃`^:&7 {Cq[:0*{HgF cH$/ 9ҾP9| d/@TY[CNL@ӳz ׳^vtrpnl /Q.GNPB?GD>6% AS>2UnGXݤYEZvf+ Zug0?3ptH# 5=+L"'L&]E1sBWЃ)bu]S(:1 O/ k> ( q*"?b?*g7.C){09?u6̔pK,%xѩ<obkb) B%YSy 缌 `6H\g*1VYZEc!x. :%Թ`Sx G"tL.=dJsåYyV2#jN!"pC:dý>|#8=IQٿU[n~FW$'`*Up Z $mh58;ϡ@&1R$<+ gX6 \kzfк gMzA 5J_舍-]׃9K)l#^#㬚UGf2i*CDmŞx{_ + `4bZzȮ`53TuOk)}k Ej!}i\]OXn)Q@$^NaAJH~ayzJupP V#_Gc-Ҭ󒺼U>(aBbN& + И] G tos˚yV- ^6fOǼ:~L (FOpX H4^B{Жߚ$@C 7b45鍮 P?WS[/5GLV_i!b085%%׵sIBHJUc, 2^7ܱ0YhхiEb`4 wcŰ<ې\;._:)+=%L'q4FDFUFHaw{o %V.M56U9ѻ0=+ϥvڈ6bo37i)4t^Fk2FX40,7MAz&] ^p&mL/_GMRr**}e8Z5|۳>F\15II oV֓Lv0:X1>!๭Պ~u#;1^.t$/n[VLgyPmkbo3A82SLlC|' ⑄Pۊ$RϳM5c+8ɮyHigÆ؊?cG>\&e0PD[kAxV zuwYؼ zgU͑hR,.*h7PYpNQþ[N:jD'я}$JlXDũ02.) TvȚ:>vs[\mn;* Hyŵͬ(Yc= MYalmOP%K%XlTؚ-|=IQ FnC}Vr8ԘX@q-c]o䁜KFwb)rac}47䐡">]5302qkiӆU]#k_P+]OCǰ-'vf,'INdS2\]TNqqRF)d. Ỏtŵ5 I (/ה 5y(z`~+̀:cCގˢ!F0`w^ x(ݙ3N{1S?C=`s뵐8ѳa2P`Sq M2UB0X="t2:'"碚*ASfJPX}X>|Ӈ#*}8wpYYV.BEr:@2lNap[?82A):i*#h|ޣy=#x5{N}44 w}7 "?H%^JA~OȊ\.V]2gS4q5[#i9\o;+d1 s5 LD9DY@wɓy:'ulQS9u*wHFL%gwĝ5mu2qg V`~zN ƩK5y= wPzw._+`ɏq{&X[ok[jwj{Fn}aߔu/^JMϷLP>0ǭ%A2w?_on#J ˂̤} yd:\(ٓxζ|FW_-iNEJ&l YoI>ִ<47zz,bĈInh{|ynm}Rew8"5'2&sYC5ǺсH?u~.GHu p ]`b6n9O1ZRRq4)KE(x0 +m5AN?#:e%ɓ{85Ǫi!46SVd)~B:zjZY=PMOrE}}na%Ǽ,s[o;FZ[s|?!:;UCn@y:KƴvkSݨ$kb&Dzsj8_@فT-?sEj)~k[zYyÔh*Ԇ1~\0JQ+Qk- 6Lw3eEuNIE+$ _gvYoe,N7ݫp.쬓wQY6#ky$ۄx¹M&h;?U\x.w\_A ;jRιiY˾ ו;Ͱ^~!UE y K[xWKt&.}PWXVX5V_96ϩbDH -۟ҍ fKgy1&ucJ\B>U?KHQKxZ9_?E1GYDH*P^pXl]Ʈ=gaĎϰ]2iar3s'#7i24%;O *`z~|RR6fN_ JMKrT] ,p9!S .e2^'iQ 1ha iyG4J "Y4 ~lw!a,N;?SiY%[Y!qG=B8h1Q[M=8#f O=߼i z'IP6hj鐗tO  TQTbʄ9vGOD]0GN?OkB3hkHn h|n軟.g)r6mk쪫KsqU:Ic_M~1S2H$٫X>t)N)NUg`b>B P$YǼ*301D`~kĮOI~^h8^aZM٤~7}YrǽPJ̕(xuzXYLy .gDKA֕su ϟh\:dGrxuTٹ3QفN3S9?`o O$ X.QpK3d_NO 5R]WH;fit̔μiFyq;.%YR|`OiJ!* )q$ @کM`DHXZg쯚wE:(ddؼ?zA]yVۊ!ׄ ^GEntLx׶ Sam a)T}A) L3R5s3 s#uܾ0;Ryp'#Dqpҹ?Y[U\4)# !\&G4ހ.֏/.?OxރYEk 'w`Z*ȳO~ga",I_zc`ބ2ɄV cf1,ezA (aq"rD jN25zYp2B-sezR D;y+4&> oQU>ְ&Ad~}LӹZ$OYhw Z2Yձ/|}2Y0-xq1᫗=R7c˘"d!iZ 8Q+jy>ּhԠ` 6"?>͕W ]seAWJFÍiH;Lǥ vjۑjBYـYm&#;F ya1M+ʊhE+{lryR3egl'>Āz],noV&V>ck/[dUAr0\GؓDqncM^nj t0~1I^ǣgd[ m5x'e}ϟj ??J|[;}-!Nչ@t^'2מ>G,jרk vMA՞riisŵ"G_~Ak5MDb1gMUIPRH.[@$(zd47seTܱKp1a\d0i5Dx ojGck?H,uIκ~^(ԅi\QR^$'¸ Y]?33H}U bb@BJw&űH݅H;֦uX*0O7uvWXj봘u"TC}|f_x̨Dw&BfA\:FSW_.cSr2X􉱑7F^LZ% 20O/+1t$QyI0ՊހHC]~|g{f],M(ܣF*Uaذ=.c%{SoEr8^J`WYg[7ȴodƅf% +YmF]!vgޔwjwT~Zp}Eڷ95 }WAlx/VdPҌ''Ɇ5FI}1/*kpi%ԬY{ "I;\t(j~30  a`or -+w*Hk3)#lG{o&6˦~GrQ5LZ3OJ3?M'ċ:6BMY*F?7_o/}2'$+[͞]V.W[?v*X;ށiWV1h;k/%3?>){~ *Uute>gP#v5`Z]܁ 3ux7"3iǗRQ=.ov+ nyS9}৚t꺈Z)S(8(Xu o3un\Y7h2AJ6<_nzjf̝};?V*v-TʮUAK,fvomw!M8u&Vbr 42}{{ĭ-<."kG>bmvI-(筥,1c 7&9eF淨ǶՏv9 #%6%[}ȕ9%P-bA{Mhl?t%5f1:&jtA`an,iXO=p]8JWI 6xlrCaO=u{ujQ5+'oy^[-=%g򕆦߂%vœC{l%'1I#U)-T4 꿯gZd`w߾ŧr0iS!+sh2hÁpooۃàwizu6 x;zvgjiqk@@ T~n#3H`ꄶT,B@_w=l:%G]h}>*V %_"b=Ѹ҂4e:FF9 OBPtڋ4aeߩ/mԓaMЍgSڝ`9Oug$fxGqtb7,B֛aj nP"h$0?ٜW7Y?&/1E' \%covl7qgzlˏg#;{ORA@5O=5ZFk)MG] in ?u&oLBcJIT6ԣM5FlpRLۊ /E%szXչ0SmIP SX)$㷨q#\B jѾʅ T ص#a[I`Q$Bfq'^Rt $U+ i v&89qI917z}e) >6%JG9#S%uUoe8Ja܎*;*S8<7$2'dj!z¥ wK.vyI:w T0ID)S<fC`z!4>wFڷI)Q:i*#p(fqY5XSx w;. >:5zGcS&w">V5]:z!B) B%9Sey 2\$2ǦD:}dĎ KkY CvP @I@D \.tJ ;RK%%2BU%`&ˁVIN $dF)i4N))8V@\2wXs18f@cx8ܖuR| >:5nGcSv[A\. >5zS&x Htx3ՙ#Tz$ n_"mqQ<)<*cx8XS }j ρjk$!Z"!Z!i@ vP1@ IC58Sx M0dHD`yO D}#!=<Ç";LwkCy;\w<7YC2HeM4unTaEbvK!T#y$ctD1I@.}lJ$GJ OZr' J%@3=JL4HB> <h~X ?VYت8t(UDa{ Lα{ȔS糇K!4>,B"IBfM!4N{ȔI{ .O= Lwm+w %u\eݤ8q9չiVV4oS+ԊΥS~BOcw쒍CUUd_m%YR|q^Ҥh6z+2S^? 1ae2ov(Z4"y~:e ΛRw&)Z/Yy e':#k%Y]jUBІU;!qX`j]LWhËy>ۤϸܞϡ3h+pS蜟91`bqUL|xU`.Lb(<0AI~l NjR;iIJپ %YBپO77`R!Vr}VОS=kDzW7K tW1K .M'\jcu?4;V<;_\Vf:>fNVQ0VZtlݒ=VKVA6'1|15ȍT~'_,9[%c9='/l1L=TI ZVI56 %G>VB ϏRJ#' kvݮɞ3,)Υj,b:?H{*{|* OVkSM*\u9ϗ,H|ɄNXkviS,X\36I5v4k u_*X(h}*8j>:GU6k)CTjPJ=L_}5wݐR'2%4p"ZvNJk;amO1M1Ai^>&6=N혮oXmbiq=XZ޹b=~OzRe6!y/FdimA^gY[<FNq{NI'tWw(Y?Jbs-rL%Q]@})%|)!NY^AY#+Ei$9WtlaP@f~%a_AZůYOtF!W`WUZƙRUf^J$$$سSqr3]* n1ܗǢcclnc,vKmSWP/](k0YK2X+ٍGuIg9 |uK}>VӦofqgdkN 'Uws?hjcd33@p{ELbK\s]j0+u(27ȣj삮Ёvy5ůݷax3ih;sSiytV:T7]rZ| YOlXE9)zOFIȗo3gk_uwa eA t\ۅƓncٿU+40XlPc~FǏzHɈRyDI |U&D4RH06m+ Աbef/yKzn}IGOQ?m~UO> 54cE Xv5bi~!ӣ.qT?uU-u]ůg,qgDz|G:Dzzޗz^BT괸˺"Nz9X5?v+Lie?.?H^rX0yWvbP1 U.t4b'"7 0vybU]m:T"[8h:D,dd3k5!"~K/Ӂ0>3+  ,_:qO㴏 K!">N@"飐K—,Vo*}c"X$-PVKN-+I$z럢Ubh+Bg0]ձuѣcz|8rph-FW\{j: Au2W‹ڄ:+>suXeZ<&X`שY$E'DS& >UG0C za~^~~+||]0aÛ΢z &U&0_cGѲ]&Gn^8绎i ),vŲh'{31^笳N(6{y;r #qkZ.mm7bO4A9셰@*D^ 8y|njbl-Dхq!#O ՉYJq?Ū gᾆ%8$2K؉IMעm4ֈeGdž+bzoJa.V{=YuVyϊ5;=ET ӢP ,pȳ|{璢 =Q,mIZxh64v}cBnScSnDI<$DbZXz,nJZKGPq9r(Nba\=]bz ; ;U!2>fIaJД)I߮Nu`?j$ t6}lgY }d/z8V +N[aQjR[BC`LzlŅ qQ);*#xʇ"ƛVόݏ -˃Hx^I UjP΅Q)%6@~!Й)i>Y5Sc¬涊ӭ 7Xeet<1ygs&ق!cd63WQa=kWLd1.6Ȉmffoҿ~b<~oGau9X>h=/WՑXe~zϛ- y_m՜u6g1悬- wYMg]+&iszgO*=lnRC61J =3%9K]۲h[)uϤn ú"ɊzOs< P:%04@ ^#b0''d !oJAL8 N@ 1Ÿ[w <tP_E?صO@g|;e':wݎ/j5;"Aٷ4f HGEDS2L BPee%;;70۫RucIVCD~W,f32ӏi,S !̂bx ROw& m (HƱ阮evG]|Q.~ſzӌY2к0ψ[.V j:n6_φMw.wz4Y4Nl$m5%S ؑ^#B'$1ȐqQyl4nb?~t&j,X=/N'..3YyhD 1|MxʖxyjPJ=̲հ^7 -L #4(!hvHЊh),,F)]QDlsQ4{ӥWKYG3k ͎dyC,u?4C3,:_ϚxUs}-f< +XRj}k4O5Rzm4|p:Lؘb:LચRȎjq,Fԗ_2^Ik^®8ubE&Nj$|~3"9ۊvY\'wYi;83'}wIgK7Ս;t췋Tۙ9㳋Uux>5|]8ۏQ/^G?h(Q[^||#+)ϧ` Z:\Wo֖⨰ud YU?Ў5uc%XY/~%E|L7~ #8 pr5Zi͌TDM9z5y ZeJ XRl~IH]J-ψ-Jk,ا =>{v/؁R2 r. \㧴{.~ӓ,)> i gxRpt[{8XZDl:N}Se 2إXYx pur)L'NZjL y髁)uC\sg*[Fax^@(;p#ubNBS9r˒?{{_oh]!T-ofIX@ +R r,+Xia ̰ "7坫6ՅN%j oN++Qբ´ d~:/k~qz8÷`oN/"Ƚv??YAȒs)=VnlA;Juf /HA|\#dm끩 qnY]MԖ"!?eŒ8ByC` "bS^Ue$Pl=+N-aI^rDcxj9UugR5q {O q噾kNJױmq)+ؤ`K}\jRKg4P9.u%?ԕUGl-E ?nD|euĉR+1 ]! G\c% ?h޼RzTG0-g`w|0!EZVTnQUoej˘}QDd?Ѵܾ*q??;NFk*_&8v@}_!crETLX=y Z$' ?#tZQFY=xǪ*X5-Kp2(} &ϫ̺m俹 5oiF՟ 8u,s\PہF S݃3y--LX0k>{}W4%uUƲ|*} QF9wޓ~+_IuFOnNSaZlo :7Wg7r?UEKJ}\0Ul*{`.@mrq!#?|Y lX;O5Ih?oaZobzg5Bʝ)fi%$U:lF!ہVKXN*rah ;ӛèGi顸 ժW(ǧ9A*TgNw*T5FٰPԢ,Gt_J0I5#,zV՜`Bj ~|:e"[8N"ݪ2'l珔`e~!]*6ˁPשq)j j;X5GVֺOXR.`eU:෢҆koor'R\t4"rHFVۻG_IVm7KKC綉v2վElc_թ16u٬Z#huհ|v IbZԕ dzC7=b=Px~ߙ3-6`%홶a {cϷCִ!1. +hZB~ 5/w{~۷Ɲ4=?B 76R\?T~mh]3}CP;C;ӻ/7BA_iAi/k6׭*ccCQA9{ ،>>~ ~}U4ϩiߗ\l:u3?t߶(@NոRn#,4ddPޯ~JuޏPJ062zHt("hІ>9#,vaR*)s&DQ (Wd_hVԽ tlum M;ӌ{$|W gMɦ,`~0YR$-a}e;E 1"5۞7mauXGȸ [) giW+nDOXؔ;,ݑIKcjM7Xn&+(gjё, qs'ƋI &f4 C9i{# >A &8n '/YcJ #B6z($bIzq?s˚~~)P}lD{%@8TIǏ4~C IÍ S$c 5LǓOxb[+L!iHZ$81* LNJ0&$ % YcY/o'áqJyv%{^{FWӶbcVM;~;vb+sݮ__?/X`sqr6/+;He;^ғ-œNV QZ1n&NYx}N*+~ Tw}LC R#cANc^gL(rP9;'S(|Ͻ bIx<>7# ya)c >:9sMCxh=sgZlm/\ǩzN N,j;IJ;vH@Ųݟxg+^hx^UqX{/.w#g_ͯ } :$ܨ>ơ-׿?|Ӝ< `E[gĨcrP?_β.H բ ѓOɖL֖.#έߡ]+ٵk+t@"_=q]L6۲0J& a`UMiFL*Fb,AB浏̉mت v jpPJ .!@:󩔋|\QIe~;jǏGk3Ri.^$F_;|;{Ję6τ<{- Bsqn_Pt1/cXM$W+ER= +Ʊa?HnM Z!$Err.i9.KGx& Ǖ1r>%\d(\)LШr27 +V0OC2vB+ilS3"7b=x(l=:=nv![&Oz8inghG˗Tͷ[gaГ;!)blP'Z4en"QMkh&*( .*Jr7zߚgL~keʖ"w.&W~k$Fv9$%PO#vl/+1ԉLڡd,m$q' C*x`Z*!k*}E|#zm'hhMTa3BH|aY<Ի e o-!/yk+(4S(eK_t82EΙԛCbȴҔ70i4IXY3 +vLUc.U95g.U@p Xqs.[2weZ"Ha)1OIv&nFn&e{`Ol!e],6D0O h~&tm~^J:fԺ z)_FE7t.4--`rARZ{VpR &J"q צ:nAϊ[X=OQzsQzuw C"l9{RE t; bJ8VLƏGęKaxpl;6H<8!a&/:֎mI$Laeg7ԏ!qlBLMx50*+q=dUHӱ$4zNԅ (5r{kcGAr4Ga^;/ #3h6%> kFC`{fdW9;{>v{$Sfzx%WZWM%0݆mHsy)Gt N臆}? Ptx1 X;`jõ*)5vhb@+"8ut!|@|BIOfEjMVY(>V)@œ>R,)Ec&x-m$Z[pxGvi9`:4$~N )sS;H >1`veOe^ i Ku4L q{-es)rTlibzypp-17.36.5/tests/data/Mirrorlist/000077500000000000000000000000001476576476200176375ustar00rootroot00000000000000libzypp-17.36.5/tests/data/Mirrorlist/remote-site/000077500000000000000000000000001476576476200220745ustar00rootroot00000000000000libzypp-17.36.5/tests/data/Mirrorlist/remote-site/metalink.xml000066400000000000000000000044371476576476200244320ustar00rootroot00000000000000 1288734483 4834 8fd7745c38277ac8b5618107edb72b7e de06c2b34f5b13fe6029da59475359675931eb9d d6f8135c9d5ac370fafd258c89cfb574989cd8557044d9551eefd1aaf2c54c48 f43d747fa0134e9990297f98771f74a7a449f1b5a53a6936949af5e0b51f3b3834b69af3e25ae4dd7c97415d5570abb5c0a4588ddfae673228f46a83f200b5cd 1288642986 4834 bd32127a8b2ae7a370be3dbf876afbc7 b4b9ea2494aefd82ff08915c28f6548a31625744 b0d8ae9c43bfd06829092273b409cb0f6e2b581fafd370f11752842c0cd0c2c6 78d2eff26e6a12bb1b1bbc78956f548734e921335943afabcfbf4f3ba6d164e8820eb2e685fad78088d2b42b7ec75fe4bde8ad6f5d7e9cf44e70837ce23fb758 http://ftp-stud.hs-esslingen.de/pub/fedora/linux/updates/13/x86_64/repodata/repomd.xml ftp://ftp-stud.hs-esslingen.de/pub/fedora/linux/updates/13/x86_64/repodata/repomd.xml rsync://ftp-stud.hs-esslingen.de/fedora/linux/updates/13/x86_64/repodata/repomd.xml http://mirror.eurid.eu/fedora/linux/updates/13/x86_64/repodata/repomd.xml ftp://mirror.eurid.eu/fedora/linux/updates/13/x86_64/repodata/repomd.xml libzypp-17.36.5/tests/data/Mirrorlist/remote-site/mirrors.txt000066400000000000000000000006241476576476200243340ustar00rootroot00000000000000http://ftp-stud.hs-esslingen.de/pub/fedora/linux/updates/13/x86_64/repodata/repomd.xml ftp://ftp-stud.hs-esslingen.de/pub/fedora/linux/updates/13/x86_64/repodata/repomd.xml rsync://ftp-stud.hs-esslingen.de/fedora/linux/updates/13/x86_64/repodata/repomd.xml http://mirror.eurid.eu/fedora/linux/updates/13/x86_64/repodata/repomd.xml ftp://mirror.eurid.eu/fedora/linux/updates/13/x86_64/repodata/repomd.xml libzypp-17.36.5/tests/data/OBS_zypp_svn-11.1/000077500000000000000000000000001476576476200204425ustar00rootroot00000000000000libzypp-17.36.5/tests/data/OBS_zypp_svn-11.1/repodata/000077500000000000000000000000001476576476200222415ustar00rootroot00000000000000libzypp-17.36.5/tests/data/OBS_zypp_svn-11.1/repodata/primary.xml.gz000066400000000000000000000226411476576476200250720ustar00rootroot00000000000000/bs/repos/zypp:/svn/openSUSE_Factory/.repodata/primary.xml}iwF }>s)h_GwlĞؖgf4$% %.Ef%Z^p,NF?SpQ 'S;߳^U.Cˎ&e?|ģi8Q*fT II"43l{QU X7Z=|޿jA';Xf?{9Cu6?X,×KzetZ:jO'fT N9;靽 *&벾=OL @0 (BJ y_f- ezwMN0Y։oz:tO ^fx,Hq{gk?Ȏ{5ՃgU'z!$8tI<yij֗O< w҉GY.c󓎙28!|uOUYRvU95f2?{}15߿?(>Fa%c5k3΅Jj~JR_d|vqj Gz\C5KÂ~gO ,?5,K3M UMH4כxTŘc3rtӻ9? >Zo?wx|U6zU4KNQw:a=[|iP< 7ʾ]ru\e +=kwWWR2?aZ3ԜVTA)yRE4>ʻA"wC~߿]YwrJ•-}|g?_aY*R獓_]9\\ًs Ƌ`ںW'BrJPMW<We <qdu[u4r|14wLf_G͹[ˮc)GS~~z7:3 tCc@"y!$@` ," TD܏(fUR;No->ӬB%^M~f/~N,I:~~A?]tY[Pu?E"9\Ғ>37sJ;\`0h!Q1K{Fo2JA﷼WPYnBQօʆ:yjp CJH`c~ 4PDe3HyPbկ:##zɠɓ{*}C qƗVV|wUUc5fW< ' sX`u{_#s)KqIrVy֛diϨ}5os-R'KkY,O4늃I[kw[[$nEDzBA"T%q?G\.4 'AޙV ݖQ׬rEq"=3?TQAf2 4tP_okr8Zi/z7oM\)_!(k_q6Jf7wⷕaI}1PMA:Ȋik.c*3J`h`D0G[.r@Z|EqdnVmml<;XX8PPX0UPo hi gXm7Ua_cÜ>_ny'ښ6զ/`j~^ګ^=>_#MPAWKTw d| NũWCu B˒Ia[PҘB7W.co끟##9Ⱥüfr'8jp&`n'x+ӛF,J/& : `zuǶnVZ^~ݳ˱*Pw5ζsOa- IօM7NCk ի%&jʃ +(4, ]~lD ]%.,aY΍SCQsZ-ukh[qz2^7TvZ 7׳̮'z2} 1dJA QQREނ~ǶyGmk#-Z #fZ?mKFM\Y[s§NH <q"$\JB +ГP+ZjAyC#A+<)["!sJ? #Zt؃SGSTxK-VX9u.!2,̄veJUqb >MQKa74.ͷh!jM;r-Z{컷o7WO¦8b`K '~20ƕQn9DYwhZK25iZ~qT3M:UdQ}eR¼Py£(}H+KfSW%!GXg1 QόAﮪu)AV*IޱfYyv3V{oi}@i 9!b *Vv6):2^)yN-N8 ޒM̓dVaJjuq=8s U=Oɓ܉N_1d~IP18lm/-ňG줽0ȋ)˭0؟fQ:q`zNt&Vʇ :U<%)h*Z3` Q-jsyS?a^n1]={( gAsjnC-sDZZjM|=K6ᅒP|ݼ6R*x23SSmS*Hrԗ7 /TFtLbZakbV2K6PfıЉzPh/`w Hي:\} : 8FZPs6ir:QZ8Tz7qf0v;z8jf\̡UqdfW\ϬO;l7Tn]o#/&'8GӤ8'a}p9$ӍwQF=w? L]yaVL%40U?MF`[kNjZ}barәu %r؇i^](>p>Iwm|#s++X(k iӴ3'5=D\X L8wp1Y]Γ(K/2VN` ]XnK&TFA9]*@?0*Z#o5UW]o ZngΩ{MfEkEHۣjZ,z"B]H}@=!| i*Y`uY2#/c6˚'겋vYc!p(÷8ÛSr)8mj' . ˮrB%-|0ư+(G*BI77p"8]4zPL?4 CS\͞T:EI!K;]'مQۖƷQ"n1H dzBDc5c &n)=X3Kc'>0{VG&!Y7~q4*6>HJiͷR>\t@s<85"Z5N.BГ{yiS5L.|ZP2,PFdx)QN9s٣uQ6sSHH! 8 ".GZC.tQYpRKw+?Wl?s?wgeHD""*%iDBz cTqAY;Ş1X{&{c1l-׃r BcWA`/$T$yp$P#D4h9 l; h-R4 /0bVˍ[^%џvN2[.E$y3F8OVKFz"jڧn|Z=fS:ߡƼ}5o 9R_Y;>3?"Ph͌y9CbFRUzW=ĢYݠ&]@aT;A^Y\3)u/Q F 9~v/.Di ğỦ>QI(sD6qnU+ܨ;gZ'iWbV/6ҬU= -|g3>rͥN$}2on8nmX|V R>}G|:(0 }"LQKK@"`L] pTrS!,e 3籒~!l˗`ђS5%ȅs- ˫ZA~ {LCډR o_t8ʥiTI%kh;`ٺQBe{$0># G%FVS $=*m$A% 'd]N! e%nJmk؞+YyloID-ܙ@!䡇I X Bca$ "+y#QjjgωnN+&Q@yu扉jhy:HPƸT-w//W8r3C1 y/=n Z n[}M^¸ڑt6ߥm((kdmEK$\ B(">H!aH<̀PJ!r,r)rI*x/8hZtd|-.jxDD Xӫ`4H-݉Sip)^Y\"5[ftѽwrʰ7VR E@:u"3 "zȏ/}CLRu= _N.`s]bƏjpz=3Bk[Lp[|yЭ:U`WS Ni(z g_LdIL5oMMb(a)۪t4X2) 00l4#~eV&j1X~$W2B*pp1K2ݡ,آ_Dll;YVs6~zo!x˞xAm1^oEv)w{dC](lk6sn{=M;| CC}/4 !^@H(cYR,{̴svdYt1y-9@*l| Kۣ[9"{8}aG/=RIڝ%TʶkI'mLwaisT˜G n괨UݾUNkjLY2Ts2p68.5 S'ҝؐ.>v0Zso'0ymwoN^ &irNzIaku*\mRTH4?m1}"68u['&Kuo;e[ެCm6_i Z?t8F9pqv(s8j$?"e,A =,CC#Vn]K7Uҩ9Bń11ZaAF@{E쓣tE$UkNp4+ofVeoriB=pglibzypp-17.36.5/tests/data/OBS_zypp_svn-11.1/repodata/repomd.xml000066400000000000000000000016671476576476200242630ustar00rootroot00000000000000 734543b9cb748334925d6fac1a1f2f3f5b5dffd1 1223586019 97bd7432a1c6b1b44b9ca1f52b9a18979c72a9ba 722956718221845366d4572fe5649a268cb93920 1223586019 e9edadbe3063f4ae8c97667f67d31a192eadc427 f586852ceffd230cd6e7b15a880494a9e2f7a8a5 1223586019 c9e4113751d71ea413fe4564f1f0e94e2cda9bec libzypp-17.36.5/tests/data/OBS_zypp_svn-11.1/repodata/repomd.xml.asc000066400000000000000000000002751476576476200250220ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBI7nDkyW8T9xlZ+8sRAolAAKCgHtH/tQVLIIM1k3SAo8EMMSe+7QCg ylO1hOqgWrRGrF+JovkE7akc4XI= =XnSD -----END PGP SIGNATURE----- libzypp-17.36.5/tests/data/OBS_zypp_svn-11.1/repodata/repomd.xml.key000066400000000000000000000017431476576476200250450ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.5 (GNU/Linux) mQGiBEeWW2sRBAC6p0M82A5kapMTPpn9MQ0w++cEHC4cKRGKe4ysJiGEOKcl8wmE buiiYOZKLvuFoyPDyyB/KPQ56nE/sEwJAsssXpMJ3EeSF5Px2qresY7Ralowozc5 8WF2Btq90RNqIhfjAEpTmiDpn9g7fIn9YAzwh6md2i7BemKBEfNkVrVYNwCgy5bg 9fSyOa4mr7HldiIAdNsPFLsD/0e8GhiSxD8xV3o7dchf8jMEgAv7gAbP1lGsbZQG dSsyODycr0PabGY3XVkNBb6NPdEcm63crsKeVltG455NL4WgkULaJDnDNtU1SGui AlAqEjXXR9dOCgVMs7lfpaF55cerUwGjGGMnZpGbzVClHZubwZrWV9h7O+9ln7Lu /W3mBACKfr68onKxCxmFEadAYEXtnJ/9Yk58rsD2V05rV+1SYCrybOTM/Hhjt5PZ WwXyfCwla43ljVGdIO2Rde8o6UIzbM49F04OC97HMzyGyUd2EiXfDtF4j5y+caoq 9mZaXl2hiu4YSjNGEFGBelOS1YwBefnytgFV9nyWU+9E1iqDjLQyenlwcDpzdm4g T0JTIFByb2plY3QgPHp5cHA6c3ZuQGJ1aWxkLm9wZW5zdXNlLm9yZz6IZgQTEQIA JgUCR5ZbawIbAwUJBB6wAAYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEMlvE/cZ WfvLxR0AnRRinTmsd2B7Db6eruYX40smjwnrAJ4iIFZQXD/qMEGsSr0GfCgvhmGe 94hGBBMRAgAGBQJHlltrAAoJEDswEbdrnWUjQqAAn1QYRSp5S0NrCknsvvWbGmhI jR0SAKCwuY8a+dKLOdrhV+520EhUsYU6+Q== =7eFk -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/data/PoolReuseIds/000077500000000000000000000000001476576476200200465ustar00rootroot00000000000000libzypp-17.36.5/tests/data/PoolReuseIds/SeqA/000077500000000000000000000000001476576476200206775ustar00rootroot00000000000000libzypp-17.36.5/tests/data/PoolReuseIds/SeqA/SEQA.repo000066400000000000000000000006701476576476200223220ustar00rootroot00000000000000=Ver: 3.0 =Pkg: package 4 1 x86_64 +Prv: package = 4-1 -Prv: =Vnd: unkown =Pkg: patch:patch 4 1 x86_64 +Prv: patch:patch = 4-1 -Prv: =Vnd: unkown =Pkg: pattern:pattern 4 1 x86_64 +Prv: pattern:pattern = 4-1 -Prv: =Vnd: unkown =Pkg: product:product 4 1 x86_64 +Prv: product:product = 4-1 -Prv: =Vnd: unkown =Pkg: srcpackage 4 1 src =Vnd: unkown =Pkg: application:application 4 1 x86_64 +Prv: application:application = 4-1 -Prv: =Vnd: unkown libzypp-17.36.5/tests/data/PoolReuseIds/SeqA/zypp-control.yaml000066400000000000000000000012161476576476200242430ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: SEQA url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: SEQA.repo arch: x86_64 locales: [] autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/data/PoolReuseIds/SeqB/000077500000000000000000000000001476576476200207005ustar00rootroot00000000000000libzypp-17.36.5/tests/data/PoolReuseIds/SeqB/SeqB.repo000066400000000000000000000006701476576476200224240ustar00rootroot00000000000000=Ver: 3.0 =Pkg: application:application 4 1 x86_64 +Prv: application:application = 4-1 -Prv: =Vnd: unkown =Pkg: package 4 1 x86_64 +Prv: package = 4-1 -Prv: =Vnd: unkown =Pkg: patch:patch 4 1 x86_64 +Prv: patch:patch = 4-1 -Prv: =Vnd: unkown =Pkg: pattern:pattern 4 1 x86_64 +Prv: pattern:pattern = 4-1 -Prv: =Vnd: unkown =Pkg: product:product 4 1 x86_64 +Prv: product:product = 4-1 -Prv: =Vnd: unkown =Pkg: srcpackage 4 1 src =Vnd: unkown libzypp-17.36.5/tests/data/PoolReuseIds/SeqB/zypp-control.yaml000066400000000000000000000012161476576476200242440ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: SeqB url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: SeqB.repo arch: x86_64 locales: [] autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/data/TCNamespaceRecommends/000077500000000000000000000000001476576476200216315ustar00rootroot00000000000000libzypp-17.36.5/tests/data/TCNamespaceRecommends/@System.repo000066400000000000000000000004051476576476200241030ustar00rootroot00000000000000=Ver: 3.0 =Pkg: aspell 0 0 x86_64 +Prv: aspell = 0-0 -Prv: +Rec: aspell-en recommended-pkg -Rec: =Pkg: aspell-en 0 0 x86_64 +Prv: locale(aspell:en) aspell-en = 0-0 -Prv: +Sup: aspell & namespace:language(en) -Sup: =Pkg: glibc 0 0 x86_64 +Prv: glibc = 0-0 -Prv: libzypp-17.36.5/tests/data/TCNamespaceRecommends/update.repo000066400000000000000000000010031476576476200237740ustar00rootroot00000000000000=Ver: 3.0 =Pkg: aspell 1 1 x86_64 +Prv: aspell = 1-1 -Prv: +Rec: aspell-en recommended-pkg -Rec: =Pkg: aspell-en 1 1 x86_64 +Prv: locale(aspell:en) aspell-en = 1-1 -Prv: +Sup: aspell & namespace:language(en) -Sup: =Pkg: aspell-de 1 1 x86_64 +Prv: locale(aspell:de) aspell-de = 1-1 -Prv: +Sup: aspell & namespace:language(de) -Sup: =Pkg: aspell-fr 1 1 x86_64 +Prv: locale(aspell:fr) aspell-fr = 1-1 -Prv: +Sup: aspell & namespace:language(fr) -Sup: =Pkg: recommended-pkg 1 1 x86_64 +Prv: recommended-pkg = 1-1 -Prv: libzypp-17.36.5/tests/data/TCNamespaceRecommends/zypp-control.yaml000066400000000000000000000015421476576476200251770ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" - alias: update url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: update.repo arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/data/TCSelectable/000077500000000000000000000000001476576476200177635ustar00rootroot00000000000000libzypp-17.36.5/tests/data/TCSelectable/@System.repo000066400000000000000000000006751476576476200222460ustar00rootroot00000000000000=Ver: 3.0 =Pkg: candidate 1 1 i586 +Prv: candidate = 1-1 -Prv: =Vnd: openSUSE =Pkg: candidatenoarch 1 1 i586 +Prv: candidatenoarch = 1-1 -Prv: =Vnd: unknown =Pkg: installed_only 1 1 i586 +Prv: installed_only = 1-1 -Prv: =Pkg: installed_only 1 0 i586 +Prv: installed_only = 1-0 -Prv: =Pkg: installed_and_available 1 1 i586 +Prv: installed_and_available = 1-1 -Prv: =Pkg: installed_and_available 1 0 i586 +Prv: installed_and_available = 1-0 -Prv: libzypp-17.36.5/tests/data/TCSelectable/RepoHIGH.repo000066400000000000000000000007231476576476200222210ustar00rootroot00000000000000=Ver: 3.0 =Pkg: candidate 4 1 x86_64 +Prv: candidate = 4-1 -Prv: =Vnd: unkown =Pkg: candidate 4 1 i586 +Prv: candidate = 4-1 -Prv: =Vnd: unknown =Pkg: candidatenoarch 5 1 noarch +Prv: candidatenoarch = 5-1 -Prv: =Vnd: unknown =Pkg: candidatenoarch 4 1 x86_64 +Prv: candidatenoarch = 4-1 -Prv: =Vnd: unknown =Pkg: candidatenoarch 4 1 i586 +Prv: candidatenoarch = 4-1 -Prv: =Vnd: unknown =Pkg: candidatenoarch 4 1 noarch +Prv: candidatenoarch = 4-1 -Prv: =Vnd: unknown libzypp-17.36.5/tests/data/TCSelectable/RepoLOW.repo000066400000000000000000000011041476576476200221350ustar00rootroot00000000000000=Ver: 3.0 =Pkg: candidate 2 1 x86_64 +Prv: candidate = 2-1 -Prv: =Vnd: openSUSE =Pkg: candidate 2 1 i586 +Prv: candidate = 2-1 -Prv: =Vnd: openSUSE =Pkg: installed_and_available 1 1 i586 +Prv: installed_and_available = 1-1 -Prv: =Pkg: installed_and_available 2 1 i586 +Prv: installed_and_available = 2-1 -Prv: =Pkg: installed_and_available 3 1 i586 +Prv: installed_and_available = 3-1 -Prv: =Pkg: available_only 1 1 i586 +Prv: available_only = 1-1 -Prv: =Pkg: available_only 2 1 i586 +Prv: available_only = 2-1 -Prv: =Pkg: available_only 3 1 i586 +Prv: available_only = 3-1 -Prv: libzypp-17.36.5/tests/data/TCSelectable/RepoMID.repo000066400000000000000000000007321476576476200221130ustar00rootroot00000000000000=Ver: 3.0 =Pkg: candidate 0 1 x86_64 +Prv: candidate = 0-1 -Prv: =Vnd: openSUSE =Pkg: candidate 0 1 i586 +Prv: candidate = 0-1 -Prv: =Vnd: openSUSE =Pkg: candidatenoarch 0 2 noarch +Prv: candidatenoarch = 0-2 -Prv: =Vnd: openSUSE =Pkg: candidatenoarch 0 1 x86_64 +Prv: candidatenoarch = 0-1 -Prv: =Vnd: openSUSE =Pkg: candidatenoarch 0 1 i586 +Prv: candidatenoarch = 0-1 -Prv: =Vnd: openSUSE =Pkg: candidatenoarch 0 1 noarch +Prv: candidatenoarch = 0-1 -Prv: =Vnd: openSUSE libzypp-17.36.5/tests/data/TCSelectable/RepoSRC.repo000066400000000000000000000004141476576476200221260ustar00rootroot00000000000000=Ver: 3.0 =Pkg: candidate 0 1 src =Vnd: openSUSE =Pkg: candidate 0 1 src =Vnd: openSUSE =Pkg: candidatenoarch 0 2 src =Vnd: openSUSE =Pkg: candidatenoarch 0 1 src =Vnd: openSUSE =Pkg: candidatenoarch 0 1 src =Vnd: openSUSE =Pkg: candidatenoarch 0 1 src =Vnd: openSUSE libzypp-17.36.5/tests/data/TCSelectable/zypp-control.yaml000066400000000000000000000024421476576476200233310ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: RepoHIGH url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 10 file: RepoHIGH.repo - alias: RepoLOW url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: RepoLOW.repo - alias: RepoMID url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 50 file: RepoMID.repo - alias: RepoSRC url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: RepoSRC.repo - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/data/TCWhatObsoletes/000077500000000000000000000000001476576476200205035ustar00rootroot00000000000000libzypp-17.36.5/tests/data/TCWhatObsoletes/@System.repo000066400000000000000000000004461476576476200227620ustar00rootroot00000000000000=Ver: 3.0 =Pkg: test1 1 1 i586 +Prv: test1 = 1-1 -Prv: +Obs: goaway < 2-1 -Obs: =Pkg: goaway 1 1 i586 +Prv: goaway = 1-1 -Prv: =Pkg: goaway 2 1 i586 +Prv: goaway = 2-1 -Prv: =Pkg: meetoo 1 1 i586 +Prv: goaway = 1-1 meetoo = 1-1 -Prv: =Pkg: meetoo 2 1 i586 +Prv: goaway = 2-1 meetoo = 2-1 -Prv: libzypp-17.36.5/tests/data/TCWhatObsoletes/zypp-control.yaml000066400000000000000000000012601476576476200240460ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: i686 locales: - fate: "" name: en_US autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/data/TCdup/000077500000000000000000000000001476576476200165105ustar00rootroot00000000000000libzypp-17.36.5/tests/data/TCdup/@System.repo000066400000000000000000000006661476576476200207730ustar00rootroot00000000000000=Ver: 3.0 =Pkg: product:Product 1 1 i586 +Prv: product:Product = 1-1 -Prv: =Vnd: openSUSE =Pkg: release-package 1 1 i586 +Prv: product() product(Product) = 1-1 release-package = 1-1 -Prv: =Vnd: openSUSE =Pkg: glibc 1 1 i586 +Req: dropped_required -Req: +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: dropped_required 1 1 i586 +Prv: dropped_required = 1-1 -Prv: =Vnd: openSUSE =Pkg: dropped 1 1 i586 +Prv: dropped = 1-1 -Prv: =Vnd: openSUSE libzypp-17.36.5/tests/data/TCdup/update.repo000066400000000000000000000004761476576476200206700ustar00rootroot00000000000000=Ver: 3.0 =Pkg: product:Product 2 1 i586 +Prv: product:Product = 2-1 -Prv: =Vnd: openSUSE =Pkg: release-package 2 1 i586 +Prv: product() product(Product) = 2-1 weakremover(dropped_required) weakremover(dropped) release-package = 2-1 -Prv: =Vnd: openSUSE =Pkg: package 2 1 i586 +Prv: package = 2-1 -Prv: =Vnd: openSUSE libzypp-17.36.5/tests/data/TCdup/zypp-control.yaml000066400000000000000000000015421476576476200220560ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" - alias: update url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 10 file: update.repo arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/data/dummywebroot/000077500000000000000000000000001476576476200202265ustar00rootroot00000000000000libzypp-17.36.5/tests/data/dummywebroot/Readme000066400000000000000000000002031476576476200213410ustar00rootroot00000000000000This is just a dummy directory for all tests that start a WebServer but do not really need a root directory to provide any content libzypp-17.36.5/tests/data/lighttpdconf/000077500000000000000000000000001476576476200201565ustar00rootroot00000000000000libzypp-17.36.5/tests/data/lighttpdconf/conf.d/000077500000000000000000000000001476576476200213255ustar00rootroot00000000000000libzypp-17.36.5/tests/data/lighttpdconf/conf.d/access_log.conf000066400000000000000000000013361476576476200243010ustar00rootroot00000000000000####################################################################### ## ## Corresponding documentation: ## ## https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModAccesslog ## server.modules += ( "mod_accesslog" ) ## ## Default access log. ## accesslog.filename = log_root + "/access.log" ## ## The default format produces CLF compatible output. ## For available parameters see access.txt ## #accesslog.format = "%h %l %u %t \"%r\" %b %>s \"%{User-Agent}i\" \"%{Referer}i\"" ## ## If you want to log to syslog you have to unset the ## accesslog.use-syslog setting and uncomment the next line. ## #accesslog.use-syslog = "enable" # ####################################################################### libzypp-17.36.5/tests/data/lighttpdconf/conf.d/auth.conf000066400000000000000000000016501476576476200231370ustar00rootroot00000000000000####################################################################### ## ## Authentication Module ## ----------------------- ## ## See https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modauth ## for more info. ## #auth.backend = "plain" #auth.backend.plain.userfile = "/etc/lighttpd/lighttpd.user" #auth.backend.plain.groupfile = "/etc/lighttpd/lighttpd.group" #auth.backend.ldap.hostname = "localhost" #auth.backend.ldap.base-dn = "dc=my-domain,dc=com" #auth.backend.ldap.filter = "(uid=$)" #auth.require = ( "/server-status" => # ( # "method" => "digest", # "realm" => "Server Status", # "require" => "valid-user" # ), # ) ## ####################################################################### libzypp-17.36.5/tests/data/lighttpdconf/conf.d/compress.conf000066400000000000000000000014651476576476200240350ustar00rootroot00000000000000####################################################################### ## ## Output Compression ## -------------------- ## ## See https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modcompress ## server.modules += ( "mod_compress" ) ## ## where should the compressed files be cached? ## see the base config for the declaration of the variable. ## ## This directory should be changed per vhost otherwise you can ## run into trouble with overlapping filenames ## compress.cache-dir = cache_dir + "/compress" ## ## FileTypes to compress. ## compress.filetype = ("text/plain", "text/html") ## ## Maximum filesize that will be compressed. ## Default is 0, which means unlimited file size. ## #compress.max-filesize = 0 ## ####################################################################### libzypp-17.36.5/tests/data/lighttpdconf/conf.d/debug.conf000066400000000000000000000020161476576476200232610ustar00rootroot00000000000000####################################################################### ## ## Debug options ## --------------- ## ## See https://redmine.lighttpd.net/projects/lighttpd/wiki/DebugVariables ## ## Enable those options for debugging the behavior ## ## The settings can be set per location/vhost. ## ## ## log-request-handling allows you to track the request ## handing inside lighttpd. ## debug.log-request-handling = "enable" ## ## log all request headers. ## debug.log-request-header = "enable" ## ## similar to log-request-header. ## but only logs if we encountered an error. ## (return codes 400 and 5xx) ## debug.log-request-header-on-error = "enable" ## ## log the header we send out to the client. ## debug.log-response-header = "enable" ## ## log if a file wasnt found in the error log. ## debug.log-file-not-found = "enable" ## ## debug conditionals handling ## debug.log-condition-handling = "enable" # ####################################################################### libzypp-17.36.5/tests/data/lighttpdconf/conf.d/dirlisting.conf000066400000000000000000000025671476576476200243560ustar00rootroot00000000000000####################################################################### ## ## Dirlisting Module ## ------------------- ## ## See https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModDirlisting ## ## ## Enabled Directory listing ## dir-listing.activate = "disable" ## ## Hide dot files from the listing? ## By default they are listed. ## dir-listing.hide-dotfiles = "disable" ## ## list of regular expressions. Files that match any of the specified ## regular expressions will be excluded from directory listings. ## dir-listing.exclude = ( "~$" ) ## ## set a encoding for the generated directory listing ## ## If you file-system is not using ASCII you have to set the encoding of ## the filenames as they are put into the HTML listing AS IS (with XML ## encoding) ## dir-listing.encoding = "UTF-8" ## ## Specify the url to an optional CSS file. ## #dir-listing.external-css = "/dirindex.css" ## ## Include HEADER.txt files above the directory listing. ## You can disable showing the HEADER.txt in the listing. ## dir-listing.hide-header-file = "disable" dir-listing.show-header = "disable" ## ## Include README.txt files above the directory listing. ## You can disable showing the README.txt in the listing. ## dir-listing.hide-readme-file = "disable" dir-listing.show-readme = "disable" ## ####################################################################### libzypp-17.36.5/tests/data/lighttpdconf/conf.d/expire.conf000066400000000000000000000011511476576476200234660ustar00rootroot00000000000000####################################################################### ## ## Expire Module ## --------------- ## ## See https://redmine.lighttpd.net/projects/lighttpd/wiki/docs_modexpire ## server.modules += ( "mod_expire" ) ## ## assignes a expiration to all files below the specified path. The ## specification of the time is made up of: ## ## ## #expire.url = ( # "/buggy/" => "access 2 hours", # "/images/" => "access plus 1 seconds 2 minutes" #) ## ####################################################################### libzypp-17.36.5/tests/data/lighttpdconf/conf.d/fastcgi.conf000066400000000000000000000010021476576476200236050ustar00rootroot00000000000000####################################################################### ## ## FastCGI Module ## --------------- ## ## See https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModFastCGI ## server.modules += ( "mod_fastcgi" ) fastcgi.server = ( "/handler/" => (( "socket" => env.ZYPP_TEST_SOCKPATH, "check-local" => "disable", "docroot" => "/" # remote server may use # its own docroot )) ) ## ####################################################################### libzypp-17.36.5/tests/data/lighttpdconf/conf.d/maybessl.sh000077500000000000000000000002651476576476200235060ustar00rootroot00000000000000#!/usr/bin/sh if [ "${ZYPP_TEST_USE_SSL}" == "1" ]; then echo 'server.modules += ( "mod_openssl" )' echo 'ssl.engine = "enable"' echo 'ssl.pemfile = ssl_dir + "/server.pem"' fi libzypp-17.36.5/tests/data/lighttpdconf/conf.d/mime.conf000066400000000000000000000526071476576476200231350ustar00rootroot00000000000000# created by create-mime.conf.pl ####################################################################### ## ## MimeType handling ## ------------------- ## ## https://redmine.lighttpd.net/projects/lighttpd/wiki/Mimetype_assignDetails ## ## mimetype.xattr-name ## Set the extended file attribute name used to obtain mime type ## (must also set mimetype.use-xattr = "enable") ## ## Default value is "Content-Type" ## ## freedesktop.org Shared MIME-info Database specification suggests ## user-defined value ("user.mime_type") as name for extended file attribute #mimetype.xattr-name = "user.mime_type" ## ## Use extended attribute named in mimetype.xattr-name (default "Content-Type") ## to obtain mime type if possible ## ## Disabled by default ## #mimetype.use-xattr = "enable" ## ## mimetype ("Content-Type" HTTP header) mapping for static file handling ## ## The first matching suffix is used. If no mapping is found ## 'application/octet-stream' is used, and caching (etag/last-modified handling) ## is disabled to prevent clients from caching "unknown" mime types. ## ## Therefore the last mapping is: ## "" => "application/octet-stream" ## This matches all extensions and acts as default mime type, and enables ## caching for those. mimetype.assign = ( ".pcf.Z" => "application/x-font-pcf", ".tar.bz2" => "application/x-gtar-compressed", ".tar.gz" => "application/x-gtar-compressed", ".ez" => "application/andrew-inset", ".anx" => "application/annodex", ".atom" => "application/atom+xml", ".atomcat" => "application/atomcat+xml", ".atomsrv" => "application/atomserv+xml", ".lin" => "application/bbolin", ".cu" => "application/cu-seeme", ".davmount" => "application/davmount+xml", ".dcm" => "application/dicom", ".tsp" => "application/dsptype", ".es" => "application/ecmascript", ".otf" => "application/font-sfnt", ".ttf" => "application/font-sfnt", ".pfr" => "application/font-tdpfr", ".woff" => "application/font-woff", ".spl" => "application/futuresplash", ".gz" => "application/gzip", ".hta" => "application/hta", ".jar" => "application/java-archive", ".ser" => "application/java-serialized-object", ".class" => "application/java-vm", ".js" => "application/javascript", ".json" => "application/json", ".m3g" => "application/m3g", ".hqx" => "application/mac-binhex40", ".cpt" => "application/mac-compactpro", ".nb" => "application/mathematica", ".nbp" => "application/mathematica", ".mbox" => "application/mbox", ".mdb" => "application/msaccess", ".doc" => "application/msword", ".dot" => "application/msword", ".mxf" => "application/mxf", ".asn" => "application/octet-stream", ".bin" => "application/octet-stream", ".deploy" => "application/octet-stream", ".ent" => "application/octet-stream", ".msp" => "application/octet-stream", ".msu" => "application/octet-stream", ".oda" => "application/oda", ".opf" => "application/oebps-package+xml", ".ogx" => "application/ogg", ".one" => "application/onenote", ".onepkg" => "application/onenote", ".onetmp" => "application/onenote", ".onetoc2" => "application/onenote", ".pdf" => "application/pdf", ".pgp" => "application/pgp-encrypted", ".key" => "application/pgp-keys", ".sig" => "application/pgp-signature", ".prf" => "application/pics-rules", ".ai" => "application/postscript", ".eps" => "application/postscript", ".eps2" => "application/postscript", ".eps3" => "application/postscript", ".epsf" => "application/postscript", ".epsi" => "application/postscript", ".ps" => "application/postscript", ".rar" => "application/rar", ".rdf" => "application/rdf+xml", ".rtf" => "application/rtf", ".stl" => "application/sla", ".smi" => "application/smil+xml", ".smil" => "application/smil+xml", ".xht" => "application/xhtml+xml", ".xhtml" => "application/xhtml+xml", ".xml" => "application/xml", ".xsd" => "application/xml", ".dtd" => "application/xml-dtd", ".xsl" => "application/xslt+xml", ".xslt" => "application/xslt+xml", ".xspf" => "application/xspf+xml", ".zip" => "application/zip", ".apk" => "application/vnd.android.package-archive", ".cdy" => "application/vnd.cinderella", ".ddeb" => "application/vnd.debian.binary-package", ".deb" => "application/vnd.debian.binary-package", ".udeb" => "application/vnd.debian.binary-package", ".sfd" => "application/vnd.font-fontforge-sfd", ".kml" => "application/vnd.google-earth.kml+xml", ".kmz" => "application/vnd.google-earth.kmz", ".xul" => "application/vnd.mozilla.xul+xml", ".xlb" => "application/vnd.ms-excel", ".xls" => "application/vnd.ms-excel", ".xlt" => "application/vnd.ms-excel", ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12", ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12", ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12", ".xltm" => "application/vnd.ms-excel.template.macroEnabled.12", ".eot" => "application/vnd.ms-fontobject", ".thmx" => "application/vnd.ms-officetheme", ".cat" => "application/vnd.ms-pki.seccat", ".pps" => "application/vnd.ms-powerpoint", ".ppt" => "application/vnd.ms-powerpoint", ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12", ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12", ".sldm" => "application/vnd.ms-powerpoint.slide.macroEnabled.12", ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12", ".docm" => "application/vnd.ms-word.document.macroEnabled.12", ".dotm" => "application/vnd.ms-word.template.macroEnabled.12", ".odc" => "application/vnd.oasis.opendocument.chart", ".odb" => "application/vnd.oasis.opendocument.database", ".odf" => "application/vnd.oasis.opendocument.formula", ".odg" => "application/vnd.oasis.opendocument.graphics", ".otg" => "application/vnd.oasis.opendocument.graphics-template", ".odi" => "application/vnd.oasis.opendocument.image", ".odp" => "application/vnd.oasis.opendocument.presentation", ".otp" => "application/vnd.oasis.opendocument.presentation-template", ".ods" => "application/vnd.oasis.opendocument.spreadsheet", ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template", ".odt" => "application/vnd.oasis.opendocument.text", ".odm" => "application/vnd.oasis.opendocument.text-master", ".ott" => "application/vnd.oasis.opendocument.text-template", ".oth" => "application/vnd.oasis.opendocument.text-web", ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", ".sldx" => "application/vnd.openxmlformats-officedocument.presentationml.slide", ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow", ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template", ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template", ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template", ".cod" => "application/vnd.rim.cod", ".mmf" => "application/vnd.smaf", ".sdc" => "application/vnd.stardivision.calc", ".sds" => "application/vnd.stardivision.chart", ".sda" => "application/vnd.stardivision.draw", ".sdd" => "application/vnd.stardivision.impress", ".sdf" => "application/vnd.stardivision.math", ".sdw" => "application/vnd.stardivision.writer", ".sgl" => "application/vnd.stardivision.writer-global", ".sxc" => "application/vnd.sun.xml.calc", ".stc" => "application/vnd.sun.xml.calc.template", ".sxd" => "application/vnd.sun.xml.draw", ".std" => "application/vnd.sun.xml.draw.template", ".sxi" => "application/vnd.sun.xml.impress", ".sti" => "application/vnd.sun.xml.impress.template", ".sxm" => "application/vnd.sun.xml.math", ".sxw" => "application/vnd.sun.xml.writer", ".sxg" => "application/vnd.sun.xml.writer.global", ".stw" => "application/vnd.sun.xml.writer.template", ".sis" => "application/vnd.symbian.install", ".cap" => "application/vnd.tcpdump.pcap", ".pcap" => "application/vnd.tcpdump.pcap", ".vsd" => "application/vnd.visio", ".vss" => "application/vnd.visio", ".vst" => "application/vnd.visio", ".vsw" => "application/vnd.visio", ".wbxml" => "application/vnd.wap.wbxml", ".wmlc" => "application/vnd.wap.wmlc", ".wmlsc" => "application/vnd.wap.wmlscriptc", ".wpd" => "application/vnd.wordperfect", ".wp5" => "application/vnd.wordperfect5.1", ".wk" => "application/x-123", ".7z" => "application/x-7z-compressed", ".abw" => "application/x-abiword", ".dmg" => "application/x-apple-diskimage", ".bcpio" => "application/x-bcpio", ".torrent" => "application/x-bittorrent", ".bz2" => "application/x-bzip", ".cab" => "application/x-cab", ".cbr" => "application/x-cbr", ".cbz" => "application/x-cbz", ".cda" => "application/x-cdf", ".cdf" => "application/x-cdf", ".vcd" => "application/x-cdlink", ".pgn" => "application/x-chess-pgn", ".mph" => "application/x-comsol", ".cpio" => "application/x-cpio", ".dcr" => "application/x-director", ".dir" => "application/x-director", ".dxr" => "application/x-director", ".dms" => "application/x-dms", ".wad" => "application/x-doom", ".dvi" => "application/x-dvi", ".gsf" => "application/x-font", ".pfa" => "application/x-font", ".pfb" => "application/x-font", ".pcf" => "application/x-font-pcf", ".mm" => "application/x-freemind", ".gan" => "application/x-ganttproject", ".gnumeric" => "application/x-gnumeric", ".sgf" => "application/x-go-sgf", ".gcf" => "application/x-graphing-calculator", ".gtar" => "application/x-gtar", ".taz" => "application/x-gtar-compressed", ".tbz" => "application/x-gtar-compressed", ".tgz" => "application/x-gtar-compressed", ".hdf" => "application/x-hdf", ".hwp" => "application/x-hwp", ".ica" => "application/x-ica", ".info" => "application/x-info", ".ins" => "application/x-internet-signup", ".isp" => "application/x-internet-signup", ".iii" => "application/x-iphone", ".iso" => "application/x-iso9660-image", ".jam" => "application/x-jam", ".jnlp" => "application/x-java-jnlp-file", ".jmz" => "application/x-jmol", ".chrt" => "application/x-kchart", ".kil" => "application/x-killustrator", ".skd" => "application/x-koan", ".skm" => "application/x-koan", ".skp" => "application/x-koan", ".skt" => "application/x-koan", ".kpr" => "application/x-kpresenter", ".kpt" => "application/x-kpresenter", ".ksp" => "application/x-kspread", ".kwd" => "application/x-kword", ".kwt" => "application/x-kword", ".latex" => "application/x-latex", ".lha" => "application/x-lha", ".lyx" => "application/x-lyx", ".lzh" => "application/x-lzh", ".lzx" => "application/x-lzx", ".book" => "application/x-maker", ".fb" => "application/x-maker", ".fbdoc" => "application/x-maker", ".fm" => "application/x-maker", ".frame" => "application/x-maker", ".frm" => "application/x-maker", ".maker" => "application/x-maker", ".mif" => "application/x-mif", ".m3u8" => "application/x-mpegURL", ".application" => "application/x-ms-application", ".manifest" => "application/x-ms-manifest", ".wmd" => "application/x-ms-wmd", ".wmz" => "application/x-ms-wmz", ".bat" => "application/x-msdos-program", ".com" => "application/x-msdos-program", ".dll" => "application/x-msdos-program", ".exe" => "application/x-msdos-program", ".msi" => "application/x-msi", ".nc" => "application/x-netcdf", ".pac" => "application/x-ns-proxy-autoconfig", ".nwc" => "application/x-nwc", ".o" => "application/x-object", ".oza" => "application/x-oz-application", ".p7r" => "application/x-pkcs7-certreqresp", ".crl" => "application/x-pkcs7-crl", ".pyc" => "application/x-python-code", ".pyo" => "application/x-python-code", ".qgs" => "application/x-qgis", ".shp" => "application/x-qgis", ".shx" => "application/x-qgis", ".qtl" => "application/x-quicktimeplayer", ".rdp" => "application/x-rdp", ".rpm" => "application/x-redhat-package-manager", ".rss" => "application/x-rss+xml", ".rb" => "application/x-ruby", ".sce" => "application/x-scilab", ".sci" => "application/x-scilab", ".xcos" => "application/x-scilab-xcos", ".shar" => "application/x-shar", ".swf" => "application/x-shockwave-flash", ".swfl" => "application/x-shockwave-flash", ".scr" => "application/x-silverlight", ".sql" => "application/x-sql", ".sit" => "application/x-stuffit", ".sitx" => "application/x-stuffit", ".sv4cpio" => "application/x-sv4cpio", ".sv4crc" => "application/x-sv4crc", ".tar" => "application/x-tar", ".gf" => "application/x-tex-gf", ".pk" => "application/x-tex-pk", ".texi" => "application/x-texinfo", ".texinfo" => "application/x-texinfo", ".roff" => "application/x-troff", ".t" => "application/x-troff", ".tr" => "application/x-troff", ".man" => "application/x-troff-man", ".me" => "application/x-troff-me", ".ms" => "application/x-troff-ms", ".ustar" => "application/x-ustar", ".src" => "application/x-wais-source", ".wz" => "application/x-wingz", ".crt" => "application/x-x509-ca-cert", ".xcf" => "application/x-xcf", ".fig" => "application/x-xfig", ".xpi" => "application/x-xpinstall", ".xz" => "application/x-xz", ".amr" => "audio/amr", ".awb" => "audio/amr-wb", ".axa" => "audio/annodex", ".au" => "audio/basic", ".snd" => "audio/basic", ".csd" => "audio/csound", ".orc" => "audio/csound", ".sco" => "audio/csound", ".flac" => "audio/flac", ".kar" => "audio/midi", ".mid" => "audio/midi", ".midi" => "audio/midi", ".m4a" => "audio/mpeg", ".mp2" => "audio/mpeg", ".mp3" => "audio/mpeg", ".mpega" => "audio/mpeg", ".mpga" => "audio/mpeg", ".m3u" => "audio/mpegurl", ".oga" => "audio/ogg", ".ogg" => "audio/ogg", ".opus" => "audio/ogg", ".spx" => "audio/ogg", ".sid" => "audio/prs.sid", ".aif" => "audio/x-aiff", ".aifc" => "audio/x-aiff", ".aiff" => "audio/x-aiff", ".gsm" => "audio/x-gsm", ".wax" => "audio/x-ms-wax", ".wma" => "audio/x-ms-wma", ".ra" => "audio/x-realaudio", ".ram" => "audio/x-realaudio", ".rm" => "audio/x-realaudio", ".pls" => "audio/x-scpls", ".sd2" => "audio/x-sd2", ".wav" => "audio/x-wav", ".alc" => "chemical/x-alchemy", ".cac" => "chemical/x-cache", ".cache" => "chemical/x-cache", ".csf" => "chemical/x-cache-csf", ".cascii" => "chemical/x-cactvs-binary", ".cbin" => "chemical/x-cactvs-binary", ".ctab" => "chemical/x-cactvs-binary", ".cdx" => "chemical/x-cdx", ".cer" => "chemical/x-cerius", ".c3d" => "chemical/x-chem3d", ".chm" => "chemical/x-chemdraw", ".cif" => "chemical/x-cif", ".cmdf" => "chemical/x-cmdf", ".cml" => "chemical/x-cml", ".cpa" => "chemical/x-compass", ".bsd" => "chemical/x-crossfire", ".csm" => "chemical/x-csml", ".csml" => "chemical/x-csml", ".ctx" => "chemical/x-ctx", ".cef" => "chemical/x-cxf", ".cxf" => "chemical/x-cxf", ".emb" => "chemical/x-embl-dl-nucleotide", ".embl" => "chemical/x-embl-dl-nucleotide", ".spc" => "chemical/x-galactic-spc", ".gam" => "chemical/x-gamess-input", ".gamin" => "chemical/x-gamess-input", ".inp" => "chemical/x-gamess-input", ".fch" => "chemical/x-gaussian-checkpoint", ".fchk" => "chemical/x-gaussian-checkpoint", ".cub" => "chemical/x-gaussian-cube", ".gau" => "chemical/x-gaussian-input", ".gjc" => "chemical/x-gaussian-input", ".gjf" => "chemical/x-gaussian-input", ".gal" => "chemical/x-gaussian-log", ".gcg" => "chemical/x-gcg8-sequence", ".gen" => "chemical/x-genbank", ".hin" => "chemical/x-hin", ".ist" => "chemical/x-isostar", ".istr" => "chemical/x-isostar", ".dx" => "chemical/x-jcamp-dx", ".jdx" => "chemical/x-jcamp-dx", ".kin" => "chemical/x-kinemage", ".mcm" => "chemical/x-macmolecule", ".mmd" => "chemical/x-macromodel-input", ".mmod" => "chemical/x-macromodel-input", ".mol" => "chemical/x-mdl-molfile", ".rd" => "chemical/x-mdl-rdfile", ".rxn" => "chemical/x-mdl-rxnfile", ".sd" => "chemical/x-mdl-sdfile", ".tgf" => "chemical/x-mdl-tgf", ".mcif" => "chemical/x-mmcif", ".mol2" => "chemical/x-mol2", ".b" => "chemical/x-molconn-Z", ".gpt" => "chemical/x-mopac-graph", ".mop" => "chemical/x-mopac-input", ".mopcrt" => "chemical/x-mopac-input", ".mpc" => "chemical/x-mopac-input", ".zmt" => "chemical/x-mopac-input", ".moo" => "chemical/x-mopac-out", ".mvb" => "chemical/x-mopac-vib", ".prt" => "chemical/x-ncbi-asn1-ascii", ".aso" => "chemical/x-ncbi-asn1-binary", ".val" => "chemical/x-ncbi-asn1-binary", ".pdb" => "chemical/x-pdb", ".ros" => "chemical/x-rosdal", ".sw" => "chemical/x-swissprot", ".vms" => "chemical/x-vamas-iso14976", ".vmd" => "chemical/x-vmd", ".xtel" => "chemical/x-xtel", ".xyz" => "chemical/x-xyz", ".gif" => "image/gif", ".ief" => "image/ief", ".jp2" => "image/jp2", ".jpg2" => "image/jp2", ".jpe" => "image/jpeg", ".jpeg" => "image/jpeg", ".jpg" => "image/jpeg", ".jpm" => "image/jpm", ".jpf" => "image/jpx", ".jpx" => "image/jpx", ".pcx" => "image/pcx", ".png" => "image/png", ".svg" => "image/svg+xml", ".svgz" => "image/svg+xml", ".tif" => "image/tiff", ".tiff" => "image/tiff", ".djv" => "image/vnd.djvu", ".djvu" => "image/vnd.djvu", ".ico" => "image/vnd.microsoft.icon", ".wbmp" => "image/vnd.wap.wbmp", ".cr2" => "image/x-canon-cr2", ".crw" => "image/x-canon-crw", ".ras" => "image/x-cmu-raster", ".cdr" => "image/x-coreldraw", ".pat" => "image/x-coreldrawpattern", ".cdt" => "image/x-coreldrawtemplate", ".erf" => "image/x-epson-erf", ".art" => "image/x-jg", ".jng" => "image/x-jng", ".bmp" => "image/x-ms-bmp", ".nef" => "image/x-nikon-nef", ".orf" => "image/x-olympus-orf", ".psd" => "image/x-photoshop", ".pnm" => "image/x-portable-anymap", ".pbm" => "image/x-portable-bitmap", ".pgm" => "image/x-portable-graymap", ".ppm" => "image/x-portable-pixmap", ".rgb" => "image/x-rgb", ".xbm" => "image/x-xbitmap", ".xpm" => "image/x-xpixmap", ".xwd" => "image/x-xwindowdump", ".eml" => "message/rfc822", ".iges" => "model/iges", ".igs" => "model/iges", ".mesh" => "model/mesh", ".msh" => "model/mesh", ".silo" => "model/mesh", ".vrml" => "model/vrml", ".wrl" => "model/vrml", ".x3db" => "model/x3d+binary", ".x3dv" => "model/x3d+vrml", ".x3d" => "model/x3d+xml", ".appcache" => "text/cache-manifest", ".ics" => "text/calendar", ".icz" => "text/calendar", ".css" => "text/css; charset=utf-8", ".csv" => "text/csv; charset=utf-8", ".323" => "text/h323", ".htm" => "text/html", ".html" => "text/html", ".shtml" => "text/html", ".uls" => "text/iuls", ".markdown" => "text/markdown; charset=utf-8", ".md" => "text/markdown; charset=utf-8", ".mml" => "text/mathml", ".asc" => "text/plain; charset=utf-8", ".brf" => "text/plain; charset=utf-8", ".conf" => "text/plain; charset=utf-8", ".log" => "text/plain; charset=utf-8", ".pot" => "text/plain; charset=utf-8", ".spec" => "text/plain; charset=utf-8", ".srt" => "text/plain; charset=utf-8", ".text" => "text/plain; charset=utf-8", ".txt" => "text/plain; charset=utf-8", ".rtx" => "text/richtext", ".sct" => "text/scriptlet", ".wsc" => "text/scriptlet", ".tsv" => "text/tab-separated-values", ".tm" => "text/texmacs", ".ttl" => "text/turtle", ".vcard" => "text/vcard", ".vcf" => "text/vcard", ".jad" => "text/vnd.sun.j2me.app-descriptor", ".wml" => "text/vnd.wap.wml", ".wmls" => "text/vnd.wap.wmlscript", ".bib" => "text/x-bibtex; charset=utf-8", ".boo" => "text/x-boo; charset=utf-8", ".h++" => "text/x-c++hdr; charset=utf-8", ".hh" => "text/x-c++hdr; charset=utf-8", ".hpp" => "text/x-c++hdr; charset=utf-8", ".hxx" => "text/x-c++hdr; charset=utf-8", ".c++" => "text/x-c++src; charset=utf-8", ".cc" => "text/x-c++src; charset=utf-8", ".cpp" => "text/x-c++src; charset=utf-8", ".cxx" => "text/x-c++src; charset=utf-8", ".h" => "text/x-chdr; charset=utf-8", ".htc" => "text/x-component", ".csh" => "text/x-csh; charset=utf-8", ".c" => "text/x-csrc; charset=utf-8", ".diff" => "text/x-diff; charset=utf-8", ".patch" => "text/x-diff; charset=utf-8", ".d" => "text/x-dsrc; charset=utf-8", ".hs" => "text/x-haskell; charset=utf-8", ".java" => "text/x-java; charset=utf-8", ".ly" => "text/x-lilypond; charset=utf-8", ".lhs" => "text/x-literate-haskell; charset=utf-8", ".moc" => "text/x-moc; charset=utf-8", ".p" => "text/x-pascal; charset=utf-8", ".pas" => "text/x-pascal; charset=utf-8", ".gcd" => "text/x-pcs-gcd", ".pl" => "text/x-perl; charset=utf-8", ".pm" => "text/x-perl; charset=utf-8", ".py" => "text/x-python; charset=utf-8", ".scala" => "text/x-scala; charset=utf-8", ".etx" => "text/x-setext", ".sfv" => "text/x-sfv", ".sh" => "text/x-sh; charset=utf-8", ".tcl" => "text/x-tcl; charset=utf-8", ".tk" => "text/x-tcl; charset=utf-8", ".cls" => "text/x-tex; charset=utf-8", ".ltx" => "text/x-tex; charset=utf-8", ".sty" => "text/x-tex; charset=utf-8", ".tex" => "text/x-tex; charset=utf-8", ".vcs" => "text/x-vcalendar", ".3gp" => "video/3gpp", ".ts" => "video/MP2T", ".axv" => "video/annodex", ".dl" => "video/dl", ".dif" => "video/dv", ".dv" => "video/dv", ".fli" => "video/fli", ".gl" => "video/gl", ".mp4" => "video/mp4", ".mpe" => "video/mpeg", ".mpeg" => "video/mpeg", ".mpg" => "video/mpeg", ".ogv" => "video/ogg", ".mov" => "video/quicktime", ".qt" => "video/quicktime", ".webm" => "video/webm", ".mxu" => "video/vnd.mpegurl", ".flv" => "video/x-flv", ".lsf" => "video/x-la-asf", ".lsx" => "video/x-la-asf", ".mkv" => "video/x-matroska", ".mpv" => "video/x-matroska", ".mng" => "video/x-mng", ".asf" => "video/x-ms-asf", ".asx" => "video/x-ms-asf", ".wm" => "video/x-ms-wm", ".wmv" => "video/x-ms-wmv", ".wmx" => "video/x-ms-wmx", ".wvx" => "video/x-ms-wvx", ".avi" => "video/x-msvideo", ".movie" => "video/x-sgi-movie", ".ice" => "x-conference/x-cooltalk", ".sisx" => "x-epoc/x-sisx-app", ".vrm" => "x-world/x-vrml", "README" => "text/plain; charset=utf-8", "Makefile" => "text/x-makefile; charset=utf-8", # enable caching for unknown mime types: "" => "application/octet-stream" ) libzypp-17.36.5/tests/data/lighttpdconf/lighttpd.conf000066400000000000000000000301351476576476200226460ustar00rootroot00000000000000var.root_path = env.ZYPP_TEST_SRVROOT var.log_root = root_path + "/log" var.state_dir = root_path + "/state" var.home_dir = root_path + "/home" var.conf_dir = env.ZYPP_TEST_SRVCONF var.ssl_dir = env.ZYPP_SSL_CONFDIR ## ## Cache for mod_compress ## ## used in: ## conf.d/compress.conf ## var.cache_dir = root_path + "/cache" ## ####################################################################### ####################################################################### ## ## Load the modules. server.modules = ( "mod_access", # "mod_alias", # "mod_auth", # "mod_authn_file", # "mod_evasive", # "mod_redirect", # "mod_rewrite", # "mod_setenv", # "mod_usertrack", ) include "conf.d/fastcgi.conf" ## ####################################################################### ####################################################################### ## ## Basic Configuration ## --------------------- ## server.port = env.ZYPP_TEST_PORT ## ## Use IPv6? ## server.use-ipv6 = "enable" ## ## bind to a specific IP ## server.bind = "127.0.0.1" ## ## Run as a different username/groupname. ## This requires root permissions during startup. ## #server.username = "lighttpd" #server.groupname = "lighttpd" ## ## enable core files. ## #server.core-files = "disable" ## ## Document root ## server.document-root = env.ZYPP_TEST_DOCROOT ## ## The value for the "Server:" response field. ## ## It would be nice to keep it at "lighttpd". ## #server.tag = "lighttpd" ## ## store a pid file ## server.pid-file = state_dir + "/lighttpd.pid" ## ####################################################################### ####################################################################### ## ## Logging Options ## ------------------ ## ## all logging options can be overwritten per vhost. ## ## Path to the error log file ## server.errorlog = log_root + "/error.log" ## ## If you want to log to syslog you have to unset the ## server.errorlog setting and uncomment the next line. ## #server.errorlog-use-syslog = "enable" ## ## Access log config ## include "conf.d/access_log.conf" ## ## The debug options are moved into their own file. ## see conf.d/debug.conf for various options for request debugging. ## #include "conf.d/debug.conf" ## ####################################################################### ####################################################################### ## ## Tuning/Performance ## -------------------- ## ## corresponding documentation: ## https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_Performance ## ## set the event-handler (read the performance section in the manual) ## ## possible options on linux are: ## ## select ## poll ## linux-sysepoll ## ## linux-sysepoll is recommended on kernel 2.6. ## server.event-handler = "linux-sysepoll" ## ## The basic network interface for all platforms at the syscalls read() ## and write(). Every modern OS provides its own syscall to help network ## servers transfer files as fast as possible ## ## sendfile - is recommended for small files. ## writev - is recommended for sending many large files ## server.network-backend = "sendfile" ## ## As lighttpd is a single-threaded server, its main resource limit is ## the number of file descriptors, which is set to 1024 by default (on ## most systems). ## ## If you are running a high-traffic site you might want to increase this ## limit by setting server.max-fds. ## ## Changing this setting requires root permissions on startup. see ## server.username/server.groupname. ## ## By default lighttpd would not change the operation system default. ## But setting it to 2048 is a better default for busy servers. ## server.max-fds = 2048 ## ## listen-backlog is the size of the listen() backlog queue requested when ## the lighttpd server ask the kernel to listen() on the provided network ## address. Clients attempting to connect() to the server enter the listen() ## backlog queue and wait for the lighttpd server to accept() the connection. ## ## The out-of-box default on many operating systems is 128 and is identified ## as SOMAXCONN. This can be tuned on many operating systems. (On Linux, ## cat /proc/sys/net/core/somaxconn) Requesting a size larger than operating ## system limit will be silently reduced to the limit by the operating system. ## ## When there are too many connection attempts waiting for the server to ## accept() new connections, the listen backlog queue fills and the kernel ## rejects additional connection attempts. This can be useful as an ## indication to an upstream load balancer that the server is busy, and ## possibly overloaded. In that case, configure a smaller limit for ## server.listen-backlog. On the other hand, configure a larger limit to be ## able to handle bursts of new connections, but only do so up to an amount ## that the server can keep up with responding in a reasonable amount of ## time. Otherwise, clients may abandon the connection attempts and the ## server will waste resources servicing abandoned connections. ## ## It is best to leave this setting at its default unless you have modelled ## your traffic and tested that changing this benefits your traffic patterns. ## ## Default: 1024 ## #server.listen-backlog = 128 ## ## Stat() call caching. ## ## lighttpd can utilize FAM/Gamin to cache stat call. ## ## possible values are: ## disable, simple or fam. ## #server.stat-cache-engine = "simple" ## ## Fine tuning for the request handling ## ## max-connections == max-fds/2 (maybe /3) ## means the other file handles are used for fastcgi/files ## server.max-connections = 1024 ## ## How many seconds to keep a keep-alive connection open, ## until we consider it idle. ## ## Default: 5 ## #server.max-keep-alive-idle = 5 ## ## How many keep-alive requests until closing the connection. ## ## Default: 16 ## #server.max-keep-alive-requests = 16 ## ## Maximum size of a request in kilobytes. ## By default it is unlimited (0). ## ## Uploads to your server cant be larger than this value. ## #server.max-request-size = 0 ## ## Time to read from a socket before we consider it idle. ## ## Default: 60 ## #server.max-read-idle = 60 ## ## Time to write to a socket before we consider it idle. ## ## Default: 360 ## #server.max-write-idle = 360 ## ## Traffic Shaping ## ----------------- ## ## see /usr/share/doc/lighttpd/traffic-shaping.txt ## ## Values are in kilobyte per second. ## ## Keep in mind that a limit below 32kB/s might actually limit the ## traffic to 32kB/s. This is caused by the size of the TCP send ## buffer. ## ## per server: ## #server.kbytes-per-second = 128 ## ## per connection: ## #connection.kbytes-per-second = 32 ## ####################################################################### ####################################################################### ## ## Filename/File handling ## ------------------------ ## ## files to check for if .../ is requested ## index-file.names = ( "index.php", "index.rb", "index.html", ## "index.htm", "default.htm" ) ## index-file.names += ( "index.xhtml", "index.html", "index.htm", "default.htm", "index.php" ) ## ## deny access the file-extensions ## ## ~ is for backupfiles from vi, emacs, joe, ... ## .inc is often used for code includes which should in general not be part ## of the document-root url.access-deny = ( "~", ".inc" ) ## ## disable range requests for pdf files ## workaround for a bug in the Acrobat Reader plugin. ## $HTTP["url"] =~ "\.pdf$" { server.range-requests = "disable" } ## ## url handling modules (rewrite, redirect) ## #url.rewrite = ( "^/$" => "/server-status" ) #url.redirect = ( "^/wishlist/(.+)" => "http://www.example.com/$1" ) ## ## both rewrite/redirect support back reference to regex conditional using %n ## #$HTTP["host"] =~ "^www\.(.*)" { # url.redirect = ( "^/(.*)" => "http://%1/$1" ) #} ## ## which extensions should not be handle via static-file transfer ## ## .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi ## static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" ) ## ## error-handler for all status 400-599 ## #server.error-handler = "/error-handler.html" #server.error-handler = "/error-handler.php" ## ## error-handler for status 404 ## #server.error-handler-404 = "/error-handler.html" #server.error-handler-404 = "/error-handler.php" ## ## Format: .html ## -> ..../status-404.html for 'File not found' ## #server.errorfile-prefix = "/srv/www/htdocs/errors/status-" ## ## mimetype mapping ## include "conf.d/mime.conf" ## ## directory listing configuration ## include "conf.d/dirlisting.conf" ## ## Should lighttpd follow symlinks? ## server.follow-symlink = "enable" ## ## force all filenames to be lowercase? ## #server.force-lowercase-filenames = "disable" ## ## defaults to /var/tmp as we assume it is a local harddisk ## server.upload-dirs = ( root_path+"/upload" ) ## ####################################################################### ####################################################################### ## ## SSL Support ## ------------- ## ## To enable SSL for the whole server you have to provide a valid ## certificate and have to enable the SSL engine.:: ## ## ssl.engine = "enable" ## ssl.pemfile = "/path/to/server.pem" ## ## The HTTPS protocol does not allow you to use name-based virtual ## hosting with SSL. If you want to run multiple SSL servers with ## one lighttpd instance you must use IP-based virtual hosting: :: ## ## Mitigate CVE-2009-3555 by disabling client triggered renegotation ## This is enabled by default. ## ## IMPORTANT: this setting can only be used in the global scope. ## It does *not* work inside conditionals ## # ssl.disable-client-renegotiation = "enable" ## ## $SERVER["socket"] == "10.0.0.1:443" { ## ssl.engine = "enable" ## ssl.pemfile = "/etc/ssl/private/www.example.com.pem" ## # ## # (Following SSL/TLS Deployment Best Practices 1.3 / 17 September 2013 from: ## # https://www.ssllabs.com/projects/best-practices/index.html) ## # - BEAST is considered mitigaed on client side now, and new weaknesses have been found in RC4, ## # so it is strongly advised to disable RC4 ciphers (HIGH doesn't include RC4) ## # - It is recommended to disable 3DES too (although disabling RC4 and 3DES breaks IE6+8 on Windows XP, ## # so you might want to support 3DES for now - just remove the '!3DES' parts below). ## # - The examples below prefer ciphersuites with "Forward Secrecy" (and ECDHE over DHE (alias EDH)), remove '+kEDH +kRSA' ## # if you don't want that. ## # - SRP and PSK are not supported anyway, excluding those ('!kSRP !kPSK') just keeps the list smaller (easier to review) ## # Check your cipher list with: openssl ciphers -v '...' (use single quotes as your shell won't like ! in double quotes) ## # ## # If you know you have RSA keys (standard), you can use: ## ssl.cipher-list = "aRSA+HIGH !3DES +kEDH +kRSA !kSRP !kPSK" ## # The more generic version (without the restriction to RSA keys) is ## # ssl.cipher-list = "HIGH !aNULL !3DES +kEDH +kRSA !kSRP !kPSK" ## # ## # Make the server prefer the order of the server side cipher suite instead of the client suite. ## # This option is enabled by default, but only used if ssl.cipher-list is set. ## # ## # ssl.honor-cipher-order = "enable" ## # ## server.name = "www.example.com" ## ## server.document-root = "/srv/www/vhosts/example.com/www/" ## } ## include_shell "/usr/bin/sh "+ conf_dir + "/conf.d/maybessl.sh" #ssl.engine = "enable" #ssl.pemfile = conf_dir + "/ssl/server.pem" ## If you have a .crt and a .key file, cat them together into a ## single PEM file: ## $ cat /etc/ssl/private/lighttpd.key /etc/ssl/certs/lighttpd.crt \ ## > /etc/ssl/private/lighttpd.pem ## #ssl.pemfile = "/etc/ssl/private/lighttpd.pem" ## ## optionally pass the CA certificate here. ## ## #ssl.ca-file = "" ## ## and the CRL revocation list here. ## ## #ssl.ca-crl-file = "" ## ####################################################################### libzypp-17.36.5/tests/data/nginxconf/000077500000000000000000000000001476576476200174625ustar00rootroot00000000000000libzypp-17.36.5/tests/data/nginxconf/mime.types000066400000000000000000000120621476576476200215000ustar00rootroot00000000000000 types { text/html html htm shtml; text/css css; text/xml xml; image/gif gif; image/jpeg jpeg jpg; application/javascript js; application/atom+xml atom; application/rss+xml rss; text/mathml mml; text/plain txt; text/vnd.sun.j2me.app-descriptor jad; text/vnd.wap.wml wml; text/x-component htc; image/png png; image/svg+xml svg svgz; image/tiff tif tiff; image/vnd.wap.wbmp wbmp; image/webp webp; image/x-icon ico; image/x-jng jng; image/x-ms-bmp bmp; application/font-woff woff; application/java-archive jar war ear; application/json json; application/mac-binhex40 hqx; application/msword doc; application/pdf pdf; application/postscript ps eps ai; application/rtf rtf; application/vnd.apple.mpegurl m3u8; application/vnd.google-earth.kml+xml kml; application/vnd.google-earth.kmz kmz; application/vnd.ms-excel xls; application/vnd.ms-fontobject eot; application/vnd.ms-powerpoint ppt; application/vnd.oasis.opendocument.graphics odg; application/vnd.oasis.opendocument.presentation odp; application/vnd.oasis.opendocument.spreadsheet ods; application/vnd.oasis.opendocument.text odt; application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; application/vnd.wap.wmlc wmlc; application/x-7z-compressed 7z; application/x-cocoa cco; application/x-java-archive-diff jardiff; application/x-java-jnlp-file jnlp; application/x-makeself run; application/x-perl pl pm; application/x-pilot prc pdb; application/x-rar-compressed rar; application/x-redhat-package-manager rpm; application/x-sea sea; application/x-shockwave-flash swf; application/x-stuffit sit; application/x-tcl tcl tk; application/x-x509-ca-cert der pem crt; application/x-xpinstall xpi; application/xhtml+xml xhtml; application/xspf+xml xspf; application/zip zip; application/octet-stream bin exe dll; application/octet-stream deb; application/octet-stream dmg; application/octet-stream iso img; application/octet-stream msi msp msm; audio/midi mid midi kar; audio/mpeg mp3; audio/ogg ogg; audio/x-m4a m4a; audio/x-realaudio ra; video/3gpp 3gpp 3gp; video/mp2t ts; video/mp4 mp4; video/mpeg mpeg mpg; video/quicktime mov; video/webm webm; video/x-flv flv; video/x-m4v m4v; video/x-mng mng; video/x-ms-asf asx asf; video/x-ms-wmv wmv; video/x-msvideo avi; } libzypp-17.36.5/tests/data/nginxconf/nginx.conf000066400000000000000000000056471476576476200214700ustar00rootroot00000000000000daemon off; worker_processes 1; error_log log/error.log; pid server.pid; include user.conf; events { worker_connections 1024; use epoll; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; client_body_temp_path temp 1 2; proxy_temp_path temp 1 2; fastcgi_temp_path temp 1 2; uwsgi_temp_path temp 1 2; scgi_temp_path temp 1 2; access_log log/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; max_ranges 128; server { include port.conf; server_name localhost; include ssl.conf; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { include srvroot.conf; index index.html index.htm; } location /handler { fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REQUEST_SCHEME $scheme; fastcgi_param HTTPS $https if_not_empty; fastcgi_param HTTP_AUTHORIZATION $http_authorization; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_intercept_errors off; fastcgi_pass_header "Status"; fastcgi_pass_header "Status-Code"; include fcgisock.conf; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /srv/www/htdocs/; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } } libzypp-17.36.5/tests/data/nginxconf/nossl.conf000066400000000000000000000000001476576476200214550ustar00rootroot00000000000000libzypp-17.36.5/tests/data/nginxconf/ssl.conf000066400000000000000000000000761476576476200211350ustar00rootroot00000000000000ssl_certificate cert.pem; ssl_certificate_key cert.key; libzypp-17.36.5/tests/data/obs_virtualbox_11_1/000077500000000000000000000000001476576476200212545ustar00rootroot00000000000000libzypp-17.36.5/tests/data/obs_virtualbox_11_1/repodata/000077500000000000000000000000001476576476200230535ustar00rootroot00000000000000libzypp-17.36.5/tests/data/obs_virtualbox_11_1/repodata/primary.xml.gz000066400000000000000000000424121476576476200257020ustar00rootroot00000000000000/bs/repos/Virtualization:/VirtualBox/openSUSE_Factory/.repodata/primary.xml}[w8WI#6''ӝtgӽ@K6I9<~ $KHQr"ϚM nB \u6zIlG}|ݒﳣ{.V:_.|n?ֶKvvx<.ul^/?*K3>eųa&ɕvP@K}n'݅ Z<;ȯP}s`⟏֩xa|\h(7Hſp= ۸M?F.GG~6\f]م\wϫG(k'GT<ұ1RZ!$STq˘?kz3.xsr|H M˲$x|g2v94vè&ς/,re0U\yam]>a|4I59 gܢ^=Ag9<7}csApa\phR ެo7=W \]aWD?M .R둟b f'姳oj'$?{û0];E+׷I,_gOKTY~T(~&S<\??~C? '䧟ʢS@]$Y T Sg0R[>@֥4/!^DK? eIXYWX _Ћ:_ؿC(WhOva']*ۉD۷ٻɫ߽ZMo|5C%mͻ/O>6}l ^~W>޸mISz AOj5$A2Cí+z!O&~3^L<;fqOׯ㟏G::_|;ĆR:6MqBCt$3M qp6 4U'I:A\Q]N~ tb' Jt"R0 .hxa6vkvإ0A6ZcLyz{4~*f i?+]D_R ah0cp2GqXaU5#LRmReIj6<>@5&m}jϽ(oYh ܌ƀiükx[kq-?7451J;eZgюii8D",ThC]e"vՊ`K9hGo~I8W4Р0 *I͂h1(\nr~UoȁsXugI\ҒNG; 7 \'ãWq/@P`pXmӒ(I 8Ơx׸,D#f"R_Pb_.`qƆ # 伯5Sha}3J.I؁!r'ߝn7A{_kK\5dP_A}nY_/aNk ux_xѿKۼ29D1<4YeBwְc@O m\C63 9:gc\!TLhljZM-~}%Yna~`JȮ) p^ fdo)D:<6 %r)8rQu7 iJ&3R+Ǡ?MY5C/bt! ,ɣez~TF~ { N}Q|gHTX罁o =W׃ߔ;8)hQ((@ñ&:b_)T@/{L`!0y+M)Sџ^7D~:*9ܵ-]var*oI5dwP٩QiqtND(P, 0`3:WURr7F)ݖUla'wgȑxJbJ%׋S?/N->2|HSA@:_mGVU*̗5l{VfseE/ņ][|$QBrjT;LHx>+.Ke+PsTmPCiK(VKS(2ғ }ǭ-nAbha6C@[ᠹl`[wܙs\GI/;O7eI巊c*PXd * 7[oz';yĉ }ݷ)ik6 e:,HT lC6@ab+mx 1SG)p1kK9l73[;<!Zg$*d6,Af RXR5&H1XI #g,E?/O&HUwY?=we0y{YoFP+45g0Ds<ϓKvqg#k{chطa! Rd%($qgzs&%܇o* +nK41!KT6Еj`:AXjU۩r@p,؍ZD("C).\jA5v?BDҞ@RO!,o:OdHoN~1,|+&[aS8_<&OAu^pϿ͒% ˖R0TlL'goϞ<-ܪ洓i'z%te{_zR<#D,xO,f[2}Y̙B%|)\h3`1*=!SYivV2nhZrySu;W<`jh\{s0zέa m m-u +pY cJE ILP5bCf?r#y1UEr}za'>%; wBV.XIɎ}l{SM6ħCumoNDeETٙ4nGMҔW/ԷVB+ԻB E:Z$b]0eĢ9K$wԁ|o: ށEf|:mǴCYS8 &VL# Y!rhճv3ste>m ncF<؂53Sِe&rNe1%t89lސlz -sQ&:%>l >''/zp5Ǡ`7!gwL#PPQȝőұ)."`8&ޗ^}n|r,K\s 4D5>Æq'#MU_TZ{'o= km镠1pv+~swC؞eM~]- 1޻&㐚Ph*qcc3HJ n#"Xh'ϕ|oUUL 3D5W Ij5rBn)|Hfؾ(m{d_^@{{oǥݭ>B8MROd"&8qDePf 3O?]-E |I7 Nt uJWuS&m[=Ջot N,ӁKy;xOu-pCl^95 soްx}sf8&s7;w%3Iwo5ƨb)w5%X;}ti {RN%:]dL§U8ӗ.J|]DBm]l!ʃ",1F!H i!M B!e #k^5A?@q4koAˬ<>e)'g :NWA.Uj&MbccfVfv6DώZkxw't;&"m~V<3t)||ڶ.L||'=4 Z婃ye6 juzr=miACN.'l$^_Qs䧿v?0/yOq>P_Iyu3WE0aV,aԚj[^z?ްo3W:mG+sh_),|#|WGYan |d6,\bߦC:9 "4KTd DM-/x q)'K8QUO7ɷD+_Uҕ"k0;o?" )i^2efã2b 7>3&.W3V>HP}}5uF.5-Q^neMz'C~KWuGDm~B?w,#~sԴ+X]8ݻc'!1 buXab8#Spf + KL6*Ռy߻HIH3 ,yu>ngt9f#Q[G!HYbjpV.־L+ww@ba 1OE0pi1}Slf١ɏ.@1y<<  xCT ^w'"S|9Ng ,>plBiol;{])o>}M/@N?Nc6͛5SG ;\2E%c1 \ҁm]\qV>?jiIӈH–-0.; ?YoimU@W;lg7oҦ&l.o V7/YsTTo &iݔ* ;dXfݼiӶ >'xw0$zDV`}׍b#ɵloՂJ͖tS~o;45Ka/P 7 Wzλ^aXP`(Nfgd2BA ڵ+k@񕅑kMAuHWhSg UܜPOt9;y_H]~Q6yu/}S_2{Ttvw]CBZi6jVl}>uxw{X.q7yvZwG9ILs ]ZqN#J,6"VGpƝQ8K̉EQS[jC5QJRucLt0 ZަV DLuXZfYqVI̮{}4'uLEDaQHh|6=ٟܩ-NcEmCAψ& ^@u&.9oL_m]\0W5\[OdQCp B 5|{:+a*k?izU{zR[e*v!$MCwmN!UޅdJB:kXNi &( *J|" ś}!\;ъ6Jӓ55FPjPU+׿[$Qe/oOW ɋׯy;Si{\UPjҘDGQ-Xp;$+wyՍY>BQa79O4NahBe) )UE584(<Ox:gNLH@="r%^M_Ky~@ӫ)Dq U/:@W?&j!cb"ZK'{$vMֹИIg]IK HX";5?$e'Hp@$>Έ: 9U {yC3xuo?M7wF#ј b6;j28GX.3"K-#"qkrr:Zņ^1.Uwj~jޘRc 伨@|~]h8/A#yL(8j k;?4 _-MK[` H3*Q!2 A#)Pܒ0>a{0+{TPONUU

libzypp-17.36.5/tests/parser/RepoFileReader_test.cc000066400000000000000000000032071476576476200222540ustar00rootroot00000000000000#include #include #include #include #include "TestSetup.h" using std::stringstream; using std::string; using namespace zypp; static std::string suse_repo = "[factory-oss]\n" "name=factory-oss $releasever - $basearch\n" "failovermethod=priority\n" "enabled=1\n" "gpgcheck=1\n" "autorefresh=0\n" "baseurl=http://serv.er/loc1\n" "baseurl=http://serv.er/loc2\n" " http://serv.er/loc3 , http://serv.er/loc4 http://serv.er/loc5\n" "gpgkey=http://serv.er/loc1\n" "gpgkey=http://serv.er/loc2\n" " http://serv.er/loc3 , http://serv.er/loc4 http://serv.er/loc5\n" "mirrorlist=http://serv.er/loc1\n" "mirrorlist=http://serv.er/loc2\n" " http://serv.er/loc3 , http://serv.er/loc4 http://serv.er/loc5\n" "type=NONE\n" "keeppackages=0\n"; struct RepoCollector : private base::NonCopyable { bool collect( const RepoInfo &repo ) { repos.push_back(repo); return true; } RepoInfoList repos; }; // Must be the first test! BOOST_AUTO_TEST_CASE(read_repo_file) { { std::stringstream input(suse_repo); RepoCollector collector; parser::RepoFileReader parser( input, bind( &RepoCollector::collect, &collector, _1 ) ); BOOST_CHECK_EQUAL(1, collector.repos.size()); const RepoInfo & repo( collector.repos.front() ); BOOST_CHECK_EQUAL( 5, repo.baseUrlsSize() ); BOOST_CHECK_EQUAL( 5, repo.gpgKeyUrlsSize() ); BOOST_CHECK_EQUAL( Url("http://serv.er/loc1"), repo.url() ); BOOST_CHECK_EQUAL( Url("http://serv.er/loc1"), repo.gpgKeyUrl() ); BOOST_CHECK_EQUAL( Url("http://serv.er/loc1"), repo.mirrorListUrl() ); } } libzypp-17.36.5/tests/parser/RepoindexFileReader_test.cc000066400000000000000000000042541476576476200233070ustar00rootroot00000000000000#include #include #include #include #include #include "TestSetup.h" using std::stringstream; using std::string; using namespace zypp; static string service = "" "" "" "" ""; struct RepoCollector : private base::NonCopyable { bool collect( const RepoInfo &repo ) { repos.push_back(repo); return true; } RepoInfoList repos; }; // Must be the first test! BOOST_AUTO_TEST_CASE(read_index_file) { { stringstream input(service); RepoCollector collector; parser::RepoindexFileReader parser( input, bind( &RepoCollector::collect, &collector, _1 ) ); BOOST_REQUIRE_EQUAL(3, collector.repos.size()); RepoInfo repo; repo = collector.repos.front(); BOOST_CHECK_EQUAL("Company's Foo", repo.name()); BOOST_CHECK_EQUAL("company-foo", repo.alias()); BOOST_CHECK_EQUAL("sle-11-i386", repo.targetDistribution()); BOOST_CHECK_EQUAL(20, repo.priority()); // "Repository is per default disabled" BOOST_CHECK(!repo.enabled()); // "Repository autorefresh is per default enabled" BOOST_CHECK(repo.autorefresh()); BOOST_CHECK_EQUAL("/repo/products/foo", repo.path()); collector.repos.pop_front( ); repo = collector.repos.front(); BOOST_CHECK_EQUAL("company-bar", repo.alias()); BOOST_CHECK_EQUAL("sle-11-i386", repo.targetDistribution()); // "Priority should be 99 when not explictly defined" BOOST_CHECK_EQUAL(99, repo.priority()); // "Repository is explicitly enabled" BOOST_CHECK(repo.enabled()); // "Repository autorefresh is explicitly disabled" BOOST_CHECK(!repo.autorefresh()); } } libzypp-17.36.5/tests/parser/inifile/000077500000000000000000000000001476576476200174735ustar00rootroot00000000000000libzypp-17.36.5/tests/parser/inifile/CMakeLists.txt000066400000000000000000000000351476576476200222310ustar00rootroot00000000000000 ADD_TESTS(inidict iniparser)libzypp-17.36.5/tests/parser/inifile/data/000077500000000000000000000000001476576476200204045ustar00rootroot00000000000000libzypp-17.36.5/tests/parser/inifile/data/1.ini000066400000000000000000000036121476576476200212470ustar00rootroot00000000000000[base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 protect=1 #released updates [update] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 protect=1 #packages used/produced in the build but not released [addons] name=CentOS-$releasever - Addons mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons baseurl=http://mirror.centos.org/centos/$releasever/addons/$basearch/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 protect=0 #additional packages that may be useful [extras] name=CentOS-$releasever - Extras mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 protect=0 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever - Plus mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 protect=0 #contrib - packages by Centos Users [contrib] name=CentOS-$releasever - Contrib mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4 protect=0libzypp-17.36.5/tests/parser/inifile/data/2.ini000066400000000000000000000001651476576476200212500ustar00rootroot00000000000000[base] name=foo name= foo name =foo name = foo [equal] name1==foo name1= =foo name2=f=oo name3=foo= [te]st] name=foo libzypp-17.36.5/tests/parser/inifile/inidict_test.cc000066400000000000000000000030151476576476200224630ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include using std::cout; using std::endl; using std::string; using std::map; using namespace zypp; using namespace zypp::parser; using namespace boost::unit_test; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/parser/inifile/data") BOOST_AUTO_TEST_CASE(ini_read) { InputStream is((DATADIR+"/1.ini")); IniDict dict(is); //MIL << dict["homedmacvicar"]["type"] << endl; for ( IniDict::section_const_iterator it = dict.sectionsBegin(); it != dict.sectionsEnd(); ++it ) { MIL << (*it) << endl; for ( IniDict::entry_const_iterator it2 = dict.entriesBegin(*it); it2 != dict.entriesEnd(*it); ++it2 ) { MIL << " - " << (*it2).first << " | " << (*it2).second << endl; } } BOOST_CHECK( dict.hasSection("addons") ); BOOST_CHECK( !dict.hasSection("uhlala") ); BOOST_CHECK( dict.hasEntry("contrib", "name") ); BOOST_CHECK( !dict.hasEntry("foo", "bar") ); } BOOST_AUTO_TEST_CASE(ini_read2) { InputStream is((DATADIR+"/2.ini")); IniDict dict(is); BOOST_CHECK( find( dict.sectionsBegin(), dict.sectionsEnd(), "base" ) != dict.sectionsEnd() ); //IniDict::entry_const_iterator i = find( dict.entriesBegin("base"), dict.entriesEnd("base"), "name"); //BOOST_CHECK( i != dict.entriesEnd("base") ); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/parser/inifile/iniparser_test.cc000066400000000000000000000041661476576476200230440ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include using std::cout; using std::endl; using std::string; using namespace zypp; using namespace zypp::parser; using namespace boost::unit_test; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/parser/inifile/data") class IniTest : public IniParser { virtual void consume( const std::string §ion ) { MIL << section << endl; } virtual void consume( const std::string §ion, const std::string &key, const std::string &value ) { MIL << "'" << section << "'" << " | " << "'" << key << "'" << " | " << "'" << value << "'" << endl; if (section == "base" && key == "gpgcheck") BOOST_CHECK_EQUAL(value, "1"); } }; class WithSpacesTest : public IniParser { virtual void consume( const std::string §ion ) { MIL << section << endl; BOOST_CHECK(section == "base" || section == "equal" || section == "te]st"); } virtual void consume( const std::string §ion, const std::string &key, const std::string &value ) { MIL << "'" << section << "'" << " | " << "'" << key << "'" << " | " << "'" << value << "'" << endl; if ( section == "base") { if ( key == "name" ) BOOST_CHECK_EQUAL( value, "foo" ); } else if ( section == "equal" ) { if ( key == "name1" ) BOOST_CHECK_EQUAL( value, "=foo" ); else if ( key == "name2" ) BOOST_CHECK_EQUAL( value, "f=oo" ); else if ( key == "name3" ) BOOST_CHECK_EQUAL( value, "foo=" ); else { cout << "'" << section << "'" << " | " << "'" << key << "'" << " | " << "'" << value << "'" << endl; BOOST_CHECK_MESSAGE( false, "Unhandled key" ); } } } }; BOOST_AUTO_TEST_CASE(ini_read) { InputStream is((DATADIR+"/1.ini")); IniTest parser; parser.parse(is); } BOOST_AUTO_TEST_CASE(ini_spaces_test) { InputStream is((DATADIR+"/2.ini")); WithSpacesTest parser; parser.parse(is); } libzypp-17.36.5/tests/parser/yum/000077500000000000000000000000001476576476200166665ustar00rootroot00000000000000libzypp-17.36.5/tests/parser/yum/CMakeLists.txt000066400000000000000000000000341476576476200214230ustar00rootroot00000000000000ADD_TESTS(RepomdFileReader) libzypp-17.36.5/tests/parser/yum/RepomdFileReader_test.cc000066400000000000000000000055621476576476200234150ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using std::cout; using std::endl; using namespace zypp; using namespace boost::unit_test; using namespace zypp::parser::yum; #define DATADIR (Pathname(TESTS_SRC_DIR) + "parser/yum/data") class Collector { public: Collector() {} bool operator()( OnMediaLocation &&loc, const std::string &t ) { items.push_back( make_pair( t, std::move(loc) ) ); return true; } std::vector > items; }; BOOST_AUTO_TEST_CASE(repomd_read) { std::list entries; if ( filesystem::readdir( entries, DATADIR, false ) != 0 ) ZYPP_THROW(Exception("failed to read directory")); for ( std::list::const_iterator it = entries.begin(); it != entries.end(); ++it ) { Pathname file = *it; if ( ( file.basename().substr(0, 6) == "repomd" ) && (file.extension() == ".xml" ) ) { cout << *it << endl; Collector collect; RepomdFileReader r( file, std::ref(collect) ); if ( file.basename() == "repomd-1.xml" ) { BOOST_CHECK_EQUAL( r.keywords().size(), 7 ); auto keyhints = r.keyhints(); BOOST_CHECK_EQUAL( keyhints.size(), 5 ); std::map check = { { "gpg-pubkey-39db7c82-5847eb1f.asc", "FEAB502539D846DB2C0961CA70AF9E8139DB7C82" }, { "gpg-pubkey-307e3d54-5aaa90a5.asc", "4E98E67519D98DC7362A" }, { "gpg-pubkey-65176565-59787af5.asc", "637B32FF" }, { "gpg-pubkey-3dbdc284-is OK", "3dbdc284" }, { "gpg-pubkey-feab502539d846db2c0961ca70af9e8139db7c82-is OK as well", "feab502539d846db2c0961ca70af9e8139db7c82" }, { "gpg-pubkey-536X4dd4-X is not a hexdigit", "must not occur" }, }; for ( const auto & hint : keyhints ) { BOOST_CHECK_EQUAL( check[hint.first], hint.second ); } } std::ifstream ifs( file.extend(".solution").asString().c_str() ); unsigned int count = 0; while ( ifs && !ifs.eof() ) { std::string dtype; getline(ifs, dtype); if ( dtype.empty() ) break; BOOST_REQUIRE( count < collect.items.size() ); BOOST_CHECK_EQUAL( collect.items[count].first, dtype ); std::string checksum_type; std::string checksum; getline(ifs, checksum_type); getline(ifs, checksum); BOOST_CHECK_EQUAL( collect.items[count].second.checksum(), CheckSum(checksum_type, checksum) ); std::string loc; getline(ifs, loc); BOOST_CHECK_EQUAL( collect.items[count].second.filename(), Pathname(loc) ); count++; } BOOST_CHECK_EQUAL( collect.items.size(), count ); } } } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/parser/yum/data/000077500000000000000000000000001476576476200175775ustar00rootroot00000000000000libzypp-17.36.5/tests/parser/yum/data/repomd-1.xml000066400000000000000000000036031476576476200217470ustar00rootroot00000000000000 1620840613 pool gpg-pubkey-39db7c82-5847eb1f.asc?fpr=FEAB502539D846DB2C0961CA70AF9E8139DB7C82 gpg-pubkey-307e3d54-5aaa90a5.asc?fpr=4E98E67519D98DC7362A gpg-pubkey-65176565-59787af5.asc?fpr=637B32FF gpg-pubkey-3dbdc284-is OK gpg-pubkey-feab502539d846db2c0961ca70af9e8139db7c82-is OK as well gpg-pubkey-536X4dd4-X is not a hexdigit obsproduct://build.opensuse.org/openSUSE:Leap:15.3/Leap/15.3/x86_64 openSUSE Leap 15.3 63d86413540fbb2647e5b5de556d4e4b53f032d9 1176225512 63d86413540fbb2647e5b5de556d4e4b53f032d9 f76cb1f9f1963edc614848944b99e2664eba4b4a 1176225558 f9cf4f4520ebe75e4bd66c1572521b414dfea564 fd1ea55f143820333b702cda4f97b286daf65171 1176225549 3bfb8413a4698b86f632bb914f6dc8a4e3ac9660 689fecabbb0907f51f5bb7211048e091c6f2bc84 1176225550 ce38366eaded03cb8b3fdc64bb31ea5304e9901c libzypp-17.36.5/tests/parser/yum/data/repomd-1.xml.solution000066400000000000000000000004661476576476200236260ustar00rootroot00000000000000patches sha1 63d86413540fbb2647e5b5de556d4e4b53f032d9 repodata/patches.xml other sha1 f76cb1f9f1963edc614848944b99e2664eba4b4a repodata/other.xml.gz primary sha1 fd1ea55f143820333b702cda4f97b286daf65171 repodata/primary.xml.gz filelists sha1 689fecabbb0907f51f5bb7211048e091c6f2bc84 repodata/filelists.xml.gz libzypp-17.36.5/tests/repo/000077500000000000000000000000001476576476200155255ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/CMakeLists.txt000066400000000000000000000005011476576476200202610ustar00rootroot00000000000000ADD_SUBDIRECTORY( yum ) ADD_SUBDIRECTORY( susetags ) # to find the KeyRingTest receiver INCLUDE_DIRECTORIES( ${LIBZYPP_SOURCE_DIR}/tests/zypp ) ADD_TESTS( DUdata ExtendedMetadata PluginServices RepoLicense RepoSigcheck RepoVariables ) IF( NOT DISABLE_MEDIABACKEND_TESTS ) ADD_TESTS( MirrorList ) ENDIF() libzypp-17.36.5/tests/repo/DUdata_test.cc000066400000000000000000000100171476576476200202340ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include "KeyRingTestReceiver.h" #include "TestSetup.h" using boost::unit_test::test_case; using namespace zypp; using namespace zypp::repo; using namespace zypp::filesystem; #define TEST_DIR TESTS_SRC_DIR "/repo/susetags/data/dudata" PoolItem piFind( const std::string & name_r, const std::string & ver_r, bool installed_r = false ) { PoolQuery q; q.addDependency( sat::SolvAttr::name, name_r, Rel::EQ, Edition(ver_r) ); q.setStatusFilterFlags( installed_r ? PoolQuery::INSTALLED_ONLY : PoolQuery::UNINSTALLED_ONLY ); if ( q.size() != 1 ) ZYPP_THROW(Exception(q.size()?"Ambiguous!":"Missing!")); return PoolItem( *q.begin() ); } typedef std::pair ByteSet; namespace std { inline std::ostream & operator<<( std::ostream & str, const ByteSet & obj ) { return str << "<" << obj.first << "," << obj.second << ">"; } } inline ByteSet mkByteSet( const DiskUsageCounter::MountPointSet & mps_r ) { return ByteSet( mps_r.begin()->commitDiff(), (++mps_r.begin())->commitDiff() ); } inline ByteSet mkByteSet( int grow_r , int norm_r ) { return ByteSet( ByteCount( grow_r, ByteCount::K ), ByteCount( norm_r, ByteCount::K ) ); } inline ByteSet getSize( const DiskUsageCounter & duc_r, const PoolItem & pi_r ) { return mkByteSet( duc_r.disk_usage( pi_r ) ); } inline ByteSet getSize( const DiskUsageCounter & duc_r, const ResPool & pool_r ) { return mkByteSet( duc_r.disk_usage( pool_r ) ); } inline void XLOG( const DiskUsageCounter & duc_r, const ResPool & pool_r ) { for( const auto & pi : pool_r ) { USR << pi << endl; } WAR << duc_r.disk_usage( pool_r ) << endl; } BOOST_AUTO_TEST_CASE(dudata) { //KeyRingTestReceiver rec; // rec.answerAcceptUnknownKey(true); //rec.answerAcceptUnsignedFile(true); // rec.answerImportKey(true); Pathname repodir( TEST_DIR ); TestSetup test( Arch_x86_64 ); test.loadTargetRepo( repodir/"system" ); test.loadRepo( repodir/"repo", "repo" ); ResPool pool( ResPool::instance() ); PoolItem ins( piFind( "dutest", "1.0", true ) ); PoolItem up1( piFind( "dutest", "1.0" ) ); PoolItem up2( piFind( "dutest", "2.0" ) ); PoolItem up3( piFind( "dutest", "3.0" ) ); DiskUsageCounter duc( { DiskUsageCounter::MountPoint( "/grow", DiskUsageCounter::MountPoint::Hint_growonly ), DiskUsageCounter::MountPoint( "/norm" ) } ); //XLOG( duc, pool ); BOOST_CHECK_EQUAL( getSize( duc, ins ), mkByteSet( 5, 5 ) ); BOOST_CHECK_EQUAL( getSize( duc, up1 ), mkByteSet( 15, 15 ) ); BOOST_CHECK_EQUAL( getSize( duc, up2 ), mkByteSet( 45, 45 ) ); BOOST_CHECK_EQUAL( getSize( duc, up3 ), mkByteSet( 0, 0 ) ); // delete installed size 5 g n ins.status().setTransact( true, ResStatus::USER ); BOOST_CHECK_EQUAL( getSize( duc, pool ), mkByteSet( 0, -5 ) ); ins.status().setTransact( false, ResStatus::USER ); // install known DU size 15 g n up1.status().setTransact( true, ResStatus::USER ); BOOST_CHECK_EQUAL( getSize( duc, pool ), mkByteSet( 15, 15 ) ); // (multi)install (old stays) ins.status().setTransact( true, ResStatus::USER ); BOOST_CHECK_EQUAL( getSize( duc, pool ), mkByteSet( 15, 10 ) ); // update (old goes) ins.status().setTransact( false, ResStatus::USER ); up1.status().setTransact( false, ResStatus::USER ); // install unknown DU size 0/installed g n up3.status().setTransact( true, ResStatus::USER ); BOOST_CHECK_EQUAL( getSize( duc, pool ), mkByteSet( 5, 0 ) ); // (multi)install (n could be 5 too, but satsolver does not know about multinstall) ins.status().setTransact( true, ResStatus::USER ); BOOST_CHECK_EQUAL( getSize( duc, pool ), mkByteSet( 5, 0 ) ); // update (old goes) ins.status().setTransact( false, ResStatus::USER ); up3.status().setTransact( false, ResStatus::USER ); } libzypp-17.36.5/tests/repo/ExtendedMetadata_test.cc000066400000000000000000000204601476576476200222760ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include "KeyRingTestReceiver.h" #include "TestSetup.h" using boost::unit_test::test_case; using namespace zypp; using namespace zypp::repo; using namespace zypp::filesystem; #define TEST_DIR TESTS_SRC_DIR "/repo/yum/data/extensions" BOOST_AUTO_TEST_CASE(extended_metadata) { KeyRingTestReceiver rec; //rec.answerAcceptUnknownKey(true); rec.answerAcceptUnsignedFile(true); // rec.answerImportKey(true); Pathname repodir(TEST_DIR ); sat::Pool pool(sat::Pool::instance()); TestSetup test( Arch_x86_64 ); test.loadRepo(repodir.absolutename().asDirUrl(), "updates"); Repository repo = pool.reposFind("updates"); BOOST_CHECK_EQUAL( repo.generatedTimestamp(), Date(1227279057) ); BOOST_CHECK_EQUAL( repo.suggestedExpirationTimestamp(), Date(1227279057 + 3600) ); // check that the attributes of product compatibility are ok int count = 0; std::vector cpeids; std::vector labels; for_( it, repo.compatibleWithProductBegin(), repo.compatibleWithProductEnd() ) { cpeids.push_back(it.cpeId()); labels.push_back(it.label()); count++; } // there were 2 compatible products BOOST_CHECK_EQUAL( count, 2 ); BOOST_CHECK_EQUAL( cpeids[0], "cpe:/o:opensuse" ); BOOST_CHECK_EQUAL( cpeids[1], "cpe:/o:sle" ); BOOST_CHECK_EQUAL( labels[0], "openSUSE 11.0" ); BOOST_CHECK_EQUAL( labels[1], "SLE 11.0" ); cpeids.clear(); labels.clear(); count = 0; for_( it, repo.updatesProductBegin(), repo.updatesProductEnd() ) { cpeids.push_back(it.cpeId()); labels.push_back(it.label()); count++; } // the repo updates one product BOOST_CHECK_EQUAL( count, 1 ); BOOST_CHECK_EQUAL( cpeids[0], "cpe:/o:sle" ); BOOST_CHECK_EQUAL( labels[0], "SLE 11.0" ); // because this product updates something, it _is_ an update repo BOOST_CHECK( repo.isUpdateRepo() ); BOOST_CHECK( repo.providesUpdatesFor(CpeId("cpe:/o:sle")) ); BOOST_CHECK( ! repo.providesUpdatesFor(CpeId("cpe:/o:windows")) ); // reuse to count solvables count = 0; /** * Now check for the extended metadata of the packages */ for_( it, repo.solvablesBegin(), repo.solvablesEnd() ) { sat::Solvable s = *it; MIL << s << endl; MIL << s.kind() << endl; if ( s.ident() == "wt" ) { count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); BOOST_CHECK(p->maybeUnsupported() ); BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportUnknown ); } else if ( s.ident() == "foobar" ) { count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportUnsupported ); BOOST_CHECK(p->maybeUnsupported() ); } else if ( s.ident() == "foofoo" ) { count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); // if it is level 3 support it cant be unsupported BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportLevel3 ); BOOST_CHECK(! p->maybeUnsupported() ); } // superseded chains.... // oldfoo -> newfoo -> superfoo(L3) // foomess -> superfoo(L3) // -> brokenfoo -> foomess(cycle) // -> notexists else if ( s.ident() == "oldfoo" ) { // oldfoo -> newfoo -> superfoo(L3) count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); // if it is superseeded it counts as maybeUnsuopported BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportSuperseded ); BOOST_CHECK( p->maybeUnsupported() ); const auto & supersededBy { p->supersededBy() }; BOOST_CHECK_EQUAL( supersededBy.size(), 1 ); BOOST_CHECK_EQUAL( supersededBy[0], "newfoo" ); const auto & supersededByItems { p->supersededByItems() }; BOOST_CHECK_EQUAL( supersededByItems.first.size(), 1 ); BOOST_CHECK_EQUAL( supersededByItems.first[0], "superfoo" ); BOOST_CHECK_EQUAL( supersededByItems.second.size(), 0 ); } else if ( s.ident() == "newfoo" ) { // oldfoo -> newfoo -> superfoo(L3) count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); // if it is superseeded it counts as maybeUnsuopported BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportSuperseded ); BOOST_CHECK( p->maybeUnsupported() ); const auto & supersededBy { p->supersededBy() }; BOOST_CHECK_EQUAL( supersededBy.size(), 1 ); BOOST_CHECK_EQUAL( supersededBy[0], "superfoo" ); const auto & supersededByItems { p->supersededByItems() }; BOOST_CHECK_EQUAL( supersededByItems.first.size(), 1 ); BOOST_CHECK_EQUAL( supersededByItems.first[0], "superfoo" ); BOOST_CHECK_EQUAL( supersededByItems.second.size(), 0 ); } else if ( s.ident() == "superfoo" ) { // oldfoo -> newfoo -> superfoo(L3) count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportLevel3 ); BOOST_CHECK( not p->maybeUnsupported() ); const auto & supersededBy { p->supersededBy() }; BOOST_CHECK_EQUAL( supersededBy.size(), 0 ); const auto & supersededByItems { p->supersededByItems() }; BOOST_CHECK_EQUAL( supersededByItems.first.size(), 0 ); BOOST_CHECK_EQUAL( supersededByItems.second.size(), 0 ); } else if ( s.ident() == "foomess" ) { // foomess -> superfoo(L3) // -> brokenfoo -> foomess(cycle) // -> notexists count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); // if it is superseeded it counts as maybeUnsuopported BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportSuperseded ); BOOST_CHECK( p->maybeUnsupported() ); const auto & supersededBy { p->supersededBy() }; BOOST_CHECK_EQUAL( supersededBy.size(), 2 ); BOOST_CHECK_EQUAL( supersededBy[0], "brokenfoo" ); BOOST_CHECK_EQUAL( supersededBy[1], "superfoo" ); const auto & supersededByItems { p->supersededByItems() }; BOOST_CHECK_EQUAL( supersededByItems.first.size(), 1 ); BOOST_CHECK_EQUAL( supersededByItems.first[0], "superfoo" ); BOOST_CHECK_EQUAL( supersededByItems.second.size(), 1 ); BOOST_CHECK_EQUAL( supersededByItems.second[0], "notexists" ); } else if ( s.ident() == "brokenfoo" ) { // foomess -> superfoo(L3) // -> brokenfoo -> foomess(cycle) // -> notexists count++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); // if it is superseeded it counts as maybeUnsuopported BOOST_CHECK_EQUAL(p->vendorSupport(), VendorSupportSuperseded ); BOOST_CHECK( p->maybeUnsupported() ); const auto & supersededBy { p->supersededBy() }; BOOST_CHECK_EQUAL( supersededBy.size(), 2 ); BOOST_CHECK_EQUAL( supersededBy[0], "foomess" ); BOOST_CHECK_EQUAL( supersededBy[1], "notexists" ); const auto & supersededByItems { p->supersededByItems() }; BOOST_CHECK_EQUAL( supersededByItems.first.size(), 1 ); BOOST_CHECK_EQUAL( supersededByItems.first[0], "superfoo" ); BOOST_CHECK_EQUAL( supersededByItems.second.size(), 1 ); BOOST_CHECK_EQUAL( supersededByItems.second[0], "notexists" ); } else { BOOST_FAIL(str::form("Repo has package not contemplated in test: %s", s.ident().c_str()).c_str()); } } // check that we actually found all testeable // resolvables BOOST_CHECK_EQUAL(count, 8); } libzypp-17.36.5/tests/repo/MirrorList_test.cc000066400000000000000000000016131476576476200212020ustar00rootroot00000000000000#include #include #include #include "WebServer.h" #include using namespace zypp; using namespace zypp::repo; BOOST_AUTO_TEST_CASE(get_mirrorlist) { WebServer web((Pathname(TESTS_SRC_DIR) + "/data/Mirrorlist/remote-site").c_str(), 10001); BOOST_REQUIRE( web.start() ); Url weburl1 (web.url()); Url weburl2 (web.url()); weburl1.setPathName("/metalink.xml"); weburl2.setPathName("/mirrors.txt"); RepoMirrorList rml1 (weburl1); RepoMirrorList rml2 (weburl2); BOOST_CHECK(rml1.getUrls().begin()->asString() == "http://ftp-stud.hs-esslingen.de/pub/fedora/linux/updates/13/x86_64/"); BOOST_CHECK(rml2.getUrls().begin()->asString() == "http://ftp-stud.hs-esslingen.de/pub/fedora/linux/updates/13/x86_64/"); BOOST_CHECK(rml1.getUrls().size() == 4); BOOST_CHECK(rml2.getUrls().size() == 4); web.stop(); } libzypp-17.36.5/tests/repo/PluginServices_test.cc000066400000000000000000000020231476576476200220320ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include using std::cout; using std::endl; using std::string; using namespace zypp; using namespace boost::unit_test; using namespace zypp::repo; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/repo/yum/data") class ServiceCollector { public: typedef std::set ServiceSet; ServiceCollector( ServiceSet & services_r ) : _services( services_r ) {} bool operator()( const ServiceInfo & service_r ) const { _services.insert( service_r ); return true; } private: ServiceSet & _services; }; BOOST_AUTO_TEST_CASE(plugin_services) { ServiceCollector::ServiceSet services; PluginServices local("/space/tmp/services", ServiceCollector(services)); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/repo/RepoLicense/000077500000000000000000000000001476576476200177355ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoLicense/repo/000077500000000000000000000000001476576476200207025ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/000077500000000000000000000000001476576476200225015ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/CHECKSUM-license-prod.tar.gz000066400000000000000000000005651476576476200274220ustar00rootroot00000000000000CYn@`>O0 ˾11.Ga-!X8 =ش,~ͣ]6PG@  )8/D8˷C\MՍu\7,@*(Sd*#8/ڭG&~2sӞ:?!%}_? f(<]_]i$?G +rg<˾(/*U(OVgWdç=uO#pEc}Ew[!+t7,0NgDz޶0|SW* 7Rk1c1|>V(libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/CHECKSUM-license.tar.gz000066400000000000000000000006001476576476200264460ustar00rootroot00000000000000Yj@}d̢. C2AD{,LaϷ01!'f615b\Ti6]6+ 毣-f@!L`vYbSm>䯌?D6_uU|gyK,KPy)5JBiꟋs8s ~v/'~!GwWu۝Gdp%lo?`do.-y8sX u; ç=u#1kX/;MIy]h8mbc}?:?;&1$[sΓO?V2uӞ:ORJ)RJ)>`(libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/license.de.txt000066400000000000000000000000131476576476200252450ustar00rootroot00000000000000license de libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/license.fr.txt000066400000000000000000000000131476576476200252640ustar00rootroot00000000000000license fr libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/license.txt000066400000000000000000000000201476576476200246540ustar00rootroot00000000000000license default libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/no-acceptance-needed000066400000000000000000000000001476576476200263340ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoLicense/repo/repodata/repomd.xml000066400000000000000000000007661476576476200245220ustar00rootroot00000000000000 3a4013a12934c55f9a6b0c1b8db2ce6660840b1f7cbee95ec92a50c13c5b9e95 3c0371f0a090e0ad6432c705798e7c5617b278e85cf382344e80c4dfaf07cffb libzypp-17.36.5/tests/repo/RepoLicense_test.cc000066400000000000000000000030011476576476200212750ustar00rootroot00000000000000#include #include #include #include #include "TestSetup.h" using namespace boost::unit_test; using namespace zypp; using std::cout; using std::endl; static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); const Pathname DATADIR( TESTS_SRC_DIR "/repo/RepoLicense" ); /////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(repolicense) { std::string repo( "repo" ); test.loadRepo( DATADIR/repo, repo ); ResPool pool( ResPool::instance() ); const RepoInfo & ri( pool.knownRepositoriesBegin()->info() ); std::string prod; // BOOST_CHECK_EQUAL( ri.hasLicense( prod ), true ); BOOST_CHECK_EQUAL( ri.needToAcceptLicense( prod ), false ); BOOST_CHECK_EQUAL( ri.getLicenseLocales( prod ), LocaleSet({ Locale(),Locale("de") }) ); prod = "prod"; // BOOST_CHECK_EQUAL( ri.hasLicense( prod ), true ); BOOST_CHECK_EQUAL( ri.needToAcceptLicense( prod ), true ); BOOST_CHECK_EQUAL( ri.getLicenseLocales( prod ), LocaleSet({ Locale(), Locale("de"), Locale("fr") }) ); prod = "noprod"; // is not available BOOST_CHECK_EQUAL( ri.hasLicense( prod ), false ); BOOST_CHECK_EQUAL( ri.needToAcceptLicense( prod ), false ); BOOST_CHECK ( ri.getLicenseLocales( prod ).empty() ); } libzypp-17.36.5/tests/repo/RepoSigcheck/000077500000000000000000000000001476576476200200735ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/signed_repo/000077500000000000000000000000001476576476200223715ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/signed_repo/repodata/000077500000000000000000000000001476576476200241705ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/signed_repo/repodata/repomd.xml000066400000000000000000000001461476576476200262010ustar00rootroot00000000000000 libzypp-17.36.5/tests/repo/RepoSigcheck/signed_repo/repodata/repomd.xml.asc000066400000000000000000000004531476576476200267470ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iJwEAAECAAYFAlkxg9AACgkQGg2gkyh1YAPSfAQAlimnC4dx6bCJyJxJb6BjECNA HQBtDC4MEzQ+hDiXd6YL7wjI3fu3K9sclx2ypFb3vLkK5SHQysStWMmDOEgNA96I iAuyyDVb3F24OiYOCcTKKViXAFTxykiC9dPFXdmA4vMjqcQYaxIkA17dFYvMjLLQ 5DdgmDuMS+Fv4xVjP8I= =dzhU -----END PGP SIGNATURE----- libzypp-17.36.5/tests/repo/RepoSigcheck/signed_repo/repodata/repomd.xml.key000066400000000000000000000005531476576476200267720ustar00rootroot00000000000000Y1l[Khme0:C12sD>HTIwGl ӎ޺rd2J)S2jvU"kQ)N3Lsnb r YTm6Q(Q.BE06N4W2zypp-testsuite #Y1    (u`J[vDaf i<4#ˎs(™~Hw|B3dl;Sph N(b F_Ppnd͆`qcf'A(:6;aƨ:Mlibzypp-17.36.5/tests/repo/RepoSigcheck/unknownkey_repo/000077500000000000000000000000001476576476200233305ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/unknownkey_repo/repodata/000077500000000000000000000000001476576476200251275ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/unknownkey_repo/repodata/repomd.xml000066400000000000000000000001461476576476200271400ustar00rootroot00000000000000 libzypp-17.36.5/tests/repo/RepoSigcheck/unknownkey_repo/repodata/repomd.xml.asc000066400000000000000000000004531476576476200277060ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iJwEAAECAAYFAlkxg9AACgkQGg2gkyh1YAPSfAQAlimnC4dx6bCJyJxJb6BjECNA HQBtDC4MEzQ+hDiXd6YL7wjI3fu3K9sclx2ypFb3vLkK5SHQysStWMmDOEgNA96I iAuyyDVb3F24OiYOCcTKKViXAFTxykiC9dPFXdmA4vMjqcQYaxIkA17dFYvMjLLQ 5DdgmDuMS+Fv4xVjP8I= =dzhU -----END PGP SIGNATURE----- libzypp-17.36.5/tests/repo/RepoSigcheck/unsigned_repo/000077500000000000000000000000001476576476200227345ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/unsigned_repo/repodata/000077500000000000000000000000001476576476200245335ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/unsigned_repo/repodata/repomd.xml000066400000000000000000000001461476576476200265440ustar00rootroot00000000000000 libzypp-17.36.5/tests/repo/RepoSigcheck/wrongsig_repo/000077500000000000000000000000001476576476200227575ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/wrongsig_repo/repodata/000077500000000000000000000000001476576476200245565ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/RepoSigcheck/wrongsig_repo/repodata/repomd.xml000066400000000000000000000002041476576476200265620ustar00rootroot00000000000000 libzypp-17.36.5/tests/repo/RepoSigcheck/wrongsig_repo/repodata/repomd.xml.asc000066400000000000000000000004531476576476200273350ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iJwEAAECAAYFAlkxg9AACgkQGg2gkyh1YAPSfAQAlimnC4dx6bCJyJxJb6BjECNA HQBtDC4MEzQ+hDiXd6YL7wjI3fu3K9sclx2ypFb3vLkK5SHQysStWMmDOEgNA96I iAuyyDVb3F24OiYOCcTKKViXAFTxykiC9dPFXdmA4vMjqcQYaxIkA17dFYvMjLLQ 5DdgmDuMS+Fv4xVjP8I= =dzhU -----END PGP SIGNATURE----- libzypp-17.36.5/tests/repo/RepoSigcheck/wrongsig_repo/repodata/repomd.xml.key000066400000000000000000000005531476576476200273600ustar00rootroot00000000000000Y1l[Khme0:C12sD>HTIwGl ӎ޺rd2J)S2jvU"kQ)N3Lsnb r YTm6Q(Q.BE06N4W2zypp-testsuite #Y1    (u`J[vDaf i<4#ˎs(™~Hw|B3dl;Sph N(b F_Ppnd͆`qcf'A(:6;aƨ:Mlibzypp-17.36.5/tests/repo/RepoSigcheck_test.cc000066400000000000000000000324361476576476200214510ustar00rootroot00000000000000#include #include #include #include #include "TestSetup.h" using namespace boost::unit_test; using namespace zypp; using std::cout; using std::endl; #define TC_VERBOSE 0 #define COUT if ( TC_VERBOSE ) std::cout #define TAG COUT << "*** " << __PRETTY_FUNCTION__ << endl static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64, TSO_REPO_DEFAULT_GPG ); getZYpp()->keyRing()->allowPreload( false ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); const Pathname DATADIR( TESTS_SRC_DIR "/repo/RepoSigcheck" ); /////////////////////////////////////////////////////////////////// struct KeyRingReceiver : public callback::ReceiveReport { typedef callback::ReceiveReport Base; KeyRingReceiver() { TAG; connect(); } ~KeyRingReceiver() { TAG; } virtual void reportbegin() { TAG; cblistCheck( __FUNCTION__ ); } virtual void reportend() { TAG; cblistCheck( __FUNCTION__ ); } virtual KeyTrust askUserToAcceptKey( const PublicKey &key, const KeyContext &keycontext = KeyContext() ) { TAG; cblistCheck( __FUNCTION__ ); return Base::askUserToAcceptKey( key , keycontext ); } virtual void infoVerify( const std::string & file_r, const PublicKeyData & keyData_r, const KeyContext &keycontext = KeyContext() ) { TAG; cblistCheck( __FUNCTION__ ); return Base::infoVerify( file_r, keyData_r, keycontext ); } virtual bool askUserToAcceptUnsignedFile( const std::string &file, const KeyContext &keycontext = KeyContext() ) { TAG; cblistCheck( __FUNCTION__ ); return Base::askUserToAcceptUnsignedFile( file, keycontext ); } virtual bool askUserToAcceptUnknownKey( const std::string &file, const std::string &id, const KeyContext &keycontext = KeyContext() ) { TAG; cblistCheck( __FUNCTION__ ); return Base::askUserToAcceptUnknownKey( file, id, keycontext ); } virtual bool askUserToAcceptVerificationFailed( const std::string &file, const PublicKey &key, const KeyContext &keycontext = KeyContext() ) { TAG; cblistCheck( __FUNCTION__ ); return Base::askUserToAcceptVerificationFailed( file, key, keycontext ); } public: typedef std::list CallbackList; void cblistCheck( const std::string & cb_r ) { BOOST_CHECK_EQUAL( _cblist.empty(), false ); if ( !_cblist.empty() ) { BOOST_CHECK_EQUAL( _cblist.front(), cb_r ); _cblist.pop_front(); } } CallbackList _cblist; // expected callback sequence list } krCallback; inline std::string chr( const bool & v ) { return v ? "1" : "0"; } inline std::string chr( const TriBool & v ) { return indeterminate(v) ? "*" : chr( bool(v) ); } /////////////////////////////////////////////////////////////////// /* * Check the RepoInfo methods returning which checks to perform * based on the global (zypp.conf) and local (.repo file) settings. * * *** See table in RepoInfo.h:'Repository gpgchecks' */ BOOST_AUTO_TEST_CASE(init) { ZConfig & zcfg( ZConfig::instance() ); RepoInfo repo; std::initializer_list tribools( { TriBool(indeterminate), TriBool(true), TriBool(false) } ); // global zconfig values... for ( bool g_GpgCheck : { true, false } ) { zcfg.setGpgCheck( g_GpgCheck ); for ( TriBool g_RepoGpgCheck : tribools ) { zcfg.setRepoGpgCheck( g_RepoGpgCheck ); for ( TriBool g_PkgGpgCheck : tribools ) { zcfg.setPkgGpgCheck( g_PkgGpgCheck ); // .repo values for ( TriBool r_GpgCheck : tribools ) { repo.setGpgCheck( r_GpgCheck ); for ( TriBool r_RepoGpgCheck : tribools ) { repo.setRepoGpgCheck( r_RepoGpgCheck ); for ( TriBool r_PkgGpgCheck : tribools ) { repo.setPkgGpgCheck( r_PkgGpgCheck ); // check the repo methods returning what to do: bool cfgGpgCheck = indeterminate(r_GpgCheck) ? g_GpgCheck : bool(r_GpgCheck); TriBool cfgRepoGpgCheck = indeterminate(r_GpgCheck) && indeterminate(r_RepoGpgCheck) ? g_RepoGpgCheck : r_RepoGpgCheck; TriBool cfgPkgGpgCheck = indeterminate(r_GpgCheck) && indeterminate(r_PkgGpgCheck) ? g_PkgGpgCheck : r_PkgGpgCheck; #if ( TC_VERBOSE ) COUT << chr(cfgGpgCheck) << "\t" << chr(cfgRepoGpgCheck) << "\t" << chr(cfgPkgGpgCheck) << "\t(" << chr(r_GpgCheck) << "," << chr(g_GpgCheck) << ")" << "\t(" << chr(r_RepoGpgCheck) << "," << chr(g_RepoGpgCheck) << ")" << "\t(" << chr(r_PkgGpgCheck) << "," << chr(g_PkgGpgCheck) << ")" << flush; #endif // default gpgCeck follows config BOOST_CHECK_EQUAL( repo.gpgCheck(), cfgGpgCheck ); // repoGpgCheck follows gpgCeck // explicitly defined it alters mandatory check bool willCheckRepo = repo.repoGpgCheck(); bool mandatoryCheck = repo.repoGpgCheckIsMandatory(); #if ( TC_VERBOSE ) COUT << "\t" << ( willCheckRepo ? ( mandatoryCheck ? "!" : "+" ) : "-" ) << flush; #endif if ( mandatoryCheck ) // be a subset of willCheckRepo! BOOST_CHECK_EQUAL( willCheckRepo, mandatoryCheck ); if ( cfgGpgCheck ) { BOOST_CHECK_EQUAL( willCheckRepo, true ); BOOST_CHECK_EQUAL( mandatoryCheck, !bool(!cfgRepoGpgCheck) ); // TriBool: !false = true or indeterminate } else { BOOST_CHECK_EQUAL( willCheckRepo, bool(cfgRepoGpgCheck) ); BOOST_CHECK_EQUAL( mandatoryCheck, bool(cfgRepoGpgCheck) ); } // pkgGpgCheck may depend on the repoGpgCheck result for ( TriBool r_validSignature : tribools ) // indeterminate <==> unsigned repo { repo.setValidRepoSignature( r_validSignature ); if ( r_validSignature && !willCheckRepo ) // RepoInfo must invalidate any valid (old) signature as soon as the repo check // is turned off. This prevents showing 'valid sig' for not yet refreshed repos. // Instead show 'won't be checked' immediately. BOOST_CHECK( bool(!repo.validRepoSignature()) ); else BOOST_CHECK( sameTriboolState( repo.validRepoSignature(), r_validSignature ) ); bool willCheckPkg = repo.pkgGpgCheck(); bool mandatoryCheck = repo.pkgGpgCheckIsMandatory(); #if ( TC_VERBOSE ) COUT << "\t" << chr(r_validSignature) << ( willCheckPkg ? ( mandatoryCheck ? "!" : "+" ) : "-" ) << flush; #endif if ( mandatoryCheck ) // be a subset of willCheckPkg! BOOST_CHECK_EQUAL( willCheckPkg, mandatoryCheck ); if ( cfgPkgGpgCheck ) { BOOST_CHECK_EQUAL( willCheckPkg, true ); BOOST_CHECK_EQUAL( mandatoryCheck, true ); } else if ( cfgGpgCheck ) { if ( r_validSignature ) { BOOST_CHECK_EQUAL( willCheckPkg, false ); BOOST_CHECK_EQUAL( mandatoryCheck, false ); } else // TriBool: !true = false or indeterminate/unsigned { BOOST_CHECK_EQUAL( willCheckPkg, true ); BOOST_CHECK_EQUAL( mandatoryCheck, !bool(!cfgPkgGpgCheck) ); // TriBool: !false = true or indeterminate/unsigned } } else { BOOST_CHECK_EQUAL( willCheckPkg, false ); BOOST_CHECK_EQUAL( mandatoryCheck, false ); } } #if ( TC_VERBOSE ) COUT << endl; #endif } } } } } } // reset to defaults: zcfg.setGpgCheck ( true ); zcfg.setRepoGpgCheck ( indeterminate ); zcfg.setPkgGpgCheck ( indeterminate ); } // RAII: Protect ZConfig value changes from escaping the block scope struct ZConfigGuard { ZConfigGuard() : _zcfg( ZConfig::instance() ) { _g = _zcfg.gpgCheck(); _r = _zcfg.repoGpgCheck(); _p = _zcfg.pkgGpgCheck(); } ~ZConfigGuard() { _zcfg.setGpgCheck ( _g ); _zcfg.setRepoGpgCheck( _r ); _zcfg.setPkgGpgCheck ( _p ); } ZConfig * operator->() { return &_zcfg; } ZConfig & _zcfg; bool _g; TriBool _r; TriBool _p; }; // RAII: Set and reset KeyRingReceiver callback list and response bits for new testcase struct KeyRingGuard { KeyRingGuard ( KeyRing::DefaultAccept accept_r = KeyRing::ACCEPT_NOTHING ) { KeyRing::setDefaultAccept( accept_r ); krCallback._cblist.clear(); #if ( TC_VERBOSE ) COUT << "================================================================================" << endl; KeyRing & keyRing( *getZYpp()->keyRing() ); COUT << "K " << keyRing.publicKeys() << endl; COUT << "T " << keyRing.trustedPublicKeys() << endl; COUT << KeyRing::defaultAccept() << endl; ZConfig & zcfg( ZConfig::instance() ); COUT << "ZConf " << chr( zcfg.gpgCheck() ) << chr( zcfg.repoGpgCheck() ) << chr( zcfg.pkgGpgCheck() ) << endl; #endif } ~KeyRingGuard() { BOOST_CHECK_EQUAL( krCallback._cblist.empty(), true ); KeyRing::setDefaultAccept( KeyRing::ACCEPT_NOTHING ); krCallback._cblist.clear(); } }; void testLoadRepo( bool succeed_r, // whether loadRepos should succeed or fail with RepoException const std::string & repo_r, // name of the test repo to load KeyRing::DefaultAccept accept_r, // Callback response bits to set (mimics user input) KeyRingReceiver::CallbackList cblist_r ) // Callback sequence list expected { KeyRingGuard _guard( accept_r ); krCallback._cblist = std::move(cblist_r); if ( succeed_r ) test.loadRepo( DATADIR/repo_r, repo_r ); else BOOST_CHECK_THROW( test.loadRepo( DATADIR/repo_r, repo_r ), repo::RepoException ); } // ACCEPT_NOTHING = 0x0000, // ACCEPT_UNSIGNED_FILE = 0x0001, // ACCEPT_UNKNOWNKEY = 0x0002, // TRUST_KEY_TEMPORARILY = 0x0004, // TRUST_AND_IMPORT_KEY = 0x0008, // ACCEPT_VERIFICATION_FAILED = 0x0010, BOOST_AUTO_TEST_CASE(unsigned_repo) { // askUserToAcceptUnsignedFile actually depends on the gpgcheck settings. // Mandatory on 'R' cases. Otherwise an unsigend repo is accepted but 'pkggpg on' // is enforced. ZConfigGuard zcfg; zcfg->setRepoGpgCheck( false ); // unsafe std::string repo( "unsigned_repo" ); testLoadRepo( true, repo, KeyRing::ACCEPT_NOTHING, { } ); zcfg->setRepoGpgCheck( indeterminate ); // the default testLoadRepo( false, repo, KeyRing::ACCEPT_NOTHING, { "reportbegin", "askUserToAcceptUnsignedFile", "reportend" } ); testLoadRepo( true, repo, KeyRing::ACCEPT_UNSIGNED_FILE, { "reportbegin", "askUserToAcceptUnsignedFile", "reportend" } ); } BOOST_AUTO_TEST_CASE(unknownkey_repo) { std::string repo( "unknownkey_repo" ); testLoadRepo( false, repo, KeyRing::ACCEPT_NOTHING, { "reportbegin", "askUserToAcceptUnknownKey", "reportend" } ); testLoadRepo( true, repo, KeyRing::ACCEPT_UNKNOWNKEY, { "reportbegin", "askUserToAcceptUnknownKey", "reportend" } ); } BOOST_AUTO_TEST_CASE(wrongsig_repo) { std::string repo( "wrongsig_repo" ); // IMPORTED KEYS WILL STAY IN KEYRING! FIXIT if it disturbs subsequent tests // 1st testcase with a key, so on the fly check askUserToAcceptKey // being called unless the key is imported in the trusted ring testLoadRepo( false, repo, KeyRing::ACCEPT_NOTHING, { "reportbegin", "askUserToAcceptKey", "reportend" } ); testLoadRepo( false, repo, KeyRing::TRUST_KEY_TEMPORARILY, { "reportbegin", "askUserToAcceptKey", "infoVerify", "askUserToAcceptVerificationFailed", "reportend" } ); testLoadRepo( false, repo, KeyRing::ACCEPT_NOTHING, { "reportbegin", "askUserToAcceptKey", "reportend" } ); testLoadRepo( false, repo, KeyRing::TRUST_AND_IMPORT_KEY, { "reportbegin", "askUserToAcceptKey", "infoVerify", "askUserToAcceptVerificationFailed", "reportend" } ); // Now the key is in the trusted ring (no more askUserToAcceptKey) testLoadRepo( false, repo, KeyRing::ACCEPT_NOTHING, { "reportbegin", "infoVerify", "askUserToAcceptVerificationFailed", "reportend" } ); testLoadRepo( true, repo, KeyRing::KeyRing::ACCEPT_VERIFICATION_FAILED, { "reportbegin", "infoVerify", "askUserToAcceptVerificationFailed", "reportend" } ); } BOOST_AUTO_TEST_CASE(signed_repo) { std::string repo( "signed_repo" ); testLoadRepo( true, repo, KeyRing::KeyRing::ACCEPT_NOTHING, // relies on wrongsig_repo having accepted the key! (already in trusted ring) { "reportbegin", "infoVerify", "reportend" } ); } BOOST_AUTO_TEST_CASE(summary) { KeyRingGuard _guard; KeyRing & keyRing( *getZYpp()->keyRing() ); BOOST_CHECK_EQUAL( keyRing.publicKeys().size(), 1 ); BOOST_CHECK_EQUAL( keyRing.trustedPublicKeys().size(), 1 ); BOOST_CHECK_EQUAL( KeyRing::defaultAccept(), KeyRing::ACCEPT_NOTHING ); BOOST_CHECK_EQUAL( test.satpool().repos().size(), 5 ); // } libzypp-17.36.5/tests/repo/RepoVariables_test.cc000066400000000000000000000254541476576476200216430ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include using std::cout; using std::endl; using namespace zypp; using namespace boost::unit_test; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/repo/yum/data") typedef std::list ListType; namespace std { std::ostream & operator<<( std::ostream & str, const ListType & obj ) { str << "["; for ( const auto & el : obj ) str << " " << el; return str << " ]"; } } // A plain functor struct FncTransformator { std::string operator()( const std::string & value_r ) const { return "{"+value_r+"}"; } }; BOOST_AUTO_TEST_CASE(value_transform) { using zypp::base::ValueTransform; using zypp::base::ContainerTransform; typedef ValueTransform ReplacedString; typedef ContainerTransform ReplacedStringList; ReplacedString r( "val" ); BOOST_CHECK_EQUAL( r.raw(), "val" ); BOOST_CHECK_EQUAL( r.transformed(), "{val}" ); r.raw() = "new"; BOOST_CHECK_EQUAL( r.raw(), "new" ); BOOST_CHECK_EQUAL( r.transformed(), "{new}" ); ReplacedStringList rl; BOOST_CHECK_EQUAL( rl.empty(), true ); BOOST_CHECK_EQUAL( rl.size(), 0 ); BOOST_CHECK_EQUAL( rl.raw(), ListType() ); BOOST_CHECK_EQUAL( rl.transformed(), ListType() ); rl.raw().push_back("a"); rl.raw().push_back("b"); rl.raw().push_back("c"); BOOST_CHECK_EQUAL( rl.empty(), false ); BOOST_CHECK_EQUAL( rl.size(), 3 ); BOOST_CHECK_EQUAL( rl.raw(), ListType({ "a","b","c" }) ); BOOST_CHECK_EQUAL( rl.transformed(), ListType({ "{a}", "{b}", "{c}" }) ); BOOST_CHECK_EQUAL( rl.transformed( rl.rawBegin() ), "{a}" ); } void helperGenRepVarExpandResults() { // Generate test result strings for RepVarExpand: // ( STRING, REPLACED_all_vars_undef, REPLACED_all_vars_defined ) // Crefully check whether new stings are correct before // adding them to the testccse. std::map vartable; std::map> result; bool varsoff = true; auto varLookup = [&vartable,&varsoff]( const std::string & name_r )->const std::string * { if ( varsoff ) return nullptr; std::string & val( vartable[name_r] ); if ( val.empty() ) { val = "["+name_r+"]"; } return &val; }; for ( auto && value : { "" , "$" , "$${}" , "$_:" , "$_A:" , "$_A_:" , "$_A_B:" , "${_A_B}" , "\\${_A_B}" // no escape on level 0 , "${_A_B\\}" // no close brace , "${C:-a$Bba}" , "${C:+a$Bba}" , "${C:+a${B}ba}" , "${C:+a\\$Bba}" // escape on level > 0; no var $Bba , "${C:+a$Bba\\}" // escape on level > 0; no close brace C , "${C:+a${B}ba}" , "${C:+a\\${B}ba}" // escape on level > 0; no var ${B} , "${C:+a${B\\}ba}" // escape on level > 0; no close brace B , "${C:+a\\${B\\}ba}" , "__${D:+\\$X--{${E:-==\\$X{o\\}==} }--}__\\${B}${}__" , "__${D:+\\$X--{${E:-==\\$X{o\\}==}\\}--}__\\${B}${}__" } ) { varsoff = true; result[value].first = repo::RepoVarExpand()( value, varLookup ); varsoff = false; result[value].second = repo::RepoVarExpand()( value, varLookup ); } for ( const auto & el : result ) { #define CSTR(STR) str::form( "%-40s", str::gsub( "\""+STR+"\"", "\\", "\\\\" ).c_str() ) cout << "RepVarExpandTest( " << CSTR(el.first) << ", " << CSTR(el.second.first) << ", " << CSTR(el.second.second) << " );" << endl; } } void RepVarExpandTest( const std::string & string_r, const std::string & allUndef_r, const std::string & allDef_r ) { std::map vartable; bool varsoff = true; auto varLookup = [&vartable,&varsoff]( const std::string & name_r )->const std::string * { if ( varsoff ) return nullptr; std::string & val( vartable[name_r] ); if ( val.empty() ) { val = "["+name_r+"]"; } return &val; }; varsoff = true; BOOST_CHECK_EQUAL( repo::RepoVarExpand()( string_r, varLookup ), allUndef_r ); varsoff = false; BOOST_CHECK_EQUAL( repo::RepoVarExpand()( string_r, varLookup ), allDef_r ); } BOOST_AUTO_TEST_CASE(RepVarExpand) { // ( STRING , REPLACED_all_vars_undef , REPLACED_all_vars_defined ) RepVarExpandTest( "" , "" , "" ); RepVarExpandTest( "$" , "$" , "$" ); RepVarExpandTest( "$${}" , "$${}" , "$${}" ); RepVarExpandTest( "$_:" , "$_:" , "[_]:" ); RepVarExpandTest( "$_A:" , "$_A:" , "[_A]:" ); RepVarExpandTest( "$_A_:" , "$_A_:" , "[_A_]:" ); RepVarExpandTest( "$_A_B:" , "$_A_B:" , "[_A_B]:" ); RepVarExpandTest( "${C:+a$Bba\\}" , "${C:+a$Bba\\}" , "${C:+a[Bba]\\}" ); RepVarExpandTest( "${C:+a$Bba}" , "" , "a[Bba]" ); RepVarExpandTest( "${C:+a${B\\}ba}" , "${C:+a${B\\}ba}" , "${C:+a${B\\}ba}" ); RepVarExpandTest( "${C:+a${B}ba}" , "" , "a[B]ba" ); RepVarExpandTest( "${C:+a\\$Bba}" , "" , "a$Bba" ); RepVarExpandTest( "${C:+a\\${B\\}ba}" , "" , "a${B}ba" ); RepVarExpandTest( "${C:+a\\${B}ba}" , "ba}" , "a${Bba}" ); RepVarExpandTest( "${C:-a$Bba}" , "a$Bba" , "[C]" ); RepVarExpandTest( "${_A_B\\}" , "${_A_B\\}" , "${_A_B\\}" ); RepVarExpandTest( "${_A_B}" , "${_A_B}" , "[_A_B]" ); RepVarExpandTest( "\\${_A_B}" , "\\${_A_B}" , "\\[_A_B]" ); RepVarExpandTest( "__${D:+\\$X--{${E:-==\\$X{o\\}==} }--}__\\${B}${}__", "__--}__\\${B}${}__" , "__$X--{[E] --}__\\[B]${}__" ); RepVarExpandTest( "__${D:+\\$X--{${E:-==\\$X{o\\}==}\\}--}__\\${B}${}__", "____\\${B}${}__" , "__$X--{[E]}--__\\[B]${}__" ); } void varInAuthExpect( const Url & url_r, const std::string & expHost_r, const std::string & expPort_r, const std::string & expPath_r, const std::string & user_r = std::string(), const std::string & pass_r = std::string() ) { BOOST_CHECK_EQUAL( url_r.getHost(), expHost_r ); BOOST_CHECK_EQUAL( url_r.getPort(), expPort_r ); BOOST_CHECK_EQUAL( url_r.getPathName(), expPath_r ); BOOST_CHECK_EQUAL( url_r.getUsername(), user_r ); BOOST_CHECK_EQUAL( url_r.getPassword(), pass_r ); } BOOST_AUTO_TEST_CASE(replace_text) { /* check RepoVariablesStringReplacer */ ZConfig::instance().setSystemArchitecture(Arch("i686")); ::setenv( "ZYPP_REPO_RELEASEVER", "13.2", 1 ); repo::RepoVariablesStringReplacer replacer1; BOOST_CHECK_EQUAL( replacer1(""), "" ); BOOST_CHECK_EQUAL( replacer1("$"), "$" ); BOOST_CHECK_EQUAL( replacer1("$arc"), "$arc" ); BOOST_CHECK_EQUAL( replacer1("$arch"), "i686" ); BOOST_CHECK_EQUAL( replacer1("$archit"), "$archit" ); BOOST_CHECK_EQUAL( replacer1("${rc}it"), "${rc}it" ); BOOST_CHECK_EQUAL( replacer1("$arch_it"), "$arch_it" ); BOOST_CHECK_EQUAL( replacer1("$arch-it"), "i686-it" ); BOOST_CHECK_EQUAL( replacer1("$arch it"), "i686 it" ); BOOST_CHECK_EQUAL( replacer1("${arch}it"), "i686it" ); BOOST_CHECK_EQUAL( replacer1("${arch}it$archit $arch"), "i686it$archit i686" ); BOOST_CHECK_EQUAL( replacer1("X${arch}it$archit $arch-it"), "Xi686it$archit i686-it" ); BOOST_CHECK_EQUAL( replacer1("${releasever}"), "13.2" ); BOOST_CHECK_EQUAL( replacer1("${releasever_major}"), "13" ); BOOST_CHECK_EQUAL( replacer1("${releasever_minor}"), "2" ); BOOST_CHECK_EQUAL(replacer1("http://foo/$arch/bar"), "http://foo/i686/bar"); /* check RepoVariablesUrlReplacer */ repo::RepoVariablesUrlReplacer replacer2; // first of all url with {} must be accepted: BOOST_CHECK_NO_THROW( Url("ftp://site.org/${arch}/?arch=${arch}") ); BOOST_CHECK_NO_THROW( Url("ftp://site.org/${arch:-noarch}/?arch=${arch:-noarch}") ); BOOST_CHECK_NO_THROW( Url("ftp://site.org/${arch:+somearch}/?arch=${arch:+somearch}") ); BOOST_CHECK_EQUAL(replacer2(Url("ftp://user:secret@site.org/$arch/")).asCompleteString(), "ftp://user:secret@site.org/i686/"); BOOST_CHECK_EQUAL(replacer2(Url("http://user:my$arch@site.org/$basearch/")).asCompleteString(), "http://user:my$arch@site.org/i386/"); BOOST_CHECK_EQUAL(replacer2(Url("http://site.org/update/?arch=$arch")).asCompleteString(), "http://site.org/update/?arch=i686"); BOOST_CHECK_EQUAL(replacer2(Url("http://site.org/update/$releasever/?arch=$arch")).asCompleteString(), "http://site.org/update/13.2/?arch=i686"); // - bsc#1067605: Allow VAR in Url authority // fake some host name via $arch varInAuthExpect( replacer2(Url("ftp://$arch/path")), "i686", "", "/path" ); varInAuthExpect( replacer2(Url("ftp://$arch:1234/path")), "i686", "1234", "/path" ); // don't expand in user/pass! varInAuthExpect( replacer2(Url("ftp://$arch:$arch@$arch:1234/path")), "i686", "1234", "/path", "$arch", "$arch" ); // No support for complex vars: // BOOST_CHECK_NO_THROW( Url("ftp://${arch:-nosite}/path") ); // BOOST_CHECK_NO_THROW( Url("ftp://${arch:+somesite}/path") ); } BOOST_AUTO_TEST_CASE(uncached) { ::setenv( "ZYPP_REPO_RELEASEVER", "13.2", 1 ); repo::RepoVariablesStringReplacer replacer1; BOOST_CHECK_EQUAL( replacer1("${releasever}"), "13.2" ); ::setenv( "ZYPP_REPO_RELEASEVER", "13.3", 1 ); BOOST_CHECK_EQUAL( replacer1("${releasever}"), "13.3" ); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/repo/susetags/000077500000000000000000000000001476576476200173635ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/CMakeLists.txt000066400000000000000000000000261476576476200221210ustar00rootroot00000000000000 ADD_TESTS(Downloader)libzypp-17.36.5/tests/repo/susetags/Downloader_test.cc000066400000000000000000000107061476576476200230330ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include "tests/zypp/KeyRingTestReceiver.h" using std::cout; using std::endl; using std::string; using namespace zypp; using namespace boost::unit_test; using namespace zypp::repo; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/repo/susetags/data") using namespace zyppng::operators; BOOST_AUTO_TEST_CASE(susetags_download) { KeyRingTestReceiver keyring_callbacks; keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); Pathname p = DATADIR + "/stable-x86-subset"; RepoInfo repoinfo; repoinfo.setAlias("testrepo"); repoinfo.setPath("/"); filesystem::TmpDir tmp; Pathname localdir(tmp.path()); auto ctx = zyppng::SyncContext::create (); auto res = ctx->provider()->attachMedia( p.asDirUrl() , zyppng::ProvideMediaSpec() ) | and_then( [&]( zyppng::SyncMediaHandle h ){ auto dlctx = std::make_shared( ctx, repoinfo, localdir ); return zyppng::SuseTagsWorkflows::download(dlctx, h); }) | and_then( [&](zyppng::repo::SyncDownloadContextRef ctx ) { MIL << "All files downloaded" << endl; const char* files[] = { "/suse", "/suse/setup", "/suse/setup/descr", "/suse/setup/descr/kde-10.3-71.noarch.pat", "/suse/setup/descr/packages", "/suse/setup/descr/packages.DU", "/suse/setup/descr/packages.en", // "/suse/setup/descr/packages.es", "/suse/setup/descr/patterns", "/content", "/gpg-pubkey-7e2e3b05-44748aba.asc", "/media.1", // "/media.1/products.asc", // "/media.1/products.key", "/media.1/media", // "/media.1/products", // "/media.1/info.txt", // "/media.1/license.zip", "/gpg-pubkey-a1912208-446a0899.asc", "/gpg-pubkey-307e3d54-44201d5d.asc", "/gpg-pubkey-9c800aca-40d8063e.asc", "/content.asc", "/content.key", "/gpg-pubkey-3d25d3d9-36e12d04.asc", "/gpg-pubkey-0dfb3188-41ed929b.asc", NULL }; int i=0; while ( files[i] != NULL ) { BOOST_CHECK_MESSAGE( PathInfo(localdir + files[i] ).isExist(), string(files[i]).c_str() ); i++; } return zyppng::expected::success(); }); BOOST_REQUIRE ( res.is_valid () ); } BOOST_AUTO_TEST_CASE(susetags_gz_download) { KeyRingTestReceiver keyring_callbacks; keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); Pathname p = DATADIR + "/stable-x86-subset-gz"; RepoInfo repoinfo; repoinfo.setAlias("testrepo"); repoinfo.setPath("/"); filesystem::TmpDir tmp; Pathname localdir(tmp.path()); auto ctx = zyppng::SyncContext::create (); auto res = ctx->provider()->attachMedia( p.asDirUrl() , zyppng::ProvideMediaSpec() ) | and_then( [&]( zyppng::SyncMediaHandle h ){ auto dlctx = std::make_shared( ctx, repoinfo, localdir ); return zyppng::SuseTagsWorkflows::download(dlctx, h); }) | and_then( [&](zyppng::repo::SyncDownloadContextRef ctx ) { const char* files[] = { "/suse", "/suse/setup", "/suse/setup/descr", "/suse/setup/descr/kde-10.3-71.noarch.pat.gz", "/suse/setup/descr/packages.gz", "/suse/setup/descr/packages.DU.gz", "/suse/setup/descr/packages.en.gz", // "/suse/setup/descr/packages.es", "/suse/setup/descr/patterns.gz", "/content", "/gpg-pubkey-7e2e3b05-44748aba.asc", "/media.1", // "/media.1/products.asc", // "/media.1/products.key", "/media.1/media", // "/media.1/products", // "/media.1/info.txt", // "/license.tar.gz", // "/control.xml", // "/installation.xml", "/gpg-pubkey-a1912208-446a0899.asc", "/gpg-pubkey-307e3d54-44201d5d.asc", "/gpg-pubkey-9c800aca-40d8063e.asc", "/content.asc", "/content.key", "/gpg-pubkey-3d25d3d9-36e12d04.asc", "/gpg-pubkey-0dfb3188-41ed929b.asc", NULL }; int i=0; while ( files[i] != NULL ) { BOOST_CHECK_MESSAGE( PathInfo(localdir + files[i] ).isExist(), string(files[i]).c_str() ); i++; } return zyppng::expected::success(); }); BOOST_REQUIRE ( res.is_valid () ); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/repo/susetags/data/000077500000000000000000000000001476576476200202745ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/000077500000000000000000000000001476576476200234175ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/media.1/000077500000000000000000000000001476576476200246355ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/media.1/build000066400000000000000000000000471476576476200256600ustar00rootroot00000000000000openSUSE-11.1-Beta5-DVD-i586-Build0128 libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/media.1/directory.yast000066400000000000000000000000701476576476200275400ustar00rootroot00000000000000build info.txt media products products.asc products.key libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/media.1/media000066400000000000000000000000321476576476200256320ustar00rootroot00000000000000openSUSE 20081112071348 1 libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/media.1/products000066400000000000000000000000221476576476200264150ustar00rootroot00000000000000/ openSUSE 11.1-0 libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/000077500000000000000000000000001476576476200250645ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/SHA1SUMS000066400000000000000000000001531476576476200262120ustar00rootroot0000000000000033bbc20526153c35d11ce0b1c3d6b7be151b92d9 content bfc5ac3540529a9a898c3c444096f9bcbb5db780 directory.yast libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/content000066400000000000000000000013111476576476200264550ustar00rootroot00000000000000CONTENTSTYLE 11 BASEARCHS i586 DATADIR suse DESCRDIR suse/setup/descr DISTRIBUTION openSUSE FLAVOR dvd LABEL openSUSE 11.1 LINGUAS cs da de en en_GB en_US es fi fr hu it ja nb nl pl pt pt_BR ru sv zh zh_CN zh_TW NAME openSUSE REFERENCES openSUSE-release = 11.1 RELNOTESURL http://www.suse.com/relnotes/i386/openSUSE/11.0.42/release-notes-openSUSE.rpm REPO_LOCATION http://download.opensuse.org/factory/repo/oss/ SUMMARY openSUSE VENDOR openSUSE VERSION 11.1 META SHA1 3d0cdf34257cc2c54929bf5414969142cad1d421 packages META SHA1 2d68731ab2f3c86b81f7672798f871cf96b2d0fc packages.DU META SHA1 07c36c760ed0c58b58d6d8fcfdd2717df02c4256 packages.en HASH SHA1 875e73cf2ee139203208c860fbfd7fa5cb291c7e license.tar.gzlibzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/content.asc000066400000000000000000000003051476576476200272240ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkktcUUACgkQm+zCtd2wN1ZrDgCdFYz7dG8ui0ueFLOIHYxFgunL VEYAnjzykFqwVAmYhF/QNbfriOqN5z1B =4Jf7 -----END PGP SIGNATURE----- libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/content.key000066400000000000000000000671571476576476200272700ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBDsj/RYRBACQD/DCxkMgmEjBNYh53AfsV+zcMaz4nDmeEElANfHrVzVGx33N Siiqs33RIjV35Gd8OH1iSnbA7ef0gWELgVSToK2ydv/3X5Cbcb1MOWYQKJE1dQz7 fw7Ic9nP7NieM18YMsOYEmCvyL4sLZviQIlb3caP+OpI/GAoNINY8m9yowCgxgx1 L+jnJznXyKy7v5WgwMyrE2cD/38Nvp62Rq1/IqhUDc3SDUp5+xPddwOZ/E7P9F73 0Gb2ec2fhAm9QZyVvFvLa+SJq2/LvY+vITZSRI0HTBZf4Yrzd6eHu/cDp0m0o/BS McuoaHmKeHYcyIa2w8LMREpchgdlY/LnHR83Yipc3iegBRUvoTtwUYMqpswwi+6i 50nhA/9MC5cPOZbPpqbaDbSz0NtAVM2gcvgiBx4VKCh/AhkZ+abzogeHn6uT2eaP 3Fnk4YOa0FEbO+YHg3Lu45tZV3pBQUZoY07r5niT0Sb6dAKO/j/omEt4q44OO3ba fanEvFurtgpkszoD20yheQLhv7CVdS8IUfQ2R+r0eQjxtAfJWLQmRHVuY2FuIE1h Yy1WaWNhciBQcmV0dCA8ZHVuY2FuQHB1Yy5jbD6IVwQTEQIAFwULBwoDBAMVAwID FgIBAheABQJIkdYDAAoJEM0etqlmfkLR6EgAn2/KapnsJrHLcwD3XxHc3KJzosii AJ9K468Njg7GOzlIP1lfHhIRNB8yjohXBBMRAgAXBQI7I/0WBQsHCgMEAxUDAgMW AgECF4AACgkQzR62qWZ+QtGplQCcDxIiwPV5CSENHsaR6R1da2VtbVYAnR4C1zKU A5MZ/cB7OC0/++Va0uPmtCdEdW5jYW4gTWFjLVZpY2FyIFByZXR0IDxkdW5jYW5A a2RlLm9yZz6IXgQTEQIAHgUCQkG9ngIbIwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAK CRDNHrapZn5C0f+oAJ9B08kix2phsvE79ZFUIbFsjtm3QgCeNPFdMcNJ2FlrDC1o l2arF81JBDq0LUR1bmNhbiBNYWMtVmljYXIgUHJldHQgPGR1bmNhbkBtYWMtdmlj YXIuY29tPoheBBMRAgAeBQJCQb14AhsjBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJ EM0etqlmfkLRSwYAnjnoAUut+98JScgZ3RUeELfccgs2AJ49zu0stW/6dfKHUG6v KxbevTRtBLQqRHVuY2FuIE1hYy1WaWNhciBQcmV0dCA8ZG1hY3ZpY2FyQHN1c2Uu ZGU+iGAEExECACAFAkiR1d4CGyMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRDN HrapZn5C0aUTAJ97XpoPCkZh6tKwWJLPSd71rTUu3QCdEIH0RIEn8Hd1EvOvrJUi xYNg1Tq0LER1bmNhbiBNYWMtVmljYXIgUHJldHQgPGRtYWN2aWNhckBnbWFpbC5j b20+iGMEExECACMCGyMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCSJHWAwIZAQAK CRDNHrapZn5C0Q32AJ0eHwMEmyJrW703lxiU8OdlzlBLawCfQoFccGWKTrQXjem9 q7rjZ8BJltm5AQ0EOyP9LxAEAJ2V7CaBeNwDBrOXHAbH3p2y2tRmnIwQNtdvsCf7 aEQm7Pcc7OXaM4fk52OD8eHEEmn3XLJpt48DFXgnT3UWdEbieahJtntvapvZ49jE y1TChI200vxWyuUpMSri1Fx7IGchSxrLBY01gyrF/48vHLtCm8vvm+oD5DtxbdAY 8MkTAAMFBACUp+tTe06sjzrORkgsc1CAG7IeD5Rng2d1HIPgmP/lmUuwsyZVGYg1 qiBQA5oqeRXLhfzFdJmIHHfJzAVXMte5mhH9Tp3z4RITo7KbvMQZ0jQRlkB0MfYe Qgcuuq4gUhxvHMxffyJSploMqPkxiV68c9UdlSGIKGraOgSmUnbhWYhGBBgRAgAG BQI7I/0vAAoJEM0etqlmfkLRbgUAnjGNmh+7esr1UeqNVmKKSpnMWcNFAJ94i40t /KUd6iH0TeEIc5Lc7taHwZkBogQ7JSbVEQQA4xR5LOB2ZWSHN1I1kKyAktnSm2wV sW0SCpoq1w9JjmbDgnZpDKSIMuAVjNh53DeQbT/9XsofpyMBx5xSoM6isQCGNwI1 sxA1Syj2yWdsXUHHhGyq8d2a8sLeCnchxvQ3gDGJoYm/AVWfRoNM8kw+vx6l5gNE FDnzh0CiwQKVU1cAoP/heoi+DpQV9cSpYNe8hzW3QBbDBACDh/9awQp3NrCI8oxX YIWuTsQAsDib66HQDi4w8US/7kVp4zqyoTN+gPk8knOS7z6WqpxmHD0DDZu4VE4U aC1Oa2H/63VFePcvwEUGQwHWThX+JnmJNHO9+XO0003KsH+0Yt4FRn64bJkRcL1P ScjYZFif/R6TpNRGQmC4JfH+EgP7BCPQkVoi0vvDx39NqT81WZAWc0zGTSFJVypb TyfYUrG59T9DxwH5NYWMXIdEAEFp+/OheT/AwU+22PfxY9k7rvUkXg4PoStV9yv0 vEKVGd2g7kDwU77c068iNJO8LEYqF5fnSO8ieU67ZglKZSe0EU2hL6WEZ9TLh6Kz PHsaq8S0MUZyYW5jaXNjYSBRdWludGFuYSBOYXJhbmpvIDxmcmFuY2lzY2FAaG90 cG9wLmNvbT6IYAQQEQIAGAUCOyUm1QgLAwkIBwIBCgIZAQUbAwAAAAASCRBnGpo8 nSL6HQdlR1BHAAEBtLcAoOOto28BA1l20JI6ewbDqZ9e4TSIAKDE4ysvUE+aUj7w kdr4ODvQxSiSXIhGBBARAgAGBQI7JUWHAAoJEM0etqlmfkLRk+gAmwVtmmKob6sh PFJjk6STXkjWvx65AKCa9f2BjS0dJjieCpucWfEaaxh7+7kCDQQ7JSbVEAgA9kJX twh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt90xk hkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcwYc58 yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZrM2w4 DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEstSr/ POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8vYlL IhkmuquiXsNV6TILOwACAggA3d73TIqNfiKwTEcXx7OW8KlE8UGx7hiK1+IBakLM FkB54oVj6aLQyBsH/rrgVs9V/UYhygjyDhNK0715Og7B9bP+YhNPswix7KBj0mOA 1O1mEIK6rpkgT9AqhARcwSUlDf4gg+Dz+pX485a5nw85xGJ+9ygySlzOXNE+GCW7 PTRQUpqvKs2PTAIsZZLcuY789xl/PxDE4EsRvYoevAk2nLqvru3820LM4ynKwKqz 0QICTLVcE7swa6ck6f53pbzhvEk0dM99MirtJMWkj7qYvwQwoP6U40cAE+k5pHTZ tboXmycyvC+mysvJrKmVTLrHMZ0v4Tth2eudUbwsrMkRYYhUBBgRAgAMBQI7JSbV BRsMAAAAABIJEGcamjydIvodB2VHUEcAAQF5ZgCg9T9QjbJA+h+uPT22O0x2BSIK 4LMAoJZimOZ4Tk3USFLE4uXDd+whyKG+mQGiBDslNloRBADEn8TIB8BJTMKJzQHm sFBk/DYaoH4ERgqiRhyt7+ssd/5rOdbFQOD3QO47esBvP524bM3nkAiMIqmbWsRq B2XExLuNtfRHTj8zHm2y3Jtogh+e5FxgHP75+lThgoTYcGbflYHaRIMv/vYBDkSg tHAQ09F/d6GuYptTuKudN9H67wCg/96X+Ac+Kpot+VPb1mA2p/zaiBcEAKHEgFrX 59lrUulJah5CAXaXP2buPQ1Fiday+MGoCIUYBpW5cs6mThixIZzqwbB149/8sV4v rBd5nQ8vWdddgyvtS9bWkn/C5ERbLrW8bCarph/m01NZsG45yYHeA/P6M/K8lDnO jp8LJgKmho1kfzLpfh/JrcymxaVR4y/LojLPA/0f5k3urRkyEAimp4p05/aLyW0Y LuFdh+MAfoL6VeOt1u1LZ2OsqQmTsYI7MPrHUX6zioh/k5OW0pEVHmiYBZtzoX28 fYOAnJym2Cw0dTPE1gJVXG9ZGaqq2+HWmB8/XuYw9qHmUL2p3Dga7E4Oo49ja5qs 57Ni5Ffo3/wHDGfNErQpTWljaGFlbCBNYWMtVmljYXIgUHJldHQgPG1pbWFjdmlj QHB1Yy5jbD6IYAQQEQIAGAUCOyU2WggLAwkIBwIBCgIZAQUbAwAAAAASCRBtSv26 VLUDggdlR1BHAAEBphMAnimtyySasb0oNoRdfPiUEuBe4uZkAKDGXjDyVlUlppVO NYpgBo8B6D+DcohGBBARAgAGBQI7JUcfAAoJEM0etqlmfkLRZEAAn2zEtLL/5Pdb VXF1eaaCtAkfpvRLAJ98sHeXEMN3npwp9c/qt4MCNxvfc7kCDQQ7JTZaEAgA9kJX twh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt90xk hkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcwYc58 yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZrM2w4 DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEstSr/ POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8vYlL IhkmuquiXsNV6TILOwACAgf+Os+ycvrsYeE4gApXVFdty6c49JWi/x4QJ/kr9NsQ GVu2FYByKttWcMokPWWxKNNOR6ryz3Ie2MpiF8aGIqJImpwoG53B7RtGnml9U/yD z2yW8DUcdvthgi6J4Gzb5gDvWwlj/S1XlWk/Q+C6bAorpoQLYjsObf0NnADzIDdN 4Uy5ESNixHWZ7GqSw6IEKOb+qDoixGWrEq37dDDML95dRjFL8XX8K0dhzO1qKSUu h+ACtltLUgSzyhWp1vSgLC1XAFRVert5RF47l53DqPX3hVlH/AOCwSa+XEAbtpCr gXMtImsgs9fLOOipasQggli7voJ8XE1N2DRHUBeNTY3YGIhUBBgRAgAMBQI7JTZa BRsMAAAAABIJEG1K/bpUtQOCB2VHUEcAAQFpOgCg5hPPL3haLptW/G8AgAyiYzV9 Vs4AoKietcZ1/NBAS7QDvK0GUEgSsgAUmQGiBDslQEkRBADgDXtg08dhjHQpv9Si svzvROcsr6QRFOLWf95GWh7c6SI7Pj5mTClUaJXBRjLuvOR0L7w8l5nVJ/4kzSjl e1ad04eDzP3sB4rNK18l7GAwc0ijV0mp/Kl9F4iibco3cCIMsjysWgUmlk+dYYWQ ubQA/EgTs7kFQo9QRxzojqnSywCg/5CZ5TJ19gNS8knyu819v6ZSkV8D/01Fem2W ZejqsmNBNiY1JoWxnTofi3AjMv6j/+NjyBuU9ozIhUicx4y+Ro05eKUZ+VAIecVb VhEqH9VUriX48TDrNxu4OGJh62q58s0u/tqIX5OrvrpmdOC1UTdcc2CM88vssTt8 oxauZeM7YAkY9rApXUniyfnJ3fdd3FlCIbvaA/9XXrlBjG/3HQSPfknbqLlCvEcl elRmm6LAX8fuf/JFgj0ctRMAJKB6HOE7/pvl3yRMMITwmd9lB/s2u+fqcwV1bDqf nyV8h3KFpTCGM1qKT+EaaT/8JhFJifYDjBEnUe9mYG7dUlt+Ff9Fj6ZRJQs9vszz QcsJDzNpys+j/KJutbQtRHVuY2FuIE1hYy1WaWNhciBHYXLtbiA8ZHVuY2FuQG1h Yy12aWNhci5jb20+iGAEEBECABgFAjslQEkICwMJCAcCAQoCGQEFGwMAAAAAEgkQ wSqJHVebm9QHZUdQRwABAeHRAJsGKaYQp44NzYEjS9dsEAT4sYKzDgCgw4c7kDar ZL/qKqFvHbvsPS6fRteIRgQQEQIABgUCOyVG9QAKCRDNHrapZn5C0WO7AKCBUULk 55fR/yavkYgUhL9AX0rShgCfQ0jjVarVQNc/cj5ilTdKqSkeJ8q5Ag0EOyVAShAI APZCV7cIfwgXcqK61qlC8wXo+VMROU+28W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mU rfdMZIZJ+AyDvWXpF9Sh01D49Vlf3HZSTz09jdvOmeFXklnN/biudE/F/Ha8g8VH MGHOfMlm/xX5u/2RXscBqtNbno2gpXI61Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2 azNsOA1FHQ98iLMcfFstjvbzySPAQ/ClWxiNjrtVjLhdONM0/XwXV0OjHRhs3jMh LLUq/zzhsSlAGBGNfISnCnLWhsQDGcgHKXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+c fL2JSyIZJrqrol7DVekyCzsAAgIH/3NYWNGw9Wa8B6Ow6NyS2WSBrx33ZxInDgOb Ze72mO/GSyxxZqxPiqTFTpajTD+HWKQuvSfMGZdD1kJZTrNEI/MNLwVBhrgxLX2q rmq1aJgWa5aRcv05wHuIUrw2g220oZ09gUhXuF3U/oDUCAX36d16CaPCMJV1TRUo c2L1WoLP2BjzIkAgKrqUGvIFNsvtXe3cNU5dSQzF0spExuCz1Wy67/T4fzLSJpiW adl/eN67cp83ega5fyYy9NpISmeiFcV25UJqbQM0ktilZzDhx+evmYd6PHP7i8Oq gC1oHajEohfo9kmyO/AXJ/v08svnSJVO0G/9qQeuFp3JVeBHsN6IVAQYEQIADAUC OyVASgUbDAAAAAASCRDBKokdV5ub1AdlR1BHAAEBRRIAnjhaS/m/eYLw2g79GuLD /1x12Xj9AKCW04cRwUxoIirwdJxLNRT2GoLAdpkBogRDRPbUEQQAqD1L0hdAtxso Pdwc34z6EM3yBuynB/l9TzHe8LGhePAed7dle6ceDBsOVgsEcukvm5M/OjrN2HMX sJtGu/1nvxtEJs5sjjg/n/i+bO0q9KzNX5hVRmUSop9TF9LO2KV+NK0h6LjUmF11 9r7vqO7ib5MyPP8n9eimnOG9Zz940+cAoLlehpdXlpDkvQ38AVLiHcCzm843A/9g faz7LjeJoW40wJz8c/HzCiNq/uvFLxJInFSHiimrhKfSVnXn0eWH79pKGoKmQtxf eedEo2cNq/1psdEYQAOJrJLjF8CGraN/TSvfqF6oElW8kwgG/EhID5cOtH/zHLZS L3kaU5kmki9+7Y/lBB6jlEj6EZNFTV0zC9Ka1qblcQP/QGIietl/9Aldw5LHnCr6 94VnQ91mYaJ4kSJ2IZHqJByRT9FdFpFqRw9fm6zYBxNIoI525Ey1n1WA4aaUXHCo zIgeAsZcDaK3jnNrkbztnAM6OXdMwnSQ30zYtSG7Kbn965Z2BWfmNnYaz/NuRTL3 EtHS9mU1XDlz8A1VSUQwdJe0L1dpbGwncyBHVyBjcnlwdG8gdGVzdCBrZXkgPHdz dGVwaGVuc29uQHN1c2UuZGU+iGAEExECACAFAkNE9tQCGwMGCwkIBwMCBBUCCAME FgIDAQIeAQIXgAAKCRB30Gza79cROIiZAJ91uP31qZIGX6YrfXbtb8yk2kvsugCc C1z685uRfQg01++wHwkj7L2Dh2K5Ag0EQ0T24BAIAL3jlSmKpyjHgvZmRM6WDxY8 MTHtKknVQKsT7wDpJ82yaQx5tDvbiH/BfyEGQvh6vwjkJPc6MDJKxyAbPd2tEkl+ KVde+F47IcQ6GMQ4lH/100w3nON2uNtDNyt44t8ko/zMiIDq9c7tcwljfdJxSMoQ WwFKlsIhDuLR7SPeqTJKOkb5jGW9ILAuRETE3eYl37xDwuN+7TcrlaJHmZmQD2dk CyaJrN67dbEboxeL2XgzkWV8K4VFxrbHKKTYINwt/QLMNnhUu8Gnm5VHUG7R+os9 6Hw/qs9jzXNsHJ2OaumnmU8gdFEkoRuz7EAEyw4RcJHgz6qfIOaCPiZrz4KsgGMA AwUIAKSw54P61phChKmlBBubIBtn6knu0PLUlw/zso1xr845LqwnvoDlIlqlHzxL WERgVxrxPFamBr3kGVY6ojcSeperSvMeBisTMQuITBRU6EFqAYRMNScucLzmPCqK ki5wxEY1xaqk0LAxJ8hYzBgZeCtl1ozmDAZkqpGgycnbb7p6oB9MlC7t6LsWO8JN 2SqLwxprbeIuDK7YZmF6vVtrTNS7rV4ezwoSX+A1SKP9MUoIbzELySBCwD6CCKfI eFdO7Iz3bxoPp+J0gIcOuyixwkf0xKoE1Cx+cPNwKKcG68g5wSgVxYes8dwK2btP WDNfcVuSdY7uLq3kBuo25cuVZp+ISAQYEQIACQUCQ0T24AIbDAAKCRB30Gza79cR OKjbAJ9rKEjBV92RKyeFMMJNqYO3b2JWdACVGFhCjk3wHOZB6MfwfK1dMQ7vdJkB ogQ57vSBEQQAk/GN+ftr7+DBlSoixDDpfRnUk+jApGEt8hCnrnjVnPs/9Cr33+CX LQbILOO7Y5oiPbJdHh45t4E0fKyLVzDerCRFB1swz/mNDxT26DLysdBV5fwNHTPh xa67goAZVrehQPqJEckkIpYriOaYcKpF3n5fQIZMEfMaHEElQhcXML8AoJVXDkJY h7vI8EUB8ZURNLZMEECNA/sH0MCnb4Q6ZcRyeZ3+1PHP8hP73b6TepRdLZhaylwV F/iu7uIn62ZUL4//NTOCDY7V63qg4iba/fUbOsWtEnGaiE7mQuAlsSWvRspwRA9/ g9rdVf3/JdLJrLmKBTheyG+PSJE3W7cAE4ZWafGxIRCwXhmj3TQnJn2euqylHRub EQP/aL53NZK0kBdvrKgff6O8Of6tqoss8Dkk55I7QVFSp+My1Dn+mngQKFejTAgt yo/WmR3wPjQ9HoT2lRiYI2lTRYT4uMdHuwVC3b4DqAKmoy375FERwHkrMVyKBJsl v8QtbAWw5A1CAUseaHo+91wmYJ4/4p6YUahqbG/tZyhbxfq0KFN1U0UgUGFja2Fn ZSBTaWduaW5nIEtleSA8YnVpbGRAc3VzZS5kZT6IYgQTEQIAIgUCQNgGPgIbAwUJ Dm3fvQQLBwMCAxUCAwMWAgECHgECF4AACgkQqE7a6JyACsqQnwCfUbmemUle0FuK U4EyMUPgAT6dLCMAn3xvWwjZ6xEz5YDp/nRhJAFnoCi/iEYEEBECAAYFAjpwXlIA CgkQnkDjEAAKq6TczgCgi+ddhWb7+FWcfeE6WwPZccqAHowAnjjtRyGwHLQHr5OT FAYTXi2Wv6jNiQEVAwUQOnBgb3ey5gA9JdPZAQE1pwf/QJ+b34lFBNVUJ7fk/xGJ JREt7V12iSafaRzGuH8xWvIz1bb+VARxnnt16FDQ1cDNjoEhCEmcW83Vxp6iJXE9 PE8wVA/Yue/bon5JS7J69+UiQ2eq2pudfwljp52lYVM53jgPYEz0q/v3091nlZ8C YkAkN9JDS1lV1gEzJ7J0+POngDpU+lDQT2EC6VKaxeWK8pNt6UFDwICRDQxKnlOo iDvTrdWT7QdJZ4sPv8Qotdw9+tKNbWQ2DqdIRxyTdw9xDfAtcj6mXeQr7852Lwem 1gSKVnEYHZ9g1FTJqVOutY8KhpUc9RfOCRv8XuIxrs4KSbfSF0s8qIRCQelxufg9 AbkCDQQ57vSSEAgAhJHQTejMX+Vr6g1pHDEcusJ63fQ2CfFFE5iE9okH9O7UVCiS fb9CV38dmeHdPCEEjDUWquFYEnvj3WICMtH249t1Ymuf4Du3yRKQ9oXdn/qTJzlr x9qzjiG3mH7ocwHOgUIwCrZoEdBEVE2n0zPVm+hddwjWWTWXw6pxQz+i9dsN89xe xRV5M9O0bNwCLaNWX2GXeLAkqTK/9EuZy6x2yLxi6du9YYUAXkZpqBhCjtiUXpRo FCdglMznbcAyCk9C2wqb2j/D1Z2BeSBaGCSFkR6pRLebnE17LWcu72Iy+r0z+Jec bPiyDpDZj4apn7IC81aNFGi7fNITsHODbwwjiwADBgf/YPvVdzkc8OC7ztacEWCa nwylKvxCdKzTDA+DfES6WUYShyiVJvZzRy25LJ5WcK20kzOS6Qv1OrIXiz/pdGy1 aKtJZrAnFEsofpmOj8VoqyyFgp/yAGQBp12+mXek7SCZRhuqalDfEMRiWEJ6J5dL kyShyRDWyPbFh0HXE7QTHN+IKKxxQqNQXL6Z3NSxS61p+5n6BseiDUI39xxkKTFw FrkgUIc5Gs2Or2lhaWvGwSfoCmwbsklszZt6xbU+R0SjFqTvjPWx6eHfqbmNC9WM DdTjGrXDDKXFp2aYlokfN6It9vsbVlGNlOwHt/JjGoPMxW6Xqj0FLA7/VewgCdXW 64hMBBgRAgAMBQJA2AZ6BQkObd/oAAoJEKhO2uicgArKZ6YAn0W2MMU94qvvZfz4 DU1DU2TpaH9qAJ9uctHhotN+9Y2qfZDlerqu9bFLjpkBogRGI2ZOEQQAoyDrTWj8 7ypQt9m/EeUw0QdPxUNLbDLbeXS8LqtmWJRG09WCxdddL2RJeSEAKuZXbw+zHUf+ n6nV03cQXmM2Y3iBGGx84N6zfzf/jJHBuFvCCtR+ngwGy9OR5UNbnk6dJo4KBi2C rdYoEHvIebgOoBBO3b9LRtDScdsORrNhqZsAoIkYrrNnr9ttT2uuSKUdYLGLlyzh BACidQb45vgXxyYq6qB+4j6uR5QAcJ/rPbFJn+m4wpH2q/8kgLC9FVIRzQiKB1BG XdopgNmQNJEwcQfgSF/xzEWc8T2RMGCPENFGLE1W/4J0LfplmmbNf9rXlkdMJ1Kf njuTKTgDvUIxSU3SM9BnoLH0jjwqOeQlLZLa97SVCn2d4AP/ZmXvm9RL4tf1LPpJ ZxEUSkdo41l8cLjzelIryW31yGY7lVDXJQIRKrLc6X51idy4T8Y9Myb4afzJ6kk2 iOg0G69H/ib8D/uZP+IG56pvscTqHMoYlU+OczjwMlGLhuLdJvvRu1ceiwvbTLpG 3Xx2kcpuNsgtrNOBltorCn7WtWW0LFpZcHAgVGVzdCBLZXkgUGFpciA8enlwcC1k ZXZlbEBvcGVuc3VzZS5vcmc+iGAEExECACAFAkYjZk4CGyMGCwkIBwMCBBUCCAME FgIDAQIeAQIXgAAKCRCb7MK13bA3VklQAJ45EdpWqIW9kOFp8WpnR2Fkn/FCygCe I432bBatL5oD7Dv2B2ikyTebAC+5AQ0ERiNmURAEALaAeUxk/SuzQr+Q+XUMO41R 54J8adzRk7QIcIq2KYQVmhdm3t1CVUy21BVteHjJ61VvTyo/xzVS4ULtAugml7V8 uS2oSJbPphZUisG4j++HBZTWHI+vbcwp2hSoBJUDx3DDnN9RII8kmHFCMrONtTMS PvrLoFvsh6+QciLC+r33AAMFBACC0sJi7Q/j8JLnrO9wzz8liDNzANHsTu0JmXhc J26YmWLmUNxojxq23mVah1ge9nYVvPuboEfQlUErCxwucBzCEBVPEbIi9OoGXSGi TYAK+2o4bVMmz9Fj1aV5M5uflQfAoXvZtGdLdrSvGNClWqQXK92A4MfPRfVQNMp8 uqt1oohJBBgRAgAJBQJGI2ZRAhsMAAoJEJvswrXdsDdWqbgAn1Efg2qKNzdX8cQ2 twN7eDpAH6UIAJ9VBL6UKfv+A580mxL8My3qHpN3c5kBogRGP7wCEQQA9nMS2PNz 9htYeU5JCmEGEy6KYFkIe/+x+VCtHH+toCx+0ehewcFuBKpi7JvHhhPJCDqG+cAk FOqcaQTL/tVGKDtW6IbceC9iVGOcnCYquLtQjckbnIkd8oLLnjEZHpZENoaTbir5 n4nDnKGs71N7WTOiEyY1f7UL2E0ERqsBH8MAoLNDmN6u3kfDcFnpGo9t7fE1e4Yz BADUukDII7KeQnS4JV9NqHoghvNqBCiwzlqGdmow/vp2s0iH5SRNA2mdFtukF3sI eyEc06JlffHyVeop0DWp5ZOf0zbgG9XpV3WmBbjW52dMqDmkycf5m/PL5ut1K/BU 8inXDfnWrvMs7jZSYII+cgXDYPv/GTgJtWZAzJYPbgIYAwP9EUo17v2DZn5XjxcS CgQgCRSXp8+HUFGXm+XLib9tHgqpyp+QhWBVOmGIN7GGhLWXrpbQ18Hkb3hsHtvB P76S1Gu6fmmavl8LYyOlOluVar5AiiFLEKsFVkR4p9f+AwASea51Psj3i1zR+o6z EPowxvEYniPdf+J/oAl9Z28GUP60K1pZcHAgdGVzdGNhc2Uga2V5IDx6eXBwLWRl dmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRj+8AgIbAwYLCQgHAwIEFQIIAwQW AgMBAh4BAheAAAoJEL1h2JvZiCG+0yUAn03uDMK5jpVg8Vld8mehOAfcUKtGAKCF r7OKGFc22kM3JUrR2ouZMbhp/LkCDQRGP7wMEAgA+E9dSjxOws5KoBjGjT/sjUM3 1A23f0mhEOVnHuat1b5lQaWDkcclo0vEDHPYHvFsXswLI8kyrF5fru3v0JjCrKT8 z4ZFSsgerOQ/BYUdT3aO2wIuMcfjSzrvQ7rlPo6lJMh2JbfEBds1/fDjnAiLkHNo Y5Ndnb3xyplIg6FJ37kD8b2KxQFp3rIFCTKmaO03eS8uCI3zCUJUOwNfOgRlPGz1 qFdUKlCJ1ZDRjVy5oJXpf5vjE1dOZ0+vtSggagkVJbh6g2gohRzlDhVVr7Yq5jyW f+uye/DSaRe4bs175EK2mrV8h5wMocIsE2S6to2mzI0IBoVfEMineKp4kgS/owAD BggAnx+BRqq7PaRgVEZko2SpRwFHZxrpdDNirsiYb/GQZAKVLT3DIWSXKOdKRaZK o3x+398VzEVQz+RaY2kbeu2m23s6fw4LPPuvdTrQERA1mwM2qzTUdxWwfX1Hm4dS douFu7XwXKCsChViQr6l9hxk81ctZN9757hglcAvyomfwuqXOA6lMAljaGTXfIZh WnSYMdwjJcUk5ZbGiMjl6fHTCfhRbE5szjc2aRQvQw7aWlHhAoQqbY1sMuVpEBT3 vhTi1B9QZxknEGMBpRPJfnBZBO4VvLcjsHMeLJNSf7QwnidcBPMHtS1zHSIg+boH 9yXo9f/fKPoUEx435MBqghliVYhJBBgRAgAJBQJGP7wMAhsMAAoJEL1h2JvZiCG+ TvcAn3iNEaNVAivwlU9fwR/TTQdE8mMwAJsHUBROiGlUrY2w0WBJ0x0DhrFcvZkB ogREdFC3EQQA2b71VLFFEozMkNn1LfFLuHhibj2zIRLUf7xe6cxf/LvQa+5IelgE gWdNnTHjaKhcz01O87+j4j/d4ji8MtjEDTkgS5EvjLHEen80umS/NZja/g8IDhf6 y2eLbnALAWPWd5YEcdJloZfl7p1T1x4ZEfR/UYoOMDq688AbGI43178AoLkNT0Ov lEIC/Ek1ajWjZ5VWM81FA/99+iH7cKIB/7SqenVfxWD/1aSx17cBXntL3AoeRcHC j9L2KPTSHwegkdoNKcmLBwVm4XjFl0VU5QmlFToWsnHfg16MipdxXMS+tTg9Bf33 oNlBKh+59XLBldjAxpal7BebqynT2HAURuesp5Vl7N1uw87vSTfLJIVkp13bQRWt wQQAqPggF0syyZxaxu5IPAGE/tJPpE0v1MncAK+e0Ei1HP25V0erHjXfkzOCsI+C I9qTS/y6Wcs1aw0vQVjWR6t20JxET6316SuV1l9KrmZ/M4NSJhcMZiXbhyprcssT Y4z0dUlBcw9RF6T3wmIES+pFODn5W4BqC9mKZoBzui0Pzhq0Mm9wZW5TVVNFIEJ1 aWxkIFNlcnZpY2UgPGJ1aWxkc2VydmljZUBvcGVuc3VzZS5vcmc+iGQEExECACQF AkR0ULcCGwMFCQPCZwAGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQOzARt2udZSP3 sACZAeKbA5uOEXJK88jMo1xCgWF2Cl0AnAiwVvebe6KACMqn7IPeESAqW6+dmQGi BD+dnTsRBACwnlz4AhctOLlVBAsq+RaU82nb5P3bD1YJJpsAce1Ckd2sBUOJD11N UCqH8c7EctOquOZ5zTcWxHiWWbLyKQwUw2SUvnWa5SSbi8kI8q9MTPsPvhwtgMrQ MLenMO+nsrxrSaG6XcD+ssfJNxC7NQVCQAj3pvvg9rKi3ygsM7CXHwCghgsqX6TO r55HE90DbEsoq3b/jjsD/i8aIZ6urUgrpAkQslcakXdJLKgSdwjRUgVZgvYZb7kA x1iPq0t/AhB3NJw3zW4AAKJohGg3xj5K4V8PJEZrSIpoRYlF43Kqlfu2p5ghWT89 SP4YAlWPeTqf0+dTYUYz3b144k2ZFOdRuXIRxunoYNAUr9oMrxBXbJ/eY+0UQX3p BACYzKizyY4JJgd0zFJmNkcdK9nzcm+btYFnYQo33w5GSE686UNr+9yiXt9tmPRv NEbj3u+xoAX8B/5k3aZ5NbUhV64/VcKlUdRIxNlFCG7I9KgxeHWAYwi7yqOGXM3T /v6o7GLdQEB0ChFqS7kUlqmwLV+C3QhlrFe/Cuk26i+Q6rQiRmVkb3JhIFByb2pl Y3QgPGZlZG9yYUByZWRoYXQuY29tPokCHAQQAQIABgUCQCztZwAKCRDdE2MqcWVu aC26D/0abz5VhIh2eOsTpI3vTlHJQpe3Cx5qyLJ5oFaUFbjVIU0L5Vt9dcrmXvzA oa4czZxtPcbo7wWvENCA3tpcdB83zPqaD9VDEZrjoFzNLL8pK2Kl73/IcMkf/UHG pcJCWoftag0Zq5AngZgH0Voe6YAreVPBYFSIaZhSCEaYEb8ejOwdAeYc7b01e/43 TLfRmoeQMFoH/rZUqcLJXfHyi3KkCGZXWfwYkQiGsy5pMT7c4WzIwNZju7QaRJcN cB9y1FHGnkaz6we4dkh79sqRvn82dxgXbLa1rR/m6g20m/uuOrhHle7gsMtmmQAm aUTes54HDdlDe2JdL7dTqOhXX8mF3rf4j9BVv/Vz2y4EwBE7JVqPYHT7HDolQ80O xEamJDuo3h5hgPxsmPZ2JZRLzZKeuq43xz8gJlcB4vpS6Q7j15FB5trQ6iKTIWzW SqV5zBahG6qJ4RN1ubJzSzOgNIycJ0uFZZ5rnYIyowqTwmzGU8VZphrz3436lYlQ 4sDnluIlYB8mxZHZz2+k3E38PHgqobXa7Al/5kSQ4owTyfo7+IvxHkSbIA5yQpdW mV8/QJpp7PlcvBlYyvwzXNgj6hGu1XOjSw4AxXtHgmQOya4Q+ktARfWL0wfP/ocd vdkHajiRv9sp59C/Ir5/zmTmgQeEudous19MaMP43AKqj3Z2/IicBBABAgAGBQJB 3c/dAAoJEJhqQe8YjLfJfTcEAKQ6q/+LuNxz5X4nX0S+6s8pxshdUUTcFQnN013Z dJ7HBJIt/GZSbyXm5dsWdmvne9vA2Gfo2glP4HtVvEBbmT9vCKC/V8aI1QF/aTcV wdUaXzIj2rG9dl63LCLl/o9hBa3zPOL80kaSyjPGMuKBM/UzRAVFjVihd0G8gPso pGSuiEYEEBECAAYFAj+e2OAACgkQKdW6JI31bQVRJQCgmeuid7gnSjUcyRHP7qD0 pW47YXIAnRfJ5s7NWYj1Tk7I5+c2ZhXTCdByiEYEEBECAAYFAkBpvjQACgkQcdLU aCBIxSjrhwCeMzGZSA+xfgL03obWLbZN6QtlnpoAnj4aA0MkT6/oqiJOEQp03uh7 KMrciEYEEBECAAYFAkCo71wACgkQXanJZSIKP4/TKQCfUQmD5oobxJQKCoy/g9aH ryQQq/QAnjK7ql0wBaO6Z45yggecwHAP5Wm2iEYEEBECAAYFAkEU8TsACgkQ3GVW 6BHmDogH4QCfY4tpxjMm9EYa98IWaPwaFW59OvkAoMynGza4cvZOTSrvFV9teWfv 5r7AiEYEEBECAAYFAkEU8U4ACgkQZGYqnQA+HZ26AwCfVW71WRotzZI74EKmcltt Xve6WHgAnj8GrScGsOyLUbcGaiPNyu1NWdRGiEYEEBECAAYFAkEU8VoACgkQiEVN 9vr2r+PzUQCfSKSK0ZJ/cf+YdvrHyxcABg8pWZwAn1FnhKQ1AW90BLXkhGpNy7nN O+ZaiEYEEBECAAYFAkEU8WUACgkQ0ptfRip0+Q2JBwCgksE9QoxWQwaRJApr+Qp/ k4K8VnwAoKYlK6AvAdeiOKOHlM+eCQ7F3ZBniEYEEBECAAYFAkF6JkgACgkQUdrz TXusf2wqsQCgiLp1BCmfVnOjDeis49xCIMPNmCcAoILl+XvzwO6Fp3JHCghndJ3S CycbiEYEEBECAAYFAkG0c74ACgkQ+lAXgUiSypriPACdHwfmU390R8YWPg3f9uHz WP+iCaIAoIOXgZDN2JimS8za9+IFjzz+xQ/SiEYEEBECAAYFAkHdz30ACgkQ9tuO JwRFhLVkgwCgv/57BB269RcFh6fTucG1Q9kfVTgAn2z6rYMpbmodRUlbV1zifctG IKBUiEYEEBECAAYFAkINVnAACgkQhfn5/UKaxrY0NwCg3QZqs09BvyYFmLssuEhH 0fN1h9MAoNjfBazVPxZRLZSZpPPZmF/AUCv+iEYEEBECAAYFAkJA1zIACgkQ/RiB B2NcQIpPRACfUSPNfj8tJLky/QT0c425M/4a6QsAn1wARHuu4Ns0AkQJ7qA3uHc6 19dGiEYEEBECAAYFAkJdM08ACgkQaajtSerafFlzwQCgtKtlxNPhH4TUj+qOg/7G ul9fLIAAnj5Xz8m83GclDmhmpPNXkTWuetugiEYEEBECAAYFAkLWjJ8ACgkQbGUs +HTfTWsOUgCgik2nqZNx7DbYYHB001sOVTMzIRwAn2vL3TUQmdELn+0yizufL0AN HL3tiEYEEBECAAYFAkRf5AoACgkQi9gubzC5S1zlxQCfehVXfZ7C4VoEoEkorx5i +oWP4u4AnjF1CdHeHnUEtn+ar1Q4HKkuDU1biEYEEBECAAYFAkTkVbwACgkQ5aYV 37hLgJBEPgCgg3qHa3Au96/Ycj45/t5pjSN4/f4Ani3cFmiDRiOU7wZxe9zPaqpD 6KdmiEYEEBECAAYFAkU5xIMACgkQZ/MxGm4PtJQBdgCfZunvqtB1/ff6wgWRWqtV sMlenDAAn2shRndxeHiGuxgu+4N8jxwsDNG3iEYEERECAAYFAkKy80MACgkQQk6z 7JKZxYfXfgCguWu/c5bkOADFOrH6pXP7H3U16MsAoIEki0PHq1W2W/Y45o1KKIBS BHvWiQIcBBIBAgAGBQJBkP08AAoJEAvXRWEqdVnVuG8P/i3IKnskOMtyBrgyoad3 OFLxIyg9c7m5YhVpOutZU5V91ngpk35T/WcxSx1AdIDeFiZSDK69RU6cke+J38Qp GqfImdqSRxY417AF1AbkB+csf/V9wdHVZh1PbrA0ZGxaRxQ6EAErLWzS9FVR/d2N jEtTaGfQWU7HIeHER1JUZha9C77sEdjOjVpbEpXZD5L3iB5hpvKVx84ouuNXUelS tCsgU401Qbl9/VZYKka0GeQKrzMTDXfiXtISFqA8BsSE5DcKOjMZUx8n0kreNqVg RtC+PKOBOTrKoypelcbYs2VQtuztaCtOhn48HpSP9N+or6vovIBfoPsmA0pPQ1l5 n4pfN6gAYmSi/U/EG3uLQ5xBsejH4PQtQwRKvwXRJrR3r/U5r5ZMVKiUGSNy9oT9 ZRicjf/J7vUni8c1l6YRv48bD3yBSpZcJC6aEV9V1A9jPpPatBLI5+EtDPtr+Wuh 5tEe8T9t6rXUWpf0KGxSV4diLQwaInPsu7qAW7RWQbaMwCfoc4EqwCvIHnmhC+S1 dTQVjaUYJE4vc5cTZo0wVu1h/fg4QMdZygK1R6c55H+efsm9izybCYGHCNIDIeK6 +Nm3X/lab8NFCTbdsURvXXXrWaNu1Gif8kuLz1y1RR4RVdW2PU41qO01OBIGiNGG hPJgar3O4i3raVT0CRQACPUkiEYEEhECAAYFAj/eLnYACgkQ9jVtZM9GVc8gkQCZ AXjWVuzO56JGARz87PRMEaejp7oAn1CUrc36G5aWEeFa313zajqV9n7miEYEEhEC AAYFAkCpRCcACgkQXtn1Qb6VBHJYNACdGpDwlw+sCf2Ec4/yK13Dg+615iMAoIXO Nz0rmpgXItEREAdyWMHbBI3FiEYEEhECAAYFAkH2jfUACgkQgrin/Ace1CYzyACf Vf+0d1sd3KwuK4irlH/0weW7rjAAn2b9E1JyreDk4kgkmWZlqD4BCxPqiEYEEhEC AAYFAkH2nJYACgkQZL0IoGaeD6MiPgCgxGB9CzWLPpF7EefUB72pPklteR8An2N+ TGjV7MPx3TP31t0k6ijE/2hTiEYEEhECAAYFAkZe+BQACgkQ4J/vJdlkhKw/FQCe OJNnc1uReGQ+lDRK/fbMWsyNSQgAn3I4/JN0LCH9ilfpr2987DYi+HC0iQEcBBMB AgAGBQI/zfjJAAoJEAuerLG7SymnPF0H/RU5rv/kuCVmqv2slTODZYzLunWyPBXj siB4UJlHDyJm43SvTNPv4Ta9YzqGthKszbLgCTvo47oWXnRZPlCtahtSIPEd0o86 b1LJLV481utkTDNozSOqc+1/vcsSGNXh3tE+butBZ1bS7VREsGcC5MVuJh8wpC8p l9L/4L5bkhRM+hgjfUhCZBhngOPBQGEzKoKBeu91Y/dAfbmianYmBHOH8DEbCCNP 2Sll680YK6j2s/YrE63inczqdp3VDMhjUiUR4CLoGn3/fb6XRwT0reUNbBlziD34 6+gIMA1dr2e7PHolBrbNAvTAI50+S6hR4CkZ9rx+n0rQNP20FO7VvneJAhwEEwEC AAYFAkF3mZEACgkQX8tdKqjwLvW7kg//ZtVHiG99LPPoQWniUfH3sN0njOICebzE psAjig6GZh7cr6pj7AeaXlOSOVPQFGZSC+xwbiVjWGIZjNuCjcen94EMRswbYKSG f+qQwS7eNMeXTrQIV3CQGk7sYoTV+6CJ5MNMYUCTuBJLSvjuMkUMcDuLadKioRkF jb979v4F3bQGWEPZsdKLOCZyX2cNjVtCcDBlkhzYNy85PwzdiA5YdnoACxcfe8qz 6BpOC7kZiLN3yV5xXkU+uexQGBJY564+B57y+exBRvEYwKEIQwiq50qJN3NNdhN3 1HFdURzAV+KIzFXu43+SvtxR9F2OdfvPPHrN/Qpu4Ni1CBvypkG5XIkwd7xM3iw/ 6fh4/BFzYYIFqUADPFzkYKy6U4lls9BNL/Yk0JgEkLbrEayNW6QbM1j/j2wctUrb aEe6Imncp8VN8DHSjE2tOe1iHIj6G+9rywDXx4kb9hwqcOfpKL/0AoRzle6aTr7K nCpxBMXCIfQyLKEcJ9wiO3LCwBafJ7fmLJFUnRb4L7ZPg5gMejl0fquMtVKR+CyS LnhEqDwbrtIR5VOJuZlUFzr77HBL/T7rbxiU3mHONAI8T7dxs2fDv1+ktKeQtlLV v6DgOc2AaqbvgPO1LEtOdq9fN5aaoAi1EGBDVkIMdWDXdVYY8PnP7GXow2X3G+oM Ddl8+NpN3g+JAhwEEwECAAYFAkKfCxwACgkQ2MIKCVokV8/xBQ/+MBAGiuwATgRa lqxdV/PLCDHTaRKAqNf1kMhCMZ99ubECMPzXgI1QQa44AiTNmUUd4RNrBS3gzMjX nx4oPe6JjXCkP1grnBLMple2NTkaWU0Q/VQkbDxYvZaiPZuz9JTrilU3Z6L8+e6A zHVAs+EdIeYNxqeTfLUbFj+59AN9eJs7Ud7+uMWGeeDpiZUTcRXm2wdBRzfZi82q bSLREsIAAvOHr7uB5YarjQOh6lFTT2Jo0GAE3fzVlcSAzS0yV1hD3qtIQH6x7uXr KTAcTDYQoDJnPIOZSYiz0xbuoAuWISicGXVvlaJ03C5+qgQ9oHRbzALC9SvxPXZe OC63bjMC7YLXQRzZ+l4wkSjl+d2FfE6koAAC1vTzVx8febJ6eXbNB7mA3sO8gBRG j7oVzpqY2IAI+UqzyBuKVp7XElOKePK14mw3Dr0Ps/0MC63grWq6kLlAreGZzrS/ dD/4L1ZgxibFbQXmaElQ+2n7AgNCV7YeESafEPCVV82yScPxC1WlpVBUjqcmn4gc GBAQ62TBTg/2JL5Z7axiygv7KwDRiAb7lXtBRFidF3dCYOyA696K6CKXioXZwYA3 XIZXat2A5SfvH6NKVPzcultvqMWtvYceIx9OfiDiTCrInXnixOSn9cJXRk7SeAOo Q/PHczcYWeAz8kAkUzCYMLQwtusUkkKIRgQTEQIABgUCP52dtgAKCRAhkYDN20Km DkeUAKCKdRvqJlZLav7J8aZs+VHh45UmIwCgka/3mvy+0u2U8QdfHH9U2H2ndceI RgQTEQIABgUCQA2AagAKCRAqHoQY2VDGRzkxAJ4kR3qK5sz/RW34GRwgtpvqA3tm AQCfVz6ZbFeDgGtSzE+Hii7P2EGIz7CIRgQTEQIABgUCQC9h1gAKCRAYtrIyAv9x slhhAKCoaqimGJyUZZy3CmA5w9VeEQ/F8QCaAk5+ZnpWWitw9Px1srYz7Ps/knyI RgQTEQIABgUCQDe6OwAKCRAtu3a/rdTJM4p0AJ9ZetvNX6woPsu8P/vxOXW4h97g KgCffLe5NAJrQJEX/XqVyBz61UaKCRCIRgQTEQIABgUCQGhQ0QAKCRB81sDYi0Fb qWAeAJ9Box2B5/C/YTc8CqNbB03JYPMxDACgvth6MSFftyxQFSoFGe9A7exsyNKI RgQTEQIABgUCQGhS7gAKCRD2zzZt3CnlVIvzAJ0XTvHD9bKgre6hdyDFIuxuSef/ +gCfYOUsVkbwUqb3qA6hpbsl+jQHuvCIRgQTEQIABgUCQLD91gAKCRCzECrSTehe +AiSAJwJDLftzrq7Y7cOS8uNabiJkbFFUgCfTSM2QN4PN98bvII397o9TaWonxuI RgQTEQIABgUCQieafAAKCRAOLabAN5HGCsDbAKCrV2bphe81jwW3UIqWK30aPI2E QwCdEDxoHAQbFwQlriUUKEXbngBd8UOIRgQTEQIABgUCRiZ+5QAKCRBYiMxKKtdp 1k3XAJ95ZF9U+TW2jE9C6eg0cMXwc857FQCfZsUXM0YBMDemoV6MsUHLv7EllquI SQQTEQIACQUCQDqQOQIHAAAKCRDoDiJ7pAPsoBavAJwLUNAOOGHWauZJn06IhAW3 A8uGkwCfbU2LiJwyQ/y3nBhpAehsp8yiZBmIWwQTEQIAGwUCP52dOwYLCQgHAwID FQIDAxYCAQIeAQIXgAAKCRC0QmnQTypv0tjwAJ0U5YaKyE6YWm/qMQB7W8WRfQVc gwCfVjlWmVBudyFliAFzhr94/3Jq95aIYwQTEQIAGwUCP52dOwYLCQgHAwIDFQID AxYCAQIeAQIXgAASCRC0QmnQTypv0gdlR1BHAAEB2PAAnRTlhorITphab+oxAHtb xZF9BVyDAJ9WOVaZUG53IWWIAXOGv3j/cmr3lrkBDQQ/nZ08EAQAugOfLWJbKwMA 9vg2mJU594TZU0HRJkx/fqYhx0YxWWRpzplrEyvcDXuYcWi1Hwh0tD86T4fR5GV6 joWiWClzD+Hwhhb6gcSdeSGlGLlZAvWYtFSHWiv+3LaI9w8Vtczl99Bh2WiMDNDD Gw0RQg6ZaftldLSe4j1pffpFGQ8SuisAAwUEAKVxqLT7fC5xQ6oclcZ+PhoDlePQ 1BiTS7tuGM07bFF4nNvY91LL7S31pooz3XbGSWP8jxzSv1Fw35YhSmWGOBOEXluq MbVQGJJ5m8fqJOjC0imbfeWgr/T7zLrJeiljDxvX+6TyawyWQngF6v1Hq6FRV0O0 bOp9Npt5zqCbDGs/iE4EGBECAAYFAj+dnTwAEgkQtEJp0E8qb9IHZUdQRwABAf/+ AJwNVicN6A0I7EOfWx50PDHD7SHw5wCfUJkeh/XlCrGdPASe/AXZB44jl2eZAaIE PI92jxEEAKJ6P7KohUrZdFsywojJa3hs3SuHzt8/7oFymnTAA2zCHZkGslM0EtbX NgCoc/40+0CoXAKFzhCwktsbZJ6QcGr6nUK+tpEFO+Ku9Gmg23Pfl8AhAVtHEVuR qsp1aJKYx4U2wWtC0ZCC7I/slr3YlssoEnepUSZ4VkJhpFOCc6fzAKC8Kup8ioE9 Lqh5DbyVz8dYAhUjSwQAit9wtAWBHa60q+ca0IPEqSBfB29rIhNio4PEsUB941XE Lm3O8EUOR7fBgwZkbAeXWqgXfYK582QF9Y/Q3finGzDJa+48cZ+Dn7sGphMQSfRY 3Pd9870U1z+xXtCLjcrYsh49X7lGpqE9Cc4UsIYyLag0bmhS3gyjFS3llJHi1hYD /2NdApt8WSKs24Y6Yo0fmCb4mj+Mbe9KAL+UlrZ+bWIZth1S5AiDeNEKz5mmr863 4DzJEOAVUpbUoHJ4j2Icl1jSWlA5vSB6/ZPG2KOMYP7GqT6Ci68lAbwSMS3N8iF/ PcVV+04PQFqFZRNGUrk7QdFLriZlgqR5zB01n6QDbRtgtCpNYW5kcmFrZSBMaW51 eCA8bWFuZHJha2VAbWFuZHJha2Vzb2Z0LmNvbT6JARwEEAECAAYFAkNushsACgkQ Dvn2xlC5DUFX3AgAiIMe+xIZU+NLNQIjjgHsP4ontwXpEWaSapL0ufxeGasTUK2B S6lFVcZPuqWahnNjd4ETzwNdGmZIb/hP4Sh5hLDmFHDH5q9wIirHfNqQJu4hnal/ oP8pHQ4jDzdmdyziFxM7KaSNZypzCfEXaOeALOPRsprNOwmxuq4dq8iWOKrzKTHs Edl4uCdDRTyVGyAKjTpWr/jVxhSvP4BoswsY4KO6eAmVTHIlMfJISz78ix1aM3zd RTrqTj6TmFy3j4hKMIdYrINceF+jJDqJQSs4hx2REA2K1wHRiiZG7+lj7rM+wja2 2sjYjwaA42WhZUkHcw5/GQlZlEg5yMoyq8jXs4hGBBARAgAGBQI8j5RCAAoJEJqo 0NAiRYqYW9sAoLCeIkHima6e7Hk/35RlZXH81Tj0AJ4rNYxH+CA+xvKz0GYxdckY rzRnlYhGBBARAgAGBQI8kC0kAAoJEOJa9W6W3C+pkdcAniNAo/Qpuah4sQfIqL/d mFKvzhXZAJ90c1rXhV6rSFHajGkr2KgNYdG4VYhGBBARAgAGBQI8nNcvAAoJECAU 9duuEnAVWFEAoJoKKSoJgr3oEKv1wPbcX7i3gTDpAKCUlqsEaP+amU9SFChF1g73 TXSsIYhGBBARAgAGBQI8nNsnAAoJEJae79OXFtsKLUwAn3wAcZqdsX0I4UpAKAzk q93K1HBZAJ9ZTiPgafzF9I5VYOJKBgMsUN+zmIhGBBARAgAGBQI8vjYnAAoJEHW+ ByMT/qxgqSYAoITEy7R5+JTvvAjCuHO6yyEusIDhAKCDLRcjz6goybLK8H8QIQo3 OMe1K4hGBBARAgAGBQI/Y9fLAAoJEAVAMnUSMMYzzJYAoLXZWuB15ZVp8qRqI8aa t8oi8wbUAJ0YC2yLCrcbTca1C0jvy9r4KngsPIhGBBARAgAGBQJDvnH/AAoJEA8N e4Mg5YjtqMwAnRGeLWZ/eS/9/o/ZjroQ5lVGeRFCAKCG4Hj7OH3biZaVzjlDVI+E 4EDzD4hGBBARAgAGBQJFzhU3AAoJEH01OEiAPLwG+RsAoKJBsiV0UShGnUwkrMAF HNNbfSuDAKCWwkUdkoOCiMiwEQhDVK79m+0J9YhGBBIRAgAGBQI+QhwIAAoJECnD EYFcQZb7shAAn0N+13uI9Yz/eulVapC19Y4t1TZ6AJ9ALexUd9yS2uE8OGyC5LM2 ZMrS6YhGBBIRAgAGBQI+XRnvAAoJEBNgAYE58Lv0CkwAnivxzsbIAHULbwfHzSKh XeBGcxkYAJ9rgUz4zi0WCDj5THOEQ94cfz5864hGBBIRAgAGBQI/lQ/oAAoJELvy kpzxcFXQYDsAnj2ytgNhBYkT6TAa8PUzkhA774xrAJwMBoo9OaAQdSXhn4xH/Ztx gvjLrohGBBIRAgAGBQJBCi59AAoJEADbq9xz7cVYZ24AnjbATK28ycxYvncouVlW siqDx3hkAJ93q0OKgOT4L9VICOLOG43d63oFO4hGBBMRAgAGBQI/cXBPAAoJEBZP bR00jinYLGQAnjGvSjirxs6LU5nyUuTGTKwRaFo+AKCF52bhSRqjF0nGROaoeQzN tOPDaIhGBBMRAgAGBQI/cXBdAAoJEMwRmq0kUM+nJPsAn2nqCe+By4ZD4AMElTBe Vd1w9URbAJ9SpnOVuSQnjM2cQP1t3kdrCo6hcYhGBBMRAgAGBQI/11d9AAoJEERZ Nfh40Bn1wxMAnR5QfCFXtMiYT4qH5Okh7qaWgPhOAKClfahvQOUvnFhSDz2v6dtv gnrL+4hGBBMRAgAGBQI/11iIAAoJEN1oTXomdSYkLSEAn3Smemn0SUvsjR3guxXL M82ThGFxAJsFChZAmUlAAn2jfeHxTissX8g4uIhFBBMRAgAGBQI/5TrUAAoJEIvY Lm8wuUtcBJoAnRmyU6Ax7JMJoaj6dLL9xORhegv4AJUfFwwkkN65V1ITnfDzFa09 SOyMiEYEExECAAYFAkMOC7cACgkQmcxCmjBUBteCHQCfQsYSND7bV2YbPt+r8G8d bnnjWIcAn3c07wKyoEU/CxBWcbOfMwZ6uwJFiFcEExECABcFAjyPdo8FCwcKAwQD FQMCAxYCAQIXgAAKCRDniYrgcHcf8x86AJ443ovF4CsXJAtEC7XzedooURgKzgCf VMrsPXfSqeXJXxKS04ygK0OmJaeIXwQTEQIAFwUCPI92jwULBwoDBAMVAwIDFgIB AheAABIJEOeJiuBwdx/zB2VHUEcAAQEfOgCeON6LxeArFyQLRAu183naKFEYCs4A n1TK7D130qnlyV8SktOMoCtDpiWniF0EExECAB0CF4AFAkSzgi4GCwkIBwMCBBUC CAMEFgIDAQIeAQAKCRDniYrgcHcf84iAAJ49Ck2WUvfoxWSlmmMpnM1vym0HHACf RCGDo/90haN7tYe82t+HwTjUH9i0Jk1hbmRyaXZhIExpbnV4IDxtYW5kcml2YUBt YW5kcml2YS5jb20+iGAEExECACACGyMCHgECF4AFAkSzgjYGCwkIBwMCBBUCCAME FgIDAQAKCRDniYrgcHcf8wyaAKCto5VYq0f6E2j38kmHHIHtt3kDPACfcBMF10vD WHonOjbuIcJYgB8FNfW5AQ0EPI92khAEAO0Z8ZajF6sP96BhmeAw/SPn9WXt0aya o37JA8a+Lo74exNqTEa7pF8/sb+hHcigH9y7VeZtMlhz+dzq9Xndb1sq05zjlCMX Cyd6Z0ssUxRHpwgAs9cFsn8kBI5elbdJDJG/rt0IC+hRTP/YdR+x8gzm81vbk7e8 ff8XAbc7dtOLAAMFBACFt8q5+0x1X5NPvwqkq6UKOR9YJmATCt87pRZ1XCQlk9Vy MyjC7ArSJQpwEC2KB6O9dQXs0Pm3AAVvjbXoMQKuCKyV3C8ubcDeHHsT/uA1aLLp LhjGX1bsvIuV22KmR4FO6Vg1N2g95PbeEPhzvAro4xofEbt8i50ifDpo61nv/ohG BBgRAgAGBQI8j3aSAAoJEOeJiuBwdx/zKfYAn1D3J8iqWuAwExEf3ygyBbQP1oVM AKCxXARykgrcQ1Ng56HO0o8Z25kHgZkBogRHllszEQQA1PJdiHJEs4HVEtXZ9FjD O8FyuLHqBbBx0MP9LpxwkAsacgzJ50ylfOqeSk20dRQ3XmmZWNMglfiBrIiMS8rl HSZ/L7gOYAOWZFK/Pfx7VmnmVZe+yRyEMb4Q0QVgjjuEDba2WFrxm75fN8Jf8zn3 SxLPCBhJbdC4H6IckwNan68AoPx2nLQw7HF7D5aOSXpP/t0R1Xg9A/99K4gqX6Sy Tpoa2i4NRG1rBNJjfSELJflgz3aGKGwe+s+nh93t/OtfFsz/y0xuFrlW8KUkqpl8 n3VaV8VsxEn0/KtAfAhqR3/0mv0/y3pqIZkZy75H/7QH8RZgzJtYznsCSBPUt+Yw DRh1SXMZn0TaT1gu7h56o6KZ7Jg5C5DBHQQAumHKQznDCWfbCW7fyTWQWqE+QpbY DA5UjedLdr/yeXpvKjC6gkjReVCcnSxZ3jx0x8uoFY1m6nAtJ3BczqjNcuuOFKew aCkgK9YUU5ejMPUt1H2WWdGpdybVrfMtHhSFt0D+usNQC9Cztm2TAbjr4W+tw17+ Yh6K3MZNMiBW28m0Qm9wZW5TVVNFOkZhY3RvcnkgT0JTIFByb2plY3QgPG9wZW5T VVNFOkZhY3RvcnlAYnVpbGQub3BlbnN1c2Uub3JnPohGBBMRAgAGBQJHllszAAoJ EDswEbdrnWUjs98AoJz1m0p8jkb+DrpXulIxeH2CL7KSAKCK898YwOH0chE7AEi5 2jaoYiY6oohmBBMRAgAmBQJHllszAhsDBQkEHrAABgsJCAcDAgQVAggDBBYCAwEC HgECF4AACgkQHHIcJFa0F3rwbACgjnknJ5R9n1lQSRh0zlSdzOMgagwAmwXjZD7l qNOQDkNzNXSxNYZDd+hvmQGiBEeWW0IRBACKYbOW1tQdRc43WijD01BiO1ko6QiF SR/JgYjg97fCTUFNBpuB4PwAXvPzVXnurdpMNeuAADuvBkCggvf/PhQ/tf1nd89M xuki2a5mh3LACR4xolr3ADThw+a2HxEuZMmElqOHuXKEFHBzSSOtEaDh4tkETTIQ U0CDKpeAgRR63wCgx+M+4xZH2HuPGuEtI5oqhfLMgacD/R6KlLjnNHsLaNOSE7ZG hZXzzMLo6gMnJxQiIHjmz3UY6I/i1Kp9KMlg2C/YTVKDtAZY5uTqdL1Dwcr2W8// Qy3NoXWnfoXCeBCq1Q9HkfySqGHlLiIatuxgoLe1P07FhM+XLXZZq1iidsLpJS6j p76d1rCjMF9J1nFuj54r5BhQA/9JhpBautBvPg05JZtAMkv6cBkIOWohaJpDz5qw 9HeZZPg7ex+uLcd3svZNMwppoc/Aiw28W1n8sYWcV9FiikSsTT4Amt7DGzBtHDJN HoOZAlt8qC4qzxEpJtBZFjPmqbmpKNICmo5Vtk+HoI92NYDcrr8+jKnrIm7GFfWV 3qU4arRCc2VjdXJpdHk6cHJpdmFjeSBPQlMgUHJvamVjdCA8c2VjdXJpdHk6cHJp dmFjeUBidWlsZC5vcGVuc3VzZS5vcmc+iEYEExECAAYFAkeWW0IACgkQOzARt2ud ZSPU0wCgrEAM1bo9oS/OmPaFP6KgvRCbHkcAniN7gjcHPUwgkE9kTrWBDHSO1ljg iGYEExECACYFAkeWW0ICGwMFCQQesAAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK CRAADEtt49vTzVkAAJ93KK7XuMaLCqZnkd3rqnX1Y1b/xQCgk7xnntv+732TCrZH k/oVP1VewlU= =zobT -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/directory.yast000066400000000000000000000000171476576476200277700ustar00rootroot00000000000000media.1/ suse/ libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/license.tar.gz000066400000000000000000000000551476576476200276350ustar00rootroot00000000000000WK  Om77'(libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/000077500000000000000000000000001476576476200260435ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/i586/000077500000000000000000000000001476576476200265365ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/i586/SHA1SUMS000066400000000000000000000001021476576476200276560ustar00rootroot00000000000000c8db67006900a7758dda69efee189c5eb39d206c dnsmasq-2.46-1.i586.rpm libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/setup/000077500000000000000000000000001476576476200272035ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/setup/descr/000077500000000000000000000000001476576476200303035ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/setup/descr/SHA1SUMS000066400000000000000000000003301476576476200314260ustar00rootroot00000000000000965ba5faeea815d41ba308ffd193b78505b26c1c directory.yast 3d0cdf34257cc2c54929bf5414969142cad1d421 packages 2d68731ab2f3c86b81f7672798f871cf96b2d0fc packages.DU 07c36c760ed0c58b58d6d8fcfdd2717df02c4256 packages.en libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/setup/descr/directory.yast000066400000000000000000000000601476576476200332050ustar00rootroot00000000000000directory.yast packages packages.DU packages.en libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/setup/descr/packages000066400000000000000000000021201476576476200317770ustar00rootroot00000000000000=Ver: 2.0 ##---------------------------------------- =Pkg: dnsmasq 2.46 1 i586 +Req: /usr/sbin/useradd fillup coreutils grep diffutils insserv sed /bin/mkdir /bin/sh /bin/sh /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 /bin/sh libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.2) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.3.4) libc.so.6(GLIBC_2.4) rpmlib(PayloadIsLzma) <= 4.4.2-1 -Req: +Prq: /usr/sbin/useradd fillup coreutils grep diffutils insserv sed /bin/mkdir /bin/sh /bin/sh /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadIsLzma) <= 4.4.2-1 -Prq: +Prv: dns_daemon dnsmasq = 2.46-1 /etc/dnsmasq.conf /etc/init.d/dnsmasq /etc/slp.reg.d /etc/slp.reg.d/dnsmasq.reg /etc/sysconfig/SuSEfirewall2.d/services/dnsmasq-dhcp /etc/sysconfig/SuSEfirewall2.d/services/dnsmasq-dns /usr/sbin/dnsmasq /usr/sbin/rcdnsmasq -Prv: =Grp: Productivity/Networking/DNS/Servers =Lic: GPL v2 or later =Src: dnsmasq 2.46 1 src =Tim: 1226926770 =Loc: 1 dnsmasq-2.46-1.i586.rpm =Siz: 290023 826308 libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/setup/descr/packages.DU000066400000000000000000000040751476576476200323210ustar00rootroot00000000000000=Ver: 2.0 ##---------------------------------------- =Pkg: dnsmasq 2.46 1 i586 +Dir: / 0 840 0 61 etc/ 19 6 1 4 etc/init.d/ 3 0 1 0 etc/slp.reg.d/ 1 0 1 0 etc/sysconfig/ 0 2 0 2 etc/sysconfig/SuSEfirewall2.d/ 0 2 0 2 etc/sysconfig/SuSEfirewall2.d/services/ 2 0 2 0 usr/ 0 815 0 56 usr/sbin/ 149 0 1 0 usr/share/ 0 666 0 55 usr/share/doc/ 0 476 0 42 usr/share/doc/packages/ 0 476 0 42 usr/share/doc/packages/dnsmasq/ 188 288 7 35 usr/share/doc/packages/dnsmasq/contrib/ 0 288 0 35 usr/share/doc/packages/dnsmasq/contrib/Solaris10/ 4 0 2 0 usr/share/doc/packages/dnsmasq/contrib/Suse/ 10 0 5 0 usr/share/doc/packages/dnsmasq/contrib/dns-loc/ 17 0 2 0 usr/share/doc/packages/dnsmasq/contrib/dnslist/ 29 0 3 0 usr/share/doc/packages/dnsmasq/contrib/dnsmasq_MacOSX/ 4 0 3 0 usr/share/doc/packages/dnsmasq/contrib/dynamic-dnsmasq/ 8 0 1 0 usr/share/doc/packages/dnsmasq/contrib/openvpn/ 7 0 3 0 usr/share/doc/packages/dnsmasq/contrib/port-forward/ 4 0 2 0 usr/share/doc/packages/dnsmasq/contrib/slackware-dnsmasq/ 6 0 5 0 usr/share/doc/packages/dnsmasq/contrib/try-all-ns/ 4 0 2 0 usr/share/doc/packages/dnsmasq/contrib/webmin/ 174 0 2 0 usr/share/doc/packages/dnsmasq/contrib/wrt/ 21 0 5 0 usr/share/locale/ 0 128 0 10 usr/share/locale/de/ 0 3 0 1 usr/share/locale/de/LC_MESSAGES/ 3 0 1 0 usr/share/locale/es/ 0 23 0 1 usr/share/locale/es/LC_MESSAGES/ 23 0 1 0 usr/share/locale/fi/ 0 1 0 1 usr/share/locale/fi/LC_MESSAGES/ 1 0 1 0 usr/share/locale/fr/ 0 24 0 1 usr/share/locale/fr/LC_MESSAGES/ 24 0 1 0 usr/share/locale/id/ 0 14 0 1 usr/share/locale/id/LC_MESSAGES/ 14 0 1 0 usr/share/locale/it/ 0 1 0 1 usr/share/locale/it/LC_MESSAGES/ 1 0 1 0 usr/share/locale/nb/ 0 14 0 1 usr/share/locale/nb/LC_MESSAGES/ 14 0 1 0 usr/share/locale/pl/ 0 32 0 1 usr/share/locale/pl/LC_MESSAGES/ 32 0 1 0 usr/share/locale/pt_BR/ 0 1 0 1 usr/share/locale/pt_BR/LC_MESSAGES/ 1 0 1 0 usr/share/locale/ro/ 0 15 0 1 usr/share/locale/ro/LC_MESSAGES/ 15 0 1 0 usr/share/man/ 0 62 0 3 usr/share/man/es/ 0 21 0 1 usr/share/man/es/man8/ 21 0 1 0 usr/share/man/fr/ 0 22 0 1 usr/share/man/fr/man8/ 22 0 1 0 usr/share/man/man8/ 19 0 1 0 -Dir: libzypp-17.36.5/tests/repo/susetags/data/addon_in_subdir/updates/suse/setup/descr/packages.en000066400000000000000000000013201476576476200324010ustar00rootroot00000000000000=Ver: 2.0 ##---------------------------------------- =Pkg: dnsmasq 2.46 1 i586 =Sum: Lightweight, Easy-to-Configure DNS Forwarder and DHCP Server +Des: Dnsmasq is a lightweight, easy-to-configure DNS forwarder and DHCP server. It is designed to provide DNS and, optionally, DHCP, to a small network. It can serve the names of local machines that are not in the global DNS. The DHCP server integrates with the DNS server and allows machines with DHCP-allocated addresses to appear in DNS with names configured either in each host or in a central configuration file. Dnsmasq supports static and dynamic DHCP leases and BOOTP for network booting of diskless machines. Authors: -------- simon@thekelleys.org.uk -Des: libzypp-17.36.5/tests/repo/susetags/data/dudata/000077500000000000000000000000001476576476200215365ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/000077500000000000000000000000001476576476200225035ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/content000066400000000000000000000001751476576476200241030ustar00rootroot00000000000000META SHA1 b75eeb1b3d231ccb6322c91417050520f992949c packages META SHA1 cb96552f7a57eb21f3279310c1c339e6b22924d8 packages.DU libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/media.1/000077500000000000000000000000001476576476200237215ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/media.1/media000066400000000000000000000000521476576476200247200ustar00rootroot00000000000000SUSE Linux Products GmbH 20070705102239 1 libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/suse/000077500000000000000000000000001476576476200234625ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/suse/setup/000077500000000000000000000000001476576476200246225ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/suse/setup/descr/000077500000000000000000000000001476576476200257225ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/suse/setup/descr/packages000066400000000000000000000004041476576476200274210ustar00rootroot00000000000000=Ver: 2.0 ##---------------------------------------- =Pkg: dutest 1.0 1 x86_64 ##---------------------------------------- =Pkg: dutest 2.0 1 x86_64 ##---------------------------------------- =Pkg: dutest 3.0 1 x86_64 ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/dudata/repo/suse/setup/descr/packages.DU000066400000000000000000000005331476576476200277330ustar00rootroot00000000000000=Ver: 2.0 ##---------------------------------------- ## / localK subK localF subF ##---------------------------------------- =Pkg: dutest 1.0 1 x86_64 +Dir: /norm 15 0 1 0 /grow 15 0 1 0 -Dir: ##---------------------------------------- =Pkg: dutest 2.0 1 x86_64 +Dir: /norm 45 0 1 0 /grow 45 0 1 0 -Dir: ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/dudata/system/000077500000000000000000000000001476576476200230625ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/system/content000066400000000000000000000001751476576476200244620ustar00rootroot00000000000000META SHA1 95a347a40f621834a870e10b8914c9442c2dc355 packages META SHA1 7d11955486b049be5f601b82acc18bfc73c22f39 packages.DU libzypp-17.36.5/tests/repo/susetags/data/dudata/system/media.1/000077500000000000000000000000001476576476200243005ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/system/media.1/media000066400000000000000000000000521476576476200252770ustar00rootroot00000000000000SUSE Linux Products GmbH 20070705102239 1 libzypp-17.36.5/tests/repo/susetags/data/dudata/system/suse/000077500000000000000000000000001476576476200240415ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/system/suse/setup/000077500000000000000000000000001476576476200252015ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/system/suse/setup/descr/000077500000000000000000000000001476576476200263015ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/dudata/system/suse/setup/descr/packages000066400000000000000000000001721476576476200300020ustar00rootroot00000000000000=Ver: 2.0 ##---------------------------------------- =Pkg: dutest 1.0 1 x86_64 ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/dudata/system/suse/setup/descr/packages.DU000066400000000000000000000003521476576476200303110ustar00rootroot00000000000000=Ver: 2.0 ##---------------------------------------- ## / localK subK localF subF ##---------------------------------------- =Pkg: dutest 1.0 1 x86_64 +Dir: /norm 5 0 1 0 /grow 5 0 1 0 -Dir: ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/000077500000000000000000000000001476576476200240105ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/content000066400000000000000000000022161476576476200254060ustar00rootroot00000000000000PRODUCT openSUSE-factory VERSION 10.3 DISTPRODUCT SuSE-Linux-STABLE-X86 DISTVERSION 10.2.42-factory VENDOR SUSE LINUX Products GmbH, Nuernberg, Germany RELNOTESURL http://www.suse.com/relnotes/i386/openSUSE/FACTORY/release-notes.rpm ARCH.x86_64 x86_64 i686 i586 i486 i386 noarch ARCH.i686 i686 i586 i486 i386 noarch ARCH.i586 i586 i486 i386 noarch ARCH.i486 i486 i386 noarch ARCH.i386 i386 noarch DEFAULTBASE i586 REQUIRES openSUSE-release = 10.3 pattern:basesystem PROVIDES product:openSUSE = 10.2.42 OBSOLETES product:SUSE_LINUX product:openSUSE <= 10.2 LINGUAS cs da de en en_GB es fi fr hu it ja km nl nb pl pt_BR zh_CN zh_TW SHORTLABEL FACTORY LABEL openSUSE FACTORY 10.3 LABEL.de openSUSE FACTORY 10.3 EXTRAURLS http://download.opensuse.org/distribution/10.2/repo/oss/ OPTIONALURLS http://download.opensuse.org/distribution/10.2/repo/non-oss/ http://download.opensuse.org/distribution/10.2/repo/debug/ DESCRDIR suse/setup/descr DATADIR suse FLAGS update LANGUAGE en_US META SHA1 cec02abacb62fce2964a787d516879822691be6e packages META SHA1 2664997a3bae2679cf1395a81d54a7dd4532c276 packages.DU META SHA1 1c539c3fe4a8ec5fbe96ce3b559fc952124f9acd packages.en libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/suse/000077500000000000000000000000001476576476200247675ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/suse/setup/000077500000000000000000000000001476576476200261275ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/suse/setup/descr/000077500000000000000000000000001476576476200272275ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/suse/setup/descr/packages000066400000000000000000000012701476576476200307300ustar00rootroot00000000000000##---------------------------------------- =Pkg: foo 1.0 1 i586 =Cks: SHA1 05f0647241433d01636785fd282cc824a6527269 +Req: bar > 1.0 -Req: =Grp: Bar =Lic: BSD License and BSD-like, GNU General Public License (GPL) =Src: foo 1.0 1 src =Tim: 1183399094 =Loc: 1 foo-1.0-1.i586.rpm =Siz: 16356019 38850584 +Aut: Foo Bar -Aut: ##---------------------------------------- =Pkg: foo 1.0 1 x86_64 =Cks: SHA1 05f0647241433d01636785fd282cc824a6527269 +Req: bar > 1.0 -Req: =Grp: Bar =Lic: BSD License and BSD-like, GNU General Public License (GPL) =Src: foo 1.0 1 src =Tim: 1183399094 =Loc: 1 foo-1.0-1.x86_64.rpm =Siz: 16356019 38850584 +Aut: Foo Bar -Aut: =Shr: foo 1.0 1 i586 libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/suse/setup/descr/packages.DU000066400000000000000000000002341476576476200312360ustar00rootroot00000000000000##---------------------------------------- =Pkg: foo 1.0 1 i586 +Dir: / 0 39444 0 3068 usr/share/ 11 0 1 0 -Dir: ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/shared_attributes/suse/setup/descr/packages.en000066400000000000000000000002411476576476200313260ustar00rootroot00000000000000##---------------------------------------- =Pkg: foo 1.0 1 i586 =Sum: Foo program +Des: This is the description -Des: ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/000077500000000000000000000000001476576476200241125ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/content000066400000000000000000000041541476576476200255130ustar00rootroot00000000000000PRODUCT openSUSE-factory VERSION 10.3 DISTPRODUCT SuSE-Linux-STABLE-X86 DISTVERSION 10.2.42-factory VENDOR SUSE LINUX Products GmbH, Nuernberg, Germany RELNOTESURL http://www.suse.com/relnotes/i386/openSUSE/FACTORY/release-notes.rpm ARCH.x86_64 x86_64 i686 i586 i486 i386 noarch ARCH.i686 i686 i586 i486 i386 noarch ARCH.i586 i586 i486 i386 noarch ARCH.i486 i486 i386 noarch ARCH.i386 i386 noarch DEFAULTBASE i586 REQUIRES openSUSE-release = 10.3 pattern:basesystem PROVIDES product:openSUSE = 10.2.42 OBSOLETES product:SUSE_LINUX product:openSUSE <= 10.2 LINGUAS cs da de en en_GB es fi fr hu it ja km nl nb pl pt_BR zh_CN zh_TW SHORTLABEL FACTORY LABEL openSUSE FACTORY 10.3 LABEL.de openSUSE FACTORY 10.3 EXTRAURLS http://download.opensuse.org/distribution/10.2/repo/oss/ OPTIONALURLS http://download.opensuse.org/distribution/10.2/repo/non-oss/ http://download.opensuse.org/distribution/10.2/repo/debug/ DESCRDIR suse/setup/descr DATADIR suse FLAGS update LANGUAGE en_US META SHA1 3b3a4b0f085dd3605b61cdec06783b6b2a1f1d61 kde-10.3-71.noarch.pat.gz META SHA1 2c351e103b347ef2984cb2aa638accfeadfaef58 packages.DU.gz META SHA1 208a6f8e1c96e9ba2ea7c74c05113c11c7378823 packages.en.gz META SHA1 59d65b8575ba1edde1813fef2e9949ae85f4d4c1 packages.es.gz META SHA1 061c361edf6157bc4273872055822e9d1766b8c4 packages.gz META SHA1 8ae8446949182a9908c7d07b7bc58fb718cf3a92 patterns.gz KEY SHA1 c0354069c10819674da8706822e1d4bd0c1797e9 gpg-pubkey-0dfb3188-41ed929b.asc KEY SHA1 2e38e503c436c5d002bdc31755c82188044d9d21 gpg-pubkey-307e3d54-44201d5d.asc KEY SHA1 7025932e6866932f489421990075f3ed312023ea gpg-pubkey-3d25d3d9-36e12d04.asc KEY SHA1 fd6146cac8c1473c5b52548936de773d5bbd5610 gpg-pubkey-7e2e3b05-44748aba.asc KEY SHA1 cd7adceba1fe5d7ba27b5749718743192d82f802 gpg-pubkey-9c800aca-40d8063e.asc KEY SHA1 7535d79e31ef7b4232e5593bb49d9142978b2e95 gpg-pubkey-a1912208-446a0899.asc HASH SHA1 875e73cf2ee139203208c860fbfd7fa5cb291c7e license.tar.gz HASH SHA1 4aa8ded6302e6ec85690a51af6044dffe9b21923 control.xml HASH SHA1 82f1f17ce74f0cd3fca4813c178196b317fc952d installation.xml HASH SHA1 68d9b548d61e31e82e8834690e884afa27751287 media.1/info.txt libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/content.asc000066400000000000000000000001101476576476200262440ustar00rootroot00000000000000FTx ?:'ưW2W@xW@E>=ٸϥ 6glibzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/content.key000066400000000000000000000204531476576476200263020ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQGiBDt3zUARBACCnzYUCVO/35iVN0T6J2Qb4GfDzrq8ZOqCamjD9tSylJ+UI4Co YBks0HWnWty231Aoil6q76LRqE4bcEiJ/xuwinLFNC/S24B1cR98aq5tUEEbPJ44 MBdY3LVbB4HCCMZH56nivx4thaTiCkVnyHpGkfKStk3lUkAVk2NR/C3uVwCgnp1D qWaTn46JxIsEQMU8dczkeyED/j/J6QqCRwYR8XmlAUfI5ozIsQ7LuA1nY/NJ9Nnh w2Wkq0UBZCqP/Nbfmr5EOri6MOPD9tIFRAy4qBqkxvgy/zKfX9qJkqx3o+DVrL4y CFZHI0aUwqXvEAT6GJyDPi45gnHOVE9XJRL6BL9ZfFmOd4ajH2AJ4yy/ZqbX0GjR opRuA/0SN8OK1ERDAA5AgZj9L2ZU7zMVmiWE8/Q+qz9p2TEfkfO8NyvvzK1Rv0iU p0WuJn9gorBr93Sc9XtX3lINZ1PJUQg7KQbpfeWHMa1pxUMnIFVjpYZMmVFFGWZw 0q+45T9uMr50cvMr4pYtnvat5tyKM0igPtezMqSY2aY7LyZMmrQbTWljaGFlbCBB bmRyZXMgPG1hQHN1c2UuZGU+iFcEExECABcFAjt3zUAFCwcKAwQDFQMCAxYCAQIX gAAKCRA/uJ46J8aw5H+tAJ4ktFPz9sQGuec1LaX0pIB3oZVAvQCeP+jNfv9ZbVHI Uz8bw8JBgwAe2w+IRgQQEQIABgUCO3fOdgAKCRDHUqoysN/3gB9xAKCLvhrIusLe 6wH0ByiA1ON3R5TNPACfY8W/eTeDSu9xNIlSCFMgDHw05cqIWgQTEQIAGgULBwoD BAMVAwIDFgIBAheABQJIZg3kAhkBAAoJED+4njonxrDkE5oAni0UwlVNIaklPunu iNb44D+AcgwRAJ47KCtevu20oesjoYkKhFNSLT14E4icBBMBAgAGBQI/xnvXAAoJ EBlUT2RolefhXTwD/iXBc3oVl/jyeV2qoUB/cB1+quxpVSkjC/MnOjtmU7lXtNBj dS7pZkMHyLDhT3VCTxvWTNM5sdS8hyQcSMATQ/axySFEy98tj5veZdMWcn9doyOP OIpNhAv55iMsuvAP/cd26VYJDx4Amlv7BXlIw9prYZrePZrZVlSpXOnGQ9JoiQEh BBABAgAMBQJCyOiqBQMAEnUAAAoJEJcQuJvKV618ALgH9igCYlbAeAAs+WTHoBgO r4DFI7xREXf+AfPxraa/vLyH0cwDRej40aOnzEnwBSIC/DH+7Oy41aKunELyNtJ/ DTkextRs2DzDhMGmYadHS8V1CPdLLA/q0rmtdGA6t2D2xhIdPXuO7+gHuaEydGTA /KFmyE8XE0pDYHyhsrBeelSBPZS1dDcJx7vib1GQPHUydOI8PRKJbn+kxwjNqGzJ m17sGJaxLPH8iWby8bEjmCFU31x+t+ia6sYSO7CsbwHL2mxuwfDE+f8QXiYFKDZB t/pN0ky6iiBGoCyu/OrT7nqRmlmanRprotZ/2gW+pYGIQ1sHrcZQz/GMov7CWXGu i4kBIgQQAQIADAUCQhcYbQUDABJ1AAAKCRCXELibyletfCOHB/92VkN0tLaC2nWJ hOaMP2XGQbm8f09BphSdb8pxxMqnUH1W8YkCNjLvoRGN5exxb7cpfrymSqdjmSh1 bVkREh4zzx5zd8Fhush5wqXq4PItV4Z+Es7kuZV/McG9mMoGqxI2WUyrZdXdOMFJ O7ABEFtw7iCdzh9tVenX71U/2ePT/Ab8iWXcT5Xei4X1eQBtQ3c/2B6i9TDuH4Q0 Cd8C89qyhzDaxrlX2dXfU/mwqIh/+6I4mwnAFBQ0RUtniXX4YARG5TuKYhDvfBod vj6ACj518Kazlu8eOyUtZr+w1ntc22veQ8im7qpMqpMAqEYmpO7B6wYb/BOOxTBD +pROcj3ziQEiBBABAgAMBQJCT68CBQMAEnUAAAoJEJcQuJvKV618IwIH/2pIkrl7 OWSIoZADqVC7w6eXF17sV5TXLqJEPaHVuS6e+RnTbcRut7lPbx3wFVWQflFhn/fg jkTUkTpcwbBrl199OA6k1yQPdYCJb1KuFP8aipWvlUjJcqUnHJS0ub7eSqWLeXcq 8cIufLMVNIcImU9yBoTVo4t7bezcO5LBC9l58B0uO11TwUlJ0pXAGUqznlAC7EuO uLUnZr/6G+PzpWDEJN6QjBdRnn9qIflefkTXdsqUb2ByB5/SMJ3FgHkPZBx1Mqgm IXvW05uQd4uyHJ0t9azvwxtgHgNH3y+FBkglP7yhRfBxwvMZbLJZft7xnXLMgdfH M8Sj6pwmlSI9cnGJASIEEAECAAwFAkJiN0UFAwASdQAACgkQlxC4m8pXrXywowf/ QzsKRLsWvMvNlYixCp2xF26ZKLpMUddmOxbqrJPCmITCkVO6fJjuegAwWBD9CEgg 2RfCZ4n2thwsbLWCRjYrwUzgbA0s4h0NE5mjsuOwQmKHjPXi0Fn3tx3teA7/GVPB cqEGHnHVXx9guyGiwqugMRsYfYXEbDel68fo9Z7MraLwbTB2gSOJdEkCM0KtBNYd ZUG7Q4m8qK8kBGjhBjCK0jgsaJK0FLRNlT5dGnwG1ggnnQEr9x6U2BwikfzaodDp J80o3Z9PBr5OiDxXPb9kMgW9VwRpBBwvCi5ltAn8NtfIsPlQYwmb0FXyh7AXxlx0 f2dS+IxMAd8POqhiABLJ0IkBIgQQAQIADAUCQmLeuwUDABJ1AAAKCRCXELibylet fHGDB/9u0yi/Wk/mrFzrvwI4AOb92E7427Le3USIKUuWZSMqzAAVeNgCgKfy/NbY gs6Kttb56+HnUJJ/C79YDh4qABe0hGiIgik+dUj/t2FBIz35cc2rS76hHXm1lWQC 0Si48AKPqhqzWCwzwt6aerQIg1IBkSmINKF6LrTIraYjh6UsDnLqLrlxnosXP4bT byIKH2mTT3bboR8iaYyzxKV0ccydHE0jp0Dffx3x4wH5CKHrEJt1lhSKdDexM5yG lAa+haUDKRulODNVljtx5m84vOgpwdg/JphLBJ24jGhHUS3PI3cXf+TV97J3YYQo XITC9lRNqk3GZeWWyUu3r0XB/hp4iQEiBBABAgAMBQJCdVu9BQMAEnUAAAoJEJcQ uJvKV618HHcIAKOHqHyRSw+4jg35JfVcLgrZn/3G4cDl35cAtZ5iz6ukEg8vpzH3 rMfiFYV2WQNflQ2tIrD9ZwSjJVAXNEL1eX883HAL7HmHFCqaQTusZb7vpbzh18fU Tjl4Nq3K9FqIIfJzJ8lPxGit6eL82OO/WUffjQAA9Ad+2yY/yWOyqUN4dqzxUWx4 9F1Q2UDBGiu/QhcEhUlPf6B21I1nqsSkOMGtRiHf7RfrGDss2xRn+0PDrpRDcpmV ZxJ4JpKQSDBKqbktlcdl95y9gI6llpJXFFQugxGwsC4qr6UYw4RloAdkpwz6aAlk rfFgCZ5KhkLs4HQkdZLr+zq7zJh5njuBnJKJASIEEAECAAwFAkKHod8FAwASdQAA CgkQlxC4m8pXrXxEdAf+Juexqg2/qC8vP+OnTuuDzTALHdSzt81Gq8a9jMHVs4rA gAAEKbKzrRgnAjI7wyGSxU1kaPNh+RQB4qtZy4x7MlJtRfcfSlAWw7i3rqKQakpY xUQEXLt/nK8kWxd2nC4gMW0105J+lBSMiCAw174/h36RjG//Cv17AhzGOckFE0n0 7gZlW/+5YnjvFemP8lFnL5kb5BzPPiJy8J1VnqvXY95n3HxhkoiTSrXlS0MNNLgG h27C+Kzl+p4X/T1esWoZe3pbq+qSb4xnglXOqzGJduQ0s585907ohm09m++e6NXK hxxysu4cvcMv2Cc4ep9HglEY6sVrwY/0pMpBYdMLBIkBIgQQAQIADAUCQomcnAUD ABJ1AAAKCRCXELibyletfDfnB/9ELbGLL7OIsOwCDidj1f/sabT/aFJ4LX15nm1B mW0huKLRdJuzX7XZkcTx6SohTcTgFIfXxV1RLt/7wrW5TTRrYmDRyk0CR1EZlfgz yLUaG+18ml7h97DZqSIaWnsqnryJB1QPyGO6yBUQTQ/KcGMyw2lzY2ovtl/UheIu PT0v3v12kFxOo1xYeBn81YHQKPMWJhJ+iOmhjbj89W6RZ8swgSd9pczv0ptfUFIm X5NbmIFxaiwWkRraUZYjdYYJGIainE9DpcMsSaSV7tq+mPl5NYVJPzW+llPPTqo6 zIKxIByiVfH0zac/xecGyKe1RhBYJ34fdK+GcM8FYcWkpxOqiQEiBBABAgAMBQJC m2c0BQMAEnUAAAoJEJcQuJvKV618OnMH/209R6nyz26CxVS4PtYYzMlOZ5VlOl/U BEmRqmJeY/frgucejxX90qHUOy1dgBhJXQ05H5zHU7B0UHoha5KnSSyT2/p7owBu AypZVvJB8PxxepPXUVfhiipR+7jWnYAsc6tjWn/+dE/ryO5iEWWAGDI0ZQ6dd/9C sz4jDeffQusWB6g5ebfL6+SBHa5N2PCydGr047fG0KZm2jposMPsXbIuKh6LSTaL QxGUyyJ+tTNfwstFYMlmawLMHtjb8F5r6FT7bywVlVHr7t2DctaoxULvlvogtCuE 7B9fG2EPg0sw6yK6P2zjGs+uv2qPO15vVWFLnQJ2eXrY1eNoUL/N+5KJASIEEAEC AAwFAkKcuOMFAwASdQAACgkQlxC4m8pXrXw8Jgf/UKw9NzMIFXf1LfuKW3hH2dhd OYyVnsYmuPy4HQTk0It579t0Mc8b4nrT4Bm5Id//SzxhKI0mGNxtLKXTiHOsTmEU KLeBXRaw7snnq64vaYz5NU9LdW/GX1vt4QtiGaLvZq/INUwB2jobqqcMwfw9n295 IEeKSuu0PcttZNfLGg06wBashAMl9h42ZakxlbYpbOPj0k/MdoB8EijdO3d2M4eV DJKQNj7XiYE+yNmecEGkxaEJBma0xloA0iiGdPJHFlK3dHKKI93A/IU4KRhAE+iB e+HlxOMyyGOk84+vWoT9IeQddYaxdlBm44TznYNN6en1lu2nqAA4s2XZEvw4rIkB IgQQAQIADAUCQq/WegUDABJ1AAAKCRCXELibyletfNBuCACi6+OSvQrLBIeSmhIy 7Xgv2y/zfTKc1J++Nj2HFWC/X9pJCDHEyY5h0enHrePPoQzAlNY4Mz8sNzI2gc5V +6B90XMJUCO4xz0wSlSTSMgX7sKO3zti6TaHi1dky89UDwOatrvxtRFeY957dInE WDTyucTfDCIu7sQEHClXlTNTWXXs/MArjmtUfldCs6KWEvBiXec8YbAyC9gKZ3YV ERrkMEJJYVWJiqp4jkCu7N7SUm2HS4GUIfacP+Qt+FJqHjkhYmGBJXfRSNcnOubb S5gk1VJ7FKM7ZwQYDUZgouQUi6BiLoaJ3D0mHU+kxbg7PPhbT06u/MJh6v1B1Isa 2s/niQEiBBABAgAMBQJCtR/qBQMAEnUAAAoJEJcQuJvKV618R+oIAJj01Y/c/uq+ 4FqSfanoAGR5uqz3Ln+ijzycyMMQ8cY5fZpGaeeWzi3POlfnz35BsVXASWec9x7+ bHVQY6Rn6DoQFRX5cQ6WwwRpsg8lAoL3uzN99Frj8rwGoLkTCJvRNZVbAaDmMHAa +dAaq+ro1B22IGxvfR6N7EfjBHmeXfTHkSdszEBl9WnpsyziapSpkGFvcdzPWnBg Dh70nybKseCDdcIdTRCmj5MIBn150nav/1SzX+oustuxoRxrjYZUFr8dOK52xHst GgaSyNqKE8XJ8CCBvEI2x6pzIrle3vdBaXD9Yw3lOhNN0OZsqZWb/uQCW884tlDN XhUExNhcHXqJASIEEAECAAwFAkK3GioFAwASdQAACgkQlxC4m8pXrXz+ugf+KMyj rXp55VY5hSYZUoM1g+NW2ayOiT/pQNzOlVZt/fA64zwkmCGaRzEC6jB0rAi98b5o mvgCEwXWqg6z9asSbOk6/kIStI8se4hxp0BQSXIB7sXyrpopugigET3yIwSOM7M6 fez/WHJYF/8xOzA1VM5Fbs4M2V15hpjA0lwBRHgkxqBNaHl3FjhqO8SmcECCMART IVamMKniOK8hOVH0NKbjj7Zbe21EFuyXsxa32ROCPIY4mspKNFXtT7ixXmLjMxj0 P3yNUVBGkgjh86eP6QjT54V70nwVbjg6u7f5xeQoWHS+8dt4QhVOZDz3XSjKwgZq NllQ5YCSu/AdHJfcM4kBIgQQAQIADAUCQszcBwUDABJ1AAAKCRCXELibyletfBsa B/9HKXrv7HDwZ4LS4Sf/wrtlUZIEMmbojeF3G9QWBXp1D/SbSJHPTuXM9jsZcfTZ VX+neDDB5FkaGtqLf3Wcm5AT06qTswKbCrg1XlFQ66YuyqgX3+Y2i4GloATDNlPS Ho5g2YliIoZXxP6VzrmCHVDKBi/TWNxMaCgwPRtJvSRGUiitv/AJR4LCyz6T6QGJ +WRPaHwviT2FX0aAjP3q3tZKaXNmGskNuX5WUUnThUuZWwFJ2eZcqF3Mr7ZTmf/v QnwEoyEdULUNBWF15R5FD1EvK9ELQIEWOWBILv7Mt5ozNSqTYV78UpG5MiiM3DMh QP3iaqLsVzHvCNxgDmPZ04mBiQEiBBABAgAMBQJC0XrQBQMAEnUAAAoJEJcQuJvK V618EDYIAJgUg6kV4hU4Z8ML9Ka2GWazj34BmEMqkk6Jm6IRP2nVkHbe+/NN7vOZ TA+ZHFJKy5zu144+o6PqR2W9ZkcbWplUz4bC4POXclEfbIywH/7coqUwa3RjvRrO TmiYAZKV/Z7yngC3BLBIktlEvTZustX6LsqPrqLn6Wk8GI161HWYhwRCIXQ9Vs2e BhSGPzHp/vEOJHdGMsXpxEakcCCnn2SBwYcrkV4AN+gOJhsoH55hD1/mXEK95zoc S2uUaxxhn3jKEUFMOnCfcfuqZ52broV3OUczxozFloIGxxZv9xwBNHOMDfA0LI6Q 9YsL5uWDE1QKdwkIzqDC4mBzgOxp5C+IVwQTEQIAFwUCO3fNQAULBwoDBAMVAwID FgIBAheAAAoJED+4njonxrDkf60AnRUchhESPbyQbSvy7sX1xunLHgRkAJ49jGt8 9LQdh4lvqKfpj+RMqY1LI7Q0TWljaGFlbCBBbmRyZXMgKE1pY2hhZWwgQW5kcmVz IHByaXZhdGUpIDxtYUBrbTEzLmRlPohgBBMRAgAgAhsjBgsJCAcDAgQVAggDBBYC AwECHgECF4AFAkhmDeAACgkQP7ieOifGsOQDpwCdGxVwFjNt98OuylGNhhjm2GD0 HUkAn19PVAoWFjmHhSadUJAehJVloqjbiGMEExECACMCGyMGCwkIBwMCBBUCCAME FgIDAQIeAQIXgAUCSGYGFQIZAQAKCRA/uJ46J8aw5BvgAJ0Zo8czcPx39AUXGXIU v+RzkBeujwCfYOXRCpThfRrd2FyuUAULu+/PNnu5Ag0EO3fNWhAIANoFOLBJ37Vr 9umFyQJk2jB1zHfh8p0wF/Tw1giR7LFgTTpgvy27JR1BTSqJkeW56sfeDfMkHcRF SEsRl0SKHfpHLQANevwvygygx6OgeJrCdgJTkhWUdB7SgVC1yMSsWm0uYTPSOH+l 9PpICNH+tP1po0qoQsD387uY8XOwlLSAuFTOGGT0q7N1g/swF/5RwJhLtgj0viQR /lzoZ9f5GB87Ih9ab8LgBj1XcddjtFe+Qr0pZ+0tT5Fqz9/muOzeW3z1nHvE/7di LMorlevz1gD1JOPoFDaTmLsuWXdFP0aZoi/2Wx39HVD8Zpp8vN5M3Ta/11oXhoHG AIuIQ3kFELcAAwUIALMbFRojYmYCl6TCZ23PB/+8fK2VjAu4vUzuvv78U17H26pO G4mVbW7XXFBmN30viiqEVMdrm76odOe5VhF+lCB8irbvedL0al/C9vsAUGKRxJB0 1Y/mXsDuPvxmiuGqcWrb8j3chBh129dCO+dR4MR1xfth23EnI/fncggAeXGT6+HD oXfXTHoMolWKa9Fh3vRTZqFtBQTYPenr7lhUjPmM3cpswSTxkwIqC2pUmmDMekSu IOCVIbe5w+f5OB8j2Bd3ZYgxsePcf20OWOXdLNucO1KPaM9zS7LxhmlzAOWcXj8E EK9bAvdi1DXDgJA+AYmD6ol3uX+eoIDh3akYTTyIRgQYEQIABgUCO3fNWgAKCRA/ uJ46J8aw5AtiAJkBhcP6w63v4r8niiOPjmgN6NbxxACeK/BBzQT+qgqQfHYEW0Sc ixhE83U= =Z5HF -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/control.xml000066400000000000000000000675071476576476200263330ustar00rootroot00000000000000 control true true false never 95 true true simple false true true true true false true false /root/ /root/inst-sys/ false auto http://download.opensuse.org/YaST/Repos/openSUSE_103_Servers.xml false true 7G 40 5G 20G false false 15G 25G false false laptop ifplugd language keyboard timezone users networking firewall host routing proxy runlevel x11 nis ldap printer add-on installation,demo,autoinstallation initial initial no hwinfo keyboard mouse partitions software bootloader timezone language runlevel partitions software_simple country_simple hwinfo keyboard mouse partitions software bootloader timezone language runlevel update initial normal no update packages backup language update initial initial no hwinfo media update packages backup language keyboard network continue,normal yes lan 20 general 5 dsl 30 isdn 40 modem 50 remote 60 firewall 10 proxy 70 hardware continue yes x11 printer sound tv bluetooth all yes yes installation initial language no yes yes true checkmedia license disks_activate system_analysis productsources yes add-on yes timezone yes yes desktop yes proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no no finish no all yes yes update initial language no yes true checkmedia license disks_activate system_analysis update_partition upgrade_urls productsources yes add-on yes yes proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no no finish no all initial repair info repair all yes yes initial screen_shot no yes language true proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no yes all yes yes initial demo no language true proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no no continue update all yes yes rpmcopy no no yes ask_net_test no do_net_test addon_update_sources suse_register ask_online_update you restore_settings suseconfig no no release_notes congratulate continue installation yes yes all yes root no initialization no no netprobe no no rpmcopy no no hostname proposal network fam ask_net_test do_net_test addon_update_sources suse_register ask_online_update you extrasources restore_settings auth user suseconfig no no release_notes proposal hardware save_hardware_status congratulate initial autoinstallation all no no autoinit all true autosetup proposal initial no yes prepdisk kickoff autoimage rpmcopy finish all no no continue autoinstallation netprobe autopost rpmcopy yes autoconfigure suseconfig libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/gpg-pubkey-0dfb3188-41ed929b.asc000066400000000000000000000015621476576476200311560ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBEHtkpsRBACRHiXh3olS++6/Mp9N7ByGMmjaaE+Y8cJQLUPG1myrbW5aogIP 0WenayhGbbgOHNWgd5dQ8KQpYYFoQuUHjFYzj5MvgrdOENOvD7ZNJ6+EmbkNh5cV zUYfNG9jdiGweZkyA1sh8DYS0JiUmQ4CzaBD/DotB/dCmDcyuNQFiw4qKwCglQah ATyueBRsOiXl0NIs1uB6dkkD/1A2YmQ6te1q38a1J+a8os6bDlMZhVnkZdhJdw6x eBwUb9XS0n7hyt/AKCcBnrDEUQJuhBMNgzctJvbuMv27yRMANAXZDQkp0ip/yHLJ PhUdSNTTRHOL9bV3t+JuZ9xmuclprwyrrJYUkEESXNc0tkuczHBP2c/RqA3OxYHt hrHLA/9Pqe2gEleeo8l26u/uFXs2dtwjh8EZmdhHoqGcOlpYR4DyAg2D+jYfh3RI oPzIwRlHVUR1ii5h8iPi98BVuEvukwfbbQ1K22Jwzxt6w3ihCXBKWKbeC3ElIMfA hVMchLFUbTAw+yodO/u3NHxKQ34+ginid9dVyxV5T0gpDEEHObQrT3BlbiBFbnRl cnByaXNlIFNlcnZlciA8c3VwcG9ydEBub3ZlbGwuY29tPoheBBMRAgAeBQJB7ZKb AhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEHPSXWMN+zGID4oAoJPTGZbZApW+ tuU422mHYGwoqgjrAJ9fhzRhRbV3YsOxKUomNeuIfmWGXA== =Qv5+ -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/gpg-pubkey-307e3d54-44201d5d.asc000066400000000000000000000011521476576476200307740ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIF AkQgHV0CGwMFCQQ9AoAECwcDAgMVAgMDFgIBAh4BAheAAAoJEOOlw2Awfj1UjUIE AIf3SLlrfj2RsCDjyYThXen+A/WTYDPbY+NYmmVvFQilHNQY9ZrJ5cNohRQu6hA+ Sccrf11Uy24tTHWSTzuG9VzFeeIAcIU02XHar0w3QbvTk6IqeG+OZlfOGJj1sdx4 JKwpwk9mSdrq2ELhrkPZiVWS7RmRkPr2klwYgKGWbmOJ =ZmDA -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/gpg-pubkey-3d25d3d9-36e12d04.asc000066400000000000000000000032431476576476200310630ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQENAzbhLQQAAAEIAKAkXHe0lWRBXLpn38hMHy03F0I4Sszmoc8aaKJrhfhyMlOA BqvklPLE2f9UrI4Xc860gH79ZREwAgPt0pi6+SleNFLNcNFAuuHMLQOOsaMFatbz JR9i4m/lf6q929YROu5zB48rBAlcfTm+IBbijaEdnqpwGib45wE/Cfy6FAttBHQh 1Kp+r/jPbf1mYAvljUfHKuvbg8t2EIQz/5yGp+n5trn9pElfQO2cRBq8LFpf1l+U P7EKjFmlOq+Gs/fF98/dP3DfniSd78LQPq5vp8RL8nr/o2i7jkAQ33m4f1wOBWd+ cZovrKXYlXiR+Bf7m2hpZo+/sAzhd7LmAD0l09kABRG0JVN1U0UgU2VjdXJpdHkg VGVhbSA8c2VjdXJpdHlAc3VzZS5kZT6JARUDBRA24S1H5Fiyh7HKPEUBAVcOB/9b yHYji1/+4Xc2GhvXK0FSJN0MGgeXgW47yxDL7gmR4mNgjlIOUHZj0PEpVjWepOJ7 tQS3L9oP6cpj1Fj/XxuLbkp5VCQ61hpt54coQAvYrnT9rtWEGN+xmwejT1WmYmDJ xG+EGBXKr+XP69oIUl1E2JO3rXeklulgjqRKos4cdXKgyjWZ7CP9V9daRXDtje63 Om8gwSdU/nCvhdRIWp/Vwbf7Ia8iZr9OJ5YuQl0DBG4qmGDDrvImgPAFkYFzwlqo choXFQ9y0YVCV41DnR+GYhwl2qBd81T8aXhihEGPIgaw3g8gd8B5o6mPVgl+nJqI BkEYGBusiag2pS6qwznZiQEVAwUQNuEtBHey5gA9JdPZAQFtOAf+KVh939b0J94u v/kpg4xs1LthlhquhbHcKNoVTNspugiC3qMPyvSX4XcBr2PC0cVkS4Z9PY9iCfT+ x9WM96g39dAF+le2CCx7XISk9XXJ4ApEy5g4AuK7NYgAJd39PPbERgWnxjxir9g0 Ix30dS30bW39D+3NPU5Ho9TD/B7UDFvYT5AWHl3MGwo3a1RhTs6sfgL7yQ3U+mvq MkTExZb5mfN1FeaYKMopoI4VpzNVeGxQWIz67VjJHVyUlF20ekOz4kWVgsxkc8G2 saqZd6yv2EwqYTi8BDAduweP33KrQc4KDDommQNDOXxaKOeCoESIdM4p7Esdjq1o L0oixF12CohGBBARAgAGBQI7HmHDAAoJEJ5A4xAACqukTlQAoI4QzP9yjPohY7OU F7J3eKBTzp25AJ42BmtSd3pvm5ldmognWF3Trhp+GYkAlQMFEDe3O8IWkDf+zvyS FQEBAfkD/3GG5UgJj18UhYmh1gfjIlDcPAeqMwSytEHDENmHC+vlZQ/p0mT9tPiW tp34io54mwr+bLPN8l6B5GJNkbGvH6M+mO7R8Lj4nHL6pyAv3PQr83WyLHcaX7It Klj371/4yzKV6qpz43SGRK4MacLo2rNZ/dNej7lwPCtzCcFYwqkiiEYEEBECAAYF AjoaQqQACgkQx1KqMrDf94ArewCfWnTUDG5gNYkmHG4bYL8fQcizyA4An2eVo/n+ 3J2KRWSOhpAMsnMxtPbB =Ay23 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/gpg-pubkey-7e2e3b05-44748aba.asc000066400000000000000000000020211476576476200311350ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1 uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF 13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG 2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgUCRHSKugIbAwUJA8JnAAYL CQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBTCi8l+LjsFWEoAn13x+5ObqkW08gYF YNDlcGPjQuGPAJ9kAQbVUvvh1u9mBgu91cQ9W/TkHYhGBBMRAgAGBQJEexD/AAoJ EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU fJAKVDoB9w== =tJSz -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/gpg-pubkey-9c800aca-40d8063e.asc000066400000000000000000000042021476576476200311330ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff 4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiBQJA2AY+AhsD BQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAKypCfAJ9RuZ6ZSV7Q W4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+IRgQQEQIABgUCOnBe UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/ EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5 +D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z 3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4 l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0 bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L 1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ 1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspnpgCfRbYwxT3iq+9l /PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuO =pJli -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/gpg-pubkey-a1912208-446a0899.asc000066400000000000000000000034201476576476200306460ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2 dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8 WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1 NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0 l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh 0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK 2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg== =E+qN -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/installation.xml000066400000000000000000000101101476576476200273260ustar00rootroot00000000000000 control-ISSLE false auto true product continue,normal installation yast2-issleconfig no no normal installation,normal sw_single yes yes issleconfig yes yes inst_release_notes yes yes inst_congratulate no yes no no continue,normal installation,normal,update hostname root ca_mgm yast2-issleconfig suseconfig issleconfig yes yes libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/license.tar.gz000066400000000000000000000000551476576476200266630ustar00rootroot00000000000000WK  Om77'(libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/media.1/000077500000000000000000000000001476576476200253305ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/media.1/directory.yast000066400000000000000000000000761476576476200302410ustar00rootroot00000000000000info.txt license.zip media products products.asc products.key libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/media.1/info.txt000066400000000000000000000027641476576476200270350ustar00rootroot00000000000000 openSUSE FACTORY 10.3-factory Attention! You are accessing our BETA Distribution. If you install any package, note that we can NOT GIVE ANY SUPPORT for your system - no matter if you update from a previous system or do a complete new installation. Use this BETA distribution at your own risk! We recommend it for testing, porting and evaluation purposes but not for any critical production systems. If you are curious and would like to help us to find the bugs, you're very welcome. Please enter bug reports following the instructions given at http://bugs.opensuse.org . If you want to talk about this distribution with others, you can discuss on the mailing list opensuse-factory@opensuse.org. Sources for development releases are not distributed via mirrors to reduce the bandwidth and storage on these mirrors. You can always find the latest source at http://download.opensuse.org/distribution/SL-OSS-factory/ In case you need the exact source of this development release you can find it on: http://www.novell.com/products/opensuse/source_code.html Alternatively, see http://www.novell.com/products/opensuse/source_code.html or send e-mail to sourcedvd@suse.de to request the source for a specific release of openSUSE on DVD. Please note that we will charge $15 or 15 Euros to cover our costs of distribution. Use this distribution at your own risk - and remember to have a lot of fun! :) Your openSUSE Team. libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/media.1/media000066400000000000000000000000521476576476200263270ustar00rootroot00000000000000SUSE Linux Products GmbH 20070705102239 1 libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/media.1/products000066400000000000000000000000351476576476200271140ustar00rootroot00000000000000/ SuSE-Linux-STABLE-X86 10.3 libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/media.1/products.asc000066400000000000000000000002751476576476200276670ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBGjNGIqE7a6JyACsoRAoWnAJkB1wTxOQngy5xvjTiUvwWp65wW5wCg hCbA+jw64zZYCa7IM71hBBynFL4= =nSHl -----END PGP SIGNATURE----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/media.1/products.key000066400000000000000000000042021476576476200277030ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff 4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiBQJA2AY+AhsD BQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAKypCfAJ9RuZ6ZSV7Q W4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+IRgQQEQIABgUCOnBe UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/ EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5 +D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z 3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4 l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0 bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L 1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ 1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspnpgCfRbYwxT3iq+9l /PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuO =pJli -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/000077500000000000000000000000001476576476200250715ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/setup/000077500000000000000000000000001476576476200262315ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/setup/descr/000077500000000000000000000000001476576476200273315ustar00rootroot00000000000000kde-10.3-71.noarch.pat.gz000066400000000000000000000111241476576476200332160ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/setup/descrFkde-10.3-71.i586.patZ[sU~U9"0LnafI 0Ԗz[V苂dIq+&Ą$r  ĉ{~Fm9 wZmypҽ/konɎ0#/ 8a~φؿe^fj_~dG}ϊa*d8y(,aw#/ョ wᏰ_#x0f[B1e/ap8|>*vcm=iq3؂oLx*;&D.Tj8&ao%{nAa [=c z =ϋ4yvd%"muGe< _acL#1CW(`@| a7ضl?n^QƲŸF_  )j!#RK@z&5w ڭNNN֩teM #]iׯܧ'r~g 5rU\W EGvO7،;i {pI&.bv*w4%c-+pC͋BDs5\jUkͭ?kV\jn6WKzK`N-V %-%(j]%vKZj~ ^>>vwFXwvw#`0qMh v!7doH^1}p&47w[*.@#ʂ^FNy\V6m䐴?}YϷdjZR a'\~?o]=3,P~>imz]Wㅠ=cb&YA ?UE/A'pƲ#;1?r9l}3L #ܑ}.N)? dwXSTWƝ)?ӪggjB{֮O=9s._\{zceq?á(Zrw X?FG"(Jר {s: =RGcwO ; ] ҞOϕ e7B|ں\o(Ca1aä́7/`&)<&Mx#mi`EX>O" MW1:@I9MϵVe + $>M)WWXsok,fZ+w LzPY-;`FlHmb#cDxbA /)VHOjBs/Bk[6&=`l5(AX)-ܣ-@"`u$Bb)[eUV"BPU#qؙ(U0E' nPxsŠg9H~"yVz(~#*aqQsdkj,ri3YT(zÕIВA r"(+z  E/-pX( ST22hE~@+gȼlRdz^ #^Wf0{ J,2۳ ,u6"VܹҸ]ڞ e YPc9 1Jm/`@4C`0XƘ0br7j(xI,V[Qo4<}|D1i| {:x2~lQ2)8)!u de qrh"4LH "l^ȁG}GZGaREwH` p|e@w@~^n k92;fcglJ@C&j1<%'Q@")MHJ>{/1+})2F+CheĚ)z!Z$&j7ol3:`=6 yܙ7ʢVNe媡9AƁ֋B s?kBz\c,1\&40^ W5v1T Ys/2+Α# "y<-Z`]M) "qHF[UAz!/q<9H>5B0CXJq jX.bѳ19U`F ,@4A M)= иD3t6wTFcS?0S71, nr*MQyVm.ˬ`ν nxRgl҆R˘݂=6#V>t3|n!3O`3?A:B,<|(1 %7J`/D(uy‚hPy%/:X7xUU9?AvXhr;wJ15{;ӣ-Y18^1x7>^']$` zVغNLC$Nڹ`-K҆D[I,O!ogec1`>Ecn!pv.@r N(EZ9 b):y edad{@-\S'(D t .:?Rҍ+c(ki|OA ;!PC UJِp0Jwd*^r& jxYSDDZ$|,3ųY$s%̪P,' n^ʝDEtjt[P]NNmqN{t*7gf;:M-TTov_]!VԾ%t*W:US9ѩggzkw+ܻ5wPܛNNN 0>ש=rzBwj\:nsAzX8ة|t)jKKUK]OJ^mUT)O3U_czAZ6 :u]"2Ӟ;kS+ÑF~PWsYɟ! S-Nj7)m9Lإf/kszĂi")%hv' >= _v=Wh^#!irJ()uc^0G/+Wb諱43\ETJjpjv0\TOM+j3 4>twL,#}8eP+y69s{?hOobBpn)\i{7,lO2T;aI 0{g1f|Gxt:6zA0B ͉IHP5ΎQ=ifT.UVn\OhD:27&@`~]o#Y|zN4>'PX(龠|A\VΊQ(|X"i֨'ݒYLi2dFzJD_&v$Xm) =O2P/Ɓ`'mUN\TWv6rƷȨ{dLXȮtc2$-/e8Ne{l2N5I("?51lI.'? f]Y8%U_Tw:G]o#Շ%v>{#@ԇCv0W#GlsEH3 ^+*SKVT:g ?;iYI?x&[^,pU:-'cݫu ĠoiN3pZ3+0mœCӃ*6`Ɂ)GAfSď~h+y#aP^qb0OJ{L|wygw}Y`"]7u]3X׻ݕ'gnuog\N?K6*uNv'O<ݿzBoWiDIq+1۽ܻvgve"MEqػ : {$p0>a, 8I18*`SW._^{6}[НZ#f'=`d@{_&KwwWN"$MdGlK.&MAk~T݋PӪd9^Ǽ XG9g`HQ&jIxx2A'3v߾G}_Q >UxLCjANQV*=0TKh'libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/setup/descr/packages.DU.gz000066400000000000000000000106131476576476200317610ustar00rootroot00000000000000Fpackages.DU\Y ~_Q>mI>%$ȁ  /خ!)*[L϶OER$E,_xYt"~~ .ܽ^yO""u_?e}|avOߐ 8'eVݺg|^%|\z 6{C3 o"@^O\Ǘen䇗P0DxaISa Of]Ve-t@EM+&M{fw8h y|7M'qrL[wd#r6?/_|MC@hi^붌{5&n{\ g eݧ6oeÊH}^Y]9ZPdm&7դ-˦`{]w(Qb%P H]vkR)Ce5mNCFJCӾEG;Dd<q}2g5Dq 'JPMT׍.1Tm9'U$`X |IQ"tș }ҌSz&w7y{Jmwヒ'`}`}'*Jh {@u+y%sk@*'*%O߲,2{*b]}Y{6(頵hol.饙ti\O Wf&ݭ^`<;wd`zC.Y-c{c߻gyG\ozF/<ڷxC^y-},GnsfQ/,tԃokb[0h׏iFdaC UٗT}Òh d> !n}nG2Z䐧hC]R(rԿg%3g>KnKKݦ2 `,nw{}}H(t.5s6d9H8h)&W"Iꢦʑ[ "M Ѧ2ƷGi-sIf#g5. ,\g+v] _@6} s=,v4TvbӬĽ7h-ˬPG"ܐIh&f7€mŚ9d RnX) x]#a ׬` t7xR4%K1$'Y B⩷Jw$8,<YTbFʭJN%rT*Dϸ)ڨ躇hAW!gK("ΔKIj@WCϖ*2ژEqU2RшHUp'0[*AV其<OnT=)fd풸_+G} ;>Ǽ򏰉I[qx/L`V;60G)@99ʡi:|2&WUMVnK?o[j69 OlN{\l\:Yk1M'E t0MЌZPTg `!K*. mfuJ&R5xdm؀0/7ka=V5&a2;j0Z+8RA,sIC{J㩖`[I|ishh2ܿ@\HRX5y9YWZjWg\<ք 0tކ!ק['-/))_%baZ'dy'WXLpUExWP /wխޅu~ڐV<vrpʁ?JLՉ! g|چ:1U1P ܲ!#>io :yB)t~\{r\@,"bJrL: >-v(egGjIi,%Y`;o=EU!W'xL|E3`nƷ[WHAz 6\LyO"M'ISImD'MEyс5N.RXe%%iA6n$n9iQ =CJxvb]YH^?,=RAQptKf&EMpMl]xP<9SFinA*g5k2XV8Y.#lj-`tyW8&Z2h a` w I䴇xdAv #_8pݖf[k60Xѿ\&+RdeoDa6˪.a^ObR)%X?@n7y:OО~2D3 QGW:7Q+d/Yo=c~|>&]( .k#gu|blW^FG6B0g|/sq8Ô\ ^VDZݒaZ$8$x*p6A7?? @zM~~rȘv:$+7Wyp՞ _]$oi~= DAcΚVum˘"YӶ}M^c:%<% \M{tqZʪ>h7:7_X ֍ƌ?# $ \d\M $@q\54%?Jܺ.U$lKa7]_ԁW,hw w発=QihM{ĀLb21` KO#WP;Cκ1CL?ӧOCC/g#Vޮ 1,zw~xUO3 oxmVPe9pNwyN`8:؀tN;HFU'b=@NݻyM?kʊ NpxNb·eC`~sY*ZjV2!wB/~P%#X&șٵMZUAuf^gy/uNLT3wYU+{{|ì&w+wKWf%9m FY8g9oJsA\@0#h3V;q}ꮤO`g'Pp+lȎa׮6b}2v=詢ٷ#oW8HXNCӿPNΦO ڹ!~0sJZ'X1E>f;1e#o]jې.Hm3[[5⩔ x} eJ)kaJF凉m~ !NG >иz#򎦥#˸j\aM+:t ?A~43o?hʖl A2ކT̩CS9_libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/setup/descr/packages.en.gz000066400000000000000000000006301476576476200320510ustar00rootroot00000000000000Fpackages.enN1}kX`"e,, .2PےvfB@F KgLoOzz◟=V U!8&h1[RM~A|— V< V ki5{5V[.-r"Urdߪ>:y)CĊ1澗 eo5-tZdH[gR;+b~b,=3%q$D3t` c`2H+r\-y'퉤'%ޱAúNgg;|bij8-%)gC͌"*&CmqDzkcd@lR [libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/setup/descr/packages.gz000066400000000000000000000046061476576476200314570ustar00rootroot00000000000000FpackagesZ[o8~ׯ0/)r-bd6 6 t7")յ$8KRRmfl&:9Tu>3s0gli{Mhaeؾy{0/(LyF^+=|lѺSFs\^ٿ3qܷ_K֟EV%˭ U^QG[AumnkW䘽wl4l.&Ϊ1L߁%f 1-3Vɼy:0gIz輸,Au5 MÆJUXPfKgbDXC: !ǵXRrLS㢶I (NS`kr$<S.d5NTd*#hO#+*XM{`b1}H,nWUe;^ 31 u  _XR<#/+N-- s^۪qJ8>ֱ /r͵? sІYCoT<7|k&B.tZ{)~B 3ʘ$7y@ h*96BI`7:kw˔kP ^~2^US!]]3Ɉ4퀌#xx8`>~<}s(_T|KO"laA} oݯ-L5ubܲ\ǖ$#E >Nz+V LɺdV_;:PI{2VԤQv @kcݐFՄ)9Lne$i(>hx,ЇV%rCĸG`w<D)qk4)}i}0vRQ?S0ij`wF Tyl'2:T*1uw枠5dmX)RG Rؽ#^ M/Bf R"q]IHbkҁ MNc?@pikcZf z_!>%\RS`HV=o&E0HG:⍼&x({1!DZy("13N2S3g*("QB:%oj@J>0 (Lř8n@FWmr+UFMPNV&F&i_%}Nb֟nBMn/3ھI+936HѧQa,NhTbRvo]d0MΉ71.h_^ޢPM .3Ld*_v\ݩ%KnQ%N8[:^ K)QDcF(5{ a DcW:T؝\ؾy`G.}urEx۠Dwr>X]9KQΝ &Hc3_؞Lf ] #H\vܶ~qe5FŸNQU# W-=b`&2`L̩]S#3L-ݷ?1"IH<&@iG^pҬe5iUV)yS4W i(Y&v/I}۽olN 1zp^ղ<:?:L Bs#WCܦ5X4Y[ +  0 4_,3FTWE:~hx%E/>Os/-_-&;u;UٹnHYƫڑ#"Zt(i:EOeqE!영rncVWN ZS(o=Ae?| 02w[_1ˎ~a\u͎2xyW<)JQ{@PlM;\#o_Ei&libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset-gz/suse/setup/descr/patterns.gz000066400000000000000000000000551476576476200315330ustar00rootroot00000000000000tTNI54357O,J+H,qxlibzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/000077500000000000000000000000001476576476200234745ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/content000066400000000000000000000041321476576476200250710ustar00rootroot00000000000000PRODUCT openSUSE-factory VERSION 10.3 DISTPRODUCT SuSE-Linux-STABLE-X86 DISTVERSION 10.2.42-factory VENDOR SUSE LINUX Products GmbH, Nuernberg, Germany RELNOTESURL http://www.suse.com/relnotes/i386/openSUSE/FACTORY/release-notes.rpm ARCH.x86_64 x86_64 i686 i586 i486 i386 noarch ARCH.i686 i686 i586 i486 i386 noarch ARCH.i586 i586 i486 i386 noarch ARCH.i486 i486 i386 noarch ARCH.i386 i386 noarch DEFAULTBASE i586 REQUIRES openSUSE-release = 10.3 pattern:basesystem PROVIDES product:openSUSE = 10.2.42 OBSOLETES product:SUSE_LINUX product:openSUSE <= 10.2 LINGUAS cs da de en en_GB es fi fr hu it ja km nl nb pl pt_BR zh_CN zh_TW SHORTLABEL FACTORY LABEL openSUSE FACTORY 10.3 LABEL.de openSUSE FACTORY 10.3 EXTRAURLS http://download.opensuse.org/distribution/10.2/repo/oss/ OPTIONALURLS http://download.opensuse.org/distribution/10.2/repo/non-oss/ http://download.opensuse.org/distribution/10.2/repo/debug/ DESCRDIR suse/setup/descr DATADIR suse FLAGS update LANGUAGE en_US META SHA1 c37f4ba4225650844363711710c3824a58c901dd kde-10.3-71.noarch.pat META SHA1 80f9bb1f9e95ebcebfd9b22f338f779e204cd50b packages META SHA1 9c341d93124860f03b001681513ca07b4d0ca873 packages.DU META SHA1 a48fa507afccbce76b549a07394e41d9813e6b01 packages.en META SHA1 765900f5513ce6bf496d5006bdff45f805e61997 packages.es META SHA1 d3c628ac67854629ff98432bebef6c00aad9bb98 patterns KEY SHA1 c0354069c10819674da8706822e1d4bd0c1797e9 gpg-pubkey-0dfb3188-41ed929b.asc KEY SHA1 2e38e503c436c5d002bdc31755c82188044d9d21 gpg-pubkey-307e3d54-44201d5d.asc KEY SHA1 7025932e6866932f489421990075f3ed312023ea gpg-pubkey-3d25d3d9-36e12d04.asc KEY SHA1 fd6146cac8c1473c5b52548936de773d5bbd5610 gpg-pubkey-7e2e3b05-44748aba.asc KEY SHA1 cd7adceba1fe5d7ba27b5749718743192d82f802 gpg-pubkey-9c800aca-40d8063e.asc KEY SHA1 7535d79e31ef7b4232e5593bb49d9142978b2e95 gpg-pubkey-a1912208-446a0899.asc HASH SHA1 875e73cf2ee139203208c860fbfd7fa5cb291c7e license.tar.gz HASH SHA1 4aa8ded6302e6ec85690a51af6044dffe9b21923 control.xml HASH SHA1 82f1f17ce74f0cd3fca4813c178196b317fc952d installation.xml HASH SHA1 68d9b548d61e31e82e8834690e884afa27751287 media.1/info.txt libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/content.asc000066400000000000000000000001101476576476200256260ustar00rootroot00000000000000FTw ?:'ư䞄ZOCPCY-kf:B }*c.</6 libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/content.key000066400000000000000000000204531476576476200256640ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQGiBDt3zUARBACCnzYUCVO/35iVN0T6J2Qb4GfDzrq8ZOqCamjD9tSylJ+UI4Co YBks0HWnWty231Aoil6q76LRqE4bcEiJ/xuwinLFNC/S24B1cR98aq5tUEEbPJ44 MBdY3LVbB4HCCMZH56nivx4thaTiCkVnyHpGkfKStk3lUkAVk2NR/C3uVwCgnp1D qWaTn46JxIsEQMU8dczkeyED/j/J6QqCRwYR8XmlAUfI5ozIsQ7LuA1nY/NJ9Nnh w2Wkq0UBZCqP/Nbfmr5EOri6MOPD9tIFRAy4qBqkxvgy/zKfX9qJkqx3o+DVrL4y CFZHI0aUwqXvEAT6GJyDPi45gnHOVE9XJRL6BL9ZfFmOd4ajH2AJ4yy/ZqbX0GjR opRuA/0SN8OK1ERDAA5AgZj9L2ZU7zMVmiWE8/Q+qz9p2TEfkfO8NyvvzK1Rv0iU p0WuJn9gorBr93Sc9XtX3lINZ1PJUQg7KQbpfeWHMa1pxUMnIFVjpYZMmVFFGWZw 0q+45T9uMr50cvMr4pYtnvat5tyKM0igPtezMqSY2aY7LyZMmrQbTWljaGFlbCBB bmRyZXMgPG1hQHN1c2UuZGU+iFcEExECABcFAjt3zUAFCwcKAwQDFQMCAxYCAQIX gAAKCRA/uJ46J8aw5H+tAJ4ktFPz9sQGuec1LaX0pIB3oZVAvQCeP+jNfv9ZbVHI Uz8bw8JBgwAe2w+IRgQQEQIABgUCO3fOdgAKCRDHUqoysN/3gB9xAKCLvhrIusLe 6wH0ByiA1ON3R5TNPACfY8W/eTeDSu9xNIlSCFMgDHw05cqIWgQTEQIAGgULBwoD BAMVAwIDFgIBAheABQJIZg3kAhkBAAoJED+4njonxrDkE5oAni0UwlVNIaklPunu iNb44D+AcgwRAJ47KCtevu20oesjoYkKhFNSLT14E4icBBMBAgAGBQI/xnvXAAoJ EBlUT2RolefhXTwD/iXBc3oVl/jyeV2qoUB/cB1+quxpVSkjC/MnOjtmU7lXtNBj dS7pZkMHyLDhT3VCTxvWTNM5sdS8hyQcSMATQ/axySFEy98tj5veZdMWcn9doyOP OIpNhAv55iMsuvAP/cd26VYJDx4Amlv7BXlIw9prYZrePZrZVlSpXOnGQ9JoiQEh BBABAgAMBQJCyOiqBQMAEnUAAAoJEJcQuJvKV618ALgH9igCYlbAeAAs+WTHoBgO r4DFI7xREXf+AfPxraa/vLyH0cwDRej40aOnzEnwBSIC/DH+7Oy41aKunELyNtJ/ DTkextRs2DzDhMGmYadHS8V1CPdLLA/q0rmtdGA6t2D2xhIdPXuO7+gHuaEydGTA /KFmyE8XE0pDYHyhsrBeelSBPZS1dDcJx7vib1GQPHUydOI8PRKJbn+kxwjNqGzJ m17sGJaxLPH8iWby8bEjmCFU31x+t+ia6sYSO7CsbwHL2mxuwfDE+f8QXiYFKDZB t/pN0ky6iiBGoCyu/OrT7nqRmlmanRprotZ/2gW+pYGIQ1sHrcZQz/GMov7CWXGu i4kBIgQQAQIADAUCQhcYbQUDABJ1AAAKCRCXELibyletfCOHB/92VkN0tLaC2nWJ hOaMP2XGQbm8f09BphSdb8pxxMqnUH1W8YkCNjLvoRGN5exxb7cpfrymSqdjmSh1 bVkREh4zzx5zd8Fhush5wqXq4PItV4Z+Es7kuZV/McG9mMoGqxI2WUyrZdXdOMFJ O7ABEFtw7iCdzh9tVenX71U/2ePT/Ab8iWXcT5Xei4X1eQBtQ3c/2B6i9TDuH4Q0 Cd8C89qyhzDaxrlX2dXfU/mwqIh/+6I4mwnAFBQ0RUtniXX4YARG5TuKYhDvfBod vj6ACj518Kazlu8eOyUtZr+w1ntc22veQ8im7qpMqpMAqEYmpO7B6wYb/BOOxTBD +pROcj3ziQEiBBABAgAMBQJCT68CBQMAEnUAAAoJEJcQuJvKV618IwIH/2pIkrl7 OWSIoZADqVC7w6eXF17sV5TXLqJEPaHVuS6e+RnTbcRut7lPbx3wFVWQflFhn/fg jkTUkTpcwbBrl199OA6k1yQPdYCJb1KuFP8aipWvlUjJcqUnHJS0ub7eSqWLeXcq 8cIufLMVNIcImU9yBoTVo4t7bezcO5LBC9l58B0uO11TwUlJ0pXAGUqznlAC7EuO uLUnZr/6G+PzpWDEJN6QjBdRnn9qIflefkTXdsqUb2ByB5/SMJ3FgHkPZBx1Mqgm IXvW05uQd4uyHJ0t9azvwxtgHgNH3y+FBkglP7yhRfBxwvMZbLJZft7xnXLMgdfH M8Sj6pwmlSI9cnGJASIEEAECAAwFAkJiN0UFAwASdQAACgkQlxC4m8pXrXywowf/ QzsKRLsWvMvNlYixCp2xF26ZKLpMUddmOxbqrJPCmITCkVO6fJjuegAwWBD9CEgg 2RfCZ4n2thwsbLWCRjYrwUzgbA0s4h0NE5mjsuOwQmKHjPXi0Fn3tx3teA7/GVPB cqEGHnHVXx9guyGiwqugMRsYfYXEbDel68fo9Z7MraLwbTB2gSOJdEkCM0KtBNYd ZUG7Q4m8qK8kBGjhBjCK0jgsaJK0FLRNlT5dGnwG1ggnnQEr9x6U2BwikfzaodDp J80o3Z9PBr5OiDxXPb9kMgW9VwRpBBwvCi5ltAn8NtfIsPlQYwmb0FXyh7AXxlx0 f2dS+IxMAd8POqhiABLJ0IkBIgQQAQIADAUCQmLeuwUDABJ1AAAKCRCXELibylet fHGDB/9u0yi/Wk/mrFzrvwI4AOb92E7427Le3USIKUuWZSMqzAAVeNgCgKfy/NbY gs6Kttb56+HnUJJ/C79YDh4qABe0hGiIgik+dUj/t2FBIz35cc2rS76hHXm1lWQC 0Si48AKPqhqzWCwzwt6aerQIg1IBkSmINKF6LrTIraYjh6UsDnLqLrlxnosXP4bT byIKH2mTT3bboR8iaYyzxKV0ccydHE0jp0Dffx3x4wH5CKHrEJt1lhSKdDexM5yG lAa+haUDKRulODNVljtx5m84vOgpwdg/JphLBJ24jGhHUS3PI3cXf+TV97J3YYQo XITC9lRNqk3GZeWWyUu3r0XB/hp4iQEiBBABAgAMBQJCdVu9BQMAEnUAAAoJEJcQ uJvKV618HHcIAKOHqHyRSw+4jg35JfVcLgrZn/3G4cDl35cAtZ5iz6ukEg8vpzH3 rMfiFYV2WQNflQ2tIrD9ZwSjJVAXNEL1eX883HAL7HmHFCqaQTusZb7vpbzh18fU Tjl4Nq3K9FqIIfJzJ8lPxGit6eL82OO/WUffjQAA9Ad+2yY/yWOyqUN4dqzxUWx4 9F1Q2UDBGiu/QhcEhUlPf6B21I1nqsSkOMGtRiHf7RfrGDss2xRn+0PDrpRDcpmV ZxJ4JpKQSDBKqbktlcdl95y9gI6llpJXFFQugxGwsC4qr6UYw4RloAdkpwz6aAlk rfFgCZ5KhkLs4HQkdZLr+zq7zJh5njuBnJKJASIEEAECAAwFAkKHod8FAwASdQAA CgkQlxC4m8pXrXxEdAf+Juexqg2/qC8vP+OnTuuDzTALHdSzt81Gq8a9jMHVs4rA gAAEKbKzrRgnAjI7wyGSxU1kaPNh+RQB4qtZy4x7MlJtRfcfSlAWw7i3rqKQakpY xUQEXLt/nK8kWxd2nC4gMW0105J+lBSMiCAw174/h36RjG//Cv17AhzGOckFE0n0 7gZlW/+5YnjvFemP8lFnL5kb5BzPPiJy8J1VnqvXY95n3HxhkoiTSrXlS0MNNLgG h27C+Kzl+p4X/T1esWoZe3pbq+qSb4xnglXOqzGJduQ0s585907ohm09m++e6NXK hxxysu4cvcMv2Cc4ep9HglEY6sVrwY/0pMpBYdMLBIkBIgQQAQIADAUCQomcnAUD ABJ1AAAKCRCXELibyletfDfnB/9ELbGLL7OIsOwCDidj1f/sabT/aFJ4LX15nm1B mW0huKLRdJuzX7XZkcTx6SohTcTgFIfXxV1RLt/7wrW5TTRrYmDRyk0CR1EZlfgz yLUaG+18ml7h97DZqSIaWnsqnryJB1QPyGO6yBUQTQ/KcGMyw2lzY2ovtl/UheIu PT0v3v12kFxOo1xYeBn81YHQKPMWJhJ+iOmhjbj89W6RZ8swgSd9pczv0ptfUFIm X5NbmIFxaiwWkRraUZYjdYYJGIainE9DpcMsSaSV7tq+mPl5NYVJPzW+llPPTqo6 zIKxIByiVfH0zac/xecGyKe1RhBYJ34fdK+GcM8FYcWkpxOqiQEiBBABAgAMBQJC m2c0BQMAEnUAAAoJEJcQuJvKV618OnMH/209R6nyz26CxVS4PtYYzMlOZ5VlOl/U BEmRqmJeY/frgucejxX90qHUOy1dgBhJXQ05H5zHU7B0UHoha5KnSSyT2/p7owBu AypZVvJB8PxxepPXUVfhiipR+7jWnYAsc6tjWn/+dE/ryO5iEWWAGDI0ZQ6dd/9C sz4jDeffQusWB6g5ebfL6+SBHa5N2PCydGr047fG0KZm2jposMPsXbIuKh6LSTaL QxGUyyJ+tTNfwstFYMlmawLMHtjb8F5r6FT7bywVlVHr7t2DctaoxULvlvogtCuE 7B9fG2EPg0sw6yK6P2zjGs+uv2qPO15vVWFLnQJ2eXrY1eNoUL/N+5KJASIEEAEC AAwFAkKcuOMFAwASdQAACgkQlxC4m8pXrXw8Jgf/UKw9NzMIFXf1LfuKW3hH2dhd OYyVnsYmuPy4HQTk0It579t0Mc8b4nrT4Bm5Id//SzxhKI0mGNxtLKXTiHOsTmEU KLeBXRaw7snnq64vaYz5NU9LdW/GX1vt4QtiGaLvZq/INUwB2jobqqcMwfw9n295 IEeKSuu0PcttZNfLGg06wBashAMl9h42ZakxlbYpbOPj0k/MdoB8EijdO3d2M4eV DJKQNj7XiYE+yNmecEGkxaEJBma0xloA0iiGdPJHFlK3dHKKI93A/IU4KRhAE+iB e+HlxOMyyGOk84+vWoT9IeQddYaxdlBm44TznYNN6en1lu2nqAA4s2XZEvw4rIkB IgQQAQIADAUCQq/WegUDABJ1AAAKCRCXELibyletfNBuCACi6+OSvQrLBIeSmhIy 7Xgv2y/zfTKc1J++Nj2HFWC/X9pJCDHEyY5h0enHrePPoQzAlNY4Mz8sNzI2gc5V +6B90XMJUCO4xz0wSlSTSMgX7sKO3zti6TaHi1dky89UDwOatrvxtRFeY957dInE WDTyucTfDCIu7sQEHClXlTNTWXXs/MArjmtUfldCs6KWEvBiXec8YbAyC9gKZ3YV ERrkMEJJYVWJiqp4jkCu7N7SUm2HS4GUIfacP+Qt+FJqHjkhYmGBJXfRSNcnOubb S5gk1VJ7FKM7ZwQYDUZgouQUi6BiLoaJ3D0mHU+kxbg7PPhbT06u/MJh6v1B1Isa 2s/niQEiBBABAgAMBQJCtR/qBQMAEnUAAAoJEJcQuJvKV618R+oIAJj01Y/c/uq+ 4FqSfanoAGR5uqz3Ln+ijzycyMMQ8cY5fZpGaeeWzi3POlfnz35BsVXASWec9x7+ bHVQY6Rn6DoQFRX5cQ6WwwRpsg8lAoL3uzN99Frj8rwGoLkTCJvRNZVbAaDmMHAa +dAaq+ro1B22IGxvfR6N7EfjBHmeXfTHkSdszEBl9WnpsyziapSpkGFvcdzPWnBg Dh70nybKseCDdcIdTRCmj5MIBn150nav/1SzX+oustuxoRxrjYZUFr8dOK52xHst GgaSyNqKE8XJ8CCBvEI2x6pzIrle3vdBaXD9Yw3lOhNN0OZsqZWb/uQCW884tlDN XhUExNhcHXqJASIEEAECAAwFAkK3GioFAwASdQAACgkQlxC4m8pXrXz+ugf+KMyj rXp55VY5hSYZUoM1g+NW2ayOiT/pQNzOlVZt/fA64zwkmCGaRzEC6jB0rAi98b5o mvgCEwXWqg6z9asSbOk6/kIStI8se4hxp0BQSXIB7sXyrpopugigET3yIwSOM7M6 fez/WHJYF/8xOzA1VM5Fbs4M2V15hpjA0lwBRHgkxqBNaHl3FjhqO8SmcECCMART IVamMKniOK8hOVH0NKbjj7Zbe21EFuyXsxa32ROCPIY4mspKNFXtT7ixXmLjMxj0 P3yNUVBGkgjh86eP6QjT54V70nwVbjg6u7f5xeQoWHS+8dt4QhVOZDz3XSjKwgZq NllQ5YCSu/AdHJfcM4kBIgQQAQIADAUCQszcBwUDABJ1AAAKCRCXELibyletfBsa B/9HKXrv7HDwZ4LS4Sf/wrtlUZIEMmbojeF3G9QWBXp1D/SbSJHPTuXM9jsZcfTZ VX+neDDB5FkaGtqLf3Wcm5AT06qTswKbCrg1XlFQ66YuyqgX3+Y2i4GloATDNlPS Ho5g2YliIoZXxP6VzrmCHVDKBi/TWNxMaCgwPRtJvSRGUiitv/AJR4LCyz6T6QGJ +WRPaHwviT2FX0aAjP3q3tZKaXNmGskNuX5WUUnThUuZWwFJ2eZcqF3Mr7ZTmf/v QnwEoyEdULUNBWF15R5FD1EvK9ELQIEWOWBILv7Mt5ozNSqTYV78UpG5MiiM3DMh QP3iaqLsVzHvCNxgDmPZ04mBiQEiBBABAgAMBQJC0XrQBQMAEnUAAAoJEJcQuJvK V618EDYIAJgUg6kV4hU4Z8ML9Ka2GWazj34BmEMqkk6Jm6IRP2nVkHbe+/NN7vOZ TA+ZHFJKy5zu144+o6PqR2W9ZkcbWplUz4bC4POXclEfbIywH/7coqUwa3RjvRrO TmiYAZKV/Z7yngC3BLBIktlEvTZustX6LsqPrqLn6Wk8GI161HWYhwRCIXQ9Vs2e BhSGPzHp/vEOJHdGMsXpxEakcCCnn2SBwYcrkV4AN+gOJhsoH55hD1/mXEK95zoc S2uUaxxhn3jKEUFMOnCfcfuqZ52broV3OUczxozFloIGxxZv9xwBNHOMDfA0LI6Q 9YsL5uWDE1QKdwkIzqDC4mBzgOxp5C+IVwQTEQIAFwUCO3fNQAULBwoDBAMVAwID FgIBAheAAAoJED+4njonxrDkf60AnRUchhESPbyQbSvy7sX1xunLHgRkAJ49jGt8 9LQdh4lvqKfpj+RMqY1LI7Q0TWljaGFlbCBBbmRyZXMgKE1pY2hhZWwgQW5kcmVz IHByaXZhdGUpIDxtYUBrbTEzLmRlPohgBBMRAgAgAhsjBgsJCAcDAgQVAggDBBYC AwECHgECF4AFAkhmDeAACgkQP7ieOifGsOQDpwCdGxVwFjNt98OuylGNhhjm2GD0 HUkAn19PVAoWFjmHhSadUJAehJVloqjbiGMEExECACMCGyMGCwkIBwMCBBUCCAME FgIDAQIeAQIXgAUCSGYGFQIZAQAKCRA/uJ46J8aw5BvgAJ0Zo8czcPx39AUXGXIU v+RzkBeujwCfYOXRCpThfRrd2FyuUAULu+/PNnu5Ag0EO3fNWhAIANoFOLBJ37Vr 9umFyQJk2jB1zHfh8p0wF/Tw1giR7LFgTTpgvy27JR1BTSqJkeW56sfeDfMkHcRF SEsRl0SKHfpHLQANevwvygygx6OgeJrCdgJTkhWUdB7SgVC1yMSsWm0uYTPSOH+l 9PpICNH+tP1po0qoQsD387uY8XOwlLSAuFTOGGT0q7N1g/swF/5RwJhLtgj0viQR /lzoZ9f5GB87Ih9ab8LgBj1XcddjtFe+Qr0pZ+0tT5Fqz9/muOzeW3z1nHvE/7di LMorlevz1gD1JOPoFDaTmLsuWXdFP0aZoi/2Wx39HVD8Zpp8vN5M3Ta/11oXhoHG AIuIQ3kFELcAAwUIALMbFRojYmYCl6TCZ23PB/+8fK2VjAu4vUzuvv78U17H26pO G4mVbW7XXFBmN30viiqEVMdrm76odOe5VhF+lCB8irbvedL0al/C9vsAUGKRxJB0 1Y/mXsDuPvxmiuGqcWrb8j3chBh129dCO+dR4MR1xfth23EnI/fncggAeXGT6+HD oXfXTHoMolWKa9Fh3vRTZqFtBQTYPenr7lhUjPmM3cpswSTxkwIqC2pUmmDMekSu IOCVIbe5w+f5OB8j2Bd3ZYgxsePcf20OWOXdLNucO1KPaM9zS7LxhmlzAOWcXj8E EK9bAvdi1DXDgJA+AYmD6ol3uX+eoIDh3akYTTyIRgQYEQIABgUCO3fNWgAKCRA/ uJ46J8aw5AtiAJkBhcP6w63v4r8niiOPjmgN6NbxxACeK/BBzQT+qgqQfHYEW0Sc ixhE83U= =Z5HF -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/control.xml000066400000000000000000000675071476576476200257150ustar00rootroot00000000000000 control true true false never 95 true true simple false true true true true false true false /root/ /root/inst-sys/ false auto http://download.opensuse.org/YaST/Repos/openSUSE_103_Servers.xml false true 7G 40 5G 20G false false 15G 25G false false laptop ifplugd language keyboard timezone users networking firewall host routing proxy runlevel x11 nis ldap printer add-on installation,demo,autoinstallation initial initial no hwinfo keyboard mouse partitions software bootloader timezone language runlevel partitions software_simple country_simple hwinfo keyboard mouse partitions software bootloader timezone language runlevel update initial normal no update packages backup language update initial initial no hwinfo media update packages backup language keyboard network continue,normal yes lan 20 general 5 dsl 30 isdn 40 modem 50 remote 60 firewall 10 proxy 70 hardware continue yes x11 printer sound tv bluetooth all yes yes installation initial language no yes yes true checkmedia license disks_activate system_analysis productsources yes add-on yes timezone yes yes desktop yes proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no no finish no all yes yes update initial language no yes true checkmedia license disks_activate system_analysis update_partition upgrade_urls productsources yes add-on yes yes proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no no finish no all initial repair info repair all yes yes initial screen_shot no yes language true proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no yes all yes yes initial demo no language true proposal initial do_resize false i386,x86_64,ia64 prepdisk kickoff rpmcopy no no continue update all yes yes rpmcopy no no yes ask_net_test no do_net_test addon_update_sources suse_register ask_online_update you restore_settings suseconfig no no release_notes congratulate continue installation yes yes all yes root no initialization no no netprobe no no rpmcopy no no hostname proposal network fam ask_net_test do_net_test addon_update_sources suse_register ask_online_update you extrasources restore_settings auth user suseconfig no no release_notes proposal hardware save_hardware_status congratulate initial autoinstallation all no no autoinit all true autosetup proposal initial no yes prepdisk kickoff autoimage rpmcopy finish all no no continue autoinstallation netprobe autopost rpmcopy yes autoconfigure suseconfig libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/gpg-pubkey-0dfb3188-41ed929b.asc000066400000000000000000000015621476576476200305400ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBEHtkpsRBACRHiXh3olS++6/Mp9N7ByGMmjaaE+Y8cJQLUPG1myrbW5aogIP 0WenayhGbbgOHNWgd5dQ8KQpYYFoQuUHjFYzj5MvgrdOENOvD7ZNJ6+EmbkNh5cV zUYfNG9jdiGweZkyA1sh8DYS0JiUmQ4CzaBD/DotB/dCmDcyuNQFiw4qKwCglQah ATyueBRsOiXl0NIs1uB6dkkD/1A2YmQ6te1q38a1J+a8os6bDlMZhVnkZdhJdw6x eBwUb9XS0n7hyt/AKCcBnrDEUQJuhBMNgzctJvbuMv27yRMANAXZDQkp0ip/yHLJ PhUdSNTTRHOL9bV3t+JuZ9xmuclprwyrrJYUkEESXNc0tkuczHBP2c/RqA3OxYHt hrHLA/9Pqe2gEleeo8l26u/uFXs2dtwjh8EZmdhHoqGcOlpYR4DyAg2D+jYfh3RI oPzIwRlHVUR1ii5h8iPi98BVuEvukwfbbQ1K22Jwzxt6w3ihCXBKWKbeC3ElIMfA hVMchLFUbTAw+yodO/u3NHxKQ34+ginid9dVyxV5T0gpDEEHObQrT3BlbiBFbnRl cnByaXNlIFNlcnZlciA8c3VwcG9ydEBub3ZlbGwuY29tPoheBBMRAgAeBQJB7ZKb AhsDBgsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEHPSXWMN+zGID4oAoJPTGZbZApW+ tuU422mHYGwoqgjrAJ9fhzRhRbV3YsOxKUomNeuIfmWGXA== =Qv5+ -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/gpg-pubkey-307e3d54-44201d5d.asc000066400000000000000000000011521476576476200303560ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIF AkQgHV0CGwMFCQQ9AoAECwcDAgMVAgMDFgIBAh4BAheAAAoJEOOlw2Awfj1UjUIE AIf3SLlrfj2RsCDjyYThXen+A/WTYDPbY+NYmmVvFQilHNQY9ZrJ5cNohRQu6hA+ Sccrf11Uy24tTHWSTzuG9VzFeeIAcIU02XHar0w3QbvTk6IqeG+OZlfOGJj1sdx4 JKwpwk9mSdrq2ELhrkPZiVWS7RmRkPr2klwYgKGWbmOJ =ZmDA -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/gpg-pubkey-3d25d3d9-36e12d04.asc000066400000000000000000000032431476576476200304450ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQENAzbhLQQAAAEIAKAkXHe0lWRBXLpn38hMHy03F0I4Sszmoc8aaKJrhfhyMlOA BqvklPLE2f9UrI4Xc860gH79ZREwAgPt0pi6+SleNFLNcNFAuuHMLQOOsaMFatbz JR9i4m/lf6q929YROu5zB48rBAlcfTm+IBbijaEdnqpwGib45wE/Cfy6FAttBHQh 1Kp+r/jPbf1mYAvljUfHKuvbg8t2EIQz/5yGp+n5trn9pElfQO2cRBq8LFpf1l+U P7EKjFmlOq+Gs/fF98/dP3DfniSd78LQPq5vp8RL8nr/o2i7jkAQ33m4f1wOBWd+ cZovrKXYlXiR+Bf7m2hpZo+/sAzhd7LmAD0l09kABRG0JVN1U0UgU2VjdXJpdHkg VGVhbSA8c2VjdXJpdHlAc3VzZS5kZT6JARUDBRA24S1H5Fiyh7HKPEUBAVcOB/9b yHYji1/+4Xc2GhvXK0FSJN0MGgeXgW47yxDL7gmR4mNgjlIOUHZj0PEpVjWepOJ7 tQS3L9oP6cpj1Fj/XxuLbkp5VCQ61hpt54coQAvYrnT9rtWEGN+xmwejT1WmYmDJ xG+EGBXKr+XP69oIUl1E2JO3rXeklulgjqRKos4cdXKgyjWZ7CP9V9daRXDtje63 Om8gwSdU/nCvhdRIWp/Vwbf7Ia8iZr9OJ5YuQl0DBG4qmGDDrvImgPAFkYFzwlqo choXFQ9y0YVCV41DnR+GYhwl2qBd81T8aXhihEGPIgaw3g8gd8B5o6mPVgl+nJqI BkEYGBusiag2pS6qwznZiQEVAwUQNuEtBHey5gA9JdPZAQFtOAf+KVh939b0J94u v/kpg4xs1LthlhquhbHcKNoVTNspugiC3qMPyvSX4XcBr2PC0cVkS4Z9PY9iCfT+ x9WM96g39dAF+le2CCx7XISk9XXJ4ApEy5g4AuK7NYgAJd39PPbERgWnxjxir9g0 Ix30dS30bW39D+3NPU5Ho9TD/B7UDFvYT5AWHl3MGwo3a1RhTs6sfgL7yQ3U+mvq MkTExZb5mfN1FeaYKMopoI4VpzNVeGxQWIz67VjJHVyUlF20ekOz4kWVgsxkc8G2 saqZd6yv2EwqYTi8BDAduweP33KrQc4KDDommQNDOXxaKOeCoESIdM4p7Esdjq1o L0oixF12CohGBBARAgAGBQI7HmHDAAoJEJ5A4xAACqukTlQAoI4QzP9yjPohY7OU F7J3eKBTzp25AJ42BmtSd3pvm5ldmognWF3Trhp+GYkAlQMFEDe3O8IWkDf+zvyS FQEBAfkD/3GG5UgJj18UhYmh1gfjIlDcPAeqMwSytEHDENmHC+vlZQ/p0mT9tPiW tp34io54mwr+bLPN8l6B5GJNkbGvH6M+mO7R8Lj4nHL6pyAv3PQr83WyLHcaX7It Klj371/4yzKV6qpz43SGRK4MacLo2rNZ/dNej7lwPCtzCcFYwqkiiEYEEBECAAYF AjoaQqQACgkQx1KqMrDf94ArewCfWnTUDG5gNYkmHG4bYL8fQcizyA4An2eVo/n+ 3J2KRWSOhpAMsnMxtPbB =Ay23 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/gpg-pubkey-7e2e3b05-44748aba.asc000066400000000000000000000020211476576476200305170ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBER0iroRBADfqUeJmPCXqPJFnf3CVKy40dL1F+gfvP+JHN7/uu4c9+oCYjI1 uAE8iGTm/Twb/Zzbs4dt0iWjhNFXbRi42rMww4d/8QcPYZ21WSehh+fv8nCjt2sw LeC87ar2SR8OTpJBK0fQlcd4e6H5GMntfI6SYEUOPd8m/eQ+4+1AxpUUpwCgswaF 13fePZGI//pDn5tGjbvmaP8D/R3qum/I+oDS8lbFeeDS10GkEkwTYec13gdfsq6I yzIj7VBsC+rGfbipv+VGR61Q4d19pOHKLDekr9OG+3G4ZcYM4NQvQZR+QIlp3xWu nBmYD1LRkHLVj+Z4DGQhjjOffkPSuacKPymMaZ/aRiLgTIAo97W2YPhutscXrLSG 2Y+BA/4jsyaDb7kbW4wc8RtPIcuFEheVqgBeRakP9Uj47kBMBEpPtI/mIdY5liKk ztKnuQG6ROYLNV/PW0ZbE1uT64C710weh4cB3PnZLV5P10deDLBjHk8MJQGCTSDD JYvhutUzQfshAU6j2kErGvKdZxWGezab34vFyMP2oLGqswPAJrRQTm92ZWxsIFBy b3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20pIDxub3ZlbGwt cHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6IZgQTEQIAJgUCRHSKugIbAwUJA8JnAAYL CQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEBTCi8l+LjsFWEoAn13x+5ObqkW08gYF YNDlcGPjQuGPAJ9kAQbVUvvh1u9mBgu91cQ9W/TkHYhGBBMRAgAGBQJEexD/AAoJ EKhO2uicgArKFLwAn0B+g2mJ5n8LrBziTQ5SjnSPyDBXAJwJoYTta5Sfw/3vVGpU fJAKVDoB9w== =tJSz -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/gpg-pubkey-9c800aca-40d8063e.asc000066400000000000000000000042021476576476200305150ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff 4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiBQJA2AY+AhsD BQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAKypCfAJ9RuZ6ZSV7Q W4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+IRgQQEQIABgUCOnBe UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/ EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5 +D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z 3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4 l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0 bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L 1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ 1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspnpgCfRbYwxT3iq+9l /PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuO =pJli -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/gpg-pubkey-a1912208-446a0899.asc000066400000000000000000000034201476576476200302300ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQILBERqCJkBEACdqhZWdAbUHLIumXMEgv+GFjr1ZzVHgynnFOzztU/8sxZNa9cm YV4HZpVfjMr7fos3ArzyiPPt/336cf7w9p79/ZS4rHSNPDMlPCtXYvFxUbvU0/GY q4jwcBsrJ0xaJ9CP5bWyAgVKOb7Y6k0ktaLjRR+tDfMsHA4H0ClMoRr6ATw8NL0e VCfAHuzqCKvX1If8ng+wTivtAhKvz/WwQiELNELmPfc5tZHOw8NgP/r0Pze18Hn2 dlAHu0WpC7uoR00vscsMIJiJJPcsxbL1F1eADKnk+wEy8Go+EJeJ5i0WoFbqD52q Lv/C/oY6NVtVY0MBwtn+oQNSnQ4JBsB/Akdt53LAi0ZtNQxMyUW+76R8FCOmVCV8 WGiF5CPRP0yvG80AMBjBjKjHb/v8ov5MnIyFimzAHS1gQcUNxTEYA/5eFwoYcGcK weGq9FUjPTzLQAgvp7XmOzHpSAfJ7qysxFTepNsSZZhgizJyInrdQldr+GYcUNqB krD9MWmFop975OxhCTEnNv/HcE79r8WD26HzDFYxTiTJbr0pU/ivBzo+rjq+YG2V stJk+udVYmZTnC4LmXus8JiNuqBXbxNscwCBpcJ8YcfCV6uh+7E0XfXZsgVUFLp1 NF+ylYRGTycOlWoZODrnJevZW7N9O3bWRx/G2P4bJD07LsDLe4i5hymf5QAGKbRQ Tm92ZWxsIFByb3ZvIEJ1aWxkIChDb250YWN0IHNlY3VyaXR5QG5vdmVsbC5jb20p IDxub3ZlbGwtcHJvdm8tYnVpbGRAbm92ZWxsLmNvbT6JAjMEEwECAB0FAkRqCJkG CwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBHijLooZEiCKSFD/93vZHCAMLEfksU KnvXl08bv1rfuamuyJnE3ANRE5RDyypriHMCnkVxazvQ2WI4W4UEjluL9+SzZwtV ZvKVoAr31614nSyWwv2YnJTHfjMG+xRlkolZMnuIiB9PcCBo9+GPU0ABuzo4pEJW NIRoSS1NFbAZBhtUnY0cN+trM5QObLl7xXTavLyGk//blkk57fov7GXsQJlZUig0 l2yt5XNyGpLUnTMDumHh8b389quF+0+ZfdwOy7A768xjipAZiTvIujBrEv51wrxh 0HBT0VGA0MhD9t0B+Ce4BM9P/iVMO00naaOp6PqMfPPKxQQqer8qy1i6UWBx95SY mKZBIvOm2d9PezDxkckCu61r6krx1iKnT1wdprCAkIYwALK118SpbxuyGW0bhRHc wsc/akzWH72fS0Xu49mvL4k4A2U9asdeQid3dMgbtm5mSWof0yiU/G4YNn0yeXoY oG1VbCAqQbFX1Rvd6GITJVqI+ekW/uMA9BP78dF8wBeG0+QmpQnSf+eOsxB/RT8o Kb4hHY+29MUlg+i9ceVt7hoKr03J/uIG5TXFXRYLaI0iAFVlKfWxpqDfS2XA4+dD VYt+5RDgBcnxDaTB4FE9GqcYScNfe7+NFtL0p0wOPftbmgZzGjucTmrD8mDUNdqA xGK7vlk4GATSfOQlq7G6LXW6RYnInohGBBMRAgAGBQJEazMlAAoJEKhO2uicgArK 2vMAn0TbVDESEVKVuFZStrfIzOvJQrR9AJsH733Ju1kE99GFrdfCeGqpckmNhg== =E+qN -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/installation.xml000066400000000000000000000101101476576476200267100ustar00rootroot00000000000000 control-ISSLE false auto true product continue,normal installation yast2-issleconfig no no normal installation,normal sw_single yes yes issleconfig yes yes inst_release_notes yes yes inst_congratulate no yes no no continue,normal installation,normal,update hostname root ca_mgm yast2-issleconfig suseconfig issleconfig yes yes libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/license.tar.gz000066400000000000000000000000551476576476200262450ustar00rootroot00000000000000WK  Om77'(libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/media.1/000077500000000000000000000000001476576476200247125ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/media.1/directory.yast000066400000000000000000000000761476576476200276230ustar00rootroot00000000000000info.txt license.zip media products products.asc products.key libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/media.1/info.txt000066400000000000000000000027641476576476200264170ustar00rootroot00000000000000 openSUSE FACTORY 10.3-factory Attention! You are accessing our BETA Distribution. If you install any package, note that we can NOT GIVE ANY SUPPORT for your system - no matter if you update from a previous system or do a complete new installation. Use this BETA distribution at your own risk! We recommend it for testing, porting and evaluation purposes but not for any critical production systems. If you are curious and would like to help us to find the bugs, you're very welcome. Please enter bug reports following the instructions given at http://bugs.opensuse.org . If you want to talk about this distribution with others, you can discuss on the mailing list opensuse-factory@opensuse.org. Sources for development releases are not distributed via mirrors to reduce the bandwidth and storage on these mirrors. You can always find the latest source at http://download.opensuse.org/distribution/SL-OSS-factory/ In case you need the exact source of this development release you can find it on: http://www.novell.com/products/opensuse/source_code.html Alternatively, see http://www.novell.com/products/opensuse/source_code.html or send e-mail to sourcedvd@suse.de to request the source for a specific release of openSUSE on DVD. Please note that we will charge $15 or 15 Euros to cover our costs of distribution. Use this distribution at your own risk - and remember to have a lot of fun! :) Your openSUSE Team. libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/media.1/media000066400000000000000000000000521476576476200257110ustar00rootroot00000000000000SUSE Linux Products GmbH 20070705102239 1 libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/media.1/products000066400000000000000000000000351476576476200264760ustar00rootroot00000000000000/ SuSE-Linux-STABLE-X86 10.3 libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/media.1/products.asc000066400000000000000000000002751476576476200272510ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQBGjNGIqE7a6JyACsoRAoWnAJkB1wTxOQngy5xvjTiUvwWp65wW5wCg hCbA+jw64zZYCa7IM71hBBynFL4= =nSHl -----END PGP SIGNATURE----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/media.1/products.key000066400000000000000000000042021476576476200272650ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.4-svn0 (GNU/Linux) mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff 4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiBQJA2AY+AhsD BQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAKypCfAJ9RuZ6ZSV7Q W4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+IRgQQEQIABgUCOnBe UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/ EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5 +D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z 3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4 l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0 bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L 1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ 1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspnpgCfRbYwxT3iq+9l /PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuO =pJli -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/000077500000000000000000000000001476576476200244535ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/000077500000000000000000000000001476576476200256135ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/descr/000077500000000000000000000000001476576476200267135ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/descr/kde-10.3-71.noarch.pat000066400000000000000000000235501476576476200322460ustar00rootroot00000000000000# openSUSE Patterns 10.3-71.i586 -- (c) 2007 SUSE LINUX Products GmbH # generated on Wed Jul 4 17:31:46 UTC 2007 =Ver: 5.0 =Pat: kde 10.3 71 i586 =Cat.cs: Grafická rozhraní =Cat.da: Grafiske miljøer =Cat.de: Grafische Umgebungen =Cat: Graphical Environments =Cat.en_GB: Graphical Environments =Cat.es: Entornos gráficos =Cat.et: Graafilised keskkonnad =Cat.fi: Graafinen ympäristö =Cat.fr: Environnements graphiques =Cat.hr: Grafičko okruženje =Cat.hu: Grafikus környezet =Cat.id: Lingkungan Grafis =Cat.it: Ambienti grafici =Cat.ja: グラフィック環境 =Cat.km: បរិស្ថាន​ក្រាហ្វិក =Cat.lt: Grafinės aplinkos =Cat.nb: Grafisk miljø =Cat.nl: Grafische omgevingen =Cat.pl: Środowiska graficzne =Cat.pt_BR: Ambientes Gráficos =Cat.ru: Графическое окружение =Cat.sk: Grafické prostredia =Cat.sv: Grafiska miljöer =Cat.uk: Графічні середовища =Cat.zh_CN: 图形环境 =Cat.zh_TW: 圖形環境 =Ico: kde =Sum: KDE Desktop Environment =Sum.bg: KDE Работна среда =Sum.cs: Prostředí KDE =Sum.da: KDE skrivebordsmiljø =Sum.de: KDE Desktop-Umgebung =Sum.el: ΠΡριβάλλον ΕπιφάνΡιας ΕργασΗας KDE =Sum.en_GB: KDE Desktop Environment =Sum.es: Escritorio KDE =Sum.et: KDE töölaua keskkond =Sum.fi: KDE-työpöytäympäristö =Sum.fr: Environnement de bureau KDE =Sum.hu: KDE asztali környezet =Sum.it: Ambiente Desktop KDE =Sum.ja: KDE デスクトップ環境 =Sum.km: បរិស្ថាន​ផ្ទៃតុ KDE =Sum.ko: KDE 데스크탑 환경 =Sum.lt: KDE darbalaukio aplinka =Sum.nb: Skrivebordsmiljøet KDE =Sum.nl: KDE Desktop Environment =Sum.pl: Środowisko graficzne KDE =Sum.pt_BR: KDE Ambiente de Desktop =Sum.ru: Рабочая среда KDE =Sum.sk: Prostredie KDE =Sum.sl: Namizno okolje KDE =Sum.sv: Skrivbordsmiljön KDE =Sum.uk: Стільничне середовище KDE =Sum.zh_CN: KDE 桌面环境 =Sum.zh_TW: KDE 桌面環境 +Des.bg: KDE е мощна свободна графична среда за работни станции с Линукс, комбинираща в себе си лекота на употреба, съвременна функционалност и изключителен графичен дизайн с техническото превъзходство операционната система Линукс. -Des.bg: +Des.ca: KDE és un potent entorn gràfic d'escriptori de programari lliure per a les estacions de treball de Linux. Combina la facilitat d'ús, la funcionalitat contemporània i un disseny gràfic excepcional amb la tecnologia del sistema operatiu Linux. -Des.ca: +Des.cs: KDE je svobodné grafické prostředí pro pracovní stanice. Snoubí v sobě uživatelskou přívětivost, moderní funkcionalitu a atraktivní vzhled s linuxovou technologií. -Des.cs: +Des.da: KDE er et stærkt grafisk skrivebordsmiljø til Linux-arbejdsstationer og er fri software. Det er både let at bruge, har mange funktioner og et flot grafisk design med teknologien fra Linux-operativsystemet. -Des.da: +Des.de: KDE ist eine leistungsstarke kostenlose grafische Desktop-Umgebung für Linux-Arbeitsstationen. Das Programm kombiniert Benutzerfreundlichkeit, moderne Funktionsweise und hervorragendes grafisches Design mit der Technologie des Linux-Betriebssystems. -Des.de: +Des: KDE is a powerful free software graphical desktop environment for Linux workstations. It combines ease of use, contemporary functionality, and outstanding graphical design with the technology of the Linux operating system. -Des: +Des.en_GB: KDE is a powerful free software graphical desktop environment for Linux workstations. It combines ease of use, contemporary functionality, and outstanding graphical design with the technology of the Linux operating system. -Des.en_GB: +Des.es: KDE es un potente programa escritorio gráfico gratuito para estaciones de trabajo Linux. Combina la facilidad de uso, funciones contemporáneas y un diseño gráfico insuperable con la tecnología del sistema operativo Linux. -Des.es: +Des.fi: KDE on vaikuttava vapaa työpöytäympäristö Linux-työasemille. Siinä yhdistyy helppokäyttöisyys, käytettävyys ja upea graafinen suunnittelu Linux-käyttöjärjestelmäteknologian kanssa. -Des.fi: +Des.fr: KDE est un environnement de bureau graphique gratuit et puissant pour les stations de travail Linux. Il allie simplicité d'utilisation, fonctionnalités modernes et conception graphique exceptionnelle grâce à la technologie du système d'exploitation Linux. -Des.fr: +Des.hr: KDE je moćno besplatano grafičko okruženje radne površine za Linux radne stanice. Kombinira lakoću korištenja, svakodnevnu funkcionalnost i izvrstan grafički dizajn zajedno s tehnologijom Linux operativnog sustava. -Des.hr: +Des.hu: A KDE egy nagyteljesítményű, ingyenes, grafikus, asztali környezet Linux munkaállomásokhoz. Az egyszerű használatot, a modern funkcionalitást, valamint a kiemelkedő grafikai kivitelt egyesíti a Linux operációs rendszer technológiai előnyeivel. -Des.hu: +Des.id: KDE merupakan lingkungan desktop grafis free software yang powerful untuk workstation Linux. Ia menggabungkan kemudahan, fungsionalitas kontemporer, dan desain grafis yang hebat dengan teknologi sistem operasi Linux. -Des.id: +Des.it: KDE rappresenta un efficiente ambiente desktop grafico software gratuito per le workstation Linux. Associa facilità d'uso, funzioni aggiornate e ambiente grafico accattivante alla tecnologia del sistema operativo Linux. -Des.it: +Des.ja: KDEは、Linuxワークステーション用の無料で強力なソフトウェアグラフィカルデスクトップ環境です。 使いやすさ、現代の機能性、そして優れたグラフィカルデザインをLinuxオペレーティングシステムの技術と統合します。 -Des.ja: +Des.km: KDE គឺ​ជា​បរិស្ថាន​ផ្ទៃតុ​ក្រាហ្វិក​ឥត​គិត​ថ្លៃ​សម្រាប់​ស្ថានីយ​ការងារ​របស់​លីនុច ។ វា​រួមបញ្ចូល​នូវ​ភាព​ងាយស្រួល​ក្នុងការ​ប្រើប្រាស់ និង​មុខងារ​ដែល​វិវត្ត​តាម​សម័យកាល​ជានិច្ច ជាមួយ​នឹង​បច្ចេកវិជ្ជា​រចនា​ក្រាហ្វិក​គំរូ​តាម​​ប្រព័ន្ធ​ប្រតិបត្តិការ​លីនុច ។ -Des.km: +Des.lt: KDE yra galinga nemokama grafinė darbalaukio aplinka Linux darbo stotims. Ji sujungia lengvą naudojimą, šiuolaikinį funkcionalumą ir puikų grafinį dizainą su Linux operacinės sistemos technologijomis. -Des.lt: +Des.nb: KDE er et effektivt og elegant grafisk skrivebordsmiljø for Linux-arbeidsstasjoner. KDE kombinerer brukervennlighet, avanserte funksjoner og lekker grafisk design med teknologien i Linux-operativsystemet. -Des.nb: +Des.nl: KDE is een krachtige, vrije grafische desktop environment voor Linux-computers. Het combineert eenvoudig gebruik, uitgebreide functionaliteit en een uitstekend grafisch design met de technologie van het Linux-besturingssysteem. -Des.nl: +Des.pl: KDE jest potężnym środowiskiem graficznym dla linuksowych stacji roboczych. Łączy łatwość obsługi, szerokie możliwości i atrakcyjny wygląd z technologiamisystemu operacyjnego Linux. -Des.pl: +Des.pt: O KDE é um ambiente de trabalho gráfico livre e potente, para estações de trabalho Linux. Este combina a facilidade de utilização, funcionalidade contemporânea, e design gráfico de grande destaque, com a tecnologia do sistema operativo Linux. -Des.pt: +Des.pt_BR: O KDE é um poderoso ambiente gráfico de área de trabalho de software gratuito para estações de trabalho Linux. Ele combina a facilidade de uso, a funcionalidade contemporânea e o excelente design gráfico à tecnologia do sistema operacional Linux. -Des.pt_BR: +Des.ru: KDE это мощная бесплатная графическая система для Linux рабочих станций. Она комбинирует легкость в использовании, современную функциональность, превосходный дизайн с технологиями оперативной системы Linux. -Des.ru: +Des.sk: KDE je výkonné grafické prostredie a slobodný softvér, pre linuxové pracovné stanice. Kombinuje jednoduchosž použitia, modernú funkcionalitu a výnimočný grafický dizajn spolu s technológiou operačného systému Linux. -Des.sk: +Des.sv: KDE är en kraftfull fri programvara för grafisk skrivbordsmiljö för Linux-arbetsstationer. Den kombinerar användarvänlighet, moderna funktioner och fantastisk grafisk formgivning med tekniken hos operativsystemet Linux. -Des.sv: +Des.uk: KDE - це потужне графічне середовище для робочих станцій Linux. Воно поєднує простоту використання, модерну функціональність та видатний графічний дизайн з операційною системою Linux. -Des.uk: +Des.zh_CN: KDE 是一个软件图形桌面环境,它用于 Linux 工作站,不但功能强大,而且还可以免费使用。 它将先进的功能、独特的图形设计与 Linux 操作系统的技术相结合,使用方便。 -Des.zh_CN: +Des.zh_TW: KDE 是針對 Linux 工作站所設計、功能強大的免費軟體圖形桌面環境。它將容易使用、現代化功能及傑出的圖形設計等結合到 Linux 作業系統之中。 -Des.zh_TW: +Rec: kde_internet multimedia office kde_utilities imaging games non_oss non_oss_java xgl -Rec: +Req: kde_basis -Req: =Vis: true =Ord: 1520 +Prc: opensuse-quickstart_en -Prc: +Psg: kdeedu3 kiosktool -Psg: libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/descr/packages000066400000000000000000000231511476576476200304160ustar00rootroot00000000000000##---------------------------------------- =Pkg: kdelibs3 3.5.7 24 i586 =Cks: SHA1 05f0647241433d01636785fd282cc824a6527269 +Req: rpmlib(VersionedDependencies) <= 3.0.3-1 qt3 >= 3.3.8 openssl hicolor-icon-theme sudo /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 /bin/sh /usr/bin/perl libDCOP.so.4 libHalf.so.4 libICE.so.6 libIlmImf.so.4 libSM.so.6 libX11.so.6 libXau.so.6 libXcursor.so.1 libXext.so.6 libXfixes.so.3 libXft.so.2 libXi.so.6 libXinerama.so.1 libXrandr.so.2 libXrender.so.1 libacl.so.1 libacl.so.1(ACL_1.0) libart_lgpl_2.so.2 libasound.so.2 libasound.so.2(ALSA_0.9) libaspell.so.15 libattr.so.1 libattr.so.1(ATTR_1.0) libbz2.so.1 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.1.2) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.2) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.3.4) libc.so.6(GLIBC_2.4) libcups.so.2 libdl.so.2 libdl.so.2(GLIBC_2.0) libdl.so.2(GLIBC_2.1) libdns_sd.so.1 libexpat.so.1 libfam.so.0 libfontconfig.so.1 libfreetype.so.6 libgcc_s.so.1 libgcc_s.so.1(GCC_3.0) libgcc_s.so.1(GLIBC_2.0) libgssapi_krb5.so.2 libgssapi_krb5.so.2(gssapi_krb5_2_MIT) libidn.so.11 libjasper.so.1 libjpeg.so.62 libkabc.so.1 libkabc_dir.so.1 libkabc_file.so.1 libkabc_ldapkio.so.1 libkatepartinterfaces.so.0 libkdecore.so.4 libkdefakes.so.4 libkdefx.so.4 libkdeinit_cupsdconf.so libkdeinit_dcopserver.so libkdeinit_kaddprinterwizard.so libkdeinit_kbuildsycoca.so libkdeinit_kcmshell.so libkdeinit_kconf_update.so libkdeinit_kcookiejar.so libkdeinit_kded.so libkdeinit_kio_http_cache_cleaner.so libkdeinit_kio_uiserver.so libkdeinit_klauncher.so libkdeinit_knotify.so libkdemm.so.0 libkdeprint.so.4 libkdeprint_management.so.4 libkdesu.so.4 libkdeui.so.4 libkhtml.so.4 libkio.so.4 libkjs.so.1 libkmediaplayer.so.0 libknewstuff.so.1 libkntlm.so.0 libkparts.so.2 libkresources.so.1 libkscript.so.0 libkspell2.so.1 libktexteditor.so.0 libkutils.so.1 libkwalletbackend.so.1 libkwalletclient.so.1 libm.so.6 libm.so.6(GLIBC_2.0) libnetworkstatus.so.0 libpcre.so.0 libpng12.so.0 libpthread.so.0 libpthread.so.0(GLIBC_2.0) libpthread.so.0(GLIBC_2.2) libqt-mt.so.3 libresolv.so.2 libresolv.so.2(GLIBC_2.0) libresolv.so.2(GLIBC_2.2) libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(CXXABI_1.3.1) libstdc++.so.6(GLIBCXX_3.4) libstdc++.so.6(GLIBCXX_3.4.9) libtiff.so.3 libutil.so.1 libvcard.so.0 libxcb-xlib.so.0 libxcb.so.1 libxml2.so.2 libxslt.so.1 libz.so.1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Req: +Prq: rpmlib(VersionedDependencies) <= 3.0.3-1 /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Prq: +Prv: kups keramik kdelibs3-cups kdelibs3-33addons kdepim3-networkstatus kdelibs3_base = 3.3 cupsdconf.so dcopserver.so highcolor.so highcontrast.so kabc_dir.so kabc_file.so kabc_ldapkio.so kabcformat_binary.so kaddprinterwizard.so kbuildsycoca.so kbzip2filter.so kcm_kresources.so kcmshell.so kconf_update.so kcookiejar.so kded.so kded_kcookiejar.so kded_kdeprintd.so kded_kdetrayproxy.so kded_kpasswdserver.so kded_kssld.so kded_kwalletd.so kded_networkstatus.so kded_proxyscout.so kdeprint_cups.so kdeprint_ext.so kdeprint_lpdunix.so kdeprint_lpr.so kdeprint_rlpr.so kdeprint_tool_escputil.so kdewidgets.so keramik.so kfileaudiopreview.so kgzipfilter.so khtmlimagepart.so kimg_dds.so kimg_eps.so kimg_exr.so kimg_hdr.so kimg_ico.so kimg_jp2.so kimg_pcx.so kimg_psd.so kimg_rgb.so kimg_tga.so kimg_tiff.so kimg_xcf.so kimg_xview.so kio_file.so kio_ftp.so kio_ghelp.so kio_help.so kio_http.so kio_http_cache_cleaner.so kio_metainfo.so kio_uiserver.so kjavaappletviewer.so klauncher.so knotify.so kspell_aspell.so kspell_ispell.so kstyle_highcontrast_config.so kstyle_plastik_config.so ktexteditor_docwordcompletion.so ktexteditor_insertfile.so ktexteditor_isearch.so ktexteditor_kdatatool.so kthemestyle.so libDCOP.so.4 libconnectionmanager.so.0 libkabc.so.1 libkabc_dir.so.1 libkabc_file.so.1 libkabc_ldapkio.so.1 libkatepart.so libkatepartinterfaces.so.0 libkcertpart.so libkdecore.so.4 libkdefakes.so.4 libkdefx.so.4 libkdeinit_cupsdconf.so libkdeinit_dcopserver.so libkdeinit_kaddprinterwizard.so libkdeinit_kbuildsycoca.so libkdeinit_kcmshell.so libkdeinit_kconf_update.so libkdeinit_kcookiejar.so libkdeinit_kded.so libkdeinit_kio_http_cache_cleaner.so libkdeinit_kio_uiserver.so libkdeinit_klauncher.so libkdeinit_knotify.so libkdemm.so.0 libkdeprint.so.4 libkdeprint_management.so.4 libkdeprint_management_module.so libkdesasl.so.1 libkdesu.so.4 libkdeui.so.4 libkdnssd.so.1 libkhtml.so.4 libkhtmlpart.so libkimproxy.so.0 libkio.so.4 libkjava.so.1 libkjs.so.1 libkmdi.so.1 libkmdi2.so.1 libkmediaplayer.so.0 libkmid.so.0 libkmultipart.so libknewstuff.so.1 libkntlm.so.0 libkparts.so.2 libkresources.so.1 libkscreensaver.so.4 libkscript.so.0 libkspell.so.4 libkspell2.so.1 libktexteditor.so.0 libkunittest.so.1 libkutils.so.1 libkwalletbackend.so.1 libkwalletclient.so.1 libnetworkstatus.so.0 libshellscript.so libvcard.so.0 light.so plastik.so kdelibs3 = 3.5.7-24 -Prv: +Obs: kde3-i18n kups keramik kdelibs3-cups kdelibs3-33addons kdepim3-networkstatus -Obs: +Rec: ispell ispell_dictionary enscript -Rec: =Grp: System/GUI/KDE =Lic: BSD License and BSD-like, GNU General Public License (GPL) =Src: kdelibs3 3.5.7 24 src =Tim: 1183399094 =Loc: 1 kdelibs3-3.5.7-24.i586.rpm =Siz: 16356019 38850584 +Aut: The KDE Team -Aut: ##---------------------------------------- =Pkg: kdelibs3-arts 3.5.7 24 i586 =Cks: SHA1 84d8c8e875395b8caaed90ae40bdfad3fe903eb7 +Req: arts >= 1.5.7 /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 libX11.so.6 libartsflow.so.1 libartsflow_idl.so.1 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.4) libkdecore.so.4 libkdeui.so.4 libkio.so.4 libkmedia2_idl.so.1 libmcop.so.1 libpthread.so.0 libpthread.so.0(GLIBC_2.0) libqt-mt.so.3 libqtmcop.so.1 libsoundserver_idl.so.1 libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4) libstdc++.so.6(GLIBCXX_3.4.9) rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Req: +Prq: /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Prq: +Prv: kdelibs3:/opt/kde3/bin/artsmessage libartskde.so.1 kdelibs3-arts = 3.5.7-24 -Prv: +Rec: kdemultimedia3-arts -Rec: =Grp: System/GUI/KDE =Lic: BSD License and BSD-like, GNU General Public License (GPL) =Src: kdelibs3 3.5.7 24 src =Tim: 1183399094 =Loc: 1 kdelibs3-arts-3.5.7-24.i586.rpm =Siz: 183999 393828 +Aut: The KDE Team -Aut: ##---------------------------------------- =Pkg: kdelibs3-debuginfo 3.5.7 24 i586 =Cks: SHA1 0f4c7798729fae70830fd03962dff8cdcadb7bdc +Req: kdelibs3 = 3.5.7-24 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Req: +Prq: rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Prq: +Prv: kdelibs3-debuginfo = 3.5.7-24 -Prv: =Grp: Development/Debug =Lic: BSD License and BSD-like, GNU General Public License (GPL) =Src: kdelibs3 3.5.7 24 src =Tim: 1183399094 =Loc: 1 kdelibs3-debuginfo-3.5.7-24.i586.rpm =Siz: 44452218 139124954 +Aut: The KDE Team -Aut: ##---------------------------------------- =Pkg: kdelibs3-devel 3.5.7 24 i586 =Cks: SHA1 46cfb73e29561af9e5445f6c525821856d067e61 +Req: qt3-devel libvorbis-devel kdelibs3 = 3.5.7 autoconf automake libxslt-devel libxml2-devel libart_lgpl-devel libjpeg-devel kdelibs3-doc libtiff-devel openssl-devel unsermake update-desktop-files libdrm-devel dbus-1-qt3-devel libattr-devel libacl-devel avahi-compat-mDNSResponder-devel libbz2-devel kdelibs3-arts fam-devel pcre-devel libidn-devel arts-devel rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 /bin/bash /bin/sh /usr/bin/env /usr/bin/perl libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.4) libkdecore.so.4 libkio.so.4 libkunittest.so.1 libqt-mt.so.3 libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4) libstdc++.so.6(GLIBCXX_3.4.9) rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Req: +Prq: rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Prq: +Prv: perl(Ast) perl(Iter) perl(kalyptusCxxToDcopIDL) perl(kdocAstUtil) perl(kdocParseDoc) perl(kdocUtil) kdelibs3-devel = 3.5.7-24 -Prv: =Grp: System/GUI/KDE =Lic: BSD License and BSD-like, GNU General Public License (GPL) =Src: kdelibs3 3.5.7 24 src =Tim: 1183399094 =Loc: 1 kdelibs3-devel-3.5.7-24.i586.rpm =Siz: 1403143 6898685 +Aut: The KDE Team -Aut: ##---------------------------------------- =Pkg: kdelibs3-doc 3.5.7 24 i586 =Cks: SHA1 28714c6b0ab4dbed12039d511995d3085721ed4e +Req: sgml-skel libxml2 /usr/bin/sgml-register-catalog /usr/bin/xmlcatalog /usr/bin/edit-xml-catalog sed grep awk /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 libbz2.so.1 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1) libc.so.6(GLIBC_2.4) libkdecore.so.4 libkio.so.4 libqt-mt.so.3 libstdc++.so.6 libstdc++.so.6(CXXABI_1.3) libstdc++.so.6(GLIBCXX_3.4) libxml2.so.2 libxslt.so.1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Req: +Prq: /usr/bin/sgml-register-catalog /usr/bin/xmlcatalog /usr/bin/edit-xml-catalog sed grep awk /bin/sh /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadIsBzip2) <= 3.0.5-1 -Prq: +Prv: kdelibs3:/opt/kde3/share/apps/ksgmltools2 kdelibs3_doc kdelibs3-doc = 3.5.7-24 -Prv: =Grp: System/GUI/KDE =Lic: BSD License and BSD-like, GNU General Public License (GPL) =Src: kdelibs3 3.5.7 24 src =Tim: 1183399094 =Loc: 1 kdelibs3-doc-3.5.7-24.i586.rpm =Siz: 918394 5908265 +Aut: The KDE Team -Aut: ##----------------------------------------libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/descr/packages.DU000066400000000000000000000576031476576476200307360ustar00rootroot00000000000000##---------------------------------------- =Pkg: kdelibs3 3.5.7 24 i586 +Dir: / 0 39444 0 3068 etc/ 1 12 1 1 etc/xdg/ 0 12 0 1 etc/xdg/menus/ 12 0 1 0 opt/ 0 39366 0 3054 opt/kde3/ 0 39366 0 3054 opt/kde3/bin/ 1104 0 51 0 opt/kde3/lib/ 19666 5798 53 152 opt/kde3/lib/kde3/ 4968 830 138 14 opt/kde3/lib/kde3/plugins/ 0 830 0 14 opt/kde3/lib/kde3/plugins/designer/ 108 0 2 0 opt/kde3/lib/kde3/plugins/styles/ 722 0 12 0 opt/kde3/share/ 0 12798 0 2798 opt/kde3/share/applications/ 0 13 0 1 opt/kde3/share/applications/kde/ 13 0 1 0 opt/kde3/share/apps/ 0 3902 0 410 opt/kde3/share/apps/LICENSES/ 57 0 5 0 opt/kde3/share/apps/kabc/ 229 4 1 1 opt/kde3/share/apps/kabc/formats/ 4 0 1 0 opt/kde3/share/apps/katepart/ 11 2194 2 134 opt/kde3/share/apps/katepart/scripts/ 16 10 5 2 opt/kde3/share/apps/katepart/scripts/indent/ 10 0 2 0 opt/kde3/share/apps/katepart/syntax/ 2168 0 127 0 opt/kde3/share/apps/kcertpart/ 1 0 1 0 opt/kde3/share/apps/kcm_componentchooser/ 38 0 2 0 opt/kde3/share/apps/kconf_update/ 8 0 8 0 opt/kde3/share/apps/kdeprint/ 194 299 13 99 opt/kde3/share/apps/kdeprint/filters/ 156 0 20 0 opt/kde3/share/apps/kdeprint/icons/ 0 91 0 55 opt/kde3/share/apps/kdeprint/icons/crystalsvg/ 0 91 0 55 opt/kde3/share/apps/kdeprint/icons/crystalsvg/16x16/ 0 20 0 20 opt/kde3/share/apps/kdeprint/icons/crystalsvg/16x16/actions/ 3 0 3 0 opt/kde3/share/apps/kdeprint/icons/crystalsvg/16x16/apps/ 17 0 17 0 opt/kde3/share/apps/kdeprint/icons/crystalsvg/22x22/ 0 32 0 19 opt/kde3/share/apps/kdeprint/icons/crystalsvg/22x22/actions/ 31 0 18 0 opt/kde3/share/apps/kdeprint/icons/crystalsvg/22x22/apps/ 1 0 1 0 opt/kde3/share/apps/kdeprint/icons/crystalsvg/32x32/ 0 26 0 12 opt/kde3/share/apps/kdeprint/icons/crystalsvg/32x32/actions/ 3 0 1 0 opt/kde3/share/apps/kdeprint/icons/crystalsvg/32x32/apps/ 23 0 11 0 opt/kde3/share/apps/kdeprint/icons/crystalsvg/48x48/ 0 6 0 2 opt/kde3/share/apps/kdeprint/icons/crystalsvg/48x48/apps/ 6 0 2 0 opt/kde3/share/apps/kdeprint/icons/crystalsvg/64x64/ 0 7 0 2 opt/kde3/share/apps/kdeprint/icons/crystalsvg/64x64/apps/ 7 0 2 0 opt/kde3/share/apps/kdeprint/pics/ 25 0 18 0 opt/kde3/share/apps/kdeprint/plugins/ 25 0 5 0 opt/kde3/share/apps/kdeprint/tools/ 2 0 1 0 opt/kde3/share/apps/kdeui/ 0 93 0 26 opt/kde3/share/apps/kdeui/about/ 45 0 23 0 opt/kde3/share/apps/kdeui/pics/ 48 0 3 0 opt/kde3/share/apps/kdewidgets/ 0 60 0 42 opt/kde3/share/apps/kdewidgets/pics/ 60 0 42 0 opt/kde3/share/apps/khtml/ 6 50 4 12 opt/kde3/share/apps/khtml/css/ 9 0 2 0 opt/kde3/share/apps/khtml/icons/ 0 41 0 10 opt/kde3/share/apps/khtml/icons/crystalsvg/ 0 41 0 10 opt/kde3/share/apps/khtml/icons/crystalsvg/128x128/ 0 14 0 1 opt/kde3/share/apps/khtml/icons/crystalsvg/128x128/actions/ 14 0 1 0 opt/kde3/share/apps/khtml/icons/crystalsvg/16x16/ 0 4 0 3 opt/kde3/share/apps/khtml/icons/crystalsvg/16x16/actions/ 4 0 3 0 opt/kde3/share/apps/khtml/icons/crystalsvg/22x22/ 0 4 0 2 opt/kde3/share/apps/khtml/icons/crystalsvg/22x22/actions/ 4 0 2 0 opt/kde3/share/apps/khtml/icons/crystalsvg/32x32/ 0 6 0 2 opt/kde3/share/apps/khtml/icons/crystalsvg/32x32/actions/ 6 0 2 0 opt/kde3/share/apps/khtml/icons/crystalsvg/48x48/ 0 5 0 1 opt/kde3/share/apps/khtml/icons/crystalsvg/48x48/actions/ 5 0 1 0 opt/kde3/share/apps/khtml/icons/crystalsvg/64x64/ 0 8 0 1 opt/kde3/share/apps/khtml/icons/crystalsvg/64x64/actions/ 8 0 1 0 opt/kde3/share/apps/kio_uiserver/ 0 1 0 1 opt/kde3/share/apps/kio_uiserver/icons/ 0 1 0 1 opt/kde3/share/apps/kio_uiserver/icons/crystalsvg/ 0 1 0 1 opt/kde3/share/apps/kio_uiserver/icons/crystalsvg/16x16/ 0 1 0 1 opt/kde3/share/apps/kio_uiserver/icons/crystalsvg/16x16/apps/ 1 0 1 0 opt/kde3/share/apps/kjava/ 156 2 3 1 opt/kde3/share/apps/kjava/icons/ 0 2 0 1 opt/kde3/share/apps/kjava/icons/crystalsvg/ 0 2 0 1 opt/kde3/share/apps/kjava/icons/crystalsvg/16x16/ 0 2 0 1 opt/kde3/share/apps/kjava/icons/crystalsvg/16x16/actions/ 2 0 1 0 opt/kde3/share/apps/knewstuff/ 1 0 1 0 opt/kde3/share/apps/knotify/ 119 0 1 0 opt/kde3/share/apps/kssl/ 159 0 1 0 opt/kde3/share/apps/kstyle/ 0 183 0 47 opt/kde3/share/apps/kstyle/pixmaps/ 0 90 0 32 opt/kde3/share/apps/kstyle/pixmaps/riscos/ 90 0 32 0 opt/kde3/share/apps/kstyle/themes/ 93 0 15 0 opt/kde3/share/apps/ktexteditor_docwordcompletion/ 1 0 1 0 opt/kde3/share/apps/ktexteditor_insertfile/ 1 0 1 0 opt/kde3/share/apps/ktexteditor_isearch/ 1 0 1 0 opt/kde3/share/apps/ktexteditor_kdatatool/ 1 0 1 0 opt/kde3/share/apps/proxyscout/ 33 0 1 0 opt/kde3/share/autostart/ 7 0 1 0 opt/kde3/share/config/ 202 18 10 6 opt/kde3/share/config/colors/ 10 0 4 0 opt/kde3/share/config/ui/ 8 0 2 0 opt/kde3/share/emoticons/ 0 79 0 42 opt/kde3/share/emoticons/Default/ 79 0 42 0 opt/kde3/share/icons/ 0 6549 0 1906 opt/kde3/share/icons/crystalsvg/ 8 6480 1 1898 opt/kde3/share/icons/crystalsvg/128x128/ 0 1622 0 151 opt/kde3/share/icons/crystalsvg/128x128/actions/ 27 0 3 0 opt/kde3/share/icons/crystalsvg/128x128/apps/ 33 0 2 0 opt/kde3/share/icons/crystalsvg/128x128/devices/ 269 0 22 0 opt/kde3/share/icons/crystalsvg/128x128/filesystems/ 529 0 40 0 opt/kde3/share/icons/crystalsvg/128x128/mimetypes/ 764 0 84 0 opt/kde3/share/icons/crystalsvg/16x16/ 0 429 0 408 opt/kde3/share/icons/crystalsvg/16x16/actions/ 248 0 228 0 opt/kde3/share/icons/crystalsvg/16x16/apps/ 3 0 2 0 opt/kde3/share/icons/crystalsvg/16x16/devices/ 47 0 47 0 opt/kde3/share/icons/crystalsvg/16x16/filesystems/ 45 0 45 0 opt/kde3/share/icons/crystalsvg/16x16/mimetypes/ 86 0 86 0 opt/kde3/share/icons/crystalsvg/22x22/ 0 552 0 346 opt/kde3/share/icons/crystalsvg/22x22/actions/ 316 0 211 0 opt/kde3/share/icons/crystalsvg/22x22/apps/ 4 0 2 0 opt/kde3/share/icons/crystalsvg/22x22/devices/ 41 0 23 0 opt/kde3/share/icons/crystalsvg/22x22/filesystems/ 43 0 23 0 opt/kde3/share/icons/crystalsvg/22x22/mimetypes/ 148 0 87 0 opt/kde3/share/icons/crystalsvg/32x32/ 0 782 0 359 opt/kde3/share/icons/crystalsvg/32x32/actions/ 347 0 181 0 opt/kde3/share/icons/crystalsvg/32x32/apps/ 5 0 2 0 opt/kde3/share/icons/crystalsvg/32x32/devices/ 119 0 47 0 opt/kde3/share/icons/crystalsvg/32x32/filesystems/ 107 0 41 0 opt/kde3/share/icons/crystalsvg/32x32/mimetypes/ 204 0 88 0 opt/kde3/share/icons/crystalsvg/48x48/ 0 842 0 223 opt/kde3/share/icons/crystalsvg/48x48/actions/ 148 0 39 0 opt/kde3/share/icons/crystalsvg/48x48/apps/ 10 0 2 0 opt/kde3/share/icons/crystalsvg/48x48/devices/ 185 0 47 0 opt/kde3/share/icons/crystalsvg/48x48/filesystems/ 188 0 44 0 opt/kde3/share/icons/crystalsvg/48x48/mimetypes/ 311 0 91 0 opt/kde3/share/icons/crystalsvg/64x64/ 0 917 0 184 opt/kde3/share/icons/crystalsvg/64x64/actions/ 21 0 5 0 opt/kde3/share/icons/crystalsvg/64x64/apps/ 13 0 2 0 opt/kde3/share/icons/crystalsvg/64x64/devices/ 258 0 47 0 opt/kde3/share/icons/crystalsvg/64x64/filesystems/ 240 0 40 0 opt/kde3/share/icons/crystalsvg/64x64/mimetypes/ 385 0 90 0 opt/kde3/share/icons/crystalsvg/scalable/ 0 1336 0 227 opt/kde3/share/icons/crystalsvg/scalable/actions/ 304 0 56 0 opt/kde3/share/icons/crystalsvg/scalable/apps/ 7 0 1 0 opt/kde3/share/icons/crystalsvg/scalable/devices/ 290 0 47 0 opt/kde3/share/icons/crystalsvg/scalable/filesystems/ 212 0 44 0 opt/kde3/share/icons/crystalsvg/scalable/mimetypes/ 523 0 79 0 opt/kde3/share/icons/hicolor/ 0 61 0 7 opt/kde3/share/icons/hicolor/128x128/ 0 24 0 1 opt/kde3/share/icons/hicolor/128x128/apps/ 24 0 1 0 opt/kde3/share/icons/hicolor/16x16/ 0 1 0 1 opt/kde3/share/icons/hicolor/16x16/apps/ 1 0 1 0 opt/kde3/share/icons/hicolor/22x22/ 0 2 0 1 opt/kde3/share/icons/hicolor/22x22/apps/ 2 0 1 0 opt/kde3/share/icons/hicolor/32x32/ 0 3 0 1 opt/kde3/share/icons/hicolor/32x32/apps/ 3 0 1 0 opt/kde3/share/icons/hicolor/48x48/ 0 5 0 1 opt/kde3/share/icons/hicolor/48x48/apps/ 5 0 1 0 opt/kde3/share/icons/hicolor/64x64/ 0 8 0 1 opt/kde3/share/icons/hicolor/64x64/apps/ 8 0 1 0 opt/kde3/share/icons/hicolor/scalable/ 0 18 0 1 opt/kde3/share/icons/hicolor/scalable/apps/ 18 0 1 0 opt/kde3/share/locale/ 259 0 1 0 opt/kde3/share/mimelnk/ 42 1290 1 317 opt/kde3/share/mimelnk/all/ 9 0 2 0 opt/kde3/share/mimelnk/application/ 761 0 179 0 opt/kde3/share/mimelnk/audio/ 101 0 27 0 opt/kde3/share/mimelnk/image/ 144 0 38 0 opt/kde3/share/mimelnk/inode/ 21 0 6 0 opt/kde3/share/mimelnk/message/ 9 0 2 0 opt/kde3/share/mimelnk/model/ 3 0 1 0 opt/kde3/share/mimelnk/multipart/ 9 0 2 0 opt/kde3/share/mimelnk/text/ 175 0 41 0 opt/kde3/share/mimelnk/uri/ 12 0 6 0 opt/kde3/share/mimelnk/video/ 46 0 13 0 opt/kde3/share/services/ 226 80 62 12 opt/kde3/share/services/kded/ 70 0 8 0 opt/kde3/share/services/kresources/ 3 7 1 3 opt/kde3/share/services/kresources/kabc/ 7 0 3 0 opt/kde3/share/servicetypes/ 131 0 29 0 usr/ 0 65 0 12 usr/share/ 0 65 0 12 usr/share/doc/ 0 57 0 6 usr/share/doc/packages/ 0 57 0 6 usr/share/doc/packages/kdelibs3/ 57 0 6 0 usr/share/man/ 0 8 0 6 usr/share/man/man1/ 4 0 3 0 usr/share/man/man7/ 3 0 2 0 usr/share/man/man8/ 1 0 1 0 -Dir: ##---------------------------------------- =Pkg: kdelibs3-arts 3.5.7 24 i586 +Dir: / 0 386 0 2 opt/ 0 386 0 2 opt/kde3/ 0 386 0 2 opt/kde3/bin/ 11 0 1 0 opt/kde3/lib/ 375 0 1 0 -Dir: ##---------------------------------------- =Pkg: kdelibs3-debuginfo 3.5.7 24 i586 +Dir: / 0 137630 0 3429 usr/ 0 137630 0 3429 usr/lib/ 0 106253 0 186 usr/lib/debug/ 0 106253 0 186 usr/lib/debug/opt/ 0 106253 0 186 usr/lib/debug/opt/kde3/ 0 106253 0 186 usr/lib/debug/opt/kde3/bin/ 8618 0 56 0 usr/lib/debug/opt/kde3/lib/ 70633 27002 54 76 usr/lib/debug/opt/kde3/lib/kde3/ 23702 3300 69 7 usr/lib/debug/opt/kde3/lib/kde3/plugins/ 0 3300 0 7 usr/lib/debug/opt/kde3/lib/kde3/plugins/designer/ 317 0 1 0 usr/lib/debug/opt/kde3/lib/kde3/plugins/styles/ 2983 0 6 0 usr/src/ 0 31377 0 3243 usr/src/debug/ 0 31377 0 3243 usr/src/debug/kdelibs-3.5.7/ 0 31377 0 3243 usr/src/debug/kdelibs-3.5.7/arts/ 0 273 0 52 usr/src/debug/kdelibs-3.5.7/arts/kde/ 235 0 45 0 usr/src/debug/kdelibs-3.5.7/arts/knotify/ 35 0 6 0 usr/src/debug/kdelibs-3.5.7/arts/message/ 3 0 1 0 usr/src/debug/kdelibs-3.5.7/dcop/ 285 451 20 44 usr/src/debug/kdelibs-3.5.7/dcop/KDE-ICE/ 359 0 31 0 usr/src/debug/kdelibs-3.5.7/dcop/client/ 52 0 7 0 usr/src/debug/kdelibs-3.5.7/dcop/dcopidl/ 3 0 1 0 usr/src/debug/kdelibs-3.5.7/dcop/dcopidl2cpp/ 37 0 5 0 usr/src/debug/kdelibs-3.5.7/dnssd/ 101 0 23 0 usr/src/debug/kdelibs-3.5.7/interfaces/ 0 437 0 134 usr/src/debug/kdelibs-3.5.7/interfaces/kimproxy/ 0 63 0 7 usr/src/debug/kdelibs-3.5.7/interfaces/kimproxy/library/ 63 0 7 0 usr/src/debug/kdelibs-3.5.7/interfaces/kio/ 2 0 1 0 usr/src/debug/kdelibs-3.5.7/interfaces/kmediaplayer/ 33 10 8 3 usr/src/debug/kdelibs-3.5.7/interfaces/kmediaplayer/kfileaudiopreview/ 10 0 3 0 usr/src/debug/kdelibs-3.5.7/interfaces/kregexpeditor/ 5 0 1 0 usr/src/debug/kdelibs-3.5.7/interfaces/kscript/ 28 9 6 3 usr/src/debug/kdelibs-3.5.7/interfaces/kscript/sample/ 9 0 3 0 usr/src/debug/kdelibs-3.5.7/interfaces/ktexteditor/ 287 0 105 0 usr/src/debug/kdelibs-3.5.7/kab/ 217 0 9 0 usr/src/debug/kdelibs-3.5.7/kabc/ 658 383 93 134 usr/src/debug/kdelibs-3.5.7/kabc/formats/ 8 0 2 0 usr/src/debug/kdelibs-3.5.7/kabc/plugins/ 0 124 0 21 usr/src/debug/kdelibs-3.5.7/kabc/plugins/dir/ 25 0 7 0 usr/src/debug/kdelibs-3.5.7/kabc/plugins/file/ 30 0 7 0 usr/src/debug/kdelibs-3.5.7/kabc/plugins/ldapkio/ 69 0 7 0 usr/src/debug/kdelibs-3.5.7/kabc/vcard/ 119 109 36 69 usr/src/debug/kdelibs-3.5.7/kabc/vcard/include/ 76 33 36 33 usr/src/debug/kdelibs-3.5.7/kabc/vcard/include/generated/ 33 0 33 0 usr/src/debug/kdelibs-3.5.7/kabc/vcardparser/ 23 0 6 0 usr/src/debug/kdelibs-3.5.7/kate/ 0 1740 0 108 usr/src/debug/kdelibs-3.5.7/kate/interfaces/ 59 0 7 0 usr/src/debug/kdelibs-3.5.7/kate/part/ 1592 0 89 0 usr/src/debug/kdelibs-3.5.7/kate/plugins/ 0 89 0 12 usr/src/debug/kdelibs-3.5.7/kate/plugins/insertfile/ 15 0 3 0 usr/src/debug/kdelibs-3.5.7/kate/plugins/isearch/ 26 0 3 0 usr/src/debug/kdelibs-3.5.7/kate/plugins/kdatatool/ 17 0 3 0 usr/src/debug/kdelibs-3.5.7/kate/plugins/wordcompletion/ 31 0 3 0 usr/src/debug/kdelibs-3.5.7/kcert/ 34 0 3 0 usr/src/debug/kdelibs-3.5.7/kcmshell/ 22 0 6 0 usr/src/debug/kdelibs-3.5.7/kconf_update/ 27 0 3 0 usr/src/debug/kdelibs-3.5.7/kdecore/ 3210 768 259 50 usr/src/debug/kdelibs-3.5.7/kdecore/kconfig_compiler/ 51 0 1 0 usr/src/debug/kdelibs-3.5.7/kdecore/malloc/ 181 0 1 0 usr/src/debug/kdelibs-3.5.7/kdecore/network/ 446 0 44 0 usr/src/debug/kdelibs-3.5.7/kdecore/svgicons/ 90 0 4 0 usr/src/debug/kdelibs-3.5.7/kded/ 218 0 32 0 usr/src/debug/kdelibs-3.5.7/kdefx/ 337 0 14 0 usr/src/debug/kdelibs-3.5.7/kdemm/ 78 0 21 0 usr/src/debug/kdelibs-3.5.7/kdeprint/ 729 1418 126 353 usr/src/debug/kdelibs-3.5.7/kdeprint/cups/ 337 224 73 58 usr/src/debug/kdelibs-3.5.7/kdeprint/cups/cupsdconf2/ 224 0 58 0 usr/src/debug/kdelibs-3.5.7/kdeprint/ext/ 14 0 7 0 usr/src/debug/kdelibs-3.5.7/kdeprint/lpdunix/ 24 0 7 0 usr/src/debug/kdelibs-3.5.7/kdeprint/lpr/ 141 0 35 0 usr/src/debug/kdelibs-3.5.7/kdeprint/management/ 621 0 154 0 usr/src/debug/kdelibs-3.5.7/kdeprint/rlpr/ 41 0 16 0 usr/src/debug/kdelibs-3.5.7/kdeprint/tools/ 0 16 0 3 usr/src/debug/kdelibs-3.5.7/kdeprint/tools/escputil/ 16 0 3 0 usr/src/debug/kdelibs-3.5.7/kdesu/ 90 0 15 0 usr/src/debug/kdelibs-3.5.7/kdeui/ 3964 22 362 7 usr/src/debug/kdelibs-3.5.7/kdeui/kdetrayproxy/ 22 0 7 0 usr/src/debug/kdelibs-3.5.7/kdewidgets/ 55 0 4 0 usr/src/debug/kdelibs-3.5.7/kdoctools/ 56 0 8 0 usr/src/debug/kdelibs-3.5.7/khtml/ 866 4750 44 283 usr/src/debug/kdelibs-3.5.7/khtml/css/ 530 0 18 0 usr/src/debug/kdelibs-3.5.7/khtml/dom/ 700 0 53 0 usr/src/debug/kdelibs-3.5.7/khtml/ecma/ 827 0 48 0 usr/src/debug/kdelibs-3.5.7/khtml/html/ 492 0 32 0 usr/src/debug/kdelibs-3.5.7/khtml/java/ 174 0 21 0 usr/src/debug/kdelibs-3.5.7/khtml/kmultipart/ 31 0 3 0 usr/src/debug/kdelibs-3.5.7/khtml/misc/ 211 0 23 0 usr/src/debug/kdelibs-3.5.7/khtml/rendering/ 1307 0 59 0 usr/src/debug/kdelibs-3.5.7/khtml/xml/ 478 0 26 0 usr/src/debug/kdelibs-3.5.7/kimgio/ 198 0 17 0 usr/src/debug/kdelibs-3.5.7/kinit/ 182 0 18 0 usr/src/debug/kdelibs-3.5.7/kio/ 0 4866 0 488 usr/src/debug/kdelibs-3.5.7/kio/bookmarks/ 300 0 40 0 usr/src/debug/kdelibs-3.5.7/kio/httpfilter/ 25 0 3 0 usr/src/debug/kdelibs-3.5.7/kio/kfile/ 1289 0 124 0 usr/src/debug/kdelibs-3.5.7/kio/kio/ 2424 0 201 0 usr/src/debug/kdelibs-3.5.7/kio/kioexec/ 14 0 3 0 usr/src/debug/kdelibs-3.5.7/kio/kpasswdserver/ 35 0 4 0 usr/src/debug/kdelibs-3.5.7/kio/kssl/ 354 0 54 0 usr/src/debug/kdelibs-3.5.7/kio/misc/ 95 326 10 48 usr/src/debug/kdelibs-3.5.7/kio/misc/kdesasl/ 14 0 2 0 usr/src/debug/kdelibs-3.5.7/kio/misc/kfile/ 18 0 2 0 usr/src/debug/kdelibs-3.5.7/kio/misc/kntlm/ 46 0 5 0 usr/src/debug/kdelibs-3.5.7/kio/misc/kpac/ 63 0 14 0 usr/src/debug/kdelibs-3.5.7/kio/misc/ksendbugmail/ 27 0 6 0 usr/src/debug/kdelibs-3.5.7/kio/misc/kssld/ 50 0 4 0 usr/src/debug/kdelibs-3.5.7/kio/misc/kwalletd/ 108 0 15 0 usr/src/debug/kdelibs-3.5.7/kio/tests/ 4 0 1 0 usr/src/debug/kdelibs-3.5.7/kioslave/ 0 500 0 29 usr/src/debug/kdelibs-3.5.7/kioslave/bzip2/ 8 0 2 0 usr/src/debug/kdelibs-3.5.7/kioslave/file/ 61 0 3 0 usr/src/debug/kdelibs-3.5.7/kioslave/ftp/ 94 0 2 0 usr/src/debug/kdelibs-3.5.7/kioslave/gzip/ 13 0 2 0 usr/src/debug/kdelibs-3.5.7/kioslave/http/ 204 115 6 12 usr/src/debug/kdelibs-3.5.7/kioslave/http/kcookiejar/ 115 0 12 0 usr/src/debug/kdelibs-3.5.7/kioslave/metainfo/ 5 0 2 0 usr/src/debug/kdelibs-3.5.7/kjs/ 748 0 69 0 usr/src/debug/kdelibs-3.5.7/kmdi/ 460 138 38 39 usr/src/debug/kdelibs-3.5.7/kmdi/kmdi/ 116 0 17 0 usr/src/debug/kdelibs-3.5.7/kmdi/res/ 22 0 22 0 usr/src/debug/kdelibs-3.5.7/knewstuff/ 182 0 31 0 usr/src/debug/kdelibs-3.5.7/kparts/ 317 0 37 0 usr/src/debug/kdelibs-3.5.7/kresources/ 123 0 26 0 usr/src/debug/kdelibs-3.5.7/kspell2/ 92 275 23 36 usr/src/debug/kdelibs-3.5.7/kspell2/plugins/ 0 204 0 19 usr/src/debug/kdelibs-3.5.7/kspell2/plugins/aspell/ 14 0 5 0 usr/src/debug/kdelibs-3.5.7/kspell2/plugins/ispell/ 190 0 14 0 usr/src/debug/kdelibs-3.5.7/kspell2/ui/ 71 0 17 0 usr/src/debug/kdelibs-3.5.7/kstyles/ 0 1078 0 46 usr/src/debug/kdelibs-3.5.7/kstyles/highcolor/ 69 0 4 0 usr/src/debug/kdelibs-3.5.7/kstyles/highcontrast/ 60 9 3 3 usr/src/debug/kdelibs-3.5.7/kstyles/highcontrast/config/ 9 0 3 0 usr/src/debug/kdelibs-3.5.7/kstyles/keramik/ 436 0 13 0 usr/src/debug/kdelibs-3.5.7/kstyles/kthemestyle/ 203 0 8 0 usr/src/debug/kdelibs-3.5.7/kstyles/light/ 112 0 7 0 usr/src/debug/kdelibs-3.5.7/kstyles/plastik/ 167 18 4 3 usr/src/debug/kdelibs-3.5.7/kstyles/plastik/config/ 18 0 3 0 usr/src/debug/kdelibs-3.5.7/kstyles/utils/ 0 4 0 1 usr/src/debug/kdelibs-3.5.7/kstyles/utils/installtheme/ 4 0 1 0 usr/src/debug/kdelibs-3.5.7/kunittest/ 61 0 7 0 usr/src/debug/kdelibs-3.5.7/kutils/ 374 66 42 12 usr/src/debug/kdelibs-3.5.7/kutils/ksettings/ 66 0 12 0 usr/src/debug/kdelibs-3.5.7/kwallet/ 0 110 0 18 usr/src/debug/kdelibs-3.5.7/kwallet/backend/ 68 0 13 0 usr/src/debug/kdelibs-3.5.7/kwallet/client/ 42 0 5 0 usr/src/debug/kdelibs-3.5.7/libkmid/ 250 0 32 0 usr/src/debug/kdelibs-3.5.7/libkscreensaver/ 25 0 5 0 usr/src/debug/kdelibs-3.5.7/libltdl/ 79 0 2 0 usr/src/debug/kdelibs-3.5.7/networkstatus/ 63 0 20 0 usr/src/debug/kdelibs-3.5.7/pics/ 1 0 1 0 -Dir: ##---------------------------------------- =Pkg: kdelibs3-devel 3.5.7 24 i586 +Dir: / 0 7141 0 791 etc/ 0 5 0 1 etc/opt/ 0 5 0 1 etc/opt/kde3/ 5 0 1 0 opt/ 0 7136 0 790 opt/kde3/ 0 7136 0 790 opt/kde3/bin/ 130 0 7 0 opt/kde3/include/ 4111 1867 415 289 opt/kde3/include/arts/ 59 0 10 0 opt/kde3/include/dnssd/ 30 0 7 0 opt/kde3/include/dom/ 420 0 29 0 opt/kde3/include/kabc/ 202 0 43 0 opt/kde3/include/kate/ 22 0 2 0 opt/kde3/include/kdemm/ 26 0 7 0 opt/kde3/include/kdeprint/ 63 8 14 3 opt/kde3/include/kdeprint/lpr/ 8 0 3 0 opt/kde3/include/kdesu/ 25 0 8 0 opt/kde3/include/khexedit/ 26 0 5 0 opt/kde3/include/kio/ 332 0 37 0 opt/kde3/include/kjs/ 120 0 17 0 opt/kde3/include/kmdi/ 16 0 4 0 opt/kde3/include/kmediaplayer/ 11 0 3 0 opt/kde3/include/knewstuff/ 47 0 10 0 opt/kde3/include/kparts/ 125 0 14 0 opt/kde3/include/kresources/ 43 0 9 0 opt/kde3/include/ksettings/ 20 0 4 0 opt/kde3/include/kspell2/ 32 0 10 0 opt/kde3/include/ktexteditor/ 97 0 33 0 opt/kde3/include/kunittest/ 43 0 3 0 opt/kde3/include/libkmid/ 100 0 17 0 opt/kde3/lib/ 84 0 43 0 opt/kde3/share/ 0 944 0 36 opt/kde3/share/apps/ 0 944 0 36 opt/kde3/share/apps/dcopidlng/ 82 0 7 0 opt/kde3/share/apps/kdelibs/ 0 862 0 29 opt/kde3/share/apps/kdelibs/admin/ 862 0 29 0 -Dir: ##---------------------------------------- =Pkg: kdelibs3-doc 3.5.7 24 i586 +Dir: / 0 6378 0 1199 etc/ 0 1 0 1 etc/xml/ 1 0 1 0 opt/ 0 6377 0 1198 opt/kde3/ 0 6377 0 1198 opt/kde3/bin/ 43 0 1 0 opt/kde3/share/ 0 6334 0 1197 opt/kde3/share/apps/ 0 6003 0 1145 opt/kde3/share/apps/ksgmltools2/ 0 6003 0 1145 opt/kde3/share/apps/ksgmltools2/customization/ 66 940 16 487 opt/kde3/share/apps/ksgmltools2/customization/af/ 7 9 4 9 opt/kde3/share/apps/ksgmltools2/customization/af/entities/ 9 0 9 0 opt/kde3/share/apps/ksgmltools2/customization/bg/ 5 0 2 0 opt/kde3/share/apps/ksgmltools2/customization/ca/ 11 14 4 13 opt/kde3/share/apps/ksgmltools2/customization/ca/entities/ 14 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/cs/ 7 1 3 1 opt/kde3/share/apps/ksgmltools2/customization/cs/entities/ 1 0 1 0 opt/kde3/share/apps/ksgmltools2/customization/da/ 11 14 4 13 opt/kde3/share/apps/ksgmltools2/customization/da/entities/ 14 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/de/ 11 19 4 14 opt/kde3/share/apps/ksgmltools2/customization/de/entities/ 19 0 14 0 opt/kde3/share/apps/ksgmltools2/customization/dtd/ 19 0 4 0 opt/kde3/share/apps/ksgmltools2/customization/el/ 5 1 2 1 opt/kde3/share/apps/ksgmltools2/customization/el/entities/ 1 0 1 0 opt/kde3/share/apps/ksgmltools2/customization/en-GB/ 7 2 3 1 opt/kde3/share/apps/ksgmltools2/customization/en-GB/entities/ 2 0 1 0 opt/kde3/share/apps/ksgmltools2/customization/en/ 9 2 4 2 opt/kde3/share/apps/ksgmltools2/customization/en/entities/ 2 0 2 0 opt/kde3/share/apps/ksgmltools2/customization/entities/ 76 0 3 0 opt/kde3/share/apps/ksgmltools2/customization/es/ 10 14 4 13 opt/kde3/share/apps/ksgmltools2/customization/es/entities/ 14 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/et/ 9 14 4 13 opt/kde3/share/apps/ksgmltools2/customization/et/entities/ 14 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/fi/ 7 4 4 4 opt/kde3/share/apps/ksgmltools2/customization/fi/entities/ 4 0 4 0 opt/kde3/share/apps/ksgmltools2/customization/fo/ 7 14 4 9 opt/kde3/share/apps/ksgmltools2/customization/fo/entities/ 14 0 9 0 opt/kde3/share/apps/ksgmltools2/customization/fr/ 51 15 4 13 opt/kde3/share/apps/ksgmltools2/customization/fr/entities/ 15 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/he/ 8 17 4 12 opt/kde3/share/apps/ksgmltools2/customization/he/entities/ 17 0 12 0 opt/kde3/share/apps/ksgmltools2/customization/hu/ 7 6 3 5 opt/kde3/share/apps/ksgmltools2/customization/hu/entities/ 6 0 5 0 opt/kde3/share/apps/ksgmltools2/customization/id/ 6 4 3 3 opt/kde3/share/apps/ksgmltools2/customization/id/entities/ 4 0 3 0 opt/kde3/share/apps/ksgmltools2/customization/it/ 10 18 4 13 opt/kde3/share/apps/ksgmltools2/customization/it/entities/ 18 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/ja/ 6 0 3 0 opt/kde3/share/apps/ksgmltools2/customization/ko/ 6 7 3 7 opt/kde3/share/apps/ksgmltools2/customization/ko/entities/ 7 0 7 0 opt/kde3/share/apps/ksgmltools2/customization/lt/ 5 0 2 0 opt/kde3/share/apps/ksgmltools2/customization/nl/ 23 16 4 13 opt/kde3/share/apps/ksgmltools2/customization/nl/entities/ 16 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/nn/ 11 14 4 11 opt/kde3/share/apps/ksgmltools2/customization/nn/entities/ 14 0 11 0 opt/kde3/share/apps/ksgmltools2/customization/no/ 7 14 4 13 opt/kde3/share/apps/ksgmltools2/customization/no/entities/ 14 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/obsolete/ 36 0 5 0 opt/kde3/share/apps/ksgmltools2/customization/pl/ 20 13 4 12 opt/kde3/share/apps/ksgmltools2/customization/pl/entities/ 13 0 12 0 opt/kde3/share/apps/ksgmltools2/customization/pt-BR/ 9 14 4 13 opt/kde3/share/apps/ksgmltools2/customization/pt-BR/entities/ 14 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/pt/ 12 13 5 12 opt/kde3/share/apps/ksgmltools2/customization/pt/entities/ 13 0 12 0 opt/kde3/share/apps/ksgmltools2/customization/ro/ 11 14 4 13 opt/kde3/share/apps/ksgmltools2/customization/ro/entities/ 14 0 13 0 opt/kde3/share/apps/ksgmltools2/customization/ru/ 9 15 4 11 opt/kde3/share/apps/ksgmltools2/customization/ru/entities/ 15 0 11 0 opt/kde3/share/apps/ksgmltools2/customization/sk/ 7 12 3 11 opt/kde3/share/apps/ksgmltools2/customization/sk/entities/ 12 0 11 0 opt/kde3/share/apps/ksgmltools2/customization/sl/ 8 12 4 11 opt/kde3/share/apps/ksgmltools2/customization/sl/entities/ 12 0 11 0 opt/kde3/share/apps/ksgmltools2/customization/sr/ 40 18 4 12 opt/kde3/share/apps/ksgmltools2/customization/sr/entities/ 18 0 12 0 opt/kde3/share/apps/ksgmltools2/customization/sv/ 7 13 4 12 opt/kde3/share/apps/ksgmltools2/customization/sv/entities/ 13 0 12 0 opt/kde3/share/apps/ksgmltools2/customization/tr/ 5 13 2 9 opt/kde3/share/apps/ksgmltools2/customization/tr/entities/ 13 0 9 0 opt/kde3/share/apps/ksgmltools2/customization/uk/ 9 0 4 0 opt/kde3/share/apps/ksgmltools2/customization/wa/ 5 0 2 0 opt/kde3/share/apps/ksgmltools2/customization/xh/ 5 0 2 0 opt/kde3/share/apps/ksgmltools2/customization/xsl/ 28 0 28 0 opt/kde3/share/apps/ksgmltools2/customization/xx/ 5 0 2 0 opt/kde3/share/apps/ksgmltools2/customization/zh-CN/ 7 8 3 5 opt/kde3/share/apps/ksgmltools2/customization/zh-CN/entities/ 8 0 5 0 opt/kde3/share/apps/ksgmltools2/customization/zh-TW/ 7 5 3 5 opt/kde3/share/apps/ksgmltools2/customization/zh-TW/entities/ 5 0 5 0 opt/kde3/share/apps/ksgmltools2/docbook/ 1 4996 1 641 opt/kde3/share/apps/ksgmltools2/docbook/xml-dtd-4.1.2/ 311 67 13 19 opt/kde3/share/apps/ksgmltools2/docbook/xml-dtd-4.1.2/ent/ 67 0 19 0 opt/kde3/share/apps/ksgmltools2/docbook/xml-dtd-4.2/ 321 0 11 0 opt/kde3/share/apps/ksgmltools2/docbook/xsl/ 31 4266 6 592 opt/kde3/share/apps/ksgmltools2/docbook/xsl/common/ 2232 0 60 0 opt/kde3/share/apps/ksgmltools2/docbook/xsl/html/ 1291 0 58 0 opt/kde3/share/apps/ksgmltools2/docbook/xsl/images/ 58 31 29 31 opt/kde3/share/apps/ksgmltools2/docbook/xsl/images/callouts/ 31 0 31 0 opt/kde3/share/apps/ksgmltools2/docbook/xsl/lib/ 70 0 4 0 opt/kde3/share/apps/ksgmltools2/docbook/xsl/manpages/ 43 0 7 0 opt/kde3/share/apps/ksgmltools2/docbook/xsl/params/ 541 0 403 0 opt/kde3/share/doc/ 0 331 0 52 opt/kde3/share/doc/HTML/ 0 331 0 52 opt/kde3/share/doc/HTML/en/ 0 331 0 52 opt/kde3/share/doc/HTML/en/common/ 320 0 50 0 opt/kde3/share/doc/HTML/en/kspell/ 11 0 2 0 -Dir: ##----------------------------------------libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/descr/packages.en000066400000000000000000000026551476576476200310250ustar00rootroot00000000000000##---------------------------------------- =Pkg: kdelibs3 3.5.7 24 i586 =Sum: KDE Base Libraries +Des:

This package contains kdelibs, one of the basic packages of the K Desktop Environment. It contains the necessary libraries for the KDE desktop.

This package is absolutely necessary for using KDE.

-Des: ##---------------------------------------- =Pkg: kdelibs3-arts 3.5.7 24 i586 =Sum: KDE aRts support +Des:

This package contains bindings and gui elements for using aRts sound daemon.

-Des: ##---------------------------------------- =Pkg: kdelibs3-debuginfo 3.5.7 24 i586 =Sum: KDE Base Libraries +Des:

This package contains kdelibs, one of the basic packages of the K Desktop Environment. It contains the necessary libraries for the KDE desktop.

This package is absolutely necessary for using KDE.

-Des: ##---------------------------------------- =Pkg: kdelibs3-devel 3.5.7 24 i586 =Sum: KDE Base Package: Build Environment +Des:

This package contains all necessary include files and libraries needed to develop applications that require these.

-Des: ##---------------------------------------- =Pkg: kdelibs3-doc 3.5.7 24 i586 =Sum: Documentation for KDE Base Libraries +Des:

This package contains the core environment and templates for the KDE help system.

-Des: ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/descr/packages.es000066400000000000000000000027261476576476200310310ustar00rootroot00000000000000##---------------------------------------- =Pkg: kdelibs3 3.5.7 24 i586 =Sum: KDE Base Libraries +Des:

This package contains kdelibs, one of the basic packages of the K Desktop Environment. It contains the necessary libraries for the KDE desktop.

This package is absolutely necessary for using KDE.

-Des: ##---------------------------------------- =Pkg: kdelibs3-arts 3.5.7 24 i586 =Sum: KDE aRts support +Des:

This package contains bindings and gui elements for using aRts sound daemon.

-Des: ##---------------------------------------- =Pkg: kdelibs3-debuginfo 3.5.7 24 i586 =Sum: KDE Base Libraries +Des:

This package contains kdelibs, one of the basic packages of the K Desktop Environment. It contains the necessary libraries for the KDE desktop.

This package is absolutely necessary for using KDE.

-Des: ##---------------------------------------- =Pkg: kdelibs3-devel 3.5.7 24 i586 =Sum: Paquete básico de KDE: entorno de desarrollo +Des:

Este paquete contiene todas las librerías y archivos include necesarios para desarrollar aplicaciones que los requieran.

-Des: ##---------------------------------------- =Pkg: kdelibs3-doc 3.5.7 24 i586 =Sum: Documentación para las bibliotecas básicas de KDE +Des:

Este paquete contiene el entorno central y las plantillas para el sistema de ayuda de KDE.

-Des: ##---------------------------------------- libzypp-17.36.5/tests/repo/susetags/data/stable-x86-subset/suse/setup/descr/patterns000066400000000000000000000000301476576476200304670ustar00rootroot00000000000000kde-10.3-71.noarch.pat libzypp-17.36.5/tests/repo/yum/000077500000000000000000000000001476576476200163375ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/CMakeLists.txt000066400000000000000000000000311476576476200210710ustar00rootroot00000000000000 ADD_TESTS(YUMDownloader)libzypp-17.36.5/tests/repo/yum/YUMDownloader_test.cc000066400000000000000000000043771476576476200224110ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include "tests/zypp/KeyRingTestReceiver.h" using std::cout; using std::endl; using namespace zypp; using namespace boost::unit_test; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/repo/yum/data") using namespace zyppng::operators; BOOST_AUTO_TEST_CASE(yum_download) { KeyRingTestReceiver keyring_callbacks; keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); Pathname p = DATADIR + "/ZCHUNK"; Url url(p.asDirUrl()); RepoInfo repoinfo; repoinfo.setAlias("testrepo"); repoinfo.setPath("/"); filesystem::TmpDir tmp; Pathname localdir(tmp.path()); auto ctx = zyppng::SyncContext::create (); auto res = ctx->provider()->attachMedia( p.asDirUrl() , zyppng::ProvideMediaSpec() ) | and_then( [&]( zyppng::SyncMediaHandle h ){ auto dlctx = std::make_shared( ctx, repoinfo, localdir ); return zyppng::RpmmdWorkflows::download(dlctx, h); }) | and_then( [&](zyppng::repo::SyncDownloadContextRef ctx ) { #if defined(LIBSOLVEXT_FEATURE_ZCHUNK_COMPRESSION) const bool zchunk = true; #else const bool zchunk = false; #endif std::map files { { "filelists.xml.gz", false&&!zchunk }, { "filelists.xml.zck", false&&zchunk }, { "other.xml.gz", false&&!zchunk }, { "other.xml.zck", false&&zchunk }, { "patterns.xml.gz", true }, { "primary.xml.gz", !zchunk }, { "primary.xml.zck", zchunk }, { "repomd.xml", true }, { "repomd.xml.asc", true }, { "repomd.xml.key", true }, }; for ( const auto & el : files ) { Pathname stem { "/repodata/"+el.first }; bool downloaded { PathInfo(localdir/stem).isExist() }; BOOST_CHECK_MESSAGE( downloaded == el.second, std::string(el.second?"missing ":"unexpected ")+stem ); } return zyppng::expected::success(); }); BOOST_REQUIRE ( res.is_valid () ); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/repo/yum/data/000077500000000000000000000000001476576476200172505ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/000077500000000000000000000000001476576476200225765ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/000077500000000000000000000000001476576476200243755ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/filelists.xml.gz000066400000000000000000000103701476576476200275350ustar00rootroot000000000000001]#Ffilelists.xml[s8҆W|Odx:v*v&W*hH)CP>li,[Tv0&`7?g-4*7ɛWPUGھTom[hTAG3h`-쏏jo4pkgO7\9&!2X$&Y*(ˆdI$ iG%I2(g&Q$Wc? }ǣ=8^EUu; Fyɋ}]Pp$Z?[ka@yvz@1:=d2oI5OgVyBEG)~,/zkt/zj=׬hz`jy3[&TeOx{ V'&|_%>|_Z{2yewPr/ \S IQqVUcf57:98Lkds7y{7Aaܴw_⩙͏.afS6Z7`W,W~**9-yjx-cĽןê N𣓁Mbst7.x;mugJGj _}?oח]._oo)8 )M$"Qas AQajwUt}rݰՁضutT708Hd#,`e,F$ I4~qqآGZW9::cVxɘ:^SaU;\U;\U;\U;\U;\U;\U;\Æ5v&(iLS!41 Ocj(* gO^?CG'5{]3a{uހӱح;04rݟ. ooQ2; A$~`dA8@9 bDqL ͣ 8MM%iblGeǦ,Mpy,A-Owa]xR}^n N Lu޶lW*~ctCtk|àoYQOutd\Vdfw弩J+Bӹ4DwCV`Xf`=qgK7N.ޟ s`||>9?a.>1~ٳ.. /IR i|#[- :8VZ:8qUO[ϞWsf*Q>P}sgb{TLTۃ.a'y8(=3^\Ӈ+iO-(kfJ݉`z K챆=έsz]l WMyCc2ouiOvX}zL;\>⺊=xOԖ"Гrݒb -F=P5BKxU|SCnYnu3;|'|eUխ앚CcCt]*#LqʔH%$ 0N_<*x,%S#6h4k`<˔-ZY^՝*Rx&b)YBʮx5-RZcVvoU!A~-O-qqMY5V Xv~MWGSۅXvPw~lĒ݀ҞZWẉnO?ЧvXVP 3[{k"縻1avK"Qݹ7n4"M\IZ QSˣXZ]v%,^jnTnڙȥݚ޷cY!sqklN+o۞7~miR昁G *:%~_xֆzTq#ƂXn&Ab2$8YHe11Nh NDL~ʶw}ωlvٚNd܉l։lt"['u"['u"['UNdDNdk:pNd s"['5։l7]D1DJIR1")JE/EQO)=^Q&3_LrYv/ }2 ,}11L񣶭rGdS@rDDPLRD,Abi"īῦ1?ws'1܆qsI;; $Nbn8@'J!HHȒD2Q,q~r&tc~ݪ͛{.Ë ӭ #wG',4hǘ,C2KPL lK' n:;͝X߉X߉A'wb!8QQ{'7I/$No9 6I߄s~'h7 h*!dYJP(Q(S@eU#YQеeHw֛c,.8&#"8”#T1ک# `p} M'oN6[ NoL89w*ZĔx3eE@L_)XS, $?NզM3v= $ DrA(eRw0F'֤DfPQaRHzO-4qz:kgkRȠ?:ਸ?Jzao&dܛLzioR?:M7կUoH"/Ra@>Fhd&,`1( %M2)iv?B;ڹnB;ڹ΅v.sC;.2Ģgbe$Pn\&(NN5CIͼ(f_o_f?Y 08<42T͎ M>"ʢe$֪-S͸m2q !$h 2"w2{7]BC\B%.!8xB'! D")X@J"h& ԰|D}݅<[ }-ݮkåg-t|xr>_~y?\/KuOu~a̡u[#&@QqV- l `(Ċx2RMtHp.C!}S gCv z*YX+@Ɣ0" aQ3D3SDP!ݭapQj]TcE.uQj]TFYaB!fqP! E8),Ѵ Qnuf^Y?aai#3AEA%>^p~.č*6˭(lm U$&/OxfLe%/˭YU_e´VJ\U\&r|w"Ste:ie+x:q*Ju{ø[z5d2%d^nްOz %pV;l-Q ;MfLcquڪ0cK@ E^Z[āҷf&89:9d,k{`'|_н'S*=MUt2s1љUV/\.jIdQCKy,6mj:WEj H[U) //D9L^ _qƹ/_{Du[XfRg]Sh6mnT=ht;_<:h꺽) `XDK\,%C?.H"e5{`?&n)>Em׫QS$Car!Bk](זTlGonϲnA6e,)apURVx |C4 p^LINk8\n+|VoZn{BWa2{>dԉ5hn7~_t iza#i 7p 7p 7p_7I&N $AvL|>*%ͻa5OOO)G8 z!KFޠBKڊN gpSO36uwdHU\`PGݖ Az}   s쁝èJW_xou5@?mdJV{) J.*d 6dSE BuW so[^9GNFϑT(|U2cC`Ɔ ^e{!Ҥu!!Y!ފW Q&Y )ERJ;sʪ;.Fk8Dā $B.( z:Q~qCwQӎ+ܼ:j%@kô2xtMbd)"F'*b{æ;n/jqF?r`"X5 vvVeTKYs_g_\O&0*zDb㫩,hJ=G1 Ag dĤHF(9; TA0Op+[b6 ɻnotGA+5ji(%#VWwTQ}מ)K&z+6 }[ܲLV\&A(gpxu/õE*cĶe VԐ)--顊)JHIkģvh[dV V_`mLPQd \J6LNڑI<99ShW-BKf@yFKm %Y)z>'FkZVІ_ g%egYX'[rT6hOA=&rrabL&;akBD@I\0l>}I=e6fS qIˀ^K)-m~sCB!1Ukz%\JzܦNMV5xf7ЕXM5caMV6')YҒe3`Q$}m*G2˨qXMwon&L\[dإzZ m.sXMˌԊAMUʻ_H(eI,g/Ə7/Z<{ M9:nePW>ewC*on; tJխR lą 2GUX -n'=0\3@)/ā,4WB*t| v{)e]joP]-ĥy#XaћC~48\_??^/L^>59*%/TRyN77YB ph*2+1eDALNQJ̺XYLǴ&e*Ս| {ex'Fe*:~RJx``nԫܑSz:URE]*Y)̑B+ᠧU2HDBH a쯂v ! +*LKM-seANKrܞ!HSl~ Ru󑒔P. yMރ{h'f X lPp MY5Utc+"ycnPtE|U3Bf,]3JO.U.#KAPbo"K!+e]rv ,$)Ež3]Gm5%lS۠b QH$e$9JF1a -[`5ʉB CP]e]سԉsEmb0ѮFmGFҰ\i )JY&Rt11U&&4KżC7͵gU4v)+%g>Ǣu̾FQ+<\5hHU5G.wtPK?uJLYPeS^^ޫe@P𩄣\#hd9FMZιTئ$ȸ4}J]^l#KMgۼiFS\5;o!}VsiHkD=K|H='(ٯ -}I-g֑l9O- M5'4"">ܓ̞/C6ͩuQfHšc\KVL\+NbkJ6uZeM%;bշlϛ;ꋘлD&?%َ@c]\37y?M7Wki*Wꇙ̌+j)%C~M,- 'y#/PJ-"ڕ(MBNԛ1IfQ-Rns4L`ġ:{wurqtx߷/ޏwxlBm;k8Pa=5@J򴑏|,ڇ Ggjyv)-M4unrܑom&!E,JTI>?it/hqȭYZhF&5 o}3>J=2їD4#\ٔ B1!EwMI΂Bk$6y鉛 as?gfq US+W=w~@@SU!`16'=4]89|{v~/+?A$`u#ugOhl@'+t,P޻Af=)Ȃ_@k{:qɚƚLb}\rW?GO)Dn(Rp,J Iٞq $,@%:7˷Xe55)u${n{4\ھ|BlVzN1ؤk.~ᜌ(zRKV@ LüjM]'Y}>+@>Zȼh;t2=dDzcko gUib8?l:FoɲW,&=mޕ 0@%S s<2]Vl& K^Q9+/ ٫kU{-szC V0ɍ( ƃg)˅\KE [p$N'y_"M de_eӷyYTq ]W'4Ϗq=TణUecf߶qM'N?--i>OԓE8 rI=l U%T@ժy t-$m3X? &IV"zhl!>8@,QƒqmbK%>4cjT&掯uP\K&O磺 }l,vg&UmhgcG(<4CsIJ:ϩ IMQ?rZ?B{#Zm 0J^G'2d>g=LMVOWa FG)uFI KǎxU/tn8kTĹ''ccL#>㚿o/WɜI̊Lg} MF/`aJu B-j˩ !ov5ձܬ3FʗsڡSNoէ^LLGxV7MXbkK]w[kK$+oOYt10t'־iLV=dWwd,e\zo%i~|yb}MqZ}cˌ"?8Ge=oޘ6vvDKt>Mg7i\6ltm"-fѹzs}|g[ Z?a($~]/$L=sM^[rւEP,l[yL-ab<q,hh4&Q@BÛw켡*ee38od-j rDnh,h=O^.HgÑG8 w h" ۜF$Y:r-?=[#/:l15QMdl1&QSj}c]4sm$ܦtgO1 -&Xa1P_\YrҦcjMۚNncr(s_>LӴ1-;+/0g89$bvwH@{5{+#G$D=}7NMr]Ӈ=7; Lg|-#ZqqFo[.& [#MhQQ6[ 6A6+ZH2dc6ދW<^"M:.fSKlE%I~/5*e߃ft߄FYYTef O?æ*[Pot/iۊ.8Lԃeo:LF"z{)q[yM>xL%q69:.\kko PӪG>/;յ}`톝7ƬoIj6/e=1͒n9,bhTvjP3i;WKn+"V2F6V#sd8<' 2nHh9B2+i feT$<ڨzgc%\tW8<'W|[gQc)mX3ۙoeݍA1զ>cp9%Vc/TäIhJtv4J* :}E *c٥/rs4F^6wz_߼woxh_پ;޵FrfOgĽH)>mīɱ"i˒u؟9@B=ͨӪq`e/i6P-K٫c+SgIïgd닒=WST:|v6∘TA>R Ewj>ugO2՜To&&o%Nm0oQi3ad>r .qd',;P6~"_z 7Btn=4[?~1ע_E:i0[tv׉~:-fΌs='MǩPK-"RЍzs{~eimvkM%#&wWWGϿw@уpxG ,u >mgl3AN~/4~ iu ɨ{;L_lǃB˦̖`a"MF?걐mJ`|Dtz1H~h\Mj搮'.]@%46VVoH5erݩ5VǥuD'gsC]܆{+J V#>q p`0besX]?ԗ0h\F"rQ덖"-x'~ޭQ_}s3S1Lظi黷_ȼzf5]3-sr|ηITp [!¦3ZXӛc-bT&DGj;B?xY"U2ռ퇋p&ye%Ǯr ;n /+q ;SOHp@G{{o̦KCGF._Ql|eKVg֬V1{$;_ǫLAqM!46~dΏևZΨT,u=fo볌CIn4EH!mD숕_nu;|}Ů' EL[j*z&#́߱\ZRKޥ_䆺6Zeٺ%>`o^ϰ{Q"Q2C7%Tydv>[_?YqUxJpǥYVDW0G*:ZR|cַzm`ih6CIg9XrbӃT_-m; L_NW$/nRT4 {*m_lj~H&RKݬhyV6m%~7g9I[9$hI4ߍo߱A8Óo=~6vݒ%l;FF[_Kgnko( Sc>anɗ)$r 7k]OdwMΤM'1_vDi嗳D)h͚jjӄOb@=ɦ}7X[MWJtL" i}% ܜ\ct#yAo7L$?VcCl:=rNCkRPgMfyK2qx(h"ʝ+='یDO9|gȚ|+7eq ų*u(-ar;g[bV'5&~㚧1N_Hjߊvj S,?Eä- _V2o]HGٗ0MߦU筡, 95OsM>s[<{YޗdyI`7f"=ŧ%AM4Б-aHv,f3vƷ{.Ej೧{CM䰩WӠcsM>eȀ# ߿ 7{]RY@$%] u7IZ`ۻhD*8:J?ܕnrO&sO_.{^\1XcM$_FTЯgr%łf^Ox^?5`7jD Fs/Q'on[BjPЦwa:e<]*7X_ oww6E9P]{9Hԙ5q&:dա's/oKv&\/<ŔaM*Mcc sgrx[G$n.}?O}J&#iIxbkT:3FN.^VW$3TT5ּ /dx ⰱ8.ͭv,ͥv)~~y z֢?)j+Rlp;_$j{6N(}( ,VGޤ^QNу؞Bw\:YdB><ђvΑ96BuL+Fvh4MIi+;+dH%VU ^-ޘuo־} ;uq:il|?&sh4B{;u۴[c|6_q0H/`Z9,5E%`pI`tn $:vܥ㎦9]c`qI&nnG'*[iER)45J ҧbE+7}[֏,8 !in3R,,4iԻa8$=/ւye;s *g\S#Ga¬ 8=e.(E(]4pno콨nV1VێsLIr*;<8'QDA^HHmɮ2ͽ,zag6QW4JV {Kؓ ~R\qe1_bF-I˞n]l߆OBpr'{r]a_qujg'čS'➝>*p^w)ka8bS sVf]sF T𝠖PֻnſyvRgBtnӬՙZA)+?la WyC7h-&B_t3IRR#qzg JG;L#)cgTtJnXKQUk j.|t_9Gnߜ`gzq 3}srz{{&!Z;hjʗDW>4uk ʍ6/PM<,6L;37~jx~nw`|W8m:20+YT(A M8@QkI@Q D-@Q D-@Q D-@Q D-@Q D-@Q D-@Q D-@Q D-@Z Z j]@Q D-@Q DZ jmZ jZ jZ jZ jYZ jݷe jZ1sZ jZ j}@Q D-@Q D-@ԶmQ D-@Q D-@Q D-OD-@Q D-@Q D-@Qk j8t(΂pYE0 p +ApZ2RlZilZilg`ӂM 6-ش`ӂM 6-ش`ӂM 6-ش`ӂM 6-ش`ӂM 6-ش`ӂM 6-ش`ӂM 6-شlZil)ش`ش`ӂM 6-ش`ӂM 6-ش`ӂM 6-ش`ӂM6-ش`ӂMo`ӂM 6-شbM 6-ش`ӂM 6-ش`ӂM 6-شn9ilZilZimlZilZilZihlZilZilZi>aӦQEA!B/FnT R7hMۋ|% ԂP B- ԂP B- ԂP B- ԂP B- ԂP BmB- ԂP B- ԂP B- ԂP B- ԂP B-{AZjA)  ԂP B- ԂP B- ԂP B- ԂPB- ԂPo ԂP B-bP B- ԂP B- ԂP B-n9jAZjAZjAmZjAZjAZjhZjAZjAZjA>!fըp=7B}OGIqEs*L|DuZj ԂP B- ԂP B- ԂP B- ԂP B- ԂP B- ԂP B- ԂP B- ԂP B- ԂP B- ZjAZj ԂPo ԂP B- ԂP B- ԂP B- ԂP BJ ԂP B-P B- ԊB- ԂP B- ԂP B- @ZjAZjAmZjAZjAZjA}EjAZjAZjAZ߆P[&*O2d,FޠJKo@l[ (Kpj]S N-8ԂS N-8ԂS N-8ԂS N-8ԂS N-8VԂS N-8ԂS N-8ԂS N-8ԂS N-8ԂSWZpjZpjS N-S N-8ԂS N-8ԂS N-8ԂS N-8;+ԂS N-8 N-8ԂS+f8ԂS N-8ԂS N-8ԂSZpjZpjڶMpjZpjZpjZpjZpjZpjSN *u0-sw'ny 68MdixZiuxZiO <-O <-O <-O <-O <-O <-O Z@jZ@jcR H- R H- R1ـR H- R H- R{^eR^뗉VynAnBjEZ@jZ@jZ@jZ@jZ@jZ@jZ@jZ@j% R H- R H- VR H- R Z@jZ@jZ@jZ@j R H- R H- R H- R H- R H- >Z@jZ@jcR H- R H- R1ـR H- R H- R{fEn\F_Y8HGnY^g ˠj+{x T-P@U T-P@U T-P@U T-P@U T-P@U T-P@U T-P@U T-P@U T-PKjZjZjZjP@U T-P@U T-P@U T-P@U T-PjZjZjZjZjZj}T-P@U T-P@UZjZjvcZjZjF~[LӢlFGwy(˷]ꤍ4UV^n~O&U“I"y4.J wfaIM\r9mU~ɤͻӓ7ZsBͳ)ol<}tZ(]sv6;Vg.0N_;{oW'_i6粹$0/n,8= F9CZM!^[/\/Wv8П;mw&z̾\DjI4\lwI칑,Lߏ:,rR&ǂj/R YI\¡j.-]ft1j*qr܈?վżvV&152{M`C飒ܼcu~ʆ}pwvyx&mۦJql.*7W3ܾ&qoЖuu8sލTv}gմ&"lYVjB)PVijvߛ`!AFYa?u= FֶvɝҧbUeR*8ك.ۃO`SFiz5':XM~QڔHH뎔 t9_.K}ċ-cd7d[v0/zɕt]֤/'j[kat3vo_]=P黷[MM]*g"5/H- Y$Y1w"1&]2J4}^SV(thBd6zyzԷc.n1cO_C Bvjݹ`:JFk"aS6Ҡ?瞞_Jp05\z-ĸ#l ~;|ꖑMT ⠘&ۊ) F: 1S^jc<OE;t5(lnν/Xm~+ߟ؀p)T]a%>5H_$E(KtBg7=LiC剤>VΔ mX d2ݵI{mMBzf~~ଔkvvMu|ŀE,%Ԭ &asİk†|ލYB+4Z؎5goEksw[-vk/rrk"0*slG^ IQ \ҍQaAEx]wEx]wEx]wEx]wEx]{2w(-"s*.jVdAďQIػX/]wEx]wEx]wEx]wEx]w߳wt*4U^I|YEˤ(|TZ^F8`F8`F8`F8`F8`;c2 /th^4.? QY2[X|썰c{㬚2(liEfu0ޑs+ Fh4bWߝ\wϜ^Ybr?糙y)hglQ/Mv6.ƳA tۊJxd^; 0 F̏ܐ"V*}=/:ʎvsS7~;IA ~A{60]|`Dݖ{aqʱK2b+I ]WF?%Chތu@ \~aYwgd@Vʎaj]sXm٭ZEg/,[״%j\Upʖ:)R7-nl(}#G0trZuS?dWhdӑ񽘕B 1!ׄDbG9gڷy-3FzƎݻN_Z \Lh:5fĘxo\m3&_-g̦cxHٔ}ӊi aC6&.!C'1Ud=9 oٮd&ڧs:'h/%,X6eMatFQd3\&E+09-20qa0nC\VWۏ ΍@j%{Ksh8ִ#ϐj Y2A&?GVW~v5u΍ mVO֩"3N1K2;fe¬~l/ܖ 3jY!gt2dq?-ضĤN>1ϤQDaڦ94Ytz{fFq OviC[36u}6Fi7h,6R\;n)*mM/'  ҀyߖݤYOd,(|@z2IU!R-FnCS}*.FIigwi֛f\+&`R>,%t7V5 NVa$fnVll~#;Vjtؑt5\f5x:bH qҲi$VSt1mA#\ڿˊlS59x=*0﯇߾:Vl=xApwWѓeZK䬥XD0:y6@==Xͅ Lk$z'QLo87Ğ4c+^ƤI$9KNC;' {7;Dzf- &#Zښ09؁jEbo#eKT.dŽӛݛw﯃~M\dKͪZԷj48CՔ=eMn!}N 1:AeME 9OAGxSZ.rUs!m[KA֞hF?|\-cX˚$O]VkWZ92xsZ [Kq*~a'zb$>a" n5 ٵQH"dyF6q$~ϕxK WK^\z R+i\Hv]9Ff':Q,Xe1?@>٧=8q W[G2Nl"וlJVVKqZvu=q5gH<libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/patch-fetchmsttfonts.sh-2333.xml000066400000000000000000000255231476576476200322770ustar00rootroot00000000000000 fetchmsttfonts.sh Download Microsoft(r) TrueType Core Fonts Download Microsoft(r) TrueType Core Fonts For legal reasons we can't include the Microsoft(r) TrueType Core Fonts in our product. This patch downloads these fonts and installs them on your system. Please note that about 4 MByte data are downloaded therefore. License for the fonts will be installed as /usr/share/doc/corefonts/EULA.html. Aus rechtlichen Gründen können wir leider die TrueType Core Fonts von Microsoft(r) auf unserem Produkt nicht mitliefern. Dieser Patch lädt diese Fonts herunter und installiert diese auf Ihrem System. Beachten Sie bitte, dass dazu in etwa 4 MByte an Daten heruntergeladen werden. Die Lizenz für die Fonts wird unter /usr/share/doc/corefonts/EULA.html abgelegt. optional END-USER LICENSE AGREEMENT FOR MICROSOFT SOFTWARE IMPORTANT-READ CAREFULLY: This Microsoft End-User License Agreement ("EULA") is a legal agreement between you (either an individual or a single entity) and Microsoft Corporation for the Microsoft software accompanying this EULA, which includes computer software and may include associated media, printed materials, and "on-line" or electronic documentation ("SOFTWARE PRODUCT" or "SOFTWARE"). By exercising your rights to make and use copies of the SOFTWARE PRODUCT, you agree to be bound by the terms of this EULA. If you do not agree to the terms of this EULA, you may not use the SOFTWARE PRODUCT. SOFTWARE PRODUCT LICENSE The SOFTWARE PRODUCT is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The SOFTWARE PRODUCT is licensed, not sold. 1. GRANT OF LICENSE. This EULA grants you the following rights: * Installation and Use. You may install and use an unlimited number of copies of the SOFTWARE PRODUCT. * Reproduction and Distribution. You may reproduce and distribute an unlimited number of copies of the SOFTWARE PRODUCT; provided that each copy shall be a true and complete copy, including all copyright and trademark notices, and shall be accompanied by a copy of this EULA. Copies of the SOFTWARE PRODUCT may not be distributed for profit either on a standalone basis or included as part of your own product. 2. DESCRIPTION OF OTHER RIGHTS AND LIMITATIONS. * Limitations on Reverse Engineering, Decompilation, and Disassembly. You may not reverse engineer, decompile, or disassemble the SOFTWARE PRODUCT, except and only to the extent that such activity is expressly permitted by applicable law notwithstanding this limitation. * Restrictions on Alteration. You may not rename, edit or create any derivative works from the SOFTWARE PRODUCT, other than subsetting when embedding them in documents. * Software Transfer. You may permanently transfer all of your rights under this EULA, provided the recipient agrees to the terms of this EULA. * Termination. Without prejudice to any other rights, Microsoft may terminate this EULA if you fail to comply with the terms and conditions of this EULA. In such event, you must destroy all copies of the SOFTWARE PRODUCT and all of its component parts. 3. COPYRIGHT. All title and copyrights in and to the SOFTWARE PRODUCT (including but not limited to any images, text, and "applets" incorporated into the SOFTWARE PRODUCT), the accompanying printed materials, and any copies of the SOFTWARE PRODUCT are owned by Microsoft or its suppliers. The SOFTWARE PRODUCT is protected by copyright laws and international treaty provisions. Therefore, you must treat the SOFTWARE PRODUCT like any other copyrighted material. 4. U.S. GOVERNMENT RESTRICTED RIGHTS. The SOFTWARE PRODUCT and documentation are provided with RESTRICTED RIGHTS. Use, duplication, or disclosure by the Government is subject to restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and Computer Software clause at DFARS 252.227-7013 or subparagraphs (c)(1) and (2) of the Commercial Computer Software - Restricted Rights at 48 CFR 52.227-19, as applicable. Manufacturer is Microsoft Corporation/One Microsoft Way/Redmond, WA 98052-6399. LIMITED WARRANTY NO WARRANTIES. Microsoft expressly disclaims any warranty for the SOFTWARE PRODUCT. The SOFTWARE PRODUCT and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the implied warranties or merchantability, fitness for a particular purpose, or noninfringement. The entire risk arising out of use or performance of the SOFTWARE PRODUCT remains with you. NO LIABILITY FOR CONSEQUENTIAL DAMAGES. In no event shall Microsoft or its suppliers be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use this Microsoft product, even if Microsoft has been advised of the possibility of such damages. Because some states/jurisdictions do not allow the exclusion or limitation of liability for consequential or incidental damages, the above limitation may not apply to you. MISCELLANEOUS If you acquired this product in the United States, this EULA is governed by the laws of the State of Washington. If this product was acquired outside the United States, then local laws may apply. Should you have any questions concerning this EULA, or if you desire to contact Microsoft for any reason, please contact the Microsoft subsidiary serving your country, or write: Microsoft Sales Information Center/One Microsoft Way/ Redmond, WA 98052-6399. libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/patch-flash-player-2359.xml000066400000000000000000000061461476576476200312120ustar00rootroot00000000000000 flash-player flash-player: Security upgrade to 7.0.69 flash-player: Security Upgrade auf Version 7.0.69 This security update brings the Adobe Flash Player to version 7.0.69. It fixes the following security problem: CVE-2006-5330: CRLF injection vulnerability in Adobe Flash Player allows remote attackers to modify HTTP headers of client requests and conduct HTTP Request Splitting attacks via CRLF sequences in arguments to the ActionScript functions (1) XML.addRequestHeader and (2) XML.contentType. NOTE: the flexibility of the attack varies depending on the type of web browser being used. Dieses Securityupgrade bringt den Adobe Flash Player auf Version 7.0.69. Dieses Update behebt damit folgendes Sicherheitsproblem: CVE-2006-5330: Ein CRLF Injectionsangriff in Adobe Flash Player erlaubt entfernten Angreifern die HTTP Header von Client Anfragen zu verändern und damit HTTP Request Splitting Angriffe auszuführen. Dies geschieht durch Einschleusen von CRLF Sequenzen in die ActionScript Funktionen (1) XML.addRequestHeader und (2) XML.contentType. Note: Die Flexibilität dieses Angriffs ist abhängig vom benutzten Webbrowser. security flash-player i586 e0add7ff093ece07c6967f658073bfd74607fb64 libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/patch-glabels-2348.xml000066400000000000000000000067151476576476200302340ustar00rootroot00000000000000 glabels If you installed glabels, you should update. If you installed glabels, you should update. If you cannot install glabels or experienced problem with file types (MIME) or you cannot find glabels in the menu, you should update. If you cannot install glabels or experienced problem with file types (MIME) or you cannot find glabels in the menu, you should update. recommended glabels i586 34adf06a0c4873b9d53b4634beb8bee458b45767 glabels x86_64 40f24dc53e8f800fc1383b0ac1b357a7134f8eea libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/patch-gv-2350.xml000066400000000000000000000115131476576476200272200ustar00rootroot00000000000000 gv gv: Additional fix for previous security update gv: Weiterer Fix für vorheriges Sicherheitsupdate The previous "gv" update to fix a stack overflow did not completely fix the problem spotted. An attacker could still cause the handling to use up all system memory, or open windows much wider than the X display and crash. Code execution however was not possible. Das vorherige "gv" Update hat zwar den berichteten Stacküberlauf behoben, es konnte aber immer noch eine fehlerhaftes PS den Viewer zum Absturz bringen und/oder den Systemspeicher aufbrauchen. Das Ausführen von Schadcode war allerdings nicht mehr möglich. security gv i586 ef3e9360d99cd36ba269af1abd2e8ac963c8c838 gv ppc 508bdeacfb23a0a210a27e3ed164f58b5c5c4590 gv x86_64 d1ceecc9b2442fe298040690bf91ae224cc2bfd4 libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/patch-openssl-2349.xml000066400000000000000000000332751476576476200303100ustar00rootroot00000000000000 openssl Security update for OpenSSL Sicherheitsupdate für OpenSSL A previous openssl update (CVE-2006-2940) introduced another bug that can lead to a crash by providing a large prime number. An uninitialized pointer is freed during error handling. This bug allows remote attackers to crash services that use openssl. Ein vorheriges Sicherheitsupdate von OpenSSL (CVE-2006-2940) hat einen weiteren Fehler verursacht, der von entfernten Angreifern ausgenutzt werden kann, um Applikationen, die OpenSSL benutzen, zum Absturz zu bringen. security openssl i586 a923a481bc975916121811645c9957303c90172c openssl ppc 3751ba88267a45f6bae72285bc3295f1550ad80e openssl x86_64 0a6e313ab112570584d82725dbb1fb81862bfdf0 openssl-32bit x86_64 485659fe4f32303bb951e557367564f920eb1740 openssl-64bit ppc 96d57cc3d4539e0355374526af16c0d4a4919ea6 openssl-devel i586 9f6a44015ad97680e9f93d0edefa1d533940479c openssl-devel ppc aefc1215e506133131739f86a77eaef17e598dd6 openssl-devel x86_64 72d8cd8e5273cc13d821e3179b49c1ca1225d471 openssl-devel-32bit x86_64 acbbb17d623d1a509f1811ab75297a6015d4ee8e openssl-devel-64bit ppc e9b398feb88d4fbe24a0a52f20e9d20feb5caf49 libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/patch-tar-2351.xml000066400000000000000000000115611476576476200273760ustar00rootroot00000000000000 tar tar: Securityupdate to fix symlink traversal tar: Sicherheitsupdate das behebt ein Symlinkproblem behebt This security update fixes a directory traversal in tar, where unpacked symlinks could be followed outside of the directory where the tar file is unpacked. (CVE-2006-6097) This feature was made optional and needs to be enabled with a commandline option. Dieses Sicherheitsupdate behebt ein Problem, wo beim Entpacken eines TAR Archives dieses durch Symlinks aus dem aktuellen Verzeichnis ausbrechen konnte. (CVE-2006-6097) Das alte obsolete Feature in GNU Tar wurde optional gemacht und kann für alte TAR Archive mit einer Kommandozeilenoption angeschaltet werden. security tar i586 7842746e863cbad136ce916a9720ff5913a5bf66 tar ppc def753a1b7fe65e49653e22ae6d42b329306be53 tar x86_64 8fe39477a30f01b18d6c1f2b76a61b96f07a8969 libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/patches.xml000066400000000000000000000022021476576476200265420ustar00rootroot00000000000000 6b72b4f3617d0d51af28399c0f5e0af401440245 b02ba598d8ed5f8a31859d3b34e72e1ddecbe894 321ee41de68be4e83dfb74559c14300a59b85ccf ec9e8a3f3ce2588cecd84ab95ec910d41db5d74b d803372cd5d844ee01ab6fb3d1b4332391fa1206 c2de5dd35ec2dcccc118d9d7f539e768dfd5ec50 libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/primary.xml.gz000066400000000000000000000270031476576476200272230ustar00rootroot00000000000000LFprimary.xml][w6~ׯC㬉$u-IrgZُq&ȯx.5fi@j,ި2JEUVx qF1sM!Vre׷ڻjʳ !ߦИO"׿hΦX{r~gg)܁;/wH;ZΣ;DBM9;.@1;Zv< ;~sO Euf86\$aqnge)-gZDESdgg@F{%F_;ä)MqHì:ONBZ<" 5I>'OH;@k*u4x_jNr iEi)<"ZZ(! %*i^8uv"QS퇨鯓+V!Mh&O{Nm;Ov4~4"s*moi3u1ᣄ㽱+a̵ LXB;WґknRq0t0ʉ"Z61MpasH2Z74AǢs=PtБ?\JrnA?koysi摶޸+ƌ'~}>z ԯXYhoc c25ɵ˩MYXxrFZVO#>ejM9Uؤp.”S]=/aIZby:YB<)aNzqnEw 5Ʃ RMzSL0Sr16dRM~Cҳ(o0܊wt%=xӖ.'R{4K>IhMS/߿~#,ǟ%?%_dfgi$d%e9 }a5d׺ė.$V~ )I-؊S19@zU("&Rۃן+-TFD] l22dhgYY #wlVH Oѐȏ &B͢4I$' 9KHQCpO1\YAkzU$i+=EI&@_>gLTtMfP{O8 JbVSSkYPRQJO:0x݂,KXݐ%E$ٷ3pRQFBU)(J2A]!KRV[H+?4IZ\jMJ۪ e;iT9sEz_-%yx]=cz=EH~(%; ͦXen; ^Kuq6l$ ]"tʐGLڈ9mS:&%&2q"7xnX)g`]`!vZ<՞lCtj|~K)h<SQYpz*JrOAmSOEK)u9@2PMuT\ ;^(P*.QYK**/4VQU@hP*+TPU'Rɤ L-3˔vT]*JsSEKdnU;vPK*-8RYf/zT2z[6Q}ƟW.&p\t0r i0WG6fR#ΪkG);eQW?4)4/zs 30)J:::6a.K#h4l5eՔEDt/_ D4NrZ/ai _ 5Q:J|{,1Ã2RD"k3u6> eP޾ѯ Dn=c:5M1[<|Q;Q>cf3B-QeRU5P)[R)xΰM1*LNNtZ$/Gr+YqTړX\Iב^X8#tmlEB x-X!Pu7BYblG RUגbl$^9bwe%)B[yZ@AVudZDmn'm1;(7Z=".&FM"xٖMuvfZ5SZL/F;@4K.5 wmѹ׹| ەCOXT_\ek%y8‘ɇ$7t^%y D$J,÷g; h}G!x{;D7gu$.K:# "شnu{Sp ;x1Y_Y~=8uqHlr`sp;JQH{šd䦳+6G[65(1vL2MazҤ'MzҤ'Mj_l8Il`o!{ nu&C`;r&p"LPHL939IϙIϙ'Τ^ {gQM1&qN<ۆ- A Z}BQ> QQ(Z]i |kZ^i:CN0Du}C0Atlۅ" *눃&6A~ETBib%7SPՆ0dU[h<85p['zq+nBܫ=jMޭ adrS! cQ tߗ/%yS`&]O``{ \\8}kXw\! o'dV䵳Ź 8xT&]d40iɼ 8:Jl/8-pu6B[JDѡĺrG)9u =8=`E'P!lںmlAIIZ{h ;J`;A+[ lcn:f:0ъyŧQ=P=Ͽ YϮ Yxx+*v^-ͯ`VSHtnxk"n6l2CG*HE#}{O.TXl{ז%B~ڲ,*j+Ӈ+Dǘ\Þp`:ܠpWx'ܖOjcaMl8A.C"M߰Qԯ_4ODח9&]Xil8;mŏKױ^pݻoTSz;GQ΃ylG@|~z]Z:¹#wp`z̺@s) #wy&žLp C.F1w8 WGE'2}9""PW.Ql4cPZ9!VYLYƂ"gOC$jY\ZĮyD+iD;:ko?A &j"C5ĮȚ<\Niâ`^btL,Ni2:hQ4fY\,FGGUcZ`NI3 ([\' ֘\]] 64G6&aݻMVNۏV&03\{ m1RE FƯ^FԹH` X(U#nn_ +dzP|k7"ů&IoS0x0OGU,ڞӨsS!{VM'\]Hwz)T+\vvx@<<6ׯS~we͉#[]"'ƌ+cLK 1D}.4g+G19sAFKhx+埿@Q-I-S X܊s0윶ۧ4O{VVyU Xc2,S8{͇Q"ԮuQ$}U'q0  9.3,=F=BX*_WqO_ɰJ.zu巄T =k{Yww^ZYfV{HR=zjyin i[vR{ͳZCy7:?1Oux=z㩯^-j]iy-t0{g=zmOS=z?7z1';v9ȡ}~>8k <PߵmZxAoAG|{ݮn,Y|љ7Yu^gzNzwĻ#;B?#Nbj6zuΚh 3`n e3/,|y:O/; \l(YQ}.PbUͰ]݆XtFFwuy۞-Nu^:-&'F=q۾_߉E(TxQo6ԖO;5q |Ƭk/d鱄tdk#\γ^^PuX>;m;^P8=X9uϪ_< *,Jͽ˃Zq2='}Zѓo8|?*'*TsL ztF>^>_}9Gx` .[|3*} ٍe^ם*~X!&VF8 1Myc"qސ~=ݚ8tÎXa55iR:B}N'tvlp{ۆ0&C?#00&p 0+F-k]aMƷOk^][Oܟ{i:迼Ϝk7c X+ 0&֚#t/1>dh~4S},,&̑ڃK1 ,wc:95m\ ̦{[+~ϡ(U64 1džkN.k8>iMĵm ɦN>$Kn8^`ǵա<:bͷX \ɵhkCuʰ:1ƠrhLƖθQu#SUSj9 5F[L08 1ڇdzY@e50 hkW|hӺNd%s BN|^󎚡FMl \s?% 4M2^(ٲV| uδTj"XcU[# ׏UAkXxt >5Ƒ:TzUMQ { J/yV려$BpBB}LkŸ#lI,Cr_4`7Q#oS-5€7>E'֩ (;\A^OQ6cQ"`YNBB`5e)T[y X%z PYɐJP˟D&ZFq sa0\]K@{5(IB|]0 V#̾0:ڋsAXE>vQc<Դ0JL8$K:Q9P.<*PA^}Hc^#t1^A- Ee)/6AlUhCp%9J"Д%^hɜ8I v5v~1n4_GrB/`:̵򉊄TA3+\X 230z>%? J5GNT F {iJ,3/Q_A6xU~)B2)T`p)޻2.dЮrx %TCR2y.,|=)4 A6,N Yz @ܞd XiN7Հ'XJd@4r#Iw+X,\0BMYdi|>4IRqGZL[IlN˚K=Į>,Ў=Uc|fH[H} bL^18 +HqaΡ Rr`bR;8uƅQ8^HJCHv>H&{خ(m_N!'wK >OcKũ0,YTt32NTbWjj;6D#9T pXeIJxu2*4@rRP6Azm.cUk$<*s(13b#QDmJ;1_:{1n.9-p¹TyɎ_| 0\\` ZXY!/JY53sO 3p°!Rچ>n MVRS"HlwOins #d]0p(/&{AA n-P\D#.FIgޚXxA)& '-sh 1DV{,v@ʨ!dW9ĀVǮ૲y=Eޥ̮[9ɳv, I"K1Ěenؠ95 W3&cdTCqa 47l۲1)ڰu5$QkBT͋Kw\1f6bKsm@ޗ99ڒ9dL8Rj0RL, 5m ,e^L@d(*=9$k4t{hMi[LYVH7ǎ>b\;:k9)٥& @q\{:wtGmLшS b Be[b4/d ) _pn׸rjF G ^ =c׀+sm $9 8*+ܬ9e!f$tƁ7tCVB2nh.*ű1i Wbې$ p*LỎzb^l]ccc#Ccl~4p-6]s+M<NeB)5BA5¯kk_&0^FK66oEDYtg+GVbގ)@O<=[7rfqzX}`y&V̚j6E?EYCU q4ݥH?BkaUlQY}[& ?^<95dTܩ\17B!JSԩe[&Sې64rejU/'0% * wxS3.Xw!R@Ii?K`(0D@խ*ؚVز}g 3!ۼ9T`5-V\0iU'W( *yAdG~QA9..i>N(k AA;@|ǖּO%v  Ԋ[[Q(elj|1&l5 Z+R}YL}MC5@;FFA'rdJiblB% `n+V.  L`@]HVK4r.= ri"u\H h^g3l?wAirn vAw,5wqJV}_r 5rFѯbr0_kX2*QWUr#f\6s!MYxZk=/ALTHDJrR$,4KQ݁^pw[ oG1 AXc~B lp=3,\x\\S~IYdO|?F55%V%qV+Qm&Q2U]yaZ d2DNaĶR>Op/ȜOfـSqX ?L0lm+7@PmՂ>+c*2%))׸/I"2dae>,PpQXIzE&_='S71]-JY*rep9QObNK",-RB5HmIwgJR@ {B oT4s8..ky)ϰV}ZZ6Έxyʾ/'QUR U3vP^͵zz jJMN)^ P?Q^:j yxy'NΣ>=U}.U`?aҐE:6-^DIUTz#YRaX;EIun*qzD#$;YiKvUHMsmi3V¥\NTzϙ0+t]৉@^2`H 7*/.gPDyrrQ%H&Kp},+0+d{b&[Y8#6̕)'¾zBSQuRT/HsR9DśTR&ҧ<9ıAMoʂ˷ؠS_e C%)u^E*!qMoHB? PGQSWolbR!T>{#)ƉY<_x󫚞ZUR7(O nLI!9 _V_s.d'䕂@0R"T7B3>UfB<%1itp ēZ$SH/`IXC֓(.~iDU[K;U#EYKqe(P6ܪȣ6X/%zxb{5<)R=m}ږ3lß]mC -DW\x_M>$ =ɕĠUl 6]m 0 S=Q6WeQt*x{4G'hɲ&o4UOIXgxfQfXEx DuA%xN%@Pp1* @fY3 23ed066c97c23c557121aaf9c57e5f3f429e4a23 1176468240 23ed066c97c23c557121aaf9c57e5f3f429e4a23 7f83e2e248d8966d119471c58ef41e7a065c9e1a 1176468292 b2b013f0426018c6cc9dbb30a06fa2bab0aaeea8 73588a1c655a58b2251146675ab64cce8cb45a26 1176468284 68e66f72b932235eeee5d5638d3cba2ec674c208 8a7622d1200067c399e483c4ca19fb382ae1f24e 1176468286 0bc279d4c287dfea715805e349744122f412e3a6 libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/repomd.xml.asc000066400000000000000000000002761476576476200271570ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.9.22 (GNU/Linux) iD8DBQBGzqIbm+zCtd2wN1YRAslJAJ9eQ+6wpaKRVkr5nrQ4vij6ge0QpgCfRoT2 clYiEftDMuaEpZeRaBQodyc= =I83X -----END PGP SIGNATURE----- libzypp-17.36.5/tests/repo/yum/data/10.2-updates-subset/repodata/repomd.xml.key000066400000000000000000000025041476576476200271750ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.6 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz =5nY9 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/000077500000000000000000000000001476576476200202525ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/000077500000000000000000000000001476576476200220515ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/filelists.xml.gz000066400000000000000000000000001476576476200251760ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/filelists.xml.zck000066400000000000000000000000001476576476200253450ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/other.xml.gz000066400000000000000000000000001476576476200243210ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/other.xml.zck000066400000000000000000000000001476576476200244700ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/patterns.xml.gz000066400000000000000000000000001476576476200250400ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/primary.xml.gz000066400000000000000000000000001476576476200246630ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/primary.xml.zck000066400000000000000000000000001476576476200250320ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/repomd.xml000066400000000000000000000067221476576476200240700ustar00rootroot00000000000000 1579611877 obsrepository://build.opensuse.org/OBS:Server:Unstable/openSUSE_15.1 obsbuildid:1547846024 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0e6e755baf18198ef58bb2f4630911b0628f1439ddbc14f486842a3238dbb99b 1579611877 1 599948 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 35ebf812be754b3b5380fd662ec35d3b00302e2f112d0a339710547c19794505 1579611877 1 5344403 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 914babd921de65377d9a746df744865dbe6b45e185db011644b955b6e24b5aeb 1579611877 1 1772089 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0e6e755baf18198ef58bb2f4630911b0628f1439ddbc14f486842a3238dbb99b dc6c50934d7847077e559d740d5363d2d5885e40a811bfb1c6ec71007a7dc73f 1579611877 1 599948 3265 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 35ebf812be754b3b5380fd662ec35d3b00302e2f112d0a339710547c19794505 9d33f302afe9a38630b1c6519a8e0c820902c2247447636d89c50f98a6344e38 1579611877 1 5344403 3260 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 914babd921de65377d9a746df744865dbe6b45e185db011644b955b6e24b5aeb 7ca38348f174e5b9cba5df862b48da22029d10c7288125b59871590706aca580 1579611877 1 1772089 3262 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 cc15cbebe9bd8360d90384cb4ce2aefd9fdf69940090dd719b2d3908dba79d53 1579611877 1 1014 libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/repomd.xml.asc000066400000000000000000000005061476576476200246270ustar00rootroot00000000000000C-!Fa6Y4^)0zypp@testsuite 4s e P5|'T]\vxuLdV2HW:T6A92VYLQoa Pr_ df&lUݜPd;'î}][~vwGR[9y,v4/Yrgd> Cdfnkd cxƛ`pgEv]w<QDIl/?z%8Zu%QTmoOqR&@vY#No[yq>~Н9libzypp-17.36.5/tests/repo/yum/data/ZCHUNK/repodata/repomd.xml.key000066400000000000000000000033351476576476200246540ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBF4oEngBCADqWMfMbd6s4rSQl6/uOpsiFIMKsoEtUAQQdodXTov/kxNKi43D C9SQPB6jicPpG3sGJFQVLb1lRA8Hsqu9wi0HYc5af0Jm4smFJJl6lhYKhDm7JbO6 OGxGvN/Bj//afW+KDWz2YfeY4PNojPGME3d6k1rnwazC6pB0sELHeWbAwSGx5W6P DVgMddSQIY6OsfXf81NGfg6mgmWDq5t+bvmltKGUfRsiPODaaMOOnpLfowTL0VoF B8r1CscV8Y4M6OyO4PmycQU26GTIcVzFNBcMHg5+211bmZJb4zTV45wjsEbYr27x 7pOd7FE10AtNW/tRkt+mW0QmoLEgbmd9/APBABEBAAG0Hnp5cHB0ZXN0c3VpdGUg PHp5cHBAdGVzdHN1aXRlPokBVAQTAQgAPhYhBNp/RmE26oYTpNXGWYajNLYPDprl BQJeKBJ4AhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEIajNLYP DprlQ5gIANbKTou2WsZYfV204oungoJcsh2DRQEcMbY0mdiZ5BOWTTME3TbdA6jc iPFOYzX/Sw9ZVB6mEqWeeEHJzhzE2NZgkQA0ONC+0gn2r5sxr9Rl4zG3/sJN1lrs YyboRhgyB32EGO7g9nxEHBAKLavsWifRKJDeX8loVjOCzcrTNARpnun4TDc6ErHL bvKqUiz3jH7r3bAlmQL2XJsL1fiX9lQWKl9nEqTHkT4KNyi1RcJlpTl3C5nhLc4z w9y5k3WOFgy8S8kgWC9uidarUZfi8uL7e6IM/2WgBqrtyTqWHvqtUsQlzcKEio+w sauvwYkufFaOApnB69HEv3SCWnmDCEi5AQ0EXigSeAEIAN4ATwBho89Tqo9WzotB czDubcWD8FA4UFxPDlrY9YrUtHuDrUUsnT+jUzOI41VRrw4EC1RKHKZRndAoD+66 gwPdGJJXPJhl+ZIUXNJ7gwot6ffOMnr+Htft8a7ZRErUCDcD/gd9fKSycWcFdGjn nYQ17f91dPIpj3//OwoiYpxpcqMjKh2IYqGkDyem4DfCNi+3aHMldwHwlgr3Z4Ne FjmCpBhEb7mTginZhq5bXnS3G2pteIifLo8pC+N+rG/Vw+F0DYPGKuDqQQXwoqVw WVSnhpfUauls7ROM3zndoW9eZ+qkTCA0WqYxlIVwVgsZwwhg1dGnqFwl8AJfCa1O /nEAEQEAAYkBPAQYAQgAJhYhBNp/RmE26oYTpNXGWYajNLYPDprlBQJeKBJ4AhsM BQkDwmcAAAoJEIajNLYPDprlsAIIAMejrcg+WRiFKAt6JvkKlc8DrnV8H6Da7KFU SfoqFkIRxR3b7/oUsrvy1AWkeDhXIe3ba36+4tXTjXJGTfmWVq68V6Pcp0LdQ5qM omalDGlbmb7jlbm+MuzN6pTOGKzb70CtaoqSasLFBqzJ/ytC1dPZZHjukKE56WJ2 JVsZzslxXHp1gpWQxGNiPblM207fg8UWla8P6hvHaDOk90UnwPkOvHjmhKmPEse6 Eo3kMmriAErInjc+qGFcBWLSP7GzDT1+gmzw6w0JX6hTldP9FeMfZjv8ANRVeUns TbDUG+KCCihRCmQorzrDAi25ai++sgAhvj4Np4qz3qLop81KExA= =uIZP -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/repo/yum/data/extensions/000077500000000000000000000000001476576476200214475ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/extensions/repodata/000077500000000000000000000000001476576476200232465ustar00rootroot00000000000000libzypp-17.36.5/tests/repo/yum/data/extensions/repodata/filelists.xml.gz000066400000000000000000000004341476576476200264060ustar00rootroot00000000000000ez.ImKn0D꽍FdF9} $gc*.gn5$BL֍'åԻկ,㪡~>q&֑ y1h:l(I 8ݯlg5(`Z2fXNJIZEc̐8i58glibzypp-17.36.5/tests/repo/yum/data/extensions/repodata/other.xml.gz000066400000000000000000000003231476576476200255260ustar00rootroot00000000000000nz.I=An0 E~hҨ"̮'h!*ԝws{|KX [BLǯϏ[[5Kx w)Ȃ.gtPGXX\ֱ 5mCѽ]; #HYbD3{uh-Yx]/Z(a6hYVe~libzypp-17.36.5/tests/repo/yum/data/extensions/repodata/primary.xml.gz000066400000000000000000000016051476576476200260740ustar00rootroot00000000000000eY]o6}ϯ%ˁbؚÀu(H6aIH)iwegE8Af٦.//$}*;F:# j*!o󫴂rR Ȯmk)e}yx(R5׺n:|,mL4szaikA!2%kҲ>L$˻ v)CvDFʳXlE۾/.%@8pAj5oRMuJ0cp0|L70UʖF0#{(ҴFm"9EY%åyx\?`j 8#[V͛yWA2L^O ?> xy}.eq0N;&WU5H~%ݢ[ܾ#_sŇs<ԙU._(TA| ]S+yHB?L"F ZO(ea|۬~}W\|f5ַh_ k1հyaE4Mr{~!8aI(u71'z obsrepository://build.suse.de/SUSE:openSUSE:11:standard opensuse i386 other string openSUSE 11.0 SLE 11.0 SLE 11.0 603807e12e7418911fa9f158ef66b9c20f1df567 1215823452 34cde52910a161664291bd93e8a9cd24f751af6b 06660c856facf17822102d09d849d42fad79d28e 1215823453 fdabcfd9c056109ab25acf0644823bdec94b6cfd dff5db9c510c177b5ae01ec79f10ac47844e6494 1215823454 c6bd3c6099de74d97ed045163235be10ffa8a85f 2950f8a880455d7b7e96d3bddd5859bd4db38524 1227279057.0 b17c055bef95bca397faffdf028cfa91dd1b24bc 34599f8eed67ec256299d295617ceaf05ae7ebdd 1227279057.0 a3011438085ac55f06c68053201ea3ded17ee85c libzypp-17.36.5/tests/repo/yum/data/extensions/repodata/susedata.xml.gz000066400000000000000000000007411476576476200262220ustar00rootroot00000000000000 fKo0)\UV\1E6¦l})(I&cf-S\ m1 c@ #}o_vʎ$s ymk|rE]K(BctǮ^q'0hj=6ҏI¨J3I8W1C$T&+ g 0 5Fl7IU3:\'<1 0h΋‘_;AcSAJAX*P%䊦9]81 Y|Qd][ v{3[ h:رWd&n8 kUt7󤮒怒rd(`,.3@}2J^+}FWYm5|mX A~0N6ڂ;[5Ӎ/<16D,|0-h?K @|l:iCQgL9sշWEƺlSEw~hl3/libzypp-17.36.5/tests/repo/yum/data/extensions/repodata/suseinfo.xml.gz000066400000000000000000000001021476576476200262330ustar00rootroot00000000000000M[suseinfo.xml).-NK˷RPI(,J3630чrlj&/libzypp-17.36.5/tests/sat/000077500000000000000000000000001476576476200153475ustar00rootroot00000000000000libzypp-17.36.5/tests/sat/BlacklistedPool/000077500000000000000000000000001476576476200204225ustar00rootroot00000000000000libzypp-17.36.5/tests/sat/BlacklistedPool/@System.repo000066400000000000000000000003031476576476200226710ustar00rootroot00000000000000=Ver: 3.0 # Retracted-patch-package() is not part of the installed package. # It's injected into available pkgs by libsolv =Pkg: package 5 1 x86_64 +Prv: ptf() ptf-package() package = 5-1 -Prv: libzypp-17.36.5/tests/sat/BlacklistedPool/Repo.repo000066400000000000000000000007331476576476200222210ustar00rootroot00000000000000=Ver: 3.0 # Retracted-patch-package() is not part of the installed package. # It's injected into available pkgs by libsolv =Pkg: package 1 1 x86_64 +Prv: package = 1-1 -Prv: =Pkg: package 2 1 x86_64 +Prv: retracted-patch-package() package = 2-1 -Prv: =Pkg: package 3 1 x86_64 +Prv: ptf() package = 3-1 -Prv: =Pkg: package 4 1 x86_64 +Prv: ptf-package() package = 4-1 -Prv: =Pkg: package 5 1 x86_64 +Prv: retracted-patch-package() ptf() ptf-package() package = 5-1 -Prv: libzypp-17.36.5/tests/sat/BlacklistedPool/zypp-control.yaml000066400000000000000000000014461476576476200237730ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: Repo url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: Repo.repo - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: [] autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/sat/Blacklisted_test.cc000066400000000000000000000042641476576476200211440ustar00rootroot00000000000000#include using boost::unit_test::test_case; #include #include #include #include "TestSetup.h" #include using std::cin; using std::cout; using std::cerr; using std::endl; using namespace zypp; static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); void testcase_init() { test.loadTestcaseRepos( TESTS_SRC_DIR"/sat/BlacklistedPool" ); } std::string blacktag( const PoolItem & pi_r ) { char buf[6]; buf[0] = pi_r.isBlacklisted() ? 'B' : ' '; buf[1] = pi_r.isRetracted() ? 'R' : ' '; buf[2] = pi_r.isPtf() ? 'P' : ' '; buf[3] = pi_r.isPtfMaster() ? 'm' : ' '; buf[4] = pi_r.isPtfPackage() ? 'p' : ' '; buf[5] = '\0'; return buf; } std::string blacktag( ui::Selectable::Ptr sel_r ) { char buf[7]; buf[0] = sel_r->hasBlacklisted() ? 'B' : ' '; buf[1] = sel_r->hasBlacklistedInstalled() ? 'b' : ' '; buf[2] = sel_r->hasRetracted() ? 'R' : ' '; buf[3] = sel_r->hasRetractedInstalled() ? 'r' : ' '; buf[4] = sel_r->hasPtf() ? 'P' : ' '; buf[5] = sel_r->hasPtfInstalled() ? 'p' : ' '; buf[6] = '\0'; return buf; } BOOST_AUTO_TEST_CASE(BlacklistedPool) { testcase_init(); ResPoolProxy poolProxy( test.poolProxy() ); ui::Selectable::Ptr s( poolProxy.lookup( ResKind::package, "package" ) ); BOOST_REQUIRE( s ); //cout << blacktag(s) << endl; BOOST_CHECK_EQUAL( blacktag(s), "BbRrPp" ); std::vector expect = { "BRPmp" // I__s_(7)package-5-1.x86_64(@System) ," " // U__s_(2)package-1-1.x86_64(Repo) ,"BRPmp" // U__s_(6)package-5-1.x86_64(Repo) ,"B P p" // U__s_(5)package-4-1.x86_64(Repo) ,"B Pm " // U__s_(4)package-3-1.x86_64(Repo) ,"BR " // U__s_(3)package-2-1.x86_64(Repo) }; unsigned idx = unsigned(-1); for ( const auto & pi : s->installed() ) { //cout << blacktag(pi) << " " << pi << endl; BOOST_CHECK_EQUAL( blacktag(pi), expect[++idx] ); } for ( const auto & pi : s->available() ) { //cout << blacktag(pi) << " " << pi << endl; BOOST_CHECK_EQUAL( blacktag(pi), expect[++idx] ); } } libzypp-17.36.5/tests/sat/CMakeLists.txt000066400000000000000000000003541476576476200201110ustar00rootroot00000000000000 # to find the KeyRingTest receiver INCLUDE_DIRECTORIES( ${LIBZYPP_SOURCE_DIR}/tests/zypp ) ADD_TESTS( Blacklisted IdString LookupAttr Pool Queue Map Solvable SolvableSpec SolvParsing WhatObsoletes WhatProvides ) libzypp-17.36.5/tests/sat/IdString_test.cc000066400000000000000000000030431476576476200204400ustar00rootroot00000000000000#include "TestSetup.h" #include BOOST_AUTO_TEST_CASE(idstring) { // id 0 ==> NULL // id 1 ==> "" // evaluates id in a boolean context IdString a0( 0 ); IdString a1( 1 ); BOOST_CHECK_EQUAL( a0.id(), 0 ); BOOST_CHECK_EQUAL( a1.id(), 1 ); BOOST_CHECK( !a0 ); BOOST_CHECK( a1 ); BOOST_CHECK( !(a0 == a1) ); BOOST_CHECK( (a0 != a1) ); BOOST_CHECK( (a0 < a1) ); BOOST_CHECK( (a1 > a0) ); BOOST_CHECK( !(a0 >= a1) ); BOOST_CHECK( !(a1 <= a0) ); BOOST_CHECK_EQUAL( a0.compare( (const char *)0 ), 0 ); BOOST_CHECK_EQUAL( a0.compare( "" ), -1 ); BOOST_CHECK_EQUAL( a0.compare( a1 ), -1 ); BOOST_CHECK_EQUAL( a1.compare( (const char *)0 ), 1 ); BOOST_CHECK_EQUAL( a1.compare( "" ), 0 ); BOOST_CHECK_EQUAL( a1.compare( a0 ), 1 ); } BOOST_AUTO_TEST_CASE(idstringtype) { sat::SolvAttr a0( sat::SolvAttr::allAttr ); sat::SolvAttr a1( sat::SolvAttr::noAttr ); BOOST_CHECK_EQUAL( a0.id(), 0 ); BOOST_CHECK_EQUAL( a1.id(), 1 ); BOOST_CHECK( !a0 ); BOOST_CHECK( !a1 ); // evaluates empty string (id 0/1) in a boolean context BOOST_CHECK( !(a0 == a1) ); BOOST_CHECK( (a0 != a1) ); BOOST_CHECK( (a0 < a1) ); BOOST_CHECK( (a1 > a0) ); BOOST_CHECK( !(a0 >= a1) ); BOOST_CHECK( !(a1 <= a0) ); BOOST_CHECK_EQUAL( a0.compare( (const char *)0 ), 0 ); BOOST_CHECK_EQUAL( a0.compare( "" ), -1 ); BOOST_CHECK_EQUAL( a0.compare( a1 ), -1 ); BOOST_CHECK_EQUAL( a1.compare( (const char *)0 ), 1 ); BOOST_CHECK_EQUAL( a1.compare( "" ), 0 ); BOOST_CHECK_EQUAL( a1.compare( a0 ), 1 ); } libzypp-17.36.5/tests/sat/LookupAttr_test.cc000066400000000000000000000172531476576476200210310ustar00rootroot00000000000000#include "TestSetup.h" #include #include #include static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); // Must be the first test! BOOST_AUTO_TEST_CASE(bnc_435838) { // empty @system to pool test.satpool().systemRepo(); BOOST_REQUIRE( test.satpool().findSystemRepo() ); // bnc_435838 crashes if iterating a just created repo. sat::LookupAttr q( sat::SolvAttr::name ); for_( it, q.begin(),q.end() ) ; } BOOST_AUTO_TEST_CASE(LookupAttr_init) { //test.loadTarget(); // initialize and load target test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1" ); test.loadRepo( TESTS_SRC_DIR "/data/obs_virtualbox_11_1" ); test.loadRepo( TESTS_SRC_DIR "/data/11.0-update" ); } BOOST_AUTO_TEST_CASE(LookupAttr_defaultconstructed) { sat::LookupAttr q; BOOST_CHECK( q.empty() ); BOOST_CHECK( q.size() == 0 ); BOOST_CHECK_EQUAL( q.begin(), q.end() ); } BOOST_AUTO_TEST_CASE(LookupAttr_nonexistingattr) { sat::LookupAttr q( sat::SolvAttr("nonexistingattr") ); BOOST_CHECK( q.empty() ); BOOST_CHECK( q.size() == 0 ); BOOST_CHECK_EQUAL( q.begin(), q.end() ); } BOOST_AUTO_TEST_CASE(LookupAttr_existingattr) { sat::LookupAttr q( sat::SolvAttr::name ); BOOST_CHECK( ! q.empty() ); BOOST_CHECK( q.size() != 0 ); BOOST_CHECK_NE( q.begin(), q.end() ); } BOOST_AUTO_TEST_CASE(LookupAttr_existingattr_matcher) { sat::LookupAttr q( sat::SolvAttr::name ); BOOST_CHECK_THROW( q.setStrMatcher( StrMatcher("[]ypper",Match::REGEX) ), MatchInvalidRegexException ); BOOST_CHECK( ! q.strMatcher() ); BOOST_CHECK_NO_THROW( q.setStrMatcher( StrMatcher("[zZ]ypper",Match::REGEX) ) ); BOOST_CHECK( q.strMatcher() ); BOOST_CHECK_EQUAL( q.size(), 9 ); } BOOST_AUTO_TEST_CASE(LookupAttr_iterate_solvables) { // sat::SolvAttr::name query should visit each solvable once. // So query size and containersize are to be equal if we query // pool/repo/solvable. Quick check whether the iterators // position info matches the result. sat::Pool satpool( test.satpool() ); { // iterate all: sat::LookupAttr q( sat::SolvAttr::name ); BOOST_CHECK_EQUAL( q.size(), satpool.solvablesSize() ); // quick test whether iterator positions actually matches the result: for_( res, q.begin(), q.end() ) { BOOST_CHECK_EQUAL( res.inRepo(), res.inSolvable().repository() ); BOOST_CHECK_EQUAL( res.inSolvAttr(), sat::SolvAttr::name ); } } { unsigned total = 0; for_( it, satpool.reposBegin(), satpool.reposEnd() ) { // iterate one repo: sat::LookupAttr q( sat::SolvAttr::name, *it ); BOOST_CHECK_EQUAL( q.size(), it->solvablesSize() ); total += q.size(); // test result actually matches the repo: for_( res, q.begin(), q.end() ) { BOOST_CHECK_EQUAL( res.inRepo(), *it ); BOOST_CHECK_EQUAL( res.inRepo(), res.inSolvable().repository() ); BOOST_CHECK_EQUAL( res.inSolvAttr(), sat::SolvAttr::name ); } } BOOST_CHECK_EQUAL( total, satpool.solvablesSize() ); } { unsigned total = 0; for_( it, satpool.solvablesBegin(), satpool.solvablesEnd() ) { // iterate one solvable: sat::LookupAttr q( sat::SolvAttr::name, *it ); BOOST_CHECK_EQUAL( q.size(), 1 ); total += q.size(); // test result actually matches the solvable: for_( res, q.begin(), q.end() ) { BOOST_CHECK_EQUAL( res.inSolvable(), *it ); BOOST_CHECK_EQUAL( res.inRepo(), res.inSolvable().repository() ); BOOST_CHECK_EQUAL( res.inSolvAttr(), sat::SolvAttr::name ); } } BOOST_CHECK_EQUAL( total, satpool.solvablesSize() ); } } BOOST_AUTO_TEST_CASE(LookupAttr_itetate_all_attributes) { sat::Pool satpool( test.satpool() ); // iterate all: sat::LookupAttr all( sat::SolvAttr::allAttr ); { unsigned total = 0; for_( it, satpool.reposBegin(), satpool.reposEnd() ) { // iterate one repo: sat::LookupAttr q( sat::SolvAttr::allAttr, *it ); total += q.size(); } BOOST_CHECK_EQUAL( total, all.size() ); } { unsigned total = 0; for_( it, satpool.solvablesBegin(), satpool.solvablesEnd() ) { // iterate one solvable: sat::LookupAttr q( sat::SolvAttr::allAttr, *it ); total += q.size(); } BOOST_CHECK_EQUAL( total, all.size() ); } } BOOST_AUTO_TEST_CASE(LookupAttr_solvable_attribute_substructure) { sat::LookupAttr q( sat::SolvAttr::updateReference ); BOOST_CHECK_EQUAL( q.size(), 303 ); for_( res, q.begin(), q.end() ) { BOOST_CHECK( ! res.subEmpty() ); BOOST_CHECK_EQUAL( res.subSize(), 4 ); BOOST_CHECK_EQUAL( res.subFind( sat::SolvAttr::allAttr ), res.subBegin() ); BOOST_CHECK_EQUAL( res.subFind( "" ), res.subBegin() ); BOOST_CHECK_EQUAL( res.subFind( sat::SolvAttr::updateReference ), res.subEnd() ); BOOST_CHECK_EQUAL( res.subFind( "noval" ), res.subEnd() ); BOOST_CHECK_NE( res.subFind( sat::SolvAttr::updateReferenceType ), res.subEnd() ); BOOST_CHECK_NE( res.subFind( sat::SolvAttr::updateReferenceHref ), res.subEnd() ); BOOST_CHECK_NE( res.subFind( sat::SolvAttr::updateReferenceId ), res.subEnd() ); BOOST_CHECK_NE( res.subFind( sat::SolvAttr::updateReferenceTitle ), res.subEnd() ); BOOST_CHECK_EQUAL( res.subFind( sat::SolvAttr::updateReferenceType ), res.subFind( "type" ) ); BOOST_CHECK_EQUAL( res.subFind( sat::SolvAttr::updateReferenceHref ), res.subFind( "href" ) ); BOOST_CHECK_EQUAL( res.subFind( sat::SolvAttr::updateReferenceId ), res.subFind( "id" ) ); BOOST_CHECK_EQUAL( res.subFind( sat::SolvAttr::updateReferenceTitle ), res.subFind( "title" ) ); // repeatedly calling subBegin() is ok: BOOST_CHECK_EQUAL( res.subFind( sat::SolvAttr::updateReferenceType ).subBegin(), res.subBegin() ); } // search substructure id without parent-structure works for wellknown structures: q = sat::LookupAttr( sat::SolvAttr::updateReferenceId ); BOOST_CHECK_EQUAL( q.size(), 303 ); // search id in parent-structure: q = sat::LookupAttr( sat::SolvAttr::updateReferenceId, sat::SolvAttr::updateReference ); BOOST_CHECK_EQUAL( q.size(), 303 ); // search id in any parent-structure: q = sat::LookupAttr( sat::SolvAttr::updateReferenceId, sat::SolvAttr::allAttr ); BOOST_CHECK_EQUAL( q.size(), 303 ); // search any id in parent-structure: (4 ids per updateReference) q = sat::LookupAttr( sat::SolvAttr::allAttr, sat::SolvAttr::updateReference ); BOOST_CHECK_EQUAL( q.size(), 1212 ); // search any id in any parent-structure: // - https://github.com/openSUSE/libsolv/pull/402 added an additional // flexarray to each of the 2287 entries. This is // why the total size varies depending on the libsolv version used. q = sat::LookupAttr( sat::SolvAttr::allAttr, sat::SolvAttr::allAttr ); auto qs = q.size(); BOOST_CHECK( qs == 10473 || qs == 12760 ); // for_(it,q.begin(),q.end()) // { cout << it << endl;} } BOOST_AUTO_TEST_CASE(LookupAttr_repoattr) { sat::LookupAttr q( sat::SolvAttr::repositoryAddedFileProvides, sat::LookupAttr::REPO_ATTR ); BOOST_CHECK( ! q.empty() ); BOOST_CHECK_EQUAL( q.size(), 264 ); sat::LookupRepoAttr p( sat::SolvAttr::repositoryAddedFileProvides ); BOOST_CHECK( ! p.empty() ); BOOST_REQUIRE_EQUAL( p.size(), q.size() ); sat::LookupRepoAttr::iterator pit( p.begin() ); for_( qit, q.begin(), q.end() ) { BOOST_CHECK_EQUAL( qit, pit ); ++pit; } } #if 0 BOOST_AUTO_TEST_CASE(LookupAttr_) { base::LogControl::TmpLineWriter shutUp( new log::FileLineWriter( "/tmp/YLOG" ) ); MIL << "GO" << endl; } #endif libzypp-17.36.5/tests/sat/Map_test.cc000066400000000000000000000032241476576476200174330ustar00rootroot00000000000000#include #include #include #include #include #include #define BOOST_TEST_MODULE Map using std::endl; using std::cout; using namespace zypp; using namespace boost::unit_test; BOOST_AUTO_TEST_CASE(basic) { sat::Map m; BOOST_CHECK_EQUAL( m.empty(), true ); BOOST_CHECK_EQUAL( m.size(), 0 ); BOOST_CHECK_EQUAL( m.asString(), "" ); BOOST_CHECK( m == sat::Map() ); m.grow( 8 ); BOOST_CHECK_EQUAL( m.empty(), false ); BOOST_CHECK_EQUAL( m.size(), 8 ); BOOST_CHECK_EQUAL( m.asString(), "00000000" ); BOOST_CHECK( m != sat::Map() ); m.grow( 9 ); BOOST_CHECK_EQUAL( m.empty(), false ); BOOST_CHECK_EQUAL( m.size(), 16 ); BOOST_CHECK_EQUAL( m.asString(), "0000000000000000" ); m.grow( 0 ); // no shrink! BOOST_CHECK_EQUAL( m.size(), 16 ); m.setAll(); BOOST_CHECK_EQUAL( m.asString(), "1111111111111111" ); m.clear( 0 ); m.assign( 3, false ); BOOST_CHECK_EQUAL( m.asString(), "0110111111111111" ); BOOST_CHECK_EQUAL( m.test( 0 ), false ); BOOST_CHECK_EQUAL( m.test( 1 ), true ); // COW m.clearAll(); sat::Map n(m); BOOST_CHECK_EQUAL( m.asString(), "0000000000000000" ); BOOST_CHECK_EQUAL( n.asString(), "0000000000000000" ); BOOST_CHECK_EQUAL( m, n ); m.set( 1 ); BOOST_CHECK_EQUAL( m.asString(), "0100000000000000" ); BOOST_CHECK_EQUAL( n.asString(), "0000000000000000" ); BOOST_CHECK( m != n ); n.set( 1 ); BOOST_CHECK_EQUAL( m.asString(), "0100000000000000" ); BOOST_CHECK_EQUAL( n.asString(), "0100000000000000" ); BOOST_CHECK( m == n ); BOOST_CHECK_THROW( m.set( 99 ), std::out_of_range ); } libzypp-17.36.5/tests/sat/Pool_test.cc000066400000000000000000000051451476576476200176330ustar00rootroot00000000000000#include "TestSetup.h" #include #include static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); namespace zypp { namespace detail { /** \relates RepositoryIterator Stream output */ inline std::ostream & operator<<( std::ostream & str, const RepositoryIterator & obj ) { str << "RI["<< *obj <<"]"; return str; } }} // Must be the first test! BOOST_AUTO_TEST_CASE(findSystemRepo) { // On the fly check that findSystemRepo does not // cause loading the SystemRepo. check 2 times. BOOST_REQUIRE( ! test.satpool().findSystemRepo() ); BOOST_REQUIRE( ! test.satpool().findSystemRepo() ); } void checkRepoIter() { sat::Pool satpool( test.satpool() ); sat::Pool::size_type count = satpool.reposSize(); for_( it, satpool.reposBegin(), satpool.reposEnd() ) { cout << "- " << count << " " << *it << endl; BOOST_CHECK( *it ); --count; } BOOST_CHECK_EQUAL( count, 0 ); } BOOST_AUTO_TEST_CASE(repolist) { // libzypp-11: underlying libsolv changed the pools repository // pointer list. It may now contain emebeded NULLs which have // to be skipped when iterating the repos. // sat::Pool satpool( test.satpool() ); BOOST_CHECK( satpool.reposEmpty() ); BOOST_CHECK_EQUAL( satpool.reposSize(), 0 ); checkRepoIter(); // empty @system to pool test.satpool().systemRepo(); BOOST_REQUIRE( satpool.findSystemRepo() ); BOOST_CHECK( !satpool.reposEmpty() ); BOOST_CHECK_EQUAL( satpool.reposSize(), 1 ); checkRepoIter(); test.loadRepo( TESTS_SRC_DIR "/data/obs_virtualbox_11_1" ); BOOST_CHECK( !satpool.reposEmpty() ); BOOST_CHECK_EQUAL( satpool.reposSize(), 2 ); checkRepoIter(); test.loadRepo( TESTS_SRC_DIR "/data/11.0-update" ); BOOST_CHECK( !satpool.reposEmpty() ); BOOST_CHECK_EQUAL( satpool.reposSize(), 3 ); checkRepoIter(); satpool.reposErase( ":obs_virtualbox_11_1" ); BOOST_CHECK( !satpool.reposEmpty() ); BOOST_CHECK_EQUAL( satpool.reposSize(), 2 ); checkRepoIter(); satpool.reposErase( ":11.0-update" ); test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1" ); BOOST_CHECK( !satpool.reposEmpty() ); BOOST_CHECK_EQUAL( satpool.reposSize(), 2 ); checkRepoIter(); /* for_( it, satpool.reposBegin(), satpool.reposEnd() ) { cout << "- " << *it << endl; }*/ //test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1" ); } #if 0 BOOST_AUTO_TEST_CASE(LookupAttr_) { base::LogControl::TmpLineWriter shutUp( new log::FileLineWriter( "/tmp/YLOG" ) ); MIL << "GO" << endl; } #endif libzypp-17.36.5/tests/sat/Queue_test.cc000066400000000000000000000023201476576476200177760ustar00rootroot00000000000000#include #include #include #include #include #include #define BOOST_TEST_MODULE Queue using std::endl; using std::cout; using namespace zypp; using namespace boost::unit_test; BOOST_AUTO_TEST_CASE(basic) { sat::Queue m; BOOST_CHECK_EQUAL( m.empty(), true ); BOOST_CHECK_EQUAL( m.size(), 0 ); BOOST_CHECK_EQUAL( m.begin(), m.end() ); BOOST_CHECK( m == sat::Queue() ); BOOST_CHECK_EQUAL( m.first(), 0 ); BOOST_CHECK_EQUAL( m.last(), 0 ); m.push( 13 ); BOOST_CHECK_EQUAL( m.empty(), false ); BOOST_CHECK_EQUAL( m.size(), 1 ); BOOST_CHECK( m.begin() != m.end() ); BOOST_CHECK_EQUAL( m.begin()+1, m.end() ); BOOST_CHECK_EQUAL( m.first(), 13 ); BOOST_CHECK_EQUAL( m.last(), 13 ); BOOST_CHECK_EQUAL( m.at(0), 13 ); BOOST_CHECK_THROW( m.at(1), std::out_of_range ); BOOST_CHECK( m.contains(13) ); BOOST_CHECK( !m.contains(14) ); BOOST_CHECK_EQUAL( m.find(13), m.begin() ); BOOST_CHECK_EQUAL( m.find(14), m.end() ); m.pushUnique( 13 ); BOOST_CHECK_EQUAL( m.size(), 1 ); m.push( 13 ); BOOST_CHECK_EQUAL( m.size(), 2 ); m.remove( 13 ); BOOST_CHECK_EQUAL( m.size(), 0 ); } libzypp-17.36.5/tests/sat/SolvParsing_test.cc000066400000000000000000000104341476576476200211660ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include // allows us to control signature // callbacks #include "KeyRingTestReceiver.h" #define BOOST_TEST_MODULE ResObject using std::cout; using std::endl; using std::string; using namespace zypp; using namespace boost::unit_test; /* * this test test that the attributes * from the metadata are preserved into * the final object * * so the test covers both libsolv-tools * right insertion and parsing * and libzypp ResObject and friends data * extraction from solv files */ // init the solv static void init_pool_yum() { Pathname dir(TESTS_SRC_DIR); dir += "/repo/yum/data/10.2-updates-subset"; ZYpp::Ptr z = getZYpp(); ZConfig::instance().setSystemArchitecture(Arch("i586")); filesystem::TmpDir tmp; RepoManagerOptions opts = RepoManagerOptions::makeTestSetup(tmp.path()); RepoManager mgr(opts); KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // disable sgnature checking keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); keyring_callbacks.answerAcceptVerFailed(true); keyring_callbacks.answerAcceptUnknownKey(true); RepoInfo info; info.setAlias("updates"); info.addBaseUrl(dir.asUrl()); mgr.buildCache(info); mgr.loadFromCache(info); } BOOST_AUTO_TEST_CASE(attributes) { init_pool_yum(); MIL << sat::Pool::instance(); Repository r = sat::Pool::instance().reposFind("updates"); int c = 0; for ( Repository::SolvableIterator it = r.solvablesBegin(); it != r.solvablesEnd(); ++it ) { sat::Solvable s = *it; //MIL << s.ident() << endl; if ( s.ident() == "openssl-devel" ) { c++; Package::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); //solvable 5 (6): //name: openssl-devel 0.9.8d-17.2 i586 BOOST_CHECK_EQUAL(p->name(), "openssl-devel"); //vendor: SUSE LINUX Products GmbH, Nuernberg, Germany BOOST_CHECK_EQUAL(p->vendor(), "SUSE LINUX Products GmbH, Nuernberg, Germany"); //solvable:checksum: 9f6a44015ad97680e9f93d0edefa1d533940479c BOOST_CHECK_EQUAL(p->checksum(), CheckSum::sha1("9f6a44015ad97680e9f93d0edefa1d533940479c")); //solvable:summary: BOOST_CHECK_EQUAL(p->summary(), "Include Files and Libraries mandatory for Development."); //solvable:description: This package contains all necessary include files and libraries needed //to develop applications that require these. BOOST_CHECK_EQUAL(p->description(), "This package contains all necessary include files and libraries needed\nto develop applications that require these."); //solvable:authors: Mark J. Cox //Ralf S. Engelschall //Dr. Stephen //Ben Laurie //Bodo Moeller //Ulf Moeller //Holger Reif //Paul C. Sutton //solvable:packager: http://bugs.opensuse.org //solvable:url: http://www.openssl.org/ //solvable:buildtime: 1165493634 //solvable:installsize: 3845 BOOST_CHECK_EQUAL(p->installSize(), ByteCount(3937193)); //solvable:downloadsize: 909 BOOST_CHECK_EQUAL(p->downloadSize(), ByteCount(930588)); //solvable:mediadir: rpm/i586 //solvable:mediafile: openssl-devel-0.9.8d-17.2.i586.rpm //solvable:license: BSD License and BSD-like, Other License(s), see package //solvable:group: Development/Libraries/C and C++ BOOST_CHECK_EQUAL(p->group(), "Development/Libraries/C and C++"); //solvable:sourcearch: src //solvable:sourceevr: (void) //solvable:sourcename: openssl //solvable:headerend: 34861 } } // check that we actually found all testeable // resolvables BOOST_CHECK_EQUAL(c, 1); } libzypp-17.36.5/tests/sat/SolvableSpec_test.cc000066400000000000000000000107041476576476200213010ustar00rootroot00000000000000#include #include #include #include #include #include "TestSetup.h" #define BOOST_CHECK_MODULE SolvableSpec using std::cout; using std::endl; using std::string; using namespace zypp; using namespace boost::unit_test; BOOST_AUTO_TEST_CASE(parsing) { { sat::SolvableSpec specs; // adds no empty values specs.addIdent ( IdString() ); specs.addIdent ( IdString( "" ) ); specs.addProvides( Capability() ); specs.addProvides( Capability( "" ) ); BOOST_CHECK( ! specs.containsIdent( IdString() ) ); BOOST_CHECK( ! specs.containsProvides( Capability() ) ); BOOST_CHECK( ! specs.containsIdent( IdString( "" ) ) ); BOOST_CHECK( ! specs.containsProvides( Capability( "" ) ) ); } { sat::SolvableSpec specs; specs.addIdent ( IdString( "idstr" ) ); specs.addProvides( Capability( "idcap" ) ); specs.addProvides( Capability( "idvcap=13" ) ); specs.addProvides( Capability( "idvwcap = 14" ) ); BOOST_CHECK( specs.containsIdent ( IdString( "idstr" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) ); } { sat::SolvableSpec specs; specs.parse( "idstr" ); specs.parse( "provides:idcap" ); specs.parse( "provides:idvcap=13" ); specs.parse( "provides:idvwcap = 14" ); BOOST_CHECK( specs.containsIdent ( IdString( "idstr" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) ); } { sat::SolvableSpec specs; std::stringstream str; str << "# some comment" << endl; str << " # maybe indented" << endl; str << " \t " << endl; // white line str << " idstr " << endl; str << " provides:idcap " << endl; str << " provides:idvcap=13 " << endl; str << " provides:idvwcap = 14 " << endl; str << "" << endl; specs.parseFrom( str ); BOOST_CHECK( specs.containsIdent ( IdString( "idstr" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) ); } { sat::SolvableSpec specs; specs.splitParseFrom( "idstr provides:idcap provides:idvcap=13 provides:idvwcap\\ =\\ 14 id\\ ws\\ str provides:id\\ ws\\ cap\\ =\\ 99" ); BOOST_CHECK( specs.containsIdent ( IdString( "idstr" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idcap", "", "" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvcap", "=", "13" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "idvwcap", "=", "14" ) ) ); BOOST_CHECK( specs.containsIdent ( IdString( "id ws str" ) ) ); BOOST_CHECK( specs.containsProvides( Capability( "", "id ws cap", "=", "99" ) ) ); } } BOOST_AUTO_TEST_CASE(eval) { sat::SolvableSpec specs; specs.parse( "candidate" ); BOOST_CHECK( !specs.dirty() ); // ident don't specs.parse( "provides:available_only > 1-1" ); BOOST_CHECK( specs.dirty() ); // deps do TestSetup test( Arch_x86_64 ); test.loadTestcaseRepos( TESTS_SRC_DIR "/data/TCSelectable" ); std::set matches {2,3,8,9,14,15,16,17,28}; // matching Solvable IDs in TestcaseRepo (does not match srcpackage:!) for ( const auto & solv : ResPool::instance() ) { //cout << ( specs.contains( solv ) ? "* " : " " ) << solv << endl; BOOST_CHECK_MESSAGE( specs.contains( solv ) == matches.count( solv.id() ), str::Str() << "Wrong: " << ( specs.contains( solv ) ? "* " : " " ) << solv ); } BOOST_CHECK( !specs.dirty() ); // loop built the cache specs.parse( "provides:available_only > 1-1" ); BOOST_CHECK( !specs.dirty() ); // already have this spec, no need to set dirty specs.parse( "provides:available_only = 1-1" ); BOOST_CHECK( specs.dirty() ); // This is a new one, so got dirty matches.insert( 13 ); for ( const auto & solv : ResPool::instance() ) { BOOST_CHECK_MESSAGE( specs.contains( solv ) == matches.count( solv.id() ), str::Str() << "Wrong: " << ( specs.contains( solv ) ? "* " : " " ) << solv ); } } libzypp-17.36.5/tests/sat/Solvable_test.cc000066400000000000000000000201001476576476200204550ustar00rootroot00000000000000#include #include #include #include #include #include #include #include "TestSetup.h" #define BOOST_TEST_MODULE Solvable using std::cout; using std::endl; using std::string; using namespace zypp; using namespace boost::unit_test; struct TestInit { TestInit() : _test( Arch_x86_64 ){ _test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" ); _test.loadRepo( TESTS_SRC_DIR "/data/11.0-update", "update" ); } TestSetup _test; }; BOOST_GLOBAL_FIXTURE( TestInit ); BOOST_AUTO_TEST_CASE(attributes) { MIL << sat::Pool::instance(); Repository r = sat::Pool::instance().reposFind("opensuse"); int c = 0; for ( Repository::SolvableIterator it = r.solvablesBegin(); it != r.solvablesEnd(); ++it ) { sat::Solvable s = *it; //MIL << s.ident() << endl; if ( s.ident() == "pattern:apparmor" ) { c++; // solvable 21795 (21796): // name: pattern:apparmor 11.0-67 i586 // vendor: SUSE LINUX Products GmbH, Nuernberg, Germany // provides: // pattern:apparmor = 11.0-67 // requires: // pattern:basesystem // apparmor-parser // audit // apparmor-profiles // recommends: // yast2-apparmor // apparmor-utils // pattern:apparmor_opt // solvable:category: Base Technologies // solvable:icon: yast-software // solvable:summary: Novell AppArmor // solvable:description: Novell AppArmor is an application security framework that provides mandatory access control for programs. It protects from exploitation of software flaws and compromised systems. It offers an advanced tool set that automates the development of per-program application security without requiring additional knowledge. // solvable:isvisible: 1 // solvable:order: 1030 Pattern::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); BOOST_CHECK_EQUAL(p->name(), "apparmor"); BOOST_CHECK_EQUAL(p->vendor(), "SUSE LINUX Products GmbH, Nuernberg, Germany"); BOOST_CHECK_EQUAL(p->category(), "Base Technologies"); BOOST_CHECK_EQUAL(p->summary(), "Novell AppArmor"); BOOST_CHECK_EQUAL(p->icon(), "pattern-apparmor"); BOOST_CHECK_EQUAL(p->userVisible(), true); BOOST_CHECK_EQUAL(p->isDefault(), false); } if ( s.ident() == "pattern:default" ) { c++; Pattern::Ptr p = asKind(makeResObject(s)); BOOST_CHECK(p); BOOST_CHECK_EQUAL(p->userVisible(), false); } } // check that we actually found all testeable // resolvables BOOST_CHECK_EQUAL(c, 2); } BOOST_AUTO_TEST_CASE(asStringTest) { BOOST_CHECK_EQUAL( sat::Solvable(0).asString(), "noSolvable" ); BOOST_CHECK_EQUAL( sat::Solvable(1).asString(), "systemSolvable" ); BOOST_CHECK_EQUAL( sat::Solvable(2).asString(), "product:openSUSE-11.1.x86_64" ); BOOST_CHECK_EQUAL( sat::Solvable(3693).asString(), "autoyast2-2.16.19-0.1.src" ); BOOST_CHECK_EQUAL( sat::Solvable(19222).asString(), "noSolvable" ); #if 0 Repository r = sat::Pool::instance().reposFind("update"); for_( it, r.solvablesBegin(), r.solvablesEnd() ) { BOOST_CHECK_EQUAL( (*it).asString(), str::numstring((*it).id()) ); } #endif } BOOST_AUTO_TEST_CASE(SplitIdent) { sat::Solvable::SplitIdent split; BOOST_CHECK_EQUAL( split.ident(), IdString() ); BOOST_CHECK_EQUAL( split.kind(), ResKind() ); BOOST_CHECK_EQUAL( split.name(), IdString() ); // - kind defaults to package // - package and srcpackage have NO namespaced ident. split = sat::Solvable::SplitIdent( "foo" ); BOOST_CHECK_EQUAL( split.ident(), "foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::package ); BOOST_CHECK_EQUAL( split.name(), "foo" ); split = sat::Solvable::SplitIdent( "nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::package ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( "package:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::package ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::pattern ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( "srcpackage:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); // !!! BOOST_CHECK_EQUAL( split.kind(), ResKind::srcpackage ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); // now split from kind,name // - kind spec in name wins! split = sat::Solvable::SplitIdent( ResKind::package, "nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::package ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::pattern, "nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::pattern ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::srcpackage, "nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::srcpackage ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::package, "package:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::package ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::pattern, "package:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::package ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::srcpackage, "package:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::package ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::package, "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::pattern ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::pattern, "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::pattern ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::srcpackage, "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "pattern:nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::pattern ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::package, "srcpackage:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::srcpackage ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::pattern, "srcpackage:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::srcpackage ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); split = sat::Solvable::SplitIdent( ResKind::srcpackage, "srcpackage:nokind:foo" ); BOOST_CHECK_EQUAL( split.ident(), "nokind:foo" ); BOOST_CHECK_EQUAL( split.kind(), ResKind::srcpackage ); BOOST_CHECK_EQUAL( split.name(), "nokind:foo" ); } BOOST_AUTO_TEST_CASE(duData) { DiskUsageCounter ducounter( DiskUsageCounter::justRootPartition() ); sat::Solvable s = *sat::WhatProvides( Capability("glibc-devel.x86_64 == 2.8.90-2.3") ).begin(); BOOST_CHECK_EQUAL( (*ducounter.disk_usage( s ).begin()).pkg_size, 30629 ); } libzypp-17.36.5/tests/sat/WhatObsoletes_test.cc000066400000000000000000000014561476576476200215060ustar00rootroot00000000000000#include "TestSetup.h" #include namespace zypp { namespace sat { // Obsoletes may either match against provides, or names. // Configuration depends on the behaviour of rpm. extern bool obsoleteUsesProvides; } } BOOST_AUTO_TEST_CASE(WhatObsoletes) { TestSetup test( Arch_x86_64 ); test.loadTestcaseRepos( TESTS_SRC_DIR"/data/TCWhatObsoletes" ); sat::Solvable test1( 2 ); BOOST_REQUIRE_EQUAL( test1.name(), "test1" ); { sat::obsoleteUsesProvides = true; sat::WhatObsoletes w( test1 ); BOOST_REQUIRE( w.size() == 2 ); // (3)goaway-1-1.i586(@System) // (5)meetoo-1-1.i586(@System) } { sat::obsoleteUsesProvides = false; sat::WhatObsoletes w( test1 ); BOOST_REQUIRE( w.size() == 1 ); // (3)goaway-1-1.i586(@System) } }libzypp-17.36.5/tests/sat/WhatProvides_test.cc000066400000000000000000000030461476576476200213370ustar00rootroot00000000000000#include "TestSetup.h" BOOST_AUTO_TEST_CASE(WhatProvides) { TestSetup test( Arch_x86_64 ); test.loadRepo( TESTS_SRC_DIR"/data/openSUSE-11.1" ); { sat::WhatProvides q( Capability("zypper") ); BOOST_CHECK( ! q.empty() ); BOOST_CHECK( q.size() == 1 ); } { sat::WhatProvides q( Capability("zypper.x86_64 == 0.12.5-1.1") ); BOOST_CHECK( ! q.empty() ); BOOST_CHECK( q.size() == 1 ); } { sat::WhatProvides q( Capability("zypper.i586 == 0.12.5-1.1") ); BOOST_CHECK( q.empty() ); BOOST_CHECK( q.size() == 0 ); } { // sat::WhatProvides::const_iterator requires proper // copyctor and assignment. If they break sat::WhatProvides q; BOOST_CHECK( q.begin() == q.begin() ); BOOST_CHECK( q.begin() == q.end() ); q = sat::WhatProvides( Capability("zypper.x86_64 == 0.12.5-1.1") ); // q no longer empty BOOST_CHECK( q.begin() == q.begin() ); BOOST_CHECK( q.begin() != q.end() ); sat::WhatProvides::const_iterator a; BOOST_CHECK( a == q.end() ); sat::WhatProvides::const_iterator b( q.begin() ); BOOST_CHECK( b == q.begin() ); // SEC << LABELED(q.begin()) << endl; // SEC << LABELED(q.end()) << endl; // SEC << LABELED(a) << endl; // SEC << LABELED(b) << endl; { a = q.begin(); BOOST_CHECK( a == q.begin() ); // SEC << LABELED(a) << endl; // SEC << LABELED(b) << endl; a = b; BOOST_CHECK( a == b ); // SEC << LABELED(a) << endl; // SEC << LABELED(b) << endl; } BOOST_CHECK( a == q.begin() ); } } libzypp-17.36.5/tests/zypp/000077500000000000000000000000001476576476200155625ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/Arch_test.cc000066400000000000000000000055101476576476200200060ustar00rootroot00000000000000// Arch.cc // // tests for Arch // #include #include #include #include #include // Boost.Test #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; /****************************************************************** ** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int ** ** DESCRIPTION : */ BOOST_AUTO_TEST_CASE(arch_test) { ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// BOOST_REQUIRE( Arch() == Arch_noarch ); BOOST_REQUIRE( Arch("") == Arch_empty ); BOOST_REQUIRE( ! Arch_noarch.empty() ); BOOST_REQUIRE( Arch_empty.empty() ); BOOST_REQUIRE( Arch_noarch.isBuiltIn() ); BOOST_REQUIRE( ! Arch_empty.isBuiltIn() ); BOOST_REQUIRE( Arch_empty != Arch_noarch ); ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// BOOST_CHECK_EQUAL( Arch("i386"), Arch_i386 ); BOOST_CHECK_EQUAL( Arch("i386").idStr(), "i386" ); BOOST_CHECK_EQUAL( Arch("i386").asString(), "i386" ); BOOST_REQUIRE( Arch_i386.isBuiltIn() ); BOOST_CHECK_EQUAL( Arch("FOO").idStr(), "FOO" ); BOOST_CHECK_EQUAL( Arch("FOO").asString(), "FOO" ); BOOST_REQUIRE( ! Arch("FOO").isBuiltIn() ); ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// BOOST_REQUIRE( Arch_noarch.compatibleWith( Arch_noarch ) ); BOOST_REQUIRE( Arch_noarch.compatibleWith( Arch_i386 ) ); BOOST_REQUIRE( Arch_noarch.compatibleWith( Arch_x86_64 ) ); BOOST_REQUIRE( ! Arch_i386.compatibleWith( Arch_noarch ) ); BOOST_REQUIRE( Arch_i386.compatibleWith( Arch_i386 ) ); BOOST_REQUIRE( Arch_i386.compatibleWith( Arch_x86_64 ) ); BOOST_REQUIRE( ! Arch_x86_64.compatibleWith( Arch_noarch ) ); BOOST_REQUIRE( ! Arch_x86_64.compatibleWith( Arch_i386 ) ); BOOST_REQUIRE( Arch_x86_64.compatibleWith( Arch_x86_64 ) ); BOOST_REQUIRE( Arch_x86_64.compatibleWith( Arch_x86_64_v4 ) ); ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// BOOST_CHECK_EQUAL( Arch::baseArch( Arch_x86_64_v4 ), Arch_x86_64 ); BOOST_CHECK_EQUAL( Arch::baseArch( Arch_x86_64 ), Arch_x86_64 ); BOOST_CHECK_EQUAL( Arch::baseArch( Arch_i686 ), Arch_i386 ); ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// BOOST_REQUIRE( Arch_i386.compare( Arch_noarch ) > 0 ); BOOST_REQUIRE( Arch_i386.compare( Arch_i386 ) == 0 ); BOOST_REQUIRE( Arch_i386.compare( Arch_x86_64 ) < 0 ); } libzypp-17.36.5/tests/zypp/CMakeLists.txt000066400000000000000000000030131476576476200203170ustar00rootroot00000000000000ADD_SUBDIRECTORY(base) ADD_TESTS( Arch Capabilities CheckSum ContentType CpeId Date DrunkenBishop Dup Digest Deltarpm Edition ExtendedPool FileChecker Flags GZStream InstanceId KeyRing Locale Locks PathInfo Pathname PluginFrame PoolQueryCC PoolQuery ProgressData PtrTypes PublicKey PurgeKernels RWPtr RepoManager RepoStatus ResKind Resolver ResStatus RpmPkgSigCheck Selectable SetRelationMixin SetTracker StrMatcher StringV Target Url UserData Vendor ) IF( NOT DISABLE_LIBPROXY ) FIND_PACKAGE(libproxy) IF ( NOT LIBPROXY_FOUND ) MESSAGE( FATAL_ERROR "libproxy not found" ) ELSE ( NOT LIBPROXY_FOUND ) include(CheckSymbolExists) # Check for function px_proxy_factory_free_proxies set( CMAKE_REQUIRED_INCLUDES ${LIBPROXY_INCLUDE_DIRS} ) set( CMAKE_REQUIRED_LIBRARIES ${LIBPROXY_LIBRARIES} ) check_symbol_exists(px_proxy_factory_free_proxies "proxy.h" LIBPROXY_HAVE_FREE_PROXIES) ADD_TESTS( Proxy ) if(LIBPROXY_HAVE_FREE_PROXIES) target_compile_definitions( Proxy_test PUBLIC LIBPROXY_HAVE_FREE_PROXIES ) endif() target_link_libraries( Proxy_test PUBLIC ${LIBPROXY_LIBRARIES} ) target_include_directories( Proxy_test PUBLIC ${LIBPROXY_INCLUDE_DIRS} ) ENDIF( NOT LIBPROXY_FOUND ) ENDIF() IF (ENABLE_ZCHUNK_COMPRESSION) ADD_TESTS ( ZChunk ) ENDIF(ENABLE_ZCHUNK_COMPRESSION) IF( NOT DISABLE_MEDIABACKEND_TESTS ) ADD_TESTS( Fetcher MediaSetAccess RepoInfo ) ENDIF() libzypp-17.36.5/tests/zypp/Capabilities_test.cc000066400000000000000000000203531476576476200215240ustar00rootroot00000000000000// Capabilities.cc // // tests for Capabilities // #include #include // Boost.Test #include #include "TestSetup.h" #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); BOOST_AUTO_TEST_CASE(capabilities_test) { ////////////////////////////////////////////////////////////////////// // Id 0 and 1 are nor equal, but share the same representation ""/NOCAP ////////////////////////////////////////////////////////////////////// Capability c0( 0 ); // id 0 Capability c1( 1 ); // id 1 Capability cD; // default constructed empty Capability cE( "" ); // empty BOOST_CHECK_EQUAL( c0.id(), 0 ); BOOST_CHECK_EQUAL( c1.id(), 1 ); BOOST_CHECK_EQUAL( Capability().id(), 1 ); // default constructed empty BOOST_CHECK_EQUAL( Capability("").id(), 1 ); // empty BOOST_CHECK_EQUAL( c0.asString(), "" ); BOOST_CHECK_EQUAL( c1.asString(), "" ); BOOST_CHECK_EQUAL( c0.empty(), true ); BOOST_CHECK_EQUAL( c1.empty(), true ); BOOST_CHECK_EQUAL( c0.detail().kind(), CapDetail::NOCAP ); BOOST_CHECK_EQUAL( c1.detail().kind(), CapDetail::NOCAP ); BOOST_CHECK_EQUAL( ( c0 == c1 ), false ); BOOST_CHECK_EQUAL( Capability::matches( c0, c1 ), CapMatch::yes ); ////////////////////////////////////////////////////////////////////// // skipping internal marker in Capabilities ////////////////////////////////////////////////////////////////////// Capability r( "req" ); Capability p( "prereq" ); sat::detail::IdType caps[10]; caps[0] = r.id(); caps[1] = sat::detail::solvablePrereqMarker; caps[2] = p.id(); caps[3] = 0; // Capabilities with and without prereq (skip marker in ++) Capabilities c( caps ); //cout << c << endl; BOOST_CHECK_EQUAL( c.size(), 2 ); Capabilities::const_iterator it( c.begin() ); BOOST_CHECK_EQUAL( *it, r ); BOOST_CHECK_EQUAL( it.tagged(), false ); ++it; BOOST_CHECK_EQUAL( *it, p ); BOOST_CHECK_EQUAL( it.tagged(), true ); // Capabilities with prereq only (skip marker in ctor) c = Capabilities( caps+1 ); //cout << c << endl; BOOST_CHECK_EQUAL( c.size(), 1 ); it = c.begin(); BOOST_CHECK_EQUAL( *it, p ); BOOST_CHECK_EQUAL( it.tagged(), true ); ////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////// Capability n( "na.me" ); Capability na( "na.me.i386" ); Capability noe( "na.me == 1" ); Capability naoe( "na.me.i386 == 1" ); BOOST_CHECK_EQUAL( n.detail().kind(), CapDetail::NAMED ); BOOST_CHECK_EQUAL( na.detail().kind(), CapDetail::NAMED ); BOOST_CHECK_EQUAL( noe.detail().kind(), CapDetail::VERSIONED ); BOOST_CHECK_EQUAL( naoe.detail().kind(), CapDetail::VERSIONED ); BOOST_CHECK_EQUAL( n.detail().hasArch(), false ); BOOST_CHECK_EQUAL( na.detail().hasArch(), true ); BOOST_CHECK_EQUAL( noe.detail().hasArch(), false ); BOOST_CHECK_EQUAL( naoe.detail().hasArch(), true ); BOOST_CHECK ( n.detail().arch().empty() ); BOOST_CHECK_EQUAL( na.detail().arch(), Arch_i386.idStr() ); BOOST_CHECK ( noe.detail().arch().empty() ); BOOST_CHECK_EQUAL( naoe.detail().arch(), Arch_i386.idStr() ); BOOST_CHECK_EQUAL( Capability( "", "na.me", "", "" ), n ); BOOST_CHECK_EQUAL( Capability( "i386", "na.me", "", "" ), na ); BOOST_CHECK_EQUAL( Capability( "", "na.me", "==", "1" ), noe ); BOOST_CHECK_EQUAL( Capability( "i386", "na.me", "==", "1" ), naoe ); // explicit arch BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me" ), na ); BOOST_CHECK_EQUAL( Capability( Arch_i386, "na.me == 1" ), naoe ); } BOOST_AUTO_TEST_CASE(guessPackageSpec) { BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "" ), Capability( "", "", "", "" ) ); // Remember: 'name OP ver-rel': name may match provides // 'name-ver-rel': name may match package names only // With no libzypp in the pool, no guess should succeed: BOOST_REQUIRE( sat::WhatProvides(Capability("libzypp")).empty() ); // these must be guessed BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2" ), Capability( "", "libzypp-1-2", "", "" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2.i586" ), Capability( "i586", "libzypp-1-2", "", "" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2" ), Capability( "", "libzypp.i586-1-2", "", "" ) ); // these are unambiguous BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "patch:swmgmt=12" ), Capability( "", "swmgmt", "=", "12", ResKind::patch ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp=0:1.0.2-2" ), Capability( "", "libzypp", "=", "0:1.0.2-2" ) ); // now load some repo providing libzypp and see how the guessing changes: test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" ); BOOST_REQUIRE( ! sat::WhatProvides(Capability("libzypp")).empty() ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2" ), Capability( "", "libzypp", "=", "1-2" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-1-2.i586" ), Capability( "i586", "libzypp", "=", "1-2" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2" ), Capability( "i586", "libzypp", "=", "1-2" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp<=1.0.2-2" ), Capability( "", "libzypp", "<=", "1.0.2-2" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp<=1:1.0.2-2" ), Capability( "", "libzypp", "<=", "1:1.0.2-2" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp-0:1.0.2-2" ), Capability( "", "libzypp", "=", "0:1.0.2-2" ) ); // now with yast2-packagemanager which is just a provides. Guess must not lead to libzypp. BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager-1-2" ), Capability( "", "yast2-packagemanager-1-2", "", "" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager-1-2.i586" ), Capability( "i586", "yast2-packagemanager-1-2", "", "" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager.i586-1-2" ), Capability( "", "yast2-packagemanager.i586-1-2","", "" ) ); // these are unambiguous BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager<=1.0.2-2" ), Capability( "", "yast2-packagemanager", "<=", "1.0.2-2" ) ); BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "yast2-packagemanager<=1:1.0.2-2" ), Capability( "", "yast2-packagemanager", "<=", "1:1.0.2-2" ) ); // Double arch spec: the trailing one succeeds, the other one gets part of the name. // As "libzypp.i586' is not in the pool, guessing fails. Result is a named cap. BOOST_CHECK_EQUAL( Capability::guessPackageSpec( "libzypp.i586-1-2.ppc" ), Capability( "ppc", "libzypp.i586-1-2", "", "" ) ); // Now check prepended kind specs. Capability cap( "package:libzypp=1-2" ); BOOST_CHECK_EQUAL( cap, Capability( "", "libzypp", "=", "1-2", ResKind::package ) ); BOOST_CHECK_EQUAL( cap, Capability( "", "package:libzypp", "=", "1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability( "", "package:libzypp", "=", "1-2", ResKind::pattern ) ); // known name prefix wins // 'package:' is the default BOOST_CHECK_EQUAL( cap, Capability( "libzypp=1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability( "", "libzypp", "=", "1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "package:libzypp-1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "package:libzypp=1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "libzypp-1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "libzypp=1-2" ) ); cap = Capability( "pattern:32bit=1-2" ); BOOST_CHECK_EQUAL( cap, Capability( "", "32bit", "=", "1-2", ResKind::pattern ) ); BOOST_CHECK_EQUAL( cap, Capability( "", "pattern:32bit", "=", "1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability( "", "pattern:32bit", "=", "1-2", ResKind::package ) ); // known name prefix wins BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit-1-2" ) ); BOOST_CHECK_EQUAL( cap, Capability::guessPackageSpec( "pattern:32bit=1-2" ) ); } libzypp-17.36.5/tests/zypp/CheckSum_test.cc000066400000000000000000000043361476576476200206400ustar00rootroot00000000000000#include #include #include // Boost.Test #include #include #include #include #include #include using boost::unit_test::test_case; using namespace zypp; using namespace std::string_literals; void chksumtest( const std::string & type_r, const std::string & sum_r ) { BOOST_CHECK_EQUAL( type_r, CheckSum( sum_r ).type() ); // autodetect type BOOST_CHECK_EQUAL( type_r, CheckSum( type_r, sum_r ).type() ); BOOST_CHECK_EQUAL( sum_r, Digest::digest( type_r, "" ) ); for ( const std::string & t : { "md5"s, "sha1"s, "sha224"s, "sha256"s, "sha384"s, "sha512"s, } ) { if ( t != type_r ) { BOOST_CHECK_THROW( CheckSum( t, sum_r ), Exception ); // wrong type/size } } } // most frequently you implement test cases as a free functions BOOST_AUTO_TEST_CASE(checksum_test) { CheckSum e; BOOST_CHECK( e.empty() ); BOOST_CHECK( e.type().empty() ); BOOST_CHECK( e.checksum().empty() ); // sum for "" // md5 32 d41d8cd98f00b204e9800998ecf8427e // 1 40 da39a3ee5e6b4b0d3255bfef95601890afd80709 // 224 56 d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f // 256 64 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 // 384 96 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b // 512 128 cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e chksumtest( CheckSum::md5Type(), "d41d8cd98f00b204e9800998ecf8427e" ); chksumtest( CheckSum::sha1Type(), "da39a3ee5e6b4b0d3255bfef95601890afd80709" ); chksumtest( CheckSum::sha224Type(), "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f" ); chksumtest( CheckSum::sha256Type(), "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ); chksumtest( CheckSum::sha384Type(), "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b" ); chksumtest( CheckSum::sha512Type(), "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" ); } libzypp-17.36.5/tests/zypp/ContentType_test.cc000066400000000000000000000035671476576476200214170ustar00rootroot00000000000000#include #include #include #include using std::cout; using std::endl; using zypp::ContentType; BOOST_AUTO_TEST_CASE(contenttype_default) { ContentType v; BOOST_CHECK( !v ); BOOST_CHECK( v.empty() ); BOOST_CHECK( v.emptyType() ); BOOST_CHECK( v.emptySubtype() ); ContentType w( "/" ); BOOST_CHECK_EQUAL( v == w, true ); BOOST_CHECK_EQUAL( v != w, false ); BOOST_CHECK_EQUAL( v < w, false ); BOOST_CHECK_EQUAL( v <= w, true ); BOOST_CHECK_EQUAL( v > w, false ); BOOST_CHECK_EQUAL( v >= w, true ); BOOST_CHECK_EQUAL( v.asString(), "" ); } BOOST_AUTO_TEST_CASE(contenttype_val) { BOOST_CHECK_THROW( ContentType( " " ), std::invalid_argument ); BOOST_CHECK_THROW( ContentType( "//" ), std::invalid_argument ); BOOST_CHECK_THROW( ContentType( "/ " ), std::invalid_argument ); BOOST_CHECK_THROW( ContentType( "/", "a" ), std::invalid_argument ); BOOST_CHECK_THROW( ContentType( "a", "/" ), std::invalid_argument ); BOOST_CHECK_THROW( ContentType( " ", "a" ), std::invalid_argument ); BOOST_CHECK_THROW( ContentType( "a", " " ), std::invalid_argument ); } BOOST_AUTO_TEST_CASE(contenttype_cmp) { std::set c( { ContentType( "" ), ContentType( "/" ), // == "" ContentType( "a" ), ContentType( "a/" ), // == "a" ContentType( "/a" ), ContentType( "" , "a" ), // == "/a" ContentType( "a/b" ), ContentType( "b/b" ), ContentType( "b/c" ) }); std::set::const_iterator i = c.begin(); BOOST_CHECK_EQUAL( *(i++), ContentType() ); BOOST_CHECK_EQUAL( *(i++), ContentType( "", "a" ) ); BOOST_CHECK_EQUAL( *(i++), ContentType( "a", "" ) ); BOOST_CHECK_EQUAL( *(i++), ContentType( "a", "b" ) ); BOOST_CHECK_EQUAL( *(i++), ContentType( "b", "b" ) ); BOOST_CHECK_EQUAL( *(i++), ContentType( "b", "c" ) ); BOOST_CHECK( i == c.end() ); } libzypp-17.36.5/tests/zypp/CpeId_test.cc000066400000000000000000000416661476576476200201310ustar00rootroot00000000000000#include #include #include using std::cout; using std::endl; using zypp::SetCompare; using zypp::SetRelation; using zypp::CpeId; typedef CpeId::Value Value; /////////////////////////////////////////////////////////////////// /// Symmetric attribute compare if wildcards are involved! /// The specs define any comarison with a wildcarded attribute as /// target to return \c uncomparable: /// \code /// wildcardfree <=> wildcarded ==> uncomparable, /// wildcarded <=> wildcardfree ==> superset or disjoint /// \endcode /// But a symmetric result is much more intuitive: /// \code /// wildcardfree <=> wildcarded ==> subset or disjoint /// wildcarded <=> wildcardfree ==> superset or disjoint /// \endcode /////////////////////////////////////////////////////////////////// #define WFN_STRICT_SPEC 0 #define defVALUE(N,S) \ const std::string N##Str( S ); \ Value N( N##Str ); defVALUE( wildcardfree, "STrv\\*al\\?" ); // '\?' quoted? const std::string wildcardfreeUri( "STrv%2aal%3f" ); const std::string wildcardfreeFs( "STrv\\*al\\?" ); defVALUE( wildcardfree2, "stRV\\*al\\\\\\?" ); // '\\\?' backslash, quoted? defVALUE( wildcarded, "strv\\*AL?" ); // '?' ? const std::string wildcardedUri( "strv%2aAL%01" ); const std::string wildcardedFs( "strv\\*AL?" ); defVALUE( wildcarded2, "strv\\*AL\\\\?" ); // '\\?' backslash, ? BOOST_AUTO_TEST_CASE(cpeid_value_ANY) { for ( const auto & c : { Value(), Value(nullptr), Value("*"), Value::ANY } ) { BOOST_CHECK( c.isANY() ); BOOST_CHECK( ! c.isNA() ); BOOST_CHECK( c.isLogical() ); BOOST_CHECK( ! c.isString() ); BOOST_CHECK( c == Value::ANY ); BOOST_CHECK( c == nullptr ); // ANY BOOST_CHECK( c != Value::NA ); BOOST_CHECK( c != wildcardfree ); BOOST_CHECK( c != wildcarded ); BOOST_CHECK( ! c.isWildcardfree() ); BOOST_CHECK( ! c.isWildcarded() ); BOOST_CHECK_EQUAL( c.asFs(), "*" ); BOOST_CHECK_EQUAL( c.asUri(), "" ); BOOST_CHECK_EQUAL( c.asWfn(), "*" ); BOOST_CHECK_EQUAL( c.asString(), c.asWfn() ); } } BOOST_AUTO_TEST_CASE(cpeid_value_NA) { for ( const auto & c : { Value(""), Value::NA } ) { BOOST_CHECK( ! c.isANY() ); BOOST_CHECK( c.isNA() ); BOOST_CHECK( c.isLogical() ); BOOST_CHECK( ! c.isString() ); BOOST_CHECK( c != Value::ANY ); BOOST_CHECK( c == Value::NA ); BOOST_CHECK( c == std::string() ); // NA BOOST_CHECK( c == "" ); // NA BOOST_CHECK( c != wildcardfree ); BOOST_CHECK( c != wildcarded ); BOOST_CHECK( ! c.isWildcardfree() ); BOOST_CHECK( ! c.isWildcarded() ); BOOST_CHECK_EQUAL( c.asFs(), "-" ); BOOST_CHECK_EQUAL( c.asUri(), "-" ); BOOST_CHECK_EQUAL( c.asWfn(), "" ); BOOST_CHECK_EQUAL( c.asString(), c.asWfn() ); } } BOOST_AUTO_TEST_CASE(cpeid_value_string_wildcardfree) { for ( const auto & c : { wildcardfree } ) { BOOST_CHECK( ! c.isANY() ); BOOST_CHECK( ! c.isNA() ); BOOST_CHECK( ! c.isLogical() ); BOOST_CHECK( c.isString() ); BOOST_CHECK( c != Value::ANY ); BOOST_CHECK( c != Value::NA ); BOOST_CHECK( c == wildcardfree ); BOOST_CHECK( c == wildcardfreeStr ); BOOST_CHECK( c == wildcardfreeStr.c_str() ); BOOST_CHECK( c != wildcarded ); BOOST_CHECK( c.isWildcardfree() ); BOOST_CHECK( ! c.isWildcarded() ); BOOST_CHECK_EQUAL( c.asFs(), wildcardfreeFs ); BOOST_CHECK_EQUAL( c.asUri(), wildcardfreeUri ); BOOST_CHECK_EQUAL( c.asWfn(), wildcardfreeStr ); BOOST_CHECK_EQUAL( c.asString(), c.asWfn() ); } BOOST_CHECK( wildcardfree2 == wildcardfree2 ); BOOST_CHECK( wildcardfree2 != wildcardfree ); BOOST_CHECK( wildcardfree2 != wildcarded ); BOOST_CHECK( wildcardfree2.isWildcardfree() ); BOOST_CHECK( ! wildcardfree2.isWildcarded() ); } BOOST_AUTO_TEST_CASE(cpeid_value_string_wildcarded) { for ( const auto & c : { wildcarded } ) { BOOST_CHECK( ! c.isANY() ); BOOST_CHECK( ! c.isNA() ); BOOST_CHECK( ! c.isLogical() ); BOOST_CHECK( c.isString() ); BOOST_CHECK( c != Value::ANY ); BOOST_CHECK( c != Value::NA ); BOOST_CHECK( c != wildcardfree ); #if WFN_STRICT_SPEC BOOST_CHECK( c != wildcarded ); // !!! According to the CPE Name Matching Specification Version 2.3 // unquoted wildcard characters yield an undefined result (not ==). #else BOOST_CHECK( c == wildcarded ); #endif BOOST_CHECK( ! c.isWildcardfree() ); BOOST_CHECK( c.isWildcarded() ); BOOST_CHECK_EQUAL( c.asFs(), wildcardedFs ); BOOST_CHECK_EQUAL( c.asUri(), wildcardedUri ); BOOST_CHECK_EQUAL( c.asWfn(), wildcardedStr ); BOOST_CHECK_EQUAL( c.asString(), c.asWfn() ); } #if WFN_STRICT_SPEC BOOST_CHECK( wildcarded2 != wildcarded2 ); // unquoted wildcard characters yield an undefined result (not ==). #else BOOST_CHECK( wildcarded2 == wildcarded2 ); #endif BOOST_CHECK( wildcarded2 != wildcardfree ); BOOST_CHECK( wildcarded2 != wildcarded ); BOOST_CHECK( ! wildcarded2.isWildcardfree() ); BOOST_CHECK( wildcarded2.isWildcarded() ); } BOOST_AUTO_TEST_CASE(cpeid_value_valid) { static const char *const hdig = "0123456789abcdef"; for ( char ch = 0; ch < CHAR_MAX; ++ch ) { // cout << "==== " << unsigned(ch) << endl; char qchstr[] = { '\\', ch, '\0' }; std::string chstr( qchstr+1 ); char pchstr[] = { '%', hdig[(unsigned char)(ch)/16], hdig[(unsigned char)(ch)%16], '\0' }; if ( ch == '\0' ) { BOOST_CHECK( Value( chstr ).isNA() ); BOOST_CHECK_THROW( (Value( chstr, Value::fsFormat )), std::invalid_argument ); BOOST_CHECK( Value( chstr, Value::uriFormat ).isANY() ); } else if ( ch <= ' ' || '~' < ch ) { BOOST_CHECK_THROW( (Value( chstr )), std::invalid_argument ); BOOST_CHECK_THROW( (Value( chstr, Value::fsFormat )), std::invalid_argument ); BOOST_CHECK_THROW( (Value( chstr, Value::uriFormat )), std::invalid_argument ); } else if ( ( '0' <= ch && ch <= '9' ) || ( 'A' <= ch && ch <= 'Z' ) || ( 'a' <= ch && ch <= 'z' ) || ch == '_' ) { BOOST_CHECK( Value( chstr ).isString() ); BOOST_CHECK( Value( chstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( chstr, Value::uriFormat ).isString() ); BOOST_CHECK_THROW( (Value( qchstr )), std::invalid_argument ); BOOST_CHECK( Value( qchstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( qchstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( pchstr, Value::uriFormat ).isString() ); } else if ( ch == '*' ) { BOOST_CHECK( Value( chstr ).isANY() ); BOOST_CHECK( Value( chstr, Value::fsFormat ).isANY() ); BOOST_CHECK( Value( chstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( qchstr ).isString() ); BOOST_CHECK( Value( qchstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( qchstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( pchstr, Value::uriFormat ).isString() ); } else if ( ch == '?' ) { BOOST_CHECK( Value( chstr ).isString() ); BOOST_CHECK( Value( chstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( chstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( qchstr ).isString() ); BOOST_CHECK( Value( qchstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( qchstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( pchstr, Value::uriFormat ).isString() ); } else if ( ch == '-' ) { BOOST_CHECK_THROW( (Value( chstr )), std::invalid_argument ); BOOST_CHECK( Value( chstr, Value::fsFormat ).isNA() ); BOOST_CHECK( Value( chstr, Value::uriFormat ).isNA() ); BOOST_CHECK_THROW( (Value( qchstr )), std::invalid_argument ); BOOST_CHECK( Value( qchstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( qchstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( pchstr, Value::uriFormat ).isString() ); } else if ( ch == '\\' ) { BOOST_CHECK_THROW( (Value( chstr )), std::invalid_argument ); BOOST_CHECK_THROW( (Value( chstr, Value::fsFormat )), std::invalid_argument ); BOOST_CHECK( (Value( chstr, Value::uriFormat )).isString() ); BOOST_CHECK( Value( qchstr ).isString() ); BOOST_CHECK( Value( qchstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( qchstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( pchstr, Value::uriFormat ).isString() ); } else { BOOST_CHECK_THROW( (Value( chstr )), std::invalid_argument ); Value f( chstr, Value::fsFormat ); BOOST_CHECK( f.isString() ); Value u( chstr, Value::uriFormat ); BOOST_CHECK( u.isString() ); BOOST_CHECK_EQUAL( f.asString(), u.asString() ); if ( ch == '.' ) { BOOST_CHECK_EQUAL( f.asFs(), chstr ); BOOST_CHECK_EQUAL( f.asUri(), chstr ); } else { BOOST_CHECK_EQUAL( f.asFs(), qchstr ); BOOST_CHECK_EQUAL( f.asUri(), pchstr ); } BOOST_CHECK( Value( qchstr ).isString() ); BOOST_CHECK( Value( qchstr, Value::fsFormat ).isString() ); BOOST_CHECK( Value( qchstr, Value::uriFormat ).isString() ); BOOST_CHECK( Value( pchstr, Value::uriFormat ).isString() ); } } BOOST_CHECK_THROW( Value( "\\!\\a\\-\\_\\.\\!" ), std::invalid_argument ); BOOST_CHECK_EQUAL( Value( "\\!\\a\\-\\_\\.\\!", Value::fsFormat ).asFs(), "\\!a-_.\\!" ); } BOOST_AUTO_TEST_CASE(cpeid_type_checks) { for ( const auto & c : { Value::ANY, Value::NA, wildcardfree, wildcarded } ) { BOOST_CHECK_EQUAL( c.isANY(), c.type() == Value::Type::ANY ); BOOST_CHECK_EQUAL( c.isNA(), c.type() == Value::Type::NA ); BOOST_CHECK_EQUAL( c.isWildcardfree(), c.type() == Value::Type::wildcardfree ); BOOST_CHECK_EQUAL( c.isWildcarded(), c.type() == Value::Type::wildcarded ); BOOST_CHECK_EQUAL( c.isLogical(), c.isLogical( c.type() ) ); BOOST_CHECK_EQUAL( c.isString(), c.isString( c.type() ) ); BOOST_CHECK_EQUAL( c.isLogical(), ! c.isString() ); } } BOOST_AUTO_TEST_CASE(cpeid_compare) { BOOST_CHECK( compare( Value::ANY, Value::ANY, SetCompare::equal ) ); BOOST_CHECK( compare( Value::ANY, Value::NA, SetCompare::properSuperset ) ); BOOST_CHECK( compare( Value::ANY, wildcardfree, SetCompare::properSuperset ) ); #if WFN_STRICT_SPEC BOOST_CHECK( compare( Value::ANY, wildcarded, SetCompare::uncomparable ) ); #else BOOST_CHECK( compare( Value::ANY, wildcarded, SetCompare::properSuperset ) ); #endif BOOST_CHECK( compare( Value::NA, Value::ANY, SetCompare::properSubset ) ); BOOST_CHECK( compare( Value::NA, Value::NA, SetCompare::equal ) ); BOOST_CHECK( compare( Value::NA, wildcardfree, SetCompare::disjoint ) ); #if WFN_STRICT_SPEC BOOST_CHECK( compare( Value::NA, wildcarded, SetCompare::uncomparable ) ); #else BOOST_CHECK( compare( Value::NA, wildcarded, SetCompare::disjoint ) ); #endif BOOST_CHECK( compare( wildcardfree, Value::ANY, SetCompare::properSubset ) ); BOOST_CHECK( compare( wildcardfree, Value::NA, SetCompare::disjoint ) ); //BOOST_CHECK( compare( wildcardfree, wildcardfree, kNeedsCloserLook, // equal or disjoint BOOST_CHECK( compare( wildcardfree, wildcardfree, SetCompare::equal ) ); BOOST_CHECK( compare( wildcardfree, wildcardfree2, SetCompare::disjoint ) ); #if WFN_STRICT_SPEC BOOST_CHECK( compare( wildcardfree, wildcarded, SetCompare::uncomparable ) ); #else //BOOST_CHECK( compare( wildcardfree, wildcarded, kNeedsCloserLook, // subset or disjoint BOOST_CHECK( compare( wildcardfree, wildcarded, SetCompare::properSubset ) ); BOOST_CHECK( compare( wildcardfree, wildcarded2, SetCompare::disjoint ) ); #endif BOOST_CHECK( compare( wildcarded, Value::ANY, SetCompare::properSubset ) ); BOOST_CHECK( compare( wildcarded, Value::NA, SetCompare::disjoint ) ); //BOOST_CHECK( compare( wildcarded, wildcardfree, kNeedsCloserLook, // superset or disjoint BOOST_CHECK( compare( wildcarded, wildcardfree, SetCompare::properSuperset ) ); BOOST_CHECK( compare( wildcarded, wildcardfree2, SetCompare::disjoint ) ); #if WFN_STRICT_SPEC BOOST_CHECK( compare( wildcarded, wildcarded, SetCompare::uncomparable ) ); #else //BOOST_CHECK( compare( wildcarded, wildcarded, kNeedsCloserLook, // equal or uncomparable BOOST_CHECK( compare( wildcarded, wildcarded, SetCompare::equal ) ); BOOST_CHECK( compare( wildcarded, wildcarded2, SetCompare::uncomparable ) ); #endif } BOOST_AUTO_TEST_CASE(cpeid_value_string_wildcard) { for ( const auto & c : { Value( "a" ), Value( "\\*" ), Value( "\\?" ) } ) { BOOST_CHECK( c.isWildcardfree() ); BOOST_CHECK( !c.isWildcarded() ); } for ( const auto & c : { Value( "*\\*" ), Value( "\\**" ), Value( "?" ), Value( "??\\?" ), Value( "\\???" ) } ) { BOOST_CHECK( !c.isWildcardfree() ); BOOST_CHECK( c.isWildcarded() ); } } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(cpeid_basics) { BOOST_CHECK_THROW( CpeId( "malformed" ), std::invalid_argument ); CpeId none( "malformed", CpeId::noThrow ); BOOST_CHECK_EQUAL( CpeId::NoThrowType::lastMalformed, "malformed" ); CpeId( "", CpeId::noThrow ); BOOST_CHECK_EQUAL( CpeId::NoThrowType::lastMalformed, "" ); for ( const auto & c : { CpeId(), CpeId( nullptr ), CpeId( "" ), CpeId( std::string() ), CpeId( "cpe:2.3:" ), CpeId( "cpe:/" ) } ) { BOOST_CHECK( ! c ); // evaluate false in boolean context BOOST_CHECK_EQUAL( c.asString(), c.asFs() ); BOOST_CHECK_EQUAL( c.asFs(), "cpe:2.3:*:*:*:*:*:*:*:*:*:*:*" ); BOOST_CHECK_EQUAL( c.asUri(), "cpe:/" ); BOOST_CHECK_EQUAL( c.asWfn(), "wfn:[]" ); BOOST_CHECK_EQUAL( c, none ); // matching!! } for ( const auto & c : { CpeId( "cpe:/o:sle" ), CpeId( "cpe:/o:*" ) } ) { BOOST_CHECK( c ); // evaluate true in boolean context BOOST_CHECK( ! c.asString().empty() );// empty string rep BOOST_CHECK_EQUAL( c, c ); // matching!! } } void testStrconv( const std::string & fs, const std::string & uri, const std::string & wfn ) { CpeId fromFS( fs ) ; CpeId fromURI( uri ); BOOST_CHECK_EQUAL( fromFS, fromURI ); for ( const auto & c : { fromFS, fromURI } ) { BOOST_CHECK_EQUAL( c.asFs(), fs ); BOOST_CHECK_EQUAL( c.asUri(), uri ); BOOST_CHECK_EQUAL( c.asWfn(), wfn ); } } BOOST_AUTO_TEST_CASE(cpeid_strconv) { // colon embedded in product value testStrconv ( "cpe:2.3:a:opensuse:lib\\:zypp:14.16.0:beta:*:*:*:*:*:-", "cpe:/a:opensuse:lib%3azypp:14.16.0:beta:~~~~~-", "wfn:[part=\"a\",vendor=\"opensuse\",product=\"lib\\:zypp\",version=\"14\\.16\\.0\",update=\"beta\",other=NA]" ); testStrconv ( "cpe:2.3:a:hp:insight_diagnostics:7.4.0.1570:-:*:*:online:win2003:x64:*", "cpe:/a:hp:insight_diagnostics:7.4.0.1570:-:~~online~win2003~x64~", "wfn:[part=\"a\",vendor=\"hp\",product=\"insight_diagnostics\",version=\"7\\.4\\.0\\.1570\",update=NA,sw_edition=\"online\",target_sw=\"win2003\",target_hw=\"x64\"]" ); testStrconv ( "cpe:2.3:a:hp:openview_network_manager:7.51:*:*:*:*:linux:*:*", "cpe:/a:hp:openview_network_manager:7.51::~~~linux~~", "wfn:[part=\"a\",vendor=\"hp\",product=\"openview_network_manager\",version=\"7\\.51\",target_sw=\"linux\"]" ); testStrconv ( "cpe:2.3:a:foo\\\\bar:big\\$money_manager_2010:*:*:*:*:special:ipod_touch:80gb:*", "cpe:/a:foo%5cbar:big%24money_manager_2010:::~~special~ipod_touch~80gb~", "wfn:[part=\"a\",vendor=\"foo\\\\bar\",product=\"big\\$money_manager_2010\",sw_edition=\"special\",target_sw=\"ipod_touch\",target_hw=\"80gb\"]" ); BOOST_CHECK_THROW( (CpeId( "cpe:/x:" )), std::invalid_argument ); // illegal part 'x' BOOST_CHECK_THROW( CpeId( "cpe:/a:foo%5cbar:big%24money_2010%07:::~~special~ipod_touch~80gb~" ), std::invalid_argument ); // illegal %07 BOOST_CHECK_EQUAL( CpeId( "cpe:/a:foo~bar:big%7emoney_2010" ).asUri(), "cpe:/a:foo%7ebar:big%7emoney_2010" ); // unescaped ~ is ok but not preferred } BOOST_AUTO_TEST_CASE(cpeid_matches) { CpeId sle( "cpe:/o:sles" ); CpeId win( "cpe:/o:windows" ); CpeId any; CpeId ons( "cpe:2.3:o:??????s" ); CpeId oops( "cpe:2.3:o:?????s" ); BOOST_CHECK_EQUAL( compare( sle, win ), SetRelation::disjoint ); BOOST_CHECK_EQUAL( compare( sle, any ), SetRelation::subset ); BOOST_CHECK_EQUAL( compare( win, any ), SetRelation::subset ); BOOST_CHECK_EQUAL( compare( any, sle ), SetRelation::superset ); BOOST_CHECK_EQUAL( compare( any, win ), SetRelation::superset ); #if WFN_STRICT_SPEC BOOST_CHECK_EQUAL( compare( sle, ons ), SetRelation::uncomparable ); BOOST_CHECK_EQUAL( compare( win, ons ), SetRelation::uncomparable ); #else BOOST_CHECK_EQUAL( compare( sle, ons ), SetRelation::subset ); BOOST_CHECK_EQUAL( compare( win, ons ), SetRelation::subset ); #endif BOOST_CHECK_EQUAL( compare( ons, sle ), SetRelation::superset ); BOOST_CHECK_EQUAL( compare( ons, win ), SetRelation::superset ); BOOST_CHECK_EQUAL( compare( oops, sle ), SetRelation::superset ); BOOST_CHECK_EQUAL( compare( oops, win ), SetRelation::disjoint ); } libzypp-17.36.5/tests/zypp/Date_test.cc000066400000000000000000000003721476576476200200070ustar00rootroot00000000000000#include #include BOOST_AUTO_TEST_CASE(date_test) { std::string format = "%Y-%m-%d %H:%M:%S"; std::string date = "2009-02-14 00:31:30"; BOOST_CHECK_EQUAL(zypp::Date(date,format).form(format), date); } libzypp-17.36.5/tests/zypp/Deltarpm_test.cc000066400000000000000000000040621476576476200207020ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "KeyRingTestReceiver.h" using boost::unit_test::test_case; using std::cout; using std::endl; using namespace zypp; using namespace zypp::repo; using namespace zypp::filesystem; #define TEST_DIR TESTS_SRC_DIR "/zypp/data/Delta" BOOST_AUTO_TEST_CASE(delta) { KeyRing::setDefaultAccept( KeyRing::ACCEPT_UNKNOWNKEY | KeyRing::ACCEPT_UNSIGNED_FILE ); TmpDir rootdir; RepoManager rm( RepoManagerOptions::makeTestSetup( rootdir ) ); RepoInfo updates; updates.setAlias("updates"); updates.addBaseUrl( Pathname(TEST_DIR).asUrl() ); try { rm.buildCache(updates); rm.loadFromCache(updates); } catch (const Exception & e) { BOOST_FAIL( std::string("Problem getting the data: ")+ e.msg()) ; } sat::Pool pool(sat::Pool::instance()); repo::DeltaCandidates dc(std::list(pool.reposBegin(),pool.reposEnd()), "libzypp"); std::list deltas = dc.deltaRpms(0); for_ (it,deltas.begin(),deltas.end()) { BOOST_CHECK(it->name() == "libzypp"); BOOST_CHECK(it->edition() == Edition("4.21.3-2")); BOOST_CHECK(it->arch() == "i386"); BOOST_CHECK(it->baseversion().edition().match(Edition("4.21.3-1")) ||it->baseversion().edition().match(Edition("4.21.2-3"))); cout << it->name() << " - " << it->edition() << " - " << it->arch() << " base: " << it->baseversion().edition() << endl; cout << (it->edition() == "4.21.3-2") << endl; // fine cout << (it->edition() == Edition("4.21.3-2")) << endl; // fine cout << (it->edition().match(Edition("4.21.3-2")) == 0) << endl; // match returns -1,0,1 cout << (it->edition().match("4.21.3-2") == 0) << endl; // match returns -1,0,1 } } libzypp-17.36.5/tests/zypp/Digest_test.cc000066400000000000000000000016441476576476200203540ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include using boost::unit_test::test_case; using namespace zypp; using namespace zypp::filesystem; /** * Test case for * static std::string digest(const std::string& name, std::istream& is, size_t bufsize = 4096); */ BOOST_AUTO_TEST_CASE(digest) { std::string data("I will test the checksum of this"); std::stringstream str1(data); std::stringstream str2(data); std::stringstream str3(data); BOOST_CHECK_EQUAL( Digest::digest( "sha1", str1 ), "142df4277c326f3549520478c188cab6e3b5d042" ); BOOST_CHECK_EQUAL( Digest::digest( "md5", str2 ), "f139a810b84d82d1f29fc53c5e59beae" ); // FIXME i think it should throw BOOST_CHECK_EQUAL( Digest::digest( "lalala", str3) , "" ); } libzypp-17.36.5/tests/zypp/DrunkenBishop_test.cc000066400000000000000000000062321476576476200217060ustar00rootroot00000000000000#include #include #include using boost::unit_test::test_case; using namespace zypp; using base::DrunkenBishop; BOOST_AUTO_TEST_CASE(drunkenbishop) { { DrunkenBishop b; BOOST_CHECK_EQUAL( b.asString(), "++\n" "++" ); } { DrunkenBishop b( "94", 0, 0 ); BOOST_CHECK_EQUAL( b.asString(), "+-+\n" "|E|\n" "+-+" ); } { BOOST_CHECK_THROW( DrunkenBishop( "9g" ), std::invalid_argument ); } { DrunkenBishop b( "" ); BOOST_CHECK_EQUAL( b.asString(), "+-----------------+\n" "| |\n" "| |\n" "| |\n" "| |\n" "| E |\n" "| |\n" "| |\n" "| |\n" "| |\n" "+-----------------+" ); } { DrunkenBishop b( "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC", "Title" ); BOOST_CHECK_EQUAL( b.asString(), "+-----[Title]-----+\n" "| |\n" "| |\n" "| |\n" "| ^ |\n" "| E |\n" "| |\n" "| |\n" "| |\n" "| |\n" "+---[CCCCCCCC]----+" ); } { DrunkenBishop b( "9c6fb17fa201ad829d808739379a2a51", "very very long Title" ); BOOST_CHECK_EQUAL( b.asString(), "+[very very long ]+\n" "| |\n" "| |\n" "| |\n" "| E+ . o |\n" "| .= = S o |\n" "|. * = . + o |\n" "| .o . + . = |\n" "|.. . . o. . |\n" "|o ...o |\n" "+---[379A2A51]----+" ); } { DrunkenBishop b( "4E98E67519D98DC7362A5990E3A5C360307E3D54" ); BOOST_CHECK_EQUAL( b.asString(), "+-------------------+\n" "| ^. .^E |\n" "| . .^^: . |\n" "| ...:^? : |\n" "| . ?.: i |\n" "| ^ i : . |\n" "| : S l . |\n" "| ^ : . . |\n" "| . . |\n" "| |\n" "| |\n" "| |\n" "+----[307E3D54]-----+" ); } } libzypp-17.36.5/tests/zypp/Dup_test.cc000066400000000000000000000035451476576476200176670ustar00rootroot00000000000000#include "TestSetup.h" #include #include #include #include #define BOOST_TEST_MODULE Dup ///////////////////////////////////////////////////////////////////////////// static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); test.loadTestcaseRepos( TESTS_SRC_DIR"/data/TCdup" ); dumpRange( USR, test.pool().knownRepositoriesBegin(), test.pool().knownRepositoriesEnd() ) << endl; } ~TestInit() { test.reset(); } }; template std::ostream & vdumpPoolStats( std::ostream & str, TIterator begin_r, TIterator end_r ) { pool::PoolStats stats; for_( it, begin_r, end_r ) { str << *it << endl; stats( *it ); } return str << stats; } bool upgrade( ) { bool rres = false; { rres = getZYpp()->resolver()->doUpgrade(); } if ( ! rres ) { ERR << "upgrade " << rres << endl; getZYpp()->resolver()->problems(); return false; } MIL << "upgrade " << rres << endl; vdumpPoolStats( USR << "Transacting:"<< endl, make_filter_begin(test.pool()), make_filter_end(test.pool()) ) << endl; return true; } BOOST_GLOBAL_FIXTURE( TestInit ); BOOST_AUTO_TEST_CASE( orphaned ) { USR << "pool: " << test.pool() << endl; BOOST_REQUIRE( upgrade( ) ); ResPoolProxy proxy( test.poolProxy() ); BOOST_CHECK_EQUAL( proxy.lookup( ResKind::package, "glibc" )->status(), ui::S_KeepInstalled ); BOOST_CHECK_EQUAL( proxy.lookup( ResKind::package, "release-package" )->status(), ui::S_AutoUpdate ); BOOST_CHECK_EQUAL( proxy.lookup( ResKind::package, "dropped_required" )->status(), ui::S_KeepInstalled ); BOOST_CHECK_EQUAL( proxy.lookup( ResKind::package, "dropped" )->status(), ui::S_AutoDel ); } libzypp-17.36.5/tests/zypp/Edition_test.cc000066400000000000000000000021061476576476200205220ustar00rootroot00000000000000// Edition.cc // // tests for Edition // #include #include #include using boost::unit_test::test_case; using namespace zypp; BOOST_AUTO_TEST_CASE(edition) { Edition _ed1 ("1"); Edition _ed2 ("1.1"); Edition _ed3 ("1:1"); Edition _ed4 ("2:1-1"); BOOST_CHECK_EQUAL(_ed2.version(), "1.1"); BOOST_CHECK_EQUAL(_ed2.release(), ""); BOOST_CHECK_EQUAL(_ed2.epoch(), 0U); BOOST_CHECK_EQUAL(_ed4.epoch(), 2U); BOOST_CHECK_EQUAL(_ed1, Edition ("1", "")); BOOST_CHECK_EQUAL(_ed2, Edition ("1.1", "")); BOOST_CHECK_EQUAL(_ed2, Edition ("1_1", "")); // Edition strings may differ in separator (non alphanum) BOOST_CHECK_EQUAL(_ed2, Edition ("0:1.1")); // epoch 0 is no epoch BOOST_CHECK_EQUAL(_ed3, Edition ("1", "", "1")); BOOST_CHECK_EQUAL(_ed3, Edition ("1", "", 1)); BOOST_CHECK_EQUAL(_ed4, Edition ("1", "1", 2)); BOOST_CHECK_EQUAL( Edition::compare("1:1-1","2:1-1"), -1 ); BOOST_CHECK_EQUAL( Edition::compare("2:1-1","2:1-1"), 0 ); BOOST_CHECK_EQUAL( Edition::compare("3:1-1","2:1-1"), 1 ); } libzypp-17.36.5/tests/zypp/ExtendedPool_test.cc000066400000000000000000000062131476576476200215240ustar00rootroot00000000000000#include #include #include "TestSetup.h" #include #include #include using boost::unit_test::test_case; using std::cin; using std::cout; using std::cerr; using std::endl; using namespace zypp; static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); void testcase_init() { // cout << "+++[repoinit]=======================" << endl; test.loadTestcaseRepos( TESTS_SRC_DIR"/data/PoolReuseIds/SeqA" ); // for ( auto && pi : ResPool::instance() ) // cout << pi << " " << pi.resolvable() << endl; // cout << "---[repoinit]=======================" << endl; } void testcase_init2() { // cout << "+++[repoinit2]=======================" << endl; sat::Pool::instance().reposEraseAll(); test.loadTestcaseRepos( TESTS_SRC_DIR"/data/PoolReuseIds/SeqB" ); // for ( auto && pi : ResPool::instance() ) // cout << pi << " " << pi.resolvable() << endl; // cout << "---[repoinit2]=======================" << endl; } void checkpi( const PoolItem & pi ) { BOOST_CHECK( pi.resolvable() ); BOOST_CHECK_EQUAL( pi.id(), pi.resolvable()->id() ); BOOST_CHECK_EQUAL( bool(asKind( pi.resolvable() )), isKind(pi) ); BOOST_CHECK_EQUAL( bool(asKind( pi.resolvable() )), isKind(pi) ); BOOST_CHECK_EQUAL( bool(asKind( pi.resolvable() )), isKind(pi) ); BOOST_CHECK_EQUAL( bool(asKind( pi.resolvable() )), isKind(pi) ); BOOST_CHECK_EQUAL( bool(asKind( pi.resolvable() )), isKind(pi) ); BOOST_CHECK_EQUAL( bool(asKind( pi.resolvable() )), isKind(pi) ); } void repocheck() { // cout << "+++[repocheck]======================" << endl; for ( auto && pi : ResPool::instance() ) { // cout << "??? " << pi << endl; checkpi( pi ); } // cout << "---[repocheck]======================" << endl; } /////////////////////////////////////////////////////////////////// // Check that after ERASING ALL REPOS and loading a new one, ResPool // actually creates new PoolItems rather than reusing already existing // ones. // // Adding/removing repos will not reuse poolIDs unless actually all // repos are removed from the pool. In this case ResPool must invalidate // ALL existing PoolItems (especially the Resolvable Pointers inside). // // SeqA SeqB // (1)package - (1)application // (2)pattern - (2)package // ... ... // // The two test repos have Resolvables of different kind in different // order. If ResPool fails to recreate the PoolItem, we'll experience // cast errors. PoolItem(1) will claim to be an application, but the // Resolvable is still the original one created for a package... /////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(t_1) { //will print additional context information on error BOOST_TEST_CONTEXT("First phase") { testcase_init(); repocheck(); } BOOST_TEST_CONTEXT("Second phase") { testcase_init2(); repocheck(); } } libzypp-17.36.5/tests/zypp/Fetcher_test.cc000066400000000000000000000327611476576476200205210ustar00rootroot00000000000000#include "TestSetup.h" #include #include #include "WebServer.h" #define BOOST_TEST_MODULE fetcher_test #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/Fetcher/remote-site") BOOST_AUTO_TEST_SUITE( fetcher_test ); BOOST_AUTO_TEST_CASE(fetcher_enqueuedir_noindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // Now test that without trusting it, it should throw // do the test by trusting the SHA1SUMS file signature key { filesystem::TmpDir dest; Fetcher fetcher; fetcher.enqueueDir(OnMediaLocation("/complexdir"), true); fetcher.start( dest.path(), media ); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() ); } } BOOST_AUTO_TEST_CASE(fetcher_enqueuedir_autoindex_untrustedkey) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key { filesystem::TmpDir dest; // add the key as untrusted, which is the same as not adding it and // let autodiscovery to add it Fetcher fetcher; fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDir(OnMediaLocation("/complexdir"), true); BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception); BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir2").isExist() ); BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() ); BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() ); BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() ); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(fetcher_enqueuedir_autoindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key { filesystem::TmpDir dest; // add the key as trusted getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir/subdir1/SHA1SUMS.key"), true); Fetcher fetcher; fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDir(OnMediaLocation("/complexdir"), true); fetcher.start( dest.path(), media ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() ); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(fetcher_enqueue_digested_dir_autoindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key but with a broken file { filesystem::TmpDir dest; Fetcher fetcher; // add the key as trusted getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true); fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDigestedDir(OnMediaLocation("/complexdir-broken"), true); BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), FileCheckException); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(fetcher_enqueuebrokendir_noindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key but with a broken file { filesystem::TmpDir dest; Fetcher fetcher; // add the key as trusted getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true); fetcher.enqueueDir(OnMediaLocation("/complexdir-broken"), true); // this should not throw as we provided no indexes and the // enqueue is not digested fetcher.start( dest.path(), media ); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir2").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir2/subdir2-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file2.txt").isExist() ); } } BOOST_AUTO_TEST_CASE(fetcher_enqueuebrokendir_index) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key but with a broken file { filesystem::TmpDir dest; Fetcher fetcher; // add the key as trusted getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true); fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDir(OnMediaLocation("/complexdir-broken"), true); BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(fetcher_enqueue_digesteddir_brokendir_with_index) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key but with a broken file { filesystem::TmpDir dest; Fetcher fetcher; // add the key as trusted getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true); fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDigestedDir(OnMediaLocation("/complexdir-broken"), true); BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(fetcher_enqueue_digested_broken_with_autoindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key but with a broken file { filesystem::TmpDir dest; Fetcher fetcher; // add the key as trusted getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true); fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDigested(OnMediaLocation("/complexdir-broken/subdir1/subdir1-file2.txt")); BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(fetcher_enqueue_digested_with_autoindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); // do the test by trusting the SHA1SUMS file signature key with a good file // checksum in auto discovered index { filesystem::TmpDir dest; Fetcher fetcher; // add the key as trusted getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir/subdir1/SHA1SUMS.key"), true); fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDigested(OnMediaLocation("/complexdir/subdir1/subdir1-file1.txt")); fetcher.start( dest.path(), media ); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(fetcher_enqueuefile_noindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); { filesystem::TmpDir dest; Fetcher fetcher; fetcher.enqueue(OnMediaLocation("/file-1.txt")); fetcher.start( dest.path(), media ); BOOST_CHECK( PathInfo(dest.path() + "/file-1.txt").isExist() ); } //MIL << fetcher; } BOOST_AUTO_TEST_CASE(fetcher_simple) { MediaSetAccess media( (DATADIR).asUrl(), "/" ); Fetcher fetcher; { filesystem::TmpDir dest; OnMediaLocation loc("/complexdir/subdir1/subdir1-file1.txt"); loc.setChecksum(CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15")); fetcher.enqueueDigested(loc); fetcher.start(dest.path(), media); fetcher.reset(); // now we break the checksum and it should fail loc.setChecksum(CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec16")); fetcher.enqueueDigested(loc); BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(content_index) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); Fetcher fetcher; // test transfering one file by setting the index { filesystem::TmpDir dest; OnMediaLocation loc("/contentindex/subdir1/subdir1-file1.txt"); // trust the key manually getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/contentindex/content.key"), true); fetcher.addIndex(OnMediaLocation("/contentindex/content", 1)); fetcher.enqueue(loc); fetcher.start(dest.path(), media); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/contentindex/subdir1/subdir1-file1.txt").isExist() ); } } BOOST_AUTO_TEST_CASE(enqueue_broken_content_index) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); Fetcher fetcher; filesystem::TmpDir dest; { OnMediaLocation loc("/contentindex-broken-digest/subdir1/subdir1-file1.txt",1); // key was already imported as trusted fetcher.addIndex(OnMediaLocation("/contentindex-broken-digest/content", 1)); fetcher.enqueue(loc); fetcher.start(dest.path(), media); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/contentindex-broken-digest/subdir1/subdir1-file1.txt").isExist() ); // now retrieve a file that is modified, so the checksum has to fail loc = OnMediaLocation("/contentindex-broken-digest/subdir1/subdir1-file2.txt",1); fetcher.addIndex(OnMediaLocation("/contentindex-broken-digest/content", 1)); fetcher.enqueue(loc); BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(enqueue_digested_images_file_content_autoindex) { MediaSetAccess media( ( DATADIR + "/images-file").asUrl(), "/" ); Fetcher fetcher; filesystem::TmpDir dest; { OnMediaLocation loc("/images/images.xml",1); fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDigested(loc); fetcher.start(dest.path(), media); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/images/images.xml").isExist() ); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(enqueue_digested_images_file_content_autoindex_unsigned) { MediaSetAccess media( ( DATADIR + "/images-file-unsigned").asUrl(), "/" ); Fetcher fetcher; filesystem::TmpDir dest; { OnMediaLocation loc("/images/images.xml",1); fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDigested(loc); // it should throw because unsigned file throws BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), FileCheckException); fetcher.reset(); // the target file was NOT transferred BOOST_CHECK( ! PathInfo(dest.path() + "/images/images.xml").isExist() ); fetcher.reset(); } } BOOST_AUTO_TEST_CASE(enqueue_broken_content_noindex) { MediaSetAccess media( ( DATADIR).asUrl(), "/" ); Fetcher fetcher; { filesystem::TmpDir dest; OnMediaLocation loc("/contentindex-broken-digest/subdir1/subdir1-file1.txt",1); // key was already imported as trusted fetcher.enqueue(loc); fetcher.start(dest.path(), media); fetcher.reset(); // now retrieve a file that is modified, so the checksum has to fail loc = OnMediaLocation("/contentindex-broken-digest/subdir1/subdir1-file2.txt",1); fetcher.enqueue(loc); fetcher.start( dest.path(), media ); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/contentindex-broken-digest/subdir1/subdir1-file2.txt").isExist() ); } } BOOST_AUTO_TEST_CASE(enqueuedir_http) { WebServer web((Pathname(TESTS_SRC_DIR) + "/zypp/data/Fetcher/remote-site").c_str(), 10001); BOOST_REQUIRE( web.start() ); // at this point the key is already trusted { MediaSetAccess media( web.url(), "/" ); Fetcher fetcher; filesystem::TmpDir dest; // auto add the SHA1SUMS fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDir(OnMediaLocation("/complexdir"), true); fetcher.start( dest.path(), media ); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() ); BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() ); } // test broken tree { MediaSetAccess media( web.url(), "/" ); Fetcher fetcher; filesystem::TmpDir dest; // auto add the SHA1SUMS fetcher.setOptions( Fetcher::AutoAddIndexes ); fetcher.enqueueDir(OnMediaLocation("/complexdir-broken"), true); // should throw because wrong checksum BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), FileCheckException); fetcher.reset(); BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir2").isExist() ); // unprocessed after failure: BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir-broken/subdir2/subdir2-file1.txt").isExist() ); // this one got transferred before the failure, so it is there BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file1.txt").isExist() ); // broken: BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file2.txt").isExist() ); fetcher.reset(); } web.stop(); } BOOST_AUTO_TEST_SUITE_END(); // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/zypp/FileChecker_test.cc000066400000000000000000000042551476576476200213020ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include "KeyRingTestReceiver.h" using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; using namespace zypp::filesystem; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/FileChecker") BOOST_AUTO_TEST_CASE(keyring_test) { Pathname file( Pathname(DATADIR) + "hello.txt" ); Pathname file2( Pathname(DATADIR) + "hello2.txt" ); Pathname pubkey( Pathname(DATADIR) + "hello.txt.key" ); Pathname signature( Pathname(DATADIR) + "hello.txt.asc" ); /** * 1st scenario, the signature does * match */ { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); SignatureFileChecker sigchecker( signature ); sigchecker.addPublicKey(pubkey); sigchecker(file); } /** * second scenario, the signature does not * match, an exception has to be thrown */ { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); SignatureFileChecker sigchecker( signature ); sigchecker.addPublicKey(pubkey); BOOST_CHECK_THROW( sigchecker(file2), zypp::Exception ); } } BOOST_AUTO_TEST_CASE(checksum_test) { Pathname file( Pathname(DATADIR) + "hello.txt" ); Pathname file2( Pathname(DATADIR) + "hello2.txt" ); Pathname pubkey( Pathname(DATADIR) + "hello.txt.key" ); Pathname signature( Pathname(DATADIR) + "hello.txt.asc" ); /** * 1st scenario, checksum matches */ { ChecksumFileChecker checker( CheckSum("sha1", "f2105202a0f017ab818b670d04982a89f55f090b") ); checker(file); } /** * 1st scenario, checksum does not matches */ { ChecksumFileChecker checker( CheckSum("sha1", "f2105202a0f017ab818b670d04982a89f55f090b") ); BOOST_CHECK_THROW( checker(file2), zypp::FileCheckException ); } } libzypp-17.36.5/tests/zypp/Flags_test.cc000066400000000000000000000047201476576476200201670ustar00rootroot00000000000000// // tests for Flags // #include #include #include #include using boost::unit_test::test_case; using std::cout; using std::endl; using namespace zypp; enum class E { _0 = 0, _1 = 1 << 0, _2 = 1 << 1, _3 = _2 | _1, _4 = 1 << 2, _5 = _4 | _1, _8 = 1 << 3, }; ZYPP_DECLARE_FLAGS( TFlags, E ); ZYPP_DECLARE_OPERATORS_FOR_FLAGS( TFlags ); inline std::ostream & operator<<( std::ostream & str, const E & obj ) { return str << TFlags(obj); } static const TFlags T_6( E::_4 | E::_2 ); static const TFlags T_7( E::_4 | E::_2 | E::_1 ); BOOST_AUTO_TEST_CASE(flags) { TFlags t0; BOOST_CHECK_EQUAL( t0, 0 ); BOOST_CHECK_EQUAL( E::_0, t0 ); BOOST_CHECK_EQUAL( t0, E::_0 ); BOOST_CHECK_EQUAL( t0, TFlags(0) ); BOOST_CHECK_EQUAL( ~t0, ~0 ); BOOST_CHECK_EQUAL( ~~t0, 0 ); BOOST_CHECK_EQUAL( ~t0, ~E::_0 ); BOOST_CHECK_EQUAL( ~~t0, E::_0 ); BOOST_CHECK_EQUAL( TFlags::none(), TFlags(0) ); BOOST_CHECK_EQUAL( TFlags::all(), ~TFlags(0) ); TFlags t1( E::_1 ); BOOST_CHECK_EQUAL( t1, 1 ); BOOST_CHECK_EQUAL( t1, E::_1 ); BOOST_CHECK_EQUAL( t1, TFlags(1) ); TFlags t; //t = 1; // must not compile: assign from int_type t = E::_2; // = enum BOOST_CHECK_EQUAL( t, E::_2 ); t = T_6; // = TFlags BOOST_CHECK_EQUAL( t, T_6 ); // enum op enum t = ~E::_1; BOOST_CHECK_EQUAL( ~t, E::_1 ); t = E::_1 & E::_2; BOOST_CHECK_EQUAL( t, E::_0 ); t = E::_1 | E::_2; BOOST_CHECK_EQUAL( t, E::_3 ); t = E::_1 ^ E::_2; BOOST_CHECK_EQUAL( t, E::_3 ); // enum op TFlags t = E::_2 & T_6; BOOST_CHECK_EQUAL( t, E::_2 ); t = E::_2 | T_6; BOOST_CHECK_EQUAL( t, T_6 ); t = E::_2 ^ T_6; BOOST_CHECK_EQUAL( t, E::_4 ); // TFlags op enum t = ~T_7; BOOST_CHECK_EQUAL( ~t, T_7 ); t = T_7 & E::_2; BOOST_CHECK_EQUAL( t, E::_2 ); t = T_7 | E::_2; BOOST_CHECK_EQUAL( t, T_7 ); t = T_7 ^ E::_2; BOOST_CHECK_EQUAL( t, E::_5 ); // TFlags op TFlags t = T_7 & T_6; BOOST_CHECK_EQUAL( t, T_6 ); t = T_7 | T_6; BOOST_CHECK_EQUAL( t, T_7 ); t = T_7 ^ T_7; BOOST_CHECK_EQUAL( t, E::_0 ); t = E::_3; BOOST_CHECK( ! t.testFlag( E::_0 ) ); // fails as t != 0 BOOST_CHECK( t.testFlag( E::_1 ) ); BOOST_CHECK( t.testFlag( E::_2 ) ); BOOST_CHECK( t.testFlag( E::_3 ) ); t.unsetFlag( E::_2 ); BOOST_CHECK( t.testFlag( E::_1 ) ); t.setFlag( E::_1, false ); BOOST_CHECK( t.testFlag( E::_0 ) ); // succeed as t == 0 t.setFlag( E::_3, true ); BOOST_CHECK( t.testFlag( E::_3 ) ); } libzypp-17.36.5/tests/zypp/GZStream_test.cc000066400000000000000000000044161476576476200206310ustar00rootroot00000000000000// Boost.Test #include #include #include #include BOOST_AUTO_TEST_CASE(gz_simple_read_write) { const zypp::Pathname file = zypp::Pathname(TESTS_BUILD_DIR) / "test.gz"; const std::string testString("HelloWorld"); { zypp::ofgzstream strOut( file.c_str() ); BOOST_REQUIRE ( strOut.is_open() ); BOOST_REQUIRE ( !strOut.fail() ); BOOST_REQUIRE ( strOut.getbuf().canWrite() ); BOOST_REQUIRE ( !strOut.getbuf().canRead() ); strOut << testString; BOOST_REQUIRE ( !strOut.fail() ); } { std::string test; zypp::ifgzstream str( file.c_str() ); BOOST_REQUIRE ( str.is_open() ); BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE ( !str.getbuf().canWrite() ); BOOST_REQUIRE ( str.getbuf().canRead() ); str >> test; BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE_EQUAL( test, testString ); } { zypp::InputStream iStr( file ); BOOST_REQUIRE( typeid( iStr.stream() ) == typeid( zypp::ifgzstream& ) ); } } BOOST_AUTO_TEST_CASE(gz_seek) { const zypp::Pathname file = zypp::Pathname(TESTS_BUILD_DIR) / "testseek.gz"; const std::string testString("Hello World!\nLet's see if seeking works!"); { zypp::ofgzstream strOut( file.c_str() ); BOOST_REQUIRE( strOut.is_open() ); strOut << testString; } //gzseek only supports SEEK_SET (beg) and SEEK_CUR (cur), SEEK_END (end) is not supported { std::string test; zypp::ifgzstream str( file.c_str() ); str.seekg( 6, std::ios_base::beg ); BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE_EQUAL( str.tellg(), 6 ); str >> test; BOOST_REQUIRE_EQUAL( test, "World!" ); BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE_EQUAL( str.tellg(), 12 ); str.seekg( 7, std::ios_base::cur ); BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE_EQUAL( str.tellg(), 19 ); str >> test; BOOST_REQUIRE_EQUAL( test, "see" ); BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE_EQUAL( str.tellg(), 22 ); str.seekg( 0, std::ios_base::beg ); BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE_EQUAL( str.tellg(), 0 ); str >> test; BOOST_REQUIRE ( !str.fail() ); BOOST_REQUIRE_EQUAL( str.tellg(), 5 ); BOOST_REQUIRE_EQUAL( test, "Hello" ); } } libzypp-17.36.5/tests/zypp/InstanceId_test.cc000066400000000000000000000025711476576476200211560ustar00rootroot00000000000000#include "TestSetup.h" #include #define BOOST_TEST_MODULE InstanceId ///////////////////////////////////////////////////////////////////////////// static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); // Abuse;) vbox as System repo: test.loadTargetRepo( TESTS_SRC_DIR "/data/obs_virtualbox_11_1" ); test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" ); test.loadRepo( TESTS_SRC_DIR "/data/OBS_zypp_svn-11.1", "zyppsvn" ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(default_constructed) { InstanceId instanceId; BOOST_CHECK_EQUAL( instanceId.getNamespace(), std::string() ); BOOST_CHECK_EQUAL( instanceId.isSystemId( "System" ), false ); BOOST_CHECK_EQUAL( instanceId.isSystemId( "@System" ), true ); BOOST_CHECK_EQUAL( instanceId(""), PoolItem() ); BOOST_CHECK_EQUAL( instanceId(PoolItem()), "" ); } BOOST_AUTO_TEST_CASE(convert) { InstanceId instanceId; instanceId.setNamespace( "SUSE" ); BOOST_CHECK_EQUAL( instanceId.getNamespace(), "SUSE" ); ResPool pool( ResPool::instance() ); for_( it, pool.begin(), pool.end() ) { std::cout << instanceId(*it) << endl; BOOST_CHECK_EQUAL( instanceId(instanceId(*it)), *it ); } } libzypp-17.36.5/tests/zypp/KeyRingTestReceiver.h000066400000000000000000000075251476576476200216410ustar00rootroot00000000000000 #ifndef ZYPP_KEYRING_TEST_RECEIVER_H #define ZYPP_KEYRING_TEST_RECEIVER_H #include #include #include #include /** * Keyring Callback Receiver with some features * Allows to simulate and configure user answer * Can record which callbacks were called */ struct KeyRingTestReceiver : public zypp::callback::ReceiveReport { KeyRingTestReceiver() { reset(); connect(); } void reset() { _answer_accept_unknown_key = false; _answer_accept_key = KeyRingReport::KEY_DONT_TRUST; _answer_ver_failed = false; _answer_accept_unsigned_file = false; _asked_user_to_accept_unknown_key = false; _asked_user_to_accept_key = false; _asked_user_to_accept_ver_failed = false; _asked_user_to_accept_unsigned_file = false; } ~KeyRingTestReceiver() { disconnect(); } void answerAcceptVerFailed( bool answer ) { _answer_ver_failed = answer; } bool askedAcceptVerFailed() const { return _asked_user_to_accept_ver_failed; } void answerAcceptUnknownKey( bool answer ) { _answer_accept_unknown_key = answer; } bool askedAcceptUnknownKey() const { return _asked_user_to_accept_unknown_key; } void answerAcceptKey( KeyRingReport::KeyTrust answer ) { _answer_accept_key = answer; } bool askedAcceptKey() const { return _asked_user_to_accept_key; } void answerAcceptUnsignedFile( bool answer ) { _answer_accept_unsigned_file = answer; } bool askedAcceptUnsignedFile() const { return _asked_user_to_accept_unsigned_file; } virtual bool askUserToAcceptUnsignedFile( const std::string &file, const zypp::KeyContext &keycontext ) { MIL << std::endl; _asked_user_to_accept_unsigned_file = true; return _answer_accept_unsigned_file; } virtual bool askUserToAcceptUnknownKey( const std::string &file, const std::string &id, const zypp::KeyContext &keycontext ) { MIL << std::endl; _asked_user_to_accept_unknown_key = true; return _answer_accept_unknown_key; } virtual KeyRingReport::KeyTrust askUserToAcceptKey( const zypp::PublicKey &key, const zypp::KeyContext &keycontext ) { MIL << std::endl; _asked_user_to_accept_key = true; return _answer_accept_key; } virtual bool askUserToAcceptVerificationFailed( const std::string &file, const zypp::PublicKey &key, const zypp::KeyContext &keycontext ) { MIL << std::endl; _asked_user_to_accept_ver_failed = true; return _answer_ver_failed; } // how to answer bool _answer_accept_unknown_key; KeyRingReport::KeyTrust _answer_accept_key; bool _answer_ver_failed; bool _answer_accept_unsigned_file; // we use this variables to check that the // callbacks were called bool _asked_user_to_accept_unknown_key; bool _asked_user_to_accept_key; bool _asked_user_to_accept_ver_failed; bool _asked_user_to_accept_unsigned_file; }; /** * Keyring Signal Receiver with some features * Allows to simulate and configure user answer * Can record which callbacks were called */ struct KeyRingTestSignalReceiver : zypp::callback::ReceiveReport { KeyRingTestSignalReceiver(/*RpmDb &rpmdb*/) : _trusted_key_added_called(false) { MIL << "KeyRing signals enabled" << std::endl; connect(); } ~KeyRingTestSignalReceiver() { disconnect(); } virtual void trustedKeyAdded( const zypp::PublicKey &key ) { MIL << "TEST: trusted key added to zypp Keyring. Synchronizing keys with fake rpm keyring" << std::endl; _trusted_key_added_called = true; //std::cout << "trusted key added to zypp Keyring. Synchronizing keys with rpm keyring" << std::endl; //_rpmdb.importZyppKeyRingTrustedKeys(); //_rpmdb.exportTrustedKeysInZyppKeyRing(); } virtual void trustedKeyRemoved( const zypp::PublicKey &key ) { } bool _trusted_key_added_called; }; #endif libzypp-17.36.5/tests/zypp/KeyRing_test.cc000066400000000000000000000275621476576476200205140ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include "KeyRingTestReceiver.h" #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; using namespace zypp::filesystem; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/KeyRing") bool verifyFileSignatureWorkflow( KeyRing_Ptr ring, const Pathname &file, const std::string &filedesc, const Pathname &signature, bool & sigValid_r, const KeyContext &keycontext = KeyContext()) { sigValid_r = false; // just in case.... keyring::VerifyFileContext context( file, signature ); context.shortFile( filedesc ); context.keyContext( keycontext ); const auto &res = zyppng::KeyRingWorkflow::verifyFileSignature( zyppng::SyncContext::create(), ring, std::move(context) ); sigValid_r = res.second.fileValidated(); return res.second.fileAccepted(); } bool verifyFileSignatureWorkflow( KeyRing_Ptr ring, const Pathname &file, const std::string filedesc, const Pathname &signature, const KeyContext &keycontext = KeyContext()) { keyring::VerifyFileContext context( file, signature ); context.shortFile( filedesc ); context.keyContext( keycontext ); const auto &res = zyppng::KeyRingWorkflow::verifyFileSignature( zyppng::SyncContext::create(), ring, std::move(context) ); return res.second.fileAccepted(); } BOOST_AUTO_TEST_CASE(keyring_test) { PublicKey key( Pathname(DATADIR) + "public.asc" ); /** * scenario #1 * import a not trusted key * ask for accept, answer yes 'temporarily' */ { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // base sandbox for playing TmpDir tmp_dir; KeyRing_Ptr keyring = new KeyRing( tmp_dir.path() ); BOOST_CHECK_EQUAL( keyring->publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring->trustedPublicKeys().size(), (unsigned) 0 ); keyring->importKey( key, false ); BOOST_CHECK_EQUAL( keyring->publicKeys().size(), (unsigned) 1 ); BOOST_CHECK_EQUAL( keyring->trustedPublicKeys().size(), (unsigned) 0 ); BOOST_CHECK_MESSAGE( keyring->isKeyKnown( key.id() ), "Imported untrusted key should be known"); BOOST_CHECK_MESSAGE( ! keyring->isKeyTrusted( key.id() ), "Imported untrusted key should be untrusted"); keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); bool to_continue = verifyFileSignatureWorkflow( keyring, DATADIR + "repomd.xml", "Blah Blah", DATADIR + "repomd.xml.asc"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known"); BOOST_CHECK_MESSAGE( keyring_callbacks.askedAcceptKey(), "Verify Signature Workflow with only 1 untrusted key should ask user wether to trust and/or import"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptVerFailed(), "The signature validates"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnsignedFile(), "It is a signed file, so dont ask the opposite"); BOOST_CHECK_MESSAGE( to_continue, "We did not import, but we trusted and signature validates."); } /** * scenario #1.1 * import a not trusted key * ask to accept, answer yes 'temporarily' * vorrupt the file and check */ { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // base sandbox for playing TmpDir tmp_dir; KeyRing_Ptr keyring = new KeyRing ( tmp_dir.path() ); BOOST_CHECK_EQUAL( keyring->publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring->trustedPublicKeys().size(), (unsigned) 0 ); keyring->importKey( key, false ); keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); // now we will recheck with a corrupted file bool to_continue = verifyFileSignatureWorkflow( keyring, DATADIR + "repomd.xml.corrupted", "Blah Blah", DATADIR + "repomd.xml.asc"); // check wether the user got the right questions BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known"); BOOST_CHECK_MESSAGE( keyring_callbacks.askedAcceptKey(), "Verify Signature Workflow with only 1 untrusted key should ask user wether to trust and/or import"); BOOST_CHECK_MESSAGE( keyring_callbacks.askedAcceptVerFailed(), "The signature does not validates"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnsignedFile(), "It is a signed file, so dont ask the opposite"); BOOST_CHECK_MESSAGE( ! to_continue, "We did not continue with a corrupted file"); } /** * scenario #1.2 * import a not trusted key * ask for trust, answer yes * ask for import, answer no * check without signature */ { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // base sandbox for playing TmpDir tmp_dir; KeyRing_Ptr keyring = new KeyRing ( tmp_dir.path() ); keyring->importKey( key, false ); keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); // now we will recheck with a unsigned file bool to_continue = verifyFileSignatureWorkflow( keyring, DATADIR + "repomd.xml", "Blah Blah", Pathname() ); // check wether the user got the right questions BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptKey(), "No signature, no key to trust"); BOOST_CHECK_MESSAGE( keyring_callbacks.askedAcceptUnsignedFile(), "Ask the user wether to accept an unsigned file"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptVerFailed(), "There is no signature to verify"); BOOST_CHECK_MESSAGE( ! to_continue, "We did not continue with a unsigned file"); } /** scenario #2 * empty keyring * should ask for unknown key * answer no */ { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // base sandbox for playing TmpDir tmp_dir; KeyRing_Ptr keyring = new KeyRing( tmp_dir.path() ); BOOST_CHECK_MESSAGE( ! keyring->isKeyKnown( key.id() ), "empty keyring has not known keys"); //keyring_callbacks.answerAcceptUnknownKey(true); bool to_continue = verifyFileSignatureWorkflow( keyring, DATADIR + "repomd.xml", "Blah Blah", DATADIR + "repomd.xml.asc"); BOOST_CHECK_MESSAGE(keyring_callbacks.askedAcceptUnknownKey(), "Should ask to accept unknown key, empty keyring"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptKey(), "Unknown key cant be trusted"); BOOST_CHECK_MESSAGE( ! to_continue, "We answered no to accept unknown key"); } /** scenario #3 * import trusted key * should ask nothing * should emit signal */ { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // base sandbox for playing TmpDir tmp_dir; KeyRing_Ptr keyring = new KeyRing( tmp_dir.path() ); BOOST_CHECK_EQUAL( keyring->publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring->trustedPublicKeys().size(), (unsigned) 0 ); keyring->importKey( key, true ); BOOST_CHECK_EQUAL( receiver._trusted_key_added_called, true ); BOOST_CHECK_EQUAL( keyring->publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring->trustedPublicKeys().size(), (unsigned) 1 ); BOOST_CHECK_MESSAGE( keyring->isKeyKnown( key.id() ), "Imported trusted key should be known"); BOOST_CHECK_MESSAGE( keyring->isKeyTrusted( key.id() ), "Imported trusted key should be trusted"); bool to_continue = verifyFileSignatureWorkflow( keyring, DATADIR + "repomd.xml", "Blah Blah", DATADIR + "repomd.xml.asc"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptKey(), "Verify Signature Workflow with only 1 untrusted key should ask user wether to trust and/or import"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptVerFailed(), "The signature validates"); BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnsignedFile(), "It is a signed file, so dont ask the opposite"); BOOST_CHECK_MESSAGE( to_continue, "We did not import, but we trusted and signature validates."); } //keyring.importKey( key, true ); //BOOST_CHECK_EQUAL( receiver._trusted_key_added_called, true ); //BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), 1 ); /* check signature id can be extracted */ } BOOST_AUTO_TEST_CASE(signature_test) { PublicKey key( DATADIR + "public.asc" ); { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // base sandbox for playing TmpDir tmp_dir; KeyRing keyring( tmp_dir.path() ); BOOST_CHECK_EQUAL( keyring.readSignatureKeyId( DATADIR + "repomd.xml.asc" ), "BD61D89BD98821BE" ); BOOST_CHECK_THROW( keyring.readSignatureKeyId(Pathname()), Exception ); TmpFile tmp; BOOST_CHECK_EQUAL( keyring.readSignatureKeyId(tmp.path()), "" ); keyring.importKey(key); BOOST_CHECK(keyring.verifyFileSignature( DATADIR + "repomd.xml", DATADIR + "repomd.xml.asc")); BOOST_CHECK( ! keyring.verifyFileSignature( DATADIR + "repomd.xml.corrupted", DATADIR + "repomd.xml.asc")); } } BOOST_AUTO_TEST_CASE(keyring_import) { // base sandbox for playing TmpDir tmp_dir; KeyRing keyring( tmp_dir.path() ); struct Receiver: public callback::ReceiveReport { Receiver() { connect(); } virtual void trustedKeyAdded( const PublicKey & key_r ) { ++_cbcnt; } virtual void trustedKeyRemoved( const PublicKey & key_r ) { --_cbcnt; } unsigned _cbcnt = 0; } receiver; /////////////////////////////////////////////////////////////////// // Make sure we get a proper callback notification if multiple // keys are imported at once. /////////////////////////////////////////////////////////////////// PublicKey key( DATADIR + "installkey.gpg" ); BOOST_CHECK_EQUAL( key.hiddenKeys().size(), 2 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), 0 ); keyring.importKey( key, true ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), 3 ); BOOST_CHECK_EQUAL( receiver._cbcnt, keyring.trustedPublicKeys().size() ); } BOOST_AUTO_TEST_CASE(keyring_delete) { PublicKey key( Pathname(DATADIR) + "public.asc" ); /** scenario #3 * import and delete untrusted key */ { // base sandbox for playing TmpDir tmp_dir; KeyRing keyring( tmp_dir.path() ); BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 ); keyring.importKey( key, false ); BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 1 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 ); keyring.deleteKey( key.id(), false); BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 ); } /** scenario #3.1 * import and delete trusted key */ { // base sandbox for playing TmpDir tmp_dir; KeyRing keyring( tmp_dir.path() ); BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 ); keyring.importKey( key, true ); BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 1 ); //try to delete from untrusted keyring keyring.deleteKey( key.id(), false); BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 1 ); keyring.deleteKey( key.id(), true); BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 ); BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 ); } } libzypp-17.36.5/tests/zypp/Locale_test.cc000066400000000000000000000140321476576476200203270ustar00rootroot00000000000000#include #include #include #include #define BOOST_TEST_MODULE Locale using std::cout; using std::endl; using namespace zypp; using namespace boost::unit_test; BOOST_AUTO_TEST_CASE(static_deps) { setenv( "LANG", "C", 1 ); // static vars initialization sequence: Locale depends on LanguageCode BOOST_CHECK_EQUAL( LanguageCode::enCode.code(), "en" ); BOOST_CHECK_EQUAL( IdString(Locale::enCode), IdString(LanguageCode::enCode) ); // solver communication: Both must lead to the same ID BOOST_CHECK_EQUAL( Locale::enCode.id(), IdString(LanguageCode::enCode.code()).id() ); } // // NOTE: In checks testing for empty codes (IdString::Null/IdString::Empty) // explicitly use the ID, because both share the same string representation. // // This way you get "failed [1 != 0]" rather than "failed [ != ]" // BOOST_AUTO_TEST_CASE(no_codes) { // IdString::Null is probably a rare case BOOST_CHECK_EQUAL( LanguageCode(nullptr).id(), IdString::Null.id() ); BOOST_CHECK_EQUAL( CountryCode(nullptr).id(), IdString::Null.id() ); BOOST_CHECK_EQUAL( Locale(nullptr).id(), IdString::Null.id() ); BOOST_CHECK_EQUAL( Locale(nullptr).language().id(), IdString::Null.id() ); BOOST_CHECK_EQUAL( Locale(nullptr).country().id(), IdString::Null.id() ); // IdString::Null is the ususal noCode BOOST_CHECK_EQUAL( LanguageCode::noCode.id(), LanguageCode().id() ); BOOST_CHECK_EQUAL( LanguageCode::noCode.id(), LanguageCode("").id() ); BOOST_CHECK_EQUAL( LanguageCode::noCode.id(), IdString::Empty.id() ); BOOST_CHECK_EQUAL( CountryCode::noCode.id(), CountryCode().id() ); BOOST_CHECK_EQUAL( CountryCode::noCode.id(), CountryCode("").id() ); BOOST_CHECK_EQUAL( CountryCode::noCode.id(), IdString::Empty.id() ); BOOST_CHECK_EQUAL( Locale::noCode.id(), Locale().id() ); BOOST_CHECK_EQUAL( Locale::noCode.id(), Locale("").id() ); BOOST_CHECK_EQUAL( Locale::noCode.id(), IdString::Empty.id() ); BOOST_CHECK_EQUAL( Locale::noCode.language().id(), LanguageCode::noCode.id() ); BOOST_CHECK_EQUAL( Locale::noCode.country().id(), CountryCode::noCode.id() ); // const char * nc = "No Code"; BOOST_CHECK_EQUAL( LanguageCode(nullptr).name(), nc ); BOOST_CHECK_EQUAL( CountryCode(nullptr).name(), nc ); BOOST_CHECK_EQUAL( Locale(nullptr).name(), nc ); BOOST_CHECK_EQUAL( LanguageCode::noCode.name(), nc ); BOOST_CHECK_EQUAL( CountryCode::noCode.name(), nc ); BOOST_CHECK_EQUAL( Locale::noCode.name(), nc ); } BOOST_AUTO_TEST_CASE(language_code) { // language code: ger deu de, N_( "German" ) std::string name( "German" ); for ( const char * s : { "ger", "deu", "de" } ) { BOOST_CHECK_EQUAL( LanguageCode(s).code(), s ); BOOST_CHECK_EQUAL( LanguageCode(s), IdString(s) ); BOOST_CHECK_EQUAL( LanguageCode(s).id(), IdString(s).id() ); BOOST_CHECK_EQUAL( LanguageCode(s).name(), name ); } BOOST_CHECK( LanguageCode("de") < LanguageCode("deu") ); BOOST_CHECK( LanguageCode("deu") < LanguageCode("ger") ); BOOST_CHECK_EQUAL( LanguageCode("XX"), IdString("XX") ); } BOOST_AUTO_TEST_CASE(country_code) { // country code: "DE", N_("Germany) std::string name( "Germany" ); for ( const char * s : { "DE" } ) { BOOST_CHECK_EQUAL( CountryCode(s).code(), s ); BOOST_CHECK_EQUAL( CountryCode(s), IdString(s) ); BOOST_CHECK_EQUAL( CountryCode(s).id(), IdString(s).id() ); BOOST_CHECK_EQUAL( CountryCode(s).name(), name ); } BOOST_CHECK( CountryCode("AA") < CountryCode("DE") ); BOOST_CHECK_EQUAL( CountryCode("XX"), IdString("XX") ); } BOOST_AUTO_TEST_CASE(locale) { // IdString::Null (rare) { for ( const Locale & l : { Locale( nullptr ), Locale( LanguageCode(nullptr), CountryCode(nullptr) ) } ) { BOOST_CHECK_EQUAL( l.id(), IdString::Null.id() ); BOOST_CHECK_EQUAL( l.language().id(), IdString::Null.id() ); BOOST_CHECK_EQUAL( l.country().id(), IdString::Null.id() ); BOOST_CHECK_EQUAL( bool(l), false ); BOOST_CHECK_EQUAL( bool(l.language()), false ); BOOST_CHECK_EQUAL( bool(l.country()), false ); } } // Trailing garbage ([.@].*) is ignored { for ( const Locale & l : { Locale(), Locale( "" ), Locale( "@UTF-8" ), Locale( ".UTF-8" ) , Locale( LanguageCode(), CountryCode(nullptr) ) , Locale( LanguageCode(nullptr), CountryCode() ) , Locale( LanguageCode(), CountryCode() ) } ) { BOOST_CHECK_EQUAL( l.id(), IdString::Empty.id() ); BOOST_CHECK_EQUAL( l.language().id(), IdString::Empty.id() ); BOOST_CHECK_EQUAL( l.country().id(), IdString::Empty.id() ); BOOST_CHECK_EQUAL( bool(l), false ); BOOST_CHECK_EQUAL( bool(l.language()), false ); BOOST_CHECK_EQUAL( bool(l.country()), false ); } } { for ( const Locale & l : { Locale("de_DE"), Locale( "de_DE@UTF-8" ) , Locale( LanguageCode("de"), CountryCode("DE") ) } ) { BOOST_CHECK_EQUAL( l, IdString("de_DE") ); BOOST_CHECK_EQUAL( l.language(), IdString("de") ); BOOST_CHECK_EQUAL( l.country(), IdString("DE") ); BOOST_CHECK_EQUAL( bool(l), true ); BOOST_CHECK_EQUAL( bool(l.language()), true ); BOOST_CHECK_EQUAL( bool(l.country()), true ); } } { for ( const Locale & l : { Locale("de"), Locale( "de@UTF-8" ) , Locale( LanguageCode("de") ) } ) { BOOST_CHECK_EQUAL( l.id(), l.language().id() ); BOOST_CHECK_EQUAL( l.country().id(), IdString::Empty.id() ); BOOST_CHECK_EQUAL( bool(l), true ); BOOST_CHECK_EQUAL( bool(l.language()), true ); BOOST_CHECK_EQUAL( bool(l.country()), false ); } } } BOOST_AUTO_TEST_CASE(fallback) { { // default fallback... Locale l( "de_DE" ); BOOST_CHECK_EQUAL( (l = l.fallback()), "de" ); BOOST_CHECK_EQUAL( (l = l.fallback()), "en" ); BOOST_CHECK_EQUAL( (l = l.fallback()), "" ); } { // special rules... Locale l( "pt_BR" ); BOOST_CHECK_EQUAL( (l = l.fallback()), "en" ); BOOST_CHECK_EQUAL( (l = l.fallback()), "" ); } } libzypp-17.36.5/tests/zypp/Locks_test.cc000066400000000000000000000056501476576476200202110ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "TestSetup.h" #define BOOST_TEST_MODULE Locks using std::cout; using std::endl; using std::string; using namespace zypp; using namespace boost::unit_test; bool isLocked( const sat::Solvable & solvable ) { zypp::PoolItem pi( zypp::ResPool::instance().find( solvable ) ); if( pi.status().isLocked() ) return true; return false; } static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); //test.loadTarget(); // initialize and load target test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" ); test.loadRepo( TESTS_SRC_DIR "/data/OBS_zypp_svn-11.1", "@System" ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); ///////////////////////////////////////////////////////////////////////////// // 0xx basic queries ///////////////////////////////////////////////////////////////////////////// // default query + one search string // q.addString("foo"); // result: all resolvables having at least one attribute matching foo BOOST_AUTO_TEST_CASE(locks_1) { cout << "****001****" << endl; PoolQuery q; q.addString("zypper"); Locks::instance().addLock(q); for_(it,q.begin(),q.end()) { BOOST_CHECK(isLocked(*it)); } Locks::instance().removeLock(q); //clear before next test } BOOST_AUTO_TEST_CASE(locks_save_load) { cout << "****save/load****" << endl; Pathname src(TESTS_SRC_DIR); src += "zypp/data/Locks/locks"; Locks::instance().readAndApply(src); PoolQuery q; q.addString("zypper"); for_(it,q.begin(),q.end()) { BOOST_CHECK(isLocked(*it)); } #if 1 filesystem::TmpFile testfile; //Pathname testfile(TESTS_SRC_DIR); // testfile += "/zypp/data/Locks/testlocks"; Locks::instance().removeLock(q); Locks::instance().save(testfile); Locks::instance().readAndApply(testfile); //now unlocked for_(it,q.begin(),q.end()) { BOOST_CHECK(!isLocked(*it)); } BOOST_CHECK(Locks::instance().size()==0); #endif } BOOST_AUTO_TEST_CASE(locks_save_without_redundancy) { cout << "****save without redundancy****" << endl; PoolQuery q; q.addString("zypper"); Locks& locks = Locks::instance(); locks.addLock(q); locks.addLock(q); locks.merge(); BOOST_CHECK( locks.size()==1 ); locks.addLock(q); locks.merge(); BOOST_CHECK( locks.size()==1 ); locks.removeLock(q); locks.merge(); BOOST_CHECK( locks.size() == 0 ); } BOOST_AUTO_TEST_CASE( locks_empty ) { cout << "****test and clear empty locks****" << endl; PoolQuery q; q.addString("foo-bar-nonexist"); Locks& locks = Locks::instance(); locks.addLock(q); locks.merge(); //only need merge list BOOST_CHECK( locks.existEmpty() ); locks.removeEmpty(); BOOST_CHECK( locks.size() == 0 ); } libzypp-17.36.5/tests/zypp/MediaSetAccess_test.cc000066400000000000000000000235411476576476200217520ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include "WebServer.h" #include "FtpServer.h" using std::cout; using std::endl; using std::string; using namespace zypp; using namespace boost::unit_test; using namespace zypp::filesystem; class SimpleVerifier : public media::MediaVerifierBase { public: SimpleVerifier( const std::string &id ) { _media_id = id; } bool isDesiredMedia(const media::MediaHandler &ref) const override { return ref.doesFileExist(Pathname("/x." + _media_id )); } private: std::string _media_id; }; bool check_file_exists(const Pathname &path) { FILE *file; if ((file = fopen(path.asString().c_str(), "r")) == NULL) return false; fclose(file); return true; } /* * Check how MediaSetAccess::rewriteUrl() works. */ BOOST_AUTO_TEST_CASE(msa_url_rewrite) { BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("iso:/?iso=/path/to/CD1.iso"), 1).asString(), Url("iso:/?iso=/path/to/CD1.iso").asString()); BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("iso:/?iso=/path/to/CD1.iso"), 2).asString(), Url("iso:/?iso=/path/to/CD2.iso").asString()); BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("iso:/?iso=/path/to/CD1.iso"), 13).asString(), Url("iso:/?iso=/path/to/CD13.iso").asString()); BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("iso:/?iso=/path/to/cd1.iso"), 2).asString(), Url("iso:/?iso=/path/to/cd2.iso").asString()); BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("iso:/?iso=/path/to/cd2.iso"), 1).asString(), Url("iso:/?iso=/path/to/cd1.iso").asString()); BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("iso:/?iso=/path/to/dvd1.iso"), 2).asString(), Url("iso:/?iso=/path/to/dvd2.iso").asString()); BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("dir:/path/to/CD1"), 2).asString(), Url("dir:/path/to/CD2").asString()); // trailing slash check BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("dir:/path/to/CD1/"), 2).asString(), Url("dir:/path/to/CD2/").asString()); BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("nfs://nfs-server/exported/path/to/dvd1"), 2).asString(), Url("nfs://nfs-server/exported/path/to/dvd2").asString()); // single media check shouldn't this fail somehow?? BOOST_CHECK_EQUAL( MediaSetAccess::rewriteUrl(Url("http://ftp.opensuse.org/pub/opensuse/distribution/SL-OSS-factory/inst-source"), 2).asString(), Url("http://ftp.opensuse.org/pub/opensuse/distribution/SL-OSS-factory/inst-source").asString()); } #define DATADIR (Pathname(TESTS_SRC_DIR) / "/zypp/data/mediasetaccess") /* * * test data dir structure: * * . * |-- src1 * | |-- cd1 * | | |-- dir * | | | |-- file1 * | | | |-- file2 * | | | `-- subdir * | | | `-- file * | | `-- test.txt * | |-- cd2 * | | `-- test.txt * | `-- cd3 * | `-- test.txt * `-- src2 * `-- test.txt * */ /* * Provide files from set without verifiers. */ BOOST_AUTO_TEST_CASE(msa_provide_files_set) { Url url = (DATADIR + "/src1/cd1").asUrl(); MediaSetAccess setaccess(url); Pathname file1 = setaccess.provideFile("/test.txt", 1); BOOST_CHECK(check_file_exists(file1) == true); Pathname file2 = setaccess.provideFile("/test.txt", 2); BOOST_CHECK(check_file_exists(file2) == true); Pathname file3 = setaccess.provideFile("/test.txt", 3); BOOST_CHECK(check_file_exists(file3) == true); } /* * Provide files from set with verifiers. */ BOOST_AUTO_TEST_CASE(msa_provide_files_set_verified) { Url url = (DATADIR + "/src1/cd1").asUrl(); MediaSetAccess setaccess(url); setaccess.setVerifier(1, media::MediaVerifierRef(new SimpleVerifier("media1"))); setaccess.setVerifier(2, media::MediaVerifierRef(new SimpleVerifier("media2"))); setaccess.setVerifier(3, media::MediaVerifierRef(new SimpleVerifier("media3"))); // provide file from media1 Pathname file1 = setaccess.provideFile("/test.txt", 1); BOOST_CHECK(check_file_exists(file1) == true); // provide file from invalid media BOOST_CHECK_THROW(setaccess.provideFile("/test.txt", 2), media::MediaNotDesiredException); // provide file from media3 Pathname file3 = setaccess.provideFile("/test.txt", 3); BOOST_CHECK(check_file_exists(file3) == true); } /* * Provide file from single media with verifier. */ BOOST_AUTO_TEST_CASE(msa_provide_files_single) { Url url = (DATADIR + "/src2").asUrl(); MediaSetAccess setaccess(url); setaccess.setVerifier(1, media::MediaVerifierRef(new SimpleVerifier("media"))); // provide file from media Pathname file = setaccess.provideFile("/test.txt", 1); BOOST_CHECK(check_file_exists(file) == true); // provide non-existent file // (default answer from callback should be ABORT) BOOST_CHECK_THROW(setaccess.provideFile("/imnothere", 2), media::MediaFileNotFoundException); } /* * Provide directory from src/cd1. */ BOOST_AUTO_TEST_CASE(msa_provide_dir) { Url url = (DATADIR + "/src1/cd1").asUrl(); MediaSetAccess setaccess(url); Pathname dir = setaccess.provideDir("/dir", false, 1); Pathname file1 = dir + "/file1"; BOOST_CHECK(check_file_exists(file1) == true); Pathname file2 = dir + "/file2"; BOOST_CHECK(check_file_exists(file2) == true); // provide non-existent dir // (default answer from callback should be ABORT) BOOST_CHECK_THROW(setaccess.provideDir("/imnothere", 2), media::MediaFileNotFoundException); // This can't be properly tested with 'dir' schema, probably only curl // schemas (http, ftp) where download is actually needed. // Other schemas just get mounted onto a local dir and the whole subtree // is automatically available that way. // BOOST_CHECK(check_file_exists(dir + "/subdir/file") == false); // BOOST_CHECK(check_file_exists(dir + "/subdir") == false); } /* * Provide directory from src/cd1 (recursively). */ BOOST_AUTO_TEST_CASE(msa_provide_dirtree) { Url url = (DATADIR + "/src1/cd1").asUrl(); MediaSetAccess setaccess(url); Pathname dir = setaccess.provideDir("/dir", true, 1); Pathname file1 = dir + "/file1"; BOOST_CHECK(check_file_exists(file1) == true); Pathname file2 = dir + "/file2"; BOOST_CHECK(check_file_exists(file2) == true); Pathname file3 = dir + "/subdir/file"; BOOST_CHECK(check_file_exists(file3) == true); } /* * file exists local */ BOOST_AUTO_TEST_CASE(msa_file_exist_local) { Url url = (DATADIR + "/src1/cd1").asUrl(); MediaSetAccess setaccess(url); BOOST_CHECK(setaccess.doesFileExist("/test.txt")); BOOST_CHECK(!setaccess.doesFileExist("/testBADNAME.txt")); } template void msa_remote_tests_impl() { Server srv( DATADIR / "/src1/cd1", 10002 ); BOOST_REQUIRE( srv.start() ); MediaSetAccess setaccess( srv.url(), "/" ); BOOST_CHECK(!setaccess.doesFileExist("/testBADNAME.txt")); BOOST_CHECK(setaccess.doesFileExist("/test.txt")); // check providing a file via http works Pathname local = setaccess.provideFile("/test.txt"); BOOST_CHECK(CheckSum::sha1(sha1sum(local)) == CheckSum::sha1("2616e23301d7fcf7ac3324142f8c748cd0b6692b")); // providing a file which does not exist should throw BOOST_CHECK_THROW(setaccess.provideFile("/testBADNAME.txt"), media::MediaFileNotFoundException); Pathname fPath; { Url url = srv.url(); url.setPathName("/testBADNAME.txt"); // providing a file which does not exist should throw BOOST_CHECK_THROW(MediaSetAccess::provideFileFromUrl(url), media::MediaFileNotFoundException); url.setPathName("/test.txt"); //providing a file by static method, file should exist after method call ManagedFile file = MediaSetAccess::provideFileFromUrl( url ); fPath = file; BOOST_CHECK(check_file_exists(fPath) == true); } //file should be removed once the ManagedFile goes out of scope BOOST_CHECK(check_file_exists(fPath) == false); BOOST_CHECK(setaccess.doesFileExist("/test-big.txt")); BOOST_CHECK(setaccess.doesFileExist("dir/test-big.txt")); { // providing a file with wrong filesize should throw OnMediaLocation locPlain("dir/test-big.txt"); locPlain.setDownloadSize( zypp::ByteCount(500, zypp::ByteCount::B) ); BOOST_CHECK_THROW(setaccess.provideFile(locPlain), media::MediaFileSizeExceededException); // using the correct file size should NOT throw auto helper = [&](){ locPlain.setDownloadSize( zypp::ByteCount(7135, zypp::ByteCount::B) ); Pathname file = setaccess.provideFile( locPlain ); BOOST_CHECK(check_file_exists(file) == true); }; BOOST_CHECK_NO_THROW ( helper() ); } { // test the maximum filesize again with metalink downloads // providing a file with wrong filesize should throw OnMediaLocation locMeta("/test-big.txt"); locMeta.setDownloadSize( zypp::ByteCount(500, zypp::ByteCount::B) ); BOOST_CHECK_THROW(setaccess.provideFile(locMeta), media::MediaFileSizeExceededException); // using the correct file size should NOT throw locMeta.setDownloadSize( zypp::ByteCount(7135, zypp::ByteCount::B) ); Pathname file = setaccess.provideFile( locMeta ); BOOST_CHECK(check_file_exists(file) == true); } srv.stop(); } /* * file exists remote http */ BOOST_AUTO_TEST_CASE(msa_remote_tests_http) { msa_remote_tests_impl(); } /* * file exists remote ftp */ BOOST_AUTO_TEST_CASE(msa_remote_tests_ftp) { msa_remote_tests_impl(); } BOOST_AUTO_TEST_CASE(ftp_absolute_path) { FtpServer srv( DATADIR, 10002 ); BOOST_REQUIRE( srv.start() ); zypp::Url base = srv.url(); base.setPathName ( zypp::str::Str() << "//" << DATADIR ); MediaSetAccess setaccess( base, "/" ); OnMediaLocation loc( "/src1/cd1/test.txt" ); BOOST_CHECK_NO_THROW( setaccess.provideFile ( loc ) ); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/zypp/PathInfo_test.cc000066400000000000000000000141611476576476200206430ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using std::cout; using std::endl; using namespace zypp; using namespace zypp::filesystem; /** * Test case for * bool is_checksum( const Pathname & file, const CheckSum &checksum ); * std::string checksum( const Pathname & file, const std::string &algorithm ); */ BOOST_AUTO_TEST_CASE(pathinfo_checksum_test) { const char *buffer = "I will test the checksum of this"; TmpFile file; std::ofstream str(file.path().asString().c_str(),std::ofstream::out); if (!str.good()) ZYPP_THROW(Exception("cant open file")); str << buffer; str.flush(); str.close(); CheckSum file_sha1("sha1", "142df4277c326f3549520478c188cab6e3b5d042"); CheckSum file_md5("md5", "f139a810b84d82d1f29fc53c5e59beae"); BOOST_CHECK_EQUAL( checksum( file.path(), "sha1"), "142df4277c326f3549520478c188cab6e3b5d042" ); BOOST_CHECK_EQUAL( checksum( file.path(), "md5"), "f139a810b84d82d1f29fc53c5e59beae" ); BOOST_REQUIRE( is_checksum( file.path(), file_sha1 ) ); BOOST_REQUIRE( is_checksum( file.path(), file_md5 ) ); } BOOST_AUTO_TEST_CASE(pathinfo_is_exist_test) { TmpDir dir; Pathname subdir("text with spaces"); // create a fake file BOOST_CHECK_EQUAL( filesystem::mkdir(dir.path() + subdir), 0 ); Pathname filepath = (dir.path() + subdir+ "filename"); std::ofstream str(filepath.asString().c_str(),std::ofstream::out); str << "foo bar" << endl; str.flush(); str.close(); BOOST_CHECK( PathInfo(filepath).isExist() ); } BOOST_AUTO_TEST_CASE(pathipathinfo_misc_test) { TmpDir dir; PathInfo info(dir.path()); BOOST_CHECK(info.isDir()); } BOOST_AUTO_TEST_CASE(pathinfo_expandlink_test) { TmpDir dir; // ---- not a link // create a file Pathname file(dir / "file"); std::ofstream str(file.asString().c_str(),std::ofstream::out); str << "foo bar" << endl; str.flush(); str.close(); // expandlink should return the original Pathname if it does not point to a link BOOST_CHECK_EQUAL( file, filesystem::expandlink(file) ); // ---- valid link // create a (relative!) link to that file Pathname link1(dir / "link1"); BOOST_CHECK_EQUAL( filesystem::symlink(file.basename(), link1), 0); // does the link expand to the file? BOOST_CHECK_EQUAL( file, filesystem::expandlink(link1) ); // ---- broken link // create a link to a non-existent file Pathname brokenlink(dir / "brokenlink"); Pathname non_existent(dir / "non-existent"); BOOST_CHECK_EQUAL( filesystem::symlink(non_existent, brokenlink), 0); PathInfo info(brokenlink, PathInfo::LSTAT); BOOST_CHECK(info.isLink()); // expandlink should return an empty Pathname for a broken link BOOST_CHECK_EQUAL( Pathname(), filesystem::expandlink(brokenlink) ); // ---- cyclic link // make the 'non-existent' a link to 'brokenlink' :O) BOOST_CHECK_EQUAL( filesystem::symlink(brokenlink, non_existent), 0); // expandlink should return an empty Pathname for such a cyclic link BOOST_CHECK_EQUAL( Pathname(), filesystem::expandlink(brokenlink) ); BOOST_CHECK_EQUAL( Pathname(), filesystem::expandlink(non_existent) ); cout << brokenlink << " -> " << filesystem::expandlink(brokenlink) << endl; } BOOST_AUTO_TEST_CASE(test_assert_dir_file) { TmpDir root; Pathname rfile( root/"file" ); BOOST_CHECK_EQUAL( filesystem::assert_file( rfile ), 0 ); BOOST_CHECK( PathInfo(rfile).isFile() ); Pathname rdir ( root/"dir" ); BOOST_CHECK_EQUAL( filesystem::assert_dir ( rdir ), 0 ); BOOST_CHECK( PathInfo(rdir).isDir() ); // empty path Pathname path; BOOST_CHECK_EQUAL( filesystem::assert_file( path ), ENOENT ); BOOST_CHECK_EQUAL( filesystem::assert_dir ( path ), ENOENT ); // for dirs: // existing dir path = rdir; BOOST_CHECK_EQUAL( filesystem::assert_dir( path ), 0 ); BOOST_CHECK( PathInfo(path).isDir() ); // new dirs path = rdir/"sub/subsub"; BOOST_CHECK_EQUAL( filesystem::assert_dir( path ), 0 ); BOOST_CHECK( PathInfo(path).isDir() ); // file in path path = rfile/"sub"; BOOST_CHECK_EQUAL( filesystem::assert_dir( path ), ENOTDIR ); BOOST_CHECK( !PathInfo(path).isDir() ); // path is file path = rfile; BOOST_CHECK_EQUAL( filesystem::assert_dir( path ), EEXIST ); BOOST_CHECK( !PathInfo(path).isDir() ); // for files: // existing file path = rfile; BOOST_CHECK_EQUAL( filesystem::assert_file( path ), 0 ); BOOST_CHECK( PathInfo(path).isFile() ); // new file path = rdir/"sub/file"; BOOST_CHECK_EQUAL( filesystem::assert_file( path ), 0 ); BOOST_CHECK( PathInfo(path).isFile() ); // file in path path = rfile/"sub/file"; BOOST_CHECK_EQUAL( filesystem::assert_file( path ), ENOTDIR ); BOOST_CHECK( ! PathInfo(path).isFile() ); // path is dir path = rdir; BOOST_CHECK_EQUAL( filesystem::assert_file( path ), EEXIST ); BOOST_CHECK( ! PathInfo(path).isFile() ); } BOOST_AUTO_TEST_CASE(test_exchange) { TmpDir root; Pathname a; Pathname b; // paths must not be epmty: BOOST_CHECK_EQUAL( filesystem::exchange( a, b ), EINVAL ); a = root/"a/p"; BOOST_CHECK_EQUAL( filesystem::exchange( a, b ), EINVAL ); b = root/"b/p"; BOOST_CHECK_EQUAL( filesystem::exchange( a, b ), 0 ); // ok if both don't exist // one path not existing: filesystem::assert_file( a ); BOOST_CHECK( PathInfo(a).isFile() ); BOOST_CHECK( !PathInfo(b).isFile() ); BOOST_CHECK_EQUAL( filesystem::exchange( a, b ), 0 ); BOOST_CHECK( !PathInfo(a).isFile() ); BOOST_CHECK( PathInfo(b).isFile() ); BOOST_CHECK_EQUAL( filesystem::exchange( a, b ), 0 ); BOOST_CHECK( PathInfo(a).isFile() ); BOOST_CHECK( !PathInfo(b).isFile() ); // both paths exist: filesystem::assert_dir( b ); BOOST_CHECK( PathInfo(b).isDir() ); BOOST_CHECK_EQUAL( filesystem::exchange( a, b ), 0 ); BOOST_CHECK( PathInfo(a).isDir() ); BOOST_CHECK( PathInfo(b).isFile() ); BOOST_CHECK_EQUAL( filesystem::exchange( a, b ), 0 ); BOOST_CHECK( PathInfo(a).isFile() ); BOOST_CHECK( PathInfo(b).isDir() ); } libzypp-17.36.5/tests/zypp/Pathname_test.cc000066400000000000000000000135101476576476200206650ustar00rootroot00000000000000#include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; BOOST_AUTO_TEST_CASE(pathname_default_ctor) { Pathname p; BOOST_CHECK_EQUAL(p.empty(), true ); BOOST_CHECK_EQUAL(p.absolute(), false ); BOOST_CHECK_EQUAL(p.relative(), false ); BOOST_CHECK_EQUAL(p.dirname(), "" ); BOOST_CHECK_EQUAL(p.basename(), "" ); BOOST_CHECK_EQUAL(p.extension(), "" ); BOOST_CHECK_EQUAL(p.absolutename(), "" ); BOOST_CHECK_EQUAL(p.relativename(), "" ); } BOOST_AUTO_TEST_CASE(pathname_root) { Pathname p("/"); BOOST_CHECK_EQUAL(p.empty(), false ); BOOST_CHECK_EQUAL(p.absolute(), true ); BOOST_CHECK_EQUAL(p.relative(), false ); BOOST_CHECK_EQUAL(p.dirname(), "/" ); BOOST_CHECK_EQUAL(p.basename(), "/" ); BOOST_CHECK_EQUAL(p.extension(), "" ); BOOST_CHECK_EQUAL(p.absolutename(), "/" ); BOOST_CHECK_EQUAL(p.relativename(), "./" ); } BOOST_AUTO_TEST_CASE(pathname_this) { Pathname p("."); BOOST_CHECK_EQUAL(p.empty(), false ); BOOST_CHECK_EQUAL(p.absolute(), false ); BOOST_CHECK_EQUAL(p.relative(), true ); BOOST_CHECK_EQUAL(p.dirname(), "." ); BOOST_CHECK_EQUAL(p.basename(), "." ); BOOST_CHECK_EQUAL(p.extension(), "" ); BOOST_CHECK_EQUAL(p.absolutename(), "/" ); BOOST_CHECK_EQUAL(p.relativename(), "." ); } BOOST_AUTO_TEST_CASE(pathname_up) { Pathname p(".."); BOOST_CHECK_EQUAL(p.empty(), false ); BOOST_CHECK_EQUAL(p.absolute(), false ); BOOST_CHECK_EQUAL(p.relative(), true ); BOOST_CHECK_EQUAL(p.dirname(), "." ); BOOST_CHECK_EQUAL(p.basename(), ".." ); BOOST_CHECK_EQUAL(p.extension(), "" ); BOOST_CHECK_EQUAL(p.absolutename(), "/" ); BOOST_CHECK_EQUAL(p.relativename(), ".." ); } BOOST_AUTO_TEST_CASE(pathname_abs) { Pathname p("/foo/baa.ka"); BOOST_CHECK_EQUAL(p.empty(), false ); BOOST_CHECK_EQUAL(p.absolute(), true ); BOOST_CHECK_EQUAL(p.relative(), false ); BOOST_CHECK_EQUAL(p.dirname(), "/foo" ); BOOST_CHECK_EQUAL(p.basename(), "baa.ka" ); BOOST_CHECK_EQUAL(p.extension(), ".ka" ); BOOST_CHECK_EQUAL(p.absolutename(), "/foo/baa.ka" ); BOOST_CHECK_EQUAL(p.relativename(), "./foo/baa.ka" ); } BOOST_AUTO_TEST_CASE(pathname_rel) { Pathname p("./foo/./../baa.ka"); BOOST_CHECK_EQUAL(p.empty(), false ); BOOST_CHECK_EQUAL(p.absolute(), false ); BOOST_CHECK_EQUAL(p.relative(), true ); BOOST_CHECK_EQUAL(p.dirname(), "." ); BOOST_CHECK_EQUAL(p.basename(), "baa.ka" ); BOOST_CHECK_EQUAL(p.extension(), ".ka" ); BOOST_CHECK_EQUAL(p.absolutename(), "/baa.ka" ); BOOST_CHECK_EQUAL(p.relativename(), "./baa.ka" ); } BOOST_AUTO_TEST_CASE(pathname_relup) { Pathname p("./../foo/./../baa"); BOOST_CHECK_EQUAL(p.empty(), false ); BOOST_CHECK_EQUAL(p.absolute(), false ); BOOST_CHECK_EQUAL(p.relative(), true ); BOOST_CHECK_EQUAL(p.dirname(), ".." ); BOOST_CHECK_EQUAL(p.basename(), "baa" ); BOOST_CHECK_EQUAL(p.extension(), "" ); BOOST_CHECK_EQUAL(p.absolutename(), "/baa" ); BOOST_CHECK_EQUAL(p.relativename(), "../baa" ); } BOOST_AUTO_TEST_CASE(pathname_strval) { BOOST_CHECK_EQUAL(Pathname("").asString(), "" ); BOOST_CHECK_EQUAL(Pathname("/////./").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("./").asString(), "." ); BOOST_CHECK_EQUAL(Pathname("/.").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("./..").asString(), "./.." ); // ? .. BOOST_CHECK_EQUAL(Pathname("../").asString(), "./.." ); // ? .. BOOST_CHECK_EQUAL(Pathname(".././..").asString(), "./../.." ); // ? ../.. BOOST_CHECK_EQUAL(Pathname("//baa").asString(), "/baa" ); BOOST_CHECK_EQUAL(Pathname("/./baa").asString(), "/baa" ); BOOST_CHECK_EQUAL(Pathname("/baa/..").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/baa/../baa").asString(), "/baa" ); BOOST_CHECK_EQUAL(Pathname("/./../foo/./../baa").asString(), "/baa" ); BOOST_CHECK_EQUAL(Pathname("/").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname(".").asString(), "." ); BOOST_CHECK_EQUAL(Pathname("..").asString(), "./.." ); BOOST_CHECK_EQUAL(Pathname("/.").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/..").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/./.").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/./..").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/../.").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/../..").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/././").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/./../").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/.././").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("/../../").asString(), "/" ); BOOST_CHECK_EQUAL(Pathname("a\\b").asString(), "./a\\b" ); BOOST_CHECK_EQUAL(Pathname("a/b").asString(), "./a/b" ); BOOST_CHECK_EQUAL(Pathname("c:a\\b").asString(), "./c:a\\b" ); BOOST_CHECK_EQUAL(Pathname("c:a/b").asString(), "./c:a/b" ); BOOST_CHECK_EQUAL(Pathname("cc:a\\b").asString(), "./cc:a\\b" ); BOOST_CHECK_EQUAL(Pathname("cc:a/b").asString(), "./cc:a/b" ); } BOOST_AUTO_TEST_CASE(pathname_stripprefix) { BOOST_CHECK_EQUAL( Pathname::stripprefix( "", "" ), "" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "", "/" ), "/" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "", "/foo" ), "/foo" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/", "" ), "" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/", "/" ), "/" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/", "/foo" ), "/foo" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/f", "" ), "" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/f", "/" ), "/" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/f", "/foo" ), "/foo" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/foo", "" ), "" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/foo", "/" ), "/" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/foo", "/foo" ), "/" ); BOOST_CHECK_EQUAL( Pathname::stripprefix( "/foo", "/foo/baa" ), "/baa" ); } libzypp-17.36.5/tests/zypp/PluginFrame_test.cc000066400000000000000000000127611476576476200213500ustar00rootroot00000000000000#include #include #include #include #include "TestSetup.h" #include BOOST_AUTO_TEST_CASE(InitialSettings) { PluginScript::defaultTimeout( 3 ); } BOOST_AUTO_TEST_CASE(PluginFrameDefaultCtor) { PluginFrame f; BOOST_CHECK_EQUAL( bool(f), !f.empty() ); BOOST_CHECK_EQUAL( f.empty(), true ); BOOST_CHECK_EQUAL( f.command().empty(), true ); BOOST_CHECK_EQUAL( f.body().empty(), true ); BOOST_CHECK_EQUAL( f.headerEmpty(), true ); BOOST_CHECK_EQUAL( (f == f), true ); BOOST_CHECK_EQUAL( (f != f), false ); } BOOST_AUTO_TEST_CASE(PluginFrameCtorAssign) { PluginFrame f( "command" ); BOOST_CHECK_EQUAL( bool(f), !f.empty() ); BOOST_CHECK_EQUAL( f.empty(), false ); BOOST_CHECK_EQUAL( f.command(), "command" ); BOOST_CHECK_EQUAL( f.body().empty(), true ); BOOST_CHECK_EQUAL( f.headerEmpty(), true ); BOOST_CHECK_EQUAL( (f == f), true ); BOOST_CHECK_EQUAL( (f != f), false ); PluginFrame g( "command", "body" ); BOOST_CHECK_EQUAL( bool(g), !g.empty() ); BOOST_CHECK_EQUAL( g.empty(), false ); BOOST_CHECK_EQUAL( g.command(), "command" ); BOOST_CHECK_EQUAL( g.body().asString(), "body"); BOOST_CHECK_EQUAL( g.headerEmpty(), true ); BOOST_CHECK_EQUAL( (f == g), false ); BOOST_CHECK_EQUAL( (f != g), true ); PluginFrame h( g ); BOOST_CHECK_EQUAL( (g == h), true ); h.addHeader( "" ); // empty KV in header is ok, if you like it BOOST_CHECK_EQUAL( (g == h), false ); h.addHeader({ { "a", "a1" }, { "a", "a2" }, { "b", "b1" }, { "b", "b2" }, { "c", "c1" }, { "c", "c1" } }); BOOST_CHECK_EQUAL( h.headerSize(), 7 ); h.setHeader( "b", "b" ); // replaces existing 'b:" headers BOOST_CHECK_EQUAL( h.headerSize(), 6 ); // now write and reparse from stream: std::string data; { std::ostringstream datas; h.writeTo( datas ); datas.str().swap( data ); } std::istringstream datas( data ); PluginFrame i( datas ); BOOST_CHECK_EQUAL( (h == i), true ); } void doParse( const std::string & str_r ) { std::string data( str_r ); data.push_back( '\0' ); std::istringstream datas( data ); PluginFrame i( datas ); } BOOST_AUTO_TEST_CASE(PluginFrameExceptipn) { BOOST_CHECK_THROW( PluginFrame( "c\nc" ), PluginFrameException ); BOOST_CHECK_THROW( doParse( "c" ), PluginFrameException ); // no NL after command BOOST_CHECK_THROW( doParse( "c\n" ), PluginFrameException ); // no NL after header doParse( "c\n\n" ); // valid empy header and body BOOST_CHECK_THROW( doParse( "c\nh:v\nbody" ), PluginFrameException ); // no NL after header doParse( "c\nh:v\n\nbody" ); // valid BOOST_CHECK_THROW( doParse( "c\nhv\n\nbody" ), PluginFrameException ); // no : in header } BOOST_AUTO_TEST_CASE(PluginScriptTest) { PluginScript scr; BOOST_CHECK_EQUAL( scr.isOpen(), false ); BOOST_CHECK_EQUAL( scr.getPid(), PluginScript::NotConnected ); BOOST_CHECK_EQUAL( scr.script(), "" ); BOOST_CHECK_THROW( scr.open( "bla" ), PluginScriptException ); // script does not exist BOOST_CHECK_EQUAL( scr.isOpen(), false ); // stay closed BOOST_CHECK_EQUAL( scr.getPid(), PluginScript::NotConnected ); BOOST_CHECK_EQUAL( scr.script(), "" ); scr.open( "/bin/cat" ); BOOST_CHECK_EQUAL( scr.isOpen(), true ); BOOST_CHECK_EQUAL( (scr.getPid() != PluginScript::NotConnected ), true ); BOOST_CHECK_EQUAL( scr.script(), "/bin/cat" ); // set after successful open BOOST_CHECK_THROW( scr.open( "/bin/ls" ), PluginScriptException ); // already open BOOST_CHECK_EQUAL( scr.isOpen(), true ); // stay with "/bin/cat" BOOST_CHECK_EQUAL( (scr.getPid() != PluginScript::NotConnected ), true ); BOOST_CHECK_EQUAL( scr.script(), "/bin/cat" ); PluginFrame f; scr.send( f ); PluginFrame r( scr.receive() ); BOOST_CHECK_EQUAL( f, r ); f.setCommand( "CMD" ); f.addHeader( "a","value" ); f.setBody( "foo" ); scr.send( f ); r = scr.receive(); BOOST_CHECK_EQUAL( f, r ); scr.close(); BOOST_CHECK_EQUAL( scr.isOpen(), false ); BOOST_CHECK_EQUAL( scr.getPid(), PluginScript::NotConnected ); BOOST_CHECK_EQUAL( scr.script(), "/bin/cat" ); // not reset by close, may be reused by open() scr.close(); // no exception on dupl. close. } BOOST_AUTO_TEST_CASE(PluginScriptSend) { PluginFrame f( "a" ); f.setBody( std::string( 1020, '0' ) ); PluginScript scr( "/bin/cat" ); BOOST_CHECK_THROW( scr.send( f ), PluginScriptNotConnected ); scr.open(); BOOST_CHECK_THROW( do { scr.send( f ); } while ( true ), PluginScriptSendTimeout ); ::kill( scr.getPid(), SIGKILL); BOOST_CHECK_THROW( scr.send( f ), PluginScriptDiedUnexpectedly ); } BOOST_AUTO_TEST_CASE(PluginScriptReceive) { PluginFrame f( "a" ); f.setBody( std::string( 1020, '0' ) ); PluginScript scr( "/bin/cat" ); scr.open(); BOOST_CHECK_THROW( scr.receive(), PluginScriptReceiveTimeout ); ::kill( scr.getPid(), SIGKILL); BOOST_CHECK_THROW( scr.receive(), PluginScriptDiedUnexpectedly ); } BOOST_AUTO_TEST_CASE(PluginExecutorTest) { PluginExecutor exec; BOOST_CHECK_EQUAL( (bool)exec, !exec.empty() ); BOOST_CHECK_EQUAL( exec.empty(), true ); BOOST_CHECK_EQUAL( exec.size(), 0 ); exec.load( "/bin/cat" ); BOOST_CHECK_EQUAL( (bool)exec, !exec.empty() ); BOOST_CHECK_EQUAL( exec.empty(), false ); BOOST_CHECK_EQUAL( exec.size(), 1 ); exec.load( "/bin/cat" ); BOOST_CHECK_EQUAL( exec.size(), 2 ); exec.send( PluginFrame( "ACK" ) ); BOOST_CHECK_EQUAL( exec.size(), 2 ); exec.send( PluginFrame( "ERROR" ) ); BOOST_CHECK_EQUAL( exec.size(), 0 ); // deleted failing scripts } libzypp-17.36.5/tests/zypp/PoolQueryCC_test.cc000066400000000000000000000100521476576476200212730ustar00rootroot00000000000000#include "TestSetup.h" #include #include #include #include #define BOOST_TEST_MODULE PoolQuery_CC using boost::unit_test::test_case; using std::cin; using std::cout; using std::cerr; using std::endl; using namespace zypp; template std::ostream & nlist( std::ostream & str, const TCont & set_r ) { str << "[" << set_r.size() << "]: "; for ( const auto & solv : set_r ) str << " \"" << solv.name() << "\""; return str << endl; } ///////////////////////////////////////////////////////////////////////////// static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); test.loadTargetHelix( TESTS_SRC_DIR "/zypp/data/PoolQueryCC/rxnames.xml" ); nlist( cout << "repo ", ResPool::instance() ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); ///////////////////////////////////////////////////////////////////////////// // Basic issue: Multiple match strings are compiled into a singe regex. The // semantic of the individual match strings must be preserved. I.e. a literal // "." must become "\.". Globbing patterns must match the whole string, so they // need to be anchored within the regex. Etc. ///////////////////////////////////////////////////////////////////////////// static const unsigned qtestSIZEMISS = unsigned(-1); static const unsigned qtestRXFAIL = unsigned(-2); static const unsigned qtestRXFAILCOMB = unsigned(-3); unsigned qtest( const std::string & pattern_r, Match::Mode mode_r, bool verbose_r = false ) { static constexpr const bool noMatchInvalidRegexException = false; typedef std::set Result; PoolQuery q; q.addAttribute(sat::SolvAttr::name); switch ( mode_r ) { case Match::STRING: q.setMatchExact(); break; case Match::SUBSTRING: q.setMatchSubstring(); break; case Match::OTHER: q.setMatchWord(); break; // OTHER missused for matchWord() case Match::GLOB: q.setMatchGlob(); break; case Match::REGEX: q.setMatchRegex(); break; default: throw( "unhandled match mode" ); break; } q.addString( pattern_r ); Result o; try { o = Result( q.begin(), q.end() ); // original query } catch ( const zypp::MatchInvalidRegexException & excpt ) { cout << "Caught: " << excpt << endl; return qtestRXFAIL; } q.addString( "more" ); try { Result r( q.begin(), q.end() ); // compiles into RX (o|more) BOOST_CHECK( o == r ); if ( o != r || verbose_r ) { cout << '"' << pattern_r << "\" " << mode_r << endl; nlist( cout << " o", o ); nlist( cout << " r", r ); if ( ! verbose_r ) return qtestSIZEMISS; } } catch ( const zypp::MatchInvalidRegexException & excpt ) { BOOST_CHECK( noMatchInvalidRegexException ); cout << "Caught: " << excpt << endl; return qtestRXFAILCOMB; } return o.size(); } inline unsigned qtest( const std::string & pattern_r, bool verbose_r = false ) { return qtest( pattern_r, Match::SUBSTRING, verbose_r ); } ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(pool_query_init) { // NOTE: qtest( , Match::OTHER ) is missused for matchWord() BOOST_CHECK_EQUAL( qtest( "?", Match::SUBSTRING ), 1 ); BOOST_CHECK_EQUAL( qtest( "?", Match::STRING ), 1 ); BOOST_CHECK_EQUAL( qtest( "?", Match::OTHER ), 0 ); // not word boundary BOOST_CHECK_EQUAL( qtest( "?", Match::GLOB ), 15 ); BOOST_CHECK_EQUAL( qtest( "\\?", Match::GLOB ), 1 ); BOOST_CHECK_EQUAL( qtest( "?", Match::REGEX ), qtestRXFAIL ); BOOST_CHECK_EQUAL( qtest( "\\?", Match::REGEX ), 1 ); BOOST_CHECK_EQUAL( qtest( "A", Match::SUBSTRING ), 4 ); BOOST_CHECK_EQUAL( qtest( "A", Match::OTHER ), 2 ); BOOST_CHECK_EQUAL( qtest( "A*", Match::OTHER ), 0 ); BOOST_CHECK_EQUAL( qtest( "*A", Match::OTHER ), 0 ); BOOST_CHECK_EQUAL( qtest( "A*", Match::GLOB ), 2 ); BOOST_CHECK_EQUAL( qtest( "*A", Match::GLOB ), 1 ); } ///////////////////////////////////////////////////////////////////////////// libzypp-17.36.5/tests/zypp/PoolQuery_test.cc000066400000000000000000000662561476576476200211060ustar00rootroot00000000000000#include "TestSetup.h" #include #include #define BOOST_TEST_MODULE PoolQuery ///////////////////////////////////////////////////////////////////////////// static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( Arch_x86_64 ); // Abuse;) vbox as System repo: test.loadTargetRepo( TESTS_SRC_DIR "/data/obs_virtualbox_11_1" ); test.loadRepo( TESTS_SRC_DIR "/data/openSUSE-11.1", "opensuse" ); test.loadRepo( TESTS_SRC_DIR "/data/OBS_zypp_svn-11.1", "zyppsvn" ); dumpRange( USR, test.pool().knownRepositoriesBegin(), test.pool().knownRepositoriesEnd() ); USR << "pool: " << test.pool() << endl; } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); ///////////////////////////////////////////////////////////////////////////// static std::ofstream devNull; #define COUT devNull struct PrintAndCount { PrintAndCount() : _count(0) {} bool operator()( const sat::Solvable & solvable ) { zypp::PoolItem pi( zypp::ResPool::instance().find( solvable ) ); COUT << pi.resolvable() << endl; ++_count; return true; } unsigned _count; }; void dumpQ( std::ostream & str, const PoolQuery & q, bool verbose = true ) { q.begin(); str << q << endl; unsigned nc = 0; if ( 1 ) { for_( it, q.begin(), q.end() ) { ++nc; if ( verbose ) str << it << endl; } str << "--> MATCHES: " << nc << endl; } } #if 0 BOOST_AUTO_TEST_CASE(pool_query_experiment) { cout << "****experiment****" << endl; PoolQuery q; q.addString("zypper"); q.addAttribute(sat::SolvAttr::name); // should list 1 selectable? cout << "****selectables****" << endl; for (PoolQuery::Selectable_iterator it = q.selectableBegin(); it != q.selectableEnd(); ++it) { ui::Selectable::Ptr s = *it; cout << s->kind() << ":" << s->name() << " hasinstalled: " << s->installedEmpty() << endl; } cout << "****solvables****" << endl; PrintAndCount cb; std::for_each(q.begin(), q.end(), cb); } #endif ///////////////////////////////////////////////////////////////////////////// // 0xx basic queries ///////////////////////////////////////////////////////////////////////////// // no conditions, default query // result: all available resolvables BOOST_AUTO_TEST_CASE(pool_query_000) { cout << "****000****" << endl; PoolQuery q; cout << q.size() << endl; BOOST_CHECK(q.size() == 3811); /* dumpsolv repo1.solv repo2.solv repo3.solv | \ grep '^name:.*\(noarch\|x86_64\|i386\|i586\|i686\|src\)$' | wc -l */ } // default query + one search string // q.addString("foo"); // result: all resolvables having at least one attribute matching foo BOOST_AUTO_TEST_CASE(pool_query_001) { cout << "****001****" << endl; PoolQuery q; q.addString("zypper"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 11); } // default query + one attribute + one string // q.addAttribute(foo, bar); // should be the same as // q.addAttribute(foo); q.addString(bar); // result: resolvables with foo containing bar BOOST_AUTO_TEST_CASE(pool_query_002) { cout << "****002****" << endl; PoolQuery q; q.addString("zypper"); q.addAttribute(sat::SolvAttr::name); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 5); cout << endl; PoolQuery q1; q1.addAttribute(sat::SolvAttr::name, "zypper"); BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 5); } // kind filter BOOST_AUTO_TEST_CASE(pool_query_003) { cout << "****003****" << endl; PoolQuery q; q.addString("zypper"); q.addAttribute(sat::SolvAttr::name); q.addKind(ResKind::package); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 3); } // match exact BOOST_AUTO_TEST_CASE(pool_query_004) { cout << "****004****" << endl; PoolQuery q; q.addString("vim"); q.addAttribute(sat::SolvAttr::name); q.setMatchExact(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1); PoolQuery q1; q1.addString("zypp"); q1.addAttribute(sat::SolvAttr::name); q1.setMatchExact(); std::for_each(q1.begin(), q1.end(), PrintAndCount()); BOOST_CHECK(q1.empty()); } // use globs BOOST_AUTO_TEST_CASE(pool_query_005) { cout << "****005.1****" << endl; PoolQuery q; q.addString("z?p*"); q.addAttribute(sat::SolvAttr::name); q.setMatchGlob(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6); cout << "****005.2****" << endl; PoolQuery q1; q1.addString("*zypp*"); q1.addAttribute(sat::SolvAttr::name); q1.setMatchGlob(); BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 26); cout << "****005.3****" << endl; // should be the same as above PoolQuery q2; q2.addString("zypp"); q2.addAttribute(sat::SolvAttr::name); BOOST_CHECK(q2.size() == 26); } // use regex BOOST_AUTO_TEST_CASE(pool_query_006) { cout << "****006.1***" << endl; // should be the same as 005 1 PoolQuery q; q.addString("^z.p.*"); q.addAttribute(sat::SolvAttr::name); q.setMatchRegex(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6); cout << "****006.2***" << endl; PoolQuery q1; q1.addString("zypper|smart"); q1.addAttribute(sat::SolvAttr::name); q1.setMatchRegex(); BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 8); cout << "****006.3***" << endl; // invalid regex PoolQuery q2; q2.addString("zypp\\"); q2.setMatchRegex(); BOOST_CHECK_THROW(q2.begin(), Exception); } // match whole words BOOST_AUTO_TEST_CASE(pool_query_007) { cout << "****007***" << endl; PoolQuery q; q.addString("zypp"); q.addAttribute(sat::SolvAttr::name); q.setMatchWord(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6); } // match by installed status (basically by system vs. repo) BOOST_AUTO_TEST_CASE(pool_query_050) { cout << "****050****" << endl; PoolQuery q; q.addString("yasm"); q.addAttribute(sat::SolvAttr::name); q.setMatchExact(); q.setInstalledOnly(); BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 4); cout << endl; PoolQuery q1; q1.addString("zypper"); q1.addAttribute(sat::SolvAttr::name); q1.setMatchExact(); q1.setUninstalledOnly(); BOOST_CHECK_EQUAL(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count, 5); } ///////////////////////////////////////////////////////////////////////////// // 1xx multiple attribute queries ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(pool_query_100) { cout << "****100****" << endl; PoolQuery q; /* This string is found sometimes only in only in summary (e.g. pgcalc) and sometimes only in description (e.g. bc, lftp). We don't have any package with 'revers' only in package name, but let's ignore this. I didn't find a string with the same characteristics giving fewer matches :-/ */ q.addString("revers"); q.addAttribute(sat::SolvAttr::name); q.addAttribute(sat::SolvAttr::summary); q.addAttribute(sat::SolvAttr::description); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 5); cout << endl; { PoolQuery q1; q1.addAttribute(sat::SolvAttr::name, "zypper"); BOOST_CHECK_EQUAL(q1.size(),5); PoolQuery q2; q2.addAttribute(sat::SolvAttr::summary,"samba"); BOOST_CHECK_EQUAL(q2.size(),13); // now summary and name in one go: q1.addAttribute(sat::SolvAttr::summary,"samba"); BOOST_CHECK_EQUAL(q1.size(),18); } } // multi attr (same value) substring matching (case sensitive and insensitive) BOOST_AUTO_TEST_CASE(pool_query_101) { cout << "****101****" << endl; PoolQuery q; q.addString("RELAX"); q.addAttribute(sat::SolvAttr::name); q.addAttribute(sat::SolvAttr::summary); q.addAttribute(sat::SolvAttr::description); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 7); cout << endl; PoolQuery q2; q2.addString("RELAX"); q2.addAttribute(sat::SolvAttr::name); q2.addAttribute(sat::SolvAttr::summary); q2.addAttribute(sat::SolvAttr::description); q2.setCaseSensitive(); BOOST_CHECK(std::for_each(q2.begin(), q2.end(), PrintAndCount())._count == 4); } // multi attr (same value) glob matching (case sensitive and insensitive) BOOST_AUTO_TEST_CASE(pool_query_102) { cout << "****102****" << endl; PoolQuery q; q.addString("pack*"); q.addAttribute(sat::SolvAttr::name); q.addAttribute(sat::SolvAttr::summary); q.setMatchGlob(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 23); } // multi attr (same value via addAttribute()) BOOST_AUTO_TEST_CASE(pool_query_103) { cout << "****103.1****" << endl; PoolQuery q; q.addAttribute(sat::SolvAttr::name, "rest"); q.addAttribute(sat::SolvAttr::summary, "rest"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 14); cout << "****103.2****" << endl; PoolQuery q1; q1.addString("rest"); q1.addAttribute(sat::SolvAttr::name); q1.addAttribute(sat::SolvAttr::summary); BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 14); // BOOST_CHECK(q1.size() == 42); cout << endl; } // multiple attributes, different search strings (one string per attrbute) BOOST_AUTO_TEST_CASE(pool_query_104) { cout << "****104****" << endl; PoolQuery q; q.addAttribute(sat::SolvAttr::name, "zypper"); q.addAttribute(sat::SolvAttr::summary, "package management"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 8); } // multiple attributes, different search strings (one string per attrbute), regex matching BOOST_AUTO_TEST_CASE(pool_query_105) { cout << "****105****" << endl; PoolQuery q; q.addAttribute(sat::SolvAttr::name, "zy..er"); q.addAttribute(sat::SolvAttr::summary, "package management"); q.setMatchRegex(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 8); } ///////////////////////////////////////////////////////////////////////////// // 3xx repo filter queries (addRepo(alias_str)) ///////////////////////////////////////////////////////////////////////////// // default query + one attribute(one string) + one repo BOOST_AUTO_TEST_CASE(pool_query_300) { cout << "****300****" << endl; PoolQuery q; q.addAttribute(sat::SolvAttr::name, "zypper"); q.addRepo("zyppsvn"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 4); } // default query + one repo BOOST_AUTO_TEST_CASE(pool_query_301) { cout << "****301****" << endl; PoolQuery q; q.addRepo("zyppsvn"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 42); } // multiple repos + one attribute BOOST_AUTO_TEST_CASE(pool_query_302) { cout << "****302****" << endl; PoolQuery q; q.addString("zypper"); q.addAttribute(sat::SolvAttr::name); q.addRepo("opensuse"); q.addRepo("zyppsvn"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 5); } ///////////////////////////////////////////////////////////////////////////// // 4xx kind queries (addKind(ResKind)) ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(pool_query_400) { cout << "****400****" << endl; PoolQuery q; q.addString("lamp_server"); q.addAttribute(sat::SolvAttr::name); q.addKind(ResKind::pattern); q.setMatchExact(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1); } // should find packages and patterns BOOST_AUTO_TEST_CASE(pool_query_401) { cout << "****401****" << endl; PoolQuery q; q.addString("mail*"); q.addAttribute(sat::SolvAttr::name); q.setMatchGlob(); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 4); } ///////////////////////////////////////////////////////////////////////////// // 5xx multiple string/attribute queries ///////////////////////////////////////////////////////////////////////////// // multiple strings for one attribute BOOST_AUTO_TEST_CASE(pool_query_500) { cout << "****500.1****" << endl; PoolQuery q; q.addString("zypper"); q.addString("yast2-packager"); q.addAttribute(sat::SolvAttr::name); q.setMatchExact(); // creates: ^(apt|zypper)$ BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 6); cout << "****500.2****" << endl; q.addString("*bzypp"); q.setMatchGlob(); // creates: ^(.*zy.p|yast.*package.*|.*bzypp)$ BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 11); cout << "****500.3****" << endl; PoolQuery q1; q1.addString("^libsm[a-z]*[0-9]$"); q1.addAttribute(sat::SolvAttr::name, "bzypp$"); q1.addKind(ResKind::package); q1.setMatchRegex(); // creates: (^libsm[a-z]*[0-9]$|bzypp$) BOOST_CHECK(std::for_each(q1.begin(), q1.end(), PrintAndCount())._count == 5); cout << "****500.4****" << endl; PoolQuery q2; q2.addString("Thunder"); q2.addAttribute(sat::SolvAttr::name, "sun"); q2.addKind(ResKind::package); q2.addRepo("opensuse"); q2.setCaseSensitive(); // creates: (sun|Thunder) BOOST_CHECK(std::for_each(q2.begin(), q2.end(), PrintAndCount())._count == 3); cout << "****500.5****" << endl; PoolQuery q3; q3.addString("audio"); q3.addAttribute(sat::SolvAttr::name, "zip"); q3.addKind(ResKind::package); q3.addRepo("opensuse"); q3.setMatchWord(); // creates: \b(zip|audio)\b BOOST_CHECK(std::for_each(q3.begin(), q3.end(), PrintAndCount())._count == 3); } // multiple strings, multiple attributes, same strings BOOST_AUTO_TEST_CASE(pool_query_501) { cout << "****501****" << endl; PoolQuery q; q.addString("Thunder"); q.addString("storm"); q.addAttribute(sat::SolvAttr::name); q.addAttribute(sat::SolvAttr::description); q.addKind(ResKind::package); q.addRepo("opensuse"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 14); } // multiple strings, multiple attributes, same strings BOOST_AUTO_TEST_CASE(pool_query_502) { cout << "****502****" << endl; PoolQuery q; q.addString("weather"); q.addAttribute(sat::SolvAttr::name, "thunder"); q.addAttribute(sat::SolvAttr::description, "storm"); q.addKind(ResKind::package); q.addRepo("opensuse"); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 13); } ///////////////////////////////////////////////////////////////////////////// // 6xx queries with edition ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(pool_query_X) { cout << "****600.1****" << endl; PoolQuery q; q.addAttribute(sat::SolvAttr::name, "zypper"); q.setMatchExact(); q.setEdition(Edition("0.12.5"), Rel::GT); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 4); cout << "****600.2****" << endl; q.setEdition(Edition("0.12.5"), Rel::LT); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 0); cout << "****600.3****" << endl; q.setEdition(Edition("0.12.5"), Rel::LE); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1); cout << "****600.4****" << endl; q.setEdition(Edition("0.12.5-5"), Rel::LT); BOOST_CHECK(std::for_each(q.begin(), q.end(), PrintAndCount())._count == 1); } BOOST_AUTO_TEST_CASE(pool_query_X1) { cout << "****601.****" << endl; PoolQuery q; q.addString("zypper"); q.addAttribute(sat::SolvAttr::name ); BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 5); q.setEdition(Edition("0.12.8"), Rel::GE); BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 4); } BOOST_AUTO_TEST_CASE(pool_query_X2) { cout << "****X****" << endl; PoolQuery q; q.setMatchGlob(); q.addString("zypp*"); q.addAttribute(sat::SolvAttr::name); BOOST_CHECK_EQUAL(std::for_each(q.begin(), q.end(), PrintAndCount())._count, 5); } BOOST_AUTO_TEST_CASE(pool_query_recovery) { Pathname testfile(TESTS_SRC_DIR); testfile += "/zypp/data/PoolQuery/savedqueries"; cout << "****recovery****" << endl; std::vector queries; std::insert_iterator > ii( queries,queries.begin()); readPoolQueriesFromFile(testfile,ii); BOOST_REQUIRE_MESSAGE(queries.size() == 2, "Bad count of read queries."); BOOST_CHECK_EQUAL(queries[0].size(), 8); PoolQuery q; q.addString("ma*"); q.addRepo("opensuse"); q.addKind(ResKind::patch); q.setMatchRegex(); q.setCaseSensitive(); q.setUninstalledOnly(); q.setEdition(Edition("0.8.3"),Rel::NE); BOOST_CHECK(q == queries[1]); } BOOST_AUTO_TEST_CASE(pool_predicated_matcher) { cout << "****predicated_matcher****" << endl; { PoolQuery q; q.setMatchExact(); q.addDependency( sat::SolvAttr::name, "zy*", Rel::ANY, Edition(), Arch_empty ); BOOST_CHECK_EQUAL( q.size(), 0 ); q.addDependency( sat::SolvAttr::name, "zy*", Rel::ANY, Edition(), Arch_empty, Match::GLOB ); BOOST_CHECK_EQUAL( q.size(), 5 ); // 5 more q.addDependency( sat::SolvAttr::name, "^kde.*-zh", Rel::ANY, Edition(), Arch_noarch, Match::REGEX ); BOOST_CHECK_EQUAL( q.size(), 9 ); // 4 more q.addDependency( sat::SolvAttr::name, "kde.*-zh", Rel::ANY, Edition(), Arch_noarch, Match::REGEX ); BOOST_CHECK_EQUAL( q.size(), 10 ); // 1 more } } BOOST_AUTO_TEST_CASE(pool_query_serialize) { std::vector queries; { PoolQuery q; q.addString( "ma" ); q.addAttribute( sat::SolvAttr::name ); q.addRepo( "factory-nonoss" ); q.addRepo( "zypp_svn" ); queries.push_back( q ); } { PoolQuery q; q.addAttribute( sat::SolvAttr::name, "ma" ); q.addRepo( "factory-nonoss" ); q.addRepo( "zypp_svn" ); queries.push_back( q ); } { PoolQuery q; q.setMatchExact(); q.addAttribute( sat::SolvAttr::name, "ma" ); q.addDependency( sat::SolvAttr::name, "nn", Rel::EQ, Edition("nne-nnr"), Arch_noarch ); q.addDependency( sat::SolvAttr::name, "nx", Rel::EQ, Edition("nxe-nxr"), Arch_noarch, Match::REGEX ); q.addDependency( sat::SolvAttr::dep_requires, "rn", Rel::EQ, Edition("rne-rnr"), Arch_noarch ); q.addDependency( sat::SolvAttr::dep_requires, "rx", Rel::EQ, Edition("rxe-rxr"), Arch_noarch, Match::GLOB ); queries.push_back( q ); } cout << "****serialize****" << endl; // filesystem::TmpFile testfile; Pathname testfile( "/tmp/testfile" ); writePoolQueriesToFile( testfile, queries.begin(), queries.end() ); std::vector recovered; std::insert_iterator> ii( recovered, recovered.end() ); readPoolQueriesFromFile( testfile, ii ); BOOST_REQUIRE_EQUAL( queries.size(), recovered.size() ); for ( unsigned i = 0U; i < queries.size(); ++i ) { BOOST_CHECK_EQUAL( queries[i], recovered[i] ); } } // test matching BOOST_AUTO_TEST_CASE(pool_query_equal) { cout << "****equal****" << endl; std::vector v; { PoolQuery q; v.push_back( q ); } { PoolQuery q; q.addAttribute( sat::SolvAttr::name, "zypper" ); q.setMatchExact(); q.setCaseSensitive(true); v.push_back( q ); } { PoolQuery q; q.addAttribute( sat::SolvAttr::name, "libzypp" ); // different q.setMatchExact(); q.setCaseSensitive(true); v.push_back( q ); } { PoolQuery q; q.addAttribute( sat::SolvAttr::vendor, "zypper" ); // different q.setMatchExact(); q.setCaseSensitive(true); v.push_back( q ); } { PoolQuery q; q.addAttribute( sat::SolvAttr::name, "zypper" ); q.setMatchExact(); q.setCaseSensitive(false); // different v.push_back( q ); } { PoolQuery q; q.addAttribute( sat::SolvAttr::name, "zypper" ); q.setMatchSubstring(); // different q.setCaseSensitive(true); v.push_back( q ); } { PoolQuery q; q.addDependency( sat::SolvAttr::dep_provides, "zypper" ); v.push_back( q ); } { PoolQuery q; q.addDependency( sat::SolvAttr::dep_provides, "zypper", Rel::GT, Edition("1.0") ); v.push_back( q ); } { PoolQuery q; q.addDependency( sat::SolvAttr::dep_provides, "zypper", Rel::GT, Edition("2.0") ); v.push_back( q ); } for (size_t li = 0; li < v.size(); ++li) { for (size_t ri = 0; ri < v.size(); ++ri) { COUT << li << " <> " << ri << endl; bool equal( v[li] == v[ri] ); bool nequal( v[li] != v[ri] ); BOOST_CHECK_EQUAL( equal, li==ri ); BOOST_CHECK_EQUAL( equal, !nequal ); } } } ///////////////////////////////////////////////////////////////////////////// // Dependency Query ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(addDependency) { { cout << "****addDependency1****" << endl; PoolQuery q; q.setCaseSensitive( false ); q.setMatchSubstring(); q.addString( "libzypp" ); q.addDependency( sat::SolvAttr::dep_provides, "FOO" ); // ! finds 'perl(CPAN::InfoObj)' 'foO' std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 13 ); } { cout << "****addDependency2****" << endl; PoolQuery q; q.setCaseSensitive( false ); q.setMatchSubstring(); q.addString( "libzypp" ); q.addDependency( sat::SolvAttr::dep_provides, "FOO", Rel::GT, Edition("5.0") ); std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 7 ); } { cout << "****addDependency2a****" << endl; PoolQuery q; q.setCaseSensitive( false ); q.setMatchSubstring(); q.addDependency( sat::SolvAttr::dep_provides, "libzypp", Rel::GT, Edition("5.0") ); q.addAttribute( sat::SolvAttr::arch, Arch_i586.asString() ); // OR with arch i585 std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 66 ); } { cout << "****addDependency2b****" << endl; PoolQuery q; q.setCaseSensitive( false ); q.setMatchSubstring(); // libzypp provides yast2-packagemanager... q.addDependency( sat::SolvAttr::dep_provides, "yast2-packagemanager", Rel::GT, Edition("5.0"), Arch_i586 ); // AND with arch i585 std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 2 ); } { cout << "****addDependency2c****" << endl; PoolQuery q; q.setCaseSensitive( false ); q.setMatchSubstring(); // but no package named yast2-packagemanager q.addDependency( sat::SolvAttr::name, "yast2-packagemanager", Rel::GT, Edition("5.0"), Arch_i586 ); // AND with arch i585 std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 0 ); } { cout << "****addDependency2d****" << endl; PoolQuery q; q.setCaseSensitive( false ); q.setMatchSubstring(); // libzypp provides yast2-packagemanager... q.addDependency( sat::SolvAttr::dep_provides, "yast2-packagemanager", Arch_i586 ); // AND with arch i585 std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 2 ); } { cout << "****addDependency2e****" << endl; PoolQuery q; q.setCaseSensitive( false ); q.setMatchSubstring(); // but no package named yast2-packagemanager q.addDependency( sat::SolvAttr::name, "yast2-packagemanager", Arch_i586 ); // AND with arch i585 std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 0 ); } { cout << "****addDependency3****" << endl; PoolQuery q; // includes wine q.addDependency( sat::SolvAttr::dep_provides, "kernel" ); std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 12 ); } { cout << "****addDependency4****" << endl; PoolQuery q; // no wine q.addDependency( sat::SolvAttr::name, "kernel" ); std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 11 ); } { cout << "****addDependency5****" << endl; PoolQuery q; // Capability always matches exact q.addDependency( sat::SolvAttr::dep_provides, Capability("kernel") ); std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 2 ); } { cout << "****addDependency6****" << endl; PoolQuery q; // non dependecy + Capability matches solvable name! q.addDependency( sat::SolvAttr::summary, Capability("kernel") ); std::for_each(q.begin(), q.end(), PrintAndCount()); //dumpQ( std::cout, q ); BOOST_CHECK_EQUAL( q.size(), 0 ); // non dependecy } } namespace { std::string q2str( const PoolQuery & q_r ) { str::Str s; q_r.serialize( s.stream() ); return s; } template void str2q( const std::string & s_r, OutputIterator out_r ) { std::istringstream s( s_r ); do { PoolQuery q; if ( q.recover( s ) ) *out_r++ = std::move(q); else break; } while ( true ); } typedef std::set Pqs; PoolQuery str2q( const std::string & s_r ) { Pqs ret; str2q( s_r, std::insert_iterator( ret, ret.end() ) ); return *ret.begin(); } std::string serialized( const std::string & arg_r ) { return "\n" + arg_r + "\n\n"; } template std::string serialized( const std::string & arg_r, Args... args_r ) { return "\n" + arg_r + serialized( args_r... ); } void testSerializeAndBack( const PoolQuery & q_r, const PoolQuery & expect_r, bool equal_r = true ) { static unsigned i = 0; std::string s { q2str( q_r ) }; PoolQuery q { str2q( s ) }; BOOST_CHECK_EQUAL( (q == expect_r), equal_r ); if ( ++i && (q == expect_r) != equal_r ) { cout << "+++" << endl; cout << q << endl; cout << "=== " << i << " ^v SerializeAndBack == " << equal_r << endl; cout << expect_r << endl; cout << "---" << endl; } } } BOOST_AUTO_TEST_CASE(zypperLocksSerialize) { // Fix/cleanup zypper locks (old style, new stule, complex) (bsc#1112911) // As you may notice: locks (by now) ignore any arch component cout << "****zypperLocksSerialize****" << endl; std::string n { "n*" }; Rel o { Rel::EQ }; Edition e { "v", "r", 1 }; Arch a { "a" }; { // old style // solvable_name: n* PoolQuery oldq; oldq.addAttribute( sat::SolvAttr::name, n ); testSerializeAndBack( oldq, oldq ); { // new style PoolQuery q; q.addDependency( sat::SolvAttr::name, n, Rel::ANY, Edition(), Arch_empty ); testSerializeAndBack( q, oldq ); } { // new style + arch rule however stays complex PoolQuery q; q.addDependency( sat::SolvAttr::name, n, Rel::ANY, Edition(), a ); testSerializeAndBack( q, oldq, false ); testSerializeAndBack( q, q ); } } { // old style // solvable_name: n* // version: == 1:v-r PoolQuery oldq; oldq.addAttribute( sat::SolvAttr::name, n ); oldq.setEdition( e, o ); testSerializeAndBack( oldq, oldq ); { // new style PoolQuery q; q.addDependency( sat::SolvAttr::name, n, o, e, Arch_empty ); testSerializeAndBack( q, oldq ); } { // new style + arch rule however stays complex PoolQuery q; q.addDependency( sat::SolvAttr::name, n, o, e, a ); testSerializeAndBack( q, oldq, false ); testSerializeAndBack( q, q ); } } } libzypp-17.36.5/tests/zypp/ProgressData_test.cc000066400000000000000000000061101476576476200215240ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include using boost::unit_test::test_case; using std::cout; using std::endl; using namespace zypp; BOOST_AUTO_TEST_CASE(progressdata_test) { { ProgressData progress(100); CombinedProgressData sub1rcv(progress, 80); ProgressData sub1progress(100); sub1progress.sendTo(sub1rcv); // task 1 goes to 50% sub1progress.set(50); // which is 50% of 80% in task 1 BOOST_CHECK_EQUAL( progress.val(), 40 ); } { ProgressData progress(40000); CombinedProgressData sub2rcv(progress, 10000); ProgressData sub2progress(500); sub2progress.sendTo(sub2rcv); sub2progress.set(250); // which is 50% of 80% in task 1 BOOST_CHECK_EQUAL( progress.val(), 5000 ); } { ProgressData progress(20000,60000); CombinedProgressData sub2rcv(progress, 10000); ProgressData sub2progress(500); sub2progress.sendTo(sub2rcv); sub2progress.set(250); // which is 50% of 80% in task 1 BOOST_CHECK_EQUAL( progress.val(), 25000 ); } } // Check expected ProgressReport triggers: // none | (start progress) progress* (progress end) struct PReceive : public callback::ReceiveReport { int frame = 0; // 0 -start-> 1(progress) -finish-> 2 int pings = 0; // count progress triggers void reportbegin() override { // cout << "REPORT+++" << endl; frame = pings = 0; } void start( const ProgressData & task ) override { // cout << "REPBEG " << task << " " << frame <<":"<< pings << endl; BOOST_CHECK_EQUAL( frame, 0 ); BOOST_CHECK_EQUAL( pings, 0 ); frame = 1; pings -= 1; // start must be followed by 1 progress } bool progress( const ProgressData & task ) override { // cout << "REP... " << task << " " << frame <<":"<< pings << endl; BOOST_CHECK_EQUAL( frame, 1 ); // progress pings += 1; return true; } void finish( const ProgressData & task ) override { // cout << "REPEND " << task << " " << frame <<":"<< pings << endl; BOOST_CHECK_EQUAL( frame, 1 ); frame = 2; pings -= 1; // finish must be preceded by 1 progress } void reportend() override { // cout << "REPORT--- " << " " << frame <<":"<< pings << endl; BOOST_CHECK( ( frame == 0 && pings == 0 ) || ( frame == 2 && pings >= 0 ) ); } }; BOOST_AUTO_TEST_CASE(progress_report) { PReceive preceive; preceive.connect(); { callback::SendReport report; ProgressData ticks; ticks.sendTo( ProgressReportAdaptor( report ) ); ticks.range( 5 ); } BOOST_CHECK_EQUAL( preceive.frame, 0 ); // If no value was set no reports were sent. { callback::SendReport report; ProgressData ticks; ticks.sendTo( ProgressReportAdaptor( report ) ); ticks.range( 5 ); ticks.toMin(); ticks.set(3); ticks.toMax(); } BOOST_CHECK_EQUAL( preceive.frame, 2 ); // Values were set, so finish was sent. } libzypp-17.36.5/tests/zypp/Proxy_test.cc000066400000000000000000000015411476576476200202520ustar00rootroot00000000000000#include #include #include // compile time check that the libproxy API in the distro we are building against // is actually what we want BOOST_AUTO_TEST_CASE(proxy_api) { static_assert( std::is_same_v > ); static_assert( std::is_same_v > ); static_assert( std::is_same_v > ); #ifdef LIBPROXY_HAVE_FREE_PROXIES static_assert( std::is_same_v ); #endif // make sure symbols can be resolved BOOST_REQUIRE( zypp::media::ProxyInfoLibproxy::isAvailabe() ); } libzypp-17.36.5/tests/zypp/PtrTypes_test.cc000066400000000000000000000103641476576476200207260ustar00rootroot00000000000000#include #include #include #include #include #include #define BOOST_TEST_MODULE PtrTypes using std::endl; using namespace zypp; using namespace zypp::base; #define TRACE_TAG DBG << this->numericId() << " " << __PRETTY_FUNCTION__ << endl /** Logs Ctor, CopyCtor, Assign and Dtor. */ template struct Trace : public ProvideNumericId { Trace() { TRACE_TAG; } Trace( const Trace & ) { TRACE_TAG; } ~Trace() { TRACE_TAG; } Trace & operator=( const Trace & ) { TRACE_TAG; return *this; } }; /** Data class for shared_ptr */ struct NonIntrusive : private Trace { using Trace::numericId; }; /** Data class for intrusive_ptr */ struct Intrusive : public ReferenceCounted, private Trace { using Trace::numericId; }; namespace zypp { template<> inline NonIntrusive * rwcowClone( const NonIntrusive * rhs ) { return new NonIntrusive( *rhs ); } template<> inline Intrusive * rwcowClone( const Intrusive * rhs ) { return new Intrusive( *rhs ); } } /****************************************************************** ** */ #define T_NULL assert( !ptr ); assert( ptr == nullptr ) #define T_NOT_NULL assert( ptr ); assert( ptr != nullptr ) #define T_UNIQUE assert( ptr.unique() ); assert( ptr.use_count() < 2 ) #define T_NOT_UNIQUE assert( !ptr.unique() ); assert( ptr.use_count() >= 2 ) // Also comapre with underlying shared ptr type. #define T_EQ(a,b) assert( a == b ); assert( a == b.cgetPtr() ); assert( a.cgetPtr() == b ); assert( a.cgetPtr() == b.cgetPtr() ); #define T_NE(a,b) assert( a != b ); assert( a != b.cgetPtr() ); assert( a.cgetPtr() != b ); assert( a.cgetPtr() != b.cgetPtr() ); template void test() { MIL << __PRETTY_FUNCTION__ << std::endl; // typedefs that should be provided: typedef typename RW::PtrType Ptr; typedef typename RW::constPtrType constPtr; typedef typename Ptr::element_type Ptr_element_type; typedef typename constPtr::element_type constPtr_element_type; // initial NULL RW ptr; T_NULL; T_UNIQUE; T_EQ(ptr,ptr); // assign ptr = RW( new Ptr_element_type ); T_NOT_NULL; T_UNIQUE; T_EQ(ptr,ptr); { // share RW ptr2( ptr ); T_NOT_NULL; T_NOT_UNIQUE; T_EQ(ptr,ptr2); // unshare ptr2.reset(); T_NOT_NULL; T_UNIQUE; T_NE(ptr,ptr2); // different impl ptr2.reset( new Ptr_element_type ); T_NE(ptr,ptr2); } // assign ptr.reset( 0 ); T_NULL; T_UNIQUE; // nullptr compatible ptr.reset( nullptr ); T_NULL; T_UNIQUE; ptr = nullptr; T_NULL; T_UNIQUE; ptr = RW( nullptr ); T_NULL; T_UNIQUE; } template void cowt() { test(); MIL << __PRETTY_FUNCTION__ << std::endl; typedef typename RW::PtrType::element_type Ptr_element_type; // create RW ptr( new Ptr_element_type ); unsigned long ptrid = ptr->numericId(); // share RW ptr2( ptr ); // clone aon access unsigned long ptrid2 = ptr2->numericId(); assert( ptrid != ptrid2 ); } /****************************************************************** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int */ BOOST_AUTO_TEST_CASE(basic_test) { MIL << "===[START]=====" << endl; test > >(); test > >(); test > >(); test > >(); cowt > >(); cowt > >(); cowt > >(); cowt > >(); MIL << "===[DONE]=====" << endl; } libzypp-17.36.5/tests/zypp/PublicKey_test.cc000066400000000000000000000034611476576476200210230ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/PublicKey") BOOST_AUTO_TEST_CASE(publickey_test) { // test for a empty key zypp::PublicKey empty_key; BOOST_REQUIRE( ! empty_key.isValid() ); BOOST_CHECK_THROW( zypp::PublicKey("nonexistent"), Exception ); zypp::PublicKey k2(DATADIR/"susekey.asc"); BOOST_CHECK_EQUAL( k2.id(), "A84EDAE89C800ACA" ); BOOST_CHECK_EQUAL( k2.name(), "SuSE Package Signing Key " ); BOOST_CHECK_EQUAL( k2.fingerprint(), "79C179B2E1C820C1890F9994A84EDAE89C800ACA" ); BOOST_CHECK_EQUAL( k2.gpgPubkeyVersion(), "9c800aca" ); BOOST_CHECK_EQUAL( k2.gpgPubkeyRelease(), "40d8063e" ); BOOST_CHECK_EQUAL( k2.created(), zypp::Date(1087899198) ); BOOST_CHECK_EQUAL( k2.expires(), zypp::Date(1214043198) ); //BOOST_CHECK_EQUAL( k2.daysToLive(), "" ); BOOST_REQUIRE( k2.path() != Pathname() ); BOOST_REQUIRE( k2 == k2 ); k2 = zypp::PublicKey(DATADIR/"multikey.asc"); BOOST_CHECK_EQUAL( k2.id(), "27FA41BD8A7C64F9" ); BOOST_CHECK_EQUAL( k2.name(), "Unsupported " ); BOOST_CHECK_EQUAL( k2.fingerprint(), "D88811AF6B51852351DF538527FA41BD8A7C64F9" ); BOOST_CHECK_EQUAL( k2.gpgPubkeyVersion(), "8a7c64f9" ); BOOST_CHECK_EQUAL( k2.gpgPubkeyRelease(), "4be01af3" ); BOOST_CHECK_EQUAL( k2.created(), zypp::Date(1272978163) ); BOOST_CHECK_EQUAL( k2.expires(), zypp::Date(1399122163) ); k2 = zypp::PublicKey(DATADIR/"multikey2.asc"); BOOST_CHECK_EQUAL( k2.hiddenKeys().size(), 8 ); } libzypp-17.36.5/tests/zypp/PurgeKernels_test.cc000066400000000000000000000350451476576476200215450ustar00rootroot00000000000000#include "TestSetup.h" #include #include #include using namespace zypp; using namespace boost::unit_test; namespace { // Defines a expected removal of a package and carries the flag if it actually was removed struct ExpectedRemoval { ExpectedRemoval( std::string &&name ) : packageNVRA(std::move(name)) {} std::string packageNVRA; mutable bool wasRemoved = false; }; bool operator< ( const ExpectedRemoval &a, const ExpectedRemoval &b ) { return a.packageNVRA < b.packageNVRA; } } namespace boost { namespace test_tools { namespace tt_detail { template<> struct print_log_value< std::set > { void operator()( std::ostream& ostr, std::set const& set) { ostr << "{" << std::endl; for( const auto &elem : set ) ostr << "'" << elem.packageNVRA << "'," << std::endl; ostr << "}" << std::endl; } }; }}} namespace { std::string makeNVRA( const PoolItem &pck ) { return pck.name() + "-" + pck.edition().asString() + "." + pck.arch().asString(); } using TestSample = std::tuple< Pathname, // repoPath std::string, // uname_r zypp::Arch, // arch std::string, // keepSpec std::set // expectedRems >; std::vector maketestdata() { return { TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/simple", "1-3-default", Arch("x86_64"), "oldest,running,latest", { { "kernel-default-1-2.x86_64" }, { "kernel-default-devel-1-2.x86_64" }, { "kernel-default-devel-debuginfo-1-2.x86_64" }, { "kernel-devel-1-2.noarch" }, { "kernel-livepatch-default-1-2.x86_64" }, { "kernel-syms-1-2.x86_64" }, { "kernel-default-1-4.x86_64" }, { "kernel-default-devel-1-4.x86_64" }, { "kernel-default-devel-debuginfo-1-4.x86_64" }, { "kernel-devel-1-4.noarch" }, { "kernel-syms-1-4.x86_64" }, // left over devel packages that need to go away too { "kernel-devel-1-1.2.noarch" }, { "kernel-source-1-1.2.noarch" }, { "kernel-default-devel-1-3.x86_64" }, { "kernel-default-devel-debuginfo-1-3.x86_64" }, { "kernel-devel-1-3.noarch" }, } }, //test that keeps only the running kernel TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/simple", "1-3-default", Arch("x86_64"), "running", { { "kernel-default-1-1.x86_64" }, { "kernel-default-devel-1-1.x86_64" }, { "kernel-default-devel-debuginfo-1-1.x86_64" }, { "kernel-livepatch-default-1-1.x86_64" }, { "kernel-devel-1-1.noarch" }, { "kernel-syms-1-1.x86_64" }, { "kernel-source-1-1.noarch" }, { "kernel-default-1-2.x86_64" }, { "kernel-default-devel-1-2.x86_64" }, { "kernel-default-devel-debuginfo-1-2.x86_64" }, { "kernel-devel-1-2.noarch" }, { "kernel-livepatch-default-1-2.x86_64" }, { "kernel-syms-1-2.x86_64" }, { "kernel-default-1-4.x86_64" }, { "kernel-default-devel-1-4.x86_64" }, { "kernel-default-devel-debuginfo-1-4.x86_64" }, { "kernel-devel-1-4.noarch" }, { "kernel-syms-1-4.x86_64" }, { "kernel-default-1-5.x86_64" }, { "kernel-default-devel-1-5.x86_64" }, { "kernel-default-devel-debuginfo-1-5.x86_64" }, { "kernel-devel-1-5.noarch" }, { "kernel-syms-1-5.x86_64" }, { "dummy-kmp-default-1-0.x86_64" }, // left over devel packages that need to go away too { "kernel-devel-1-1.2.noarch" }, { "kernel-source-1-1.2.noarch" }, { "kernel-default-devel-1-3.x86_64" }, { "kernel-devel-1-3.noarch" }, { "kernel-default-devel-1-3.x86_64" }, { "kernel-default-devel-debuginfo-1-3.x86_64" }, } }, TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/simple", "1-3-default", Arch("x86_64"), "oldest+1,running,latest-1", { { "kernel-default-1-1.x86_64" }, { "kernel-livepatch-default-1-1.x86_64" }, { "kernel-default-devel-1-1.x86_64" }, { "kernel-default-devel-debuginfo-1-1.x86_64" }, { "kernel-devel-1-1.noarch" }, { "kernel-syms-1-1.x86_64" }, { "kernel-source-1-1.noarch" }, { "kernel-default-1-5.x86_64" }, { "kernel-default-devel-1-5.x86_64" }, { "kernel-default-devel-debuginfo-1-5.x86_64" }, { "kernel-devel-1-5.noarch" }, { "kernel-syms-1-5.x86_64" }, { "dummy-kmp-default-1-0.x86_64" }, // left over devel packages that need to go away too { "kernel-default-devel-1-3.x86_64" }, { "kernel-default-devel-debuginfo-1-3.x86_64" }, { "kernel-devel-1-3.noarch" }, } }, TestSample { //kernel-1-1 has a non kernel package depending on it, it should not be removed TESTS_SRC_DIR"/zypp/data/PurgeKernels/withdeps", "1-5-default", Arch("x86_64"), "running", { { "kernel-default-1-2.x86_64" }, { "kernel-default-extra-1-2.x86_64" }, { "kernel-default-devel-1-2.x86_64" }, { "kernel-default-devel-debuginfo-1-2.x86_64" }, { "kernel-devel-1-2.noarch" }, { "kernel-livepatch-default-1-2.x86_64" }, { "kernel-syms-1-2.x86_64" }, // the following packages are not held back because they do not fit keep spec and no deps are keeping them { "kernel-default-devel-1-1.x86_64" }, { "kernel-default-devel-debuginfo-1-1.x86_64" }, { "kernel-devel-1-1.noarch" }, { "kernel-syms-1-1.x86_64" }, } }, TestSample { //kernel-1-5 provides a symbol for a kmp that has a non kernel package depending on it, it should not be removed TESTS_SRC_DIR"/zypp/data/PurgeKernels/withdeps", "1-1-default", Arch("x86_64"), "running", { { "kernel-default-1-2.x86_64" }, { "kernel-default-extra-1-2.x86_64" }, { "kernel-default-devel-1-2.x86_64" }, { "kernel-default-devel-debuginfo-1-2.x86_64" }, { "kernel-devel-1-2.noarch" }, { "kernel-livepatch-default-1-2.x86_64" }, { "kernel-syms-1-2.x86_64" }, { "kernel-default-devel-1-5.x86_64" }, { "kernel-default-devel-debuginfo-1-5.x86_64" }, { "kernel-devel-1-5.noarch" }, { "kernel-syms-1-5.x86_64" }, } }, TestSample { //kernel-1-2 is explicitly in the keep spec, it should not be removed //kernel-1-5 provides a symbol for a kmp that has a non kernel package depending on it, it should not be removed TESTS_SRC_DIR"/zypp/data/PurgeKernels/withdeps", "1-1-default", Arch("x86_64"), "running,1-2", { { "kernel-default-devel-1-5.x86_64" }, { "kernel-default-devel-debuginfo-1-5.x86_64" }, { "kernel-devel-1-5.noarch" }, { "kernel-syms-1-5.x86_64" }, } }, TestSample { //kernel-default-1-1.x86_64 is the running kernel it should not be removed, //in all sets with different arch only the latest should be kept TESTS_SRC_DIR"/zypp/data/PurgeKernels/arch", "1-1-default", Arch("x86_64"), "latest,running", { { "kernel-default-1-1.aarch64" }, { "kernel-default-1-1.i686" }, //{ "kernel-syms-1-1.x86_64" }, //{ "kernel-default-devel-1-1.x86_64" }, //{ "kernel-default-devel-debuginfo-1-1.x86_64" }, { "kernel-default-1-2.aarch64" }, { "kernel-default-1-2.i686" }, { "kernel-default-1-2.x86_64" }, { "kernel-default-devel-1-1.aarch64" }, { "kernel-default-devel-1-1.i686" }, { "kernel-default-devel-1-2.aarch64" }, { "kernel-default-devel-1-2.i686" }, { "kernel-default-devel-1-2.x86_64" }, { "kernel-default-devel-debuginfo-1-1.aarch64" }, { "kernel-default-devel-debuginfo-1-1.i686" }, { "kernel-default-devel-debuginfo-1-2.aarch64" }, { "kernel-default-devel-debuginfo-1-2.i686" }, { "kernel-default-devel-debuginfo-1-2.x86_64" }, { "kernel-devel-1-2.noarch" }, { "kernel-livepatch-default-1-2.aarch64" }, { "kernel-livepatch-default-1-2.i686" }, { "kernel-livepatch-default-1-2.x86_64" }, { "kernel-syms-1-1.aarch64" }, { "kernel-syms-1-1.i686" }, { "kernel-syms-1-2.aarch64" }, { "kernel-syms-1-2.i686" }, { "kernel-syms-1-2.x86_64" }, } }, TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/rebuild", "1-1-default", Arch("x86_64"), "running", { { "kernel-source-1-1.noarch" }, } }, TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/fancybuildnr", "5.8.1-3.g846658e-default", Arch("x86_64"), "latest,latest-1,running", { { "kernel-default-5.7.8-1.1.g8f507a0.x86_64" }, { "kernel-default-5.7.9-1.1.ga010166.x86_64" }, { "kernel-default-5.7.10-1.1.g6a1b5cf.x86_64" }, { "kernel-default-5.7.10-3.1.gd1148b9.x86_64" }, { "kernel-default-5.7.11-1.1.g5015994.x86_64" }, { "kernel-default-5.7.12-1.1.g9c98feb.x86_64" }, { "kernel-default-5.8.0-1.1.gd3bf2d6.x86_64" }, { "kernel-default-5.8.0-2.1.g9bc0044.x86_64" }, { "kernel-default-5.8.0-3.1.gd4e7682.x86_64" }, { "kernel-default-5.8.1-1.1.ge6658c9.x86_64" }, // those are running, latest and latest-1 , they should stay //{ "kernel-default-5.8.1-2.1.g553537d.x86_64" }, //{ "kernel-default-5.8.1-3.1.g846658e.x86_64" }, } }, TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/kernel-base", "5.7.8-3-default", Arch("x86_64"), "running", { { "kernel-default-base-5.7.8-1.1.1.1.x86_64" }, { "kernel-default-base-5.7.8-2.1.1.1.x86_64" }, //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64" }, { "kernel-default-base-5.8.8-2.1.1.1.x86_64" }, } }, TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/kernel-base", "5.7.8-3-default", Arch("x86_64"), "running, 5.7.8-2.1.1", { { "kernel-default-base-5.7.8-1.1.1.1.x86_64" }, { "kernel-default-base-5.8.8-2.1.1.1.x86_64" }, //{ "kernel-default-base-5.7.8-2.1.1.1.x86_64" }, //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64" }, } }, // same test set as before, but this time the user took the uname-r kernel output // we should ignore the -flavor in the end and just use the edition part TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/kernel-base", "5.7.8-3-default", Arch("x86_64"), "running, 5.7.8-2.1.1-default", { { "kernel-default-base-5.7.8-1.1.1.1.x86_64" }, { "kernel-default-base-5.8.8-2.1.1.1.x86_64" }, //{ "kernel-default-base-5.7.8-2.1.1.1.x86_64" }, //{ "kernel-default-base-5.7.8-3.1.1.1.x86_64" }, } }, TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/flavour", "1-3-rt", Arch("x86_64"), "running", { { "kernel-rt-1-1.x86_64" }, { "kernel-rt-devel-1-1.x86_64" }, { "kernel-rt-devel-debuginfo-1-1.x86_64" }, { "kernel-devel-rt-1-1.noarch" }, { "kernel-syms-rt-1-1.x86_64" }, { "kernel-source-rt-1-1.noarch" }, { "kernel-rt-1-2.x86_64" }, { "kernel-rt-devel-1-2.x86_64" }, { "kernel-rt-devel-debuginfo-1-2.x86_64" }, { "kernel-devel-rt-1-2.noarch" }, { "kernel-syms-rt-1-2.x86_64" }, { "kernel-rt-1-4.x86_64" }, { "kernel-rt-devel-1-4.x86_64" }, { "kernel-rt-devel-debuginfo-1-4.x86_64" }, { "kernel-devel-rt-1-4.noarch" }, { "kernel-syms-rt-1-4.x86_64" }, { "kernel-rt-1-5.x86_64" }, { "kernel-rt-devel-1-5.x86_64" }, { "kernel-rt-devel-debuginfo-1-5.x86_64" }, { "kernel-devel-rt-1-5.noarch" }, { "kernel-syms-rt-1-5.x86_64" }, // left over devel packages that need to go away too { "kernel-devel-rt-1-1.2.noarch" }, { "kernel-source-rt-1-1.2.noarch" }, { "kernel-rt-devel-1-3.x86_64" }, { "kernel-devel-rt-1-3.noarch" }, { "kernel-rt-devel-1-3.x86_64" }, { "kernel-rt-devel-debuginfo-1-3.x86_64" }, } }, // rc kernels have a special naming hack because upstream uses characters that are forbidden in rpm versions TestSample { TESTS_SRC_DIR"/zypp/data/PurgeKernels/rckrnl", "5.13.0-rc7-17-default", Arch("x86_64"), "running", { { "kernel-default-5.13.rc7-16.1.x86_64" }, { "kernel-default-5.13~rc7-18.1.x86_64" } } }, }; } } namespace bdata = boost::unit_test::data; BOOST_DATA_TEST_CASE(purge_kernels, bdata::make( maketestdata() ), repoPath, uname_r, arch, keepSpec, expectedRems ) { TestSetup test( Arch_x86_64 ); test.loadTestcaseRepos( repoPath ); auto expectedRemovals = expectedRems; PurgeKernels krnls; krnls.setUnameR( uname_r ); krnls.setKernelArch( arch ); krnls.setKeepSpec( keepSpec ); krnls.markObsoleteKernels(); auto pool = ResPool::instance(); BOOST_REQUIRE( pool.resolver().resolvePool() ); unsigned removeCount = 0; const filter::ByStatus toBeUninstalledFilter( &ResStatus::isToBeUninstalled ); for ( auto it = pool.byStatusBegin( toBeUninstalledFilter ); it != pool.byStatusEnd( toBeUninstalledFilter ); it++ ) { removeCount++; std::set::iterator pck = expectedRemovals.find( makeNVRA(*it) ); BOOST_REQUIRE_MESSAGE( pck != expectedRemovals.end(), std::string("Unexpected package removed: ") + makeNVRA(*it) + (it->status().isByUser() ? " (by user)" : " (autoremoved)") ); (*pck).wasRemoved = true; } for ( const auto &rem : expectedRemovals ) { if (!rem.wasRemoved) std::cout << std::string( "Expected package removal did not happen for: ") + rem.packageNVRA << std::endl; //BOOST_REQUIRE_MESSAGE( rem.second, std::string( "Expected package removal did not happen for: ") + rem.first ); } BOOST_REQUIRE_EQUAL( expectedRemovals.size(), removeCount ); } libzypp-17.36.5/tests/zypp/RWPtr_test.cc000066400000000000000000000033711476576476200201520ustar00rootroot00000000000000#include #include #include #include #define BOOST_TEST_MODULE RWPtr_test struct Foo { int _foo; Foo(int foo=0): _foo(foo) { std::cerr << "created Foo(" << _foo << ")" << std::endl; } ~Foo() { std::cerr << "destroy Foo(" << _foo << ")" << std::endl; } }; #define REF_TEST(ref,msg,exp,res) \ do { \ bool unique = exp; \ std::cerr << msg << std::endl; \ if( ref) { \ std::cerr << "ref contains object" << std::endl; \ } else { \ std::cerr << "ref contains no object" << std::endl; \ } \ std::cerr << "ref counter is " << ref.use_count() << std::endl; \ if( ref.unique()) { \ std::cerr << "ref is unique" << std::endl; \ if( unique) { \ std::cerr << "EXPECTED" << std::endl; \ } else { \ std::cerr << "NOT EXPECTED" << std::endl; \ res = 1; \ } \ } else { \ std::cerr << "ref is shared" << std::endl; \ if( !unique) { \ std::cerr << "EXPECTED" << std::endl; \ } else { \ std::cerr << "NOT EXPECTED" << std::endl; \ res = 1; \ } \ } \ std::cerr << std::endl; \ } while(0); BOOST_AUTO_TEST_CASE(basic_test) { bool skip_reset = false; int result = 0; typedef zypp::RW_pointer FooRef; FooRef ref; REF_TEST(ref,"=== REF(nil)", true, result); ref.reset(new Foo(42)); REF_TEST(ref,"=== REF(object)", true, result); { FooRef ref2(ref); REF_TEST(ref,"=== REF2(REF)", false, result); } REF_TEST(ref,"=== REF(object), REF2 out of scope now", true, result); if( !skip_reset) { ref.reset(); REF_TEST(ref,"=== REF(nil), reset()", true, result); } std::cerr << "RESULT: " << (result == 0 ? "PASSED" : "FAILED") << std::endl; } libzypp-17.36.5/tests/zypp/RepoInfo_test.cc000066400000000000000000000020521476576476200206500ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include #include "KeyRingTestReceiver.h" #include "WebServer.h" using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace boost::unit_test::log; using namespace zypp; using namespace zypp::filesystem; using namespace zypp::repo; BOOST_AUTO_TEST_CASE(repoinfo_test) { WebServer web((Pathname(TESTS_SRC_DIR) + "/data/Mirrorlist/remote-site").c_str(), 10001); BOOST_REQUIRE( web.start() ); Url weburl (web.url()); weburl.setPathName("/metalink.xml"); RepoInfo ri; ri.setMirrorListUrl(weburl); BOOST_CHECK(ri.url().asString() == "http://ftp-stud.hs-esslingen.de/pub/fedora/linux/updates/13/x86_64/"); std::ostringstream ostr; ri.dumpAsIniOn(ostr); BOOST_CHECK( ostr.str().find("baseurl=") == std::string::npos ); web.stop(); } libzypp-17.36.5/tests/zypp/RepoManager_test.cc000066400000000000000000000226131476576476200213340ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include #include "TestSetup.h" #include #include "KeyRingTestReceiver.h" using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; using namespace zypp::filesystem; using namespace zypp::repo; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/RepoManager") #define REPODATADIR (Pathname(TESTS_SRC_DIR) + "/repo/susetags/data/addon_in_subdir") BOOST_AUTO_TEST_CASE(refresh_addon_in_subdir) { KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // disable sgnature checking keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); keyring_callbacks.answerAcceptVerFailed(true); keyring_callbacks.answerAcceptUnknownKey(true); // make sure we can refresh an addon which is in a subpath in a media url TestSetup test( Arch_x86_64 ); RepoInfo info; info.setBaseUrl( REPODATADIR.asDirUrl() ); info.setPath("/updates"); info.setType(RepoType::YAST2); info.setAlias("boooh"); test.loadRepo(info); // take care we actually got the data Repository r( test.satpool().reposFind( "boooh" ) ); BOOST_REQUIRE( r ); BOOST_CHECK_EQUAL( r.solvablesSize(), 2 ); BOOST_CHECK_EQUAL( r.info().type(), repo::RepoType::YAST2 ); BOOST_CHECK( r.info().hasLicense() ); } BOOST_AUTO_TEST_CASE(pluginservices_test) { TmpDir tmpCachePath; RepoManagerOptions opts( RepoManagerOptions::makeTestSetup( tmpCachePath ) ) ; opts.rootDir = ""; // NOTE: After all paths have been setup correctly, // we must reset the RepoManager rootDir to prevent the plugin script // from being executed chrooted (would require UID 0). opts.pluginsPath = DATADIR + "/plugin-service-lib-1"; BOOST_CHECK(PathInfo(opts.pluginsPath / "services/service").isExist()); { RepoManager manager(opts); BOOST_REQUIRE_EQUAL(1, manager.serviceSize()); BOOST_CHECK(manager.repoEmpty()); ServiceInfo service(*manager.serviceBegin()); BOOST_CHECK_EQUAL("service", service.alias()); BOOST_CHECK_EQUAL( (DATADIR / "/plugin-service-lib-1/services/service").asFileUrl(), service.url().asString()); // now refresh the service manager.refreshServices(); BOOST_CHECK_EQUAL((unsigned) 2, manager.repoSize()); //std::list infos; //manager.getRepositoriesInService("test", // insert_iterator >(infos,infos.begin())); //BOOST_CHECK_EQUAL(infos.size(), 2); // 2 from new repoindex } // Now simulate the service changed opts.pluginsPath = DATADIR + "/plugin-service-lib-2"; { RepoManager manager(opts); BOOST_REQUIRE_EQUAL(1, manager.serviceSize()); ServiceInfo service(*manager.serviceBegin()); BOOST_CHECK_EQUAL("service", service.alias()); BOOST_CHECK_EQUAL( (DATADIR / "/plugin-service-lib-2/services/service").asFileUrl(), service.url().asString()); // now refresh the service manager.refreshServices(); BOOST_CHECK_EQUAL((unsigned) 1, manager.repoSize()); } } // regression test for services bug // if you modify a service that you just // added and saved, the service was not associated with its // file internally BOOST_AUTO_TEST_CASE(service_file_link_bug) { TmpDir tmpCachePath; RepoManagerOptions opts( RepoManagerOptions::makeTestSetup( tmpCachePath ) ) ; filesystem::mkdir( opts.knownReposPath ); filesystem::mkdir( opts.knownServicesPath ); RepoManager manager(opts); //test service ServiceInfo service("test", DATADIR.asDirUrl() ); service.setEnabled(true); manager.addService(service); // now internally, service is associated with the file // where it was saved // the following line reset the file association with the bug manager.modifyService(service.alias(), service); // and the following modifyService fails because there is no // association manager.modifyService(service.alias(), service); } BOOST_AUTO_TEST_CASE(repomanager_test) { TmpDir tmpCachePath; RepoManagerOptions opts( RepoManagerOptions::makeTestSetup( tmpCachePath ) ) ; opts.servicesTargetDistro = "sles-10-i586"; // usually determined by the Target filesystem::mkdir( opts.knownReposPath ); filesystem::mkdir( opts.knownServicesPath ); filesystem::assert_dir( opts.rootDir/"Datadir" ); BOOST_CHECK_EQUAL( filesystem::copy_dir_content( DATADIR + "/repos.d", opts.knownReposPath ), 0 ); BOOST_CHECK_EQUAL( filesystem::copy_dir_content( DATADIR, opts.rootDir/"Datadir" ), 0 ); RepoManager manager(opts); std::list repos; repos.insert(repos.end(), manager.repoBegin(), manager.repoEnd()); BOOST_CHECK_EQUAL(repos.size(), (unsigned) 4); // now add a .repo file with 2 repositories in it manager.addRepositories( (DATADIR / "/proprietary.repo").asFileUrl() ); // check it was not overwriten the proprietary.repo file BOOST_CHECK( PathInfo(opts.knownReposPath + "/proprietary.repo_1").isExist() ); // now there should be 6 repos repos.clear(); repos.insert(repos.end(), manager.repoBegin(), manager.repoEnd()); BOOST_CHECK_EQUAL(repos.size(), (unsigned) 6); RepoInfo office_dup; office_dup.setAlias("office"); BOOST_CHECK_THROW(manager.addRepository(office_dup), RepoAlreadyExistsException); // delete the office repo inside the propietary_1.repo RepoInfo office; office.setAlias("office"); manager.removeRepository(office); // now there should be 5 repos repos.clear(); repos.insert(repos.end(), manager.repoBegin(), manager.repoEnd()); BOOST_CHECK_EQUAL(repos.size(), (unsigned) 5); // the file still contained one repo, so it should still exists BOOST_CHECK( PathInfo(opts.knownReposPath + "/proprietary.repo_1").isExist() ); // now delete the macromedia one RepoInfo macromedia; macromedia.setAlias("macromedia"); manager.removeRepository(macromedia); BOOST_CHECK_EQUAL(manager.repoSize(), (unsigned) 4); // the file should not exist anymore BOOST_CHECK( ! PathInfo(opts.knownReposPath + "/proprietary.repo_1").isExist() ); //test service Url urlS( zypp::Pathname("/Datadir").asDirUrl() ); ServiceInfo service("test", urlS); service.setEnabled(true); manager.addService(service); manager.refreshServices(); BOOST_CHECK_EQUAL(manager.repoSize(), (unsigned) 7); // +3 from repoindex //simulate change of repoindex.xml urlS = ( zypp::Pathname("/Datadir") / "second").asDirUrl(); service.setUrl(urlS); service.setEnabled(true); manager.modifyService(service.alias(), service); manager.refreshServices(); BOOST_CHECK_EQUAL(manager.repoSize(), (unsigned) 6); // -1 from new repoindex std::list infos; manager.getRepositoriesInService("test", std::insert_iterator >(infos,infos.begin())); BOOST_CHECK_EQUAL(infos.size(), 2); // 2 from new repoindex // let test cache creation RepoInfo repo; repo.setAlias("foo"); //BOOST_CHECK_MESSAGE(0, repourl.asString()); repo.setBaseUrl( (Pathname(TESTS_SRC_DIR) / "/repo/yum/data/10.2-updates-subset").asDirUrl() ); KeyRingTestReceiver keyring_callbacks; KeyRingTestSignalReceiver receiver; // disable sgnature checking keyring_callbacks.answerAcceptKey(KeyRingReport::KEY_TRUST_TEMPORARILY); keyring_callbacks.answerAcceptVerFailed(true); keyring_callbacks.answerAcceptUnknownKey(true); // We have no metadata and cache yet BOOST_CHECK_MESSAGE( !manager.isCached(repo), "Repo should not yet be cached" ); // This should download metadata and build the cache manager.buildCache(repo); // Now we have metadata and cache BOOST_CHECK_MESSAGE( manager.isCached(repo), "Repo should be cached now" ); // Metadata are up to date RepoManager::RefreshCheckStatus ref_stat = manager.checkIfToRefreshMetadata(repo, *repo.baseUrlsBegin()); SEC << endl << ref_stat << endl; BOOST_CHECK_MESSAGE( ref_stat== RepoManager::REPO_UP_TO_DATE || ref_stat == RepoManager::REPO_CHECK_DELAYED, "Metadata should be up to date" ); // the solv file should exists now Pathname base = (opts.repoCachePath / "solv" / repo.alias()); Pathname solvfile = base / "solv"; Pathname cookiefile = base / "cookie"; BOOST_CHECK_MESSAGE( PathInfo(solvfile).isExist(), "Solv file is created after caching: " + solvfile.asString()); BOOST_CHECK_MESSAGE( PathInfo(cookiefile).isExist(), "Cookie file is created after caching: " + cookiefile.asString()); MIL << "Repo already in cache, clean cache"<< endl; manager.cleanCache(repo); BOOST_CHECK_MESSAGE( !manager.isCached(repo), "Repo cache was just deleted, should not be cached now" ); // now cache should build normally manager.buildCache(repo); manager.loadFromCache(repo); if ( manager.isCached(repo ) ) { MIL << "Repo already in cache, clean cache"<< endl; manager.cleanCache(repo); } MIL << "Parsing repository metadata..." << endl; manager.buildCache(repo); // now test that loading twice a repo updates // it instead of duplicating the solv file } BOOST_AUTO_TEST_CASE(repo_seting_test) { RepoInfo repo; repo.setAlias("foo"); repo.setBaseUrl(std::string("http://test.org")); BOOST_CHECK_MESSAGE( !repo.keepPackages(), "keepPackages must default to OFF"); } //! \todo test this //BOOST_AUTO_TEST_CASE(repo_dont_overwrite_external_settings_test) //{ //} libzypp-17.36.5/tests/zypp/RepoStatus_test.cc000066400000000000000000000030261476576476200212420ustar00rootroot00000000000000 #include #include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; using namespace zypp::filesystem; BOOST_AUTO_TEST_CASE(repostatus_test) { RepoStatus e; RepoStatus E { "", 42 }; // empty refers to the checksum only, not to the timestamp! RepoStatus a { "aa", 0 }; RepoStatus b { "bb", 1 }; RepoStatus c { "cc", 2 }; BOOST_CHECK_EQUAL( e.empty(), true ); BOOST_CHECK_EQUAL( e.timestamp(), 0 ); BOOST_CHECK_EQUAL( (e && e).empty(), true ); BOOST_CHECK_EQUAL( E.empty(), true ); BOOST_CHECK_EQUAL( E.timestamp(), 42 ); RepoStatus r { E && e }; BOOST_CHECK_EQUAL( r.empty(), true ); BOOST_CHECK_EQUAL( r.timestamp(), 42 ); r = e && E; BOOST_CHECK_EQUAL( r.empty(), true ); BOOST_CHECK_EQUAL( r.timestamp(), 42 ); r = E && E; BOOST_CHECK_EQUAL( r.empty(), true ); BOOST_CHECK_EQUAL( r.timestamp(), 42 ); BOOST_CHECK_EQUAL( a.empty(), false ); BOOST_CHECK_EQUAL( a.timestamp(), 0 ); r = e && a; BOOST_CHECK_EQUAL( r.empty(), false ); BOOST_CHECK_EQUAL( r.timestamp(), a.timestamp() ); // max timestamp r = a && b; BOOST_CHECK_EQUAL( r, (b && a) ); BOOST_CHECK_EQUAL( r.timestamp(), b.timestamp() ); // max timestamp r = a && b && c; BOOST_CHECK_EQUAL( r, (a && b) && c ); BOOST_CHECK_EQUAL( r, a && (b && c) ); BOOST_CHECK_EQUAL( r.timestamp(), c.timestamp() ); // max timestamp } libzypp-17.36.5/tests/zypp/ResKind_test.cc000066400000000000000000000020471476576476200204720ustar00rootroot00000000000000#include #include #include using boost::unit_test::test_case; using namespace zypp; BOOST_AUTO_TEST_CASE(reskind_test) { // Default construced is empty "" BOOST_CHECK_EQUAL( ResKind(), "" ); // boolean context BOOST_CHECK( ! ResKind() ); BOOST_CHECK( ! ResKind(0) ); // id NULL BOOST_CHECK( ! ResKind(1) ); // id "" BOOST_CHECK( ! ResKind("") ); // "" BOOST_CHECK( ResKind(2) ); BOOST_CHECK( ResKind("FOO") ); // Internal representation is lowercased BOOST_CHECK_EQUAL( ResKind("FOO").asString(), "foo" ); // Caseinsensitive comparison BOOST_CHECK_EQUAL( ResKind("FOO"), ResKind("foo") ); BOOST_CHECK_EQUAL( ResKind("FOO"), std::string("Foo") ); BOOST_CHECK_EQUAL( ResKind("FOO"), "Foo" ); BOOST_CHECK_EQUAL( ResKind("FOO"), std::string("foo") ); BOOST_CHECK_EQUAL( ResKind("FOO"), "foo" ); BOOST_CHECK_EQUAL( std::string("foo"), ResKind("FOO") ); BOOST_CHECK_EQUAL( "foo", ResKind("FOO") ); BOOST_CHECK_EQUAL( ResKind::compare( "FOO", "foo" ), 0 ); } libzypp-17.36.5/tests/zypp/ResStatus_test.cc000066400000000000000000000240351476576476200210710ustar00rootroot00000000000000#include "TestSetup.h" #include #define BOOST_TEST_MODULE ResStatus BOOST_AUTO_TEST_CASE(Default) { { ResStatus s; BOOST_CHECK( s.isUninstalled() ); BOOST_CHECK_EQUAL( s.isInstalled(), ! s.isUninstalled() ); BOOST_CHECK_EQUAL( s.getTransactValue(), ResStatus::KEEP_STATE ); BOOST_CHECK_EQUAL( s.getTransactByValue(), ResStatus::SOLVER ); } { ResStatus s( true ); BOOST_CHECK( s.isInstalled() ); BOOST_CHECK_EQUAL( s.isInstalled(), ! s.isUninstalled() ); BOOST_CHECK_EQUAL( s.getTransactValue(), ResStatus::KEEP_STATE ); BOOST_CHECK_EQUAL( s.getTransactByValue(), ResStatus::SOLVER ); } } //////////////////////////////////////////////////////////////////////////////// // tools //////////////////////////////////////////////////////////////////////////////// template inline const Tp & max( const Tp & lhs, const Tp & rhs ) { return lhs < rhs ? rhs : lhs; } template inline Tp * begin( Tp (& _array)[N] ) { return _array; } template inline Tp * end( Tp (& _array)[N] ) { return _array + (sizeof(_array)/sizeof(Tp)); } ResStatus::TransactByValue transactByValues[] = { ResStatus::USER, ResStatus::APPL_HIGH, ResStatus::APPL_LOW, ResStatus::SOLVER }; ResStatus::TransactValue transactValues[] = { ResStatus::TRANSACT, ResStatus::KEEP_STATE, ResStatus::LOCKED }; bool transactTo[] = { true, false }; // Status transition like setTransact, setLock, setSoftTransact typedef bool (ResStatus::* Transition)( bool, ResStatus::TransactByValue ); // Result evaluation typedef void (* Evaluate)( ResStatus::TransactValue, ResStatus::TransactByValue, /* fromState, fromBy */ bool, ResStatus::TransactByValue, /* toState, toBy */ bool, ResStatus ); /* done, result */ // build status and return whether the comination is supported. (e.g currently no LOCKED state below APPL_HIGH) inline bool initStatus( ResStatus::TransactValue fromState, ResStatus::TransactByValue fromBy, ResStatus & from ) { from = ResStatus(); if ( fromState == ResStatus::KEEP_STATE ) { from.setSoftLock( fromBy ); } else { from.setTransactValue( fromState, fromBy ); if ( fromState == ResStatus::LOCKED && ! from.isLocked() ) return false; // no lock at this level (by now just USER APPL_HIGH) } return true; } void testTable( Transition transition, Evaluate evaluate ) { // Table: For each causer combination (fromBy -> toBy) invoke transition: // // bool ok = ResStatus(fromState,fromBy).transition( toState, toBy ) // // And evaluate the result. // for ( ResStatus::TransactByValue * toBy = begin( transactByValues ); toBy != end( transactByValues ); ++toBy ) { for ( ResStatus::TransactByValue * fromBy = begin( transactByValues ); fromBy != end( transactByValues ); ++fromBy ) { INT << "=== " << *fromBy << " ==> " << *toBy << " ===" << endl; for ( ResStatus::TransactValue * fromState = begin( transactValues ); fromState != end( transactValues ); ++fromState ) { ResStatus from; if ( ! initStatus( *fromState, *fromBy, from ) ) { //WAR << "Unsupported ResStatus(" << *fromState << "," << *fromBy << ")" << endl; continue; // Unsupported ResStatus } for ( bool * toState = begin( transactTo ); toState != end( transactTo ); ++toState ) { ResStatus result( from ); bool done = (result.*transition)( *toState, *toBy ); if ( ! done ) BOOST_CHECK_EQUAL( from, result ); // status stays unchaged on failure! evaluate( *fromState, *fromBy, *toState, *toBy, done, result ); } } } } } // BOOST_CHECK_EQUAL or BOOST_REQUIRE_EQUAL #define X BOOST_CHECK_EQUAL // Transition must succeeds always #define CHECK_DONE_ALWAYS X( done, true ); if ( ! done ) return // Transition succeeds if same or higher TransactByValue #define CHECK_DONE_IFCAUSER X( done, toBy >= fromBy ); if ( ! done ) return // Transition succeeds if a locker (APPL_HIGH or USER) #define CHECK_DONE_ALWAYS_IFLOCKER X( done, toBy >= ResStatus::APPL_HIGH ); if ( ! done ) return // Transition succeeds if a locker (APPL_HIGH or USER) and same or higher TransactByValue #define CHECK_DONE_IFCAUSER_ISLOCKER X( done, toBy >= max(fromBy,ResStatus::APPL_HIGH) ); if ( ! done ) return // Expected target state after transistion #define CHECK_STATE(NEW) X( result.getTransactValue(), ResStatus::NEW ) // Transition result: Remember the causer (i.e. may downgrade superior causer of previous state) #define CHECK_CAUSER_SET X( result.getTransactByValue(), toBy ) // Transition result: Remember a superior causer #define CHECK_CAUSER_RAISED X( result.getTransactByValue(), max(fromBy,toBy) ) // Transition result: Causer stays the same #define CHECK_CAUSER_STAYS X( result.getTransactByValue(), fromBy ) // Transition result: Causer reset to least (SOLVER) level. #define CHECK_CAUSER_TO_SOLVER X( result.getTransactByValue(), ResStatus::SOLVER ) //////////////////////////////////////////////////////////////////////////////// // test cases (see BOOST_AUTO_TEST_CASE(transition)) //////////////////////////////////////////////////////////////////////////////// // All tests below should define 3 checks, abbrev. by defines // // CHECK_DONE_*: When does the tranaction succeed? (return if not) // CHECK_STATE( NEXT ): The state the transition leads to (if successful) // CHECK_CAUSER_*: Changes to the remembered causer (if successful) // #define DOCHECK( FROMSTATE, TOSTATE, C_DONE, C_STATE, C_CAUSER ) \ if ( ResStatus::FROMSTATE == fromState && TOSTATE == toState ) { C_DONE; CHECK_STATE( C_STATE ); C_CAUSER; } void evaluateSetTransact( ResStatus::TransactValue fromState, ResStatus::TransactByValue fromBy, bool toState, ResStatus::TransactByValue toBy, bool done, ResStatus result ) { ResStatus from; initStatus( fromState, fromBy, from ); MIL << from << " =setTransact("<\t" << done << ":" << result << endl; DOCHECK( TRANSACT, true, CHECK_DONE_ALWAYS, TRANSACT, CHECK_CAUSER_RAISED ); DOCHECK( TRANSACT, false, CHECK_DONE_IFCAUSER, KEEP_STATE, CHECK_CAUSER_RAISED ); // from transact into softlock DOCHECK( KEEP_STATE, true, CHECK_DONE_ALWAYS, TRANSACT, CHECK_CAUSER_SET ); DOCHECK( KEEP_STATE, false, CHECK_DONE_ALWAYS, KEEP_STATE, CHECK_CAUSER_STAYS ); // keep is not raised to softlock DOCHECK( LOCKED, true, CHECK_DONE_IFCAUSER, TRANSACT, CHECK_CAUSER_SET ); DOCHECK( LOCKED, false, CHECK_DONE_ALWAYS, LOCKED, CHECK_CAUSER_STAYS ); } void evaluateSetSoftTransact( ResStatus::TransactValue fromState, ResStatus::TransactByValue fromBy, bool toState, ResStatus::TransactByValue toBy, bool done, ResStatus result ) { ResStatus from; initStatus( fromState, fromBy, from ); MIL << from << " =setSoftTransact("<\t" << done << ":" << result << endl; DOCHECK( TRANSACT, true, CHECK_DONE_ALWAYS, TRANSACT, CHECK_CAUSER_RAISED ); DOCHECK( TRANSACT, false, CHECK_DONE_IFCAUSER, KEEP_STATE, CHECK_CAUSER_RAISED ); // from transact into softlock DOCHECK( KEEP_STATE, true, CHECK_DONE_IFCAUSER, TRANSACT, CHECK_CAUSER_SET ); // leaving KEEP requires sup. causer DOCHECK( KEEP_STATE, false, CHECK_DONE_ALWAYS, KEEP_STATE, CHECK_CAUSER_STAYS ); // keep is not raised to softlock DOCHECK( LOCKED, true, CHECK_DONE_IFCAUSER, TRANSACT, CHECK_CAUSER_SET ); DOCHECK( LOCKED, false, CHECK_DONE_ALWAYS, LOCKED, CHECK_CAUSER_STAYS ); } // Check whether failures are ok and whether success lead to the correct state void evaluateSetLock( ResStatus::TransactValue fromState, ResStatus::TransactByValue fromBy, bool toState, ResStatus::TransactByValue toBy, bool done, ResStatus result ) { ResStatus from; initStatus( fromState, fromBy, from ); MIL << from << " =setLock("<\t" << done << ":" << result << endl; DOCHECK( TRANSACT, true, CHECK_DONE_IFCAUSER_ISLOCKER, LOCKED, CHECK_CAUSER_SET ); // transact is 'not locked' DOCHECK( TRANSACT, false, CHECK_DONE_ALWAYS, TRANSACT, CHECK_CAUSER_STAYS ); DOCHECK( KEEP_STATE, true, CHECK_DONE_ALWAYS_IFLOCKER, LOCKED, CHECK_CAUSER_SET ); DOCHECK( KEEP_STATE, false, CHECK_DONE_ALWAYS, KEEP_STATE, CHECK_CAUSER_STAYS ); DOCHECK( LOCKED, true, CHECK_DONE_ALWAYS, LOCKED, CHECK_CAUSER_RAISED ); DOCHECK( LOCKED, false, CHECK_DONE_IFCAUSER, KEEP_STATE, CHECK_CAUSER_TO_SOLVER ); } BOOST_AUTO_TEST_CASE(transition) { //base::LogControl::TmpLineWriter shutUp( new log::FileLineWriter( "-" ) ); MIL << endl; testTable( &ResStatus::setTransact, &evaluateSetTransact ); testTable( &ResStatus::setSoftTransact, &evaluateSetSoftTransact ); testTable( &ResStatus::setLock, &evaluateSetLock ); } bool WhilePoolItemSameStateIsPrivate( ResStatus ostatus, ResStatus nstatus ) { if ( nstatus == ostatus ) return true; // some bits changed... if ( nstatus.getTransactValue() != ostatus.getTransactValue() && ( ! nstatus.isBySolver() // ignore solver state changes // removing a user lock also goes to bySolver || ostatus.getTransactValue() == ResStatus::LOCKED ) ) return false; if ( nstatus.isLicenceConfirmed() != ostatus.isLicenceConfirmed() ) return false; return true; } BOOST_AUTO_TEST_CASE(savestate) { ResStatus ostatus; ResStatus nstatus; BOOST_CHECK_EQUAL( WhilePoolItemSameStateIsPrivate( ostatus, nstatus ), true ); nstatus.setLock( true, ResStatus::USER ); BOOST_CHECK_EQUAL( WhilePoolItemSameStateIsPrivate( ostatus, nstatus ), false ); ostatus = nstatus; nstatus.setLock( false, ResStatus::USER ); BOOST_CHECK_EQUAL( WhilePoolItemSameStateIsPrivate( ostatus, nstatus ), false ); } libzypp-17.36.5/tests/zypp/Resolvable_test.cc000066400000000000000000000016201476576476200212250ustar00rootroot00000000000000 #include #include #include // Boost.Test #include #include #include #include #include #include #include "TestSetup.h" using boost::unit_test::test_case; using namespace zypp; BOOST_AUTO_TEST_CASE(resolvable_test) { TestSetup test( Arch_x86_64 ); // test.loadTarget(); // initialize and load target test.loadRepo( TESTS_SRC_DIR"/data/openSUSE-11.1" ); int pattern_count = 0; for_( pitem, test.pool().begin(), test.pool().end() ) { if ( isKind(pitem->resolvable()) ) { //BOOST_CHECK( ! asKind(pitem->resolvable())->contents().empty() ); MIL << asKind(pitem->resolvable()) << endl; pattern_count++; } } BOOST_CHECK(pattern_count > 0); } libzypp-17.36.5/tests/zypp/Resolver_test.cc000066400000000000000000000057001476576476200207330ustar00rootroot00000000000000#include #define BOOST_CHECK_MODULE Resolver using namespace boost::unit_test; #include "TestSetup.h" #include #include #include #include static TestSetup test( TestSetup::initLater ); struct BAD_TESTCASE {}; typedef std::set PoolItemSet; constexpr const unsigned onlyRequires = 0x1; constexpr const unsigned inrMode = 0x2; PoolItemSet resolve( unsigned flags_r = 0 ) { test.resolver().setOnlyRequires ( flags_r & onlyRequires ); test.resolver().setIgnoreAlreadyRecommended( ! ( flags_r & inrMode ) ); if ( ! test.resolver().resolvePool() ) throw BAD_TESTCASE(); return { make_filter_begin(test.pool()), make_filter_end(test.pool()) }; } inline PoolItem getPi( const std::string & name_r, bool installed_r ) { for ( const auto & pi : test.pool().byName( name_r ) ) { if ( pi.isSystem() == installed_r ) return pi; } throw BAD_TESTCASE(); } inline PoolItem getIPi( const std::string & name_r ) { return getPi( name_r, true ); } inline PoolItem getAPi( const std::string & name_r ) { return getPi( name_r, false ); } ///////////////////////////////////////////////////////////////////////////// // Pool content: PoolItem Ip; // IA: aspell PoolItem Ap; PoolItem Ipen; // IA: aspell-en (wanted locale) PoolItem Apen; PoolItem Apde; // A: aspell-de (wanted locale) PoolItem Apfr; // A: aspell-fr (unwanted locale) PoolItem Aprec; // A: recommended-pkg (by aspell) struct TestInit { TestInit() { test = TestSetup( ); test.loadTestcaseRepos( TESTS_SRC_DIR"/data/TCNamespaceRecommends" ); Ip = getIPi( "aspell" ); Ap = getAPi( "aspell" ); Ipen = getIPi( "aspell-en" ); Apen = getAPi( "aspell-en" ); Apde = getAPi( "aspell-de" ); Apfr = getAPi( "aspell-fr" ); Aprec = getAPi( "recommended-pkg" ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); ///////////////////////////////////////////////////////////////////////////// inline void BOOST_checkresult( const PoolItemSet & resolved_r, const PoolItemSet & expected_r ) { BOOST_CHECK_EQUAL( resolved_r, expected_r ); } BOOST_AUTO_TEST_CASE(install) { Ap.status().setTransact( true, ResStatus::USER ); // Upadte aspell, add all recommends BOOST_checkresult( resolve(), { Ap, Ip, Apde, Aprec } ); Ap.status().setTransact( false, ResStatus::USER ); } BOOST_AUTO_TEST_CASE(installOnlyRequires) { Ap.status().setTransact( true, ResStatus::USER ); // Upadte aspell, add only namespace recommends BOOST_checkresult( resolve( onlyRequires ), { Ap, Ip, Apde } ); Ap.status().setTransact( false, ResStatus::USER ); } BOOST_AUTO_TEST_CASE(inr) { // Fillup all recommends BOOST_checkresult( resolve( inrMode ), { Apde, Aprec } ); } BOOST_AUTO_TEST_CASE(inrOnlyRequires) { // Fillup only namespace recommends BOOST_checkresult( resolve( inrMode|onlyRequires ), { Apde } ); } libzypp-17.36.5/tests/zypp/RpmPkgSigCheck_test.cc000066400000000000000000000264471476576476200217460ustar00rootroot00000000000000#include "TestSetup.h" #include using target::rpm::RpmDb; #define DATADIR (Pathname(TESTS_SRC_DIR) / "/zypp/data/RpmPkgSigCheck") static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( ); } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); /////////////////////////////////////////////////////////////////// // // - RpmDb::checkPackage (legacy) and RpmDb::checkPackageSignature are // expected to produce the same result, except for ... // // Result comparison is not very sophisticated. As the detail strings are // user visible (at least in zypper) we want a notification (breaking testcase) // if something in the rpm format changes. // /////////////////////////////////////////////////////////////////// namespace { struct CheckResult { CheckResult() {} CheckResult( RpmDb::CheckPackageResult && result_r ) : result { std::move(result_r) } {} CheckResult( RpmDb::CheckPackageResult && result_r, std::vector> && detail_r ) : result { std::move(result_r) } { static_cast>&>(detail) = std::move(detail_r); } RpmDb::CheckPackageResult result; RpmDb::CheckPackageDetail detail; }; bool operator==( const CheckResult & lhs, const CheckResult & rhs ) { if ( lhs.result != rhs.result ) return false; // protect against reordered details: // there seems to be a backporting of how rpm prints the signature check result // breaking our tests here, instead of checking for exact equality we just require // that all elements in the lhs exist in the rhs instance. //if ( lhs.detail.size() != rhs.detail.size() ) // return false; for ( const auto & l : lhs.detail ) { if ( std::find( rhs.detail.begin(), rhs.detail.end(), l ) == rhs.detail.end() ) return false; } return true; } std::ostream & operator<<( std::ostream & str, const CheckResult & obj ) { str << "R: " << obj.result; for ( const auto & el : obj.detail ) str << endl << " " << el.first << " | " << el.second; return str; } CheckResult gcheckPackage( const Pathname & path_r ) { CheckResult res; res.result = test.target().rpmDb().checkPackage( path_r, res.detail ); // cout << "==-" << path_r << endl; // cout << res << endl; return res; } CheckResult gcheckPackageSignature( const Pathname & path_r ) { CheckResult res; res.result = test.target().rpmDb().checkPackageSignature( path_r, res.detail ); // cout << "==!" << path_r << endl; // cout << res << endl; return res; } } // namespace BOOST_AUTO_TEST_CASE(no_pkg) { Pathname rpm { DATADIR/"no.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_ERROR, {/*empty details*/} }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(unsigned_pkg) { Pathname rpm { DATADIR/"unsigned.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; // For unsigned packages the final result differs! // (but only if the digests are OK) BOOST_CHECK_EQUAL( cp.result, RpmDb::CHK_OK ); BOOST_CHECK_EQUAL( cs.result, RpmDb::CHK_NOSIG ); BOOST_CHECK_EQUAL( cp.detail, cs.detail ); CheckResult xpct { RpmDb::CHK_NOSIG, { { RpmDb::CHK_OK, " Header SHA1 digest: OK" }, { RpmDb::CHK_OK, " Header SHA256 digest: OK" }, { RpmDb::CHK_OK, " Payload SHA256 digest: OK" }, { RpmDb::CHK_OK, " MD5 digest: OK" }, { RpmDb::CHK_NOSIG, " Package header is not signed!" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(unsigned_broken_pkg) { Pathname rpm { DATADIR/"unsigned_broken.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; // Unsigned, but a broken digest 'superseeds' CHK_NOSIG BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_FAIL, { { RpmDb::CHK_OK, " Header SHA1 digest: OK" }, { RpmDb::CHK_OK, " Header SHA256 digest: OK" }, { RpmDb::CHK_FAIL, " Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" }, { RpmDb::CHK_FAIL, " MD5 digest: BAD (Expected e3f474f75d2d2b267da4ff80fc071dd7 != cebe1e7d39b4356639a0779aa23f6e27)" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(unsigned_broken_header_pkg) { Pathname rpm { DATADIR/"unsigned_broken_header.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; // Unsigned, but a broken digest 'superseeds' CHK_NOSIG BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_FAIL, { { RpmDb::CHK_FAIL, " Header SHA1 digest: BAD (Expected d6768447e13388b0c35fb151ebfa8f6646a115e9 != dd761ace671a5eb2669b269faf22a3cd72792138)" }, { RpmDb::CHK_FAIL, " Header SHA256 digest: BAD (Expected 2ce9f41bc0de68b4cb1aa1e18c1bea43dfaa01299ae61ef3e4466df332c792e5 != 4a9410db7131cead773afe1876f2490023ccc7dc47cbba47807430c53ea9649d)" }, { RpmDb::CHK_FAIL, " Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" }, { RpmDb::CHK_FAIL, " MD5 digest: BAD (Expected e3f474f75d2d2b267da4ff80fc071dd7 != 9afd6b52896d23910280ddded1921071)" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(signed_pkg_nokey) { Pathname rpm { DATADIR/"signed.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_NOKEY, { { RpmDb::CHK_NOKEY, " Header V4 RSA/SHA256 Signature, key ID e279209bbb65a216: NOKEY" }, { RpmDb::CHK_OK, " Header SHA1 digest: OK" }, { RpmDb::CHK_OK, " Header SHA256 digest: OK" }, { RpmDb::CHK_OK, " Payload SHA256 digest: OK" }, { RpmDb::CHK_OK, " MD5 digest: OK" }, { RpmDb::CHK_NOKEY, " V4 RSA/SHA256 Signature, key ID e279209bbb65a216: NOKEY" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(signed_broken_pkg_nokey) { Pathname rpm { DATADIR/"signed_broken.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_FAIL, { { RpmDb::CHK_NOKEY, " Header V4 RSA/SHA256 Signature, key ID e279209bbb65a216: NOKEY" }, { RpmDb::CHK_OK, " Header SHA1 digest: OK" }, { RpmDb::CHK_OK, " Header SHA256 digest: OK" }, { RpmDb::CHK_FAIL, " Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" }, { RpmDb::CHK_FAIL, " MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 442a473472708c39f3ac2b5eb38b476f)" }, { RpmDb::CHK_FAIL, " V4 RSA/SHA256 Signature, key ID e279209bbb65a216: BAD" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(signed_broken_header_pkg_nokey) { Pathname rpm { DATADIR/"signed_broken_header.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_FAIL, { { RpmDb::CHK_FAIL, " Header V4 RSA/SHA256 Signature, key ID e279209bbb65a216: BAD" }, { RpmDb::CHK_FAIL, " Header SHA1 digest: BAD (Expected 9ca2e0aec038e562d33442271ee52c08ded0d637 != 9ca2e3aec038e562d33442271ee52c08ded0d637)" }, { RpmDb::CHK_FAIL, " Header SHA256 digest: BAD (Expected e8810065608e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732 != e88100656c8e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732)" }, { RpmDb::CHK_FAIL, " Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" }, { RpmDb::CHK_FAIL, " MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 442a473472708c39f3ac2b5eb38b476f)" }, { RpmDb::CHK_FAIL, " V4 RSA/SHA256 Signature, key ID e279209bbb65a216: BAD" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } /////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(add_key) { PublicKey key { Pathname(DATADIR)/"signed.key" }; //cout << key << endl; test.target().rpmDb().importPubkey( key ); } /////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(signed_pkg_withkey) { Pathname rpm { DATADIR/"signed.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_OK, { { RpmDb::CHK_OK, " Header V4 RSA/SHA256 Signature, key ID bb65a216: OK" }, { RpmDb::CHK_OK, " Header SHA1 digest: OK" }, { RpmDb::CHK_OK, " Header SHA256 digest: OK" }, { RpmDb::CHK_OK, " Payload SHA256 digest: OK" }, { RpmDb::CHK_OK, " MD5 digest: OK" }, { RpmDb::CHK_OK, " V4 RSA/SHA256 Signature, key ID bb65a216: OK" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(signed_broken_pkg_withkey) { Pathname rpm { DATADIR/"signed_broken.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_FAIL, { { RpmDb::CHK_OK, " Header V4 RSA/SHA256 Signature, key ID e279209bbb65a216: OK" }, { RpmDb::CHK_OK, " Header SHA1 digest: OK" }, { RpmDb::CHK_OK, " Header SHA256 digest: OK" }, { RpmDb::CHK_FAIL, " Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" }, { RpmDb::CHK_FAIL, " MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 442a473472708c39f3ac2b5eb38b476f)" }, { RpmDb::CHK_FAIL, " V4 RSA/SHA256 Signature, key ID e279209bbb65a216: BAD" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } BOOST_AUTO_TEST_CASE(signed_broken_header_pkg_withkey) { Pathname rpm { DATADIR/"signed_broken_header.rpm" }; CheckResult cp { gcheckPackage( rpm ) }; CheckResult cs { gcheckPackageSignature( rpm ) }; BOOST_CHECK_EQUAL( cp, cs ); CheckResult xpct { RpmDb::CHK_FAIL, { { RpmDb::CHK_FAIL, " Header V4 RSA/SHA256 Signature, key ID e279209bbb65a216: BAD" }, { RpmDb::CHK_FAIL, " Header SHA1 digest: BAD (Expected 9ca2e0aec038e562d33442271ee52c08ded0d637 != 9ca2e3aec038e562d33442271ee52c08ded0d637)" }, { RpmDb::CHK_FAIL, " Header SHA256 digest: BAD (Expected e8810065608e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732 != e88100656c8e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732)" }, { RpmDb::CHK_FAIL, " Payload SHA256 digest: BAD (Expected 6632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795 != 85156c232f4c76273bbbb134d8d869e93bbfc845dd0d79016856e5356dd33727)" }, { RpmDb::CHK_FAIL, " MD5 digest: BAD (Expected 8e64684e4d5bd90c3c13f76ecbda9ee2 != 442a473472708c39f3ac2b5eb38b476f)" }, { RpmDb::CHK_FAIL, " V4 RSA/SHA256 Signature, key ID e279209bbb65a216: BAD" }, } }; BOOST_CHECK_EQUAL( xpct, cs ); } libzypp-17.36.5/tests/zypp/Selectable_test.cc000066400000000000000000000317661476576476200212100ustar00rootroot00000000000000#include "TestSetup.h" #include #include #define BOOST_TEST_MODULE Selectable ///////////////////////////////////////////////////////////////////////////// static TestSetup test( TestSetup::initLater ); struct TestInit { TestInit() { test = TestSetup( ); // zypp::base::LogControl::instance().logToStdErr(); test.loadTestcaseRepos( TESTS_SRC_DIR"/data/TCSelectable" ); // dumpRange( USR, test.pool().knownRepositoriesBegin(), // test.pool().knownRepositoriesEnd() ) << endl; // USR << "pool: " << test.pool() << endl; } ~TestInit() { test.reset(); } }; BOOST_GLOBAL_FIXTURE( TestInit ); ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(candiadate) { ResPoolProxy poolProxy( test.poolProxy() ); ui::Selectable::Ptr s( poolProxy.lookup( ResKind::package, "candidate" ) ); // (I 1) { // I__s_(8)candidate-1-1.i586(@System)(openSUSE) // } (A 6) { // U__s_(2)candidate-4-1.x86_64(RepoHIGH)(unkown) // U__s_(3)candidate-4-1.i586(RepoHIGH)(unkown) <- (update) candidate if allowVendorChange // U__s_(6)candidate-0-1.x86_64(RepoMID)(openSUSE) // U__s_(7)candidate-0-1.i586(RepoMID)(openSUSE) <- candidate (highest prio matching arch and vendor) // U__s_(4)candidate-2-1.x86_64(RepoLOW)(openSUSE) // U__s_(5)candidate-2-1.i586(RepoLOW)(openSUSE) // } if ( ZConfig::instance().solver_allowVendorChange() ) { BOOST_CHECK_EQUAL( s->candidateObj()->repoInfo().alias(), "RepoHIGH" ); BOOST_CHECK_EQUAL( s->candidateObj()->edition(), Edition("4-1") ); BOOST_CHECK_EQUAL( s->candidateObj()->arch(), Arch_i586 ); // updateCandidate: BOOST_CHECK_EQUAL( s->updateCandidateObj(), s->candidateObj() ); } else { BOOST_CHECK_EQUAL( s->candidateObj()->repoInfo().alias(), "RepoMID" ); BOOST_CHECK_EQUAL( s->candidateObj()->edition(), Edition("0-1") ); BOOST_CHECK_EQUAL( s->candidateObj()->arch(), Arch_i586 ); // no updateCandidate due to low version BOOST_CHECK_EQUAL( s->updateCandidateObj(), PoolItem() ); } } BOOST_AUTO_TEST_CASE(candiadatenoarch) { ResPoolProxy poolProxy( test.poolProxy() ); ui::Selectable::Ptr s( poolProxy.lookup( ResKind::package, "candidatenoarch" ) ); /*[package]candidatenoarch: S_KeepInstalled (I 1) { I__s_(17)candidatenoarch-1-1.i586(@System) } (A 8) { C U__s_(4)candidatenoarch-5-1.noarch(RepoHIGH) <- candidate (arch/noarch change) U__s_(5)candidatenoarch-4-1.x86_64(RepoHIGH) U__s_(6)candidatenoarch-4-1.i586(RepoHIGH) U__s_(7)candidatenoarch-4-1.noarch(RepoHIGH) U__s_(12)candidatenoarch-0-2.noarch(RepoMID) U__s_(13)candidatenoarch-0-1.x86_64(RepoMID) U__s_(14)candidatenoarch-0-1.i586(RepoMID) U__s_(15)candidatenoarch-0-1.noarch(RepoMID) } */ BOOST_CHECK_EQUAL( s->candidateObj()->repoInfo().alias(), "RepoHIGH" ); BOOST_CHECK_EQUAL( s->candidateObj()->edition(), Edition("5-1") ); BOOST_CHECK_EQUAL( s->candidateObj()->arch(), Arch_noarch ); // no updateCandidate due to low version BOOST_CHECK_EQUAL( s->updateCandidateObj(), s->candidateObj() ); } ///////////////////////////////////////////////////////////////////////////// // // Status change tests // ///////////////////////////////////////////////////////////////////////////// // build ResStatus and return whether the comination is supported. (e.g currently no LOCKED state below APPL_HIGH) inline bool initStatus( ResStatus::TransactValue fromState, ResStatus::TransactByValue fromBy, ResStatus & from ) { from = ResStatus(); if ( fromState == ResStatus::KEEP_STATE ) { from.setSoftLock( fromBy ); } else { from.setTransactValue( fromState, fromBy ); if ( fromState == ResStatus::LOCKED && ! from.isLocked() ) return false; // no lock at this level (by now just USER APPL_HIGH) } return true; } ///////////////////////////////////////////////////////////////////////////// // status verification helper ///////////////////////////////////////////////////////////////////////////// // enum TransactValue // { // KEEP_STATE = bit::RangeValue::value, // LOCKED = bit::RangeValue::value, // locked, must not transact // TRANSACT = bit::RangeValue::value // transact according to state // }; template inline bool _all( TIter begin_r, TIter end_r, ResStatus::TransactValue val_r ) { for_( it, begin_r, end_r ) { if ( it->status().getTransactValue() != val_r ) return false; } return true; } template inline bool _none( TIter begin_r, TIter end_r, ResStatus::TransactValue val_r ) { for_( it, begin_r, end_r ) { if ( it->status().getTransactValue() == val_r ) return false; } return true; } template inline bool _atLeastOne( TIter begin_r, TIter end_r, ResStatus::TransactValue val_r ) { return ! _none( begin_r, end_r, val_r ); } inline bool _allBySolver( ui::Selectable::Ptr sel ) { for_( it, sel->installedBegin(), sel->installedEnd() ) { if ( it->status().transacts() && ! it->status().isBySolver() ) return false; } for_( it, sel->availableBegin(), sel->availableEnd() ) { if ( it->status().transacts() && ! it->status().isBySolver() ) return false; } return true; } inline bool _allInstalled( ui::Selectable::Ptr sel, ResStatus::TransactValue val_r ) { return _all( sel->installedBegin(), sel->installedEnd(), val_r ); } inline bool _noneInstalled( ui::Selectable::Ptr sel, ResStatus::TransactValue val_r ) { return _none( sel->installedBegin(), sel->installedEnd(), val_r ); } inline bool _atLeastOneInstalled( ui::Selectable::Ptr sel, ResStatus::TransactValue val_r ) { return _atLeastOne( sel->installedBegin(), sel->installedEnd(), val_r ); } inline bool _allAvailable( ui::Selectable::Ptr sel, ResStatus::TransactValue val_r ) { return _all( sel->availableBegin(), sel->availableEnd(), val_r ); } inline bool _noneAvailable( ui::Selectable::Ptr sel, ResStatus::TransactValue val_r ) { return _none( sel->availableBegin(), sel->availableEnd(), val_r ); } inline bool _atLeastOneAvailable( ui::Selectable::Ptr sel, ResStatus::TransactValue val_r ) { return _atLeastOne( sel->availableBegin(), sel->availableEnd(), val_r ); } inline bool _haveInstalled( ui::Selectable::Ptr sel ) { return ! sel->installedEmpty(); } inline bool _haveAvailable( ui::Selectable::Ptr sel ) { return ! sel->availableEmpty(); } inline bool _noInstalled( ui::Selectable::Ptr sel ) { return sel->installedEmpty(); } inline bool _noAvailable( ui::Selectable::Ptr sel ) { return sel->availableEmpty(); } #define allInstalled(V) _allInstalled(sel,ResStatus::V) #define noneInstalled(V) _noneInstalled(sel,ResStatus::V) #define atLeastOneInstalled(V) _atLeastOneInstalled(sel,ResStatus::V) #define allAvailable(V) _allAvailable(sel,ResStatus::V) #define noneAvailable(V) _noneAvailable(sel,ResStatus::V) #define atLeastOneAvailable(V) _atLeastOneAvailable(sel,ResStatus::V) #define haveInstalled _haveInstalled(sel) #define haveAvailable _haveAvailable(sel) #define noInstalled _noInstalled(sel) #define noAvailable _noAvailable(sel) #define allBySolver _allBySolver(sel) // Verify Selectable::status computes the right value. // // S_Protected, // Keep this unmodified ( have installedObj && S_Protected ) // S_Taboo, // Keep this unmodified ( have no installedObj && S_Taboo) // // requested by user: // S_Del, // delete installedObj ( clears S_Protected if set ) // S_Update, // install candidateObj ( have installedObj, clears S_Protected if set ) // S_Install, // install candidateObj ( have no installedObj, clears S_Taboo if set ) // // not requested by user: // S_AutoDel, // delete installedObj // S_AutoUpdate, // install candidateObj ( have installedObj ) // S_AutoInstall, // install candidateObj ( have no installedObj ) // // no modification: // S_KeepInstalled, // no modification ( have installedObj && !S_Protected, clears S_Protected if set ) // S_NoInst, // no modification ( have no installedObj && !S_Taboo, clears S_Taboo if set ) void verifyState( ui::Selectable::Ptr sel ) { ui::Status status( sel->status() ); SEC << dump(sel) << endl; switch ( status ) { case ui::S_Update: case ui::S_AutoUpdate: BOOST_CHECK( haveInstalled ); BOOST_CHECK( atLeastOneAvailable(TRANSACT) ); BOOST_CHECK_EQUAL( allBySolver, status==ui::S_AutoUpdate ); break; case ui::S_Del: case ui::S_AutoDel: BOOST_CHECK( haveInstalled ); BOOST_CHECK( noneAvailable(TRANSACT) ); // else would be UPDATE BOOST_CHECK( atLeastOneInstalled(TRANSACT) ); BOOST_CHECK_EQUAL( allBySolver, status==ui::S_AutoDel ); break; case ui::S_Protected: BOOST_CHECK( haveInstalled ); BOOST_CHECK( noneAvailable(TRANSACT) ); // else would be UPDATE BOOST_CHECK( noneInstalled(TRANSACT) ); // else would be DEL BOOST_CHECK( allInstalled(LOCKED) ); // implies noneInstalled(TRANSACT) break; case ui::S_KeepInstalled: BOOST_CHECK( haveInstalled ); BOOST_CHECK( noneAvailable(TRANSACT) ); // else would be UPDATE BOOST_CHECK( noneInstalled(TRANSACT) ); // else would be DEL BOOST_CHECK( ! allInstalled(LOCKED) ); // else would be PROTECTED break; case ui::S_Install: case ui::S_AutoInstall: BOOST_CHECK( noInstalled ); BOOST_CHECK( atLeastOneAvailable(TRANSACT) ); BOOST_CHECK_EQUAL( allBySolver, status==ui::S_AutoInstall ); break; case ui::S_Taboo: BOOST_CHECK( noInstalled ); BOOST_CHECK( noneAvailable(TRANSACT) ); // else would be INSTALL BOOST_CHECK( allAvailable(LOCKED) ); // implies noneAvailable(TRANSACT) break; case ui::S_NoInst: BOOST_CHECK( noInstalled ); BOOST_CHECK( noneAvailable(TRANSACT) ); // else would be INSTALL BOOST_CHECK( ! allAvailable(LOCKED) ); // else would be TABOO break; } } // Create all ResStatus combinations over a Selectables PoolItems struct StatusCombination { StatusCombination() {} StatusCombination( ui::Selectable::Ptr sel_r ) { _items.insert( _items.end(), sel_r->installedBegin(), sel_r->installedEnd() ); _items.insert( _items.end(), sel_r->availableBegin(), sel_r->availableEnd() ); } bool next() { for (auto i : _items) { switch ( i.status().getTransactValue() ) { case ResStatus::KEEP_STATE: i.status().setTransactValue( ResStatus::LOCKED, ResStatus::USER ); return true; break; case ResStatus::LOCKED: i.status().setTransactValue( ResStatus::TRANSACT, ResStatus::USER ); return true; break; case ResStatus::TRANSACT: i.status().setTransactValue( ResStatus::KEEP_STATE, ResStatus::USER ); break; } } return false; // back at the beginning } std::vector _items; }; // Create all ResStatus combinations over the Selectables PoolItems and verify the result. void testStatusTable( ui::Selectable::Ptr sel ) { StatusCombination comb( sel ); do { verifyState( sel ); } while ( comb.next() ); } BOOST_AUTO_TEST_CASE(status_verify) { // this verifies the Selectables computes ui::Status ResPoolProxy poolProxy( test.poolProxy() ); ResPoolProxy::ScopedSaveState saveState( poolProxy ); { ui::Selectable::Ptr sel( poolProxy.lookup( ResKind::package, "installed_only" ) ); BOOST_REQUIRE( !sel->installedEmpty() ); BOOST_REQUIRE( sel->availableEmpty() ); BOOST_CHECK_EQUAL( sel->status(), ui::S_KeepInstalled ); testStatusTable( sel ); } { ui::Selectable::Ptr sel( poolProxy.lookup( ResKind::package, "installed_and_available" ) ); BOOST_REQUIRE( !sel->installedEmpty() ); BOOST_REQUIRE( !sel->availableEmpty() ); BOOST_CHECK_EQUAL( sel->status(), ui::S_KeepInstalled ); testStatusTable( sel ); } { ui::Selectable::Ptr sel( poolProxy.lookup( ResKind::package, "available_only" ) ); BOOST_REQUIRE( sel->installedEmpty() ); BOOST_REQUIRE( !sel->availableEmpty() ); BOOST_CHECK_EQUAL( sel->status(), ui::S_NoInst ); testStatusTable( sel ); } // TODO: Test the pickStatus computation (w./w.o. multiinstall) // TODO: Test status/pickStatus transactions (w./w.o. multiinstall) } ///////////////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(pickstatus_cycle) { return; // TODO: automate it ResPoolProxy poolProxy( test.poolProxy() ); ResPoolProxy::ScopedSaveState saveState( poolProxy ); ui::Selectable::Ptr sel( poolProxy.lookup( ResKind::package, "installed_and_available" ) ); USR << dump(sel) << endl; for ( const PoolItem & pi : sel->picklist() ) { (sel->pickInstall( pi, ResStatus::USER ) ? WAR : ERR) << (pi.multiversionInstall() ? "M " : " " ) << pi << endl; USR << dump(sel) << endl; } } ///////////////////////////////////////////////////////////////////////////// libzypp-17.36.5/tests/zypp/SetRelationMixin_test.cc000066400000000000000000000170171476576476200223740ustar00rootroot00000000000000#include #include using zypp::SetCompare; using zypp::SetRelation; BOOST_AUTO_TEST_CASE(set_compare) { BOOST_CHECK( SetCompare::uncomparable == SetCompare::uncomparable ); BOOST_CHECK( SetCompare::uncomparable != SetCompare::equal ); BOOST_CHECK( SetCompare::uncomparable != SetCompare::properSubset ); BOOST_CHECK( SetCompare::uncomparable != SetCompare::properSuperset ); BOOST_CHECK( SetCompare::uncomparable != SetCompare::disjoint ); BOOST_CHECK( SetCompare::equal != SetCompare::uncomparable ); BOOST_CHECK( SetCompare::equal == SetCompare::equal ); BOOST_CHECK( SetCompare::equal != SetCompare::properSubset ); BOOST_CHECK( SetCompare::equal != SetCompare::properSuperset ); BOOST_CHECK( SetCompare::equal != SetCompare::disjoint ); BOOST_CHECK( SetCompare::properSubset != SetCompare::uncomparable ); BOOST_CHECK( SetCompare::properSubset != SetCompare::equal ); BOOST_CHECK( SetCompare::properSubset == SetCompare::properSubset ); BOOST_CHECK( SetCompare::properSubset != SetCompare::properSuperset ); BOOST_CHECK( SetCompare::properSubset != SetCompare::disjoint ); BOOST_CHECK( SetCompare::properSuperset != SetCompare::uncomparable ); BOOST_CHECK( SetCompare::properSuperset != SetCompare::equal ); BOOST_CHECK( SetCompare::properSuperset != SetCompare::properSubset ); BOOST_CHECK( SetCompare::properSuperset == SetCompare::properSuperset ); BOOST_CHECK( SetCompare::properSuperset != SetCompare::disjoint ); BOOST_CHECK( SetCompare::disjoint != SetCompare::uncomparable ); BOOST_CHECK( SetCompare::disjoint != SetCompare::equal ); BOOST_CHECK( SetCompare::disjoint != SetCompare::properSubset ); BOOST_CHECK( SetCompare::disjoint != SetCompare::properSuperset ); BOOST_CHECK( SetCompare::disjoint == SetCompare::disjoint ); } BOOST_AUTO_TEST_CASE(set_relation) { BOOST_CHECK( SetRelation::uncomparable == SetRelation::uncomparable ); BOOST_CHECK( SetRelation::uncomparable != SetRelation::equal ); BOOST_CHECK( SetRelation::uncomparable != SetRelation::properSubset ); BOOST_CHECK( SetRelation::uncomparable != SetRelation::properSuperset ); BOOST_CHECK( SetRelation::uncomparable != SetRelation::disjoint ); BOOST_CHECK( SetRelation::uncomparable != SetRelation::subset ); BOOST_CHECK( SetRelation::uncomparable != SetRelation::superset ); BOOST_CHECK( SetRelation::equal != SetRelation::uncomparable ); BOOST_CHECK( SetRelation::equal == SetRelation::equal ); BOOST_CHECK( SetRelation::equal != SetRelation::properSubset ); BOOST_CHECK( SetRelation::equal != SetRelation::properSuperset ); BOOST_CHECK( SetRelation::equal != SetRelation::disjoint ); BOOST_CHECK( SetRelation::equal != SetRelation::subset ); BOOST_CHECK( SetRelation::equal != SetRelation::superset ); BOOST_CHECK( SetRelation::properSubset != SetRelation::uncomparable ); BOOST_CHECK( SetRelation::properSubset != SetRelation::equal ); BOOST_CHECK( SetRelation::properSubset == SetRelation::properSubset ); BOOST_CHECK( SetRelation::properSubset != SetRelation::properSuperset ); BOOST_CHECK( SetRelation::properSubset != SetRelation::disjoint ); BOOST_CHECK( SetRelation::properSubset != SetRelation::subset ); BOOST_CHECK( SetRelation::properSubset != SetRelation::superset ); BOOST_CHECK( SetRelation::properSuperset != SetRelation::uncomparable ); BOOST_CHECK( SetRelation::properSuperset != SetRelation::equal ); BOOST_CHECK( SetRelation::properSuperset != SetRelation::properSubset ); BOOST_CHECK( SetRelation::properSuperset == SetRelation::properSuperset ); BOOST_CHECK( SetRelation::properSuperset != SetRelation::disjoint ); BOOST_CHECK( SetRelation::properSuperset != SetRelation::subset ); BOOST_CHECK( SetRelation::properSuperset != SetRelation::superset ); BOOST_CHECK( SetRelation::disjoint != SetRelation::uncomparable ); BOOST_CHECK( SetRelation::disjoint != SetRelation::equal ); BOOST_CHECK( SetRelation::disjoint != SetRelation::properSubset ); BOOST_CHECK( SetRelation::disjoint != SetRelation::properSuperset ); BOOST_CHECK( SetRelation::disjoint == SetRelation::disjoint ); BOOST_CHECK( SetRelation::disjoint != SetRelation::subset ); BOOST_CHECK( SetRelation::disjoint != SetRelation::superset ); BOOST_CHECK( SetRelation::subset != SetRelation::uncomparable ); BOOST_CHECK( SetRelation::subset != SetRelation::equal ); BOOST_CHECK( SetRelation::subset != SetRelation::properSubset ); BOOST_CHECK( SetRelation::subset != SetRelation::properSuperset ); BOOST_CHECK( SetRelation::subset != SetRelation::disjoint ); BOOST_CHECK( SetRelation::subset == SetRelation::subset ); BOOST_CHECK( SetRelation::subset != SetRelation::superset ); BOOST_CHECK( SetRelation::superset != SetRelation::uncomparable ); BOOST_CHECK( SetRelation::superset != SetRelation::equal ); BOOST_CHECK( SetRelation::superset != SetRelation::properSubset ); BOOST_CHECK( SetRelation::superset != SetRelation::properSuperset ); BOOST_CHECK( SetRelation::superset != SetRelation::disjoint ); BOOST_CHECK( SetRelation::superset != SetRelation::subset ); BOOST_CHECK( SetRelation::superset == SetRelation::superset ); } BOOST_AUTO_TEST_CASE(set_relation_comapre) { BOOST_CHECK( SetRelation::uncomparable == SetCompare::uncomparable ); BOOST_CHECK( SetRelation::uncomparable != SetCompare::equal ); BOOST_CHECK( SetRelation::uncomparable != SetCompare::properSubset ); BOOST_CHECK( SetRelation::uncomparable != SetCompare::properSuperset ); BOOST_CHECK( SetRelation::uncomparable != SetCompare::disjoint ); BOOST_CHECK( SetRelation::equal != SetCompare::uncomparable ); BOOST_CHECK( SetRelation::equal == SetCompare::equal ); BOOST_CHECK( SetRelation::equal != SetCompare::properSubset ); BOOST_CHECK( SetRelation::equal != SetCompare::properSuperset ); BOOST_CHECK( SetRelation::equal != SetCompare::disjoint ); BOOST_CHECK( SetRelation::properSubset != SetCompare::uncomparable ); BOOST_CHECK( SetRelation::properSubset != SetCompare::equal ); BOOST_CHECK( SetRelation::properSubset == SetCompare::properSubset ); BOOST_CHECK( SetRelation::properSubset != SetCompare::properSuperset ); BOOST_CHECK( SetRelation::properSubset != SetCompare::disjoint ); BOOST_CHECK( SetRelation::properSuperset != SetCompare::uncomparable ); BOOST_CHECK( SetRelation::properSuperset != SetCompare::equal ); BOOST_CHECK( SetRelation::properSuperset != SetCompare::properSubset ); BOOST_CHECK( SetRelation::properSuperset == SetCompare::properSuperset ); BOOST_CHECK( SetRelation::properSuperset != SetCompare::disjoint ); BOOST_CHECK( SetRelation::disjoint != SetCompare::uncomparable ); BOOST_CHECK( SetRelation::disjoint != SetCompare::equal ); BOOST_CHECK( SetRelation::disjoint != SetCompare::properSubset ); BOOST_CHECK( SetRelation::disjoint != SetCompare::properSuperset ); BOOST_CHECK( SetRelation::disjoint == SetCompare::disjoint ); BOOST_CHECK( SetRelation::subset != SetCompare::uncomparable ); BOOST_CHECK( SetRelation::subset == SetCompare::equal ); BOOST_CHECK( SetRelation::subset == SetCompare::properSubset ); BOOST_CHECK( SetRelation::subset != SetCompare::properSuperset ); BOOST_CHECK( SetRelation::subset != SetCompare::disjoint ); BOOST_CHECK( SetRelation::superset != SetCompare::uncomparable ); BOOST_CHECK( SetRelation::superset == SetCompare::equal ); BOOST_CHECK( SetRelation::superset != SetCompare::properSubset ); BOOST_CHECK( SetRelation::superset == SetCompare::properSuperset ); BOOST_CHECK( SetRelation::superset != SetCompare::disjoint ); } libzypp-17.36.5/tests/zypp/SetTracker_test.cc000066400000000000000000000055171476576476200212070ustar00rootroot00000000000000#include #include #include #include typedef std::set SetType; namespace std { inline ostream & operator<<( ostream & str, const SetType & obj ) { return zypp::dumpRangeLine( str, obj.begin(), obj.end() ); } } typedef zypp::base::SetTracker Tracker; std::set s; std::set s1 ({1}); std::set s2 ({2}); std::set s3 ({3}); std::set s12 ({1,2}); std::set s13 ({1,3}); std::set s23 ({2,3}); std::set s123 ({1,2,3}); BOOST_AUTO_TEST_CASE(basic) { Tracker t; BOOST_CHECK_EQUAL( t.current(), s ); BOOST_CHECK_EQUAL( t.added(), s ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.add( 1 ) ); BOOST_CHECK_EQUAL( t.current(), s1 ); BOOST_CHECK_EQUAL( t.added(), s1 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( !t.add( 1 ) ); BOOST_CHECK_EQUAL( t.current(), s1 ); BOOST_CHECK_EQUAL( t.added(), s1 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.add( 2 ) ); BOOST_CHECK_EQUAL( t.current(), s12 ); BOOST_CHECK_EQUAL( t.added(), s12 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.remove( 1 ) ); BOOST_CHECK_EQUAL( t.current(), s2 ); BOOST_CHECK_EQUAL( t.added(), s2 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.set( s3 ) ); BOOST_CHECK_EQUAL( t.current(), s3 ); BOOST_CHECK_EQUAL( t.added(), s3 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.add( 2 ) ); BOOST_CHECK_EQUAL( t.current(), s23 ); BOOST_CHECK_EQUAL( t.added(), s23 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.remove( 2 ) ); BOOST_CHECK_EQUAL( t.current(), s3 ); BOOST_CHECK_EQUAL( t.added(), s3 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( ! t.remove( 2 ) ); BOOST_CHECK_EQUAL( t.current(), s3 ); BOOST_CHECK_EQUAL( t.added(), s3 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.set( s ) ); BOOST_CHECK_EQUAL( t.current(), s ); BOOST_CHECK_EQUAL( t.added(), s ); BOOST_CHECK_EQUAL( t.removed(), s ); //---------------------------------------------------------------------- BOOST_CHECK( t.setInitial( s2 ) ); BOOST_CHECK_EQUAL( t.current(), s2 ); BOOST_CHECK_EQUAL( t.added(), s ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.set( s13 ) ); BOOST_CHECK_EQUAL( t.current(), s13 ); BOOST_CHECK_EQUAL( t.added(), s13 ); BOOST_CHECK_EQUAL( t.removed(), s2 ); BOOST_CHECK( t.set( s123 ) ); BOOST_CHECK_EQUAL( t.current(), s123 ); BOOST_CHECK_EQUAL( t.added(), s13 ); BOOST_CHECK_EQUAL( t.removed(), s ); BOOST_CHECK( t.set( s ) ); BOOST_CHECK_EQUAL( t.current(), s ); BOOST_CHECK_EQUAL( t.added(), s ); BOOST_CHECK_EQUAL( t.removed(), s2 ); BOOST_CHECK( t.set( s2 ) ); BOOST_CHECK_EQUAL( t.current(), s2 ); BOOST_CHECK_EQUAL( t.added(), s ); BOOST_CHECK_EQUAL( t.removed(), s ); } libzypp-17.36.5/tests/zypp/Signature_test.cc000066400000000000000000000010101476576476200210610ustar00rootroot00000000000000 #include #include #include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace zypp; void signature_test() { } test_suite* init_unit_test_suite( int, char* [] ) { test_suite* test= BOOST_TEST_SUITE( "SignaureTest" ); test->add( BOOST_TEST_CASE( &signature_test ), 0 /* expected zero error */ ); return test; } libzypp-17.36.5/tests/zypp/StrMatcher_test.cc000066400000000000000000000131671476576476200212140ustar00rootroot00000000000000#include "TestSetup.h" #include #include #include /////////////////////////////////////////////////////////////////// // // CLASS NAME : Matcher // /////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(Match_default) { Match m; BOOST_CHECK( !m ); // eval in boolean context BOOST_CHECK_EQUAL( m, Match::NOTHING ); BOOST_CHECK_EQUAL( m.get(), 0 ); // set the mode part BOOST_CHECK_EQUAL( m |= Match::STRING, Match::STRING ); m.setModeSubstring(); BOOST_CHECK_EQUAL( m, Match::SUBSTRING ); m.setMode( Match::GLOB ); BOOST_CHECK_EQUAL( m, Match::GLOB ); BOOST_CHECK_EQUAL( m = Match::REGEX, Match::REGEX ); BOOST_CHECK( m.isModeRegex() ); m |= Match::NOCASE | Match::FILES; BOOST_CHECK_EQUAL( m, Match::REGEX | Match::NOCASE | Match::FILES ); BOOST_CHECK( m.testAnyOf( Match::SUBSTRING | Match::NOCASE | Match::FILES ) ); BOOST_CHECK( !m.test( Match::SUBSTRING | Match::NOCASE | Match::FILES ) ); BOOST_CHECK( m.test( Match::REGEX | Match::NOCASE | Match::FILES ) ); BOOST_CHECK( m.test( Match::NOCASE | Match::FILES ) ); BOOST_CHECK( m != (Match::NOCASE | Match::FILES) ); BOOST_CHECK_EQUAL( m.flags(),Match::NOCASE | Match::FILES ); m -= Match::NOCASE; // remove flags BOOST_CHECK( m.test( Match::REGEX | Match::FILES ) ); m -= Match::REGEX; BOOST_CHECK_EQUAL( m, Match::FILES ); } BOOST_AUTO_TEST_CASE(Match_operator) { // Test whether implicit conversions from enum Match::Mode to // Matcher work. There must be no difference in using mode and flag // constants. These tests usually fail at compiletime, if some operator // overload is missing. // // E.G.: // inline Match operator|( const Match & lhs, const Match & rhs ) // this does not cover (REGEX|SUBSTRING), because if both arguments // are enum Mode the compiler might want to use operator|(int,int) // instead. Match m( Match::GLOB ); m = Match::GLOB; m |= Match::GLOB; m = Match::SUBSTRING | Match::GLOB; m -= Match::GLOB; m = Match::SUBSTRING - Match::GLOB; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : StrMatcher // /////////////////////////////////////////////////////////////////// BOOST_AUTO_TEST_CASE(StrMatcher_defaultconstructed) { StrMatcher m; BOOST_CHECK_EQUAL( m.flags(), Match::NOTHING ); BOOST_CHECK( !m ); // eval in boolean context BOOST_CHECK( m.searchstring().empty() ); BOOST_CHECK_EQUAL( m.flags(), Match() ); // matches nothing: BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( " " ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( !m( "default" ) ); m.setSearchstring( "fau" ); BOOST_CHECK( m ); // eval in boolean context } BOOST_AUTO_TEST_CASE(StrMatcher_OTHER) { StrMatcher m( "fau", Match::OTHER ); BOOST_CHECK_THROW( m.compile(), MatchUnknownModeException ); } BOOST_AUTO_TEST_CASE(StrMatcher_STRING) { StrMatcher m( "fau" ); BOOST_CHECK_EQUAL( m.flags(), Match::STRING ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( !m( "fault" ) ); BOOST_CHECK( !m( "defau" ) ); BOOST_CHECK( !m( "default" ) ); } BOOST_AUTO_TEST_CASE(StrMatcher_STRINGSTART) { StrMatcher m( "fau", Match::STRINGSTART ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( m( "fault" ) ); BOOST_CHECK( !m( "defau" ) ); BOOST_CHECK( !m( "default" ) ); } BOOST_AUTO_TEST_CASE(StrMatcher_STRINGEND) { StrMatcher m( "fau", Match::STRINGEND ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( !m( "fault" ) ); BOOST_CHECK( m( "defau" ) ); BOOST_CHECK( !m( "default" ) ); } BOOST_AUTO_TEST_CASE(StrMatcher_GLOB) { // GLOB must match whole word StrMatcher m( "f[a]u", Match::GLOB ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( !m( "fault" ) ); BOOST_CHECK( !m( "defau" ) ); BOOST_CHECK( !m( "default" ) ); } BOOST_AUTO_TEST_CASE(StrMatcher_REGEX) { // REGEX matches substring (unless anchored) StrMatcher m( "f[a]u", Match::REGEX ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( m( "fault" ) ); BOOST_CHECK( m( "defau" ) ); BOOST_CHECK( m( "default" ) ); m.setSearchstring( "^f[a]u" ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( m( "fault" ) ); BOOST_CHECK( !m( "defau" ) ); BOOST_CHECK( !m( "default" ) ); m.setSearchstring( "f[a]u$" ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( !m( "fault" ) ); BOOST_CHECK( m( "defau" ) ); BOOST_CHECK( !m( "default" ) ); m.setSearchstring( "^f[a]u$" ); BOOST_CHECK( !m( "" ) ); BOOST_CHECK( !m( "a" ) ); BOOST_CHECK( m( "fau" ) ); BOOST_CHECK( !m( "fault" ) ); BOOST_CHECK( !m( "defau" ) ); BOOST_CHECK( !m( "default" ) ); } BOOST_AUTO_TEST_CASE(StrMatcher_RX) { StrMatcher m( "fau" ); BOOST_CHECK( !m.isCompiled() ); BOOST_CHECK_NO_THROW( m.compile() ); m.setSearchstring( "wa[" ); BOOST_CHECK( !m.isCompiled() ); m.setFlags( Match::REGEX ); BOOST_CHECK( !m.isCompiled() ); BOOST_CHECK_THROW( m.compile(), MatchInvalidRegexException ); BOOST_CHECK( !m.isCompiled() ); m.setSearchstring( "wa[a]" ); BOOST_CHECK_NO_THROW( m.compile() ); BOOST_CHECK( m.isCompiled() ); BOOST_CHECK( !m( "was" ) ); BOOST_CHECK( !m( "qwasq" ) ); BOOST_CHECK( m( "qwaaq" ) ); } #if 0 BOOST_AUTO_TEST_CASE(StrMatcher_) { base::LogControl::TmpLineWriter shutUp( new log::FileLineWriter( "/tmp/YLOG" ) ); MIL << "GO" << endl; } #endif libzypp-17.36.5/tests/zypp/StringV_test.cc000066400000000000000000000211621476576476200205260ustar00rootroot00000000000000#include #include #include #include #include using std::cout; using std::endl; using namespace zypp::strv; namespace tools { // Something convertible to bool struct False { operator bool() { return false; } }; template std::ostream & outsopt( std::ostream & str, const std::optional & v ) { str << "{"; if ( v.has_value() ) str << v.value(); else str << "@"; return str << "}"; } // CB data tracker void outs( std::ostream & str, std::optional w = std::optional(), std::optional i = std::optional(), std::optional f = std::optional() ) { outsopt(str,w); outsopt(str,i); outsopt(str,f) << endl; } } // namespace tools BOOST_AUTO_TEST_CASE(WordConsumerSignature) { std::string l { "0b2" }; regex r { "^|b|$" }; // Check different CB signatures are correctly overloaded and invoked. // Trace the CB calls and args passed in one big string and compare it // with the expected. // std::ostream & str { cout }; std::ostringstream str; // CB returning false BOOST_CHECK_EQUAL( 2, splitRx( l, r, [&str](std::string_view w, unsigned i, bool f) -> bool { tools::outs(str,w,i,f); return tools::False(); } ) ); BOOST_CHECK_EQUAL( 2, splitRx( l, r, [&str](std::string_view w, unsigned i) -> bool { tools::outs(str,w,i); return tools::False(); } ) ); BOOST_CHECK_EQUAL( 2, splitRx( l, r, [&str](std::string_view w) -> bool { tools::outs(str,w); return tools::False(); } ) ); BOOST_CHECK_EQUAL( 2, splitRx( l, r, [&str]() -> bool { tools::outs(str); return tools::False(); } ) ); // CB returning true BOOST_CHECK_EQUAL( 4, splitRx( l, r, [&str](std::string_view w, unsigned i, bool f) -> void { tools::outs(str,w,i,f); } ) ); BOOST_CHECK_EQUAL( 4, splitRx( l, r, [&str](std::string_view w, unsigned i) -> void { tools::outs(str,w,i); } ) ); BOOST_CHECK_EQUAL( 4, splitRx( l, r, [&str](std::string_view w) -> void { tools::outs(str,w); } ) ); BOOST_CHECK_EQUAL( 4, splitRx( l, r, [&str]() -> void { tools::outs(str); } ) ); // no CB BOOST_CHECK_EQUAL( 4, splitRx( l, r ) ); // Trace: BOOST_CHECK_EQUAL( str.str(), "{}{0}{0}\n" // F1 "{0b2}{1}{1}\n" "{}{0}{@}\n" // F2 "{0b2}{1}{@}\n" "{}{@}{@}\n" // F3 "{0b2}{@}{@}\n" "{@}{@}{@}\n" // F4 "{@}{@}{@}\n" "{}{0}{0}\n" // T1 "{0}{1}{0}\n" "{2}{2}{0}\n" "{}{3}{1}\n" "{}{0}{@}\n" // T2 "{0}{1}{@}\n" "{2}{2}{@}\n" "{}{3}{@}\n" "{}{@}{@}\n" // T3 "{0}{@}{@}\n" "{2}{@}{@}\n" "{}{@}{@}\n" "{@}{@}{@}\n" // T4 "{@}{@}{@}\n" "{@}{@}{@}\n" "{@}{@}{@}\n" ); } namespace tools { using zypp::strv::detail::WordConsumer; /* Call splitter_r and check whether CB results match word_r. May CB abort at stopAt_r. */ void checkSplit( std::function splitter_r, const std::initializer_list & words_r, unsigned stopAt_r = -1U ) { //cout << "??? " << words_r.size() << endl; auto next = words_r.begin(); unsigned ret = splitter_r( [&]( std::string_view w, unsigned i, bool f )->bool { //cout << " ["<"< " << ret << endl; BOOST_CHECK_EQUAL( next, words_r.end() ); BOOST_CHECK_EQUAL( ret, words_r.size() ); } void expectRx( const std::string & l, const regex & rx, const std::initializer_list & words, unsigned stopAt = -1U ) { checkSplit( [&](WordConsumer && wc) { return splitRx( l, rx, wc ); }, words, stopAt ); } void expectSp( std::string_view l, std::string_view sep, const std::initializer_list & words, unsigned stopAt = -1U ) { checkSplit( [&](WordConsumer && wc) { return split( l, sep, wc ); }, words, stopAt ); } void expectTp( std::string_view l, std::string_view sep, const std::initializer_list & words, unsigned stopAt = -1U ) { checkSplit( [&](WordConsumer && wc) { return split( l, sep, Trim::trim, wc ); }, words, stopAt ); } } // namespace tools BOOST_AUTO_TEST_CASE(splitRxResults) { using tools::expectRx ; regex rx; // no regex, no match ==> input reported expectRx( "", rx, {""} ); expectRx( "0", rx, {"0"} ); expectRx( "01", rx, {"01"} ); expectRx( "012", rx, {"012"} ); rx = ""; // Empty regex, empty matches expectRx( "", rx, {"",""} ); expectRx( "0", rx, {"","0",""} ); expectRx( "01", rx, {"","0","1",""} ); expectRx( "012", rx, {"","0","1","2",""} ); rx = "x*"; // Empty matches as above expectRx( "", rx, {"",""} ); expectRx( "0", rx, {"","0",""} ); expectRx( "01", rx, {"","0","1",""} ); expectRx( "012", rx, {"","0","1","2",""} ); rx = "1*"; expectRx( "", rx, {"",""} ); expectRx( "0", rx, {"","0",""} ); expectRx( "01", rx, {"","0",""} ); expectRx( "012", rx, {"","0","2",""} ); expectRx( "012\n", rx, {"","0","2","\n"} ); // no match behind a trailing NL expectRx( "012\n\n", rx, {"","0","2","\n","\n"} ); // no match behind a trailing NL rx = "^|1|$"; expectRx( "", rx, {"",""} ); expectRx( "0", rx, {"","0",""} ); expectRx( "01", rx, {"","0",""} ); expectRx( "012", rx, {"","0","2",""} ); expectRx( "012\n", rx, {"","0","2","\n"} ); // no match behind a trailing NL expectRx( "012\n\n", rx, {"","0","2","\n","\n"} ); // no match behind a trailing NL } BOOST_AUTO_TEST_CASE(splitResults) { using tools::expectSp; std::string sep; // empty sep; split [[:blank:]]+; report not empty words expectSp( "", sep, {} ); expectSp( " ", sep, {} ); expectSp( " ", sep, {} ); expectSp( " 1 ", sep, {"1"} ); expectSp( " 1 2 ", sep, {"1","2"} ); expectSp( " 1 2 ", sep, {"1","2"} ); expectSp( " 1 2 ", sep, {"1","2"}, 0 ); // CB aborted expectSp( " 1 2 ", sep, {"1","2"}, 1 ); // CB aborted sep = ","; // not empty seps.... expectSp( "", sep, {""} ); expectSp( ",", sep, {"",""} ); expectSp( ",,", sep, {"","",""} ); expectSp( "1", sep, {"1"} ); expectSp( ",1,", sep, {"","1",""} ); expectSp( ",1,2,", sep, {"","1","2",""} ); expectSp( ",1,,2,", sep, {"","1","","2",""} ); expectSp( " ", sep, {" "} ); expectSp( " , ", sep, {" "," "} ); expectSp( " , , ", sep, {" "," "," "} ); expectSp( " 1 ", sep, {" 1 "} ); expectSp( " , 1 , ", sep, {" "," 1 "," "} ); expectSp( " , 1 , 2 , ", sep, {" "," 1 "," 2 "," "} ); expectSp( " , 1 , , 2 , ", sep, {" "," 1 "," "," 2 "," "} ); expectSp( " , 1 , , 2 , ", sep, {" "," 1 , , 2 , "}, 0 ); // CB aborted using tools::expectTp; // trimmed split expectTp( " ", sep, {""} ); expectTp( " , ", sep, {"",""} ); expectTp( " , , ", sep, {"","",""} ); expectTp( " 1 ", sep, {"1"} ); expectTp( " , 1 , ", sep, {"","1",""} ); expectTp( " , 1 , 2 , ", sep, {"","1","2",""} ); expectTp( " , 1 , , 2 , ", sep, {"","1","","2",""} ); expectTp( " , 1 , , 2 , ", sep, {"","1 , , 2 ,"}, 0 ); // CB aborted } BOOST_AUTO_TEST_CASE(trimming) { BOOST_CHECK_EQUAL( ltrim(""), "" ); BOOST_CHECK_EQUAL( ltrim(" "), "" ); BOOST_CHECK_EQUAL( ltrim("1"), "1" ); BOOST_CHECK_EQUAL( ltrim(" 1"), "1" ); BOOST_CHECK_EQUAL( ltrim("1 "), "1 " ); BOOST_CHECK_EQUAL( ltrim(" 1 "), "1 " ); BOOST_CHECK_EQUAL( rtrim(""), "" ); BOOST_CHECK_EQUAL( rtrim(" "), "" ); BOOST_CHECK_EQUAL( rtrim("1"), "1" ); BOOST_CHECK_EQUAL( rtrim(" 1"), " 1" ); BOOST_CHECK_EQUAL( rtrim("1 "), "1" ); BOOST_CHECK_EQUAL( rtrim(" 1 "), " 1" ); BOOST_CHECK_EQUAL( trim(""), "" ); BOOST_CHECK_EQUAL( trim(" "), "" ); BOOST_CHECK_EQUAL( trim("1"), "1" ); BOOST_CHECK_EQUAL( trim(" 1"), "1" ); BOOST_CHECK_EQUAL( trim("1 "), "1" ); BOOST_CHECK_EQUAL( trim(" 1 "), "1" ); BOOST_CHECK_EQUAL( ltrim(" 1 "), trim(" 1 ", Trim::left) ); BOOST_CHECK_EQUAL( rtrim(" 1 "), trim(" 1 ", Trim::right) ); BOOST_CHECK_EQUAL( trim(" 1 "), trim(" 1 ", Trim::left|Trim::right) ); BOOST_CHECK_EQUAL( trim(" \t1\t "), "1" ); BOOST_CHECK_EQUAL( trim(" \t1\t ", " "), "\t1\t" ); BOOST_CHECK_EQUAL( trim(" \t1\t ", ""), " \t1\t " ); } libzypp-17.36.5/tests/zypp/Target_test.cc000066400000000000000000000036101476576476200203560ustar00rootroot00000000000000#include #include #include #include // Boost.Test #include #include #include #include #include #include #include using boost::unit_test::test_case; using namespace zypp; using namespace zypp::filesystem; BOOST_AUTO_TEST_CASE(target_test) { filesystem::TmpDir tmp; ZYpp::Ptr z = getZYpp(); // create the products.d directory assert_dir(tmp.path() / "/etc/products.d" ); BOOST_CHECK( copy( Pathname(TESTS_SRC_DIR) / "/zypp/data/Target/product.prod", tmp.path() / "/etc/products.d/product.prod") == 0 ); // make it the base product BOOST_CHECK( symlink(tmp.path() / "/etc/products.d/product.prod", tmp.path() / "/etc/products.d/baseproduct" ) == 0 ); z->initializeTarget( tmp.path() ); // bsc#1024741: Omit creating a new uid for chrooted systems (if it already has one, fine) BOOST_CHECK( ! PathInfo( tmp.path() / "/var/lib/zypp/AnonymousUniqueId").isExist() ); // create an artificial one { Pathname f( tmp.path() / "/var/lib/zypp" ); filesystem::assert_dir( f ); std::ofstream o( (f/"AnonymousUniqueId").c_str() ); o << "AnonymousUniqueId"; } BOOST_CHECK( PathInfo( tmp.path() / "/var/lib/zypp/AnonymousUniqueId").isExist() ); BOOST_CHECK_EQUAL( z->target()->anonymousUniqueId(), "AnonymousUniqueId" ); // now check the base product BOOST_CHECK_EQUAL( z->target()->targetDistribution(), "sle-10-i586"); BOOST_CHECK_EQUAL( z->target()->targetDistributionRelease(), "special_edition"); BOOST_CHECK_EQUAL( z->target()->distributionVersion(), "10"); Target::DistributionLabel dlabel( z->target()->distributionLabel() ); BOOST_CHECK_EQUAL( dlabel.summary, "A cool distribution" ); BOOST_CHECK_EQUAL( dlabel.shortName, "" ); } libzypp-17.36.5/tests/zypp/Url_test.cc000066400000000000000000000357621476576476200177070ustar00rootroot00000000000000/* ** Check if the url by scheme repository works, e.g. ** if there are some initialization order problems ** (ViewOption) causing asString to format its string ** differently than configured. */ #include #include #include #include #include #include #include // Boost.Test #include using boost::unit_test::test_case; using namespace zypp; void testUrlAuthority( const Url & url_r, const std::string & host_r, const std::string & port_r = std::string(), const std::string & user_r = std::string(), const std::string & pass_r = std::string() ) { BOOST_CHECK_EQUAL( url_r.getUsername(), user_r ); BOOST_CHECK_EQUAL( url_r.getPassword(), pass_r ); BOOST_CHECK_EQUAL( url_r.getHost(), host_r ); BOOST_CHECK_EQUAL( url_r.getPort(), port_r ); } BOOST_AUTO_TEST_CASE(test_ipv6_url) { std::string str; zypp::Url url; str = "http://[2001:DB8:0:F102::1]/64/sles11/RC1/CD1?device=eth0"; url = Url( str ); BOOST_CHECK_EQUAL( str,url.asString() ); testUrlAuthority( url, "[2001:DB8:0:F102::1]", "", "", "" ); // bnc# str = "http://[2001:DB8:0:F102::1]:8080/64/sles11/RC1/CD1?device=eth0"; url = Url( str ); testUrlAuthority( url, "[2001:DB8:0:F102::1]", "8080", "", "" ); str = "http://user:pass@[2001:DB8:0:F102::1]:8080/64/sles11/RC1/CD1?device=eth0"; url = Url( str ); testUrlAuthority( url, "[2001:DB8:0:F102::1]", "8080", "user", "pass" ); } BOOST_AUTO_TEST_CASE(test_url1) { std::string str, one, two; zypp::Url url; // asString & asCompleteString should not print "mailto://" str = "mailto:feedback@example.com?subject=hello"; url = str; BOOST_CHECK_EQUAL( str, url.asString() ); BOOST_CHECK_EQUAL( str, url.asCompleteString() ); // In general, schema without authority allows specifying an empty authority // though it should not be printed (unless explicitly requested). BOOST_CHECK_EQUAL( Url("dvd:/srv/ftp").asCompleteString(), "dvd:/srv/ftp" ); BOOST_CHECK_EQUAL( Url("dvd:/srv/ftp").asString(), "dvd:/srv/ftp" ); BOOST_CHECK_EQUAL( Url("dvd:///srv/ftp").asCompleteString(), "dvd:/srv/ftp" ); BOOST_CHECK_EQUAL( Url("dvd:///srv/ftp").asString(), "dvd:/srv/ftp" ); BOOST_CHECK_EQUAL( Url("dvd:///srv/ftp").asString(url::ViewOption::DEFAULTS+url::ViewOption::EMPTY_AUTHORITY), "dvd:///srv/ftp" ); BOOST_CHECK_EQUAL( Url("dvd:///srv/ftp").asString(url::ViewOption::DEFAULTS-url::ViewOption::EMPTY_AUTHORITY), "dvd:/srv/ftp" ); BOOST_CHECK_THROW( Url("dvd://authority/srv/ftp"), url::UrlNotAllowedException ); // asString shouldn't print the password, asCompleteString should // further, the "//" at the begin of the path should become "/%2F" str = "ftp://user:pass@localhost//srv/ftp"; one = "ftp://user@localhost/%2Fsrv/ftp"; two = "ftp://user:pass@localhost/%2Fsrv/ftp"; url = str; BOOST_CHECK_EQUAL( one, url.asString() ); BOOST_CHECK_EQUAL( two, url.asCompleteString() ); // asString shouldn't print the password, asCompleteString should. // further, the "//" at the begin of the path should be keept. str = "http://user:pass@localhost//srv/ftp?proxypass=@PROXYPASS@&proxy=proxy.my&proxyuser=@PROXYUSER@&Xproxypass=NOTTHIS&proxypass=@PROXYPASS@&proxypass=@PROXYPASS@"; one = "http://user@localhost//srv/ftp?proxy=proxy.my&proxyuser=@PROXYUSER@&Xproxypass=NOTTHIS"; two = str; url = str; BOOST_CHECK_EQUAL( one, url.asString() ); BOOST_CHECK_EQUAL( two, url.asCompleteString() ); // hidden proxypass in the query is available when explicitly asked for BOOST_CHECK_EQUAL( url.getQueryParam( "proxypass" ), "@PROXYPASS@" ); // absolute path defaults to 'file://' str = "/some/local/path"; BOOST_CHECK_EQUAL( zypp::Url(str).asString(), "file://"+str ); str = "file:./srv/ftp"; BOOST_CHECK_EQUAL( zypp::Url(str).asString(), str ); str = "ftp://foo//srv/ftp"; BOOST_CHECK_EQUAL( zypp::Url(str).asString(), "ftp://foo/%2Fsrv/ftp" ); str = "FTP://user@local%68ost/%2f/srv/ftp"; BOOST_CHECK_EQUAL( zypp::Url(str).asString(), "ftp://user@localhost/%2f/srv/ftp" ); str = "http://[::1]/foo/bar"; BOOST_CHECK_EQUAL( str, zypp::Url(str).asString() ); str = "http://:@just-localhost.example.net:8080/"; BOOST_CHECK_EQUAL( zypp::Url(str).asString(), "http://just-localhost.example.net:8080/" ); str = "mailto:feedback@example.com?subject=hello"; BOOST_CHECK_EQUAL( str, zypp::Url(str).asString() ); str = "nfs://nfs-server/foo/bar/trala"; BOOST_CHECK_EQUAL( str, zypp::Url(str).asString() ); str = "ldap://example.net/dc=example,dc=net?cn,sn?sub?(cn=*)#x"; BOOST_CHECK_THROW( zypp::Url(str).asString(), url::UrlNotAllowedException ); str = "ldap://example.net/dc=example,dc=net?cn,sn?sub?(cn=*)"; BOOST_CHECK_EQUAL( str, zypp::Url(str).asString() ); // parseable but invalid, since no host avaliable str = "ldap:///dc=foo,dc=bar"; BOOST_CHECK_EQUAL( str, zypp::Url(str).asString()); BOOST_CHECK( !zypp::Url(str).isValid()); // throws: host is mandatory str = "ftp:///foo/bar"; BOOST_CHECK_THROW(zypp::Url(str).asString(), url::UrlNotAllowedException ); // throws: host is mandatory str = "http:///%2f/srv/ftp"; BOOST_CHECK_THROW(zypp::Url(str).asString(), url::UrlNotAllowedException ); // OK, host allowed in file-url str = "file://localhost/some/path"; BOOST_CHECK_EQUAL( str, zypp::Url(str).asString()); // throws: host not allowed str = "cd://localhost/some/path"; BOOST_CHECK_THROW(zypp::Url(str).asString(), url::UrlNotAllowedException ); // throws: no path (email) str = "mailto:"; BOOST_CHECK_THROW(zypp::Url(str).asString(), url::UrlNotAllowedException ); // throws: no path str = "cd:"; BOOST_CHECK_THROW(zypp::Url(str).asString(), url::UrlNotAllowedException ); // OK, valid (no host, path is there) str = "cd:///some/path"; BOOST_CHECK( zypp::Url(str).isValid()); } BOOST_AUTO_TEST_CASE(test_url2) { zypp::Url url("http://user:pass@localhost:/path/to;version=1.1?arg=val#frag"); BOOST_CHECK_EQUAL( url.asString(), "http://user@localhost/path/to?arg=val#frag" ); BOOST_CHECK_EQUAL( url.asString(zypp::url::ViewOptions() + zypp::url::ViewOptions::WITH_PASSWORD), "http://user:pass@localhost/path/to?arg=val#frag"); BOOST_CHECK_EQUAL( url.asString(zypp::url::ViewOptions() + zypp::url::ViewOptions::WITH_PATH_PARAMS), "http://user@localhost/path/to;version=1.1?arg=val#frag"); BOOST_CHECK_EQUAL( url.asCompleteString(), "http://user:pass@localhost/path/to;version=1.1?arg=val#frag"); } BOOST_AUTO_TEST_CASE(test_url3) { zypp::Url url("http://localhost/path/to#frag"); std::string key; std::string val; // will be encoded as "hoho=ha%20ha" key = "hoho"; val = "ha ha"; url.setQueryParam(key, val); BOOST_CHECK_EQUAL( url.asString(), "http://localhost/path/to?hoho=ha%20ha#frag"); // will be encoded as "foo%3Dbar%26key=foo%26bar=value" // bsc#1234304: `=` must be encoded in key but is a safe char in value key = "foo=bar&key"; val = "foo&bar=value"; url.setQueryParam(key, val); BOOST_CHECK_EQUAL( url.asString(), "http://localhost/path/to?foo%3Dbar%26key=foo%26bar=value&hoho=ha%20ha#frag"); // will be encoded as "foo%25bar=is%25de%25ad" key = "foo%bar"; val = "is%de%ad"; url.setQueryParam(key, val); BOOST_CHECK_EQUAL( url.asString(), "http://localhost/path/to?foo%25bar=is%25de%25ad&foo%3Dbar%26key=foo%26bar=value&hoho=ha%20ha#frag"); // get encoded query parameters and compare with results: zypp::url::ParamVec params( url.getQueryStringVec()); const char * const result[] = { "foo%25bar=is%25de%25ad", "foo%3Dbar%26key=foo%26bar=value", "hoho=ha%20ha" }; BOOST_CHECK( params.size() == (sizeof(result)/sizeof(result[0]))); for( size_t i=0; ifirst) { BOOST_CHECK_EQUAL( m->second, "cn,sn"); } else if("filter" == m->first) { BOOST_CHECK_EQUAL( m->second, "(cn=*)"); } else if("scope" == m->first) { BOOST_CHECK_EQUAL( m->second, "sub"); } else { BOOST_FAIL("Unexpected LDAP query parameter name in the map!"); } } url.setQueryParam("attrs", "cn,sn,uid"); url.setQueryParam("filter", "(|(sn=foo)(cn=bar))"); BOOST_CHECK_EQUAL(url.getQueryParam("attrs"), "cn,sn,uid"); BOOST_CHECK_EQUAL(url.getQueryParam("filter"), "(|(sn=foo)(cn=bar))"); } catch(const zypp::url::UrlException &e) { ZYPP_CAUGHT(e); } } BOOST_AUTO_TEST_CASE( test_url5) { std::string str( "file:/some/${var:+path}/${var:-with}/${vars}" ); BOOST_CHECK_EQUAL( Url(str).asString(), str ); BOOST_CHECK_EQUAL( Url(zypp::url::encode( str, URL_SAFE_CHARS )).asString(), str ); } BOOST_AUTO_TEST_CASE(plugin_scriptpath) { // plugin script path must not be rewritten for ( const std::string t : { "script", "script/", "/script", "/script/", "./script", "./script/" } ) { BOOST_CHECK_EQUAL( Url("plugin:"+t).getPathName(), t ); } { // more cosmetic issue, but the RepoVarReplacer should // not change the string representation (-> "plugin:/script") Url u( "plugin:script?opt=val" ); RepoInfo i; i.setBaseUrl( u ); BOOST_CHECK_EQUAL( u.asString(), i.url().asString() ); } } BOOST_AUTO_TEST_CASE(plugin_querystring_args) { // url querysting options without value must be possible // e.g. for plugin schema Url u( "plugin:script?loptv=lvalue&v=optv&lopt=&o" ); url::ParamMap pm( u.getQueryStringMap() ); BOOST_CHECK_EQUAL( pm.size(), 4 ); BOOST_CHECK_EQUAL( pm["loptv"], "lvalue" ); BOOST_CHECK_EQUAL( pm["v"], "optv" ); BOOST_CHECK_EQUAL( pm["lopt"], "" ); BOOST_CHECK_EQUAL( pm["o"], "" ); } BOOST_AUTO_TEST_CASE(bsc1234304) { // Removing or adding queryparams should not alter the encoding of other queryparams. // Old code decoded and re-encoded all params. "__token__=exp=%3D%26" was changed to // "__token__=exp==%26" by this. That's not wrong, but we'd like to preserve the original // params if possible. Url u { "https://dl.suse.com/?__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9&t%3Dt" }; BOOST_CHECK_EQUAL( u.getQueryString(), "__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9&t%3Dt" ); u.delQueryParam("t=t"); BOOST_CHECK_EQUAL( u.getQueryString(), "__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9" ); u.setQueryParam("t=t", "a" ); BOOST_CHECK_EQUAL( u.getQueryString(), "__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9&t%3Dt=a" ); u.setQueryParam("t=t", "b" ); BOOST_CHECK_EQUAL( u.getQueryString(), "__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9&t%3Dt=b" ); u.setQueryParam("local", "b" ); BOOST_CHECK_EQUAL( u.getQueryString(), "__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9&local=b&t%3Dt=b" ); u.delQueryParams( { "t=t", "local" } ); BOOST_CHECK_EQUAL( u.getQueryString(), "__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9" ); // queryparams without value should not have a trailing "=" u.setQueryParam("empty", "" ); BOOST_CHECK_EQUAL( u.getQueryString(), "__token__=exp=%3D%261862049599~acl=/SUSE/*~hmac=968c8dc9&empty" ); } BOOST_AUTO_TEST_CASE(bsc1238315) { // Fix lost leading double slash when appending path to URLs. // A leading "//" in ordinary URLs is quite meaningless but would be preserved. // Important however with FTP whether a leading "//" is encoded as "/%2f". Url u; auto appendPathName = []( const Url & url_r, const Pathname & path_r, Url::EEncoding eflag_r = url::E_DECODED ) { Url ret { url_r }; ret.appendPathName( path_r, eflag_r ); return ret.asString(); }; // No difference with singe "/" URLs: u = Url("http://HOST/fo%20o"); BOOST_CHECK_EQUAL( appendPathName( u, "ba%20a", url::E_ENCODED ), "http://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "ba a" ), "http://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "%2fba%20a", url::E_ENCODED ), "http://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "/ba a" ), "http://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba%20a", url::E_ENCODED ), "http://host/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba a" ), "http://host/ba%20a" ); u = Url("ftp://HOST/fo%20o"); BOOST_CHECK_EQUAL( appendPathName( u, "ba%20a", url::E_ENCODED ), "ftp://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "ba a" ), "ftp://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "%2fba%20a", url::E_ENCODED ), "ftp://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "/ba a" ), "ftp://host/fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba%20a", url::E_ENCODED ), "ftp://host/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba a" ), "ftp://host/ba%20a" ); // FTP differs with double "//" URLs: u = Url("http://HOST//fo%20o"); BOOST_CHECK_EQUAL( appendPathName( u, "ba%20a", url::E_ENCODED ), "http://host//fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "ba a" ), "http://host//fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "%2fba%20a", url::E_ENCODED ), "http://host//fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "/ba a" ), "http://host//fo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba%20a", url::E_ENCODED ), "http://host//ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba a" ), "http://host//ba%20a" ); u = Url("ftp://HOST//fo%20o"); BOOST_CHECK_EQUAL( appendPathName( u, "ba%20a", url::E_ENCODED ), "ftp://host/%2Ffo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "ba a" ), "ftp://host/%2Ffo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "%2fba%20a", url::E_ENCODED ), "ftp://host/%2Ffo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "/ba a" ), "ftp://host/%2Ffo%20o/ba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba%20a", url::E_ENCODED ), "ftp://host/%2Fba%20a" ); BOOST_CHECK_EQUAL( appendPathName( u, "../ba a" ), "ftp://host/%2Fba%20a" ); } // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/tests/zypp/UserData_test.cc000066400000000000000000000047261476576476200206510ustar00rootroot00000000000000#include #include #include #include using std::cout; using std::endl; using zypp::callback::UserData; const std::string key( "key" ); #define checkIsEmpty(v) \ BOOST_CHECK( !v ); \ BOOST_CHECK( v.empty() ); \ BOOST_CHECK_EQUAL( v.size(), 0 ); \ BOOST_CHECK_EQUAL( v.haskey( key ), false ); \ BOOST_CHECK_EQUAL( v.hasvalue( key ), false ); \ BOOST_CHECK_EQUAL( v.getvalue( key ).empty(), true ); #define checkIsNotEmpty(v,s) \ BOOST_CHECK( v ); \ BOOST_CHECK( !v.empty() ); \ if ( s ) \ { BOOST_CHECK_EQUAL( v.size(), s ); } \ else \ { BOOST_CHECK( v.size() ); } \ BOOST_CHECK_EQUAL( v.haskey( key ), true ); BOOST_AUTO_TEST_CASE(useruata_default) { UserData v; checkIsEmpty( v ); // set key with empty value v.reset( key ); checkIsNotEmpty( v, 1 ); BOOST_CHECK_EQUAL( v.hasvalue( key ), false ); BOOST_CHECK_EQUAL( v.getvalue( key ).empty(), true ); std::string rs; unsigned ru = 0; int ri = 0; char rc = 0; // set key with value v.set( key, 42 ); BOOST_CHECK_EQUAL( v.hasvalue( key ), true ); BOOST_CHECK_EQUAL( v.getvalue( key ).empty(), false ); // get back data BOOST_CHECK_EQUAL( v.get( key, rs ), false ); BOOST_CHECK_EQUAL( v.get( key, ru ), false ); BOOST_CHECK_EQUAL( v.get( key, ri ), true ); BOOST_CHECK_EQUAL( v.get( key, rc ), false ); BOOST_CHECK_EQUAL( ru, 0 ); BOOST_CHECK_EQUAL( ri, 42 ); BOOST_CHECK_EQUAL( rc, 0 ); v.set( key, 43U ); BOOST_CHECK_EQUAL( v.get( key, rs ), false ); BOOST_CHECK_EQUAL( v.get( key, ru ), true ); BOOST_CHECK_EQUAL( v.get( key, ri ), false ); BOOST_CHECK_EQUAL( v.get( key, rc ), false ); BOOST_CHECK_EQUAL( ru, 43 ); BOOST_CHECK_EQUAL( ri, 42 ); BOOST_CHECK_EQUAL( rc, 0 ); // set key with empty value v.reset( key ); BOOST_CHECK_EQUAL( v.hasvalue( key ), false ); BOOST_CHECK_EQUAL( v.getvalue( key ).empty(), true ); checkIsNotEmpty( v, 1 ); // erase key v.erase( key ); BOOST_CHECK_EQUAL( v.hasvalue( key ), false ); BOOST_CHECK_EQUAL( v.getvalue( key ).empty(), true ); checkIsEmpty( v ); // const may add but not manip non-empty values const UserData & cv( v ); BOOST_CHECK_EQUAL( cv.reset( key ), true ); // add new key: ok BOOST_CHECK_EQUAL( cv.set( key, 42 ), true ); // empty -> non-empty: ok BOOST_CHECK_EQUAL( cv.set( key, 43 ), false );// change non-empty: not ok BOOST_CHECK_EQUAL( cv.reset( key ), false ); // change non-empty: not ok } libzypp-17.36.5/tests/zypp/Vendor_test.cc000066400000000000000000000115071476576476200203710ustar00rootroot00000000000000 #include #include #include // Boost.Test #include #include #include #include #include using boost::unit_test::test_case; using namespace zypp; using std::cout; using std::endl; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/Vendor") BOOST_AUTO_TEST_CASE(vendor_empty) { VendorAttr::noTargetInstance() = VendorAttr(); // suse defaults; no configfiles read BOOST_REQUIRE( VendorAttr::instance().equivalent("", "") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("a", "") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("", "a") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("a", "a") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("a", "aa") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("aa", "a") ); BOOST_REQUIRE( VendorAttr::instance().equivalent( IdString::Null, IdString::Null ) ); BOOST_REQUIRE( VendorAttr::instance().equivalent( IdString::Empty, IdString::Null ) ); BOOST_REQUIRE( VendorAttr::instance().equivalent( IdString::Null, IdString::Empty ) ); BOOST_REQUIRE( VendorAttr::instance().equivalent( IdString::Empty, IdString::Empty ) ); } BOOST_AUTO_TEST_CASE(vendor_test1) { VendorAttr::noTargetInstance() = VendorAttr(); // suse defaults; no configfiles read // bsc#1030686: Remove legacy vendor equivalence between 'suse' and 'opensuse' // No vendor definition files has been read. So only suse* vendors are // equivalent BOOST_REQUIRE( VendorAttr::instance().equivalent("suse", "SuSE as prefix") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("SuSE as prefix", "suse") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("SuSE as prefix","foreign") ); // bnc#812608: All opensuse projects get their own class (no prefix compare in opensuse namespace) BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse", "SuSE as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse as prefix", "SuSE as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse", "opensuse as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse as prefix", "opensuse but different prefix") ); // bsc#1182629: relaxed equivalence just adds suse/opensuse BOOST_REQUIRE( !VendorAttr::instance().relaxedEquivalent("SuSE as prefix","foreign") ); BOOST_REQUIRE( VendorAttr::instance().relaxedEquivalent("opensuse", "SuSE as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().relaxedEquivalent("opensuse as prefix", "SuSE as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().relaxedEquivalent("opensuse", "opensuse as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().relaxedEquivalent("opensuse as prefix", "opensuse but different prefix") ); } BOOST_AUTO_TEST_CASE(vendor_test2) { VendorAttr::noTargetInstance() = VendorAttr( DATADIR / "vendors.d" ); BOOST_REQUIRE( VendorAttr::instance().equivalent("suse", "suse") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("equal", "equal") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("suse", "SuSE") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse", "SuSE") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("open", "SuSE") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("nothing", "SuSE") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("nvidia", "SuSE") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("nvidia_new_new", "SuSE") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("nvidia", "opensuse") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("ati", "SuSE") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("ati", "nvidia") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("ati_new", "ati") ); } BOOST_AUTO_TEST_CASE(vendor_test3) { VendorAttr::noTargetInstance() = VendorAttr(); // suse defaults; no configfiles read VendorAttr::noTargetInstance().addVendorList( { "suse", "opensuse", "opensuse too" } ); BOOST_REQUIRE( VendorAttr::instance().equivalent("SuSE as prefix", "opensuse") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("SuSE as prefix", "opensuse too") ); BOOST_REQUIRE( VendorAttr::instance().equivalent("opensuse", "opensuse too") ); // bnc#812608: All opensuse projects get their own class (no prefix compare in opensuse namespace) BOOST_REQUIRE( !VendorAttr::instance().equivalent("SuSE as prefix", "opensuse as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("SuSE as prefix", "opensuse too as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse", "opensuse too as prefix") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse as prefix", "opensuse too") ); BOOST_REQUIRE( !VendorAttr::instance().equivalent("opensuse as prefix", "opensuse too as prefix") ); } libzypp-17.36.5/tests/zypp/ZChunk_test.cc000066400000000000000000000014661476576476200203410ustar00rootroot00000000000000// Boost.Test #include #include #include #include #include BOOST_AUTO_TEST_CASE(zchunk_simple_read_write) { const zypp::Pathname file = zypp::Pathname(TESTS_BUILD_DIR) / "test.zck"; const std::string testString("HelloWorld"); { zypp::ofzckstream strOut( file.c_str() ); BOOST_REQUIRE( strOut.is_open() ); strOut << testString; } BOOST_REQUIRE_EQUAL( zypp::filesystem::zipType( file ), zypp::filesystem::ZT_ZCHNK ); { std::string test; zypp::ifzckstream str( file.c_str() ); str >> test; BOOST_REQUIRE_EQUAL( test, testString ); } { zypp::InputStream iStr( file ); BOOST_REQUIRE( typeid( iStr.stream() ) == typeid( zypp::ifzckstream& ) ); } } libzypp-17.36.5/tests/zypp/base/000077500000000000000000000000001476576476200164745ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/CMakeLists.txt000066400000000000000000000001261476576476200212330ustar00rootroot00000000000000ADD_TESTS(Glob ) ADD_TESTS(Sysconfig ) ADD_TESTS(String ) ADD_TESTS(ExternalProgram ) libzypp-17.36.5/tests/zypp/base/ExternalProgram_test.cc000066400000000000000000000174161476576476200231650ustar00rootroot00000000000000#include "TestSetup.h" #include "TestTools.h" #include #include #include #include #include #include #include #include #include #define BOOST_TEST_MODULE ExternalProgram #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/base/data/ExternalProgram") using zypp::ExternalProgram; BOOST_AUTO_TEST_CASE( Basic ) { const char *argv[] = { "bash", "-c", "echo \"Hello\";sleep 1;echo \"I'm the second line\";exit 123;", nullptr }; ExternalProgram proc( argv, ExternalProgram::Normal_Stderr ); BOOST_CHECK( proc.running() ); const auto pid = proc.getpid(); BOOST_REQUIRE ( pid != -1 ); std::string line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("Hello\n") ); line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("I'm the second line\n") ); int exitCode = proc.close(); BOOST_REQUIRE( !proc.running() ); BOOST_REQUIRE_EQUAL( proc.getpid(), -1 ); BOOST_REQUIRE_EQUAL( exitCode, 123 ); BOOST_REQUIRE_LT ( ::getpgid( pid ) , 0 ); } BOOST_AUTO_TEST_CASE( StderrToStdout ) { const char *argv[] = { "bash", "-c", "echo \"Hello\";sleep 1;echo \"I'm the second line\" >&2;", nullptr }; ExternalProgram proc( argv, ExternalProgram::Stderr_To_Stdout ); BOOST_CHECK( proc.running() ); BOOST_REQUIRE ( proc.getpid() != -1 ); std::string line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("Hello\n") ); line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("I'm the second line\n") ); proc.close(); BOOST_REQUIRE( !proc.running() ); BOOST_REQUIRE_EQUAL( proc.getpid(), -1 ); } BOOST_AUTO_TEST_CASE( SetEnv ) { const char *argv[] = { "bash", "-c", "echo \"${ZYPPENV}\"", nullptr }; ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", "Hello from env") }, ExternalProgram::Normal_Stderr ); std::string line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") ); proc.close(); } // environment of the parent has to be in the child process as well // some code paths rely on that BOOST_AUTO_TEST_CASE( ParentEnv ) { const char *argv[] = { "bash", "-c", "echo \"${PARENTENV}${ZYPPENV}\"", nullptr }; setenv( "PARENTENV", "Hello from", 0 ); ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", " env") }, ExternalProgram::Normal_Stderr ); std::string line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") ); proc.close(); unsetenv( "PARENTENV" ); } // weird feature to redirect stdout and stderr BOOST_AUTO_TEST_CASE( RedirectStdoutAndStderrWithChdir ) { zypp::filesystem::TmpDir dir; const zypp::Pathname stdoutPath( dir.path()/"stdout" ); const zypp::Pathname stderrPath( dir.path()/"stderr" ); const std::string stdoutRedir( zypp::str::form(">%s", stdoutPath.c_str() ) ); const std::string chDir( zypp::str::form("#%s", dir.path().c_str() ) ); zypp::AutoFD stdErrRedir( ::open( stderrPath.c_str() , O_CREAT | O_RDWR, 0666 ) ); BOOST_REQUIRE( *stdErrRedir != -1 ); const char *argv[] = { chDir.c_str(), stdoutRedir.c_str(), "bash", "-c", "echo \"Hello on stdout\";echo \"Hello on stderr\" >&2;echo \"Hello on file in chdir\" > chdirfile", nullptr }; ExternalProgram proc (argv, ExternalProgram::Stderr_To_FileDesc, false, *stdErrRedir ); int exitCode = proc.close(); BOOST_REQUIRE( !proc.running() ); BOOST_REQUIRE_EQUAL( exitCode, 0 ); ::close( *stdErrRedir ); *stdErrRedir = -1; BOOST_REQUIRE_EQUAL( TestTools::readFile( stdoutPath ), "Hello on stdout\n"); BOOST_REQUIRE_EQUAL( TestTools::readFile( stderrPath ), "Hello on stderr\n"); BOOST_REQUIRE_EQUAL( TestTools::readFile( dir.path() / "chdirfile" ), "Hello on file in chdir\n"); } BOOST_AUTO_TEST_CASE( LongRunningEcho ) { const auto executable = DATADIR/"echo.sh"; const char *argv[] = { executable.c_str(), nullptr }; ExternalProgram proc (argv, ExternalProgram::Normal_Stderr ); BOOST_REQUIRE( proc.running() ); BOOST_REQUIRE( proc.send( "Hello" ) ); BOOST_REQUIRE( proc.send( " my friend\n" ) ); BOOST_REQUIRE( proc.send( "How are you today\n" ) ); BOOST_REQUIRE_EQUAL( proc.receiveLine(), "Hello my friend\n" ); BOOST_REQUIRE_EQUAL( proc.receiveLine(), "How are you today\n" ); BOOST_REQUIRE( proc.running() ); BOOST_REQUIRE( proc.send( "q\n" ) ); const auto res = proc.close(); BOOST_REQUIRE_EQUAL( res, 0 ); } BOOST_AUTO_TEST_CASE( SendSignal ) { const auto executable = DATADIR/"echo.sh"; const char *argv[] = { executable.c_str(), nullptr }; ExternalProgram proc (argv, ExternalProgram::Normal_Stderr ); BOOST_REQUIRE( proc.running() ); proc.kill( SIGTERM ); const auto exitCode = proc.close(); BOOST_REQUIRE_EQUAL( exitCode, SIGTERM+128 ); } BOOST_AUTO_TEST_CASE( CleanerThread_default ) { pid_t pid = -1; { ExternalProgram proc( "bash -c 'sleep 2'", ExternalProgram::Normal_Stderr ); BOOST_CHECK( proc.running() ); pid = proc.getpid(); } std::this_thread::sleep_for( std::chrono::seconds(4) ); // check if the process is really gone, can't use waitpid because some ExternalProgram // implementations do spawn processes from a helper thread which means they are not our direct children BOOST_CHECK_EQUAL( ::getpgid( pid ), -1 ); BOOST_CHECK_EQUAL( errno, ESRCH ); } BOOST_AUTO_TEST_CASE( ReadTimeout ) { static const char* argv[] = { "sleep", "2", NULL }; ExternalProgram prog( argv, ExternalProgram::Discard_Stderr ); BOOST_CHECK_THROW( prog.receiveLine( 100 ), io::TimeoutException ); BOOST_CHECK_EQUAL( prog.receiveLine( 3000 ), "" ); BOOST_CHECK_EQUAL( prog.close(), 0 ); } BOOST_AUTO_TEST_CASE( CloseFDs ) { // simple bash script that counts the number of open fds, 4 is the minimum since ls opens one fd to read the /proc/self/fd std::string_view script ( "if [ $( ls /proc/self/fd | wc -l ) -gt \"4\" ]; then exit 1; fi; exit 0" ); const char *argv[] = { "bash", "-c", script.data(), nullptr }; // open random fds we definitely can read to get higher nr of fds zypp::AutoFD testFD( ::open( "/proc/self/fd", O_RDONLY ) ); zypp::AutoFD testFD2( ::open( "/proc/self/fd", O_RDONLY ) ); ExternalProgram proc( argv, ExternalProgram::Discard_Stderr ); const auto exitCode = proc.close(); BOOST_REQUIRE_EQUAL( exitCode, 0 ); } BOOST_AUTO_TEST_CASE( WaitForExit ) { ExternalProgram proc( "bash -c 'sleep 2'", ExternalProgram::Normal_Stderr ); BOOST_CHECK( proc.running() ); auto start = zyppng::Timer::now(); BOOST_CHECK( !proc.waitForExit( 500 ) ); BOOST_REQUIRE_LT( zyppng::Timer::elapsedSince( start), 1000 ); BOOST_CHECK( proc.waitForExit() ); } void handler(int signo, siginfo_t *info, void *context) { /* do nothing */ } BOOST_AUTO_TEST_CASE(readline_sigalrm) { struct sigaction act = { {0} }; struct sigaction oldAct = { {0} }; act.sa_flags = SA_SIGINFO; act.sa_sigaction = &handler; sigaction(SIGALRM, &act, &oldAct); struct itimerval t = { {0} }; t.it_interval.tv_sec = 42; t.it_value.tv_sec = 1; setitimer(ITIMER_REAL, &t, NULL); ExternalProgram::Arguments cmd; cmd.push_back("sh"); cmd.push_back("-c"); cmd.push_back("sleep 2; echo license.de.txt"); LocaleSet ret; ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout ); std::string received; for ( std::string output( prog.receiveLine() ); output.length() ; output = prog.receiveLine( ) ) { received += output; } prog.close(); BOOST_REQUIRE( !received.empty() ); BOOST_REQUIRE_EQUAL( received, "license.de.txt\n"); // disable timer and handler sigaction(SIGALRM, &oldAct, NULL); t.it_interval.tv_sec = 0; t.it_value.tv_sec = 0; setitimer(ITIMER_REAL, &t, NULL); } libzypp-17.36.5/tests/zypp/base/Glob_test.cc000066400000000000000000000031671476576476200207340ustar00rootroot00000000000000#include "TestSetup.h" #include #include #define BOOST_TEST_MODULE Glob static Pathname TEST_ROOT( TESTS_SRC_DIR"/zypp/base/Glob_test.dat" ); using filesystem::Glob; BOOST_AUTO_TEST_CASE(Glob_default) { // enable loging for the scope of this block: // base::LogControl::TmpLineWriter shutUp( new log::FileLineWriter( "-" ) ); Glob q; BOOST_CHECK( q.empty() ); BOOST_CHECK( q.size() == 0 ); BOOST_CHECK_EQUAL( q.begin(), q.end() ); BOOST_CHECK( q.defaultFlags() == Glob::Flags() ); q.add( TEST_ROOT/"file" ); BOOST_CHECK( ! q.empty() ); BOOST_CHECK( q.size() == 1 ); BOOST_CHECK_NE( q.begin(), q.end() ); BOOST_CHECK_EQUAL( *q.begin(), TEST_ROOT/"file" ); q.reset( Glob::kBrace ); BOOST_CHECK( q.empty() ); BOOST_CHECK( q.size() == 0 ); BOOST_CHECK_EQUAL( q.begin(), q.end() ); BOOST_CHECK( q.defaultFlags() == Glob::kBrace ); q.add( TEST_ROOT/"file*" ); BOOST_CHECK( q.size() == 3 ); q.add( TEST_ROOT/"*{.xml,.xml.gz}" ); BOOST_CHECK( q.size() == 5 ); q.clear(); // no flags reset: Glob::kBrace active BOOST_CHECK( q.size() == 0 ); q.add( TEST_ROOT/"*{.xml,.xml.gz}" ); BOOST_CHECK( q.size() == 2 ); q.reset(); // flags reset: Glob::kBrace off BOOST_CHECK( q.size() == 0 ); q.add( TEST_ROOT/"*{.xml,.xml.gz}" ); BOOST_CHECK( q.size() == 0 ); } BOOST_AUTO_TEST_CASE(Glob_static) { std::set q; Glob::collect( TEST_ROOT/"*{.xml,.xml.gz}", Glob::kBrace, std::inserter( q, q.begin() ) ); BOOST_REQUIRE( q.size() == 2 ); BOOST_CHECK_EQUAL( *q.begin(), TEST_ROOT/"file.xml" ); BOOST_CHECK_EQUAL( *++q.begin(), TEST_ROOT/"file.xml.gz" ); } libzypp-17.36.5/tests/zypp/base/Glob_test.dat/000077500000000000000000000000001476576476200211655ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/Glob_test.dat/file000066400000000000000000000000001476576476200220150ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/Glob_test.dat/file.xml000066400000000000000000000000001476576476200226140ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/Glob_test.dat/file.xml.gz000066400000000000000000000000001476576476200232330ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/String_test.cc000066400000000000000000000414121476576476200213120ustar00rootroot00000000000000#include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace boost::unit_test; using namespace zypp; using namespace zypp::str; #define RXspecial "\\^.[$()|*+?{" BOOST_AUTO_TEST_CASE(str2rx) { char s[] = "c"; char x[] = "\\c"; for ( const char * ch = RXspecial; *ch; ++ch ) { s[0] = x[1] = *ch; BOOST_CHECK_EQUAL( str::rxEscapeStr( s ), x ); } } BOOST_AUTO_TEST_CASE(glob2rx) { { char s[] = "c"; char x[] = "\\c"; for ( const char * ch = RXspecial; *ch; ++ch ) { s[0] = x[1] = *ch; if ( *ch == '?' ) BOOST_CHECK_EQUAL( str::rxEscapeGlob( s ), "." ); else if ( *ch == '*' ) BOOST_CHECK_EQUAL( str::rxEscapeGlob( s ), ".*" ); else if ( *ch == '[' ) BOOST_CHECK_EQUAL( str::rxEscapeGlob( s ), "\\[" ); // no closing ] so it is literal else if ( *ch == '\\' ) BOOST_CHECK_EQUAL( str::rxEscapeGlob( s ), "\\" ); // actually an input error as "\" is not a valid GLOB else { s[0] = x[1] = *ch; BOOST_CHECK_EQUAL( str::rxEscapeGlob( s ), x ); } } std::string a( str::rxEscapeStr( RXspecial ) ); // all rx/glob special chars are literally (\-escaped) BOOST_CHECK_EQUAL( str::rxEscapeGlob( a ), a ); // nothing more to escape. // character class: contains "][" BOOST_CHECK_EQUAL( str::rxEscapeGlob( "[][]" ), "[][]" ); BOOST_CHECK_EQUAL( str::rxEscapeGlob( "[^][]" ), "[^][]" ); BOOST_CHECK_EQUAL( str::rxEscapeGlob( "[!][]" ), "[^][]" ); // glob allows ! and ^ to negate a cclass // no character class: no closing ']' so take it literally (the ] would be member of the cclass, not the closing ]) BOOST_CHECK_EQUAL( str::rxEscapeGlob( "[]" ), "\\[]" ); BOOST_CHECK_EQUAL( str::rxEscapeGlob( "[!]" ), "\\[!]" ); BOOST_CHECK_EQUAL( str::rxEscapeGlob( "[^]" ), "\\[\\^]" ); } } BOOST_AUTO_TEST_CASE(gsubTest) { std::string olds = "olds"; std::string news = "new string"; BOOST_CHECK_EQUAL(gsub("test olds string",olds,news), "test new string string"); BOOST_CHECK_EQUAL(gsub("no string",olds,news),"no string"); BOOST_CHECK_EQUAL(gsub("oldsolds",olds,news),"new stringnew string"); } BOOST_AUTO_TEST_CASE(replaceAllTest) { std::string olds = "olds"; std::string news = "new string"; std::string tests; tests = "test olds string"; replaceAll(tests,olds,news); BOOST_CHECK_EQUAL(tests, "test new string string"); tests = "no string"; replaceAll(tests,olds,news); BOOST_CHECK_EQUAL(tests, "no string"); tests = "oldsolds"; replaceAll(tests,olds,news); BOOST_CHECK_EQUAL(tests, "new stringnew string"); } BOOST_AUTO_TEST_CASE(testsplitEscaped) { std::string s( "simple non-escaped string" ); std::vector v; splitEscaped( s, std::back_inserter(v) ); BOOST_CHECK_EQUAL( v.size(), 3 ); BOOST_CHECK_EQUAL( v[0], "simple" ); BOOST_CHECK_EQUAL( v[1], "non-escaped" ); BOOST_CHECK_EQUAL( v[2], "string" ); v.clear(); s = std::string( "\"escaped sentence \"" ); splitEscaped( s, std::back_inserter(v) ); BOOST_CHECK_EQUAL( v.size(), 1 ); BOOST_CHECK_EQUAL( v[0], "escaped sentence " ); v.clear(); s = std::string( "\"escaped \\\\sent\\\"ence \\\\\"" ); splitEscaped( s, std::back_inserter(v) ); BOOST_CHECK_EQUAL( v.size(), 1 ); BOOST_CHECK_EQUAL( v[0], "escaped \\sent\"ence \\" ); v.clear(); s = std::string( "escaped sentence\\ with\\ space" ); splitEscaped( s, std::back_inserter(v) ); BOOST_CHECK_EQUAL( v.size(), 2 ); BOOST_CHECK_EQUAL( v[0], "escaped" ); BOOST_CHECK_EQUAL( v[1], "sentence with space" ); // split - join v.clear(); s = "some line \"\" foo\\ a foo\\\\ b"; str::splitEscaped( s, std::back_inserter(v) ); BOOST_CHECK_EQUAL( v.size(), 6 ); BOOST_CHECK_EQUAL( v[0], "some" ); BOOST_CHECK_EQUAL( v[1], "line" ); BOOST_CHECK_EQUAL( v[2], "" ); BOOST_CHECK_EQUAL( v[3], "foo a" ); BOOST_CHECK_EQUAL( v[4], "foo\\" ); BOOST_CHECK_EQUAL( v[5], "b" ); BOOST_CHECK_EQUAL( s, str::joinEscaped( v.begin(), v.end() ) ); // split - join using alternate sepchar s = str::joinEscaped( v.begin(), v.end(), 'o' ); v.clear(); str::splitEscaped( s, std::back_inserter(v), "o" ); BOOST_CHECK_EQUAL( v.size(), 6 ); BOOST_CHECK_EQUAL( v[0], "some" ); BOOST_CHECK_EQUAL( v[1], "line" ); BOOST_CHECK_EQUAL( v[2], "" ); BOOST_CHECK_EQUAL( v[3], "foo a" ); BOOST_CHECK_EQUAL( v[4], "foo\\" ); BOOST_CHECK_EQUAL( v[5], "b" ); BOOST_CHECK_EQUAL( s, str::joinEscaped( v.begin(), v.end(), 'o' ) ); } BOOST_AUTO_TEST_CASE(bnc_909772) { // While \-escaping processes single-quote, double-quote, backslash and sepchar[ ] // deescaping failed to process the quotes correctly. std::string s; std::vector v; v.clear(); v.push_back(""); v.push_back("'\" \\"); v.push_back("\\'\\\"\\ \\\\"); s = str::joinEscaped( v.begin(), v.end() ); BOOST_CHECK_EQUAL( s, "\"\"" " " "\\'\\\"\\ \\\\" " " "\\\\\\'\\\\\\\"\\\\\\ \\\\\\\\" ); s += " "; s += "'" "\\\\\" \\ \\\\" "'\\ single"; // single quote: all literal, no ' inside s += " "; s += "\"" "\\'\\\" \\ \\\\" "\"\\ double";// double quote: all literal except \\ \" v.clear(); splitEscaped( s, std::back_inserter(v) ); BOOST_CHECK_EQUAL( v.size(), 5 ); BOOST_CHECK_EQUAL( v[0], "" ); BOOST_CHECK_EQUAL( v[1], "'\" \\" ); BOOST_CHECK_EQUAL( v[2], "\\'\\\"\\ \\\\" ); BOOST_CHECK_EQUAL( v[3], "\\\\\" \\ \\\\ single" ); BOOST_CHECK_EQUAL( v[4], "\\'\" \\ \\ double" ); } BOOST_AUTO_TEST_CASE(testsplitEscapedWithEmpty) { std::string s( "simple:non-escaped:string" ); std::vector v; BOOST_CHECK_EQUAL(splitFieldsEscaped(s, std::back_inserter(v)), 3); BOOST_CHECK_EQUAL(v.size(), 3); v.clear(); s = "non-escaped:with::spaces:"; BOOST_CHECK_EQUAL(splitFieldsEscaped(s, std::back_inserter(v)), 5); BOOST_CHECK_EQUAL(v.size(), 5); v.clear(); s = "::"; BOOST_CHECK_EQUAL(splitFieldsEscaped(s, std::back_inserter(v)), 3); BOOST_CHECK_EQUAL(v.size(), 3); v.clear(); s = ":escaped::with\\:spaces"; BOOST_CHECK_EQUAL(splitFieldsEscaped(s, std::back_inserter(v)), 4); BOOST_CHECK_EQUAL(v.size(), 4); } BOOST_AUTO_TEST_CASE(test_escape) { std::string badass = "bad|ass\\|worse"; std::string escaped = str::escape(badass, '|'); BOOST_CHECK_EQUAL( escaped, "bad\\|ass\\\\\\|worse" ); } BOOST_AUTO_TEST_CASE(conversions) { BOOST_CHECK_EQUAL(str::numstring(42), "42"); BOOST_CHECK_EQUAL(str::numstring(42, 6), " 42"); BOOST_CHECK_EQUAL(str::numstring(42, -6), "42 "); BOOST_CHECK_EQUAL(str::hexstring(42), "0x0000002a"); BOOST_CHECK_EQUAL(str::hexstring(42, 6), "0x002a"); BOOST_CHECK_EQUAL(str::hexstring(42, -6), "0x2a "); BOOST_CHECK_EQUAL(str::octstring(42), "00052"); BOOST_CHECK_EQUAL(str::octstring(42, 6), "000052"); BOOST_CHECK_EQUAL(str::octstring(42, -6), "052 "); BOOST_CHECK_EQUAL(str::strtonum("42"), 42); BOOST_CHECK_EQUAL(str::toLower("This IS A TeST"), "this is a test"); BOOST_CHECK_EQUAL(str::toUpper("This IS A TeST"), "THIS IS A TEST"); BOOST_CHECK_EQUAL(str::compareCI("TeST", "test"), 0); BOOST_CHECK_EQUAL(str::compareCI("TeST", "test"), 0); BOOST_CHECK_EQUAL(str::compareCI("TeST", "test"), 0); } BOOST_AUTO_TEST_CASE(conversions_to_bool) { // true iff true-string {1,on,yes,true} BOOST_CHECK_EQUAL( str::strToTrue("1"), true ); BOOST_CHECK_EQUAL( str::strToTrue("42"), true ); BOOST_CHECK_EQUAL( str::strToTrue("ON"), true ); BOOST_CHECK_EQUAL( str::strToTrue("YES"), true ); BOOST_CHECK_EQUAL( str::strToTrue("TRUE"), true ); BOOST_CHECK_EQUAL( str::strToTrue("0"), false ); BOOST_CHECK_EQUAL( str::strToTrue("OFF"), false ); BOOST_CHECK_EQUAL( str::strToTrue("NO"), false ); BOOST_CHECK_EQUAL( str::strToTrue("FALSE"), false ); BOOST_CHECK_EQUAL( str::strToTrue(""), false ); BOOST_CHECK_EQUAL( str::strToTrue("foo"), false ); // false iff false-string {0,off,no,false} BOOST_CHECK_EQUAL( str::strToFalse("1"), true ); BOOST_CHECK_EQUAL( str::strToFalse("42"), true ); BOOST_CHECK_EQUAL( str::strToFalse("ON"), true ); BOOST_CHECK_EQUAL( str::strToFalse("YES"), true ); BOOST_CHECK_EQUAL( str::strToFalse("TRUE"), true ); BOOST_CHECK_EQUAL( str::strToFalse("0"), false ); BOOST_CHECK_EQUAL( str::strToFalse("OFF"), false ); BOOST_CHECK_EQUAL( str::strToFalse("NO"), false ); BOOST_CHECK_EQUAL( str::strToFalse("FALSE"), false ); BOOST_CHECK_EQUAL( str::strToFalse(""), true ); BOOST_CHECK_EQUAL( str::strToFalse("foo"), true ); // true iff true-string BOOST_CHECK_EQUAL( str::strToBool("TRUE", false), true ); BOOST_CHECK_EQUAL( str::strToBool("FALSE", false), false ); BOOST_CHECK_EQUAL( str::strToBool("", false), false ); BOOST_CHECK_EQUAL( str::strToBool("foo", false), false ); // false iff false-string BOOST_CHECK_EQUAL( str::strToBool("TRUE", true), true ); BOOST_CHECK_EQUAL( str::strToBool("FALSE", true), false ); BOOST_CHECK_EQUAL( str::strToBool("", true), true ); BOOST_CHECK_EQUAL( str::strToBool("foo", true), true ); // true/false iff true/false-string, else unchanged bool ret; ret = true; BOOST_CHECK_EQUAL( str::strToBoolNodefault("TRUE", ret), true ); ret = true; BOOST_CHECK_EQUAL( str::strToBoolNodefault("FALSE", ret), false ); ret = true; BOOST_CHECK_EQUAL( str::strToBoolNodefault("", ret), true ); ret = true; BOOST_CHECK_EQUAL( str::strToBoolNodefault("foo", ret), true ); ret = false; BOOST_CHECK_EQUAL( str::strToBoolNodefault("TRUE", ret), true ); ret = false; BOOST_CHECK_EQUAL( str::strToBoolNodefault("FALSE", ret), false ); ret = false; BOOST_CHECK_EQUAL( str::strToBoolNodefault("", ret), false ); ret = false; BOOST_CHECK_EQUAL( str::strToBoolNodefault("foo", ret), false ); } BOOST_AUTO_TEST_CASE(operations) { BOOST_CHECK_EQUAL(str::ltrim(" \t f \t ffo \t "), "f \t ffo \t "); BOOST_CHECK_EQUAL(str::rtrim(" \t f \t ffo \t "), " \t f \t ffo"); BOOST_CHECK_EQUAL(str::trim(" \t f \t ffo \t "), "f \t ffo"); // strip first { std::string tostrip(" Oh! la la "); std::string word( str::stripFirstWord(tostrip, true) ); // ltrim first BOOST_CHECK_EQUAL(word, "Oh!"); BOOST_CHECK_EQUAL(tostrip, "la la "); } { std::string tostrip(" Oh! la la "); std::string word( str::stripFirstWord(tostrip, false) ); // no ltrim first BOOST_CHECK_EQUAL(word, ""); BOOST_CHECK_EQUAL(tostrip, "Oh! la la "); } // strip last { std::string tostrip(" Oh! la la "); std::string word( str::stripLastWord(tostrip, true) ); // rtrim first BOOST_CHECK_EQUAL(word, "la"); BOOST_CHECK_EQUAL(tostrip, " Oh! la"); } { std::string tostrip(" Oh! la la "); std::string word( str::stripLastWord(tostrip, false) ); // no rtrim first BOOST_CHECK_EQUAL(word, ""); BOOST_CHECK_EQUAL(tostrip, " Oh! la la"); } } BOOST_AUTO_TEST_CASE(prefix_suffix) { BOOST_CHECK( str::hasPrefix("abcXabcYabc", "abcX") ); BOOST_CHECK( str::hasSuffix("abcXabcYabc", "Yabc") ); BOOST_CHECK_EQUAL( str::stripPrefix("abcXabcYabc", "abcX"), "abcYabc" ); BOOST_CHECK_EQUAL( str::stripSuffix("abcXabcYabc", "Yabc"), "abcXabc" ); BOOST_CHECK( ! str::hasPrefix("abcXabcYabc", "ac") ); BOOST_CHECK( ! str::hasSuffix("abcXabcYabc", "ac") ); BOOST_CHECK_EQUAL( str::stripPrefix("abcXabcYabc", "ac"), "abcXabcYabc" ); BOOST_CHECK_EQUAL( str::stripSuffix("abcXabcYabc", "ac"), "abcXabcYabc" ); BOOST_CHECK( str::startsWith("abcXabcYabc", "abc") ); BOOST_CHECK( str::endsWith("abcXabcYabc", "abc") ); BOOST_CHECK( str::contains("abcXabcYabc", "XabcY") ); BOOST_CHECK( ! str::contains("abcXabcYabc", "xabcy") ); BOOST_CHECK( str::containsCI("abcXabcYabc", "xabcy") ); BOOST_CHECK_EQUAL( str::commonPrefix("", ""), 0 ); BOOST_CHECK_EQUAL( str::commonPrefix("a", ""), 0 ); BOOST_CHECK_EQUAL( str::commonPrefix("", "b"), 0 ); BOOST_CHECK_EQUAL( str::commonPrefix("a", "b"), 0 ); BOOST_CHECK_EQUAL( str::commonPrefix("c", "c"), 1 ); BOOST_CHECK_EQUAL( str::commonPrefix("ca", "cb"), 1 ); } BOOST_AUTO_TEST_CASE(hexencode_hexdecode) { std::string o; o.reserve( 256 ); for ( unsigned i = 1; i < 256; ++i ) o += i; std::string e( str::hexencode( o ) ); // encoded contains nothing but [%a-zA-Z0-9] for ( unsigned i = 0; i < 255; ++i ) { char ch = e[i]; BOOST_CHECK( ch == '%' || ( 'a' <= ch && ch <= 'z' ) || ( 'A' <= ch && ch <= 'Z' ) || ( '0' <= ch && ch <= '9' ) ); } std::string d( str::hexdecode( e ) ); // decoded equals original BOOST_CHECK( o == d ); // Test %XX is decoded for hexdigits only const char *const dig = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for ( const char * d1 = dig; *d1; ++d1 ) for ( const char * d2 = dig; *d2; ++d2 ) { std::string eu( "%" ); eu += *d1; eu += *d2; std::string el( str::toLower(eu) ); std::string u( str::hexdecode( eu ) ); std::string l( str::hexdecode( el ) ); if ( *d1 <= 'F' && *d2 <= 'F' ) { BOOST_CHECK_EQUAL( u, l ); // no matter if upper or lower case hexdigit BOOST_CHECK_EQUAL( u.size(), 1 ); // size 1 == decoded } else { BOOST_CHECK_EQUAL( u, eu ); // no hexdigits remain unchanged BOOST_CHECK_EQUAL( l, el ); } } } BOOST_AUTO_TEST_CASE(regex_subst) { const std::string input = "StRi_g: Hello this is a StRiNg with multiple Stri_g mentions to replace StRi_g"; str::regex rxexpr( "(St[rR]i[nN_]g)" ); BOOST_REQUIRE_EQUAL( rxexpr.get()->re_nsub, 1 ); { const std::string result = str::regex_substitute( input, rxexpr, "FooBar", true ); BOOST_REQUIRE_EQUAL( result, "FooBar: Hello this is a FooBar with multiple FooBar mentions to replace FooBar" ); } { const std::string result = str::regex_substitute( input, rxexpr, "FooBar", false ); BOOST_REQUIRE_EQUAL( result, "FooBar: Hello this is a StRiNg with multiple Stri_g mentions to replace StRi_g" ); } { const std::string nomatch = "Text with no match"; const std::string result = str::regex_substitute( nomatch , rxexpr, "FooBar", false ); BOOST_REQUIRE_EQUAL( result, nomatch ); } { const std::string input = "StRi_gString: Hello this is a StRiNg with multiple Stri_g mentions to replace StRi_g"; str::regex rxexpr( "(^St[rR]i[nN_]g)" ); const std::string result = str::regex_substitute( input, rxexpr, "FooBar", true ); BOOST_REQUIRE_EQUAL( result, "FooBarString: Hello this is a StRiNg with multiple Stri_g mentions to replace StRi_g" ); } { const std::string input = "StRi_gString\n: Hello this is a StRiNg with multiple Stri_g mentions to replace StRi_g"; str::regex rxexpr( "(String$)", str::regex::match_extended | str::regex::newline ); const std::string result = str::regex_substitute( input, rxexpr, "FooBar", true ); BOOST_REQUIRE_EQUAL( result, "StRi_gFooBar\n: Hello this is a StRiNg with multiple Stri_g mentions to replace StRi_g" ); } { const std::string input = "Hello StRi_gString\n: Hello."; str::regex rxexpr( "((^: Hello)|(String\n))", str::regex::match_extended); const std::string result = str::regex_substitute( input, rxexpr, " FooBar", true ); BOOST_REQUIRE_EQUAL( result, "Hello StRi_g FooBar FooBar." ); } { const std::string input = "4.12.14-lp151.28.48-default"; const std::string flavour = str::regex_substitute( input, str::regex( ".*-", str::regex::match_extended ), "", true ); BOOST_REQUIRE_EQUAL( flavour, "default" ); std::string version = str::regex_substitute( input, str::regex( "-[^-]*$", str::regex::match_extended ), "", true ); BOOST_REQUIRE_EQUAL( version, "4.12.14-lp151.28.48" ); const std::string release = str::regex_substitute( version, str::regex( ".*-", str::regex::match_extended ), "", true ); BOOST_REQUIRE_EQUAL( release, "lp151.28.48" ); } } BOOST_AUTO_TEST_CASE(regex_subst2) { auto gsub = [&]( const std::string & l, const std::string & rx, const std::string & res, bool global = true ) { BOOST_CHECK_EQUAL( str::regex_substitute( l, rx, "@", global ), res ); }; auto fsub = [&]( const std::string & l, const std::string & rx, const std::string & res ) { gsub( l, rx, res, false ); }; gsub( "123", "a*", "@1@2@3@" ); fsub( "123", "a*", "@123" ); gsub( "123", ".", "@@@" ); fsub( "123", ".", "@23" ); gsub( "123", "1", "@23" ); gsub( "123", "2", "1@3" ); gsub( "123", "3", "12@" ); gsub( "123", "4", "123" ); gsub( "123", "^", "@123" ); gsub( "123\n", "^", "@123\n" ); gsub( "123\n123", "^", "@123\n@123" ); gsub( "123", "$", "123@" ); gsub( "123\n", "$", "123@\n" ); gsub( "123\n123", "$", "123@\n123@" ); } libzypp-17.36.5/tests/zypp/base/Sysconfig_test.cc000066400000000000000000000052541476576476200220140ustar00rootroot00000000000000 #include #include #include #include #include #include #include #include #include #include #include #include using boost::unit_test::test_suite; using boost::unit_test::test_case; using namespace boost::unit_test; using namespace zypp; #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/base/data/Sysconfig") BOOST_AUTO_TEST_CASE(Sysconfig) { Pathname file = DATADIR / "proxy"; std::map values = zypp::base::sysconfig::read(file); BOOST_CHECK_EQUAL( values.size(), 6 ); BOOST_CHECK_EQUAL( values["PROXY_ENABLED"], "no"); BOOST_CHECK_EQUAL( values["GOPHER_PROXY"], ""); BOOST_CHECK_EQUAL( values["NO_PROXY"], "localhost, 127.0.0.1"); } BOOST_AUTO_TEST_CASE(SysconfigWrite) { Pathname file = DATADIR / "proxy"; filesystem::TmpFile tmpf( filesystem::TmpFile::makeSibling( file ) ); filesystem::copy( file, tmpf.path() ); BOOST_REQUIRE_THROW( zypp::base::sysconfig::writeStringVal( "/tmp/wrzlprmpf", "PROXY_ENABLED", "yes", "# fifi\n fofo\n" ), zypp::Exception ); BOOST_CHECK( zypp::base::sysconfig::writeStringVal( tmpf.path(), "PROXY_ENABLED", "yes", "# fifi\n fofo\n" ) ); BOOST_CHECK( !zypp::base::sysconfig::writeStringVal( tmpf.path(), "NEW1","12" ) ); BOOST_CHECK( zypp::base::sysconfig::writeStringVal( tmpf.path(), "NEW2","13", "# fifi\n# fofo" ) ); BOOST_CHECK( zypp::base::sysconfig::writeStringVal( tmpf.path(), "NEW3","13\"str\"", "fifi\nffofo" ) ); std::ostringstream s; ExternalProgram( "diff -u " + file.asString() + " " + tmpf.path().asString() + " | tail -n +3" ) >> s; BOOST_CHECK_EQUAL( s.str(), "@@ -8,7 +8,7 @@\n" " # This setting allows to turn the proxy on and off while\n" " # preserving the particular proxy setup.\n" " #\n" "-PROXY_ENABLED=\"no\"\n" "+PROXY_ENABLED=\"yes\"\n" " \n" " ## Type:\tstring\n" " ## Default:\t\"\"\n" "@@ -49,3 +49,11 @@\n" " # Example: NO_PROXY=\"www.me.de, do.main, localhost\"\n" " #\n" " NO_PROXY=\"localhost, 127.0.0.1\"\n" "+\n" "+# fifi\n" "+# fofo\n" "+NEW2=\"13\"\n" "+\n" "+# fifi\n" "+# ffofo\n" "+NEW3=\"13\\\"str\\\"\"\n" ); } libzypp-17.36.5/tests/zypp/base/data/000077500000000000000000000000001476576476200174055ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/data/ExternalProgram/000077500000000000000000000000001476576476200225175ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/data/ExternalProgram/echo.sh000077500000000000000000000002521476576476200237730ustar00rootroot00000000000000#!/bin/bash #just read from stdin and write to stdout until we get a single q while read -r line do if [ "$line" == "q" ] then exit 0 fi echo "$line" done libzypp-17.36.5/tests/zypp/base/data/Sysconfig/000077500000000000000000000000001476576476200213515ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/base/data/Sysconfig/proxy000066400000000000000000000024071476576476200224600ustar00rootroot00000000000000## Path: Network/Proxy ## Description: ## Type: yesno ## Default: no ## Config: kde,profiles # # Enable a generation of the proxy settings to the profile. # This setting allows to turn the proxy on and off while # preserving the particular proxy setup. # PROXY_ENABLED="no" ## Type: string ## Default: "" # # Some programs (e.g. lynx, arena and wget) support proxies, if set in # the environment. SuSEconfig can add these environment variables to # /etc/SuSEconfig/* (sourced by /etc/profile etc.) - # See http://portal.suse.com/sdb/en/1998/01/lynx_proxy.html for more details. # Example: HTTP_PROXY="http://proxy.provider.de:3128/" HTTP_PROXY="" ## Type: string ## Default: "" # # Some programs (e.g. lynx, arena and wget) support proxies, if set in # the environment. SuSEconfig can add these environment variables to # /etc/SuSEconfig/* (sourced by /etc/profile etc.) - # this setting is for https connections HTTPS_PROXY="" ## Type: string ## Default: "" # # Example: FTP_PROXY="http://proxy.provider.de:3128/" # FTP_PROXY="" ## Type: string ## Default: "" # # Example: GOPHER_PROXY="http://proxy.provider.de:3128/" # GOPHER_PROXY="" ## Type: string(localhost) ## Default: localhost # # Example: NO_PROXY="www.me.de, do.main, localhost" # NO_PROXY="localhost, 127.0.0.1" libzypp-17.36.5/tests/zypp/data/000077500000000000000000000000001476576476200164735ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Delta/000077500000000000000000000000001476576476200175245ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Delta/repodata/000077500000000000000000000000001476576476200213235ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Delta/repodata/deltainfo.xml000066400000000000000000000014141476576476200240120ustar00rootroot00000000000000 DRPMS/libzypp-4.21.3-1_4.21.3-2.i386.drpm libzypp-4.21.3-1-d3571f98b048b1a870e40241bb46c67ab4 22452 8f05394695dee9399c204614e21e5f6848990ab7 DRPMS/libzypp-4.21.2-3_4.21.3-2.i386.drpm libzypp-4.21.2-3-e82691677eee1e83b4812572c5c9ce8eb 110362 326658fee45c0baec1e70231046dbaf560f941ce libzypp-17.36.5/tests/zypp/data/Delta/repodata/primary.xml.gz000066400000000000000000002504001476576476200241500ustar00rootroot00000000000000.H][s6~T 8Msiv< J)ŎmL2 Jl't\8|pO]4 پ>X̃hl둳ý)9EgJΧW'ߦO b!fa cק6qq0Y~ TO>BG/ t\.EX$lȵ,(if(@`iN8iRB ۫2P tRЈ0!c7 E>ިWV"D^9!̟^]Β1?L%˃)i.7`04$A!/_qQFToiC=Oԣ`e/-H l'"*d Yixx0?)y0e'$šM&> "rMҘTYY, {1b9wə\5cV ,~*&0'0ydcH%s-?!>~ -=>B)L\懫""qZ7>Ә ίs﷟ѻg2*Zp5iU,U*Y凐wyR \*0{쥵frRXDA}pgvC2R]'%t*G$ _a)(W!cmlGiRdS`.gWײX_V͚Fik0a3 5lnfRdPM²vԬH%Fm(LQ%룏Mc>N" &DEf0Dv.BMP0;P%R&;{iZ^].L;S7qJ+'RGxir%*Bִ]d5CIW~ky~R0v/qd 뚁v߱ɝh"Q)i8hpdDyœ eLDKGykx6{@vTӫ0SF/1Xok(hۮur&&"R.6ⱥף78c"z/):dGt2Ƹ.08ydl7WnilNRm>2yًߏ~r0)S72v+q44&8.x{՞f;dν~szKyS FrA7^LB`fE6+1Y (|'_=U7NjqEE[cv y҄C'(BC+g*氳,cB}Wk6g~rgT** JK\EP8P]-5KUi J ڽuL\e mbt#hl DʖH C!ni$@;g=E;J`STnf VΡOb6+ XRYZ7Ext$78IrZ, gĀW-l&°h2sʺQݪ&ϯQn{m(6;ME~v.Y++%zv~btžߍl6YI/yٜ-O3+= Ot~^ >V6?"?Aځ܈Bnd ČbfPD -(c ,ljʪZKPʺiZ=%RB_erQ/tm< ɱ,ru1LSjY[æibO88c\W[mܜT9:17HMc5oU3A0Ju`q`q`z`{.BI&q&Pb|&Y\Lk2gR*DRA7aLL(ySbŧ Ԍ#T1{ -]aZTf.ҟKQZ6l -YPdE@d@Ac&G <`% "b׭z~ N^"q);%EćĨPDY,u+;\d-)T89/~LE~eIkZ"rB:Mlw:u0qHsAQ04I5Slc%Mۆ;jiUՑ\#:XxD" +5 "vޗC]c;UficO!ώ߿ћeg<(6}\톳?uf7R,)[)~!-銹Vc| PR'}³|hbkcR"b|W-}REC[VSN^:[-(Xj}`ef_ ŬNu֩`X*O?w<ߤ7<L̀(?RLVl129ڊr 5oJmU˔&}s/NԻ7]@gLnut]f-!x;.`Eֵ5GEG@.5Ķ 2S$ 2lVUp[$ʳ+js Csb<@[F-vr7LZG6wgL0{Q%v֣ĚՈGM)+abtuŸ'Idtˍz8y>ؖG\\t{Ygp2U;Ӆ\Ԋ0,Jnq|Ys 6}mst3W-NL˴Ծ3:߳9Ʈqua`{mBڎuRl1|C`k_w]),yxhپ/wnMsD  `XUY׹/XmfxreƏúG'<ۏHݒvUYUVf. q/w;FXG62}dUxxO|Zm qm< Ct[ پ;dcj9cP7;q;.6j8j=/V!Lv`CzSa!L=0Ԫ!LGjSa!L=0}z$o=H/lٌ!P!iXdL_)R]ř_B[eTƠ†QE4fqb?WfQ^Uh"2룫_'2{.D"?IXNG]bnoubچ@=·6KDF0=OZ<):Rz#@%3z ! ]}s:DF]boz_!@ 8T`B!^҄];oPf9orK3-|D7 e{̆n?@]wװZѵ͢?o'D7?vL]؎gSY:6- 9a3ls`'r;?_W@ϖa\#<G_Cᗠd&j柌R]z{&Ή09aI5>?PED^Wg?JXBy;+O@kG?X2ȷr"$UaA|Fsy;RcK=Yj6=p0SPO&2NA$2HP>dvv2azpwu0ndB%Oi` ( YS~^2т%iX2ma?-oaΡփiuV\qm% glMY`bjgv*R;I*'髷GOΥv'?*ʡr-r()Bgmvɳ"[a $f%2 Lӄ0C6/o|\jטGZj3|vL#Lp[c˶[v4y1dlsN4իa7"V>V^v;\۴/B+vD:==.ipAû5aL!mkfQ{m26žΨ!^f8H*2h.+;GOi9eQyw«Zo.0l\C_E?%ʪQٖ5Y,L4+EC,: ޢ)/(tN\z6/$4.1M}U3h}&b$ƒjjśc`^?Iǘ`/ҾQ[k!DBȖެNsE|;]s&dK>̝`nCnY:qKs<[^-5a3#j;Žbu 읮oyWӦq,`Rq>Uޏsl4M.=߷]yuIl 6}}kfO=Z5{F;w,ݟ#oe08Tctbpㆯyj:iRajܳ]>6znܵCFm\=-b7X=ַ4Y̲t깖 Õ3=K} c ;W#io4WZ+;=bul).=mOS`iuK}_%`tB.ÚEm'R[Ǹ+Al>̵e/>:|c_̄D )j~d-  t{ƞj^" V߭3Qg{Tie\鵩?uSe1*{EٜT0ZNƺjM곑#Ө&`\ަ9Cu`awx_|o;|_H b}v Oϐ@'Ğ̰B]~t&"41Eqd= =*3SMcXNpVpxw ;5լ"w2@ҭ:M>eTXG]>J-L (62E[9tf%`p`hdXٟ: ^TTGmz:TLK.Ư,higUPbM2<,R pjv68tFGڪU0$o6!ꂺ'Sʨ=! 1L2vIa{"R!Uk‚5 ^zI)P\ D)hyحSgXh&"*Yie*ZM4jknTK  {n^ۍMoP1rC*RufNBtOɉ~UΎIw/!a*>jGCxE2ݲ3r@Q%Un 6,F>c|ӿškI01IdK`[70M@ P0Ep>ʪ.SwlE3턌Vm9Cb'N |pTĚC"t2PNt*5\2nꉏ񱧖s!% IoAuКg<[?Bp^jn`̺ 9B|R{nzv[EΫ.]I^7 ll>B[9]& r5ۀ+CyXCRNa+&-l={b vON`rՄ )4Ciz6'E@O6޷-,q@\kl_gI\Ny}{M*>ڜ 2W9*̏ED[mCO5a—4<ӲgGtAalO%U2V6V71oNl)ݚ\$V!(~yGJ<žZ<q(Hƴk&h^qmTUF0fJV5TH86LkD'aꤜsbGa /uΊ<䥜wӚ,Zߝ,Fj-T6n=ńP2EA:bY"9Oљ& BfT2N<,eq`˞9!BKkgnQWp%v_\ AM ۅû^#{R1ca41]7*`Yt@ Smo܎ѰFΙ@b&ALk̜rk7bi j30TMa KAqB v=м(a~rNx|O]p-b&y(Ww T#<6g>|~yiJ\Y1z"֡W,=d߉vWZ8$ޘB|9SCVe*E[|byvlT0B +Ne1br{D$a(ʞ ūTS+çDXS6n pVgWb!pA%G WRexf,dE Ed7vԶ!2{b:V cuGS. ~F@kuC~Ȧž"b/^JjZl*d[Qk ($(`,y Da-~-ӡZK]ca&s{uY d1zx13FFGY2+!m-lHh^ 9sh*bBjJ=u%I(9Rok^?i* d٦2ll["SF\3{}>G8,t+U˹zTVA|"mQo-t[U51CC*sA+ R4|"nUTKn,LX SD@bDE/I{t1cgi~A+bqHa do*X R̥ۗ79FFRsc)qhs~7PMbDשZ(3~Eɩ}n ~PĪ,DEű3)ӑ fBΡ)ڂ7 s$XEõae2cU{7aE'48t=)F Ǫ4jō 2d] WkEۈ}*nh}[TsD XNF?ZkWz>o3=R?кNrP@ӡ  i2mISl]GZv[|q׆Zۛq>]3\q<||[ Dohձ-vAGcZ1)UWDYcƇq >WuRe/]՟λp?<ׇ7s=k}9<#DG@OO. ޫ2#(wNK} _FkXLN`&e?y3ϛGCیJƏ7?yZ,+[ֻϲ?8ApNysYSCȝǾ~Vȶqkw/V/BBKr }5_x^ѐ!_ QXWOJ/nj- geCTn|0KɅS'_i^eTD?/s9#fU*28N,kݹC sa dSKw5)VF{PˏdsUr n%g>!GDܟ> SAd'?/r׋* R4%ﯝ~1֜ͧl8 ,eFUe˨?' \SrdLA, lHbNQ \S딋Ѥ i/r -kk|xwW` *;(~ݤL璮fC5*/FNK]oY-# <3,]Jέ̈́Xv0-z*Rs#&ߊYmRǰ+ FL7oL_֋[$ g7P=$;U-:J iRnV`.@(-M~raz:;O1O}'k7 Ucd4CO!)rn|1eΜKmr`TcCq\58BpVq)*S4>S5 K#قuգ#[asPX1a pV˒YjEg$:ˆ JB84WDj{̽y;q0(H҄$i{ff5(JHRo"t.rVai[˗ľ%:)uC6(9%Tg|{`.$[(" h@1+5UR+m.`>mG4W+t:I:`$/ y|XGI[U>wC[lpz;`""$:{4ƚw$*zs5"CsN`tUɈ=ׇy'ZAaL9Z`˨QJ3`hZ̍{qL69m DR ש=J񒉑 & B0 ["`vrXc)Yr%&{3t1 $],!oНܚ܌oUɇk)X.$CB9Xmq9\]p5v:ݾ@uZU'+jcK"VM2iQga6 F+fْ8M*GMgJk%&YXs06\9צ`qU*4Hnv\€^ҟ9 D~LH6FqʔOv}ZvQKkɗhD5^Ţ% 3Pr[+iv?C '$v>9CBj(Poo=tsɖc@nv|9i,(آ7{d/XS *f#yTFUe8N\e v4ߟ3Tu 0zB51cȒks^ .x u^/TdY+ dR6$PԟkAXlb#沝r1f e Xt%`u2Qn0.$wJڑESvNSNe VT>6.lВ`UipfVh3)ngAE'Qhg/1}-DJ~z{,'+kQ'o'Rޟ+ҭ37C]e^7ID|:i0Ԙ? BN=7Z9SLB+f4M?Crg,d+ynՒdahRsQ/Oݤ ek6]A~}szzvަ*Y64T9'a#G]*]bG qmM7TR+9җ;oi|vr%joݫS{;pkL/v{}ғ~<6HoY 9(T{"́ܢ9}ѣg{G5*Z[>*OKF/%d8;0_a9׻wo9:.etO?ǩ܂/oz}p9q4÷'ǯT\=ѐ|oOǁ?ɷN33#bVvEս8"G&EZ#ben⍬o~KDqng0Ȗ?j+kLw yzm!͓rcz |Q,´]HlN6V1vQY":LVp~){Om{O[kE A`u1q/;@ Pug3 nob> RF6ht}w~yޮn?o9x-y ŝ_{&.%b}Y*ʹ!ړ*,&z{LWp}.*Lnt;L%t ֆ Pd甂8 vTqT jflo:kD`悎919(z W }PyvprYt[Ԩ&l ZaHG̽տ%Ű&cZXt؋.)&0jhf,n՘ɨ mRVV(G;CYqp(Ө.DCimGK&Fy$`y% Qvl_=fHQy- Z’ic+I'bAZNW &bt j6.#G:7榥5\8`[) 6 >z!q~MJ=c`%Đ%3deYjɔ4 гs&FE#FyHWͪgG'JBVG N (]B cRtjeXPRnrf0h^@KD- l==zlmo[SJsu<aS>E5"N=yْAC.A9)i`Z&&f)*Vef4])Ž˓ BYkOɂB7*))K}v$'[O [A=ZLx5fP¦l@fR*tગ&HnΎlJFY`W_./Z}pW`voX,)nvk\?͟lPLWYy*c}oa[vmv*nS{ v}hLYEAc' 0 sW>Scf_>'7,&㳋^G0ĜK6%whcacUދeCJr3ܯ|]o\~E.zڈAI{. }wĨ1f_j'3mhcX"?RՋ4*[OL<8$P.r2lJ kSMYtƴiQ5d.MР c4S]zYT|{nO[ ֗rٖ`tKiLlOTm=]vZsi0~*xWuI$_FV@|Ë؊+SK,ުcNNC.&Wzv:0xx*?s,P(b*SH.ёrk]ְR`o@MJLh5Ģbr6(rw &҆qOލy)U9 j9>:P!v7MъRך%.yЃH*ň<=@&DΧjQ`Ʃ|ﮔVWk̓6roOsxyYPRڀg7:`*]۽RU]fH1(yVKp.APFōFdOb CEp4kuA7!Vsק}w{;pbXlP}LQx2K2և X$kTTN/5nqg5ĸ _Fйh 2b9'ew\j ɦXGk jZ.[_ųc SsfnhHD6c8s,\N66 NTaZoK)Q#9j'_`bYzrAWURL .a ܔ۷#hr|,>/!o )n\e;\}X!ŪDQZGVxs󮧂ʤm4P7+m,+[#aþY,83:o'JicGwڗrѐf-v0 陋a%aZĆZ& X@@KYm%~.{ X!lAs}b/f 2޹% h\ n y{}_\4: Y&Z'(G3xjr5_!@XwA */e,sRS0A橾]JԊaUԺ@G\HuyHX┴l Q&zQ P8ARoV:'d, +KRHWFq:lt1 x=U ʳʡjPնu@-wjEVKJȡ t6@ZA Q+6#lo{QMT.xȳJ6Mwy((aQĥ{ jטZ]T9[$Xg(yC^ob4,I8z.1ƪkBhtju~q5&FP8D_Sqb$FFމiY'BVO!to(PKXs%HSk"gV3b[Z{fH˚)B 5 FPh<]fˍnky9H9V f (n*(2sI~".pF$ӇOWNdC }' R!`%2B@XkFp2!eE 8FvaP7-]f>aS ܶHOmt-s:jC씼&[Z%yzl"^NL ,m6zMD1Ywq6 PiC^"yEK6S՛0Jntͣpc$ƐƁXR֝H4#=8-I6\E0bb[ ZQ(GR%'Zz V{' NJr\{ dH/ug &^K\>>GdB0╭NP^Co`X.rl2Hetx,݆nL/6` JejEko[$ &K^N\ɜ/jmqboQx8\in~sݚwv ":wv[63O8Yֶlfz\Ns~/œRaLfLR.#Fr*qK16sF_LIJME-rbg=]U yaRgǓCmDS62v/AUV[*Blw@ŚDI3Kp˦0J,̅ s6e3:)t>zXsKzB&b17`c׻ԽʭDN R35Ѯfׯͮm!0H)|i6R_O jvCH([PYֲ!VrBt &AY3gQ*KLCJ3-&ѾfJ!N)O5TǨC LSpVsTTpҞJb2CE'ƏL2u!CLYpI .-bvlJD:*4*j`?*k}r{l0 O/16r\o>}&_qSCgեmGZڐ!ifL6&lH!YqHVuuC7cIë{t27K};#; yLJ^~% f(&H[ۊ %;Ѐ^%9 5L\\ 7X"ۆTd*@FaP'h8%w!kԞ9Q'3>4:%.k`vm.҅`بH"WW&3,@e*!ѲuVhA_&bU\_ߝki H֕SWZkr*Y蓯:v-DA8hchy7P {u1a޺ZKT@be b|Ƀ"+k,xa!\k+-brG6_l$=q5RKmRvVa9l4C ETyF/ЬgQѬYOdw Ftnik@-r8/>yBHZG V:) ,#gKa^YCmo6@ϑJxW4$YU* aM%"6:.L@r"Gx Ŋ*_f_:+!k΂>a5Ep%v' .',բ+2OE!@SB+L{B(6KW<6+ã_5D%j1銋x벙ȹMմIܛтE#2{I/:xT2lC&"qdENZ/tF$^q(]qe_tEAY97/iS(LƣetSѫm*g3  -ѳ*ET/:06zmYpwl!^q_:5$ %ֆ[.YF.hy|6GRѦPUң(VOfR%`5Cb%f[r):gKo_<7QuЧoQIh0ӁwlҒ ಯ.ې#CfXۍZ M*I`\4b+otW5,tM&s}˛zAy,/LwzK0Q0loE2[p;PXRi|0Q'1ur;P E2 ݽ@=mBu: Px1Kl`L<ߓO֨q%l%)[ 6~w*s[k3O9~;;(];CKk۷(#*Ƙun=`v^S %r0w93%F~G)ڄN~H\iuwX97;fgHUrI*:fOջ޵ȳܢa&ݦ/=/q??^=Œe~'+eݩi/ŕzOV_~StO-ՍpYB_7 ~VL >>Z--ō*zdRVLmZFFoM;:)8.2u2. vE[+#F<F{t%#G<䙛9n9}L,uGѯ IB*YpDlF6櫥BxL{C HGU£MI[,s+Qc t^TSJ#g6_ܥm^f]E.ɺۮ갡elҌӘ%=+.'3o2 ;IvkoM$ K>k,&?%\*mRV:YS w j,c7Zd[T&i5c!sG; yc)®V--+Sd \܏RXVpݥ\\ɪCoM khN֋I*2'af'/׃l`fNn ݹ Α8WHS,=+`g1Dny aAߵBiC dg;5XVѩfzGmk X|"bfYv%LXBa6\@&ю~i1@ٴ3͞ OhiVk92%&]#6ЛU!Z{ʈ~cykW05YWfTq]*-+%V,@8.3Jd'.1RюG볿~gEJpZ\vгEQ8`΃UʧjuOƴaEﱤyunɆCSu%9G(?{|(^H-+EHSkuX-/O 6}V%GU n"!^ } - Tٽ1 I.+<8ORMt׆jKjsۆP ,T)DzTHFQeP-. R,n>ljqLMnW Uq{iwH|j8Һ|R_I15f/C=cM@=:rﺁ~͚*4Q֤Qg>}Qv#+DFww;thL w٥j55G{R졚v\>/%XaV9SK`MQ$M JN$C 0}cJ|R :S$'h!dUM NE$9g;P9{F*GѶ/H*򞀘E;REb:N 7@+M()" /eqM)ȖZA.E+әdȺ?~.LbdɯEwSne>#G}R9)Y'`T1oWڻJ& +u?2YǤ-5b+Sj KpQ!ֲo"k+0(yQ)˗[Z؊J< XHBYi?C_Yy8o8a+9, dI>X3qxl#'T 4c)u7]'.=KO-̨MZ}nos'߮?]w}";g]%\CFHhrutxG_iTTX-:md= zr\W'@@rTΎj׭l댵mTd7SFO']JV:{.dmcZ_*̡Ł8G'QBsd  _ h7lJݙSA3ݽSS[e?/ƧEZOd뫋EΌ}ӣZ Y>܎کfn#G7/iGR|NUM}($ϖzY +KbB7vLup뵚  㘔.`Bke_MU61QaSKDQ@ AaZbihN5ݯJM:գ7o/6j֡6-:5/[հ?[3;\XW-7.V%IΩk%_;C5uI} A%g`{$Z ;8CR)WKU݂͒jrnՉ{-x€jX[+;T.jaҙj[^Dsb; {TS[jVʜF6`2T$-kWЕ >uXx9:߁j g<ǢqGB^0X#h!Jc悬k*Y"9e2l\[~`G!BCl *ǜ&yY׽rmLQJU-;hT,e9(& ͸I=%DH: iͧx[MY#a->RMY= Iʙ&[t"m1K=Cr ԤyT3o6zVMыӽuc,>a6xYf:7 ^հĥ^ېʬy*$VzwL1X=<ͲhΫ6w%XFElv?􈩓v%Mm{r97)Pb9;?P86s$LU组nUm4,pFU$}B%[ڵFaR !,x,ZJ5YNȾ[*OPT1԰HՓJH^mvfzNh&{eYl6gSM9-`Z&hsEwVͨĬ,YBZbY.2'u(!E1ֶbX$7lL7cl`H$~xViTW)s EVjxWR լ٭0hΫXeP)qniU:$RY :ŭ0PK6[jZ}n[ QIPE kVvkZkQ2'ӻ1k@mf0.>cAKTdLdגUJt7IBJ%Kbjn $:kt1HQšՐc@E .4ES>'k,I@McQ%{ Y<3C_Pl|Kt[I73"ՄZYh5ĒġΊhlu=7BEhc32PZּ1mo%ZK~*cEanwAen` +`Z^gU,L16!g弛$Rk {ayj/'>T$yv:ˮTgdI׷t ٺ5>ݹ n3UE e'wsS&jɭ=0juFIDU(<+wzs$/(YCdׂM*٪[&TI6>E ʡftɥ*inyNs_Ԧ$SѴvezaIV.5W\j2Q*o>vL`zqLguR2? An^~JB{'߽O-ΖFMErA+:Ey%󈻫Gptp7|u69|wW ~q|osEo[>\zl5. Ez%sͯdssߐפNYzQt M',=ƻ>)%,IһDEޓz!CnMz?ͅY~P,!-TCs.`,8<h# Lm\g(h5V9^#}ɴt&OެBhU)X<2כpT.%TDEy }[E11yd *hX 1az65m\`4Txj8U? R) Nzdze'pxj3f}YW*"˸ZRB*Xuܱ\ Tw<[jv1w^FJՑ8Bt*FlMUjfkT%1VrO~-1?Q;Joߵ'dsVLٞ}dRt'^ˁú^Ak5ՆxeRar6Dÿ4t^.`b$Yم]sud4+enwN+7ҟ ~rP]E"{Z 6[^;n|i.1k Ab,7ɻKmr r6$Y/9/Mhu{5V ]I/mTk#J4ճ=9,p}X@~OB/ejkb ,^uo9*,˝,dqw?N*|qdy6A]gT>KbTKv|ic_` Yr0Oybc>k_D܈٢bC![б$~ZI*-57*|7It{|ä,;тQwym!#fi2K$YB>->P+lưc9_$/#izy˗\$۔؊t?`۬=AI$6E®h IB!YG*4=پ~8ngǕfQJ;th.IcSx!8 |z04e&[罡 zJT\ly?dGJՋ?Zn]eaa5.&$UxUfi_JQ'FS87dJm8A²r2+U6 ɳ7-fmu֡59њhd}$I2\8}5*rЄVl W!|.IheP-)Cn5,nUM.xCS:lj*&23g[)K0*ZĦ$QԠWE&IrURs:i{ 95K$\A Y:WcM `Gݢ$fdz@i2`Jbg%ԾX ԣ$IlÂq, ىDUbR,UhסvAk`^ⷜP9";*F!3FMuATvG wP]SMEΐvذ!CQIVVaȇ]9bf7'c0HbjG5>%$E .ĽĴ\o3m7CᕓJ^J %=c]J|1P ;+?R;ٳT1+ QW=@C$T U`KϬ(CP%zd>=Hv%'ftlrs!%i2.bL pC亩8袌wl1۹+8Kz^vv@F :OSU*{X\Ň=̔vRۨLqd=;I2k^c: ccMT>]TyVXTTٽw_/U,ՓyaIM6gK©jđ,˝#0m#wEc=,` Z7Hh4tIGSX8(-$ym/aOubqo^4+K-.+W(6Ĭ JdPs#&7ů|-i42FWmIE|K_ϋN.}'(ri Xaύc3h۱"ޫ`V1@,ʿo)-JRQ%|x-)v@ÔV*ѕ #efy_4 d :dpPV^z: 'ӄ.N+ KƷ@[œ쪶4/|{~ܼEkQek 1HDK@!d@r&A}ڞ/ lm5#rj nkC煲S%A3+$svFC[o%^rh@M6h*XyOi DjlPsy8M'i!ol!W 8uSy%uv*l473S\D/c/+EbV =ǩ@)(b.hVJ7UzhJڗy$KmUeoeeB ;׶Ti^Ixy5ߢ!6bP =Ϊ=NHIS '7>">to aJʟRuddVZ(?xh4f[A-\(O]KU%I]H.BH!8s;+:+j~]eu꾹QC2Ioe6Я.nσۻER2kKf|~^5}x{!ȑ6<Z#.!O! z/h-??!ܿ9X?wy^Y>YwHw3qpxFw~Lm#[#p|xin"ݭ3]/DxNq?|WtKVX_շsi^L_epu+{}s{uYpn^_7A{=73guiߧLC!+ V#&!-0}g U"wmˑ_O:ް>O:E'͹3TB9|FU̓sNΩu!5|ZazO~/cQIC\Jttq^MT:7rg0H3BNU{ Odڠսo/~i :Q+)g#p ,^-9oSD jtڇdW$}g؂$_T5 љ>HY&laCtQʈdJ-?}ecz{Oonz٨LnZ=F{3^R+m't* (-s?s1уn!ag=J+k>J:TZL_K^ `HuP5P.%TE25mLl<:s~oi2s.(Wk]ޯ\dFiRYk ~5ƫRJWecu2JƒUoصͲR]gH:*Py-GzdJ]JB, yeۭ9 Sctf$-ai{A$KioH {%RbV\/7uF[xӚV*FS},0R.FjpJe>Bg:癭sP 3笋e%Xpz[?h65fIcekDUF'Ue^>4*:nML 8,Fq01*',oj19->~ (ɛfQܴ} SUETOfpΘ.tE^Dm6t4(Mν ܏fP&εD*63'=!8%,+F5CsX!]DR^Pssm!CQ&MnqHȜʰ46J`Q%.-ZjI BC*ܡ-5 @(]M3`k@`HQ|*"fg.664F}>H^oα^<-zPZjLD}n⢣_tANY -bou(ad2#R *l@ ;$zv5"+'Ѐ"%)Y8m@6y-$|ѴFUJJ .$Gp)IfG;^(̹XEKJc/MkWB2'VۅVpW&.|Z}E8zaBeӮPL]%`EلmǐSHB%0Чbƺ\:JkrdEx&ZTk;xgAf40e@`I4+fJ5 A @xm ^9 > '4m1M ܼue'G)2CQ[|:ڣ bFSȯ#~e>(r~Y1YԭV4Vi52k5I3_g}dJq:K ZRf"TM] !lr"Pht"0M bpd sXc*BFr*' (Y *"z0ه1Ъ2k=Ji)UD:>Ԁ^ʊ5lEYF-0BnŒU⧅9p-UB !ueS1x,|OlH}A4-;$fo[FUU;$Mi3Hr^W[a[ ǀJBgN 󜋮:s>3 滑(I43BP$mAc.҆bCf'ac'C^heU-bKSD@-KzlA.,4cbHƒrB搬iTVej22w`9d]k@^ ,ٻ&"sE֩>?[ ږ ?d[nC9b5h#j![ `: \I$`RV= B.- s 8I@S3kmS DR 45J[u)L l/7CVʪګݨy/*y -Bڅ6Ъ"mu{N4!%RܫތF8[PASM^IGSJmC efl)N*"bn{f=o.dIl\ɱW]h3()26]2Jx{"9JHUxaIk&iM@D#G~6,rh~8s<' o qn+(J\#:, ș`GHMBIXlpoƁ [diB1YI$\=vhFY`bEXwA)ƽLԮ R=&t)i)h巼ycl%cR" grU\H~ϫsɫ˜]\_#@7Wj{^^~:AWd22w{Ǽ̓={[xЗxثwگj}ݐY+|v=jK*9cSC:ns)\ח>W;W<$Ip|8|Z}(Vu.z6t_wqMOpœtSYä%O{F0E5ڗ w{@A@5eyOAwv Wml5=zz{n^wfXoN0^=;Z ևP< p %#~5~ꏝKogxAkI{tᲘ/?y sk ȕ}9EhEcٶnxɣ lˏ߽S>tNbS]{UJLMǦ4c]Ah7Z`]cLXk,1֛pٻWCsg0W!ݬ7N>v~/./×loc9NJkZj%&LXftG;iߠrT9Q-)G'NrtPzq)xh}϶_ohJgeQ& ]y],g%-ΩOZ%]O}6wuow U"{}!=gF"7s* tVBa\rpI0\2N &i% Qjf" %9T@`Ӳsw]uZ8b})}9]}u. lhAv5ikP/8ͧkrB&fCal=ѯٰ'eYu{zL5W/ՠtW'_) jT?)ZXOix“%6dZO)vSdRL{JU"* \/_`LPE5je7 Y1 -Π_|0̿BS5B1ᠩZ_&A)dTt^T4g"F6 $V? "X9/}|{ax,$(q 5nM$2+xTч Hy|aB 0Pt! *UbEl묝ewbmRgA=PH\U"3W^X+#,1/qPWcO}e szNU-Ho>ٚ1yfեyV܇KoTA2(7k?ݤoBZrcJz5'RODo\`>-CEbPLK+pxM?ӧx ca([7`cԧd^s-&7+U1QيU2YF5j%MDNVqUB;V8d:RXJ7K;ڥK9)W -7`omJ5 z0%h ϨNlΚAQW=75JV!~>)MqXSQ7O1O#H!4{udE!T0lU2k҄XFo9Bc⻜@$Cn):?vlmU5S[{|; Q}8NFM$5 fqmk.iB{E5C$RD& l'KQ|]:YWAj'LT!)e^iQ_⊵l>r?Fqf+)>Z[Ι7 LnmǕd)7yD20k.ٻbF\S $A#j1/r@U3]84NwWKpFsaֈDzUA DRi=R\<^F!%e¦{;cKonBfSr1XJ0T8NAQ!0csr'u/T 6qPy#DHJ&+lh+5;׭w}ٴ>{l=[g"(VUjɌKR7䁌-K\'9jn\_2 b𛻡wV 5k=-Et}O.")%86_9H{设}%g]]%ǣ-N[{-(XYQP4y58\UOU!~}ݰ%@Pؚ@0eC -?{QӰWz ﹢8{t`Pi=ۡ ʩP%Ē^ G[B.E]^3']>- Nz1k->RICIoe Iu"~QrëGk`ѫukk4;l-w>?sh5ix{)VS%v}82OA f l%sEȔ~U+8*Pwy Ro%/Wh[ѝh5pԜ n{ syx*$va-z:muCȷ^6bNчWJz hp~^\qzX4NwOp8F'^È+nVqC͵&՗-}^iMO¾zd?Fi7˙r]8{G$V=fiXG G1MB1bZw{kPU')[ӷo}in&pK\9ݛŹ>.h|KSZm_ M>e+[iAmTBVWK +ud {^E´>?J[SRX0ّMS}ҭx^@L3g[rT'9nc/`Q_c.1W4VveIZ\6cIcFF 9.F8=az4!24i6ɿ|Ʌ3>Ow|7w{otV|=5ݝ^໾s0O[g/jph?/B7D^>ǥ/ ?^`I/9'q1YΕ^~0>ի.s֧2/Xvo'qe͛]&oSeLBI55flRx3+S+T1^pzMɗ*19FM֫3a^Aʯc}x^sp%MJiý.բחCnQZ͗Qj|^ 6[[dq\,Lٙ4:E$kdmr93FFͨ6nkE#n“9RMvYLL6Ǟcх!9 (8f-ڲ ~qDQ9"шwX=e,Q\3~_4 ,soeMuVYrG!x5jLF,h"g.?!Cn&>nvo9b1/9))t[Qv{t*5DIkt."Z0Xx;I *V6+C54`#ΏG3 %w?dDfA7NX @U lOv(- =bYMi/W m:ӊ٬v678k)b e);W#vrpjzĺ7ӊ16)7)j P eY5Z7i Lܢlhg_Ěl٥EWf t?B))Yc/ RĬO)6i>5 v=$EpqǬ"q?LbR屮tvLe(,n<N:c)Uv FcHF*;.F7RjRXmYuѢ-9 YJw;IɬQz"4X}5̷WN0zVmWss)xNЛYΗm@L=wjOiԨIȭ.­KLV1VEikl/WW :K\a~[b)u hΑ*T9|=i wծe%v.(R!K[h^VbxS}596ܙAF-!({M_q-Z.VMRP'c=_W% PgO>>̞pzF\z4{eOH bnJtow˧>1B5䠨 [~A@Ń]0bcqٝ! CoVGp xCR,f>&-bؒ:Ƽt &pPM9dr']Նwc욡*jZU:9۩}3D/D/Ƭ@G] Tf}ikK KG=9{21Z;9qf\ `[$u6c&&]+W43]x^nM/wL-rU<ś4ҽOhKݪ=|qoc- uAqMR-3M x1K&&Y!QT1f)`v{䘔4W1a:}uA[%/c ]^=<5j@c,I M)4hQܳӏ`SCI%\L, yL,:SISȝ#h N,%ݨXt&0 ٪ƚm%G8l٨Tee7`5O[+gXn)g"Bjk[nƶ >:)`_+=ӝ3S'uͱ$rH/G| )[(!ǩJu[$nMXX!S$]@ W&Qw]1zVa랳:Nph#jHPx۴Fl0Q,0ܳ3PI*kwXa V[DZ4t:CAk3{SUt(X t3F^ɝ4WsYSk26¼\ɗ \w!!%VYC qa*dRBPux7U@/b=ӫźtf X]y B fyv{EE?H 䖅_ij `nJhvOˁ,8B!mJnV劊U)_WB"I0u{h^tt6h?-ߟ7;GQ-+Fu-ah54xp] 53'/ĝp /4cHivY@Tź Xdmːr3I wڻ t9Nk`Zљ좹x/:ә0/"NN\(""j5D[:'&Hp}tZ9, Xc=RBY=fdT&׈hFHcyԻtN4wAn#svhNXų0~_`^]薈j`<^Nޤ5M=Ν+6|d;@wo.;tqae,rk?h)/sbDôgd\DkX܃cjI=N,ubΧF&6<],n4$ s#!YPq{cWz36Ja[mƉ6UaAXGig}Ny͟&i-1ѡPFQ#$}Q6ʹ`R+LSb~h߯_QEd)WbX\#,*z*DbQDK3E1c1(n~SD=7X?OݱJ1? 2ЁY-@A}((Ƞ>fM0= ,)w&Ȓ \|՚Wn ~u3U˻`3<Nr_4ϡyr ~g0(-UAgo4<1&]:Z?_eP>!CةwVtK>Rfse@Gr>7`{xUA+yK.W;n mCZ0p͓>guGH 'ӫf=aΕKJx@eh;4Kb!92qlaTlIL N ,bMU(7.V -J*%0#z}2WXٺgµyd8b=UO|XMvBBt]d"Āvu8ҫ!FӫjӇ"pjI^š +ȆZ+gqHߑdHVʺ,+ H 9wvL5Pr=9]7S47-qsÃ#~XG^Ѡyp c;pg4ʠ׹Iqr k9֖NG %h==i6տ/5p6w# fwϻDh\KIse#gk{g\K,Z\;j.+|\V,Vj;jrY[o=#{䱮e}߯߼9 3`Zg/7ǿh)uctWhmΊKז#6:4-YL%"8#]];\Lj׾!독r wUhw-:1 chS]YHJ+>I8WPYA95GiviaD.uYfq] 谄EN3Ihή*6h)`3 a:2F6]e2I[tkћoVH1qsW͟b?ueSNI"DC j; 1* 6 eU7l5~ ZOab&;D'T/#tϏ}Es2?SiC tf\1b\"˘w\pK+;i\oW8q9}o\!NsBwhyo\yr↜w\EOrʑwSSL0켻u2'M"2OEoT0vJOs,Пx7}^z=%9{S;/${SX&zOn !{B1Ku~|㆘A}9O}4E&g߸g䘽<0=]oϸ74|Ot )c3n:NJ}Kz&[n^0\"X(cJ"R,JUUE4Mc‘T5 #,U[?qc>'wba/JioN~ nÓĎ[ESڭ\.&\bf呱 nO6'$3j~ p9M2hzcl ZV8"|2r>trr(J)#܍]Uϲ?Mo/bO)}h-#CxK1r20ZKCq" QRe P4 p#Տ~¡ڗ9W 'e\x_؁KP0>Sp!5u"=8:&ރ'+8\UxЉ$HjbC{;hCT{uփwPt& a{os~>v 8v»a"#rua<{SܼwN:**h.&v};n$Sfw;4p*:Ӌb{~x,;6bE&icm`H Q|e?Xz2 _=sd\3]~'Վ }uba1BX\YgKŶp{ВH$& ##0no #S SC8ի~rqXI^׸w^c߫~-l18*Xxg<5&_oa{};Wʻ}[ؾc-lUl*8*X*xz wL5977ޅ1ξ/־7s_w_{oa{`u1!ۏ)9V"\ıfQ$$HsnW!z|ܫdHNJqM~rqMzV n?KAm WfOF Yqy'PsGM =J,[V.vm`IphGNE &4$JPI858L3`X?1tapp+˃0Y;ni@ZC..+q;h'!TU<=O)-"5c=i`G ۴'oYQsڌd;!B'5 7Y_w]~ap#Wt4˲q~ScرA >N]#X #t#i¸{'1,ԡ4! pO5࣍b=iPwUڽ?fF sߧBЬ<ʛ7.o>,o+͘ƱR2p%da8Er=YRW<3*IMn(/2W|g~;Y.z2'z?~8 LJ?Y9.R=Iapc,8)si (q:Mbes3oC 3p?DDZ9 ,62A^Mu9'^V̶W&Y?gett=D&M Tuf]uJUZ?c$Z&JO+bG{Ѝ:ק T?s!A,ov g޶ޢd9 N4(ܝ>q6a_y{c6շ5$2Nx"\8WQ⚻lK~pGh!S $>BD+n9 p;ۈ1kAN.m6̒Yfk|]sE6z,γPß,$@ r "ϩ']VVq0\6is=K z6hP07@FYgeF]VswPdyl9En\njznc|y6]ޓͧ~jͽ7q_D1gټ&_וy,n~b{{cKپf9F>!VDbalmsS}fHWJ/[ҵk23B ێH-G}`*뢘öП+|U =xxjA==l7d랔2B*1NdHcS%m$XIAq"1w#-r]ĺDKhf}~=ifP]\\6tqцqnUMﮦV~ m: ~Kg=Wdr$mX)qJ\I$zHpqtG7|y@Ggc ]io#G_3%}xubxw< Wu4E֐T~#w%J5) *+ψȈo |:6"3)};ؑmH5*t`Po: ^-W7)? # (P8JF,FƏߔB4 ?JhvL%6֘x@;HVC }Mz,f!qԝ7$YUr00`1!I2bSE!kd6#4:H$*0M҄B6Σ%"yĈBZ2 ڹma*y=n/5A9-x(`ejPE@S qˠxgC8yCۺ #:$9`l[x(+ծH_4XW})wXV;fL[M#l6e\XYams4G>~ Q%* |0]:RH^3Qsc3^^2xDP !yǭ#/0Ҥ|ed%5 ,䡙Cw`Jm(X{]3cZ Gѕ3Ƕ1fެp:TdEGp0XXRl]Dp.NhfRXeY` /'8_$4Q07V<KO'<M 0gN hfKyfBˆSOHʚG0ryG( [W?tN5sA࠽jlGOqk)$Ŝ-)FbN | eE07LתQʊ26|n%yKִZ/ip'^,?'eVnG|:dXC;äa!i?YހERٕ+"7b>bcu?Dzۃ֡53 +V2D\^W\dr\Aǭ #?_JK5zT; 1Ǖ$RK@/c}'Yx\,Ռ{c/lI\3m{A"5nQso\Xߕi rB"8,E:ҁ"`B ym\B/C2ј}hxC+/-Q˿ pbgtճMĺoE^Q.-)yA(j*p_BmxTTb9]UvA^Xj tˁ@e Mm~pj#/2M͒dxD,&xv$M|X]竓\C{k5FSս]Ղ }8@WwH\OvJr=/ͻxD. gEAE ȃcֳg\n]i+@{w8(n}3xlCrse@E`Ae0Z-b*J.E cr4dR ^Q썫H;yIG}zO<9ϖ%veICl#A1eQ/`wQIԾ|͈Tz{!$),e*bSX=Y'NyBg5‰%#>d2F/ήn D[ a/wSʆ4]%y==C●]kj_C{B2X;])%ɜߋH"&9: v~hV܏=hmY:anCMkߘ/CtW.$8J`hycu2i C;FYSEBb(C;1FG2(oۈGv/J p~=¾cPD"C;θB&`h7`pƒmDv '/4vǷ>5]i /n-A} #IgnNahNnD ]M^ 혡523 Qv !D;'VJ-߃]Pz()`ٟ}2lQփo=MﵻlnY!N)H~.QsTwuM<ӸmeDo{Eνj_hfJ*cp$*.@{7g5rGפ/zeO2SJYtz fϛ|gуKAzxsu`gGf9sEBUޟJ[>|Sb/ZBJeX'b_{h(1[}<=Ǟ>~?YaTQL`i{Al aoͿ\b\$Eb~dJ\CK5$X$̕%wy՜?g }oD&jtyK}Ndص5f]IgUdžicޗ ʥF>-|(3)q!zD9R0i1N?Ādc4z{qVd0_4b>xPUΉ?yhQR HfS11R$Z1 ƙ\2I[c](yu+yT ,c?~bGW%zGXIGZXz)=Tj 9woZ`)THZTKVVcr<Ӂ^quw&C;sPcp`k+BcvߋzumL$Oc%iz]*uȬۥ^nz )ߏ+g>:!|4yD8 ǜ+' UxWJ{b9K#`y;6K~24A0Lb")q ~z9e?Y/S2<|`S(F!~rao{Ȫߣ.~fAjnbng(Y&۳}lB\UA"L ('\Hus3hkY]<4v+0)y:W8W+E6lu>lL/),ai$ɃM*s`3^)8agKDE1s}Qc<<}VO"6cMqE˳]MiƦyA3{DÅe9C$pX<L"r` tU]f2V/Y6Fq?C,68*(nQA-.n0X {L,)|W+bcq]%;&Or+T.x;>!Mg[%xTTE##| >I#QQS<6a^Ņgu}w"ؗägi-blUB|]ksF_OSNʔ~M"RҮgOrm"0h%E@Bۢ$Jh4qsg\'f,$,DUB˥ٜT/h&,4/ˑռlߗdH9w_R|X+7ڌ֣?bdߕOSx1w' 795λ hD}Qy㠼ǝ6k 맠7$>N$ {b?;lITc<7b735 eCOwצ|R&V 쓎׎L?EQDHDR!Cd},ߋ0n' 8cr>6 bˆ`a诙jdI{?\UO8 aӽoˍ"3"qּKcF. Mݡ+2OE+$z%wnQuRnZGqߟ5kye|8qIag[] q^_k3p d\*!WumF?$13HZ'GEovW:8y5""_e޹if)&яFָ֟{wVrC!oP9dSZ'v&N:9\k%# @l9h.>Cu+ct̷Z@M B);@H$aa1% iEzAU?1_5z\#zm}'7ܟо]x^Q.hpyFkB/ ,m} ,6Z_U7*lj ;ye.Dqʹ\YLu\^_lgh2j?C6ռrUsEXyeڭ:'"xkŦ0'#dh'j)-oҜ?{,L 8E7oaݽE8@A`HKmS lmR{V /αn;҄񐄠-6;b)_ޘtqygfԗg-et"^Zv\؜crAzklykw R]4*z6B_,KTl-Z^O'vaGͶ ( Zt0H5aAk"*mKh؂ wԅb)S-tV6od~(.cFP]z Ě07#b'w7) 9N@d=lm}'RQeF\[(7өUu#-D}HNSRNstrb8RZi;Rg);q3Te0%Ew]N4ԙRĮXgNDfSLȍ$)w6!Ou"[Cmڦ[?'bm䤿m - 1vaDI2HV qdc'hP 3e|g)NM b,t< t,BNMD,JB,fk2"vIND %n==ABJ8j{Q_:`P;?_*h~ 6bLhJi 3}"bh`Ti|Vy#E _/WAhP& B$5 m]̓$ɽg5mբNZhYnYn-[S J;{߀Uz7rian_̲xJJRhq7nBsFȇ5jqbF-N]T*Z &}SOfsi:o pE9Ͳq9] isQI@QU/R! i/0[`WLV Vb8ka!A#pםz}mrև?bbo|%Ar;I2=TԽ>Q"9$F!ՊJB(`b!/tzIfK."tֹk5o:/^eZjoe鲞Yw ueb剝z- ڜgI#ULUi!r8丨H*y[ Gf6>|`ZFuVe߼JO2+wbXAէfp b Ym66 ,zBĬ2ˆ"։G{fM2pP@ٛ.[̟raګhF_W-= zBn#C> hgcQᅺVDrk 07Oڋ1ZEmV:/̴(k]IS}۵ f'Pk=;{z8s":&CYQ yeG_kJ,M;y2r$cS4&8R8 9 =)#epcEUgVʥjR}Ugd @ɸTUg;?y{w{d گ4a T! `HpCA '# J3zGD2@y{P#!`MW#&:D*aDTe"L$TӋ7?F<_XtJT8GHɃ=GHɃ#yp$~GHV`Ϫ@>u 4Si*!"  @W rhy~/p2oϾntuuHEa߽vji^>^K̋yqZ}cveƪ<-2d98`[|;_LlٸpȈlIcMW(])/z+a$!H{N5oū-M[s{TBD"`#쐃Pc>BZ(f`a"ď@<|_% M؄O3?̀k x9]dϹ4|"L(ktC܂4s4@\`N1s3~jDې)A 04F453p`he!Im<^a]p̏cYWu+" Y 2!mJ$%F}l>@gTgC{CJƶ`7BJr&tcJzaWPY;QfVҨ_HY[$fj!H\MSfJ]biFҸ[Q2[3.0D/>"K]1$Si`->m!vՂb&t'\f7P6C-kC 9o'z!4ˏ641IF"-_%r Ԇ"힥h+{]LSJ:gCS;r'76cp N:8n{s$XF\[5Xh" dƒ*@UJo  )~ a?!vjې5̎.|*|K *Z^*{$ͽlG"3r qUץ`Dt٨K9'^}2\'hdg?XH׽: B~'vK"ezxo n&4b_`kb^zp4 fٶ5ȶ?+jEq7}~Z4It!L) {k4B0mfSNtA4(fNT%gZ C6`σ}:ok$ @ Bc$bmom F6xSmܶ:r7%wY!{䌻3zanxaS"#+ Bi#}h7x"i1h")A9IMAy dpnG?Cr<]<1\)s>6ج05TxahP-CB:^.Ml(~uTN>W4&6IWq[|m/WV&έM:NEg {JH* 85S@s|W8$Q'Vz'}ߗ~'U M!}b gbs{'sBnHU#e!8wC y<mOCq͟dSdc7aφ0?jeA\`Z~ } &fYUCBJHX : "8*c$Φ-nm3 >Zޠ  `:!]1ZЍ)p$lD Ua'՛h>=%_\ꂹ M='IT/xa;Q]dH V:lP(͛܉[A~r4;+ 9'CSnώ*47z옓n9%3غRz+$͠]Z )Z.lCʔIEB:QöZ`]l[7h);r+f\hDVHqnY蓒f6ƶYmp/Cj aHB! #A)L3p "45Ɛo#h&X ,@Xr'h['b&^@}E]Eq!HX\h,.4_ðcwĈ G_\`,.4 J$Ņ'ERB4Q9  @S,|Pw+ȑh^tH&8u =v 3lE@ƋuU◧ß//2p{e }иV*NQ! ""NVQ>:maߖJh+w.^u76lehf=N/7dxo.{-w+6K12Y IsMdgD=4Кh Ug JS9&$5 ~?JF35&lS(>X qݤ> u?OhPF ?g_G c v?5QeN* B%q%q"}v9dzI7V_$y:+өB`Yٟy3+FO/:y||ZUw4;n/~9O%7x8-Z@2Aֳ7#Wjw;~ev7g_7;(YH8mwy.4tdg|]pOc7VfڿcxgɪQ`1 $LdUJiqM m܎I)&õ'Tp@\2D WAfoTj F NC d8ʪ0?zurcONFi7 a6E2Wc[{Dd&i<ζb]j6~2ܖ^&O [bPސ_ecbU> ^-j< ޹z5U-ܺ|.9vyyu:<`7pY8W2LݕUnNQvq.ϓ0ϱ/@^ضsքEU2(Fd<ЩiE8`8,b\Kt{2,:Dn (Z0URwE\I&$>%]E<|̋d{*K4a+j+]eTUbzPQQU…oU5^̷Y qSL>UsN;Dh RVP+FոjõUC?ժ 4BpUu1M6]~۱8xJӐDb5ʘ-{C&s?O/rHԖ4_R$?8;O} I*Wh͇Dm\F^"cd0L2(ɦ2I&I;`_^4'̛קg$B£hZ `Hhwf D-r i&4rD0m@"DPXW$M碘.W%.C=ɸJLY%=y[_oŵ:7~(F^\eNQFCJEXkY o]!I\.v)L:?KږE>׺RS[~ƶt棚CܪtqV|x/>eNOM/Lπy$A|l|b]ͧ8?&\S6ݺ|XG7u>u^vr!`7;[M/&{?ޜo=qxRfY| RÐ+B 3ޑVwe7 j1VWA 06r QR!DX4AxTD`M)"1FB^3ߣT qQi""@Fς6搂xD=^U*$SS"V*DgqBūHXFNn,FGJ(@ӶV}IXxEڋ a`q'B%"Ac85V* h6Ih$`GHh]S]Hbk ?!`fG͏ *-H#eR!;iGK`fe zT'R*d?k1hY#eh\}dB'NLCrfRfYӲb|HU QSB)x0pS B{f( B:# Nh |.fxeCCtAj3$=m1;;8Z4?6/ߨMtxPsH$!eN-%d\z9f4ė3j3<㯥3{/X;_sli+&y݂74lj8#xٓ-U.vif{T9 [K s~ror)&$')F!S8I5i [LLRK)'I1LIo4)!N'sI[_]0 oQ'DlvN!!UEΤt0#!$Z*̈h{+~'w:pP /u Km" ~,{|4.;HF7Ů{ j=d8bqAb/X[x bbojLxڢK~l#<74U-3""B[zlU$eTC@TpTnX EQIsލm+g`V@U.mF7h䫾UDDe/]W%ՠ14}^[j2_U]!V0%}wV12.b"4(!{lW$* A1H]x+읷;H޽ۑ{XM1…sК/$ Kۖ{ęY+l/ZǝG[rp^[%K"dI{پ",vpK>4o]ϴo>a_vo="Ek}~0ks;$)A碥n XWE9';ZD*" n[U\י^|;z#Kh<4n+CrѶt. z{)衰4>mÎQ8M"->=ґ hrFD0dFG眬1H)*1Dh>p/.z&gs/&.j! CCkX_DBV7GTYvm\l8ʫ7UV0N82}o:tQ<}}&_GDþPUN ZQ皬^}cyNpg>WqEa?\\d@:)> &W=4zcQX؆M5TLSL5 #Q(L{`F=0[m6 lr2Y'Ql1oXOߙ`0L3%!: oQ<;:X)AAxlCKry+@:ScR= D}> o> D= 2\Qy? D`m^2LeBVt)5b8QDB> a͂pͭ1AVP* ]Z!2\ jlBfXgM&d~g"7l&uj )YFӛ໵ hYV$j7-~BMZ\n]ݺbq ;^[*^bTn_ ;J}%v O؉ߘ:nףC&^]ƵH'&Z"h!5I!PO畼C3j q)Mr |guɇ`E ~>_;wnˍxLM[3ȧ&l2[;U.6cЇyG[,EGGrte "[\_K{:,C9^$/*3wVQ-4~5whios6jefUn&{26*4Fڼlr޾1]u~կUI^7gpdO|ٿoNR~Q}7[U;>t=2 \ۜӽw!߽3Q)DB~@Neўw»q=_yn7iyi'8ٜW?uߦ`/,wC;ӌ~ cq!nZwk)>w>LϰHYgJ&<։6 >:IA% g?e<MH3⽙F~~4c fsNҌŸG]Ǥ||Bx+߳yPO,u rO [KCUNiugzAXbBwmxCXwt9Vۓoʑ80yZ47zr* /1XﮌQB$F ^CSsV$BY.Sz}ǩ6#^]z%nkDk$e8179dĘTgHy^g6C6b(WXwN>jqw8-m5|q㗁b:t3њ]K!.'ٷpzc-CL%DA[Oh/g_|,laȻ4)ft+1U.} %úZM:Yl۟A}ٌw1WPBL}J:u\d77 _ ^7}՘3K-ЄHÒ+ǠΣ,2tcn~P_6>͗a,\j/hQO>oOwFVEQ\M{V+<8u#QRY=G@\ق ^|`.QueaZFkU Qd'+DgۘsQ3#?ջ矚yk'=5'Ds=y{Tk:^_HX=VgOoCDex(#@?cb("[L}Z+悟`n Yf|zX4Xo >|;Avg쌰PxNxek{Wtln[f{*hdj$hL8bS>:hiBȈwCJ񊔲 QRfҺsmLLd`.yF|u柗fF_lՉצ;aVl|nWoس'F|zMg>=ZN<[qV.x[Uyk~}0,k-˥}eUEtem){FUe\|8Tm;pq/Mz:]7v = vFjgK[c(!sI8S苑8rͶ+(ֹ++lſwKS%HO0R<fJ(GaR]F .#6z2y^*8ۏKЎ ;saCƉíDW*~AbSf_ΰU80U¹ulnba~4E,AR)噀vU bvIg7Ud3RdԨIŨqӂRk6 ZYxb3&05O8Xdh HO''si#'FC^Hl&gf  m@B&@bcMBE^uC!By뉍,*n[P6…4#œ6x 7iv`lm"09Èb_o*E06G*=O'T#h1Ar-{`@lǯðe9'J *;wə(AMVAM0}oPO,af[0UAk6 Zj63 ᯭpaAP3Y0'H",CƁP2KQ\O(aFqmE 7c不 M:0Z)0b;& c>WPxf;>N 2ȫqrKY*˷\x̗O& 0@@|#QFE6;01A4Wр|a4 8qYmF@o̮2Mj{|Po4x%XYroZA4l2a\@kM,Șٰ ˦ *qbfNOT/8B }?|˕+] _t 2"KC=Kham]"0SNBcmwR/+"M5}c 62b^hwe33,<){{+یeBovX* ?{INcnC{$Efˊ>s-rJXAǹ0w}f*s-vЈʤCk_NX~ZgAe{))P([tKdYzs !Mqb`O i9בDhn aΌ?D|x8DYM,Y dYU:Yj[ Hbyq.p9Ӛ"ql Q771,"c>>o0Gat(  çCE`\  }qb/\.tw7usac.<:hąo7eQpZ|r-4GY8p aW\  [FEVpq[.lTp7Msb)<.X$`Q>*FPh =qAc'<6hdžhA&4h̄ra%.hp4NFIl12BGրGGѠm4hdra".xLD s!!|6h46FA1>2cC?l>2|hA4t"CE<\xsb|.TυsQ̂F8l O\ E6pq [.lTixG4(89ol?Toũqo 4:Js3-A&243E05v|VHt8(T)y̰RRTy9;yb^BLnBh|F$Ŏ]Ş!2F*h0 ',]:!wgEks;W#=g"hN8K{ vHb.:<ΰc>y͆uؠdԅlʉl̍c;hl u&kalP R Tfúupem6k\n ֽK`A]lX'6c;f٬n5pfúylPξ>,aTJȃ"=Y+Ԡ'YdX2 kSց0*iUցuve e>eY'Ҵ̅ږd8ܺCc^i̾C60fzN#`jlx#N !\r;3kh"Zyd@Ṡyp@k3 hnڛdX3 kq擃|6g2љO:sɰfg>C3fmK6ZےOjlJ-?ǯu[Y*3; Mc(e-7nc{?&lo2NRmu h3EFyG[--9؎n-Z8;%j+{itqsk߽Gx<);=vz=4Mi.fYsW;O>wa)07׳}.: g&ǬHS2t du/ҤW8~fQ\ls^U޷}jNvDb!<34K@8KT#-.f ΕQH6%fAI'3!Ҥ: ٖ3Qp:Mf^@Ny(ߤ{y%%\w |2R0ᒎu`ҙBиQ__VHp/Fhb:uh&(s. TUNaTn[I X9\Wnto/ϗ]jΙ_ʓ:Ay3MP&)Y872eXɌfٴ_ޓ߰~u\`?vԏcpa \h?vԏ…c7q! \P?vԏ…c7pA \h?v ̏…cq \h?:4 ^~4{ ^~4؏…cpam\@?:4{ nW~\`?vԏ$O\Aw&D'dFRlFPrK2Md0dţ,?.}7Qqsmi5 jʺaN܇S>v7'ɢ;~sF_Y5~ʽHT&i4Jw¯?U'=q>7\[Gfafb9=ai7ؤussux07l>Q}i=yA-'?*zu}iۢJ:,\n/Nz{ D6u;5Ѹ J+Az:ޞטOԞ8iWI%_6gӎn[ӪKFr?\"~-˳@e2ȮJicXpIt,9eJ^mL?af rA𣶉d5ۄ1 -I3="o>-*]=]͑ź-^zZ4ɓϴGdW _p]|en|q&Uȃ}KRd xigKu !F2w2XTDnzOZʼnPv2A+wۏi+'jUZB-hl˦'{=v僚)+4:&%09(:-9Rr^g X\gapqY>(&C0up^z+ss&s1* .l |Xpa ǽ8)hǎP7]= s~X8^0R0!^kL9*O5T sGL'٪R<φGp byʧ q׮ϟPw|nROfR+DJ43YL @ĚS-jYY_p8~'胧勆asPfI&pYqTd]e6ʫhVDK'Bm^͌DӢY|wF G}Yy/5`dS6~ʑO#70l힇T%f'1ta1(6)"eiԙC)M8^׫:K40Ǝ}{ֻhG |mNxQlWNЩ~卑v}?s`{vfWȌӀQDw ]7׫oM f?hbԉ,Vj0Ms=db~w<կpqJcPE_y%ozn/>W_/fzVOh Lݦة j*[q,8sE}{m8Q E|=;DX-,ux]<|䛏'x=5Zҹ3.z~S}vE/.?*=9 !FKJbl=@z^d:oLe_|)BNIElciS1V 6WAy~F۞HZ;0j R''B㮿ek(*Ƙ('D/Njgũro|T㶍I!JyL&-$rW님M;״E6 M*0M fƦ Kd@i"4al6kȠ6MdXR&2,Mئ KmD'i4 n6(n$7-p@&2,Mꦉ Nvi6x%ivi4aioMao7 d` dH8 N K@Y!C4apVȯ 4PKTgښ2jx&R.}7DZ#cSÈEYTGmL#H Җ>fό÷"ZCth}v$N:azB] nOO5$jw/N3Yqµf[sy۶~ԏye;aLߗ`UBMpJd&SbNYTTS-"L'Ba몊MY{}ÿ7Bר>OssM(8^\<.&vv` 9إ-zR(O rGi,p-=>KTZS瞕|~`20RFdanj&혯<%y9eO\O2P`vٍmG C&16KM2>컌Y!AR6ʫ?}ޯjf g\CF%%ELï\.d0|~V"90 ;'%bB`?>@XЋ%y(|585)`)AG_Oc3`S"SĥUBsL}m}@> Y7ϞЇdrI쪐[.{?^עJv>g[ɳ{ osEUmFCjSP=}?<*OM(q fr֖ӨܨhJ=uPn&yvb2aHWg;|ijǶp?6=U:Okk~Ôgr\eSԶěD>jV)n6bR` ui7_w戽ZKV}+=dwFKX:^}г R{O|Zc6%76,cb?{v cۧV %j lȖo/vr,ُNI볫8m"CWRXgRK㗱 ^eJ#;ڏԽ lHʆ|Թ6~ֽ-l}Rx˵+/hZ=:gZ6q!,J,-6dcKV%X2*r5֢K {Unt>>v-X"nz `WN~c6DD k]PuHQ[enj?3ze?aC:)R&3`(%8v_(қt`(noO(lhp DG?wkx$U@x2]&6$ Qp@@l{]g#loB_j0.M"CeA lZ~Ov%LO0lтPu/ֳ7 z'M#EճF\FWUTi8'F"3''n4ldլqx?{&+䙵d qbKxmzgf;>(f$ ?U$ХRΆ=%P9u(ZJT(rlflYqJY3c^hV$eTƗ2{ZKJ:K? qc`n<Onj8)Ĵ// DqRv`roFlY–>`!f<`J.4wcwh{0~G6W(r^`)LV[3]oZ ;RkDޓL=AB;`福%{ ^SM."/&rA8|z703|[Z ]Y#HSQNL<ĉxhRIT˥jJ?yVF#ŗ8}:cwwEiW{贃&|4˨yHS応r/"M:/񘼴=ZPWʈ0i<>M{eѬ~g՟c,Rd|lda\U@Y•k(T%{za2*J[7G!21XBYLQC5یIU| VȋI(n/-u'-^Cj`26mw<-=.n,bfhdQwqڭ7ڞ;#9kzO?x*->|t|a%[2]yմeGi͍so{+* m1g4t5.*WۈDFY, 0M'bRBylmaf{Vgq፶|OT,afXSYUV_U,0e0֥ZLJńy#95e B4g2ʕϢl}cPr1@4L˃eb309E|HU p;Tm-рɻyZ.P;:JS"0 |{+dNv>N@Xn(^&Rd^{t涛gVj'iFH%i='7iOgz*/'^+u'-R{ʩ%oʇU*,SZDCsr뜩7]k+צoM?$<[z_"שж^uSwz)uաIWh:ջշ^,Wr7],UV[h)ߜFyߗXM72 ׮zҼN_?$ )wc:or邏& 4]߱ l6A+pvHNRɟsT9(*ZrG7)Gdw_(YqZ|zb.c"_W%2q )wi]٦`,Jp ka !`hkLQ+S-v:檎K4q7ܾ on}O~ⷺ!Wv($6}UƢا̱lݙJ`r! )o*vD,68^|)z]qYPIolZEM~[]|1Z.K5xo-! BZN>E6Af`EuMt{}9 _stT3_>=HK|:1Mq;CK(=xTyLdL<۸iX/ˮ8DΊ<7I3wi]*$MJoQeBIZU$S`-\;З$rAjez|Φ])J:Vz>n7 Qw/=pPs18C²BCl;!Cn0b؈utXDmvAZmÊ%.ȢZV`> W ?U+H"5S;9k69+JӠ4P Z(Њc )Ǯ) \w0Z4ԑ4t` 8T: $@]wUl(c0G 5f#w;N-K`H9c'`mʈ0)u{Ɇ1hSQÓ[!1 ʼniyvlb#XC0ws).5L]}eӬlcfr<K,,m<1Xd kv3vjYgbi9c[v+LUJkzo)`Yq(0d= 0lc+0`6` 5 }Z˞TbپOR)-l{CitՄ"ϡ2k? Ğ!z%ݪ4iE ԯ3YyK2΢Ѝe?+zz\0KIq.&_&* 6 @"\.3n0#.e<"MUE@=Ѷ9{ƀܐ(ҭcTdK#/{ZoddȑpaQ=IgT񱏯ػ AWdCe|Y/=zB4<]߮ FIJ޶5v{ mխP!7hfg ;ķphȡp/Ė%8v` H:y)cTJC5vzeIkOflF6s-zn,IbY4X4+6BԦGV7Du=a(x1QR+JH.@$+Gp@RNLO3PIpYy4X kRzQ pPtf *@nT|)|1#_dO*[(& zuݭ:Z_$$.'5!Ĥ\&Af %FDF|ƕܞ!ߵn^\"V.P=?ڕ/gȭgQWڥo{OP$ @/3~+/4MZV' ~CXWQq r} CS|*d ʘf]E'T:`sx6E0)W)Uyt dfP ȡ@|O'-j́I:rOr8k<I߳jA?;JZSi[3-n*~oA g!+]\! Eؚ?[\6 nU+P mc٢0JvGD&Wbvf$ffio}9UԤJT?+j1+*}wQT\*Z?R>R0ڦ=6Źk9.u8Ԧdl:y> Mx.qTCڸ.qǭ\-fiq9m O[<>xE"7̎.rEqGR>5[@z&\Cz C[SEz g#̝f6lJzmI ioSNZI MBi$±-[k} OҘA+KEfi!׬jMoiV<IxiW̗hEij.L'I\Ӂi2-/Ӂ53-؊A;qwSBUft M t`+NbJ^dǯ2}Q"N}6v{bI:P@6t0"ѻ s/a^Cu੮BE\vzd,a0c]"2v\1F|dy3}:)BQ\V9 <c/L EIn"/[b% 0m{ԋPxb7@},yC U}vh^| +r>4A"EiL,C?Яߎf]XLe8K:mb Gx!CfCԗ?f!şVP~N! p]L^_׫,M`3l2ןG Fy!f%LbGRxԡ(j+28wdPNj1cV+狩\`" pS cO"d#? 1$RtGw0aQUV48]yAm*nD4֒K/$ABUWI!:1*ˉC!p͝ 3Lv0G>JJk"Zܔ^"@kz*@;x\ [,Q%E?N(@Mu$5_Gr5br`Kth/XZɐn-b?Ip g3C"W[.K зCWت2 .A+QIi,`9>Dڏj)dt@oXБ6lU_u (D qδ=‚e M7" nHEZjr8V#S;ˡтӍA,SMLm',j_u0Mgr˻vr۠@\G::<]Le>꿤z?݆0ö ʣ7n-)2?F fjPR ^lbp?k/+ EQq%?KFPi扊hO޵, -ovHT63TjI*S5Nhk.<ׇoԃݰIQª> EB$}꡶/E‹a3BqUQ0[VJ,Y `gڂ6R=O!($}[E7: ;} .҆[;)\V?c.ʳ7E^kS/7 =}5zC.ߖۚ)] m* bQ +)}C)l PdOH-cWpR$&,?n72Jy`6ܛ^N}2Dlb 7Fb6I?zzȻntU&!@|/~ κgh8Y5_U^A?W*:\Δ `G?1L1AFoRߚ`ކԃ4 }|ǧXU-wŻoгp-z9N_]TEpj/,֪ ~p0jK%b iW/c}(;bO wVsEU_@!VP.P|ɀǡj+<V}P\;ݮ!7Ȳd8 )԰1h^ rIžÖ(aߘh=yX ^ ݾY *kufS?`pH?4 /xthC[}6FXSv]<")n+#K8 )q+ |;<톁QB cw1 n#.|m)wql;vҲt]~GIo翋{pYP]/o9VtН9J%L o%:]7mg-*Q&Z%p3-sEq= faٖc7qPqdy;wW#s%;]o z몎6ۜICq4pi11:#:֑互,H3⥒[X# Eω 4{~IB$䴩еY, C0pY{a8=CߦBscYNWҷ,f~'ey UԺrRK'H$!It$IB$ IB$1$!/!?v$ y1$!I$!I$!IrC5bIB+$!C4#IH4$!HBI "I`I~Xr $H$)O~!I=t$ǒHґBqґB$HeH#Iґ$Iґ$3A#g"'*ݥ+myzP[^+[=<ے\*Ȁ0 7C[Hij|G2;DWQJ h+Z_TJޗ߂杚(Ju/+ RQ>"\0i1rs0b}i*u40;#kjQ\>7mH"8XUFǀz:T1nl(TUF`=,f}T%֋0W8VD&PZ"Q8k7Y97'$c&cώ';u@+'w^nO2|n/wa۝`97d#{ ky%l!x軖@28-']hL_˦U48 \#GʉH\q0?QXbvYeOۗ?pź2bU_r6)>iQdO~qLq:ڋ%ҤymL;[RE&JwɹI5noͮTiUGjv?O)H0 ІFfw[A`$Ez͢$ X߲ 24:_9Ս2IKW(@c`+$@"z98Xyqv@McTx#e\Wm!i9WAc*"CdAR_^|Z>~Xz K0,0 0N' R )eYHܸD$*4R0{^]صN>cR菿 Ng?Mo9YXyP.*MQsP_[e2ſ!j[5$+Ct}]>1Z>3|mgn G~ft0]?3pkğqҵġx=v #{vL7p<⡾ D(#*bKrb]f;i8w/_a⢐$|VBtC D0Pf2k{2[!5Ii&IYb!g$qzhϋ2+е~Tr cI"45EJKy,bRN_Ak=&E4{#wT5κIàoVO#b+H~궐) ;F"3?&I$I<G!I!7sEl_WѧH9Rܒ^Jx6p0 \6~uͷ[ā.ۛ#/vȕmhn>u 6P}ËixYχEgnt.ʣPE]gW|==n1%^ily w^Pk^JxQ‹^0ן?-dZ libzypp-17.36.5/tests/zypp/data/Delta/repodata/repomd.xml000066400000000000000000000027641476576476200233440ustar00rootroot00000000000000 d41033826a12ce44a1b33eff2e7905785e0999da 1211014822 319b2951aad2417c8961442ba692d4700962043b 4f8f83525b232db93a761ed1be79515956b574cf 1211014822 70eb95f379e0db1c9815f0a1cb2269d93e408015 28a6aae0cd873e1df286d4a07fc7e54263fec79d 1211014821 5ad445e403218ef4a6585dbfc37ccf31d5a10096 553f609c610b0cf51b54efc4c5c618537707ac8d 1211014821 8c840e0b03ad8c2ed0d4ddf57f9a6b5cea3ac412 596018d6e767808ac6bf4e89cc0ea1ea7a1916a8 1211279868 596018d6e767808ac6bf4e89cc0ea1ea7a1916a8 libzypp-17.36.5/tests/zypp/data/Delta/repodata/repomd.xml.asc000066400000000000000000000033501476576476200241010ustar00rootroot00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 d41033826a12ce44a1b33eff2e7905785e0999da 1211014822 319b2951aad2417c8961442ba692d4700962043b 4f8f83525b232db93a761ed1be79515956b574cf 1211014822 70eb95f379e0db1c9815f0a1cb2269d93e408015 28a6aae0cd873e1df286d4a07fc7e54263fec79d 1211014821 5ad445e403218ef4a6585dbfc37ccf31d5a10096 553f609c610b0cf51b54efc4c5c618537707ac8d 1211014821 8c840e0b03ad8c2ed0d4ddf57f9a6b5cea3ac412 596018d6e767808ac6bf4e89cc0ea1ea7a1916a8 1211279868 596018d6e767808ac6bf4e89cc0ea1ea7a1916a8 -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEARECAAYFAkgy4a8ACgkQ1iFKyE0tq/K1UgCgkm7T8QgC27qE9labaumrHo8o o/gAoMX7sCbj6CkSTL8a+9eQf+BD0eDV =mZtk -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Delta/repodata/repomd.xml.key000066400000000000000000000047631476576476200241340ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEfNOC4RBADigjtTYiTyHJ1Ld9Eiul005PyBoIk0oG30mbsrlx+ETir90aB+ 9FwqfiYBbug0eAuIvF8Cpg2scEqtL8yLQHaeNzVz89iAQvPa1UdCUkn6MLMGLm4F R9aaOsVA4yrtUDyoouz8eu/WzZfiwi23auEuBcebb19HPZ38YLLNQP39RwCgzWRr pfJLYd/W2TYoAg/zpIh6VsMEAMzVoHQWd/BULoqmXORVvssB4u3apXiL4pThCvGk 7PlicRTIptJnYUUnXbOBm8kcRmW10Bh/Iahxr7GAjxwADwdXAV/1W9xnj/2uZY09 EwIrTrVGkEnBM+qciroAwwrR3232f+W/2nKoC+VHfoTdWoYfhh365IpWRlgRhWDc fJbNBACuHoGS8yve/hOjyOR6oeqt/vYdTPZZWhCaLME6g41yG19+hosw3a2jjgtK eP3pNXUQeSJ4fMzanZcgH2XNNPCljphIogjETLpR11jjoCtQy+N0jNZM27EMCd2g LMyW0UFOCqh7hqS0wHbbIkeja2VETsNJhcZEUE/MISdB534LQLQkSm9zZWYgUmVp ZGluZ2VyIDxqcmVpZGluZ2VyQHN1c2UuY3o+iGYEExECACYFAkfNOC4CGyMFCQlm AYAGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRDWIUrITS2r8kSdAJ9aAv5D1Vk1 aAXQtjG8Kbt5OBZcMQCfRvyOql8UUoV30nx3tmfXMWyyYSK5Ag0ER804gBAIAJMI aFDKVAnCbm0hm+MjolK3gobEFFr2QZNCu4DvYZikUz3P1Uqc4EjhTgPWCgd2mN4w Odzi1n2mz+PF80i+xl92gN6e2Br5mufsXfDf58smrQZ71E6IuG/XJC9Y+obfgIFp ngTjYomal7wywFqBBZq3mIN8xM+9VkUIsUhvDWvbj++/JO9++uIl67gjx8zhGJhd 0rWEKsNcbi2cVLizs6Lf+GatTr61pS1AzRU+sxsEr9pgIAN0cvxqRTH54i08Ulf3 Z+m1+jTJ6vTB206QChyybAL9hp9tckhkWAHcS4paK8lEyz37UExTIVkQNaDxdDad zYpE3gVRkniLuKhCk28AAwUH+wdPJIMxIIlPMUtATLgHqeLnCA57tDra6Canp466 KpJ/aW2GfNYUs0OgivX41oPBBCGd6oDuZwREtj0cq9LlG5YCEbgbsC1DEOncja9/ XFoTdbp6Slvlc+aw54OUzj6rNSaOSJpigN6YVUnZCoS00vTH/NubOpC+bpl1f5lL 8YlR2NfS2XL4CFlLBuUQiHv0zzKOj1180oyfzrzjon/pxC3jakj3+t9bJaXbiD09 zKJRFzFv+9mLqma5zFkWUZdWRR+N7CtYl7LIT3TdbIvlJu3N5cyHgGBkiOykXu7W RFdFqdZ7+6aykKUUMbwp+mAVfjJVVm9U473+5X7492SlxfKITwQYEQIADwUCR804 gAIbDAUJCWYBgAAKCRDWIUrITS2r8mVYAKC0gRLVYbuz9NTtT7u5kaXcFXyXCQCg lOfxwAGsuxmSvTOl+hKc69QIf1eZAQ0ER/INNgEIAPFj1RzNpcDF0w8Ryc/+KIx/ /xqWqE6Kv6DoUu9g3VGmj4lLrwEwbInbJcffOrlZkrZazB24gfORRyyllj0UfW09 U7qtOzdewmTRDPuYyXcvtL6ATIpjeEapRdDyL2DKLmnpJ7DxFm07ttzgDJp+cmqw 1XlFB2gt4Sirb3NRSubtX7ZZmaffiIHh9yr31lkpOxIKXMrW5MLhezQ57K779LfY 58Iq6EUjeGU5XQPLe7lsoBanq1MojdFsRmBx8TT2wjzpMLa1lDMvQgGCW4fajY58 J03coxYWXu6dp6N5x+15IIETcWtcIRIhy5Y7qV/AGOX5fFG4YEDnmUIiQ5CpIPEA EQEAAbQkSm9zZWYgUmVpZGluZ2VyIDxqcmVpZGluZ2VyQHN1c2UuY3o+iQE2BBMB AgAgBQJH8g02AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQrMbwWCOvAEFw dAgA1BvA6/q6rsk0uVsue3sgJunCdQnF9zY2i8FRuOfLwEoOuX3P82TUCrKYT7jq NfiWYbtl9+sp4+5TBxY9M5nBgqckMJoze0vrufq8uBLzrsabIYRPjFYpznxjhIeo FDA8PcScOYR51K7YhqAk1rU0M9SmeNCh8O6mgI546QZLVHC7w+2SDtsWWoRhn3/k WlHBmaU0XYLtyuRIG3uuUjigUU5F9Gz1sj8X/r4WAO4Id9FGruORlGDlW4yK5vVt OHE1/vEnpPodJEI4kWisPoJh+/1q4u/zGBtGL724dPmBuqQ3mLwbXiahCaZiGv+p SRTL0aukStJZdNaArDg/PTNxFg== =ahjB -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Delta/repodata/updateinfo.xml.gz000066400000000000000000000110611476576476200246210ustar00rootroot00000000000000.H][6}zvFܙl6ԦvML:%@ܗ6Syl9w$$oyGYw[(+[c/n${͇g:;Ye<#)wQV]쐽WVEߖ)nKw[+.N2WM9[g^r?y>iN r(}.v 1I*pcɛۛ)S0|xIaYEb'pmJ6N[d~NclA]=%0EЎ>ZJ\In ۺͳ}jd<0tK ,S1ŷgHR;>g |OiBGea9n-i͞-#CCA+$)Ot9CM]mvkxҷ)-oqd@3R#P=gS火$g Ѵ,_4B44e;aBkj^Q: 4Gbmd)2"ZFid ű@tLU3+%=SO0k$Dp"$|[#+2!=s!~1q0 g2b@ROHEg;P|G9".>>(!$2>%@цIaDDew}/-A[mw8?jٱPQZ{ -45j(͈G&C N!!x@4@$..ϺPCZ x޶LY0t3ml:[c8q$k St]5\ [QZm]_=.oaq*XlO .ƺ>&)_MYmOMt;TF.P@Y 7IpX݄&G颕2n"ijU{:us`5/FVae5H%q0 zʒcqcTE{c Nt{ Vku>&?k}J:k sFk@pKCQ}V`/y%g ZtثtNHlf ,K5O \V`X6T=U*T6*R19@:'Nw֊epwMS21uGoXԛ)͎)#c5:Uj Ci7t-(9Jif ؆LOڐS|_5&uBјV27?[ %1̩k4>wA#p|WT\7MC%kJx7zJbxTPnrǖbhXttc*M4|$/?Eߛޒr|];y0tzSDj }-@ІjDmԟaK7t[!$uz[cYsCu_ФxjuuzvQl~OPQp=g]?E*IgxZ }gJx=(/?g}9]-.q!+]1e\zXc].-1sGt i{bKQ3?lj@D\D$H t~Rj%RrflD=fe7z/HeЉ/F s (<5 @aqpSdgQEmzAt4ȀUC>ʚ4Ktѥ8Cϝr,8bAH6s"k0걅s=nRтmY^ |' ! ?S4ЌBep0 ̶X S-Q DXzAY|<8f ʊ"Ӗ.KqtNgp9GIVkRBU4* Z⮠1ӊye)໑N 3O~>"=_A< BrN`..V` jV}<|Ʃ!> /g`Sٟcɗ*|),o9Ƿ~w΂u䮝Q֝sw0g}y'? wOC}(E]m~~:d}gF|YИxr籂 0sKL+#~jd Yʓ#<9_s*'_4 ѓRYzN鱦Pe9rxOw'o+Y{򦱆t=4s>O:aٝk:Ajڏβaػ.>s2c8|BýgGfIeEOLV̢K-&~Ru^ɳ&xOЗ3~!ϹO1jb9 [h5OΨWiChu>`**syt<@c \M Da=#Б1\VX@sY t7Pm:AP"D簒%hl?ʒ:)c ʙ ƠstAh5|͛K4/UARX tC(];LB@xmHP~W5 ;gh*jf |n|3.C*L͒9|%P< šk*CgpE_ATKX0c!' Plhk@Qf(ϒ;῾Oiᠲ6 g/ۆmXJB~B~|f j@GE3Kz@GGS{4{z"Z w.ԧ]*(AlJff_{m߃K 1ۗc#{ٻI7Qz_'1p+$)8)F~pAy}@H 0̂48 |E"y;kBf_oP"=_]+J2z P)ۑ0 >/sRiX:ew~gR(&,OBdM^QtSԦ:ulH7tYN]RVdM/(UK.24e]aMQra1QL/׉OmfX&%>WȐ*yI I1ʭi%ѝSb^h* p=@w io.P>֥/A3m? ~qW:t q8밯U{Č֨ˢ9,TY,HlHAxy_ycTݮ)(עzb~p HF\Hpb KOԱ|qKNKOI}5 ;ՖtvW촜ql͸J]WGr-@#Kv$PNũ?7\篛K<ӓ \;DVlibzypp-17.36.5/tests/zypp/data/Fetcher/000077500000000000000000000000001476576476200200535ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/000077500000000000000000000000001476576476200223105ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/000077500000000000000000000000001476576476200242525ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/directory.yast000066400000000000000000000000221476576476200271520ustar00rootroot00000000000000subdir1/ subdir2/ libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir1/000077500000000000000000000000001476576476200256235ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir1/SHA1SUMS000066400000000000000000000001701476576476200267500ustar00rootroot00000000000000f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 subdir1-file1.txt e242ed3bffccdf271b7fbaf34ed72d089537b42f subdir1-file2.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir1/SHA1SUMS.asc000066400000000000000000000003051476576476200275150ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkjaaxUACgkQm+zCtd2wN1ZLgACfcqpLHAavAr8cIjenaR3pJHpo WoMAmwdbZQX2b9Yw6mY1aGbarwsEon6I =/0VZ -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir1/SHA1SUMS.key000066400000000000000000000055611476576476200275500ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir1/directory.yast000066400000000000000000000001261476576476200305300ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir1-file1.txt subdir1-file2.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir1/subdir1-file1.txt000066400000000000000000000000041476576476200307250ustar00rootroot00000000000000foo libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir1/subdir1-file2.txt000066400000000000000000000000041476576476200307260ustar00rootroot00000000000000bar libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir2/000077500000000000000000000000001476576476200256245ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir2/SHA1SUMS000066400000000000000000000000741476576476200267540ustar00rootroot00000000000000f572d396fae9206628714fb2ce00f72e94f2258f subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir2/SHA1SUMS.asc000066400000000000000000000003051476576476200275160ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkjaayAACgkQm+zCtd2wN1Z3GwCfUjf9mRdFrB5UvOHAW/DoEzWL mpEAnRmkzRLTY3hXiZ+95XCYG1csiMmF =X6am -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir2/SHA1SUMS.key000066400000000000000000000055611476576476200275510ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir2/directory.yast000066400000000000000000000001041476576476200305250ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/baseindex/subdir2/subdir2-file1.txt000066400000000000000000000000061476576476200307310ustar00rootroot00000000000000hello libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/000077500000000000000000000000001476576476200257345ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/directory.yast000066400000000000000000000000411476576476200306350ustar00rootroot00000000000000directory.yast subdir1/ subdir2/ libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/000077500000000000000000000000001476576476200273055ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS000066400000000000000000000001701476576476200304320ustar00rootroot00000000000000f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 subdir1-file1.txt e242ed3bffccdf271b7fbaf34ed72d089537b42f subdir1-file2.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.asc000066400000000000000000000003051476576476200311770ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkjaaxUACgkQm+zCtd2wN1ZLgACfcqpLHAavAr8cIjenaR3pJHpo WoMAmwdbZQX2b9Yw6mY1aGbarwsEon6I =/0VZ -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/SHA1SUMS.key000066400000000000000000000055611476576476200312320ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/directory.yast000066400000000000000000000001261476576476200322120ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir1-file1.txt subdir1-file2.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file1.txt000066400000000000000000000000041476576476200324070ustar00rootroot00000000000000foo libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir1/subdir1-file2.txt000066400000000000000000000000241476576476200324120ustar00rootroot00000000000000bar (broken chksum) libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/000077500000000000000000000000001476576476200273065ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS000066400000000000000000000000741476576476200304360ustar00rootroot00000000000000f572d396fae9206628714fb2ce00f72e94f2258f subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.asc000066400000000000000000000003051476576476200312000ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkjaayAACgkQm+zCtd2wN1Z3GwCfUjf9mRdFrB5UvOHAW/DoEzWL mpEAnRmkzRLTY3hXiZ+95XCYG1csiMmF =X6am -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/SHA1SUMS.key000066400000000000000000000055611476576476200312330ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/directory.yast000066400000000000000000000001041476576476200322070ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir-broken/subdir2/subdir2-file1.txt000066400000000000000000000000061476576476200324130ustar00rootroot00000000000000hello libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/000077500000000000000000000000001476576476200244565ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/directory.yast000066400000000000000000000000221476576476200273560ustar00rootroot00000000000000subdir1/ subdir2/ libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/000077500000000000000000000000001476576476200260275ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS000066400000000000000000000001701476576476200271540ustar00rootroot00000000000000f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 subdir1-file1.txt e242ed3bffccdf271b7fbaf34ed72d089537b42f subdir1-file2.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.asc000066400000000000000000000003051476576476200277210ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkjaaxUACgkQm+zCtd2wN1ZLgACfcqpLHAavAr8cIjenaR3pJHpo WoMAmwdbZQX2b9Yw6mY1aGbarwsEon6I =/0VZ -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/SHA1SUMS.key000066400000000000000000000055611476576476200277540ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/directory.yast000066400000000000000000000001261476576476200307340ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir1-file1.txt subdir1-file2.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/subdir1-file1.txt000066400000000000000000000000041476576476200311310ustar00rootroot00000000000000foo libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir1/subdir1-file2.txt000066400000000000000000000000041476576476200311320ustar00rootroot00000000000000bar libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/000077500000000000000000000000001476576476200260305ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS000066400000000000000000000000741476576476200271600ustar00rootroot00000000000000f572d396fae9206628714fb2ce00f72e94f2258f subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.asc000066400000000000000000000003051476576476200277220ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkjaayAACgkQm+zCtd2wN1Z3GwCfUjf9mRdFrB5UvOHAW/DoEzWL mpEAnRmkzRLTY3hXiZ+95XCYG1csiMmF =X6am -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/SHA1SUMS.key000066400000000000000000000055611476576476200277550ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/directory.yast000066400000000000000000000001041476576476200307310ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/complexdir/subdir2/subdir2-file1.txt000066400000000000000000000000061476576476200311350ustar00rootroot00000000000000hello libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/000077500000000000000000000000001476576476200275455ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/content000066400000000000000000000003471476576476200311460ustar00rootroot00000000000000HASH SHA1 f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 subdir1/subdir1-file1.txt HASH SHA1 e242ed3bffccdf271b7fbaf34ed72d089537b42f subdir1/subdir1-file2.txt HASH SHA1 f572d396fae9206628714fb2ce00f72e94f2258f subdir2/subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/content.asc000066400000000000000000000003051476576476200317050ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkkHLgwACgkQm+zCtd2wN1ZD7QCghDVP3V6Pi/gBMoA6Flc77/4u f30Anjf9MqPHx/YZXSFHrYtcst0welTn =g7it -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/content.key000066400000000000000000000055611476576476200317400ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/directory.yast000066400000000000000000000000411476576476200324460ustar00rootroot00000000000000directory.yast subdir1/ subdir2/ libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/subdir1/000077500000000000000000000000001476576476200311165ustar00rootroot00000000000000directory.yast000066400000000000000000000001261476576476200337440ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/subdir1directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir1-file1.txt subdir1-file2.txt subdir1-file1.txt000066400000000000000000000000041476576476200341410ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/subdir1foo subdir1-file2.txt000066400000000000000000000000121476576476200341410ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/subdir1bar OWNED libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/subdir2/000077500000000000000000000000001476576476200311175ustar00rootroot00000000000000directory.yast000066400000000000000000000001041476576476200337410ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/subdir2directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir2-file1.txt subdir2-file1.txt000066400000000000000000000000061476576476200341450ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex-broken-digest/subdir2hello libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/000077500000000000000000000000001476576476200250125ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/content000066400000000000000000000003471476576476200264130ustar00rootroot00000000000000HASH SHA1 f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 subdir1/subdir1-file1.txt HASH SHA1 e242ed3bffccdf271b7fbaf34ed72d089537b42f subdir1/subdir1-file2.txt HASH SHA1 f572d396fae9206628714fb2ce00f72e94f2258f subdir2/subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/content.asc000066400000000000000000000003051476576476200271520ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkkHLgwACgkQm+zCtd2wN1ZD7QCghDVP3V6Pi/gBMoA6Flc77/4u f30Anjf9MqPHx/YZXSFHrYtcst0welTn =g7it -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/content.key000066400000000000000000000055611476576476200272050ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/directory.yast000066400000000000000000000000221476576476200277120ustar00rootroot00000000000000subdir1/ subdir2/ libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/subdir1/000077500000000000000000000000001476576476200263635ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/subdir1/directory.yast000066400000000000000000000001261476576476200312700ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir1-file1.txt subdir1-file2.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/subdir1/subdir1-file1.txt000066400000000000000000000000041476576476200314650ustar00rootroot00000000000000foo libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/subdir1/subdir1-file2.txt000066400000000000000000000000041476576476200314660ustar00rootroot00000000000000bar libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/subdir2/000077500000000000000000000000001476576476200263645ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/subdir2/directory.yast000066400000000000000000000001041476576476200312650ustar00rootroot00000000000000directory.yast SHA1SUMS SHA1SUMS.asc SHA1SUMS.key subdir2-file1.txt libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/contentindex/subdir2/subdir2-file1.txt000066400000000000000000000000061476576476200314710ustar00rootroot00000000000000hello libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/000077500000000000000000000000001476576476200234035ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/file-1-2.diff000066400000000000000000000025771476576476200254640ustar00rootroot0000000000000020a21,26 > [edit] Distribution > > In the past SUSE first released the Personal and Professional versions in boxed sets which included extensive printed documentation, then waited a few months before it released versions on its FTP servers. Under Novell and with advent of openSUSE this has been reversed: SUSE Linux 10.0 was available for download well before the retail release of SUSE Linux 10.0. In addition, Novell has discontinued the Personal version, renamed the Professional version to simply "SUSE Linux", and repriced "SUSE Linux" to about the same as the obsolete Personal version. Now Novell has also renamed SUSE Linux to openSUSE with version 10.2 of the distro. > > Starting with version 9.2, an unsupported 1 DVD ISO image of SUSE Professional was made available for download as well as a bootable LiveDVD evaluation. The FTP server continues to operate and has the advantage of "streamlined" installs: Only downloading packages the user feels they need. The ISO has the advantages of an easy install package, the ability to operate even if the user's network card does not work 'out of the box', and less experience needed (i.e., an inexperienced Linux user may not know whether or not to install a certain package, and the ISO offers several preselected sets of packages). The retail box DVD supports x86, and x86_64 installs, but the included CD-ROMs do not include x86_64 support. > libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/file-1-2.diff.gz000066400000000000000000000013111476576476200260640ustar00rootroot00000000000000\Ffile-1-2.diffuTMo1+Fj#TA\H ]vzfϳ#i R۱=cduΫG%Jߴ!z]vQ;*-Fh!~jQN|p Ut]-!\_q?H 7jPLP}0^ۈrU׊,u:b*v^H!E=Зw\нUۉ:6j,r5ج26:P ^sQW7v{8/A*X.ȀzocN#䒗{фYfAd#DBPA0n>w|TD[tPtt5Zq_QzbН@%}28#%SlE<%|X%kJatŐMd^Pl[S@.hsMכ[-?~J[J7<% H 2ˎMY0=f9QgJ<$8:9d0|%`8 qG!!h Uˡ5>\'r܏ۯYَ1/X+libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/file-2-3.diff000066400000000000000000000014301476576476200254510ustar00rootroot0000000000000014a15,49 > [edit] Versions > Major Versions > 1.0 - April 1994 > 1.0.9 - July 1994 > 11/94 - November 1994 > 4/95 - April 1995 > 8/95 - August 1995 > 11/95 - November 1995 > 4.2 - May 1996 > 4.3 - September 1996 > 4.4 - May 1997 > 4.4.1 - February 1997 > 5.0 - June 1997 > 5.1 - November 1997 > 5.2 - 23 March 1998 > 6.0 - 21 December 1998 > 6.1 - 7 April 1999 > 6.2 - 12 August 1999 > 6.3 - 25 November 1999 > 6.4 - 27 March 2000 > 7.0 - 27 September 2000 > 7.1 - 24 January 2001 > 7.2 - 15 June 2001 > 7.3 - 13 October 2001 > 8.0 - 22 April 2002 > 8.1 - 30 September 2002 > 8.2 - 7 April 2003 > 9.0 - 15 October 2003 > 9.1 - 23 April 2004 > 9.2 - 25 October 2004 > 9.3 - 16 April 2005 > 10.0 - 6 October 2005 > 10.1 - 11 May 2006 > 10.2 - 7 December 2006 > libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/file-2-3.diff.gz000066400000000000000000000005261476576476200260750ustar00rootroot00000000000000Ffile-2-3.diff]N0EW+-ЍqA20qc\0L&L{J)==\ [wݜ都;vC?:rh8c۝h-ez>E{-=|~%{6j(тhxd[!Elibzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/file-3-4.diff000066400000000000000000000023611476576476200254570ustar00rootroot0000000000000014a15,18 > SUSE has support for resizing NTFS partitions during installation which allows it to co-exist with existing Windows 2000 or XP installations. SUSE has the ability to detect and install drivers for many common winmodems shipped with OEM desktop and laptop systems (such modems are designed to use Windows-specific software to operate). > > Several desktop environments such as KDE and GNOME and window managers like Window Maker and Blackbox are included, with the YaST2 installer allowing the user to choose a preselection of GNOME, KDE, or no desktop at all. SUSE ships with multimedia software such as K3B (CD/DVD burning), Amarok (audio playback), and Kaffeine (movie playback). It contains OpenOffice.org, and software for reading and/or creating other common document formats such as PDF. Due to patent problems, the distribution lacks codecs for proprietary formats like avi, but these can be installed with packages available on the internet. MP3s are handled in the fully capable graphical media studio Amarok with the Helix engine (part of RealNetworks' RealPlayer), when RealPlayer is installed. This is due to an agreement between Novell and RealNetworks to ship RealPlayer with SUSE as a solution to MP3 patent problems.[citation needed] > libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/file-3-4.diff.gz000066400000000000000000000013071476576476200260750ustar00rootroot00000000000000ÜFfile-3-4.diff]TY0~W]d/xBb.UaLQ۲v˯go=wL_`uy-F.$h\@]a CFlcBcP/arՂ6'H*9&rj!jw\]]R,NӤK6vZDU! 1ۡIӮqvN=T|.cgŤ }"X^Yɖ}쯢 &m5R. !T9% ͱ g;IyV" On November 4, 2003, Novell announced it would acquire SuSE.[2] The acquisition was finalized in January 2004.[3] J. Philips (Novell's corporate technology strategist for the Asia Pacific region) stated that Novell would not "in the medium term" alter the way in which SUSE continues to be developed.[4] At Novell's annual BrainShare gathering in 2004, all computers ran SUSE Linux for the first time. At this gathering it was also announced that the proprietary SUSE administration program YaST2 would be released into the public under the GPL license. > > On August 4, 2005, Novell spokesman and director of public relations Bruce Lowry announced that the development of the SUSE Professional series will become more open and within the community project openSUSE try to reach a wider audience of users and developers. The software, by definition of open source, already had their coding "open," but now the development process will be more "open" than before, allowing developers and users to test the product and help develop it. Previously all development work was done in-house by SUSE, and version 10.0 was the first version that had public beta testing. As part of the change, YaST Online Update server access will be complimentary for SUSE Linux users, and along the lines of most open source distributions, there will both be a free download available on the web and a boxed edition. This change in philosophy led to the release of the SUSE Linux 10.0 release on October 6, 2005 in "OSS" (completely open source), "eval" (has both open source and proprietary applications and is actually a fully featured version) and retail boxed-set editions. > libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/diffs/file-4-current.diff.gz000066400000000000000000000016031476576476200274140ustar00rootroot00000000000000ٜFfile-4-current.diffmTKo8W |i[,P,PMEHYPoHu= 3kh7>҃/~/S+nl5叵:$Z|=qo6AhO7u3d# Ʊ5?2v]?{kz5s7uHtٙhFEȝLGg]e=9W'Zޜ7yB0-Eim P\2.K,N#dg`#Cg0n=qQ-9cbNLjgZ $kF/{"+/<)t$U~2O7o V8@4ʭGqz'eԸ]ٿH]O=B%é-<N/?|O^_cĈ=BXna`TEX锝I*Ug°qIsNQm+9q]RP{!B_7 sDFVbjJ˚9!oʯ\ZX2E;XWjsT z:O71le9C %Ň;A`ގ%*6Ôf)?}:*Hm~w`Eosoxէ}tˬQ ZV@zh#gy5cbh_44! %޳ZnÕ7vWvLx }x kPw񸝿,@eR=;z.\=l+zS$0UC+ٳE KIvC.ӠА;䜂Rmt ?![薄libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/directory.yast000066400000000000000000000002151476576476200252140ustar00rootroot00000000000000complexdir/ complexdir-broken/ diffs/ file-1.txt file-2.txt file-3.txt file-4.txt file-current.txt file-current.txt.asc file-current.txt.key libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/file-1.txt000066400000000000000000000120241476576476200241250ustar00rootroot00000000000000History The SUSE Linux distribution was originally a German translation of Slackware Linux. In mid-1992, Softlanding Linux System (SLS) was founded by Peter MacDonald, and was the first comprehensive distribution to contain elements such as X and TCP/IP. The Slackware distribution (maintained by Patrick Volkerding) was initially based largely on SLS. S.u.S.E was founded in late 1992 as a UNIX consulting group, which among other things regularly released software packages that included SLS and Slackware, and printed UNIX/Linux manuals. S.u.S.E is an acronym for the German phrase "Software- und System-Entwicklung" ("Software and system development"). There is a rumour that the name is a tribute to the German computer pioneer Konrad Zuse. They released the first CD version of SLS/Slackware in 1994, under the name S.u.S.E Linux 1.0. It later integrated with the Jurix distribution by Florian La Roche, to release the first really unique S.u.S.E Linux 4.2 in 1996. Over time, SuSE Linux incorporated many aspects of Red Hat Linux (e.g., using RPMs and /etc/sysconfig). In a move to more effectively reach its business audience, SuSE introduced the SuSE Linux Enterpriser Server in 2001, and consecutively changed the company name to SUSE Linux in September 2003 as a part of its overall new branding strategy, as announced by SUSE's marketing VP Uwe Schmid.[1] The current mascot of SuSE is Geeko, also known as the "SuSE Lizard" [edit] Features SUSE includes an installation and administration program called YaST2 which handles hard disk partitioning, system setup, RPM package management, online updates, network and firewall configuration, user administration and more in an integrated interface. Starting with the 10.1 release, SuSE includes a secondary installation program known as Zen-Updater, which can be used as a secondary means of installing software and replaces Suse-updater providing notification of software updates on the desktop. The latest release, openSUSE 10.2 is available as a retail package and as a no-cost open source package. In terms of software, there are major differences between the two packages (see Reference below), including the fact that the retail edition contains a number of proprietary components, such as Macromedia Flash. In addition, the retail package, available for 59.95 USD, includes a printed manual and limited technical support. openSUSE is available to download freely from their website. The retail and eval versions contain one DVD and six CDs, while openSUSE uses five CDs. It is the first SUSE release to be called openSUSE, previous versions were called SUSE Linux. Other flavors include dedicated server editions and groupware servers geared towards corporate networks and enterprises, along with a stripped-down business desktop which runs some software designed for Microsoft Windows out of the box by virtue of WINE. SUSE Linux Enterprise Server (SLES) and SUSE Linux Enterprise Desktop (SLED) are Novell's branded version of SUSE targeted at corporate environments. SUSE Linux Enterprise product line (SLES and SLED) include some proprietary software as well as technical support. For instance, SuSE Linux Enterprise Server 9 (SLES 9) has fewer packages (around 1,000 packages) than the SuSE Linux Professional (consumer) distribution which has around 3,500 packages. Most of the packages that have been removed are desktop applications which are more suited to consumers than to a business environment. SLES has a guaranteed life cycle of 5 years and only the SLES products are certified by independent hardware and software vendors. [edit] See also Portal:Free software Free software Portal * Novell * OpenSUSE * Linux on zSeries * List of Linux distributions * Comparison of Linux distributions * Commercial and community Linux distributions by the same vendor * Sax2 [edit] References 1. ^ Proffitt, B. (2003). SuSE Rebrands Ahead of 9.0 Launch. 2. ^ Shankland, S. (2003). Novell to acquire SuSE Linux. Retrieved December 20, 2003. 3. ^ Kennedy, D. (2003). Novell's Linux buy opens road to top. Retrieved December 20, 2003. 4. ^ Ramesh, R. (2004). Novell: SuSE stays the same, for now. Retrieved January 14, 2004. * SuSE Roadmap * Differences between boxed and retail version [edit] External links * openSUSE * Novell SUSE Linux Enterprise 10 * suse at DistroWatch * Hacking SUSE Linux * Fultus Technical Documentation eLibrary - SUSE * 10.1 Review (tuxmachines.org) * The Unofficial SUSE FAQ * SUSE Linux Support Forums * SUSE Linux Community Forums * SuseBR Brazilian SUSE Linux Community Forums - * SUSE Wiki * SUSEroot * The Linux Master Forums * 10.0 Review * SUSE Support Knowledgebase * Links about SUSE Linux * SuSE Linux OS Turkiye * Planet SuSE - Blogs of SUSE employees and SUSE community members * Linux Desktop Multiplier - Turn one SLED or openSUSE computer into 10 independent, full-client desktops * Hong Kong & Macau Novell User Group - An unofficial web site provides news, articles and technical tips. libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/file-2.txt000066400000000000000000000145761476576476200241440ustar00rootroot00000000000000History The SUSE Linux distribution was originally a German translation of Slackware Linux. In mid-1992, Softlanding Linux System (SLS) was founded by Peter MacDonald, and was the first comprehensive distribution to contain elements such as X and TCP/IP. The Slackware distribution (maintained by Patrick Volkerding) was initially based largely on SLS. S.u.S.E was founded in late 1992 as a UNIX consulting group, which among other things regularly released software packages that included SLS and Slackware, and printed UNIX/Linux manuals. S.u.S.E is an acronym for the German phrase "Software- und System-Entwicklung" ("Software and system development"). There is a rumour that the name is a tribute to the German computer pioneer Konrad Zuse. They released the first CD version of SLS/Slackware in 1994, under the name S.u.S.E Linux 1.0. It later integrated with the Jurix distribution by Florian La Roche, to release the first really unique S.u.S.E Linux 4.2 in 1996. Over time, SuSE Linux incorporated many aspects of Red Hat Linux (e.g., using RPMs and /etc/sysconfig). In a move to more effectively reach its business audience, SuSE introduced the SuSE Linux Enterpriser Server in 2001, and consecutively changed the company name to SUSE Linux in September 2003 as a part of its overall new branding strategy, as announced by SUSE's marketing VP Uwe Schmid.[1] The current mascot of SuSE is Geeko, also known as the "SuSE Lizard" [edit] Features SUSE includes an installation and administration program called YaST2 which handles hard disk partitioning, system setup, RPM package management, online updates, network and firewall configuration, user administration and more in an integrated interface. Starting with the 10.1 release, SuSE includes a secondary installation program known as Zen-Updater, which can be used as a secondary means of installing software and replaces Suse-updater providing notification of software updates on the desktop. The latest release, openSUSE 10.2 is available as a retail package and as a no-cost open source package. In terms of software, there are major differences between the two packages (see Reference below), including the fact that the retail edition contains a number of proprietary components, such as Macromedia Flash. In addition, the retail package, available for 59.95 USD, includes a printed manual and limited technical support. openSUSE is available to download freely from their website. The retail and eval versions contain one DVD and six CDs, while openSUSE uses five CDs. It is the first SUSE release to be called openSUSE, previous versions were called SUSE Linux. Other flavors include dedicated server editions and groupware servers geared towards corporate networks and enterprises, along with a stripped-down business desktop which runs some software designed for Microsoft Windows out of the box by virtue of WINE. SUSE Linux Enterprise Server (SLES) and SUSE Linux Enterprise Desktop (SLED) are Novell's branded version of SUSE targeted at corporate environments. SUSE Linux Enterprise product line (SLES and SLED) include some proprietary software as well as technical support. For instance, SuSE Linux Enterprise Server 9 (SLES 9) has fewer packages (around 1,000 packages) than the SuSE Linux Professional (consumer) distribution which has around 3,500 packages. Most of the packages that have been removed are desktop applications which are more suited to consumers than to a business environment. SLES has a guaranteed life cycle of 5 years and only the SLES products are certified by independent hardware and software vendors. [edit] Distribution In the past SUSE first released the Personal and Professional versions in boxed sets which included extensive printed documentation, then waited a few months before it released versions on its FTP servers. Under Novell and with advent of openSUSE this has been reversed: SUSE Linux 10.0 was available for download well before the retail release of SUSE Linux 10.0. In addition, Novell has discontinued the Personal version, renamed the Professional version to simply "SUSE Linux", and repriced "SUSE Linux" to about the same as the obsolete Personal version. Now Novell has also renamed SUSE Linux to openSUSE with version 10.2 of the distro. Starting with version 9.2, an unsupported 1 DVD ISO image of SUSE Professional was made available for download as well as a bootable LiveDVD evaluation. The FTP server continues to operate and has the advantage of "streamlined" installs: Only downloading packages the user feels they need. The ISO has the advantages of an easy install package, the ability to operate even if the user's network card does not work 'out of the box', and less experience needed (i.e., an inexperienced Linux user may not know whether or not to install a certain package, and the ISO offers several preselected sets of packages). The retail box DVD supports x86, and x86_64 installs, but the included CD-ROMs do not include x86_64 support. [edit] See also Portal:Free software Free software Portal * Novell * OpenSUSE * Linux on zSeries * List of Linux distributions * Comparison of Linux distributions * Commercial and community Linux distributions by the same vendor * Sax2 [edit] References 1. ^ Proffitt, B. (2003). SuSE Rebrands Ahead of 9.0 Launch. 2. ^ Shankland, S. (2003). Novell to acquire SuSE Linux. Retrieved December 20, 2003. 3. ^ Kennedy, D. (2003). Novell's Linux buy opens road to top. Retrieved December 20, 2003. 4. ^ Ramesh, R. (2004). Novell: SuSE stays the same, for now. Retrieved January 14, 2004. * SuSE Roadmap * Differences between boxed and retail version [edit] External links * openSUSE * Novell SUSE Linux Enterprise 10 * suse at DistroWatch * Hacking SUSE Linux * Fultus Technical Documentation eLibrary - SUSE * 10.1 Review (tuxmachines.org) * The Unofficial SUSE FAQ * SUSE Linux Support Forums * SUSE Linux Community Forums * SuseBR Brazilian SUSE Linux Community Forums - * SUSE Wiki * SUSEroot * The Linux Master Forums * 10.0 Review * SUSE Support Knowledgebase * Links about SUSE Linux * SuSE Linux OS Turkiye * Planet SuSE - Blogs of SUSE employees and SUSE community members * Linux Desktop Multiplier - Turn one SLED or openSUSE computer into 10 independent, full-client desktops * Hong Kong & Macau Novell User Group - An unofficial web site provides news, articles and technical tips. libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/file-3.txt000066400000000000000000000161071476576476200241350ustar00rootroot00000000000000History The SUSE Linux distribution was originally a German translation of Slackware Linux. In mid-1992, Softlanding Linux System (SLS) was founded by Peter MacDonald, and was the first comprehensive distribution to contain elements such as X and TCP/IP. The Slackware distribution (maintained by Patrick Volkerding) was initially based largely on SLS. S.u.S.E was founded in late 1992 as a UNIX consulting group, which among other things regularly released software packages that included SLS and Slackware, and printed UNIX/Linux manuals. S.u.S.E is an acronym for the German phrase "Software- und System-Entwicklung" ("Software and system development"). There is a rumour that the name is a tribute to the German computer pioneer Konrad Zuse. They released the first CD version of SLS/Slackware in 1994, under the name S.u.S.E Linux 1.0. It later integrated with the Jurix distribution by Florian La Roche, to release the first really unique S.u.S.E Linux 4.2 in 1996. Over time, SuSE Linux incorporated many aspects of Red Hat Linux (e.g., using RPMs and /etc/sysconfig). In a move to more effectively reach its business audience, SuSE introduced the SuSE Linux Enterpriser Server in 2001, and consecutively changed the company name to SUSE Linux in September 2003 as a part of its overall new branding strategy, as announced by SUSE's marketing VP Uwe Schmid.[1] The current mascot of SuSE is Geeko, also known as the "SuSE Lizard" [edit] Features SUSE includes an installation and administration program called YaST2 which handles hard disk partitioning, system setup, RPM package management, online updates, network and firewall configuration, user administration and more in an integrated interface. Starting with the 10.1 release, SuSE includes a secondary installation program known as Zen-Updater, which can be used as a secondary means of installing software and replaces Suse-updater providing notification of software updates on the desktop. [edit] Versions Major Versions 1.0 - April 1994 1.0.9 - July 1994 11/94 - November 1994 4/95 - April 1995 8/95 - August 1995 11/95 - November 1995 4.2 - May 1996 4.3 - September 1996 4.4 - May 1997 4.4.1 - February 1997 5.0 - June 1997 5.1 - November 1997 5.2 - 23 March 1998 6.0 - 21 December 1998 6.1 - 7 April 1999 6.2 - 12 August 1999 6.3 - 25 November 1999 6.4 - 27 March 2000 7.0 - 27 September 2000 7.1 - 24 January 2001 7.2 - 15 June 2001 7.3 - 13 October 2001 8.0 - 22 April 2002 8.1 - 30 September 2002 8.2 - 7 April 2003 9.0 - 15 October 2003 9.1 - 23 April 2004 9.2 - 25 October 2004 9.3 - 16 April 2005 10.0 - 6 October 2005 10.1 - 11 May 2006 10.2 - 7 December 2006 The latest release, openSUSE 10.2 is available as a retail package and as a no-cost open source package. In terms of software, there are major differences between the two packages (see Reference below), including the fact that the retail edition contains a number of proprietary components, such as Macromedia Flash. In addition, the retail package, available for 59.95 USD, includes a printed manual and limited technical support. openSUSE is available to download freely from their website. The retail and eval versions contain one DVD and six CDs, while openSUSE uses five CDs. It is the first SUSE release to be called openSUSE, previous versions were called SUSE Linux. Other flavors include dedicated server editions and groupware servers geared towards corporate networks and enterprises, along with a stripped-down business desktop which runs some software designed for Microsoft Windows out of the box by virtue of WINE. SUSE Linux Enterprise Server (SLES) and SUSE Linux Enterprise Desktop (SLED) are Novell's branded version of SUSE targeted at corporate environments. SUSE Linux Enterprise product line (SLES and SLED) include some proprietary software as well as technical support. For instance, SuSE Linux Enterprise Server 9 (SLES 9) has fewer packages (around 1,000 packages) than the SuSE Linux Professional (consumer) distribution which has around 3,500 packages. Most of the packages that have been removed are desktop applications which are more suited to consumers than to a business environment. SLES has a guaranteed life cycle of 5 years and only the SLES products are certified by independent hardware and software vendors. [edit] Distribution In the past SUSE first released the Personal and Professional versions in boxed sets which included extensive printed documentation, then waited a few months before it released versions on its FTP servers. Under Novell and with advent of openSUSE this has been reversed: SUSE Linux 10.0 was available for download well before the retail release of SUSE Linux 10.0. In addition, Novell has discontinued the Personal version, renamed the Professional version to simply "SUSE Linux", and repriced "SUSE Linux" to about the same as the obsolete Personal version. Now Novell has also renamed SUSE Linux to openSUSE with version 10.2 of the distro. Starting with version 9.2, an unsupported 1 DVD ISO image of SUSE Professional was made available for download as well as a bootable LiveDVD evaluation. The FTP server continues to operate and has the advantage of "streamlined" installs: Only downloading packages the user feels they need. The ISO has the advantages of an easy install package, the ability to operate even if the user's network card does not work 'out of the box', and less experience needed (i.e., an inexperienced Linux user may not know whether or not to install a certain package, and the ISO offers several preselected sets of packages). The retail box DVD supports x86, and x86_64 installs, but the included CD-ROMs do not include x86_64 support. [edit] See also Portal:Free software Free software Portal * Novell * OpenSUSE * Linux on zSeries * List of Linux distributions * Comparison of Linux distributions * Commercial and community Linux distributions by the same vendor * Sax2 [edit] References 1. ^ Proffitt, B. (2003). SuSE Rebrands Ahead of 9.0 Launch. 2. ^ Shankland, S. (2003). Novell to acquire SuSE Linux. Retrieved December 20, 2003. 3. ^ Kennedy, D. (2003). Novell's Linux buy opens road to top. Retrieved December 20, 2003. 4. ^ Ramesh, R. (2004). Novell: SuSE stays the same, for now. Retrieved January 14, 2004. * SuSE Roadmap * Differences between boxed and retail version [edit] External links * openSUSE * Novell SUSE Linux Enterprise 10 * suse at DistroWatch * Hacking SUSE Linux * Fultus Technical Documentation eLibrary - SUSE * 10.1 Review (tuxmachines.org) * The Unofficial SUSE FAQ * SUSE Linux Support Forums * SUSE Linux Community Forums * SuseBR Brazilian SUSE Linux Community Forums - * SUSE Wiki * SUSEroot * The Linux Master Forums * 10.0 Review * SUSE Support Knowledgebase * Links about SUSE Linux * SuSE Linux OS Turkiye * Planet SuSE - Blogs of SUSE employees and SUSE community members * Linux Desktop Multiplier - Turn one SLED or openSUSE computer into 10 independent, full-client desktops * Hong Kong & Macau Novell User Group - An unofficial web site provides news, articles and technical tips. libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/file-4.txt000066400000000000000000000204471476576476200241400ustar00rootroot00000000000000History The SUSE Linux distribution was originally a German translation of Slackware Linux. In mid-1992, Softlanding Linux System (SLS) was founded by Peter MacDonald, and was the first comprehensive distribution to contain elements such as X and TCP/IP. The Slackware distribution (maintained by Patrick Volkerding) was initially based largely on SLS. S.u.S.E was founded in late 1992 as a UNIX consulting group, which among other things regularly released software packages that included SLS and Slackware, and printed UNIX/Linux manuals. S.u.S.E is an acronym for the German phrase "Software- und System-Entwicklung" ("Software and system development"). There is a rumour that the name is a tribute to the German computer pioneer Konrad Zuse. They released the first CD version of SLS/Slackware in 1994, under the name S.u.S.E Linux 1.0. It later integrated with the Jurix distribution by Florian La Roche, to release the first really unique S.u.S.E Linux 4.2 in 1996. Over time, SuSE Linux incorporated many aspects of Red Hat Linux (e.g., using RPMs and /etc/sysconfig). In a move to more effectively reach its business audience, SuSE introduced the SuSE Linux Enterpriser Server in 2001, and consecutively changed the company name to SUSE Linux in September 2003 as a part of its overall new branding strategy, as announced by SUSE's marketing VP Uwe Schmid.[1] The current mascot of SuSE is Geeko, also known as the "SuSE Lizard" [edit] Features SUSE includes an installation and administration program called YaST2 which handles hard disk partitioning, system setup, RPM package management, online updates, network and firewall configuration, user administration and more in an integrated interface. Starting with the 10.1 release, SuSE includes a secondary installation program known as Zen-Updater, which can be used as a secondary means of installing software and replaces Suse-updater providing notification of software updates on the desktop. SUSE has support for resizing NTFS partitions during installation which allows it to co-exist with existing Windows 2000 or XP installations. SUSE has the ability to detect and install drivers for many common winmodems shipped with OEM desktop and laptop systems (such modems are designed to use Windows-specific software to operate). Several desktop environments such as KDE and GNOME and window managers like Window Maker and Blackbox are included, with the YaST2 installer allowing the user to choose a preselection of GNOME, KDE, or no desktop at all. SUSE ships with multimedia software such as K3B (CD/DVD burning), Amarok (audio playback), and Kaffeine (movie playback). It contains OpenOffice.org, and software for reading and/or creating other common document formats such as PDF. Due to patent problems, the distribution lacks codecs for proprietary formats like avi, but these can be installed with packages available on the internet. MP3s are handled in the fully capable graphical media studio Amarok with the Helix engine (part of RealNetworks' RealPlayer), when RealPlayer is installed. This is due to an agreement between Novell and RealNetworks to ship RealPlayer with SUSE as a solution to MP3 patent problems.[citation needed] [edit] Versions Major Versions 1.0 - April 1994 1.0.9 - July 1994 11/94 - November 1994 4/95 - April 1995 8/95 - August 1995 11/95 - November 1995 4.2 - May 1996 4.3 - September 1996 4.4 - May 1997 4.4.1 - February 1997 5.0 - June 1997 5.1 - November 1997 5.2 - 23 March 1998 6.0 - 21 December 1998 6.1 - 7 April 1999 6.2 - 12 August 1999 6.3 - 25 November 1999 6.4 - 27 March 2000 7.0 - 27 September 2000 7.1 - 24 January 2001 7.2 - 15 June 2001 7.3 - 13 October 2001 8.0 - 22 April 2002 8.1 - 30 September 2002 8.2 - 7 April 2003 9.0 - 15 October 2003 9.1 - 23 April 2004 9.2 - 25 October 2004 9.3 - 16 April 2005 10.0 - 6 October 2005 10.1 - 11 May 2006 10.2 - 7 December 2006 The latest release, openSUSE 10.2 is available as a retail package and as a no-cost open source package. In terms of software, there are major differences between the two packages (see Reference below), including the fact that the retail edition contains a number of proprietary components, such as Macromedia Flash. In addition, the retail package, available for 59.95 USD, includes a printed manual and limited technical support. openSUSE is available to download freely from their website. The retail and eval versions contain one DVD and six CDs, while openSUSE uses five CDs. It is the first SUSE release to be called openSUSE, previous versions were called SUSE Linux. Other flavors include dedicated server editions and groupware servers geared towards corporate networks and enterprises, along with a stripped-down business desktop which runs some software designed for Microsoft Windows out of the box by virtue of WINE. SUSE Linux Enterprise Server (SLES) and SUSE Linux Enterprise Desktop (SLED) are Novell's branded version of SUSE targeted at corporate environments. SUSE Linux Enterprise product line (SLES and SLED) include some proprietary software as well as technical support. For instance, SuSE Linux Enterprise Server 9 (SLES 9) has fewer packages (around 1,000 packages) than the SuSE Linux Professional (consumer) distribution which has around 3,500 packages. Most of the packages that have been removed are desktop applications which are more suited to consumers than to a business environment. SLES has a guaranteed life cycle of 5 years and only the SLES products are certified by independent hardware and software vendors. [edit] Distribution In the past SUSE first released the Personal and Professional versions in boxed sets which included extensive printed documentation, then waited a few months before it released versions on its FTP servers. Under Novell and with advent of openSUSE this has been reversed: SUSE Linux 10.0 was available for download well before the retail release of SUSE Linux 10.0. In addition, Novell has discontinued the Personal version, renamed the Professional version to simply "SUSE Linux", and repriced "SUSE Linux" to about the same as the obsolete Personal version. Now Novell has also renamed SUSE Linux to openSUSE with version 10.2 of the distro. Starting with version 9.2, an unsupported 1 DVD ISO image of SUSE Professional was made available for download as well as a bootable LiveDVD evaluation. The FTP server continues to operate and has the advantage of "streamlined" installs: Only downloading packages the user feels they need. The ISO has the advantages of an easy install package, the ability to operate even if the user's network card does not work 'out of the box', and less experience needed (i.e., an inexperienced Linux user may not know whether or not to install a certain package, and the ISO offers several preselected sets of packages). The retail box DVD supports x86, and x86_64 installs, but the included CD-ROMs do not include x86_64 support. [edit] See also Portal:Free software Free software Portal * Novell * OpenSUSE * Linux on zSeries * List of Linux distributions * Comparison of Linux distributions * Commercial and community Linux distributions by the same vendor * Sax2 [edit] References 1. ^ Proffitt, B. (2003). SuSE Rebrands Ahead of 9.0 Launch. 2. ^ Shankland, S. (2003). Novell to acquire SuSE Linux. Retrieved December 20, 2003. 3. ^ Kennedy, D. (2003). Novell's Linux buy opens road to top. Retrieved December 20, 2003. 4. ^ Ramesh, R. (2004). Novell: SuSE stays the same, for now. Retrieved January 14, 2004. * SuSE Roadmap * Differences between boxed and retail version [edit] External links * openSUSE * Novell SUSE Linux Enterprise 10 * suse at DistroWatch * Hacking SUSE Linux * Fultus Technical Documentation eLibrary - SUSE * 10.1 Review (tuxmachines.org) * The Unofficial SUSE FAQ * SUSE Linux Support Forums * SUSE Linux Community Forums * SuseBR Brazilian SUSE Linux Community Forums - * SUSE Wiki * SUSEroot * The Linux Master Forums * 10.0 Review * SUSE Support Knowledgebase * Links about SUSE Linux * SuSE Linux OS Turkiye * Planet SuSE - Blogs of SUSE employees and SUSE community members * Linux Desktop Multiplier - Turn one SLED or openSUSE computer into 10 independent, full-client desktops * Hong Kong & Macau Novell User Group - An unofficial web site provides news, articles and technical tips. libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/file-current.txt000066400000000000000000000236341476576476200254600ustar00rootroot00000000000000History The SUSE Linux distribution was originally a German translation of Slackware Linux. In mid-1992, Softlanding Linux System (SLS) was founded by Peter MacDonald, and was the first comprehensive distribution to contain elements such as X and TCP/IP. The Slackware distribution (maintained by Patrick Volkerding) was initially based largely on SLS. S.u.S.E was founded in late 1992 as a UNIX consulting group, which among other things regularly released software packages that included SLS and Slackware, and printed UNIX/Linux manuals. S.u.S.E is an acronym for the German phrase "Software- und System-Entwicklung" ("Software and system development"). There is a rumour that the name is a tribute to the German computer pioneer Konrad Zuse. They released the first CD version of SLS/Slackware in 1994, under the name S.u.S.E Linux 1.0. It later integrated with the Jurix distribution by Florian La Roche, to release the first really unique S.u.S.E Linux 4.2 in 1996. Over time, SuSE Linux incorporated many aspects of Red Hat Linux (e.g., using RPMs and /etc/sysconfig). In a move to more effectively reach its business audience, SuSE introduced the SuSE Linux Enterpriser Server in 2001, and consecutively changed the company name to SUSE Linux in September 2003 as a part of its overall new branding strategy, as announced by SUSE's marketing VP Uwe Schmid.[1] On November 4, 2003, Novell announced it would acquire SuSE.[2] The acquisition was finalized in January 2004.[3] J. Philips (Novell's corporate technology strategist for the Asia Pacific region) stated that Novell would not "in the medium term" alter the way in which SUSE continues to be developed.[4] At Novell's annual BrainShare gathering in 2004, all computers ran SUSE Linux for the first time. At this gathering it was also announced that the proprietary SUSE administration program YaST2 would be released into the public under the GPL license. On August 4, 2005, Novell spokesman and director of public relations Bruce Lowry announced that the development of the SUSE Professional series will become more open and within the community project openSUSE try to reach a wider audience of users and developers. The software, by definition of open source, already had their coding "open," but now the development process will be more "open" than before, allowing developers and users to test the product and help develop it. Previously all development work was done in-house by SUSE, and version 10.0 was the first version that had public beta testing. As part of the change, YaST Online Update server access will be complimentary for SUSE Linux users, and along the lines of most open source distributions, there will both be a free download available on the web and a boxed edition. This change in philosophy led to the release of the SUSE Linux 10.0 release on October 6, 2005 in "OSS" (completely open source), "eval" (has both open source and proprietary applications and is actually a fully featured version) and retail boxed-set editions. The current mascot of SuSE is Geeko, also known as the "SuSE Lizard" [edit] Features SUSE includes an installation and administration program called YaST2 which handles hard disk partitioning, system setup, RPM package management, online updates, network and firewall configuration, user administration and more in an integrated interface. Starting with the 10.1 release, SuSE includes a secondary installation program known as Zen-Updater, which can be used as a secondary means of installing software and replaces Suse-updater providing notification of software updates on the desktop. SUSE has support for resizing NTFS partitions during installation which allows it to co-exist with existing Windows 2000 or XP installations. SUSE has the ability to detect and install drivers for many common winmodems shipped with OEM desktop and laptop systems (such modems are designed to use Windows-specific software to operate). Several desktop environments such as KDE and GNOME and window managers like Window Maker and Blackbox are included, with the YaST2 installer allowing the user to choose a preselection of GNOME, KDE, or no desktop at all. SUSE ships with multimedia software such as K3B (CD/DVD burning), Amarok (audio playback), and Kaffeine (movie playback). It contains OpenOffice.org, and software for reading and/or creating other common document formats such as PDF. Due to patent problems, the distribution lacks codecs for proprietary formats like avi, but these can be installed with packages available on the internet. MP3s are handled in the fully capable graphical media studio Amarok with the Helix engine (part of RealNetworks' RealPlayer), when RealPlayer is installed. This is due to an agreement between Novell and RealNetworks to ship RealPlayer with SUSE as a solution to MP3 patent problems.[citation needed] [edit] Versions Major Versions 1.0 - April 1994 1.0.9 - July 1994 11/94 - November 1994 4/95 - April 1995 8/95 - August 1995 11/95 - November 1995 4.2 - May 1996 4.3 - September 1996 4.4 - May 1997 4.4.1 - February 1997 5.0 - June 1997 5.1 - November 1997 5.2 - 23 March 1998 6.0 - 21 December 1998 6.1 - 7 April 1999 6.2 - 12 August 1999 6.3 - 25 November 1999 6.4 - 27 March 2000 7.0 - 27 September 2000 7.1 - 24 January 2001 7.2 - 15 June 2001 7.3 - 13 October 2001 8.0 - 22 April 2002 8.1 - 30 September 2002 8.2 - 7 April 2003 9.0 - 15 October 2003 9.1 - 23 April 2004 9.2 - 25 October 2004 9.3 - 16 April 2005 10.0 - 6 October 2005 10.1 - 11 May 2006 10.2 - 7 December 2006 The latest release, openSUSE 10.2 is available as a retail package and as a no-cost open source package. In terms of software, there are major differences between the two packages (see Reference below), including the fact that the retail edition contains a number of proprietary components, such as Macromedia Flash. In addition, the retail package, available for 59.95 USD, includes a printed manual and limited technical support. openSUSE is available to download freely from their website. The retail and eval versions contain one DVD and six CDs, while openSUSE uses five CDs. It is the first SUSE release to be called openSUSE, previous versions were called SUSE Linux. Other flavors include dedicated server editions and groupware servers geared towards corporate networks and enterprises, along with a stripped-down business desktop which runs some software designed for Microsoft Windows out of the box by virtue of WINE. SUSE Linux Enterprise Server (SLES) and SUSE Linux Enterprise Desktop (SLED) are Novell's branded version of SUSE targeted at corporate environments. SUSE Linux Enterprise product line (SLES and SLED) include some proprietary software as well as technical support. For instance, SuSE Linux Enterprise Server 9 (SLES 9) has fewer packages (around 1,000 packages) than the SuSE Linux Professional (consumer) distribution which has around 3,500 packages. Most of the packages that have been removed are desktop applications which are more suited to consumers than to a business environment. SLES has a guaranteed life cycle of 5 years and only the SLES products are certified by independent hardware and software vendors. [edit] Distribution In the past SUSE first released the Personal and Professional versions in boxed sets which included extensive printed documentation, then waited a few months before it released versions on its FTP servers. Under Novell and with advent of openSUSE this has been reversed: SUSE Linux 10.0 was available for download well before the retail release of SUSE Linux 10.0. In addition, Novell has discontinued the Personal version, renamed the Professional version to simply "SUSE Linux", and repriced "SUSE Linux" to about the same as the obsolete Personal version. Now Novell has also renamed SUSE Linux to openSUSE with version 10.2 of the distro. Starting with version 9.2, an unsupported 1 DVD ISO image of SUSE Professional was made available for download as well as a bootable LiveDVD evaluation. The FTP server continues to operate and has the advantage of "streamlined" installs: Only downloading packages the user feels they need. The ISO has the advantages of an easy install package, the ability to operate even if the user's network card does not work 'out of the box', and less experience needed (i.e., an inexperienced Linux user may not know whether or not to install a certain package, and the ISO offers several preselected sets of packages). The retail box DVD supports x86, and x86_64 installs, but the included CD-ROMs do not include x86_64 support. [edit] See also Portal:Free software Free software Portal * Novell * OpenSUSE * Linux on zSeries * List of Linux distributions * Comparison of Linux distributions * Commercial and community Linux distributions by the same vendor * Sax2 [edit] References 1. ^ Proffitt, B. (2003). SuSE Rebrands Ahead of 9.0 Launch. 2. ^ Shankland, S. (2003). Novell to acquire SuSE Linux. Retrieved December 20, 2003. 3. ^ Kennedy, D. (2003). Novell's Linux buy opens road to top. Retrieved December 20, 2003. 4. ^ Ramesh, R. (2004). Novell: SuSE stays the same, for now. Retrieved January 14, 2004. * SuSE Roadmap * Differences between boxed and retail version [edit] External links * openSUSE * Novell SUSE Linux Enterprise 10 * suse at DistroWatch * Hacking SUSE Linux * Fultus Technical Documentation eLibrary - SUSE * 10.1 Review (tuxmachines.org) * The Unofficial SUSE FAQ * SUSE Linux Support Forums * SUSE Linux Community Forums * SuseBR Brazilian SUSE Linux Community Forums - * SUSE Wiki * SUSEroot * The Linux Master Forums * 10.0 Review * SUSE Support Knowledgebase * Links about SUSE Linux * SuSE Linux OS Turkiye * Planet SuSE - Blogs of SUSE employees and SUSE community members * Linux Desktop Multiplier - Turn one SLED or openSUSE computer into 10 independent, full-client desktops * Hong Kong & Macau Novell User Group - An unofficial web site provides news, articles and technical tips. libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/file-current.txt.asc000066400000000000000000000137641476576476200262300ustar00rootroot00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.5 (GNU/Linux) owGFWbtvJMl5X0vw4wYQYKW2cCgw0JLGTJMzfOzxEmO5Q94+yCXNWd6etFgbNd01 MyX2Y1TVzeFsIMCZAxtw4MiAIQdOFChxIBhOHStQYDixAwX+G5z693316B7unn3B Lae6+ns/ft/Xf/u97z76zvd//fmvfjH72clvfueXj/95+ocznatB2hijyjqp7+uz z3/+2+fa1pVZ93pvFkpMbian4lyXzb3IcG70tKl1VYqVtKIyeq5LmedrIcVXyhSy FLWRpc0l36lmYpLL9HYljXI0EvGiFIXOBsPj41FfTKpZncsy0+Xc85isba0KsT05 n+wwj1nVlJnKxHQtrlStjLiQ6bgC06wv8CbfqSHnTBtbi7QqlkYtVGn1ndoUuK7w tKylLoXKVQF9rbBNuhAg8A2TevPsavfFVSJY7Sj3BpHtAu8TDS+RxKP0Vnxd5bfK kBpOaF3qWrNdptLiai7NXOEXKECxpNebJE0ySU43NIRgsJsSZBoSSoqb1y++IaFt k9dkormpmmVfrBaaxC4qHFXQ3cAAeGyFUfMGrMDIQEXmbGFhVmMJfeRckbFkDV5p 3hBTiMO6R32dVZcGauIxSbDrPAPnNjK3iQiya4hYCpmaqlwX0MKwH3wYLBcG/MXW xPMfiIa4sHcHp2W9gtnyppxvie14hzlbFwCZulN5tSQ3be2wS/CcOArTFFVjnBrE sJSFf+LcpMjTHUkoJBoKnCUcqPDvq6o0MhM/bqxiwh1rtYH0bCzulLEhis8nu21E wFHw0UGfVFKmFSIYxtlrmOwh2mv2qRFkzrmRZNOVrhf80svG6AdZhZg6y5FWkPtc iusqXcAh0MdL2BHQKI6vptQ/bR6yPkhGXsijRFzekYy6AKFJE3MZAVCZZeUkgpmQ wXapUuQE1L3G2XOY113dVsk8gbKWQvD66sKyn3ZVne7CWQjPmZ7vcGJLUVR3bP+i gp3UbAaKSEQOSImY1aA/JULKgkqTaVWmQS5YyFRZk3o3dGRFuCiDiLRQZKLMHZtT jPb2hi5YKUNU2nhO6UKWc0+EfE+6sXsgVqeYgcJELRFqU5ADrX2XcktpajIBSQpd DIwsSrUSU+PLFJwFm83Xfb5flkje1BUDIv7YwpjmVnG6fn0lblbQJF2g4iXvhu97 vctSvAZZZooAIr59PgGblpiuxapq8gzJ9dNGG2eM5N3oPZcmPrQ6VuEZlWD9wVWQ l5SlZk2UD5J3++/Fy0RcLXSul1ZsO0aQMfpe1CpdlFVezddBM4RjTOanVksUuVTP dErVBSx3cI+DhhPQi+6kLatabEEGerNQmW4KkDfFlpB57fNkJdckpatg7A2qyXAI FaZKTFVIfAWDHbwXTwOLx2xsFCBxYlB+JwtKxLmk6kemdvEAi5K/QsajICKPOj4P arkMopxIiAOqp+3SqtmsqHVVxyex3ixNhVhUNVmZacusQL1n65FL8ByJXogfycmb kbcM9Io1BnHu6tOymeYwa1tEvro6FzhB81IJh8rTZt5AUBcohzFQ7LK6VZZqG0V/ hgBJ0a8paj1J8GJZLIyFhBLn1QrCfkKXTpWl1+vQ769MNUOKauqzAmmn4Z6VBuup gnGVS284yUlABc27HU8LlKR6TWb4CeTiW0yzhghcyagQSLxEaocaQNxRj42rLSEG jHXNODSxPqVZpmbcXl1lZiEsGgLVEZmDerYWC8nprw3k4aTdomv9LdSeGlG6+kh3 CJtSSfI6Ov34pS0yFuqyQuwwh7xaEcVWRJbYyU6OVTaGCYpZzU8XKl+GNxBeyEij 7nTVWAJO4NgVZVWZW46/DN0KwTJY4J4K9cUVvNCZhnvJ3gMAFB6xi8kOPiSmCFgW DsIj6G0sdOw1Lpl9DllxWeaoz+JmmVF9sK7eynTDPpRhuSZ5KQsorTpZxrZwgsqc MAqxIJrcW4rK1l2vbfQ/vFZzp3eMAG6ImxQzo3CxWpV5BZXkndS5nOZKVC7qVmrq 2OGVe8Q3ag9Ro+BBZjvtqEQsUQgrWy0Xa5FTGrg8DL21mwC+hZN94+NSXCLPqHIf uYQkkluXkwkwDBsE8JQwXqvbTl9sqTuZ48ICXmJ9uqo7pNWWE7mEVVOfuvSQYE1a Nx5hzxr6d6Zk3RgVo2CHbxpQ0LnTf2BVHWxgEwfjPcRHd0LHZse7pmsBk9Rt1Xfl 7hbJUQofUFu+BX+QJtvq9d4RxffizLG3wLA33LUZSDIU1CVaQ+6xP/vj05UxxSXI 7wsktwK4KMtBBWWdKpq95fhkDRCw/YAKoRgBYICQgGcJu+AfCsU+XMSh23DoIpZK VXM6kSxID7Vy3YEAS+Nk6nO0PhSU7nMJ0KXTK2I3+tPMZEoFelKTiIjvCOgQL8MQ LxHVBPtAeLDOyM8bhgpWibb/sSoHLvtMwPoplyCSNXMwpaVVKMxbjFgcUcYoXUBt 1BLIFRJM8PrA2cYQ1zvNtRFdm9p7nNjiy96MIcmgxG1dLRPveApo2ywBIxxcQEjo D0Tv9ZuzSes91LHGd+iOzn6CoWJqqd/ybDZQ94Q92Jr8J732VpcZXUK+7WHeFN9c bVCicSRIQ0LKKaBOzY0mQzr6+uvfEJnRlDQsL2Nealckji6LKlMFNFro5TJg9MvT i6A1k8nlkv50sQg4xdOjf5EnRZhgXrrCQjXbyz4gYM0IKpoWF6h3wLw7ZE/FQDPy UuWdxlC1OaK+Gp+yEF+9vrw49W2XyPsEgFa5vg08MSTfUljj1gmNLSgLwk0ubuzr tzHrstBbiN4JHY4ecnKQcxZVZakQY7i2iO80BAtL0yfh+uSdsmoNVhMp7x4yq3U8 C5plCR3K1hxRx/0Tsf1svDv+eoxWbSj1UUKfAlFXt2KbsEIlEMzrKVTacR3mlcSQ QUm/jdFDq/Yxz15+4LfiElX3cgYfqKQyc/dqZO/CV3I24MEufqb4zfHn5msfJ1mV Ntyk8UYhO865Gp8lYtywY5fwqoMU6FCF62ibQx55hDB4plIXi90eEEizN+Wd7jNo AQ3Y35eB4CwfpnGy/6gvcrVCEUzExdW+i1FXaHlUYNDALSWVS34NdQgtEuVZeAfV bHLvgBgyz1WOuVWVc7Z7ABLXGEhfu4JrH/OvK/hCmR0qYuh57Ql1naiDb9KaCgXb j2DtHP2eDQ3YslKqbEekbIMP3afY6hJnMR0w50pZ5XH/Ays8dE/yLtW1K0qlUkiN 97HTfe36q+1dyJ/ASfEnBnvx2UA8hctyXgTQSXJMZy8bWNMdDXePD+gojnt8fLB7 fLjx8mHvi3DkwD6f0duHD98+7NFcj8MLyUyO8HuffrdzrD896Nx6Qr/RlnBypqaG h0M+PnRqvGxKFQ6GD1nSIbMc7YOeQbDj8IvekXt1NBRjlcbLdM4UnrTqHeOMCQxH HQXplCUfHW6wo3OWffTEs6Oy33vi2T3ZnNjpAfMbHXTH3iGOHctDp5w/Y4bD/Qji +PgLT3rkRcbhCIdMdn9vkx89GHX1o+m9d+wogFmHMB0Pvd3i3QMcjrzWnbt07GQ7 au8iBPYc4aPuXT5mwsMhOxhnR3Tm5Yru4HMGfrR+4nWRRyVxHuO3dLdqcL54IBng FcM4Oi+rQfoQuvtLvPuhSd928UOA8lR1Cs6gTKNWGxr3bExsqifI5baIbVtA/Wvl L+Ie2hFKiOtcoS8BgdXtFOtF9oi3LfoQumFr0GTcKbEE1jFcobv2YwW/oD2mq3pn ubQLt8/KHMl+l42XtN8xHNXww+MEKXszGfe7mC/sUd3y1KEIXWjen9DmhYuth1FJ 65sNtxCWCaMPDUI0A0BWP+Fi9rGg5wZlLyKxobkjjAg2br5ppqTuyv0PRfzZ2DLG zFXLHE2flkp3ip5yG9XdCZPvxH0k72w8oA8U+gQTeL5tBVhRKPh77YRFaw5usLNc 3lXGBtMBRWQESWmB7QbQMM6w5LwHd8iBn1oxV9Iw8MJp1t1vlaFTsE3iIpHmU55N uVtQpzMM/AZk6XZFGcCMw6umAX9L+48IHSLkoxC40IghehRRa9XEGZsgGIZ4ILu6 4Vnz7YvXpwFMP9xzhjXn9uT8dOIGvE/fG3sB6eJ4h3Mt7st4ZdnOiTzz8SKGPkaQ aWXdMVQXdCbfwi3sNHjKYtmcaMw7uI4N1E23dhqhMKAubj8V/GeVcaigXQl/m1mO PfPjHQb+M7WiiSZWEKAV+tgw7NPMEI533CLnwWp5Y9G1zZ9aCkCWB5+6/IhKCIop 7/cPO5SBrrgwOj9vfmdZyDuqYSh0RtFuPAuDgsPI3Xnfz0TGb59s46pEJYJU1mtQ 0Z4jRGjHbYlgo7CcYo52KGE4+vikZ0i9dZpz2B2KNXLF5QPm5bWzCL3ovetwYqoM jYVus41oVsjtjIATTejtx5rg2js8Rf4mETyNOwbs9V6U3jahfoRvGJ3vLlfQkN1A hDf8EosICphb8FhVB4PFL1nqvvaf/ULRDXBdxhpOC3M2q6SggaHLemH9co/m0ChQ ZAn306eAszdXodYk4oY3th1I6opIdufXqO3Kk5Atb35cBNDrKvvyoxUTr5s3ukks +JwwXsBOE+rsrB4Qe9C4vJQkBGI6LNsfWNxr2wdZ+lLin37CBYy3dbFE2Gy1fLf6 YdFgNK2Xu484XKeVG2GEpe8wflSvpoDmqEMfiZFA6FVXcF5NBdE66rop2pmaXdDZ i45CPnImVx+ta8JVQDKSXqC0u0IEFkNukS8ml0IXhIGCkTcsQj4rZKa+zXGdYkdr yarmK+eITyJO3bmRYUmpOvG1+UHEbwncFjnsOLI7ZLYXbAvaKVlQRc62wlRlv6Qt 7joKQ1p36pKf62eAEvxzzaOPE4S0/ogR4zoYCSEXl1ctDnqwdwkiI9qRO7PIDx0p 7ONS3vJVoEufjPjo8WarfOxCKucSd7+kLxCEBt2IJrZ1opK+W821T7PO/hmuWTNx 2qrR/MkogzcUvG0KSkgudISMWlhXuvgnS1QEWNHz/YImbj9CCSJgGfrLBgKjbk9+ 9kFlxf0XR440/viLo4PoqTjet4Xs2XhwfXlBHwBY2tBX/YuhX8ZKOwFepgzpXeFY 5l+e0a48FObeZxs/hbvT6wn89yc+x/yPS59K/qezJTLkw4S//8Rj1+rc443dvb/x jL65ols7xPF/3kNTS7Wv+O2Xo0+8Qk0o1g/XazyVibwfRVPEscGyhsNE/Dkn7UzX dV+cJGKbZjN4ihHAtWKEZMXThULCQlia5c5lU6aLhN4f0fsT9NzbHPeASVoCvjpR cet8ovWgFpQhuqJu3xnI3NdeJrxPhF+pEjm77ovxQ7LIFGeDaeM+J1hhqKTQ94pq +f+TPyDy1zCVXfTFtaN+EKl/6URF+K1tNGqfixdypUs9DNVD9wHyIAlx48wHkQq5 9EfjT8x2rld3vk74ohv9dXpP+ykEAMrXrQ3Uq81A9Kb+NCId7vlblhauAFyMO6q3 sk4X/slzJCgVwJaAf3DW5DVGlDcRio67eEGoc434gPoD0ZGG5+9rTDeAD9t1c1/I dEFIjNaKO/4O1YGbksKOo5sZnz39s2C8VpGJ358D+jaF/fj5s5gTmzeg68m1ODHy A6ru5ifuh6+IQZfsW32rO78N2lJHZkfhAiANEbXBkVGK07pLLsj/CoGDwW6upsAk bf2gqYtb/0em7yDwy4l405hbvQ4vXiHZVO2uDMRJXs1t7MAK0KNaK2XbkaitGwWn gt2oX2E+uqCtM8A2FBsQPzcJ0+BCTSGiCNoMNKQ9AGQFrbvIt8/L0kEKIoB5HsIH bs9plnxF//shrRJkE8L2hprRVzSvgvFTwhkxLuirJY3u/lsMdUO1osEUMCXNvY7t oAT5ga//6k+/+7uPzj7/+W9//fmvfjH72clvvv+dR68f/cMP/uCz1Wzw++/f/sdf 3//Xfz/5l//pf/ZHj/7x73b+6e//819/MJ3/8b/9e/JLs/WX9d/83v8C =Tb07 -----END PGP MESSAGE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/file-current.txt.key000066400000000000000000000034241476576476200262420ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.5 (GNU/Linux) mQGiBDslQEkRBADgDXtg08dhjHQpv9SisvzvROcsr6QRFOLWf95GWh7c6SI7Pj5m TClUaJXBRjLuvOR0L7w8l5nVJ/4kzSjle1ad04eDzP3sB4rNK18l7GAwc0ijV0mp /Kl9F4iibco3cCIMsjysWgUmlk+dYYWQubQA/EgTs7kFQo9QRxzojqnSywCg/5CZ 5TJ19gNS8knyu819v6ZSkV8D/01Fem2WZejqsmNBNiY1JoWxnTofi3AjMv6j/+Nj yBuU9ozIhUicx4y+Ro05eKUZ+VAIecVbVhEqH9VUriX48TDrNxu4OGJh62q58s0u /tqIX5OrvrpmdOC1UTdcc2CM88vssTt8oxauZeM7YAkY9rApXUniyfnJ3fdd3FlC IbvaA/9XXrlBjG/3HQSPfknbqLlCvEclelRmm6LAX8fuf/JFgj0ctRMAJKB6HOE7 /pvl3yRMMITwmd9lB/s2u+fqcwV1bDqfnyV8h3KFpTCGM1qKT+EaaT/8JhFJifYD jBEnUe9mYG7dUlt+Ff9Fj6ZRJQs9vszzQcsJDzNpys+j/KJutbQtRHVuY2FuIE1h Yy1WaWNhciBHYXLtbiA8ZHVuY2FuQG1hYy12aWNhci5jb20+iGAEEBECABgFAjsl QEkICwMJCAcCAQoCGQEFGwMAAAAAEgkQwSqJHVebm9QHZUdQRwABAeHRAJsGKaYQ p44NzYEjS9dsEAT4sYKzDgCgw4c7kDarZL/qKqFvHbvsPS6fRteIRgQQEQIABgUC OyVG9QAKCRDNHrapZn5C0WO7AKCBUULk55fR/yavkYgUhL9AX0rShgCfQ0jjVarV QNc/cj5ilTdKqSkeJ8q5Ag0EOyVAShAIAPZCV7cIfwgXcqK61qlC8wXo+VMROU+2 8W65Szgg2gGnVqMU6Y9AVfPQB8bLQ6mUrfdMZIZJ+AyDvWXpF9Sh01D49Vlf3HZS Tz09jdvOmeFXklnN/biudE/F/Ha8g8VHMGHOfMlm/xX5u/2RXscBqtNbno2gpXI6 1Brwv0YAWCvl9Ij9WE5J280gtJ3kkQc2azNsOA1FHQ98iLMcfFstjvbzySPAQ/Cl WxiNjrtVjLhdONM0/XwXV0OjHRhs3jMhLLUq/zzhsSlAGBGNfISnCnLWhsQDGcgH KXrKlQzZlp+r0ApQmwJG0wg9ZqRdQZ+cfL2JSyIZJrqrol7DVekyCzsAAgIH/3NY WNGw9Wa8B6Ow6NyS2WSBrx33ZxInDgObZe72mO/GSyxxZqxPiqTFTpajTD+HWKQu vSfMGZdD1kJZTrNEI/MNLwVBhrgxLX2qrmq1aJgWa5aRcv05wHuIUrw2g220oZ09 gUhXuF3U/oDUCAX36d16CaPCMJV1TRUoc2L1WoLP2BjzIkAgKrqUGvIFNsvtXe3c NU5dSQzF0spExuCz1Wy67/T4fzLSJpiWadl/eN67cp83ega5fyYy9NpISmeiFcV2 5UJqbQM0ktilZzDhx+evmYd6PHP7i8OqgC1oHajEohfo9kmyO/AXJ/v08svnSJVO 0G/9qQeuFp3JVeBHsN6IVAQYEQIADAUCOyVASgUbDAAAAAASCRDBKokdV5ub1Adl R1BHAAEBRRIAnjhaS/m/eYLw2g79GuLD/1x12Xj9AKCW04cRwUxoIirwdJxLNRT2 GoLAdg== =BjTA -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file-unsigned/000077500000000000000000000000001476576476200263045ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file-unsigned/content000066400000000000000000000244531476576476200277110ustar00rootroot00000000000000CONTENTSTYLE 11 BASEARCHS i586 DATADIR suse DESCRDIR suse/setup/descr DISTRIBUTION openSUSE FLAVOR dvd LABEL openSUSE 11.1 LINGUAS cs da de en en_GB en_US es fi fr hu it ja nb nl pl pt pt_BR ru sv zh zh_CN zh_TW NAME openSUSE REFERENCES openSUSE-release = 11.1 RELNOTESURL http://www.suse.com/relnotes/i386/openSUSE/11.0.42/release-notes-openSUSE.rpm SUMMARY openSUSE VERSION 11.1 META SHA1 dd627cf38a5dee28421690d2ec6abea7af274a50 dvd-11.1-58.1.i586.pat.gz META SHA1 fa49e3205fea8f95d395710a4ba79f55b4626ccd non_oss-11.1-58.1.i586.pat.gz META SHA1 f6c6ef681aa5fc4c5e9532f04420d54fbec033a8 packages.cs.gz META SHA1 cc5438a74d1b39f34bc31fbc2399ae6a95f43bc4 packages.de.gz META SHA1 90dfa1e81f5515769f5b16fcf31c1ab63c55ff87 packages.DU.gz META SHA1 b1c6b77703357297ecdd8d74b89a099ebbfe2fe6 packages.en.gz META SHA1 b137fc7749531183b5250ec907d4b9adf4624288 packages.es.gz META SHA1 3e55d6d5c21a6a1457ea6fef09c999b28883ade4 packages.fr.gz META SHA1 b5b6092d57a701d4052ad2bb047636c68ac31d8b packages.gz META SHA1 a893937892aeff71da1c38aa06f3cce5ba02de1c packages.hu.gz META SHA1 f6c6ef681aa5fc4c5e9532f04420d54fbec033a8 packages.sk.gz META SHA1 1d66972a977913541c7cb7130d61ec0e751148ba patterns HASH SHA1 4ae30edd0588114b642bbb08fbd3fb71d7af257d license.tar.gz HASH SHA1 67d82aa5cd4f08cf77cc70fe9ca1834a4b6212cc control.xml HASH SHA1 e727c621ded4324cc61e94c615dbd423436f63e4 media.1/info.txt HASH SHA1 7442eb13ca3c184fe0d47060dbc56fd45cfcb720 boot/i386/bind HASH SHA1 99920bc0c322d0d0b63ac361d2f9c8f6bc9e3524 boot/i386/branding HASH SHA1 ca2f0bce909d73d1bfaa7cdeb98595f17e4524aa boot/i386/common HASH SHA1 d107fa19616c3eae9d49fe52e54971e5b9c160fa boot/i386/config HASH SHA1 4b7d8525b1d3588562bea71b26cdb5e48e29ff64 boot/i386/cracklib-dict-full.rpm HASH SHA1 1a8151b2bf88cf618be74eee60d65063386469e0 boot/i386/fonts-arabic.rpm HASH SHA1 79aec7c93b730c2355aebd085eddf4195a9c1d36 boot/i386/fonts-thai.rpm HASH SHA1 52e1040f8e0fae373d7426447b1f9d05d25b90f6 boot/i386/gdb HASH SHA1 a1ba35bcecde55eb36be2e89b7210998b846be9d boot/i386/indic-fonts.rpm HASH SHA1 6394ec4eb1883520de23bd2ac043490da6ed8fde boot/i386/initrd-xen HASH SHA1 6394ec4eb1883520de23bd2ac043490da6ed8fde boot/i386/initrd-xenpae HASH SHA1 6cebf392eaf1b17b53f3e5e88a6b6c6d8c2b76bb boot/i386/KhmerOS-fonts.rpm HASH SHA1 e9c779539f1b3f56a96337f262b2bc548e6b223e boot/i386/LIESMICH HASH SHA1 abdf17a0246be709efbcc7c0e0a68f8ad797a754 boot/i386/LIESMICH.DOS HASH SHA1 f51e15897e5f77c7a7b4d1600dc53be6f117d9ec boot/i386/lklug.rpm HASH SHA1 c4dca65aa97554bc45885b22ef4af24ad5177c75 boot/i386/mkbootdisk HASH SHA1 99920bc0c322d0d0b63ac361d2f9c8f6bc9e3524 boot/i386/openSUSE HASH SHA1 ae44557c57285f0866be41334fdaa20312ccdeab boot/i386/README HASH SHA1 4a71ee6114eccfb88582dc5422020cbc5a2639dd boot/i386/README.DOS HASH SHA1 e12efd095a7fb990d0c4be1e04999e72de84dd6a boot/i386/rescue HASH SHA1 73e50e6321e6938471c4fc0521e0b2dce54f0346 boot/i386/root HASH SHA1 9b4cced8b700c6737ab02af8f1521945c925c8f9 boot/i386/rpmlist HASH SHA1 2181540518e50f88e7e35c619460e746934eacd4 boot/i386/sax2 HASH SHA1 78d3ee95682c1150aa8a95132ba1c5d0d88c23bd boot/i386/ttf-arphic-uming.rpm HASH SHA1 55a2d437b32d6c192c60e016756725f7a2e717e9 boot/i386/unfonts.rpm HASH SHA1 7c6fbdc97c11e5e03098f19c196d85cd63e5ce85 boot/i386/vmlinuz-xen HASH SHA1 7c6fbdc97c11e5e03098f19c196d85cd63e5ce85 boot/i386/vmlinuz-xenpae HASH SHA1 67d109ba80c3f396710774ff03ace955a2184dc6 boot/i386/yast2-trans-af.rpm HASH SHA1 3d835ea74b409914cf40ba48669a11590cffa902 boot/i386/yast2-trans-ar.rpm HASH SHA1 5654cabb329f0b1251d5743624fdf599b92d71e5 boot/i386/yast2-trans-bg.rpm HASH SHA1 1015f485542ae7c903ec9d1a9c7983d4701e2824 boot/i386/yast2-trans-bn.rpm HASH SHA1 454e0f1b79d2076a9ba03b23c34da3cbc3e58e25 boot/i386/yast2-trans-bs.rpm HASH SHA1 76bbfdb77952db51e9b21dc90ab167f2a46f4580 boot/i386/yast2-trans-ca.rpm HASH SHA1 59f26af0b058b47f2d821f6fa8102d58af8d0377 boot/i386/yast2-trans-cs.rpm HASH SHA1 db43e4829de2a26b4bb09aa1e93069af2b230377 boot/i386/yast2-trans-cy.rpm HASH SHA1 1aee13cb0b0a1f4e7b1bbb49e809fd13919ba7e9 boot/i386/yast2-trans-da.rpm HASH SHA1 36335f1ff2738071be00be65a64f7d41b7db1c33 boot/i386/yast2-trans-de.rpm HASH SHA1 5297e40871de03217cfee404cb88e909422ceae8 boot/i386/yast2-trans-el.rpm HASH SHA1 bc61efbd85302ed96ae51550a163cd0fc9ad59a3 boot/i386/yast2-trans-en_GB.rpm HASH SHA1 a237b73e48777fcdd42505ec1e007484d9f398da boot/i386/yast2-trans-en_US.rpm HASH SHA1 f2e0dba8e86a723ab72d7f7490665f8e631f63a1 boot/i386/yast2-trans-es.rpm HASH SHA1 ca9bd8bf05434d42b6a7c2c7549e2ce0170c6be8 boot/i386/yast2-trans-et.rpm HASH SHA1 57e5cd63079ac258734f28df5385e5288cd59db0 boot/i386/yast2-trans-fa.rpm HASH SHA1 2983eb7ba93882e52434f396b49cd6e98d7b7399 boot/i386/yast2-trans-fi.rpm HASH SHA1 0dfc3b38294524871f527d919ce31d6921cf77c0 boot/i386/yast2-trans-fr.rpm HASH SHA1 2051d343881b288c5d22aec792e9d13ec192dfd1 boot/i386/yast2-trans-gl.rpm HASH SHA1 49736a9798a371c3edf02f350ebe4db1e6fff011 boot/i386/yast2-trans-gu.rpm HASH SHA1 d9737ea270e5166cbc409466c1d2a6f16fcc9f06 boot/i386/yast2-trans-hi.rpm HASH SHA1 1e222655cfabbf0212e629ed1fccf304847ac732 boot/i386/yast2-trans-hr.rpm HASH SHA1 1b6e646f9f8abc7c33ef2dd830b72c7a2f775620 boot/i386/yast2-trans-hu.rpm HASH SHA1 723a18301396eccf7c0620f1f8f016719eaf7543 boot/i386/yast2-trans-id.rpm HASH SHA1 70c272dbe7bfe963e44e5331edd5f440450bc827 boot/i386/yast2-trans-it.rpm HASH SHA1 f17bc3588c7d2878821600d42fe174156971f87e boot/i386/yast2-trans-ja.rpm HASH SHA1 d46ea44b7d98ade64658d1cf388013093d1c0d39 boot/i386/yast2-trans-jv.rpm HASH SHA1 e4e684ebb7f93ac20461062544b49fe18c88627d boot/i386/yast2-trans-ka.rpm HASH SHA1 123eb83403b88845cb5efd9046ef39351c1b68c3 boot/i386/yast2-trans-km.rpm HASH SHA1 85c28913c4432f43fa29d8791d97b3e10456a42a boot/i386/yast2-trans-ko.rpm HASH SHA1 6692fca0c1acb85b398bcbb9150d0826ea38f2c8 boot/i386/yast2-trans-lo.rpm HASH SHA1 6247198d1348d31192dc158969ce8ae9252d6f0b boot/i386/yast2-trans-lt.rpm HASH SHA1 a630f16e50a6227f814751931bb1a1ec15981c29 boot/i386/yast2-trans-mk.rpm HASH SHA1 4f0bffd5cbeb7d37a7d78f1996cade7ae2ad2420 boot/i386/yast2-trans-mr.rpm HASH SHA1 bbc950f9fec446e9a5a5876c532cd56e060c5eb4 boot/i386/yast2-trans-nb.rpm HASH SHA1 edae4d58bd99064bbddd62278875b0387a2d495d boot/i386/yast2-trans-nl.rpm HASH SHA1 85f1dc1eef8862066050c09eef023705a5d61039 boot/i386/yast2-trans-pa.rpm HASH SHA1 e1eb02ebedff18a01facc150e00d05385affaa17 boot/i386/yast2-trans-pl.rpm HASH SHA1 c3d31be5bf8af62c537e1a70db9afc98842b3f82 boot/i386/yast2-trans-pt_BR.rpm HASH SHA1 b2bcd427139f2e13684a592ff186c3076a5b22d8 boot/i386/yast2-trans-pt.rpm HASH SHA1 7fdb3299ca8230ec363d3ee8eee24915c931790c boot/i386/yast2-trans-ro.rpm HASH SHA1 8b9bdb13f3b7c73e8c64303e8614e44bf640cc9f boot/i386/yast2-trans-ru.rpm HASH SHA1 55876ae86c10a3504bbbcd71e49564f4c0b47149 boot/i386/yast2-trans-si.rpm HASH SHA1 ee8ce4bc8a06b5094f8d51c79b32806531203d62 boot/i386/yast2-trans-sk.rpm HASH SHA1 04130a176a24ce3adb663a2bb694fd484f2a7776 boot/i386/yast2-trans-sl.rpm HASH SHA1 d3408d472a956ffbd1fb49354057da5c0b77879f boot/i386/yast2-trans-sr.rpm HASH SHA1 fda2c586ff8a17d402108f007c2c6214bcaeca3f boot/i386/yast2-trans-sv.rpm HASH SHA1 04021fd6654b2e7b6cbff65c094efa8c35424215 boot/i386/yast2-trans-ta.rpm HASH SHA1 6aaae1e49e3188b5e73bedb3c3cd044c4108cca2 boot/i386/yast2-trans-th.rpm HASH SHA1 6bb5903b7bc64185352c616099c344f8738bb768 boot/i386/yast2-trans-tr.rpm HASH SHA1 9f631f117433db5e44a6bbed7c8a50cbbe5e8ac0 boot/i386/yast2-trans-uk.rpm HASH SHA1 3ba5a8f4f3dc3f454e13223c2ecef9937824a611 boot/i386/yast2-trans-vi.rpm HASH SHA1 bc2775d3a4a0a3ca80e5a5caa51a6612e7158d32 boot/i386/yast2-trans-wa.rpm HASH SHA1 a3511637ca9bd4cbf5dc9eca58f8ccf5df49603c boot/i386/yast2-trans-xh.rpm HASH SHA1 ba8875e4c0febe1d26d27c0c948e93128f14476a boot/i386/yast2-trans-zh_CN.rpm HASH SHA1 d39b329ce32a0d59bebecd0d87ecfd59cb26e297 boot/i386/yast2-trans-zh_TW.rpm HASH SHA1 0c6f45e6b01d531ac7e821ae9e479416149e92eb boot/i386/yast2-trans-zu.rpm HASH SHA1 2325eb886cf06b58ca1892578383b5fcc5b11866 boot/i386/loader/linux HASH SHA1 586ec9beb26fb337283f3b49149d843a3fb7c821 boot/i386/loader/initrd HASH SHA1 d6b4db657272efe902f8ce92b53082fda4d5f1ca boot/i386/loader/08000600.spl HASH SHA1 22d4aeede74fdf44b3c4a2524319fe9cf418d4c6 boot/i386/loader/10240600.spl HASH SHA1 93e297fb9ffa23d6a167c50c318bbb46b0705e45 boot/i386/loader/10240768.spl HASH SHA1 8c135621ac91216c3388f9ea9c02127b2f6375a0 boot/i386/loader/12800800.spl HASH SHA1 54dd2bc17c9f73ad9d6a85489f99f518849cb84d boot/i386/loader/12801024.spl HASH SHA1 ef0f517a3f3a3240349b9bdd01e794267372c4ab boot/i386/loader/14001050.spl HASH SHA1 2abbc5b4c7c3dc8134ae1207f9d9e95a640046ef boot/i386/loader/16001200.spl HASH SHA1 e37862355648f6330b6831c69c989dec02b80ab0 boot/i386/loader/16801050.spl HASH SHA1 082a7887d2f43d049fdb0fc92c5051f1a5b7e663 boot/i386/loader/19201200.spl HASH SHA1 ed5f4a87074367bcf8396da7a9b9b3d1be6dfcb2 images/base-i386.tar.lzma HASH SHA1 9d055cacc983226171cdd3a3fe1acd6bb6fa044e images/base-meta-i386.tar.lzma HASH SHA1 361e07c44526cd43a2d477b7b3448e49e674f0a8 images/common-base-i386.tar.lzma HASH SHA1 6854608038e4d3b11fcc950e28ca49e4582fd2a4 images/common-desktop-i386.tar.lzma HASH SHA1 5f6a43158c017e188309c094cdaf24c346de3dfb images/common-xorg-i386.tar.lzma HASH SHA1 ce6620b820e494c042398b9fd7ed108578008168 images/details-i386.xml HASH SHA1 22c466bf9af3003ee95fed6f7fb93b4c8c0cd993 images/gnome-i386.tar.lzma HASH SHA1 49374551f38fe919cf4545d5af0fea7d45361738 images/gnome-meta-i386.tar.lzma HASH SHA1 d1e9a38629e353d1f0136ded670cf28213d47e6f images/images.xml HASH SHA1 0df7debf780a0e01b18004d18ef6ab21410b9480 images/kde-i386.tar.lzma HASH SHA1 c418a15669de278e523893f030c209c479f490e6 images/kde-meta-i386.tar.lzma HASH SHA1 6c4238796684f770a0b4ecd1ea4469e5a7a49b0d images/x11-i386.tar.lzma HASH SHA1 cc50a8bc9d560c8d522660feed5feb019f9b889e images/x11-meta-i386.tar.lzma KEY SHA1 17162a96933229a9771ee10c0976bdc047a2f53d gpg-pubkey-0dfb3188-41ed929b.asc KEY SHA1 f6accbb18d705bfc104c893cf7dfca1247a33f3c gpg-pubkey-307e3d54-481f30aa.asc KEY SHA1 47f6492d127ae9f6aac353a2dd23752fc0ed4f8d gpg-pubkey-3d25d3d9-36e12d04.asc KEY SHA1 2288e5849740566e4fb65b7c9dc0c7e4f43b1039 gpg-pubkey-56b4177a-47965b33.asc KEY SHA1 89d4bcd20a281553fd1d4ec1708603ebf88f1a59 gpg-pubkey-7e2e3b05-4816488f.asc KEY SHA1 06ff5171362496c0db84beeccd29967f580350b2 gpg-pubkey-9c800aca-481f343a.asc KEY SHA1 04544096c5c3b0ed7b01a83d79e048307c2af919 gpg-pubkey-a1912208-446a0899.asc libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file-unsigned/images/000077500000000000000000000000001476576476200275515ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file-unsigned/images/images.xml000066400000000000000000000223331476576476200315430ustar00rootroot00000000000000 base,enhanced_base,games,imaging,kde4,kde4_basis,multimedia,sw_management,x11,xgl i386 kde-meta-i386.tar.lzma KDE [base] tar common-base-i386.tar.lzma KDE [xorg] tar common-xorg-i386.tar.lzma KDE [desktop] tar common-desktop-i386.tar.lzma KDE tar kde-i386.tar.lzma KDE [meta] tar kde-meta-i386.tar.lzma base,enhanced_base,fonts,games,gnome,gnome_basis,imaging,multimedia,sw_management,x11,xgl i386 gnome-meta-i386.tar.lzma GNOME [1] tar common-base-i386.tar.lzma GNOME [2] tar common-xorg-i386.tar.lzma GNOME [4] tar common-desktop-i386.tar.lzma GNOME tar gnome-i386.tar.lzma GNOME [meta] tar gnome-meta-i386.tar.lzma base,enhanced_base,sw_management i386 base-meta-i386.tar.lzma BASE [1] tar base-meta-i386.tar.lzma BASE [2] tar base-i386.tar.lzma BASE [3] tar common-base-i386.tar.lzma base,enhanced_base,fonts,sw_management,x11 i386 x11-meta-i386.tar.lzma X11 [1] tar x11-meta-i386.tar.lzma X11 [2] tar x11-i386.tar.lzma X11 [3] tar common-xorg-i386.tar.lzma X11 [4] tar common-base-i386.tar.lzma base,enhanced_base,games,imaging,kde4,kde4_basis,multimedia,sw_management,x11,xgl x86_64 kde-meta-x86_64.tar.lzma KDE [base] tar common-base-x86_64.tar.lzma KDE [xorg] tar common-xorg-x86_64.tar.lzma KDE [desktop] tar common-desktop-x86_64.tar.lzma KDE tar kde-x86_64.tar.lzma KDE [meta] tar kde-meta-x86_64.tar.lzma base,enhanced_base,fonts,games,gnome,gnome_basis,imaging,multimedia,sw_management,x11,xgl x86_64 gnome-meta-x86_64.tar.lzma GNOME [1] tar common-base-x86_64.tar.lzma GNOME [2] tar common-xorg-x86_64.tar.lzma GNOME [4] tar common-desktop-x86_64.tar.lzma GNOME tar gnome-x86_64.tar.lzma GNOME [meta] tar gnome-meta-x86_64.tar.lzma base,enhanced_base,sw_management x86_64 base-meta-x86_64.tar.lzma BASE [1] tar base-meta-x86_64.tar.lzma BASE [2] tar base-x86_64.tar.lzma BASE [3] tar common-base-x86_64.tar.lzma base,enhanced_base,fonts,sw_management,x11 x86_64 x11-meta-x86_64.tar.lzma X11 [1] tar x11-meta-x86_64.tar.lzma X11 [2] tar x11-x86_64.tar.lzma X11 [3] tar common-xorg-x86_64.tar.lzma X11 [4] tar common-base-x86_64.tar.lzma base,enhanced_base,games,imaging,kde4,kde4_basis,multimedia,sw_management,x11,xgl ppc kde-meta-ppc.tar.lzma KDE [base] tar common-base-ppc.tar.lzma KDE [xorg] tar common-xorg-ppc.tar.lzma KDE [desktop] tar common-desktop-ppc.tar.lzma KDE tar kde-ppc.tar.lzma KDE [meta] tar kde-meta-ppc.tar.lzma base,enhanced_base,fonts,games,gnome,gnome_basis,imaging,multimedia,sw_management,x11,xgl ppc gnome-meta-ppc.tar.lzma GNOME [1] tar common-base-ppc.tar.lzma GNOME [2] tar common-xorg-ppc.tar.lzma GNOME [4] tar common-desktop-ppc.tar.lzma GNOME tar gnome-ppc.tar.lzma GNOME [meta] tar gnome-meta-ppc.tar.lzma base,enhanced_base,sw_management ppc base-meta-ppc.tar.lzma BASE [1] tar base-meta-ppc.tar.lzma BASE [2] tar base-ppc.tar.lzma BASE [3] tar common-base-ppc.tar.lzma base,enhanced_base,fonts,sw_management,x11 ppc x11-meta-ppc.tar.lzma X11 [1] tar x11-meta-ppc.tar.lzma X11 [2] tar x11-ppc.tar.lzma X11 [3] tar common-xorg-ppc.tar.lzma X11 [4] tar common-base-ppc.tar.lzma libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file/000077500000000000000000000000001476576476200244725ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file/content000066400000000000000000000244531476576476200260770ustar00rootroot00000000000000CONTENTSTYLE 11 BASEARCHS i586 DATADIR suse DESCRDIR suse/setup/descr DISTRIBUTION openSUSE FLAVOR dvd LABEL openSUSE 11.1 LINGUAS cs da de en en_GB en_US es fi fr hu it ja nb nl pl pt pt_BR ru sv zh zh_CN zh_TW NAME openSUSE REFERENCES openSUSE-release = 11.1 RELNOTESURL http://www.suse.com/relnotes/i386/openSUSE/11.0.42/release-notes-openSUSE.rpm SUMMARY openSUSE VERSION 11.1 META SHA1 dd627cf38a5dee28421690d2ec6abea7af274a50 dvd-11.1-58.1.i586.pat.gz META SHA1 fa49e3205fea8f95d395710a4ba79f55b4626ccd non_oss-11.1-58.1.i586.pat.gz META SHA1 f6c6ef681aa5fc4c5e9532f04420d54fbec033a8 packages.cs.gz META SHA1 cc5438a74d1b39f34bc31fbc2399ae6a95f43bc4 packages.de.gz META SHA1 90dfa1e81f5515769f5b16fcf31c1ab63c55ff87 packages.DU.gz META SHA1 b1c6b77703357297ecdd8d74b89a099ebbfe2fe6 packages.en.gz META SHA1 b137fc7749531183b5250ec907d4b9adf4624288 packages.es.gz META SHA1 3e55d6d5c21a6a1457ea6fef09c999b28883ade4 packages.fr.gz META SHA1 b5b6092d57a701d4052ad2bb047636c68ac31d8b packages.gz META SHA1 a893937892aeff71da1c38aa06f3cce5ba02de1c packages.hu.gz META SHA1 f6c6ef681aa5fc4c5e9532f04420d54fbec033a8 packages.sk.gz META SHA1 1d66972a977913541c7cb7130d61ec0e751148ba patterns HASH SHA1 4ae30edd0588114b642bbb08fbd3fb71d7af257d license.tar.gz HASH SHA1 67d82aa5cd4f08cf77cc70fe9ca1834a4b6212cc control.xml HASH SHA1 e727c621ded4324cc61e94c615dbd423436f63e4 media.1/info.txt HASH SHA1 7442eb13ca3c184fe0d47060dbc56fd45cfcb720 boot/i386/bind HASH SHA1 99920bc0c322d0d0b63ac361d2f9c8f6bc9e3524 boot/i386/branding HASH SHA1 ca2f0bce909d73d1bfaa7cdeb98595f17e4524aa boot/i386/common HASH SHA1 d107fa19616c3eae9d49fe52e54971e5b9c160fa boot/i386/config HASH SHA1 4b7d8525b1d3588562bea71b26cdb5e48e29ff64 boot/i386/cracklib-dict-full.rpm HASH SHA1 1a8151b2bf88cf618be74eee60d65063386469e0 boot/i386/fonts-arabic.rpm HASH SHA1 79aec7c93b730c2355aebd085eddf4195a9c1d36 boot/i386/fonts-thai.rpm HASH SHA1 52e1040f8e0fae373d7426447b1f9d05d25b90f6 boot/i386/gdb HASH SHA1 a1ba35bcecde55eb36be2e89b7210998b846be9d boot/i386/indic-fonts.rpm HASH SHA1 6394ec4eb1883520de23bd2ac043490da6ed8fde boot/i386/initrd-xen HASH SHA1 6394ec4eb1883520de23bd2ac043490da6ed8fde boot/i386/initrd-xenpae HASH SHA1 6cebf392eaf1b17b53f3e5e88a6b6c6d8c2b76bb boot/i386/KhmerOS-fonts.rpm HASH SHA1 e9c779539f1b3f56a96337f262b2bc548e6b223e boot/i386/LIESMICH HASH SHA1 abdf17a0246be709efbcc7c0e0a68f8ad797a754 boot/i386/LIESMICH.DOS HASH SHA1 f51e15897e5f77c7a7b4d1600dc53be6f117d9ec boot/i386/lklug.rpm HASH SHA1 c4dca65aa97554bc45885b22ef4af24ad5177c75 boot/i386/mkbootdisk HASH SHA1 99920bc0c322d0d0b63ac361d2f9c8f6bc9e3524 boot/i386/openSUSE HASH SHA1 ae44557c57285f0866be41334fdaa20312ccdeab boot/i386/README HASH SHA1 4a71ee6114eccfb88582dc5422020cbc5a2639dd boot/i386/README.DOS HASH SHA1 e12efd095a7fb990d0c4be1e04999e72de84dd6a boot/i386/rescue HASH SHA1 73e50e6321e6938471c4fc0521e0b2dce54f0346 boot/i386/root HASH SHA1 9b4cced8b700c6737ab02af8f1521945c925c8f9 boot/i386/rpmlist HASH SHA1 2181540518e50f88e7e35c619460e746934eacd4 boot/i386/sax2 HASH SHA1 78d3ee95682c1150aa8a95132ba1c5d0d88c23bd boot/i386/ttf-arphic-uming.rpm HASH SHA1 55a2d437b32d6c192c60e016756725f7a2e717e9 boot/i386/unfonts.rpm HASH SHA1 7c6fbdc97c11e5e03098f19c196d85cd63e5ce85 boot/i386/vmlinuz-xen HASH SHA1 7c6fbdc97c11e5e03098f19c196d85cd63e5ce85 boot/i386/vmlinuz-xenpae HASH SHA1 67d109ba80c3f396710774ff03ace955a2184dc6 boot/i386/yast2-trans-af.rpm HASH SHA1 3d835ea74b409914cf40ba48669a11590cffa902 boot/i386/yast2-trans-ar.rpm HASH SHA1 5654cabb329f0b1251d5743624fdf599b92d71e5 boot/i386/yast2-trans-bg.rpm HASH SHA1 1015f485542ae7c903ec9d1a9c7983d4701e2824 boot/i386/yast2-trans-bn.rpm HASH SHA1 454e0f1b79d2076a9ba03b23c34da3cbc3e58e25 boot/i386/yast2-trans-bs.rpm HASH SHA1 76bbfdb77952db51e9b21dc90ab167f2a46f4580 boot/i386/yast2-trans-ca.rpm HASH SHA1 59f26af0b058b47f2d821f6fa8102d58af8d0377 boot/i386/yast2-trans-cs.rpm HASH SHA1 db43e4829de2a26b4bb09aa1e93069af2b230377 boot/i386/yast2-trans-cy.rpm HASH SHA1 1aee13cb0b0a1f4e7b1bbb49e809fd13919ba7e9 boot/i386/yast2-trans-da.rpm HASH SHA1 36335f1ff2738071be00be65a64f7d41b7db1c33 boot/i386/yast2-trans-de.rpm HASH SHA1 5297e40871de03217cfee404cb88e909422ceae8 boot/i386/yast2-trans-el.rpm HASH SHA1 bc61efbd85302ed96ae51550a163cd0fc9ad59a3 boot/i386/yast2-trans-en_GB.rpm HASH SHA1 a237b73e48777fcdd42505ec1e007484d9f398da boot/i386/yast2-trans-en_US.rpm HASH SHA1 f2e0dba8e86a723ab72d7f7490665f8e631f63a1 boot/i386/yast2-trans-es.rpm HASH SHA1 ca9bd8bf05434d42b6a7c2c7549e2ce0170c6be8 boot/i386/yast2-trans-et.rpm HASH SHA1 57e5cd63079ac258734f28df5385e5288cd59db0 boot/i386/yast2-trans-fa.rpm HASH SHA1 2983eb7ba93882e52434f396b49cd6e98d7b7399 boot/i386/yast2-trans-fi.rpm HASH SHA1 0dfc3b38294524871f527d919ce31d6921cf77c0 boot/i386/yast2-trans-fr.rpm HASH SHA1 2051d343881b288c5d22aec792e9d13ec192dfd1 boot/i386/yast2-trans-gl.rpm HASH SHA1 49736a9798a371c3edf02f350ebe4db1e6fff011 boot/i386/yast2-trans-gu.rpm HASH SHA1 d9737ea270e5166cbc409466c1d2a6f16fcc9f06 boot/i386/yast2-trans-hi.rpm HASH SHA1 1e222655cfabbf0212e629ed1fccf304847ac732 boot/i386/yast2-trans-hr.rpm HASH SHA1 1b6e646f9f8abc7c33ef2dd830b72c7a2f775620 boot/i386/yast2-trans-hu.rpm HASH SHA1 723a18301396eccf7c0620f1f8f016719eaf7543 boot/i386/yast2-trans-id.rpm HASH SHA1 70c272dbe7bfe963e44e5331edd5f440450bc827 boot/i386/yast2-trans-it.rpm HASH SHA1 f17bc3588c7d2878821600d42fe174156971f87e boot/i386/yast2-trans-ja.rpm HASH SHA1 d46ea44b7d98ade64658d1cf388013093d1c0d39 boot/i386/yast2-trans-jv.rpm HASH SHA1 e4e684ebb7f93ac20461062544b49fe18c88627d boot/i386/yast2-trans-ka.rpm HASH SHA1 123eb83403b88845cb5efd9046ef39351c1b68c3 boot/i386/yast2-trans-km.rpm HASH SHA1 85c28913c4432f43fa29d8791d97b3e10456a42a boot/i386/yast2-trans-ko.rpm HASH SHA1 6692fca0c1acb85b398bcbb9150d0826ea38f2c8 boot/i386/yast2-trans-lo.rpm HASH SHA1 6247198d1348d31192dc158969ce8ae9252d6f0b boot/i386/yast2-trans-lt.rpm HASH SHA1 a630f16e50a6227f814751931bb1a1ec15981c29 boot/i386/yast2-trans-mk.rpm HASH SHA1 4f0bffd5cbeb7d37a7d78f1996cade7ae2ad2420 boot/i386/yast2-trans-mr.rpm HASH SHA1 bbc950f9fec446e9a5a5876c532cd56e060c5eb4 boot/i386/yast2-trans-nb.rpm HASH SHA1 edae4d58bd99064bbddd62278875b0387a2d495d boot/i386/yast2-trans-nl.rpm HASH SHA1 85f1dc1eef8862066050c09eef023705a5d61039 boot/i386/yast2-trans-pa.rpm HASH SHA1 e1eb02ebedff18a01facc150e00d05385affaa17 boot/i386/yast2-trans-pl.rpm HASH SHA1 c3d31be5bf8af62c537e1a70db9afc98842b3f82 boot/i386/yast2-trans-pt_BR.rpm HASH SHA1 b2bcd427139f2e13684a592ff186c3076a5b22d8 boot/i386/yast2-trans-pt.rpm HASH SHA1 7fdb3299ca8230ec363d3ee8eee24915c931790c boot/i386/yast2-trans-ro.rpm HASH SHA1 8b9bdb13f3b7c73e8c64303e8614e44bf640cc9f boot/i386/yast2-trans-ru.rpm HASH SHA1 55876ae86c10a3504bbbcd71e49564f4c0b47149 boot/i386/yast2-trans-si.rpm HASH SHA1 ee8ce4bc8a06b5094f8d51c79b32806531203d62 boot/i386/yast2-trans-sk.rpm HASH SHA1 04130a176a24ce3adb663a2bb694fd484f2a7776 boot/i386/yast2-trans-sl.rpm HASH SHA1 d3408d472a956ffbd1fb49354057da5c0b77879f boot/i386/yast2-trans-sr.rpm HASH SHA1 fda2c586ff8a17d402108f007c2c6214bcaeca3f boot/i386/yast2-trans-sv.rpm HASH SHA1 04021fd6654b2e7b6cbff65c094efa8c35424215 boot/i386/yast2-trans-ta.rpm HASH SHA1 6aaae1e49e3188b5e73bedb3c3cd044c4108cca2 boot/i386/yast2-trans-th.rpm HASH SHA1 6bb5903b7bc64185352c616099c344f8738bb768 boot/i386/yast2-trans-tr.rpm HASH SHA1 9f631f117433db5e44a6bbed7c8a50cbbe5e8ac0 boot/i386/yast2-trans-uk.rpm HASH SHA1 3ba5a8f4f3dc3f454e13223c2ecef9937824a611 boot/i386/yast2-trans-vi.rpm HASH SHA1 bc2775d3a4a0a3ca80e5a5caa51a6612e7158d32 boot/i386/yast2-trans-wa.rpm HASH SHA1 a3511637ca9bd4cbf5dc9eca58f8ccf5df49603c boot/i386/yast2-trans-xh.rpm HASH SHA1 ba8875e4c0febe1d26d27c0c948e93128f14476a boot/i386/yast2-trans-zh_CN.rpm HASH SHA1 d39b329ce32a0d59bebecd0d87ecfd59cb26e297 boot/i386/yast2-trans-zh_TW.rpm HASH SHA1 0c6f45e6b01d531ac7e821ae9e479416149e92eb boot/i386/yast2-trans-zu.rpm HASH SHA1 2325eb886cf06b58ca1892578383b5fcc5b11866 boot/i386/loader/linux HASH SHA1 586ec9beb26fb337283f3b49149d843a3fb7c821 boot/i386/loader/initrd HASH SHA1 d6b4db657272efe902f8ce92b53082fda4d5f1ca boot/i386/loader/08000600.spl HASH SHA1 22d4aeede74fdf44b3c4a2524319fe9cf418d4c6 boot/i386/loader/10240600.spl HASH SHA1 93e297fb9ffa23d6a167c50c318bbb46b0705e45 boot/i386/loader/10240768.spl HASH SHA1 8c135621ac91216c3388f9ea9c02127b2f6375a0 boot/i386/loader/12800800.spl HASH SHA1 54dd2bc17c9f73ad9d6a85489f99f518849cb84d boot/i386/loader/12801024.spl HASH SHA1 ef0f517a3f3a3240349b9bdd01e794267372c4ab boot/i386/loader/14001050.spl HASH SHA1 2abbc5b4c7c3dc8134ae1207f9d9e95a640046ef boot/i386/loader/16001200.spl HASH SHA1 e37862355648f6330b6831c69c989dec02b80ab0 boot/i386/loader/16801050.spl HASH SHA1 082a7887d2f43d049fdb0fc92c5051f1a5b7e663 boot/i386/loader/19201200.spl HASH SHA1 ed5f4a87074367bcf8396da7a9b9b3d1be6dfcb2 images/base-i386.tar.lzma HASH SHA1 9d055cacc983226171cdd3a3fe1acd6bb6fa044e images/base-meta-i386.tar.lzma HASH SHA1 361e07c44526cd43a2d477b7b3448e49e674f0a8 images/common-base-i386.tar.lzma HASH SHA1 6854608038e4d3b11fcc950e28ca49e4582fd2a4 images/common-desktop-i386.tar.lzma HASH SHA1 5f6a43158c017e188309c094cdaf24c346de3dfb images/common-xorg-i386.tar.lzma HASH SHA1 ce6620b820e494c042398b9fd7ed108578008168 images/details-i386.xml HASH SHA1 22c466bf9af3003ee95fed6f7fb93b4c8c0cd993 images/gnome-i386.tar.lzma HASH SHA1 49374551f38fe919cf4545d5af0fea7d45361738 images/gnome-meta-i386.tar.lzma HASH SHA1 d1e9a38629e353d1f0136ded670cf28213d47e6f images/images.xml HASH SHA1 0df7debf780a0e01b18004d18ef6ab21410b9480 images/kde-i386.tar.lzma HASH SHA1 c418a15669de278e523893f030c209c479f490e6 images/kde-meta-i386.tar.lzma HASH SHA1 6c4238796684f770a0b4ecd1ea4469e5a7a49b0d images/x11-i386.tar.lzma HASH SHA1 cc50a8bc9d560c8d522660feed5feb019f9b889e images/x11-meta-i386.tar.lzma KEY SHA1 17162a96933229a9771ee10c0976bdc047a2f53d gpg-pubkey-0dfb3188-41ed929b.asc KEY SHA1 f6accbb18d705bfc104c893cf7dfca1247a33f3c gpg-pubkey-307e3d54-481f30aa.asc KEY SHA1 47f6492d127ae9f6aac353a2dd23752fc0ed4f8d gpg-pubkey-3d25d3d9-36e12d04.asc KEY SHA1 2288e5849740566e4fb65b7c9dc0c7e4f43b1039 gpg-pubkey-56b4177a-47965b33.asc KEY SHA1 89d4bcd20a281553fd1d4ec1708603ebf88f1a59 gpg-pubkey-7e2e3b05-4816488f.asc KEY SHA1 06ff5171362496c0db84beeccd29967f580350b2 gpg-pubkey-9c800aca-481f343a.asc KEY SHA1 04544096c5c3b0ed7b01a83d79e048307c2af919 gpg-pubkey-a1912208-446a0899.asc libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file/content.asc000066400000000000000000000003051476576476200266320ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) iEYEABECAAYFAkkTDKoACgkQm+zCtd2wN1bWFwCcDMWfuN+JDv8/Dew9ozDLNkNM JbAAn2nqGLhU1PcX6Ev4t/jlPsazliaC =8Ava -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file/content.key000066400000000000000000000055611476576476200266650ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.9 (GNU/Linux) mQGiBEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF 110vZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6e DAbL05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRiu s2ev221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjC kfar/ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/ gnQt+mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUK fZ3gA/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzp fnWJ3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAy UYuG4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0 IEtleSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNm TgIbIwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2lao hb2Q4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQA toB5TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnr VW9PKj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPH cMOc31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues 73DPPyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsL HC5wHMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y 0KVapBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2w N1apuACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dz mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =ZZx0 -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file/images/000077500000000000000000000000001476576476200257375ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Fetcher/remote-site/images-file/images/images.xml000066400000000000000000000223331476576476200277310ustar00rootroot00000000000000 base,enhanced_base,games,imaging,kde4,kde4_basis,multimedia,sw_management,x11,xgl i386 kde-meta-i386.tar.lzma KDE [base] tar common-base-i386.tar.lzma KDE [xorg] tar common-xorg-i386.tar.lzma KDE [desktop] tar common-desktop-i386.tar.lzma KDE tar kde-i386.tar.lzma KDE [meta] tar kde-meta-i386.tar.lzma base,enhanced_base,fonts,games,gnome,gnome_basis,imaging,multimedia,sw_management,x11,xgl i386 gnome-meta-i386.tar.lzma GNOME [1] tar common-base-i386.tar.lzma GNOME [2] tar common-xorg-i386.tar.lzma GNOME [4] tar common-desktop-i386.tar.lzma GNOME tar gnome-i386.tar.lzma GNOME [meta] tar gnome-meta-i386.tar.lzma base,enhanced_base,sw_management i386 base-meta-i386.tar.lzma BASE [1] tar base-meta-i386.tar.lzma BASE [2] tar base-i386.tar.lzma BASE [3] tar common-base-i386.tar.lzma base,enhanced_base,fonts,sw_management,x11 i386 x11-meta-i386.tar.lzma X11 [1] tar x11-meta-i386.tar.lzma X11 [2] tar x11-i386.tar.lzma X11 [3] tar common-xorg-i386.tar.lzma X11 [4] tar common-base-i386.tar.lzma base,enhanced_base,games,imaging,kde4,kde4_basis,multimedia,sw_management,x11,xgl x86_64 kde-meta-x86_64.tar.lzma KDE [base] tar common-base-x86_64.tar.lzma KDE [xorg] tar common-xorg-x86_64.tar.lzma KDE [desktop] tar common-desktop-x86_64.tar.lzma KDE tar kde-x86_64.tar.lzma KDE [meta] tar kde-meta-x86_64.tar.lzma base,enhanced_base,fonts,games,gnome,gnome_basis,imaging,multimedia,sw_management,x11,xgl x86_64 gnome-meta-x86_64.tar.lzma GNOME [1] tar common-base-x86_64.tar.lzma GNOME [2] tar common-xorg-x86_64.tar.lzma GNOME [4] tar common-desktop-x86_64.tar.lzma GNOME tar gnome-x86_64.tar.lzma GNOME [meta] tar gnome-meta-x86_64.tar.lzma base,enhanced_base,sw_management x86_64 base-meta-x86_64.tar.lzma BASE [1] tar base-meta-x86_64.tar.lzma BASE [2] tar base-x86_64.tar.lzma BASE [3] tar common-base-x86_64.tar.lzma base,enhanced_base,fonts,sw_management,x11 x86_64 x11-meta-x86_64.tar.lzma X11 [1] tar x11-meta-x86_64.tar.lzma X11 [2] tar x11-x86_64.tar.lzma X11 [3] tar common-xorg-x86_64.tar.lzma X11 [4] tar common-base-x86_64.tar.lzma base,enhanced_base,games,imaging,kde4,kde4_basis,multimedia,sw_management,x11,xgl ppc kde-meta-ppc.tar.lzma KDE [base] tar common-base-ppc.tar.lzma KDE [xorg] tar common-xorg-ppc.tar.lzma KDE [desktop] tar common-desktop-ppc.tar.lzma KDE tar kde-ppc.tar.lzma KDE [meta] tar kde-meta-ppc.tar.lzma base,enhanced_base,fonts,games,gnome,gnome_basis,imaging,multimedia,sw_management,x11,xgl ppc gnome-meta-ppc.tar.lzma GNOME [1] tar common-base-ppc.tar.lzma GNOME [2] tar common-xorg-ppc.tar.lzma GNOME [4] tar common-desktop-ppc.tar.lzma GNOME tar gnome-ppc.tar.lzma GNOME [meta] tar gnome-meta-ppc.tar.lzma base,enhanced_base,sw_management ppc base-meta-ppc.tar.lzma BASE [1] tar base-meta-ppc.tar.lzma BASE [2] tar base-ppc.tar.lzma BASE [3] tar common-base-ppc.tar.lzma base,enhanced_base,fonts,sw_management,x11 ppc x11-meta-ppc.tar.lzma X11 [1] tar x11-meta-ppc.tar.lzma X11 [2] tar x11-ppc.tar.lzma X11 [3] tar common-xorg-ppc.tar.lzma X11 [4] tar common-base-ppc.tar.lzma libzypp-17.36.5/tests/zypp/data/FileChecker/000077500000000000000000000000001476576476200206375ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/FileChecker/hello.txt000066400000000000000000000000251476576476200225000ustar00rootroot00000000000000hello this is a test libzypp-17.36.5/tests/zypp/data/FileChecker/hello.txt.asc000066400000000000000000000002751476576476200232540ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQBGXW7Gm+zCtd2wN1YRAuAXAJ9e2obl0RWM9eBQz8dmPdQjclmamQCfRnJS XFIPNZAA1XeQL/Dvi51EIwc= =3TuF -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/FileChecker/hello.txt.key000066400000000000000000000325221476576476200232760ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.6 (GNU/Linux) mQGiBDsj/RYRBACQD/DCxkMgmEjBNYh53AfsV+zcMaz4nDmeEElANfHrVzVGx33N Siiqs33RIjV35Gd8OH1iSnbA7ef0gWELgVSToK2ydv/3X5Cbcb1MOWYQKJE1dQz7 fw7Ic9nP7NieM18YMsOYEmCvyL4sLZviQIlb3caP+OpI/GAoNINY8m9yowCgxgx1 L+jnJznXyKy7v5WgwMyrE2cD/38Nvp62Rq1/IqhUDc3SDUp5+xPddwOZ/E7P9F73 0Gb2ec2fhAm9QZyVvFvLa+SJq2/LvY+vITZSRI0HTBZf4Yrzd6eHu/cDp0m0o/BS McuoaHmKeHYcyIa2w8LMREpchgdlY/LnHR83Yipc3iegBRUvoTtwUYMqpswwi+6i 50nhA/9MC5cPOZbPpqbaDbSz0NtAVM2gcvgiBx4VKCh/AhkZ+abzogeHn6uT2eaP 3Fnk4YOa0FEbO+YHg3Lu45tZV3pBQUZoY07r5niT0Sb6dAKO/j/omEt4q44OO3ba fanEvFurtgpkszoD20yheQLhv7CVdS8IUfQ2R+r0eQjxtAfJWLQmRHVuY2FuIE1h Yy1WaWNhciBQcmV0dCA8ZHVuY2FuQHB1Yy5jbD6IVwQTEQIAFwUCOyP9FgULBwoD BAMVAwIDFgIBAheAAAoJEM0etqlmfkLRqZUAnA8SIsD1eQkhDR7GkekdXWtlbW1W AJ0eAtcylAOTGf3AezgtP/vlWtLj5rkBDQQ7I/0vEAQAnZXsJoF43AMGs5ccBsfe nbLa1GacjBA212+wJ/toRCbs9xzs5dozh+TnY4Px4cQSafdcsmm3jwMVeCdPdRZ0 RuJ5qEm2e29qm9nj2MTLVMKEjbTS/FbK5SkxKuLUXHsgZyFLGssFjTWDKsX/jy8c u0Kby++b6gPkO3Ft0BjwyRMAAwUEAJSn61N7TqyPOs5GSCxzUIAbsh4PlGeDZ3Uc g+CY/+WZS7CzJlUZiDWqIFADmip5FcuF/MV0mYgcd8nMBVcy17maEf1OnfPhEhOj spu8xBnSNBGWQHQx9h5CBy66riBSHG8czF9/IlKmWgyo+TGJXrxz1R2VIYgoato6 BKZSduFZiEYEGBECAAYFAjsj/S8ACgkQzR62qWZ+QtFuBQCeMY2aH7t6yvVR6o1W YopKmcxZw0UAn3iLjS38pR3qIfRN4Qhzktzu1ofBmQGiBDslJtURBADjFHks4HZl ZIc3UjWQrICS2dKbbBWxbRIKmirXD0mOZsOCdmkMpIgy4BWM2HncN5BtP/1eyh+n IwHHnFKgzqKxAIY3AjWzEDVLKPbJZ2xdQceEbKrx3Zrywt4KdyHG9DeAMYmhib8B VZ9Gg0zyTD6/HqXmA0QUOfOHQKLBApVTVwCg/+F6iL4OlBX1xKlg17yHNbdAFsME AIOH/1rBCnc2sIjyjFdgha5OxACwOJvrodAOLjDxRL/uRWnjOrKhM36A+TySc5Lv PpaqnGYcPQMNm7hUThRoLU5rYf/rdUV49y/ARQZDAdZOFf4meYk0c735c7TTTcqw f7Ri3gVGfrhsmRFwvU9JyNhkWJ/9HpOk1EZCYLgl8f4SA/sEI9CRWiLS+8PHf02p PzVZkBZzTMZNIUlXKltPJ9hSsbn1P0PHAfk1hYxch0QAQWn786F5P8DBT7bY9/Fj 2Tuu9SReDg+hK1X3K/S8QpUZ3aDuQPBTvtzTryI0k7wsRioXl+dI7yJ5TrtmCUpl J7QRTaEvpYRn1MuHorM8exqrxLQxRnJhbmNpc2NhIFF1aW50YW5hIE5hcmFuam8g PGZyYW5jaXNjYUBob3Rwb3AuY29tPohgBBARAgAYBQI7JSbVCAsDCQgHAgEKAhkB BRsDAAAAABIJEGcamjydIvodB2VHUEcAAQG0twCg462jbwEDWXbQkjp7BsOpn17h NIgAoMTjKy9QT5pSPvCR2vg4O9DFKJJciEYEEBECAAYFAjslRYcACgkQzR62qWZ+ QtGT6ACbBW2aYqhvqyE8UmOTpJNeSNa/HrkAoJr1/YGNLR0mOJ4Km5xZ8RprGHv7 uQINBDslJtUQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmP QFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24 rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhO SdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18 F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsC RtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICCADd3vdMio1+IrBMRxfHs5bw qUTxQbHuGIrX4gFqQswWQHnihWPpotDIGwf+uuBWz1X9RiHKCPIOE0rTvXk6DsH1 s/5iE0+zCLHsoGPSY4DU7WYQgrqumSBP0CqEBFzBJSUN/iCD4PP6lfjzlrmfDznE Yn73KDJKXM5c0T4YJbs9NFBSmq8qzY9MAixlkty5jvz3GX8/EMTgSxG9ih68CTac uq+u7fzbQszjKcrAqrPRAgJMtVwTuzBrpyTp/nelvOG8STR0z30yKu0kxaSPupi/ BDCg/pTjRwAT6TmkdNm1uhebJzK8L6bKy8msqZVMuscxnS/hO2HZ651RvCysyRFh iFQEGBECAAwFAjslJtUFGwwAAAAAEgkQZxqaPJ0i+h0HZUdQRwABAXlmAKD1P1CN skD6H649PbY7THYFIgrgswCglmKY5nhOTdRIUsTi5cN37CHIob6ZAaIEOyU2WhEE AMSfxMgHwElMwonNAeawUGT8NhqgfgRGCqJGHK3v6yx3/ms51sVA4PdA7jt6wG8/ nbhszeeQCIwiqZtaxGoHZcTEu4219EdOPzMebbLcm2iCH57kXGAc/vn6VOGChNhw Zt+VgdpEgy/+9gEORKC0cBDT0X93oa5im1O4q5030frvAKD/3pf4Bz4qmi35U9vW YDan/NqIFwQAocSAWtfn2WtS6UlqHkIBdpc/Zu49DUWJ1rL4wagIhRgGlblyzqZO GLEhnOrBsHXj3/yxXi+sF3mdDy9Z112DK+1L1taSf8LkRFsutbxsJqumH+bTU1mw bjnJgd4D8/oz8ryUOc6OnwsmAqaGjWR/Mul+H8mtzKbFpVHjL8uiMs8D/R/mTe6t GTIQCKaninTn9ovJbRgu4V2H4wB+gvpV463W7UtnY6ypCZOxgjsw+sdRfrOKiH+T k5bSkRUeaJgFm3Ohfbx9g4CcnKbYLDR1M8TWAlVcb1kZqqrb4daYHz9e5jD2oeZQ vancOBrsTg6jj2Nrmqzns2LkV+jf/AcMZ80StClNaWNoYWVsIE1hYy1WaWNhciBQ cmV0dCA8bWltYWN2aWNAcHVjLmNsPohgBBARAgAYBQI7JTZaCAsDCQgHAgEKAhkB BRsDAAAAABIJEG1K/bpUtQOCB2VHUEcAAQGmEwCeKa3LJJqxvSg2hF18+JQS4F7i 5mQAoMZeMPJWVSWmlU41imAGjwHoP4NyiEYEEBECAAYFAjslRx8ACgkQzR62qWZ+ QtFkQACfbMS0sv/k91tVcXV5poK0CR+m9EsAn3ywd5cQw3eenCn1z+q3gwI3G99z uQINBDslNloQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmP QFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24 rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhO SdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18 F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsC RtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICB/46z7Jy+uxh4TiACldUV23L pzj0laL/HhAn+Sv02xAZW7YVgHIq21ZwyiQ9ZbEo005HqvLPch7YymIXxoYiokia nCgbncHtG0aeaX1T/IPPbJbwNRx2+2GCLongbNvmAO9bCWP9LVeVaT9D4LpsCium hAtiOw5t/Q2cAPMgN03hTLkRI2LEdZnsapLDogQo5v6oOiLEZasSrft0MMwv3l1G MUvxdfwrR2HM7WopJS6H4AK2W0tSBLPKFanW9KAsLVcAVFV6u3lEXjuXncOo9feF WUf8A4LBJr5cQBu2kKuBcy0iayCz18s46KlqxCCCWLu+gnxcTU3YNEdQF41NjdgY iFQEGBECAAwFAjslNloFGwwAAAAAEgkQbUr9ulS1A4IHZUdQRwABAWk6AKDmE88v eFoum1b8bwCADKJjNX1WzgCgqJ61xnX80EBLtAO8rQZQSBKyABSZAaIEOyVASREE AOANe2DTx2GMdCm/1KKy/O9E5yyvpBEU4tZ/3kZaHtzpIjs+PmZMKVRolcFGMu68 5HQvvDyXmdUn/iTNKOV7Vp3Th4PM/ewHis0rXyXsYDBzSKNXSan8qX0XiKJtyjdw IgyyPKxaBSaWT51hhZC5tAD8SBOzuQVCj1BHHOiOqdLLAKD/kJnlMnX2A1LySfK7 zX2/plKRXwP/TUV6bZZl6OqyY0E2JjUmhbGdOh+LcCMy/qP/42PIG5T2jMiFSJzH jL5GjTl4pRn5UAh5xVtWESof1VSuJfjxMOs3G7g4YmHrarnyzS7+2ohfk6u+umZ0 4LVRN1xzYIzzy+yxO3yjFq5l4ztgCRj2sCldSeLJ+cnd913cWUIhu9oD/1deuUGM b/cdBI9+SduouUK8RyV6VGabosBfx+5/8kWCPRy1EwAkoHoc4Tv+m+XfJEwwhPCZ 32UH+za75+pzBXVsOp+fJXyHcoWlMIYzWopP4RppP/wmEUmJ9gOMESdR72Zgbt1S W34V/0WPplElCz2+zPNBywkPM2nKz6P8om61tC1EdW5jYW4gTWFjLVZpY2FyIEdh cu1uIDxkdW5jYW5AbWFjLXZpY2FyLmNvbT6IYAQQEQIAGAUCOyVASQgLAwkIBwIB CgIZAQUbAwAAAAASCRDBKokdV5ub1AdlR1BHAAEB4dEAmwYpphCnjg3NgSNL12wQ BPixgrMOAKDDhzuQNqtkv+oqoW8du+w9Lp9G14hGBBARAgAGBQI7JUb1AAoJEM0e tqlmfkLRY7sAoIFRQuTnl9H/Jq+RiBSEv0BfStKGAJ9DSONVqtVA1z9yPmKVN0qp KR4nyrkCDQQ7JUBKEAgA9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadW oxTpj0BV89AHxstDqZSt90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeS Wc39uK50T8X8dryDxUcwYc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0 iP1YTknbzSC0neSRBzZrM2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF04 0zT9fBdXQ6MdGGzeMyEstSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQ ClCbAkbTCD1mpF1Bn5x8vYlLIhkmuquiXsNV6TILOwACAgf/c1hY0bD1ZrwHo7Do 3JLZZIGvHfdnEicOA5tl7vaY78ZLLHFmrE+KpMVOlqNMP4dYpC69J8wZl0PWQllO s0Qj8w0vBUGGuDEtfaquarVomBZrlpFy/TnAe4hSvDaDbbShnT2BSFe4XdT+gNQI Bffp3XoJo8IwlXVNFShzYvVags/YGPMiQCAqupQa8gU2y+1d7dw1Tl1JDMXSykTG 4LPVbLrv9Ph/MtImmJZp2X943rtynzd6Brl/JjL02khKZ6IVxXblQmptAzSS2KVn MOHH56+Zh3o8c/uLw6qALWgdqMSiF+j2SbI78Bcn+/Tyy+dIlU7Qb/2pB64WnclV 4Eew3ohUBBgRAgAMBQI7JUBKBRsMAAAAABIJEMEqiR1Xm5vUB2VHUEcAAQFFEgCe OFpL+b95gvDaDv0a4sP/XHXZeP0AoJbThxHBTGgiKvB0nEs1FPYagsB2mQGiBENE 9tQRBACoPUvSF0C3Gyg93BzfjPoQzfIG7KcH+X1PMd7wsaF48B53t2V7px4MGw5W CwRy6S+bkz86Os3Ycxewm0a7/We/G0QmzmyOOD+f+L5s7Sr0rM1fmFVGZRKin1MX 0s7YpX40rSHouNSYXXX2vu+o7uJvkzI8/yf16Kac4b1nP3jT5wCguV6Gl1eWkOS9 DfwBUuIdwLObzjcD/2B9rPsuN4mhbjTAnPxz8fMKI2r+68UvEkicVIeKKauEp9JW defR5Yfv2koagqZC3F9550SjZw2r/Wmx0RhAA4mskuMXwIato39NK9+oXqgSVbyT CAb8SEgPlw60f/MctlIveRpTmSaSL37tj+UEHqOUSPoRk0VNXTML0prWpuVxA/9A YiJ62X/0CV3DksecKvr3hWdD3WZhoniRInYhkeokHJFP0V0WkWpHD1+brNgHE0ig jnbkTLWfVYDhppRccKjMiB4CxlwNoreOc2uRvO2cAzo5d0zCdJDfTNi1Ibspuf3r lnYFZ+Y2dhrP825FMvcS0dL2ZTVcOXPwDVVJRDB0l7QvV2lsbCdzIEdXIGNyeXB0 byB0ZXN0IGtleSA8d3N0ZXBoZW5zb25Ac3VzZS5kZT6IYAQTEQIAIAUCQ0T21AIb AwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEHfQbNrv1xE4iJkAn3W4/fWpkgZf pit9du1vzKTaS+y6AJwLXPrzm5F9CDTX77AfCSPsvYOHYrkCDQRDRPbgEAgAveOV KYqnKMeC9mZEzpYPFjwxMe0qSdVAqxPvAOknzbJpDHm0O9uIf8F/IQZC+Hq/COQk 9zowMkrHIBs93a0SSX4pV174XjshxDoYxDiUf/XTTDec43a420M3K3ji3ySj/MyI gOr1zu1zCWN90nFIyhBbAUqWwiEO4tHtI96pMko6RvmMZb0gsC5ERMTd5iXfvEPC 437tNyuVokeZmZAPZ2QLJoms3rt1sRujF4vZeDORZXwrhUXGtscopNgg3C39Asw2 eFS7waeblUdQbtH6iz3ofD+qz2PNc2wcnY5q6aeZTyB0USShG7PsQATLDhFwkeDP qp8g5oI+JmvPgqyAYwADBQgApLDng/rWmEKEqaUEG5sgG2fqSe7Q8tSXD/OyjXGv zjkurCe+gOUiWqUfPEtYRGBXGvE8VqYGveQZVjqiNxJ6l6tK8x4GKxMxC4hMFFTo QWoBhEw1Jy5wvOY8KoqSLnDERjXFqqTQsDEnyFjMGBl4K2XWjOYMBmSqkaDJydtv unqgH0yULu3ouxY7wk3ZKovDGmtt4i4MrthmYXq9W2tM1LutXh7PChJf4DVIo/0x SghvMQvJIELAPoIIp8h4V07sjPdvGg+n4nSAhw67KLHCR/TEqgTULH5w83Aopwbr yDnBKBXFh6zx3ArZu09YM19xW5J1ju4ureQG6jbly5Vmn4hIBBgRAgAJBQJDRPbg AhsMAAoJEHfQbNrv1xE4qNsAn2soSMFX3ZErJ4Uwwk2pg7dvYlZ0AJUYWEKOTfAc 5kHox/B8rV0xDu90mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3y EKeueNWc+z/0Kvff4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0P FPboMvKx0FXl/A0dM+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xoc QSVCFxcwvwCglVcOQliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/y E/vdvpN6lF0tmFrKXBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqI TuZC4CWxJa9GynBED3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBe GaPdNCcmfZ66rKUdG5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn 4zLUOf6aeBAoV6NMCC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqaj LfvkURHAeSsxXIoEmyW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF +rQoU3VTRSBQYWNrYWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMR AgAiBQJA2AY+AhsDBQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAK ypCfAJ9RuZ6ZSV7QW4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+I RgQQEQIABgUCOnBeUgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAe jACeOO1HIbActAevk5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9A n5vfiUUE1VQnt+T/EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2O gSEISZxbzdXGnqIlcT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzne OA9gTPSr+/fT3WeVnwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yry k23pQUPAgJENDEqeU6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN 8C1yPqZd5CvvznYvB6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJ t9IXSzyohEJB6XG5+D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ 8UUTmIT2iQf07tRUKJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/g O7fJEpD2hd2f+pMnOWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZ NZfDqnFDP6L12w3z3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271h hQBeRmmoGEKO2JRelGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5uc TXstZy7vYjL6vTP4l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g +9V3ORzw4LvO1pwRYJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbST M5LpC/U6sheLP+l0bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlG G6pqUN8QxGJYQnonl0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7 mfoGx6INQjf3HGQpMXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMW pO+M9bHp4d+puY0L1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zF bpeqPQUsDv9V7CAJ1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspn pgCfRbYwxT3iq+9l/PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuOmQGi BEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF110v ZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6eDAbL 05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRius2ev 221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjCkfar /ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/gnQt +mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUKfZ3g A/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzpfnWJ 3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAyUYuG 4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0IEtl eSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNmTgIb IwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2laohb2Q 4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQAtoB5 TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnrVW9P Kj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPHcMOc 31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues73DP PyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsLHC5w HMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y0KVa pBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2wN1ap uACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dzmQGi BEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7BwW4E qmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuciR3y gsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY3q7e R8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD++naz SIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbnZ0yo OaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9uAhgD A/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3sYaE tZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin1/4D ABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0Y2Fz ZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wCAhsD BgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmOlWDx WV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4T11K PE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8WxezAsj yTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUkyHYl t8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5Ly4I jfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUluHqD aCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabMjQgG hV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv8ZBk ApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAREDWb AzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/KiZ/C 6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9DDtpa UeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/tDCe J1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/vAwC GwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6IaVSt jbDRYEnTHQOGsVy9mQGiBER0ULcRBADZvvVUsUUSjMyQ2fUt8Uu4eGJuPbMhEtR/ vF7pzF/8u9Br7kh6WASBZ02dMeNoqFzPTU7zv6PiP93iOLwy2MQNOSBLkS+MscR6 fzS6ZL81mNr+DwgOF/rLZ4tucAsBY9Z3lgRx0mWhl+XunVPXHhkR9H9Rig4wOrrz wBsYjjfXvwCguQ1PQ6+UQgL8STVqNaNnlVYzzUUD/336IftwogH/tKp6dV/FYP/V pLHXtwFee0vcCh5FwcKP0vYo9NIfB6CR2g0pyYsHBWbheMWXRVTlCaUVOhaycd+D XoyKl3FcxL61OD0F/feg2UEqH7n1csGV2MDGlqXsF5urKdPYcBRG56ynlWXs3W7D zu9JN8skhWSnXdtBFa3BBACo+CAXSzLJnFrG7kg8AYT+0k+kTS/UydwAr57QSLUc /blXR6seNd+TM4Kwj4Ij2pNL/LpZyzVrDS9BWNZHq3bQnERPrfXpK5XWX0quZn8z g1ImFwxmJduHKmtyyxNjjPR1SUFzD1EXpPfCYgRL6kU4OflbgGoL2YpmgHO6LQ/O GrQyb3BlblNVU0UgQnVpbGQgU2VydmljZSA8YnVpbGRzZXJ2aWNlQG9wZW5zdXNl Lm9yZz6IZAQTEQIAJAUCRHRQtwIbAwUJA8JnAAYLCQgHAwIDFQIDAxYCAQIeAQIX gAAKCRA7MBG3a51lI/ewAJkB4psDm44RckrzyMyjXEKBYXYKXQCcCLBW95t7ooAI yqfsg94RICpbr50= =NAat -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/FileChecker/hello2.txt000066400000000000000000000000261476576476200225630ustar00rootroot00000000000000this is another text libzypp-17.36.5/tests/zypp/data/KeyRing/000077500000000000000000000000001476576476200200435ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/KeyRing/installkey.gpg000066400000000000000000000033351476576476200227250ustar00rootroot00000000000000D ]̬tZ٧ɠWwA6&[UjALb)1[\_T;O[$PXfZjчpeyjb^SbY vFXtն׏g<.NU+&hm) gpg(SuSE Package Signing Key gpg" Ke D `0~=T$ Mi+o͛jGP x)hr8N hq T#'uY('R+PZ xNzi15:+Sj\kw[_v CG0N!7gpg Q kۥ[m f/$v,W9$bI&ZlF2=gHqy|iakŠOO\)xK^%2ٻOuY=#UL:TiB{+T85D ծ0S('f.KgJA1Y' i gpg<& XG " p9|I$:.'g#wmb(IF֚qO<1QXtQqpT*^SqQ_p V`:aDER.uAOyO/h77{sxɓAe p/๫*pmZL_Ӊ PuA]601!/62gpg PQ7ޟ\Vj/PӾSS#--z+INζ9Zej('¶Pnfl1c3 ά0+'1JE0,oN3u6Q:Чfx~H"u&KG͌7()}U)M CWLO0HhjQv }2#n[NDRpʍGcⱽ*O?v>FoIrei\>pI}\G gpg6SuSE Package Signing Key (reserve key) gpg<&PQ7   ^DDPY/gYGN;NڪQC\"ǿZ@YP>'\\BƲ8)6Ҕs\vbs< ?v`mZr(60#nQ T .r%U w}h{Ε2‚ ʀV v/;Np.TVPfw.)G*&r . }Lb6QRHm{HE.{OOgpglibzypp-17.36.5/tests/zypp/data/KeyRing/private.asc000066400000000000000000000035531476576476200222130ustar00rootroot00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1.4.5 (GNU/Linux) lQHhBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/v4DAwKtVz8ehZCg rWAxhnYmmTtu8nnzDEF6BWQfS7gSUCu66LgtoWSjLfBuiZk0bSNDIrPPy6ZKvOOq MrHTBrQrWllwcCB0ZXN0Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3Jn PohgBBMRAgAgBQJGP7wCAhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHY m9mIIb7TJQCfTe4MwrmOlWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kx uGn8nQJjBEY/vAwQCAD4T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVB pYORxyWjS8QMc9ge8WxezAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7b Ai4xx+NLOu9DuuU+jqUkyHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPx vYrFAWnesgUJMqZo7Td5Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/ m+MTV05nT6+1KCBqCRUluHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraa tXyHnAyhwiwTZLq2jabMjQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSj ZKlHAUdnGul0M2KuyJhv8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt6 7abbezp/Dgs8+691OtAREDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2 HGTzVy1k33vnuGCVwC/KiZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp 8dMJ+FFsTmzONzZpFC9DDtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+ cFkE7hW8tyOwcx4sk1J/tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqC GWJV/gMDAq1XPx6FkKCtYI80yXvLiqb3UuzJbGJv5vVmdtsUcwiHhGnyWRd6AbKy Z0sflw+3PmpqEuAZ8LsdfJv8uIhkWh2W+eDYBrZBJ4IqQogALCf+AMCISQQYEQIA CQUCRj+8DAIbDAAKCRC9Ydib2Yghvk73AJ9cke9SDyJr+M+nusuWZqzdsJYr0wCc DHnEr0GsuEal8fCTCJuMQScd4zo= =7nLA -----END PGP PRIVATE KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/KeyRing/public.asc000066400000000000000000000032361476576476200220150ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.5 (GNU/Linux) mQGiBEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7B wW4EqmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuc iR3ygsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY 3q7eR8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD+ +nazSIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbn Z0yoOaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9u AhgDA/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3 sYaEtZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin 1/4DABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0 Y2FzZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wC AhsDBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmO lWDxWV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4 T11KPE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8Wxe zAsjyTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUk yHYlt8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5 Ly4IjfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUl uHqDaCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabM jQgGhV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv 8ZBkApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAR EDWbAzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/K iZ/C6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9D DtpaUeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/ tDCeJ1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/ vAwCGwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6I aVStjbDRYEnTHQOGsVy9 =LiUY -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/KeyRing/readme.txt000066400000000000000000000000531476576476200220370ustar00rootroot00000000000000passphrase for the key pair is zypp-devel libzypp-17.36.5/tests/zypp/data/KeyRing/repomd.xml000066400000000000000000000016671476576476200220650ustar00rootroot00000000000000 49589f0e6569914ada9293e8c3895cb899b58a58 1177395604 67b155adc1e7622f7962849ee43965253a797765 4174aed6d4ffb8cfee41b64ae357ce1db3fe904a 1177395604 1981b7db9252974869ce1d71443bde69fa9423ca 2a72bebe987fb613673d9db73120e95a999f143d 1177395604 6a328b1ec1fab195fb69035c13fe4340ee2b9cbd libzypp-17.36.5/tests/zypp/data/KeyRing/repomd.xml.asc000066400000000000000000000002751476576476200226240ustar00rootroot00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQBGQFwzvWHYm9mIIb4RAnbuAJsHJkj5X8M5aOxeZ2KUsHjhQ1vKOACdFrQ0 Vxp3Zznn3w4j5SaGAqpyGWA= =iu9H -----END PGP SIGNATURE----- libzypp-17.36.5/tests/zypp/data/KeyRing/repomd.xml.corrupted000066400000000000000000000016671476576476200240730ustar00rootroot00000000000000 49589f0e6569914ada9293e8c3895cb899b58a58 1177395604 67b855adc1e7622f7962849ee43965253a797765 4174aed6d4ffb8cfee41b64ae357ce1db3fe904a 1177395604 1981b7db9252974869ce1d71443bde69fa9423ca 2a72bebe987fb613673d9db73120e95a999f143d 1177395604 6a328b1ec1fab195fb69035c13fe4340ee2b9cbd libzypp-17.36.5/tests/zypp/data/Locks/000077500000000000000000000000001476576476200175465ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Locks/locks000066400000000000000000000000251476576476200206010ustar00rootroot00000000000000query_string: zypper libzypp-17.36.5/tests/zypp/data/PoolQuery/000077500000000000000000000000001476576476200204325ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PoolQuery/savedqueries000066400000000000000000000002601476576476200230530ustar00rootroot00000000000000solvable_name: tool repo: vbox repo: zyppsvn query_string: ma* repo: opensuse type: patch match_type: regex case_sensitive: on install_status: not-installed version: != 0.8.3 libzypp-17.36.5/tests/zypp/data/PoolQueryCC/000077500000000000000000000000001476576476200206405ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PoolQueryCC/rxnames.xml000066400000000000000000000013421476576476200230370ustar00rootroot00000000000000 . ? * + [ ] ( ) { } | ^ $ \ A AB BAB .A. libzypp-17.36.5/tests/zypp/data/PublicKey/000077500000000000000000000000001476576476200203625ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PublicKey/multikey.asc000066400000000000000000000042271476576476200227220ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.19 (GNU/Linux) mIsERCAdXQEEAL7MrBTz+3SBWpCm2ae2yaDqV3ezQcs2JlvqidJVhsZqQe9/jkxi KTEQW5+TXF/+BlQSiebunRI7oo3+9U8GyRCgs1sf+yRQWMLzZqRaarzRhw9w+Ihl edtqYl6/U2JZCb8Adp6d7RzlRliJdJ/VtsfXj2ef7Dwu7elOVSsmaBdtAAYptChT dVNFIFBhY2thZ2UgU2lnbmluZyBLZXkgPGJ1aWxkQHN1c2UuZGU+iLgEEwECACIC GwMECwcDAgMVAgMDFgIBAh4BAheABQJL4BplBQkPRMsIAAoJEOOlw2Awfj1UhOsD /RkkEhOIC9NNad0F5O0rEJxvsI7Nm+6FnNJq8LjyR5+87epQCXgpaBXEGd4RcjjO TukLaHHrC1T/h4biIyf253VZHr4oJ46sUivNUFq60gl4gk56aTGTNeUWOsgrU4jm auFca3dbGcNfiJ7c7dF2CkOAR+CPMLPYTvuVIRQBAjeSmQGiBEjKO60RBACeqGqC khF+Zmzln1G7Jj9EaX6qiigk1hbs5VLQ5205lBIFMocOOAcmB9GI6r9D4VdwTew9 PaXur4cRi8otaF93DaCCgsBvLsBTVFC1sKgJMJkhB/BKV4GdSCAylSNAzASYelZE 7KJSD1KxdS29HBVN07BOcSCBjR9eRC6kmW9IWwCg0t9U+Jx+CX7Fa9Q5mZ0/OfI1 Bd8D/joPsDKz2uAit3gEXGgGorQdXiFZIbppLe89Jz9fLq/J9GFdd6lz3Yv2Vsf/ hsaWPXQl5IZE+p6UPWUDUCwLVioLPQKh1p95KFdLn6pxFwG94UTougtjmm10E2ND 0PdssakeVtdYtNoeagQC1fYKmWyxBgXd4/nfhiNq0wFGsUUEBACbx8MIv5umcIIx TG8sJRouOjIgRdfmWPiWpxAql+qyPTwnkZytZ0zJrfdVEnKrfX8FkZ86oDN1pc0Z Zht59PrwxZpC5Kt3x0jNnyztn0FGwkADDhaEdzu8ZFXpkxglbsBAF2jx8HBLEMjN CFCEYHUoFrcIVfCO/fHJKWZquYKQuLQhVW5zdXBwb3J0ZWQgPHVuc3VwcG9ydGVk QHN1c2UuZGU+iGYEExECACYCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCS+Aa 8wUJCpqtRgAKCRAn+kG9inxk+XmpAKCUcG9rb6yU4jZn8PudBfsuQNhQNgCghiHo heeFc3pKA2PJ5tUKuPpTLya5Ag0ESMo7tBAIAJr+eL5b7DNd6oEcgMWR2yZieSpr YMDRGc5lU7HOsApcH2kHleBUQynle5NyYI0LOCuzV5QtAd0gwDV99A8VAVvYrcJl uuh6Wj2yoENBulEySUZ9LYuGA5ErFDGWEMMbXDLNvvb2MVCDXnLE34aXzRVnDjKd 2+/vzpNFuEECwGZBcf78+u0BNxCfxgLgdKdLZsAmdcFEONu8Zx6hxpoL5h+B1doI FqgePcAqhw3m7O+R8PCsODBvoIgQfViwk21BNKpnfBSvLFpJTA+AnwnRAuyljmda hI1LwB7VZ+TSplpsbt08HvmDDPzKsfgURPp+NzsQU0iFmjeaYf/9cDYgbA8AAwUH /A2dQA0JymANMkViHUt8HHtMpRPfUBEAICRriMmkSIWoUK6hZ/rD8t8PkOG7pfLC os/WdIPtuuh+56Cw1u48pwXe4nR0M3iqVTxizdldt197MeQejjBppcza7OH7nyga +NXf/GsniuuHcanImyh8yugaobWeBVD8i2juuLZFmlKc88Z1XWTC1ndB0WduWca2 XEIJgvPyk84y/r6ItB45R+Pn3b/mafl2ebhI+YG8ywY8lqBhSWnQTNXaKG/ijb+a xSEPVvNAHonZyv81XUDRNDEO/Rwsxmgb12J41k+5jpcB5yKo4lc6qNdHAwyuxSUB D/xATGUaSFmUE7mxFlzCr0+ITwQYEQIADwIbDAUCS+AbAwUJCpqtTwAKCRAn+kG9 inxk+TQ4AKCUWlqp8CgtApaaV/KBmNMhcE9TzwCfcTpQER3EMh/4CgK8wSHFcTuG QEk= =Dkxe -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/PublicKey/multikey2.asc000066400000000000000000000325221476576476200230030ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.6 (GNU/Linux) mQGiBDsj/RYRBACQD/DCxkMgmEjBNYh53AfsV+zcMaz4nDmeEElANfHrVzVGx33N Siiqs33RIjV35Gd8OH1iSnbA7ef0gWELgVSToK2ydv/3X5Cbcb1MOWYQKJE1dQz7 fw7Ic9nP7NieM18YMsOYEmCvyL4sLZviQIlb3caP+OpI/GAoNINY8m9yowCgxgx1 L+jnJznXyKy7v5WgwMyrE2cD/38Nvp62Rq1/IqhUDc3SDUp5+xPddwOZ/E7P9F73 0Gb2ec2fhAm9QZyVvFvLa+SJq2/LvY+vITZSRI0HTBZf4Yrzd6eHu/cDp0m0o/BS McuoaHmKeHYcyIa2w8LMREpchgdlY/LnHR83Yipc3iegBRUvoTtwUYMqpswwi+6i 50nhA/9MC5cPOZbPpqbaDbSz0NtAVM2gcvgiBx4VKCh/AhkZ+abzogeHn6uT2eaP 3Fnk4YOa0FEbO+YHg3Lu45tZV3pBQUZoY07r5niT0Sb6dAKO/j/omEt4q44OO3ba fanEvFurtgpkszoD20yheQLhv7CVdS8IUfQ2R+r0eQjxtAfJWLQmRHVuY2FuIE1h Yy1WaWNhciBQcmV0dCA8ZHVuY2FuQHB1Yy5jbD6IVwQTEQIAFwUCOyP9FgULBwoD BAMVAwIDFgIBAheAAAoJEM0etqlmfkLRqZUAnA8SIsD1eQkhDR7GkekdXWtlbW1W AJ0eAtcylAOTGf3AezgtP/vlWtLj5rkBDQQ7I/0vEAQAnZXsJoF43AMGs5ccBsfe nbLa1GacjBA212+wJ/toRCbs9xzs5dozh+TnY4Px4cQSafdcsmm3jwMVeCdPdRZ0 RuJ5qEm2e29qm9nj2MTLVMKEjbTS/FbK5SkxKuLUXHsgZyFLGssFjTWDKsX/jy8c u0Kby++b6gPkO3Ft0BjwyRMAAwUEAJSn61N7TqyPOs5GSCxzUIAbsh4PlGeDZ3Uc g+CY/+WZS7CzJlUZiDWqIFADmip5FcuF/MV0mYgcd8nMBVcy17maEf1OnfPhEhOj spu8xBnSNBGWQHQx9h5CBy66riBSHG8czF9/IlKmWgyo+TGJXrxz1R2VIYgoato6 BKZSduFZiEYEGBECAAYFAjsj/S8ACgkQzR62qWZ+QtFuBQCeMY2aH7t6yvVR6o1W YopKmcxZw0UAn3iLjS38pR3qIfRN4Qhzktzu1ofBmQGiBDslJtURBADjFHks4HZl ZIc3UjWQrICS2dKbbBWxbRIKmirXD0mOZsOCdmkMpIgy4BWM2HncN5BtP/1eyh+n IwHHnFKgzqKxAIY3AjWzEDVLKPbJZ2xdQceEbKrx3Zrywt4KdyHG9DeAMYmhib8B VZ9Gg0zyTD6/HqXmA0QUOfOHQKLBApVTVwCg/+F6iL4OlBX1xKlg17yHNbdAFsME AIOH/1rBCnc2sIjyjFdgha5OxACwOJvrodAOLjDxRL/uRWnjOrKhM36A+TySc5Lv PpaqnGYcPQMNm7hUThRoLU5rYf/rdUV49y/ARQZDAdZOFf4meYk0c735c7TTTcqw f7Ri3gVGfrhsmRFwvU9JyNhkWJ/9HpOk1EZCYLgl8f4SA/sEI9CRWiLS+8PHf02p PzVZkBZzTMZNIUlXKltPJ9hSsbn1P0PHAfk1hYxch0QAQWn786F5P8DBT7bY9/Fj 2Tuu9SReDg+hK1X3K/S8QpUZ3aDuQPBTvtzTryI0k7wsRioXl+dI7yJ5TrtmCUpl J7QRTaEvpYRn1MuHorM8exqrxLQxRnJhbmNpc2NhIFF1aW50YW5hIE5hcmFuam8g PGZyYW5jaXNjYUBob3Rwb3AuY29tPohgBBARAgAYBQI7JSbVCAsDCQgHAgEKAhkB BRsDAAAAABIJEGcamjydIvodB2VHUEcAAQG0twCg462jbwEDWXbQkjp7BsOpn17h NIgAoMTjKy9QT5pSPvCR2vg4O9DFKJJciEYEEBECAAYFAjslRYcACgkQzR62qWZ+ QtGT6ACbBW2aYqhvqyE8UmOTpJNeSNa/HrkAoJr1/YGNLR0mOJ4Km5xZ8RprGHv7 uQINBDslJtUQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmP QFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24 rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhO SdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18 F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsC RtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICCADd3vdMio1+IrBMRxfHs5bw qUTxQbHuGIrX4gFqQswWQHnihWPpotDIGwf+uuBWz1X9RiHKCPIOE0rTvXk6DsH1 s/5iE0+zCLHsoGPSY4DU7WYQgrqumSBP0CqEBFzBJSUN/iCD4PP6lfjzlrmfDznE Yn73KDJKXM5c0T4YJbs9NFBSmq8qzY9MAixlkty5jvz3GX8/EMTgSxG9ih68CTac uq+u7fzbQszjKcrAqrPRAgJMtVwTuzBrpyTp/nelvOG8STR0z30yKu0kxaSPupi/ BDCg/pTjRwAT6TmkdNm1uhebJzK8L6bKy8msqZVMuscxnS/hO2HZ651RvCysyRFh iFQEGBECAAwFAjslJtUFGwwAAAAAEgkQZxqaPJ0i+h0HZUdQRwABAXlmAKD1P1CN skD6H649PbY7THYFIgrgswCglmKY5nhOTdRIUsTi5cN37CHIob6ZAaIEOyU2WhEE AMSfxMgHwElMwonNAeawUGT8NhqgfgRGCqJGHK3v6yx3/ms51sVA4PdA7jt6wG8/ nbhszeeQCIwiqZtaxGoHZcTEu4219EdOPzMebbLcm2iCH57kXGAc/vn6VOGChNhw Zt+VgdpEgy/+9gEORKC0cBDT0X93oa5im1O4q5030frvAKD/3pf4Bz4qmi35U9vW YDan/NqIFwQAocSAWtfn2WtS6UlqHkIBdpc/Zu49DUWJ1rL4wagIhRgGlblyzqZO GLEhnOrBsHXj3/yxXi+sF3mdDy9Z112DK+1L1taSf8LkRFsutbxsJqumH+bTU1mw bjnJgd4D8/oz8ryUOc6OnwsmAqaGjWR/Mul+H8mtzKbFpVHjL8uiMs8D/R/mTe6t GTIQCKaninTn9ovJbRgu4V2H4wB+gvpV463W7UtnY6ypCZOxgjsw+sdRfrOKiH+T k5bSkRUeaJgFm3Ohfbx9g4CcnKbYLDR1M8TWAlVcb1kZqqrb4daYHz9e5jD2oeZQ vancOBrsTg6jj2Nrmqzns2LkV+jf/AcMZ80StClNaWNoYWVsIE1hYy1WaWNhciBQ cmV0dCA8bWltYWN2aWNAcHVjLmNsPohgBBARAgAYBQI7JTZaCAsDCQgHAgEKAhkB BRsDAAAAABIJEG1K/bpUtQOCB2VHUEcAAQGmEwCeKa3LJJqxvSg2hF18+JQS4F7i 5mQAoMZeMPJWVSWmlU41imAGjwHoP4NyiEYEEBECAAYFAjslRx8ACgkQzR62qWZ+ QtFkQACfbMS0sv/k91tVcXV5poK0CR+m9EsAn3ywd5cQw3eenCn1z+q3gwI3G99z uQINBDslNloQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmP QFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24 rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhO SdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18 F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsC RtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICB/46z7Jy+uxh4TiACldUV23L pzj0laL/HhAn+Sv02xAZW7YVgHIq21ZwyiQ9ZbEo005HqvLPch7YymIXxoYiokia nCgbncHtG0aeaX1T/IPPbJbwNRx2+2GCLongbNvmAO9bCWP9LVeVaT9D4LpsCium hAtiOw5t/Q2cAPMgN03hTLkRI2LEdZnsapLDogQo5v6oOiLEZasSrft0MMwv3l1G MUvxdfwrR2HM7WopJS6H4AK2W0tSBLPKFanW9KAsLVcAVFV6u3lEXjuXncOo9feF WUf8A4LBJr5cQBu2kKuBcy0iayCz18s46KlqxCCCWLu+gnxcTU3YNEdQF41NjdgY iFQEGBECAAwFAjslNloFGwwAAAAAEgkQbUr9ulS1A4IHZUdQRwABAWk6AKDmE88v eFoum1b8bwCADKJjNX1WzgCgqJ61xnX80EBLtAO8rQZQSBKyABSZAaIEOyVASREE AOANe2DTx2GMdCm/1KKy/O9E5yyvpBEU4tZ/3kZaHtzpIjs+PmZMKVRolcFGMu68 5HQvvDyXmdUn/iTNKOV7Vp3Th4PM/ewHis0rXyXsYDBzSKNXSan8qX0XiKJtyjdw IgyyPKxaBSaWT51hhZC5tAD8SBOzuQVCj1BHHOiOqdLLAKD/kJnlMnX2A1LySfK7 zX2/plKRXwP/TUV6bZZl6OqyY0E2JjUmhbGdOh+LcCMy/qP/42PIG5T2jMiFSJzH jL5GjTl4pRn5UAh5xVtWESof1VSuJfjxMOs3G7g4YmHrarnyzS7+2ohfk6u+umZ0 4LVRN1xzYIzzy+yxO3yjFq5l4ztgCRj2sCldSeLJ+cnd913cWUIhu9oD/1deuUGM b/cdBI9+SduouUK8RyV6VGabosBfx+5/8kWCPRy1EwAkoHoc4Tv+m+XfJEwwhPCZ 32UH+za75+pzBXVsOp+fJXyHcoWlMIYzWopP4RppP/wmEUmJ9gOMESdR72Zgbt1S W34V/0WPplElCz2+zPNBywkPM2nKz6P8om61tC1EdW5jYW4gTWFjLVZpY2FyIEdh cu1uIDxkdW5jYW5AbWFjLXZpY2FyLmNvbT6IYAQQEQIAGAUCOyVASQgLAwkIBwIB CgIZAQUbAwAAAAASCRDBKokdV5ub1AdlR1BHAAEB4dEAmwYpphCnjg3NgSNL12wQ BPixgrMOAKDDhzuQNqtkv+oqoW8du+w9Lp9G14hGBBARAgAGBQI7JUb1AAoJEM0e tqlmfkLRY7sAoIFRQuTnl9H/Jq+RiBSEv0BfStKGAJ9DSONVqtVA1z9yPmKVN0qp KR4nyrkCDQQ7JUBKEAgA9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadW oxTpj0BV89AHxstDqZSt90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeS Wc39uK50T8X8dryDxUcwYc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0 iP1YTknbzSC0neSRBzZrM2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF04 0zT9fBdXQ6MdGGzeMyEstSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQ ClCbAkbTCD1mpF1Bn5x8vYlLIhkmuquiXsNV6TILOwACAgf/c1hY0bD1ZrwHo7Do 3JLZZIGvHfdnEicOA5tl7vaY78ZLLHFmrE+KpMVOlqNMP4dYpC69J8wZl0PWQllO s0Qj8w0vBUGGuDEtfaquarVomBZrlpFy/TnAe4hSvDaDbbShnT2BSFe4XdT+gNQI Bffp3XoJo8IwlXVNFShzYvVags/YGPMiQCAqupQa8gU2y+1d7dw1Tl1JDMXSykTG 4LPVbLrv9Ph/MtImmJZp2X943rtynzd6Brl/JjL02khKZ6IVxXblQmptAzSS2KVn MOHH56+Zh3o8c/uLw6qALWgdqMSiF+j2SbI78Bcn+/Tyy+dIlU7Qb/2pB64WnclV 4Eew3ohUBBgRAgAMBQI7JUBKBRsMAAAAABIJEMEqiR1Xm5vUB2VHUEcAAQFFEgCe OFpL+b95gvDaDv0a4sP/XHXZeP0AoJbThxHBTGgiKvB0nEs1FPYagsB2mQGiBENE 9tQRBACoPUvSF0C3Gyg93BzfjPoQzfIG7KcH+X1PMd7wsaF48B53t2V7px4MGw5W CwRy6S+bkz86Os3Ycxewm0a7/We/G0QmzmyOOD+f+L5s7Sr0rM1fmFVGZRKin1MX 0s7YpX40rSHouNSYXXX2vu+o7uJvkzI8/yf16Kac4b1nP3jT5wCguV6Gl1eWkOS9 DfwBUuIdwLObzjcD/2B9rPsuN4mhbjTAnPxz8fMKI2r+68UvEkicVIeKKauEp9JW defR5Yfv2koagqZC3F9550SjZw2r/Wmx0RhAA4mskuMXwIato39NK9+oXqgSVbyT CAb8SEgPlw60f/MctlIveRpTmSaSL37tj+UEHqOUSPoRk0VNXTML0prWpuVxA/9A YiJ62X/0CV3DksecKvr3hWdD3WZhoniRInYhkeokHJFP0V0WkWpHD1+brNgHE0ig jnbkTLWfVYDhppRccKjMiB4CxlwNoreOc2uRvO2cAzo5d0zCdJDfTNi1Ibspuf3r lnYFZ+Y2dhrP825FMvcS0dL2ZTVcOXPwDVVJRDB0l7QvV2lsbCdzIEdXIGNyeXB0 byB0ZXN0IGtleSA8d3N0ZXBoZW5zb25Ac3VzZS5kZT6IYAQTEQIAIAUCQ0T21AIb AwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEHfQbNrv1xE4iJkAn3W4/fWpkgZf pit9du1vzKTaS+y6AJwLXPrzm5F9CDTX77AfCSPsvYOHYrkCDQRDRPbgEAgAveOV KYqnKMeC9mZEzpYPFjwxMe0qSdVAqxPvAOknzbJpDHm0O9uIf8F/IQZC+Hq/COQk 9zowMkrHIBs93a0SSX4pV174XjshxDoYxDiUf/XTTDec43a420M3K3ji3ySj/MyI gOr1zu1zCWN90nFIyhBbAUqWwiEO4tHtI96pMko6RvmMZb0gsC5ERMTd5iXfvEPC 437tNyuVokeZmZAPZ2QLJoms3rt1sRujF4vZeDORZXwrhUXGtscopNgg3C39Asw2 eFS7waeblUdQbtH6iz3ofD+qz2PNc2wcnY5q6aeZTyB0USShG7PsQATLDhFwkeDP qp8g5oI+JmvPgqyAYwADBQgApLDng/rWmEKEqaUEG5sgG2fqSe7Q8tSXD/OyjXGv zjkurCe+gOUiWqUfPEtYRGBXGvE8VqYGveQZVjqiNxJ6l6tK8x4GKxMxC4hMFFTo QWoBhEw1Jy5wvOY8KoqSLnDERjXFqqTQsDEnyFjMGBl4K2XWjOYMBmSqkaDJydtv unqgH0yULu3ouxY7wk3ZKovDGmtt4i4MrthmYXq9W2tM1LutXh7PChJf4DVIo/0x SghvMQvJIELAPoIIp8h4V07sjPdvGg+n4nSAhw67KLHCR/TEqgTULH5w83Aopwbr yDnBKBXFh6zx3ArZu09YM19xW5J1ju4ureQG6jbly5Vmn4hIBBgRAgAJBQJDRPbg AhsMAAoJEHfQbNrv1xE4qNsAn2soSMFX3ZErJ4Uwwk2pg7dvYlZ0AJUYWEKOTfAc 5kHox/B8rV0xDu90mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3y EKeueNWc+z/0Kvff4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0P FPboMvKx0FXl/A0dM+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xoc QSVCFxcwvwCglVcOQliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/y E/vdvpN6lF0tmFrKXBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqI TuZC4CWxJa9GynBED3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBe GaPdNCcmfZ66rKUdG5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn 4zLUOf6aeBAoV6NMCC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqaj LfvkURHAeSsxXIoEmyW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF +rQoU3VTRSBQYWNrYWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMR AgAiBQJA2AY+AhsDBQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAK ypCfAJ9RuZ6ZSV7QW4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+I RgQQEQIABgUCOnBeUgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAe jACeOO1HIbActAevk5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9A n5vfiUUE1VQnt+T/EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2O gSEISZxbzdXGnqIlcT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzne OA9gTPSr+/fT3WeVnwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yry k23pQUPAgJENDEqeU6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN 8C1yPqZd5CvvznYvB6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJ t9IXSzyohEJB6XG5+D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ 8UUTmIT2iQf07tRUKJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/g O7fJEpD2hd2f+pMnOWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZ NZfDqnFDP6L12w3z3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271h hQBeRmmoGEKO2JRelGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5uc TXstZy7vYjL6vTP4l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g +9V3ORzw4LvO1pwRYJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbST M5LpC/U6sheLP+l0bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlG G6pqUN8QxGJYQnonl0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7 mfoGx6INQjf3HGQpMXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMW pO+M9bHp4d+puY0L1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zF bpeqPQUsDv9V7CAJ1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspn pgCfRbYwxT3iq+9l/PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuOmQGi BEYjZk4RBACjIOtNaPzvKlC32b8R5TDRB0/FQ0tsMtt5dLwuq2ZYlEbT1YLF110v ZEl5IQAq5ldvD7MdR/6fqdXTdxBeYzZjeIEYbHzg3rN/N/+MkcG4W8IK1H6eDAbL 05HlQ1ueTp0mjgoGLYKt1igQe8h5uA6gEE7dv0tG0NJx2w5Gs2GpmwCgiRius2ev 221Pa65IpR1gsYuXLOEEAKJ1Bvjm+BfHJirqoH7iPq5HlABwn+s9sUmf6bjCkfar /ySAsL0VUhHNCIoHUEZd2imA2ZA0kTBxB+BIX/HMRZzxPZEwYI8Q0UYsTVb/gnQt +mWaZs1/2teWR0wnUp+eO5MpOAO9QjFJTdIz0GegsfSOPCo55CUtktr3tJUKfZ3g A/9mZe+b1Evi1/Us+klnERRKR2jjWXxwuPN6UivJbfXIZjuVUNclAhEqstzpfnWJ 3LhPxj0zJvhp/MnqSTaI6DQbr0f+JvwP+5k/4gbnqm+xxOocyhiVT45zOPAyUYuG 4t0m+9G7Vx6LC9tMukbdfHaRym42yC2s04GW2isKfta1ZbQsWllwcCBUZXN0IEtl eSBQYWlyIDx6eXBwLWRldmVsQG9wZW5zdXNlLm9yZz6IYAQTEQIAIAUCRiNmTgIb IwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEJvswrXdsDdWSVAAnjkR2laohb2Q 4WnxamdHYWSf8ULKAJ4jjfZsFq0vmgPsO/YHaKTJN5sAL7kBDQRGI2ZREAQAtoB5 TGT9K7NCv5D5dQw7jVHngnxp3NGTtAhwirYphBWaF2be3UJVTLbUFW14eMnrVW9P Kj/HNVLhQu0C6CaXtXy5LahIls+mFlSKwbiP74cFlNYcj69tzCnaFKgElQPHcMOc 31EgjySYcUIys421MxI++sugW+yHr5ByIsL6vfcAAwUEAILSwmLtD+Pwkues73DP PyWIM3MA0exO7QmZeFwnbpiZYuZQ3GiPGrbeZVqHWB72dhW8+5ugR9CVQSsLHC5w HMIQFU8RsiL06gZdIaJNgAr7ajhtUybP0WPVpXkzm5+VB8Che9m0Z0t2tK8Y0KVa pBcr3YDgx89F9VA0yny6q3WiiEkEGBECAAkFAkYjZlECGwwACgkQm+zCtd2wN1ap uACfUR+Daoo3N1fxxDa3A3t4OkAfpQgAn1UEvpQp+/4DnzSbEvwzLeoek3dzmQGi BEY/vAIRBAD2cxLY83P2G1h5TkkKYQYTLopgWQh7/7H5UK0cf62gLH7R6F7BwW4E qmLsm8eGE8kIOob5wCQU6pxpBMv+1UYoO1bohtx4L2JUY5ycJiq4u1CNyRuciR3y gsueMRkelkQ2hpNuKvmficOcoazvU3tZM6ITJjV/tQvYTQRGqwEfwwCgs0OY3q7e R8NwWekaj23t8TV7hjMEANS6QMgjsp5CdLglX02oeiCG82oEKLDOWoZ2ajD++naz SIflJE0DaZ0W26QXewh7IRzTomV98fJV6inQNanlk5/TNuAb1elXdaYFuNbnZ0yo OaTJx/mb88vm63Ur8FTyKdcN+dau8yzuNlJggj5yBcNg+/8ZOAm1ZkDMlg9uAhgD A/0RSjXu/YNmflePFxIKBCAJFJenz4dQUZeb5cuJv20eCqnKn5CFYFU6YYg3sYaE tZeultDXweRveGwe28E/vpLUa7p+aZq+XwtjI6U6W5VqvkCKIUsQqwVWRHin1/4D ABJ5rnU+yPeLXNH6jrMQ+jDG8RieI91/4n+gCX1nbwZQ/rQrWllwcCB0ZXN0Y2Fz ZSBrZXkgPHp5cHAtZGV2ZWxAb3BlbnN1c2Uub3JnPohgBBMRAgAgBQJGP7wCAhsD BgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQvWHYm9mIIb7TJQCfTe4MwrmOlWDx WV3yZ6E4B9xQq0YAoIWvs4oYVzbaQzclStHai5kxuGn8uQINBEY/vAwQCAD4T11K PE7CzkqgGMaNP+yNQzfUDbd/SaEQ5Wce5q3VvmVBpYORxyWjS8QMc9ge8WxezAsj yTKsXl+u7e/QmMKspPzPhkVKyB6s5D8FhR1Pdo7bAi4xx+NLOu9DuuU+jqUkyHYl t8QF2zX98OOcCIuQc2hjk12dvfHKmUiDoUnfuQPxvYrFAWnesgUJMqZo7Td5Ly4I jfMJQlQ7A186BGU8bPWoV1QqUInVkNGNXLmglel/m+MTV05nT6+1KCBqCRUluHqD aCiFHOUOFVWvtirmPJZ/67J78NJpF7huzXvkQraatXyHnAyhwiwTZLq2jabMjQgG hV8QyKd4qniSBL+jAAMGCACfH4FGqrs9pGBURmSjZKlHAUdnGul0M2KuyJhv8ZBk ApUtPcMhZJco50pFpkqjfH7f3xXMRVDP5FpjaRt67abbezp/Dgs8+691OtAREDWb AzarNNR3FbB9fUebh1J2i4W7tfBcoKwKFWJCvqX2HGTzVy1k33vnuGCVwC/KiZ/C 6pc4DqUwCWNoZNd8hmFadJgx3CMlxSTllsaIyOXp8dMJ+FFsTmzONzZpFC9DDtpa UeEChCptjWwy5WkQFPe+FOLUH1BnGScQYwGlE8l+cFkE7hW8tyOwcx4sk1J/tDCe J1wE8we1LXMdIiD5ugf3Jej1/98o+hQTHjfkwGqCGWJViEkEGBECAAkFAkY/vAwC GwwACgkQvWHYm9mIIb5O9wCfeI0Ro1UCK/CVT1/BH9NNB0TyYzAAmwdQFE6IaVSt jbDRYEnTHQOGsVy9mQGiBER0ULcRBADZvvVUsUUSjMyQ2fUt8Uu4eGJuPbMhEtR/ vF7pzF/8u9Br7kh6WASBZ02dMeNoqFzPTU7zv6PiP93iOLwy2MQNOSBLkS+MscR6 fzS6ZL81mNr+DwgOF/rLZ4tucAsBY9Z3lgRx0mWhl+XunVPXHhkR9H9Rig4wOrrz wBsYjjfXvwCguQ1PQ6+UQgL8STVqNaNnlVYzzUUD/336IftwogH/tKp6dV/FYP/V pLHXtwFee0vcCh5FwcKP0vYo9NIfB6CR2g0pyYsHBWbheMWXRVTlCaUVOhaycd+D XoyKl3FcxL61OD0F/feg2UEqH7n1csGV2MDGlqXsF5urKdPYcBRG56ynlWXs3W7D zu9JN8skhWSnXdtBFa3BBACo+CAXSzLJnFrG7kg8AYT+0k+kTS/UydwAr57QSLUc /blXR6seNd+TM4Kwj4Ij2pNL/LpZyzVrDS9BWNZHq3bQnERPrfXpK5XWX0quZn8z g1ImFwxmJduHKmtyyxNjjPR1SUFzD1EXpPfCYgRL6kU4OflbgGoL2YpmgHO6LQ/O GrQyb3BlblNVU0UgQnVpbGQgU2VydmljZSA8YnVpbGRzZXJ2aWNlQG9wZW5zdXNl Lm9yZz6IZAQTEQIAJAUCRHRQtwIbAwUJA8JnAAYLCQgHAwIDFQIDAxYCAQIeAQIX gAAKCRA7MBG3a51lI/ewAJkB4psDm44RckrzyMyjXEKBYXYKXQCcCLBW95t7ooAI yqfsg94RICpbr50= =NAat -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/PublicKey/susekey.asc000066400000000000000000000041751476576476200225510ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.2 (GNU/Linux) mQGiBDnu9IERBACT8Y35+2vv4MGVKiLEMOl9GdST6MCkYS3yEKeueNWc+z/0Kvff 4JctBsgs47tjmiI9sl0eHjm3gTR8rItXMN6sJEUHWzDP+Y0PFPboMvKx0FXl/A0d M+HFrruCgBlWt6FA+okRySQiliuI5phwqkXefl9AhkwR8xocQSVCFxcwvwCglVcO QliHu8jwRQHxlRE0tkwQQI0D+wfQwKdvhDplxHJ5nf7U8c/yE/vdvpN6lF0tmFrK XBUX+K7u4ifrZlQvj/81M4INjtXreqDiJtr99Rs6xa0ScZqITuZC4CWxJa9GynBE D3+D2t1V/f8l0smsuYoFOF7Ib49IkTdbtwAThlZp8bEhELBeGaPdNCcmfZ66rKUd G5sRA/9ovnc1krSQF2+sqB9/o7w5/q2qiyzwOSTnkjtBUVKn4zLUOf6aeBAoV6NM CC3Kj9aZHfA+ND0ehPaVGJgjaVNFhPi4x0e7BULdvgOoAqajLfvkURHAeSsxXIoE myW/xC1sBbDkDUIBSx5oej73XCZgnj/inphRqGpsb+1nKFvF+rQoU3VTRSBQYWNr YWdlIFNpZ25pbmcgS2V5IDxidWlsZEBzdXNlLmRlPohiBBMRAgAiBQJA2AY+AhsD BQkObd+9BAsHAwIDFQIDAxYCAQIeAQIXgAAKCRCoTtronIAKypCfAJ9RuZ6ZSV7Q W4pTgTIxQ+ABPp0sIwCffG9bCNnrETPlgOn+dGEkAWegKL+IRgQQEQIABgUCOnBe UgAKCRCeQOMQAAqrpNzOAKCL512FZvv4VZx94TpbA9lxyoAejACeOO1HIbActAev k5MUBhNeLZa/qM2JARUDBRA6cGBvd7LmAD0l09kBATWnB/9An5vfiUUE1VQnt+T/ EYklES3tXXaJJp9pHMa4fzFa8jPVtv5UBHGee3XoUNDVwM2OgSEISZxbzdXGnqIl cT08TzBUD9i579uifklLsnr35SJDZ6ram51/CWOnnaVhUzneOA9gTPSr+/fT3WeV nwJiQCQ30kNLWVXWATMnsnT486eAOlT6UNBPYQLpUprF5Yryk23pQUPAgJENDEqe U6iIO9Ot1ZPtB0lniw+/xCi13D360o1tZDYOp0hHHJN3D3EN8C1yPqZd5CvvznYv B6bWBIpWcRgdn2DUVMmpU661jwqGlRz1F84JG/xe4jGuzgpJt9IXSzyohEJB6XG5 +D0BuQINBDnu9JIQCACEkdBN6Mxf5WvqDWkcMRy6wnrd9DYJ8UUTmIT2iQf07tRU KJJ9v0JXfx2Z4d08IQSMNRaq4VgSe+PdYgIy0fbj23Via5/gO7fJEpD2hd2f+pMn OWvH2rOOIbeYfuhzAc6BQjAKtmgR0ERUTafTM9Wb6F13CNZZNZfDqnFDP6L12w3z 3F7FFXkz07Rs3AIto1ZfYZd4sCSpMr/0S5nLrHbIvGLp271hhQBeRmmoGEKO2JRe lGgUJ2CUzOdtwDIKT0LbCpvaP8PVnYF5IFoYJIWRHqlEt5ucTXstZy7vYjL6vTP4 l5xs+LIOkNmPhqmfsgLzVo0UaLt80hOwc4NvDCOLAAMGB/9g+9V3ORzw4LvO1pwR YJqfDKUq/EJ0rNMMD4N8RLpZRhKHKJUm9nNHLbksnlZwrbSTM5LpC/U6sheLP+l0 bLVoq0lmsCcUSyh+mY6PxWirLIWCn/IAZAGnXb6Zd6TtIJlGG6pqUN8QxGJYQnon l0uTJKHJENbI9sWHQdcTtBMc34gorHFCo1Bcvpnc1LFLrWn7mfoGx6INQjf3HGQp MXAWuSBQhzkazY6vaWFpa8bBJ+gKbBuySWzNm3rFtT5HRKMWpO+M9bHp4d+puY0L 1YwN1OMatcMMpcWnZpiWiR83oi32+xtWUY2U7Ae38mMag8zFbpeqPQUsDv9V7CAJ 1dbriEwEGBECAAwFAkDYBnoFCQ5t3+gACgkQqE7a6JyACspnpgCfRbYwxT3iq+9l /PgNTUNTZOlof2oAn25y0eGi0371jap9kOV6uq71sUuO =pJli -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/PurgeKernels/000077500000000000000000000000001476576476200211015ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/arch/000077500000000000000000000000001476576476200220165ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/arch/@System.repo000066400000000000000000000173641476576476200243040ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-firmware - noarch +Prv: kernel-firmware = 20190312-lp151.2.3.1 kernel-firmware = -Prv: =Pkg: kernel-macros 1 0 noarch +Prv: kernel-subpackage-macros kernel-macros = 1-0 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 1 x86_64 +Prv: multiversion(kernel) kernel-default-1-1 kernel = 1-1 kernel-uname-r = 1-1-default kernel-default = 1-1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 1 x86_64 +Req: kernel = 1-1 -Req: +Prv: kernel-livepatch-default-1-1 kernel-livepatch-default = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 1 x86_64 +Req: kernel-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-1 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 1 x86_64 +Prv: kernel-default-devel-debuginfo = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 1 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 1 x86_64 +Req: kernel-devel = 1-1 kernel-default-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-syms = 1-1 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-default 1 2 x86_64 +Prv: multiversion(kernel) kernel-default-1-2 kernel = 1-2 kernel-uname-r = 1-2-default kernel-default = 1-2 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 2 x86_64 +Req: kernel = 1-2 -Req: +Prv: kernel-livepatch-default-1-2 kernel-livepatch-default = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 2 x86_64 +Req: kernel-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-2 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 2 x86_64 +Prv: kernel-default-devel-debuginfo = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 2 x86_64 +Req: kernel-devel = 1-2 kernel-default-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-syms = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 5 x86_64 +Prv: multiversion(kernel) kernel-default-1-5 kernel = 1-5 kernel-uname-r = 1-5-default ksym(foobar) = abdcfee kernel-default = 1-5 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 5 x86_64 +Req: kernel-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-5 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 5 x86_64 +Prv: kernel-default-devel-debuginfo = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 5 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 5 x86_64 +Req: kernel-devel = 1-5 kernel-default-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-syms = 1-5 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: dummy-kmp-default 1 0 x86_64 +Req: kernel-default-devel ksym(foobar) = abdcfee -Req: +Prv: kmod(dummy) dummy-kmp-default = 1-0 -Prv: =Pkg: kernel-default 1 1 i686 +Prv: multiversion(kernel) kernel-default-1-1 kernel = 1-1 kernel-uname-r = 1-1-default kernel-default = 1-1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 1 i686 +Req: kernel = 1-1 -Req: +Prv: kernel-livepatch-default-1-1 kernel-livepatch-default = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 1 i686 +Req: kernel-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-1 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 1 i686 +Prv: kernel-default-devel-debuginfo = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 1 i686 +Req: kernel-devel = 1-1 kernel-default-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-syms = 1-1 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-default 1 2 i686 +Prv: multiversion(kernel) kernel-default-1-2 kernel = 1-2 kernel-uname-r = 1-2-default kernel-default = 1-2 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 2 i686 +Req: kernel = 1-2 -Req: +Prv: kernel-livepatch-default-1-2 kernel-livepatch-default = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 2 i686 +Req: kernel-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-2 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 2 i686 +Prv: kernel-default-devel-debuginfo = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 2 i686 +Req: kernel-devel = 1-2 kernel-default-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-syms = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 5 i686 +Prv: multiversion(kernel) kernel-default-1-5 kernel = 1-5 kernel-uname-r = 1-5-default ksym(foobar) = abdcfee kernel-default = 1-5 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 5 i686 +Req: kernel-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-5 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 5 i686 +Prv: kernel-default-devel-debuginfo = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 5 i686 +Req: kernel-devel = 1-5 kernel-default-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-syms = 1-5 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: dummy-kmp-default 1 0 i686 +Req: kernel-default-devel ksym(foobar) = abdcfee -Req: +Prv: kmod(dummy) dummy-kmp-default = 1-0 -Prv: =Pkg: kernel-default 1 1 aarch64 +Prv: multiversion(kernel) kernel-default-1-1 kernel = 1-1 kernel-uname-r = 1-1-default kernel-default = 1-1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 1 aarch64 +Req: kernel = 1-1 -Req: +Prv: kernel-livepatch-default-1-1 kernel-livepatch-default = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 1 aarch64 +Req: kernel-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-1 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 1 aarch64 +Prv: kernel-default-devel-debuginfo = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 1 aarch64 +Req: kernel-devel = 1-1 kernel-default-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-syms = 1-1 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-default 1 2 aarch64 +Prv: multiversion(kernel) kernel-default-1-2 kernel = 1-2 kernel-uname-r = 1-2-default kernel-default = 1-2 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 2 aarch64 +Req: kernel = 1-2 -Req: +Prv: kernel-livepatch-default-1-2 kernel-livepatch-default = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 2 aarch64 +Req: kernel-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-2 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 2 aarch64 +Prv: kernel-default-devel-debuginfo = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 2 aarch64 +Req: kernel-devel = 1-2 kernel-default-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-syms = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 5 aarch64 +Prv: multiversion(kernel) kernel-default-1-5 kernel = 1-5 kernel-uname-r = 1-5-default ksym(foobar) = abdcfee kernel-default = 1-5 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 5 aarch64 +Req: kernel-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-5 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 5 aarch64 +Prv: kernel-default-devel-debuginfo = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 5 aarch64 +Req: kernel-devel = 1-5 kernel-default-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-syms = 1-5 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: dummy-kmp-default 1 0 aarch64 +Req: kernel-default-devel ksym(foobar) = abdcfee -Req: +Prv: kmod(dummy) dummy-kmp-default = 1-0 -Prv: libzypp-17.36.5/tests/zypp/data/PurgeKernels/arch/zypp-control.yaml000066400000000000000000000013201476576476200253560ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/PurgeKernels/fancybuildnr/000077500000000000000000000000001476576476200235615ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/fancybuildnr/@System.repo000066400000000000000000000064421476576476200260420ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-firmware - noarch +Prv: kernel-firmware = 20190312-lp151.2.3.1 kernel-firmware = -Prv: =Pkg: kernel-default 5.7.8 1.1.g8f507a0 x86_64 +Prv: multiversion(kernel) kernel-default-5.7.8-1.1.g8f507a0 kernel = 5.7.8-1.1.g8f507a0 kernel-uname-r = 5.7.8-1.g8f507a0-default kernel-default = 5.7.8-1.1.g8f507a0 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.7.9 1.1.ga010166 x86_64 +Prv: multiversion(kernel) kernel-default-5.7.9-1.1.ga010166 kernel = 5.7.9-1.1.ga010166 kernel-uname-r = 5.7.9-1.ga010166-default kernel-default = 5.7.9-1.1.ga010166 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.7.10 1.1.g6a1b5cf x86_64 +Prv: multiversion(kernel) kernel-default-5.7.10-1.1.g6a1b5cf kernel = 5.7.10-1.1.g6a1b5cf kernel-uname-r = 5.7.10-1.g6a1b5cf-default kernel-default = 5.7.10-1.1.g6a1b5cf -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.7.10 3.1.gd1148b9 x86_64 +Prv: multiversion(kernel) kernel-default-5.7.10-3.1.gd1148b9 kernel = 5.7.10-3.1.gd1148b9 kernel-uname-r = 5.7.10-3.gd1148b9-default kernel-default = 5.7.10-3.1.gd1148b9 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.7.11 1.1.g5015994 x86_64 +Prv: multiversion(kernel) kernel-default-5.7.11-1.1.g5015994 kernel = 5.7.11-1.1.g5015994 kernel-uname-r = 5.7.11-1.g5015994-default kernel-default = 5.7.11-1.1.g5015994 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.7.12 1.1.g9c98feb x86_64 +Prv: multiversion(kernel) kernel-default-5.7.12-1.1.g9c98feb kernel = 5.7.12-1.1.g9c98feb kernel-uname-r = 5.7.12-1.g9c98feb-default kernel-default = 5.7.12-1.1.g9c98feb -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.8.0 1.1.gd3bf2d6 x86_64 +Prv: multiversion(kernel) kernel-default-5.8.0-1.1.gd3bf2d6 kernel = 5.8.0-1.1.gd3bf2d6 kernel-uname-r = 5.8.0-1.gd3bf2d6-default kernel-default = 5.8.0-1.1.gd3bf2d6 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.8.0 2.1.g9bc0044 x86_64 +Prv: multiversion(kernel) kernel-default-5.8.0-2.1.g9bc0044 kernel = 5.8.0-2.1.g9bc0044 kernel-uname-r = 5.8.0-2.g9bc0044-default kernel-default = 5.8.0-2.1.g9bc0044 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.8.0 3.1.gd4e7682 x86_64 +Prv: multiversion(kernel) kernel-default-5.8.0-3.1.gd4e7682 kernel = 5.8.0-3.1.gd4e7682 kernel-uname-r = 5.8.0-3.gd4e7682-default kernel-default = 5.8.0-3.1.gd4e7682 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.8.1 1.1.ge6658c9 x86_64 +Prv: multiversion(kernel) kernel-default-5.8.1-1.1.ge6658c9 kernel = 5.8.1-1.1.ge6658c9 kernel-uname-r = 5.8.1-1.ge6658c9-default kernel-default = 5.8.1-1.1.ge6658c9 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.8.1 2.1.g553537d x86_64 +Prv: multiversion(kernel) kernel-default-5.8.1-2.1.g553537d kernel = 5.8.1-2.1.g553537d kernel-uname-r = 5.8.1-2.g553537d-default kernel-default = 5.8.1-2.1.g553537d -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default 5.8.1 3.1.g846658e x86_64 +Prv: multiversion(kernel) kernel-default-5.8.1-3.1.g846658e kernel = 5.8.1-3.1.g846658e kernel-uname-r = 5.8.1-3.g846658e-default kernel-default = 5.8.1-3.1.g846658e -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE libzypp-17.36.5/tests/zypp/data/PurgeKernels/fancybuildnr/zypp-control.yaml000066400000000000000000000013201476576476200271210ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/PurgeKernels/flavour/000077500000000000000000000000001476576476200225575ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/flavour/@System.repo000066400000000000000000000117051476576476200250360ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-firmware - noarch +Prv: kernel-firmware = 20190312-lp151.2.3.1 kernel-firmware = -Prv: =Pkg: kernel-macros 1 0 noarch +Prv: kernel-subpackage-macros kernel-macros = 1-0 -Prv: =Vnd: openSUSE =Pkg: kernel-rt 1 1 x86_64 +Prv: multiversion(kernel) kernel-rt-1-1 kernel = 1-1 kernel-uname-r = 1-1-rt kernel-rt = 1-1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-rt-devel 1 1 x86_64 +Req: kernel-devel-rt = 1-1 -Req: +Prv: multiversion(kernel) kernel-rt-devel = 1-1 -Prv: +Sup: kernel-rt & kernel-devel-rt -Sup: =Vnd: openSUSE =Pkg: kernel-rt-devel-debuginfo 1 1 x86_64 +Prv: kernel-rt-devel-debuginfo = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-devel-rt 1 1 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel-rt = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-source-rt 1 1 noarch +Req: kernel-devel-rt = 1-1 -Req: +Prv: multiversion(kernel) kernel-source-rt = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-devel-rt 1 1.2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel-rt = 1-1 kernel-devel-rt = 1-1.2 -Prv: =Vnd: openSUSE =Pkg: kernel-source-rt 1 1.2 noarch +Req: kernel-devel-rt = 1-1.2 -Req: +Prv: multiversion(kernel) kernel-source-rt = 1-1 kernel-source-rt = 1-1.2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms-rt 1 1 x86_64 +Req: kernel-devel-rt = 1-1 kernel-rt-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-syms-rt = 1-1 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-rt 1 2 x86_64 +Prv: multiversion(kernel) kernel-rt-1-2 kernel = 1-2 kernel-uname-r = 1-2-rt kernel-rt = 1-2 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-rt-devel 1 2 x86_64 +Req: kernel-devel-rt = 1-2 -Req: +Prv: multiversion(kernel) kernel-rt-devel = 1-2 -Prv: +Sup: kernel-rt & kernel-devel-rt -Sup: =Vnd: openSUSE =Pkg: kernel-rt-devel-debuginfo 1 2 x86_64 +Prv: kernel-rt-devel-debuginfo = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-devel-rt 1 2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel-rt = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms-rt 1 2 x86_64 +Req: kernel-devel-rt = 1-2 kernel-rt-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-syms-rt = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-rt 1 3 x86_64 +Prv: multiversion(kernel) kernel-rt-1-3 kernel = 1-3 kernel-uname-r = 1-3-rt kernel-rt = 1-3 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-rt-devel 1 3 x86_64 +Req: kernel-devel-rt = 1-3 -Req: +Prv: multiversion(kernel) kernel-rt-devel = 1-3 -Prv: +Sup: kernel-rt & kernel-devel-rt -Sup: =Vnd: openSUSE =Pkg: kernel-rt-devel 1 3.2 x86_64 +Req: kernel-devel-rt = 1-3.2 -Req: +Prv: multiversion(kernel) kernel-rt-devel = 1-3 kernel-rt-devel = 1-3.2 -Prv: +Sup: kernel-rt & kernel-devel-rt -Sup: =Vnd: openSUSE =Pkg: kernel-devel-rt 1 3.2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel-rt = 1-3 kernel-devel-rt = 1-3.2 -Prv: =Vnd: openSUSE =Pkg: kernel-source-rt 1 3.2 noarch +Req: kernel-devel-rt = 1-3.2 -Req: +Prv: multiversion(kernel) kernel-source-rt = 1-3 kernel-source-rt = 1-3.2 -Prv: =Vnd: openSUSE =Pkg: kernel-rt-devel-debuginfo 1 3 x86_64 +Prv: kernel-rt-devel-debuginfo = 1-3 -Prv: =Vnd: openSUSE =Pkg: kernel-devel-rt 1 3 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel-rt = 1-3 -Prv: =Vnd: openSUSE =Pkg: kernel-syms-rt 1 3 x86_64 +Req: kernel-devel-rt = 1-3 kernel-rt-devel = 1-3 -Req: +Prv: multiversion(kernel) kernel-syms-rt = 1-3 -Prv: =Vnd: openSUSE =Pkg: kernel-rt 1 4 x86_64 +Prv: multiversion(kernel) kernel-rt-1-4 kernel = 1-4 kernel-uname-r = 1-4-rt kernel-rt = 1-4 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-rt-devel 1 4 x86_64 +Req: kernel-devel-rt = 1-4 -Req: +Prv: multiversion(kernel) kernel-rt-devel = 1-4 -Prv: +Sup: kernel-rt & kernel-devel-rt -Sup: =Vnd: openSUSE =Pkg: kernel-rt-devel-debuginfo 1 4 x86_64 +Prv: kernel-rt-devel-debuginfo = 1-4 -Prv: =Vnd: openSUSE =Pkg: kernel-devel-rt 1 4 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel-rt = 1-4 -Prv: =Vnd: openSUSE =Pkg: kernel-syms-rt 1 4 x86_64 +Req: kernel-devel-rt = 1-4 kernel-rt-devel = 1-4 -Req: +Prv: multiversion(kernel) kernel-syms-rt = 1-4 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-rt 1 5 x86_64 +Prv: multiversion(kernel) kernel-rt-1-5 kernel = 1-5 kernel-uname-r = 1-5-rt ksym(foobar) = abdcfee kernel-rt = 1-5 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-rt-devel 1 5 x86_64 +Req: kernel-devel-rt = 1-5 -Req: +Prv: multiversion(kernel) kernel-rt-devel = 1-5 -Prv: +Sup: kernel-rt & kernel-devel-rt -Sup: =Vnd: openSUSE =Pkg: kernel-rt-devel-debuginfo 1 5 x86_64 +Prv: kernel-rt-devel-debuginfo = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-devel-rt 1 5 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel-rt = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-syms-rt 1 5 x86_64 +Req: kernel-devel-rt = 1-5 kernel-rt-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-syms-rt = 1-5 -Prv: =Vnd: openSUSE =Tim: 1570603549 libzypp-17.36.5/tests/zypp/data/PurgeKernels/flavour/zypp-control.yaml000066400000000000000000000013201476576476200261170ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/PurgeKernels/kernel-base/000077500000000000000000000000001476576476200232715ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/kernel-base/@System.repo000066400000000000000000000030401476576476200255410ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-firmware - noarch +Prv: kernel-firmware = -Prv: =Vnd: openSUSE =Pkg: kernel-default-base 5.7.8 1.1.1.1 x86_64 +Prv: multiversion(kernel) kernel-default-5.7.8-1 kernel = 5.7.8-1 kernel-base = 5.7.8-1 kernel-uname-r = 5.7.8-1-default kernel-default-base = 5.7.8-1 kernel-default-base = 5.7.8-1.1 kernel-default-base = 5.7.8-1.1.1 kernel-default-base = 5.7.8-1.1.1.1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-base 5.7.8 2.1.1.1 x86_64 +Prv: multiversion(kernel) kernel-default-5.7.8-2 kernel = 5.7.8-2 kernel-base = 5.7.8-2 kernel-uname-r = 5.7.8-2-default kernel-default-base = 5.7.8-2 kernel-default-base = 5.7.8-2.1 kernel-default-base = 5.7.8-2.1.1 kernel-default-base = 5.7.8-2.1.1.1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-base 5.7.8 3.1.1.1 x86_64 +Prv: multiversion(kernel) kernel-default-5.7.8-3 kernel = 5.7.8-3 kernel-base = 5.7.8-3 kernel-uname-r = 5.7.8-3-default kernel-default-base = 5.7.8-3 kernel-default-base = 5.7.8-3.1 kernel-default-base = 5.7.8-3.1.1 kernel-default-base = 5.7.8-3.1.1.1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-base 5.8.8 2.1.1.1 x86_64 +Prv: multiversion(kernel) kernel-default-5.8.8-1 kernel = 5.8.8-1 kernel-base = 5.8.8-1 kernel-uname-r = 5.8.8-1-default kernel-default-base = 5.8.8-1 kernel-default-base = 5.8.8-1.1 kernel-default-base = 5.8.8-1.1.1 kernel-default-base = 5.8.8-1.1.1.1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE libzypp-17.36.5/tests/zypp/data/PurgeKernels/kernel-base/zypp-control.yaml000066400000000000000000000013201476576476200266310ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/PurgeKernels/rckrnl/000077500000000000000000000000001476576476200223745ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/rckrnl/@System.repo000066400000000000000000000013051476576476200246460ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-default 5.13.rc7 16.1 x86_64 +Prv: multiversion(kernel) kernel-default-5.13.rc7-16.1 kernel = 5.13.rc7-16.1 kernel-uname-r = 5.13.0-rc7-16-default kernel-default = 5.13.rc7-16.1 -Prv: =Vnd: openSUSE =Pkg: kernel-default 5.13~rc7 17.1 x86_64 +Prv: multiversion(kernel) kernel-default-5.13~rc7-17.1 kernel = 5.13~rc7-17.1 kernel-uname-r = 5.13.0-rc7-17-default kernel-default = 5.13~rc7-17.1 -Prv: =Vnd: openSUSE =Pkg: kernel-default 5.13~rc7 18.1 x86_64 +Prv: multiversion(kernel) kernel-default-5.13~rc7-18.1 kernel = 5.13~rc7-18.1 kernel-uname-r = 5.13.0-rc7-18-default kernel-default = 5.13~rc7-18.1 -Prv: =Vnd: openSUSE libzypp-17.36.5/tests/zypp/data/PurgeKernels/rckrnl/zypp-control.yaml000066400000000000000000000013201476576476200257340ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/PurgeKernels/rebuild/000077500000000000000000000000001476576476200225275ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/rebuild/@System.repo000066400000000000000000000025601476576476200250050ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-firmware - noarch +Prv: kernel-firmware = 20190312-lp151.2.3.1 kernel-firmware = -Prv: =Pkg: kernel-macros 1 0 noarch +Prv: kernel-subpackage-macros kernel-macros = 1-0 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 1.2 x86_64 +Prv: multiversion(kernel) kernel-default-1-1 kernel = 1-1 kernel-default = 1-1 kernel-default = 1-1.2 kernel-uname-r = 1-1-default -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 1.2 x86_64 +Req: kernel-devel = 1-1.2 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-1.2 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 1.2 x86_64 +Prv: kernel-default-devel-debuginfo = 1-1.2 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 1 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-1 kernel-devel = 1-1.2 -Prv: =Vnd: openSUSE =Pkg: kernel-source 1 1 noarch +Req: kernel-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-source = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-source 1 1.2 noarch +Req: kernel-devel = 1-1.2 -Req: +Prv: multiversion(kernel) kernel-source = 1-1.2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 1 x86_64 +Req: kernel-devel = 1-1 kernel-default-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-syms = 1-1 -Prv: =Vnd: openSUSE =Tim: 1570603549 libzypp-17.36.5/tests/zypp/data/PurgeKernels/rebuild/zypp-control.yaml000066400000000000000000000013201476576476200260670ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/PurgeKernels/simple/000077500000000000000000000000001476576476200223725ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/simple/@System.repo000066400000000000000000000127171476576476200246550ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-firmware - noarch +Prv: kernel-firmware = 20190312-lp151.2.3.1 kernel-firmware = -Prv: =Pkg: kernel-macros 1 0 noarch +Prv: kernel-subpackage-macros kernel-macros = 1-0 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 1 x86_64 +Prv: multiversion(kernel) kernel-default-1-1 kernel = 1-1 kernel-uname-r = 1-1-default kernel-default = 1-1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 1 x86_64 +Req: kernel = 1-1 -Req: +Prv: kernel-livepatch-default-1-1 kernel-livepatch-default = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 1 x86_64 +Req: kernel-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-1 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 1 x86_64 +Prv: kernel-default-devel-debuginfo = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 1 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-source 1 1 noarch +Req: kernel-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-source = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 1.2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-1 kernel-devel = 1-1.2 -Prv: =Vnd: openSUSE =Pkg: kernel-source 1 1.2 noarch +Req: kernel-devel = 1-1.2 -Req: +Prv: multiversion(kernel) kernel-source = 1-1 kernel-source = 1-1.2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 1 x86_64 +Req: kernel-devel = 1-1 kernel-default-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-syms = 1-1 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-default 1 2 x86_64 +Prv: multiversion(kernel) kernel-default-1-2 kernel = 1-2 kernel-uname-r = 1-2-default kernel-default = 1-2 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 2 x86_64 +Req: kernel = 1-2 -Req: +Prv: kernel-livepatch-default-1-2 kernel-livepatch-default = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 2 x86_64 +Req: kernel-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-2 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 2 x86_64 +Prv: kernel-default-devel-debuginfo = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 2 x86_64 +Req: kernel-devel = 1-2 kernel-default-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-syms = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 3 x86_64 +Prv: multiversion(kernel) kernel-default-1-3 kernel = 1-3 kernel-uname-r = 1-3-default kernel-default = 1-3 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 3 x86_64 +Req: kernel-devel = 1-3 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-3 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel 1 3.2 x86_64 +Req: kernel-devel = 1-3.2 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-3 kernel-default-devel = 1-3.2 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-devel 1 3.2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-3 kernel-devel = 1-3.2 -Prv: =Vnd: openSUSE =Pkg: kernel-source 1 3.2 noarch +Req: kernel-devel = 1-3.2 -Req: +Prv: multiversion(kernel) kernel-source = 1-3 kernel-source = 1-3.2 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 3 x86_64 +Prv: kernel-default-devel-debuginfo = 1-3 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 3 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-3 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 3 x86_64 +Req: kernel-devel = 1-3 kernel-default-devel = 1-3 -Req: +Prv: multiversion(kernel) kernel-syms = 1-3 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 4 x86_64 +Prv: multiversion(kernel) kernel-default-1-4 kernel = 1-4 kernel-uname-r = 1-4-default kernel-default = 1-4 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 4 x86_64 +Req: kernel-devel = 1-4 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-4 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 4 x86_64 +Prv: kernel-default-devel-debuginfo = 1-4 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 4 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-4 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 4 x86_64 +Req: kernel-devel = 1-4 kernel-default-devel = 1-4 -Req: +Prv: multiversion(kernel) kernel-syms = 1-4 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-default 1 5 x86_64 +Prv: multiversion(kernel) kernel-default-1-5 kernel = 1-5 kernel-uname-r = 1-5-default ksym(foobar) = abdcfee kernel-default = 1-5 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 5 x86_64 +Req: kernel-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-5 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 5 x86_64 +Prv: kernel-default-devel-debuginfo = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 5 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 5 x86_64 +Req: kernel-devel = 1-5 kernel-default-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-syms = 1-5 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: dummy-kmp-default 1 0 x86_64 +Req: kernel-default-devel ksym(foobar) = abdcfee -Req: +Prv: kmod(dummy) dummy-kmp-default = 1-0 -Prv: libzypp-17.36.5/tests/zypp/data/PurgeKernels/simple/zypp-control.yaml000066400000000000000000000013201476576476200257320ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/PurgeKernels/withdeps/000077500000000000000000000000001476576476200227305ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/PurgeKernels/withdeps/@System.repo000066400000000000000000000067671476576476200252230ustar00rootroot00000000000000=Ver: 3.0 =Pkg: glibc 1 1 x86_64 +Prv: glibc = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-firmware - noarch +Prv: kernel-firmware = 20190312-lp151.2.3.1 kernel-firmware = -Prv: =Pkg: kernel-macros 1 0 noarch +Prv: kernel-subpackage-macros kernel-macros = 1-0 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 1 x86_64 +Prv: multiversion(kernel) kernel-default-1-1 kernel = 1-1 kernel-uname-r = 1-1-default kernel-default = 1-1 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 1 x86_64 +Req: kernel = 1-1 -Req: +Prv: kernel-livepatch-default-1-1 kernel-livepatch-default = 1-1 -Prv: =Vnd: openSUSE =Pkg: foo 1 1 x86_64 +Req: kernel = 1-1 -Req: +Prv: foo = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 1 x86_64 +Req: kernel-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-1 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 1 x86_64 +Prv: kernel-default-devel-debuginfo = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 1 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-1 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 1 x86_64 +Req: kernel-devel = 1-1 kernel-default-devel = 1-1 -Req: +Prv: multiversion(kernel) kernel-syms = 1-1 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: kernel-default 1 2 x86_64 +Prv: multiversion(kernel) kernel-default-1-2 kernel = 1-2 kernel-uname-r = 1-2-default kernel-default = 1-2 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-extra 1 2 x86_64 =Sum: The Standard Kernel - Unsupported kernel modules +Req: kernel-default = 1-2 -Req: +Prv: multiversion(kernel) kernel-extra = 1-2 config(kernel-default-extra) = 1-2 kernel-default-extra = 1-2 kmod(a) kmod(b) ksym(c) -Prv: =Vnd: openSUSE =Pkg: kernel-livepatch-default 1 2 x86_64 +Req: kernel = 1-2 -Req: +Prv: kernel-livepatch-default-1-2 kernel-livepatch-default = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default-devel 1 2 x86_64 +Req: kernel-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-2 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 2 x86_64 +Prv: kernel-default-devel-debuginfo = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 2 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 2 x86_64 +Req: kernel-devel = 1-2 kernel-default-devel = 1-2 -Req: +Prv: multiversion(kernel) kernel-syms = 1-2 -Prv: =Vnd: openSUSE =Pkg: kernel-default 1 5 x86_64 +Prv: multiversion(kernel) kernel-default-1-5 kernel = 1-5 kernel-uname-r = 1-5-default ksym(foobar) = abdcfee kernel-default = 1-5 -Prv: +Rec: kernel-firmware -Rec: =Vnd: openSUSE =Pkg: kernel-default-devel 1 5 x86_64 +Req: kernel-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-default-devel = 1-5 -Prv: +Sup: kernel-default & kernel-devel -Sup: =Vnd: openSUSE =Pkg: kernel-default-devel-debuginfo 1 5 x86_64 +Prv: kernel-default-devel-debuginfo = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-devel 1 5 noarch +Req: kernel-macros -Req: +Prv: multiversion(kernel) kernel-devel = 1-5 -Prv: =Vnd: openSUSE =Pkg: kernel-syms 1 5 x86_64 +Req: kernel-devel = 1-5 kernel-default-devel = 1-5 -Req: +Prv: multiversion(kernel) kernel-syms = 1-5 -Prv: =Vnd: openSUSE =Tim: 1570603549 =Pkg: dummy-kmp-default 1 0 x86_64 +Req: kernel-default-devel ksym(foobar) = abdcfee -Req: +Prv: kmod(dummy) dummy-kmp-default = 1-0 -Prv: =Pkg: package-needing-krnlmodule 1 0 x86_64 +Req: dummy-kmp-default = 1-0 -Req: +Prv: package-needing-krnlmodule = 1-0 -Prv: libzypp-17.36.5/tests/zypp/data/PurgeKernels/withdeps/zypp-control.yaml000066400000000000000000000013201476576476200262700ustar00rootroot00000000000000version: 1.0 setup: channels: - alias: "@System" url: [] path: "" type: NONE generated: 0 outdated: 0 priority: 99 file: "@System.repo" arch: x86_64 locales: - fate: "" name: en_US - fate: "" name: de autoinst: [] modalias: [] multiversion: [] resolverFlags: focus: Job ignorealreadyrecommended: false onlyRequires: false forceResolve: false cleandepsOnRemove: false allowDowngrade: false allowNameChange: false allowArchChange: false allowVendorChange: false dupAllowDowngrade: false dupAllowNameChange: false dupAllowArchChange: false dupAllowVendorChange: false trials: [] libzypp-17.36.5/tests/zypp/data/RepoManager/000077500000000000000000000000001476576476200206735ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/plugin-service-lib-1/000077500000000000000000000000001476576476200245315ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/plugin-service-lib-1/services/000077500000000000000000000000001476576476200263545ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/plugin-service-lib-1/services/service000077500000000000000000000002441476576476200277420ustar00rootroot00000000000000#!/bin/bash echo " [repo1] name=Repository1 baseurl=http://somehost.com/repo1 type=rpmmd [repo12] name=Repository2 baseurl=http://somehost.com/repo2 type=rpmmd " libzypp-17.36.5/tests/zypp/data/RepoManager/plugin-service-lib-2/000077500000000000000000000000001476576476200245325ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/plugin-service-lib-2/services/000077500000000000000000000000001476576476200263555ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/plugin-service-lib-2/services/service000077500000000000000000000001321476576476200277370ustar00rootroot00000000000000#!/bin/sh echo " [repo3] name=Repository3 baseurl=http://somehost.com/repo3 type=rpmmd " libzypp-17.36.5/tests/zypp/data/RepoManager/proprietary.repo000066400000000000000000000005001476576476200241350ustar00rootroot00000000000000[macromedia] name=Macromedia for i386 Linux baseurl=http://macromedia.rediris.es/rpm/ enabled=1 gpgcheck=1 gpgkey=http://macromedia.mplug.org/FEDORA-GPG-KEY [office] name=Microsoft Office for Linux baseurl=http://www.microsoft.com/linux/office enabled=1 gpgcheck=1 gpgkey=http://www.microsoft.com/~sballmer/gpgkey.txt libzypp-17.36.5/tests/zypp/data/RepoManager/repo/000077500000000000000000000000001476576476200216405ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/repo/repoindex.xml000066400000000000000000000015511476576476200243610ustar00rootroot00000000000000 libzypp-17.36.5/tests/zypp/data/RepoManager/repos.d/000077500000000000000000000000001476576476200222455ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/repos.d/filesharing.repo000066400000000000000000000003431476576476200254270ustar00rootroot00000000000000[filesharing] name=Filesharing applications (SUSE_Factory) type=rpm-md baseurl=http://software.opensuse.org/download/filesharing/SUSE_Factory/ gpgcheck=1 gpgkey=http://software.opensuse.org/openSUSE-Build-Service.asc enabled=1 libzypp-17.36.5/tests/zypp/data/RepoManager/repos.d/home:dmacvicar.repo000066400000000000000000000003641476576476200260330ustar00rootroot00000000000000[home:dmacvicar] name=Duncan Mac-Vicar SUSE rpms (openSUSE_Factory) type=rpm-md baseurl=http://software.opensuse.org/download/home:/dmacvicar/openSUSE_Factory/ gpgcheck=1 gpgkey=http://software.opensuse.org/openSUSE-Build-Service.asc enabled=1 libzypp-17.36.5/tests/zypp/data/RepoManager/repos.d/proprietary.repo000066400000000000000000000001101476576476200255040ustar00rootroot00000000000000 [adobe] name=acrobat reader baseurl=http://www.adobe.com/reader/linux libzypp-17.36.5/tests/zypp/data/RepoManager/repos.d/ruby.repo000066400000000000000000000003761476576476200241230ustar00rootroot00000000000000[ruby] name=Ruby is an Interpreted Object-Oriented Scripting Language (openSUSE_Factory) type=rpm-md baseurl=http://software.opensuse.org/download/ruby/openSUSE_Factory/ gpgcheck=1 gpgkey=http://software.opensuse.org/openSUSE-Build-Service.asc enabled=1 libzypp-17.36.5/tests/zypp/data/RepoManager/second/000077500000000000000000000000001476576476200221465ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/second/repo/000077500000000000000000000000001476576476200231135ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RepoManager/second/repo/repoindex.xml000066400000000000000000000011001476576476200256220ustar00rootroot00000000000000 libzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/000077500000000000000000000000001476576476200212745ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/no.rpm000066400000000000000000000000001476576476200224160ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/signed.key000066400000000000000000000045571476576476200232720ustar00rootroot00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQGNBGfAXzgBDACx8/JfFAt168PouH/rBIPDN9+xLHEnfEXoWc4YDno6KiU9wXoC ktq8ZxQWNZanTWFSn9lbeZ+M8e2O7X1wWOk7Ve3/WCT3Za+L057+DBHIquAgFY2Q NP3mzp8+fphLZJ8sxHE6w7puqTjMtPaVgMTICqi2aDRKwO0kgjmWFRLpF34GeMQh ctu10s9axZ99Vg81BAWeVtQon+YAATIl//4S7XVs0DIzFGeDFzfk/zSp6z9JcFNC RtK3O6+1y7/TI8XlW0fxwJPO+0qr4z9lllhteJfCNBbYxeLvbU1HfTGDtW/tTyDQ 6VVeUmkmpA6qHMAKh+a/6gCYseXQTfTUHbloMhkwoI/Fg+81995E2UpgeYv0+SYx 5/iS+nspfQs8Ma7XD7A/jUosS+tWGu7N5SLNEdpBCoLhY4A4FCC9SO5eKUejvt2E lQEHAr/oPzE72tkRgqI6oRn/6Vps6yhskay36R185uBLGeMIg6jy4u98YdR3SeNz zGiRs7S5hjyW8vsAEQEAAbQQbGlienlwcHRlc3RzdWl0ZYkBzgQTAQgAOBYhBN1J Lk7rPkcLRPNNc+J5IJu7ZaIWBQJnwF84AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B AheAAAoJEOJ5IJu7ZaIW+AgL/ifIsPe1KISXVsnrOkmCkHbfHKUTHPAB07F338b9 56HswVANvNwY0hNcu5XEIih5+iS9szKa3PZUT2nD0OJFn0DEEjqa+K/FpUiroXIp ZuoGvvQcXYKkHo3CjQtiYSq2x0WXEPU7vQALSom9IQ34bV6nfYTMffY7CxnIQ9Ax RIunZKf0WjRB9E1CLhmZ15BVr3tw5Mcglk2fqRp5USq+fv1PdOF76yDqfMiOpoDK hESugmNg7ZImzG5Ab0zwzQuwuvKOJXUXo0pPhDQKyYaxhxf+lQF+l8gmcKAlfcZ8 pNo6jlsd9cLcExBdYtWoKSOqOYkb7+Dt5duNs7nkA2zoWNKSP97QD8Sj5GPbW/+p 9rsj3+cSal2dt21oEYYnF3MOwtpfRMwWjKqJeg4TGlay2nFSZ/6szDJ8H5nBPfmM 5+sNcpmEndl8hE+f7cCTY9aYVJTefH1RNKfS3YfTbOfdJ3Ha21aDevHSuiPLprL9 BSXQ2pgES610mPVyq3q8frhiq7kBjQRnwF84AQwA4+SVtTSZ3l7qwGfzaV7TqicE QgtsdB+xOAZ6YC+D56JO5r9iwn8aIq3O6ZLA3nS3xXBrl9aSqNlwZUKeUqkKVHjq vX3mZvJMeFrKs/DS8lmcRxlygjCqMnMJAzssQl2sjIgGZxas2AfnsilgWAdKNngj /9+Pwzmeov8wsRfMdadztdBeeyvSt1AyRFOzSclOJjDYMLTXXlJE+f9v4CWGvEyu oWPAwGfdKXh3ZwiLKAw0dT6f8tdLA7AILyWdt4SVMb/Hl6/x1E2oYNwlnxz1LCab V2Sb2pFwi/6p3CU6SlgzrF357Ksrf/RlZkjPKodyd5bDL7oA24Srvue+WfOFmrw4 R/axgkktNgBE/IgFTniemOyCDeSHrZzK8H6KdUnMkKlHArmFM2NBZHYWrDapwU4J /xsZND7wtbZ4513/3ih3ZQsrnV0jaz26KVPsQxlrDZYFRuHoAIkJ7mWFhf9sq4v1 2AttArV4LxHURcvwFV5HbPvt1GozoTJl3oxw8r8DABEBAAGJAbYEGAEIACAWIQTd SS5O6z5HC0TzTXPieSCbu2WiFgUCZ8BfOAIbDAAKCRDieSCbu2WiFve2C/47bSyv vczCOVMapc+0EvBMYvKBo/AJHgD4e6t/D7CHzVUF6PIM0v5HiN1T+dt/8s8LlFjP jCFS4mEWI1OwGhtxJZLhr8sn0gtLn6w5TTWuYdI+Qg/VJJH3NwUvWtCoRHi/F+Ho GoUUfn3YNsNQDT8UFSA3DYXm7mxKsO1lPZ/0SFo3voKwNqqugxtm0ma1O/RCyZWx ikcFavZOw8Qkmy8aqCOyMiMmCdkNQnk8CoisduIPsV2wG72PF0XmZIjAl/7K5WTm jSKPARs0W4jR4o6Rb9e4F8iUC1wWSXYW2acaghLbN3voiV6BYfnQ0j8XfBD28g1t jqqPq0H7JN3pDC2m477H6EG/AwAPrhX7/g9GAMi9g1JpZSx5wlbDegOIUQxixChe 8YUGLoJxna2hIs6AFFY/O3A9n+HiEl2Xg/E4KKDt0RfHWT9Md7ms+GT6ezJs6rL3 9zcBzHLKrp+rQqg7alSwE9rzQIhKdXJBt4E3lZhnRvibsC8fZtcAsumO884= =JDsP -----END PGP PUBLIC KEY BLOCK----- libzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/signed.rpm000066400000000000000000000154241476576476200232730ustar00rootroot00000000000000kio-stash-lang-1.0-lp151.2.5 >   $!I.N>G DMsy egb y eI j.HJ3OrUe ^jxNݘOak x89Ϲ1m/#&惏mikH)-FQ#nNBUt65wEBηDʽ$ncGδaL\f,5(9^3yl.=+J'/ɳv6Iil$ )ݨ@DzTFRUf]pӊeUtgŚJh;gE NħyJ{H!uv`B̗N;󌸀LjCvHb,Jƨ="ݓ j $CllMn~d&y7:Hjd9eLxgʩjQen2:eR<1(^ 9ca2e3aec038e562d33442271ee52c08ded0d637e88100656c8e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732,!I.N>G DMsy egb y eǓ w TWѩL6*P9>CSD=Wq޾ ydwgNnT 4ڰ̔Nnm`o$,v El42tSwt(/ 9̷s! 2rJF^)c}/"n@cd?C_(\85P(,"P|=2RCԝm`%ȩ1,[ᵾ?G:*mj4ިUi&%MI9 Ս0a r|F saR8 o&&:Uɳ6qW4簮+hX QuBe1)=#s[[q^YV}HZkNC9oBᡗ>UdhNM[ <nڞ|>p,?d  Bx| @T(89:FX(Y0bBcdKePfSlUzgx|Ckio-stash-lang1.0lp151.2.5Translations for package kio-stashProvides translations for the "kio-stash" package.\&!lamb14openSUSE Leap 15.1openSUSEGPL-2.0+https://bugs.opensuse.orgSystem/Localizationhttp://www.kde.orglinuxnoarchkio-stash-1.0-lp151.2.5.src.rpmkio-stash-langkio-stash-lang-all    kio-stashrpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)1.03.0.4-14.6.0-14.0-15.2-14.14.1Y\fabian@ritter-vogt.de- Initial packaginglamb14 15460029431.0-lp151.2.51.0-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -gobs://build.opensuse.org/openSUSE:Leap:15.1/standard/49c87a0d3ecf853fc2168ef5dbef1c86-kio-stashcpioxz5x86_64-suse-linux1 nbƕRO}:kio-stashutf-86632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795?@7zXZ !t/{] cX˄ x[dr#B+O(qrtpy z.Q|)K YZlibzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/signed_broken.rpm000066400000000000000000000154251476576476200246340ustar00rootroot00000000000000kio-stash-lang-1.0-lp151.2.5 >   $!I.N>G DMsy egb y eI j.HJ3OrUe ^jxNݘOak x89Ϲ1m/#&惏mikH)-FQ#nNBUt65wEBηDʽ$ncGδaL\f,5(9^3yl.=+J'/ɳv6Iil$ )ݨ@DzTFRUf]pӊeUtgŚJh;gE NħyJ{H!uv`B̗N;󌸀LjCvHb,Jƨ="ݓ j $CllMn~d&y7:Hjd9eLxgʩjQen2:eR<1(^ 9ca2e3aec038e562d33442271ee52c08ded0d637e88100656c8e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732,!I.N>G DMsy egb y eǓ w TWѩL6*P9>CSD=Wq޾ ydwgNnT 4ڰ̔Nnm`o$,v El42tSwt(/ 9̷s! 2rJF^)c}/"n@cd?C_(\85P(,"P|=2RCԝm`%ȩ1,[ᵾ?G:*mj4ިUi&%MI9 Ս0a r|F saR8 o&&:Uɳ6qW4簮+hX QuBe1)=#s[[q^YV}HZkNC9oBᡗ>UdhNM[ <nڞ|>p,?d  Bx| @T(89:FX(Y0bBcdKePfSlUzgx|Ckio-stash-lang1.0lp151.2.5Translations for package kio-stashProvides translations for the "kio-stash" package.\&!lamb14openSUSE Leap 15.1openSUSEGPL-2.0+https://bugs.opensuse.orgSystem/Localizationhttp://www.kde.orglinuxnoarchkio-stash-1.0-lp151.2.5.src.rpmkio-stash-langkio-stash-lang-all    kio-stashrpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)1.03.0.4-14.6.0-14.0-15.2-14.14.1Y\fabian@ritter-vogt.de- Initial packaginglamb14 15460029431.0-lp151.2.51.0-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -gobs://build.opensuse.org/openSUSE:Leap:15.1/standard/49c87a0d3ecf853fc2168ef5dbef1c86-kio-stashcpioxz5x86_64-suse-linux1 nbƕRO}:kio-stashutf-86632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795?@7zXZ !t/{] cX˄ x[dr#B+O(qrtpy z.Q|)K YZ libzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/signed_broken_header.rpm000066400000000000000000000154251476576476200261440ustar00rootroot00000000000000kio-stash-lang-1.0-lp151.2.5 >   $!I.N>G DM y egb y eI j.HJ3OrUe ^jxNݘOak x89Ϲ1m/#&惏mikH)-FQ#nNBUt65wEBηDʽ$ncGδaL\f,5(9^3yl.=+J'/ɳv6Iil$ )ݨ@DzTFRUf]pӊeUtgŚJh;gE NħyJ{H!uv`B̗N;󌸀LjCvHb,Jƨ="ݓ j $CllMn~d&y7:Hjd9eLxgʩjQen2:eR<1(^ 9ca2e0aec038e562d33442271ee52c08ded0d637e8810065608e06b6e4bb9155f0dd111ef8042866941f02b623cb46e12a82f732,!I.N>G DMsy egb y eǓ w TWѩL6*P9>CSD=Wq޾ ydwgNnT 4ڰ̔Nnm`o$,v El42tSwt(/ 9̷s! 2rJF^)c}/"n@cd?C_(\85P(,"P|=2RCԝm`%ȩ1,[ᵾ?G:*mj4ިUi&%MI9 Ս0a r|F saR8 o&&:Uɳ6qW4簮+hX QuBe1)=#s[[q^YV}HZkNC9oBᡗ>UdhNM[ <nڞ|>p,?d  Bx| @T(89:FX(Y0bBcdKePfSlUzgx|Ckio-stash-lang1.0lp151.2.5Translations for package kio-stashProvides translations for the "kio-stash" package.\&!lamb14openSUSE Leap 15.1openSUSEGPL-2.0+https://bugs.opensuse.orgSystem/Localizationhttp://www.kde.orglinuxnoarchkio-stash-1.0-lp151.2.5.src.rpmkio-stash-langkio-stash-lang-all    kio-stashrpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)1.03.0.4-14.6.0-14.0-15.2-14.14.1Y\fabian@ritter-vogt.de- Initial packaginglamb14 15460029431.0-lp151.2.51.0-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -gobs://build.opensuse.org/openSUSE:Leap:15.1/standard/49c87a0d3ecf853fc2168ef5dbef1c86-kio-stashcpioxz5x86_64-suse-linux1 nbƕRO}:kio-stashutf-86632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795?@7zXZ !t/{] cX˄ x[dr#B+O(qrtpy z.Q|)K YZ libzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/unsigned.rpm000066400000000000000000000132141476576476200236310ustar00rootroot00000000000000pkg-test42-0-0> )lp d6768447e13388b0c35fb151ebfa8f6646a115e92ce9f41bc0de68b4cb1aa1e18c1bea43dfaa01299ae61ef3e4466df332c792e5t]-+&}|>"P?@d   $<@TXdku 3(OXXY\b`defl<Cpkg-test4200pkg-test42 summarypkg-test42 description]:fibonacci.suse.deSuSE-interntest42nolicenseroot@FibonacciUnspecifiedlinuxnoarchpkg-test42-0-0.src.rpmpkg-test42    rpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.0.4-14.6.0-14.0-15.2-14.14.10-0-O2 -g -m64 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tablescpioxz5noarch-suse-linuxutf-86632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795?7zXZ !t/{] cX˄ x[dr#B+O(qrtpy z.Q|)K YZlibzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/unsigned_broken.rpm000066400000000000000000000132151476576476200251720ustar00rootroot00000000000000pkg-test42-0-0> )lp d6768447e13388b0c35fb151ebfa8f6646a115e92ce9f41bc0de68b4cb1aa1e18c1bea43dfaa01299ae61ef3e4466df332c792e5t]-+&}|>"P?@d   $<@TXdku 3(OXXY\b`defl<Cpkg-test4200pkg-test42 summarypkg-test42 description]:fibonacci.suse.deSuSE-interntest42nolicenseroot@FibonacciUnspecifiedlinuxnoarchpkg-test42-0-0.src.rpmpkg-test42    rpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.0.4-14.6.0-14.0-15.2-14.14.10-0-O2 -g -m64 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tablescpioxz5noarch-suse-linuxutf-86632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795?7zXZ !t/{] cX˄ x[dr#B+O(qrtpy z.Q|)K YZ libzypp-17.36.5/tests/zypp/data/RpmPkgSigCheck/unsigned_broken_header.rpm000066400000000000000000000132151476576476200265020ustar00rootroot00000000000000pkg-test42-0-0> )lp d6768447e13388b0c35fb151ebfa8f6646a115e92ce9f41bc0de68b4cb1aa1e18c1bea43dfaa01299ae61ef3e4466df332c792e5t]-+&}|>"P?@d   $<@TXdku 3(OXXY\b`defl<CpXg-test4200pkg-test42 summarypkg-test42 description]:fibonacci.suse.deSuSE-interntest42nolicenseroot@FibonacciUnspecifiedlinuxnoarchpkg-test42-0-0.src.rpmpkg-test42    rpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.0.4-14.6.0-14.0-15.2-14.14.10-0-O2 -g -m64 -fmessage-length=0 -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tablescpioxz5noarch-suse-linuxutf-86632dfb6e78fd3346baa860da339acdedf6f019fb1b5448ba1baa6cef67de795?7zXZ !t/{] cX˄ x[dr#B+O(qrtpy z.Q|)K YZ libzypp-17.36.5/tests/zypp/data/Target/000077500000000000000000000000001476576476200177215ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Target/product.prod000066400000000000000000000022361476576476200222720ustar00rootroot00000000000000 Novell SUSE_SLES 10 0 i586 sles sle-10-i586 special_edition A43242OOO A cool distribution Einfach genial This is the coolest distribution on the world. Try it out and find it useful. Was soll man da sagen? Einfach toll! da de http://www.suse.com/relnotes/i386/SLE/SERVER/11/release-notes-sles.rpm http://foo af libzypp-17.36.5/tests/zypp/data/Vendor/000077500000000000000000000000001476576476200177305ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Vendor/vendors.d/000077500000000000000000000000001476576476200216325ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/Vendor/vendors.d/ati000066400000000000000000000000451476576476200223310ustar00rootroot00000000000000[main] vendors = ati,ati_new,ati_oldlibzypp-17.36.5/tests/zypp/data/Vendor/vendors.d/nvidia000066400000000000000000000000461476576476200230270ustar00rootroot00000000000000[main] vendors = nvidia,suse,old_suselibzypp-17.36.5/tests/zypp/data/mediasetaccess/000077500000000000000000000000001476576476200214505ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/000077500000000000000000000000001476576476200223205ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/000077500000000000000000000000001476576476200227675ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/dir/000077500000000000000000000000001476576476200235455ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/dir/file1000066400000000000000000000000301476576476200244610ustar00rootroot00000000000000this is a file from dir libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/dir/file2000066400000000000000000000000561476576476200244720ustar00rootroot00000000000000Occifer! I'm not as think as you stoned I am! libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/dir/subdir/000077500000000000000000000000001476576476200250355ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/dir/subdir/file000066400000000000000000000000331476576476200256730ustar00rootroot00000000000000this is a file from subdir libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/dir/test-big.txt000066400000000000000000000157371476576476200260410ustar00rootroot00000000000000Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/test-big.txt000066400000000000000000000024411476576476200252470ustar00rootroot00000000000000 7135 818dcbb0bbb033aa8b8c9ddd269648d2 f69a3e53751eb3249c3c36c50290b8da edf0cf52765c9b5cfeddfd83b62f8517b119ca77 b0343a8ee06d97c9786b65bcb64c49fbb7e1d517159fac4633ba56f7a521fef0 202d21693dabe53ff5f2305d6b78844ffaa3b566b9644d61ca087cab752965b16d6a188def7a9463b5f17fdc50b3d105 caf260dd5420a6a6df6a558eac69a901cd3e43dbfd37b54e0fb176940f3e09c3f96c7faa22e505777106ebf056c471be7556c8cba80331d6efdb9e763e66190b 77fc06ff936163cfb6c1b0c68cb47a295a5bf8e3 2fcd624ba2ad1adb2ff23af58049b6f7b062754eadd031b1 011209ae 818dcbb0bbb033aa8b8c9ddd269648d2 edf0cf52765c9b5cfeddfd83b62f8517b119ca77 http://localhost:10002/dir/test-big.txt libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/test.txt000066400000000000000000000000131476576476200245010ustar00rootroot00000000000000this is cd1libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd1/x.media1000066400000000000000000000000001476576476200243060ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd2/000077500000000000000000000000001476576476200227705ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd2/test.txt000066400000000000000000000000131476576476200245020ustar00rootroot00000000000000this is cd2libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd2/x.mediabad000066400000000000000000000000501476576476200247020ustar00rootroot00000000000000.media2 would identify the cd2 correctlylibzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd3/000077500000000000000000000000001476576476200227715ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd3/test.txt000066400000000000000000000000131476576476200245030ustar00rootroot00000000000000this is cd3libzypp-17.36.5/tests/zypp/data/mediasetaccess/src1/cd3/x.media3000066400000000000000000000000001476576476200243120ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src2/000077500000000000000000000000001476576476200223215ustar00rootroot00000000000000libzypp-17.36.5/tests/zypp/data/mediasetaccess/src2/test.txt000066400000000000000000000000261476576476200240370ustar00rootroot00000000000000this is a single medialibzypp-17.36.5/tests/zypp/data/mediasetaccess/src2/x.media000066400000000000000000000000001476576476200235570ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/000077500000000000000000000000001476576476200161075ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/CMakeLists.txt000066400000000000000000000002151476576476200206450ustar00rootroot00000000000000ADD_TESTS( EventLoop IOBuffer UnixSignalSource Pipelines ) ADD_SUBDIRECTORY( media ) ADD_SUBDIRECTORY( io ) ADD_SUBDIRECTORY( rpc ) libzypp-17.36.5/tests/zyppng/EventLoop_test.cc000066400000000000000000000053361476576476200213770ustar00rootroot00000000000000#include #include #include #include #include #include BOOST_AUTO_TEST_CASE(eventloop) { zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create(); //we should hit that timer first zyppng::Timer::Ptr t1 = zyppng::Timer::create(); //second hit zyppng::Timer::Ptr t2 = zyppng::Timer::create(); //this in theory would be the 2nd hit but is cleaned up by t1 before that zyppng::Timer::Ptr t3 = zyppng::Timer::create(); //this is a singleshot timer, it should just hit once zyppng::Timer::Ptr t4 = zyppng::Timer::create(); int hitT1 = 0; int hitT2 = 0; int hitT4 = 0; int executedIdle = 0; int executedIdleOnce = 0; t1->sigExpired().connect( [ &hitT1, &t3 ]( zyppng::Timer & ) { hitT1++; t3.reset(); }); t2->sigExpired().connect( [ &hitT1, &hitT2, &loop ]( zyppng::Timer & ){ BOOST_REQUIRE_GT( hitT1, 0 ); hitT2++; if ( hitT2 >= 3 ) loop->quit(); }); t3->sigExpired().connect( [ ]( zyppng::Timer & ){ BOOST_TEST( false ); }); t4->setSingleShot( true ); t4->sigExpired().connect( [ &hitT4 ]( zyppng::Timer & ){ hitT4++; //timer deviation should not be too big, can only be tested on a singleShot timer // ma: disabled as OBS builder have quite big deviation >15 // BOOST_REQUIRE_LE( t.now() - t.expires(), 3 ); }); //convenience function to execute a function later zyppng::EventDispatcher::invokeOnIdle( [ &executedIdle](){ executedIdle++; return ( executedIdle < 2 );} ); zyppng::EventDispatcher::invokeOnIdle( [ &executedIdleOnce ](){ executedIdleOnce++; return false;} ); t1->start( 10 ); t3->start( 13 ); t2->start( 15 ); t4->start( 2 ); loop->run(); BOOST_REQUIRE_EQUAL( executedIdle, 2 ); BOOST_REQUIRE_EQUAL( executedIdleOnce, 1 ); BOOST_REQUIRE_GE ( hitT1, 3 ); BOOST_REQUIRE_EQUAL( hitT2, 3 ); BOOST_REQUIRE_EQUAL( hitT4, 1 ); t1->stop(); t2->stop(); BOOST_REQUIRE_EQUAL( loop->eventDispatcher()->runningTimers(), 0 ); } BOOST_AUTO_TEST_CASE(createTimerWithoutEV) { BOOST_CHECK_THROW( zyppng::Timer::create(), zypp::Exception); } BOOST_AUTO_TEST_CASE(checkcleanup) { zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create(); BOOST_REQUIRE_EQUAL( loop->eventDispatcher().get(), zyppng::EventDispatcher::instance().get() ); //explicit cleanup loop.reset(); BOOST_REQUIRE_EQUAL( static_cast(nullptr), zyppng::EventDispatcher::instance().get() ); //implicit cleanup { zyppng::EventLoop::create(); BOOST_REQUIRE_EQUAL( static_cast(nullptr), zyppng::EventDispatcher::instance().get() ); } } libzypp-17.36.5/tests/zyppng/IOBuffer_test.cc000066400000000000000000000120321476576476200211140ustar00rootroot00000000000000#include #include #include BOOST_AUTO_TEST_CASE(iobuf) { zyppng::IOBuffer buf ( 10 ); zyppng::ByteArray t("Hello World"); buf.append( t ); buf.append( zyppng::ByteArray(" it's a great day!") ); zyppng::ByteArray rbuf( 30, '\0' ); BOOST_REQUIRE_EQUAL( buf.size(), 29); BOOST_REQUIRE_EQUAL( buf.chunks(), 2); buf.read( rbuf.data(), 5 ); BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Hello" ); BOOST_REQUIRE_EQUAL( buf.size(), 24); BOOST_REQUIRE_EQUAL( buf.chunks(), 2); buf.read( rbuf.data()+5, 6); BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Hello World" ); BOOST_REQUIRE_EQUAL( buf.size(), 18); BOOST_REQUIRE_EQUAL( buf.chunks(), 1); buf.read( rbuf.data()+11, 18 ); BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Hello World it's a great day!" ); BOOST_REQUIRE_EQUAL( buf.size(), 0); BOOST_REQUIRE_EQUAL( buf.chunks(), 0); } BOOST_AUTO_TEST_CASE(iobuf_reserve_and_discard) { zyppng::IOBuffer buf; buf.reserve( 1234 ); BOOST_REQUIRE_EQUAL( buf.size(), 1234); BOOST_REQUIRE_EQUAL( buf.chunks(), 1); buf.discard( 1234 ); BOOST_REQUIRE_EQUAL( buf.size(), 0); BOOST_REQUIRE_EQUAL( buf.chunks(), 0); } BOOST_AUTO_TEST_CASE(iobuf_readtoomuch) { zyppng::IOBuffer buf; buf.append( zyppng::ByteArray("Short Text") ); BOOST_REQUIRE_EQUAL( buf.size(), 10); zyppng::ByteArray rbuf( 15, '\0' ); const auto read = buf.read( rbuf.data(), rbuf.size() ); BOOST_REQUIRE_EQUAL( read, 10 ); BOOST_REQUIRE_EQUAL( std::string_view(rbuf.data()), "Short Text" ); BOOST_REQUIRE_EQUAL( buf.size(), 0); } BOOST_AUTO_TEST_CASE(iobuf_reserve_small) { zyppng::IOBuffer buf( 20 ); buf.append( zyppng::ByteArray("1234567890") ); buf.append( zyppng::ByteArray("1234567890") ); BOOST_REQUIRE_EQUAL( buf.chunks(), 1); buf.append( zyppng::ByteArray("1234567890") ); BOOST_REQUIRE_EQUAL( buf.chunks(), 2); } BOOST_AUTO_TEST_CASE(iobuf_indexof) { zyppng::IOBuffer buf(10); /*|-Chunk1-|*/ buf.append( zyppng::ByteArray("1234567890") ); /*|--Chunk2-|*/ buf.append( zyppng::ByteArray("\n23456\n89a") ); /*|-Chunk3-|*/ buf.append( zyppng::ByteArray("9876543210") ); BOOST_REQUIRE_EQUAL( buf.chunks(), 3); BOOST_REQUIRE_EQUAL( buf.indexOf('\n'), 10 ); BOOST_REQUIRE_EQUAL( buf.indexOf('\n', buf.size(), 10), 10 ); BOOST_REQUIRE_EQUAL( buf.indexOf('\n', buf.size(), 11), 16 ); BOOST_REQUIRE_EQUAL( buf.indexOf('\n', buf.size(), 17), -1 ); BOOST_REQUIRE_EQUAL( buf.indexOf('a', buf.size(), 12), 19 ); } //shamelessly adapted from Qt BOOST_AUTO_TEST_CASE(iobuf_indexof_progression) { zyppng::IOBuffer buf(16); for ( int i = 1; i <= 256; i++ ) { buf.append( zyppng::ByteArray({char(i)})); } for (int i = 16; i < 256; ++i) { auto index = buf.indexOf(char(i)); BOOST_REQUIRE_EQUAL(index, (i - 1)); BOOST_REQUIRE_EQUAL(buf.indexOf(char(i), i, i >> 1), index); BOOST_REQUIRE_EQUAL(buf.indexOf(char(i), 256, i), -1); BOOST_REQUIRE_EQUAL(buf.indexOf(char(i), i - 1), -1); // test for absent char } } BOOST_AUTO_TEST_CASE(reserveAndRead) { zyppng::IOBuffer buf; // fill buffer with an arithmetic progression for (int i = 1; i < 256; ++i) { zyppng::ByteArray ba(i, char(i)); char *ringPos = buf.reserve( i ); BOOST_REQUIRE(ringPos); memcpy(ringPos, ba.data(), i); } // readback and check stored data for (int i = 1; i < 256; ++i) { zyppng::ByteArray ba; ba.resize(i); int64_t thisRead = buf.read(ba.data(), i); BOOST_REQUIRE_EQUAL(thisRead, int64_t(i)); BOOST_REQUIRE_EQUAL(std::count( ba.begin(), ba.end(), char(i)), i); } BOOST_REQUIRE_EQUAL(buf.size(), 0); } BOOST_AUTO_TEST_CASE(readline) { zyppng::IOBuffer buf(10); zyppng::ByteArray b1("Hello World\n"); buf.append( b1 ); zyppng::ByteArray b2("Another\n"); buf.append( b2 ); zyppng::ByteArray b3("1234\n"); buf.append( b3 ); zyppng::ByteArray b4("6789\n"); buf.append( b4 ); BOOST_REQUIRE( buf.canReadLine() ); auto r1 = buf.readLine( 5 ); BOOST_REQUIRE_EQUAL( r1.size(), 0 ); r1 = buf.readLine(); BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b1.data(), b1.size()) ); r1 = buf.readLine(); BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b2.data(), b2.size()) ); r1 = buf.readLine(); BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b3.data(), b3.size()) ); r1 = buf.readLine( 5 ); BOOST_REQUIRE_EQUAL( std::string_view( r1.data(), r1.size() ), std::string_view(b4.data(), b4.size()) ); } BOOST_AUTO_TEST_CASE(move) { zyppng::IOBuffer buf(10); zyppng::ByteArray b1("Hello World\n"); buf.append( b1 ); zyppng::ByteArray b2("Another\n"); buf.append( b2 ); zyppng::ByteArray b3("1234\n"); buf.append( b3 ); zyppng::ByteArray b4("6789\n"); buf.append( b4 ); const auto size = buf.size(); zyppng::IOBuffer buf2( std::move( buf ) ); BOOST_REQUIRE_EQUAL( size, buf2.size() ); } libzypp-17.36.5/tests/zyppng/Pipelines_test.cc000066400000000000000000000307471476576476200214200ustar00rootroot00000000000000#include #include #include #include #include using namespace zyppng; template class DelayedValue : public AsyncOp { public: DelayedValue( T &&value ) { _timer = zyppng::Timer::create(); _timer->setSingleShot ( true ); _timer->sigExpired().connect([this, value = std::move(value) ]( zyppng::Timer & ) mutable { this->setReady( std::move(value) ); }); _timer->start ( 10 ); } private: zyppng::TimerRef _timer; }; template class DelayedOp : public AsyncOp> { public: void operator()( T &&in ) { _timer = zyppng::Timer::create(); _timer->setSingleShot ( true ); _timer->sigExpired().connect([this, forwardArg = std::move(in)]( zyppng::Timer & ) mutable { this->setReady( std::invoke( outFunc, std::move(forwardArg))); }); _timer->start ( 0 ); } private: zyppng::TimerRef _timer; }; // we can not use primitive types with operator| struct Int { Int( int val ) : value(val) {} bool operator== ( const Int &other ) const { return value == other.value; } int value; }; Int addFive ( Int &&in ) { in.value += 5; return in; } Int toSignedInt ( std::string &&in ) { return Int{ std::stoi( in ) }; } std::string toString ( Int &&in ) { return std::to_string(in.value); } // simple sync pipeline, returning the value directly BOOST_AUTO_TEST_CASE(simplesyncpipe) { using namespace zyppng::operators; BOOST_CHECK_EQUAL( std::string("10"), ( std::string("5") | &toSignedInt | &addFive | &toString ) ); } BOOST_AUTO_TEST_CASE( syncToAsyncPipeline ) { using namespace zyppng::operators; zyppng::EventLoopRef ev = zyppng::EventLoop::create(); auto op = std::string("5") | std::make_shared>() | std::make_shared>() | std::make_shared>() | [&]( auto && res ){ BOOST_CHECK_EQUAL ( std::string("10") , res ); ev->quit (); return res; }; BOOST_CHECK ( !op->isReady () ); ev->run(); } BOOST_AUTO_TEST_CASE( asyncToAsyncPipeline ) { using namespace zyppng::operators; zyppng::EventLoopRef ev = zyppng::EventLoop::create(); auto op = std::make_shared>("5") | std::make_shared>() | std::make_shared>() | std::make_shared>() | [&]( auto && res ){ BOOST_CHECK_EQUAL ( std::string("10") , res ); ev->quit (); return res; }; BOOST_CHECK ( !op->isReady () ); ev->run(); } BOOST_AUTO_TEST_CASE( syncToMixedPipeline ) { using namespace zyppng::operators; zyppng::EventLoopRef ev = zyppng::EventLoop::create(); auto op = std::string("5") | std::make_shared>() | &addFive | &toString | [&]( auto && res ){ BOOST_CHECK_EQUAL ( std::string("10") , res ); ev->quit (); return res; }; BOOST_CHECK ( !op->isReady () ); ev->run(); } BOOST_AUTO_TEST_CASE( asyncToMixedPipeline ) { using namespace zyppng::operators; zyppng::EventLoopRef ev = zyppng::EventLoop::create(); auto op = zyppng::AsyncOpRef(std::make_shared>("5")) | &toSignedInt | std::make_shared>() | &toString | [&]( auto && res ){ BOOST_CHECK_EQUAL ( std::string("10") , res ); ev->quit (); return res; }; BOOST_CHECK ( !op->isReady () ); ev->run(); } BOOST_AUTO_TEST_CASE( asyncToMixedPipelineWithIndirectAsyncCB ) { using namespace zyppng::operators; zyppng::EventLoopRef ev = zyppng::EventLoop::create(); auto op = zyppng::AsyncOpRef(std::make_shared>("5")) | &toSignedInt | []( auto &&in ){ in.value += 5; return std::make_shared>(std::move(in)); } | &toString | [&]( auto && res ){ BOOST_CHECK_EQUAL ( std::string("10") , res ); ev->quit (); return res; }; BOOST_CHECK ( !op->isReady () ); ev->run(); } BOOST_AUTO_TEST_CASE( asyncToMixedPipelineWithIndirectAsyncCBInStdFunction ) { using namespace zyppng::operators; zyppng::EventLoopRef ev = zyppng::EventLoop::create(); const auto &makePipeline = [&](){ const std::function< AsyncOpRef( Int && ) > &addFiveAsync = []( auto &&in ){ in.value += 5; return std::make_shared>(std::move(in)); }; return zyppng::AsyncOpRef(std::make_shared>("5")) | &toSignedInt | addFiveAsync | &toString | [&]( auto && res ){ BOOST_CHECK_EQUAL ( std::string("10") , res ); ev->quit (); return res; }; }; auto op = makePipeline(); BOOST_CHECK ( !op->isReady () ); ev->run(); } BOOST_AUTO_TEST_CASE( syncTransform ) { using namespace zyppng::operators; std::vector input{ 0, 10, 20 }; auto res = std::vector(input) | transform( &addFive ); static_assert( std::is_same_v, decltype(res)> ); BOOST_CHECK_EQUAL ( res.size(), 3 ); BOOST_CHECK_EQUAL ( res[0].value, 5 ); BOOST_CHECK_EQUAL ( res[1].value, 15 ); BOOST_CHECK_EQUAL ( res[2].value, 25 ); } BOOST_AUTO_TEST_CASE( asyncTransform ) { using namespace zyppng::operators; zyppng::EventLoopRef ev = zyppng::EventLoop::create(); std::vector input{ 0, 10, 20 }; auto res = std::vector(input) | transform( []( auto &&in ){ in.value += 5; return std::make_shared>(std::move(in)); } ); static_assert( std::is_same_v>, decltype(res)> ); BOOST_CHECK ( !res->isReady () ); res->onReady ([&]( std::vector &&res ){ BOOST_CHECK_EQUAL ( res.size(), 3 ); BOOST_CHECK_EQUAL ( res[0].value, 5 ); BOOST_CHECK_EQUAL ( res[1].value, 15 ); BOOST_CHECK_EQUAL ( res[2].value, 25 ); ev->quit(); }); } //------------------- Code following here is a compile time test, if it compiles it works as intended ------------------------------------ template class TestAsyncOp : public AsyncOp { public: void operator()( In && ){} }; int f1Global ( int &&test ){ return test; }; template auto f2Global ( T &&test ) { return AsyncOpRef>(); }; // using fake lambdas here because it seems to be impossible to use real ones in decltype() struct FakeLambda { int operator()( int &&arg ) { return arg; } }; struct FakeLambda2 { template auto operator()( T &&arg ) { return arg; } }; struct FakeLambdaAsync { AsyncOpRef operator()( int &&arg ) { return AsyncOpRef(); } }; struct FakeLambdaAsync2 { template auto operator()( T &&arg ) { return f2Global(std::move(arg)); } }; void compiletimeTest () { const auto &makeSyncCallback = []() { return [](int &&test) { return test; }; }; const auto &makeASyncCallback = []() { return [](int &&test) { return AsyncOpRef(); }; }; const auto &f1 = []( int &&test ){ return test; }; const auto &f2 = []( int &&test ) { return AsyncOpRef(); }; const auto &f1Auto = []( auto &&test ){ return test; }; const auto &f2Auto = []( auto &&test ) { return AsyncOpRef>(); }; static_assert( detail::is_async_op_v> ); static_assert( detail::is_async_op_v> ); static_assert( detail::has_value_type_v> ); static_assert( detail::is_future_monad_cb_v, int > ); static_assert( !detail::is_sync_monad_cb_v, int > ); static_assert( detail::is_sync_monad_cb_v ); static_assert( !detail::is_future_monad_cb_v ); static_assert( detail::is_sync_monad_cb_v ); static_assert( !detail::is_future_monad_cb_v ); static_assert( !detail::is_future_monad_cb_v > ); static_assert( !detail::callback_returns_async_op::value ); static_assert( detail::callback_returns_async_op::value ); static_assert( detail::is_sync_monad_cb_with_sync_res_v ); static_assert( !detail::is_sync_monad_cb_with_sync_res_v ); static_assert( detail::is_sync_monad_cb_with_sync_res_v ); static_assert( !detail::is_sync_monad_cb_with_sync_res_v ); static_assert( !detail::is_sync_monad_cb_with_sync_res_v, int> ); static_assert( !std::conditional_t< detail::is_async_op_v>, std::false_type, std::detected_or_t> >::value ); using namespace zyppng::operators; // case async -> async static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval>() | std::declval>>() )> ); // case sync -> async static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval() | std::declval>>() )> ); // case sync -> sync returning a sync value static_assert( std::is_same_v< int, decltype( std::declval() | f1 )> ); // case sync -> generic sync returning a sync value static_assert( std::is_same_v< int, decltype( std::declval() | f1Auto )> ); // case sync -> sync returning a async value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval() | f2 )> ); // case sync -> generic sync returning a async value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval() | f2Auto )> ); // case sync -> sync returning a sync value , not supported by C++: operator| must have an argument of class or enumerated type // static_assert( std::is_same_v< int, decltype( std::declval() | std::declval() )> ); // case sync -> lambda returning a sync value static_assert( std::is_same_v< int, decltype( std::declval() | std::declval() )> ); // case sync -> generic lambda returning a sync value static_assert( std::is_same_v< int, decltype( std::declval() | std::declval() )> ); // case sync -> lambda returning a async value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval() | std::declval() )> ); // case sync -> generic lambda returning a async value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval() | std::declval() )> ); // case sync -> sync lambda returned by a function static_assert( std::is_same_v< int, decltype( std::declval() | makeSyncCallback() ) > ); // case async -> sync lambda returned by a function static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval< AsyncOpRef >() | makeSyncCallback() ) > ); // case sync -> sync returning a sync value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval>() | &f1Global )> ); // case sync -> lambda returning a sync value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval>() | std::declval() )> ); // case sync -> generic lambda returning a sync value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval>() | std::declval() )> ); // case sync -> lambda returning a async value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval>() | std::declval() )> ); // case sync -> generic lambda returning a async value static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval>() | std::declval() )> ); // case asyng -> sync lambda with async res returned by a function static_assert( std::is_same_v< AsyncOpRef, decltype( std::declval< AsyncOpRef >() | makeASyncCallback() ) > ); } libzypp-17.36.5/tests/zyppng/UnixSignalSource_test.cc000066400000000000000000000072661476576476200227320ustar00rootroot00000000000000#include #include #include #include #include #include BOOST_AUTO_TEST_CASE(signalCatcher) { { zyppng::EventLoopRef ev = zyppng::EventLoop::create(); zyppng::TimerRef secTimer = zyppng::Timer::create(); secTimer->setSingleShot (true); secTimer->sigExpired ().connect ([&]( auto &){ ev->quit (); }); auto sigSource = ev->eventDispatcher ()->unixSignalSource (); int receivedSig = -1; sigSource->sigReceived ().connect ( [&]( int signum ) { receivedSig = signum; ev->quit (); }); sigSource->addSignal ( SIGALRM ); sigSource->addSignal ( SIGINT ); // send alarm to our process alarm(1); secTimer->start ( 5000 ); ev->run(); BOOST_CHECK_EQUAL( receivedSig, SIGALRM ); sigSource->removeSignal ( SIGALRM ); sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 ); } //after cleaning the event loop the sigmask should be normal again sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 ); } BOOST_AUTO_TEST_CASE(signalCleanup) { { zyppng::EventLoopRef ev = zyppng::EventLoop::create(); auto sigSource = ev->eventDispatcher ()->unixSignalSource (); { sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 ); } sigSource->addSignal ( SIGINT ); sigSource->addSignal ( SIGINT ); sigSource->addSignal ( SIGINT ); { sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 ); } sigSource->removeSignal ( SIGINT ); { sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 ); } sigSource->removeSignal ( SIGINT ); { sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 ); } sigSource->removeSignal ( SIGINT ); { sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 ); } sigSource->addSignal ( SIGALRM ); sigSource->addSignal ( SIGALRM ); sigSource->addSignal ( SIGINT ); sigSource->addSignal ( SIGINT ); { sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 1 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 1 ); } } { sigset_t siset; ::sigemptyset ( &siset ); ::pthread_sigmask ( SIG_SETMASK, nullptr, &siset ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGALRM ), 0 ); BOOST_CHECK_EQUAL( ::sigismember( &siset, SIGINT ), 0 ); } } libzypp-17.36.5/tests/zyppng/data/000077500000000000000000000000001476576476200170205ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/downloader/000077500000000000000000000000001476576476200211565ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/downloader/auth-http.meta000066400000000000000000000035111476576476200237440ustar00rootroot00000000000000 2148018 7e562d52c100b68e9d6a561fa8519575 52cabd59ecb55096447322ca99364d50094997a0 9916af41e079f5758d62f7bae3d74d8c5f0557c1 852e21a1e914971c0544253e5d8f853b181b13b1 f4cff1a07588a9ea22d8c193f75988fb00c45306 c4ef102565900f4f6669ab8596bedcb1ea6f1451 3cf13de7699c8a97e0334b4c5a1982f28d297f0a 489f0546839a4cd49e0eee1738953b327bbb4bf4 d5739177bc6adf319988055388d20dc0908aec27 a29de2657b5bbfb9da52d44858fd41eb09d972e8 496bdfb70ed41fa5d98ae7d94843206f2578c328 http://localhost:10001/handler/test.txt http://localhost:10001/handler/test.txt http://localhost:10001/handler/test.txt http://localhost:10001/handler/test.txt http://localhost:10001/handler/test.txt http://localhost:10001/handler/test.txt http://localhost:10001/handler/test.txt http://localhost:10001/handler/test.txt libzypp-17.36.5/tests/zyppng/data/downloader/auth-https.meta000066400000000000000000000035311476576476200241310ustar00rootroot00000000000000 2148018 7e562d52c100b68e9d6a561fa8519575 52cabd59ecb55096447322ca99364d50094997a0 9916af41e079f5758d62f7bae3d74d8c5f0557c1 852e21a1e914971c0544253e5d8f853b181b13b1 f4cff1a07588a9ea22d8c193f75988fb00c45306 c4ef102565900f4f6669ab8596bedcb1ea6f1451 3cf13de7699c8a97e0334b4c5a1982f28d297f0a 489f0546839a4cd49e0eee1738953b327bbb4bf4 d5739177bc6adf319988055388d20dc0908aec27 a29de2657b5bbfb9da52d44858fd41eb09d972e8 496bdfb70ed41fa5d98ae7d94843206f2578c328 https://localhost:10001/handler/test.txt https://localhost:10001/handler/test.txt https://localhost:10001/handler/test.txt https://localhost:10001/handler/test.txt https://localhost:10001/handler/test.txt https://localhost:10001/handler/test.txt https://localhost:10001/handler/test.txt https://localhost:10001/handler/test.txt libzypp-17.36.5/tests/zyppng/data/downloader/media.1/000077500000000000000000000000001476576476200223745ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/downloader/media.1/media000066400000000000000000000001231476576476200233720ustar00rootroot00000000000000openSUSE - openSUSE-15.0-x86_64-Build267.2-Media openSUSE-15.0-x86_64-Build267.2 1 libzypp-17.36.5/tests/zyppng/data/downloader/primary-deltatemplate.xml.zck000066400000000000000000010303431476576476200270000ustar00rootroot00000000000000ZCK1 ){E&(~%^ifʂflҥ7l0a3O҂:"@=?SxڃFJgoUϭDP_aB" % ?bb2@U<\<}8Nn/ݔ`)5jmZ,oŵgǟL3-#PpgP %hP%.7г?K-S>@R/̾~}Wy$V|7߿$I0멓¬5%7(5m*Y C71u &K'>41u!ɜ11,w"FAT:>(3ґ`95e׳#dD$_.pB+y)M͞R5pBgv&4*!SpGDtiZ g5kԼDآCԄG8%&Zw+y]!әmZNT$, 'nSΚ#)˝/8@Oe#|Y ",/$y"37ڏDSH]c7_D_m{39̔A=2z1바VYg8Sc߯;:/׎Za`.|3tj^gO*fo uΖ#YSP4Sd1߄}N f%o Cmx ML%`/?1t G%¼/O"bUqG?Cde (*n}0r1[ucog7@*-M~!MڒJ_@gh_~)D"0qinG*B:iPêqSyG_x<օs&҈D]CC+U:leⷪ20s=Bn?3343u_fMOh@0ΚptQȻ^!naeS7폹`(q>HS7Wm ho/^`ڔ?ߤpDM^]ʴ,63R~lIGs(/DC:T{ n _>w[WO.YcFoim:P#M Ы0k_g*'r2Fx8>P1>5Լ t^&)T GS»9K[^\I 'm Uf <`Gz[@_$jYVymXA],)S mL<T|gAS ׬9'ׅ;pVMIF"6 =PX.#6USةVrMQ\amJGFn8Ά 3lX3 RP wpA^fVd<*=8{d&LvQW :!|f70 ?Ǖx{#9$ :D1\_9p_zGh=}5.wx;8&tDSC&'w!d#)FUۅI*').\{B-t!' +%2sLRmoEN5S1c5[ !gzxQFheF nXǽAU6HJgLo=KD]aL-{  Ch5O- B%躘5BO-'b `o3;~˘N| ogL„;$ ԈWnoGN'D-b9,nhX{,r؊'A8諏2,#p&D ^&L;uH Qvǀr5/ՀoqBYDVY3*j2 f:x)IZ@}95`L_;cGas} Cy; ?tı U˭ :c75 U&3 ;|GKL7!>-Q9.EťOπ=6dԊvvo`ZR#"d?9݈"DZweuK^#IWJ]vxTs~BC}VK\(++G +\C~ څ8}ܕ(K`[ȜV岕C, =DiG_dԀ)s1cOkYjrsb״7T$HWɀp\)kJnb^&\gf`2_` W U1z҅(9|MSϕ⮼LifIWF!$E'6HeTV5Uak8ZDL9aGRe\'I|(W w;LBYsziQWhFW6b~@~oF OycmV _6րiGˌ r/]k?Nة^-vJ5P; QmxPw,3Ř)\f^-[MG{ka)F)8zPx?T3Q]ON5,̩ZF"[ub1Bv׫T”01 S%x&aMHqdG!\ CJy~q)"4:1: 2kU >$:r) ,aN~}Z;SFeAl%nK}Ѳ(mbKYСq׋Y?r9 )k} Oe+/*A-4&y⚒qKW!1ZKhZDgMce*{EeMntYzeqbWcQaԪJhg5D+ahntwQԛ؅XC,a~8WD;s'!]?ܚ;ùx~SM!04n8F!AlP!OMk`w_ ۻis4Ĉ.oX|*kw/H3rl|>.P?? f:Z"\XM7^gYɟ)Ə-WbPQ_kˠ=$gl*a ?iY`|uȂ ajgP5JoHFjoy֍JL]J/q 404Y2tt^oᡈE\~Nְg`}J^A"09di⽚l0 8BT%"Z,TA6{g`f0hwb>g>ziX7ޏx8z7M. Zrlޞa* $2 w<@'@'4`u5|`KsJ7RF% m*g:`A~Q$Irk&*R^J[Eּh@uN7)=وkE(K/n<(Y+& k{}i}HAɳ!38b|%H:$EfUDM-Qv¾r7 8-'RdA05xTNKJUWjŸu~wYt_ ZM,7HPFHUEeWo^ZR;MN^Q&/+r& ' ǂUX} 0SiVX{4lTWaN*? ŵA[;{qmLIC]˪Hnq+ej}N}<- /.[PP)M"0LVJq4"w?{ OG8*%.HH^QT 9ŗ>jLcX9G^ĘF@@S}/Mg_YC3FO1S,;Jeq1:pւ7|fxuiTP$XOȯGiDtғ: ФDZӦ]"ӈ.iqo7sKB+`hTǛ+&Êu!ܓQtl&m٣ &|S %c{2}jùIhme%sʂ:" p Y 70*hgj!v 8H*68\fn^gUL ]DWhZ`X |-ZtV]kWPLfXFkVMalPmo[Q7G\evt0+w H-ch\x6t3bFAw2P4v^8+NٲiI7%i9RhOj0N+7]`Ḡ-!+lvŒZը*iM\{(e2T J3$)sU8Nhe䁒aE6u =i'f{AXc5Iχ/h& 6IJ ƒ̃xKee0sůIʅIrCT* 9@ UJK.smljB Gz|4Ggyq)u`dO*tQ EF_v<5Hg8~0B-EUmWàzNe>Jݧ4rVԫ;phhjB[74L 0c{9l @9ж&6,wtDQ J^-^L8t?sݐ!Q6ht$3 $wyjmj'NpIP|q/S^]H<1\ %fVgk`gKkpeTn>'@Imz {bd0CMâ,ܽ.hf8KT'r([6z lBDoţD*[K)1i.$N!+!*ƗLQK < z){+qA猹jj_.zݸ^VVZ1AVߞT-1pn >.1Y]=K  32̤v,;ň|GOj ZMYIN=JK&nB}ʞio!vf|i6תIa2s3 'f>S)fq{hv?hj]6h&Da.No H4z]5 $ erypcэeS"E^ GBq@Ţ5YD$3(!4D}*U`4Ҟԭs+S0J;3PwYaVO0_zp3ȇJpv,_iP@iu5q`NYJ|u)Bz:c?ތeFZ'fY:1b-s,錟qe=JKZ}W=Rh H"o/($_p^h ~+y9m$&HP]M/R2[#xv4ܤw"9##z‡\vW%-lŁ6)\6%5\́5]._2戰c^9wGx$<^Q/ngwIC܇<֑Z{)FS@ ᱒qv$tSAD;lQw X Yw] 2"qFV <ވ*߻o$WKг{dڟGL2L4:[/95@{}gwO䚁&-ӄr0E_@|nz%|Zg%IG‡$F¡IM}ٳs1> 3H[bB.-{7(>vw@z%C%I=sc%HlΚajt}2Ї@FF(0/n; c7a(:5I=QGeJ'B as~0og@GQ!IliJg EPR2tQĘAdL ie]!|'0, Þ[B)a̫WFPIv=Zok|D i9@K,GG]T $sl yD[|O'cNbF o)8oqBEy=:,oS5H3<`$s%2EY%i~#w XftPy{&P*b©BƔ+ [GgN/8I;Z1^ҧ(F@AIe wNEHU@t2 QPDYS'mk2z*=QaEQUBI+[Z.~NT֌VǨ4\HU~@|u~zE/`XF&8-P.35EB~⑮6ZP4_h?(\(6 LױcG*G@Vc o&lkayr I T@UD~v~)@pTzѠ{#~Q l| J3770Z@FU} owZG I]Q3|DE R*k;Q>} c"@cSne~U &ӥ9c)|%BJ4)#dnfG:{*ڠ˴4as,%[W(l0lRڋWPbN1 ͗> Mn6@z ӎu?ҳ)M90%EasL6džA:SzAE0|6}!?8*I( qׂxnF ^(;I)0obYWAr_>V;]Z7MzJqc!?t3֤# de8 yNA[j bU;̔H $.C;o!ӍbG *<=XB #2AO]!7%WWl m.?s/Ko#ƅ$\Vf.2| O4g!Jpe@l<}[.|\fi: qx<5* մo' qY ti `}ӷf mDa n7Yo zdXB#C,d1|*46P@T1 =u Fj衒5?_o6ALϋ}f/#s!-)6яd ..}L NQ&Rm>=K9C?|~n͡ $ #_@eڽR.wLR>tu}P%/]qnV";+M:3G)vg1)&lb"`WVhJo p#w8M?fG $KM{PT~ۙ{pgY>A0]WT UKO]o !`d99AfZ9k[28d(ƥ毟;+ӧU޾ /6eIV_B1/68J~2>G_msO˒aaN 5?6m81%> nH)] Kp?9к8@JC`GTza9;2Wwl-Dʛ7`K/qgߴNg.θ7EG0J4&6P`XeGnW'`"eN[$`rw]WHQi5ANL,<|3:dX T&ǃy'D=y<7V23lݯ0(mB>`Y{J./CδT. Y|ÓMA*~+!8ЛT};ÿvAP]2G+s?EA<+1ehPg4Q/٧B:+`xlx)A:ti$"M KCGo^L.q`LjxGU%1~rt8́1+J2bݛ,K ~76 ;0a"0=BC?cu8^ yr;6<*rck~waxlb ¿,|LoQex(}P"yRGO/\ Ors%,(ͫM0[#v ǹh3#L O`ji-7؞g NL/u""TLF3Sf\TsRgR1cGA *[]FnBs5{mrsw3cq (7x|"\e\@|m5^C'coe &/>h=j]b]F|Au,Wg Zg0WU?uZ_AL5u컿Y.(/ uFpi[6lȯ4 5x@n_/=LxBق X%[e1<0:s+%BKɀs"Vw^Of<$; U7Vk2v8uI(/`;!P@˜BMKG%<-6Uit9 {133i}4^ 乽䶑_%L !z>jW»M05ݘk ,(A˰$=]q#);ª\|ˋ-Gs$˱14ͯ)MQKtW SPVr/{ͽٰOgC{s,K y%a(Kr-DD%X%Y0_9_ɔe5_C@ BØ;neClǞr#x7@ z!r+NZ7`ʪ?,PXoT _Źe`4\i!PFn XċC6\&3QXwּ| 6;&`En -aCbglq!uRK 5(/`PFP4Pgt!1ƤͷNWC؋dmoc&6*++^H齲P*ODӮ,>IMx`6v#ޓckKSN*N\WAa%)p\c\Z{ϐK}kQ6y0Mi\.t0/ȭ[XH~J@i/%SlgpFU.2my 6vh0kYEY}h\e2?>(/`0 ֓= @gd"U4; <'В^㯙 j\553H3zmEGj>>s|Wjzf^vԘ FIZtq~i 3( PV5R?tD1eQH-WVXRKUA-'}fn!|efQ[J"8/'^[+_ cJ$Ҏ8RSa#|^!J( 􎣇 I6c.NR!Cc  $Oв$O+VWaDT=haA!N '=ѵ^uu,tb0eoRbY-bpW0(/`V 0 en-K.iv\PBkC5MNMLJb}H:+huZ ѐ~Ng̜O{c0 6[ħ1d eF<%(ЯZ=tWZO0wIQ8e=NJP20@ @)Ubi yOޙa!GybNZ?LٹhI)3q^'n3\w }b.>TsMUHL݉W|'}&5(sI\Q",N,tڱ D/,V!u?꿺{boj~iWh4 圵=40sD"r'2u$u¼sY6P,X"v*D@&@׶iq{_P^V.WċŢoWvZZ ,`\:(/`' 6? @ m('Ii=EIsc!X"qk̄ݧNFH1Րb%J))},& ]f6Bg  $ $'x #qv 6 ^.v ,g4h#DX}΢m0(/`= 6M @ 4#e{co‹:C A^5EDCa,Ye1OHNeVͥ:m9z FTB!QZE-<(f )UoαTkޡm#Y; @pPc(11U+v2+YvKEi/*S GHz=S< 8&cUCP:vهTK((8‡cOjH qu(gRʏUj (`Cv?uE.B{=BB; H su\ؿb=S32N, %cN>'gM%2clj-  ; D`hڀT~߰q}.0iq;.HeV H EX]A잌pXGO!I(/` F]W$m 2[?~b]?s@y3 HUzOSH{m] 8bifBOW⠇PHe(xpplŢL5A46E[=V`PfYW3,AEQTPQ8ʁX5o4Q? `&qEh&%Aq8~@U'F&$l6?dyG94uoFm;ewEy{(Nd #-t2kŶk8x}D 3iȌ2iNmdm]dV6*=UmVH##($`7f \dZNq +uluf0s`H*ΰqزmnqYhIlhK ڑ]7; |qҮ+E6ǥnf|o%ZG*$>d%X4skL* Q M)eqʇK$ް73:*ޣp%$/|RbiCB-m(Sߥtp/ ; uTJ;&m|Y)XS(%N*YRkS3_7~ܲ ` # g ^_~w!d^v 7;lL+BLۖ7NH7΅57⢙^f͇4$a>y2,c (/` v]X$ X|+YkLpNeqK4ā@aQUH%9@Mbqe8' kr~䦟8Ae({@&n(.cM8>+uaƦ.5:夵S2˺ڑkTW#JTAE}@s!"hhP "DM ApeV(NۿVo6oaiQ>rݛQNٝ.dF޿)Ji;Gjzv!8(`J»#5t2kŶkr8xэD siȌ:iNmdm]dV6*=yUmNXO8 #(`7f \dZB.y`s,\K*iaqIm$@6IcR$rhAa\(((/`X$m)8|hHK9x+ \NNM]+ N b \ Ҏ`^qHJ"ysl׺mÖoqߜpyD$o .B44>oꗋ-Iz4)Au?2eQomiLSʥ l/a6vvfY4ͻ&d Rq-J.u4M;Rup5/3f>Uɻ$r1zT=zbTIdl) pSo!Ȇ%wxe >RX`1#iZk.(/` V 0 ec޼e%-֎ JʖR}E4KMNLW#M99sICfG4z d$Exr<.'; b|sS `ؑqS*C#?P!`}&ǥ<4GڙatYbFjAҌtJauf CUA|]N:ID3j`0cPoKzq# 0GF!\];هc8P8ۼzdrҚd1KI =˒`Jc[t <nvk]5E{]BB3Q݌K03 ]5q<$D2@ra 0r3 PeAXV}ubH#2CCCCܬ(!\F=w!`hht$1V+]Se%(B|1,?T *K>›Ci -C+ EgKNy.B{ĉu¼3; AF?h݀ @״ߖiZ8H{MX༗J#1 ڗ0\#(/` :!@i4C(- оL=:Pk9˰50229sZ1B#jw\ 0bTm.Œi#Iyyx9;9}=pH#_ ݅ Q}ZLYY]鎝ۙ>K4\0tT $H 7.4h#g fB#7l+@0(/` i&jȦ:v%*!,,uptljeꯍ)s8Rzq '$|<==ʴk\G"&5G&HzΈJ(GdM/"DGTb8U*o-nx z-Ό{jp\; CPP@yߵV?8aޘgp@g3lq*L/= Rl9-[Tk I h2S-ߣf{{m"j68US??6r*VŢAZ Ij*'2{`$ 7Dm)$RaKj$q|t<2g6ڔZ @ +{c/[4`,׆8Wyg4s)DC 0B`(#˓``r  Er` ţ,rz2R6Y?9hb-^8S,.k+#n[<Ͱ\C%Qv6fA "GFD7JK'Ӓ{ [jJ:ki.j1]̦ǣp<5׼ %l-P򮢃 }m. d%T CEK4Z,HЅ9l˭|[<è41 (,]$iZ33{hg0\t=o]7b(]>CyTf[aU?vo 'M a+K !C|@A-Wt ~ 76oP&z:oV';䢾bm~k{1 BüRA&p 1fHI1F0$-,Ck"qFdXф|C=Oi~r\Sr8chƁE{êeWMLŠޓ=yhÝrՖN'}W S/+Zs%Φ Za ï>44 0B,+&njG-ɠL5'%@@k //K +t~c,eo\M0VCޞs-L81w]rjOiyA0HY$(/`u &=Pg0LM#ԋXk={584JmNFjyRCec?kxi&_On`sX-OgwRL fFȟyG+Te)B!'ac"\R(/`$- K!0 (amj\=ٱNmu6dࠪCDAu#r(~OK :2CKo{"Ŋ##,/dY(liZƇm)N1)  AReHX 9`b (0]g;QHqAGSCZcCD6|{vzr Єo|?圯D.P.f-HtwXl JC5$,Jԏ5PgޟrZ~~wE^^0W!(J4+ ~én/ B,5&A(;p- n&ܮP2S<ڱ*dGKYfmӫC6 }j7xʜ*No.|-cf[M(/`M <Pg0 $ɓFI^5""(02{463HJ0J(y>鳜'() FZ]%PBv8} ?9|lom.[ l;(2ۣ`mzjY 7:XhmP;Ҳ#L6_K;2t ~Y*]M1"pLN-t5ՠJ-[r 8̲L02 B3MSuB<*0: Ċpyak& 4 h nO20Sp<б:eG4y6Y&b&W`m }oH9kKc&6ߍS4^к +J߇Vډ BP 4;сqؓ4(q8Z9 +$"_h7T;^=} k}(_iS.gp\4#8TDڊ:.Xh0mUkε`JS]*‰KA(/`Su 6YL"PkнǖނA?< \4fXaCACy.r`0 f?H]eU]S8?at]df8R]cnZ!}R`強~`=UWF̗,ʢ0I~ߣ-6X](Ej3 v{]itiٕͦta6@MV۞^W'`Ir/ȑځB{`MIM]wpV{[nGq= 3"5GL/(-%v΂8DgI9 5I_ ) d4HoEyO]>g/ʞKV&FCñgp\4#x$Dڊ:.Xh0mU͵ZpRP(/` E PKѴ @-[$30<<>J 0b "u|;HxQ>~9z/0J]zs 9У.Bc>e;MN2ԶyUl%9sYEnxPsN*QŞʗT (U/R$CCnWB:Ѽ Ph r$??Fήude1ZQ쑝(_7ˉԻy4.QD jǒ# 㬢q\Xrw5qLKh^ƈMN)q[&w6]|*ݶvlzf8a4C~ RK*(/` -6]$0^2[!EFKLR9jh˪3PEy9Tt RXQI&s,QXI{f)| w5Xw]i-o;4R&zd8QFْC"-8A|V꺄'3 }SgMDnKUQܤ, RŠ6Ѣ1A=qrG apO8?^@y&1rPa$)PX[]Iw~.\. z;Ȳ*V2-wUUѥ!, ̼+&"x'?ee݉mc ʹ)JWK1cLi[iY$*ʧ*nk(K|Q2ˢ/Z?e/(F=5= &lP%xԘUC" 3$'_s۽e ch: #Kƅdhv4gW Gh}Pbi@A(/`MVR"0mFM|II)i~8xT=(T0IJG˔O8XGb`i XsU^5%F5J! i)N'TטVy?-x9!+ >yErHPpFsKW̗0BY=% heqY4"+N-,%5:AO^F XEW(P0J؟G/;9J+48sx5,p{}/-LO5xPqkG[x%G)WVLt hPaG3 BN`.M2l u/@% erf` ޙ .@Am0x-mY4r%2{+D{ s`ր.\(/` -F]$0^2[!mEFILR9jh˪ @Gy9Tt QZQo2] ΊN0Ik(gEv%VĵQ>@4r@SK5:k9.тWgOxjP:k o|K}m^%!M`O*V7'($ǣHp-;gY8Z@ԜH q:Za_ՕtZsp)@mg?9KQ"Xwu+2W5K˨J:9eawO䧬;I6VP +!8|uK1y}^cLvi[R[e{35w@ >}RfG(U(G,e.Ú\}תV,.(A5<"l(k<k #HȄbUp6o)dÒ9†08Z3 7-d$fuw-%+(/` B @hT, 1{HxKfVUYz]8;9FYr>e#9[B}$WU\mwGrӝ9Co~R"t{tDx[w"2,5T0ڙ(L?$&U(f\eRL:0gʈ$P36X-y[՝ :q(go)eH6/׭rNaMcRS=C,'*|݁u{Ǐ,, 8# $gp5{,};: Y] ۖl[-oD :=֑jKit(/` v? P n0ZE8c ;KPd2686*\+XVcVAZ'~e0t:m0 +yٓa68KV j veX)⬃xKI\GW"?j{EKZV3ڏ"q Kk1T^. 8OUN¶k00ݑ Oqa;彣)Q^bKlpp&ԍ[/A,}>3rzfL) (8b=@W@,ٜWXt,4ȸLvd+ a]Х(/`9er$r5!41ƂʉU:Dd&ɘ1;gr8hheU2R2ZQ0Q8hjk[01A?jNVLj.JH 4"ԶNZ[CygS ܾ00}V} t_Eֱ5DzPj H+_ODAR_g,? G|sd]13Hִg\'Obg|JQHP`׿6:O)wNزWϣ[ {*o9|{ 4.-v Sϕ Xq#$-U&DHHo K B`'g &K'l©RXXԑHGG@ʣƤ[& ' ؍m@4 [1\r`@V ,[IAbÏP Ό{ ZpkY9E+t HvMa CaRvdJ8_Ht mx&2ʓ˰N}Ԓ2g(/` T@!@I kK|$2v\)E9ER;578O\ъƖwYc :SwP/KCIpj[6㓤&lq{U쏌ZZ%5C#0LD> )qv  "3k؜GAwsWі~_&@Kv4%ƛ贉y s9!M'uCP4K~N[CA>vbSqGSN1S5&t!otҧ\s|˖E?$WN BbU^+*euDr8*yom)g+WVp  L['q+E4}ok= $lq^,Q–Տ$vdChOx&!֑Jt?ux  38tk d?7JS^^swӢ@%E0IOV.䐕9* *wtȈwT7R.nOo.zzra'8%f0q<_<7wƖfeY߀͒>TJYOP.Y NX`UiȖG zZC÷B׆ `hRHu!lpw:-鵷VI?f,(/`:^!@K$AFrQQD?xc UTTTH,dY|,$Y T(e ٣'GءUgӺ5gx{OO)2Dh_.lk{pWv$8i)u[oI;(mviQKVyaBJѡZJ"ae5wBgl^0ⶳF&=|VRKVbQj-̡:8Й3Yrϙ9T=䙰Ur N#{=1`i!_=h.>hrOPS|d'}$ijjbVj>P#;v? B;n(} 鍖 [ʅE4N/й0,7wƖ geYߐ󏐛%}iR)i>JNzn8, fY`i"h =d![kT07):0l8[:GY炅BM k(/`AuV"g#0m6e5FtSr&4Yto_уK\_ZGq\w-7Ma0Y^m3ÐdNcFi ?.clþOf&dI!ǍSw> [ > >ن~m݃COOR^)(TN&O1BCreֺo>u1LilXL$Mk4cQ4l!.iIs(HC+< ;=X ͲΘQ+rRЯ͎, ?2wzK[hw%OB7P;x[58DY11kx!˵k80PXHX4x~K>V4]V:DD(I 1j"`0jYeTc%`3H@$@ B`,$S/ D(/` V<@foyHs{?_JHbE364R|2 9x&n*' Q#,TK>nYy{[B|Yˉ2^ma>Da ŊȂh9^GѐXױBp}.x%†sscH#k}Q1՘ElVZL'c A%D%.հA <##[\/X(08i(/`r  eJ]4Qp $"@ili/q-Ya9U+MFZSCY\~"w\:OUEBĦms$w(D9ql{I!eI|Jw Oiw6eՍԷ͂h_|AM;l2$0ԡQw~66 wmOħR}Oď<"m lbl egX ~P[ S, T$|b&(oޕAVڒ  (#Z~b/B;z ZBJKyyz(8z+ش7 Y?t v?l2(WVfOl^glJP݆_]搗5y n],[u)gF֤.1*!~u%~RQB 0B`U g^-(]:`rx<4B01;^8աFlaQ鈁*2倝tgyC<-6 )bOƎ}1{T )975[\28!2>(/` = PGcA75UT,8"*Kb$j364:Gv` x?LG>To!=Q}Mhh_ m@blE0`HeŔ煦h}e ((g` jyOB2;Tz<|YIxA=^eV\8ZfIsR6+QBv"j V%z20foΏ2?z);1BBVs 8Tmc5#hqF-K&6OQw4=cj 0 3f\ԭ!I0yY#L=XKƩdlpFv9pkbL{SUm!jAAq\]BӀ)H? { ,rD?uFzj؉Iisu ԰Y;2S;F#h?fܩU, ddFN5FPZ)7l K0y68o@;E7.j,Z{O,p  jÈ@R!Q>13/c (/` vT@!@i v169LQ#!Qa788I)m} 䵑t 2:ʻF秦Yyڸ y/ 2-QFg&ʄrMiN!G;ckJrCVB5奲F 3xaps["_,ɻD+8Cg&iDٗ8'ɔfdپ\cdJy^qB'~&KtnKMXv4BQ9 L{^k{,4LQbsB}(/`-a" khYYX_~). YL#vTBYYU g=Ֆp֓N)N㴆b=3, 4Fô19uj&t`.gVoT-16C;{#!v1 P`_U'5dQal=N:P;40 0 `0MZ0HID_Dkh zI;5zRb(X/G>Z+*zv9I,uZcQ Bc2 I\H8 1`u 3eP?$Qlb86^cW@s9p< Kċ-hT뉞\aZf'%)D7 m"YMH@~-N䜑F! Hr0PU:(/` >"0eHu-Bs]y6 j`558^735Vw$Na_Ĺ?^:u˦Y8]썖^Sϣx!جa g ,~CuFL^y1 a iS=>OP[&ΗKJ XnGh 5 ̆q;}mP m9񲥾/5ۏ5ү:L| Ƙɰ~@8O߄h@X7PAEc,\[W(/`[# mf0nժ`֘$X&9@T@ RSPS?Jeqpʫ(tVa4J!+<%EU 謕[1v7]ISƞ2yHb]l/ i!A51V_RO%Y%Y˄aI֪֗X84>~EE2]$Ʀ-%* GͶq>_}K)v(*1j~GoINa@J]]S+p@Ӓ?s,2;I_F"+:lЫ%u7$RӓϿ|Uȯ{p[Mk}`?}/>T$gm0؇NB5 B@qlSxd!"laP}.q#!nȜjJ v;xl@K"q ~r]iogly׌483%5dh adXt(/` V$0kP #}J9U =d6k(PTFQZ[ӰKa\<@Ҝe0&;\iˆt3 @ AYn.3a1{ȝ0(+?MXD=C6W: *bneMz*{4J!5$9XqNvpSDk^pljBxME) AH=Z4f4 #Y"W̭w-4;NēUO%*۝B +)\V*!@L\;Lf?` i(4gV|~]Y곛Yӳe?ɵ|:~2C_N*9r$(Hb]t*kཷXrႬj0hLǃPڛx|J ZBal6{q (/`hX#0m{%Eo#΂`g AOOMo~T+S7&n+;ҤA PWm#xD#e_'l ¿a hf{,VQ^t,f%wu B 0 dV@ra Ig:GP༇V48x4:Dvb  v;7%I pOL ξdo@m4.`Ig$Xt(/` 6VE!@K Dִ6Q=Ώ~pSu&;>>n؅gb9{tp8J[h4éfLSZ5tE@ _OFݖn:E[h44Qa(Q:J3\殶$nb Ƙ-l2KMEu3w87ܗ6z& jô!M0m5 8ƒq_IEwVdvP+V;Oo41($8-Hp@4^]hؼ@mQ[LZ :08YdX c 5#赙+Ч B(/`5T" mOYYV_@L6t ѫE&faLLHq)3*^ڲ, ~+mNGƩQ,Ғs!ʥxED; -Q5St#]`#rJc!Kq;݉@Pz 30EQP\ms/Zwr?hmԤBJƲpH[k *&@9o'.EeDmFt!8BK~-Ń}ÀdW<}Gڽ_(ӕL&¦glNV[&I#~C+v8g!(!;#kss gH- Nf.@ tU `-+Ipc!sQJ md'$)D7 mmaٗfHP~-LP1/\>1cJ5@(/` D!0k0,&іQFfE'<==/),Z}[}@cpO$_j4U}Ax^+|v1Ve[˞hk Σf3!; 6KG$P" 9KK;/x._ZC,EWfnA:L 0\id.H'  F9/@,S"ªYg&Nt{}%2l[(`IW]ID0_GEŒOXNH}/oݚ`,l6 &i(/`C[U" f;h#k@Ug_T754MLJTf\gEkcY-bPמtBC338%&f``e=y:Џ`J *`oU[JAq\Sz sn9T=rPI#V1x!R3KAĠyZx/eɝ*_7>yr3Y`#P2:䎬rAȾÀ9oWv-VyT0%U N2\(ŸAS! `ݑI:>#v$萬i:fF{M0 D1f@\CF: x XexX%@A׵&%rZo;o@'ADuـ$hl{fZs%{ $?I&Ɏ 38"ONX1%\ڥ(/`E ƜT"@XC\Jv#[b$ gLx-?LREWKB٨KBk>xL Q ʏ+bDLN~)?nDn$` 'U S=C`;)X2~O2֡ %{@c IcXM,ςPQ- c@ bP YN[g-$ U `Qut/)|oJpd2|{~_7\{<}ˁFNGYsKVCAt?!iژg81?3t JPdT;~\~nIk#sa! 0Bgn - + Sأ/d) 12ʵȱbn^0p'(/`} VM!0kL.֠22{0KաP:#:7w>0^oN^ԅ M^j-`潑ayzbf*tf@;ރuxdrx+CYA$1HO,H$ $ ܾ3ĒcCR` b,;i2_0#$V YHe￷PW6a;sfL(= MUt(/`U \U"@i,mB+:]u,P 2PKke̶p0OREAy058ZRf9FO-+F9ԂUђk hF"΢ 7:jsghkL\u{r0]M(]FI,a !IҖd=y% wY A h'yij< 7PjQut/)|ojc2<{nۯUCC= \}FNGW3CVCAtƿqoSe̳Q]np[czDSSLFQq~h6Y`8 ! @,gb 5R ơ rS2S-iae9/&%hD:'HF{4i,(fn'3Y}M`sz'@|Y.z|su># K 69 G/-l,V%, $6"++s kO J+yJA?vGԹ "=Ҵ 6u2AfJt0 i7-l-͛a(`%[B*(/` FM!@K͖7;)#*Bô5ن1CGB j)_3Mf`HyX1meIedb#|#UȯZܞ5GOa@4 \LԷ lAF(:QϨ1p7;5W0`Yc>{G}`43xL3Ci¹te[xX59=-f9lqbH^CJ!dIfa0'Rb.{'ZY4=\)nR̡r` CZL;2];*ViVE#|oinskb)h_}˯*ϥ1ʸ6N4""8ե(Xi 0]88LuO(wvJ<&~>e%,wFP] (/` &ZO 0 4kL=6p*etNᯠ0FHEKeeq,XXfZi hO x|UP4oOi*㇙]J1к@ /(gdߥ!S QLav SGJC[&A?Va3Y^ő$&w(l?ſ dz[0:#o}{ºP0u#06wk0X/u[Ce6ԣfr>e_N iF[&VG~OS3$9ixLz#@_C=u#8~a3 B$ Fw#Ҫؒ?̨H|7m 08GʘX,T9 @ cQ)dK з~{+̛53q564l1kl$U)5HUu426U˖Hvyx68* ɺ|HAΨ[ [atB'ڪ4`ɺEQH?)\q̅"S7;mv[M@!i]l;OOfjYռ fU Y \B]$uE87}>Xh"`eX¬e(/`]&``#0kCH–}dpǧXPR0 XYUyal4萵0dJ}k/v'@ "Z--rĶ̚AbE\"~-~n]kb :ϸ'ý/UwoL{Ns'RJ(kt)joimcn;Ikp|O&We=ZHca| P B; hB";ܐ4/:Zby$@C<&.x(&I22fX$2 iZ12 -rezUU_Gy;?$Y Z-aH3bOk ]<',)whײi)as儑vs,s_6 u{SΨea|f(Se2 MupBS-dcTxhZB0C(B3;@62wZqHW%\,25e pj b|hܲC\?9w"+ZEoGx|-\RuZNWHLq 8 c?07wh %4cT+e"~s1 (/`]'|&@?Zʤ\f/큄N&Y^M^מqy]䕱;OIBuZ忚f" yb%EHe* 4I*jW9PI s[MTUϨZB%ezRAmꖗGmvVJ+E{W+M :i<늊ŀqЈl6(FazqPEh˛kOkOrz^ջʡ*LCBYBk1 t0ަتv1w6׵gß%GXv nv;tN^u=UMn֘n| %ea ueƞQ,k7e²2ppL'oGȝW\zϝW`Ys(RQ,Aj\13GYĀdq8 z"$'>ʃ$b@2_?)>I!R@  P v~j(eӟٟ=qPLLy;y:cwnpm;gZ?vjqmM=[}Ϭ9nnl4R3j<|xOys'ξݭڹozztE2 Asf7zw$.#Wd6w:߷[/2ћVh?w֠A!c @B w -Rc%L xFC0rgO7AҤP1>^؈^[4 F> мf:[q̎cbG$q1gTp"pH +`?`A1@!8B$ m:3.xhVɥp]$A` +[|h>= tkPf(- p9n1'9$zB1=Vceɝ$]L'U=:0b ɥ Pp #sdNܑ%'c)r <8tTJY_EA}Q-/LNae-,ܽPk u< UU8-:VPZe!I&I_x~ےLay KxK6IKvL4.-9} ۖI6}LplV]Ijͽ\ևG/v(/`  fS=@finv@4̋+465zS>vᒥ`i 3T*𒵙3Wӣ\7=.qˌ #kTx i4;V4]i=^h[8K53 7to7q9l=g4xL0S`cR$݄EĖJsGsҽ#^+eSN Z_BW: B%8D-p/0B D ##[\/X(48j (/`J,jf%@K#j[xM[H򾣐ڢ$LJk3@6Yz`,p@ 6I"} ,AY C~@(=`46$ułFY(,c 0( ^@QłDCbE7(%q.@gIc,fȒp.%DF$?HN0 Ei T {`/ 4J: /{@0v:؆y$;<8xQ Tn$v@*< !HQ, |xd% biKdq8P,_XEjxYͫz6) 9b{Ux??6-zǮ|igMKV~yX&fb}B.5meg'AX~K(ny~*D,-Z$ @N4\C YDH<Œ/pXPJa7Ic?wh|qx@`oɷGHJDe$e2x,$M4K0<"#8 &y$M0¢p(b!UB/߮v)v^n6k,&ɕ>6V>ُ6v"ZBevV.i#[k.m+:JDtzdTJuj %bX;ľW[z֫(`"JCC@$0 !|@8 qxZav17+֗`'0紪S`cԳ\WbN*CrQaiHzA cd8bD( [(=uB}5H83 sw b`` :Σy!6$:_BR.+uRD|W2v7ڱ$5wWk@]#+PXpq]m/~%@>#O"ղq3L5‰FF@nѝ- 4wP94RLԿjJb0|'ZޤrzN8;pBcjO#eШH_1MvT-,fy$.Ic{DKE ` ]PSUޡb05ok'x֐IUNrD_mx,${D)6$g9Ʃ ”఻cOE$VPҝQ'G]8xa# %:8 %8 !^ra(G72o٘% %Ũ$Me8K (/` c$olzSǖ5Y(‹ _ !WYVnZLKէ-LT4'{֖eMƅ05و $d@J+|c {{Sk2>щJ >[cMZWOOo>,4Ǒ7-𸶼;P埌mZ=AE1bEBdSɟbV( Xd" k͹5=lUqv'z%֚o˵G6?h9kR:n|'u{ 7T{}g:zW{% 7X%EADۿfYU8A#FJQԧ y-HF#:ݭ Q 0B(GbSH d0YL0~-+ ?k]Rl~$3 ^YBhR+}|NJ1Y :L[y,-W$={9# X$31&/oFQhmlހ| B5@{} 5ggR|,.ҀRqCiNvȕN=A:u {JZ諏-==hu b珵J  8=% aهґ/ Bň jb2~ov@(BU(/`V f'h8qIBt@팦:Bd}2TÂ+VOxc]  /l=O7NUu#+{hM 4gqF:Dޒ8lHFkGTt-gmE<*> \|ǡkɇt8"o)^r; @  Xj`mGQ0V%vz LJ5;LI| !NK6pl; %-(9ltl4m;C[dp>F0I:-%4fA<H(/` vUB PIDYtidG¯gLV8<8L9fidI儶~b)S2^F5Z Z* ZTMmxi !Gs km4-aABZ< (9PdTbP a4%~d0u16_м6r>HxsۇFx٥<ތghn4pcΛ?89R?_?nuS|:fĜ?E gOQIid)  B”fLQGyWmTs&a22yk2P2Mh)Uf gьMNK*P(/`#p# fn,wd ކ w *n2'@*fgjL:[ciTh'xL):Tq4R-i<Q]!-'2Wz4y8f==E5ؽgѳ}"8m_V۹x{#"/j@zC yG'?D4*Ns@Gel]roR\+r՞p29Lp׎rFԭ^oi Hk͝iӴG8vI#]?5=*+ehw!aA /Hi@Ԟq̎'gӴEӜxOŬgZ y NZ~x84U]X{=+0pvJrJvNAmw"c jK4MKqkx(4?#vQ{ b6BvǨ66g =Wab9(I"4B`3cKC`7ܣJ֩V4 $rũpi|G w?_?_z"kG"ERPC>ѷny8~\Y-kc-xXEy-@OhK# KS&sAL+}[kv rkW6<%P b"] maXt  ׶X:3eDZ@!ɓ>0ǂİzk(/` B PIDYIȂ>C`ҘIN8<81HJ'#)O,'+jkFx#M pC-bIIypIkg ׎cK: HHJɵ EJL9DhLJ``nYcs F oua/¢P"nǟ3hs sJ?_4ao ֡N6T>|sFnD*r6獺NJ#Ka  BgLQFyWmT3%ar^S502 >_Б@F5V/MrP(/`25 S>"0Z9*k^WʽW6Tm& ""364mI ґOyՍG}*?zڶ2 {G/%?M/ Y8ڟD$-A>ǤCkb3ާ2)@,bR/g8SF̋oTաƹƐ5Pi7r. /!:kcٹcc G;)E\S?h~A:483`ڨ  < RrGGTO70C_D(oPo4td^g"?Iӧl3 ZI(/` U"0k݃=y>e2cGY7URPuNTG?U0%pJT9dP2$ق9~ųi*cp"GSL *\Eb>V' dt'D$Ba/E,i0(YMqMCbE(Y 㴅AsvxTɜf_C("u)o򴐼N9|x 8~TkUc66 ]bLٖzL%Ci{G[r男!|F֧F~@uTnaFb:j|QT#(0BB@Ea 4>XulqtePQ QM Va,88ԽCp'` $"juP@P(/` vG!0md+o#!{uZ{= l[Zĥr@?=j@D9R CX)#|$+ 6A删.5͏kxN6}/)F$YŐ{4 ,lzR( (I%lYL1'o yNm?YKXFm}.'WiL~."M}@n)}ͶQ#rP K7Dd熑eaLNJ`I|t4;mͯ#۔% Y (8e_x ԭ ;LgPK 76Egg7m h ˜fԓ?D@ IHoZ [H(/` F]W# _^=b|No 2b(;e(PUH*ؒhX,aEXr$ق9u~8Q U}thW;xYP *-h`ĝ ,&ͶB>y( ((/` Q" mO%aZ彀(xwZo;E]44JJE Z v'mf,(/q(⁠fa2:[v[O)$BD.h04ڢS"]ƪ{{a$jtޫ0S@ r;}rz'ɒ0N4K,J<Ja N/(];#ߵ̫ynȪ_vkmt-t˫7B[~D#[ N4h~ Q7h}R( N3f`xt0f֛LtT|Я 5) . D& 2>=PPw?9ZCyL%6s0Ulv̸#Фv 7m]do`,LvOb@~>1 F$(/` ֔A!@g)_h'}ik3E3;8;8,aiuh,5Gp)}+ـج ]kCeq-?5;H{(`OTe';-KA ”cqrPdgCaH32?';׻d8A,⼥I==yICH{0Jk-^kAcAl鍖V?~=56,U^n_*o  $ ! -dKZ qRjD&gnB  Z(/`D 5F(u$0jMo}*, okibQyhLބnYH {bQg-H<b= yZ67Wb&3β4\9 ztz%Us^;i:9ݭzUs^n\IW ZgSi(PhTOf\:hB=%'CX8>HYwi3i4¡%`J}x}=ʌ*^ԧ~_=b$/?v ˥,^MaBZF[R(/`E @!@i44&M:ݎe]L%<pd2cC 888O|qcH"_98.TxS&\@^to#+M]s dBzZ 5P8ۊY}~=bcKCZHCz3Z-Ym'G:DA:},2ldS`{x3DFEfGCZX3N6!mC~-ͦtmG_vH3߉{Lole g+B*aߺyJ\}S|ph06Dʮ -悧^Q̵.^ $0 D' 0ꮵ0F=IqYhDd,ȷL>3΃<گ&m՗m U[[9MMuN)¨|vCϋ]SFD[>eәH3Iv/;vKBSv_&̢>+R ](]qMvۆzjPcO6 )NyGqd+M> Bb($(BUI+}cA/I&dS,1 s$Eq0kvi,# %f[<`#\t mց c xn@`,9y<?3y7E`IvZ m'Ň"apk WϮ֡L9rxt B~NiS(q9fI&r>fͥ-d>&i--݅>:ao#]1QDt#Mײ z $A1e'Xf^B-@ ]@_By汋M  (/`fQ#0m{|u::}{k {JGE, 1Br,nY< F02>Vxm)62GE8V`T$rk4}O_uQ[0ʂY߭u|-q,U& [%O!Х7#<8C~j=D [0$Z?If_myj7ekjҞ==k)Q mzgm+K:sx.ю4}LޓQsCD#D+`y&3$3^p|,f磋/mRb4 ׮6 Bb(  F .(51,5!Y] Ð%>\8<4!kܲq#[ش؂P!rËN7@!A=-:KBǂ:ی'@ZK-lp=fAk (/` < 0If$=tbW+פ\cR345U}|:&ⅇu෨ G@G r VNwbq8Eh%C&q b쑏l$P”R<b(@RP͚ =ׯf=R6uC,|83ys-""436S*$Nf.14sI sq% \R7] @UlFppW}l+:*ǿ (X !db "ԧ &b\ 7H$T4Pa/EX{ (/`_ U# mGՒdl VD$#d( NLH_%kaZxBki,Z,E<%ŘזJS"#4vTue4z'9W}/wp Wr2؅ԛQGadQ < ؓ~plb=C֖M<'ڳX]Wz"[K@$ pE9CؖYc0hWpR)LoIBڭkS6 aYM"ELC'-x$>Pzxg#f.6APK2q̷-o@Pɨj9EJm`OmVho@Q[0Nsx2 $u;e4 3(/` =! i! !_5 –| H8`R`&444ҥ:"ig^ F=>-=(Pj܍GYx073BM#{@r&MDؕk BN:D-dqj WϮ ,W*()CI'aQk?|Tb͠ 1Vk FгVZ'w?xK7YI|ַ: ,(2$0!J Fbۼ@7H(T5H's{zUٱ+']Ǯ?qH^qs(ps^6cJ>)nAŧ7%%Ǟ R$w#v#5Ml 6Aۍ::&^eS/22ly6곮d7 c]|E \$ƐA"roY-x@">Pz1NE 4ABJxn8RM-7 ,dpv@66[gc7o Q@X0N̙dH@v%6 e02,h $(/`} R< Pg41u-Ev̵=EMH 6Q*73cR&343-U35' +7 2ztEUۄܿmDQʉrVQt|&j!!Yv*gme@d)>A9':Nǚ[;x511=k;Et-݅ 8-ɞs]C=#UL߰}qvꇒq) (AMSm.$*skX(0vY‚A(/`]֙O" m4G ;8f!=PDޱ9L-5bh^ƹk)@iHEEOyĭ ДC5$a0OPNenW+CKNȈvph4j#sLRQk,='@s{#".G9 }TgLaKFs%l$T|Nq$ Хl=dqss%dlruPQϘ~\`Eo W9i=ùޮ'Os8y,jH@~_uwu pCu?*ձCb:Nu #a+*7 !wC $޶\Hw>Xz=NE 5iPܲqP"u6ii/,`=Þ分m*KA=ݶY[?yaFjX8͙Ǔy>L&`[H(/` v> 0IfH a=DhB07l/#(0566~WU$1 #+BO8D+=or) Mj&ZFDb2AfO1)D;w8ɞY;cYcP^qҊh"RN3(/s$oK%:H)4Ò$/MEszWlSn/UUf+/gNKvR\=  8T #! ;'Tp {ҭ,0dj W(/` M6Q# mG%_h*PZ4\UC&PHGE0<m37(ŢY%VuA FK:%e]Xu3l׊_1v{ W] Y1v|dI'YƦ$di^-"Փqbox@kXaߵ2~sR*EOQۮyekN^Z^v&n/;DSj}=m Q;ȿ[M29$Ϙ5 Ջ |Mny`Lg,Z|4 ayS"0 LHS<&Vzx#b.6APJhlMm Klmhh4 n٘3 T iΜOnZb#Xp fAk (/` vS>!@g# f8[t}_鬬$ȹ Kn565~OU(P"+ƂV+ DNNwZM (9NaMi xDl`)%ȑr$.s=o/v#Y[O.8NI!!JR #?ٳ)9cytgΐ$7{1 ?-sždIٮ04U?"D<=k (8p(!b "ԧ &b\ 7H$T4Pa/EX{ (/`eP# mf/ժDZ4\UC&HFE hSփq(a0!\N o/Y]`pR VQ|1hSAznK06d}})DO%adi,YhASOBipC=FF1k'd(JϫvK#]zvS+]Kvwt͇үpDբOs$44qk&=_i;P0&t舼Ӝ'PgUI:,"1C.d[E6 00t]˜6 c%w]"}o] N,x$.M3#n.@BJn8Mm fl-G4tT o❳1M6f9q<$.lNjY` F$(/` FS= PgLSc=h,R[ Vb&444չ[W$S 㙢y:p{_h*㴫0Z-s6.{ص K;~ảdXT)&!OAtu2gec]1gV?`"iئa! L;@1^[[(A u!F_Xќ͕9r_x*K*m|y%)߷&( (,ZxMSm.$*skX(0vY‚A(/`=fZQ# m3 Khjc/OFl\T@ IID]y R׃-(`0>ڂ +}K F8l(y\Usir=l PƆE1Vs',M0 M,}; [HkYpi'bb/q*V1Ϛϛb9E#c]=TVl'_[]_k:QϤzt& dCyJ_9Ǐ45ND>>ސ*2ԋ}zIx-At4l CS3 !S"P ;m#;+b t$ڭuđfooZٖ4 gk}DEGIoxOmvdo@QZ0NsdHٽk 4I(/`n5֐6 Pg3xTZqd|kM'Xa-/,@ށaL>1`&kBįhǻ0 $FNS91%RuG:ZRV]$fK.1Tbw.>~TZ5,MU'\bie}./߭f}9|-*Vz5Ae~Ju `2V9 Sg5(/`=R"0m6%o~P瀖:etRJJH.%vŎB8 ~'mVHƪ-bi4~.c9o(!ڣhg) F5(uzȯZw B@BT}B\Kvw:p)6xjE_j0`h)s[镲}FO;H5 ~]<ٞvL4$_1Ab~VұSp֣_/0 dyS"!.MY8aW+T^\Hׇs3cjt9a2G+70#D:m@]"uA ޴۲Iq]6-y3PU:(/`7 K"0K{& -M'ڧBSTАCF@52c)à 7o/ ρQ`cj0heeWt>ȣ( :%D&q9Ogi紷8kˢ,4q (=E` A+*ʌqJCk]z/'rOn/۲l}g}JpuL<)\P`-j[e SKb:ҕ)k;LOGJe35%>e,>+Օc (0x9~> "/n[Wm3ƅa:Cf] &ŗ]'Xh"MBi W(/`uZ#h\?,& I=2 hAr}.QPP]0 4f\jڃPĬsnL`[\ktJK37!gzQ`+2EyB sПR9Pt'\ۧVYV`8.'?rJkZ[.U fq PjgR|2#1JsuϜؿp0>Uh?f'zĞ|TeH]d1{KFC&yN!  z{Sxʇa'E)b nYddҟӃ?{)`ݐn>Q4!"nR3 EaSDfq3\% 2<pOXS)Bq{H 뀅k7#ءD/-Ih x{f`lH~ƖLNq½mD.|˘QJ5@(/` V=@Gf( Lk U1ܹ545ˌ~O )̌ X>T󒀣Z3(ļ&%ٻq(eN"{f E\C|bP XZR0xk_:VFҀ}] \$ qZ{.yMI!ÛpKoG ݄ټ<#4(HÙ~ pw{JWЇJ_9Mi:$4`@)>O<G7[ 6wv FA<x Th'q9wI؈p~UL[cC\˩OV5E"A:6V4V[ Tj1,+(~XG4+wVL\jEْM;Wt-}ͺ5%&v cͳIWus1|bʹHl h%"`1Z][ʂ@3:Cc;ZA$p3@ȸs〔 T=aJ̹.X2M@RP&he5CΛ(D<CpZT.7/Fw : $?k˔L:w|2-c1PU9:(/` v? @i3CPtU RÅ;687jF>:Si$ єG|!3!ǣ sQQ}x.A'^W& sKa֋HA  TAj6\C!j3 gƌCyRI; ?Ha!O{\KœEYC+ ̅1&^@lz%`Y .@f0%"jrhQJC0`kp/{0=Jiy1pWD7\V-u!#$6bvl sNf8!Q,I'elp  (/`8PgYp6\ݾְZȨ010No$8 N)h}< #OPGohD1NiЈ؉G4K``1rtkv*DUDt'k`0gpc, [{b[L΀ 4k( e .aw^ wk^g[ugC4+5·Ү>X]/Egr_  0G|$. G ׀do@?ofI40k(/`'Mvo%mgsqtю]}DGP bcbٜ0YTsk6pP󊪡[*[3#FlBߺC'}O 7׭͛O :Qٵ{_i >ѻ5!O_^>U%x}kG3|h=~3yƏ |l8QޒH ki7ڞ1oy|M'S6r΄ Wpݓb+x_42Aֿ9GStQ9ikZHs tR\,s߉5ߘkjΑɆpus W/3DN|ķL`!!(1oyqrHRa^ibs/uUjCc ?Pآ2)NPwK 0,*aN 0B` \`B51~I8ż)AFLRئ&r.qT15(ՃMȂ"Xk%uQPI {Gk ¨D^C)opsn{be` N5u7n 'x!v86݀L>7o"A؛n x-lYGG/aj`#aO(/` S=@e&K[b+cG?>%٬ 464ѵ:d<;hxF֑O%  ?h!=wQΊy|4H_G8hy5j@@1:%X5$i* E(V+X糫U4V,\-TyqY|P!Ix\ء u=]1Jt>[\sCJ8R̗жn߰n>Cw"O#גkKO;݌  E%DEa骳f 6>FGP\_PpzkI.(/`]Z  e-"deQpJ$"@OQOj!N+n x*C|J!lH^ioOÙM t[jOQ)HBLc3и>i-R[ǐo+s|c4shm|b I]L*py|G,Z֗.\W ..Y~gt}usXj ?h?j`E דs}beMuk|:E(@TJ_ x N!&|< ,}[4qv#Y!V^E: ByEa.P0],[: @LzM`o ΚWxFIlz d3-*bocҾCv 2nbAƃن:g/h> ^̂ĩkk(/`k}%?^3-$.g*@"mw/OC-"*qn? RZ"pDqa8ph&-J!S/hGyOxC`y04Ȗ6f25X:l-$->ejq0.Qe( Uf%-{i[IB[kXcWW]򙸯~Vﱃ2qe)`[([V۳[H 4BI1 )(@:[+.E_H6i5r@V%tH[VC\-VrߤX9Jդ,bz?eq|ul\O(󫣨,0 In(Ns/2NRv~>ɕ0 *cBؖsF7*gL*w |9{^_l)cORPqddx+:_S#L0B-,#^[e :((](Blk&԰  in~/䓆5xm._< ̻J7GX9oMG˕Jٴzd Lkuv'(/`M vM!@iFfl&niK!ģժߟQf2 ؉DEDh1$c-$n9%8洌/?9/<6%3*"2/#zk{0!ioҜD%L ghGs-s~jQF.E0F5 `#ZSw4,P>:pXKmLJguٍxj`ֶ7慅yh7 A*09`1dAfRW" mb[o΄E˚O2΀-h%(/` >@)l!jAqDb@e(.676/c1u^>]WDeIẖ?i/mԼ'>4Ky1 1 4c)} Ca_Jb:ňFh1g_`\C&A[L6OBu߿F&D')9i\ 1qbC ywжRNJFG&oS"x?ǁfm-h 04d# 3WdC\mvZ3W}\ -122Z|y@(/`r] VQ" mOÈdQb*H4#Ύͤ'VhGIGQ-D2Vŋ5 Y,X>m'ވtNe:&Nʭy cg1U4ES0FY48RY0 #ZBT&q.^Z8"^KJAAoYݢ4&ϵtjgЗY?:4v$Ӏl/sr4hdFHR&QDH "0T_0֝ġTW1l)p"ErNmDu 49; B1h䎛aPB ̶+l7SYߋbZJn46{^8iV=}qo6XAF{#qJi9]˃,-1(pzmef3(VhH!@ZC86"4 MԱf[RٸZ\q3RݬOki7Nb>v:am `x8h$ 2n1ܞ#M0ݛ kVà@ԛ#g޲`ܞ~sR}9?TJ6ɷ1Nf$;~t2lݔ|/cNk4C8^V>J2Ʋ A(UD C ꠈaA39sGjX` Nǰ/X֠C2|;4a<8* Ȅ U yݍPn-)`O3BǞQvBJxB#hZa2(/`5f[T# mO%aWjU\iF9ٸ JLJYOD,&c8qFae0'[5eS}jUIC Q"c _NA RcB)ĪߚMa*0X$#>%K< A+6iP9pXI3N8^;c'.Em?f񰠌U?M2#"nUZՋ>Տa eWںAH? BQ?O`ihfH3f=1TI:,%1Cn$N>ڼ44qp C̩ ?- EN :HtDkOٶ{W$80;sk@wR9(ZocH'qgۧzZUka5 A9XHUt 20-i^4ȦKi~/o^6BXm:7 XT:qy:橹| \ խ_%||ܜRMX@ξ C8vꙊpo?:ѩOt&Od,"gyAnv"6gOyrcs+ 8vY͵i:t* Jy5n:eA(h1âX]o2PaA3&7W ;,a頳?~{`=4 (o?y[Ì״M<4x0Ue&HuɹB%QAJ ,1Kԗ91Bo&yW@>(/`=^^#0k5EjWN͈8 2Vx_vߧ,(&i:.FU }|it]K=[zQǎ l&50 e}8!$`X=MՐ574؉;?0q%0vh@\Hiu" F=Y!oa ʬ"0P !rEiiUb8]-d!O)diQ,O (>#mOַv8v yR?4Q4zV(PROϭ[Su185'vճXr1 @ָ[ONzΡ߉?!vsyɱ_ɵtޥ@g|kHX@p\SN%Z{lfkb :kUqȀ0E'Qy:џ1qAP]ώDaXQx kϭK|>9I_;7ӯv2ϝONM \ᗜl(PpҔgܜ#v>^L@Ca"XccE sL# E&C#QXXf8b ҴbP5XwRK73 Dp|]E`r >7"z3wvHitCo*=(hjr3%dN ̟txx[o ҡ(/F: %yBdD_W!TU(/`"v$qaKQMBAS+7?1+.'W<8}-uIH!a?udualN-Yq$9D521x8sb0mFd= R I<ٟ4(:TL_aj [ŵJ]]l{٩jwTz}r$UR(*4iM95g @heQ`h$[o od ?> 2Zkev`H47i"A#3 gsSj"K *>Aa1F\EJ-3Gp S3.h1k+@+&APӡDkXIg݄jGF-C1TJ)-L ^]k-eFUjboͣJgM1Y!;lᘞкYo}ip;7HKޤ赜]X;fƧ(/` =`G4cA0O̦ϖB>f~ڝFH6,465T 30*1OvP qj2)/4Xn¦$ѐ&;DGirĶJ ν^xgCNɌnǰ0fϚ~K 8t'xCE땱KPdv :13noz|e(/`M VK"0 ׂV,n`i8 ?Q Dў|5BCB<"L2bQh H5SR:VEQv{-H>ZWAӥ( U0@ !U(RT,LBéeb*>W{C )ާ^SyO\7V1NuQg+(0\w[$") Z)`X.oC)z2:0&@gsktKd ~Op) "k7 BBV1hN^ `з#iփ0@Rn3By`aŮ^FaM ˏ"\W(/`uVV"0MШڦ= Ώݱ[vTCLOLCƍҚRkgdܘX1,ĸiM`Qs+vM=Mt_e[=/@睂.^i}J(HK(JU1vt'I#HDa(U"-qDA?\BL+6i09q~UR|Я1~tL1݇2&|]^>V}À,(kin`I2>N*=xEjP3O;Pg/ v-Q9D)$ӤQ 8?c~ƍ_Y ʉ1?d[8 $a5 20pq w!H'f c&4'`Fra!eh Pb30s6p!v.#_u)u6`5-;ܷC[3yͥpHvr#AvU1vaGD((U ,r\`Cs"1+6iPqF[>95&U&6nU*PS^vzH(tP¨gNiGs"I~D3^0g)(';ks0@{\mf|mi Lps=V)|,f'vVtZ9a uR5K703XVqͲ!$UrgT5w4XH@ U@{BpKK IqkB-=SrmIk>rtY7|mrFwv2:-$UTu(.ag?<sn+_f:@%!8u~ %wtc6ilT-ƄeuN,_d|0[r|;Fs'4`.A`2ՙE1KgKYz-( ̥E(B:pIT s$P%N.< 5e 8yan$I!>F =+}Br\s9=dv& ,Ș srn@? n"Є$(>/1Aۅ$,tr]7X)(/` met%mϙB5 s]xg 0,%BTUQMgghV$|(G}(^,m+CHֽY8:Q< }cTws0*uy qx}ouq 9!ՠ ټhW-U%L{~:BOCaK[H߷O)bAҶW7ag+sI&82%L̫0!>C0!.piPRa>_ou!Y,KwPJ}(/]|Qʚ@"}Y qO/E"`!aPEٕGPzc6sߙk$Ϝ/2wRZbڦsފG0V9@4 :NCH0PBhXp<4+1hX0w4e#{JSzjC' m-n!-cL Z@BP"ɦLKIIdP,ǶQۮ"Q=4h.Lݵ$ 2N$"A :O1ofOQU+'45{vAay)Z 32'srF3pВZ$@@Be $zTuWᥪI*AB)a'ٰ`8gݴB`I@5FN->0Ϧ dB"c*BWՑ Ag\|>(/` FS<PeAX7U}$eH343o֌*^ XC`(^<+:#e_Muz7!^~_7- ,VLYN#| e, 帎Zǭ !ġS+C-40,^c+#p0 ؟G[8kIa4!q9!͝|-e%PixChNvȕF9:=zdž#R::Y|s̭8 @% ܂jմfB ,4 ##[\/X(,XyW(/`] 0 eiK[Wb˪].TUMSWSoi'lD\~,I<L{']Ya7"Y,5kd~DQQsu%`M:'S5$Aj㟲vrsş`\8(ҤZԔt~IF; gMhFD W[ry^G gKMo 4O| ,p楉65g*pi3^ u~$ջ&TWy3Gv,`~i_ ◤L_3)`C3#*Sy-ȷ8k Ҕ4-Ҏ(syk/R3>$>ڜ,IUsFbys& 3 B$3xE`rfP p)AF0ʶ p/(Un2]=) -o*`(4 66o@&Kduofzwo3HdpG4PjWhC$(/`v9!@hCX@^;w1œ҆NV:i:.00/5o3\!L+4>7;j>6v]_!SPpZJI\>9bg. !-iR Uk#VL1ϔ#$.%7߷e&h9[`?`bi݄W$Md-;MO } XN♟;j@7ahXF ܾ2 -ּ`$f!#`&kׅ(/`3-W#@k^tI+m`߱ft#MOLصEsD.%v  nGD8Z$c,v0ʲ8Fq_SbÌS;9@?] /^){4!'M$ PTօSU15F2i-lICy(ɝ%Dٌ{7iM/l(8;z#,/v}xriO#S?Cw+j0 JZ:k!Zї1 $ N~ƖA1ju!B+~ %F/=Xfh X Jfō13 eU!R("FgۆŞhElK"y%=9G:#T3$M(,3$=/36!yvb=$A._I|}ɲ6_ߏ[)[DoZ0-i 6ND;SG{UE5kYDu>KL ÁHfɍ{=z^ZQҏ7 8D[~ ^.k  p$=~Xv ,t,pX{C(/` YO"0kQ}lEQ>hXUD䛓 $WPPEGDK qYmXHYP%a7.cc9o(&njS;9@?]/HฝEI@k]H=mPc*֘cӣ([aMZ !*]P8Y҄GЧ~[WK,s-OWLJĄөJ Zї5(JCtG?9iNH ̍_ͻcq8;zK鋙Eps^mX82F CŌH-BP}Mp liG-%n;t QßAvRzʀV-RV&=*oKزXKnݵt;Οn TGvXˉ|͵g|z Mn *^zSgzMpp,hNZ̼7#sEL0A797^R 쩞`vIzpwچԌˮ$qz] cFH#OI!4\G iq+0`E5Ҳs @l~}%)4#׉kElrVv#<55#%/ ڏ)%Om,rO^V]=NpzQ~pط _' 1$h(Rri], E"ve˂/"x(/`f["0kflX41w{gу.SSO{IYE1J%\PQuVG@;X@V M LNG`<29"3NO\sTWXxf/q[0H`5;$ aDO͂#5UQKÒ%1%4DӒ{gU8XJ.Fk$I4z|Mɋ4 kSUZߐ{P}[$P=MB'y|ZE*?#g>jrf#B4Zv,aVLi x׉kvE֙F B42 K@+V[!b.-u 9Z7ސd.?֚zi0jr`$6h}O_ Z=Ni+ؾ0 er\Im5Ӷ$7,vy6Ybmfaً5o-<¿g2eE5t{Ẍ́-` @(/`o6@ ecE91?)q{ZH7}ٸ(Ӟ  )=_>*̊L  wPlo(/`[$_"嘖,t B*,\Q,+ yPQN>sFqJeu~`~GL:/ l\q:%̭]tۆ%EI:9W+2"NɆI) /\Kz>qV(4úz+\,ڢ(򢮁 yG_jg{0Ҥ%+\{dN_:2cTGW.N!OYÐ,Im墼"UeruZ.685i ,@ Pј0@ "k?/ T}SM:넁~0%kER7 e*0;CBsźiĂg0$RD443PTx3p CuEM/ xJsS08 F=m!}l+AgԀ@ZdmC N!>Z aQ*V0ܟZ-7MɟLxŦgcC Gst ~{M݄ i2+Zr*5ձֻ^6<ƕ(duŕ0 ]C!XL0_pfE 2tRw{+@蠑 l7}@~pP(/`XFV f/ßjqIBB@.pKOJ^FxS*3CIa1q%:iю91fnQo o!h3Aq\=tz;Y !aqi Ga: r(E|hgX3w$'cfm$Cڑ~[/3fNUŻ$j1zX=Y>۪ł[ROxs/T  /\Z#ORu˲+|hn(LS oϥdbțv];Ud^0hSNY㖬 "3 EFr"`tÈiN1Rf+0Y5i6p'v[6 )6z2fP_vƖLN YUmY4îti/VroBAeU_sm_I֝ 멓0$ K'TR:Pn954C#h,a9A8AWR˾ϥr;J( o+ST5}uqQDYUqbK-{;x0]KxN%'+s.tD^Ǘ;[\1l*p>BEϞRr#xi ^ւ0!d 5,,`m[a7](/`u F[R!0kAaw]!:w|I;(WAA rIJGQj[}&F Xg{ށZmfYQiUf,D\s#:=)[j ( @zt"̊_'$bO5Xp0/=ZEQ8ADA(H(_'j67(JQ I0:M"AS_-7zbD휚 ,bO9yOU%>j'pUGAJM83#R?/=A ]M֙ܤaV]AUCSph7Ju:6^) 0Bc!AZ3Υ,7rafsbn6 EplMO_pقc r4S0Rʌ-Ѯtfs2V^g+qWgj4>JqF7dx(^bpZK'SQmdy:$\;^0(X35ch!e|V Q&ÑBk1ա 6,gkbϖ/XMN QP.ELVTZ0=i `lP(/`2d" 4>;w2Ȍ,o@p98 Y]X /)Z%F,R|ђZ3 RNIQ!/kG{̎j(f|JH$1{,"OXf~~J׼G"Bgo%"*)Z`w`X>$\?bOom]\6_f8I8hRrLRN_Zj+HD[ 誥˨t\Ϟ`WCu)V#f|Ta<~pPW *(|.6}eo {gay>('Dkd q6/m)6pаxܪw%!9#N7?ͬR 0B,m g7E)PvMY\0PX,f@4aWMVt:@cut2{LfFpט”Clp3VU(H?9fc, Q98Ӏ:r?;$Ii"nf|f3zGyGp ;LfB&!eijF0|9k? (/` <PeAX-U}`F)PD243 YOCAs̄؋g%DB+աM0^ Qo 2q-7$ sU: }%  ڇҲa(H ##h[\/X(hZY@(/`\W!@i4ÁcBbedA =AriDMOL )j)iz2RDaMGyĽ%N9EjAQڒ4rܮo|:Nܜ%hh3|'\Z;# OoC09LN DA<HCaU2㱴,g/je~Τ9 <U:(o/qp՜YOrF}R;dq;EM(c+StNpt'vP*#ܑxjXR ,hBzZ&F81Y%#‰:#ذe= H^W`=f: B+3xx¡#ȇS- j(CN@$B [ɋ3kpb%YPڷ[=QgÝCi miԤх l1~>EP%Lǻj׼edvŐ02RݢtYiL? JvzH2(ԙ>s+hp$B LvJ;/+>)FZ]q?P%tN4ѯJ[ LW ~*) F(3NplOpC>7@#x 6и. ٖtI z@3 vlF8kh`$(/`; O @i "L[;O72 ׵n}\GKBY̱P+e%/x%+1I|[}< C`hrɵ!-fZ֕pZ]v@U)l~me I>_ mrUKc;ٱΨ:>$_YwV,ɷ_N3]rDV~_9۟ x=!ַ_8Uc! eRϝZ+/-Y>.] ((Td-ARA+u\ T68G>| LnP3x-oYK(/`m M" mp?Z`Z߬MtRABFC"U߲m}W5W0rpsԫZzD>AfZ~v={dN+Ah0xFdPnuK5?II2!BdA?<<)%Ʋ`آ,Xjzj*jBz]@Xԟr˸?J|GmԾzB1fg(ERRoj.{>#yPZI 9U0u+sraH86V|W}m]9y#5$8}k?9v g^LMSWڷ_~XECaR:V7tP>]eH?v ! rdV(eF祱7;ea-%l۱ \nl-<P13ldIÈxY/.(/` vT@!@g0#eP0eMڦ,r.Ò787^z[Z#8(ZJl Т]So &j8ߔeq59q[5h #IÁZ#>G?b05F̿2S:~x3^`߅,A}:Z\Hi8naQq0(65-bH݄Mߌ_O!6TY% _=نnU#$턝v1W(Ƹ@l9ʀkDD0٥ pBd*\`IW (/`I_$o4' E-E͇a0 \@UVRqaaƌ\85\1qkYEV?@\8)Y^gnOS])bCAWH5)6'~hzb  /QФqSE.7>iOBrl]N:PkXJ*=c(,[땍3< %Ӳw(/}4ɜ!"n5څ:hNSEiY_,c%_yOPW* ^(;-xtv)V -[TP{jH{\55̱Y p98 {X#d9^38 Ø .f22¿=G(shݐ^أdp = @B,7e7 -a D ΄]ȩ0 ;QX=Q ºQ9@ȓ~2/b'Qw¼r31 ݎ6`!R̜-4'70#}^. (/` &<PI{.HCI$Iu͓ҘI353Yگ0$9==MVvz DoCvz#ֺN>d$Y0Q҄SC&F i"ؑ5).a,@*z, K7|Я͍(3 t?T#{Xy>RA?xjE`OYM5ciM&``'/Vyy o15E#1ea(.I1ؓ?+P;(= B$,Fm .Bo*h9+8BKU0ҲЏ0YNL /AF+Q/kp\q6f2p@4 2:Av\ζY-:= L4(/` = P_ bS&IgLIB#lcfݬ554~f@q$ؔ bN{/Xd؂v Ugµ?yB1CR h01K°VX=6R  jtQ(-m;Z[v}7m])rUaՀi؏9 H^#3]Zn4aJFx9y'+NI}ÃۧL=fd ;'؃ +n7@Ƶ@E`ms]Zk8(/`K L" m״ DnUdZ`:`)J&DBATODx2N X,,ZƇ/k4tʾ!Oa>XC1I7FzȟR=у^mMc_K,*e)~rM 9bƉ`xqu$J? ;RkiT8 FY[&H} \kҞeG੓ZWҮC( fk 0M8~RHV̀FO>K6`7 eVuD'* e94NrL'Uuzr6/;b&4r2y7) pq6fY}${&@"I{I0I-64q(/` ֔B#05f%pE}mY" + B888nqSĵ~miLyg tQhV/%b&HͪE_#+{7yR[ Z$Q=9u-}ħ:NZz'(q<^qf, 90RĺeAESt{-yqZL |ymx J^cgcNٿwR ^RKB?(zp9цYGZ2^Y|"Jڑ бf` (/` E1% o0]Z{o((u, ,ˎcD 8*"!f04qi*9qgIT& x@h=g rh $]@E 3x4I-#ES_x?N+e(sZK"FH]qv7u5&٬="I>j/ސr^wQ8R$h6M-+Rl+h߅$R\Ps?QS8{sX`90ϒ $GYRWuqHuZ0&.;}m(@P/o'[3)u1:ݮBx+^ce7o˖zE%s{yMZ,"/t]̀!c0B@8r}ke!J6;pU; o(lea\K&XF4rpHЖcyq(5cxFacXTM#%Yrzs]#`ɐ'Lr$Kc]9D{L>rr'BF)`\cRk p!T+sH8 'Ěz:m.tIQHAv͸:ONp-Ox6PʦlPolO-iC?kUk95 R2m ؅G(/` WJ#0Kˉ* 4J@nv¨HXXA@@HCѓhϰ a,-H3Sá=}E@=/꾢-:I,tL18T,2%zEw06&a68bsYKv61K ֔@`V] K_"B,avU]p#7Q,MDioiYǦWׯKa)\ +IWxѭkt$H ҵh*|p<~ r,lL ̔WG> /$a dFIӑVٵ(/`$Uh&mo ᅆt%l LTьTQ5@@]_[NØhÿb=)raZZџs[Y d9Eկ55iƁNl`n sZ#zr\I$w%ٿ $SBg5 $<}zA cH`{T $iblO\tMV490:,dPBfIEg1ڧ_s"cѢ:kN6-?fN4z}m9Ln{9+ӿ~#taKq uW[s8ģn:'˩z0.zE'j|$$8ØxE֟GX-(BA45탵@ B$zsL$0{ǻK9#$+7 ՎG@b̌7.P '׃; 8ቜ5xgo`*ر\j lb%ض]mV|D$B[˾9qR+&|SCCZ7lAPb(/`% I#0i8o8WM-AB<D|C*h(C@A>КC=aJ7J'Q F$ʇ^_N>|$!8:Y碮'X!tCyΙ@@{&spLuBrJ:X3f4D{*xjn\CZC f]Y C)zGޛ+)-([-KI@I"y O~x ^_\Z>܇T5D4u `5-+ (aJ}8kt 0HaͰhRϫe&0'YDXd:a1Դ=EI["zB@(/`]"e&eLkِ״ǡJ4DSFQ^SVTj0 ^)z*uteyk,5 8L4EA/t;\\\8W .ɊHb-AyZ@kiI}P!3kgEg@yɃp%Q9*7CFlqL4,>eS`rMnG{f}k|'SM+NviEu} .\Av\^98VF7絹R[{-X`8b_j)k8`1K>c)iWk'cqXkaQyd3 BxE s.:`A|(3,+j$y$VGATb30yLevK-=Xb ۖ-'n[h'{eZ98qLZRSKC b (/` C Pg*rV-FnOXa R>R3 =::;m9rGII[?q4'zՏ=++{BR/,D=?l Ϛh]Sps2,R\NEޱ`hTZGzX֬ kGTn#x>T٣D֞1 2I sݠ g T̄'%J#E0|8>; )a9gRRY}x4aDl0ƬC`C . Y,i-Jp)((/`! FV$0k|$\Dز`80MKhMLN5EqXzedX(n"a /gqA]k+uOaxT!N%6hTTXyO>V *yI< NxYQz Ix}I/y\ߠG;Y90$RG';XŪ^IFP#$VxI "zM!_xnj|J!저=Tr&$QlE1V3ѺuUGL>]jk:֓oWCeAl4zo5.7k:gA& B㸂[@&0F1ŧTXekqC# h@ܠ]ݶlVrmeOeBFR,sZB]*.(/`U &VE"@w=,M/ng;<;}Ʋɫ+X3Gy1$8xUuGMTS-]ĨIa+z= QZU')0#3=]Q[醌 ss!-ͩS+KP6E]5qya(4܋34zcvxs/0?-iӜQEhL|(>q|KV4Z! %k2Jy @֌=}   ,_k 5k̦xXRa ZBɒv_rY: C(/`X$ m4(w\-;  5Uaٌ@ PLOOL5%qA)׹8)&np,朆s8Ni~rVTM&nYzSo-~{#d/Z9No%\{<5p*Q"#F5ǂqkp0-´(]+k"W4 OtYGw` #Ɯ /*x,s`"i*fAa枸oϰ8GMZ/#vc9+JkZq_i+`­?݇J[F*Z3W` # V1WSkqi8h 0x;_ bJQBZ pf(/`;6b$ m4pqKeqHkxoNM"TGXXWҺn9]Ti d ukַ.P Xj̲ca 0kVhTF5zg$$$%>py$Ĕ9zR@X8QL  g)\k14ou{XM$rX<|O lRVV`'^I|?9K5b°fzyt'T3.2K.jں.W{R) NS9~8. Q+Ɖ[e1E9_t X6ޗ E *V1WVkihh 0x;_ bPQBG*e(/`o08M*l02׸1vX=ecDV}Igv& uFNemr(Y9{$ڿc$ߗUvG+??9uݿ'FlY],V^M)jJjeH뤌Z]G)wSkߥhi\W&nޞ&u0^T8M{x@ElPHAEY*kOsԜ$ D1j6GIF3ܧe:ʬD{l j W4J9[ĢMsH]H {nz-osW845-bt:9J:' bm]Qk(.,I57c–xmUM{)FgS,cʎ!skZҬbnN<%vRuB9a1aN{96L~_ v:uܒQB;:8fq%ShaHR8(A A0re:]K}. yɺ0ǚ?\Pv %(u{k`)؁T6̠|xN7x&7HFfG{tkL)Ts+dY{x܍_CmJ/n(  :JWg c8N~~J8[ TW,U#k_C_k5us~uc~+ޮ$@߀Eļ g 4F\]ZnZ9?5}5U]0aƯ*6s1$U+e\TLc.Nrd)],D0:à O~EovWT=4Hhf,.u=_6nchЮa9;$Ri<NJ" eX3D_MUUxȴ[$ 9_+t{@(~εej .Mfi$@Bz >To83W:OXJ[ ҃JЏhe4"\)^)SMv.L,J-?\ u4 x@=FVzrc}$v4hb6@W,d "Rkb#Auղx.pyc }`ȴZx@sEr-sMݘ`QV:Zt չvu_75=`THf!1\0ZZ*D:aiAɧoe},0 1` xs8☿O,LN'$|8D2Oa 9Y/?vZEٳ_% מc ).K8&8-bl>V{|g{T8]icϐr@ |(/`6 C `G7^O7 R"" q<9;-fʩ>Kb@ A3c>U|/蟂?R 7NG--Ej!.Qy!QuQTä( Cw~%γhch}'ƛY-oKq7M$:(&!`IO-Ҥ?P:S*=6T:ZmM1P/OޮNԦuN)!н÷\B-uKKmݡv?b\֜1KtN隙WZ-UvBzۼ!.dKcx{C ""qK-Ɂ>Ђ)Zj `@IXl8{? -8QտQr%Gq'8}Gr5Q!B0l@d'C=A'>MVWm_cs[&+_9 V } s,3cR Hb(/`- VD @Gfl0 wv`撖 ɬ;;;{f߿ 'Y|b)×LD?*Cz+e/{~ ѭ6[ShV4 Zєf'LyHOe+ ϵv>=f}kԸup|.@^A>o.21|o[/9'(Fb,݄$ex LՖOG:Y-U鯗],)Gsu_ҫ^,@U7◆ 0>e!7 +t/u!FP WwBA ͌o5׃(/`5S# Me삓Y 2 b8FYm4PIKK5Iέoe aIU, k eqAؤ*1~qz<׻Z]xVd }1 \`ǔ:9)t"lhIܤ-' rzʧׂ 0Iɟb=#lI*}_dH-lgkLH*c;N~- B峀bK'GO|a51rb1+&4gN|'&iֲ:BZFo[F+Ut"0'{زoវ8$.|{Smj7 Wv(/` 6B"0iLm}Ӷ HFH eB899S}Qy+Ft'::yȣ(Z|]H ^4`A1Q*$*+ט?n{HѭT|^tF^HXb SN}-:MX_8-s$yA_ko5<9J̆c1W2[wR*?$FҥBA4Rޏ,¾^H Q#x" G6w6k,+VTkB(/`Ff$ mpK®;5Ki8qcsq \`\_I}Ji4 CǸ(/`] ֓>!Pe6IWϤtz<4un6D556S09e9[X_F#GrFSIN|<9? Q#g3 01)kRVEKn0. Ĝ鲆Hb97>,抖fS`_:<)ʪF@Oi <1ƐSh/A}8d_%)蒱< 4$Rb D-u0gEb̓ј2JhMJM]D"ZZMG] \oe.?l尰*dQ$:FYPwkWK}EiJ F2yR={QSL[ăimaFy5IWäB>#uNWokGO1Y̱l]=wb~'[])v2Z'#FHF ;]{zˏc]oģGUyB@OJ%IQ~O*3>gg_9ߐPi/p:=)-D B`| <{ǖHkj..o\15ŖC;@ 5>ɠ$ ٘ȏ@FrBRS_ќ{a΢v {cn1W-1d1(_Z ̄71e'%trul? /;  \,g6 T+V.X2JjVvFP] (/`d= FE"@Dɢ7YLvz6fcYؐF==:]R`T{8FW줖Q-CU <#GREA, EbQc?C]9#2& (a4Sɯ4T'i$ɒXf\rf?Ej~H=0q!=JM)`u??\ @X0ɮuH, 7Xcβ.:T!'Wɔ#UM,T{$'`( JC~=?!h>.c 0BRF(Xť04/{Ά7;&`!:>R׸ v_oal7?ijV0 Y+I(/`8Pg43. ۩)Cx*p>PQbTb/:Qe 9q+.(?%{ZRz8Q⎬57~#Ro*c=uG><ӟ)i Ǧ,A F=c.g,۳6l'nu,T3Jޚ;T,(/`:= FYN"0MO-XѸx-t ذ98DGCA*+RceQK4c>ms<$1^( Fh`^ o5A{Jӯn30R8 aU}FUAdA&H:5NLh/CDkSl4s| UEm7E%!k)E=H7^BKUԍ [NPw1VCN3Nؽ_(H3^@`g'y&;ݺ/Yy;i:Q0* B$(SMI_XLk$*kNo@ bx` ;~i܅ S ׈naC[3p O ]խ$(/` ;@e YĿ#5M?_l?J[3/F3428CnzHR()tp-P ;=wQO֊Wx0GbP4f&Q1h#|+R 8ڑ8]?2cej> G-ӏ11$*9ͅ.Ybs2#zET5<6-3 ݌~:|_ 뼯h @ʒUpnAjZ3t-q,b fTkb@-U(/`%6ZP"@K @٦Vo+O=ePc՜ cGIEԃu. &a.T.^4 6+E"NY=da S(|Jh$ny^|OuFnT2(S! _PN~[zWh BP QUǣFq c`;_Z.R_#xϥn3wUS:8ԭR7FS'[7ت~MࠣR&Nwk*~U;-R ,`C@3XaX`8ݍބQ6$02 BÜS=,BC ph7F&E@V ޜ>dO>B8x l@Fi .o+ѻmsݯna0f ٞd`$H(/` ֘L$0ih@E$CU<:%9M/ *ZqSZxCDDH414!-ѩCڂInҳ?gJj'O"l4Z>Ƣh])'5} ;|S4- S^aY4paj ,`ZK]rb,!atZʫ:X6w8!` g4VgI9G}+|P*< v. fy@ ̇AnX/ /\r/eSvi[}-cO6ۻZM:yV ,ޣ~-x9 XSq -bD2J P: x(/`Y' :P,Ь6J,JIu9SlT}nFF+ QgEkǮ LRyjs])cUA@t4QP2Q Eҝa8JSɯͧ~iGzIziFg\](=R$U`HRĈf3IzγC-\6?cw1zphH \g7bx``41naaq0,)4!Azhp/?{0fI\.f#F1 zs}椿c5#3Mx&jLqPl4 J*2lBCj44qJ 3zO|~9!c۫/3 \I~d&kA-{AmYg;#,G[}j&#R.Q9WoKJs`հc:>KM"s"{F*{IeнߒixMs$n'S8ťEZpZW٫VSpmRl,,fNB1l4Y~` goRU=QPɍ6Gh%'_]Ie[Aqt[l .P`όU>*ڣ @2쨄l]5Gۺ 7wq]H %p񷊼8tṾYf#Y,Q ѩR r{q8܌Z=q&80*Ԫ[TSyp&T"ɮrJ'Wġ\W"]sjc4v t1sLA!;ؕ FA0 Ì33Gȿh9x@b\6] N5n9izdmѺy=zc<evW/RR޸zX|^H 8h)tV(X]x?40p~=q7k'`'y%MOqDhϺg唸e ^-otxf[r!}=ւ^"`_^A"Ya=gߩG*UQOŲrGKr҄i?mf;:g Mįr咙!@^N>S!(9[X:{V°N~> 4`fƖ!5R#4Zb\=U \~*kL80Y[?βlh6 S(q|Sz!=? 6'\n$|9ze{~ [ʈl,G+K#Ux1ej\*8l8l!CAiXɷц^daPOo"(U腖~>7}@~el F3/7 jP|spڰ<-I.n{:Q_''\k*/f6Ɏڻʓgb|@n͠^a!648uNj\|`hf[/s1L4fe_qN_>{*;u=`V O7© _74c;, P8|=n.~Wt\<1r- ڂ8(/` L#@iw(X[~!=)'Z# ;qBED Ƭ0!-ͩ.eA7JH2$xpuvq"|rfܐҁ;7]I<Ԍt8έou/&ɹFE"CN '"^ε=v̻l03v4MwF$Dc,Z~aֆ-Y]mf;C용n~*o(U Qo:F`u=%hp{1|Z(i-ܞK׎t!#!2[8Ț9-H|ݻ Ic^ Z("W{-nzk߰]t՞7벿Q }O߾Z-#ފ&u׵0{D 7Y݋DMα;[ӳ(QTq~:5凖[o/&S t:@ĬV/o%`znLTPM@Jn*L`^W]-T0V@ "1X\UP=I 0B7 L% \<&/̪@pWN{1B$6~DG*qs8.\ƈ@?01بpyx^`5l$( t] 2``#+Xⶥe`E7Rm-dX-s-r ,ZAZ BqQ(/` C Pi3@!cKQ8@a # rdT 9<:TS&z :`tW`<R 3,]"qژxLnO;ș!Vu@ ]H>.^@GzdL17TQmeh Di fkUC6~×ܲe8ZHto`.{ꂦJ[Jv9 [G=9- qP.EsI'/W8ms:3wx}$7f"/0c'!3; Bb(C ܟ@r!ɡUC@H_"PF> p )m} ! Vwr¼3'60-eIb2f"2N-FӢ pAi{ $L~-䙘Pg ,upRo Ab(/` @ `GP/ %Pr#3XYlD'0698I{WM#xO I,+7C\v ͒/k´ AúYQvI%ĀKT3C\M,&Ѿ9ݓ0Hk q̱b]-Xi>OQРIp(Iì4q>)x19?sfO1<<#bav%'":ѹ/ ˦\h9)ߗ; F0 [72*h&S #x%Z gA ` q> zĀn Y- (/`b= VF!0k5*+R\[qzPr<===%#5$/+eb?Jxǣl|6 3q5sì>vCbG|F O1!0"9T&4ԒAZVJ[L5I!!IZ?vW.fmy_nc+8H0`Ҏr*/ wTŷ-ZL =PRd g2[` )$" uu;ݶX61UcHfk˧-VcjF030D-c(/` A!PGc&|$$X ]bFrǂwyf (/`nFX"0M+~/!E_Rˮmw5̏1k`cPPN^!ms8ŋ0Z0 ?\ݕѣN%Fģ-b  ԧR졢+nșO9prrHӻ.>K&&$' (´֘%, DӘX'a,y%pqSfsk\0KS;G[GSնS#\[vmg}KS^3Qv  }en)˺ SUHz N[őm*~IIXiL4W(3\tQn!SҔ?@c. dU\TF\#!L9 ^գ #Tis5jcsn6]p Qo@&LD~tb:ŸW0ș2|_i䞔 Z(/`~: Pg05QIpG4c#?Īz011<s{C}iT»dؿP73QSP'^䯺jK;-n9*Fz BZLj3Xj  k{Gy;G阼ؚ5\Ż6@!q=cf\Nm0yo֏^Jd/jP(qMƨZ堚ƭ/MJa\T|jdV9I%I:`.iE/cͿr5dqi iε>]Oj hjǭ?7>CAGXw(n!SE90` -*1r!Ada YUζ8B@g eEeߝ|Җ11~ ZI(/`FR; Pg43ٗbZUt-bVSr33&e2115g qqb­txSieυV2{G\4b5j~/ e|gg}d߯20~畁V2 V8aA 2KȹL*aF&(/`o%v``"@MdNnF LB"l7n4E5.YXTB`ctN6@ H.+ m0'BQP k$ KGZM>"M8080̎HPjRS M%gޝ"$KA2TuBF[,,փ94z q@Cj:yL]z{6.Bݥl#^986 cRt|;!n)#Sn .2:홐ito:[F{&n  ~ODkt>>EG P< w/o3t)! D?/F~*._.ߓdyj vO? 0B c]@s!ICmH J-6p`Ղ\(/` N!0 F g^N4(hKDGDCf4@vž 6W;q8^ ;UQ_x i#^rWbi`qO>(ID&Jlt\`a\_Z6&JE tb 'D B`sĈB)DY`l3(;\֐Ccp3aj-  CA@E4+Lmm 8k09Ol`RKIb" V4jq\t mz&U>leX+@jY`3H(/`Z L$m-FSj77F4͡+Ҕ1A!1<@DAf܄;rtI{Ҍ;HRqrn|1+ Y 7,XҟPM}##>dR4̓3jh1 0b6Q'Q*IM:q`2K.Q 0&HD@=CUck=>gz-PR,sE xK:@EaZ^0zftp"'aMHBPH_|fy{hn 5. 9TK nxW[$6,mp=gޫgIT1^ Bn92[W%0F%t>=pED)N)u,4좠("@͒  (/`V" mTNӧ_HY2 `}JwC" `LNJOuDZƍL99Jk) ¯|e*yO:JȷM]I3EWB zo̟R5t M[QSB!_KY(:֞XҖ+%N=#E]^}.L_Cd*fKskTV5D'숹w-sJSgl9Jf;!]bAv a™'m- B sϵDh20,t{9=}C7~Qڊ Y·b~-A"ҶHe0 0 B0[}Lm.$b!$P*"V0. JaX8XUe`.xFo&Llmtbc8d l&->T[GiiA0 I(/`W L$m7־2+x@ƈ9tEv.@AEB/j\q\tjY9bf_-^n-F4_KU1A"9̶Nh燄BSсY0PBbT#CQM%78{0Q^.k.*h!.p)ޫQ/m}WkA*,yZj]OgDK 1C2LT0.N-@onA"ZqeiǓRW7Y͞$Uj[wͶjZWk{ In Bn92[W%0F%t>=pE))u,4좠(a&(((/` YN" mTNӧ|MMКpADECL99j%\k9-lP-*yG:JǷEl`hЮΒGLѕF)Coc NDiY$%WB%XC4G0\b!P-EI,yzNx-j-ZSbT?zt_K[>M!~ Y2ǛyGK-(T)u g1 ?~}< |@*bZTEmkYbj-MZ|?#~TOngl# (EB, tvN̟60|Nl!nZ?.(mo@m׬'+2m(/`  D" KVLF>ŮF(1M_d (9=9g5!칬8C3jS)4 ٗ 7ǩ}W:^]XgLDhOI&>wNR" ͓̐"&&a ,GNDž (N]]<Ń48K{:-;olgjJllAi>pZ\XUWd,pޚTppI -껮94γ(Y|D q@uJVDğ1#duwC:e|eؿ C+f7&t>(Hj-k=N(c׶L;!k9`iYq"%L(/`m K"0kЁlXӷא$s_mQHs jCBB2j$Im4ԐKhmWG6  s<`3?z)ca}л[X5չ\c CV|G $i ~'>LJ(N-M 2hIB-#ef's?* N] H`睵,k8~p0P҅ ?v\ViVs!Z4Ame qJB;)>6CÏw-?$ ^H+bRsJ+YfrDd$N-VSŽsaG{oKMA9]= 4_ ]$(/` D!@IcBCPKye|Oވ:=9Ts]::`*ux`$ڦp8:5e UۅĞ ؖ kr9X Қ<)9`A5q&$,+q 4T[jf!@~Y!˵0Sr-tJ+DjdwPM,nG#JJ%HI|0`Y??G~ |msҭNPKԣy. 8N ߣCS2"v`l^wVsbfA2KȹL*aH&(/`tE&_" m;̋syyN&+0WXTS, OXcYY<DRb̢p, 0 s8b 6򽃻#,4,L_BiWijqs Mq."H `ԛI51PhDEq0PI#Y$JK Q7'sӚ { K.>cK7)a0'H̩/s9rZ!THl)t3Ef(Ώ[9CX?pmI,4Xa 9W)X%Lk(/`R!0MhC6iϴ6&³L{{RKKG "RCFQKI)V26TxMhݣaagy:d1zoȗRoAW]K-mo7f}[X[*5fyi ",111pFeb(]KZJߵ!fά%3tD#[.{J;Y[ɲǝw}x?;vth(E3w(V#Zzm Vc'jJ/mی8W^ XVàXM5 Bc(; E`IQ0/EB\A֟LL<9-65=2"EIb2f"2N-F `# ",> Zj#X@ ӂn(/` ֗J"0K׈lʒ½ 2ڀ?¥p@C@433ss(HҾ/·GcA}Ż }0#fgW>5| Xɋ hzTf+J 1ꡌ>ma߃vm@B PJ,Ἃ$rFyX((/`U&]"0kAa/^w9UC[e/"*9UUQNRki\$\YmcE2RbF `(INX=m̈́E"V`hЮަCQӍRk;=f-5'k}jD@}]ڳ JKi 4靵,<OkG]A1+v@ԧ!z.)Gŧ(M}NqCF#ώ_w8ag^{B;Vzұ: 0Bb ڟ@q!dCm؄H[PFPK1[Cy HEIXdsUJ 'M'60Aa|Cxa {0?ۖxpOQl^ u` qЅK(/` WJ"0kHFӭ41և5h^k.S2 ?B@Mi;w4w4y75Qma߃vm@BPJ,ɼ$lFh94ʀt;(/`z [S"0M4o= wvb۳=E "~  Q*IJHQ^!q/ASNZJ` [O ܏F03~l8կmjc{&)˨[ߜ%gG0"ʐ[|\[c;Y<q @@KZaPC.Y@>'̸J\i0zOc$J* Ok:WNxs'Q?BGo :o~N!-a QNzNwʎĜ2O!0@2>'jª(>WrHܲZ 0Vf<;] (  hONDGP6Td2mYfkd`Sf $囊7H^N-6S!{oK jSd0,tq(/` 6WF @ImJK 3%t0~1<ع=@<bV"TJ1J@5'}x$mmؒa.iU:Ln0e-c-wmQ LYm,đKX8E~6J6~( {+7l3( +"Ta<|:儗?'Q;F̲+vﲃsj?շwƯ.L`S@C(z89Fk c7Y,ԛolހ (/` fH"0kf+Z]%^F j 3 (??@ ~pˬqbJbiA9-}˯3"KO[ήfV{G~B{%a}B邪ۖXTy05刦9iMF*A>Ň$N_lq Nlu7V`i:SܸS+?f4אHSRA+KLĜ\mW %i^iǜ҄|G'~UWs|n! B8e)/K` 0ɏ#A]m 2*Rg%I}ԒF"zb(/` fG!0IVhGA|%/3X]J RP?D=F$"D׷` E7EMڗ3-AcH|@OViJ}Bj-j- ,Ky@Mɳ<Pʃ4,OR0((ôr 4R; ʢo 0f-Y % % xeGs1}CDLl:北lj~C)Q0{@?/q@V'z_bN _ޢvV۾ZoDtV瘽(]89"#B5v1uԁ 40(/`Efd# oReqs\5X` &%$Z/(z[X9[Qb%XKO kQ;uʨ ͦ[  v ^OJrdE3i%Qh@%O 0갵a>+{[(4&kޒPO^8Qដj͹9\=4)7pX5srcl^%?SN5G#9hS=ؒ'T¨M#aQks׎—.v -1#Q1(HP@`8orcΔ4{dE>visׯli 8 ƺI  (@45OB֨x $= x8tW`Sv]!+4,K"Ou 0E<ѫ),øYɞQPaM4k.:5SYA  ;6lohIePVjηI ~42x*k*>(/` <PGec BZy`7@YdFff+433գ E6G0qpTl3ɟ 56" F=oBoM  P˴rŚ)%3\G-VhS ~DqD`8>ϔƒ D{ ssyA Mq6[E i&lRRgνyφ3Sg[OͶ0 >ʒUpCsi0`-q,bfUkb@,U(/`fX!0 e-k.iv\Pvv#_bdOQNccF*[@#hnִg1%40B'JsI Ҋ*[ޭ%9@?=2uN~^9Al]Ҫ𿵨8&ǑXHZv(ƅ,ǧ1mDۋkpT2i|AL`R#A]OY>>n(Kാk #xѥ~3wZ{X*__AS'|/ABNkK~hU;/Ot?y`/֌yf&xtOɴ&GOb[0`0GB+: B+3xÇNm݂7z"Q"R(GQykN~܄C;A<J@+(Q9x'n*` 6@*ݖP-ԅ9}$ F;I4!XV(/` fS= PGcHHm7-W'? 84d+A#d!453'ꈣiJ<;z͗.!V|CqUn0V8MX;M J"oK30@)2O]h}0C3H\B'L^)39SZT~GuF $꣨F)45E8 1,0 H䢆\$]P-^FkrTI:'G8ʣNWWpߡDJ_Ɓ  7pʑYEۗ!Z.x[BEHy=ŌlͯȣF.(/`K XL!@K#~j'2'S:BEC,dh@ˊbqK4 n_czGzghzz8h)݌Y+.@}r,[]QGł(HILx4(GoI:YKG ^fOmHBeqQѻaC*o.9EOj~3*J%լkjJ<Ӓ?5c HfPH>/W3 ʁp8=Ȩ OfKs4fnp"9}yl,sŅ.y(nRIn]S* e95Nq_':sN'lJ09@ҋmR"i-2 -IG H ~]x*kvk(/`k YN"@iwmX1e(+_,ϠxQaDGCL4ƒ-®dARSWR+ %#)#dd=DktA>u / X< `$5 %q-Z r1w1O3ڥF;Ga` 6ア] cG4%E$)X'y\_¥XbuuV+}KAyG-=qiuiDꓢsg>q:JpڈR9R AYU؃91b%EKUR B=YմpF[ s̯`IZ/ƨPz*%Yúрtˡ(/`5F\$oxB`IhH:peK|.! PRTS<+!hM.%vFi0[D0?h8VK1n'J n[E/@蝂.RU1vbWh_ILp=MRt-Y7x!M(zBWW& QS^=G5AUIEaQk)B ?^-`!Z ^I#~D3f(g)(!';#4;w^˜8 B3x%pA\G$ S'3^Jix2vr֩`A@Rb30SO96;!X^7Y1n[mVR@8~X6L̙ Y҂!4,@ (/` fB!Pg>tٞa/ *HgԞLlL9:;5#)uV3]&z/}t`r7`ke;>55ɹ~Љג 5E$'f!ϕ/'_; E`Ԁ)"UŰ3)M25K'w~6/;ɘRH9z%ࠥr%dk$| __sv_+!2(`i F;ҫYn;,1z+?`fDF@b(/`#i$qcjw%+BM S_c[^'KUڠ;he@Gǃ>mȃFkOk$ <y U_%^}94ے(ۺL&T4݂89K.WZSZ%B0޹ju|9` ,cҪ0K$4 Deρ:dk,oy{{<;yy̋41 ,3n4s 5bi%e8#5HY_S_xYsѠ>c 8O)RYgV}MV2_)+$pڗ|\ΓjgS]st,8hbo9D ˸GYM18PiD& H .,pXΜ``.H[סLAĒSI pZ Xt9Gz . 0۲1 e.m Ye6rdO0}N a4?s^ ԒҤA9(/`u56@Iec+bi}pD-eY\..,ٙ# $0n(ّOOV]`TX-RW *0PK3m_s()CP`]*CԂj~S6;~OX{{XsxC܋$C)>O|24a&yjYh1"`eSµUe(/`Mm# m4Q$se(" qv J#99 ~yѤ$<MZQS7aFS&T#AΈ@!I.U36#R'Kc7Yؼ$?q7[ߊ&k6idlҭ񅒏.В!j30Qu$ sP}rP|9TF$=բso=6dӖPک#fTѤJ̙ 7-A#p?$'hLapvIR Tjh0GgєHP8h_/6BIݿ4QRiXZ.`=QSGtnWPbui)ַx /!gb=u7l 15tIV[J'k 0':5  $(dG\)KSb?RZi}.>ic7Lѯtb+j:́:9A t@tκJi 7)et2t8dE 0B5f;4#)n GQzKg>{pk<|S;'xH|'(@[Qj 5a܌PxT8Zb0cn ;&pR"46lI.-M3tPw&Wk"A[bO(/` S=@foWyM9ҮQᆵEHpE463I6 \[P生}Qjv͂.^Os:O^k@b QFc@ g1^G$Uc15J/ XCvsJkOy,2ǜþI5/HI_,La/݄RDu9^o+=_A?LuD!;ou EʒKˆ"x0tY \ ##[\/X(@8m$(/`f[ ebNWA"Pͨ0 QTS\'.T7U \}ic-#.gKB;5jŦ(Z_G}t;N?=Ō HC T MfC*f'_c6Muь@P8`DҞJumD6vppьNԼ- Ѫك 0> oUC*-ւZCEZ>YA잟 %Cld-}?bY7g"iݓlƤ(f:$?4@ 6M ւHe[>PAduqϺ#9i NB:Nm, Z6 B |E`rfx ^{0]cVb8h?%QC P2lIt{37pl`v`" -9lte5͂;C]\gpގrA'-ť(/`fR;!0it"P~~1/PHƒ#TZx231ٙ+wpNIh x YJǙ@+t|.4^ KU0`8mZ\P+1iȥ[-CaVK1kNxҗDa9"/њ3qdҢW<0Fd݅ymR&S{xD3FiZaAgOl)Aj9lGV-LhBEq,h(/`S5 fN"0M+~ VֳdV9-jl(8EGEߵ.^,O@` (BIlI#KxѵNI  꽓jktsޥ ~[>4$Q 0JG4 D9WGD5)iY˂==oYߟ0 s-E ں(i>eNK RvzH7mP)4&'=DqNn ;X./f^-NM^s;:+9icbHvߵ˥) FAFNs>A|6jzHw3+4VG86Ff|65]_ /¿(:⣄ȟ@ey!Jw #JyB^m= {ɻt5xTc5U?Ij'u'PcT[08MUn,QDr9${$"Fc : iRABcSαz) x=WZVZ(0X_  0BHx б gj `1#Ց]"XP(/`[Viy$o="n/Ms('ɂp*snp3ax0`SحV{(*piI=qxq 52щI=giFi1Tk^oP6Z> $x{QǞ9WQBFTQt=o\ق.,σHmY>톀er+<0c|ow<&QhH+I .Ok7^e5 ,&:$ʩulEQQrRzU\JUK0 i)Fy7N R{sn/Z}CشR'/uOQszQN*mQR̘AB`(+IACL2/fP,|OOscvIwHnYAN$"Ӝ,A20QY[e‹ЖCD*9YU l nkLsq'\ sj3.9B%G3-8OBAI (OVB[]5˔i(8w La2$ZF"Z7X#4Q H\mkl5TҌQ(5R7A8 z (/` G"@ wfj/4b*M4"=>=4[X^ wf{֙Vy!:oa. Vg[ [jyR@GLwD# aT  'JD2[Rnj^K=ɞ,ubNhףs#UU[*G-Vu3=ifIFa^O̅sZ_Ee1;u W2HH(.9}/d !6ץnk\,ݣhHAgIp 0Caόʬ'ゅ1ˈ@"h3z'(/`%fT" f?|1e2w7katEb.KKH REY5dXsa`uk2ghPYW:O2Q 2`]E1 8\b ,DmKZ,쐱_geYj,R'I8kIÐDOf/(ouF#kH$m֘=~f]{>Y[uN"YFrm ڋ.uzP1*t#ŃуZp$P_Ԡes;_;y- B[E!0TmkFX%8/Y V2Geˤe6@&L`d:b2U;.do@3@"?ӋaIZ l8Ab (/`% =!Pxl/M(YQZ ĘH463RS@Nڧ] ]$TD _z&˒]j]= b Py!/V##c5ZJ&CLj5!76#䁥-I[$ck9$>!!ωGsfpo<:0EBܗ?D>Wd+ʩn~ˤrH)^|~3~tOp 7XY cifA2M谹Bk(/`T$ `v22E I2k}JJHOih1q?%Xtn{1΂PIN\ZZ u@U5+jĺM7蜡ņ}\K DM8˥t!KX"gIB$ "?\3GiD;f&?4 ljd91:]YI72є g}~jt]Kc AcoN*;;:"e "@-&夊aj#!  Lg> VƏjA"RbވZ? iH\)|0Lu<)9V#V- ôZA!P$wk=FS DLàspf.Hҋ6vN{a˯Ɋ Tƪc  ]$(/`U S? @f1Ҽ9uSOZJ-%Q-t776/c-bS 4,*M#K*fIYs5?0eV"kdV3PjC!-a>4u%z .) 9KX|xb ДX,0t؅1Gs2V#iUTauAP٪s $B!۟YSW#$\ 픭i#Y(/`u6d% k]V G-p0& ɷ Q 8 YYWGQF֭9Ijj ibvփ1(s_=qqU-@PqN!B5~GzwTf8t0!^F$ՂrebOu{mcdbYM̉FbGZg9"j81#8ewJV>z|{͹v>g 9ic5IԖ߯ﰖ&i@a\} ~} PZ2LdE2%N&>Ml"Ƣ`Y 4$'bq-{v &0IPH-QANڅ?0'= B(1Cfҋ 2 1l\A Z1[>lvYe)D+x 4 ^;AHEWo7sӜsG{o3J T#9I]Pv(/`U A PGeDEh}9u0HQmr3886 Y ~Kfձ$ŃJbT NP#Yŋ0?~P6 @>94GTNȧẌ08Å=gtBx|b3:< `"*Kt'gs!SA$! SXk/>%IMűPl\ԓөнޏTz Q3չZY+hn2s, 0@'  ;ԠlB X?ܐ^zmIqЈ=cѬ# *P(/`[! f;``NX:M]$ .ZL:kyJkӭS~.Q܌^;V~MD:[[[Ox/Q ח6 <'t}QKP$ZnY8wS"JX\c8< >)$2c.ʤ AyOZSE8;kkR-Zu4 |Erk&4pF!}Ԯ bDg`N IqyL(9_Y[ tj017| 4 ;@(8E0eZю q ؒ"J>9#)5rI0v(/`JU&ce$0HI"uҖR  \Dka@b`Tx @&AIV a! ryȔ)_5E$FI$A{Y-s \DQrl0V8і.3 +K_+ %R|tqJ 2u-"%W/|îu/ze gkS\DFHǣ0 $@XFq4#j 6}iGɠKmQ!u+NF<ݭv|qG&F ']8^ZRz!b8҆{BG?(Τr"M_ ?ƭFNxk{1iTg9DdSdovam/*۽8@RJKH4gxv2n@|da0j@;^ʚIOJ0ПU^2+tJE Z^i g /$a"0"J_}itG5֮^R @΄ˢaeȎOm$a3pz< nrJ_ާv5iTw-IYsaTXF}AX^M hZ+9DZ4DF/kkx(@1@@D v+*<ٽ_ ;JӗJCʲ@;:.ԧwɟ}h v4 @ HBzS" -E\p pZvdQ= B"g`ՑwހNّ6H7@ X쎏=A{]{Lj C`e2|s'26xĵ(/`GM6e$VU.! 퓢x(.HyHa`U D@RBA08+PII:B-YĦ&miZ5YZՒ"Vds F:}([M6^淢K$k[zX=%K(K.SHӮN8[at>Kk:=Yzb]è7㕭O_ηr;n4#d$ko KTǮw2M30(0B`kF1ͬ: 6KpWQ* M.g$$5 ;f<6dPXi:K*b^k{Qj3 Y}zdRW(/`Z T#0M­i۳u EwH=S q IJG2^ , h; %1^ ǸiAv#?n˧Y?&JԈ,\$6eoIF`К/ ڮa~_˼;n>Em{#Ɏѵj/74%tYiD_P+M$=?{Q{MVFß.<ϵ8CD3FH`V Eх (No ,) `v3H{OJ X!;\,9IX,杘?9f 7`1ݳwv7Ѻ! cB4Ml4R]:egH$(/`=}&ڤD0Y\!SG;޷sHҶ<zpm MnR&x#PDBMWM˃Yx,0VIB_3ϭ= jP4L>镟 cXG1IWD:/֫U*Tak&Uxůf\X},ekc.g(qX`(wC؆3Yo_EOuF ^ѪL-{Q屛4_=p6?k ×uݏ*e iݒkқ8tUBPP2y>)~G!l쨔q2u/R9Wzq֗U]jYvU))n-@jYܪ`hF~5Nmy_1ӽ.[>ǁ9NTɰrUh/Z)v/~;#4X<)u}RjFk8LRzU}EƐPx֪_lqԾzvF=AlSI.b(0B`de)gR* $""`15$_")| 0HY$USaޔmOm9{ZmCEw\$kdr Ni3;q9gL0Vq*5Z VcwC?o6?kLÙK RT*TJ2& ӽZbcbv^QD#lsTr.,7^VZ'>^֥_M766vW[SDܜ̏t6zZKZV~S}6XVܝ;O7CI^ 6#o$3j);}˂AK~/v0([n'd )4m+a(0B`de)gR* $""`15$_")| 0HY$USaޔmOm9{ZmCEw\$kdr Ni3;q9gL0VqT}SU_oְ*Ɣ%I{mZ H\0a k/.0Xvߵ˥>yO ïBҩ|h?"CT#Պ-඲+UPnJOxU94=xa7AZ};+= Y,O\IR%!㲊hx'Ω7?V* 0`F6}CBoG"\s<`f1 F( :+YbmmkC2{-FLӭe~>14oAk% (/`t%:["w\ٓJu@rl_rRQOA 9&B#yТdgګ1)/`q"#LD H(W0fƗ6"2rtCCgM\ c+#2a2ζz6ob\'5v UF3ʤ 4M7:J7&ršA_uFq3x t`Y~j%|6la*o1`yWx:Ǖp$Roz:,^/,X~nٷWnYYڔ*ق1ru7E8R,BtlGwX{17Hq-l1nikmT);&lbbktM(/`5V$ m`/ObW-]dwb?|GLLIOq5d"C`2N_Ay*C٤6R]=]&bMvG^KI`un"IhO4 $ӧ(k䪿,T<(|M'&NT2Y,6f@Rkgl m^M;j7>=Fmf!]Kv]ÏӯJg U~Վ +]#AR;,,< q@(D ~ҿ5{3Vog+('(g;:3Y4Q7 0` dZI G.^&ߣ(8PP PQ#̡Av2I/3p2ؙ!.DQna#I-jz#N7EJ&tN27 Ojs"yiֵ:(/`t%l;\JT ĘI󥛍J}Wqm_mH#bE8R,BtlGwX{17q-l1nikmN)A:&l bbkPsW_(/`8e N" OděP';` gua$e@EDE6jbY c1 FsS6k=By %RQ"t/jet9vfb͠wQ6Y ^4{Сڨj~& L0+Yg8$d,񖗂J[^FYY=5A|w_IL!*S3߷x ]SSBx4+R3>e ? 0<,]IP^kqVlhVy,/~&'/+,C̏S-U ',u), `Ve&{JՈYS@^ db"+b̈́aI:`1O ?m`t$ٍl%w0opHޞo Sd+A2t׺),L@jv(/`m WF" KV-2i 'ɋi@thZ }H<;@;e-9QNoFkF ^؟-Ϯ1k6>u|.iqkZsü6 4Ι&g$M $D5uʝrSPeB}UwuhiZȱ_㣯ܯo (_<߼--ȳ,25o#9 O0${n.}at!axpw_nOՅ׺WVC:VBpa@CVR Fa^Vjs"_ (/` VE"@@$_EʯK歷 \넞M><<<WcفqyEcۂN.*؏pbg"}I3'hjn7 ->'KЈB<۞rhS&M+'}F"15PkNX@@c/A 6kԽ1)K$#T(O(#"'qxhᇉ"YBT,mNE.-4QQئUuyȲ_%ܯp(9a`;H,߼ vYj4_WF!*q.G"!W0ab6.q̬u) {ۈU;s{nW&4W+퓼Bpa@CVR Fa^V՚s0及0~M((/`M\%Y`|C<b^}]Q@PRNsk5XNÔ i%r8vȑ1L發 LxA_+<}Zìnz/Vߠs wJ|b=Y ^W@c`Gcn\ΞxL9`g`CElO564)͠5τ߇sUP<RMcG~(Dq'\wؼr0^IPi 9WXD1"pD"JDaemDJp4q2R Be^1+-{nYA7Ƿ5J]dϷ`OV&5ܘJ99}ywڤ,-G-(gQ3% cxe\ۺ]}NlE1DUGL}/Ik{ٯ#!hp|2R+y= C{h`$3!ꓜMR}fz@޹,-|nz Ū5Țu*u!FRS)5iWF:k8DUg1Wy-DOYh(ckg;82{xۈE:dv}zcUgIU]l7 cX2viߖD"Ĉya_z8Dbd<5D 0BjSO^CJQ3HB$TCCL0UTVx@Ex DUhHh ZQ1N]![[?Kt,;?QfS䛈o0ynQX67@dl[GegvW{2DZ I(/`l T$VFIHW. r(X( LQFb)cTh͢P=`+g!QrP&lm gi4DUf $"6:C"r0PK#K+X bfjXc5'PH8qcZxE#l5'R ބB.)u2y]絇y_[>rn2+}o:Fo&Z DC"9ߥ2ۍgwۦ'/қTV^NH˸/7.ݱ`pv79]v_8(DshJ0ARF7|?"Be1iJ/L4'{͈jgJO`c++(/`i!u%jʤd&W}0 h\! huxѭF>Q$5\) 8Q-\Lp4-Po@I@hq^. #**$4) Z^)qKw2WHt=qtgvyoQ Vn2l3W/R)#{ hy@ t7+灉U2Zn} ~_cA)?P4nxwCt/VXNJ4;ckŪ_v5}f.Vgiމz aɃ<(6WFJ]f!~ UR{u^1lZ6m:f}pa)7 _h2 EA2)`2I:\u9`WV~lQAvX R X sIq/%>'~L@aWDXwKkw'mM0r8ӝО=JlMT@bPѦ*5$λnf.uW/+z"ҭrkM7x^F wB2x&w"E"jl2ץbl$&bKODA!Zc)C"0ITW'9&Jki΅{v!TZ]MÅ+?ȉΥF֌n-e!QT2 6J <^y%Iy)!GE8p7}uboz#(LŐD/-]Z٬/ 'j%L!(i"Cp2RYXZOiD 'ztondҾ^9j8ױ{r9(]|[+:X{[c%YHVy˴R>8qsy8A6Ð,(eZ0:vx_/UkfY/mݗ;rFgً{vs\fǘjznd˓&|Krl#˥W?bݧ7ysa:f H(B`<PtDIH`>%,N`\h)rgnBVXy8I;涓,ZQt*)쇣eu`~6vN%+fS dz=ht=d+A9)XF1ȝrf+[Pa)WFE(/`h%[U$oXG음mA=em"5 `KJJpYPbb k1q Έ43{+MJDB?9;o&ixe̗s9zhOO)$Nx_ -N3㙻9:TRۈt{p*Yew9JKdFZc4 B4f\ ͣ93VJ{ۗ=Y̞s)'cG vl\`^m { vا-T?ɑ*m{m'Gƴ,mD`$Z bIt,@q0Y"W$XEz{``A^+ B(+V}SLA+hRjfఓ-s6m۶@6 2qg t0٘@K5H&da@x*a$IđQ(P4HҮ~3~O%R,(Id2a悢t ` О@C˥t۱<ԧrY*!%  @^y!ʑbƉ߼*oFk妋1 lIhX)۴Ȣ{l!S⦥K7].Ҵ _$MqA0$La<HA A@/%ontѾ֮qLH5{Q=cN@k:47}y N;rkLq&{a2>8qsy8`EAA(&uvZus45;vϛ~9rc>E=;s\fN1Ȗ%Mv[1̗K|͇u}Q3H(B<PtDIH`>,,|`\hk$ !] щ?HD$aluXTeۂr0P#"~8PVl/Ybv Lrt=t%O4Fs?] %c j9,3[&^AR5~:{J-+]|iz!.o5/5WE挑_1|ۊp {-Lh_>9-c{5 ZI(/`  f>@Gf$)FַKP2UaxJ"Pz]655/$*:#z& YJ8_o0"yɧ]8L5U?7L6@j!mk_'’nq7bMSWƚ:=Q6HlL=K N$Yϓ(@B˓O+CBǴOTJ ,"Zu!@gd>N"<%k5nU\E655^% ᠡc]~ʎJq$+Gm\6%_ElɅЬ )nZXX!d5!̱-& a1U/b{gӸ$e5V`-w8o+^k0Zdm9H=F RMEJ5FƆzɩAGq?lVqfe C%Do`Mb"{qas_Љ5Te(/` FP#0mk+YҸuQKk ?rSPR8FGG"Z p/fEiZ?1>{ǂ(PX+0Х?&^#^ɑO9fJ<NO#S$Y$-iLr%Q?OQQ֒-MDxxC8[YF?ȥȽ(mu%枷T εTbRR# Rvz :OՅr=] J ӟ( 9s ,jI~Ozhu~62'8tPW Cqs7 >=;, B,|}gL'˃PC!H&杚W)1R`@ wo9ѭ:0β\do`(fFoϷe#('T˘(/`  R<@Gf$IַKP2Ua۪a̪\433Mٚ_t5h!FVI8@'`wbMT#_9Ӡ^| `ά6{K4OVFȧ`hF[ڕ#=n8a*-T$OHwKt90_H 䍜T<:[ksEQ*m+rZuU;굳-Ygs-g,Ε[ fC XL\V#kV\ "Or[Ҳ7ۺ,tb3~kZU(/`q}W!4G[$OStuCE&d  @UNOL﹵r[x WGme#*ТI)s [Z-8((fݺ7p\_LR[N)qL:[cEO;?j15C_x^oN^&<[H,jŸ%N L D)tPFNd!yVP˭F8Z ёZ$ 7 @ t_@rL&À,+<\'Tb.PJ5H97;vŎ7 /Slʍ#k +% :Pd{=ct&ȡ 1[J 'F/ ZI(/` V=!0gnEey}G4!oX:IO  554X7Z9`SF7d鏐 Xߎ XSkHEl_yBC"X)溆QK>l%Gr$L2-Y(~[Wpl93ҮTR[!-(_V9EaC/'qLOgoqg8SYUiF0یa;ZsVX-vhFj{MaBd <%Cn`r`a ԽH2`k[X4r5XBvA(/`k &M#0mk+YҸuQK|hT DEDҎ"Z p/˃a,\/k KzsϢ|c+=Ƽ`y|S|42OY\ &Qç(Ck'yLKS}֜2=\K% ؝>UT~C[N4)4b>vX`%Y0ʋ5g9 ?w[i'AZ᠝pM;:+(MZh_ / @eY{RJ\'Sn&Y$F;u@N hۀn2UvKx7{}{L 1ǂ*l^j9` $(/`r$XCաok@ >-?qjdhH<,AhHc-4 #@L,Tê-S4yg>fq<̄uPLN~)[ M]DJѽ-Vx'FɿP8)3yl$]S)VYߕttOYnZX7EF=Lzf+Qݽ98h(Q:e͍!a*⾙V_TB~x a IJC bD#9yWĝѯV~(k}Y~>>2U$ B3'9Ƴ 3;St]..$_UI}&Nٖứ w&785:: d?7^pIJ8VKmRG|x^3t5VkK{BDYls!l^Sv-[7E(B`|p7CA9s)l<ŘO{=Ȁ& =J%8 kFqD[i :S-nnCڿ0ZҀu.H_PK rhcait⺅&⦧Z6 =.(/`zE &VD!@i$%FUvE(jn4:]ǘ;;;I cOOXMˏ+9c1|_F,ym4ZM~fwӫ" 4<w2Fh7Bu&4bI${3ާr198{V/g)G__ڔV%~Ӷ1#~Q׈vܑP~ڐ[F+ȏTK/oUB;3$@i^q=~xG'~ސW5*u " Q hڈkKH,cNd6a GYDm&zXE}9o,dO?ϥ/}"cs.@(/`s%q,3=XICכ FM`1iSske`A"1x@" eb4']/ة!'Xq8cX&+_Gr!<AebtEB <<) 7JEY˄gU^q)7Wt.g.rg?\ g(o:].$߉Qrr㊓jd8e[5.7S0LBojHE)ُ΢MlCW#E޾o__7+Oe !ʘ˘nhmE(p7CA9s)6T(ŘO~=̀RU%d8skNq[i ^9Ja1n!_9- :$W<o+ij(qFXg]\ca!YiB+Z (/`T\$hTO[>)oM," PQNN̸NļbnPXk4 sܚcIBz몼L/w?7gJDt+1 /\Z`Foꕎ{ !!r\}GƲN5x.[~ہhğªYN: di *Y4-YةY1` /3f^U;%qzY}⎎-#}ghKҹumt/UGQGF FbPIX@gI5$  `!,?/ .1hgݜנ kL(ZBp%鄵3 B, B~F \Wv3¶rq%<3'i@9H}. -ieD -$"0G݂/m:f<9{λ!x_u  ФVۈ ҐƴKI8e{pMDZ!K[`zcN昆)9uI|]Ά˺YFCY}c$L1R{cWh9ZNISֹ}=~-{XV( '5 ꥱMS0Zh=Q8Ӣls #]TD`5|oNN!"V y4t*2 $ٝYF`BrnA<ؓ3rRƗ+$Y1xg?o`+$p )L~0=Uo[("guWYp{"c } ]$(/` = PGo&ׄ4K?ۋQZ E&3`553q-OtGn-z% zH%i>?50eD/5»6>L9PJ)I;Y`ь:32s9/fsLQy~ [Ó=M=v .!J'34wpI|q0rӚ{w$Yŕcŷ]Z%JV hӊZ }(/jEeU  A%DEo`=q`{`S؈s_Љq3ROׂ(/`f XL"0 +l V nM6=vluxTI8BCC67GFXY`K?Z>ۮ)4^9B_"Vn R#rkk#(Sh `U ;yڈjs"c/IҘWqqc0I{\Jx팋% ~+]jmv!k.ӧJJяA4Jn۠gzn AرиDi0wk]MvK;c"_0~℟Jh1?\[bE6+ {/nˣ ?+ FTCNw'J{me` nª{NXOa+$Cw7Y-Vӵz0DS9nt«Ƥ%ꙴ9-/:ohZ&(/`] vC!@iCIJn1)"/ϟfA\9<9^y) iNjz:ŖB(8 :m<|4+u1N. %xŤ['Q^StV(^ aP^ AF h!Nqt.fQz!_,iKOK!4 FQòEN~9wvys[?\'.#} v<]х'=uBS|1 UU1BCNH 0B =JzBsC\*:8,:B!Qv,p+(/`= ֗I"0MT?IƦm]1?jb͢þs@?@\ѿaؕc1Y,$ =[ZLu]n [}lQ&סNPʭr~ aG֪)QomiJЈ4IK$:Ӆا%gg,`<ы-,qlSB՟Ӻܰ*3'@X_d:ۮ $Oh4(,+i ~W?к` S'Wޕ{0I^la4/~sxZQz5]B! G& B1PA\ #[Ǥ;fL K6 7PbTy45q0ѐ޲1ʤ'u2&К<̭ʳEQu΃JG|(`pL%1Nk  k)`k hX`0 <" Sѱ3'մY; tY) bttK^2 Bc3`\by(.;`!,ygҬ4:yJ&0e^喅cg 6%$P!u@Md7Pra)س0emX}v2`Vv(/` &<PGeAXT-qP (Ed{3552[5DЈA;PK欈6fE/ox"9YI^Jʉ4e0q$Dž=4-ի-F8 6s7IETf9"燷m^I[%$xD$Wvqս`[ [P(/`vY" Me;rE#󎡐E8ϸOQN8N)̸N֋8[3X+[IҐ91fn9H3ᘦi2Qo oDqksѿcE6z+7HX@`oY(GqRu1v#YQ.=I;I]1= Mvf-]8ɚ r6֏sdun4 3*]Bڋ#ǿ,n/ť񘱊2U{-Wp^ _Hk ,Q{XV,`ឈ?()%aws" I$,B4`4TE{5ACtb- А[2ձ6 BcvΆ@rL҂/<\'S\f5}kS;! !BleN!)z{-hƣ¶O-,-i;JX(/` =PGeAXT-9FP ōQmr3554ߒu<4>b懂/ ` (Yu>ruΊ.^߄DN%~pgޤ V#듸œʉ4+1aX Z ׂjWhoӭ8klgF8 أǃa;Z2taN*!!Ad5%aMNy(m+zr:uX{^ } Q3Տ0d痵8W:H @'x 3H| [d cWwBELDVnͮ#@؂2(/` O"0MDqoچchÆl:=(T0FGF˂qWDۼ,c4 FYFa2F˩x5#.(}mZzW!2n_=ғ0Uu4#Y TɘIï*CK8"iMT:y q)ߵ3.=U[B1!:!pzS7өJ?}NnX}Bӕ x OnKg"_8a7AZ}C;+=-fԛtP|Я͉8鋛aw]\- Bc+n}]L\DgH,,4`BZh%w 6]n[VK@ ᡷۂ=0Z+d;.2oLQ*(/` W$XݿPdj%i0- 3AG&*^MSFM( z(UQ cǚ`ųpA 1΂4O|9 ☜(mh$4Xo#<#Lm% ³RϓRjM$Ly4rP8lvTz)`@,Y<'Z@Psb<)b80h' %{ZY ]UVu?}ghL1ez]WO9Z>7!{2>3PD$WkF5RڒaHu@ILPRD'% *xec$/Kmj0wR1ޤ 2KѳlVR.!(C3xFcZiCM>b$ZxA2PXE %:;5@fcCQ#BlZq5CP(/` I"0k4>a\c\g: ʯ B??@ cI18D5>e#9쑳ں RveȠq 9R QRʐm,>fS;ךc4T0!R, 32)"QMr[) ]>GtNpFG{eT{pd$$XpW _Vjš>W2ro$ʢFSM~qrGС~#B{% BĴBBu5l`C Tf7 mfgxۢ;J |+)5ZBKGD@. (/` &]X%o,?H>;]CL4F PSGN(Ě0y r1 cA+ 219Q>\HL2l6JYYRN)o]O̔taCKQm1v̵a<֜i .pcs8s$:<=LG#ZdA,H,H{ %{ZY ]UVu?} ghL1zݩr|}nB!( xFcZiUCM>b$ZxfA2PXE %:6FJ뱩%#NSW (/`E[% o0BjIi"=R0ܼ<PQRN1k'\@Nn9$*@G8Y.&+ Ę>Wh)'2W'FMvG^J_IG1^~_\. k,  a1Y&x-O >mӉXq%~<dnOI}Fax_L_ 0~yX)Ca&Jϥ |[߉2uz 8z`r@D|A 1P{_G gJ" Z2pUP(/` 6P! eA!ÝA7ȣ/ڦo,ʀP GGEQ^1qx%QtB(fnHO{,Bc.%+3EyB |sT a/ iF{ɻsA~-e7ay=/<=) :mE3{U'iHw%>fH"טO+?mm1tC8Pq4 CFf_\H<[ v _y*֚>{ Gt8hݺy_ީgXCHIeN؂Kv% +7rtBu1I8zVaN 1pɢ*Y$(!m8T0tkl-:_t{ kٛc8p4טsXvVp2 $5~K¿pu<, N'[Zo܀4؜!<^n6؃w>cdod =>&+7M_="cw X5I(/` A#0k{ϪcAoϔ}]},A쁅!756s} ;Euf*d&y} E0뾕rL2$w뢷VShXvNjWD̯sq@Vik)zku3yWkyP4h 4Gz脴!hÇR Gr̃E*<r0`7&!h׍5 &kUeHXVmS{QL7V`dT#ߥETxBgБsU~] (/`X& S`[Y|\Ufo-aXF`FLOMq,GK 4R4k, q2N_2>R2b2 Q$k ^ vZz:3c (N * $׸qqV09Y tr4ڤ‰J'y}Qt-Y7xZ ]r+7fNEA_inP)5=h V. R?c޳ GD7NVPN7 88$#lӭS1_ 51j݇6&坂n>0 B0#o,!9` 0%avļ3m7-Pۻ'x]ˊKm]m0qCd(Bl|[3 cs+O CJ H(/`vx&ϸt8tk3u?4Kdؕ}u tkpUUWnZjHӃIII`*ʃ'[h@2EJ9/瀦=$,BsI$2U.YtHgw7r؝4/8;4ƒ,M-8(}S=|Rɍ=+W/Mkf에vϱX28Rƶ%ra:(G ՛@D"9#*IUTQi1M.W1K[}tFCl4  e@0#prlL+y   ˥؟eZVгaN_h-zh<ڬJ蚿xJYõ$ A:f[@<ǚm٬J}}O[t˂566wlqiݶ*]ai}lOPJ]ϥ;;29(t=E3ڔAuDI@ k)Fi-NzxtƷ,4D-C̙캿,SIcgk&+;@8(Y [ @}| ZfzڷzR 0(/` H"@k,j?Fz5XEq0w3o86=?>eIMAn%?xFK6'{tєW!{`?]EّK `]x UMPmYXC*W0dՅip?iR$E1I)|3&ZkI}UPMh;- G>Rpm:t!,Ya T@]JͺU Co&"grRP{O옯WY@vD}]0'ws$ ^Z+f*$.{L|Cf+ $囊7HXLOn `: 9?а%s"'XOC0Lh$(/`y'͸L8t3D>e{Sc581*umqi 2yj'!L@/ mdbf[x4EqhȦ MR$Aڜ$=zJӠPMd`r"ƿ~C,: i)kN{/w;ۏ[ mدۛdξji6wNJг[]$E#l4ey8,eő2l:;y ˅اi[jξ[zsGO3ukmr.Do Ԧ3׌AZj{ZngvunΎ/p{=vl+lz; }~?v|R8mo?u:FئvE['sZs3f9(t=E3ڔAwDI@ {)Fi-NzxtƷ5sR-C_6SIcgK&b Hr?JxED-B5)PogBJP׀'(/`l]$hTO"1쌘S13 >ux  PRO[li_cĦEn넹Uz˦ožG֕zL]E~{WK2Ntfʓ{8<"l,n]Hj!+dlOtyl8fωȈhĿb=)Nl*hrkgLuTP:k<-?fNwjz$}-YNִָzR{S}}! ?IK_ؽ Kғ]''*J vtvѸ#i$@ $$zA?pYZ+1-(ΚA4e k  Eܚ77 BbZ\, N˓azEZYa> O{*u&z^戹tɆlZnKXY7M oFDnbҵVP1[[3!TBA l02&xÂ@(/`) V=PGeAXT-9AP 4T'Mbr3564~u0 3U9Qz WPȐ?BݷK>Yy!O@.w`"D %l/fI|b +1Y-'+a[[΄~Op}.F< %‡cPa  |Mk/GEؒw]1scH#k{y%SiaiU/B iMȲ'M%dZ!<9؞E'-iٛm] ܚVX 7 (/`F[! Me;ri\!zAQ,wuЀQTO1:W79EnIgX0L cNgF ,Cg/lۣ qkЯZ=R} KX@X f3?:4邺ʑzQ#9 ٨Nbd)D4UTqsu,P:a2PV_8ni?f\ٻ>=~}eq{I "}2S{-W5xne_jϡ@q_{ HO{XV( '0i"Rխe0QD8\EF@,N!{ck8AjX4Z- ' hTKsu24 #|%"9f48,82PFcgPq,D!@g̅|FD#/JزTJxmOиMvO+QZ]1? A Q%8֟_a{+nd>V94'+ $]pN%Gbe "pI퀁yg[o@Bh-p1Ƭu6`4;h?з3|HTh<&C`>-c0< ZI(/`e E `G[RFy!;g;s)hxd!b;@;\+s+f9֙Vy+ ~ǁ(GzPiü63m5m c^' fq ➂$pi˃ả2BXfCZ3q%h0@;Ĝ)l0*)HGwV߈/DW6NQӻ=gqn t<5h"*i\-AY̼ pJT"` ymʨɗCUleU@9SL#^COl]:33VXV ]!N((/`n5 fD!PK}][uR#[ eVҼV;;;(d%顎i-S> -AKS6P;cƫFD {oLBo6Dh]UWBBk#:|9`>+1-G U^T(VkDh-='Oeҡ3$_ڎ@OuCBmŰgTBRNӎr.  ' ;NH_.v$!Bd` ^`7zG3r6!  \^Z+ *$Y6a>s.P/i:tc0!RX:v ] O56}j " 0 P]!MR-J5VH5>u}gS.YxQf!$$ i$ %{,yjX FZk$bX-ӹq>o`5@9SL#^CO7l]:33V؜V|Q`8(/`,e֜Z%m?ҽF6o.L4ONM:1=K#49s[Yid^Qkd%x`0&V sݙOAy*E^ީAg{O'/.Qhݺ\_BV؞c߹5ni0*JC;(=?F`cI.{ּuSϯAGirܚ9u+E:; kFՋi?_[[A/ԋ ы]%.Ha֎J2D zIp&?{ kKYk8hRSJXc@ТI2 BN@\bA.lA!y; qu28Mm ^^ֈ36db/=lސnQy%!`:$9B}[2$%ؑONsX(5@(/` S> @IeIXlÆYL<TZ(a]9j654uD!a#Fż803-GRŲ71;,a3e! yn/93c5C.q/ U/:m3w2|D\zC;cɄi-`c C9cq("W:$yV^َTzo)BCT\ ;\ir+ G%DU0cf :BFGP\_Ppzkk.(/`oV!0 e-k.iPիδ6Mci*iALOK狹QN)̸JCDnJYdA h953sLz{Tx1Ň9Oʭ.A v Fq[+CmD?HȂ\j(h*K%22i`~FK csa&OV_QPBۉ9SR_t+s  +\ڃsXV(PqQլ#c ➈dkDL"7QH.iVIX^6 @'x +x@|-b Ņ#Rz`!"#`M#4(/`f L!0M9.t폠mYPkd0PBEBLRkgT̔Q)=2N $ 0a22Kvk隯n 꽑#jJtsޡ_mR}STd%% Y*-v8ZhZsم:|0LI}JYE#*V|?ϣn#Gғε4wT#8uus8`p;镮gz[v:2Nn s0MD@3;鯘{C1cAZ]qC; =PΥ7֟ؠ_aLW(Vy+ ETSN{G!XF$NOl[ى:Hw@;@!EZ_c-ز ÚtRRKdYI(/`U$AX (o HRi'?3S" ēuy ?E(5 ]Gn5 ]!KO%M#5 1B y40썃648ih8a X 3XƐm50=}Sa`a/Iš<'$BVQv#C ! BUMtbi .95(9AEfnlG1 _Xncm ,=7&Dۛ{reknLH1I(ŘޞA)zF"gEFddpo"ur k%(l˵I:1 j3t`ַ'41&K2Mv參m崗(PjjaB*&!ct2#, G'{<ﷵ9Vh+P 퍍S7=S)o\gt8NdӻDA^w'tAglj FEsۮYbM8AmPӆqRԄ ~|AD a<(qf\%9FjMJ?KV v_0%B U'YiYBEXR(!EE& H\Bg%Ŧ=0q}u9vjA]qqr1``qJ1,&bzOcdLQoFK2LВ6NɅdܗcQ 20F)@H(& M&xd(͟ ` 럭\׊!)He=Xveh bj}jhLJUPDg$< M7W NzZ) ̦EQ8"΀p AJƯ5QrL7TA(8[9Y))=v{_WvV0?Q_5FɮA?? o@9H5"#dzs8oA0[kJ7uHwn F;<8CfD쎚v'!_oN3fӐ7H#9+GMɷ'}bB, q@5kK%1zNgeT.FZZs( '(/`FT% 0B|I6g0uq.\*!DIIG`8GKᣬ[v8EC;uzD7'W謵_mN9/GDa ˘f^~4 doY/)|if…0lYl9Wnp,Vynys]mu*_'ΫnSɚ_vsrPTV{w/yѭ)WA|EOHr:R7a,' 9Hx@ @ׄ?G9z,3IN_fHRR (#\\ѩO^Eln8 {85 0@ f}L`#*.9 C[BEA $2a 1"= -~i(aJmA&\DN@ nQ س0dbk@+aa?.R ZsI(/`M$ B\ (o 2i7,eO;kKU$@.$d@:r ɏv^z:$y8R*Ïܱ 䱰ޡp0,4c4Ã9A( (=Q*6$Xo4p480 (ZG%F ]rjQIq%9AEfnlG1 _Xncm ,=7&7>Q_fܘ ~brs3=R0Ew/T9.%po"ur k%(l˵I:1 j3t`ַ'41&A4得~"R ia!?:A/H |}5̱B+\)F%76NE[`LQA2 3q,Ȧw8Okώݓ$E1V]:)ĠpڲB J ?/$ HRaJ8cP.В#5ea\Z%%[+;/ v˪@EXR(!EI&HF\.Pbwq>o;.8f~d(]V%#?USLcL OhI5 ZI9ɐ!)cQ 20F)@H(ɞ&[<ĉ уiO }yX>J|uZsVRkDɐHS[,2Y`D&,Yg2ь'#im"f5V_Qb*%7@H\'@xLcRkGUdtrm |G WFr>tDJJO4m6!צ'3OmWQ+)~?3z'[ PROvȈD ޜ5EK"hR%~!3ܥdj5!ƄRh"bIȺW=kśՌsH{ݑ٣^U GWRI`;Y4]˫уYisf(/`^ T$OUAIhAqyBxs^DSKKH3.nm~-cd4Q]F:/s% N Ҍ}%-|3i2a=Řc#rk0%HMZ P6>xn([B@mQDJD+s5i4 jae]Jxmw^.MH?{ڇ5((kĜC0ذyRZі@x|I>Ms %siA;18εhmimIcq7A~?+AX,8UD;;o߱x3^_4a( `V4L{OJ آ4YR$8l8<9h,杘?n`Yf ld:w6ɺ^oϷňir+qG:-'k|c@v(/`3 &K$0@ b[0 =zۨQ@FAQ #Un^9{GhJr dۑxMQHPzEHXT=H,RgQӆM11 iL fѓp95-^`,LsL/K)>u|>P)`oV5(v`i `0pH ׈L3q)C8 `+ 9!ߩB+"֙ ?((/`UF]&a`/u:e{ Ƭ6dw0PU%PRRPƎq0CM=40sM!Ůx]ěUi Cw&4E1̷c_s2Nivf`dܪX ͊T4+0JEFi-1,v\o4oGжZӗ$IVv.w9V[fe\"@:bkY8&R#ݶt ]nMTcٕX}^Ir_Cm /J5(Rǘ~D=zP]+Eٚu',k¨غ7c紗I*3V  LkRεzv̘,TH]1 D3&7* S[QW 2Y _$<8xCs_J1UۺJǜ3 $`WY]en-Uok2O[{Bs!43 0BbsuVʌ j䚂3J-4-dAO֥}q>w%-PH`,{'AcN N}v2HWXEVL|1b,#/`{};l]i hI$e撐:`.1VmnA-vzFԜ}p rP-ŨpoDa3s$I\U=mѳ_23GJg޼]1Or={qN:+Yz'^Zxrʷ='}dRZ/NyX0 x(ޠ8tg2JZ|[?>qM7#V7\hVu _QJ,X4ŨOkda'z6~;:g$Mt˱ز7+g|7[R1՘vo0r[ˮ(o/Mj;U}QE:%j4*V5OYׄQuaoi/Ufl&483p+1"`*0m슩`<"򅎷1-QB؊b $0> 7Еo"`/\)Fj[Zs*6k̭mM>Ws=`x"ckO!1r`XPaBbsuVʌ j䚆3JEh0Z䛤AS%vK|J*Q ,'AaN NtjEo"nfLbDM/`= c;/l4:h+H$d@Pi.)g/Apf@ǧ]Ƨ4bCn͎(X=?>'H9lS-e5( J{ U=[ 40hUY)n$Z[i׋bUK/L2? gϪ6`PC S1X”$6|I}Jf,<#Obi ;ȥ|*;Ҩ|wh;BR#~ԉ>ANTq)4=>.[K{ Zb eloZ+ ?pT(/`e$ m5ǁgR4LސNݻ\ _wϬY[XVҲy%3bl%ZRq1WL.:9h@MN'96sǾ> س[9G(Yl #~I K~쪲ѹ:v-uP7u| `p׾n Wz.8*kFC帺5ݏe`[ PGo ~F>їLy!kd!554)rXEJEv7-q7snI å*ҊkdmdhrɓSo.Eݯt E%DEa蠳l6>FGP\_PpzkI.(/`^5fV 0KeƔ[\r,aWHDTp`RMOK:A?/"Ktkַ.IX0Vb1 *>ָr&^IO%ޓck4KYv&bq`฾U˵GTp񎷼l wxnǩa`łasS uqVq׵Ӫykufztt$ڡ;M塦uSm_2p'W&\WzGk N:EaȿI0:/4bS"DfAɛ1*(1&=@ :ּ+s }1hih1Z85 5 %L|ME`rfEL  l6İLcV%0PN5q'uXuRm6NǨdcKMffYU]̨@^{ L$HC$|N@-CpI@GsZ\|9V+NԚo}.gvajsfS;_@k =ڜè40܉DEtxᩈl9Pw S7m};Ȕ, OX65}~Pr7sjؔbO@5(iRi bb;Q0@m?"OYnhE6wؗh"" 1&e L`"P7( )fbW('2*ML*lto{,T: &Xh-7 (/`fT$o!|EdV"@_؍\?Z55 JIH F"fe0^YNs%̭x۵ōwԠ\}mz&Rnzoɿcw RH-Qxm.E YcZO%V֘4aT-"kO_I< ?DO4&^;ceNMj'.Em;XPFҪ|#wU+DO@xJ[7d#4z:MpQ;=Ms&" xU¯hu ,s Nfw)Ni/2 0B;N`3\2[Hs} eqijA6%d1Ö 7l~F{n-Rgma{X!LK4!;xɷg@S,h%(/`fe% gK4$DNHvQ5q[s{ Ra_S eӤA Ph$P+Cb8-/hDR]}AH6/oFb峨yYPoybu ꡵LP\$1Q?3i0mIj8sϫ)ߝ%6Z ,jk.|U/Y&am(t8G'€$=GAGȓ@ #uӭs;Hn4Dubgfc&yjͷ>zRsȳ;Y^rvV3=uxVisv?DwDq" `Xx*K ?&—6Ǭ~;)/y-sO+m>tڼD^e/w;YInB4(iRi bb;Q0@m?Ϣ806q3y7²/ gED`L°`P*7h-fbW(&IL+숴lyjj A[KͱZ]((/` YO#0m^jIc`Cusw|77|TEDE ;63Y^KìEhvȺjFJ=+}PK^ئS1khKk^4{!gI/#|垪E1ji e(}{N?(_mNBfi0&o`1Vi|kP#w"5T*foy ]KSB83'fN'}JO 0<(]*O^kB-v'ˋ PIeɆfv\jq)Fo_8@їa~t]+& B82ʼ\'/%yb`Sf+ $76Pb~C<|4g|mJvSK50) ZI(/`=F&V ythKzk|r8tlƇԭO] UU;.,Q&" R\$P(K\,[.J]$(˘lcT61"BT&| ?Db@&Ƀ@5i|=ȸ܈f)d䨪񀓭 W5?<5.z쾏$yp;gZhNiWwQ\)] %.s⓪j$uڲc2EeOyΕӄMZofp;Jȝ7}O;/(Gy$=wyUɅ57SS|>j|Φ!ՀhB X4hp( fY\A@A(gںfFp!Orq NP4S [ N`dZr:TMTrуL{K ΖN jK(|Ti!dTt0q2MPΗ%> gP?+ Erlҡ֪8,tfDv`P)@*(/`6[T$0m^jIc%|eTvxTCAIIGN[^m3#XA; iMYT^BU ʵF%Oل5bSmS [ ..Q|`%N|n >c c,U*hlQ^N~iM/tƱ瓸њƂRkg\`].w .z Q=vMPPBҩ|ghC"BT'jE_Ρ`meWʺ Si] P;1D<0$,D @<Մ??鿚O7~SD/n8g%PF <s Ewu)NׅM_p 5 B3N`3mǸt@ApBmLx %|]NDCc` A+t&消iĺn| ߀mzwi-m`Lh잌pXx_..(/`UV&V ythKzk|re@bƇԭO] UU;1pm-0JԢ6!pQD"10Y*E"`( c]&Y*@ 7q? ejsS-L Ȥ2yH$2y&wHIɝPmnD2crTՇmxֆmʚ[=Oiki(.O sʎIﴙ{%{qEjRzLѕPb1_.>vNrZ-;&STI\>MDfkv yirtn'KsgZ\\sSS|>j|Φ!ՀhB X4hpA6;:_:w,:]=()anҼ/XpZO%ЙUX١ (/` VG# kX?15P+F Y@8?>=1b$H4PD1ˎߕ/@ (:@_v4]UyQ}ّK ]w< JV[T0V _ULI}ʀ֖?bRL(M1Υ|ΘTbibeO`دрZv c@O6҇ vڈk-,$.;x' 20*,"kvZf8`N2ğGt aX^.(/`t \T"0:=Edk^Ě(d.I~zRPLRG`X,e9,"-Da-Q }QEcQatHXw+/+} !O2Xyo6(αzTk Q!Yi`(EQqD(0RARQ P4@@Kh#h >=η.徍ÁA9`A7Զm*υ#Z*k I:fTDZڇ!m7{0wZ;c;6?OU(kt::FvI8NQ.( B˜XMoK4#}p@ZZzlɃ# n*Qf9[_3MgP(/` ^% `/ܥUZaV6\iRW2:J4RRQK qhmSY<y0!Ѳ_(a|whW6N}y&n]cZ `}^)vBL?=a=]R6'NtUօSKUZcѪl֚Fצ!?&JT:0䙸<C[b~m~CŎ`>veo'T?mTw1s8 ZJ~%*^U*=QпsLb Q~ӭsVs<@@YD(@LḠ?C=?X53(V_p@iYpy1KJ%Q(1L 5 Bb03wܚ;>Yp@H`VJP xУhR"6 J<l;3?I[l@ZYDf0M鎼8HZdkƖLE$D`?}g@(/`q T#0V[D2Z!%/qtB"*u3KfLPGO M-JhD4RRY(DFy4F(n)ᷓ!}9E$>Hy4 V>E]zI>&$< [i -pJU0Ζx䈖qXabLbH$(* '`[l8ӷ"@ WH[չm.φ_l/7,dŧZU-O}VAی^0h2'tNoS' g̭ok}p ;FVu8]Gy>( BPNoKY">@ZZ~dl#m]`Q#fq 8Fb7@ (/` I"@m; 5az5QtHT+><ء$gW&d4TÑNXyBW_vR DЩ?mйa۝;zaH''84d:.|$G (k YhPH>] g<|T$UwJQjI- E5]Ca@Բ`{ @(/`d,%XBh .gHY Ңwhwky@yPѣIr9"PD Dy<4f&"Յb4Cr")b3m '1@i}儴y$)Gҧ oQ^2JSYLn]uoaƖ$TJgf\~ :naKrJAAACK͵f]9Fx­ |֥gAl'AV vwVҦ[HHIj׀r5WՅ>D" L "Pqv{B O' `1s/nLuXce+([+O$qbY7ҹ;MrnW~nrm_:WsO0~i90*8S‚+! 1Wewr1ǽI̧rpl(km<^5!RX~^=YiE^-$'ӹ ABIf CDkhq2 54%Bf0=,kZ9#cI=fXEQ ѫq yu,p,KUc խɉ*k(:,e)w!:ߍ_u9&hhĆ"D_%/a8_ppjM"ݢDH/Kk3dQ\hZB|غ^qI(/`U VJ"@k5pE]quy-}ABA(Qk`',Zuz5>IP@ Zkĉ>=9f02$OʒχDAM8FHM_ͣ=䄕faPe\bYM1r} Je}۱*[3C8t٧@?l:.d;Op4A>>ˆξWKUé}עP(b[Mu"ٙwHi><G % B[ٮA`Y ഭ <f-07odgf=rGCpޞo Ƃ5|a#q^{mk(/`gFl%Vbuɯ9ݢ^a-`P'u%vk$2H M~"KX$(Ce™8yL?ZeEky'"+:^x$g׬L^WNHHxP< ך!I67X$bߢb)eڙܺ-I/*kq568-V.* W2ךuaZ &Y^Yz5- ENX-؍AZLn- 6[7\U IOI 8SU 5Nc+X̽1 i^+I#ll>DZ jfWK>46ɕJKK_ݖ#}+\M h+Vx 0 fo7Qޮ 7uB'Z= 655uuȗ$$q!gx5C$I8QCA'h]Vz!n@7mn@8bL=1jc)OCSO5o&S|H<I( ,9Kń"͵иNi! ,"_[u5mՙt1' Yg-뽨4 D%xD=p`䠱l48FDGжZ_Pi6l(/`}["0MGƵ| Y ӗ;Znf\CQSO ð]w파i,1y2:ES%b~ۮ?$A|J?$h7[Oz>v:U1v' 4Oh Vxwp hwPa w2۲L3qB!-L1 6:3eO-v8&aAk (/` ?"@IcYLZyueJ-$ + 5i2664\Uz^k_J~ BNu0b::-]Q 'R2{Ky&ψP#Y;gg`v`όzG_%_u]Q'5=##kucw t&a{cd$]qiH'k:#|*tIqD|=N4 =' +rw@ƹ 1`ns]іZkZ(/`v O#0MDqk?=argֆ [AFGF3,WD۬L2^ Ѐ45 ?܊]ۇ -ASSO TC݌zoɿcw JH "ӥ(V}؅SUAd JTYKQK] Z'y&9+6iP2q Hq)32}^FVvҰU;ӭJ? }CNfN/iK`@` ,A&kcQvӜg"g8WI:~[p2ӭOA63 3vw^˜- B+d}XLlGBg&$N;l@Kp ,E wnxݶz{=k&7H{`-YF]y 2 ZI(/` U$ @[Rh<."v$ҀtP( JQIٽ`[i8=bmڹ!& C,Xm3zO ,译b{0TG%jzV[.+68 rcvU7gv &NQ$P=EP7q]!uy"0qgAGB\qugսYKh8 |blp_ 4%6UvˏS_ʣptx;6_#}|/s}n8 <K#1\` - 3 ݧ="_e|7`aoZ䯔o׸Xϕ )(BfPf WqDp54rjFzqc06xjx8$ dKNQYr6j5pմA((/`E WJ"0MFjVZA Ӣ6 1Y80@TA@?2NZEhig|vPpwDz[Npڶ=1bv\/5';zYӺS4֖f%2..)Z?X%1(Aj-MYZF AS"^^[3lVnџ?QUD#4vs8N= ў`74}i( ;0p^u}$΋ i4VQ,yUG9 5zC% Q^1m%:%yg2a -TD 0 -=nVv-f' =_7[+i A0H,I(/` &V$ ߘ$_dT/+ƒۭijd !d`MSI9 5F־-<]vhM+'RD P]١^;2xD2oZudI2U'9TnBn;BsPSd=p/qpСVSP8@i IO$$~EC,W bN0-|Hӽ p<"[;zh`&q<"k ~tyK–}2>j?KIZw8C5Yl؉/6lˎS$y|V+) &5 `[{>`)(03Pf WU2] f9  `4\XS#kzHTZt1vO{{TO<p)cdKNQYr 2~Mp m(/`5&a$j`333ӄAfM&FhVUTΌ1ں0iů Ljh6J)/z]b @*LDf74uqܚ 3{34g9!)˧+ܓs@bj (/` S>!@iJ$D'ZՀ6>Z64430M$_TU8,@kM ;|z|@k E?MDgbDzړuu.;Y i aQi=?aygR#TMP4ݚ8mi`~α–ذ]7PC!kgh0G 6⫣Ni>i(}QV32^@ WQ} H%D]pdf <>F$GY_P5p>(/`~MVY" Me;EvRӢL@QONՊBiNճznh953eq$(82Fy)O1|s\ A]2^ &H;x/pWPZ9Ro#>(ҐK)UC{&V3Gi{cƜk )9Ksulؿ"Y3^.;}bP>v.=TNvbԵ~ʾ `IoF뼅NQV3(񘈀njX([%s<륲 3 0PPm"b}Mv "OnqI-bIJl$p^+CI3lŠʿb4#! ZҏשoD Ml#%.8,)C@9 #!&'tp0ZEm/]onXK$J A' +z@Ɓс5b@ńM#Rn`!F"c+& <] (/`tE ֙O"0M9./kp~xТ6A}Dp HFE6' gɡ ,֒)#Gs Da +嘠+[S ]@ J]=꯵X D! mX ~00Ik!Ph9ᵒT(1~|݁o~;9"8k)QԉӮqvAvbH[ɣQ}MvmAf"WXCq~3B1?(Jnݑ1Hx!H~ʟ( EbMN9.~l3Q;Fbh߀nmT.dyu3deB~pCR+ݓ:a (/`|2 @ea!P~uͮ|MMeXrsl5_y\8z7Mv'i7W>Ks\H V{=lĹLǐ g)0-FǨ&j!)hĖGP`W-K-Z"znCRyH9Ipj@CS3]9 Y-qBhZm"MT5(/` VN$m!= $GQ/yN 6;4)"TDDCˢ2.Dzy,ä[rsFP(SwfHK%IzAgjܦ>IPn(LBJ_4zanY-lj,Q0Y@ʒ$?jʤǻ(_uME^E[Fp]MS}Í_ѩRYq}\)#?%`S*9pWI!a7 eaR?laREe LR̘tťOx?˞hqTUDI?( B0\t b(ȵ2Be(jLyAd6PѠu0ޞo Ƴ' g9T42`5 -`k(/`2 @f\*uퟤAz4Z2 1&݅K(ZDZyxh<JS15)hi(q(nEK}h$AG:3pq$vF0$2oً7gxC]9 Y-Q5t#5Ptab:i eUr4kRKEcJ:}M3;>X4c BA Z£1Yuߘ\_M,{k@M=fY{O(͉.Zƀ+60vIs` 7ӭS.]Bz=a k((_z_Pw^~U)c[83(3}=W]'*OȀegU6/:,4 @b x8?'.1PiBtnWcܼ,975Is IRM8 B\@Baƥ+Q 0If$Q6ַ?hNs?V D)sFK+FzAa *mխXGll-$O 2n".2 xkao *"WZuJzGTVgSOZV?˜\C ?'X 3Hƽ%Z@W]rk`z&E[ ׾&2(/` vQ#0M+~ V4n'gN*56-M GHHL{e^-kdܭifasU9bi(@0Х?&^#^ o9s%"X]U}|aQOF0,U" 'Qޢv.!|i͙xxaD0ϯHEFyRkg Eo>sS) ]K)؝^U*Z' ZvzBOsJ)`H`V~vz%A 94gu?VQ݀NP>y'Sn]ʺ Kj˲و e'CYx#ް6kuiW(/` 6?"@@NR-U;2,DpQ756$Q 1k'd0A5ж2(P*YDA ǂ#dKxSc&ts3x^m})Cg[0! RBر|.hzU _I}$\.+W'Q2^)NXFzs;1!jAjk٣~CϥnN'j-#_tR[`h>Vu ,=R@f*2[` 'M Y8mZlL$[c/d$(/`e T> PIcX@ч"m&0d&"584,r:O :x`i">*KxF.{>Ed S\'εf -Q0 ǝ(Jc`* 0XЃӡZZ)whkE,1|&B7S"Or휰-e-Nsi$ bpc_BJ?M^R+ɿb[wB7bw%˲Dm 8=eCYx .ܰP3tZayRB(/`eU$ 0B|IEft^7]| @KLJ 5iP=ODzɥθxa0ODc {0U* [Jkiz4ƈ[~][cy݇.L]Nz Q]v((k]@cM.G[?өJO P;{۪!1rb51jEopf~1~ ?D/f8g#PBs - ]7s l@Vi=C"e.nTagm{*ts R0[ v0PF`+>Af€B@LoWh$:cY#t7@p6f:\' L-f`$(/`Vu R$ k"ZeQW밖H ʀ FLG.kK0kf5%MTMi9ӟz=Ha4@_aFvaA=.;+?0 Gʬ{kY8)1*LP(OI8s"=A1 E;( p8a855IAdT7fii,mu:޲%H  O`% e; ?/6+NQN٨.q̈{ܵ~r~bS./^ {%r_+!w , mfjZn3^ŷwVG <vjIi/+i 3UZt1O]uXdZ%D] (/`t H PK7<=6ȡ+|oTM<+$30A??O%LJH$:"CIZ8B'qߊ-E>tCLR8? SFhzK]Ds AK،[b!zϩZv(Ɇ^DŽ8z:(ji8FL4צkjދig/E3ލŶc! ̶mg^:h.2(8j/0I%#Q˻{ 1-+  btN`"-a꜕dY`yowgy12s0-T堵 2_0"vv}q@wd 5nUMl ]x/em`; 1N87 (/`~v;@Ae֘&f,֨ VӶj%1a033Hbo{i~'??|x<+/u^Z+[9T{a1F%2g3i J&2B$Ō 0<-g( *CBB,֚NjSDw j$L&I(! K"$ȚPl݂% Zh{ ۑQþOŝK)L_f /2*XE@]y`lFh9ʀe(/`i}]Y!0k4Ӂپ;@v\TD0qxA0Y`QON)ɏj)@sbo+%yl`e5cƪ#~bK :~˟7'c|zBS6N { $a1&?5LgoX9>Gc +-RwU@CVP Y$ZQZF )MWt ,aaJ{P֠0蝺P(Bc4x#Eb0?D$WPx J'<t $"I8奓e :t^戯:(jW7T764^^aX *E[ljG 29k/ (/`! O# b>w U_{w!d@EKBU[X4pbt"0laS9EjԩQ^$&]eפrv4R` 20" n #J8 r1G?1v:rƋ'bV(X@PS @MA"s4\9i &X9auުU? Z^W~|n!wt.~Rpy-5mn?=džER;k2o菏ߐ_IW\1,qD~r9oAruƷT  $\0Z7ef9a6݆%w}WB 5b Ζ(/` VYN"0k4Fvo["[D8jYg2EDG 4K$QoDɘj-N8 h3v}e֨ ; Rw)g]*O!Ma@~(}~cooShIXɘ!5h*da8j! gaK .iI:}O[3Ԯ17_6GFf]0#3XA#0 ' Pv˲FLd~6G|T9<~c^O(B(f=%Gϧvдs4 0B0N`F8G-/)$Y$rb\v0E02a %-bۀݴw(kpu0瓃!K!&Q&Z랜7g%(/`& 6K$ K'q'CAn+b~<Vb[AD>NGccmD aa[17WΩՎWYG8>rJES,]58=#)s%0xyx^

J%x@~DTQO%O-Y0 ٧Q%IJ2^ZM$Q(a!3ZvxbN͆I#Z+=үS 9zUgmL10"o>e~0JY)efu# XETy4iA[Se9hG`%j!H7Yzrx>&=vECYI˱+ùXbgI~K-݈>fs̵ZkE4k)~gTHBNpŒL ykgH+U`r@ P"QNL'c] ʒ7z@PbFc,p\*hs`=* sw$sEE$RnHWɥB9"A y)^D7X_}2؆ mf-  ,ib7 K[t(/`- R;Pemf81l%"K85U)RD243 8bn`F#?2($(DH̸&eAj7mr@Pd@@Zf5xpd;G#j+y!@ +YZ ig*`2rW G+)MiMt-*Nꌄ&kvY qzoW˟nn#?BӼc /O; fQ|n#PS{ȍ_ZP$0쥠(/`F I!0kA\|Ӧk_A5[qvA-FH B@? c]h#"1P, c2.RxW[zQtO5`P#?j)|?a~KbJ@Q,aUPt8CQSv~(QA%A#K$Zw-VoYGnWc|֡վ.A/hj@w6+7mj Mj9}3# +ϓz>iv"ÿ.F!9+ M/ B044}9L Pg @_.ku;뀉i(8  Jl 5@lb93T[h𪰂蟶Vib`!L(.(/`] TA!@g,GKϞV֫I Uq796C[Dc5{Ry' Dкܷgh0i<.EU/p zeP)Eb{繇J#g! @RJ#hƞc-iuZWޏ0ׇf8)pCUT)*_O z#MY[݅ ;OeH?(X2N578=eJ S.ΤW 0>40e&{=<hlp~08e" LjX\~] @]Uf:dغ2(/` 6WF PI܌-!䛩0ohML=><c" (XH’6%jXʔ?qwT3gBܖo)i{ͫ-xo @(/` f$n&NDYC2 jiM8-iDPU3dh^?y Mq2A!ß,;F?8$rCyR4I儶>1j+UoL:_IE+_Y+ZhNl͋mfLQ].IkY) 9ᥰ61Ym:NPh8jV_}|TUe92@">(zDQsQ?YS@qX O$ɯO=cuRjY6:c1 W8sR+'baF兵 W鍭N!EfF ;^dB Biw}P#P ϡüH.}#> 7ʓ5:.Cr(4MYS:8PD/D8A|wgx.zKЗ'ÝlA3#G[>k=r36m1$Cѯ3SL$E1s28P?JseDY,Hs;.*qb6:$v/ @B4bo&+ `J0q& Bu4#ptƜJ'ȑo|q<{d؉Ù783זC idl>y1B(/`~} ZO!@ XF4dl 0ҌNFKA5#IH1Ra p c>e+8{8r AW|dkK;F'>Q<ܪᴲ@M[Fewc Ev*Y,MkY8JD, riʘ%Y7+k&Խ/Vk| cfaeb\}i)=t5x.y6t8+%F<ɧ>ClϭsגB[hQ 4dQ4:[ZiWAyk (giP[8N6J];Q[EG7nDG%GƲA4lEC=0GWBW@@є2(/`U N"@iȦUjoj1KKLl!JDZu HEC fq<ƾvJj1ɒ`z$ ќ(M %8ˆev/Z>ygYϚK(/` FM%0F̒GIx@5@'m8DAFB-dg渥 A֙Vy'FfIZ)b#>̉UbGZ>fsR3Ipǘ4MBю5oņCz/b  2"̜kVו@ _$/GLG9orV*;YzdZ ؂~S^쐶0C Q廪< Ykn @`0`uv|U'H;!g_ɜN|ӲS7ѭ^!.*8($&hMr*]%_0qoAR -1Ʈ}(e(/`8 L!@k󃁍zK'Kɰe)1yaQYv9~&FCB@,IZP? AK Set~7u( o5cc,P#61ߍ[xQ <B=z_[J$%t:P~_whs0%Gt;` DR:[gD~rCpKڍtlg?e?׿0zl;mT YuPt 7np*-+TB'{{~DogxHFIa wn{ ];ܘ) Bô&}/L`ۈ[@#Vr1L8 bdfp&LKRo.i1[ri Ϸ"Ԏ]mO (/` =@e&04/|wLHO}D%8bT555Z2`wԙfFO :}C1Ģ ̈a1? dQJq+X3NCbU+NJŊD)'WRj.AEoGoQoITwBRB[5M;TPOZvz;P?Ds-qGu< >>jFD h1#~1N"ZqB?vdӭK_3 0B(<N\(a 8 >(8#RDOlচw؀`eGG`@&`rq̚w!`DrȹOoA(eR=IadeJ|r-c'($(/`I YN# XXD%.b,A(z#0DM@-QyYE)E/Yx%C YTzFl H~52LF"8{-vF(4If1>m"@jiI030\Ppx"b9Hk*XX xh|PGL֊]SFLٛ Qz!ͯraNJ ,qv OS$:a7n"͚+n\D sL}?A`y6KW7Qz߄ ,~r.l?Ri:/( BPǨ8# /TN;8?bɯ{p{H˚e G(s/um^q8r(`d۬ѺFZM:Nj޵~;{D}Ʒ\^"lәѿҏ܊W8$Xyzv`Xk|[^~ge GzvjiJTJ&=DB Û*/.]8 +}  13ޚ\ 4T(/`]Y# mTNӗ} v [BM*PON#2/%i^KiKzBZ3P`% Ւ-~$1EWBzo̟R9s  z_m'KzЎ0,EQiK;I wJ](Ck)kYVcZ zt%*s)SiMk8ZTImx4~mŋ&a݇ת(|;b.ur\gk=bnنQ`T}v:sÓ88jK&m1V]XmKqp$BBGR"S}G'3 @ PA :1AMX0%e`&(zDB8õ%ypj'nI!0z!ĸ[e7[G)O M7dK;7`! EӼ Av X ó09g B~'H'/ˍ(/`v;PAŨj0T4ANV425033b~\N+$~m~9p!ad̂fI.mbOdni3YXҬbQX'IZLv奼ciG[*;-T4ńD#aayЁZA N#4ksc$7x:H)-*?2>,+ԧ'O 1/2*XE@]`rFyXl(v(/`FY" mG,ljԉp2`/0:J4PMM4,zNx- 0?'mp4e-V8ea, ))yףFydQ5]hm{'h~h~@ meiWgCm =EX TօԻϘcD59QOW68E]^}2q@)>\4K۶$!kY #Y]o ^| Q;~=@Ԟ!cWKZ?S(@hP{ mB#QSDrί"׶JH5Ӆ6Ր8)o]j" #zoOi_7℟)z I PA;ac%a[$#܈c@+@Of8Oϡ9&'V"F=VT<( om9 {"f` ^ >/H(F J҉^PAmGr;xgc3M'cXihljIMcGHkeLsx(/`% N"0kYdvn2cmw^8EJBSX4-afV,. `E-,QB@2J@^N>kJmqv&eQpa u^UG$٪^W~ot.Z~R:iB꼟yÇmUJAGv y6)"^]t~.0t $g\0Q7e f9$l͆u=‡WB !mł\C v(/`#F^\#0k+~3[jl9F`TC=(R9SVO #X,Cʥkgl@8 :^<8`0i~랳2^l*Z*BTl׊c5/LQJ#90@[A$ HAfEiGv%Uvz+J4SXDk߫kf(ƸHlidStPx ]Yҷds` 35o 6P| (/`Md" mQpt#ޅY7M0.p\\Vʤiq3, vKq0a|"$c,nK#Y-'~Q=O(uzȯZݜwEW[ҹNں*i>өJ;}CCKON=y MwtHXpNQPZQO#>cc U*0EH&6"iM y=+ nI3;鿘ݻcidSo֡_ (鋗f1v4+ޡS7֡;n^N7% vXbqWP.}uGo_~T+i`ǵQ?B*QYE wFZ_b4)dX"jS B`3vgF0j#$4Ok"@)q|fL|:K02<4d`!x8y0Q"''&Ax$\$oGT$c dž1 #| ^L{houhn]EOe`n vlڀT>Kmރ C q ̷E9>'9H(O(/`m TA!@g,GK5ϞV[$A20787lƾS hT^Ӂo3q&:?d GMժx2ܻD֔+G~IKkJTeAT[)НCPm%jV%Ho[݇҈|kC#mli8 Ӕ 8K< JY=ϟ?a fM !iq@ +%4`K |pp& X40e&{=4Vkp|?`#R@z ]h 5Vh٪2(/`1%VP"@0ŒMuk?'?O9(GHD`8Vb[Hy0]j(bl%!XFOu<::3d0#3q M 3E-Tg)UKJ-JPbrM$鰺ѡc[OޥM8ǶctJ]ݸ~ 4GN1DS?̘"G:'Ma0pλjQ3Fy ij x53[bmߓʶ ۨ$L_en"!;-,3 B(B#H !a3!1M,P&sz+l/cS#Bv1 2Xx~V.ˬt"roL;mWj[n (/`%fdn&NDY:#5j $h8Eg "׿gg]rI=@I9@4ʋ z meY 9y 4P(+y4J G@y~/g ަ֫ |x/Z*Q^lR64hMW 6CABe~4Vg9$cRlʥu]orծ*:$ʡǁ&DASd2=ǩ7yI<nz@" MNyc),X3uõ柲^iƙ>0vq*zjSS͂Fxy%ZVqoX!_TtN-_/vm!1" mCOskO G _~jfMѶ?1oFfqn 7.,2}ea-Fuc!xDD1qѷ7F3ZfC Biw}P#P ϡüH.}#> 7ʓ5:.Cr(4MYS:8PDL/D8A|wgxm"ŋBY4,K/z8/u{(`h)sK镲:OU7tFYu|c`KԘ()IL:Hm:=5)Qa°Z Z};+X+wV+aL_p( |Gϧn[Gw)j5#_tS.=JONc[tCa] Bz+x|%~_TI-c.!4#j'>4+I B`,+3F`F ^Xβhɲ:D{bK@>d(9D ;@&~%I`#HF f53f(Y!@pۍlLO &kXl`C0Cy 16݀|Ҽ crcœ @IV`26xRXڧ(/` O!`G4WCA"({ D-m:!v0GLAk 11= O(N|r˺* Q&Gg5i{zfMqx:^YR@4D=%s>(C"frH 'H# yC^ >D  #9Um0V _F by?6|>sb0*?䍾T-<3w:}dJɟ}KD>B?m8U*u"-;IڱP_-lQY/$6Ş{ھd5늋!(HiP[N96J]6QREȣS.AOn"쁌"&#+x# 6vMsRel$$Ji8;((/`Sv^[#@kf+,jE}lj@kG<̽YG]SROϫ(=EY ?ȥθh( 63 r+FSLci\)vS0@ ݎzȧZ><+7h*E?jPn);RmBӫv $.=4n?Q:n >c) kK2a%DTt{KkxCZ'=b~6򱘟Op֡Xѯfzbw^UM;S&"bn85rsH.u*^8߯_U*q@oӦ`@t`[jlG ¿O/L B+A`FI  5~{T6ԥqPxJLx_)-7di& )F2 # 5>T<8_$潵v[,vL&rpcl;o@'XT 0l@*Mfkއ)J١.÷p9g+#jF'26(/`}M6P {"PKS=ʑ*d& /.+t^E<G.L0!'QgQK saYQKZMM?kK<4\;7#ߑbhD3Zň@?ŖHZEbq##:ýÙfk#Jy:6Ys!;7̅"!R\A|;ė/EsΖ2|i4x`lGu f<||HX BxmW+BM &k/(/` \$ kOɹD2Dyn*k[ @QSOKȬ-cTf\'k l4wkD<8z0$chn͹_1;%$yc>>Q!_8۩z#6ynIҤ~d,K-ĺ[F4yY8%Ij q yhĿb, L(ZqKV:iFnY=Su`5/3fNU$(=.eqG,ImS|tn]K=Pǎ $;8J H&Sq[ &}br``D{?[auڃ)I!uSC 2iuyc[V@` [iJoy0 Q@9l-O32w&r ($yj ,q(/` =@eb݅-|wLiy1*565d4D)PBfT~ Y{ d>#'5wQ{-P(ͣ4\WJ`*V.豫` Rա }[]9`E;M\4' CIB 3Xd4+ =~RQV^SB?}t驁C[~ޞ+QDdqt G%DU0cf :BFGP\_Ppzkk.(/`b-vW# kC>i̺0XZrH(MOKj%A,.яtJauVDiJ?&fpZvpLsI?Ng=&EpWbR7 _؃%}z+3kj(AzTAkeH$A&h a:j8jܸq q'V3hs canL#vf\w }b/>=YPBۉ=SRg8t+{ +\Z1^{:EϞ8CWnl&JGE'6 Q8 @&~[?SW+%Hr8j3 %PrFba`aԑ'Ma@],j_M$7 /[t9me5zۿ¡-7(n'( )RK4~js(/`Z R$ CއۗAL=6$DhGLG:ƚŹqb2fq5hG%X#>zJ; Q|}pO-Ю1뢬x|AS? e˂=Sǯ/$ GzvjiJTJ&=DB Û*/.]8 +}  13ޚ\ 4T(/`U$ TN"Z!A\X7ɨpLLJ/hRxv1LA3Kc8{,_O)I ɻ! sր>ȥ\@  yWm#Kx=Y+AӖvsRz@Z(EQmiu*ZTS(ϕ)?I φ0$툜 [ č[݇צv(|w\|@;~v9H36²ȡ0a]Pٓ6hj,rL-jK_Ų=V!)F~J27$f34I|= PAYH\y`J8G"s|!O0kZ`4Qo'0 a 0tOb207< ` v*_n& EfkAf !\^aZ N^[@8a)U^l+rcDv(/`v:!@H\>3 M9Ed3c/22 ̑w/|$ymu$$%ASp(Zsڰ\0/ C@cÕ!hA*Q-#9Ĝu٢L;sꯈak+ ֔+4*(FԲRHkeLsx(/`6 @g \v$gA(hYS4Iԭ,-,+"S]T2 r$0 ek$:2 抖P Ÿ+\+Z X1 ]Q LȨҌNS{0ڵDds*'SQF ̄ J<9]q~i^%~XX 0ӷ$!| !nxcv]]ߛ?0~((/`V\#0m{e0ԄrF ;1o<% aQSPܚi"fF "c-ni,Ms ;.d_/R>]?jY'TM7J;=@]/2>O#OI<GQo SɬÚcKcRi-)JEKQq`G?- #*L=\\Jx-WOH-[ p `>vDW#Ч~g+j9hB\K~ m=>|(>*>V~ -=en+KyOƘs]R ~ c  s, BpLǠ(̸j܂hZEhfvbv';SD/n@`JPJsB B`ހ#UƯQ]"=~3jK8 I#:VJ Ar= ~0h% 8`6i"8``NcZ7o W١AVG`X%CE=g7@ղa-y$s`fvJTA0 @X(/`  =PGeAXT-?OnfiV545ߟg8h_x*#H/g ΜC0zE {6ph_4͗F (&Ra[! #,aQ23bObWx} $. dI[Db Q "s\d񥴨@%ײ-8ә;Ù;}D秏4Gƴ0bt9Xz I%Eeef >FR\`C1# ] (/`#f[! Me*[82@).PlUGE]]44QSPfĭE4ev,ҍO)-2759C-W>)YZx**˩|s\ A}P0H:$ʑHdAdxᘕ#RY65<&ɟZ!;axCRa/&9cU= KܢpK7c˧GѩW7 R \;έO 2$կ=뼍7- NQuJ-zoP@y1LխIP e=Oy•QId,N潱uCAnZ ,.58 ByEa.P0],[0>B% 4< 1P":kz_%SZM6`v@Fl@*]K 1D e ((H-&8R0Xt(/`% O#0Hi=m2cm)n%Y큅0FLBc856嘚RY 吜QB<2B<>N>%ՄEM=ߎ|2`2EUgD"b4cNa-~,j"Y4A,Fk p`DBXX#k.q.Yau^U? *F"to'\*!K{KyORp ~ N?6U]Y&UBڟGPvJy"_~]t~.(t $g\0Q7e f9$l͆u=‡WB !mł\C v(/`="h# múiǯZ7`YdVs  _dY~#7ڴ%U2+8J۩OS>K@&Z_1:RN5n qh֎SDhI!uʶ,a/u]qcfDiP*0B`(ZM:#`7Nn. >`ɘjcz^zMiu-lܪiBr8s4PB!bmsM 7/aO6/Bpd"H "CyFiaUYjM!k{{2vݶ]D0K_kxjt5L/7.٭1Oŏ(/`% Sfcv3ZaԆ#$˵'q,؊ ѕl-opg#q2jl#6`)[,t{:f`Im,<| s>t^uXARöj\jٍ`KLU}:(/`% <"@Y[r7|' ⒛263*1֙Vy6N3eڰ El M?̀m],>!Xi 1Q> 頰t\t&i!j!KY?'(䐘NV>\d\cU4gϱ=g ýcy6\o6XQIB;Cb?4o1T0z*㎭Ot-;-(r1 UZ8fN v`2/j4мࢭEXhauP(/`}S#@k lEH;ְtzK,"״8 '7IJG.vʼnI0GD۬D2Vb8h ;񱜊'F7(dP5(uzȯZݞw=W[Lp,귵>-ab2Q˜탬J@OIM'&A*g`8I0EwriOޣS7;n|S;r͗Д_q c6܀L~t`-o qA-7Y J/pC4hrZ'BMn;yʤSu詞3Um^ $eK8S!QH0sLÄp$GrY^E;oQK PhG,.e݇IsHe`njВ>#|ί 4V5Z:|M :[^--H 6EY7 ,yFjc),c܀/}(؁ 1?U Emk?(ƸHlidStPx ]Yҷds` 35o 6P| (/`&]"0Md%aSJm>{2#j9k`cUUPx^P-r&$Ym+M"*h-c 4k,^e'6)c2%'1Yyޥp=ѩ);ᙕ|^2>%2`Gbq=h@w֪MlPSAFa0 TeV0Y0 f[ݱ6699}-D6*5lTzbE_0f[t}b=}FQ JSb3p ; []u~VQCj Ѭ*aQG=f9jaIɉ,:isD9>U۠ L 0B+zԉ`FH QWU!&bI+[)ȡA&$ĥ !n őCrxdyZӦ)yP bpbkhe";`a!o@& `p``QEl6X_]2OF683L9j&:.|s^Aoik(/`-fn&M(5Zͬ񾇾:ģs=Q 8 @Uei^&d<Uء)Pя^p5S,P3iL,;Lyo|H_sҫ-_PW3Y񫣴*|Y]4k)}e=Kǟ`_mJ|X%:0*,8 ZZ_nV׳f *¨CrgTjr7@ UIHD08 E^yCk>&N\˂=5)3 7[l[QF@6ܒWg|ִ׆YKX{گ!1"h_-[@ ۚJ!m>K9"lWئ`\l"bt] nF‰$1#6~M-1C Biw}P#P ϡüH.}#> 7ʓ5:.Cr(4MYS:8PDL/D8A|wgx%8W緵j×80lY,% s0%I(,:iEjG5EQLa*]aU'}-á,֩ߕ.bhEO8ߣ$P TNԔ{kt8 7c۔`:>#u5ꕫk?&%7 BBM % 1ާϵ ~GQ׮^UG B`4+@`b#Y,,=@6q;"!|a$#Qf߭M)C,^Ad @ Q@ku=32O f; o8{G,p6.3F&XFI*bKZN#O(/` ZO!@Iݲ/3 \~B, %FLA玖b$L"Yښ@І4(Ya8|we\0dG%A,Wr+]Y1DuaxAA!. 1(gA80̰L21bXI.8j Q >"N\}faumI [)+&~[vWg+Aclwɞ\̝z@wXhkN2^1 GWEKNQ';˓ ԘW[f!(HiP[N96J]6QREȣS.AOn"쁌"&#+x# 6vMsRel$$Ji8;((/`RfZ"0MѽԒvHfQ6ž8SRO U X~K q,[>ms %QdiL22O񶋞O!DwAWrSn-v{!X]^9S)QvK镲ShzaveT߭u1g$aiUM`q(JQN~ iM/|\$Ozh l%c1?\ӭC_Ei/n}xh?!R3)j۵tRA*pRN)3z;ڸYJxP$([iaJo毋%3.#O/^-F8F B+ @`FF.@A!57rPLK@bUYBl6|"ü~ZoKl AgeB`  CR=8 -S1 ,شy( gycC-o2g#LYmd'e,a(/` Q%0k6E@SJ ģȣ DGd FIE 0 0v>j󃚄iQ~ˣ0X3?Ɂ F2Ib[g+ךN̉iSߚ]ez`_tIQ4ZD alH a Z+QcIKC@(=McWnc%Vף|WDv Z}%'/XLʭߩ~Sr쐶07U eJ  7ruB9B涗kNmkiٿ!Wk(mP79b8Zn8NaA Ru Bh?a6T(/`mfu$o)"n8}m[.O؃]+*oZnji3 qŎFgxp\Qk8qU^Է݌4  -ZS3*U_&BW[H~gyg[=,2R0j[Z%.pVeO(/`}M6@ 4ؘ&|D`uI̶//,nlB,~H`^(o 15Ys+@e)W9dO3e7>_hXr+3)a^{RcJO*% |櫇=6lQ!?`c)6Fn==O!7f[ߊss3M f<||HX BxmW+BM &k/(/`+_$ kGɹD2Dyn*keE[ BUUR3KR8 5e ʌdma0wc@fXsl|0fۇEEv7nDt) n]KнS_# C:Bj]H0W&mX#cYZo)OY(9Sc26@'ҞŪ ]rN'ZqKV:iBn \$K{AFhO~1swEdI el Us Pǎ Zَ%D [0 p0o4i,~?:Di;=dPLI`"Ϩ EE :D2i1~%XCp |=!bX_&9NNXz۝W0;ք-Zb^0}kCq\#Tr6hG]lT> VǼyM Pvޖ|A՝n_E|"u2,WV%Wc PuҟA Y3@[z)K7&R>Q-nn&i^0KFitT "3 %PrFba`aԑ'Ma@],j_M$7 /[t9me5zۿ¡-7(n'( )RK4~js(/`pvP5Pg4"ɵY丆zI&EI3s+.+]#g+t$v៹:VX:Q§^_7&zqR&!i0H 4Đw2=dH# kHqUH ~D#)]k9r:6Ut1aı$UGʹ#2cߚ{q% 㭥]Bc;}`i:^KvJy9OOY!\,495Z0!P(/`G[T!0 M~`>Qʚs JKJK 1qK^msc42FK% k\Fr(v ;_f^4DDύN>ȥNyw` OB0(n3Q@]JBOP}՘:G ZҤBHD|Y_[bMLӎy@v @P*ҧC[w`Lw:T OPjDiS6+U UJ;D)?RK! L!:) IO$^VO:P6sDw&NЯ c!6 0B3 5j%l8-h!)~Fh~ZF'EG$ F;v^'6{pGnWp`lހ|T VKּAŢZ3FB'26ZŚ(/`68PgXH5trب7R2020w8PktG'X yta{qSa0HGeoк*Bc@Zl2v|졹 t8 GhTw<0r](w^+I i$ԒSnx=BbϽ ̃kfRx+fä́8fDЯ\3 Yp@ŲP۞ /z%`f ɝlCͣ^&﬽K¹ ]ݵdKh+=  ]FB[g6?!^ MM/N[>w#A30AGbfLoWc>mV`IO`(3- B;}0$R)/# dx\!X;i^{W,;h"2(v= fb5 ̂|2-c9 UR(/`F9PgP&\^#5QQ L x}Bd&V011#6O3w* u]B>Bo|:ha4iOӄe7C;-$h8PN S筇 V,dQωPyGpRy:PĻ9o5׎א[n8Uh)<׊JZ0h͗A};! 8ԣ(~S 1/S”FYX$׉ #QWQ$z?|CyOܴz) 4t֩} #hL} <%RrqH7odFӐ {f@̰PʤOe 8πJ(/` ?!@ilH->cMCs=1\s586 ]H؅,hj9}|]q<2FS?OXr|v тsQ%ݘiNvp_$N5bp5mio(2 @X{5w--ŠRSckl&AswdU(Kae-ȤRRG'7&9CHVW܀}-F&uܸlSQna0n v7#Ps{~ْ! _0ƴRo~}L ]l1[laV׌桞8,M<}÷F"N>} <R r9H7odFSB{f@̰E y|e'2g@[%Upq(/`5 E PIy)Q$Tuհ716>>:  yNgIJ?pAa d GQE-fy-? i׸"%iK/-J7f/!}0* 8X䥴_UM?7+`i=S^,Є;é]?qpVԕ|[m@vU5;0Sܽ4|<)O;Mv|[o>Wv4JQox NZ\-䇨(,:øD%PY=aAwqBX\+Ly"~g'(/`֠a# m4Ľmya"hlFs ( [XXMC=jt8QEJY4ǥ|ҸbY,='m,9Za80 {\Fqۻhc Zwg]jB_/CSJ>l0k/u[$*u^k0@R|Ln-WȴߚFSDiҔ$-(3#`:`4IӐh{ޫ졤j}1\$d1|tES>ŪmXB}ơ`؃j'}>na$oP;_zi}?i;v?߮% 1\Uďco9F/.Fݦ1¿]s<ƴ`C M0 @ m90_ۊ'df9ƔPB9ARpʥ`B 5mv{SW{b[}˅f5B;,찀/fVL$ۊa-IZG]x- CHaP e|avŊ,7,UVp5؞X렻&Rs!a7b:M@,Y1XJD w[h(/`M =!@g ""yZKZ1V2A2bQ4436}W #YOB}cLvUqEt k2QjZ= +?Pmn5IT-oZbjyb$_Ɏ",:adw S18v(1 09\طCCEk/.$ZZo Ra}2[~#A7(h9L%w‚z= uMt+aiV(/` YO#m/#Lv%`=ٲSBbU{;.DHDRZY85\>!okHSfh[sIUާD3ڀŘz@{!h_9$<~GrTZ8V_},,a;1 Q a=FaßZJ:a$ KѩOeߣ0Po{@]bhDhzet<6ןk PhW7_2i O{/s{C\#к_ݱZѐ  gcuC"]ԯKQ.f4vi?<. EaN: &`-aБxl49؄D;`bnWBq#l߀TJ6hF@؂IZaqTm'2ְ(/` S> Pg3$YVMlZnU|a}bk Xa554}a4ɒX ˄ J]. Js)fèqN &]ڹ!̉SNEqPTav Z4DA,9?v0}`r 1R5PLKFPk๥q`K|{i`N|Alc.jއ:Tkohާ% F/}r_XrWJ \'5,4$bHkWnY7:(/`!c#0mFM|II$>\%7=w~5X*Y\Xpq8 ha%-n,OcY`#,v{z<MGMs*;-Ĥu?lWm-ns- 2^)h2]A!r;}!뷵O#>c k0jT`Oq3x E5)nYGE0 A(rjLDRav,l\桵 4!%Ȑi-R .Z5c(ZeG;zt3D5@M4% %{2[`T 6#j+9vLEc`>i132[v f7#Q@Vӑ6A.(/`} F=!@FhMR6b.g u9454xJAycq ޮ?YC9W+> .zy|T*_6Q 4IYYzON) .gL SΕ% h=x\ SDۢyh<%U0,M;2R5QNL4z}?YOVj.M {|S/xd?6 Ph-s<2>oաS*Os/jۙyNڑz|n*:HB Bi$L;_{\j.1 B4 M.9@LZpsޔnDvœ zb=±`&Ml\  ߱A]ggzY[F21є 3ȾȩP2Hť(/` :TiK~۹Rek%~K3vgqB }%UO Ըv_G gD_%3V{[U<(/`B6U" m4lj7\sF]0Lmm(KNLRP0Fe|(wp*7Ek_ߌƇif(O8Bxzk;|ѳ-d,D(\JH8拯p1"gK85U8CS,R>|iT,h|"^J =\/kO>։u2aV/xlYs(05/u[>_%ԣ(~cks?kKG"u;鯺;Dnu .|򡺝GU1RԷ Ni(L;_]z> 0 B;0@{.9@f"-_ӏp\p*I6-lv2;Ć07RdZ}*{@̷%55r_l;Zil ָpt(/` @Pg ;<%hSH:e_t## ,0r-3lDSi՝jY(q6zkBw}(/`v^" mǩlV>-\ԡ faTWRo)Vliq8V/;+^mf0|R(Mh=guD ;hAwOnTjM)nϻ$"G[ -\^oN!m@YKРx=؈RşH-Fa1(LRR$0k@{D4 vYM0!*9P̎G'UO+n Vt;OݢOY0PtuN"}꒻t mG:Cw-OЃ:K8XպU<仅.q>⩶|PbKi4Ŭ]X4Iàhf+fXag& X4 @Bc }ClSbʧ/fiaׁL#"P\ }`V}f 4ؽĦ_1Y7lôOM^{/ /ZIeRVhDV\!s&*ĝoôq J쉭'2,z6܌Tb"dK]wL&XٌYKsjlg;,7WS\o (/`= R< @h 64ٝTЦl4H{:.333i}&F^_Q>@u&OnB ym sBD$ $d6Kv9)cMT{: qvj5rߠK#-"S Sܕړ9:8c1wwd"݄N=wm:rA=mxƵ=?"͕}F\B(dh9L%Vlb]!ݵJlh໇X]O(/` R"0Md%[k}~s1_'L501 HKI ;,W@8a-^ a4I%Z_O~o[҈Aum`jkt{ާ'h 뷵O>cL0EQ(5" K D0ly@7h v jM h\ł; [XNs[=n />RieԊ ‡meW <; $lA3OՄ7F4E@3还ݻcqŽh bc1;o%_L_$ |- EN  VHTKk^{ ٖ 0_;t*<+0)bXf..C$_KskbKZdlkBU˩am;/?ZO}Tsus}Sj]Y/Q=!(E%i~-*m__S~\RMBvzDւ45z±a*U@ 0B(Xp:ml%,`v g*_sBۛgE0jg92(/`gx$o4w.-U}žd9aS:V+qEvqq-7g_>SW78dl)hS:WNs+SC6~mVNiX.LsC:h X ꑜz#};[{x8\^c[hUͣx뒭fpW ¿acړHhNҠ>4oyF3LŘNYaA 0OqNcXWsu쒤ؿ͚DA#U_ 0/j]N5?Oԧ|psxN1JtqNEejQ~`E)2g\kL\=3a :s_OxiPPd ɯj tJ,}6E MJV0GpNrI9p 4N9E#hM KS n0$6ڄ miK`Nl24KzbP+d{e%ZD>EB]0έL04!ā(Z)Ĥ !7 sݗ!B6CSccZ"ƉjYEd5Wٳ5Sj/q>C ڄL2)dfec pɏ68j168*Hj%S.|(/`/ >@eD!YrTK99566U Gh9p(pWFucFÅY/r,Ϊy|3]#i 8J @5NvX[ShVXC0賫Tru‹ߣ<_)=9gֆ[JdaR>ELrȓ_% 4~%tKJa0~>/G8+Xt5 #N̲ $# ; P-0)r ..W\ [oZAykY (/`.-F]"OewZ.4Z@P? Z,WRD~@RUQfY6%Z[`(& _k(]{A1I V敵|U}oqxo`kˢd }2g$qIh8`;P闌Y\+Eb) E_$E$Wl r A*ѩhS gk(_KEOkNvb#ai=6 G%ԓ_y?@vt< {;}埞|(`xguvP~>KOZϓׄLDSgi$*Ձi2 1I6%mRQΚA{& Y$M(foa.G7 Bc$C 0A) aўbzF\vPsx|$ ~jĀ!6:G+N$Vচڀ QdD@6]<޶Y>Zd&"0|RҔښ2]:(/`U &S=!@gLX tҦ,!k=Vgֈm2??YI$Im$ vHNP ,W^qN!# v9pk:o'+ ^hL? c"uG꯺{Eu1zu1$)EuGdUձOfe^'UH_f2/ daN ;A)Pð#;hFpŹvB@6 ),"!95ٻ Z{ ,?c6Ŵ;8YhM0O= M)(/` ^Z" mh",[Ns`GcvevcD b4SULKTSؒ@,52FtˬIa fA5Z'oݡDDHTDUkP< ,+1#2eotպF;?&kmGQö+L4O( :McG \}ų+i&PpbGTbkwUf&'˚ M(/`֟_#0mFM|I[~0Z"уKWXS3.cq9Rѿ(;c|JXY4 En͌#Ex@chF+hADﻚ.eZZݞAD/x?uk P'zt:4tH7ǫFGEe_Qgla -Bc` c)iypԒ ;*/ӋzrEJ.A|,FNi( ;|KϩnקY1E3F.CWޝdOO t#iĮ֭:'m|'ѫB/}OS%`q80n@ID@3还]RD &! #eU,7c.2_zxPE*" -So~#'Z32,8"$~ I̢JaZFF=1ݐ4=`&M$_m,E5 S۰Eaa vl;B؁ Hi`]e4b(/`= ƒ(/` P! e0am\E>h&khiFHFKRIZZnM4eV' `QEDO`y`D _QNʾ[ Ck 4(vHCktK4 (?[ƙXg,畜M´%G'߇s9:or.,Q0u<6חs(X`WomE|W= s/?sKs4D~ujuoj~WS.ԯGoY;MXn ?wDa. $%N X܂t>쓋Pkurļ gà@x}VYfb3*A 6Άdx̬-VB([>ɖ ' (/`%f$k%q3v8A~,V0ic[X@Ta (Jc * deI<Ɓ81}i a(g `?Ȳ11* FebRZ@Y]J_*LlB)q޶qKJjěyFn&9&Wd=ηպX+m K#XJrV%@$@qZ{@ $A'"IN==E$:x HS9ӂl]:paay,mvBvK rKX5u[<΀A;KFC[k{:%K6e[/7Lޭs!qYSiiEv'Ena2`SY}9h7r'K.ן^)E aY/( B` PńCL<0VK/!4h\8PW3𳕆,Ê@j>Y$x^~k7ajzH>sP'с3ڼr$ j"aXaW] (/`2Fac" mg&$jVWV-% Zꚢ.pZ[W32Yc|JȸYQa>k3Lވ1I%Y8G`nA!#֔Zt+ FVPhSBz ]zt@Χ5(4yU:-I *]awgtX[S4QhDEA)i F88+&'O ϘqO%M ԋ${^}|4 ~&錛9%#wvLwF uV Pk)JsUN$or#7?Nv/h|!nD/]ҿ槌FFSZHGtSi[S %4Bbj #g0*C/Pڨ/e`f>֯)VveȲH3Ţx$0NZײ  A!p"Wu0 /ӮkښÚj"E)[fwp¨Sܶq4lؘ'Pn}ūD'ėJK24W˚iДQ4ISE(|ʆIb\>{C0BMn;yB{/ҮgeχوA__w}8Ms ZI,i0b QZTfk=]i݅ k S* -3A Hl)3|-Hmee[J&OSks޷;-OqIZF ZCj?_?U|Zh 5ZV ׳ REU %=@r|AGߵX,&km/P8/ZkO#8?Y (/`<}^! mǩlV/2K@ N0f_TgHd`VXR bP/1Sl) vl01cdv'`m^8^&qRk-Ky#h5P1Q~wRk%m)t[ޟ<% n  T^oNbӑ`.Uzc#R/WJFR$aJP vP̨bvċLŇljݪ;}Ƈ}y_oPm ~x#1RJSƃ? Q$aCjfBbT*,xIڎXȀ(b~6sakWM^.PSeY: Ӏ$ ƞ - NjM*N͵I+VtJP ,3|M!< 6i $tsV467MHIFwrd6fŅ a"{j j d?4 3;COYH>oUYg(/`!q4j,[SJ˩|g@!xa mzg\ZZ!mTw4p8p*ҷϘN1B#'1o 0$ڑ R}5#^; /j|j0z}hO- T#Bk;`@O@$/s14=4( S CBѺ鿺wj Svƺ_U8 BVi9+s5# l\79!,sjc1l(O;dJ 98n@YWo@"DDJo²l 3os& 9/Fi$i(񅬹$(/`% R< PgAMf(/` vK"0M4bsYnZ< jiZ D|501 BCA59|Tݔd!sƌT40*[@SNj&Y }ʆr*3{)^E'ر[=qGz)#}۠JVnq'V[ y,q+y830 V+j|.Qw0pE90;0_ZRV$V"j!c:F}d,Ky<قy`~ IU.Q{}bL}9E{&ubdv]YaV/pl/1@om],ss?s a~խU ] ʆ~>!UԯGQ߲nQW0, $F]N9yHȔ!æ?XL|mjnbؘwn^q  1 䛉l-ls߸̌-o;GT$R5 XȚK(/` [%ݶ:?bW_ ӛ5ApveٓH SVLf#p-kY¸Fq ,VO͒D4=@ Qs$i2L% ~Er֮/PǻZ|Lb0/vHYD@)g1* zс3XOcGA-PEY0V<@c0&kThws fuNaMP쾚r^W޲ܘ(lek͗BQipȴ0cQbs,)KhjcoWM,>r-ުJ, //HmN8gǛz,j[oƮW( B,X'X- ǃG_I(m:py AZHikD[Wau>(/`u_`%`/$tVy/y/f=FmQ-]K~ [hĪ NQW-Et#: P =RPa½Ś6l(G,¿<sP\^44$ I\ D  Bb$,CrQbāޗ~ KfzkQy &u@3{DZbٵBol14lEaRqDж\^-jvbn/k]9X!I'l(m\ tu R c c;9 e:F%ıo &i(:Esq.}\PA{}jP\o{ƺON=ЮK1K4*4Luz MKVTkDj!aN{/{ a U^)NNE_dU߶N&!H\C. EN`[.$Fsr͕y\X:`aN·'lJp  :o&T@fwd L6+ct:K-&Wb (/` &VC @if\Ub_x6+„BW-#@-I(p0=߁zL\Zi:92GA9U͒ :ՖHn8--_^E0`\C_C}ec%#D|KwQzERIJt+',}oPS'C8!łp$1jԘK"o"G:kxj[#¿4/ZFߧog&D7~øD%8Y=aAqBX\EZk(/`+= Q"0M4hNSNPT\}Ƙ0` = hIHH? $a]R>|iT(Bi|"^LɘՌ 0,H;|FZ]F4?1,ƒ#?7XsჀm~ndOuF'ԡ(~S 1/BV,dA<@rӡēA5%Ek2i9ivuLX*=Xs}>Za_tX,YrRūYR{rFҌjZϋŖu  1} {4 T#ci4g u, K|֐̃1fx9NX=LC,y]\/O^x:o5ǣy X @or;C SJcs}Ȝom]P}>Gssz$Xv6 LthYK#`:\ Sr#I5DZOA9$u뿞r|6M_#b0r& $U -N ؈.Qg8{crb޼ C5Hj׌|Jw6daY7aKѲrEдDm&D[ B]$(/`e F> @gl@"΀}j}-V5l574oek${ ;LĎbG׳JpXΚWmw2њk ;2)I;^ay(1%Y n V֊ڄZq#!=_tjF8o ;AzDye/{v{ah)ti9//!믶T遄PB*+ҖEl^ՇZ}vK>%jNO ,0rx-3hDCi՝jYSqv{kui+(/` ZP!0kAlضB\}s#sUPGHFʗXQ LW u'kXe-<>ۭ#$:^q>ʹ}P@F RּCqK%AU@R.lDcL1Q0Zz8L?Jr> EI0Njw"X !yg85?gP`c댺=!w!JtBwxAC|ABC?[өdHwt Mxw 1UI̻#b&z&TF:qaƣVz9X, 3 鉗R # Y ھbS [4q/0 M:ifJ7hQY-7P2|e?.Ҧg\k @(/`u56@ 4 iX&G|Ĝ2f[ ..- Ȝ{ Zp+~h_ X6н:%*3 )v9dO -2EM}I VJxR)aߛtjI';&4:a0iJ㑦kJ}Ól9׫=!C_7so@ldQ|/Mh FZb  F)=@>.[K<, r)V`!UP(/`z5FW#0kGQx@ D~icyFju`9MNK?L9|x-q6Co2CJ@-旼 ZϪInv%`k *:PXu ;U髃:adҚ(I [ꔜ {ڍDžs 8 6= $UdʾVUHټqn!!ARkW4~n5JN}VmǙ8k5e mYEc/ !N aY!RRÆͣ8q㘆#[T\95/H(ڗكCE@$99z4V8ycl1G~E"i5 EeUh&!E D\5䰂D:A^aI 6cNU>؃[ PvHt R&"\ۀ4cglyduQ,$3 PSK6~ns(/` >0 eʈ@|2I%-$`z$ w0A655suȀ;p/A2G>Թu/?4\zXvVt'ȿFtI{ QAJ5n6ȷHXma&%gOxGR?Rb=?Mvclm@5ǖ~}{dу-Du ֽBE 8zu.~~M_oח(7z2(f G%DU0ca:BFGP\_Ppzkk.(/`bvW! Kf3' >@8RKw|¥!4 8W%"LOKGMGrJcvVdq~?LyD%Y;atN 6䤭%+hzbC-+YW4@ cѤj=d,wCȁ,E w4ɁwKQZ^_1{gѥCW*c9F9n'̘9eR1T诋lY#2U-[֥pȺS . 8u% PZoߠ8CY~QJ#Sdb$Y\4$]@,8ϻ맊 Tkix-3 %PrFba`aԑ'Ma@],j_M$7 /[t9me5zۿ¡-7(n'( )RK4~js(/` 6B"PgǢ  \yl&Bԉj87;8by/! "{qI^A k3`F 5]I#^ (/`R}]# fC"}Bcrj`*b+]8VhUUQj9h4 /j9q0 R^o[Ș%`\ał\Ɖq{ڬC5L8䳩xL<ߖqA]-4 *yO퉦}mIeoЮΐBԧ)n\Q{#EYqqw,{q]_`waa saY;E-fAӫ:@XЅ-'jr('E90 JmI/ 7@|D?2dg:3hp8˹k4GS M2Ź^ ?ifنelɂg]ػ7B|[D'\0͝S. 0%t(/`- fUC"0i`V0 u;=||FE ڂ#rr`a 9::lҞ)VlU/gMp%m @]"!m9Qq]R+b['Qlwndøoei@4OB =|JObW}G#ySs|"Ϋ#UYˑ'u>K=9eߔbptI(7ߛH&qEă1b<+mg_SNI^A+3`#PFk`(/` vj%n Vҳ- L)k\Muuw ˢ96Ϥ&d.ZN@.=G>yOZ1МNyk@ucȇdf$5\;FQ|ǮkMUoY1:t;os11:a'[;.z=i 5dQ;mj{1aB⾮el]Sc1(`cz3_%1؋Ҁ \DUC98pJ8`h]& ƀJQAccj(AC3 'oU-~v/*~(ceBJ|O=]s8xƨ`5r$u׵_U?@ӑݛLS6ڲ< uQ}y]#P:,nŮCzfL뺦aKnz߷ozMi91P zH(EAz<MY%3BC@HXb@B0RpFD`J$iP@Y JfVuWၑQA?!wX _t=B$&ˍ/ڤ/̸vZ:ILi˚V)y ^H2;)Y"O"!J2F)Z=0bJ5KRGta6ɒRh:ڨf^HU yxKtE#rk3V䊐т W~eG"BKX|2> *טĝPbkaf!ERn*dg1z^G-oML: Eg5M={S(/` G"0i!CilEt϶)G 눞p*=?<P~/eA3^n/8(D3<;WC}Ew>Ѫ8/qE+">Lt >9G:1ؤDiT"F@`A*ؗk˛n?c܂8ӂϾ npxҋt78"{)ieʯ֭E6),. H$A'ZNw8ۥU7䆏|X0wRU U(@ŕh)Q Q ӸzV E_A}p7Fls38(/`- Vfu$o4co\({s[Nۻtىg Tilh׿s .{Rl@R+5@踵s[YA3~mׄ&> r[)̭,L;u]/x@罫0蝚t'Xg Niq5"vj^ԝ o_2^(_H8PGec BRy<`7@]dFff+5758\ " 9u }~ gMy.e/V߄?2oY%@Xj s)܂2y?B4V7D=fY1G"I iȕJ-9:=zzj$?Oka+"7W:܊a $N̲ $# # 74T-dp)ʈk\ 7VX!(/`3E^"Oew.4ʳ[DP? Z荒lG~@UVRA%BeiGrkqe-aN0F\$[fa TNo|7SNa{j*(((ڲ*%xzZ$nAcA (@j~ɘ5w.:NimJb 564 E57/i%4b7^$:'# }~σ3ChX1Rʂ(kI(: Ucl\ORXlG1V8Vb(04^HJnq 4NxZḴ/1i,&tؒlH|_Zd.A ݄ i+Zr*u{BF>6I~:W?VCo F%DMbf 8Ȑ@R\`1# ˻\ (/`6]"Oe=soiM_*SVP[Nauk%q]ak9/nƞ9bq s^.a;>8?Wϯn+C PGcq0UQqکX67("d!476֔84 xyk gJ&\+"bu5M\ېmi\!K `$.k)F3IPATf Fc7b & Tg}N %<%qqy 7~J,ndr8#5!,^k/>?IQ -I'ՈhTsaH-It2D֔W ?'X +v@ƽEѫox5<3"`M  (/`z ֚S#OecoZ.MkA6kR.$~ "JILWu0Ei® QzX3ޒ&Pir0좫,ޥ[-\9O}+2.M h#cyVoki C-iq-%A*,' S?j 0_e!iE_| ̯8\9 &{J!(50B,Ϻ x &YG(b]onV]eHVɰ}L_X@͉rpDJA SWR.Q4|Έ/x4d^!kLSF00OI1$v]Uj{Ul6L\Ϗ1*NHѾmm}KܫLZ5KB+X` _꒜c +uoihiL{ ]˫J$s4-FQai_u 5 py0#+y[I˾KuD8#|zsEc/[K ~6{>)Qp/AQ75瞓_N V0{DOk})s( ?LCKY;4UE%)Z~E*C B`K2eDa@qll bY!գ0α*߂J!X: @X rԊ4B (y8%)I4-Ma^z>=Nz-6 o."!5{dYqf{ ~-ԙDC%*YjMcK L[\x:(/`xM X"@kPpdGso"/5ކxA7ɌᆝOTJZ(>N/ c$ Wb%YV QWiOԜGjEFӪn;XjLӍ!*z?5Nn-x*W1P38-Y$F8 p n[0`%`Lbib8pX vT~9Wa);&s{R^␏N؏vچ+e$ @O=ӕ/ygfrcrY?~Z+~};tz_J*WkUY1aRY$Dz4$g# ڠJ֐$ML!cyTEuÊj&Ln{8qjpd b% [͸ 3b<½z0Y_bGZF~nּCm ~M~nkbCݡCr17_~zJ K-+,f5bLXw(~cW=:jEAšE{qL>׫ڲ| Q:tR0it46ׇ=j#bG߱tc؜@L$,C%),)Y3I3ϫQ#$4s ԷsiƧ* Bðt}@ 6jP?ff0Æ޳ KsO70|NYlf[%;d,@̷a94Ldƀ &(/` vA!@ KX7-7gG4NJ F698m1i7AUWL OT&aa&67mvS>8~ 7%i6CQ;HhPrkVwb^91Z 9uTZH᜵9R|Xr({8'vǁy 9er'I %o>AQA^)*/NV`.1$ +WB&au` @rC y߅].&rZPa7Vk(/`2E P!0fh6p'FaE#6UN"c(sHHFK#jK(xUفZa,ˢsgĪ5yUcrG"J5aj;| ͳ-mM|uCT8rzeco7>M,), "H Z#~MkCC bEyL|Wr'|룮×!} SJ8cs}_|j:$G߱|,0鰱ҒX#`:d%$ziA=M݅O>P͛I;c?f' $G! 3 u٠B̰bpܔ L207ߐ 2Yl{a{XafmIZITu%(/`F: @Ie>yy7oMʴQk\/22 Z)a+`K#Zjg ̲⸚ܐ<:݁4zP,8I^|ʖʉ4c9pȿd/ϭέMW UT/rP8 J"8 DIhsx(:n6$#2烢j)#߷XzeOY@+ ן#?J \`T#&@*A3,y,4CF[jsiT,(/` XJ" m4a};AaVr:2]HJB@ATY|l`8vnb|b-q茚bali-t6 -Џ\J1FD]Uk1rsur gqRFR`ۨU%"M1Ő.M+~kPN.-|݁,T?y5RYD+paA+~\aɿsrKWKSM)R)[wGj{j~YBHGX~^MgI'c=u" , (3Xu\cq. 9k 0o@YXut ( [ 'I퓦l < ]H(/`p- X%X*2;kG+ljD MSIu==Z]ԲZ5'aEֈgy5/gk_NH/i:޶CH͖SH\9)UV[\quV R IrUɹ:]U]!Q\R(΢QDS`Ө369砈(GaD.jJFEI" 1meLt{4~|SiEo% $ !3N` pagGla.`.X̩ynPJ5mdo,=ОP-CEc)Z,̀+W(/`s% X$ :[TYR?߯ºf$٨1&OPIoREJ-N4g&j0盳D 'oL[X,~Ξ$&Hr ML%,Ӑ28 ]l";^l ؛L9>euڑԻn#bue41= Q۹$S^}|4J/ zSB;&NeA+x5'='AL5\d0ؘr(Lb=qU MlwdX`{f6 3cKQ&c0L'CZpU:(/`9f$k% Xڝyb/Szm`d ` B0+gdXN/"]$rӀP@2qpr_?KU֡kDq84.4fLj[_IrB[J(/` 6{$ jۃEh4H)l#IiT%@sooh^hp]9YPjPT_^b0=1G0]kois8qR)fVQ1 q 5NJ0ؕ)^!x5UϢ`4y[AFX8NIc֖xao}1^0zH `% 2&]`P-?{>N~ *ޅy΢0ۖ`أrVҋȣ A! SJ%λhmpV+ί4gW?l;AAw=N3I;5( j{sN48ws Nz+֪E+{U(s)jd瘯[7Bh5! g~w~eFɶiUCH=b cy<>"y!D15 ER0B`K\gkp~ l-޵ X ªH -460 Rla_j')v VYP "$BJ_ HI>U *Sȼ<0ȱrJ5Wq ` ,ZyROi?J [2W47UJ<- Dţa]XzjvA (ĐVtd:EٱMgnYū{!'H0JaMYƜ5 PY!8iLOⱂ9vD{1V ^ӀC;9`*= ;^dZKdT|yHlCkѓelh9G{݄ -+rJu5~\uD1;o ;%X +AYgAbDxuK\ :17V ?z2(/`v!0K4Ch$@`{ ڿ6 95T!oqi!yI,Ɔ4Vs+TUg؂r:U)[ty\31A"F~؀M{(gGL[1q2Zq6e5IRȾ_%׽cB!$ic ؔ4~8BcXbk䥅?6?18!@P8p^_<EQjrh EA"8).G2ۤAwJNtUy0ʻ,N-L}sD^Eqd{lAz#}݌KUj|kj3jQTZ Z9Vgۇwc7[?DbZOxٖa$t4VғX'J2[tp~;wLG/:Rk/W D BEgeF$Ch-JH 8,( Az,ĺ0 p^ |0R ]@ShTZQ&% eHgjC֌4^oeR"6Y&Ig;O8寏(fVF 4d%BEdC\M6DW{BE BFMʗE(/`< 6K!@K$$Pk?LI*kb3! kLAAC;a$aGDZaX)$,˸`eQZmcƩZlwzW].QPUe5mDhm%+9ZRxt(4-'4^Q[qiJȥ9CgI(((kĜөJ3}&=]n+;ҥh:99遬HX@xNs (˱4?ww7ohun~Vr)8tQdЯɀ3{qDZvi?, E*0Nou3`6:=*Fr = ; L{o@*Sdwmh!Yl.vƖL~.=r`+Lz@(/`% ; PADS i(5onsZɆR1\313r;ɨW贏fh}@V驺K=5gI.?4{6c~,61L,'tWC lQp3kg̡s $ Cxs˿.0 D = s1j{~>έQ x&Q3^$=,z,hKRUcMpb\+ wZUHJ@"`{RG[/̱aaV1+@p;(/` R# m40C;߸I">wP,o BEIIIP-eŒTKaf=ri h9riv̡ yǑQZD7gПR|uJe(58X[K92Ҕ,)0(/%cMHqn[׋vfY,)]'}~8Y =[KnxdѮ a:B1$Zm%AP8xW&mH]Ov]N֣jBziV/\UE|=N۬pza59 B,3q! CE~O( AA?+.՚t&^vdn d6 p  @(/`:`z@CG~dw 0ӂwA'8203Yگ J FYٿQKn:0 U_! /p.:X -/\{!>4}.+ c59ҬgOl '=CC,@j*/%a.oD] x( 3~Gs$Gu F9Zsϓ;IplT"1mRX$,YB_ea V c*KA(/` =6T%0@{%Ə?5}biG~Y<IJK/$^;~!m~ŏ4b,?񱜊)(Fޭ$c^)H$ݍzɯZwt`uֺz3$ZcMѪT`Ԙ`Y*aDkQfAw[)_;M'&FT6L$NQw .zP=v ӤNT PC1 lw:(TiX k"'U( Q Pv*X=@@3?鿘{dh ,b~N&[b~mf,4}YkW; B$|$DLeZD>P8@-kOr.BSCm6ML!LҒGɲpl˛f}cVqDY- (t'p`]|jF&A/(/`= B @ cF[\wk%GI@1(g v";=7Q,1`:Ϗe4B,<ӫm4beφx9N.5m[rC N |A\30(((!=YY@V4(L_nKc}֡ |U3N%S]qnxRVhAyw;5%̄ڟX~+vu|WGX{KtgK(R_Oed8׏ 8hif-!d8 awYh$|CX~r'(/`3mvg%o 7'pnAafg>0څa" []Y 闝&.޺58L5'~1ѵÚ6[NSv?NOvKz}O{r[1Gw>@:OnKWG Ne]x4*QT"k쐽T]ztEFpQ[d2h2D(^kg5k5+g-5ZwZkIƮ=W5P&t@Fk׭KU^;T j> "w3h#BXCLp1px@"R9"tŅJ H$CդN:)x@"l,S.kwP @B@Nm!4K1Lg 9`̘2̰##M'*G' kx>oN@dYr AV^JpV^zHExڼdC'FijX6v 56p) $$66܀L~nb@dRI$G㡦n[|O(/` S<@eO\My1*444jw֌xpPc#gj~f>t']D93J @->!.M B1jHZǮ*vbбut0htJҦϵd{Cq2KQ`r~M^qID~ȕjבjϲBFz-KO ϓJg\ 8=% aهґ/ Bň jb2~ov@(BU(/`vZ"0 ׂ-}$qIڿ:/HHI9ORN\D'SZK#Z*+-(67.!MiA0SC)#sJ~=}=l֭ {w̷c :DzP}Jԯ~Vp9@Uꏣ%r RMā5R9YKƕ\}y⁝` :,S2ԭK_57i ;uƮi ;' x/Eozުb(8k_A_TU_^TVA[ROV?ONQ5'8)ؙ#@\D%F@0EK2LŸj ر$; %|ơcȇm g'l`{|h\( 3 "X^0VK .400!:%n~q `' y2"Y<޶,&C^G8ԗ9}H$I;--4Vq| H(/`v%n.I<ؼ2ْJ$wDd#tfVJn1T4j`]+J9 Z,eX04ǂ`."r1P4ZaQL(x\F-$hk'\ɡYL</CSGTjrrciɜJvJ^'95%dExurЈ# i3x,z'?:Cl5X'Cc=YFq BJY4 u9Rt]3:%D4Y2DZv*$,( 31OQ!a.I1L0=rlb%o15e',-nʡqH嚔QvFKzH6t: Gl;?{2]E%(̣BQ~}s$Y 8~ A(ĨPf$1LA)@Mg܁r/]e=P~ѧ OvkLO")1LV&IY tM@q -DzK˕yX;t4: b9jxMN-ң+,6Q=P(/`f\U"Pk ;.>iTD؆;؈EF8؄MMJ:G]~я.h4cy IHx8K?2 e A0 4bW3jM,!f  TcO qĎ0$?vR |tZKZ wyڣOa( iwibpq铷XNx(]7<5 ލW̔1etЎLoU(6ᔯ#] oP-za2c Nleì= :Ǚ'!$bX!Kz%q׿F>{C j p  N`GoXA&qNx5`g "NK 0I(/`m.p 0a$n+ۋo%wg Cn(ߕPvfj_] iѵX<͂q@PCAPAi0H,uPY#=Ω0 ,GRA(Vzu͏Y+#ġD+KU?TbY{ʍԾr+y*ylE#G((ॳA fPJEh۵>KA4JCGϲAS!a!IyG%? pvVzAd,x|ബ-C|i#goqEGɁ'r?%p;ީl %6J4[s9|@lil $Ҕ.ld_ FA>8=#O.9@(Ĩ@h$1LA).@M)x%^z\vB >zx `V? \D2[kXnE&5ٙG`Ҁ&У)G#l ѕmgl M'(.%_ay*sL(/`.} V?!P\ XQkhgYQj767J K J Ё\ˍO5u~#0+lqP{oumOzoRZlՈ,6-~4.y(%,SVZeCf(r镪uOnn0F-׷.ِ$tK~_;psX ]Kg([o  < K]iZ?لd(e 2C{ْ@lVMl0$libzypp-17.36.5/tests/zyppng/data/downloader/primary.xml.zck000066400000000000000000010303161476576476200241550ustar00rootroot00000000000000ZCK1ۻq܊%;\}yZ'aR-8xM\X6ȆP ڌR\5 +jr؀xڃFJgoUϭDP_aB" % ?bb2@U<\<}8Nn/ݔ`)5jmZ,oŵgǟL3-#PpgP %hP%.7г?K-S>@R/̾~}Wy$V|7߿$I0멓¬5%7(5m*Y C71u &K'>41u!ɜ11,w"FAT:>(3ґ`95e׳#dD$_.pB+y)M͞R5pBgv&4*!SpGDtiZ g5kԼDآCԄG8%&Zw+y]!әmZNT$, 'nSΚ#)˝/8@Oe#|Y ",/$y"37ڏDSH]c7_D_m{39̔A=2z1바VYg8Sc߯;:/׎Za`.|3tj^gO*fo uΖ#YSP4Sd1߄}N f%o Cmx ML%`/?1t G%¼/O"bUqG?Cde (*n}0r1[ucog7@*-M~!MڒJ_@gh_~)D"0qinG*B:iPêqSyG_x<օs&҈D]CC+U:leⷪ20s=Bn?3343u_fMOh@0ΚptQȻ^!naeS7폹`(q>HS7Wm ho/^`ڔ?ߤpDM^]ʴ,63R~lIGs(/DC:T{ n _>w[WO.YcFoim:P#M Ы0k_g*'r2Fx8>P1>5Լ t^&)T GS»9K[^\I 'm Uf <`Gz[@_$jYVymXA],)S mL<T|gAS ׬9'ׅ;pVMIF"6 =PX.#6USةVrMQ\amJGFn8Ά 3lX3 RP wpA^fVd<*=8{d&LvQW :!|f70 ?Ǖx{#9$ :D1\_9p_zGh=}5.wx;8&tDSC&'w!d#)FUۅI*').\{B-t!' +%2sLRmoEN5S1c5[ !gzxQFheF nXǽAU6HJgLo=KD]aL-{  Ch5O- B%躘5BO-'b `o3;~˘N| ogL„;$ ԈWnoGN'D-b9,nhX{,r؊'A8諏2,#p&D ^&L;uH Qvǀr5/ՀoqBYDVY3*j2 f:x)IZ@}95`L_;cGas} Cy; ?tı U˭ :c75 U&3 ;|GKL7!>-Q9.EťOπ=6dԊvvo`ZR#"d?9݈"DZweuK^#IWJ]vxTs~BC}VK\(++G +\C~ څ8}ܕ(K?ߑV9K _?5+D,uKTeNUk(D=\?(Nߑh׹-H8dJrQ"ػj) K[eA kbGr矧)# S1z҅(9|MSϕ⮼LifIWF!$E'6HeTV5Uak8Zg =c:.Te:ExPҟyM#9aK:; hWhaƵ^ $m@<+`؀ _68`AK^*/[D5#SЎI_-"cB@/pp*Qu>u+9;0 NGҐi Gyz_oF{Ok̴ntT,4$5,V':6/znBv׫T”01 S%x&aMHqdG!\ CJy~q)"4:1: 2kU >$:r) ,aN~էt{Rz[MkFԡب(-KXcCUmrgk}?G:J"A,4&y⚒qKW!1ZKhZDgMce*{EeMntYzeqbWcQaԪJhg5D+ahntwQԛ؅XC,a~8WD;s'!]?ܚ;ùx~SM!04n8F!AlP!OMk`w_ ۻis4Ĉ.oX|*kw/H3rl|>.P?? f:Z"\XM7^gYɟ)Ə-WbPQ_kˠ=$gl*a ?iY`|uȂ ajgP5JoHFjoy֍JL]J/q 404Y2tt^oᡈE\~Nְg`}J^A"09di⽚l0 8BT%"Z,TA6{g`f0hwb>g>ziX7ޏx8z7M. Zrlޞa* $2 w<@'@'4`u5|`KsJ7RF% m*g:`A~Q$Irk&*R^J[Eּh@uN7)=وkE(K٤!.m]ʞ߉'Ÿ ki)M/a\cd#2xթZG`V$G:%bGۢldCUt/~'sronκ}S{NKJUWjŸu~wYt_ ZM,7HPFHUEeWo^ZR;MN^Q&/+r& ' ǂUX} 0SiVX{4lTWaN*? ŵA[;{qmLIC]˪Hnq+ej}N}<- /.[PP)M"0LVJq4"w?{ OG8*%.HH^QT 9ŗ>jLcX9G^ĘF@@S}/Mg_YC3FO1S,;Jeq1:pւ7|fxuiTP$XOȯGiDtғ: ФDZӦ]"ӈ.iqo7sKB+`hTǛ+&Êu!ܓQtl&m٣ &|S %c{2}jùIhme%sʂ:" p Y 70*hgj!v 8H*68\fn^gUL ]DWhZ`X |-ZtV]kWPLfXFkVMalPmo[Q7G\evt0+w H-ch\x6t3bFAw2P4v^8+NٲiI7%i9RhOj0N+7]`Ḡ-!+lvŒZը*iM\{(e2T J3$)sU8Nhe䁒aE6u =i'f{AXc5Iχ/h& 6IJ ƒ̃xKee0sůIʅIrCT* 9@ UJK.smljB Gz|4Ggyq)u`dO*tQ EF_v<5Hg8~0B-EUmWàzNe>Jݧ4rVԫ;phhjB[74L 0c{9l @9ж&6,wtDQ J^-^L8t?sݐ!Q6ht$3 $wyjmj'NpIP|tV4NY=*a: ֝z̓`Tn>'@Imz {bd0CMâ,ܽ.hf8KT'r([6z lBDoţD*[K)1i.$N!+!*ƗLQK < z){+qA猹jj_.zݸ^VVZ1AVߞT-1pn >.1Y]=K  32̤v,;ň|GOj ZMYIN=JK&nB}ʞio!vf|i6תIa2s3 'f>S)fq{hv?hj]6h&Da.No H4z]5 $ erypcэeS"E^ GBq@Ţ5YD$3(!4D}*U`4Ҟԭs+S0J;3PwYaVO0_zp3ȇJpv,_iP@iu5q`NYJ|u)Bz:c?ތeFZ'fY:1b-s,錟qe=JKZ}W=Rh H"o/($_p^h ~+y9m$&HP]M/R2[#xv4ܤw"9##z‡\vW%-lŁ6)\6%5\́5]._2戰c^9wGx$<^Q/ngwIC܇<֑Z{)FS@ ᱒qv$tSAD;lQw X Yw] 2"qFV <ވ*߻o$WKг{dڟGL2L4:[/95@{}gwO䚁&-ӄr0E_@|nz%|Zg%IG‡$F¡IM}ٳs1> 3H[bB.-{7(>vw@z%C%I=sc%HlΚajt}2Ї@FF(0/n; c7a(:5I=QGeJ'B as~0og@GQ!IliJg EPR2tQĘAdL ie]!|'0, Þ[B)a̫WFPIv=Zok|D i9@K,GG]T $sl yD[|O'cNbF o)8oqBEy=:,oS5H3<`$s%2EY%i~#w XftPy{&P*b©BƔ+ [GgN/8I;Z1^ҧ(F@AIe wNEHU@t2 QPDYS'mk2z*=QaEQUBI+[Z.~NT֌VǨ4\HU~@|u~zE/`XF&8-P.35EB~⑮6ZP4_h?(\(6 LױcG*G@Vc o&lkayr I T@UD~v~)@pTzѠ{#~Q l| J3770Z@FU} owZG I]Q3|DE R*k;Q>} c"@cSne~U &ӥ9c)|%BJ4)#dnfG:{*ڠ˴4as,%[W(l0lRڋWPbN1 ͗> Mn6@z ӎu?ҳ)M90%EasL6džA:SzAE0|6}!?8*I( qׂxnF ^(;I)0obYWAr_>V;]Z7MzJqc!?t3֤# de8 yNA[j bU;̔H $.C;o!ӍbG *<=XB #2AO]!7%WWl m.?s/Ko#ƅ$\Vf.2| O4g!Jpe@l<}[.|\fi: qx<5* մo' qY ti `}ӷf mDa n7Yo zdXB#C,d1|*46P@T1 =u Fj衒5?_o6ALϋ}f/#s!-)6яd ..}L NQ&Rm>=K9C?|~n͡ $ #_@eڽR.wLR>tu}P%/]qnV";+M:3G)vg1)&lb"`WVhJo p#w8M?fG $KM{PT~ۙ{pgY>A0]WT UKO]o !`d99AfZ9k[28d(ƥ毟;+ӧU޾ /6eIV_B1/68J~2>G_msO˒aaN 5?6m81%> nH)] Kp?9к8@JC`GTza9;2Wwl-Dʛ7`K/qgߴNg.θ7EG0J4&6P`XeGnW'`"eN[$`rw]WHQi5ANL,<|3:dX T&ǃy'D=y<7V23lݯ0(mB>`Y{J./CδT. Y|ÓMA*~+!8ЛT};ÿvAP]2G+s?EA<+1ehPg4Q/٧B:+`xlx)A:ti$"M KCGo^L.q`LjxGU%1~rt8́1+J2bݛ,K ~76 ;0a"0=BC?cu8^ yr;6<*rck~waxlb ¿,|LoQex(}P"yRGO/\ Ors%,(ͫM0[#v ǹh3#L O`ji-7؞g NL/u""TLF3Sf\TsRgR1cGA *[]FnBs5{mrsw3cq (7x|"\e\@|m5^C'coe &/>h=j]b]F|Au,Wg Zg0WU?uZ_RT;'h W-(/ uFpi[6lȯ4 5x@n_/=LxBق X%[e1<0:s+%BKɀs"Vw^Of<$; U7Vk2v8uI(/`;!P@˜BMKG%<-6Uit9 {133i}4^ 乽䶑_%L !z>jW»M05ݘk ,(A˰$=]q#);ª\|ˋ-Gs$˱14ͯ)MQKtW SPVr/{ͽٰOgC{s,K y%a(Kr-DD%X%Y0_9_ɔe5_C@ BØ;neClǞr#x7@ z!r+NZ7`ʪ?,PXoT _Źe`4\i!PFn XċC6\&3QXwּ| 6;&`En -aCbglq!uRK 5(/`PFP4Pgt!1ƤͷNWC؋dmoc&6*++^H齲P*ODӮ,>IMx`6v#ޓckKSN*N\WAa%)p\c\Z{ϐK}kQ6y0Mi\.t0/ȭ[XH~J@i/%SlgpFU.2my 6vh0kYEY}h\e2?>(/`0 ֓= @gd"U4; <'В^㯙 j\553H3zmEGj>>s|Wjzf^vԘ FIZtq~i 3( PV5R?tD1eQH-WVXRKUA-'}fn!|efQ[J"8/'^[+_ cJ$Ҏ8RSa#|^!J( 􎣇 I6c.NR!Cc  $Oв$O+VWaDT=haA!N '=ѵ^uu,tb0eoRbY-bpW0(/`V 0 en-K.iv\PBkC5MNMLJb}H:+huZ ѐ~Ng̜O{c0 6[ħ1d eF<%(ЯZ=tWZO0wIQ8e=NJP20@ @)Ubi yOޙa!GybNZ?LٹhI)3q^'n3\w }b.>TsMUHL݉W|'}&5(sI\Q",N,tڱ D/,V!u?꿺{boj~iWh4 圵=40sD"r'2u$u¼sY6P,X"v*D@&@׶iq{_P^V.WċŢoWvZZ ,`\:(/`' 6? @ m('Ii=EIsc!X"qk̄ݧNFH1Րb%J))},& ]f6Bg  $ $'x #qv 6 ^.v ,g4h#DX}΢m0(/`= 6M @ 4#e{co‹:C A^5EDCa,Ye1OHNeVͥ:m9z FTB!QZE-<(f )UoαTkޡm#Y; @pPc(11U+v2+YvKEi/*S GHz=S< 8&cUCP:vهTK((8‡cOjH qu(gRʏUj (`Cv?uE.B{=BB; H su\ؿb=S32N, %cN>'gM%2clj-  ; D`hڀT~߰q}.0iq;.HeV H EX]A잌pXGO!I(/` F]W$m 2[?~b]?s@y3 HUzOSH{m] 8bifBOW⠇PHe(xpplŢL5A46E[=V`PfYW3,AEQTPQ8ʁX5o4Q? `&qEh&%Aq8~@U'F&$l6?dyG94uoFm;ewEy{(Nd #-t2kŶk8x}D 3iȌ2iNmdm]dV6*=UmVH##($`7f \dZNq +uluf0s`H*ΰqزmnqYhIlhK ڑ]7; |qҮ+E6ǥnf|o%ZG*$>d%X4skL* Q M)eqʇK$ް73:*ޣp%$/|RbiCB-m(Sߥtp/ ; uTJ;&m|Y)XS(%N*YRkS3_7~ܲ ` # g ^_~w!d^v 7;lL+BLۖ7NH7΅57⢙^f͇4$a>y2,c (/` v]X$ X|+YkLpNeqK4ā@aQUH%9@Mbqe8' kr~䦟8Ae({@&n(.cM8>+uaƦ.5:夵S2˺ڑkTW#JTAE}@s!"hhP "DM ApeV(NۿVo6oaiQ>rݛQNٝ.dF޿)Ji;Gjzv!8(`J»#5t2kŶkr8xэD siȌ:iNmdm]dV6*=yUmNXO8 #(`7f \dZB.y`s,\K*iaqIm$@6IcR$rhAa\(((/`X$m)8|hHK9x+ \NNM]+ N b \ Ҏ`^qHJ"ysl׺mÖoqߜpyD$o .B44>oꗋ-Iz4)Au?2eQomiLSʥ l/a6vvfY4ͻ&d Rq-J.u4M;Rup5/3f>Uɻ$r1zT=zbTIdl) pSo!Ȇ%wxe >RX`1#iZk.(/` V 0 ec޼e%-֎ JʖR}E4KMNLW#M99sICfG4z d$Exr<.'; b|sS `ؑqS*C#?P!`}&ǥ<4GڙatYbFjAҌtJauf CUA|]N:ID3j`0cPoKzq# 0GF!\];هc8P8ۼzdrҚd1KI =˒`Jc[t <nvk]5E{]BB3Q݌K03 ]5q<$D2@ra 0r3 PeAXV}ubH#2CCCCܬ(!\F=w!`hht$1V+]Se%(B|1,?T *K>›Ci -C+ EgKNy.B{ĉu¼3; AF?h݀ @״ߖiZ8H{MX༗J#1 ڗ0\#(/` :!@i4C(- оL=:Pk9˰50229sZ1B#jw\ 0bTm.Œi#Iyyx9;9}=pH#_ ݅ Q}ZLYY]鎝ۙ>K4\0tT $H 7.4h#g fB#7l+@0(/` i&jȦ:v%*!,,uptljeꯍ)s8Rzq '$|<==ʴk\G"&5G&HzΈJ(GdM/"DGTb8U*o-nx z-Ό{jp\; CPP@yߵV?8aޘgp@g3lq*L/= Rl9-[Tk I h2S-ߣf{{m"j68US??6r*VŢAZ Ij*'2{`$ 7Dm)$RaKj$q|t<2g6ڔZ @ +{c/[4`,׆8Wyg4s)DC 0B`(#˓``r  Er` ţ,rz2R6Y?9hb-^8S,.k+#n[<Ͱ\C%Qv6fA "GFD7JK'Ӓ{ [jJ:ki.j1]̦ǣp<5׼ %l-P򮢃 }m. d%T CEK4Z,HЅ9l˭|[<è41 (,]$iZ33{hg0\t=o]7b(]>CyTf[aU?vo 'M a+K !C|@A-Wt ~ 76oP&z:oV';䢾bm~k{1 BüRA&p 1fHI1F0$-,Ck"qFdXф|C=Oi~r\Sr8chƁE{êeWMLŠޓ=yhÝrՖN'}W S/+Zs%Φ Za ï>44 0B,+&njG-ɠL5'%@@k //K +t~c,eo\M0VCޞs-L81w]rjOiyA0HY$(/`u &=Pg0LM#ԋXk={584JmNFjyRCec?kxi&_On`sX-OgwRL fFȟyG+Te)B!'ac"\R(/`$- K!0 (amj\=ٱNmu6dࠪCDAu#r(~OK :2CKo{"Ŋ##,/dY(liZƇm)N1)  AReHX 9`b (0]g;QHqAGSCZcCD6|{vzr Єo|?圯D.P.f-HtwXl JC5$,Jԏ5PgޟrZ~~wE^^0W!(J4+ ~én/ B,5&A(;p- n&ܮP2S<ڱ*dGKYfmӫC6 }j7xʜ*No.|-cf[M(/`M <Pg0 $ɓFI^5""(02{463HJ0J(y>鳜'() FZ]%PBv8} ?9|lom.[ l;(2ۣ`mzjY 7:XhmP;Ҳ#L6_K;2t ~Y*]M1"pLN-t5ՠJ-[r 8̲L02 B3MSuB<*0: Ċpyak& 4 h nO20Sp<б:eG4y6Y&b&W`m }oH9kKc&6ߍS4^к +J߇Vډ BP 4;сqؓ4(q8Z9 +$"_h7T;^=} k}(_iS.gp\4#8TDڊ:.Xh0mUkε`JS]*‰KA(/`Su 6YL"PkнǖނA?< \4fXaCACy.r`0 f?H]eU]S8?at]df8R]cnZ!}R`強~`=UWF̗,ʢ0I~ߣ-6X](Ej3 v{]itiٕͦta6@MV۞^W'`Ir/ȑځB{`MIM]wpV{[nGq= 3"5GL/(-%v΂8DgI9 5I_ ) d4HoEyO]>g/ʞKV&FCñgp\4#x$Dڊ:.Xh0mU͵ZpRP(/` E PKѴ @-[$30<<>J 0b "u|;HxQ>~9z/0J]zs 9У.Bc>e;MN2ԶyUl%9sYEnxPsN*QŞʗT (U/R$CCnWB:Ѽ Ph r$??Fήude1ZQ쑝(_7ˉԻy4.QD jǒ# 㬢q\Xrw5qLKh^ƈMN)q[&w6]|*ݶvlzf8a4C~ RK*(/` -6]$0^2[!EFKLR9jh˪3PEy9Tt RXQI&s,QXI{f)| w5Xw]i-o;4R&zd8QFْC"-8A|V꺄'3 }SgMDnKUQܤ, RŠ6Ѣ1A=qrG apO8?^@y&1rPa$)PX[]Iw~.\. z;Ȳ*V2-wUUѥ!, ̼+&"x'?ee݉mc ʹ)JWK1cLi[iY$*ʧ*nk(K|Q2ˢ/Z?e/(F=5= &lP%xԘUC" 3$'_s۽e ch: #Kƅdhv4gW Gh}Pbi@A(/`MVR"0mFM|II)i~8xT=(T0IJG˔O8XGb`i XsU^5%F5J! i)N'TטVy?-x9!+ >yErHPpFsKW̗0BY=% heqY4"+N-,%5:AO^F XEW(P0J؟G/;9J+48sx5,p{}/-LO5xPqkG[x%G)WVLt hPaG3 BN`.M2l u/@% erf` ޙ .@Am0x-mY4r%2{+D{ s`ր.\(/` -F]$0^2[!mEFILR9jh˪ @Gy9Tt QZQo2] ΊN0Ik(gEv%VĵQ>@4r@SK5:k9.тWgOxjP:k o|K}m^%!M`O*V7'($ǣHp-;gY8Z@ԜH q:Za_ՕtZsp)@mg?9KQ"Xwu+2W5K˨J:9eawO䧬;I6VP +!8|uK1y}^cLvi[R[e{35w@ >}RfG(U(G,e.Ú\}תV,.(A5<"l(k<k #HȄbUp6o)dÒ9†08Z3 7-d$fuw-%+(/` B @hT, 1{HxKfVUYz]8;9FYr>e#9[B}$WU\mwGrӝ9Co~R"t{tDx[w"2,5T0ڙ(L?$&U(f\eRL:0gʈ$P36X-y[՝ :q(go)eH6/׭rNaMcRS=C,'*|݁u{Ǐ,, 8# $gp5{,};: Y] ۖl[-oD :=֑jKit(/` v? P n0ZE8c ;KPd2686*\+XVcVAZ'~e0t:m0 +yٓa68KV j veX)⬃xKI\GW"?j{EKZV3ڏ"q Kk1T^. 8OUN¶k00ݑ Oqa;彣)Q^bKlpp&ԍ[/A,}>3rzfL) (8b=@W@,ٜWXt,4ȸLvd+ a]Х(/`9er$r5!41ƂʉU:Dd&ɘ1;gr8hheU2R2ZQ0Q8hjk[01A?jNVLj.JH 4"ԶNZ[CygS ܾ00}V} t_Eֱ5DzPj H+_ODAR_g,? G|sd]13Hִg\'Obg|JQHP`׿6:O)wNزWϣ[ {*o9|{ 4.-v Sϕ Xq#$-U&DHHo K B`'g &K'l©RXXԑHGG@ʣƤ[& ' ؍m@4 [1\r`@V ,[IAbÏP Ό{ ZpkY9E+t HvMa CaRvdJ8_Ht mx&2ʓ˰N}Ԓ2g(/` T@!@I kK|$2v\)E9ER;578O\ъƖwYc :SwP/KCIpj[6㓤&lq{U쏌ZZ%5C#0LD> )qv  "3k؜GAwsWі~_&@Kv4%ƛ贉y s9!M'uCP4K~N[CA>vbSqGSN1S5&t!otҧ\s|˖E?$WN BbU^+*euDr8*yom)g+WVp  L['q+E4}ok= $lq^,Q–Տ$vdChOx&!֑Jt?ux  38tk d?7JS^^swӢ@%E0IOV.䐕9* *wtȈwT7R.nOo.zzra'8%f0q<_<7wƖfeY߀͒>TJYOP.Y NX`UiȖG zZC÷B׆ `hRHu!lpw:-鵷VI?f,(/`:^!@K$AFrQQD?xc UTTTH,dY|,$Y T(e ٣'GءUgӺ5gx{OO)2Dh_.lk{pWv$8i)u[oI;(mviQKVyaBJѡZJ"ae5wBgl^0ⶳF&=|VRKVbQj-̡:8Й3Yrϙ9T=䙰Ur N#{=1`i!_=h.>hrOPS|d'}$ijjbVj>P#;v? B;n(} 鍖 [ʅE4N/й0,7wƖ geYߐ󏐛%}iR)i>JNzn8, fY`i"h =d![kT07):0l8[:GY炅BM k(/`AuV"g#0m6e5FtSr&4Yto_уK\_ZGq\w-7Ma0Y^m3ÐdNcFi ?.clþOf&dI!ǍSw> [ > >ن~m݃COOR^)(TN&O1BCreֺo>u1LilXL$Mk4cQ4l!.iIs(HC+< ;=X ͲΘQ+rRЯ͎, ?2wzK[hw%OB7P;x[58DY11kx!˵k80PXHX4x~K>V4]V:DD(I 1j"`0jYeTc%`3H@$@ B`,$S/ D(/` V<@foyHs{?_JHbE364R|2 9x&n*' Q#,TK>nYy{[B|Yˉ2^ma>Da ŊȂh9^GѐXױBp}.x%†sscH#k}Q1՘ElVZL'c A%D%.հA <##[\/X(08i(/`r  eJ]4Qp $"@ili/q-Ya9U+MFZSCY\~"w\:OUEBĦms$w(D9ql{I!eI|Jw Oiw6eՍԷ͂h_|AM;l2$0ԡQw~66 wmOħR}Oď<"m lbl egX ~P[ S, T$|b&(oޕAVڒ  (#Z~b/B;z ZBJKyyz(8z+ش7 Y?t v?l2(WVfOl^glJP݆_]搗5y n],[u)gF֤.1*!~u%~RQB 0B`U g^-(]:`rx<4B01;^8աFlaQ鈁*2倝tgyC<-6 )bOƎ}1{T )975[\28!2>(/` = PGcA75UT,8"*Kb$j364:Gv` x?LG>To!=Q}Mhh_ m@blE0`HeŔ煦h}e ((g` jyOB2;Tz<|YIxA=^eV\8ZfIsR6+QBv"j V%z20foΏ2?z);1BBVs 8Tmc5#hqF-K&6OQw4=cj 0 3f\ԭ!I0yY#L=XKƩdlpFv9pkbL{SUm!jAAq\]BӀ)H? { ,rD?uFzj؉Iisu ԰Y;2S;F#h?fܩU, ddFN5FPZ)7l K0y68o@;E7.j,Z{O,p  jÈ@R!Q>13/c (/` vT@!@i v169LQ#!Qa788I)m} 䵑t 2:ʻF秦Yyڸ y/ 2-QFg&ʄrMiN!G;ckJrCVB5奲F 3xaps["_,ɻD+8Cg&iDٗ8'ɔfdپ\cdJy^qB'~&KtnKMXv4BQ9 L{^k{,4LQbsB}(/`-a" khYYX_~). YL#vTBYYU g=Ֆp֓N)N㴆b=3, 4Fô19uj&t`.gVoT-16C;{#!v1 P`_U'5dQal=N:P;40 0 `0MZ0HID_Dkh zI;5zRb(X/G>Z+*zv9I,uZcQ Bc2 I\H8 1`u 3eP?$Qlb86^cW@s9p< Kċ-hT뉞\aZf'%)D7 m"YMH@~-N䜑F! Hr0PU:(/` >"0eHu-Bs]y6 j`558^735Vw$Na_Ĺ?^:u˦Y8]썖^Sϣx!جa g ,~CuFL^y1 a iS=>OP[&ΗKJ XnGh 5 ̆q;}mP m9񲥾/5ۏ5ү:L| Ƙɰ~@8O߄h@X7PAEc,\[W(/`[# mf0nժ`֘$X&9@T@ RSPS?Jeqpʫ(tVa4J!+<%EU 謕[1v7]ISƞ2yHb]l/ i!A51V_RO%Y%Y˄aI֪֗X84>~EE2]$Ʀ-%* GͶq>_}K)v(*1j~GoINa@J]]S+p@Ӓ?s,2;I_F"+:lЫ%u7$RӓϿ|Uȯ{p[Mk}`?}/>T$gm0؇NB5 B@qlSxd!"laP}.q#!nȜjJ v;xl@K"q ~r]iogly׌483%5dh adXt(/` V$0kP #}J9U =d6k(PTFQZ[ӰKa\<@Ҝe0&;\iˆt3 @ AYn.3a1{ȝ0(+?MXD=C6W: *bneMz*{4J!5$9XqNvpSDk^pljBxME) AH=Z4f4 #Y"W̭w-4;NēUO%*۝B +)\V*!@L\;Lf?` i(4gV|~]Y곛Yӳe?ɵ|:~2C_N*9r$(Hb]t*kཷXrႬj0hLǃPڛx|J ZBal6{q (/`hX#0m{%Eo#΂`g AOOMo~T+S7&n+;ҤA PWm#xD#e_'l ¿a hf{,VQ^t,f%wu B 0 dV@ra Ig:GP༇V48x4:Dvb  v;7%I pOL ξdo@m4.`Ig$Xt(/` 6VE!@K Dִ6Q=Ώ~pSu&;>>n؅gb9{tp8J[h4éfLSZ5tE@ _OFݖn:E[h44Qa(Q:J3\殶$nb Ƙ-l2KMEu3w87ܗ6z& jô!M0m5 8ƒq_IEwVdvP+V;Oo41($8-Hp@4^]hؼ@mQ[LZ :08YdX c 5#赙+Ч B(/`5T" mOYYV_@L6t ѫE&faLLHq)3*^ڲ, ~+mNGƩQ,Ғs!ʥxED; -Q5St#]`#rJc!Kq;݉@Pz 30EQP\ms/Zwr?hmԤBJƲpH[k *&@9o'.EeDmFt!8BK~-Ń}ÀdW<}Gڽ_(ӕL&¦glNV[&I#~C+v8g!(!;#kss gH- Nf.@ tU `-+Ipc!sQJ md'$)D7 mmaٗfHP~-LP1/\>1cJ5@(/` D!0k0,&іQFfE'<==/),Z}[}@cpO$_j4U}Ax^+|v1Ve[˞hk Σf3!; 6KG$P" 9KK;/x._ZC,EWfnA:L 0\id.H'  F9/@,S"ªYg&Nt{}%2l[(`IW]ID0_GEŒOXNH}/oݚ`,l6 &i(/`C[U" f;h#k@Ug_T754MLJTf\gEkcY-bPמtBC338%&f``e=y:Џ`J *`oU[JAq\Sz sn9T=rPI#V1x!R3KAĠyZx/eɝ*_7>yr3Y`#P2:䎬rAȾÀ9oWv-VyT0%U N2\(ŸAS! `ݑI:>#v$萬i:fF{M0 D1f@\CF: x XexX%@A׵&%rZo;o@'ADuـ$hl{fZs%{ $?I&Ɏ 38"ONX1%\ڥ(/`E ƜT"@XC\Jv#[b$ gLx-?LREWKB٨KBk>xL Q ʏ+bDLN~)?nDn$` 'U S=C`;)X2~O2֡ %{@c IcXM,ςPQ- c@ bP YN[g-$ U `Qut/)|oJpd2|{~_7\{<}ˁFNGYsKVCAt?!iژg81?3t JPdT;~\~nIk#sa! 0Bgn - + Sأ/d) 12ʵȱbn^0p'(/`} VM!0kL.֠22{0KաP:#:7w>0^oN^ԅ M^j-`潑ayzbf*tf@;ރuxdrx+CYA$1HO,H$ $ ܾ3ĒcCR` b,;i2_0#$V YHe￷PW6a;sfL(= MUt(/`U \U"@i,mB+:]u,P 2PKke̶p0OREAy058ZRf9FO-+F9ԂUђk hF"΢ 7:jsghkL\u{r0]M(]FI,a !IҖd=y% wY A h'yij< 7PjQut/)|ojc2<{nۯUCC= \}FNGW3CVCAtƿqoSe̳Q]np[czDSSLFQq~h6Y`8 ! @,gb 5R ơ rS2S-iae9/&%hD:'HF{4i,(fn'3Y}M`sz'@|Y.z|su># K 69 G/-l,V%, $6"++s kO J+yJA?vGԹ "=Ҵ 6u2AfJt0 i7-l-͛a(`%[B*(/` FM!@K͖7;)#*Bô5ن1CGB j)_3Mf`HyX1meIedb#|#UȯZܞ5GOa@4 \LԷ lAF(:QϨ1p7;5W0`Yc>{G}`43xL3Ci¹te[xX59=-f9lqbH^CJ!dIfa0'Rb.{'ZY4=\)nR̡r` CZL;2];*ViVE#|oinskb)h_}˯*ϥ1ʸ6N4""8ե(Xi 0]88LuO(wvJ<&~>e%,wFP] (/` &ZO 0 4kL=6p*etNᯠ0FHEKeeq,XXfZi hO x|UP4oOi*㇙]J1к@ /(gdߥ!S QLav SGJC[&A?Va3Y^ő$&w(l?ſ dz[0:#o}{ºP0u#06wk0X/u[Ce6ԣfr>e_N iF[&VG~OS3$9ixLz#@_C=u#8~a3 B$ Fw#Ҫؒ?̨H|7m 08GʘX,T9 @ cQ)dK з~{+̛53q564l1kl$U)5HUu426U˖Hvyx68* ɺ|HAΨ[ [atB'ڪ4`ɺEQH?)\q̅"S7;mv[M@!i]l;OOfjYռ fU Y \B]$uE87}>Xh"`eX¬e(/`]&``#0kCH–}dpǧXPR0 XYUyal4萵0dJ}k/v'@ "Z--rĶ̚AbE\"~-~n]kb :ϸ'ý/UwoL{Ns'RJ(kt)joimcn;Ikp|O&We=ZHca| P B; hB";ܐ4/:Zby$@C<&.x(&I22fX$2 iZ12 -rezUU_Gy;?$Y Z-aH3bOk ]<',)whײi)as儑vs,s_6 u{SΨea|f(Se2 MupBS-dcTxhZB0C(B3;@62wZqHW%\,25e pj b|hܲC\?9w"+ZEoGx|-\RuZNWHLq 8 c?07wh %4cT+e"~s1 (/`]'|&@?Zʤ\f/큄N&Y^M^מqy]䕱;OIBuZ忚f" yb%EHe* 4I*jW9PI s[MTUϨZB%ezRAmꖗGmvVJ+E{W+M :i<늊ŀqЈl6(FazqPEh˛kOkOrz^ջʡ*LCBYBk1 t0ަتv1w6׵gß%GXv nv;tN^u=UMn֘n| %ea ueƞQ,k7e²2ppL'oGȝW\zϝW`Ys(RQ,Aj\13GYĀdq8 z"$'>ʃ$b@2_?)>I!R@  P v~j(eӟٟ=qPLLy;y:cwnpm;gZ?vjqmM=[}Ϭ9nnl4R3j<|xOys'ξݭڹozztE2 Asf7zw$.#Wd6w:߷[/2ћVh?w֠A!c @B w -Rc%L xFC0rgO7AҤP1>^؈^[4 F> мf:[q̎cbG$q1gTp"pH +`?`A1@!8B$ m:3.xhVɥp]$A` +[|h>= tkPf(- p9n1'9$zB1=Vceɝ$]L'U=:0b ɥ Pp #sdNܑ%'c)r <8tTJY_EA}Q-/LNae-,ܽPk u< UU8-:VPZe!I&I_x~ےLay KxK6IKvL4.-9} ۖI6}LplV]Ijͽ\ևG/v(/`  fS=@finv@4̋+465zS>vᒥ`i 3T*𒵙3Wӣ\7=.qˌ #kTx i4;V4]i=^h[8K53 7to7q9l=g4xL0S`cR$݄EĖJsGsҽ#^+eSN Z_BW: B%8D-p/0B D ##[\/X(48j (/`J,jf%@K#j[xM[H򾣐ڢ$LJk3@6Yz`,p@ 6I"} ,AY C~@(=`46$ułFY(,c 0( ^@QłDCbE7(%q.@gIc,fȒp.%DF$?HN0 Ei T {`/ 4J: /{@0v:؆y$;<8xQ Tn$v@*< !HQ, |xd% biKdq8P,_XEjxYͫz6) 9b{Ux??6-zǮ|igMKV~yX&fb}B.5meg'AX~K(ny~*D,-Z$ @N4\C YDH<Œ/pXPJa7Ic?wh|qx@`oɷGHJDe$e2x,$M4K0<"#8 &y$M0¢p(b!UB/߮v)v^n6k,&ɕ>6V>ُ6v"ZBevV.i#[k.m+:JDtzdTJuj %bX;ľW[z֫(`"JCC@$0 !|@8 qxZav17+֗`'0紪S`cԳ\WbN*CrQaiHzA cd8bD( [(=uB}5H83 sw b`` :Σy!6$:_BR.+uRD|W2v7ڱ$5wWk@]#+PXpq]m/~%@>#O"ղq3L5‰FF@nѝ- 4wP94RLԿjJb0|'ZޤrzN8;pBcjO#eШH_1MvT-,fy$.Ic{DKE ` ]PSUޡb05ok'x֐IUNrD_mx,${D)6$g9Ʃ ”఻cOE$VPҝQ'G]8xa# %:8 %8 !^ra(G72o٘% %Ũ$Me8K (/` c$olzSǖ5Y(‹ _ !WYVnZLKէ-LT4'{֖eMƅ05و $d@J+|c {{Sk2>щJ >[cMZWOOo>,4Ǒ7-𸶼;P埌mZ=AE1bEBdSɟbV( Xd" k͹5=lUqv'z%֚o˵G6?h9kR:n|'u{ 7T{}g:zW{% 7X%EADۿfYU8A#FJQԧ y-HF#:ݭ Q 0B(GbSH d0YL0~-+ ?k]Rl~$3 ^YBhR+}|NJ1Y :L[y,-W$={9# X$31&/oFQhmlހ| B5@{} 5ggR|,.ҀRqCiNvȕN=A:u {JZ諏-==hu b珵J  8=% aهґ/ Bň jb2~ov@(BU(/`V f'h8qIBt@팦:Bd}2TÂ+VOxc]  /l=O7NUu#+{hM 4gqF:Dޒ8lHFkGTt-gmE<*> \|ǡkɇt8"o)^r; @  Xj`mGQ0V%vz LJ5;LI| !NK6pl; %-(9ltl4m;C[dp>F0I:-%4fA<H(/` vUB PIDYtidG¯gLV8<8L9fidI儶~b)S2^F5Z Z* ZTMmxi !Gs km4-aABZ< (9PdTbP a4%~d0u16_м6r>HxsۇFx٥<ތghn4pcΛ?89R?_?nuS|:fĜ?E gOQIid)  B”fLQGyWmTs&a22yk2P2Mh)Uf gьMNK*P(/`#p# fn,wd ކ w *n2'@*fgjL:[ciTh'xL):Tq4R-i<Q]!-'2Wz4y8f==E5ؽgѳ}"8m_V۹x{#"/j@zC yG'?D4*Ns@Gel]roR\+r՞p29Lp׎rFԭ^oi Hk͝iӴG8vI#]?5=*+ehw!aA /Hi@Ԟq̎'gӴEӜxOŬgZ y NZ~x84U]X{=+0pvJrJvNAmw"c jK4MKqkx(4?#vQ{ b6BvǨ66g =Wab9(I"4B`3cKC`7ܣJ֩V4 $rũpi|G w?_?_z"kG"ERPC>ѷny8~\Y-kc-xXEy-@OhK# KS&sAL+}[kv rkW6<%P b"] maXt  ׶X:3eDZ@!ɓ>0ǂİzk(/` B PIDYIȂ>C`ҘIN8<81HJ'#)O,'+jkFx#M pC-bIIypIkg ׎cK: HHJɵ EJL9DhLJ``nYcs F oua/¢P"nǟ3hs sJ?_4ao ֡N6T>|sFnD*r6獺NJ#Ka  BgLQFyWmT3%ar^S502 >_Б@F5V/MrP(/`25 S>"0Z9*k^WʽW6Tm& ""364mI ґOyՍG}*?zڶ2 {G/%?M/ Y8ڟD$-A>ǤCkb3ާ2)@,bR/g8SF̋oTաƹƐ5Pi7r. /!:kcٹcc G;)E\S?h~A:483`ڨ  < RrGGTO70C_D(oPo4td^g"?Iӧl3 ZI(/` U"0k݃=y>e2cGY7URPuNTG?U0%pJT9dP2$ق9~ųi*cp"GSL *\Eb>V' dt'D$Ba/E,i0(YMqMCbE(Y 㴅AsvxTɜf_C("u)o򴐼N9|x 8~TkUc66 ]bLٖzL%Ci{G[r男!|F֧F~@uTnaFb:j|QT#(0BB@Ea 4>XulqtePQ QM Va,88ԽCp'` $"juP@P(/` vG!0md+o#!{uZ{= l[Zĥr@?=j@D9R CX)#|$+ 6A删.5͏kxN6}/)F$YŐ{4 ,lzR( (I%lYL1'o yNm?YKXFm}.'WiL~."M}@n)}ͶQ#rP K7Dd熑eaLNJ`I|t4;mͯ#۔% Y (8e_x ԭ ;LgPK 76Egg7m h ˜fԓ?D@ IHoZ [H(/` F]W# _^=b|No 2b(;e(PUH*ؒhX,aEXr$ق9u~8Q U}thW;xYP *-h`ĝ ,&ͶB>y( ((/` Q" mO%aZ彀(xwZo;E]44JJE Z v'mf,(/q(⁠fa2:[v[O)$BD.h04ڢS"]ƪ{{a$jtޫ0S@ r;}rz'ɒ0N4K,J<Ja N/(];#ߵ̫ynȪ_vkmt-t˫7B[~D#[ N4h~ Q7h}R( N3f`xt0f֛LtT|Я 5) . D& 2>=PPw?9ZCyL%6s0Ulv̸#Фv 7m]do`,LvOb@~>1 F$(/` ֔A!@g)_h'}ik3E3;8;8,aiuh,5Gp)}+ـج ]kCeq-?5;H{(`OTe';-KA ”cqrPdgCaH32?';׻d8A,⼥I==yICH{0Jk-^kAcAl鍖V?~=56,U^n_*o  $ ! -dKZ qRjD&gnB  Z(/`D 5F(u$0jMo}*, okibQyhLބnYH {bQg-H<b= yZ67Wb&3β4\9 ztz%Us^;i:9ݭzUs^n\IW ZgSi(PhTOf\:hB=%'CX8>HYwi3i4¡%`J}x}=ʌ*^ԧ~_=b$/?v ˥,^MaBZF[R(/`E @!@i44&M:ݎe]L%<pd2cC 888O|qcH"_98.TxS&\@^to#+M]s dBzZ 5P8ۊY}~=bcKCZHCz3Z-Ym'G:DA:},2ldS`{x3DFEfGCZX3N6!mC~-ͦtmG_vH3߉{Lole g+B*aߺyJ\}S|ph06Dʮ -悧^Q̵.^ $0 D' 0ꮵ0F=IqYhDd,ȷL>3΃<گ&m՗m U[[9MMuN)¨|vCϋ]SFD[>eәH3Iv/;vKBSv_&̢>+R ](]qMvۆzjPcO6 )NyGqd+M> Bb($(BUI+}cA/I&dS,1 s$Eq0kvi,# %f[<`#\t mց c xn@`,9y<?3y7E`IvZ m'Ň"apk WϮ֡L9rxt B~NiS(q9fI&r>fͥ-d>&i--݅>:ao#]1QDt#Mײ z $A1e'Xf^B-@ ]@_By汋M  (/`fQ#0m{|u::}{k {JGE, 1Br,nY< F02>Vxm)62GE8V`T$rk4}O_uQ[0ʂY߭u|-q,U& [%O!Х7#<8C~j=D [0$Z?If_myj7ekjҞ==k)Q mzgm+K:sx.ю4}LޓQsCD#D+`y&3$3^p|,f磋/mRb4 ׮6 Bb(  F .(51,5!Y] Ð%>\8<4!kܲq#[ش؂P!rËN7@!A=-:KBǂ:ی'@ZK-lp=fAk (/` < 0If$=tbW+פ\cR345U}|:&ⅇu෨ G@G r VNwbq8Eh%C&q b쑏l$P”R<b(@RP͚ =ׯf=R6uC,|83ys-""436S*$Nf.14sI sq% \R7] @UlFppW}l+:*ǿ (X !db "ԧ &b\ 7H$T4Pa/EX{ (/`_ U# mGՒdl VD$#d( NLH_%kaZxBki,Z,E<%ŘזJS"#4vTue4z'9W}/wp Wr2؅ԛQGadQ < ؓ~plb=C֖M<'ڳX]Wz"[K@$ pE9CؖYc0hWpR)LoIBڭkS6 aYM"ELC'-x$>Pzxg#f.6APK2q̷-o@Pɨj9EJm`OmVho@Q[0Nsx2 $u;e4 3(/` =! i! !_5 –| H8`R`&444ҥ:"ig^ F=>-=(Pj܍GYx073BM#{@r&MDؕk BN:D-dqj WϮ ,W*()CI'aQk?|Tb͠ 1Vk FгVZ'w?xK7YI|ַ: ,(2$0!J Fbۼ@7H(T5H's{zUٱ+']Ǯ?qH^qs(ps^6cJ>)nAŧ7%%Ǟ R$w#v#5Ml 6Aۍ::&^eS/22ly6곮d7 c]|E \$ƐA"roY-x@">Pz1NE 4ABJxn8RM-7 ,dpv@66[gc7o Q@X0N̙dH@v%6 e02,h $(/`} R< Pg41u-Ev̵=EMH 6Q*73cR&343-U35' +7 2ztEUۄܿmDQʉrVQt|&j!!Yv*gme@d)>A9':Nǚ[;x511=k;Et-݅ 8-ɞs]C=#UL߰}qvꇒq) (AMSm.$*skX(0vY‚A(/`]֙O" m4G ;8f!=PDޱ9L-5bh^ƹk)@iHEEOyĭ ДC5$a0OPNenW+CKNȈvph4j#sLRQk,='@s{#".G9 }TgLaKFs%l$T|Nq$ Хl=dqss%dlruPQϘ~\`Eo W9i=ùޮ'Os8y,jH@~_uwu pCu?*ձCb:Nu #a+*7 !wC $޶\Hw>Xz=NE 5iPܲqP"u6ii/,`=Þ分m*KA=ݶY[?yaFjX8͙Ǔy>L&`[H(/` v> 0IfH a=DhB07l/#(0566~WU$1 #+BO8D+=or) Mj&ZFDb2AfO1)D;w8ɞY;cYcP^qҊh"RN3(/s$oK%:H)4Ò$/MEszWlSn/UUf+/gNKvR\=  8T #! ;'Tp {ҭ,0dj W(/` M6Q# mG%_h*PZ4\UC&PHGE0<m37(ŢY%VuA FK:%e]Xu3l׊_1v{ W] Y1v|dI'YƦ$di^-"Փqbox@kXaߵ2~sR*EOQۮyekN^Z^v&n/;DSj}=m Q;ȿ[M29$Ϙ5 Ջ |Mny`Lg,Z|4 ayS"0 LHS<&Vzx#b.6APJhlMm Klmhh4 n٘3 T iΜOnZb#Xp fAk (/` vS>!@g# f8[t}_鬬$ȹ Kn565~OU(P"+ƂV+ DNNwZM (9NaMi xDl`)%ȑr$.s=o/v#Y[O.8NI!!JR #?ٳ)9cytgΐ$7{1 ?-sždIٮ04U?"D<=k (8p(!b "ԧ &b\ 7H$T4Pa/EX{ (/`eP# mf/ժDZ4\UC&HFE hSփq(a0!\N o/Y]`pR VQ|1hSAznK06d}})DO%adi,YhASOBipC=FF1k'd(JϫvK#]zvS+]Kvwt͇үpDբOs$44qk&=_i;P0&t舼Ӝ'PgUI:,"1C.d[E6 00t]˜6 c%w]"}o] N,x$.M3#n.@BJn8Mm fl-G4tT o❳1M6f9q<$.lNjY` F$(/` FS= PgLSc=h,R[ Vb&444չ[W$S 㙢y:p{_h*㴫0Z-s6.{ص K;~ảdXT)&!OAtu2gec]1gV?`"iئa! L;@1^[[(A u!F_Xќ͕9r_x*K*m|y%)߷&( (,ZxMSm.$*skX(0vY‚A(/`=fZQ# m3 Khjc/OFl\T@ IID]y R׃-(`0>ڂ +}K F8l(y\Usir=l PƆE1Vs',M0 M,}; [HkYpi'bb/q*V1Ϛϛb9E#c]=TVl'_[]_k:QϤzt& dCyJ_9Ǐ45ND>>ސ*2ԋ}zIx-At4l CS3 !S"P ;m#;+b t$ڭuđfooZٖ4 gk}DEGIoxOmvdo@QZ0NsdHٽk 4I(/`n5֐6 Pg3xTZqd|kM'Xa-/,@ށaL>1`&kBįhǻ0 $FNS91%RuG:ZRV]$fK.1Tbw.>~TZ5,MU'\bie}./߭f}9|-*Vz5Ae~Ju `2V9 Sg5(/`=R"0m6%o~P瀖:etRJJH.%vŎB8 ~'mVHƪ-bi4~.c9o(!ڣhg) F5(uzȯZw B@BT}B\Kvw:p)6xjE_j0`h)s[镲}FO;H5 ~]<ٞvL4$_1Ab~VұSp֣_/0 dyS"!.MY8aW+T^\Hׇs3cjt9a2G+70#D:m@]"uA ޴۲Iq]6-y3PU:(/`7 K"0K{& -M'ڧBSTАCF@52c)à 7o/ ρQ`cj0heeWt>ȣ( :%D&q9Ogi紷8kˢ,4q (=E` A+*ʌqJCk]z/'rOn/۲l}g}JpuL<)\P`-j[e SKb:ҕ)k;LOGJe35%>e,>+Օc (0x9~> "/n[Wm3ƅa:Cf] &ŗ]'Xh"MBi W(/`uZ#h\?,& I=2 hAr}.QPP]0 4f\jڃPĬsnL`[\ktJK37!gzQ`+2EyB sПR9Pt'\ۧVYV`8.'?rJkZ[.U fq PjgR|2#1JsuϜؿp0>Uh?f'zĞ|TeH]d1{KFC&yN!  z{Sxʇa'E)b nYddҟӃ?{)`ݐn>Q4!"nR3 EaSDfq3\% 2<pOXS)Bq{H 뀅k7#ءD/-Ih x{f`lH~ƖLNq½mD.|˘QJ5@(/` V=@Gf( Lk U1ܹ545ˌ~O )̌ X>T󒀣Z3(ļ&%ٻq(eN"{f E\C|bP XZR0xk_:VFҀ}] \$ qZ{.yMI!ÛpKoG ݄ټ<#4(HÙ~ pw{JWЇJ_9Mi:$4`@)>O<G7[ 6wv FA<x Th'q9wI؈p~UL[cC\˩OV5E"A:6V4V[ Tj1,+(~XG4+wVL\jEْM;Wt-}ͺ5%&v cͳIWus1|bʹHl h%"`1Z][ʂ@3:Cc;ZA$p3@ȸs〔 T=aJ̹.X2M@RP&he5CΛ(D<CpZT.7/Fw : $?k˔L:w|2-c1PU9:(/` v? @i3CPtU RÅ;687jF>:Si$ єG|!3!ǣ sQQ}x.A'^W& sKa֋HA  TAj6\C!j3 gƌCyRI; ?Ha!O{\KœEYC+ ̅1&^@lz%`Y .@f0%"jrhQJC0`kp/{0=Jiy1pWD7\V-u!#$6bvl sNf8!Q,I'elp  (/`8PgYp6\ݾְZȨ010No$8 N)h}< #OPGohD1NiЈ؉G4K``1rtkv*DUDt'k`0gpc, [{b[L΀ 4k( e .aw^ wk^g[ugC4+5·Ү>X]/Egr_  0G|$. G ׀do@?ofI40k(/`'Mvo%mgsqtю]}DGP bcbٜ0YTsk6pP󊪡[*[3#FlBߺC'}O 7׭͛O :Qٵ{_i >ѻ5!O_^>U%x}kG3|h=~3yƏ |l8QޒH ki7ڞ1oy|M'S6r΄ Wpݓb+x_42Aֿ9GStQ9ikZHs tR\,s߉5ߘkjΑɆpus W/3DN|ķL`!!(1oyqrHRa^ibs/uUjCc ?Pآ2)NPwK 0,*aN 0B` \`B51~I8ż)AFLRئ&r.qT15(ՃMȂ"Xk%uQPI {Gk ¨D^C)opsn{be` N5u7n 'x!v86݀L>7o"A؛n x-lYGG/aj`#aO(/` S=@e&K[b+cG?>%٬ 464ѵ:d<;hxF֑O%  ?h!=wQΊy|4H_G8hy5j@@1:%X5$i* E(V+X糫U4V,\-TyqY|P!Ix\ء u=]1Jt>[\sCJ8R̗жn߰n>Cw"O#גkKO;݌  E%DEa骳f 6>FGP\_PpzkI.(/`]Z  e-"deQpJ$"@OQOj!N+n x*C|J!lH^ioOÙM t[jOQ)HBLc3и>i-R[ǐo+s|c4shm|b I]L*py|G,Z֗.\W ..Y~gt}usXj ?h?j`E דs}beMuk|:E(@TJ_ x N!&|< ,}[4qv#Y!V^E: ByEa.P0],[: @LzM`o ΚWxFIlz d3-*bocҾCv 2nbAƃن:g/h> ^̂ĩkk(/`k}%?^3-$.g*@"mw/OC-"*qn? RZ"pDqa8ph&-J!S/hGyOxC`y04Ȗ6f25X:l-$->ejq0.Qe( Uf%-{i[IB[kXcWW]򙸯~Vﱃ2qe)`[([V۳[H 4BI1 )(@:[+.E_H6i5r@V%tH[VC\-VrߤX9Jդ,bz?eq|ul\O(󫣨,0 In(Ns/2NRv~>ɕ0 *cBؖsF7*gL*w |9{^_l)cORPqddx+:_S#L0B-,#^[e :((](Blk&԰  in~/䓆5xm._< ̻J7GX9oMG˕Jٴzd Lkuv'(/`M vM!@iFfl&niK!ģժߟQf2 ؉DEDh1$c-$n9%8洌/?9/<6%3*"2/#zk{0!ioҜD%L ghGs-s~jQF.E0F5 `#ZSw4,P>:pXKmLJguٍxj`ֶ7慅yh7 A*09`1dAfRW" mb[o΄E˚O2΀-h%(/` >@)l!jAqDb@e(.676/c1u^>]WDeIẖ?i/mԼ'>4Ky1 1 4c)} Ca_Jb:ňFh1g_`\C&A[L6OBu߿F&D')9i\ 1qbC ywжRNJFG&oS"x?ǁfm-h 04d# 3WdC\mvZ3W}\ -122Z|y@(/`r] VQ" mOÈdQb*H4#Ύͤ'VhGIGQ-D2Vŋ5 Y,X>m'ވtNe:&Nʭy cg1U4ES0FY48RY0 #ZBT&q.^Z8"^KJAAoYݢ4&ϵtjgЗY?:4v$Ӏl/sr4hdFHR&QDH "0T_0֝ġTW1l)p"ErNmDu 49; B1h䎛aPB ̶+l7SYߋbZJn46{^8iV=}qo6XAF{#qJi9]˃,-1(pzmef3(VhH!@ZC86"4 MԱf[RٸZ\q3RݬOki7Nb>v:am `x8h$ 2n1ܞ#M0ݛ kVà@ԛ#g޲`ܞ~sR}9?TJ6ɷ1Nf$;~t2lݔ|/cNk4C8^V>J2Ʋ A(UD C ꠈaA39sGjX` Nǰ/X֠C2|;4a<8* Ȅ U yݍPn-)`O3BǞQvBJxB#hZa2(/`5f[T# mO%aWjU\iF9ٸ JLJYOD,&c8qFae0'[5eS}jUIC Q"c _NA RcB)ĪߚMa*0X$#>%K< A+6iP9pXI3N8^;c'.Em?f񰠌U?M2#"nUZՋ>Տa eWںAH? BQ?O`ihfH3f=1TI:,%1Cn$N>ڼ44qp C̩ ?- EN :HtDkOٶ{W$80;sk@wR9(ZocH'qgۧzZUka5 A9XHUt 20-i^4ȦKi~/o^6BXm:7 XT:qy:橹| \ խ_%||ܜRMX@ξ C8vꙊpo?:ѩOt&Od,"gyAnv"6gOyrcs+ 8vY͵i:t* Jy5n:eA(h1âX]o2PaA3&7W ;,a頳?~{`=4 (o?y[Ì״M<4x0Ue&HuɹB%QAJ ,1Kԗ91Bo&yW@>(/`=^^#0k5EjWN͈8 2Vx_vߧ,(&i:.FU }|it]K=[zQǎ l&50 e}8!$`X=MՐ574؉;?0q%0vh@\Hiu" F=Y!oa ʬ"0P !rEiiUb8]-d!O)diQ,O (>#mOַv8v yR?4Q4zV(PROϭ[Su185'vճXr1 @ָ[ONzΡ߉?!vsyɱ_ɵtޥ@g|kHX@p\SN%Z{lfkb :kUqȀ0E'Qy:џ1qAP]ώDaXQx kϭK|>9I_;7ӯv2ϝONM \ᗜl(PpҔgܜ#v>^L@Ca"XccE sL# E&C#QXXf8b ҴbP5XwRK73 Dp|]E`r >7"z3wvHitCo*=(hjr3%dN ̟txx[o ҡ(/F: %yBdD_W!TU(/`"v$qaKQMBAS+7?1+.'W<8}-uIH!a?udualN-Yq$9D521x8sb0mFd= R I<ٟ4(:TL_aj [ŵJ]]l{٩jwTz}r$UR(*4iM95g @heQ`h$[o od ?> 2Zkev`H47i"A#3 gsSj"K *>Aa1F\EJ-3Gp S3.h1k+@+&APӡDkXIg݄jGF-C1TJ)-L ^]k-eFUjboͣJgM1Y!;lᘞкYo}ip;7HKޤ赜]X;fƧ(/` =`G4cA0O̦ϖB>f~ڝFH6,465T 30*1OvP qj2)/4Xn¦$ѐ&;DGirĶJ ν^xgCNɌnǰ0fϚ~K 8t'xCE땱KPdv :13noz|e(/`M VK"0 ׂV,n`i8 ?Q Dў|5BCB<"L2bQh H5SR:VEQv{-H>ZWAӥ( U0@ !U(RT,LBéeb*>W{C )ާ^SyO\7V1NuQg+(0\w[$") Z)`X.oC)z2:0&@gsktKd ~Op) "k7 BBV1hN^ `з#iփ0@Rn3By`aŮ^FaM ˏ"\W(/`uVV"0MШڦ= Ώݱ[vTCLOLCƍҚRkgdܘX1,ĸiM`Qs+vM=Mt_e[=/@睂.^i}J(HK(JU1vt'I#HDa(U"-qDA?\BL+6i09q~UR|Я1~tL1݇2&|]^>V}À,(kin`I2>N*=xEjP3O;Pg/ v-Q9D)$ӤQ 8?c~ƍ_Y ʉ1?d[8 $a5 20pq w!H'f c&4'`Fra!eh Pb30s6p!v.#_u)u6`5-;ܷC[3yͥpHvr#AvU1vaGD((U ,r\`Cs"1+6iPqF[>95&U&6nU*PS^vzH(tP¨gNiGs"I~D3^0g)(';ks0@{\mf|mi Lps=V)|,f'vVtZ9a uR5K703XVqͲ!$UrgT5w4XH@ U@{BpKK IqkB-=SrmIk>rtY7|mrFwv2:-$UTu(.ag?<sn+_f:@%!8u~ %wtc6ilT-ƄeuN,_d|0[r|;Fs'4`.A`2ՙE1KgKYz-( ̥E(B:pIT s$P%N.< 5e 8yan$I!>F =+}Br\s9=dv& ,Ș srn@? n"Є$(>/1Aۅ$,tr]7X)(/` met%mϙB5 s]xg 0,%BTUQMgghV$|(G}(^,m+CHֽY8:Q< }cTws0*uy qx}ouq 9!ՠ ټhW-U%L{~:BOCaK[H߷O)bAҶW7ag+sI&82%L̫0!>C0!.piPRa>_ou!Y,KwPJ}(/]|Qʚ@"}Y qO/E"`!aPEٕGPzc6sߙk$Ϝ/2wRZbڦsފG0V9@4 :NCH0PBhXp<4+1hX0w4e#{JSzjC' m-n!-cL Z@BP"ɦLKIIdP,ǶQۮ"Q=4h.Lݵ$ 2N$"A :O1ofOQU+'45{vAay)Z 32'srF3pВZ$@@Be $zTuWᥪI*AB)a'ٰ`8gݴB`I@5FN->0Ϧ dB"c*BWՑ Ag\|>(/` FS<PeAX7U}$eH343o֌*^ XC`(^<+:#e_Muz7!^~_7- ,VLYN#| e, 帎Zǭ !ġS+C-40,^c+#p0 ؟G[8kIa4!q9!͝|-e%PixChNvȕF9:=zdž#R::Y|s̭8 @% ܂jմfB ,4 ##[\/X(,XyW(/`] 0 eiK[Wb˪].TUMSWSoi'lD\~,I<L{']Ya7"Y,5kd~DQQsu%`M:'S5$Aj㟲vrsş`\8(ҤZԔt~IF; gMhFD W[ry^G gKMo 4O| ,p楉65g*pi3^ u~$ջ&TWy3Gv,`~i_ ◤L_3)`C3#*Sy-ȷ8k Ҕ4-Ҏ(syk/R3>$>ڜ,IUsFbys& 3 B$3xE`rfP p)AF0ʶ p/(Un2]=) -o*`(4 66o@&Kduofzwo3HdpG4PjWhC$(/`v9!@hCX@^;w1œ҆NV:i:.00/5o3\!L+4>7;j>6v]_!SPpZJI\>9bg. !-iR Uk#VL1ϔ#$.%7߷e&h9[`?`bi݄W$Md-;MO } XN♟;j@7ahXF ܾ2 -ּ`$f!#`&kׅ(/`3-W#@k^tI+m`߱ft#MOLصEsD.%v  nGD8Z$c,v0ʲ8Fq_SbÌS;9@?] /^){4!'M$ PTօSU15F2i-lICy(ɝ%Dٌ{7iM/l(8;z#,/v}xriO#S?Cw+j0 JZ:k!Zї1 $ N~ƖA1ju!B+~ %F/=Xfh X Jfō13 eU!R("FgۆŞhElK"y%=9G:#T3$M(,3$=/36!yvb=$A._I|}ɲ6_ߏ[)[DoZ0-i 6ND;SG{UE5kYDu>KL ÁHfɍ{=z^ZQҏ7 8D[~ ^.k  p$=~Xv ,t,pX{C(/` YO"0kQ}lEQ>hXUD䛓 $WPPEGDK qYmXHYP%a7.cc9o(&njS;9@?]/HฝEI@k]H=mPc*֘cӣ([aMZ !*]P8Y҄GЧ~[WK,s-OWLJĄөJ Zї5(JCtG?9iNH ̍_ͻcq8;zK鋙Eps^mX82F CŌH-BP}Mp liG-%n;t QßAvRzʀV-RV&=*oKزXKnݵt;Οn TGvXˉ|͵g|z Mn *^zSgzMpp,hNZ̼7#sEL0A797^R 쩞`vIzpwچԌˮ$qz] cFH#OI!4\G iq+0`E5Ҳs @l~}%)4#׉kElrVv#<55#%/ ڏ)%Om,rO^V]=NpzQ~pط _' 1$h(Rri], E"ve˂/"x(/`f["0kflX41w{gу.SSO{IYE1J%\PQuVG@;X@V M LNG`<29"3NO\sTWXxf/q[0H`5;$ aDO͂#5UQKÒ%1%4DӒ{gU8XJ.Fk$I4z|Mɋ4 kSUZߐ{P}[$P=MB'y|ZE*?#g>jrf#B4Zv,aVLi x׉kvE֙F B42 K@+V[!b.-u 9Z7ސd.?֚zi0jr`$6h}O_ Z=Ni+ؾ0 er\Im5Ӷ$7,vy6Ybmfaً5o-<¿g2eE5t{Ẍ́-` @(/`o6@ ecE91?)q{ZH7}ٸ(Ӟ  )=_>*̊L  wPlo(/`[$_"嘖,t B*,\Q,+ yPQN>sFqJeu~`~GL:/ l\q:%̭]tۆ%EI:9W+2"NɆI) /\Kz>qV(4úz+\,ڢ(򢮁 yG_jg{0Ҥ%+\{dN_:2cTGW.N!OYÐ,Im墼"UeruZ.685i ,@ Pј0@ "k?/ T}SM:넁~0%kER7 e*0;CBsźiĂg0$RD443PTx3p CuEM/ xJsS08 F=m!}l+AgԀ@ZdmC N!>Z aQ*V0ܟZ-7MɟLxŦgcC Gst ~{M݄ i2+Zr*5ձֻ^6<ƕ(duŕ0 ]C!XL0_pfE 2tRw{+@蠑 l7}@~pP(/`XFV f/ßjqIBB@.pKOJ^FxS*3CIa1q%:iю91fnQo o!h3Aq\=tz;Y !aqi Ga: r(E|hgX3w$'cfm$Cڑ~[/3fNUŻ$j1zX=Y>۪ł[ROxs/T  /\Z#ORu˲+|hn(LS oϥdbțv];Ud^0hSNY㖬 "3 EFr"`tÈiN1Rf+0Y5i6p'v[6 )6z2fP_vƖLN YUmY4îti/VroBAeU_sm_I֝ 멓0$ K'TR:Pn954C#h,a9A8AWR˾ϥr;J( o+ST5}uqQDYUqbK-{;x0]KxN%'+s.tD^Ǘ;[\1l*p>BEϞRr#xi ^ւ0!d 5,,`m[a7](/`u F[R!0kAaw]!:w|I;(WAA rIJGQj[}&F Xg{ށZmfYQiUf,D\s#:=)[j ( @zt"̊_'$bO5Xp0/=ZEQ8ADA(H(_'j67(JQ I0:M"AS_-7zbD휚 ,bO9yOU%>j'pUGAJM83#R?/=A ]M֙ܤaV]AUCSph7Ju:6^) 0Bc!AZ3Υ,7rafsbn6 EplMO_pقc r4S0Rʌ-Ѯtfs2V^g+qWgj4>JqF7dx(^bpZK'SQmdy:$\;^0(X35ch!e|V Q&ÑBk1ա 6,gkbϖ/XMN QP.ELVTZ0=i `lP(/`2d" 4>;w2Ȍ,o@p98 Y]X /)Z%F,R|ђZ3 RNIQ!/kG{̎j(f|JH$1{,"OXf~~J׼G"Bgo%"*)Z`w`X>$\?bOom]\6_f8I8hRrLRN_Zj+HD[ 誥˨t\Ϟ`WCu)V#f|Ta<~pPW *(|.6}eo {gay>('Dkd q6/m)6pаxܪw%!9#N7?ͬR 0B,m g7E)PvMY\0PX,f@4aWMVt:@cut2{LfFpט”Clp3VU(H?9fc, Q98Ӏ:r?;$Ii"nf|f3zGyGp ;LfB&!eijF0|9k? (/` <PeAX-U}`F)PD243 YOCAs̄؋g%DB+աM0^ Qo 2q-7$ sU: }%  ڇҲa(H ##h[\/X(hZY@(/`\W!@i4ÁcBbedA =AriDMOL )j)iz2RDaMGyĽ%N9EjAQڒ4rܮo|:Nܜ%hh3|'\Z;# OoC09LN DA<HCaU2㱴,g/je~Τ9 <U:(o/qp՜YOrF}R;dq;EM(c+StNpt'vP*#ܑxjXR ,hBzZ&F81Y%#‰:#ذe= H^W`=f: B+3xx¡#ȇS- j(CN@$B [ɋ3kpb%YPڷ[=QgÝCi miԤх l1~>EP%Lǻj׼edvŐ02RݢtYiL? JvzH2(ԙ>s+hp$B LvJ;/+>)FZ]q?P%tN4ѯJ[ LW ~*) F(3NplOpC>7@#x 6и. ٖtI z@3 vlF8kh`$(/`; O @i "L[;O72 ׵n}\GKBY̱P+e%/x%+1I|[}< C`hrɵ!-fZ֕pZ]v@U)l~me I>_ mrUKc;ٱΨ:>$_YwV,ɷ_N3]rDV~_9۟ x=!ַ_8Uc! eRϝZ+/-Y>.] ((Td-ARA+u\ T68G>| LnP3x-oYK(/`m M" mp?Z`Z߬MtRABFC"U߲m}W5W0rpsԫZzD>AfZ~v={dN+Ah0xFdPnuK5?II2!BdA?<<)%Ʋ`آ,Xjzj*jBz]@Xԟr˸?J|GmԾzB1fg(ERRoj.{>#yPZI 9U0u+sraH86V|W}m]9y#5$8}k?9v g^LMSWڷ_~XECaR:V7tP>]eH?v ! rdV(eF祱7;ea-%l۱ \nl-<P13ldIÈxY/.(/` vT@!@g0#eP0eMڦ,r.Ò787^z[Z#8(ZJl Т]So &j8ߔeq59q[5h #IÁZ#>G?b05F̿2S:~x3^`߅,A}:Z\Hi8naQq0(65-bH݄Mߌ_O!6TY% _=نnU#$턝v1W(Ƹ@l9ʀkDD0٥ pBd*\`IW (/`I_$o4' E-E͇a0 \@UVRqaaƌ\85\1qkYEV?@\8)Y^gnOS])bCAWH5)6'~hzb  /QФqSE.7>iOBrl]N:PkXJ*=c(,[땍3< %Ӳw(/}4ɜ!"n5څ:hNSEiY_,c%_yOPW* ^(;-xtv)V -[TP{jH{\55̱Y p98 {X#d9^38 Ø .f22¿=G(shݐ^أdp = @B,7e7 -a D ΄]ȩ0 ;QX=Q ºQ9@ȓ~2/b'Qw¼r31 ݎ6`!R̜-4'70#}^. (/` &<PI{.HCI$Iu͓ҘI353Yگ0$9==MVvz DoCvz#ֺN>d$Y0Q҄SC&F i"ؑ5).a,@*z, K7|Я͍(3 t?T#{Xy>RA?xjE`OYM5ciM&``'/Vyy o15E#1ea(.I1ؓ?+P;(= B$,Fm .Bo*h9+8BKU0ҲЏ0YNL /AF+Q/kp\q6f2p@4 2:Av\ζY-:= L4(/` = P_ bS&IgLIB#lcfݬ554~f@q$ؔ bN{/Xd؂v Ugµ?yB1CR h01K°VX=6R  jtQ(-m;Z[v}7m])rUaՀi؏9 H^#3]Zn4aJFx9y'+NI}ÃۧL=fd ;'؃ +n7@Ƶ@E`ms]Zk8(/`K L" m״ DnUdZ`:`)J&DBATODx2N X,,ZƇ/k4tʾ!Oa>XC1I7FzȟR=у^mMc_K,*e)~rM 9bƉ`xqu$J? ;RkiT8 FY[&H} \kҞeG੓ZWҮC( fk 0M8~RHV̀FO>K6`7 eVuD'* e94NrL'Uuzr6/;b&4r2y7) pq6fY}${&@"I{I0I-64q(/` B# 亢g9:+M- L898ħKsc~HƠiZZ5(eibWz}&DA#W/QaA6Ozdi*%AݥD=n6 T:Il εB/RqhW?1zdi;4E6sy16iz/qH%Gj I[R_+5[OWCs\'Fdz݊g~<Nt(zp9цYGZ2^Y|"Jڑ бf` (/` =0&oI?FŠB$^R T!N$#7,D, , u)`PG bN  q<kR!kfq)dY455hcy0 j:%ܺ~Igj_&{c*B=?'=AI @iڃ`q4;zo zOV=o|O</7)q;.{و[YzOEUP"1 +Ru990.*UO5`@UecՓ"ʚ-&I~qt8q+]PH[)"5(k tQWg|fPzB?t@k 5bmimkӔ Vvyd?/?ASLR{ wf(ME+?ڨtlDBiKI4bmQt ;/|cO:qH)q cGj!c ) 0 B@8r|ke!JF;pu; o(pXNH6LԲ`^Le$XM98EA$h˩`ؚ 101lW&Ē,9JƮgxi2 ;@ǝꚃ!TP=&!9^kN! X׮[LL~õ T9$zxb~ ]G[3W m@ewȺp Nrk9ƝRff,c3Lַ;.]jm|(/` I"0ke\!kݚ91BϟDACY(@@?bǃj b H7 Ksh h| x6.0#%U˾x \d^n0qJ;רD`TVMazizt"b"I~dA/$(zm #fW)(/`"=g&Hriq.F!XB($![^Z#qjM)lqCE=mέ[ܳE%qb Éth 9U!ﺲ5g"Pg58w>(gp2 @i!=aqu'^ķ( uZ?[{')\lF,8#ȆHn@c=[huTQAc Yw8_=Q)7fjuqN\uB&5h ʄj ⤧W<ޱhL6z:gr $HkJ4N,fC ')ez[~o:^rbJ8QhaEU8 @œģ5W \wKo`^S^Ǹx̆au߯%`JGH٥{"ʩR@[}pN3 0HaͰhRϫe&0'YDXd:a1Դ=EI["zB@(/`^$o4RdF hNYG*Hd""@SUTn`hJZE`sEՎh{c0"dm,v2zSw JEgL& yoɱOɵt#*,)K3H(p\_LZN%S~EJ| dl[a7@(Tʖ^@,MgJ}ilJuuQB)?Oa$KNjں\\tWkUCALᏜd@pAt;땓Z@X:!|j+5@[tP8Ʀ_jǦ)#j%uPgh ]_,>tѥ3 BxE s.:`A|(#,+j$y$V'ATb30y,evK+5X"-'n[h'{eZ98qMZR+끴4$@(/` C Pg*rV-FnOXa R>R3 =::;m9rGII[?q4'zՏ=++{BR/,D=?l Ϛh]Sps2,R\NEޱ`hTZGzX֬ kGTn#x>T٣D֞1 2I sݠ g T̄'%J#E0|8>; )a9gRRY}x4aDl0ƬC`C . Y,i-Jp)((/`! FV$0k|$\Dز`80MKhMLN5EqXzedX(n"a /gqA]k+uOaxT!N%6hTTXyO>V *yI< NxYQz Ix}I/y\ߠG;Y90$RG';XŪ^IFP#$VxI "zM!_xnj|J!저=Tr&$QlE1V3ѺuUGL>]jk:֓oWCeAl4zo5.7k:gA& B㸂[@&0F1ŧTXekqC# h@ܠ]ݶlVrmeOeBFR,sZB]*.(/`U &VE"@w=,M/ng;<;}Ʋɫ+X3Gy1$8xUuGMTS-]ĨIa+z= QZU')0#3=]Q[醌 ss!-ͩS+KP6E]5qya(4܋34zcvxs/0?-iӜQEhL|(>q|KV4Z! %k2Jy @֌=}   ,_k 5k̦xXRa ZBɒv_rY: C(/`X$ m4(w\-;  5Uaٌ@ PLOOL5%qA)׹8)&np,朆s8Ni~rVTM&nYzSo-~{#d/Z9No%\{<5p*Q"#F5ǂqkp0-´(]+k"WmfS/ɾ { _qIځ!1ǜ!mV ^ }&%QX~2Eqs9$:(3_ q*As9Tq0c1WW&|#!^c&k( V1WSkqi8h 0x;_ bJQBZ pf(/`9c#Oe*[8 ^ ֍"MA(YYY*џDd9wJ93n9Rck8ټGS,Ve/F^A:1k9=n-/Af$ "tx _|M)yaLlNIQ5^wu?8!\tc Q7 MGN6(8MiN 5EGbPcu?NjVWD;U`+9RځPYX=5=K%t1śiU+55 BB'$H\ !L@,Qt,$PHmH6IR4YR#)2$'e0[H:`1d|Sf3 dAܠԮn[Vx#\B )˶_:|'x+- P\8:(/`m ֕D"0glԍ }G[`]N$ \#V<;;5/g5R}LR1pn`~d'RKsb fD变P $*3 bIͻ%kCo=3dq9bMYn~| ܡAkϘ7G3ŗ~[> ߃S}0tCkҧ$V.q(o")DI1_7NU^ahJNUklv[yM߾=8uoE *V1WVkihh 0x;_h4^,+)?T5(/`m08jM*0K:mm>ogFA(F: IT-U.U;BuϦT44ʼFZ;N*lDL) \yJV*Z 髮@բ ʒ0JW-H3wi)k}.]Uu3X1FГTD,YV? (-B,*HSYvDdcgUץ De,蛹,Ҷ3 88~MS?OgMHLx. -2^bbcm?U=N} ӊnnhze:ג)t4'^ aPfQ:hHPU[A P΃^ p=I{H":_^OM0.2zVIu34Y HOfY2PH?F7PŬ @{7`)luM5P5-׹e, Cϝ]s-r+!ya!&`\sLEAc?1`tl'tAeuj$}j> ȧyK*( b;?-„ri جsᘿO, &G'm>EĪ0` \vZٳ꾺JH՝<@DVW{L Zb?.>V{9=jݳ1S(\(/`6 C!@gwZULRwٿs}IJfU@;::-~K"AT :HSB!ЇTIBSKKwѬMP% yQq|;Jɤ0" ̧L/%0űTV)Ti{ zӖ4T9ζ0h1m54♟K) 4EʒKˆ"y04y vl"-诸~j.XhȞQ֑^,DHr-((/` -D & e:׭MwΨT{Z;Tҽ}n i? 2&!p,;vŽv1_V&ܾXRhy2~;t̖:>KQbi&?WUjcJ9'nQj#K.1x=eǩK=lVmu[-M.ױ;WJnj9c Ul;F "jK-Ɂ>؂)Zj `g`$Zd.hj(9%X XP\D%(9 QոPT]&߅0F4~Sv,ab3wmtnf 7gh =oa~28&:F> R 2t(/`- D!PD̾y lxT,}3<9;53V0 rh`>ګ,飂|IRSOL8l5_, +2yh.`{E#]%Ho%pT(}4ng-TsDZIxO.o($ߗPzpZx_L 0>e!7 +t/u!FP WwBA ͌o5׃(/`=FT# Me;bӭ움*b>DqW 8 JLK])Wi5d)$eu8FY@_Kc$z(GkYDDDksЧZ-6ЄpǼKŢ$M_<]:+c SCO!ӧR;l[dH|GZ)ORFJBM6jӵ+/h.ej a ۼ}W-*!aMjAq\ݑhcsz3tKM- , -U Zbh>ͺ&>WHzIE˧j8gˡ:yG-:, B㳀aK'GO|a50rbSfl`IOĤ04m@Z~@mh4@d[-ܓGo`* P\\:(/`% TB"@gc(I_>>A [ItX\%7899Hփ_ыGΌ_8BqDRVTYF,SN7Z1:*G$$”C<8xP0jS . a} gk ϡ&XM`-d4;ʁZZ$EAܠ]mVru>m5Kp˶qDsq䶷jS *(/`] ֓>!Pe6IWJ=:d&"664SV8п1k$(o%c 6JRH穮݁èIY 5d3 cĵT)"K`xZ+Ě2TRcW4S`_:8)ʪzQHמ=AU(!72CmU"HbL=[ > P}F!!aMLZ,ɁzQkaX}*1)L"b"h@q4ε- )KBkU՘\v̑E 9^A&SIH}X/ 4sC|O~AſIez5J.?4=Q5'HsT_ᱹԯ oOl~}_H uh dR$)qbmF]5P̙1Xc s'8E BbިMuCU:(/`7 Pg. HIQ:`L;XĘ.0.Tj YNh+:>| <{ǖHkj..o\15ŖC;@ 5>ɠ$ ٘ȏ@FrBRS_ќ{a΢v {cn1W-1d1(_Z ̄71e'%trul? /;  \,g6 T+V.X2JjVvFP] (/`d= FE"@Dɢ7YLvz6fcYؐF==:]R`T{8FW줖Q-CU <#GREA, EbQc?C]9#2& (a4Sɯ4T'i$ɒXf\rf?Ej~H=0q!=JM)`u??\ @X0ɮuH, 7Xcβ.:T!'Wɔ#UM,T{$'`( JC~=?!h>.c 0BRF(Xť04/{Ά7;&`!:>R׸ v_oal7?ijV0 Y+I(/`8Pg43. ۩)Cx*p>PQbTb/:Qe 9q+.(?%{ZRz8Q⎬57~#Ro*c=uG><ӟ)i Ǧ,A F=c.g,۳6l'nu,T3Jޚ;T,(/`:= FYN"0MO-XѸx-t ذ98DGCA*+RceQK4c>ms<$1^( Fh`^ o5A{Jӯn30R8 aU}FUAdA&H:5NLh/CDkSl4s| UEm7E%!k)E=H7^BKUԍ [NPw1VCN3Nؽ_(H3^@`g'y&;ݺ/Yy;i:Q0* B$(SMI_XLk$*kNo@ bx` ;~i܅ S ׈naC[3p O ]խ$(/` ;@e YĿ#5M?_l?J[3/F3428CnzHR()tp-P ;=wQO֊Wx0GbP4f&Q1h#|+R 8ڑ8]?2cej> G-ӏ11$*9ͅ.Ybs2#zET5<6-3 ݌~:|_ 뼯h @ʒUpnAjZ3t-q,b fTkb@-U(/`%6ZP"@K @٦Vo+O=ePc՜ cGIEԃu. &a.T.^4 6+E"NY=da S(|Jh$ny^|OuFnT2(S! _PN~[zWh BP QUǣFq c`;_Z.R_#xϥn3wUS:8ԭR7FS'[7ت~MࠣR&Nwk*~U;-R ,`C@3XaX`8ݍބQ6$02 BÜS=,BC ph7F&E@V ޜ>dO>B8x l@Fi .o+ѻmsݯna0f ٞd`$H(/` XL#@wfyl14T1Ī ƀCDD C)FbI?4vZ KN''}xmoC-C#A&)Oh7mź{{kXآ)+Ts-Z{4!9&@('EcBWJŬĢ19+'g/\ v0^ JsI9~~F,? YYKB9S| I.禂ㅗ\߿.ۿ#ic->-'{ky^~o# ,ޣ~-x9 XSq -bD2J P: x(/`X' :O,0J#-mG]hRO:b10ȇѣ.?K~ "l2;+u?b%Bv,zTQjQwEF3GOB u.dIiMO44A 1Mд0QVIjHĘ&i!-Q&Lx|juӁ\Y3RaZX88 +:qXp J9CL!9&f5yC Qfͥ e2(=@b}A=cf&EjV;Lt_,, PPX{ϿΞPo6N o_jv&_+ \\B0IT*IK/͆T.1r\o5@2t'ؓW( jo6ܺv9@q8H }m6kDзYoJ$=[rsnN곢VAX=[ovыoG#JQ hͿJDE iwOq.]_n1cߟ[|%jOJW|]yuPTn |%)rMw"tfzbT b=oYiM5{sl͇: ( PT V+ MT, [ "cO/}ui]7;VʭZ|R"CTViMh^6JE(QgW%W{,sEBrb '}Lgq߷c- C@Q+ZJPGmv5eSDTx,Ոm_@P&8X:xj]ZO HdW2[7|*tAsLшA BvJ+@ ` @Bc%SgfF`9ZLG4ʘ|6 7^n h:dwmfҾ{1~g<6 e{ yY?[/ȅ44:+d:H.ĝ5TT_V85P7ېz ]@'=$&z8"}459crBq΂rY?-G=V /ťZxjvL(L@ICXuZW*;Tz~fuΥާt]N[ Sd7h&ɶ[sِkWIrELN 1sO(UE0\=t7_AHI$.vEQ ,UYr8(d[Ybgͣ1 $xHPajr cR%p#Jc2 T^y:e+`ؘ!E,,j˧-+u~!x뼨r)=ngWⵠ-}Sry_agȠ#.< nRx32a*殐$iմ[O|YX.(듸> zs {>"|oOx<a0WBparM! 7o.6d8^2?$ߍmpo6W%PsI$cPNp1bS_}5xdYY8a%ϟW,m#,:#|<0OH"p[#/0=hhD30دy^y*X9v8@v4#PMj3B@Bvȸʢ7#;ݘLOh0a_o~v>KGt77qe㔓@ӷс$Mq֊ ޚo Q9녧}+GgO\~yבzw[3;>#@xn\!⒯ゅ1(i -=Y(/`,)'`lgl?z(018tvoy43vvH<;.]\BcjF7L [;=H2yys{@$=@$^εc=nV̻lݪ71RdM :soXL[,F뮶nXDnx!fvM7 Ô7X7#EWxzl]q.c/N󀖇uZ-E97u#-I%ʪ&̀@yq%IrOm*Elw 6Pc`߳nAu[5OۯY^{j*\e~_uρ"'Y݃&NIα;[ӳSbıq1~:5凖[g/v&S t>@ ŬV/o)`nǠLP@Qjf("PT V *UPkaiU19O(J 0B7 L% \<&/̪@pWN{1B$6~DG*qs8.\ƈ@?01بpyw^`5k$( t] 2`!I+qRvu26BZq|g,ȹ`EF9K-А-U:(/` C Pi3@!cKQ8@a # rdT 9<:TS&z :`tW`<R 3,]"qژxLnO;ș!Vu@ ]H>.^@GzdL17TQmeh Di fkUC6~×ܲe8ZHto`.{ꂦJ[Jv9 [G=9- qP.EsI'/W8ms:3wx}$7f"/0c'!3; Bb(C ܟ@r!ɡUC@H_"PF> p )m} ! Vwr¼3'60-eIb2f"2N-FӢ pAi{ $L~-䙘Pg ,upRo Ab(/` @ `GP/ %Pr#3XYlD'0698I{WM#xO I,+7C\v ͒/k´ AúYQvI%ĀKT3C\M,&Ѿ9ݓ0Hk q̱b]-Xi>OQРIp(Iì4q>)x19?sfO1<<#bav%'":ѹ/ ˦\h9)ߗ; F0 [72*h&S #x%Z gA ` q> zĀn Y- (/`b= VF!0k5*+R\[qzPr<===%#5$/+eb?Jxǣl|6 3q5sì>vCbG|F O1!0"9T&4ԒAZVJ[L5I!!IZ?vW.fmy_nc+8H0`Ҏr*/ wTŷ-ZL =PRd g2[` )$" uu;ݶX61UcHfk˧-VcjF030D-c(/` A!PGc&|$$X ]bFrǂwyf (/`nFX"0M+~/!E_Rˮmw5̏1k`cPPN^!ms8ŋ0Z0 ?\ݕѣN%Fģ-b  ԧR졢+nșO9prrHӻ.>K&&$' (´֘%, DӘX'a,y%pqSfsk\0KS;G[GSնS#\[vmg}KS^3Qv  }en)˺ SUHz N[őm*~IIXiL4W(3\tQn!SҔ?@c. dU\TF\#!L9 ^գ #Tis5jcsn6]p Qo@&LD~tb:ŸW0ș2|_i䞔 Z(/`~: Pg05QIpG4c#?Īz011<s{C}iT»dؿP73QSP'^䯺jK;-n9*Fz BZLj3Xj  k{Gy;G阼ؚ5\Ż6@!q=cf\Nm0yo֏^Jd/jP(qMƨZ堚ƭ/MJa\T|jdV9I%I:`.iE/cͿr5dqi iε>]Oj hjǭ?7>CAGXw(n!SE90` -*1r!Ada YUζ8B@g eEeߝ|Җ11~ ZI(/`FR; Pg43ٗbZUt-bVSr33&e2115g qqb­txSieυV2{G\4b5j~/ e|gg}d߯20~畁V2 V8aA 2KȹL*aF&(/`o%v``"@MdNnF LB"l7n4E5.YXTB`ctN6@ H.+ m0'BQP k$ KGZM>"M8080̎HPjRS M%gޝ"$KA2TuBF[,,փ94z q@Cj:yL]z{6.Bݥl#^986 cRt|;!n)#Sn .2:홐ito:[F{&n  ~ODkt>>EG P< w/o3t)! D?/F~*._.ߓdyj vO? 0B c]@s!ICmH J-6p`Ղ\(/` N!0 F g^N4(hKDGDCf4@vž 6W;q8^ ;UQ_x i#^rWbi`qO>(ID&Jlt\`a\_Z6&JE tb 'D B`sĈB)DY`l3(;\֐Ccp3aj-  CA@E4+Lmm 8k09Ol`RKIb" V4jq\t mz&U>leX+@jY`3H(/`Z L$m-FSj77F4͡+Ҕ1A!1<@DAf܄;rtI{Ҍ;HRqrn|1+ Y 7,XҟPM}##>dR4̓3jh1 0b6Q'Q*IM:q`2K.Q 0&HD@=CUck=>gz-PR,sE xK:@EaZ^0zftp"'aMHBPH_|fy{hn 5. 9TK nxW[$6,mp=gޫgIT1^ Bn92[W%0F%t>=pED)N)u,4좠("@͒  (/`V" mTNӧ_HY2 `}JwC" `LNJOuDZƍL99Jk) ¯|e*yO:JȷM]I3EWB zo̟R5t M[QSB!_KY(:֞XҖ+%N=#E]^}.L_Cd*fKskTV5D'숹w-sJSgl9Jf;!]bAv a™'m- B sϵDh20,t{9=}C7~Qڊ Y·b~-A"ҶHe0 0 B0[}Lm.$b!$P*"V0. JaX8XUe`.xFo&Llmtbc8d l&->T[GiiA0 I(/`W L$m7־2+x@ƈ9tEv.@AEB/j\q\tjY9bf_-^n-F4_KU1A"9̶Nh燄BSсY0PBbT#CQM%78{0Q^.k.*h!.p)ޫQ/m}WkA*,yZj]OgDK 1C2LT0.N-@onA"ZqeiǓRW7Y͞$Uj[wͶjZWk{ In Bn92[W%0F%t>=pE))u,4좠(a&(((/` YN" mTNӧ|MMКpADECL99j%\k9-lP-*yG:JǷEl`hЮΒGLѕF)Coc NDiY$%WB%XC4G0\b!P-EI,yzNx-j-ZSbT?zt_K[>M!~ Y2ǛyGK-(T)u g1 ?~}< |@*bZTEmkYbj-MZ|?#~TOngl# (EB, tvN̟60|Nl!nZ?.(mo@m׬'+2m(/`  D" KVLF>ŮF(1M_d (9=9g5!칬8C3jS)4 ٗ 7ǩ}W:^]XgLDhOI&>wNR" ͓̐"&&a ,GNDž (N]]<Ń48K{:-;olgjJllAi>pZ\XUWd,pޚTppI -껮94γ(Y|D q@uJVDğ1#duwC:e|eؿ C+f7&t>(Hj-k=N(c׶L;!k9`iYq"%L(/`m K"0kЁlXӷא$s_mQHs jCBB2j$Im4ԐKhmWG6  s<`3?z)ca}л[X5չ\c CV|G $i ~'>LJ(N-M 2hIB-#ef's?* N] H`睵,k8~p0P҅ ?v\ViVs!Z4Ame qJB;)>6CÏw-?$ ^H+bRsJ+YfrDd$N-VSŽsaG{oKMA9]= 4_ ]$(/` D!@IcBCPKye|Oވ:=9Ts]::`*ux`$ڦp8:5e UۅĞ ؖ kr9X Қ<)9`A5q&$,+q 4T[jf!@~Y!˵0Sr-tJ+DjdwPM,nG#JJ%HI|0`Y??G~ |msҭNPKԣy. 8N ߣCS2"v`l^wVsbfA2KȹL*aH&(/`tE&_" m;̋syyN&+0WXTS, OXcYY<DRb̢p, 0 s8b 6򽃻#,4,L_BiWijqs Mq."H `ԛI51PhDEq0PI#Y$JK Q7'sӚ { K.>cK7)a0'H̩/s9rZ!THl)t3Ef(Ώ[9CX?pmI,4Xa 9W)X%Lk(/`R!0MhC6iϴ6&³L{{RKKG "RCFQKI)V26TxMhݣaagy:d1zoȗRoAW]K-mo7f}[X[*5fyi ",111pFeb(]KZJߵ!fά%3tD#[.{J;Y[ɲǝw}x?;vth(E3w(V#Zzm Vc'jJ/mی8W^ XVàXM5 Bc(; E`IQ0/EB\A֟LL<9-65=2"EIb2f"2N-F `# ",> Zj#X@ ӂn(/` ֗J"0K׈lʒ½ 2ڀ?¥p@C@433ss(HҾ/·GcA}Ż }0#fgW>5| Xɋ hzTf+J 1ꡌ>ma߃vm@B PJ,Ἃ$rFyX((/`U&]"0kAa/^w9UC[e/"*9UUQNRki\$\YmcE2RbF `(INX=m̈́E"V`hЮަCQӍRk;=f-5'k}jD@}]ڳ JKi 4靵,<OkG]A1+v@ԧ!z.)Gŧ(M}NqCF#ώ_w8ag^{B;Vzұ: 0Bb ڟ@q!dCm؄H[PFPK1[Cy HEIXdsUJ 'M'60Aa|Cxa {0?ۖxpOQl^ u` qЅK(/` WJ"0kHFӭ41և5h^k.S2 ?B@Mi;w4w4y75Qma߃vm@BPJ,ɼ$lFh94ʀt;(/`z [S"0M4o= wvb۳=E "~  Q*IJHQ^!q/ASNZJ` [O ܏F03~l8կmjc{&)˨[ߜ%gG0"ʐ[|\[c;Y<q @@KZaPC.Y@>'̸J\i0zOc$J* Ok:WNxs'Q?BGo :o~N!-a QNzNwʎĜ2O!0@2>'jª(>WrHܲZ 0Vf<;] (  hONDGP6Td2mYfkd`Sf $囊7H^N-6S!{oK jSd0,tq(/` 6WF @ImJK 3%t0~1<ع=@<bV"TJ1J@5'}x$mmؒa.iU:Ln0e-c-wmQ LYm,đKX8E~6J6~( {+7l3( +"Ta<|:儗?'Q;F̲+vﲃsj?շwƯ.L`S@C(z89Fk c7Y,ԛolހ (/` fH"0kf+Z]%^F j 3 (??@ ~pˬqbJbiA9-}˯3"KO[ήfV{G~B{%a}B邪ۖXTy05刦9iMF*A>Ň$N_lq Nlu7V`i:SܸS+?f4אHSRA+KLĜ\mW %i^iǜ҄|G'~UWs|n! B8e)/K` 0ɏ#A]m 2*Rg%I}ԒF"zb(/` fG!0IVhGA|%/3X]J RP?D=F$"D׷` E7EMڗ3-AcH|@OViJ}Bj-j- ,Ky@Mɳ<Pʃ4,OR0((ôr 4R; ʢo 0f-Y % % xeGs1}CDLl:北lj~C)Q0{@?/q@V'z_bN _ޢvV۾ZoDtV瘽(]89"#B5v1uԁ 40(/`Efd# oReqs\5X` &%$Z/(z[X9[Qb%XKO kQ;uʨ ͦ[  v ^OJrdE3i%Qh@%O 0갵a>+{[(4&kޒPO^8Qដj͹9\=4)7pX5srcl^%?SN5G#9hS=ؒ'T¨M#aQks׎—.v -1#Q1(HP@`8orcΔ4{dE>visׯli 8 ƺI  (@45OB֨x $= x8tW`Sv]!+4,K"Ou 0E<ѫ),øYɞQPaM4k.:5SYA  ;6lohIePVjηI ~42x*k*>(/` <PGec BZy`7@YdFff+433գ E6G0qpTl3ɟ 56" F=oBoM  P˴rŚ)%3\G-VhS ~DqD`8>ϔƒ D{ ssyA Mq6[E i&lRRgνyφ3Sg[OͶ0 >ʒUpCsi0`-q,bfUkb@,U(/`fX!0 e-k.iv\Pvv#_bdOQNccF*[@#hnִg1%40B'JsI Ҋ*[ޭ%9@?=2uN~^9Al]Ҫ𿵨8&ǑXHZv(ƅ,ǧ1mDۋkpT2i|AL`R#A]OY>>n(Kാk #xѥ~3wZ{X*__AS'|/ABNkK~hU;/Ot?y`/֌yf&xtOɴ&GOb[0`0GB+: B+3xÇNm݂7z"Q"R(GQykN~܄C;A<J@+(Q9x'n*` 6@*ݖP-ԅ9}$ F;I4!XV(/` fS= PGcHHm7-W'? 84d+A#d!453'ꈣiJ<;z͗.!V|CqUn0V8MX;M J"oK30@)2O]h}0C3H\B'L^)39SZT~GuF $꣨F)45E8 1,0 H䢆\$]P-^FkrTI:'G8ʣNWWpߡDJ_Ɓ  7pʑYEۗ!Z.x[BEHy=ŌlͯȣF.(/`K XL!@K#~j'2'S:BEC,dh@ˊbqK4 n_czGzghzz8h)݌Y+.@}r,[]QGł(HILx4(GoI:YKG ^fOmHBeqQѻaC*o.9EOj~3*J%լkjJ<Ӓ?5c HfPH>/W3 ʁp8=Ȩ OfKs4fnp"9}yl,sŅ.y(nRIn]S* e95Nq_':sN'lJ09@ҋmR"i-2 -IG H ~]x*kvk(/`k N"@iw: pet?12 ,Ѩ_".EFD K$%-iGKTcG[N}d9SyRg 5k#()탽BSφH%8 =^=:oϨiLҫ#F/DS֌O)'tōxaV_jFȁ@mf!Ki5ZQ9XSGR}&[BеA 6$htAZ1CKzј%l[~m~P,68 B3x%pA\G$ S'3^Jix2vrƩ`A@Rb30N ; fb<2K]"ۖmeJ7[4[h'{ʲP>g"e#:^>fip tk(/` fUB!PDЧdmJ668t5,If`9:: Kr3xD3Vg SOk#SS Yqڸ^ĦM +ڳˑS%N]D"khKr$kࠄ00XC05{Ҭr*!Fi,8c=͟A>7:`¤c˓:o.Oa ݧgCϖ#er%7:W~^:k.p8ex@5OsB?ΕTFQа Vx0k(/`][$ m40C)߸n5=f (:/TXp QSP z5%qaҘq-i0bf ,,Eh Ǡ Y>/z;褞*Hqs[  ڤ)KR@8.'}LZ9No!}Eq .M$deq?Fdl~gt~ܡ:#FD̒#8[8hL~^[,5NK=d~,T;ObL]?) b W5%i/0 ",ƠOձCaX8 B(3Vcou7@aPѡ$ Pq89)5xޗ2n*;šX /{76(uW-#80G${Ʋo!a`dXZ! HV(/`' L"@iw\P$QvW+7cA.Bf2O|24a&yjYh1"`eSµUe(/`Mm# m4Q$se(" qv J#99 ~yѤ$<MZQS7aFS&T#AΈ@!I.U36#R'Kc7Yؼ$?q7[ߊ&k6idlҭ񅒏.В!j30Qu$ sP}rP|9TF$=բso=6dӖPک#fTѤJ̙ 7-A#p?$'hLapvIR Tjh0GgєHP8h_/6BIݿ4QRiXZ.`=QSGtnWPbui)ַx /!gb=u7l 15tIV[J'k 0':5  $(dG\)KSb?RZi}.>ic7Lѯtb+j:́:9A t@tκJi 7)et2t8dE 0B5f;4#)n GQzKg>{pk<|S;'xH|'(@[Qj 5a܌PxT8Zb0cn ;&pR"46lI.-M3tPw&Wk"A[bO(/` S=@foWyM9ҮQᆵEHpE463I6 \[P生}Qjv͂.^Os:O^k@b QFc@ g1^G$Uc15J/ XCvsJkOy,2ǜþI5/HI_,La/݄RDu9^o+=_A?LuD!;ou EʒKˆ"x0tY \ ##[\/X(@8m$(/`f[ ebNWA"Pͨ0 QTS\'.T7U \}ic-#.gKB;5jŦ(Z_G}t;N?=Ō HC T MfC*f'_c6Muь@P8`DҞJumD6vppьNԼ- Ѫك 0> oUC*-ւZCEZ>YA잟 %Cld-}?bY7g"iݓlƤ(f:$?4@ 6M ւHe[>PAduqϺ#9i NB:Nm, Z6 B |E`rfx ^{0]cVb8h?%QC P2lIt{37pl`v`" -9lte5͂;C]\gpގrA'-ť(/`fR;!0it"P~~1/PHƒ#TZx231ٙ+wpNIh x YJǙ@+t|.4^ KU0`8mZ\P+1iȥ[-CaVK1kNxҗDa9"/њ3qdҢW<0Fd݅ymR&S{xD3FiZaAgOl)Aj9lGV-LhBEq,h(/`S5 fN"0M+~ VֳdV9-jl(8EGEߵ.^,O@` (BIlI#KxѵNI  꽓jktsޥ ~[>4$Q 0JG4 D9WGD5)iY˂==oYߟ0 s-E ں(i>eNK RvzH7mP)4&'=DqNn ;X./f^-NM^s;:+9icbHvߵ˥) FAFNs>A|6jzHw3+4VG86Ff|65]_ /¿(:⣄ȟ@ey!Jw #JyB^m= {ɻt5xTc5U?Ij'u'PcT[08MUn,QDr9${$"Fc : iRABcSαz) x=WZVZ(0X_  0BHx б gj `1#Ց]"XP(/`[Viy$o="n/Ms('ɂp*snp3ax0`SحV{(*piI=qxq 52щI=giFi1Tk^oP6Z> $x{QǞ9WQBFTQt=o\ق.,σHmY>톀er+<0c|ow<&QhH+I .Ok7^e5 ,&:$ʩulEQQrRzU\JUK0 i)Fy7N R{sn/Z}CشR'/uOQszQN*mQR̘AB`(+IACL2/fP,|OOscvIwHnYAN$"Ӝ,A20QY[e‹ЖCD*9YU l nkLsq'\ sj3.9B%G3-8OBAI (OVB[]5˔i(8w La2$ZF"Z7X#4Q H\mkl5TҌQ(5R7A8 z (/` G"@ wfj/4b*M4"=>=4[X^ wf{֙Vy!:oa. Vg[ [jyR@GLwD# aT  'JD2[Rnj^K=ɞ,ubNhףs#UU[*G-Vu3=ifIFa^O̅sZ_Ee1;u W2HH(.9}/d !6ץnk\,ݣhHAgIp 0Caόʬ'ゅ1ˈ@"h3z'(/`%fT" f?|1e2w7katEb.KKH REY5dXsa`uk2ghPYW:O2Q 2`]E1 8\b ,DmKZ,쐱_geYj,R'I8kIÐDOf/(ouF#kH$m֘=~f]{>Y[uN"YFrm ڋ.uzP1*t#ŃуZp$P_Ԡes;_;y- B[E!0TmkFX%8/Y V2Geˤe6@&L`d:b2U;.do@3@"?ӋaIZ l8Ab (/`% =!Pxl/M(YQZ ĘH463RS@Nڧ] ]$TD _z&˒]j]= b Py!/V##c5ZJ&CLj5!76#䁥-I[$ck9$>!!ωGsfpo<:0EBܗ?D>Wd+ʩn~ˤrH)^|~3~tOp 7XY cifA2M谹Bk(/`T$ `v22E I2k}JJHOih1q?%Xtn{1΂PIN\ZZ u@U5+jĺM7蜡ņ}\K DM8˥t!KX"gIB$ "?\3GiD;f&?4 ljd91:]YI72є g}~jt]Kc AcoN*;;:"e "@-&夊aj#!  Lg> VƏjA"RbވZ? iH\)|0Lu<)9V#V- ôZA!P$wk=FS DLàspf.Hҋ6vN{a˯Ɋ Tƪc  ]$(/`U S? @f1Ҽ9uSOZJ-%Q-t776/c-bS 4,*M#K*fIYs5?0eV"kdV3PjC!-a>4u%z .) 9KX|xb ДX,0t؅1Gs2V#iUTauAP٪s $B!۟YSW#$\ 픭i#Y(/`u6d% k]V G-p0& ɷ Q 8 YYWGQF֭9Ijj ibvփ1(s_=qqU-@PqN!B5~GzwTf8t0!^F$ՂrebOu{mcdbYM̉FbGZg9"j81#8ewJV>z|{͹v>g 9ic5IԖ߯ﰖ&i@a\} ~} PZ2LdE2%N&>Ml"Ƣ`Y 4$'bq-{v &0IPH-QANڅ?0'= B(1Cfҋ 2 1l\A Z1[>lvYe)D+x 4 ^;AHEWo7sӜsG{o3J T#9I]Pv(/`U A PGeDEh}9u0HQmr3886 Y ~Kfձ$ŃJbT NP#Yŋ0?~P6 @>94GTNȧẌ08Å=gtBx|b3:< `"*Kt'gs!SA$! SXk/>%IMűPl\ԓөнޏTz Q3չZY+hn2s, 0@'  ;ԠlB X?ܐ^zmIqЈ=cѬ# *P(/`[! f;``NX:M]$ .ZL:kyJkӭS~.Q܌^;V~MD:[[[Ox/Q ח6 <'t}QKP$ZnY8wS"JX\c8< >)$2c.ʤ AyOZSE8;kkR-Zu4 |Erk&4pF!}Ԯ bDg`N IqyL(9_Y[ tj017| 4 ;@(8E0eZю q ؒ"J>9#)5rI0v(/`JU&ce$0HI"uҖR  \Dka@b`Tx @&AIV a! ryȔ)_5E$FI$A{Y-s \DQrl0V8і.3 +K_+ %R|tqJ 2u-"%W/|îu/ze gkS\DFHǣ0 $@XFq4#j 6}iGɠKmQ!u+NF<ݭv|qG&F ']8^ZRz!b8҆{BG?(Τr"M_ ?ƭFNxk{1iTg9DdSdovam/*۽8@RJKH4gxv2n@|da0j@;^ʚIOJ0ПU^2+tJE Z^i g /$a"0"J_}itG5֮^R @΄ˢaeȎOm$a3pz< nrJ_ާv5iTw-IYsaTXF}AX^M hZ+9DZ4DF/kkx(@1@@D v+*<ٽ_ ;JӗJCʲ@;:.ԧwɟ}h v4 @ HBzS" -E\p pZvdQ= B"g`ՑwހNّ6H7@ X쎏=A{]{Lj C`e2|s'26xĵ(/`GM6e$VU.! 퓢x(.HyHa`U D@RBA08+PII:B-YĦ&miZ5YZՒ"Vds F:}([M6^淢K$k[zX=%K(K.SHӮN8[at>Kk:=Yzb]è7㕭O_ηr;n4#d$ko KTǮw2M30(0B`kF1ͬ: 6KpWQ* M.g$$5 ;f<6dPXi:K*b^k{Qj3 Y}zdRW(/`Z T#0M­i۳u EwH=S q IJG2^ , h; %1^ ǸiAv#?n˧Y?&JԈ,\$6eoIF`К/ ڮa~_˼;n>Em{#Ɏѵj/74%tYiD_P+M$=?{Q{MVFß.<ϵ8CD3FH`V Eх (No ,) `v3H{OJ X!;\,9IX,杘?9f 7`1ݳwv7Ѻ! cB4Ml4R]:egH$(/`=}&ڤD0Y\!SG;޷sHҶ<zpm MnR&x#PDBMWM˃Yx,0VIB_3ϭ= jP4L>镟 cXG1IWD:/֫U*Tak&Uxůf\X},ekc.g(qX`(wC؆3Yo_EOuF ^ѪL-{Q屛4_=p6?k ×uݏ*e iݒkқ8tUBPP2y>)~G!l쨔q2u/R9Wzq֗U]jYvU))n-@jYܪ`hF~5Nmy_1ӽ.[>ǁ9NTɰrUh/Z)v/~;#4X<)u}RjFk8LRzU}EƐPx֪_lqԾzvF=AlSI.b(0B`de)gR* $""`15$_")| 0HY$USaޔmOm9{ZmCEw\$kdr Ni3;q9gL0Vq*5Z VcwC?o6?kLÙK RT*TJ2& ӽZbcbv^QD#lsTr.,7^VZ'>^֥_M766vW[SDܜ̏t6zZKZV~S}6XVܝ;O7CI^ 6#o$3j);}˂AK~/v0([n'd )4m+a(0B`de)gR* $""`15$_")| 0HY$USaޔmOm9{ZmCEw\$kdr Ni3;q9gL0VqT}SU_oְ*Ɣ%I{mZ H\0a k/.0Xvߵ˥>yO ïBҩ|h?"CT#Պ-඲+UPnJOxU94=xa7AZ};+= Y,O\IR%!㲊hx'Ω7?V* 0`F6}CBoG"\s<`f1 F( :+YbmmkC2{-FLӭe~>14oAk% (/`t%:["w\ٓJu@rl_rRQOA 9&B#yТdgګ1)/`q"#LD H(W0fƗ6"2rtCCgM\ c+#2a2ζz6ob\'5v UF3ʤ 4M7:J7&ršA_uFq3x t`Y~j%|6la*o1`yWx:Ǖp$Roz:,^/,X~nٷWnYYڔ*ق1ru7E8R,BtlGwX{17Hq-l1nikmT);&lbbktM(/`5V$ m`/ObW-]dwb?|GLLIOq5d"C`2N_Ay*C٤6R]=]&bMvG^KI`un"IhO4 $ӧ(k䪿,T<(|M'&NT2Y,6f@Rkgl m^M;j7>=Fmf!]Kv]ÏӯJg U~Վ +]#AR;,,< q@(D ~ҿ5{3Vog+('(g;:3Y4Q7 0` dZI G.^&ߣ(8PP PQ#̡Av2I/3p2ؙ!.DQna#I-jz#N7EJ&tN27 Ojs"yiֵ:(/`t%l;\JT ĘI󥛍J}Wqm_mH#bE8R,BtlGwX{17q-l1nikmN)A:&l bbkPsW_(/`8e N" OděP';` gua$e@EDE6jbY c1 FsS6k=By %RQ"t/jet9vfb͠wQ6Y ^4{Сڨj~& L0+Yg8$d,񖗂J[^FYY=5A|w_IL!*S3߷x ]SSBx4+R3>e ? 0<,]IP^kqVlhVy,/~&'/+,C̏S-U ',u), `Ve&{JՈYS@^ db"+b̈́aI:`1O ?m`t$ٍl%w0opHޞo Sd+A2t׺),L@jv(/`m WF" KV-2i 'ɋi@thZ }H<;@;e-9QNoFkF ^؟-Ϯ1k6>u|.iqkZsü6 4Ι&g$M $D5uʝrSPeB}UwuhiZȱ_㣯ܯo (_<߼--ȳ,25o#9 O0${n.}at!axpw_nOՅ׺WVC:VBpa@CVR Fa^Vjs"_ (/` VE"@@$_EʯK歷 \넞M><<<WcفqyEcۂN.*؏pbg"}I3'hjn7 ->'KЈB<۞rhS&M+'}F"15PkNX@@c/A 6kԽ1)K$#T(O(#"'qxhᇉ"YBT,mNE.-4QQئUuyȲ_%ܯp(9a`;H,߼ vYj4_WF!*q.G"!W0ab6.q̬u) {ۈU;s{nW&4W+퓼Bpa@CVR Fa^V՚s0及0~M((/`M\%Y`|C<b^}]Q@PRNsk5XNÔ i%r8vȑ1L發 LxA_+<}Zìnz/Vߠs wJ|b=Y ^W@c`Gcn\ΞxL9`g`CElO564)͠5τ߇sUP<RMcG~(Dq'\wؼr0^IPi 9WXD1"pD"JDaemDJp4q2R Be^1+-{nYA7Ƿ5J]dϷ`OV&5ܘJ99}ywڤ,-G-(gQ3% cxe\ۺ]}NlE1DUGL}/Ik{ٯ#!hp|2R+y= C{h`$3!ꓜMR}fz@޹,-|nz Ū5Țu*u!FRS)5iWF:k8DUg1Wy-DOYh(ckg;82{xۈE:dv}zcUgIU]l7 cX2viߖD"Ĉya_z8Dbd<5D 0BjSO^CJQ3HB$TCCL0UTVx@Ex DUhHh ZQ1N]![[?Kt,;?QfS䛈o0ynQX67@dl[GegvW{2DZ I(/`l T$VFIHW. r(X( LQFb)cTh͢P=`+g!QrP&lm gi4DUf $"6:C"r0PK#K+X bfjXc5'PH8qcZxE#l5'R ބB.)u2y]絇y_[>rn2+}o:Fo&Z DC"9ߥ2ۍgwۦ'/қTV^NH˸/7.ݱ`pv79]v_8(DshJ0ARF7|?"Be1iJ/L4'{͈jgJO`c++(/`i!u%jʤd&W}0 h\! huxѭF>Q$5\) 8Q-\Lp4-Po@I@hq^. #**$4) Z^)qKw2WHt=qtgvyoQ Vn2l3W/R)#{ hy@ t7+灉U2Zn} ~_cA)?P4nxwCt/VXNJ4;ckŪ_v5}f.Vgiމz aɃ<(6WFJ]f!~ UR{u^1lZ6m:f}pa)7 _h2 EA2)`2I:\u9`WV~lQAvX R X sIq/%>'~L@aWDXwKkw'mM0r8ӝО=JlMT@bPѦ*5$λnf.uW/+z"ҭrkM7x^F wB2x&w"E"jl2ץbl$&bKODA!Zc)C"0ITW'9&Jki΅{v!TZ]MÅ+?ȉΥF֌n-e!QT2 6J <^y%Iy)!GE8p7}uboz#(LŐD/-]Z٬/ 'j%L!(i"Cp2RYXZOiD 'ztondҾ^9j8ױ{r9(]|[+:X{[c%YHVy˴R>8qsy8A6Ð,(eZ0:vx_/UkfY/mݗ;rFgً{vs\fǘjznd˓&|Krl#˥W?bݧ7ysa:f H(B`<PtDIH`>%,N`\h)rgnBVXy8I;涓,ZQt*)쇣eu`~6vN%+fS dz=ht=d+A9)XF1ȝrf+[Pa)WFE(/`h%[U$oXG음mA=em"5 `KJJpYPbb k1q Έ43{+MJDB?9;o&ixe̗s9zhOO)$Nx_ -N3㙻9:TRۈt{p*Yew9JKdFZc4 B4f\ ͣ93VJ{ۗ=Y̞s)'cG vl\`^m { vا-T?ɑ*m{m'Gƴ,mD`$Z bIt,@q0Y"W$XEz{``A^+ B(+V}SLA+hRjfఓ-s6m۶@6 2qg t0٘@K5H&da@x*a$IđQ(P4HҮ~3~O%R,(Id2a悢t ` О@C˥t۱<ԧrY*!%  @^y!ʑbƉ߼*oFk妋1 lIhX)۴Ȣ{l!S⦥K7].Ҵ _$MqA0$La<HA A@/%ontѾ֮qLH5{Q=cN@k:47}y N;rkLq&{a2>8qsy8`EAA(&uvZus45;vϛ~9rc>E=;s\fN1Ȗ%Mv[1̗K|͇u}Q3H(B<PtDIH`>,,|`\hk$ !] щ?HD$aluXTeۂr0P#"~8PVl/Ybv Lrt=t%O4Fs?] %c j9,3[&^AR5~:{J-+]|iz!.o5/5WE挑_1|ۊp {-Lh_>9-c{5 ZI(/`  f>@Gf$)FַKP2UaxJ"Pz]655/$*:#z& YJ8_o0"yɧ]8L5U?7L6@j!mk_'’nq7bMSWƚ:=Q6HlL=K N$Yϓ(@B˓O+CBǴOTJ ,"Zu!@gd>N"<%k5nU\E655^% ᠡc]~ʎJq$+Gm\6%_ElɅЬ )nZXX!d5!̱-& a1U/b{gӸ$e5V`-w8o+^k0Zdm9H=F RMEJ5FƆzɩAGq?lVqfe C%Do`Mb"{qas_Љ5Te(/` FP#0mk+YҸuQKk ?rSPR8FGG"Z p/fEiZ?1>{ǂ(PX+0Х?&^#^ɑO9fJ<NO#S$Y$-iLr%Q?OQQ֒-MDxxC8[YF?ȥȽ(mu%枷T εTbRR# Rvz :OՅr=] J ӟ( 9s ,jI~Ozhu~62'8tPW Cqs7 >=;, B,|}gL'˃PC!H&杚W)1R`@ wo9ѭ:0β\do`(fFoϷe#('T˘(/`  R<@Gf$IַKP2Ua۪a̪\433Mٚ_t5h!FVI8@'`wbMT#_9Ӡ^| `ά6{K4OVFȧ`hF[ڕ#=n8a*-T$OHwKt90_H 䍜T<:[ksEQ*m+rZuU;굳-Ygs-g,Ε[ fC XL\V#kV\ "Or[Ҳ7ۺ,tb3~kZU(/`q}W!4G[$OStuCE&d  @UNOL﹵r[x WGme#*ТI)s [Z-8((fݺ7p\_LR[N)qL:[cEO;?j15C_x^oN^&<[H,jŸ%N L D)tPFNd!yVP˭F8Z ёZ$ 7 @ t_@rL&À,+<\'Tb.PJ5H97;vŎ7 /Slʍ#k +% :Pd{=ct&ȡ 1[J 'F/ ZI(/` V=!0gnEey}G4!oX:IO  554X7Z9`SF7d鏐 Xߎ XSkHEl_yBC"X)溆QK>l%Gr$L2-Y(~[Wpl93ҮTR[!-(_V9EaC/'qLOgoqg8SYUiF0یa;ZsVX-vhFj{MaBd <%Cn`r`a ԽH2`k[X4r5XBvA(/`k &M#0mk+YҸuQK|hT DEDҎ"Z p/˃a,\/k KzsϢ|c+=Ƽ`y|S|42OY\ &Qç(Ck'yLKS}֜2=\K% ؝>UT~C[N4)4b>vX`%Y0ʋ5g9 ?w[i'AZ᠝pM;:+(MZh_ / @eY{RJ\'Sn&Y$F;u@N hۀn2UvKx7{}{L 1ǂ*l^j9` $(/`r$XCաok@ >-?qjdhH<,AhHc-4 #@L,Tê-S4yg>fq<̄uPLN~)[ M]DJѽ-Vx'FɿP8)3yl$]S)VYߕttOYnZX7EF=Lzf+Qݽ98h(Q:e͍!a*⾙V_TB~x a IJC bD#9yWĝѯV~(k}Y~>>2U$ B3'9Ƴ 3;St]..$_UI}&Nٖứ w&785:: d?7^pIJ8VKmRG|x^3t5VkK{BDYls!l^Sv-[7E(B`|p7CA9s)l<ŘO{=Ȁ& =J%8 kFqD[i :S-nnCڿ0ZҀu.H_PK rhcait⺅&⦧Z6 =.(/`zE &VD!@i$%FUvE(jn4:]ǘ;;;I cOOXMˏ+9c1|_F,ym4ZM~fwӫ" 4<w2Fh7Bu&4bI${3ާr198{V/g)G__ڔV%~Ӷ1#~Q׈vܑP~ڐ[F+ȏTK/oUB;3$@i^q=~xG'~ސW5*u " Q hڈkKH,cNd6a GYDm&zXE}9o,dO?ϥ/}"cs.@(/`s%q,3=XICכ FM`1iSske`A"1x@" eb4']/ة!'Xq8cX&+_Gr!<AebtEB <<) 7JEY˄gU^q)7Wt.g.rg?\ g(o:].$߉Qrr㊓jd8e[5.7S0LBojHE)ُ΢MlCW#E޾o__7+Oe !ʘ˘nhmE(p7CA9s)6T(ŘO~=̀RU%d8skNq[i ^9Ja1n!_9- :$W<o+ij(qFXg]\ca!YiB+Z (/`T\$hTO[>)oM," PQNN̸NļbnPXk4 sܚcIBz몼L/w?7gJDt+1 /\Z`Foꕎ{ !!r\}GƲN5x.[~ہhğªYN: di *Y4-YةY1` /3f^U;%qzY}⎎-#}ghKҹumt/UGQGF FbPIX@gI5$  `!,?/ .1hgݜנ kL(ZBp%鄵3 B, B~F \Wv3¶rq%<3'i@9H}. -ieD -$"0G݂/m:f<9{λ!x_u  ФVۈ ҐƴKI8e{pMDZ!K[`zcN昆)9uI|]Ά˺YFCY}c$L1R{cWh9ZNISֹ}=~-{XV( '5 ꥱMS0Zh=Q8Ӣls #]TD`5|oNN!"V y4t*2 $ٝYF`BrnA<ؓ3rRƗ+$Y1xg?o`+$p )L~0=Uo[("guWYp{"c } ]$(/` = PGo&ׄ4K?ۋQZ E&3`553q-OtGn-z% zH%i>?50eD/5»6>L9PJ)I;Y`ь:32s9/fsLQy~ [Ó=M=v .!J'34wpI|q0rӚ{w$Yŕcŷ]Z%JV hӊZ }(/jEeU  A%DEo`=q`{`S؈s_Љq3ROׂ(/`f XL"0 +l V nM6=vluxTI8BCC67GFXY`K?Z>ۮ)4^9B_"Vn R#rkk#(Sh `U ;yڈjs"c/IҘWqqc0I{\Jx팋% ~+]jmv!k.ӧJJяA4Jn۠gzn AرиDi0wk]MvK;c"_0~℟Jh1?\[bE6+ {/nˣ ?+ FTCNw'J{me` nª{NXOa+$Cw7Y-Vӵz0DS9nt«Ƥ%ꙴ9-/:ohZ&(/`] vC!@iCIJn1)"/ϟfA\9<9^y) iNjz:ŖB(8 :m<|4+u1N. %xŤ['Q^StV(^ aP^ AF h!Nqt.fQz!_,iKOK!4 FQòEN~9wvys[?\'.#} v<]х'=uBS|1 UU1BCNH 0B =JzBsC\*:8,:B!Qv,p+(/`= ֗I"0MT?IƦm]1?jb͢þs@?@\ѿaؕc1Y,$ =[ZLu]n [}lQ&סNPʭr~ aG֪)QomiJЈ4IK$:Ӆا%gg,`<ы-,qlSB՟Ӻܰ*3'@X_d:ۮ $Oh4(,+i ~W?к` S'Wޕ{0I^la4/~sxZQz5]B! G& B1PA\ #[Ǥ;fL K6 7PbTy45q0ѐ޲1ʤ'u2&К<̭ʳEQu΃JG|(`pL%1Nk  k)`k hX`0 <" Sѱ3'մY; tY) bttK^2 Bc3`\by(.;`!,ygҬ4:yJ&0e^喅cg 6%$P!u@Md7Pra)س0emX}v2`Vv(/` &<PGeAXT-qP (Ed{3552[5DЈA;PK欈6fE/ox"9YI^Jʉ4e0q$Dž=4-ի-F8 6s7IETf9"燷m^I[%$xD$Wvqս`[ [P(/`vY" Me;rE#󎡐E8ϸOQN8N)̸N֋8[3X+[IҐ91fn9H3ᘦi2Qo oDqksѿcE6z+7HX@`oY(GqRu1v#YQ.=I;I]1= Mvf-]8ɚ r6֏sdun4 3*]Bڋ#ǿ,n/ť񘱊2U{-Wp^ _Hk ,Q{XV,`ឈ?()%aws" I$,B4`4TE{5ACtb- А[2ձ6 BcvΆ@rL҂/<\'S\f5}kS;! !BleN!)z{-hƣ¶O-,-i;JX(/` =PGeAXT-9FP ōQmr3554ߒu<4>b懂/ ` (Yu>ruΊ.^߄DN%~pgޤ V#듸œʉ4+1aX Z ׂjWhoӭ8klgF8 أǃa;Z2taN*!!Ad5%aMNy(m+zr:uX{^ } Q3Տ0d痵8W:H @'x 3H| [d cWwBELDVnͮ#@؂2(/` O"0MDqoچchÆl:=(T0FGF˂qWDۼ,c4 FYFa2F˩x5#.(}mZzW!2n_=ғ0Uu4#Y TɘIï*CK8"iMT:y q)ߵ3.=U[B1!:!pzS7өJ?}NnX}Bӕ x OnKg"_8a7AZ}C;+=-fԛtP|Я͉8鋛aw]\- Bc+n}]L\DgH,,4`BZh%w 6]n[VK@ ᡷۂ=0Z+d;.2oLQ*(/` W$XݿPdj%i0- 3AG&*^MSFM( z(UQ cǚ`ųpA 1΂4O|9 ☜(mh$4Xo#<#Lm% ³RϓRjM$Ly4rP8lvTz)`@,Y<'Z@Psb<)b80h' %{ZY ]UVu?}ghL1ez]WO9Z>7!{2>3PD$WkF5RڒaHu@ILPRD'% *xec$/Kmj0wR1ޤ 2KѳlVR.!(C3xFcZiCM>b$ZxA2PXE %:;5@fcCQ#BlZq5CP(/` I"0k4>a\c\g: ʯ B??@ cI18D5>e#9쑳ں RveȠq 9R QRʐm,>fS;ךc4T0!R, 32)"QMr[) ]>GtNpFG{eT{pd$$XpW _Vjš>W2ro$ʢFSM~qrGС~#B{% BĴBBu5l`C Tf7 mfgxۢ;J |+)5ZBKGD@. (/` &]X%o,?H>;]CL4F PSGN(Ě0y r1 cA+ 219Q>\HL2l6JYYRN)o]O̔taCKQm1v̵a<֜i .pcs8s$:<=LG#ZdA,H,H{ %{ZY ]UVu?} ghL1zݩr|}nB!( xFcZiUCM>b$ZxfA2PXE %:6FJ뱩%#NSW (/`E[% o0BjIi"=R0ܼ<PQRN1k'\@Nn9$*@G8Y.&+ Ę>Wh)'2W'FMvG^J_IG1^~_\. k,  a1Y&x-O >mӉXq%~<dnOI}Fax_L_ 0~yX)Ca&Jϥ |[߉2uz 8z`r@D|A 1P{_G gJ" Z2pUP(/` 6P! eA!ÝA7ȣ/ڦo,ʀP GGEQ^1qx%QtB(fnHO{,Bc.%+3EyB |sT a/ iF{ɻsA~-e7ay=/<=) :mE3{U'iHw%>fH"טO+?mm1tC8Pq4 CFf_\H<[ v _y*֚>{ Gt8hݺy_ީgXCHIeN؂Kv% +7rtBu1I8zVaN 1pɢ*Y$(!m8T0tkl-:_t{ kٛc8p4טsXvVp2 $5~K¿pu<, N'[Zo܀4؜!<^n6؃w>cdod =>&+7M_="cw X5I(/` A#@lT[Y{$1PL766 }Ek7ӬdL)„`Tz3hw ==pxS(S}ta|yDL]_ydw"5)@!7` (]ѫX8Im / .'uT!c9Vo'}yx.yq$0s[p{.L.1a< }ֆ&v(-m~MJP>~_.߲el< M m-%Ay,->Bt-Sa _ 6L*!DkQ Q _]CY' 4H'[ 88$!beձK[; iHzpnjO5.EZ1 B,#n+!9` 0s٥arļ3m7-ٻwx\ ڠ]VzCE2B3lt[-뙄1|SsFOU _$Xst(/`vx&ϸt8tk3u?4Kdؕ}u tkpUUWnZjHӃIII`*ʃ'[h@2EJ9/瀦=$,BsI$2U.YtHgw7r؝4/8;4ƒ,M-8(}S=|Rɍ=+W/Mkf에vϱX28Rƶ%ra:(G ՛@D"9#*IUTQi1M.W1K[}tFCl4  e@0#prlL+y   ˥؟eZVгaN_h-zh<ڬJ蚿xJYõ$ A:f[@<ǚm٬J}}O[t˂566wlqiݶ*]ai}lOPJ]ϥ;;29(t=E3ڔAuDI@ k)Fi-NzxtƷ,4D-C̙캿,SIcgk&+;@8(Y [ @}| ZfzڷzR 0(/` H"@k,j?Fz5XEq0w3o86=?>eIMAn%?xFK6'{tєW!{`?]EّK `]x UMPmYXC*W0dՅip?iR$E1I)|3&ZkI}UPMh;- G>Rpm:t!,Ya T@]JͺU Co&"grRP{O옯WY@vD}]0'ws$ ^Z+f*$.{L|Cf+ $囊7HXLOn `: 9?а%s"'XOC0Lh$(/`y'͸L8t3D>e{Sc581*umqi 2yj'!L@/ mdbf[x4EqhȦ MR$Aڜ$=zJӠPMd`r"ƿ~C,: i)kN{/w;ۏ[ mدۛdξji6wNJг[]$E#l4ey8,eő2l:;y ˅اi[jξ[zsGO3ukmr.Do Ԧ3׌AZj{ZngvunΎ/p{=vl+lz; }~?v|R8mo?u:FئvE['sZs3f9(t=E3ڔAwDI@ {)Fi-NzxtƷ5sR-C_6SIcgK&b Hr?JxED-B5)PogBJP׀'(/`l]$hTO"1쌘S13 >ux  PRO[li_cĦEn넹Uz˦ožG֕zL]E~{WK2Ntfʓ{8<"l,n]Hj!+dlOtyl8fωȈhĿb=)Nl*hrkgLuTP:k<-?fNwjz$}-YNִָzR{S}}! ?IK_ؽ Kғ]''*J vtvѸ#i$@ $$zA?pYZ+1-(ΚA4e k  Eܚ77 BbZ\, N˓azEZYa> O{*u&z^戹tɆlZnKXY7M oFDnbҵVP1[[3!TBA l02&xÂ@(/`) V=PGeAXT-9AP 4T'Mbr3564~u0 3U9Qz WPȐ?BݷK>Yy!O@.w`"D %l/fI|b +1Y-'+a[[΄~Op}.F< %‡cPa  |Mk/GEؒw]1scH#k{y%SiaiU/B iMȲ'M%dZ!<9؞E'-iٛm] ܚVX 7 (/`F[! Me;ri\!zAQ,wuЀQTO1:W79EnIgX0L cNgF ,Cg/lۣ qkЯZ=R} KX@X f3?:4邺ʑzQ#9 ٨Nbd)D4UTqsu,P:a2PV_8ni?f\ٻ>=~}eq{I "}2S{-W5xne_jϡ@q_{ HO{XV( '0i"Rխe0QD8\EF@,N!{ck8AjX4Z- ' hTKsu24 #|%"9f48,82PFcgPq,D!@g̅|FD#/JزTJxmOиMvO+QZ]1? A Q%8֟_a{+nd>V94'+ $]pN%Gbe "pI퀁yg[o@Bh-p1Ƭu6`4;h?з3|HTh<&C`>-c0< ZI(/`e E `G[RFy!;g;s)hxd!b;@;\+s+f9֙Vy+ ~ǁ(GzPiü63m5m c^' fq ➂$pi˃ả2BXfCZ3q%h0@;Ĝ)l0*)HGwV߈/DW6NQӻ=gqn t<5h"*i\-AY̼ pJT"` ymʨɗCUleU@9SL#^COl]:33VXV ]!N((/`n5 fD!PK}][uR#[ eVҼV;;;(d%顎i-S> -AKS6P;cƫFD {oLBo6Dh]UWBBk#:|9`>+1-G U^T(VkDh-='Oeҡ3$_ڎ@OuCBmŰgTBRNӎr.  ' ;NH_.v$!Bd` ^`7zG3r6!  \^Z+ *$Y6a>s.P/i:tc0!RX:v ] O56}j " 0 P]!MR-J5VH5>u}gS.YxQf!$$ i$ %{,yjX FZk$bX-ӹq>o`5@9SL#^CO7l]:33V؜V|Q`8(/`,e֜Z%m?ҽF6o.L4ONM:1=K#49s[Yid^Qkd%x`0&V sݙOAy*E^ީAg{O'/.Qhݺ\_BV؞c߹5ni0*JC;(=?F`cI.{ּuSϯAGirܚ9u+E:; kFՋi?_[[A/ԋ ы]%.Ha֎J2D zIp&?{ kKYk8hRSJXc@ТI2 BN@\bA.lA!y; qu28Mm ^^ֈ36db/=lސnQy%!`:$9B}[2$%ؑONsX(5@(/` S> @IeIXlÆYL<TZ(a]9j654uD!a#Fż803-GRŲ71;,a3e! yn/93c5C.q/ U/:m3w2|D\zC;cɄi-`c C9cq("W:$yV^َTzo)BCT\ ;\ir+ G%DU0cf :BFGP\_Ppzkk.(/`oV!0 e-k.iPիδ6Mci*iALOK狹QN)̸JCDnJYdA h953sLz{Tx1Ň9Oʭ.A v Fq[+CmD?HȂ\j(h*K%22i`~FK csa&OV_QPBۉ9SR_t+s  +\ڃsXV(PqQլ#c ➈dkDL"7QH.iVIX^6 @'x +x@|-b Ņ#Rz`!"#`M#4(/`f L!0M9.t폠mYPkd0PBEBLRkgT̔Q)=2N $ 0a22Kvk隯n 꽑#jJtsޡ_mR}STd%% Y*-v8ZhZsم:|0LI}JYE#*V|?ϣn#Gғε4wT#8uus8`p;镮gz[v:2Nn s0MD@3;鯘{C1cAZ]qC; =PΥ7֟ؠ_aLW(Vy+ ETSN{G!XF$NOl[ى:Hw@;@!EZ_c-ز ÚtRRKdYI(/`U$AX (o HRi'?3S" ēuy ?E(5 ]Gn5 ]!KO%M#5 1B y40썃648ih8a X 3XƐm50=}Sa`a/Iš<'$BVQv#C ! BUMtbi .95(9AEfnlG1 _Xncm ,=7&Dۛ{reknLH1I(ŘޞA)zF"gEFddpo"ur k%(l˵I:1 j3t`ַ'41&K2Mv參m崗(PjjaB*&!ct2#, G'{<ﷵ9Vh+P 퍍S7=S)o\gt8NdӻDA^w'tAglj FEsۮYbM8AmPӆqRԄ ~|AD a<(qf\%9FjMJ?KV v_0%B U'YiYBEXR(!EE& H\Bg%Ŧ=0q}u9vjA]qqr1``qJ1,&bzOcdLQoFK2LВ6NɅdܗcQ 20F)@H(& M&xd(͟ ` 럭\׊!)He=Xveh bj}jhLJUPDg$< M7W NzZ) ̦EQ8"΀p AJƯ5QrL7TA(8[9Y))=v{_WvV0?Q_5FɮA?? o@9H5"#dzs8oA0[kJ7uHwn F;<8CfD쎚v'!_oN3fӐ7H#9+GMɷ'}bB, q@5kK%1zNgeT.FZZs( '(/`FT% 0B|I6g0uq.\*!DIIG`8GKᣬ[v8EC;uzD7'W謵_mN9/GDa ˘f^~4 doY/)|if…0lYl9Wnp,Vynys]mu*_'ΫnSɚ_vsrPTV{w/yѭ)WA|EOHr:R7a,' 9Hx@ @ׄ?G9z,3IN_fHRR (#\\ѩO^Eln8 {85 0@ f}L`#*.9 C[BEA $2a 1"= -~i(aJmA&\DN@ nQ س0dbk@+aa?.R ZsI(/`M$ B\ (o 2i7,eO;kKU$@.$d@:r ɏv^z:$y8R*Ïܱ 䱰ޡp0,4c4Ã9A( (=Q*6$Xo4p480 (ZG%F ]rjQIq%9AEfnlG1 _Xncm ,=7&7>Q_fܘ ~brs3=R0Ew/T9.%po"ur k%(l˵I:1 j3t`ַ'41&A4得~"R ia!?:A/H |}5̱B+\)F%76NE[`LQA2 3q,Ȧw8Okώݓ$E1V]:)ĠpڲB J ?/$ HRaJ8cP.В#5ea\Z%%[+;/ v˪@EXR(!EI&HF\.Pbwq>o;.8f~d(]V%#?USLcL OhI5 ZI9ɐ!)cQ 20F)@H(ɞ&[<ĉ уiO }yX>J|uZsVRkDɐHS[,2Y`D&,Yg2ь'#im"f5V_Qb*%7@H\'@xLcRkGUdtrm |G WFr>tDJJO4m6!צ'3OmWQ+)~?3z'[ PROvȈD ޜ5EK"hR%~!3ܥdj5!ƄRh"bIȺW=kśՌsH{ݑ٣^U GWRI`;Y4]˫уYisf(/`^ T$OUAIhAqyBxs^DSKKH3.nm~-cd4Q]F:/s% N Ҍ}%-|3i2a=Řc#rk0%HMZ P6>xn([B@mQDJD+s5i4 jae]Jxmw^.MH?{ڇ5((kĜC0ذyRZі@x|I>Ms %siA;18εhmimIcq7A~?+AX,8UD;;o߱x3^_4a( `V4L{OJ آ4YR$8l8<9h,杘?n`Yf ld:w6ɺ^oϷňir+qG:-'k|c@v(/`3 &K$0@ b[0 =zۨQ@FAQ #Un^9{GhJr dۑxMQHPzEHXT=H,RgQӆM11 iL fѓp95-^`,LsL/K)>u|>P)`oV5(v`i `0pH ׈L3q)C8 `+ 9!ߩB+"֙ ?((/`UF]&a`/u:e{ Ƭ6dw0PU%PRRPƎq0CM=40sM!Ůx]ěUi Cw&4E1̷c_s2Nivf`dܪX ͊T4+0JEFi-1,v\o4oGжZӗ$IVv.w9V[fe\"@:bkY8&R#ݶt ]nMTcٕX}^Ir_Cm /J5(Rǘ~D=zP]+Eٚu',k¨غ7c紗I*3V  LkRεzv̘,TH]1 D3&7* S[QW 2Y _$<8xCs_J1UۺJǜ3 $`WY]en-Uok2O[{Bs!43 0BbsuVʌ j䚂3J-4-dAO֥}q>w%-PH`,{'AcN N}v2HWXEVL|1b,#/`{};l]i hI$e撐:`.1VmnA-vzFԜ}p rP-ŨpoDa3s$I\U=mѳ_23GJg޼]1Or={qN:+Yz'^Zxrʷ='}dRZ/NyX0 x(ޠ8tg2JZ|[?>qM7#V7\hVu _QJ,X4ŨOkda'z6~;:g$Mt˱ز7+g|7[R1՘vo0r[ˮ(o/Mj;U}QE:%j4*V5OYׄQuaoi/Ufl&483p+1"`*0m슩`<"򅎷1-QB؊b $0> 7Еo"`/\)Fj[Zs*6k̭mM>Ws=`x"ckO!1r`XPaBbsuVʌ j䚆3JEh0Z䛤AS%vK|J*Q ,'AaN NtjEo"nfLbDM/`= c;/l4:h+H$d@Pi.)g/Apf@ǧ]Ƨ4bCn͎(X=?>'H9lS-e5( J{ U=[ 40hUY)n$Z[i׋bUK/L2? gϪ6`PC S1X”$6|I}Jf,<#Obi ;ȥ|*;Ҩ|wh;BR#~ԉ>ANTq)4=>.[K{ Zb eloZ+ ?pT(/`e$ m5ǁgR4LސNݻ\ _wϬY[XVҲy%3bl%ZRq1WL.:9h@MN'96sǾ> س[9G(Yl #~I K~쪲ѹ:v-uP7u| `p׾n Wz.8*kFC帺5ݏe`[ PGo ~F>їLy!kd!554)rXEJEv7-q7snI å*ҊkdmdhrɓSo.Eݯt E%DEa蠳l6>FGP\_PpzkI.(/`^5fV 0KeƔ[\r,aWHDTp`RMOK:A?/"Ktkַ.IX0Vb1 *>ָr&^IO%ޓck4KYv&bq`฾U˵GTp񎷼l wxnǩa`łasS uqVq׵Ӫykufztt$ڡ;M塦uSm_2p'W&\WzGk N:EaȿI0:/4bS"DfAɛ1*(1&=@ :ּ+s }1hih1Z85 5 %L|ME`rfEL  l6İLcV%0PN5q'uXuRm6NǨdcKMffYU]̨@^{ L$HC$|N@-CpI@GsZ\|9V+NԚo}.gvajsfS;_@k =ڜè40܉DEtxᩈl9Pw S7m};Ȕ, OX65}~Pr7sjؔbO@5(iRi bb;Q0@m?"OYnhE6wؗh"" 1&e L`"P7( )fbW('2*ML*lto{,T: &Xh-7 (/`fT$o!|EdV"@_؍\?Z55 JIH F"fe0^YNs%̭x۵ōwԠ\}mz&Rnzoɿcw RH-Qxm.E YcZO%V֘4aT-"kO_I< ?DO4&^;ceNMj'.Em;XPFҪ|#wU+DO@xJ[7d#4z:MpQ;=Ms&" xU¯hu ,s Nfw)Ni/2 0B;N`3\2[Hs} eqijA6%d1Ö 7l~F{n-Rgma{X!LK4!;xɷg@S,h%(/`fe% gK4$DNHvQ5q[s{ Ra_S eӤA Ph$P+Cb8-/hDR]}AH6/oFb峨yYPoybu ꡵LP\$1Q?3i0mIj8sϫ)ߝ%6Z ,jk.|U/Y&am(t8G'€$=GAGȓ@ #uӭs;Hn4Dubgfc&yjͷ>zRsȳ;Y^rvV3=uxVisv?DwDq" `Xx*K ?&—6Ǭ~;)/y-sO+m>tڼD^e/w;YInB4(iRi bb;Q0@m?Ϣ806q3y7²/ gED`L°`P*7h-fbW(&IL+숴lyjj A[KͱZ]((/` YO#0m^jIc`Cusw|77|TEDE ;63Y^KìEhvȺjFJ=+}PK^ئS1khKk^4{!gI/#|垪E1ji e(}{N?(_mNBfi0&o`1Vi|kP#w"5T*foy ]KSB83'fN'}JO 0<(]*O^kB-v'ˋ PIeɆfv\jq)Fo_8@їa~t]+& B82ʼ\'/%yb`Sf+ $76Pb~C<|4g|mJvSK50) ZI(/`=F&V ythKzk|r8tlƇԭO] UU;.,Q&" R\$P(K\,[.J]$(˘lcT61"BT&| ?Db@&Ƀ@5i|=ȸ܈f)d䨪񀓭 W5?<5.z쾏$yp;gZhNiWwQ\)] %.s⓪j$uڲc2EeOyΕӄMZofp;Jȝ7}O;/(Gy$=wyUɅ57SS|>j|Φ!ՀhB X4hp( fY\A@A(gںfFp!Orq NP4S [ N`dZr:TMTrуL{K ΖN jK(|Ti!dTt0q2MPΗ%> gP?+ Erlҡ֪8,tfDv`P)@*(/`6[T$0m^jIc%|eTvxTCAIIGN[^m3#XA; iMYT^BU ʵF%Oل5bSmS [ ..Q|`%N|n >c c,U*hlQ^N~iM/tƱ瓸њƂRkg\`].w .z Q=vMPPBҩ|ghC"BT'jE_Ρ`meWʺ Si] P;1D<0$,D @<Մ??鿚O7~SD/n8g%PF <s Ewu)NׅM_p 5 B3N`3mǸt@ApBmLx %|]NDCc` A+t&消iĺn| ߀mzwi-m`Lh잌pXx_..(/`UV&V ythKzk|re@bƇԭO] UU;1pm-0JԢ6!pQD"10Y*E"`( c]&Y*@ 7q? ejsS-L Ȥ2yH$2y&wHIɝPmnD2crTՇmxֆmʚ[=Oiki(.O sʎIﴙ{%{qEjRzLѕPb1_.>vNrZ-;&STI\>MDfkv yirtn'KsgZ\\sSS|>j|Φ!ՀhB X4hpA6;:_:w,:]=()anҼ/XpZO%ЙUX١ (/` VG# kX?15P+F Y@8?>=1b$H4PD1ˎߕ/@ (:@_v4]UyQ}ّK ]w< JV[T0V _ULI}ʀ֖?bRL(M1Υ|ΘTbibeO`دрZv c@O6҇ vڈk-,$.;x' 20*,"kvZf8`N2ğGt aX^.(/`t \T"0:=Edk^Ě(d.I~zRPLRG`X,e9,"-Da-Q }QEcQatHXw+/+} !O2Xyo6(αzTk Q!Yi`(EQqD(0RARQ P4@@Kh#h >=η.徍ÁA9`A7Զm*υ#Z*k I:fTDZڇ!m7{0wZ;c;6?OU(kt::FvI8NQ.( B˜XMoK4#}p@ZZzlɃ# n*Qf9[_3MgP(/` ^% `/ܥUZaV6\iRW2:J4RRQK qhmSY<y0!Ѳ_(a|whW6N}y&n]cZ `}^)vBL?=a=]R6'NtUօSKUZcѪl֚Fצ!?&JT:0䙸<C[b~m~CŎ`>veo'T?mTw1s8 ZJ~%*^U*=QпsLb Q~ӭsVs<@@YD(@LḠ?C=?X53(V_p@iYpy1KJ%Q(1L 5 Bb03wܚ;>Yp@H`VJP xУhR"6 J<l;3?I[l@ZYDf0M鎼8HZdkƖLE$D`?}g@(/`q T#0V[D2Z!%/qtB"*u3KfLPGO M-JhD4RRY(DFy4F(n)ᷓ!}9E$>Hy4 V>E]zI>&$< [i -pJU0Ζx䈖qXabLbH$(* '`[l8ӷ"@ WH[չm.φ_l/7,dŧZU-O}VAی^0h2'tNoS' g̭ok}p ;FVu8]Gy>( BPNoKY">@ZZ~dl#m]`Q#fq 8Fb7@ (/` I"@m; 5az5QtHT+><ء$gW&d4TÑNXyBW_vR DЩ?mйa۝;zaH''84d:.|$G (k YhPH>] g<|T$UwJQjI- E5]Ca@Բ`{ @(/`d,%XBh .gHY Ңwhwky@yPѣIr9"PD Dy<4f&"Յb4Cr")b3m '1@i}儴y$)Gҧ oQ^2JSYLn]uoaƖ$TJgf\~ :naKrJAAACK͵f]9Fx­ |֥gAl'AV vwVҦ[HHIj׀r5WՅ>D" L "Pqv{B O' `1s/nLuXce+([+O$qbY7ҹ;MrnW~nrm_:WsO0~i90*8S‚+! 1Wewr1ǽI̧rpl(km<^5!RX~^=YiE^-$'ӹ ABIf CDkhq2 54%Bf0=,kZ9#cI=fXEQ ѫq yu,p,KUc խɉ*k(:,e)w!:ߍ_u9&hhĆ"D_%/a8_ppjM"ݢDH/Kk3dQ\hZB|غ^qI(/`U VJ"@k5pE]quy-}ABA(Qk`',Zuz5>IP@ Zkĉ>=9f02$OʒχDAM8FHM_ͣ=䄕faPe\bYM1r} Je}۱*[3C8t٧@?l:.d;Op4A>>ˆξWKUé}עP(b[Mu"ٙwHi><G % B[ٮA`Y ഭ <f-07odgf=rGCpޞo Ƃ5|a#q^{mk(/`gFl%Vbuɯ9ݢ^a-`P'u%vk$2H M~"KX$(Ce™8yL?ZeEky'"+:^x$g׬L^WNHHxP< ך!I67X$bߢb)eڙܺ-I/*kq568-V.* W2ךuaZ &Y^Yz5- ENX-؍AZLn- 6[7\U IOI 8SU 5Nc+X̽1 i^+I#ll>DZ jfWK>46ɕJKK_ݖ#}+\M h+Vx 0 fo7Qޮ 7uB'Z= 655uuȗ$$q!gx5C$I8QCA'h]Vz!n@7mn@8bL=1jc)OCSO5o&S|H<I( ,9Kń"͵иNi! ,"_[u5mՙt1' Yg-뽨4 D%xD=p`䠱l48FDGжZ_Pi6l(/`}["0MGƵ| Y ӗ;Znf\CQSO ð]w파i,1y2:ES%b~ۮ?$A|J?$h7[Oz>v:U1v' 4Oh Vxwp hwPa w2۲L3qB!-L1 6:3eO-v8&aAk (/` ?"@IcYLZyueJ-$ + 5i2664\Uz^k_J~ BNu0b::-]Q 'R2{Ky&ψP#Y;gg`v`όzG_%_u]Q'5=##kucw t&a{cd$]qiH'k:#|*tIqD|=N4 =' +rw@ƹ 1`ns]іZkZ(/`v O#0MDqk?=argֆ [AFGF3,WD۬L2^ Ѐ45 ?܊]ۇ -ASSO TC݌zoɿcw JH "ӥ(V}؅SUAd JTYKQK] Z'y&9+6iP2q Hq)32}^FVvҰU;ӭJ? }CNfN/iK`@` ,A&kcQvӜg"g8WI:~[p2ӭOA63 3vw^˜- B+d}XLlGBg&$N;l@Kp ,E wnxݶz{=k&7H{`-YF]y 2 ZI(/` U$ @[Rh<."v$ҀtP( JQIٽ`[i8=bmڹ!& C,Xm3zO ,译b{0TG%jzV[.+68 rcvU7gv &NQ$P=EP7q]!uy"0qgAGB\qugսYKh8 |blp_ 4%6UvˏS_ʣptx;6_#}|/s}n8 <K#1\` - 3 ݧ="_e|7`aoZ䯔o׸Xϕ )(BfPf WqDp54rjFzqc06xjx8$ dKNQYr6j5pմA((/`E WJ"0MFjVZA Ӣ6 1Y80@TA@?2NZEhig|vPpwDz[Npڶ=1bv\/5';zYӺS4֖f%2..)Z?X%1(Aj-MYZF AS"^^[3lVnџ?QUD#4vs8N= ў`74}i( ;0p^u}$΋ i4VQ,yUG9 5zC% Q^1m%:%yg2a -TD 0 -=nVv-f' =_7[+i A0H,I(/` &V$ ߘ$_dT/+ƒۭijd !d`MSI9 5F־-<]vhM+'RD P]١^;2xD2oZudI2U'9TnBn;BsPSd=p/qpСVSP8@i IO$$~EC,W bN0-|Hӽ p<"[;zh`&q<"k ~tyK–}2>j?KIZw8C5Yl؉/6lˎS$y|V+) &5 `[{>`)(03Pf WU2] f9  `4\XS#kzHTZt1vO{{TO<p)cdKNQYr 2~Mp m(/`5&a$j`333ӄAfM&FhVUTΌ1ں0iů Ljh6J)/z]b @*LDf74uqܚ 3{34g9!)˧+ܓs@bj (/` S>!@iJ$D'ZՀ6>Z64430M$_TU8,@kM ;|z|@k E?MDgbDzړuu.;Y i aQi=?aygR#TMP4ݚ8mi`~α–ذ]7PC!kgh0G 6⫣Ni>i(}QV32^@ WQ} H%D]pdf <>F$GY_P5p>(/`~MVY" Me;EvRӢL@QONՊBiNճznh953eq$(82Fy)O1|s\ A]2^ &H;x/pWPZ9Ro#>(ҐK)UC{&V3Gi{cƜk )9Ksulؿ"Y3^.;}bP>v.=TNvbԵ~ʾ `IoF뼅NQV3(񘈀njX([%s<륲 3 0PPm"b}Mv "OnqI-bIJl$p^+CI3lŠʿb4#! ZҏשoD Ml#%.8,)C@9 #!&'tp0ZEm/]onXK$J A' +z@Ɓс5b@ńM#Rn`!F"c+& <] (/`tE ֙O"0M9./kp~xТ6A}Dp HFE6' gɡ ,֒)#Gs Da +嘠+[S ]@ J]=꯵X D! mX ~00Ik!Ph9ᵒT(1~|݁o~;9"8k)QԉӮqvAvbH[ɣQ}MvmAf"WXCq~3B1?(Jnݑ1Hx!H~ʟ( EbMN9.~l3Q;Fbh߀nmT.dyu3deB~pCR+ݓ:a (/`|2 @ea!P~uͮ|MMeXrsl5_y\8z7Mv'i7W>Ks\H V{=lĹLǐ g)0-FǨ&j!)hĖGP`W-K-Z"znCRyH9Ipj@CS3]9 Y-qBhZm"MT5(/` VN$m!= $GQ/yN 6;4)"TDDCˢ2.Dzy,ä[rsFP(SwfHK%IzAgjܦ>IPn(LBJ_4zanY-lj,Q0Y@ʒ$?jʤǻ(_uME^E[Fp]MS}Í_ѩRYq}\)#?%`S*9pWI!a7 eaR?laREe LR̘tťOx?˞hqTUDI?( B0\t b(ȵ2Be(jLyAd6PѠu0ޞo Ƴ' g9T42`5 -`k(/`2 @f\*uퟤAz4Z2 1&݅K(ZDZyxh<JS15)hi(q(nEK}h$AG:3pq$vF0$2oً7gxC]9 Y-Q5t#5Ptab:i eUr4kRKEcJ:}M3;>X4c BA Z£1Yuߘ\_M,{k@M=fY{O(͉.Zƀ+60vIs` 7ӭS.]Bz=a k((_z_Pw^~U)c[83(3}=W]'*OȀegU6/:,4 @b x8?'.1PiBtnWcܼ,975Is IRM8 B\@Baƥ+Q 0If$Q6ַ?hNs?V D)sFK+FzAa *mխXGll-$O 2n".2 xkao *"WZuJzGTVgSOZV?˜\C ?'X 3Hƽ%Z@W]rk`z&E[ ׾&2(/` vQ#0M+~ V4n'gN*56-M GHHL{e^-kdܭifasU9bi(@0Х?&^#^ o9s%"X]U}|aQOF0,U" 'Qޢv.!|i͙xxaD0ϯHEFyRkg Eo>sS) ]K)؝^U*Z' ZvzBOsJ)`H`V~vz%A 94gu?VQ݀NP>y'Sn]ʺ Kj˲و e'CYx#ް6kuiW(/` 6?"@@NR-U;2,DpQ756$Q 1k'd0A5ж2(P*YDA ǂ#dKxSc&ts3x^m})Cg[0! RBر|.hzU _I}$\.+W'Q2^)NXFzs;1!jAjk٣~CϥnN'j-#_tR[`h>Vu ,=R@f*2[` 'M Y8mZlL$[c/d$(/`e T> PIcX@ч"m&0d&"584,r:O :x`i">*KxF.{>Ed S\'εf -Q0 ǝ(Jc`* 0XЃӡZZ)whkE,1|&B7S"Or휰-e-Nsi$ bpc_BJ?M^R+ɿb[wB7bw%˲Dm 8=eCYx .ܰP3tZayRB(/`eU$ 0B|IEft^7]| @KLJ 5iP=ODzɥθxa0ODc {0U* [Jkiz4ƈ[~][cy݇.L]Nz Q]v((k]@cM.G[?өJO P;{۪!1rb51jEopf~1~ ?D/f8g#PBs - ]7s l@Vi=C"e.nTagm{*ts R0[ v0PF`+>Af€B@LoWh$:cY#t7@p6f:\' L-f`$(/`Vu R$ k"ZeQW밖H ʀ FLG.kK0kf5%MTMi9ӟz=Ha4@_aFvaA=.;+?0 Gʬ{kY8)1*LP(OI8s"=A1 E;( p8a855IAdT7fii,mu:޲%H  O`% e; ?/6+NQN٨.q̈{ܵ~r~bS./^ {%r_+!w , mfjZn3^ŷwVG <vjIi/+i 3UZt1O]uXdZ%D] (/`t H PK7<=6ȡ+|oTM<+$30A??O%LJH$:"CIZ8B'qߊ-E>tCLR8? SFhzK]Ds AK،[b!zϩZv(Ɇ^DŽ8z:(ji8FL4צkjދig/E3ލŶc! ̶mg^:h.2(8j/0I%#Q˻{ 1-+  btN`"-a꜕dY`yowgy12s0-T堵 2_0"vv}q@wd 5nUMl ]x/em`; 1N87 (/`~v;@Ae֘&f,֨ VӶj%1a033Hbo{i~'??|x<+/u^Z+[9T{a1F%2g3i J&2B$Ō 0<-g( *CBB,֚NjSDw j$L&I(! K"$ȚPl݂% Zh{ ۑQþOŝK)L_f /2*XE@]y`lFh9ʀe(/`i}]Y!0k4Ӂپ;@v\TD0qxA0Y`QON)ɏj)@sbo+%yl`e5cƪ#~bK :~˟7'c|zBS6N { $a1&?5LgoX9>Gc +-RwU@CVP Y$ZQZF )MWt ,aaJ{P֠0蝺P(Bc4x#Eb0?D$WPx J'<t $"I8奓e :t^戯:(jW7T764^^aX *E[ljG 29k/ (/`! O# b>w U_{w!d@EKBU[X4pbt"0laS9EjԩQ^$&]eפrv4R` 20" n #J8 r1G?1v:rƋ'bV(X@PS @MA"s4\9i &X9auުU? Z^W~|n!wt.~Rpy-5mn?=džER;k2o菏ߐ_IW\1,qD~r9oAruƷT  $\0Z7ef9a6݆%w}WB 5b Ζ(/` VYN"0k4Fvo["[D8jYg2EDG 4K$QoDɘj-N8 h3v}e֨ ; Rw)g]*O!Ma@~(}~cooShIXɘ!5h*da8j! gaK .iI:}O[3Ԯ17_6GFf]0#3XA#0 ' Pv˲FLd~6G|T9<~c^O(B(f=%Gϧvдs4 0B0N`F8G-/)$Y$rb\v0E02a %-bۀݴw(kpu0瓃!K!&Q&Z랜7g%(/`& 6K$ K'q'CAn+b~<Vb[AD>NGccmD aa[17WΩՎWYG8>rJES,]58=#)s%0xyx^

J%x@~DTQO%O-Y0 ٧Q%IJ2^ZM$Q(a!3ZvxbN͆I#Z+=үS 9zUgmL10"o>e~0JY)efu# XETy4iA[Se9hG`%j!H7Yzrx>&=vECYI˱+ùXbgI~K-݈>fs̵ZkE4k)~gTHBNpŒL ykgH+U`r@ P"QNL'c] ʒ7z@PbFc,p\*hs`=* sw$sEE$RnHWɥB9"A y)^D7X_}2؆ mf-  ,ib7 K[t(/`- R;Pemf81l%"K85U)RD243 8bn`F#?2($(DH̸&eAj7mr@Pd@@Zf5xpd;G#j+y!@ +YZ ig*`2rW G+)MiMt-*Nꌄ&kvY qzoW˟nn#?BӼc /O; fQ|n#PS{ȍ_ZP$0쥠(/`F I!0kA\|Ӧk_A5[qvA-FH B@? c]h#"1P, c2.RxW[zQtO5`P#?j)|?a~KbJ@Q,aUPt8CQSv~(QA%A#K$Zw-VoYGnWc|֡վ.A/hj@w6+7mj Mj9}3# +ϓz>iv"ÿ.F!9+ M/ B044}9L Pg @_.ku;뀉i(8  Jl 5@lb93T[h𪰂蟶Vib`!L(.(/`] TA!@g,GKϞV֫I Uq796C[Dc5{Ry' Dкܷgh0i<.EU/p zeP)Eb{繇J#g! @RJ#hƞc-iuZWޏ0ׇf8)pCUT)*_O z#MY[݅ ;OeH?(X2N578=eJ S.ΤW 0>40e&{=<hlp~08e" LjX\~] @]Uf:dغ2(/` 6WF PI܌-!䛩0ohML=><c" (XH’6%jXʔ?qwT3gBܖo)i{ͫ-xo @(/` f$n&NDYC2 jiM8-iDPU3dh^?y Mq2A!ß,;F?8$rCyR4I儶>1j+UoL:_IE+_Y+ZhNl͋mfLQ].IkY) 9ᥰ61Ym:NPh8jV_}|TUe92@">(zDQsQ?YS@qX O$ɯO=cuRjY6:c1 W8sR+'baF兵 W鍭N!EfF ;^dB Biw}P#P ϡüH.}#> 7ʓ5:.Cr(4MYS:8PD/D8A|wgx.zKЗ'ÝlA3#G[>k=r36m1$Cѯ3SL$E1s28P?JseDY,Hs;.*qb6:$v/ @B4bo&+ `J0q& Bu4#ptƜJ'ȑo|q<{d؉Ù783זC idl>y1B(/`~} ZO!@ XF4dl 0ҌNFKA5#IH1Ra p c>e+8{8r AW|dkK;F'>Q<ܪᴲ@M[Fewc Ev*Y,MkY8JD, riʘ%Y7+k&Խ/Vk| cfaeb\}i)=t5x.y6t8+%F<ɧ>ClϭsגB[hQ 4dQ4:[ZiWAyk (giP[8N6J];Q[EG7nDG%GƲA4lEC=0GWBW@@є2(/`U N"@iȦUjoj1KKLl!JDZu HEC fq<ƾvJj1ɒ`z$ ќ(M %8ˆev/Z>ygYϚK(/` FM%0F̒GIx@5@'m8DAFB-dg渥 A֙Vy'FfIZ)b#>̉UbGZ>fsR3Ipǘ4MBю5oņCz/b  2"̜kVו@ _$/GLG9orV*;YzdZ ؂~S^쐶0C Q廪< Ykn @`0`uv|U'H;!g_ɜN|ӲS7ѭ^!.*8($&hMr*]%_0qoAR -1Ʈ}(e(/`8 L!@k󃁍zK'Kɰe)1yaQYv9~&FCB@,IZP? AK Set~7u( o5cc,P#61ߍ[xQ <B=z_[J$%t:P~_whs0%Gt;` DR:[gD~rCpKڍtlg?e?׿0zl;mT YuPt 7np*-+TB'{{~DogxHFIa wn{ ];ܘ) Bô&}/L`ۈ[@#Vr1L8 bdfp&LKRo.i1[ri Ϸ"Ԏ]mO (/` =@e&04/|wLHO}D%8bT555Z2`wԙfFO :}C1Ģ ̈a1? dQJq+X3NCbU+NJŊD)'WRj.AEoGoQoITwBRB[5M;TPOZvz;P?Ds-qGu< >>jFD h1#~1N"ZqB?vdӭK_3 0B(<N\(a 8 >(8#RDOlচw؀`eGG`@&`rq̚w!`DrȹOoA(eR=IadeJ|r-c'($(/`I YN# XXD%.b,A(z#0DM@-QyYE)E/Yx%C YTzFl H~52LF"8{-vF(4If1>m"@jiI030\Ppx"b9Hk*XX xh|PGL֊]SFLٛ Qz!ͯraNJ ,qv OS$:a7n"͚+n\D sL}?A`y6KW7Qz߄ ,~r.l?Ri:/( BPǨ8# /TN;8?bɯ{p{H˚e G(s/um^q8r(`d۬ѺFZM:Nj޵~;{D}Ʒ\^"lәѿҏ܊W8$Xyzv`Xk|[^~ge GzvjiJTJ&=DB Û*/.]8 +}  13ޚ\ 4T(/`]Y# mTNӗ} v [BM*PON#2/%i^KiKzBZ3P`% Ւ-~$1EWBzo̟R9s  z_m'KzЎ0,EQiK;I wJ](Ck)kYVcZ zt%*s)SiMk8ZTImx4~mŋ&a݇ת(|;b.ur\gk=bnنQ`T}v:sÓ88jK&m1V]XmKqp$BBGR"S}G'3 @ PA :1AMX0%e`&(zDB8õ%ypj'nI!0z!ĸ[e7[G)O M7dK;7`! EӼ Av X ó09g B~'H'/ˍ(/`v;PAŨj0T4ANV425033b~\N+$~m~9p!ad̂fI.mbOdni3YXҬbQX'IZLv奼ciG[*;-T4ńD#aayЁZA N#4ksc$7x:H)-*?2>,+ԧ'O 1/2*XE@]`rFyXl(v(/`FY" mG,ljԉp2`/0:J4PMM4,zNx- 0?'mp4e-V8ea, ))yףFydQ5]hm{'h~h~@ meiWgCm =EX TօԻϘcD59QOW68E]^}2q@)>\4K۶$!kY #Y]o ^| Q;~=@Ԟ!cWKZ?S(@hP{ mB#QSDrί"׶JH5Ӆ6Ր8)o]j" #zoOi_7℟)z I PA;ac%a[$#܈c@+@Of8Oϡ9&'V"F=VT<( om9 {"f` ^ >/H(F J҉^PAmGr;xgc3M'cXihljIMcGHkeLsx(/`% N"0kYdvn2cmw^8EJBSX4-afV,. `E-,QB@2J@^N>kJmqv&eQpa u^UG$٪^W~ot.Z~R:iB꼟yÇmUJAGv y6)"^]t~.0t $g\0Q7e f9$l͆u=‡WB !mł\C v(/`#F^\#0k+~3[jl9F`TC=(R9SVO #X,Cʥkgl@8 :^<8`0i~랳2^l*Z*BTl׊c5/LQJ#90@[A$ HAfEiGv%Uvz+J4SXDk߫kf(ƸHlidStPx ]Yҷds` 35o 6P| (/`Md" mQpt#ޅY7M0.p\\Vʤiq3, vKq0a|"$c,nK#Y-'~Q=O(uzȯZݜwEW[ҹNں*i>өJ;}CCKON=y MwtHXpNQPZQO#>cc U*0EH&6"iM y=+ nI3;鿘ݻcidSo֡_ (鋗f1v4+ޡS7֡;n^N7% vXbqWP.}uGo_~T+i`ǵQ?B*QYE wFZ_b4)dX"jS B`3vgF0j#$4Ok"@)q|fL|:K02<4d`!x8y0Q"''&Ax$\$oGT$c dž1 #| ^L{houhn]EOe`n vlڀT>Kmރ C q ̷E9>'9H(O(/`m TA!@g,GK5ϞV[$A20787lƾS hT^Ӂo3q&:?d GMժx2ܻD֔+G~IKkJTeAT[)НCPm%jV%Ho[݇҈|kC#mli8 Ӕ 8K< JY=ϟ?a fM !iq@ +%4`K |pp& X40e&{=4Vkp|?`#R@z ]h 5Vh٪2(/`1%VP"@0ŒMuk?'?O9(GHD`8Vb[Hy0]j(bl%!XFOu<::3d0#3q M 3E-Tg)UKJ-JPbrM$鰺ѡc[OޥM8ǶctJ]ݸ~ 4GN1DS?̘"G:'Ma0pλjQ3Fy ij x53[bmߓʶ ۨ$L_en"!;-,3 B(B#H !a3!1M,P&sz+l/cS#Bv1 2Xx~V.ˬt"roL;mWj[n (/`%fdn&NDY:#5j $h8Eg "׿gg]rI=@I9@4ʋ z meY 9y 4P(+y4J G@y~/g ަ֫ |x/Z*Q^lR64hMW 6CABe~4Vg9$cRlʥu]orծ*:$ʡǁ&DASd2=ǩ7yI<nz@" MNyc),X3uõ柲^iƙ>0vq*zjSS͂Fxy%ZVqoX!_TtN-_/vm!1" mCOskO G _~jfMѶ?1oFfqn 7.,2}ea-Fuc!xDD1qѷ7F3ZfC Biw}P#P ϡüH.}#> 7ʓ5:.Cr(4MYS:8PDL/D8A|wgxm"ŋBY4,K/z8/u{(`h)sK镲:OU7tFYu|c`KԘ()IL:Hm:=5)Qa°Z Z};+X+wV+aL_p( |Gϧn[Gw)j5#_tS.=JONc[tCa] Bz+x|%~_TI-c.!4#j'>4+I B`,+3F`F ^Xβhɲ:D{bK@>d(9D ;@&~%I`#HF f53f(Y!@pۍlLO &kXl`C0Cy 16݀|Ҽ crcœ @IV`26xRXڧ(/` O!`G4WCA"({ D-m:!v0GLAk 11= O(N|r˺* Q&Gg5i{zfMqx:^YR@4D=%s>(C"frH 'H# yC^ >D  #9Um0V _F by?6|>sb0*?䍾T-<3w:}dJɟ}KD>B?m8U*u"-;IڱP_-lQY/$6Ş{ھd5늋!(HiP[N96J]6QREȣS.AOn"쁌"&#+x# 6vMsRel$$Ji8;((/`Sv^[#@kf+,jE}lj@kG<̽YG]SROϫ(=EY ?ȥθh( 63 r+FSLci\)vS0@ ݎzȧZ><+7h*E?jPn);RmBӫv $.=4n?Q:n >c) kK2a%DTt{KkxCZ'=b~6򱘟Op֡Xѯfzbw^UM;S&"bn85rsH.u*^8߯_U*q@oӦ`@t`[jlG ¿O/L B+A`FI  5~{T6ԥqPxJLx_)-7di& )F2 # 5>T<8_$潵v[,vL&rpcl;o@'XT 0l@*Mfkއ)J١.÷p9g+#jF'26(/`}M6P {"PKS=ʑ*d& /.+t^E<G.L0!'QgQK saYQKZMM?kK<4\;7#ߑbhD3Zň@?ŖHZEbq##:ýÙfk#Jy:6Ys!;7̅"!R\A|;ė/EsΖ2|i4x`lGu f<||HX BxmW+BM &k/(/` \$ kOɹD2Dyn*k[ @QSOKȬ-cTf\'k l4wkD<8z0$chn͹_1;%$yc>>Q!_8۩z#6ynIҤ~d,K-ĺ[F4yY8%Ij q yhĿb, L(ZqKV:iFnY=Su`5/3fNU$(=.eqG,ImS|tn]K=Pǎ $;8J H&Sq[ &}br``D{?[auڃ)I!uSC 2iuyc[V@` [iJoy0 Q@9l-O32w&r ($yj ,q(/` =@eb݅-|wLiy1*565d4D)PBfT~ Y{ d>#'5wQ{-P(ͣ4\WJ`*V.豫` Rա }[]9`E;M\4' CIB 3Xd4+ =~RQV^SB?}t驁C[~ޞ+QDdqt G%DU0cf :BFGP\_Ppzkk.(/`b-vW# kC>i̺0XZrH(MOKj%A,.яtJauVDiJ?&fpZvpLsI?Ng=&EpWbR7 _؃%}z+3kj(AzTAkeH$A&h a:j8jܸq q'V3hs canL#vf\w }b/>=YPBۉ=SRg8t+{ +\Z1^{:EϞ8CWnl&JGE'6 Q8 @&~[?SW+%Hr8j3 %PrFba`aԑ'Ma@],j_M$7 /[t9me5zۿ¡-7(n'( )RK4~js(/`Z R$ CއۗAL=6$DhGLG:ƚŹqb2fq5hG%X#>zJ; Q|}pO-Ю1뢬x|AS? e˂=Sǯ/$ GzvjiJTJ&=DB Û*/.]8 +}  13ޚ\ 4T(/`U$ TN"Z!A\X7ɨpLLJ/hRxv1LA3Kc8{,_O)I ɻ! sր>ȥ\@  yWm#Kx=Y+AӖvsRz@Z(EQmiu*ZTS(ϕ)?I φ0$툜 [ č[݇צv(|w\|@;~v9H36²ȡ0a]Pٓ6hj,rL-jK_Ų=V!)F~J27$f34I|= PAYH\y`J8G"s|!O0kZ`4Qo'0 a 0tOb207< ` v*_n& EfkAf !\^aZ N^[@8a)U^l+rcDv(/`v:!@H\>3 M9Ed3c/22 ̑w/|$ymu$$%ASp(Zsڰ\0/ C@cÕ!hA*Q-#9Ĝu٢L;sꯈak+ ֔+4*(FԲRHkeLsx(/`6 @g \v$gA(hYS4Iԭ,-,+"S]T2 r$0 ek$:2 抖P Ÿ+\+Z X1 ]Q LȨҌNS{0ڵDds*'SQF ̄ J<9]q~i^%~XX 0ӷ$!| !nxcv]]ߛ?0~((/`V\#0m{e0ԄrF ;1o<% aQSPܚi"fF "c-ni,Ms ;.d_/R>]?jY'TM7J;=@]/2>O#OI<GQo SɬÚcKcRi-)JEKQq`G?- #*L=\\Jx-WOH-[ p `>vDW#Ч~g+j9hB\K~ m=>|(>*>V~ -=en+KyOƘs]R ~ c  s, BpLǠ(̸j܂hZEhfvbv';SD/n@`JPJsB B`ހ#UƯQ]"=~3jK8 I#:VJ Ar= ~0h% 8`6i"8``NcZ7o W١AVG`X%CE=g7@ղa-y$s`fvJTA0 @X(/`  =PGeAXT-?OnfiV545ߟg8h_x*#H/g ΜC0zE {6ph_4͗F (&Ra[! #,aQ23bObWx} $. dI[Db Q "s\d񥴨@%ײ-8ә;Ù;}D秏4Gƴ0bt9Xz I%Eeef >FR\`C1# ] (/`#f[! Me*[82@).PlUGE]]44QSPfĭE4ev,ҍO)-2759C-W>)YZx**˩|s\ A}P0H:$ʑHdAdxᘕ#RY65<&ɟZ!;axCRa/&9cU= KܢpK7c˧GѩW7 R \;έO 2$կ=뼍7- NQuJ-zoP@y1LխIP e=Oy•QId,N潱uCAnZ ,.58 ByEa.P0],[0>B% 4< 1P":kz_%SZM6`v@Fl@*]K 1D e ((H-&8R0Xt(/`% O#0Hi=m2cm)n%Y큅0FLBc856嘚RY 吜QB<2B<>N>%ՄEM=ߎ|2`2EUgD"b4cNa-~,j"Y4A,Fk p`DBXX#k.q.Yau^U? *F"to'\*!K{KyORp ~ N?6U]Y&UBڟGPvJy"_~]t~.(t $g\0Q7e f9$l͆u=‡WB !mł\C v(/`="h# múiǯZ7`YdVs  _dY~#7ڴ%U2+8J۩OS>K@&Z_1:RN5n qh֎SDhI!uʶ,a/u]qcfDiP*0B`(ZM:#`7Nn. >`ɘjcz^zMiu-lܪiBr8s4PB!bmsM 7/aO6/Bpd"H "CyFiaUYjM!k{{2vݶ]D0K_kxjt5L/7.٭1Oŏ(/`% Sfcv3ZaԆ#$˵'q,؊ ѕl-opg#q2jl#6`)[,t{:f`Im,<| s>t^uXARöj\jٍ`KLU}:(/`% <"@Y[r7|' ⒛263*1֙Vy6N3eڰ El M?̀m],>!Xi 1Q> 頰t\t&i!j!KY?'(䐘NV>\d\cU4gϱ=g ýcy6\o6XQIB;Cb?4o1T0z*㎭Ot-;-(r1 UZ8fN v`2/j4мࢭEXhauP(/`}S#@k lEH;ְtzK,"״8 '7IJG.vʼnI0GD۬D2Vb8h ;񱜊'F7(dP5(uzȯZݞw=W[Lp,귵>-ab2Q˜탬J@OIM'&A*g`8I0EwriOޣS7;n|S;r͗Д_q c6܀L~t`-o qA-7Y J/pC4hrZ'BMn;yʤSu詞3Um^ $eK8S!QH0sLÄp$GrY^E;oQK PhG,.e݇IsHe`njВ>#|ί 4V5Z:|M :[^--H 6EY7 ,yFjc),c܀/}(؁ 1?U Emk?(ƸHlidStPx ]Yҷds` 35o 6P| (/`&]"0Md%aSJm>{2#j9k`cUUPx^P-r&$Ym+M"*h-c 4k,^e'6)c2%'1Yyޥp=ѩ);ᙕ|^2>%2`Gbq=h@w֪MlPSAFa0 TeV0Y0 f[ݱ6699}-D6*5lTzbE_0f[t}b=}FQ JSb3p ; []u~VQCj Ѭ*aQG=f9jaIɉ,:isD9>U۠ L 0B+zԉ`FH QWU!&bI+[)ȡA&$ĥ !n őCrxdyZӦ)yP bpbkhe";`a!o@& `p``QEl6X_]2OF683L9j&:.|s^Aoik(/`-fn&M(5Zͬ񾇾:ģs=Q 8 @Uei^&d<Uء)Pя^p5S,P3iL,;Lyo|H_sҫ-_PW3Y񫣴*|Y]4k)}e=Kǟ`_mJ|X%:0*,8 ZZ_nV׳f *¨CrgTjr7@ UIHD08 E^yCk>&N\˂=5)3 7[l[QF@6ܒWg|ִ׆YKX{گ!1"h_-[@ ۚJ!m>K9"lWئ`\l"bt] nF‰$1#6~M-1C Biw}P#P ϡüH.}#> 7ʓ5:.Cr(4MYS:8PDL/D8A|wgx%8W緵j×80lY,% s0%I(,:iEjG5EQLa*]aU'}-á,֩ߕ.bhEO8ߣ$P TNԔ{kt8 7c۔`:>#u5ꕫk?&%7 BBM % 1ާϵ ~GQ׮^UG B`4+@`b#Y,,=@6q;"!|a$#Qf߭M)C,^Ad @ Q@ku=32O f; o8{G,p6.3F&XFI*bKZN#O(/` ZO!@Iݲ/3 \~B, %FLA玖b$L"Yښ@І4(Ya8|we\0dG%A,Wr+]Y1DuaxAA!. 1(gA80̰L21bXI.8j Q >"N\}faumI [)+&~[vWg+Aclwɞ\̝z@wXhkN2^1 GWEKNQ';˓ ԘW[f!(HiP[N96J]6QREȣS.AOn"쁌"&#+x# 6vMsRel$$Ji8;((/`RfZ"0MѽԒvHfQ6ž8SRO U X~K q,[>ms %QdiL22O񶋞O!DwAWrSn-v{!X]^9S)QvK镲ShzaveT߭u1g$aiUM`q(JQN~ iM/|\$Ozh l%c1?\ӭC_Ei/n}xh?!R3)j۵tRA*pRN)3z;ڸYJxP$([iaJo毋%3.#O/^-F8F B+ @`FF.@A!57rPLK@bUYBl6|"ü~ZoKl AgeB`  CR=8 -S1 ,شy( gycC-o2g#LYmd'e,a(/` Q%0k6E@SJ ģȣ DGd FIE 0 0v>j󃚄iQ~ˣ0X3?Ɂ F2Ib[g+ךN̉iSߚ]ez`_tIQ4ZD alH a Z+QcIKC@(=McWnc%Vף|WDv Z}%'/XLʭߩ~Sr쐶07U eJ  7ruB9B涗kNmkiٿ!Wk(mP79b8Zn8NaA Ru Bh?a6T(/`mfu$o)"n8}m[.O؃]+*oZnji3 qŎFgxp\Qk8qU^Է݌4  -ZS3*U_&BW[H~gyg[=,2R0j[Z%.pVeO(/`}M6@ 4ؘ&|D`uI̶//,nlB,~H`^(o 15Ys+@e)W9dO3e7>_hXr+3)a^{RcJO*% |櫇=6lQ!?`c)6Fn==O!7f[ߊss3M f<||HX BxmW+BM &k/(/`+_$ kGɹD2Dyn*keE[ BUUR3KR8 5e ʌdma0wc@fXsl|0fۇEEv7nDt) n]KнS_# C:Bj]H0W&mX#cYZo)OY(9Sc26@'ҞŪ ]rN'ZqKV:iBn \$K{AFhO~1swEdI el Us Pǎ Zَ%D [0 p0o4i,~?:Di;=dPLI`"Ϩ EE :D2i1~%XCp |=!bX_&9NNXz۝W0;ք-Zb^0}kCq\#Tr6hG]lT> VǼyM Pvޖ|A՝n_E|"u2,WV%Wc PuҟA Y3@[z)K7&R>Q-nn&i^0KFitT "3 %PrFba`aԑ'Ma@],j_M$7 /[t9me5zۿ¡-7(n'( )RK4~js(/`pvP5Pg4"ɵY丆zI&EI3s+.+]#g+t$v៹:VX:Q§^_7&zqR&!i0H 4Đw2=dH# kHqUH ~D#)]k9r:6Ut1aı$UGʹ#2cߚ{q% 㭥]Bc;}`i:^KvJy9OOY!\,495Z0!P(/`G[T!0 M~`>Qʚs JKJK 1qK^msc42FK% k\Fr(v ;_f^4DDύN>ȥNyw` OB0(n3Q@]JBOP}՘:G ZҤBHD|Y_[bMLӎy@v @P*ҧC[w`Lw:T OPjDiS6+U UJ;D)?RK! L!:) IO$^VO:P6sDw&NЯ c!6 0B3 5j%l8-h!)~Fh~ZF'EG$ F;v^'6{pGnWp`lހ|T VKּAŢZ3FB'26ZŚ(/`68PgXH5trب7R2020w8PktG'X yta{qSa0HGeoк*Bc@Zl2v|졹 t8 GhTw<0r](w^+I i$ԒSnx=BbϽ ̃kfRx+fä́8fDЯ\3 Yp@ŲP۞ /z%`f ɝlCͣ^&﬽K¹ ]ݵdKh+=  ]FB[g6?!^ MM/N[>w#A30AGbfLoWc>mV`IO`(3- B;}0$R)/# dx\!X;i^{W,;h"2(v= fb5 ̂|2-c9 UR(/`F9PgP&\^#5QQ L x}Bd&V011#6O3w* u]B>Bo|:ha4iOӄe7C;-$h8PN S筇 V,dQωPyGpRy:PĻ9o5׎א[n8Uh)<׊JZ0h͗A};! 8ԣ(~S 1/S”FYX$׉ #QWQ$z?|CyOܴz) 4t֩} #hL} <%RrqH7odFӐ {f@̰PʤOe 8πJ(/` ?!@ilH->cMCs=1\s586 ]H؅,hj9}|]q<2FS?OXr|v тsQ%ݘiNvp_$N5bp5mio(2 @X{5w--ŠRSckl&AswdU(Kae-ȤRRG'7&9CHVW܀}-F&uܸlSQna0n v7#Ps{~ْ! _0ƴRo~}L ]l1[laV׌桞8,M<}÷F"N>} <R r9H7odFSB{f@̰E y|e'2g@[%Upq(/`5 E PIy)Q$Tuհ716>>:  yNgIJ?pAa d GQE-fy-? i׸"%iK/-J7f/!}0* 8X䥴_UM?7+`i=S^,Є;é]?qpVԕ|[m@vU5;0Sܽ4|<)O;Mv|[o>Wv4JQox NZ\-䇨(,:øD%PY=aAwqBX\+Ly"~g'(/`֠a# m4Ľmya"hlFs ( [XXMC=jt8QEJY4ǥ|ҸbY,='m,9Za80 {\Fqۻhc Zwg]jB_/CSJ>l0k/u[$*u^k0@R|Ln-WȴߚFSDiҔ$-(3#`:`4IӐh{ޫ졤j}1\$d1|tES>ŪmXB}ơ`؃j'}>na$oP;_zi}?i;v?߮% 1\Uďco9F/.Fݦ1¿]s<ƴ`C M0 @ m90_ۊ'df9ƔPB9ARpʥ`B 5mv{SW{b[}˅f5B;,찀/fVL$ۊa-IZG]x- CHaP e|avŊ,7,UVp5؞X렻&Rs!a7b:M@,Y1XJD w[h(/`M =!@g ""yZKZ1V2A2bQ4436}W #YOB}cLvUqEt k2QjZ= +?Pmn5IT-oZbjyb$_Ɏ",:adw S18v(1 09\طCCEk/.$ZZo Ra}2[~#A7(h9L%w‚z= uMt+aiV(/` YO#m/#Lv%`=ٲSBbU{;.DHDRZY85\>!okHSfh[sIUާD3ڀŘz@{!h_9$<~GrTZ8V_},,a;1 Q a=FaßZJ:a$ KѩOeߣ0Po{@]bhDhzet<6ןk PhW7_2i O{/s{C\#к_ݱZѐ  gcuC"]ԯKQ.f4vi?<. EaN: &`-aБxl49؄D;`bnWBq#l߀TJ6hF@؂IZaqTm'2ְ(/` S> Pg3$YVMlZnU|a}bk Xa554}a4ɒX ˄ J]. Js)fèqN &]ڹ!̉SNEqPTav Z4DA,9?v0}`r 1R5PLKFPk๥q`K|{i`N|Alc.jއ:Tkohާ% F/}r_XrWJ \'5,4$bHkWnY7:(/`!c#0mFM|II$>\%7=w~5X*Y\Xpq8 ha%-n,OcY`#,v{z<MGMs*;-Ĥu?lWm-ns- 2^)h2]A!r;}!뷵O#>c k0jT`Oq3x E5)nYGE0 A(rjLDRav,l\桵 4!%Ȑi-R .Z5c(ZeG;zt3D5@M4% %{2[`T 6#j+9vLEc`>i132[v f7#Q@Vӑ6A.(/`} F=!@FhMR6b.g u9454xJAycq ޮ?YC9W+> .zy|T*_6Q 4IYYzON) .gL SΕ% h=x\ SDۢyh<%U0,M;2R5QNL4z}?YOVj.M {|S/xd?6 Ph-s<2>oաS*Os/jۙyNڑz|n*:HB Bi$L;_{\j.1 B4 M.9@LZpsޔnDvœ zb=±`&Ml\  ߱A]ggzY[F21є 3ȾȩP2Hť(/` :TiK~۹Rek%~K3vgqB }%UO Ըv_G gD_%3V{[U<(/`B6U" m4lj7\sF]0Lmm(KNLRP0Fe|(wp*7Ek_ߌƇif(O8Bxzk;|ѳ-d,D(\JH8拯p1"gK85U8CS,R>|iT,h|"^J =\/kO>։u2aV/xlYs(05/u[>_%ԣ(~cks?kKG"u;鯺;Dnu .|򡺝GU1RԷ Ni(L;_]z> 0 B;0@{.9@f"-_ӏp\p*I6-lv2;Ć07RdZ}*{@̷%55r_l;Zil ָpt(/` @Pg ;<%hSH:e_t## ,0r-3lDSi՝jY(q6zkBw}(/`v^" mǩlV>-\ԡ faTWRo)Vliq8V/;+^mf0|R(Mh=guD ;hAwOnTjM)nϻ$"G[ -\^oN!m@YKРx=؈RşH-Fa1(LRR$0k@{D4 vYM0!*9P̎G'UO+n Vt;OݢOY0PtuN"}꒻t mG:Cw-OЃ:K8XպU<仅.q>⩶|PbKi4Ŭ]X4Iàhf+fXag& X4 @Bc }ClSbʧ/fiaׁL#"P\ }`V}f 4ؽĦ_1Y7lôOM^{/ /ZIeRVhDV\!s&*ĝoôq J쉭'2,z6܌Tb"dK]wL&XٌYKsjlg;,7WS\o (/`= R< @h 64ٝTЦl4H{:.333i}&F^_Q>@u&OnB ym sBD$ $d6Kv9)cMT{: qvj5rߠK#-"S Sܕړ9:8c1wwd"݄N=wm:rA=mxƵ=?"͕}F\B(dh9L%Vlb]!ݵJlh໇X]O(/` R"0Md%[k}~s1_'L501 HKI ;,W@8a-^ a4I%Z_O~o[҈Aum`jkt{ާ'h 뷵O>cL0EQ(5" K D0ly@7h v jM h\ł; [XNs[=n />RieԊ ‡meW <; $lA3OՄ7F4E@3还ݻcqŽh bc1;o%_L_$ |- EN  VHTKk^{ ٖ 0_;t*<+0)bXf..C$_KskbKZdlkBU˩am;/?ZO}Tsus}Sj]Y/Q=!(E%i~-*m__S~\RMBvzDւ45z±a*U@ 0B(Xp:ml%,`v g*_sBۛgE0jg92(/`gx$o4w.-U}žd9aS:V+qEvqq-7g_>SW78dl)hS:WNs+SC6~mVNiX.LsC:h X ꑜz#};[{x8\^c[hUͣx뒭fpW ¿acړHhNҠ>4oyF3LŘNYaA 0OqNcXWsu쒤ؿ͚DA#U_ 0/j]N5?Oԧ|psxN1JtqNEejQ~`E)2g\kL\=3a :s_OxiPPd ɯj tJ,}6E MJV0GpNrI9p 4N9E#hM KS n0$6ڄ miK`Nl24KzbP+d{e%ZD>EB]0έL04!ā(Z)Ĥ !7 sݗ!B6CSccZ"ƉjYEd5Wٳ5Sj/q>C ڄL2)dfec pɏ68j168*Hj%S.|(/`/ >@eD!YrTK99566U Gh9p(pWFucFÅY/r,Ϊy|3]#i 8J @5NvX[ShVXC0賫Tru‹ߣ<_)=9gֆ[JdaR>ELrȓ_% 4~%tKJa0~>/G8+Xt5 #N̲ $# ; P-0)r ..W\ [oZAykY (/`.-F]"OewZ.4Z@P? Z,WRD~@RUQfY6%Z[`(& _k(]{A1I V敵|U}oqxo`kˢd }2g$qIh8`;P闌Y\+Eb) E_$E$Wl r A*ѩhS gk(_KEOkNvb#ai=6 G%ԓ_y?@vt< {;}埞|(`xguvP~>KOZϓׄLDSgi$*Ձi2 1I6%mRQΚA{& Y$M(foa.G7 Bc$C 0A) aўbzF\vPsx|$ ~jĀ!6:G+N$Vচڀ QdD@6]<޶Y>Zd&"0|RҔښ2]:(/`U &S=!@gLX tҦ,!k=Vgֈm2??YI$Im$ vHNP ,W^qN!# v9pk:o'+ ^hL? c"uG꯺{Eu1zu1$)EuGdUձOfe^'UH_f2/ daN ;A)Pð#;hFpŹvB@6 ),"!95ٻ Z{ ,?c6Ŵ;8YhM0O= M)(/` ^Z" mh",[Ns`GcvevcD b4SULKTSؒ@,52FtˬIa fA5Z'oݡDDHTDUkP< ,+1#2eotպF;?&kmGQö+L4O( :McG \}ų+i&PpbGTbkwUf&'˚ M(/`֟_#0mFM|I[~0Z"уKWXS3.cq9Rѿ(;c|JXY4 En͌#Ex@chF+hADﻚ.eZZݞAD/x?uk P'zt:4tH7ǫFGEe_Qgla -Bc` c)iypԒ ;*/ӋzrEJ.A|,FNi( ;|KϩnקY1E3F.CWޝdOO t#iĮ֭:'m|'ѫB/}OS%`q80n@ID@3还]RD &! #eU,7c.2_zxPE*" -So~#'Z32,8"$~ I̢JaZFF=1ݐ4=`&M$_m,E5 S۰Eaa vl;B؁ Hi`]e4b(/`= ƒ(/` P! e0am\E>h&khiFHFKRIZZnM4eV' `QEDO`y`D _QNʾ[ Ck 4(vHCktK4 (?[ƙXg,畜M´%G'߇s9:or.,Q0u<6חs(X`WomE|W= s/?sKs4D~ujuoj~WS.ԯGoY;MXn ?wDa. $%N X܂t>쓋Pkurļ gà@x}VYfb3*A 6Άdx̬-VB([>ɖ ' (/`%f$k%q3v8A~,V0ic[X@Ta (Jc * deI<Ɓ81}i a(g `?Ȳ11* FebRZ@Y]J_*LlB)q޶qKJjěyFn&9&Wd=ηպX+m K#XJrV%@$@qZ{@ $A'"IN==E$:x HS9ӂl]:paay,mvBvK rKX5u[<΀A;KFC[k{:%K6e[/7Lޭs!qYSiiEv'Ena2`SY}9h7r'K.ן^)E aY/( B` PńCL<0VK/!4h\8PW3𳕆,Ê@j>Y$x^~k7ajzH>sP'с3ڼr$ j"aXaW] (/`2Fac" mg&$jVWV-% Zꚢ.pZ[W32Yc|JȸYQa>k3Lވ1I%Y8G`nA!#֔Zt+ FVPhSBz ]zt@Χ5(4yU:-I *]awgtX[S4QhDEA)i F88+&'O ϘqO%M ԋ${^}|4 ~&錛9%#wvLwF uV Pk)JsUN$or#7?Nv/h|!nD/]ҿ槌FFSZHGtSi[S %4Bbj #g0*C/Pڨ/e`f>֯)VveȲH3Ţx$0NZײ  A!p"Wu0 /ӮkښÚj"E)[fwp¨Sܶq4lؘ'Pn}ūD'ėJK24W˚iДQ4ISE(|ʆIb\>{C0BMn;yB{/ҮgeχوA__w}8Ms ZI,i0b QZTfk=]i݅ k S* -3A Hl)3|-Hmee[J&OSks޷;-OqIZF ZCj?_?U|Zh 5ZV ׳ REU %=@r|AGߵX,&km/P8/ZkO#8?Y (/`<}^! mǩlV/2K@ N0f_TgHd`VXR bP/1Sl) vl01cdv'`m^8^&qRk-Ky#h5P1Q~wRk%m)t[ޟ<% n  T^oNbӑ`.Uzc#R/WJFR$aJP vP̨bvċLŇljݪ;}Ƈ}y_oPm ~x#1RJSƃ? Q$aCjfBbT*,xIڎXȀ(b~6sakWM^.PSeY: Ӏ$ ƞ - NjM*N͵I+VtJP ,3|M!< 6i $tsV467MHIFwrd6fŅ a"{j j d?4 3;COYH>oUYg(/`!q4j,[SJ˩|g@!xa mzg\ZZ!mTw4p8p*ҷϘN1B#'1o 0$ڑ R}5#^; /j|j0z}hO- T#Bk;`@O@$/s14=4( S CBѺ鿺wj Svƺ_U8 BVi9+s5# l\79!,sjc1l(O;dJ 98n@YWo@"DDJo²l 3os& 9/Fi$i(񅬹$(/`% R< PgAMf(/` vK"0M4bsYnZ< jiZ D|501 BCA59|Tݔd!sƌT40*[@SNj&Y }ʆr*3{)^E'ر[=qGz)#}۠JVnq'V[ y,q+y830 V+j|.Qw0pE90;0_ZRV$V"j!c:F}d,Ky<قy`~ IU.Q{}bL}9E{&ubdv]YaV/pl/1@om],ss?s a~խU ] ʆ~>!UԯGQ߲nQW0, $F]N9yHȔ!æ?XL|mjnbؘwn^q  1 䛉l-ls߸̌-o;GT$R5 XȚK(/` [%ݶ:?bW_ ӛ5ApveٓH SVLf#p-kY¸Fq ,VO͒D4=@ Qs$i2L% ~Er֮/PǻZ|Lb0/vHYD@)g1* zс3XOcGA-PEY0V<@c0&kThws fuNaMP쾚r^W޲ܘ(lek͗BQipȴ0cQbs,)KhjcoWM,>r-ުJ, //HmN8gǛz,j[oƮW( B,X'X- ǃG_I(m:py AZHikD[Wau>(/`u_`%`/$tVy/y/f=FmQ-]K~ [hĪ NQW-Et#: P =RPa½Ś6l(G,¿<sP\^44$ I\ D  Bb$,CrQbāޗ~ KfzkQy &u@3{DZbٵBol14lEaRqDж\^-jvbn/k]9X!I'l(m\ tu R c c;9 e:F%ıo &i(:Esq.}\PA{}jP\o{ƺON=ЮK1K4*4Luz MKVTkDj!aN{/{ a U^)NNE_dU߶N&!H\C. EN`[.$Fsr͕y\X:`aN·'lJp  :o&T@fwd L6+ct:K-&Wb (/` &VC @if\Ub_x6+„BW-#@-I(p0=߁zL\Zi:92GA9U͒ :ՖHn8--_^E0`\C_C}ec%#D|KwQzERIJt+',}oPS'C8!łp$1jԘK"o"G:kxj[#¿4/ZFߧog&D7~øD%8Y=aAqBX\EZk(/`+= Q"0M4hNSNPT\}Ƙ0` = hIHH? $a]R>|iT(Bi|"^LɘՌ 0,H;|FZ]F4?1,ƒ#?7XsჀm~ndOuF'ԡ(~S 1/BV,dA<@rӡēA5%Ek2i9ivuLX*=Xs}>Za_tX,YrRūYR{rFҌjZϋŖu  1} {4 T#ci4g u, K|֐̃1fx9NX=LC,y]\/O^x:o5ǣy X @or;C SJcs}Ȝom]P}>Gssz$Xv6 LthYK#`:\ Sr#I5DZOA9$u뿞r|6M_#b0r& $U -N ؈.Qg8{crb޼ C5Hj׌|Jw6daY7aKѲrEдDm&D[ B]$(/`e F> @gl@"΀}j}-V5l574oek${ ;LĎbG׳JpXΚWmw2њk ;2)I;^ay(1%Y n V֊ڄZq#!=_tjF8o ;AzDye/{v{ah)ti9//!믶T遄PB*+ҖEl^ՇZ}vK>%jNO ,0rx-3hDCi՝jYSqv{kui+(/` ZP!0kAlضB\}s#sUPGHFʗXQ LW u'kXe-<>ۭ#$:^q>ʹ}P@F RּCqK%AU@R.lDcL1Q0Zz8L?Jr> EI0Njw"X !yg85?gP`c댺=!w!JtBwxAC|ABC?[өdHwt Mxw 1UI̻#b&z&TF:qaƣVz9X, 3 鉗R # Y ھbS [4q/0 M:ifJ7hQY-7P2|e?.Ҧg\k @(/`u56@ 4 iX&G|Ĝ2f[ ..- Ȝ{ Zp+~h_ X6н:%*3 )v9dO -2EM}I VJxR)aߛtjI';&4:a0iJ㑦kJ}Ól9׫=!C_7so@ldQ|/Mh FZb  F)=@>.[K<, r)V`!UP(/`z5FW#0kGQx@ D~icyFju`9MNK?L9|x-q6Co2CJ@-旼 ZϪInv%`k *:PXu ;U髃:adҚ(I [ꔜ {ڍDžs 8 6= $UdʾVUHټqn!!ARkW4~n5JN}VmǙ8k5e mYEc/ !N aY!RRÆͣ8q㘆#[T\95/H(ڗكCE@$99z4V8ycl1G~E"i5 EeUh&!E D\5䰂D:A^aI 6cNU>؃[ PvHt R&"\ۀ4cglyduQ,$3 PSK6~ns(/` >0 eʈ@|2I%-$`z$ w0A655suȀ;p/A2G>Թu/?4\zXvVt'ȿFtI{ QAJ5n6ȷHXma&%gOxGR?Rb=?Mvclm@5ǖ~}{dу-Du ֽBE 8zu.~~M_oח(7z2(f G%DU0ca:BFGP\_Ppzkk.(/`bvW! Kf3' >@8RKw|¥!4 8W%"LOKGMGrJcvVdq~?LyD%Y;atN 6䤭%+hzbC-+YW4@ cѤj=d,wCȁ,E w4ɁwKQZ^_1{gѥCW*c9F9n'̘9eR1T诋lY#2U-[֥pȺS . 8u% PZoߠ8CY~QJ#Sdb$Y\4$]@,8ϻ맊 Tkix-3 %PrFba`aԑ'Ma@],j_M$7 /[t9me5zۿ¡-7(n'( )RK4~js(/` 6B"PgǢ  \yl&Bԉj87;8by/! "{qI^A k3`F 5]I#^ (/`R}]# fC"}Bcrj`*b+]8VhUUQj9h4 /j9q0 R^o[Ș%`\ał\Ɖq{ڬC5L8䳩xL<ߖqA]-4 *yO퉦}mIeoЮΐBԧ)n\Q{#EYqqw,{q]_`waa saY;E-fAӫ:@XЅ-'jr('E90 JmI/ 7@|D?2dg:3hp8˹k4GS M2Ź^ ?ifنelɂg]ػ7B|[D'\0͝S. 0%t(/`- fUC"0i`V0 u;=||FE ڂ#rr`a 9::lҞ)VlU/gMp%m @]"!m9Qq]R+b['Qlwndøoei@4OB =|JObW}G#ySs|"Ϋ#UYˑ'u>K=9eߔbptI(7ߛH&qEă1b<+mg_SNI^A+3`#PFk`(/` vj%n Vҳ- L)k\Muuw ˢ96Ϥ&d.ZN@.=G>yOZ1МNyk@ucȇdf$5\;FQ|ǮkMUoY1:t;os11:a'[;.z=i 5dQ;mj{1aB⾮el]Sc1(`cz3_%1؋Ҁ \DUC98pJ8`h]& ƀJQAccj(AC3 'oU-~v/*~(ceBJ|O=]s8xƨ`5r$u׵_U?@ӑݛLS6ڲ< uQ}y]#P:,nŮCzfL뺦aKnz߷ozMi91P zH(EAz<MY%3BC@HXb@B0RpFD`J$iP@Y JfVuWၑQA?!wX _t=B$&ˍ/ڤ/̸vZ:ILi˚V)y ^H2;)Y"O"!J2F)Z=0bJ5KRGta6ɒRh:ڨf^HU yxKtE#rk3V䊐т W~eG"BKX|2> *טĝPbkaf!ERn*dg1z^G-oML: Eg5M={S(/` G"0i!CilEt϶)G 눞p*=?<P~/eA3^n/8(D3<;WC}Ew>Ѫ8/qE+">Lt >9G:1ؤDiT"F@`A*ؗk˛n?c܂8ӂϾ npxҋt78"{)ieʯ֭E6),. H$A'ZNw8ۥU7䆏|X0wRU U(@ŕh)Q Q ӸzV E_A}p7Fls38(/`- Vfu$o4co\({s[Nۻtىg Tilh׿s .{Rl@R+5@踵s[YA3~mׄ&> r[)̭,L;u]/x@罫0蝚t'Xg Niq5"vj^ԝ o_2^(_H8PGec BRy<`7@]dFff+5758\ " 9u }~ gMy.e/V߄?2oY%@Xj s)܂2y?B4V7D=fY1G"I iȕJ-9:=zzj$?Oka+"7W:܊a $N̲ $# # 74T-dp)ʈk\ 7VX!(/`3E^"Oew.4ʳ[DP? Z荒lG~@UVRA%BeiGrkqe-aN0F\$[fa TNo|7SNa{j*(((ڲ*%xzZ$nAcA (@j~ɘ5w.:NimJb 564 E57/i%4b7^$:'# }~σ3ChX1Rʂ(kI(: Ucl\ORXlG1V8Vb(04^HJnq 4NxZḴ/1i,&tؒlH|_Zd.A ݄ i+Zr*u{BF>6I~:W?VCo F%DMbf 8Ȑ@R\`1# ˻\ (/`6]"Oe=soiM_*SVP[Nauk%q]ak9/nƞ9bq s^.a;>8?Wϯn+C PGcq0UQqکX67("d!476֔84 xyk gJ&\+"bu5M\ېmi\!K `$.k)F3IPATf Fc7b & Tg}N %<%qqy 7~J,ndr8#5!,^k/>?IQ -I'ՈhTsaH-It2D֔W ?'X +v@ƽEѫox5<3"`M  (/`z ֚S#OecoZ.MkA6kR.$~ "JILWu0Ei® QzX3ޒ&Pir0좫,ޥ[-\9O}+2.M h#cyVoki C-iq-%A*,' S?j 0_e!iE_| ̯8\9 &{J!(50B,Ϻ x &YG(b]onV]eHVɰ}L_X@͉rpDJA SWR.Q4|Έ/x4d^!kLSF00OI1$v]Uj{Ul6L\Ϗ1*NHѾmm}KܫLZ5KB+X` _꒜c +uoihiL{ ]˫J$s4-FQai_u 5 py0#+y[I˾KuD8#|zsEc/[K ~6{>)Qp/AQ75瞓_N V0{DOk})s( ?LCKY;4UE%)Z~E*C B`K2eDa@qll bY!գ0α*߂J!X: @X rԊ4B (y8%)I4-Ma^z>=Nz-6 o."!5{dYqf{ ~-ԙDC%*YjMcK L[\x:(/`xM X"@kPpdGso"/5ކxA7ɌᆝOTJZ(>N/ c$ Wb%YV QWiOԜGjEFӪn;XjLӍ!*z?5Nn-x*W1P38-Y$F8 p n[0`%`Lbib8pX vT~9Wa);&s{R^␏N؏vچ+e$ @O=ӕ/ygfrcrY?~Z+~};tz_J*WkUY1aRY$Dz4$g# ڠJ֐$ML!cyTEuÊj&Ln{8qjpd b% [͸ 3b<½z0Y_bGZF~nּCm ~M~nkbCݡCr17_~zJ K-+,f5bLXw(~cW=:jEAšE{qL>׫ڲ| Q:tR0it46ׇ=j#bG߱tc؜@L$,C%),)Y3I3ϫQ#$4s ԷsiƧ* Bðt}@ 6jP?ff0Æ޳ KsO70|NYlf[%;d,@̷a94Ldƀ &(/` vA!@ KX7-7gG4NJ F698m1i7AUWL OT&aa&67mvS>8~ 7%i6CQ;HhPrkVwb^91Z 9uTZH᜵9R|Xr({8'vǁy 9er'I %o>AQA^)*/NV`.1$ +WB&au` @rC y߅].&rZPa7Vk(/`2E P!0fh6p'FaE#6UN"c(sHHFK#jK(xUفZa,ˢsgĪ5yUcrG"J5aj;| ͳ-mM|uCT8rzeco7>M,), "H Z#~MkCC bEyL|Wr'|룮×!} SJ8cs}_|j:$G߱|,0鰱ҒX#`:d%$ziA=M݅O>P͛I;c?f' $G! 3 u٠B̰bpܔ L207ߐ 2Yl{a{XafmIZITu%(/`F: @Ie>yy7oMʴQk\/22 Z)a+`K#Zjg ̲⸚ܐ<:݁4zP,8I^|ʖʉ4c9pȿd/ϭέMW UT/rP8 J"8 DIhsx(:n6$#2烢j)#߷XzeOY@+ ן#?J \`T#&@*A3,y,4CF[jsiT,(/` XJ" m4a};AaVr:2]HJB@ATY|l`8vnb|b-q茚bali-t6 -Џ\J1FD]Uk1rsur gqRFR`ۨU%"M1Ő.M+~kPN.-|݁,T?y5RYD+paA+~\aɿsrKWKSM)R)[wGj{j~YBHGX~^MgI'c=u" , (3Xu\cq. 9k 0o@YXut ( [ 'I퓦l < ]H(/`p- X%X*2;kG+ljD MSIu==Z]ԲZ5'aEֈgy5/gk_NH/i:޶CH͖SH\9)UV[\quV R IrUɹ:]U]!Q\R(΢QDS`Ө369砈(GaD.jJFEI" 1meLt{4~|SiEo% $ !3N` pagGla.`.X̩ynPJ5mdo,=ОP-CEc)Z,̀+W(/`s% X$ :[TYR?߯ºf$٨1&OPIoREJ-N4g&j0盳D 'oL[X,~Ξ$&Hr ML%,Ӑ28 ]l";^l ؛L9>euڑԻn#bue41= Q۹$S^}|4J/ zSB;&NeA+x5'='AL5\d0ؘr(Lb=qU MlwdX`{f6 3cKQ&c0L'CZpU:(/`9f$k% Xڝyb/Szm`d ` B0+gdXN/"]$rӀP@2qpr_?KU֡kDq84.4fLj[_IrB[J(/` 6{$ jۃEh4H)l#IiT%@sooh^hp]9YPjPT_^b0=1G0]kois8qR)fVQ1 q 5NJ0ؕ)^!x5UϢ`4y[AFX8NIc֖xao}1^0zH `% 2&]`P-?{>N~ *ޅy΢0ۖ`أrVҋȣ A! SJ%λhmpV+ί4gW?l;AAw=N3I;5( j{sN48ws Nz+֪E+{U(s)jd瘯[7Bh5! g~w~eFɶiUCH=b cy<>"y!D15 ER0B`K\gkp~ l-޵ X ªH -460 Rla_j')v VYP "$BJ_ HI>U *Sȼ<0ȱrJ5Wq ` ,ZyROi?J [2W47UJ<- Dţa]XzjvA (ĐVtd:EٱMgnYū{!'H0JaMYƜ5 PY!8iLOⱂ9vD{1V ^ӀC;9`*= ;^dZKdT|yHlCkѓelh9G{݄ -+rJu5~\uD1;o ;%X +AYgAbDxuK\ :17V ?z2(/`v!0K4Ch$@`{ ڿ6 95T!oqi!yI,Ɔ4Vs+TUg؂r:U)[ty\31A"F~؀M{(gGL[1q2Zq6e5IRȾ_%׽cB!$ic ؔ4~8BcXbk䥅?6?18!@P8p^_<EQjrh EA"8).G2ۤAwJNtUy0ʻ,N-L}sD^Eqd{lAz#}݌KUj|kj3jQTZ Z9Vgۇwc7[?DbZOxٖa$t4VғX'J2[tp~;wLG/:Rk/W D BEgeF$Ch-JH 8,( Az,ĺ0 p^ |0R ]@ShTZQ&% eHgjC֌4^oeR"6Y&Ig;O8寏(fVF 4d%BEdC\M6DW{BE BFMʗE(/`< 6K!@K$$Pk?LI*kb3! kLAAC;a$aGDZaX)$,˸`eQZmcƩZlwzW].QPUe5mDhm%+9ZRxt(4-'4^Q[qiJȥ9CgI(((kĜөJ3}&=]n+;ҥh:99遬HX@xNs (˱4?ww7ohun~Vr)8tQdЯɀ3{qDZvi?, E*0Nou3`6:=*Fr = ; L{o@*Sdwmh!Yl.vƖL~.=r`+Lz@(/` ֒;PADlأCY;ԍ*"k223Tb$yRg ֑eF>J#m IOڀ^DW_B$>u]$f\ zE:@Ue]@$>#L{y~`WBQ*I `sQBĹhJkID' d9hFBg~ 0|L@ձ~Q84?OtwMpb\+ wZUHJ@"`{RG[/̱aaV1+@p;(/` S# m0CYY+~p`r/gHd`HJJ?ȥΨx( ?6+LXYYE2:K{<]DȻd+]HQS .BCV[ cZ[mU9 B(3q! E~O(.U AA?+,Ml2ߺ,epeKY^F-z0Ʋ)mqdOY6ɉDy 6koM/U:(/` R; @A׌\F,:`^&f*: cr213ڟBt )Gwq0 T_%%/Pmźn]Qe1(V#VҽOV6؟X-H0iC(r%1Assu/Nvaب@bHTVJCt̂c 8$_F|?ΉwJDi~d>4 G1ܐ֚IplT"1mRX$,YB_ea V c*KA(/`%ZR# m4pvq#q_}p:uҳ54HHI-91:j ,\b^ Ө,eiMt:ʥ92!: t3nΑCzJsBQzې3p&qa!`֘\Sbtip)I?6yS"yܶ.T3Gi)P89 I0X0kNtz,B1fˀ0g"/q̽d[4녀dzph#=cٷ_Έ9йMSKljiH]dXst(/`= B @ cF[\wk%GI@1(g v";=7Q,1`:Ϗe4B,<ӫm4beφx9N.5m[rC N |A\30(((!=YY@V4(L_nKc}֡ |U3N%S]qnxRVhAyw;5%̄ڟX~+vu|WGX{KtgK(R_Oed8׏ 8hif-!d8 awYh$|CX~r'(/`3mvg%o 7'pnAafg>0څa" []Y 闝&.޺58L5'~1ѵÚ6[NSv?NOvKz}O{r[1Gw>@:OnKWG Ne]x4*QT"k쐽T]ztEFpQ[d2h2D(^kg5k5+g-5ZwZkIƮ=W5P&t@Fk׭KU^;T j> "w3h#BXCLp1px@"R9"tŅJ H$CդN:)x@"l,S.kwP @B@Nm!4K1Lg 9`̘2̰##M'*G' kx>oN@dYr AV^JpV^zHExڼdC'FijX6v 56p) $$66܀L~nb@dRI$G㡦n[|O(/` S<@eO\My1*444jw֌xpPc#gj~f>t']D93J @->!.M B1jHZǮ*vbбut0htJҦϵd{Cq2KQ`r~M^qID~ȕjבjϲBFz-KO ϓJg\ 8=% aهґ/ Bň jb2~ov@(BU(/`vZ"0 ׂ-}$qIڿ:/HHI9ORN\D'SZK#Z*+-(67.!MiA0SC)#sJ~=}=l֭ {w̷c :DzP}Jԯ~Vp9@Uꏣ%r RMā5R9YKƕ\}y⁝` :,S2ԭK_57i ;uƮi ;' x/Eozުb(8k_A_TU_^TVA[ROV?ONQ5'8)ؙ#@\D%F@0EK2LŸj ر$; %|ơcȇm g'l`{|h\( 3 "X^0VK .400!:%n~q `' y2"Y<޶,&C^G8ԗ9}H$I;--4Vq| H(/`v%n.I<ؼ2ْJ$wDd#tfVJn1T4j`]+J9 Z,eX04ǂ`."r1P4ZaQL(x\F-$hk'\ɡYL</CSGTjrrciɜJvJ^'95%dExurЈ# i3x,z'?:Cl5X'Cc=YFq BJY4 u9Rt]3:%D4Y2DZv*$,( 31OQ!a.I1L0=rlb%o15e',-nʡqH嚔QvFKzH6t: Gl;?{2]E%(̣BQ~}s$Y 8~ A(ĨPf$1LA)@Mg܁r/]e=P~ѧ OvkLO")1LV&IY tM@q -DzK˕yX;t4: b9jxMN-ң+,6Q=P(/`f\U"Pk ;.>iTD؆;؈EF8؄MMJ:G]~я.h4cy IHx8K?2 e A0 4bW3jM,!f  TcO qĎ0$?vR |tZKZ wyڣOa( iwibpq铷XNx(]7<5 ލW̔1etЎLoU(6ᔯ#] oP-za2c Nleì= :Ǚ'!$bX!Kz%q׿F>{C j p  N`GoXA&qNx5`g "NK 0I(/`m.p 0a$n+ۋo%wg Cn(ߕPvfj_] iѵX<͂q@PCAPAi0H,uPY#=Ω0 ,GRA(Vzu͏Y+#ġD+KU?TbY{ʍԾr+y*ylE#G((ॳA fPJEh۵>KA4JCGϲAS!a!IyG%? pvVzAd,x|ബ-C|i#goqEGɁ'r?%p;ީl %6J4[s9|@lil $Ҕ.ld_ FA>8=#O.9@(Ĩ@h$1LA).@M)x%^z\vB >zx `V? \D2[kXnE&5ٙG`Ҁ&У)G#l ѕmgl M'(.%_ay*sL(/`-m FT?!@XڶkZ/ bb?^656~YV PH*iCc5K,)\of>/~R`ޝv. Y-ejDbb|&nCIPR-a0Ť|J?\jDaHtJ;QDAs;B!뻔n˧o7}]2!II)~_ܙ{{Ïew` ]Ko([w:rf < K]iZ?لd(e 2C{ْ@lVMl0$libzypp-17.36.5/tests/zyppng/data/downloader/primary.xml.zck.meta000066400000000000000000000011701476576476200250750ustar00rootroot00000000000000 274638 e5b4a4abe414f4d71ab4074605b05c09 22d7d67a9f7dd879906c58842973957dc4fe506a 2f13f8abd8501a05a66e4b9dd70e7af5b3977bb8 836b510886ff38a29d344ffa629087be134d1053 %1% libzypp-17.36.5/tests/zyppng/data/downloader/test.txt000066400000000000000000101432621476576476200227070ustar00rootroot00000000000000Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodoLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed libzypp-17.36.5/tests/zyppng/data/downloader/test.txt.meta000066400000000000000000000021431476576476200236230ustar00rootroot00000000000000 2148018 7e562d52c100b68e9d6a561fa8519575 52cabd59ecb55096447322ca99364d50094997a0 9916af41e079f5758d62f7bae3d74d8c5f0557c1 852e21a1e914971c0544253e5d8f853b181b13b1 f4cff1a07588a9ea22d8c193f75988fb00c45306 c4ef102565900f4f6669ab8596bedcb1ea6f1451 3cf13de7699c8a97e0334b4c5a1982f28d297f0a 489f0546839a4cd49e0eee1738953b327bbb4bf4 d5739177bc6adf319988055388d20dc0908aec27 a29de2657b5bbfb9da52d44858fd41eb09d972e8 496bdfb70ed41fa5d98ae7d94843206f2578c328 %1% libzypp-17.36.5/tests/zyppng/data/downloader/test_noblock.txt.meta000066400000000000000000000007121476576476200253320ustar00rootroot00000000000000 2148018 7e562d52c100b68e9d6a561fa8519575 52cabd59ecb55096447322ca99364d50094997a0 %1% libzypp-17.36.5/tests/zyppng/data/process/000077500000000000000000000000001476576476200204765ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/process/echo.sh000077500000000000000000000004531476576476200217550ustar00rootroot00000000000000#!/bin/bash #just read from the predefined fd (3) until we get a single q and echo everything else to the predefined write fd (4) while read -u 3 -r line do if [ "$line" == "q" ] then printf "Byt Bye" >&2; exit 0 fi echo "$line" >&4 echo "Received line $line" >&2 done exit 123 libzypp-17.36.5/tests/zyppng/data/provide/000077500000000000000000000000001476576476200204705ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd1/000077500000000000000000000000001476576476200211375ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd1/file1000066400000000000000000000000161476576476200220570ustar00rootroot00000000000000Medium File 1 libzypp-17.36.5/tests/zyppng/data/provide/cd1/media.1/000077500000000000000000000000001476576476200223555ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd1/media.1/media000066400000000000000000000000701476576476200233540ustar00rootroot00000000000000openSUSE - Testmedium openSUSE-15.0-x86_64-Build267.2 4 libzypp-17.36.5/tests/zyppng/data/provide/cd2/000077500000000000000000000000001476576476200211405ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd2/file2000066400000000000000000000000161476576476200220610ustar00rootroot00000000000000Medium File 2 libzypp-17.36.5/tests/zyppng/data/provide/cd2/media.2/000077500000000000000000000000001476576476200223575ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd2/media.2/media000066400000000000000000000000701476576476200233560ustar00rootroot00000000000000openSUSE - Testmedium openSUSE-15.0-x86_64-Build267.2 4 libzypp-17.36.5/tests/zyppng/data/provide/cd3/000077500000000000000000000000001476576476200211415ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd3/file3000066400000000000000000000000161476576476200220630ustar00rootroot00000000000000Medium File 3 libzypp-17.36.5/tests/zyppng/data/provide/cd3/media.3/000077500000000000000000000000001476576476200223615ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd3/media.3/media000066400000000000000000000000701476576476200233600ustar00rootroot00000000000000openSUSE - Testmedium openSUSE-15.0-x86_64-Build267.2 4 libzypp-17.36.5/tests/zyppng/data/provide/cd4/000077500000000000000000000000001476576476200211425ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd4/file4000066400000000000000000000000161476576476200220650ustar00rootroot00000000000000Medium File 4 libzypp-17.36.5/tests/zyppng/data/provide/cd4/media.4/000077500000000000000000000000001476576476200223635ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/data/provide/cd4/media.4/media000066400000000000000000000000701476576476200233620ustar00rootroot00000000000000openSUSE - Testmedium openSUSE-15.0-x86_64-Build267.2 4 libzypp-17.36.5/tests/zyppng/io/000077500000000000000000000000001476576476200165165ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/io/AsyncDataSource_test.cc000066400000000000000000000265641476576476200231310ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include BOOST_AUTO_TEST_CASE ( pipe_read_close ) { std::string_view text ("Hello from thread"); int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); bool gotReadChanFinished = false; bool gotClosed = false; zypp::ByteArray readData; BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->readFdOpen() ); const auto &readAllData = [&](){ zypp::ByteArray d = dataSource->readAll(); readData.insert( readData.end(), d.begin(), d.end() ); }; dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadyRead, readAllData ); dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadFdClosed, [&]( auto, auto ){ gotClosed = true; readAllData(); loop->quit(); }); dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadChannelFinished, [&]( uint channel ){ if ( channel == 0 ) { BOOST_REQUIRE ( !gotReadChanFinished ); gotReadChanFinished = true; } }); std::thread writer( []( int writeFd, std::string_view text ){ ::write( writeFd, text.data(), text.length() ); ::close( writeFd ); }, pipeFds[1], text ); loop->run(); writer.join(); BOOST_REQUIRE ( !dataSource->readFdOpen() ); ::close( pipeFds[0] ); BOOST_REQUIRE_EQUAL( std::string_view( readData.data(), readData.size() ), text ); BOOST_REQUIRE ( gotReadChanFinished ); BOOST_REQUIRE ( gotClosed ); } // basically the same as above, but we break the receiving socket by closing the read end // during a readAll call. BOOST_AUTO_TEST_CASE ( pipe_read_close2 ) { std::string_view text ("Hello again"); int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); std::mutex lock; std::condition_variable cv; bool written = false; auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); bool gotReadChanFinished = false; bool gotClosed = false; zypp::ByteArray readData; BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); const auto &readAllData = [&](){ zypp::ByteArray d = dataSource->readAll(); readData.insert( readData.end(), d.begin(), d.end() ); }; dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadyRead, [&]() { std::unique_lock l(lock); if ( !written ){ cv.wait(l, [&](){ return written; }); } // close the pipe here, breaking the receiving socket ::close( pipeFds[1] ); readAllData(); } ); dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadFdClosed, [&]( auto, auto ){ gotClosed = true; readAllData(); loop->quit(); }); dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadChannelFinished, [&]( uint channel ){ if ( channel == 0 ) { BOOST_REQUIRE ( !gotReadChanFinished ); gotReadChanFinished = true; } }); std::thread writer( [&lock, &written, &cv]( int writeFd, std::string_view text ){ { std::unique_lock l(lock); ::write( writeFd, text.data(), text.length() ); written = true; } cv.notify_all(); }, pipeFds[1], text ); loop->run(); writer.join(); ::close( pipeFds[0] ); BOOST_REQUIRE_EQUAL( std::string_view( readData.data(), readData.size() ), text ); BOOST_REQUIRE ( gotReadChanFinished ); BOOST_REQUIRE ( gotClosed ); } BOOST_AUTO_TEST_CASE ( pipe_write_close ) { std::string_view text ("Hello from main"); int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSink = zyppng::AsyncDataSource::create(); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 3000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); BOOST_REQUIRE( dataSink->openFds( {}, pipeFds[1] ) ); BOOST_REQUIRE( dataSink->canWrite() ); int64_t bytesWritten = 0; dataSink->connectFunc( &zyppng::AsyncDataSource::sigBytesWritten, [&]( int64_t bytes ){ bytesWritten += bytes; if ( std::size_t(bytesWritten) == text.size() ) loop->quit(); }); zypp::ByteArray readData; std::thread reader( [ &readData ]( int readFd, std::string_view text ) { auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); if ( !dataSource->openFds( { readFd } ) ) return; // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadyRead, [&](){ zypp::ByteArray d = dataSource->readAll(); readData.insert( readData.end(), d.begin(), d.end() ); if ( readData.size() == text.length() ) loop->quit(); }); loop->run(); ::close( readFd ); }, pipeFds[0], text ); BOOST_REQUIRE_EQUAL( dataSink->write( text.data(), text.length() ), text.length() ); loop->run(); reader.join(); ::close( pipeFds[1] ); BOOST_REQUIRE_EQUAL( std::string_view( readData.data(), readData.size() ), text ); } BOOST_AUTO_TEST_CASE ( pipe_close ) { std::string_view text ("Hello from main"); int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSink = zyppng::AsyncDataSource::create(); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 3000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); bool gotClosed = false; BOOST_REQUIRE( dataSink->openFds( {}, pipeFds[1] ) ); BOOST_REQUIRE( dataSink->canWrite() ); int64_t bytesWritten = 0; dataSink->connectFunc( &zyppng::AsyncDataSource::sigBytesWritten, [&]( int64_t bytes ){ bytesWritten += bytes; }); dataSink->sigWriteFdClosed().connect([&]( auto ){ gotClosed = true; loop->quit(); }); // we close the pipe before the loop even has a chance writing to it ::close( pipeFds[0] ); BOOST_REQUIRE_EQUAL( dataSink->write( text.data(), text.length() ), text.length() ); loop->run(); ::close( pipeFds[1] ); BOOST_REQUIRE ( gotClosed ); } BOOST_AUTO_TEST_CASE ( multichannel ) { std::string_view text[] = { "Hello to channel1", "Hello to channel2 with more bytes" }; int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); int pipe2Fds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipe2Fds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSink = zyppng::AsyncDataSource::create(); auto dataSink2 = zyppng::AsyncDataSource::create(); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 10000 ); bool timeout = false; timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ timeout = true; loop->quit(); }); BOOST_REQUIRE( dataSink->openFds( {}, pipeFds[1] ) ); BOOST_REQUIRE( dataSink->canWrite() ); BOOST_REQUIRE( dataSink2->openFds( {}, pipe2Fds[1] ) ); BOOST_REQUIRE( dataSink2->canWrite() ); int64_t bytesWritten = 0; dataSink->connectFunc( &zyppng::AsyncDataSource::sigBytesWritten, [&]( int64_t bytes ){ bytesWritten += bytes; }); int64_t bytesWritten2 = 0; dataSink2->connectFunc( &zyppng::AsyncDataSource::sigBytesWritten, [&]( int64_t bytes ){ bytesWritten2 += bytes; }); bool dataSink1ABW = false; dataSink->connectFunc( &zyppng::AsyncDataSource::sigAllBytesWritten, [&]( ){ dataSink1ABW = true; }); bool dataSink2ABW = false; dataSink2->connectFunc( &zyppng::AsyncDataSource::sigAllBytesWritten, [&]( ){ dataSink2ABW = true; }); auto dataReceiver = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataReceiver->openFds( { pipeFds[0], pipe2Fds[0] }, -1 ) ); BOOST_REQUIRE( dataReceiver->canRead() ); BOOST_REQUIRE_EQUAL( dataReceiver->readChannelCount(), 2 ); BOOST_REQUIRE_EQUAL( dataReceiver->currentReadChannel(), 0 ); zypp::ByteArray dataRecv[2]; dataReceiver->connectFunc( &zyppng::AsyncDataSource::sigChannelReadyRead, [&]( auto channel ) { dataReceiver->setReadChannel( channel ); BOOST_REQUIRE_EQUAL( dataReceiver->currentReadChannel(), channel ); zypp::ByteArray d = dataReceiver->readAll(); dataRecv[channel].insert( dataRecv[channel].end(), d.begin(), d.end() ); if ( dataRecv[0].size() > 0 && dataRecv[0].size() == text[0].size() && dataRecv[1].size() > 0 && dataRecv[1].size() == text[1].size() ) loop->quit(); }); bool bytesPushed = false; loop->eventDispatcher()->invokeOnIdle( [ & ](){ dataSink->write( text[0].data(), text[0].size() ); dataSink2->write( text[1].data(), text[1].size() ); bytesPushed = true; return false; }); loop->run(); BOOST_REQUIRE( !timeout ); BOOST_REQUIRE( dataSink1ABW ); BOOST_REQUIRE( dataSink2ABW ); BOOST_REQUIRE_EQUAL( bytesWritten, text[0].size() ); BOOST_REQUIRE_EQUAL( bytesWritten2, text[1].size() ); BOOST_REQUIRE_EQUAL( text[0], std::string_view( dataRecv[0].data(), dataRecv[0].size() ) ); BOOST_REQUIRE_EQUAL( text[1], std::string_view( dataRecv[1].data(), dataRecv[1].size() ) ); } BOOST_AUTO_TEST_CASE ( readl ) { std::string_view text[] = { "Hello\n", "World\n", "123456" }; int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 3000 ); bool timeout = false; timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); timeout = true; }); BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); dataSource->setReadChannel( 0 ); dataSource->sigReadyRead ().connect([&](){ // now write more data without returning to the ev loop, and check if we get it all ::write( pipeFds[1], text[1].data(), text[1].size() ); ::write( pipeFds[1], text[2].data(), text[2].size() ); auto ba = dataSource->readLine(); BOOST_REQUIRE_EQUAL( text[0], std::string_view( ba.data(), ba.size() ) ); ba = dataSource->readLine( text[1].size () + 1 ); // trigger code path with fixed size BOOST_REQUIRE_EQUAL( text[1], std::string_view( ba.data(), ba.size() ) ); ba = dataSource->readLine(); BOOST_REQUIRE_EQUAL( text[2], std::string_view( ba.data(), ba.size() ) ); loop->quit(); }); //write the first line ::write( pipeFds[1], text[0].data(), text[0].size() ); loop->run(); BOOST_REQUIRE( !timeout ); } libzypp-17.36.5/tests/zyppng/io/CMakeLists.txt000066400000000000000000000000741476576476200212570ustar00rootroot00000000000000ADD_TESTS( UnixSocket AsyncDataSource Process ) libzypp-17.36.5/tests/zyppng/io/Process_test.cc000066400000000000000000000243531476576476200215110ustar00rootroot00000000000000#include "TestSetup.h" #include "TestTools.h" #include #include #include #include #include #include #include #include #include #include #include #define BOOST_TEST_MODULE ExternalProgram #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zyppng/data/process") using zypp::ExternalProgram; BOOST_AUTO_TEST_CASE( Basic ) { const char *argv[] = { "bash", "-c", "echo \"Hello\";sleep 1;echo \"I'm the second line\";exit 123;", nullptr }; auto ev = zyppng::EventLoop::create(); auto proc = zyppng::Process::create(); bool gotStarted = false; proc->connectFunc( &zyppng::Process::sigStarted, [&](){ gotStarted = true; }); int exitCode = -1; bool gotFinished = false; proc->connectFunc( &zyppng::Process::sigFinished, [&]( int status ){ gotFinished = true; exitCode = status; ev->quit(); }); bool gotFailedToStart = false; proc->connectFunc( &zyppng::Process::sigFailedToStart, [&]( ){ gotFailedToStart = true; ev->quit(); }); BOOST_REQUIRE( proc->start( argv ) ); BOOST_REQUIRE( proc->isRunning() ); const auto pid = proc->pid(); BOOST_REQUIRE ( pid != -1 ); ev->run(); BOOST_REQUIRE( gotStarted ); BOOST_REQUIRE( gotFinished ); BOOST_REQUIRE_EQUAL( exitCode, 123 ); BOOST_REQUIRE( !gotFailedToStart ); proc->setReadChannel( zyppng::Process::StdOut ); BOOST_REQUIRE( proc->bytesAvailable( ) ); auto data = proc->readLine(); BOOST_REQUIRE_EQUAL( data.asStringView(), std::string_view("Hello\n") ); data = proc->readLine(); BOOST_REQUIRE_EQUAL( data.asStringView(), std::string_view("I'm the second line\n") ); BOOST_REQUIRE( !proc->isRunning() ); BOOST_REQUIRE_EQUAL( proc->exitStatus(), 123 ); BOOST_REQUIRE_LT ( ::getpgid( pid ) , 0 ); } BOOST_AUTO_TEST_CASE( InvalidExec ) { const char *argv[] = { "./NoSuchFileHere", nullptr }; auto ev = zyppng::EventLoop::create(); auto proc = zyppng::Process::create(); bool gotStarted = false; proc->connectFunc( &zyppng::Process::sigStarted, [&](){ gotStarted = true; }); int exitCode = -1; bool gotFinished = false; proc->connectFunc( &zyppng::Process::sigFinished, [&]( int status ){ gotFinished = true; exitCode = status; }); bool gotFailedToStart = false; proc->connectFunc( &zyppng::Process::sigFailedToStart, [&]( ){ gotFailedToStart = true; }); BOOST_REQUIRE( !proc->start( argv ) ); BOOST_REQUIRE( !proc->isRunning() ); BOOST_REQUIRE( !gotStarted ); BOOST_REQUIRE( !gotFinished ); BOOST_REQUIRE( gotFailedToStart ); BOOST_REQUIRE_EQUAL( proc->exitStatus(), 129 ); } /* * This tests a special feature where we move arbitrary fds into the new process for special use */ BOOST_AUTO_TEST_CASE( mapExtraFD ) { auto pipeA = zyppng::Pipe::create( ); auto pipeB = zyppng::Pipe::create( ); BOOST_REQUIRE( pipeA ); BOOST_REQUIRE( pipeB ); auto ev = zyppng::EventLoop::create(); auto proc = zyppng::Process::create(); // we have one pipe we want to write to, so the process can receive data proc->addFd( pipeA->readFd ); // and another one the process uses to talk to us proc->addFd( pipeB->writeFd ); auto dataSource = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSource->openFds( { pipeB->readFd }, pipeA->writeFd ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->canWrite( ) ); proc->connectFunc( &zyppng::Process::sigStarted, [&](){ // once the process has been started close the ends of the pipes we gave to the process pipeA->unrefRead(); pipeB->unrefWrite(); // write some data BOOST_REQUIRE( dataSource->write( zypp::ByteArray("Hello") ) ); BOOST_REQUIRE( dataSource->write( zypp::ByteArray(" my friend\n" ) ) ); BOOST_REQUIRE( dataSource->write( zypp::ByteArray("How are you today\n" ) ) ); BOOST_REQUIRE( dataSource->write( zypp::ByteArray("q\n" ) ) ); }); ByteArray bytesRead; const auto &readAllData = [&](){ const auto &data = dataSource->readAll(); bytesRead.insert( bytesRead.end(), data.begin(), data.end() ); }; dataSource->sigReadyRead().connect( [&](){ readAllData(); }); int exitCode = -1; bool gotFinished = false; proc->connectFunc( &zyppng::Process::sigFinished, [&]( int status ){ gotFinished = true; exitCode = status; ev->quit(); }); const auto executable = DATADIR/"echo.sh"; const char *argv[] = { executable.c_str(), nullptr }; BOOST_REQUIRE( proc->start( argv ) ); BOOST_REQUIRE( proc->isRunning() ); ev->run(); BOOST_REQUIRE_EQUAL ( exitCode, 0 ); BOOST_REQUIRE ( gotFinished ); if ( dataSource->bytesAvailable() ) readAllData(); BOOST_REQUIRE_EQUAL( zypp::ByteArray("Hello my friend\nHow are you today\n"), bytesRead ); } #if 0 BOOST_AUTO_TEST_CASE( StderrToStdout ) { const char *argv[] = { "bash", "-c", "echo \"Hello\";sleep 1;echo \"I'm the second line\" >&2;", nullptr }; ExternalProgram proc( argv, ExternalProgram::Stderr_To_Stdout ); BOOST_CHECK( proc.running() ); BOOST_REQUIRE ( proc.getpid() != -1 ); std::string line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("Hello\n") ); line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("I'm the second line\n") ); proc.close(); BOOST_REQUIRE( !proc.running() ); BOOST_REQUIRE_EQUAL( proc.getpid(), -1 ); } BOOST_AUTO_TEST_CASE( SetEnv ) { const char *argv[] = { "bash", "-c", "echo \"${ZYPPENV}\"", nullptr }; ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", "Hello from env") }, ExternalProgram::Normal_Stderr ); std::string line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") ); proc.close(); } // environment of the parent has to be in the child process as well // some code paths rely on that BOOST_AUTO_TEST_CASE( ParentEnv ) { const char *argv[] = { "bash", "-c", "echo \"${PARENTENV}${ZYPPENV}\"", nullptr }; setenv( "PARENTENV", "Hello from", 0 ); ExternalProgram proc( argv, ExternalProgram::Environment{ std::make_pair("ZYPPENV", " env") }, ExternalProgram::Normal_Stderr ); std::string line = proc.receiveLine(); BOOST_REQUIRE_EQUAL( line, std::string("Hello from env\n") ); proc.close(); unsetenv( "PARENTENV" ); } // weird feature to redirect stdout and stderr BOOST_AUTO_TEST_CASE( RedirectStdoutAndStderrWithChdir ) { zypp::filesystem::TmpDir dir; const zypp::Pathname stdoutPath( dir.path()/"stdout" ); const zypp::Pathname stderrPath( dir.path()/"stderr" ); const std::string stdoutRedir( zypp::str::form(">%s", stdoutPath.c_str() ) ); const std::string chDir( zypp::str::form("#%s", dir.path().c_str() ) ); zypp::AutoFD stdErrRedir( ::open( stderrPath.c_str() , O_CREAT | O_RDWR, 0666 ) ); BOOST_REQUIRE( *stdErrRedir != -1 ); const char *argv[] = { chDir.c_str(), stdoutRedir.c_str(), "bash", "-c", "echo \"Hello on stdout\";echo \"Hello on stderr\" >&2;echo \"Hello on file in chdir\" > chdirfile", nullptr }; ExternalProgram proc (argv, ExternalProgram::Stderr_To_FileDesc, false, *stdErrRedir ); int exitCode = proc.close(); BOOST_REQUIRE( !proc.running() ); BOOST_REQUIRE_EQUAL( exitCode, 0 ); ::close( *stdErrRedir ); *stdErrRedir = -1; BOOST_REQUIRE_EQUAL( TestTools::readFile( stdoutPath ), "Hello on stdout\n"); BOOST_REQUIRE_EQUAL( TestTools::readFile( stderrPath ), "Hello on stderr\n"); BOOST_REQUIRE_EQUAL( TestTools::readFile( dir.path() / "chdirfile" ), "Hello on file in chdir\n"); } BOOST_AUTO_TEST_CASE( LongRunningEcho ) { const auto executable = DATADIR/"echo.sh"; const char *argv[] = { executable.c_str(), nullptr }; ExternalProgram proc (argv, ExternalProgram::Normal_Stderr ); BOOST_REQUIRE( proc.running() ); BOOST_REQUIRE( proc.send( "Hello" ) ); BOOST_REQUIRE( proc.send( " my friend\n" ) ); BOOST_REQUIRE( proc.send( "How are you today\n" ) ); BOOST_REQUIRE_EQUAL( proc.receiveLine(), "Hello my friend\n" ); BOOST_REQUIRE_EQUAL( proc.receiveLine(), "How are you today\n" ); BOOST_REQUIRE( proc.running() ); BOOST_REQUIRE( proc.send( "q\n" ) ); const auto res = proc.close(); BOOST_REQUIRE_EQUAL( res, 0 ); } BOOST_AUTO_TEST_CASE( SendSignal ) { const auto executable = DATADIR/"echo.sh"; const char *argv[] = { executable.c_str(), nullptr }; ExternalProgram proc (argv, ExternalProgram::Normal_Stderr ); BOOST_REQUIRE( proc.running() ); proc.kill( SIGTERM ); const auto exitCode = proc.close(); BOOST_REQUIRE_EQUAL( exitCode, SIGTERM+128 ); } BOOST_AUTO_TEST_CASE( CleanerThread_default ) { pid_t pid = -1; { ExternalProgram proc( "bash -c 'sleep 2'", ExternalProgram::Normal_Stderr ); BOOST_CHECK( proc.running() ); pid = proc.getpid(); } std::this_thread::sleep_for( std::chrono::seconds(4) ); // check if the process is really gone, can't use waitpid because some ExternalProgram // implementations do spawn processes from a helper thread which means they are not our direct children BOOST_CHECK_EQUAL( ::getpgid( pid ), -1 ); BOOST_CHECK_EQUAL( errno, ESRCH ); } BOOST_AUTO_TEST_CASE( ReadTimeout ) { static const char* argv[] = { "sleep", "2", NULL }; ExternalProgram prog( argv, ExternalProgram::Discard_Stderr ); BOOST_CHECK_THROW( prog.receiveLine( 100 ), io::TimeoutException ); BOOST_CHECK_EQUAL( prog.receiveLine( 3000 ), "" ); BOOST_CHECK_EQUAL( prog.close(), 0 ); } BOOST_AUTO_TEST_CASE( CloseFDs ) { // simple bash script that counts the number of open fds, 4 is the minimum since ls opens one fd to read the /proc/self/fd std::string_view script ( "if [ $( ls /proc/self/fd | wc -l ) -gt \"4\" ]; then exit 1; fi; exit 0" ); const char *argv[] = { "bash", "-c", script.data(), nullptr }; // open random fds we definitely can read to get higher nr of fds zypp::AutoFD testFD( ::open( "/proc/self/fd", O_RDONLY ) ); zypp::AutoFD testFD2( ::open( "/proc/self/fd", O_RDONLY ) ); ExternalProgram proc( argv, ExternalProgram::Discard_Stderr ); const auto exitCode = proc.close(); BOOST_REQUIRE_EQUAL( exitCode, 0 ); } #endif libzypp-17.36.5/tests/zyppng/io/UnixSocket_test.cc000066400000000000000000000337361476576476200221740ustar00rootroot00000000000000#include #include #include #include #include #include #include #include BOOST_AUTO_TEST_CASE ( lorem ) { const std::string payloadT = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, " "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem " "ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore " "magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata " "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut " "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, " "no sea takimata sanctus est Lorem ipsum dolor sit amet."; // make sure we get over the OS buffers std::string payload; for ( int i = 0; i < 700; i++ ) { payload += payloadT; } auto ev = zyppng::EventLoop::create(); auto listeningSock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto error = zyppng::Socket::NoError; int64_t bytesWritten = 0; zyppng::ByteArray dataReceived; //< This is where the thread will write the data auto addr = std::make_shared( "socktest", true ); BOOST_REQUIRE( listeningSock->bind( addr ) ); BOOST_REQUIRE( listeningSock->listen() ); BOOST_REQUIRE_EQUAL( listeningSock->state(), zyppng::Socket::ListeningState ); zyppng::Socket::Ptr connection; listeningSock->sigIncomingConnection().connect( [&](){ connection = listeningSock->accept(); BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ConnectedState ); connection->sigError().connect([&]( const auto err ){ if ( err == zyppng::Socket::ConnectionDelayed ) return; error = err; ev->quit(); }); connection->sigDisconnected().connect( [&](){ BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ClosedState ); ev->quit(); }); connection->sigBytesWritten().connect( [&]( const auto bytes ){ bytesWritten += bytes; }); connection->write( payload.data(), payload.size() ); }); std::thread clientThread( [ payload, &dataReceived ](){ auto ev = zyppng::EventLoop::create(); auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto timer = zyppng::Timer::create(); bool timedOut = false; bool gotConnected = false; bool gotDisconnected = false; bool gotReadChanFinished = false; auto error = zyppng::Socket::NoError; sock->sigError().connect( [&]( const zyppng::Socket::SocketError err ){ if ( err == zyppng::Socket::ConnectionDelayed ) return; error = err; ev->quit(); }); sock->sigConnected().connect( [&](){ BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ConnectedState ); gotConnected = true; }); sock->sigDisconnected().connect( [&](){ gotDisconnected = true; BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState ); ev->quit(); }); sock->sigReadChannelFinished().connect( [&]( uint chan ){ gotReadChanFinished = true; BOOST_REQUIRE_EQUAL( chan, 0 ); }); sock->sigReadyRead().connect([&](){ const auto bA = sock->bytesAvailable(); auto all = sock->readAll(); std::cout << "Received" << std::endl; dataReceived.insert( dataReceived.end(), all.begin(), all.end() ); BOOST_REQUIRE_GE( all.size(), bA ); if ( dataReceived.size() == payload.length() ) { std::string_view rec( dataReceived.data(), dataReceived.size() ); BOOST_REQUIRE_EQUAL( rec, payload ); sock->disconnect(); } }); timer->sigExpired().connect([&]( zyppng::Timer &) { timedOut = true; ev->quit(); }); timer->start( 30000 ); sock->connect( std::make_shared( "socktest", true ) ); BOOST_REQUIRE( sock->state() == zyppng::Socket::ConnectedState || sock->state() == zyppng::Socket::ConnectingState ); ev->run(); BOOST_REQUIRE_EQUAL( error, zyppng::Socket::NoError ); BOOST_REQUIRE( gotConnected ); BOOST_REQUIRE( gotDisconnected ); BOOST_REQUIRE( gotReadChanFinished ); BOOST_REQUIRE_EQUAL( timedOut, false ); }); ev->run(); clientThread.join(); BOOST_REQUIRE_EQUAL( payload , std::string_view( dataReceived.data(), dataReceived.size() ) ); BOOST_REQUIRE_EQUAL( bytesWritten, payload.size() ); } BOOST_AUTO_TEST_CASE ( echo ) { const std::string payload = "Hello World"; auto ev = zyppng::EventLoop::create(); auto listeningSock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto error = zyppng::Socket::NoError; auto addr = std::make_shared( "socktest", true ); BOOST_REQUIRE( listeningSock->bind( addr ) ); BOOST_REQUIRE( listeningSock->listen() ); BOOST_REQUIRE_EQUAL( listeningSock->state(), zyppng::Socket::ListeningState ); zyppng::Socket::Ptr connection; zyppng::ByteArray received; listeningSock->sigIncomingConnection().connect( [&](){ connection = listeningSock->accept(); BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ConnectedState ); connection->sigError().connect([&]( const auto err ){ if ( err == zyppng::Socket::ConnectionDelayed ) return; error = err; ev->quit(); }); connection->sigDisconnected().connect( [&](){ BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ClosedState ); ev->quit(); }); // just echo received data back right away connection->sigReadyRead().connect( [&](){ connection->write( connection->readAll() ); }); }); std::thread clientThread( [ payload ](){ auto ev = zyppng::EventLoop::create(); auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto timer = zyppng::Timer::create(); bool timedOut = false; bool gotConnected = false; bool gotDisconnected = false; auto error = zyppng::Socket::NoError; sock->sigError().connect( [&]( const zyppng::Socket::SocketError err ){ if ( err == zyppng::Socket::ConnectionDelayed ) return; error = err; ev->quit(); }); sock->sigConnected().connect( [&](){ BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ConnectedState ); gotConnected = true; sock->write( payload.data(), payload.size() ); }); sock->sigDisconnected().connect( [&](){ gotDisconnected = true; BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState ); ev->quit(); }); zyppng::ByteArray dataReceived; sock->sigReadyRead().connect([&](){ const auto bA = sock->bytesAvailable(); auto all = sock->readAll(); dataReceived.insert( dataReceived.end(), all.begin(), all.end() ); BOOST_REQUIRE_EQUAL( bA, all.size() ); if ( dataReceived.size() == payload.length() ) { std::string_view rec( dataReceived.data(), dataReceived.size() ); BOOST_REQUIRE_EQUAL( rec, payload ); sock->disconnect(); } }); timer->sigExpired().connect([&]( zyppng::Timer &) { timedOut = true; ev->quit(); }); timer->start( 30000 ); sock->connect( std::make_shared( "socktest", true ) ); BOOST_REQUIRE( sock->state() == zyppng::Socket::ConnectedState || sock->state() == zyppng::Socket::ConnectingState ); ev->run(); BOOST_REQUIRE_EQUAL( error, zyppng::Socket::NoError ); BOOST_REQUIRE( gotConnected ); BOOST_REQUIRE( gotDisconnected ); BOOST_REQUIRE_EQUAL( timedOut, false ); }); ev->run(); clientThread.join(); } BOOST_AUTO_TEST_CASE ( err ) { auto ev = zyppng::EventLoop::create(); { auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); const auto res = sock->connect( std::make_shared( "socktest", true ) ); BOOST_REQUIRE( !res ); BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState ); BOOST_REQUIRE_EQUAL ( sock->lastError() , zyppng::Socket::ConnectionRefused ); } if ( ::geteuid() != 0 ) { auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); const auto res = sock->bind( std::make_shared( "/root/socketicannotcreate", false ) ); BOOST_REQUIRE( !res ); BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState ); BOOST_REQUIRE_EQUAL ( sock->lastError() , zyppng::Socket::InsufficientPermissions ); } { auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto addr = std::make_shared( "socktest", true ); sock->bind( addr ); const auto res = sock->bind( addr ); BOOST_REQUIRE( !res ); BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState ); BOOST_REQUIRE_EQUAL ( sock->lastError() , zyppng::Socket::SocketAlreadyBound ); } { auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto sock2 = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto addr = std::make_shared( "socktest", true ); sock->bind( addr ); const auto res = sock2->bind( addr ); BOOST_REQUIRE( !res ); BOOST_REQUIRE_EQUAL ( sock2->lastError() , zyppng::Socket::AddressInUse ); } } BOOST_AUTO_TEST_CASE ( lotsofdata ) { const std::string payload = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, " "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem " "ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore " "magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata " "sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut " "labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, " "no sea takimata sanctus est Lorem ipsum dolor sit amet."; auto ev = zyppng::EventLoop::create(); auto listeningSock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto error = zyppng::Socket::NoError; const int iterations = 1000000; int64_t bytesShouldBeWritten = 0; int64_t bytesWritten = 0; int64_t bytesWrittenSignaled = 0; int64_t bytesReceived = 0; auto addr = std::make_shared( "socktest", true ); BOOST_REQUIRE( listeningSock->bind( addr ) ); BOOST_REQUIRE( listeningSock->listen() ); BOOST_REQUIRE_EQUAL( listeningSock->state(), zyppng::Socket::ListeningState ); zyppng::Socket::Ptr connection; listeningSock->sigIncomingConnection().connect( [&](){ connection = listeningSock->accept(); BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ConnectedState ); connection->sigError().connect([&]( const auto err ){ if ( err == zyppng::Socket::ConnectionDelayed ) return; error = err; ev->quit(); }); connection->sigDisconnected().connect( [&](){ BOOST_REQUIRE_EQUAL( connection->state(), zyppng::Socket::ClosedState ); ev->quit(); }); connection->sigReadyRead().connect([&](){ auto all = connection->readAll(); bytesReceived += all.size(); }); }); std::thread clientThread( [ payload, &bytesWritten, &bytesWrittenSignaled, &bytesShouldBeWritten ](){ auto cev = zyppng::EventLoop::create(); auto sock = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto timer = zyppng::Timer::create(); bool timedOut = false; bool gotConnected = false; bool gotDisconnected = false; auto error = zyppng::Socket::NoError; sock->sigError().connect( [&]( const zyppng::Socket::SocketError err ){ if ( err == zyppng::Socket::ConnectionDelayed ) return; error = err; cev->quit(); }); sock->sigConnected().connect( [&](){ BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ConnectedState ); gotConnected = true; for ( int i = 0; i < iterations; i++ ) { auto thisBytesWritten = sock->write( payload.data(), payload.length() ); bytesShouldBeWritten += payload.length(); bytesWritten += thisBytesWritten; } sock->disconnect(); }); sock->sigBytesWritten().connect( [&]( const auto bytes ){ timer->start(); bytesWrittenSignaled += bytes; }); sock->sigDisconnected().connect( [&](){ gotDisconnected = true; BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState ); cev->quit(); }); timer->sigExpired().connect([&]( zyppng::Timer &) { timedOut = true; cev->quit(); }); timer->start( 30000 ); sock->connect( std::make_shared( "socktest", true ) ); if ( sock->state() == zyppng::Socket::ConnectingState || sock->state() == zyppng::Socket::ConnectedState || sock->state() == zyppng::Socket::ClosingState ) { cev->run(); } BOOST_REQUIRE_EQUAL( sock->state(), zyppng::Socket::ClosedState ); BOOST_REQUIRE_EQUAL( error, zyppng::Socket::NoError ); BOOST_REQUIRE( gotConnected ); BOOST_REQUIRE( gotDisconnected ); BOOST_REQUIRE_EQUAL( timedOut, false ); }); ev->run(); clientThread.join(); BOOST_REQUIRE_EQUAL( error, zyppng::Socket::ConnectionClosedByRemote ); BOOST_REQUIRE_EQUAL( bytesWritten, payload.size() * iterations ); BOOST_REQUIRE_EQUAL( bytesWritten, bytesReceived ); BOOST_REQUIRE_EQUAL( bytesWritten, bytesWrittenSignaled ); } libzypp-17.36.5/tests/zyppng/media/000077500000000000000000000000001476576476200171665ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/media/CMakeLists.txt000066400000000000000000000002731476576476200217300ustar00rootroot00000000000000IF( NOT DISABLE_MEDIABACKEND_TESTS) ADD_TESTS( NetworkRequestDispatcher #EvDownloader Provider ) target_link_libraries( Provider_test PUBLIC tvm-protocol-obj ) ENDIF() libzypp-17.36.5/tests/zyppng/media/EvDownloader_test.cc000066400000000000000000000657641476576476200231470ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "WebServer.h" #include "TestTools.h" #include #include #define BOOST_TEST_REQ_SUCCESS(REQ) \ do { \ BOOST_REQUIRE_MESSAGE( REQ->state() == zyppng::Download::Finished && !REQ->hasError(), zypp::str::Format(" %1% != zyppng::Download::Success (%2%)") % REQ->state() % REQ->errorString() ); \ BOOST_REQUIRE_EQUAL( REQ->lastRequestError().type(), zyppng::NetworkRequestError::NoError ); \ BOOST_REQUIRE( REQ->errorString().empty() ); \ } while(false) #define BOOST_TEST_REQ_FAILED(REQ) \ do { \ BOOST_REQUIRE_EQUAL( REQ->state(), zyppng::Download::Finished ); \ BOOST_REQUIRE( REQ->hasError() ); \ BOOST_REQUIRE_NE( REQ->lastRequestError().type(), zyppng::NetworkRequestError::NoError ); \ BOOST_REQUIRE( !REQ->errorString().empty() ); \ } while(false) namespace bdata = boost::unit_test::data; bool withSSL[] = {true, false}; BOOST_DATA_TEST_CASE( dltest_basic, bdata::make( withSSL ), withSSL) { auto ev = zyppng::EventLoop::create(); zyppng::Downloader::Ptr downloader = std::make_shared(); //make sure the data here is big enough to cross the threshold of 256 bytes so we get a progress signal emitted and not only the alive signal. std::string dummyContent = "This is just some dummy content,\nto test downloading and signals.\n" "This is just some dummy content,\nto test downloading and signals.\n" "This is just some dummy content,\nto test downloading and signals.\n" "This is just some dummy content,\nto test downloading and signals.\n"; WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("getData", WebServer::makeResponse("200", dummyContent ) ); BOOST_REQUIRE( web.start() ); zypp::filesystem::TmpFile targetFile; zyppng::Url weburl (web.url()); weburl.setPathName("/handler/getData"); zyppng::TransferSettings set = web.transferSettings(); bool gotStarted = false; bool gotFinished = false; bool gotProgress = false; bool gotAlive = false; off_t lastProgress = 0; off_t totalDL = 0; std::vector allStates; zyppng::Download::Ptr dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path(), dummyContent.length()) ); dl->spec().setTransferSettings( set ); dl->sigFinished().connect([&]( zyppng::Download & ){ gotFinished = true; ev->quit(); }); dl->sigStarted().connect([&]( zyppng::Download & ){ gotStarted = true; }); dl->sigAlive().connect([&]( zyppng::Download &, off_t ){ gotAlive = true; }); dl->sigStateChanged().connect([&]( zyppng::Download &, zyppng::Download::State state ){ allStates.push_back( state ); }); dl->sigProgress().connect([&]( zyppng::Download &, off_t dltotal, off_t dlnow ){ gotProgress = true; lastProgress = dlnow; totalDL = dltotal; }); dl->start(); ev->run(); BOOST_TEST_REQ_SUCCESS( dl ); BOOST_REQUIRE( gotStarted ); BOOST_REQUIRE( gotFinished ); BOOST_REQUIRE( gotProgress ); BOOST_REQUIRE( gotAlive ); BOOST_REQUIRE_EQUAL( totalDL, dummyContent.length() ); BOOST_REQUIRE_EQUAL( lastProgress, dummyContent.length() ); BOOST_REQUIRE ( allStates == std::vector({zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::Finished}) ); } // Globals are HORRIBLY broken here, do not use any static globals they might not be initialized at the point // of calling the initializer of the MirrorSet vector, so we are manually initializing the Byte and KByte Units here const auto makeBytes( zypp::ByteCount::SizeType size ) { return zypp::ByteCount( size, zypp::ByteCount::Unit( 1LL, "B", 0 ) ); }; const auto makeKBytes( zypp::ByteCount::SizeType size ) { return zypp::ByteCount( size, zypp::ByteCount::Unit( 1024LL, "KiB", 1 ) ); }; struct MirrorSet { std::string name; // > mirrors; //all mirrors injected into the metalink file int expectedFileDownloads; //< how many downloads are direct file downloads int expectedHandlerDownloads; //< how many started downloads are handler requests std::vector expectedStates; bool expectSuccess; //< should the download work out? zypp::ByteCount chunkSize = makeKBytes( 256 ); //zck data zypp::CheckSum headerChecksum; //< ZChunk header checksum zypp::ByteCount headerSize; //< ZChunk header size std::string deltaFilePath; //< ZChunk delta file std::ostream & operator<<( std::ostream & str ) const { str << "MirrorSet{ " << name << " }"; return str; } }; namespace boost{ namespace test_tools{ namespace tt_detail{ template<> struct print_log_value< MirrorSet > { void operator()( std::ostream& str, MirrorSet const& set) { set.operator<<( str ); } }; }}} std::vector< MirrorSet > generateMirr () { std::vector< MirrorSet > res; //all mirrors good: res.push_back( MirrorSet() ); res.back().name = "All good mirrors"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 1; res.back().expectedFileDownloads = 9; res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}; for ( int i = 100 ; i >= 10; i -= 10 ) res.back().mirrors.push_back( std::make_pair( i, "/test.txt") ); //all mirrors good big chunk res.push_back( MirrorSet() ); res.back().name = "All good mirrors, 1024 chunk size"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 1; res.back().expectedFileDownloads = 3; res.back().chunkSize = makeKBytes(1024); res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}; for ( int i = 100 ; i >= 10; i -= 10 ) res.back().mirrors.push_back( std::make_pair( i, "/test.txt") ); //no mirrors: res.push_back( MirrorSet() ); res.back().name = "Empty mirrors"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes (2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 10; res.back().expectedFileDownloads = 0; res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}; //only broken mirrors: res.push_back( MirrorSet() ); res.back().name = "All broken mirrors"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 2; //has to fall back to url handler download res.back().expectedFileDownloads = 10; //should try all mirrors and fail res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::DlSimple, zyppng::Download::Finished}; for ( int i = 100 ; i >= 10; i -= 10 ) res.back().mirrors.push_back( std::make_pair( i, "/doesnotexist.txt") ); //only broken mirrors: res.push_back( MirrorSet() ); res.back().name = "All broken mirrors by params"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 2; //has to fall back to url handler download res.back().expectedFileDownloads = 0; // Setting up the mirrors will fail before even starting a download, so we should only see requests to the handler directly res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::DlSimple, zyppng::Download::Finished}; for ( int i = 100 ; i >= 10; i -= 10 ) res.back().mirrors.push_back( std::make_pair( i, "/test.txt?auth=foobar") ); //some broken mirrors: res.push_back( MirrorSet() ); res.back().name = "Some broken mirrors less URLs than blocks"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 1; res.back().expectedFileDownloads = 9 + 3; // 3 should fail due to broken mirrors res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}; for ( int i = 10 ; i >= 5; i-- ) { if ( i % 2 ) { res.back().mirrors.push_back( std::make_pair( i*10, "/doesnotexist.txt") ); } else { res.back().mirrors.push_back( std::make_pair( i*10, "/test.txt") ); } } //some broken mirrors with more URLs than blocks: res.push_back( MirrorSet() ); res.back().name = "Some broken mirrors more URLs than blocks"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 1; //it is not really possible to know how many times the downloads will fail, there are //5 broken mirrors in the set, but if a working mirror is done before the last broken //URL is picked from the dataset, not all broken URLs will be used res.back().expectedFileDownloads = -1; res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}; for ( int i = 10 ; i >= 1; i-- ) { if ( i % 2 ) { res.back().mirrors.push_back( std::make_pair( i*10, "/doesnotexist.txt") ); } else { res.back().mirrors.push_back( std::make_pair( i*10, "/test.txt") ); } } //mirrors where some return a invalid block res.push_back( MirrorSet() ); res.back().name = "Some mirrors return broken blocks"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 1; //it is not really possible to know how many times the downloads will fail, there are //5 broken mirrors in the set, but if a working mirror is done before the last broken //URL is picked from the dataset, not all broken URLs will be used res.back().expectedFileDownloads = -1; res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}; for ( int i = 10 ; i >= 1; i-- ) { if ( i % 2 ) { res.back().mirrors.push_back( std::make_pair( i*10, "/handler/random") ); } else { res.back().mirrors.push_back( std::make_pair( i*10, "/test.txt") ); } } //mirrors where some return a invalid range response ( 206 status but no range def ) res.push_back( MirrorSet() ); res.back().name = "Some mirrors return boken range responses"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 1; //it is not really possible to know how many times the downloads will fail, there are //5 broken mirrors in the set, but if a working mirror is done before the last broken //URL is picked from the dataset, not all broken URLs will be used res.back().expectedFileDownloads = -1; res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}; for ( int i = 10 ; i >= 1; i-- ) { if ( i % 2 ) { res.back().mirrors.push_back( std::make_pair( i*10, "/handler/brokenrange") ); } else { res.back().mirrors.push_back( std::make_pair( i*10, "/test.txt") ); } } //all return a invalid range response ( 206 status but no range def ) res.push_back( MirrorSet() ); res.back().name = "All mirrors return boken range responses"; res.back().filename = "test.txt"; res.back().dlTotal = makeBytes(2148018); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 2; //has to fall back to url handler download res.back().expectedFileDownloads = 10; //should try all mirrors and fail res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::DlSimple , zyppng::Download::Finished}; for ( int i = 10 ; i >= 1; i-- ) { res.back().mirrors.push_back( std::make_pair( i*10, "/handler/brokenrange") ); } #if ENABLE_ZCHUNK_COMPRESSION //all mirrors good with zck: res.push_back( MirrorSet() ); res.back().name = "All good mirrors with zck"; res.back().filename = "primary.xml.zck"; res.back().dlTotal = makeBytes(274638); res.back().expectSuccess = true; res.back().expectedHandlerDownloads = 3; // query if metalink avail + dl metalink + dl zck head because request is reused res.back().expectedFileDownloads = 5; // 5 Chunks ( chunk size is at least 4K but is likely a few bytes bigger ) res.back().expectedStates = { zyppng::Download::InitialState, zyppng::Download::DetectMetaLink, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlZChunkHead, zyppng::Download::DlZChunk, zyppng::Download::Finished}; res.back().headerChecksum = zypp::CheckSum( zypp::Digest::sha256(), "90a1a1b99ba3b6c8ae9f14b0c8b8c43141c69ec3388bfa3b9915fbeea03926b7"); res.back().headerSize = makeBytes(11717); res.back().deltaFilePath = "primary-deltatemplate.xml.zck"; res.back().chunkSize = makeKBytes(4); for ( int i = 100 ; i >= 10; i -= 10 ) res.back().mirrors.push_back( std::make_pair( i, "/primary.xml.zck") ); #endif return res; } //create one URL line for a metalink template file std::string makeUrl ( int pref, const zyppng::Url &url ) { return ( zypp::str::Format( "%3%" ) % pref % url.getScheme() % url.asCompleteString() ); }; static bool requestWantsMetaLink ( const WebServer::Request &req ) { auto it = req.params.find( "HTTP_ACCEPT" ); if ( it != req.params.end() ) { if ( (*it).second.find("application/metalink+xml") != std::string::npos || (*it).second.find("application/metalink4+xml") != std::string::npos ) { return true; } } return false; } //creates a request handler for the Mock WebServer that returns the metalink data //specified in \a data if the request has the metalink accept handler WebServer::RequestHandler makeMetaFileHandler ( const std::string &fName, const std::string *data ) { return [ data, fName ]( WebServer::Request &req ){ if ( requestWantsMetaLink( req ) ) { req.rout << WebServer::makeResponseString( "200", { "Content-Type: application/metalink+xml; charset=utf-8\r\n" }, *data ); return; } req.rout << "Location: /"<second, "bytes=" ) ) { //bytes=786432-1048575 std::string range = it->second.substr( 6 ); //remove bytes= size_t dash = range.find_first_of( "-" ); off_t start = -1; off_t end = -1; if ( dash != std::string::npos ) { start = std::stoll( range.substr( 0, dash ) ); end = std::stoll( range.substr( dash+1 ) ); } if ( start != -1 && end != -1 ) { std::string block; for ( off_t curr = start; curr <= end; curr++ ) { block += 'a'; } req.rout << "Status: 206 Partial Content\r\n" << "Accept-Ranges: bytes\r\n" << "Content-Length: "<< block.length() <<"\r\n" << "Content-Range: bytes "<second, "bytes=" ) ) { //bytes=786432-1048575 std::string range = it->second.substr( 6 ); //remove bytes= size_t dash = range.find_first_of( "-" ); off_t start = -1; off_t end = -1; if ( dash != std::string::npos ) { start = std::stoll( range.substr( 0, dash ) ); end = std::stoll( range.substr( dash+1 ) ); } if ( start != -1 && end != -1 ) { std::string block; for ( off_t curr = start; curr <= end; curr++ ) { block += 'a'; } req.rout << "Status: 206 Partial Content\r\n" << "Accept-Ranges: bytes\r\n" << "Content-Length: "<< block.length() <<"\r\n" <<"\r\n" << block; return; } } req.rout << "Location: /"< downloader = std::make_shared(); downloader->requestDispatcher()->setMaximumConcurrentConnections( maxDLs ); //first metalink download, generate a fully valid one zyppng::Url weburl (web.url()); weburl.setPathName( zypp::str::Format("/handler/%1%") % elem.filename ); std::string urls; if ( elem.mirrors.size() ) { for ( const auto &mirr : elem.mirrors ) { zyppng::Url mirrUrl ( web.url().asCompleteString() + mirr.second ); // mirrUrl.setPathName( mirr.second ); urls += makeUrl( mirr.first, mirrUrl ) + "\n"; } } std::string metaFile = zypp::str::Format( metaTempl ) % urls; web.addRequestHandler( elem.filename, makeMetaFileHandler( elem.filename, &metaFile ) ); web.addRequestHandler( "random", makeJunkBlockHandler( elem.filename ) ); web.addRequestHandler( "brokenrange", makeBrokenRangeHandler( elem.filename ) ); int expectedDownloads = elem.expectedHandlerDownloads + elem.expectedFileDownloads; int startedDownloads = 0; int finishedDownloads = 0; bool downloadHadError = false; bool gotProgress = false; bool gotAlive = false; bool gotMultiDLState = false; std::vector allStates; off_t gotTotal = 0; off_t lastProgress = 0; int countHandlerReq = 0; //the requests made to the handler slot int countFileReq = 0; //the requests made to the file directly, e.g. a mirror read from the metalink file auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile) ); dl->spec().setTransferSettings( web.transferSettings() ) .setPreferredChunkSize( elem.chunkSize ) .setHeaderSize( elem.headerSize ) .setHeaderChecksum( elem.headerChecksum ) .setDeltaFile( elem.deltaFilePath.empty() ? zypp::Pathname() : testRoot/elem.deltaFilePath ) .setExpectedFileSize( elem.dlTotal ); dl->dispatcher().sigDownloadStarted().connect( [&]( zyppng::NetworkRequestDispatcher &, zyppng::NetworkRequest &req){ startedDownloads++; if ( req.url() == weburl ) countHandlerReq++; else countFileReq++; }); dl->dispatcher().sigDownloadFinished().connect( [&]( zyppng::NetworkRequestDispatcher &, zyppng::NetworkRequest &req ){ finishedDownloads++; if ( !downloadHadError ) downloadHadError = req.hasError(); }); dl->sigFinished().connect([&]( zyppng::Download & ){ ev->quit(); }); dl->sigAlive().connect([&]( zyppng::Download &, off_t dlnow ){ gotAlive = true; lastProgress = dlnow; }); dl->sigProgress().connect([&]( zyppng::Download &, off_t dltotal, off_t dlnow ){ gotProgress = true; gotTotal = dltotal; lastProgress = dlnow; }); dl->sigStateChanged().connect([&]( zyppng::Download &, zyppng::Download::State state ){ if ( state == zyppng::Download::DlMetalink || state == zyppng::Download::DlZChunk ) gotMultiDLState = true; }); dl->sigStateChanged().connect([&]( zyppng::Download &, zyppng::Download::State state ){ allStates.push_back( state ); }); dl->start(); ev->run(); //std::cout << dl->errorString() << std::endl; if ( elem.expectSuccess ) BOOST_TEST_REQ_SUCCESS( dl ); else BOOST_TEST_REQ_FAILED ( dl ); if ( elem.expectedHandlerDownloads > -1 && elem.expectedFileDownloads > -1 ) { BOOST_REQUIRE_EQUAL( startedDownloads, expectedDownloads ); } BOOST_REQUIRE_EQUAL( startedDownloads, finishedDownloads ); BOOST_REQUIRE( gotAlive ); BOOST_REQUIRE( gotProgress ); BOOST_REQUIRE( gotMultiDLState ); if ( elem.dlTotal > 0 ) BOOST_REQUIRE_EQUAL( lastProgress, elem.dlTotal ); BOOST_REQUIRE_EQUAL( lastProgress, gotTotal ); if ( elem.expectedHandlerDownloads > -1 ) BOOST_REQUIRE_EQUAL( countHandlerReq, elem.expectedHandlerDownloads ); if ( elem.expectedFileDownloads > -1 ) BOOST_REQUIRE_EQUAL( countFileReq, elem.expectedFileDownloads ); if ( !elem.expectedStates.empty() ) BOOST_REQUIRE( elem.expectedStates == allStates ); } //tests: // - broken cert // - correct expected filesize // - invalid filesize // - password handling and propagation //creates a request handler that requires a authentication to work WebServer::RequestHandler createAuthHandler ( ) { return WebServer::makeBasicAuthHandler( "Basic dGVzdDp0ZXN0", []( WebServer::Request &req ) { if ( requestWantsMetaLink( req ) ) { auto it = req.params.find( "HTTPS" ); if ( it != req.params.end() && it->second == "on" ) { req.rout << "Status: 307 Temporary Redirect\r\n" << "Cache-Control: no-cache\r\n" << "Location: /auth-https.meta\r\n\r\n"; } else { req.rout << "Status: 307 Temporary Redirect\r\n" << "Cache-Control: no-cache\r\n" << "Location: /auth-http.meta\r\n\r\n"; } return; } req.rout << "Status: 307 Temporary Redirect\r\n" "Location: /test.txt\r\n\r\n"; return; }); }; BOOST_DATA_TEST_CASE( dltest_auth, bdata::make( withSSL ), withSSL ) { //don't write or read creds from real settings dir zypp::filesystem::TmpDir repoManagerRoot; zypp::ZConfig::instance().setRepoManagerRoot( repoManagerRoot.path() ); auto ev = zyppng::EventLoop::create(); std::shared_ptr downloader = std::make_shared(); WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"/zyppng/data/downloader").c_str(), 10001, withSSL ); BOOST_REQUIRE( web.start() ); zypp::filesystem::TmpFile targetFile; zyppng::Url weburl (web.url()); weburl.setPathName("/handler/test.txt"); zyppng::TransferSettings set = web.transferSettings(); web.addRequestHandler( "test.txt", createAuthHandler() ); web.addRequestHandler( "quit", [ &ev ]( WebServer::Request & ){ ev->quit();} ); { auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path()) ); dl->spec().setTransferSettings(set); dl->sigFinished( ).connect([ &ev ]( zyppng::Download & ){ ev->quit(); }); dl->start(); ev->run(); BOOST_TEST_REQ_FAILED( dl ); BOOST_REQUIRE_EQUAL( dl->lastRequestError().type(), zyppng::NetworkRequestError::Unauthorized ); } { auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path()) ); dl->spec().setTransferSettings(set); int gotAuthRequest = 0; dl->sigFinished( ).connect([ &ev ]( zyppng::Download & ){ ev->quit(); }); dl->sigAuthRequired().connect( [&]( zyppng::Download &, zyppng::NetworkAuthData &auth, const std::string &availAuth ){ gotAuthRequest++; if ( gotAuthRequest >= 2 ) return; auth.setUsername("wrong"); auth.setPassword("credentials"); }); dl->start(); ev->run(); BOOST_TEST_REQ_FAILED( dl ); BOOST_REQUIRE_EQUAL( gotAuthRequest, 2 ); BOOST_REQUIRE_EQUAL( dl->lastRequestError().type(), zyppng::NetworkRequestError::AuthFailed ); } { int gotAuthRequest = 0; std::vector allStates; auto dl = downloader->downloadFile( zyppng::DownloadSpec(weburl, targetFile.path()) ); dl->spec().setTransferSettings(set); dl->sigFinished( ).connect([ &ev ]( zyppng::Download & ){ ev->quit(); }); dl->sigAuthRequired().connect( [&]( zyppng::Download &, zyppng::NetworkAuthData &auth, const std::string &availAuth ){ gotAuthRequest++; auth.setUrl( web.url() ); auth.setUsername("test"); auth.setPassword("test"); auth.setLastDatabaseUpdate( time( nullptr ) ); }); dl->sigStateChanged().connect([&]( zyppng::Download &, zyppng::Download::State state ){ allStates.push_back( state ); }); dl->start(); ev->run(); BOOST_TEST_REQ_SUCCESS( dl ); BOOST_REQUIRE_EQUAL( gotAuthRequest, 1 ); BOOST_REQUIRE ( allStates == std::vector({ zyppng::Download::InitialState, zyppng::Download::DlMetaLinkInfo, zyppng::Download::PrepareMulti, zyppng::Download::DlMetalink, zyppng::Download::Finished}) ); } } libzypp-17.36.5/tests/zyppng/media/NetworkRequestDispatcher_test.cc000066400000000000000000000706731476576476200255620ustar00rootroot00000000000000#include #include #include #include #include // for hexstr2bytes #include #include #include #include #include #include #include #include #include #include #include "WebServer.h" #include "FtpServer.h" #include "TestTools.h" #define BOOST_TEST_REQ_ERR(REQ, EXPECERR) \ do { \ BOOST_REQUIRE( REQ->hasError() ); \ BOOST_REQUIRE( REQ->error().isError() ); \ BOOST_REQUIRE_EQUAL( REQ->error().type(), EXPECERR ); \ } while(false) #define BOOST_TEST_REQ_SUCCESS(REQ) \ do { \ if ( REQ->hasError() ) \ BOOST_ERROR( REQ->error().toString() ); \ BOOST_REQUIRE( !REQ->hasError() ); \ BOOST_REQUIRE( !REQ->error().isError() ); \ BOOST_REQUIRE_EQUAL( REQ->error().type(), zyppng::NetworkRequestError::NoError ); \ } while(false) namespace bdata = boost::unit_test::data; const char * err404 = "Status: 404 Not Found\r\n" "Date: Tue, 21 May 2019 08:30:59 GMT\r\n" "Server: Apache/2.4.23 (Linux/SUSE)\r\n" "X-Prefix: 93.192.0.0/10\r\n" "X-AS: 3320\r\n" "Vary: accept-language,accept-charset" "Accept-Ranges: bytes" "Transfer-Encoding: chunked" "Content-Type: text/html; charset=utf-8" "Content-Language: en\r\n" "\r\n" "Resource is no longer available!"; const char * err401 = "Status: 401 Unauthorized\r\n" "Content-Type: text/html; charset=utf-8\r\n" "WWW-Authenticate: Basic realm=\"User Visible Realm\", charset=\"UTF-8\" \r\n" "\r\n" "Sorry you are not authorized."; const char * resp204 = "Status: 204\r\n" "server: Apache\r\n" "content-type: text/html;charset=UTF-8\r\n" "date: Wed, 30 Nov 2022 14:31:22 GMT\r\n\r\n"; bool withSSL[] = { true, false }; BOOST_DATA_TEST_CASE(nwdispatcher_basic, bdata::make( withSSL ), withSSL) { std::string dummyContent = "This is just some dummy content,\nto test downloading and signals."; auto ev = zyppng::EventLoop::create(); WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("getData", WebServer::makeResponse("200 OK", dummyContent ) ); BOOST_REQUIRE( web.start() ); BOOST_REQUIRE( !web.isStopped() ); zyppng::TransferSettings set = web.transferSettings(); auto disp = std::make_shared(); disp->run(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); bool gotStarted = false; bool gotFinished = false; bool gotProgress = false; off_t lastProgress = 0; off_t totalDL = 0; zypp::filesystem::TmpFile targetFile; zyppng::Url weburl (web.url()); weburl.setPathName("/handler/getData"); zyppng::NetworkRequest::Ptr reqData = std::make_shared( weburl, targetFile.path() ); reqData->transferSettings() = set; reqData->sigStarted().connect( [ &gotStarted ]( zyppng::NetworkRequest& ){ gotStarted = true; }); reqData->sigFinished().connect( [ &gotFinished ]( zyppng::NetworkRequest&, const zyppng::NetworkRequestError & ){ gotFinished = true; }); reqData->sigProgress().connect( [ & ]( zyppng::NetworkRequest &, off_t dltotal, off_t dlnow, off_t, off_t ){ gotProgress= true; lastProgress = dlnow; totalDL = dltotal; }); disp->enqueue( reqData ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_SUCCESS( reqData ); BOOST_REQUIRE( gotStarted ); BOOST_REQUIRE( gotFinished ); BOOST_REQUIRE( gotProgress ); BOOST_REQUIRE_EQUAL( totalDL, dummyContent.length() ); BOOST_REQUIRE_EQUAL( lastProgress, dummyContent.length() ); } BOOST_DATA_TEST_CASE(nwdispatcher_http_errors, bdata::make( withSSL ), withSSL) { auto makeErrorResponder = [] ( std::string err ) -> WebServer::RequestHandler { return WebServer::makeResponse( err, "This is a error." ); }; auto ev = zyppng::EventLoop::create(); WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("get404", WebServer::makeResponse( err404 ) ); web.addRequestHandler("get401", WebServer::makeResponse( err401 ) ); web.addRequestHandler("get502", makeErrorResponder( "502 Bad Gateway" ) ); web.addRequestHandler("get503", makeErrorResponder( "503 Service Unavailable" ) ); web.addRequestHandler("get504", makeErrorResponder( "504 Gateway Timeout" ) ); web.addRequestHandler("get403", makeErrorResponder( "403 Forbidden" ) ); web.addRequestHandler("get410", makeErrorResponder( "410 Gone" ) ); web.addRequestHandler("get418", makeErrorResponder( "418 I'm a teapot" ) ); web.addRequestHandler("get204", WebServer::makeResponse( resp204 ) ); BOOST_REQUIRE( web.start() ); zyppng::TransferSettings set = web.transferSettings(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); zyppng::Url weburl (web.url()); weburl.setPathName("/handler/get404"); zypp::filesystem::TmpFile targetFile; zyppng::NetworkRequest::Ptr req404 = std::make_shared( weburl, targetFile.path() ); req404->transferSettings() = set; disp->enqueue( req404 ); weburl = zyppng::Url( "bad://127.0.0.1" ); BOOST_REQUIRE( !disp->supportsProtocol(weburl) ); zyppng::NetworkRequest::Ptr reqInvProto = std::make_shared( weburl, targetFile.path() ); reqInvProto->transferSettings() = set; disp->enqueue( reqInvProto ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get401"); zyppng::NetworkRequest::Ptr reqUnauthorized = std::make_shared( weburl, targetFile.path() ); reqUnauthorized->transferSettings() = set; disp->enqueue( reqUnauthorized ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get401"); zyppng::NetworkRequest::Ptr reqAuthFailed = std::make_shared( weburl, targetFile.path() ); reqAuthFailed->transferSettings() = set; reqAuthFailed->transferSettings().setUsername("test"); reqAuthFailed->transferSettings().setPassword("test"); disp->enqueue( reqAuthFailed ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get502"); zyppng::NetworkRequest::Ptr req502 = std::make_shared( weburl, targetFile.path() ); req502->transferSettings() = set; disp->enqueue( req502 ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get503"); zyppng::NetworkRequest::Ptr req503 = std::make_shared( weburl, targetFile.path() ); req503->transferSettings() = set; disp->enqueue( req503 ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get504"); zyppng::NetworkRequest::Ptr req504 = std::make_shared( weburl, targetFile.path() ); req504->transferSettings() = set; disp->enqueue( req504 ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get403"); zyppng::NetworkRequest::Ptr req403 = std::make_shared( weburl, targetFile.path() ); req403->transferSettings() = set; disp->enqueue( req403 ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get410"); zyppng::NetworkRequest::Ptr req410 = std::make_shared( weburl, targetFile.path() ); req410->transferSettings() = set; disp->enqueue( req410 ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get418"); zyppng::NetworkRequest::Ptr req418 = std::make_shared( weburl, targetFile.path() ); req418->transferSettings() = set; disp->enqueue( req418 ); weburl = zyppng::Url( web.url() ); weburl.setPathName("/handler/get204"); zyppng::NetworkRequest::Ptr get204 = std::make_shared( weburl, targetFile.path() ); get204->transferSettings() = set; disp->enqueue( get204 ); disp->run(); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_ERR( req404, zyppng::NetworkRequestError::NotFound ); BOOST_TEST_REQ_ERR( reqInvProto, zyppng::NetworkRequestError::UnsupportedProtocol ); BOOST_TEST_REQ_ERR( reqUnauthorized, zyppng::NetworkRequestError::Unauthorized ); BOOST_TEST_REQ_ERR( reqAuthFailed, zyppng::NetworkRequestError::AuthFailed ); BOOST_TEST_REQ_ERR( req502, zyppng::NetworkRequestError::TemporaryProblem ); BOOST_TEST_REQ_ERR( req503, zyppng::NetworkRequestError::TemporaryProblem ); BOOST_TEST_REQ_ERR( req504, zyppng::NetworkRequestError::Timeout ); BOOST_TEST_REQ_ERR( req403, zyppng::NetworkRequestError::Forbidden ); BOOST_TEST_REQ_ERR( req410, zyppng::NetworkRequestError::NotFound ); BOOST_TEST_REQ_ERR( req418, zyppng::NetworkRequestError::ServerReturnedError ); BOOST_TEST_REQ_SUCCESS( get204 ); } template void nwdispatcher_download( bool withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); //start request dispatching, does not need to have requests enqueued disp->run(); Server srv((zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site").c_str(), 10001, withSSL ); BOOST_REQUIRE( srv.start() ); zyppng::TransferSettings set = srv.transferSettings(); zyppng::Url weburl (srv.url()); weburl.setPathName("/complexdir/subdir1/subdir1-file1.txt"); const auto &checkFileExists = []( const zypp::filesystem::Pathname &filePath ) -> bool { zypp::filesystem::PathInfo targetFileInfo( filePath ); return ( targetFileInfo.isExist() && targetFileInfo.isFile() ); }; const auto &checkFilesum = []( const zypp::filesystem::Pathname &filePath, const zypp::CheckSum sum ) -> bool { std::string fileSum = zypp::filesystem::checksum( filePath, sum.type() ); fileSum = zypp::str::trim( fileSum ); const std::string &expSumStr = sum.checksum (); return (expSumStr == fileSum); }; // download a full file using a open range starting from 0 with expected checksum { zypp::filesystem::TmpFile targetFile; zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared( weburl, targetFile.path() ); std::optional dig = zypp::Digest(); BOOST_REQUIRE_MESSAGE( dig->create( zypp::Digest::sha1() ), "Unable to create Digest " ); reqDLFile->transferSettings() = set; reqDLFile->addRequestRange(0, 0, std::move(dig), zypp::media::hexstr2bytes("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15") ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); BOOST_REQUIRE( checkFileExists(targetFile.path()) ); BOOST_REQUIRE( checkFilesum(targetFile.path(), zypp::CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15")) ); } // download a full file with expected checksum { zypp::filesystem::TmpFile targetFile; zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; BOOST_REQUIRE_MESSAGE( reqDLFile->setExpectedFileChecksum( zypp::CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15") ), "Unable to set expected checksum" ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); BOOST_REQUIRE( checkFileExists(targetFile.path()) ); BOOST_REQUIRE( checkFilesum(targetFile.path(), zypp::CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15")) ); } // download a full file using a open range starting from 0 but checksum should fail { zypp::filesystem::TmpFile targetFile; zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared( weburl, targetFile.path() ); std::optional dig = zypp::Digest(); BOOST_REQUIRE_MESSAGE( dig->create( zypp::Digest::sha1() ), "Unable to create Digest " ); //modify the checksum -> request should fail now reqDLFile->addRequestRange(0, 0, std::move(dig), zypp::media::hexstr2bytes("f1d2d2f924e986ac86fdf7b36c94bcdf32beec20") ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::InvalidChecksum ); BOOST_REQUIRE( checkFileExists(targetFile.path()) ); BOOST_REQUIRE( !checkFilesum(targetFile.path(), zypp::CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec20")) ); } // download a full file but checksum should fail { zypp::filesystem::TmpFile targetFile; zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; BOOST_REQUIRE_MESSAGE( reqDLFile->setExpectedFileChecksum( zypp::CheckSum::sha1( "f1d2d2f924e986ac86fdf7b36c94bcdf32beec20") ) , "Unable to set expected checksum" ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::InvalidChecksum ); BOOST_REQUIRE( checkFileExists(targetFile.path()) ); BOOST_REQUIRE( !checkFilesum(targetFile.path(), zypp::CheckSum::sha1( "f1d2d2f924e986ac86fdf7b36c94bcdf32beec20")) ); } { zypp::filesystem::TmpFile targetFile; zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared( weburl, targetFile.path() ); weburl = srv.url(); weburl.setPathName("/file-1.txt"); reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); reqDLFile->addRequestRange( 0, 7 ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); BOOST_REQUIRE( checkFileExists(targetFile.path()) ); BOOST_REQUIRE( checkFilesum(targetFile.path(), zypp::CheckSum::md5(std::string("16d2b386b2034b9488996466aaae0b57"))) ); } } BOOST_DATA_TEST_CASE(nwdispatcher_http_download, bdata::make( withSSL ), withSSL ) { nwdispatcher_download(withSSL); } BOOST_DATA_TEST_CASE(nwdispatcher_ftp_download, bdata::make( withSSL ), withSSL ) { nwdispatcher_download(withSSL); } BOOST_DATA_TEST_CASE(nwdispatcher_delay_download, bdata::make( withSSL ), withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("stalled", []( WebServer::Request &r ){ std::this_thread::sleep_for( std::chrono::milliseconds ( 2000 ) ); r.rout << "Status: 200\r\n" "\r\n" "Hello"; }); BOOST_REQUIRE( web.start() ); zyppng::TransferSettings set = web.transferSettings(); set.setTimeout( 1 ); zypp::filesystem::TmpFile targetFile; zyppng::Url weburl (web.url()); weburl.setPathName("/handler/stalled"); zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::Timeout ); } template void nwdispatcher_multipart_dl_impl( bool withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); Server web((zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site").c_str(), 10001, withSSL ); BOOST_REQUIRE( web.start() ); auto weburl = web.url(); weburl.setPathName("/file-1.txt"); zyppng::TransferSettings set = web.transferSettings(); zypp::filesystem::TmpFile targetFile; auto reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); reqDLFile->addRequestRange( 13, 4 ); reqDLFile->addRequestRange( 248, 6 ); reqDLFile->addRequestRange( 76, 9 ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); auto err = reqDLFile->error(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); std::string downloaded = TestTools::readFile ( targetFile.path() ); BOOST_REQUIRE( !downloaded.empty() ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+13 , 4 ), "SUSE" ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+248, 6 ), "TCP/IP" ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+76 , 9 ), "Slackware" ); } //Get a simple range from a existing file BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl_http, bdata::make( withSSL ), withSSL ) { nwdispatcher_multipart_dl_impl(withSSL); } BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl_ftp, bdata::make( withSSL ), withSSL ) { nwdispatcher_multipart_dl_impl(withSSL); } // Test that simulates us sending a range request to the server and the server answering with a range header but does not send actual range data BOOST_DATA_TEST_CASE(nwdispatcher_rangereq_norangeanswer, bdata::make( withSSL ), withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("norange", []( WebServer::Request &r ){ r.rout << "Status: 206\r\n" "\r\n" "Hello"; }); BOOST_REQUIRE( web.start() ); zyppng::TransferSettings set = web.transferSettings(); zypp::filesystem::TmpFile targetFile; zyppng::Url weburl (web.url()); weburl.setPathName("/handler/norange"); zyppng::NetworkRequest::Ptr reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); reqDLFile->addRequestRange( 13, 4 ); reqDLFile->addRequestRange( 248, 6 ); reqDLFile->addRequestRange( 76, 9 ); disp->enqueue( reqDLFile ); ev->run(); BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::ServerReturnedError ); } struct RangeData { off_t offset; std::string payload; }; auto makeMultiPartHandler ( std::vector &&values ) { return [ values = std::move(values) ]( WebServer::Request &r ){ const char *boundary = "THIS_STRING_SEPARATES"; r.rout << "Status: 206\r\n" "Content-Type: multipart/byteranges; boundary="<(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); const std::string_view str1 = "Hello"; const std::string_view str2 = "World"; const std::string_view str3 = "in Multibyte"; WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("mbyte", makeMultiPartHandler( { { 10, str2.data() }, { 0, str1.data() }, { 25, str3.data() } })); BOOST_REQUIRE( web.start() ); auto weburl = web.url(); weburl.setPathName("/handler/mbyte"); zyppng::TransferSettings set = web.transferSettings(); zypp::filesystem::TmpFile targetFile; auto reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); reqDLFile->addRequestRange( 0, str1.length() ); reqDLFile->addRequestRange( 10, str2.length() ); reqDLFile->addRequestRange( 25, str3.length() ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); std::string downloaded = TestTools::readFile ( targetFile.path() ); BOOST_REQUIRE( !downloaded.empty() ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data(), 5 ) , str1 ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+10, 5 ), str2 ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+25 ) , str3 ); } //Get a range response where the boundary string is part of the data //Some servers like nginx do not check if the boundary string is inside the data, thus we need //to make sure the parser is not affected by that BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl_weird_data, bdata::make( withSSL ), withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); const std::string_view str1 = "SUSE Linux"; const std::string_view str2 = "World--THIS_STRING_SEPARATES A"; const std::string_view str3 = "Other String"; WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("mbyte", makeMultiPartHandler( { { 0, str1.data() }, { 25, str2.data() }, { 70, str3.data() }, })); BOOST_REQUIRE( web.start() ); auto weburl = web.url(); weburl.setPathName("/handler/mbyte"); zyppng::TransferSettings set = web.transferSettings(); zypp::filesystem::TmpFile targetFile; auto reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); reqDLFile->addRequestRange( 0, str1.length() ); reqDLFile->addRequestRange( 25, str2.length() ); reqDLFile->addRequestRange( 70, str3.length() ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); std::string downloaded = TestTools::readFile ( targetFile.path() ); BOOST_REQUIRE( !downloaded.empty() ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data() , str1.length() ), str1 ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+25, str2.length() ), str2 ); BOOST_REQUIRE_EQUAL( std::string_view ( downloaded.data()+70, str3.length() ), str3 ); } BOOST_DATA_TEST_CASE(nwdispatcher_multipart_dl_overlap, bdata::make( withSSL ), withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); const char *data = "The SUSE Linux distribution was originally a German translation of Slackware Linux. In mid-1992, Softlanding Linux System (SLS) was founded by Peter MacDonald, and was the first comprehensive distribution to contain elements such as X and TCP/IP. The Slackware distribution (maintained by Patrick Volkerding) was initially based largely on SLS."; const std::string_view str1 = std::string_view( data, 50 ); const std::string_view str2 = std::string_view( data+40 ); WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("mbyte", makeMultiPartHandler( { { 0, std::string( str1.data(), str1.length() ) }, { 40, str2.data() } })); BOOST_REQUIRE( web.start() ); auto weburl = web.url(); weburl.setPathName("/handler/mbyte"); zyppng::TransferSettings set = web.transferSettings(); zypp::filesystem::TmpFile targetFile; auto reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); reqDLFile->addRequestRange( 0, str1.length() ); reqDLFile->addRequestRange( 40, str2.length() ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); std::string downloaded = TestTools::readFile ( targetFile.path() ); BOOST_REQUIRE( !downloaded.empty() ); BOOST_REQUIRE_EQUAL( downloaded, std::string(data) ); } //Get a range response with missing data BOOST_DATA_TEST_CASE(nwdispatcher_multipart_data_missing, bdata::make( withSSL ), withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); const std::string_view str1 = "Hello"; const std::string_view str2 = "World"; const std::string_view str3 = "in Multibyte"; WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"data"/"dummywebroot").c_str(), 10001, withSSL ); web.addRequestHandler("mbyte", makeMultiPartHandler( { { 10, str2.data() }, { 0, str1.data() }, { 25, str3.data() } })); BOOST_REQUIRE( web.start() ); auto weburl = web.url(); weburl.setPathName("/handler/mbyte"); zyppng::TransferSettings set = web.transferSettings(); zypp::filesystem::TmpFile targetFile; auto reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); reqDLFile->addRequestRange( 0, str1.length() ); reqDLFile->addRequestRange( 10, str2.length() + 1 ); reqDLFile->addRequestRange( 25, str3.length() ); disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); BOOST_TEST_REQ_ERR( reqDLFile, zyppng::NetworkRequestError::MissingData ); } // Get many ranges from a file to force the downloader into using multiple batches // and the server to generate range failure for requesting > 128 ranges ( configured in nginx.conf ) BOOST_DATA_TEST_CASE(nwdispatcher_multipart_many_chunks_dl, bdata::make( withSSL ), withSSL ) { auto ev = zyppng::EventLoop::create(); auto disp = std::make_shared(); disp->sigQueueFinished().connect( [&ev]( const zyppng::NetworkRequestDispatcher& ){ ev->quit(); }); disp->run(); WebServer web((zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site").c_str(), 10001, withSSL ); BOOST_REQUIRE( web.start() ); auto weburl = web.url(); weburl.setPathName("/file-1.txt"); auto sourceFile = zypp::Pathname(TESTS_SRC_DIR)/"zypp/data/Fetcher/remote-site/file-1.txt"; zyppng::TransferSettings set = web.transferSettings(); zypp::filesystem::TmpFile targetFile; zypp::PathInfo pi( sourceFile ); // request every other chunk from the file zypp::ByteCount seekInterval = pi.size () / 512; auto reqDLFile = std::make_shared( weburl, targetFile.path() ); reqDLFile->transferSettings() = set; reqDLFile->setUrl( weburl ); auto chunkLen = seekInterval / 2; for ( zypp::ByteCount off = 0;( off + chunkLen )< pi.size(); off += seekInterval ) { reqDLFile->addRequestRange( off, chunkLen ); } disp->enqueue( reqDLFile ); if ( disp->count () ) ev->run(); auto err = reqDLFile->error(); BOOST_TEST_REQ_SUCCESS( reqDLFile ); std::string downloaded = TestTools::readFile ( targetFile.path() ); BOOST_REQUIRE( !downloaded.empty() ); std::string sourceData = TestTools::readFile ( sourceFile ); for ( zypp::ByteCount off = 0;( off + chunkLen )< pi.size(); off += seekInterval ) { BOOST_REQUIRE_EQUAL( std::string_view ( sourceData.data()+off , chunkLen ), std::string_view ( downloaded.data()+off , chunkLen ) ); } } libzypp-17.36.5/tests/zyppng/media/Provider_test.cc000066400000000000000000001237621476576476200223410ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "WebServer.h" #include "TestTools.h" #include #include #ifndef TESTS_BUILD_DIR #error "TESTS_BUILD_DIR not defined" #endif #define ZYPP_REQUIRE_THROW( statement, exception ) \ try { BOOST_REQUIRE_THROW( statement, exception ); } catch( ... ) { BOOST_FAIL( #statement" throws unexpected exception"); } namespace bdata = boost::unit_test::data; BOOST_AUTO_TEST_CASE( http_prov_time_overflow ) { const int64_t ts = int64_t(INT32_MAX) + 1; auto inf = zyppng::ProvideMessage::createAuthInfo( 1, "user", "pw", ts ); auto stomp = inf.toStompMessage (); auto msg = zyppng::ProvideMessage::fromStompMessage ( stomp.unwrap() ); BOOST_REQUIRE_EQUAL( ts,msg.unwrap ().value ( zyppng::AuthInfoMsgFields::AuthTimestamp ).asInt64 () ); } BOOST_AUTO_TEST_CASE( http_prov ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); auto fileUrl = web.url(); fileUrl.setPathName( "/media.1/media" ); auto op = prov->provide( fileUrl, zyppng::ProvideFileSpec() ); std::exception_ptr err; std::optional resOpt; op->onReady([&]( zyppng::expected &&res ){ ev->quit(); if ( !res ) err = res.error(); else resOpt = *res; }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); BOOST_REQUIRE( !err ); BOOST_REQUIRE( resOpt.has_value() ); zypp::PathInfo pi( resOpt->file() ); BOOST_REQUIRE( pi.isExist() ); BOOST_REQUIRE( pi.isFile() ); std::ifstream in( resOpt->file().asString(), std::ios::binary ); auto sum = zypp::CheckSum::md5( in ); BOOST_REQUIRE_EQUAL( sum, std::string("63b4a45ec881d90b83c2e6af7bcbfa78") ); } BOOST_AUTO_TEST_CASE( http_attach ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname (TESTS_SRC_DIR)/"/zyppng/data/downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); auto op = prov->attachMedia( web.url(), zyppng::ProvideMediaSpec( "OnlineMedia" ) .setMediaFile( webRoot / "media.1" / "media" ) .setMedianr(1) ); op->onReady([&]( zyppng::expected &&res ){ ev->quit(); BOOST_REQUIRE( res.is_valid() ); BOOST_REQUIRE( !res->handle().empty() ); }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); } BOOST_AUTO_TEST_CASE( http_attach_prov ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); zyppng::Provide::MediaHandle media; auto op = prov->attachMedia( web.url(), zyppng::ProvideMediaSpec( "OnlineMedia" ) .setMediaFile( webRoot / "media.1" / "media" ) .setMedianr(1) ) | and_then ( [&]( zyppng::Provide::MediaHandle &&res ){ media = std::move(res); return prov->provide( media, "/test.txt", zyppng::ProvideFileSpec() ); }); std::optional fileRes; op->onReady([&]( zyppng::expected &&res ){ if ( res ) fileRes = std::move(*res); ev->quit(); }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); BOOST_REQUIRE( fileRes.has_value() ); zypp::PathInfo pi ( fileRes->file() ); BOOST_REQUIRE( pi.isExist() && pi.isFile() ); std::ifstream in( fileRes->file().asString(), std::ios::binary ); auto sum = zypp::CheckSum::md5( in ); BOOST_REQUIRE_EQUAL( sum, std::string("7e562d52c100b68e9d6a561fa8519575") ); } BOOST_AUTO_TEST_CASE( http_attach_prov_404 ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); zyppng::Provide::MediaHandle media; auto op = prov->attachMedia( web.url(), zyppng::ProvideMediaSpec( "OnlineMedia" ) .setMediaFile( webRoot / "media.1" / "media" ) .setMedianr(1) ) | and_then ( [&]( zyppng::Provide::MediaHandle &&res ){ media = std::move(res); return prov->provide( media, "/doesnotexist", zyppng::ProvideFileSpec() ); }); std::optional fileRes; op->onReady([&]( zyppng::expected &&res ){ ev->quit(); BOOST_REQUIRE(!res); if ( !res ) { ZYPP_REQUIRE_THROW( std::rethrow_exception( res.error() ), zypp::media::MediaFileNotFoundException ); } }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); } // special case where we can detect that something is a directory because we already provided a file from the // directory that's required as a file. BOOST_AUTO_TEST_CASE( http_attach_prov_notafile ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); zyppng::Provide::MediaHandle media; std::exception_ptr err; auto op = prov->attachMedia( web.url(), zyppng::ProvideMediaSpec( "OnlineMedia" ) .setMediaFile( webRoot / "media.1" / "media" ) .setMedianr(1) ) | and_then ( [&]( zyppng::Provide::MediaHandle &&res ){ media = std::move(res); return prov->provide( media, "/media.1", zyppng::ProvideFileSpec() ); }); op->onReady([&]( zyppng::expected &&res ){ ev->quit(); if ( !res ) err = res.error(); }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); BOOST_REQUIRE( err ); ZYPP_REQUIRE_THROW( std::rethrow_exception( err ), zypp::media::MediaNotAFileException ); } //creates a request handler that requires a authentication to work WebServer::RequestHandler createAuthHandler ( const zypp::Pathname &webroot = "/" ) { return [ webroot ]( WebServer::Request &req ){ //Basic dGVzdDp0ZXN0 auto it = req.params.find( "HTTP_AUTHORIZATION" ); bool authorized = false; if ( it != req.params.end() ) authorized = ( it->second == "Basic dGVzdDp0ZXN0" ); if ( !authorized ) { req.rout << "Status: 401 Unauthorized\r\n" "Content-Type: text/html; charset=utf-8\r\n" "WWW-Authenticate: Basic realm=\"User Visible Realm\", charset=\"UTF-8\" \r\n" "\r\n" "Sorry you are not authorized."; return; } //remove "/handler/" prefix std::string key = req.params.at("SCRIPT_NAME").substr( std::string_view("/handler").length() ); req.rout << "Status: 307 Temporary Redirect\r\n" "Location: "<< webroot / key <<"\r\n\r\n"; return; }; }; BOOST_AUTO_TEST_CASE( http_prov_auth ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); //don't write or read creds from real settings dir zypp::filesystem::TmpDir globCredPath; zypp::filesystem::TmpDir userCredPath; zypp::media::CredManagerOptions opts; opts.globalCredFilePath = globCredPath.path() / "credentials.cat"; opts.userCredFilePath = userCredPath.path() / "credentials.cat"; prov->setCredManagerOptions( opts ); bool gotSigAuthRequired = false; prov->sigAuthRequired().connect( [&]( const zypp::Url &reqUrl, const std::string &triedUsername, const std::map &extraValues ) -> std::optional { gotSigAuthRequired = true; zypp::media::AuthData auth( reqUrl ); auth.setUsername( "test" ); auth.setPassword( "test" ); auth.setLastDatabaseUpdate( time( nullptr ) ); return auth; }); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); web.setDefaultHandler( createAuthHandler() ); auto fileUrl = web.url(); fileUrl.setPathName( "/handler/test.txt" ); auto op = prov->provide( fileUrl, zyppng::ProvideFileSpec() ); std::exception_ptr err; std::optional resOpt; op->onReady([&]( zyppng::expected &&res ){ ev->quit(); if ( !res ) err = res.error(); else resOpt = *res; }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); //BOOST_REQUIRE( gotSigAuthRequired ); BOOST_REQUIRE( !err ); BOOST_REQUIRE( resOpt.has_value() ); zypp::PathInfo pi( resOpt->file() ); BOOST_REQUIRE( pi.isExist() ); BOOST_REQUIRE( pi.isFile() ); std::ifstream in( resOpt->file().asString(), std::ios::binary ); auto sum = zypp::CheckSum::md5( in ); BOOST_REQUIRE_EQUAL( sum, std::string("7e562d52c100b68e9d6a561fa8519575") ); } BOOST_AUTO_TEST_CASE( http_prov_auth_nouserresponse ) { using namespace zyppng::operators; //don't write or read creds from real settings dir zypp::filesystem::TmpDir repoManagerRoot; zypp::ZConfig::instance().setRepoManagerRoot( repoManagerRoot.path() ); auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); //don't write or read creds from real settings dir zypp::filesystem::TmpDir globCredPath; zypp::filesystem::TmpDir userCredPath; zypp::media::CredManagerOptions opts; opts.globalCredFilePath = globCredPath.path() / "credentials.cat"; opts.userCredFilePath = userCredPath.path() / "credentials.cat"; prov->setCredManagerOptions( opts ); bool gotSigAuthRequired = false; prov->sigAuthRequired().connect( [&]( const zypp::Url &, const std::string &, const std::map & ) -> std::optional { gotSigAuthRequired = true; return {}; }); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); web.setDefaultHandler( createAuthHandler() ); auto fileUrl = web.url(); fileUrl.setPathName( "/handler/test.txt" ); auto op = prov->provide( fileUrl, zyppng::ProvideFileSpec() ); std::exception_ptr err; std::optional resOpt; op->onReady([&]( zyppng::expected &&res ){ ev->quit(); if ( !res ) err = res.error(); else resOpt = *res; }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); BOOST_REQUIRE( gotSigAuthRequired ); BOOST_REQUIRE( err ); BOOST_REQUIRE( !resOpt.has_value() ); ZYPP_REQUIRE_THROW( std::rethrow_exception( err ), zypp::media::MediaUnauthorizedException ); } BOOST_AUTO_TEST_CASE( http_prov_auth_wrongpw ) { using namespace zyppng::operators; //don't write or read creds from real settings dir zypp::filesystem::TmpDir repoManagerRoot; zypp::ZConfig::instance().setRepoManagerRoot( repoManagerRoot.path() ); auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); prov->start(); //don't write or read creds from real settings dir zypp::filesystem::TmpDir globCredPath; zypp::filesystem::TmpDir userCredPath; zypp::media::CredManagerOptions opts; opts.globalCredFilePath = globCredPath.path() / "credentials.cat"; opts.userCredFilePath = userCredPath.path() / "credentials.cat"; prov->setCredManagerOptions( opts ); int cntAuthRequired = 0; prov->sigAuthRequired().connect( [&]( const zypp::Url &reqUrl, const std::string &, const std::map & ) -> std::optional { cntAuthRequired++; zypp::media::AuthData auth( reqUrl ); auth.setLastDatabaseUpdate( time( nullptr ) ); if ( cntAuthRequired >= 2 ) { auth.setUsername( "test" ); auth.setPassword( "test" ); } else { auth.setUsername( "test" ); auth.setPassword( "wrong" ); } return auth; }); WebServer web( webRoot.c_str(), 10001, false ); BOOST_REQUIRE( web.start() ); web.setDefaultHandler( createAuthHandler() ); auto fileUrl = web.url(); fileUrl.setPathName( "/handler/test.txt" ); auto op = prov->provide( fileUrl, zyppng::ProvideFileSpec() ); std::exception_ptr err; std::optional resOpt; op->onReady([&]( zyppng::expected &&res ){ ev->quit(); if ( !res ) err = res.error(); else resOpt = *res; }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); BOOST_REQUIRE_EQUAL( cntAuthRequired, 2 ); BOOST_REQUIRE( !err ); BOOST_REQUIRE( resOpt.has_value() ); zypp::PathInfo pi( resOpt->file() ); BOOST_REQUIRE( pi.isExist() ); BOOST_REQUIRE( pi.isFile() ); std::ifstream in( resOpt->file().asString(), std::ios::binary ); auto sum = zypp::CheckSum::md5( in ); BOOST_REQUIRE_EQUAL( sum, std::string("7e562d52c100b68e9d6a561fa8519575") ); } BOOST_AUTO_TEST_CASE( http_attach_prov_auth ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &webRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "downloader"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); //don't write or read creds from real settings dir zypp::filesystem::TmpDir globCredPath; zypp::filesystem::TmpDir userCredPath; zypp::media::CredManagerOptions opts; opts.globalCredFilePath = globCredPath.path() / "credentials.cat"; opts.userCredFilePath = userCredPath.path() / "credentials.cat"; prov->setCredManagerOptions( opts ); int cntAuthRequired = 0; prov->sigAuthRequired().connect( [&]( const zypp::Url &reqUrl, const std::string &, const std::map & ) -> std::optional { cntAuthRequired++; zypp::media::AuthData auth( reqUrl ); auth.setLastDatabaseUpdate( time( nullptr ) ); auth.setUsername( "test" ); auth.setPassword( "test" ); return auth; }); prov->start(); WebServer web( webRoot.c_str(), 10001, false ); web.setDefaultHandler( createAuthHandler() ); BOOST_REQUIRE( web.start() ); zyppng::Provide::MediaHandle media; auto baseUrl = web.url(); baseUrl.setPathName("/handler"); auto op = prov->attachMedia( baseUrl, zyppng::ProvideMediaSpec( "OnlineMedia" ) .setMediaFile( webRoot / "media.1" / "media" ) .setMedianr(1) ) | and_then ( [&]( zyppng::Provide::MediaHandle &&res ){ media = std::move(res); return prov->provide( media, "/test.txt", zyppng::ProvideFileSpec() ); }); std::optional fileRes; op->onReady([&]( zyppng::expected &&res ){ if ( res ) fileRes = std::move(*res); ev->quit(); }); BOOST_REQUIRE( !op->isReady() ); if ( !op->isReady() ) ev->run(); BOOST_REQUIRE_EQUAL( cntAuthRequired, 1 ); // after the first auth request all others should work BOOST_REQUIRE( fileRes.has_value() ); zypp::PathInfo pi ( fileRes->file() ); BOOST_REQUIRE( pi.isExist() && pi.isFile() ); std::ifstream in( fileRes->file().asString(), std::ios::binary ); auto sum = zypp::CheckSum::md5( in ); BOOST_REQUIRE_EQUAL( sum, std::string("7e562d52c100b68e9d6a561fa8519575") ); } static void writeTVMConfig ( const zypp::Pathname &file, const zypp::test::TVMSettings &set ) { try { YAML::Emitter yOut; yOut << YAML::convert::encode( set ); const auto &fname = file/"tvm.conf"; std::ofstream fout( fname.asString() ); fout << yOut.c_str(); MIL << "TVM config serialized to: " << fname << std::endl; } catch ( YAML::Exception &e ) { WAR << "YAML exception when serializing the control file: " << e.what() << std::endl; return; } catch ( const std::exception &e ) { WAR << "Error when serializing the control file: " << e.what() << std::endl; return; } catch ( ... ) { WAR << "Unknown error when serializing the control file" << std::endl; return; } } static auto makeDVDProv ( zyppng::ProvideRef &prov, const zypp::filesystem::Pathname &devRoot, int mediaNr, const std::string &fName ) { using namespace zyppng::operators; return prov->attachMedia( zypp::Url("tvm:/"), zyppng::ProvideMediaSpec("CD Test Set") .setMediaFile( devRoot / (std::string("cd") + zypp::str::numstring(mediaNr)) / (std::string("media.") + zypp::str::numstring(mediaNr)) / "media" ) .setMedianr(mediaNr)) | [&prov, mediaNr, fName]( zyppng::expected &&res ){ if ( res ) { std::cout << "Attached " << mediaNr << " as: " << res->handle() << std::endl; return prov->provide ( *res, fName , zyppng::ProvideFileSpec() ) | [ attachId = *res, &prov ]( auto &&res ) { if ( !res ) { try { std::rethrow_exception(res.error()); } catch ( const zypp::Exception &e ) { std::cout << "Provide failed with " << e <file () <::error(res.error()) ); } } | []( zyppng::expected &&res ) { if ( !res ) { try { std::rethrow_exception(res.error()); } catch ( const zypp::Exception &e ) { std::cout << "Provide failed with " << e <::error(res.error()); } catch ( ... ) { std::cout << "Provide failed with exception " << std::endl; return zyppng::expected::error(res.error()); } } else { return zyppng::expected::success(); } }; } BOOST_AUTO_TEST_CASE( tvm_basic ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &devRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "provide"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); zypp::test::TVMSettings devSet; devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot1", .insertedPath = (devRoot/"cd1").asString() } ); devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot2", .insertedPath = (devRoot/"cd2").asString() } ); devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot3", .insertedPath = (devRoot/"cd3").asString() } ); writeTVMConfig( provideRoot, devSet ); prov->start(); std::vector< zyppng::AsyncOpRef>> ops; ops.push_back( makeDVDProv( prov, devRoot, 1, "/file1") ); ops.push_back( makeDVDProv( prov, devRoot, 2, "/file2") ); ops.push_back( makeDVDProv( prov, devRoot, 3, "/file3") ); auto r = std::move(ops) | zyppng::waitFor(); r->sigReady().connect([&](){ ev->quit(); }); BOOST_REQUIRE( !r->isReady() ); if ( !r->isReady() ) ev->run(); for ( const auto &res : r->get() ) { BOOST_REQUIRE(res); } } BOOST_AUTO_TEST_CASE( tvm_medchange ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &devRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "provide"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); zypp::test::TVMSettings devSet; devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot1", .insertedPath = (devRoot/"cd1").asString() } ); devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot2", .insertedPath = "" } ); devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot3", .insertedPath = "" } ); writeTVMConfig( provideRoot, devSet ); prov->start(); bool gotMediaChange = false; std::vector freeDevices; int32_t mediaNrAsked = -1; std::string labelAsked; prov->sigMediaChangeRequested().connect([&]( const std::string &ref, const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc ){ gotMediaChange = true; freeDevices = devices; labelAsked = label; mediaNrAsked = mediaNr; devSet.devices[1].insertedPath = (devRoot/"cd2").asString(); writeTVMConfig( provideRoot, devSet ); return zyppng::Provide::RETRY; }); std::vector< zyppng::AsyncOpRef>> ops; ops.push_back( makeDVDProv( prov, devRoot, 1, "/file1") ); ops.push_back( makeDVDProv( prov, devRoot, 2, "/file2") ); auto r = std::move(ops) | zyppng::waitFor(); r->sigReady().connect([&](){ ev->quit(); }); BOOST_REQUIRE( !r->isReady() ); if ( !r->isReady() ) ev->run(); BOOST_REQUIRE( gotMediaChange ); BOOST_REQUIRE_EQUAL( labelAsked, std::string("CD Test Set") ); BOOST_REQUIRE_EQUAL( mediaNrAsked, 2 ); BOOST_REQUIRE( std::find( freeDevices.begin(), freeDevices.end(), "/fakedev/tvm/slot2" ) != freeDevices.end() ); BOOST_REQUIRE( std::find( freeDevices.begin(), freeDevices.end(), "/fakedev/tvm/slot3" ) != freeDevices.end() ); for ( const auto &res : r->get() ) { BOOST_REQUIRE(res); } } zyppng::Provide::Action cancelOps[] = { zyppng::Provide::ABORT, zyppng::Provide::SKIP }; BOOST_DATA_TEST_CASE( tvm_medchange_abort, bdata::make( cancelOps ), cancelOp ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &devRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "provide"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); zypp::test::TVMSettings devSet; devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot1", .insertedPath = (devRoot/"cd1").asString() } ); devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot2", .insertedPath = "" } ); devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot3", .insertedPath = "" } ); writeTVMConfig( provideRoot, devSet ); prov->start(); bool gotMediaChange = false; std::vector freeDevices; int32_t mediaNrAsked = -1; std::string labelAsked; prov->sigMediaChangeRequested().connect([&]( const std::string &ref, const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc ){ gotMediaChange = true; freeDevices = devices; labelAsked = label; mediaNrAsked = mediaNr; return cancelOp; }); auto op1 = makeDVDProv( prov, devRoot, 1, "/file1"); auto op2 = makeDVDProv( prov, devRoot, 2, "/file2"); const auto &readyCB = [&](){ if ( op1->isReady() && op2->isReady() ) ev->quit(); }; op1->sigReady().connect( readyCB ); op2->sigReady().connect( readyCB ); BOOST_REQUIRE( !op1->isReady() ); BOOST_REQUIRE( !op2->isReady() ); if ( !op1->isReady() && !op2->isReady() ) ev->run(); BOOST_REQUIRE( gotMediaChange ); BOOST_REQUIRE_EQUAL( labelAsked, std::string("CD Test Set") ); BOOST_REQUIRE_EQUAL( mediaNrAsked, 2 ); BOOST_REQUIRE( std::find( freeDevices.begin(), freeDevices.end(), "/fakedev/tvm/slot2" ) != freeDevices.end() ); BOOST_REQUIRE( std::find( freeDevices.begin(), freeDevices.end(), "/fakedev/tvm/slot3" ) != freeDevices.end() ); BOOST_REQUIRE( op1->get().is_valid() ); BOOST_REQUIRE( !op2->get().is_valid() ); if ( cancelOp == zyppng::Provide::ABORT ) { ZYPP_REQUIRE_THROW( std::rethrow_exception( op2->get().error() ), zypp::AbortRequestException ); } else { ZYPP_REQUIRE_THROW( std::rethrow_exception( op2->get().error() ), zypp::SkipRequestException ); } } BOOST_AUTO_TEST_CASE( tvm_jammed ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &devRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "provide"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); bool gotMediaChange = false; prov->sigMediaChangeRequested().connect([&]( const std::string &ref, const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc ){ gotMediaChange = true; return zyppng::Provide::ABORT; }); zypp::test::TVMSettings devSet; devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot1", .insertedPath = (devRoot/"cd1").asString() } ); writeTVMConfig( provideRoot, devSet ); prov->start(); auto op1 = prov->attachMedia( zypp::Url("tvm:/"), zyppng::ProvideMediaSpec("CD Test Set") .setMediaFile( devRoot / (std::string("cd") + zypp::str::numstring(1)) / (std::string("media.") + zypp::str::numstring(1)) / "media" ) .setMedianr(1)); auto op2 = prov->attachMedia( zypp::Url("tvm:/"), zyppng::ProvideMediaSpec("CD Test Set") .setMediaFile( devRoot / (std::string("cd") + zypp::str::numstring(2)) / (std::string("media.") + zypp::str::numstring(2)) / "media" ) .setMedianr(2)); const auto &readyCB = [&](){ if ( op1->isReady() && op2->isReady() ) ev->quit(); }; op1->sigReady().connect( readyCB ); op2->sigReady().connect( readyCB ); BOOST_REQUIRE( !op1->isReady() ); BOOST_REQUIRE( !op2->isReady() ); if ( !op1->isReady() && !op2->isReady() ) ev->run(); //we have only one drive which is in use, so we can not be asked for media change BOOST_REQUIRE( !gotMediaChange ); BOOST_REQUIRE( op1->get().is_valid() ); BOOST_REQUIRE( !op2->get().is_valid() ); ZYPP_REQUIRE_THROW( std::rethrow_exception( op2->get().error() ), zypp::media::MediaJammedException ); } // test if we can release a medium and immediately use the resulting free space for new requests BOOST_AUTO_TEST_CASE( tvm_jammed_release ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); const auto &workerPath = zypp::Pathname ( TESTS_BUILD_DIR ).dirname() / "tools" / "workers"; const auto &devRoot = zypp::Pathname ( TESTS_SRC_DIR ) / "zyppng" / "data" / "provide"; zypp::filesystem::TmpDir provideRoot; auto prov = zyppng::Provide::create ( provideRoot ); prov->setWorkerPath ( workerPath ); zypp::test::TVMSettings devSet; bool mediaChangeAllowed = false; bool gotInvalidMediaChange = false; prov->sigMediaChangeRequested().connect([&]( const std::string &ref, const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc ){ if ( ! mediaChangeAllowed ) { gotInvalidMediaChange = true; return zyppng::Provide::ABORT; } devSet.devices[0].insertedPath = (devRoot/"cd2").asString(); writeTVMConfig( provideRoot, devSet ); return zyppng::Provide::RETRY; }); devSet.devices.push_back( zypp::test::TVMSettings::Device{ .name = "/fakedev/tvm/slot1", .insertedPath = (devRoot/"cd1").asString() } ); writeTVMConfig( provideRoot, devSet ); prov->start(); auto op1 = prov->attachMedia( zypp::Url("tvm:/"), zyppng::ProvideMediaSpec("CD Test Set") .setMediaFile( devRoot / (std::string("cd") + zypp::str::numstring(1)) / (std::string("media.") + zypp::str::numstring(1)) / "media" ) .setMedianr(1)); zyppng::AsyncOpRef> op2; zyppng::AsyncOpRef> op3; bool attach1Success = false; bool attach3Success = false; std::exception_ptr op2Error; op1->sigReady().connect( [&]() { if ( !op1->get() ) { attach1Success = false; ev->quit(); return; } attach1Success = true; op2 = prov->attachMedia( zypp::Url("tvm:/"), zyppng::ProvideMediaSpec("CD Test Set") .setMediaFile( devRoot / (std::string("cd") + zypp::str::numstring(2)) / (std::string("media.") + zypp::str::numstring(2)) / "media" ) .setMedianr(2)); op2->sigReady().connect([&](){ if ( !op2->get().is_valid() ) { op2Error = op2->get().error(); op1.reset(); // kill the first media handle mediaChangeAllowed = true; op3 = prov->attachMedia( zypp::Url("tvm:/"), zyppng::ProvideMediaSpec("CD Test Set") .setMediaFile( devRoot / (std::string("cd") + zypp::str::numstring(2)) / (std::string("media.") + zypp::str::numstring(2)) / "media" ) .setMedianr(2)); op3->sigReady().connect( [&]() { ev->quit(); if ( !op3->get() ) attach3Success = false; else attach3Success = true; }); return; } ev->quit(); }); }); BOOST_REQUIRE( !op1->isReady() ); BOOST_REQUIRE( !op2 || !op2->isReady() ); BOOST_REQUIRE( !op3 || !op3->isReady() ); if ( !op1->isReady() ) ev->run(); //we have only one drive which is in use, so we can not be asked for media change BOOST_REQUIRE( !gotInvalidMediaChange ); BOOST_REQUIRE( attach1Success ); BOOST_REQUIRE( op2Error != nullptr ); ZYPP_REQUIRE_THROW( std::rethrow_exception( op2Error ), zypp::media::MediaJammedException ); BOOST_REQUIRE( attach3Success ); BOOST_REQUIRE( !op2->get().is_valid() ); } #if 0 BOOST_AUTO_TEST_CASE( dltest_basic ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create (); auto prov = zyppng::Provide::create ( "/tmp/provTest" ); prov->setWorkerPath ( "/home/zbenjamin/build/build-libzypp-Desktop_GCC-Debug/tools/workers" ); prov->start(); std::string baseURL = "http://download.opensuse.org/distribution/leap/15.0/repo/oss"; std::vector downloads { "11822f1421ae50fb1a07f72220b79000", "/x86_64/0ad-0.0.22-lp150.2.10.x86_64.rpm", "b0aaaca4c3763792a495de293c8431c5", "/x86_64/alsa-1.1.5-lp150.4.3.x86_64.rpm", "a6eb92351c03bcf603a09a2e8eddcead", "/x86_64/amarok-2.9.0-lp150.2.1.x86_64.rpm", "a2fd84f6d0530abbfe6d5a3da3940d70", "/x86_64/aspell-0.60.6.1-lp150.1.15.x86_64.rpm", "29b5eab4a9620f158331106df4603866", "/x86_64/atk-devel-2.26.1-lp150.2.4.x86_64.rpm", "a795874986018674c37af85a62c8f28a", "/x86_64/bing-1.0.5-lp150.2.1.x86_64.rpm", "ce09cb1af156203c89312f9faffce219", "/x86_64/cdrtools-3.02~a09-lp150.2.11.x86_64.rpm", "3f57113bd0dea2b5d748b7a343a7fb31", "/x86_64/cfengine-3.11.0-lp150.2.3.x86_64.rpm", "582cae086f67382e71bf02ff0db554cd", "/x86_64/cgit-1.1-lp150.1.5.x86_64.rpm", "f10cfc37a20c13d59266241ecc30b152", "/x86_64/ck-devel-0.6.0-lp150.1.3.x86_64.rpm", "4a19708dc8d58129f8832d934c47888b", "/x86_64/cloud-init-18.2-lp150.1.1.x86_64.rpm", "7b535587d9bfd8b88edf57b6df5c4d99", "/x86_64/collectd-plugin-pinba-5.7.2-lp150.1.4.x86_64.rpm", "d86c1d65039645a1895f458f38d9d9e7", "/x86_64/compface-1.5.2-lp150.1.4.x86_64.rpm", "33a0e878c92b5b298cd6aaec44c0aa46", "/x86_64/compositeproto-devel-0.4.2-lp150.1.6.x86_64.rpm", "646c6cc180caf27f56bb9ec5b4d50f5b", "/x86_64/corosync-testagents-2.4.4-lp150.3.1.x86_64.rpm", "10685e733abf77e7439e33471b23612c", "/x86_64/cpupower-bench-4.15-lp150.1.4.x86_64.rpm" }; prov->sigMediaChangeRequested().connect([&]( const std::string &ref, const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc ){ std::cout << "Please insert medium: " << mediaNr << " of media set " << label << " into one of the free devices: " << std::endl; if ( desc ) std::cout << "Media desc: " << *desc << std::endl; std::vector choices; for ( uint i = 0 ; i < devices.size (); i++ ) { std::cout << "(" << i << ") Free device: " << devices.at(i) << std::endl; choices.push_back( zypp::str::numstring(i)); } while ( true ) { std::string choice; std::cout << "Select the device you want to use, or a for abort" << std::endl; std::getline( std::cin, choice ); if ( choice == "a" ) return zyppng::Provide::ABORT; auto i = std::find( choices.begin(), choices.end(), choice ); if ( i == choices.end() ) { std::cout << "Invalid answer, please select a device from the list" << std::endl; continue; } auto sel = std::distance( choices.begin(), i ); prov->ejectDevice( ref, devices.at(sel) ); break; } std::string dummy; std::cout << "Please insert the medium and press a key to continue" << std::endl; std::getline( std::cin, dummy ); return zyppng::Provide::RETRY; }); prov->sigAuthRequired().connect( [&]( const zypp::Url &reqUrl, const std::string &triedUsername, const std::map &extraValues ) -> std::optional { std::cout << reqUrl << " requires authentication, previously tried username was: " << triedUsername << std::endl; std::cout << "Please enter the username: " << std::endl; std::string username; std::getline ( std::cin, username ); std::cout << "Please enter the password: " << std::endl; std::string pass; std::getline ( std::cin, pass ); zypp::media::AuthData d( username, pass ); return d; }); std::vector< zyppng::AsyncOpRef>> ops; #if 0 ops.push_back( prov->attachMedia ( baseURL, zyppng::ProvideMediaSpec( "Label1" ).setMediaFile( "/tmp/provTest/media" ).setMedianr(1) ) | [&]( zyppng::expected &&res ){ if ( res ) { std::cout << "Attached as: " << *res << std::endl; std::vector>> provs; for ( std::size_t i = 0; i < downloads.size(); i+=2 ) { const auto &pName = zypp::Pathname(downloads[i+1]); std::cout << "Asking to provide file: " << pName << std::endl; provs.push_back( prov->provide ( *res, pName, zyppng::ProvideFileSpec() ) | []( auto &&res ) { if ( !res ) { try { std::rethrow_exception(res.error()); } catch ( const zypp::Exception &e ) { std::cout << "Provide failed with " << e <file () <>(); } std::cout << "Failed to attach media" << std::endl; return zyppng::makeReadyResult( std::vector> { zyppng::expected::error(res.error()) } ); } | []( std::vector> &&results ){ for ( const auto &r : results ) { if ( !r ) return zyppng::expected::error( r.error() ); } return zyppng::expected::success(); }); #endif const auto &makeDVDProv = [&]( int mediaNr, const std::string &fName ){ return prov->attachMedia( zypp::Url("dvd:/"), zyppng::ProvideMediaSpec("CD Test Set") .setMediaFile("/tmp/provTest/mediacd") .setMedianr(mediaNr) .addCustomHeaderValue ("device", "/dev/sr1") .addCustomHeaderValue ("device", "/dev/sr2")) | [&]( zyppng::expected &&res ){ if ( res ) { std::cout << "Attached as: " << res->handle() << std::endl; return prov->provide ( *res, fName , zyppng::ProvideFileSpec() ) | [ attachId = *res, &prov ]( auto &&res ) { if ( !res ) { try { std::rethrow_exception(res.error()); } catch ( const zypp::Exception &e ) { std::cout << "Provide failed with " << e <file () <::error(res.error()) ); } } | []( zyppng::expected &&res ) { if ( !res ) { try { std::rethrow_exception(res.error()); } catch ( const zypp::Exception &e ) { std::cout << "Provide failed with " << e <::error(res.error()); } catch ( ... ) { std::cout << "Provide failed with exception " << std::endl; return zyppng::expected::error(res.error()); } } else { return zyppng::expected::success(); } }; }; ops.push_back( makeDVDProv(1, "/file1") ); ops.push_back( makeDVDProv(1, "/file1") ); ops.push_back( makeDVDProv(1, "/file1") ); auto r = std::move(ops) | zyppng::waitFor>(); r->onReady( [&]( std::vector> &&results ){ for ( const auto &res : results ) { if ( res ) { std::cout << "Request finished successfull" << std::endl; } else { try { std::rethrow_exception (res.error()); } catch ( const zypp::Exception &e ) { std::cout << "Request failed with " << e <quit(); }); ev->run (); return; } #endif libzypp-17.36.5/tests/zyppng/rpc/000077500000000000000000000000001476576476200166735ustar00rootroot00000000000000libzypp-17.36.5/tests/zyppng/rpc/CMakeLists.txt000066400000000000000000000000421476576476200214270ustar00rootroot00000000000000ADD_TESTS( StompMessageStream ) libzypp-17.36.5/tests/zyppng/rpc/StompMessageStream_test.cc000066400000000000000000000275721476576476200240410ustar00rootroot00000000000000#include #include #include #include #include #include #include #include BOOST_AUTO_TEST_CASE(ReceiveFrame) { int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->readFdOpen() ); std::optional received; auto msgQueue = zyppng::StompFrameStream::create ( dataSource ); msgQueue->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, [&](){ received = msgQueue->nextMessage (); loop->quit(); }); msgQueue->connectFunc( &zyppng::StompFrameStream::sigInvalidMessageReceived, [&](){ loop->quit(); }); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); { std::string_view text ( "COMMAND\n" "content-length:5\n" "\n" "Hello\0", 32 ); std::thread writer( []( int writeFd, std::string_view text ){ ::write( writeFd, text.data(), text.length() ); ::close( writeFd ); }, pipeFds[1], text ); loop->run(); writer.join(); } ::close( pipeFds[0] ); BOOST_REQUIRE( received.has_value () ); BOOST_REQUIRE_EQUAL( received->command (), "COMMAND" ); BOOST_REQUIRE_EQUAL( received->bodyRef ().asStringView(), "Hello" ); } BOOST_AUTO_TEST_CASE(ReceiveFrameBinary) { int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->readFdOpen() ); std::optional received; auto msgQueue = zyppng::StompFrameStream::create ( dataSource ); msgQueue->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, [&](){ received = msgQueue->nextMessage (); loop->quit(); }); msgQueue->connectFunc( &zyppng::StompFrameStream::sigInvalidMessageReceived, [&](){ loop->quit(); }); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); { std::string_view text ( "COMMAND\n" "content-length:6\n" "\n" "He\0llo\0", 33 ); std::thread writer( []( int writeFd, std::string_view text ){ ::write( writeFd, text.data(), text.length() ); ::close( writeFd ); }, pipeFds[1], text ); loop->run(); writer.join(); } ::close( pipeFds[0] ); BOOST_REQUIRE( received.has_value () ); BOOST_REQUIRE_EQUAL( received->command (), "COMMAND" ); BOOST_REQUIRE( received->bodyRef () == zyppng::ByteArray("He\0llo", 6) ); } BOOST_AUTO_TEST_CASE(ReceiveFrameNoContentLen) { int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->readFdOpen() ); std::optional received; auto msgQueue = zyppng::StompFrameStream::create ( dataSource ); msgQueue->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, [&](){ received = msgQueue->nextMessage (); loop->quit(); }); msgQueue->connectFunc( &zyppng::StompFrameStream::sigInvalidMessageReceived, [&](){ loop->quit(); }); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ loop->quit(); }); { std::string_view text ( "COMMAND\n" "\n" "Hello\0", 15 ); std::thread writer( []( int writeFd, std::string_view text ){ ::write( writeFd, text.data(), text.length() ); ::close( writeFd ); }, pipeFds[1], text ); loop->run(); writer.join(); } ::close( pipeFds[0] ); BOOST_REQUIRE( received.has_value () ); BOOST_REQUIRE_EQUAL( received->command (), "COMMAND" ); BOOST_REQUIRE_EQUAL( received->bodyRef ().asStringView(), "Hello" ); } BOOST_AUTO_TEST_CASE(ReceiveMultipleFrames) { int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->readFdOpen() ); bool receivedErr = false; bool timedOut = false; std::vector received; auto msgQueue = zyppng::StompFrameStream::create ( dataSource ); msgQueue->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, [&](){ received.push_back(*msgQueue->nextMessage()); }); msgQueue->connectFunc( &zyppng::StompFrameStream::sigInvalidMessageReceived, [&](){ receivedErr = true; loop->quit(); }); dataSource->connectFunc( &zyppng::AsyncDataSource::sigReadChannelFinished, [&]( uint channel ){ if ( channel == 0 ) loop->quit(); }); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ timedOut = true; loop->quit(); }); { std::string_view text ( "COMMAND\n" "content-length:5\n" "\n" "Hello\0", 32 ); std::thread writer( []( int writeFd, std::string_view text ){ ::write( writeFd, text.data(), text.length() ); ::write( writeFd, text.data(), text.length() ); ::write( writeFd, text.data(), text.length() ); ::close( writeFd ); }, pipeFds[1], text ); loop->run(); writer.join(); } ::close( pipeFds[0] ); BOOST_REQUIRE( !timedOut ); BOOST_REQUIRE( !receivedErr); BOOST_REQUIRE_EQUAL( received.size (), 3 ); for( uint i = 0; i < received.size(); i++ ) { BOOST_REQUIRE_EQUAL( received[i].command (), "COMMAND" ); BOOST_REQUIRE_EQUAL( received[i].bodyRef ().asStringView(), "Hello" ); } } BOOST_AUTO_TEST_CASE(InvalidFrame) { int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->readFdOpen() ); std::optional received; bool receivedErr = false; bool timedOut = false; auto msgQueue = zyppng::StompFrameStream::create ( dataSource ); msgQueue->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, [&](){ received = msgQueue->nextMessage (); loop->quit(); }); msgQueue->connectFunc( &zyppng::StompFrameStream::sigInvalidMessageReceived, [&](){ receivedErr = true; loop->quit(); }); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ timedOut = true; loop->quit(); }); { std::string_view text ( "COMMAND\n" "content-length-5\n" //wrong header, colon is missing "\n" "Hello\0", 32 ); std::thread writer( []( int writeFd, std::string_view text ){ ::write( writeFd, text.data(), text.length() ); ::close( writeFd ); }, pipeFds[1], text ); loop->run(); writer.join(); } ::close( pipeFds[0] ); BOOST_REQUIRE( !received.has_value () ); BOOST_REQUIRE( !timedOut ); BOOST_REQUIRE( receivedErr ); } BOOST_AUTO_TEST_CASE(BodyNotTerminated) { int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSource = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSource->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSource->canRead() ); BOOST_REQUIRE( dataSource->readFdOpen() ); std::optional received; bool receivedErr = false; bool timedOut = false; auto msgQueue = zyppng::StompFrameStream::create ( dataSource ); msgQueue->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, [&](){ received = msgQueue->nextMessage (); loop->quit(); }); msgQueue->connectFunc( &zyppng::StompFrameStream::sigInvalidMessageReceived, [&](){ receivedErr = true; loop->quit(); }); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ timedOut = true; loop->quit(); }); { std::string_view text ( "COMMAND\n" "content-length:5\n" //wrong header, colon is missing "\n" "Hello", 31 ); std::thread writer( []( int writeFd, std::string_view text ){ ::write( writeFd, text.data(), text.length() ); ::write( writeFd, text.data(), text.length() ); ::close( writeFd ); }, pipeFds[1], text ); loop->run(); writer.join(); } ::close( pipeFds[0] ); BOOST_REQUIRE( !received.has_value () ); BOOST_REQUIRE( !timedOut ); BOOST_REQUIRE( receivedErr ); } BOOST_AUTO_TEST_CASE(SerializeFrame) { int pipeFds[2] { -1, -1 }; BOOST_REQUIRE( g_unix_open_pipe( pipeFds, FD_CLOEXEC, nullptr ) ); auto loop = zyppng::EventLoop::create(); auto dataSourceRead = zyppng::AsyncDataSource::create(); auto dataSourceWrite = zyppng::AsyncDataSource::create(); BOOST_REQUIRE( dataSourceRead->openFds( { pipeFds[0] } ) ); BOOST_REQUIRE( dataSourceRead->canRead() ); BOOST_REQUIRE( dataSourceRead->readFdOpen() ); BOOST_REQUIRE( dataSourceWrite->openFds( {}, pipeFds[1] ) ); BOOST_REQUIRE( dataSourceWrite->canWrite() ); zyppng::IODeviceOStreamBuf streamBuf( dataSourceWrite ); std::ostream outStr( &streamBuf ); zypp::PluginFrame data("COMMAND"); data.addHeader ("header1", "value"); data.addHeader ("header2", "value"); data.addHeader ("header3", "value"); data.setBody ("Somedata"); bool gotBytesWritten = false; dataSourceWrite->connectFunc( &zyppng::IODevice::sigAllBytesWritten, [&](){ gotBytesWritten = true; }); BOOST_CHECK_NO_THROW(data.writeTo( outStr )); std::optional received; bool receivedErr = false; bool timedOut = false; auto msgQueue = zyppng::StompFrameStream::create ( dataSourceRead ); msgQueue->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, [&](){ received = msgQueue->nextMessage (); loop->quit(); }); msgQueue->connectFunc( &zyppng::StompFrameStream::sigInvalidMessageReceived, [&](){ receivedErr = true; loop->quit(); }); // make sure we are not stuck auto timer = zyppng::Timer::create(); timer->start( 1000 ); timer->connectFunc( &zyppng::Timer::sigExpired, [&]( auto & ){ timedOut = true; loop->quit(); }); loop->run(); ::close( pipeFds[0] ); BOOST_REQUIRE( !timedOut ); BOOST_REQUIRE( !receivedErr ); BOOST_REQUIRE( received.has_value () ); BOOST_REQUIRE_EQUAL( received->command(), "COMMAND" ); BOOST_REQUIRE_EQUAL( received->headerSize(), 3 ); BOOST_REQUIRE_EQUAL( received->getHeader("header1", {}), "value" ); BOOST_REQUIRE_EQUAL( received->getHeader("header2", {}), "value" ); BOOST_REQUIRE_EQUAL( received->getHeader("header3", {}), "value" ); BOOST_REQUIRE_EQUAL( received->bodyRef().asStringView(), "Somedata"); } libzypp-17.36.5/tools/000077500000000000000000000000001476576476200145565ustar00rootroot00000000000000libzypp-17.36.5/tools/CMakeLists.txt000066400000000000000000000040621476576476200173200ustar00rootroot00000000000000## ############################################################ FILE( GLOB ALLCC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.cc" ) STRING( REPLACE ".cc" ";" APLLPROG ${ALLCC} ) # make sure not to statically linked installed tools SET( LINKALLSYM CalculateReusableBlocks DownloadFiles ) FOREACH( loop_var ${APLLPROG} ) ADD_EXECUTABLE( ${loop_var} ${loop_var}.cc ) TARGET_LINK_LIBRARIES( ${loop_var} PUBLIC zypp_exe_compiler_flags ${Boost_PROGRAM_OPTIONS_LIBRARY} ) LIST( FIND LINKALLSYM ${loop_var} NEEDALLSYM ) if ( NEEDALLSYM EQUAL -1 ) TARGET_LINK_LIBRARIES( ${loop_var} PUBLIC zypp ) ELSE() TARGET_LINK_LIBRARIES( ${loop_var} PUBLIC zypp-allsym ) ENDIF() ENDFOREACH( loop_var ) ## ############################################################ INSTALL(TARGETS zypp-NameReqPrv DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") SET( ZYPP_TOOLS_DIR ${CMAKE_CURRENT_SOURCE_DIR} ) ADD_SUBDIRECTORY( zypp-rpm ) ADD_SUBDIRECTORY( zypp-media-http ) ADD_SUBDIRECTORY( zypp-media-disc ) ADD_SUBDIRECTORY( zypp-media-nfs ) ADD_SUBDIRECTORY( zypp-media-smb ) ADD_SUBDIRECTORY( zypp-media-dir ) ADD_SUBDIRECTORY( zypp-media-disk ) ADD_SUBDIRECTORY( zypp-media-iso ) ADD_SUBDIRECTORY( zypp-media-copy ) ADD_SUBDIRECTORY( zypp-media-tvm ) ADD_SUBDIRECTORY( zypp-media-chksum ) ## ############################################################ OPTION( ENABLE_DEVTOOL_REPOMIRROR "Devtool: build repomirror?" OFF ) IF ( ENABLE_DEVTOOL_REPOMIRROR ) MESSAGE( STATUS "DEVTOOL_REPOMIRROR enabled" ) FIND_PACKAGE( Notcurses++ QUIET ) if ( NOT Notcurses++_FOUND ) MESSAGE( FATAL_ERROR " DEVTOOL_REPOMIRROR: Notcurses++ not found" ) ENDIF() ADD_SUBDIRECTORY( repomirror ) ENDIF ( ENABLE_DEVTOOL_REPOMIRROR ) ## ############################################################ ## ############################################################ OPTION( ENABLE_DEVTOOL_REFRESHNG "Devtool: build refreshng?" OFF ) IF ( ENABLE_DEVTOOL_REFRESHNG ) ADD_SUBDIRECTORY( refresh-ng ) ENDIF ( ENABLE_DEVTOOL_REFRESHNG ) ## ############################################################ libzypp-17.36.5/tools/CalculateReusableBlocks.cc000066400000000000000000000054011476576476200216030ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include int main ( int argc, char *argv[] ) { if ( argc < 3 ) { std::cerr << "Usage: CalculateReusebleBlocks " << std::endl; return 1; } constexpr auto checkFileAccessible = []( const zypp::Pathname &path ){ zypp::PathInfo pi( path ); return ( pi.isExist() && pi.isFile() && pi.userMayR() ); }; zypp::Pathname metaLink( zypp::str::asString(argv[1]) ); zypp::Pathname deltaFile( zypp::str::asString(argv[2]) ); if ( !checkFileAccessible(metaLink) ) { std::cerr << "Metalink file at " << metaLink << " not accessible" << std::endl; return 1; } if ( !checkFileAccessible(deltaFile) ) { std::cerr << "Deltafile file at " << deltaFile << " not accessible" << std::endl; return 1; } zypp::media::MediaBlockList blocks; if ( zypp::str::hasSuffix( metaLink.asString(), "zsync") ) { zypp::media::ZsyncParser parser; try { parser.parse( metaLink.asString() ); blocks = parser.getBlockList(); } catch (const zypp::Exception& e) { std::cerr << "Failed to parse Metalink file: " << e << std::endl; return 1; } catch ( const std::exception &e ) { std::cerr << "Failed to parse Metalink file: " << e.what() << std::endl; return 1; } } else { zypp::media::MetaLinkParser parser; try { parser.parse( metaLink ); blocks = parser.getBlockList(); } catch(const zypp::Exception& e) { std::cerr << "Failed to parse Metalink file: " << e << std::endl; return 1; } } constexpr auto getDownloadSize = []( const zypp::media::MediaBlockList &blocks ){ size_t size = 0; for ( size_t i = 0; i < blocks.numBlocks(); i++ ) { size += blocks.getBlock(i).size; } return size; }; zypp::filesystem::TmpFile file; const auto numBlocksBefore = blocks.numBlocks(); const zypp::ByteCount sizeBefore = getDownloadSize(blocks); std::cout << "Blocks parsed from Metalink file: " << numBlocksBefore << std::endl; if ( numBlocksBefore ) { zypp::AutoFILE f( fopen( "Out.test.gz", "w")); if ( *f ) { blocks.reuseBlocks( *f, deltaFile.asString() ); } } const size_t numBlocksAfter = blocks.numBlocks(); const zypp::ByteCount sizeAfter = getDownloadSize(blocks); std::cout << "Finished, reused " << ( numBlocksBefore - numBlocksAfter ) << " of " << numBlocksBefore << " blocks." << std::endl; std::cout << "Need to download " << sizeAfter << " of " << sizeBefore << std::endl; return 0; } libzypp-17.36.5/tools/DiskUsageCounter.cc000066400000000000000000000026021476576476200203040ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST #include "argparse.h" #include #include using std::cout; using std::cerr; using std::endl; static std::string appname { "NO_NAME" }; int errexit( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) cerr << endl << appname << ": ERR: " << msg_r << endl << endl; return exit_r; } int usage( const argparse::Options & options_r, int return_r = 0 ) { cerr << "USAGE: " << appname << " [OPTION]... [ARGS]..." << endl; cerr << " Print default mountpoint set for disk usage computation." << endl; cerr << options_r << endl; return return_r; } int main( int argc, char * argv[] ) { appname = Pathname::basename( argv[0] ); std::string sysRoot { "/" }; argparse::Options options; options.add() ( "help,h", "Print help and exit." ) ( "root", "Use the system located below ROOTDIR.", argparse::Option::Arg::required ) ; auto result = options.parse( argc, argv ); if ( result.count( "help" ) ) return usage( options ); if ( result.count( "root" ) ) sysRoot = result["root"].arg(); // go... cout << "DiskUsageCounter: relevant mount points detected below '" << sysRoot << "':" << endl; cout << DiskUsageCounter::detectMountPoints( sysRoot ) << endl; return 0; } libzypp-17.36.5/tools/DownloadFiles.cc000066400000000000000000000204031476576476200176160ustar00rootroot00000000000000// A small tool to test the downloader backend in zypp // takes a yaml file as first argument that has a list of downloadable files and possible deltafiles to // use when requesting the file: // - url: "https://dlmirror.foo/file1" // delta: "/path/to/delta1" // - url: "https://dlmirror.foo/file2" // delta: "/path/to/file2" #include #include #include #include #include #include #include #include #include namespace po = boost::program_options; struct DLEntry { zypp::Url _url; zypp::Pathname _deltaFile; zypp::ByteCount _dlSize; }; // progress for downloading a file struct DownloadProgressReportReceiver : public zypp::callback::ReceiveReport { DownloadProgressReportReceiver() { connect(); } virtual void start( const zypp::Url & uri, zypp::Pathname localfile ) { _last_drate_avg = -1; std::cout << "Starting download of: " << uri << " to " << localfile << std::endl; ztui::Application::instance ().out().dwnldProgressStart( uri ); } virtual bool progress(int value, const zypp::Url & uri, double drate_avg, double drate_now) { ztui::Application::instance ().out().dwnldProgress( uri, value, (long) drate_now); _last_drate_avg = drate_avg; return true; } virtual DownloadProgressReport::Action problem( const zypp::Url & uri, DownloadProgressReport::Error error, const std::string & description ) { if ( error == DownloadProgressReport::NO_ERROR ) { // NO_ERROR: just a report but let the caller proceed as appropriate... ztui::Application::instance().out().info() << "- " << ( ztui::ColorContext::LOWLIGHT << description ); return DownloadProgressReport::IGNORE; } ztui::Application::instance().out().dwnldProgressEnd(uri, _last_drate_avg, true); return DownloadProgressReport::ABORT; } // used only to finish, errors will be reported in media change callback (libzypp 3.20.0) virtual void finish( const zypp::Url & uri, Error error, const std::string & konreason ) { ztui::Application::instance().out().dwnldProgressEnd( uri, _last_drate_avg, ( error == NOT_FOUND ? zypp::indeterminate : zypp::TriBool(error != NO_ERROR) ) ); } private: double _last_drate_avg; }; int main ( int argc, char *argv[] ) { // force the use of the new downloader code setenv("ZYPP_MEDIANETWORK", "1", 1); ztui::Application app; auto appname = zypp::Pathname::basename( argv[0] ); po::positional_options_description p; p.add("control-file", 1); po::options_description visibleOptions("Allowed options"); visibleOptions.add_options() ("help", "produce help message") ("mediabackend" , po::value()->default_value("legacy"), "Select the mediabackend to use, possible options: legacy, provider") ("target-dir" , po::value()->default_value("."), "Directory where to download the files to." ); po::options_description positionalOpts; positionalOpts.add_options () ("control-file" , po::value(), "Control file to read the urls from" ); po::options_description cmdline_options; cmdline_options.add(visibleOptions).add(positionalOpts); const auto &usage = [&](){ std::cerr << "Usage: " << appname << " [OPTIONS] " << std::endl; std::cerr << visibleOptions << std::endl; }; po::variables_map vm; try { po::store(po::command_line_parser(argc, argv). options(cmdline_options).positional(p).run(), vm); po::notify(vm); } catch ( const po::error & e ) { std::cerr << e.what () << std::endl; usage(); } if ( vm.count ("help") ) { usage(); return 0; } if ( !vm.count("control-file") ) { std::cerr << "Missing the required control-file argument.\n" << std::endl; usage(); return 1; } const auto &cFInfo = zypp::PathInfo( vm["control-file"].as()); if ( !cFInfo.isExist() || !cFInfo.userMayR() ) { std::cerr << "Control file " << cFInfo.path () << " is not accessible" << std::endl; usage(); return 1; } if ( !vm.count("mediabackend") || ( vm["mediabackend"].as() != "legacy" && vm["mediabackend"].as() != "provider" ) ) { std::cerr << "Invalid value given for mediabackend option: " << vm["mediabackend"].as() <<".\n"; usage(); return 1; } if ( !vm.count("target-dir") ) { std::cerr << "Targetdir not initialized, this is a bug.\n" << std::endl; usage(); return 1; } const zypp::PathInfo targetDir( vm["target-dir"].as() ); if ( !targetDir.isDir() || !targetDir.userMayRWX() ) { std::cerr << "Target directory is not accessible." << std::endl; usage(); return 1; } constexpr auto makeError = [] ( const std::string &str ) { std::cerr << str << std::endl; return 1; }; std::vector entries; YAML::Node control; try { control = YAML::LoadFile( cFInfo.path().asString() ); if ( control.Type() != YAML::NodeType::Sequence ) return makeError("Root node must be of type Sequence."); for ( const auto &dlFile : control ) { const auto &url = dlFile["url"]; if ( !url ) { return makeError("Each element in the control sequence needs a \"url\" field."); } if ( url.Type() != YAML::NodeType::Scalar ) return makeError("Field 'url' must be a scalar."); zypp::Url dlUrl( url.as () ); zypp::Pathname deltaFile; zypp::ByteCount downloadSize; const auto &delta = dlFile["delta"]; if ( delta ) { if ( delta.Type() != YAML::NodeType::Scalar ) return makeError("Field 'delta' must be a scalar."); deltaFile = zypp::Pathname( delta.as() ); } const auto &dlSize = dlFile["dlSize"]; if ( dlSize ) { if ( dlSize.Type() != YAML::NodeType::Scalar ) return makeError("Field 'delta' must be a scalar."); downloadSize = zypp::ByteCount( dlSize.as() ); } entries.push_back ( { std::move(dlUrl), std::move(deltaFile), std::move(downloadSize) } ); } } catch ( YAML::Exception &e ) { std::cerr << "YAML exception: " << e.what() << std::endl; return 1; } catch ( const std::exception &e ) { std::cerr << "Error when parsing the control file: " << e.what() << std::endl; return 1; } catch ( ... ) { std::cerr << "Unknown error when parsing the control file" << std::endl; return 1; } std::vector< zypp::ManagedFile > files; std::cout << "Using yaml: " << cFInfo.path() << "\n" << "Downloading to: " << targetDir.path ().realpath ()<< "\n" << "Using backend: " << vm["mediabackend"].as() << "\n" << "Nr of downloads: " << entries.size() << "\n" << std::endl; if ( vm["mediabackend"].as() == "provider" ) { std::cerr << "The provider support is not yet implemented, please try again later." << std::endl; return 1; } DownloadProgressReportReceiver receiver; if ( entries.size() ) { for ( const auto &e : entries ) { try { zypp::Url url(e._url); zypp::Pathname path(url.getPathName()); url.setPathName ("/"); zypp::MediaSetAccess access(url); zypp::ManagedFile locFile( targetDir.path().realpath() / path, zypp::filesystem::unlink ); zypp::filesystem::assert_dir( locFile->dirname() ); auto file = access.provideFile( zypp::OnMediaLocation(path, 1) .setOptional ( false ) .setDeltafile ( e._deltaFile ) .setDownloadSize ( e._dlSize ) ); //prevent the file from being deleted when MediaSetAccess gets out of scope if ( zypp::filesystem::hardlinkCopy(file, locFile) != 0 ) ZYPP_THROW( zypp::Exception("Can't copy file from " + file.asString() + " to " + locFile->asString() )); std::cout << "File downloaded: " << e._url << std::endl; files.push_back ( locFile ); } catch ( const zypp::Exception &e ) { std::cerr << "Failed to download file: " << e << std::endl; } } } //std::cout << "Done, press any key to continue" << std::endl; //getchar(); return 0; } libzypp-17.36.5/tools/DumpSelectable.cc000066400000000000000000000112261476576476200177600ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST #include #include #include static std::string appname( "DumpSelectable" ); #define message cout using std::flush; int errexit( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } return exit_r; } int usage( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } cerr << "Usage: " << appname << " [--root ROOTDIR] [OPTIONS] NAME..." << endl; cerr << " Load all enabled repositories (no refresh) and search for" << endl; cerr << " Selectables names NAME" << endl; cerr << " --root Load repos from the system located below ROOTDIR. If ROOTDIR" << endl; cerr << " denotes a sover testcase, the testcase is loaded." << endl; cerr << " -v Verbose list solvables data." << endl; cerr << "" << endl; return exit_r; } void dumpPi( std::ostream & message, const PoolItem & pi ) { std::string indent(" "); message << indent << "--------------------------------------------------" << endl; message << indent << (pi->isSystem() ? "i " : "a ") << pi->satSolvable().asString() << endl; message << indent << pi->summary() << endl; if ( pi->isKind() ) { message << indent << pi->asKind()->changelog() << endl; } } /****************************************************************** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int */ int main( int argc, char * argv[] ) { INT << "===[START]==========================================" << endl; appname = Pathname::basename( argv[0] ); --argc,++argv; Pathname sysRoot("/"); bool verbose = false; while ( argc && (*argv)[0] == '-' ) { if ( (*argv) == std::string("--root") ) { --argc,++argv; if ( ! argc ) return errexit("--root requires an argument."); if ( ! PathInfo( *argv ).isDir() ) return errexit("--root requires a directory."); sysRoot = *argv; } else if ( (*argv) == std::string("-v") ) { verbose = true; } --argc,++argv; } if ( ! argc ) { return usage(); } /////////////////////////////////////////////////////////////////// ZConfig::instance(); sat::Pool satpool( sat::Pool::instance() ); if ( TestSetup::isTestcase( sysRoot ) ) { message << str::form( "*** Load Testcase from '%s'", sysRoot.c_str() ) << endl; TestSetup test; test.loadTestcaseRepos( sysRoot ); } else if ( TestSetup::isTestSetup( sysRoot ) ) { message << str::form( "*** Load TestSetup from '%s'", sysRoot.c_str() ) << endl; TestSetup test( sysRoot, Arch_x86_64 ); test.loadRepos(); } else { // a system message << str::form( "*** Load system at '%s'", sysRoot.c_str() ) << endl; if ( true ) { message << "*** load target '" << Repository::systemRepoAlias() << "'\t" << endl; getZYpp()->initializeTarget( sysRoot ); getZYpp()->target()->load(); message << satpool.systemRepo() << endl; } if ( true ) { RepoManager repoManager( sysRoot ); RepoInfoList repos = repoManager.knownRepositories(); for_( it, repos.begin(), repos.end() ) { RepoInfo & nrepo( *it ); if ( ! nrepo.enabled() ) continue; if ( ! repoManager.isCached( nrepo ) ) { message << str::form( "*** omit uncached repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } message << str::form( "*** load repo '%s'\t", nrepo.name().c_str() ) << flush; try { repoManager.loadFromCache( nrepo ); message << satpool.reposFind( nrepo.alias() ) << endl; } catch ( const Exception & exp ) { message << exp.asString() + "\n" + exp.historyAsString() << endl; message << str::form( "*** omit broken repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } } } } /////////////////////////////////////////////////////////////////// for ( ; argc; --argc,++argv ) { ui::Selectable::Ptr sel( ui::Selectable::get( IdString( *argv ) ) ); message << dump( sel ) << endl; if ( verbose ) { for_( it, sel->installedBegin(), sel->installedEnd() ) dumpPi( message, *it ); for_( it, sel->availableBegin(), sel->availableEnd() ) dumpPi( message, *it ); } } INT << "===[END]============================================" << endl << endl; return 0; } libzypp-17.36.5/tools/ProvideSignedDirectory.cc000066400000000000000000000031761476576476200215230ustar00rootroot00000000000000#include #include #include #include #include #include #include #include using std::endl; int main ( int argc, const char * argv[] ) try { --argc; ++argv; //zypp::base::LogControl::instance().logToStdErr(); INT << "===[START]==========================================" << endl; /////////////////////////////////////////////////////////////////// zypp::Url oRemoteUrl( argv[0] ); //"http://download.opensuse.org/distribution/openSUSE-current/repo/oss" ); std::string oRemoteDir( argv[1] ); //"/suse/setup/slide" ); const bool oRecursive( true ); zypp::Pathname oLocalDir( "" ); zypp::scoped_ptr tmpdir; if ( oLocalDir.empty() ) { tmpdir.reset( new zypp::filesystem::TmpDir ); oLocalDir = tmpdir->path(); } zypp::Fetcher fetcher; fetcher.setOptions( zypp::Fetcher::AutoAddIndexes ); fetcher.enqueueDir( zypp::OnMediaLocation( oRemoteDir ), oRecursive ); zypp::KeyRing::setDefaultAccept( zypp::KeyRing::TRUST_KEY_TEMPORARILY ); zypp::MediaSetAccess media( oRemoteUrl, "/" ); fetcher.start( oLocalDir, media ); zypp::ExternalProgram( "find "+(oLocalDir/oRemoteDir).asString()+" -ls" ) >> std::cout; /////////////////////////////////////////////////////////////////// INT << "===[END]============================================" << endl << endl; zypp::base::LogControl::instance().logNothing(); return 0; } catch ( const zypp::Exception & exp ) { INT << exp << endl << exp.historyAsString(); } catch (...) {} libzypp-17.36.5/tools/ScanTwHistory000077500000000000000000000015041476576476200172650ustar00rootroot00000000000000#!/usr/bin/env python3 import urllib3 import sys import re p = re.compile('.*debuginfo.*') http = urllib3.PoolManager() r = http.request('GET', 'http://download.opensuse.org/history/list') if ( r.status != 200 ): print("Failed to download history list\n") sys.exit(1) html = r.data.decode("utf-8") list = html.split("\n") for i in list: if ( len(i) == 0 ): continue print ( "Searching for history in: "+i ) rEntries = http.request('GET', "http://download.opensuse.org/history/"+i.strip()+"/rpm.list", preload_content=False ) if ( rEntries.status != 200 ): print("Failed to download history database for "+i+"\n") continue for line in rEntries: if ( p.search( line.decode() ) ): print("Found match: "+line.decode()+" in: "+"http://download.opensuse.org/history/"+i.strip() ) print("Done")libzypp-17.36.5/tools/ToolScanRepos.cc000066400000000000000000000063571476576476200176330ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST static std::string appname( "ToolScanRepos" ); void message( const std::string & msg_r ) { cerr << "*** " << msg_r << endl; } int usage( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl; message( msg_r ); cerr << endl; } cerr << "Usage: " << appname << "[OPTIONS] URL..." << endl; cerr << " Load repos from URL to test system below /tmp/" << appname << "." << endl; cerr << " -r ROOT Use /tmp/ROOT as location of test system (default: " << appname << ")." << endl; cerr << " -a ARCH Use ARCH as test system architecture (default: x86_64)." << endl; cerr << " -c Clear an existing test system (default)." << endl; cerr << " -n Do not clear an existing test system but reuse it." << endl; return exit_r; } /****************************************************************** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int */ int main( int argc, char * argv[] ) { INT << "===[START]==========================================" << endl; appname = Pathname::basename( argv[0] ); --argc; ++argv; if ( ! argc ) { return usage(); } /////////////////////////////////////////////////////////////////// Pathname mtmp( "/tmp" ); Pathname mroot( mtmp/appname ); Arch march( Arch_x86_64 ); bool oClearRoot = true; std::vector urls; while ( argc ) { if ( argv[0] == std::string("-c") ) { oClearRoot = true; } else if ( argv[0] == std::string("-n") ) { oClearRoot = false; } else if ( argv[0] == std::string("-r") || argv[0] == std::string("--root")) { --argc; ++argv; if ( ! argc ) return usage( "Missing arg to -r ROOT", 101 ); if ( *(argv[0]) ) // empty mroot = mtmp/argv[0]; else mroot = mtmp/appname; } else if ( argv[0] == std::string("-a") ) { --argc; ++argv; if ( ! argc ) return usage( "Missing arg to -a ARCH", 101 ); if ( *(argv[0]) ) // empty march = Arch( argv[0] ); else march = Arch_x86_64; } else { urls.push_back( argv[0] ); } --argc; ++argv; } if ( urls.empty() ) { return usage( "Missing URLs", 102 ); } /////////////////////////////////////////////////////////////////// if ( oClearRoot ) { message( "Clear test system at " + mroot.asString() ); filesystem::recursive_rmdir( mroot ); } else { message( "Use test system at " + mroot.asString() ); } filesystem::assert_dir( mroot ); base::LogControl::instance().logfile( mroot/"ToolScanRepos.log" ); message( "Use logfile " + (mroot/"ToolScanRepos.log").asString() ); message( "Use archiecture " + march.asString() ); TestSetup test( mroot, march ); int ret = 0; for_( it, urls.begin(), urls.end() ) { message( "Setup " + *it ); try { test.loadRepo( *it ); } catch ( const Exception & exp ) { message( exp.asString() + "\n" + exp.historyAsString() ); ++ret; } } INT << "===[END]============================================" << endl << endl; return ret; } libzypp-17.36.5/tools/argparse.h000066400000000000000000000220221476576476200165310ustar00rootroot00000000000000#ifndef ZYPP_TOOLS_ARGPARSE_H #define ZYPP_TOOLS_ARGPARSE_H #include #include #include #include #include #include //#include seems to be bad with gcc < 4.9 #include /////////////////////////////////////////////////////////////////// /// Simple arg parser for tools /// \code /// argparse::Options options; /// options.add() /// ( "help,h", "Print help and exit." ) /// ( "root", "Use the system located below ROOTDIR.", argparse::Option::Arg::required ) /// ; /// auto result = options.parse( argc, argv ); /// /// if ( result.count( "root" ) ) /// sysRoot = result["root"].arg(); /// \endcode namespace argparse { using zypp::str::regex; using zypp::str::smatch; using zypp::str::regex_match; /////////////////////////////////////////////////////////////////// /// Exception thrown when defining Options or parsing. class OptionException : public std::exception { public: OptionException( std::string msg_r ) : _msg { std::move(msg_r) } {} OptionException( std::string msg_r, const std::string & msg2_r ) : _msg { std::move(msg_r) } { if ( ! msg2_r.empty() ) _msg += msg2_r; } const char* what() const noexcept override { return _msg.c_str(); } private: std::string _msg; }; /////////////////////////////////////////////////////////////////// /// Option description (TBD define arg consumer) class Option { public: enum class Arg { none, required, optional }; public: Option( std::string descr_r, Arg hasarg_r ) : _descr { std::move(descr_r) } , _hasarg { hasarg_r } { if ( hasarg_r == Arg::optional ) throw OptionException( "Not yet implemented: Option::Arg::optional" ); } const std::string & descr() const { return _descr; } Arg hasarg() const { return _hasarg; } private: std::string _descr; Arg _hasarg; }; class ParsedOptions; /////////////////////////////////////////////////////////////////// /// Map of option names -> option descriptions. class Options { typedef std::unordered_map> OptionMap; public: Options() {} public: class Injector { public: Injector( OptionMap & optmap_r ) : _optmap { optmap_r } {} Injector & operator()( const std::string & names_r, std::string descr_r, Option::Arg hasarg_r = Option::Arg::none ) { smatch result; if ( regex_match( names_r, result, regex("([[:alnum:]][-_[:alnum:]]+)(,([[:alnum:]]))?") ) ) { auto opt = std::make_shared( std::move(descr_r), hasarg_r ); add( result[1], opt ); if ( ! result[3].empty() ) add( result[3], opt ); } else throw OptionException( "Illegal option names: ", names_r ); return *this; } private: void add( std::string name_r, std::shared_ptr opt_r ) { if ( _optmap.count( name_r ) ) throw OptionException( "Duplicate option name: ", name_r ); _optmap[name_r] = opt_r; } private: OptionMap & _optmap; }; Injector add() { return Injector( _optmap ); } public: ParsedOptions parse( int argc, char * argv[] ) const; public: std::ostream & dumpOn( std::ostream & str_r ) const { str_r << "OPTIONS:"; if ( ! _optmap.empty() ) { std::unordered_map, std::string> unify; for ( const auto & p : _optmap ) { std::string & t { unify[p.second] }; if ( t.empty() ) t = (p.first.length()>1?"--":"-")+p.first; else if ( p.first.length() > 1 ) t = "--"+p.first+", "+t; else t = t+", -"+p.first; } boost::format fmt( "\n %1% %|30t|%2%" ); for ( const auto & p : unify ) { fmt % p.second % p.first->descr(); str_r << fmt.str(); } } else { str_r << " This command accepts no options."; } return str_r; } private: OptionMap _optmap; }; inline std::ostream & operator<<( std::ostream & str_r, const Options & obj_r ) { return obj_r.dumpOn( str_r ); } /////////////////////////////////////////////////////////////////// /// Parsed option incl. option args value (by now just stores the string) class OptionValue { public: OptionValue( std::shared_ptr opt_r ) : _opt { opt_r } {} OptionValue( std::shared_ptr opt_r, std::string arg_r ) : _opt { opt_r } , _arg { std::make_shared( std::move(arg_r) ) } {} const std::string & arg() const { if ( ! _arg ) throw std::domain_error( "No arg value" ); return *_arg; } private: std::shared_ptr _opt; std::shared_ptr _arg; }; /////////////////////////////////////////////////////////////////// /// Parsed options and positional args class ParsedOptions { typedef std::unordered_map> OptionMap; typedef std::unordered_map, OptionValue> ResultMap; public: ParsedOptions( const OptionMap & optmap_r, int argc, char * argv[] ) : _optmap { optmap_r } { parse( argc, argv ); } public: size_t count( const std::string & optname_r ) const { auto iter = _optmap.find( optname_r ); if ( iter == _optmap.end() ) return 0; auto resiter = _options.find( iter->second ); return( resiter == _options.end() ? 0 : 1 ); } const OptionValue & operator[]( const std::string & optname_r ) const { return requireOptValByName( optname_r ); } const std::vector & positionals() const { return _positionals; } private: void parse( int argc, char * argv[] ) { bool collectpositional = false; for ( --argc,++argv; argc; --argc,++argv ) { if ( (*argv)[0] == '-' && !collectpositional ) { if ( (*argv)[1] == '-' ) { if ( (*argv)[2] == '\0' ) { // -- rest are positional... collectpositional = true; } else { // --longopt parseoptl( (*argv)+2, argc, argv ); } } else { // -s(hortopt) parseopts( (*argv)+1, argc, argv ); } } else { // positional _positionals.push_back( *argv ); } } } private: std::string dashed( std::string name_r ) const { return name_r.insert( 0, name_r.size()>1?"--":"-" ); } void parseoptl( const std::string & name_r, int & argc, char **& argv ) { if ( name_r.length() < 2 ) throw OptionException( "Illegal long opt: --", name_r ); parseopt( name_r, argc, argv ); } void parseopts( const std::string & name_r, int & argc, char **& argv ) { if ( name_r.length() != 1 ) throw OptionException( "Illegal short opt: -", name_r ); parseopt( name_r, argc, argv ); } void parseopt( const std::string & name_r, int & argc, char **& argv ) { auto opt = requireOptByName( name_r ); auto iter = _options.find( opt ); if ( iter != _options.end() ) throw OptionException( "Multiple occurrences of option: ", dashed( name_r ) ); if ( opt->hasarg() != Option::Arg::none ) { if ( opt->hasarg() == Option::Arg::optional ) throw OptionException( "Not yet implemented: Option::Arg::optional" ); // i.e. '--opt=arg' if ( argc < 2 ) throw OptionException( "Missing argument for option: ", dashed( name_r ) ); --argc,++argv; moveToResult( opt, OptionValue( opt, *argv ) ); } else moveToResult( opt, OptionValue( opt ) ); } void moveToResult( std::shared_ptr opt_r, OptionValue && value_r ) { _options.insert( std::make_pair( opt_r, std::move(value_r) ) ); } std::shared_ptr requireOptByName( const std::string & name_r ) const { auto iter = _optmap.find( name_r ); if ( iter == _optmap.end() ) throw OptionException( "Unknown option: ", dashed( name_r ) ); return iter->second; } const OptionValue & requireOptValByName( const std::string & name_r ) const { auto iter = _options.find( requireOptByName( name_r ) ); if ( iter == _options.end() ) throw OptionException( "Option not present: ", dashed( name_r ) ); return iter->second; } private: const OptionMap & _optmap; ResultMap _options; std::vector _positionals; }; inline ParsedOptions Options::parse( int argc, char * argv[] ) const { return ParsedOptions( _optmap, argc, argv ); } } // namespace argparse /////////////////////////////////////////////////////////////////// #endif // ZYPP_TOOLS_ARGPARSE_H libzypp-17.36.5/tools/migrate-sources/000077500000000000000000000000001476576476200176675ustar00rootroot00000000000000libzypp-17.36.5/tools/migrate-sources/CMakeLists.txt000066400000000000000000000004411476576476200224260ustar00rootroot00000000000000SET( migrate_SRCS migrate-sources.cc ) ADD_EXECUTABLE( zypp-migrate-sources ${migrate_SRCS} ) TARGET_LINK_LIBRARIES( zypp-migrate-sources zypp ) TARGET_LINK_LIBRARIES( zypp-migrate-sources xml2 ) INSTALL(TARGETS zypp-migrate-sources RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/zypp )libzypp-17.36.5/tools/migrate-sources/migrate-sources.cc000066400000000000000000000107431476576476200233140ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp-cache" using namespace zypp; struct Options { Options() : fake(false) , root("/") , sources_dir("/var/lib/zypp/db/sources") {} bool fake; Pathname root; Pathname sources_dir; }; static void clear_cache( const Options &opt ) { Pathname path = opt.root + "/var/lib/zypp/cache"; if ( PathInfo(path).isDir() ) { cout << "Deleting old cache directory (" << path << ")." << endl; if ( ! opt.fake ) { if ( filesystem::recursive_rmdir(path) != 0 ) ERR << "Error removing cache directory" << path << endl; } } path = opt.root + "/var/lib/zypp/db"; if ( PathInfo(path).isDir() ) { cout << "Deleting old db directory (" << path << ")." << endl; if ( ! opt.fake ) { if ( filesystem::recursive_rmdir(path) != 0 ) ERR << "Error removing db directory" << path << endl; } } } static void migrate_sources( const Options &opt ) { if ( getenv("YAST_IS_RUNNING") && (string(getenv("YAST_IS_RUNNING")) == "instsys" )) { MIL << "YaST is running in instsys. Not migrating old sources. YaST will do it." << endl; return; } else { MIL << "YaST not running in instsys." << endl; } zypp::zypp_readonly_hack::IWantIt(); ZYpp::Ptr Z = zypp::getZYpp(); RepoManager manager; Pathname source_p = opt.root + opt.sources_dir; if ( ! PathInfo(source_p).isExist() ) { cout << "No sources to migrate." << endl; clear_cache( opt ); return; } RepoInfoList sources; DBG << "Reading source cache in " << source_p << std::endl; list entries; if ( filesystem::readdir( entries, source_p, false ) != 0 ) ZYPP_THROW(Exception("failed to read directory")); int i=0; for ( list::const_iterator it = entries.begin(); it != entries.end(); ++it ) { MIL << "Processing " << *it << endl; std::ifstream anIstream((*it).c_str()); zypp::parser::xmlstore::XMLSourceCacheParser iter(anIstream, ""); for (; ! iter.atEnd(); ++iter) { RepoInfo data = **iter; string alias = "migrated_" + str::numstring(i); try { data.setAlias(alias); data.setEnabled(false); cout << "Migrating repo: " << endl << data << endl; if ( ! opt.fake ) { manager.addRepository(data); } cout << "Deleting old source: " << *it << endl; if ( ! opt.fake ) { if ( filesystem::unlink(*it) != 0 ) ERR << "Error removing source " << *it << endl; // delete old file } cout << "saved as " << alias << endl; ++i; } catch ( const Exception &e ) { cout << "Error adding repository: " << e.msg() << endl << data << endl; } } } cout << i << " sources migrated."<< endl; // reread entries if ( filesystem::readdir( entries, source_p, false ) != 0 ) ZYPP_THROW(Exception("failed to read directory")); if ( entries.size() == 0 ) { cout << "all sources migrated. deleting old source directory"<< endl; if ( ! opt.fake ) { if ( filesystem::recursive_rmdir(source_p) != 0 ) ERR << "Error removing source directory" << source_p << endl; clear_cache( opt ); } } else { cout << "Not all sources migrated. leaving old source directory"<< endl; } } void usage(int argc, char **argv) { cout << argv[0] << ". Migrates old sources to 10.3 repositories." << endl; cout << "Usage:" << endl; cout << argv[0] << " [--root root-path] [--fake] [--sp sources-path]" << endl; } //----------------------------------------------------------------------------- int main (int argc, char **argv) { MIL << "-------------------------------------" << endl; Options opt; int i; for ( i=1; i < argc; ++i ) { if ( string(argv[i]) == "--help" ) { usage(argc, argv); return 0; } if ( string(argv[i]) == "--fake" ) opt.fake = true; if ( string(argv[i]) == "--root" ) opt.root = argv[++i]; if ( string(argv[i]) == "--sp" ) opt.sources_dir = argv[++i]; } migrate_sources(opt); return 0; } libzypp-17.36.5/tools/patch_find_bug.cc000066400000000000000000000056031476576476200200250ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST #include using namespace zypp; using std::flush; static std::string appname( "patch_find_bug" ); int errexit( const std::string & msg_r = std::string(), int exit_r = 101 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } return exit_r; } int usage( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } cerr << "Usage: " << appname << "[OPTIONS] bugnumber..." << endl; cerr << " Find patches refering to bugnumber (substring)." << endl; cerr << " --root SYSROOT: Load system located below directory SYSROOT" << endl; return exit_r; } /****************************************************************** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int */ int main( int argc, char * argv[] ) { INT << "===[START]==========================================" << endl; appname = Pathname::basename( argv[0] ); --argc; ++argv; if ( ! argc ) { return usage(); } /////////////////////////////////////////////////////////////////// ZConfig::instance(); Pathname sysRoot("/"); if ( (*argv) == std::string("--root") ) { --argc,++argv; if ( ! argc ) return errexit("--root requires an argument."); if ( ! PathInfo( *argv ).isDir() ) return errexit("--root requires a directory."); sysRoot = *argv; --argc,++argv; } TestSetup::LoadSystemAt( sysRoot ); for ( ; argc; --argc,++argv ) { PoolQuery q; q.setMatchSubstring(); q.setCaseSensitive( false ); q.addAttribute( sat::SolvAttr::updateReferenceId, *argv ); if ( q.empty() ) { cout << "BUG REFERENCE '" << *argv << "': No match found." << endl; } else { cout << "BUG REFERENCE '" << *argv << endl; for_( it , q.begin(), q.end() ) { // print the solvable that has a match: cout << " - " << *it << endl; if ( true ) { // Print details about each match in that solvable: for_( d, it.matchesBegin(), it.matchesEnd() ) { // directly access specific attribute like "subFind(updateReferenceType)": cout << " - " << d->inSolvAttr() << "\t\"" << d->asString() << "\" has type \"" << d->subFind( sat::SolvAttr::updateReferenceType ).asString() << "\"" << endl; // list the whole updateReference structure: for_( s, d->subBegin(), d->subEnd() ) { cout << " -" << s.inSolvAttr() << "\t\"" << s.asString() << "\"" << endl; } } } } } } /////////////////////////////////////////////////////////////////// INT << "===[END]============================================" << endl << endl; return 0; } libzypp-17.36.5/tools/percent-encode.cc000066400000000000000000000023101476576476200177540ustar00rootroot00000000000000#include #include #include static std::string doEncode( const std::string & str_r ) { return zypp::url::encode( str_r ); } static std::string doDecode( const std::string & str_r ) { return zypp::url::decode( str_r ); } int main( int argc, const char * argv[] ) { bool encode( true ); --argc,++argv; if ( argc ) { if ( *argv == std::string( "-d" ) || *argv == std::string( "--decode" ) ) encode = false; else if ( *argv == std::string( "-h" ) || *argv == std::string( "--help" ) ) { std::cout << "Usage: percent-encode [OPTION]" << std::endl; std::cout << "Read lines from stdin and write them percent encoded to stdout." << std::endl; std::cout << "" << std::endl; std::cout << "Option:" << std::endl; std::cout << " -d, --decode Decode lines read from stdin instead of encoding them." << std::endl; std::cout << " -h --help Print this message." << std::endl; return 0; } } std::string (*coder)( const std::string & str_r ) = encode ? doEncode: doDecode; for( zypp::iostr::EachLine in( std::cin ); in; in.next() ) { std::cout << coder( *in ) << std::endl; } return 0; } libzypp-17.36.5/tools/refresh-ng/000077500000000000000000000000001476576476200166165ustar00rootroot00000000000000libzypp-17.36.5/tools/refresh-ng/CMakeLists.txt000066400000000000000000000005511476576476200213570ustar00rootroot00000000000000PROJECT( refresh-ng C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc ) ADD_DEFINITIONS( -DZYPP_BUILD_DIR="${CMAKE_CURRENT_BINARY_DIR}" ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} PRIVATE zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} PRIVATE zypp-allsym ) libzypp-17.36.5/tools/refresh-ng/main.cc000066400000000000000000000166021476576476200200560ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST 1 #include "../../tests/lib/TestSetup.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 /*! * Place terminal referred to by 'fd' in cbreak mode (noncanonical mode * with echoing turned on). */ bool ttySetCbreak(int fd, struct termios *prevTermios) { struct termios t; if (tcgetattr(fd, &t) == -1) return false; if (prevTermios != NULL) *prevTermios = t; // disable canonical mode t.c_lflag &= ~( ICANON ); t.c_cc[VMIN] = 1; /* Character-at-a-time input */ t.c_cc[VTIME] = 0; /* with blocking */ if (tcsetattr(fd, TCSAFLUSH, &t) == -1) return false; return true; } bool setBlocking ( int fd, bool set = true ) { const int oldFlags = fcntl( fd, F_GETFL, 0 ); if (oldFlags == -1) return false; const int flags = set ? ( oldFlags & ~(O_NONBLOCK) ) : ( oldFlags | O_NONBLOCK ); if ( oldFlags == flags ) return true; return ( fcntl( fd, F_SETFL, flags ) == 0 ); } int main ( int argc, char *argv[] ) { using namespace zyppng::operators; ztui::Application appl; auto &out = appl.out (); try { auto ctx = zyppng::Context::create (); zypp::RepoInfo ri; ri.setName ("Repo-Oss"); ri.setAlias ("Repo-Oss"); ri.setType ( zypp::repo::RepoType::RPMMD_e ); ri.setBaseUrl( zypp::Url("https://download.opensuse.org/tumbleweed/repo/oss") ); zypp::filesystem::assert_dir("/tmp/dltest"); zypp::Pathname destdir("/tmp/dltest"); ctx->sigEvent().connect([&]( zyppng::UserRequestRef req ){ switch( req->type () ) { case zyppng::UserRequestType::Message: out.info ( static_cast(req.get())->message () ); break; case zyppng::UserRequestType::ListChoice: { auto r = static_cast(req.get()); ztui::PromptOptions popts; const auto &answers = r->answers (); { auto options = zyppng::transform ( answers, []( const auto &entry ) { return entry.opt; } ); popts.setOptions( std::move(options), r->defaultAnswer() ); } for( unsigned i = 0; i < answers.size(); i++ ) { popts.setOptionHelp ( i, answers.at(i).detail ); } bool canContinue = true; std::ifstream stm( "/dev/tty" ); while ( canContinue ) { appl.out().prompt( 0, r->label(), popts ); std::string reply = str::getline( stm, str::TRIM ); const auto &matches = popts.getReplyMatches ( reply ); if ( matches.size () == 1 ) { //valid answer r->setChoice ( matches[0] ); canContinue = false; } else if ( matches.size() > 1 ) { out.error ("Ambigous answer, try again"); } else { out.error ("Invalid answer, try again"); } } break; } case zyppng::UserRequestType::BooleanChoice: { auto r = static_cast(req.get()); std::string yn( std::string(_("yes")) + "/" + _("no") ); ztui::PromptOptions popts( yn, 1 ); appl.out().prompt( 0, r->label(), popts ); std::ifstream stm( "/dev/tty" ); std::string reply = str::getline( stm, str::TRIM ); r->setChoice ( reply[0] == 'y' ); break; } case zyppng::UserRequestType::KeyTrust: { auto r = static_cast(req.get()); std::string yn( std::string(_("(r)eject")) + "/" + _("trust-(a)lways") + "/" + _("(t)rust") ); ztui::PromptOptions popts( yn, 0 ); appl.out().prompt( 0, r->label(), popts ); std::ifstream stm( "/dev/tty" ); std::string reply = str::getline( stm, str::TRIM ); r->setChoice ( reply[0] == 'a' ? zyppng::TrustKeyRequest::KEY_TRUST_AND_IMPORT : ( reply[0] == 't' ? zyppng::TrustKeyRequest::KEY_TRUST_TEMPORARILY : zyppng::TrustKeyRequest::KEY_DONT_TRUST ) ); break; } case zyppng::UserRequestType::Custom: out.info ("Received request type: " + req->userData ().type ().asString () ); break; } }); auto observer = zyppng::ProgressObserver::create("Refreshing repositories", 2); observer->sigProgressChanged().connect([&](zyppng::ProgressObserver &o, double v){ out.progress( "dl-repo", zypp::str::Str() << "Ref Progress changed to " << o.current() << "/" << o.steps (), o.progress () ); }); observer->sigFinished().connect([&](zyppng::ProgressObserver &, zyppng::ProgressObserver::FinishResult finRes ){ out.info ( zypp::str::Str() << "Progress moved to finished with res: " << finRes << std::endl ); } ); out.progressStart("dl-repo", "Refreshing repositories"); std::vector allSysReps; { auto sysRepMgr = zyppng::AsyncRepoManager::create( ctx, zypp::RepoManagerOptions() ).unwrap(); std::for_each ( sysRepMgr->repoBegin(), sysRepMgr->repoEnd(), [&]( zypp::RepoInfo info ){ if ( info.enabled () ) { info.setMetadataPath (zypp::Pathname()); info.setPackagesPath (zypp::Pathname()); allSysReps.push_back(info); } }); } auto repMgr = zyppng::AsyncRepoManager::create( ctx, zypp::RepoManagerOptions(destdir) ).unwrap(); auto result = repMgr->refreshMetadata( std::move(allSysReps), zypp::RepoManagerFlags::RefreshIfNeeded, observer ); observer->setFinished (); bool allSuccess = true; std::for_each( result.begin (), result.end(), [&]( const auto &resPair ) { if ( !resPair.second ) allSuccess = false; try { resPair.second.unwrap(); out.info ( zypp::str::Str() << "Refreshing repository: " << resPair.first.name() << " worked!" ); } catch ( const zypp::Exception &e ) { out.error ( zypp::str::Str() << "Refreshing repository: " << resPair.first.name() << " failed with Error: " << e ); } catch ( const std::exception &e ) { out.error ( zypp::str::Str() << "Refreshing repository: " << resPair.first.name() << " failed with Error: " << e.what() ); } catch ( ... ) { out.error ( zypp::str::Str() << "Refreshing repository: " << resPair.first.name() << " failed with Error: Unknown exception" ); } }); out.progressEnd("dl-repo", "Refreshing repositories", !allSuccess ); } catch ( const zypp::Exception &e ) { out.error ( zypp::str::Str() << "Error: " << e << std::endl ); } catch ( const std::exception &e ) { out.error ( zypp::str::Str() << "Error: " << e.what() << std::endl ); } catch ( ... ) { out.error ( zypp::str::Str() << "Error: Unknown exception" << std::endl ); } return 0; } libzypp-17.36.5/tools/refresh-ng/output.h000066400000000000000000000213101476576476200203240ustar00rootroot00000000000000#ifndef OUTPUT_H #define OUTPUT_H #include #include #include #include #include #include static void zypp_release_ncplane ( struct ncplane *ptr ) { if ( ptr ) ncplane_destroy(ptr); } static void zypp_release_progbar ( struct ncprogbar *ptr ) { if ( ptr ) ncprogbar_destroy(ptr); } class OutputView : public zyppng::Base { public: ~OutputView() { } static std::shared_ptr create( ) { auto ptr = std::shared_ptr( new OutputView() ); ptr->_nc = std::make_unique(); if ( !ptr->_nc ) return nullptr; ptr->_stdplane = std::unique_ptr( ptr->_nc->get_stdplane() ); if ( !ptr->_stdplane ) return nullptr; int rows = 0; int cols = 0; ptr->_stdplane->get_dim( rows, cols ); int top_rows = ( rows - 2 ); if ( top_rows <= 0 ){ return nullptr; } int bottom_rows = rows - top_rows; if ( bottom_rows <= 0 ) { return nullptr; } // the outer plane this is just used to draw a nice border ptr->_topOuterPlane = std::make_unique( *ptr->_stdplane, top_rows, cols, 0, 0, nullptr ); ptr->_topOuterPlane->rounded_box_sized( 0, 0, top_rows, cols, 0 ); // the inner plane, here we put the text int r,c; ptr->_topOuterPlane->get_dim( r, c ); ptr->_topPlaneLeft = std::make_unique( *ptr->_topOuterPlane, r-2 , (c-1) / 2, 1, 1 ); ptr->_topPlaneLeft->set_scrolling( true ); ptr->_topPlaneRight = std::make_unique( *ptr->_topOuterPlane, r-2 , c - ptr->_topPlaneLeft->get_dim_x() - 1 , 1, ptr->_topPlaneLeft->get_dim_x() + 1 ); ptr->_topPlaneRight->set_scrolling( true ); // the plane where we show the progressbar text ptr->_progBarTextPlane = std::make_unique( *ptr->_stdplane, 1 , cols, top_rows, 0 ); // to create the progressbar we need to fall back to the C API due to some bugs in the C++ progbar implementation ncplane_options nopts = { .y = top_rows+1, .x = 0, .rows = bottom_rows-1, .cols = cols, .userptr = nullptr, .name = nullptr, .resizecb = nullptr, .flags = 0, .margin_b = 0, .margin_r = 0, }; std::unique_ptr bottomPlane( ncplane_create( *ptr->_stdplane, &nopts ), &zypp_release_ncplane ); if ( !bottomPlane ) { return nullptr; } struct ncprogbar_options popts = { .ulchannel = 0, .urchannel = 0, .blchannel = 0, .brchannel = 0, .flags = 0, }; ptr->_progbar = std::unique_ptr ( ncprogbar_create( bottomPlane.release(), &popts ), &zypp_release_progbar ); if ( !ptr->_progbar ) { return nullptr; } return ptr; } void updateProgress ( const std::string &txt, double prog, bool autoRender = true ) { if ( !_progbar ) return; _progBarTextPlane->erase(); _progBarTextPlane->putstr( 0, ncpp::NCAlign::Center, txt.data() ); ncprogbar_set_progress( _progbar.get(), prog ); if ( autoRender ) renderNow(); } void putMsgTxt ( const std::string &txt, bool doAutoRender = true ) { if ( !_topPlaneLeft ) return; ncplane_puttext( *_topPlaneLeft, -1, NCALIGN_LEFT, txt.data(), nullptr ); if ( doAutoRender ) renderNow(); } void putMsgErr ( const std::string &txt, bool doAutoRender = true ) { if ( !_topPlaneRight ) return; _topPlaneRight->set_fg_rgb( 0xff5349 ); ncplane_puttext( *_topPlaneRight, -1, NCALIGN_LEFT, txt.data(), nullptr ); _topPlaneRight->set_fg_default(); if ( doAutoRender ) renderNow(); } std::optional promptUser ( const std::string &desc, const std::string &label ) { if ( desc.size() ) putMsgTxt( desc, false ); putMsgTxt( label + ": " ); int curX, curY; _topPlaneLeft->get_cursor_yx( curY, curX ); ncplane_options nopts = { .y = curY, .x = curX, .rows = 1, .cols = _topPlaneLeft->get_dim_x() - curX, .userptr = nullptr, .name = nullptr, .resizecb = nullptr, .flags = 0, .margin_b = 0, .margin_r = 0, }; std::unique_ptr inputPlane( ncplane_create( *_topPlaneLeft, &nopts ), &zypp_release_ncplane ); if ( !inputPlane ) { return {}; } auto readOpts = ncreader_options { .tchannels = 0, .tattrword = 0, .flags = NCREADER_OPTION_CURSOR | NCREADER_OPTION_NOCMDKEYS }; std::unique_ptr reader( ncreader_create( inputPlane.release(), &readOpts ), []( struct ncreader *relme){ ncreader_destroy(relme, nullptr);} ); if ( !reader ) return {}; while ( true ) { renderNow(); ncinput ni; _nc->get( true, &ni ); if ( ni.id == NCKEY_ENTER ) { break; } ncreader_offer_input( reader.get(), &ni ); } std::unique_ptr data( ncreader_contents( reader.get() ), free ); std::string_view cppData( data.get() ); if ( cppData.empty() ) return {}; return std::string(cppData); } template std::vector promptMultiSelect( const std::string &title, const std::string &secondary, const std::vector &data ) { // use a boost container here, because the stdlib decided to completely break vector by prematurely optimizing it boost::container::vector selected( data.size(), false ); std::vector items; std::vector> stringsStorage; items.reserve( data.size() ); stringsStorage.reserve( data.size() ); for ( const T& entry : data ) { stringsStorage.push_back( std::make_pair( entry.asUserString(), std::string("") ) ); items.push_back( ncmselector_item{ .option = stringsStorage.back().first.data(), .desc = stringsStorage.back().second.data(), .selected = false }); } items.push_back(ncmselector_item{ .option = nullptr, .desc = nullptr, .selected = false }); std::string_view footer("Press Enter to accept or ESC to cancel."); auto selOpts = ncmultiselector_options{ .title = title.data(), .secondary = secondary.data(), .footer = footer.data(), .items = items.data(), .maxdisplay = 0, .opchannels = NCCHANNELS_INITIALIZER(0xe0, 0x80, 0x40, 0, 0, 0), .descchannels = NCCHANNELS_INITIALIZER(0x80, 0xe0, 0x40, 0, 0, 0), .titlechannels = NCCHANNELS_INITIALIZER(0x20, 0xff, 0xff, 0, 0, 0x20), .footchannels = NCCHANNELS_INITIALIZER(0xe0, 0, 0x40, 0x20, 0x20, 0), .boxchannels = NCCHANNELS_INITIALIZER(0x20, 0xe0, 0xe0, 0x20, 0, 0), .flags = 0 }; auto tmpPlane = ncpp::Plane( *_stdplane, _stdplane->get_dim_y()-1, _stdplane->get_dim_x()-1, 1, 1 ); ncpp::MultiSelector selector( tmpPlane, &selOpts); while ( true ) { renderNow(); ncinput ni; _nc->get( true, &ni ); if ( ni.id == NCKEY_ESC ) { return {}; } else if ( ni.id == NCKEY_ENTER ) { break; } selector.offer_input( &ni ); } selector.get_selected( selected.data(), selected.size() ); std::vector selIndices; for ( int i = 0; i < selected.size(); i++ ) { if ( selected[i]) selIndices.push_back(i); } return selIndices; } void renderNow () { if ( _nc ) _nc->render(); } uint32_t waitForKeys ( std::vector keys = {} ) { ncinput ni; while ( true ) { _nc->get( true, &ni ); if ( keys.empty() || std::find( keys.begin(), keys.end(), ni.id ) != keys.end() ) return ni.id; } } private: OutputView() : _topOuterPlane( nullptr ), _topPlaneLeft( nullptr ), _topPlaneRight( nullptr ), _progbar( nullptr, &zypp_release_progbar ) {} std::unique_ptr _nc; std::unique_ptr _stdplane; std::unique_ptr _topOuterPlane; std::unique_ptr _topPlaneLeft; std::unique_ptr _topPlaneRight; std::unique_ptr _progBarTextPlane; std::unique_ptr _progbar; }; #endif // OUTPUT_H libzypp-17.36.5/tools/repomirror/000077500000000000000000000000001476576476200167565ustar00rootroot00000000000000libzypp-17.36.5/tools/repomirror/CMakeLists.txt000066400000000000000000000005511476576476200215170ustar00rootroot00000000000000PROJECT( repomirror C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES output.h main.cc ) ADD_DEFINITIONS( -DZYPP_BUILD_DIR="${CMAKE_CURRENT_BINARY_DIR}" ) message(${Notcurses++_LIBRARIES}) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp ${Notcurses++_LIBRARIES} -lnotcurses-core ) libzypp-17.36.5/tools/repomirror/main.cc000066400000000000000000000351301476576476200202130ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST 1 #include "../../tests/lib/TestSetup.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "output.h" class DlSkippedException : public zypp::Exception { public: DlSkippedException() : zypp::Exception("Download was skipped" ) {} }; class MyDLStatus : public zyppng::ProvideStatus { public: MyDLStatus ( OutputView &out, zyppng::ProvideRef parent ) : ProvideStatus( parent ), _out(out) {} virtual void pulse ( ) { zyppng::ProvideStatus::pulse(); const auto &currStats = stats(); if ( currStats._expectedBytes == 0 ) return; auto perc = (double)(currStats._finishedBytes + currStats._partialBytes) / (double)currStats._expectedBytes; std::string txt = zypp::str::Str() << "Downloading " << zypp::ByteCount((currStats._finishedBytes + currStats._partialBytes)) << "/" << currStats._expectedBytes << " (" << currStats._perSecond<<"/s)"; _out.updateProgress( txt, perc ); } private: OutputView &_out; }; /*! * Downloads a solvable via the given handle. * Returns the AsyncResult */ zyppng::AsyncOpRef> provideSolvable ( std::shared_ptr output, zyppng::ProvideMediaHandle handle, const zypp::sat::Solvable &s ) { using namespace zyppng::operators; auto prov = handle.parent(); if ( !prov ) return zyppng::makeReadyResult( zyppng::expected::error( std::make_exception_ptr( zypp::Exception("Handle without parent!"))) ); zypp::PoolItem pi(s); if ( !pi->isKind() ) { //output->putMsgErr( zypp::str::Str() << "Skipping 1: " << pi.asUserString() << "\n" ); return zyppng::makeReadyResult( zyppng::expected::error( std::make_exception_ptr(DlSkippedException())) ); } auto oml = pi.lookupLocation(); if ( oml.filename().empty() ) { output->putMsgErr( zypp::str::Str() << "Skipping: " << pi.asUserString() << "\n" ); return zyppng::makeReadyResult( zyppng::expected::error( std::make_exception_ptr(DlSkippedException())) ); } // enable for more output, but sloooooows the startup time down significantly //output->putMsgTxt( zypp::str::Str() << "Downloading " << pi.asUserString() << " size is: " << pi.downloadSize() << "\n" ); return prov->provide( handle, oml.filename(), zyppng::ProvideFileSpec( oml ) ) | [output]( zyppng::expected &&res ) { if ( res ) { output->putMsgTxt( zypp::str::Str() << "File downloaded: " << res->file() << "\n" ); } else { output->putMsgErr( zypp::str::Str() << "Failed to download file\n" ); try { std::rethrow_exception(res.error()); } catch(const zypp::Exception& e) { output->putMsgErr( zypp::str::Str() << e.asUserHistory() << '\n' ); } catch(const std::exception& e) { output->putMsgErr( zypp::str::Str() << e.what() << '\n' ); } } return res; }; } /*! * Helper function to copy a ProvideRes underlying file to a target destination, keeping the ProvideRes alive until the copy operation has finished */ zyppng::AsyncOpRef> copyProvideResToFile ( std::shared_ptr output, zyppng::ProvideRef prov, zyppng::ProvideRes &&res, const zypp::Pathname &targetDir ) { using namespace zyppng::operators; auto fName = res.file(); return prov->copyFile( fName, targetDir/fName.basename() ) | [ resSave = std::move(res) ] ( auto &&result ) { // callback lambda to keep the ProvideRes reference around until the op is finished, // if the op fails the callback will be cleaned up and so the reference return result; }; } /*! * Helper function to calculate a checksum on a ProvideRes result file, keeping the ProvideRes alive during the operation and returning it again after the test was successful, * here we could also ask the user if a invalid checksum should be accepted and ignore the result if the user wants to */ zyppng::AsyncOpRef> checksumIfRequired ( std::shared_ptr output, zyppng::ProvideRef prov, zypp::sat::Solvable solvable, zyppng::ProvideRes &&res ) { using namespace zyppng::operators; auto fName = res.file(); const auto oml = solvable.lookupLocation(); if ( !oml.checksum().empty() ) { output->putMsgTxt( zypp::str::Str()<<" calculating checksum for file: " << fName << "\n"); return prov->checksumForFile( fName, oml.checksum().type() ) | mbind([ output, expectedSum = oml.checksum(), saveRes = std::move(res) ]( auto &&checksumRes ) { output->putMsgTxt( zypp::str::Str()<<" Got checksum for file: " << saveRes.file() << " is: " << checksumRes << "\n" ); try { zypp::CheckSum s( expectedSum.type(), checksumRes ); if ( expectedSum == s ) return zyppng::expected::success(std::move(saveRes)); else return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::CheckSumCheckException( zypp::str::Str() << saveRes.file() << " has wrong checksum" ) ) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } }); } return zyppng::makeReadyResult( zyppng::expected::success(std::move(res)) ); } int main ( int argc, char *argv[] ) { using namespace zyppng::operators; auto ev = zyppng::EventLoop::create(); auto output = OutputView::create(); if ( !output ) { std::cerr << "Failed to initialize Output view" << std::endl; return 1; } output->putMsgTxt("Loading System\n"); output->putMsgErr("Errors go here\n"); #if 0 { auto prov = zyppng::Provide::create(); prov->setStatusTracker( std::make_shared( *output, prov) ); zypp::Url test("copy://"); test.setPathName("/tmp/test/test1"); auto rootOp = prov->provide( test, zyppng::ProvideFileSpec().setDestFilenameHint("/tmp/test/test2") ) | [&]( zyppng::expected &&res ) { if ( !res ) { output->putMsgErr( zypp::str::Str() << "Failed to copy file: ", false ); try { std::rethrow_exception(res.error()); } catch(const zypp::Exception& e) { output->putMsgErr( zypp::str::Str() << e.asUserHistory() << '\n' ); } catch(const std::exception& e) { output->putMsgErr( zypp::str::Str() << e.what() << '\n' ); } catch(...) { output->putMsgErr( zypp::str::Str() << "Unknown exception\n" ); } } else { output->putMsgTxt( zypp::str::Str() << "Yay copy worked\n" ); } return 0; }; prov->start(); if ( !rootOp->isReady() ) ev->run(); output->putMsgTxt( zypp::str::Str() << "Waiting, press Return to exit\n" ); output->waitForKeys( { NCKEY_ENTER } ); return 0; } #endif TestSetup t; try { t.LoadSystemAt( "/" ); } catch ( const zypp::Exception &e ) { output.reset(); //disable curses std::cerr << "Failed to load repo info from system." << std::endl; std::cerr << "Got exception: " << e << std::endl; return 1; } zypp::RepoManager rManager( zypp::RepoManagerOptions("/") ); auto pool = t.pool(); auto satPool = t.satpool(); output->putMsgTxt("Loading repositories\n"); std::vector myRepos; for ( const auto &r : t.satpool().repos() ) { if ( r.isSystemRepo() ) continue; myRepos.push_back(r); } if ( !myRepos.size() ) { output->putMsgTxt( zypp::str::Str() << "No repos found, press any key to exit\n" ); output->waitForKeys(); return 0; } std::vector reposToDl = output->promptMultiSelect( "Select the repos you want to download", "", myRepos ); output->renderNow(); if( !reposToDl.size() ) { output->putMsgTxt( zypp::str::Str() << "No repos selected, press any key to exit\n" ); output->waitForKeys(); return 0; } const auto &workerPath = zypp::Pathname ( ZYPP_BUILD_DIR ).dirname() / "tools" / "workers"; auto prov = zyppng::Provide::create(); prov->setStatusTracker( std::make_shared( *output, prov) ); prov->sigAuthRequired().connect( [&](const zypp::Url &reqUrl, const std::string &triedUsername, const std::map &extraValues) -> std::optional { auto user = output->promptUser( zypp::str::Str() << "Auth request for URL: " << reqUrl << "\n" << "Last tried username was: " << triedUsername << "\n", "Username" ); if ( !user ) return {}; zypp::media::AuthData d; d.setUrl( reqUrl ); d.setUsername( *user ); auto pass = output->promptUser("", "Password"); if ( pass ) d.setPassword( *pass ); return d; }); std::vector< zyppng::AsyncOpRef< std::vector>> > mop; // we need a way to remember the data for the full transaction, there is probably a better way for a real application std::unordered_map>> repoToMediaToSolvables; zypp::Pathname workPath = zypp::Pathname(".").realpath() / "allrpms"; zypp::filesystem::assert_dir( workPath ); for ( const auto repoToDl : reposToDl ) { const auto &r = myRepos[repoToDl]; output->putMsgTxt( zypp::str::Str() << "Repo selected to download: " << r.asUserString() << "\n" ); auto urlSet = r.info().baseUrls(); if ( urlSet.empty() ) { output->putMsgTxt( zypp::str::Str() << "Repo has no mirrors, ignoring!\n" ); continue; } std::vector urlsWithPath; std::transform( urlSet.begin(), urlSet.end(), std::back_inserter(urlsWithPath), [&]( const zypp::Url &bUrl ){ zypp::Url withPath(bUrl); withPath.setPathName( r.info().path() / bUrl.getPathName() ); return withPath; }); zypp::ByteCount bc; output->putMsgTxt( zypp::str::Str() << "Adding Solvables for repo: " << r << "\n" ); std::unordered_map> &mediaToSolvables = repoToMediaToSolvables[repoToDl]; std::for_each( satPool.solvablesBegin(), satPool.solvablesEnd(), [&]( const zypp::sat::Solvable &s ) { if ( s.repository() != r ) return; bc += s.downloadSize(); const auto mediaNr = s.lookupLocation().medianr(); mediaToSolvables[mediaNr].push_back(s); }); output->putMsgTxt( zypp::str::Str() << "Download size for repo: " << r << ":" << bc << "\n" ); std::transform( mediaToSolvables.begin(), mediaToSolvables.end(), std::back_inserter(mop), [&]( const auto &s ) { auto spec = zyppng::ProvideMediaSpec( r.info().name() ); zypp::Pathname mediafile = r.info().metadataPath(); if ( !mediafile.empty() ) { mediafile += "/media.1/media"; if ( zypp::PathInfo(mediafile).isExist() ) { spec.setMediaFile( mediafile ); spec.setMedianr( s.first ); } } return prov->attachMedia( urlsWithPath, spec ) | [ &, &solvables = s.second ]( zyppng::expected &&hdl ) { if ( !hdl ) { output->putMsgErr( zypp::str::Str() << "Failed to attach medium: ", false ); try { std::rethrow_exception(hdl.error()); } catch(const zypp::Exception& e) { output->putMsgErr( zypp::str::Str() << e.asUserHistory() << '\n' ); } catch(const std::exception& e) { output->putMsgErr( zypp::str::Str() << e.what() << '\n' ); } catch(...) { output->putMsgErr( zypp::str::Str() << "Unknown exception\n" ); } return std::vector>>{ zyppng::makeReadyResult( zyppng::expected::error( hdl.error() ) ) }; } return zyppng::transform( solvables, [ &, hdl=hdl.get() ]( const zypp::sat::Solvable &s ) { return s | (std::bind( &provideSolvable, output, hdl, std::placeholders::_1 )) | mbind (std::bind( &checksumIfRequired, output, prov, sat::Solvable(s), std::placeholders::_1 )) | mbind (std::bind( ©ProvideResToFile, output, prov, std::placeholders::_1, workPath ) ) ; }); } | zyppng::join() | [ &r, &output ]( const auto &&res ){ output->putMsgTxt( zypp::str::Str() << "Finished with rpo: " << r.info().name() << "\n" ); return res; }; }); } std::vector> finalResults; auto rootOp = std::move( mop ) | zyppng::join() | [&]( std::vector>> &&allResults ) { // reduce to one vector of results for ( auto &innerVec : allResults ) { std::accumulate( std::make_move_iterator(innerVec.begin()), std::make_move_iterator(innerVec.end()), &finalResults, []( std::vector>* vec, auto &&bla ){ vec->push_back(std::move(bla)); return vec; }); } ev->quit(); return 0; }; prov->start(); if ( !rootOp->isReady() ) ev->run(); int succ = 0; int skip = 0; int err = 0; for ( const auto &res : finalResults ) { if ( res ) succ++; else { try { std::rethrow_exception( res.error() ); } catch(const DlSkippedException& e) { skip++; } catch( const zypp::Exception &e ) { output->putMsgErr( zypp::str::Str()<<"Request failed with: " << e.asUserString() << "\n"); err++; } catch( const std::exception &e ) { output->putMsgErr( zypp::str::Str()<<"Request failed with: " << e.what() << "\n"); err++; } catch( ... ) { output->putMsgErr( zypp::str::Str()<<"Request failed with an unknown error.\n" ); err++; } } } #if 0 for ( const auto &outer : finalResults ) { } #endif output->putMsgTxt( zypp::str::Str() << "All done:\nSuccess:" << succ << "\nErrors: "<< err << "\nSkipped:"<putMsgTxt( zypp::str::Str() << "Waiting, press Return to exit\n" ); output->waitForKeys( { NCKEY_ENTER } ); return 0; } libzypp-17.36.5/tools/repomirror/output.h000066400000000000000000000225561476576476200205010ustar00rootroot00000000000000#ifndef OUTPUT_H #define OUTPUT_H #include #include #include #include #include #include #include #include #include static void zypp_release_ncplane ( struct ncplane *ptr ) { if ( ptr ) ncplane_destroy(ptr); } static void zypp_release_progbar ( struct ncprogbar *ptr ) { if ( ptr ) ncprogbar_destroy(ptr); } template using as_user_string_t = decltype(T::asUserString); template constexpr bool has_as_user_string_v = std::is_detected_v; template constexpr bool always_false = false; template inline auto stringify ( const T& value ) { if constexpr( has_as_user_string_v ) { return value.asUserString(); } else if constexpr ( std::is_same_v ) { return value; } else if constexpr ( std::is_convertible_v ) { return (std::string)value; } else { static_assert( always_false, "No way to convert to a string"); } } class OutputView : public zyppng::Base { public: ~OutputView() { } static std::shared_ptr create( ) { auto ptr = std::shared_ptr( new OutputView() ); ptr->_nc = std::make_unique(); if ( !ptr->_nc ) return nullptr; ptr->_stdplane = std::unique_ptr( ptr->_nc->get_stdplane() ); if ( !ptr->_stdplane ) return nullptr; uint rows = 0; uint cols = 0; ptr->_stdplane->get_dim( rows, cols ); int top_rows = ( rows - 2 ); if ( top_rows <= 0 ){ return nullptr; } uint bottom_rows = rows - top_rows; if ( bottom_rows <= 0 ) { return nullptr; } // the outer plane this is just used to draw a nice border ptr->_topOuterPlane = std::make_unique( *ptr->_stdplane, top_rows, cols, 0, 0, nullptr ); ptr->_topOuterPlane->rounded_box_sized( 0, 0, top_rows, cols, 0 ); // the inner plane, here we put the text uint r,c; ptr->_topOuterPlane->get_dim( r, c ); ptr->_topPlaneLeft = std::make_unique( *ptr->_topOuterPlane, r-2 , (c-1) / 2, 1, 1 ); ptr->_topPlaneLeft->set_scrolling( true ); ptr->_topPlaneRight = std::make_unique( *ptr->_topOuterPlane, r-2 , c - ptr->_topPlaneLeft->get_dim_x() - 1 , 1, ptr->_topPlaneLeft->get_dim_x() + 1 ); ptr->_topPlaneRight->set_scrolling( true ); // the plane where we show the progressbar text ptr->_progBarTextPlane = std::make_unique( *ptr->_stdplane, 1 , cols, top_rows, 0 ); // to create the progressbar we need to fall back to the C API due to some bugs in the C++ progbar implementation ncplane_options nopts = { .y = top_rows+1, .x = 0, .rows = bottom_rows-1, .cols = cols, .userptr = nullptr, .name = nullptr, .resizecb = nullptr, .flags = 0, .margin_b = 0, .margin_r = 0, }; std::unique_ptr bottomPlane( ncplane_create( *ptr->_stdplane, &nopts ), &zypp_release_ncplane ); if ( !bottomPlane ) { return nullptr; } struct ncprogbar_options popts = { .ulchannel = 0, .urchannel = 0, .blchannel = 0, .brchannel = 0, .flags = 0, }; ptr->_progbar = std::unique_ptr ( ncprogbar_create( bottomPlane.release(), &popts ), &zypp_release_progbar ); if ( !ptr->_progbar ) { return nullptr; } return ptr; } void updateProgress ( const std::string &txt, double prog, bool autoRender = true ) { if ( !_progbar ) return; _progBarTextPlane->erase(); _progBarTextPlane->putstr( 0, ncpp::NCAlign::Center, txt.data() ); ncprogbar_set_progress( _progbar.get(), prog ); if ( autoRender ) renderNow(); } void putMsgTxt ( const std::string &txt, bool doAutoRender = true ) { if ( !_topPlaneLeft ) return; ncplane_puttext( *_topPlaneLeft, -1, NCALIGN_LEFT, txt.data(), nullptr ); if ( doAutoRender ) renderNow(); } void putMsgErr ( const std::string &txt, bool doAutoRender = true ) { if ( !_topPlaneRight ) return; _topPlaneRight->set_fg_rgb( 0xff5349 ); ncplane_puttext( *_topPlaneRight, -1, NCALIGN_LEFT, txt.data(), nullptr ); _topPlaneRight->set_fg_default(); if ( doAutoRender ) renderNow(); } std::optional promptUser ( const std::string &desc, const std::string &label ) { if ( desc.size() ) putMsgTxt( desc, false ); putMsgTxt( label + ": " ); uint curX, curY; _topPlaneLeft->get_cursor_yx( curY, curX ); ncplane_options nopts = { .y = (int)curY, .x = (int)curX, .rows = 1, .cols = _topPlaneLeft->get_dim_x() - curX, .userptr = nullptr, .name = nullptr, .resizecb = nullptr, .flags = 0, .margin_b = 0, .margin_r = 0, }; std::unique_ptr inputPlane( ncplane_create( *_topPlaneLeft, &nopts ), &zypp_release_ncplane ); if ( !inputPlane ) { return {}; } auto readOpts = ncreader_options { .tchannels = 0, .tattrword = 0, .flags = NCREADER_OPTION_CURSOR | NCREADER_OPTION_NOCMDKEYS }; std::unique_ptr reader( ncreader_create( inputPlane.release(), &readOpts ), []( struct ncreader *relme){ ncreader_destroy(relme, nullptr);} ); if ( !reader ) return {}; while ( true ) { renderNow(); ncinput ni; _nc->get( true, &ni ); if ( ni.id == NCKEY_ENTER ) { break; } ncreader_offer_input( reader.get(), &ni ); } std::unique_ptr data( ncreader_contents( reader.get() ), free ); std::string_view cppData( data.get() ); if ( cppData.empty() ) return {}; return std::string(cppData); } template std::vector promptMultiSelect( const std::string &title, const std::string &secondary, const std::vector &data ) { // use a boost container here, because the stdlib decided to completely break vector by prematurely optimizing it boost::container::vector selected( data.size(), false ); std::vector items; std::vector> stringsStorage; items.reserve( data.size() ); stringsStorage.reserve( data.size() ); for ( const T& entry : data ) { stringsStorage.push_back( std::make_pair( stringify(entry), std::string("") ) ); items.push_back( ncmselector_item{ .option = stringsStorage.back().first.data(), .desc = stringsStorage.back().second.data(), .selected = false }); } items.push_back(ncmselector_item{ .option = nullptr, .desc = nullptr, .selected = false }); std::string_view footer("Press Enter to accept or ESC to cancel."); auto selOpts = ncmultiselector_options{ .title = title.data(), .secondary = secondary.data(), .footer = footer.data(), .items = items.data(), .maxdisplay = 0, .opchannels = NCCHANNELS_INITIALIZER(0xe0, 0x80, 0x40, 0, 0, 0), .descchannels = NCCHANNELS_INITIALIZER(0x80, 0xe0, 0x40, 0, 0, 0), .titlechannels = NCCHANNELS_INITIALIZER(0x20, 0xff, 0xff, 0, 0, 0x20), .footchannels = NCCHANNELS_INITIALIZER(0xe0, 0, 0x40, 0x20, 0x20, 0), .boxchannels = NCCHANNELS_INITIALIZER(0x20, 0xe0, 0xe0, 0x20, 0, 0), .flags = 0 }; auto tmpPlane = ncpp::Plane( *_stdplane, _stdplane->get_dim_y()-1, _stdplane->get_dim_x()-1, 1, 1 ); ncpp::MultiSelector selector( tmpPlane, &selOpts); while ( true ) { renderNow(); ncinput ni; _nc->get( true, &ni ); if ( ni.id == NCKEY_ESC ) { return {}; } else if ( ni.id == NCKEY_ENTER ) { break; } selector.offer_input( &ni ); } selector.get_selected( selected.data(), selected.size() ); std::vector selIndices; for ( int i = 0; i < selected.size(); i++ ) { if ( selected[i]) selIndices.push_back(i); } return selIndices; } void renderNow () { if ( _nc ) _nc->render(); } uint32_t waitForKeys ( std::vector keys = {} ) { ncinput ni; while ( true ) { _nc->get( true, &ni ); if ( keys.empty() || std::find( keys.begin(), keys.end(), ni.id ) != keys.end() ) return ni.id; } } private: OutputView() : _progbar( nullptr, &zypp_release_progbar ) {} std::unique_ptr _nc; std::unique_ptr _stdplane; std::unique_ptr _topOuterPlane; std::unique_ptr _topPlaneLeft; std::unique_ptr _topPlaneRight; std::unique_ptr _progBarTextPlane; std::unique_ptr _progbar; }; #endif // OUTPUT_H libzypp-17.36.5/tools/zypp-CheckAccessDeleted.cc000066400000000000000000000116751476576476200215250ustar00rootroot00000000000000#include #include #include #include #include #include #include /** Collect max string size. */ struct TableCol { TableCol( size_t size_r = 0 ) : size( size_r ) {} TableCol( const std::string & header_r ) : header( header_r ), size( header_r.size() ) {} void operator()( const std::string & val_r ) { if ( val_r.size() > size ) size = val_r.size(); } std::string header; size_t size; }; /** Scan to determine column sizes, then print. */ struct ProcInfoTable { ProcInfoTable() : pid ( "PID" ) , ppid ( "PPID" ) , puid ( "UID" ) , login ( "LOGIN" ) , command ( "COMMAND" ) , service ( "SERVICE" ) , files ( "FILES" ) {} void scan( const zypp::CheckAccessDeleted::ProcInfo & val_r ) { pid( val_r.pid ); ppid( val_r.ppid ); puid( val_r.puid ); login( val_r.login ); command( val_r.command ); service( val_r.service() ); } void printHeader() const { printRow( pid.header, ppid.header, puid.header, login.header, command.header, service.header, files.header ); } void print( const zypp::CheckAccessDeleted::ProcInfo & val_r ) const { printRow( val_r.pid, val_r.ppid, val_r.puid, val_r.login, val_r.command, val_r.service(), zypp::str::join( val_r.files, ", " ) ); } void printRow( const std::string & pid_r, const std::string & ppid_r, const std::string & puid_r, const std::string & login_r, const std::string & command_r, const std::string & service_r, const std::string & files_r ) const { printf( "%*s %*s %*s %-*s %-*s %-*s %-s\n", (int)pid.size, pid_r.c_str(), (int)ppid.size, ppid_r.c_str(), (int)puid.size, puid_r.c_str(), (int)login.size, login_r.c_str(), (int)command.size, command_r.c_str(), (int)service.size, (service_r.empty() ? " -" : service_r.c_str()), files_r.c_str() ); } TableCol pid; TableCol ppid; TableCol puid; TableCol login; TableCol command; TableCol service; TableCol files; }; void usage ( const std::string &appname ) { std::cout << "Usage: " << appname << " [--help] [--debugFile ] [--zypper]" << std::endl; std::cout << "List information about all running processe" << std::endl; std::cout << "which access deleted executables or libraries." << std::endl; std::cout << std::endl; std::cout << "GLOBALOPTS:" << std::endl; std::cout << " --debugFile Use information from instead" << std::endl; std::cout << " of inspecting the host system." << std::endl; std::cout << " --zypper Disable verbose checking like zypper does." << std::endl; std::cout << std::endl; std::cout << "TABLEHEADERS:" << std::endl; std::cout << " PID " << "process ID" << std::endl; std::cout << " PPID " << "parent process ID" << std::endl; std::cout << " UID " << "process user ID" << std::endl; std::cout << " LOGIN " << "process login name" << std::endl; std::cout << " COMMAND " << "process command name" << std::endl; std::cout << " SERVICE " << "/etc/init.d/ script that might be used to restart the command (guessed)" << std::endl; std::cout << " FILES " << "list of deleted executables or libraries accessed" << std::endl; } int main( int argc, char * argv[] ) { std::string progname( zypp::Pathname::basename( argv[0] ) ); std::string debugInputFile; bool verbose = true; argv++; argc--; while( argc > 0 ) { if ( strcmp( argv[0], "--help" ) == 0 ) { usage( progname ); return 0; } else if ( strcmp( argv[0], "--debugFile" ) == 0 ) { if ( argc < 2 ) { std::cerr << progname << ": debugFile requires a argument" << std::endl; return 1; } ++argv; --argc; debugInputFile = argv[0]; } else if ( strcmp( argv[0], "--zypper" ) == 0 ) { verbose = false; } else { std::cerr << progname << ": unexpected argument '" << argv[0] << "'" << std::endl; std::cerr << "Try `" << progname << " --help' for more information." << std::endl; return 1; } ++argv; --argc; } zypp::CheckAccessDeleted checker(false); // wait for explicit call to check() try { if ( debugInputFile.empty() ) checker.check( verbose ); else checker.check( debugInputFile, verbose ); } catch( const zypp::Exception & err ) { std::cerr << err << std::endl << err.historyAsString(); return 2; } ProcInfoTable table; for_( it, checker.begin(), checker.end() ) table.scan( *it ); table.printHeader(); for_( it, checker.begin(), checker.end() ) table.print( *it ); return 0; } libzypp-17.36.5/tools/zypp-NameReqPrv.cc000066400000000000000000000377441476576476200201240ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST #include #include #include #include static std::string appname( "NameReqPrv" ); #define message cout using std::flush; int errexit( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } return exit_r; } int usage( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } cerr << "Usage: " << appname << " [--root ROOTDIR] [OPTIONS] NAME... [[OPTIONS] NAME...]..." << endl; cerr << " Load all enabled repositories (no refresh) and search for" << endl; cerr << " occurrences of NAME (regex or -x) in package names or dependencies" << endl; cerr << " --root Load repos from the system located below ROOTDIR. If ROOTDIR" << endl; cerr << " denotes a sover testcase, the testcase is loaded." << endl; cerr << " --installed Process installed packages only." << endl; cerr << " -i/-I turn on/off case insensitive search (default on)" << endl; cerr << " -n/-N turn on/off looking for names (default on)" << endl; cerr << " -p/-P turn on/off looking for provides (default off)" << endl; cerr << " -r/-R turn on/off looking for requires (default off)" << endl; cerr << " -c/-C turn on/off looking for conflicts (default off)" << endl; cerr << " -o/-O turn on/off looking for obsoletes (default off)" << endl; cerr << " -m/-M turn on/off looking for recommends (default off)" << endl; cerr << " -s/-S turn on/off looking for supplements (default off)" << endl; cerr << " -e/-E turn on/off looking for enhan./sugg.(default off)" << endl; cerr << " -a short for -n -p -r" << endl; cerr << " -A short for -n -P -R" << endl; cerr << " -x do exact matching (glob) rather than regex (substring)" << endl; cerr << " -D dump dependencies of " << endl; cerr << "" << endl; return exit_r; } #define COL_R "\033[0;31m" #define COL_G "\033[0;32m" #define COL_B "\033[0;34m" #define COL_C "\033[0;36m" #define COL_M "\033[0;35m" #define COL_Y "\033[0;33m" #define COL_BL "\033[0;30m" #define COL_WH "\033[1;37m" #define COL_OFF "\033[0m" struct PQSort { // std::less semantic bool operator()( const sat::Solvable & lhs, const sat::Solvable & rhs ) const { { bool l = lhs.isSystem(); bool r = rhs.isSystem(); if ( l != r ) return r; } { IdString l { lhs.ident() }; IdString r { rhs.ident() }; if ( l != r ) return l < r; } return avo( PoolItem(lhs), PoolItem(rhs) ); return lhs.id() > rhs.id(); } ui::SelectableTraits::AVOrder avo; }; struct Table { using ResultLInes = std::set; ResultLInes & row( const sat::Solvable & solv_r ) { //smax( _maxSID, ); smax( _maxNAME, solv_r.ident().size() + solv_r.edition().size() + solv_r.arch().size() ); smax( _maxREPO, solv_r.repository().name().size(), solv_r.repository().name() ); //smax( _maxTIME, ); //smax( _maxVEND, solv_r.vendor().size() ); return _map[solv_r]; } void row( PoolQuery::const_iterator it_r ) { ResultLInes & details { row( *it_r ) }; for_( match, it_r.matchesBegin(), it_r.matchesEnd() ) { std::string ent { match->inSolvAttr().asString().substr( 9, 3 )+": " +match->asString() }; if ( match->inSolvAttr() == sat::SolvAttr::dep_requires && match->inSolvable().dep_prerequires().contains( Capability(match->id()) ) ) { static const char * pre = " " COL_C "[PRE]" COL_OFF; ent[3] = '+'; ent += pre; } details.insert( std::move(ent) ); } } std::ostream & dumpOn( std::ostream & str ) const { #define S " " #define fmtSID "%*d" #define argSID _maxSID, slv.id() #define fmtNAME COL_B "%s" COL_OFF "-" COL_G "%s" COL_OFF ".%-*s" #define argNAME slv.ident().c_str(), slv.edition().c_str(), _maxNAME-slv.ident().size()-slv.edition().size(), slv.arch().c_str() #define fmtREPO "(%2d)%-*s" #define argREPO slv.repository().info().priority(), _maxREPO, slv.repository().name().c_str() #define fmtTIME "%s%10ld" #define argTIME ( slv.isSystem() && slv.installtime() ? "i" : "b" ), time_t( slv.isSystem() && slv.installtime() ? slv.installtime() : slv.buildtime() ) #define fmtVEND "%s" #define argVEND slv.vendor().c_str() std::string dind( _maxSID + _maxNAME+2/*-.*/ + 2*strlen(S), ' ' ); for ( const auto & el : _map ) { sat::Solvable slv { el.first }; const char * tagCol = slv.isSystem() ? COL_M : ui::Selectable::get(slv)->identicalInstalled(PoolItem(slv)) ? COL_C : ""; str << str::form( "%s" fmtSID S fmtNAME S "%s" fmtREPO S fmtTIME S fmtVEND COL_OFF "\n", tagCol, argSID, argNAME, tagCol, argREPO, argTIME, argVEND ); for ( const auto & d : el.second ) str << dind << d << endl; } return str; } private: static void smax( unsigned & var_r, unsigned val_r, std::string_view n = {} ) { if ( val_r > var_r ) var_r = val_r; } private: unsigned _maxSID = 7; // size + indent unsigned _maxNAME = 0; unsigned _maxREPO = 0; //unsigned _maxTIME = 10; //unsigned _maxVEND = 0; std::map _map; }; inline std::ostream & operator<<( std::ostream & str, const Table & table_r ) { return table_r.dumpOn( str ); } /////////////////////////////////////////////////////////////////// void dDump( const std::string & spec_r ) { message << "DUMP " << spec_r << " {"; sat::WhatProvides q( Capability::guessPackageSpec( spec_r ) ); if ( q.empty() ) { message << "}" << endl; return; } for ( const auto & el : q ) { message << endl << "==============================" << endl << dump(el); if ( isKind(el) ) { message << endl << "REPLACES: " << make(el)->replacedProducts(); } else if ( isKind(el) ) { message << endl << "CONTENT: " << make(el)->contents(); } else if ( isKind(el) ) { message << endl << "STATUS: " << PoolItem(el); } } message << endl << "}" << endl; } /////////////////////////////////////////////////////////////////// void dTree( const std::string & cmd_r, const std::string & spec_r ) { message << "tree " << spec_r << " {"; sat::WhatProvides spec( Capability::guessPackageSpec( spec_r ) ); if ( spec.empty() ) { message << "}" << endl; return; } static const std::list attrs { sat::SolvAttr::dep_requires, sat::SolvAttr::dep_recommends, sat::SolvAttr::dep_obsoletes, sat::SolvAttr::dep_conflicts, sat::SolvAttr::dep_supplements, }; std::map>> result; // solvables recommending provided capability { Table t; for ( const auto & el : spec ) { for ( const auto & cap : el.dep_provides() ) { // get attrs matching cap for ( const auto & attr : attrs ) { PoolQuery q; q.addDependency( attr, cap ); if ( q.empty() ) continue; for_( it, q.begin(), q.end() ) { for_( match, it.matchesBegin(), it.matchesEnd() ) { result[attr][*it].insert( match->inSolvAttr().asString().substr( 9, 3 )+": " +match->asString() + " (" + cap.asString() + ")" ); } } } } } message << endl << t; } for ( const auto & attr : attrs ) { if ( result[attr].empty() ) continue; message << endl << "======== " << attr << " by:" << endl; Table t; for ( const auto & el : result[attr] ) { auto & details { t.row( el.first ) }; for ( const auto & cap : el.second ) details.insert( cap ); } message << endl << t << endl; } message << "}" << endl; } /****************************************************************** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int */ int main( int argc, char * argv[] ) { INT << "===[START]==========================================" << endl; appname = Pathname::basename( argv[0] ); --argc,++argv; if ( ! argc ) { return usage(); } /////////////////////////////////////////////////////////////////// auto _ { getZYpp() }; ZConfig::instance(); Pathname sysRoot( TestSetup::isTestcase( "." ) ? "." : TestSetup::isTestSetup( "." ) ? "." : "/" ); sat::Pool satpool( sat::Pool::instance() ); if ( argc && (*argv) == std::string("--root") ) { --argc,++argv; if ( ! argc ) return errexit("--root requires an argument."); if ( ! PathInfo( *argv ).isDir() ) return errexit("--root requires a directory."); sysRoot = *argv; --argc,++argv; } bool onlyInstalled( false ); if ( argc && (*argv) == std::string("--installed") ) { --argc,++argv; onlyInstalled = true; } if ( TestSetup::isTestcase( sysRoot ) ) { message << str::form( "*** Load Testcase from '%s'", sysRoot.c_str() ) << endl; TestSetup test; test.loadTestcaseRepos( sysRoot ); dumpRange( message, satpool.reposBegin(), satpool.reposEnd() ) << endl; } else if ( TestSetup::isTestSetup( sysRoot ) ) { message << str::form( "*** Load TestSetup from '%s'", sysRoot.c_str() ) << endl; const char * astr = getenv( "ZYPP_TESTSUITE_FAKE_ARCH" ); if ( !astr || !*astr ) astr = getenv( "ZYPP_ARCH" ); if ( !astr || !*astr ) astr = "x86_64"; TestSetup test( sysRoot, Arch( astr ) ); test.loadRepos(); dumpRange( message, satpool.reposBegin(), satpool.reposEnd() ) << endl; } else { // a system message << str::form( "*** Load system at '%s'", sysRoot.c_str() ) << endl; if ( true ) { message << "*** load target '" << Repository::systemRepoAlias() << "'\t" << endl; getZYpp()->initializeTarget( sysRoot ); getZYpp()->target()->load(); message << satpool.systemRepo() << endl; } if ( !onlyInstalled ) { RepoManager repoManager( sysRoot ); RepoInfoList repos = repoManager.knownRepositories(); for_( it, repos.begin(), repos.end() ) { RepoInfo & nrepo( *it ); if ( ! nrepo.enabled() ) continue; if ( ! repoManager.isCached( nrepo ) ) { message << str::form( "*** omit uncached repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } message << str::form( "*** load repo '%s'\t", nrepo.name().c_str() ) << flush; try { repoManager.loadFromCache( nrepo ); message << satpool.reposFind( nrepo.alias() ) << endl; } catch ( const Exception & exp ) { message << exp.asString() + "\n" + exp.historyAsString() << endl; message << str::form( "*** omit broken repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } } } } /////////////////////////////////////////////////////////////////// bool ignorecase ( true ); bool matechexact ( false ); bool withSrcPackages ( false ); bool names ( true ); bool dep_provides ( false ); bool dep_requires ( false ); bool dep_conflicts ( false ); bool dep_obsoletes ( false ); bool dep_recommends ( false ); bool dep_supplements ( false ); bool dep_enhacements ( false ); for ( ; argc; --argc,++argv ) { if ( (*argv)[0] == '-' ) { for ( const char * arg = (*argv)+1; *arg != '\0'; ++arg ) // -pr for -p -r { switch ( *arg ) { case 'a': names = true, dep_requires = dep_provides = true; break; case 'A': names = true, dep_requires = dep_provides = false; break; case 'D': if ( argc > 1 ) { --argc,++argv; dDump( *argv ); } else return errexit("-D requires an argument."); break; case 'T': if ( argc > 1 ) { std::string cmd { *argv }; --argc,++argv; dTree( cmd, *argv ); } else return errexit("-T requires an argument."); break; case 'i': ignorecase = true; break; case 'I': ignorecase = false; break; case 'x': matechexact = true; break; case 'n': names = true; break; case 'N': names = false; break; case 'r': dep_requires = true; break; case 'R': dep_requires = false; break; case 'p': dep_provides = true; break; case 'P': dep_provides = false; break; case 'c': dep_conflicts = true; break; case 'C': dep_conflicts = false; break; case 'o': dep_obsoletes = true; break; case 'O': dep_obsoletes = false; break; case 'm': dep_recommends = true; break; case 'M': dep_recommends = false; break; case 's': dep_supplements = true; break; case 'S': dep_supplements = false; break; case 'e': dep_enhacements = true; break; case 'E': dep_enhacements = false; break; } } continue; } PoolQuery q; if ( onlyInstalled ) q.setInstalledOnly(); std::string qstr( *argv ); if ( *argv == ResKind::product ) { q.addKind( ResKind::product ); } else if ( *argv == ResKind::patch ) { q.addKind( ResKind::patch ); } else if ( *argv == ResKind::pattern ) { q.addKind( ResKind::pattern ); } else { sat::Solvable::SplitIdent ident( qstr ); if ( ident.kind() != ResKind::package ) { q.addKind( ident.kind() ); q.addString( ident.name().asString() ); } else q.addString( qstr ); if ( matechexact ) q.setMatchGlob(); else q.setMatchRegex(); q.setCaseSensitive( ! ignorecase ); if ( names ) q.addAttribute( sat::SolvAttr::name ); if ( dep_provides ) { q.addDependency( sat::SolvAttr::dep_provides ); q.addDependency( sat::SolvAttr::dep_provides, Capability(qstr) ); } if ( dep_requires ) { q.addDependency( sat::SolvAttr::dep_requires ); q.addDependency( sat::SolvAttr::dep_requires, Capability(qstr) ); } if ( dep_conflicts ) { q.addDependency( sat::SolvAttr::dep_conflicts ); q.addDependency( sat::SolvAttr::dep_conflicts, Capability(qstr) ); } if ( dep_obsoletes ) { q.addDependency( sat::SolvAttr::dep_obsoletes ); q.addDependency( sat::SolvAttr::dep_obsoletes, Capability(qstr) ); } if ( dep_recommends ) { q.addDependency( sat::SolvAttr::dep_recommends ); q.addDependency( sat::SolvAttr::dep_recommends, Capability(qstr) ); } if ( dep_supplements ) { q.addDependency( sat::SolvAttr::dep_supplements ); q.addDependency( sat::SolvAttr::dep_supplements, Capability(qstr) ); } if ( dep_enhacements ) { q.addDependency( sat::SolvAttr::dep_enhances ); q.addDependency( sat::SolvAttr::dep_enhances, Capability(qstr) ); q.addDependency( sat::SolvAttr::dep_suggests ); q.addDependency( sat::SolvAttr::dep_suggests, Capability(qstr) ); } } message << *argv << " [" << (ignorecase?'i':'_') << (names?'n':'_') << (dep_requires?'r':'_') << (dep_provides?'p':'_') << (dep_conflicts?'c':'_') << (dep_obsoletes?'o':'_') << (dep_recommends?'m':'_') << (dep_supplements?'s':'_') << (dep_enhacements?'e':'_') << "] {" << endl; Table t; for_( it, q.begin(), q.end() ) { if ( it->isKind( ResKind::srcpackage ) && !withSrcPackages ) continue; t.row( it ); } message << t << "}" << endl; } INT << "===[END]============================================" << endl << endl; return 0; } libzypp-17.36.5/tools/zypp-cpeid.cc000066400000000000000000000035621476576476200171570ustar00rootroot00000000000000#include #include #include using std::cout; using std::endl; using zypp::CpeId; using zypp::Pathname; int main( int argc, const char * argv[] ) { if ( argc == 1 || argv[1] == std::string( "--help" ) || argv[1] == std::string( "-h" ) ) { cout << "Usage: " << Pathname::basename( argv[0] ) << " [CPEID]...\n" "Check and print all supplied CPEIDs as FS, URI and WFN.\n" "Afterwards compare them pairwise. \n" "\n" " (wfn:[part=\"a\",vendor=\"openSUSE\",product=\"libzypp\",version=\"14\\.17\\.3\"])\n" " URI: cpe:/a:openSUSE:libzypp:14.17.3\n" " FS: cpe:2.3:a:openSUSE:libzypp:14.17.3:*:*:*:*:*:*:*\n" "\n"; return 0; } --argc, ++argv; std::vector args; args.reserve( argc ); for ( ; argc; --argc, ++argv ) { try { CpeId cpe( argv[0] ); cout << '[' << args.size() << "]-----------------------------------------------------------------------------" << endl; cout << "arg: " << argv[0] << endl; cout << " (" << cpe.asWfn() << ')' << endl; cout << "URI: " << cpe.asUri() << endl; cout << "FS: " << cpe<< endl; args.push_back( cpe ); } catch ( const std::invalid_argument & exp ) { cout << "--------------------------------------------------------------------------------" << endl; cout << "arg: " << argv[0] << endl; cout << "ERR: " << exp.what() << endl; } } cout << "--------------------------------------------------------------------------------" << endl; unsigned lhsidx = 0; for ( const auto & lhs : args ) { unsigned rhsidx = 0; for ( const auto & rhs : args ) { cout << "[" << lhsidx << "] " << lhs << endl; cout << "[" << rhsidx << "] " << rhs << endl; cout << " ==> " << compare( lhs, rhs ) << endl; ++rhsidx; } ++lhsidx; } return 0; } libzypp-17.36.5/tools/zypp-install.cc000066400000000000000000000205031476576476200175330ustar00rootroot00000000000000// // g++ -Wall zypp-install.cc -l zypp -o zypp-install // // A small (and simple) demo which walks through zypp, initializing // and refreshing the repos, selecting packages ('zypper dup'), // resolving dependencies and finally comitting/installing the // result (in dry-run mode). // // No callbacks, questions or fancy output during commit, but it will // do a 'zypper dup' if you'd remove the DryRun and DownloadOnly flag. // // So be careful if running it as root. // #include #define TEST_DEBUGLOG 0 #if ( TEST_DEBUGLOG ) #include #endif #include #include #include using std::cin; using std::cout; using std::cerr; using std::endl; using namespace zypp; //////////////////////////////////////////////////////////////////////////////// int main( int argc, char * argv[] ) try { --argc; ++argv; #if ( TEST_DEBUGLOG ) #warning debug log is on base::LogControl::instance().logfile( "/tmp/zypp-install.log" ); #endif Pathname sysRoot( "/" ); ZYpp::Ptr zypp = getZYpp(); // acquire initial zypp lock //////////////////////////////////////////////////////////////////////////////// // init Target: { cout << "Initialize target at " << sysRoot << endl; zypp->initializeTarget( sysRoot ); // initialize target cout << "Loading target resolvables" << endl; zypp->getTarget()->load(); // load installed packages to pool } //////////////////////////////////////////////////////////////////////////////// // init Repos: { RepoManager repoManager( sysRoot ); // sync the current repo set for ( RepoInfo & nrepo : repoManager.knownRepositories() ) { if ( ! nrepo.enabled() ) continue; // Often volatile media are sipped in automated environments // to avoid media chagne requests: if ( nrepo.url().schemeIsVolatile() ) continue; bool refreshNeeded = false; if ( nrepo.autorefresh() ) // test whether to autorefresh repo metadata { for ( const Url & url : nrepo.baseUrls() ) { try { if ( repoManager.checkIfToRefreshMetadata( nrepo, url ) == RepoManager::REFRESH_NEEDED ) { cout << "Need to autorefresh repo " << nrepo.alias() << endl; refreshNeeded = true; } break; // exit after first successful checkIfToRefreshMetadata } catch ( const Exception & exp ) {} // Url failed, try next one... } // If all urls failed we can leave it to the code below to // fail if access is actually needed and still failing. // (missing metadata, package download, ...) } // initial metadata download or cache refresh if ( ! repoManager.isCached( nrepo ) || refreshNeeded ) { cout << "Refreshing repo " << nrepo << endl; if ( repoManager.isCached( nrepo ) ) { repoManager.cleanCache( nrepo ); } repoManager.refreshMetadata( nrepo ); repoManager.buildCache( nrepo ); } // load cache try { cout << "Loading resolvables from " << nrepo.alias() << endl; repoManager.loadFromCache( nrepo );// load available packages to pool } catch ( const Exception & exp ) { // cachefile has old fomat (or is corrupted): try yo rebuild it repoManager.cleanCache( nrepo ); repoManager.buildCache( nrepo ); repoManager.loadFromCache( nrepo ); } } } cout << zypp->pool() << endl; cout << "=====[pool ready]==============================" << endl; //////////////////////////////////////////////////////////////////////////////// // GO... //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // Select package to install... // For demo purpose do 'zypper dup' // otherwise select manually whatever you need... zypp->resolver()->doUpgrade(); //////////////////////////////////////////////////////////////////////////////// // solve selection... { cout << "Solving dependencies..." << endl; unsigned attempt = 0; while ( ! zypp->resolver()->resolvePool() ) { ++attempt; cout << "Solving dependencies: " << attempt << ". attempt failed" << endl; const ResolverProblemList & problems( zypp->resolver()->problems() ); cout << problems.size() << " problems found..." << endl; // Problem: // ============================== // kdepim3-3.5.10-29.1.4.x86_64 requires libsasl2.so.2()(64bit), but this requirement // cannot be provided deleted providers: cyrus-sasl-2.1.25-28.1.2.x86_64 // ------------------------------ // Solution: // keep obsolete cyrus-sasl-2.1.25-28.1.2.x86_64 // Solution: // remove lock to allow removal of kdepim3-3.5.10-29.1.4.x86_64 // Solution: // remove lock to allow removal of kdepim3-3.5.10-29.1.4.x86_64 // Solution: // break kdepim3-3.5.10-29.1.4.x86_64 by ignoring some of its dependencies ProblemSolutionList totry; // only needed if you (interactively) resolve problems... unsigned probNo = 0; for ( const auto & probPtr : problems ) { cout << "Problem " << ++probNo << ": " << probPtr->description() << endl; const ProblemSolutionList & solutions = probPtr->solutions(); unsigned solNo = 0; for ( const auto & solPtr : solutions ) { cout << " Solution " << ++solNo << ": " << solPtr->description() << endl; } // if you (interactively) resolve problems pick 1 solution per problem // and store it int the totry list. After having applied the selected // start a new attempt. // // It's not necessary to process all problems. You can pick a solution // for the first problem and retry immediately. Often one solution actually // resolves more than one reported problem. // // totry.push_back( solPtr ); } if ( ! totry.empty() ) { cout << "Apply selected solutions..." << endl; zypp->resolver()->applySolutions( totry ); cout << "Solving dependencies..." << endl; continue; } // otherwise give up throw "Solving dependencies failed: Giving up!"; } cout << "Dependencies solved" << endl; } //////////////////////////////////////////////////////////////////////////////// // printing some stats... if ( false ) { cout << "PoolItem summary (individual packages):" << endl; for ( const PoolItem & pi : zypp->pool() ) { if ( pi.status().transacts() ) cout << " " << pi << endl; } } else { cout << "Selectable summary (grouped by name):" << endl; for ( const ui::Selectable_Ptr & sel : zypp->pool().proxy() ) { if ( sel->toModify() ) cout << " " << sel << endl; } } //////////////////////////////////////////////////////////////////////////////// // finally commit.. { cout << "Going to commit..." << endl; // dryRun and DownloadOnly will cause commit to skip // transaction steps, so you want to check for 'noError' // rather than 'allDone'. bool dryRunEtc = false; ZYppCommitPolicy policy; if ( true ) { policy.dryRun( true ); dryRunEtc = true; } if ( true ) { policy.downloadMode( DownloadOnly ); dryRunEtc = true; } try { ZYppCommitResult result = zypp->commit( policy ); // go.... if ( ! ( result.allDone() || ( dryRunEtc && result.noError() ) ) ) { throw "Incomplete commit!"; // ZYppCommitResult offers access to the TransactionStepList // where you can see which packages have been processed and // which not. } cout << "Commit succeeded" << endl; } catch ( const Exception & exp ) { cout << "Commit aborted with exception:" << endl; throw; } } cout << "[bye]: " << endl; return 0; } catch ( const Exception & exp ) { cerr << exp << endl << exp.historyAsString(); exit( 91 ); } catch ( const std::exception & exp ) { cerr << exp.what() << endl; exit( 92 ); } catch ( const char * exp ) { cerr << (exp?exp:"Oops!") << endl; exit( 93 ); } catch (...) { cerr << "Oops!" << endl; exit( 94 ); } libzypp-17.36.5/tools/zypp-list.cc000066400000000000000000000107721476576476200170470ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST #include #include static std::string appname( "zypp-list" ); #define message cerr #define OUT cout using std::flush; int errexit( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } return exit_r; } int usage( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } cerr << "Usage: " << appname << " [GLOBALOPTS] COMMAND" << endl; cerr << "List pool items according to command." << endl; cerr << endl; cerr << "GLOBALOPTS:" << endl; cerr << " --root Load repos from the system located below ROOTDIR. If ROOTDIR" << endl; cerr << " denotes a sover testcase, the testcase is loaded." << endl; cerr << " -i, --installed Process installed packages only." << endl; cerr << endl; cerr << "COMMANDS:" << endl; cerr << " locks: List all locked pool items." << endl; cerr << " ." << endl; cerr << endl; return exit_r; } void startup( const Pathname & sysRoot = "/", bool onlyInstalled = false ) { ZConfig::instance(); sat::Pool satpool( sat::Pool::instance() ); if ( TestSetup::isTestcase( sysRoot ) ) { message << str::form( "*** Load Testcase from '%s'", sysRoot.c_str() ) << endl; TestSetup test; test.loadTestcaseRepos( sysRoot ); dumpRange( message, satpool.reposBegin(), satpool.reposEnd() ) << endl; } else if ( TestSetup::isTestSetup( sysRoot ) ) { message << str::form( "*** Load TestSetup from '%s'", sysRoot.c_str() ) << endl; TestSetup test( sysRoot, Arch_x86_64 ); test.loadRepos(); dumpRange( message, satpool.reposBegin(), satpool.reposEnd() ) << endl; } else { // a system message << str::form( "*** Load system at '%s'", sysRoot.c_str() ) << endl; if ( true ) { message << "*** load target '" << Repository::systemRepoAlias() << "'\t"; getZYpp()->initializeTarget( sysRoot ); getZYpp()->target()->load(); message << satpool.systemRepo() << endl; } if ( !onlyInstalled ) { RepoManager repoManager( sysRoot ); RepoInfoList repos = repoManager.knownRepositories(); for_( it, repos.begin(), repos.end() ) { RepoInfo & nrepo( *it ); if ( ! nrepo.enabled() ) continue; if ( ! repoManager.isCached( nrepo ) ) { message << str::form( "*** omit uncached repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } message << str::form( "*** load repo '%s'\t", nrepo.name().c_str() ) << flush; try { repoManager.loadFromCache( nrepo ); message << satpool.reposFind( nrepo.alias() ) << endl; } catch ( const Exception & exp ) { message << exp.asString() + "\n" + exp.historyAsString() << endl; message << str::form( "*** omit broken repo '%s' (do 'zypper refresh')", nrepo.name().c_str() ) << endl; continue; } } } } } /****************************************************************** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int */ int main( int argc, char * argv[] ) { INT << "===[START]==========================================" << endl; appname = Pathname::basename( argv[0] ); --argc,++argv; if ( ! argc ) { return usage(); } /////////////////////////////////////////////////////////////////// Pathname sysRoot( "/" ); if ( argc && (*argv) == std::string("--root") ) { --argc,++argv; if ( ! argc ) return errexit("--root requires an argument."); if ( ! PathInfo( *argv ).isDir() ) return errexit("--root requires a directory."); sysRoot = *argv; --argc,++argv; } bool onlyInstalled( false ); if ( argc && (*argv) == std::string("--installed") ) { --argc,++argv; onlyInstalled = true; } /////////////////////////////////////////////////////////////////// if ( ! argc ) { return usage(); } startup( sysRoot, onlyInstalled ); ResPool pool( ResPool::instance() ); if ( argc && (*argv) == std::string("locked") ) { OUT << "*** Locked:" << endl; for_( it, pool.begin(), pool.end() ) { if ( (*it).status().isLocked() ) OUT << *it << endl; } } INT << "===[END]============================================" << endl << endl; return 0; } libzypp-17.36.5/tools/zypp-media-chksum/000077500000000000000000000000001476576476200201255ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-chksum/CMakeLists.txt000066400000000000000000000020041476576476200226610ustar00rootroot00000000000000PROJECT( zypp-media-chksum C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-chksum/main.cc000066400000000000000000000112151476576476200213600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include #include #include class ChksumProvider : public zyppng::worker::ProvideWorker { public: ChksumProvider( std::string_view workerName ) : ProvideWorker( workerName ) { } void immediateShutdown() override { } protected: // ProvideWorker interface zyppng::expected initialize(const zyppng::worker::Configuration &conf) override { zyppng::worker::WorkerCaps caps; caps.set_worker_type ( zyppng::worker::WorkerCaps::CPUBound ); caps.set_cfg_flags( zyppng::worker::WorkerCaps::Flags ( zyppng::worker::WorkerCaps::Pipeline | zyppng::worker::WorkerCaps::ZyppLogFormat ) ); return zyppng::expected::success(caps); } void provide() override { auto &queue = requestQueue(); if ( !queue.size() ) return; auto req = queue.front(); queue.pop_front(); // here we only receive request codes, we only support Provide messages, all others are rejected // Cancel is never to be received here if ( req->_spec.code() != zyppng::ProvideMessage::Code::Prov ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , "Request type not implemented" , false , {} ); return; } zypp::Url url; const auto &urlVal = req->_spec.value( zyppng::ProvideMsgFields::Url ); try { url = zypp::Url( urlVal.asString() ); } catch ( const zypp::Exception &excp ) { ZYPP_CAUGHT(excp); std::string err = zypp::str::Str() << "Invalid URL in request: " << urlVal.asString(); ERR << err << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , err , false , {} ); return; } std::string chksumType; try { chksumType = req->_spec.value( std::string_view("chksumType") ).asString(); } catch ( const zypp::Exception &excp ) { ZYPP_CAUGHT(excp); std::string err = zypp::str::Str() << "No or invalid chksumType in request"; ERR << err << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , err , false , {} ); return; } zypp::Pathname file = url.getPathName(); if ( ! zypp::PathInfo( file ).isFile() ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotFound , zypp::str::Str() << "File " << file << " not found." , false , {} ); return; } std::string filesum = zypp::filesystem::checksum( file, chksumType ); DBG << "Calculated checksum for : " << file << " with type: " << chksumType << " is " << filesum << std::endl; provideSuccess( req->_spec.requestId(), false, file, {{chksumType, {filesum}}} ); } void cancel(const std::deque::iterator &i ) override { ERR << "Bug, cancel should never be called for running items" << std::endl; } }; int main( int argc, char *argv[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto provider = std::make_shared("zypp-media-chksum"); auto res = provider->run (STDIN_FILENO, STDOUT_FILENO); provider->immediateShutdown(); if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-copy/000077500000000000000000000000001476576476200176055ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-copy/CMakeLists.txt000066400000000000000000000020021476576476200223370ustar00rootroot00000000000000PROJECT( zypp-media-copy C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-copy/main.cc000066400000000000000000000117151476576476200210450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include #include class CopyProvider : public zyppng::worker::ProvideWorker { public: CopyProvider( std::string_view workerName ) : ProvideWorker( workerName ) { } void immediateShutdown() override { } protected: // ProvideWorker interface zyppng::expected initialize(const zyppng::worker::Configuration &conf) override { zyppng::worker::WorkerCaps caps; caps.set_worker_type ( zyppng::worker::WorkerCaps::CPUBound ); caps.set_cfg_flags( zyppng::worker::WorkerCaps::Flags ( zyppng::worker::WorkerCaps::Pipeline | zyppng::worker::WorkerCaps::ZyppLogFormat | zyppng::worker::WorkerCaps::FileArtifacts ) ); return zyppng::expected::success(caps); } void provide() override { auto &queue = requestQueue(); if ( !queue.size() ) return; auto req = queue.front(); queue.pop_front(); // here we only receive request codes, we only support Provide messages, all others are rejected // Cancel is never to be received here if ( req->_spec.code() != zyppng::ProvideMessage::Code::Prov ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , "Request type not implemented" , false , {} ); return; } zypp::Url url; const auto &urlVal = req->_spec.value( zyppng::ProvideMsgFields::Url ); try { url = zypp::Url( urlVal.asString() ); } catch ( const zypp::Exception &excp ) { ZYPP_CAUGHT(excp); std::string err = zypp::str::Str() << "Invalid URL in request: " << urlVal.asString(); ERR << err << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , err , false , {} ); return; } auto targetFileName = req->_spec.value( zyppng::ProvideMsgFields::Filename ); if ( !targetFileName.valid() ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , "Copy worker requires a target filename hint" , false , {} ); return; } zypp::Pathname targetFilePath( targetFileName.asString() ); zypp::PathInfo pi( url.getPathName() ); if ( !pi.isExist() ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotFound , zypp::str::Str() << "File " << pi.path() << " not found." , false , {} ); return; } if ( !pi.isFile() ) { provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotAFile , zypp::str::Str() << "Path " << pi.path() << " exists, but its not a file" , false , {} ); return; } auto res = zypp::filesystem::hardlinkCopy( pi.path(), targetFileName.asString() ); if ( res == 0 ) { provideSuccess( req->_spec.requestId(), false, targetFilePath ); } else { provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , zypp::str::Str() << "Failed to create file " << targetFilePath , false , {} ); } } void cancel(const std::deque::iterator &i ) override { ERR << "Bug, cancel should never be called for running items" << std::endl; } }; int main( int argc, char *argv[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto provider = std::make_shared("zypp-media-copy"); auto res = provider->run (STDIN_FILENO, STDOUT_FILENO); provider->immediateShutdown(); if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-dir/000077500000000000000000000000001476576476200174115ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-dir/CMakeLists.txt000066400000000000000000000020421476576476200221470ustar00rootroot00000000000000PROJECT( zypp-media-dir C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc dirprovider.cc dirprovider.h ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-dir/dirprovider.cc000066400000000000000000000117211476576476200222530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "dirprovider.h" #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "DirProvider" DirProvider::DirProvider() : DeviceDriver( zyppng::worker::WorkerCaps::SimpleMount ) { } DirProvider::~DirProvider() { } zyppng::worker::AttachResult DirProvider::mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) { try { if ( !attachUrl.getHost().empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Host must be empty in dir:// and file:// URLs" , false ); } // set up the verifier zyppng::MediaDataVerifierRef verifier; if ( extras.contains(zyppng::AttachMsgFields::VerifyType) ) { verifier = zyppng::MediaDataVerifier::createVerifier( extras[zyppng::AttachMsgFields::VerifyType].asString() ); if ( !verifier ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Invalid verifier type" , false ); } if ( !verifier->load( extras[zyppng::AttachMsgFields::VerifyData].asString() ) ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create verifier from file" , false ); } } const auto &devs = knownDevices(); // we simulate a device by simply using the pathname zypp::Pathname path = zypp::Pathname( attachUrl.getPathName() ).realpath(); const auto &pathStr = path.asString(); zypp::PathInfo adir( path ); if( !adir.isDir()) { // URl did not point to a directory return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , zypp::str::Str()<< "Specified path '" << attachUrl << "' is not a directory" , false ); } // lets check if the path is what we want auto res = isDesiredMedium( attachUrl, path, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !res ) { try { std::rethrow_exception( res.error() ); } catch( const zypp::Exception& e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , false , e ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , "Checking the medium failed with an uknown error" , false ); } } // first check if we have that device already auto i = std::find_if( devs.begin(), devs.end(), [&]( const auto &d ) { return d->_name == pathStr; } ); if ( i != devs.end() ) { attachedMedia().insert( { attachId, zyppng::worker::AttachedMedia{ ._dev = *i, ._attachRoot = "/" } } ); return zyppng::worker::AttachResult::success( (*i)->_mountPoint ); } // we did not find a existing device, well lets make a new one MIL << "New device " << path << " mounted on " << path << std::endl; auto newDev = std::make_shared( zyppng::worker::Device{ ._name = pathStr, ._maj_nr = 0, ._min_nr = 0, ._mountPoint = path, ._ephemeral = true, // device should be removed after the last attachment was released ._properties = {} }); attachedMedia().insert( { attachId, zyppng::worker::AttachedMedia{ ._dev = newDev, ._attachRoot = "/" } } ); return zyppng::worker::AttachResult::success( path ); } catch ( const zypp::Exception &e ) { return zyppng::worker::AttachResult::error ( zyppng::ProvideMessage::Code::BadRequest , false , e ); } catch ( const std::exception &e ) { return zyppng::worker::AttachResult::error ( zyppng::ProvideMessage::Code::BadRequest , e.what() , false ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , "Unknown exception" , false); } } void DirProvider::unmountDevice ( zyppng::worker::Device &dev ) { // do nothing , this is just a local dir } libzypp-17.36.5/tools/zypp-media-dir/dirprovider.h000066400000000000000000000021371476576476200221160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_DIRPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_DIRPROVIDER_H_INCLUDED #include class DirProvider : public zyppng::worker::DeviceDriver { public: DirProvider( ); ~DirProvider(); zyppng::worker::AttachResult mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) override; protected: void unmountDevice ( zyppng::worker::Device &dev ) override; }; #endif libzypp-17.36.5/tools/zypp-media-dir/main.cc000066400000000000000000000013561476576476200206510ustar00rootroot00000000000000#include "dirprovider.h" #include #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto driver = std::make_shared(); auto provider = std::make_shared( "zypp-media-dir", driver ); driver->setProvider( provider ); auto res = provider->run (STDIN_FILENO, STDOUT_FILENO); MIL << "DIR Worker shutting down" << std::endl; provider->immediateShutdown(); if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-disc/000077500000000000000000000000001476576476200175555ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-disc/CMakeLists.txt000066400000000000000000000024501476576476200223160ustar00rootroot00000000000000PROJECT( zypp-media-disc C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc discprovider.cc discprovider.h ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) IF ( UDEV_FOUND ) TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${UDEV_LIBRARY} ) ELSE ( UDEV_FOUND ) IF ( HAL_FOUND ) TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${HAL_LIBRARY} ${HAL_STORAGE_LIBRARY} ${DBUS_LIBRARY} ) ENDIF ( HAL_FOUND ) ENDIF ( UDEV_FOUND ) libzypp-17.36.5/tools/zypp-media-disc/discprovider.cc000066400000000000000000000342271476576476200225710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "discprovider.h" #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "DiscProvider" extern "C" { #include #include #if HAVE_UDEV #include #endif } using namespace std::literals; DiscProvider::DiscProvider( ) : zyppng::worker::DeviceDriver( zyppng::worker::WorkerCaps::VolatileMount ) { } DiscProvider::~DiscProvider() {} zyppng::worker::AttachResult DiscProvider::mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) { std::vector devs; if ( extras.contains( zyppng::AttachMsgFields::Device ) ) { for ( const auto &d :extras.values( zyppng::AttachMsgFields::Device ) ) { if ( d.isString() ) { MIL << "Got device from user we are allowed to use: " << d.asString() << std::endl; devs.push_back(d.asString()); } } } auto &sysDevs = knownDevices(); std::vector> possibleDevs; if ( devs.size () ) { for ( const auto &d : devs ) { zypp::PathInfo p(d); if ( !p.isBlk () ) continue; std::shared_ptr device; auto i = std::find_if( sysDevs.begin(), sysDevs.end(), [&p]( const auto &sysDev ){ return ( sysDev->_maj_nr == p.devMajor() && sysDev->_min_nr == p.devMinor() ); } ); if ( i == sysDevs.end() ) { // this is a device we did not detect before lets see if its a CDROM #ifdef HAVE_UDEV zypp::AutoDispose udev( ::udev_new(), ::udev_unref ); if ( !udev ) { ERR << "Can't create udev context." << std::endl; continue; } auto devnum = makedev( p.devMajor(), p.devMinor() ); zypp::AutoDispose udevDevice( ::udev_device_new_from_devnum ( udev, 'b', devnum ), ::udev_device_unref ); if ( !udevDevice ) { ERR << "Can't create udev device from devnum, ignoring." << std::endl; continue; } if ( zypp::strv::asStringView( ::udev_device_get_property_value( udevDevice, "ID_CDROM" ) ) != "1" ) { ERR << "Device " << d << " from Attach request is not a CDROM/DVD ignoring!" << std::endl; continue; } auto dev = std::make_shared( zyppng::worker::Device { ._name = p.path().asString(), ._maj_nr = p.devMajor(), ._min_nr = p.devMinor() } ); DBG << "Registering device (REQUEST): " << dev->_name << " " << dev->_maj_nr << ":" << dev->_min_nr << std::endl; sysDevs.push_back ( dev ); device = dev; #endif } else { device = *i; } if ( device ) possibleDevs.push_back(device); } } else { possibleDevs = sysDevs; } // if we have no devices at this point controller gets a error if ( possibleDevs.empty () ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "No useable device found" , false ); } const auto attachRoot = zypp::Pathname( attachUrl.getPathName() ); const auto attachMediaNr = extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt(); // set up the verifier zyppng::MediaDataVerifierRef verifier; if ( extras.contains( zyppng::AttachMsgFields::VerifyType ) ) { verifier = zyppng::MediaDataVerifier::createVerifier( extras.value(zyppng::AttachMsgFields::VerifyType).asString() ); if ( !verifier ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Invalid verifier type" , false ); } if ( !verifier->load( extras.value(zyppng::AttachMsgFields::VerifyData).asString() ) ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create verifier from file" , false ); } } //first check if any of the mounted devices are what we want for( const auto &dev : possibleDevs ) { if ( dev->_mountPoint.empty() ) continue; auto res = isDesiredMedium( attachUrl, dev->_mountPoint / attachRoot, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !res ) continue; MIL << "Found requested medium in dev " << dev->_name << std::endl; // we found the device we want! attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ dev, attachRoot } ) ); return zyppng::worker::AttachResult::success( dev->_mountPoint / attachRoot ); } std::list filesystems; filesystems.push_back("iso9660"); // if DVD, try UDF filesystem after iso9660 if ( attachUrl.getScheme() == "dvd" ) filesystems.push_back("udf"); std::string options; auto optVal = extras.value( "mountoptions"sv ); if ( optVal.valid() && optVal.isString() ) options = optVal.asString(); if ( options.empty() ) { options="ro"; } while ( true ) { // remember how many devices we were able to test uint devicesTested = 0; // none of the already mounted devices matched, lets try what we have left for( const auto &dev : possibleDevs ) { if ( !dev->_mountPoint.empty() ) continue; MIL << "Trying to mount dev " << dev->_name << std::endl; // make sure the tray is closed zypp::media::CDTools::closeTray( dev->_name ); devicesTested++; zypp::media::Mount mount; bool mountsucceeded = false; std::exception_ptr lastErr; for( auto fsit = filesystems.begin() ; !mountsucceeded && fsit != filesystems.end() ; ++fsit) { zypp::Pathname newAp; try { newAp = createAttachPoint( this->attachRoot() ); if ( newAp.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create mount directory." , false ); } mount.mount( dev->_name, newAp.asString(), *fsit, options); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 2; while( !(mountsucceeded=checkAttached( newAp, devicePredicate( dev->_maj_nr, dev->_min_nr ))) && --limit) { WAR << "Wait for /proc/mounts update and retry...." << std::endl; sleep(1); } if( !mountsucceeded) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaMountException( "Unable to verify that the media was mounted", dev->_name, newAp.asString() )); } else { dev->_mountPoint = newAp; break; } } catch (const zypp::media::MediaMountException &e) { lastErr = std::current_exception (); removeAttachPoint(newAp); ZYPP_CAUGHT(e); } catch (const zypp::media::MediaException & excpt_r) { removeAttachPoint(newAp); ZYPP_CAUGHT(excpt_r); } } // for filesystems if ( mountsucceeded ) { auto res = isDesiredMedium( attachUrl, dev->_mountPoint / attachRoot, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !res ) { unmountDevice( *dev ); continue; } MIL << "Found requested medium in dev " << dev->_name << std::endl; attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ dev, attachRoot } ) ); return zyppng::worker::AttachResult::success( dev->_mountPoint / attachRoot ); } } // for each device // we did go through all devices, but didn't find any. if ( devicesTested == 0 ) { // no devices are free return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::Jammed , "No free ressources available" , false ); } else { const auto &mountedDevs = zypp::media::Mount::getEntries(); // k, we need to ask the user to give us the medium we need // first find the devices that are free std::vector freeDevs; for( const auto &dev : possibleDevs ) { if ( !dev->_mountPoint.empty() ) continue; auto i = std::find_if( mountedDevs.begin (), mountedDevs.end(), [&dev]( const zypp::media::MountEntry &e ) { zypp::PathInfo pi( e.src ); return ( pi.isBlk() && pi.devMajor() == dev->_maj_nr && pi.devMinor() == dev->_min_nr ); }); if ( i == mountedDevs.end() ) { MIL << "Adding " << dev->_name << " to list of free devs" << std::endl; freeDevs.push_back( dev->_name ); } } // if there are no devices free, we are jammed if ( freeDevs.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::Jammed , "No free ressources available" , false ); } auto changeRes = zyppng::worker::ProvideWorker::ABORT; auto worker = parentWorker(); if ( worker ) { changeRes = worker->requestMediaChange ( id, label, attachMediaNr, freeDevs ); } if ( changeRes != zyppng::worker::ProvideWorker::SUCCESS ) { if ( changeRes == zyppng::worker::ProvideWorker::SKIP) return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediaChangeSkip , "User asked to skip the media change." , false); else return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediaChangeAbort , "User asked to abort the media change." , false ); } } } } void DiscProvider::detectDevices( ) { // helper lambda to add a new device to the internal registry, returning it if its either created or already known const auto registerDevice = [ this ]( const zypp::PathInfo &devnode, std::string_view reason ) { auto &sysDevs = knownDevices(); if ( devnode.isBlk() ) { auto i = std::find_if( sysDevs.begin(), sysDevs.end(), [&]( const auto &dev ){ return ( dev->_maj_nr == devnode.devMajor() && dev->_min_nr == devnode.devMinor () ); }); // we already know the device if ( i != sysDevs.end() ) return i; auto dev = std::make_shared( zyppng::worker::Device{ ._name = devnode.path().asString(), ._maj_nr = devnode.devMajor(), ._min_nr = devnode.devMinor() } ); DBG << "Found (" << reason << "): " << dev->_name << " " << dev->_maj_nr << ":" << dev->_min_nr << std::endl; sysDevs.push_back(dev); return ( --sysDevs.end() ); } return sysDevs.end(); }; auto &sysDevs = knownDevices(); // detect devices available in the system if we did not do it before: if ( !_devicesDetected ) { _devicesDetected = true; #ifdef HAVE_UDEV // http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/index.html zypp::AutoDispose udev( ::udev_new(), ::udev_unref ); if ( ! udev ) { ERR << "Can't create udev context." << std::endl; } else { zypp::AutoDispose enumerate( ::udev_enumerate_new(udev), ::udev_enumerate_unref ); if ( ! enumerate ) { ERR << "Can't create udev list entry." << std::endl; } else { ::udev_enumerate_add_match_subsystem( enumerate, "block" ); ::udev_enumerate_add_match_property( enumerate, "ID_CDROM", "1" ); ::udev_enumerate_scan_devices( enumerate ); struct udev_list_entry * entry = 0; udev_list_entry_foreach( entry, ::udev_enumerate_get_list_entry( enumerate ) ) { zypp::AutoDispose device( ::udev_device_new_from_syspath( ::udev_enumerate_get_udev( enumerate ), ::udev_list_entry_get_name( entry ) ), ::udev_device_unref ); if ( ! device ) { ERR << "Can't create udev device." << std::endl; continue; } const char * devnodePtr( ::udev_device_get_devnode( device ) ); if ( ! devnodePtr ) { ERR << "Got NULL devicenode." << std::endl; continue; } // In case we need it someday: //const char * mountpath = ::udev_device_get_property_value( device, "FSTAB_DIR" ); auto dev = registerDevice( zypp::PathInfo ( devnodePtr ), "udev" ); if ( dev != sysDevs.end() ) { if ( ::udev_device_get_property_value( device, "ID_CDROM_DVD" ) ) { (*dev)->_properties["DVD"] = true; } else { (*dev)->_properties["DVD"] = false; } } } } } #endif if ( sysDevs.empty() ) { WAR << "CD/DVD drive detection with UDEV failed! Guessing..." << std::endl; auto dev = registerDevice( zypp::PathInfo ( "/dev/dvd" ), "GUESS" ); if ( dev != sysDevs.end() && (*dev)->_properties.count("DVD") == 0 ) (*dev)->_properties["DVD"] = true; dev = registerDevice( zypp::PathInfo ( "/dev/cdrom" ), "GUESS" ); if ( dev != sysDevs.end() && (*dev)->_properties.count("DVD") == 0 ) (*dev)->_properties["DVD"] = false; } } } libzypp-17.36.5/tools/zypp-media-disc/discprovider.h000066400000000000000000000024441476576476200224270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_DISCPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_DISCPROVIDER_H_INCLUDED #include #include #include #include class DiscProvider : public zyppng::worker::DeviceDriver { public: DiscProvider(); ~DiscProvider(); // DeviceDriver interface zyppng::worker::AttachResult mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) override; void detectDevices() override; private: bool _devicesDetected = false; //< We delay device detection to the first attach request, to avoid doing it without needing it }; #endif libzypp-17.36.5/tools/zypp-media-disc/main.cc000066400000000000000000000012751476576476200210150ustar00rootroot00000000000000 #include "discprovider.h" #include #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto driver = std::make_shared(); auto provider = std::make_shared( "zypp-media-disc", driver ); driver->setProvider( provider ); auto res = provider->run (STDIN_FILENO, STDOUT_FILENO); provider->immediateShutdown(); if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-disk/000077500000000000000000000000001476576476200175655ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-disk/CMakeLists.txt000066400000000000000000000020451476576476200223260ustar00rootroot00000000000000PROJECT( zypp-media-disk C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc diskprovider.cc diskprovider.h ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-disk/diskprovider.cc000066400000000000000000000300651476576476200226050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "diskprovider.h" #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "DiskProvider" /*! * Check if specified device file name is * a disk volume device or throw an error. */ bool verifyIfDiskVolume( const zypp::Pathname &dev_name ) { if( dev_name.empty() || dev_name.asString().compare(0, sizeof("/dev/")-1, "/dev/")) { ERR << "Specified device name " << dev_name << " is not allowed" << std::endl; return false; } zypp::PathInfo dev_info(dev_name); if( !dev_info.isBlk()) { ERR << "Specified device name " << dev_name << " is not a block device" << std::endl; return false; } // check if a volume using /dev/disk/by-uuid links first { zypp::Pathname dpath("/dev/disk/by-uuid"); std::list dlist; if( zypp::filesystem::readdir(dlist, dpath) == 0) { std::list::const_iterator it; for(it = dlist.begin(); it != dlist.end(); ++it) { zypp::PathInfo vol_info(*it); if( vol_info.isBlk() && vol_info.devMajor() == dev_info.devMajor() && vol_info.devMinor() == dev_info.devMinor()) { DBG << "Specified device name " << dev_name << " is a volume (disk/by-uuid link " << vol_info.path() << ")" << std::endl; return true; } } } } // check if a volume using /dev/disk/by-label links // (e.g. vbd mapped volumes in a XEN vm) { zypp::Pathname dpath("/dev/disk/by-label"); std::list dlist; if( zypp::filesystem::readdir(dlist, dpath) == 0) { std::list::const_iterator it; for(it = dlist.begin(); it != dlist.end(); ++it) { zypp::PathInfo vol_info(*it); if( vol_info.isBlk() && vol_info.devMajor() == dev_info.devMajor() && vol_info.devMinor() == dev_info.devMinor()) { DBG << "Specified device name " << dev_name << " is a volume (disk/by-label link " << vol_info.path() << ")" << std::endl; return true; } } } } // check if a filesystem volume using the 'blkid' tool // (there is no /dev/disk link for some of them) zypp::ExternalProgram::Arguments args; args.push_back( "blkid" ); args.push_back( "-p" ); args.push_back( dev_name.asString() ); zypp::ExternalProgram cmd( args, zypp::ExternalProgram::Stderr_To_Stdout ); cmd >> DBG; if ( cmd.close() != 0 ) { ERR << cmd.execError() << "\nSpecified device name " << dev_name << " is not a usable disk volume" << std::endl; return false; } return true; } DiskProvider::DiskProvider() : DeviceDriver( zyppng::worker::WorkerCaps::SimpleMount ) { } DiskProvider::~DiskProvider() { } zyppng::worker::AttachResult DiskProvider::mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) { try { if ( !attachUrl.getHost().empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Host must be empty in dir:// and file:// URLs" , false ); } const std::string device = zypp::Pathname(attachUrl.getQueryParam("device")).asString(); if ( device.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Media url does not contain a device specification" , false ); } std::string filesystem = attachUrl.getQueryParam("filesystem"); if( filesystem.empty() ) filesystem="auto"; zypp::PathInfo dev_info( device ); if(!dev_info.isBlk()) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Media url does not specify a valid block device" , false ); } DBG << "Verifying " << device << " ..." << std::endl; if( !verifyIfDiskVolume( device)) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Could not verify URL points to a disk volume!" , false ); } // disks can have a attach root ( path relative to the device root ) const auto relAttachRoot = zypp::Pathname( attachUrl.getPathName() ); // set up the verifier zyppng::MediaDataVerifierRef verifier; if ( extras.value( zyppng::AttachMsgFields::VerifyType ).valid() ) { verifier = zyppng::MediaDataVerifier::createVerifier( extras.value(zyppng::AttachMsgFields::VerifyType).asString() ); if ( !verifier ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Invalid verifier type" , false ); } if ( !verifier->load( extras.value(zyppng::AttachMsgFields::VerifyData).asString() ) ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create verifier from file" , false ); } } const auto &devs = knownDevices(); // first check if we have that device already auto i = std::find_if( devs.begin(), devs.end(), [&]( const auto &d ) { return d->_maj_nr == dev_info.devMajor() && d->_min_nr == dev_info.devMinor(); }); if ( i != devs.end() ) { auto res = isDesiredMedium( attachUrl, (*i)->_mountPoint / relAttachRoot, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !res ) { try { std::rethrow_exception( res.error() ); } catch( const zypp::Exception& e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , false , e ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , "Checking the medium failed with an uknown error" , false ); } } else { attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ *i, relAttachRoot } ) ); return zyppng::worker::AttachResult::success( (*i)->_mountPoint / relAttachRoot ); } } // we did not find a existing mount, well lets make a new one ... std::optional bindSource; auto devPtr = std::make_shared( zyppng::worker::Device{ ._name = dev_info.path().asString(), ._maj_nr = dev_info.devMajor(), ._min_nr = dev_info.devMinor(), ._mountPoint = {}, ._ephemeral = true, // forget about the device after we are finished with it ._properties = {} }); // since the kernel will not let us remount a disc ro if it was already mounted in the system as rw we need to // go over the existing mounts and revert to a bind mount if we find that the device has a mountpoint already (#163486). zypp::media::MountEntries entries( zypp::media::Mount::getEntries() ); for( auto e = entries.cbegin(); e != entries.cend(); ++e) { bool is_device = false; std::string dev_path(zypp::Pathname(e->src).asString()); zypp::PathInfo dev_info; if( dev_path.compare(0, sizeof("/dev/")-1, "/dev/") == 0 && dev_info(e->src) && dev_info.isBlk()) { is_device = true; } if( is_device && devPtr->_maj_nr == dev_info.devMajor() && devPtr->_min_nr == dev_info.devMinor()) { DBG << "Device " << devPtr->_name << " is already mounted, using bind mount!" << std::endl; bindSource = e->dir; break; } } zypp::media::Mount mount; zypp::Pathname newAp; try { newAp = createAttachPoint( attachRoot() ); if ( newAp.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create mount directory." , false ); } std::string options = attachUrl.getQueryParam("mountoptions"); if(options.empty()) { options = "ro"; } if( bindSource ) { options += ",bind"; mount.mount( bindSource->asString(), newAp.asString(), "none", options); } else { mount.mount( dev_info.path().asString(), newAp.asString(), filesystem, options); } // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; const auto &checkAttachedDisk = [&]( const zypp::media::MountEntry &e ) { if ( bindSource) { if ( *bindSource == e.src ) { DBG << "Found bound media " << devPtr->_name << " in the mount table as " << e.src << std::endl; return true; } } return DeviceDriver::devicePredicate( devPtr->_maj_nr, devPtr->_min_nr ) ( e ); }; // mount command came back OK, lets wait for mtab to update while( !(mountsucceeded=checkAttached( newAp, checkAttachedDisk )) && --limit) { MIL << "Mount did not appear yet, sleeping for 1s" << std::endl; sleep(1); } // mount didn't work after all, bail out if ( !mountsucceeded ) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaMountException( "Unable to verify that the media was mounted", devPtr->_name, newAp.asString() )); } // if we reach this place, mount worked -> YAY, lets see if that is the desired medium! auto isDesired = isDesiredMedium( attachUrl, newAp / relAttachRoot, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !isDesired ) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaNotDesiredException( attachUrl ) ); } } catch ( const zypp::Exception &e ) { removeAttachPoint(newAp); ZYPP_CAUGHT(e); return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , false , e ); } catch ( ... ) { removeAttachPoint(newAp); ZYPP_RETHROW( std::current_exception() ); } // mount worked ! YAY devPtr->_mountPoint = newAp; knownDevices().push_back( devPtr ); attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ devPtr, relAttachRoot } ) ); return zyppng::worker::AttachResult::success( devPtr->_mountPoint / relAttachRoot ); } catch ( const zypp::Exception &e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , false , e ); } catch ( const std::exception &e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , e.what() , false ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , "Unknown exception" , false ); } } libzypp-17.36.5/tools/zypp-media-disk/diskprovider.h000066400000000000000000000020621476576476200224430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_DISKPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_DISKPROVIDER_H_INCLUDED #include class DiskProvider : public zyppng::worker::DeviceDriver { public: DiskProvider(); ~DiskProvider(); // DeviceDriver interface zyppng::worker::AttachResult mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) override; }; #endif libzypp-17.36.5/tools/zypp-media-disk/main.cc000066400000000000000000000013101476576476200210130ustar00rootroot00000000000000#include "diskprovider.h" #include #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto driver = std::make_shared(); auto worker = std::make_shared( "zypp-media-disk", driver ); driver->setProvider( worker ); auto res = worker->run (STDIN_FILENO, STDOUT_FILENO); MIL << "DISK Worker shutting down" << std::endl; if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-http/000077500000000000000000000000001476576476200176125ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-http/CMakeLists.txt000066400000000000000000000023451476576476200223560ustar00rootroot00000000000000PROJECT( zypp-media-http C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) INCLUDE_DIRECTORIES ( ${zypp-media-http_SOURCE_DIR} ) include(downloader/CMakeLists.txt) SET( SOURCES main.cc networkprovider.cc networkprovider.h ${downloader_HEADERS} ${downloader_SRCS} ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-curl ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-http/downloader/000077500000000000000000000000001476576476200217505ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-http/downloader/CMakeLists.txt000066400000000000000000000027151476576476200245150ustar00rootroot00000000000000SET( downloader_HEADERS downloader/private/downloader_p.h downloader/private/downloaderstates/base_p.h downloader/private/downloaderstates/basicdownloader_p.h downloader/private/downloaderstates/detectmeta_p.h downloader/private/downloaderstates/final_p.h downloader/private/downloaderstates/initial_p.h downloader/private/downloaderstates/metalinkinfo_p.h downloader/private/downloaderstates/metalink_p.h downloader/private/downloaderstates/mirrorhandling_p.h downloader/private/downloaderstates/normal_p.h downloader/private/downloaderstates/preparemulti_p.h downloader/private/downloaderstates/rangedownloader_p.h downloader/private/downloaderstates/zck_p.h downloader/private/mirrorcontrol_p.h downloader/downloader.h downloader/downloadspec.h ) SET( downloader_SRCS downloader/private/downloaderstates/basicdownloader_p.cc downloader/private/downloaderstates/detectmeta_p.cc downloader/private/downloaderstates/final_p.cc downloader/private/downloaderstates/initial_p.cc downloader/private/downloaderstates/metalinkinfo_p.cc downloader/private/downloaderstates/metalink_p.cc downloader/private/downloaderstates/mirrorhandling_p.cc downloader/private/downloaderstates/normal_p.cc downloader/private/downloaderstates/preparemulti_p.cc downloader/private/downloaderstates/rangedownloader_p.cc downloader/private/downloaderstates/zck_p.cc downloader/mirrorcontrol.cc downloader/downloader.cc downloader/downloadspec.cc ) libzypp-17.36.5/tools/zypp-media-http/downloader/downloader.cc000066400000000000000000000331041476576476200244160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #if ENABLE_ZCHUNK_COMPRESSION #include #endif namespace zyppng { DownloadPrivateBase::DownloadPrivateBase(Downloader &parent, std::shared_ptr requestDispatcher, std::shared_ptr mirrors, DownloadSpec &&spec, Download &p) : BasePrivate(p) , _requestDispatcher ( std::move(requestDispatcher) ) , _mirrorControl( std::move(mirrors) ) , _spec( std::move(spec) ) , _parent( &parent ) {} DownloadPrivateBase::~DownloadPrivateBase() { } bool DownloadPrivateBase::handleRequestAuthError( const std::shared_ptr& req, const zyppng::NetworkRequestError &err ) { //Handle the auth errors explicitly, we need to give the user a way to put in new credentials //if we get valid new credentials we can retry the request bool retry = false; if ( err.type() == NetworkRequestError::Unauthorized || err.type() == NetworkRequestError::AuthFailed ) { MIL << "Authentication failed for " << req->url() << " trying to recover." << std::endl; TransferSettings &ts = req->transferSettings(); const auto &applyCredToSettings = [&ts]( const AuthData_Ptr& auth, const std::string &authHint ) { ts.setUsername( auth->username() ); ts.setPassword( auth->password() ); auto nwCred = dynamic_cast( auth.get() ); if ( nwCred ) { // set available authentication types from the error if ( nwCred->authType() == CURLAUTH_NONE ) nwCred->setAuthType( authHint ); // set auth type (seems this must be set _after_ setting the userpwd) if ( nwCred->authType() != CURLAUTH_NONE ) { // FIXME: only overwrite if not empty? ts.setAuthType(nwCred->authTypeAsString()); } } }; // try to find one in the cache zypp::url::ViewOption vopt; vopt = vopt - zypp::url::ViewOption::WITH_USERNAME - zypp::url::ViewOption::WITH_PASSWORD - zypp::url::ViewOption::WITH_QUERY_STR; auto cachedCred = zypp::media::CredentialManager::findIn( _credCache, req->url(), vopt ); // only consider a cache entry if its newer than what we tried last time if ( cachedCred && cachedCred->lastDatabaseUpdate() > req->_authTimestamp ) { MIL << "Found a credential match in the cache!" << std::endl; applyCredToSettings( cachedCred, "" ); _lastTriedAuthTime = req->_authTimestamp = cachedCred->lastDatabaseUpdate(); retry = true; } else { NetworkAuthData_Ptr credFromUser = NetworkAuthData_Ptr( new NetworkAuthData() ); credFromUser->setUrl( req->url() ); credFromUser->setLastDatabaseUpdate ( req->_authTimestamp ); //in case we got a auth hint from the server the error object will contain it std::string authHint = err.extraInfoValue("authHint", std::string()); _sigAuthRequired.emit( *z_func(), *credFromUser, authHint ); if ( credFromUser->valid() ) { // remember for next time , we don't want to ask the user again for the same URL set _credCache.insert( credFromUser ); applyCredToSettings( credFromUser, authHint ); _lastTriedAuthTime = req->_authTimestamp = credFromUser->lastDatabaseUpdate(); retry = true; } } } return retry; } #if ENABLE_ZCHUNK_COMPRESSION bool DownloadPrivateBase::hasZckInfo() const { if ( zypp::indeterminate(_specHasZckInfo) ) _specHasZckInfo = ( _spec.headerSize() > 0 && ZckHelper::isZchunkFile( _spec.deltaFile() ) ); return bool(_specHasZckInfo); } #endif void DownloadPrivateBase::Request::disconnectSignals() { _sigStartedConn.disconnect(); _sigProgressConn.disconnect(); _sigFinishedConn.disconnect(); } DownloadPrivate::DownloadPrivate(Downloader &parent, std::shared_ptr requestDispatcher, std::shared_ptr mirrors, DownloadSpec &&spec, Download &p) : DownloadPrivateBase( parent, std::move(requestDispatcher), std::move(mirrors), std::move(spec), p ) { } void DownloadPrivate::init() { Base::connectFunc( *this, &DownloadStatemachine::sigFinished, [this](){ DownloadPrivateBase::_sigFinished.emit( *z_func() ); } ); Base::connectFunc( *this, &DownloadStatemachine::sigStateChanged, [this]( const auto state ){ DownloadPrivateBase::_sigStateChanged.emit( *z_func(), state ); } ); } void DownloadPrivate::start() { auto cState = currentState(); if ( !cState ) DownloadStatemachine::start(); cState = currentState(); if ( *cState != Download::InitialState && *cState != Download::Finished ) { // the state machine has advaned already, we can only restart it in a finished state return; } //reset state variables _specHasZckInfo = zypp::indeterminate; _emittedSigStart = false; _stoppedOnMetalink = false; _lastTriedAuthTime = 0; // restart the statemachine if ( cState == Download::Finished ) DownloadStatemachine::start(); //jumpstart the process state()->initiate(); } NetworkRequestError DownloadPrivateBase::safeFillSettingsFromURL( const Url &url, TransferSettings &set) { auto buildExtraInfo = [this, &url](){ std::map extraInfo; extraInfo.insert( {"requestUrl", url } ); extraInfo.insert( {"filepath", _spec.targetPath() } ); return extraInfo; }; NetworkRequestError res; try { ::internal::fillSettingsFromUrl( url, set ); if ( _spec.settings().proxy().empty() ) ::internal::fillSettingsSystemProxy( url, set ); #if 0 /* Fixes bsc#1174011 "auth=basic ignored in some cases" * We should proactively add the password to the request if basic auth is configured * and a password is available in the credentials but not in the URL. * * We will be a bit paranoid here and require that the URL has a user embedded, otherwise we go the default route * and ask the server first about the auth method */ if ( set.authType() == "basic" && set.username().size() && !set.password().size() ) { zypp::media::CredentialManager cm( _parent ? _parent->credManagerOptions() : zypp::media::CredManagerOptions() ); const auto cred = cm.getCred( url ); if ( cred && cred->valid() ) { if ( !set.username().size() ) set.setUsername(cred->username()); set.setPassword(cred->password()); } } #endif } catch ( const zypp::media::MediaBadUrlException & e ) { res = NetworkRequestErrorPrivate::customError( NetworkRequestError::MalformedURL, e.asString(), buildExtraInfo() ); } catch ( const zypp::media::MediaUnauthorizedException & e ) { res = NetworkRequestErrorPrivate::customError( NetworkRequestError::AuthFailed, e.asString(), buildExtraInfo() ); } catch ( const zypp::Exception & e ) { res = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, e.asString(), buildExtraInfo() ); } return res; } Download::Download(zyppng::Downloader &parent, std::shared_ptr requestDispatcher, std::shared_ptr mirrors, zyppng::DownloadSpec &&spec) : Base( *new DownloadPrivate( parent, std::move(requestDispatcher), std::move(mirrors), std::move(spec), *this ) ) { } ZYPP_IMPL_PRIVATE(Download) Download::~Download() { if ( state() != InitialState && state() != Finished ) cancel(); } Download::State Download::state() const { const auto &s = d_func()->currentState(); if ( !s ) return Download::InitialState; return *s; } NetworkRequestError Download::lastRequestError() const { if ( state() == Finished ) { return d_func()->state()->_error; } return NetworkRequestError(); } bool Download::hasError() const { return lastRequestError().isError(); } std::string Download::errorString() const { const auto &lReq = lastRequestError(); if (! lReq.isError() ) { return {}; } return ( zypp::str::Format("%1%(%2%)") % lReq.toString() % lReq.nativeErrorString() ); } void Download::start() { d_func()->start(); } void Download::prioritize() { Z_D(); if ( !d->_requestDispatcher ) return; d->_defaultSubRequestPriority = NetworkRequest::Critical; // we only reschedule requests when we are in a state that downloads in blocks d->visitState( []( auto &s ){ using T = std::decay_t; if constexpr ( std::is_same_v #if ENABLE_ZCHUNK_COMPRESSION || std::is_same_v #endif ) { s.reschedule(); } }); } void Download::cancel() { Z_D(); d->forceState ( std::make_unique( NetworkRequestErrorPrivate::customError( NetworkRequestError::Cancelled, "Download was cancelled explicitly" ), *d_func() ) ); } void Download::setStopOnMetalink(const bool set) { d_func()->_stopOnMetalink = set; } bool Download::stoppedOnMetalink() const { return d_func()->_stoppedOnMetalink; } DownloadSpec &Download::spec() { return d_func()->_spec; } const DownloadSpec &Download::spec() const { return d_func()->_spec; } uint64_t Download::lastAuthTimestamp() const { return d_func()->_lastTriedAuthTime; } zyppng::NetworkRequestDispatcher &Download::dispatcher() const { return *d_func()->_requestDispatcher; } SignalProxy Download::sigStarted() { return d_func()->_sigStarted; } SignalProxy Download::sigStateChanged() { return d_func()->DownloadPrivateBase::_sigStateChanged; } SignalProxy zyppng::Download::sigAlive() { return d_func()->_sigAlive; } SignalProxy Download::sigProgress() { return d_func()->_sigProgress; } SignalProxy Download::sigFinished() { return d_func()->DownloadPrivateBase::_sigFinished; } SignalProxy Download::sigAuthRequired() { return d_func()->_sigAuthRequired; } DownloaderPrivate::DownloaderPrivate(std::shared_ptr mc, Downloader &p) : BasePrivate(p) , _mirrors( std::move(mc) ) { _requestDispatcher = std::make_shared( ); if ( !_mirrors ) { _mirrors = MirrorControl::create(); } } void DownloaderPrivate::onDownloadStarted(Download &download) { _sigStarted.emit( *z_func(), download ); } void DownloaderPrivate::onDownloadFinished( Download &download ) { _sigFinished.emit( *z_func(), download ); auto it = std::find_if( _runningDownloads.begin(), _runningDownloads.end(), [ &download ]( const std::shared_ptr &dl){ return dl.get() == &download; }); if ( it != _runningDownloads.end() ) { //make sure this is not deleted before all user code was done _runningDownloads.erase( it ); } if ( _runningDownloads.empty() ) _queueEmpty.emit( *z_func() ); } ZYPP_IMPL_PRIVATE(Downloader) Downloader::Downloader( ) : Base ( *new DownloaderPrivate( {}, *this ) ) { } Downloader::Downloader( std::shared_ptr mc ) : Base ( *new DownloaderPrivate( std::move(mc), *this ) ) { } Downloader::~Downloader() { Z_D(); while ( d->_runningDownloads.size() ) { d->_runningDownloads.back()->cancel(); d->_runningDownloads.pop_back(); } } std::shared_ptr Downloader::downloadFile(const zyppng::DownloadSpec &spec ) { Z_D(); std::shared_ptr dl ( new Download ( *this, d->_requestDispatcher, d->_mirrors, DownloadSpec(spec) ) ); d->_runningDownloads.push_back( dl ); dl->connect( &Download::sigFinished, *d, &DownloaderPrivate::onDownloadFinished ); d->_requestDispatcher->run(); return dl; } std::shared_ptr Downloader::requestDispatcher() const { return d_func()->_requestDispatcher; } SignalProxy Downloader::sigStarted() { return d_func()->_sigStarted; } SignalProxy Downloader::sigFinished() { return d_func()->_sigFinished; } SignalProxy Downloader::queueEmpty() { return d_func()->_queueEmpty; } } libzypp-17.36.5/tools/zypp-media-http/downloader/downloader.h000066400000000000000000000225371476576476200242700ustar00rootroot00000000000000#ifndef ZYPP_NG_MEDIA_CURL_DOWNLOADER_H_INCLUDED #define ZYPP_NG_MEDIA_CURL_DOWNLOADER_H_INCLUDED #include #include #include #include #include #include #include namespace zypp::media { class TransferSettings; } namespace zyppng { class NetworkRequestDispatcher; class DownloaderPrivate; class Download; class DownloadSpec; class MirrorControl; using TransferSettings = zypp::media::TransferSettings; ZYPP_FWD_DECL_TYPE_WITH_REFS( Downloader ); ZYPP_FWD_DECL_TYPE_WITH_REFS( Download ); /** * @brief The Downloader class * * Provides a high level interface to the \sa HttpRequestDispatcher, * implementing Metalink on top. If in doubt which one to use, always * use this one. */ class LIBZYPP_NG_EXPORT Downloader : public Base { ZYPP_DECLARE_PRIVATE( Downloader ) public: using Ptr = DownloaderRef; using WeakPtr = DownloaderWeakRef; Downloader(); Downloader( std::shared_ptr mc ); ~Downloader() override; /*! * Generates a new Download object in waiting state */ std::shared_ptr downloadFile ( const DownloadSpec &spec ); /*! * Returns the internally used \sa zyppng::NetworkRequestDispatcher used by the \a Downloader * to enqueue network requests */ std::shared_ptr requestDispatcher () const; /*! * Emitted when a \sa zyppng::Download created by this Downloader instance was started */ SignalProxy sigStarted ( ); /*! * Signal that is emitted when a \sa zyppng::Download created by this Downloader instance was finished * \note Just as with \sa zyppng::NetworkRequest 's the finished signal does not mean the Download was successful */ SignalProxy sigFinished ( ); /*! * Signal is always emitted when there are not Downloads anymore waiting in the queue */ SignalProxy queueEmpty ( ); }; class DownloadPrivate; /*! * The Download class represents a possibly multipart download. * * The \a Download class is a more high level interface compared to \sa zyppng::NetworkRequest, it can internally * make use of features like metalinks and tries to be as resilient as possible with errors during a download. Due to this * it is represented internally as a state machine. All transitions are signalled and can be followed. * * \code * zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create(); * zyppng::Downloader dl; * * dl.queueEmpty().connect( [ &loop ]( zyppng::Downloader & ) { * loop->quit(); * }); * * zypp::Url url ( "https://download.opensuse.org/distribution/leap/15.0/repo/oss/x86_64/0ad-0.0.22-lp150.2.10.x86_64.rpm" ); * zypp::Pathname target("/tmp/0ad-0.0.22-lp150.2.10.x86_64.rpm"); * * std::shared_ptr req = dl.downloadFile( zypp::DownloadSpec(url, target) ); * req->sigStarted().connect( []( zyppng::Download &dl ) { * std::cout << "Download started: " << dl.targetPath() << std::endl; * }); * * req->sigFinished().connect( []( zyppng::Download &dl ) { * std::cout << "Download finished: " << dl.targetPath() << std::endl; * if ( dl.state() != zyppng::Download::Success ) * std::cout << "\t has error: " << dl.errorString() << std::endl; * }); * * req->sigAlive().connect( []( zyppng::Download &dl, off_t dlnow ) { * std::cout << dl.targetPath().asString() << " at: " << std::endl * << "dlnow: "<< dlnow<< std::endl; * }); * * req->sigProgress().connect( []( zyppng::Download &dl, off_t dltotal, off_t dlnow ) { * std::cout << dl.targetPath().asString() << " at: " << std::endl * << "dltotal: "<< dltotal<< std::endl * << "dlnow: "<< dlnow<< std::endl; * }); * * req->start(); * loop->run(); * * \endcode * */ class LIBZYPP_NG_EXPORT Download : public Base { ZYPP_DECLARE_PRIVATE( Download ) public: using Ptr = DownloadRef; using WeakPtr = DownloadWeakRef; /*! * The states of the internal state machine. Each of them represents a different * stage of the lifetime of a Download. */ enum State { InitialState, //< This is the initial state. It is only set before a download starts. DetectMetaLink, //< Metalink downloads are enabled, trying to detect if we get a metalink or not DlMetaLinkInfo, //< Downloading the metalink description file PrepareMulti, //< This state is set for async preparations of the multi download, like mirror rating DlMetalink, //< Metalink download is running DlZChunkHead, //< Zchunk header download is running DlZChunk, //< Zchunk download is running DlSimple, //< Simple download running, no optimizations Finished, //< Download has finished }; ~Download() override; /*! * Returns the current internal state of the Download * \sa zyppng::Download::State */ State state () const; /*! * Returns the last \sa zyppng::NetworkRequestError enountered while downloading the file. * This will just represent the very last error that could not be recovered from. In case of * a Metalink download that ususally means that all mirrors and the initial URL failed to download for * some reason. */ NetworkRequestError lastRequestError () const; /*! * Returns true if \ref lastRequestError would return a valid \ref NetworkRequestError */ bool hasError () const; /*! * Returns a readable reason why the download failed. * \sa lastRequestError */ std::string errorString () const; /*! * Triggers the start of the download, this needs to be called in order for the statemachine * to advance. */ void start (); /*! * This will raise all requests currenty in pending state to have \ref NetworkRequest::Critial priority, * which means they will be started even before requests with \ref NetworkRequest::High priority. * * \note Use this feature only if the request result is required right away because the application is waiting for it, overuse of this * might hurt performance */ void prioritize(); /*! * Aborts the current download */ void cancel (); /*! * This will finalize the download once a metalink file was received. This is a special setting used * if the metalink file should be processed outside of the Downloader. */ void setStopOnMetalink ( const bool set = true ); /*! * Returns true if the download was stopped after receiving metalink data. The target file * will contain the metalink description. */ bool stoppedOnMetalink () const; /*! * Returns a reference to the internally used download spec. * \sa zyppng::DownloadSpec * \note Changing settings after the download started might result in undefined or weird behaviour */ DownloadSpec &spec (); const DownloadSpec &spec () const; /*! * Returns the timestamp of the last auth credentials that were loaded from the CredentialManager. * If no credentials were tried, this returns 0 */ uint64_t lastAuthTimestamp () const; /*! * Returns a reference to the internally used \sa zyppng::NetworkRequestDispatcher */ NetworkRequestDispatcher &dispatcher () const; /*! * Signals that the dispatcher dequeued the request and actually starts downloading data */ SignalProxy sigStarted (); /*! * Signals that the state of the \a Download has changed */ SignalProxy sigStateChanged (); /*! * Signals that the download is alive but still in initial stage ( trying to figure out if metalink / zsync ) */ SignalProxy sigAlive (); /*! * Signals if there was data read from the download */ SignalProxy sigProgress (); /*! * Signals that the download finished. */ SignalProxy sigFinished ( ); /*! * Is emitted when a request requires authentication and it was not given or if auth failed. * A connected slot should fill in the \a auth information in order to provide login credentials. * * \note the URL in the \a auth data is set to the url of the request needing authorization. * This URL can be different than the one in the spec, due to redirect/metalink. * Also the lastDatabaseUpdate field is set to the timestamp of the auth data that was tried already ( if available ) */ SignalProxy sigAuthRequired ( ); private: friend class zyppng::Downloader; /*! * A download can only directly be created by the \sa zyppng::Downloader */ Download ( Downloader &parent, std::shared_ptr requestDispatcher, std::shared_ptr mirrors, DownloadSpec &&spec ); }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/downloadspec.cc000066400000000000000000000107041476576476200247430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include "downloadspec.h" #include namespace zyppng { class DownloadSpecPrivate { public: DownloadSpecPrivate() = default; DownloadSpecPrivate &operator=(const DownloadSpecPrivate &) = delete; DownloadSpecPrivate &operator=(DownloadSpecPrivate &&) = delete; DownloadSpecPrivate(const DownloadSpecPrivate &other) = default; DownloadSpecPrivate( DownloadSpecPrivate &&other ) noexcept = default; DownloadSpecPrivate *clone () const { return new DownloadSpecPrivate(*this); } zypp::Url _url; TransferSettings _settings; zypp::Pathname _delta; zypp::ByteCount _expectedFileSize; zypp::Pathname _targetPath; bool _checkExistanceOnly = false; //< this will NOT download the file, but only query the server if it exists bool _metalink_enabled = true; //< should the download try to use metalinks zypp::ByteCount _headerSize; //< Optional file header size for things like zchunk std::optional _headerChecksum; //< Optional file header checksum zypp::ByteCount _preferred_chunk_size = 0; }; ZYPP_IMPL_PRIVATE( DownloadSpec ) DownloadSpec::DownloadSpec( Url file , zypp::filesystem::Pathname targetPath, zypp::ByteCount expectedFileSize ) : d_ptr( new DownloadSpecPrivate() ) { // default settings d_ptr->_url = std::move(file); d_ptr->_targetPath = std::move(targetPath); d_ptr->_expectedFileSize = std::move( expectedFileSize ); } const Url &DownloadSpec::url() const { return d_ptr->_url; } DownloadSpec &DownloadSpec::setUrl(const Url &url) { d_ptr->_url = url; return *this; } const zypp::Pathname &DownloadSpec::targetPath() const { return d_ptr->_targetPath; } DownloadSpec &DownloadSpec::setTargetPath(const zypp::filesystem::Pathname &path) { d_ptr->_targetPath = path; return *this; } DownloadSpec &DownloadSpec::setMetalinkEnabled(bool enable) { d_ptr->_metalink_enabled = enable; return *this; } bool DownloadSpec::metalinkEnabled() const { return d_ptr->_metalink_enabled; } DownloadSpec &DownloadSpec::setCheckExistsOnly(bool set) { d_ptr->_checkExistanceOnly = ( set ); return *this; } bool DownloadSpec::checkExistsOnly() const { return d_ptr->_checkExistanceOnly; } DownloadSpec &DownloadSpec::setDeltaFile(const zypp::Pathname &file) { d_ptr->_delta = file; return *this; } zypp::Pathname DownloadSpec::deltaFile() const { return d_ptr->_delta; } DownloadSpec &DownloadSpec::setPreferredChunkSize(const zypp::ByteCount &bc) { d_ptr->_preferred_chunk_size = bc; return *this; } zypp::ByteCount DownloadSpec::preferredChunkSize() const { return d_ptr->_preferred_chunk_size; } const TransferSettings &DownloadSpec::settings() const { return d_ptr->_settings; } DownloadSpec & DownloadSpec::setTransferSettings(TransferSettings &&set) { d_ptr->_settings = std::move( set ); return *this; } DownloadSpec & DownloadSpec::setTransferSettings(const TransferSettings &set) { d_ptr->_settings = set; return *this; } DownloadSpec &DownloadSpec::setExpectedFileSize(const zypp::ByteCount &bc) { d_ptr->_expectedFileSize = bc; return *this; } zypp::ByteCount DownloadSpec::expectedFileSize() const { return d_ptr->_expectedFileSize; } DownloadSpec &DownloadSpec::setHeaderSize(const zypp::ByteCount &bc) { d_ptr->_headerSize = bc; return *this; } zypp::ByteCount DownloadSpec::headerSize() const { return d_ptr->_headerSize; } const std::optional &DownloadSpec::headerChecksum() const { Z_D(); return d->_headerChecksum; } DownloadSpec &DownloadSpec::setHeaderChecksum(const zypp::CheckSum &sum) { Z_D(); if ( sum.empty() ) d->_headerChecksum.reset(); else { d->_headerChecksum = sum; } return *this; } } libzypp-17.36.5/tools/zypp-media-http/downloader/downloadspec.h000066400000000000000000000106251476576476200246070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_MEDIA_NETWORK_DOWNLOADSPEC_H #define ZYPPNG_MEDIA_NETWORK_DOWNLOADSPEC_H #include #include #include #include #include #include #include #include namespace zyppng { class DownloadSpecPrivate; using TransferSettings = zypp::media::TransferSettings; /*! * Specifies all aspects of a download. Used together with the * \ref zyppng::Download and \ref zyppng::Downloader classes */ class DownloadSpec { ZYPP_DECLARE_PRIVATE( DownloadSpec ) public: DownloadSpec(Url file, zypp::filesystem::Pathname targetPath, zypp::ByteCount expectedFileSize = zypp::ByteCount()); DownloadSpec( const DownloadSpec &other ) = default; DownloadSpec &operator= ( const DownloadSpec &other ) = default; DownloadSpec(DownloadSpec &&) noexcept = default; DownloadSpec &operator=(DownloadSpec &&) noexcept = default; /*! * Returns the source URL of the download */ const Url &url () const; DownloadSpec &setUrl ( const Url &url ); /*! * Returns the target file path, this is where the downloaded data is stored */ const zypp::Pathname &targetPath() const; DownloadSpec &setTargetPath ( const zypp::Pathname &path ); /*! * Enabled or disabled metalink handling. Enabled by default. * \note if Metalink is enabled the Download tells the server that it accepts metalink files by adding a specific header * to the request. */ DownloadSpec &setMetalinkEnabled ( bool enable = true ); bool metalinkEnabled ( ) const; /*! * Enables a special mode, in this case only the existance of the file is checked but no data is actually downloaded */ DownloadSpec &setCheckExistsOnly ( bool set = true ); bool checkExistsOnly ( ) const; /*! * Set a already existing local file to be used for partial downloading, in case of a multichunk download all chunks from the * file that have the expected checksum will be reused instead of downloaded */ DownloadSpec &setDeltaFile ( const zypp::Pathname &file ); zypp::filesystem::Pathname deltaFile() const; /*! * Sets the prefered amount of bytes the downloader tries to request from a single server per metalink chunk request. * If the metalink description has smaller chunks those are coalesced to match the preferred size. * * Setting this to 0 tells the \ref Downloader instance to automatically calculate the chunk size. This is also the default. */ DownloadSpec &setPreferredChunkSize ( const zypp::ByteCount &bc ); zypp::ByteCount preferredChunkSize() const; /*! * Returns the \sa zyppng::TransferSettings for the download. The settings are reused for * possible sub downloads, however authentication data is stripped if the subdownload uses a different host to * fetch the data from. If there is no auth data known \sa sigAuthRequired is emitted. */ const TransferSettings &settings () const; DownloadSpec &setTransferSettings( TransferSettings &&set ); DownloadSpec &setTransferSettings( const TransferSettings &set ); DownloadSpec &setExpectedFileSize ( const zypp::ByteCount &bc ); zypp::ByteCount expectedFileSize() const; DownloadSpec &setHeaderSize ( const zypp::ByteCount &bc ); zypp::ByteCount headerSize() const; const std::optional &headerChecksum () const; DownloadSpec &setHeaderChecksum ( const zypp::CheckSum &sum ); private: zypp::RWCOW_pointer d_ptr; }; } #endif // ZYPPNG_MEDIA_NETWORK_DOWNLOADSPEC_H libzypp-17.36.5/tools/zypp-media-http/downloader/mirrorcontrol.cc000066400000000000000000000237471476576476200252070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include "private/mirrorcontrol_p.h" #include #include #include #include #include namespace zyppng { constexpr uint penaltyIncrease = 100; constexpr uint defaultSampleTime = 2; constexpr uint defaultMaxConnections = 5; MirrorControl::Mirror::Mirror( MirrorControl &parent ) : _parent( parent ) {} void MirrorControl::Mirror::startTransfer() { runningTransfers++; } void MirrorControl::Mirror::finishTransfer(const bool success) { if ( success ) { if ( penalty >= penaltyIncrease ) penalty -= penaltyIncrease; successfulTransfers++; failedTransfers = 0; } else { penalty += penaltyIncrease; failedTransfers++; } transferUnref(); } void MirrorControl::Mirror::cancelTransfer() { transferUnref(); } uint MirrorControl::Mirror::maxConnections() const { return ( _maxConnections > 0 ? _maxConnections : defaultMaxConnections ); //max connections per mirror @todo make this configurable } bool MirrorControl::Mirror::hasFreeConnections() const { return ( runningTransfers < maxConnections() ); } void MirrorControl::Mirror::transferUnref() { const auto newCount = runningTransfers - 1; if ( newCount < 0 ) return; bool stillLoaded = ( newCount ) >= maxConnections(); runningTransfers--; if ( !stillLoaded ) _parent._sigNewMirrorsReady.emit(); } MirrorControl::MirrorControl() { // set up the single shot timer, that way we can emit a signal after we finished processing all // events that have queued up in the event loop instead of constantly firing the signal _newMirrSigDelay = Timer::create(); _newMirrSigDelay->setSingleShot( true ); _newMirrSigDelay->connectFunc( &Timer::sigExpired, [this]( const auto & ){ _sigNewMirrorsReady.emit(); }); _dispatcher = std::make_shared(); _queueEmptyConn = _dispatcher->connectFunc( &NetworkRequestDispatcher::sigQueueFinished, [ this ]( NetworkRequestDispatcher& ) { //tell the world the queue is empty std::vector< std::unordered_map::const_iterator > allOfEm; for ( auto i = _handles.begin(); i != _handles.end(); i++ ) { allOfEm.push_back( i ); } std::sort( allOfEm.begin(), allOfEm.end(), []( const auto &a, const auto &b ){ return ( zypp::str::compareCI( a->second->mirrorUrl.asString().c_str(), b->second->mirrorUrl.asString().c_str() ) < 0 ); }); DBG_MEDIA << "Finished probing mirrors, these are the results: \n"; for ( const auto &iter : allOfEm ) { DBG_MEDIA << "Mirror: " << iter->second->mirrorUrl << ", rating is: " << iter->second->rating << "\n"; } DBG_MEDIA << "End Mirror probing results." << std::endl; _sigAllMirrorsReady.emit(); }, *this ); _dispatcher->run(); } MirrorControl::Ptr MirrorControl::create() { return std::shared_ptr( new MirrorControl ); } MirrorControl::~MirrorControl() { // do not send signals to us while we are destructing _queueEmptyConn.disconnect(); if ( _dispatcher->count() > 0 ) { MIL << "Destroying MirrorControl while measurements are still running, aborting" << std::endl; for ( auto &mirr : _handles ) { if ( mirr.second->_request ) { mirr.second->_finishedConn.disconnect(); _dispatcher->cancel( *mirr.second->_request ); } } } } void MirrorControl::registerMirrors( const std::vector &urls ) { bool doesKnowSomeMirrors = false; for ( const auto &mirror : urls ) { const auto scheme = mirror.url.getScheme(); if ( scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp" ) { const std::string urlKey = makeKey( mirror.url ); // already there const auto hndlIt = _handles.find( urlKey ); if ( hndlIt != _handles.end() ) { doesKnowSomeMirrors = true; continue; } auto mirrorHandle = std::shared_ptr( new Mirror(*this) ); mirrorHandle->rating = mirror.priority; mirrorHandle->_maxConnections = mirror.maxConnections; mirrorHandle->mirrorUrl = mirror.url; mirrorHandle->mirrorUrl.setPathName("/"); mirrorHandle->_request = std::make_shared( mirrorHandle->mirrorUrl, "/dev/null", NetworkRequest::WriteShared ); mirrorHandle->_request->setOptions( NetworkRequest::ConnectionTest ); mirrorHandle->_request->transferSettings().setTimeout( defaultSampleTime ); mirrorHandle->_request->transferSettings().setConnectTimeout( defaultSampleTime ); mirrorHandle->_finishedConn = mirrorHandle->_request->connectFunc( &NetworkRequest::sigFinished, [ mirrorHandle, &someReadyDelay = _newMirrSigDelay ]( NetworkRequest &req, const NetworkRequestError & ){ if ( req.hasError() ) ERR << "Mirror request failed: " << req.error().toString() << " ; " << req.extendedErrorString() << "; for url: "<(timings->connect - timings->namelookup); } else { // we can not get any measurements, maximum penalty connTime = std::chrono::seconds( defaultSampleTime ); } DBG_MEDIA << "Got rating for mirror: " << mirrorHandle->mirrorUrl << ", rating was " << mirrorHandle->rating; mirrorHandle->rating += connTime.count(); DBG_MEDIA << " rating is now " << mirrorHandle->rating << " conn time was " << connTime.count() << std::endl; // clean the request up mirrorHandle->_finishedConn.disconnect(); mirrorHandle->_request.reset(); // start the timer to emit someMirrorsReady someReadyDelay->start( 0 ); }); _dispatcher->enqueue( mirrorHandle->_request ); _handles.insert( std::make_pair(urlKey, mirrorHandle ) ); } } if ( doesKnowSomeMirrors ) _sigNewMirrorsReady.emit(); if ( _dispatcher->count() == 0 ) { // we did know all Mirrors before, notify the outside world we are ready _sigAllMirrorsReady.emit(); } } MirrorControl::PickResult MirrorControl::pickBestMirror( const std::vector &mirrors ) { bool hasPendingRating = false; std::vector< MirrorPick > possibleMirrs; for ( auto i = mirrors.begin(); i != mirrors.end(); i++ ) { const auto key = makeKey( *i ); const auto hdlIt = this->_handles.find( key ); if ( hdlIt == _handles.end( ) ) continue; // still waiting for the request to finish if ( hdlIt->second->_request ) { hasPendingRating = true; continue; } possibleMirrs.push_back( std::make_pair( i, hdlIt->second ) ); } if ( possibleMirrs.empty() && hasPendingRating ) { // still waiting return , tell the caller to try again later return PickResult{ PickResult::Again, std::make_pair( mirrors.end(), MirrorHandle() ) }; } std::stable_sort( possibleMirrs.begin(), possibleMirrs.end(), []( const auto &a, const auto &b ) { return a.second->rating < b.second->rating; }); bool hasLoadedOne = false; // do we have a mirror that will be ready again later? for ( const auto &mirr : possibleMirrs ) { if ( !mirr.second->hasFreeConnections() ) { hasLoadedOne = true; continue; } if ( mirr.second->failedTransfers >= 10 ) continue; return PickResult{ PickResult::Ok, mirr }; } if ( hasLoadedOne ){ // we have mirrors, but they have reached maximum capacity, tell the caller to delay the call return PickResult{ PickResult::Again, std::make_pair( mirrors.end(), MirrorHandle() ) }; } return PickResult{ PickResult::Unknown, std::make_pair( mirrors.end(), MirrorHandle() ) }; } SignalProxy MirrorControl::sigNewMirrorsReady() { return _sigNewMirrorsReady; } SignalProxy MirrorControl::sigAllMirrorsReady() { return _sigAllMirrorsReady; } std::string MirrorControl::makeKey(const zypp::Url &url) const { return url.asString( zypp::Url::ViewOptions::WITH_SCHEME + zypp::Url::ViewOptions::WITH_HOST + zypp::Url::ViewOptions::WITH_PORT + zypp::Url::ViewOptions::EMPTY_AUTHORITY ); } #if 0 MirrorRef::MirrorRef( MirrorControl::MirrorHandle handle ) { _data = std::make_shared( handle, false ); } MirrorRef::~MirrorRef() { } void MirrorRef::startTransfer() { _data->_myHandle->startTransfer(); _data->_cancelOnDestruct = true; } void MirrorRef::finishTransfer(const bool success) { _data->_cancelOnDestruct = false; _data->_myHandle->finishTransfer( success ); } void MirrorRef::cancelTransfer() { _data->_cancelOnDestruct = false; _data->_myHandle->cancelTransfer(); } MirrorRef::operator bool() const { return _data->_myHandle.operator bool(); } MirrorControl::MirrorHandle MirrorRef::get() { return _data->_myHandle; } MirrorRef::Helper::~Helper() { if ( _cancelOnDestruct ) _myHandle->cancelTransfer(); } #endif } libzypp-17.36.5/tools/zypp-media-http/downloader/private/000077500000000000000000000000001476576476200234225ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloader_p.h000066400000000000000000000147701476576476200262610ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADER_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADER_P_H_INCLUDED #include #include "downloaderstates/base_p.h" #include "downloaderstates/initial_p.h" #include "downloaderstates/detectmeta_p.h" #include "downloaderstates/metalinkinfo_p.h" #include "downloaderstates/preparemulti_p.h" #include "downloaderstates/metalink_p.h" #include "downloaderstates/normal_p.h" #include "downloaderstates/final_p.h" #if ENABLE_ZCHUNK_COMPRESSION #include "downloaderstates/zck_p.h" #endif namespace zyppng { /** * our known states: * InitialState //< initial state before we start downloading * DetectMetalinkState //< First attempt to get the zchunk header, but we might receive metalink data instead * DlMetaLinkInfoState //< We got Metalink, lets get the full metalink file or we got no zchunk in the first place * PrepareMultiState //< Parsing the metalink file and preparing the mirrors * DLZckHeadState //< Download the ZChunk Header * DLZckState //< Download the File in ZChunk Mode * DlMetalinkState //< Download the File in Metalink Mode * DlNormalFileState //< Simple Plain download, no chunking * FinishedState //< We are done */ template using DownloadStatemachine = Statemachine< Derived, Download::State, // Source State, State Change Event TargetState, Transition Condition, Transition operation Transition< InitialState, &InitialState::sigTransitionToDetectMetalinkState, DetectMetalinkState >, Transition< InitialState, &InitialState::sigTransitionToDlMetaLinkInfoState, DlMetaLinkInfoState >, #if ENABLE_ZCHUNK_COMPRESSION Transition< InitialState, &InitialState::sigTransitionToDLZckHeaderState, DLZckHeadState, DefaultStateCondition, &InitialState::toDLZckHeadState >, #endif Transition< InitialState, &InitialState::sigTransitionToDlNormalFileState, DlNormalFileState >, Transition< DetectMetalinkState, &DetectMetalinkState::sigFinished, DlMetaLinkInfoState, &DetectMetalinkState::toMetalinkGuard, &DetectMetalinkState::toDlMetaLinkInfoState >, #if ENABLE_ZCHUNK_COMPRESSION Transition< DetectMetalinkState, &DetectMetalinkState::sigFinished, DLZckHeadState, &DetectMetalinkState::toZckHeadDownloadGuard, &DetectMetalinkState::toDLZckHeadState >, #endif Transition< DetectMetalinkState, &DetectMetalinkState::sigFinished, DlNormalFileState, &DetectMetalinkState::toSimpleDownloadGuard >, Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigFinished, FinishedState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToFinished >, Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigGotMetadata, PrepareMultiState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToPrepareMulti >, Transition< DlMetaLinkInfoState, &DlMetaLinkInfoState::sigFailed, FinishedState, DefaultStateCondition, &DlMetaLinkInfoState::transitionToFinished >, Transition< PrepareMultiState, &PrepareMultiState::sigFinished, DlMetalinkState, &PrepareMultiState::toMetalinkDownloadGuard , &PrepareMultiState::transitionToMetalinkDl >, #if ENABLE_ZCHUNK_COMPRESSION Transition< PrepareMultiState, &PrepareMultiState::sigFinished, DLZckHeadState, &PrepareMultiState::toZckHeadDownloadGuard, &PrepareMultiState::transitionToZckHeadDl >, #endif Transition< PrepareMultiState, &PrepareMultiState::sigFallback, DlNormalFileState, DefaultStateCondition, &PrepareMultiState::fallbackToNormalTransition >, Transition< PrepareMultiState, &PrepareMultiState::sigFailed, DlNormalFileState >, #if ENABLE_ZCHUNK_COMPRESSION Transition< DLZckHeadState, &DLZckHeadState::sigFinished, DLZckState, DefaultStateCondition, &DLZckHeadState::transitionToDlZckState >, Transition< DLZckHeadState, &DLZckHeadState::sigFailed, DlNormalFileState >, Transition< DLZckState, &DLZckState::sigFinished, FinishedState, DefaultStateCondition, &DLZckState::transitionToFinished >, Transition< DLZckState, &DLZckState::sigFallback, DlNormalFileState >, #endif Transition< DlMetalinkState, &DlMetalinkState::sigFinished, FinishedState, DefaultStateCondition, &DlMetalinkState::transitionToFinished >, Transition< DlMetalinkState, &DlMetalinkState::sigFailed, FinishedState, &DlMetalinkState::toFinalStateCondition, &DlMetalinkState::transitionToFinished >, Transition< DlMetalinkState, &DlMetalinkState::sigFailed, DlNormalFileState, &DlMetalinkState::toSimpleDownloadCondition >, Transition< DlNormalFileState, &DlNormalFileState::sigFinished, FinishedState, DefaultStateCondition, &DlNormalFileState::transitionToFinished >, Transition< DlNormalFileState, &DlNormalFileState::sigFailed, FinishedState, DefaultStateCondition, &DlNormalFileState::transitionToFinished > >; class DownloadPrivate : public DownloadPrivateBase, public DownloadStatemachine { public: DownloadPrivate ( Downloader &parent, std::shared_ptr requestDispatcher, std::shared_ptr mirrors, DownloadSpec &&spec, Download &p ); void start (); void init() override; }; class DownloaderPrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(Downloader) public: DownloaderPrivate( std::shared_ptr mc, Downloader &p ); std::vector< std::shared_ptr > _runningDownloads; std::shared_ptr _requestDispatcher; void onDownloadStarted ( Download &download ); void onDownloadFinished ( Download &download ); Signal< void ( Downloader &parent, Download& download )> _sigStarted; Signal< void ( Downloader &parent, Download& download )> _sigFinished; Signal< void ( Downloader &parent )> _queueEmpty; std::shared_ptr _mirrors; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/000077500000000000000000000000001476576476200270045ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/base_p.h000066400000000000000000000113521476576476200304100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_BASE_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_BASE_P_H_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { class NetworkRequestDispatcher; class DownloadPrivate; /*! * The pimpl for Downloader, the reason this is split up in DownloadPrivateBase and DownloadBase * is that for defining the States in the Statemachine while making DownloadPrivate the statemachine itself * we need this separation. This trick allowes the states to "know" the statemachine type and access some of * its features. */ class DownloadPrivateBase : public BasePrivate { ZYPP_DECLARE_PUBLIC(Download) public: DownloadPrivateBase ( Downloader &parent, std::shared_ptr requestDispatcher, std::shared_ptr mirrors, DownloadSpec &&spec, Download &p ); ~DownloadPrivateBase () override; struct Block : public RangeDesc { int _retryCount = 0; //< how many times was this request restarted NetworkRequestError _failedWithErr; //< what was the error this request failed with }; struct Request : public NetworkRequest { using NetworkRequest::NetworkRequest; using Ptr = std::shared_ptr; using WeakPtr = std::shared_ptr; template void connectSignals ( Receiver &dl ) { _sigStartedConn = connect ( &NetworkRequest::sigStarted, dl, &Receiver::onRequestStarted ); _sigProgressConn = connect ( &NetworkRequest::sigProgress, dl, &Receiver::onRequestProgress ); _sigFinishedConn = connect ( &NetworkRequest::sigFinished, dl, &Receiver::onRequestFinished ); } void disconnectSignals (); time_t _authTimestamp = 0; //< timestamp of the AuthData we tried already Url _originalUrl; //< The unstripped URL as it was passed to Download , before transfer settings are removed MirrorControl::MirrorHandle _myMirror; connection _sigStartedConn; connection _sigProgressConn; connection _sigFinishedConn; }; bool _emittedSigStart = false; bool handleRequestAuthError(const std::shared_ptr& req, const zyppng::NetworkRequestError &err); NetworkRequestError safeFillSettingsFromURL ( const Url &url, TransferSettings &set ); #if ENABLE_ZCHUNK_COMPRESSION bool hasZckInfo () const; #endif std::shared_ptr _requestDispatcher; std::shared_ptr _mirrorControl; zypp::media::CredentialManager::CredentialSet _credCache; //< the credential cache for this download DownloadSpec _spec; // the download settings mutable zypp::TriBool _specHasZckInfo = zypp::indeterminate; Downloader *_parent = nullptr; time_t _lastTriedAuthTime = 0; //< if initialized this shows the last timestamp that got from user code for a auth request bool _stopOnMetalink = false; //< Stop the download if a metalink was received for external parsing bool _stoppedOnMetalink = false; //< Statemachine was stopped after receiving a metalink file NetworkRequest::Priority _defaultSubRequestPriority = NetworkRequest::High; Signal< void ( Download &req )> _sigStarted; Signal< void ( Download &req, Download::State state )> _sigStateChanged; Signal< void ( Download &req, off_t dlnow )> _sigAlive; Signal< void ( Download &req, off_t dltotal, off_t dlnow )> _sigProgress; Signal< void ( Download &req )> _sigFinished; Signal< void ( zyppng::Download &req, zyppng::NetworkAuthData &auth, const std::string &availAuth )> _sigAuthRequired; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/basicdownloader_p.cc000066400000000000000000000156471476576476200330070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include #include "basicdownloader_p.h" namespace zyppng { BasicDownloaderStateBase::BasicDownloaderStateBase(std::shared_ptr &&req, DownloadPrivate &parent) : MirrorHandlingStateBase( parent ) , _request( std::move(req) ) { } void BasicDownloaderStateBase::enter() { if ( _request ) { const auto &spec = stateMachine()._spec; MIL_MEDIA << "Reusing request from previous state" << std::endl; _request->setOptions( Request::Default ); _request->setPriority( Request::Normal ); _request->resetRequestRanges(); _request->setTargetFilePath( spec.targetPath() ); _request->setFileOpenMode( Request::WriteExclusive ); _request->transferSettings() = spec.settings(); startRequest(); return; } if ( _fileMirrors.size() ) { const auto res = prepareNextMirror(); // for Delayed or OK we can just continue here if ( res != MirrorHandlingStateBase::Failed ) return; } failedToPrepare(); } void BasicDownloaderStateBase::exit() { if ( _request ) { _request->disconnectSignals(); _request.reset(); } } void BasicDownloaderStateBase::mirrorReceived( MirrorControl::MirrorPick mirror ) { auto &sm = stateMachine(); auto url = sm._spec.url(); auto set = sm._spec.settings(); auto err = setupMirror( mirror, url, set ); if ( err.isError() ) { WAR << "Setting up mirror " << mirror.second->mirrorUrl << " failed with error: " << err.toString() << "(" << err.nativeErrorString() << "), falling back to original URL." << std::endl; failedToPrepare(); } startWithMirror( mirror.second, url, set ); } void BasicDownloaderStateBase::failedToPrepare() { startWithoutMirror(); } void BasicDownloaderStateBase::startWithMirror( MirrorControl::MirrorHandle mirror, const zypp::Url &url, const TransferSettings &set ) { auto &sm = stateMachine(); const auto &spec = sm._spec; _request = std::make_shared( ::internal::clearQueryString(url), spec.targetPath() ) ; _request->_myMirror = std::move(mirror); _request->_originalUrl = url; _request->transferSettings() = set; startRequest(); } void BasicDownloaderStateBase::startWithoutMirror() { auto &sm = stateMachine(); const auto &spec = sm._spec; auto url = spec.url(); auto set = spec.settings(); auto err = sm.safeFillSettingsFromURL( url, set ); if ( err.isError() ) return failed( std::move(err) ); startWithMirror( nullptr, url, set ); } void BasicDownloaderStateBase::startRequest() { auto &sm = stateMachine(); if ( !_request ) return failed("Request was not intialized before starting it."); if ( _chksumtype && _chksumVec ) { std::optional fileDigest = zypp::Digest(); if ( fileDigest->create( *_chksumtype ) ) // to run the checksum for the full file we need to request one big range with open end _request->addRequestRange( 0, 0, std::move(fileDigest), *_chksumVec ); } if ( sm._spec.checkExistsOnly() ) _request->setOptions( _request->options() | Request::HeadRequest ); if ( !initializeRequest( _request ) ) { return failed( "Failed to initialize request" ); } if ( stateMachine().previousState() && *stateMachine().previousState() != Download::InitialState ) { //make sure this request will run asap _request->setPriority( sm._defaultSubRequestPriority ); } _request->connectSignals( *this ); sm._requestDispatcher->enqueue( _request ); } bool BasicDownloaderStateBase::initializeRequest( std::shared_ptr & ) { return true; } void BasicDownloaderStateBase::gotFinished() { _sigFinished.emit(); } void BasicDownloaderStateBase::failed( std::string &&str ) { failed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(str) ) ); } void BasicDownloaderStateBase::failed( NetworkRequestError &&err ) { _error = std::move( err ); zypp::filesystem::unlink( stateMachine()._spec.targetPath() ); _sigFailed.emit(); } void BasicDownloaderStateBase::onRequestStarted( NetworkRequest & ) { auto &sm = stateMachine(); if ( !sm._emittedSigStart ) { sm._emittedSigStart = true; stateMachine()._sigStarted.emit( *stateMachine().z_func() ); } if ( _request->_myMirror ) _request->_myMirror->startTransfer(); } void BasicDownloaderStateBase::handleRequestProgress( NetworkRequest &req, off_t dltotal, off_t dlnow ) { auto &sm = stateMachine(); const off_t expFSize = sm._spec.expectedFileSize(); if ( expFSize > 0 && expFSize < req.downloadedByteCount() ) { sm._requestDispatcher->cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) ); return; } return sm._sigProgress.emit( *sm.z_func(), (expFSize > 0 ? expFSize : dltotal), dlnow ); } void BasicDownloaderStateBase::onRequestProgress( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t, off_t ) { handleRequestProgress( req, dltotal, dlnow ); } void BasicDownloaderStateBase::onRequestFinished( NetworkRequest &req, const NetworkRequestError &err ) { auto lck = stateMachine().z_func()->shared_from_this(); auto &sm = stateMachine(); if ( _request->_myMirror ) _request->_myMirror->finishTransfer( !err.isError() ); if ( req.hasError() ) { // if we get authentication failure we try to recover if ( sm.handleRequestAuthError( _request, err ) ) { //make sure this request will run asap _request->setPriority( sm._defaultSubRequestPriority ); sm._requestDispatcher->enqueue( _request ); return; } MIL << req.nativeHandle() << " " << "Downloading on " << stateMachine()._spec.url() << " failed with error "<< err.toString() << " " << err.nativeErrorString() << std::endl; if ( req.lastRedirectInfo ().size () ) MIL << req.nativeHandle() << " Last redirection target was: " << req.lastRedirectInfo () << std::endl; return failed( NetworkRequestError(err) ); } gotFinished(); } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/basicdownloader_p.h000066400000000000000000000052261476576476200326410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_BASICDOWNLOADER_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_BASICDOWNLOADER_P_H_INCLUDED #include "base_p.h" #include "mirrorhandling_p.h" #include namespace zyppng { /*! * State implementation for the generic part of a simple file downloader, that knows * how to use the mirrors if available. */ struct BasicDownloaderStateBase : public MirrorHandlingStateBase { using Request = DownloadPrivateBase::Request; BasicDownloaderStateBase ( DownloadPrivate &parent ) : MirrorHandlingStateBase( parent ){} BasicDownloaderStateBase ( std::shared_ptr &&req, DownloadPrivate &parent ); void enter (); void exit (); virtual bool initializeRequest ( std::shared_ptr &r ); virtual void gotFinished (); virtual void failed(NetworkRequestError &&err); void failed (std::string &&str ); void onRequestStarted ( NetworkRequest & ); void onRequestProgress ( NetworkRequest &, off_t dltotal, off_t dlnow, off_t, off_t ); void onRequestFinished ( NetworkRequest &req , const NetworkRequestError &err ); const NetworkRequestError &error () const { return _error; } std::shared_ptr _request; std::optional _chksumtype; //< The file checksum type if available std::optional _chksumVec; //< The file checksum if available // MirrorHandlingStateBase interface void mirrorReceived(MirrorControl::MirrorPick mirror) override; void failedToPrepare() override; protected: void startWithMirror ( MirrorControl::MirrorHandle mirror, const zypp::Url &url, const TransferSettings &set ); void startWithoutMirror ( ); void startRequest (); virtual void handleRequestProgress (NetworkRequest &req, off_t dltotal, off_t dlnow ); NetworkRequestError _error; Signal< void () > _sigFinished; Signal< void () > _sigFailed; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/detectmeta_p.cc000066400000000000000000000104211476576476200317470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include "detectmeta_p.h" #include "metalinkinfo_p.h" namespace zyppng { DetectMetalinkState::DetectMetalinkState(DownloadPrivate &parent) : SimpleState( parent ){ MIL << "Entering DetectMetalinkState for url: " << parent._spec.url() << std::endl; } void DetectMetalinkState::enter() { _request.reset(); _gotMetalink = false; auto &sm = stateMachine(); const auto &url = sm._spec.url(); MIL_MEDIA << "Detecting if metalink is available on " << url << std::endl; _request = std::make_shared( ::internal::clearQueryString( url ), zypp::Pathname("/dev/null") ); _request->_originalUrl = url; _request->transferSettings() = sm._spec.settings(); _request->transferSettings().addHeader("Accept: */*, application/metalink+xml, application/metalink4+xml"); _request->setOptions( _request->options() | NetworkRequest::HeadRequest ); _request->connectSignals( *this ); sm._requestDispatcher->enqueue( _request ); } void DetectMetalinkState::exit() { if ( _request ) { _request->disconnectSignals(); _request.reset(); } } void DetectMetalinkState::onRequestStarted( NetworkRequest & ) { stateMachine()._sigStarted.emit( *stateMachine().z_func() ); } void DetectMetalinkState::onRequestProgress( NetworkRequest &, off_t, off_t dlnow, off_t, off_t ) { stateMachine()._sigAlive.emit( *stateMachine().z_func(), dlnow ); } void DetectMetalinkState::onRequestFinished( NetworkRequest &req, const NetworkRequestError &err ) { auto lck = stateMachine().z_func()->shared_from_this(); if ( req.hasError() ) { WAR << req.nativeHandle() << " " << "Detecing if metalink is possible for url " << req.url() << " failed with error " << err.toString() << " falling back to download without metalink." << std::endl; if ( req.lastRedirectInfo ().size () ) WAR << req.nativeHandle() << " Last redirection target was: " << req.lastRedirectInfo () << std::endl; _error = err; _gotMetalink = false; return _sigFinished.emit(); } std::string cType = req.contentType(); _gotMetalink = ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 ); MIL << req.nativeHandle() << " " << "Metalink detection result on url " << req.url() << " is " << _gotMetalink << std::endl; _sigFinished.emit(); } std::shared_ptr DetectMetalinkState::toDlMetaLinkInfoState() { _request->disconnectSignals(); auto nState = std::make_shared( std::move( _request ), stateMachine() ); _request = nullptr; return nState; } bool DetectMetalinkState::toSimpleDownloadGuard() const { #if ENABLE_ZCHUNK_COMPRESSION return !toMetalinkGuard() && !toZckHeadDownloadGuard(); #else return !toMetalinkGuard(); #endif } #if ENABLE_ZCHUNK_COMPRESSION bool DetectMetalinkState::toZckHeadDownloadGuard() const { return !toMetalinkGuard() && stateMachine().hasZckInfo(); } std::shared_ptr DetectMetalinkState::toDLZckHeadState() { // we have no mirrors, the range downloader would need to fall back to using the base URL if ( _error.isError() || !_request ) return std::make_shared( std::vector { stateMachine()._spec.url() }, stateMachine() ); else { // reuse our request _request->disconnectSignals(); auto nstate = std::make_shared( std::vector { stateMachine()._spec.url() }, std::move(_request), stateMachine() ); _request = nullptr; return nstate; } } #endif } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/detectmeta_p.h000066400000000000000000000050611476576476200316150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_DETECTMETA_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_DETECTMETA_P_H_INCLUDED #include "base_p.h" #include namespace zyppng { struct DlMetaLinkInfoState; #if ENABLE_ZCHUNK_COMPRESSION struct DLZckHeadState; #endif /*! * State implementation for the metalink detection phase, * this state issues a HEAD request while setting the magic * "Accept: *\/\*, application/metalink+xml, application/metalink4+xml" * header in the request to figure out if a metalink file is available or not. * * In order to use metalink support the server * needs to correctly return the metalink file content type, * otherwise we proceed to not downloading a metalink file */ struct DetectMetalinkState : public zyppng::SimpleState< DownloadPrivate, Download::DetectMetaLink, false > { using Request = DownloadPrivateBase::Request; DetectMetalinkState ( DownloadPrivate &parent ); void enter (); void exit (); void onRequestStarted ( NetworkRequest & ); void onRequestProgress ( NetworkRequest &, off_t, off_t dlnow, off_t, off_t ); void onRequestFinished ( NetworkRequest &req , const NetworkRequestError &err ); const NetworkRequestError &error () const { return _error; } SignalProxy< void () > sigFinished() { return _sigFinished; } bool toMetalinkGuard () const { return _gotMetalink; } std::shared_ptr toDlMetaLinkInfoState(); bool toSimpleDownloadGuard () const; #if ENABLE_ZCHUNK_COMPRESSION bool toZckHeadDownloadGuard () const; std::shared_ptr toDLZckHeadState(); #endif std::shared_ptr _request; private: NetworkRequestError _error; bool _gotMetalink = false; Signal< void () > _sigFinished; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/final_p.cc000066400000000000000000000017131476576476200307250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include "final_p.h" namespace zyppng { FinishedState::FinishedState(NetworkRequestError &&error, DownloadPrivate &parent) : SimpleState( parent ) , _error( std::move(error) ) { MIL << "About to enter FinishedState for url " << parent._spec.url() << std::endl; } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/final_p.h000066400000000000000000000024601476576476200305670ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_FINAL_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_FINAL_P_H_INCLUDED #include "base_p.h" #include namespace zyppng { /*! * Final state implementation, we enter this state as the very last step. It carries * the result of the whole operation. */ struct FinishedState : public SimpleState< DownloadPrivate, Download::Finished, true > { FinishedState ( NetworkRequestError &&error, DownloadPrivate &parent ); void enter (){} void exit (){} NetworkRequestError _error; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/initial_p.cc000066400000000000000000000050021476576476200312600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include "initial_p.h" #if ENABLE_ZCHUNK_COMPRESSION #include #include "zck_p.h" #endif namespace zyppng { void InitialState::enter(){ MIL_MEDIA << "Entering initial state" << std::endl; } void InitialState::exit(){ MIL_MEDIA << "Leaving initial state" << std::endl; } void InitialState::initiate() { auto &sm = stateMachine(); const auto &spec = sm._spec; if ( spec.checkExistsOnly() ) { MIL_MEDIA << "Check exists only enabled" << std::endl; return _sigTransitionToDlNormalFileState.emit(); } #if ENABLE_ZCHUNK_COMPRESSION bool deltaZck = ZckHelper::isZchunkFile( spec.deltaFile() ); #endif if ( spec.metalinkEnabled() ) { #if ENABLE_ZCHUNK_COMPRESSION if ( deltaZck && spec.headerSize() > 0 ) { MIL_MEDIA << "We might have a zck file, detecting metalink first" << std::endl; return _sigTransitionToDetectMetalinkState.emit(); } #endif MIL_MEDIA << "No zchunk data available but metalink requested, going to download metalink directly." << std::endl; return _sigTransitionToDlMetaLinkInfoState.emit(); } #if ENABLE_ZCHUNK_COMPRESSION // no Metalink, maybe we can directly download zck if ( deltaZck && spec.headerSize() > 0 ) { MIL_MEDIA << "No metalink but zckunk data availble trying to download ZckHead directly." << std::endl; return _sigTransitionToDLZckHeaderState.emit(); } #endif MIL_MEDIA << "Fallback to normal DL" << std::endl; _sigTransitionToDlNormalFileState.emit(); } #if ENABLE_ZCHUNK_COMPRESSION std::shared_ptr InitialState::toDLZckHeadState() { // we have no mirrors, the range downloader would need to fall back to using the base URL return std::make_shared( std::vector { stateMachine()._spec.url() }, stateMachine() ); } #endif } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/initial_p.h000066400000000000000000000042701476576476200311300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_INITIAL_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_INITIAL_P_H_INCLUDED #include "base_p.h" #include namespace zyppng { #if ENABLE_ZCHUNK_COMPRESSION struct DLZckHeadState; #endif /*! * Initial state implementation, this state is used only to kickstart the statemachine */ struct InitialState : public zyppng::SimpleState< DownloadPrivate, Download::InitialState, false > { InitialState ( DownloadPrivate &parent ) : SimpleState( parent ){} void enter (); void exit (); void initiate(); SignalProxy< void () > sigTransitionToDetectMetalinkState() { return _sigTransitionToDetectMetalinkState; } SignalProxy< void () > sigTransitionToDlMetaLinkInfoState() { return _sigTransitionToDlMetaLinkInfoState; } #if ENABLE_ZCHUNK_COMPRESSION SignalProxy< void () > sigTransitionToDLZckHeaderState() { return _sigTransitionToDLZckHeaderState; } #endif SignalProxy< void () > sigTransitionToDlNormalFileState() { return _sigTransitionToDlNormalFileState; } #if ENABLE_ZCHUNK_COMPRESSION std::shared_ptr toDLZckHeadState (); #endif private: Signal _sigTransitionToDetectMetalinkState; Signal _sigTransitionToDlMetaLinkInfoState; #if ENABLE_ZCHUNK_COMPRESSION Signal _sigTransitionToDLZckHeaderState; #endif Signal _sigTransitionToDlNormalFileState; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/metalink_p.cc000066400000000000000000000136461476576476200314500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include "metalink_p.h" #include "final_p.h" #include #include namespace zyppng { DlMetalinkState::DlMetalinkState(zypp::media::MediaBlockList &&blockList, std::vector &&mirrors, DownloadPrivate &parent) : RangeDownloaderBaseState( std::move(mirrors), parent ) , _blockList( std::move(blockList) ) { MIL << "About to enter DlMetalinkState for url " << parent._spec.url() << std::endl; } void DlMetalinkState::enter() { auto &sm = stateMachine(); const auto &spec = sm._spec; _fileSize = sm._spec.expectedFileSize(); //first we try to reuse blocks from the deltafile , if we have one if ( !spec.deltaFile().empty() ) { zypp::PathInfo dFileInfo ( spec.deltaFile() ); if ( dFileInfo.isFile() && dFileInfo.isR() ) { FILE *f = fopen( spec.targetPath().asString().c_str(), "w+b" ); if ( !f ) { setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, zypp::str::Format("Failed to open target file.(errno %1%)" ) % errno ) ); return; } try { _blockList.reuseBlocks ( f, spec.deltaFile().asString() ); } catch ( ... ) { } fclose( f ); } else { DBG << "Delta XFER: Delta file: " << spec.deltaFile() << " does not exist or is not readable." << std::endl; } } else { DBG << "Delta XFER: No delta file given, can not reuse blocks." << std::endl; } // setup the base downloader _error = {}; _ranges.clear(); _failedRanges.clear(); _downloadedMultiByteCount = 0; if ( _blockList.haveFileChecksum() ) { _fileChecksumType = _blockList.fileChecksumType(); _fileChksumVec = _blockList.getFileChecksum(); } const size_t fLen = _blockList.getFilesize(); if ( _fileSize > 0 ) { // check if the file size as reported by zchunk is equal to the one we expect if ( _fileSize != fLen ) { return setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen, zypp::str::Format("Metalink file reports a different filesize than what was expected ( Meta: %1% != Exp: %2%).") % fLen % _fileSize ) ); } } else { _fileSize = fLen; } const auto maxConns = sm._requestDispatcher->maximumConcurrentConnections(); if ( sm._spec.preferredChunkSize() == 0 ) { const auto autoBlkSize = makeBlksize( _fileSize ); if ( maxConns == -1 ) { _preferredChunkSize = autoBlkSize; } else { _preferredChunkSize = _fileSize / maxConns; if ( _preferredChunkSize < autoBlkSize ) _preferredChunkSize = autoBlkSize; else if ( _preferredChunkSize > zypp::ByteCount( 100, zypp::ByteCount::M ) ) _preferredChunkSize = zypp::ByteCount( 100, zypp::ByteCount::M ); } } else { // spec chunk size overrules the automatic one _preferredChunkSize = sm._spec.preferredChunkSize(); } MIL << "Downloading " << sm._spec.url() << " with " << _preferredChunkSize << " chunk size over " << maxConns << std::endl; // remember how many bytes we need to download size_t bytesToDl = 0; // do we need to pad the digest when calculating the checksum for blocks const auto &chksumPad = _blockList.checksumPad (); for ( size_t i = 0; i < _blockList.numBlocks(); i++ ) { const auto &mediaBlock = _blockList.getBlock( i ); const auto &blockSum = _blockList.getChecksum ( i ); _ranges.push_back( Block{{ ._start = static_cast(mediaBlock.off), ._len = mediaBlock.size, ._chksumtype = _blockList.getChecksumType(), ._checksum = blockSum, ._relevantDigestLen = blockSum.size( ), ._chksumPad = chksumPad > 0 ? chksumPad : std::optional() }}); bytesToDl += mediaBlock.size; } // substract the length of the blocks we have to download from the overall file size _downloadedMultiByteCount = fLen - bytesToDl; ensureDownloadsRunning(); } void DlMetalinkState::exit() { cancelAll( NetworkRequestError() ); } void DlMetalinkState::setFinished() { if ( _fileChecksumType.size() && _fileChksumVec ) { //TODO move this into a external application so we do not need to block on it //need to check file digest zypp::Digest dig; dig.create( _fileChecksumType ); std::ifstream istrm( stateMachine()._spec.targetPath().asString(), std::ios::binary); if ( !istrm.is_open() ) { setFailed( "Failed to verify file digest (Could not open target file)." ); return; } if ( !dig.update( istrm ) ) { setFailed( "Failed to verify file digest (Could not read target file)." ); return; } const auto &calculatedChksum = dig.digestVector(); if ( *_fileChksumVec != calculatedChksum ) { setFailed( "Failed to verify file digest (Checksum did not match)." ); return; } } RangeDownloaderBaseState::setFinished(); } std::shared_ptr DlMetalinkState::transitionToFinished() { return std::make_shared( std::move(_error), stateMachine() ); } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/metalink_p.h000066400000000000000000000042231476576476200313010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_METALINK_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_METALINK_P_H_INCLUDED #include "base_p.h" #include "rangedownloader_p.h" #include #include namespace zyppng { struct FinishedState; /*! * Metalink download state implementation, this downloads the requested file * in metalink ranges. */ struct DlMetalinkState : public RangeDownloaderBaseState { static constexpr auto stateId = Download::DlMetalink; DlMetalinkState ( zypp::media::MediaBlockList &&blockList, std::vector &&mirrors, DownloadPrivate &parent ); void enter (); void exit (); void setFinished () override; std::shared_ptr transitionToFinished (); // in case of error we might fall back, except for the errors listed here bool toFinalStateCondition () { return ( _error.type() == NetworkRequestError::Unauthorized || _error.type() == NetworkRequestError::AuthFailed ); } bool toSimpleDownloadCondition () { return !toFinalStateCondition(); } SignalProxy< void () > sigFinished() { return _sigFinished; } SignalProxy< void () > sigFailed() { return _sigFailed; } private: zypp::media::MediaBlockList _blockList; std::string _fileChecksumType; std::optional> _fileChksumVec; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/metalinkinfo_p.cc000066400000000000000000000122121476576476200323100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include "metalinkinfo_p.h" namespace zyppng { namespace { } DlMetaLinkInfoState::DlMetaLinkInfoState(DownloadPrivate &parent) : BasicDownloaderStateBase( parent ) { MIL << "Downloading metalink/zsync on " << parent._spec.url() << std::endl; } DlMetaLinkInfoState::DlMetaLinkInfoState(std::shared_ptr &&prevRequest, DownloadPrivate &parent) : BasicDownloaderStateBase( std::move(prevRequest), parent ) { MIL << "Downloading metalink/zsync on " << parent._spec.url() << std::endl; } std::shared_ptr DlMetaLinkInfoState::transitionToFinished() { MIL << "Downloading on " << stateMachine()._spec.url() << " transition to final state. " << std::endl; return std::make_shared( std::move(_error), stateMachine() ); } std::shared_ptr DlMetaLinkInfoState::transitionToPrepareMulti() { _request->disconnectSignals(); auto prepareMode = ( _detectedMetaType == MetaDataType::MetaLink ? PrepareMultiState::Metalink : PrepareMultiState::Zsync ); auto nState = std::make_shared( std::move( _request ), prepareMode, stateMachine() ); _request = nullptr; return nState; } bool DlMetaLinkInfoState::initializeRequest(std::shared_ptr &r ) { MIL << "Requesting Metadata info from server!" << std::endl; r->transferSettings().addHeader("Accept: */*, application/x-zsync, application/metalink+xml, application/metalink4+xml"); return BasicDownloaderStateBase::initializeRequest(r); } void DlMetaLinkInfoState::gotFinished() { // some proxies do not store the content type, so also look at the file to find // out if we received a metalink (bnc#649925) if ( _detectedMetaType == MetaDataType::None ) _detectedMetaType = zypp::media::looks_like_meta_file( _request->targetFilePath() ); if ( _detectedMetaType == MetaDataType::None ) { // Move to finished state MIL << "Downloading on " << stateMachine()._spec.url() << " was successful, no metalink/zsync data. " << std::endl; return BasicDownloaderStateBase::gotFinished(); } auto &sm = stateMachine(); if ( sm._stopOnMetalink ) { MIL << "Stopping after receiving MetaData as requested" << std::endl; sm._stoppedOnMetalink = true; return BasicDownloaderStateBase::gotFinished(); } // Move to Prepare Multi state if ( _detectedMetaType == MetaDataType::Zsync ) MIL << "Downloading on " << sm._spec.url() << " returned a Zsync file " << std::endl; else MIL << "Downloading on " << sm._spec.url() << " returned a Metalink file" << std::endl; _sigGotMetadata.emit(); } void DlMetaLinkInfoState::handleRequestProgress(NetworkRequest &req, off_t dltotal, off_t dlnow) { auto &sm = stateMachine(); if ( _detectedMetaType == MetaDataType::None && dlnow < zypp::media::minMetalinkProbeSize ) { // can't tell yet, ... return sm._sigAlive.emit( *sm.z_func(), dlnow ); } if ( _detectedMetaType == MetaDataType::None ) { std::string cType = req.contentType(); if ( cType.find("application/x-zsync") == 0 ) _detectedMetaType = MetaDataType::Zsync; else if ( cType.find("application/metalink+xml") == 0 || cType.find("application/metalink4+xml") == 0 ) _detectedMetaType = MetaDataType::MetaLink; } if ( _detectedMetaType == MetaDataType::None ) { _detectedMetaType = zypp::media::looks_like_meta_data( req.peekData( 0, zypp::media::minMetalinkProbeSize ) ); } if ( _detectedMetaType != MetaDataType::None ) { // this is a metalink file change the expected filesize if ( zypp::ByteCount( 2, zypp::ByteCount::MB) < req.downloadedByteCount() ) { WAR << "Metadata file exceeds 2MB in filesize, aborting."<cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) ); return; } return sm._sigAlive.emit( *sm.z_func(), dlnow ); } else { // still no metalink, we assume a normal download, not perfect though if ( !_fallbackMilWritten ) { _fallbackMilWritten = true; MIL << "No Metalink file detected after " << zypp::media::minMetalinkProbeSize << ", falling back to normal progress updates" << std::endl; } return BasicDownloaderStateBase::handleRequestProgress( req, dltotal, dlnow ); } } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/metalinkinfo_p.h000066400000000000000000000046221476576476200321600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_METALINKINFO_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_METALINKINFO_P_H_INCLUDED #include "base_p.h" #include "basicdownloader_p.h" #include #include namespace zyppng { struct FinishedState; struct PrepareMultiState; using MetaDataType = zypp::media::MetaDataType; /*! * State to download the actual metalink file, we can however not be 100% sure that we actually * will get a metalink file, so we need to check the content type or in bad cases the * data we get from the server. */ struct DlMetaLinkInfoState : public BasicDownloaderStateBase { static constexpr auto stateId = Download::DlMetaLinkInfo; DlMetaLinkInfoState( DownloadPrivate &parent ); DlMetaLinkInfoState( std::shared_ptr &&prevRequest, DownloadPrivate &parent ); SignalProxy< void () > sigFinished() { return _sigFinished; } SignalProxy< void () > sigGotMetadata() { return _sigGotMetadata; } SignalProxy< void () > sigFailed() { return _sigFailed; } std::shared_ptr transitionToFinished (); std::shared_ptr transitionToPrepareMulti (); bool initializeRequest( std::shared_ptr &r ) override; void gotFinished () override; protected: MetaDataType _detectedMetaType = MetaDataType::None; Signal< void () > _sigGotMetadata; void handleRequestProgress ( NetworkRequest &req, off_t dltotal, off_t dlnow ) override; private: bool _fallbackMilWritten = false; //< Flag to know if we already logged that we fall back to the normal progress }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/mirrorhandling_p.cc000066400000000000000000000045421476576476200326560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include "mirrorhandling_p.h" namespace zyppng { MirrorHandlingStateBase::MirrorHandlingStateBase( DownloadPrivate &parent ) : BasicState(parent) { } MirrorHandlingStateBase::~MirrorHandlingStateBase() { _sigMirrorsReadyConn.disconnect(); } MirrorHandlingStateBase::PrepareResult MirrorHandlingStateBase::prepareNextMirror() { auto &sm = stateMachine(); auto res = sm._mirrorControl->pickBestMirror( _fileMirrors ); if ( res.code == MirrorControl::PickResult::Again ) { if ( !_sigMirrorsReadyConn ) _sigMirrorsReadyConn = sm._mirrorControl->connectFunc( &MirrorControl::sigNewMirrorsReady, [this](){ _sigMirrorsReadyConn.disconnect(); prepareNextMirror(); }, *this ); return Delayed; } else if ( res.code == MirrorControl::PickResult::Unknown ) { failedToPrepare(); return Failed; } mirrorReceived( res.result ); return Ok; } NetworkRequestError MirrorHandlingStateBase::setupMirror( const MirrorControl::MirrorPick &pick, Url &url, TransferSettings &set ) { auto &sm = stateMachine(); Url myUrl; TransferSettings settings; myUrl = *pick.first; settings = sm._spec.settings(); //if this is a different host than the initial request, we reset username/password if ( myUrl.getHost() != sm._spec.url().getHost() ) { settings.setUsername( std::string() ); settings.setPassword( std::string() ); settings.setAuthType( std::string() ); } NetworkRequestError err = sm.safeFillSettingsFromURL( myUrl, settings ); if ( err.type() != NetworkRequestError::NoError ) return err; url = myUrl; set = settings; return err; } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/mirrorhandling_p.h000066400000000000000000000046471476576476200325260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_MIRRORHANDLING_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_MIRRORHANDLING_P_H_INCLUDED #include #include "base_p.h" namespace zyppng { /*! * superclass state implementation for all states that need to handle async mirror requests */ struct MirrorHandlingStateBase : public zyppng::BasicState< DownloadPrivate, false > { MirrorHandlingStateBase ( DownloadPrivate &parent ); ~MirrorHandlingStateBase() override; enum PrepareResult { Failed, Ok, Delayed }; /*! * Request a new mirror, the \a PrepareResult shows if \ref setupMirror was already called * or if the request was \a Delayed. */ PrepareResult prepareNextMirror (); /*! * Common code to setup a mirror after it was received, can result in errors if the mirror url contains * settings that are invalid. * Will return settings and url via parameters. */ NetworkRequestError setupMirror( const MirrorControl::MirrorPick &pick, Url &url, TransferSettings &set ); /*! * This is called once a mirror became ready, either directly if a mirror is ready or it was delayed * and called asynchronously */ virtual void mirrorReceived ( MirrorControl::MirrorPick mirror ) = 0; /*! * Gets called in case a mirror failed to prepare, * probably because none of the mirrors in \a _fileMirrors is known by \ref MirrorControl */ virtual void failedToPrepare (){}; std::vector _fileMirrors; //< all mirrors of the currently requested file private: connection _sigMirrorsReadyConn; //< the internal connection to the mirrors ready signal }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/normal_p.cc000066400000000000000000000025431476576476200311260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include "normal_p.h" #include "final_p.h" namespace zyppng { DlNormalFileState::DlNormalFileState( DownloadPrivate &parent ) : BasicDownloaderStateBase( parent ) { MIL << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl; } DlNormalFileState::DlNormalFileState( std::shared_ptr &&oldReq, DownloadPrivate &parent ) : BasicDownloaderStateBase( std::move(oldReq), parent ) { MIL << "About to enter DlNormalFileState for url " << parent._spec.url() << std::endl; } std::shared_ptr DlNormalFileState::transitionToFinished() { return std::make_shared( std::move(_error), stateMachine() ); } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/normal_p.h000066400000000000000000000031011476576476200307570ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_NORMAL_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_NORMAL_P_H_INCLUDED #include "base_p.h" #include "basicdownloader_p.h" #include namespace zyppng { struct FinishedState; /*! * Just a plain normal file download, no metalink, nothing fancy. * If this fails we have no more fallbacks */ struct DlNormalFileState : public BasicDownloaderStateBase { static constexpr auto stateId = Download::DlSimple; DlNormalFileState( DownloadPrivate &parent ); DlNormalFileState( std::shared_ptr &&oldReq, DownloadPrivate &parent ); std::shared_ptr transitionToFinished (); SignalProxy< void () > sigFinished() { return _sigFinished; } SignalProxy< void () > sigFailed() { return _sigFailed; } }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/preparemulti_p.cc000066400000000000000000000205371476576476200323520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include "preparemulti_p.h" #if ENABLE_ZCHUNK_COMPRESSION #include #include "zck_p.h" #endif namespace zyppng { PrepareMultiState::PrepareMultiState( std::shared_ptr oldReq, Mode m, DownloadPrivate &parent ) : SimpleState( parent ) , _mode(m) , _oldRequest(std::move( oldReq )) { MIL << "About to enter PrepareMultiState for URL: " << parent._spec.url() << std::endl; } void PrepareMultiState::enter( ) { auto &sm = stateMachine(); const auto &spec = sm._spec; const auto &url = spec.url(); const auto &targetPath = spec.targetPath(); #if ENABLE_ZCHUNK_COMPRESSION _haveZckData = (ZckHelper::isZchunkFile( spec.deltaFile() ) && spec.headerSize() > 0); MIL << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=" << _haveZckData << std::endl; #else MIL << " Upgrading request for URL: "<< url << " to multipart download , which zckunk=false" << std::endl; #endif //we have a metalink download, lets parse it and see what we got _mirrors.clear(); std::vector mirrs; try { const auto &parseMetadata = [&]( auto &&parser ) { using T = std::decay_t; constexpr auto metalinkMode = std::is_same< T, zypp::media::MetaLinkParser>(); parser.parse( targetPath ); // we only care about the metalink chunks if we have no zchunk data #if ENABLE_ZCHUNK_COMPRESSION if ( !_haveZckData ) { #else if ( true ) { #endif auto bl = parser.getBlockList(); if ( !bl.haveBlocks() ) MIL << "Got no blocks for URL " << spec.url() << " but got filesize? " << bl.getFilesize() << std::endl; if ( bl.haveBlocks() || bl.haveFilesize() ) _blockList = std::move(bl); } //migrate some settings from the base url to the mirror if constexpr ( !metalinkMode ) { const auto &urlList = parser.getUrls(); std::for_each( urlList.begin(), urlList.end(), [&]( const auto &url ) { mirrs.push_back( { 0, -1, url } ); }); } else { mirrs = parser.getMirrors(); } for ( auto urliter = mirrs.begin(); urliter != mirrs.end(); ++urliter ) { try { const std::string scheme = urliter->url.getScheme(); if (scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp") { if ( !sm._requestDispatcher->supportsProtocol( urliter->url )) { urliter = mirrs.erase( urliter ); continue; } urliter->url = ::internal::propagateQueryParams( urliter->url, url ); _mirrors.push_back( urliter->url ); } } catch (...) { } } if ( mirrs.empty() ) { mirrs.push_back( { 0, -1, url } ); _mirrors.push_back( url ); } }; switch( _mode ) { case Zsync: { parseMetadata( zypp::media::ZsyncParser() ); break; } case Metalink: { parseMetadata( zypp::media::MetaLinkParser() ); break; } } } catch ( const zypp::Exception &ex ) { std::string err = zypp::str::Format("Failed to parse metalink information.(%1%)" ) % ex.asUserString(); WAR << err << std::endl; _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(err) ); _sigFailed.emit(); return; } if ( mirrs.size() == 0 ) { std::string err = zypp::str::Format("Invalid metalink information.( No mirrors in metalink file)" ); WAR << err << std::endl; _error = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(err) ); _sigFailed.emit(); return; } //remove the metalink file zypp::filesystem::unlink( targetPath ); _mirrorControlReadyConn = sm._mirrorControl->connect( &MirrorControl::sigNewMirrorsReady, *this, &PrepareMultiState::onMirrorsReady ); // this will emit a mirrorsReady signal once some connection tests have been done sm._mirrorControl->registerMirrors( mirrs ); } void PrepareMultiState::exit() { // if we did not pass on the existing request to the next state we destroy it here if ( _oldRequest ) _oldRequest.reset(); } void PrepareMultiState::onMirrorsReady() { auto &sm = stateMachine(); const auto &spec = sm._spec; const auto &url = spec.url(); _mirrorControlReadyConn.disconnect(); #if ENABLE_ZCHUNK_COMPRESSION if ( _haveZckData ) { _sigFinished.emit(); return; } #endif // we have no zchunk data, so for a multi download we need a blocklist if ( !_blockList.haveBlocks() ) { //if we have no filesize we can not generate a blocklist, we need to fall back to normal download if ( !_blockList.haveFilesize() ) { //fall back to normal download but use a mirror from the mirror list //otherwise we get HTTPS to HTTP redirect errors _sigFallback.emit(); return; } else { //we generate a blocklist on the fly based on the filesize MIL << "Generate blocklist, since there was none in the metalink file." << url << std::endl; off_t currOff = 0; off_t filesize = _blockList.getFilesize(); const auto prefSize = std::max( sm._spec.preferredChunkSize(), zypp::ByteCount(4, zypp::ByteCount::K) ); while ( currOff < filesize ) { auto blksize = filesize - currOff ; if ( blksize > prefSize ) blksize = prefSize; _blockList.addBlock( currOff, blksize ); currOff += blksize; } MIL_MEDIA << "Generated blocklist: " << std::endl << _blockList << std::endl << " End blocklist " << std::endl; } } _sigFinished.emit(); } std::shared_ptr PrepareMultiState::fallbackToNormalTransition() { MIL << "No blocklist and no filesize, falling back to normal download for URL " << stateMachine()._spec.url() << std::endl; std::shared_ptr ptr; if ( _oldRequest ) { ptr = std::make_shared( std::move(_oldRequest), stateMachine() ); } else { ptr = std::make_shared( stateMachine() ); } ptr->_fileMirrors = std::move(_mirrors); if ( _blockList.haveFileChecksum() ) { ptr->_chksumtype = _blockList.fileChecksumType(); ptr->_chksumVec = _blockList.getFileChecksum(); } return ptr; } std::shared_ptr PrepareMultiState::transitionToMetalinkDl() { return std::make_shared( std::move(_blockList), std::move(_mirrors), stateMachine() ); } std::shared_ptr PrepareMultiState::transitionToFinished() { return std::make_shared( std::move(_error), stateMachine() ); } #if ENABLE_ZCHUNK_COMPRESSION std::shared_ptr PrepareMultiState::transitionToZckHeadDl() { if ( _oldRequest ) return std::make_shared( std::move(_mirrors), std::move(_oldRequest), stateMachine() ); return std::make_shared( std::move(_mirrors), stateMachine() ); } bool PrepareMultiState::toZckHeadDownloadGuard() const { return ( stateMachine().hasZckInfo() ); } #endif bool PrepareMultiState::toMetalinkDownloadGuard() const { #if ENABLE_ZCHUNK_COMPRESSION return (!toZckHeadDownloadGuard()); #else return true; #endif } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/preparemulti_p.h000066400000000000000000000056701476576476200322150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_PREPAREMULTI_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_PREPAREMULTI_P_H_INCLUDED #include "base_p.h" #include #include namespace zyppng { struct DlNormalFileState; struct DlMetalinkState; struct FinishedState; #if ENABLE_ZCHUNK_COMPRESSION struct DLZckHeadState; #endif /*! * Metalink peparation state implementation, this state parses the downloaded Metalink file * and registeres all mirrors in \ref MirrorControl. Once the first mirror becomes ready it passes on * to the next state. */ struct PrepareMultiState : public zyppng::SimpleState< DownloadPrivate, Download::PrepareMulti, false > { using Request = DownloadPrivateBase::Request; enum Mode { Zsync, Metalink }; PrepareMultiState ( std::shared_ptr oldReq, Mode m, DownloadPrivate &parent ); void enter (); void exit (); const NetworkRequestError &error () const { return _error; } SignalProxy< void () > sigFinished() { return _sigFinished; } SignalProxy< void () > sigFailed() { return _sigFailed; } SignalProxy< void () > sigFallback() { return _sigFallback; } std::shared_ptr fallbackToNormalTransition (); std::shared_ptr transitionToMetalinkDl (); std::shared_ptr transitionToFinished (); #if ENABLE_ZCHUNK_COMPRESSION std::shared_ptr transitionToZckHeadDl (); bool toZckHeadDownloadGuard () const; #endif bool toMetalinkDownloadGuard () const; std::vector _mirrors; zypp::media::MediaBlockList _blockList; private: sigc::connection _mirrorControlReadyConn; void onMirrorsReady (); #if ENABLE_ZCHUNK_COMPRESSION bool _haveZckData = false; //< do we have zck data ready #endif Mode _mode; //< wether we should expect a metalink or zsync file std::shared_ptr _oldRequest; //< exising request of previous states, that the next states might reuse NetworkRequestError _error; Signal< void () > _sigFinished; Signal< void () > _sigFallback; Signal< void () > _sigFailed; }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/rangedownloader_p.cc000066400000000000000000000403741476576476200330150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include #include "rangedownloader_p.h" namespace zyppng { void RangeDownloaderBaseState::onRequestStarted( NetworkRequest & ) { } void RangeDownloaderBaseState::onRequestProgress( NetworkRequest &, off_t , off_t, off_t , off_t ) { off_t dlnowMulti = _downloadedMultiByteCount; for( const auto &req : _runningRequests ) { dlnowMulti += req->downloadedByteCount(); } if ( !assertExpectedFilesize( dlnowMulti ) ) return; stateMachine()._sigProgress.emit( *stateMachine().z_func(), _fileSize, dlnowMulti ); } void RangeDownloaderBaseState::onRequestFinished( NetworkRequest &req, const zyppng::NetworkRequestError &err ) { auto lck = stateMachine().z_func()->shared_from_this(); auto it = std::find_if( _runningRequests.begin(), _runningRequests.end(), [ &req ]( const std::shared_ptr &r ) { return ( r.get() == &req ); }); if ( it == _runningRequests.end() ) return; auto reqLocked = *it; //remove from running _runningRequests.erase( it ); //feed the working URL back into the mirrors in case there are still running requests that might fail // @TODO , finishing the transfer might never be called in case of cancelling the request, need a better way to track running transfers if ( reqLocked->_myMirror ) reqLocked->_myMirror->finishTransfer( !err.isError() ); if ( err.isError() ) { return handleRequestError( reqLocked, err ); } _downloadedMultiByteCount += req.downloadedByteCount(); if ( !assertExpectedFilesize( _downloadedMultiByteCount ) ) { return; } MIL << req.nativeHandle() << " " << "Request finished successfully."<requestedRanges(); std::for_each( rngs.begin(), rngs.end(), [&req]( const auto &b ){ DBG_MEDIA << req.nativeHandle() << " " << "-> Block " << b._start << " finished." << std::endl; } ); auto restartReqWithBlock = [ this ]( std::shared_ptr &req, std::vector &&blocks ) { MIL << req->nativeHandle() << " " << "Reusing Request to download blocks:"<url().getScheme() ) ) ) { return setFailed( "Failed to restart request with new blocks." ); } return; } else { //if we have failed blocks, try to download them with this mirror if ( !_failedRanges.empty() ) { auto fblks = getNextFailedBlocks( reqLocked->url().getScheme() ); MIL << req.nativeHandle() << " " << "Reusing to download failed blocks: "<_originalUrl ); // make sure downloads are running, at this point ensureDownloadsRunning(); } void RangeDownloaderBaseState::handleRequestError( std::shared_ptr req, const zyppng::NetworkRequestError &err ) { bool retry = false; auto &parent = stateMachine(); //Handle the auth errors explicitly, we need to give the user a way to put in new credentials //if we get valid new credentials we can retry the request if ( err.type() == NetworkRequestError::Unauthorized || err.type() == NetworkRequestError::AuthFailed ) { retry = parent.handleRequestAuthError( req, err ); } else { //if a error happens during a multi download we try to use another mirror to download the failed block MIL << req->nativeHandle() << " " << "Request failed " << req->extendedErrorString() << "(" << req->url() << ")" << std::endl; if ( req->lastRedirectInfo ().size () ) MIL << req->nativeHandle() << " Last redirection target was: " << req->lastRedirectInfo () << std::endl; NetworkRequestError dummyErr; const auto &fRanges = req->failedRanges(); try { std::transform( fRanges.begin(), fRanges.end(), std::back_inserter(_failedRanges), [ &req ]( const auto &r ){ Block b = std::any_cast(r.userData);; b._failedWithErr = req->error(); if ( zypp::env::ZYPP_MEDIA_CURL_DEBUG() > 3 ) DBG_MEDIA << "Adding failed block to failed blocklist: " << b._start << " " << b._len << " (" << req->error().toString() << " [" << req->error().nativeErrorString()<< "])" << std::endl; return b; }); // try to fill the open spot right away ensureDownloadsRunning(); return; } catch ( const zypp::Exception &ex ) { //we just log the exception and fall back to a normal download WAR << "Multipart download failed: " << ex.asString() << std::endl; } } //if rety is true we just enqueue the request again, usually this means authentication was updated if ( retry ) { //make sure this request will run asap req->setPriority( parent._defaultSubRequestPriority ); //this is not a new request, only add to queues but do not connect signals again addNewRequest( req, false ); return; } //we do not have more mirrors left we can try cancelAll ( err ); // not all hope is lost, maybe a normal download can work out? // fall back to normal download _sigFailed.emit(); } void RangeDownloaderBaseState::ensureDownloadsRunning() { if ( _inEnsureDownloadsRunning ) return; zypp::OnScopeExit clearFlag( [this]() { _inEnsureDownloadsRunning = false; }); _inEnsureDownloadsRunning = true; //check if there is still work to do while ( _ranges.size() || _failedRanges.size() ) { // download was already finished if ( _error.isError() ) return; if ( _runningRequests.size() >= 10 ) break; // prepareNextMirror will automatically call mirrorReceived() once there is a mirror ready const auto &res = prepareNextMirror(); // if mirrors are delayed we stop here, once the mirrors are ready we get called again if ( res == MirrorHandlingStateBase::Delayed ) return; else if ( res == MirrorHandlingStateBase::Failed ) { failedToPrepare(); return; } } // check if we are done at this point if ( _runningRequests.empty() ) { if ( _failedRanges.size() || _ranges.size() ) { setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Unable to download all blocks." ) ); return; } // seems we were successfull , transition to finished state setFinished(); } } void RangeDownloaderBaseState::mirrorReceived( MirrorControl::MirrorPick mirror ) { auto &parent = stateMachine(); Url myUrl; TransferSettings settings; auto err = setupMirror( mirror, myUrl, settings ); if ( err.isError() ) { WAR << "Failure to setup mirror " << myUrl << " with error " << err.toString() << "("<< err.nativeErrorString() << "), dropping it from the list of mirrors." << std::endl; // if a mirror fails , we remove it from our list _fileMirrors.erase( mirror.first ); // make sure this is retried ensureDownloadsRunning(); return; } auto blocks = getNextBlocks( myUrl.getScheme() ); if ( !blocks.size() ) blocks = getNextFailedBlocks( myUrl.getScheme() ); if ( !blocks.size() ) { // We have no blocks. In theory, that should never happen, but for safety, we error out here. It is better than // getting stuck. setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Mirror requested after all blocks were downloaded." ) ); return; } const auto &spec = parent._spec; std::shared_ptr req = std::make_shared( ::internal::clearQueryString( myUrl ), spec.targetPath(), NetworkRequest::WriteShared ); req->_myMirror = mirror.second; req->_originalUrl = myUrl; req->setPriority( parent._defaultSubRequestPriority ); req->transferSettings() = settings; // if we download chunks we do not want to wait for too long on mirrors that have slow activity // note: this sets the activity timeout, not the download timeout req->transferSettings().setTimeout( 2 ); MIL << "Creating Request to download blocks via mirror: " << myUrl << std::endl; if ( !addBlockRanges( req, std::move(blocks) ) ) { setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Failed to add blocks to request." ) ); return; } // we just use a mirror once per file, remove it from the list _fileMirrors.erase( mirror.first ); addNewRequest( req ); // trigger next downloads ensureDownloadsRunning(); } void RangeDownloaderBaseState::failedToPrepare() { // it was impossible to find a new mirror, check if we still have running requests we can wait for, if not // we can only fail at this point if ( !_runningRequests.size() ) { setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "No valid mirror found" ) ); } } void RangeDownloaderBaseState::reschedule() { bool triggerResched = false; for ( auto &req : _runningRequests ) { if ( req->state() == NetworkRequest::Pending ) { triggerResched = true; req->setPriority( NetworkRequest::Critical, false ); } } if ( triggerResched ) stateMachine()._requestDispatcher->reschedule(); } void RangeDownloaderBaseState::addNewRequest(const std::shared_ptr& req , const bool connectSignals) { if ( connectSignals ) req->connectSignals( *this ); _runningRequests.push_back( req ); stateMachine()._requestDispatcher->enqueue( req ); if ( req->_myMirror ) req->_myMirror->startTransfer(); } bool RangeDownloaderBaseState::assertExpectedFilesize( off_t currentFilesize ) { const off_t expFSize = stateMachine()._spec.expectedFileSize(); if ( expFSize > 0 && expFSize < currentFilesize ) { setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen ) ); return false; } return true; } /** * Just initialize the requests ranges from the internal blocklist */ bool RangeDownloaderBaseState::addBlockRanges ( const std::shared_ptr& req , const std::vector& blocks ) const { req->resetRequestRanges(); for ( const auto &block : blocks ) { if ( block._checksum.size() && block._chksumtype.size() ) { std::optional dig = zypp::Digest(); if ( !dig->create( block._chksumtype ) ) { WAR_MEDIA << "Trying to create Digest with chksum type " << block._chksumtype << " failed " << std::endl; return false; } if ( zypp::env::ZYPP_MEDIA_CURL_DEBUG() > 3 ) DBG_MEDIA << "Starting block " << block._start << " with checksum " << zypp::Digest::digestVectorToString( block._checksum ) << "." << std::endl; req->addRequestRange( block._start, block._len, std::move(dig), block._checksum, std::any( block ), block._relevantDigestLen, block._chksumPad ); } else { if ( zypp::env::ZYPP_MEDIA_CURL_DEBUG() > 3 ) DBG_MEDIA << "Starting block " << block._start << " without checksum." << std::endl; req->addRequestRange( block._start, block._len, {}, {}, std::any( block ) ); } } return true; } void zyppng::RangeDownloaderBaseState::setFailed(NetworkRequestError &&err) { _error = std::move( err ); cancelAll( _error ); zypp::filesystem::unlink( stateMachine()._spec.targetPath() ); _sigFailed.emit(); } void RangeDownloaderBaseState::setFailed(std::string &&reason) { setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(reason) ) ); } void RangeDownloaderBaseState::setFinished() { _error = NetworkRequestError(); _sigFinished.emit(); } void RangeDownloaderBaseState::cancelAll(const NetworkRequestError &err) { while( _runningRequests.size() ) { auto req = _runningRequests.back(); req->disconnectSignals(); _runningRequests.pop_back(); stateMachine()._requestDispatcher->cancel( *req, err ); if ( req->_myMirror ) req->_myMirror->cancelTransfer(); } } std::vector RangeDownloaderBaseState::getNextBlocks( const std::string &urlScheme ) { std::vector blocks; const auto prefSize = std::max( _preferredChunkSize, zypp::ByteCount(4, zypp::ByteCount::K) ); size_t accumulatedSize = 0; bool canDoRandomBlocks = ( zypp::str::hasPrefixCI( urlScheme, "http") ); std::optional lastBlockEnd; while ( _ranges.size() && accumulatedSize < prefSize ) { const auto &r = _ranges.front(); if ( !canDoRandomBlocks && lastBlockEnd ) { if ( static_cast(r._start) != (*lastBlockEnd)+1 ) break; } lastBlockEnd = r._start + r._len - 1; accumulatedSize += r._len; blocks.push_back( std::move( _ranges.front() ) ); _ranges.pop_front(); } DBG_MEDIA << "Accumulated " << blocks.size() << " blocks with accumulated size of: " << accumulatedSize << "." << std::endl; return blocks; } std::vector RangeDownloaderBaseState::getNextFailedBlocks( const std::string &urlScheme ) { const auto prefSize = std::max( _preferredChunkSize, zypp::ByteCount(4, zypp::ByteCount::K) ); // sort the failed requests by block number, this should make sure get them in offset order as well _failedRanges.sort( []( const auto &a , const auto &b ){ return a._start < b._start; } ); bool canDoRandomBlocks = ( zypp::str::hasPrefixCI( urlScheme, "http") ); std::vector fblks; std::optional lastBlockEnd; size_t accumulatedSize = 0; while ( _failedRanges.size() ) { const auto &block =_failedRanges.front(); //we need to check if we have consecutive blocks because only http mirrors support random request ranges if ( !canDoRandomBlocks && lastBlockEnd ) { if ( static_cast(block._start) != (*lastBlockEnd)+1 ) break; } lastBlockEnd = block._start + block._len - 1; accumulatedSize += block._len; fblks.push_back( std::move( _failedRanges.front() )); _failedRanges.pop_front(); fblks.back()._retryCount += 1; if ( accumulatedSize >= prefSize ) break; } return fblks; } zypp::ByteCount RangeDownloaderBaseState::makeBlksize ( size_t filesize ) { // this case should never happen because we never start a multi download if we do not know the filesize beforehand if ( filesize == 0 ) return 4 * 1024 * 1024; else if ( filesize < 4*1024*1024 ) return filesize; else if ( filesize < 8*1024*1024 ) return 4*1024*1024; else if ( filesize < 16*1024*1024 ) return 8*1024*1024; else if ( filesize < 256*1024*1024 ) return 10*1024*1024; return 4*1024*1024; } } libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/rangedownloader_p.h000066400000000000000000000074061476576476200326560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_RANGEDOWNLOADER_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_RANGEDOWNLOADER_P_H_INCLUDED #include "base_p.h" #include "mirrorhandling_p.h" #include namespace zyppng { /*! * Generic state implementation for all states that download a file in blocks from * a fixed set of mirrors. */ struct RangeDownloaderBaseState : public MirrorHandlingStateBase { using Request = DownloadPrivateBase::Request; using Block = DownloadPrivateBase::Block; RangeDownloaderBaseState ( std::vector &&mirrors, DownloadPrivate &parent ) : MirrorHandlingStateBase(parent) { _fileMirrors = std::move(mirrors); } void ensureDownloadsRunning (); void reschedule (); const NetworkRequestError &error () const { return _error; } void setFailed ( NetworkRequestError &&err ); void setFailed ( std::string && reason ); virtual void setFinished ( ); void cancelAll ( const NetworkRequestError &err ); void onRequestStarted ( NetworkRequest & ); void onRequestProgress ( NetworkRequest &, off_t, off_t, off_t, off_t ); void onRequestFinished ( NetworkRequest &req , const NetworkRequestError &err ); // MirrorHandlingStateBase interface void mirrorReceived(MirrorControl::MirrorPick mirror) override; void failedToPrepare() override; static zypp::ByteCount makeBlksize ( size_t filesize ); protected: NetworkRequestError _error; bool _inEnsureDownloadsRunning = false; //< Flag to prevent multiple entry to ensureDownloadsRunning size_t _fileSize = 0; //< The expected filesize, this is used to make sure we do not write after the end offset of the expected file size zypp::ByteCount _preferredChunkSize = 0; //< The preferred chunk size we want to download per request std::list _ranges; //keep a list with failed blocks in case we run out of mirrors, //in that case we can retry to download them once we have a finished download std::list _failedRanges; off_t _downloadedMultiByteCount = 0; //< the number of bytes that were already fetched in RunningMulti state std::vector< std::shared_ptr > _runningRequests; // we only define the signals here and add the accessor functions in the subclasses, static casting of // the class type is not allowed at compile time, so they would not be useable in the transition table otherwise Signal< void () > _sigFinished; Signal< void () > _sigFailed; private: void handleRequestError( std::shared_ptr req, const zyppng::NetworkRequestError &err ); bool addBlockRanges(const std::shared_ptr& req, const std::vector& blocks ) const; void addNewRequest (const std::shared_ptr& req, const bool connectSignals = true ); bool assertExpectedFilesize ( off_t currentFilesize ); std::vector getNextBlocks ( const std::string &urlScheme ); std::vector getNextFailedBlocks( const std::string &urlScheme ); }; } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/zck_p.cc000066400000000000000000000131111476576476200304160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #if ENABLE_ZCHUNK_COMPRESSION #include #include #include #include #include #include "zck_p.h" #include #include #include extern "C" { #include } namespace zyppng { DLZckHeadState::DLZckHeadState( std::vector &&mirrors, std::shared_ptr &&oldReq, DownloadPrivate &parent ) : BasicDownloaderStateBase( std::move(oldReq), parent ) { _fileMirrors = std::move(mirrors); MIL << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl; } DLZckHeadState::DLZckHeadState( std::vector &&mirrors, DownloadPrivate &parent ) : BasicDownloaderStateBase( parent ) { _fileMirrors = std::move(mirrors); MIL << "About to enter DlZckHeadState for url " << parent._spec.url() << std::endl; } bool DLZckHeadState::initializeRequest(std::shared_ptr &r ) { BasicDownloaderStateBase::initializeRequest( r ); const auto &s = stateMachine()._spec; if ( s.headerSize() == 0 ) { ERR << "Downloading the zck header was requested, but headersize is zero." << std::endl; return false; } std::optional digest; NetworkRequest::CheckSumBytes sum; const auto &headerSum = s.headerChecksum(); if ( headerSum ) { digest = zypp::Digest(); if ( !digest->create( headerSum->type() ) ) { ERR << "Unknown header checksum type " << headerSum->type() << std::endl; return false; } sum = zypp::Digest::hexStringToUByteArray( headerSum->checksum() ); } r->addRequestRange( 0, s.headerSize(), std::move(digest), sum ); return true; } void DLZckHeadState::gotFinished() { if ( ZckHelper::isZchunkFile( stateMachine()._spec.targetPath() ) ) return BasicDownloaderStateBase::gotFinished(); failed ( "Downloaded header is not a zchunk header"); } std::shared_ptr DLZckHeadState::transitionToDlZckState() { MIL_MEDIA << "Downloaded the header of size: " << _request->downloadedByteCount() << std::endl; return std::make_shared( std::move(_fileMirrors), stateMachine() ); } DLZckState::DLZckState(std::vector &&mirrors, DownloadPrivate &parent) : RangeDownloaderBaseState( std::move(mirrors), parent ) { MIL_MEDIA << "About to enter DLZckState for url " << parent._spec.url() << std::endl; } void DLZckState::enter() { auto &sm = stateMachine(); const auto &spec = sm._spec; // setup the base downloader _error = {}; _ranges.clear(); _failedRanges.clear(); // @TODO get this from zchunk file? _fileSize = spec.expectedFileSize(); auto prepareRes = ZckHelper::prepareZck ( spec.deltaFile (), spec.targetPath (), _fileSize ); switch( prepareRes._code ) { case ZckHelper::PrepareResult::Error: { return setFailed ( std::move(prepareRes._message) ); } case ZckHelper::PrepareResult::ExceedsMaxLen: { return setFailed( NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen, std::move(prepareRes._message) ) ); } case ZckHelper::PrepareResult::NothingToDo: { return setFinished(); } case ZckHelper::PrepareResult::Success: // handle down below break; } const auto maxConns = sm._requestDispatcher->maximumConcurrentConnections(); if ( sm._spec.preferredChunkSize() == 0 ) { const auto autoBlkSize = makeBlksize( _fileSize ); if ( maxConns == -1 ) { _preferredChunkSize = autoBlkSize; } else { _preferredChunkSize = _fileSize / maxConns; if ( _preferredChunkSize < autoBlkSize ) _preferredChunkSize = autoBlkSize; else if ( _preferredChunkSize > zypp::ByteCount( 100, zypp::ByteCount::M ) ) _preferredChunkSize = zypp::ByteCount( 100, zypp::ByteCount::M ); } } else { // spec chunk size overrules the automatic one _preferredChunkSize = sm._spec.preferredChunkSize(); } std::for_each( prepareRes._blocks.begin (), prepareRes._blocks.end(), [&]( const ZckHelper::Block &block ) { _ranges.push_back ( Block{ block } ); }); _downloadedMultiByteCount = stateMachine()._spec.headerSize() + prepareRes._bytesReused; ensureDownloadsRunning(); } void DLZckState::exit() { cancelAll( NetworkRequestError() ); } std::shared_ptr DLZckState::transitionToFinished() { return std::make_shared( std::move(_error), stateMachine() ); } void DLZckState::setFinished() { const auto &spec = stateMachine()._spec; std::string err; if ( !ZckHelper::validateZckFile ( spec.targetPath(), err ) ) { return setFailed ( std::move(err) ); } // everything is valid RangeDownloaderBaseState::setFinished(); } } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/downloaderstates/zck_p.h000066400000000000000000000046621476576476200302730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_ZCK_P_H_INCLUDED #define ZYPP_CURL_NG_NETWORK_PRIVATE_DOWNLOADERSTATES_ZCK_P_H_INCLUDED #include "base_p.h" #include "basicdownloader_p.h" #include "rangedownloader_p.h" #include namespace zyppng { #if ENABLE_ZCHUNK_COMPRESSION struct DLZckState; struct FinishedState; /*! * Zchunk header download state implementation. This downloads only the * zck header to calculate which ranges/blocks are required for download. */ struct DLZckHeadState : public BasicDownloaderStateBase { static constexpr auto stateId = Download::DlZChunkHead; DLZckHeadState( std::vector &&mirrors, DownloadPrivate &parent ); DLZckHeadState( std::vector &&mirrors, std::shared_ptr &&oldReq, DownloadPrivate &parent ); bool initializeRequest( std::shared_ptr &r ) override; void gotFinished () override; std::shared_ptr transitionToDlZckState (); SignalProxy< void () > sigFinished() { return _sigFinished; } SignalProxy< void () > sigFailed() { return _sigFailed; } }; /*! * State implementation for the actual zck download. This downloads the * zck file from different mirrors in ranges. */ struct DLZckState : public RangeDownloaderBaseState { static constexpr auto stateId = Download::DlZChunk; DLZckState ( std::vector &&mirrors, DownloadPrivate &parent ); void enter (); void exit (); std::shared_ptr transitionToFinished (); SignalProxy< void () > sigFinished() { return _sigFinished; } SignalProxy< void () > sigFallback() { return _sigFailed; } void setFinished() override; }; #endif } #endif libzypp-17.36.5/tools/zypp-media-http/downloader/private/mirrorcontrol_p.h000066400000000000000000000105441476576476200270310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_PRIVATE_MIRRORCONTROL_P_H #define ZYPP_CURL_NG_NETWORK_PRIVATE_MIRRORCONTROL_P_H #include #include #include #include #include #include #include #include #include namespace zyppng { class MirrorControl : public Base { public: struct Mirror { Url mirrorUrl; uint rating = 100; // rating based on connection time higher is worse uint penalty = 0; //additional value that is added to the rating when sorting the mirrors, is increased and lowered for failed or successful transactions uint maxRanges = 0; //the maximum number of ranges that can be requested from this mirror uint finishedTransfers = 0; //how many transfers did we already send to the mirror uint runningTransfers = 0; //currently running transfers uint failedTransfers = 0; //how many transfers have failed in a row using this mirror uint successfulTransfers = 0; //how many transfers were successful void startTransfer(); void finishTransfer( const bool success ); void cancelTransfer(); uint maxConnections () const; bool hasFreeConnections () const; private: Mirror( MirrorControl &parent ); void transferUnref (); private: friend class MirrorControl; MirrorControl &_parent; NetworkRequest::Ptr _request; sigc::connection _finishedConn; uint _maxConnections = 0; //the maximum number of concurrent connections to this mirror, 0 means use system default }; using Ptr = std::shared_ptr; using MirrorHandle = std::shared_ptr; using MirrorPick = std::pair< std::vector::const_iterator, MirrorHandle >; static Ptr create (); ~MirrorControl() override; void registerMirrors( const std::vector &urls ); /*! * Tries to pick the best mirror from the set of URLs passed. * In case of a pending request, the result code will be set to "Again". */ struct PickResult { enum { Ok, Again, Unknown } code = Unknown; MirrorPick result; }; PickResult pickBestMirror( const std::vector &mirrors ); bool allMirrorsReady () const; SignalProxy sigNewMirrorsReady(); SignalProxy sigAllMirrorsReady(); private: MirrorControl(); std::string makeKey ( const zypp::Url &url ) const; sigc::connection _queueEmptyConn; NetworkRequestDispatcher::Ptr _dispatcher; //Mirror Control using its own NetworkRequestDispatcher, to avoid waiting for other downloads std::unordered_map _handles; Timer::Ptr _newMirrSigDelay; // we use a delay timer to emit the "someMirrorsReady" signal Signal _sigAllMirrorsReady; Signal _sigNewMirrorsReady; }; #if 0 /*! * Simple helper class to automatically cancel running transfers on destruction */ class MirrorRef { public: MirrorRef ( MirrorControl::MirrorHandle handle ); ~MirrorRef(); void startTransfer(); void finishTransfer( const bool success ); void cancelTransfer(); operator bool() const; MirrorControl::MirrorHandle get(); private: struct Helper { ~Helper(); MirrorControl::MirrorHandle _myHandle; bool _cancelOnDestruct = false; }; std::shared_ptr _data; }; #endif } #endif // ZYPP_CURL_NG_NETWORK_PRIVATE_MIRRORCONTROL_P_H libzypp-17.36.5/tools/zypp-media-http/main.cc000066400000000000000000000012651476576476200210510ustar00rootroot00000000000000#include "networkprovider.h" #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto provider = std::make_shared("zypp-media-http"); auto res = provider->run (STDIN_FILENO, STDOUT_FILENO); provider->immediateShutdown(); if ( res ) return 0; //@TODO print error return 1; //@TODO @WARNING @BUG Initialize the requestmanager with user agent and anon headers \sa anonymousIdHeader, distributionFlavorHeader, agentString } libzypp-17.36.5/tools/zypp-media-http/networkprovider.cc000066400000000000000000000455451476576476200234020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "networkprovider.h" #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "NetworkProvider" NetworkProvideItem::NetworkProvideItem(NetworkProvider &parent, zyppng::ProvideMessage &&spec) : zyppng::worker::ProvideWorkerItem( std::move(spec) ) , _parent(parent) {} NetworkProvideItem::~NetworkProvideItem() { clearConnections(); if ( _dl ) { _dl->cancel(); } } void NetworkProvideItem::startDownload( std::shared_ptr &&dl ) { if ( _state == ProvideWorkerItem::Running || _dl ) throw std::runtime_error("Can not start a already running Download"); MIL_PRV << "Starting download of : " << dl->spec().url() << "with target path: " << dl->spec().targetPath() << std::endl; _connections.clear (); // we set the state to running immediately but only send the message to controller once the item actually started _state = ProvideWorkerItem::Running; _dl = std::move(dl); _connections.emplace_back( connect( *_dl, &zyppng::Download::sigStarted, *this, &NetworkProvideItem::onStarted ) ); _connections.emplace_back( connect( *_dl, &zyppng::Download::sigFinished, *this, &NetworkProvideItem::onFinished ) ); _connections.emplace_back( connect( *_dl, &zyppng::Download::sigAuthRequired, *this, &NetworkProvideItem::onAuthRequired ) ); _dl->setStopOnMetalink( true ); _dl->start(); } void NetworkProvideItem::cancelDownload() { _state = zyppng::worker::ProvideWorkerItem::Finished; if ( _dl ) { _dl->cancel(); clearConnections(); _dl.reset(); } } void NetworkProvideItem::clearConnections() { for ( auto c : _connections) c.disconnect(); _connections.clear(); } void NetworkProvideItem::onStarted( zyppng::Download & ) { _parent.itemStarted( shared_this() ); } void NetworkProvideItem::onFinished( zyppng::Download & ) { _parent.itemFinished( shared_this() ); } void NetworkProvideItem::onAuthRequired( zyppng::Download &, zyppng::NetworkAuthData &auth, const std::string &availAuth ) { _parent.itemAuthRequired( shared_this(), auth, availAuth ); } NetworkProvider::NetworkProvider( std::string_view workerName ) : zyppng::worker::ProvideWorker( workerName ) , _dlManager( std::make_shared() ) { // we only want to hear about new provides setProvNotificationMode( ProvideWorker::ONLY_NEW_PROVIDES ); } zyppng::expected NetworkProvider::initialize( const zyppng::worker::Configuration &conf ) { const auto iEnd = conf.end(); if ( const auto &i = conf.find( std::string(zyppng::AGENT_STRING_CONF) ); i != iEnd ) { const auto &val = i->second; MIL << "Setting agent string to: " << val << std::endl; _dlManager->requestDispatcher()->setAgentString( val ); } if ( const auto &i = conf.find( std::string(zyppng::DISTRO_FLAV_CONF) ); i != iEnd ) { const auto &val = i->second; MIL << "Setting distro flavor header to: " << val << std::endl; _dlManager->requestDispatcher()->setHostSpecificHeader("download.opensuse.org", "X-ZYpp-DistributionFlavor", val ); } if ( const auto &i = conf.find( std::string(zyppng::ANON_ID_CONF) ); i != iEnd ) { const auto &val = i->second; MIL << "Got anonymous ID setting from controller" << std::endl; _dlManager->requestDispatcher()->setHostSpecificHeader("download.opensuse.org", "X-ZYpp-AnonymousId", val ); } if ( const auto &i = conf.find( std::string(zyppng::ATTACH_POINT) ); i != iEnd ) { const auto &val = i->second; MIL << "Got attachpoint from controller: " << val << std::endl; _attachPoint = val; } else { return zyppng::expected::error(ZYPP_EXCPT_PTR( zypp::Exception("Attach point required to work.") )); } zyppng::worker::WorkerCaps caps; caps.set_worker_type ( zyppng::worker::WorkerCaps::Downloading ); caps.set_cfg_flags( zyppng::worker::WorkerCaps::Flags ( zyppng::worker::WorkerCaps::Pipeline | zyppng::worker::WorkerCaps::ZyppLogFormat ) ); return zyppng::expected::success(caps); } void NetworkProvider::provide() { auto &queue = requestQueue(); if ( !queue.size() ) return; const auto now = std::chrono::steady_clock::now(); auto &io = controlIO(); while ( io.readFdOpen() ) { // find next pending item auto i = std::find_if( queue.begin(), queue.end(), [&now]( const zyppng::worker::ProvideWorkerItemRef &req ){ NetworkProvideItemRef nReq = std::static_pointer_cast(req); return nReq && nReq->_state == zyppng::worker::ProvideWorkerItem::Pending && nReq->_scheduleAfter < now; }); // none left, bail out if ( i == queue.end () ) break; auto req = std::static_pointer_cast( *i ); if ( req->_state != zyppng::worker::ProvideWorkerItem::Pending ) return; MIL_PRV << "About to schedule: " << req->_spec.code() << " with ID: "<< req->_spec.requestId() << std::endl; // here we only receive request codes, we only support Provide messages, all others are rejected // Cancel is never to be received here if ( req->_spec.code() != zyppng::ProvideMessage::Code::Prov ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , "Request type not implemented" , false , {} ); queue.erase(i); continue; } zypp::Url url; const auto &urlVal = req->_spec.value( zyppng::ProvideMsgFields::Url ); try { url = zypp::Url( urlVal.asString() ); } catch ( const zypp::Exception &excp ) { ZYPP_CAUGHT(excp); std::string err = zypp::str::Str() << "Invalid URL in request: " << urlVal.asString(); ERR << err << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , err , false , {} ); queue.erase(i); continue; } const auto &fPath = zypp::Pathname( url.getPathName() ); /* * We download into the staging directory first, using the md5sum of the full path as filename. * Once the download is finished its transferred into the cache directory. This way we can clearly * distinguish between cancelled downloads and downloads we have completely finished. */ zypp::Pathname localPath = zypp::Pathname( _attachPoint ) / "cache" / fPath; zypp::Pathname stagingPath = ( zypp::Pathname( _attachPoint ) / "staging" / zypp::CheckSum::md5FromString( fPath.asString() ).asString() ).extend(".part"); MIL_PRV << "Providing " << url << " to local: " << localPath << " staging: " << stagingPath << std::endl; // Cache hit? zypp::PathInfo cacheFile(localPath); if ( cacheFile.isExist () ) { // could be a directory if ( !cacheFile.isFile() ) { MIL_PRV << "Path " << url << " exists in Cache but its not a file!" << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotAFile , "Not a file" , false , {} ); queue.erase(i); continue; } MIL_PRV << "Providing " << url << "Cache HIT" << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideSuccess ( req->_spec.requestId(), true, localPath ); queue.erase(i); continue; } if ( zypp::PathInfo(stagingPath).isExist () ) { // check if there is another request running with this staging file name auto runningIt = std::find_if( queue.begin (), queue.end(), [&]( const zyppng::worker::ProvideWorkerItemRef &queueItem ){ if ( req == queueItem || queueItem->_state != zyppng::worker::ProvideWorkerItem::Running ) return false; return ( static_cast( queueItem.get() )->_stagingFileName == stagingPath ); }); // we schedule that later again which should result in a immediate cache hit if ( runningIt != queue.end() ) { MIL << "Found a existing request that results in the same staging file, postponing the request for later" << std::endl; req->_scheduleAfter = now; continue; } MIL<< "Removing broken staging file" << stagingPath << std::endl; // here this is most likely a broken download zypp::filesystem::unlink( stagingPath ); } auto errCode = zypp::filesystem::assert_dir( localPath.dirname() ); if( errCode ) { std::string err = zypp::str::Str() << "assert_dir " << localPath.dirname() << " failed"; DBG << err << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::InternalError , err , false , {} ); queue.erase(i); continue; } errCode = zypp::filesystem::assert_dir( stagingPath.dirname() ); if( errCode ) { std::string err = zypp::str::Str() << "assert_dir " << stagingPath.dirname() << " failed"; DBG << err << std::endl; req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::InternalError , err , false , {} ); queue.erase(i); continue; } bool doMetalink = true; const auto &metalinkVal = req->_spec.value( zyppng::NETWORK_METALINK_ENABLED ); if ( metalinkVal.valid() && metalinkVal.isBool () ) { doMetalink = metalinkVal.asBool(); MIL << "Explicity setting metalink " << ( doMetalink ? "enabled" : "disabled" ) << std::endl; } ERR << "Forcing Metalink to be disabled until zsync/metalink is correctly implemented again" << std::endl; doMetalink = false; req->_targetFileName = localPath; req->_stagingFileName = stagingPath; const auto &expFilesize = req->_spec.value( zyppng::ProvideMsgFields::ExpectedFilesize ); const auto &checkExistsOnly = req->_spec.value( zyppng::ProvideMsgFields::CheckExistOnly ); const auto &deltaFile = req->_spec.value( zyppng::ProvideMsgFields::DeltaFile ); zyppng::DownloadSpec spec( url , stagingPath , expFilesize.valid() ? zypp::ByteCount( expFilesize.asInt64() ) : zypp::ByteCount() ); spec .setCheckExistsOnly( checkExistsOnly.valid() ? checkExistsOnly.asBool() : false ) .setDeltaFile ( deltaFile.valid() ? deltaFile.asString() : zypp::Pathname() ) .setMetalinkEnabled ( doMetalink ); req->startDownload( _dlManager->downloadFile ( spec ) ); } } void NetworkProvider::cancel( const std::deque::iterator &i ) { auto &queue = requestQueue (); if ( i == queue.end() ) { ERR << "Unknown request ID, ignoring." << std::endl; return; } const auto &req = std::static_pointer_cast(*i); req->cancelDownload(); queue.erase(i); } void NetworkProvider::immediateShutdown() { for ( const auto &pItem : requestQueue () ) { auto ref = std::static_pointer_cast( pItem ); ref->cancelDownload(); } } zyppng::worker::ProvideWorkerItemRef NetworkProvider::makeItem(zyppng::ProvideMessage &&spec ) { return std::make_shared( *this, std::move(spec) ); } void NetworkProvider::itemStarted( NetworkProvideItemRef item ) { provideStart( item->_spec.requestId(), item->_dl->spec().url().asCompleteString(), item->_targetFileName.asString(), item->_stagingFileName.asString() ); } void NetworkProvider::itemFinished( NetworkProvideItemRef item ) { auto &queue = requestQueue (); auto i = std::find( queue.begin(), queue.end(), item ); if ( i == queue.end() ) { ERR << "Unknown request finished. This is a BUG!" << std::endl; return; } item->_state = NetworkProvideItem::Finished; if ( !item->_dl->hasError() ) { if ( item->_dl->stoppedOnMetalink () ) { // need to read the metalink info and send back a redirect try { zypp::media::MetaLinkParser pars; pars.parse( item->_stagingFileName ); std::vector urls; for ( const auto &mirr : pars.getMirrors () ) { try { zypp::Url url( mirr.url.asCompleteString () ); urls.push_back(url); if ( urls.size() == 10 ) break; } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); } } // @TODO , restart the download without metalink? if ( urls.size() == 0 ) throw zypp::Exception("No usable mirrors in Mirrorlink file"); if ( !messageStream()->sendMessage( zyppng::ProvideMessage::createMetalinkRedir( item->_spec.requestId(), urls ) ) ) { ERR << "Failed to send ProvideSuccess message" << std::endl; } } catch ( const zypp::Exception &exp ) { zypp::filesystem::hardlinkCopy ( item->_stagingFileName, "/tmp/broken" ); ZYPP_CAUGHT(exp); provideFailed( item->_spec.requestId(), zyppng::ProvideMessage::Code::InternalError, exp.asUserString (), false ); } zypp::filesystem::unlink( item->_stagingFileName ); } else { if ( item->_dl->spec().checkExistsOnly() ) { // check exist only, we just return success with the target file name provideSuccess( item->_spec.requestId(), false, item->_targetFileName ); } const auto errCode = zypp::filesystem::rename( item->_stagingFileName, item->_targetFileName ); if( errCode ) { zypp::filesystem::unlink( item->_stagingFileName ); std::string err = zypp::str::Str() << "Renaming " << item->_stagingFileName << " to " << item->_targetFileName << " failed!"; DBG << err << std::endl; provideFailed( item->_spec.requestId() , zyppng::ProvideMessage::Code::InternalError , err , false , {} ); } else { provideSuccess( item->_spec.requestId(), false, item->_targetFileName ); } } } else { zyppng::HeaderValueMap extra; bool isTransient = false; auto errCode = zyppng::ProvideMessage::Code::InternalError; const auto &error = item->_dl->lastRequestError(); switch( error.type() ) { case zyppng::NetworkRequestError::NoError: { throw std::runtime_error("DownloadError info broken"); break;} case zyppng::NetworkRequestError::InternalError: { errCode = zyppng::ProvideMessage::Code::InternalError; break;} case zyppng::NetworkRequestError::RangeFail: { errCode = zyppng::ProvideMessage::Code::InternalError; break;} case zyppng::NetworkRequestError::Cancelled: { errCode = zyppng::ProvideMessage::Code::Cancelled; break;} case zyppng::NetworkRequestError::PeerCertificateInvalid: { errCode = zyppng::ProvideMessage::Code::PeerCertificateInvalid; break;} case zyppng::NetworkRequestError::ConnectionFailed: { errCode = zyppng::ProvideMessage::Code::ConnectionFailed; break;} case zyppng::NetworkRequestError::ExceededMaxLen: { errCode = zyppng::ProvideMessage::Code::ExpectedSizeExceeded; break;} case zyppng::NetworkRequestError::InvalidChecksum: { errCode = zyppng::ProvideMessage::Code::InvalidChecksum; break;} case zyppng::NetworkRequestError::UnsupportedProtocol: { errCode = zyppng::ProvideMessage::Code::BadRequest; break; } case zyppng::NetworkRequestError::MalformedURL: { errCode = zyppng::ProvideMessage::Code::BadRequest; break; } case zyppng::NetworkRequestError::TemporaryProblem: { errCode = zyppng::ProvideMessage::Code::InternalError; isTransient = true; break;} case zyppng::NetworkRequestError::Timeout: { errCode = zyppng::ProvideMessage::Code::Timeout; break;} case zyppng::NetworkRequestError::Forbidden: { errCode = zyppng::ProvideMessage::Code::Forbidden; break;} case zyppng::NetworkRequestError::NotFound: { errCode = zyppng::ProvideMessage::Code::NotFound; break;} case zyppng::NetworkRequestError::Unauthorized: { errCode = zyppng::ProvideMessage::Code::Unauthorized; const auto &authHint = error.extraInfoValue("authHint", std::string()); if ( authHint.size () ) extra.set ( "authhint", authHint ); break; } case zyppng::NetworkRequestError::AuthFailed: { errCode = zyppng::ProvideMessage::Code::NoAuthData; const auto &authHint = error.extraInfoValue("authHint", std::string()); if ( authHint.size () ) extra.set ( "authhint", authHint ); break; } //@TODO add extra codes for handling these case zyppng::NetworkRequestError::Http2Error: case zyppng::NetworkRequestError::Http2StreamError: case zyppng::NetworkRequestError::ServerReturnedError: { errCode = zyppng::ProvideMessage::Code::InternalError; break; } case zyppng::NetworkRequestError::MissingData: { errCode = zyppng::ProvideMessage::Code::BadRequest; break; } } provideFailed( item->_spec.requestId(), errCode, item->_dl->errorString(), isTransient, extra ); } queue.erase(i); // pick the next request provide(); } void NetworkProvider::itemAuthRequired( NetworkProvideItemRef item, zyppng::NetworkAuthData &auth, const std::string & availAuth ) { auto res = requireAuthorization( item->_spec.requestId(), auth.url(), auth.username(), auth.lastDatabaseUpdate(), { { std::string( zyppng::AuthDataRequestMsgFields::AuthHint ), availAuth } } ); if ( !res ) { auth = zyppng::NetworkAuthData(); return; } auth.setUrl ( item->_dl->spec().url() ); auth.setUsername ( res->username ); auth.setPassword ( res->password ); auth.setLastDatabaseUpdate ( res->last_auth_timestamp ); auth.extraValues() = res->extraKeys; const auto &keyStr = std::string(zyppng::AuthInfoMsgFields::AuthType); if ( res->extraKeys.count( keyStr ) ) { auth.setAuthType( res->extraKeys[keyStr] ); } //@todo migrate away from using NetworkAuthData, AuthData now has a map of extra values that can carry the AuthType const auto &authTypeKey = std::string( zyppng::AuthInfoMsgFields::AuthType ); if ( res->extraKeys.count( authTypeKey ) ) auth.setAuthType( res->extraKeys[ authTypeKey ] ); } libzypp-17.36.5/tools/zypp-media-http/networkprovider.h000066400000000000000000000052411476576476200232310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_NETWORKPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_NETWORKPROVIDER_H_INCLUDED #include #include #include #include #include namespace zyppng { class Downloader; class Download; } class NetworkProvider; struct NetworkProvideItem : public zyppng::worker::ProvideWorkerItem { public: NetworkProvideItem( NetworkProvider &parent, zyppng::ProvideMessage &&spec ); ~NetworkProvideItem(); void startDownload( std::shared_ptr &&dl ); void cancelDownload (); std::shared_ptr _dl; zypp::Pathname _targetFileName; zypp::Pathname _stagingFileName; std::chrono::steady_clock::time_point _scheduleAfter = std::chrono::steady_clock::time_point::min(); private: void clearConnections (); void onStarted ( zyppng::Download & ); void onFinished ( zyppng::Download & ); void onAuthRequired ( zyppng::Download &, zyppng::NetworkAuthData &auth, const std::string &availAuth ); private: std::vector _connections; NetworkProvider &_parent; }; using NetworkProvideItemRef = std::shared_ptr; class NetworkProvider : public zyppng::worker::ProvideWorker { public: NetworkProvider( std::string_view workerName ); void immediateShutdown() override; protected: // ProvideWorker interface zyppng::expected initialize(const zyppng::worker::Configuration &conf) override; void provide() override; void cancel(const std::deque::iterator &i ) override; zyppng::worker::ProvideWorkerItemRef makeItem(zyppng::ProvideMessage &&spec) override; friend struct NetworkProvideItem; void itemStarted ( NetworkProvideItemRef item ); void itemFinished ( NetworkProvideItemRef item ); void itemAuthRequired (NetworkProvideItemRef item, zyppng::NetworkAuthData &auth, const std::string &); private: std::shared_ptr _dlManager; zypp::Pathname _attachPoint; }; #endif libzypp-17.36.5/tools/zypp-media-iso/000077500000000000000000000000001476576476200174255ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-iso/CMakeLists.txt000066400000000000000000000031271476576476200221700ustar00rootroot00000000000000PROJECT( zypp-media-iso C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc isoprovider.cc isoprovider.h ${ZYPP_TOOLS_DIR}/zypp-media-dir/dirprovider.h ${ZYPP_TOOLS_DIR}/zypp-media-dir/dirprovider.cc ${ZYPP_TOOLS_DIR}/zypp-media-disk/diskprovider.h ${ZYPP_TOOLS_DIR}/zypp-media-disk/diskprovider.cc ${ZYPP_TOOLS_DIR}/zypp-media-nfs/nfsprovider.h ${ZYPP_TOOLS_DIR}/zypp-media-nfs/nfsprovider.cc ${ZYPP_TOOLS_DIR}/zypp-media-smb/smbprovider.h ${ZYPP_TOOLS_DIR}/zypp-media-smb/smbprovider.cc ) include_directories( ${ZYPP_TOOLS_DIR}/zypp-media-dir ${ZYPP_TOOLS_DIR}/zypp-media-disk ${ZYPP_TOOLS_DIR}/zypp-media-nfs ${ZYPP_TOOLS_DIR}/zypp-media-smb ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-iso/isoprovider.cc000066400000000000000000000345161476576476200223120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "isoprovider.h" #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "IsoProvider" RaiiHelper::~RaiiHelper() { _backingDriver->detachMedia( id ); _backingDriver->releaseIdleDevices(); } IsoProvider::IsoProvider( ) : DeviceDriver( zyppng::worker::WorkerCaps::SimpleMount ) { } IsoProvider::~IsoProvider() { } zyppng::worker::AttachResult IsoProvider::mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) { try { zypp::Pathname isofile = attachUrl.getQueryParam("iso"); if( isofile.empty()) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , zypp::str::Str()<<"Media url: "<load( extras.value(zyppng::AttachMsgFields::VerifyData).asString() ) ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create verifier from file" , false ); } } // first check if we have that device already const auto &devs = knownDevices(); auto i = std::find_if( devs.begin(), devs.end(), [&]( const auto &d ) { return d->_name == fullIsoUrl.asString(); }); if ( i != devs.end() ) { // if we can find the device, isDesiredMedium needs to return true, // otherwise URL and verifier do not match and its not the desired medium auto res = isDesiredMedium( attachUrl, (*i)->_mountPoint / relAttachRoot, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !res ) { try { std::rethrow_exception( res.error() ); } catch( const zypp::Exception& e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , false , e ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , "Checking the medium failed with an uknown error" , false ); } } else { attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ *i, relAttachRoot } ) ); return zyppng::worker::AttachResult::success( (*i)->_mountPoint / relAttachRoot ); } } // helper lambda to invoke the deviceDriver const auto &attachViaHelper = [&]( auto &driver, const std::string &type ) { auto mountRes = driver->mountDevice( id, src, attachId, "", {} ); if ( !mountRes ) { return mountRes; } // make sure the media is released as soon as its not needed anymore auto hlpr = std::make_shared(); hlpr->_backingDriver = driver; hlpr->id = attachId; // k, get the mountpoint from the backing driver const auto &attMedias = driver->attachedMedia(); auto i = attMedias.find( attachId ); if ( i == attMedias.end() ) { const std::string &err = zypp::str::Str()<< "Failed to query mounted supporting device: " << src.asString(); ERR << err << std::endl; return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , err , false ); } // full path to the ISO in the filesystem auto isopath = zypp::filesystem::expandlink( i->second._dev->_mountPoint / isofile ); if( isopath.empty() || !zypp::PathInfo(isopath).isFile()) { const std::string &err = zypp::str::Str()<< "No ISO file found on given source location: " << src.asString(); ERR << err << std::endl; return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , err , false ); } // we have everything we need, let's try to mount it zypp::media::Mount mount; zypp::Pathname newAp; try { newAp = createAttachPoint( attachRoot() ); if ( newAp.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create mount directory." , false ); } std::string mountpoint( newAp.asString() ); std::string mountopts("ro,loop"); mount.mount( isopath.asString(), mountpoint, filesystem, mountopts ); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; // Type ISO: Since 11.1 mtab might contain the name of // the loop device instead of the iso file: const auto &checkAttachedISO = [&]( const zypp::media::MountEntry &e ) { if ( zypp::str::hasPrefix( zypp::Pathname(e.src).asString(), "/dev/loop" ) && mountpoint == zypp::Pathname(e.dir) ) { DBG << "Found bound media " << isopath << " in the mount table as " << e.src << std::endl; return true; } return false; }; // mount command came back OK, lets wait for mtab to update while( !(mountsucceeded=checkAttached( newAp, checkAttachedISO )) && --limit) { MIL << "Mount did not appear yet, sleeping for 1s" << std::endl; sleep(1); } // mount didn't work after all, bail out if ( !mountsucceeded ) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaMountException( "Unable to verify that the media was mounted", isopath.asString(), newAp.asString() )); } // if we reach this place, mount worked -> YAY, lets see if that is the desired medium! auto isDesired = isDesiredMedium( attachUrl, newAp / relAttachRoot, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !isDesired ) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaNotDesiredException( attachUrl ) ); } } catch ( const zypp::Exception &e ) { removeAttachPoint(newAp); ZYPP_CAUGHT(e); return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , false , e ); } // here we have our device AND it is verified , lets register it and return it to the user auto devPtr = std::make_shared( zyppng::worker::Device{ ._name = fullIsoUrl.asString(), ._maj_nr = 0, ._min_nr = 0, ._mountPoint = newAp, ._ephemeral = true, // forget about the device after we are finished with it ._properties = {} }); devPtr->_properties["raiiHelper"] = hlpr; knownDevices().push_back( devPtr ); attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ devPtr, relAttachRoot } ) ); return zyppng::worker::AttachResult::success( devPtr->_mountPoint / relAttachRoot ); }; if( !src.isValid()) { const std::string &err = zypp::str::Str()<<"Invalid iso filename source media url: "<(); auto subAttachRoot = ( attachRoot().realpath()/"disk" ); zypp::filesystem::assert_dir( subAttachRoot ); auto confCopy = config(); confCopy[std::string(zyppng::ATTACH_POINT)] = subAttachRoot.asString(); const auto &res = _diskWorker->initialize( confCopy ); if ( !res ) { const std::string &err = zypp::str::Str()<< "Failed to initialize worker for: " << src.asString(); ERR << err << std::endl; return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , err , false ); } } return attachViaHelper( _diskWorker, "disk" ); } else if ( src.getScheme() == "dir" || src.getScheme() == "file" ) { if ( !_dirWorker ) { _dirWorker = std::make_shared(); auto subAttachRoot = ( attachRoot().realpath()/"dir" ); zypp::filesystem::assert_dir( subAttachRoot ); auto confCopy = config(); confCopy[std::string(zyppng::ATTACH_POINT)] = subAttachRoot.asString(); const auto &res = _dirWorker->initialize( confCopy ); if ( !res ) { const std::string &err = zypp::str::Str()<< "Failed to initialize worker for: " << src.asString(); ERR << err << std::endl; return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , err , false ); } } return attachViaHelper( _dirWorker, "dir" ); } else if ( src.getScheme() == "nfs" || src.getScheme() == "nfs4" ) { if ( !_nfsWorker ) { _nfsWorker = std::make_shared(); auto subAttachRoot = ( attachRoot().realpath()/"nfs" ); zypp::filesystem::assert_dir( subAttachRoot ); auto confCopy = config(); confCopy[std::string(zyppng::ATTACH_POINT)] = subAttachRoot.asString(); const auto &res = _nfsWorker->initialize( confCopy ); MIL << "AFTER INIT " << _nfsWorker->attachRoot() << std::endl; if ( !res ) { const std::string &err = zypp::str::Str()<< "Failed to initialize worker for: " << src.asString(); ERR << err << std::endl; return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , err , false ); } } return attachViaHelper( _nfsWorker, "nfs" ); } else if ( src.getScheme() == "smb" || src.getScheme() == "cifs" ) { if ( !_smbWorker ) { _smbWorker = std::make_shared(); auto subAttachRoot = ( attachRoot().realpath()/"smb" ); zypp::filesystem::assert_dir( subAttachRoot ); auto confCopy = config(); confCopy[std::string(zyppng::ATTACH_POINT)] = subAttachRoot.asString(); const auto &res = _smbWorker->initialize( confCopy ); if ( !res ) { const std::string &err = zypp::str::Str()<< "Failed to initialize worker for: " << src.asString(); ERR << err << std::endl; return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , err , false ); } } return attachViaHelper( _smbWorker, "smb" ); } else { const std::string &err = zypp::str::Str()<< "ISO filename source media url scheme is not supported: " << src.asString(); ERR << err << std::endl; return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , err , false ); } } catch ( const zypp::Exception &e ) { return zyppng::worker::AttachResult::error ( zyppng::ProvideMessage::Code::BadRequest , false , e ); } catch ( const std::exception &e ) { return zyppng::worker::AttachResult::error ( zyppng::ProvideMessage::Code::BadRequest , e.what() , false ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , "Unknown exception" , false); } } libzypp-17.36.5/tools/zypp-media-iso/isoprovider.h000066400000000000000000000026501476576476200221460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_ISOPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_ISOPROVIDER_H_INCLUDED #include #include "dirprovider.h" #include "smbprovider.h" #include "diskprovider.h" #include "nfsprovider.h" struct RaiiHelper { ~RaiiHelper(); zyppng::worker::DeviceDriverRef _backingDriver; std::string id; }; class IsoProvider : public zyppng::worker::DeviceDriver { public: IsoProvider( ); ~IsoProvider(); zyppng::worker::AttachResult mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) override; private: std::shared_ptr _dirWorker; std::shared_ptr _diskWorker; std::shared_ptr _nfsWorker; std::shared_ptr _smbWorker; }; #endif libzypp-17.36.5/tools/zypp-media-iso/main.cc000066400000000000000000000013551476576476200206640ustar00rootroot00000000000000#include "isoprovider.h" #include #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto driver = std::make_shared(); auto provider = std::make_shared( "zypp-media-iso", driver ); driver->setProvider( provider ); auto res = provider->run (STDIN_FILENO, STDOUT_FILENO); MIL << "ISO Worker shutting down" << std::endl; provider->immediateShutdown(); if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-nfs/000077500000000000000000000000001476576476200174215ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-nfs/CMakeLists.txt000066400000000000000000000020421476576476200221570ustar00rootroot00000000000000PROJECT( zypp-media-nfs C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc nfsprovider.cc nfsprovider.h ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-nfs/main.cc000066400000000000000000000012201476576476200206470ustar00rootroot00000000000000#include "nfsprovider.h" #include #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto driver = std::make_shared(); auto worker = std::make_shared( "zypp-media-nfs", driver ); driver->setProvider( worker ); auto res = worker->run (STDIN_FILENO, STDOUT_FILENO); if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-nfs/nfsprovider.cc000066400000000000000000000227411476576476200222770ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "nfsprovider.h" #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "NfsProvider" using namespace std::literals::string_view_literals; /** * Value of NFS mount minor timeout (passed to timeo option * of the NFS mount) in tenths of a second. * * The value of 300 should give a major timeout after 3.5 minutes * for UDP and 1.5 minutes for TCP. (#350309) */ constexpr auto NFS_MOUNT_TIMEOUT = 300; constexpr std::array NFS_MOUNT_FSTYPES = { "nfs"sv, "nfs4"sv }; NfsProvider::NfsProvider( ) : DeviceDriver( zyppng::worker::WorkerCaps::SimpleMount ) { } NfsProvider::~NfsProvider() { } zyppng::worker::AttachResult NfsProvider::mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) { try { if ( attachUrl.getHost().empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Host can not be empty" , false ); } // set up the verifier zyppng::MediaDataVerifierRef verifier; zyppng::MediaDataVerifierRef devVerifier; if ( extras.value( zyppng::AttachMsgFields::VerifyType ).valid() ) { verifier = zyppng::MediaDataVerifier::createVerifier( extras.value(zyppng::AttachMsgFields::VerifyType).asString() ); if ( !verifier ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Invalid verifier type" , false ); } if ( !verifier->load( extras.value(zyppng::AttachMsgFields::VerifyData).asString() ) ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create verifier from file" , false ); } } const auto &devs = knownDevices(); // build a device name the same way the old media backend did std::string path = attachUrl.getHost(); path += ':'; path += zypp::Pathname(attachUrl.getPathName()).asString(); // first check if we have that device already auto i = std::find_if( devs.begin(), devs.end(), [&]( const auto &d ) { return d->_name == path; } ); if ( i != devs.end() ) { auto res = isDesiredMedium( attachUrl, (*i)->_mountPoint, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !res ) { try { std::rethrow_exception( res.error() ); } catch( const zypp::Exception& e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , false , e ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , "Checking the medium failed with an uknown error" , false ); } } else { attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ *i, "/" } ) ); return zyppng::worker::AttachResult::success( (*i)->_mountPoint ); } } // we did not find a existing mount, well lets make a new one // start with some legacy code: std::string filesystem( attachUrl.getScheme() ); if ( filesystem != "nfs4" && attachUrl.getQueryParam("type") == "nfs4" ) { filesystem = "nfs4"; } std::string options = attachUrl.getQueryParam("mountoptions"); if(options.empty()) { options="ro"; } std::vector optionList; zypp::str::split( options, std::back_inserter(optionList), "," ); std::vector::const_iterator it; bool contains_lock = false, contains_soft = false, contains_timeo = false, contains_hard = false; for( it = optionList.begin(); it != optionList.end(); ++it ) { if ( *it == "lock" || *it == "nolock" ) contains_lock = true; else if ( *it == "soft") contains_soft = true; else if ( *it == "hard") contains_hard = true; else if ( it->find("timeo") != std::string::npos ) contains_timeo = true; } if ( !(contains_lock && contains_soft) ) { // Add option "nolock", unless option "lock" or "unlock" is already set. // This should prevent the mount command hanging when the portmapper isn't // running. if ( !contains_lock ) { optionList.push_back( "nolock" ); } // Add options "soft,timeo=NFS_MOUNT_TIMEOUT", unless they are set // already or "hard" option is explicitly specified. This prevent // the mount command from hanging when the nfs server is not responding // and file transactions from an unresponsive to throw an error after // a short time instead of hanging forever if ( !(contains_soft || contains_hard) ) { optionList.push_back( "soft" ); if ( !contains_timeo ) { std::ostringstream s; s << "timeo=" << NFS_MOUNT_TIMEOUT; optionList.push_back( s.str() ); } } options = zypp::str::join( optionList, "," ); } zypp::Pathname newAp; zypp::media::Mount mount; try { newAp = createAttachPoint( attachRoot() ); if ( newAp.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create mount directory." , false ); } mount.mount( path, newAp.asString(), filesystem, options ); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; // we only check if our attachpoint is in mounts and of type nfs/nfs4, everything else is not reliable anyways constexpr auto checkFsTypePredicate = []( const zypp::media::MountEntry &entry ){ return ( std::find( NFS_MOUNT_FSTYPES.begin(), NFS_MOUNT_FSTYPES.end(), entry.type ) != NFS_MOUNT_FSTYPES.end() ); }; while( !(mountsucceeded=checkAttached( newAp, checkFsTypePredicate )) && --limit) { MIL << "Mount did not appear yet, sleeping for 1s" << std::endl; sleep(1); } if( !mountsucceeded) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaMountException( "Unable to verify that the media was mounted", path, newAp.asString() )); } // if we reach this place, mount worked -> YAY, lets see if that is the desired medium! const auto &isDesired = isDesiredMedium( attachUrl, newAp, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !isDesired ) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaNotDesiredException( attachUrl ) ); } MIL << "New device " << path << " mounted on " << newAp << std::endl; auto newDev = std::shared_ptr( new zyppng::worker::Device{ ._name = path, ._maj_nr = 0, ._min_nr = 0, ._mountPoint = newAp, ._ephemeral = true, // device should be removed after the last attachment was released ._properties = {} }); knownDevices().push_back( newDev ); attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ newDev, "/" } ) ); return zyppng::worker::AttachResult::success( newDev->_mountPoint ); } catch (const zypp::media::MediaMountException &e ) { removeAttachPoint(newAp); ZYPP_CAUGHT(e); return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , false , e ); } catch (const zypp::media::MediaException & e) { removeAttachPoint(newAp); ZYPP_CAUGHT(e); return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , false , e ); } // We should never reach this place, but if we do fail the attach request return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , zypp::str::Str()<<"Mounting the medium " << attachUrl << " failed for an unknown reason" , false ); } catch ( const zypp::Exception &e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , false , e ); } catch ( const std::exception &e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , e.what() , false ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , "Unknown exception" , false ); } } libzypp-17.36.5/tools/zypp-media-nfs/nfsprovider.h000066400000000000000000000020551476576476200221350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_NFSPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_NFSPROVIDER_H_INCLUDED #include class NfsProvider : public zyppng::worker::DeviceDriver { public: NfsProvider(); ~NfsProvider(); // DeviceDriver interface zyppng::worker::AttachResult mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) override; }; #endif libzypp-17.36.5/tools/zypp-media-smb/000077500000000000000000000000001476576476200174145ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-smb/CMakeLists.txt000066400000000000000000000020421476576476200221520ustar00rootroot00000000000000PROJECT( zypp-media-smb C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc smbprovider.cc smbprovider.h ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) IF ( INSTALL_NG_BINARIES ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}/workers" ) ENDIF() set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-smb/main.cc000066400000000000000000000013041476576476200206450ustar00rootroot00000000000000#include "smbprovider.h" #include #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto driver = std::make_shared(); auto worker = std::make_shared( "zypp-media-smb", driver ); driver->setProvider( worker ); auto res = worker->run (STDIN_FILENO, STDOUT_FILENO); MIL << "SMB Worker shutting down" << std::endl; if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-smb/smbprovider.cc000066400000000000000000000266271476576476200222740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "smbprovider.h" #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "SmbProvider" using namespace std::literals::string_view_literals; /*! * Get the 1st path component (CIFS share name). */ inline std::string getShare( zypp::Pathname spath_r ) { if ( spath_r.empty() ) return std::string(); std::string share( spath_r.absolutename().asString() ); std::string::size_type sep = share.find( "/", 1 ); if ( sep == std::string::npos ) share = share.erase( 0, 1 ); // nothing but the share name in spath_r else share = share.substr( 1, sep-1 ); // deescape %2f in sharename while ( (sep = share.find( "%2f" )) != std::string::npos ) { share.replace( sep, 3, "/" ); } return share; } /*! * Strip off the 1st path component (CIFS share name). */ inline zypp::Pathname stripShare( zypp::Pathname spath_r ) { if ( spath_r.empty() ) return zypp::Pathname(); std::string striped( spath_r.absolutename().asString() ); std::string::size_type sep = striped.find( "/", 1 ); if ( sep == std::string::npos ) return "/"; // nothing but the share name in spath_r return striped.substr( sep ); } SmbProvider::SmbProvider( ) : DeviceDriver( zyppng::worker::WorkerCaps::SimpleMount ) { } SmbProvider::~SmbProvider() { } zyppng::worker::AttachResult SmbProvider::mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) { try { if ( attachUrl.getHost().empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Host can not be empty" , false ); } // set up the verifier zyppng::MediaDataVerifierRef verifier; if ( extras.value( zyppng::AttachMsgFields::VerifyType ).valid() ) { verifier = zyppng::MediaDataVerifier::createVerifier( extras.value(zyppng::AttachMsgFields::VerifyType).asString() ); if ( !verifier ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Invalid verifier type" , false ); } if ( !verifier->load( extras.value(zyppng::AttachMsgFields::VerifyData).asString() ) ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create verifier from file" , false ); } } const auto &devs = knownDevices(); // build a device name the same way the old media backend did std::string path = "//"; path += attachUrl.getHost() + "/" + getShare( attachUrl.getPathName() ); // first check if we have that device already auto i = std::find_if( devs.begin(), devs.end(), [&]( const auto &d ) { return d->_name == path; } ); if ( i != devs.end() ) { auto res = isDesiredMedium( attachUrl, (*i)->_mountPoint, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !res ) { try { std::rethrow_exception( res.error() ); } catch( const zypp::Exception& e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , false , e ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediumNotDesired , "Checking the medium failed with an uknown error" , false ); } } else { attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ *i, "/" } ) ); return zyppng::worker::AttachResult::success( (*i)->_mountPoint ); } } // we did not find a existing mount, well lets make a new one // start with some legacy code: zypp::media::Mount::Options options( attachUrl.getQueryParam("mountoptions") ); int64_t lastTimestamp = -1; std::string username = attachUrl.getUsername(); std::string password = attachUrl.getPassword(); if ( ! options.has( "rw" ) ) { options["ro"]; } // look for a workgroup std::string workgroup = attachUrl.getQueryParam("workgroup"); if ( workgroup.empty() ) workgroup = attachUrl.getQueryParam("domain"); if ( !workgroup.empty() ) options["domain"] = workgroup; // extract 'username', do not overwrite any _url.username zypp::media::Mount::Options::iterator toEnv; toEnv = options.find("username"); if ( toEnv != options.end() ) { if ( username.empty() ) username = toEnv->second; options.erase( toEnv ); } toEnv = options.find("user"); // actually cifs specific if ( toEnv != options.end() ) { if ( username.empty() ) username = toEnv->second; options.erase( toEnv ); } // extract 'password', do not overwrite any _url.password toEnv = options.find("password"); if ( toEnv != options.end() ) { if ( password.empty() ) password = toEnv->second; options.erase( toEnv ); } toEnv = options.find("pass"); // actually cifs specific if ( toEnv != options.end() ) { if ( password.empty() ) password = toEnv->second; options.erase( toEnv ); } bool canContinue = true; while ( canContinue ) { canContinue = false; // pass 'username' and 'password' via environment zypp::media::Mount::Environment environment; if ( !username.empty() ) environment["USER"] = username; if ( !password.empty() ) environment["PASSWD"] = password; // In case we need a tmpfile, credentials will remove // it in its destructor after the mount call below. zypp::filesystem::TmpPath credentials; if ( !username.empty() || !password.empty() ) { zypp::filesystem::TmpFile tmp; std::ofstream outs( tmp.path().asString().c_str() ); outs << "username=" << username << std::endl; outs << "password=" << password << std::endl; outs.close(); credentials = tmp; options["credentials"] = credentials.path().asString(); } else { // Use 'guest' option unless explicitly disabled (bnc #547354) if ( options.has( "noguest" ) ) options.erase( "noguest" ); else // prevent smbmount from asking for password // only add this option if 'credentials' is not used (bnc #560496) options["guest"]; } zypp::Pathname newAp; zypp::media::Mount mount; try { newAp = createAttachPoint( attachRoot() ); if ( newAp.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create mount directory." , false ); } mount.mount( path, newAp.asString(), "cifs", options.asString(), environment ); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; while( !(mountsucceeded=checkAttached( newAp, DeviceDriver::fstypePredicate( path, {"smb", "cifs"} ) )) && --limit) { MIL << "Mount did not appear yet, sleeping for 1s" << std::endl; sleep(1); } if ( !mountsucceeded ) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaMountException( "Unable to verify that the media was mounted", path, newAp.asString() )); } // if we reach this place, mount worked -> YAY, lets see if that is the desired medium! const auto &isDesired = isDesiredMedium( attachUrl, newAp, verifier, extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt() ); if ( !isDesired ) { try { mount.umount( newAp.asString() ); } catch (const zypp::media::MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW( zypp::media::MediaNotDesiredException( attachUrl ) ); } MIL << "New device " << path << " mounted on " << newAp << std::endl; auto newDev = std::shared_ptr( new zyppng::worker::Device{ ._name = path, ._maj_nr = 0, ._min_nr = 0, ._mountPoint = newAp, ._ephemeral = true, // device should be removed after the last attachment was released ._properties = {} }); knownDevices().push_back( newDev ); attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ newDev, "/" } ) ); return zyppng::worker::AttachResult::success( newDev->_mountPoint ); } catch (const zypp::media::MediaMountException & e) { ZYPP_CAUGHT( e ); if ( e.mountError() == "Permission denied" ) { auto parent = parentWorker(); if ( parent ) { auto res = parent->requireAuthorization( id, attachUrl, username, lastTimestamp ); if ( res ) { canContinue = true; username = res->username; password = res->password; lastTimestamp = res->last_auth_timestamp; } } if ( !canContinue ) { removeAttachPoint(newAp); return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::Forbidden, "No authentication data", false ); } } else { removeAttachPoint(newAp); return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed, false, e ); } } catch (const zypp::media::MediaException & e) { removeAttachPoint(newAp); ZYPP_CAUGHT(e); return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , false , e ); } } // We should never reach this place, but if we do fail the attach request return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , zypp::str::Str()<<"Mounting the medium " << attachUrl << " failed for an unknown reason" , false ); } catch ( const zypp::Exception &e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , false , e );; } catch ( const std::exception &e ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , e.what() , false ); } catch ( ... ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::BadRequest , "Unknown exception" , false ); } } libzypp-17.36.5/tools/zypp-media-smb/smbprovider.h000066400000000000000000000020541476576476200221220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_SMBPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_SMBPROVIDER_H_INCLUDED #include class SmbProvider : public zyppng::worker::DeviceDriver { public: SmbProvider(); ~SmbProvider(); // DeviceDriver interface zyppng::worker::AttachResult mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) override; }; #endif libzypp-17.36.5/tools/zypp-media-tvm/000077500000000000000000000000001476576476200174415ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-media-tvm/CMakeLists.txt000066400000000000000000000020431476576476200222000ustar00rootroot00000000000000PROJECT( zypp-media-tvm C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) SET( SOURCES main.cc testvmprovider.cc testvmprovider.h ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} zypp-media ) target_link_libraries( ${PROJECT_NAME} zypp-core ) target_link_libraries( ${PROJECT_NAME} tvm-protocol-obj ) target_link_libraries( ${PROJECT_NAME} ${YAML_CPP_LIBRARIES}) set_target_properties( ${PROJECT_NAME} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" LIBRARY_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" RUNTIME_OUTPUT_DIRECTORY "${LIBZYPP_BINARY_DIR}/tools/workers" ) libzypp-17.36.5/tools/zypp-media-tvm/main.cc000066400000000000000000000012241476576476200206730ustar00rootroot00000000000000#include "testvmprovider.h" #include #include #include int main( int , char *[] ) { // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); auto driver = std::make_shared(); auto worker = std::make_shared( "zypp-media-tvm", driver ); driver->setProvider(worker); auto res = worker->run (STDIN_FILENO, STDOUT_FILENO); if ( res ) return 0; //@TODO print error return 1; } libzypp-17.36.5/tools/zypp-media-tvm/testvmprovider.cc000066400000000000000000000265061476576476200230560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "testvmprovider.h" #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "TestVMProvider" #include #include extern "C" { #include #include #if HAVE_UDEV #include #endif } using namespace std::literals; constexpr std::string_view CONTENTDIR_PROP = "contentDir"; TestVMProvider::TestVMProvider( ) : zyppng::worker::DeviceDriver( zyppng::worker::WorkerCaps::VolatileMount ) { } TestVMProvider::~TestVMProvider() { } zyppng::expected TestVMProvider::initialize(const zyppng::worker::Configuration &conf) { if ( const auto &i = conf.find( std::string(zyppng::PROVIDER_ROOT) ); i != conf.end() ) { const auto &val = i->second; MIL << "Got provider root from controller: " << val << std::endl; _provRoot = val; } else { return zyppng::expected::error(ZYPP_EXCPT_PTR( zypp::Exception("Provider root required to work.") )); } return DeviceDriver::initialize( conf ); } zyppng::worker::AttachResult TestVMProvider::mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) { std::vector devs; if ( extras.contains( zyppng::AttachMsgFields::Device ) ) { for ( const auto &d : extras.values( zyppng::AttachMsgFields::Device ) ) { if ( d.isString() ) { MIL << "Got device from user we are allowed to use: " << d.asString() << std::endl; devs.push_back(d.asString()); } } } auto &sysDevs = knownDevices(); std::vector> possibleDevs; if ( devs.size () ) { for ( const auto &d : devs ) { std::shared_ptr device; auto i = std::find_if( sysDevs.begin(), sysDevs.end(), [&]( const auto &sysDev ){ return ( sysDev->_name == d ); } ); if ( i == sysDevs.end() ) { ERR << "Device " << d << " from Attach request is not known ignoring!" << std::endl; continue; } else { device = *i; } if ( device ) possibleDevs.push_back(device); } } else { possibleDevs = sysDevs; } // if we have no devices at this point controller gets a error if ( possibleDevs.empty () ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "No useable device found" , false ); } const auto attachRoot = zypp::Pathname( attachUrl.getPathName() ); const auto attachMediaNr = extras.value( zyppng::AttachMsgFields::MediaNr, 1 ).asInt(); // set up the verifier zyppng::MediaDataVerifierRef verifier; if ( extras.contains( zyppng::AttachMsgFields::VerifyType ) ) { verifier = zyppng::MediaDataVerifier::createVerifier( extras.value(zyppng::AttachMsgFields::VerifyType).asString() ); if ( !verifier ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Invalid verifier type" , false ); } if ( !verifier->load( extras.value(zyppng::AttachMsgFields::VerifyData).asString() ) ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create verifier from file" , false ); } } //first check if any of the mounted devices are what we want for( const auto &dev : possibleDevs ) { if ( dev->_mountPoint.empty() ) continue; MIL << "Found mounted device: " << dev->_name << " on mountpoint: " << dev->_mountPoint << std::endl; auto res = isDesiredMedium( attachUrl, dev->_mountPoint / attachRoot, verifier, attachMediaNr ); if ( !res ) continue; MIL << "Found requested medium in dev " << dev->_name << std::endl; // we found the device we want! attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ dev, attachRoot } ) ); return zyppng::worker::AttachResult::success( dev->_mountPoint / attachRoot ); } while ( true ) { // pick up changes from the test detectDevices(); // remember how many devices we were able to test uint devicesTested = 0; // none of the already mounted devices matched, lets try what we have left for( const auto &dev : possibleDevs ) { if ( !dev->_mountPoint.empty() ) continue; MIL << "Trying to mount dev " << dev->_name << std::endl; devicesTested++; bool mountsucceeded = false; // we simply create a symbolic link in the attach dir to simulate mounting zypp::Pathname newAp; try { newAp = createAttachPoint( this->attachRoot() ); if ( newAp.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MountFailed , "Failed to create mount directory." , false ); } newAp = newAp/"mount"; // simulate failed mount const auto &contDir = std::any_cast(dev->_properties[std::string(CONTENTDIR_PROP)]); if ( contDir.empty() ) { ZYPP_THROW( zypp::media::MediaMountException( "Failed to mount device", dev->_name, newAp.asString() )); } const auto res = zypp::filesystem::symlink( contDir, newAp ); mountsucceeded = ( res == 0 ); if( !mountsucceeded) { ZYPP_THROW( zypp::media::MediaMountException( "Failed to mount device", dev->_name, newAp.asString() )); } else { MIL << "Device mounted on " << newAp << std::endl; dev->_mountPoint = newAp; } } catch (const zypp::media::MediaException & excpt_r) { removeAttachPoint(newAp.dirname()); ZYPP_CAUGHT(excpt_r); } if ( mountsucceeded ) { // lets check if we have the correct medium auto res = isDesiredMedium( attachUrl, dev->_mountPoint / attachRoot, verifier, attachMediaNr ); if ( !res ) { unmountDevice( *dev ); continue; } MIL << "Found requested medium in dev " << dev->_name << std::endl; attachedMedia().insert( std::make_pair( attachId, zyppng::worker::AttachedMedia{ dev, attachRoot } ) ); return zyppng::worker::AttachResult::success( dev->_mountPoint / attachRoot ); } } // for each device // we did go through all devices, but didn't find any. if ( devicesTested == 0 ) { // no devices are free return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::Jammed , "No free ressources available" , false ); } else { // k, we need to ask the user to give us the medium we need // first find the devices that are free std::vector freeDevs; for( const auto &dev : possibleDevs ) { if ( !dev->_mountPoint.empty() ) continue; MIL << "Adding " << dev->_name << " to list of free devs" << std::endl; freeDevs.push_back( dev->_name ); } // if there are no devices free, we are jammed if ( freeDevs.empty() ) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::Jammed , "No free ressources available" , false ); } auto changeRes = zyppng::worker::ProvideWorker::ABORT; auto parent = parentWorker(); if ( parent ) changeRes = parent->requestMediaChange ( id, label, attachMediaNr, freeDevs ); if ( changeRes != zyppng::worker::ProvideWorker::SUCCESS ) { if ( changeRes == zyppng::worker::ProvideWorker::SKIP) { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediaChangeSkip , "User asked to skip the media change." , false ); } else { return zyppng::worker::AttachResult::error( zyppng::ProvideMessage::Code::MediaChangeAbort , "User asked to abort the media change." , false ); } } } } } void TestVMProvider::unmountDevice( zyppng::worker::Device &dev ) { if ( dev._mountPoint.empty () ) return; try { zypp::filesystem::unlink( dev._mountPoint ); removeAttachPoint( dev._mountPoint.dirname() ); } catch (const zypp::media::MediaException & excpt_r) { ERR << "Failed to unmount device: " << dev._name << std::endl; ZYPP_CAUGHT(excpt_r); } dev._mountPoint = zypp::Pathname(); } void TestVMProvider::detectDevices( ) { YAML::Node control; try { const auto &fname = _provRoot/"tvm.conf"; control = YAML::LoadFile( fname.asString() ); const auto &set = control.as(); if ( set.devices.empty () ) { MIL << "No devices configured!" << std::endl; return; } auto &sysDevs = knownDevices(); if ( sysDevs.size() ) { for ( const auto &dev : set.devices ) { auto iDev = std::find_if( sysDevs.begin(), sysDevs.end(), [&]( const auto &d ){ return d->_name == dev.name; }); if ( iDev == sysDevs.end() ) { MIL << "Previously unknown device detected" << std::endl; auto d = std::make_shared( zyppng::worker::Device{ ._name = dev.name }); if ( dev.insertedPath.size() ) { d->_properties[std::string(CONTENTDIR_PROP)] = zypp::Pathname(dev.insertedPath); } sysDevs.push_back(d); continue; } // mounted devices are never updated if ( !(*iDev)->_mountPoint.empty() ) { continue; } (*iDev)->_properties[std::string(CONTENTDIR_PROP)] = zypp::Pathname(dev.insertedPath); } } else { for ( const auto &dev : set.devices ) { MIL << "Found device: " << dev.name << std::endl; auto d = std::make_shared( zyppng::worker::Device{ ._name = dev.name }); if ( dev.insertedPath.size() ) { d->_properties[std::string(CONTENTDIR_PROP)] = zypp::Pathname(dev.insertedPath); } sysDevs.push_back(d); } } } catch ( YAML::Exception &e ) { WAR << "YAML exception: " << e.what() << std::endl; return; } catch ( const std::exception &e ) { WAR << "Error when parsing the control file: " << e.what() << std::endl; return; } catch ( ... ) { WAR << "Unknown error when parsing the control file" << std::endl; return; } } libzypp-17.36.5/tools/zypp-media-tvm/testvmprovider.h000066400000000000000000000027721476576476200227170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_TOOLS_DISCPROVIDER_H_INCLUDED #define ZYPP_NG_TOOLS_DISCPROVIDER_H_INCLUDED #include #include #include #include /*! * \file Contains a testprovider to simulate volatile mounting devices. * This is only used in the zypp testsuite. */ class TestVMProvider : public zyppng::worker::DeviceDriver { public: TestVMProvider(); ~TestVMProvider(); // DeviceDriver interface zyppng::expected initialize(const zyppng::worker::Configuration &conf) override; zyppng::worker::AttachResult mountDevice ( const uint32_t id, const zypp::Url &attachUrl, const std::string &attachId, const std::string &label, const zyppng::HeaderValueMap &extras ) override; void detectDevices(); protected: void unmountDevice ( zyppng::worker::Device &dev ) override; private: zypp::Pathname _provRoot; }; #endif libzypp-17.36.5/tools/zypp-pubkey.cc000066400000000000000000000106211476576476200173640ustar00rootroot00000000000000#define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST #define message cout using std::flush; #include namespace opt = boost::program_options; #include #include static std::string appname( "unknown" ); int errexit( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) { cerr << endl << msg_r << endl << endl; } return exit_r; } bool byTTL( const PublicKey & lhs, const PublicKey & rhs ) { int cmp = lhs.gpgPubkeyVersion().compare( rhs.gpgPubkeyVersion() ); if ( cmp ) return cmp < 0; return lhs.gpgPubkeyRelease() > rhs.gpgPubkeyRelease(); // intentionally reverse cdate } std::ostream & dumpPubkeyOn( std::ostream & str, const PublicKey & key_r ) { std::vector art( key_r.asciiArt().asLines( " ", PublicKey::AsciiArt::USE_COLOR ) ); std::vector info; str::split( (str::Str() << dump(key_r)).str(), std::back_inserter( info ), "\n" ); if ( art.size() < info.size() ) { std::string fill( art[0].size(), ' ' ); for ( unsigned i = art.size(); i < info.size(); ++i ) art.push_back( fill ); } for ( unsigned i = 1; i < info.size(); ++i ) art[i] += info[i]; str << info[0] << endl; for ( const auto & line : art ) str << line << endl; return str << endl; } /****************************************************************** ** ** FUNCTION NAME : main ** FUNCTION TYPE : int */ int main( int argc, char * argv[] ) { appname = Pathname::basename( argv[0] ); /////////////////////////////////////////////////////////////////// opt::options_description options( "Options" ); options.add_options() ( "key-file", opt::value >(), "ASCII ascii armored public key file") ( "root", opt::value()->default_value( "/" ), "Use the rmp database from system rooted at ARG") ( "help,?", "Produce this help message") ; opt::positional_options_description positional; positional.add( "key-file", -1 ); opt::variables_map vm; opt::store( opt::command_line_parser( argc, argv ).options( options ).positional( positional ).run(), vm ); opt::notify( vm ); if ( vm.count( "help" ) ) { cerr << "Usage: " << appname << " [OPTIONS] [key-files...]" << endl; cerr << "If no key files are given, list info about all gpg-pubkeys in the rpm database." << endl; cerr << "Otherwise print info about each key and wheter it is present in the rpm database. " << endl; cerr << options << endl; return 1; } /////////////////////////////////////////////////////////////////// if ( ! PathInfo( vm["root"].as() ).isDir() ) return errexit("--root requires a directory"); target::rpm::RpmDb rpmdb; rpmdb.initDatabase( vm["root"].as() ); std::list rpmpubkeys( rpmdb.pubkeys() ); rpmpubkeys.sort( byTTL ); if ( ! vm.count( "key-file" ) ) { std::string last; for ( const PublicKey& rpmpubkey : rpmpubkeys ) { if ( last == rpmpubkey.gpgPubkeyVersion() ) cout << rpmpubkey << endl; else { dumpPubkeyOn( cout, rpmpubkey ); last = rpmpubkey.gpgPubkeyVersion(); } } return 0; } /////////////////////////////////////////////////////////////////// for ( const std::string& keyfile : vm["key-file"].as< std::vector >() ) { cout << "=== " << PathInfo( keyfile ) << endl; PublicKey pubkey( keyfile ); dumpPubkeyOn( cout, pubkey ); std::string pubkeyV( pubkey.gpgPubkeyVersion() ); std::string pubkeyR( pubkey.gpgPubkeyRelease() ); unsigned count = 0; for ( const PublicKey& rpmpub : rpmpubkeys ) { if ( rpmpub.gpgPubkeyVersion() == pubkeyV ) { int cmp = rpmpub.gpgPubkeyRelease().compare( pubkeyR ); if ( cmp < 0 ) cout << "<<< "; else if ( cmp > 0 ) cout << ">>> "; else { ++count; cout << "*** "; } cout << "gpg-pubkey-" << rpmpub.gpgPubkeyVersion() << "-" << rpmpub.gpgPubkeyRelease() << " " << rpmpub.daysToLive() << endl; } } if ( ! count ) { cout << "*** Not in rpm database." << endl; } cout << endl; } /////////////////////////////////////////////////////////////////// return 0; } libzypp-17.36.5/tools/zypp-rpm/000077500000000000000000000000001476576476200163545ustar00rootroot00000000000000libzypp-17.36.5/tools/zypp-rpm/BinHeader.cc000066400000000000000000000250651476576476200205140ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/BinHeader.cc * */ extern "C" { #ifdef _RPM_5 #undef RPM_NULL_TYPE #define RPM_NULL_TYPE rpmTagType(0) typedef rpmuint32_t rpm_count_t; #endif } #include #include #include #include #include #include "BinHeader.h" using std::endl; using namespace zypp; /** Helper for header data retieval. * With \c _RPM_4 use \c ::headerGet; with \c _RPM_5 * use the meanwhile deprecated \c ::headerGetEntry. * \ingroup g_RAII */ struct HeaderEntryGetter : private base::NonCopyable { public: HeaderEntryGetter( const Header & h_r, rpmTag & tag_r ); ~HeaderEntryGetter(); rpmTagType type(); rpm_count_t cnt(); void * val(); private: #ifndef _RPM_5 ::rpmtd _rpmtd; #else rpmTagType _type; rpm_count_t _cnt; void * _val; #endif //_RPM_5 }; #ifndef _RPM_5 inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r ) : _rpmtd( ::rpmtdNew() ) { ::headerGet( h_r, tag_r, _rpmtd, HEADERGET_EXT ); } inline HeaderEntryGetter::~HeaderEntryGetter() { ::rpmtdFreeData( _rpmtd ); ::rpmtdFree( _rpmtd ); } inline rpmTagType HeaderEntryGetter::type() { return rpmtdType( _rpmtd ); } inline rpm_count_t HeaderEntryGetter::cnt() { return _rpmtd->count; } inline void * HeaderEntryGetter::val() { return _rpmtd->data; } #else inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r ) : _type( RPM_NULL_TYPE ) , _cnt( 0 ) , _val( 0 ) { ::headerGetEntry( h_r, tag_r, hTYP_t(&_type), &_val, &_cnt ); } inline HeaderEntryGetter::~HeaderEntryGetter() { if ( _val && _type == RPM_STRING_ARRAY_TYPE ) free( _val ); } inline rpmTagType HeaderEntryGetter::type() { return _type; } inline rpm_count_t HeaderEntryGetter::cnt() { return _cnt; } inline void * HeaderEntryGetter::val() { return _val; } #endif //_RPM_5 /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::intList // /////////////////////////////////////////////////////////////////// unsigned BinHeader::intList::set( void * val_r, unsigned cnt_r, rpmTagType type_r ) { _type = type_r; // remember the type! if ( val_r ) switch ( _type ) { #if RPM_CHAR_TYPE != RPM_INT8_TYPE case RPM_CHAR_TYPE: std::vector( static_cast(val_r), static_cast(val_r)+cnt_r ).swap( _data ); break; #endif case RPM_INT8_TYPE: std::vector( static_cast(val_r), static_cast(val_r)+cnt_r ).swap( _data ); break; case RPM_INT16_TYPE: std::vector( static_cast(val_r), static_cast(val_r)+cnt_r ).swap( _data ); break; case RPM_INT32_TYPE: std::vector( static_cast(val_r), static_cast(val_r)+cnt_r ).swap( _data ); break; #ifndef _RPM_5 case RPM_INT64_TYPE: std::vector( static_cast(val_r), static_cast(val_r)+cnt_r ).swap( _data ); break; #endif default: std::vector( cnt_r, 0L ).swap( _data ); break; } else _data.clear(); return _data.size(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::stringList // /////////////////////////////////////////////////////////////////// unsigned BinHeader::stringList::set( char ** val_r, unsigned cnt_r ) { if ( val_r ) std::vector( val_r, val_r+cnt_r ).swap( _data ); else _data.clear(); return _data.size(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::BinHeader // METHOD TYPE : Constructor // BinHeader::BinHeader( Header h_r ) : _h( h_r ) { if ( _h ) { headerLink( _h ); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::BinHeader // METHOD TYPE : Constructor // BinHeader::BinHeader( BinHeader::Ptr & rhs ) { INT << "INJECT from " << rhs; if ( ! (rhs && rhs->_h) ) { _h = 0; } else { _h = rhs->_h; // ::headerLink already done in rhs rhs->_h = 0; } INT << ": " << *this << " (" << rhs << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::~BinHeader // METHOD TYPE : Destructor // BinHeader::~BinHeader() { if ( _h ) { headerFree( _h ); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::assertHeader // METHOD TYPE : void // bool BinHeader::assertHeader() { if ( !_h ) { _h = ::headerNew(); if ( !_h ) { INT << "OOPS: NULL HEADER created!" << endl; return false; } } return true; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::has_tag // METHOD TYPE : bool // // DESCRIPTION : // bool BinHeader::has_tag( tag tag_r ) const { return( !empty() && ::headerIsEntry( _h, tag_r ) ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::int_list // METHOD TYPE : unsigned // // DESCRIPTION : // unsigned BinHeader::int_list( tag tag_r, intList & lst_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return lst_r.set( 0, 0, headerget.type() ); #if RPM_CHAR_TYPE != RPM_INT8_TYPE case RPM_CHAR_TYPE: #endif case RPM_INT8_TYPE: case RPM_INT16_TYPE: case RPM_INT32_TYPE: #ifndef _RPM_5 case RPM_INT64_TYPE: #endif return lst_r.set( headerget.val(), headerget.cnt(), headerget.type() ); default: INT << "RPM_TAG MISSMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return lst_r.set( 0, 0, RPM_NULL_TYPE ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::string_list // METHOD TYPE : unsigned // // DESCRIPTION : // unsigned BinHeader::string_list( tag tag_r, stringList & lst_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return lst_r.set( 0, 0 ); case RPM_STRING_ARRAY_TYPE: return lst_r.set( (char**)headerget.val(), headerget.cnt() ); default: INT << "RPM_TAG MISSMATCH: RPM_STRING_ARRAY_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return lst_r.set( 0, 0 ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::int_val // METHOD TYPE : int // // DESCRIPTION : // int BinHeader::int_val( tag tag_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return 0; #if RPM_CHAR_TYPE != RPM_INT8_TYPE case RPM_CHAR_TYPE: return *(static_cast(headerget.val())); #endif case RPM_INT8_TYPE: return *(static_cast(headerget.val())); case RPM_INT16_TYPE: return *(static_cast(headerget.val())); case RPM_INT32_TYPE: return *(static_cast(headerget.val())); #ifndef _RPM_5 case RPM_INT64_TYPE: return *(static_cast(headerget.val())); #endif default: INT << "RPM_TAG MISSMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return 0; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::string_val // METHOD TYPE : std::string // // DESCRIPTION : // std::string BinHeader::string_val( tag tag_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return ""; case RPM_STRING_TYPE: return (char*)headerget.val(); default: INT << "RPM_TAG MISSMATCH: RPM_STRING_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return ""; } std::string BinHeader::nvra() const { if ( !empty() ) { std::string nvra = string_val( RPMTAG_NVRA ); if ( nvra.empty() ) { //name-version-release-arch nvra = string_val( RPMTAG_NAME ) + "-" + string_val( RPMTAG_VERSION ) + "-" + string_val( RPMTAG_RELEASE) + "-" + string_val( RPMTAG_ARCH ) ; } return nvra; } return ""; } std::string BinHeader::format(const char *fmt) const { zypp::AutoDispose form(headerFormat(_h, fmt, NULL), free); if ( !form ) return std::string(); return std::string(form); } Header BinHeader::get() const { return _h; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::stringList_val // METHOD TYPE : std::list // // DESCRIPTION : // std::list BinHeader::stringList_val( tag tag_r ) const { std::list ret; if ( !empty() ) { stringList lines; unsigned count = string_list( tag_r, lines ); for ( unsigned i = 0; i < count; ++i ) { ret.push_back( lines[i] ); } } return ret; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::dumpOn // METHOD TYPE : ostream & // // DESCRIPTION : // std::ostream & BinHeader::dumpOn( std::ostream & str ) const { ReferenceCounted::dumpOn( str ); return str << '{' << static_cast(_h) << '}'; } libzypp-17.36.5/tools/zypp-rpm/BinHeader.h000066400000000000000000000065311476576476200203530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/BinHeader.h * */ #ifndef ZYPP_TARGET_RPM_BINHEADER_H #define ZYPP_TARGET_RPM_BINHEADER_H extern "C" { #include } #include #include #include #include #include #include #include #include /** * **/ class BinHeader : public zypp::base::ReferenceCounted, private zypp::base::NonCopyable { public: using Ptr = zypp::intrusive_ptr; using constPtr = zypp::intrusive_ptr; using tag = rpmTag; class intList; class stringList; private: Header _h; bool assertHeader(); public: BinHeader( Header h_r = 0 ); /** * Dangerous!<\B> This one takes the header out of rhs * and leaves rhs empty. **/ BinHeader( BinHeader::Ptr & rhs ); ~BinHeader() override; public: bool empty() const { return( _h == NULL ); } bool has_tag( tag tag_r ) const; unsigned int_list( tag tag_r, intList & lst_r ) const; unsigned string_list( tag tag_r, stringList & lst_r ) const; int int_val( tag tag_r ) const; std::string string_val( tag tag_r ) const; std::string format ( const char * fmt) const; Header get() const; std::string nvra() const; public: std::list stringList_val( tag tag_r ) const; public: std::ostream & dumpOn( std::ostream & str ) const override; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::intList /** * **/ class BinHeader::intList : private zypp::base::NonCopyable { public: intList() {} bool empty() const { return _data.empty(); } unsigned size() const { return _data.size(); } long operator[]( const unsigned idx_r ) const { return idx_r < _data.size() ? _data[idx_r] : 0; } private: friend class BinHeader; unsigned set( void * val_r, unsigned cnt_r, rpmTagType type_r ); private: std::vector _data; rpmTagType _type{ RPM_NULL_TYPE }; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::stringList /** * **/ class BinHeader::stringList : private zypp::base::NonCopyable { public: bool empty() const { return _data.empty(); } unsigned size() const { return _data.size(); } std::string operator[]( const unsigned idx_r ) const { return idx_r < _data.size() ? _data[idx_r] : std::string(); } private: friend class BinHeader; unsigned set( char ** val_r, unsigned cnt_r ); private: std::vector _data; }; #endif // ZYPP_TARGET_RPM_BINHEADER_H libzypp-17.36.5/tools/zypp-rpm/CMakeLists.txt000066400000000000000000000030131476576476200211110ustar00rootroot00000000000000PROJECT( zypp-rpm C CXX ) set (CMAKE_CXX_STANDARD 17) SET (CMAKE_CXX_EXTENSIONS OFF) FIND_PACKAGE(Rpm REQUIRED) IF ( NOT RPM_FOUND) MESSAGE( FATAL_ERROR " rpm-devel not found" ) ELSE ( NOT RPM_FOUND) INCLUDE_DIRECTORIES(${RPM_INCLUDE_DIR}) # fix includes not relative to rpm INCLUDE_DIRECTORIES(${RPM_INCLUDE_DIR}/rpm) # rpm verify function and callback states were introduced in rpm-4.15 if( RPM_LIB_VER VERSION_GREATER_EQUAL "4.15.0" AND RPM_LIB_VER VERSION_LESS "5.0.0") ADD_DEFINITIONS( -DHAVE_RPM_VERIFY_TRANSACTION_STEP ) endif() if( RPM_LIB_VER VERSION_GREATER_EQUAL "5.0.0" ) MESSAGE( STATUS "rpm found: enable rpm-4 compat interface." ) ADD_DEFINITIONS(-D_RPM_5) endif () ENDIF( NOT RPM_FOUND) SET( SOURCES errorcodes.h main.cc BinHeader.h BinHeader.cc ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_executable( ${PROJECT_NAME} ${SOURCES} ) target_link_libraries( ${PROJECT_NAME} zypp_exe_compiler_flags ) target_link_libraries( ${PROJECT_NAME} commit-proto-obj ) target_link_libraries( ${PROJECT_NAME} zypp-core ) target_link_libraries( ${PROJECT_NAME} util ) target_link_libraries( ${PROJECT_NAME} ${RPM_LIBRARY} ${RPMIO_LIBRARY} ) INSTALL( TARGETS ${PROJECT_NAME} DESTINATION "${ZYPP_LIBEXEC_INSTALL_DIR}" ) libzypp-17.36.5/tools/zypp-rpm/errorcodes.h000066400000000000000000000020701476576476200206730ustar00rootroot00000000000000#ifndef ZYPP_RPM_ERRORCODES_H #define ZYPP_RPM_ERRORCODES_H #include // This is supposed to contain header only code, add nothing that would require symbols to be linked namespace zypprpm { enum ErrCodes { NoError = 0, FailedToOpenDb, WrongHeaderSize, WrongMessageFormat, RpmInitFailed, FailedToReadPackage, FailedToAddStepToTransaction, RpmFinishedWithTransactionError, // we got explicit error problems from rpm RpmFinishedWithError, // the transaction started but could not be finished) RpmOrderFailed, // running rpmtsorder failed FailedToCreateLock, // we were unable to create a lockfile OtherError = 255 }; } // we will send a end of message tag through the script FD whenever we receive a "STOP" message // this message will consist of this tag and a \n constexpr char endOfScriptTagData[] = { (char)0xde, (char)0xad, (char)0xbe, (char)0xef, '\n' }; constexpr std::string_view endOfScriptTag ( endOfScriptTagData, 5 ); #endif // ZYPP_RPM_ERRORCODES_H libzypp-17.36.5/tools/zypp-rpm/main.cc000066400000000000000000001010201476576476200176010ustar00rootroot00000000000000#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // we do not link against libzypp, but these are pure header only files, if that changes // a copy should be created directly in the zypp-rpm project #include #include extern "C" { #include #include } #include "BinHeader.h" #include "errorcodes.h" #include #include #include #include // Messages to the zypp log sent on stdout/stderr #define ZDBG std::cout #define ZERR std::cerr namespace env { /// Allows to increase rpm loglevel inline bool ZYPP_RPM_DEBUG() { static bool val = [](){ const char * env = getenv("ZYPP_RPM_DEBUG"); return( env && zypp::str::strToBool( env, true ) ); }(); return val; } } // namespace env namespace dbg { struct _dumpTransactionStep { _dumpTransactionStep( const zypp::proto::target::TransactionStep *const step_r ) : _step { step_r } {} std::ostream & dumpOn( std::ostream & str ) const { str << "TStep("; if ( _step ) { if ( std::holds_alternative(*_step) ) { const auto &step = std::get(*_step); str << step.stepId << "|" << step.pathname; } else if ( std::holds_alternative(*_step) ) { const auto &step = std::get(*_step); str << step.stepId << "|" << step.name << "-" << step.version << "-" << step.release << "." << step.arch; } else { str << "OOPS"; } } else { str << "NULL"; } return str << ")"; } const zypp::proto::target::TransactionStep *const _step; }; inline std::ostream & operator<<( std::ostream & str, const _dumpTransactionStep & obj ) { return obj.dumpOn( str ); } inline _dumpTransactionStep dump( const zypp::proto::target::TransactionStep *const obj ) { return _dumpTransactionStep( obj ); } inline _dumpTransactionStep dump( const zypp::proto::target::TransactionStep & obj ) { return _dumpTransactionStep( &obj ); } struct _dumpRpmCallbackType { _dumpRpmCallbackType( rpmCallbackType_e flag_r ) : _flag { flag_r } {} std::ostream & dumpOn( std::ostream & str ) const { str << "RPMCALLBACK"; if ( _flag ) { #define OUTS(E) if ( _flag & RPMCALLBACK_##E ) str << "_" << #E OUTS( INST_PROGRESS ); OUTS( INST_START ); OUTS( INST_OPEN_FILE ); OUTS( INST_CLOSE_FILE ); OUTS( TRANS_PROGRESS ); OUTS( TRANS_START ); OUTS( TRANS_STOP ); OUTS( UNINST_PROGRESS ); OUTS( UNINST_START ); OUTS( UNINST_STOP ); OUTS( UNPACK_ERROR ); OUTS( CPIO_ERROR ); OUTS( SCRIPT_ERROR ); OUTS( SCRIPT_START ); OUTS( SCRIPT_STOP ); OUTS( INST_STOP ); OUTS( ELEM_PROGRESS ); #ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP OUTS( VERIFY_PROGRESS ); OUTS( VERIFY_START ); OUTS( VERIFY_STOP ); #endif #undef OUTS } else { str << "_UNKNOWN"; } return str; } rpmCallbackType_e _flag; }; inline std::ostream & operator<<( std::ostream & str, const _dumpRpmCallbackType & obj ) { return obj.dumpOn( str ); } inline _dumpRpmCallbackType dump( rpmCallbackType obj ) { return _dumpRpmCallbackType( obj ); } } // this is the order we expect the FDs we need to communicate to be set up // by the parent. This is not pretty but it works and is less effort than // setting up a Unix Domain Socket and sending FDs over that. // Usually relying on conventions is not exactly a good idea but in this case we make an exception ;) enum class ExpectedFds : int { MessageFd = STDERR_FILENO+1, ScriptFd = STDERR_FILENO+2 }; using zypp::target::rpm::RpmInstFlag; using zypp::target::rpm::RpmInstFlags; using namespace zypprpm; void *rpmLibCallback( const void *h, const rpmCallbackType what, const rpm_loff_t amount, const rpm_loff_t total, fnpyKey key, rpmCallbackData data ); int rpmLogCallback ( rpmlogRec rec, rpmlogCallbackData data ); template void rpmpsPrintToStream ( Stream &str, rpmps ps ) { if ( !ps ) return; rpmProblem p = nullptr; zypp::AutoDispose psi ( ::rpmpsInitIterator(ps), ::rpmpsFreeIterator ); while ((p = rpmpsiNext(psi))) { zypp::AutoFREE msg( rpmProblemString(p) ); str << "\t" << msg << std::endl; } } bool recvBytes ( int fd, char *buf, size_t n ) { size_t read = 0; while ( read != n ) { const auto r = zyppng::eintrSafeCall( ::read, fd, buf+read, n - read ); if ( r <= 0 ) return false; read += r; } return true; } bool sendBytes ( int fd, const void *buf, size_t n ) { const size_t written = zyppng::eintrSafeCall( ::write, fd, buf, n ); return written == n; } template bool pushMessage ( const Message &msg ) { try { zypp::FdStreamBuf f; if ( !f.open( static_cast( ExpectedFds::MessageFd ), std::ios_base::out ) ) return false; // do not close the fd once the buffer is discarded f.disableAutoClose (); std::ostream outStr( &f ); const auto &maybeMessage = msg.toStompMessage(); if ( !maybeMessage ) { std::rethrow_exception ( maybeMessage.error() ); return false; } maybeMessage->writeTo(outStr); return true; } catch ( const zypp::Exception &e ) { ZERR << "Failed to write message ("< psi ( ::rpmpsInitIterator(ps), ::rpmpsFreeIterator ); while ((p = rpmpsiNext(psi))) { zypp::AutoFREE msg( rpmProblemString(p) ); err.problems.push_back( zypp::str::asString( msg.value() ) ); } return pushMessage( err ); } using RpmHeader = std::shared_ptr>; std::pair readPackage( rpmts ts_r, const zypp::filesystem::Pathname &path_r ) { zypp::PathInfo file( path_r ); if ( ! file.isFile() ) { ZERR << "Not a file: " << path_r << std::endl; return std::make_pair( RpmHeader(), -1 ); } FD_t fd = ::Fopen( path_r.c_str(), "r.ufdio" ); if ( fd == 0 || ::Ferror(fd) ) { ZERR << "Can't open file for reading: " << path_r << " (" << ::Fstrerror(fd) << ")" << std::endl; if ( fd ) ::Fclose( fd ); return std::make_pair( RpmHeader(), -1 ); } Header nh = 0; int res = ::rpmReadPackageFile( ts_r, fd, path_r.asString().c_str(), &nh ); ::Fclose( fd ); if ( ! nh ) { ZERR << "Error reading header from " << path_r << " error(" << res << ")" << std::endl; return std::make_pair( RpmHeader(), res ); } RpmHeader h( nh, ::headerFree ); return std::make_pair( h, res ); } // Remember 'install source rpm' transaction steps (bsc#1228647, installed separately) struct SourcePackageInstallHelper { // < transaction step index, path to the .src.rpm > using StepIndex = std::pair; using StepIndices = std::vector; void remember( std::size_t stepIndex_r, zypp::Pathname pathname_r ) { if ( not stepIndices ) stepIndices = StepIndices(); stepIndices->push_back( {stepIndex_r, std::move(pathname_r)} ); } std::optional stepIndices; // Remembered source rpm installs std::optional currentStep; // Current transaction step index for rpmLibCallback }; struct TransactionData { TransactionData( zypp::proto::target::Commit & commitData_r ) : commitData { commitData_r } {} zypp::proto::target::Commit &commitData; // dbinstance of removals to transaction step index std::unordered_map removePckIndex = {}; // the fd used by rpm to dump script output zypp::AutoDispose rpmFd = {}; // Remember 'install source rpm' transaction steps (bsc#1228647, installed separately) SourcePackageInstallHelper sourcePackageInstallHelper; }; int main( int, char ** ) { // check if our env is set up correctly if ( ::isatty(STDIN_FILENO) || ::isatty(STDOUT_FILENO) || ::isatty(STDERR_FILENO) ) { ZERR << "Running zypp-rpm directly from the console is not supported. This is just a internal helper tool for libzypp." << std::endl; return OtherError; } // make sure the expected FDs are around too struct stat sb{}; if ( fstat( static_cast(ExpectedFds::MessageFd), &sb) == -1 ) { ZERR << "Expected message fd is not valid, aborting" << std::endl; return OtherError; } if ( (sb.st_mode & S_IFMT) != S_IFIFO ){ ZERR << "Expected message fd is not a pipe, aborting" << std::endl; return OtherError; } if ( fstat( static_cast(ExpectedFds::ScriptFd), &sb) == -1 ) { ZERR << "Expected script fd is not valid, aborting" << std::endl; return OtherError; } if ( (sb.st_mode & S_IFMT) != S_IFIFO ){ ZERR << "Expected script fd is not a pipe, aborting" << std::endl; return OtherError; } // lets ignore those, SIGPIPE is better handled via the EPIPE error, and we do not want anyone // to CTRL+C us zyppng::blockSignalsForCurrentThread( { SIGPIPE, SIGINT } ); // lets read our todo from stdin // since all we can receive on stdin is the commit message, there is no need to read a envelope first // we read it directly from the FD zypp::proto::target::Commit msg; try { zypp::PluginFrame pf( std::cin ); const auto &expMsg = zypp::proto::target::Commit::fromStompMessage ( pf ); if ( !expMsg ) { std::rethrow_exception ( expMsg.error() ); } msg = std::move(*expMsg); } catch ( const zypp::Exception &e ) { ZERR << "Wrong commit message format, aborting (" << e << ")" << std::endl; return WrongMessageFormat; } // create or fill a pid file, if there is a existing one just take it over // if we reach this place libzypp has its global lock and made sure there is // no still running zypp-rpm instance. So no need to do anything complicated. using namespace boost::interprocess; struct s_lockinfo { s_lockinfo() = default; s_lockinfo( s_lockinfo && ) = default; s_lockinfo( const s_lockinfo & ) = delete; s_lockinfo &operator= ( s_lockinfo && ) = default; s_lockinfo &operator= ( const s_lockinfo & ) = delete; ~s_lockinfo() { std::scoped_lock lock(fileLock); clearerr( lockFile ); ftruncate( fileno (lockFile), 0 ); fflush( lockFile ); } file_lock fileLock; zypp::AutoFILE lockFile; }; std::optional lockinfo; if ( !msg.lockFilePath.empty () ) { lockinfo.emplace(); zypp::Pathname lockFileName = zypp::Pathname( msg.lockFilePath ) / "zypp-rpm.pid"; lockinfo->lockFile = std::fopen( lockFileName.c_str(), "w"); if ( lockinfo->lockFile == nullptr ) { ZERR << "Failed to create zypp-rpm pidfile." << std::endl; return FailedToCreateLock; } lockinfo->fileLock = file_lock ( lockFileName.c_str() ); std::scoped_lock lock(lockinfo->fileLock); fprintf(lockinfo->lockFile, "%ld\n", (long)getpid() ); fflush( lockinfo->lockFile ); } zypp::ShutdownLock lck("zypp-rpm", "Zypp commit running."); // we have all data ready now lets start installing // first we initialize the rpmdb int rc = ::rpmReadConfigFiles( NULL, NULL ); if ( rc ) { ZERR << "rpmReadConfigFiles returned " << rc << std::endl; return RpmInitFailed; } ::addMacro( NULL, "_dbpath", NULL, msg.dbPath.c_str(), RMIL_CMDLINE ); auto ts = zypp::AutoDispose( ::rpmtsCreate(), ::rpmtsFree );; ::rpmtsSetRootDir( ts, msg.root.c_str() ); int tsFlags = RPMTRANS_FLAG_NONE; int tsVerifyFlags = RPMVSF_DEFAULT; const auto &rpmInstFlags = msg.flags; if ( rpmInstFlags & RpmInstFlag::RPMINST_NODIGEST) tsVerifyFlags |= _RPMVSF_NODIGESTS; if ( rpmInstFlags & RpmInstFlag::RPMINST_NOSIGNATURE) tsVerifyFlags |= _RPMVSF_NOSIGNATURES; if ( rpmInstFlags & RpmInstFlag::RPMINST_EXCLUDEDOCS) tsFlags |= RPMTRANS_FLAG_NODOCS; if ( rpmInstFlags & RpmInstFlag::RPMINST_NOSCRIPTS) tsFlags |= RPMTRANS_FLAG_NOSCRIPTS; if ( rpmInstFlags & RpmInstFlag::RPMINST_JUSTDB) tsFlags |= RPMTRANS_FLAG_JUSTDB; if ( rpmInstFlags & RpmInstFlag::RPMINST_TEST) tsFlags |= RPMTRANS_FLAG_TEST; if ( rpmInstFlags & RpmInstFlag::RPMINST_NOPOSTTRANS) tsFlags |= RPMTRANS_FLAG_NOPOSTTRANS; if ( rpmInstFlags & RpmInstFlag::RPMINST_NOSCRIPTS ) tsFlags |= RPMTRANS_FLAG_NOSCRIPTS; // setup transaction settings ::rpmtsSetFlags( ts, tsFlags ); // set the verify flags so readPackage does the right thing ::rpmtsSetVSFlags( ts, tsVerifyFlags ); #ifdef HAVE_RPMTSSETVFYLEVEL { int vfylevel = ::rpmtsVfyLevel(ts); if ( msg.flags() & RpmInstFlag::RPMINST_NODIGEST) vfylevel &= ~( RPMSIG_DIGEST_TYPE ); if ( msg.flags() & RpmInstFlag::RPMINST_NOSIGNATURE) vfylevel &= ~( RPMSIG_SIGNATURE_TYPE); ::rpmtsSetVfyLevel(ts, vfylevel); } #endif // open database for reading if ( rpmtsGetRdb(ts) == NULL ) { int res = ::rpmtsOpenDB( ts, O_RDWR ); if ( res ) { ZERR << "rpmdbOpen error(" << res << "): " << std::endl; return FailedToOpenDb; } } // the transaction data we will get in the callback TransactionData data { msg }; // do we care about knowing the public key? const bool allowUntrusted = ( rpmInstFlags & RpmInstFlag::RPMINST_ALLOWUNTRUSTED ); for ( std::size_t i = 0; i < msg.transactionSteps.size(); ++i ) { const auto &step = msg.transactionSteps[i]; if ( std::holds_alternative(step) ) { const auto &install = std::get(step); const auto &file = install.pathname; auto rpmHeader = readPackage( ts, install.pathname ); switch(rpmHeader.second) { case RPMRC_OK: break; case RPMRC_NOTTRUSTED: ZERR << zypp::str::Format( "Failed to verify key for %s" ) % file << std::endl; if ( !allowUntrusted ) return FailedToReadPackage; break; case RPMRC_NOKEY: ZERR << zypp::str::Format( "Public key unavailable for %s" ) % file << std::endl; if ( !allowUntrusted ) return FailedToReadPackage; break; case RPMRC_NOTFOUND: ZERR << zypp::str::Format( "Signature not found for %s" ) % file << std::endl; if ( !allowUntrusted ) return FailedToReadPackage; break; case RPMRC_FAIL: ZERR << zypp::str::Format( "Signature does not verify for %s" ) % file << std::endl; return FailedToReadPackage; default: ZERR << zypp::str::Format( "Failed to open(generic error): %1%" ) % file << std::endl; return FailedToReadPackage; } if ( !rpmHeader.first ) { ZERR << zypp::str::Format( "Failed to read rpm header from: %1%" )% file << std::endl; return FailedToReadPackage; } // bsc#1228647: ::rpmtsInstallElement accepts source rpms without an error, but // is not able to handle them correctly within ::rpmtsRun. We need to remember // them and run ::rpmInstallSourcePackage after the ::rpmtsRun is done. if ( ::headerIsSource( rpmHeader.first.get() ) ) { data.sourcePackageInstallHelper.remember( i, install.pathname ); continue; } const auto res = ::rpmtsAddInstallElement( ts, rpmHeader.first.get(), &step, !install.multiversion, nullptr ); if ( res ) { ZERR << zypp::str::Format( "Failed to add %1% to the transaction." )% file << std::endl; return FailedToAddStepToTransaction; } } else if ( std::holds_alternative(step) ) { const auto &remove = std::get(step); const std::string &name = remove.name + "-" + remove.version + "-" + remove.release + "." + remove.arch; bool found = false; zypp::AutoDispose it( ::rpmtsInitIterator( ts, rpmTag(RPMTAG_NAME), remove.name.c_str(), 0 ), ::rpmdbFreeIterator ); while ( ::Header h = ::rpmdbNextIterator( it ) ) { BinHeader hdr(h); if ( hdr.string_val( RPMTAG_VERSION ) == remove.version && hdr.string_val( RPMTAG_RELEASE ) == remove.release && hdr.string_val( RPMTAG_ARCH ) == remove.arch ) { found = true; const auto res = ::rpmtsAddEraseElement( ts, hdr.get(), 0 ); if ( res ) { ZERR << zypp::str::Format( "Failed to add removal of %1% to the transaction." ) % name << std::endl; return FailedToAddStepToTransaction; } data.removePckIndex.insert( std::make_pair( headerGetInstance( h ), i ) ); break; } } if ( !found ) { ZERR << "Unable to remove " << name << " it was not found!" << std::endl; } } else { ZERR << "Ignoring step that is neither a remove, nor a install." << std::endl; } } // set the callback function for progress reporting and things ::rpmtsSetNotifyCallback( ts, rpmLibCallback, &data ); // make sure we get da log ::rpmlogSetMask( RPMLOG_UPTO( RPMLOG_PRI(env::ZYPP_RPM_DEBUG() ? RPMLOG_DEBUG : RPMLOG_INFO) ) ); ::rpmlogSetCallback( rpmLogCallback, nullptr ); // redirect the script output to a fd ( log level MUST be at least INFO ) data.rpmFd = zypp::AutoDispose ( ::fdDup( static_cast( ExpectedFds::ScriptFd ) ), Fclose ); if ( data.rpmFd.value() ) { //ZDBG << "Assigning script FD" << std::endl; ::rpmtsSetScriptFd( ts, data.rpmFd ); } else { ZERR << "Failed to assign script FD" << std::endl; } #if 0 // unset the verify flags, we already checked those when reading the package header and libzypp made sure // all signatures are fine as well ::rpmtsSetVSFlags( ts, rpmtsVSFlags(ts) | _RPMVSF_NODIGESTS | _RPMVSF_NOSIGNATURES ); #ifdef HAVE_RPMTSSETVFYLEVEL { int vfylevel = ::rpmtsVfyLevel(ts); vfylevel &= ~( RPMSIG_DIGEST_TYPE | RPMSIG_SIGNATURE_TYPE); ::rpmtsSetVfyLevel(ts, vfylevel); } #endif #endif // handle --nodeps if ( !( msg.flags & RpmInstFlag::RPMINST_NODEPS) ) { if ( ::rpmtsCheck(ts) ) { zypp::AutoDispose ps( ::rpmtsProblems(ts), ::rpmpsFree ); pushTransactionErrorMessage( ps ); std::ostringstream sstr; sstr << "rpm output:" << "Failed dependencies:" << std::endl; rpmpsPrintToStream( sstr, ps ); const auto &rpmMsg = sstr.str(); // TranslatorExplanation the colon is followed by an error message ZERR << std::string("RPM failed: ") + rpmMsg << std::endl; return RpmFinishedWithTransactionError; } } // those two cases are already handled by libzypp at the time a package set arrives here, // we can safely filter those problems. int tsProbFilterFlags = RPMPROB_FILTER_REPLACEPKG | RPMPROB_FILTER_OLDPACKAGE; if ( msg.ignoreArch ) tsProbFilterFlags |= RPMPROB_FILTER_IGNOREARCH; if ( msg.flags & RpmInstFlag::RPMINST_ALLOWDOWNGRADE ) tsProbFilterFlags |= ( RPMPROB_FILTER_OLDPACKAGE ); // --oldpackage if ( msg.flags & RpmInstFlag::RPMINST_REPLACEFILES ) tsProbFilterFlags |= ( RPMPROB_FILTER_REPLACENEWFILES | RPMPROB_FILTER_REPLACEOLDFILES ); // --replacefiles if ( msg.flags & RpmInstFlag::RPMINST_FORCE ) tsProbFilterFlags |= ( RPMPROB_FILTER_REPLACEPKG | RPMPROB_FILTER_REPLACENEWFILES | RPMPROB_FILTER_REPLACEOLDFILES | RPMPROB_FILTER_OLDPACKAGE ); // --force if ( msg.flags & RpmInstFlag::RPMINST_IGNORESIZE ) tsProbFilterFlags |= RPMPROB_FILTER_DISKSPACE | RPMPROB_FILTER_DISKNODES; const auto orderRes = rpmtsOrder( ts ); if ( orderRes ) { ZERR << zypp::str::Format( "Failed with error %1% while ordering transaction." )% orderRes << std::endl; return RpmOrderFailed; } // clean up memory that is only used for dependency checks and ordering rpmtsClean(ts); // transaction steps are set up lets execute it // the way how libRPM works is that it will try to install all packages even if some of them fail // we need to go over the rpm problem set to mark those steps that have failed, we get no other hint on wether // it worked or not const auto transRes = ::rpmtsRun( ts, nullptr, tsProbFilterFlags ); //data.finishCurrentStep( ); if ( transRes != 0 ) { auto err = RpmFinishedWithError; std::string errMsg; if ( transRes > 0 ) { //@NOTE dnf checks if the problem set is empty and if it is seems to treat the transaction as successful, can this really happen? zypp::AutoDispose ps( ::rpmtsProblems(ts), ::rpmpsFree ); pushTransactionErrorMessage( ps ); std::ostringstream sstr; sstr << "rpm output:" << std::endl; rpmpsPrintToStream( sstr, ps ); errMsg = sstr.str(); err = RpmFinishedWithTransactionError; } else { errMsg = "Running the transaction failed."; } //HistoryLog().comment( str::form("Transaction failed"), true /*timestamp*/ ); std::ostringstream sstr; sstr << "rpm output:" << std::endl << errMsg << std::endl; //HistoryLog().comment(sstr.str()); ZERR << "RPM transaction failed: " + errMsg << std::endl; return err; } // bsc#1228647: ::rpmtsInstallElement accepts source rpms without an error, but // is not able to handle them correctly within ::rpmtsRun. We need to remember // them and run ::rpmInstallSourcePackage after the ::rpmtsRun is done. if ( data.sourcePackageInstallHelper.stepIndices ) { ::rpmtsEmpty( ts ); // Re-create an empty transaction set. auto err = NoError; for ( const auto & [stepi,path] : *data.sourcePackageInstallHelper.stepIndices ) { zypp::AutoDispose fd { ::Fopen( path.c_str(), "r" ), ::Fclose }; data.sourcePackageInstallHelper.currentStep = stepi; // rpmLibCallback needs to look it up ::rpmRC res = ::rpmInstallSourcePackage( ts, fd, nullptr, nullptr ); if ( res != 0 ) { ZERR << "RPM InstallSourcePackage " << path << " failed: " << res << std::endl; err = RpmFinishedWithError; } } data.sourcePackageInstallHelper.currentStep = std::nullopt; // done if ( err != NoError ) { return err; } } //ZDBG << "Success !!!!" << std::endl; return NoError; } std::string_view tagToScriptTypeName ( int tag ) { using namespace std::literals; switch (tag) { case RPMTAG_PREIN: return "prein"sv; case RPMTAG_PREUN: return "preun"sv; case RPMTAG_TRIGGERPREIN: return "triggerprein"sv; case RPMTAG_POSTIN: return "postin"sv; case RPMTAG_POSTUN: return "postun"sv; case RPMTAG_PRETRANS: return "pretrans"sv; case RPMTAG_POSTTRANS: return "posttrans"sv; case RPMTAG_TRIGGERUN: return "triggerun"sv; case RPMTAG_TRIGGERIN: return "triggerin"sv; case RPMTAG_TRIGGERPOSTUN: return "triggerpostun"sv; case RPMTAG_VERIFYSCRIPT: return "verifyscript"sv; default: return ""sv; } } void *rpmLibCallback( const void *h, const rpmCallbackType what, const rpm_loff_t amount, const rpm_loff_t total, fnpyKey key, rpmCallbackData data ) { void * rc = NULL; TransactionData* that = reinterpret_cast( data ); if ( !that ) return rc; static FD_t fd = NULL; const BinHeader header( (Header)h ); auto iStep = key ? reinterpret_cast< const zypp::proto::target::TransactionStep * >( key ) : nullptr; if ( !iStep ) { if ( that->sourcePackageInstallHelper.currentStep ) { // we're in ::rpmInstallSourcePackage iStep = &that->commitData.transactionSteps[*(that->sourcePackageInstallHelper.currentStep)]; } else if ( h ) { auto key = headerGetInstance( header.get() ); if ( key > 0 ) { auto i = that->removePckIndex.find(key); if ( i != that->removePckIndex.end() ) iStep = &that->commitData.transactionSteps[i->second]; } } } #if 0 // dbg log callback sequence (collapsing RPMCALLBACK_INST_PROGRESS) static rpmCallbackType prev = RPMCALLBACK_UNKNOWN; if ( what != RPMCALLBACK_INST_PROGRESS || prev != RPMCALLBACK_INST_PROGRESS ) { ZDBG << "LibCB " << dbg::dump(what) << ": " << dbg::dump(iStep) << " - " << header.nvra() << std::endl; prev = what; } #endif const auto &sendEndOfScriptTag = [&](){ //ZDBG << "Send end of script" << std::endl; ::Fflush( that->rpmFd ); ::sendBytes( static_cast( ExpectedFds::ScriptFd ), endOfScriptTag.data(), endOfScriptTag.size() ); }; switch (what) { case RPMCALLBACK_INST_OPEN_FILE: { if ( !iStep || !std::holds_alternative(*iStep) ) return NULL; const auto &install = std::get(*iStep); if ( install.pathname.empty() ) return NULL; if ( fd != NULL ) ZERR << "ERR opening a file before closing the old one? Really ? " << std::endl; fd = Fopen( install.pathname.data(), "r.ufdio" ); if (fd == NULL || Ferror(fd)) { ZERR << "Error when opening file " << install.pathname.data() << std::endl; if (fd != NULL) { Fclose(fd); fd = NULL; } } else fd = fdLink(fd); return (void *)fd; break; } case RPMCALLBACK_INST_CLOSE_FILE: fd = fdFree(fd); if (fd != NULL) { Fclose(fd); fd = NULL; } break; case RPMCALLBACK_INST_START: { if ( !iStep || !std::holds_alternative(*iStep) ) return rc; zypp::proto::target::PackageBegin step; step.stepId = std::get(*iStep).stepId; pushMessage( step ); break; } case RPMCALLBACK_UNINST_START: { if ( !iStep ) { if ( header.empty() ) { ZERR << "No header and no transaction step for a uninstall start, not sending anything" << std::endl; return rc; } // this is a package cleanup send the report accordingly zypp::proto::target::CleanupBegin step; step.nvra = header.nvra(); pushMessage( step ); } else { if ( !std::holds_alternative(*iStep) ) { ZERR << "Could not find package in removables " << header << " in transaction elements" << std::endl; return rc; } zypp::proto::target::PackageBegin step; step.stepId = std::get(*iStep).stepId; pushMessage( step ); } break; } case RPMCALLBACK_INST_STOP: { if ( !iStep ) { ZERR << "Could not find package " << header << " in transaction elements for " << dbg::dump(what) << std::endl; return rc; } sendEndOfScriptTag(); zypp::proto::target::PackageFinished step; step.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); pushMessage( step ); break; } case RPMCALLBACK_UNINST_STOP: { if ( !iStep ) { if ( header.empty() ) { ZERR << "No header and no transaction step for a uninstall stop, not sending anything" << std::endl; return rc; } sendEndOfScriptTag(); // this is a package cleanup send the report accordingly zypp::proto::target::CleanupFinished step; step.nvra = header.nvra(); pushMessage( step ); } else { sendEndOfScriptTag(); zypp::proto::target::PackageFinished step; step.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); pushMessage( step ); } break; } case RPMCALLBACK_UNPACK_ERROR: { if ( !iStep ) { ZERR << "Could not find package " << header << " in transaction elements for " << dbg::dump(what) << std::endl; return rc; } zypp::proto::target::PackageError step; step.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); pushMessage( step ); break; } case RPMCALLBACK_INST_PROGRESS: { if ( !iStep ) return rc; const auto progress = (double) (total ? ((((float) amount) / total) * 100) : 100.0); zypp::proto::target::PackageProgress step; step.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); step.amount = progress; pushMessage( step ); break; } case RPMCALLBACK_UNINST_PROGRESS: { const auto progress = (double) (total ? ((((float) amount) / total) * 100) : 100.0); if ( !iStep ) { if ( header.empty() ) { ZERR << "No header and no transaction step for a uninstall progress, not sending anything" << std::endl; return rc; } // this is a package cleanup send the report accordingly zypp::proto::target::CleanupProgress step; step.nvra = header.nvra(); step.amount = progress; pushMessage( step ); } else { zypp::proto::target::PackageProgress step; step.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); step.amount = progress; pushMessage( step ); } break; } #ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP case RPMCALLBACK_VERIFY_START: #endif case RPMCALLBACK_TRANS_START: { zypp::proto::target::TransBegin step; const char *n = "Preparing"; #ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP if ( what == RPMCALLBACK_VERIFY_START ) n = "Verifying"; #endif step.name = n; pushMessage( step ); break; } #ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP case RPMCALLBACK_VERIFY_STOP: #endif case RPMCALLBACK_TRANS_STOP: { sendEndOfScriptTag(); zypp::proto::target::TransFinished step; pushMessage( step ); break; } #ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP case RPMCALLBACK_VERIFY_PROGRESS: #endif case RPMCALLBACK_TRANS_PROGRESS: { const auto percentage = (double) (total ? ((((float) amount) / total) * 100) : 100.0); zypp::proto::target::TransProgress prog; prog.amount = percentage; pushMessage( prog ); break; } case RPMCALLBACK_CPIO_ERROR: ZERR << "CPIO Error when installing package" << std::endl; break; case RPMCALLBACK_SCRIPT_START: { zypp::proto::target::ScriptBegin script; if ( iStep ) script.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); else script.stepId = -1; // script type is stored in the amount variable passed to the callback script.scriptType = std::string( tagToScriptTypeName( amount ) ); if ( header.get() ) { script.scriptPackage = header.nvra(); } pushMessage( script ); break; } case RPMCALLBACK_SCRIPT_STOP: { sendEndOfScriptTag(); zypp::proto::target::ScriptFinished script; if ( iStep ) script.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); else script.stepId = ( -1 ); pushMessage( script ); break; } case RPMCALLBACK_SCRIPT_ERROR: { zypp::proto::target::ScriptError script; if ( iStep ) script.stepId = std::visit([](const auto &val){ return val.stepId;}, *iStep ); else script.stepId = ( -1 ); // for RPMCALLBACK_SCRIPT_ERROR 'total' is abused by librpm to distinguish between warning and "real" errors script.fatal = ( total != RPMRC_OK ); pushMessage( script ); break; } case RPMCALLBACK_UNKNOWN: default: break; } return rc; } int rpmLogCallback ( rpmlogRec rec, rpmlogCallbackData ) { int logRc = 0; zypp::proto::target::RpmLog log; log.level = rpmlogRecPriority(rec); log.line = zypp::str::asString( ::rpmlogRecMessage(rec) ); pushMessage( log ); return logRc; } libzypp-17.36.5/tools/zypp-runpurge.cc000066400000000000000000000052411476576476200177360ustar00rootroot00000000000000#include #include "argparse.h" #define INCLUDE_TESTSETUP_WITHOUT_BOOST #include "../tests/lib/TestSetup.h" #undef INCLUDE_TESTSETUP_WITHOUT_BOOST static std::string appname { "NO_NAME" }; int errexit( const std::string & msg_r = std::string(), int exit_r = 100 ) { if ( ! msg_r.empty() ) cerr << endl << appname << ": ERR: " << msg_r << endl << endl; return exit_r; } int usage( const argparse::Options & options_r, int return_r = 0 ) { cerr << "USAGE: " << appname << " [OPTION]... path/to/testcase" << endl; cerr << " Calculate the kernels that would be purged based on the spec and testcase." << endl; cerr << options_r << endl; return return_r; } int main ( int argc, char *argv[] ) { appname = Pathname::basename( argv[0] ); argparse::Options options; options.add() ( "help,h", "Print help and exit." ) ( "uname", "The running kernels uname", argparse::Option::Arg::required ) ( "keepSpec", "The keepspec ( default is oldest,running,latest)", argparse::Option::Arg::required ); auto result = options.parse( argc, argv ); if ( result.count( "help" ) || !result.count("uname") || !result.positionals().size() ) return usage( options, 1 ); const std::string &testcaseDir = result.positionals().front(); const auto &pathInfo = PathInfo(testcaseDir); if ( !pathInfo.isExist() || !pathInfo.isDir() ) { std::cerr << "Invalid or non existing testcase path: " << testcaseDir << std::endl; return 1; } if ( ::chdir( testcaseDir.data() ) != 0 ) { std::cerr << "Failed to chdir to " << testcaseDir << std::endl; return 1; } TestSetup t; try { t.LoadSystemAt( result.positionals().front() ); } catch ( const zypp::Exception &e ) { std::cerr << "Failed to load the testcase at " << result.positionals().front() << std::endl; std::cerr << "Got exception: " << e << std::endl; return 1; } std::string keepSpec = "oldest,running,latest"; if ( result.count("keepSpec") ) { keepSpec = result["keepSpec"].arg(); } PurgeKernels krnls; krnls.setUnameR( result["uname"].arg() ); krnls.setKeepSpec( keepSpec ); krnls.markObsoleteKernels(); const auto &makeNVRA = []( const PoolItem &pck ) -> std::string { return pck.name() + "-" + pck.edition().asString() + "." + pck.arch().asString(); }; auto pool = ResPool::instance(); const filter::ByStatus toBeUninstalledFilter( &ResStatus::isToBeUninstalled ); for ( auto it = pool.byStatusBegin( toBeUninstalledFilter ); it != pool.byStatusEnd( toBeUninstalledFilter ); it++ ) { std::cout << "Removing " << makeNVRA(*it) + (it->status().isByUser() ? " (by user)" : " (autoremoved)") << std::endl; } return 0; } libzypp-17.36.5/zypp-common/000077500000000000000000000000001476576476200157065ustar00rootroot00000000000000libzypp-17.36.5/zypp-common/CMakeLists.txt000066400000000000000000000033171476576476200204520ustar00rootroot00000000000000# Collect all files that may contain translatable texts FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" ) SET( POT_FILE_DEPENDS_ZYPP_COMMON ${POT_FILE_DEPENDS} PARENT_SCOPE ) INCLUDE_DIRECTORIES ( ${LIBZYPP_SOURCE_DIR} ) ADD_DEFINITIONS( -DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL ) SET( zypp_common_base_HEADERS base/DrunkenBishop.h ) SET( zypp_common_base_SRCS base/DrunkenBishop.cc ) INSTALL( FILES ${zypp_common_base_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-common/base" ) SET ( zypp_common_HEADERS KeyManager.h KeyRingException.h PublicKey.h ) SET ( zypp_common_SRCS KeyManager.cc PublicKey.cc ) SET ( zypp_common_private_HEADERS private/keyring_p.h ) SET ( zypp_common_private_SRCS private/keyring_p.cc ) INSTALL( FILES ${zypp_common_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-common" ) SET( zypp_common_lib_SRCS ${zypp_common_base_SRCS} ${zypp_common_SRCS} ${zypp_common_private_SRCS} ) SET( zypp_common_lib_HEADERS ${zypp_common_base_HEADERS} ${zypp_common_HEADERS} ${zypp_common_private_HEADERS} ) # Default loggroup for all files SET_LOGGROUP( "zypp" ${zypp_common_lib_SRCS} ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) add_library( zypp-common STATIC ${zypp_common_lib_SRCS} ${zypp_common_lib_HEADERS} ) target_link_libraries( zypp-common PRIVATE zypp_lib_compiler_flags ) target_link_libraries( zypp-common INTERFACE ${GPGME_LIBRARIES} ) libzypp-17.36.5/zypp-common/KeyManager.cc000066400000000000000000000444731476576476200202540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "KeyManager.h" #include "KeyRingException.h" #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::gpg" /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { // @TODO [threading] // make sure to call the init code of gpgme only once // this might need to be moved to a different location when // threads are introduced into libzypp boost::once_flag gpgme_init_once = BOOST_ONCE_INIT; void initGpgme () { const char *version = gpgme_check_version(NULL); if ( version ) { MIL << "Initialized libgpgme version: " << version << endl; } else { MIL << "Initialized libgpgme with unknown version" << endl; } } //using boost::interprocess pointer because it allows a custom deleter using GpgmeDataPtr = boost::interprocess::scoped_ptr>; using GpgmeKeyPtr = boost::interprocess::scoped_ptr<_gpgme_key, boost::function>; using FILEPtr = boost::interprocess::scoped_ptr>; struct GpgmeErr { GpgmeErr( gpgme_error_t err_r = GPG_ERR_NO_ERROR ) : _err( err_r ) {} operator gpgme_error_t() const { return _err; } private: gpgme_error_t _err; }; std::ostream & operator<<( std::ostream & str, const GpgmeErr & obj ) { return str << "<" << gpgme_strsource(obj) << "> " << gpgme_strerror(obj); } /** \relates gpgme_import_result_t Stream output. */ std::ostream & operator<<( std::ostream & str, const _gpgme_op_import_result & obj ) { str << "gpgme_op_import_result {" << endl; str << " " << obj.considered << " The total number of considered keys." << endl; str << " " << obj.no_user_id << " The number of keys without user ID." << endl; str << " " << obj.imported << " The total number of imported keys." << endl; str << " " << obj.imported_rsa << " imported RSA keys." << endl; str << " " << obj.unchanged << " unchanged keys." << endl; str << " " << obj.new_user_ids << " new user IDs." << endl; str << " " << obj.new_sub_keys << " new sub keys." << endl; str << " " << obj.new_signatures << " new signatures." << endl; str << " " << obj.new_revocations << " new revocations." << endl; str << " " << obj.secret_read << " secret keys read." << endl; str << " " << obj.secret_imported << " imported secret keys." << endl; str << " " << obj.secret_unchanged << " unchanged secret keys." << endl; str << " " << obj.not_imported << " keys not imported." << endl; for ( gpgme_import_status_t p = obj.imports; p; p = p->next ) { str << " - " << p->fpr << ": " << p->result << endl; } // In V.1.11: str << " " << obj.skipped_v3_keys << " skipped v3 keys." << endl; return str << "}"; } } // namespace /////////////////////////////////////////////////////////////////// struct GpgmeException : public KeyRingException { GpgmeException( const std::string & in_r, const GpgmeErr & err_r ) : KeyRingException( str::Format( "libgpgme error in '%1%': %2%" ) % in_r % err_r ) {} }; class KeyManagerCtx::Impl { public: Impl() { boost::call_once( gpgme_init_once, initGpgme ); } Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() { if (_ctx) gpgme_release(_ctx); } /** Return all fingerprints found in \a signature_r. */ std::list readSignaturesFprs( const Pathname & signature_r ) { return readSignaturesFprsOptVerify( signature_r ); } /** Return all fingerprints found in \a signature_r. */ std::list readSignaturesFprs( const ByteArray & signature_r ) { return readSignaturesFprsOptVerify( signature_r ); } /** Tries to verify the \a file_r using \a signature_r. */ bool verifySignaturesFprs( const Pathname & file_r, const Pathname & signature_r ) { bool verify = false; readSignaturesFprsOptVerify( signature_r, file_r, &verify ); return verify; } template< typename Callback > bool importKey(GpgmeDataPtr &data, Callback &&calcDataSize ); gpgme_ctx_t _ctx { nullptr }; bool _volatile { false }; ///< readKeyFromFile workaround bsc#1140670 private: /** Return all fingerprints found in \a signature_r and optionally verify the \a file_r on the fly. * * If \a verify_r is not a \c nullptr, log verification errors and return * whether all signatures are good. */ std::list readSignaturesFprsOptVerify( const Pathname & signature_r, const Pathname & file_r = "/dev/null", bool * verify_r = nullptr ); std::list readSignaturesFprsOptVerify( const ByteArray& keyData_r, const Pathname & file_r = "/dev/null", bool * verify_r = nullptr ); std::list readSignaturesFprsOptVerify( GpgmeDataPtr &sigData, const Pathname & file_r = "/dev/null", bool * verify_r = nullptr ); }; std::list KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const Pathname & signature_r, const Pathname & file_r, bool * verify_r ) { //lets be pessimistic if ( verify_r ) *verify_r = false; if (!PathInfo( signature_r ).isExist()) return std::list(); FILEPtr sigFile(fopen(signature_r.c_str(), "rb"), fclose); if (!sigFile) { ERR << "Unable to open signature file '" << signature_r << "'" <(); } GpgmeDataPtr sigData(nullptr, gpgme_data_release); GpgmeErr err = gpgme_data_new_from_stream (&sigData.get(), sigFile.get()); if (err) { ERR << err << endl; return std::list(); } return readSignaturesFprsOptVerify( sigData, file_r, verify_r ); } std::list KeyManagerCtx::Impl::readSignaturesFprsOptVerify( const ByteArray &keyData_r, const filesystem::Pathname &file_r, bool *verify_r ) { //lets be pessimistic if ( verify_r ) *verify_r = false; GpgmeDataPtr sigData(nullptr, gpgme_data_release); GpgmeErr err = gpgme_data_new_from_mem(&sigData.get(), keyData_r.data(), keyData_r.size(), 1 ); if (err) { ERR << err << endl; return std::list(); } return readSignaturesFprsOptVerify( sigData, file_r, verify_r ); } std::list KeyManagerCtx::Impl::readSignaturesFprsOptVerify(GpgmeDataPtr &sigData, const filesystem::Pathname &file_r, bool *verify_r) { //lets be pessimistic if ( verify_r ) *verify_r = false; FILEPtr dataFile(fopen(file_r.c_str(), "rb"), fclose); if (!dataFile) return std::list(); GpgmeDataPtr fileData(nullptr, gpgme_data_release); GpgmeErr err = gpgme_data_new_from_stream (&fileData.get(), dataFile.get()); if (err) { ERR << err << endl; return std::list(); } err = gpgme_op_verify(_ctx, sigData.get(), fileData.get(), NULL); if (err != GPG_ERR_NO_ERROR) { ERR << err << endl; return std::list(); } gpgme_verify_result_t res = gpgme_op_verify_result(_ctx); if (!res || !res->signatures) { ERR << "Unable to read signature fingerprints" <(); } bool foundBadSignature = false; bool foundGoodSignature = false; std::list signatures; for ( gpgme_signature_t sig = res->signatures; sig; sig = sig->next ) { if ( sig->fpr ) { // bsc#1100427: With libgpgme11-1.11.0 and if a recent gpg version was used // to create the signature, the field may contain the full fingerprint, but // we're expected to return the ID. // [https://github.com/gpg/gpgme/commit/478d1650bbef84958ccce439fac982ef57b16cd0] std::string id( sig->fpr ); if ( id.size() > 16 ) id = id.substr( id.size()-16 ); DBG << "Found signature with ID: " << id << " in " << file_r << std::endl; signatures.push_back( std::move(id) ); } if ( verify_r && sig->status != GPG_ERR_NO_ERROR ) { const auto status = gpgme_err_code(sig->status); // bsc#1180721: libgpgme started to return signatures of unknown keys, which breaks // our workflow when verifying files that have multiple signatures, including some that are // not in the trusted keyring. We should not fail if we have unknown or expired keys and at least a good one. // We will however keep the behaviour of failing if we find a bad signatures even if others are good. if ( status != GPG_ERR_KEY_EXPIRED && status != GPG_ERR_NO_PUBKEY ) { WAR << "Failed signature check: " << file_r << " " << GpgmeErr(sig->status) << endl; if ( !foundBadSignature ) foundBadSignature = true; } else { WAR << "Legacy: Ignore expired or unknown key: " << file_r << " " << GpgmeErr(sig->status) << endl; // for now treat expired keys as good signature if ( status == GPG_ERR_KEY_EXPIRED ) foundGoodSignature = true; } } else { foundGoodSignature = true; } } if ( verify_r ) *verify_r = (!foundBadSignature) && foundGoodSignature; return signatures; } KeyManagerCtx::KeyManagerCtx() : _pimpl( new Impl ) {} KeyManagerCtx KeyManagerCtx::createForOpenPGP() { static Pathname tmppath( zypp::myTmpDir() / "PublicKey" ); filesystem::assert_dir( tmppath ); KeyManagerCtx ret { createForOpenPGP( tmppath ) }; ret._pimpl->_volatile = true; // readKeyFromFile workaround bsc#1140670 return ret; } KeyManagerCtx KeyManagerCtx::createForOpenPGP( const Pathname & keyring_r ) { DBG << "createForOpenPGP(" << keyring_r << ")" << endl; KeyManagerCtx ret; gpgme_ctx_t & ctx { ret._pimpl->_ctx }; // create the context GpgmeErr err = gpgme_new( &ctx ); if ( err != GPG_ERR_NO_ERROR ) ZYPP_THROW( GpgmeException( "gpgme_new", err ) ); // use OpenPGP err = gpgme_set_protocol( ctx, GPGME_PROTOCOL_OpenPGP ); if ( err != GPG_ERR_NO_ERROR ) ZYPP_THROW( GpgmeException( "gpgme_set_protocol", err ) ); if ( !keyring_r.empty() ) { // get engine information to read current state gpgme_engine_info_t enginfo = gpgme_ctx_get_engine_info( ctx ); if ( !enginfo ) ZYPP_THROW( GpgmeException( "gpgme_ctx_get_engine_info", err ) ); err = gpgme_ctx_set_engine_info( ctx, GPGME_PROTOCOL_OpenPGP, enginfo->file_name, keyring_r.c_str() ); if ( err != GPG_ERR_NO_ERROR ) ZYPP_THROW( GpgmeException( "gpgme_ctx_set_engine_info", err ) ); } return ret; } Pathname KeyManagerCtx::homedir() const { Pathname ret; if ( gpgme_engine_info_t enginfo = gpgme_ctx_get_engine_info( _pimpl->_ctx ) ) ret = enginfo->home_dir; return ret; } std::list KeyManagerCtx::listKeys() { std::list ret; GpgmeErr err = GPG_ERR_NO_ERROR; // Reset gpgme_keylist_mode on return! AutoDispose guard { gpgme_get_keylist_mode( _pimpl->_ctx ), bind( &gpgme_set_keylist_mode, _pimpl->_ctx, _1 ) }; // Let listed keys include signatures (required if PublicKeyData are created from the key) if ( (err = gpgme_set_keylist_mode( _pimpl->_ctx, GPGME_KEYLIST_MODE_LOCAL | GPGME_KEYLIST_MODE_SIGS )) != GPG_ERR_NO_ERROR ) { ERR << "gpgme_set_keylist_mode: " << err << endl; return ret; } if ( (err = gpgme_op_keylist_start( _pimpl->_ctx, NULL, 0 )) != GPG_ERR_NO_ERROR ) { ERR << "gpgme_op_keylist_start: " << err << endl; return ret; } // Close list operation on return! AutoDispose guard2 { _pimpl->_ctx, &gpgme_op_keylist_end }; AutoDispose key { nullptr, &gpgme_key_release }; for ( ; gpgme_op_keylist_next( _pimpl->_ctx, &(*key) ) == GPG_ERR_NO_ERROR; key.getDispose()( key ) ) { PublicKeyData data { PublicKeyData::fromGpgmeKey( key ) }; if ( data ) ret.push_back( data ); } return ret; } std::list KeyManagerCtx::readKeyFromFile( const Pathname & keyfile_r ) { // bsc#1140670: GPGME does not support reading keys from a keyfile using // gpgme_data_t and gpgme_op_keylist_from_data_start. Despite GPGME_KEYLIST_MODE_SIGS // the signatures are missing, but we need them to create proper PublicKeyData objects. // While this is not resolved, we read into a temp. keyring. Impl::_volatile helps // to detect whether we can clear and import into the current context or need to // create a temp. one. std::list ret; if ( _pimpl->_volatile ) { // in a volatile context we can simple clear the keyring... filesystem::clean_dir( homedir() ); if ( importKey( keyfile_r ) ) ret = listKeys(); } else { // read in a volatile context ret = createForOpenPGP().readKeyFromFile( keyfile_r ); } return ret; } bool KeyManagerCtx::verify(const Pathname &file, const Pathname &signature) { return _pimpl->verifySignaturesFprs(file, signature); } bool KeyManagerCtx::exportKey(const std::string &id, std::ostream &stream) { GpgmeErr err = GPG_ERR_NO_ERROR; GpgmeKeyPtr foundKey; //search for requested key id gpgme_key_t key = nullptr; gpgme_op_keylist_start(_pimpl->_ctx, NULL, 0); while (!(err = gpgme_op_keylist_next(_pimpl->_ctx, &key))) { if (key->subkeys && id == str::asString(key->subkeys->keyid)) { GpgmeKeyPtr(key, gpgme_key_release).swap(foundKey); break; } gpgme_key_release(key); } gpgme_op_keylist_end(_pimpl->_ctx); if (!foundKey) { WAR << "Key " << id << "not found" << endl; return false; } //function needs a array of keys to export gpgme_key_t keyarray[2]; keyarray[0] = foundKey.get(); keyarray[1] = NULL; GpgmeDataPtr out(nullptr, gpgme_data_release); err = gpgme_data_new (&out.get()); if (err) { ERR << err << endl; return false; } //format as ascii armored gpgme_set_armor (_pimpl->_ctx, 1); // bsc#1179222: Remove outdated self signatures when exporting the key. // The keyring does not order the signatures when multiple versions of the // same key are imported. Rpm however uses the 1st to compute the -release // of the gpg-pubkey. So we export only the latest to get a proper-release. err = gpgme_op_export_keys (_pimpl->_ctx, keyarray, GPGME_EXPORT_MODE_MINIMAL, out.get()); if (!err) { int ret = gpgme_data_seek (out.get(), 0, SEEK_SET); if (ret) { ERR << "Unable to seek in exported key data" << endl; return false; } const int bufsize = 512; char buf[bufsize + 1]; while ((ret = gpgme_data_read(out.get(), buf, bufsize)) > 0) { stream.write(buf, ret); } //failed to read from buffer if (ret < 0) { ERR << "Unable to read exported key data" << endl; return false; } } else { ERR << "Error exporting key: "<< err << endl; return false; } //if we reach this point export was successful return true; } bool KeyManagerCtx::importKey(const Pathname &keyfile) { if ( !PathInfo( keyfile ).isExist() ) { ERR << "Keyfile '" << keyfile << "' does not exist."; return false; } GpgmeDataPtr data(nullptr, gpgme_data_release); GpgmeErr err; err = gpgme_data_new_from_file(&data.get(), keyfile.c_str(), 1); if (err) { ERR << "Error importing key: "<< err << endl; return false; } return _pimpl->importKey( data, [&](){ return PathInfo(keyfile).size(); } ); } bool KeyManagerCtx::importKey( const ByteArray &keydata ) { GpgmeDataPtr data(nullptr, gpgme_data_release); GpgmeErr err; err = gpgme_data_new_from_mem( &data.get(), keydata.data(), keydata.size(), 1); if (err) { ERR << "Error importing key: "<< err << endl; return false; } return _pimpl->importKey( data, [&](){ return keydata.size(); } ); } template bool KeyManagerCtx::Impl::importKey(GpgmeDataPtr &data, Callback &&calcDataSize) { GpgmeErr err; err = gpgme_op_import( _ctx, data.get() ); if (err) { ERR << "Error importing key: "<< err << endl; return false; } // Work around bsc#1127220 [libgpgme] no error upon incomplete import due to signal received. // We need this error, otherwise RpmDb will report the missing keys as 'probably v3'. if ( gpgme_import_result_t res = gpgme_op_import_result(_ctx) ) { if ( ! res->considered && std::forward(calcDataSize)() ) { DBG << *res << endl; ERR << "Error importing key: No keys considered (bsc#1127220, [libgpgme] signal received?)" << endl; return false; } } return (err == GPG_ERR_NO_ERROR); } bool KeyManagerCtx::deleteKey(const std::string &id) { gpgme_key_t key = nullptr; GpgmeErr err = GPG_ERR_NO_ERROR; gpgme_op_keylist_start(_pimpl->_ctx, NULL, 0); while (!(err = gpgme_op_keylist_next(_pimpl->_ctx, &key))) { if (key->subkeys && id == str::asString(key->subkeys->keyid)) { err = gpgme_op_delete(_pimpl->_ctx, key, 0); gpgme_key_release(key); gpgme_op_keylist_end(_pimpl->_ctx); if (err) { ERR << "Error deleting key: "<< err << endl; return false; } return true; } gpgme_key_release(key); } gpgme_op_keylist_end(_pimpl->_ctx); WAR << "Key: '"<< id << "' not found." << endl; return false; } std::list KeyManagerCtx::readSignatureFingerprints(const Pathname &signature) { return _pimpl->readSignaturesFprs(signature); } std::list KeyManagerCtx::readSignatureFingerprints(const ByteArray &keyData) { return _pimpl->readSignaturesFprs(keyData); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-common/KeyManager.h000066400000000000000000000072501476576476200201060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/KeyManager.h * */ #ifndef ZYPP_KEYMANAGER_H #define ZYPP_KEYMANAGER_H #include #include #include #include namespace zypp { /////////////////////////////////////////////////////////////////// /// \class KeyManagerCtx::KeyManagerCtx /// \brief Wrapper for GPGME /// /// Encapsulates all calls to the gpgme library, each instance /// represents a context of operations on the specified keyring. /////////////////////////////////////////////////////////////////// class KeyManagerCtx { public: /** Creates a new KeyManagerCtx for PGP using a volatile temp. homedir/keyring. * * Mainly used with methods, which need a context but do not need a keyring * (like \ref readKeyFromFile or \ref readSignatureFingerprints). * * \note The underlying keyring is intentionally NOT the users keyring. * Think of it as a volatile keyring whose content may get cleared anytime. * * \throws KeyRingException if context can not be created or set up */ static KeyManagerCtx createForOpenPGP(); /** Creates a new KeyManagerCtx for PGP using a custom homedir/keyring. * * \note If you explicitly pass an empty \c Pathname, no homedir/keyring * will be set and GPGME will use its defaults. * * \throws KeyRingException if context can not be created or set up */ static KeyManagerCtx createForOpenPGP( const Pathname & keyring_r ); /** Return the homedir/keyring. */ Pathname homedir() const; /** Returns a list of all public keys found in the current keyring */ std::list listKeys(); /** Returns a list of all \a PublicKeyData found in \a file */ std::list readKeyFromFile(const Pathname & file); /** Tries to verify \a file using \a signature, returns true on success */ bool verify(const Pathname & file, const Pathname & signature); /** Exports the key with \a id into the given \a stream, returns true on success */ bool exportKey(const std::string & id, std::ostream & stream); /** Tries to import a key from \a keyfile, returns true on success */ bool importKey(const Pathname & keyfile); /** Tries to import a key from \a buffer, returns true on success */ bool importKey(const ByteArray & keydata); /** Tries to delete a key specified by \a id, returns true on success */ bool deleteKey (const std::string & id); /** Reads all fingerprints from the \a signature file , returns a list of all found fingerprints */ std::list readSignatureFingerprints(const Pathname & signature); /** Reads all fingerprints from the \a buffer, returns a list of all found fingerprints */ std::list readSignatureFingerprints( const ByteArray & keyData ); private: KeyManagerCtx(); class Impl; RW_pointer _pimpl; ///< Pointer to implementation }; } #endif libzypp-17.36.5/zypp-common/KeyRingException.h000066400000000000000000000024211476576476200213050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-common/KeyRingException.h * */ #ifndef ZYPP_KEYRING_EXCEPTION_H #define ZYPP_KEYRING_EXCEPTION_H #include #include namespace zypp { class ZYPP_API KeyRingException : public Exception { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ KeyRingException() : Exception( "Bad Key Exception" ) {} /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ KeyRingException( const std::string & msg_r ) : Exception( msg_r ) {} /** Dtor. */ ~KeyRingException() throw() override {}; }; } #endif libzypp-17.36.5/zypp-common/PublicKey.cc000066400000000000000000000522671476576476200201200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PublicKey.cc * */ #include #include #include #include #include "PublicKey.h" #include "KeyManager.h" #include #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::gpg" /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { inline bool isExpired( const Date & expires_r ) { return( expires_r && expires_r < Date::now() ); } inline int hasDaysToLive( const Date & expires_r ) { if ( expires_r ) { Date exp( expires_r - Date::now() ); int ret = exp / Date::day; if ( exp < 0 ) ret -= 1; return ret; } return INT_MAX; } inline std::string expiresDetail( const Date & expires_r ) { str::Str str; if ( ! expires_r ) { // translators: an annotation to a gpg keys expiry date str << _("does not expire"); } else if ( isExpired( expires_r ) ) { // translators: an annotation to a gpg keys expiry date: "expired: 1999-04-12" str << ( str::Format(_("expired: %1%") ) % expires_r.printDate() ); } else { // translators: an annotation to a gpg keys expiry date: "expires: 2111-04-12" str << ( str::Format(_("expires: %1%") ) % expires_r.printDate() ); } return str; } inline std::string expiresDetailVerbose( const Date & expires_r ) { if ( !expires_r ) { // translators: an annotation to a gpg keys expiry date return _("(does not expire)"); } std::string ret( expires_r.asString() ); int ttl( hasDaysToLive( expires_r ) ); if ( ttl <= 90 ) { ret += " "; if ( ttl < 0 ) { // translators: an annotation to a gpg keys expiry date ret += _("(EXPIRED)"); } else if ( ttl == 0 ) { // translators: an annotation to a gpg keys expiry date ret += _("(expires within 24h)"); } else { // translators: an annotation to a gpg keys expiry date ret += str::form( PL_("(expires in %d day)", "(expires in %d days)", ttl ), ttl ); } } return ret; } inline std::string keyAlgoName( const gpgme_subkey_t & key_r ) { std::string ret; if ( const char * n = ::gpgme_pubkey_algo_name( key_r->pubkey_algo ) ) ret = str::Str() << n << ' ' << key_r->length; else ret = "?"; return ret; } inline bool shorterIsSuffixCI( const std::string & lhs, const std::string & rhs ) { if ( lhs.size() >= rhs.size() ) return str::endsWithCI( lhs, rhs ); return str::endsWithCI( rhs, lhs ); } } //namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class PublicSubkeyData::Impl /// \brief PublicSubkeyData implementation. /////////////////////////////////////////////////////////////////// struct PublicSubkeyData::Impl { std::string _id; Date _created; Date _expires; public: /** Offer default Impl. */ static shared_ptr nullimpl(); private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const; }; shared_ptr PublicSubkeyData::Impl::nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } zypp::PublicSubkeyData::Impl *PublicSubkeyData::Impl::clone() const { return new Impl( *this ); } /////////////////////////////////////////////////////////////////// /// class PublicSubkeyData /////////////////////////////////////////////////////////////////// PublicSubkeyData::PublicSubkeyData() : _pimpl( Impl::nullimpl() ) {} PublicSubkeyData::PublicSubkeyData(const _gpgme_subkey *rawSubKeyData) : _pimpl (new Impl) { _pimpl->_created = zypp::Date(rawSubKeyData->timestamp); _pimpl->_expires = zypp::Date(rawSubKeyData->expires); _pimpl->_id = str::asString(rawSubKeyData->keyid); } PublicSubkeyData::~PublicSubkeyData() {} PublicSubkeyData::operator bool() const { return !_pimpl->_id.empty(); } std::string PublicSubkeyData::id() const { return _pimpl->_id; } Date PublicSubkeyData::created() const { return _pimpl->_created; } Date PublicSubkeyData::expires() const { return _pimpl->_expires; } bool PublicSubkeyData::expired() const { return isExpired( _pimpl->_expires ); } int PublicSubkeyData::daysToLive() const { return hasDaysToLive( _pimpl->_expires ); } std::string PublicSubkeyData::asString() const { return str::Str() << id() << " " << created().printDate() << " [" << expiresDetail( expires() ) << "]"; } /////////////////////////////////////////////////////////////////// /// \class PublicKeySignatureData::Impl /// \brief PublicKeySignatureData implementation. /////////////////////////////////////////////////////////////////// struct PublicKeySignatureData::Impl { std::string _keyid; std::string _name; Date _created; Date _expires; public: /** Offer default Impl. */ static shared_ptr nullimpl(); private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const; }; shared_ptr PublicKeySignatureData::Impl::nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } zypp::PublicKeySignatureData::Impl *PublicKeySignatureData::Impl::clone() const { return new Impl( *this ); } /////////////////////////////////////////////////////////////////// /// class PublicKeySignatureData /////////////////////////////////////////////////////////////////// PublicKeySignatureData::PublicKeySignatureData() : _pimpl( Impl::nullimpl() ) {} PublicKeySignatureData::PublicKeySignatureData(const _gpgme_key_sig *rawKeySignatureData) : _pimpl (new Impl) { _pimpl->_keyid = str::asString(rawKeySignatureData->keyid); _pimpl->_name = str::asString(rawKeySignatureData->uid); _pimpl->_created = zypp::Date(rawKeySignatureData->timestamp); _pimpl->_expires = zypp::Date(rawKeySignatureData->expires); } PublicKeySignatureData::~PublicKeySignatureData() {} PublicKeySignatureData::operator bool() const { return !_pimpl->_keyid.empty(); } std::string PublicKeySignatureData::id() const { return _pimpl->_keyid; } std::string PublicKeySignatureData::name() const { return _pimpl->_name; } Date PublicKeySignatureData::created() const { return _pimpl->_created; } Date PublicKeySignatureData::expires() const { return _pimpl->_expires; } bool PublicKeySignatureData::expired() const { return isExpired( _pimpl->_expires ); } int PublicKeySignatureData::daysToLive() const { return hasDaysToLive( _pimpl->_expires ); } std::string PublicKeySignatureData::asString() const { std::string nameStr; if (!name().empty()) { nameStr = str::Str() << name() << " "; } else { nameStr = "[User ID not found] "; } return str::Str() << nameStr << id() << " " << created().printDate() << " [" << expiresDetail( expires() ) << "]"; } /////////////////////////////////////////////////////////////////// /// \class PublicKeyData::Impl /// \brief PublicKeyData implementation. /////////////////////////////////////////////////////////////////// /// struct PublicKeyData::Impl { std::string _id; std::string _name; std::string _fingerprint; std::string _algoName; Date _created; Date _expires; std::vector _subkeys; std::vector _signatures; public: bool hasSubkeyId( const std::string & id_r ) const; public: /** Offer default Impl. */ static shared_ptr nullimpl(); static shared_ptr fromGpgmeKey(gpgme_key_t rawData); private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const; }; bool PublicKeyData::Impl::hasSubkeyId( const std::string &id_r) const { bool ret = false; for ( const PublicSubkeyData & sub : _subkeys ) { if ( shorterIsSuffixCI( sub.id(), id_r ) ) { ret = true; break; } } return ret; } shared_ptr PublicKeyData::Impl::nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } shared_ptr PublicKeyData::Impl::fromGpgmeKey(gpgme_key_t rawData) { //gpgme stores almost nothing in the top level key //the information we look for is stored in the subkey, where subkey[0] //is always the primary key gpgme_subkey_t sKey = rawData->subkeys; if (sKey) { shared_ptr data(new Impl); //libzypp expects the date of the latest signature on the first uid if ( rawData->uids && rawData->uids->signatures ) { data->_created = zypp::Date(rawData->uids->signatures->timestamp); // bsc#1179222: The keyring does not order the signatures when multiple // versions of the same key are imported. We take the last signature here, // the one GPGME_EXPORT_MODE_MINIMAL will later use in export. for ( auto t = rawData->uids->signatures->next; t; t = t->next ) { if (t->keyid != nullptr) { data->_signatures.push_back(PublicKeySignatureData(t)); } if ( t->timestamp > data->_created ) data->_created = t->timestamp; } } else data->_created = zypp::Date(sKey->timestamp); data->_expires = zypp::Date(sKey->expires); data->_fingerprint = str::asString(sKey->fpr); data->_algoName = keyAlgoName( sKey ); data->_id = str::asString(sKey->keyid); //get the primary user ID if (rawData->uids) { data->_name = str::asString(rawData->uids->uid); } //the rest of the keys sKey = sKey->next; while (sKey) { data->_subkeys.push_back( PublicSubkeyData(sKey) ); sKey = sKey->next; } return data; } return nullimpl(); } zypp::PublicKeyData::Impl *PublicKeyData::Impl::clone() const { return new Impl( *this ); } /////////////////////////////////////////////////////////////////// /// class PublicKeyData /////////////////////////////////////////////////////////////////// PublicKeyData::PublicKeyData() : _pimpl( Impl::nullimpl() ) {} PublicKeyData::PublicKeyData(shared_ptr data) : _pimpl( std::move(data) ) {} PublicKeyData::~PublicKeyData() {} PublicKeyData PublicKeyData::fromGpgmeKey(_gpgme_key *data) { return PublicKeyData(Impl::fromGpgmeKey(data)); } PublicKeyData::operator bool() const { return !_pimpl->_fingerprint.empty(); } std::string PublicKeyData::id() const { return _pimpl->_id; } std::string PublicKeyData::name() const { return _pimpl->_name; } std::string PublicKeyData::fingerprint() const { return _pimpl->_fingerprint; } std::string PublicKeyData::algoName() const { return _pimpl->_algoName; } Date PublicKeyData::created() const { return _pimpl->_created; } Date PublicKeyData::expires() const { return _pimpl->_expires; } bool PublicKeyData::expired() const { return isExpired( _pimpl->_expires ); } int PublicKeyData::daysToLive() const { return hasDaysToLive( _pimpl->_expires ); } std::string PublicKeyData::expiresAsString() const { return expiresDetailVerbose( _pimpl->_expires ); } std::string PublicKeyData::gpgPubkeyVersion() const { return _pimpl->_id.empty() ? _pimpl->_id : str::toLower( _pimpl->_id.substr(8,8) ); } std::string PublicKeyData::gpgPubkeyRelease() const { return _pimpl->_created ? str::hexstring( _pimpl->_created ).substr(2) : std::string(); } std::string PublicKeyData::rpmName() const { return str::Format( "gpg-pubkey-%1%-%2%" ) % gpgPubkeyVersion() % gpgPubkeyRelease(); } std::string PublicKeyData::asString() const { if ( not *this ) return "[NO_KEY]"; str::Str str; str << "[" << _pimpl->_id << "-" << gpgPubkeyRelease(); for ( auto && sub : _pimpl->_subkeys ) str << ", " << sub.id(); return str << "] [" << _pimpl->_name.c_str() << "] [" << expiresDetail( _pimpl->_expires ) << "]"; } bool PublicKeyData::hasSubkeys() const { return !_pimpl->_subkeys.empty(); } Iterable PublicKeyData::subkeys() const { return makeIterable( &(*_pimpl->_subkeys.begin()), &(*_pimpl->_subkeys.end()) ); } Iterable PublicKeyData::signatures() const { return makeIterable( &(*_pimpl->_signatures.begin()), &(*_pimpl->_signatures.end()) ); } bool PublicKeyData::providesKey( const std::string & id_r ) const { if ( not isSafeKeyId( id_r ) ) return( id_r.size() == 8 && str::endsWithCI( _pimpl->_id, id_r ) ); if ( str::endsWithCI( _pimpl->_fingerprint, id_r ) ) return true; return _pimpl->hasSubkeyId( id_r ); } PublicKeyData::AsciiArt PublicKeyData::asciiArt() const { return AsciiArt( fingerprint(), algoName() ); } std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj ) { str << "[" << obj.name() << "]" << endl; str << " fpr " << obj.fingerprint() << endl; str << " id " << obj.id() << endl; str << " alg " << obj.algoName() << endl; str << " cre " << Date::ValueType(obj.created()) << ' ' << obj.created() << endl; str << " exp " << Date::ValueType(obj.expires()) << ' ' << obj.expiresAsString() << endl; str << " ttl " << obj.daysToLive() << endl; for ( auto && sub : obj._pimpl->_subkeys ) str << " sub " << sub << endl; str << " rpm " << obj.gpgPubkeyVersion() << "-" << obj.gpgPubkeyRelease() << endl; return str; } bool operator==( const PublicKeyData & lhs, const PublicKeyData & rhs ) { return ( lhs.fingerprint() == rhs.fingerprint() && lhs.created() == rhs.created() ); } /////////////////////////////////////////////////////////////////// /// \class PublicKey::Impl /// \brief PublicKey implementation. /////////////////////////////////////////////////////////////////// struct PublicKey::Impl { Impl() {} Impl( const Pathname & keyFile_r ) : _dontUseThisPtrDirectly( new filesystem::TmpFile ) { PathInfo info( keyFile_r ); MIL << "Taking pubkey from " << keyFile_r << " of size " << info.size() << " and sha1 " << filesystem::checksum(keyFile_r, "sha1") << endl; if ( !info.isExist() ) ZYPP_THROW(Exception("Can't read public key from " + keyFile_r.asString() + ", file not found")); if ( filesystem::hardlinkCopy( keyFile_r, path() ) != 0 ) ZYPP_THROW(Exception("Can't copy public key data from " + keyFile_r.asString() + " to " + path().asString() )); readFromFile(); } Impl( const filesystem::TmpFile & sharedFile_r ) : _dontUseThisPtrDirectly( new filesystem::TmpFile( sharedFile_r ) ) { readFromFile(); } // private from keyring Impl( const filesystem::TmpFile & sharedFile_r, const PublicKeyData & keyData_r ) : _dontUseThisPtrDirectly( new filesystem::TmpFile( sharedFile_r ) ) , _keyData( keyData_r ) { if ( ! keyData_r ) { WAR << "Invalid PublicKeyData supplied: scanning from file" << endl; readFromFile(); } } // private from keyring Impl( const PublicKeyData & keyData_r ) : _keyData( keyData_r ) {} public: const PublicKeyData & keyData() const { return _keyData; } Pathname path() const { return( /*the one and only intended use*/_dontUseThisPtrDirectly ? _dontUseThisPtrDirectly->path() : Pathname() ); } const std::list & hiddenKeys() const { return _hiddenKeys; } protected: void readFromFile() { PathInfo info( path() ); MIL << "Reading pubkey from " << info.path() << " of size " << info.size() << " and sha1 " << filesystem::checksum(info.path(), "sha1") << endl; std::list keys = KeyManagerCtx::createForOpenPGP().readKeyFromFile( path() ); switch ( keys.size() ) { case 0: ZYPP_THROW( BadKeyException( "File " + path().asString() + " doesn't contain public key data" , path() ) ); break; case 1: // ok. _keyData = keys.back(); _hiddenKeys.clear(); break; default: WAR << "File " << path().asString() << " contains multiple keys: " << keys << endl; _keyData = keys.back(); keys.pop_back(); _hiddenKeys.swap( keys ); break; } MIL << "Read pubkey from " << info.path() << ": " << _keyData << endl; } private: shared_ptr _dontUseThisPtrDirectly; // shared_ptr ok because TmpFile itself is a refernce type (no COW) PublicKeyData _keyData; std::list _hiddenKeys; public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // class PublicKey /////////////////////////////////////////////////////////////////// PublicKey::PublicKey() : _pimpl( Impl::nullimpl() ) {} PublicKey::PublicKey( const Pathname & file ) : _pimpl( new Impl( file ) ) {} PublicKey::PublicKey( const filesystem::TmpFile & sharedfile ) : _pimpl( new Impl( sharedfile ) ) {} PublicKey::PublicKey( const filesystem::TmpFile & sharedfile, const PublicKeyData & keyData_r ) : _pimpl( new Impl( sharedfile, keyData_r ) ) {} PublicKey::PublicKey( const PublicKeyData & keyData_r ) : _pimpl( new Impl( keyData_r ) ) {} PublicKey::~PublicKey() {} PublicKey PublicKey::noThrow( const Pathname & keyFile_r ) try { return PublicKey( keyFile_r ); } catch(...) { return PublicKey(); } const PublicKeyData & PublicKey::keyData() const { return _pimpl->keyData(); } Pathname PublicKey::path() const { return _pimpl->path(); } const std::list & PublicKey::hiddenKeys() const { return _pimpl->hiddenKeys(); } bool PublicKey::fileProvidesKey( const std::string & id_r ) const { if ( providesKey( id_r ) ) return true; for ( const auto & keydata : hiddenKeys() ) { if ( keydata.providesKey( id_r ) ) return true; } return false; } std::string PublicKey::id() const { return keyData().id(); } std::string PublicKey::name() const { return keyData().name(); } std::string PublicKey::fingerprint() const { return keyData().fingerprint(); } std::string PublicKey::algoName() const { return keyData().algoName(); } Date PublicKey::created() const { return keyData().created(); } Date PublicKey::expires() const { return keyData().expires(); } bool PublicKey::expired() const { return keyData().expired(); } int PublicKey::daysToLive() const { return keyData().daysToLive(); } std::string PublicKey::expiresAsString() const { return keyData().expiresAsString(); } std::string PublicKey::gpgPubkeyVersion() const { return keyData().gpgPubkeyVersion(); } std::string PublicKey::gpgPubkeyRelease() const { return keyData().gpgPubkeyRelease(); } std::string PublicKey::asString() const { return keyData().asString(); } std::string PublicKey::rpmName() const { return keyData().rpmName(); } bool PublicKey::operator==( const PublicKey & rhs ) const { return rhs.keyData() == keyData(); } bool PublicKey::operator==( const std::string & sid ) const { return ( isSafeKeyId( sid ) || sid.size() == 8 ) && str::endsWithCI( fingerprint(), sid ); } std::ostream & dumpOn( std::ostream & str, const PublicKey & obj ) { return dumpOn( str, obj.keyData() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-common/PublicKey.h000066400000000000000000000403061476576476200177510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PublicKey.h * */ #ifndef ZYPP_PUBLICKEY_H #define ZYPP_PUBLICKEY_H #include #include #include #include #include #include #include #include #include #include #include struct _gpgme_key; struct _gpgme_subkey; struct _gpgme_key_sig; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace filesystem { class TmpFile; } class PublicKeyData; class KeyManagerCtx; /////////////////////////////////////////////////////////////////// /// \class BadKeyException /// \brief Exception thrown when the supplied key is not a valid gpg key /////////////////////////////////////////////////////////////////// class ZYPP_API BadKeyException : public Exception { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ BadKeyException() : Exception( "Bad Key Exception" ) {} Pathname keyFile() const { return _keyfile; } /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ BadKeyException( const std::string & msg_r, Pathname keyfile = Pathname() ) : Exception( msg_r ), _keyfile(std::move(keyfile)) {} /** Dtor. */ ~BadKeyException() throw() override {}; private: Pathname _keyfile; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class PublicSubkeyData /// \brief Class representing a GPG Public Keys subkeys. /// \see \ref PublicKeyData. /////////////////////////////////////////////////////////////////// class ZYPP_API PublicSubkeyData { public: /** Default constructed: empty data. */ PublicSubkeyData(); ~PublicSubkeyData(); /** Whether this contains valid data (not default constructed). */ explicit operator bool() const; public: /** Subkey ID. */ std::string id() const; /** Creation date. */ Date created() const; /** Expiry date, or \c Date() if the key never expires. */ Date expires() const; /** Whether the key has expired. */ bool expired() const; /** Number of days (24h) until the key expires (or since it exired). * A value of \c 0 means the key will expire within the next 24h. * Negative values indicate the key has expired less than \c N days ago. * For keys without expiration date \c INT_MAX is returned. */ int daysToLive() const; /** Simple string representation. * Encodes \ref id, \ref created and \ref expires * \code * 640DB551 2016-04-12 [expires: 2019-04-12] * \endcode */ std::string asString() const; private: struct Impl; RWCOW_pointer _pimpl; friend class PublicKeyData; friend std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj ); PublicSubkeyData(const _gpgme_subkey *rawSubKeyData); }; /////////////////////////////////////////////////////////////////// /** \relates PublicSubkeyData Stream output */ inline std::ostream & operator<<( std::ostream & str, const PublicSubkeyData & obj ) { return str << obj.asString(); } /////////////////////////////////////////////////////////////////// /// \class PublicKeySignatureData /// \brief Class representing a signature on a GPG Public Key. /// \see \ref PublicKeyData. /////////////////////////////////////////////////////////////////// class ZYPP_API PublicKeySignatureData { public: /** Default constructed: empty data. */ PublicKeySignatureData(); ~PublicKeySignatureData(); /** Whether this contains valid data (not default constructed). */ explicit operator bool() const; public: /** The key ID of key used to create the signature. */ std::string id() const; /** The user ID associated with this key, if present. */ std::string name() const; /** Creation date. */ Date created() const; /** Expiry date, or \c Date() if the key never expires. */ Date expires() const; /** Whether the key has expired. */ bool expired() const; /** Number of days (24h) until the key expires (or since it expired). * A value of \c 0 means the key will expire within the next 24h. * Negative values indicate the key has expired less than \c N days ago. * For keys without expiration date \c INT_MAX is returned. */ int daysToLive() const; /** Simple string representation. * Encodes \ref id, \ref created and \ref expires * \code * 640DB551 2016-04-12 [expires: 2019-04-12] * \endcode */ std::string asString() const; private: struct Impl; RWCOW_pointer _pimpl; friend class PublicKeyData; friend std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj ); PublicKeySignatureData(const _gpgme_key_sig *rawKeySignatureData); }; /////////////////////////////////////////////////////////////////// /** \relates PublicKeySignatureData Stream output */ inline std::ostream & operator<<( std::ostream & str, const PublicKeySignatureData & obj ) { return str << obj.asString(); } /////////////////////////////////////////////////////////////////// /// \class PublicKeyData /// \brief Class representing one GPG Public Keys data. /// \ref PublicKeyData are provided e.g. by a \ref PublicKey or /// a \ref KeyRing. \ref PublicKeyData are usually easier to /// retrieve and sufficient unless you actually need an ASCII /// armored version of the key placed in a tempfile. In this /// case use \ref PublicKey. /////////////////////////////////////////////////////////////////// class ZYPP_API PublicKeyData { public: /** Default constructed: empty data. */ PublicKeyData(); ~PublicKeyData(); PublicKeyData(const PublicKeyData &) = default; PublicKeyData(PublicKeyData &&) noexcept = default; PublicKeyData &operator=(const PublicKeyData &) = default; PublicKeyData &operator=(PublicKeyData &&) noexcept = default; /** Whether this contains valid data (not default constructed). */ explicit operator bool() const; public: /** Key ID. */ std::string id() const; /** Key name. */ std::string name() const; /** Key fingerprint.*/ std::string fingerprint() const; /** Key algorithm string like `RSA 2048` */ std::string algoName() const; /** Creation / last modification date (latest selfsig). */ Date created() const; /** Expiry date, or \c Date() if the key never expires. */ Date expires() const; /** Whether the key has expired. */ bool expired() const; /** Number of days (24h) until the key expires (or since it exired). * A value of \c 0 means the key will expire within the next 24h. * Negative values indicate the key has expired less than \c N days ago. * For keys without expiration date \c INT_MAX is returned. */ int daysToLive() const; /** * Expiry info in a human readable form. * The expiry date plus an annotation if the key has expired, or will * expire within 90 days. * \code * (does not expire) * Tue May 11 13:37:33 CEST 2010 * Tue May 11 13:37:33 CEST 2010 (expires in 90 days) * Tue May 11 13:37:33 CEST 2010 (expires in 1 day) * Tue May 11 13:37:33 CEST 2010 (expires within 24h) * Tue May 11 13:37:33 CEST 2010 (EXPIRED) * \endcode */ std::string expiresAsString() const; /** Gpg-pubkey version as computed by rpm (trailing 8 byte \ref id) */ std::string gpgPubkeyVersion() const; /** Gpg-pubkey release as computed by rpm (hexencoded \ref created) */ std::string gpgPubkeyRelease() const; /** Gpg-pubkey name as computed by rpm*/ std::string rpmName () const; /** Gpg-pubkey \ref Edition built from version and release.*/ Edition gpgPubkeyEdition() const { return Edition( gpgPubkeyVersion(), gpgPubkeyRelease() ); } /** Simple string representation. * Encodes \ref id, \ref gpgPubkeyRelease, \ref name and \ref fingerprint. * \code * [E3A5C360307E3D54-4be01a65] [SuSE Package Signing Key ] [4E98E67519D98DC7362A5990E3A5C360307E3D54] * \endcode */ std::string asString() const; public: using SubkeyIterator = const PublicSubkeyData *; using KeySignatureIterator = const PublicKeySignatureData *; /** Whether \ref subkeys is not empty. */ bool hasSubkeys() const; /** Iterate any subkeys. */ Iterable subkeys() const; /** Iterate all key signatures. */ Iterable signatures() const; /** Whether \a id_r is the \ref id or \ref fingerprint of the primary key or of a subkey. * As a convenience also allows to test the 8byte short ID e.g. rpm uses as version. */ bool providesKey( const std::string & id_r ) const; /** Whether this is a long id (64bit/16byte) or even better a fingerprint. * A short Id (32bit/8byte) is not considered to be a safe identifier for a key. */ static bool isSafeKeyId( const std::string & id_r ) { return id_r.size() >= 16; } public: /** Whether \ref signatures is not empty. */ bool hasSignatures() const; public: /** Random art fingerprint visualization type (\ref base::DrunkenBishop). */ using AsciiArt = base::DrunkenBishop; /** Random art fingerprint visualization (\ref base::DrunkenBishop). * \code * PublicKeyData key; * cout << key.asciiArt( PublicKey::AsciiArt::USE_COLOR ) << endl; * \endcode */ AsciiArt asciiArt() const; private: struct Impl; RWCOW_pointer _pimpl; friend class KeyManagerCtx; static PublicKeyData fromGpgmeKey(_gpgme_key *data); PublicKeyData(shared_ptr data); friend std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj ); }; /////////////////////////////////////////////////////////////////// /** \relates PublicKeyData Stream output */ inline std::ostream & operator<<( std::ostream & str, const PublicKeyData & obj ) { return str << obj.asString(); } /** \relates PublicKeyData Detailed stream output */ std::ostream & dumpOn( std::ostream & str, const PublicKeyData & obj ) ZYPP_API; /** \relates PublicKeyData Equal based on fingerprint anf creation date. */ bool operator==( const PublicKeyData & lhs, const PublicKeyData & rhs ) ZYPP_API; /** \relates PublicKeyData NotEqual. */ inline bool operator!=( const PublicKeyData & lhs, const PublicKeyData & rhs ) { return !( lhs == rhs ); } /////////////////////////////////////////////////////////////////// /// \class PublicKey /// \brief Class representing one GPG Public Key (PublicKeyData + ASCII armored in a tempfile). /// /// If you don't need the ASCII armored version of the key stored in /// a tempfile, using \ref PublicKeyData might be sufficient. /// /// \note In case the ASCII armored blob actually contains multiple /// keys, the \b last keys data are made available via the API. The /// additional keys data are made available via \ref hiddenKeys. /////////////////////////////////////////////////////////////////// class ZYPP_API PublicKey { public: /** Implementation */ struct Impl; public: /** Default ctor. */ PublicKey(); /** Ctor taking the key from a file. * * This is quite expensive, as a copy of the file is created and * used. If you can construct PublicKey from a \ref filesystem::TmpFile, * this prevents copying. * * \throws when data does not make a key */ explicit PublicKey( const Pathname & keyFile_r ); /** Ctor reading the key from a \ref TmpFile. * * PublicKey holds a reference on the TmpFile providing the key. * * \throws when data does not make a key */ explicit PublicKey( const filesystem::TmpFile & sharedFile_r ); ~PublicKey(); /** Static ctor returning an empty PublicKey rather than throwing. */ static PublicKey noThrow( const Pathname & keyFile_r ); public: /** The public keys data (\see \ref PublicKeyData).*/ const PublicKeyData & keyData() const; using SubkeyIterator = PublicKeyData::SubkeyIterator; bool isValid() const { return ! ( id().empty() || fingerprint().empty() ); } std::string id() const; //!< \see \ref PublicKeyData std::string name() const; //!< \see \ref PublicKeyData std::string fingerprint() const; //!< \see \ref PublicKeyData std::string algoName() const; //!< \see \ref PublicKeyData Date created() const; //!< \see \ref PublicKeyData Date expires() const; //!< \see \ref PublicKeyData std::string expiresAsString() const; //!< \see \ref PublicKeyData bool expired() const; //!< \see \ref PublicKeyData int daysToLive() const; //!< \see \ref PublicKeyData std::string gpgPubkeyVersion() const; //!< \see \ref PublicKeyData std::string gpgPubkeyRelease() const; //!< \see \ref PublicKeyData std::string asString() const; //!< \see \ref PublicKeyData std::string rpmName () const; Edition gpgPubkeyEdition() const ///!< \see \ref PublicKeyData { return keyData().gpgPubkeyEdition(); } bool hasSubkeys() const ///!< \see \ref PublicKeyData { return keyData().hasSubkeys(); } Iterable subkeys() const ///!< \see \ref PublicKeyData { return keyData().subkeys(); } bool providesKey( const std::string & id_r ) const ///!< \see \ref PublicKeyData { return keyData().providesKey( id_r ); } static bool isSafeKeyId( const std::string & id_r ) ///!< \see \ref PublicKeyData { return PublicKeyData::isSafeKeyId(id_r); } public: using AsciiArt = PublicKeyData::AsciiArt; ///!< \see \ref PublicKeyData AsciiArt asciiArt() const ///!< \see \ref PublicKeyData { return keyData().asciiArt(); } public: /** File containing the ASCII armored key. */ Pathname path() const; /** Additional keys data in case the ASCII armored blob contains multiple keys. */ const std::list & hiddenKeys() const; /** Extends \ref providesKey to look at the hidden keys too. * Those 'hidden' keys become visible when the file is imported into a keyring. */ bool fileProvidesKey( const std::string & id_r ) const; public: bool operator==( const PublicKey & rhs ) const; bool operator!=( const PublicKey & rhs ) const { return not operator==( rhs ); } bool operator==( const std::string & sid ) const; bool operator!=( const std::string & sid ) const { return not operator==( sid ); } private: friend class KeyRingImpl; /** KeyRing ctor: No need to parse file if KeyRing already had valid KeyData. */ PublicKey( const filesystem::TmpFile & sharedFile_r, const PublicKeyData & keyData_r ); /** KeyRing ctor: Legacy callback APIs take PublicKey, but just need the PublicKeyData No need to export to file. */ explicit PublicKey( const PublicKeyData & keyData_r ); private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates PublicKey Stream output */ inline std::ostream & operator<<( std::ostream & str, const PublicKey & obj ) { return str << obj.asString(); } /** \relates PublicKey Detailed stream output */ std::ostream & dumpOn( std::ostream & str, const PublicKey & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PUBLICKEY_H libzypp-17.36.5/zypp-common/base/000077500000000000000000000000001476576476200166205ustar00rootroot00000000000000libzypp-17.36.5/zypp-common/base/DrunkenBishop.cc000066400000000000000000000312621476576476200217060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/DrunkenBishop.cc */ #include #include #include "DrunkenBishop.h" //#include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace base { /////////////////////////////////////////////////////////////////// namespace { /** Direction the drunken Bishop wants to move. */ enum class Direction : std::uint8_t // actually 2 bits { NW = 0x0, NE = 0x1, SW = 0x2, SE = 0x3, }; /** Convert a hex digit (case insensitive) into its (4bit) integral value. * \throws std::invalid_argument if char */ inline std::uint8_t hexDigit( char ch_r ) { switch ( ch_r ) { case 'F': case 'f': return 15; case 'E': case 'e': return 14; case 'D': case 'd': return 13; case 'C': case 'c': return 12; case 'B': case 'b': return 11; case 'A': case 'a': return 10; case '9': return 9; case '8': return 8; case '7': return 7; case '6': return 6; case '5': return 5; case '4': return 4; case '3': return 3; case '2': return 2; case '1': return 1; case '0': return 0; } throw std::invalid_argument( str::Str() << "Not a hex digit '" << ch_r << "'" ); } } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class DrunkenBishop::Impl /// \brief DrunkenBishop implementation. /////////////////////////////////////////////////////////////////// class DrunkenBishop::Impl : private base::NonCopyable { public: /** Default is an empty board. */ Impl() : _h( 0U ) , _w( 0u ) , _s( 0U ) , _e( 0U ) , _renderSSH( true ) {} /** Build up a new board. * \throws std::invalid_argument */ void compute( const std::string & data_r, const std::string & title_r, unsigned height_r = Auto, unsigned width_r = Auto ) { // store rendering details _renderSSH = ( data_r.size() <= 32 ); // up to the ssh fingerprint size _fp = str::toUpper( data_r.size() <= 8 ? data_r : data_r.substr( data_r.size()-8 ) ); _tt = title_r; // init the board _h = odd(height_r); _w = odd(width_r); if ( _h == Auto ) { if ( _renderSSH ) { _w = 17; _h = 9; } else { _w = 19; _h = 11; } } else if ( _w == Auto ) { _w = (2*_h)-1; } _board = std::vector( _w*_h, 0 ); _s = _w*_h/2; // start _e = _s; // current/end ++_board[_e]; // go for ( const char * ch = data_r.c_str(); *ch; /*NOOP*/ ) { std::uint8_t next4 = bite( ch ); // next4: 0x94 // bits: 10 01 01 00 // step: 4 3 2 1 static const std::uint8_t stepMask(0x3); move( Direction( next4 & stepMask ) ); move( Direction( (next4>>2) & stepMask ) ); move( Direction( (next4>>4) & stepMask ) ); move( Direction( (next4>>6) ) ); } } /** Render board to a stream. */ std::ostream & dumpOn( std::ostream & str, const std::string & prefix_r, Options options_r ) const { if ( _board.empty() ) { // "++\n" // "++" return str << prefix_r << "++" << endl << prefix_r << "++"; } static const char * colorReset = "\033[0m"; static const char * colorBg = "\033[48;5;242m"; bool useColor = options_r.testFlag( USE_COLOR ); renderTitleOn( str << prefix_r , _tt ); for ( unsigned p = 0; p < _board.size(); ++p ) { if ( ( p % _w ) == 0 ) { if ( p ) str << ( useColor ? colorReset: "" ) << '|'; str << endl << prefix_r << '|' << ( useColor ? colorBg : "" ); } renderOn( str, useColor, p ); } str << ( useColor ? colorReset: "" ) << '|'; renderTitleOn( str << endl << prefix_r, _fp ); return str; } private: /** Increment even width/height values. */ static unsigned odd( unsigned val_r ) { return( val_r == Auto ? val_r : val_r|1U ); } /** Get next 4 moves (8 bit) from next 2 hex digits (1st digit != '\0' asserted, 0-pad if necessary). * \throws std::invalid_argument if char is not a hex digit or 1st char is \c \0 */ static std::uint8_t bite( const char *& ch_r ) { std::uint8_t ret = hexDigit( *ch_r ) << 4; if ( *(++ch_r) ) ret |= hexDigit( *(ch_r++) ); return ret; } private: /** Move Bishop from \ref _e into \a direction_r and update the \ref _board. */ void move( Direction direction_r ) { switch ( direction_r ) { case Direction::NW: if ( atTL() ) /*no move*/; else if ( atT() ) _e -= 1; else if ( atL() ) _e -= _w; else _e -= _w+1; break; case Direction::NE: if ( atTR() ) /*no move*/; else if ( atT() ) _e += 1; else if ( atR() ) _e -= _w; else _e -= _w-1; break; case Direction::SW: if ( atBL() ) /*no move*/; else if ( atB() ) _e -= 1; else if ( atL() ) _e += _w; else _e += _w-1; break; case Direction::SE: if ( atBR() ) /*no move*/; else if ( atB() ) _e += 1; else if ( atR() ) _e += _w; else _e += _w+1; break; default: throw std::invalid_argument( str::Str() << "Bad Direction " << unsigned(direction_r) ); } // update the board ++_board[_e]; } /** Whether \ref _e is in the top left corner. */ bool atTL() const { return( _e == 0 ); } /** Whether \ref _e is in the top right corner. */ bool atTR() const { return( _e == _w-1 ); } /** Whether \ref _e is in the bottom left corner. */ bool atBL() const { return( _e == _board.size()-_w ); } /** Whether \ref _e is in the bottom right corner. */ bool atBR() const { return( _e == _board.size()-1 ); } /** Whether \ref _e is in the top row. */ bool atT() const { return( _e < _w ); } /** Whether \ref _e is in the bottom row. */ bool atB() const { return( _e >= _board.size()-_w ); } /** Whether \ref _e is in the left column. */ bool atL() const { return( ( _e % _w ) == 0 ); } /** Whether \ref _e is in the right column. */ bool atR() const { return( ( _e % _w ) == (_w-1) ); } private: /** ANSI color heatmap. */ const char * color( std::uint8_t idx_r ) const { static const std::vector colors = { "", // no coin "\033[38;5;21m", // blue (cold) "\033[38;5;39m", "\033[38;5;50m", "\033[38;5;48m", "\033[38;5;46m", // green "\033[38;5;118m", "\033[38;5;190m", "\033[38;5;226m", // yellow "\033[38;5;220m", "\033[38;5;214m", // orange "\033[38;5;208m", "\033[38;5;202m", "\033[38;5;196m", // red "\033[38;5;203m", "\033[38;5;210m", "\033[38;5;217m", // pink "\033[38;5;224m", "\033[38;5;231m", // white (hot) }; #if 0 // cycle through heat map to test all colors if ( ! idx_r ) return ""; static unsigned i = 0; if ( ++i == colors.size() ) i = 1; return colors[i]; #endif return ( idx_r < colors.size() ? colors[idx_r] : *colors.rbegin() ); } /** Render non empty title strings */ std::ostream & renderTitleOn( std::ostream & str, const std::string & title_r ) const { std::string buffer( _w+2, '-' ); *buffer.begin() = *buffer.rbegin() = '+'; if ( !title_r.empty() && _w >= 2 ) // extra 2 for "[]" { std::string::size_type tlen = std::min( title_r.size(), std::string::size_type(_w-2) ); std::string::size_type tpos = (_w-tlen)/2; // not (_w-2-tlen) because buffer is size _w+2 buffer[tpos++] = '['; for ( std::string::size_type p = 0; p < tlen; ++p, ++tpos ) buffer[tpos] = title_r[p]; buffer[tpos] = ']'; } return str << buffer; } /** Render board numbers to printable chars. */ std::ostream & renderOn( std::ostream & str, bool useColor_r, unsigned pos_r ) const { static const std::string sshSet( " .o+=*BOX@%&#/^" ); static const std::string gpgSet( " .^:li?(fxXZ#MW&8%@" ); const std::string & charSet( _renderSSH ? sshSet : gpgSet ); if ( useColor_r ) str << color( _board[pos_r] ); if ( pos_r == _e ) return str << 'E'; if ( pos_r == _s ) return str << 'S'; return str << ( _board[pos_r] < charSet.size() ? charSet[_board[pos_r]] : *charSet.rbegin() ); } private: /** Request default width/height values. */ static constexpr const unsigned Auto = unsigned(-1); private: std::vector _board; ///< the board unsigned _h; ///< board height unsigned _w; ///< board with unsigned _s; ///< start position unsigned _e; ///< end position private: bool _renderSSH; ///< whether to render the ssh (or gpg) char set std::string _fp; ///< fingerprint to render as bottom title std::string _tt; ///< text to render as top title public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } }; /////////////////////////////////////////////////////////////////// // CLASS NAME : DrunkenBishop /////////////////////////////////////////////////////////////////// DrunkenBishop::DrunkenBishop() : _pimpl( Impl::nullimpl() ) { /*nothing to compute*/ } DrunkenBishop::DrunkenBishop( const std::string & data_r, const std::string & title_r ) : _pimpl( new Impl ) { _pimpl->compute( data_r, title_r ); } DrunkenBishop::DrunkenBishop( const std::string & data_r, const std::string & title_r, unsigned height_r ) : _pimpl( new Impl ) { _pimpl->compute( data_r, title_r, height_r ); } DrunkenBishop::DrunkenBishop( const std::string & data_r, const std::string & title_r, unsigned height_r, unsigned width_r ) : _pimpl( new Impl ) { _pimpl->compute( data_r, title_r, height_r, width_r ); } DrunkenBishop::~DrunkenBishop() {} std::ostream & DrunkenBishop::dumpOn( std::ostream & str, const std::string & prefix_r, Options options_r ) const { return _pimpl->dumpOn( str, prefix_r, options_r ); } std::string DrunkenBishop::asString( const std::string & prefix_r, Options options_r ) const { std::ostringstream str; dumpOn( str, prefix_r, options_r ); return str.str(); } std::vector DrunkenBishop::asLines( const std::string & prefix_r, Options options_r ) const { std::vector ret; str::split( asString( prefix_r, options_r ), std::back_inserter(ret), "\n" ); return ret; } } // namespace base /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-common/base/DrunkenBishop.h000066400000000000000000000130471476576476200215510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/DrunkenBishop.h */ #ifndef ZYPP_BASE_DRUNKENBISHOP_H #define ZYPP_BASE_DRUNKENBISHOP_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace base { /////////////////////////////////////////////////////////////////// /// \class DrunkenBishop /// \brief Random art fingerprint visualization /// Visualize fingerprint data on a [17x9] (SSH) or [19x11] (GPG) or /// custom sized board. The default board size and layout depends on /// the data string length (above 32 the GPG board and layout is used). /// /// The data string should be an even sized HEX string, otherwise /// it will be 0-padded. /// /// All ctor calls may throw \ref std::invalid_argument. /// /// \code /// [SuSE Package Signing Key ] /// +------[Title]------+ /// | . . ^ | fpr FEAB502539D846DB2C0961CA70AF9E8139DB7C82 /// | : : . | id 70AF9E8139DB7C82 /// | ^ ^ . | cre 1481108255 Wed Dec 7 11:57:35 2016 /// | ^ . l i | exp 1607252255 Sun Dec 6 11:57:35 2020 /// | : ^ . f : | ttl 992 /// | ? ^ .Sl | rpm 39db7c82-5847eb1f /// | E i ... | /// | ^ .. | /// | . . | /// | . . | /// | .... | /// +----[39DB7C82]-----+ /// \endcode //// /// Based on https://github.com/atoponce/keyart, the development location /// for the Debian signing-party package. We try to use the same charset /// and heatmap. /// See also http://dirk-loss.de/sshvis/drunken_bishop.pdf. /////////////////////////////////////////////////////////////////// class ZYPP_API DrunkenBishop { friend std::ostream & operator<<( std::ostream & str, const DrunkenBishop & obj ); public: /** Default ctor: empty board (1x1) */ DrunkenBishop(); /** Ctor taking a data string (and optional title) and using a default (SSH/GPG) board. */ DrunkenBishop( const std::string & data_r, const std::string & title_r = std::string() ); /** Ctor also taking a desired board height (even value is incremented, width is 2*height-1). */ DrunkenBishop( const std::string & data_r, const std::string & title_r, unsigned height_r ); /** Ctor \overload without optional title */ DrunkenBishop( const std::string & data_r, unsigned height_r ) : DrunkenBishop( data_r, std::string(), height_r ) {} /** Ctor also taking a desired board height and width (even values are incremented). */ DrunkenBishop( const std::string & data_r, const std::string & title_r, unsigned height_r, unsigned width_r ); /** Ctor \overload without optional title */ DrunkenBishop( const std::string & data_r, unsigned height_r, unsigned width_r ) : DrunkenBishop( data_r, std::string(), height_r, width_r ) {} /** Dtor */ ~DrunkenBishop(); public: /* Rendering options */ enum OptionBits { USE_COLOR = (1<<0), ///< use colors }; ZYPP_DECLARE_FLAGS(Options,OptionBits); /** Render board to steam.*/ std::ostream & dumpOn( std::ostream & str, Options options_r = Options() ) const { return dumpOn( str, std::string(), options_r ); } /** \overload taking an indent string prefixing each line. */ std::ostream & dumpOn( std::ostream & str, const std::string & prefix_r, Options options_r = Options() ) const; /** Render board as string.*/ std::string asString( Options options_r = Options() ) const { return asString( std::string(), options_r ); } /** \overload taking an indent string prefixing each line. */ std::string asString( const std::string & prefix_r, Options options_r = Options() ) const; /** Render to an array of lines. */ std::vector asLines( Options options_r = Options() ) const { return asLines( std::string(), options_r ); } /** \overload taking an indent string prefixing each line. */ std::vector asLines( const std::string & prefix_r, Options options_r = Options() ) const; public: class Impl; ///< Implementation class. private: RW_pointer _pimpl; ///< Pointer to implementation. }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS(DrunkenBishop::Options); /** \relates DrunkenBishop Stream output */ inline std::ostream & operator<<( std::ostream & str, const DrunkenBishop & obj ) { return obj.dumpOn( str ); } } // namespace base /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_DRUNKENBISHOP_H libzypp-17.36.5/zypp-common/private/000077500000000000000000000000001476576476200173605ustar00rootroot00000000000000libzypp-17.36.5/zypp-common/private/keyring_p.cc000066400000000000000000000263411476576476200216640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/KeyRing.cc * */ #include "keyring_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::KeyRing" /////////////////////////////////////////////////////////////////// namespace zypp { CachedPublicKeyData::Manip::Manip(CachedPublicKeyData &cache_r, filesystem::Pathname keyring_r) : _cache { cache_r } , _keyring { std::move(keyring_r) } {} KeyManagerCtx &CachedPublicKeyData::Manip::keyManagerCtx() { if ( not _context ) { _context = KeyManagerCtx::createForOpenPGP( _keyring ); } // frankly: don't remember why an explicit setDirty was introduced and // why WatchFile was not enough. Maybe some corner case when the keyrings // are created? _cache.setDirty( _keyring ); return _context.value(); } CachedPublicKeyData::Cache::Cache() {} void CachedPublicKeyData::Cache::setDirty() { _keyringK.reset(); _keyringP.reset(); } void CachedPublicKeyData::Cache::assertCache(const filesystem::Pathname &keyring_r) { // .kbx since gpg2-2.1 if ( !_keyringK ) _keyringK.reset( new WatchFile( keyring_r/"pubring.kbx", WatchFile::NO_INIT ) ); if ( !_keyringP ) _keyringP.reset( new WatchFile( keyring_r/"pubring.gpg", WatchFile::NO_INIT ) ); } bool CachedPublicKeyData::Cache::hasChanged() const { bool k = _keyringK->hasChanged(); // be sure both files are checked bool p = _keyringP->hasChanged(); return k || p; } const std::list &CachedPublicKeyData::operator()(const filesystem::Pathname &keyring_r) const { return getData( keyring_r ); } void CachedPublicKeyData::setDirty(const filesystem::Pathname &keyring_r) { _cacheMap[keyring_r].setDirty(); } CachedPublicKeyData::Manip CachedPublicKeyData::manip(filesystem::Pathname keyring_r) { return Manip( *this, std::move(keyring_r) ); } const std::list &CachedPublicKeyData::getData(const filesystem::Pathname &keyring_r) const { Cache & cache( _cacheMap[keyring_r] ); // init new cache entry cache.assertCache( keyring_r ); return getData( keyring_r, cache ); } const std::list &CachedPublicKeyData::getData(const filesystem::Pathname &keyring_r, Cache &cache_r) const { if ( cache_r.hasChanged() ) { cache_r._data = KeyManagerCtx::createForOpenPGP( keyring_r ).listKeys(); MIL << "Found keys: " << cache_r._data << std::endl; } return cache_r._data; } KeyRingImpl::KeyRingImpl(const filesystem::Pathname &baseTmpDir) : _trusted_tmp_dir( baseTmpDir, "zypp-trusted-kr" ) , _general_tmp_dir( baseTmpDir, "zypp-general-kr" ) , _base_dir( baseTmpDir ) { } void KeyRingImpl::importKey( const PublicKey & key, bool trusted ) { importKey( key.path(), trusted ? trustedKeyRing() : generalKeyRing() ); MIL << "Imported key " << key << " to " << (trusted ? "trustedKeyRing" : "generalKeyRing" ) << endl; if ( trusted ) { if ( key.hiddenKeys().empty() ) { _sigTrustedKeyAdded.emit( key ); } else { // multiple keys: Export individual keys ascii armored to import in rpmdb _sigTrustedKeyAdded.emit( exportKey( key, trustedKeyRing() ) ); for ( const PublicKeyData & hkey : key.hiddenKeys() ) _sigTrustedKeyAdded.emit( exportKey( hkey, trustedKeyRing() ) ); } } } void KeyRingImpl::multiKeyImport( const Pathname & keyfile_r, bool trusted_r ) { importKey( keyfile_r, trusted_r ? trustedKeyRing() : generalKeyRing() ); } void KeyRingImpl::deleteKey( const std::string & id, bool trusted ) { PublicKeyData keyDataToDel( publicKeyExists( id, trusted ? trustedKeyRing() : generalKeyRing() ) ); if ( ! keyDataToDel ) { WAR << "Key to delete [" << id << "] is not in " << (trusted ? "trustedKeyRing" : "generalKeyRing" ) << endl; return; } deleteKey( id, trusted ? trustedKeyRing() : generalKeyRing() ); MIL << "Deleted key [" << id << "] from " << (trusted ? "trustedKeyRing" : "generalKeyRing" ) << endl; if ( trusted ) { _sigTrustedKeyAdded.emit ( PublicKey( keyDataToDel ) ); } } PublicKeyData KeyRingImpl::publicKeyExists( const std::string & id, const Pathname & keyring ) { if ( _allowPreload && keyring == generalKeyRing() ) { _allowPreload = false; preloadCachedKeys(); } PublicKeyData ret; for ( const PublicKeyData & key : publicKeyData( keyring ) ) { if ( key.providesKey( id ) ) { ret = key; break; } } DBG << (ret ? "Found" : "No") << " key [" << id << "] in keyring " << keyring << endl; return ret; } void KeyRingImpl::preloadCachedKeys() { MIL << "preloadCachedKeys into general keyring..." << endl; CachedPublicKeyData::Manip manip { keyRingManip( generalKeyRing() ) }; // Provides the context if we want to manip a cached keyring. // For now just load the 'gpg-pubkey-*.{asc,key}' files into the general keyring, // if their id (derived from the filename) is not in the trusted ring. // TODO: Head for a persistent general keyring. std::set cachedirs; ZConfig & conf { ZConfig::instance() }; cachedirs.insert( conf.pubkeyCachePath() ); cachedirs.insert( "/usr/lib/rpm/gnupg/keys" ); if ( Pathname r = conf.systemRoot(); r != "/" && not r.empty() ) { cachedirs.insert( r / conf.pubkeyCachePath() ); cachedirs.insert( r / "/usr/lib/rpm/gnupg/keys" ); } if ( Pathname r = conf.repoManagerRoot(); r != "/" && not r.empty() ) { cachedirs.insert( r / conf.pubkeyCachePath() ); cachedirs.insert( r / "/usr/lib/rpm/gnupg/keys" ); } std::map keyCandidates; // Collect one file path per keyid const str::regex rx { "^gpg-pubkey-([[:xdigit:]]{8,})(-[[:xdigit:]]{8,})?\\.(asc|key)$" }; for ( const auto & cache : cachedirs ) { dirForEach( cache, [&rx,&keyCandidates]( const Pathname & dir_r, const char *const file_r )->bool { str::smatch what; if ( str::regex_match( file_r, what, rx ) ) { Pathname & remember { keyCandidates[what[1]] }; if ( remember.empty() ) { remember = dir_r / file_r; } } return true; } ); } for ( const auto & p : keyCandidates ) { // Avoid checking the general keyring while it is flagged dirty. // Checking the trusted ring is ok, and most keys will be there anyway. const std::string & id { p.first }; const Pathname & path { p.second }; if ( isKeyTrusted(id) ) continue; if ( manip.keyManagerCtx().importKey( path ) ) { DBG << "preload key file " << path << endl; } else { WAR << "Skipping: Can't preload key file " << path << endl; } } } PublicKey KeyRingImpl::exportKey( const PublicKeyData & keyData, const Pathname & keyring ) { return PublicKey( dumpPublicKeyToTmp( keyData.id(), keyring ), keyData ); } PublicKey KeyRingImpl::exportKey( const std::string & id, const Pathname & keyring ) { PublicKeyData keyData( publicKeyExists( id, keyring ) ); if ( keyData ) return PublicKey( dumpPublicKeyToTmp( keyData.id(), keyring ), keyData ); // Here: key not found WAR << "No key [" << id << "] to export from " << keyring << endl; return PublicKey(); } void KeyRingImpl::dumpPublicKey( const std::string & id, const Pathname & keyring, std::ostream & stream ) { KeyManagerCtx::createForOpenPGP( keyring ).exportKey(id, stream); } filesystem::TmpFile KeyRingImpl::dumpPublicKeyToTmp( const std::string & id, const Pathname & keyring ) { filesystem::TmpFile tmpFile( _base_dir, "pubkey-"+id+"-" ); MIL << "Going to export key [" << id << "] from " << keyring << " to " << tmpFile.path() << endl; std::ofstream os( tmpFile.path().c_str() ); dumpPublicKey( id, keyring, os ); os.close(); return tmpFile; } std::list KeyRingImpl::publicKeys( const Pathname & keyring ) { const std::list & keys( publicKeyData( keyring ) ); std::list ret; for ( const PublicKeyData& keyData : keys ) { PublicKey key( exportKey( keyData, keyring ) ); ret.push_back( key ); MIL << "Found key " << key << endl; } return ret; } void KeyRingImpl::importKey( const Pathname & keyfile, const Pathname & keyring ) { if ( ! PathInfo( keyfile ).isExist() ) // TranslatorExplanation first %s is key name, second is keyring name ZYPP_THROW(KeyRingException( str::Format(_("Tried to import not existent key %s into keyring %s")) % keyfile.asString() % keyring.asString() )); CachedPublicKeyData::Manip manip { keyRingManip( keyring ) }; // Provides the context if we want to manip a cached keyring. if ( ! manip.keyManagerCtx().importKey( keyfile ) ) ZYPP_THROW(KeyRingException(_("Failed to import key."))); } void KeyRingImpl::deleteKey( const std::string & id, const Pathname & keyring ) { CachedPublicKeyData::Manip manip { keyRingManip( keyring ) }; // Provides the context if we want to manip a cached keyring. if ( ! manip.keyManagerCtx().deleteKey( id ) ) ZYPP_THROW(KeyRingException(_("Failed to delete key."))); } std::string KeyRingImpl::readSignatureKeyId( const Pathname & signature ) { if ( ! PathInfo( signature ).isFile() ) ZYPP_THROW(KeyRingException( str::Format(_("Signature file %s not found")) % signature.asString() )); MIL << "Determining key id of signature " << signature << endl; std::list fprs = KeyManagerCtx::createForOpenPGP().readSignatureFingerprints( signature ); if ( ! fprs.empty() ) { std::string &id = fprs.back(); MIL << "Determined key id [" << id << "] for signature " << signature << endl; return id; } return std::string(); } bool KeyRingImpl::verifyFile( const Pathname & file, const Pathname & signature, const Pathname & keyring ) { return KeyManagerCtx::createForOpenPGP( keyring ).verify( file, signature ); } } // namespace zypp libzypp-17.36.5/zypp-common/private/keyring_p.h000066400000000000000000000166621476576476200215330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-common/private/keyring_p.h * */ #ifndef ZYPP_PRIVATE_KEYRINGIMPL_H #define ZYPP_PRIVATE_KEYRINGIMPL_H #include #include #include #include #include namespace zypp { /////////////////////////////////////////////////////////////////// /// \class CachedPublicKeyData /// \brief Functor returning the keyrings data (cached). /// \code /// const std::list & cachedPublicKeyData( const Pathname & keyring ); /// \endcode /////////////////////////////////////////////////////////////////// struct CachedPublicKeyData : private base::NonCopyable { const std::list & operator()( const Pathname & keyring_r ) const; void setDirty( const Pathname & keyring_r ); /////////////////////////////////////////////////////////////////// /// \brief Helper providing on demand a KeyManagerCtx to manip the cached keyring. /// /// The 1st call to \ref keyManagerCtx creates the \ref KeyManagerCtx. Returning /// the context tags the cached data as dirty. Should be used to import/delete keys /// in a cache keyring. struct Manip { NON_COPYABLE_BUT_MOVE( Manip ); Manip( CachedPublicKeyData & cache_r, Pathname keyring_r ); KeyManagerCtx & keyManagerCtx(); private: CachedPublicKeyData & _cache; Pathname _keyring; std::optional _context; }; /////////////////////////////////////////////////////////////////// /** Helper providing on demand a KeyManagerCtx to manip the cached keyring. */ Manip manip( Pathname keyring_r ); private: struct Cache { Cache(); void setDirty(); void assertCache( const Pathname & keyring_r ); bool hasChanged() const; std::list _data; private: scoped_ptr _keyringK; scoped_ptr _keyringP; }; using CacheMap = std::map; const std::list & getData( const Pathname & keyring_r ) const; const std::list & getData( const Pathname & keyring_r, Cache & cache_r ) const; mutable CacheMap _cacheMap; }; /** * @brief KeyRing implementation, shared between zyppng and zypp */ class KeyRingImpl { public: KeyRingImpl( const Pathname & baseTmpDir ); void importKey( const PublicKey & key, bool trusted = false ); void multiKeyImport( const Pathname & keyfile_r, bool trusted_r = false ); void deleteKey( const std::string & id, bool trusted ); std::string readSignatureKeyId( const Pathname & signature ); bool isKeyTrusted( const std::string & id ) { return bool(publicKeyExists( id, trustedKeyRing() )); } bool isKeyKnown( const std::string & id ) { return publicKeyExists( id, trustedKeyRing() ) || publicKeyExists( id, generalKeyRing() ); } std::list trustedPublicKeys() { return publicKeys( trustedKeyRing() ); } std::list publicKeys() { return publicKeys( generalKeyRing() ); } const std::list & trustedPublicKeyData() { return publicKeyData( trustedKeyRing() ); } const std::list & publicKeyData() { return publicKeyData( generalKeyRing() ); } void dumpPublicKey( const std::string & id, bool trusted, std::ostream & stream ) { dumpPublicKey( id, ( trusted ? trustedKeyRing() : generalKeyRing() ), stream ); } PublicKey exportPublicKey( const PublicKeyData & keyData ) { return exportKey( keyData, generalKeyRing() ); } PublicKey exportTrustedPublicKey( const PublicKeyData & keyData ) { return exportKey( keyData, trustedKeyRing() ); } bool verifyFileSignature( const Pathname & file, const Pathname & signature ) { return verifyFile( file, signature, generalKeyRing() ); } bool verifyFileTrustedSignature( const Pathname & file, const Pathname & signature ) { return verifyFile( file, signature, trustedKeyRing() ); } PublicKeyData publicKeyExists( const std::string & id ) { return publicKeyExists(id, generalKeyRing());} PublicKeyData trustedPublicKeyExists( const std::string & id ) { return publicKeyExists(id, trustedKeyRing());} void allowPreload( bool yesno_r ) { _allowPreload = yesno_r; } /** Impl helper providing on demand a KeyManagerCtx to manip a cached keyring. */ CachedPublicKeyData::Manip keyRingManip( const Pathname & keyring ) { return cachedPublicKeyData.manip( keyring ); } bool verifyFile( const Pathname & file, const Pathname & signature, const Pathname & keyring ); void importKey( const Pathname & keyfile, const Pathname & keyring ); PublicKey exportKey( const std::string & id, const Pathname & keyring ); PublicKey exportKey( const PublicKeyData & keyData, const Pathname & keyring ); PublicKey exportKey( const PublicKey & key, const Pathname & keyring ) { return exportKey( key.keyData(), keyring ); } void dumpPublicKey( const std::string & id, const Pathname & keyring, std::ostream & stream ); filesystem::TmpFile dumpPublicKeyToTmp( const std::string & id, const Pathname & keyring ); void deleteKey( const std::string & id, const Pathname & keyring ); std::list publicKeys( const Pathname & keyring); const std::list & publicKeyData( const Pathname & keyring ) { return cachedPublicKeyData( keyring ); } /** Get \ref PublicKeyData for ID (\c false if ID is not found). */ PublicKeyData publicKeyExists( const std::string & id, const Pathname & keyring ); /** Load key files cached on the system into the generalKeyRing. */ void preloadCachedKeys(); const Pathname generalKeyRing() const { return _general_tmp_dir.path(); } const Pathname trustedKeyRing() const { return _trusted_tmp_dir.path(); } zyppng::SignalProxy sigTrustedKeyAdded(){ return _sigTrustedKeyAdded; } zyppng::SignalProxy sigTrustedKeyRemoved() { return _sigTrustedKeyRemoved; } private: // Used for trusted and untrusted keyrings filesystem::TmpDir _trusted_tmp_dir; filesystem::TmpDir _general_tmp_dir; Pathname _base_dir; bool _allowPreload = false; //< General keyring may be preloaded with keys cached on the system. /** Functor returning the keyrings data (cached). * \code * const std::list & cachedPublicKeyData( const Pathname & keyring ); * \endcode */ CachedPublicKeyData cachedPublicKeyData; zyppng::Signal _sigTrustedKeyAdded; zyppng::Signal _sigTrustedKeyRemoved; }; } #endif libzypp-17.36.5/zypp-core/000077500000000000000000000000001476576476200153465ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/APIConfig.h.in000066400000000000000000000021561476576476200176670ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/APIConfig.h * \brief Provides API related macros. */ #ifndef ZYPP_APICONFIG_H #define ZYPP_APICONFIG_H #define LIBZYPP_VERSION_STRING "@VERSION@" #define LIBZYPP_VERSION_MAJOR @LIBZYPP_MAJOR@ #define LIBZYPP_VERSION_MINOR @LIBZYPP_MINOR@ #define LIBZYPP_VERSION_PATCH @LIBZYPP_PATCH@ #define LIBZYPP_SOVERSION @LIBZYPP_SO_FIRST@ #define LIBZYPP_VERSION @LIBZYPP_NUMVERSION@ #define LIBZYPP_CODESTREAM "@LIBZYPP_CODESTREAM@" #cmakedefine01 LIBZYPP_CONFIG_USE_DELTARPM_BY_DEFAULT #endif //ZYPP_APICONFIG_H libzypp-17.36.5/zypp-core/AutoDispose.h000066400000000000000000000254041476576476200177630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/AutoDispose.h * */ #ifndef ZYPP_AUTODISPOSE_H #define ZYPP_AUTODISPOSE_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : AutoDispose // /** Reference counted access to a \c Tp object calling a custom * \c Dispose function when the last AutoDispose handle to it is * destroyed or reset. * * \note As with pointers, constness of an \c AutoDispose object does * \b not apply to the stored \c Tp object. If the stored \c Tp object * should be immutable, you should use AutoDispose\. * * Pass a filename to the application and provide the appropriate * code to be executed when the file is no longer needed: * \code * struct FileCache * { * Pathname getFile(); * void releaseFile( const Pathname & ); * }; * * static FileCache cache; * * void unlink( const Pathname & file_r ); * * AutoDispose provideFile( ... ) * { * if ( file_is_in_cache ) * { * // will call 'cache.releaseFile( file )' * return AutoDispose( cache.getFile(), * bind( &FileCache::releaseFile, ref(cache), _1 ) ); * } * else if ( file_is_temporary ) * { * // will call 'unlink( file )' * return AutoDispose( file, unlink ); * } * else if ( file_is_permanent ) * { * // will do nothing. * return AutoDispose( file ); * } * else * { * // will do nothing. * return AutoDispose(); * } * } * \endcode * * Exception safe handling of temporary files: * \code * void provideFileAt( const Pathname & destination ) * { * AutoDispose guard( destination, unlink ); * * // Any exception here will lead to 'unlink( destination )' * // ... * * // On success: reset the dispose function to NOOP. * guard.resetDispose(); * } * \endcode */ template class AutoDispose { public: using param_type = typename boost::call_traits::param_type; using reference = typename boost::call_traits::reference; using const_reference = typename boost::call_traits::const_reference; using value_type = Tp; using result_type = typename boost::call_traits::value_type; // bsc#1194597: Header is exposed in the public API, so it must be c++11: // using dispose_param_type = std::conditional_t< std::is_pointer_v || std::is_integral_v, Tp const, reference >; using dispose_param_type = std::conditional_t< std::is_pointer_v || std::is_integral_v, Tp const, reference >; public: /** Dispose function signatue. */ using Dispose = function; public: /** Default Ctor using default constructed value and no dispose function. */ AutoDispose() : _pimpl( new Impl( value_type() ) ) {} /** Ctor taking dispose function and using default constructed value. */ explicit AutoDispose( Dispose dispose_r ) : _pimpl( new Impl( value_type(), std::move(dispose_r) ) ) {} /** Ctor taking value and no dispose function. */ explicit AutoDispose( value_type value_r ) : _pimpl( new Impl( std::move(value_r) ) ) {} /** Ctor taking value and dispose function. */ AutoDispose( value_type value_r, Dispose dispose_r ) : _pimpl( new Impl( std::move(value_r), std::move(dispose_r) ) ) {} public: /** Provide implicit conversion to \c Tp\&. */ operator reference() const { return _pimpl->_value; } /** Reference to the \c Tp object. */ reference value() const { return _pimpl->_value; } /** Reference to the \c Tp object. */ reference operator*() const { return _pimpl->_value; } /** Pointer to the \c Tp object (asserted to be != NULL). */ value_type * operator->() const { return & _pimpl->_value; } /** Reset to default Ctor values. */ void reset() { AutoDispose().swap( *this ); } /** Exchange the contents of two AutoDispose objects. */ void swap( AutoDispose & rhs ) noexcept { _pimpl.swap( rhs._pimpl ); } /** Returns true if this is the only AutoDispose instance managing the current data object */ bool unique () const { return _pimpl.unique(); } public: /** Return the current dispose function. */ const Dispose & getDispose() const { return _pimpl->_dispose; } /** Set a new dispose function. */ void setDispose( const Dispose & dispose_r ) { _pimpl->_dispose = dispose_r; } /** Set no dispose function. */ void resetDispose() { setDispose( Dispose() ); } /** Exchange the dispose function. */ void swapDispose( Dispose & dispose_r ) { _pimpl->_dispose.swap( dispose_r ); } private: struct Impl : private base::NonCopyable { template Impl( T &&value_r ) : _value( std::forward(value_r) ) {} template Impl( T &&value_r, D &&dispose_r ) : _value( std::forward(value_r) ) , _dispose( std::forward(dispose_r) ) {} ~Impl() { if ( _dispose ) try { _dispose( _value ); } catch(...) {} } value_type _value; Dispose _dispose; }; shared_ptr _pimpl; }; template<> class AutoDispose { public: /** Dispose function signatue. */ using Dispose = function; public: /** Default Ctor using default constructed value and no dispose function. */ AutoDispose() : _pimpl( new Impl() ) {} /** Ctor taking dispose function and using default constructed value. */ explicit AutoDispose( const Dispose & dispose_r ) : _pimpl( new Impl( dispose_r ) ) {} public: /** Reset to default Ctor values. */ void reset() { AutoDispose().swap( *this ); } /** Exchange the contents of two AutoDispose objects. */ void swap( AutoDispose & rhs ) noexcept { _pimpl.swap( rhs._pimpl ); } public: /** Return the current dispose function. */ const Dispose & getDispose() const { return _pimpl->_dispose; } /** Set a new dispose function. */ void setDispose( const Dispose & dispose_r ) { _pimpl->_dispose = dispose_r; } /** Set no dispose function. */ void resetDispose() { setDispose( Dispose() ); } /** Exchange the dispose function. */ void swapDispose( Dispose & dispose_r ) { _pimpl->_dispose.swap( dispose_r ); } private: struct Impl : private base::NonCopyable { Impl( ) {} Impl( Dispose dispose_r ) : _dispose(std::move( dispose_r )) {} ~Impl() { if ( _dispose ) try { _dispose(); } catch(...) {} } Dispose _dispose; }; shared_ptr _pimpl; }; /*! * Simple way to run a function at scope exit: * \code * bool wasBlocking = unblockFile( fd, true ); * OnScopeExit cleanup( [wasBlocking, fd](){ * if ( wasBlocking ) unblockFile( fd, false ); * }); * \endcode */ using OnScopeExit = AutoDispose; struct Deferred : public AutoDispose { template Deferred( F&&cb ); }; template Deferred::Deferred(F &&cb) : AutoDispose( std::forward(cb) ){} #define __zypp_defer_concatenate(__lhs, __rhs) \ __lhs##__rhs #define __zypp_defer_declarator(__id) \ zypp::Deferred __zypp_defer_concatenate(__defer, __id) = [&]() #define zypp_defer \ __zypp_defer_declarator(__LINE__) /////////////////////////////////////////////////////////////////// /** \relates AutoDispose Stream output of the \c Tp object. */ template inline std::ostream & operator<<( std::ostream & str, const AutoDispose & obj ) { return str << obj.value(); } /////////////////////////////////////////////////////////////////// /// \class AutoFD /// \brief \ref AutoDispose\ calling \c ::close /// \ingroup g_RAII /////////////////////////////////////////////////////////////////// struct AutoFD : public AutoDispose { AutoFD( int fd_r = -1 ) : AutoDispose( fd_r, [] ( int fd_r ) { if ( fd_r != -1 ) ::close( fd_r ); } ) {} }; /////////////////////////////////////////////////////////////////// /// \class AutoFILE /// \brief \ref AutoDispose\ calling \c ::fclose /// \see \ref AutoDispose /// \ingroup g_RAII /////////////////////////////////////////////////////////////////// struct AutoFILE : public AutoDispose { AutoFILE( FILE* file_r = nullptr ) : AutoDispose( file_r, [] ( FILE* file_r ) { if ( file_r ) ::fclose( file_r ); } ) {} }; /////////////////////////////////////////////////////////////////// /// \class AutoFREE /// \brief \ref AutoDispose\ calling \c ::free /// \ingroup g_RAII /////////////////////////////////////////////////////////////////// template struct AutoFREE : public AutoDispose { AutoFREE( Tp* ptr_r = nullptr ) : AutoDispose( ptr_r, [] ( Tp* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {} AutoFREE( void* ptr_r ) : AutoFREE( static_cast(ptr_r) ) {} }; template <> struct AutoFREE : public AutoDispose { AutoFREE( void* ptr_r = nullptr ) : AutoDispose( ptr_r, [] ( void* ptr_r ) { if ( ptr_r ) ::free( ptr_r ); } ) {} }; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_AUTODISPOSE_H libzypp-17.36.5/zypp-core/ByteArray.h000066400000000000000000000035361476576476200174300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_BYTEARRAY_H #define ZYPP_BYTEARRAY_H #include #include #include #include namespace zypp { class ByteArray : public std::vector { public: using vector::vector; explicit ByteArray ( const std::string &data ) : ByteArray( data.c_str(), data.length() ) { } explicit ByteArray ( const char *data, const int len = -1 ) : ByteArray( data, data + (len == -1 ? strlen(data) : len) ) { } std::string asString () const { if ( size() == 0 ) return std::string(); return std::string( data(), size() ); } #ifdef __cpp_lib_string_view std::string_view asStringView () const { if ( size() == 0 ) return std::string_view(); return std::string_view( data(), size() ); } #endif static std::size_t maxSize () { static const auto size = ByteArray().max_size(); return size; } }; class UByteArray : public std::vector { public: using vector::vector; explicit UByteArray ( const char *data, const int len = -1 ) : UByteArray( data, data + (len == -1 ? strlen(data) : len) ) { } static std::size_t maxSize () { static const auto size = UByteArray().max_size(); return size; } }; } #endif libzypp-17.36.5/zypp-core/ByteCount.cc000066400000000000000000000063651476576476200176030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ByteCount.cc * */ #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// const ByteCount::Unit ByteCount::B( 1LL, "B", 0 ); const ByteCount::Unit ByteCount::K( 1024LL, "KiB", 1 ); const ByteCount::Unit ByteCount::KiB( K ); const ByteCount::Unit ByteCount::M( 1048576LL, "MiB", 1 ); const ByteCount::Unit ByteCount::MiB( M ); const ByteCount::Unit ByteCount::G( 1073741824LL, "GiB", 2 ); const ByteCount::Unit ByteCount::GiB( G ); const ByteCount::Unit ByteCount::T( 1099511627776LL, "TiB", 3 ); const ByteCount::Unit ByteCount::TiB( T ); const ByteCount::Unit ByteCount::kB( 1000LL, "kB", 1 ); const ByteCount::Unit ByteCount::MB( 1000000LL, "MB", 1 ); const ByteCount::Unit ByteCount::GB( 1000000000LL, "GB", 2 ); const ByteCount::Unit ByteCount::TB( 1000000000000LL, "TB", 3 ); /////////////////////////////////////////////////////////////////// // // METHOD NAME : ByteCount::fillBlock // METHOD TYPE : ByteCount & // ByteCount & ByteCount::fillBlock( ByteCount blocksize_r ) { if ( _count && blocksize_r ) { SizeType diff = _count % blocksize_r; if ( diff ) { if ( _count > 0 ) { _count += blocksize_r; _count -= diff; } else { _count -= blocksize_r; _count += diff; } } } return *this; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ByteCount::bestUnit // METHOD TYPE : ByteCount::Unit // const ByteCount::Unit & ByteCount::bestUnit() const { SizeType usize( _count < 0 ? -_count : _count ); if ( usize < K.factor() ) return B; if ( usize < M.factor() ) return K; if ( usize < G.factor() ) return M; if ( usize < T.factor() ) return G; return T; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ByteCount::bestUnit1000 // METHOD TYPE : ByteCount::Unit // const ByteCount::Unit & ByteCount::bestUnit1000() const { SizeType usize( _count < 0 ? -_count : _count ); if ( usize < kB.factor() ) return B; if ( usize < MB.factor() ) return kB; if ( usize < GB.factor() ) return MB; if ( usize < TB.factor() ) return GB; return TB; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/ByteCount.h000066400000000000000000000126741476576476200174450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ByteCount.h * */ #ifndef ZYPP_BYTECOUNT_H #define ZYPP_BYTECOUNT_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ByteCount // /** Store and operate with byte count. * */ class ZYPP_API ByteCount { friend std::ostream & operator<<( std::ostream & str, const ByteCount & obj ); public: using Unit = base::Unit; using SizeType = Unit::ValueType; /** \name Byte unit constants. */ //@{ /** 1 Byte */ static const Unit B; /** 1024 Byte */ static const Unit K; static const Unit KiB; /** 1024^2 Byte */ static const Unit M; static const Unit MiB; /** 1024^3 Byte */ static const Unit G; static const Unit GiB; /** 1024^4 Byte */ static const Unit T; static const Unit TiB; /** 1000 Byte */ static const Unit kB; /** 1000^2 Byte */ static const Unit MB; /** 1000^3 Byte */ static const Unit GB; /** 1000^4 Byte */ static const Unit TB; //@} public: /** Default ctor */ ByteCount() : _count( 0 ) {} /** Ctor taking 1 Unit. */ ByteCount( const Unit & unit_r ) : _count( unit_r.factor() ) {} /** Ctor taking a count and optinal Unit. */ ByteCount( const SizeType count_r, const Unit & unit_r = B ) : _count( count_r * unit_r.factor() ) {} public: /** Conversion to SizeType. */ operator SizeType() const { return _count; } /** \name Arithmetic operations. * \c + \c - \c * \c / are provided via conversion to SizeType. */ //@{ ByteCount & operator+=( const SizeType rhs ) { _count += rhs; return *this; } ByteCount & operator-=( const SizeType rhs ) { _count -= rhs; return *this; } ByteCount & operator*=( const SizeType rhs ) { _count *= rhs; return *this; } ByteCount & operator/=( const SizeType rhs ) { _count /= rhs; return *this; } ByteCount & operator++(/*prefix*/) { _count += 1; return *this; } ByteCount & operator--(/*prefix*/) { _count -= 1; return *this; } ByteCount operator++(int/*postfix*/) { return _count++; } ByteCount operator--(int/*postfix*/) { return _count--; } //@} /** Adjust count to multiple of \a blocksize_r (default 1K). * Zero blocksize_r is treated as 1B. */ ByteCount & fillBlock( ByteCount blocksize_r = K ); /** Return count adjusted to multiple of \a blocksize_r (default 1K). */ ByteCount fullBlocks( ByteCount blocksize_r = K ) const { return ByteCount(*this).fillBlock( blocksize_r ); } /** Return number of blocks of size \a blocksize_r (default 1K). */ SizeType blocks( ByteCount blocksize_r = K ) const { return fullBlocks( blocksize_r ) / blocksize_r; } public: /** Return the best Unit (B,K,M,G,T) for count. */ const Unit & bestUnit() const; /** Return the best Unit (B,kB,MB,GB,TB) for count. */ const Unit & bestUnit1000() const; /** \name Conversion to string. * \li \a field_width_r Width for the number part (incl. precision) * \li \a unit_width_r With for the unit symbol (without symbol if zero) * \li \a prec_r Precision to use. * \see zypp::base::Unit */ //@{ /** Auto selected Unit and precision. */ std::string asString( unsigned field_width_r = 0, unsigned unit_width_r = 1 ) const { return asString( bestUnit(), field_width_r, unit_width_r ); } /** Auto selected Unit. */ std::string asString( unsigned field_width_r, unsigned unit_width_r, unsigned prec_r ) const { return asString( bestUnit(), field_width_r, unit_width_r, prec_r ); } /** Auto selected precision. */ std::string asString( const Unit & unit_r, unsigned field_width_r = 0, unsigned unit_width_r = 1 ) const { return asString( unit_r, field_width_r, unit_width_r, unit_r.prec() ); } /** Nothing auto selected. */ std::string asString( const Unit & unit_r, unsigned field_width_r, unsigned unit_width_r, unsigned prec_r ) const { return unit_r.form( _count, field_width_r, unit_width_r, prec_r ); } //@} private: SizeType _count; }; /////////////////////////////////////////////////////////////////// /** \relates ByteCount Stream output */ inline std::ostream & operator<<( std::ostream & str, const ByteCount & obj ) { return str << obj.asString(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BYTECOUNT_H libzypp-17.36.5/zypp-core/CMakeLists.txt000066400000000000000000000230511476576476200201070ustar00rootroot00000000000000# Collect all files that may contain translatable texts FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" ) SET( POT_FILE_DEPENDS_ZYPP_CORE ${POT_FILE_DEPENDS} PARENT_SCOPE ) INCLUDE_DIRECTORIES ( ${LIBZYPP_SOURCE_DIR} ) ADD_DEFINITIONS( -DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL ) SET( zypp_toplevel_headers ${CMAKE_CURRENT_BINARY_DIR}/APIConfig.h AutoDispose.h ByteArray.h ByteCount.h CheckSum.h Date.h Digest.h ExternalProgram.h Globals.h KVMap kvmap.h ManagedFile.h onmedialocation.h OnMediaLocation Pathname.h TriBool.h Url.h UserData.h ) SET( zypp_toplevel_SRCS ByteCount.cc CheckSum.cc Date.cc Digest.cc ExternalProgram.cc onmedialocation.cc Pathname.cc ShutdownLock.cc Url.cc ) INSTALL( FILES ${zypp_toplevel_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core" ) SET( zypp_base_HEADERS base/DefaultIntegral base/defaultintegral.h base/DtorReset base/dtorreset.h base/Easy.h base/EnumClass.h base/Errno.h base/Exception.h base/ExternalDataSource.h base/Function.h base/Flags.h base/filestreambuf.h base/FileStreamBuf base/fXstream base/fxstream.h base/Gettext.h base/GzStream base/gzstream.h base/Hash.h base/InputStream base/inputstream.h base/IOStream.h base/IOTools.h base/Iterable.h base/Iterator.h base/LogControl.h base/LogTools.h base/Logger.h base/NonCopyable.h base/ProfilingFormater.h base/ProvideNumericId base/providenumericid.h base/PtrTypes.h base/ReferenceCounted.h base/Regex.h base/SimpleStreambuf base/simplestreambuf.h base/String.h base/StringV.h base/Unit.h base/UserRequestException base/userrequestexception.h base/Xml.h ) SET( zypp_base_SRCS base/CleanerThread.cc base/Exception.cc base/ExternalDataSource.cc base/filestreambuf.cc base/Gettext.cc base/gzstream.cc base/inputstream.cc base/IOStream.cc base/IOTools.cc base/LogControl.cc base/ProfilingFormater.cc base/ReferenceCounted.cc base/Regex.cc base/String.cc base/StringV.cc base/Unit.cc base/userrequestexception.cc base/Xml.cc ) IF (ENABLE_ZCHUNK_COMPRESSION) list( APPEND zypp_base_SRCS base/zckstream.cc ) list( APPEND zypp_base_HEADERS base/ZckStream base/zckstream.h ) ENDIF(ENABLE_ZCHUNK_COMPRESSION) INSTALL( FILES ${zypp_base_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/base" ) SET( zypp_fs_SRCS fs/PathInfo.cc fs/TmpPath.cc ) SET( zypp_fs_HEADERS fs/PathInfo.h fs/TmpPath.h fs/WatchFile fs/watchfile.h ) INSTALL( FILES ${zypp_fs_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/fs" ) SET( zypp_rpc_SRCS rpc/PluginFrame.cc rpc/PluginFrameException.cc ) SET( zypp_rpc_HEADERS rpc/PluginFrame.h rpc/PluginFrameException.h ) INSTALL( FILES ${zypp_rpc_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/rpc" ) SET( zypp_ui_SRCS ui/progressdata.cc ) SET( zypp_ui_HEADERS ui/ProgressData ui/progressdata.h ) INSTALL( FILES ${zypp_ui_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/ui" ) SET( zypp_url_SRCS url/UrlUtils.cc url/UrlBase.cc ) SET( zypp_url_HEADERS url/UrlBase.h url/UrlException.h url/UrlUtils.h ) INSTALL( FILES ${zypp_url_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/url" ) SET( zypp_parser_SRCS parser/iniparser.cc parser/inidict.cc parser/parseexception.cc parser/sysconfig.cc ) SET( zypp_parser_HEADERS parser/IniParser parser/iniparser.h parser/IniDict parser/inidict.h parser/ParseException parser/parseexception.h parser/Sysconfig parser/sysconfig.h ) INSTALL( FILES ${zypp_parser_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/parser" ) SET( zypp_parser_xml_SRCS parser/xml/XmlEscape.cc ) SET( zypp_parser_xml_HEADERS parser/xml/XmlEscape.h ) INSTALL( FILES ${zypp_parser_xml_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-core/parser/xml" ) SET( zyppng_async_HEADERS zyppng/async/AsyncOp zyppng/async/asyncop.h ) SET( zyppng_base_SRCS zyppng/base/abstracteventsource.cc zyppng/base/base.cc zyppng/base/eventdispatcher_glib.cc zyppng/base/eventloop_glib.cc zyppng/base/linuxhelpers.cc zyppng/base/timer.cc zyppng/base/threaddata.cc zyppng/base/socketnotifier.cc zyppng/base/unixsignalsource.cpp ) SET( zyppng_base_HEADERS zyppng/base/AbstractEventSource zyppng/base/abstracteventsource.h zyppng/base/AutoDisconnect zyppng/base/autodisconnect.h zyppng/base/Base zyppng/base/base.h zyppng/base/EventDispatcher zyppng/base/eventdispatcher.h zyppng/base/EventLoop zyppng/base/eventloop.h zyppng/base/signals.h zyppng/base/SocketNotifier zyppng/base/socketnotifier.h zyppng/base/statemachine.h zyppng/base/Timer zyppng/base/timer.h zyppng/base/unixsignalsource.h zyppng/base/zyppglobal.h ) SET( zyppng_base_private_HEADERS zyppng/base/private/abstracteventsource_p.h zyppng/base/private/base_p.h zyppng/base/private/eventdispatcher_glib_p.h zyppng/base/private/eventloop_glib_p.h zyppng/base/private/linuxhelpers_p.h zyppng/base/private/threaddata_p.h ) SET( zyppng_core_HEADERS zyppng/core/bytearray.h zyppng/core/ByteArray zyppng/core/url.h zyppng/core/Url zyppng/core/idstring.h zyppng/core/IdString zyppng/core/string.h zyppng/core/String ) SET( zyppng_io_private_HEADERS zyppng/io/private/asyncdatasource_p.h zyppng/io/private/iobuffer_p.h zyppng/io/private/iodevice_p.h zyppng/io/private/socket_p.h zyppng/io/private/sockaddr_p.h zyppng/io/private/abstractspawnengine_p.h zyppng/io/private/forkspawnengine_p.h ) SET( zyppng_io_SRCS zyppng/io/asyncdatasource.cpp zyppng/io/iobuffer.cc zyppng/io/iodevice.cc zyppng/io/process.cpp zyppng/io/socket.cc zyppng/io/sockaddr.cpp zyppng/io/abstractspawnengine.cc zyppng/io/forkspawnengine.cc ) SET( zyppng_io_HEADERS zyppng/io/AsyncDataSource zyppng/io/asyncdatasource.h zyppng/io/IODevice zyppng/io/iodevice.h zyppng/io/Process zyppng/io/process.h zyppng/io/Socket zyppng/io/socket.h zyppng/io/sockaddr.h zyppng/io/SockAddr ) SET( zyppng_meta_HEADERS zyppng/meta/Functional zyppng/meta/functional.h zyppng/meta/FunctionTraits zyppng/meta/function_traits.h zyppng/meta/TypeTraits zyppng/meta/type_traits.h ) SET( zyppng_pipelines_HEADERS zyppng/pipelines/Algorithm zyppng/pipelines/algorithm.h zyppng/pipelines/AsyncResult zyppng/pipelines/asyncresult.h zyppng/pipelines/Await zyppng/pipelines/await.h zyppng/pipelines/Expected zyppng/pipelines/expected.h zyppng/pipelines/Lift zyppng/pipelines/lift.h zyppng/pipelines/MTry zyppng/pipelines/mtry.h zyppng/pipelines/Redo zyppng/pipelines/redo.h zyppng/pipelines/Transform zyppng/pipelines/transform.h zyppng/pipelines/Wait zyppng/pipelines/wait.h ) SET( zyppng_rpc_HEADERS zyppng/rpc/stompframestream.h ) SET( zyppng_rpc_SRCS zyppng/rpc/stompframestream.cc ) SET( zyppng_thread_SRCS zyppng/thread/asyncqueue.cc zyppng/thread/wakeup.cpp ) SET( zyppng_thread_HEADERS zyppng/thread/AsyncQueue zyppng/thread/asyncqueue.h zyppng/thread/private/asyncqueue_p.h zyppng/thread/Wakeup zyppng/thread/wakeup.h ) SET( zyppng_thread_private_HEADERS ) SET( zyppng_ui_SRCS zyppng/ui/progressobserver.cc zyppng/ui/userinterface.cc zyppng/ui/userrequest.cc ) SET( zyppng_ui_HEADERS zyppng/ui/progressobserver.h zyppng/ui/ProgressObserver zyppng/ui/userinterface.h zyppng/ui/UserInterface zyppng/ui/userrequest.h zyppng/ui/UserRequest ) SET( zyppng_ui_private_HEADERS zyppng/ui/private/userinterface_p.h ) SET ( zypp_HEADERS ${zypp_toplevel_headers} ${zyppng_async_HEADERS} ${zypp_base_HEADERS} ${zypp_fs_HEADERS} ${zypp_rpc_HEADERS} ${zypp_ui_HEADERS} ${zypp_url_HEADERS} ${zypp_parser_HEADERS} ${zypp_parser_xml_HEADERS} ${zyppng_base_HEADERS} ${zyppng_base_private_HEADERS} ${zyppng_core_HEADERS} ${zyppng_io_HEADERS} ${zyppng_io_private_HEADERS} ${zyppng_meta_HEADERS} ${zyppng_pipelines_HEADERS} ${zyppng_rpc_HEADERS} ${zyppng_thread_HEADERS} ${zyppng_thread_private_HEADERS} ${zyppng_ui_HEADERS} ${zyppng_ui_private_HEADERS} ) SET ( zypp_SRCS ${zypp_toplevel_SRCS} ${zypp_base_SRCS} ${zypp_fs_SRCS} ${zypp_rpc_SRCS} ${zypp_ui_SRCS} ${zypp_url_SRCS} ${zypp_parser_SRCS} ${zypp_parser_xml_SRCS} ${zyppng_base_SRCS} ${zyppng_io_SRCS} ${zyppng_rpc_SRCS} ${zyppng_thread_SRCS} ${zyppng_ui_SRCS} ) # Default loggroup for all files SET_LOGGROUP( "zypp-core" ${zypp_SRCS} ) # System libraries SET(UTIL_LIBRARY util) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) ADD_LIBRARY( zypp-core STATIC ${zypp_SRCS} ${zypp_HEADERS} ) target_link_libraries( zypp-core PRIVATE zypp_lib_compiler_flags ) target_link_libraries( zypp-core INTERFACE ${LIBGLIB_LIBRARIES} ) target_link_libraries( zypp-core INTERFACE ${OPENSSL_LIBRARIES} ) target_link_libraries( zypp-core INTERFACE ${CRYPTO_LIBRARIES} ) target_link_libraries( zypp-core INTERFACE pthread ) target_link_libraries( zypp-core INTERFACE ${SIGCPP_LIBRARIES} ) TARGET_LINK_LIBRARIES( zypp-core INTERFACE ${ZLIB_LIBRARY} ) TARGET_LINK_LIBRARIES( zypp-core INTERFACE ${UTIL_LIBRARY} ) IF (ENABLE_ZSTD_COMPRESSION) TARGET_LINK_LIBRARIES( zypp-core INTERFACE ${ZSTD_LIBRARY}) ENDIF (ENABLE_ZSTD_COMPRESSION) IF (ENABLE_ZCHUNK_COMPRESSION) TARGET_LINK_LIBRARIES( zypp-core INTERFACE ${ZCHUNK_LDFLAGS}) ENDIF(ENABLE_ZCHUNK_COMPRESSION) libzypp-17.36.5/zypp-core/CheckSum.cc000066400000000000000000000132411476576476200173600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CheckSum.cc * */ #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// const std::string & CheckSum::md5Type() { return Digest::md5(); } const std::string & CheckSum::shaType() { static std::string _type( "sha" ); return _type; } const std::string & CheckSum::sha1Type() { return Digest::sha1(); } const std::string & CheckSum::sha224Type() { return Digest::sha224(); } const std::string & CheckSum::sha256Type() { return Digest::sha256(); } const std::string & CheckSum::sha384Type() { return Digest::sha384(); } const std::string & CheckSum::sha512Type() { return Digest::sha512(); } CheckSum::CheckSum( const std::string & type, const std::string & checksum ) : _type( str::toLower( type ) ) , _checksum( checksum ) { switch ( checksum.size() ) { case 128: if ( _type == sha512Type() ) return; if ( _type.empty() || _type == shaType() ) { _type = sha512Type(); return; } // else: dubious break; case 96: if ( _type == sha384Type() ) return; if ( _type.empty() || _type == shaType() ) { _type = sha384Type(); return; } // else: dubious break; case 64: if ( _type == sha256Type() ) return; if ( _type.empty() || _type == shaType() ) { _type = sha256Type(); return; } // else: dubious break; case 56: if ( _type == sha224Type() ) return; if ( _type.empty() || _type == shaType() ) { _type = sha224Type(); return; } // else: dubious break; case 40: if ( _type == sha1Type() ) return; if ( _type.empty() || _type == shaType() ) { _type = sha1Type(); return; } // else: dubious break; case 32: if ( _type == md5Type() ) return; if ( _type.empty() ) { _type = md5Type(); return; } // else: dubious break; case 0: return; // empty checksum is ok break; default: if ( _type.empty() ) { WAR << "Can't determine type of " << checksum.size() << " byte checksum '" << _checksum << "'" << endl; return; } // else: dubious break; } // dubious: Throw on malformed known types, otherwise log a warning. std::string msg = str::form ( _("Dubious type '%s' for %u byte checksum '%s'"), _type.c_str(), checksum.size(), _checksum.c_str() ); if ( _type == md5Type() || _type == shaType() || _type == sha1Type() || _type == sha224Type() || _type == sha256Type() || _type == sha384Type() || _type == sha512Type() ) { ZYPP_THROW( CheckSumException( msg ) ); } else { WAR << msg << endl; } } CheckSum::CheckSum( const std::string & type_r, std::istream & input_r ) { if ( input_r.good() && ! type_r.empty() ) { _type = str::toLower( type_r ); _checksum = Digest::digest( _type, input_r ); if ( ! input_r.eof() || _checksum.empty() ) { _type = _checksum = std::string(); } } } std::string CheckSum::type() const { return _type; } std::string CheckSum::checksum() const { return _checksum; } bool CheckSum::empty() const { return (checksum().empty() || type().empty()); } std::string CheckSum::asString() const { std::ostringstream str; str << *this; return str.str(); } std::ostream & operator<<( std::ostream & str, const CheckSum & obj ) { if ( obj.checksum().empty() ) { return str << std::string("NoCheckSum"); } return str << ( obj.type().empty() ? std::string("UNKNOWN") : obj.type() ) << '-' << obj.checksum(); } std::ostream & dumpAsXmlOn( std::ostream & str, const CheckSum & obj ) { const std::string & type( obj.type() ); const std::string & checksum( obj.checksum() ); str << ""; else str << ">" << checksum << ""; return str; } /** \relates CheckSum */ bool operator==( const CheckSum & lhs, const CheckSum & rhs ) { return lhs.checksum() == rhs.checksum() && lhs.type() == rhs.type(); } /** \relates CheckSum */ bool operator!=( const CheckSum & lhs, const CheckSum & rhs ) { return ! ( lhs == rhs ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/CheckSum.h000066400000000000000000000142661476576476200172320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/CheckSum.h * */ #ifndef ZYPP_CORE_CHECKSUM_H #define ZYPP_CORE_CHECKSUM_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// struct CheckSumException : public Exception { CheckSumException( const std::string & msg ) : Exception( msg ) {} }; class CheckSum { public: /** Default Ctor: empty checksum. */ CheckSum() {} /** * Creates a checksum for algorithm \param type. * \throws CheckSumException if the checksum is invalid and can't be constructed */ CheckSum( const std::string & type, const std::string & checksum ); /** * Creates a checksum auto probing the algorithm type. * \throws CheckSumException if the checksum is invalid and can't be constructed */ CheckSum( const std::string & checksum ) : CheckSum( std::string(), checksum ) {} /** * Reads the content of \param input_r and computes the checksum. */ CheckSum( const std::string & type, std::istream & input_r ); /** Ctor from temporary istream */ CheckSum( const std::string & type, std::istream && input_r ) : CheckSum( type, input_r ) {} public: static const std::string & md5Type(); static const std::string & shaType(); static const std::string & sha1Type(); static const std::string & sha224Type(); static const std::string & sha256Type(); static const std::string & sha384Type(); static const std::string & sha512Type(); /** \name Creates a checksum for algorithm \param type. */ //@{ static CheckSum md5( const std::string & checksum ) { return CheckSum( md5Type(), checksum); } static CheckSum sha( const std::string & checksum ) { return CheckSum( shaType(), checksum); } static CheckSum sha1( const std::string & checksum ) { return CheckSum( sha1Type(), checksum); } static CheckSum sha224( const std::string & checksum ) { return CheckSum( sha224Type(), checksum); } static CheckSum sha256( const std::string & checksum ) { return CheckSum( sha256Type(), checksum); } static CheckSum sha384( const std::string & checksum ) { return CheckSum( sha384Type(), checksum); } static CheckSum sha512( const std::string & checksum ) { return CheckSum( sha512Type(), checksum); } //@} /** \name Reads the content of \param input_r and computes the checksum. */ //@{ static CheckSum md5( std::istream & input_r ) { return CheckSum( md5Type(), input_r ); } static CheckSum sha( std::istream & input_r ) { return CheckSum( sha1Type(), input_r ); } static CheckSum sha1( std::istream & input_r ) { return CheckSum( sha1Type(), input_r ); } static CheckSum sha224( std::istream & input_r ) { return CheckSum( sha224Type(), input_r ); } static CheckSum sha256( std::istream & input_r ) { return CheckSum( sha256Type(), input_r ); } static CheckSum sha384( std::istream & input_r ) { return CheckSum( sha384Type(), input_r ); } static CheckSum sha512( std::istream & input_r ) { return CheckSum( sha512Type(), input_r ); } static CheckSum md5( std::istream && input_r ) { return CheckSum( md5Type(), std::move(input_r) ); } static CheckSum sha( std::istream && input_r ) { return CheckSum( sha1Type(), std::move(input_r) ); } static CheckSum sha1( std::istream && input_r ) { return CheckSum( sha1Type(), std::move(input_r) ); } static CheckSum sha224( std::istream && input_r ) { return CheckSum( sha224Type(), std::move(input_r) ); } static CheckSum sha256( std::istream && input_r ) { return CheckSum( sha256Type(), std::move(input_r) ); } static CheckSum sha384( std::istream && input_r ) { return CheckSum( sha384Type(), std::move(input_r) ); } static CheckSum sha512( std::istream && input_r ) { return CheckSum( sha512Type(), std::move(input_r) ); } //@} /** \name Reads the content of \param input_r and computes the checksum. */ //@{ static CheckSum md5FromString( const std::string & input_r ) { return md5( std::stringstream( input_r ) ); } static CheckSum shaFromString( const std::string & input_r ) { return sha( std::stringstream( input_r ) ); } static CheckSum sha1FromString( const std::string & input_r ) { return sha1( std::stringstream( input_r ) ); } static CheckSum sha224FromString( const std::string & input_r ) { return sha224( std::stringstream( input_r ) ); } static CheckSum sha256FromString( const std::string & input_r ) { return sha256( std::stringstream( input_r ) ); } static CheckSum sha384FromString( const std::string & input_r ) { return sha384( std::stringstream( input_r ) ); } static CheckSum sha512FromString( const std::string & input_r ) { return sha512( std::stringstream( input_r ) ); } //@} public: std::string type() const; std::string checksum() const; bool empty() const; public: std::string asString() const; private: std::string _type; std::string _checksum; }; /** \relates CheckSum Stream output. */ std::ostream & operator<<( std::ostream & str, const CheckSum & obj ); /** \relates CheckSum XML output. */ std::ostream & dumpAsXmlOn( std::ostream & str, const CheckSum & obj ); /** \relates CheckSum */ bool operator==( const CheckSum & lhs, const CheckSum & rhs ); /** \relates CheckSum */ bool operator!=( const CheckSum & lhs, const CheckSum & rhs ); } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CHECKSUM_H libzypp-17.36.5/zypp-core/Date.cc000066400000000000000000000171231476576476200165360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Date.cc * */ #include //#include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { /////////////////////////////////////////////////////////////////// /// \class LocaleGuard /// \brief Temporarily adjust Locale /// \ingroup RAII struct LocaleGuard { LocaleGuard() { const char * tmp = ::setlocale( LC_TIME, NULL ); _mylocale = tmp ? tmp : ""; if ( _mylocale.find( "UTF-8" ) == std::string::npos && _mylocale.find( "utf-8" ) == std::string::npos && _mylocale != "POSIX" && _mylocale != "C" && _mylocale != "" ) { // language[_territory][.codeset][@modifier] // add/exchange codeset with UTF-8 std::string needLocale = ".UTF-8"; std::string::size_type loc = _mylocale.find_first_of( ".@" ); if ( loc != std::string::npos ) { // prepend language[_territory] needLocale = _mylocale.substr( 0, loc ) + needLocale; loc = _mylocale.find_last_of( '@' ); if ( loc != std::string::npos ) { // append [@modifier] needLocale += _mylocale.substr( loc ); } } else { // append ".UTF-8" needLocale = _mylocale + needLocale; } ::setlocale( LC_TIME, needLocale.c_str() ); } else { // no need to change the locale _mylocale.clear(); } } LocaleGuard(const LocaleGuard &) = delete; LocaleGuard(LocaleGuard &&) = delete; LocaleGuard &operator=(const LocaleGuard &) = delete; LocaleGuard &operator=(LocaleGuard &&) = delete; ~LocaleGuard() { if ( ! _mylocale.empty() ) ::setlocale( LC_TIME, _mylocale.c_str() ); } private: std::string _mylocale; }; /////////////////////////////////////////////////////////////////// inline bool isDST( struct tm & tm ) { time_t t = ::mktime( &tm ); struct tm *tm2 = ::localtime( &t ); return ( tm2 && tm2->tm_isdst > 0 ); } inline const char * _dateFormat( Date::DateFormat dateFormat_r ) { static const char * fmt[] = { "", ///< "" "%Y-%m-%d", ///< 2014-02-07 "%Y-%m", ///< 2014-02 "%Y", ///< 2014 "%G-W%V", ///< 2014-W06 "%G-W%V-%u", ///< 2014-W06-5 (1 is Monday) "%Y-%j", ///< 2014-038 }; return fmt[dateFormat_r.asIntegral()]; } inline const char * _timeFormat( Date::TimeFormat timeFormat_r ) { static const char * fmt[] = { "", ///< "" "%H:%M:%S", ///< 07:06:41 "%H:%M", ///< 07:06 "%H", ///< 07 }; return fmt[timeFormat_r.asIntegral()]; } inline const char * _timeZoneFormat( Date::TimeZoneFormat timeZoneFormat_r ) { static const char * fmt[] = { "", ///< "" " %Z", ///< UTC, CET, ... "%z", ///< +0000 }; return fmt[timeZoneFormat_r.asIntegral()]; } inline std::string doForm( const std::string & format_r, Date::TimeBase base_r, const Date::ValueType & date_r ) { if ( ! date_r ) return "0"; LocaleGuard guard; static char buf[512]; if ( ! strftime( buf, 512, format_r.c_str(), (base_r == Date::TB_UTC ? gmtime : localtime)( &date_r ) ) ) *buf = '\0'; else { // strip a trailing '00' in a timeZoneFormat unsigned l = ::strlen( buf ); if ( l >= 5 && ( buf[l-1] == '0' ) && ( buf[l-2] == '0' ) && ( buf[l-5] == '+' || buf[l-5] == '-') ) buf[l-2] = '\0'; } return buf; } } // namespace /////////////////////////////////////////////////////////////////// const Date::ValueType Date::second; const Date::ValueType Date::minute; const Date::ValueType Date::hour; const Date::ValueType Date::day; const Date::ValueType Date::month28; const Date::ValueType Date::month29; const Date::ValueType Date::month30; const Date::ValueType Date::month31; const Date::ValueType Date::month; const Date::ValueType Date::year365; const Date::ValueType Date::year366; const Date::ValueType Date::year; Date::Date( const std::string & seconds_r ) { str::strtonum( seconds_r, _date ); } Date::Date( const std::string & date_str, const std::string & format ) : _date( Date( date_str, format, TB_LOCALTIME ) ) {} Date::Date( const std::string & date_str, const std::string & format, Date::TimeBase base_r ) : _date(0) { LocaleGuard guard; struct tm tm = {0,0,0,0,0,0,0,0,0,0,0}; char * res = ::strptime( date_str.c_str(), format.c_str(), &tm ); if (res == NULL) throw DateFormatException( str::form( "Invalid date format: '%s'", date_str.c_str() ) ); if ( isDST(tm) ) tm.tm_isdst = 1; _date = (base_r == TB_UTC ? ::timegm : ::timelocal)( &tm ); } std::string Date::form( const std::string & format_r, Date::TimeBase base_r ) const { return doForm( format_r, base_r, _date ); } std::string Date::print( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r ) const { str::Str str; if ( dateFormat_r != DateFormat::none ) str << _dateFormat( dateFormat_r ); if ( timeFormat_r != TimeFormat::none ) { if ( dateFormat_r != DateFormat::none ) str << ' '; str << _timeFormat( timeFormat_r ); if ( timeZoneFormat_r != TimeZoneFormat::none ) str << _timeZoneFormat( timeZoneFormat_r ); } return doForm( str, base_r, _date ); } std::string Date::printISO( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r ) const { str::Str str; if ( dateFormat_r != DateFormat::none ) str << _dateFormat( dateFormat_r ); if ( timeFormat_r != TimeFormat::none ) { if ( dateFormat_r != DateFormat::none ) str << 'T'; str << _timeFormat( timeFormat_r ); switch ( timeZoneFormat_r.asEnum() ) { case TimeZoneFormat::none: break; case TimeZoneFormat::name: if ( base_r == TB_UTC ) { str << 'Z'; break; } // else: FALLTHROUGH and print offset! case TimeZoneFormat::offset: str << _timeZoneFormat( TimeZoneFormat::offset ); break; } } return doForm( str, base_r, _date ); } std::ostream & dumpAsXmlOn( std::ostream & str, const Date & obj, const std::string & name_r ) { return xmlout::node( str, name_r, { { "time_t", Date::ValueType(obj) }, { "text", obj.printISO( Date::TB_UTC ) }, } ); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/Date.h000066400000000000000000000273141476576476200164030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Date.h * */ #ifndef ZYPP_DATE_H #define ZYPP_DATE_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Date // /** Store and operate on date (time_t). */ class ZYPP_API Date { friend std::ostream & operator<<( std::ostream & str, const Date & obj ); public: using ValueType = time_t; using Duration = time_t; static const ValueType second = 1; static const ValueType minute = 60; static const ValueType hour = 3600; static const ValueType day = 86400; static const ValueType month28 = 2419200; static const ValueType month29 = 2505600; static const ValueType month30 = 2592000; static const ValueType month31 = 2678400; static const ValueType month = month30; static const ValueType year365 = 31536000; static const ValueType year366 = 31622400; static const ValueType year = year365; enum TimeBase { TB_LOCALTIME, TB_UTC }; /** Default ctor: 0 */ Date() : _date( 0 ) {} /** Ctor taking time_t value. */ Date( ValueType date_r ) : _date( date_r ) {} /** Ctor taking time_t value as string. */ explicit Date( const std::string & seconds_r ); /** * Ctor from a \a date_str (in localtime) formatted using \a format. * * \throws DateFormatException in case \a date_str cannot be * parsed according to \a format. */ Date( const std::string & date_str, const std::string & format ); /** \overload with explicitly given \ref TimeBase. */ Date( const std::string & date_str, const std::string & format, TimeBase base_r ); /** Return the current time. */ static Date now() { return ::time( 0 ); } public: /** Conversion to time_t. */ operator ValueType() const { return _date; } /** \name Arithmetic operations. */ //@{ Date operator+( const time_t rhs ) const { return _date + rhs; } Date operator-( const time_t rhs ) const { return _date - rhs; } Date operator*( const time_t rhs ) const { return _date * rhs; } Date operator/( const time_t rhs ) const { return _date / rhs; } Date & operator+=( const time_t rhs ) { _date += rhs; return *this; } Date & operator-=( const time_t rhs ) { _date -= rhs; return *this; } Date & operator*=( const time_t rhs ) { _date *= rhs; return *this; } Date & operator/=( const time_t rhs ) { _date /= rhs; return *this; } Date & operator++(/*prefix*/) { _date += 1; return *this; } Date & operator--(/*prefix*/) { _date -= 1; return *this; } Date operator++(int/*postfix*/) { return _date++; } Date operator--(int/*postfix*/) { return _date--; } //@} public: /** Return string representation according to format as localtime. * \see 'man strftime' (which is used internaly) for valid * conversion specifiers in format. * * \return An empty string on illegal format, "0" if date is unspecified. **/ std::string form( const std::string & format_r ) const { return form( format_r, TB_LOCALTIME ); } /** \overload with explicitly given \ref TimeBase. */ std::string form( const std::string & format_r, TimeBase base_r ) const; /** Default string representation of Date. * The preferred date and time representation for the current locale. **/ std::string asString() const { return form( "%c" ); } /** Convert to string representation of calendar time in * numeric form (like "1029255142"). **/ std::string asSeconds() const { return form( "%s" ); } public: /** \name Printing in various predefined formats */ //@{ /** Date formats for printing (use like 'enum class \ref DateFormat') */ struct EDateFormatDef { enum Enum { none, ///< "" calendar, ///< 2014-02-07 month, ///< 2014-02 year, ///< 2014 week, ///< 2014-W06 weekday, ///< 2014-W06-5 (1 is Monday) ordinal, ///< 2014-038 };}; using DateFormat = base::EnumClass; ///< 'enum class DateFormat' /** Time formats for printing (use like 'enum class \ref TimeFormat') */ struct ETimeFormatDef { enum Enum { none, ///< "" seconds, ///< 07:06:41 minutes, ///< 07:06 hours, ///< 07 };}; using TimeFormat = base::EnumClass; ///< 'enum class TimeFormat' /** Timezone indicator for printing (use like 'enum class \ref TimeZoneFormat') */ struct ETimeZoneFormatDef { enum Enum { none, ///< "" name, ///< UTC, CET, ... offset, ///< +00[:00] };}; using TimeZoneFormat = base::EnumClass; ///< 'enum class TimeZoneFormat' /** Default format is '2014-02-07 07:06:41 CET' * The default is \ref DateFormat::calendar, \ref TimeFormat::seconds, \ref TimeZoneFormat::name and * \ref TB_LOCALTIME. For other formats you don't have to repeat all the defaults, just pass the * values where you differ. */ std::string print( DateFormat dateFormat_r = DateFormat::calendar, TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const; /** \overload */ std::string print( TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const { return print( DateFormat::calendar, timeFormat_r, timeZoneFormat_r, base_r ); } /** \overload */ std::string print( DateFormat dateFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const { return print( dateFormat_r, TimeFormat::seconds, timeZoneFormat_r, base_r ); } /** \overload */ std::string print( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeBase base_r ) const { return print( dateFormat_r, timeFormat_r, TimeZoneFormat::name, base_r ); } /** \overload */ std::string print( TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const { return print( DateFormat::calendar, TimeFormat::seconds, timeZoneFormat_r, base_r ); } /** \overload */ std::string print( TimeFormat timeFormat_r, TimeBase base_r ) const { return print( DateFormat::calendar, timeFormat_r, TimeZoneFormat::name, base_r ); } /** \overload */ std::string print( DateFormat dateFormat_r, TimeBase base_r ) const { return print( dateFormat_r, TimeFormat::seconds, TimeZoneFormat::name, base_r ); } /** \overload */ std::string print( TimeBase base_r ) const { return print( DateFormat::calendar, TimeFormat::seconds, TimeZoneFormat::name, base_r ); } /** Convenience for printing the date only ['2014-02-07'] * The default is \ref DateFormat::calendar and \ref TB_LOCALTIME */ std::string printDate( DateFormat dateFormat_r = DateFormat::calendar, TimeBase base_r = TB_LOCALTIME ) const { return print( dateFormat_r, TimeFormat::none, TimeZoneFormat::none, base_r ); } /** \overload */ std::string printDate( TimeBase base_r ) const { return printDate( DateFormat::calendar, base_r ); } /** Convenience for printing the time only ['07:06:41 CET'] * The default is \ref DateFormat::calendar and \ref TB_LOCALTIME */ std::string printTime( TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const { return print( DateFormat::none, timeFormat_r, timeZoneFormat_r, base_r ); } /** \overload */ std::string printTime( TimeZoneFormat timeZoneFormat_r , TimeBase base_r = TB_LOCALTIME ) const { return printTime( TimeFormat::seconds, timeZoneFormat_r, base_r ); } /** \overload */ std::string printTime( TimeFormat timeFormat_r , TimeBase base_r ) const { return printTime( timeFormat_r, TimeZoneFormat::name, base_r ); } /** \overload */ std::string printTime( TimeBase base_r ) const { return printTime( TimeFormat::seconds, TimeZoneFormat::name, base_r ); } /** Default ISO 8601 format is '2014-02-07T07:06:41+01' * \note As timezone names are not used in ISO, \ref TimeZoneFormat::name is the same as * \ref TimeZoneFormat::offset when printing in \ref TB_LOCALTIME. When printing \ref TB_UTC * it uses a \c 'Z' to indicate UTC (Zulu time) rather than printing \c '+00'. */ std::string printISO( DateFormat dateFormat_r = DateFormat::calendar, TimeFormat timeFormat_r = TimeFormat::seconds, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const; /** \overload */ std::string printISO( TimeFormat timeFormat_r, TimeZoneFormat timeZoneFormat_r = TimeZoneFormat::name, TimeBase base_r = TB_LOCALTIME ) const { return printISO( DateFormat::calendar, timeFormat_r, timeZoneFormat_r, base_r ); } /** \overload */ std::string printISO( DateFormat dateFormat_r, TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const { return printISO( dateFormat_r, TimeFormat::seconds, timeZoneFormat_r, base_r ); } /** \overload */ std::string printISO( DateFormat dateFormat_r, TimeFormat timeFormat_r, TimeBase base_r ) const { return printISO( dateFormat_r, timeFormat_r, TimeZoneFormat::name, base_r ); } /** \overload */ std::string printISO( TimeZoneFormat timeZoneFormat_r, TimeBase base_r = TB_LOCALTIME ) const { return printISO( DateFormat::calendar, TimeFormat::seconds, timeZoneFormat_r, base_r ); } /** \overload */ std::string printISO( TimeFormat timeFormat_r, TimeBase base_r ) const { return printISO( DateFormat::calendar, timeFormat_r, TimeZoneFormat::name, base_r ); } /** \overload */ std::string printISO( DateFormat dateFormat_r, TimeBase base_r ) const { return printISO( dateFormat_r, TimeFormat::seconds, TimeZoneFormat::name, base_r ); } /** \overload */ std::string printISO( TimeBase base_r ) const { return printISO( DateFormat::calendar, TimeFormat::seconds, TimeZoneFormat::name, base_r ); } //@} private: /** Calendar time. * The number of seconds elapsed since 00:00:00 on January 1, 1970, * Coordinated Universal Time (UTC). **/ ValueType _date; }; /////////////////////////////////////////////////////////////////// /** \relates Date Stream output */ inline std::ostream & operator<<( std::ostream & str, const Date & obj ) { return str << obj.asString(); } /** \relates Date XML output. * Print \c time_t and \c text attribute. Allow alternate node name [date]. */ std::ostream & dumpAsXmlOn( std::ostream & str, const Date & obj, const std::string & name_r = "date" ) ZYPP_API; /////////////////////////////////////////////////////////////////// class ZYPP_API DateFormatException : public Exception { public: DateFormatException( const std::string & msg ) : Exception( msg ) {} }; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_DATE_H libzypp-17.36.5/zypp-core/Digest.cc000066400000000000000000000221611476576476200170760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Digest.cc * * \todo replace by Blocxx * */ #include // snprintf #include #include #include #if OPENSSL_API_LEVEL < 30000 #include #else #include #endif #include #include #include #include #include #include #include #include using std::endl; namespace zypp { const std::string & Digest::md5() { static std::string _type( "md5" ); return _type; } const std::string & Digest::sha1() { static std::string _type( "sha1" ); return _type; } const std::string & Digest::sha224() { static std::string _type( "sha224" ); return _type; } const std::string & Digest::sha256() { static std::string _type( "sha256" ); return _type; } const std::string & Digest::sha384() { static std::string _type( "sha384" ); return _type; } const std::string & Digest::sha512() { static std::string _type( "sha512" ); return _type; } // private data class Digest::P { P(const P& p) = delete; const P& operator=(const P& p) = delete; P(P &&) = delete; P &operator=(P &&) = delete; public: using EvpDataPtr = zypp::shared_ptr; P(); ~P(); EvpDataPtr mdctx; #if OPENSSL_API_LEVEL >= 30000 AutoDispose md; #else const EVP_MD *md; #endif unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned md_len; zypp::ByteCount bytesHashed; bool finalized : 1; static bool openssl_digests_added; std::string name; inline bool maybeInit(); inline void cleanup(); }; bool Digest::P::openssl_digests_added = false; Digest::P::P() : md(nullptr), finalized(false) { } Digest::P::~P() { cleanup(); } bool Digest::P::maybeInit() { if(!openssl_digests_added) { #if OPENSSL_API_LEVEL >= 30000 // openssl 3.0 does not use engines anymore, instead we fetch algorithms via a new API // also it seems initialization is implicit, i'm not sure if that call here is even required. OPENSSL_init_crypto( OPENSSL_INIT_LOAD_CONFIG, nullptr ); // md4 was moved to legacy, we need this for zsync if ( !OSSL_PROVIDER_load( nullptr, "legacy" ) ) { ERR << "Failed to load legacy openssl provider" << std::endl; } if ( !OSSL_PROVIDER_load( nullptr, "default") ) { ERR << "Failed to load default openssl provider" << std::endl; } OPENSSL_init_crypto( OPENSSL_INIT_ADD_ALL_DIGESTS, nullptr ); #else # if OPENSSL_VERSION_NUMBER >= 0x10100000L OPENSSL_init_crypto( OPENSSL_INIT_LOAD_CONFIG, nullptr ); # else OPENSSL_config(NULL); # endif ENGINE_load_builtin_engines(); ENGINE_register_all_complete(); OpenSSL_add_all_digests(); #endif openssl_digests_added = true; } if(!mdctx) { #if OPENSSL_API_LEVEL >= 30000 // this fetches the new provider based algorithms, returned objects have to be free'd // i wonder if we could cache the providers instead of querying them for every Digest instance.... md = AutoDispose( EVP_MD_fetch (nullptr, name.c_str(), nullptr), EVP_MD_free ); #else md = EVP_get_digestbyname(name.c_str()); #endif if(!md) return false; #if OPENSSL_VERSION_NUMBER < 0x10100000L EvpDataPtr tmp_mdctx(EVP_MD_CTX_create(), EVP_MD_CTX_destroy); #else EvpDataPtr tmp_mdctx(EVP_MD_CTX_new(), EVP_MD_CTX_free); #endif if (!tmp_mdctx) return false; if (!EVP_DigestInit_ex(tmp_mdctx.get(), md, NULL)) { return false; } md_len = 0; ::memset(md_value, 0, sizeof(md_value)); bytesHashed = 0; mdctx.swap(tmp_mdctx); } return true; } void Digest::P::cleanup() { #if OPENSSL_API_LEVEL >= 30000 md.reset(); #endif mdctx.reset(); finalized = false; } Digest::Digest() : _dp( std::make_unique

() ) { } Digest::Digest(Digest &&other) noexcept : _dp( std::move(other._dp) ) { } Digest &Digest::operator=(Digest &&other) noexcept { _dp = std::move( other._dp ); return *this; } Digest::~Digest() { } bool Digest::create(const std::string& name) { if(name.empty()) return false; if(_dp->mdctx) _dp->cleanup(); _dp->name = name; return _dp->maybeInit(); } const std::string& Digest::name() { return _dp->name; } bool Digest::reset() { if (!_dp->mdctx) return false; if(!_dp->finalized) { (void)EVP_DigestFinal_ex(_dp->mdctx.get(), _dp->md_value, &_dp->md_len); _dp->finalized = true; } if(!EVP_DigestInit_ex(_dp->mdctx.get(), _dp->md, NULL)) return false; _dp->finalized = false; _dp->bytesHashed = 0; return true; } Digest Digest::clone() const { Digest d; if ( !_dp->name.empty () ) d.create ( _dp->name ); return d; } std::string Digest::digest() { return digestVectorToString( digestVector() ); } std::string Digest::digestVectorToString(const UByteArray &vec) { if ( vec.empty() ) return std::string(); std::vector resData ( vec.size()*2 + 1, '\0' ); char *mdtxt = &resData[0]; for(unsigned i = 0; i < vec.size(); ++i) { ::snprintf( mdtxt+(i*2), 3, "%02hhx", vec[i]); } return std::string( resData.data() ); } #ifdef __cpp_lib_string_view namespace { template BArr hexStrToBArr ( std::string_view str ) { BArr bytes; for ( std::string::size_type i = 0; i < str.length(); i+=2 ) { #define c2h(c) (((c)>='0' && (c)<='9') ? ((c)-'0') \ : ((c)>='a' && (c)<='f') ? ((c)-('a'-10)) \ : ((c)>='A' && (c)<='F') ? ((c)-('A'-10)) \ : -1) int v = c2h(str[i]); if (v < 0) return {}; bytes.push_back(v); v = c2h(str[i+1]); if (v < 0) return {}; bytes.back() = (bytes.back() << 4) | v; #undef c2h } return bytes; } } // namespace ByteArray Digest::hexStringToByteArray(std::string_view str) { return hexStrToBArr( std::move(str) ); } UByteArray Digest::hexStringToUByteArray( std::string_view str ) { return hexStrToBArr( std::move(str) ); } #endif UByteArray Digest::digestVector() { UByteArray r; if(!_dp->maybeInit()) return r; if(!_dp->finalized) { if(!EVP_DigestFinal_ex(_dp->mdctx.get(), _dp->md_value, &_dp->md_len)) return r; _dp->finalized = true; } r.reserve(_dp->md_len); for(unsigned i = 0; i < _dp->md_len; ++i) r.push_back(_dp->md_value[i]); return r; } bool Digest::update(const char* bytes, size_t len) { if(!bytes) { return false; } if(!_dp->maybeInit()) return false; if(_dp->finalized) { _dp->cleanup(); if(!_dp->maybeInit()) return false; } if(!EVP_DigestUpdate(_dp->mdctx.get(), reinterpret_cast(bytes), len)) return false; _dp->bytesHashed += len; return true; } bool Digest::update(std::istream &is, size_t bufsize) { if( !is ) return false; char buf[bufsize]; while(is.good()) { size_t readed = 0; is.read(buf, bufsize); readed = is.gcount(); if(readed && !update(buf, readed)) return false; } return true; } ByteCount Digest::bytesHashed() const { return _dp->bytesHashed; } std::string Digest::digest(const std::string& name, std::istream& is, size_t bufsize) { if(name.empty() || !is) return std::string(); Digest digest; if(!digest.create(name)) return std::string(); if ( !digest.update( is, bufsize )) return std::string(); return digest.digest(); } std::string Digest::digest( const std::string & name, const std::string & input, size_t bufsize ) { std::istringstream is( input ); return digest( name, is, bufsize ); } } // namespace zypp libzypp-17.36.5/zypp-core/Digest.h000066400000000000000000000137771476576476200167550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/Digest.h * * \todo replace by Blocxx * */ #ifndef ZYPP_CORE_DIGEST_H #define ZYPP_CORE_DIGEST_H #include #include #include #include #include #include #include namespace zypp { /** \brief Compute Message Digests (MD5, SHA1 etc) * * The computation works by initializing the algorithm using create(). This * will construct an internal state. successive calls to update() deliver the * data for which the digest is to be computed. After all data has been * deliverd, a call to digest() finalizes the computation and returns the * result * */ class Digest { private: class P; std::unique_ptr

     * hexstring(42)           -> "0x0000002a"
     * hexstring(42, 4)        -> "0x2a"
     * hexstring(42,-4)        -> "0x2a"
     * 
**/ //@{ inline std::string hexstring( char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } inline std::string hexstring( unsigned char n, int w = 4 ) { return form( "%#0*hhx", w, n ); } inline std::string hexstring( short n, int w = 10 ){ return form( "%#0*hx", w, n ); } inline std::string hexstring( unsigned short n, int w = 10 ){ return form( "%#0*hx", w, n ); } inline std::string hexstring( int n, int w = 10 ){ return form( "%#0*x", w, n ); } inline std::string hexstring( unsigned n, int w = 10 ){ return form( "%#0*x", w, n ); } inline std::string hexstring( long n, int w = 10 ){ return form( "%#0*lx", w, n ); } inline std::string hexstring( unsigned long n, int w = 10 ){ return form( "%#0*lx", w, n ); } inline std::string hexstring( long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } inline std::string hexstring( unsigned long long n, int w = 0 ) { return form( "%#0*llx", w, n ); } //@} /////////////////////////////////////////////////////////////////// /** \name String representation of number as octal value with leading '0'. * Optional second argument sets the minimal * string width (0 padded). Negative values will cause the number to be left adjusted * within the string. Default width is 5 (4 for char). *
     * octstring(42)           -> "00052"
     * octstring(42, 4)        -> "0052"
     * octstring(42,-4)        -> "052 "
     * 
**/ //@{ inline std::string octstring( char n, int w = 4 ) { return form( "%#0*hho", w, n ); } inline std::string octstring( unsigned char n, int w = 4 ) { return form( "%#0*hho", w, n ); } inline std::string octstring( short n, int w = 5 ) { return form( "%#0*ho", w, n ); } inline std::string octstring( unsigned short n, int w = 5 ) { return form( "%#0*ho", w, n ); } inline std::string octstring( int n, int w = 5 ) { return form( "%#0*o", w, n ); } inline std::string octstring( unsigned n, int w = 5 ) { return form( "%#0*o", w, n ); } inline std::string octstring( long n, int w = 5 ) { return form( "%#0*lo", w, n ); } inline std::string octstring( unsigned long n, int w = 5 ) { return form( "%#0*lo", w, n ); } inline std::string octstring( long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } inline std::string octstring( unsigned long long n, int w = 0 ) { return form( "%#0*llo", w, n ); } //@} /////////////////////////////////////////////////////////////////// /** String representation of number as bit-string with leading '0's. */ template std::string binstring( TInt val_r ) { constexpr unsigned bits = sizeof(TInt)*8; std::string ret( bits, ' ' ); TInt bit = 1; for ( unsigned pos = bits; pos > 0; ) { --pos; ret[pos] = ((val_r & bit)?'1':'0'); bit = bit<<1; } return ret; } /////////////////////////////////////////////////////////////////// /** Parsing numbers from string. */ //@{ /** String to integer type determined by template arg. * \note Only specializations are defined. * \code * time_t t = strtonum( "42" ); * \endcode */ template TInt strtonum( const C_Str & str ); template<> inline short strtonum( const C_Str & str ) { return ::strtol ( str, NULL, 0 ); } template<> inline int strtonum( const C_Str & str ) { return ::strtol ( str, NULL, 0 ); } template<> inline long strtonum( const C_Str & str ) { return ::strtol ( str, NULL, 0 ); } template<> inline long long strtonum( const C_Str & str ) { return ::strtoll ( str, NULL, 0 ); } template<> inline unsigned short strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); } template<> inline unsigned strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); } template<> inline unsigned long strtonum( const C_Str & str ) { return ::strtoul ( str, NULL, 0 ); } template<> inline unsigned long long strtonum( const C_Str & str ) { return ::strtoull( str, NULL, 0 ); } /** String to integer type detemined 2nd function arg \a i. * \code * time_t t; strtonum( "42", t ); * \endcode */ template inline TInt strtonum( const C_Str & str, TInt & i ) { return i = strtonum( str ); } //@} /////////////////////////////////////////////////////////////////// /** Parsing boolean from string. */ //@{ /** Return \c true if str is 1, true, yes, on, always (or a nonzero number). */ bool strToTrue( const C_Str & str ) ZYPP_API; /** Return \c false if str is 0, false, no, off, never. */ bool strToFalse( const C_Str & str ) ZYPP_API; /** Parse \c str into a bool depending on the default value. * If the \c default is true, look for a legal \c false string. * If the \c default is false, look for a legal \c true string. */ inline bool strToBool( const C_Str & str, bool default_r ) { return( default_r ? strToFalse( str ) : strToTrue( str ) ); } /** Parse \c str into a bool if it's a legal \c true or \c false string. * If \c str is not a recognized \c true or \c false string, \a return_r * is left unchanged. */ inline bool strToBoolNodefault( const C_Str & str, bool & return_r ) { if ( strToTrue( str ) ) return (return_r = true); if ( !strToFalse( str ) ) return (return_r = false); return return_r; } /** Parse \c str into a bool if it's a legal \c true or \c false string; else \c indeterminate. */ TriBool strToTriBool( const C_Str & str ) ZYPP_API; //@} /** * \short Return a string with all occurrences of \c from_r replaced with \c to_r. */ std::string gsub( const std::string & str_r, const std::string & from_r, const std::string & to_r ) ZYPP_API; /** \overload A function is called on demand to compute each replacement value. */ std::string gsubFun( const std::string & str_r, const std::string & from_r, function to_r ) ZYPP_API; /** * \short Replace all occurrences of \c from_r with \c to_r in \c str_r (inplace). * A reference to \c str_r is also returned for convenience. */ std::string & replaceAll( std::string & str_r, const std::string & from_r, const std::string & to_r ) ZYPP_API; /** \overload A function is called on demand to compute each replacement value. */ std::string & replaceAllFun( std::string & str_r, const std::string & from_r, const function& to_r ) ZYPP_API; /** Enhance readability: insert gaps at regular distance * \code * // no gaps * Key Fingerprint: 22C07BA534178CD02EFE22AAB88B2FD43DBDC284 * // gapify 8 * Key Fingerprint: 22C07BA5 34178CD0 2EFE22AA B88B2FD4 3DBDC284 * // gapify 4 * Key Fingerprint: 22C0 7BA5 3417 8CD0 2EFE 22AA B88B 2FD4 3DBD C284 * // gapify 4, '-' * Key Fingerprint: 22C0-7BA5-3417-8CD0-2EFE-22AA-B88B-2FD4-3DBD-C284 * \endcode */ inline std::string gapify( std::string inp_r, std::string::size_type gap_r = 1, char gapchar = ' ' ) { if ( gap_r && inp_r.size() > gap_r ) { inp_r.reserve( inp_r.size() + (inp_r.size()-1)/gap_r ); for ( std::string::size_type pos = gap_r; pos < inp_r.size(); pos += gap_r+1 ) inp_r.insert( pos, 1, gapchar ); } return inp_r; } /////////////////////////////////////////////////////////////////// /** \name Trimming whitepace. * \todo optimize l/r trim. */ //@{ /** To define how to trim. */ enum Trim { NO_TRIM = 0x00, L_TRIM = 0x01, R_TRIM = 0x02, TRIM = (L_TRIM|R_TRIM) }; std::string trim( const std::string & s, const Trim trim_r = TRIM ) ZYPP_API; std::string trim( std::string && s, const Trim trim_r = TRIM ) ZYPP_API; inline std::string ltrim( const std::string & s ) { return trim( s, L_TRIM ); } inline std::string ltrim( std::string && s ) { return trim( std::move(s), L_TRIM ); } inline std::string rtrim( const std::string & s ) { return trim( s, R_TRIM ); } inline std::string rtrim( std::string && s ) { return trim( std::move(s), R_TRIM ); } //@} /////////////////////////////////////////////////////////////////// /** \name Split. */ //@{ /** Split \a line_r into words. * Any sequence of characters in \a sepchars_r is treated as * delimiter. The words are passed to OutputIterator \a result_r. * \code * std::vector words; * str::split( "some line", std::back_inserter(words) ) * \endcode * */ template unsigned split( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = " \t", const Trim trim_r = NO_TRIM ) { const char * beg = line_r; const char * cur = beg; // skip leading sepchars while ( *cur && ::strchr( sepchars_r, *cur ) ) ++cur; unsigned ret = 0; for ( beg = cur; *beg; beg = cur, ++result_r, ++ret ) { // skip non sepchars while( *cur && !::strchr( sepchars_r, *cur ) ) ++cur; // build string *result_r = trim( std::string( beg, cur-beg ), trim_r ); // skip sepchars while ( *cur && ::strchr( sepchars_r, *cur ) ) ++cur; } return ret; } template unsigned split( const C_Str & line_r, TOutputIterator result_r, const Trim trim_r ) { return split( line_r, result_r, " \t", trim_r ); } /** Split \a line_r into words with respect to escape delimeters. * Any sequence of characters in \a sepchars_r is treated as * delimiter if not inside \c "" or \c '' or escaped by \c \. * * \li A non-quoted backslash (\) preserves the literal value of the next character. * \li Enclosing characters in single quotes preserves the literal value of each * character within the quotes. A single quote may not occur between single * quotes, even when preceded by a backslash. * \li Enclosing characters in double quotes preserves the literal value of all * characters within the quotes, with the exception of \c \. The backslash * retains its special meaning only when followed by \c " or \c \. * * The words are passed to OutputIterator \a result_r. * * \see \ref splitEscaped * * \code * std::vector words; * str::splitEscaped( "some line", std::back_inserter(words) ) * \endcode * * \code * example splitted strings * normal line -> 2 elements ( "normal", "line" ) * escaped\ line -> 1 element(escaped line) * "quoted line" -> 1 element same as above * 'quoted line' -> 1 element same as above * "escaped quote\"" -> 1 element (escaped quote") * * \param line_r The string to parse. * \param result_r * \param sepchars_r String of separator characters. * \param withEmpty Whether to include empty fields between separators in the result. * * \endcode */ template unsigned splitEscaped( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = " \t", bool withEmpty = false) { const char * beg = line_r; const char * cur = beg; unsigned ret = 0; // skip leading sepchars while ( *cur && ::strchr( sepchars_r, *cur ) ) { ++cur; if (withEmpty) { *result_r = ""; ++ret; } } // there were only sepchars in the string if (!*cur && withEmpty) { *result_r = ""; return ++ret; } // after the leading sepchars enum class Quote { None, Slash, Single, Double, DoubleSlash }; std::vector buf; Quote quoting = Quote::None; for ( beg = cur; *beg; beg = cur, ++result_r, ++ret ) { // read next value until unquoted sepchar buf.clear(); quoting = Quote::None; do { switch ( quoting ) { case Quote::None: switch ( *cur ) { case '\\': quoting = Quote::Slash; break; case '\'': quoting = Quote::Single; break; case '"': quoting = Quote::Double; break; default: buf.push_back( *cur ); break; } break; case Quote::Slash: buf.push_back( *cur ); quoting = Quote::None; break; case Quote::Single: switch ( *cur ) { case '\'': quoting = Quote::None; break; default: buf.push_back( *cur ); break; } break; case Quote::Double: switch ( *cur ) { case '\"': quoting = Quote::None; break; case '\\': quoting = Quote::DoubleSlash; break; default: buf.push_back( *cur ); break; } break; case Quote::DoubleSlash: switch ( *cur ) { case '\"': /*fallthrough*/ case '\\': buf.push_back( *cur ); break; default: buf.push_back( '\\' ); buf.push_back( *cur ); break; } quoting = Quote::Double; break; } ++cur; } while ( *cur && ( quoting != Quote::None || !::strchr( sepchars_r, *cur ) ) ); *result_r = std::string( buf.begin(), buf.end() ); // skip sepchars if ( *cur && ::strchr( sepchars_r, *cur ) ) ++cur; while ( *cur && ::strchr( sepchars_r, *cur ) ) { ++cur; if (withEmpty) { *result_r = ""; ++ret; } } // the last was a separator => one more field if ( !*cur && withEmpty && ::strchr( sepchars_r, *(cur-1) ) ) { *result_r = ""; ++ret; } } return ret; } /** Split \a line_r into fields. * Any single character in \a sepchars_r is treated as a * field separator unless \-escaped. The words are passed * to OutputIterator. * \a result_r. * \code * "" -> words 0 * ":" -> words 2 ||| * "a" -> words 1 |a| * ":a" -> words 2 ||a| * "a:" -> words 2 |a|| * ":a:" -> words 3 ||a|| * * \endcode * * \code * std::vector words; * str::split( "some line", std::back_inserter(words) ) * \endcode * */ template unsigned splitFields( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = ":" ) { const char * beg = line_r; const char * cur = beg; unsigned ret = 0; for ( beg = cur; *beg; beg = cur, ++result_r ) { // skip non sepchars while( *cur && !::strchr( sepchars_r, *cur ) ) { if ( *cur == '\\' && *(cur+1) ) ++cur; ++cur; } // build string *result_r = std::string( beg, cur-beg ); ++ret; // skip sepchar if ( *cur ) { ++cur; if ( ! *cur ) // ending with sepchar { *result_r = std::string(); // add final empty field ++ret; break; } } } return ret; } /** * Split \a line_r into fields handling also escaped separators. * * \see splitFields() * \see splitEscaped() */ template unsigned splitFieldsEscaped( const C_Str & line_r, TOutputIterator result_r, const C_Str & sepchars_r = ":" ) { return splitEscaped( line_r, result_r, sepchars_r, true /* withEmpty */ ); } //@} /////////////////////////////////////////////////////////////////// /** \name Join. */ //@{ /** Join strings using separator \a sep_r (defaults to BLANK). */ template std::string join( TIterator begin, TIterator end, const C_Str & sep_r = " " ) { std::string res; for ( TIterator iter = begin; iter != end; ++ iter ) { if ( iter != begin ) res += sep_r; res += asString(*iter); } return res; } /** Join strings using separator \a sep_r (defaults to BLANK). */ template std::string join( const TContainer & cont_r, const C_Str & sep_r = " " ) { return join( cont_r.begin(), cont_r.end(), sep_r ); } /** Join strings using separator \a sep_r, quoting or escaping the values. * Separator defaults to BLANK. Use \ref splitEscaped to restore the * values. */ template std::string joinEscaped( TIterator begin, TIterator end, const char sep_r = ' ' ) { std::vector buf; for ( TIterator iter = begin; iter != end; ++ iter ) { if ( iter != begin ) buf.push_back( sep_r ); if ( iter->empty() ) { // empty string goes "" buf.push_back( '"' ); buf.push_back( '"' ); } else { std::string toadd( asString(*iter) ); for ( const char ch : toadd ) { switch ( ch ) { case '"': case '\'': case '\\': buf.push_back( '\\' ); buf.push_back( ch ); break; default: if ( ch == sep_r ) buf.push_back( '\\' ); buf.push_back( ch ); } } } } return std::string( buf.begin(), buf.end() ); } //@} /////////////////////////////////////////////////////////////////// /** \name Indent. */ //@{ /** Indent by string [" "] optionally wrap. * Prints nothing for an empty string. Asserts a trainling '\n' on * the last line. Optionally wrap lines at ' ' at a given length. */ inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, const std::string & indent_r = " ", unsigned maxWitdh_r = 0 ) { if ( maxWitdh_r ) { if ( indent_r.size() >= maxWitdh_r ) maxWitdh_r = 0; // nonsense: indent larger than line witdh else maxWitdh_r -= indent_r.size(); } for ( const char * e = text_r.c_str(), * s = e; *e; s = ++e ) { for ( ; *e && *e != '\n'; ++e ) ;/*searching*/ unsigned width = e-s; if ( maxWitdh_r && width > maxWitdh_r ) { // must break line width = maxWitdh_r; for ( e = s+width; e > s && *e != ' '; --e ) ;/*searching*/ if ( e > s ) width = e-s; // on a ' ', replaced by '\n' else e = s+width-1; // cut line; } str << indent_r; str.write( s, width ); str << "\n"; if ( !*e ) // on '\0' break; } return str; } /** \overload Indent by number of chars [' '] optionally wrap. */ inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, unsigned indent_r, char indentch_r = ' ', unsigned maxWitdh_r = 0 ) { return printIndented( str, text_r, std::string( indent_r, indentch_r ), maxWitdh_r ); } /** \overload Indent by number of chars [' '] wrap. */ inline std::ostream & printIndented( std::ostream & str, const std::string & text_r, unsigned indent_r, unsigned maxWitdh_r, char indentch_r = ' ' ) { return printIndented( str, text_r, std::string( indent_r, indentch_r ), maxWitdh_r ); } /** Prefix lines by string computed by function taking line begin/end [std::string(const char*, const char*)] * Prints nothing for an empty string. Asserts a trainling '\n' on the last line. */ inline std::ostream & autoPrefix( std::ostream & str, const std::string & text_r, const function& fnc_r ) { for ( const char * e = text_r.c_str(); *e; ++e ) { const char * s = e; for ( ; *e && *e != '\n'; ++e ) /*searching*/; str << fnc_r( s, e ); str.write( s, e-s ); str << "\n"; if ( !*e ) // on '\0' break; } return str; } /** \overload Prefix lines by string generated by function [std::string()] */ inline std::ostream & autoPrefix0( std::ostream & str, const std::string & text_r, function fnc_r ) { auto wrap = [&fnc_r]( const char*, const char* )-> std::string { return fnc_r(); }; return autoPrefix( str, text_r, wrap ); } //@} /////////////////////////////////////////////////////////////////// /** \name Escape. */ //@{ /** * Escape desired character \a c using a backslash. * * For use when printing \a c separated values, and where * \ref joinEscaped() is too heavy. */ std::string escape( const C_Str & str_r, const char c = ' ' ) ZYPP_API; /** Escape \a next_r and append it to \a str_r using separator \a sep_r. */ inline void appendEscaped( std::string & str_r, const C_Str & next_r, const char sep_r = ' ' ) { if ( ! str_r.empty() ) str_r += sep_r; if ( next_r.empty() ) str_r += "\"\""; else str_r += escape( next_r, sep_r ); } /** Return \a str_r with '\'-escaped chars occurring in \a special_r (and '\'). */ std::string bEscape( std::string str_r, const C_Str & special_r ) ZYPP_API; /** Escape plain STRING \a str_r for use in a regex (not anchored by "^" or "$"). */ std::string rxEscapeStr( std::string str_r ) ZYPP_API; /** Escape GLOB \a str_r for use in a regex (not anchored by "^" or "$"). */ std::string rxEscapeGlob( std::string str_r ) ZYPP_API; //! \todo unsecape() //@} /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /** \name Hexencode. * Encode all characters other than [a-zA-Z0-9] as %XX. * This includes the % character itself, which becomes %25. */ //@{ /** Encode all characters other than [a-zA-Z0-9] as %XX. * This includes the % character itself, which becomes %25. */ std::string hexencode( const C_Str & str_r ); /** Decode hexencoded %XX sequences. */ std::string hexdecode( const C_Str & str_r ); //@} /////////////////////////////////////////////////////////////////// /** \name Case conversion. */ //@{ /** Return lowercase version of \a s * \todo improve */ std::string toLower( const std::string & s ) ZYPP_API; std::string toLower( std::string && s ) ZYPP_API; /** \overload */ inline std::string toLower( const char * s ) { return( s ? toLower( std::string(s) ) : std::string() ); } /** Return uppercase version of \a s * \todo improve */ std::string toUpper( const std::string & s ) ZYPP_API; std::string toUpper( std::string && s ) ZYPP_API; /** \overload */ inline std::string toUpper( const char * s ) { return( s ? toUpper( std::string(s) ) : std::string() ); } //@} /** \name Case insensitive comparison. */ //@{ inline int compareCI( const C_Str & lhs, const C_Str & rhs ) { return ::strcasecmp( lhs, rhs ); } //@} /** \name Locate substring. */ //@{ /** Locate substring case sensitive. */ inline bool contains( const C_Str & str_r, const C_Str & val_r ) { return ::strstr( str_r, val_r ); } /** Locate substring case insensitive. */ inline bool containsCI( const C_Str & str_r, const C_Str & val_r ) { return ::strcasestr( str_r, val_r ); } //@} std::string stripFirstWord( std::string & line, const bool ltrim_first = true ) ZYPP_API; std::string stripLastWord( std::string & line, const bool rtrim_first = true ) ZYPP_API; /** Return stream content up to (but not returning) the next newline. * \see \ref receiveUpTo */ std::string getline( std::istream & str, bool trim = false ) ZYPP_API; /** Return stream content up to (but not returning) the next newline. * \see \ref receiveUpTo */ std::string getline( std::istream & str, const Trim trim_r ) ZYPP_API; /** Return stream content up to the next ocurrence of \c delim_r or EOF * \c delim_r, if found, is always read from the stream. Whether it is * also returned in the string depends on \c returnDelim_r. * If the stream status is \c good, \c delim_r was found in the stream. * If we reached EOF while looking for \c delim_r, \c eof is set; and * also \c fail, if we did not read any data before. */ std::string receiveUpTo( std::istream & str, const char delim_r, bool returnDelim_r = false ); /////////////////////////////////////////////////////////////////// /** \name String prefix/suffix handling. */ //@{ /** Return whether \a str_r has prefix \a prefix_r. */ inline bool hasPrefix( const C_Str & str_r, const C_Str & prefix_r ) { return( ::strncmp( str_r, prefix_r, prefix_r.size() ) == 0 ); } /** \overload Case insensitive */ inline bool hasPrefixCI( const C_Str & str_r, const C_Str & prefix_r ) { return( ::strncasecmp( str_r, prefix_r, prefix_r.size() ) == 0 ); } /** Strip a \a prefix_r from \a str_r and return the resulting string. */ inline std::string stripPrefix( const C_Str & str_r, const C_Str & prefix_r ) { return( hasPrefix( str_r, prefix_r ) ? str_r + prefix_r.size() : str_r.c_str() ); } /** \overload Case insensitive */ inline std::string stripPrefixCI( const C_Str & str_r, const C_Str & prefix_r ) { return( hasPrefixCI( str_r, prefix_r ) ? str_r + prefix_r.size() : str_r.c_str() ); } /** Return whether \a str_r has suffix \a suffix_r. */ inline bool hasSuffix( const C_Str & str_r, const C_Str & suffix_r ) { return( str_r.size() >= suffix_r.size() && ::strncmp( str_r + str_r.size() - suffix_r.size() , suffix_r, suffix_r.size() ) == 0 ); } /** \overload Case insensitive */ inline bool hasSuffixCI( const C_Str & str_r, const C_Str & suffix_r ) { return( str_r.size() >= suffix_r.size() && ::strncasecmp( str_r + str_r.size() - suffix_r.size() , suffix_r, suffix_r.size() ) == 0 ); } /** Strip a \a suffix_r from \a str_r and return the resulting string. */ inline std::string stripSuffix( const C_Str & str_r, const C_Str & suffix_r ) { if ( hasSuffix( str_r, suffix_r ) ) return std::string( str_r, str_r.size() - suffix_r.size() ); return str_r.c_str(); } /** \overload Case insensitive */ inline std::string stripSuffixCI( const C_Str & str_r, const C_Str & suffix_r ) { if ( hasSuffixCI( str_r, suffix_r ) ) return std::string( str_r, str_r.size() - suffix_r.size() ); return str_r.c_str(); } /** Return size of the common prefix of \a lhs and \a rhs. */ inline std::string::size_type commonPrefix( const C_Str & lhs, const C_Str & rhs ) { const char * lp = lhs.c_str(); const char * rp = rhs.c_str(); std::string::size_type ret = 0; while ( *lp == *rp && *lp != '\0' ) { ++lp, ++rp, ++ret; } return ret; } /** \overload Case insensitive */ inline std::string::size_type commonPrefixCI( const C_Str & lhs, const C_Str & rhs ) { const char * lp = lhs.c_str(); const char * rp = rhs.c_str(); std::string::size_type ret = 0; while ( tolower(*lp) == tolower(*rp) && *lp != '\0' ) { ++lp, ++rp, ++ret; } return ret; } /** alias for \ref hasPrefix */ inline bool startsWith( const C_Str & str_r, const C_Str & prefix_r ) { return hasPrefix( str_r, prefix_r ); } /** \overload Case insensitive */ inline bool startsWithCI( const C_Str & str_r, const C_Str & prefix_r ) { return hasPrefixCI( str_r, prefix_r ); } /** alias for \ref hasSuffix */ inline bool endsWith( const C_Str & str_r, const C_Str & prefix_r ) { return hasSuffix( str_r, prefix_r ); } /** \overload Case insensitive */ inline bool endsWithCI( const C_Str & str_r, const C_Str & prefix_r ) { return hasSuffixCI( str_r, prefix_r ); } //@} } // namespace str /////////////////////////////////////////////////////////////////// // drag into zypp:: namespace using str::asString; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_STRING_H libzypp-17.36.5/zypp-core/base/StringV.cc000066400000000000000000000170201476576476200201630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/StringV.cc */ #include #include /////////////////////////////////////////////////////////////////// namespace zypp { namespace strv { namespace detail { /** \ref split working horse for empty \a sep_r case. * Split at /[BLANK,TAB]+/ and report no-empty words. Trim::right is * applied to the rest of the line in case the callback aborts further * processing. */ unsigned _splitSimple( std::string_view line_r, const WordConsumer& fnc_r ) { // callback stats unsigned fncCall = 0; // NOTE: line_r is not null-terminated! const char *const eol = line_r.data() + line_r.size(); // the '\0' const char * searchfrom = line_r.data(); // start of the next search (moves with each cycle!) // Empty sep: split at /[BLANK,TAB]+/ and report no-empty words auto isSep = []( char ch )->bool { return ch == ' '|| ch == '\t'; }; auto skipSep = [eol,&isSep]( const char *& ptr )->bool { while ( ptr < eol && isSep( *ptr ) ) ++ptr; return ptr < eol; // whether we ended up at a new wordstart }; auto skipWord = [eol,&isSep]( const char *& ptr )->void { while ( ptr < eol && ! isSep( *ptr ) ) ++ptr; }; // For the 'last' CB argument: we must remember a word // until we know whether another one is following std::string_view word; while ( skipSep( searchfrom ) ) { const char * wordstart = searchfrom; // Report a previous word found if ( ! word.empty() ) { if ( fnc_r ) { if ( ! fnc_r( word, fncCall, false/*more to come*/ ) ) { // Stop searching for further matches. Final report will // be the remaining line (right trimmed) const char * wordend = eol; while ( isSep( *(wordend-1) ) ) // noSep at wordstart stops loop --wordend; word = std::string_view( wordstart, wordend-wordstart ); ++fncCall; break; } } ++fncCall; } // remember new word ++searchfrom; skipWord( searchfrom ); word = std::string_view( wordstart, searchfrom-wordstart ); } // finally report the last word if ( ! word.empty() ) { if ( fnc_r ) { fnc_r( word, fncCall, true/*last*/ ); } ++fncCall; } return fncCall; } } // namespace detail unsigned detail::_split( std::string_view line_r, std::string_view sep_r, Trim trim_r, WordConsumer && fnc_r ) { if ( sep_r.empty() ) return _splitSimple( line_r, std::move( fnc_r ) ); // callback stats bool fncStop = false; unsigned fncCall = 0; using size_type = std::string_view::size_type; size_type wordstart = 0; // start of the next string to be reported size_type searchfrom = 0; // start of the next search for a separator do { // report lhs word of separator matches... searchfrom = line_r.find( sep_r, searchfrom ); if ( fncStop || searchfrom == line_r.npos ) { break; } // Report lhs word of the match and advance... if ( fnc_r ) { if ( ! fnc_r( trim( line_r.substr(wordstart,searchfrom-wordstart), trim_r ), fncCall, false/*more to come*/ ) ) fncStop= true; // stop searching for further matches } ++fncCall; // Next wordstart is behind the separator match. searchfrom += sep_r.size(); wordstart = searchfrom; } while( wordstart < line_r.size() ); // finally report rhs word of the last separator match (or no match) if ( fnc_r ) { if ( wordstart < line_r.size() ) fnc_r( trim( line_r.substr(wordstart,line_r.size()-wordstart), trim_r ), fncCall, true/*last*/ ); else // a final match at $ so a final empty word reported (no trim needed) fnc_r( std::string_view( line_r.data()+line_r.size(), 0 ), fncCall, true/*last*/ ); } ++fncCall; return fncCall; } unsigned detail::_splitRx( std::string_view line_r, const regex & rx_r, const WordConsumer& fnc_r ) { // callback stats bool fncStop = false; unsigned fncCall = 0; // report lhs word of separator matches... const char *const eol = line_r.data() + line_r.size(); // the '\0' bool trailingNL = line_r.size() && *(eol-1) == '\n'; // line ends with NL const char * wordstart = line_r.data(); // start of the next string to be reported const char * searchfrom = line_r.data(); // start of the next search for a separator (moves with each cycle!) // Whether to match the ^ at beginning of the line or after an \n: auto matchAtBOL = [&]() { return searchfrom == line_r.data() || *(searchfrom-1) == '\n' ? regex::none : regex::not_bol; }; do { // report lhs word of separator matches... smatch match; if ( fncStop || ! rx_r.matches( searchfrom, match, matchAtBOL() ) ) { break; } if ( trailingNL && searchfrom+match.begin(0) == eol ) break; // don't report matches behind a trailing NL if ( match.end(0) == 0 && searchfrom == wordstart && searchfrom != line_r.data() ) { // An empty(!) separator found at wordstart is ignored unless we're at the very beginning. // If searchfrom == wordstart we just skipped over a not-empty separator. If wordstart is // not part of a 2nd not-empty separator, we want the next separator to its right. // Example: Rx:"b*" Str:"0b2" - at pos 2 Rx matches empty; the previous cycle found 'b' and reported the '0'. ++searchfrom; } else { // Report lhs word of the match and advance... if ( fnc_r ) { if ( ! fnc_r( std::string_view( wordstart, searchfrom+match.begin(0) - wordstart ), fncCall, false/*more to come*/ ) ) fncStop= true; // stop searching for further matches } ++fncCall; // Next wordstart is behind the separator match. // Next searchfrom also, but advances at least by 1. wordstart = searchfrom+match.end(0); searchfrom += match.end(0) ? match.end(0) : 1; } } while ( searchfrom <= eol ); // incl. '== eol' as there might be an (empty) match at $ // finally report rhs word of the last separator match (or no match) if ( fnc_r ) { if ( wordstart < eol ) fnc_r( std::string_view( wordstart, eol-wordstart ), fncCall, true/*last*/ ); else // a final match at $ so a final empty word reported fnc_r( std::string_view( eol, 0 ), fncCall, true/*last*/ ); } ++fncCall; return fncCall; } } // namespace strv } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/StringV.h000066400000000000000000000302021476576476200200220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/StringV.h * c++17: std::string_view tools */ #ifndef ZYPP_BASE_STRINGV_H #define ZYPP_BASE_STRINGV_H #include #ifdef __cpp_lib_string_view #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { namespace strv { using regex = str::regex; using smatch = str::smatch; /** Define how to trim. */ enum class Trim { notrim = 0, left = 1<<0, right = 1<<1, trim = (left|right), }; ZYPP_DECLARE_FLAGS_AND_OPERATORS( TrimFlag, Trim ); /** The default blank. */ inline constexpr std::string_view blank = " \t"; /** Trim \a chars_r at the beginning of \a str_r. */ inline std::string_view ltrim( std::string_view str_r, std::string_view chars_r = blank ) { if ( str_r.empty() ) return str_r; auto pos = str_r.find_first_not_of( chars_r ); if ( pos == str_r.npos ) str_r.remove_prefix( str_r.size() ); else if ( pos ) str_r.remove_prefix( pos ); return str_r; } /** Trim \a chars_r at the end of \a str_r. */ inline std::string_view rtrim( std::string_view str_r, std::string_view chars_r = blank ) { if ( str_r.empty() ) return str_r; auto pos = str_r.find_last_not_of( chars_r ); if ( pos == str_r.npos ) str_r.remove_suffix( str_r.size() ); else if ( (pos = str_r.size()-1-pos) ) str_r.remove_suffix( pos ); return str_r; } /** Trim \a chars_r at both sides of \a str_r. */ inline std::string_view trim( std::string_view str_r, std::string_view chars_r = blank ) { if ( str_r.empty() ) return str_r; str_r = ltrim( std::move(str_r), chars_r ); str_r = rtrim( std::move(str_r), chars_r ); return str_r; } /** Trim \a chars_r at \a trim_r sides of \a str_r. */ inline std::string_view trim( std::string_view str_r, std::string_view chars_r, TrimFlag trim_r ) { if ( str_r.empty() || trim_r == Trim::notrim ) return str_r; if ( trim_r.testFlag( Trim::left ) ) str_r = ltrim( std::move(str_r), chars_r ); if ( trim_r.testFlag( Trim::right ) ) str_r = rtrim( std::move(str_r), chars_r ); return str_r; } /** \overload Trimming blanks at \a trim_r sides of \a str_r. */ inline std::string_view trim( std::string_view str_r, TrimFlag trim_r ) { return trim( std::move(str_r), blank, std::move(trim_r) ); } /** Return whether \a str_r has prefix \a prefix_r. */ inline bool hasPrefix( std::string_view str_r, std::string_view prefix_r ) { return( ::strncmp( str_r.data(), prefix_r.data(), prefix_r.size() ) == 0 ); } /** \overload Case insensitive */ inline bool hasPrefixCI( std::string_view str_r, std::string_view prefix_r ) { return( ::strncasecmp( str_r.data(), prefix_r.data(), prefix_r.size() ) == 0 ); } /////////////////////////////////////////////////////////////////// namespace detail { /** Split* functions working horse callback. */ using WordConsumer = std::function; /** \name Split* callback signatures accepted for convenience. * * Details may vary for specific split* functions, but basically each separator found * in line will be enclosed by 2 words being reported. The working horse callback * offers the \a word, the \a index of word (starting with 0) and a boolean indicating whether * this is going to be the \a last report. * * A callback may optionally return a value convertible to \c bool. Returning \c false * usually causes split* to stop looking further separators and to finish the reporting. * * Accepted callbacks: [bool|void] callback( [std::string_view[, unsigned[, bool]]] ) * (or no callback at all ) */ //@{ /** bool(std::string_view,unsigned,bool) */ template , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return std::forward(fnc_r); } /** void(std::string_view,unsigned,bool) */ template && std::is_invocable_r_v , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return [&fnc_r](std::string_view a1,unsigned a2,bool a3)->bool { fnc_r(a1,a2,a3); return true; }; } /** bool(std::string_view,unsigned) */ template , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return [&fnc_r](std::string_view a1,unsigned a2,bool)->bool { return fnc_r(a1,a2); }; } /** void(std::string_view,unsigned) */ template && std::is_invocable_r_v , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return [&fnc_r](std::string_view a1,unsigned a2,bool)->bool { fnc_r(a1,a2); return true; }; } /** bool(std::string_view) */ template , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return [&fnc_r](std::string_view a1,unsigned,bool)->bool { return fnc_r(a1); }; } /** void(std::string_view) */ template && std::is_invocable_r_v , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return [&fnc_r](std::string_view a1,unsigned,bool)->bool { fnc_r(a1); return true; }; } /** bool() */ template , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return [&fnc_r](std::string_view,unsigned,bool)->bool { return fnc_r(); }; } /** void() */ template && std::is_invocable_r_v , bool> = true> WordConsumer wordConsumer( Callable && fnc_r ) { return [&fnc_r](std::string_view,unsigned,bool)->bool { fnc_r(); return true; }; } //@} /** \ref split working horse */ unsigned _split( std::string_view line_r, std::string_view sep_r, Trim trim_r, WordConsumer && fnc_r ) ZYPP_API; /** \ref splitRx working horse */ unsigned _splitRx(std::string_view line_r, const regex & rx_r, const WordConsumer& fnc_r ); } // namespace detail /////////////////////////////////////////////////////////////////// /** Split \a line_r into words separated by the regular expression \a rx_r and invoke \a fnc_r with each word. * * Each separator match found in \a line_r will be enclosed by 2 words being reported. * Words may be empty if the separator match is located at the beginning or at the end * of \a line_r, or if there are consecutive separator match occurrences. * * Accepted callbacks: [bool|void]( [std::string_view[, unsigned[, bool]]] ) * (or no callback at all) * * A callback may take the \a word, the \a index of word (starting with 0) and a boolean * indicating whether this is going to be the \a last report. * * A callback may optionally return a value convertible to \c bool. Returning \c false * causes split to stop looking further separators. The final report will contain the * remaining part of the \a line_r then. * * If the separator does not occur on the line the whole string is reported. * * \returns the number of words reported. */ template unsigned splitRx( std::string_view line_r, const regex & rx_r, Callable && fnc_r = Callable() ) { return detail::_splitRx( line_r, rx_r, detail::wordConsumer( std::forward(fnc_r) ) ); } /** Split \a line_r into words separated by \a sep_r and invoke \a fnc_r with each word. * * - If \a sep_r is not empty, each separator found in \a line_r will be enclosed by 2 * words being reported. Words may be empty if the separator is located at the beginning * or the end of \a line_r or if there are consecutive occurrences. * * - If \a sep_r is unspecified or empty, it splits on whitespace /[BLANK,TAB]+/. In this * case only the (not empty) words found on the line are reported (trimmed). * * The optional \a trim_r argument tells whether whitespace around the words found * should be trimmed before reporting them. The default is not to trim. * * Accepted callbacks: [bool|void]( [std::string_view[, unsigned[, bool]]] ) * (or no callback at all) * * A callback may take the \a word, the \a index of word (starting with 0) and a boolean * indicating whether this is going to be the \a last report. * * A callback may optionally return a value convertible to \c bool. Returning \c false * causes split to stop looking further separators. The final report will contain the * remaining part of the \a line_r then. * * If the separator does not occur on the line the whole string is reported. * * \returns the number of words reported. * * \code * str = "" * * split( str, fnc ); * // [] * * split( str, " ", fnc ); * // [''] * * * str = " " * * split( str, fnc ); * // [] * * split( str, " ", fnc ); * // ['', ''] * * * str = " 1 2 3 4 5 "; * * split( str, fnc ); * // ['1', '2', '3', '4', '5'] * * split( str, " ", fnc ); * // ['', '1', '2', '3', '4', '5', ''] * * split( str, " 2", fnc ); * // [' 1', ' 3 4 5 '] * * split( str, " 2", Trim::all, fnc ); * // ['1', '3 4 5'] * \endcode */ template unsigned split( std::string_view line_r, std::string_view sep_r, Trim trim_r, Callable && fnc_r = Callable() ) { return detail::_split( line_r, sep_r, trim_r, detail::wordConsumer( std::forward(fnc_r) ) ); } /** \overload Split at \a sep_r and Trim::notrim */ template inline unsigned split( std::string_view line_r, std::string_view sep_r, Callable && fnc_r = Callable() ) { return detail::_split( line_r, sep_r, Trim::notrim, detail::wordConsumer( std::forward(fnc_r) ) ); } /** \overload Split at whitespace */ template inline unsigned split( std::string_view line_r, Callable && fnc_r = Callable() ) { return detail::_split( line_r, std::string_view(), Trim::notrim, detail::wordConsumer( std::forward(fnc_r) ) ); } inline std::string_view asStringView( const char * t ) { return t == nullptr ? std::string_view() : t; } } // namespace strv } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // __cpp_lib_string_view #endif // ZYPP_BASE_STRINGV_H libzypp-17.36.5/zypp-core/base/Unit.cc000066400000000000000000000033741476576476200175150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Unit.cc * */ #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// std::string Unit::form( double val_r, const std::string & symbol_r, unsigned field_width_r, unsigned unit_width_r, unsigned prec_r ) { std::string ret = str::form( "%*.*f", field_width_r, prec_r, val_r ); if ( unit_width_r ) { ret += str::form( " %*s", unit_width_r, symbol_r.c_str() ); } return ret; } ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/Unit.h000066400000000000000000000070561476576476200173600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Unit.h * */ #ifndef ZYPP_BASE_UNIT_H #define ZYPP_BASE_UNIT_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Unit // /** Simple handling of Units. * * Unit stores factor and symbol, and a precision value for printing. * \ref form builds a string from a value according to the format * specification. * \code * static const Unit B( 1, "B", 0 ); * static const Unit K( 1024, "K", 1 ); * static const Unit M( 1048576, "M", 1 ); * static const Unit G( 1073741824, "G", 2 ); * static const Unit T( 1099511627776, "T", 3 ); * \endcode */ class ZYPP_API Unit { public: using ValueType = long long; /** Default ctor */ Unit() : _factor( 1 ) , _prec( 0 ) {} /** ctor */ Unit( ValueType factor_r, std::string symbol_r, unsigned prec_r ) : _factor( factor_r ) , _symbol(std::move( symbol_r )) , _prec( prec_r ) {} ValueType factor() const { return _factor; } const std::string & symbol() const { return _symbol; } unsigned prec() const { return _prec; } /** Build string representation of \a val_r. */ std::string form( ValueType val_r, unsigned field_width_r = 0, unsigned unit_width_r = 1 ) const { return form( val_r, field_width_r, unit_width_r, _prec ); } std::string form( ValueType val_r, unsigned field_width_r, unsigned unit_width_r, unsigned prec_r ) const { return form( double(val_r)/_factor, _symbol, field_width_r, unit_width_r, prec_r ); } static std::string form( double val_r, const std::string & symbol_r, unsigned field_width_r, unsigned unit_width_r, unsigned prec_r ); private: ValueType _factor; std::string _symbol; unsigned _prec; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_UNIT_H libzypp-17.36.5/zypp-core/base/UserRequestException000066400000000000000000000000421476576476200223450ustar00rootroot00000000000000#include "userrequestexception.h" libzypp-17.36.5/zypp-core/base/Xml.cc000066400000000000000000000013501476576476200173260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Xml.cc * */ #include "Xml.h" namespace zypp { namespace xmlout { constexpr Node::OptionalContentType Node::optionalContent; } } libzypp-17.36.5/zypp-core/base/Xml.h000066400000000000000000000171321476576476200171750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Xml.h * */ #ifndef ZYPP_BASE_XML_H #define ZYPP_BASE_XML_H #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace xmlout { using xml::escape; using xml::unescape; /** \relates NodeAttr NODE ATTRIBUTE representation of types [asString] */ template std::string asXmlNodeAttr( const Tp & val_r ) { return asString( val_r ); } /////////////////////////////////////////////////////////////////// /// \class NodeAttr /// \brief (Key, Value) string pair of XML node attributes struct NodeAttr : public std::pair { using Pair = std::pair; template NodeAttr( std::string key_r, const Tp & val_r ) : Pair( std::move(key_r), asXmlNodeAttr(val_r) ) {} NodeAttr( std::string key_r, std::string val_r ) : Pair( std::move(key_r), std::move(val_r) ) {} }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class Node /// \brief RAII writing a nodes start/end tag /// \code /// { /// Node node( std::cout, "node", { "attr", "val" } ); // /// *node << "write nodes body...." /// } // /// \endcode /// \note If the \ref optionalContent flag is passed to the \c ctor, the start /// node is kept open, until the first call to \ref operator*. The start node /// is closed before returning the stream. /// \code /// { /// Node node( std::cout, "node", Node::optionalContent, { "attr", "val" } ); /// // /// { /// Node node( std::cout, "node", Node::optionalContent, { "attr", "val" } ); /// // write nodes body... /// } // /// \endcode /// /// \note If the nodename is empty or starts with an \c !, a comment is written. /// struct Node { NON_COPYABLE_BUT_MOVE( Node ); using Attr = NodeAttr; struct OptionalContentType {}; ///< Ctor arg type static constexpr OptionalContentType optionalContent = OptionalContentType(); /** Ctor taking nodename and attribute list */ Node( std::ostream & out_r, std::string name_r, const std::initializer_list & attrs_r = {} ) : _out( out_r ), _name( std::move(name_r) ), _hasContent( true ) { printStart( attrs_r ); } /** Convenience ctor for one attribute pair */ Node( std::ostream & out_r, std::string name_r, Attr attr_r ) : Node( out_r, std::move(name_r), { std::move(attr_r) } ) {} /** Optional content ctor taking nodename and attribute list */ Node( std::ostream & out_r, std::string name_r, OptionalContentType, const std::initializer_list & attrs_r = {} ) : _out( out_r ), _name( std::move(name_r) ), _hasContent( false ) { printStart( attrs_r ); } /** Optional content Convenience ctor for one attribute pair */ Node( std::ostream & out_r, std::string name_r, OptionalContentType, Attr attr_r ) : Node( out_r, std::move(name_r), optionalContent, { std::move(attr_r) } ) {} /** Dtor wrting end tag */ ~Node() { if ( isComment() ) _out.get() << "-->"; else { if ( _hasContent ) _out.get() << ""; else _out.get() << "/>"; } } /** Exception type thrown if attributes are added to a closed start node. */ struct HasContentException{}; /** Add additional attributes (requires OptionalContentType) * \throw HasContentException If start node is already closed */ Node & addAttr( const std::initializer_list & attrs_r = {} ) { if ( _hasContent ) throw HasContentException(); printAttr( attrs_r ); return *this; } /** \overload for one */ Node & addAttr( const Attr & attr_r ) { return addAttr( { attr_r } ); } /** Return the output stream */ std::ostream & operator*() { if ( ! _hasContent ) { _hasContent = true; if ( isComment() ) _out.get() << "|"; else _out.get() << ">"; } return _out; } private: void printStart( const std::initializer_list & attrs_r ) { if ( _name.empty() || _name[0] == '!' ) { _out.get() << " empty line sep. header and body addRawHeader( data ); } while ( true ); // check for content-length header std::optional cLen; { const auto &contentLen = getHeaderNT( zypp::PluginFrame::contentLengthHeader(), std::string() ); if ( !contentLen.empty() ) { cLen = zyppng::str::safe_strtonum(contentLen); if ( !cLen ) { ERR << "Received malformed message from peer: Invalid value for " << zypp::PluginFrame::contentLengthHeader() << ":" << contentLen << std::endl; ZYPP_THROW( PluginFrameException( "Invalid value for content-length." ) ); } // do not keep the header, we regenerate it again when writing the frame anyway clearHeader( zypp::PluginFrame::contentLengthHeader() ); } } // data if ( cLen ) { _body.resize ( (*cLen)+1, '\0' ); stream_r.read ( _body.data(), (*cLen)+1 ); if ( ! stream_r.good() ) ZYPP_THROW( PluginFrameException( "Missing data in stream" ) ); if ( _body.back() != '\0' ) ZYPP_THROW( PluginFrameException( "Missing NUL after body" ) ); _body.pop_back (); // get rid of \0 } else { const auto &data = str::receiveUpTo( stream_r, '\0' ); _body = ByteArray( data.c_str(), data.size() ); if ( ! stream_r.good() ) ZYPP_THROW( PluginFrameException( "Missing NUL after body" ) ); } } std::ostream & PluginFrame::Impl::writeTo( std::ostream & stream_r ) const { //DBG << "Write " << *this << " to " << stream_r << endl; if ( ! stream_r ) ZYPP_THROW( PluginFrameException( "Bad Stream" ) ); // command stream_r << _command << "\n"; // STOMP recommends sending a content-length header stream_r << contentLengthHeader() << ':' << str::numstring( _body.size() ) << "\n"; // header // bsc#1231043: We do allow a literal ":" in the header value(!) in order to stay // compatible with with plugin implementations (like zypp-plugin) which are not // prepared to unescape a ":" there. And in fact it should not be necessary because // the 1st colon separates header and value. for_( it, _header.begin(), _header.end() ) stream_r << escapeHeader(it->first) << ':' << escapeHeader(it->second,/*escapeColon=*/false) << "\n"; // header end stream_r << "\n"; // body stream_r.write( _body.data(), _body.size() ); // body end stream_r << '\0'; stream_r.flush(); if ( ! stream_r ) ZYPP_THROW( PluginFrameException( "Write error" ) ); return stream_r; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PluginFrame // /////////////////////////////////////////////////////////////////// const std::string & PluginFrame::ackCommand() { static std::string _val( "ACK" ); return _val; } const std::string & PluginFrame::errorCommand() { static std::string _val( "ERROR" ); return _val; } const std::string & PluginFrame::enomethodCommand() { static std::string _val( "_ENOMETHOD" ); return _val; } const std::string &PluginFrame::contentLengthHeader() { static std::string _val("content-length"); return _val; } PluginFrame::PluginFrame() : _pimpl( Impl::nullimpl() ) {} PluginFrame::PluginFrame( const std::string & command_r ) : _pimpl( new Impl( command_r ) ) {} PluginFrame::PluginFrame(const std::string & command_r, std::string body_r ) : _pimpl( new Impl( command_r, ByteArray(body_r) ) ) {} PluginFrame::PluginFrame(const std::string & command_r, ByteArray body_r ) : _pimpl( new Impl( command_r, std::move(body_r) ) ) {} PluginFrame::PluginFrame( const std::string & command_r, HeaderInitializerList contents_r ) : _pimpl( new Impl( command_r, contents_r ) ) {} PluginFrame::PluginFrame(const std::string & command_r, ByteArray body_r, HeaderInitializerList contents_r ) : _pimpl( new Impl( command_r, std::move(body_r), contents_r ) ) {} PluginFrame::PluginFrame( std::istream & stream_r ) : _pimpl( new Impl( stream_r ) ) {} bool PluginFrame::empty() const { return _pimpl->empty(); } const std::string & PluginFrame::command() const { return _pimpl->command(); } void PluginFrame::setCommand( const std::string & command_r ) { _pimpl->setCommand( command_r ); } const ByteArray &PluginFrame::body() const { return _pimpl->body(); } ByteArray &PluginFrame::bodyRef() { return _pimpl->bodyRef(); } void PluginFrame::setBody( const std::string & body_r ) { _pimpl->setBody( ByteArray(body_r.data(), body_r.size()) ); } void PluginFrame::setBody( const ByteArray & body_r ) { _pimpl->setBody( ByteArray(body_r) ); } void PluginFrame::setBody( ByteArray && body_r ) { _pimpl->setBody( std::move(body_r) ); } std::ostream & PluginFrame::writeTo( std::ostream & stream_r ) const { return _pimpl->writeTo( stream_r ); } PluginFrame::HeaderList & PluginFrame::headerList() { return _pimpl->headerList(); } const PluginFrame::HeaderList & PluginFrame::headerList() const { return _pimpl->headerList(); } const std::string & PluginFrame::getHeader( const std::string & key_r ) const { return _pimpl->getHeader( key_r ); } const std::string & PluginFrame::getHeader( const std::string & key_r, const std::string & default_r ) const { return _pimpl->getHeader( key_r, default_r ); } const std::string & PluginFrame::getHeaderNT( const std::string & key_r, const std::string & default_r ) const { return _pimpl->getHeaderNT( key_r, default_r ); } void PluginFrame::setHeader( const std::string & key_r, const std::string & value_r ) { _pimpl->setHeader( key_r, value_r ); } void PluginFrame::addHeader( const std::string & key_r, const std::string & value_r ) { _pimpl->addHeader( key_r, value_r ); } void PluginFrame::addHeader( HeaderInitializerList contents_r ) { _pimpl->addHeader( contents_r ); } void PluginFrame::addRawHeader( const ByteArray &header ) { _pimpl->addRawHeader( header.asStringView() ); } void PluginFrame::clearHeader( const std::string & key_r ) { _pimpl->clearHeader( key_r ); } /////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const PluginFrame & obj ) { return str << *obj._pimpl; } bool operator==( const PluginFrame & lhs, const PluginFrame & rhs ) { return ( lhs._pimpl == rhs._pimpl ) || (( lhs.command() == rhs.command() ) && ( lhs.headerList() == rhs.headerList() ) && ( lhs.body() == rhs.body() )); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/rpc/PluginFrame.h000066400000000000000000000252271476576476200205240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginFrame.h * */ #ifndef ZYPP_CORE_PLUGINFRAME_H #define ZYPP_CORE_PLUGINFRAME_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Command frame for communication with \ref PluginScript * * \code * COMMAND * key:value header lines * * multiline body separated from header * by an empty line and terminated by NUL. * ^@ * \endcode * * \see PluginScript */ class ZYPP_API PluginFrame { friend std::ostream & operator<<( std::ostream & str, const PluginFrame & obj ); friend bool operator==( const PluginFrame & lhs, const PluginFrame & rhs ); using HeaderInitializerList = const std::initializer_list> &; public: /** "ACK" command. */ static const std::string & ackCommand(); /** "ERROR" command. */ static const std::string & errorCommand(); /** "_ENOMETHOD" command. */ static const std::string & enomethodCommand(); /** "content-lenght" header name */ static const std::string &contentLengthHeader(); public: /** Default exception type */ using Exception = PluginFrameException; /** Default ctor (empty frame) */ PluginFrame(); /** Ctor taking the command * \throw PluginFrameException If \ref setCommand throws */ PluginFrame( const std::string & command_r ); /** Ctor taking command and body * \throw PluginFrameException If \ref setCommand throws */ PluginFrame(const std::string & command_r, std::string body_r ); /** Ctor taking command and body * \throw PluginFrameException If \ref setCommand throws */ PluginFrame(const std::string & command_r, ByteArray body_r ); /** Ctor taking the command and a HeaderInitializerList * \throw PluginFrameException If \ref setCommand throws */ PluginFrame( const std::string & command_r, HeaderInitializerList contents_r ); /** Ctor taking command, body and a HeaderInitializerList * \throw PluginFrameException If \ref setCommand throws */ PluginFrame(const std::string & command_r, ByteArray body_r, HeaderInitializerList contents_r ); /** Ctor reading frame data from a stream * \throw PluginFrameException On error reading from stream * \throw PluginFrameException On error parsing the data */ PluginFrame( std::istream & stream_r ); public: /** Whether this is an empty frame. */ bool empty() const; /** Evaluate in a boolean context (not an empty frame) */ explicit operator bool() const { return !empty(); } public: /** Return the frame command. */ const std::string & command() const; /** Set the frame command * \throw PluginFrameException If illegal command string (e.g. multiline) */ void setCommand( const std::string & command_r ); /** Convenience to identify an ACK command. */ bool isAckCommand() const { return command() == ackCommand(); } /** Convenience to identify an ERROR command. */ bool isErrorCommand() const {return command() == errorCommand(); } /** Convenience to identify an _ENOMETHOD command. */ bool isEnomethodCommand() const {return command() == enomethodCommand(); } /** Return the frame body. */ const ByteArray & body() const; /** Return a reference to the frame body. * This may avoid creating unnecessary copies if you * want to manipulate large body data. * \code * ByteArray tmp; * frame.bodyRef().swap( tmp ); * \endcode */ ByteArray & bodyRef(); /** Set the frame body */ void setBody( const std::string & body_r ); /** Set the frame body */ void setBody( const ByteArray & body_r ); /** Set the frame body */ void setBody( ByteArray && body_r ); public: /** The header list */ using HeaderList = std::multimap; /** Header list iterator */ using HeaderListIterator = HeaderList::const_iterator; private: /** Modifyalble header list for internal use only. */ HeaderList & headerList(); public: /** The header list. */ const HeaderList & headerList() const; /** Whether header list is empty. */ bool headerEmpty() const { return headerList().empty(); } /** Return size of the header list. */ unsigned headerSize() const { return headerList().size(); } /** Return iterator pointing to the 1st header (or \ref headerEnd) */ HeaderListIterator headerBegin() const { return headerList().begin(); } /** Return iterator pointing behind the last header. */ HeaderListIterator headerEnd() const { return headerList().end(); } /** Clear the list of headers. */ void headerClear() { headerList().clear(); } /** Whether the header list contains at least one entry for \c key_r. */ bool hasKey( const std::string & key_r ) const { return ! keyEmpty( key_r ); } /** \overload */ bool keyEmpty( const std::string & key_r ) const { return headerList().find( key_r ) == headerEnd(); } /** Return number of header entries for \c key_r. */ bool keySize( const std::string & key_r ) const { return headerList().count( key_r ); } /** Return iterator pointing to the 1st header for \c key_r (or \ref keyEnd(key_r)) */ HeaderListIterator keyBegin( const std::string & key_r ) const { return headerList().lower_bound( key_r ); } /** Return iterator pointing behind the last header for \c key_r.*/ HeaderListIterator keyEnd( const std::string & key_r ) const { return headerList().upper_bound( key_r ); } /** Return header value for \c key_r. * \throw PluginFrameException If no header for key_r exists. * \throw PluginFrameException If multiple header for key_r exist. */ const std::string & getHeader( const std::string & key_r ) const; /** Return header value for \c key_r or \c default_r if it does not exist. * \throw PluginFrameException If multiple header for key_r exist. */ const std::string & getHeader( const std::string & key_r, const std::string & default_r ) const; /** Not throwing version returing one of the matching header values or \c default_r string. */ const std::string & getHeaderNT( const std::string & key_r, const std::string & default_r = std::string() ) const; /** Set header for \c key_r removing all other occurrences of \c key_r. * \throw PluginFrameException If key contains illegal chars (\c NL or \c :) * \throw PluginFrameException If value contains illegal chars (\c NL) */ void setHeader( const std::string & key_r, const std::string & value_r = std::string() ); /** Set a new header list * \throw PluginFrameException If key contains illegal chars (\c NL or \c :) * \throw PluginFrameException If value contains illegal chars (\c NL) */ void setHeader( HeaderInitializerList contents_r ) { headerList().clear(); addHeader( contents_r ); } /** Add header for \c key_r leaving already existing headers for \c key_r unchanged. * \throw PluginFrameException If key contains illegal chars (\c NL or \c :) * \throw PluginFrameException If value contains illegal chars (\c NL) */ void addHeader( const std::string & key_r, const std::string & value_r = std::string() ); /** \overload taking an initializer_list */ void addHeader( HeaderInitializerList contents_r ); /*! * Parses the header line in \a header and if it is valid adds it to the internal * header list. */ void addRawHeader ( const ByteArray &header ); /** Remove all headers for \c key_r. */ void clearHeader( const std::string & key_r ); public: /** Write frame to stream * \throw PluginFrameException On error writing to stream */ std::ostream & writeTo( std::ostream & stream_r ) const; /** \overload Static version. */ static std::ostream & writeTo( std::ostream & stream_r, const PluginFrame & frame_r ) { return frame_r.writeTo( stream_r ); } /** Read frame from stream * \throw PluginFrameException If \ref PluginFrame(std::istream&) throws */ std::istream & readFrom( std::istream & stream_r ) { *this = PluginFrame( stream_r ); return stream_r; } /** \overload Static version. */ static std::istream & readFrom( std::istream & stream_r, PluginFrame & frame_r ) { frame_r = PluginFrame( stream_r ); return stream_r; } public: /** Implementation */ struct Impl; private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /** \relates PluginFrame Stream output for logging */ std::ostream & operator<<( std::ostream & str, const PluginFrame & obj ); /** \relates PluginFrame Stream output writing all data for logging (no throw) */ inline std::ostream & dumpOn( std::ostream & str, const PluginFrame & obj ) { if ( str ) try { PluginFrame::writeTo( str, obj ); } catch(...){}; return str; } /** \relates PluginFrame Construct from stream. */ inline std::istream & operator>>( std::istream & str, PluginFrame & obj ) { return PluginFrame::readFrom( str, obj ); } /** \relates PluginFrame Comparison based on content. */ bool operator==( const PluginFrame & lhs, const PluginFrame & rhs ); /** \relates PluginFrame Comparison based on content. */ inline bool operator!=( const PluginFrame & lhs, const PluginFrame & rhs ) { return( ! operator==( lhs, rhs ) ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CORE_PLUGINFRAME_H libzypp-17.36.5/zypp-core/rpc/PluginFrameException.cc000066400000000000000000000027551476576476200225420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginFrameException.cc * */ #include //#include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// PluginFrameException::PluginFrameException() : Exception( "PluginFrameException" ) {} PluginFrameException::PluginFrameException( const std::string & msg_r ) : Exception( msg_r ) {} PluginFrameException::PluginFrameException( const std::string & msg_r, const std::string & hist_r ) : Exception( msg_r ) { addHistory( hist_r ); } PluginFrameException::~PluginFrameException() throw() {}; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/rpc/PluginFrameException.h000066400000000000000000000032041476576476200223720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginFrameException.h * */ #ifndef ZYPP_CORE_PLUGINFRAMEEXCEPTION_H #define ZYPP_CORE_PLUGINFRAMEEXCEPTION_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PluginFrameException // /** Base class for \ref PluginFrame \ref Exception. */ class ZYPP_API PluginFrameException : public Exception { public: PluginFrameException(); PluginFrameException( const std::string & msg_r ); PluginFrameException( const std::string & msg_r, const std::string & hist_r ); ~PluginFrameException() throw() override; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CORE_PLUGINFRAMEEXCEPTION_H libzypp-17.36.5/zypp-core/ui/000077500000000000000000000000001476576476200157635ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/ui/ProgressData000066400000000000000000000000321476576476200202770ustar00rootroot00000000000000#include "progressdata.h" libzypp-17.36.5/zypp-core/ui/progressdata.cc000066400000000000000000000121631476576476200207730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ProgressData.cc * */ #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "Progress" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ProgressData::report // METHOD TYPE : void // bool ProgressData::report() { bool forceReport { _d->_state != RUN }; // bsc#1206949: force reporting the INIT||END states static constexpr std::chrono::milliseconds minfequency { 1000 }; static constexpr std::chrono::milliseconds maxfequency { 100 }; Data::TimePoint now { Data::TimePoint::clock::now() }; Data::TimePoint::duration elapsed { now - _d->_last_send }; if ( not forceReport && elapsed < maxfequency ) { return true; // skip report, continue per default } // compute value and check whether to report it if ( hasRange() ) { value_type newVal = _d->_val * 100 / ( _d->_max - _d->_min ); if ( elapsed > minfequency || newVal != _d->_last_val || forceReport ) { _d->_last_val = newVal; _d->_last_send = now; } else return true; // skip report, continue per default } else { if ( elapsed > minfequency || forceReport ) { _d->_last_val = _d->_val; _d->_last_send = now; } else return true; // skip report, continue per default } // now send report if ( _d->_state == INIT ) { _d->_state = RUN; DBG << str::form( "{#%u|%s} START", numericId(), name().c_str() ) << endl; } // XXX << str::form( "{#%u|%s}(%lld%s)", numericId(), name().c_str(), _d->_last_val, ( hasRange() ? "%" : "!" ) ) << endl; if ( _d->_receiver ) { if ( ! _d->_receiver( *this ) ) { if ( _d->_state != END ) { WAR << "User request to ABORT pending action. " << str::form( "{#%u|%s}(%lld%s)", numericId(), name().c_str(), _d->_last_val, ( hasRange() ? "%" : "!" ) ) << endl; } return false; // aborted by user } } if ( _d->_state == END ) { DBG << str::form( "{#%u|%s} END", numericId(), name().c_str() ) << endl; } return true; // continue per default } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ProgressData & obj ) { if ( obj.hasRange() ) { return str << str::form( "{%u|%s}[%lld,%lld](%lld)%lld%%)", obj.numericId(), obj.name().c_str(), obj.min(), obj.max(), obj.val(), obj.reportValue() ); } return str << str::form( "{%u|%s}[-,-](%lld)", obj.numericId(), obj.name().c_str(), obj.val() ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ ProgressData makeProgressData( const InputStream & input_r ) { ProgressData ret; ret.name( input_r.name() ); if ( input_r.size() > 0 ) ret.range( input_r.size() ); return ret; } CombinedProgressData::CombinedProgressData( ProgressData &pd, ProgressData::value_type weight ) : _weight(weight), _last_value(0), _pd(pd) { } bool CombinedProgressData::operator()( const ProgressData &progress ) { if ( progress.reportAlive() || _pd.reportAlive() || ( _weight == 0 ) ) return _pd.tick(); // factor [0,1] of increase in subtask ( ie: before 0,2 now 0.5 ) float increment = ((float)(progress.val() - _last_value))/(progress.max() - progress.min()); // how much the subtask affects the parent task ie: 0,1 float parent_factor = (float)(_weight)/(_pd.max() - _pd.min()); // real increment of the parent task float real_increment = parent_factor*increment; _last_value = progress.val(); return _pd.incr( (ProgressData::value_type)( (_pd.max()-_pd.min()) * real_increment) ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/ui/progressdata.h000066400000000000000000000304771476576476200206450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/ui/ProgressData * */ #ifndef ZYPP_CORE_UI_PROGRESSDATA_H #define ZYPP_CORE_UI_PROGRESSDATA_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ProgressData // /** Maintain [min,max] and counter (value) for progress counting. * * This class should provide everything the producer of progress data * needs. As a convention, a zero sizes range indicates that you are just * able to send 'still alive' triggers. * * The counter should be updated in reasonable intervals. Don't mind whether * the counter value actually increased or not. ProgressData will recognize * your triggers and knows when to actually send notification to a consumer. * * Each ProgressData object provides a unique numeric id and you may assign * it a name. * * \code * bool exampleReceiver( const ProgressData & ticks_r ) * { * DBG << "got ->" << ticks_r.reportValue() << " (" << ticks_r.val() << ")" << endl; * return( ticks_r.val() <= 100 ); // Abort if ( val > 100 ) * } * * class Example * { * public: * * Example( const ProgressData::ReceiverFnc & fnc_r = ProgressData::ReceiverFnc() ) * : _fnc( fnc_r ) * {} * * void SendTo( const ProgressData::ReceiverFnc & fnc_r ) * { _fnc = fnc_r; } * * public: * * void action() * { * ProgressData tics( 10 ); // Expect range 0 -> 10 * tics.name( "test ticks" ); // Some arbitrary name * tics.sendTo( _fnc ); // Send reports to _fnc * tics.toMin(); // start sending min (0) * * for ( int i = 0; i < 10; ++i ) * { * if ( ! tics.set( i ) ) * return; // user requested abort * } * * tics.toMax(); // take care 100% are reported on success * } * * void action2() * { * ProgressData tics; // Just send 'still alive' messages * tics.name( "test ticks" ); // Some arbitrary name * tics.sendTo( _fnc ); // Send reports to _fnc * tics.toMin(); // start sending min (0) * * for ( int i = 0; i < 10; ++i ) * { * if ( ! tics.set( i ) ) * return; // user requested abort * } * * tics.toMax(); // * } * * private: * ProgressData::ReceiverFnc _fnc; * }; * \endcode * \code * Example t( exampleReceiver ); * DBG << "Reporting %:" << endl; * t.action(); * DBG << "Reporting 'still alive':" << endl; * t.action2(); * \endcode * \code * Reporting %: * got ->0 (0) * got ->10 (1) * got ->20 (2) * got ->30 (3) * got ->40 (4) * got ->50 (5) * got ->60 (6) * got ->70 (7) * got ->80 (8) * got ->90 (9) * got ->100 (10) * got ->100 (10) * Reporting 'still alive': * got ->-1 (0) * got ->-1 (9) * \endcode * * The different ammount of triggers is due to different rules for sending * percent or 'still alive' messages. */ class ZYPP_API ProgressData : public base::ProvideNumericId { public: using value_type = long long; /** Most simple version of progress reporting * The percentage in most cases. Sometimes just keepalive. * \p sender ProgressData object who sends the progress info * \p */ using ReceiverFnc = function; private: enum State { INIT, RUN, END }; class Data { public: using TimePoint = std::chrono::steady_clock::time_point; Data( value_type min_r, value_type max_r, value_type val_r ) : _state( INIT ), _min( min_r ), _max( max_r ), _val( val_r ) , _last_val( 0 ) {} public: State _state; std::string _name; value_type _min; value_type _max; value_type _val; ReceiverFnc _receiver; value_type _last_val; TimePoint _last_send; private: /** clone for RWCOW_pointer */ friend Data * rwcowClone( const Data * rhs ); Data * clone() const { return new Data( *this ); } }; public: /** Ctor no range [0,0](0). */ ProgressData() : _d( new Data( 0, 0, 0 ) ) {} /** Ctor [0,max](0). */ ProgressData( value_type max_r ) : _d( new Data( 0, max_r, 0 ) ) {} /** Ctor [min,max](min). */ ProgressData( value_type min_r, value_type max_r ) : _d( new Data( min_r, max_r, min_r ) ) {} /** Ctor [min,max](val). */ ProgressData( value_type min_r, value_type max_r, value_type val_r ) : _d( new Data( min_r, max_r, val_r ) ) {} ~ProgressData() { if ( _d->_state == RUN ) { _d->_state = END; report(); } } public: /** Set new \c min value. */ void min( value_type min_r ) { _d->_min = min_r; } /** Set new \c max value. */ void max( value_type max_r ) { _d->_max = max_r; } /** Set no range [0,0]. */ void noRange() { range( 0, 0 ); } /** Set new [0,max]. */ void range( value_type max_r ) { range( 0, max_r ); } /** Set new [min,max]. */ void range( value_type min_r, value_type max_r ) { min( min_r ); max( max_r ); } public: /** Set counter name. */ void name( const std::string & name_r ) { _d->_name = name_r; } /** Set ReceiverFnc. */ void sendTo( const ReceiverFnc & fnc_r ) { _d->_receiver = fnc_r; } /** Set no ReceiverFnc. */ void noSend() { _d->_receiver = ReceiverFnc(); } public: /** \name Progress reporting. * * These methods may actually cause a progress report to be sent. * * All methods return \c bool, because a progress receiver may * return \c false to indicate the desire to abort the pending * action. The incident is logged, but it's finally up to the caller * to honor this. */ //@{ /** Set new counter \c value. */ bool set( value_type val_r ) { _d->_val = val_r; return report(); } /** Set range and counter from an other \ref ProgressData. */ bool set( const ProgressData & rhs ) { min( rhs.min() ); max( rhs.max() ); return set( rhs.val() ); } /** Increment counter \c value (default by 1). */ bool incr( value_type val_r = 1 ) { return set( val() + val_r ); } /** Decrement counter \c value (default by 1). */ bool decr( value_type val_r = 1 ) { return set( val() - val_r ); } /** Set counter value to current \c min value. */ bool toMin() { return set( min() ); } /** Set counter value to current \c max value (unless no range). */ bool toMax() { return hasRange() ? set( max() ) : tick(); } /** Leave counter value unchanged (still alive). */ bool tick() { return report(); } //@} public: /** \name Progress receiving. */ //@{ /** @return Current \c min value. */ value_type min() const { return _d->_min; } /** @return Current \c max value. */ value_type max() const { return _d->_max; } /** @return Current counter \c value. */ value_type val() const { return _d->_val; } /** @return Whether [min,max] defines a nonempty range. */ bool hasRange() const { return min() != max(); } /** @return Whether \ref reportValue will return a percent value. * Same as \ref hasRange. * \see \ref reportAlive */ bool reportPercent() const { return hasRange(); } /** @return Whether \ref reportValue always returns -1, because we * trigger 'still alive' messages. I.e. \ref hasrange is \c false. * \see \ref reportPercent */ bool reportAlive() const { return ! hasRange(); } /** @return Either a a percent value or -1. * \see \ref reportPercent and \ref reportAlive. */ value_type reportValue() const { return hasRange() ? val() * 100 / ( max() - min() ) : -1; } /** @return The counters name. */ const std::string & name() const { return _d->_name; } /** @return The ReceiverFnc. */ const ReceiverFnc & receiver() const { return _d->_receiver; } /** @return Return \c true if this is the final report sent by the * ProgressData dtor. */ bool finalReport() const { return( _d->_state == END ); } //@} private: /** Send report if necessary. */ bool report(); /** Pointer to data. */ RWCOW_pointer _d; }; /////////////////////////////////////////////////////////////////// /** \relates ProgressData Stream output */ std::ostream & operator<<( std::ostream & str, const ProgressData & obj ); /////////////////////////////////////////////////////////////////// class InputStream; /** \relates ProgressData Setup from \ref InputStream. */ ProgressData makeProgressData( const InputStream & input_r ); /////////////////////////////////////////////////////////////////// /** * \short Progress callback from another progress * * This class allows you to pass a progress callback to a * subtask based on a current progress data, plus a weight * value. Every progress reported by the subtask via * this callback will be forwarded to the main progress * data, with the corresponding weight. * * Example: * * \code * * // receiver for main task * void task_receiver( ProgressData &progress ); * * // subtask prototypes * void do_subtask_one( ProgressData::ReceiverFnc &fnc ); * void do_subtask_two( ProgressData::ReceiverFnc &fnc ); * * // main task * ProgressData progress; * //progress for subtask 1 * // which is 80% * CombinedProgressData sub1(pd, 80); * // the second is only 20% * CombinedProgressData sub2(pd, 20); * do_subtask_one( sub1 ); * do_subtask_two( sub2 ); * * \endcode */ class ZYPP_API CombinedProgressData { public: /** * \short Ctor * * Creates a \ref ProgressData::ReceiverFnc * from a \ref ProgressData object * * \param pd \ref ProgressData object * \param weight Weight of the subtask * relative to the main task range. * * If weight is 0, or \param pd only reports * keepalives. then only ticks are sent. * */ CombinedProgressData( ProgressData &pd, ProgressData::value_type weight = 0 ); /** * Implements the \ref ProgressData::ReceiverFnc * callback interface */ bool operator()( const ProgressData &progress ); private: ProgressData::value_type _weight; ProgressData::value_type _last_value; ProgressData &_pd; }; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CORE_UI_PROGRESSDATA_H libzypp-17.36.5/zypp-core/url/000077500000000000000000000000001476576476200161505ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/url/UrlBase.cc000066400000000000000000001174441476576476200200270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/url/UrlBase.cc */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include // in the Estonian locale, a-z excludes t, for example. #302525 // http://en.wikipedia.org/wiki/Estonian_alphabet #define a_zA_Z "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" // --------------------------------------------------------------- /* ** authority = //[user [:password] @ ] host [:port] ** ** host = hostname | IPv4 | "[" IPv6-IP "]" | "[v...]" */ #define RX_VALID_SCHEME "^[" a_zA_Z "][" a_zA_Z "0-9\\.+-]*$" #define RX_VALID_PORT "^[0-9]{1,5}$" #define RX_VALID_HOSTNAME "^[[:alnum:]${_}]+([\\.-][[:alnum:]${_}]+)*$" #define RX_VALID_HOSTIPV4 \ "^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$" #define RX_VALID_HOSTIPV6 \ "^\\[[:a-fA-F0-9]+(:[0-9]{1,3}(\\.[0-9]{1,3}){3})?\\]$" ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace url { ////////////////////////////////////////////////////////////////// // --------------------------------------------------------------- /* ** URL asString() view option constants: */ const ViewOption ViewOption::WITH_SCHEME = 0x0001; const ViewOption ViewOption::WITH_USERNAME = 0x0002; const ViewOption ViewOption::WITH_PASSWORD = 0x0004; const ViewOption ViewOption::WITH_HOST = 0x0008; const ViewOption ViewOption::WITH_PORT = 0x0010; const ViewOption ViewOption::WITH_PATH_NAME = 0x0020; const ViewOption ViewOption::WITH_PATH_PARAMS = 0x0040; const ViewOption ViewOption::WITH_QUERY_STR = 0x0080; const ViewOption ViewOption::WITH_FRAGMENT = 0x0100; const ViewOption ViewOption::EMPTY_AUTHORITY = 0x0200; const ViewOption ViewOption::EMPTY_PATH_NAME = 0x0400; const ViewOption ViewOption::EMPTY_PATH_PARAMS = 0x0800; const ViewOption ViewOption::EMPTY_QUERY_STR = 0x1000; const ViewOption ViewOption::EMPTY_FRAGMENT = 0x2000; const ViewOption ViewOption::DEFAULTS = 0x07bb; const ViewOption ViewOption::hotfix1050625 = 0x8000; /* const ViewOption ViewOption::DEFAULTS = ViewOption::WITH_SCHEME + ViewOption::WITH_USERNAME + ViewOption::WITH_HOST + ViewOption::WITH_PORT + ViewOption::WITH_PATH_NAME + ViewOption::WITH_QUERY_STR + ViewOption::WITH_FRAGMENT + ViewOption::EMPTY_AUTHORITY + ViewOption::EMPTY_PATH_NAME; */ // --------------------------------------------------------------- ViewOption::ViewOption() : opt(0x07bb) {} // --------------------------------------------------------------- ViewOption::ViewOption(int option) : opt(option) {} // --------------------------------------------------------------- /* ** Behaviour configuration variables. */ using UrlConfig = std::map; // --------------------------------------------------------------- /// \brief Hide passwords embedded in a querystr, /// /// Stores the full querystring and maintains a safe version with /// password field stripped. Url::asString will print the passwords /// on demand only. /// /// \see bsc#1050625: VUL-1: CVE-2017-9271: zypper: proxy credentials written to log files class SafeQuerystr { public: SafeQuerystr() {} SafeQuerystr( std::string rhs ) { _assign( std::move(rhs) ); } SafeQuerystr & operator=( std::string rhs ) { _assign( std::move(rhs) ); return *this; } operator const std::string &() const { return str(); } const std::string & str() const { return fullStr(); } const std::string & str( const ViewOptions & viewopts_r ) const { return (viewopts_r.has( ViewOptions::WITH_PASSWORD ) || viewopts_r.has( ViewOptions::hotfix1050625 )) ? fullStr() : safeStr(); } const std::string & fullStr() const { return _fullQuerytsr; } const std::string & safeStr() const { return _safeQuerytsr ? _safeQuerytsr.value() : _fullQuerytsr; } private: void _assign( std::string && rhs ) { _fullQuerytsr = std::move(rhs); static constexpr std::string_view tag { "proxypass=" }; if ( _fullQuerytsr.find( tag ) != std::string::npos ) { std::string safe; strv::split( _fullQuerytsr, "&", [&safe]( std::string_view val ) { if ( val.substr( 0, tag.size() ) != tag ) { if ( ! safe.empty() ) safe += "&"; safe += val; } }); _safeQuerytsr = std::move(safe); } else _safeQuerytsr = std::nullopt; } private: std::string _fullQuerytsr; ///< std::optional _safeQuerytsr; ///<. }; /** * \brief Internal data used by UrlBase. */ class UrlBaseData { public: UrlBaseData() {} UrlBaseData(UrlConfig conf) : config(std::move(conf)) {} UrlConfig config; ViewOptions vopts; std::string scheme; std::string user; std::string pass; std::string host; std::string port; std::string pathname; std::string pathparams; SafeQuerystr querystr; std::string fragment; }; // --------------------------------------------------------------- /* ** Anonymous/internal utility namespace: */ namespace // anonymous { // ------------------------------------------------------------- inline void checkUrlData(const std::string &data, const std::string &name, const std::string ®x, bool show=true) { if( regx.empty() || regx == "^$") { ZYPP_THROW(UrlNotAllowedException( str::form(_("Url scheme does not allow a %s"), name.c_str()) )); } else { bool valid = false; try { str::regex rex(regx); valid = str::regex_match(data, rex); } catch( ... ) {} if( !valid) { if( show) { ZYPP_THROW(UrlBadComponentException( str::form(_("Invalid %s component '%s'"), name.c_str(), data.c_str()) )); } else { ZYPP_THROW(UrlBadComponentException( str::form(_("Invalid %s component"), name.c_str()) )); } } } } } // namespace // --------------------------------------------------------------- UrlBase::~UrlBase() { delete m_data; m_data = NULL; } // --------------------------------------------------------------- UrlBase::UrlBase() : m_data( new UrlBaseData()) { configure(); } // --------------------------------------------------------------- UrlBase::UrlBase(const UrlBase &url) : m_data( new UrlBaseData( *(url.m_data))) { } // --------------------------------------------------------------- UrlBase::UrlBase(const std::string &scheme, const std::string &authority, const std::string &pathdata, const std::string &querystr, const std::string &fragment) : m_data( new UrlBaseData()) { configure(); init(scheme, authority, pathdata, querystr, fragment); } // --------------------------------------------------------------- void UrlBase::init(const std::string &scheme, const std::string &authority, const std::string &pathdata, const std::string &querystr, const std::string &fragment) { if ( scheme.empty() && *pathdata.c_str() == '/' ) setScheme("file"); else setScheme(scheme); setAuthority(authority); setPathData(pathdata); setQueryString(querystr); setFragment(fragment, zypp::url::E_ENCODED); } // --------------------------------------------------------------- void UrlBase::configure() { config("sep_pathparams", ";"); config("psep_pathparam", ","); config("vsep_pathparam", "="); config("psep_querystr", "&"); config("vsep_querystr", "="); config("safe_username", "~!$&'()*+=,;"); config("safe_password", "~!$&'()*+=,:;"); config("safe_hostname", "[:]${_}"); config("safe_pathname", "~!$&'()*+=,:@/"); config("safe_pathparams", "~!$&'()*+=,:;@/"); config("safe_querystr", "~!$&'()*+=,:;@/?"); config("safe_fragment", "~!$&'()*+=,:;@/?"); // y=yes (allowed) // n=no (disallowed, exception if !empty) config("with_authority", "y"); config("with_port", "y"); // y=yes (required but don't throw if empty) // n=no (not required, ignore if empty) // m=mandatory (exception if empty) config("require_host", "n"); config("require_pathname","n"); // y=yes (encode 2. slash even if authority present) // n=no (don't encode 2. slash if authority present) config("path_encode_slash2", "n"); config("rx_username", "^([" a_zA_Z "0-9!$&'\\(\\)*+=,;~\\._-]|%[a-fA-F0-9]{2})+$"); config("rx_password", "^([" a_zA_Z "0-9!$&'\\(\\)*+=,:;~\\._-]|%[a-fA-F0-9]{2})+$"); config("rx_pathname", "^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:@/~\\._-]|%[a-fA-F0-9]{2})+$"); config("rx_pathparams", "^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/~\\._-]|%[a-fA-F0-9]{2})+$"); config("rx_querystr", "^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/?~\\._-]|%[a-fA-F0-9]{2})+$"); config("rx_fragment", "^([" a_zA_Z "0-9!$&'\\(\\){}*+=,:;@/?~\\._-]|%[a-fA-F0-9]{2})+$"); } // --------------------------------------------------------------- void UrlBase::config(const std::string &opt, const std::string &val) { m_data->config[opt] = val; } // --------------------------------------------------------------- std::string UrlBase::config(const std::string &opt) const { UrlConfig::const_iterator v( m_data->config.find(opt)); if( v != m_data->config.end()) return v->second; else return std::string(); } // --------------------------------------------------------------- ViewOptions UrlBase::getViewOptions() const { return m_data->vopts; } // --------------------------------------------------------------- void UrlBase::setViewOptions(const ViewOptions &vopts) { m_data->vopts = vopts; } // --------------------------------------------------------------- void UrlBase::clear() { zypp::url::UrlConfig config(m_data->config); zypp::url::ViewOptions vopts(m_data->vopts); *m_data = UrlBaseData(); m_data->config = config; m_data->vopts = vopts; } // --------------------------------------------------------------- UrlBase * UrlBase::clone() const { return new UrlBase(*this); } // --------------------------------------------------------------- zypp::url::UrlSchemes UrlBase::getKnownSchemes() const { return UrlSchemes(); } // --------------------------------------------------------------- bool UrlBase::isKnownScheme(const std::string &scheme) const { std::string lscheme( str::toLower(scheme)); UrlSchemes schemes( getKnownSchemes()); UrlSchemes::const_iterator s; for(s=schemes.begin(); s!=schemes.end(); ++s) { if( lscheme == str::toLower(*s)) return true; } return false; } // --------------------------------------------------------------- bool UrlBase::isValidScheme(const std::string &scheme) const { bool valid = false; try { str::regex rex(RX_VALID_SCHEME); valid = str::regex_match(scheme, rex); } catch( ... ) {} if(valid) { std::string lscheme( str::toLower(scheme)); UrlSchemes schemes( getKnownSchemes()); if( schemes.empty()) return true; UrlSchemes::const_iterator s; for(s=schemes.begin(); s!=schemes.end(); ++s) { if( lscheme == str::toLower(*s)) return true; } } return false; } // --------------------------------------------------------------- bool UrlBase::isValid() const { /* ** scheme is the only mandatory component ** for all url's and is already verified, ** (except for empty Url instances), so ** Url with empty scheme is never valid. */ if( getScheme().empty()) return false; std::string host( getHost(zypp::url::E_ENCODED)); if( host.empty() && config("require_host") != "n") return false; std::string path( getPathName(zypp::url::E_ENCODED)); if( path.empty() && config("require_pathname") != "n") return false; /* ** path has to begin with "/" if authority avaliable ** if host is set after the pathname, we can't throw */ if( !host.empty() && !path.empty() && path.at(0) != '/') return false; return true; } // --------------------------------------------------------------- std::string UrlBase::asString() const { return asString(getViewOptions()); } std::string UrlBase::asString1050625() const { // Temp. fix to keep the proxypass in the query when writing the .repo files, // but otherwise hiding it, when WITH_PASSWORD is not set. return asString(getViewOptions()+ViewOptions::hotfix1050625); } // --------------------------------------------------------------- std::string UrlBase::asString(const zypp::url::ViewOptions &opts) const { std::string url; UrlBaseData tmp; if( opts.has(ViewOptions::WITH_SCHEME)) { tmp.scheme = getScheme(); if( !tmp.scheme.empty()) { url += tmp.scheme + ":"; if( opts.has(ViewOptions::WITH_HOST)) { tmp.host = getHost(zypp::url::E_ENCODED); if( !tmp.host.empty()) { url += "//"; if( opts.has(ViewOptions::WITH_USERNAME)) { tmp.user = getUsername(zypp::url::E_ENCODED); if( !tmp.user.empty()) { url += tmp.user; if( opts.has(ViewOptions::WITH_PASSWORD)) { tmp.pass = getPassword(zypp::url::E_ENCODED); if( !tmp.pass.empty()) { url += ":" + tmp.pass; } } url += "@"; } } url += tmp.host; if( opts.has(ViewOptions::WITH_PORT)) { tmp.port = getPort(); if( !tmp.port.empty()) { url += ":" + tmp.port; } } } else if( opts.has(ViewOptions::EMPTY_AUTHORITY)) { url += "//"; } } else if( opts.has(ViewOptions::EMPTY_AUTHORITY)) { url += "//"; } } } if( opts.has(ViewOptions::WITH_PATH_NAME)) { tmp.pathname = getPathName(zypp::url::E_ENCODED); if( !tmp.pathname.empty()) { if(url.find('/') != std::string::npos) { // Url contains authority (that may be empty), // we may need a rewrite of the encoded path. tmp.pathname = cleanupPathName(tmp.pathname, true); if(tmp.pathname.at(0) != '/') { url += "/"; } } url += tmp.pathname; if( opts.has(ViewOptions::WITH_PATH_PARAMS)) { tmp.pathparams = getPathParams(); if( !tmp.pathparams.empty()) { url += ";" + tmp.pathparams; } else if( opts.has(ViewOptions::EMPTY_PATH_PARAMS)) { url += ";"; } } } else if( opts.has(ViewOptions::EMPTY_PATH_NAME) && url.find('/') != std::string::npos) { url += "/"; if( opts.has(ViewOptions::EMPTY_PATH_PARAMS)) { url += ";"; } } } if( opts.has(ViewOptions::WITH_QUERY_STR)) { const std::string & querystr { getQueryString( opts ) }; // full or safe depending on opts if( !querystr.empty() ) { url += "?" + querystr; } else if( opts.has(ViewOptions::EMPTY_QUERY_STR)) { url += "?"; } } if( opts.has(ViewOptions::WITH_FRAGMENT)) { tmp.fragment = getFragment(zypp::url::E_ENCODED); if( !tmp.fragment.empty()) { url += "#" + tmp.fragment; } else if( opts.has(ViewOptions::EMPTY_FRAGMENT)) { url += "#"; } } return url; } // --------------------------------------------------------------- std::string UrlBase::getScheme() const { return m_data->scheme; } // --------------------------------------------------------------- std::string UrlBase::getAuthority() const { std::string str; if( !getHost(zypp::url::E_ENCODED).empty()) { if( !getUsername(zypp::url::E_ENCODED).empty()) { str = getUsername(zypp::url::E_ENCODED); if( !getPassword(zypp::url::E_ENCODED).empty()) { str += ":" + getPassword(zypp::url::E_ENCODED); } str += "@"; } str += getHost(zypp::url::E_ENCODED); if( !getPort().empty()) { str += ":" + getPort(); } } return str; } // --------------------------------------------------------------- std::string UrlBase::getPathData() const { return getPathName(zypp::url::E_ENCODED) + config("sep_pathparams") + getPathParams(); } // --------------------------------------------------------------- std::string UrlBase::getQueryString() const { return m_data->querystr; } std::string UrlBase::getQueryString( const ViewOptions & viewopts_r ) const { return m_data->querystr.str( viewopts_r ); } // --------------------------------------------------------------- std::string UrlBase::getFragment(EEncoding eflag) const { if(eflag == zypp::url::E_DECODED) return zypp::url::decode(m_data->fragment); else return m_data->fragment; } // --------------------------------------------------------------- std::string UrlBase::getUsername(EEncoding eflag) const { if(eflag == zypp::url::E_DECODED) return zypp::url::decode(m_data->user); else return m_data->user; } // --------------------------------------------------------------- std::string UrlBase::getPassword(EEncoding eflag) const { if(eflag == zypp::url::E_DECODED) return zypp::url::decode(m_data->pass); else return m_data->pass; } // --------------------------------------------------------------- std::string UrlBase::getHost(EEncoding eflag) const { if(eflag == zypp::url::E_DECODED) return zypp::url::decode(m_data->host); else return m_data->host; } // --------------------------------------------------------------- std::string UrlBase::getPort() const { return m_data->port; } // --------------------------------------------------------------- std::string UrlBase::getPathName(EEncoding eflag) const { if(eflag == zypp::url::E_DECODED) return zypp::url::decode(m_data->pathname); else return cleanupPathName(m_data->pathname); } // --------------------------------------------------------------- std::string UrlBase::getPathParams() const { return m_data->pathparams; } // --------------------------------------------------------------- zypp::url::ParamVec UrlBase::getPathParamsVec() const { zypp::url::ParamVec pvec; if( config("psep_pathparam").empty()) { pvec.push_back(getPathParams()); } else { zypp::url::split( pvec, getPathParams(), config("psep_pathparam") ); } return pvec; } // --------------------------------------------------------------- zypp::url::ParamMap UrlBase::getPathParamsMap(EEncoding eflag) const { if( config("psep_pathparam").empty() || config("vsep_pathparam").empty()) { ZYPP_THROW(UrlNotSupportedException( "Path parameter parsing not supported for this URL" )); } zypp::url::ParamMap pmap; zypp::url::split( pmap, getPathParams(), config("psep_pathparam"), config("vsep_pathparam"), eflag ); return pmap; } // --------------------------------------------------------------- std::string UrlBase::getPathParam(const std::string ¶m, EEncoding eflag) const { zypp::url::ParamMap pmap( getPathParamsMap( eflag)); zypp::url::ParamMap::const_iterator i( pmap.find(param)); return i != pmap.end() ? i->second : std::string(); } // --------------------------------------------------------------- zypp::url::ParamVec UrlBase::getQueryStringVec() const { zypp::url::ParamVec pvec; if( config("psep_querystr").empty()) { pvec.push_back(getQueryString()); } else { zypp::url::split( pvec, getQueryString(), config("psep_querystr") ); } return pvec; } // --------------------------------------------------------------- zypp::url::ParamMap UrlBase::getQueryStringMap(EEncoding eflag) const { if( config("psep_querystr").empty() || config("vsep_querystr").empty()) { ZYPP_THROW(UrlNotSupportedException( _("Query string parsing not supported for this URL") )); } zypp::url::ParamMap pmap; zypp::url::split( pmap, getQueryString(), config("psep_querystr"), config("vsep_querystr"), eflag ); return pmap; } // --------------------------------------------------------------- std::string UrlBase::getQueryParam(const std::string ¶m, EEncoding eflag) const { zypp::url::ParamMap pmap( getQueryStringMap( eflag)); zypp::url::ParamMap::const_iterator i( pmap.find(param)); return i != pmap.end() ? i->second : std::string(); } // --------------------------------------------------------------- void UrlBase::setScheme(const std::string &scheme) { if( isValidScheme(scheme)) { m_data->scheme = str::toLower(scheme); } else if( scheme.empty()) { ZYPP_THROW(UrlBadComponentException( _("Url scheme is a required component") )); } else { ZYPP_THROW(UrlBadComponentException( str::form(_("Invalid Url scheme '%s'"), scheme.c_str()) )); } } // --------------------------------------------------------------- void UrlBase::setAuthority(const std::string &authority) { std::string s = authority; std::string::size_type p = 0,q = 0; if ((p=s.find('@')) != std::string::npos) { q = s.find(':'); if (q != std::string::npos && q < p) { setUsername(s.substr(0, q), zypp::url::E_ENCODED); setPassword(s.substr(q+1, p-q-1), zypp::url::E_ENCODED); } else setUsername(s.substr(0, p), zypp::url::E_ENCODED); s = s.substr(p+1); } if ((p = s.rfind(':')) != std::string::npos && ( (q = s.rfind(']')) == std::string::npos || q < p) ) { setHost(s.substr(0, p)); setPort(s.substr(p+1)); } else setHost(s); } // --------------------------------------------------------------- void UrlBase::setPathData(const std::string &pathdata) { size_t pos = std::string::npos; std::string sep(config("sep_pathparams")); if( !sep.empty()) pos = pathdata.find(sep); if( pos != std::string::npos) { setPathName(pathdata.substr(0, pos), zypp::url::E_ENCODED); setPathParams(pathdata.substr(pos + 1)); } else { setPathName(pathdata, zypp::url::E_ENCODED); setPathParams(""); } } // --------------------------------------------------------------- void UrlBase::setQueryString(const std::string &querystr) { if( querystr.empty()) { m_data->querystr = querystr; } else { checkUrlData(querystr, "query string", config("rx_querystr")); m_data->querystr = querystr; } } // --------------------------------------------------------------- void UrlBase::setFragment(const std::string &fragment, EEncoding eflag) { if( fragment.empty()) { m_data->fragment = fragment; } else { if(eflag == zypp::url::E_ENCODED) { checkUrlData(fragment, "fragment", config("rx_fragment")); m_data->fragment = fragment; } else { m_data->fragment = zypp::url::encode( fragment, config("safe_fragment") ); } } } // --------------------------------------------------------------- void UrlBase::setUsername(const std::string &user, EEncoding eflag) { if( user.empty()) { m_data->user = user; } else { if( config("with_authority") != "y") { ZYPP_THROW(UrlNotAllowedException( _("Url scheme does not allow a username") )); } if(eflag == zypp::url::E_ENCODED) { checkUrlData(user, "username", config("rx_username")); m_data->user = user; } else { m_data->user = zypp::url::encode( user, config("safe_username") ); } } } // --------------------------------------------------------------- void UrlBase::setPassword(const std::string &pass, EEncoding eflag) { if( pass.empty()) { m_data->pass = pass; } else { if( config("with_authority") != "y") { ZYPP_THROW(UrlNotAllowedException( _("Url scheme does not allow a password") )); } if(eflag == zypp::url::E_ENCODED) { checkUrlData(pass, "password", config("rx_password"), false); m_data->pass = pass; } else { m_data->pass = zypp::url::encode( pass, config("safe_password") ); } } } // --------------------------------------------------------------- void UrlBase::setHost(const std::string &host) { if( host.empty()) { if(config("require_host") == "m") { ZYPP_THROW(UrlNotAllowedException( _("Url scheme requires a host component") )); } m_data->host = host; } else { if( config("with_authority") != "y") { ZYPP_THROW(UrlNotAllowedException( _("Url scheme does not allow a host component") )); } if( isValidHost(host)) { std::string temp; // always decode in case isValidHost() // is reimplemented and supports also // the [v ... ] notation. if( host.at(0) == '[') { temp = str::toUpper(zypp::url::decode(host)); } else { temp = str::toLower(zypp::url::decode(host)); } m_data->host = zypp::url::encode( temp, config("safe_hostname") ); } else { ZYPP_THROW(UrlBadComponentException( str::form(_("Invalid host component '%s'"), host.c_str()) )); } } } // --------------------------------------------------------------- void UrlBase::setPort(const std::string &port) { if( port.empty()) { m_data->port = port; } else { if( config("with_authority") != "y" || config("with_port") != "y") { ZYPP_THROW(UrlNotAllowedException( _("Url scheme does not allow a port") )); } if( isValidPort(port)) { m_data->port = port; } else { ZYPP_THROW(UrlBadComponentException( str::form(_("Invalid port component '%s'"), port.c_str()) )); } } } // --------------------------------------------------------------- void UrlBase::setPathName(const std::string &path, EEncoding eflag) { if( path.empty()) { if(config("require_pathname") == "m") { ZYPP_THROW(UrlNotAllowedException( _("Url scheme requires path name") )); } m_data->pathname = path; } else { if(eflag == zypp::url::E_ENCODED) { checkUrlData(path, "path name", config("rx_pathname")); if( !getHost(zypp::url::E_ENCODED).empty()) { // has to begin with a "/". For consistency with // setPathName while the host is empty, we allow // it in encoded ("%2f") form - cleanupPathName() // will fix / decode the first slash if needed. if(!(path.at(0) == '/' || (path.size() >= 3 && str::toLower(path.substr(0, 3)) == "%2f"))) { ZYPP_THROW(UrlNotAllowedException( _("Relative path not allowed if authority exists") )); } } m_data->pathname = cleanupPathName(path); } else // zypp::url::E_DECODED { if( !getHost(zypp::url::E_ENCODED).empty()) { if(path.at(0) != '/') { ZYPP_THROW(UrlNotAllowedException( _("Relative path not allowed if authority exists") )); } } m_data->pathname = cleanupPathName( zypp::url::encode( path, config("safe_pathname") ) ); } } } // --------------------------------------------------------------- void UrlBase::setPathParams(const std::string ¶ms) { if( params.empty()) { m_data->pathparams = params; } else { checkUrlData(params, "path parameters", config("rx_pathparams")); m_data->pathparams = params; } } // --------------------------------------------------------------- void UrlBase::setPathParamsVec(const zypp::url::ParamVec &pvec) { setPathParams( zypp::url::join( pvec, config("psep_pathparam") ) ); } // --------------------------------------------------------------- void UrlBase::setPathParamsMap(const zypp::url::ParamMap &pmap) { if( config("psep_pathparam").empty() || config("vsep_pathparam").empty()) { ZYPP_THROW(UrlNotSupportedException( "Path Parameter parsing not supported for this URL" )); } setPathParams( zypp::url::join( pmap, config("psep_pathparam"), config("vsep_pathparam"), config("safe_pathparams"), url::E_DECODED ) ); } // --------------------------------------------------------------- void UrlBase::setPathParam(const std::string ¶m, const std::string &value) { zypp::url::ParamMap pmap( getPathParamsMap(zypp::url::E_DECODED)); pmap[param] = value; setPathParamsMap(pmap); } // --------------------------------------------------------------- void UrlBase::setQueryStringVec(const zypp::url::ParamVec &pvec) { setQueryString( zypp::url::join( pvec, config("psep_querystr") ) ); } // --------------------------------------------------------------- void UrlBase::setQueryStringMap(const zypp::url::ParamMap &pmap, EEncoding eflag) { if( config("psep_querystr").empty() || config("vsep_querystr").empty()) { ZYPP_THROW(UrlNotSupportedException( _("Query string parsing not supported for this URL") )); } setQueryString( zypp::url::join( pmap, config("psep_querystr"), config("vsep_querystr"), config("safe_querystr"), eflag ) ); } // --------------------------------------------------------------- void UrlBase::setQueryParam(const std::string ¶m, const std::string &value) { zypp::url::ParamMap pmap( getQueryStringMap(zypp::url::E_ENCODED)); std::string newval = url::join( ParamMap{ {param,value} }, config("psep_querystr"), config("vsep_querystr"), config("safe_querystr"), url::E_DECODED ); zypp::url::ParamMap newmap; url::split( newmap, newval, config("psep_querystr"), config("vsep_querystr"), url::E_ENCODED ); pmap[newmap.begin()->first] = newmap.begin()->second; setQueryStringMap(pmap, url::E_ENCODED); } // --------------------------------------------------------------- void UrlBase::delQueryParam(const std::string ¶m) { bool dirty = false; zypp::url::ParamMap pmap( getQueryStringMap(zypp::url::E_ENCODED)); for ( auto it = pmap.begin(), last = pmap.end(); it != last; ) { if ( url::decode( it->first ) == param ) { it = pmap.erase( it ); dirty = true; } else ++it; } if ( dirty ) setQueryStringMap(pmap, url::E_ENCODED); } void UrlBase::delQueryParams(const std::set ¶ms) { bool dirty = false; zypp::url::ParamMap pmap( getQueryStringMap(zypp::url::E_ENCODED)); for ( auto it = pmap.begin(), last = pmap.end(); it != last; ) { if ( params.count( url::decode( it->first ) ) ) { it = pmap.erase( it ); dirty = true; } else ++it; } if ( dirty ) setQueryStringMap(pmap, url::E_ENCODED); } // --------------------------------------------------------------- std::string UrlBase::cleanupPathName(const std::string &path) const { bool authority = !getHost(zypp::url::E_ENCODED).empty(); return cleanupPathName(path, authority); } // --------------------------------------------------------------- std::string UrlBase::cleanupPathName(const std::string &path, bool authority) const { std::string copy( path); // decode the first slash if it is encoded ... if(copy.size() >= 3 && copy.at(0) != '/' && str::toLower(copy.substr(0, 3)) == "%2f") { copy.replace(0, 3, "/"); } // if path begins with a double slash ("//"); encode the second // slash [minimal and IMO sufficient] before the first path // segment, to fulfill the path-absolute rule of RFC 3986 // disallowing a "//" if no authority is present. if( authority) { // // rewrite of "//" to "/%2f" not required, use config // if(config("path_encode_slash2") == "y") { // rewrite "//" ==> "/%2f" if(copy.size() >= 2 && copy.at(0) == '/' && copy.at(1) == '/') { copy.replace(1, 1, "%2F"); } } else { // rewrite "/%2f" ==> "//" if(copy.size() >= 4 && copy.at(0) == '/' && str::toLower(copy.substr(1, 4)) == "%2f") { copy.replace(1, 4, "/"); } } } else { // rewrite of "//" to "/%2f" is required (no authority) if(copy.size() >= 2 && copy.at(0) == '/' && copy.at(1) == '/') { copy.replace(1, 1, "%2F"); } } return copy; } // --------------------------------------------------------------- bool UrlBase::isValidHost(const std::string &host) const { try { str::regex regx(RX_VALID_HOSTIPV6); if( str::regex_match(host, regx)) { struct in6_addr ip; std::string temp( host.substr(1, host.size()-2)); return inet_pton(AF_INET6, temp.c_str(), &ip) > 0; } else { // matches also IPv4 dotted-decimal adresses... std::string temp( zypp::url::decode(host)); str::regex regx(RX_VALID_HOSTNAME); return str::regex_match(temp, regx); } } catch( ... ) {} return false; } // --------------------------------------------------------------- bool UrlBase::isValidPort(const std::string &port) const { try { str::regex regx(RX_VALID_PORT); if( str::regex_match(port, regx)) { long pnum = str::strtonum(port); return ( pnum >= 1 && pnum <= USHRT_MAX); } } catch( ... ) {} return false; } ////////////////////////////////////////////////////////////////// } // namespace url //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp-core/url/UrlBase.h000066400000000000000000001130131476576476200176550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/url/UrlBase.h */ #ifndef ZYPP_URL_URLBASE_H #define ZYPP_URL_URLBASE_H #include #include #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace url { ////////////////////////////////////////////////////////////////// // --------------------------------------------------------------- /** * Url::asString() view options. * * A instance of this class represents a bit-wise combination * of view option constants. * * It provides ViewOption::operator+() and ViewOption::operator-() * to modify a view option combination and a ViewOption::has() * method, to check if a specified option is enabled or not. */ struct ZYPP_API ViewOption { /** @{ */ /** * Option to include scheme name in the URL string. * * Disabling this option causes, that the URL string * contains the path, query and fragment components * only, for example just "/foo/bar.txt". * * This option is \b enabled by default. */ static const ViewOption WITH_SCHEME ZYPP_API; /** * Option to include username in the URL string. * * This option depends on a enabled WITH_SCHEME and * WITH_HOST options and is \b enabled by default. */ static const ViewOption WITH_USERNAME ZYPP_API; /** * Option to include password in the URL string. * * This option depends on a enabled WITH_SCHEME, * WITH_HOST and WITH_USERNAME options and is * \b disabled by default, causing to hide the * password in the URL authority. */ static const ViewOption WITH_PASSWORD ZYPP_API; /** * Option to include hostname in the URL string. * * This option depends on a enabled WITH_SCHEME * option and is \b enabled by default. */ static const ViewOption WITH_HOST ZYPP_API; /** * Option to include port number in the URL string. * * This option depends on a enabled WITH_SCHEME and * WITH_HOST options and is \b enabled by default. */ static const ViewOption WITH_PORT ZYPP_API; /** * Option to include path name in the URL string. * * This option is \b enabled by default. */ static const ViewOption WITH_PATH_NAME ZYPP_API; /** * Option to include path parameters in the URL string. * * This option depends on a enabled WITH_PATH_NAME * option and is \b disabled by default, causing to * hide the path parameters. */ static const ViewOption WITH_PATH_PARAMS ZYPP_API; /** * Option to include query string in the URL string. * * This option is \b enabled by default. */ static const ViewOption WITH_QUERY_STR ZYPP_API; /** * Option to include fragment string in the URL string. * * This option is \b enabled by default. */ static const ViewOption WITH_FRAGMENT ZYPP_API; /** @} */ /** @{ */ /** * Explicitely include the URL authority separator "//". * * It causes, that the URL string includes an empty URL * authority, for example: * "file:///foo.txt" instead of just "file:/foo.txt". * * This option depends on a enabled WITH_SCHEME view * option and is enabled by default. */ static const ViewOption EMPTY_AUTHORITY ZYPP_API; /** * Explicitely include the "/" path character. * * It causes, that a "/" is added to the Url if the path * name is empty, for example: * * "http://localhost/" instead of just "http://localhost". * * This option depends on a enabled WITH_PATH_NAME view * option and is enabled by default. */ static const ViewOption EMPTY_PATH_NAME ZYPP_API; /** * Explicitely include the path parameters separator ";". * * It causes, that the URL allways contains the ";" path * parameters separator. * * This option depends on a enabled EMPTY_PATH_NAME view * option and is disabled by default. */ static const ViewOption EMPTY_PATH_PARAMS ZYPP_API; /** * Explicitely include the query string separator "?". * * It causes, that if the query string is requested using * the WITH_QUERY_STR option, the URL allways contains the * "?" query string separator, even if the query string is * empty. * This option depends on a enabled WITH_QUERY_STR view * option and is disabled by default. */ static const ViewOption EMPTY_QUERY_STR ZYPP_API; /** * Explicitely include the fragment string separator "#". * * It causes, that if the fragment string is requested using * the WITH_FRAGMENT option, the URL allways contains the "#" * fragment string separator, even if the fragment string is * empty. * This option depends on a enabled WITH_FRAGMENT view * option and is disabled by default. */ static const ViewOption EMPTY_FRAGMENT ZYPP_API; /** @} */ /** @{ */ /** * Default combination of view options. * * By default, following view options are enabled: * WITH_SCHEME, WITH_USERNAME, WITH_HOST, * WITH_PORT, WITH_PATH_NAME, WITH_QUERY_STR, * WITH_FRAGMENT, EMPTY_AUTHORITY, EMPTY_PATH_NAME. */ static const ViewOption DEFAULTS ZYPP_API; /** @} */ /** * Create instance with default combination of view options. */ ViewOption(); /** * Adds \p l and \p r to a new option combination. * * @return The new option combination. */ friend inline ViewOption operator + (const ViewOption &l, const ViewOption &r) { return ViewOption(l.opt | r.opt); } /** * Substract \p r from \p l to a new option combination. * * @return The new option combination. */ friend inline ViewOption operator - (const ViewOption &l, const ViewOption &r) { return ViewOption(l.opt & ~r.opt); } /** * Assign specified option combination \p o to the current object. * * \param o The option or option combination to make a copy of. * \return A reference to this option combination. */ inline ViewOption & operator = (const ViewOption &o) { opt = o.opt; return *this; } /** * Check if specified option \p o is set in the current object. * \param o A view option constant. * \return True, if specified option \p o is * set/enabled in the instance. */ inline bool has(const ViewOption &o) const { return o.opt & opt; } static const ViewOption hotfix1050625; private: ViewOption(int option); int opt; }; // --------------------------------------------------------------- /** * ViewOptions is just an alias for ViewOption. */ using ViewOptions = ViewOption; // --------------------------------------------------------------- /** * Vector of URL scheme names. */ using UrlSchemes = std::vector; // --------------------------------------------------------------- /** * Forward declaration of internal UrlBase data. */ class UrlBaseData; // --------------------------------------------------------------- /** * \brief Generic Url base class. * * The UrlBase class implements default behaviour for URL * manipulations and a base for implementation of scheme- * specialized URLs for the Url class. * */ class UrlBase { public: virtual ~UrlBase(); UrlBase(); /** * Create a new Url object as copy of the given one. * \param url The Url object to make a copy of. */ UrlBase(const UrlBase &url); /** * \brief Construct new object and initializes it with * specified URL components. * * \param scheme The scheme name. * \param authority The encoded authority component data. * \param pathdata The encoded path component data. * \param querystr The encoded query string component. * \param fragment The encoded fragment string component. * \throws UrlNotAllowedException if one of the components * is not allowed for the scheme. * \throws UrlBadComponentException if one of the components * contains an invalid character. */ UrlBase(const std::string &scheme, const std::string &authority, const std::string &pathdata, const std::string &querystr, const std::string &fragment); // ----------------- /** * \brief Clears all data in the object. */ virtual void clear(); /** * Returns pointer to a copy of the current object. * * Should be reimplemented by all derived object using * the copy constructor of the derived class, e.g.: * \code * return new MyUrlDerivedFromUrlBase(*this); * \endcode * * \return A pointer to a copy of the current object. */ virtual UrlBase * clone() const; /** * \brief Initializes current object with new URL components. * * \param scheme The scheme name. * \param authority The encoded authority component data. * \param pathdata The encoded path component data. * \param querystr The encoded query string component. * \param fragment The encoded fragment string component. * \throws UrlNotAllowedException if one of the components * is not allowed in the scheme. * \throws UrlBadComponentException if one of the components * contains an invalid character. */ virtual void init(const std::string &scheme, const std::string &authority, const std::string &pathdata, const std::string &querystr, const std::string &fragment); // ----------------- /** * \brief Returns scheme names known by this object. * * This method is used in the isValidScheme() method and * is intended to be reimplemented by derived classes to * return the scheme names it implements (is restricted * or compatible to). * * For example, if your derived class implements special * features of LDAP URLs, this method may return "ldap" * and "ldaps" scheme names. * * The UrlBase class returns an empty vector, that signals * that it is useable with all URLs. * * \return A vector with scheme names known by this object. */ virtual UrlSchemes getKnownSchemes() const; /** * \brief Returns if scheme name is known to this object. * \return True, if scheme name is known to this object. */ virtual bool isKnownScheme(const std::string &scheme) const; /** * \brief Verifies specified scheme name. * * Verifies the generic syntax of the specified \p scheme name * and if it is contained in the current object's list of known * schemes (see getKnownSchemes()) if the list is not empty (as * in the UrlBase class). * * \param scheme The scheme name to verify. * \return True, if generic scheme name syntax is valid and * the scheme name is known to the current object. */ virtual bool isValidScheme(const std::string &scheme) const; /** * \brief Verifies the Url. * * Verifies if the current object contains a non-empty scheme * name. Additional semantical URL checks may be performed by * derived UrlBase-objects. * * \return True, if the Url seems to be valid. */ virtual bool isValid() const; // ----------------- /** * Returns a default string representation of the Url object. * * By default, a password in the URL will be hidden. * * \return A default string representation of the Url object. */ virtual std::string asString() const; /** * Returns a string representation of the Url object. * * To include a password in the resulting Url string, use: * \code * url.asString(url.getViewOptions() + * url::ViewOptions::WITH_PASSWORD); * \endcode * * \param opts A combination of view options. * \return A string representation of the Url object. */ virtual std::string asString(const zypp::url::ViewOptions &opts) const; // ----------------- /** * Returns the scheme name of the URL. * \return Scheme name of the current Url object. */ virtual std::string getScheme() const; // ----------------- /** * Returns the encoded authority component of the URL. * * The returned authority string does not contain the leading * "//" separator characters, but just its "user:pass@host:port" * content only. * * \return The encoded authority component string. */ virtual std::string getAuthority() const; /** * Returns the username from the URL authority. * \param eflag Flag if the usename should be percent-decoded or not. * \return The username sub-component from the URL authority. * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual std::string getUsername(EEncoding eflag) const; /** * Returns the password from the URL authority. * \param eflag Flag if the password should be percent-decoded or not. * \return The password sub-component from the URL authority. * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual std::string getPassword(EEncoding eflag) const; /** * Returns the hostname or IP from the URL authority. * * In case the Url contains an IPv6 number, it is be surrounded * by "[" and "]" characters, for example "[::1]" for an IPv6 * localhost address. * * \param eflag Flag if the host should be percent-decoded or not. * \return The host sub-component from the URL authority. * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual std::string getHost(EEncoding eflag) const; /** * Returns the port number from the URL authority. * \return The port sub-component from the URL authority. */ virtual std::string getPort() const; // ----------------- /** * Returns the encoded path component of the URL. * * The path data contains the path name, optionally * followed by path parameters separated with a ";" * character, for example "/foo/bar;version=1.1". * * \return The encoded path component of the URL. */ virtual std::string getPathData() const; /** * Returns the path name from the URL. * \param eflag Flag if the path should be decoded or not. * \return The path name sub-component without path parameters * from path data component of the URL. * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual std::string getPathName(EEncoding eflag) const; /** * Returns the encoded path parameters from the URL. * \return The encoded path parameters from the URL. */ virtual std::string getPathParams() const; /** * Returns a vector with encoded path parameter substrings. * * The default path parameter separator is the \c ',' character. * A schema specific object may overide the default separators. * * For example, the path parameters string "foo=1,bar=2" is splited * by default into a vector containing the substrings "foo=1" and * "bar=2". * * \return The encoded path parameters vector. */ virtual zypp::url::ParamVec getPathParamsVec() const; /** * Returns a string map with path parameter keys and values. * * The default path parameter separator is the \c ',' character, * the default key/value separator for the path parameters is * the \c '=' character. * A schema specific object may overide the default separators. * * For example, the path parameters string "foo=1,bar=2" is splited * into a map containing "foo" = "1" and "bar" = "2" by default. * * \param eflag Flag if the path parameter keys and values should * be decoded or not. * \return The path parameters key and values as a string map. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual zypp::url::ParamMap getPathParamsMap(EEncoding eflag) const; /** * Return the value for the specified path parameter. * * For example, if the path parameters string is "foo=1,bar=2" * the method will return the substring "1" for the param key * "foo" and "2" for the param key "bar". * * \param param The path parameter key. * \param eflag Flag if the path parameter keys and values should * be decoded or not. * \return The value for the path parameter key or empty string. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual std::string getPathParam(const std::string ¶m, EEncoding eflag) const; // ----------------- /** * Returns the encoded query string component of the URL. * * The query string is returned without first "?" (separator) * character. Further "?" characters as in e.g. LDAP URLs * remains in the returned string. * * \return The encoded query string component of the URL. */ virtual std::string getQueryString() const; /** \overload Returns the safe query string (passwds stripped) unless WITH_PASSWORD is set. */ virtual std::string getQueryString( const ViewOptions & viewopts_r ) const; /** * Returns a vector with query string parameter substrings. * * The default query string parameter separator is the \c '&' * character. * A schema specific object may overide the default separators. * * For example, the query string "foo=1&bar=2" is splited by * default into a vector containing the substrings "foo=1" and * "bar=2". * * \return The query string splited into a vector of substrings. */ virtual zypp::url::ParamVec getQueryStringVec() const; /** * Returns a string map with query parameter and their values. * * The default query string parameter separator is the \c ',' * character, the default key/value separator the \c '=' character. * A schema specific object may overide the default separators. * * For example, the query string "foo=1&bar=2" is splited by * default into a map containing "foo" = "1" and "bar" = "2". * * \param eflag Flag if the query string keys and values should * be decoded or not. * \return The query string as a key/value string map. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual zypp::url::ParamMap getQueryStringMap(EEncoding eflag) const; /** * Return the value for the specified query parameter. * * For example, if the query string is "foo=1,bar=2" the method * will return the substring "1" for the param key "foo" and * "2" for the param key "bar". * * \param param The query parameter key. * \param eflag Flag if the query parameter keys and values should * be decoded or not. * \return The value for the query parameter key or empty string. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual std::string getQueryParam(const std::string ¶m, EEncoding eflag) const; // ----------------- /** * Returns the encoded fragment component of the URL. * \param eflag Flag if the fragment should be percent-decoded or not. * \return The encoded fragment component of the URL. * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual std::string getFragment(EEncoding eflag) const; // ----------------- /** * \brief Set the scheme name in the URL. * \param scheme The new scheme name. * \throws UrlBadComponentException if the \p scheme * contains an invalid character or is empty. */ virtual void setScheme(const std::string &scheme); // ----------------- /** * \brief Set the authority component in the URL. * * The \p authority string shoud not contain any leading * "//" separator characters (just "user:pass@host:port"). * * \param authority The authority component string. * \throws UrlNotAllowedException if the \p authority * has to be empty in for the current scheme. * \throws UrlBadComponentException if the \p authority * contains an invalid character. * \throws UrlParsingException if \p authority parsing fails. */ virtual void setAuthority(const std::string &authority); /** * \brief Set the username in the URL authority. * \param user The new username. * \param eflag If the \p username is encoded or not. * \throws UrlNotAllowedException if the \p user * has to be empty in for the current scheme. * \throws UrlBadComponentException if the \p user * contains an invalid character. */ virtual void setUsername(const std::string &user, EEncoding eflag); /** * \brief Set the password in the URL authority. * \param pass The new password. * \param eflag If the \p password is encoded or not. * \throws UrlNotAllowedException if the \p pass * has to be empty in for the current scheme. * \throws UrlBadComponentException if the \p pass * contains an invalid character. */ virtual void setPassword(const std::string &pass, EEncoding eflag); /** * \brief Set the hostname or IP in the URL authority. * * The \p host parameter may contain a hostname, an IPv4 address * in dotted-decimal form or an IPv6 address literal encapsulated * within square brackets (RFC3513, Sect. 2.2). * * A hostname may contain national alphanumeric UTF8 characters * (letters other than ASCII a-zA-Z), that will be encoded. * This function allows to specify both, a encoded or decoded * hostname. * * Other IP literals in "[v ... ]" square bracket format are not * supported by the implementation in UrlBase class. * * \param host The new hostname or IP address. * \throws UrlNotAllowedException if the \p host * has to be empty in for the current scheme. * \throws UrlBadComponentException if the \p host is invalid. */ virtual void setHost(const std::string &host); /** * \brief Set the port number in the URL authority. * \param port The new port number. * \throws UrlNotAllowedException if the \p port * has to be empty in for the current scheme. * \throws UrlBadComponentException if the \p port is invalid. */ virtual void setPort(const std::string &port); // ----------------- /** * \brief Set the path data component in the URL. * * By default, the \p pathdata string may include path * parameters separated by the ";" separator character. * * \param pathdata The encoded path data component string. * \throws UrlBadComponentException if the \p pathdata * contains an invalid character. */ virtual void setPathData(const std::string &pathdata); /** * \brief Set the path name. * \param path The new path name. * \param eflag If the \p path name is encoded or not. * \throws UrlBadComponentException if the \p path name * contains an invalid character. */ virtual void setPathName(const std::string &path, EEncoding eflag); /** * \brief Set the path parameters. * \param params The new encoded path parameter string. * \throws UrlBadComponentException if the path \p params * contains an invalid character. */ virtual void setPathParams(const std::string ¶ms); /** * \brief Set the path parameters. * \param pvec The vector with encoded path parameters. * \throws UrlBadComponentException if the \p pvec * contains an invalid character. */ virtual void setPathParamsVec(const zypp::url::ParamVec &pvec); /** * \brief Set the path parameters. * \param pmap The map with decoded path parameters. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). */ virtual void setPathParamsMap(const zypp::url::ParamMap &pmap); /** * \brief Set or add value for the specified path parameter. * \param param The decoded path parameter name. * \param value The decoded path parameter value. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual void setPathParam(const std::string ¶m, const std::string &value); // ----------------- /** * \brief Set the query string in the URL. * * The \p querystr string parameter is supposed * to not to contain the "?" URL query separator * character (use just a "foo=bar&x=22" instead * of "?foo=bar&x=22"). * * \param querystr The new encoded query string. * \throws UrlBadComponentException if the \p querystr * contains an invalid character. */ virtual void setQueryString(const std::string &querystr); /** * \brief Set the query parameters. * \param qvec The vector with encoded query parameters. * \throws UrlBadComponentException if the \p qvec * contains an invalid character. */ virtual void setQueryStringVec(const zypp::url::ParamVec &qvec); /** * \brief Set the query parameters. * \param qmap The map with decoded query parameters. * \param eflag Tells whether keys and values in pmap are already encoded or decoded. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). */ virtual void setQueryStringMap(const zypp::url::ParamMap &qmap, EEncoding eflag); /** * \brief Set or add value for the specified query parameter. * \param param The decoded query parameter name. * \param value The decoded query parameter value. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual void setQueryParam(const std::string ¶m, const std::string &value); /** * \brief remove the specified query parameter. * \param param The decoded query parameter name. * \throws UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws UrlDecodingException if the decoded result string * would contain a '\\0' character. */ virtual void delQueryParam(const std::string ¶m); void delQueryParams(const std::set ¶ms); // ----------------- /** * \brief Set the fragment string in the URL. * \param fragment The new fragment string. * \param eflag If the \p fragment is encoded or not. * \throws UrlBadComponentException if the \p querystr * contains an invalid character. */ virtual void setFragment(const std::string &fragment, EEncoding eflag); // ----------------- /** * Configures behaviour of the instance. * * This method is called in UrlBase constructors before * any URL components are applied. * Derived classes may reimplement this method to change * the behaviour of the object. * Use the config() methods to query and change them. * * The UrlBase class uses following config variables: * * - Common path parameter separators: * - \a \c sep_pathparams \c ";" * Separator used to split path parameters from path name. * Setting it to empty string disables splitting of path * name and path parameters. Set also rx_pathparams to an * empty string. * - \a \c psep_pathparam \c "," * Separator between path parameters. * - \a \c vsep_pathparam \c "=" * Separator between key and value of a path parameter. * . * . * * - Common query string separators: * - \a \c psep_querystr \c "&" * Separator between query string parameters. * - \a \c vsep_querystr \c "=" * Separator between key and value of a query parameter. * . * . * * - Characters in URL components, that are safe without * URL percent-encoding (see zypp::url::encode()). * - \a safe_username * - \a safe_password * - \a safe_hostname * - \a safe_pathname * - \a safe_pathparams * - \a safe_querystr * - \a safe_fragment * . * . * * - Regular expressions used to verify encoded URL * components and their sub-components: * - \a rx_username * - \a rx_password * - \a rx_pathname * - \a rx_pathparams * - \a rx_querystr * - \a rx_fragment * . * . */ virtual void configure(); /** * Get the value of a UrlBase configuration variable. * * See configure() method for names an purpose of the * configuration variables used in UrlBase class. * * \param opt The name of the configuration variable. * \return The value of the specified variable * or empty string. */ std::string config(const std::string &opt) const; /** * Set the value of a UrlBase configuration variable. * * See configure() method for names an purpose of the * configuration variables used in UrlBase class. * * \param opt The name of the configuration variable. * \param val The new value for the configuration variable. */ void config(const std::string &opt, const std::string &val); /** * Return the view options of the current object. * * This method is used to query the view options * used by the asString() method. * * \return The current view option combination. */ ViewOptions getViewOptions() const; /** * Change the view options of the current object. * * This method is used to change the view options * used by the asString() method. * * \param vopts New view options combination. */ void setViewOptions(const ViewOptions &vopts); std::string asString1050625() const; protected: /** * Utility method to cleanup an encoded path name. * * By default, this method makes sure, that the first slash * in the path is not encoded, and that the second slash * before the first path segment, is encoded (to "%2F"). * It modifies the path in the url, for example: * "ftp://host//aaa//bbb" to "ftp://host/%2Faaa//bbb" * or as encoded path only also "%2f/name" to "/%2fname". * * This operation is required to fulfill the path-absolute * rule of RFC3986, if there is no authority. It avoids the * missinterpretation of the path as an authority separator. * * It is not required if there is an authority ("//" behind * the "scheme:"), that is in the path-abempty rule, but it * is used e.g. in ftp url's defined by RFC1738. * * We apply this operation in both cases (for all paths), * but if \p authority is true, the encoding of the second * slash depends on the schema configuration (for ftp only). * * \param path The encoded path name to cleanup. * \param authority Whether the url contains authority or not. * \return A modified encoded path. */ virtual std::string cleanupPathName(const std::string &path, bool authority) const; /** * Utility method to cleanup an encoded path name. * * This variant of the method checks if the host component * in the url is empty or not to differentiate if there is * an authority. * * \param path The encoded path name to cleanup. * \return A modified encoded path. */ virtual std::string cleanupPathName(const std::string &path) const; /** * \brief Verifies specified host or IP. * * It verifies, if the specified \p host parameter contains * a hostname, an IPv4 address in dotted-decimal form or an * IPv6 address literal encapsulated within square brackets * (RFC3513, Sect. 2.2). * * A hostname in the \p host parameter, may contain national * alphanumeric UTF8 characters (letters other than ASCII * a-zA-Z) and allows to specify both, a encoded or decoded * hostname. * * This function does not perform any hostname lookups and * supports only IPv6 addresses in "[ ... ]" notation. The * "[v ... ]" square bracket format is not supported by * this implementation. * * \param host The host name or IP to verify. * \return True, if host seems to be valid. */ virtual bool isValidHost(const std::string &host) const; /** * \brief Verifies specified port number. * * \param port The port number to verify. * \return True, if port number is valid. */ virtual bool isValidPort(const std::string &port) const; private: UrlBaseData *m_data; }; // --------------------------------------------------------------- /** * \brief Copy-On-Write Url reference. */ using UrlRef = RWCOW_pointer; ////////////////////////////////////////////////////////////////// } // namespace url //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// #endif /* ZYPP_URL_URLBASE_H */ /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp-core/url/UrlException.h000066400000000000000000000102711476576476200207430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/url/UrlException.h */ #ifndef ZYPP_URL_URLEXCEPTION_H #define ZYPP_URL_URLEXCEPTION_H #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace url { ////////////////////////////////////////////////////////////////// // --------------------------------------------------------------- /** * Base class for all URL exceptions. */ class ZYPP_API UrlException: public zypp::Exception { public: UrlException() : zypp::Exception("Url exception") {} UrlException(const std::string &msg) : zypp::Exception(msg) {} ~UrlException() throw() override {}; }; // --------------------------------------------------------------- /** * Thrown if the encoded string contains a NUL byte (%00). */ class ZYPP_API UrlDecodingException: public UrlException { public: UrlDecodingException() : UrlException("Url NUL decoding exception") {} UrlDecodingException(const std::string &msg) : UrlException(msg) {} ~UrlDecodingException() throw() override {}; }; // --------------------------------------------------------------- /** * Thrown if the url or a component can't be parsed at all. */ class ZYPP_API UrlParsingException: public UrlException { public: UrlParsingException() : UrlException("Url parsing failure exception") {} UrlParsingException(const std::string &msg) : UrlException(msg) {} ~UrlParsingException() throw() override {}; }; // --------------------------------------------------------------- /** * Thrown if a url component is invalid. */ class ZYPP_API UrlBadComponentException: public UrlException { public: UrlBadComponentException() : UrlException("Url bad component exception") {} UrlBadComponentException(const std::string &msg) : UrlException(msg) {} ~UrlBadComponentException() throw() override {}; }; // --------------------------------------------------------------- /** * Thrown if scheme does not allow a component. */ class ZYPP_API UrlNotAllowedException: public UrlException { public: UrlNotAllowedException() : UrlException("Url not allowed component exception") {} UrlNotAllowedException(const std::string &msg) : UrlException(msg) {} ~UrlNotAllowedException() throw() override {}; }; // --------------------------------------------------------------- /** * Thrown if a feature e.g. parsing of a component * is not supported for the url/scheme. */ class ZYPP_API UrlNotSupportedException: public UrlException { public: UrlNotSupportedException() : UrlException("Url parsing unsupported exception") {} UrlNotSupportedException(const std::string &msg) : UrlException(msg) {} ~UrlNotSupportedException() throw() override {}; }; ////////////////////////////////////////////////////////////////// } // namespace url //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// #endif /* ZYPP_URL_URLEXCEPTION_H */ /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp-core/url/UrlUtils.cc000066400000000000000000000212471476576476200202500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/url/UrlUtils.cc */ #include #include #include #include // strtol #include // isxdigit #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace url { ////////////////////////////////////////////////////////////////// // --------------------------------------------------------------- std::string encode(const std::string &str, const std::string &safe, EEncoding eflag) { std::string skip("ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789.~_-"); static const std::string more(URL_SAFE_CHARS); // ":/?#[]@!$&'()*+,;=" size_t beg = 0, len = 0; std::string out; for(size_t i=0; i beg) { out.append(str, beg, pos - beg); } if( eflag == E_ENCODED && pos + 2 < len && str.at(pos) == '%' && std::isxdigit(str.at(pos + 1)) && std::isxdigit(str.at(pos + 2))) { out.append(str, pos, 3); beg = pos + 3; } else { out.append( encode_octet( str.at(pos))); beg = pos + 1; } } else { out.append(str, beg, len - beg); beg = len; } } return out; } // --------------------------------------------------------------- std::string decode(const std::string &str, bool allowNUL) { size_t pos = 0, end = 0, len = 0; std::string out(str); len = out.length(); pos = end = 0; while(pos < len) { out[end] = out[pos]; if( pos + 2 < len && out.at(pos) == '%') { int c = decode_octet(out.c_str() + pos + 1); switch(c) { case -1: // not a hex noted octet... break; case 0: // is a %00 octet allowed ? if( !allowNUL) { ZYPP_THROW(UrlDecodingException( _("Encoded string contains a NUL byte") )); } default: // other octets are fine... out[end] = c; pos += 2; break; } } pos++; end++; } if( end < pos) out.erase(end); return out; } // --------------------------------------------------------------- std::string encode_octet(const unsigned char c) { static const char tab[] = "0123456789ABCDEF"; char out[4]; out[0] = '%'; out[1] = tab[0x0f & (c >> 4)]; out[2] = tab[0x0f & c]; out[3] = '\0'; return std::string(out); } // --------------------------------------------------------------- int decode_octet(const char *hex) { if(hex && std::isxdigit(hex[0]) && std::isxdigit(hex[1])) { char x[3] = { hex[0], hex[1], '\0'}; return 0xff & ::strtol(x, NULL, 16); } else { return -1; } } // --------------------------------------------------------------- void split(ParamVec &pvec, const std::string &pstr, const std::string &psep) { size_t beg = 0, len = 0; if( psep.empty()) { ZYPP_THROW(UrlNotSupportedException( _("Invalid parameter array split separator character") )); } len = pstr.length(); beg = 0; while( beg < len) { size_t pos = pstr.find(psep, beg); if(pos != std::string::npos) { pvec.push_back( pstr.substr(beg, pos - beg)); beg = pos + 1; } else { pvec.push_back( pstr.substr(beg, len - beg)); beg = len; } } } // --------------------------------------------------------------- void split(ParamMap &pmap, const std::string &str, const std::string &psep, const std::string &vsep, EEncoding eflag) { ParamVec pvec; ParamVec::const_iterator pitr; std::string k, v; if( psep.empty() || vsep.empty()) { ZYPP_THROW(UrlNotSupportedException( _("Invalid parameter map split separator character") )); } split(pvec, str, psep); for( pitr = pvec.begin(); pitr != pvec.end(); ++pitr) { size_t pos = pitr->find(vsep); if(pos != std::string::npos) { if( eflag == E_DECODED) { k = url::decode(pitr->substr(0, pos)); v = url::decode(pitr->substr(pos + 1)); pmap[ k ] = v; } else { k = pitr->substr(0, pos); v = pitr->substr(pos + 1); pmap[ k ] = v; } } else { if( eflag == E_DECODED) { pmap[ url::decode(*pitr) ] = ""; } else { pmap[ *pitr ] = ""; } } } } // --------------------------------------------------------------- std::string join(const ParamVec &pvec, const std::string &psep) { std::string str; ParamVec::const_iterator i( pvec.begin()); if( i != pvec.end()) { str = *i; while( ++i != pvec.end()) { str += psep + *i; } } return str; } // --------------------------------------------------------------- std::string join(const ParamMap &pmap, const std::string &psep, const std::string &vsep, const std::string &safe, EEncoding eflag) { if( psep.empty() || vsep.empty()) { ZYPP_THROW(UrlNotSupportedException( _("Invalid parameter array join separator character") )); } std::string str; if ( eflag == E_DECODED ) { std::string safeKey; std::string safeVal; for(std::string::size_type i=0; ifirst, safeKey); if( !i->second.empty()) str += vsep + encode(i->second, safeVal); while( ++i != pmap.end()) { str += psep + encode(i->first, safeKey); if( !i->second.empty()) str += vsep + encode(i->second, safeVal); } } } else { for ( const auto & [k,v] : pmap ) { if ( not str.empty() ) str += psep; str += k; if ( not v.empty() ) { str += vsep; str += v; } } } return str; } ////////////////////////////////////////////////////////////////// } // namespace url //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp-core/url/UrlUtils.h000066400000000000000000000242741476576476200201150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/url/UrlUtils.h */ #ifndef ZYPP_URL_URLUTILS_H #define ZYPP_URL_URLUTILS_H #include #include #include #include /** Characters that are safe for URL without percent-encoding. */ #define URL_SAFE_CHARS ":/?#[]@!$&'(){}*+,;=" ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// /** Url details namespace. */ namespace url { ////////////////////////////////////////////////////////////////// // --------------------------------------------------------------- /** A parameter vector container. * A string vector containing splited PathParam- or Query-String. * Each string in the vector is allways URL percent encoded and * usually contains a "key=value" pair. */ using ParamVec = std::vector; /** A parameter map container. * A map containing key and value pairs parsed from a PathParam- * or Query-String. */ using ParamMap = std::map; /** Encoding flags. */ typedef enum { E_ENCODED, //!< Flag to request encoded string(s). E_DECODED //!< Flag to request decoded string(s). } EEncoding; // --------------------------------------------------------------- /** Encodes a string using URL percent encoding. * * By default, all characters except of "a-zA-Z0-9_.-" will be encoded. * Additional characters from the set ":/?#[]@!$&'()*+,;=", that are * safe for a URL compoent without encoding, can be specified in the * \p safe argument. * * If the \p eflag parameter is set to E_ENCODED, then already encoded * substrings will be detected and not encoded a second time. * * The following function call will encode the "@" character as "%40", * but skip encoding of the "%" character, because the \p eflag is set * to E_ENCODED and "%ba" is detected as a valid encoded character. * \code * zypp::url::encode("foo%bar@localhost", "", E_ENCODED); * \endcode * With \p eflag set to E_DECODED, the "%" character would be encoded * as well. The complete encoded string would be "foo%25bar%40localhost". * * \param str A string to encode (binary data). * \param safe Characters safe to skip in encoding, * e.g. "/" for path names. * \param eflag If to detect and skip already encoded substrings. * \return A percent encoded string. */ std::string encode(const std::string &str, const std::string &safe = "", EEncoding eflag = E_DECODED) ZYPP_API; // --------------------------------------------------------------- /** Decodes a URL percent encoded string. * Replaces all occurences of \c "%" in the \p str string * with the character encoded using the two hexadecimal digits that * follows the "%" character. * * For example, the encoded string "%40%3F%3D%26%25" will be decoded * to "@?=&%". * * \param str A string to decode. * \param allowNUL A flag, if \c "%00" (encoded \c '\\0') * is allowed or not. * \return A decoded strig (may contain binary data). * \throws UrlDecodingException if \p allowNUL is false and * a encoded NUL byte (\c "%00") was found in \p str. */ std::string decode(const std::string &str, bool allowNUL = false) ZYPP_API; // --------------------------------------------------------------- /** Encode one character. * * Encode the specified character \p c into its \c "%" * representation. * * \param c A character to encode. * \return A percent encoded representation of the character, * e.g. %20 for a ' ' (space). */ std::string encode_octet(const unsigned char c) ZYPP_API; // --------------------------------------------------------------- /** Decode one character. * * Decode the \p hex parameter pointing to (at least) two hexadecimal * digits into its character value and return it. * * Example: * \code * char *str = "%40"; * char *pct = strchr(str, '%'); * int chr = pct ? decode_octet(pct+1) : -1; * // chr is set to the '@' ASCII character now. * \endcode * * \param hex Pointer to two hex characters representing * the character value in percent-encoded strings. * \return The value (0-255) encoded in the \p hex characters or -1 * if \p hex does not point to two hexadecimal characters. */ int decode_octet(const char *hex) ZYPP_API; // --------------------------------------------------------------- /** Split into a parameter vector. * * Splits a parameter string \p pstr into substrings using \p psep * as separator and appends the resulting substrings to \p pvec. * * Usual parameter separators are \c '&' for Query- and \c ',' for * PathParam-Strings. * * \param pvec Reference to a result parameter vector. * \param pstr Reference to the PathParam- or Query-String to split. * \param psep Parameter separator character to split at. * \throws UrlNotSupportedException if \p psep separator is empty. */ void split(ParamVec &pvec, const std::string &pstr, const std::string &psep); // --------------------------------------------------------------- /** Split into a parameter map. * * Splits a parameter string \p pstr into substrings using \p psep as * separator and then, each substring into key and value pair using * \p vsep as separator between parameter key and value and adds them * to the parameter map \p pmap. * * If a parameter substring doesn't contain any value separator \p vsep, * the substring is used as a parameter key and value is set to an empty * string. * * Usual parameter separators are \c '&' for Query- and \c ',' for * PathParam-Strings. A usual parameter-value separator is \c '=' for * both, Query- and PathParam-Strings. * * If the encoding flag \p eflag is set to \p E_DECODED, then the key * and values are dedcoded before they are stored in the map. * * \param pmap Reference to a result parameter map. * \param pstr Reference to the PathParam- or Query-String to split. * \param psep Separator character to split key-value pairs. * \param vsep Separator character to split key and value. * \param eflag Flag if the key and value strings should be URL percent * decoded before they're stored in the map. * \throws UrlNotSupportedException if \p psep or \p vsep separator * is empty. */ void split(ParamMap &pmap, const std::string &pstr, const std::string &psep, const std::string &vsep, EEncoding eflag = E_ENCODED); // --------------------------------------------------------------- /** Join parameter vector to a string. * * Creates a string containing all substrings from the \p pvec separated * by \p psep separator character. The substrings in \p pvec should be * already URL percent encoded and should't contain \p psep characters. * * Usual parameter separators are \c '&' for Query- and \c ',' for * PathParam-Strings. * * \param pvec Reference to encoded parameter vector. * \param psep Parameter separator character to use. * \return A parameter string. */ std::string join(const ParamVec &pvec, const std::string &psep); // --------------------------------------------------------------- /** Join parameter map to a string. * * Creates a string containing all parameter key-value pairs from the * parameter map \p pmap, that will be joined using the \p psep character * and the parameter key is separated from the parameter value using the * \p vsep character. Both, key and value will be automatically encoded. * * Usual parameter separators are \c '&' for Query- and \c ',' for * PathParam-Strings. A usual parameter-value separator is \c '=' for * both, Query- and PathParam-Strings. * * See encode() function from details about the \p safe characters. * * * \param pmap Reference to a parameter map. * \param psep Separator character to use between key-value pairs. * \param vsep Separator character to use between keys and values. * \param safe List of characters to accept without encoding. * \param eflag Tells whether keys and values in pmap are already encoded or decoded. * \return A URL percent-encoded parameter string. * \throws UrlNotSupportedException if \p psep or \p vsep separator * is empty. */ std::string join(const ParamMap &pmap, const std::string &psep, const std::string &vsep, const std::string &safe, EEncoding eflag); ////////////////////////////////////////////////////////////////// } // namespace url //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// #endif /* ZYPP_URL_URLUTILS_H */ /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp-core/zyppng/000077500000000000000000000000001476576476200166755ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/async/000077500000000000000000000000001476576476200200125ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/async/AsyncOp000066400000000000000000000000251476576476200213060ustar00rootroot00000000000000#include "asyncop.h" libzypp-17.36.5/zypp-core/zyppng/async/asyncop.h000066400000000000000000000241611476576476200216430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_ASYNC_ASYNCOP_H_INCLUDED #define ZYPPNG_ASYNC_ASYNCOP_H_INCLUDED #include #include #include #include #include #include namespace zyppng { template struct AsyncOp; ZYPP_FWD_DECL_TYPE_WITH_REFS ( AsyncOpBase ); namespace detail { template > struct has_value_type : public std::false_type{}; template struct has_value_type> : public std::true_type {}; template constexpr bool has_value_type_v = has_value_type::value; template struct is_asyncop_type : public std::false_type{}; template struct is_asyncop_type*> >> : public std::true_type{}; template constexpr bool is_asyncop_type_v = is_asyncop_type::value; /*! * Detects if a type is a AsyncOp based type. This * is required in cases where we can not use simple Argument type matching * but need to decide on the type characteristics. For example when a AsyncOp is * passed as callback argument in the pipelines. */ template using is_async_op = std::conjunction< has_value_type>, is_asyncop_type > >; template < typename T> constexpr bool is_async_op_v = is_async_op::value; } /*! * Thrown if code tries to access the result of a async operation * that is not ready. */ class AsyncOpNotReadyException : public zypp::Exception { public: AsyncOpNotReadyException() : Exception( "AsyncOp instance not ready" ) {} ~AsyncOpNotReadyException() override; }; inline AsyncOpNotReadyException::~AsyncOpNotReadyException() { } class CancelNotImplementedException : public zypp::Exception { public: CancelNotImplementedException() : Exception ("AsyncOp does not support cancelling the operation") {} ~CancelNotImplementedException() override; }; inline CancelNotImplementedException::~CancelNotImplementedException() { } class AsyncOpBase : public Base { public: /*! * Should return true if the async op supports cancelling, otherwise false */ virtual bool canCancel () { return false; } /*! * Explicitely cancels the async operation if it supports that, * otherwise throws a \ref CancelNotImplementedException * * Generally every AsyncOp HAS TO support cancelling by releasing the last reference * to it, however in some special cases we need to be able to cancel programatically * from the backends and notify the frontends by returning a error from a AsyncOp. */ virtual void cancel () { throw CancelNotImplementedException(); } /*! * Signal that is emitted once the AsyncOp is started */ SignalProxy sigStarted () { return _sigStarted; } /*! * Signal that might be emitted during operation of the AsyncOp, * not every AsyncOp will use this */ SignalProxy sigProgress () { return _sigProgress; } /*! * Signal that is emitted once the AsyncOp is ready and no * callback was registered with \ref onReady */ SignalProxy sigReady () { return _sigReady; } protected: Signal _sigStarted; Signal _sigReady; Signal _sigProgress; }; /*! *\class AsyncOp * The \a AsyncOp template class is the basic building block for the asynchronous pipelines. * Its the base for all async callbacks as well as the async result type. That basically means * every pipeline is just a AsyncOp that contains all previous operations that were defined in the pipeline. * * When implementing a async operation that is to be used in a pipeline it is required to add a operator() to the class taking the * input parameter. After the operation is finished the implementation must call setReady(). Calling * setReady() must be treated like calling return in a normal function and not execute anymore code on the * AsyncOp instance afterwards, since the next operation in the pipeline is allowed to free the previous operation * as soon as it gets ready. * * In case no next operation is defined on the AsyncOp ( when the instance is used as result object ) the return value * is cached internally and can be retrieved with \sa get(). * * A async operation can be cancelled by releasing the result object ( the resulting combinatory object ), this will * destroy all previous operations that are either running or pending as well. The destructors MUST NOT call setReady() but * only release currently running operations. */ template struct AsyncOp : public AsyncOpBase { static_assert(!detail::is_async_op_v, "A async op can never have a async result"); using value_type = Result; using Ptr = std::shared_ptr>; AsyncOp () = default; AsyncOp ( const AsyncOp &other ) = delete; AsyncOp& operator= ( const AsyncOp &other ) = delete; AsyncOp& operator= ( AsyncOp &&other ) noexcept = default; AsyncOp ( AsyncOp &&other ) noexcept = default; ~AsyncOp() override{} /*! * Sets the async operation ready, in case a callback * is registered the \a val is directly forwarded without * storing it. */ void setReady ( value_type && val ) { if ( _readyCb ) { // use a weak reference to know if `this` was deleted by the callback() auto weak = weak_from_this(); _readyCb( std::move( val ) ); if ( !weak.expired() ) _readyCb = {}; } else { //we need to cache the value because no callback is available _maybeValue = std::move(val); _sigReady.emit(); } } /*! * Checks if the async operation already has finished. * * \note This can only be used when no callback is registered. */ bool isReady () const { return _maybeValue.has_value(); } /*! * Registeres a callback that is immediately called * when the object gets into ready state. In case the * object is in ready state when registering the callback * it is called right away. * \note this will disable the emitting of sigReady() so it should * be only used by the pipeline implementation * * \note the callback is removed from the AsyncOp after it was executed * when the AsyncOp becomes ready */ template< typename Fun > void onReady ( Fun &&cb ) { this->_readyCb = std::forward(cb); if ( isReady() ) { // use a weak reference to know if `this` was deleted by the callback() auto weak = weak_from_this(); _readyCb( std::move( _maybeValue.value()) ); if ( !weak.expired() ) { // value was passed on, reset the optional _maybeValue.reset(); // reset the callback, it might be a lambda with captured ressources // that need to be released after returning from the func _readyCb = {}; } } } /*! * Returns the internally cached value if there is one. * \throws AsyncOpNotReadyException if called before the operation is ready */ value_type &get (){ if ( !isReady() ) ZYPP_THROW(AsyncOpNotReadyException()); return _maybeValue.value(); } private: std::function _readyCb; std::optional _maybeValue; }; template using AsyncOpRef = std::shared_ptr>; /*! * Helper mixin for AsyncOp types that host a inner pipeline for * their logic. This is useful if a lot of state has to be preserved * over a longer pipeline, instead of capturing all the seperate * variables into the lambda callbacks it makes more sense to * use a containing AsyncOp to help with it. */ template struct NestedAsyncOpMixin { template void operator ()( Args &&...args ) { assert(!_nestedPipeline); _nestedPipeline = static_cast(this)->makePipeline( std::forward(args)...); _nestedPipeline->onReady([this]( auto &&val ){ static_cast(this)->setReady( std::forward(val) ); }); } private: AsyncOpRef _nestedPipeline; }; namespace detail { //A async result that is ready right away template struct ReadyResult : public zyppng::AsyncOp< T > { ReadyResult( T &&val ) { this->setReady( std::move(val) ); } }; } /*! * Is \a isAsync is true returns a \ref AsyncOpRef that is always ready, containing the \a result as * its final value, otherwise the value passed to the function is just forwarded. */ template std::conditional_t, T> makeReadyResult ( T && result ) { if constexpr ( isAsync ) { return std::make_shared>( std::forward(result) ); } else { return result; } } } #endif libzypp-17.36.5/zypp-core/zyppng/base/000077500000000000000000000000001476576476200176075ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/base/AbstractEventSource000066400000000000000000000000411476576476200234530ustar00rootroot00000000000000#include "abstracteventsource.h" libzypp-17.36.5/zypp-core/zyppng/base/AutoDisconnect000066400000000000000000000000341476576476200224510ustar00rootroot00000000000000#include "autodisconnect.h" libzypp-17.36.5/zypp-core/zyppng/base/Base000066400000000000000000000000221476576476200203760ustar00rootroot00000000000000#include "base.h" libzypp-17.36.5/zypp-core/zyppng/base/EventDispatcher000066400000000000000000000000351476576476200226200ustar00rootroot00000000000000#include "eventdispatcher.h" libzypp-17.36.5/zypp-core/zyppng/base/EventLoop000066400000000000000000000000271476576476200214440ustar00rootroot00000000000000#include "eventloop.h" libzypp-17.36.5/zypp-core/zyppng/base/Signals000066400000000000000000000000251476576476200211270ustar00rootroot00000000000000#include "signals.h" libzypp-17.36.5/zypp-core/zyppng/base/SocketNotifier000066400000000000000000000000341476576476200224570ustar00rootroot00000000000000#include "socketnotifier.h" libzypp-17.36.5/zypp-core/zyppng/base/Timer000066400000000000000000000000231476576476200206050ustar00rootroot00000000000000#include "timer.h" libzypp-17.36.5/zypp-core/zyppng/base/UnixSignalSource000066400000000000000000000000361476576476200227730ustar00rootroot00000000000000#include "unixsignalsource.h" libzypp-17.36.5/zypp-core/zyppng/base/abstracteventsource.cc000066400000000000000000000025721476576476200242120ustar00rootroot00000000000000#include "abstracteventsource.h" #include "private/abstracteventsource_p.h" #include "eventdispatcher.h" #include "private/base_p.h" #include namespace zyppng { AbstractEventSourcePrivate::AbstractEventSourcePrivate( AbstractEventSource &p ) : BasePrivate( p ) { auto ev = EventDispatcher::instance(); if ( !ev ) ZYPP_THROW( zypp::Exception( "Creating event sources without a EventDispatcher instance is not supported" ) ); _ev = ev; } ZYPP_IMPL_PRIVATE(AbstractEventSource) AbstractEventSource::AbstractEventSource() : Base ( * new AbstractEventSourcePrivate( *this ) ) { } AbstractEventSource::AbstractEventSource( AbstractEventSourcePrivate &dd ) : Base ( dd ) { } AbstractEventSource::~AbstractEventSource() { Z_D(); auto ev = d->_ev.lock(); //if ev is null , eventloop is shutting down if ( ev ) ev->removeEventSource( *this ); } std::weak_ptr AbstractEventSource::eventDispatcher() const { return d_func()->_ev; } void AbstractEventSource::updateFdWatch(int fd, int mode) { auto ev = d_func()->_ev.lock(); //if ev is null we are shutting down if ( !ev ) return; ev->updateEventSource( *this, fd, mode ); } void AbstractEventSource::removeFdWatch(int fd) { auto ev = d_func()->_ev.lock(); //if ev is null we are shutting down if ( !ev ) return; ev->removeEventSource( *this , fd ); } } libzypp-17.36.5/zypp-core/zyppng/base/abstracteventsource.h000066400000000000000000000060601476576476200240500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_BASE_ABSTRACTEVENTSOURCE_H_INCLUDED #define ZYPP_NG_BASE_ABSTRACTEVENTSOURCE_H_INCLUDED #include #include #include namespace zyppng { class EventDispatcher; class AbstractEventSourcePrivate; /*! * The AbstractEventSource class is the base class for all objects that can * be tracked using one or more file descriptors * * A subclass can register multiple file descriptors to be tracked using * \a updateFdWatch and remove them with \a removeFdWatch. This is internally * forwarded to the \sa EventDispatcher belonging to the \a AbstractEventSource. * * In case there is activity on the file descriptor the EventDispatcher wakes up * and forwards it to \a onFdReady. */ class LIBZYPP_NG_EXPORT AbstractEventSource : public Base { ZYPP_DECLARE_PRIVATE(AbstractEventSource) public: /*! * The different types of events a AbstractEventSource can * listen for. */ enum EventTypes { Read = 0x01, //< The fd is ready to read data without blocking Write = 0x02, //< The fd has written pending data Exception = 0x04, //< A exception has happend on the fd Error = 0x08 //< There was a error polling the fd }; AbstractEventSource(); AbstractEventSource( AbstractEventSourcePrivate &dd ); ~AbstractEventSource() override; /*! * Returns the \sa EventDispatcher that takes care of this event source */ std::weak_ptr eventDispatcher () const; /*! * Called by the \sa EventDispatcher when activity was detected * on a registered \a fd. The \a events are set according to the activity * on the file descriptor. */ virtual void onFdReady ( int fd, int events ) = 0; /*! * Called when a event source has registered to receive unix signals * \note this is not supported yet */ virtual void onSignal ( int signal ) = 0; protected: /*! * Register or update a file descriptor poll mode. * \param fd The fd to add or update to the watchlist of the \sa EventDispatcher * \param mode The watchmode used in the watchlist \sa EventTypes */ void updateFdWatch ( int fd, int mode ); /*! * Removes the given \a fd from the \sa EventDispatcher watchlist. * After calling this no more events will be received by the object it was called on. */ void removeFdWatch ( int fd ); }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/autodisconnect.h000066400000000000000000000023661476576476200230110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #include namespace zyppng { /*! * This can be used to scope a signal/slot connection. * Basically just like \sa zypp::AutoDispose */ struct AutoDisconnect { AutoDisconnect( connection &&conn ) : _conn ( std::move(conn) ) {} AutoDisconnect( AutoDisconnect &&other ) noexcept : _conn ( std::move(other._conn) ) {} AutoDisconnect( const AutoDisconnect &other ) = delete; AutoDisconnect & operator=( const AutoDisconnect & ) = delete; ~AutoDisconnect( ) { _conn.disconnect(); } connection _conn; }; } libzypp-17.36.5/zypp-core/zyppng/base/base.cc000066400000000000000000000025061476576476200210330ustar00rootroot00000000000000#include namespace zyppng { BasePrivate::~BasePrivate() { } void BasePrivate::init() { } ZYPP_IMPL_PRIVATE(Base) Base::Base ( BasePrivate &dd ) : d_ptr ( &dd ) { d_ptr->z_ptr = this; d_ptr->init(); } Base::Base() : Base( *new BasePrivate(*this) ) { } Base::~Base() { } Base::WeakPtr Base::parent() const { return d_func()->parent; } void Base::addChild( const Base::Ptr& child ) { Z_D(); if ( !child ) return; //we are already the parent auto childParent = child->d_func()->parent.lock(); if ( childParent.get() == this ) return; if ( childParent ) { childParent->removeChild( child ); } d->children.insert( child ); auto tracker = this->weak_this(); child->d_func()->parent = tracker; } void Base::removeChild( const Base::Ptr& child ) { if ( !child ) return; //we are not the child of this object if ( child->d_func()->parent.lock().get() != this ) return; Z_D(); d->children.erase( child ); child->d_func()->parent.reset(); } const std::unordered_set &Base::children() const { return d_func()->children; } std::thread::id Base::threadId() const { return d_func()->threadId; } } // namespace zyppng libzypp-17.36.5/zypp-core/zyppng/base/base.h000066400000000000000000000170101476576476200206710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_BASE_BASE_H_INCLUDED #define ZYPP_NG_BASE_BASE_H_INCLUDED #include #include #include #include #include #include namespace zyppng { class Base; class BasePrivate; namespace internal { template struct MemberFunction; template struct MemberFunction { using ClassType = BType; }; template inline constexpr bool is_base_receiver = std::is_base_of_v || std::is_base_of_v; } /*! * The Base class is used as a common base class for objects that emit signals, * it also supports a parent/child relationship where the parent object keeps * a reference for all its children. * * Generally, all objects that want to send or receive signals should derive from Base, since it * will help enforcing a correct use of shared_ptr semantics. Generally, with signal/slot emission, * it is easy to run into the issue of an object being deleted while it emits a signal. Think about a Socket * that emits a \a closed signal. It might be removed from the list of connections and the last reference of the * object gets deleted before the signal returns. * In order to prevent this from happening, we established a rule of "Always own a reference to the object you use". * The connection helper's \ref Base::connect and \ref Base::connectFunc help with enforcing this rule, even asserting * when compiled without NDEBUG defined. * * \sa zypp/zyppng/base/signals.h */ class LIBZYPP_NG_EXPORT Base : public sigc::trackable, public std::enable_shared_from_this { NON_COPYABLE(Base); ZYPP_DECLARE_PRIVATE(Base) public: using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; Base (); virtual ~Base(); /*! * Returns the parent object if there is one, otherwise * returns a zero WeakPtr */ WeakPtr parent() const; /*! * Adds a new object to the child list, the object * will keep a reference for its entire lifetime or until the object is removed */ void addChild ( const Base::Ptr& child ); /*! * Removes a child object from the internal child list */ void removeChild (const Ptr& child ); /*! * Returns all child objects of this object */ const std::unordered_set &children() const; /*! * Returns the thread ID this object was created in */ std::thread::id threadId () const; /*! * Returns all children that can be casted to type T */ template std::vector< std::weak_ptr > findChildren () const { std::vector< std::weak_ptr > result; for ( const Ptr& p : children() ) { std::shared_ptr casted = std::dynamic_pointer_cast(p); if ( casted ) result.push_back( std::weak_ptr(casted) ); } return result; } template inline std::shared_ptr shared_this () const { return std::static_pointer_cast( shared_from_this() ); } template inline std::shared_ptr shared_this () { return std::static_pointer_cast( shared_from_this() ); } template inline std::weak_ptr weak_this () const { return std::static_pointer_cast( weak_from_this().lock() ); } template inline std::weak_ptr weak_this () { return std::static_pointer_cast( weak_from_this().lock() ); } template static decltype (auto) make_base_slot( Obj *o, Functor &&f ) { //static_assert ( !internal::is_base_receiver, "Can not make a slot for a Object that does not derive from Base or BasePrivate."); return internal::locking_fun( sigc::mem_fun( o, std::forward(f) ), *o ); } /*! * Preferred way to connect a signal to a slot, this will automatically take care of tracking the target object in the connection */ template< typename SenderFunc, typename ReceiverFunc > static auto connect ( typename internal::MemberFunction::ClassType &s, SenderFunc &&sFun, typename internal::MemberFunction::ClassType &recv, ReceiverFunc &&rFunc ) { return std::invoke( std::forward(sFun), &s ).connect( make_base_slot( &recv, std::forward(rFunc) ) ); } /*! * Convenience func that uses "this" as the sender object in the signal / slot connection, this allows syntax like: * \code * object.connect( &Obj::signal, *targetObj, &TargetObj::onSignal ); * \endcode */ template< typename SenderFunc, typename ReceiverFunc > auto connect ( SenderFunc &&sFun, typename internal::MemberFunction::ClassType &recv, ReceiverFunc &&rFunc ) { return connect( static_cast::ClassType &>(*this), std::forward(sFun), recv, std::forward(rFunc) ); } /*! * This allows to connect a lambda to a signal in a \ref Base derived type. Make sure to track the objects used inside the slot for shared_ptr * correctness ( always own a reference to the object you are calling ) */ template< typename SenderFunc, typename ReceiverFunc, typename ...Tracker > static auto connectFunc ( typename internal::MemberFunction::ClassType &s, SenderFunc &&sFun, ReceiverFunc &&rFunc, const Tracker&...trackers ) { return std::invoke( std::forward(sFun), &s ).connect( internal::locking_fun( std::forward(rFunc), trackers... ) ); } template< typename SenderFunc, typename ReceiverFunc, typename ...Tracker > std::enable_if_t< std::is_member_function_pointer_v< SenderFunc >, connection > connectFunc ( SenderFunc &&sFun, ReceiverFunc &&rFunc, const Tracker&...trackers ) { return connectFunc( static_cast::ClassType &>(*this), std::forward(sFun), std::forward(rFunc), trackers... ); } protected: Base ( BasePrivate &dd ); std::unique_ptr d_ptr; }; template || std::is_base_of_v, bool> = true > inline decltype(auto) base_slot( Obj *o, Functor &&f ) { return Base::make_base_slot(o, std::forward(f) ); } template || std::is_base_of_v, bool> = true > inline decltype(auto) base_slot( Obj &o, Functor &&f ) { return Base::make_base_slot(&o, std::forward(f) ); } } // namespace zyppng #endif // ZYPP_NG_CORE_BASE_H_INCLUDED libzypp-17.36.5/zypp-core/zyppng/base/eventdispatcher.h000066400000000000000000000163131476576476200231540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_BASE_EVENTDISPATCHER_DEFINED #define ZYPP_BASE_EVENTDISPATCHER_DEFINED #include #include #include #include #include #include namespace zyppng { class SocketNotifier; class Timer; ZYPP_FWD_DECL_TYPE_WITH_REFS( EventDispatcher ); ZYPP_FWD_DECL_TYPE_WITH_REFS( UnixSignalSource ); class EventDispatcherPrivate; /*! * The EventDispatcher class implements the libzypp event loop native backend. * * Libzypp is using a thread local dispatcher, which means each thread has its own unique disptacher. The only special case is when * we need to work together with an already exisiting event loop, for example in a Qt application. The default implementation however * uses the glib eventloop, just like Qt and GTK, so integrating libzypp here is just a matter of passing the default main context * to the constructor of \ref EventDispatcher. */ class LIBZYPP_NG_EXPORT EventDispatcher : public Base { ZYPP_DECLARE_PRIVATE(EventDispatcher) friend class AbstractEventSource; friend class Timer; public: using Ptr = std::shared_ptr; using WeakPtr = std::shared_ptr; using IdleFunction = std::function; ~EventDispatcher() override; /*! * Enters the eventloop once and dequeues all pending events, once the event queue is empty the * function returns */ virtual bool run_once(); /*! * \brief Convenience function to schedule a callback to be called later. * \param callback a std::function that is called after all other events have been processed */ template< typename T = IdleFunction > static void invokeOnIdle ( T &&callback ) { auto ev = instance(); if ( ev ) ev->invokeOnIdleImpl( std::forward(callback) ); } /*! * Schedules a \sa std::shared_ptr to be unreferenced in the next idle phase of the * event loop. * * In some cases it might be required to delay the cleanup of a ressource until the current * event loop iteration was finished, in case there are more pending events for the ressource. * * \note Normally this should be handled by using correct shared_ptr semantics, and always owning a reference * to a object were functions are called on. Only if that is not possible unrefLater should be used. */ template< typename T > static void unrefLater ( T &&ptr ) { auto ev = instance(); if ( ev ) ev->unrefLaterImpl( std::static_pointer_cast( std::forward(ptr) ) ); } /*! * Immediately clears the list of all shared_ptr's that were registered * to be unreferenced later. Mainly used to be called when a event loop exits, otherwise we * might have weird side effects when the main loop instance preserves pointers that should be cleared * at that point already. Like child items still trying to access the parent object that was already cleaned * up before the MainLoop instance. */ void clearUnrefLaterList (); /*! * Returns the number of the currently active timers */ ulong runningTimers() const; /*! * Returns the EventDispatcher instance for the current thread. */ static std::shared_ptr instance(); /*! * Registers the given event dispatcher as the default for the current thread. The reference count for the * shared pointer will not be increased, so the application is responsible to keep it until the application exits. * \note This must be called before the default dispatcher is registered, otherwise its ignored. */ static void setThreadDispatcher ( const std::shared_ptr &disp ); /** * Returns the native dispatcher handle if the used implementation supports it * \note the glib backend will return the used glib \a GMainContext */ void *nativeDispatcherHandle () const; /*! * Waits until one of the requested events in \a events happens on the file descriptor. * Use \ref AbstractEventSource::EventTypes to define for which events should be polled. * Returns true on success, \a revents will contain the bitwise combination of \ref AbstractEventSource::EventTypes * that triggered the wakeup. */ static bool waitForFdEvent ( const int fd, int events, int &revents, int &timeout ); using WaitPidCallback = std::function; /*! * Tracks a child process until its execution did end. * Callback is called when the child exits, the callback arguments are pid and status */ void trackChildProcess ( int pid, std::function callback ); /*! * Removes a child process from the internal sources, the process will not be reaped * anymore if it is still running! * \returns true if the pid was removed */ bool untrackChildProcess ( int pid ); /*! * Returns the currently active \ref UnixSignalSource for this EventDispatcher. * It is required to keep the reference alive as long as signals need to be catched. */ UnixSignalSourceRef unixSignalSource (); protected: /*! * Create a new instance of the EventDispatcher, if \a ctx is given it is used as the new * context for the eventloop */ EventDispatcher( void *ctx = nullptr ); /*! * \see unrefLater */ void unrefLaterImpl ( std::shared_ptr &&ptr ); /*! * \see invokeOnIdle */ void invokeOnIdleImpl ( IdleFunction &&callback ); /*! * Updates or registeres a event source in the event loop * \param notifier The event source implementation that should receive the event notification * \param fd The file descriptor that is added to the internal watchlist * \param mode The watch mode for the given file desriptor \sa zyppng::AbstractEventSource::EventTypes */ virtual void updateEventSource ( AbstractEventSource ¬ifier, int fd, int mode ); /*! * Removes a file descriptor from the internal watchlist, if \a fd is set to -1 all file descriptors * associated with the \sa AbstractEventSource are removed * \param notifier The \sa AbstractEventSource parent of the file descriptor * \param fd The file descriptor to be removed, set to -1 to remove all descriptors for a \sa AbstractEventSource */ virtual void removeEventSource ( AbstractEventSource ¬ifier, int fd = -1 ); /*! * Adds a new Timer instance to the internal timer list */ virtual void registerTimer ( Timer &timer ); /*! * Removes a timer from the internal timer list, once a Timer is removed it does not fire anymore */ virtual void removeTimer ( Timer &timer ); }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/eventdispatcher_glib.cc000066400000000000000000000414701476576476200243110ustar00rootroot00000000000000#include "timer.h" #include "private/eventdispatcher_glib_p.h" #include "private/threaddata_p.h" #include #include #include #include #include namespace zyppng { static int inline readMask () { return ( G_IO_IN | G_IO_HUP ); } static int inline writeMask () { return ( G_IO_OUT ); } static int inline excpMask () { return ( G_IO_PRI ); } static int inline evModeToMask ( int mode ) { int cond = 0; if ( mode & AbstractEventSource::Read ) { cond = readMask() | G_IO_ERR; } if ( mode & AbstractEventSource::Write ) { cond = cond | writeMask() | G_IO_ERR; } if ( mode & AbstractEventSource::Exception ) { cond = cond | excpMask() | G_IO_ERR; } return cond; } static int inline gioConditionToEventTypes ( const GIOCondition rEvents, const int requestedEvs ) { int ev = 0; if ( ( rEvents & requestedEvs ) != 0 ) { if ( ( rEvents & readMask() ) && ( requestedEvs & readMask() ) ) ev = AbstractEventSource::Read; if ( ( rEvents & writeMask() ) && ( requestedEvs & writeMask() ) ) ev = ev | AbstractEventSource::Write; if ( ( rEvents & excpMask()) && ( requestedEvs & excpMask() ) ) ev = ev | AbstractEventSource::Exception; if ( ( rEvents & G_IO_ERR) && ( requestedEvs & G_IO_ERR ) ) ev = ev | AbstractEventSource::Error; } return ev; } static GSourceFuncs abstractEventSourceFuncs = { GAbstractEventSource::prepare, GAbstractEventSource::check, GAbstractEventSource::dispatch, nullptr, nullptr, nullptr }; GAbstractEventSource *GAbstractEventSource::create(EventDispatcherPrivate *ev ) { GAbstractEventSource *src = nullptr; src = reinterpret_cast(g_source_new(&abstractEventSourceFuncs, sizeof(GAbstractEventSource))); (void) new (&src->pollfds) std::vector(); src->eventSource = nullptr; src->_ev = ev; return src; } void GAbstractEventSource::destruct(GAbstractEventSource *src) { for ( GUnixPollFD &fd : src->pollfds ) { if ( fd.tag ) g_source_remove_unix_fd( &src->source, fd.tag ); } src->pollfds.clear(); src->pollfds.std::vector< GUnixPollFD >::~vector(); g_source_destroy( &src->source ); g_source_unref( &src->source ); } gboolean GAbstractEventSource::prepare(GSource *, gint *timeout) { //we can not yet determine if the GSource is ready, polling FDs also have no //timeout, so lets continue if ( timeout ) *timeout = -1; return false; } //here we need to figure out which FDs are pending gboolean GAbstractEventSource::check( GSource *source ) { GAbstractEventSource *src = reinterpret_cast( source ); //check for pending and remove orphaned entries bool hasPending = false; for ( auto fdIt = src->pollfds.begin(); fdIt != src->pollfds.end(); ) { if ( fdIt->tag == nullptr ) { //this pollfd was removed, clear it from the list //for now keep the object in the sources list if the pollfd list gets empty, if it does not register new events until //next check it is removed for good fdIt = src->pollfds.erase( fdIt ); } else { GIOCondition pendEvents = g_source_query_unix_fd( source, fdIt->tag ); if ( pendEvents & G_IO_NVAL ){ //that poll is broken, do we need to do more???? fdIt = src->pollfds.erase( fdIt ); } else { hasPending = hasPending || ( pendEvents & fdIt->reqEvents ); fdIt++; } } } //if the pollfds are empty trigger dispatch so this source can be removed return hasPending || src->pollfds.empty(); } //Trigger all event sources that have been activated gboolean GAbstractEventSource::dispatch(GSource *source, GSourceFunc, gpointer) { GAbstractEventSource *src = reinterpret_cast( source ); if ( !src ) return G_SOURCE_REMOVE; //sources are only removed here so we do not accidentially mess with the pollfd iterator in the next loop //were we trigger all ready FDs if ( src->pollfds.empty() ) { auto it = std::find( src->_ev->_eventSources.begin(), src->_ev->_eventSources.end(), src ); if ( it != src->_ev->_eventSources.end() ) { GAbstractEventSource::destruct( *it ); src->_ev->_eventSources.erase( it ); return G_SOURCE_REMOVE; } } for ( const GUnixPollFD &pollfd : src->pollfds ) { //do not trigger orphaned ones if ( pollfd.tag != nullptr ) { GIOCondition pendEvents = g_source_query_unix_fd( source, pollfd.tag ); if ( (pendEvents & pollfd.reqEvents ) != 0 ) { int ev = gioConditionToEventTypes( pendEvents, pollfd.reqEvents ); // we require all event objects to be used in shared_ptr form, by doing this we make sure that the object is not destroyed // while we still use it. However this WILL throw in case of using the EventSource outside of shared_ptr bounds auto eventSourceLocked = src->eventSource->shared_this(); eventSourceLocked->onFdReady( pollfd.pollfd, ev ); } } } return G_SOURCE_CONTINUE; } static GSourceFuncs glibTimerSourceFuncs = { GLibTimerSource::prepare, GLibTimerSource::check, GLibTimerSource::dispatch, nullptr, nullptr, nullptr }; //check when this timer expires and set the correct timeout gboolean GLibTimerSource::prepare(GSource *src, gint *timeout) { GLibTimerSource *source = reinterpret_cast( src ); if ( !source ) return false; //not ready for dispatch if ( !source->_t ) return false; uint64_t nextTimeout = source->_t->remaining(); if ( timeout ) { //this would be a really looong timeout, but be safe if ( nextTimeout > G_MAXINT ) *timeout = G_MAXINT; else *timeout = static_cast( nextTimeout ); } return ( nextTimeout == 0 ); } //this is essentially the same as prepare gboolean GLibTimerSource::check(GSource *source) { return prepare( source, nullptr ); } //emit the expired timers, restart timers that are no single shots gboolean GLibTimerSource::dispatch(GSource *src, GSourceFunc, gpointer) { GLibTimerSource *source = reinterpret_cast( src ); if ( !source ) return true; if ( source->_t == nullptr ) return true; //this will emit the expired signal and reset the timer //or stop it in case its a single shot timer source->_t->shared_this()->expire(); return true; } GLibTimerSource *GLibTimerSource::create() { GLibTimerSource *src = nullptr; src = reinterpret_cast(g_source_new(&glibTimerSourceFuncs, sizeof(GLibTimerSource))); src->_t = nullptr; return src; } void GLibTimerSource::destruct(GLibTimerSource *src) { g_source_destroy( &src->source ); g_source_unref( &src->source ); } /*! * \brief Called when the event loop is idle, here we run cleanup tasks and call later() callbacks of the user */ static gboolean eventLoopIdleFunc ( gpointer user_data ) { auto dPtr = reinterpret_cast( user_data ); if ( dPtr ) { if( dPtr->runIdleTasks() ) { return G_SOURCE_CONTINUE; } g_source_unref ( dPtr->_idleSource ); dPtr->_idleSource = nullptr; } return G_SOURCE_REMOVE; } GlibWaitPIDData::GlibWaitPIDData( GPid pid ) { source = g_child_watch_source_new( pid ); } GlibWaitPIDData::GlibWaitPIDData(GlibWaitPIDData &&other) noexcept : tag( other.tag ) , source( other.source ) , callback( std::move( other.callback ) ) { other.source = nullptr; } GlibWaitPIDData::~GlibWaitPIDData() { if ( source ) { g_source_destroy( source ); g_source_unref( source ); } } GlibWaitPIDData &GlibWaitPIDData::operator=(GlibWaitPIDData &&other) noexcept { tag = other.tag; source = other.source; callback = std::move( other.callback ); other.source = nullptr; return *this; } EventDispatcherPrivate::EventDispatcherPrivate (GMainContext *ctx , EventDispatcher &p) : BasePrivate(p) { _myThreadId = std::this_thread::get_id(); //if we get a context specified ( usually when created for main thread ) we use it //otherwise we create our own if ( ctx ) { _ctx = ctx; g_main_context_ref ( _ctx ); } else { _ctx = g_main_context_new(); } // Enable this again once we switch to a full async API that requires a eventloop before calling any zypp functions // g_main_context_push_thread_default( _ctx ); } EventDispatcherPrivate::~EventDispatcherPrivate() { std::for_each ( _runningTimers.begin(), _runningTimers.end(), []( GLibTimerSource *src ){ GLibTimerSource::destruct( src ); }); std::for_each ( _eventSources.begin(), _eventSources.end(), []( GAbstractEventSource *src ){ GAbstractEventSource::destruct( src ); }); _runningTimers.clear(); _eventSources.clear(); if ( _idleSource ) { g_source_destroy( _idleSource ); g_source_unref ( _idleSource ); } //g_main_context_pop_thread_default( _ctx ); g_main_context_unref( _ctx ); } bool EventDispatcherPrivate::runIdleTasks() { //run all user defined idle functions //if they return true, they are executed again in the next idle run decltype ( _idleFuncs ) runQueue; runQueue.swap( _idleFuncs ); while ( runQueue.size() ) { EventDispatcher::IdleFunction fun( std::move( runQueue.front() ) ); runQueue.pop(); if ( fun() ) _idleFuncs.push( std::move(fun) ); } //keep this as the last thing to call after all user code was executed if ( _unrefLater.size() ) _unrefLater.clear(); return _idleFuncs.size() || _unrefLater.size(); } void EventDispatcherPrivate::enableIdleSource() { if ( !_idleSource ) { _idleSource = g_idle_source_new (); g_source_set_callback ( _idleSource, eventLoopIdleFunc, this, nullptr ); g_source_attach ( _idleSource, _ctx ); } } std::shared_ptr EventDispatcherPrivate::create() { return std::shared_ptr( new EventDispatcher() ); } void EventDispatcherPrivate::waitPidCallback( GPid pid, gint status, gpointer user_data ) { EventDispatcherPrivate *that = reinterpret_cast( user_data ); try { auto data = std::move( that->_waitPIDs.at(pid) ); that->_waitPIDs.erase( pid ); if ( data.callback ) data.callback( pid, status ); g_spawn_close_pid( pid ); // no need to take care of releasing the GSource, the event loop took care of that } catch ( const std::out_of_range &e ) { return; } } ZYPP_IMPL_PRIVATE(EventDispatcher) EventDispatcher::EventDispatcher(void *ctx) : Base ( * new EventDispatcherPrivate( reinterpret_cast(ctx), *this ) ) { } EventDispatcher::~EventDispatcher() { } void EventDispatcher::updateEventSource( AbstractEventSource ¬ifier, int fd, int mode ) { Z_D(); if ( notifier.eventDispatcher().lock().get() != this ) ZYPP_THROW( zypp::Exception("Invalid event dispatcher used to update event source") ); AbstractEventSource *notifyPtr = ¬ifier; GAbstractEventSource *evSrc = nullptr; auto &evSrcList = d->_eventSources; auto itToEvSrc = std::find_if( evSrcList.begin(), evSrcList.end(), [ notifyPtr ]( const auto elem ){ return elem->eventSource == notifyPtr; } ); if ( itToEvSrc == evSrcList.end() ) { evSrc = GAbstractEventSource::create( d ); evSrc->eventSource = notifyPtr; evSrcList.push_back( evSrc ); g_source_attach( &evSrc->source, d->_ctx ); } else evSrc = (*itToEvSrc); int cond = evModeToMask( mode ); auto it = std::find_if( evSrc->pollfds.begin(), evSrc->pollfds.end(), [fd]( const auto &currPollFd ) { return currPollFd.pollfd == fd; }); if ( it != evSrc->pollfds.end() ) { //found it->reqEvents = static_cast( cond ); g_source_modify_unix_fd( &evSrc->source, it->tag, static_cast(cond) ); } else { evSrc->pollfds.push_back( GUnixPollFD { static_cast(cond), fd, g_source_add_unix_fd( &evSrc->source, fd, static_cast(cond) ) } ); } } void EventDispatcher::removeEventSource( zyppng::AbstractEventSource ¬ifier, int fd ) { Z_D(); AbstractEventSource *ptr = ¬ifier; if ( notifier.eventDispatcher().lock().get() != this ) ZYPP_THROW( zypp::Exception("Invalid event dispatcher used to remove event source") ); auto &evList = d->_eventSources; auto it = std::find_if( evList.begin(), evList.end(), [ ptr ]( const auto elem ){ return elem->eventSource == ptr; } ); if ( it == evList.end() ) return; auto &fdList = (*it)->pollfds; if ( fd == -1 ) { //we clear out all unix_fd watches but do not destroy the source just yet. We currently might //be in the dispatch() function of that AbstractEventSource, make sure not to break the iterator //for the fd's for ( auto &pFD : fdList ) { if ( pFD.tag ) g_source_remove_unix_fd( &(*it)->source, pFD.tag ); pFD.pollfd = -1; pFD.tag = nullptr; //mark as orphaned, do not delete the element here this might break dipatching } } else { auto fdIt = std::find_if( fdList.begin(), fdList.end(), [ fd ]( const auto &pFd ){ return pFd.pollfd == fd; } ); if ( fdIt != fdList.end() ) { if ( fdIt->tag ) g_source_remove_unix_fd( &(*it)->source, (*fdIt).tag ); //also do not remove here, mark as orphaned only to not break iterating in dispatch() fdIt->tag = nullptr; fdIt->pollfd = -1; } } } void EventDispatcher::registerTimer( Timer &timer ) { Z_D(); //make sure timer is not double registered for ( const GLibTimerSource *t : d->_runningTimers ) { if ( t->_t == &timer ) return; } GLibTimerSource *newSrc = GLibTimerSource::create(); newSrc->_t = &timer; d->_runningTimers.push_back( newSrc ); g_source_attach( &newSrc->source, d->_ctx ); } void EventDispatcher::removeTimer( Timer &timer ) { Z_D(); auto it = std::find_if( d->_runningTimers.begin(), d->_runningTimers.end(), [ &timer ]( const GLibTimerSource *src ){ return src->_t == &timer; }); if ( it != d->_runningTimers.end() ) { GLibTimerSource *src = *it; d->_runningTimers.erase( it ); GLibTimerSource::destruct( src ); } } void *EventDispatcher::nativeDispatcherHandle() const { return d_func()->_ctx; } bool EventDispatcher::waitForFdEvent( const int fd, int events , int &revents , int &timeout ) { GPollFD pollFd; pollFd.fd = fd; pollFd.events = evModeToMask(events); bool eventTriggered = false; zypp::AutoDispose timer( g_timer_new(), &g_timer_destroy ); while ( !eventTriggered ) { g_timer_start( *timer ); const int res = eintrSafeCall( g_poll, &pollFd, 1, timeout ); switch ( res ) { case 0: //timeout timeout = 0; return false; case -1: { // interrupt // if timeout is -1 we wait until eternity if ( timeout == -1 ) continue; timeout -= g_timer_elapsed( *timer, nullptr ); if ( timeout < 0 ) timeout = 0; if ( timeout <= 0 ) return false; ERR << "g_poll error: " << strerror(errno) << std::endl; return false; } case 1: eventTriggered = true; break; } } revents = gioConditionToEventTypes( (GIOCondition)pollFd.revents, evModeToMask(events) ); return true; } void EventDispatcher::trackChildProcess( int pid, std::function callback ) { Z_D(); GlibWaitPIDData data ( pid ); data.callback = std::move(callback); g_source_set_callback ( data.source, reinterpret_cast(&EventDispatcherPrivate::waitPidCallback), d_ptr.get(), nullptr ); data.tag = g_source_attach ( data.source, d->_ctx ); d->_waitPIDs.insert( std::make_pair( pid, std::move(data) ) ); } bool EventDispatcher::untrackChildProcess(int pid) { Z_D(); try { d->_waitPIDs.erase( pid ); } catch ( const std::out_of_range &e ) { return false; } return true; } UnixSignalSourceRef EventDispatcher::unixSignalSource() { Z_D(); // lazy init UnixSignalSourceRef r; if ( d->_signalSource.expired ()) { d->_signalSource = r = UnixSignalSource::create(); } else { r = d->_signalSource.lock (); } return r; } bool EventDispatcher::run_once() { return g_main_context_iteration( d_func()->_ctx, false ); } void EventDispatcher::invokeOnIdleImpl(EventDispatcher::IdleFunction &&callback) { auto d = instance()->d_func(); d->_idleFuncs.push( std::move(callback) ); d->enableIdleSource(); } void EventDispatcher::unrefLaterImpl( std::shared_ptr &&ptr ) { Z_D(); d->_unrefLater.push_back( std::move(ptr) ); d->enableIdleSource(); } void EventDispatcher::clearUnrefLaterList () { d_func()->_unrefLater.clear(); } ulong EventDispatcher::runningTimers() const { return d_func()->_runningTimers.size(); } std::shared_ptr EventDispatcher::instance() { return ThreadData::current().dispatcher(); } void EventDispatcher::setThreadDispatcher(const std::shared_ptr &disp) { ThreadData::current().setDispatcher( disp ); } } libzypp-17.36.5/zypp-core/zyppng/base/eventloop.h000066400000000000000000000050641476576476200220000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_BASE_EVENTLOOP_DEFINED #define ZYPP_BASE_EVENTLOOP_DEFINED #include #include #include // CONTINUE WITH THREAD DATA AND PUT THE DISPATCHER INSTANCE THERE! namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS ( EventDispatcher ); ZYPP_FWD_DECL_TYPE_WITH_REFS ( EventLoop ); class EventLoopPrivate; ZYPP_FWD_DECL_TYPE_WITH_REFS(EventLoop); /*! * The EventDispatcher class implements the libzypp event loop. * * A event loop is used to execute multiple tasks concurrently. This is not implemented using threads but usually by either * using Timers to poll a ressource or by reacting on events from a file descriptor or socket. * In a application like zypper where we make use of I/O heavy tasks like downloading packages, rebuilding the repo metadata * or generating a checksum over a file the application needs to wait more for those tasks to finish than actually doing anything. * By using a event loop we can start one of those tasks and let the OS handle the execution and subscribe to certain events that can happen, * utilizing more of the CPU compared to starting all the tasks serially. * */ class LIBZYPP_NG_EXPORT EventLoop : public Base { ZYPP_DECLARE_PRIVATE(EventLoop) public: using Ptr = EventLoopRef; using WeakPtr = EventLoopWeakRef; static Ptr create (); ~EventLoop() override; /*! * Start dispatching events, this function will block until \sa quit was called for the EventLoop instance */ void run (); /*! * Stop dispatching events and return control from the run function */ void quit (); /*! * Returns the event dispatcher used by the MainLoop instance */ std::shared_ptr eventDispatcher () const; private: EventLoop(); }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/eventloop_glib.cc000066400000000000000000000022441476576476200231300ustar00rootroot00000000000000#include "private/eventloop_glib_p.h" #include namespace zyppng { EventLoopPrivate::EventLoopPrivate( EventLoop &p ) : BasePrivate( p ) { } ZYPP_IMPL_PRIVATE(EventLoop) EventLoop::EventLoop() : Base ( * new EventLoopPrivate(*this) ) { Z_D(); d->_dispatcher = ThreadData::current().ensureDispatcher(); d->_loop = g_main_loop_new( reinterpret_cast(d->_dispatcher->nativeDispatcherHandle()), false ); } EventLoop::~EventLoop() { g_main_loop_unref( d_func()->_loop ); } EventLoop::Ptr EventLoop::create() { return Ptr( new EventLoop() ); } void EventLoop::run() { Z_D(); g_main_context_push_thread_default( reinterpret_cast(d->_dispatcher->nativeDispatcherHandle()) ); g_main_loop_run( d->_loop ); d->_dispatcher->clearUnrefLaterList(); g_main_context_pop_thread_default( reinterpret_cast(d->_dispatcher->nativeDispatcherHandle()) ); } void EventLoop::quit() { g_main_loop_quit( d_func()->_loop ); } std::shared_ptr EventLoop::eventDispatcher() const { return d_func()->_dispatcher; } } libzypp-17.36.5/zypp-core/zyppng/base/linuxhelpers.cc000066400000000000000000000043631476576476200226460ustar00rootroot00000000000000#include "private/linuxhelpers_p.h" #include #include #include #include #include #include #include #include namespace zyppng { bool blockAllSignalsForCurrentThread() { sigset_t set; ::sigfillset(&set); int res = ::pthread_sigmask(SIG_BLOCK, &set, NULL); return ( res == 0 ); } bool blockSignalsForCurrentThread( const std::vector &sigs ) { sigset_t set; ::sigemptyset(&set); for ( const int sig : sigs ) ::sigaddset( &set, sig ); int res = ::pthread_sigmask(SIG_BLOCK, &set, NULL); return ( res == 0 ); } bool trySocketConnection( int &sockFD, const SockAddr &addr, uint64_t timeout ) { int res = -1; const auto opStarted = zyppng::Timer::now(); do { res = zyppng::eintrSafeCall( ::connect, sockFD, addr.nativeSockAddr(), addr.size() ); if ( res < 0 && errno != ECONNREFUSED && errno != EADDRNOTAVAIL ) { ERR << "Connection failed with error: " << errno << " " << zyppng::strerr_cxx( errno ) << std::endl; ::close( sockFD ); sockFD = -1; return false; } } while ( res == -1 && zyppng::Timer::elapsedSince( opStarted ) < timeout ); return ( res == 0 ); } void renumberFd (int origfd, int newfd) { // It may happen that origfd is already the one we want // (Although in our circumstances, that would mean somebody has closed // our stdin or stdout... weird but has appened to Cray, #49797) if (origfd != newfd) { dup2 (origfd, newfd); ::close (origfd); } } int64_t bytesAvailableOnFD( int fd ) { int value = 0; if ( ioctl( fd, FIONREAD, &value) >= 0 ) return int64_t(value); return 0; } std::optional Pipe::create( int flags ) { int pipeFds[]={ -1, -1 }; #ifdef HAVE_PIPE2 if ( ::pipe2( pipeFds, flags ) != 0 ) return {}; #else if ( ::pipe( pipeFds ) != 0 ) return {}; if ( flags != 0 ) { ::fcntl( pipeFds[0], F_SETFD, flags ); ::fcntl( pipeFds[1], F_SETFD, flags ); } #endif return Pipe { .readFd = zypp::AutoFD( pipeFds[0] ), .writeFd = zypp::AutoFD( pipeFds[1] ) }; } } libzypp-17.36.5/zypp-core/zyppng/base/private/000077500000000000000000000000001476576476200212615ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/base/private/abstracteventsource_p.h000066400000000000000000000021471476576476200260430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_BASE_PRIVATE_ABSTRACTEVENTSOURCE_P_H_INCLUDED #define ZYPPNG_BASE_PRIVATE_ABSTRACTEVENTSOURCE_P_H_INCLUDED #include "base_p.h" #include namespace zyppng { class AbstractEventSourcePrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(AbstractEventSource) public: AbstractEventSourcePrivate( AbstractEventSource &p ); std::weak_ptr _ev; }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/private/base_p.h000066400000000000000000000012121476576476200226570ustar00rootroot00000000000000#ifndef ZYPP_NG_BASE_PRIVATE_BASE_P_H_INCLUDED #define ZYPP_NG_BASE_PRIVATE_BASE_P_H_INCLUDED #include #include #include #include #include namespace zyppng { class BasePrivate : public sigc::trackable { ZYPP_DECLARE_PUBLIC(Base) public: BasePrivate ( Base &b ) : z_ptr(&b){} virtual ~BasePrivate(); virtual void init (); Base::WeakPtr parent; std::unordered_set< Base::Ptr > children; Base *z_ptr = nullptr; std::thread::id threadId = std::this_thread::get_id(); }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/private/eventdispatcher_glib_p.h000066400000000000000000000053221476576476200261400ustar00rootroot00000000000000#ifndef ZYPP_BASE_EVENTDISPATCHER_GLIB_P_DEFINED #define ZYPP_BASE_EVENTDISPATCHER_GLIB_P_DEFINED #include "base_p.h" #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS ( UnixSignalSource ); struct GUnixPollFD { GIOCondition reqEvents; int pollfd = -1; gpointer tag = nullptr; }; /*! * \internal GSource for all AbstractEventSources * \attention this struct is initialized with malloc, make sure * to manually call all constructurs and destructors in the * \a create and \a destruct functions */ struct GAbstractEventSource { GSource source; EventDispatcherPrivate *_ev; AbstractEventSource *eventSource; std::vector pollfds; static gboolean prepare(GSource *, gint *timeout); static gboolean check(GSource *source); static gboolean dispatch(GSource *source, GSourceFunc, gpointer); static GAbstractEventSource *create (EventDispatcherPrivate *ev); static void destruct ( GAbstractEventSource *src ); }; /*! * \internal GSource for all Timers * \attention this struct is initialized with malloc, make sure * to manually call all constructurs and destructors in the * \a create and \a destruct functions */ struct GLibTimerSource { GSource source; Timer *_t = nullptr; static gboolean prepare(GSource *src, gint *timeout); static gboolean check(GSource *source); static gboolean dispatch(GSource *source, GSourceFunc, gpointer); static GLibTimerSource *create (); static void destruct ( GLibTimerSource *src ); }; struct GlibWaitPIDData { GlibWaitPIDData( GPid pid ); GlibWaitPIDData( GlibWaitPIDData &&other ) noexcept; ~GlibWaitPIDData(); GlibWaitPIDData & operator= ( GlibWaitPIDData &&other ) noexcept; guint tag = 0; GSource *source = nullptr; EventDispatcher::WaitPidCallback callback; }; class EventDispatcherPrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(EventDispatcher) public: EventDispatcherPrivate( GMainContext *ctx, EventDispatcher &p ); ~EventDispatcherPrivate() override; bool runIdleTasks(); void enableIdleSource (); static std::shared_ptr create ( ); static void waitPidCallback ( GPid pid, gint status, gpointer user_data ); std::thread::id _myThreadId; GMainContext *_ctx = nullptr; GSource *_idleSource = nullptr; std::vector _runningTimers; std::vector _eventSources; std::vector< std::shared_ptr > _unrefLater; std::queue< EventDispatcher::IdleFunction > _idleFuncs; std::unordered_map _waitPIDs; UnixSignalSourceWeakRef _signalSource; }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/private/eventloop_glib_p.h000066400000000000000000000007041476576476200247620ustar00rootroot00000000000000#ifndef ZYPP_BASE_EVENTLOOP_GLIB_P_DEFINED #define ZYPP_BASE_EVENTLOOP_GLIB_P_DEFINED #include "base_p.h" #include "threaddata_p.h" #include #include namespace zyppng { class EventLoopPrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(EventLoop) public: EventLoopPrivate ( EventLoop &p ); std::shared_ptr _dispatcher; GMainLoop *_loop = nullptr; }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/private/linuxhelpers_p.h000066400000000000000000000045441476576476200245020ustar00rootroot00000000000000#ifndef ZYPP_BASE_LINUXHELPERS_P_H_DEFINED #define ZYPP_BASE_LINUXHELPERS_P_H_DEFINED #include #include #include #include #include namespace zyppng { class SockAddr; inline std::string strerr_cxx ( const int err = -1 ) { ByteArray strBuf( 1024, '\0' ); strerror_r( err == -1 ? errno : err , strBuf.data(), strBuf.size() ); return std::string( strBuf.data() ); } /*! * Extended version of \ref eintrSafeCall * * Calls a given \a function in a \a EINTR safe way. The \a restartCb is * invoked after every time we have to restart \a function because of EINTR, it can be used to * reset additional errors: * \code * FILE *myFile; * // open file * // ... * eintrSafeCall( ::getline, [&](){ ::clearerr(myFile); }, myFile ); * \endcode */ template auto eintrSafeCallEx ( const Fun &function, const RestartCb &restartCb, Args&&... args ) { int res = 0; while ( true ) { errno = 0; res = std::invoke(function, args... ); if ( res == -1 && errno == EINTR ) { std::invoke( restartCb ); continue; } break; }; return res; } template auto eintrSafeCall ( Fun &&function, Args&&... args ) { return eintrSafeCallEx( std::forward(function), [](){}, std::forward(args)... ); } bool blockAllSignalsForCurrentThread ( ); bool blockSignalsForCurrentThread ( const std::vector &sigs ); bool trySocketConnection (int &sockFD, const SockAddr &addr, uint64_t timeout ); // origfd will be accessible as newfd and closed (unless they were equal) void renumberFd (int origfd, int newfd); /*! * Tries to use the FIONREAD ioctl to detect how many bytes are available on a file descriptor, * this can fail and return 0 so just use it as a indicator on how many bytes are pending */ int64_t bytesAvailableOnFD( int fd ); /*! * Small helper struct around creating a Unix pipe to ensure RAII with pipes */ struct Pipe { zypp::AutoFD readFd; zypp::AutoFD writeFd; static std::optional create ( int flags = 0 ); void unrefWrite( ) { writeFd = -1; } void unrefRead( ) { readFd = -1; } }; } #endif // LINUXHELPERS_P_H libzypp-17.36.5/zypp-core/zyppng/base/private/threaddata_p.h000066400000000000000000000016721476576476200240600ustar00rootroot00000000000000#ifndef ZYPP_BASE_THREADDATA_P_DEFINED #define ZYPP_BASE_THREADDATA_P_DEFINED #include #include #include #include namespace zyppng { class EventDispatcher; struct ThreadData { static ZYPP_API ThreadData ¤t(); template void setName( T &&name ) { _threadName = std::forward( name ); syncNativeName(); } const std::string &name() const; std::shared_ptr dispatcher(); std::shared_ptr ensureDispatcher(); void setDispatcher( const std::shared_ptr &disp ); private: void syncNativeName(); ThreadData(); private: std::thread::id _threadId; mutable std::string _threadName; ///< lazy initialized to _threadId if unset std::thread::native_handle_type _nativeHandle; std::weak_ptr _dispatcher; }; ThreadData& threadData(); } #endif libzypp-17.36.5/zypp-core/zyppng/base/signals.h000066400000000000000000000325211476576476200214230ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_BASE_SIGNALS_H_INCLUDED #define ZYPP_NG_BASE_SIGNALS_H_INCLUDED #ifdef ENABLE_SYWU #include #else #include #include #include #include #include #endif #include #include #include #include #include /*! * \file signals.h * * This file implements the signal and slot concept in libzypp. * * Signals and slots are basically a implementation of the observer pattern which makes it possible * for objects to work together without them having to know about each other by connecting the * signals of one object to the slots of another. Whenever the object owning the signal * emits said signal, all connected slots are executed. This is especially helpful in async environments * where we need to react on specific events like timers or filedescriptor events that can * happen at any time during execution. * * Using signals and slots in libzypp requires the developer to make sure * that all objects that are used in the signal chain can not be deleted * during emission, for example a Socket emitting the closed() signal might result in * its deletion. This is usually made sure by taking a reference to the sender object * via shared_ptr, e.g. the \ref EventLoop does this for all \ref AbstractEventSource 's that are * registered to receive events using shared_from_this. * * To have signals in an Object, it is recommended to subclass the Type from \ref zyppng::Base * and always have the objects in a \ref std::shared_ptr. * \ref zyppng::Base provides the \ref zyppng::Base::connect and \ref zyppng::Base::connectFunc * helpers to connect signals and slots. Connections made with those helpers will make sure the * receiving objects are properly locked. * * The \ref zyppng::Base::connect helper function can be used to connect a signal that is hosted by a \ref zyppng::Base * derived type to a slot hosted by a \ref zyppng::Base derived type. No special care needs to be taken to make sure * the receiver object is locked since the function is handling all the details about that: * \code * class Receiver : public zyppng::Base * { * public: * static std::shared_ptr create(); * void writeOnTimeout() { * std::cout << "Hello World" << std::endl; * } * } * * auto evLoop = zyppng::EventLoop::create(); * auto sender = zyppng::Timer::create(); * auto receiver = Receiver::create(); * * // invoking the static Base::connect() function will make sure receiver is locked, the sender will be locked by the * // eventloop triggering the timeout * sender->connect( *sender, &zyppng::Timer::sigExpired, *receiver, &Receiver::writeOnTimeout ); * sender->start(1000); * evLoop->run(); * \endcode * * The \ref zyppng::Base::connect helper function can be used to connect a signal that is hosted by a \ref zyppng::Base * derived type to a lambda type slot, commonly used when the developer wants to have the code that is invoked by the signal * right where the slot is connected, to make the code easier to read or when the slot code is not reused anywhere else. * * In this example the receiver object uses a slot to invoke the actual function that handles the event. Since we only connect * a lambda that invokes the writeOnTimeout function using a caputured \a this pointer we need to manually take care of locking the receiver object during the * slot invocation by passing it as a extra argument after the lambda. While the code would compile without doing that we * introduce a bug that is very hard to track down because the subsequent signal emitted from the receiver object causes it to be deleted, * making the code fail afterwards. * \code * class Receiver : public zyppng::Base * { * public: * static std::shared_ptr create(); * * void connectToTimer ( std::shared_ptr &p ) { * p->connectFunc( *sender, &zyppng::Timer::sigExpired, [ this ](){ * onTimeout(); * }, *this ); * } * * SignalProxy sigGotTimeout() { * return _sigGotTimeout; * } * * private: * void onTimeout() { * std::cout << "Hello World" << std::endl; * // emits a subsequent signal * _sigGotTimeout.emit(); * * // calls another function on this after emitting the signal * // in cases where our instance was not locked by the caller and * // a slot that received our signal released the last reference to us * // this will run into a segfault * this->doSomethingElse(); * } * void doSomethingElse() { * std::cout << "Something else" << std::endl; * } * Signal _sigGotTimeout; * } * * auto evLoop = zyppng::EventLoop::create(); * auto sender = zyppng::Timer::create(); * auto receiver = Receiver::create(); * * // invoking the static Base::connect() function will make sure receiver is locked, the sender will be locked by the * // eventloop triggering the timeout * receiver->connectToTimer( sender ); * * // release the receiver after the timeout was triggered * receiver->connectFunc( *receiver, &Receiver::sigGotTimeout, [ &receiver ](){ * // releasing the receiver Object once the timer was triggered once. If the object * // is not properly referenced during signal emission we will run into a SEGFAULT * receiver.reset(); * }); * * sender->start( 1000 ); * evLoop->run(); * \endcode */ namespace zyppng { /*! * \class Signal * Simple signal that can be invoked with the given arguments. */ template class Signal; /*! * \class MemSignal * This is a special type of signal that takes a reference to the sender * object during signal emission. This is only required in cases where * sending a signal might delete the sender and no external object holds a reference to it. */ template class MemSignal; class Base; class BasePrivate; #ifdef ENABLE_SYWU using connection = sywu::Connection; template using SignalProxyBase = sywu::SignalConceptImpl; template class Signal : public sywu::Signal { }; template class MemSignal : public sywu::MemberSignal { }; #else using connection = sigc::connection; using trackable = sigc::trackable; using sigc::track_obj; template using SignalProxyBase = sigc::signal; template class Signal : public sigc::signal { public: ~Signal() { assert(this->impl()->exec_count_ == 0); if ( this->impl()->exec_count_ > 0 ) { WAR << "Deleting Signal during emission, this is usually a BUG, Slots will be blocked to prevent SIGSEGV." << std::endl; #ifdef LIBZYPP_USE_SIGC_BLOCK_WORKAROUND // older sigc versions will segfault if clear() is called in signal emission // we use block instead in those cases which seems to have the same result // since we do not use the slot instances explicitely that _should_ not have side effects // https://bugzilla.gnome.org/show_bug.cgi?id=784550 this->block(); return; #endif } this->clear(); } }; template class MemSignal : public sigc::signal { public: MemSignal ( SignalHost &host ) : _host(host) {} ~MemSignal() { assert(this->impl()->exec_count_ == 0); if ( this->impl()->exec_count_ > 0 ) { WAR << "Deleting MemSignal during emission, this is definitely a BUG, Slots will be blocked to prevent SIGSEGV." << std::endl; #ifdef LIBZYPP_USE_SIGC_BLOCK_WORKAROUND // older sigc versions will segfault if clear() is called in signal emission // we use block instead in those cases which seems to have the same result // since we do not use the slot instances explicitely that _should_ not have side effects // https://bugzilla.gnome.org/show_bug.cgi?id=784550 this->block(); return; #endif } this->clear(); } template auto emit( Args&& ...arg ) const { auto ref = _host.shared_from_this(); return sigc::signal::emit( std::forward(arg)...); } template auto operator()( Args&& ...arg ) const { //auto ref = _host.shared_from_this(); return sigc::signal::operator()( std::forward(arg)...); } private: SignalHost &_host; }; namespace internal { /*! * Helper tool that always locks the public object in case a BasePrivate derived type * is passed. */ template inline auto lock_shared_makeLock ( const T& locker ) { try { if constexpr ( std::is_base_of_v ) { return locker.z_func()->shared_from_this(); } else { return locker.shared_from_this(); } } catch ( const std::bad_weak_ptr &e ) { ZYPP_CAUGHT( e ); ZYPP_THROW( e ); } } /*! * Adaptor that locks and tracks the given objects, this implements locking * of the receiver object in a signal chain. */ template struct lock_shared : public sigc::adapts { template decltype(auto) operator()( Args&&... args ) const { try { auto __attribute__ ((__unused__)) lck = std::apply( []( auto&... lockers ) { return std::make_tuple( lock_shared_makeLock( lockers.invoke() )... ); }, _lcks ); // seems the overloaded function templates in sigc++2 force us to fully specify the overload // we want to use. std::invoke() fails in that case. //return std::invoke( this->functor_, std::forward(args)... ); if constexpr ( sizeof... (Args) == 0 ) { return this->functor_(); } else { return this->functor_.template operator()(args) )...> ( std::forward(args)... ); } } catch ( const std::bad_weak_ptr &e ) { ZYPP_CAUGHT( e ); ERR << "Ignoring signal emit due to a bad_weak_ptr exception during object locking. Maybe the signal was sent to a object that is currently destructing?" << std::endl; #ifndef ZYPP_NDEBUG assert( false ); #endif if constexpr ( !std::is_same_v::result_type> ) return typename sigc::adapts::result_type{}; else return; } } // Constructs a my_adaptor object that wraps the passed functor. // Initializes adapts::functor_, which is invoked from operator()(). explicit lock_shared( const T_functor& functor, const Lockers&... lcks ) : sigc::adapts(functor), _lcks( lcks... ) {} std::tuple...> _lcks; }; template< typename Functor, typename ...Obj > inline decltype(auto) locking_fun( const Functor &f, const Obj&... o ) { return lock_shared( f, o...); } } #endif template class SignalProxy; /** * Hides the signals emit function from external code. * * \note based on Glibmms SignalProxy code */ template class SignalProxy { public: using SignalType = SignalProxyBase; SignalProxy ( SignalType &sig ) : _sig ( sig ) {} /** * Forwards the arguments to the internal connect function of the signal type */ template connection connect( Args&&... slot ) { return _sig.connect( std::forward(slot)... ); } private: SignalType &_sig; }; } #ifndef ENABLE_SYWU // // Specialization of sigc::visitor for lock_shared. namespace sigc { template struct visitor > { template static void do_visit_each(const T_action& action, const zyppng::internal::lock_shared& target) { sigc::visit_each(action, target.functor_); std::apply( [&]( auto&... a) { ((void)sigc::visit_each(action, a),...); }, target._lcks ); } }; } // end namespace sigc #endif #endif // ZYPP_NG_CORE_SIGNALS_H_INCLUDED libzypp-17.36.5/zypp-core/zyppng/base/socketnotifier.cc000066400000000000000000000032501476576476200231460ustar00rootroot00000000000000#include "socketnotifier.h" #include "private/abstracteventsource_p.h" namespace zyppng { class SocketNotifierPrivate : public AbstractEventSourcePrivate { ZYPP_DECLARE_PUBLIC(SocketNotifier) public: SocketNotifierPrivate ( SocketNotifier &p ) : AbstractEventSourcePrivate(p){} Signal< void (const SocketNotifier &, int)> _activated; int _socket = -1; int _mode = SocketNotifier::Read; bool _enabled = false; }; ZYPP_IMPL_PRIVATE( SocketNotifier ) SocketNotifier::SocketNotifier (int socket, int evTypes ) : AbstractEventSource ( * new SocketNotifierPrivate( *this ) ) { Z_D(); d->_socket = socket; d->_mode = evTypes; } SocketNotifier::Ptr SocketNotifier::create(int socket, int evTypes, bool enable ) { auto ptr = std::shared_ptr( new SocketNotifier( socket, evTypes ) ); ptr->setEnabled( enable ); return ptr; } void SocketNotifier::setMode(int mode) { Z_D(); if ( mode == d->_mode ) return; d->_mode = mode; if ( d->_enabled && d->_socket >= 0) updateFdWatch( d->_socket, d->_mode ); } int SocketNotifier::mode() const { return d_func()->_mode; } void SocketNotifier::setEnabled( bool enabled ) { Z_D(); if ( enabled == d->_enabled || d->_socket < 0 ) return; d->_enabled = enabled; if ( enabled ) updateFdWatch( d->_socket, d->_mode ); else removeFdWatch( -1 ); } int SocketNotifier::socket() const { return d_func()->_socket; } SignalProxy SocketNotifier::sigActivated() { return d_func()->_activated; } void SocketNotifier::onFdReady( int, int events ) { d_func()->_activated.emit( *this, events ); } void SocketNotifier::onSignal( int ) { } } libzypp-17.36.5/zypp-core/zyppng/base/socketnotifier.h000066400000000000000000000076001476576476200230130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_BASE_SOCKETNOTIFIER_H_DEFINED #define ZYPPNG_BASE_SOCKETNOTIFIER_H_DEFINED #include #include #include namespace zyppng { class SocketNotifierPrivate; /*! * The SocketNotifier class provides a generic way to monitor activity on a file descriptors. * * Once a file descriptor was created using either low level OS API or was created by a 3rd party * library, the SocketNotifier can be created to integrate the file descriptor into the event loop. * * Each file descriptor can be monitored for all types of activiy supported by the base class \sa AbstractEventSource. * * \code * // Example code that uses a pipe() to communicate between a thread and the main loop * zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create(); * * int wakeupPipe[2] = { -1, -1 }; * pipe2 ( wakeupPipe, O_NONBLOCK ); * * //listen for activity on the event source * zyppng::SocketNotifier::Ptr notifier = zyppng::SocketNotifier::create( wakeupPipe[0], zyppng::SocketNotifier::Read, false ); * notifier->sigActivated().connect([ &loop ]( const zyppng::SocketNotifier ¬ifier, int ) { * char dummy; * //read all available data * while ( read( notifier.socket(), &dummy, 1 ) > 0 ) { * std::cout<quit(); * }); * notifier->setEnabled( true ); * * std::thread t( [ &wakeupPipe ](){ * const char * test = "Some text"; * std::chrono::milliseconds dura( 1000 ); * std::this_thread::sleep_for( dura ); * write( wakeupPipe[1], test, 9 ); * std::this_thread::sleep_for( dura ); * return; * }); * * loop->run(); * * std::cout << "Bye Bye" << std::endl; * t.join(); * \endcode */ class SocketNotifier : public AbstractEventSource { ZYPP_DECLARE_PRIVATE( SocketNotifier ) public: using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; using EventTypes = AbstractEventSource::EventTypes; /*! * Returns a new SocketNotifier * \param socket this is the filedescriptor to be modified * \param evTypes the event types that should be monitored \sa AbstractEventSource::EventTypes * \param enable If set to true the notifier is enabled right away, otherwise \sa setEnabled needs to be called explicitely */ static Ptr create ( int socket, int evTypes, bool enable = true ); /*! * Update the fd watch to the \a mode specified. * \sa AbstractEventSource::EventTypes */ void setMode ( int mode ); /*! * Returns the current mode used to monitor the file descriptor * \sa AbstractEventSource::EventTypes */ int mode () const; /*! * Enables or disables the SocketNotifier */ void setEnabled ( bool enabled = true ); /*! * Returns the monitored file descriptor */ int socket () const; /*! * Emitted when there is activity on the socket according to the requested mode */ SignalProxy sigActivated(); protected: SocketNotifier( int socket, int evTypes ); // AbstractEventSource interface public: void onFdReady(int, int events) override; void onSignal(int signal) override; }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/statemachine.h000066400000000000000000000630341476576476200224330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_BASE_STATEMACHINE_INCLUDED_H #define ZYPP_NG_BASE_STATEMACHINE_INCLUDED_H #include #include #include #include #include #include #include namespace zyppng { namespace detail { template using EventSource = SignalProxy (T::*)(); /** * \internal * Internal helper type to wrap the user implemented state types. * It's mostly used to have a container for the Transitions that belong to the State. */ template < class State, class Transitions > struct StateWithTransitions { using StateType = State; Transitions _transitions; template< typename StateMachine > StateWithTransitions ( StateMachine &sm ) : _ptr ( std::make_shared( sm )) { } StateWithTransitions ( std::shared_ptr &&s ) : _ptr ( std::move(s) ) {} // move construction is ok StateWithTransitions ( StateWithTransitions &&other ) = default; StateWithTransitions &operator= ( StateWithTransitions &&other ) = default; // no copy construction StateWithTransitions ( const StateWithTransitions &other ) = delete; StateWithTransitions &operator= ( const StateWithTransitions &other ) = delete; static constexpr auto stateId = State::stateId; static constexpr bool isFinal = State::isFinal; void enter( ) { // keep the pointer around, for we might transition to the next state immediately auto keepAlive = _ptr; return keepAlive->enter( ); } void exit( ) { // keep the pointer around, for we might transition to the next state immediately auto keepAlive = _ptr; return keepAlive->exit( ); } std::shared_ptr wrappedState () { return _ptr; } const std::shared_ptr wrappedState () const { return _ptr; } private: // we need to use a std::shared_ptr here so we can correctly reference the object during signal emission std::shared_ptr _ptr; }; /** * this adds the type \a NewType to the collection if the condition is true */ template < template typename Templ , typename NewType, typename TupleType, bool condition > struct add_type_to_collection; template < template typename Templ, typename NewType, typename ...Types > struct add_type_to_collection< Templ, NewType, Templ, true > { using Type = Templ; }; template < template typename Templ, typename NewType, typename ...Types > struct add_type_to_collection< Templ, NewType, Templ, false > { using Type = Templ; }; /** * Constexpr function that evaluates to true if a variant type \a Variant already contains the type \a Type. * The \a Compare argument can be used to change how equality of a type is calculated */ template < typename Variant, typename Type, template typename Compare = std::is_same, size_t I = 0 > constexpr bool VariantHasType () { // cancel the evaluation if we entered the last type in the variant if constexpr ( I >= std::variant_size_v ) { return false; } else { // if the current type in the variant is the same as the one we are looking for evaluate to true if ( Compare< std::variant_alternative_t< I, Variant>, Type >::value ) return true; // otherwise call the next iteration with I+1 return VariantHasType(); } } /** * collect all transitions that have the same SourceState as the first type argument */ template< class State, class TupleSoFar, class Head, class ...Transitions > struct collect_transitions_helper { using NewTuple = typename add_type_to_collection< std::tuple, Head, TupleSoFar, std::is_same_v< State, typename Head::SourceType> >::Type; using Type = typename collect_transitions_helper::Type; }; template< class State, class TupleSoFar, class Head > struct collect_transitions_helper { using Type = typename add_type_to_collection< std::tuple, Head, TupleSoFar, std::is_same_v< State, typename Head::SourceType> >::Type; }; template< class State, class ...Transitions > struct collect_transitions{ using Type = typename collect_transitions_helper< State, std::tuple<>, Transitions... >::Type; }; /** * Iterates over the list of Transitions and collects them all in a std::variant type */ template struct make_state_set_helper { using WithSource = typename add_type_to_collection< std::variant, typename Head::SourceType, VariantSoFar, !VariantHasType() >::Type; using WithTarget = typename add_type_to_collection< std::variant, typename Head::TargetType, WithSource, !VariantHasType() >::Type; using Type = typename make_state_set_helper::Type; }; template struct make_state_set_helper< VariantSoFar, Head > { using WithSource = typename add_type_to_collection< std::variant, typename Head::SourceType, VariantSoFar, !VariantHasType() >::Type; using Type = typename add_type_to_collection< std::variant, typename Head::TargetType, WithSource, !VariantHasType() >::Type; }; template struct make_state_set { using InitialVariant = std::variant; using VariantSoFar = typename add_type_to_collection< std::variant, typename Head::TargetType, InitialVariant , !VariantHasType() >::Type; using Type = typename make_state_set_helper< VariantSoFar, Transitions...>::Type; }; /** * Evaluates to true if type \a A and type \a B wrap the same State type */ template struct is_same_state : public std::is_same< typename A::StateType, typename B::StateType> {}; /** * Turns a State type into its StateWithTransitions counterpart */ template struct make_statewithtransition { using Type = StateWithTransitions::Type>; }; /** * Iterates over each State in the \a StateVariant argument, collects the corresponding * Transitions and combines the results in a std::variant< StateWithTransitions<...>,... > type. */ template struct make_statewithtransition_set_helper; template struct make_statewithtransition_set_helper< VariantSoFar, std::variant, Transitions... > { using FullStateType = typename make_statewithtransition::Type; using NewVariant = typename add_type_to_collection< std::variant, FullStateType, VariantSoFar, !VariantHasType()>::Type; using Type = typename make_statewithtransition_set_helper< NewVariant, std::variant, Transitions...>::Type; }; template struct make_statewithtransition_set_helper< VariantSoFar, std::variant, Transitions... > { using FullStateType = typename make_statewithtransition::Type; using Type = typename add_type_to_collection< std::variant, FullStateType, VariantSoFar, !VariantHasType()>::Type; }; template struct make_statewithtransition_set; template struct make_statewithtransition_set< NoState, std::variant, Transitions...>{ using FirstState = typename make_statewithtransition< HeadState, Transitions...>::Type; using Type = typename make_statewithtransition_set_helper< std::variant, std::variant, Transitions...>::Type; }; } constexpr bool DefaultStateCondition(true); constexpr std::nullptr_t DefaultStateTransition(nullptr); /*! * Defines a transition between \a Source and \a Target states. * The EventSource \a ev triggers the transition from Source to Target if the condition \a Cond * evaluates to true. The operation \a Op is called between exiting the old and entering the new state. * It can be used to transfer information from the old into the new state. * * \tparam Source defines the type of the Source state * \tparam ev takes a member function pointer returning the event trigger signal that is used to trigger the transition to \a Target * \tparam Target defines the type of the Target state * \tparam Cond Defines the transition condition, can be used if the same event could trigger different transitions * based on a condition, this can also be set to a simple boolean true or false * \tparam Op defines the transition operation from Source to Target states, * this is either a function with the signature: std::unique_ptr ( Statemachine &, Source & ) * or it can be a member function pointer of Source with the signature: std::unique_ptr ( Source::* ) ( ) * * \note While it would be possible to implement the statemachine to operate only on non pointer types for the states , * I chose to use std::unique_ptr instead to make the handling of States with signals less error prone. Because even move * assigning a signal that has connected lambda slots which have captured the this pointer will break the code. While it could * be worked around to connect and disconnect signals in the enter() and exit() functions not doing so would crash the code. Leaving that * note here in case we want to change that behaviour in the future. */ template < typename Source, detail::EventSource ev , typename Target, auto Cond = DefaultStateCondition, auto Op = DefaultStateTransition > struct Transition { using SourceType = Source; using TargetType = Target; template< typename Statemachine > std::shared_ptr operator() ( Statemachine &sm, Source &oldState ) { using OpType = std::decay_t; // check if we have a member function pointer if constexpr ( std::is_member_function_pointer_v ) { return std::invoke( Op, &oldState ); } else if constexpr ( std::is_null_pointer_v ) { return std::make_shared(sm); } else { return std::invoke( Op, sm, oldState ); } } bool checkCondition ( Source ¤tState ) { using CondType = std::decay_t; if constexpr ( std::is_same_v ) { return Cond; } else if constexpr ( std::is_member_function_pointer_v ) { return std::invoke( Cond, ¤tState ); } else { return std::invoke( Cond, currentState ); } } SignalProxy< void() > eventSource ( Source *st ) { return std::invoke( ev, st ); } auto eventAccessor () const { return ev; } }; /*! * \brief This defines the actual StateMachine. * \tparam Derived is the Statemachine subclass type, this is used to pass a reference to the actual implementation into the State functions. * \tparam StateId should be a enum with a ID for each state the SM can be in. * \tparam Transitions variadic template argument taking a list of all \ref Transition types the statemachine should support. * The First Source State in the Transitions List is always the initial state. * * Implementation of a simple signal based statemachine, each state is a user defined state type that has to implement a specific API in order to be compatible. * No inheritance is required to use the statemachine and everything will be resolved at compile time. * * This is how a basic statemachine implementation would look like * * \code * * // Each state should have a representation in the enum * enum States { * StateA, * StateB, * ... * } * * class MyStateMachine; * class State; * class StateB; * class StateC; * class StateD; * * // states are just simple types with a few required functions, there is a helper class * // SimpleState<> to help with the implementation * class StateA { * * // the ID of the state * static constexpr auto stateId = States::StateA; * * // is this a final state? * static constexpr bool isFinal = false; * * // constructor taking the parent statemachine type * StateA ( MyStateMachine &parent ) {} * * // function called when the state is first entered * void enter() {} * * // function called when the state is exited * void exit () {} * * // a state that is not final needs event sources * SignalProxy sigTransition (); * * // a state might even define a transition function to the target states * std::unique_ptr transitionToB (); * * // also condition functions can be defined in a state: * bool transitionToStateBCondition() const; * } * * // transition functions can also be defined as free functions or static member functions with the signature: * std::unique_ptr transitionStateBToStateC ( MyStateMachine &sm, StateB &oldState ); * * // condition functions can also be defined as free functions or static member functions with the signature: * bool transitionStateAToStateDCondition( State ¤tState ); * * * // implementing the statemachine itself, using a template helper for better readability: * template * using SmBase = zyppng::Statemachine, * zyppng::Transition< StateB, &StateB::sigTransition, StateD >>; * * // by using CRTP we can have a reference to the concrete Statemachine type in the States, allowing us to be much * // more flexible with the implementation, since all states can now access API exported by the MyStateMachine type. * // since the Statemachine uses signals, make sure to derive it also from the \ref zyppng::Base type. * class MyStateMachine : public SmBase, public Base { }; * * \endcode * * In order to advance the statemachine, each state will have at least one signal ( event ) that tells the statemachine to transition to the next state, optionally * a condition can be used to block the transition in certain cases. When transitioning from one state to the other a transition operation will be called that * creates the instance of the target state and do other initializations or can move data from the old to the new state. The default version of the operation just * returns a new instance of the target state. * If a signal or event is used multiple times to trigger transitions, only the first transition whose condition evaluates to true will be triggered. All other transitions * with the same trigger signal will not be even evaluated. * * After instantiating the statemachine will be in a internal intial state, in order to move to the first user defined state \ref Statemachine::start must be called. */ template < typename Derived, typename StateId, typename ...Transitions > class Statemachine { struct _InitialState{}; public: using AllStates = typename detail::make_state_set< Transitions... >::Type; using StateSetHelper = typename detail::make_statewithtransition_set< _InitialState, AllStates, Transitions... >; using FState = typename StateSetHelper::FirstState; using StateSet = typename StateSetHelper::Type; using StatemachineType = Statemachine< Derived, StateId, Transitions...>; public: Statemachine () { } virtual ~Statemachine() {} /*! * Advances the state machine into the initial state. */ void start () { if ( _state.index() == 0 || _isInFinalState ) { _previousState.reset(); _isInFinalState = false; _emittedFinalSig = false; enterState( FState( static_cast(*this) ) ); } } template auto visitState ( Func && f ) { return std::visit( [ func = std::forward(f) ] ( auto &s ) { using T = std::decay_t; if constexpr ( std::is_same_v< T, _InitialState > ) { throw std::exception(); } else { auto lock = s.wrappedState(); return ( func( *lock ) ); } }, _state ); } /*! * Returns the current stateId of the state the SM is currently in. * If called before start() was called the std::optional will be empty */ std::optional currentState () const { return std::visit( []( const auto &s ) -> std::optional { using T = std::decay_t; if constexpr ( std::is_same_v< T, _InitialState > ) { return {}; } else { return T::stateId; } }, _state ); } /*! * Returns the ID of the previous state, or a invalid optional if there * was no previous state. */ std::optional previousState () const { return _previousState; } /*! * Returns a reference to the current state object, will throw a exception * if the passed state type does not match the current states type. */ template std::shared_ptr state () { using WrappedEventType = typename detail::make_statewithtransition< std::decay_t, Transitions...>::Type; return std::get( _state ).wrappedState(); } /*! * Returns a reference to the current state object, will throw a exception * if the passed state type does not match the current states type. */ template const std::shared_ptr state () const { using WrappedEventType = typename detail::make_statewithtransition< std::decay_t, Transitions...>::Type; return std::get( _state ).wrappedState(); } /*! * Forces the statemachine to enter a specific state, a transition operation will not * be executed, but the exit() function of the current state will be called. */ template void forceState ( std::unique_ptr &&nS ) { using WrappedSType = typename detail::make_statewithtransition< std::decay_t, Transitions...>::Type; std::visit( [this, &nS]( auto &currState ) { using T = std::decay_t; if constexpr ( std::is_same_v< T, WrappedSType > ) { return; } else if constexpr ( std::is_same_v< T, _InitialState > ) { enterState ( WrappedSType( std::move(nS) ) ); } else { enterState ( currState, WrappedSType( std::move(nS) ) ); } }, _state ); } /*! * Emitted when the statemachine enters a type that has final set to true. */ SignalProxy sigFinished () { return _sigFinished; } /*! * Emitted everytime the statemachine advanced to a new state, carrying the * new state's ID. * \note this signal is emitted before State::enter() is executed, the State object * however is already created and can be accessed via \ref Statemachine::state() */ SignalProxy sigStateChanged () { return _sigStateChanged; } protected: template void enterState ( OldState &os, NewState &&nS ) { // disconnect all signals from the current state clearConnections(); std::forward(os).exit(); _previousState = OldState::stateId; enterState( std::forward(nS) ); } template void enterState ( NewState &&nS ) { if constexpr ( !NewState::isFinal ) { connectAllTransitions<0>( nS, nS._transitions ); } _state.template emplace( std::forward(nS) ); // handle final state things if constexpr ( NewState::isFinal ) { _isInFinalState = true; _emittedFinalSig = false; } // let the outside world know whats going on _sigStateChanged.emit( NewState::stateId ); // call enter on the state as the last thing to do, it might emit a transition event right away std::get< std::decay_t >( _state ).enter(); // emit the final signal, but only if it was not already emitted by a subsequent transition if ( _isInFinalState && !_emittedFinalSig ) { _emittedFinalSig = true; _sigFinished.emit(); } } template auto makeEventCallback ( Transition &transition ) { using WrappedEventType = typename detail::make_statewithtransition< typename Transition::TargetType, Transitions...>::Type; return [ mytrans = &transition, this]() mutable { auto stateLock = std::get< std::decay_t >(_state).wrappedState(); if ( mytrans->checkCondition( *stateLock ) ) { auto &st = std::get< std::decay_t >(_state); enterState( st , WrappedEventType( (*mytrans)( static_cast(*this), *stateLock ) ) ); } }; } template< std::size_t I = 0, typename State, typename ...StateTrans> void connectAllTransitions( State &&nS, std::tuple &transitions ) { if constexpr (I >= sizeof...(StateTrans)) { return; } else { auto &transition = std::get( transitions ); //_currentStateConnections.push_back( transition.eventSource ( std::forward(nS).wrappedState().get() ).connect( makeEventCallback< std::decay_t >(transition)) ); _currentStateConnections.push_back( std::forward(nS).wrappedState()->Base::connectFunc( transition.eventAccessor(), makeEventCallback< std::decay_t >(transition), *static_cast(this) ) ); connectAllTransitions( std::forward(nS), transitions ); } } void clearConnections () { for ( auto &c : _currentStateConnections ) c.disconnect(); _currentStateConnections.clear(); } private: bool _isInFinalState = false; bool _emittedFinalSig = false; //< Flag to make sure the finished signals is only emitted once Signal _sigStateChanged; Signal _sigFinished; StateSet _state = _InitialState(); std::optional _previousState; std::vector _currentStateConnections; }; /*! * Implements the most basic parts of a State, * the functions enter() and exit() still need to be implemented in the base class */ template < typename StatemachineType, bool isFin > class BasicState : public Base { public: static constexpr bool isFinal = isFin; BasicState( StatemachineType &sm ) : _sm( sm ){} ~BasicState() override {} BasicState( BasicState && ) noexcept = default; BasicState &operator= ( BasicState && ) noexcept = default; StatemachineType &stateMachine () { return _sm; } const StatemachineType &stateMachine () const { return _sm; } private: StatemachineType &_sm; }; /*! * Helper type that also includes the State ID, in more complex state machines * utilizing subclassing in their State objects, * it might be desireable to have the State ID in the final class implementation */ template < typename StatemachineType, auto sId, bool isFin > class SimpleState : public BasicState { public: static constexpr auto stateId = sId; using BasicState::BasicState; }; } #endif // ZYPP_NG_BASE_STATEMACHINE_INCLUDED_H libzypp-17.36.5/zypp-core/zyppng/base/threaddata.cc000066400000000000000000000032231476576476200222170ustar00rootroot00000000000000#include "private/threaddata_p.h" #include "private/eventdispatcher_glib_p.h" #include #include //for std::endl #include #include namespace zyppng { ThreadData::ThreadData() : _threadId( std::this_thread::get_id() ), _nativeHandle( pthread_self() ) { } ThreadData &ThreadData::current() { static thread_local ThreadData data; return data; } const std::string &ThreadData::name() const { if ( _threadName.empty() ) { std::stringstream strStr; strStr << _threadId; _threadName = strStr.str(); } return _threadName; } std::shared_ptr ThreadData::ensureDispatcher() { auto sp = _dispatcher.lock(); if (!sp) { MIL << "Creating the Event Dispatcher for thread: " << name() << "("<<_threadId<<")" << std::endl; _dispatcher = sp = EventDispatcherPrivate::create(); } return sp; } void ThreadData::setDispatcher( const std::shared_ptr &disp ) { if ( _dispatcher.lock() ) { WAR << "Dispatcher was already created for the current thread" << std::endl; return; } _dispatcher = disp; } void ThreadData::syncNativeName() { // length is restricted to 16 characters, including the terminating null byte ('\0') pthread_setname_np( _nativeHandle, name().substr(0,15).c_str() ); } std::shared_ptr ThreadData::dispatcher() { auto sp = _dispatcher.lock(); if (!sp) { MIL << "Requested Event Dispatcher for thread: " << name() << "("<<_threadId<<") but none was created." << std::endl; } return sp; } } // namespace zyppng libzypp-17.36.5/zypp-core/zyppng/base/timer.cc000066400000000000000000000065771476576476200212550ustar00rootroot00000000000000#include "timer.h" #include "private/base_p.h" #include "eventdispatcher.h" #include #include #include namespace zyppng { using namespace zypp; class TimerPrivate : BasePrivate { ZYPP_DECLARE_PUBLIC(Timer) public: TimerPrivate(Timer &p); TimerPrivate(const TimerPrivate &) = delete; TimerPrivate(TimerPrivate &&) = delete; TimerPrivate &operator=(const TimerPrivate &) = delete; TimerPrivate &operator=(TimerPrivate &&) = delete; ~TimerPrivate() override; uint64_t _beginMs = 0; uint64_t _requestedTimeout = 0; std::weak_ptr _ev; bool _isRunning = false; Signal< void (Timer &t)> _expired; bool _singleShot = false; }; ZYPP_IMPL_PRIVATE(Timer) TimerPrivate::TimerPrivate(Timer &p) : BasePrivate(p) { auto ev = EventDispatcher::instance(); if ( !ev ) ZYPP_THROW( zypp::Exception( "Creating timers without a EventDispatcher instance is not supported" ) ); _ev = ev; } TimerPrivate::~TimerPrivate() {} std::shared_ptr Timer::create() { return std::shared_ptr( new Timer() ); } Timer::~Timer() { stop(); } void Timer::setSingleShot(bool singleShot) { d_func()->_singleShot = singleShot; } bool Timer::singleShot() const { return d_func()->_singleShot; } uint64_t Timer::now() { return static_cast( g_get_monotonic_time () / 1000 ); #if 0 timespec now{0 ,0}; if ( clock_gettime( CLOCK_MONOTONIC_RAW, &now ) ) { WAR << "Unable to get current monotonic time, timers will not work" << std::endl; return 1; } return ( uint(now.tv_sec) * 1000 ) + uint( now.tv_nsec * 1e-6 ); #endif } uint64_t Timer::elapsedSince( const uint64_t start ) { uint64_t nowMs = now(); return ( nowMs - start ); } uint64_t Timer::started() const { return d_func()->_beginMs; } uint64_t Timer::interval() const { return d_func()->_requestedTimeout; } uint64_t Timer::remaining() const { Z_D(); uint64_t elapsed = this->elapsed(); if ( elapsed >= d->_requestedTimeout ) return 0; return ( d->_requestedTimeout - elapsed ); } uint64_t Timer::elapsed() const { Z_D(); return elapsedSince( d->_beginMs ); } uint64_t Timer::expires() const { return d_func()->_beginMs + d_func()->_requestedTimeout; } SignalProxy Timer::sigExpired() { return d_func()->_expired; } uint64_t Timer::expire() { Z_D(); //@FIXME, we should not rely on this, maybe a "deleteLater" feature //in the MainLoop? //make sure timer is not deleted during signal emission auto lock = shared_from_this(); auto exp = remaining(); if ( exp == 0 ) { if ( d->_singleShot ) stop(); else d->_beginMs = now(); d->_expired.emit( *this ); } return exp; } bool Timer::isRunning() const { return d_func()->_isRunning; } void Timer::start() { start ( d_func()->_requestedTimeout ); } void Timer::start( uint64_t timeout ) { Z_D(); d->_requestedTimeout = timeout; d->_beginMs = now(); if ( !d->_isRunning ) { auto ev = d->_ev.lock(); //if ev is null we are shutting down if ( !ev ) return; ev->registerTimer( *this ); d->_isRunning = true; } } void Timer::stop() { Z_D(); if ( !d->_isRunning ) return; auto ev = d->_ev.lock(); //event loop might be shutting down if ( ev ) ev->removeTimer( *this ); d->_isRunning = false; } Timer::Timer() : Base ( *new TimerPrivate( *this ) ) { } } libzypp-17.36.5/zypp-core/zyppng/base/timer.h000066400000000000000000000077541476576476200211150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_BASE_TIMER_H_INCLUDED #define ZYPP_NG_BASE_TIMER_H_INCLUDED #include #include #include #include namespace zyppng { class TimerPrivate; class EventDispatcher; ZYPP_FWD_DECL_TYPE_WITH_REFS (Timer); /*! * \brief The Timer class provides repetitive and single-shot timers. * * Provides a high level interface for timers. To use it, create a Timer and * connect a slot to its \sa sigExpired signal. * * \code * zyppng::Timer::Ptr t1 = zyppng::Timer::create(); * t1->sigExpired().connect( sigc::mem_fun(this, &HandlerClass::timeout) ); * t1->start(1000); * \endcode * * The timeout slot will now be called every second. * * \note The accuracy of the timer should be around 1ms , but also depends on the underlying hardware. */ class Timer : public Base { ZYPP_DECLARE_PRIVATE(Timer) friend class EventDispatcher; public: using Ptr = std::shared_ptr; using WeakPtr = std::shared_ptr; /*! * \brief Creates a new Timer object, the timer is not started at this point */ static std::shared_ptr create (); ~Timer () override; /*! * \brief Sets the timer to trigger only once, after it has expired once * \sa start needs to be called again */ void setSingleShot ( bool singleShot = true ); /*! * \returns true if the timer is a single shot timer */ bool singleShot () const; /*! * \returns The current monotonic system time in milliseconds */ static uint64_t now (); /*! * \return the time that has elapsed since the timepoint given in \a start */ static uint64_t elapsedSince ( const uint64_t start ); /*! * \returns the monotonic system time when the timer started */ uint64_t started () const; /*! * \returns the requested interval in milliseconds */ uint64_t interval () const; /*! * \returns the remaining time until the timer expires in milliseconds */ uint64_t remaining () const; /*! * \return the time that has elapsed since the last call to \a start in milliseconds */ uint64_t elapsed () const; /*! * \returns the monotonic system time in ms when the timer is about to expire */ uint64_t expires () const; /*! * \brief Advances the internal clock of the timer, if the timer expires the \a sigExpired signal is emitted * * \returns the monotonic system time in ms when the timer is about to expire * \note There should not be any reason to call this manually, the \sa EventDispatcher is taking care of that */ uint64_t expire (); /*! * \returns if the timer is currently active */ bool isRunning ( ) const; /*! * Starts the timer, if the timer is already running this will restart the currently running timer */ void start ( ); /*! * \brief Starts the timer, if the timer is already running this will restart the currently running timer * \param timeout the new timeout in ms */ void start ( uint64_t timeout ); /*! * \brief Stops the timer if it is running. The \sa sigExpired signal will not emit until \sa start was called again. */ void stop (); /*! * \brief This signal is always emitted when the timer expires. */ SignalProxy sigExpired (); protected: Timer (); }; } #endif libzypp-17.36.5/zypp-core/zyppng/base/unixsignalsource.cpp000066400000000000000000000102341476576476200237150ustar00rootroot00000000000000#include "unixsignalsource.h" #include "private/abstracteventsource_p.h" #include #include #include #include #include #include namespace zyppng { class UnixSignalSourcePrivate : public AbstractEventSourcePrivate { ZYPP_DECLARE_PUBLIC(UnixSignalSource) public: UnixSignalSourcePrivate( UnixSignalSource &p ) : AbstractEventSourcePrivate(p) { ::sigemptyset ( &_orgSigMask ); pthread_sigmask (SIG_SETMASK, nullptr, &_orgSigMask); } sigset_t _orgSigMask; zypp::AutoFD _signalFd; std::unordered_map _signalRefCount; Signal _sigReceived; }; ZYPP_IMPL_PRIVATE (UnixSignalSource); UnixSignalSource::UnixSignalSource() : AbstractEventSource( *(new UnixSignalSourcePrivate(*this)) ) { } UnixSignalSource::~UnixSignalSource() { Z_D(); // restore the original sigmask pthread_sigmask (SIG_SETMASK, &d->_orgSigMask, nullptr); } UnixSignalSourceRef UnixSignalSource::create() { return UnixSignalSourceRef( new UnixSignalSource() ); } bool UnixSignalSource::addSignal(int signum ) { Z_D(); if ( d->_signalRefCount.count(signum) != 0 && d->_signalRefCount[signum] > 0 ) { // we already handle this signal, just increase refcount d->_signalRefCount[signum]++; } else { const auto &handleError = [&]() { d->_signalRefCount.erase ( signum ); return false; }; // add the signal to our map d->_signalRefCount[signum] = 1; sigset_t sigMask; sigemptyset (&sigMask ); // add all the signals we monitor to our set so we can update the signalfd correctly for ( const auto &sig : d->_signalRefCount ) { sigaddset(&sigMask, sig.first); } // signalfd signals should be blocked // man page says: The set of blocked signals is the union of the current set and the set argument. // so we should not accidentially delete other blocks done by the application if (pthread_sigmask (SIG_BLOCK, &sigMask, NULL) == -1) { return handleError(); } // set or update our signal fd zypp::AutoFD aFd = signalfd ( d->_signalFd, &sigMask, SFD_NONBLOCK | SFD_CLOEXEC ); if ( aFd == -1 ){ return handleError(); } if ( d->_signalFd != aFd ) { d->_signalFd = aFd; } else { aFd.resetDispose (); } updateFdWatch ( aFd, AbstractEventSource::Read ); } return true; } bool UnixSignalSource::removeSignal(int signum ) { Z_D(); if ( !d->_signalRefCount.count(signum) || d->_signalRefCount[signum] == 0 ) { return true; } d->_signalRefCount[signum]--; if ( d->_signalRefCount[signum] <= 0 ) { d->_signalRefCount.erase(signum); // remove the signal from our fd sigset_t sigMask; sigemptyset ( &sigMask ); for ( const auto &sig : d->_signalRefCount ) { sigaddset(&sigMask, sig.first); } auto res = signalfd ( d->_signalFd, &sigMask, SFD_NONBLOCK | SFD_CLOEXEC ); if ( res == -1 ) { WAR << "Failed to update signalfd with errno: " << zypp::Errno() << std::endl; return false; } // unblock the signal sigemptyset ( &sigMask ); sigaddset(&sigMask, signum); pthread_sigmask(SIG_UNBLOCK, &sigMask, NULL); } if ( d->_signalRefCount.size () == 0 ) { removeFdWatch ( d->_signalFd ); d->_signalFd = -1; } return true; } SignalProxy UnixSignalSource::sigReceived() { return d_func()->_sigReceived; } void zyppng::UnixSignalSource::onFdReady( int fd, int events ) { Z_D(); struct signalfd_siginfo sfd_si; if ( read(fd, &sfd_si, sizeof(sfd_si)) == -1 ) { WAR << "Failed to read from signalfd" << std::endl; return; } if ( d->_signalRefCount.count ( sfd_si.ssi_signo )) d->_sigReceived.emit( sfd_si.ssi_signo ); else WAR << "Received unexpected UNIX signal on signalFD: " << sfd_si.ssi_signo << std::endl; } void zyppng::UnixSignalSource::onSignal( int signal ) {} } // namespace zyppng libzypp-17.36.5/zypp-core/zyppng/base/unixsignalsource.h000066400000000000000000000015161476576476200233650ustar00rootroot00000000000000#ifndef ZYPPNG_UNIXSIGNALSOURCE_H #define ZYPPNG_UNIXSIGNALSOURCE_H #include "abstracteventsource.h" namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS ( UnixSignalSource ); ZYPP_FWD_DECL_TYPE_WITH_REFS ( EventDispatcher ); class UnixSignalSourcePrivate; class UnixSignalSource : public AbstractEventSource { ZYPP_DECLARE_PRIVATE(UnixSignalSource) public: ~UnixSignalSource() override; bool addSignal( int signum ); bool removeSignal( int signum ); SignalProxy sigReceived(); protected: // AbstractEventSource interface void onFdReady(int fd, int events) override; void onSignal(int signal) override; private: friend class EventDispatcher; static UnixSignalSourceRef create (); UnixSignalSource(); }; } // namespace zyppng #endif // ZYPPNG_UNIXSIGNALSOURCE_H libzypp-17.36.5/zypp-core/zyppng/base/zyppglobal.h000066400000000000000000000151101476576476200221410ustar00rootroot00000000000000#ifndef ZYPP_NG_BASE_ZYPPGLOBAL_H_INCLUDED #define ZYPP_NG_BASE_ZYPPGLOBAL_H_INCLUDED #include #include #ifndef EXPORT_EXPERIMENTAL_API #define LIBZYPP_NG_EXPORT #define LIBZYPP_NG_NO_EXPORT #else #include #endif /* * Convenience helpers to automatically generate boilerplate code * for pimpl classes. * * Libzypp is using the PIMPL pattern to ensure binary compatiblity between * different version releases. This keeps rebuilds of applications * that link against libzypp to a minimum. A PIMPL class simply hides the * data members and functions that are not part of the public API/ABI in a * hidden private class, that is only accessible in the implementation files. * This allows even bigger refactorings to happen behind the scenes. * * A simple example would be: * * \code * * // MyClass.h * * // forward declare the private class, always use the public classname * // with a "Private" postfix: * class MyClassPrivate; * * class MyClass * { * public: * // add all public API functions here * void doSomething(); * int getSomething() const; * private: * // generate the forward declarations for the pimpl access functions * ZYPP_DECLARE_PRIVATE(MyClass) * // the only data member in the public class should be a pointer to the private type * // named d_ptr * std::unique_ptr d_ptr; * }; * * // MyClass.cc * * // in the implementation file we can now define the private class: * class MyClassPrivate * { * public: * // add the data members and private functions here * int something = 0; * }; * * // in the constructor make sure that the private part of the class * // is initialized too * MyClass::MyClass() : d_ptr( new MyClassPrivate ) * {} * * int MyClass::getSomething() const * { * // automatically generates a pointer named "d" to the * // pimpl object * Z_D(); * return d->something; * } * * void MyClass::doSomething() * { * // It is also possible to use the d_func() to access the pointer: * d_func()->something = 10; * } * * \endcode * * \note those macros are inspired by the Qt framework */ template inline T *zyppGetPtrHelper(T *ptr) { return ptr; } template inline auto zyppGetPtrHelper(const Ptr &ptr) -> decltype(ptr.operator->()) { return ptr.operator->(); } template inline auto zyppGetPtrHelper(Ptr &ptr) -> decltype(ptr.operator->()) { return ptr.operator->(); } #define ZYPP_DECLARE_PRIVATE(Class) \ Class##Private* d_func();\ const Class##Private* d_func() const; \ friend class Class##Private; #define ZYPP_IMPL_PRIVATE(Class) \ Class##Private* Class::d_func() \ { return static_cast(zyppGetPtrHelper(d_ptr)); } \ const Class##Private* Class::d_func() const \ { return static_cast(zyppGetPtrHelper(d_ptr)); } #define ZYPP_DECLARE_PUBLIC(Class) \ public: \ inline Class* z_func() { return static_cast(z_ptr); } \ inline const Class* z_func() const { return static_cast(z_ptr); } \ friend class Class; \ private: #define Z_D() auto const d = d_func() #define Z_Z() auto const z = z_func() namespace zyppng { template using Ref = std::shared_ptr; template using WeakRef = std::weak_ptr; } /*! * Helper macro to declare Ref types */ #define ZYPP_FWD_DECL_REFS(T) \ using T##Ref = Ref; \ using T##WeakRef = WeakRef /* * Helper Macro to forward declare types and ref types */ #define ZYPP_FWD_DECL_TYPE_WITH_REFS(T) \ class T; \ ZYPP_FWD_DECL_REFS(T) #define ZYPP_FWD_DECL_TEMPL_TYPE_WITH_REFS_ARG1(T, TArg1) \ template< typename TArg1> \ class T; \ template< typename TArg1> \ using T##Ref = Ref>; \ template< typename TArg1> \ using T##WeakRef = WeakRef> //@TODO enable for c++20 #if 0 #define ZYPP_FWD_DECL_TEMPL_TYPE_WITH_REFS(T, TArg1, ...) \ template< typename TArg1 __VA_OPT__(, typename) __VA_ARGS__ > \ class T; \ template< typename TArg1 __VA_OPT__(, typename) __VA_ARGS__ > \ using T##Ref = std::shared_ptr>; \ template< typename TArg1 __VA_OPT__(, typename) __VA_ARGS__ > \ using T##WeakRef = std::weak_ptr> #endif /*! * Defines a dummy struct that can be used to make a public constructor unusable * outside the class. \sa ZYPP_ADD_CREATE_FUNC. */ #define ZYPP_ADD_PRIVATE_CONSTR_HELPER() \ struct private_constr_t { private_constr_t () noexcept = default; } /*! * Use this to add the private constr argument to a constructor */ #define ZYPP_PRIVATE_CONSTR_ARG \ private_constr_t /*! * Use this to pass the private constr arg to a constructor */ #define ZYPP_PRIVATE_CONSTR_ARG_VAL \ private_constr_t{} /*! * Helper macro to add the default Class::create() static function * commonly used in libzypp. * * \code * * // always forward declare the Ref types so they can be used in the class * ZYPP_FWD_DECL_TYPE_WITH_REFS(MyClass) * * class MyClass * { * // this adds the construct template function * ZYPP_ADD_CREATE_FUNC(MyClass) * * public: * // adds a constructor that takes no args: * // MyClass::create(); * ZYPP_DECL_PRIVATE_CONSTR(MyClass) * * // adds a constructor with two arguments * // MyClass::create( 10, "Hello"); * ZYPP_DECL_PRIVATE_CONSTR_ARGS(MyClass, int arg1, const std::string &label) * } * * ZYPP_IMPL_PRIVATE_CONSTR( MyClass ) { * // do stuff * } * * ZYPP_IMPL_PRIVATE_CONSTR_ARGS( MyClass, int arg1, const std::string &label ) { * // do stuff with args * } * * \endcode * \note requires the ref types for the class to be already defined * \TODO Add this to already existing objects */ #define ZYPP_ADD_CREATE_FUNC(Class) \ private: \ ZYPP_ADD_PRIVATE_CONSTR_HELPER(); \ public: \ template < typename ...Args > \ inline static auto create ( Args &&... args ) { \ return std::make_shared< Class >( private_constr_t{}, std::forward(args)... ); \ } \ private: /* * Convenience macros to implement public but private constructors that can be called from Class::create() but * not by user code. * * \sa ZYPP_ADD_CONSTR_FUNC */ #define ZYPP_DECL_PRIVATE_CONSTR(Class) Class( private_constr_t ) #define ZYPP_IMPL_PRIVATE_CONSTR(Class) Class::Class( private_constr_t ) #define ZYPP_DECL_PRIVATE_CONSTR_ARGS(Class,...) Class( private_constr_t, __VA_ARGS__ ) #define ZYPP_IMPL_PRIVATE_CONSTR_ARGS(Class,...) Class::Class( private_constr_t, __VA_ARGS__ ) #define ZYPP_NODISCARD [[nodiscard]] #endif libzypp-17.36.5/zypp-core/zyppng/core/000077500000000000000000000000001476576476200176255ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/core/ByteArray000066400000000000000000000000271476576476200214510ustar00rootroot00000000000000#include "bytearray.h" libzypp-17.36.5/zypp-core/zyppng/core/Env000066400000000000000000000000211476576476200202710ustar00rootroot00000000000000#include "env.h" libzypp-17.36.5/zypp-core/zyppng/core/IdString000066400000000000000000000000261476576476200212710ustar00rootroot00000000000000#include "idstring.h" libzypp-17.36.5/zypp-core/zyppng/core/String000066400000000000000000000000241476576476200210120ustar00rootroot00000000000000#include "string.h" libzypp-17.36.5/zypp-core/zyppng/core/Url000066400000000000000000000000211476576476200203030ustar00rootroot00000000000000#include "url.h" libzypp-17.36.5/zypp-core/zyppng/core/bytearray.h000066400000000000000000000016311476576476200220010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_CORE_BYTEARRAY_H_INCLUDED #define ZYPP_NG_CORE_BYTEARRAY_H_INCLUDED #include namespace zyppng { using ByteArray = zypp::ByteArray; using UByteArray = zypp::UByteArray; } #endif libzypp-17.36.5/zypp-core/zyppng/core/env.h000066400000000000000000000015261476576476200205720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #ifndef ZYPP_NG_CORE_ENV_H_INCLUDED #define ZYPP_NG_CORE_ENV_H_INCLUDED namespace zypp { /// Namespace intended to collect all environment variables we use namespace env {} } namespace zyppng { namespace env = zypp::env; } #endif // ZYPP_NG_CORE_ENV_H_INCLUDED libzypp-17.36.5/zypp-core/zyppng/core/idstring.h000066400000000000000000000014471476576476200216270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #ifndef ZYPP_NG_CORE_IDSTRING_H_INCLUDED #define ZYPP_NG_CORE_IDSTRING_H_INCLUDED #include namespace zyppng { using IdString = zypp::IdString; using IdStringSet = zypp::IdStringSet; } #endif libzypp-17.36.5/zypp-core/zyppng/core/string.h000066400000000000000000000062771476576476200213200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #ifndef ZYPP_NG_CORE_STRING_H_INCLUDED #define ZYPP_NG_CORE_STRING_H_INCLUDED #include #include #include namespace zyppng { namespace str { using zypp::str::Trim; template std::optional safe_strtonum ( const std::string_view &val) { int oerrno = errno; errno = 0; // strtonum/::strtol has no dedicated error-return-code one could check const T entryVal = zypp::str::strtonum( val.data() ); if ( errno == ERANGE ) return {}; errno = oerrno; return entryVal; } template< typename StrType, typename T = std::remove_reference_t > T trim( StrType&& s, const Trim trim_r ) { T ret( std::forward(s) ); if ( ret.empty() || trim_r == Trim::NO_TRIM ) return ret; if ( trim_r & Trim::L_TRIM ) { typename T::size_type p = ret.find_first_not_of( " \t\r\n" ); if ( p == T::npos ) { if constexpr ( std::is_same_v ) return T(); else { ret.clear(); return ret; } } ret.remove_prefix( p ); } if ( trim_r & Trim::R_TRIM ) { typename T::size_type p = ret.find_last_not_of( " \t\r\n" ); if ( p == T::npos ) { if constexpr ( std::is_same_v ) return T(); else { ret.clear(); return ret; } } ret.remove_suffix( ret.size() - ( p+1 ) ); } return ret; } template void split( const boost::string_view & line_r, TOutputIterator result_r, const boost::string_view & sepchars_r = " \t", const Trim trim_r = Trim::NO_TRIM ) { //skip initial sepchars std::string_view::size_type tokenEnd = 0, tokenBegin = line_r.find_first_not_of( sepchars_r ); //if we do not find a character that is not in sepchars there is nothing to split if ( tokenBegin == std::string_view::npos ) return; while ( ( tokenEnd = line_r.find_first_of( sepchars_r, tokenBegin ) ) != std::string_view::npos ) { auto line = line_r.substr( tokenBegin, tokenEnd-tokenBegin ); *result_r = trim( line, trim_r ); //find start of next token tokenBegin = line_r.find_first_not_of( sepchars_r, tokenEnd ); if( tokenBegin == std::string_view::npos ) break; } //insert the final element if ( tokenBegin != std::string_view::npos && tokenBegin < line_r.size() ) *result_r = trim( line_r.substr( tokenBegin ), trim_r ); } } // use strerror from zypp::str in zyppng using zypp::str::strerror; } #endif libzypp-17.36.5/zypp-core/zyppng/core/url.h000066400000000000000000000013431476576476200206010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #ifndef ZYPP_NG_CORE_URL_H_INCLUDED #define ZYPP_NG_CORE_URL_H_INCLUDED #include namespace zyppng { using Url = zypp::Url; } #endif libzypp-17.36.5/zypp-core/zyppng/io/000077500000000000000000000000001476576476200173045ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/io/AsyncDataSource000066400000000000000000000000351476576476200222550ustar00rootroot00000000000000#include "asyncdatasource.h" libzypp-17.36.5/zypp-core/zyppng/io/IODevice000066400000000000000000000000261476576476200206540ustar00rootroot00000000000000#include "iodevice.h" libzypp-17.36.5/zypp-core/zyppng/io/Process000066400000000000000000000000251476576476200206420ustar00rootroot00000000000000#include "process.h" libzypp-17.36.5/zypp-core/zyppng/io/SockAddr000066400000000000000000000000261476576476200207170ustar00rootroot00000000000000#include "sockaddr.h" libzypp-17.36.5/zypp-core/zyppng/io/Socket000066400000000000000000000000241476576476200204530ustar00rootroot00000000000000#include "socket.h" libzypp-17.36.5/zypp-core/zyppng/io/abstractspawnengine.cc000066400000000000000000000120541476576476200236570ustar00rootroot00000000000000#include "private/abstractspawnengine_p.h" #include #include #include #include #include #include "private/forkspawnengine_p.h" #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::exec" namespace zyppng { #if ZYPP_HAS_GLIBSPAWNENGINE namespace { enum class SpawnEngine { GSPAWN, PFORK }; SpawnEngine initEngineFromEnv () { const std::string fBackend ( zypp::str::asString( ::getenv("ZYPP_FORK_BACKEND") ) ); if ( fBackend.empty() || fBackend == "auto" || fBackend == "pfork" ) { DBG << "Starting processes via posix fork" << std::endl; return SpawnEngine::PFORK; } else if ( fBackend == "gspawn" ) { DBG << "Starting processes via glib spawn" << std::endl; return SpawnEngine::GSPAWN; } DBG << "Falling back to starting process via posix fork" << std::endl; return SpawnEngine::PFORK; } std::unique_ptr engineFromEnv () { static const SpawnEngine eng = initEngineFromEnv(); switch ( eng ) { case SpawnEngine::GSPAWN: return std::make_unique(); case SpawnEngine::PFORK: default: return std::make_unique(); } } } #else std::unique_ptr engineFromEnv () { return std::make_unique(); } #endif AbstractSpawnEngine::AbstractSpawnEngine() { } AbstractSpawnEngine::~AbstractSpawnEngine() { } std::unique_ptr AbstractSpawnEngine::createDefaultEngine() { return engineFromEnv(); } bool AbstractSpawnEngine::switchPgid() const { return _switchPgid; } void AbstractSpawnEngine::setSwitchPgid(bool switchPgid) { _switchPgid = switchPgid; } zypp::Pathname AbstractSpawnEngine::workingDirectory() const { return _workingDirectory; } void AbstractSpawnEngine::setWorkingDirectory(const zypp::Pathname &workingDirectory) { _workingDirectory = workingDirectory; } const std::vector &AbstractSpawnEngine::fdsToMap() const { return _mapFds; } void AbstractSpawnEngine::addFd(int fd) { _mapFds.push_back( fd ); } void AbstractSpawnEngine::notifyExited(int status) { _exitStatus = checkStatus( status ); _pid = -1; } bool AbstractSpawnEngine::dieWithParent() const { return _dieWithParent; } void AbstractSpawnEngine::setDieWithParent( bool dieWithParent ) { _dieWithParent = dieWithParent; } int AbstractSpawnEngine::exitStatus() const { return _exitStatus; } void AbstractSpawnEngine::setExitStatus(const int state) { _exitStatus = state; } const std::string &AbstractSpawnEngine::executedCommand() const { return _executedCommand; } const std::string &AbstractSpawnEngine::execError() const { return _execError; } void AbstractSpawnEngine::setExecError(const std::string &str) { _execError = str; } zypp::Pathname AbstractSpawnEngine::chroot() const { return _chroot; } void AbstractSpawnEngine::setChroot( const zypp::Pathname &chroot ) { _chroot = chroot; } bool AbstractSpawnEngine::useDefaultLocale() const { return _useDefaultLocale; } void AbstractSpawnEngine::setUseDefaultLocale( bool defaultLocale ) { _useDefaultLocale = defaultLocale; } AbstractSpawnEngine::Environment AbstractSpawnEngine::environment() const { return _environment; } void AbstractSpawnEngine::setEnvironment( const Environment &environment ) { _environment = environment; } pid_t AbstractSpawnEngine::pid( ) { return _pid; } int AbstractSpawnEngine::checkStatus( int status ) { if (WIFEXITED (status)) { status = WEXITSTATUS (status); if(status) { WAR << "Pid " << _pid << " exited with status " << status << std::endl; _execError = zypp::str::form( _("Command exited with status %d."), status ); } else { // if 'launch' is logged, completion should be logged, // even if successfull. DBG << "Pid " << _pid << " successfully completed" << std::endl; _execError.clear(); // empty if running or successfully completed } } else if (WIFSIGNALED (status)) { status = WTERMSIG (status); std::string sigdetail { strsignal(status) }; if ( WCOREDUMP(status) ) { sigdetail += "; Core dumped"; } if ( status == SIGKILL ) { sigdetail += "; Out of memory?"; } WAR << "Pid " << _pid << " was killed by signal " << status << " (" << sigdetail << ")" << std::endl; _execError = zypp::str::form( _("Command was killed by signal %d (%s)."), status, sigdetail.c_str() ); status+=128; } else { ERR << "Pid " << _pid << " exited with unknown error" << std::endl; _execError = _("Command exited with unknown error."); } return status; } } // namespace zyppng libzypp-17.36.5/zypp-core/zyppng/io/asyncdatasource.cpp000066400000000000000000000252121476576476200232020ustar00rootroot00000000000000#include "private/asyncdatasource_p.h" #include #include #include #include namespace zyppng { void AsyncDataSourcePrivate::notifierActivated( const SocketNotifier ¬ify, int evTypes ) { if ( _writeNotifier.get() == ¬ify ) { if ( evTypes & SocketNotifier::Error ) { DBG << "Closing due to error when polling" << std::endl; closeWriteChannel( AsyncDataSource::RemoteClose ); return; } readyWrite(); } else { auto dev = std::find_if( _readFds.begin(), _readFds.end(), [ ¬ify ]( const auto &dev ){ return ( dev._readNotifier.get() == ¬ify ); } ); if ( dev == _readFds.end() ) { return; } readyRead( std::distance( _readFds.begin(), dev ) ); } } void AsyncDataSourcePrivate::readyRead( uint channel ) { auto bytesToRead = z_func()->rawBytesAvailable( channel ); if ( bytesToRead == 0 ) { // make sure to check if bytes are available even if the ioctl call returns something different bytesToRead = 4096; } auto &_readBuf = _readChannels[channel]; char *buf = _readBuf.reserve( bytesToRead ); const auto bytesRead = z_func()->readData( channel, buf, bytesToRead ); if ( bytesRead <= 0 ) { _readBuf.chop( bytesToRead ); switch( bytesRead ) { // remote close , close the read channel case 0: { closeReadChannel( channel, AsyncDataSource::RemoteClose ); break; } // no data is available , just try again later case -2: break; // anything else default: case -1: { closeReadChannel( channel, AsyncDataSource::InternalError ); break; } } return; } if ( bytesToRead > bytesRead ) _readBuf.chop( bytesToRead-bytesRead ); if ( channel == _currentReadChannel ) _readyRead.emit(); _channelReadyRead.emit( channel ); return; } void AsyncDataSourcePrivate::readyWrite() { const auto nwrite = _writeBuffer.frontSize(); if ( !nwrite ) { // disable Write notifications so we do not wake up without the need to _writeNotifier->setEnabled( false ); return; } const auto nBuf = _writeBuffer.front(); const auto written = eintrSafeCall( ::write, _writeFd, nBuf, nwrite ); if ( written == -1 ) { switch ( errno ) { case EACCES: closeWriteChannel( AsyncDataSource::AccessError ); return; case EAGAIN: #if EAGAIN != EWOULDBLOCK case EWOULDBLOCK: #endif return; case EPIPE: case ECONNRESET: closeWriteChannel( AsyncDataSource::RemoteClose ); return; default: closeWriteChannel( AsyncDataSource::InternalError ); return; } return; } _writeBuffer.discard( written ); _sigBytesWritten.emit( written ); if ( _writeBuffer.size() == 0 ) _sigAllBytesWritten.emit(); } void AsyncDataSourcePrivate::closeWriteChannel( AsyncDataSource::ChannelCloseReason reason ) { bool sig = _writeFd >= 0; _writeNotifier.reset(); _writeFd = -1; _writeBuffer.clear(); _mode.unsetFlag( AsyncDataSource::WriteOnly ); if ( sig ) _sigWriteFdClosed.emit( reason ); } void AsyncDataSourcePrivate::closeReadChannel( uint channel, AsyncDataSource::ChannelCloseReason reason ) { auto &readFd = _readFds[channel]; // we do not clear the read buffer so code has the opportunity to read whats left in there bool sig = readFd._readFd >= 0; readFd._readNotifier.reset(); readFd._readFd = -1; if ( sig ) { z_func()->finishReadChannel( channel ); _sigReadFdClosed.emit( channel, reason ); } } ZYPP_IMPL_PRIVATE(AsyncDataSource) AsyncDataSource::AsyncDataSource() : IODevice( *( new AsyncDataSourcePrivate(*this) ) ) { } AsyncDataSource::AsyncDataSource( AsyncDataSourcePrivate &d ) : IODevice(d) {} AsyncDataSource::Ptr AsyncDataSource::create() { return std::shared_ptr( new AsyncDataSource ); } bool AsyncDataSource::openFds ( const std::vector& readFds, int writeFd ) { Z_D(); if ( d->_mode != IODevice::Closed ) return false; IODevice::OpenMode mode; bool error = false; for ( const auto readFd : readFds ) { if ( readFd >= 0 ) { mode |= IODevice::ReadOnly; d->_readFds.push_back( { readFd, SocketNotifier::create( readFd, SocketNotifier::Read | AbstractEventSource::Error, true ) }); if ( zypp::io::setFDBlocking( readFd, false ) == zypp::io::BlockingMode::FailedToSetMode ) { ERR << "Failed to set read FD to non blocking" << std::endl; error = true; break; } d->_readFds.back()._readNotifier->connect( &SocketNotifier::sigActivated, *d, &AsyncDataSourcePrivate::notifierActivated ); } } if ( writeFd >= 0 && !error ) { mode |= IODevice::WriteOnly; if ( zypp::io::setFDBlocking( writeFd, false ) == zypp::io::BlockingMode::FailedToSetMode ) { ERR << "Failed to set write FD to non blocking" << std::endl; error = true; } else { d->_writeFd = writeFd; d->_writeNotifier = SocketNotifier::create( writeFd, SocketNotifier::Write | AbstractEventSource::Error, false ); d->_writeNotifier->connect( &SocketNotifier::sigActivated, *d, &AsyncDataSourcePrivate::notifierActivated ); } } if( error || !IODevice::open( mode ) ) { d->_mode = IODevice::Closed; d->_readFds.clear(); d->_writeNotifier.reset(); d->_writeFd = -1; return false; } // make sure we have enough read buffers setReadChannelCount( d->_readFds.size() ); return true; } int64_t zyppng::AsyncDataSource::writeData( const char *data, int64_t count ) { Z_D(); if ( count > 0 ) { // we always use the write buffer, to make sure the fd is actually writeable d->_writeBuffer.append( data, count ); d->_writeNotifier->setEnabled( true ); } return count; } int64_t zyppng::AsyncDataSource::readData( uint channel, char *buffer, int64_t bufsize ) { Z_D(); if ( channel >= d->_readFds.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::logic_error( constants::outOfRangeErrMsg.data() ); } const auto read = eintrSafeCall( ::read, d->_readFds[channel]._readFd, buffer, bufsize ); if ( read < 0 ) { switch ( errno ) { #if EAGAIN != EWOULDBLOCK case EWOULDBLOCK: #endif case EAGAIN: { return -2; } default: break; } } return read; } int64_t AsyncDataSource::rawBytesAvailable( uint channel ) const { Z_D(); if ( channel >= d->_readFds.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::logic_error( constants::outOfRangeErrMsg.data() ); } if ( isOpen() && canRead() ) return zyppng::bytesAvailableOnFD( d->_readFds[channel]._readFd ); return 0; } void AsyncDataSource::readChannelChanged ( uint channel ) { Z_D(); if ( channel >= d->_readFds.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::logic_error( constants::outOfRangeErrMsg.data() ); } } void zyppng::AsyncDataSource::close() { Z_D(); for( uint i = 0; i < d->_readFds.size(); ++i ) { auto &readChan = d->_readFds[i]; readChan._readNotifier.reset(); if ( readChan._readFd >= 0) { finishReadChannel(i); d->_sigReadFdClosed.emit( i, UserRequest ); } } d->_readFds.clear(); d->_writeNotifier.reset(); d->_writeBuffer.clear(); if ( d->_writeFd >= 0 ) { d->_writeFd = -1; d->_sigWriteFdClosed.emit( UserRequest ); } IODevice::close(); } void AsyncDataSource::closeWriteChannel() { Z_D(); // if we are open writeOnly, simply call close(); if ( !canRead() ) { close(); return; } d->_mode = ReadOnly; d->_writeNotifier.reset(); d->_writeBuffer.clear(); if ( d->_writeFd >= 0 ) { d->_writeFd = -1; d->_sigWriteFdClosed.emit( UserRequest ); } } bool AsyncDataSource::waitForReadyRead( uint channel, int timeout ) { Z_D(); if ( !canRead() ) return false; if ( channel >= d->_readFds.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::logic_error( constants::outOfRangeErrMsg.data() ); } bool gotRR = false; auto rrConn = AutoDisconnect( d->_channelReadyRead.connect([&]( uint activated ){ gotRR = ( channel == activated ); }) ); // we can only wait if we are open for reading and still have a valid fd auto &channelRef = d->_readFds[ channel ]; while ( readFdOpen(channel) && canRead() && !gotRR ) { int rEvents = 0; if ( EventDispatcher::waitForFdEvent( channelRef._readFd, AbstractEventSource::Read | AbstractEventSource::Error , rEvents, timeout ) ) { //simulate signal from read notifier d->notifierActivated( *channelRef._readNotifier, rEvents ); } else { //timeout return false; } } return gotRR; } void AsyncDataSource::flush () { Z_D(); if ( !canWrite() ) return; int timeout = -1; while ( canWrite() && d->_writeBuffer.frontSize() ) { int rEvents = 0; if ( EventDispatcher::waitForFdEvent( d->_writeFd, AbstractEventSource::Write | AbstractEventSource::Error , rEvents, timeout ) ) { //simulate signal from write notifier d->readyWrite(); } else { //timeout return; } } } SignalProxy AsyncDataSource::sigWriteFdClosed() { return d_func()->_sigWriteFdClosed; } SignalProxy AsyncDataSource::sigReadFdClosed() { return d_func()->_sigReadFdClosed; } bool AsyncDataSource::readFdOpen() const { Z_D(); if ( !d->_readChannels.size() ) return false; return readFdOpen( d_func()->_currentReadChannel ); } bool AsyncDataSource::readFdOpen(uint channel) const { Z_D(); if ( channel >= d->_readFds.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::logic_error( constants::outOfRangeErrMsg.data() ); } auto &channelRef = d->_readFds[ channel ]; return ( channelRef._readNotifier && channelRef._readFd >= 0 ); } int64_t AsyncDataSource::bytesPending() const { return d_func()->_writeBuffer.size(); } } libzypp-17.36.5/zypp-core/zyppng/io/asyncdatasource.h000066400000000000000000000064771476576476200226630ustar00rootroot00000000000000#ifndef ASYNCDATASOURCE_H #define ASYNCDATASOURCE_H #include #include namespace zyppng { class AsyncDataSourcePrivate; class AsyncDataSource : public IODevice { ZYPP_DECLARE_PRIVATE(AsyncDataSource) public: enum ChannelCloseReason { RemoteClose, // the other side of the fd was closed AccessError, // we got an EACCESS when polling the fd InternalError, // we got a unexpected errno when polling the fd UserRequest // channel were closed because close() was called }; using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; static Ptr create (); /*! * Borrows the given fd's and starts reading/writing to them if data is available. * Note that \ref AsyncDataSource does not take ownership of the FDs, they need to be closed * explicitely after they were released with \ref close */ bool openFds ( const std::vector& readFds, int writeFd = -1 ); /*! * Closes the \ref AsyncDataSource and releases the used fd's to the calling code. They are NOT * closed. */ void close () override; using IODevice::waitForReadyRead; virtual void closeWriteChannel (); /*! * Blocks the current event loop to wait until all bytes currently in the buffer have been written to * the write fd. * * \note do not use until there is a very good reason, like event processing should not continue until readyRead was sent */ bool waitForReadyRead(uint channel, int timeout) override; /*! * Blocks the current event loop to wait until all bytes currently in the buffer have been written to * the write fd. * * \note do not use until there is a very good reason, like event processing should not continue until bytesWritten was sent */ void flush (); /*! * Signal is emitted always when the write channel is closed. * All data that was not written yet will be discarded and canWrite() will return * false. */ SignalProxy sigWriteFdClosed(); /*! * Signal is emitted always when the write channel is closed, for example * when the write side of a pipe is closed. All data still residing in the read buffer * can still be read. */ SignalProxy sigReadFdClosed(); /*! * Returns true as long as the default read channel was not closed ( e.g. sigReadFdClosed was emitted ) */ bool readFdOpen () const; /*! * Returns true as long as the given read channel was not closed ( e.g. sigReadFdClosed was emitted ) */ bool readFdOpen ( uint channel ) const; /*! * Returns the current number of bytes that are not yet written to the data source. */ int64_t bytesPending() const override; protected: AsyncDataSource ( ); AsyncDataSource( AsyncDataSourcePrivate &d ); int64_t writeData(const char *data, int64_t count) override; private: using IODevice::open; int64_t readData( uint channel, char *buffer, int64_t bufsize ) override; int64_t rawBytesAvailable( uint channel ) const override; void readChannelChanged ( uint channel ) override; }; } #endif // ASYNCDATASOURCE_H libzypp-17.36.5/zypp-core/zyppng/io/forkspawnengine.cc000066400000000000000000000477621476576476200230330ustar00rootroot00000000000000#include "private/forkspawnengine_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // openpty #include // setenv #include // prctl(), PR_SET_PDEATHSIG #include #ifdef SYS_pidfd_open #include #endif #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::exec" zyppng::AbstractDirectSpawnEngine::~AbstractDirectSpawnEngine() { if ( AbstractDirectSpawnEngine::isRunning() ) { // we got destructed while the external process is still alive // make sure the zombie is cleaned up once it exits zypp::CleanerThread::watchPID( _pid ); } } bool zyppng::AbstractDirectSpawnEngine::isRunning( bool wait ) { if ( _pid < 0 ) return false; int status = 0; int p = zyppng::eintrSafeCall( ::waitpid, _pid, &status, wait ? 0 : WNOHANG ); switch ( p ) { case -1: ERR << "waitpid( " << _pid << ") returned error '" << strerror(errno) << "'" << std::endl; return false; break; case 0: return true; // still running break; } // Here: completed... _exitStatus = checkStatus( status ); _pid = -1; return false; } bool zyppng::AbstractDirectSpawnEngine::waitForExit( const std::optional &timeout ) { if ( _pid < 0 ) return true; // no timeout, wait forever if ( !timeout.has_value () ) return !isRunning( true ); // busy loop polling in case pidfd is not available or fails, only called if we have a valid timout const auto &fallbackPoll = [&]( uint64_t timeout ){ const auto start = Timer::now(); do { if ( !isRunning(false) ) return true; // give up the CPU, so we do not use 100% just to poll std::this_thread::sleep_for( std::chrono::milliseconds(1) ); } while( Timer::elapsedSince ( start ) < timeout ); return !isRunning ( false ); }; #ifdef SYS_pidfd_open // we have pidfd support, but there is not yet a wrapper in glibc const auto &zypp_pidfd_open = [](pid_t pid, unsigned int flags) -> int { return syscall( SYS_pidfd_open, pid, flags ); }; zypp::AutoFD pidFd = zyppng::eintrSafeCall( zypp_pidfd_open, _pid, 0 ); if ( pidFd == -1 ) { // fallback to manual polling ERR << "pidfd_open failed, falling back to polling waidpid" << std::endl; return fallbackPoll( *timeout ); } struct pollfd pollfd; pollfd.fd = pidFd; pollfd.events = POLLIN; // timeout always has a value set, we established that above uint64_t tRemaining = *timeout; const auto start = Timer::now(); do { // posix using int as timeout, could in theory overflow so protect against it int posixTimeout = tRemaining > INT_MAX ? INT_MAX : static_cast(tRemaining); int ready = poll(&pollfd, 1, posixTimeout ); tRemaining = *timeout - std::min( Timer::elapsedSince( start ), *timeout ); if ( ready == -1 && errno != EINTR ) { ERR << "Polling the pidfd failed with error: " << zypp::Errno() << std::endl; if ( tRemaining > 0 ) { ERR << "Falling back to manual polling for the remaining timeout." << std::endl; return fallbackPoll( tRemaining ); } break; } else if ( pollfd.revents & POLLIN ) { break; } } while( tRemaining > 0 ); // set exit status return !isRunning ( false ); #else // we do not have pidfd support, need to busyloop on waitpid until timeout is over return fallbackPoll( *timeout ); #endif } void zyppng::AbstractDirectSpawnEngine::mapExtraFds ( int controlFd ) { // we might have gotten other FDs to reuse, lets map them to STDERR_FILENO++ // BUT we need to make sure the fds are not already in the range we need to map them to // so we first go over a list and collect those that are safe or move those that are not int lastFdToKeep = STDERR_FILENO + _mapFds.size(); int nextBackupFd = lastFdToKeep + 1; //this we will use to count the fds upwards std::vector safeFds; for ( auto fd : _mapFds ) { // If the fds are larger than the last one we will map to, it is safe. if ( fd > lastFdToKeep ) { safeFds.push_back( fd ); } else { // we need to map the fd after the set of those we want to keep, but also make sure // that we do not close one of those we have already moved or might move while (true) { int backupTo = nextBackupFd; nextBackupFd++; const bool isSafe1 = std::find( _mapFds.begin(), _mapFds.end(), backupTo ) == _mapFds.end(); const bool isSafe2 = std::find( safeFds.begin(), safeFds.end(), backupTo ) == safeFds.end(); if ( isSafe1 && isSafe2 && ( controlFd == -1 || backupTo != controlFd) ) { dup2( fd, backupTo ); safeFds.push_back( backupTo ); break; } } } } // now we have a list of safe fds we need to map to the fd we want them to end up int nextFd = STDERR_FILENO; for ( auto fd : safeFds ) { nextFd++; dup2( fd, nextFd ); } const auto &canCloseFd = [&]( int fd ){ // controlFD has O_CLOEXEC set so it will be cleaned up :) if ( controlFd != -1 && controlFd == fd ) return false; // make sure we don't close fd's still need if ( fd <= lastFdToKeep ) return false; return true; }; const auto maxFds = ( ::getdtablesize() - 1 ); //If the rlimits are too high we need to use a different approach // in detecting how many fds we need to close, or otherwise we are too slow (bsc#1191324) if ( maxFds > 1024 && zypp::PathInfo( "/proc/self/fd" ).isExist() ) { std::vector fdsToClose; fdsToClose.reserve (256); zypp::filesystem::dirForEachExt( "/proc/self/fd", [&]( const zypp::Pathname &p, const zypp::filesystem::DirEntry &entry ){ if ( entry.type != zypp::filesystem::FT_LINK) return true; const auto &fdVal = zyppng::str::safe_strtonum( entry.name ); if ( !fdVal || !canCloseFd(*fdVal) ) return true; // we can not call close() directly here because zypp::filesystem::dirForEachExt actually has a fd open on // /proc/self/fd that we would close as well. So we just remember which fd's we WOULD close and then do it // after iterating fdsToClose.push_back (*fdVal); return true; }); for ( int cFd : fdsToClose ) ::close( cFd ); } else { // close all filedescriptors above the last we want to keep for ( int i = maxFds; i > lastFdToKeep; --i ) { if ( !canCloseFd(i) ) continue; ::close( i ); } } } void zyppng::AbstractDirectSpawnEngine::resetSignals() { // set all signal handers to their default struct sigaction act; memset (&act, 0, sizeof (struct sigaction)); act.sa_handler = SIG_DFL; for ( int i = 1; i < NSIG; i++ ) { // this might return -1 and set errno for unknown signals, but // thats fine for us. sigaction(i, &act, NULL); } // clear the sigmask sigset_t sigMask; sigemptyset ( &sigMask ); pthread_sigmask ( SIG_SETMASK, &sigMask, nullptr ); } bool zyppng::ForkSpawnEngine::start( const char * const *argv, int stdin_fd, int stdout_fd, int stderr_fd ) { _pid = -1; _exitStatus = 0; _execError.clear(); _executedCommand.clear(); _args.clear(); if ( !argv || !argv[0] ) { _execError = _("Invalid spawn arguments given."); _exitStatus = 128; return false; } const char * chdirTo = nullptr; if ( _chroot == "/" ) { // If _chroot is '/' do not chroot, but chdir to '/' // unless arglist defines another dir. chdirTo = "/"; _chroot = zypp::Pathname(); } if ( !_workingDirectory.empty() ) chdirTo = _workingDirectory.c_str(); // do not remove the single quotes around every argument, copy&paste of // command to shell will not work otherwise! { _args.clear(); std::stringstream cmdstr; for (int i = 0; argv[i]; i++) { if ( i != 0 ) cmdstr << ' '; cmdstr << '\''; cmdstr << argv[i]; cmdstr << '\''; _args.push_back( argv[i] ); } _executedCommand = cmdstr.str(); } DBG << "Executing" << ( _useDefaultLocale?"[C] ":" ") << _executedCommand << std::endl; // we use a control pipe to figure out if the exec actually worked, // this is the approach: // - create a pipe before forking // - block on the read end of the pipe in the parent process // - in the child process we write a error tag + errno into the pipe if we encounter any error and exit // - If child setup works out, the pipe is auto closed by exec() and the parent process knows from just receiving EOF // that starting the child was successful, otherwise the blocking read in the parent will return with actual data read from the fd // which will contain the error description enum class ChildErrType : int8_t { NO_ERR, CHROOT_FAILED, CHDIR_FAILED, EXEC_FAILED }; struct ChildErr { int childErrno = 0; ChildErrType type = ChildErrType::NO_ERR; }; auto controlPipe = Pipe::create( O_CLOEXEC ); if ( !controlPipe ) { _execError = _("Unable to create control pipe."); _exitStatus = 128; return false; } pid_t ppid_before_fork = ::getpid(); // Create module process if ( ( _pid = fork() ) == 0 ) { // child process resetSignals(); controlPipe->unrefRead(); const auto &writeErrAndExit = [&]( int errCode, ChildErrType type ){ ChildErr buf { errno, type }; zypp::io::writeAll( controlPipe->writeFd, &buf, sizeof(ChildErr) ); _exit ( errCode ); }; ////////////////////////////////////////////////////////////////////// // Don't write to the logfile after fork! ////////////////////////////////////////////////////////////////////// if ( _use_pty ) { setsid(); dup2 ( stdout_fd, 1); // set new stdout dup2 ( stdin_fd , 0); // set new stdin // We currently have no controlling terminal (due to setsid). // The first open call will also set the new ctty (due to historical // unix guru knowledge ;-) ) char name[512]; ttyname_r( stdout_fd , name, sizeof(name) ); ::close(open(name, O_RDONLY)); } else { if ( _switchPgid ) setpgid( 0, 0); if ( stdin_fd != -1 ) dup2 ( stdin_fd, 0); // set new stdin if ( stdout_fd != -1 ) dup2 ( stdout_fd, 1); // set new stdout } // Handle stderr if ( stderr_fd != -1 ) dup2 ( stderr_fd, 2); // set new stderr for ( Environment::const_iterator it = _environment.begin(); it != _environment.end(); ++it ) { setenv( it->first.c_str(), it->second.c_str(), 1 ); } if( _useDefaultLocale ) setenv("LC_ALL","C",1); if( !_chroot.empty() ) { if( ::chroot(_chroot.c_str()) == -1) { _execError = zypp::str::form( _("Can't chroot to '%s' (%s)."), _chroot.c_str(), strerror(errno).c_str() ); std::cerr << _execError << std::endl; // After fork log on stderr too writeErrAndExit( 128, ChildErrType::CHROOT_FAILED ); // No sense in returning! I am forked away!! } if ( ! chdirTo ) chdirTo = "/"; } if ( chdirTo && chdir( chdirTo ) == -1 ) { _execError = _chroot.empty() ? zypp::str::form( _("Can't chdir to '%s' (%s)."), chdirTo, strerror(errno).c_str() ) : zypp::str::form( _("Can't chdir to '%s' inside chroot '%s' (%s)."), chdirTo, _chroot.c_str(), strerror(errno).c_str() ); std::cerr << _execError << std::endl;// After fork log on stderr too writeErrAndExit( 128, ChildErrType::CHDIR_FAILED ); // No sense in returning! I am forked away!! } // map the extra fds the user might have set mapExtraFds( controlPipe->writeFd ); if ( _dieWithParent ) { // process dies with us int r = prctl(PR_SET_PDEATHSIG, SIGTERM); if (r == -1) { //ignore if it did not work, worst case the process lives on after the parent dies std::cerr << "Failed to set PR_SET_PDEATHSIG" << std::endl;// After fork log on stderr too } // test in case the original parent exited just // before the prctl() call pid_t ppidNow = getppid(); if (ppidNow != ppid_before_fork) { // no sense to write to control pipe, parent is gone std::cerr << "PPID changed from "<( argv ) ); // don't want to get here _execError = zypp::str::form( _("Can't exec '%s' (%s)."), _args[0].c_str(), strerror(errno).c_str() ); std::cerr << _execError << std::endl;// After fork log on stderr too writeErrAndExit( 129, ChildErrType::EXEC_FAILED ); // No sense in returning! I am forked away!! ////////////////////////////////////////////////////////////////////// } else if ( _pid == -1 ) // Fork failed, close everything. { _execError = zypp::str::form( _("Can't fork (%s)."), strerror(errno).c_str() ); _exitStatus = 127; ERR << _execError << std::endl; return false; } else { // parent process, fork worked lets wait for the exec to happen controlPipe->unrefWrite(); ChildErr buf; const auto res = zypp::io::readAll( controlPipe->readFd, &buf, sizeof(ChildErr) ); if ( res == zypp::io::ReadAllResult::Eof ) { // success!!!! DBG << "pid " << _pid << " launched" << std::endl; return true; } else if ( res == zypp::io::ReadAllResult::Ok ) { switch( buf.type ) { case ChildErrType::CHDIR_FAILED: _execError = zypp::str::form( _("Can't exec '%s', chdir failed (%s)."), _args[0].c_str(), zypp::str::strerror(buf.childErrno).c_str() ); break; case ChildErrType::CHROOT_FAILED: _execError = zypp::str::form( _("Can't exec '%s', chroot failed (%s)."), _args[0].c_str(), zypp::str::strerror(buf.childErrno).c_str() ); break; case ChildErrType::EXEC_FAILED: _execError = zypp::str::form( _("Can't exec '%s', exec failed (%s)."), _args[0].c_str(), zypp::str::strerror(buf.childErrno).c_str() ); break; // all other cases need to be some sort of error, because we only get data if the exec fails default: _execError = zypp::str::form( _("Can't exec '%s', unexpected error."), _args[0].c_str() ); break; } ERR << "pid " << _pid << " launch failed: " << _execError << std::endl; // reap child and collect exit code isRunning( true ); return false; } else { //reading from the fd failed, this should actually never happen ERR << "Reading from the control pipe failed. " << errno << ". This is not supposed to happen ever." << std::endl; return isRunning(); } } return true; } bool zyppng::ForkSpawnEngine::usePty() const { return _use_pty; } void zyppng::ForkSpawnEngine::setUsePty( const bool set ) { _use_pty = set; } #if ZYPP_HAS_GLIBSPAWNENGINE struct GLibForkData { zyppng::GlibSpawnEngine *that = nullptr; pid_t pidParent = -1; }; bool zyppng::GlibSpawnEngine::start( const char * const *argv, int stdin_fd, int stdout_fd, int stderr_fd ) { _pid = -1; _exitStatus = 0; _execError.clear(); _executedCommand.clear(); _args.clear(); if ( !argv || !argv[0] ) { _execError = _("Invalid spawn arguments given."); _exitStatus = 128; return false; } const char * chdirTo = nullptr; if ( _chroot == "/" ) { // If _chroot is '/' do not chroot, but chdir to '/' // unless arglist defines another dir. chdirTo = "/"; _chroot = zypp::Pathname(); } if ( !_workingDirectory.empty() ) chdirTo = _workingDirectory.c_str(); // do not remove the single quotes around every argument, copy&paste of // command to shell will not work otherwise! { _args.clear(); std::stringstream cmdstr; for (int i = 0; argv[i]; i++) { if ( i != 0 ) cmdstr << ' '; cmdstr << '\''; cmdstr << argv[i]; cmdstr << '\''; _args.push_back( argv[i] ); } _executedCommand = cmdstr.str(); } DBG << "Executing" << ( _useDefaultLocale?"[C] ":" ") << _executedCommand << std::endl; // build the env var ptrs std::vector envStrs; std::vector envPtrs; for ( char **envPtr = environ; *envPtr != nullptr; envPtr++ ) envPtrs.push_back( *envPtr ); envStrs.reserve( _environment.size() ); envPtrs.reserve( envPtrs.size() + _environment.size() + ( _useDefaultLocale ? 2 : 1 ) ); for ( const auto &env : _environment ) { envStrs.push_back( env.first + "=" + env.second ); envPtrs.push_back( envStrs.back().data() ); } if ( _useDefaultLocale ) { envStrs.push_back( "LC_ALL=C" ); envPtrs.push_back( envStrs.back().data() ); } envPtrs.push_back( nullptr ); GLibForkData data; data.that = this; data.pidParent = ::getpid(); bool needCallback = !_chroot.empty() || _dieWithParent || _switchPgid || _mapFds.size(); auto spawnFlags = GSpawnFlags( G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH_FROM_ENVP ); if ( _mapFds.size() ) spawnFlags = GSpawnFlags( spawnFlags | G_SPAWN_LEAVE_DESCRIPTORS_OPEN ); GPid childPid = -1; g_autoptr(GError) error = NULL; g_spawn_async_with_fds( chdirTo, const_cast(argv), envPtrs.data(), spawnFlags, needCallback ? &GlibSpawnEngine::glibSpawnCallback : nullptr, needCallback ? &data : nullptr, &childPid, stdin_fd, //in stdout_fd, //out stderr_fd, //err &error ); if ( !error ) { _pid = childPid; } else { _execError = zypp::str::form( _("Can't fork (%s)."), strerror(errno).c_str() ); _exitStatus = 127; ERR << _execError << std::endl; return false; } return true; } void zyppng::GlibSpawnEngine::glibSpawnCallback(void *data) { GLibForkData *d = reinterpret_cast(data); d->that->resetSignals(); bool doChroot = !d->that->_chroot.empty(); if ( d->that->_switchPgid ) setpgid( 0, 0); if ( doChroot ) { std::string execError; if ( ::chroot( d->that->_chroot.c_str() ) == -1 ) { execError = zypp::str::form( "Can't chroot to '%s' (%s).", d->that->_chroot.c_str(), strerror(errno).c_str() ); std::cerr << execError << std::endl;// After fork log on stderr too _exit (128); // No sense in returning! I am forked away!! } std::string chdir; //if we are in chroot we need to chdir again if ( d->that->_workingDirectory.empty() ) { chdir = "/"; } else { chdir = d->that->_workingDirectory.asString(); } if ( !chdir.empty() && ::chdir( chdir.data() ) == -1 ) { execError = doChroot ? zypp::str::form( "Can't chdir to '%s' inside chroot '%s' (%s).", chdir.data(), d->that->_chroot.c_str(), strerror(errno).c_str() ) : zypp::str::form( "Can't chdir to '%s' (%s).", chdir.data(), strerror(errno).c_str() ); std::cerr << execError << std::endl; // After fork log on stderr too _exit (128); // No sense in returning! I am forked away!! } } if ( d->that->_dieWithParent ) { // process dies with us int r = prctl(PR_SET_PDEATHSIG, SIGTERM); if (r == -1) { //ignore if it did not work, worst case the process lives on after the parent dies std::cerr << "Failed to set PR_SET_PDEATHSIG" << std::endl;// After fork log on stderr too } // test in case the original parent exited just // before the prctl() call pid_t ppidNow = getppid(); if (ppidNow != d->pidParent ) { std::cerr << "PPID changed from "<pidParent<<" to "<< ppidNow << std::endl;// After fork log on stderr too _exit(128); } } // map the extra fds the user might have set d->that->mapExtraFds(); } #endif libzypp-17.36.5/zypp-core/zyppng/io/iobuffer.cc000066400000000000000000000135541476576476200214240ustar00rootroot00000000000000#include "private/iobuffer_p.h" #include #include namespace zyppng { enum { DefChunkSize = 4096 }; IOBuffer::IOBuffer( int64_t chunkSize ) : _defaultChunkSize ( chunkSize == 0 ? DefChunkSize : chunkSize ) { } char *IOBuffer::reserve( int64_t bytes ) { assert( bytes > 0 && size_t(bytes) < ByteArray::maxSize() ); // do we need a new chunk? if ( _chunks.size() ) { auto &back = _chunks.back(); if ( back.available() >= bytes ) { char * ptr = back._buffer.data() + back.tail; back.tail += bytes; return ptr; } } // not enough space ready allocate a new one _chunks.push_back( Chunk{} ); auto &back = _chunks.back(); back._buffer.insert( back._buffer.end(), std::max( _defaultChunkSize, bytes ), '\0' ); back.tail += bytes; return back.data(); } char *IOBuffer::front() { if ( frontSize() == 0 ) return nullptr; return _chunks.front().data(); } int64_t IOBuffer::frontSize() const { if ( _chunks.empty() ) return 0; return _chunks.front().len(); } void IOBuffer::clear() { _chunks.clear(); } int64_t IOBuffer::discard( int64_t bytes ) { const int64_t bytesToDiscard = std::min(bytes, size()); if ( bytesToDiscard == size() ) { clear(); return bytesToDiscard; } int64_t discardedSoFar = 0; // since the chunks might not be used completely we need to iterate over them // counting how much used bytes we actually discard until we hit the requested amount while ( discardedSoFar < bytesToDiscard ) { auto &chunk = _chunks.front(); const auto bytesInChunk = chunk.len(); if ( discardedSoFar + bytesInChunk > bytesToDiscard ) { chunk.head += ( bytesToDiscard - discardedSoFar ); discardedSoFar = bytesToDiscard; } else { _chunks.erase( _chunks.begin() ); discardedSoFar += bytesInChunk; } } return bytesToDiscard; } /*! * Removes bytes from the end of the buffer */ void IOBuffer::chop( int64_t bytes ) { if ( bytes == 0 ) return; bytes = std::min( bytes, size() ); if ( bytes == size() ) { clear(); return; } int64_t choppedSoFar = 0; while ( choppedSoFar < bytes && _chunks.size() ) { auto bytesStillToChop = bytes - choppedSoFar; auto &chunk = _chunks.back(); if ( chunk.len() > bytesStillToChop ) { chunk.tail -= bytesStillToChop; break; } else { choppedSoFar += chunk.len(); _chunks.pop_back(); } } } void IOBuffer::append(const char *data, int64_t count) { if ( count <= 0 ) return; assert( count > 0 && size_t(count) < ByteArray::maxSize() ); char *buf = reserve( count ); if ( count == 1 ) *buf = *data; else { ::memcpy( buf, data, count ); } } void IOBuffer::append(const ByteArray &data) { append( data.data(), data.size() ); } int64_t IOBuffer::read( char *buffer, int64_t max ) { const size_t bytesToRead = std::min( size(), max ); size_t readSoFar = 0; while ( readSoFar < bytesToRead && _chunks.size() ) { auto &chunk = _chunks.front(); const auto toRead = std::min( bytesToRead - readSoFar, chunk.len() ); ::memcpy( buffer+readSoFar, chunk.data(), toRead ); readSoFar += toRead; // if we consumed all data in the chunk discard it chunk.head += toRead; if( chunk.head >= chunk.tail ) _chunks.erase( _chunks.begin() ); } return readSoFar; } int64_t IOBuffer::size() const { int64_t s = 0; for ( const auto &c : _chunks ) s+= c.len(); return s; } std::vector::size_type IOBuffer::chunks() const { return _chunks.size(); } int64_t IOBuffer::indexOf(const char c, int64_t maxCount, int64_t pos ) const { if ( maxCount == 0 ) return -1; maxCount = std::min( maxCount, size() ); int64_t scannedSoFar = 0; for ( const auto &chunk : _chunks ) { //as long as pos is still after the current chunk just increase the count if ( scannedSoFar+chunk.len() - 1 < pos ) { scannedSoFar += chunk.len(); continue; } const char * const chunkBegin = chunk.data(); const char *s = chunkBegin; size_t lengthToScan = std::min( chunk.len() , maxCount - scannedSoFar ); if ( pos > 0 && scannedSoFar < pos ) { const auto adjust = (pos-scannedSoFar); s += adjust; lengthToScan -= adjust; } const char *ptr = reinterpret_cast(::memchr( s, c, lengthToScan )); if ( ptr ) { return ( ( ptr - chunkBegin ) + scannedSoFar ); } scannedSoFar += chunk.len(); if ( scannedSoFar >= maxCount ) break; } return -1; } ByteArray IOBuffer::readUntil(const char delim, const int64_t max) { assert( ( max >= 2 || max == 0 ) && size_t(max) <= ByteArray::maxSize() ); const auto idx = indexOf( delim, max == 0 ? size() : max ); if ( idx == -1 ) return {}; zyppng::ByteArray b( idx+1, '\0' ); read( b.data(), idx+1 ); return b; } int64_t IOBuffer::readUntil(char *buffer, const char delim, int64_t max) { assert( buffer != nullptr && max > 1 ); const auto maxRead = max - 1; const auto idx = indexOf( delim, maxRead ); const auto bytesRead = read( buffer, idx == -1 ? maxRead : idx + 1 ); buffer[bytesRead] = '\0'; return bytesRead; } ByteArray IOBuffer::readLine( const int64_t max ) { return readUntil( '\n', max ); } int64_t IOBuffer::readLine( char *buffer, int64_t max ) { return readUntil( buffer, '\n', max ); } bool IOBuffer::canReadUntil(const char delim) const { return indexOf(delim) >= 0; } bool IOBuffer::canReadLine() const { return canReadUntil('\n'); } } libzypp-17.36.5/zypp-core/zyppng/io/iodevice.cc000066400000000000000000000240451476576476200214070ustar00rootroot00000000000000#include "private/iodevice_p.h" namespace zyppng { IODevicePrivate::IODevicePrivate(IODevice &p) : BasePrivate(p) { } ZYPP_IMPL_PRIVATE(IODevice) IODevice::IODevice() : Base( *( new IODevicePrivate(*this)) ) { } IODevice::IODevice(IODevicePrivate &d) : Base(d) { } bool IODevice::open( const OpenMode mode ) { Z_D(); d->_mode = mode; d->_readChannels.clear(); if ( canRead() ) { d->_readChannels.push_back( IOBuffer( d->_readBufChunkSize ) ); setReadChannel( 0 ); } return true; } void IODevice::close() { Z_D(); d->_mode = IODevice::Closed; d->_readChannels.clear(); } void IODevice::setReadChannelCount ( uint channels ) { Z_D(); if ( canRead() ) { d->_readChannels.resize( channels ); } } void IODevice::finishReadChannel( uint channel ) { Z_D(); if ( channel >= d->_readChannels.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; return; } // just signal code that the read channel is finished) d->_sigReadChannelFinished.emit( channel ); } void IODevice::setReadChannel ( uint channel ) { Z_D(); if ( !canRead() ) return; if ( channel >= d->_readChannels.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::out_of_range( constants::outOfRangeErrMsg.data() ); } d->_currentReadChannel = channel; readChannelChanged( channel ); } uint IODevice::currentReadChannel () const { Z_D(); if ( !canRead() ) return 0; return d->_currentReadChannel; } int IODevice::readChannelCount () const { Z_D(); if ( !canRead() ) return 0; return d->_readChannels.size(); } bool IODevice::canRead() const { return ( d_func()->_mode & IODevice::ReadOnly ); } bool IODevice::canWrite() const { return ( d_func()->_mode & IODevice::WriteOnly ); } bool IODevice::isOpen() const { return d_func()->_mode != IODevice::Closed; } bool IODevice::canReadLine() const { Z_D(); if ( !canRead() ) return false; return canReadLine( d->_currentReadChannel ); } int64_t IODevice::bytesAvailable() const { Z_D(); return bytesAvailable( d->_currentReadChannel ); } int64_t IODevice::readBufferCount () const { Z_D(); return readBufferCount( d->_currentReadChannel ); } ByteArray IODevice::readAll() { Z_D(); return readAll( d->_currentReadChannel ); } ByteArray IODevice::read( int64_t maxSize ) { if ( !canRead() || maxSize <= 0 ) return {}; return read( d_func()->_currentReadChannel, maxSize ); } int64_t IODevice::read(char *buf, int64_t maxSize ) { Z_D(); if ( !canRead() ) return -1; return read( d->_currentReadChannel, buf, maxSize ); } ByteArray IODevice::readLine( const int64_t maxSize ) { if ( !canRead() ) return {}; return channelReadLine( d_func()->_currentReadChannel, maxSize ); } ByteArray IODevice::readAll( uint channel ) { return read( channel, bytesAvailable( channel ) ); } ByteArray IODevice::read( uint channel, int64_t maxSize ) { if ( !canRead() || maxSize <= 0 ) return {}; ByteArray res( maxSize, '\0' ); const auto r = read( channel, res.data(), maxSize ); res.resize( r ); return res; } int64_t IODevice::read( uint channel, char *buf, int64_t maxSize ) { Z_D(); if ( !canRead() || maxSize < 0 ) return -1; if ( channel >= d->_readChannels.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::out_of_range( constants::outOfRangeErrMsg.data() ); } int64_t readSoFar = d->_readChannels[ channel ].read( buf, maxSize ); // try to read more from the device if ( readSoFar < maxSize ) { int64_t readFromDev = readData( channel, buf+readSoFar, maxSize - readSoFar ); if ( readFromDev > 0 ) return readSoFar + readFromDev; } return readSoFar; } ByteArray IODevice::channelReadUntil( uint channel, const char delim, int64_t maxSize ) { Z_D(); if ( !canRead() || maxSize < 0 ) return {}; if ( channel >= d->_readChannels.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::out_of_range( constants::outOfRangeErrMsg.data() ); } ByteArray result; // largest possible ByteArray in int64_t boundaries const auto maxBArrSize = int64_t( std::min( ByteArray::maxSize(), std::size_t(std::numeric_limits::max()) ) ); if ( maxSize > maxBArrSize ) { ERR << "Calling channelReadUntil with maxSize > int64_t(ByteArray::maxSize) " << std::endl; maxSize = maxBArrSize - 1; } // how much did we read? int64_t readSoFar = 0; // if we have no size or the size is really big we read incrementally, use the buffer chunk size // to read full chunks from the buffer if possible if ( maxSize == 0 || maxSize >= (maxBArrSize - 1) ) { // largest possible ByteArray maxSize = maxBArrSize; // we need to read in chunks until we get a \n int64_t lastReadSize = 0; result.resize (1); // leave room for \0 do { result.resize( std::min( std::size_t(maxSize), std::size_t(result.size() + d->_readBufChunkSize )) ); lastReadSize = channelReadUntil( channel, result.data() + readSoFar, delim, result.size() - readSoFar ); if ( lastReadSize > 0) readSoFar += lastReadSize; // check for equal _readBufSize, // our readData request is always 1 byte bigger than the _readBufChunkSize because of the initial byte we allocated in the result buffer, // so the \0 that is appended by readLine does not make a difference. } while( lastReadSize == d->_readBufChunkSize && result[readSoFar-1] != delim ); } else { result.resize( maxSize ); readSoFar = channelReadUntil( channel, result.data(), delim, result.size() ); } if ( readSoFar > 0 ) { // we do not need to keep the \0 in the ByteArray result.resize( readSoFar ); } else { result.clear (); } // make sure we do not waste memory result.shrink_to_fit(); return result; } ByteArray IODevice::channelReadLine( uint channel, int64_t maxSize ) { return channelReadUntil( channel, '\n', maxSize ); } int64_t IODevice::channelReadLine( uint channel, char *buf, const int64_t maxSize ) { return channelReadUntil( channel, buf, '\n', maxSize ); } int64_t IODevice::channelReadUntil(uint channel, char *buf, const char delimiter, const int64_t maxSize) { Z_D(); if ( !canRead() || maxSize < 0 ) return -1; if ( channel >= d->_readChannels.size() ) { ERR << constants::outOfRangeErrMsg << std::endl; throw std::out_of_range( constants::outOfRangeErrMsg.data() ); } if ( maxSize < 2 ) { ERR << "channelReadUntil needs at least a buffsize of 2" << std::endl; return -1; } int64_t toRead = maxSize - 1; // append \0 at the end int64_t readSoFar = 0; if ( d->_readChannels[channel].size () > 0 ) readSoFar = d->_readChannels[channel].readUntil( buf, delimiter, toRead + 1 /*IOBuffer appends \0*/ ); if ( readSoFar == toRead || ( readSoFar > 0 && buf[readSoFar-1] == delimiter ) ) { buf[readSoFar] = '\0'; return readSoFar; } bool hasError = false; // if we reach here, the buffer was either empty, or does not contain a \n, in both cases we need to // read from the device directly until we hit a ending condition while ( readSoFar < toRead ) { const auto r = readData( channel, buf+readSoFar, 1 ); if ( r == 0 ) { // no data available to be read -> EOF, or data stream empty break; } else if ( r < 0 ) { hasError = true; break; } readSoFar+=r; if ( buf[readSoFar-1] == delimiter ) break; } if ( readSoFar == 0 ) return hasError ? -1 : 0; buf[readSoFar] = '\0'; return readSoFar; } int64_t IODevice::bytesAvailable ( uint channel ) const { Z_D(); if ( !canRead() ) return 0; return d->_readChannels[channel].size() + rawBytesAvailable( channel ); } int64_t IODevice::readBufferCount(uint channel) const { Z_D(); if ( !canRead() ) return 0; return d->_readChannels[channel].size(); } bool IODevice::canReadUntil(uint channel, const char delim) const { Z_D(); if ( !canRead() || channel >= d->_readChannels.size() ) return false; return d->_readChannels[channel].canReadUntil( delim ); } bool IODevice::canReadLine ( uint channel ) const { Z_D(); if ( !canRead() || channel >= d->_readChannels.size() ) return false; return d->_readChannels[channel].canReadLine(); } int64_t zyppng::IODevice::write( const zyppng::ByteArray &data) { if ( !canWrite() ) return 0; return write( data.data(), data.size() ); } int64_t IODevice::write( const char *data, int64_t len) { if ( !canWrite() || len <= 0 ) return 0; return writeData( data, len ); } bool IODevice::waitForReadyRead( int timeout) { Z_D(); if ( !canRead() ) return false; return waitForReadyRead( d->_currentReadChannel, timeout ); } SignalProxy IODevice::sigReadyRead() { return d_func()->_readyRead; } SignalProxy IODevice::sigChannelReadyRead () { return d_func()->_channelReadyRead; } SignalProxy IODevice::sigBytesWritten() { return d_func()->_sigBytesWritten; } SignalProxy< void ()> IODevice::sigAllBytesWritten () { return d_func()->_sigAllBytesWritten; } SignalProxy IODevice::sigReadChannelFinished() { return d_func()->_sigReadChannelFinished; } IODeviceOStreamBuf::IODeviceOStreamBuf(IODeviceRef dev) : _dev(dev) {} IODeviceOStreamBuf::int_type IODeviceOStreamBuf::overflow( int_type __c ) { if ( !_dev ){ return traits_type::eof(); } char buf = __c; if ( _dev->write ( &buf, 1 ) == 1 ) { return traits_type::not_eof(__c); } return traits_type::eof(); } } libzypp-17.36.5/zypp-core/zyppng/io/iodevice.h000066400000000000000000000165651476576476200212610ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_IO_IODEVICE_DEFINED #define ZYPPNG_IO_IODEVICE_DEFINED #include #include #include #include namespace zyppng { class IODevicePrivate; ZYPP_FWD_DECL_TYPE_WITH_REFS(IODevice); /*! * The IODevice class represents a async sequential IO device, like a Socket or Pipe, * to receive and or send data. */ class IODevice : public Base { ZYPP_DECLARE_PRIVATE(IODevice) public: enum OpenModeFlag { Closed = 0x0, ReadOnly = 0x1, WriteOnly = 0x2, ReadWrite = ReadOnly | WriteOnly }; ZYPP_DECLARE_FLAGS( OpenMode, OpenModeFlag ); using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; IODevice(); virtual void close (); void setReadChannel ( uint channel ); uint currentReadChannel () const; int readChannelCount () const; bool canRead () const; bool canWrite () const; bool isOpen () const; ByteArray readAll (); ByteArray read ( int64_t maxSize ); int64_t read ( char *buf, int64_t maxSize ); virtual ByteArray readLine (const int64_t maxSize = 0 ); virtual int64_t bytesAvailable () const; int64_t readBufferCount() const; bool canReadLine () const; ByteArray readAll ( uint channel ); ByteArray read ( uint channel, int64_t maxSize ); int64_t read ( uint channel, char *buf, int64_t maxSize ); /*! * Convenience function that reads a line from the device into a ByteArray. Since * this function has no way to signal if a error happened, a empty ByteArray is * returned if there was no data or if a error occured. */ ByteArray channelReadUntil ( uint channel, const char delim, int64_t maxSize = 0 ); /*! * Convenience function that reads a line from the device into a ByteArray. Since * this function has no way to signal if a error happened, a empty ByteArray is * returned if there was no data or if a error occured. */ ByteArray channelReadLine ( uint channel, int64_t maxSize = 0 ); /*! * Reads data from the device until one of the following conditions are met: * - A \n is encountered * - maxSize nr of bytes have been read * - a error occurs on the device * * If bytes have been read from the device this always returns the number of bytes that * have been read, otherwise if no data was read 0 is returned or if a error occurs -1 is returned. */ int64_t channelReadLine ( uint channel, char *buf, const int64_t maxSize ); virtual int64_t bytesAvailable( uint channel ) const; /*! * Returns the number of bytes currently buffered in the read buffer channel */ int64_t readBufferCount( uint channel ) const; /*! * Reads data from the device until one of the following conditions are met: * - The delimiter is encountered * - maxSize nr of bytes have been read * - a error occurs on the device * * If bytes have been read from the device this always returns the number of bytes that * have been read, otherwise if no data was read 0 is returned or if a error occurs -1 is returned. */ virtual int64_t channelReadUntil ( uint channel, char *buf, const char delimiter, const int64_t maxSize ); /*! * Returns true if a line can be read from the currently buffered data in the given channel */ bool canReadLine ( uint channel ) const; /*! * Returns true if delim can be found in the currently buffered data */ bool canReadUntil ( uint channel, const char delim ) const; int64_t write ( const ByteArray &data ); int64_t write ( const char *data, int64_t len ); /*! * Returns the current number of bytes that are not yet written to the device. */ virtual int64_t bytesPending() const = 0; /*! * Blocks the current event loop to wait until there are bytes available to read from the device. * This always operates on the read channel that is selected as the default when the function is first called, * even if the default channel would be changed during the wait. * * \sa zyppng::IODevice::currentReadChannel * \note do not use until there is a very good reason, like event processing should not continue until readyRead was sent */ bool waitForReadyRead(int timeout); /*! * Blocks the current event loop to wait until there are bytes available to read from the given read channel. * * \note do not use until there is a very good reason, like event processing should not continue until readyRead was sent */ virtual bool waitForReadyRead(uint channel, int timeout) = 0; /*! * Signal is emitted when there is data available to read on the current default read channel */ SignalProxy sigReadyRead (); /*! * Signal is emitted when there is data available on the given channel */ SignalProxy sigChannelReadyRead (); /*! * Signal is emitted every time bytes have been written to the underlying device. * This can be used to track how much data was actually sent. */ SignalProxy< void (int64_t)> sigBytesWritten (); /*! * Signal is emitted every time all bytes have been written to the underlying device. */ SignalProxy< void ()> sigAllBytesWritten (); /*! * Emitted when the backing device of the given read channel is closed, * data might be still available in the buffer to read */ SignalProxy< void(uint) >sigReadChannelFinished(); protected: IODevice( IODevicePrivate &d ); virtual bool open ( const OpenMode mode ); virtual int64_t rawBytesAvailable ( uint channel ) const = 0; virtual int64_t writeData ( const char *data, int64_t count ) = 0; virtual int64_t readData ( uint channel, char *buffer, int64_t bufsize ) = 0; virtual void readChannelChanged ( uint channel ) = 0; void setReadChannelCount ( uint channels ); void finishReadChannel ( uint channel ); }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS( IODevice::OpenMode ); /*! * Small wrapper streambuf to support writing data to a IODevice * using std::ostream */ class IODeviceOStreamBuf : public std::streambuf { public: IODeviceOStreamBuf( IODeviceRef dev ); IODeviceOStreamBuf(const IODeviceOStreamBuf &) = default; IODeviceOStreamBuf(IODeviceOStreamBuf &&) = default; IODeviceOStreamBuf &operator=(const IODeviceOStreamBuf &) = default; IODeviceOStreamBuf &operator=(IODeviceOStreamBuf &&) = default; // basic_streambuf interface protected: int_type overflow(int_type __c) override; private: IODeviceRef _dev; }; } #endif libzypp-17.36.5/zypp-core/zyppng/io/private/000077500000000000000000000000001476576476200207565ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/io/private/abstractspawnengine_p.h000066400000000000000000000063351476576476200255170ustar00rootroot00000000000000#ifndef ZYPPNG_IO_PRIVATE_ABSTRACTPROCESSBACKEND_H #define ZYPPNG_IO_PRIVATE_ABSTRACTPROCESSBACKEND_H #include #include #include #include #include #include #include namespace zyppng { /*! * This implements the basic skeleton of ExternalProgram and Process. * Taking care of forking the process and setting up stdout and stderr so both * implementations can use the same code * */ class AbstractSpawnEngine { public: /** * For passing additional environment variables to set */ using Environment = std::map; AbstractSpawnEngine(); virtual ~AbstractSpawnEngine(); static std::unique_ptr createDefaultEngine (); int exitStatus () const; void setExitStatus ( const int state ); const std::string &executedCommand () const; const std::string &execError() const; void setExecError ( const std::string & str ); zypp::Pathname chroot() const; void setChroot( const zypp::Pathname &chroot ); bool useDefaultLocale() const; void setUseDefaultLocale( bool defaultLocale ); Environment environment() const; void setEnvironment( const Environment &environment ); /** * @returns the pid of the forked process, without checking if the process is * still running. */ pid_t pid ( ); /*! * Kickstart the process, if this returns true it is guaranteed that exec() was successful */ virtual bool start ( const char *const *argv, int stdin_fd, int stdout_fd, int stderr_fd ) = 0; virtual bool waitForExit ( const std::optional &timeout = {} ) = 0; virtual bool isRunning ( bool wait = false ) = 0; /*! * Used to notify the backend that the process has ended, * helpful when the process is tracked in another way than calling \ref isRunning, * for example in a eventloop. */ virtual void notifyExited ( int status ); bool dieWithParent() const; void setDieWithParent( bool dieWithParent ); bool switchPgid() const; void setSwitchPgid(bool switchPgid); zypp::Pathname workingDirectory() const; void setWorkingDirectory(const zypp::Pathname &workingDirectory); const std::vector &fdsToMap () const; void addFd ( int fd ); int checkStatus(int status); protected: bool _useDefaultLocale = false; /** Should the process die with the parent process */ bool _dieWithParent = false; bool _switchPgid = false; pid_t _pid = -1; int _exitStatus = 0; /** Remember execution errors like failed fork/exec. */ std::string _execError; /** Store the command we're executing. */ std::string _executedCommand; /** The arguments we want to pass to the program. */ std::vector _args; /** Environment variables to set in the new process. */ Environment _environment; /** Path to chroot into */ zypp::Pathname _chroot; /** Working directory */ zypp::Pathname _workingDirectory; /** Additional file descriptors we want to map to the new process */ std::vector _mapFds; }; } // namespace zyppng #endif // ZYPPNG_IO_PRIVATE_ABSTRACTPROCESSBACKEND_H libzypp-17.36.5/zypp-core/zyppng/io/private/asyncdatasource_p.h000066400000000000000000000023421476576476200246370ustar00rootroot00000000000000#ifndef ZYPP_CORE_ZYPPNG_IO_PRIVATE_ASYNCDATASOURCE_P_H_INCLUDED #define ZYPP_CORE_ZYPPNG_IO_PRIVATE_ASYNCDATASOURCE_P_H_INCLUDED #include #include #include "iodevice_p.h" #include "iobuffer_p.h" namespace zyppng { class AsyncDataSourcePrivate : public IODevicePrivate { ZYPP_DECLARE_PUBLIC(AsyncDataSource) public: AsyncDataSourcePrivate ( AsyncDataSource &pub ) : IODevicePrivate(pub) {} struct ReadChannelDev { int _readFd = -1; SocketNotifier::Ptr _readNotifier; }; std::vector _readFds; SocketNotifier::Ptr _writeNotifier; IOBuffer _writeBuffer; int _writeFd = -1; void notifierActivated (const SocketNotifier ¬ify, int evTypes ); void readyRead ( uint channel ); void readyWrite ( ); void closeWriteChannel ( AsyncDataSource::ChannelCloseReason reason ); void closeReadChannel ( uint channel, AsyncDataSource::ChannelCloseReason reason ); Signal _sigWriteFdClosed; Signal _sigReadFdClosed; }; } #endif // ZYPP_CORE_ZYPPNG_IO_PRIVATE_ASYNCDATASOURCE_P_H_INCLUDED libzypp-17.36.5/zypp-core/zyppng/io/private/forkspawnengine_p.h000066400000000000000000000027551476576476200246570ustar00rootroot00000000000000#ifndef ZYPPNG_IO_PRIVATE_FORKSPAWNENGINE_H #define ZYPPNG_IO_PRIVATE_FORKSPAWNENGINE_H #include "abstractspawnengine_p.h" #include namespace zyppng { class AbstractDirectSpawnEngine : public AbstractSpawnEngine { public: ~AbstractDirectSpawnEngine() override; bool isRunning ( bool wait = false ) override; bool waitForExit ( const std::optional &timeout = {} ) override; protected: void mapExtraFds( int controlFd = -1 ); void resetSignals(); }; /*! \internal Process forking engine that's using the traditional fork() approach */ class ForkSpawnEngine : public AbstractDirectSpawnEngine { public: bool start( const char *const *argv, int stdin_fd, int stdout_fd, int stderr_fd ) override; bool usePty () const; void setUsePty ( const bool set = true ); private: /** * Set to true, if a pair of ttys is used for communication * instead of a pair of pipes. */ bool _use_pty = false; }; #if GLIB_CHECK_VERSION( 2, 58, 0) #define ZYPP_HAS_GLIBSPAWNENGINE 1 /*! \internal Process forking engine that's using g_spawn from glib which can in most cases optimize using posix_spawn. */ class GlibSpawnEngine : public AbstractDirectSpawnEngine { public: bool start( const char *const *argv, int stdin_fd, int stdout_fd, int stderr_fd ) override; private: static void glibSpawnCallback ( void *data ); }; #else #define ZYPP_HAS_GLIBSPAWNENGINE 0 #endif } #endif // libzypp-17.36.5/zypp-core/zyppng/io/private/iobuffer_p.h000066400000000000000000000031151476576476200232470ustar00rootroot00000000000000#ifndef ZYPPNG_IO_IOBUFFER_P_H #define ZYPPNG_IO_IOBUFFER_P_H #include #include #include namespace zyppng { class IOBuffer { struct Chunk { ByteArray _buffer; int64_t head = 0; int64_t tail = 0; char * data () { return _buffer.data() + head; } const char * data () const { return _buffer.data() + head; } int64_t available() const { return _buffer.size() - tail; } int64_t len () const { return tail - head; } }; public: IOBuffer( int64_t chunkSize = 0 ); char *reserve( int64_t bytes ); char *front (); int64_t frontSize () const; void clear ( ); int64_t discard( int64_t bytes ); void chop ( int64_t bytes ); void append ( const char *data, int64_t count ); void append ( const ByteArray &data ); int64_t read ( char *buffer, int64_t max ); int64_t size ( ) const; std::vector::size_type chunks () const; inline int64_t indexOf ( const char c ) const { return indexOf( c, size() ); } int64_t indexOf (const char c, int64_t maxCount, int64_t pos = 0 ) const; ByteArray readUntil ( const char delim, const int64_t max = 0 ); int64_t readUntil( char *buffer, const char delim, int64_t max ); ByteArray readLine ( const int64_t max = 0 ); int64_t readLine( char *buffer, int64_t max ); bool canReadUntil ( const char delim ) const; bool canReadLine () const; private: int64_t _defaultChunkSize; std::vector _chunks; }; } #endif libzypp-17.36.5/zypp-core/zyppng/io/private/iodevice_p.h000066400000000000000000000031461476576476200232410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_IO_IODEVICE_P_DEFINED #define ZYPPNG_IO_IODEVICE_P_DEFINED #include #include #include #include #include "iobuffer_p.h" namespace zyppng { namespace constants { constexpr std::string_view outOfRangeErrMsg("Channel index out of range"); } enum { DefIoDeviceBufChunkSize = 16384 }; class IODevicePrivate : public BasePrivate { public: IODevicePrivate ( IODevice &p ); std::vector _readChannels; uint _currentReadChannel = 0; int64_t _readBufChunkSize = DefIoDeviceBufChunkSize; IODevice::OpenMode _mode = IODevice::Closed; Signal< void() > _readyRead; Signal< void(uint) > _channelReadyRead; Signal< void (int64_t)> _sigBytesWritten; Signal< void ()> _sigAllBytesWritten; Signal< void(uint) > _sigReadChannelFinished; }; } #endif libzypp-17.36.5/zypp-core/zyppng/io/private/sockaddr_p.h000066400000000000000000000015031476576476200232370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_IO_SOCKADDR_P_H #define ZYPPNG_IO_SOCKADDR_P_H #include #endif // ZYPPNG_IO_SOCKADDR_P_H libzypp-17.36.5/zypp-core/zyppng/io/private/socket_p.h000066400000000000000000000073761476576476200227530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_IO_SOCKET_P_DEFINED #define ZYPPNG_IO_SOCKET_P_DEFINED #include #include #include #include #include "iodevice_p.h" #include namespace zyppng { class SocketPrivate : public IODevicePrivate { ZYPP_DECLARE_PUBLIC(Socket) public: SocketPrivate( int domain, int type, int protocol, Socket &p ) : IODevicePrivate(p), _domain(domain), _type( type ), _protocol( protocol ) { } static Socket::Ptr wrapSocket( int fd, int domain, int type, int protocol, Socket::SocketState state ); bool initSocket () ; void setError ( Socket::SocketError error, std::string &&err, bool emit = true ); bool handleConnectError ( int error ); bool transition ( Socket::SocketState newState ); Socket::SocketState state () const; bool connectToHost (); void onSocketActivated ( int ev ); void onSocketActivatedSlot ( const SocketNotifier &, int ev ) { return onSocketActivated(ev); } int64_t rawBytesAvailable () const; bool readRawBytesToBuffer (); bool writePendingData (); int _domain; int _type; int _protocol; std::shared_ptr _targetAddr; int _socket = -1; bool _borrowedSocket = false; //error handling bool _emittedErr = false; Socket::SocketError _error = Socket::NoError; std::string _errorDesc; //signals Signal< void(Socket::SocketError)> _sigError; Signal< void()> _incomingConnection; Signal< void()> _connected; Signal< void()> _disconnected; struct InitialState { static constexpr Socket::SocketState type() { return Socket::InitialState; } }; struct ConnectingState : public sigc::trackable { NON_COPYABLE(ConnectingState); ConnectingState() = default; static constexpr Socket::SocketState type() { return Socket::ConnectingState; } SocketNotifier::Ptr _connectNotifier; Timer::Ptr _connectTimeout; }; struct ConnectedState : public sigc::trackable { NON_COPYABLE(ConnectedState); ConnectedState() = default; static constexpr Socket::SocketState type() { return Socket::ConnectedState; } SocketNotifier::Ptr _socketNotifier; IOBuffer _writeBuffer; }; struct ListeningState : public sigc::trackable { NON_COPYABLE(ListeningState); ListeningState() = default; static constexpr Socket::SocketState type() { return Socket::ListeningState; } SocketNotifier::Ptr _socketNotifier; }; struct ClosingState { static constexpr Socket::SocketState type() { return Socket::ClosingState; } ClosingState( IOBuffer &&writeBuffer ); SocketNotifier::Ptr _socketNotifier; IOBuffer _writeBuffer; }; struct ClosedState { static constexpr Socket::SocketState type() { return Socket::ClosedState; } }; std::variant< InitialState, ConnectingState, ConnectedState, ListeningState, ClosingState, ClosedState > _state = InitialState(); }; } #endif libzypp-17.36.5/zypp-core/zyppng/io/process.cpp000066400000000000000000000161251476576476200214730ustar00rootroot00000000000000#include "process.h" #include #include #include #include #include #include namespace zyppng { /*! * @todo We will receive a started signal here before exec was called, so sigStarted actually just * signals that the fork has worked out but NOT that the app actually started */ class ProcessPrivate : public AsyncDataSourcePrivate { public: ProcessPrivate( Process &p ) : AsyncDataSourcePrivate(p) , _sigFinished(p) { } void cleanup() { _stdinFd = -1; _stderrFd = -1; _stdoutFd = -1; } std::unique_ptr _spawnEngine = AbstractSpawnEngine::createDefaultEngine(); zypp::AutoFD _stdinFd = -1; zypp::AutoFD _stderrFd = -1; zypp::AutoFD _stdoutFd = -1; Signal _sigStarted; MemSignal _sigFinished; Signal _sigFailedToStart; Process::OutputChannelMode _channelMode = Process::Seperate; Process::OutputChannel _currentChannel = Process::StdOut; }; ZYPP_IMPL_PRIVATE(Process) Process::Process() : AsyncDataSource( *( new ProcessPrivate(*this) ) ) { } Process::Ptr Process::create() { return std::shared_ptr( new Process() ); } Process::~Process() { Z_D(); if ( d->_spawnEngine->pid() >= 0 ) { EventDispatcher::instance()->untrackChildProcess( d->_spawnEngine->pid() ); DBG << "Process destroyed while still running removing from EventLoop." << std::endl; } } bool Process::start( const char *const *argv ) { Z_D(); if ( !EventDispatcher::instance() ) { ERR << "A valid EventDispatcher needs to be registered before starting a Process" << std::endl; return false; } if ( isRunning() ) return false; // clean up the previous run AsyncDataSource::close(); d->cleanup(); // create the pipes we need auto stdinPipe = Pipe::create( ); if ( !stdinPipe ) { d->_sigFailedToStart.emit(); return false; } auto stdoutPipe = Pipe::create( ); if ( !stdoutPipe ) { d->_sigFailedToStart.emit(); return false; } int stderr_fd = -1; std::optional stderrPipe; if ( d->_channelMode == Seperate ) { stderrPipe = Pipe::create( ); if ( !stderrPipe ) { d->_sigFailedToStart.emit(); return false; } stderr_fd = stderrPipe->writeFd; } else { stderr_fd = stdoutPipe->writeFd; } if ( d->_spawnEngine->start( argv, stdinPipe->readFd, stdoutPipe->writeFd, stderr_fd ) ) { // if we reach this point the engine guarantees that exec() was successful const auto pid = d->_spawnEngine->pid( ); // register to the eventloop right away EventDispatcher::instance()->trackChildProcess( pid, [this]( int, int status ){ Z_D(); d->_spawnEngine->notifyExited( status ); d->_sigFinished.emit( d->_spawnEngine->exitStatus() ); }); // make sure the fds we need are kept open d->_stdinFd = std::move( stdinPipe->writeFd ); d->_stdoutFd = std::move( stdoutPipe->readFd ); std::vector rFds { d->_stdoutFd }; if ( stderrPipe ) { d->_stderrFd = std::move( stderrPipe->readFd ); rFds.push_back( d->_stderrFd.value() ); } if ( !openFds( rFds, d->_stdinFd ) ) { stop( SIGKILL ); return false; } d->_sigStarted.emit(); return true; } d->_sigFailedToStart.emit(); return false; } void Process::stop( int signal ) { Z_D(); if ( isRunning() ) { ::kill( d->_spawnEngine->pid(), signal ); } } bool Process::isRunning() { Z_D(); return ( d->_spawnEngine->pid() > -1 ); } void Process::close () { flush(); stop(SIGKILL); d_func()->cleanup(); AsyncDataSource::close(); } void Process::waitForExit() { Z_D(); if ( d->_spawnEngine->isRunning() ) { // we will manually track the exit status EventDispatcher::instance()->untrackChildProcess( d->_spawnEngine->pid() ); // wait for the process to exit d->_spawnEngine->isRunning( true ); } } void Process::closeWriteChannel() { Z_D(); d->_stdinFd = -1; AsyncDataSource::closeWriteChannel(); } const std::string &Process::executedCommand() const { return d_func()->_spawnEngine->executedCommand(); } const std::string &Process::execError() const { return d_func()->_spawnEngine->execError(); } zypp::filesystem::Pathname Process::chroot() const { return d_func()->_spawnEngine->chroot(); } void Process::setChroot( const zypp::filesystem::Pathname &chroot ) { return d_func()->_spawnEngine->setChroot( chroot ); } bool Process::useDefaultLocale() const { return d_func()->_spawnEngine->useDefaultLocale(); } void Process::setUseDefaultLocale( bool defaultLocale ) { return d_func()->_spawnEngine->setUseDefaultLocale( defaultLocale ); } Process::Environment Process::environment() const { return d_func()->_spawnEngine->environment(); } void Process::setEnvironment( const Process::Environment &env ) { return d_func()->_spawnEngine->setEnvironment( env ); } pid_t Process::pid() { return d_func()->_spawnEngine->pid(); } int Process::exitStatus() const { return d_func()->_spawnEngine->exitStatus(); } bool Process::dieWithParent() const { return d_func()->_spawnEngine->dieWithParent(); } void Process::setDieWithParent( bool enabled ) { return d_func()->_spawnEngine->setDieWithParent( enabled ); } bool Process::switchPgid() const { return d_func()->_spawnEngine->switchPgid(); } void Process::setSwitchPgid(bool enabled) { return d_func()->_spawnEngine->setSwitchPgid( enabled ); } zypp::filesystem::Pathname Process::workingDirectory() const { return d_func()->_spawnEngine->workingDirectory(); } void Process::setWorkingDirectory(const zypp::filesystem::Pathname &wd) { return d_func()->_spawnEngine->setWorkingDirectory( wd ); } const std::vector &Process::fdsToMap() const { return d_func()->_spawnEngine->fdsToMap(); } void Process::addFd(int fd) { return d_func()->_spawnEngine->addFd( fd ); } int Process::stdinFd() { return d_func()->_stdinFd; } int Process::stdoutFd() { return d_func()->_stdoutFd; } int Process::stderrFd() { return d_func()->_stderrFd; } SignalProxy Process::sigStarted() { return d_func()->_sigStarted; } SignalProxy Process::sigFailedToStart() { return d_func()->_sigFailedToStart; } SignalProxy Process::sigFinished() { return d_func()->_sigFinished; } Process::OutputChannelMode Process::outputChannelMode() const { return d_func()->_channelMode; } void Process::setOutputChannelMode(const OutputChannelMode &outputChannelMode) { d_func()->_channelMode = outputChannelMode; } } libzypp-17.36.5/zypp-core/zyppng/io/process.h000066400000000000000000000061721476576476200211410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_IO_PROCESS_H_DEFINED #define ZYPPNG_IO_PROCESS_H_DEFINED #include #include #include #include #include namespace zyppng { class ProcessPrivate; class IODevice; ZYPP_FWD_DECL_TYPE_WITH_REFS (Process); class Process : public AsyncDataSource { ZYPP_DECLARE_PRIVATE(Process) public: /** * For passing additional environment variables to set */ using Environment = std::map; using Ptr = ProcessRef; using WeakPtr = ProcessWeakRef; enum OutputChannelMode { Seperate, Merged }; enum OutputChannel { StdOut = 0, StdErr = 1 }; static Ptr create (); ~Process() override; bool start ( const char *const *argv ); void stop ( int signal = SIGTERM ); bool isRunning (); void close () override; /*! * Blocks until the process has exited, during that time readyRead is not * emitted for any read channels. Call \ref readAll to get all remaining data * that was written by the process */ void waitForExit (); /*! * Close the stdin fd of the subprocess. This is required for processes * that run until their stdin is closed. */ void closeWriteChannel () override; const std::string &executedCommand () const; const std::string &execError() const; zypp::Pathname chroot() const; void setChroot( const zypp::Pathname &chroot ); bool useDefaultLocale() const; void setUseDefaultLocale( bool defaultLocale ); Environment environment() const; void setEnvironment( const Environment &environment ); pid_t pid (); int exitStatus () const; bool dieWithParent() const; void setDieWithParent(bool enabled ); bool switchPgid() const; void setSwitchPgid(bool enabled); zypp::Pathname workingDirectory() const; void setWorkingDirectory(const zypp::Pathname &workingDirectory); const std::vector &fdsToMap () const; void addFd ( int fd ); int stdinFd (); int stdoutFd (); int stderrFd (); SignalProxy sigStarted (); SignalProxy sigFailedToStart (); SignalProxy sigFinished (); OutputChannelMode outputChannelMode() const; void setOutputChannelMode(const OutputChannelMode &outputChannelMode); protected: Process(); }; } #endif // ZYPPNG_IO_PROCESS_H_DEFINED libzypp-17.36.5/zypp-core/zyppng/io/sockaddr.cpp000066400000000000000000000013011476576476200215750ustar00rootroot00000000000000#include "sockaddr.h" #include namespace zyppng { UnixSockAddr::UnixSockAddr(const std::string &path , bool abstract ) : _data( std::make_shared() ) { memset( _data.get(), 0, size() ); _data->sun_family = AF_UNIX; if ( path.size() ) { const auto align = abstract ? 1 : 0; path.copy( _data->sun_path + align, sizeof( _data->sun_path ) - align - 1 ); } } sockaddr *UnixSockAddr::nativeSockAddr() const { return reinterpret_cast(_data.get()); } std::size_t UnixSockAddr::size() const { return sizeof(struct sockaddr_un); } bool UnixSockAddr::isAbstract() const { return _data->sun_path[0]; } } libzypp-17.36.5/zypp-core/zyppng/io/sockaddr.h000066400000000000000000000026711476576476200212550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_IO_SOCKADDR_H_DEFINED #define ZYPPNG_IO_SOCKADDR_H_DEFINED #include #include #include #include struct sockaddr_un; namespace zyppng { class SockAddr { public: virtual ~SockAddr(){}; virtual struct ::sockaddr* nativeSockAddr () const = 0; virtual std::size_t size () const = 0; protected: }; class UnixSockAddr : public SockAddr { public: using Ptr = std::shared_ptr; UnixSockAddr( const std::string &path, bool abstract ); // SockAddr interface sockaddr *nativeSockAddr() const override; std::size_t size() const override; bool isAbstract () const; private: std::shared_ptr _data; }; } #endif // SOCKADDR_H libzypp-17.36.5/zypp-core/zyppng/io/socket.cc000066400000000000000000000622651476576476200211160ustar00rootroot00000000000000#include "private/socket_p.h" #include #include #include #include #include #include #include //For FIONREAD #include #include #include #include namespace zyppng { SocketPrivate::ClosingState::ClosingState(IOBuffer &&writeBuffer) : _writeBuffer( std::move(writeBuffer) ) { } bool SocketPrivate::initSocket() { if ( _socket >= 0 ) return true; _error = Socket::NoError; _emittedErr = false; // Since Linux 2.6.27 we can pass additional flags with the type argument to avoid fcntl // if creating sockets fails we might need to change that _socket = eintrSafeCall( ::socket, _domain, _type | SOCK_NONBLOCK | SOCK_CLOEXEC, _protocol ); if ( _socket >= 0 ) return true; switch ( errno ) { case EACCES: setError( Socket::InsufficientPermissions, strerr_cxx() ); break; case EINVAL: setError( Socket::InvalidSocketOptions, strerr_cxx() ); break; case EMFILE: case ENFILE: case ENOBUFS: case ENOMEM: setError( Socket::InsufficientRessources, strerr_cxx() ); break; case EAFNOSUPPORT: case EPROTONOSUPPORT: setError ( Socket::UnsupportedSocketOptions, strerr_cxx() ); break; default: setError( Socket::UnknownSocketError, strerr_cxx() ); break; } return false; } void SocketPrivate::setError( Socket::SocketError error , std::string &&err, bool emit ) { // we only remember the first error that happend if ( _error == Socket::NoError && _error != error ) { _emittedErr = emit; _error = error; _errorDesc = std::move(err); } if ( emit && !_emittedErr ) _sigError.emit( error ); } bool SocketPrivate::transition( Socket::SocketState newState ) { const auto oldState = state(); if ( oldState == newState ) return true; switch ( newState ) { case Socket::InitialState: setError( Socket::InternalError, "Invalid state transition" ); return false; case Socket::ConnectingState: if ( oldState != Socket::InitialState && oldState != Socket::ClosedState ) { setError( Socket::InternalError, "Invalid state transition" ); return false; } _state.emplace( ); return connectToHost(); break; case Socket::ConnectedState: { if ( oldState != Socket::InitialState && oldState != Socket::ConnectingState ) { setError( Socket::InternalError, "Invalid state transition" ); return false; } auto &s = _state.emplace(); s._socketNotifier = SocketNotifier::create( _socket, SocketNotifier::Read | SocketNotifier::Error, true ); s._socketNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot ); z_func()->IODevice::open( IODevice::ReadOnly | IODevice::WriteOnly ); _connected.emit(); break; } case Socket::ListeningState: { if ( state() != Socket::InitialState ) { setError( Socket::InternalError, "Invalid state transition" ); return false; } auto &s = _state.emplace(); s._socketNotifier = SocketNotifier::create( _socket, SocketNotifier::Read, true ); s._socketNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot ); break; } case Socket::ClosingState: { if ( state() != Socket::ConnectedState ) { setError( Socket::InternalError, "Invalid state transition" ); return false; } auto wbOld = std::move( std::get(_state)._writeBuffer ); auto &s = _state.emplace( std::move( wbOld ) ); s._socketNotifier = SocketNotifier::create( _socket, SocketNotifier::Write, true ); s._socketNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot ); break; } case Socket::ClosedState: { _state.emplace(); if ( z_func()->canRead() ) z_func()->finishReadChannel( 0 ); if ( _socket >= 0 && !_borrowedSocket ) ::close( _socket ); _socket = -1; _targetAddr.reset(); _disconnected.emit(); z_func()->IODevice::close(); break; } } return true; } bool SocketPrivate::connectToHost() { auto &state = std::get( _state ); const int res = eintrSafeCall( ::connect, _socket, _targetAddr->nativeSockAddr(), _targetAddr->size() ); auto doDelayedConnect = [ this, &state ](){ if ( !state._connectNotifier ) { state._connectNotifier = SocketNotifier::create( _socket, SocketNotifier::Write, true ); state._connectNotifier->connect( &SocketNotifier::sigActivated, *this, &SocketPrivate::onSocketActivatedSlot ); } if ( !state._connectTimeout ) { state._connectTimeout = Timer::create(); state._connectTimeout->connectFunc( &Timer::sigExpired, [this, &state ]( const auto &) { setError( Socket::ConnectionTimeout, "The connection timed out." ); state._connectNotifier.reset(); state._connectTimeout.reset(); }, *z_func()); } state._connectTimeout->setSingleShot( true ); state._connectTimeout->start( 30000 ); setError( Socket::ConnectionDelayed, "" ); return false; }; if ( res < 0 ) { switch ( errno ) { case EAGAIN: { if ( _targetAddr->nativeSockAddr()->sa_family == AF_UNIX ) { // the Servers backlog is full , we need to wait return doDelayedConnect(); } else { setError( Socket::FailedSocketOperation, strerr_cxx() ); z_func()->close(); return false; } break; } case EINPROGRESS: return doDelayedConnect(); break; default: if ( handleConnectError( errno ) == false ) { z_func()->close(); return false; } } } // connected yay if ( !transition( Socket::ConnectedState ) ) { z_func()->close(); return false; } return true; } int64_t zyppng::SocketPrivate::rawBytesAvailable() const { if ( state() != Socket::ConnectedState ) return 0; return zyppng::bytesAvailableOnFD( _socket ); } bool SocketPrivate::readRawBytesToBuffer() { Z_Z(); auto bytesToRead = rawBytesAvailable(); if ( bytesToRead == 0 ) { // make sure to check if bytes are available even if the ioctl call returns something different bytesToRead = 4096; } auto &readBuf = _readChannels[0]; char *buf = readBuf.reserve( bytesToRead ); const auto bytesRead = z_func()->readData( 0, buf, bytesToRead ); if ( bytesRead <= 0 ) { readBuf.chop( bytesToRead ); switch ( bytesRead ) { case -2: // there is simply no data to read ignore and try again return true; case 0: { // remote close setError( Socket::ConnectionClosedByRemote, "The remote host closed the connection", true ); break; } case -1: default: { setError( Socket::InternalError, strerr_cxx(), true ); break; } } z->abort(); return false; } if ( bytesToRead > bytesRead ) readBuf.chop( bytesToRead-bytesRead ); _readyRead.emit(); _channelReadyRead.emit(0); return true; } bool SocketPrivate::writePendingData() { return std::visit( [this]( auto &s ){ using T = std::decay_t; if constexpr ( std::is_same_v || std::is_same_v ) { const auto nwrite = s._writeBuffer.frontSize(); if ( !nwrite ) { // disable Write notifications so we do not wake up without the need to s._socketNotifier->setMode( SocketNotifier::Read | SocketNotifier::Error ); return true; } const auto nBuf = s._writeBuffer.front(); const auto written = eintrSafeCall( ::send, _socket, nBuf, nwrite, MSG_NOSIGNAL ); if ( written == -1 ) { switch ( errno ) { case EACCES: setError( Socket::InsufficientPermissions, strerr_cxx() ); return false; case EAGAIN: #if EAGAIN != EWOULDBLOCK case EWOULDBLOCK: #endif return true; case EPIPE: case ECONNRESET: setError( Socket::ConnectionClosedByRemote, strerr_cxx() ); return false; default: setError( Socket::InternalError, strerr_cxx() ); return false; } return false; } s._writeBuffer.discard( written ); _sigBytesWritten.emit( written ); if ( s._writeBuffer.size() == 0 ) _sigAllBytesWritten.emit(); } return true; }, _state ); } /*! * Maps \a error into a \ref Socket::SocketError and sets it accordingly in * the socket. Returns false if the error is fatal and connection needs to stop. */ bool zyppng::SocketPrivate::handleConnectError( int error ) { switch ( error ) { case EACCES: case EPERM: setError( Socket::InsufficientPermissions, strerr_cxx() ); return false; case EADDRINUSE: setError( Socket::AddressInUse, strerr_cxx() ); return false; case EADDRNOTAVAIL: setError( Socket::AddressNotAvailable, strerr_cxx() ); return false; case EAFNOSUPPORT: setError( Socket::AddressIssue, strerr_cxx() ); return false; case ETIMEDOUT: setError( Socket::ConnectionTimeout, strerr_cxx() ); return false; case EALREADY: setError( Socket::ConnectionDelayed, "" ); return false; case ECONNREFUSED: setError( Socket::ConnectionRefused, strerr_cxx() ); return false; case EBADF: case EFAULT: case ENOTSOCK: setError( Socket::InternalError, strerr_cxx() ); // this can only happen if we screw up return false; case ENETUNREACH: setError( Socket::NetworkUnreachable, strerr_cxx() ); return false; case EPROTOTYPE: setError ( Socket::InvalidSocketOptions, strerr_cxx() ); return false; case EISCONN: break; } return true; } void SocketPrivate::onSocketActivated( int ev ) { std::visit( [ this, &ev ] ( const auto &currState ) { using T = std::decay_t; if constexpr ( std::is_same() ) { if ( (ev & SocketNotifier::Write) == SocketNotifier::Write ) { if ( this->_targetAddr->nativeSockAddr()->sa_family == AF_UNIX ) { // for AF_UNIX sockets we just call connect again this->connectToHost(); return; } else { // for others we check with getsockopt as mentioned in connect(2) if the conn was successful int err = 0; socklen_t errSize = sizeof ( err ); ::getsockopt( _socket, SOL_SOCKET, SO_ERROR, &err, &errSize ); if ( err == 0 || err == EISCONN ) { transition( Socket::ConnectedState ); } else { if ( err == EINPROGRESS || err == EAGAIN || err == EALREADY ) return; handleConnectError( err ); z_func()->abort(); } } } } else if constexpr ( std::is_same() ) { if ( (ev & SocketNotifier::Write) == SocketNotifier::Write ) { if ( !writePendingData() ) { z_func()->abort(); return; } } if ( (ev & SocketNotifier::Read) == SocketNotifier::Read ) { if ( !readRawBytesToBuffer() ) { z_func()->abort(); return; } } if ( (ev & SocketNotifier::Error) == SocketNotifier::Error ) { return; } } else if constexpr ( std::is_same() ) { if ( (ev & SocketNotifier::Write) == SocketNotifier::Write ) { if ( !writePendingData() ) { z_func()->abort(); return; } if ( currState._writeBuffer.size() == 0 ) { transition( Socket::ClosedState ); } } } else if constexpr ( std::is_same() ) { //signal that we have pending connections _incomingConnection.emit(); } else { DBG << "Unexpected state on socket activation" << std::endl; } },_state); } Socket::SocketState SocketPrivate::state() const { return std::visit([]( const auto &s ) constexpr { return s.type(); }, _state ); } Socket::Ptr SocketPrivate::wrapSocket(int fd, int domain, int type, int protocol, Socket::SocketState state) { // from here on the Socket instance owns the fd, no need to manually close it // in case of error auto sptr = Socket::create( domain, type, protocol ); sptr->d_func()->_socket = fd; // make sure the socket is non blocking if ( !sptr->setBlocking( false ) ) { DBG << "Failed to unblock socket." << std::endl; return nullptr; } if( sptr->d_func()->transition( state ) ) return sptr; return nullptr; } ZYPP_IMPL_PRIVATE(Socket) Socket::Socket( int domain, int type, int protocol ) : IODevice( *( new SocketPrivate( domain, type, protocol, *this ))) { } int64_t Socket::rawBytesAvailable( uint channel ) const { if ( channel != 0 ) { constexpr std::string_view msg("Socket does not support multiple read channels"); ERR << msg << std::endl; throw std::logic_error( msg.data() ); } return d_func()->rawBytesAvailable(); } Socket::~Socket() { this->abort(); } Socket::Ptr Socket::create( int domain, int type, int protocol ) { return Ptr( new Socket( domain, type, protocol ) ); } bool Socket::bind( const std::shared_ptr &addr ) { Z_D(); if ( !addr || !d->initSocket() ) return false; int res = eintrSafeCall( ::bind, d->_socket, addr->nativeSockAddr(), addr->size() ); if ( res >= 0) return true; switch ( errno ) { case EACCES: d->setError( Socket::InsufficientPermissions, strerr_cxx() ); break; case EADDRINUSE: d->setError( Socket::AddressInUse, strerr_cxx() ); break; case EBADF: case ENOTSOCK: case EFAULT: d->setError( Socket::InternalError, strerr_cxx() ); // this can only happen if we screw up break; case EINVAL: d->setError( Socket::SocketAlreadyBound, strerr_cxx() ); break; case EADDRNOTAVAIL: d->setError( Socket::AddressNotAvailable, strerr_cxx() ); break; case ELOOP: case ENAMETOOLONG: case ENOENT: case ENOTDIR: case EROFS: d->setError( Socket::AddressIssue, strerr_cxx() ); break; case ENOMEM: d->setError( Socket::InsufficientRessources, strerr_cxx() ); break; default: d->setError( Socket::UnknownSocketError, strerr_cxx() ); break; } abort(); return false; } bool Socket::listen(int backlog) { Z_D(); if ( !d->initSocket() ) return false; int res = eintrSafeCall( ::listen, d->_socket, backlog ); if ( res >= 0 ) { d->transition( Socket::ListeningState ); return true; } switch ( errno ) { case EADDRINUSE: d->setError( Socket::AddressInUse, strerr_cxx() ); break; case EBADF: case ENOTSOCK: d->setError( Socket::InternalError, strerr_cxx() ); // this can only happen if we screw up break; case EOPNOTSUPP: d->setError( Socket::OperationNotSupported, strerr_cxx() ); break; } return false; } Socket::Ptr Socket::accept() { Z_D(); if ( d->_socket == -1 ) return nullptr; //accept new pending connections const auto res = eintrSafeCall( ::accept4, d->_socket, (struct sockaddr*)nullptr, (socklen_t *)nullptr, SOCK_CLOEXEC ); if ( res < 0 ) { switch ( errno ) { #if EAGAIN != EWOULDBLOCK case EWOULDBLOCK: #endif case EAGAIN: case ECONNABORTED: return nullptr; break; default: d->setError( Socket::InternalError, strerr_cxx() ); return nullptr; } } return SocketPrivate::wrapSocket( res, d->_domain, d->_type, d->_protocol, Socket::ConnectedState ); } Socket::Ptr Socket::fromSocket( int fd, Socket::SocketState state ) { int domain = 0; socklen_t optlen = sizeof(domain); int res = getsockopt( fd, SOL_SOCKET, SO_DOMAIN, &domain, &optlen ); if ( res < 0 ) { DBG << "Error querying socket domain: " << strerr_cxx() << std::endl; ::close(fd); return nullptr; } int protocol = 0; optlen = sizeof(protocol); res = getsockopt( fd, SOL_SOCKET, SO_PROTOCOL, &protocol, &optlen ); if ( res < 0 ) { DBG << "Error querying socket protocol: " << strerr_cxx() << std::endl; ::close(fd); return nullptr; } int type = 0; optlen = sizeof(type); res = getsockopt( fd, SOL_SOCKET, SO_TYPE, &type, &optlen ); if ( res < 0 ) { DBG << "Error querying socket type: " << strerr_cxx() << std::endl; ::close(fd); return nullptr; } return SocketPrivate::wrapSocket( fd, domain, type, protocol, state ); } bool Socket::setBlocking( const bool set ) { Z_D(); if ( !d->initSocket() ) return false; const int oldFlags = fcntl( d->_socket, F_GETFL, 0 ); if (oldFlags == -1) return false; const int flags = set ? ( oldFlags & ~(O_NONBLOCK) ) : ( oldFlags | O_NONBLOCK ); // no need to do a syscall if we do not change anything if ( flags == oldFlags ) return true; if ( fcntl( d->_socket, F_SETFL, flags ) != 0) { return false; } return true; } bool Socket::connect( std::shared_ptr addr ) { Z_D(); if ( !addr || ( d->state() != Socket::InitialState && d->state() != Socket::ClosedState ) ) return false; if ( !d->initSocket() ) return false; d->_targetAddr = std::move(addr); if ( !d->transition( Socket::ConnectingState ) ) { abort(); return false; } return d->state() == Socket::ConnectedState; } int Socket::nativeSocket() const { Z_D(); return d->_socket; } int Socket::releaseSocket() { Z_D(); auto sock = d->_socket; d->_socket = -1; d->transition( Socket::ClosedState ); return sock; } Socket::SocketError Socket::lastError() const { Z_D(); return d->_error; } void Socket::abort() { Z_D(); d->transition( ClosedState ); } void Socket::close() { disconnect(); } void Socket::disconnect() { Z_D(); std::visit([&d]( const auto &s ){ using Type = std::decay_t; if constexpr ( std::is_same_v ) { // we still have pending data, we need to wait for it to be written if ( s._writeBuffer.size() ) { d->transition( Socket::ClosingState ); return; } } d->transition( Socket::ClosedState ); }, d->_state ); } int64_t Socket::writeData( const char *data, int64_t count ) { Z_D(); if ( d->state() != SocketState::ConnectedState ) return 0; auto &s = std::get( d->_state ); // if the write buffer has already data we need to append to it to keep the correct order if ( s._writeBuffer.size() ) { s._writeBuffer.append( data, count ); //lets try to write some of it d->writePendingData(); return count; } auto written = eintrSafeCall( ::send, d->_socket, data, count, MSG_NOSIGNAL ); if ( written == -1 ) { switch ( errno ) { #if EAGAIN != EWOULDBLOCK case EWOULDBLOCK: #endif case EAGAIN: { written = 0; break; } case EPIPE: case ECONNRESET: { d->setError( Socket::ConnectionClosedByRemote, strerr_cxx( errno ) ); return -1; } default: { d->setError( Socket::UnknownSocketError, strerr_cxx( errno ) ); return -1; } } } if ( written >= 0 ) { if ( written < count ) { // append the rest of the data to the buffer, so we can return always the full count s._writeBuffer.append( data + written, count - written ); s._socketNotifier->setMode( SocketNotifier::Read | SocketNotifier::Write | SocketNotifier::Error ); } if ( written > 0 ) d->_sigBytesWritten.emit( written ); } if ( s._writeBuffer.size() == 0 ) d->_sigAllBytesWritten.emit(); return count; } bool Socket::waitForConnected( int timeout ) { Z_D(); if ( d->state() == Socket::ConnectedState ) return true; // we can only wait if we are in connecting state while ( d->state() == Socket::ConnectingState ) { int rEvents = 0; if ( EventDispatcher::waitForFdEvent( d->_socket, AbstractEventSource::Write, rEvents, timeout ) ) { d->onSocketActivated( rEvents ); } else { // timeout return false; } } return d->state() == Socket::ConnectedState; } bool Socket::waitForAllBytesWritten( int timeout ) { Z_D(); bool canContinue = true; bool bufferEmpty = false; while ( canContinue && !bufferEmpty ) { if ( d->state() != Socket::ConnectedState && d->state() != Socket::ClosingState) return false; std::visit([&]( const auto &s ){ using T = std::decay_t; if constexpr ( std::is_same_v || std::is_same_v ) { if ( s._writeBuffer.size() > 0 ) { int rEvents = 0; canContinue = EventDispatcher::waitForFdEvent( d->_socket, AbstractEventSource::Write | AbstractEventSource::Read, rEvents, timeout ); if ( canContinue ) { //this will trigger the bytesWritten signal, we check there if the buffer is empty d->onSocketActivated( rEvents ); } } if ( s._writeBuffer.size() == 0 ){ canContinue = false; bufferEmpty = true; } } }, d->_state ); } return bufferEmpty; } bool Socket::waitForReadyRead( uint channel, int timeout) { Z_D(); if ( d->state() != Socket::ConnectedState || channel != 0 ) return false; // we can only wait if we are in connected state while ( d->state() == Socket::ConnectedState && bytesAvailable() <= 0 ) { int rEvents = 0; if ( EventDispatcher::waitForFdEvent( d->_socket, AbstractEventSource::Read | AbstractEventSource::Error , rEvents, timeout ) ) { d->onSocketActivated( rEvents ); } else { //timeout return false; } } return bytesAvailable() > 0; } int64_t Socket::readData( uint channel, char *buffer, int64_t bufsize ) { if ( channel != 0 ) { constexpr std::string_view msg("Socket does not support multiple read channels"); ERR << msg << std::endl; throw std::logic_error( msg.data() ); } Z_D(); if ( d->state() != SocketState::ConnectedState ) return -1; const auto read = eintrSafeCall( ::read, d->_socket, buffer, bufsize ); // special case for remote close if ( read == 0 ) { d->setError( ConnectionClosedByRemote, "The remote host closed the connection", false ); return 0; } else if ( read < 0 ) { switch ( errno ) { #if EAGAIN != EWOULDBLOCK case EWOULDBLOCK: #endif case EAGAIN: { return -2; } default: { d->setError( UnknownSocketError, strerr_cxx( errno ), false ); return -1; } } } return read; } void Socket::readChannelChanged ( uint channel ) { if ( channel != 0 ) { constexpr std::string_view msg("Changing the readChannel on a Socket is not supported"); ERR << msg << std::endl; throw std::logic_error( msg.data() ); } } int64_t Socket::bytesPending() const { Z_D(); return std::visit([&]( const auto &s ) -> int64_t { using T = std::decay_t; if constexpr ( std::is_same_v || std::is_same_v ) { return s._writeBuffer.size(); } return 0; }, d->_state ); } Socket::SocketState Socket::state() const { return d_func()->state(); } SignalProxy Socket::sigIncomingConnection() { return d_func()->_incomingConnection; } SignalProxy Socket::sigConnected() { return d_func()->_connected; } SignalProxy Socket::sigDisconnected() { return d_func()->_disconnected; } SignalProxy Socket::sigError() { return d_func()->_sigError; } } libzypp-17.36.5/zypp-core/zyppng/io/socket.h000066400000000000000000000164551476576476200207600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_IO_SOCKET_DEFINED #define ZYPPNG_IO_SOCKET_DEFINED #include #include #include namespace zyppng { class SocketPrivate; /*! * Combines Sockets with the zypp event loop. Generally every socket type that is supported * by the socket(2) API should work, however currently only Unix Domain sockets are tested. * * The useage pattern of this class is similar to the socket(2) API, on the server endpoint * one listening socket is created and bound to a adress to accept incoming connections. * For every appected connections a connected socket instance is returned which can be used for communication with the peer. * */ class Socket : public IODevice { ZYPP_DECLARE_PRIVATE(Socket) public: enum SocketError { NoError, UnknownSocketError, InsufficientPermissions, InvalidSocketOptions, InsufficientRessources, UnsupportedSocketOptions, FailedSocketOperation, SocketAlreadyBound, SocketNotListening, AddressInUse, AddressNotAvailable, AddressIssue, OperationNotSupported, ConnectionTimeout, ConnectionDelayed, ConnectionRefused, ConnectionClosedByRemote, NetworkUnreachable, InternalError }; enum SocketState { InitialState, ConnectingState, ConnectedState, ListeningState, ClosingState, ClosedState }; using Ptr = std::shared_ptr; /*! * Creates a new socket with the given \a doman , \a type and \a protocol. * See socket(2) for available arguments. * * \note currently only AF_UNIX, SOCK_STREAM sockets are tested */ static Ptr create ( int domain, int type, int protocol ); ~Socket() override; /*! * Closed the socket and disconnects from the peer. * The \a disconnected signal will be emitted. * This is similar to calling \ref disconnect. */ void close() override; /*! * Returns the current number of bytes that are not yet written to the socket. */ int64_t bytesPending() const override; /*! * Returns the current state the socket is in, * check \ref SocketState for possible values. */ SocketState state () const; /*! * Bind the socket to a local address, this is usually required to listen for incoming connections. */ bool bind ( const std::shared_ptr &addr ); /*! * Puts the socket in listen mode, the state is set accordingly. */ bool listen ( int backlog = 50 ); /*! * Accepts a pending incoming connection and returns it as a * intialized connected socket. * Returns nullptr if there is no pending connection. */ Ptr accept (); /*! * This will set the socket into blocking mode. Can be used if there is no * EventLoop running. (Make sure a EventDispatcher instance exists for the thread) */ bool setBlocking ( const bool set = true ); /*! * Starts to disconnect from the host, wait for the actual * \ref sigDisconnected signal to arrive before destroying the socket * otherwise the connection is forcefully aborted */ void disconnect (); /*! * Forcefully aborts the connection, no matter if there is still data to be written * in the write buffer */ void abort (); /*! * Starts the connection process to the given adress in \a addr. * Returns true on success, if false is returned the current state should be * checked if the connection was simply delayed. In that case the state is \ref ConnectingState * and error is set to \ref ConnectionDelayed and the socket still tries to connect. */ bool connect ( std::shared_ptr addr ); /*! * Blocks the current event loop to wait for the connected event on the socket. * \note do not use until there is no other way */ bool waitForConnected ( int timeout = -1 ); /*! * Blocks the current event loop to wait until all bytes from the buffer have been written * to the device. * * \note do not use until there is no other way */ bool waitForAllBytesWritten ( int timeout = -1 ); /*! * Blocks the current event loop to wait until there are bytes available to read from the device * * \note do not use until there is no other way */ bool waitForReadyRead ( uint channel, int timeout = -1 ) override; /*! * Returns the native socket handle. */ int nativeSocket () const; /*! * This will release the current socket and instantly transition into * ClosedState. All unwritten data in the buffers will be discarded, * so consider to use \ref waitForAllBytesWritten before you call this function. * * \returns the socket or -1 if there was no socket connected */ int releaseSocket (); /*! * Return the last error that was encountered by the socket. */ SocketError lastError () const; /*! * Signals when there are new incoming connection pending. * \note Make sure to accept all connection otherwise the event loop keeps triggering that signal */ SignalProxy sigIncomingConnection (); /*! * Signal is emitted as soon as the socket enters the connected state. It is not possible to * read and write data. */ SignalProxy sigConnected (); /*! * Signal is emitted always when the socket was closed. In the signal handler it is still possible * to read all pending data in the read buffer, which will be discarded right after emitting the signal. * \note when the socket should be deleted in a slot connected to this signal make sure * to delay the delete using the EventDispatcher. */ SignalProxy sigDisconnected (); /*! * Signal is emitted whenever a error happend in the socket. Make sure to check * the actual error code to determine if the error is fatal. */ SignalProxy sigError (); /*! * Makes a socket instance out of a existing socket file descriptor, * the instance takes ownership of the fd */ static Ptr fromSocket ( int fd, SocketState state ); protected: Socket ( int domain, int type, int protocol ); // IODevice interface protected: int64_t rawBytesAvailable( uint channel = 0 ) const override; int64_t writeData(const char *data, int64_t count) override; int64_t readData( uint channel, char *buffer, int64_t bufsize ) override; void readChannelChanged ( uint channel ) override; }; } #endif libzypp-17.36.5/zypp-core/zyppng/meta/000077500000000000000000000000001476576476200176235ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/meta/FunctionTraits000066400000000000000000000000351476576476200225200ustar00rootroot00000000000000#include "function_traits.h" libzypp-17.36.5/zypp-core/zyppng/meta/Functional000066400000000000000000000000301476576476200216410ustar00rootroot00000000000000#include "functional.h" libzypp-17.36.5/zypp-core/zyppng/meta/TypeTraits000066400000000000000000000000311476576476200216500ustar00rootroot00000000000000#include "type_traits.h" libzypp-17.36.5/zypp-core/zyppng/meta/function_traits.h000066400000000000000000000045631476576476200232170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * * //Code based on a blogpost on https://functionalcpp.wordpress.com/2013/08/05/function-traits/ * */ #ifndef ZYPPNG_META_FUNCTION_TRAITS_H_INCLUDED #define ZYPPNG_META_FUNCTION_TRAITS_H_INCLUDED #include #include #include namespace zyppng { template struct function_traits; template struct function_traits { using return_type = R; static constexpr std::size_t arity = sizeof...(Args); template struct argument { static_assert(N >= 0 && N < arity, "error: invalid parameter index."); using type = typename std::tuple_element>::type; }; }; // function pointer template struct function_traits : public function_traits { }; // function ref template struct function_traits : public function_traits { }; // member function pointer template struct function_traits : public function_traits {}; // const member function pointer, this will match lambdas too template struct function_traits : public function_traits {}; // member object pointer template struct function_traits : public function_traits {}; template using has_call_operator = decltype (&T::operator()); //functor with one overload template struct function_traits> : public function_traits {}; } #endif libzypp-17.36.5/zypp-core/zyppng/meta/functional.h000066400000000000000000000051311476576476200221360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_META_FUNCTIONAL_H_INCLUDED #define ZYPPNG_META_FUNCTIONAL_H_INCLUDED #include #if __cplusplus <= 201402L || !defined ( __cpp_lib_invoke ) #include // this is a workaround for std::invoke not being available in C++14 // and the proposed minimal implementation in // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4169.html namespace std { template typename std::enable_if< std::is_member_pointer::type>::value, typename std::result_of::type >::type invoke(Functor&& f, Args&&... args) { return std::mem_fn(f)(std::forward(args)...); } template typename std::enable_if< !std::is_member_pointer::type>::value, typename std::result_of::type >::type invoke(Functor&& f, Args&&... args) { return std::forward(f)(std::forward(args)...); } } #endif /*! * Simple helper template to make a callback that binds the "this" pointer, to be used in * a pipeline. */ template auto mem_fn_cb( Obj& o, Ret (Obj::*objMemFunc)( Arg&& ) ) { return [tPtr = &o, fun = objMemFunc ]( Arg &&r ){ return std::invoke(fun, tPtr, std::move(r) ); }; } template auto mem_fn_cb( Obj& o, Ret (Obj::*objMemFunc)( const Arg& ) ) { return [tPtr = &o, fun = objMemFunc ]( const Arg &r ){ return std::invoke(fun, tPtr, r ); }; } template auto mem_fn_cb( Obj& o, Ret (Obj::*objMemFunc)( Arg ) ) { return [tPtr = &o, fun = objMemFunc ]( Arg r ){ if constexpr ( std::is_invocable_v< decltype (fun), Obj*, Arg&&> ) { return std::invoke(fun, tPtr, std::move(r) ); } else { return std::invoke(fun, tPtr, r ); } }; } #endif libzypp-17.36.5/zypp-core/zyppng/meta/type_traits.h000066400000000000000000000107451476576476200223520ustar00rootroot00000000000000#ifndef ZYPPNG_META_TYPE_TRAITS_INCLUDED #define ZYPPNG_META_TYPE_TRAITS_INCLUDED #include #include #if !defined ( __cpp_lib_void_t ) namespace std { //define void_t since it is only available starting with C++17 in some compilers template struct make_void { typedef void type;}; template using void_t = typename make_void::type; } #endif namespace std { //implementation of the detector idiom, used to help with SFINAE //from https://en.cppreference.com/w/cpp/experimental/is_detected namespace detail { template class Op, class... Args> struct detector { using value_t = std::false_type; using type = Default; }; template class Op, class... Args> struct detector>, Op, Args...> { using value_t = std::true_type; using type = Op; }; struct nonesuch{ ~nonesuch( ) = delete; nonesuch( nonesuch const& ) = delete; void operator = ( nonesuch const& ) = delete; }; } // namespace detail template using bool_constant = integral_constant; template class Op, class... Args> using is_detected = typename detail::detector::value_t; template class Op, class... Args> using detected_t = typename detail::detector::type; template class Op, class... Args> using detected_or = detail::detector; template< template class Op, class... Args > constexpr bool is_detected_v = is_detected::value; template< class Default, template class Op, class... Args > using detected_or_t = typename detected_or::type; template class Op, class... Args> using is_detected_exact = std::is_same>; template class Op, class... Args> constexpr bool is_detected_exact_v = is_detected_exact::value; template class Op, class... Args> using is_detected_convertible = std::is_convertible, To>; template class Op, class... Args> constexpr bool is_detected_convertible_v = is_detected_convertible::value_t::value; #if __cplusplus < 202002L template< class T > struct remove_cvref { using type = std::remove_cv_t>; }; template< class T > using remove_cvref_t = typename remove_cvref::type; #endif #if __cplusplus < 201703L //https://en.cppreference.com/w/cpp/types/conjunction) template struct conjunction : std::true_type { }; template struct conjunction : B1 { }; template struct conjunction : std::conditional_t, B1> {}; //https://en.cppreference.com/w/cpp/types/disjunction template struct disjunction : std::false_type { }; template struct disjunction : B1 { }; template struct disjunction : std::conditional_t> { }; //https://en.cppreference.com/w/cpp/types/negation template struct negation : std::bool_constant< !bool(B::value)> { }; #endif } namespace zyppng { //check wether something is a instance of a template type template < template< class ... > class Templ, class Type > struct is_instance_of : std::false_type{}; template < template< typename ... > class Templ, typename... Args > struct is_instance_of> : std::true_type{}; template < template< class ... > class Templ, class Type > constexpr bool is_instance_of_v = is_instance_of::value; //Provides the member typedef type which is the type pointed to by T, or, if T is not a pointer, then type is the same as T. template< typename T> struct remove_smart_ptr{ using type = std::remove_cv_t; }; template< typename T> struct remove_smart_ptr>{ using type = std::remove_cv_t; }; template< typename T> struct remove_smart_ptr>{ using type = std::remove_cv_t; }; template< typename T> using remove_smart_ptr_t = typename remove_smart_ptr::type; //helper template to print type parameters template class myerror_t; } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/000077500000000000000000000000001476576476200206655ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/pipelines/Algorithm000066400000000000000000000000271476576476200225350ustar00rootroot00000000000000#include "algorithm.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/AsyncResult000066400000000000000000000000311476576476200230560ustar00rootroot00000000000000#include "asyncresult.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/Await000066400000000000000000000000231476576476200216500ustar00rootroot00000000000000#include "await.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/Expected000066400000000000000000000000261476576476200223470ustar00rootroot00000000000000#include "expected.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/Lift000066400000000000000000000000221476576476200215000ustar00rootroot00000000000000#include "lift.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/MTry000066400000000000000000000000221476576476200214750ustar00rootroot00000000000000#include "mtry.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/Redo000066400000000000000000000000221476576476200214730ustar00rootroot00000000000000#include "redo.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/Transform000066400000000000000000000000271476576476200225620ustar00rootroot00000000000000#include "transform.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/Wait000066400000000000000000000000221476576476200215060ustar00rootroot00000000000000#include "wait.h" libzypp-17.36.5/zypp-core/zyppng/pipelines/algorithm.h000066400000000000000000000164741476576476200230400ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_PIPELINES_ALGORITHM_H_INCLUDED #define ZYPPNG_PIPELINES_ALGORITHM_H_INCLUDED #include #include namespace zyppng { namespace detail { struct ContinueUntilValidPredicate { template< class Arg > bool operator()( const Arg &value ) { // works if operator bool() const is implemented by type Arg if ( value ) return true; return false; } }; template struct showme; template < class Container, class AsyncResType, class Transformation, class Predicate, class DefaultType > struct AsyncFirstOfImpl : public AsyncOp { AsyncFirstOfImpl( Container &&inData, Transformation &&transFunc, DefaultType &&defaultVal, Predicate &&predicate ) : _inData ( std::move(inData) ) , _transFunc ( std::move(transFunc) ) , _defaultVal( std::move(defaultVal) ) , _predicate ( std::move(predicate)) , _currIter ( _inData.begin() ) { execute(); } private: void execute() { // seems this is empty we are ready if ( _currIter == _inData.end() ) { return returnDefault(); } invokeCurrent(); } void resultReady ( AsyncResType &&res ) { if ( !_predicate(res) ) { _currIter = std::next( _currIter ); // seems we reached the end if ( _currIter == _inData.end() ) { return returnDefault(); } invokeCurrent(); } else { this->setReady ( std::move(res) ); return; } } void invokeCurrent() { _currentPipeline = std::invoke( _transFunc, std::move( *_currIter ) ); _currentPipeline->onReady( [ this ]( AsyncResType &&res ) { this->resultReady( std::move(res)); }); } void returnDefault() { this->setReady ( std::move(_defaultVal) ); return; } private: Container _inData; Transformation _transFunc; DefaultType _defaultVal; Predicate _predicate; typename Container::iterator _currIter; AsyncOpRef _currentPipeline; }; template < class Transformation, class Predicate, class DefaultType > struct FirstOfHelper { FirstOfHelper( Transformation transFunc, DefaultType defaultVal, Predicate predicate ) : _transFunc ( std::move(transFunc) ) , _defaultVal( std::move(defaultVal) ) , _predicate ( std::move(predicate)) { } template < class Container , typename ...CArgs> auto operator()( Container &&container ) { using InputType = typename Container::value_type; static_assert( std::is_invocable_v, "Transformation function must take the container value type as input " ); static_assert( std::is_rvalue_reference_v(container))>, "Input container must be a rvalue reference" ); using OutputType = std::invoke_result_t; if constexpr ( detail::is_async_op_v ) { using AsyncResultType = typename remove_smart_ptr_t::value_type; static_assert( std::is_same_v, "Default type and transformation result type must match" ); using ImplType = AsyncFirstOfImpl; return static_cast>( std::make_shared( std::forward(container), std::move(_transFunc), std::move(_defaultVal), std::move(_predicate) ) ); } else { static_assert( std::is_same_v, "Default type and transformation result type must match" ); for ( auto &in : std::forward(container) ) { OutputType res = std::invoke( _transFunc, std::move(in) ); if ( _predicate(res) ) { return res; } } return _defaultVal; } } private: Transformation _transFunc; DefaultType _defaultVal; Predicate _predicate; }; } /*! * Provide a dummy error type for when there is no entry found */ class NotFoundException : public zypp::Exception { public: NotFoundException() : zypp::Exception("No Entry found"){} }; template < class Transformation, class DefaultType, class Predicate > inline auto firstOf( Transformation &&transformFunc, DefaultType &&def, Predicate &&predicate = detail::ContinueUntilValidPredicate() ) { return detail::FirstOfHelper ( std::forward(transformFunc), std::forward(def), std::forward(predicate) ); } namespace detail { template bool containsOneOfExceptionImpl( const std::exception_ptr &exceptionPtr ) { try { if constexpr ( sizeof...(Rest) == 0 ) { // on the lowest level we throw the exception std::rethrow_exception ( exceptionPtr ); } else { return containsOneOfExceptionImpl(exceptionPtr); } } catch ( const Excpt &e ) { return true; } } } /*! * Checks if a given std::exception_ptr contains one of the given exception types * in the template arguments: * * \code * * expected result = someFuncReturningExpected(); * if ( !result && containsOneOfException( result.error() ) ) { * std::cout << "Contains either zypp::FileNotFoundException or SomeOtherException" << std::endl; * } * * \endcode * * Detects exceptions by throwing and catching them, so always pass the specific exception types to check for.. */ template bool containsOneOfException( const std::exception_ptr &exceptionPtr ) { try { return detail::containsOneOfExceptionImpl( exceptionPtr ); } catch ( ... ) {} return false; } /*! * Checks if a given std::exception_ptr contains the given exception type * in the template type argument: * * \code * * expected result = someFuncReturningExpected(); * if ( !result && containsException( result.error() ) ) { * std::cout << "Contains zypp::FileNotFoundException" << std::endl; * } * * \endcode */ template bool containsException( const std::exception_ptr &exceptionPtr ) { try { std::rethrow_exception ( exceptionPtr );; } catch ( const Excpt &e ) { return true; } catch ( ... ) {} return false; } } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/asyncresult.h000066400000000000000000000361121476576476200234150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_MONADIC_ASYNCRESULT_H_INCLUDED #define ZYPPNG_MONADIC_ASYNCRESULT_H_INCLUDED #include #include #include #include namespace zyppng { namespace detail { template< typename Callback, typename MsgType, typename = std::void_t<> > struct is_future_monad_cb : public std::false_type{}; template< typename Callback, typename MsgType > struct is_future_monad_cb >, decltype ( std::declval>()( std::declval()) )//check if the callback has a operator() member with the correct signature > > : public std::true_type{}; /*! * Checks if a Callable object is of type async_op and if * it accepts the given MsgType and returns the expected type */ template< typename Callback, typename MsgType > constexpr bool is_future_monad_cb_v = is_future_monad_cb::value; template< typename Callback, typename MsgType, typename = std::void_t<> > struct is_sync_monad_cb : public std::false_type{}; template< typename Callback, typename MsgType > struct is_sync_monad_cb >, std::enable_if_t< !std::is_same_v< void, decltype ( std::declval()(std::declval())) > > > //check if the callback has the correct signature: cb( MsgType ) > : public std::true_type{}; /*! * Checks if a Callable object is a syncronous callback type with the expected signature */ template< typename Callback, typename MsgType, typename = std::void_t<> > constexpr bool is_sync_monad_cb_v = is_sync_monad_cb::value; template using callback_returns_async_op = is_async_op< std::invoke_result_t>; template< typename Callback, typename MsgType, typename = std::void_t<> > struct is_sync_monad_cb_with_async_res : public std::false_type{}; template< typename Callback, typename MsgType > struct is_sync_monad_cb_with_async_res::value >, std::enable_if_t< callback_returns_async_op::value >> > : public std::true_type{}; template< typename Callback, typename MsgType, typename = std::void_t<> > struct is_sync_monad_cb_with_sync_res : public std::false_type{}; template< typename Callback, typename MsgType > struct is_sync_monad_cb_with_sync_res::value >, std::enable_if_t< !callback_returns_async_op::value > > > : public std::true_type{}; /*! * Checks if a Callable object is a syncronous callback type with the expected signature */ template constexpr bool is_sync_monad_cb_with_async_res_v = is_sync_monad_cb_with_async_res::value; /*! * Checks if the given Callback is a function returning a syncronous result */ template constexpr bool is_sync_monad_cb_with_sync_res_v = is_sync_monad_cb_with_sync_res::value; /*! * The AsyncResult class is used to bind previous operations to a new operation and to carry * the result of the full pipeline. It has a pointer to the _prevTask, which is usually * a AsyncResult too, and to the task it should execute once the previous task enters ready state. * * In theory this is a single linked list, but each node owns all the previous nodes, means that once * a node is destroyed all previous ones are destroyed as well. Basically the async results are nested objects, where * the outermost object is the last to be executed. While executing the nodes they are cleaned up right away * after they enter finished or ready state. * * When returned to the code the AsyncResult is casted into the AsyncOp base class, otherwise the type * information gets too complex and matching the pipe operator functions is a nightmare. This could be revisited * with newer C++ versions. * * \todo with newer C++ versions revisit the possibility to use non shared ptr types throughout the pipeline instead of * the current smart pointer solution. */ //template //struct AsyncResult; template struct is_nested_async : public std::false_type {}; template struct is_nested_async>> : public std::true_type {}; template constexpr bool is_nested_async_v = is_nested_async::value; // case 1: connect async result to async callback template struct AsyncToAsyncResult : public zyppng::AsyncOp< AOpRes > { static_assert( !is_async_op_v, "A AsyncResult can never return a async value" ); static_assert( !is_async_op_v, "A incoming value can never be a async value" ); AsyncToAsyncResult ( AsyncOpRef && prevTask, std::shared_ptr &&cb ) : _prevTask( std::move(prevTask) ) , _myTask( std::move(cb) ) { connect(); } AsyncToAsyncResult ( const AsyncToAsyncResult &other ) = delete; AsyncToAsyncResult& operator= ( const AsyncToAsyncResult &other ) = delete; AsyncToAsyncResult ( AsyncToAsyncResult &&other ) = delete; AsyncToAsyncResult& operator= ( AsyncToAsyncResult &&other ) = delete; virtual ~AsyncToAsyncResult() {} void connect () { //not using a lambda here on purpose, binding this into a lambda that is stored in the _prev //object causes segfaults on gcc when the lambda is cleaned up with the _prev objects signal instance _prevTask->onReady( std::bind( &AsyncToAsyncResult::readyWasCalled, this, std::placeholders::_1) ); _myTask->onReady( [this] ( AOpRes && res ){ this->setReady( std::move( res ) ); }); } private: // we need to store the passed argument in our stack, otherwise we // run into memory issues if the argument is moved out of the _prevTask object // so even though we std::move() the argument further we need to copy it here void readyWasCalled ( PrevRes res ) { //MIL << "Setting ready: " << typeid(this) << std::endl; if ( _prevTask ) { //dumpInfo(); _prevTask.reset(); } _myTask->operator()(std::move(res)); } AsyncOpRef _prevTask; std::shared_ptr _myTask; }; template struct AsyncToSyncResult; // case 2: connect async result to sync callback returning a sync value template struct AsyncToSyncResult >> : public zyppng::AsyncOp< typename std::invoke_result_t > { using value_type = std::invoke_result_t; static_assert( !is_async_op_v, "A AsyncResult can never return a async value" ); static_assert( !is_async_op_v, "A incoming value can never be a async value" ); template AsyncToSyncResult ( AsyncOpRef && prevTask, CBType &&cb ) : _prevTask( std::move(prevTask) ) , _myTask( std::forward(cb) ) { connect(); } AsyncToSyncResult ( const AsyncToSyncResult &other ) = delete; AsyncToSyncResult& operator= ( const AsyncToSyncResult &other ) = delete; AsyncToSyncResult ( AsyncToSyncResult &&other ) = delete; AsyncToSyncResult& operator= ( AsyncToSyncResult &&other ) = delete; virtual ~AsyncToSyncResult() {} void connect () { //not using a lambda here on purpose, binding this into a lambda that is stored in the _prev //object causes segfaults on gcc when the lambda is cleaned up with the _prev objects signal instance _prevTask->onReady( std::bind( &AsyncToSyncResult::readyWasCalled, this, std::placeholders::_1) ); } private: // we need to store the passed argument in our stack, otherwise we // run into memory issues if the argument is moved out of the _prevTask object // so even though we std::move() the argument further we need to copy it here void readyWasCalled ( PrevRes res ) { //MIL << "Setting ready: " << typeid(this) << std::endl; if ( _prevTask ) { _prevTask.reset(); } this->setReady( std::invoke( _myTask, std::move( res )) ); } AsyncOpRef _prevTask; Callback _myTask; }; // case 3: connect async result to sync callback returning a async value template struct AsyncToSyncResult >> : public zyppng::AsyncOp< typename remove_smart_ptr_t>::value_type> { using value_type = typename remove_smart_ptr_t>::value_type; static_assert(!is_async_op_v< value_type >, "A AsyncResult can never return a async value" ); template AsyncToSyncResult ( AsyncOpRef && prevTask, CBType &&cb ) : _prevTask( std::move(prevTask) ) , _myTask( std::forward(cb) ) { connect(); } AsyncToSyncResult ( const AsyncToSyncResult &other ) = delete; AsyncToSyncResult& operator= ( const AsyncToSyncResult &other ) = delete; AsyncToSyncResult ( AsyncToSyncResult &&other ) = delete; AsyncToSyncResult& operator= ( AsyncToSyncResult &&other ) = delete; virtual ~AsyncToSyncResult() {} void connect () { //not using a lambda here on purpose, binding this into a lambda that is stored in the _prev //object causes segfaults on gcc when the lambda is cleaned up with the _prev objects signal instance _prevTask->onReady( std::bind( &AsyncToSyncResult::readyWasCalled, this, std::placeholders::_1) ); } private: // we need to store the passed argument in our stack, otherwise we // run into memory issues if the argument is moved out of the _prevTask object // so even though we std::move() the argument further we need to copy it here void readyWasCalled ( PrevRes res ) { //MIL << "Setting ready "<onReady( [this]( value_type &&val ) { //MIL << "Setting ready "<setReady( std::move(val) ); }); } AsyncOpRef _prevTask; Callback _myTask; AsyncOpRef _asyncResult; }; } namespace operators { template< typename PrevOp , typename Callback, std::enable_if_t< detail::is_async_op_v, int > = 0, std::enable_if_t< detail::is_future_monad_cb_v, int > = 0 > auto operator| ( std::shared_ptr &&in, std::shared_ptr&& c ) -> AsyncOpRef { using PrevOpRes = typename PrevOp::value_type; return std::make_shared>( std::move(in), std::move(c) ); } template< typename PrevOp , typename Callback, std::enable_if_t< detail::is_async_op_v, int > = 0, std::enable_if_t< detail::is_sync_monad_cb_with_async_res_v, int > = 0 > auto operator| ( std::shared_ptr &&in, Callback &&c ) { using PrevOpRes = typename PrevOp::value_type; using CbType = std::remove_reference_t; using Ret = typename detail::AsyncToSyncResult::value_type; if ( in->isReady() ) return AsyncOpRef( std::invoke( std::forward(c), std::move(in->get()) ) ); return AsyncOpRef( new detail::AsyncToSyncResult( std::move(in), std::forward(c) ) ); } template< typename PrevOp , typename Callback, std::enable_if_t< detail::is_async_op_v, int > = 0, std::enable_if_t< detail::is_sync_monad_cb_with_sync_res_v, int > = 0 > auto operator| ( std::shared_ptr &&in, Callback &&c ) { using PrevOpRes = typename PrevOp::value_type; using CbType = std::remove_reference_t; using Ret = typename detail::AsyncToSyncResult::value_type; if ( in->isReady() ) return makeReadyResult( std::invoke( std::forward(c), std::move(in->get()) ) ); return AsyncOpRef( new detail::AsyncToSyncResult( std::move(in), std::forward(c) ) ); } template< typename PrevRes , typename CallbackOp, std::enable_if_t< !detail::is_async_op_v, int > = 0 , std::enable_if_t< detail::is_future_monad_cb_v, int > = 0 > auto operator| ( PrevRes &&in, CallbackOp &&c ) -> AsyncOpRef::value_type> { // sync message to async callback case std::forward(c)->operator()( std::forward(in) ); return c; } // sync to sync callback case, we do not need to differentiate between a callback with a async result or a normal one // in both cases we simply can use the return type of the callback function template< typename SyncRes , typename Callback , std::enable_if_t< !detail::is_async_op_v< SyncRes >, int > = 0 , std::enable_if_t< detail::is_sync_monad_cb_v< Callback, SyncRes >, int > = 0 > auto operator| ( SyncRes &&in, Callback &&c ) { return std::forward(c)(std::forward(in)); } } } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/await.h000066400000000000000000000043671476576476200221550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_MONADIC_AWAIT_H_INCLUDED #define ZYPPNG_MONADIC_AWAIT_H_INCLUDED #include #include namespace zyppng { namespace detail { template struct AwaitImpl; template struct AwaitImpl (ArgType::*)()> : public zyppng::AsyncOp< std::shared_ptr > { using SigGetter = SignalProxy (ArgType::*)(); template AwaitImpl ( S&& sigGet ) : _sigGet( std::forward(sigGet ) ) {} virtual ~AwaitImpl(){ } void operator() ( std::shared_ptr &&req ) { _req = std::move(req); std::invoke( _sigGet, _req ).connect( sigc::mem_fun(this, &AwaitImpl::sigHandler) ); } private: template < typename RetType = SigR > std::enable_if_t< std::is_same_v, RetType > sigHandler ( SigT... ) { this->setReady( std::move(_req) ); } template < typename RetType = SigR > std::enable_if_t< !std::is_same_v, RetType > sigHandler ( SigT... ) { this->setReady( std::move(_req) ); return {}; } std::shared_ptr _req; SigGetter _sigGet; }; } //return a async op that waits for a signal to emitted by a object template auto await ( SignalGetter &&sigGet ) { return std::make_shared>( std::forward(sigGet) ); } } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/expected.h000066400000000000000000000506361476576476200226510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * * Based on code by Ivan Čukić (BSD/MIT licensed) from the functional cpp book */ #ifndef ZYPP_ZYPPNG_MONADIC_EXPECTED_H #define ZYPP_ZYPPNG_MONADIC_EXPECTED_H #include #include #include #include namespace zyppng { template class ZYPP_NODISCARD expected { protected: union { T m_value; E m_error; }; bool m_isValid; expected() // used internally { } public: using value_type = T; using error_type = E; ~expected() { if (m_isValid) { m_value.~T(); } else { m_error.~E(); } } expected(const expected &other) : m_isValid(other.m_isValid) { if (m_isValid) { new (&m_value) T(other.m_value); } else { new (&m_error) E(other.m_error); } } expected(expected &&other) noexcept : m_isValid(other.m_isValid) { if (m_isValid) { new (&m_value) T( std::move(other.m_value) ); } else { new (&m_error) E( std::move(other.m_error) ); } } expected &operator= (expected other) { swap(other); return *this; } void swap(expected &other) noexcept { using std::swap; if (m_isValid) { if (other.m_isValid) { // Both are valid, just swap the values swap(m_value, other.m_value); } else { // We are valid, but the other one is not // we need to do the whole dance auto temp = std::move(other.m_error); // moving the error into the temp other.m_error.~E(); // destroying the original error object new (&other.m_value) T(std::move(m_value)); // moving our value into the other m_value.~T(); // destroying our value object new (&m_error) E(std::move(temp)); // moving the error saved to the temp into us std::swap(m_isValid, other.m_isValid); // swap the isValid flags } } else { if (other.m_isValid) { // We are not valid, but the other one is, // just call swap on other and rely on the // implementation in the previous case other.swap(*this); } else { // Everything is rotten, just swap the errors swap(m_error, other.m_error); std::swap(m_isValid, other.m_isValid); } } } template static expected success(ConsParams && ...params) { // silence clang-tidy about uninitialized class members, we manually intialize them. // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) expected result; result.m_isValid = true; new(&result.m_value) T(std::forward(params)...); return result; } template static expected error(ConsParams && ...params) { // silence clang-tidy about uninitialized class members, we manually intialize them. // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) expected result; result.m_isValid = false; new(&result.m_error) E(std::forward(params)...); return result; } operator bool() const { return m_isValid; } bool is_valid() const { return m_isValid; } #ifdef NO_EXCEPTIONS # define THROW_MSG_IF_EXCEPTIONS_ARE_ENABLED(WHAT) std::terminate() #else # define THROW_MSG_IF_EXCEPTIONS_ARE_ENABLED(WHAT) throw std::logic_error(WHAT) #endif T &get() { if (!m_isValid) THROW_MSG_IF_EXCEPTIONS_ARE_ENABLED("expected contains no value"); return m_value; } const T &get() const { if (!m_isValid) THROW_MSG_IF_EXCEPTIONS_ARE_ENABLED("expected contains no value"); return m_value; } /*! * Unwraps the value if the expected is valid, otherwise throws an exception. * If the Error type is std::exception_ptr the exception will be rethrown, otherwise * the Error object is directly thrown as if calling: * \code * expected test = functionReturningError(); * throw test.error(); * \endcode */ T &unwrap() { if (!m_isValid) { #ifdef NO_EXCEPTIONS std::terminate(); #else if constexpr ( std::is_same_v ) { std::rethrow_exception ( error() ); } else { throw error(); } #endif } return m_value; } const T &unwrap() const { if (!m_isValid) { #ifdef NO_EXCEPTIONS std::terminate(); #else if constexpr ( std::is_same_v() ) { std::rethrow_exception ( error() ); } else { throw error(); } #endif } return m_value; } T &operator* () { return get(); } const T &operator* () const { return get(); } T *operator-> () { return &get(); } const T *operator-> () const { return &get(); } E &error() { if (m_isValid) THROW_MSG_IF_EXCEPTIONS_ARE_ENABLED("There is no error in this expected"); return m_error; } const E &error() const { if (m_isValid) THROW_MSG_IF_EXCEPTIONS_ARE_ENABLED("There is no error in this expected"); return m_error; } #undef THROW_IF_EXCEPTIONS_ARE_ENABLED template void visit(F f) { if (m_isValid) { f(m_value); } else { f(m_error); } } }; template class ZYPP_NODISCARD expected { private: union { void* m_value; E m_error; }; bool m_isValid; expected() {} //used internally public: ~expected() { if (m_isValid) { // m_value.~T(); } else { m_error.~E(); } } expected(const expected &other) : m_isValid(other.m_isValid) { if (m_isValid) { // new (&m_value) T(other.m_value); } else { new (&m_error) E(other.m_error); } } expected(expected &&other) noexcept : m_isValid(other.m_isValid) { if (m_isValid) { // new (&m_value) T(std::move(other.m_value)); } else { new (&m_error) E(std::move(other.m_error)); } } expected &operator= (expected other) { swap(other); return *this; } void swap(expected &other) noexcept { using std::swap; if (m_isValid) { if (other.m_isValid) { // Both are valid, we do not have any values // to swap } else { // We are valid, but the other one is not. // We need to move the error into us auto temp = std::move(other.m_error); // moving the error into the temp other.m_error.~E(); // destroying the original error object new (&m_error) E(std::move(temp)); // moving the error into us std::swap(m_isValid, other.m_isValid); // swapping the isValid flags } } else { if (other.m_isValid) { // We are not valid, but the other one is, // just call swap on other and rely on the // implementation in the previous case other.swap(*this); } else { // Everything is rotten, just swap the errors swap(m_error, other.m_error); std::swap(m_isValid, other.m_isValid); } } } static expected success() { // silence clang-tidy about uninitialized class members, we manually intialize them. // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) expected result; result.m_isValid = true; result.m_value = nullptr; return result; } template static expected error(ConsParams && ...params) { // silence clang-tidy about uninitialized class members, we manually intialize them. // NOLINTNEXTLINE(clang-analyzer-optin.cplusplus.UninitializedObject) expected result; result.m_isValid = false; new(&result.m_error) E(std::forward(params)...); return result; } operator bool() const { return m_isValid; } bool is_valid() const { return m_isValid; }; #ifdef NO_EXCEPTIONS # define THROW_IF_EXCEPTIONS_ARE_ENABLED(WHAT) std::terminate() #else # define THROW_IF_EXCEPTIONS_ARE_ENABLED(WHAT) throw std::logic_error(WHAT) #endif E &error() { if (m_isValid) THROW_IF_EXCEPTIONS_ARE_ENABLED("There is no error in this expected"); return m_error; } const E &error() const { if (m_isValid) THROW_IF_EXCEPTIONS_ARE_ENABLED("There is no error in this expected"); return m_error; } void unwrap() const { if (!m_isValid) { #ifdef NO_EXCEPTIONS std::terminate(); #else if constexpr ( std::is_same_v ) { std::rethrow_exception ( error() ); } else { throw error(); } #endif } } }; template static expected,Err> make_expected_success( Type &&t ) { return expected,Err>::success( std::forward(t) ); } namespace detail { // helper to figure out the return type for a mbind callback, if the ArgType is void the callback is considered to take no argument. // Due to how std::conditional works, we cannot pass std::invoke_result_t but instead use the template type std::invoke_result, since // one of the two options have no "::type" because the substitution fails, this breaks the std::conditional_t since it can only work with two well formed // types. Instead we pass in the template types and evaluate the ::type in the end, when the correct invoke_result was chosen. template < typename Function, typename ArgType> using mbind_cb_result_t = typename std::conditional_t< std::is_same_v, std::invoke_result,std::invoke_result >::type; template bool waitForCanContinueExpected( const expected &value ) { return value.is_valid(); } } template < typename T , typename E , typename Function , typename ResultType = detail::mbind_cb_result_t > ResultType and_then( const expected& exp, Function &&f) { if (exp) { if constexpr ( std::is_same_v ) return std::invoke( std::forward(f) ); else return std::invoke( std::forward(f), exp.get() ); } else { if constexpr ( !detail::is_async_op< remove_smart_ptr_t >::value ) return ResultType::error(exp.error()); else return makeReadyResult( remove_smart_ptr_t::value_type::error(exp.error()) ); } } template < typename T , typename E , typename Function , typename ResultType = detail::mbind_cb_result_t > ResultType and_then( expected &&exp, Function &&f) { if (exp) { if constexpr ( std::is_same_v ) return std::invoke( std::forward(f) ); else return std::invoke( std::forward(f), std::move(exp.get()) ); } else { if constexpr ( !detail::is_async_op< ResultType >::value ) return ResultType::error( std::move(exp.error()) ); else return makeReadyResult( remove_smart_ptr_t::value_type::error(exp.error()) ); } } template < typename T , typename E , typename Function , typename ResultType = detail::mbind_cb_result_t > ResultType or_else( const expected& exp, Function &&f) { if (!exp) { return std::invoke( std::forward(f), exp.error() ); } else { if constexpr ( !detail::is_async_op< remove_smart_ptr_t >::value ) return exp; else return makeReadyResult( std::move(exp) ); } } template < typename T , typename E , typename Function , typename ResultType = detail::mbind_cb_result_t > ResultType or_else( expected&& exp, Function &&f) { if (!exp) { return std::invoke( std::forward(f), std::move(exp.error()) ); } else { if constexpr ( !detail::is_async_op< remove_smart_ptr_t >::value ) return exp; else return makeReadyResult( std::move(exp) ); } } /*! * Collects all values from a Container of \ref expected values, returning the * contained values or the first error encountered as a expected> */ template < template< class, class... > class Container, typename T, typename E, typename ...CArgs > std::enable_if_t, expected,E>> collect( Container, CArgs...>&& in ) { Container res; for( auto &v : in ) { if ( !v ) return expected,E>::error( std::move(v.error()) ); res.push_back( std::move(v.get()) ); } return expected,E>::success( std::move(res) ); } /*! * Specialization of collect working on a Container of expected values, * returning either success or the error encountered. */ template < template< class, class... > class Container, typename T, typename E, typename ...CArgs > std::enable_if_t, expected> collect( Container, CArgs...>&& in ) { for( auto &v : in ) { if ( !v ) return expected::error( std::move(v.error()) ); } return expected::success( ); } template < typename T , typename E , typename Function > expected inspect( expected exp, Function &&f ) { if (exp) { const auto &val = exp.get(); std::invoke( std::forward(f), val ); } return exp; } template < typename T , typename E , typename Function > expected inspect_err( expected exp, Function &&f) { if (!exp) { const auto &err = exp.error(); std::invoke( std::forward(f), err ); } return exp; } namespace detail { template struct and_then_helper { Callback function; template< typename T, typename E > auto operator()( const expected& exp ) { return and_then( exp, function ); } template< typename T, typename E > auto operator()( expected&& exp ) { return and_then( std::move(exp), function ); } }; template struct or_else_helper { Callback function; template< typename T, typename E > auto operator()( const expected& exp ) { return or_else( exp, function ); } template< typename T, typename E > auto operator()( expected&& exp ) { return or_else( std::move(exp), function ); } }; template struct inspect_helper { Callback function; template< typename T, typename E > auto operator()( expected&& exp ) { return inspect( std::move(exp), function ); } }; template struct inspect_err_helper { Callback function; template< typename T, typename E > auto operator()( expected&& exp ) { return inspect_err( std::move(exp), function ); } }; struct collect_helper { template < typename T > inline auto operator()( T&& in ) { return collect( std::forward(in) ); } }; } namespace operators { template auto mbind ( Fun && function ) { return detail::and_then_helper { std::forward(function) }; } template auto and_then ( Fun && function ) { return detail::and_then_helper { std::forward(function) }; } template auto or_else ( Fun && function ) { return detail::or_else_helper { std::forward(function) }; } template auto inspect ( Fun && function ) { return detail::inspect_helper { std::forward(function) }; } template auto inspect_err ( Fun && function ) { return detail::inspect_err_helper { std::forward(function) }; } inline detail::collect_helper collect() { return detail::collect_helper(); } } /*! * This is logically the same as \code transform() | collect() \endcode , but the inner loop will stop waiting / transforming * as soon as a error is encountered and returns the error right away. */ template < template< class, class... > class Container, typename Msg, typename Transformation, typename Ret = std::result_of_t, typename ...CArgs > auto transform_collect( Container&& in, Transformation &&f ) { using namespace zyppng::operators; if constexpr ( detail::is_async_op_v ) { using AsyncRet = typename remove_smart_ptr_t::value_type; static_assert( is_instance_of::value, "Transformation function must return a expected type" ); return transform( std::move(in), f ) // cancel WaitFor if one of the async ops returns a error | detail::WaitForHelperExt( detail::waitForCanContinueExpected ) | collect(); } else { static_assert( is_instance_of::value, "Transformation function must return a expected type" ); Container results; for ( auto &v : in ) { auto res = f(std::move(v)); if ( res ) { results.push_back( std::move(res.get()) ); } else { return expected>::error( res.error() ); } } return expected>::success( std::move(results) ); } } namespace detail { template struct transform_collect_helper { Fun _callback; template auto operator() ( T &&in ) { return transform_collect( std::forward(in), _callback ); } }; } namespace operators { template auto transform_collect( Transformation &&f ) { return detail::transform_collect_helper{ std::forward(f)}; } } } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/lift.h000066400000000000000000000045321476576476200220000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_MONADIC_LIFT_H_INCLUDED #define ZYPPNG_MONADIC_LIFT_H_INCLUDED #include #include #include #include #include namespace zyppng { namespace detail { template struct lifter { lifter( LiftedFun &&fun ) : _fun(std::move(fun)) {} lifter( lifter && ) = default; ~lifter(){} template< typename T1 , typename T2 , typename Ret = std::pair, T2> > Ret operator()( std::pair &&data ) { return std::make_pair( std::invoke( _fun, std::move(data.first) ), std::move(data.second) ); } private: LiftedFun _fun; }; template < typename AsyncOp > struct lifter< std::shared_ptr, std::void_t< std::enable_if_t< zyppng::detail::is_async_op::value > > > { using LiftedFun = std::shared_ptr; lifter( LiftedFun &&fun ) : _fun(std::move(fun)) {} lifter( lifter && ) = default; ~lifter(){} template< typename T1 , typename T2 > auto operator()( std::pair &&data ) { using namespace zyppng; using namespace zyppng::operators; return std::move(data.first) | ( std::move(_fun) ) | [ other = std::move(data.second)]( auto && res ) mutable { return std::make_pair( std::forward(res), std::move(other) ); }; } private: LiftedFun _fun; }; } template< typename Fun > auto lift ( Fun && func ) { return detail::lifter( std::forward(func) ); } } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/mtry.h000066400000000000000000000037401476576476200220350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * * Based on code by Ivan Čukić (BSD/MIT licensed) from the functional cpp book */ #ifndef ZYPP_ZYPPNG_MONADIC_MTRY_H #define ZYPP_ZYPPNG_MONADIC_MTRY_H #include "expected.h" namespace zyppng { template < typename F , typename ...Args , typename Ret = std::invoke_result_t , typename Exp = expected > Exp mtry(F &&f, Args&& ...args) { try { if constexpr ( std::is_same_v ) { std::invoke(std::forward(f), std::forward(args)... ); return expected::success(); } else { return expected::success(std::invoke(std::forward(f), std::forward(args)... )); } } catch (...) { return expected::error(ZYPP_FWD_CURRENT_EXCPT()); } } namespace detail { template struct mtry_helper { Callback function; template < typename ...Args > auto operator()( Args&& ...args ){ return mtry( function, std::forward(args)... ); } }; } namespace operators { template auto mtry ( Fun && function ) { return detail::mtry_helper { std::forward(function) }; } } } #endif /* !MTRY_H */ libzypp-17.36.5/zypp-core/zyppng/pipelines/redo.h000066400000000000000000000117421476576476200217740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_MONADIC_REDO_H_INCLUDED #define ZYPPNG_MONADIC_REDO_H_INCLUDED #include #include #include #include namespace zyppng { namespace detail { template< typename Task, typename Pred, typename = void > struct RedoWhileImpl { static_assert ( !is_async_op< zyppng::remove_smart_ptr >::value, "" ); template RedoWhileImpl( T &&t, P &&p ) : _task( std::forward(t) ) , _pred( std::forward

(p) ) {} template std::enable_if_t< is_async_op< remove_smart_ptr_t> >::value == false, Arg > operator()( Arg &&arg ) { Arg store = std::forward(arg); do { auto res = _task ( Arg(store) ); if ( !_pred( res ) ) return std::move(res); } while( true ); } template static auto create ( T &&t, P &&p ) { return RedoWhileImpl( std::forward(t), std::forward

(p)); } private: Task _task; Pred _pred; }; template< typename MyAsyncOp, typename Pred > struct RedoWhileImpl< std::shared_ptr,Pred, std::enable_if_t< is_async_op< MyAsyncOp >::value > > : public AsyncOp { using Task = std::shared_ptr; using OutType = typename MyAsyncOp::value_type; template RedoWhileImpl( T &&t, P &&p ) : _task( std::forward(t) ) , _pred( std::forward

(p) ) {} static_assert ( !is_async_op< remove_smart_ptr >::value, "" ); template void operator()( InType &&arg ) { _task->onReady( [this, inArg = arg]( OutType &&a) mutable { if ( _pred(a) ) this->operator()(std::move(inArg)); else this->setReady( std::move(a) ); } ); _task->operator()( InType(arg) ); } template static auto create ( T &&t, P &&p ) { return std::make_shared( std::forward(t), std::forward

(p)); } private: Task _task; Pred _pred; std::shared_ptr> _pipeline; }; //implementation for a function returning a asynchronous result template< typename Task, typename Pred > struct RedoWhileImpl< Task,Pred, std::enable_if_t< is_async_op< remove_smart_ptr_t::return_type> >::value > > : public AsyncOp< typename remove_smart_ptr_t::return_type>::value_type> { using FunRet = remove_smart_ptr_t::return_type>; //the task function needs to return the same type it takes using OutType = typename FunRet::value_type; template RedoWhileImpl( T &&t, P &&p ) : _task( std::forward(t) ) , _pred( std::forward

(p) ) {} template void operator() ( InType &&arg ) { _asyncRes.reset(); _asyncRes = _task( InType( arg ) ); _asyncRes->onReady( [this, inArg = arg ]( OutType &&arg ) mutable { if ( _pred(arg) ) this->operator()( std::move(inArg) ); else this->setReady( std::move(arg) ); }); } template static auto create ( T &&t, P &&p ) { return std::make_shared( std::forward(t), std::forward

(p)); } private: std::shared_ptr> _asyncRes; Task _task; Pred _pred; }; //check if it is possible to query the given type for function_traits template using has_func_trait = typename function_traits::return_type; } template auto redo_while ( Task &&todo, Pred &&until ) { static_assert ( std::is_detected_v< detail::has_func_trait, Task >, "Not possible to deduce the function_traits for Task, maybe a generic lambda?" ); return detail::RedoWhileImpl::create( std::forward(todo), std::forward(until) ); } } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/transform.h000066400000000000000000000053121476576476200230520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! */ #ifndef ZYPP_ZYPPNG_MONADIC_TRANSFORM_H #define ZYPP_ZYPPNG_MONADIC_TRANSFORM_H #include #include #include #include #include namespace zyppng { template < template< class, class... > class Container, typename Msg, typename Transformation, typename Ret = std::result_of_t, typename ...CArgs > Container transform( Container&& val, Transformation &&transformation ) { Container res; std::transform( std::make_move_iterator(val.begin()), std::make_move_iterator(val.end()), std::back_inserter(res), std::forward(transformation) ); return res; } template < template< class, class... > class Container, typename Msg, typename Transformation, typename Ret = std::result_of_t, typename ...CArgs > Container transform( const Container& val, Transformation &&transformation ) { Container res; std::transform( val.begin(), val.end(), std::back_inserter(res), std::forward(transformation) ); return res; } namespace detail { template struct transform_helper { Transformation function; template< class Container > auto operator()( Container&& arg ) { if constexpr ( detail::is_sync_monad_cb_with_async_res_v ) { using namespace zyppng::operators; return zyppng::transform( std::forward(arg), function ) | zyppng::waitFor(); } else { return zyppng::transform( std::forward(arg), function ); } } }; } namespace operators { template auto transform(Transformation&& transformation) { return detail::transform_helper{ std::forward(transformation)}; } } } #endif libzypp-17.36.5/zypp-core/zyppng/pipelines/wait.h000066400000000000000000000104631476576476200220060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! */ #ifndef ZYPP_ZYPPNG_MONADIC_WAIT_H #define ZYPP_ZYPPNG_MONADIC_WAIT_H #include #include namespace zyppng { namespace detail { template < template< class, class... > class Container, class AsyncOp, class ...CArgs > struct WaitForImpl : public zyppng::AsyncOp< Container > { using AsyncOpRes = typename AsyncOp::value_type; static_assert( detail::is_async_op_v, "Result type needs to be derived from AsyncOp"); WaitForImpl ( std::function canContinue = {} ) : _canContinue( std::move(canContinue) ){}; WaitForImpl ( const WaitForImpl &other ) = delete; WaitForImpl& operator= ( const WaitForImpl &other ) = delete; WaitForImpl& operator= ( WaitForImpl &&other ) = default; WaitForImpl ( WaitForImpl &&other ) = default; void operator()( Container< std::shared_ptr, CArgs...> &&ops ) { assert( _allOps.empty() ); if ( ops.empty () ) { this->setReady( std::move(_allResults) ); } _allOps = std::move( ops ); for ( auto &op : _allOps ) { op->onReady( [ this ]( AsyncOpRes &&res ) { this->resultReady( std::move(res)); }); } } private: void resultReady ( AsyncOpRes &&res ) { _allResults.push_back( std::move( res ) ); bool done = ( _allOps.size() == _allResults.size()) || ( _canContinue && !_canContinue(_allResults.back())); if ( done ) { //release all ops we waited on _allOps.clear(); this->setReady( std::move(_allResults) ); } } Container< std::shared_ptr, CArgs... > _allOps; Container< AsyncOpRes > _allResults; std::function _canContinue; }; struct WaitForHelper { template< template< class, class... > class Container, class AsyncOp, typename ...CArgs, std::enable_if_t< detail::is_async_op_v, int> = 0 > auto operator()( Container< std::shared_ptr< AsyncOp >, CArgs... > &&ops ) -> zyppng::AsyncOpRef< Container > { auto aOp = std::make_shared>( ); aOp->operator()( std::move(ops) ); return aOp; } template< template< class, class... > class Container, class Res, typename ...CArgs, std::enable_if_t< !detail::is_async_op_v, int> = 0 > auto operator()( Container< Res, CArgs... > ops ) -> Container< Res, CArgs... > { return ops; } }; template struct WaitForHelperExt { WaitForHelperExt( std::function &&fn ) : _cb( std::move(fn) ) {} template< template< class, class... > class Container, class AsyncOp, typename ...CArgs, std::enable_if_t< detail::is_async_op_v, int> = 0 > auto operator()( Container< std::shared_ptr< AsyncOp >, CArgs... > &&ops ) -> zyppng::AsyncOpRef< Container > { auto aOp = std::make_shared>( _cb ); aOp->operator()( std::move(ops) ); return aOp; } private: std::function _cb; }; } /*! * Returns a async operation that waits for all async operations which are passed to it and collects their results, * forwarding them as one */ inline auto waitFor ( ) { return detail::WaitForHelper(); //std::make_shared>>(); } inline auto join ( ) { return detail::WaitForHelper(); } } #endif libzypp-17.36.5/zypp-core/zyppng/rpc/000077500000000000000000000000001476576476200174615ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/rpc/stompframestream.cc000066400000000000000000000250451476576476200233670ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include "stompframestream.h" #include #include #include #include namespace zyppng { constexpr auto MAX_CMDLEN = 256; constexpr auto MAX_HDRLEN = 8 * 1024; // we might send long paths in headers constexpr auto MAX_BODYLEN = 1024 * 1024; // 1Mb for now, we do not want to use up all the memory InvalidMessageReceivedException::InvalidMessageReceivedException( const std::string &msg ) : zypp::Exception( zypp::str::Str() << "Invalid Message received: (" << msg <<")" ) { } zyppng::StompFrameStream::StompFrameStream( IODevice::Ptr iostr ) : _ioDev( std::move(iostr) ) { connect( *_nextMessageTimer, &Timer::sigExpired, *this, &StompFrameStream::timeout ); _nextMessageTimer->setSingleShot(false); connect( *_ioDev, &IODevice::sigReadyRead, *this, &StompFrameStream::readAllMessages ); if ( _ioDev->isOpen () && _ioDev->canRead () ) readAllMessages (); } bool StompFrameStream::readNextMessage( ) { const auto &parseError = [this](){ _parserState = ParseError; _pendingMessage.reset(); _pendingBodyLen.reset(); _sigInvalidMessageReceived.emit(); }; // ATTENTION: Remember to also update the parser logic in zypp-core/rpc/PluginFrame.cc // if code here is changed or features are added. // loop until we have a full message, or we have no more data to read while(true) { switch( _parserState ) { case ParseError: { // we got a parse error before, try to recover by reading until the next \0 bool gotTerm = false; while ( _ioDev->bytesAvailable ( ) ) { auto d = _ioDev->read (1); if ( !d.size() ) break; if ( d.front () == '\0' ){ gotTerm = true; _parserState = ReceiveCommand; break; } } if ( gotTerm ) continue; return false; } case ReceiveCommand: { const auto ba = _ioDev->readBufferCount(); if ( !_ioDev->canReadLine() ) { if ( ba > MAX_CMDLEN ) { ERR << "Received malformed message from peer, CMD line exceeds: " << MAX_CMDLEN << " bytes" << std::endl; parseError(); continue; } return false; } ByteArray command = _ioDev->readLine( MAX_CMDLEN ); command.pop_back(); // remove \n if ( command.empty() ) { // STOMP spec says multiple EOLs after a message are allowed, so we just ignore empty lines // if they happen before a new frame starts WAR << "Received empty line before command, ignoring" << std::endl; return false; } if ( !_pendingMessage ) _pendingMessage = zypp::PluginFrame(); _pendingMessage->setCommand( command.asString() ); _parserState = ReceiveHeaders; break; } case ReceiveHeaders: { const auto ba = _ioDev->readBufferCount(); if ( !_ioDev->canReadLine() ) { if ( ba > MAX_HDRLEN ) { ERR << "Received malformed message from peer, header line exceeds: " << MAX_HDRLEN << " bytes" << std::endl; parseError(); continue; } return false; } ByteArray header = _ioDev->readLine( MAX_HDRLEN ); header.pop_back(); // remove \n if ( header.empty () ) { // --> empty line sep. header and body _parserState = ReceiveBody; // if we received a content-length header we set the flag for the body parser to know it has to read // n bytes before expecting the \0 terminator const auto &contentLen = _pendingMessage->getHeaderNT( zypp::PluginFrame::contentLengthHeader(), std::string() ); std::optional cLen; if ( !contentLen.empty() ) { cLen = zyppng::str::safe_strtonum(contentLen); if ( !cLen ) { ERR << "Received malformed message from peer: Invalid value for " << zypp::PluginFrame::contentLengthHeader() << ":" << contentLen << std::endl; parseError(); continue; } #if 0 if ( (*cLen) > MAX_BODYLEN ) { ERR << "Message body exceeds maximum length: " << zypp::ByteCount( *cLen ) << " vs " << zypp::ByteCount( MAX_BODYLEN ) << std::endl; parseError(); continue; } #endif _pendingBodyLen = *cLen; _pendingMessage->clearHeader( zypp::PluginFrame::contentLengthHeader() ); } } else { try { _pendingMessage->addRawHeader ( header ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); ERR << "Received malformed message from peer, header format invalid: " << header.asStringView() << " (" << e << ")" << std::endl; parseError(); continue; } } break; } case ReceiveBody: { ByteArray body; if ( _pendingBodyLen ) { // we need to read the required body bytes plus the terminating \0 const auto reqBytes = (*_pendingBodyLen) + 1; if ( _ioDev->bytesAvailable() < reqBytes ) return false; body = _ioDev->read( reqBytes ); if ( body.back () != '\0' ) { ERR << "Received malformed message from peer: Body was not terminated with \\0" << std::endl; parseError(); continue; } body.pop_back (); // remove \0 } else { // we do not know the body size, need to read until \0 const auto ba = _ioDev->readBufferCount(); if ( !_ioDev->canReadUntil( _ioDev->currentReadChannel (), '\0' ) ) { if ( ba > MAX_BODYLEN ) { ERR << "Message body exceeds maximum length: " << zypp::ByteCount( _ioDev->readBufferCount() ) << " vs " << zypp::ByteCount( MAX_BODYLEN ) << std::endl; parseError(); continue; } return false; } body = _ioDev->channelReadUntil( _ioDev->currentReadChannel (), '\0' ); body.pop_back(); // remove the \0 } // if we reach this place we have a full message, store the body and lets go) _pendingMessage->setBody( std::move(body) ); _messages.emplace_back( std::move(*_pendingMessage) ); _pendingMessage.reset(); _pendingBodyLen.reset(); _parserState = ReceiveCommand; _sigNextMessage.emit (); if ( _messages.size() ) { // nag the user code until all messages have been used up _nextMessageTimer->start(0); } // once we have a message, exit the loop so other things can be done return true; } } } } void StompFrameStream::timeout(const Timer &) { if ( _messages.size() ) _sigNextMessage.emit(); if ( !_messages.size() ) _nextMessageTimer->stop(); } std::optional zyppng::StompFrameStream::nextMessage( const std::string &msgName ) { if ( !_messages.size () ) { // try to read the next messages from the fd { _sigNextMessage.block (); zypp::OnScopeExit unblock([&](){ _sigNextMessage.unblock(); }); readAllMessages(); } if ( !_messages.size () ) return {}; } std::optional res; if( msgName.empty() ) { res = std::move( _messages.front () ); _messages.pop_front(); } else { const auto i = std::find_if( _messages.begin(), _messages.end(), [&]( const zypp::PluginFrame &msg ) { return msg.command() == msgName; }); if ( i != _messages.end() ) { res = std::move(*i); _messages.erase(i); } } if ( _messages.size() ) _nextMessageTimer->start(0); else _nextMessageTimer->stop(); return res; } std::optional StompFrameStream::nextMessageWait( const std::string &msgName ) { // make sure the signal is not emitted until we have the next message _sigNextMessage.block (); zypp::OnScopeExit unblock([&](){ _sigNextMessage.unblock(); }); bool receivedInvalidMsg = false; AutoDisconnect defered( connectFunc( *this, &StompFrameStream::sigInvalidMessageReceived, [&](){ receivedInvalidMsg = true; })); const bool hasMsgName = msgName.size(); while ( !receivedInvalidMsg && _ioDev->isOpen() && _ioDev->canRead() ) { if ( _messages.size() ) { if ( hasMsgName ) { std::optional msg = nextMessage(msgName); if ( msg ) return msg; } else { break; } } if ( !_ioDev->waitForReadyRead ( -1 ) ) { // this can only mean that a error happened, like device was closed return {}; } } return nextMessage (msgName); } bool zyppng::StompFrameStream::sendFrame( const zypp::PluginFrame &env ) { if ( !_ioDev->canWrite () ) return false; try { IODeviceOStreamBuf ostrbuf(_ioDev); std::ostream output(&ostrbuf); env.writeTo ( output ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); ERR << "Failed to serialize message to stream" << std::endl; return false; } return true; } SignalProxy zyppng::StompFrameStream::sigMessageReceived() { return _sigNextMessage; } SignalProxy StompFrameStream::sigInvalidMessageReceived() { return _sigInvalidMessageReceived; } void StompFrameStream::readAllMessages() { bool cont = true; while ( cont && _ioDev->bytesAvailable() ) { cont = readNextMessage (); } } } libzypp-17.36.5/zypp-core/zyppng/rpc/stompframestream.h000066400000000000000000000147501476576476200232320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | -----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CORE_ZYPPNG_RPC_STOMPFRAMESTREAM_H_INCLUDED #define ZYPP_CORE_ZYPPNG_RPC_STOMPFRAMESTREAM_H_INCLUDED #include #include #include #include #include #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (StompFrameStream); class ZYPP_API InvalidMessageReceivedException : public zypp::Exception { public: InvalidMessageReceivedException( const std::string &msg = {}); }; namespace rpc { template expected toStompMessage( const T& msg ) { return msg.toStompMessage(); } template expected fromStompMessage( const zypp::PluginFrame &message ) { return T::fromStompMessage( message ); } // Reads data from the stomp message and converts it to the target type // used to read header values and values serialized into a terminated data field template void parseDataIntoField( const std::string &headerVal, T &target ) { if constexpr ( std::is_same_v ) { const auto &triBool = zypp::str::strToTriBool ( headerVal ); if ( indeterminate(triBool) ) { ZYPP_THROW ( zypp::PluginFrameException( "Invalid value for boolean field" ) ); } target = bool(triBool); } else if constexpr ( std::is_same_v ) { target = headerVal; } else { // numbers auto val = zyppng::str::safe_strtonum ( headerVal ); if ( !val ) ZYPP_THROW ( zypp::PluginFrameException( "Invalid value for numerical field" ) ); target = *val; } } // queries a header value and calls parseDataIntoField on it template void parseHeaderIntoField( const zypp::PluginFrame &msg, const std::string &name, T &target ) { return parseDataIntoField ( msg.getHeader(name), target ); } template inline zypp::PluginFrame prepareFrame() { return zypp::PluginFrame ( std::string( T::typeName.data(), T::typeName.length() ) ); } } /*! * * Implements the basic protocol for sending zypp RPC messages over a IODevice * using the STOMP frame format as message type. */ class ZYPP_API StompFrameStream : public zyppng::Base { public: using Ptr = StompFrameStreamRef; /*! * Uses the given iostream to send and receive messages. * If the device is already open and readable tries to read messages right away. * So make sure to check if messages have already been received via \ref nextMessage */ static Ptr create( IODevice::Ptr iostr ) { return Ptr( new StompFrameStream( std::move(iostr) ) ); } /*! * Returns the next message in the queue, wait for the \ref sigMessageReceived signal * to know when new messages have arrived. * If \a msgName is specified returns the next message in the queue that matches the msgName */ std::optional nextMessage ( const std::string &msgName = "" ); /*! * Waits until at least one message is in the queue and returns it. Will return a empty * optional if a error occurs. * * If \a msgName is set this will block until a message with the given message name arrives and returns it * * \note Make sure to check if there are more than one messages in the queue after this function returns */ std::optional nextMessageWait ( const std::string &msgName = "" ); /*! * Send out a PluginFrame to the other side, depending on the underlying device state * this will be buffered and send when the device is writeable again. */ bool sendFrame ( const zypp::PluginFrame &message ); template bool sendMessage ( const T &message ) { if constexpr ( std::is_same_v ) { return sendFrame( message ); } else { const auto &msg = rpc::toStompMessage(message); if ( !msg ) { ERR << "Failed to serialize message" << std::endl; return false; } return sendFrame( *msg ); } } template static expected< T > parseMessage ( const zypp::PluginFrame &m ) { return rpc::fromStompMessage(m); } /*! * Reads all messages from the underlying IO Device, this is usually called automatically * but when shutting down this can be used to process all remaining messages. */ void readAllMessages (); /*! * Emitted when new messages have arrived. This will continuously be emitted * as long as messages are in the queue. */ SignalProxy sigMessageReceived (); /*! * Signal is emitted every time there was data on the line that could not be parsed */ SignalProxy sigInvalidMessageReceived (); private: StompFrameStream( IODevice::Ptr iostr ); bool readNextMessage (); void timeout( const zyppng::Timer &); enum ParserState { ReceiveCommand, ReceiveHeaders, ReceiveBody, ParseError } _parserState = ReceiveCommand; std::optional _pendingMessage; std::optional _pendingBodyLen; IODevice::Ptr _ioDev; Timer::Ptr _nextMessageTimer = Timer::create(); std::deque _messages; Signal _sigNextMessage; Signal _sigInvalidMessageReceived; }; } #endif // ZYPP_CORE_ZYPPNG_RPC_STOMPFRAMESTREAM_H_INCLUDED libzypp-17.36.5/zypp-core/zyppng/thread/000077500000000000000000000000001476576476200201445ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/thread/AsyncQueue000066400000000000000000000000301476576476200221420ustar00rootroot00000000000000#include "asyncqueue.h" libzypp-17.36.5/zypp-core/zyppng/thread/Wakeup000066400000000000000000000000241476576476200213170ustar00rootroot00000000000000#include "wakeup.h" libzypp-17.36.5/zypp-core/zyppng/thread/asyncqueue.cc000066400000000000000000000056541476576476200226470ustar00rootroot00000000000000#include "private/asyncqueue_p.h" #include #include #include namespace zyppng { AsyncQueueBase::~AsyncQueueBase() { } void AsyncQueueBase::addWatch(AsyncQueueWatch &watch) { std::lock_guard lock(_watchLock); _watches.insert( &watch ); } void AsyncQueueBase::removeWatch(AsyncQueueWatch &watch) { std::lock_guard lock(_watchLock); _watches.erase( &watch ); } void AsyncQueueBase::notifyWatches() { std::lock_guard lock(_watchLock); std::for_each( _watches.begin(), _watches.end(), []( AsyncQueueWatch *w ){ w->postNotifyEvent(); }); } AsyncQueueWatchPrivate::AsyncQueueWatchPrivate(std::shared_ptr &&q , AsyncQueueWatch &p) : AbstractEventSourcePrivate(p) , _queue( std::move(q) ) { GError *error = NULL; if (!g_unix_open_pipe (fds, FD_CLOEXEC, &error)) ERR << "Creating pipes for AsyncQueueWatch: " << error->message << std::endl; if (!g_unix_set_fd_nonblocking (fds[0], TRUE, &error) || !g_unix_set_fd_nonblocking (fds[1], TRUE, &error)) ERR << "Set pipes non-blocking for AsyncQueueWatch: "<< error->message << std::endl; } AsyncQueueWatchPrivate::~AsyncQueueWatchPrivate() { close (fds[0]); close (fds[1]); } ZYPP_IMPL_PRIVATE(AsyncQueueWatch) AsyncQueueWatch::AsyncQueueWatch(std::shared_ptr &&queue ) : AsyncQueueWatch( *( new AsyncQueueWatchPrivate( std::move(queue), *this ) ) ) { } AsyncQueueWatch::AsyncQueueWatch(AsyncQueueWatchPrivate &dd) : AbstractEventSource( dd ) { } std::shared_ptr AsyncQueueWatch::create( std::shared_ptr queue ) { std::shared_ptr ptr ( new AsyncQueueWatch( std::move(queue) ) ); auto d = ptr->d_func(); ptr->updateFdWatch( d->fds[0], AbstractEventSource::Read ); d->_queue->addWatch( *ptr ); return ptr; } AsyncQueueWatch::~AsyncQueueWatch() { // sync point, since the queue locks all its watches before changing or notifying them // we should never run into a bad situation where the AsyncQueueWatch is deleted while notified from a different thread. // In case watches are notified this will block and the other way round d_func()->_queue->removeWatch( *this ); } void AsyncQueueWatch::postNotifyEvent() { Z_D(); int res = -1; guint8 one = 1; do { errno = 0; res = write (d->fds[1], &one, sizeof one); } while (G_UNLIKELY (res == -1 && errno == EINTR)); } SignalProxy AsyncQueueWatch::sigMessageAvailable() { return d_func()->_sigMessageAvailable; } void AsyncQueueWatch::onFdReady( int , int ) { Z_D(); char buffer[16]; /* read until it is empty */ while (read (d->fds[0], buffer, sizeof buffer) == sizeof buffer); d->_sigMessageAvailable.emit(); } void AsyncQueueWatch::onSignal(int) { } } libzypp-17.36.5/zypp-core/zyppng/thread/asyncqueue.h000066400000000000000000000111511476576476200224760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #ifndef ZYPP_NG_THREAD_ASYNCQUEUE_H_INCLUDED #define ZYPP_NG_THREAD_ASYNCQUEUE_H_INCLUDED #include #include #include #include #include #include #include namespace zyppng { class AsyncQueueWatch; class AsyncQueueBase { public: virtual ~AsyncQueueBase(); void addWatch ( AsyncQueueWatch &watch ); void removeWatch ( AsyncQueueWatch &watch ); void notifyWatches ( ); private: std::set _watches; std::recursive_mutex _watchLock; }; /*! * AsyncQueue provides a thread safe way to send messages between threads. * Using this class makes only sense for multithreaded applications. */ template< class Message > class AsyncQueue : public AsyncQueueBase { public: using Ptr = std::shared_ptr; static Ptr create () { return Ptr( new AsyncQueue() ); } AsyncQueue(const AsyncQueue&) = delete; AsyncQueue& operator=(const AsyncQueue&) = delete; /*! * Pushes a new message into the queue, make sure to manually * acqiure the lock before calling this function and \ref notify after * unlocking it again. This function should be used when multiple messages should be pushed * into the queue before notifying the threads. * \sa push */ template< typename T = Message > void pushUnlocked ( T &&value ) { _messages.push( std::forward(value) ); } /*! * Pushes a new message into the queue and notify all waiting * threads that there is new data available. */ template< typename T = Message > void push ( T &&value ) { { std::lock_guard lk( _mut ); pushUnlocked( std::forward(value) ); } notify(); } /*! * Pops the first message from the queue, blocking until there is data available. */ Message pop () { std::unique_lock lk( _mut ); _cv.wait( lk, [this](){ return _messages.size() > 0; } ); Message msg = std::move( _messages.front() ); _messages.pop(); return msg; } /*! * Tries to pop the first element from the queue, if no data is available returns a empty * \ref std::optional instead of blocking. */ std::optional tryPop () { std::lock_guard lk( _mut ); return tryPopUnlocked(); } /*! * Same as \ref tryPop but does not lock the mutex, make sure to acquire the lock before * calling this function. */ std::optional tryPopUnlocked () { if ( _messages.size() ) { Message msg = std::move( _messages.front() ); _messages.pop(); return msg; } return {}; } /*! * Locks the internal mutex, use \ref std::lock_guard instead of manually * calling lock and unlock. */ void lock () { _mut.lock(); } /*! * Unlocks the internal mutex, use \ref std::lock_guard instead of manually * calling lock and unlock. */ void unlock () { _mut.unlock(); } /*! * Notifies all waiting threads and registered \ref AsyncQueueWatch instances that * new data is available. */ void notify () { _cv.notify_all(); notifyWatches(); } private: AsyncQueue() = default; std::queue _messages; std::mutex _mut; std::condition_variable _cv; }; class AsyncQueueWatchPrivate; class LIBZYPP_NG_EXPORT AsyncQueueWatch : public AbstractEventSource { ZYPP_DECLARE_PRIVATE(AsyncQueueWatch) public: static std::shared_ptr create ( std::shared_ptr queue ); ~AsyncQueueWatch() override; void postNotifyEvent (); SignalProxy sigMessageAvailable(); // AbstractEventSource interface void onFdReady(int fd, int events) override; void onSignal(int signal) override; protected: AsyncQueueWatch( std::shared_ptr &&queue ); AsyncQueueWatch( AsyncQueueWatchPrivate &dd ); }; } #endif libzypp-17.36.5/zypp-core/zyppng/thread/private/000077500000000000000000000000001476576476200216165ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/thread/private/asyncqueue_p.h000066400000000000000000000013221476576476200244660ustar00rootroot00000000000000#ifndef ZYPP_NG_THREAD_PRIVATE_ASYNCQUEUE_P_H #define ZYPP_NG_THREAD_PRIVATE_ASYNCQUEUE_P_H #include #include #include #include namespace zyppng { class AsyncQueueWatchPrivate : public AbstractEventSourcePrivate { ZYPP_DECLARE_PUBLIC(AsyncQueueWatch) public: AsyncQueueWatchPrivate( std::shared_ptr &&q, AsyncQueueWatch &p ); ~AsyncQueueWatchPrivate() override; std::shared_ptr _queue; gint fds[2] = { -1, -1 }; Signal< void()> _sigMessageAvailable; }; } #endif // ZYPP_NG_THREAD_PRIVATE_ASYNCQUEUE_P_H libzypp-17.36.5/zypp-core/zyppng/thread/wakeup.cpp000066400000000000000000000015301476576476200221430ustar00rootroot00000000000000#include "wakeup.h" #include #include #include #include namespace zyppng { Wakeup::Wakeup() { ::pipe ( _wakeupPipe ); ::fcntl( _wakeupPipe[0], F_SETFL, O_NONBLOCK ); } Wakeup::~Wakeup() { ::close (_wakeupPipe[0]); ::close (_wakeupPipe[1]); } void Wakeup::notify() { eintrSafeCall( ::write, _wakeupPipe[1], "\n", 1); } void Wakeup::ack() { char dummy = 0; while ( eintrSafeCall( ::read, _wakeupPipe[0], &dummy, 1 ) > 0 ) { continue; } } int Wakeup::pollfd() const { return _wakeupPipe[0]; } std::shared_ptr Wakeup::makeNotifier( const bool enabled ) const { return SocketNotifier::create( _wakeupPipe[0], zyppng::SocketNotifier::Read, enabled ); } } libzypp-17.36.5/zypp-core/zyppng/thread/wakeup.h000066400000000000000000000031741476576476200216160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #ifndef ZYPP_NG_THREAD_WAKEUP_H_INCLUDED #define ZYPP_NG_THREAD_WAKEUP_H_INCLUDED #include namespace zyppng { class SocketNotifier; /*! * Simple helper class that can be used to notify a thread to wake up. * This is guaranteed to use signal safe means to wake up the thread. */ class Wakeup { public: Wakeup(); ~Wakeup(); /*! * Post a notification to the thread. */ void notify(); /*! * Called from the thread to acknowledge and clear the wakeup signal * \note If this is not called the EventLoop in the thread will constantly wake up */ void ack(); /*! * Returns the internal FD to be used in the thread to poll for notifications */ int pollfd() const; /*! * Convenience function to create a \ref zyppng::SocketNotifier that is listening for incoming * notifications. */ std::shared_ptr makeNotifier( const bool enabled = true ) const; private: int _wakeupPipe[2] = { -1, -1 }; }; } #endif // ZYPP_NG_THREAD_WAKEUP_H_INCLUDED libzypp-17.36.5/zypp-core/zyppng/ui/000077500000000000000000000000001476576476200173125ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/ui/ProgressObserver000066400000000000000000000000361476576476200225500ustar00rootroot00000000000000#include "progressobserver.h" libzypp-17.36.5/zypp-core/zyppng/ui/UserInterface000066400000000000000000000000331476576476200217700ustar00rootroot00000000000000#include "userinterface.h" libzypp-17.36.5/zypp-core/zyppng/ui/UserRequest000066400000000000000000000000311476576476200215160ustar00rootroot00000000000000#include "userrequest.h" libzypp-17.36.5/zypp-core/zyppng/ui/private/000077500000000000000000000000001476576476200207645ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/zyppng/ui/private/userinterface_p.h000066400000000000000000000007471476576476200243230ustar00rootroot00000000000000#ifndef ZYPP_NG_UI_PRIVATE_USERINTERFACE_P_H #define ZYPP_NG_UI_PRIVATE_USERINTERFACE_P_H #include #include #include namespace zyppng { class UserInterfacePrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(UserInterface) public: UserInterfacePrivate( UserInterface &b ) : BasePrivate(b) {} Signal _sigEvent; }; } #endif libzypp-17.36.5/zypp-core/zyppng/ui/progressobserver.cc000066400000000000000000000247171476576476200232500ustar00rootroot00000000000000#include "progressobserver.h" #include "zypp-core/AutoDispose.h" #include #include namespace zyppng { class ProgressObserverPrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(ProgressObserver) public: ProgressObserverPrivate( ProgressObserver &p ) : BasePrivate(p) {} void updateProgress (); void setLabel( const std::string &label ); ProgressObserverWeakRef _parent; std::string _label; // the current counter value double _counterValue = 0; // the number of steps we are going to have double _counterSteps = 0; // the value of all finished progresses double _finishedValue = 0; // the steps of all finished progresses double _finishedSteps = 0; int _baseValue = 0; int _baseSteps = 100; bool _started = false; bool _ignoreChildSigs = false; struct ChildInfo { ChildInfo( std::vector &&conns, float weight ) : _signalConns( std::move(conns) ), _childWeight( weight ) {} ChildInfo( ChildInfo &&other ) noexcept : _signalConns( std::move(other._signalConns) ) , _childWeight( other._childWeight ) { other._signalConns.clear (); } ChildInfo( const ChildInfo &other ) = delete; ~ChildInfo() { std::for_each( _signalConns.begin (), _signalConns.end(), []( auto &sig ){ sig.disconnect(); }); } ChildInfo &operator=( const ChildInfo & ) = delete; ChildInfo &operator=( ChildInfo &&other ) { _childWeight = other._childWeight; _signalConns = std::move(other._signalConns); other._signalConns.clear (); return *this; } std::vector _signalConns; float _childWeight = 1.0; // the factor how much increase a step in the child is worth in the parent }; std::vector _children; std::vector< ChildInfo > _childInfo; void onChildStarted(ProgressObserver &); void updateCounters(); void onChildFinished( ProgressObserver &child , ProgressObserver::FinishResult ); Signal _sigStarted; Signal _sigLabelChanged; Signal _sigStepsChanged; Signal _sigValueChanged; Signal _sigProgressChanged; Signal _sigFinished; Signal _sigNewSubprogress; }; ZYPP_IMPL_PRIVATE(ProgressObserver) void ProgressObserverPrivate::onChildStarted( ProgressObserver &/*child*/ ) { if ( !_started ) z_func()->start(); } void ProgressObserverPrivate::updateCounters() { if ( _ignoreChildSigs ) return; double currProgressSteps = _baseValue; double accumSteps = static_cast(_baseSteps); for ( std::vector::size_type i = 0; i < _children.size (); i++ ) { const auto childPtr = _children[i].get(); const auto &childInfo = _childInfo[i]; const auto weight = childInfo._childWeight; currProgressSteps += childPtr->current() * weight; accumSteps += childPtr->steps()* weight; } bool notifyAccuMaxSteps = _counterSteps != accumSteps ; bool notifyCurrSteps = _counterValue != currProgressSteps; _counterSteps = accumSteps; _counterValue = currProgressSteps; if ( !_started ) return; if ( notifyAccuMaxSteps ) _sigStepsChanged.emit( *z_func(), _counterSteps ); if ( notifyCurrSteps) { _sigValueChanged.emit( *z_func(), notifyCurrSteps ); _sigProgressChanged.emit( *z_func(), z_func()->progress() ); } } void ProgressObserverPrivate::onChildFinished(ProgressObserver &child, ProgressObserver::FinishResult ) { auto i = std::find_if( _children.begin (), _children.end (), [&]( const auto &elem ) { return ( &child == elem.get() ); } ); if ( i == _children.end() ) { WAR << "Unknown child sent a finished message, ignoring" << std::endl; return; } const auto idx = std::distance ( _children.begin (), i ); _children.erase(i); _childInfo.erase( _childInfo.begin () + idx ); updateCounters(); } ZYPP_IMPL_PRIVATE_CONSTR_ARGS ( ProgressObserver, const std::string &label, int steps ) : Base( *( new ProgressObserverPrivate( *this ) ) ) { Z_D(); d->_baseSteps = steps; d->_label = label; d->updateCounters(); } void ProgressObserverPrivate::setLabel(const std::string &label) { if ( _label == label ) return; _label = label; _sigLabelChanged.emit ( *z_func(), label ); } int ProgressObserver::steps() const { return d_func()->_counterSteps; } bool ProgressObserver::started() const { return d_func()->_started; } void ProgressObserver::start() { Z_D(); if ( d->_started ) return; d->updateCounters(); d->_started = true; d->_sigStarted.emit( *this ); } void ProgressObserver::reset() { Z_D(); { zypp::DtorReset deferedReset( d->_ignoreChildSigs, false ); d->_ignoreChildSigs = true; std::for_each( d->_children.begin (), d->_children.end(), []( auto &child ) { child->reset(); }); } d->updateCounters(); } double ProgressObserver::progress() const { return 100.0 * current() / steps(); } double ProgressObserver::current() const { return d_func()->_counterValue; } const std::vector &ProgressObserver::children() { return d_func()->_children; } const std::string &ProgressObserver::label() const { return d_func()->_label; } SignalProxy ProgressObserver::sigStarted() { return d_func()->_sigStarted; } SignalProxy ProgressObserver::sigLabelChanged() { return d_func()->_sigLabelChanged; } SignalProxy ProgressObserver::sigStepsChanged() { return d_func()->_sigStepsChanged; } SignalProxy ProgressObserver::sigValueChanged() { return d_func()->_sigValueChanged; } SignalProxy ProgressObserver::sigProgressChanged() { return d_func()->_sigProgressChanged; } SignalProxy ProgressObserver::sigFinished() { return d_func()->_sigFinished; } SignalProxy ProgressObserver::sigNewSubprogress() { return d_func()->_sigNewSubprogress; } void ProgressObserver::setBaseSteps(int steps) { Z_D(); if ( d->_baseSteps == steps ) return; d->_baseSteps = steps; // update stats d->updateCounters(); } void ProgressObserver::setLabel(const std::string &label) { d_func()->setLabel( label ); } void ProgressObserver::setCurrent(double curr) { Z_D(); auto set = std::max(0, std::min( curr, d->_baseSteps ) ); if ( set == d->_baseValue ) return; d->_baseValue = set; //update stats d->updateCounters(); } int ProgressObserver::baseSteps() const { return d_func()->_baseSteps; } void ProgressObserver::setFinished( FinishResult result ) { Z_D(); // finish all children first, started children are removed via their finished signal // others we have to manually remove while ( d->_children.size() ) { auto back = d->_children.back(); bool remove = !back->started (); back->setFinished( result ); if ( remove ) d->_children.pop_back(); } if ( result != Error ) setCurrent( d->_baseSteps ); if ( d->_started ) d->_sigFinished.emit( *this , result ); } void ProgressObserver::inc( double inc, const std::optional &newLabel ) { setCurrent ( d_func()->_baseValue + inc ); if ( newLabel ) setLabel ( *newLabel ); } void ProgressObserver::registerSubTask( const ProgressObserverRef& child, float weight ) { Z_D(); auto i = std::find( d->_children.begin(), d->_children.end(), child ); const auto adjustedWeight = std::min( std::max( 0.0, weight ), 1.0 ); if ( i != d->_children.end() ) { const auto index = std::distance ( d->_children.begin (), i ); d->_childInfo[index]._childWeight = adjustedWeight; } else { d->_children.push_back( child ); d->_childInfo.push_back( { { connectFunc ( *child, &ProgressObserver::sigStepsChanged, [this]( auto &sender, auto ){ d_func()->updateCounters(); }, *this ), connectFunc ( *child, &ProgressObserver::sigValueChanged, [this]( auto &sender, auto ){ d_func()->updateCounters(); }, *this ), connect ( *child, &ProgressObserver::sigStarted, *d, &ProgressObserverPrivate::onChildStarted ), connect ( *child, &ProgressObserver::sigFinished, *d, &ProgressObserverPrivate::onChildFinished ) } , adjustedWeight }); d->_sigNewSubprogress.emit( *this, child ); // if the child has been started already, we also need to start() if ( child->started () ) start(); } // update stats d->updateCounters(); } ProgressObserverRef ProgressObserver::makeSubTask( float weight, const std::string &label, int steps ) { auto r = ProgressObserver::create( label, steps ); registerSubTask ( r, weight ); return r; } /*! * Creates a new \ref zypp::ProgressData::ReceiverFnc and links it to the current ProgressObserver, * this can be used to interface with zypp code that was not yet migrated to the new ProgressObserver * API. * * \note the returned \ref zypp::ProgressData::ReceiverFnc will keep a reference to the \a ProgressObserver */ zypp::ProgressData::ReceiverFnc ProgressObserver::makeProgressDataReceiver() { return [ sThis = shared_this() ]( const zypp::ProgressData & data ){ auto instance = sThis.get(); instance->start(); instance->setBaseSteps ( data.max () - data.min () ); instance->setCurrent ( data.val () - data.min () ); instance->setLabel ( data.name () ); if ( data.finalReport() ) instance->setFinished(); return true; }; } } // namespace zyppng libzypp-17.36.5/zypp-core/zyppng/ui/progressobserver.h000066400000000000000000000221151476576476200231000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPPNG_PROGRESSOBSERVER_H #define ZYPPNG_PROGRESSOBSERVER_H #include #include #include #include #include // backwards compat #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS( ProgressObserver ); class ProgressObserverPrivate; class ProgressObserver : public Base { ZYPP_DECLARE_PRIVATE(ProgressObserver) ZYPP_ADD_CREATE_FUNC(ProgressObserver) public: enum FinishResult { Success, Error }; ZYPP_DECL_PRIVATE_CONSTR_ARGS(ProgressObserver, const std::string &label = std::string(), int steps = 100 ); void setBaseSteps( int steps ); int baseSteps ( ) const; int steps ( ) const; bool started ( ) const; /*! * Tells the \ref ProgressObserver to start sending signals on updates. * If start was not called, no progress update or finished signals are emitted. * * Calling start will also trigger all parent observers to be started, but not the children */ void start ( ); void reset ( ); void setCurrent ( double curr ); void setFinished ( FinishResult result = Success ); void inc ( double inc = 1.0, const std::optional &newLabel = {} ); double progress() const; double current() const; inline static ProgressObserverRef makeSubTask( ProgressObserverRef parentProgress, float weight = 1.0, const std::string &label = std::string(), int steps = 100 ) { if ( parentProgress ) return parentProgress->makeSubTask( weight, label, steps ); return nullptr; } inline static void start ( ProgressObserverRef progress ) { if ( progress ) progress->start(); } inline static void setup( ProgressObserverRef progress, const std::string &label = std::string(), int steps = 100 ) { if ( progress ) { progress->setLabel( label ); progress->setBaseSteps ( steps ); } } inline static void increase( ProgressObserverRef progress, double inc = 1.0, const std::optional &newLabel = {} ) { if ( progress ) progress->inc ( inc, newLabel ); } inline static void setCurrent ( ProgressObserverRef progress, double curr ) { if ( progress ) progress->setCurrent ( curr ); } inline static void setLabel ( ProgressObserverRef progress, const std::string &label ) { if ( progress ) progress->setLabel ( label ); } inline static void setSteps ( ProgressObserverRef progress, int steps ) { if ( progress ) progress->setBaseSteps ( steps ); } inline static void finish ( ProgressObserverRef progress, ProgressObserver::FinishResult result = ProgressObserver::Success ) { if ( progress ) progress->setFinished ( result ); } const std::vector &children(); void setLabel ( const std::string &label ); const std::string &label () const; void registerSubTask ( const ProgressObserverRef& child, float weight = 1.0 ); ProgressObserverRef makeSubTask( float weight = 1.0 ,const std::string &label = std::string(), int steps = 100 ); zypp::ProgressData::ReceiverFnc makeProgressDataReceiver (); SignalProxy sigStarted (); SignalProxy sigLabelChanged (); SignalProxy sigStepsChanged(); SignalProxy sigValueChanged(); SignalProxy sigProgressChanged(); SignalProxy sigFinished(); SignalProxy sigNewSubprogress(); }; namespace operators { namespace detail { enum class progress_helper_mode { Start, Increase, Set, Finish }; template struct progress_helper { progress_helper( ProgressObserverRef &&progressObserver, std::optional &&newStr, double inc ) : _progressObserver( std::move(progressObserver) ) , _newString( std::move(newStr) ) , _progressInc( inc ) {} template auto operator() ( T &&t ) { update(); return std::forward(t); } void operator()() { update(); } void update() { if ( _progressObserver ) { if constexpr ( mode == progress_helper_mode::Increase ) { _progressObserver->inc( _progressInc, _newString ); } else { _progressObserver->setCurrent ( _progressInc ); if ( _newString ) _progressObserver->setLabel ( *_newString ); } } } private: ProgressObserverRef _progressObserver; std::optional _newString; double _progressInc; }; template <> struct progress_helper { progress_helper( ProgressObserverRef &&progressObserver ) : _progressObserver( std::move(progressObserver) ){} template auto operator() ( T &&t ) { update(); return std::forward(t); } void operator()() { update(); } void update() { if ( _progressObserver ) { _progressObserver->start(); } } private: ProgressObserverRef _progressObserver; }; template <> struct progress_helper { progress_helper( ProgressObserverRef &&progressObserver, ProgressObserver::FinishResult result = ProgressObserver::Success ) : _progressObserver( std::move(progressObserver) ) , _result(result){} template auto operator() ( T &&t ) { update(); return std::forward(t); } void operator()() { update(); } void update() { if ( _progressObserver ) { _progressObserver->setFinished( _result ); } } private: ProgressObserverRef _progressObserver; ProgressObserver::FinishResult _result; }; } /*! * Starts the the given \ref ProgressObserver, forwarding the pipeline value without touching it */ inline auto startProgress( ProgressObserverRef progressObserver ) { return detail::progress_helper( std::move(progressObserver) ); } /*! * Increases the \ref ProgressObserver by the given \a progIncrease, forwarding the pipeline value without touching it. * Can also set a new label via \a newStr */ inline auto incProgress( ProgressObserverRef progressObserver, double progrIncrease = 1.0, std::optional newStr = {} ) { return detail::progress_helper( std::move(progressObserver), std::move(newStr), progrIncrease ); } /*! * Sets the current value in the given \ref ProgressObserver, forwarding the pipeline value without touching it * Can also set a new label via \a newStr */ inline auto setProgress( ProgressObserverRef progressObserver, double progrValue, std::optional newStr = {} ) { return detail::progress_helper( std::move(progressObserver), std::move(newStr), progrValue ); } /*! * Sets the label value in the given \ref ProgressObserver, forwarding the pipeline value without touching it */ inline auto setProgressLabel( ProgressObserverRef progressObserver, std::string newStr ) { // use the Increase functor, it allows us to let the progress value untouched and just sets the strings return detail::progress_helper( std::move(progressObserver), std::move(newStr), 0.0 ); } /*! * Sets the the given \ref ProgressObserver to finished, forwarding the pipeline value without touching it */ inline auto finishProgress( ProgressObserverRef progressObserver, ProgressObserver::FinishResult result = ProgressObserver::Success ) { return detail::progress_helper( std::move(progressObserver), result ); } } } // namespace zyppng #endif // ZYPPNG_PROGRESSOBSERVER_H libzypp-17.36.5/zypp-core/zyppng/ui/userinterface.cc000066400000000000000000000021361476576476200224620ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "private/userinterface_p.h" #include namespace zyppng { ZYPP_IMPL_PRIVATE(UserInterface) ZYPP_IMPL_PRIVATE_CONSTR( UserInterface ) : Base ( *( new UserInterfacePrivate(*this) ) ) { } UserInterface::UserInterface( UserInterfacePrivate &d ) : Base(d) { } void UserInterface::sendUserRequest(const UserRequestRef& event) { Z_D(); d->_sigEvent.emit( event ); } SignalProxy UserInterface::sigEvent() { return d_func()->_sigEvent; } } libzypp-17.36.5/zypp-core/zyppng/ui/userinterface.h000066400000000000000000000032161476576476200223240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_CORE_ZYPPNG_USERINTERFACE_H #define ZYPP_CORE_ZYPPNG_USERINTERFACE_H #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS( UserInterface ); ZYPP_FWD_DECL_TYPE_WITH_REFS( UserRequest ); class UserInterfacePrivate; /*! * Generic code that allows libzypp to send messages and request * directly to the user code. * * Every time a new request is sent the \ref UserInterface::sigEvent signal * is emitted, which deliveres the specific request. Depending on the * type of request the frontend code can return data to libzypp, for example * if a user wants to trust a key, or a simple password request. * */ class UserInterface : public Base { ZYPP_DECLARE_PRIVATE(UserInterface) ZYPP_ADD_CREATE_FUNC(UserInterface) public: ZYPP_DECL_PRIVATE_CONSTR(UserInterface); void sendUserRequest( const UserRequestRef& event ); SignalProxy sigEvent(); protected: UserInterface( UserInterfacePrivate &d ); }; } #endif libzypp-17.36.5/zypp-core/zyppng/ui/userrequest.cc000066400000000000000000000057311476576476200222160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "userrequest.h" #include #include namespace zyppng { UserRequest::UserRequest( UserData userData ) : _userData( std::move(userData) ) { } UserRequest::~UserRequest() { } const UserData &UserRequest::userData() const { return _userData; } UserData &UserRequest::userData() { return _userData; } ZYPP_IMPL_PRIVATE_CONSTR_ARGS(ShowMessageRequest, std::string message, MType mType, UserData data ) : UserRequest( std::move(data) ) , _type( mType ) , _message( std::move(message) ) { } UserRequestType ShowMessageRequest::type() const { return UserRequestType::Message; } ShowMessageRequest::MType ShowMessageRequest::messageType() { return _type; } const std::string &ShowMessageRequest::message() const { return _message; } ZYPP_IMPL_PRIVATE_CONSTR_ARGS(ListChoiceRequest, std::string label, std::vector answers, index_type defaultAnswer, UserData userData ) : UserRequest( std::move(userData) ) , _label( std::move(label) ) , _answers( std::move(answers) ) , _answer( std::move(defaultAnswer) ) , _default( std::move(defaultAnswer) ) { } UserRequestType ListChoiceRequest::type() const { return UserRequestType::ListChoice; } const std::string &ListChoiceRequest::label() const { return _label; } void ListChoiceRequest::setChoice(const index_type sel ) { if ( sel >= _answers.size() ) ZYPP_THROW( std::logic_error("Selection index is out of range") ); _answer = sel; } ListChoiceRequest::index_type ListChoiceRequest::choice() const { return _answer; } ListChoiceRequest::index_type ListChoiceRequest::defaultAnswer() const { return _default; } const std::vector &ListChoiceRequest::answers() const { return _answers; } ZYPP_IMPL_PRIVATE_CONSTR_ARGS(BooleanChoiceRequest, std::string label, const bool defaultAnswer, UserData userData ) : UserRequest( std::move(userData) ) , _label( std::move(label) ) , _answer( defaultAnswer ) { } UserRequestType BooleanChoiceRequest::type() const { return UserRequestType::BooleanChoice; } const std::string &BooleanChoiceRequest::label() const { return _label; } void BooleanChoiceRequest::setChoice(const bool sel) { _answer = sel; } bool BooleanChoiceRequest::choice() const { return _answer; } } libzypp-17.36.5/zypp-core/zyppng/ui/userrequest.h000066400000000000000000000116771476576476200220660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_CORE_ZYPPNG_USERREQUEST_H #define ZYPP_CORE_ZYPPNG_USERREQUEST_H #include #include #include #include namespace zyppng { using UserData = zypp::callback::UserData; using ContentType = zypp::ContentType; ZYPP_FWD_DECL_TYPE_WITH_REFS( UserRequest ); ZYPP_FWD_DECL_TYPE_WITH_REFS( ShowMessageRequest ); ZYPP_FWD_DECL_TYPE_WITH_REFS( ListChoiceRequest ); ZYPP_FWD_DECL_TYPE_WITH_REFS( BooleanChoiceRequest ); /* constexpr std::string_view CTYPE_SHOW_MESSAGE_REQUEST ("userreq/show-message"); constexpr std::string_view CTYPE_LIST_CHOICE_REQUEST ("userreq/list-choice"); constexpr std::string_view CTYPE_BOOLEAN_COICE_REQUEST("userreq/boolean-choice"); */ enum class UserRequestType : uint { Message, // simple message to the user, no input or predefined like y/n ListChoice, // request to select from a list of options BooleanChoice, // request user to say yes or no KeyTrust, // request to the user to trust a key Custom = 512 }; /*! * The UserRequest class provides a base object to send UI requests to the user, * every time libzypp needs input from the User, a UserRequest is generated and sent * via the \ref UserInterface to the user code, which can decide how to render the request, * a CLI app would render a prompt, while a UI application likely would open a popup window. */ class UserRequest : public Base { public: UserRequest( UserData userData = {} ); ~UserRequest() override; virtual UserRequestType type() const = 0; const UserData &userData() const; UserData &userData(); private: UserData _userData; }; /*! * The ShowMessageRequest class represents a simple informal message that the code needs to * print on the users screen * * \code * context->sendUserRequest( ShowMessageRequest::create("Repository downloaded") ); * \endcode */ class ShowMessageRequest : public UserRequest { ZYPP_ADD_CREATE_FUNC(ShowMessageRequest) public: enum class MType { Debug, Info, Warning, Error, Important, Data }; ZYPP_DECL_PRIVATE_CONSTR_ARGS(ShowMessageRequest, std::string message, MType mType = MType::Info, UserData data = {} ); UserRequestType type() const override; MType messageType(); const std::string &message() const; private: MType _type = MType::Info; std::string _message; }; /*! * The ListChoice Request class represents a choice request to the user, * the possible answers are given via a vector of possible choices. * * \code * * auto request = ListChoiceRequest::create( "Please select the choice you want: ", { {"y", "Info about y"}, {"n", "Info about n"}, {"d", "Info about d"} }, 1 ); * context->sendUserRequest( request ); * * const auto choice = request->choice(); * switch( choice ) { * case 0: * // handle 'y' choice * break; * case 1: * // handle 'n' choice * break; * case 2: * // handle 'd' choice * break; * default: * // error, should not happen! * break; * } * * \endcode */ class ListChoiceRequest : public UserRequest { ZYPP_ADD_CREATE_FUNC(ListChoiceRequest) public: struct Choice { std::string opt; std::string detail; }; using index_type = std::vector::size_type; ZYPP_DECL_PRIVATE_CONSTR_ARGS(ListChoiceRequest, std::string label, std::vector answers, index_type defaultAnswer, UserData userData = {} ); UserRequestType type() const override; const std::string &label() const; void setChoice ( const index_type sel ); index_type choice() const; index_type defaultAnswer() const; const std::vector &answers() const; private: std::string _label; std::vector _answers; index_type _answer = 0; index_type _default = 0; }; class BooleanChoiceRequest : public UserRequest { ZYPP_ADD_CREATE_FUNC(BooleanChoiceRequest) public: ZYPP_DECL_PRIVATE_CONSTR_ARGS(BooleanChoiceRequest, std::string label, const bool defaultAnswer = false, UserData userData = {} ); UserRequestType type() const override; const std::string &label() const; void setChoice ( const bool sel ); bool choice() const; private: std::string _label; bool _answer = false; }; } #endif libzypp-17.36.5/zypp-curl/000077500000000000000000000000001476576476200153635ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/CMakeLists.txt000066400000000000000000000111431476576476200201230ustar00rootroot00000000000000# Collect all files that may contain translatable texts FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" ) SET( POT_FILE_DEPENDS_ZYPP_CURL ${POT_FILE_DEPENDS} PARENT_SCOPE ) INCLUDE_DIRECTORIES ( ${LIBZYPP_SOURCE_DIR} ) IF (ENABLE_ZCHUNK_COMPRESSION) INCLUDE_DIRECTORIES( ${ZCHUNK_INCLUDEDIR} ) ENDIF(ENABLE_ZCHUNK_COMPRESSION) ADD_DEFINITIONS( -DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL ) SET( zypp_curl_HEADERS CurlConfig curlconfig.h ProxyInfo proxyinfo.h TransferSettings transfersettings.h ) SET( zypp_curl_private_HEADERS private/curlhelper_p.h ) SET( zypp_curl_SRCS curlconfig.cc proxyinfo.cc curlhelper.cc transfersettings.cc ) INSTALL( FILES ${zypp_curl_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-curl" ) SET( zypp_curl_auth_HEADERS auth/CurlAuthData auth/curlauthdata.h ) SET( zypp_curl_auth_private_HEADERS ) SET( zypp_curl_auth_SRCS auth/curlauthdata.cc ) INSTALL( FILES ${zypp_curl_auth_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-curl/auth" ) IF( NOT DISABLE_LIBPROXY ) SET(zypp_curl_proxyinfo_libproxy_SRCS proxyinfo/proxyinfolibproxy.cc) SET(zypp_curl_proxyinfo_libproxy_HEADERS proxyinfo/ProxyInfoLibproxy proxyinfo/proxyinfolibproxy.h) ENDIF( ) SET( zypp_curl_proxyinfo_SRCS proxyinfo/proxyinfosysconfig.cc ${zypp_curl_proxyinfo_libproxy_SRCS} ) SET( zypp_curl_proxyinfo_HEADERS proxyinfo/proxyinfoimpl.h proxyinfo/ProxyInfoSysconfig proxyinfo/proxyinfosysconfig.h ${zypp_curl_proxyinfo_libproxy_HEADERS} proxyinfo/proxyinfos.h ) INSTALL( FILES ${zypp_curl_proxyinfo_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp-curl/proxyinfo ) SET( zypp_curl_ng_network_SRCS ng/network/curlmultiparthandler.cc ng/network/networkrequestdispatcher.cc ng/network/networkrequesterror.cc ng/network/request.cc ) SET( zypp_curl_ng_network_HEADERS ng/network/curlmultiparthandler.h ng/network/AuthData ng/network/authdata.h ng/network/NetworkRequestDispatcher ng/network/networkrequestdispatcher.h ng/network/NetworkRequestError ng/network/networkrequesterror.h ng/network/rangedesc.h ng/network/Request ng/network/request.h ng/network/TransferSettings ng/network/transfersettings.h ) if (ENABLE_ZCHUNK_COMPRESSION) list( APPEND zypp_curl_ng_network_HEADERS ng/network/zckhelper.h ) list( APPEND zypp_curl_ng_network_SRCS ng/network/zckhelper.cc ) endif() SET( zypp_curl_ng_network_private_HEADERS ng/network/private/mediadebug_p.h ng/network/private/networkrequestdispatcher_p.h ng/network/private/networkrequesterror_p.h ng/network/private/request_p.h ) # ng files are not installed yet # INSTALL( FILES ${zypp_curl_ng_network_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp-curl/ng/network ) SET( zypp_curl_parser_HEADERS parser/MediaBlockList parser/mediablocklist.h parser/metadatahelper.h parser/MetaLinkParser parser/metalinkparser.h parser/ZsyncParser parser/zsyncparser.h ) SET( zypp_curl_parser_private_HEADERS ) SET( zypp_curl_parser_SRCS parser/mediablocklist.cc parser/metadatahelper.cc parser/metalinkparser.cc parser/zsyncparser.cc ) INSTALL( FILES ${zypp_curl_parser_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-curl/parser" ) SET( zypp_curl_lib_SRCS ${zypp_curl_SRCS} ${zypp_curl_auth_SRCS} ${zypp_curl_ng_network_SRCS} ${zypp_curl_parser_SRCS} ${zypp_curl_proxyinfo_SRCS} ${zypp_curl_ng_network_private_SRCS} ) SET( zypp_curl_lib_HEADERS ${zypp_curl_private_HEADERS} ${zypp_curl_HEADERS} ${zypp_curl_auth_private_HEADERS} ${zypp_curl_auth_HEADERS} ${zypp_curl_ng_network_HEADERS} ${zypp_curl_ng_network_private_HEADERS} ${zypp_curl_parser_private_HEADERS} ${zypp_curl_parser_HEADERS} ${zypp_curl_proxyinfo_HEADERS} ) # Default loggroup for all files SET_LOGGROUP( "zypp-curl" $${zypp_curl_lib_SRCS} ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) ADD_LIBRARY( zypp-curl STATIC ${zypp_curl_lib_SRCS} ${zypp_curl_lib_HEADERS} ng/network/curlmultiparthandler.h ng/network/curlmultiparthandler.cc ) target_link_libraries( zypp-curl PRIVATE zypp_lib_compiler_flags ) target_link_libraries( zypp-curl INTERFACE ${CURL_LIBRARIES} ) target_link_libraries( zypp-curl INTERFACE ${LIBXML2_LIBRARIES} ) IF( NOT DISABLE_LIBPROXY ) # required for dlload and dlclose target_link_libraries( zypp-curl INTERFACE ${CMAKE_DL_LIBS} ) ENDIF() libzypp-17.36.5/zypp-curl/CurlConfig000066400000000000000000000000301476576476200173320ustar00rootroot00000000000000#include "curlconfig.h" libzypp-17.36.5/zypp-curl/ProxyInfo000066400000000000000000000000271476576476200172420ustar00rootroot00000000000000#include "proxyinfo.h" libzypp-17.36.5/zypp-curl/TransferSettings000066400000000000000000000000361476576476200206120ustar00rootroot00000000000000#include "transfersettings.h" libzypp-17.36.5/zypp-curl/auth/000077500000000000000000000000001476576476200163245ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/auth/CurlAuthData000066400000000000000000000000321476576476200205630ustar00rootroot00000000000000#include "curlauthdata.h" libzypp-17.36.5/zypp-curl/auth/curlauthdata.cc000066400000000000000000000071741476576476200213250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/auth/curlauthdata.cc * */ #include "curlauthdata.h" #include #include #include #include using std::endl; namespace zypp::media { CurlAuthData::CurlAuthData() : AuthData() , _auth_type_str() , _auth_type(CURLAUTH_NONE) {} CurlAuthData::CurlAuthData(const AuthData & authData) : AuthData(authData) , _auth_type_str() , _auth_type(CURLAUTH_NONE) {} bool CurlAuthData::valid() const { return username().size() && password().size(); } std::ostream & CurlAuthData::dumpOn( std::ostream & str ) const { AuthData::dumpOn(str) << endl << " auth_type: " << _auth_type_str << " (" << _auth_type << ")"; return str; } long CurlAuthData::auth_type_str2long( std::string & auth_type_str ) { return auth_type_str2long( const_cast< const std::string &>(auth_type_str) ); } long CurlAuthData::auth_type_str2long( const std::string & auth_type_str ) { curl_version_info_data *curl_info = curl_version_info(CURLVERSION_NOW); std::vector list; std::vector::const_iterator it; long auth_type = CURLAUTH_NONE; zypp::str::split(auth_type_str, std::back_inserter(list), ","); for(it = list.begin(); it != list.end(); ++it) { if(*it == "basic") { auth_type |= CURLAUTH_BASIC; } else if(*it == "digest") { auth_type |= CURLAUTH_DIGEST; } else if((curl_info && (curl_info->features & CURL_VERSION_NTLM)) && (*it == "ntlm")) { auth_type |= CURLAUTH_NTLM; } else if((curl_info && (curl_info->features & CURL_VERSION_SPNEGO)) && (*it == "spnego" || *it == "negotiate")) { // there is no separate spnego flag for this auth type auth_type |= CURLAUTH_GSSNEGOTIATE; } else if((curl_info && (curl_info->features & CURL_VERSION_GSSNEGOTIATE)) && (*it == "gssnego" || *it == "negotiate")) { auth_type |= CURLAUTH_GSSNEGOTIATE; } else { ZYPP_THROW(MediaException(str::Format(_("Unsupported HTTP authentication method '%s'")) % *it)); } } return auth_type; } std::string CurlAuthData::auth_type_long2str(long auth_type) { std::list auth_list; if(auth_type & CURLAUTH_GSSNEGOTIATE) auth_list.push_back("negotiate"); if(auth_type & CURLAUTH_NTLM) auth_list.push_back("ntlm"); if(auth_type & CURLAUTH_DIGEST) auth_list.push_back("digest"); if(auth_type & CURLAUTH_BASIC) auth_list.push_back("basic"); return str::join(auth_list, ","); } std::ostream & operator << (std::ostream & str, const CurlAuthData & auth_data) { auth_data.dumpOn(str); return str; } } libzypp-17.36.5/zypp-curl/auth/curlauthdata.h000066400000000000000000000071441476576476200211640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/auth/CurlAuthData * */ #ifndef ZYPP_CURL_AUTH_CURLAUTHDATA_H_INCLUDED #define ZYPP_CURL_AUTH_CURLAUTHDATA_H_INCLUDED #include namespace zypp { namespace media { /** * Curl HTTP authentication data. */ class ZYPP_API CurlAuthData : public AuthData { public: /** * Default constructor. Initializes username and password to empty strings * and authetication type to CURLAUTH_NONE. */ CurlAuthData(); CurlAuthData(const AuthData & authData); CurlAuthData(std::string & username, std::string & password, std::string & auth_type) : AuthData(username,password), _auth_type_str(auth_type) { _auth_type = auth_type_str2long(auth_type); } CurlAuthData(std::string & username, std::string & password, long auth_type) : AuthData(username,password), _auth_type(auth_type) { _auth_type_str = auth_type_long2str(auth_type); } /** * Checks validity of authentication data. * \return true if the object contains non-empty username, * non-empty password, and specifies authentication type; false otherwise. */ bool valid() const override; /** * Set HTTP authentication type(s) to use. * \param comma separated list of HTTP authentication type names */ void setAuthType(std::string auth_type) { _auth_type_str = auth_type; _auth_type = auth_type_str2long(auth_type); } /** * Set HTTP authentication type(s) to use. * \param HTTP authentication type as in long ORed form. * \see curl.h for available auth types */ void setAuthType(long auth_type) { _auth_type = auth_type; _auth_type_str = auth_type_long2str(auth_type); } long authType() const { return _auth_type; } std::string authTypeAsString() const { return _auth_type_str; } std::string getUserPwd() const { return username() + ":" + password(); } /** * Converts a string of comma separated list of authetication type names * into a long of ORed CURLAUTH_* identifiers. * The method also automatically leaves out any auth types declared * not supported by curl_version_info(). * * \throws MediaException if an invalid authentication type name is * encountered. */ static long auth_type_str2long( std::string & auth_type_str ); static long auth_type_str2long( const std::string &auth_type_str ); /** * Converts a long of ORed CURLAUTH_* identifiers into a string of comma * separated list of authentication type names. */ static std::string auth_type_long2str(long auth_type); std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _auth_type_str; long _auth_type; }; using CurlAuthData_Ptr = shared_ptr; std::ostream & operator << (std::ostream & str, const CurlAuthData & auth_data); } } #endif libzypp-17.36.5/zypp-curl/curlconfig.cc000066400000000000000000000110771476576476200200330ustar00rootroot00000000000000#include #include #include #include #include #include #include using std::endl; namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // METHOD NAME : CurlConfig::parseConfig // METHOD TYPE : int // int CurlConfig::parseConfig(CurlConfig & config, const std::string & filename) { Pathname curlrcFile; if(filename.empty()) { // attempts to load .curlrc from the homedir char *home = getenv("HOME"); if(home) curlrcFile = std::string( home ) + std::string( "/.curlrc" ); } else curlrcFile = filename; PathInfo h_info(curlrcFile.dirname(), PathInfo::LSTAT); PathInfo c_info(curlrcFile, PathInfo::LSTAT); if( h_info.isDir() && h_info.userMayRX() && c_info.isFile() && c_info.userMayR() ) { MIL << "Going to parse " << curlrcFile << endl; } else { char buf[32] = ""; WAR << "Not allowed to parse '" << curlrcFile << "': dir/file owner: " << h_info.owner() << "/" << c_info.owner() << ", process uid: " << getuid() << " (" << (!getlogin_r(buf, 31) ? buf : "") << ")" << std::endl; return 1; } std::ifstream inp(curlrcFile.c_str()); for(iostr::EachLine in( inp ); in; in.next()) { std::string line = str::trim(*in); // skip empty lines and comments if (line.empty()) continue; switch (line[0]) { case '#': case '/': case '\r': case '\n': case '*': case '\0': continue; } // DBG << "line " << in.lineNo() << ": " << line << endl; // can't log passwords const char * beg = line.c_str(); const char * cur = beg; // space, '=' and ':' are all valid separators in curlrc #define ISSEP(x) (((x)=='=') || ((x) == ':') || isspace(x)) // skip leading dashes (they are optional) while (*cur && *cur == '-') cur++; beg = cur; // skip non-separator characters while (*cur && !ISSEP(*cur)) cur++; std::string option(beg, cur - beg); // skip separator characters while (*cur && ISSEP(*cur)) cur++; // rewind to the end of the line beg = cur; while (*cur) cur++; std::string value(beg, cur - beg); DBG << "GOT: " << option << endl; if (!value.empty()) { // quoted parameter if (value[0] == '\"') { // remove the quotes std::string::size_type pos = value.rfind('\"'); bool cut_last = pos == value.size() - 1 && pos > 1 && value[pos-1] != '\\'; value = value.substr(1, cut_last ? value.size() - 2 : value.size() - 1); // replace special characters: pos = 0; while ((pos = value.find('\\', pos)) != std::string::npos) { // just erase the backslash if it is found at the end if (pos == value.size() - 1) { value = value.erase(pos, 1); break; } switch(value[pos+1]) { case 't': value = value.replace(pos, 2, "\t"); break; case 'n': value = value.replace(pos, 2, "\n"); break; case 'r': value = value.replace(pos, 2, "\r"); break; case 'v': value = value.replace(pos, 2, "\v"); break; case '\\': value = value.erase(pos++, 1); break; default:; value = value.erase(pos, 1); } } } // DBG << "PARAM: " << value << endl; // can't log passwords } CurlConfig::setParameter(config, option, value); } // for EachLine in curlrc return 0; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : CurlConfig::setParameter // METHOD TYPE : int // int CurlConfig::setParameter(CurlConfig & config, const std::string & option, const std::string & value) { if (option == "proxy-user") config.proxyuserpwd = value; // add more curl config data here as they become needed // else if (option == "foo") else DBG << "Ignoring option " << option << endl; return 0; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-curl/curlconfig.h000066400000000000000000000034271476576476200176750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/CurlConfig */ #ifndef ZYPP_CURL_CURLCONFIG_H_INCLUDED #define ZYPP_CURL_CURLCONFIG_H_INCLUDED //#include #include namespace zypp { namespace media { /** * Structure holding values of curlrc options. */ struct CurlConfig { public: /** * Parse a curlrc file and store the result in the \a config structure. * * \param config a CurlConfig structure * \param filename path to the curlrc file. If empty, ~/.curlrc is used. * \return 0 on success, 1 if problem occurs. */ static int parseConfig(CurlConfig & config, const std::string & filename = ""); /** * Stores the \a value of the \a option in the \a config structure or * logs an unknown option. * * \return 0 on success, 1 if problem occurs. */ static int setParameter(CurlConfig & config, const std::string & option, const std::string & value); public: std::string proxyuserpwd; // add more curl config data here as they become needed }; } // namespace media } // namespace zypp #endif /*ZYPP_CURL_CURLCONFIG_H_INCLUDED*/ libzypp-17.36.5/zypp-curl/curlhelper.cc000066400000000000000000000405541476576476200200470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/curlhelper.cc * */ #include "private/curlhelper_p.h" #include #include #include #include #include #include #include #include #include #include #include #define TRANSFER_TIMEOUT_MAX 60 * 60 using std::endl; using namespace zypp; namespace zypp { namespace env { const long & ZYPP_MEDIA_CURL_DEBUG() { static const long ret = [](){ const char * env = getenv("ZYPP_MEDIA_CURL_DEBUG"); return env && *env ? str::strtonum( env ) : 0; }(); return ret; } int ZYPP_MEDIA_CURL_IPRESOLVE() { static int _v = [](){ int ret = 0; if ( const char * envp = getenv( "ZYPP_MEDIA_CURL_IPRESOLVE" ) ) { WAR << "env set: $ZYPP_MEDIA_CURL_IPRESOLVE='" << envp << "'" << std::endl; if ( strcmp( envp, "4" ) == 0 ) ret = 4; else if ( strcmp( envp, "6" ) == 0 ) ret = 6; } return ret; }(); return _v; } } // namespace env } // namespace zypp namespace internal { void globalInitCurlOnce() { // function-level static <=> std::call_once static bool once __attribute__ ((__unused__)) = ( [] { MIL << "global_init libcurl: build version: (" << LIBCURL_VERSION << "), runtime version: (" << curl_version_info(CURLVERSION_NOW)->version << ") " << endl; if ( curl_global_init( CURL_GLOBAL_ALL ) != 0 ) WAR << "curl global init failed" << std::endl; } (), true ); } uint curlVersion() { auto curlV = curl_version_info ( CURLVERSION_NOW ); return curlV->version_num; } int log_curl( CURL * curl, curl_infotype info, char * ptr, size_t len, void * max_lvl ) { if ( max_lvl == nullptr ) return 0; long maxlvl = *(static_cast(max_lvl)); const char * pfx = ""; bool isContent = true; // otherwise it's data switch( info ) { case CURLINFO_TEXT: if ( maxlvl < 1 ) return 0; pfx = "*"; break; case CURLINFO_HEADER_IN: if ( maxlvl < 2 ) return 0; pfx = "<"; break; case CURLINFO_HEADER_OUT: if ( maxlvl < 2 ) return 0; pfx = ">"; break; case CURLINFO_SSL_DATA_IN: if ( maxlvl < 3 ) return 0; isContent = false; pfx = "<[SSL]"; break; case CURLINFO_SSL_DATA_OUT: if ( maxlvl < 3 ) return 0; isContent = false; pfx = ">[SSL]"; break; case CURLINFO_DATA_IN: if ( maxlvl < 3 ) return 0; isContent = false; pfx = "<[DTA]"; break; case CURLINFO_DATA_OUT: if ( maxlvl < 3 ) return 0; isContent = false; pfx = ">[DTA]"; break; default: return 0; } // We'd like to keep all log messages within function `log_curl` // because this tag to grep for is known and communicate to users. if ( isContent ) { std::vector lines; // don't want log from within the lambda strv::split( std::string_view( ptr, len ), "\n", [&lines]( std::string_view line, unsigned, bool last ) { if ( last ) return; // empty word after final \n line = strv::rtrim( line, "\r" ); lines.push_back( line ); }); for ( const auto & line : lines ) { if ( str::hasPrefix( line, "Authorization:" ) ) { std::string_view::size_type pos { line.find( " ", 15 ) }; // Authorization: if ( pos == std::string::npos ) pos = 15; DBG << curl << " " << pfx << " " << line.substr( 0, pos ) << " " << endl; } else DBG << curl << " " << pfx << " " << line << endl; } } else { if ( maxlvl < 4 ) DBG << curl << " " << pfx << " " << len << " byte" << endl; else hexdumpOn( DBG << curl << " " << pfx << " ", ptr, len ); } return 0; } void setupZYPP_MEDIA_CURL_DEBUG( CURL *curl ) { if ( not curl ) { INT << "Got a NULL curl handle" << endl; return; } if ( env::ZYPP_MEDIA_CURL_DEBUG() > 0 ) { curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L ); curl_easy_setopt( curl, CURLOPT_DEBUGFUNCTION, log_curl ); curl_easy_setopt( curl, CURLOPT_DEBUGDATA, &env::ZYPP_MEDIA_CURL_DEBUG() ); } } size_t log_redirects_curl( char *ptr, size_t size, size_t nmemb, void *userdata) { //INT << "got header: " << std::string(ptr, ptr + size*nmemb) << endl; char * lstart = ptr, * lend = ptr; size_t pos = 0; size_t max = size * nmemb; while (pos + 1 < max) { // get line for (lstart = lend; *lend != '\n' && pos < max; ++lend, ++pos); // look for "Location" if ( strncasecmp( lstart, "Location:", 9 ) == 0 ) { std::string line { lstart, *(lend-1)=='\r' ? lend-1 : lend }; DBG << "redirecting to " << line << std::endl; if ( userdata ) { *reinterpret_cast( userdata ) = line; } return max; } // continue with the next line if (pos + 1 < max) { ++lend; ++pos; } else break; } return max; } /** * Fills the settings structure using options passed on the url * for example ?timeout=x&proxy=foo */ void fillSettingsFromUrl( const Url &url, media::TransferSettings &s ) { { const std::string & param { url.getQueryParam("timeout") }; if( ! param.empty() ) { long num = str::strtonum(param); if( num >= 0 && num <= TRANSFER_TIMEOUT_MAX ) s.setTimeout( num ); } } { std::string param { url.getUsername() }; if ( ! param.empty() ) { s.setUsername( std::move(param) ); param = url.getPassword(); if ( ! param.empty() ) s.setPassword( std::move(param) ); } else { // if there is no username, set anonymous auth if ( ( url.getScheme() == "ftp" || url.getScheme() == "tftp" ) && s.username().empty() ) s.setAnonymousAuth(); } } if ( url.getScheme() == "https" ) { s.setVerifyPeerEnabled( false ); s.setVerifyHostEnabled( false ); const std::string & verify { url.getQueryParam("ssl_verify") }; if( verify.empty() || verify == "yes" ) { s.setVerifyPeerEnabled( true ); s.setVerifyHostEnabled( true ); } else if ( verify == "no" ) { s.setVerifyPeerEnabled( false ); s.setVerifyHostEnabled( false ); } else { std::vector flags; str::split( verify, std::back_inserter(flags), "," ); for ( const auto & flag : flags ) { if ( flag == "host" ) s.setVerifyHostEnabled( true ); else if ( flag == "peer" ) s.setVerifyPeerEnabled( true ); else ZYPP_THROW( media::MediaBadUrlException(url, "Unknown ssl_verify flag "+flag) ); } } } { Pathname ca_path { url.getQueryParam("ssl_capath") }; if( ! ca_path.empty() ) { if( ! PathInfo(ca_path).isDir() || ! ca_path.absolute() ) ZYPP_THROW(media::MediaBadUrlException(url, "Invalid ssl_capath path")); else s.setCertificateAuthoritiesPath( std::move(ca_path) ); } } { Pathname client_cert { url.getQueryParam("ssl_clientcert") }; if( ! client_cert.empty() ) { if( ! PathInfo(client_cert).isFile() || ! client_cert.absolute() ) ZYPP_THROW(media::MediaBadUrlException(url, "Invalid ssl_clientcert file")); else s.setClientCertificatePath( std::move(client_cert) ); } } { Pathname client_key { url.getQueryParam("ssl_clientkey") }; if( ! client_key.empty() ) { if( ! PathInfo(client_key).isFile() || ! client_key.absolute() ) ZYPP_THROW(media::MediaBadUrlException(url, "Invalid ssl_clientkey file")); else s.setClientKeyPath( std::move(client_key) ); } } { std::string param { url.getQueryParam( "proxy" ) }; if ( ! param.empty() ) { if ( param == EXPLICITLY_NO_PROXY ) { // Workaround TransferSettings shortcoming: With an // empty proxy string, code will continue to look for // valid proxy settings. So set proxy to some non-empty // string, to indicate it has been explicitly disabled. s.setProxy(EXPLICITLY_NO_PROXY); s.setProxyEnabled(false); } else { const std::string & proxyport { url.getQueryParam( "proxyport" ) }; if ( ! proxyport.empty() ) { param += ":"; param += proxyport; } s.setProxy( std::move(param) ); s.setProxyEnabled( true ); } } } { std::string param { url.getQueryParam( "proxyuser" ) }; if ( ! param.empty() ) { s.setProxyUsername( std::move(param) ); s.setProxyPassword( url.getQueryParam( "proxypass" ) ); } } { // HTTP authentication type std::string param { url.getQueryParam("auth") }; if ( ! param.empty() && (url.getScheme() == "http" || url.getScheme() == "https") ) { try { media::CurlAuthData::auth_type_str2long (param ); // check if we know it } catch ( const media::MediaException & ex_r ) { DBG << "Rethrowing as MediaUnauthorizedException."; ZYPP_THROW(media::MediaUnauthorizedException(url, ex_r.msg(), "", "")); } s.setAuthType( std::move(param) ); } } { // workarounds const std::string & param { url.getQueryParam("head_requests") }; if( ! param.empty() && param == "no" ) s.setHeadRequestsAllowed( false ); } { const auto &cookieFileParam = url.getQueryParam( "cookies" ); if ( !cookieFileParam.empty() && str::strToBool( cookieFileParam, true ) ) s.setEnableCookieFile ( true ); else s.setEnableCookieFile ( false ); } } /** * Reads the system proxy configuration and fills the settings * structure proxy information */ void fillSettingsSystemProxy( const Url& url, media::TransferSettings &s ) { media::ProxyInfo proxy_info; if ( proxy_info.useProxyFor( url ) ) { // We must extract any 'user:pass' from the proxy url // otherwise they won't make it into curl (.curlrc wins). try { Url u( proxy_info.proxy( url ) ); s.setProxy( u.asString( url::ViewOption::WITH_SCHEME + url::ViewOption::WITH_HOST + url::ViewOption::WITH_PORT ) ); // don't overwrite explicit auth settings if ( s.proxyUsername().empty() ) { s.setProxyUsername( u.getUsername( url::E_ENCODED ) ); s.setProxyPassword( u.getPassword( url::E_ENCODED ) ); } s.setProxyEnabled( true ); } catch (...) {} // no proxy if URL is malformed } } void curlEscape( std::string & str_r, const char char_r, const std::string & escaped_r ) { for ( std::string::size_type pos = str_r.find( char_r ); pos != std::string::npos; pos = str_r.find( char_r, pos ) ) { str_r.replace( pos, 1, escaped_r ); } } std::string curlEscapedPath( std::string path_r ) { curlEscape( path_r, ' ', "%20" ); return path_r; } std::string curlUnEscape( const std::string& text_r ) { char * tmp = curl_unescape( text_r.c_str(), 0 ); std::string ret( tmp ); curl_free( tmp ); return ret; } Url clearQueryString(const Url &url) { Url curlUrl (url); curlUrl.setUsername( "" ); curlUrl.setPassword( "" ); curlUrl.setPathParams( "" ); curlUrl.setFragment( "" ); curlUrl.delQueryParams( { "cookies", "proxy", "proxyport", "proxyuser", "proxypass", "ssl_capath", "ssl_verify", "ssl_clientcert", "ssl_clientkey", "timeout", "auth", "username", "password", "mediahandler", "credentials", "head_requests", "mediahandler", } ); return curlUrl; } // bsc#933839: propagate proxy settings passed in the repo URL // boo#1127591: propagate ssl settings passed in the repo URL zypp::Url propagateQueryParams( zypp::Url url_r, const zypp::Url & template_r ) { using namespace std::literals::string_literals; for ( const std::string ¶m : { "proxy"s, "proxyport"s, "proxyuser"s, "proxypass"s, "ssl_capath"s, "ssl_verify"s } ) { const std::string & value( template_r.getQueryParam( param ) ); if ( ! value.empty() ) url_r.setQueryParam( param, value ); } return url_r; } CurlPollHelper::CurlPollHelper(CurlPoll &p) : _parent(p) { curl_multi_setopt( _parent._multi, CURLMOPT_SOCKETFUNCTION, socketcb ); curl_multi_setopt( _parent._multi, CURLMOPT_SOCKETDATA, this ); curl_multi_setopt( _parent._multi, CURLMOPT_TIMERFUNCTION, timercb ); curl_multi_setopt( _parent._multi, CURLMOPT_TIMERDATA, this ); } CurlPollHelper::~CurlPollHelper() { curl_multi_setopt( _parent._multi, CURLMOPT_SOCKETFUNCTION, nullptr ); curl_multi_setopt( _parent._multi, CURLMOPT_SOCKETDATA, nullptr ); curl_multi_setopt( _parent._multi, CURLMOPT_TIMERFUNCTION, nullptr ); curl_multi_setopt( _parent._multi, CURLMOPT_TIMERDATA, nullptr ); } int CurlPollHelper::socketcb(CURL *easy, curl_socket_t s, int what, CurlPollHelper *userp, void *sockp) { auto it = std::find_if( userp->socks.begin(), userp->socks.end(), [&]( const GPollFD &fd){ return fd.fd == s; }); gushort events = 0; if ( what == CURL_POLL_REMOVE ) { if ( it == userp->socks.end() ) { WAR << "Ignoring unknown socket in static_socketcb" << std::endl; return 0; } userp->socks.erase(it); return 0; } else if ( what == CURL_POLL_IN ) { events = G_IO_IN | G_IO_HUP | G_IO_ERR; } else if ( what == CURL_POLL_OUT ) { events = G_IO_OUT | G_IO_ERR; } else if ( what == CURL_POLL_INOUT ) { events = G_IO_IN | G_IO_OUT | G_IO_HUP | G_IO_ERR; } if ( it != userp->socks.end() ) { it->events = events; it->revents = 0; } else { userp->socks.push_back( GPollFD{ .fd = s, .events = events, .revents = 0 } ); } return 0; } int CurlPollHelper::timercb(CURLM *, long timeout_ms, CurlPollHelper *thatPtr) { if ( !thatPtr ) return 0; if ( timeout_ms == -1 ) thatPtr->timeout_ms.reset(); // curl wants to delete its timer else thatPtr->timeout_ms = timeout_ms; // maximum time curl wants us to sleep return 0; } CURLMcode internal::CurlPollHelper::handleSocketActions( const std::vector &actionsFds , int first ) { for ( size_t sock = first; sock < actionsFds.size(); sock++ ) { const auto &waitFd = actionsFds[sock]; if ( waitFd.revents == 0 ) continue; int ev = 0; if ( (waitFd.revents & G_IO_HUP) == G_IO_HUP || (waitFd.revents & G_IO_IN) == G_IO_IN ) { ev = CURL_CSELECT_IN; } if ( (waitFd.revents & G_IO_OUT) == G_IO_OUT ) { ev |= CURL_CSELECT_OUT; } if ( (waitFd.revents & G_IO_ERR) == G_IO_ERR ) { ev |= CURL_CSELECT_ERR; } int runn = 0; CURLMcode mcode = curl_multi_socket_action( _parent._multi, waitFd.fd, ev, &runn ); if (mcode != CURLM_OK) return mcode; } return CURLM_OK; } CURLMcode internal::CurlPollHelper::handleTimout() { int handles = 0; return curl_multi_socket_action( _parent._multi, CURL_SOCKET_TIMEOUT, 0, &handles ); } /*! * Enables the redirection protocols that we support, this code is a bit ugly * because for newer versions we need to detect the current curl version at runtime, but at the same * time need the compile time switch in case we are built against a older libcurl version. * * Reason for this is that we do not explicitely require the libcurl version we are built against, * this could mean we are ending up with a libcurl older than the one we built against. * * See bsc#1218831 */ CURLcode setCurlRedirProtocols(CURL *curl) { #if CURLVERSION_AT_LEAST(7,19,4) #if CURLVERSION_AT_LEAST(7,85,0) // runtime version might be different from build version if( ::internal::curlVersion() >= CURL_VERSION_BITS(7,85,0) ) { return curl_easy_setopt ( curl, CURLOPT_REDIR_PROTOCOLS_STR, "https" ); } else { return curl_easy_setopt ( curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS ); } #else return curl_easy_setopt ( curl, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS ); #endif #endif // #if CURLVERSION_AT_LEAST(7,19,4) return CURLE_OK; } } libzypp-17.36.5/zypp-curl/ng/000077500000000000000000000000001476576476200157675ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/ng/network/000077500000000000000000000000001476576476200174605ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/ng/network/AuthData000066400000000000000000000000261476576476200210740ustar00rootroot00000000000000#include "authdata.h" libzypp-17.36.5/zypp-curl/ng/network/NetworkRequestDispatcher000066400000000000000000000000461476576476200244140ustar00rootroot00000000000000#include "networkrequestdispatcher.h" libzypp-17.36.5/zypp-curl/ng/network/NetworkRequestError000066400000000000000000000000411476576476200234120ustar00rootroot00000000000000#include "networkrequesterror.h" libzypp-17.36.5/zypp-curl/ng/network/Request000066400000000000000000000000251476576476200210300ustar00rootroot00000000000000#include "request.h" libzypp-17.36.5/zypp-curl/ng/network/TransferSettings000066400000000000000000000000361476576476200227070ustar00rootroot00000000000000#include "transfersettings.h" libzypp-17.36.5/zypp-curl/ng/network/authdata.h000066400000000000000000000020531476576476200214240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_MEDIA_NETWORK_AUTHDATA_H_INCLUDED #define ZYPPNG_MEDIA_NETWORK_AUTHDATA_H_INCLUDED #include namespace zyppng { using AuthData = zypp::media::AuthData; using AuthData_Ptr = zypp::media::AuthData_Ptr; using NetworkAuthData = zypp::media::CurlAuthData; using NetworkAuthData_Ptr = zypp::media::CurlAuthData_Ptr; } #endif libzypp-17.36.5/zypp-curl/ng/network/curlmultiparthandler.cc000066400000000000000000000646461476576476200242540ustar00rootroot00000000000000#include "curlmultiparthandler.h" #include #include #include #include namespace zyppng { namespace { class CurlMultiPartSetoptError : public zypp::Exception { public: CurlMultiPartSetoptError ( CURLcode code ) : _code(code){}; CURLcode code() const; private: CURLcode _code; }; CURLcode CurlMultiPartSetoptError::code() const { return _code; } class CurlMultInitRangeError : public zypp::Exception { public: CurlMultInitRangeError ( std::string what ) : zypp::Exception( std::move(what) ){} }; } size_t CurlMultiPartHandler::curl_hdrcallback(char *ptr, size_t size, size_t nmemb, void *userdata) { if ( !userdata ) return 0; CurlMultiPartHandler *that = reinterpret_cast( userdata ); return that->hdrcallback( ptr, size, nmemb ); } size_t CurlMultiPartHandler::curl_wrtcallback(char *ptr, size_t size, size_t nmemb, void *userdata) { if ( !userdata ) return 0; CurlMultiPartHandler *that = reinterpret_cast( userdata ); return that->wrtcallback( ptr, size, nmemb ); } CurlMultiPartHandler::Range::Range(RangeDesc &&rd, std::optional dig, std::any userD, State rangeState) : RangeDesc( std::move(rd) ) , _digest( std::move(dig) ) , userData( std::move(userD) ) , _rangeState( rangeState ) { } void CurlMultiPartHandler::Range::restart() { _rangeState = CurlMultiPartHandler::Pending; bytesWritten = 0; if ( _digest ) _digest->reset(); } CurlMultiPartHandler::Range CurlMultiPartHandler::Range::clone() const { return Range ( RangeDesc { ._start = _start, ._len = _len, ._chksumtype = _chksumtype, ._checksum = _checksum, ._relevantDigestLen = _relevantDigestLen, ._chksumPad = _chksumPad }, ( _digest ? _digest->clone() : std::optional{} ), userData, _rangeState ); } CurlMultiPartHandler::Range CurlMultiPartHandler::Range::make(size_t start, size_t len, std::optional &&digest, CheckSumBytes &&expectedChkSum, std::any &&userData, std::optional digestCompareLen, std::optional dataBlockPadding) { std::string chksumtype = ( digest ? digest->name() : std::string() ); return Range ( RangeDesc { ._start = start, ._len = len, ._chksumtype = std::move(chksumtype), ._checksum = std::move( expectedChkSum ), ._relevantDigestLen = std::move( digestCompareLen ), ._chksumPad = std::move( dataBlockPadding ), }, std::move( digest ), std::move( userData ), State::Pending ); } CurlMultiPartHandler::CurlMultiPartHandler(ProtocolMode mode, void *easyHandle, std::vector &ranges, CurlMultiPartDataReceiver &receiver) : _protocolMode( mode ) , _easyHandle( easyHandle ) , _receiver( receiver ) , _requestedRanges( ranges ) { // non http can only do range by range if ( _protocolMode == ProtocolMode::Basic ) { WAR << "!!!! Downloading ranges without HTTP might be slow !!!!" << std::endl; _rangeAttemptIdx = _rangeAttemptSize - 1; } } CurlMultiPartHandler::~CurlMultiPartHandler() { if ( _easyHandle ) { curl_easy_setopt( _easyHandle, CURLOPT_HEADERFUNCTION, nullptr ); curl_easy_setopt( _easyHandle, CURLOPT_HEADERDATA, nullptr ); curl_easy_setopt( _easyHandle, CURLOPT_WRITEFUNCTION, nullptr ); curl_easy_setopt( _easyHandle, CURLOPT_WRITEDATA, nullptr ); } } size_t CurlMultiPartHandler::hdrcallback(char *ptr, size_t size, size_t nmemb) { // it is valid to call this function with no data to read, just call the given handler // or return ok if ( size * nmemb == 0) return _receiver.headerfunction( ptr, size * nmemb ); if ( _protocolMode == ProtocolMode::HTTP ) { std::string_view hdr( ptr, size*nmemb ); hdr.remove_prefix( std::min( hdr.find_first_not_of(" \t\r\n"), hdr.size() ) ); const auto lastNonWhitespace = hdr.find_last_not_of(" \t\r\n"); if ( lastNonWhitespace != hdr.npos ) hdr.remove_suffix( hdr.size() - (lastNonWhitespace + 1) ); else hdr = std::string_view(); // we just received whitespaces, wait for more if ( !hdr.size() ) { return ( size * nmemb ); } if ( zypp::strv::hasPrefixCI( hdr, "HTTP/" ) ) { long statuscode = 0; (void)curl_easy_getinfo( _easyHandle, CURLINFO_RESPONSE_CODE, &statuscode); const auto &doRangeFail = [&](){ WAR << _easyHandle << " " << "Range FAIL, trying with a smaller batch" << std::endl; setCode ( Code::RangeFail, "Expected range status code 206, but got none." ); // reset all ranges we requested to pending, we never got the data for them std::for_each( _requestedRanges.begin (), _requestedRanges.end(), []( auto &range ) { if ( range._rangeState == Running ) range._rangeState = Pending; }); return 0; }; // ignore other status codes, maybe we are redirected etc. if ( ( statuscode >= 200 && statuscode <= 299 && statuscode != 206 ) || statuscode == 416 ) { return doRangeFail(); } } else if ( zypp::strv::hasPrefixCI( hdr, "Content-Range:") ) { Range r; size_t fileLen = 0; if ( !parseContentRangeHeader( hdr, r._start, r._len, fileLen ) ) { //@TODO shouldn't we map this to a extra error? After all this is not our fault setCode( Code::InternalError, "Invalid Content-Range header format." ); return 0; } if ( !_reportedFileSize ) { WAR << "Setting request filesize to " << fileLen << std::endl; _reportedFileSize = fileLen; } DBG << _easyHandle << " " << "Got content range :" << r._start << " len " << r._len << std::endl; _gotContentRangeInfo = true; _currentSrvRange = std::move(r); } else if ( zypp::strv::hasPrefixCI( hdr, "Content-Type:") ) { std::string sep; if ( parseContentTypeMultiRangeHeader( hdr, sep ) ) { _gotContentRangeInfo = true; _isMuliPartResponse = true; _seperatorString = "--"+sep; } } } return _receiver.headerfunction( ptr, size * nmemb ); } size_t CurlMultiPartHandler::wrtcallback(char *ptr, size_t size, size_t nmemb) { const auto max = ( size * nmemb ); //it is valid to call this function with no data to write, just call the given handler if ( max == 0) return _receiver.writefunction( ptr, {}, max ); // try to consume all bytes that have been given to us size_t bytesConsumedSoFar = 0; while ( bytesConsumedSoFar != max ) { std::optional seekTo; // this is called after all headers have been processed if ( !_allHeadersReceived ) { _allHeadersReceived = true; // no ranges at all, this is a error if ( _protocolMode == ProtocolMode::HTTP && !_gotContentRangeInfo ) { //we got a invalid response, the status code pointed to being partial ( 206 ) but we got no range definition setCode( Code::ServerReturnedError, "Invalid data from server, range respone was announced but there was no range definiton." ); return 0; } } if ( _protocolMode == ProtocolMode::HTTP && _currentSrvRange && !_currentRange ) { /* this branch is responsible to find a range that overlaps the current server range, so we know which of our ranges to fill Entering here means we are in one of two situations: 1) we just have finished writing a requested range but still have not completely consumed a range that we have received from the server. Since HTTP std allows the server to coalesce requested ranges in order to optimize downloads we need to find the best match ( because the current offset might not even be in our requested ranges ) 2) we just parsed a Content-Length header and start a new block */ std::optional foundRange; const size_t beginSrvRange = _currentSrvRange->_start + _currentSrvRange->bytesWritten; const size_t endSrvRange = beginSrvRange + (_currentSrvRange->_len - _currentSrvRange->bytesWritten); auto currDist = ULONG_MAX; for ( uint i = 0; i < _requestedRanges.size(); i++ ) { const auto &currR = _requestedRanges[i]; // do not allow double ranges if ( currR._rangeState == Finished || currR._rangeState == Error ) continue; // check if the range was already written if ( currR._len && currR._len == currR.bytesWritten ) continue; const auto currRBegin = currR._start + currR.bytesWritten; if ( !( beginSrvRange <= currRBegin && endSrvRange >= currRBegin ) ) continue; // calculate the distance of the current ranges offset+data written to the range we got back from the server const auto newDist = currRBegin - beginSrvRange; // exact match if ( currRBegin == beginSrvRange && currR._len == _currentSrvRange->_len ) { foundRange = i; break; } if ( !foundRange ) { foundRange = i; currDist = newDist; } else { //pick the range with the closest distance if ( newDist < currDist ) { foundRange = i; currDist = newDist; } } } if ( !foundRange ) { // @TODO shouldn't we simply consume the rest of the range here and see if future data will contain a matchable range again? setCode( Code::InternalError, "Unable to find a matching range for data returned by the server."); return 0; } //set the found range as the current one _currentRange = *foundRange; //continue writing where we stopped seekTo = _requestedRanges[*foundRange]._start + _requestedRanges[*foundRange].bytesWritten; //if we skip bytes we need to advance our written bytecount const auto skipBytes = *seekTo - beginSrvRange; bytesConsumedSoFar += skipBytes; _currentSrvRange->bytesWritten += skipBytes; std::string errBuf = "Receiver cancelled starting the current range."; if ( !_receiver.beginRange (*_currentRange, errBuf) ) { setCode( Code::InternalError, "Receiver cancelled starting the current range."); return 0; } } else if ( _protocolMode != ProtocolMode::HTTP && !_currentRange ) { // if we are not running in HTTP mode we can only request a single range, that means we get our data // in one continous stream. Since our // ranges are ordered by start, we just pick the first one that is marked as running if ( !_currentRange ) { const auto i = std::find_if( _requestedRanges.begin (), _requestedRanges.end(), []( const Range &r){ return r._rangeState == Running; }); if ( i == _requestedRanges.end() ) { setCode( Code::InternalError, "Received data but no range was marked as requested." ); return 0; } _currentRange = std::distance( _requestedRanges.begin(), i ); //continue writing where we stopped seekTo = _requestedRanges[*_currentRange]._start + _requestedRanges[*_currentRange].bytesWritten; } } if ( _currentRange ) { /* * We have data to write and know the target range */ // make sure we do not read over the current server range auto availableData = max - bytesConsumedSoFar; if ( _currentSrvRange ) { availableData = std::min( availableData, _currentSrvRange->_len - _currentSrvRange->bytesWritten ); } auto &rng = _requestedRanges[*_currentRange]; // do only write what we need until the range is full const auto bytesToWrite = rng._len > 0 ? std::min( rng._len - rng.bytesWritten, availableData ) : availableData; auto written = _receiver.writefunction( ptr + bytesConsumedSoFar, seekTo, bytesToWrite ); if ( written <= 0 ) return 0; if ( rng._digest && rng._checksum.size() ) { if ( !rng._digest->update( ptr + bytesConsumedSoFar, written ) ) return 0; } rng.bytesWritten += written; if ( _currentSrvRange ) _currentSrvRange->bytesWritten += written; // range is done if ( rng._len > 0 && rng.bytesWritten >= rng._len ) { std::string errBuf = "Receiver cancelled after finishing the current range."; bool rngIsValid = validateRange( rng ); if ( !_receiver.finishedRange (*_currentRange, rngIsValid, errBuf) ) { setCode( Code::InternalError, "Receiver cancelled starting the current range."); return 0; } _currentRange.reset(); } if ( _currentSrvRange && _currentSrvRange->_len > 0 && _currentSrvRange->bytesWritten >= _currentSrvRange->_len ) { _currentSrvRange.reset(); // we ran out of data in the current chunk, reset the target range if it is not a open range as well, because next data will be // a chunk header again if ( _isMuliPartResponse ) _currentRange.reset(); } bytesConsumedSoFar += written; } if ( bytesConsumedSoFar == max ) return max; if ( _protocolMode == ProtocolMode::HTTP && !_currentRange && !_currentSrvRange ) { /* This branch is reponsible to parse the multibyte response we got from the server and parse the next target range from it */ std::string_view incoming( ptr + bytesConsumedSoFar, max - bytesConsumedSoFar ); auto hdrEnd = incoming.find("\r\n\r\n"); if ( hdrEnd == incoming.npos ) { //no header end in the data yet, push to buffer and return _rangePrefaceBuffer.insert( _rangePrefaceBuffer.end(), incoming.begin(), incoming.end() ); return max; } //append the data of the current header to the buffer and parse it _rangePrefaceBuffer.insert( _rangePrefaceBuffer.end(), incoming.begin(), incoming.begin() + ( hdrEnd + 4 ) ); bytesConsumedSoFar += ( hdrEnd + 4 ); //header data plus header end std::string_view data( _rangePrefaceBuffer.data(), _rangePrefaceBuffer.size() ); auto sepStrIndex = data.find( _seperatorString ); if ( sepStrIndex == data.npos ) { setCode( Code::InternalError, "Invalid multirange header format, seperator string missing." ); return 0; } auto startOfHeader = sepStrIndex + _seperatorString.length(); std::vector lines; zypp::strv::split( data.substr( startOfHeader ), "\r\n", zypp::strv::Trim::trim, [&]( std::string_view strv ) { lines.push_back(strv); } ); for ( const auto &hdrLine : lines ) { if ( zypp::strv::hasPrefixCI(hdrLine, "Content-Range:") ) { size_t fileLen = 0; Range r; //if we can not parse the header the message must be broken if(! parseContentRangeHeader( hdrLine, r._start, r._len, fileLen ) ) { setCode( Code::InternalError, "Invalid Content-Range header format." ); return 0; } if ( !_reportedFileSize ) { _reportedFileSize = fileLen; } _currentSrvRange = std::move(r); break; } } if ( !_currentSrvRange ){ setCode( Code::InternalError, "Could not read a server range from the response." ); return 0; } //clear the buffer again _rangePrefaceBuffer.clear(); } } return bytesConsumedSoFar; } void *CurlMultiPartHandler::easyHandle() const { return _easyHandle; } bool CurlMultiPartHandler::canRecover() const { // We can recover from RangeFail errors if we have more batch sizes to try // we never auto downgrade to last range set ( which is 1 ) because in that case // just downloading the full file is usually faster. if ( _lastCode == Code::RangeFail ) return ( _rangeAttemptIdx + 1 < ( _rangeAttemptSize - 1 ) ) && hasMoreWork(); return false; } bool CurlMultiPartHandler::hasMoreWork() const { // check if we have ranges that have never been requested return std::any_of( _requestedRanges.begin(), _requestedRanges.end(), []( const auto &range ){ return range._rangeState == Pending; }); } bool CurlMultiPartHandler::hasError() const { return _lastCode != Code::NoError; } CurlMultiPartHandler::Code CurlMultiPartHandler::lastError() const { return _lastCode; } const std::string &CurlMultiPartHandler::lastErrorMessage() const { return _lastErrorMsg; } bool CurlMultiPartHandler::prepareToContinue( ) { if ( hasMoreWork() ) { // go to the next range batch level if we are restarted due to a failed range request if ( _lastCode == Code::RangeFail ) { if ( _rangeAttemptIdx + 1 >= _rangeAttemptSize ) { setCode ( Code::RangeFail, "No more range batch sizes available", true ); return false; } _rangeAttemptIdx++; } return true; } setCode ( Code::NoError, "Request has no more work", true ); return false; } void CurlMultiPartHandler::finalize() { // if we still have a current range set it valid by checking the checksum if ( _currentRange ) { auto &currR = _requestedRanges[*_currentRange]; std::string errBuf; bool rngIsValid = validateRange( currR ); _receiver.finishedRange (*_currentRange, rngIsValid, errBuf); _currentRange.reset(); } } bool CurlMultiPartHandler::verifyData() { finalize(); for ( auto &r : _requestedRanges ) { if ( r._rangeState != CurlMultiPartHandler::Finished ) { if ( r._len > 0 && r.bytesWritten != r._len ) setCode( Code::MissingData, (zypp::str::Format("Did not receive all requested data from the server ( off: %1%, req: %2%, recv: %3% ).") % r._start % r._len % r.bytesWritten ) ); else if ( r._digest && r._checksum.size() && !checkIfRangeChkSumIsValid(r) ) { setCode( Code::InvalidChecksum, (zypp::str::Format("Invalid checksum %1%, expected checksum %2%") % r._digest->digest() % zypp::Digest::digestVectorToString( r._checksum ) ) ); } else { setCode( Code::InternalError, (zypp::str::Format("Download of block failed.") ) ); } //we only report the first error break; } } return ( _lastCode == Code::NoError ); } bool CurlMultiPartHandler::prepare( ) { _lastCode = Code::NoError; _lastErrorMsg.clear(); _seperatorString.clear(); _currentSrvRange.reset(); _reportedFileSize.reset(); _gotContentRangeInfo = false; _allHeadersReceived = false; _isMuliPartResponse = false; if ( _requestedRanges.size() == 0 ) { setCode( Code::InternalError, "Calling the CurlMultiPartHandler::prepare function without a range to download is not supported."); return false; } const auto setCurlOption = [&]( CURLoption opt, auto &&data ) { auto ret = curl_easy_setopt( _easyHandle, opt, data ); if ( ret != 0 ) { throw CurlMultiPartSetoptError(ret); } }; try { setCurlOption( CURLOPT_HEADERFUNCTION, CurlMultiPartHandler::curl_hdrcallback ); setCurlOption( CURLOPT_HEADERDATA, this ); setCurlOption( CURLOPT_WRITEFUNCTION, CurlMultiPartHandler::curl_wrtcallback ); setCurlOption( CURLOPT_WRITEDATA, this ); std::string rangeDesc; uint rangesAdded = 0; auto maxRanges = _rangeAttempt[_rangeAttemptIdx]; // helper function to build up the request string for the range auto addRangeString = [ &rangeDesc, &rangesAdded ]( const std::pair &range ) { std::string rangeD = zypp::str::form("%llu-", static_cast( range.first ) ); if( range.second > 0 ) rangeD.append( zypp::str::form( "%llu", static_cast( range.second ) ) ); if ( rangeDesc.size() ) rangeDesc.append(",").append( rangeD ); else rangeDesc = std::move( rangeD ); rangesAdded++; }; std::optional> currentZippedRange; bool closedRange = true; for ( auto &range : _requestedRanges ) { if ( range._rangeState != Pending ) continue; //reset the download results range.bytesWritten = 0; //when we have a open range in the list of ranges we will get from start of range to end of file, //all following ranges would never be marked as valid, so we have to fail early if ( !closedRange ) throw CurlMultInitRangeError("It is not supported to request more ranges after a open range."); const auto rangeEnd = range._len > 0 ? range._start + range._len - 1 : 0; closedRange = (rangeEnd > 0); bool added = false; // we try to compress the requested ranges into as big chunks as possible for the request, // when receiving we still track the original ranges so we can collect and test their checksums if ( !currentZippedRange ) { added = true; currentZippedRange = std::make_pair( range._start, rangeEnd ); } else { //range is directly consecutive to the previous range if ( currentZippedRange->second + 1 == range._start ) { added = true; currentZippedRange->second = rangeEnd; } else { //this range does not directly follow the previous one, we build the string and start a new one if ( rangesAdded +1 >= maxRanges ) break; added = true; addRangeString( *currentZippedRange ); currentZippedRange = std::make_pair( range._start, rangeEnd ); } } // remember range was already requested if ( added ) { setRangeState( range, Running ); range.bytesWritten = 0; if ( range._digest ) range._digest->reset(); } if ( rangesAdded >= maxRanges ) { MIL << _easyHandle << " " << "Reached max nr of ranges (" << maxRanges << "), batching the request to not break the server" << std::endl; break; } } // add the last range too if ( currentZippedRange ) addRangeString( *currentZippedRange ); MIL << _easyHandle << " " << "Requesting Ranges: " << rangeDesc << std::endl; setCurlOption( CURLOPT_RANGE, rangeDesc.c_str() ); } catch( const CurlMultiPartSetoptError &err ) { setCode( Code::InternalError, "" ); } catch( const CurlMultInitRangeError &err ) { setCode( Code::InternalError, err.asUserString() ); } catch( const zypp::Exception &err ) { setCode( Code::InternalError, err.asUserString() ); } catch( const std::exception &err ) { setCode( Code::InternalError, zypp::str::asString(err.what()) ); } return ( _lastCode == Code::NoError ); } void CurlMultiPartHandler::setCode(Code c, std::string msg , bool force) { // never overwrite a error, this is reset when we restart if ( _lastCode != Code::NoError && !force ) return; _lastCode = c; _lastErrorMsg = std::move(msg); _receiver.notifyErrorCodeChanged(); } bool CurlMultiPartHandler::parseContentRangeHeader( const std::string_view &line, size_t &start, size_t &len, size_t &fileLen ) { //content-range: bytes 10485760-19147879/19147880 static const zypp::str::regex regex("^Content-Range:[[:space:]]+bytes[[:space:]]+([0-9]+)-([0-9]+)\\/([0-9]+)$", zypp::str::regex::rxdefault | zypp::str::regex::icase ); zypp::str::smatch what; if( !zypp::str::regex_match( std::string(line), what, regex ) || what.size() != 4 ) { DBG << _easyHandle << " " << "Invalid Content-Range Header format: '" << std::string(line) << std::endl; return false; } size_t s = zypp::str::strtonum( what[1]); size_t e = zypp::str::strtonum( what[2]); fileLen = zypp::str::strtonum( what[3]); start = s; len = ( e - s ) + 1; return true; } bool CurlMultiPartHandler::parseContentTypeMultiRangeHeader( const std::string_view &line, std::string &boundary ) { static const zypp::str::regex regex("^Content-Type:[[:space:]]+multipart\\/byteranges;[[:space:]]+boundary=(.*)$", zypp::str::regex::rxdefault | zypp::str::regex::icase ); zypp::str::smatch what; if( zypp::str::regex_match( std::string(line), what, regex ) ) { if ( what.size() >= 2 ) { boundary = what[1]; return true; } } return false; } bool CurlMultiPartHandler::validateRange( Range &rng ) { if ( rng._digest && rng._checksum.size() ) { if ( ( rng._len == 0 || rng.bytesWritten == rng._len ) && checkIfRangeChkSumIsValid(rng) ) setRangeState(rng, Finished); else setRangeState(rng, Error); } else { if ( rng._len == 0 ? true : rng.bytesWritten == rng._len ) setRangeState(rng, Finished); else setRangeState(rng, Error); } return ( rng._rangeState == Finished ); } bool CurlMultiPartHandler::checkIfRangeChkSumIsValid ( Range &rng ) { if ( rng._digest && rng._checksum.size() ) { auto bytesHashed = rng._digest->bytesHashed (); if ( rng._chksumPad && *rng._chksumPad > bytesHashed ) { MIL_MEDIA << _easyHandle << " " << "Padding the digest to required block size" << std::endl; zypp::ByteArray padding( *rng._chksumPad - bytesHashed, '\0' ); rng._digest->update( padding.data(), padding.size() ); } auto digVec = rng._digest->digestVector(); if ( rng._relevantDigestLen ) { digVec.resize( *rng._relevantDigestLen ); } return ( digVec == rng._checksum ); } // no checksum required return true; } void CurlMultiPartHandler::setRangeState( Range &rng, State state ) { if ( rng._rangeState != state ) { rng._rangeState = state; } } std::optional CurlMultiPartHandler::currentRange() const { return _currentRange; } std::optional CurlMultiPartHandler::reportedFileSize() const { return _reportedFileSize; } } // namespace zyppng libzypp-17.36.5/zypp-curl/ng/network/curlmultiparthandler.h000066400000000000000000000163721476576476200241070ustar00rootroot00000000000000#ifndef ZYPPNG_CURLMULTIPARTHANDLER_H #define ZYPPNG_CURLMULTIPARTHANDLER_H #include #include #include #include #include #include #include #include namespace zyppng { /*! * Data receiver interface for the \ref CurlMultiPartHandler class. */ class CurlMultiPartDataReceiver { public: virtual ~CurlMultiPartDataReceiver() = default; /*! * Called for all received header data, after it was processed by the \ref CurlMultiPartHandler. */ virtual size_t headerfunction ( char *ptr, size_t bytes ) = 0; /*! * Data callback func, this is called whenever there is actual data to be written to the file. * If \a offset is set, usually when starting to write a new range, it means to continue to write on the current file pointer position, otherwise * seek to the given one. */ virtual size_t writefunction ( char *ptr, std::optional offset, size_t bytes ) = 0; /*! * Called everytime a new range is about to be written, returning false from the * function will immediately cancel the request and not write anything to the file. * * @param range The index of the range that is to be started * @param cancelReason Set to indicate why the request was cancelled. */ virtual bool beginRange ( off_t range, std::string &cancelReason ) { return true; }; /*! * Called everytime a range was finished, returning false from the function will cancel the request. * * \note Normally \ref CurlMultiPartHandler will try to finish all ranges before failing even if one of them * can not be validated. If the code should cancel early do it via returning false here. * * @param range The index of the range that was finished * @param validated Indicates of the range data could be validated against its given checksum * @param cancelReason Set to indicate why the request was cancelled. */ virtual bool finishedRange ( off_t range, bool validated, std::string &cancelReason ) { return true; }; /*! * Called everytime the error code changes, this is just to notify that a error was set */ virtual void notifyErrorCodeChanged () {}; }; /*! * \brief The CurlMultiPartHandler class * * multirange support for HTTP requests (https://tools.ietf.org/html/rfc7233), if not operating * on a HTTP/HTTPS URL this will batch multirange requests one by one, so maybe don't use it there * */ class CurlMultiPartHandler : public Base { public: enum class ProtocolMode{ Basic, //< use this mode if no special checks are required in header or write callbacks HTTP //< this mode is used for HTTP and HTTPS downloads }; // when requesting ranges from the server, we need to make sure not to request // too many at the same time. Instead we batch our requests and reuse the open // connection until we have the full file. // However different server have different maximum nr of ranges, so we start with // a high number and decrease until we find a rangecount that works constexpr static unsigned _rangeAttempt[] = { 255, 127, 63, 15, 5, 1 }; constexpr static unsigned _rangeAttemptSize = ( sizeof( _rangeAttempt ) / sizeof(unsigned) ); enum State { Pending, //< waiting to be dispatched Running, //< currently running Finished, //< finished successfully Error, //< Error, use error function to figure out the issue }; using CheckSumBytes = UByteArray; using Code = NetworkRequestError::Type; struct Range : public RangeDesc { Range( ) = default; Range( RangeDesc &&rd, std::optional dig, std::any userD, State rangeState = State::Pending ); size_t bytesWritten = 0; /** * Enables automated checking of downloaded contents against a checksum. */ std::optional _digest = {}; //< zypp::Digest that is updated when data is written, can be used to validate the file contents with a checksum std::any userData; //< Custom data the user can associate with the Range State _rangeState = State::Pending; //< Flag to know if this range has been already requested and if the request was successful void restart(); Range clone() const; static Range make ( size_t start, size_t len = 0, std::optional &&digest = {}, CheckSumBytes &&expectedChkSum = CheckSumBytes(), std::any &&userData = std::any(), std::optional digestCompareLen = {}, std::optional _dataBlockPadding = {} ); }; CurlMultiPartHandler( ProtocolMode mode, void *easyHandle, std::vector &ranges, CurlMultiPartDataReceiver &receiver ); ~CurlMultiPartHandler() override; void *easyHandle() const; bool canRecover() const; bool hasMoreWork() const; bool hasError() const; Code lastError() const; const std::string &lastErrorMessage() const; bool validateRange(Range &rng); bool prepare( ); bool prepareToContinue( ); void finalize( ); bool verifyData( ); std::optional reportedFileSize() const; std::optional currentRange() const; private: void setCode ( Code c, std::string msg, bool force = false ); static size_t curl_hdrcallback ( char *ptr, size_t size, size_t nmemb, void *userdata ); static size_t curl_wrtcallback ( char *ptr, size_t size, size_t nmemb, void *userdata ); size_t hdrcallback ( char *ptr, size_t size, size_t nmemb ); size_t wrtcallback ( char *ptr, size_t size, size_t nmemb ); bool parseContentRangeHeader(const std::string_view &line, size_t &start, size_t &len, size_t &fileLen); bool parseContentTypeMultiRangeHeader(const std::string_view &line, std::string &boundary); bool checkIfRangeChkSumIsValid( Range &rng ); void setRangeState ( Range &rng, State state ); ProtocolMode _protocolMode = ProtocolMode::HTTP; void *_easyHandle = nullptr; CurlMultiPartDataReceiver &_receiver; Code _lastCode = Code::NoError; std::string _lastErrorMsg; bool _allHeadersReceived = false; //< set to true once writefunc was called once e.g. all headers have been received bool _gotContentRangeInfo = false; //< Set to true if the server indicates ranges bool _isMuliPartResponse = false; //< Set to true if the respone is in multipart form std::string _seperatorString; ///< The seperator string for multipart responses as defined in RFC 7233 Section 4.1 std::vector _rangePrefaceBuffer; ///< Here we buffer std::optional _currentRange; std::optional _currentSrvRange; std::optional _reportedFileSize; ///< Filesize as reported by the content range or byte range headers unsigned _rangeAttemptIdx = 0; std::vector &_requestedRanges; ///< the requested ranges that need to be downloaded }; } // namespace zyppng #endif // ZYPPNG_CURLMULTIPARTHANDLER_H libzypp-17.36.5/zypp-curl/ng/network/networkrequestdispatcher.cc000066400000000000000000000447111476576476200251470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace boost; L_ENV_CONSTR_DEFINE_FUNC(ZYPP_MEDIA_CURL_DEBUG) namespace zyppng { static const std::string & defaultAgentString() { // we need to add the release and identifier to the // agent string. // The target could be not initialized, and then this information // is guessed. static const std::string _value( zypp::str::form( "ZYpp " LIBZYPP_VERSION_STRING " (curl %s)" , curl_version_info(CURLVERSION_NOW)->version ) ); return _value; } NetworkRequestDispatcherPrivate::NetworkRequestDispatcherPrivate( NetworkRequestDispatcher &p ) : BasePrivate( p ) , _timer( Timer::create() ) , _multi ( curl_multi_init() ) , _userAgent( defaultAgentString() ) { ::internal::globalInitCurlOnce(); curl_multi_setopt( _multi, CURLMOPT_TIMERFUNCTION, NetworkRequestDispatcherPrivate::multi_timer_cb ); curl_multi_setopt( _multi, CURLMOPT_TIMERDATA, reinterpret_cast( this ) ); curl_multi_setopt( _multi, CURLMOPT_SOCKETFUNCTION, NetworkRequestDispatcherPrivate::static_socket_callback ); curl_multi_setopt( _multi, CURLMOPT_SOCKETDATA, reinterpret_cast( this ) ); // disabled explicit pipelining since it breaks our tests on releases < 15.2 // we could consider enabling it starting with a specific CURL version // curl_multi_setopt( _multi, CURLMOPT_PIPELINING, CURLPIPE_MULTIPLEX|CURLPIPE_HTTP1 ); _timer->setSingleShot( true ); _timer->connect( &Timer::sigExpired, *this, &NetworkRequestDispatcherPrivate::multiTimerTimout ); } NetworkRequestDispatcherPrivate::~NetworkRequestDispatcherPrivate() { cancelAll( NetworkRequestErrorPrivate::customError( NetworkRequestError::Cancelled, "Dispatcher shutdown" ) ); curl_multi_cleanup( _multi ); } //called by curl to setup a timer int NetworkRequestDispatcherPrivate::multi_timer_cb( CURLM *, long timeout_ms, void *thatPtr ) { NetworkRequestDispatcherPrivate *that = reinterpret_cast( thatPtr ); assert( that != nullptr ); if ( timeout_ms >= 0 ) { that->_timer->start( static_cast(timeout_ms) ); } else { //cancel the timer that->_timer->stop(); } return 0; } void NetworkRequestDispatcherPrivate::multiTimerTimout(const Timer &) { handleMultiSocketAction( CURL_SOCKET_TIMEOUT, 0 ); } int NetworkRequestDispatcherPrivate::static_socket_callback(CURL * easy, curl_socket_t s, int what, void *userp, SocketNotifier *socketp ) { NetworkRequestDispatcherPrivate *that = reinterpret_cast( userp ); assert( that != nullptr ); return that->socketCallback( easy, s, what, socketp ); } int NetworkRequestDispatcherPrivate::socketCallback(CURL *easy, curl_socket_t s, int what, void * ) { std::shared_ptr socketp; if ( _socketHandler.count( s ) == 0 ) { if ( what == CURL_POLL_REMOVE || what == CURL_POLL_NONE ) return 0; socketp = SocketNotifier::create( s, SocketNotifier::Read, false ); _socketHandler.insert( std::make_pair( s, socketp ) ); socketp->connect( &SocketNotifier::sigActivated, *this, &NetworkRequestDispatcherPrivate::onSocketActivated ); } else { socketp = _socketHandler[s]; } //should never happen if ( !socketp ) { if ( what == CURL_POLL_REMOVE || what == CURL_POLL_NONE ) return 0; if ( _socketHandler.count( s ) > 0 ) _socketHandler.erase( s ); void *privatePtr = nullptr; if ( curl_easy_getinfo( easy, CURLINFO_PRIVATE, &privatePtr ) != CURLE_OK ) { privatePtr = nullptr; //make sure this was not filled with bad info } if ( privatePtr ) { NetworkRequestPrivate *request = reinterpret_cast( privatePtr ); //we stop the download, if we can not listen for socket changes we can not correctly do anything setFinished( *request->z_func(), NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Unable to assign socket listener." ) ); return 0; } else { //a broken handle without anything assigned, also should never happen but make sure and clean it up WAR << "Cleaning up unassigned easy handle" << std::endl; curl_multi_remove_handle( _multi, easy ); curl_easy_cleanup( easy ); return 0; } } //remove the socket if ( what == CURL_POLL_REMOVE ) { socketp->setEnabled( false ); _socketHandler.erase( s ); return 0; } if ( what == CURL_POLL_IN ) { socketp->setMode( SocketNotifier::Read ); } else if ( what == CURL_POLL_OUT ) { socketp->setMode( SocketNotifier::Write ); } else if ( what == CURL_POLL_INOUT ) { socketp->setMode( SocketNotifier::Read | SocketNotifier::Write ); } socketp->setEnabled(); return 0; } void NetworkRequestDispatcherPrivate::onSocketActivated( const SocketNotifier &listener, int events ) { int evBitmask = 0; if ( (events & SocketNotifier::Read) == SocketNotifier::Read ) evBitmask |= CURL_CSELECT_IN; if ( (events & SocketNotifier::Write) == SocketNotifier::Write ) evBitmask |= CURL_CSELECT_OUT; if ( (events & SocketNotifier::Error) == SocketNotifier::Error ) evBitmask |= CURL_CSELECT_ERR; handleMultiSocketAction( listener.socket(), evBitmask ); } void NetworkRequestDispatcherPrivate::handleMultiSocketAction(curl_socket_t nativeSocket, int evBitmask) { int running = 0; // when inside a curl callback we can not call another multi curl API, // for now just lock the thing, but we should consider rewriting this // to post events instead of doing direct calls simply to decouple from // that limitation CURLMcode rc = CURLM_OK; { zypp::DtorReset lockSet( _locked ); _locked = true; rc = curl_multi_socket_action( _multi, nativeSocket, evBitmask, &running ); } if (rc != 0) { //we can not recover from a error like that, cancel all and stop NetworkRequestError err = NetworkRequestErrorPrivate::fromCurlMError( rc ); cancelAll( err ); //emit error _lastError = err; _sigError.emit( *z_func() ); return; } // make sure we dequeue pending requests ( in case a call to dequeue was blocked during the API call ) zypp::OnScopeExit scopeFinally([this](){ this->dequeuePending(); }); int msgs_left = 0; CURLMsg *msg = nullptr; while( (msg = curl_multi_info_read( _multi, &msgs_left )) ) { if(msg->msg == CURLMSG_DONE) { CURL *easy = msg->easy_handle; CURLcode res = msg->data.result; void *privatePtr = nullptr; if ( curl_easy_getinfo( easy, CURLINFO_PRIVATE, &privatePtr ) != CURLE_OK ) { WAR << "Unable to get CURLINFO_PRIVATE" << std::endl; continue; } if ( !privatePtr ) { //broken easy handle not associated, should never happen but clean it up WAR << "Cleaning up unassigned easy handle" << std::endl; curl_multi_remove_handle( _multi, easy ); curl_easy_cleanup( easy ); continue; } NetworkRequestPrivate *request = reinterpret_cast( privatePtr ); request->dequeueNotify(); if ( request->hasMoreWork() && ( res == CURLE_OK || request->canRecover() ) ) { std::string errBuf = "Broken easy handle in request"; if ( !request->_easyHandle ) { NetworkRequestError e = NetworkRequestErrorPrivate::customError ( NetworkRequestError::InternalError, std::move(errBuf) ); setFinished( *request->z_func(), e ); continue; } // remove the handle from multi to change options curl_multi_remove_handle( _multi, request->_easyHandle ); errBuf = "Failed to reinitialize the request"; if ( !request->prepareToContinue ( errBuf ) ) { NetworkRequestError e = NetworkRequestErrorPrivate::customError ( NetworkRequestError::InternalError, std::move(errBuf) ); setFinished( *request->z_func(), e ); } else { // add the request back to the multi handle, it is not done if ( !addRequestToMultiHandle( *request->z_func() ) ) continue; request->aboutToStart( ); } } else { // trigger notification about file downloaded // we create a error from the CURL code, there might be a already cached Result which will be used instead // in cases like a RangeFail where we could not recover but there also is no real error code NetworkRequestError e = NetworkRequestErrorPrivate::fromCurlError( *request->z_func(), res, request->errorMessage() ); setFinished( *request->z_func(), e ); } //attention request could be deleted from here on } } } void NetworkRequestDispatcherPrivate::cancelAll( const NetworkRequestError& result ) { //prevent dequeuePending from filling up the runningDownloads again zypp::DtorReset lockReset( _locked ); _locked = true; while ( _runningDownloads.size() ) { std::shared_ptr &req = _runningDownloads.back(); setFinished(*req, result ); } while ( _pendingDownloads.size() ) { std::shared_ptr &req = _pendingDownloads.back(); setFinished(*req, result ); } } void NetworkRequestDispatcherPrivate::setFinished( NetworkRequest &req, NetworkRequestError result ) { auto delReq = []( auto &list, NetworkRequest &req ) -> std::shared_ptr { auto it = std::find_if( list.begin(), list.end(), [ &req ]( const std::shared_ptr &r ) { return req.d_func() == r->d_func(); } ); if ( it != list.end() ) { auto ptr = *it; list.erase( it ); return ptr; } return nullptr; }; // We have a tricky situation if a network request is called when inside a callback. In those cases, it is // not allowed to call curl_multi_remove_handle. We need to tell the callback to fail, so the download // is cancelled by curl itself. We also need to store the current result for later auto rmode = std::get_if( &req.d_func()->_runningMode ); if ( rmode ) { if ( rmode->_isInCallback ) { // the first cached result wins) if ( !rmode->_cachedResult ) rmode->_cachedResult = result; return; } else if ( rmode->_cachedResult ) { result = rmode->_cachedResult.value(); } } auto rLocked = delReq( _runningDownloads, req ); if ( !rLocked ) rLocked = delReq( _pendingDownloads, req ); void *easyHandle = req.d_func()->_easyHandle; if ( easyHandle ) curl_multi_remove_handle( _multi, easyHandle ); req.d_func()->_dispatcher = nullptr; //first set the result, the Request might have a checksum to check as well so a currently //successful request could fail later on req.d_func()->setResult( std::move(result) ); _sigDownloadFinished.emit( *z_func(), req ); //we got a open slot, try to dequeue or send the finished signals if all queues are empty dequeuePending(); } bool NetworkRequestDispatcherPrivate::addRequestToMultiHandle(NetworkRequest &req) { CURLMcode rc = curl_multi_add_handle( _multi, req.d_func()->_easyHandle ); if ( rc != 0 ) { setFinished( req, NetworkRequestErrorPrivate::fromCurlMError( rc ) ); return false; } // make sure to wake up once to register what we have now _timer->start(0); return true; } void NetworkRequestDispatcherPrivate::dequeuePending() { if ( !_isRunning || _locked ) return; while ( _maxConnections == -1 || ( (std::size_t)_maxConnections > _runningDownloads.size() ) ) { if ( !_pendingDownloads.size() ) break; std::shared_ptr req = std::move( _pendingDownloads.front() ); _pendingDownloads.pop_front(); std::string errBuf = "Failed to initialize easy handle"; if ( !req->d_func()->initialize( errBuf ) ) { //@TODO store the CURL error in the errors extra info setFinished( *req, NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, std::move(errBuf) ) ); continue; } if ( !addRequestToMultiHandle( *req ) ) continue; req->d_func()->aboutToStart(); _sigDownloadStarted.emit( *z_func(), *req ); _runningDownloads.push_back( std::move(req) ); } //check for empty queues if ( _pendingDownloads.size() == 0 && _runningDownloads.size() == 0 ) { //once we finished all requests, cancel the timer too, so curl is not called without requests _timer->stop(); _sigQueueFinished.emit( *z_func() ); } } ZYPP_IMPL_PRIVATE(NetworkRequestDispatcher) NetworkRequestDispatcher::NetworkRequestDispatcher( ) : Base( * new NetworkRequestDispatcherPrivate ( *this ) ) { } bool NetworkRequestDispatcher::supportsProtocol( const Url &url ) { curl_version_info_data *curl_info = nullptr; curl_info = curl_version_info(CURLVERSION_NOW); // curl_info does not need any free (is static) if (curl_info->protocols) { const char * const *proto = nullptr; std::string scheme( url.getScheme() ); bool found = false; for(proto=curl_info->protocols; !found && *proto; ++proto) { if( scheme == std::string((const char *)*proto)) found = true; } return found; } return true; } void NetworkRequestDispatcher::setMaximumConcurrentConnections( const int maxConn ) { d_func()->_maxConnections = maxConn; } int NetworkRequestDispatcher::maximumConcurrentConnections () const { return d_func()->_maxConnections; } void NetworkRequestDispatcher::enqueue(const std::shared_ptr &req ) { if ( !req ) return; Z_D(); if ( std::find( d->_runningDownloads.begin(), d->_runningDownloads.end(), req ) != d->_runningDownloads.end() ) { WAR << "Ignoring request to enqueue download " << req->url().asString() << " request is already running " << std::endl; return; } if ( std::find( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), req ) != d->_pendingDownloads.end() ) { WAR << "Ignoring request to enqueue download " << req->url().asString() << " request is already enqueued " << std::endl; return; } req->d_func()->_dispatcher = this; if ( req->priority() == NetworkRequest::Normal ) d->_pendingDownloads.push_back( req ); else { auto it = std::find_if( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), [ prio = req->priority() ]( const auto &pendingReq ){ return pendingReq->priority() < prio; }); //if we have a valid iterator, decrement we found a pending download request with lower prio, insert before that if ( it != d->_pendingDownloads.end() && it != d->_pendingDownloads.begin() ) it--; d->_pendingDownloads.insert( it, req ); } //dequeue if running and we have capacity d->dequeuePending(); } void NetworkRequestDispatcher::setAgentString( const std::string &agent ) { Z_D(); if ( agent.empty() ) d->_userAgent = defaultAgentString(); else d->_userAgent = agent; } const std::string &NetworkRequestDispatcher::agentString() const { return d_func()->_userAgent; } void NetworkRequestDispatcher::setHostSpecificHeader( const std::string &host, const std::string &headerName, const std::string &value ) { Z_D(); if ( value.empty() ) { if ( auto i = d->_customHeaders.find( host ); i != d->_customHeaders.end() ) { if ( auto v = i->second.find( headerName ); v != i->second.end() ) { i->second.erase (v); } if ( i->second.empty() ) d->_customHeaders.erase(i); } return; } d->_customHeaders[host][headerName] = value; } const NetworkRequestDispatcher::SpecificHeaderMap &NetworkRequestDispatcher::hostSpecificHeaders() const { return d_func()->_customHeaders; } void NetworkRequestDispatcher::cancel( NetworkRequest &req, std::string reason ) { cancel( req, NetworkRequestErrorPrivate::customError( NetworkRequestError::Cancelled, reason.size() ? std::move(reason) : "Request explicitly cancelled" ) ); } void NetworkRequestDispatcher::cancel(NetworkRequest &req, const NetworkRequestError &err) { Z_D(); if ( req.d_func()->_dispatcher != this ) { //TODO throw exception return; } d->setFinished( req, err ); } void NetworkRequestDispatcher::cancelAll(std::string reason) { cancelAll( NetworkRequestErrorPrivate::customError( NetworkRequestError::Cancelled, reason.size() ? std::move(reason) : "Request explicitly cancelled" ) ); } void NetworkRequestDispatcher::cancelAll(const NetworkRequestError &err) { d_func()->cancelAll ( err ); } void NetworkRequestDispatcher::run() { Z_D(); d->_isRunning = true; if ( d->_pendingDownloads.size() ) d->dequeuePending(); } void NetworkRequestDispatcher::reschedule() { Z_D(); if ( !d->_pendingDownloads.size() ) return; std::stable_sort( d->_pendingDownloads.begin(), d->_pendingDownloads.end(), []( const auto &a, const auto &b ){ return a->priority() < b->priority(); }); d->dequeuePending(); } size_t NetworkRequestDispatcher::count() { Z_D(); return d->_pendingDownloads.size() + d->_runningDownloads.size(); } const zyppng::NetworkRequestError &NetworkRequestDispatcher::lastError() const { return d_func()->_lastError; } SignalProxy NetworkRequestDispatcher::sigDownloadStarted() { return d_func()->_sigDownloadStarted; } SignalProxy NetworkRequestDispatcher::sigDownloadFinished() { return d_func()->_sigDownloadFinished; } SignalProxy NetworkRequestDispatcher::sigQueueFinished() { return d_func()->_sigQueueFinished; } SignalProxy NetworkRequestDispatcher::sigError() { return d_func()->_sigError; } } libzypp-17.36.5/zypp-curl/ng/network/networkrequestdispatcher.h000066400000000000000000000156761476576476200250210ustar00rootroot00000000000000#ifndef ZYPP_NG_MEDIA_CURL_CURL_H_INCLUDED #define ZYPP_NG_MEDIA_CURL_CURL_H_INCLUDED #include #include #include #include #include #include #include namespace zyppng { class NetworkRequestDispatcherPrivate; class NetworkRequest; /*! * The NetworkRequestDispatcher class is used to run multiple NetworkRequest instances * at the same time, making full use of the event loop. * * Dispatching is implemented using a internal priority queue, all requests in the * queue are set to waiting. Once a request is dequeued it is initialized and started * right away. Its possible to change the maximum number of concurrent connections to control * the load on the network. * * \code * zyppng::EventLoop::Ptr loop = zyppng::EventLoop::create(); * zyppng::NetworkRequestDispatcher downloader; * * zypp::Url url ( "https://download.opensuse.org/distribution/leap/15.0/repo/oss/x86_64/0ad-0.0.22-lp150.2.10.x86_64.rpm" ); * zypp::Pathname target("/tmp/0ad-0.0.22-lp150.2.10.x86_64.rpm"); * * std::shared_ptr req = std::make_shared( zypp::Url(url), target ); * * std::shared_ptr dig = std::make_shared(); * if ( !dig->create( zypp::Digest::md5() ) ) { * std::cerr << "Unable to create Digest " << std::endl; * return 1; * } * * req->setDigest( dig ); * req->setExpectedChecksum( hexstr2bytes("11822f1421ae50fb1a07f72220b79000") ); * * req->sigStarted().connect( [] ( const zyppng::NetworkRequest &r ){ * std::cout << r.url() << " started downloading " << std::endl; * }); * * req->sigFinished().connect( [] ( const zyppng::NetworkRequest &r, const zyppng::NetworkRequestError &err ){ * if ( err.isError() ) { * std::cout << r.url() << " finsihed with err " << err.nativeErrorString() << " : "<< err.isError() << " : " << err.toString() << std::endl; * } else { * std::cout << r.url() << " finished downloading " << std::endl; * } * }); * * req->sigProgress().connect( [] ( const zyppng::NetworkRequest &r, off_t dltotal, off_t dlnow, off_t ultotal, off_t ulnow ){ * std::cout << r.url() << " at: " << std::endl * << "dltotal: "<< dltotal<< std::endl * << "dlnow: "<< dlnow<< std::endl * << "ultotal: "<< ultotal<< std::endl * << "ulnow: "<< ulnow<< std::endl; * }); * * downloader.enqueue( req ); * * downloader.sigQueueFinished().connect( [ &loop ]( const zyppng::NetworkRequestDispatcher & ) { * loop->quit(); * }); * * downloader.run( ); * loop->run(); * \code * * \sa zyppng::Downloader */ class LIBZYPP_NG_EXPORT NetworkRequestDispatcher : public Base { ZYPP_DECLARE_PRIVATE(NetworkRequestDispatcher) public: using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; NetworkRequestDispatcher ( ); /*! * Returns true if the protocol used in the Url scheme is supported by * the dispatcher backend */ static bool supportsProtocol ( const Url &url ); /*! * Change the number of the concurrently started requests, the default is 10. * Setting this to -1 means there is no limit. */ void setMaximumConcurrentConnections ( const int maxConn ); /** * returns the maximum number of allowed concurrent connections */ int maximumConcurrentConnections () const; /*! * Enqueues a new \a request and puts it into the waiting queue. If the dispatcher * is already running and has free capacatly the request might be started right away */ void enqueue ( const std::shared_ptr &req ); /*! * Changes the agent header valur to \a agent. */ void setAgentString ( const std::string &agent ); /*! * Returns the currenty set agent string */ const std::string &agentString () const; /*! * Adds a header to each request to a specific host, this is used to send * anonymous statistics to download.opensuse.org. * Setting a host/headerName combination to a empty string removes the header from being send again. * * \note This will add the header to ALL requests that match the given host, for more fine grained control use \ref TransferSettings * \note is empty by default */ void setHostSpecificHeader ( const std::string &host, const std::string &headerName, const std::string &value ); using SpecificHeaderMap = std::unordered_map< std::string, std::unordered_map>; /*! * Returns the currenty set host specific headers */ const SpecificHeaderMap &hostSpecificHeaders() const; /*! * Cancels the request \a req setting the error description to \a reason. */ void cancel ( NetworkRequest &req , std::string reason = std::string() ); /*! * Cancels the request \a req setting the error to \a err. */ void cancel ( NetworkRequest &req , const NetworkRequestError &err ); /*! * Cancels all requests \a req setting the error description to \a reason. */ void cancelAll ( std::string reason = std::string() ); /*! * Cancels all requests \a req setting the error to \a err. */ void cancelAll ( const NetworkRequestError &err ); /*! * Start dispatching requests, this needs to be done explicitly before any request can be executed. */ void run ( ); /*! * Reschedule enqueued requests based on their priorities */ void reschedule (); /*! * Returns the number of requests in the running and waiting queues */ size_t count (); /*! * Returns the last encountered error in a request. */ const NetworkRequestError &lastError() const; /*! * Signal is emitted when a download is started */ SignalProxy sigDownloadStarted(); /*! * Emitted when a request was finished, check the request to see if it was successful */ SignalProxy sigDownloadFinished(); /*! * Emitted when the internal request queue is completely processed and all requests are finished. */ SignalProxy sigQueueFinished (); /*! * Emitted when there is a error in the backend the dispatcher can not recover from. All requests are cancelled * use \a lastError to get more information. */ SignalProxy sigError (); }; } #endif libzypp-17.36.5/zypp-curl/ng/network/networkrequesterror.cc000066400000000000000000000267351476576476200241600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include namespace zyppng { ZYPP_IMPL_PRIVATE(NetworkRequestError); constexpr std::string_view CurlNativeErrorCodeDescKey = "nativeErrorCodeDesc"; constexpr std::string_view CurlNativeErrorDescKey = "nativeErrorDesc"; NetworkRequestErrorPrivate::NetworkRequestErrorPrivate(NetworkRequestError::Type code, std::string &&msg, std::map &&extraInfo) : _errorCode(code) , _errorMessage( std::move(msg) ) , _extraInfo( std::move(extraInfo) ) { } NetworkRequestErrorPrivate *NetworkRequestErrorPrivate::clone() const { return new NetworkRequestErrorPrivate( *this ); } NetworkRequestError NetworkRequestErrorPrivate::customError( NetworkRequestError::Type t, std::string &&errorMsg, std::map &&extraInfo ) { return NetworkRequestError( *new NetworkRequestErrorPrivate(t, errorMsg.empty() ? typeToString(t) : std::move(errorMsg), std::move(extraInfo)) ); } NetworkRequestError NetworkRequestErrorPrivate::fromCurlError(NetworkRequest &req, int nativeCode , const std::string &nativeError ) { Url url = req.url(); NetworkRequestError::Type c = NetworkRequestError::NoError; std::string err; std::map extraInfo; if ( nativeCode != 0 ) { const char *nativeErr = curl_easy_strerror( static_cast(nativeCode) ); if ( nativeErr != nullptr ) extraInfo.insert( { CurlNativeErrorCodeDescKey.data(), std::string( nativeErr ) } ); if ( !nativeError.empty() ) extraInfo.insert( { CurlNativeErrorDescKey.data(), nativeError } ); extraInfo.insert( { "requestUrl", url } ); extraInfo.insert( { "curlCode", nativeCode } ); extraInfo.insert( { "filepath", req.targetFilePath().asString() } ); extraInfo.insert( { "lastRedirect", req.lastRedirectInfo() } ); switch ( nativeCode ) { case CURLE_UNSUPPORTED_PROTOCOL: c = NetworkRequestError::UnsupportedProtocol; err = typeToString( c ); if ( !req.lastRedirectInfo().empty() ) { err += " or redirect ("; err += req.lastRedirectInfo(); err += ")"; } break; case CURLE_URL_MALFORMAT: case CURLE_URL_MALFORMAT_USER: c = NetworkRequestError::MalformedURL; break; case CURLE_LOGIN_DENIED: c = NetworkRequestError::Unauthorized; break; case CURLE_HTTP_RETURNED_ERROR: { long httpReturnCode = 0; CURLcode infoRet = curl_easy_getinfo( req.nativeHandle(), CURLINFO_RESPONSE_CODE, &httpReturnCode ); if ( infoRet == CURLE_OK ) { extraInfo.insert( { "responseCode", httpReturnCode } ); std::string msg = "HTTP response: " + zypp::str::numstring( httpReturnCode ); switch ( httpReturnCode ) { case 401: { long auth_info = CURLAUTH_NONE; CURLcode infoRet = curl_easy_getinfo(req.nativeHandle(), CURLINFO_HTTPAUTH_AVAIL, &auth_info); if (infoRet == CURLE_OK) { extraInfo.insert( { "authHint", zypp::media::CurlAuthData::auth_type_long2str(auth_info) } ); } //if there is already a user:password entry in the settings the auth simply failed //@TODO write a testcase for this if ( !req.transferSettings().userPassword().empty() ) { c = NetworkRequestError::AuthFailed; } else { c = NetworkRequestError::Unauthorized; } break; } case 502: // bad gateway (bnc #1070851) case 503: // service temporarily unavailable (bnc #462545) c = NetworkRequestError::TemporaryProblem; err = zypp::str::form( _("Location '%s' is temporarily unaccessible."), url.asString().c_str() ); break; case 504: // gateway timeout c = NetworkRequestError::Timeout; err = zypp::str::form(_("Timeout exceeded when accessing '%s'."), url.asString().c_str() ); break; case 403: { std::string msg403; if ( url.getHost().find(".suse.com") != std::string::npos ) msg403 = _("Visit the SUSE Customer Center to check whether your registration is valid and has not expired."); else if (url.asString().find("novell.com") != std::string::npos) msg403 = _("Visit the Novell Customer Center to check whether your registration is valid and has not expired."); c = NetworkRequestError::Forbidden; err = msg403; break; } case 404: case 410: c = NetworkRequestError::NotFound; err = zypp::str::form( _("File '%s' not found on medium '%s'"), req.targetFilePath().c_str(), url.asString().c_str() ); break; default: c = NetworkRequestError::ServerReturnedError; err = zypp::str::form(_("Download (curl) error for '%s':\n" "Error code: %s\n"), url.asString().c_str(), zypp::str::numstring( httpReturnCode ).c_str() ) ; break; } } else { c = NetworkRequestError::ServerReturnedError; err = zypp::str::form(_("Download (curl) error for '%s':\n" "Unable to retrieve HTTP response\n"), url.asString().c_str() ) ; } } break; case CURLE_FTP_COULDNT_RETR_FILE: #if CURLVERSION_AT_LEAST(7,16,0) case CURLE_REMOTE_FILE_NOT_FOUND: #endif case CURLE_FTP_ACCESS_DENIED: case CURLE_TFTP_NOTFOUND: c = NetworkRequestError::NotFound; break; case CURLE_BAD_PASSWORD_ENTERED: case CURLE_FTP_USER_PASSWORD_INCORRECT: c = NetworkRequestError::AuthFailed; break; case CURLE_COULDNT_RESOLVE_PROXY: case CURLE_COULDNT_RESOLVE_HOST: case CURLE_COULDNT_CONNECT: case CURLE_FTP_CANT_GET_HOST: c = NetworkRequestError::ConnectionFailed; break; case CURLE_WRITE_ERROR: { // this error code also handles the cases when a callback returned a error. c = NetworkRequestError::InternalError; break; } case CURLE_PARTIAL_FILE: c = NetworkRequestError::ServerReturnedError; break; case CURLE_OPERATION_TIMEDOUT: c = NetworkRequestError::Timeout; break; case CURLE_ABORTED_BY_CALLBACK: c = NetworkRequestError::Cancelled; break; case CURLE_PEER_FAILED_VERIFICATION: c = NetworkRequestError::PeerCertificateInvalid; break; case CURLE_HTTP2: c = NetworkRequestError::Http2Error; break; case CURLE_HTTP2_STREAM: c = NetworkRequestError::Http2StreamError; break; default: c = NetworkRequestError::ServerReturnedError; break; } } if ( err.empty() ) err = typeToString( c ); err += " Curl error (" + zypp::str::numstring( nativeCode ) + ")"; return NetworkRequestError( *new NetworkRequestErrorPrivate(c, std::move(err), std::move(extraInfo)) ); } NetworkRequestError NetworkRequestErrorPrivate::fromCurlMError( int nativeCode ) { const char *nativeErr = curl_multi_strerror( static_cast(nativeCode) ); std::map extraInfo; extraInfo.insert( { "curlMCode", nativeCode } ); std::string err; if ( nativeErr == nullptr ) err = "The dispatcher returned an unknown error"; else err = std::string( nativeErr ); return NetworkRequestError( *new NetworkRequestErrorPrivate(NetworkRequestError::InternalError, std::move(err), std::move(extraInfo)) ); } NetworkRequestError::NetworkRequestError(zyppng::NetworkRequestErrorPrivate &d ) : d_ptr( &d ) { } NetworkRequestError::NetworkRequestError() : d_ptr( new NetworkRequestErrorPrivate( NoError, {}, {} ) ) { } NetworkRequestError::Type NetworkRequestError::type() const { return d_func()->_errorCode; } std::string NetworkRequestError::toString() const { return d_func()->_errorMessage; } bool NetworkRequestError::isError() const { return d_func()->_errorCode != NoError; } const std::map &NetworkRequestError::extraInfo() const { return d_func()->_extraInfo; } std::string NetworkRequestErrorPrivate::typeToString( NetworkRequestError::Type t ) { switch ( t ) { case NetworkRequestError::NoError: return "No error"; case NetworkRequestError::InternalError: return "Internal Error"; case NetworkRequestError::Cancelled: return "The request was cancelled"; case NetworkRequestError::ExceededMaxLen: return "The request exceeded the maximum download size"; case NetworkRequestError::InvalidChecksum: return "The downloaded data did not result in a valid checksum"; case NetworkRequestError::PeerCertificateInvalid: return "The peer certificate could not be verified"; case NetworkRequestError::ConnectionFailed: return "Connection failed"; case NetworkRequestError::UnsupportedProtocol: return "Unsupported protocol"; case NetworkRequestError::MalformedURL: return "Bad URL"; case NetworkRequestError::TemporaryProblem: return "Requested location is temporarily unaccessible."; case NetworkRequestError::Timeout: return "Timeout reached"; case NetworkRequestError::Forbidden: return "Access to requested URL is forbidden."; case NetworkRequestError::NotFound: return "File not found"; case NetworkRequestError::Unauthorized: return "Authentication required but not provided."; case NetworkRequestError::AuthFailed: return "Login failed."; case NetworkRequestError::ServerReturnedError: return "Server returned an error for the given request."; case NetworkRequestError::MissingData: return "Server did not send all requested ranges."; case NetworkRequestError::RangeFail: return "Invalid data from server, multipart was requested but there was no range status code."; case NetworkRequestError::Http2Error: return "Server returned a HTTP/2 error."; case NetworkRequestError::Http2StreamError: return "Server returned a HTTP/2 stream error."; } return std::string(); } std::string NetworkRequestError::nativeErrorString() const { Z_D(); auto it = d->_extraInfo.find(CurlNativeErrorDescKey.data()); if ( it != d->_extraInfo.end() ) { try { return boost::any_cast( it->second ); } catch ( const boost::bad_any_cast &) { } } it = d->_extraInfo.find(CurlNativeErrorCodeDescKey.data()); if ( it != d->_extraInfo.end() ) { try { return boost::any_cast( it->second ); } catch ( const boost::bad_any_cast &) { } } return std::string(); } } libzypp-17.36.5/zypp-curl/ng/network/networkrequesterror.h000066400000000000000000000076741476576476200240230ustar00rootroot00000000000000#ifndef ZYPP_NG_MEDIA_CURL_NETWORK_REQUEST_ERROR_H_INCLUDED #define ZYPP_NG_MEDIA_CURL_NETWORK_REQUEST_ERROR_H_INCLUDED #include #include #include #include #include namespace zyppng { class NetworkRequest; class NetworkRequestErrorPrivate; /** * @brief The NetworkRequestError class * Represents a error that occured in \see NetworkDownloadRequest * or \see NetworkRequestDispatcher * * * \attention Keep in sync with zypp/zyppng/proto/networkrequest.proto !!! */ class LIBZYPP_NG_EXPORT NetworkRequestError { public: enum Type { NoError = 0, InternalError, //< A error in the dispatcher that is not caused by the backend, check the error string Cancelled, //< The request was cancelled PeerCertificateInvalid, //< the peer certificate validation failed ConnectionFailed, //< connecting to the server failed ExceededMaxLen, //< the downloaded data exceeded the requested maximum lenght InvalidChecksum, //< The downloaded data has a different checksum than expected UnsupportedProtocol, //< The protocol given in the URL scheme is not supported by the backend MalformedURL, //< The given URL is malformed TemporaryProblem, //< There was a temporary problem with the server side Timeout, //< The request timed out Forbidden, //< Accessing the requested ressource on the server was forbidden NotFound, //< The requested path in the URL does not exist on the server Unauthorized, //<< No auth data given but authorization required AuthFailed, //<< Auth data was given, but authorization failed ServerReturnedError, //<< A error was returned by the server that is not explicitly handled MissingData, //<< The download was a multirange download and we did not get all data that was requested, if that is returned some ranges might have been downloaded successful RangeFail, //<< The download was a multirange download but the server decided to return the full file. Http2Error, //<< Special error code for HTTP2 related errors Http2StreamError, //<< Special error code for HTTP2 stream related errors }; NetworkRequestError (); NetworkRequestError(const NetworkRequestError &) = default; NetworkRequestError(NetworkRequestError &&) noexcept = default; NetworkRequestError &operator=(const NetworkRequestError &) = default; NetworkRequestError &operator=(NetworkRequestError &&) noexcept = default; /** * @brief type * Returns the type of the error */ Type type () const; /** * @brief toString * Returns a string representation of the error */ std::string toString () const; /** * @brief isError * Will return true if this is a actual error */ bool isError () const; /*! * Tries to find \a key in the extraInfo map, if the key is not found * or the value can not be converted to the requested type \a defaultVal is returned. */ template T extraInfoValue ( const std::string &key, T &&defaultVal = T() ) const { auto &t = extraInfo(); auto it = t.find(key); if ( it != t.end() ) { try { return boost::any_cast( it->second ); } catch ( const boost::bad_any_cast &) { } } return defaultVal; } /*! * Returns the error extraInfo map. */ const std::map &extraInfo () const; /*! * Returns the string returned by the backend if available. */ std::string nativeErrorString() const; protected: NetworkRequestError( NetworkRequestErrorPrivate &d ); private: ZYPP_DECLARE_PRIVATE(NetworkRequestError) zypp::RWCOW_pointer d_ptr; }; } #endif libzypp-17.36.5/zypp-curl/ng/network/private/000077500000000000000000000000001476576476200211325ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/ng/network/private/mediadebug_p.h000066400000000000000000000044001476576476200237060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_MEDIADEBUG_H_INCLUDED #define ZYPP_NG_MEDIADEBUG_H_INCLUDED #include L_ENV_CONSTR_FWD_DECLARE_FUNC(ZYPP_MEDIA_CURL_DEBUG); #ifdef ZYPP_BASE_LOGGER_LOGGROUP #undef ZYPP_BASE_LOGGER_LOGGROUP #endif #define ZYPP_BASE_LOGGER_LOGGROUP "ZYPP_MEDIA_CURL" #define XXX_MEDIA L_XXX_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define DBG_MEDIA L_DBG_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define MIL_MEDIA L_MIL_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define WAR_MEDIA L_WAR_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define ERR_MEDIA L_ERR_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define SEC_MEDIA L_SEC_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define INT_MEDIA L_INT_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define USR_MEDIA L_USR_MEDIA( ZYPP_BASE_LOGGER_LOGGROUP ) #define L_XXX_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_XXX ) #define L_DBG_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP"++", zypp::base::logger::E_MIL ) #define L_MIL_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_MIL ) #define L_WAR_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_WAR ) #define L_ERR_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_ERR ) #define L_SEC_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_SEC ) #define L_INT_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_INT ) #define L_USR_MEDIA(GROUP) L_ENV_CONSTR( ZYPP_MEDIA_CURL_DEBUG, GROUP, zypp::base::logger::E_USR ) #endif // ZYPP_NG_MEDIADEBUG_H_INCLUDED libzypp-17.36.5/zypp-curl/ng/network/private/networkrequestdispatcher_p.h000066400000000000000000000054401476576476200267760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_MEDIA_CURL_PRIVATE_CURL_P_H_INCLUDED #define ZYPP_NG_MEDIA_CURL_PRIVATE_CURL_P_H_INCLUDED #include #include #include #include #include #include namespace zyppng { class Timer; class SocketNotifier; class NetworkRequestDispatcherPrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(NetworkRequestDispatcher) public: NetworkRequestDispatcherPrivate ( NetworkRequestDispatcher &p ); ~NetworkRequestDispatcherPrivate() override; int _maxConnections = 10; std::deque< std::shared_ptr > _pendingDownloads; std::vector< std::shared_ptr > _runningDownloads; std::shared_ptr _timer; std::map< curl_socket_t, std::shared_ptr > _socketHandler; bool _isRunning = false; bool _locked = false; //if set to true, no new requests will be dequeued CURLM *_multi = nullptr; NetworkRequestError _lastError; std::string _userAgent; std::unordered_map< std::string, std::unordered_map > _customHeaders; //signals Signal< void ( NetworkRequestDispatcher &, NetworkRequest & )> _sigDownloadStarted; Signal< void ( NetworkRequestDispatcher &, NetworkRequest & )> _sigDownloadFinished; Signal< void ( NetworkRequestDispatcher & )> _sigQueueFinished; Signal< void ( NetworkRequestDispatcher & )> _sigError; private: static int multi_timer_cb ( CURLM *multi, long timeout_ms, void *g ); static int static_socket_callback(CURL *easy, curl_socket_t s, int what, void *userp, SocketNotifier *socketp ); void multiTimerTimout ( const Timer &t ); int socketCallback(CURL *easy, curl_socket_t s, int what, void * ); void cancelAll ( const NetworkRequestError& result ); bool addRequestToMultiHandle ( NetworkRequest &req ); void setFinished( NetworkRequest &req , NetworkRequestError result ); void onSocketActivated ( const SocketNotifier &listener, int events ); void handleMultiSocketAction ( curl_socket_t nativeSocket, int evBitmask ); void dequeuePending (); }; } #endif libzypp-17.36.5/zypp-curl/ng/network/private/networkrequesterror_p.h000066400000000000000000000033111476576476200257740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_MEDIA_CURL_PRIVATE_NETWORKREQUESTERROR_P_H_INCLUDED #define ZYPP_NG_MEDIA_CURL_PRIVATE_NETWORKREQUESTERROR_P_H_INCLUDED #include #include namespace zyppng { class NetworkRequestErrorPrivate { public: NetworkRequestErrorPrivate( NetworkRequestError::Type code, std::string &&msg, std::map && extraInfo ); NetworkRequestErrorPrivate *clone () const; NetworkRequestError::Type _errorCode = NetworkRequestError::InternalError; std::string _errorMessage; std::map _extraInfo; static zyppng::NetworkRequestError customError( NetworkRequestError::Type t, std::string &&errorMsg = "", std::map &&extraInfo = {} ); static zyppng::NetworkRequestError fromCurlError( NetworkRequest &req, int nativeCode , const std::string &nativeError ); static zyppng::NetworkRequestError fromCurlMError ( int nativeCode ); static std::string typeToString( NetworkRequestError::Type t ); }; } #endif libzypp-17.36.5/zypp-curl/ng/network/private/request_p.h000066400000000000000000000156711476576476200233240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_NG_MEDIA_CURL_PRIVATE_REQUEST_P_H_INCLUDED #define ZYPP_NG_MEDIA_CURL_PRIVATE_REQUEST_P_H_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { class NetworkRequestPrivate : public BasePrivate, public CurlMultiPartDataReceiver { ZYPP_DECLARE_PUBLIC(NetworkRequest) public: enum class ProtocolMode{ Default, //< use this mode if no special checks are required in header or write callbacks HTTP //< this mode is used for HTTP and HTTPS downloads } _protocolMode = ProtocolMode::Default; NetworkRequestPrivate(Url &&url, zypp::Pathname &&targetFile, NetworkRequest::FileMode fMode, NetworkRequest &p ); ~NetworkRequestPrivate() override; bool initialize( std::string &errBuf ); bool setupHandle ( std::string &errBuf ); bool assertOutputFile (); /*! * \internal * Called by the dispatcher if we report a error. If this function returns * true we are qeued again and reinitialize is called */ bool canRecover () const; /*! * Prepares the request before it is queued again * currently this is used only for range batching but could be used to * recover from other types of errors too */ bool prepareToContinue ( std::string &errBuf ); /*! * \internal * This will return true if the download needs to be queued again to * continue downloading more stuff. */ bool hasMoreWork() const; /*! * \internal * Prepares the request to be started, or restarted for a range batch request. */ void aboutToStart ( ); /*! * \internal * Tells the request it was just removed from the curl multi handle and is about * to be finalized. This function is called before \ref hasPendingRanges and \ref setResult */ void dequeueNotify(); void setResult ( NetworkRequestError &&err ); void reset (); void resetActivityTimer (); void onActivityTimeout (Timer &); std::string errorMessage () const; std::array _errorBuf; //provide a buffer for a nicely formatted error for CURL template void setCurlOption ( CURLoption opt, T data ) { auto ret = curl_easy_setopt( _easyHandle, opt, data ); if ( ret != 0 ) { ZYPP_THROW( zypp::media::MediaCurlSetOptException( _url, _errorBuf.data() ) ); } } Url _url; //file URL zypp::Pathname _targetFile; //target file TransferSettings _settings; NetworkRequest::Options _options; zypp::ByteCount _expectedFileSize; // the file size as expected by the user code std::vector _requestedRanges; ///< the requested ranges that need to be downloaded struct FileVerifyInfo { zypp::Digest _fileDigest; zypp::CheckSum _fileChecksum; }; std::optional _fileVerification; ///< The digest for the full file NetworkRequest::FileMode _fMode = NetworkRequest::WriteExclusive; NetworkRequest::Priority _priority = NetworkRequest::Normal; std::string _lastRedirect; ///< to log/report redirections zypp::Pathname _currentCookieFile = "/var/lib/YaST2/cookies"; void *_easyHandle = nullptr; // the easy handle that controlling this request NetworkRequestDispatcher *_dispatcher = nullptr; // the parent downloader owning this request //signals Signal< void ( NetworkRequest &req )> _sigStarted; Signal< void ( NetworkRequest &req, zypp::ByteCount count )> _sigBytesDownloaded; Signal< void ( NetworkRequest &req, off_t dltotal, off_t dlnow, off_t ultotal, off_t ulnow )> _sigProgress; Signal< void ( NetworkRequest &req, const NetworkRequestError &err )> _sigFinished; static int curlProgressCallback ( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow ); size_t headerfunction ( char *ptr, size_t bytes ) override; size_t writefunction (char *ptr, std::optional offset, size_t bytes ) override; void notifyErrorCodeChanged () override; std::unique_ptr< curl_slist, decltype (&curl_slist_free_all) > _headers; struct pending_t; struct running_t; struct prepareNextRangeBatch_t; struct pending_t { pending_t(){} std::unique_ptr _partialHelper = {}; }; struct prepareNextRangeBatch_t { prepareNextRangeBatch_t( running_t &&prevState ); zypp::AutoFILE _outFile; //the file we are writing to off_t _downloaded = 0; //downloaded bytes std::unique_ptr _partialHelper = {}; }; struct running_t { running_t( pending_t &&prevState ); running_t( prepareNextRangeBatch_t &&prevState ); Timer::Ptr _activityTimer = Timer::create(); zypp::AutoFILE _outFile; std::unique_ptr _partialHelper = {}; // handle the case when cancel() is called from a slot to the progress signal bool _isInCallback = false; // used to handle cancel() when emitting the progress signal, or when we explicitely trigger // a error during callbacks. std::optional _cachedResult; off_t _lastProgressNow = -1; // last value returned from CURL, lets only send signals if we get actual updates off_t _downloaded = 0; //downloaded bytes off_t _currentFileOffset = 0; zypp::ByteCount _contentLenght; // the content length as reported by the server }; struct finished_t { off_t _downloaded = 0; //downloaded bytes zypp::ByteCount _contentLenght = 0; // the content length as reported by the server NetworkRequestError _result; // the overall result of the download }; std::variant< pending_t, running_t, prepareNextRangeBatch_t, finished_t > _runningMode = pending_t(); }; } #endif libzypp-17.36.5/zypp-curl/ng/network/rangedesc.h000066400000000000000000000030401476576476200215610ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_CURL_NG_NETWORK_RANGEDESC_INCLUDED #define ZYPP_CURL_NG_NETWORK_RANGEDESC_INCLUDED #include #include #include #include namespace zyppng { /*! * Describes a range of a file that is to be downloaded. */ struct RangeDesc { size_t _start = 0; size_t _len = 0; /** * Enables automated checking of downloaded contents against a checksum. * \note expects _checksum in byte NOT in string format */ std::string _chksumtype; UByteArray _checksum; std::optional _relevantDigestLen; //< initialized if only the first few bytes of the checksum should be considered std::optional _chksumPad; //< initialized if the hashed blocks for a digest need to be padded if a block is smaller ( e.g. last block in a zsync file ) }; } #endif libzypp-17.36.5/zypp-curl/ng/network/request.cc000066400000000000000000001123611476576476200214630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { namespace { static size_t nwr_headerCallback ( char *ptr, size_t size, size_t nmemb, void *userdata ) { if ( !userdata ) return 0; NetworkRequestPrivate *that = reinterpret_cast( userdata ); return that->headerfunction( ptr, size * nmemb ); } static size_t nwr_writeCallback ( char *ptr, size_t size, size_t nmemb, void *userdata ) { if ( !userdata ) return 0; NetworkRequestPrivate *that = reinterpret_cast( userdata ); return that->writefunction( ptr, {}, size * nmemb ); } //helper for std::visit template struct always_false : std::false_type {}; } NetworkRequestPrivate::prepareNextRangeBatch_t::prepareNextRangeBatch_t(running_t &&prevState) : _outFile( std::move(prevState._outFile) ) , _downloaded( prevState._downloaded ) , _partialHelper( std::move(prevState._partialHelper) ) { } NetworkRequestPrivate::running_t::running_t( pending_t &&prevState ) : _partialHelper( std::move(prevState._partialHelper) ) { } NetworkRequestPrivate::running_t::running_t( prepareNextRangeBatch_t &&prevState ) : _outFile( std::move(prevState._outFile) ) , _partialHelper( std::move(prevState._partialHelper) ) , _downloaded( prevState._downloaded ) { } NetworkRequestPrivate::NetworkRequestPrivate(Url &&url, zypp::Pathname &&targetFile, NetworkRequest::FileMode fMode , NetworkRequest &p) : BasePrivate(p) , _url ( std::move(url) ) , _targetFile ( std::move( targetFile) ) , _fMode ( std::move(fMode) ) , _headers( std::unique_ptr< curl_slist, decltype (&curl_slist_free_all) >( nullptr, &curl_slist_free_all ) ) { } NetworkRequestPrivate::~NetworkRequestPrivate() { if ( _easyHandle ) { //clean up for now, later we might reuse handles curl_easy_cleanup( _easyHandle ); //reset in request but make sure the request was not enqueued again and got a new handle _easyHandle = nullptr; } } bool NetworkRequestPrivate::initialize( std::string &errBuf ) { reset(); if ( _easyHandle ) //will reset to defaults but keep live connections, session ID and DNS caches curl_easy_reset( _easyHandle ); else _easyHandle = curl_easy_init(); return setupHandle ( errBuf ); } bool NetworkRequestPrivate::setupHandle( std::string &errBuf ) { ::internal::setupZYPP_MEDIA_CURL_DEBUG( _easyHandle ); curl_easy_setopt( _easyHandle, CURLOPT_ERRORBUFFER, this->_errorBuf.data() ); const std::string urlScheme = _url.getScheme(); if ( urlScheme == "http" || urlScheme == "https" ) _protocolMode = ProtocolMode::HTTP; try { setCurlOption( CURLOPT_PRIVATE, this ); setCurlOption( CURLOPT_XFERINFOFUNCTION, NetworkRequestPrivate::curlProgressCallback ); setCurlOption( CURLOPT_XFERINFODATA, this ); setCurlOption( CURLOPT_NOPROGRESS, 0L); setCurlOption( CURLOPT_FAILONERROR, 1L); setCurlOption( CURLOPT_NOSIGNAL, 1L); std::string urlBuffer( _url.asString() ); setCurlOption( CURLOPT_URL, urlBuffer.c_str() ); setCurlOption( CURLOPT_WRITEFUNCTION, nwr_writeCallback ); setCurlOption( CURLOPT_WRITEDATA, this ); if ( _options & NetworkRequest::ConnectionTest ) { setCurlOption( CURLOPT_CONNECT_ONLY, 1L ); setCurlOption( CURLOPT_FRESH_CONNECT, 1L ); } if ( _options & NetworkRequest::HeadRequest ) { // instead of returning no data with NOBODY, we return // little data, that works with broken servers, and // works for ftp as well, because retrieving only headers // ftp will return always OK code ? // See http://curl.haxx.se/docs/knownbugs.html #58 if ( _protocolMode == ProtocolMode::HTTP && _settings.headRequestsAllowed() ) setCurlOption( CURLOPT_NOBODY, 1L ); else setCurlOption( CURLOPT_RANGE, "0-1" ); } //make a local copy of the settings, so headers are not added multiple times TransferSettings locSet = _settings; if ( _dispatcher ) { locSet.setUserAgentString( _dispatcher->agentString().c_str() ); // add custom headers as configured (bsc#955801) const auto &cHeaders = _dispatcher->hostSpecificHeaders(); if ( auto i = cHeaders.find(_url.getHost()); i != cHeaders.end() ) { for ( const auto &[key, value] : i->second ) { locSet.addHeader( zypp::str::trim( zypp::str::form( "%s: %s", key.c_str(), value.c_str() ) )); } } } locSet.addHeader("Pragma:"); /** Force IPv4/v6 */ switch ( zypp::env::ZYPP_MEDIA_CURL_IPRESOLVE() ) { case 4: setCurlOption( CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); break; case 6: setCurlOption( CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6 ); break; default: break; } setCurlOption( CURLOPT_HEADERFUNCTION, &nwr_headerCallback ); setCurlOption( CURLOPT_HEADERDATA, this ); /** * Connect timeout */ setCurlOption( CURLOPT_CONNECTTIMEOUT, locSet.connectTimeout() ); // If a transfer timeout is set, also set CURLOPT_TIMEOUT to an upper limit // just in case curl does not trigger its progress callback frequently // enough. if ( locSet.timeout() ) { setCurlOption( CURLOPT_TIMEOUT, 3600L ); } if ( urlScheme == "https" ) { if ( :: internal::setCurlRedirProtocols ( _easyHandle ) != CURLE_OK ) { ZYPP_THROW( zypp::media::MediaCurlSetOptException( _url, _errorBuf.data() ) ); } if( locSet.verifyPeerEnabled() || locSet.verifyHostEnabled() ) { setCurlOption(CURLOPT_CAPATH, locSet.certificateAuthoritiesPath().c_str()); } if( ! locSet.clientCertificatePath().empty() ) { setCurlOption(CURLOPT_SSLCERT, locSet.clientCertificatePath().c_str()); } if( ! locSet.clientKeyPath().empty() ) { setCurlOption(CURLOPT_SSLKEY, locSet.clientKeyPath().c_str()); } #ifdef CURLSSLOPT_ALLOW_BEAST // see bnc#779177 setCurlOption( CURLOPT_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST ); #endif setCurlOption(CURLOPT_SSL_VERIFYPEER, locSet.verifyPeerEnabled() ? 1L : 0L); setCurlOption(CURLOPT_SSL_VERIFYHOST, locSet.verifyHostEnabled() ? 2L : 0L); // bnc#903405 - POODLE: libzypp should only talk TLS setCurlOption(CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); } // follow any Location: header that the server sends as part of // an HTTP header (#113275) setCurlOption( CURLOPT_FOLLOWLOCATION, 1L); // 3 redirects seem to be too few in some cases (bnc #465532) setCurlOption( CURLOPT_MAXREDIRS, 6L ); //set the user agent setCurlOption(CURLOPT_USERAGENT, locSet.userAgentString().c_str() ); /*---------------------------------------------------------------* CURLOPT_USERPWD: [user name]:[password] Url::username/password -> CURLOPT_USERPWD If not provided, anonymous FTP identification *---------------------------------------------------------------*/ if ( locSet.userPassword().size() ) { setCurlOption(CURLOPT_USERPWD, locSet.userPassword().c_str()); std::string use_auth = _settings.authType(); if (use_auth.empty()) use_auth = "digest,basic"; // our default long auth = zypp::media::CurlAuthData::auth_type_str2long(use_auth); if( auth != CURLAUTH_NONE) { DBG << _easyHandle << " " << "Enabling HTTP authentication methods: " << use_auth << " (CURLOPT_HTTPAUTH=" << auth << ")" << std::endl; setCurlOption(CURLOPT_HTTPAUTH, auth); } } if ( locSet.proxyEnabled() && ! locSet.proxy().empty() ) { DBG << _easyHandle << " " << "Proxy: '" << locSet.proxy() << "'" << std::endl; setCurlOption(CURLOPT_PROXY, locSet.proxy().c_str()); setCurlOption(CURLOPT_PROXYAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST|CURLAUTH_NTLM ); /*---------------------------------------------------------------* * CURLOPT_PROXYUSERPWD: [user name]:[password] * * Url::option(proxyuser and proxypassword) -> CURLOPT_PROXYUSERPWD * If not provided, $HOME/.curlrc is evaluated *---------------------------------------------------------------*/ std::string proxyuserpwd = locSet.proxyUserPassword(); if ( proxyuserpwd.empty() ) { zypp::media::CurlConfig curlconf; zypp::media::CurlConfig::parseConfig(curlconf); // parse ~/.curlrc if ( curlconf.proxyuserpwd.empty() ) DBG << _easyHandle << " " << "Proxy: ~/.curlrc does not contain the proxy-user option" << std::endl; else { proxyuserpwd = curlconf.proxyuserpwd; DBG << _easyHandle << " " << "Proxy: using proxy-user from ~/.curlrc" << std::endl; } } else { DBG << _easyHandle << " " << _easyHandle << " " << "Proxy: using provided proxy-user '" << _settings.proxyUsername() << "'" << std::endl; } if ( ! proxyuserpwd.empty() ) { setCurlOption(CURLOPT_PROXYUSERPWD, ::internal::curlUnEscape( proxyuserpwd ).c_str()); } } #if CURLVERSION_AT_LEAST(7,19,4) else if ( locSet.proxy() == EXPLICITLY_NO_PROXY ) { // Explicitly disabled in URL (see fillSettingsFromUrl()). // This should also prevent libcurl from looking into the environment. DBG << _easyHandle << " " << "Proxy: explicitly NOPROXY" << std::endl; setCurlOption(CURLOPT_NOPROXY, "*"); } #endif // else: Proxy: not explicitly set; libcurl may look into the environment /** Speed limits */ if ( locSet.minDownloadSpeed() != 0 ) { setCurlOption(CURLOPT_LOW_SPEED_LIMIT, locSet.minDownloadSpeed()); // default to 10 seconds at low speed setCurlOption(CURLOPT_LOW_SPEED_TIME, 60L); } #if CURLVERSION_AT_LEAST(7,15,5) if ( locSet.maxDownloadSpeed() != 0 ) setCurlOption(CURLOPT_MAX_RECV_SPEED_LARGE, locSet.maxDownloadSpeed()); #endif zypp::filesystem::assert_file_mode( _currentCookieFile, 0600 ); if ( locSet.cookieFileEnabled() ) setCurlOption( CURLOPT_COOKIEFILE, _currentCookieFile.c_str() ); else MIL << _easyHandle << " " << "No cookies requested" << std::endl; setCurlOption(CURLOPT_COOKIEJAR, _currentCookieFile.c_str() ); #if CURLVERSION_AT_LEAST(7,18,0) // bnc #306272 setCurlOption(CURLOPT_PROXY_TRANSFER_MODE, 1L ); #endif // Append settings custom headers to curl. // TransferSettings assert strings are trimmed (HTTP/2 RFC 9113) for ( const auto &header : locSet.headers() ) { if ( !z_func()->addRequestHeader( header.c_str() ) ) ZYPP_THROW(zypp::media::MediaCurlInitException(_url)); } if ( _headers ) setCurlOption( CURLOPT_HTTPHEADER, _headers.get() ); // set up ranges if required if( !( _options & NetworkRequest::ConnectionTest ) && !( _options & NetworkRequest::HeadRequest ) ){ if ( _requestedRanges.size() ) { std::sort( _requestedRanges.begin(), _requestedRanges.end(), []( const auto &elem1, const auto &elem2 ){ return ( elem1._start < elem2._start ); }); CurlMultiPartHandler *helper = nullptr; if ( auto initState = std::get_if(&_runningMode) ) { auto multiPartMode = _protocolMode == ProtocolMode::HTTP ? CurlMultiPartHandler::ProtocolMode::HTTP : CurlMultiPartHandler::ProtocolMode::Basic; initState->_partialHelper = std::make_unique( multiPartMode , _easyHandle , _requestedRanges , *this ); helper = initState->_partialHelper.get(); } else if ( auto pendingState = std::get_if(&_runningMode) ) { helper = pendingState->_partialHelper.get(); } else { errBuf = "Request is in invalid state to call setupHandle"; return false; } if ( !helper->prepare () ) { errBuf = helper->lastErrorMessage (); return false; } } } return true; } catch ( const zypp::Exception &excp ) { ZYPP_CAUGHT(excp); errBuf = excp.asString(); } return false; } bool NetworkRequestPrivate::assertOutputFile() { auto rmode = std::get_if( &_runningMode ); if ( !rmode ) { DBG << _easyHandle << "Can only create output file in running mode" << std::endl; return false; } // if we have no open file create or open it if ( !rmode->_outFile ) { std::string openMode = "w+b"; if ( _fMode == NetworkRequest::WriteShared ) openMode = "r+b"; rmode->_outFile = fopen( _targetFile.asString().c_str() , openMode.c_str() ); //if the file does not exist create a new one if ( !rmode->_outFile && _fMode == NetworkRequest::WriteShared ) { rmode->_outFile = fopen( _targetFile.asString().c_str() , "w+b" ); } if ( !rmode->_outFile ) { rmode->_cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError ,zypp::str::Format("Unable to open target file (%1%). Errno: (%2%:%3%)") % _targetFile.asString() % errno % strerr_cxx() ); return false; } } return true; } bool NetworkRequestPrivate::canRecover() const { // We can recover from RangeFail errors if the helper indicates it auto rmode = std::get_if( &_runningMode ); if ( rmode->_partialHelper ) return rmode->_partialHelper->canRecover(); return false; } bool NetworkRequestPrivate::prepareToContinue( std::string &errBuf ) { auto rmode = std::get_if( &_runningMode ); if ( !rmode ) { errBuf = "NetworkRequestPrivate::prepareToContinue called in invalid state"; return false; } if ( rmode->_partialHelper && rmode->_partialHelper->hasMoreWork() ) { bool hadRangeFail = rmode->_partialHelper->lastError () == NetworkRequestError::RangeFail; _runningMode = prepareNextRangeBatch_t( std::move(std::get( _runningMode )) ); auto &prepMode = std::get(_runningMode); if ( !prepMode._partialHelper->prepareToContinue() ) { errBuf = prepMode._partialHelper->lastErrorMessage(); return false; } if ( hadRangeFail ) { // we reset the handle to default values. We do this to not run into // "transfer closed with outstanding read data remaining" error CURL sometimes returns when // we cancel a connection because of a range error to request a smaller batch. // The error will still happen but much less frequently than without resetting the handle. // // Note: Even creating a new handle will NOT fix the issue curl_easy_reset( _easyHandle ); } if ( !setupHandle(errBuf)) return false; return true; } errBuf = "Request has no more work"; return false; } bool NetworkRequestPrivate::hasMoreWork() const { // check if we have ranges that have never been requested return std::any_of( _requestedRanges.begin(), _requestedRanges.end(), []( const auto &range ){ return range._rangeState == CurlMultiPartHandler::Pending; }); } void NetworkRequestPrivate::aboutToStart( ) { bool isRangeContinuation = std::holds_alternative( _runningMode ); if ( isRangeContinuation ) { MIL << _easyHandle << " " << "Continuing a previously started range batch." << std::endl; _runningMode = running_t( std::move(std::get( _runningMode )) ); } else { _runningMode = running_t( std::move(std::get( _runningMode )) ); } auto &m = std::get( _runningMode ); if ( m._activityTimer ) { DBG_MEDIA << _easyHandle << " Setting activity timeout to: " << _settings.timeout() << std::endl; m._activityTimer->connect( &Timer::sigExpired, *this, &NetworkRequestPrivate::onActivityTimeout ); m._activityTimer->start( static_cast( _settings.timeout() * 1000 ) ); } if ( !isRangeContinuation ) _sigStarted.emit( *z_func() ); } void NetworkRequestPrivate::dequeueNotify() { if ( std::holds_alternative(_runningMode) ) { auto &rmode = std::get( _runningMode ); if ( rmode._partialHelper ) rmode._partialHelper->finalize(); } } void NetworkRequestPrivate::setResult( NetworkRequestError &&err ) { finished_t resState; resState._result = std::move(err); if ( std::holds_alternative(_runningMode) ) { auto &rmode = std::get( _runningMode ); resState._downloaded = rmode._downloaded; resState._contentLenght = rmode._contentLenght; if ( resState._result.type() == NetworkRequestError::NoError && !(_options & NetworkRequest::HeadRequest) && !(_options & NetworkRequest::ConnectionTest) ) { if ( _requestedRanges.size( ) ) { //we have a successful download lets see if we got everything we needed if ( !rmode._partialHelper->verifyData() ){ NetworkRequestError::Type err = rmode._partialHelper->lastError(); resState._result = NetworkRequestErrorPrivate::customError( err, std::string(rmode._partialHelper->lastErrorMessage()) ); } // if we have ranges we need to fill our digest from the full file if ( _fileVerification && resState._result.type() == NetworkRequestError::NoError ) { if ( fseek( rmode._outFile, 0, SEEK_SET ) != 0 ) { resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Unable to set output file pointer." ); } else { constexpr size_t bufSize = 4096; char buf[bufSize]; while( auto cnt = fread(buf, 1, bufSize, rmode._outFile ) > 0 ) { _fileVerification->_fileDigest.update(buf, cnt); } } } } // if ( _requestedRanges.size( ) ) } // finally check the file digest if we have one if ( _fileVerification && resState._result.type() == NetworkRequestError::NoError ) { const UByteArray &calcSum = _fileVerification->_fileDigest.digestVector (); const UByteArray &expSum = zypp::Digest::hexStringToUByteArray( _fileVerification->_fileChecksum.checksum () ); if ( calcSum != expSum ) { resState._result = NetworkRequestErrorPrivate::customError( NetworkRequestError::InvalidChecksum , (zypp::str::Format("Invalid file checksum %1%, expected checksum %2%") % _fileVerification->_fileDigest.digest() % _fileVerification->_fileChecksum.checksum () ) ); } } rmode._outFile.reset(); } _runningMode = std::move( resState ); _sigFinished.emit( *z_func(), std::get(_runningMode)._result ); } void NetworkRequestPrivate::reset() { _protocolMode = ProtocolMode::Default; _headers.reset( nullptr ); _errorBuf.fill( 0 ); _runningMode = pending_t(); if ( _fileVerification ) _fileVerification->_fileDigest.reset (); std::for_each( _requestedRanges.begin (), _requestedRanges.end(), []( CurlMultiPartHandler::Range &range ) { range.restart(); }); } void NetworkRequestPrivate::onActivityTimeout( Timer &t ) { MIL_MEDIA << _easyHandle << " Request timeout interval: " << t.interval()<< " remaining: " << t.remaining() << std::endl; std::map extraInfo; extraInfo.insert( {"requestUrl", _url } ); extraInfo.insert( {"filepath", _targetFile } ); _dispatcher->cancel( *z_func(), NetworkRequestErrorPrivate::customError( NetworkRequestError::Timeout, "Download timed out", std::move(extraInfo) ) ); } std::string NetworkRequestPrivate::errorMessage() const { return std::string( _errorBuf.data() ); } void NetworkRequestPrivate::resetActivityTimer() { if ( std::holds_alternative( _runningMode ) ){ auto &rmode = std::get( _runningMode ); if ( rmode._activityTimer && rmode._activityTimer->isRunning() ) rmode._activityTimer->start(); } } int NetworkRequestPrivate::curlProgressCallback( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow ) { if ( !clientp ) return CURLE_OK; NetworkRequestPrivate *that = reinterpret_cast( clientp ); if ( !std::holds_alternative(that->_runningMode) ){ DBG << that->_easyHandle << " " << "Curl progress callback was called in invalid state "<< that->z_func()->state() << std::endl; return -1; } auto &rmode = std::get( that->_runningMode ); //reset the timer that->resetActivityTimer(); rmode._isInCallback = true; if ( rmode._lastProgressNow != dlnow ) { rmode._lastProgressNow = dlnow; that->_sigProgress.emit( *that->z_func(), dltotal, dlnow, ultotal, ulnow ); } rmode._isInCallback = false; return rmode._cachedResult ? CURLE_ABORTED_BY_CALLBACK : CURLE_OK; } size_t NetworkRequestPrivate::headerfunction( char *ptr, size_t bytes ) { //it is valid to call this function with no data to write, just return OK if ( bytes == 0) return 0; resetActivityTimer(); if ( _protocolMode == ProtocolMode::HTTP ) { std::string_view hdr( ptr, bytes ); hdr.remove_prefix( std::min( hdr.find_first_not_of(" \t\r\n"), hdr.size() ) ); const auto lastNonWhitespace = hdr.find_last_not_of(" \t\r\n"); if ( lastNonWhitespace != hdr.npos ) hdr.remove_suffix( hdr.size() - (lastNonWhitespace + 1) ); else hdr = std::string_view(); auto &rmode = std::get( _runningMode ); if ( !hdr.size() ) { return ( bytes ); } if ( _expectedFileSize && rmode._partialHelper ) { const auto &repSize = rmode._partialHelper->reportedFileSize (); if ( repSize && repSize != _expectedFileSize ) { rmode._cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Reported downloaded data length is not what was expected." ); return 0; } } if ( zypp::strv::hasPrefixCI( hdr, "HTTP/" ) ) { long statuscode = 0; (void)curl_easy_getinfo( _easyHandle, CURLINFO_RESPONSE_CODE, &statuscode); // if we have a status 204 we need to create a empty file if( statuscode == 204 && !( _options & NetworkRequest::ConnectionTest ) && !( _options & NetworkRequest::HeadRequest ) ) assertOutputFile(); } else if ( zypp::strv::hasPrefixCI( hdr, "Location:" ) ) { _lastRedirect = hdr.substr( 9 ); DBG << _easyHandle << " " << "redirecting to " << _lastRedirect << std::endl; } else if ( zypp::strv::hasPrefixCI( hdr, "Content-Length:") ) { auto lenStr = str::trim( hdr.substr( 15 ), zypp::str::TRIM ); auto str = std::string ( lenStr.data(), lenStr.length() ); auto len = zypp::str::strtonum( str.data() ); if ( len > 0 ) { DBG << _easyHandle << " " << "Got Content-Length Header: " << len << std::endl; rmode._contentLenght = zypp::ByteCount(len, zypp::ByteCount::B); } } } return bytes; } size_t NetworkRequestPrivate::writefunction( char *data, std::optional offset, size_t max ) { //it is valid to call this function with no data to write, just return OK if ( max == 0) return 0; resetActivityTimer(); //in case of a HEAD request, we do not write anything if ( _options & NetworkRequest::HeadRequest ) { return ( max ); } auto &rmode = std::get( _runningMode ); // if we have no open file create or open it if ( !assertOutputFile() ) return 0; if ( offset ) { // seek to the given offset if ( fseek( rmode._outFile, *offset, SEEK_SET ) != 0 ) { rmode._cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Unable to set output file pointer." ); return 0; } rmode._currentFileOffset = *offset; } if ( _expectedFileSize && rmode._partialHelper ) { const auto &repSize = rmode._partialHelper->reportedFileSize (); if ( repSize && repSize != _expectedFileSize ) { rmode._cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::InternalError, "Reported downloaded data length is not what was expected." ); return 0; } } //make sure we do not write after the expected file size if ( _expectedFileSize && static_cast( rmode._currentFileOffset + max) > _expectedFileSize ) { rmode._cachedResult = NetworkRequestErrorPrivate::customError( NetworkRequestError::ExceededMaxLen, "Downloaded data exceeds expected length." ); return 0; } auto written = fwrite( data, 1, max, rmode._outFile ); if ( written == 0 ) return 0; // if we are not downloading in ranges, we can update the file digest on the fly if we have one if ( !rmode._partialHelper && _fileVerification ) { _fileVerification->_fileDigest.update( data, written ); } rmode._currentFileOffset += written; // count the number of real bytes we have downloaded so far rmode._downloaded += written; _sigBytesDownloaded.emit( *z_func(), rmode._downloaded ); return written; } void NetworkRequestPrivate::notifyErrorCodeChanged() { auto rmode = std::get_if( &_runningMode ); if ( !rmode || !rmode->_partialHelper || !rmode->_partialHelper->hasError() ) return; // oldest cached result wins if ( rmode->_cachedResult ) return; auto lastErr = NetworkRequestErrorPrivate::customError( rmode->_partialHelper->lastError() , std::string(rmode->_partialHelper->lastErrorMessage()) ); MIL_MEDIA << _easyHandle << " Multipart handler announced error code " << lastErr.toString () << std::endl; rmode->_cachedResult = lastErr; } ZYPP_IMPL_PRIVATE(NetworkRequest) NetworkRequest::NetworkRequest(zyppng::Url url, zypp::filesystem::Pathname targetFile, zyppng::NetworkRequest::FileMode fMode) : Base ( *new NetworkRequestPrivate( std::move(url), std::move(targetFile), std::move(fMode), *this ) ) { } NetworkRequest::~NetworkRequest() { Z_D(); if ( d->_dispatcher ) d->_dispatcher->cancel( *this, "Request destroyed while still running" ); } void NetworkRequest::setExpectedFileSize( zypp::ByteCount expectedFileSize ) { d_func()->_expectedFileSize = std::move( expectedFileSize ); } zypp::ByteCount NetworkRequest::expectedFileSize() const { return d_func()->_expectedFileSize; } void NetworkRequest::setPriority( NetworkRequest::Priority prio, bool triggerReschedule ) { Z_D(); d->_priority = prio; if ( state() == Pending && triggerReschedule && d->_dispatcher ) d->_dispatcher->reschedule(); } NetworkRequest::Priority NetworkRequest::priority() const { return d_func()->_priority; } void NetworkRequest::setOptions( Options opt ) { d_func()->_options = opt; } NetworkRequest::Options NetworkRequest::options() const { return d_func()->_options; } void NetworkRequest::addRequestRange(size_t start, size_t len, std::optional &&digest, CheckSumBytes expectedChkSum , std::any userData, std::optional digestCompareLen, std::optional chksumpad ) { Z_D(); if ( state() == Running ) return; d->_requestedRanges.push_back( Range::make( start, len, std::move(digest), std::move( expectedChkSum ), std::move( userData ), digestCompareLen, chksumpad ) ); } void NetworkRequest::addRequestRange(zyppng::NetworkRequest::Range &&range ) { Z_D(); if ( state() == Running ) return; d->_requestedRanges.push_back( std::move(range) ); auto &rng = d->_requestedRanges.back(); rng._rangeState = CurlMultiPartHandler::Pending; rng.bytesWritten = 0; if ( rng._digest ) rng._digest->reset(); } bool NetworkRequest::setExpectedFileChecksum( const zypp::CheckSum &expected ) { Z_D(); if ( state() == Running ) return false; zypp::Digest fDig; if ( !fDig.create( expected.type () ) ) return false; d->_fileVerification = NetworkRequestPrivate::FileVerifyInfo{ ._fileDigest = std::move(fDig), ._fileChecksum = expected }; return true; } void NetworkRequest::resetRequestRanges() { Z_D(); if ( state() == Running ) return; d->_requestedRanges.clear(); } std::vector NetworkRequest::failedRanges() const { const auto mystate = state(); if ( mystate != Finished && mystate != Error ) return {}; Z_D(); std::vector failed; for ( auto &r : d->_requestedRanges ) { if ( r._rangeState != CurlMultiPartHandler::Finished ) { failed.push_back( r.clone() ); } } return failed; } const std::vector &NetworkRequest::requestedRanges() const { return d_func()->_requestedRanges; } const std::string &NetworkRequest::lastRedirectInfo() const { return d_func()->_lastRedirect; } void *NetworkRequest::nativeHandle() const { return d_func()->_easyHandle; } std::optional NetworkRequest::timings() const { const auto myerr = error(); const auto mystate = state(); if ( mystate != Finished ) return {}; Timings t; auto getMeasurement = [ this ]( const CURLINFO info, std::chrono::microseconds &target ){ using FPSeconds = std::chrono::duration; double val = 0; const auto res = curl_easy_getinfo( d_func()->_easyHandle, info, &val ); if ( CURLE_OK == res ) { target = std::chrono::duration_cast( FPSeconds(val) ); } }; getMeasurement( CURLINFO_NAMELOOKUP_TIME, t.namelookup ); getMeasurement( CURLINFO_CONNECT_TIME, t.connect); getMeasurement( CURLINFO_APPCONNECT_TIME, t.appconnect); getMeasurement( CURLINFO_PRETRANSFER_TIME , t.pretransfer); getMeasurement( CURLINFO_TOTAL_TIME, t.total); getMeasurement( CURLINFO_REDIRECT_TIME, t.redirect); return t; } std::vector NetworkRequest::peekData( off_t offset, size_t count ) const { Z_D(); if ( !std::holds_alternative( d->_runningMode) ) return {}; const auto &rmode = std::get( d->_runningMode ); return zypp::io::peek_data_fd( rmode._outFile, offset, count ); } Url NetworkRequest::url() const { return d_func()->_url; } void NetworkRequest::setUrl(const Url &url) { Z_D(); if ( state() == NetworkRequest::Running ) return; d->_url = url; } const zypp::filesystem::Pathname &NetworkRequest::targetFilePath() const { return d_func()->_targetFile; } void NetworkRequest::setTargetFilePath( const zypp::filesystem::Pathname &path ) { Z_D(); if ( state() == NetworkRequest::Running ) return; d->_targetFile = path; } NetworkRequest::FileMode NetworkRequest::fileOpenMode() const { return d_func()->_fMode; } void NetworkRequest::setFileOpenMode( FileMode mode ) { Z_D(); if ( state() == NetworkRequest::Running ) return; d->_fMode = std::move( mode ); } std::string NetworkRequest::contentType() const { char *ptr = NULL; if ( curl_easy_getinfo( d_func()->_easyHandle, CURLINFO_CONTENT_TYPE, &ptr ) == CURLE_OK && ptr ) return std::string(ptr); return std::string(); } zypp::ByteCount NetworkRequest::reportedByteCount() const { return std::visit([](auto& arg) -> zypp::ByteCount { using T = std::decay_t; if constexpr (std::is_same_v || std::is_same_v ) return zypp::ByteCount(0); else if constexpr (std::is_same_v || std::is_same_v) return arg._contentLenght; else static_assert(always_false::value, "Unhandled state type"); }, d_func()->_runningMode); } zypp::ByteCount NetworkRequest::downloadedByteCount() const { return std::visit([](auto& arg) -> zypp::ByteCount { using T = std::decay_t; if constexpr (std::is_same_v) return zypp::ByteCount(); else if constexpr (std::is_same_v || std::is_same_v || std::is_same_v) return arg._downloaded; else static_assert(always_false::value, "Unhandled state type"); }, d_func()->_runningMode); } TransferSettings &NetworkRequest::transferSettings() { return d_func()->_settings; } NetworkRequest::State NetworkRequest::state() const { return std::visit([this](auto& arg) { using T = std::decay_t; if constexpr (std::is_same_v) return Pending; else if constexpr (std::is_same_v || std::is_same_v ) return Running; else if constexpr (std::is_same_v) { if ( std::get( d_func()->_runningMode )._result.isError() ) return Error; else return Finished; } else static_assert(always_false::value, "Unhandled state type"); }, d_func()->_runningMode); } NetworkRequestError NetworkRequest::error() const { const auto s = state(); if ( s != Error && s != Finished ) return NetworkRequestError(); return std::get( d_func()->_runningMode)._result; } std::string NetworkRequest::extendedErrorString() const { if ( !hasError() ) return std::string(); return error().nativeErrorString(); } bool NetworkRequest::hasError() const { return error().isError(); } bool NetworkRequest::addRequestHeader( const std::string &header ) { Z_D(); curl_slist *res = curl_slist_append( d->_headers ? d->_headers.get() : nullptr, header.c_str() ); if ( !res ) return false; if ( !d->_headers ) d->_headers = std::unique_ptr< curl_slist, decltype (&curl_slist_free_all) >( res, &curl_slist_free_all ); return true; } const zypp::Pathname &NetworkRequest::cookieFile() const { return d_func()->_currentCookieFile; } void NetworkRequest::setCookieFile(zypp::Pathname cookieFile ) { d_func()->_currentCookieFile = std::move(cookieFile); } SignalProxy NetworkRequest::sigStarted() { return d_func()->_sigStarted; } SignalProxy NetworkRequest::sigBytesDownloaded() { return d_func()->_sigBytesDownloaded; } SignalProxy NetworkRequest::sigProgress() { return d_func()->_sigProgress; } SignalProxy NetworkRequest::sigFinished() { return d_func()->_sigFinished; } } libzypp-17.36.5/zypp-curl/ng/network/request.h000066400000000000000000000235251476576476200213300ustar00rootroot00000000000000#ifndef ZYPP_NG_MEDIA_CURL_REQUEST_H_INCLUDED #define ZYPP_NG_MEDIA_CURL_REQUEST_H_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zypp { class Digest; class CheckSum; namespace media { class AuthData; } } namespace zyppng { using AuthData = zypp::media::AuthData; class NetworkRequestDispatcher; class NetworkRequestPrivate; /*! * Represents a (http/https/ftp) request. This is the low level API for the * \sa zyppng::Downloader , usually it makes more sense to use the Downloader for the * more features it supports. * After creating a NetworkRequest and changing the required settings is enqueued * to the \sa zyppng::NetworkRequestDispatcher. */ class LIBZYPP_NG_EXPORT NetworkRequest : public Base { public: using Ptr = std::shared_ptr; using WeakPtr = std::weak_ptr; using DigestPtr = std::shared_ptr; using CheckSumBytes = UByteArray; enum State { Pending, //< waiting to be dispatched Running, //< currently running Finished, //< finished successfully Error, //< Error, use error function to figure out the issue }; enum Priority { Normal, //< Requests with normal priority will be enqueued as they come in High, //< Request with high priority will be moved to the front of the queue Critical = 100, //< Those requests will be enqueued as fast as possible, even before High priority requests, this should be used only if requests needs to start immediately }; enum FileMode { WriteExclusive, //< the request will create its own file, overwriting anything that already exists WriteShared //< the request will create or open the file in shared mode and only write between \a start and \a len }; enum OptionBits { Default = 0x00, //< no special options, just do a normal download HeadRequest = 0x01, //< only request the header part of the file ConnectionTest = 0x02 //< only connect to collect connection speed information }; ZYPP_DECLARE_FLAGS(Options, OptionBits); using Range = CurlMultiPartHandler::Range; struct Timings { std::chrono::microseconds namelookup; std::chrono::microseconds connect; std::chrono::microseconds appconnect; std::chrono::microseconds pretransfer; std::chrono::microseconds total; std::chrono::microseconds redirect; }; /*! * \param url The source URL of the download * \param targetFile The path where the file should be stored * \param fMode The mode in which the file is opened in. */ NetworkRequest(Url url, zypp::Pathname targetFile, FileMode fMode = WriteExclusive ); ~NetworkRequest() override; /*! * Sets the expected file size for the download. * In case of a Multi-Range-Download the \a NetworkRequest will check if the download * would write behind the expectedFileSize and fail. */ void setExpectedFileSize ( zypp::ByteCount expectedFileSize ); zypp::ByteCount expectedFileSize() const; /*! * Sets the priority of the NetworkRequest, this will affect where * the \sa NetworkRequestDispatcher puts the Request in the Queue. * \note changing this makes only sense in Pending state. */ void setPriority ( Priority prio, bool triggerReschedule = true ); /*! * Returns the requested priority of the NetworkRequest */ Priority priority ( ) const; /*! * Change request options. * * \note changing this makes only sense before the request was started */ void setOptions ( Options opt ); /*! * Returns the currently set options */ Options options () const; /*! * Adds a new range to the requested range list, the ranges can not overlap * \note This will not change a running download */ void addRequestRange ( size_t start, size_t len = 0, std::optional &&digest = {}, CheckSumBytes expectedChkSum = CheckSumBytes(), std::any userData = std::any(), std::optional digestCompareLen = {}, std::optional chksumpad = {} ); void addRequestRange ( Range &&range ); /*! * Sets the expected checksum for the full file. * \note This will not change a running download */ bool setExpectedFileChecksum( const zypp::CheckSum &expected ); /*! * Clears all requested ranges, the next download will get the complete file * \note This will not change a running download */ void resetRequestRanges ( ); std::vector failedRanges () const; const std::vector &requestedRanges () const; /*! * Returns the last redirect information from the headers. */ const std::string &lastRedirectInfo() const; /*! * Returns a pointer to the native CURL easy handle * * \note consider adding the functionality here instead of using the Handle directly. * In case we ever decide to switch out the CURL backend your code will break */ void *nativeHandle () const; /** * After the request is finished query the timings that were collected * during download */ std::optional timings () const; /*! * Will return the data at \a offset with length \a count. * If there is not yet enough data a empty vector will be returned */ std::vector peekData ( off_t offset, size_t count ) const; /*! * Returns the request URL */ Url url () const; /** * This will change the URL of the request. * \note calling this on a currently running request has no impact */ void setUrl ( const Url & url ); /** * Returns the target filename path */ const zypp::Pathname & targetFilePath () const; /** * Changes the target file path of the download * \note calling this on a currently running request has no impact */ void setTargetFilePath ( const zypp::Pathname &path ); /** * Returns the currently configured file open mode */ FileMode fileOpenMode () const; /** * Sets the file open mode to \a mode. * \note calling this on a currently running request has no impact */ void setFileOpenMode ( FileMode mode ); /** * Returns the content type as reported from the server * \note can only return a valid value if the download has started already */ std::string contentType () const; /** * Returns the number of bytes that are reported from the backend as the full download size, those can * be 0 even when the download is already running. * \note When downloading ranges, the reported byte count could be reported just partially due to * range batching. */ zypp::ByteCount reportedByteCount() const; /** * Returns the number of already downloaded bytes as reported by the backend */ zypp::ByteCount downloadedByteCount() const; /*! * Returns a writeable reference to the internal \sa zyppng::TransferSettings. * \note calling this on a already running request has no impact */ TransferSettings &transferSettings (); /** * Returns the current state the \a HttpDownloadRequest is in */ State state () const; /** * Returns the last set Error */ NetworkRequestError error () const; /** * In some cases, curl can provide extended error information collected at * runtime. In those cases, it is possible to query that information. */ std::string extendedErrorString() const; /** * Checks if there was a error with the request */ bool hasError () const; /*! * Adds a raw header to the request data. Use this to send custom headers * to the server. */ bool addRequestHeader(const std::string &header ); /*! * Return the currently used path for the cookie file */ const zypp::Pathname &cookieFile() const; /*! * Set path to use for the cookie file if enabled via TransferSettings. * \note calling this on a already running request has no impact */ void setCookieFile( zypp::Pathname cookieFile ); /** * Signals that the dispatcher dequeued the request and actually starts downloading data */ SignalProxy sigStarted (); /** * Signals that new data has been downloaded, this is only the payload and does not include control data bytes */ SignalProxy sigBytesDownloaded (); /** * Signals if there was data read from the download * \note this signals the raw numbers of bytes that were downloaded, for the number of payload data bytes ( excluding control data ) * use \ref downloadedByteCount */ SignalProxy sigProgress (); /** * Signals that the download finished. * * \note After this signal was emitted the Curl handle is reset, * so all queries to it need to be done in a Slot connected to this signal */ SignalProxy sigFinished ( ); private: friend class NetworkRequestDispatcher; friend class NetworkRequestDispatcherPrivate; ZYPP_DECLARE_PRIVATE( NetworkRequest ) }; } ZYPP_DECLARE_OPERATORS_FOR_FLAGS(zyppng::NetworkRequest::Options); #endif libzypp-17.36.5/zypp-curl/ng/network/transfersettings.h000066400000000000000000000016401476576476200232370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_MEDIA_HTTP_TRANSFERSETTINGS_H_INCLUDED #define ZYPPNG_MEDIA_HTTP_TRANSFERSETTINGS_H_INCLUDED #include namespace zyppng { using TransferSettings = zypp::media::TransferSettings; } #endif libzypp-17.36.5/zypp-curl/ng/network/zckhelper.cc000066400000000000000000000202171476576476200217600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include "zckhelper.h" #include #include #include #include extern "C" { #include } namespace zyppng { bool ZckHelper::isZchunkFile(const zypp::Pathname &file) { std::ifstream dFile(file.c_str()); if (!dFile.is_open()) return false; constexpr std::string_view magic("\0ZCK1", 5); std::array lead; lead.fill('\0'); dFile.read(lead.data(), lead.size()); return (magic == std::string_view(lead.data(), lead.size())); } ZckHelper::PrepareResult ZckHelper::prepareZck( const zypp::Pathname &delta, const zypp::Pathname &target, const zypp::ByteCount &expectedFileSize ) { const auto &setFailed = []( PrepareResult::Code code, std::string message ){ return PrepareResult { ._code = code, ._blocks = std::vector(), ._bytesReused = 0, ._message = std::move(message), }; }; zypp::AutoFD src_fd = open( delta.asString().c_str(), O_RDONLY); if(src_fd < 0) return setFailed ( PrepareResult::Error, zypp::str::Format("Unable to open %1%") % delta ); zypp::AutoDispose zck_src ( zck_create(), []( auto ptr ) { if ( ptr ) zck_free( &ptr ); } ); if( !zck_src ) return setFailed ( PrepareResult::Error, zypp::str::Format("%1%") % zck_get_error(NULL) ); if(!zck_init_read(zck_src, src_fd)) return setFailed ( PrepareResult::Error, zypp::str::Format( "Unable to open %1%: %2%") % delta % zck_get_error(zck_src) ); zypp::AutoFD target_fd = open( target.asString().c_str(), O_RDWR); if(target_fd < 0) return setFailed ( PrepareResult::Error, zypp::str::Format("Unable to open %1%") % target ); zypp::AutoDispose zckTarget ( zck_create(), []( auto ptr ) { if ( ptr ) zck_free( &ptr ); } ); if( !zckTarget ) return setFailed ( PrepareResult::Error, zypp::str::Format("%1%") % zck_get_error(NULL) ); if(!zck_init_read(zckTarget, target_fd)) return setFailed ( PrepareResult::Error, zypp::str::Format( "Unable to open %1%: %2%") % target % zck_get_error(zckTarget) ); // Returns 0 for error, -1 for invalid checksum and 1 for valid checksum switch ( zck_find_valid_chunks(zckTarget) ) { case 0: // Returns 0 if there was a error return setFailed ( PrepareResult::Error, zypp::str::Format( "Unable to open %1%: %2%") % target % zck_get_error(zckTarget) ); case 1: // getting a 1 would mean the file is already complete, basically impossible but lets handle it anyway return PrepareResult { ._code = PrepareResult::NothingToDo }; } const auto srcHashType = zck_get_chunk_hash_type( zckTarget ); const auto targetHashType = zck_get_chunk_hash_type( zckTarget ); auto _fileSize = expectedFileSize; const size_t fLen = zck_get_length( zckTarget ); if ( expectedFileSize > 0 ) { // check if the file size as reported by zchunk is equal to the one we expect if ( expectedFileSize != fLen ) { return setFailed( PrepareResult::ExceedsMaxLen, zypp::str::Format("Zchunk header reports a different filesize than what was expected ( Zck: %1% != Exp: %2%).") % fLen % _fileSize ); } } else { _fileSize = fLen; } if( srcHashType != targetHashType ) return setFailed ( PrepareResult::Error, zypp::str::Format( "ERROR: Chunk hash types don't match. Source Hash: %1% vs Target Hash: %2%") % zck_hash_name_from_type ( srcHashType ) % zck_hash_name_from_type ( targetHashType ) ); std::vector ranges; if(!zck_copy_chunks( zck_src, zckTarget )) return setFailed ( PrepareResult::Error, zypp::str::Format( "Unable to copy chunks from deltafile.") ); // we calculate what is already downloaded by substracting the block sizes we still need to download from the full file size auto bytesReused = _fileSize; auto chunk = zck_get_first_chunk( zckTarget ); do { // Get validity of current chunk: 1 = valid, 0 = missing, -1 = invalid if ( zck_get_chunk_valid( chunk ) == 1 ) continue; zypp::AutoFREE zckDigest( zck_get_chunk_digest( chunk ) ); UByteArray chksumVec = zypp::Digest::hexStringToUByteArray( std::string_view( zckDigest.value() ) ); std::string chksumName; std::optional chksumCompareLen; switch ( targetHashType ) { case ZCK_HASH_SHA1: { chksumName = zypp::Digest::sha1(); break; } case ZCK_HASH_SHA256: { chksumName = zypp::Digest::sha256(); break; } case ZCK_HASH_SHA512: { chksumName = zypp::Digest::sha512(); break; } case ZCK_HASH_SHA512_128: { // defined in zchunk as // SHA-512/128 (first 128 bits of SHA-512 checksum) chksumName = zypp::Digest::sha512(); chksumCompareLen = chksumVec.size(); break; } default: { return setFailed ( PrepareResult::Error, zypp::str::Format( "Unsupported chunk hash type: %1%.") % zck_hash_name_from_type( targetHashType ) ); } } const auto s = static_cast( zck_get_chunk_start( chunk ) ); const auto l = static_cast( zck_get_chunk_comp_size ( chunk ) ); MIL_MEDIA << "Downloading block " << s << " with length " << l << " checksum " << zckDigest.value() << " type " << chksumName << std::endl; ranges.push_back( Block { ._start = s, ._len = l, ._chksumtype = chksumName, ._checksum = std::move( chksumVec ), ._relevantDigestLen = std::move(chksumCompareLen) } ); // substract the block length from the already downloaded bytes size bytesReused -= l; } while ( (chunk = zck_get_next_chunk( chunk )) ); return PrepareResult { ._code = PrepareResult::Success, ._blocks = std::move(ranges), ._bytesReused = std::move(bytesReused), ._message = std::string() }; } bool ZckHelper::validateZckFile(const zypp::Pathname &file, std::string &error) { const auto &setFailed = [&]( std::string &&err ) { error = std::move(err); return false; }; zypp::AutoFD target_fd = open( file.asString().c_str(), O_RDONLY ); if( target_fd < 0 ) return setFailed ( zypp::str::Format("Unable to open %1%") % file ); zypp::AutoDispose zckTarget ( zck_create(), []( auto ptr ) { if ( ptr ) zck_free( &ptr ); } ); if( !zckTarget ) return setFailed ( zypp::str::Format("%1%") % zck_get_error(nullptr) ); if(!zck_init_read(zckTarget, target_fd)) return setFailed ( zypp::str::Format( "Unable to open %1%: %2%") % file % zck_get_error(zckTarget) ); /* Validate the chunk and data checksums for the current file. * Returns 0 for error, -1 for invalid checksum and 1 for valid checksum */ const auto res = zck_validate_checksums( zckTarget ); if ( res == 0 || res == -1 ) { if( zck_is_error(nullptr) ) { std::string err = zck_get_error(NULL); zck_clear_error(NULL); return setFailed( std::move(err) ); } if( zck_is_error(zckTarget) ) return setFailed( zck_get_error(zckTarget) ); return setFailed( "zck_validate_checksums returned a unknown error." ); } return true; } } // namespace zyppng libzypp-17.36.5/zypp-curl/ng/network/zckhelper.h000066400000000000000000000037361476576476200216310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPPNG_CURL_ZCKHELPER_H_INCLUDED #define ZYPPNG_CURL_ZCKHELPER_H_INCLUDED #include #include namespace zyppng { class ZckHelper { public: using Block = RangeDesc; struct PrepareResult { enum Code { Error, // we got an error NothingToDo, // Target file is already complete ExceedsMaxLen, // Zchunk header reports a different filesize than what was expected Success // Returns a list of blocks to fetch }; Code _code; std::vector _blocks; zypp::ByteCount _bytesReused; std::string _message; }; /*! * Checks if a given file is a zck file */ static bool isZchunkFile(const zypp::Pathname &file); /*! * Prepares the file in \a target with already existing chunks in \a delta. The \a target file must * already contain the zck header data of the to be downloaded file. */ static PrepareResult prepareZck ( const zypp::Pathname &delta, const zypp::Pathname &target, const zypp::ByteCount &expectedFileSize ); /*! * Checks if a given zck file is internally valid */ static bool validateZckFile( const zypp::Pathname &file, std::string &error ); }; } #endif libzypp-17.36.5/zypp-curl/parser/000077500000000000000000000000001476576476200166575ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/parser/MediaBlockList000066400000000000000000000000341476576476200214250ustar00rootroot00000000000000#include "mediablocklist.h" libzypp-17.36.5/zypp-curl/parser/MetaLinkParser000066400000000000000000000000341476576476200214600ustar00rootroot00000000000000#include "metalinkparser.h" libzypp-17.36.5/zypp-curl/parser/ZsyncParser000066400000000000000000000000311476576476200210570ustar00rootroot00000000000000#include "zsyncparser.h" libzypp-17.36.5/zypp-curl/parser/mediablocklist.cc000066400000000000000000001111611476576476200221550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/parser/mediablocklist.cc This file implements the delta file block reuse algorithm. If the available hashes use rolling checksum style hashes, we use the zsync algorithm to search for blocks that are available. The basic idea of zsync is that on the server side a metadata file is generated, this file contains a list of checksums for each block in the target file ( the file we want to download ) as well as some other important informations like the size of the blocks, file checksum and mirrors. The client ( we ) then can use a delta file, basically a older version of the file we want to download, to find reusable blocks identified by their checksum. A simple approach would be now to calculate all checksums in the delta file for each block, but that does not take into account that the blocks we want to reuse have moved in the file, e.g. a new set bytes of data was put in the beginning of the file, shifting all blocks to a new offset most likely not as a multiple of blocksize or worse not even a power of 2. Think a block is 2k but the data inserted is only 200 bytes, offsetting all blocks for 200bytes, in that case the simple approach could not reuse a single block of data because it can't find them. To work around this problem the code calculates the checksums on every possible byte offset of the delta file. To speed this process up when finding a block we skip forward to the end of the block. If there is a match at x, its very unlikely to find another match starting inside the boundaries of the current block ( between x and x + blocksize - 1 ), except if the file has a lot of redundancy. This process naturally can take very long if there are no, or just a few matching blocks in the two files. To speed this up a multi step checksum process is used. First we calculate a very cheap to calculate weak checksum for each block based on the Adler-32 checksum: \f[ a(k,l) = (\sum_{i=k}^l X_i) \bmod M \f] \f[ \begin{align} b(k,l) &= (\sum_{i=k}^l (l-i+1)X_i) \bmod M \\ &= (\sum_{i=k}^l a(k,i) ) \bmod M \end{align} \f] \f[ s(k,l) = a(k,l) + 2^{16} b(k,l) \f] where \f$s(k, l)\f$ is the rolling checksum of the bytes \f$X_k \ldots X_l\f$. For simplicity and speed, we use \f$M = 2^{16}\f$. The important property of this checksum is that successive values can be computed very efficiently using recurrence relations: \f[ a(k+1,l+1) = (a(k,l) - X_k + X_{l+1}) \bmod M \f] \f[ b(k+1,l+1) = (b(k,l) - (l-k+1) X_k + a(k+1,l+1)) \bmod M \f] To understand why we can use recurrence relations its important to look at the formulas written out for a simple example, we will ignore the modulo operation for simplicity: For the \a a formula is simple to see that we just need to subtract the value of the byte moving out of the block and add the value of the new byte coming in at the end \f[ \begin{align} a(0,2) &= X_0 + X_1 + X_2 \\ a(1,3) &= a(0,2) - X_0 + X_3 \\ &= X_0 + X_1 + X_2 - X_0 + X_3 \\ &= X_1 + X_2 + X_3 \end{align} \f] The \a b part is a bit more complex, writing the formula out also shows us why \a b can be expressed as: \f$b=(\sum_{i=k}^l a(k,i) ) \bmod M\f$: \f[ \begin{align} b(0,2) &= 3X_0 + 2X_1 + X_2 \\ &= X_0 + X_0 +X_0 + X_1 + X_1 + X_2 \\ &= X0 + X0 + X1 + X0 +X1 +X2 \\ &= a(0,0) + a(0,1) + a(0,2) = (\sum_{i=k}^l a(k,i) ) \end{align} \f] \f[ \begin{align} b(1,3) &= b(0,2) - (2-0+1)X_0 + a(1,3) \\ &= b(0,2) - 3X_0 + a(1,3) \\ &= 3X_0 + 2X_1 + X_2 - 3X_0 + X_1 + X_2 + X_3 \\ &= 3X_1 + 2X_2 + X_3 \end{align} \f] This shows us that we can very quickly calculate the new checksum of a block at offset \a i+1 based on the checksum of the block at offset \a i. If the weak checksum matches, a stronger MD4 checksum is calculated for the same block to make sure we really got the block we wanted. If the strong checksum matches as well the block is written to the target file and removed from the list of blocks we still need to find. The read offset then jumps to the end of the current bock: \a offset+blocksize and continues the process from there. Zsync additionally can require that always a sequence of 2 neighboring blocks need to match before they are considered a match. This depends on the filesize and is specified in the zsync metadata file. According to the zsync docs this greatly lowers the probability of a false match and allows to send smaller checksums for the blocks, minimizing the data we need to download in the meta datafile. More in depth docs can be found at http://zsync.moria.org.uk/paper and https://rsync.samba.org/tech_report */ #include "mediablocklist.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace zypp::base; namespace zypp { namespace media { namespace { struct rsum { unsigned short a = 0; unsigned short b = 0; } __attribute__((packed)); /* rcksum_calc_rsum_block(data, data_len) * Calculate the rsum for a single block of data. */ rsum rcksum_calc_rsum_block(const unsigned char *data, size_t len) { unsigned short a = 0; unsigned short b = 0; while (len) { unsigned char c = *data++; a += c; b += len * c; len--; } return rsum{ a, b }; } // update the rsum by removing the old and adding the new char #define UPDATE_RSUM(a, b, oldc, newc, bshift) do { (a) += ((unsigned char)(newc)) - ((unsigned char)(oldc)); (b) += (a) - ((oldc) << (bshift)); } while (0) /** * Zsync uses a different rsum length based on the blocksize, since we always calculate the big * checksum we need to cut off the bits we are not interested in */ void inline truncateRsum ( unsigned int &rs, const int rsumlen ) { switch(rsumlen) { case 3: rs &= 0xffffff; break; case 2: rs &= 0xffff; break; case 1: rs &= 0xff; break; default: break; } } } MediaBlockList::MediaBlockList(off_t size) : filesize(size), haveblocks(false), chksumlen(0), chksumpad(0), rsumlen(0), rsumseq(0), rsumpad(0) { } size_t MediaBlockList::addBlock(off_t off, size_t size) { haveblocks = true; blocks.push_back(MediaBlock( off, size )); return blocks.size() - 1; } void MediaBlockList::setFileChecksum(std::string ctype, int cl, unsigned char *c) { if (!cl) return; fsumtype = std::move(ctype); fsum.resize(cl); memcpy(&fsum[0], c, cl); } std::string MediaBlockList::fileChecksumType() const { return fsumtype; } const UByteArray &MediaBlockList::getFileChecksum() { return fsum; } bool MediaBlockList::createFileDigest(Digest &digest) const { return digest.create(fsumtype); } bool MediaBlockList::verifyFileDigest(Digest &digest) const { if (!haveFileChecksum()) return true; std::vectordig = digest.digestVector(); if (dig.empty() || dig.size() < fsum.size()) return false; return memcmp(&dig[0], &fsum[0], fsum.size()) ? false : true; } void MediaBlockList::setChecksum(size_t blkno, const std::string& cstype, int csl, unsigned char *cs, size_t cspad) { if (!csl) return; if (!chksumlen) { if (blkno) return; chksumlen = csl; chksumtype = cstype; chksumpad = cspad; } if (csl != chksumlen || cstype != chksumtype || cspad != chksumpad || blkno != chksums.size() / chksumlen) return; chksums.resize(chksums.size() + csl); memcpy(&chksums[csl * blkno], cs, csl); } void MediaBlockList::setRsum(size_t blkno, int rsl, unsigned int rs, size_t rspad) { if (!rsl) return; if (!rsumlen) { if (blkno) return; rsumlen = rsl; rsumpad = rspad; } if (rsl != rsumlen || rspad != rsumpad || blkno != rsums.size()) return; rsums.push_back(rs); } void MediaBlockList::setRsumSequence( uint seq ) { rsumseq = seq; } bool MediaBlockList::createDigest(Digest &digest) const { return digest.create(chksumtype); } bool MediaBlockList::verifyDigest(size_t blkno, Digest &digest) const { if (!haveChecksum(blkno)) return true; size_t size = blocks[blkno].size; if (!size) return true; if (chksumpad > size) { char pad[chksumpad - size]; memset(pad, 0, chksumpad - size); digest.update(pad, chksumpad - size); } std::vectordig = digest.digestVector(); if (dig.empty() || dig.size() < size_t(chksumlen)) return false; return memcmp(&dig[0], &chksums[chksumlen * blkno], chksumlen) ? false : true; } unsigned int MediaBlockList::updateRsum(unsigned int rs, const char* bytes, size_t len) const { if (!len) return rs; unsigned short s = 0, m = 0; s = (rs >> 16) & 65535; m = rs & 65535; for (; len > 0 ; len--) { unsigned short c = (unsigned char)*bytes++; s += c; m += s; } return (s & 65535) << 16 | (m & 65535); } bool MediaBlockList::verifyRsum(size_t blkno, unsigned int rs) const { if (!haveRsum(blkno)) return true; size_t size = blocks[blkno].size; if (!size) return true; if (rsumpad > size) { unsigned short s = 0, m = 0; s = (rs >> 16) & 65535; m = rs & 65535; m += s * (rsumpad - size); rs = (s & 65535) << 16 | (m & 65535); } truncateRsum( rs, rsumlen ); return rs == rsums[blkno]; } bool MediaBlockList::checkRsum(size_t blkno, const unsigned char *buf, size_t bufl) const { if (blkno >= blocks.size() || bufl < blocks[blkno].size) return false; unsigned int rs = updateRsum(0, reinterpret_cast(buf), blocks[blkno].size); return verifyRsum(blkno, rs); } bool MediaBlockList::checkChecksum(size_t blkno, const unsigned char *buf, size_t bufl) const { if (blkno >= blocks.size() || bufl < blocks[blkno].size) return false; Digest dig; if (!createDigest(dig)) return false; dig.update(reinterpret_cast(buf), blocks[blkno].size); return verifyDigest(blkno, dig); } UByteArray MediaBlockList::getChecksum(size_t blkno) const { if ( !haveChecksum(blkno) ) return {}; UByteArray buf ( chksumlen, '\0' ); memcpy( buf.data(), chksums.data()+(chksumlen * blkno), chksumlen ); return buf; } std::string MediaBlockList::getChecksumType() const { return chksumtype; } size_t MediaBlockList::checksumPad() const { return chksumpad; } // specialized version of checkChecksum that can deal with a "rotated" buffer bool MediaBlockList::checkChecksumRotated(size_t blkno, const unsigned char *buf, size_t bufl, size_t start) const { if (blkno >= blocks.size() || bufl < blocks[blkno].size) return false; if (start == bufl) start = 0; Digest dig; if (!createDigest(dig)) return false; size_t size = blocks[blkno].size; size_t len = bufl - start > size ? size : bufl - start; dig.update(reinterpret_cast(buf) + start, len); if (size > len) dig.update(reinterpret_cast(buf), size - len); return verifyDigest(blkno, dig); } // write block to the file. can also deal with "rotated" buffers void MediaBlockList::writeBlock(size_t blkno, FILE *fp, const unsigned char *buf, size_t bufl, size_t start, std::vector &found) const { if (blkno >= blocks.size() || bufl < blocks[blkno].size) return; off_t off = blocks[blkno].off; size_t size = blocks[blkno].size; if (fseeko(fp, off, SEEK_SET)) return; if (start == bufl) start = 0; size_t len = bufl - start > size ? size : bufl - start; if (fwrite(buf + start, len, 1, fp) != 1) return; if (size > len && fwrite(buf, size - len, 1, fp) != 1) return; found[blkno] = true; found[blocks.size()] = true; } static size_t fetchnext(FILE *fp, unsigned char *bp, size_t blksize, size_t pushback, unsigned char *pushbackp) { size_t l = blksize; if (pushback) { if (pushbackp != bp) memmove(bp, pushbackp, pushback); bp += pushback; l -= pushback; } while (l) { int c = getc(fp); if (c == EOF) break; *bp++ = c; l--; } if (l) memset(bp, 0, l); return blksize - l; } void MediaBlockList::reuseBlocks(FILE *wfp, const std::string& filename) { zypp::AutoFILE fp; if ( !chksumlen ) { DBG << "Delta XFER: Can not reuse blocks because we have no chksumlen" << std::endl; return; } if ( (fp = fopen(filename.c_str(), "r")) == 0 ) { DBG << "Delta XFER: Can not reuse blocks, unable to open file "<< filename << std::endl; return; } size_t nblks = blocks.size(); std::vector found( nblks + 1 ); if (rsumlen && !rsums.empty()) { const auto rsumAMask = rsumlen < 3 ? 0 : rsumlen == 3 ? 0xff : 0xffff; // we are building a array of rsum structs to directly access a and b parts of the checksum // we make the array bigger so that the code calculating the rsum hashes does not need to care // about the array size // @TODO move that to the function adding new rsums when removing the old code auto zsyncRsumsData = std::make_unique( rsums.size() + rsumseq ); auto zsyncRsums = zsyncRsumsData.get(); for ( std::size_t i = 0; i < rsums.size(); i++ ) { const auto &rs = rsums[i]; unsigned short s = 0, m = 0; s = (rs >> 16) & 65535; m = rs & 65535; zsyncRsums[i] = rsum{ s, m }; } // we use the same code as zsync to calc the hash const auto & calc_rhash = [&]( const rsum* e ) -> unsigned { unsigned h = e[0].b; if ( this->rsumseq > 1 ) { for ( uint i = 1; i < rsumseq; i++ ) { h ^= e[i].b << 3; } } else { h ^= ( e[0].a & rsumAMask ) << 3; } return h; }; size_t blksize = blocks[0].size; if (nblks == 1 && rsumpad && rsumpad > blksize) blksize = rsumpad; // create hash of checksums // build the hashtable uint rsumHashMask = 0; { uint i = 16; /* Try hash size of 2^i; step down the value of i until we find a good size */ while ((2U << (i - 1)) > nblks && i > 4) i--; /* Allocate hash based on rsum */ rsumHashMask = (2U << i) - 1; } // a array indexed via hash with lists of blocks resulting in the same rsum hash auto rsumHashTableData = std::make_unique[]>( rsumHashMask + 1 ); auto rsumHashTable = rsumHashTableData.get(); // Now fill in the hash tables. for ( size_t id = 0; id < nblks; id++) { const auto hash = calc_rhash( &zsyncRsums[id] ); auto &hashList = rsumHashTable[ hash & rsumHashMask ]; hashList.push_back(id); } // we read in 16 sequences at once to speed up processing constexpr auto BLOCKCNT = 16; // we allocate the buffer so that we always have the data to verify 16 blocks, if we need to do // sequence matching we grow the buffer accordingly const auto readBufSize = blksize * rsumseq * BLOCKCNT; // buffer thats going to hold our cached data auto readBufData = std::make_unique( readBufSize ); memset(readBufData.get(), 0, blksize); // avoid using .get() all the time auto readBuf = readBufData.get(); // our running checksums for the blocks we need to match in sequence auto seqRsumsData = std::make_unique ( rsumseq ); auto seqRsums = seqRsumsData.get(); // use byteshift instead of multiplication if the blksize is a power of 2 // a value is a power of 2 if ( N & N-1 ) == 0 int bshift = 0; // how many bytes do we need to shift if ((blksize & (blksize - 1)) == 0) for (bshift = 0; size_t(1 << bshift) != blksize; bshift++) ; bool init = true; // when we are in a run of matches, we remember which block ID would need to match next in order // to continue writing std::optional nextReqMatchInSequence; off_t dataOffset = 0; //< Our current read offset in the buffer off_t dataLen = 0; //< The length of our read buffer // helper lambda that follows a list of hashmap entries and tries to write those that match const auto &tryWriteMatchingBlocks = [&]( const std::vector &list, const u_char *currBuf, uint reqMatches ){ // the number of blocks we have transferred to the target file int targetBlocksWritten = 0; // reset the next match hint nextReqMatchInSequence.reset(); for ( const auto blkno : list ) { if ( found[blkno] ) continue; const auto blockRsum = &zsyncRsums[blkno]; uint weakMatches = 0; // first check only the current block, we maybe can skip checking the others // if we are in a run of matches if ( (seqRsums[0].a & rsumAMask) != blockRsum[0].a || seqRsums[0].b != blockRsum[0].b ) continue; weakMatches++; for ( uint i = 1; i < reqMatches; i++ ) { if ( (seqRsums[i].a & rsumAMask) != blockRsum[i].a || seqRsums[i].b != blockRsum[i].b ) break; weakMatches++; } if ( weakMatches < reqMatches ) continue; // we have a weak match, now we need to calc the checksums for the blocks uint realMatches = 0; for( uint i = 0; i < reqMatches; i++ ) { if ( !checkChecksum(blkno + i, currBuf + ( i * blksize ), blksize ) ) { break; } realMatches++; } // check if we have the amount of matches we need ( only 1 if we are in a block sequence ) if( realMatches < reqMatches ) continue; // we found blocks that match , write them to target but keep searching the hashmap // in case we have redundancies const auto nextPossibleMatch = blkno + realMatches; if ( !found[nextPossibleMatch] ) nextReqMatchInSequence = nextPossibleMatch; // remember that we are currently in a run of matches, next iteration we just need to look at one block for( uint i = 0; i < realMatches; i++ ) { writeBlock( blkno + i, wfp, currBuf + ( i * blksize ), blksize, 0, found ); targetBlocksWritten++; } } return targetBlocksWritten; }; if (!rsumseq) rsumseq = nblks > 1 && chksumlen < 16 ? 2 : 1; const off_t seqMatchLen = ( blksize * rsumseq ); //< how many bytes do we need to match when searching a block while (! feof(fp) ) { if ( init ) { // fill the buffer for the first time dataLen = fread( readBuf, 1, readBufSize, fp ); init = false; } else { // move the remaining data to the begin and read from the file to fill up the buffer again const auto remainLen = dataLen-dataOffset; if ( remainLen ) memmove( readBuf, readBuf+dataOffset, remainLen ); dataLen = fread( readBuf+remainLen, 1, readBufSize-remainLen, fp ); dataLen += remainLen; dataOffset = 0; } // if we hit eof, pad with zeros if ( feof(fp) ) { memset( readBuf + dataLen, 0, readBufSize - dataLen ); dataLen = readBufSize; } if ( dataLen < seqMatchLen ) return; // intialize our first set of checksums for( uint i = 0; i < rsumseq; i++ ) seqRsums[i] = rcksum_calc_rsum_block( readBuf + ( i * blksize ), blksize ); //read over the buffer we have allocated so far while ( true ) { if ( dataOffset + seqMatchLen > dataLen ) break; u_char *currBuf = readBuf + dataOffset; // the number of deltafile blocks we have matched, e.g. how much blocks // can we skip forward uint deltaBlocksMatched = 0; if ( nextReqMatchInSequence.has_value() ) { if ( tryWriteMatchingBlocks( { *nextReqMatchInSequence }, currBuf, 1 ) > 0 ) deltaBlocksMatched = 1; } else { const auto hash = calc_rhash( seqRsums ); // reference to the list of blocks that share our calculated hash auto &blockListForHash = rsumHashTable[ hash & rsumHashMask ]; if ( blockListForHash.size() ) { if ( tryWriteMatchingBlocks( blockListForHash, currBuf, rsumseq ) > 0 ) deltaBlocksMatched = rsumseq; } } if ( deltaBlocksMatched > 0 ) { // we jump forward in the buffer to after what we matched dataOffset += ( deltaBlocksMatched * blksize ); if ( dataOffset + seqMatchLen > dataLen ) break; if ( deltaBlocksMatched < rsumseq ) { //@TODO move the rsums we already have } for( uint i = 0; i < rsumseq; i++ ) seqRsums[i] = rcksum_calc_rsum_block( readBuf + dataOffset + ( i * blksize ), blksize ); } else { // we found nothing advance the window by one byte and update the rsums dataOffset++; if ( dataOffset + seqMatchLen > dataLen ) break; for ( uint i = 0; i < rsumseq; i++ ) { const auto blkOff = ( i*blksize ); u_char oldC = (currBuf + blkOff)[0]; u_char newC = (currBuf + blkOff)[blksize]; UPDATE_RSUM( seqRsums[i].a, seqRsums[i].b, oldC, newC, bshift ); } } } } } else if (chksumlen >= 16) { // dummy variant, just check the checksums size_t bufl = 4096; off_t off = 0; auto buf = std::make_unique( bufl ); for (size_t blkno = 0; blkno < blocks.size(); ++blkno) { if (off > blocks[blkno].off) continue; size_t blksize = blocks[blkno].size; if (blksize > bufl) { bufl = blksize; buf = std::make_unique( bufl ); } size_t skip = blocks[blkno].off - off; while (skip) { size_t l = skip > bufl ? bufl : skip; if (fread(buf.get(), l, 1, fp) != 1) break; skip -= l; off += l; } if (fread(buf.get(), blksize, 1, fp) != 1) break; if (checkChecksum(blkno, buf.get(), blksize)) writeBlock(blkno, wfp, buf.get(), blksize, 0, found); off += blksize; } } if (!found[nblks]) { DBG << "Delta XFER: No reusable blocks found for " << filename << std::endl; return; } // now throw out all of the blocks we found std::vector nblocks; std::vector nchksums; std::vector nrsums; size_t originalSize = 0; size_t newSize = 0; for (size_t blkno = 0; blkno < blocks.size(); ++blkno) { const auto &blk = blocks[blkno]; originalSize += blk.size; if (!found[blkno]) { // still need it nblocks.push_back(blk); newSize += blk.size; if (chksumlen && (blkno + 1) * chksumlen <= chksums.size()) { nchksums.resize(nblocks.size() * chksumlen); memcpy(&nchksums[(nblocks.size() - 1) * chksumlen], &chksums[blkno * chksumlen], chksumlen); } if (rsumlen && (blkno + 1) <= rsums.size()) nrsums.push_back(rsums[blkno]); } } DBG << "Delta XFER: Found blocks to reuse, " << blocks.size() << " vs " << nblocks.size() << ", resused blocks: " << blocks.size() - nblocks.size() << "\n" << "Old transfer size: " << originalSize << " new size: " << newSize << std::endl; blocks = nblocks; chksums = nchksums; rsums = nrsums; } void MediaBlockList::reuseBlocksOld(FILE *wfp, const std::string& filename) { zypp::AutoFILE fp; if ( !chksumlen ) { DBG << "Delta XFER: Can not reuse blocks because we have no chksumlen" << std::endl; return; } if ( (fp = fopen(filename.c_str(), "r")) == 0 ) { DBG << "Delta XFER: Can not reuse blocks, unable to open file "<< filename << std::endl; return; } size_t nblks = blocks.size(); std::vector found; found.resize(nblks + 1); if (rsumlen && !rsums.empty()) { size_t blksize = blocks[0].size; if (nblks == 1 && rsumpad && rsumpad > blksize) blksize = rsumpad; // create hash of checksums // calculate the size of the hashtable by setting // all bits to 1 up the to currently set MSB // if we have 00010010 we end up with 00011111 unsigned int hm = rsums.size() * 2; while (hm & (hm - 1)) { hm &= hm - 1; } hm = hm * 2 - 1; // we want at least a size if 0011 1111 1111 1111 if (hm < 16383) hm = 16383; // simple hashtable of checksums auto rsumHashTable = std::make_unique( hm+1 ); memset(rsumHashTable.get(), 0, (hm + 1) * sizeof(unsigned int)); // insert each rsum into the hash table for (unsigned int i = 0; i < rsums.size(); i++) { if (blocks[i].size != blksize && (i != nblks - 1 || rsumpad != blksize)) continue; unsigned int r = rsums[i]; unsigned int h = r & hm; unsigned int hh = 7; while (rsumHashTable[h]) h = (h + hh++) & hm; rsumHashTable[h] = i + 1; } // read in block by block to find matches // the read buffer "buf" works like a ring buffer, means that once we are done with reading a full block // and didn't find a match we start again at buf[0] , filling the buffer up again, rotating until we find // a matching block. Once we find a matching block all we need to do is check if the current offset "i" // is at the end of the buffer, then we can simply write the full buffer out, or if its somewhere in between // then the begin of our block is buf[i+1, bufsize-1] and the end buf[0,i] auto ringBuf = std::make_unique( blksize ); // we use a second buffer to read in the next block if we are required to match more than one block at the same time. auto buf2 = std::make_unique( blksize ); // when we are required to match more than one block, it is read into buf2 advancing the file pointer, // to make sure that we do not loose those bytes in case the match fails we remember their count and // start in buf2, in the next loop those will be consumed before reading from the file again size_t pushback = 0; unsigned char *pushbackp = 0; // use byteshift instead of multiplication if the blksize is a power of 2 // a value is a power of 2 if ( N & N-1 ) == 0 int bshift = 0; // how many bytes do we need to shift if ((blksize & (blksize - 1)) == 0) for (bshift = 0; size_t(1 << bshift) != blksize; bshift++) ; // a and b are the LS and MS bytes of the checksum, calculated a rolling style Adler32 checksum // // a(k,l) = (\sum_{i=k}^l X_i) \bmod M unsigned short a = 0, b = 0; a = b = 0; memset(ringBuf.get(), 0, blksize); bool eof = 0; bool init = 1; if (!rsumseq) rsumseq = nblks > 1 && chksumlen < 16 ? 2 : 1; while (!eof) { for (size_t i = 0; i < blksize; i++) { // get the next character from the file // or if there are pushback chars use those int c = 0; if (eof) c = 0; else { if (pushback) { c = *pushbackp++; pushback--; } else c = getc(fp); if (c == EOF) { eof = true; c = 0; if (!i || rsumseq == 2) break; } } // calculate the rsum on the fly using recurrence relations, see https://rsync.samba.org/tech_report/node3.html // basically we subtract the checksum value of a byte the leaves the current block window and add the new incoming one // using this trick we do not need to calculate the full block checksum // the least significant part of the checksum ( lower 8 bits ) is simply the sum of all chars in the block , modulo 2^16 // zsync uses only a 16bit type to calculate the sums and as far as i can see does not do the modulo per block as the formula // says it should, we might need to do the same int oc = ringBuf[i]; ringBuf[i] = c; a += c - oc; // this is calculates the most significant part of the checksum, bshift should be always set since blocksize // should always be a power of 2 if (bshift) b += a - ( oc << bshift ); else // This seems to make no sense it does not even factor in the character itself b += 2 * blksize; if (init) { // continue reading bytes until we have the full block in our buffer if (size_t(i) != blksize - 1) continue; init = 0; } unsigned int r = ((unsigned int)a & 65535) << 16 | ((unsigned int)b & 65535); truncateRsum(r, rsumlen); unsigned int h = r & hm; unsigned int hh = 7; // go through our hashmap to find all the matching rsums for (; rsumHashTable[h]; h = (h + hh++) & hm) { size_t blkno = rsumHashTable[h] - 1; // does the current block match? if (rsums[blkno] != r) continue; if (found[blkno]) continue; // if we need to always match 2 blocks in sequence, get the next block // and check its checksum if (rsumseq == 2) { if (eof || blkno + 1 >= nblks) continue; pushback = fetchnext(fp, buf2.get(), blksize, pushback, pushbackp); pushbackp = buf2.get(); if (!pushback) continue; if (!checkRsum(blkno + 1, buf2.get(), blksize)) continue; } // here we have matched all blocks that we need, do the heavy checksum if (!checkChecksumRotated(blkno, ringBuf.get(), blksize, i + 1)) continue; // heavy checksum for second block if (rsumseq == 2 && !checkChecksum(blkno + 1, buf2.get(), blksize)) continue; // write the first and second blocks if applicable writeBlock(blkno, wfp, ringBuf.get(), blksize, i + 1, found); if (rsumseq == 2) { writeBlock(blkno + 1, wfp, buf2.get(), blksize, 0, found); pushback = 0; blkno++; } // try to continue as long as we still match blocks while (!eof) { blkno++; pushback = fetchnext(fp, buf2.get(), blksize, pushback, pushbackp); pushbackp = buf2.get(); if (!pushback) break; if (!checkRsum(blkno, buf2.get(), blksize)) break; if (!checkChecksum(blkno, buf2.get(), blksize)) break; writeBlock(blkno, wfp, buf2.get(), blksize, 0, found); pushback = 0; } // if we get to this part we found at least a block, skip over the current block and start reading // in a full block init = true; memset(ringBuf.get(), 0, blksize); a = b = 0; i = size_t(-1); // start with 0 on next iteration break; } } } } else if (chksumlen >= 16) { // dummy variant, just check the checksums size_t bufl = 4096; off_t off = 0; auto buf = std::make_unique( bufl ); for (size_t blkno = 0; blkno < blocks.size(); ++blkno) { if (off > blocks[blkno].off) continue; size_t blksize = blocks[blkno].size; if (blksize > bufl) { bufl = blksize; buf = std::make_unique( bufl ); } size_t skip = blocks[blkno].off - off; while (skip) { size_t l = skip > bufl ? bufl : skip; if (fread(buf.get(), l, 1, fp) != 1) break; skip -= l; off += l; } if (fread(buf.get(), blksize, 1, fp) != 1) break; if (checkChecksum(blkno, buf.get(), blksize)) writeBlock(blkno, wfp, buf.get(), blksize, 0, found); off += blksize; } } if (!found[nblks]) { DBG << "Delta XFER: No reusable blocks found for " << filename << std::endl; return; } // now throw out all of the blocks we found std::vector nblocks; std::vector nchksums; std::vector nrsums; size_t originalSize = 0; size_t newSize = 0; for (size_t blkno = 0; blkno < blocks.size(); ++blkno) { const auto &blk = blocks[blkno]; originalSize += blk.size; if (!found[blkno]) { // still need it nblocks.push_back(blk); newSize += blk.size; if (chksumlen && (blkno + 1) * chksumlen <= chksums.size()) { nchksums.resize(nblocks.size() * chksumlen); memcpy(&nchksums[(nblocks.size() - 1) * chksumlen], &chksums[blkno * chksumlen], chksumlen); } if (rsumlen && (blkno + 1) <= rsums.size()) nrsums.push_back(rsums[blkno]); } } DBG << "Delta XFER: Found blocks to reuse, " << blocks.size() << " vs " << nblocks.size() << ", resused blocks: " << blocks.size() - nblocks.size() << "\n" << "Old transfer size: " << originalSize << " new size: " << newSize << std::endl; blocks = nblocks; chksums = nchksums; rsums = nrsums; } std::string MediaBlockList::asString() const { std::string s; size_t i = 0, j = 0; if (filesize != off_t(-1)) { long long size = filesize; s = zypp::str::form("[ BlockList, file size %lld\n", size); } else s = "[ BlockList, filesize unknown\n"; if (!haveblocks) s += " No block information\n"; if (chksumpad) s += zypp::str::form(" Checksum pad %zd\n", chksumpad); if (rsumpad) s += zypp::str::form(" Rsum pad %zd\n", rsumpad); for (i = 0; i < blocks.size(); ++i) { long long off=blocks[i].off; long long size=blocks[i].size; s += zypp::str::form(" (%8lld, %8lld)", off, size); if (chksumlen && chksums.size() >= (i + 1) * chksumlen) { s += " " + chksumtype + ":"; for (j = 0; j < size_t(chksumlen); j++) s += zypp::str::form("%02hhx", chksums[i * chksumlen + j]); } if (rsumlen && rsums.size() > i) { s += " RSUM:"; s += zypp::str::form("%0*x", 2 * rsumlen, rsums[i]); } s += "\n"; } s += "]"; return s; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-curl/parser/mediablocklist.h000066400000000000000000000113301476576476200220140ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/parser/MediaBlockList * */ #ifndef ZYPP_CURL_PARSER_MEDIABLOCKLIST_H #define ZYPP_CURL_PARSER_MEDIABLOCKLIST_H #include #include #include #include namespace zypp { namespace media { /** * a single block from the blocklist, consisting of an offset and a size **/ struct MediaBlock { MediaBlock( off_t off_r, size_t size_r ) : off( off_r ) , size( size_r ) {} off_t off; size_t size; }; class MediaBlockList { public: MediaBlockList(off_t filesize=off_t(-1)); /** * do we have a blocklist describing the file? * set to true when addBlock() is called **/ inline bool haveBlocks() const { return haveblocks; } /** * add a block with offset off and size size to the block list. Note * that blocks must be ordered and must not overlap. returns the * block number. **/ size_t addBlock(off_t off, size_t size); /** * return the offset/size of a block with number blkno **/ inline const MediaBlock &getBlock(size_t blkno) const { return blocks[blkno]; } /** * return the number of blocks in the blocklist **/ inline size_t numBlocks() const { return blocks.size(); } /** * set / return the size of the whole file **/ inline void setFilesize(off_t newfilesize=off_t(-1)) { filesize = newfilesize; } inline off_t getFilesize() const { return filesize; } inline bool haveFilesize() const { return filesize != off_t(-1); } /** * set / verify the checksum over the whole file **/ void setFileChecksum(std::string ctype, int cl, unsigned char *c); std::string fileChecksumType () const; const UByteArray &getFileChecksum( ); bool createFileDigest(Digest &digest) const; bool verifyFileDigest(Digest &digest) const; inline bool haveFileChecksum() const { return !fsumtype.empty() && fsum.size(); } /** * set / verify the (strong) checksum over a single block **/ void setChecksum(size_t blkno, const std::string& cstype, int csl, unsigned char *cs, size_t cspad=0); bool checkChecksum(size_t blkno, const unsigned char *buf, size_t bufl) const; UByteArray getChecksum( size_t blkno ) const; std::string getChecksumType( ) const; size_t checksumPad() const; bool createDigest(Digest &digest) const; bool verifyDigest(size_t blkno, Digest &digest) const; inline bool haveChecksum(size_t blkno) const { return chksumlen && chksums.size() >= chksumlen * (blkno + 1); } /** * set / verify the (weak) rolling checksum over a single block **/ void setRsum(size_t blkno, int rsl, unsigned int rs, size_t rspad=0); /** * how many blocks in sequence need to have the correct checksums to be * considered a match */ void setRsumSequence( uint seq ); bool checkRsum(size_t blkno, const unsigned char *buf, size_t bufl) const; unsigned int updateRsum(unsigned int rs, const char *bytes, size_t len) const; bool verifyRsum(size_t blkno, unsigned int rs) const; inline bool haveRsum(size_t blkno) const { return rsumlen && rsums.size() >= blkno + 1; } /** * scan a file for blocks from our blocklist. if we find a suitable block, * it is removed from the list **/ void reuseBlocksOld(FILE *wfp, const std::string& filename); void reuseBlocks(FILE *wfp, const std::string& filename); /** * return block list as string **/ std::string asString() const; private: void writeBlock(size_t blkno, FILE *fp, const unsigned char *buf, size_t bufl, size_t start, std::vector &found) const; bool checkChecksumRotated(size_t blkno, const unsigned char *buf, size_t bufl, size_t start) const; off_t filesize; std::string fsumtype; UByteArray fsum; bool haveblocks; std::vector blocks; std::string chksumtype; int chksumlen; size_t chksumpad; std::vector chksums; int rsumlen; uint rsumseq; // < how many consecutive matches are required size_t rsumpad; std::vector rsums; }; inline std::ostream & operator<<(std::ostream &str, const MediaBlockList &bl) { return str << bl.asString(); } } // namespace media } // namespace zypp #endif // ZYPP_CURL_PARSER_MEDIABLOCKLIST_H libzypp-17.36.5/zypp-curl/parser/metadatahelper.cc000066400000000000000000000034441476576476200221530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "metadatahelper.h" #include #include namespace zypp::media { MetaDataType looks_like_meta_data(const std::vector &data) { if ( data.empty() ) return MetaDataType::None; const char *p = data.data(); while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') p++; // If we have a zsync file, it has to start with zsync: if ( !strncasecmp( p, "zsync:", 6 ) ) { return MetaDataType::Zsync; } if (!strncasecmp(p, "') p++; if (*p == '>') p++; while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') p++; } bool ret = !strncasecmp( p, " fd( fopen( file.c_str(), "r" ), &fclose ); return looks_like_meta_file( fd.get() ); } MetaDataType looks_like_meta_file(FILE *file) { if ( !file ) return MetaDataType::None; return looks_like_meta_data( io::peek_data_fd( file, 0, minMetalinkProbeSize ) ); } } libzypp-17.36.5/zypp-curl/parser/metadatahelper.h000066400000000000000000000023701476576476200220120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_CURL_PARSER_METADATAHELPER_H #define ZYPP_CURL_PARSER_METADATAHELPER_H /*! * \file contains helpers for detecting and handling download metadata... * e.g. zsync or metalink */ #include #include #include namespace zypp::media { enum class MetaDataType { None = 0, Zsync, MetaLink }; constexpr auto minMetalinkProbeSize = 256; //< The nr of bytes we download to decide if we got a metadata file or not MetaDataType looks_like_meta_data( const std::vector &data ); MetaDataType looks_like_meta_file( const zypp::Pathname &file ); MetaDataType looks_like_meta_file( FILE *file ); } #endif libzypp-17.36.5/zypp-curl/parser/metalinkparser.cc000066400000000000000000000340221476576476200222100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/parser/metalinkparser.cc * */ #include "metalinkparser.h" #include #include #include #include #include #include #include using namespace zypp::base; namespace zypp::env { /** Hack to circumvent the currently poor --root support. */ inline bool ZYPP_METALINK_DEBUG() { static bool val = [](){ const char * env = getenv("ZYPP_METALINK_DEBUG"); return( env && zypp::str::strToBool( env, true ) ); }(); return val; } } namespace zypp::media { enum ParserState { STATE_START, STATE_METALINK, STATE_FILES, STATE_FILE, STATE_M4FILE, STATE_SIZE, STATE_M4SIZE, STATE_VERIFICATION, STATE_HASH, STATE_M4HASH, STATE_PIECES, STATE_M4PIECES, STATE_PHASH, STATE_M4PHASH, STATE_RESOURCES, STATE_URL, STATE_M4URL, NUMSTATES }; struct transition { std::string elementName; //< Name of the element for the transition to trigger ParserState transitionTo; //< The state we go into when the element name in \a elementName is encountered int docontent; //< Store the content of the element in the \a content member }; /*! * Returns a map of all state transitions that are supported. * Key of the map is the current state, the value is a list of all supported transitions * of the the current state. */ const std::unordered_map > & transitions () { static std::unordered_map > map { { STATE_START, { { "metalink", STATE_METALINK, 0}, } }, { STATE_METALINK, { { "files", STATE_FILES, 0 }, { "file", STATE_M4FILE, 0 }, } }, { STATE_FILES, { { "file", STATE_FILE, 0}, } }, { STATE_FILE, { { "size", STATE_SIZE, 1 }, { "verification", STATE_VERIFICATION, 0 }, { "resources", STATE_RESOURCES, 0 }, } }, { STATE_VERIFICATION, { { "hash", STATE_HASH, 1 }, { "pieces", STATE_PIECES, 0 }, } }, { STATE_PIECES, { { "hash", STATE_PHASH, 1 }, } }, { STATE_RESOURCES, { { "url", STATE_URL, 1 }, } }, { STATE_M4FILE, { { "size", STATE_M4SIZE, 1 }, { "hash", STATE_M4HASH, 1}, { "url", STATE_M4URL, 1}, { "pieces", STATE_M4PIECES, 0}, } }, { STATE_M4PIECES, { { "hash", STATE_M4PHASH, 1 }, } }, }; return map; } static void XMLCALL startElement(void *userData, const xmlChar *name, const xmlChar **atts); static void XMLCALL endElement(void *userData, const xmlChar *name); static void XMLCALL characterData(void *userData, const xmlChar *s, int len); struct ml_parsedata : private zypp::base::NonCopyable { ml_parsedata() : parser( nullptr ) , state( STATE_START ) , depth( 0 ) , statedepth( 0 ) , docontent( 0 ) , gotfile( 0 ) , size( -1 ) , blksize( 0 ) , piecel( 0 ) , chksuml( 0 ) { content.reserve( 256 ); xmlSAXHandler sax; memset(&sax, 0, sizeof(sax)); sax.startElement = startElement; sax.endElement = endElement; sax.characters = characterData; //internally creates a copy of xmlSaxHandler, so having it as local variable is save parser = AutoDispose( xmlCreatePushParserCtxt(&sax, this, NULL, 0, NULL), xmlFreeParserCtxt ); } void doTransition ( const transition &t ) { parentStates.push( state ); state = t.transitionTo; docontent = t.docontent; statedepth = depth; content.clear(); } void popState () { state = parentStates.top(); statedepth--; parentStates.pop(); } AutoDispose parser; ParserState state; //< current state as defined in \ref stateswitch std::stack parentStates; int depth; //< current element depth of traversing the document elements /*! * Current element depts expected by the current state, * if depth != statedepth we ignore all elements and just increase and decrease depth until they match again. * This is basically a helper variable that allows us to ignore elements we do not care about */ int statedepth; std::string content; //< content of the current element int docontent; //< should the content of the current elem be parsed int gotfile; off_t size; std::vector urls; size_t blksize; std::vector piece; int piecel; std::vector sha1; std::vector zsync; UByteArray chksum; int chksuml; }; /** * Look up a xml attribute in the passed array \a atts. * Returns a pointer to the value of the attribute if one is found, otherwise nullptr. */ static const char * find_attr(const char *txt, const xmlChar **atts) { if(!atts) { return nullptr; } for (; *atts; atts += 2) { if (!strcmp(reinterpret_cast(*atts), txt)) return reinterpret_cast(atts[1]); } return nullptr; } static void XMLCALL startElement(void *userData, const xmlChar *name, const xmlChar **atts) { struct ml_parsedata *pd = reinterpret_cast(userData); // if the current element depth does not match the expected depth for the current state we // ignore the element and just increase the depth if (pd->depth != pd->statedepth) { pd->depth++; return; } pd->depth++; const auto &trMap = transitions(); const auto currStateTrs = trMap.find( pd->state ); if ( currStateTrs == trMap.end() ) return; // check if the current element name is part of our transitions auto foundTr = std::find_if( currStateTrs->second.begin(), currStateTrs->second.end(), [name]( const auto &tr ){ return tr.elementName == reinterpret_cast(name); }); if ( foundTr == currStateTrs->second.end() ) { // we found no possible transition, ignore return; } if ( ( foundTr->transitionTo == STATE_FILE || foundTr->transitionTo == STATE_M4FILE ) && pd->gotfile++) return; /* ignore all but the first file */ // advance the state machine and prepare variables for the new state pd->doTransition( *foundTr ); switch(pd->state) { case STATE_URL: case STATE_M4URL: { const char *priority = find_attr("priority", atts); const char *preference = find_attr("preference", atts); const char *maxconnections = find_attr("maxconnections", atts); int prio = 0; auto &mirr = pd->urls.emplace_back(); if (priority) prio = str::strtonum(priority); else if (preference) prio = 101 - str::strtonum(preference); else prio = 999999; mirr.priority = prio; if ( maxconnections ) mirr.maxConnections = str::strtonum( maxconnections ); break; } case STATE_PIECES: case STATE_M4PIECES: { const char *type = find_attr("type", atts); const char *length = find_attr("length", atts); size_t blksize = 0; if (!type || !length) { pd->popState(); break; } blksize = str::strtonum(length); if (!blksize || (pd->blksize && pd->blksize != blksize)) { pd->popState(); break; } pd->blksize = blksize; pd->piece.clear(); if (!strcmp(type, "sha1") || !strcmp(type, "sha-1")) pd->piecel = 20; else if (!strcmp(type, "zsync")) pd->piecel = 4; else { pd->popState(); break; } break; } case STATE_HASH: case STATE_M4HASH: { const char *type = find_attr("type", atts); if (!type) type = "?"; if ((!strcmp(type, "sha1") || !strcmp(type, "sha-1")) && pd->chksuml < 20) pd->chksuml = 20; else if (!strcmp(type, "sha256") || !strcmp(type, "sha-256")) pd->chksuml = 32; else { pd->popState(); pd->docontent = 0; } break; } case STATE_PHASH: case STATE_M4PHASH: { const char *piece = find_attr("piece", atts); if ( pd->state == STATE_PHASH && (!piece || str::strtonum(piece) != pd->piece.size()) ) { pd->popState(); } break; } default: break; } } UByteArray hexstr2bytes( const std::string& str ) { return Digest::hexStringToUByteArray( str ); } static void XMLCALL endElement(void *userData, const xmlChar *) { struct ml_parsedata *pd = reinterpret_cast(userData); //printf("end depth %d-%d name %s\n", pd->depth, pd->statedepth, name); if (pd->depth != pd->statedepth) { pd->depth--; return; } switch (pd->state) { case STATE_SIZE: case STATE_M4SIZE: pd->size = (off_t)str::strtonum(pd->content); //strtoull(pd->content, 0, 10); break; case STATE_HASH: case STATE_M4HASH: pd->chksum.clear(); pd->chksum = hexstr2bytes( pd->content ); if ( pd->content.length() != size_t(pd->chksuml) * 2 || !pd->chksum.size() ) { pd->chksum.clear(); pd->chksuml = 0; } break; case STATE_PHASH: case STATE_M4PHASH: { if ( pd->content.length() != size_t(pd->piecel) * 2 ) break; UByteArray pieceHash = hexstr2bytes( pd->content ); if ( !pieceHash.size() ) pieceHash.resize( pd->piecel, 0 ); pd->piece.push_back( pieceHash ); break; } case STATE_PIECES: case STATE_M4PIECES: if (pd->piecel == 4) pd->zsync = pd->piece; else pd->sha1 = pd->piece; pd->piecel = 0; pd->piece.clear(); break; case STATE_URL: case STATE_M4URL: if ( pd->content.length() ) pd->urls.back().url = std::string(pd->content); else // without a actual URL the mirror is useless pd->urls.pop_back(); break; default: break; } pd->depth--; pd->popState(); pd->docontent = 0; } static void XMLCALL characterData(void *userData, const xmlChar *s, int len) { struct ml_parsedata *pd = reinterpret_cast(userData); if (!pd->docontent) return; if ( pd->content.length() + len + 1 > pd->content.capacity() ) pd->content.reserve( pd->content.capacity() + 256 ); pd->content.append( s, s+len ); } MetaLinkParser::MetaLinkParser() : pd( new ml_parsedata ) {} MetaLinkParser::~MetaLinkParser() { delete pd; } void MetaLinkParser::parse(const Pathname &filename) { parse(InputStream(filename)); } void MetaLinkParser::parse(const InputStream &is) { char buf[4096]; if (!is.stream()) ZYPP_THROW(Exception("MetaLinkParser: no such file")); while (is.stream().good()) { is.stream().read(buf, sizeof(buf)); parseBytes(buf, is.stream().gcount()); } parseEnd(); MIL << "Parsed " << pd->urls.size() << " mirrors from " << is.path() << std::endl; if ( env::ZYPP_METALINK_DEBUG() ) { for ( const auto &mirr : pd->urls ) DBG << "- " << mirr.priority << " " << mirr.url << std::endl; } } void MetaLinkParser::parseBytes(const char *buf, size_t len) { if (!len) return; if (xmlParseChunk(pd->parser, buf, len, 0)) { ZYPP_THROW(Exception("Parse Error")); } } void MetaLinkParser::parseEnd() { if (xmlParseChunk(pd->parser, NULL, 0, 1)) { ZYPP_THROW(Exception("Parse Error")); } if (pd->urls.size() ) { stable_sort(pd->urls.begin(), pd->urls.end(), []( const auto &a, const auto &b ){ return a.priority < b.priority; }); } } std::vector MetaLinkParser::getUrls() const { std::vector urls; urls.reserve(pd->urls.size()); for ( const auto &mirr : pd->urls ) urls.push_back( mirr.url ); return urls; } const std::vector &MetaLinkParser::getMirrors() const { return pd->urls; } MediaBlockList MetaLinkParser::getBlockList() const { MediaBlockList bl(pd->size); if (pd->chksuml == 20) bl.setFileChecksum("SHA1", pd->chksuml, pd->chksum.data() ); else if (pd->chksuml == 32) bl.setFileChecksum("SHA256", pd->chksuml, pd->chksum.data()); if (pd->size != off_t(-1) && pd->blksize) { size_t nb = (pd->size + pd->blksize - 1) / pd->blksize; off_t off = 0; size_t size = pd->blksize; for ( size_t i = 0; i < nb; i++ ) { if (i == nb - 1) { size = pd->size % pd->blksize; if (!size) size = pd->blksize; } size_t blkno = bl.addBlock(off, size); if ( i < pd->sha1.size()) { bl.setChecksum(blkno, "SHA1", 20, pd->sha1[i].data()); if ( i < pd->zsync.size()) { unsigned char *p = pd->zsync[i].data(); bl.setRsum(blkno, 4, p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24, pd->blksize); } } off += pd->blksize; } } return bl; } const std::vector &MetaLinkParser::getZsyncBlockHashes() const { return pd->zsync; } const std::vector &MetaLinkParser::getSHA1BlockHashes() const { return pd->sha1; } } // namespace zypp::media libzypp-17.36.5/zypp-curl/parser/metalinkparser.h000066400000000000000000000046341476576476200220600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/parser/MetaLinkParser * */ #ifndef ZYPP_CURL_PARSER_METALINKPARSER_H_INCLUDED #define ZYPP_CURL_PARSER_METALINKPARSER_H_INCLUDED #include #include #include #include #include #include #include namespace zypp::media { struct ml_parsedata; struct MetalinkMirror { int priority = 0; int maxConnections = -1; //< How many connections can be opened to that mirror, -1 means no limit was defined. Url url; }; class MetaLinkParser : private zypp::base::NonCopyable { public: MetaLinkParser(); ~MetaLinkParser(); /** * parse a file consisting of metalink xml data * \throws Exception **/ void parse(const Pathname &filename); /** * parse an InputStream consisting of metalink xml data * \throws Exception **/ void parse(const InputStream &is); /** * parse a chunk of a file consisting of metalink xml data. * \throws Exception **/ void parseBytes(const char* bytes, size_t len); /** * tells the parser that all chunks are now processed * \throws Exception **/ void parseEnd(); /** * return the download urls from the parsed metalink data **/ std::vector getUrls() const; /** * return the mirrors from the parsed metalink data */ const std::vector &getMirrors() const; /** * return the block list from the parsed metalink data **/ MediaBlockList getBlockList() const; const std::vector &getZsyncBlockHashes() const; const std::vector &getSHA1BlockHashes() const; private: struct ml_parsedata *pd; }; UByteArray hexstr2bytes( const std::string& str ); } // namespace zypp::media #endif // ZYPP_CURL_PARSER_METALINKPARSER_H_INCLUDED libzypp-17.36.5/zypp-curl/parser/zsyncparser.cc000066400000000000000000000136261476576476200215610ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/ZsyncParser.cc * */ #include "zsyncparser.h" #include #include #include #include #include #include #include #include using std::endl; using namespace zypp::base; namespace zypp::env { /** Hack to circumvent the currently poor --root support. */ inline bool ZYPP_METALINK_DEBUG() { static bool val = [](){ const char * env = getenv("ZYPP_METALINK_DEBUG"); return( env && zypp::str::strToBool( env, true ) ); }(); return val; } } namespace zypp { namespace media { ZsyncParser::ZsyncParser() { filesize = off_t(-1); blksize = 0; sql = rsl = csl = 0; } static int hexstr2bytes(unsigned char *buf, const char *str, int buflen) { int i = 0; for (i = 0; i < buflen; i++) { #define c2h(c) (((c)>='0' && (c)<='9') ? ((c)-'0') \ : ((c)>='a' && (c)<='f') ? ((c)-('a'-10)) \ : ((c)>='A' && (c)<='F') ? ((c)-('A'-10)) \ : -1) int v = c2h(*str); str++; if (v < 0) return 0; buf[i] = v; v = c2h(*str); str++; if (v < 0) return 0; buf[i] = (buf[i] << 4) | v; #undef c2h } return buflen; } void ZsyncParser::parse( const Pathname &filename ) { char buf[4096]; std::ifstream is(filename.c_str()); if (!is) ZYPP_THROW(Exception("ZsyncParser: no such file")); is.exceptions(std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit); off_t filesize = off_t(-1); while (is.good()) { is.getline(buf, sizeof(buf)); if (!*buf) break; if (!strncmp(buf, "Length: ", 8)) filesize = (off_t)strtoull(buf + 8, 0, 10); else if (!strncmp(buf, "Hash-Lengths: ", 14)) (void)sscanf(buf + 14, "%d,%d,%d", &sql, &rsl, &csl); else if (!strncmp(buf, "Blocksize: ", 11)) blksize = atoi(buf + 11); else if (!strncmp(buf, "URL: http://", 12) || !strncmp(buf, "URL: https://", 13) || !strncmp(buf, "URL: ftp://", 11) || !strncmp(buf, "URL: tftp://", 12) ) urls.push_back(buf + 5); else if (!strncmp(buf, "SHA-1: ", 7)) { unsigned char sha1[20]; if (hexstr2bytes(sha1, buf + 7, 20) == 20) bl.setFileChecksum("SHA1", 20, sha1); } } if (filesize == off_t(-1)) ZYPP_THROW(Exception("Parse Error")); if (blksize <= 0 || (blksize & (blksize - 1)) != 0) ZYPP_THROW(Exception("Parse Error: illegal block size")); bl.setFilesize(filesize); if (filesize) { if (csl < 3 || csl > 16 || rsl < 1 || rsl > 4 || sql < 1 || sql > 2) ZYPP_THROW(Exception("Parse Error: illegal hash lengths")); bl.setRsumSequence( sql ); size_t nblks = (filesize + blksize - 1) / blksize; size_t i = 0; off_t off = 0; size_t size = blksize; for (i = 0; i < nblks; i++) { if (i == nblks - 1) { size = filesize % blksize; if (!size) size = blksize; } size_t blkno = bl.addBlock(off, size); unsigned char rp[16]; rp[0] = rp[1] = rp[2] = rp[3] = 0; try { is.read((char *)rp + 4 - rsl, rsl); } catch ( const std::exception &e ) { if ( !is.good() ) { if (is.bad()) throw zypp::Exception( "I/O error while reading" ); else if (is.eof()) throw zypp::Exception( "End of file reached unexpectedly" ); else if (is.fail()) throw zypp::Exception( "Non-integer data encountered" ); else throw zypp::Exception( "Unknown IO err" ); } } bl.setRsum(blkno, rsl, rp[0] << 24 | rp[1] << 16 | rp[2] << 8 | rp[3], blksize); try { is.read((char *)rp, csl); } catch ( const std::exception &e ) { if ( !is.good() ) { if (is.bad()) throw zypp::Exception( "I/O error while reading" ); else if (is.eof()) throw zypp::Exception( "End of file reached unexpectedly" ); else if (is.fail()) throw zypp::Exception( "Non-integer data encountered" ); else throw zypp::Exception( "Unknown IO err" ); } } if ( !is.good() ) { if (is.bad()) throw zypp::Exception( "I/O error while reading" ); else if (is.eof()) throw zypp::Exception( "End of file reached unexpectedly" ); else if (is.fail()) throw zypp::Exception( "Non-integer data encountered" ); else throw zypp::Exception( "Unknown IO err" ); } bl.setChecksum(blkno, "MD4", csl, rp, blksize); off += size; } } is.close(); MIL << "Parsed " << urls.size() << " mirrors from " << filename << std::endl; if ( env::ZYPP_METALINK_DEBUG() ) { for ( const auto &url : urls ) DBG << "- " << url << std::endl; } } std::vector ZsyncParser::getUrls() { std::vector ret; size_t i = 0; for (i = 0; i < urls.size(); i++) ret.push_back(Url(urls[i])); return ret; } MediaBlockList ZsyncParser::getBlockList() { return bl; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-curl/parser/zsyncparser.h000066400000000000000000000030111476576476200214060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/parser/zsyncparser.h * */ #ifndef ZYPP_CURL_PARSER_ZSYNCPARSER_H #define ZYPP_CURL_PARSER_ZSYNCPARSER_H #include #include #include #include #include namespace zypp { namespace media { class ZsyncParser : private zypp::base::NonCopyable { public: ZsyncParser(); /** * parse a file consisting of zlink data * \throws Exception **/ void parse( const Pathname &filename ); /** * return the download urls from the parsed metalink data **/ std::vector getUrls(); /** * return the block list from the parsed metalink data **/ MediaBlockList getBlockList(); private: off_t filesize; size_t blksize; int sql; int rsl; int csl; MediaBlockList bl; std::vector urls; }; } // namespace media } // namespace zypp #endif // ZYPP_CURL_PARSER_ZSYNCPARSER_H libzypp-17.36.5/zypp-curl/private/000077500000000000000000000000001476576476200170355ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/private/curlhelper_p.h000066400000000000000000000067421476576476200217030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_PRIVATE_CURLHELPER_P_H_INCLUDED #define ZYPP_MEDIA_PRIVATE_CURLHELPER_P_H_INCLUDED #include #include #include #include #define EXPLICITLY_NO_PROXY "_none_" #undef CURLVERSION_AT_LEAST #define CURLVERSION_AT_LEAST(M,N,O) LIBCURL_VERSION_NUM >= ((((M)<<8)+(N))<<8)+(O) using GPollFD = struct _GPollFD; namespace zypp { namespace env { /** \c const long& for setting CURLOPT_DEBUGDATA * Returns a reference to a static variable, so it's * safe to pass it's address to CURLOPT_DEBUGDATA. */ const long & ZYPP_MEDIA_CURL_DEBUG(); /** 4/6 to force IPv4/v6 */ int ZYPP_MEDIA_CURL_IPRESOLVE(); } // namespace env } //namespace zypp //do not export namespace internal { void globalInitCurlOnce(); uint curlVersion(); /** Setup CURLOPT_VERBOSE and CURLOPT_DEBUGFUNCTION according to env::ZYPP_MEDIA_CURL_DEBUG. */ void setupZYPP_MEDIA_CURL_DEBUG( CURL *curl ); size_t log_redirects_curl( char *ptr, size_t size, size_t nmemb, void *userdata); void fillSettingsFromUrl( const zypp::Url &url, zypp::media::TransferSettings &s ); void fillSettingsSystemProxy( const zypp::Url& url, zypp::media::TransferSettings &s ); void curlEscape( std::string & str_r, const char char_r, const std::string & escaped_r ); std::string curlEscapedPath( std::string path_r ); std::string curlUnEscape( const std::string& text_r ); zypp::Url clearQueryString(const zypp::Url &url); zypp::Url propagateQueryParams( zypp::Url url_r, const zypp::Url & template_r ); CURLcode setCurlRedirProtocols(CURL *curl); /*! * Helper class to simplify using the curl multi API, takes * care of remembering the registered sockets and the required curl timeout. */ struct CurlPollHelper { struct CurlPoll { CURLM *_multi = nullptr; }; CurlPollHelper( CurlPoll &p ); ~CurlPollHelper(); /*! * Iterator over the passed in poll fd's and call curl_multi_socket_action on them if one of * them signals that events have happened */ CURLMcode handleSocketActions( const std::vector &actionsFds, int first = 0 ); /*! * Tells libcurl that the requested timeout was reached. */ CURLMcode handleTimout (); /*! * Callback for libcurl when it wants us to track or stop us from tracking a socket */ static int socketcb (CURL * easy, curl_socket_t s, int what, CurlPollHelper *userp, void *sockp ); /*! * Callback for libcurl when it wants us to start/update/remove a timer */ static int timercb( CURLM *, long timeout_ms, CurlPollHelper *thatPtr ); CurlPoll &_parent; std::vector socks; //< This is the list of fd's we need to track, events have been set by curl std::optional timeout_ms = 0; //if set curl wants a timeout }; } #endif //ZYPP_MEDIA_PRIVATE_CURLHELPER_P_H_INCLUDED libzypp-17.36.5/zypp-curl/proxyinfo.cc000066400000000000000000000035501476576476200177320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/ProxyInfo.cc * */ #include "proxyinfo.h" #include #include #include #include "proxyinfo/proxyinfoimpl.h" #include "proxyinfo/proxyinfos.h" using namespace zypp::base; namespace zypp { namespace media { shared_ptr ProxyInfo::Impl::_nullimpl; ProxyInfo::ProxyInfo() #ifdef WITH_LIBPROXY_SUPPORT : _pimpl( (ProxyInfoLibproxy::isAvailabe() ? static_cast(new ProxyInfoLibproxy()) : static_cast(new ProxyInfoSysconfig("proxy"))) ) #else : _pimpl( new ProxyInfoSysconfig("proxy") ) #endif {} ProxyInfo::ProxyInfo(ProxyInfo::ImplPtr pimpl_r) : _pimpl(std::move(pimpl_r)) {} bool ProxyInfo::enabled() const { return _pimpl->enabled(); } std::string ProxyInfo::proxy(const Url & url_r) const { return _pimpl->proxy(url_r); } ProxyInfo::NoProxyList ProxyInfo::noProxy() const { return _pimpl->noProxy(); } ProxyInfo::NoProxyIterator ProxyInfo::noProxyBegin() const { return _pimpl->noProxyBegin(); } ProxyInfo::NoProxyIterator ProxyInfo::noProxyEnd() const { return _pimpl->noProxyEnd(); } bool ProxyInfo::useProxyFor( const Url & url_r ) const { return _pimpl->useProxyFor( url_r ); } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-curl/proxyinfo.h000066400000000000000000000037741476576476200176040ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/ProxyInfo * */ #ifndef ZYPP_CURL_PROXYINFO_H_INCLUDED #define ZYPP_CURL_PROXYINFO_H_INCLUDED #include #include #include namespace zypp { class Url; namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : ProxyInfo class ProxyInfo { public: using Ptr = intrusive_ptr; using constPtr = intrusive_ptr; using NoProxyList = std::list; using NoProxyIterator = std::list::const_iterator; /** Implementation */ struct Impl; using ImplPtr = shared_ptr; /** Default Ctor: guess the best available implementation. */ ProxyInfo(); /** Ctor taking a specific implementation. */ ProxyInfo( ProxyInfo::ImplPtr pimpl_r ); bool enabled() const; std::string proxy(const Url & url) const; NoProxyList noProxy() const; NoProxyIterator noProxyBegin() const; NoProxyIterator noProxyEnd() const; /** Return \c true if \ref enabled and \a url_r does not match \ref noProxy. */ bool useProxyFor( const Url & url_r ) const; private: /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_CURL_PROXYINFO_H_INCLUDED libzypp-17.36.5/zypp-curl/proxyinfo/000077500000000000000000000000001476576476200174205ustar00rootroot00000000000000libzypp-17.36.5/zypp-curl/proxyinfo/ProxyInfoLibproxy000066400000000000000000000000371476576476200230310ustar00rootroot00000000000000#include "proxyinfolibproxy.h" libzypp-17.36.5/zypp-curl/proxyinfo/ProxyInfoSysconfig000066400000000000000000000000401476576476200231570ustar00rootroot00000000000000#include "proxyinfosysconfig.h" libzypp-17.36.5/zypp-curl/proxyinfo/proxyinfoimpl.h000066400000000000000000000053351476576476200225160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/proxyinfo/proxyinfoimpl.h * */ #ifndef ZYPP_CURL_PROXYINFO_PROXYINFOIMPL_H_INCLUDED #define ZYPP_CURL_PROXYINFO_PROXYINFOIMPL_H_INCLUDED #include #include #include #include #include namespace zypp { namespace media { struct ProxyInfo::Impl { /** Ctor */ Impl() {} /** Dtor */ virtual ~Impl() {} public: /** */ virtual bool enabled() const = 0; /** */ virtual std::string proxy(const Url & url_r) const = 0; /** */ virtual ProxyInfo::NoProxyList noProxy() const = 0; /** */ virtual ProxyInfo::NoProxyIterator noProxyBegin() const = 0; /** */ virtual ProxyInfo::NoProxyIterator noProxyEnd() const = 0; /** Return \c true if \ref enabled and \a url_r does not match \ref noProxy. */ bool useProxyFor( const Url & url_r ) const { if ( ! enabled() || proxy( url_r ).empty() ) return false; ProxyInfo::NoProxyList noproxy( noProxy() ); if ( noproxy.size() == 1 && noproxy.front() == "*" ) return false; // just an asterisk disables all. // No proxy: Either an exact match, or the previous character // is a '.', so host is within the same domain. // A leading '.' in the pattern is ignored. Some implementations // need '.foo.ba' to prevent 'foo.ba' from matching 'xfoo.ba'. std::string host( str::toLower( url_r.getHost() ) ); for ( const std::string & np : noproxy ) { std::string pattern( str::toLower( np[0] == '.' ? np.c_str() + 1 : np.c_str() ) ); if ( str::hasSuffix( host, pattern ) && ( host.size() == pattern.size() || host[host.size()-pattern.size()-1] == '.' ) ) return false; } return true; } public: /** Default Impl: empty sets. */ static shared_ptr _nullimpl; }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_PROXYINFO_PROXYINFOIMPL_H libzypp-17.36.5/zypp-curl/proxyinfo/proxyinfolibproxy.cc000066400000000000000000000164371476576476200235700ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/proxyinfo/proxyinfolibproxy.cc * */ #include #include #include #include #include #include #include #include #include // for dlload, dlsym, dlclose #include // g_clear_pointer and g_strfreev using std::endl; using namespace zypp::base; namespace zypp { namespace media { namespace { using CreateFactoryCb = CreateFactorySig; using DelFactoryCb = DelFactorySig; using GetProxiesCb = GetProxiesSig; struct LibProxyAPI { zypp::AutoDispose libProxyLibHandle; CreateFactoryCb createProxyFactory = nullptr; DelFactoryCb deleteProxyFactory = nullptr; GetProxiesCb getProxies = nullptr; FreeProxiesCb freeProxies = nullptr; /*! * \internal * Older versions of libproxy do not have a callback to free the proxy list, * so we provide one. */ static void fallbackFreeProxies( char **proxies ) { g_clear_pointer (&proxies, g_strfreev); } static std::unique_ptr create() { MIL << "Detecting libproxy availability" << std::endl; zypp::AutoDispose handle( dlopen("libproxy.so.1", RTLD_LAZY ), []( void *ptr ){ if ( ptr ) ::dlclose(ptr); }); if ( !handle ) { MIL << "No libproxy support detected (could not load library): " << dlerror() << std::endl; return nullptr; } std::unique_ptr apiInstance = std::make_unique(); apiInstance->libProxyLibHandle = std::move(handle); apiInstance->createProxyFactory = (CreateFactoryCb)::dlsym ( apiInstance->libProxyLibHandle, "px_proxy_factory_new" ); if ( !apiInstance->createProxyFactory ){ ERR << "Incompatible libproxy detected (could not resolve px_proxy_factory_new): " << dlerror() << std::endl; return nullptr; } apiInstance->deleteProxyFactory = (DelFactoryCb)::dlsym ( apiInstance->libProxyLibHandle, "px_proxy_factory_free" ); if ( !apiInstance->deleteProxyFactory ){ ERR << "Incompatible libproxy detected (could not resolve px_proxy_factory_free): " << dlerror() << std::endl; return nullptr; } apiInstance->getProxies = (GetProxiesCb)::dlsym ( apiInstance->libProxyLibHandle, "px_proxy_factory_get_proxies" ); if ( !apiInstance->getProxies ){ ERR << "Incompatible libproxy detected (could not resolve px_proxy_factory_get_proxies): " << dlerror() << std::endl; return nullptr; } apiInstance->freeProxies = (FreeProxiesCb)::dlsym ( apiInstance->libProxyLibHandle, "px_proxy_factory_free_proxies" ); if ( !apiInstance->freeProxies ){ MIL << "Older version of libproxy detected, using fallback function to free the proxy list (could not resolve px_proxy_factory_free_proxies): " << dlerror() << std::endl; apiInstance->freeProxies = &fallbackFreeProxies; } MIL << "Libproxy is available" << std::endl; return apiInstance; } }; LibProxyAPI *proxyApi() { static std::unique_ptr api = LibProxyAPI::create(); return api.get(); } LibProxyAPI &assertProxyApi() { auto api = proxyApi(); if ( !api ) ZYPP_THROW( zypp::Exception("LibProxyAPI is not available.") ); return *api; } } struct TmpUnsetEnv { TmpUnsetEnv(const char *var_r) : _set(false), _var(var_r) { const char * val = getenv( _var.c_str() ); if ( val ) { _set = true; _val = val; ::unsetenv( _var.c_str() ); } } TmpUnsetEnv(const TmpUnsetEnv &) = delete; TmpUnsetEnv(TmpUnsetEnv &&) = delete; TmpUnsetEnv &operator=(const TmpUnsetEnv &) = delete; TmpUnsetEnv &operator=(TmpUnsetEnv &&) = delete; ~TmpUnsetEnv() { if ( _set ) { setenv( _var.c_str(), _val.c_str(), 1 ); } } bool _set; std::string _var; std::string _val; }; static pxProxyFactoryType * getProxyFactory() { static pxProxyFactoryType * proxyFactory = 0; // Force libproxy into using "/etc/sysconfig/proxy" // if it exists. static WatchFile sysconfigProxy( "/etc/sysconfig/proxy", WatchFile::NO_INIT ); if ( sysconfigProxy.hasChanged() ) { MIL << "Build Libproxy Factory from /etc/sysconfig/proxy" << endl; if ( proxyFactory ) assertProxyApi().deleteProxyFactory( proxyFactory ); TmpUnsetEnv envguard[] __attribute__ ((__unused__)) = { "KDE_FULL_SESSION", "GNOME_DESKTOP_SESSION_ID", "DESKTOP_SESSION" }; proxyFactory = assertProxyApi().createProxyFactory(); } else if ( ! proxyFactory ) { MIL << "Build Libproxy Factory" << endl; proxyFactory = assertProxyApi().createProxyFactory(); } return proxyFactory; } ProxyInfoLibproxy::ProxyInfoLibproxy() : ProxyInfo::Impl() , _factory( getProxyFactory()) { _enabled = !(_factory == NULL); } ProxyInfoLibproxy::~ProxyInfoLibproxy() {} bool ProxyInfoLibproxy::isAvailabe() { return ( proxyApi () != nullptr ); } std::string ProxyInfoLibproxy::proxy(const Url & url_r) const { if (!_enabled) return ""; const url::ViewOption vopt = url::ViewOption::WITH_SCHEME + url::ViewOption::WITH_HOST + url::ViewOption::WITH_PORT + url::ViewOption::WITH_PATH_NAME; auto &api = assertProxyApi (); zypp::AutoDispose proxies( api.getProxies(_factory, url_r.asString(vopt).c_str()) , api.freeProxies ); if ( !proxies.value() ) return ""; /* cURL can only handle HTTP proxies, not SOCKS. And can only handle one. So look through the list and find an appropriate one. */ std::optional result; for (int i = 0; proxies[i]; i++) { if ( !result && !strncmp(proxies[i], "http://", 7) ) { result = str::asString( proxies[i] ); } } return result.value_or( "" ); } ProxyInfo::NoProxyIterator ProxyInfoLibproxy::noProxyBegin() const { return _no_proxy.begin(); } ProxyInfo::NoProxyIterator ProxyInfoLibproxy::noProxyEnd() const { return _no_proxy.end(); } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-curl/proxyinfo/proxyinfolibproxy.h000066400000000000000000000043271476576476200234250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/proxyinfo/ProxyInfoLibproxy.h * */ #ifndef ZYPP_MEDIA_PROXYINFO_PROXYINFOLIBPROXY_H #define ZYPP_MEDIA_PROXYINFO_PROXYINFOLIBPROXY_H #include #include #include #include extern "C" { typedef struct _pxProxyFactory pxProxyFactoryType; } namespace zypp { namespace media { template using CreateFactorySig = ProxyFactoryType *(*) (void); template using DelFactorySig = void (*) (ProxyFactoryType *self); template using GetProxiesSig = char **(*) (ProxyFactoryType *self, const char *url); using FreeProxiesCb = void (*) (char **proxies); class ProxyInfoLibproxy : public ProxyInfo::Impl { public: ProxyInfoLibproxy(); /** */ ~ProxyInfoLibproxy() override; static bool isAvailabe(); /** */ bool enabled() const override { return _enabled; } /** */ std::string proxy(const Url & url_r) const override; /** */ ProxyInfo::NoProxyList noProxy() const override { return _no_proxy; } /** */ ProxyInfo::NoProxyIterator noProxyBegin() const override; /** */ ProxyInfo::NoProxyIterator noProxyEnd() const override; private: DefaultIntegral _enabled; ProxyInfo::NoProxyList _no_proxy; pxProxyFactoryType *_factory; }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_PROXYINFO_PROXYINFOLIBPROXY_H libzypp-17.36.5/zypp-curl/proxyinfo/proxyinfos.h000066400000000000000000000016751476576476200220220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/proxyinfo/proxyinfos.h * */ #ifndef ZYPP_CURL_PROXYINFO_PROXYINFOS_H_INCLUDED #define ZYPP_CURL_PROXYINFO_PROXYINFOS_H_INCLUDED #include #include #include #ifdef WITH_LIBPROXY_SUPPORT #include #endif #endif // ZYPP_CURL_PROXYINFO_PROXYINFOS_H_INCLUDED libzypp-17.36.5/zypp-curl/proxyinfo/proxyinfosysconfig.cc000066400000000000000000000042741476576476200237200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/proxyinfo/ProxyInfoSysconfig.cc * */ #include "proxyinfosysconfig.h" #include #include #include #include #include using namespace zypp::base; namespace zypp { namespace media { ProxyInfoSysconfig::ProxyInfoSysconfig(const Pathname & path) : ProxyInfo::Impl() { std::map data = sysconfig::read( path.relative() ? "/etc/sysconfig" + path : path); std::map::const_iterator it = data.find("PROXY_ENABLED"); if (it != data.end()) _enabled = it->second != "no"; it = data.find("HTTP_PROXY"); if (it != data.end()) _proxies["http"] = it->second; it = data.find("HTTPS_PROXY"); if (it != data.end()) _proxies["https"] = it->second; it = data.find("FTP_PROXY"); if (it != data.end()) _proxies["ftp"] = it->second; it = data.find("NO_PROXY"); if (it != data.end()) str::split(it->second, std::back_inserter(_no_proxy), ", \t"); } std::string ProxyInfoSysconfig::proxy(const Url & url_r) const { std::map::const_iterator it = _proxies.find(url_r.getScheme()); if (it != _proxies.end()) return it->second; return ""; } ProxyInfo::NoProxyIterator ProxyInfoSysconfig::noProxyBegin() const { return _no_proxy.begin(); } ProxyInfo::NoProxyIterator ProxyInfoSysconfig::noProxyEnd() const { return _no_proxy.end(); } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-curl/proxyinfo/proxyinfosysconfig.h000066400000000000000000000034551476576476200235620ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/proxyinfo/ProxyInfoSysconfig * */ #ifndef ZYPP_CURL_PROXYINFO_PROXYINFOSYSCONFIG_H_INCLUDED #define ZYPP_CURL_PROXYINFO_PROXYINFOSYSCONFIG_H_INCLUDED #include #include #include #include #include #include namespace zypp { namespace media { class ProxyInfoSysconfig : public ProxyInfo::Impl { public: ProxyInfoSysconfig(const Pathname & path); /** */ bool enabled() const override { return _enabled; } /** */ std::string proxy(const Url & url_r) const override; /** */ ProxyInfo::NoProxyList noProxy() const override { return _no_proxy; } /** */ ProxyInfo::NoProxyIterator noProxyBegin() const override; /** */ ProxyInfo::NoProxyIterator noProxyEnd() const override; private: DefaultIntegral _enabled; ProxyInfo::NoProxyList _no_proxy; std::map _proxies; }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_CURL_PROXYINFO_PROXYINFOSYSCONFIG_H_INCLUDED libzypp-17.36.5/zypp-curl/transfersettings.cc000066400000000000000000000237601476576476200213070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/transfersettings.cc * */ #include "transfersettings.h" #include #include #include #include #include #include #include #include #include #include using std::endl; #define CURL_BINARY "/usr/bin/curl" namespace zypp { namespace media { class TransferSettings::Impl { public: Impl() : _useproxy( false ), _timeout( MediaConfig::instance().download_transfer_timeout() ), _connect_timeout( MediaConfig::instance().download_connect_timeout() ), _maxConcurrentConnections( MediaConfig::instance().download_max_concurrent_connections() ), _minDownloadSpeed(MediaConfig::instance().download_min_download_speed()), _maxDownloadSpeed(MediaConfig::instance().download_max_download_speed()), _maxSilentTries(MediaConfig::instance().download_max_silent_tries() ), _verify_host(false), _verify_peer(false), _ca_path("/etc/ssl/certs"), _enableCookieFile(false), _head_requests_allowed(true) {} Impl(const Impl &) = default; Impl(Impl &&) = default; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; virtual ~Impl() {} /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } public: void safeAddHeader( std::string val_r ) { // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space. // Trim and discard empty header. val_r = str::trim( std::move(val_r) ); if ( not val_r.empty() ) _headers.push_back( std::move(val_r) ); else WAR << "Discard empty header" << endl; } public: std::vector _headers; std::string _useragent; std::string _username; std::string _password; bool _useproxy; std::string _proxy; std::string _proxy_username; std::string _proxy_password; std::string _authtype; long _timeout; long _connect_timeout; Url _url; Pathname _targetdir; long _maxConcurrentConnections; long _minDownloadSpeed; long _maxDownloadSpeed; long _maxSilentTries; bool _verify_host; bool _verify_peer; Pathname _ca_path; Pathname _client_cert_path; Pathname _client_key_path; bool _enableCookieFile; // workarounds bool _head_requests_allowed; }; TransferSettings::TransferSettings() : _impl(new TransferSettings::Impl()) {} void TransferSettings::reset() { _impl.reset(new TransferSettings::Impl()); } void TransferSettings::addHeader( const std::string & val_r ) { _impl->safeAddHeader( val_r ); } void TransferSettings::addHeader( std::string && val_r ) { _impl->safeAddHeader( std::move(val_r) ); } const TransferSettings::Headers &TransferSettings::headers() const { //@TODO check if we could use a vector of std::string_view here return _impl->_headers; } void TransferSettings::setUserAgentString( const std::string &val_r ) { _impl->_useragent = str::trim( val_r ); } // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space void TransferSettings::setUserAgentString( std::string && val_r ) { _impl->_useragent = str::trim( std::move(val_r) ); } // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space const std::string &TransferSettings::userAgentString() const { return _impl->_useragent; } void TransferSettings::setUsername( const std::string &val_r ) { _impl->_username = val_r; } void TransferSettings::setUsername( std::string && val_r ) { _impl->_username = std::move(val_r); } const std::string &TransferSettings::username() const { return _impl->_username; } void TransferSettings::setPassword( const std::string & val_r ) { _impl->_password = val_r; } void TransferSettings::setPassword( std::string && val_r ) { _impl->_password = std::move(val_r); } const std::string &TransferSettings::password() const { return _impl->_password; } std::string TransferSettings::userPassword() const { std::string userpwd = username(); if ( password().size() ) { userpwd += ":" + password(); } return userpwd; } void TransferSettings::setAnonymousAuth() { setUsername("anonymous"); setPassword("yast@" LIBZYPP_VERSION_STRING); } void TransferSettings::setProxyEnabled( bool enabled ) { _impl->_useproxy = enabled; } bool TransferSettings::proxyEnabled() const { return _impl->_useproxy; } void TransferSettings::setProxy( const std::string &val_r ) { _impl->_proxy = val_r; } void TransferSettings::setProxy( std::string && val_r ) { _impl->_proxy = std::move(val_r); } const std::string &TransferSettings::proxy() const { return _impl->_proxy; } void TransferSettings::setProxyUsername( const std::string &val_r ) { _impl->_proxy_username = val_r; } void TransferSettings::setProxyUsername( std::string && val_r ) { _impl->_proxy_username = std::move(val_r); } const std::string &TransferSettings::proxyUsername() const { return _impl->_proxy_username; } void TransferSettings::setProxyPassword( const std::string &val_r ) { _impl->_proxy_password = val_r; } void TransferSettings::setProxyPassword( std::string && val_r ) { _impl->_proxy_password = std::move(val_r); } const std::string &TransferSettings::proxyPassword() const { return _impl->_proxy_password; } std::string TransferSettings::proxyUserPassword() const { std::string userpwd = proxyUsername(); if ( proxyPassword().size() ) { userpwd += ":" + proxyPassword(); } return userpwd; } void TransferSettings::setTimeout( long t ) { _impl->_timeout = (t); } long TransferSettings::timeout() const { return _impl->_timeout; } void TransferSettings::setConnectTimeout( long t ) { _impl->_connect_timeout = (t); } long TransferSettings::connectTimeout() const { return _impl->_connect_timeout; } void TransferSettings::setMaxConcurrentConnections( long v ) { _impl->_maxConcurrentConnections = (v); } long TransferSettings::maxConcurrentConnections() const { return _impl->_maxConcurrentConnections; } void TransferSettings::setMinDownloadSpeed( long v ) { _impl->_minDownloadSpeed = (v); } long TransferSettings::minDownloadSpeed() const { return _impl->_minDownloadSpeed; } void TransferSettings::setMaxDownloadSpeed( long v ) { _impl->_maxDownloadSpeed = (v); } long TransferSettings::maxDownloadSpeed() const { return _impl->_maxDownloadSpeed; } void TransferSettings::setMaxSilentTries( long v ) { _impl->_maxSilentTries = (v); } long TransferSettings::maxSilentTries() const { return _impl->_maxSilentTries; } void TransferSettings::setVerifyHostEnabled( bool enabled ) { _impl->_verify_host = (enabled); } bool TransferSettings::verifyHostEnabled() const { return _impl->_verify_host; } void TransferSettings::setVerifyPeerEnabled( bool enabled ) { _impl->_verify_peer = enabled; } bool TransferSettings::verifyPeerEnabled() const { return _impl->_verify_peer; } void TransferSettings::setClientCertificatePath( const Pathname &val_r ) { _impl->_client_cert_path = val_r; } void TransferSettings::setClientCertificatePath( Pathname && val_r ) { _impl->_client_cert_path = std::move( val_r ); } const Pathname &TransferSettings::clientCertificatePath() const { return _impl->_client_cert_path; } void TransferSettings::setClientKeyPath( const Pathname &val_r ) { _impl->_client_key_path = val_r; } void TransferSettings::setClientKeyPath( Pathname && val_r ) { _impl->_client_key_path = std::move( val_r ); } const Pathname &TransferSettings::clientKeyPath() const { return _impl->_client_key_path; } void TransferSettings::setEnableCookieFile(bool enable) { _impl->_enableCookieFile = enable; } bool TransferSettings::cookieFileEnabled() const { return _impl->_enableCookieFile; } void TransferSettings::setCertificateAuthoritiesPath( const Pathname &val_r ) { _impl->_ca_path = val_r; } void TransferSettings::setCertificateAuthoritiesPath( Pathname && val_r ) { _impl->_ca_path = std::move(val_r); } const Pathname &TransferSettings::certificateAuthoritiesPath() const { return _impl->_ca_path; } void TransferSettings::setAuthType( const std::string &val_r ) { _impl->_authtype = val_r; } void TransferSettings::setAuthType( std::string && val_r ) { _impl->_authtype = std::move(val_r); } const std::string &TransferSettings::authType() const { return _impl->_authtype; } void TransferSettings::setHeadRequestsAllowed( bool allowed ) { _impl->_head_requests_allowed = allowed; } bool TransferSettings::headRequestsAllowed() const { return _impl->_head_requests_allowed; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-curl/transfersettings.h000066400000000000000000000150141476576476200211420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-curl/TransferSettings * */ #ifndef ZYPP_CURL_TRANSFER_SETTINGS_H_INCLUDED #define ZYPP_CURL_TRANSFER_SETTINGS_H_INCLUDED #include #include #include #include #include #include namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// /// \brief Holds transfer setting /// /// \note bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a /// space. The class asserts \ref headers and \ref userAgentString /// return trimmed strings. Strings are trimmed when set. Empty // strings are discarded. class TransferSettings { public: /** Constructs a transfer program cmd line access. */ TransferSettings(); using Headers = std::vector; /** reset the settings to the defaults */ void reset(); /** add a header, on the form "Foo: Bar" (trims)*/ void addHeader( std::string && val_r ); void addHeader( const std::string & val_r ); /** returns a list of all added headers (trimmed) */ const Headers &headers() const; /** sets the user agent ie: "Mozilla v3" (trims) */ void setUserAgentString( std::string && val_r ); void setUserAgentString( const std::string &val_r ); /** user agent string (trimmed)*/ const std::string &userAgentString() const; /** sets the auth username */ void setUsername( const std::string &val_r ); void setUsername( std::string && val_r ); /** auth username */ const std::string &username() const; /** sets the auth password */ void setPassword( const std::string & val_r ); void setPassword( std::string && val_r ); /** auth password */ const std::string &password() const; /** returns the user and password as a user:pass string */ std::string userPassword() const; /** sets anonymous authentication (ie: for ftp) */ void setAnonymousAuth(); /** whether the proxy is used or not */ void setProxyEnabled( bool enabled ); /** proxy is enabled */ bool proxyEnabled() const; /** proxy to use if it is enabled */ void setProxy( const std::string &val_r ); void setProxy( std::string && val_r ); /** proxy host */ const std::string &proxy() const; /** sets the proxy user */ void setProxyUsername( const std::string &val_r ); void setProxyUsername( std::string && val_r ); /** proxy auth username */ const std::string &proxyUsername() const; /** sets the proxy password */ void setProxyPassword( const std::string &val_r ); void setProxyPassword( std::string && val_r ); /** proxy auth password */ const std::string &proxyPassword() const; /** returns the proxy user and password as a user:pass string */ std::string proxyUserPassword() const; /** set the connect timeout */ void setConnectTimeout( long t ); /** connection timeout */ long connectTimeout() const; /** set the transfer timeout */ void setTimeout( long t ); /** transfer timeout */ long timeout() const; /** Set maximum number of concurrent connections for a single transfer */ void setMaxConcurrentConnections(long v); /** Maximum number of concurrent connections for a single transfer */ long maxConcurrentConnections() const; /** Set minimum download speed (bytes per second) until the connection is dropped */ void setMinDownloadSpeed(long v); /** Minimum download speed (bytes per second) until the connection is dropped */ long minDownloadSpeed() const; /** Set max download speed (bytes per second) */ void setMaxDownloadSpeed(long v); /** Maximum download speed (bytes per second) */ long maxDownloadSpeed() const; /** Set maximum silent retries */ void setMaxSilentTries(long v); /** Maximum silent retries */ long maxSilentTries() const; /** Sets whether to verify host for ssl */ void setVerifyHostEnabled( bool enabled ); /** Whether to verify host for ssl */ bool verifyHostEnabled() const; /** Sets whether to verify host for ssl */ void setVerifyPeerEnabled( bool enabled ); /** Whether to verify peer for ssl */ bool verifyPeerEnabled() const; /** Sets the SSL certificate authorities path */ void setCertificateAuthoritiesPath( const Pathname &val_r ); void setCertificateAuthoritiesPath( Pathname && val_r ); /** SSL certificate authorities path ( default: /etc/ssl/certs ) */ const Pathname &certificateAuthoritiesPath() const; /** set the allowed authentication types */ void setAuthType( const std::string &val_r ); void setAuthType( std::string && val_r ); /** get the allowed authentication types */ const std::string &authType() const; /** set whether HEAD requests are allowed */ void setHeadRequestsAllowed(bool allowed); /** whether HEAD requests are allowed */ bool headRequestsAllowed() const; /** Sets the SSL client certificate file */ void setClientCertificatePath( const Pathname &val_r ); void setClientCertificatePath( Pathname && val_r ); /** SSL client certificate file */ const Pathname &clientCertificatePath() const; /** Sets the SSL client key file */ void setClientKeyPath( const Pathname &val_r ); void setClientKeyPath( Pathname && val_r ); /** SSL client key file */ const Pathname &clientKeyPath() const; /** Enable or disable the use of the cookie file */ void setEnableCookieFile( bool enable = true ); bool cookieFileEnabled() const; protected: class Impl; RWCOW_pointer _impl; }; } // namespace media } // namespece zypp #endif // ZYPP_CURL_TRANSFER_SETTINGS_H_INCLUDED libzypp-17.36.5/zypp-history.lr000066400000000000000000000002111476576476200164500ustar00rootroot00000000000000/var/log/zypp/history { compress dateext notifempty missingok nocreate maxage 1827 rotate 99 size 10M } libzypp-17.36.5/zypp-media/000077500000000000000000000000001476576476200154755ustar00rootroot00000000000000libzypp-17.36.5/zypp-media/CDTools000066400000000000000000000000251476576476200167240ustar00rootroot00000000000000#include "cdtools.h" libzypp-17.36.5/zypp-media/CMakeLists.txt000066400000000000000000000064011476576476200202360ustar00rootroot00000000000000# Collect all files that may contain translatable texts FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" ) SET( POT_FILE_DEPENDS_ZYPP_MEDIA ${POT_FILE_DEPENDS} PARENT_SCOPE ) INCLUDE_DIRECTORIES ( ${LIBZYPP_SOURCE_DIR} ) ADD_DEFINITIONS( -DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL ) SET( zypp_media_HEADERS CDTools cdtools.h FileCheckException filecheckexception.h MediaConfig mediaconfig.h mediaexception.h MediaException mount.h Mount ) SET( zypp_media_private_HEADERS ) SET( zypp_media_SRCS cdtools.cc filecheckexception.cc mediaconfig.cc mediaexception.cc mount.cc ) INSTALL( FILES ${zypp_media_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-media" ) SET( zypp_media_auth_HEADERS auth/AuthData auth/authdata.h auth/CredentialFileReader auth/credentialfilereader.h auth/CredentialManager auth/credentialmanager.h ) SET( zypp_media_auth_private_HEADERS ) SET( zypp_media_auth_SRCS auth/authdata.cc auth/credentialfilereader.cc auth/credentialmanager.cc ) INSTALL( FILES ${zypp_media_auth_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-media/auth" ) SET( zypp_media_ng_HEADERS ng/headervaluemap.h ng/HeaderValueMap ng/lazymediahandle.h ng/LazyMediaHandle ng/provide.h ng/Provide ng/providefwd.h ng/ProvideFwd ng/provide-configvars.h ng/providespec.h ng/ProvideSpec ng/provideres.h ng/provideitem.h ng/ProvideRes ng/mediaverifier.h ng/MediaVerifier ng/worker/devicedriver.h ng/worker/DeviceDriver ng/worker/provideworker.h ng/worker/ProvideWorker ng/worker/mountingworker.h ng/worker/MountingWorker ) SET( zypp_media_ng_private_HEADERS ng/private/attachedmediainfo_p.h ng/private/provide_p.h ng/private/providefwd_p.h ng/private/provideitem_p.h ng/private/providemessage_p.h ng/private/providequeue_p.h ng/private/provideres_p.h ng/private/providedbg_p.h ) SET( zypp_media_ng_SRCS ng/attachedmediainfo.cc ng/headervaluemap.cc ng/provide.cc ng/provideres.cc ng/providespec.cc ng/provideitem.cc ng/providemessage.cc ng/providequeue.cc ng/mediaverifier.cc ng/worker/devicedriver.cc ng/worker/provideworker.cc ng/worker/mountingworker.cc ) INSTALL( FILES ${zypp_media_ng_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-media/ng" ) SET( zypp_media_lib_SRCS ${zypp_media_SRCS} ${zypp_media_auth_SRCS} ${zypp_media_ng_SRCS} ) SET( zypp_media_lib_HEADERS ${zypp_media_private_HEADERS} ${zypp_media_HEADERS} ${zypp_media_auth_private_HEADERS} ${zypp_media_auth_HEADERS} ${zypp_media_ng_private_HEADERS} ${zypp_media_ng_HEADERS} ) # Default loggroup for all files SET_LOGGROUP( "zypp-media" ${zypp_media_lib_SRCS} ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) set_source_files_properties( ng/providemessage.cc PROPERTIES SKIP_LINTING ON ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set( CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK} ) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) ADD_LIBRARY( zypp-media STATIC ${zypp_media_lib_SRCS} ${zypp_media_lib_HEADERS} ) target_link_libraries( zypp-media PRIVATE zypp_lib_compiler_flags ) libzypp-17.36.5/zypp-media/FileCheckException000066400000000000000000000000401476576476200211060ustar00rootroot00000000000000#include "filecheckexception.h" libzypp-17.36.5/zypp-media/MediaConfig000066400000000000000000000000311476576476200175570ustar00rootroot00000000000000#include "mediaconfig.h" libzypp-17.36.5/zypp-media/MediaException000066400000000000000000000000341476576476200203130ustar00rootroot00000000000000#include "mediaexception.h" libzypp-17.36.5/zypp-media/Mount000066400000000000000000000000231476576476200165150ustar00rootroot00000000000000#include "mount.h" libzypp-17.36.5/zypp-media/auth/000077500000000000000000000000001476576476200164365ustar00rootroot00000000000000libzypp-17.36.5/zypp-media/auth/AuthData000066400000000000000000000000261476576476200200520ustar00rootroot00000000000000#include "authdata.h" libzypp-17.36.5/zypp-media/auth/CredentialFileReader000066400000000000000000000000421476576476200223520ustar00rootroot00000000000000#include "credentialfilereader.h" libzypp-17.36.5/zypp-media/auth/CredentialManager000066400000000000000000000000371476576476200217260ustar00rootroot00000000000000#include "credentialmanager.h" libzypp-17.36.5/zypp-media/auth/authdata.cc000066400000000000000000000045651476576476200205520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/auth/authdata.cc * */ #include "authdata.h" #include using std::endl; namespace zypp { namespace media { AuthData::AuthData(const Url & url) : _url(url), _lastChange(0) { _username = url.getUsername(); _password = url.getPassword(); } bool AuthData::valid() const { return username().size() && password().size(); } time_t AuthData::lastDatabaseUpdate() const { return _lastChange; } void AuthData::setLastDatabaseUpdate( time_t time ) { _lastChange = time; } const std::map &AuthData::extraValues() const { return _extraValues; } std::map &AuthData::extraValues() { return _extraValues; } std::ostream & AuthData::dumpOn( std::ostream & str ) const { if (_url.isValid()) str << "[" << _url.asString( url::ViewOptions() - url::ViewOptions::WITH_USERNAME - url::ViewOptions::WITH_PASSWORD ) << "]" << endl; else str << "[]" << endl; str << "username: '" << _username << "'" << std::endl << "password: " << (_password.empty() ? "" : ""); return str; } std::ostream & AuthData::dumpAsIniOn( std::ostream & str ) const { if (_url.isValid()) str << "[" << _url.asString( url::ViewOptions() - url::ViewOptions::WITH_USERNAME - url::ViewOptions::WITH_PASSWORD) << "]" << endl; str << "username = " << _username << endl << "password = " << _password << endl; for ( const auto &v : _extraValues ) { if ( v.first == "username" || v.first == "password" ) continue; str << v.first << " = " << v.second << endl; } return str; } std::ostream & operator << (std::ostream & str, const AuthData & auth_data) { auth_data.dumpOn(str); return str; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-media/auth/authdata.h000066400000000000000000000054331476576476200204070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/auth/AuthData * Convenience interface for handling authentication data of media user. */ #ifndef ZYPP_MEDIA_AUTH_DATA_H #define ZYPP_MEDIA_AUTH_DATA_H #include #include #include namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// /** * Class for handling media authentication data. This is the most generic * class containing only username and password members. */ class ZYPP_API AuthData { public: AuthData() {} AuthData(const Url & url); AuthData(std::string username, std::string password) : _username(std::move(username)), _password(std::move(password)), _lastChange(0) {} virtual ~AuthData() {}; /** * Checks validity of authentication data. * \return true if the object contains non-empty username and * non-empty password, false otherwise. */ virtual bool valid() const; void setUrl(const Url & url) { _url = url; } void setUsername(const std::string & username) { _username = username; } void setPassword(const std::string & password) { _password = password; } Url url() const { return _url; } std::string username() const { return _username; } std::string password() const { return _password; } /*! * Returns the timestamp of the last change to the database this * credential is stored in, or 0 if it is not known. */ time_t lastDatabaseUpdate () const; void setLastDatabaseUpdate ( time_t time ); const std::map &extraValues() const; std::map &extraValues(); virtual std::ostream & dumpOn( std::ostream & str ) const; virtual std::ostream & dumpAsIniOn( std::ostream & str ) const; private: Url _url; std::string _username; std::string _password; time_t _lastChange; //< timestamp of the last change to the database this credential is stored in std::map _extraValues; }; using AuthData_Ptr = shared_ptr; std::ostream & operator << (std::ostream & str, const AuthData & auth_data); /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_AUTH_DATA_H libzypp-17.36.5/zypp-media/auth/credentialfilereader.cc000066400000000000000000000117031476576476200231040ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/auth/credentialfilereader * */ #include "credentialfilereader.h" #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "parser" /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace media { /////////////////////////////////////////////////////////////////// namespace { // Looks like INI but allows multiple sections for the same URL // but different user (in .cat files). So don't use an Ini // Also support a global section without '[URL]' which is used // in credential files. // ------------------------------------- // username = emptyUSER // password = emptyPASS // ------------------------------------- // [http://server/tmp/sumafake222] // username = USER // password = PASS // // [http://server/tmp/sumafake222] // username = USER2 // password = PASS // ------------------------------------- struct CredentialFileReaderImpl : public parser::IniParser { using ProcessCredentials = CredentialFileReader::ProcessCredentials; struct StopParsing {}; CredentialFileReaderImpl( const Pathname & input_r, const ProcessCredentials & callback_r ) : _input( input_r ) , _callback( callback_r ) { zypp::PathInfo pi( input_r ); _lastChange = pi.mtime(); try { parse( input_r ); } catch ( StopParsing ) { /* NO error but consumer aborted parsing */ } } // NO-OP; new sections are opened in consume() void beginParse() override { /*EMPTY*/ } // start a new section [url] void consume( const std::string & section_r ) override { endParse(); // close any open section _secret.reset( new AuthData ); try { _secret->setUrl( Url(section_r) ); } catch ( const url::UrlException & ) { ERR << "Ignore invalid URL '" << section_r << "' in file " << _input << endl; _secret.reset(); // ignore this section } } void consume( const std::string & section_r, const std::string & key_r, const std::string & value_r ) override { if ( !_secret && section_r.empty() ) _secret.reset( new AuthData ); // a initial global section without [URL] if ( _secret ) { if ( key_r == "username" ) _secret->setUsername( value_r ); else if ( key_r == "password" ) _secret->setPassword( value_r ); else _secret->extraValues()[key_r] = value_r; } // else: ignored section due to wrong URL } // send any valid pending section void endParse() override { if ( _secret ) { if ( _secret->valid() ) { _secret->setLastDatabaseUpdate( _lastChange ); if ( !_callback( _secret ) ) throw( StopParsing() ); } else ERR << "Ignore invalid credentials for URL '" << _secret->url() << "' in file " << _input << endl; } } private: const Pathname & _input; const ProcessCredentials & _callback; AuthData_Ptr _secret; time_t _lastChange; }; } // namespace /////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // // CLASS NAME : CredentialFileReader // ////////////////////////////////////////////////////////////////////// CredentialFileReader::CredentialFileReader( const Pathname & crfile_r, const ProcessCredentials & callback_r ) { CredentialFileReaderImpl( crfile_r, callback_r ); } CredentialFileReader::~CredentialFileReader() {} } // namespace media /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-media/auth/credentialfilereader.h000066400000000000000000000036121476576476200227460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/auth/CredentialFileReader * */ #ifndef ZYPP_MEDIA_AUTH_CREDENTIALFILEREADER_H #define ZYPP_MEDIA_AUTH_CREDENTIALFILEREADER_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace media { ////////////////////////////////////////////////////////////////////// /// \class CredentialFileReader /// \brief Parse credentials files and catalogs class CredentialFileReader { public: /** Callback invoked for each entry found in the file. * Return \c false to abort parsing. */ using ProcessCredentials = function; CredentialFileReader( const Pathname & crfile_r, const ProcessCredentials & callback_r ); ~CredentialFileReader(); private: ProcessCredentials _callback; }; ////////////////////////////////////////////////////////////////////// } // namespace media /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif /* ZYPP_MEDIA_AUTH_CREDENTIALFILEREADER_H */ libzypp-17.36.5/zypp-media/auth/credentialmanager.cc000066400000000000000000000354251476576476200224230ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/auth/credentialmanager.cc * */ #include "credentialmanager.h" #include #include #include #include #include #include #include #include #include #include #include #include #include namespace bpci = boost::interprocess; using std::endl; #define USER_CREDENTIALS_FILE ".zypp/credentials.cat" ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// namespace media { //////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // // CLASS NAME : AuthDataComparator // ////////////////////////////////////////////////////////////////////// bool AuthDataComparator::operator()( const AuthData_Ptr & lhs, const AuthData_Ptr & rhs ) const { static const url::ViewOption vopt = url::ViewOption::DEFAULTS - url::ViewOption::WITH_USERNAME - url::ViewOption::WITH_PASSWORD - url::ViewOption::WITH_QUERY_STR; // std::less semantic! int cmp = lhs->url().asString(vopt).compare( rhs->url().asString(vopt) ); if ( ! cmp ) cmp = lhs->username().compare( rhs->username() ); return( cmp < 0 ); } ////////////////////////////////////////////////////////////////////// // // CLASS NAME : CredManagerOptions // ////////////////////////////////////////////////////////////////////// CredManagerOptions::CredManagerOptions(const Pathname & rootdir) : globalCredFilePath(rootdir / MediaConfig::instance().credentialsGlobalFile()) , customCredFileDir(rootdir / MediaConfig::instance().credentialsGlobalDir()) { char * homedir = getenv("HOME"); if (homedir) userCredFilePath = rootdir / homedir / USER_CREDENTIALS_FILE; } ////////////////////////////////////////////////////////////////////// // // CLASS NAME : CredentialManager::Impl // struct CredentialManager::Impl { Impl(CredManagerOptions &&options); Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() {} void init_globalCredentials(); void init_userCredentials(); bool processCredentials(AuthData_Ptr & cred); AuthData_Ptr getCred(const Url & url) const; AuthData_Ptr getCredFromFile(const Pathname & file); void saveGlobalCredentials(); void saveUserCredentials(); CredManagerOptions _options; CredentialSet _credsGlobal; CredentialSet _credsUser; CredentialSet _credsTmp; bool _globalDirty; bool _userDirty; }; ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // // CLASS NAME : CredentialManager::Impl // ////////////////////////////////////////////////////////////////////// CredentialManager::Impl::Impl(CredManagerOptions &&options) : _options(std::move(options)) , _globalDirty(false) , _userDirty(false) { init_globalCredentials(); init_userCredentials(); } void CredentialManager::Impl::init_globalCredentials() { if (_options.globalCredFilePath.empty()) DBG << "global cred file not known"; else if (PathInfo(_options.globalCredFilePath).isExist()) { /* list entries; if (filesystem::readdir(entries, _options.globalCredFilePath, false) != 0) ZYPP_THROW(Exception("failed to read directory")); for_(it, entries.begin(), entries.end())*/ CredentialFileReader(_options.globalCredFilePath, bind(&Impl::processCredentials, this, _1)); } else DBG << "global cred file does not exist"; _credsGlobal = _credsTmp; _credsTmp.clear(); DBG << "Got " << _credsGlobal.size() << " global records." << endl; } void CredentialManager::Impl::init_userCredentials() { if (_options.userCredFilePath.empty()) DBG << "user cred file not known"; else if (PathInfo(_options.userCredFilePath).isExist()) { /* list entries; if (filesystem::readdir(entries, _options.userCredFilePath, false ) != 0) ZYPP_THROW(Exception("failed to read directory")); for_(it, entries.begin(), entries.end())*/ CredentialFileReader(_options.userCredFilePath, bind(&Impl::processCredentials, this, _1)); } else DBG << "user cred file does not exist" << endl; _credsUser = _credsTmp; _credsTmp.clear(); DBG << "Got " << _credsUser.size() << " user records." << endl; } bool CredentialManager::Impl::processCredentials(AuthData_Ptr & cred) { _credsTmp.insert(cred); return true; } AuthData_Ptr CredentialManager::findIn(const CredentialManager::CredentialSet & set, const Url & url, url::ViewOption vopt) { const std::string & username = url.getUsername(); for( CredentialManager::CredentialIterator it = set.begin(); it != set.end(); ++it ) { if ( !(*it)->url().isValid() ) continue; // this ignores url params - not sure if it is good or bad... if ( url.asString(vopt).find((*it)->url().asString(vopt)) == 0 ) { if ( username.empty() || username == (*it)->username() ) return *it; } } return AuthData_Ptr(); } AuthData_Ptr CredentialManager::Impl::getCred(const Url & url) const { AuthData_Ptr result; // compare the urls via asString(), but ignore password // default url::ViewOption will take care of that. // operator==(Url,Url) compares the whole Url url::ViewOption vopt; vopt = vopt - url::ViewOption::WITH_USERNAME - url::ViewOption::WITH_PASSWORD - url::ViewOption::WITH_QUERY_STR; // search in global credentials result = findIn(_credsGlobal, url, vopt); // search in home credentials if (!result) result = findIn(_credsUser, url, vopt); if (result) DBG << "Found credentials for '" << url << "':" << endl << *result; else DBG << "No credentials for '" << url << "'" << endl; return result; } AuthData_Ptr CredentialManager::Impl::getCredFromFile(const Pathname & file) { AuthData_Ptr result; Pathname credfile; if (file.absolute()) // get from that file credfile = file; else // get from /etc/zypp/credentials.d, delete the leading path credfile = _options.customCredFileDir / file.basename(); PathInfo pi { credfile }; if ( pi.userMayR() ) try { // make sure only our thread accesses the file bpci::file_lock lockFile ( credfile.c_str() ); bpci::scoped_lock lock( lockFile ); CredentialFileReader(credfile, bind(&Impl::processCredentials, this, _1)); } catch ( ... ) { WAR << pi << " failed to lock file for reading." << endl; } if (_credsTmp.empty()) WAR << pi << " does not contain valid credentials or is not readable." << endl; else { result = *_credsTmp.begin(); _credsTmp.clear(); } return result; } static int save_creds_in_file( CredentialManager::CredentialSet &creds, const Pathname & file, const mode_t mode) { int ret = 0; filesystem::assert_file_mode( file, mode ); const auto now = time( nullptr ); PathInfo pi { file }; if ( pi.userMayRW() ) try { // make sure only our thread accesses the file bpci::file_lock lockFile ( file.c_str() ); bpci::scoped_lock lock( lockFile ); std::ofstream fs(file.c_str()); for ( auto& credentials : creds ) { credentials->dumpAsIniOn( fs ); credentials->setLastDatabaseUpdate( now ); fs << endl; } if ( !fs ) { WAR << pi << " failed to write credentials to file." << endl; ret = 1; } fs.close(); } catch ( ... ) { WAR << pi << " failed to lock file for writing." << endl; ret = 1; } return ret; } void CredentialManager::Impl::saveGlobalCredentials() { save_creds_in_file(_credsGlobal, _options.globalCredFilePath, 0640); } void CredentialManager::Impl::saveUserCredentials() { save_creds_in_file(_credsUser, _options.userCredFilePath, 0600); } ////////////////////////////////////////////////////////////////////// // // CLASS NAME : CredentialManager // ////////////////////////////////////////////////////////////////////// CredentialManager::CredentialManager(CredManagerOptions opts) : _pimpl(new Impl(std::move(opts))) {} AuthData_Ptr CredentialManager::getCred(const Url & url) { std::string credfile = url.getQueryParam("credentials"); if (credfile.empty()) return _pimpl->getCred(url); return _pimpl->getCredFromFile(credfile); } AuthData_Ptr CredentialManager::getCredFromFile(const Pathname & file) { return _pimpl->getCredFromFile(file); } void CredentialManager::addCred(const AuthData & cred) { if ( !cred.url().isValid() ) ZYPP_THROW( MediaInvalidCredentialsException( "URL must be valid in order to save AuthData." ) ); Pathname credfile = cred.url().getQueryParam("credentials"); if (credfile.empty()) //! \todo ask user where to store these creds. saving to user creds for now addUserCred(cred); else saveInFile(cred, credfile); } time_t CredentialManager::timestampForCredDatabase ( const zypp::Url &url ) { Pathname credfile; if ( url.isValid() ) { credfile = url.getQueryParam("credentials"); } if (credfile.empty()) credfile = _pimpl->_options.userCredFilePath; zypp::PathInfo pi(credfile); if ( pi.isExist() && pi.isFile() ) return pi.mtime(); return 0; } void CredentialManager::addGlobalCred(const AuthData & cred) { if ( !cred.url().isValid() ) ZYPP_THROW( MediaInvalidCredentialsException( "URL must be valid in order to save AuthData." ) ); AuthData_Ptr c_ptr; c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed std::pair ret = _pimpl->_credsGlobal.insert(c_ptr); if (ret.second) _pimpl->_globalDirty = true; else if ((*ret.first)->password() != cred.password()) { _pimpl->_credsGlobal.erase(ret.first); _pimpl->_credsGlobal.insert(c_ptr); _pimpl->_globalDirty = true; } } void CredentialManager::addUserCred(const AuthData & cred) { if ( !cred.url().isValid() ) ZYPP_THROW( MediaInvalidCredentialsException( "URL must be valid in order to save AuthData." ) ); AuthData_Ptr c_ptr; c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed std::pair ret = _pimpl->_credsUser.insert(c_ptr); if (ret.second) _pimpl->_userDirty = true; else if ((*ret.first)->password() != cred.password()) { _pimpl->_credsUser.erase(ret.first); _pimpl->_credsUser.insert(c_ptr); _pimpl->_userDirty = true; } } void CredentialManager::save() { if (_pimpl->_globalDirty) _pimpl->saveGlobalCredentials(); if (_pimpl->_userDirty) _pimpl->saveUserCredentials(); _pimpl->_globalDirty = false; _pimpl->_userDirty = false; } void CredentialManager::saveInGlobal(const AuthData & cred) { addGlobalCred(cred); save(); } void CredentialManager::saveInUser(const AuthData & cred) { addUserCred(cred); save(); } void CredentialManager::saveInFile(const AuthData & cred, const Pathname & credFile) { AuthData_Ptr c_ptr; c_ptr.reset(new AuthData(cred)); // FIX for child classes if needed c_ptr->setUrl(Url()); // don't save url in custom creds file CredentialManager::CredentialSet creds; creds.insert(c_ptr); int ret = 0; if (credFile.absolute()) ret = save_creds_in_file(creds, credFile, 0640); else ret = save_creds_in_file( creds, _pimpl->_options.customCredFileDir / credFile, 0600); if (!ret) { //! \todo figure out the reason(?), call back to user ERR << "error saving the credentials" << endl; } } void CredentialManager::clearAll(bool global) { if (global) { if (!filesystem::unlink(_pimpl->_options.globalCredFilePath)) ERR << "could not delete user credentials file " << _pimpl->_options.globalCredFilePath << endl; _pimpl->_credsUser.clear(); } else { if (!filesystem::unlink(_pimpl->_options.userCredFilePath)) ERR << "could not delete global credentials file" << _pimpl->_options.userCredFilePath << endl; _pimpl->_credsGlobal.clear(); } } CredentialManager::CredentialIterator CredentialManager::credsGlobalBegin() const { return _pimpl->_credsGlobal.begin(); } CredentialManager::CredentialIterator CredentialManager::credsGlobalEnd() const { return _pimpl->_credsGlobal.end(); } CredentialManager::CredentialSize CredentialManager::credsGlobalSize() const { return _pimpl->_credsGlobal.size(); } bool CredentialManager::credsGlobalEmpty() const { return _pimpl->_credsGlobal.empty(); } CredentialManager::CredentialIterator CredentialManager::credsUserBegin() const { return _pimpl->_credsUser.begin(); } CredentialManager::CredentialIterator CredentialManager::credsUserEnd() const { return _pimpl->_credsUser.end(); } CredentialManager::CredentialSize CredentialManager::credsUserSize() const { return _pimpl->_credsUser.size(); } bool CredentialManager::credsUserEmpty() const { return _pimpl->_credsUser.empty(); } //////////////////////////////////////////////////////////////////// } // media ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // zypp ////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-media/auth/credentialmanager.h000066400000000000000000000142611476576476200222600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/auth/CredentialManager * */ #ifndef ZYPP_MEDIA_AUTH_CREDENTIALMANAGER_H #define ZYPP_MEDIA_AUTH_CREDENTIALMANAGER_H #include #include #include #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// class Url; ////////////////////////////////////////////////////////////////////// namespace media { //////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // // CLASS NAME : CredManagerOptions // /** * \todo configurable cred file locations */ struct ZYPP_API CredManagerOptions { CredManagerOptions(const Pathname & rootdir = ""); Pathname globalCredFilePath; Pathname userCredFilePath; Pathname customCredFileDir; }; ////////////////////////////////////////////////////////////////////// // comparator for CredentialSet struct ZYPP_API AuthDataComparator { bool operator()(const AuthData_Ptr & lhs, const AuthData_Ptr & rhs) const; }; ////////////////////////////////////////////////////////////////////// // // CLASS NAME : CredentialManager // /** * \todo better method names * \todo delete(AuthData) method */ class ZYPP_API CredentialManager { public: using CredentialSet = std::set; using CredentialSize = CredentialSet::size_type; using CredentialIterator = CredentialSet::const_iterator; CredentialManager(CredManagerOptions opts = CredManagerOptions()); ~CredentialManager() {} public: /** * Get credentials for the specified \a url. * * If the URL contains also username, it will be used to find the match * for this user (in case mutliple are available). * * \param url URL to find credentials for. * \return Pointer to retrieved authentication data on success or an empty * AuthData_Ptr otherwise. * \todo return a copy instead? */ AuthData_Ptr getCred(const Url & url); /** * Read credentials from a file. */ AuthData_Ptr getCredFromFile(const Pathname & file); /** * Add new global credentials. */ void addGlobalCred(const AuthData & cred); /** * Add new user credentials. */ void addUserCred(const AuthData & cred); /** * Add new credentials with user callbacks. * * If the cred->url() contains 'credentials' query parameter, the * credentials will be automatically saved to the specified file using the * \ref saveInFile() method. * * Otherwise a callback will be called asking whether to save to custom * file, or to global or user's credentials catalog. * * \todo Currently no callback is called, credentials are automatically * saved to user's credentials.cat if no 'credentials' parameter * has been specified */ void addCred(const AuthData & cred); /** * Saves any unsaved credentials added via \ref addUserCred() or * \a addGlobalCred() methods. */ void save(); /** * Saves given \a cred to global credentials file. * * \note Use this method to add just one piece of credentials. To add * multiple items at once, use addGlobalCred() followed * by save() */ void saveInGlobal(const AuthData & cred); /** * Saves given \a cred to user's credentials file. * * \note Use this method to add just one piece of credentials. To add * multiple items at once, use addUserCred() followed * by save() */ void saveInUser(const AuthData & cred); /** * Saves given \a cred to user specified credentials file. * * If the credFile path is absolute, it will be saved at that precise * location. If \a credFile is just a filename, it will be saved * in \ref CredManagerOptions::customCredFileDir. Otherwise the current * working directory will be prepended to the file path. */ void saveInFile(const AuthData &, const Pathname & credFile); /** * Remove all global or user credentials from memory and disk. * * \param global Whether to remove global or user credentials. */ void clearAll(bool global = false); /*! * Helper function to find a matching AuthData instance in a CredentialSet */ static AuthData_Ptr findIn( const CredentialManager::CredentialSet & set, const Url & url, url::ViewOption vopt ); /*! * Returns the timestamp of the database the given URL creds would be stored */ time_t timestampForCredDatabase ( const zypp::Url &url ); CredentialIterator credsGlobalBegin() const; CredentialIterator credsGlobalEnd() const; CredentialSize credsGlobalSize() const; bool credsGlobalEmpty() const; CredentialIterator credsUserBegin() const; CredentialIterator credsUserEnd() const; CredentialSize credsUserSize() const; bool credsUserEmpty() const; struct Impl; private: RW_pointer _pimpl; }; ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // media ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // zypp ////////////////////////////////////////////////////////////////////// #endif /* ZYPP_MEDIA_AUTH_CREDENTIALMANAGER_H */ libzypp-17.36.5/zypp-media/cdtools.cc000066400000000000000000000053541476576476200174620ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "cdtools.h" extern "C" { #include #include } #include #include #include #include /* ** If defined to the full path of the eject utility, ** it will be used additionally to the eject-ioctl. */ #define EJECT_TOOL_PATH "/bin/eject" namespace zypp::media { bool CDTools::openTray(const std::string &device_r) { int fd = ::open( device_r.c_str(), O_RDONLY|O_NONBLOCK|O_CLOEXEC ); int res = -1; if ( fd != -1) { res = ::ioctl( fd, CDROMEJECT ); ::close( fd ); } if ( res ) { if( fd == -1) { WAR << "Unable to open '" << device_r << "' (" << ::strerror( errno ) << ")" << std::endl; } else { WAR << "Eject " << device_r << " failed (" << ::strerror( errno ) << ")" << std::endl; } #if defined(EJECT_TOOL_PATH) DBG << "Try to eject " << device_r << " using " << EJECT_TOOL_PATH << " utility" << std::endl; const char *cmd[3]; cmd[0] = EJECT_TOOL_PATH; cmd[1] = device_r.c_str(); cmd[2] = NULL; ExternalProgram eject(cmd, ExternalProgram::Stderr_To_Stdout); for(std::string out( eject.receiveLine()); out.length(); out = eject.receiveLine()) { DBG << " " << out; } if(eject.close() != 0) { WAR << "Eject of " << device_r << " failed." << std::endl; return false; } #else return false; #endif } MIL << "Eject of " << device_r << " successful." << std::endl; return true; } bool CDTools::closeTray(const std::string &device_r) { int fd = ::open( device_r.c_str(), O_RDONLY|O_NONBLOCK|O_CLOEXEC ); if ( fd == -1 ) { WAR << "Unable to open '" << device_r << "' (" << ::strerror( errno ) << ")" << std::endl; return false; } int res = ::ioctl( fd, CDROMCLOSETRAY ); ::close( fd ); if ( res ) { WAR << "Close tray " << device_r << " failed (" << ::strerror( errno ) << ")" << std::endl; return false; } DBG << "Close tray " << device_r << std::endl; return true; } } libzypp-17.36.5/zypp-media/cdtools.h000066400000000000000000000015701476576476200173200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/cdtools.h * */ #ifndef ZYPP_MEDIA_CDTOOLS_H #define ZYPP_MEDIA_CDTOOLS_H #include namespace zypp::media { class CDTools { public: static bool openTray( const std::string & device_r ); static bool closeTray( const std::string & device_r ); }; } #endif libzypp-17.36.5/zypp-media/filecheckexception.cc000066400000000000000000000012311476576476200216350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/filecheckexception.cc * */ #include "filecheckexception.h" libzypp-17.36.5/zypp-media/filecheckexception.h000066400000000000000000000024121476576476200215010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_FILECHECKEXCEPTION_H #define ZYPP_MEDIA_FILECHECKEXCEPTION_H #include namespace zypp { class ZYPP_API FileCheckException : public Exception { public: FileCheckException(std::string msg) : Exception(std::move(msg)) {} }; class ZYPP_API CheckSumCheckException : public FileCheckException { public: CheckSumCheckException(std::string msg) : FileCheckException(std::move(msg)) {} }; class ZYPP_API SignatureCheckException : public FileCheckException { public: SignatureCheckException(std::string msg) : FileCheckException(std::move(msg)) {} }; } #endif // ZYPP_MEDIA_FILECHECKEXCEPTION_H libzypp-17.36.5/zypp-media/mediaconfig.cc000066400000000000000000000103051476576476200202500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/mediaconfig.cc * */ #include "mediaconfig.h" #include #include namespace zypp { class MediaConfigPrivate { public: MediaConfigPrivate() : download_max_concurrent_connections( 5 ) , download_min_download_speed ( 0 ) , download_max_download_speed ( 0 ) , download_max_silent_tries ( 1 ) , download_transfer_timeout ( 180 ) , download_connect_timeout ( 60 ) { } Pathname credentials_global_dir_path; Pathname credentials_global_file_path; int download_max_concurrent_connections; int download_min_download_speed; int download_max_download_speed; int download_max_silent_tries; int download_transfer_timeout; int download_connect_timeout; }; MediaConfig::MediaConfig() : d_ptr( new MediaConfigPrivate() ) { } MediaConfig &MediaConfig::instance() { static MediaConfig instance; return instance; } bool MediaConfig::setConfigValue( const std::string §ion, const std::string &entry, const std::string &value ) { Z_D(); if ( section == "main" ) { if ( entry == "credentials.global.dir" ) { d->credentials_global_dir_path = Pathname(value); return true; } else if ( entry == "credentials.global.file" ) { d->credentials_global_file_path = Pathname(value); return true; } else if ( entry == "download.max_concurrent_connections" ) { str::strtonum(value, d->download_max_concurrent_connections); return true; } else if ( entry == "download.min_download_speed" ) { str::strtonum(value, d->download_min_download_speed); return true; } else if ( entry == "download.max_download_speed" ) { str::strtonum(value, d->download_max_download_speed); return true; } else if ( entry == "download.max_silent_tries" ) { str::strtonum(value, d->download_max_silent_tries); return true; } else if ( entry == "download.connect_timeout" ) { str::strtonum(value, d->download_connect_timeout); if ( d->download_connect_timeout < 0 ) d->download_connect_timeout = 0; return true; } else if ( entry == "download.transfer_timeout" ) { str::strtonum(value, d->download_transfer_timeout); if ( d->download_transfer_timeout < 0 ) d->download_transfer_timeout = 0; else if ( d->download_transfer_timeout > 3600 ) d->download_transfer_timeout = 3600; return true; } } return false; } Pathname MediaConfig::credentialsGlobalDir() const { Z_D(); return ( d->credentials_global_dir_path.empty() ? Pathname("/etc/zypp/credentials.d") : d->credentials_global_dir_path ); } Pathname MediaConfig::credentialsGlobalFile() const { Z_D(); return ( d->credentials_global_file_path.empty() ? Pathname("/etc/zypp/credentials.cat") : d->credentials_global_file_path ); } long MediaConfig::download_max_concurrent_connections() const { return d_func()->download_max_concurrent_connections; } long MediaConfig::download_min_download_speed() const { return d_func()->download_min_download_speed; } long MediaConfig::download_max_download_speed() const { return d_func()->download_max_download_speed; } long MediaConfig::download_max_silent_tries() const { return d_func()->download_max_silent_tries; } long MediaConfig::download_transfer_timeout() const { return d_func()->download_transfer_timeout; } long MediaConfig::download_connect_timeout() const { return d_func()->download_connect_timeout; } ZYPP_IMPL_PRIVATE(MediaConfig) } libzypp-17.36.5/zypp-media/mediaconfig.h000066400000000000000000000052441476576476200201200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/MediaConfig * */ #ifndef ZYPP_MEDIA_MEDIACONFIG_H #define ZYPP_MEDIA_MEDIACONFIG_H #include #include #include #include #include namespace zypp { class MediaConfigPrivate; /*! * Helper class to collect global options and settings related to zypp-media. * Use it to avoid hardcoded values and calls to getZYpp() just * to retrieve some value like credentials path or download related settings. * * Note, if you add settings to this file, please follow the following * convention: * * namespace.settingname * * should become * * namespace_settingName() * * \ingroup ZyppConfig * \ingroup Singleton */ class MediaConfig : private base::NonCopyable { ZYPP_DECLARE_PRIVATE(MediaConfig) public: /*! Singleton ctor */ static MediaConfig & instance(); bool setConfigValue ( const std::string §ion, const std::string &entry, const std::string &value ); /*! * Defaults to /etc/zypp/credentials.d */ Pathname credentialsGlobalDir() const; /*! * Defaults to /etc/zypp/credentials.cat */ Pathname credentialsGlobalFile() const; /*! * Maximum number of concurrent connections for a single transfer */ long download_max_concurrent_connections() const; /*! * Minimum download speed (bytes per second) * until the connection is dropped */ long download_min_download_speed() const; /*! * Maximum download speed (bytes per second) */ long download_max_download_speed() const; /*! * Maximum silent tries */ long download_max_silent_tries() const; /*! * Maximum time in seconds that you allow a transfer operation to take. */ long download_transfer_timeout() const; /*! * Maximum time in seconds that you allow the connection phase to the server to take. */ long download_connect_timeout() const; private: MediaConfig(); std::unique_ptr d_ptr; }; } #endif libzypp-17.36.5/zypp-media/mediaexception.cc000066400000000000000000000171721476576476200210120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/mediaexception.cc * */ #include #include #include #include using std::endl; using zypp::str::form; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace media { ///////////////////////////////////////////////////////////////// MediaException::~MediaException () noexcept {} std::ostream & MediaMountException::dumpOn( std::ostream & str ) const { str << form(_("Failed to mount %s on %s"), _source.c_str(), _target.c_str() ); if( !_cmdout.empty()) str << ": " << _error << " (" << _cmdout << ")"; else str << ": " << _error; return str; } std::ostream & MediaUnmountException::dumpOn( std::ostream & str ) const { return str << form(_("Failed to unmount %s"), _path.c_str() ) << " : " << _error; } std::ostream & MediaBadFilenameException::dumpOn( std::ostream & str ) const { return str << form(_("Bad file name: %s"), _filename.c_str() ); } std::ostream & MediaNotOpenException::dumpOn( std::ostream & str ) const { return str << form(_("Medium not opened when trying to perform action '%s'."), _action.c_str() ); } std::ostream & MediaFileNotFoundException::dumpOn( std::ostream & str) const { return str << form( _("File '%s' not found on medium '%s'"), _filename.c_str(), _url.c_str() ); } std::ostream & MediaWriteException::dumpOn( std::ostream & str) const { return str << form(_("Cannot write file '%s'."), _filename.c_str() ); } std::ostream & MediaNotAttachedException::dumpOn( std::ostream & str) const { return str << _("Medium not attached") << ": " << _url; } std::ostream & MediaBadAttachPointException::dumpOn( std::ostream & str) const { return str << _("Bad media attach point") << ": " << _url; } std::ostream & MediaCurlInitException::dumpOn( std::ostream & str) const { // TranslatorExplanation: curl is the name of a library, don't translate return str << form(_("Download (curl) initialization failed for '%s'"), _url.c_str() ); } std::ostream & MediaSystemException::dumpOn( std::ostream & str) const { return str << form(_("System exception '%s' on medium '%s'."), _message.c_str(), _url.c_str() ); } std::ostream & MediaNotAFileException::dumpOn( std::ostream & str) const { return str << form(_("Path '%s' on medium '%s' is not a file."), _path.c_str(), _url.c_str() ); } std::ostream & MediaNotADirException::dumpOn( std::ostream & str) const { return str << form(_("Path '%s' on medium '%s' is not a directory."), _path.c_str(), _url.c_str() ); } std::ostream & MediaBadUrlException::dumpOn( std::ostream & str) const { if( _msg.empty()) { return str << _("Malformed URI") << ": " << _url; } else { return str << _msg << ": " << _url; } } std::ostream & MediaBadUrlEmptyHostException::dumpOn( std::ostream & str) const { return str << _("Empty host name in URI") << ": " << _url; } std::ostream & MediaBadUrlEmptyFilesystemException::dumpOn( std::ostream & str) const { return str << _("Empty filesystem in URI") << ": " << _url; } std::ostream & MediaBadUrlEmptyDestinationException::dumpOn( std::ostream & str) const { return str << _("Empty destination in URI") << ": " << _url; } std::ostream & MediaUnsupportedUrlSchemeException::dumpOn( std::ostream & str) const { return str << form(_("Unsupported URI scheme in '%s'."), _url.c_str() ); } std::ostream & MediaNotSupportedException::dumpOn( std::ostream & str) const { return str << _("Operation not supported by medium") << ": " << _url; } std::ostream & MediaCurlException::dumpOn( std::ostream & str) const { // TranslatorExplanation: curl is the name of a library, don't translate return str << form(_( "Download (curl) error for '%s':\n" "Error code: %s\n" "Error message: %s\n"), _url.c_str(), _err.c_str(), _msg.c_str()); } std::ostream & MediaCurlSetOptException::dumpOn( std::ostream & str) const { // TranslatorExplanation: curl is the name of a library, don't translate return str << form(_("Error occurred while setting download (curl) options for '%s':"), _url.c_str() ); if ( !_msg.empty() ) str << endl << _msg; } std::ostream & MediaNotDesiredException::dumpOn( std::ostream & str ) const { return str << form(_("Media source '%s' does not contain the desired medium"), _url.c_str() ); } std::ostream & MediaIsSharedException::dumpOn( std::ostream & str ) const { return str << form(_("Medium '%s' is in use by another instance"), _name.c_str() ); } std::ostream & MediaNotEjectedException::dumpOn( std::ostream & str ) const { if( _name.empty() ) return str << _("Cannot eject any media"); else return str << form(_("Cannot eject media '%s'"), _name.c_str()); } std::ostream & MediaUnauthorizedException::dumpOn( std::ostream & str ) const { str << msg(); if( !_url.asString().empty()) str << " (" << _url << ")"; if( !_err.empty()) str << ": " << _err; return str; } std::ostream & MediaForbiddenException::dumpOn( std::ostream & str ) const { str << form(_("Permission to access '%s' denied."), _url.c_str()); if ( !_msg.empty() ) str << endl << _msg; return str; } std::ostream & MediaTimeoutException::dumpOn( std::ostream & str ) const { str << form(_("Timeout exceeded when accessing '%s'."), _url.c_str() ); if ( !_msg.empty() ) str << endl << _msg; return str; } std::ostream &MediaFileSizeExceededException::dumpOn(std::ostream &str) const { str << form(_("Downloaded data exceeded the expected filesize '%s' of '%s'."), _expectedFileSize.asString().c_str(), _url.c_str() ); if ( !_msg.empty() ) str << endl << _msg; return str; } std::ostream & MediaTemporaryProblemException::dumpOn( std::ostream & str ) const { str << form(_("Location '%s' is temporarily unaccessible."), _url.c_str() ); if ( !_msg.empty() ) str << endl << _msg; return str; } std::ostream & MediaBadCAException::dumpOn( std::ostream & str ) const { str << form(_(" SSL certificate problem, verify that the CA cert is OK for '%s'."), _url.c_str() ); if ( !_msg.empty() ) str << endl << _msg; return str; } std::ostream & MediaJammedException::dumpOn( std::ostream & str ) const { str << _("No free ressources available to attach medium."); return str; } ///////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-media/mediaexception.h000066400000000000000000000414411476576476200206500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/MediaException * */ #ifndef ZYPP_MEDIA_MEDIAEXCEPTION_H #define ZYPP_MEDIA_MEDIAEXCEPTION_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace media { /////////////////////////////////////////////////////////////// // // CLASS NAME : MediaException /** Just inherits Exception to separate media exceptions * **/ class ZYPP_API MediaException : public Exception { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ MediaException() : Exception( "Media Exception" ) {} /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ MediaException( const std::string & msg_r ) : Exception( msg_r ) {} /** Dtor. */ ~MediaException() noexcept override; }; class ZYPP_API MediaMountException : public MediaException { public: MediaMountException() : MediaException( "Media Mount Exception" ) {} /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ MediaMountException( std::string error_r, std::string source_r, std::string target_r, std::string cmdout_r="") : MediaException() , _error(std::move(error_r)) , _source(std::move(source_r)) , _target(std::move(target_r)) , _cmdout(std::move(cmdout_r)) {} /** Dtor. */ ~MediaMountException() noexcept override {} const std::string & mountError() const { return _error; } const std::string & mountSource() const { return _source; } const std::string & mountTarget() const { return _target; } const std::string & mountOutput() const { return _cmdout; } protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _error; std::string _source; std::string _target; std::string _cmdout; }; class ZYPP_API MediaUnmountException : public MediaException { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ MediaUnmountException( std::string error_r, std::string path_r ) : MediaException() , _error(std::move(error_r)) , _path(std::move(path_r)) {} /** Dtor. */ ~MediaUnmountException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _error; std::string _path; }; class ZYPP_API MediaJammedException : public MediaException { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ MediaJammedException() : MediaException( "Media Jammed Exception" ) {} /** Dtor. */ ~MediaJammedException() noexcept override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: }; class ZYPP_API MediaBadFilenameException : public MediaException { public: MediaBadFilenameException(std::string filename_r) : MediaException() , _filename(std::move(filename_r)) {} ~MediaBadFilenameException() noexcept override {} std::string filename() const { return _filename; } protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _filename; }; class ZYPP_API MediaNotOpenException : public MediaException { public: MediaNotOpenException(std::string action_r) : MediaException() , _action(std::move(action_r)) {} ~MediaNotOpenException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _action; }; class ZYPP_API MediaFileNotFoundException : public MediaException { public: MediaFileNotFoundException(const Url & url_r, const Pathname & filename_r) : MediaException() , _url(url_r.asString()) , _filename(filename_r.asString()) {} ~MediaFileNotFoundException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; std::string _filename; }; class ZYPP_API MediaWriteException : public MediaException { public: MediaWriteException(const Pathname & filename_r) : MediaException() , _filename(filename_r.asString()) {} ~MediaWriteException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _filename; }; class ZYPP_API MediaNotAttachedException : public MediaException { public: MediaNotAttachedException(const Url & url_r) : MediaException() , _url(url_r.asString()) {} ~MediaNotAttachedException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; }; class ZYPP_API MediaBadAttachPointException : public MediaException { public: MediaBadAttachPointException(const Url & url_r) : MediaException() , _url(url_r.asString()) {} ~MediaBadAttachPointException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; }; class ZYPP_API MediaCurlInitException : public MediaException { public: MediaCurlInitException(const Url & url_r) : MediaException() , _url(url_r.asString()) {} ~MediaCurlInitException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; }; class ZYPP_API MediaSystemException : public MediaException { public: MediaSystemException(const Url & url_r, std::string message_r) : MediaException() , _url(url_r.asString()) , _message(std::move(message_r)) {} ~MediaSystemException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; std::string _message; }; class ZYPP_API MediaNotAFileException : public MediaException { public: MediaNotAFileException(const Url & url_r, const Pathname & path_r) : MediaException() , _url(url_r.asString()) , _path(path_r.asString()) {} ~MediaNotAFileException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; std::string _path; }; class ZYPP_API MediaNotADirException : public MediaException { public: MediaNotADirException(const Url & url_r, const Pathname & path_r) : MediaException() , _url(url_r.asString()) , _path(path_r.asString()) {} ~MediaNotADirException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; std::string _path; }; class ZYPP_API MediaBadUrlException : public MediaException { public: MediaBadUrlException(const Url & url_r, std::string msg_r = std::string()) : MediaException() , _url(url_r.asString()) , _msg(std::move(msg_r)) {} ~MediaBadUrlException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _msg; }; class ZYPP_API MediaBadUrlEmptyHostException : public MediaBadUrlException { public: MediaBadUrlEmptyHostException(const Url & url_r) : MediaBadUrlException(url_r) {} ~MediaBadUrlEmptyHostException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; }; class ZYPP_API MediaBadUrlEmptyFilesystemException : public MediaBadUrlException { public: MediaBadUrlEmptyFilesystemException(const Url & url_r) : MediaBadUrlException(url_r) {} ~MediaBadUrlEmptyFilesystemException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; }; class ZYPP_API MediaBadUrlEmptyDestinationException : public MediaBadUrlException { public: MediaBadUrlEmptyDestinationException(const Url & url_r) : MediaBadUrlException(url_r) {} ~MediaBadUrlEmptyDestinationException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; }; class ZYPP_API MediaUnsupportedUrlSchemeException : public MediaBadUrlException { public: MediaUnsupportedUrlSchemeException(const Url & url_r) : MediaBadUrlException(url_r) {} ~MediaUnsupportedUrlSchemeException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; }; class ZYPP_API MediaNotSupportedException : public MediaException { public: MediaNotSupportedException(const Url & url_r) : MediaException() , _url(url_r.asString()) {} ~MediaNotSupportedException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; }; class ZYPP_API MediaCurlException : public MediaException { public: MediaCurlException(const Url & url_r, std::string err_r, std::string msg_r) : MediaException() , _url(url_r.asString()) , _err(std::move(err_r)) , _msg(std::move(msg_r)) {} ~MediaCurlException() noexcept override {} std::string errstr() const { return _err; } protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _err; std::string _msg; }; class ZYPP_API MediaCurlSetOptException : public MediaException { public: MediaCurlSetOptException(const Url & url_r, std::string msg_r) : MediaException() , _url(url_r.asString()) , _msg(std::move(msg_r)) {} ~MediaCurlSetOptException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _msg; }; class ZYPP_API MediaNotDesiredException : public MediaException { public: MediaNotDesiredException(const Url & url_r) : MediaException() , _url(url_r.asString()) {} ~MediaNotDesiredException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _url; }; class ZYPP_API MediaIsSharedException : public MediaException { public: /** * \param name A media source as string (see MediaSource class). */ MediaIsSharedException(std::string name) : MediaException() , _name(std::move(name)) {} ~MediaIsSharedException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _name; }; class ZYPP_API MediaNotEjectedException: public MediaException { public: MediaNotEjectedException() : MediaException("Can't eject any media") , _name("") {} MediaNotEjectedException(std::string name) : MediaException("Can't eject media") , _name(std::move(name)) {} ~MediaNotEjectedException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _name; }; class ZYPP_API MediaUnauthorizedException: public MediaException { public: MediaUnauthorizedException() : MediaException("Unauthorized media access") , _url("") , _err("") , _hint("") {} MediaUnauthorizedException(Url url_r, const std::string &msg_r, std::string err_r, std::string hint_r) : MediaException(msg_r) , _url(std::move(url_r)) , _err(std::move(err_r)) , _hint(std::move(hint_r)) {} ~MediaUnauthorizedException() noexcept override {} const Url & url() const { return _url; } const std::string & err() const { return _err; } /** comma separated list of available authentication types */ const std::string & hint() const { return _hint; } protected: std::ostream & dumpOn( std::ostream & str ) const override; private: Url _url; std::string _err; std::string _hint; }; class ZYPP_API MediaForbiddenException : public MediaException { public: MediaForbiddenException(const Url & url_r, const std::string & msg = "") : MediaException(msg) , _url(url_r.asString()), _msg(msg) {} ~MediaForbiddenException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _msg; }; class ZYPP_API MediaTimeoutException : public MediaException { public: MediaTimeoutException(const Url & url_r, const std::string & msg = "") : MediaException(msg) , _url(url_r.asString()), _msg(msg) {} ~MediaTimeoutException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _msg; }; class ZYPP_API MediaFileSizeExceededException : public MediaException { public: MediaFileSizeExceededException(const Url & url_r, const ByteCount &cnt_r, const std::string & msg = "") : MediaException(msg) , _url(url_r.asString()) , _msg(msg) , _expectedFileSize(cnt_r) {} ~MediaFileSizeExceededException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _msg; ByteCount _expectedFileSize; }; /** For HTTP 503 and similar. */ class ZYPP_API MediaTemporaryProblemException : public MediaException { public: MediaTemporaryProblemException(const Url & url_r, const std::string & msg = "") : MediaException(msg) , _url(url_r.asString()), _msg(msg) {} ~MediaTemporaryProblemException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _msg; }; class ZYPP_API MediaBadCAException : public MediaException { public: MediaBadCAException(const Url & url_r, const std::string & msg = "") : MediaException(msg) , _url(url_r.asString()), _msg(msg) {} ~MediaBadCAException() noexcept override {} protected: std::ostream & dumpOn( std::ostream & str ) const override; std::string _url; std::string _msg; }; class ZYPP_API MediaInvalidCredentialsException : public MediaException { public: MediaInvalidCredentialsException( const std::string & msg = "" ) : MediaException(msg) {} ~MediaInvalidCredentialsException() noexcept override {} }; class ZYPP_API MediaRequestCancelledException : public MediaException { public: MediaRequestCancelledException( const std::string & msg = "" ) : MediaException(msg) {} ~MediaRequestCancelledException() noexcept override {} }; ///////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_MEDIA_MEDIAEXCEPTION_H libzypp-17.36.5/zypp-media/mount.cc000066400000000000000000000173021476576476200171510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/Mount.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; #ifndef N_ #define N_(STR) STR #endif namespace zypp { namespace media { std::ostream & operator<<( std::ostream & str, const MountEntry & obj ) { str << obj.src << " on " << obj.dir << " type " << obj.type; if ( ! obj.opts.empty() ) str << " (" << obj.opts << ")"; return str; } bool MountEntry::isBlockDevice() const { PathInfo dev_info; return ( str::hasPrefix( Pathname(src).asString(), "/dev/" ) && dev_info(src) && dev_info.isBlk() ); } Mount::Mount() {} Mount::~Mount() {} void Mount::mount( const std::string & source, const std::string & target, const std::string & filesystem, const std::string & options, const Environment & environment) { const char *const argv[] = { "/bin/mount", "-t", filesystem.c_str(), "-o", options.c_str(), source.c_str(), target.c_str(), NULL }; std::string err; // Error summary std::string value; // legacy: Exception collects just the last output line ExternalProgram prog { argv, environment, ExternalProgram::Stderr_To_Stdout, false, -1, true }; for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() ) { output[output.size()-1] = '\0'; // clip tailing NL value = std::move( output ); DBG << "stdout: " << value << endl; if ( value.find( "is already mounted on" ) != std::string::npos ) { err = "Media already mounted"; } else if ( value.find( "ermission denied" ) != std::string::npos ) { err = "Permission denied"; } else if ( value.find( "wrong fs type" ) != std::string::npos ) { err = "Invalid filesystem on media"; } else if ( value.find( "No medium found" ) != std::string::npos ) { err = "No medium found"; } else if ( value.find( "Not a directory" ) != std::string::npos ) { if ( filesystem == "nfs" || filesystem == "nfs4" ) { err = "NFS path is not a directory"; } else { err = "Unable to find directory on the media"; } } } int exitCode = prog.close(); if ( exitCode != 0 ) { if ( err.empty() ) err = "Mounting media failed"; WAR << "mount " << source << " " << target << ": " << exitCode << ": " << err << endl; ZYPP_THROW(MediaMountException(err, source, target, value)); } else MIL << "mounted " << source << " " << target << endl; } void Mount::umount( const std::string & path ) { const char *const argv[] = { "/bin/umount", path.c_str(), NULL }; std::string err; // Error summary int exitCode = -1; bool doRetry = false; unsigned numRetry = 2; do { if ( doRetry ) { if ( numRetry-- ) { WAR << "umount " << path << ": " << exitCode << ": " << err << " - retrying in 1 sec." << endl; sleep( 1 ); err.clear(); doRetry = false; } else { WAR << "umount " << path << ": " << exitCode << ": " << err << " - giving up" << endl; break; } } ExternalProgram prog { argv, ExternalProgram::Stderr_To_Stdout, false, -1, true }; for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() ) { output.pop_back(); // clip tailing NL DBG << "stdout: " << output << endl; if ( output.find ( " is busy" ) != std::string::npos ) { // 'device|target is busy' err = "Device is busy"; doRetry = true; } } exitCode = prog.close(); } while( exitCode != 0 && doRetry ); if ( exitCode != 0 ) { if ( err.empty() ) err = "Unmounting media failed"; WAR << "umount " << path << ": " << exitCode << ": " << err << endl; ZYPP_THROW(MediaUnmountException(err, path)); } else MIL << "unmounted " << path << endl; } // STATIC MountEntries Mount::getEntries(const std::string &mtab) { MountEntries entries; std::vector mtabs; bool verbose = false; if( mtab.empty()) { mtabs.push_back("/proc/mounts"); // Also read /etc/mtab if it is a file (on newer sytems // mtab is a symlink to /proc/mounts). // Reason for this is the different representation of // mounted loop devices: // /etc/mtab: /tmp/SLES-11-SP2-MINI-ISO-x86_64-Beta2-DVD.iso on /mnt type iso9660 (ro,loop=/dev/loop0) // /proc/mounts: /dev/loop0 /mnt iso9660 ro,relatime 0 0 if ( PathInfo( "/etc/mtab", PathInfo::LSTAT ).isFile() ) mtabs.push_back("/etc/mtab"); } else { mtabs.push_back(mtab); } std::vector::const_iterator t; for( t=mtabs.begin(); t != mtabs.end(); ++t) { if( verbose) { DBG << "Reading mount table from '" << *t << "'" << std::endl; } FILE *fp = setmntent(t->c_str(), "re"); if( fp) { char buf[PATH_MAX * 4]; struct mntent ent; memset(buf, 0, sizeof(buf)); memset(&ent, 0, sizeof(ent)); while( getmntent_r(fp, &ent, buf, sizeof(buf)) != NULL) { if( ent.mnt_fsname && *ent.mnt_fsname && ent.mnt_dir && *ent.mnt_dir && ent.mnt_type && *ent.mnt_type && ent.mnt_opts && *ent.mnt_opts) { MountEntry entry( ent.mnt_fsname, ent.mnt_dir, ent.mnt_type, ent.mnt_opts, ent.mnt_freq, ent.mnt_passno ); // Attempt quick fix for bnc#710269: // MountEntry is "//dist/install/ on /var/adm/mount/AP_0x00000001 type cifs (ro,relatime,unc=\dist\install,username=,domain=suse.de" // but looking for "Looking for media(cifs)attached(*/var/adm/mount/AP_0x00000001)" // Kick the trailing '/' in "//dist/install/" // TODO: Check and fix comparison in MediaHandler::checkAttached instead. if ( entry.src.size() > 1 // not for "/" && entry.src[entry.src.size()-1] == '/' ) { entry.src.erase( entry.src.size()-1 ); } entries.push_back(entry); memset(buf, 0, sizeof(buf)); memset(&ent, 0, sizeof(ent)); } } endmntent(fp); if( entries.empty()) { WAR << "Unable to read any entry from the mount table '" << *t << "'" << std::endl; } else { // OK, have a non-empty mount table. t = mtabs.end(); break; } } else { int err = errno; verbose = true; WAR << "Failed to read the mount table '" << *t << "': " << ::strerror(err) << std::endl; errno = err; } } return entries; } time_t Mount::getMTime() { time_t mtime = zypp::PathInfo("/etc/mtab").mtime(); if( mtime <= 0) { WAR << "Failed to retrieve modification time of '/etc/mtab'" << std::endl; } return mtime; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp-media/mount.h000066400000000000000000000107521476576476200170150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/Mount * */ // -*- C++ -*- #ifndef ZYPP_MEDIA_MOUNT_H #define ZYPP_MEDIA_MOUNT_H #include #include #include #include #include #include #include namespace zypp { namespace media { /** * A "struct mntent" like mount entry structure, * but using std::strings. */ struct MountEntry { MountEntry(std::string source, std::string target, std::string fstype, std::string options, const int dumpfreq = 0, const int passnum = 0) : src(std::move(source)) , dir(std::move(target)) , type(std::move(fstype)) , opts(std::move(options)) , freq(dumpfreq) , pass(passnum) {} /** * Returns true if the src part points to a block device in /dev */ bool isBlockDevice () const; std::string src; //!< name of mounted file system std::string dir; //!< file system path prefix std::string type; //!< filesystem / mount type std::string opts; //!< mount options int freq; //!< dump frequency in days int pass; //!< pass number on parallel fsck }; /** \relates MountEntry * A vector of mount entries. */ using MountEntries = std::vector; /** \relates MountEntry Stream output */ std::ostream & operator<<( std::ostream & str, const MountEntry & obj ); /** * @short Interface to the mount program */ class Mount { public: /** * For passing additional environment variables * to mount **/ using Environment = ExternalProgram::Environment; /** * Mount options. 'key' or 'key=value' pairs, separated by ',' **/ using Options = KVMap>; public: /** * Create an new instance. */ Mount(); /** * Clean up. */ ~Mount(); /** * mount device * * @param source what to mount (e.g. /dev/hda3) * @param target where to mount (e.g. /mnt) * @param filesystem which filesystem to use (e.g. reiserfs) (-t parameter) * @param options mount options (e.g. ro) (-o parameter) * @param environment optinal environment to pass (e.g. PASSWD="sennah") * * \throws MediaException * */ void mount ( const std::string& source, const std::string& target, const std::string& filesystem, const std::string& options, const Environment& environment = Environment() ); /** umount device * * @param path device or mountpoint to umount * * \throws MediaException * * */ void umount (const std::string& path); public: /** * Return mount entries from /etc/mtab or /etc/fstab file. * * @param mtab The name of the (mounted) file system description * file to read from. This file should be one /etc/mtab, * /etc/fstab or /proc/mounts. Default is to read * /proc/mounts and /etc/mtab in case is not a symlink * to /proc/mounts. * @returns A vector with mount entries or empty vector if reading * or parsing of the mtab file(s) failed. */ static MountEntries getEntries(const std::string &mtab = ""); /** * Get the modification time of the /etc/mtab file. * \return Modification time of the /etc/mtab file. */ static time_t getMTime(); }; } // namespace media } // namespace zypp #endif libzypp-17.36.5/zypp-media/ng/000077500000000000000000000000001476576476200161015ustar00rootroot00000000000000libzypp-17.36.5/zypp-media/ng/HeaderValueMap000066400000000000000000000000341476576476200206440ustar00rootroot00000000000000#include "headervaluemap.h" libzypp-17.36.5/zypp-media/ng/LazyMediaHandle000066400000000000000000000000351476576476200210150ustar00rootroot00000000000000#include "lazymediahandle.h" libzypp-17.36.5/zypp-media/ng/MediaVerifier000066400000000000000000000000331476576476200205330ustar00rootroot00000000000000#include "mediaverifier.h" libzypp-17.36.5/zypp-media/ng/Provide000066400000000000000000000000251476576476200174310ustar00rootroot00000000000000#include "provide.h" libzypp-17.36.5/zypp-media/ng/ProvideFwd000066400000000000000000000000461476576476200200750ustar00rootroot00000000000000#include "zypp-media/ng/providefwd.h" libzypp-17.36.5/zypp-media/ng/ProvideItem000066400000000000000000000000311476576476200202450ustar00rootroot00000000000000#include "provideitem.h" libzypp-17.36.5/zypp-media/ng/ProvideRes000066400000000000000000000000301476576476200200770ustar00rootroot00000000000000#include "provideres.h" libzypp-17.36.5/zypp-media/ng/ProvideSpec000066400000000000000000000000311476576476200202410ustar00rootroot00000000000000#include "providespec.h" libzypp-17.36.5/zypp-media/ng/attachedmediainfo.cc000066400000000000000000000044101476576476200220400ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ */ #include "private/attachedmediainfo_p.h" namespace zyppng { IMPL_PTR_TYPE( AttachedMediaInfo ) AttachedMediaInfo::AttachedMediaInfo( const std::string &id, ProvideQueue::Config::WorkerType workerType, const zypp::Url &baseUrl, ProvideMediaSpec &spec ) : AttachedMediaInfo( id, {}, workerType, baseUrl, spec ) { } AttachedMediaInfo::AttachedMediaInfo( const std::string &id, ProvideQueueWeakRef backingQueue, ProvideQueue::Config::WorkerType workerType, const zypp::Url &baseUrl, const ProvideMediaSpec &mediaSpec , const std::optional &mnt ) : _name(id) , _backingQueue( std::move(backingQueue) ) , _workerType( workerType ) , _attachedUrl( baseUrl ) , _spec( mediaSpec ) , _localMountPoint( mnt ) { // idle on construction, since only the Provide has a reference atm _idleSince = std::chrono::steady_clock::now(); } void AttachedMediaInfo::setName(std::string &&name) { _name = std::move(name); } const std::string &AttachedMediaInfo::name() const { return _name; } void AttachedMediaInfo::unref_to(unsigned int refCnt) const { // last reference is always owned by the Provide instance if ( refCnt == 1 ) _idleSince = std::chrono::steady_clock::now(); } void AttachedMediaInfo::ref_to(unsigned int refCnt) const { if ( _idleSince && refCnt > 1 ) _idleSince.reset(); } bool AttachedMediaInfo::isSameMedium(const std::vector &urls, const ProvideMediaSpec &spec) { const auto check = _spec.isSameMedium(spec); if ( !zypp::indeterminate (check) ) return (bool)check; // let the URL rule return ( std::find( urls.begin(), urls.end(), _attachedUrl ) != urls.end() ); } } libzypp-17.36.5/zypp-media/ng/headervaluemap.cc000066400000000000000000000130521476576476200213740ustar00rootroot00000000000000#include "headervaluemap.h" #include namespace zyppng { HeaderValueMap::Value HeaderValueMap::InvalidValue; HeaderValue::HeaderValue() : _val ( new value_type() ) {} HeaderValue::HeaderValue( const HeaderValue &other ) : _val ( new value_type( *other._val ) ) {} HeaderValue::HeaderValue( HeaderValue &&other ) noexcept : _val ( new value_type( std::move(*other._val) ) ) {} HeaderValue::HeaderValue( const bool val ) : _val ( new value_type(val) ) {} HeaderValue::HeaderValue( const int32_t val ) : _val ( new value_type(val) ) {} HeaderValue::HeaderValue( const int64_t val ) : _val ( new value_type(val) ) {} HeaderValue::HeaderValue( const std::string &val ) : _val ( new value_type(val) ) {} HeaderValue::HeaderValue(const char *val) : HeaderValue( zypp::str::asString (val) ) {} HeaderValue::HeaderValue( std::string &&val ) : _val ( new value_type( std::move(val) ) ) {} bool HeaderValue::valid() const { return ( _val->index () > 0 ); } bool HeaderValue::isString() const { return std::holds_alternative(*_val); } bool HeaderValue::isInt() const { return std::holds_alternative(*_val); } bool HeaderValue::isInt64() const { return std::holds_alternative(*_val); } bool HeaderValue::isBool() const { return std::holds_alternative(*_val); } const std::string &HeaderValue::asString() const { return std::get(*_val); } int32_t HeaderValue::asInt() const { return std::get(*_val); } int64_t HeaderValue::asInt64() const { if ( std::holds_alternative(*_val) ) return std::get( *_val ); return std::get(*_val); } bool HeaderValue::asBool() const { return std::get(*_val); } HeaderValue::value_type &HeaderValue::asVariant() { return *_val; } const HeaderValue::value_type &HeaderValue::asVariant() const { return *_val; } HeaderValue &HeaderValue::operator=(const HeaderValue &other) { *_val = *other._val; return *this; } bool HeaderValue::operator==(const HeaderValue &other) const { return ( *_val == *other._val ); } HeaderValue &HeaderValue::operator= ( HeaderValue &&other ) noexcept { *_val = std::move( *other._val ); return *this; } HeaderValue &HeaderValue::operator= ( const std::string &val ) { *_val = val; return *this; } HeaderValue &HeaderValue::operator= ( int32_t val ) { *_val = val; return *this; } HeaderValue &HeaderValue::operator= ( int64_t val ) { *_val = val; return *this; } HeaderValue &HeaderValue::operator= ( bool val ) { *_val = val; return *this; } HeaderValueMap::HeaderValueMap( std::initializer_list init ) : _values( std::move(init) ) { } bool HeaderValueMap::contains(const std::string &key) const { return _values.count (key) > 0 && _values.at(key).size () > 0 ; } void HeaderValueMap::set(const std::string &key, Value val) { auto i = _values.find (key); if ( i == _values.end() ) { _values.insert ( std::make_pair(key, std::vector{std::move(val)}) ); } else { i->second = std::vector{std::move(val)}; } } void HeaderValueMap::set( const std::string &key, std::vector val ) { auto i = _values.find (key); if ( i == _values.end() ) { _values.insert ( std::make_pair(key, std::move(val)) ); } else { i->second = std::move(val); } } void HeaderValueMap::add(const std::string &key, const Value &val) { auto i = _values.find (key); if ( i == _values.end() ) { _values.insert ( std::make_pair(key, std::vector{val}) ); } else { i->second.push_back(val); } } void HeaderValueMap::clear() { _values.clear(); } HeaderValueMap::ValueMap::size_type HeaderValueMap::size() const noexcept { return _values.size(); } std::vector &HeaderValueMap::values(const std::string &key) { return _values[key]; } const std::vector &HeaderValueMap::values(const std::string &key) const { return _values.at(key); } HeaderValueMap::Value HeaderValueMap::value ( const std::string_view &str, const HeaderValueMap::Value &defaultVal) const { return value( std::string(str), defaultVal ); } HeaderValueMap::Value HeaderValueMap::value ( const std::string &str, const HeaderValueMap::Value &defaultVal) const { if ( !contains(str) || !_values.at(str).size() ) return defaultVal; return _values.at(str).back(); } HeaderValueMap::Value &HeaderValueMap::operator[](const std::string &key) { if ( !contains(key) ) return InvalidValue; return _values[key].back(); } HeaderValueMap::Value &HeaderValueMap::operator[]( const std::string_view &key ) { return (*this)[std::string(key)]; } const HeaderValueMap::Value &HeaderValueMap::operator[]( const std::string &key ) const { if ( !contains(key) ) return InvalidValue; return _values.at(key).back(); } const HeaderValueMap::Value &HeaderValueMap::operator[]( const std::string_view &key ) const { return (*this)[std::string(key)]; } HeaderValueMap::const_iterator HeaderValueMap::erase(const const_iterator &i) { auto yi = _values.erase(i.base()); return HeaderValueMap::const_iterator(yi); } bool HeaderValueMap::erase(const std::string &key) { return ( _values.erase(key) > 0 ); } } libzypp-17.36.5/zypp-media/ng/headervaluemap.h000066400000000000000000000135741476576476200212470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_NG_HEADERVALUEMAP_H_INCLUDED #define ZYPP_MEDIA_NG_HEADERVALUEMAP_H_INCLUDED #include #include #include #include #include namespace zyppng { class HeaderValue { public: using value_type = std::variant; HeaderValue(); HeaderValue( const HeaderValue &other ); HeaderValue( HeaderValue &&other ) noexcept; HeaderValue( const bool val ); HeaderValue( const int32_t val ); HeaderValue( const int64_t val ); HeaderValue( std::string &&val ); HeaderValue( const std::string &val ); HeaderValue( const char *val ); bool valid () const; bool isString () const; bool isInt () const; bool isInt64 () const; bool isDouble () const; bool isBool () const; const std::string &asString () const; int32_t asInt () const; int64_t asInt64 () const; bool asBool () const; value_type &asVariant (); const value_type &asVariant () const; HeaderValue &operator= ( const HeaderValue &other ); HeaderValue &operator= ( HeaderValue &&other ) noexcept; HeaderValue &operator= ( const std::string &val ); HeaderValue &operator= ( int32_t val ); HeaderValue &operator= ( int64_t val ); HeaderValue &operator= ( bool val ); bool operator== ( const HeaderValue &other ) const; private: zypp::RWCOW_pointer _val; }; class HeaderValueMap { public: using Value = HeaderValue; using ValueMap = std::map>; static Value InvalidValue; class const_iterator : public boost::iterator_adaptor< HeaderValueMap::const_iterator // Derived , ValueMap::const_iterator // Base , std::pair // Value , boost::use_default // CategoryOrTraversal , const std::pair // Reference > { public: const_iterator() : const_iterator::iterator_adaptor_() {} explicit const_iterator( const ValueMap::const_iterator &val ) { this->base_reference() = val; } const_iterator( const HeaderValueMap::const_iterator &other ) : const_iterator::iterator_adaptor_( other.base() ) {} const std::string &key () const { return this->base_reference()->first; } const Value &value() const { auto &l = base_reference ()->second; if ( l.empty() ) { return InvalidValue; } return l.back(); } private: friend class boost::iterator_core_access; void increment() { this->base_reference() = ++this->base_reference(); } std::pair dereference() const { return std::pair( key(), value() ); } }; HeaderValueMap() = default; HeaderValueMap( std::initializer_list init ); bool contains( const std::string &key ) const; bool contains( const std::string_view &key ) const { return contains(std::string(key)); } void set( const std::string &key, Value val ); void set( const std::string &key, std::vector val ); void add( const std::string &key, const Value &val); void clear (); ValueMap::size_type size() const noexcept; std::vector &values ( const std::string &key ); const std::vector &values ( const std::string &key ) const; std::vector &values ( const std::string_view &key ) { return values( std::string(key) ); } const std::vector &values ( const std::string_view &key ) const { return values( std::string(key) ); } /*! * Returns the last entry with key \a str in the list of values * or the default value specified in \a defaultVal */ Value value ( const std::string_view &str, const Value &defaultVal = Value() ) const; Value value ( const std::string &str, const Value &defaultVal = Value() ) const; Value &operator[]( const std::string &key ); Value &operator[]( const std::string_view &key ); const Value &operator[]( const std::string &key ) const; const Value &operator[]( const std::string_view &key ) const; const_iterator erase( const const_iterator &i ); bool erase( const std::string &key ); const_iterator begin() const { return const_iterator( _values.begin() ); } const_iterator end() const { return const_iterator( _values.end() ); } ValueMap::iterator beginList() { return _values.begin(); } ValueMap::iterator endList() { return _values.end(); } ValueMap::const_iterator beginList() const { return _values.begin(); } ValueMap::const_iterator endList() const { return _values.end(); } ValueMap::const_iterator cbeginList() const { return _values.cbegin(); } ValueMap::const_iterator cendList() const { return _values.cend(); } private: ValueMap _values; }; } namespace zypp { template<> inline zyppng::HeaderValue::value_type* rwcowClone( const zyppng::HeaderValue::value_type * rhs ) { return new zyppng::HeaderValue::value_type(*rhs); } } #endif libzypp-17.36.5/zypp-media/ng/lazymediahandle.h000066400000000000000000000062021476576476200214050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_NG_LAZYMEDIAHANDLE_H #define ZYPP_MEDIA_NG_LAZYMEDIAHANDLE_H #include #include namespace zyppng { template < class ProvideType > class LazyMediaHandle { public: using MediaHandle = typename ProvideType::MediaHandle; using ParentType = ProvideType; friend ProvideType; LazyMediaHandle( Ref provider, std::vector urls, ProvideMediaSpec spec ) : _sharedData( std::make_shared( std::move(provider) ,std::move(urls) ,std::move(spec) )) { } LazyMediaHandle(const LazyMediaHandle &) = default; LazyMediaHandle(LazyMediaHandle &&) = default; LazyMediaHandle &operator=(const LazyMediaHandle &) = default; LazyMediaHandle &operator=(LazyMediaHandle &&) = default; const Ref &parent () const { return _sharedData->_provider.lock(); } /*! * Returns the first mirror used for this lazy handle, * otherwise returns a empty url. */ const zypp::Url &baseUrl() const { if ( !_sharedData->_mediaHandle ) { static zypp::Url invalidHandle; if ( _sharedData->_urls.empty() ) return invalidHandle; return _sharedData->_urls.front(); } else { return _sharedData->_mediaHandle->baseUrl(); } } const std::vector &urls() const { return _sharedData->_urls; } std::optional handle () const { return _sharedData->_mediaHandle; } const ProvideMediaSpec &spec() const { return _sharedData->_spec; } const std::optional &localPath() const { static std::optional noHandle; if ( !attached() ) return noHandle; return _sharedData->_mediaHandle.localPath(); } bool attached() const { return _sharedData->_mediaHandle.has_value(); } private: struct Data { Data(Ref &&provider, std::vector &&urls, ProvideMediaSpec &&spec) : _provider(std::move(provider)), _urls(std::move(urls)), _spec(std::move(spec)) {} Data(const Data &) = delete; Data(Data &&) = delete; Data &operator=(const Data &) = delete; Data &operator=(Data &&) = delete; WeakRef _provider; std::vector _urls; ProvideMediaSpec _spec; std::optional _mediaHandle; }; Ref _sharedData; }; } #endif // ZYPP_MEDIA_NG_LAZYMEDIAHANDLE_H libzypp-17.36.5/zypp-media/ng/mediaverifier.cc000066400000000000000000000107601476576476200212270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "mediaverifier.h" #include #include #include #include #include #include "private/providedbg_p.h" namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (SuseMediaDataVerifier); class SuseMediaDataVerifier : public MediaDataVerifier { public: // MediaDataVerifier interface bool valid() const override; bool matches(const MediaDataVerifierRef &rhs) const override; const std::string &mediaVendor() const override; const std::string &mediaIdent() const override; uint totalMedia() const override; std::ostream &toStream(std::ostream &str) const override; bool load( const zypp::Pathname &data ) override; bool loadFromMedium(const zypp::filesystem::Pathname &data, uint expectedMediaNr ) override; zypp::filesystem::Pathname mediaFilePath(uint mediaNr) const override; MediaDataVerifierRef clone () const override; std::string expectedAsUserString( uint mediaNr ) const override; private: std::string _mediaVendor; std::string _mediaIdent; uint _totalMedia = 0; }; zypp::Pathname SuseMediaDataVerifier::mediaFilePath(uint mediaNr) const { zypp::str::Format fmt { "/media.%d/media" }; return (fmt % zypp::str::numstring( mediaNr )).asString(); } bool SuseMediaDataVerifier::loadFromMedium( const zypp::filesystem::Pathname &data, uint expectedMediaNr ) { return load ( data / mediaFilePath(expectedMediaNr) ); } bool SuseMediaDataVerifier::valid() const { return ! (_mediaVendor.empty() || _mediaIdent.empty()); } bool SuseMediaDataVerifier::matches(const MediaDataVerifierRef &rhs) const { auto conv = std::dynamic_pointer_cast(rhs); return conv && valid() && conv->_mediaVendor == _mediaVendor && conv->_mediaIdent == _mediaIdent; } uint SuseMediaDataVerifier::totalMedia() const { return _totalMedia; } std::ostream &SuseMediaDataVerifier::toStream( std::ostream &str ) const { return str << "[" << _mediaVendor << "|" << _mediaIdent << "/" << _totalMedia << "]"; } bool SuseMediaDataVerifier::load( const zypp::Pathname &path_r ) { std::ifstream inp( path_r.c_str() ); if ( !inp ) { ERR << "Can't setup a SUSEMediaVerifier from file: " << path_r.asString() << std::endl; return false; } getline( inp, _mediaVendor ); getline( inp, _mediaIdent ); std::string buffer; getline( inp, buffer ); zypp::str::strtonum( buffer, _totalMedia ); //if ( !_totalMedia ) _totalMedia = 1; // loaded but maybe not valid return true; } const std::string &SuseMediaDataVerifier::mediaIdent() const { return _mediaIdent; } const std::string &SuseMediaDataVerifier::mediaVendor() const { return _mediaVendor; } MediaDataVerifierRef SuseMediaDataVerifier::clone () const { return SuseMediaDataVerifierRef( new SuseMediaDataVerifier( *this ) ); } std::string SuseMediaDataVerifier::expectedAsUserString( uint mediaNr ) const { // Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. zypp::str::Format fmt { _("Expected medium %1%/%2% identified by file '%3%' with content:") }; return zypp::str::Str() << ( fmt % mediaNr % _totalMedia % mediaFilePath( mediaNr ) ) << "\n" << " " << _mediaVendor << "\n" << " " << _mediaIdent; } MediaDataVerifier::MediaDataVerifier() noexcept { } MediaDataVerifier::~MediaDataVerifier() { } MediaDataVerifierRef MediaDataVerifier::createVerifier( const std::string &verifierType ) { if ( verifierType == "SuseMediaV1" ) { return SuseMediaDataVerifierRef( new SuseMediaDataVerifier() ); } return nullptr; } std::ostream &operator<<(std::ostream &str, const MediaDataVerifierRef &obj) { if ( obj ) return obj->toStream(str); return str << "[MediaVerifier: null]"; } } libzypp-17.36.5/zypp-media/ng/mediaverifier.h000066400000000000000000000057711476576476200210770ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_NG_MEDIAVERIFIER_H_INCLUDED #define ZYPP_MEDIA_NG_MEDIAVERIFIER_H_INCLUDED #include #include #include namespace zypp { namespace filesystem { class Pathname; } using filesystem::Pathname; } namespace zyppng { /*! * The MediaDataVerifier is used to verify if a specific medium, e.g. a DVD, is the * medium we actually need. Each verifier is defined by a verifier type and the data * that is used to validate against the medium. */ class MediaDataVerifier { public: MediaDataVerifier() noexcept; virtual ~MediaDataVerifier(); static MediaDataVerifierRef createVerifier ( const std::string &verifierType ); /** Data considered to be valid if we have vendor and ident. */ virtual bool valid() const = 0; /** Whether \a rhs belongs to the same media set. */ virtual bool matches( const MediaDataVerifierRef & rhs ) const = 0; /*! * Returns the media vendor string */ virtual const std::string &mediaVendor() const = 0; /*! * Returns the media ident string */ virtual const std::string &mediaIdent() const = 0; /*! * Returns the total number of mediums in this set */ virtual uint totalMedia() const = 0; /*! * Writes the mediaverifier data to stream */ virtual std::ostream & toStream ( std::ostream & str ) const = 0; /*! * Load verification information from a given file, all media data must * be storeable in a file so that the controller can store a copy of it somewhere. */ virtual bool load( const zypp::Pathname &data ) = 0; /*! * Generates the file information from a mounted medium, the path given in \a data * is the mountpoint of the device. */ virtual bool loadFromMedium( const zypp::Pathname &data, uint mediaNr ) = 0; /*! * Returns the path of the media identifier file on the medium */ virtual zypp::Pathname mediaFilePath ( uint mediaNr ) const = 0; /*! * Clones \a this and returns a reference to the clone */ virtual MediaDataVerifierRef clone () const = 0; /*! * Returns a error string describing the expected medium. */ virtual std::string expectedAsUserString( uint mediaNr = 1 ) const = 0; }; /** \relates Stream output */ std::ostream & operator<<( std::ostream & str, const MediaDataVerifierRef & obj ); } #endif libzypp-17.36.5/zypp-media/ng/private/000077500000000000000000000000001476576476200175535ustar00rootroot00000000000000libzypp-17.36.5/zypp-media/ng/private/attachedmediainfo_p.h000066400000000000000000000047001476576476200236750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_PRIVATE_ATTACHEDMEDIAINFO_P_H_INCLUDED #define ZYPP_MEDIA_PRIVATE_ATTACHEDMEDIAINFO_P_H_INCLUDED #include "providefwd_p.h" #include "providequeue_p.h" #include "zypp-core/base/ReferenceCounted.h" #include #include #include #include namespace zyppng { class ProvidePrivate; DEFINE_PTR_TYPE(AttachedMediaInfo); class AttachedMediaInfo : public zypp::base::ReferenceCounted, private zypp::base::NonCopyable { protected: void unref_to( unsigned int refCnt ) const override; void ref_to( unsigned refCnt ) const override; public: AttachedMediaInfo( const std::string &id, ProvideQueue::Config::WorkerType workerType, const zypp::Url &baseUrl, ProvideMediaSpec &spec ); AttachedMediaInfo( const std::string &id, ProvideQueueWeakRef backingQueue, ProvideQueue::Config::WorkerType workerType, const zypp::Url &baseUrl, const ProvideMediaSpec &mediaSpec, const std::optional &mnt = {} ); void setName( std::string &&name ); const std::string &name() const; /*! * Returns true if \a other requests the same medium as this instance */ bool isSameMedium ( const std::vector &urls, const ProvideMediaSpec &spec ); std::string _name; ProvideQueueWeakRef _backingQueue; //< if initialized contains a weak reference to the queue that owns this medium ProvideQueue::Config::WorkerType _workerType; zypp::Url _attachedUrl; // the URL that was used for the attach request ProvideMediaSpec _spec; std::optional _localMountPoint; // if initialized tells where the workers mounted to medium mutable std::optional _idleSince; ///< Set if the medium is idle }; } #endif libzypp-17.36.5/zypp-media/ng/private/provide_p.h000066400000000000000000000127071476576476200217220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_PRIVATE_PROVIDE_P_H_INCLUDED #define ZYPP_MEDIA_PRIVATE_PROVIDE_P_H_INCLUDED #include "providefwd_p.h" #include "providequeue_p.h" #include "attachedmediainfo_p.h" #include #include #include #include #include #include #include namespace zyppng { namespace constants { constexpr std::string_view DEFAULT_PROVIDE_WORKER_PATH = ZYPP_WORKER_PATH; constexpr std::string_view ATTACHED_MEDIA_SUFFIX = "-media"; constexpr auto DEFAULT_ACTIVE_CONN_PER_HOST = 5; //< how many simultanious connections to the same host are allowed constexpr auto DEFAULT_ACTIVE_CONN = 10; //< how many simultanious connections are allowed constexpr auto DEFAULT_MAX_DYNAMIC_WORKERS = 20; constexpr auto DEFAULT_CPU_WORKERS = 4; } class ProvideQueue; class ProvidePrivate : public BasePrivate { ZYPP_DECLARE_PUBLIC(Provide) public: ProvidePrivate( zypp::Pathname &&workDir, Provide &pub ); enum ScheduleReason { ProvideStart, QueueIdle, EnqueueItem, EnqueueReq, RestartAttach, FinishReq }; void schedule( ScheduleReason reason ); bool queueRequest ( ProvideRequestRef req ); bool dequeueRequest( ProvideRequestRef req, std::exception_ptr error ); void queueItem ( ProvideItemRef item ); void dequeueItem ( ProvideItem *item ); std::string nextMediaId () const; AttachedMediaInfo_Ptr addMedium ( AttachedMediaInfo_Ptr &&medium ); std::string effectiveScheme ( const std::string &scheme ) const; void onPulseTimeout ( Timer & ); void onQueueIdle (); void onItemStateChanged ( ProvideItem &item ); expected schemeConfig(const std::string &scheme); std::optional addToFileCache ( const zypp::Pathname &downloadedFile ); bool isInCache ( const zypp::Pathname &downloadedFile ) const; bool isRunning() const; const zypp::Pathname &workerPath() const; const std::string queueName( ProvideQueue &q ) const; std::vector &attachedMediaInfos(); std::list &items(); zypp::media::CredManagerOptions &credManagerOptions (); std::vector sanitizeUrls ( const std::vector &urls ); ProvideStatusRef log () { return _log; } uint32_t nextRequestId(); Signal< Provide::MediaChangeAction ( const std::string &, const std::string &, const int32_t, const std::vector &, const std::optional &) > _sigMediaChange; Signal< std::optional ( const zypp::Url &reqUrl, const std::string &triedUsername, const std::map &extraValues ) > _sigAuthRequired; protected: void doSchedule (Timer &); //@TODO should we make those configurable? std::unordered_map< std::string, std::string > _workerAlias { {"ftp" ,"http"}, {"tftp" ,"http"}, {"https","http"}, {"cifs" ,"smb" }, {"nfs4" ,"nfs" }, {"cd" ,"disc"}, {"dvd" ,"disc"}, {"file" ,"dir" }, {"hd" ,"disk"} }; bool _isRunning = false; bool _isScheduling = false; Timer::Ptr _pulseTimer = Timer::create(); Timer::Ptr _scheduleTrigger = Timer::create(); //< instead of constantly calling schedule we set a trigger event so it runs as soon as event loop is on again zypp::Pathname _workDir; std::list< ProvideItemRef > _items; //< The list of running provide Items, each of them can spawn multiple requests uint32_t _nextRequestId = 0; //< The next request ID , we use controller wide unique IDs instead of worker locals IDs , its easier to track struct QueueItem { std::string _schemeName; std::deque _requests; }; std::deque _queues; //< List of request queues for the workers, grouped by scheme. We use a deque and not a map because of possible changes to the list of queues during scheduling std::vector< AttachedMediaInfo_Ptr > _attachedMediaInfos; //< List of currently attached medias std::unordered_map< std::string, ProvideQueueRef > _workerQueues; std::unordered_map< std::string, ProvideQueue::Config > _schemeConfigs; struct FileCacheItem { zypp::ManagedFile _file; std::optional _deathTimer; // timepoint where this item was seen first without a refcount }; std::unordered_map< std::string, FileCacheItem > _fileCache; zypp::Pathname _workerPath; zypp::media::CredManagerOptions _credManagerOptions; ProvideStatusRef _log; Signal _sigIdle; }; } #endif libzypp-17.36.5/zypp-media/ng/private/providedbg_p.h000066400000000000000000000031541476576476200223730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_NG_PROVIDEDBG_P_H_INCLUDED #define ZYPP_MEDIA_NG_PROVIDEDBG_P_H_INCLUDED #include L_ENV_CONSTR_FWD_DECLARE_FUNC(ZYPP_MEDIA_PROVIDER_DEBUG) #ifdef ZYPP_BASE_LOGGER_LOGGROUP #undef ZYPP_BASE_LOGGER_LOGGROUP #endif #define ZYPP_BASE_LOGGER_LOGGROUP "ZYPP_MEDIA_PROVIDE" namespace zyppng { inline bool provideDebugEnabled() { return zypp::log::has_env_constr_ZYPP_MEDIA_PROVIDER_DEBUG(); } } #define XXX_PRV if( zyppng::provideDebugEnabled() ) XXX #define DBG_PRV if( zyppng::provideDebugEnabled() ) DBG #define MIL_PRV if( zyppng::provideDebugEnabled() ) MIL #define WAR_PRV if( zyppng::provideDebugEnabled() ) WAR #define ERR_PRV if( zyppng::provideDebugEnabled() ) ERR #define SEC_PRV if( zyppng::provideDebugEnabled() ) SEC #define INT_PRV if( zyppng::provideDebugEnabled() ) INT #define USR_PRV if( zyppng::provideDebugEnabled() ) USR #endif // ZYPP_MEDIA_NG_PROVIDEDBG_P_H_INCLUDED libzypp-17.36.5/zypp-media/ng/private/providefwd_p.h000066400000000000000000000026011476576476200224130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_PRIVATE_PROVIDE_FWD_P_H_INCLUDED #define ZYPP_MEDIA_PRIVATE_PROVIDE_FWD_P_H_INCLUDED #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS(ProvideQueue); ZYPP_FWD_DECL_TYPE_WITH_REFS(ProvideWorker); ZYPP_FWD_DECL_TYPE_WITH_REFS(ProvideFileItem); ZYPP_FWD_DECL_TYPE_WITH_REFS(AttachMediaItem); ZYPP_FWD_DECL_TYPE_WITH_REFS(DetachMediaItem); ZYPP_FWD_DECL_TYPE_WITH_REFS(ProvideRequest); class ProvideMessage; template< typename T > class ProvidePromise; template< typename T > using ProvidePromiseRef = std::shared_ptr>; template< typename T > using ProvidePromiseWeakRef = std::weak_ptr>; } #endif libzypp-17.36.5/zypp-media/ng/private/provideitem_p.h000066400000000000000000000174651476576476200226070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_PRIVATE_PROVIDE_ITEM_P_H_INCLUDED #define ZYPP_MEDIA_PRIVATE_PROVIDE_ITEM_P_H_INCLUDED #include "providefwd_p.h" #include "providequeue_p.h" #include "attachedmediainfo_p.h" #include "providemessage_p.h" #include #include #include #include #include #include #include namespace zyppng { /*! * The internal request type, which represents all possible * user requests and exports some convenience functions for the scheduler to * directly access relevant data */ class ProvideRequest { public: friend class ProvideItem; static expected create( ProvideItem &owner, const std::vector &urls, const std::string &id, ProvideMediaSpec &spec ); static expected create ( ProvideItem &owner, const std::vector &urls, ProvideFileSpec &spec ); static expected createDetach( const zypp::Url &url ); ProvideItem * owner() { return _owner; } uint code () const { return _message.code(); } void setCurrentQueue ( ProvideQueueRef ref ); ProvideQueueRef currentQueue (); const ProvideMessage &provideMessage () const { return _message; } ProvideMessage &provideMessage () { return _message; } const std::optional activeUrl() const; void setActiveUrl ( const zypp::Url &urlToUse ); void setUrls( const std::vector & urls ) { _mirrors = urls; } const std::vector &urls() const { return _mirrors; } zypp::Url url() const { return _mirrors.front(); } void setUrl( const zypp::Url & url ) { _mirrors = {url}; } void clearForRestart () { _pastRedirects.clear(); _activeUrl.reset(); _myQueue.reset(); } private: ProvideRequest( ProvideItem *owner, const std::vector &urls, ProvideMessage &&msg ) : _owner(owner), _message(std::move(msg) ), _mirrors(urls) {} ProvideItem *_owner = nullptr; // destructor of ProvideItem will dequeue the item, so no need to do refcount here ProvideMessage _message; std::vector _mirrors; std::vector _pastRedirects; std::optional _activeUrl; ProvideQueueWeakRef _myQueue; }; class ProvideItemPrivate : public BasePrivate { public: ProvideItemPrivate( ProvidePrivate & parent, ProvideItem &pub ) : BasePrivate(pub), _parent(parent) {} ProvidePrivate &_parent; ProvideItem::State _itemState = ProvideItem::Uninitialized; std::chrono::steady_clock::time_point _itemStarted; std::chrono::steady_clock::time_point _itemFinished; std::optional _prevStats; std::optional _currStats; Signal _sigStateChanged; }; /*! * The object returned to the user code to track the internal Item. * Releasing the last reference to it will cancel the operation but the corresponding ProvideItem * will remain in the Queue until the cancel operation was finished. */ template< typename T > class ProvidePromise : public AsyncOp> { public: ProvidePromise( ProvideItemRef provideItem ) : _myProvide( provideItem ) {} ~ProvidePromise() { auto prov = _myProvide.lock(); if ( prov ) prov->released(); } private: ProvideItemWeakRef _myProvide; //weak reference to the internal item so we can cancel the op on desctruction }; /*! * Item downloading and providing a file */ class ProvideFileItem : public ProvideItem { public: static ProvideFileItemRef create ( const std::vector &urls,const ProvideFileSpec &request, ProvidePrivate &parent ); // ProvideItem interface void initialize () override; ProvidePromiseRef promise(); void setMediaRef ( Provide::MediaHandle &&hdl ); Provide::MediaHandle & mediaRef (); ItemStats makeStats () override; zypp::ByteCount bytesExpected () const override; protected: ProvideFileItem ( const std::vector &urls,const ProvideFileSpec &request, ProvidePrivate &parent ); void informalMessage ( ProvideQueue &, ProvideRequestRef req, const ProvideMessage &msg ) override; using ProvideItem::finishReq; void finishReq ( ProvideQueue &queue, ProvideRequestRef finishedReq, const ProvideMessage &msg ) override; void cancelWithError ( std::exception_ptr error ) override; expected authenticationRequired ( ProvideQueue &queue, ProvideRequestRef req, const zypp::Url &effectiveUrl, int64_t lastTimestamp, const std::map &extraFields ) override; private: Provide::MediaHandle _handleRef; //< If we are using a attached media, this will keep the reference around bool _promiseCreated = false; std::vector _mirrorList; //< All available URLs, first one is the primary ProvideFileSpec _initialSpec; //< The initial spec as defined by the user code zypp::Pathname _targetFile; //< The target file as reported by the worker zypp::Pathname _stagingFile; //< The staging file as reported by the worker zypp::ByteCount _expectedBytes; //< The nr of bytes we want to provide ProvidePromiseWeakRef _promise; }; /*! * Item attaching and verifying a medium */ class AttachMediaItem : public ProvideItem { public: ~AttachMediaItem(); static AttachMediaItemRef create ( const std::vector &urls, const ProvideMediaSpec &request, ProvidePrivate &parent ); SignalProxy< void( const zyppng::expected & ) > sigReady (); ProvidePromiseRef promise(); protected: AttachMediaItem ( const std::vector &urls, const ProvideMediaSpec &request, ProvidePrivate &parent ); // ProvideItem interface void initialize () override; using ProvideItem::finishReq; void finishReq ( ProvideQueue &queue, ProvideRequestRef finishedReq, const ProvideMessage &msg ) override; void cancelWithError( std::exception_ptr error ) override; void finishWithSuccess (AttachedMediaInfo_Ptr medium ); expected authenticationRequired ( ProvideQueue &queue, ProvideRequestRef req, const zypp::Url &effectiveUrl, int64_t lastTimestamp, const std::map &extraFields ) override; void onMasterItemReady ( const zyppng::expected& result ); private: Signal< void( const zyppng::expected & )> _sigReady; bool _promiseCreated = false; connection _masterItemConn; std::vector _mirrorList; //< All available URLs, first one is the primary ProvideMediaSpec _initialSpec; //< The initial spec as defined by the user code ProvideQueue::Config::WorkerType _workerType = ProvideQueue::Config::Invalid; ProvidePromiseWeakRef _promise; MediaDataVerifierRef _verifier; }; } #endif libzypp-17.36.5/zypp-media/ng/private/providemessage_p.h000066400000000000000000000724601476576476200232710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! */ #ifndef ZYPP_MEDIA_PRIVATE_PROVIDE_MESSAGE_P_H_INCLUDED #define ZYPP_MEDIA_PRIVATE_PROVIDE_MESSAGE_P_H_INCLUDED #include #include /*! \internal General: ------- This file contains the protocol definitions used in media worker backends. These backends are used by zypp mainly to acquire files from different types of media via a generalized API. However, it can also be used to implement helpers for special needs, e.g. copying files around or rewriting URLs. Every worker type is identified by the schema used in a URL e.g. dvd for getting files from DVDs or https for downloading. This makes it possible to easily extend zypp with support for new schemes by implementing a new worker type without the need to modify zypp itself. A important functionality is the possibility to redirect URLs to different workers, making it possible to implement special schemes that need to remodel a URL in special ways before they are processed by the general backends. Communication Format: --------------------- Each message is serialized into a STOMP frame and sent over the communication medium. STOMP is basically a HTTP like protocol, see https://stomp.github.io and \sa zypp::PluginFrame for details. Communication channel: ---------------------- Communication between the worker processes and the zypp main process will happen via the standard unix file descriptors: stdin, stdout and stderr. stdin and stdout are used to send and receive messages between main and worker processes, while stderr is used to output logging that is generated by the worker processes. These logs are forwarded to the main zypp log. The workers are supposed to shut down as soon as their stdin is closed. This is important to not block the controller process that is waiting for this to happen, to fetch all log lines that are emitted by the worker when shutting down. Worker Requirements: -------------------- Async communication: Every worker needs to be able to handle messages asynchronously, the frontend will send requests to the worker as they are given by the frontend code and does not apply any ordering. This means workers need to remember queries they sent to the frontend and manage the code waiting for the result accordingly. The only exception to this is the handshake messages, where the frontend will always send the worker configuration first, directly after spawning the worker process and the worker will answer with its capabilities. Once those messages have been exchanged, zypp will start to send requests as defined below. The frontend will buffer messages sent to the workers, so they do not need to keep the socket empty, however if possible workers should support handling multiple requests. Cleaning up: ------------ A worker needs to maintain a mountpoint/download location as long as needed. Since only the frontend can decide when a location is not required anymore it will send a "ReleaseResource" message with a worker generated ID that releases said ressource. Examples for this are mountpoints that a worker created or download areas that were used by the worker to < the files to Worker Types: ------------- Currently zypp knows 4 different types of workers: * Downloading: Simplest type of worker that just download the files from a remote location without the need to mount something beforehand. This is the simplest file provider that does not need to implement special functions. It is possible to freely redirect requests between different variations of this worker type, all other types of workers do NOT support redirections. Per remote host a own instance is started except if the SingleInstance flag is set. It is adviceable to set the SingleInstance flag on all workers that do not do any long running requests. * Mounting: This type of worker needs to mount filesystems, but is not restricted by local volatile devices. For example smb, nfs, dir or even disk. It has to additionally implement the Attach/Verify workflow. Mounting handlers are always started as SingleInstance workers. * VolatileMounting: Most complex type of workers that mounts local devices that are volatile. This worker needs to also implement the device change workflow. This type of worker exists only to implement the dvd worker. VolatileMounting handlers are started as SingleInstance workers. * CPU Bound: Simple zypp internal workhorse type that can be implemented to run async processes like extracting a compressed file or creating a checksum. For this type of worker a own instance per CPU is started on demand by default. Attach/Mount Workflow ( does not apply to Downloading and CPU bound worker types ) : Each handler that marks itself as Mounting or VolatileMounting needs to implement the attach/mount workflow. This means that the controller needs to rely on the handler to correctly mount and identify a medium. In the Attach message the controller may send media identification data and identification type to the worker to specify the exact medium it is looking for. The worker then needs to mount the filesystem and perform the validation check, if the check succeeds the worker will assign the unique attach point ID it has received from the contoller to the attachpoint and sends back a AttachResult containing the information. At this point the worker needs to keep the mountpoint and attachpoint around until the controller sends a Detach request for it. If the verification fails the worker will unmount the filesystem and send back a AttachResult message with the error bits set. If the controller does not send verification data, every device/remoteFS that is successfully mounted is considered valid. After a medium was mounted the controller will send provide requests to the worker that have URLs formed like: -media:///path/to/file. For example: dvd-media://1d6c0810-2bd6-45f3-9890-0268422a6f14/path/to/file , the attachID part is just a example, the controller uses generates IDs that can be expressed as a URL hostname. Another important aspect to keep in mind, is that a attach point is not the same as a mount point. Since a attach point additionally contains the path relative to the filesystem root on the device. For example: the repository drivers is in a subdirectory of a dvd, so we'd get a attach request for the base url: dvd:/drivers, this would result in a attachpoint id of "abcdef123" the device would be mounted in "/mnt/device". All subsequent requests are relative to the attachpoint and would look like: dvd-media://abcdef123/file , which results in a lookup for the file: "/mnt/device/drivers/file1". Due to historical reasons a single device/filesystem can contain multiple mediums. So the worker needs to make sure to not unmount the filesystem too early. For example dvd:/repo-1 and dvd:/repo-2 , both mediums are on the same disc, hence the worker will need to maintain two mount IDs and can only release the device itself when both have been detached. In some cases its even possible that multiple mediums reside in the same (sub)directory on a filesystem. For example when a multi DVD set was copied together into one directory shared over NFS. Message status codes --------------------- The response codes are roughtly modelled like HTTP status codes, they can happen during the full runtime of a certain request. Informational messages (100–199) Success messages (200–299) Redirection messages (300–399) Client error messages (400–499) Server error messages (500–599) Controller messages (600–699) Worker messages (700-799) - Code: 100 - Provide started Desc: Sent to the controller once a worker starts providing a request Note that this is a optional message, its perfectly valid if 200 ( Provide Success ) is sent directly after the file was requested. Fields: required string url string local_filename -> The local filename where the file will be provided to, used by the controller to track progress string staging_filename -> The staging file used while downloading - Code: 200 - Provide Finished Desc: Sent to the controller once a worker finished a job successfully. Fields: required string local_filename -> The path where the worker has placed the file required bool cacheHit -> Set to true if the file was found in a worker cache - Code: 201 - Attach Finished Desc: Sent to the controller once a worker mounted a medium successfully. Fields: optional string localMountPoint -> Where the device was locally mounted if applicable, e.g. http does not mount - Code: 202 - Auth Info Desc: Response sent by the controller to a AUTH_REQUIRED request. The last_auth_timestamp contains the last change of the auth database. This timestamp should be included in successive AUTH_REQUIRED requests, so that the controller knows if its outdated or if the Auth was read from the store once and now we need to ask the user to provide new auth info. Fields: required string username required string password required int64 auth_timestamp -> timestamp of the auth data, this should be stored in the worker in case it fails again optional string authType -> comma seperated list of selected auth types, used by the network provider - Code: 203 - Media changed Desc: Sent to the worker once the user acknowledged a media change request Fields: - None - - Code: 204 - Detach Finished Desc: Sent to the controller once a worker detached a medium successfully. Fields: - None - - Code: 300 - Redirect Desc: A Downloading worker can generate a Redirect message to reroute a request to a different Downloading worker. This can be used to implement special handlers where a URL needs to be rewritten before it can actually be fetched. This is similar to sending a 200 - Provide Finished message since it will take the request out of the workers queue Note: Redirecting is ONLY supported between Downloading workers. Sending this message from other worker types or redirecting to non Dowloading workers results in failing the user request with a redirect error. Fields: required string new_url -> the full URL we want to redirect to - Code: 301 - Metalink Redirect Desc: A worker can generate a list of mirrors, this is similar to a Redirect response but supports giving the Controller a list of possible URLs to try. This is similar to sending a 200 - Provide Finished message since it will take the request out of the workers queue. The mirror list is ordered by priority, meaning the first mirror has the highest. Fields: repeated string new_url -> full URL we want to redirect to 4xx and 5xx messages, all of those messages have the same Response type structure: Code: 4xx / 5xx - Client error Desc: Sent to the controller for requests that fail due to a client error Fields: required string reason -> The reason as a string optional string history -> The error history that lead to the error bool transient -> If this is set to true, the controller will try to request the file again at a later time Currently reserved error codes: 400: Bad Request -> invalid request, the receiver can not process it 401: Unauthorized -> no auth info avail but auth required extraFields: string authHint 402: Forbidden -> auth was given but failed or no access rights to the requested resource extraFields: string authHint 403: PeerCertificateInvalid -> the peer certificate validation failed 404: Not Found -> the requested resource does not exist on the medium 405: Expected Size Exceeded -> the downloaded data exceeded the requested maximum lenght 406: Connection failed -> connecting to the server failed 407: Timeout -> the request timed out 408: Cancelled -> request was cancelled by the user 409: Invalid checksum -> the downloaded data has a different checksum than expected 410: Mount failed -> mounting the requested resource failed 411: Jammed -> ATTACH request failed due to insufficient resources 412: Media Change Abort -> User decided to abort the request 413: Media Change Skip -> User decided to abort the request with a skip command( request will fail but will report "skipped" as the reason ) 414: No Auth data -> Only sent by the controller for a 700 - Auth Data Request 416: Media not desired -> The desired medium was not found on the given URL ( attach request ) 500: InternalError -> a error in the worker that is not recoverable, check reason string Controller -> Worker requests ----------------------------- - Code: 600 - Provide Desc: Message to tell the worker about a ressource it should provide Fields: required string url -> The URL of the request string filename -> target filename hint, this is not required to be considered by the workers string delta_file -> local path to a file that is supposed to be used for delta downloads int64 expected_filesize -> The expected download filesize, workers should fail if a server does not reports the exact same filesize bool check_existance_only -> this will NOT download the file but only query the server if its existant bool metalink_enabled -> enables/disables metalink handling - Code: 601 - Cancel Desc: Sent by the controller if a request should be cancelled. The worker should stop the given request and return a 408 response. Fields: - None - - Code: 602 - Attach Desc: If a worker signals the frontend it needs to mount/unmount resources the controller will first send a Attach message for each base_url it encounters that targets the workers scheme. All workers that do not set this flag do not need to care about this special message. In fact receiving this message in a worker that is not a mounting type should result in returning a error to the controller. If the verifyType field is NOT set, the verifyData field will be ignored and the worker does not need to verify the device on the given location. Fields: required string url -> the base URL we want to attach to required string attach_id -> controller generated ID string to uniquely identiy a attached medium required string label -> Label of the medium string verify_type -> name of the verification type, currently only suseV1 ( required if verify_data is present ) bytes verify_data -> verification data ( required if verify_type is present ) int32 media_nr -> the nr of the medium in the set ( required if verify_type is present ) repeated string device -> optional field containing a device that can be used for attachment - Code: 603 - Detach Desc: Send by the controller process when a medium is no longer required. The worker has to immediately unmount the medium, no answer to the controller is expected. Since there is no connected request, the request ID in this message will not be considered Fields: required string url -> the attachment URL containing the controller generated ID string to uniquely identify a attached medium, e.g. dvd:/// Worker -> Controller requests ----------------------------- - Code: 700 - Auth Data Request Desc: In case a worker needs authorization info it can generate this request. The last_auth_timestamp field is present if the request had received auth info before. Fields: required string effective_url -> the effective URL we want to fetch, this is not necessarily the same as the request URL int64 last_auth_timestamp -> timestamp of previously received auth informationpJuds optional string username -> username tried in the last auth attempt optional string authHint -> comma seperated list of available authentication types optional repeated string -> all other key:value pairs are treated as extra keys. Possible Resposes: 414, 202 - Code: 701 - Media Change Request Desc: Generated by a worker to ask the user to insert a different medium. This will BLOCK the controller and the handler until the user answered the request. This is a special request only used by the CDROM handler Fields: required string label -> name of the medium we need required int32 media_nr -> which medium from the media set is required required repeated string device -> free device to be used to insert the media into string desc -> medium desc Possible Resposes: 412, 413, 203 */ #include #include #include #include // for FieldType #include #include namespace zypp::proto { class Envelope; class Configuration; class Capabilities; class ProvideMessage; } namespace zyppng { enum MessageCodes : uint32_t { NoCode = 0, FirstInformalCode = 100, ProvideStarted = 100, LastInformalCode = 199, FirstSuccessCode = 200, ProvideFinished = 200, AttachFinished = 201, AuthInfo = 202, MediaChanged = 203, DetachFinished = 204, LastSuccessCode = 299, FirstRedirCode = 300, Redirect = 300, Metalink = 301, LastRedirCode = 399, FirstClientErrCode = 400, BadRequest = 400, Unauthorized = 401, Forbidden = 402, PeerCertificateInvalid = 403, NotFound = 404, ExpectedSizeExceeded = 405, ConnectionFailed = 406, Timeout = 407, Cancelled = 408, InvalidChecksum = 409, MountFailed = 410, Jammed = 411, MediaChangeAbort = 412, MediaChangeSkip = 413, NoAuthData = 414, NotAFile = 415, MediumNotDesired = 416, LastClientErrCode = 499, FirstSrvErrCode = 500, InternalError = 500, ProtocolError = 501, LastSrvErrCode = 599, FirstControllerCode = 600, Prov = 600, Cancel = 601, Attach = 602, Detach = 603, LastControllerCode = 699, FirstWorkerCode = 700, AuthDataRequest = 700, MediaChangeRequest = 701, LastWorkerCode = 799, }; class ProviderConfiguration : public std::map { public: using map::map; static constexpr std::string_view typeName = "ProviderConfiguration"; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); }; class WorkerCaps { public: /*! The worker type, see the description in Worker Types above */ enum WorkerType : uint32_t { Invalid = 0, Downloading = 1, SimpleMount = 2, VolatileMount = 3, CPUBound = 4, }; enum Flags : uint32_t { None = 0, // Just for completeness SingleInstance = 1, // If this flag is set a worker can only be started once, this is implicit in some worker types. Pipeline = 2, // The worker can handle multiple requests at the same time ZyppLogFormat = 4, // The worker writes messages to stderr in zypp log format FileArtifacts = 8, // The results of this worker are artifacts, which means they need to be cleaned up. This is implicit for all downloading workers. For all mounting workers this is ignored. // CPU bound workers can use it to signal they leave artifact files behind that need to be cleaned up }; explicit WorkerCaps(); ~WorkerCaps(); WorkerCaps(const WorkerCaps &) = default; WorkerCaps(WorkerCaps &&) = default; WorkerCaps &operator=(const WorkerCaps &) = default; WorkerCaps &operator=(WorkerCaps &&) = default; uint32_t protocol_version() const; // The workers should set this field to the protocol version they implement. WorkerType worker_type() const; Flags cfg_flags() const; const std::string &worker_name() const; void set_protocol_version( uint32_t v ); void set_worker_type( WorkerType t ); void set_cfg_flags( Flags f ); void set_worker_name( std::string name ); static constexpr std::string_view typeName = "WorkerCaps"; zyppng::expected toStompMessage() const; static zyppng::expected fromStompMessage( const zypp::PluginFrame &msg ); private: uint32_t _protocolVersion = 1; uint32_t _workerType = Invalid; uint32_t _cfgFlags = None; std::string _workerName; }; namespace ProvideMessageFields { constexpr std::string_view RequestCode("requestCode"); constexpr std::string_view RequestId("requestId"); } namespace ProvideStartedMsgFields { constexpr std::string_view Url ("url"); constexpr std::string_view LocalFilename ("local_filename"); constexpr std::string_view StagingFilename ("staging_filename"); } namespace ProvideFinishedMsgFields { constexpr std::string_view LocalFilename ("local_filename"); constexpr std::string_view CacheHit ("cacheHit"); } namespace AuthInfoMsgFields { constexpr std::string_view Username ("username"); constexpr std::string_view Password ("password"); constexpr std::string_view AuthTimestamp ("auth_timestamp"); constexpr std::string_view AuthType ("authType"); } namespace RedirectMsgFields { constexpr std::string_view NewUrl ("new_url"); } namespace MetalinkRedirectMsgFields { constexpr std::string_view NewUrl ("new_url"); } namespace ErrMsgFields { constexpr std::string_view Reason ("reason"); constexpr std::string_view Transient ("transient"); constexpr std::string_view History ("history"); } namespace ProvideMsgFields { constexpr std::string_view Url ("url"); constexpr std::string_view Filename ("filename"); constexpr std::string_view DeltaFile ("delta_file"); constexpr std::string_view ExpectedFilesize ("expected_filesize"); constexpr std::string_view CheckExistOnly ("check_existance_only"); constexpr std::string_view MetalinkEnabled ("metalink_enabled"); } namespace AttachMsgFields { constexpr std::string_view Url ("url"); constexpr std::string_view AttachId ("attach_id"); constexpr std::string_view VerifyType ("verify_type"); constexpr std::string_view VerifyData ("verify_data"); constexpr std::string_view MediaNr ("media_nr"); constexpr std::string_view Device ("device"); constexpr std::string_view Label ("label"); } namespace AttachFinishedMsgFields { constexpr std::string_view LocalMountPoint ("local_mountpoint"); } namespace DetachMsgFields { constexpr std::string_view Url ("url"); } namespace AuthDataRequestMsgFields { constexpr std::string_view EffectiveUrl ("effective_url"); constexpr std::string_view LastAuthTimestamp ("last_auth_timestamp"); constexpr std::string_view LastUser ("username"); constexpr std::string_view AuthHint ("authHint"); } namespace MediaChangeRequestMsgFields { constexpr std::string_view Label ("label"); constexpr std::string_view MediaNr ("media_nr"); constexpr std::string_view Device ("device"); constexpr std::string_view Desc ("desc"); } namespace EjectMsgFields { constexpr std::string_view device ("device"); } class ProvideMessage { public: using Code = MessageCodes; ProvideMessage(const ProvideMessage &) = default; ProvideMessage(ProvideMessage &&) = default; ProvideMessage &operator=(const ProvideMessage &) = default; ProvideMessage &operator=(ProvideMessage &&) = default; using FieldVal = HeaderValue; static constexpr std::string_view typeName = "ProvideMessage"; static expected create ( const zypp::PluginFrame &message ); expected toStompMessage() const; static expected fromStompMessage( const zypp::PluginFrame &msg ); static ProvideMessage createProvideStarted ( const uint32_t reqId, const zypp::Url &url , const std::optional &localFilename = {}, const std::optional &stagingFilename = {} ); static ProvideMessage createProvideFinished ( const uint32_t reqId, const std::string &localFilename , bool cacheHit ); static ProvideMessage createAttachFinished ( const uint32_t reqId, const std::optional &localMountPoint = {} ); static ProvideMessage createDetachFinished ( const uint32_t reqId ); static ProvideMessage createAuthInfo ( const uint32_t reqId, const std::string &user, const std::string &pw, int64_t timestamp, const std::map &extraValues = {} ); static ProvideMessage createMediaChanged ( const uint32_t reqId ); static ProvideMessage createRedirect ( const uint32_t reqId, const zypp::Url &newUrl ); static ProvideMessage createMetalinkRedir ( const uint32_t reqId, const std::vector &newUrls ); static ProvideMessage createErrorResponse (const uint32_t reqId, const Code code, const std::string &reason, bool transient = false ); static ProvideMessage createProvide ( const uint32_t reqId , const zypp::Url &url , const std::optional &filename = {} , const std::optional &deltaFile = {} , const std::optional &expFilesize = {} , bool checkExistOnly = false ); static ProvideMessage createCancel ( const uint32_t reqId ); static ProvideMessage createAttach( const uint32_t reqId , const zypp::Url &url , const std::string attachId , const std::string &label , const std::optional &verifyType = {} , const std::optional &verifyData = {} , const std::optional &mediaNr = {} ); static ProvideMessage createDetach ( const uint32_t reqId, const zypp::Url &attachUrl ); static ProvideMessage createAuthDataRequest ( const uint32_t reqId, const zypp::Url &effectiveUrl, const std::string &lastTriedUser ="", const std::optional &lastAuthTimestamp = {}, const std::map &extraValues = {} ); static ProvideMessage createMediaChangeRequest ( const uint32_t reqId, const std::string &label, int32_t mediaNr, const std::vector &devices, const std::optional &desc ); uint requestId () const; void setRequestId ( const uint id ); Code code() const; void setCode (const Code newCode ); const std::vector &values ( const std::string_view &str ) const; const std::vector &values ( const std::string &str ) const; const HeaderValueMap &headers() const; /*! * Returns the last entry with key \a str in the list of values * or the default value specified in \a defaultVal */ FieldVal value ( const std::string_view &str, const FieldVal &defaultVal = FieldVal() ) const; FieldVal value ( const std::string &str, const FieldVal &defaultVal = FieldVal() ) const; void setValue ( const std::string &name, const FieldVal &value ); void setValue ( const std::string_view &name, const FieldVal &value ); void addValue ( const std::string &name, const FieldVal &value ); void addValue ( const std::string_view &name, const FieldVal &value ); private: ProvideMessage(); uint _reqId = -1; Code _code = NoCode; HeaderValueMap _headers; }; } #endif libzypp-17.36.5/zypp-media/ng/private/providequeue_p.h000066400000000000000000000103411476576476200227570ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_PRIVATE_PROVIDE_QUEUE_P_H_INCLUDED #define ZYPP_MEDIA_PRIVATE_PROVIDE_QUEUE_P_H_INCLUDED #include "providefwd_p.h" #include "providemessage_p.h" #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (StompFrameStream); class ProvideQueue : public Base { public: friend struct ProvideResourceData; static constexpr uint32_t InvalidId = (uint32_t) -1; using Config = zyppng::WorkerCaps; using TimePoint = std::chrono::time_point; struct Item { enum State { Pending, Queued, Running, Cancelling, Finished }; State _state = Pending; bool isAttachRequest () const; bool isFileRequest () const; bool isDetachRequest() const; ProvideRequestRef _request; }; ProvideQueue( ProvidePrivate &parent ); ~ProvideQueue(); bool startup ( const std::string &workerScheme, const zypp::Pathname &workDir, const std::string &hostname = "" ); void enqueue ( ProvideRequestRef request ); void cancel ( ProvideRequest *item, std::exception_ptr error ); void detach ( const std::string &id ); void scheduleNext (); bool canScheduleMore () const; bool empty () const; /*! * Check if the queue is currently idle */ bool isIdle () const; /*! * Time point since the queue started to be idle */ std::optional idleSince () const; /*! * How many items does this queue currently have */ uint requestCount () const; /*! * How many active items does this queue currently have */ uint activeRequests () const; /*! * How much bytes does this queue has to download / process, * for pending requests this is only set if the \ref ProvideSpec * has a expected download size set. */ zypp::ByteCount expectedProvideSize() const; /*! * Returns the hostname this worker belongs to. * If the worker was not associated with a hostname this will return a empty string. */ const std::string &hostname () const; const Config &workerConfig () const; SignalProxy sigIdle(); private: bool doStartup (); void processMessage ( ); void readAllStderr (); void forwardToLog ( std::string &&logLine ); void processReadyRead( int channel ); void procFinished ( int exitCode ); uint32_t nextRequestId(); /*! * Dequeues the request referenced by \a it. * Returns a iterator to the next element in the active list */ std::list< ProvideQueue::Item >::iterator dequeueActive ( std::list::iterator it ); void fatalWorkerError ( const std::exception_ptr &reason = nullptr ); void immediateShutdown ( const std::exception_ptr &reason ); /*! * Cancels the item the iterator \a i is pointing to, advancing the iterator to the next element in the list */ std::list< ProvideQueue::Item >::iterator cancelActiveItem (std::list::iterator i, const std::exception_ptr &error ); private: bool _queueShuttingDown = false; uint8_t _crashCounter = 0; Config _capabilities; zypp::Pathname _currentExe; std::string _myHostname; ProvidePrivate &_parent; std::deque< Item > _waitQueue; std::list< Item > _activeItems; Process::Ptr _workerProc; StompFrameStreamRef _messageStream; Signal _sigIdle; std::optional _idleSince; }; } #endif libzypp-17.36.5/zypp-media/ng/private/provideres_p.h000066400000000000000000000012261476576476200224260ustar00rootroot00000000000000#ifndef ZYPP_MEDIA_PRIVATE_PROVIDERES_P_H #define ZYPP_MEDIA_PRIVATE_PROVIDERES_P_H #include #include #include #include #include "providefwd_p.h" namespace zyppng { /*! * \internal * The internal shared data structure for \sa ProvideRes objects. */ struct ProvideResourceData { zyppng::Provide::MediaHandle _mediaHandle; zypp::ManagedFile _myFile; zypp::Url _resourceUrl; //< The resource where the file was provided from HeaderValueMap _responseHeaders; //< The response headers }; } #endif // ZYPP_MEDIA_PRIVATE_PROVIDERES_P_H libzypp-17.36.5/zypp-media/ng/provide-configvars.h000066400000000000000000000027321476576476200220650ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_PROVIDE_CONFIGVARS_H_INCLUDED #define ZYPP_MEDIA_PROVIDE_CONFIGVARS_H_INCLUDED #include namespace zyppng { // special config strings sent to the workers: constexpr std::string_view AGENT_STRING_CONF("zconfig://media/UserAgent"); constexpr std::string_view DISTRO_FLAV_CONF("zconfig://media/DistributionFlavor"); constexpr std::string_view ANON_ID_CONF("zconfig://media/AnonymousId"); constexpr std::string_view ATTACH_POINT("zconfig://media/AttachPoint"); constexpr std::string_view PROVIDER_ROOT("zconfig://media/ProviderRoot"); // request related settings: constexpr std::string_view NETWORK_METALINK_ENABLED("zypp-nw-metalink-enabled"); //< Enable or disable metalink for a specific request constexpr std::string_view HANDLER_SPECIFIC_DEVICES("zypp-req-specific-devices"); //< Limit the request to a set of devices. Devices are comma seperated. } #endif libzypp-17.36.5/zypp-media/ng/provide.cc000066400000000000000000001370501476576476200200660ustar00rootroot00000000000000#include "private/provide_p.h" #include "private/providedbg_p.h" #include "private/providequeue_p.h" #include "private/provideitem_p.h" #include #include #include #include #include #include #include // required to generate uuids #include L_ENV_CONSTR_DEFINE_FUNC(ZYPP_MEDIA_PROVIDER_DEBUG) namespace zyppng { ProvidePrivate::ProvidePrivate(zypp::filesystem::Pathname &&workDir, Provide &pub) : BasePrivate(pub) , _workDir( std::move(workDir) ) , _workerPath( constants::DEFAULT_PROVIDE_WORKER_PATH.data() ) { if ( _workDir.empty() ) { _workDir = zypp::Pathname(".").realpath(); } else { _workDir = _workDir.realpath(); } MIL << "Provider workdir is: " << _workDir << std::endl; _scheduleTrigger->setSingleShot(true); Base::connect( *_scheduleTrigger, &Timer::sigExpired, *this, &ProvidePrivate::doSchedule ); } void ProvidePrivate::schedule( ScheduleReason reason ) { if ( provideDebugEnabled () ) { std::string_view reasonStr; switch( reason ) { case ProvideStart: reasonStr = "ProvideStart"; break; case QueueIdle: reasonStr = "QueueIdle"; break; case EnqueueItem: reasonStr = "EnqueueItem"; break; case EnqueueReq: reasonStr = "EnqueueReq"; break; case FinishReq: reasonStr = "FinishReq"; break; case RestartAttach: reasonStr = "RestartAttach"; break; } DBG << "Triggering the schedule timer (" << reasonStr << ")" << std::endl; } // we use a single shot timer that instantly times out when the event loop is entered the next time // this way we compress many schedule requests that happen during a eventloop run into one _scheduleTrigger->start(0); } void ProvidePrivate::doSchedule ( zyppng::Timer & ) { if ( !_isRunning ) { MIL << "Provider is not started, NOT scheduling" << std::endl; return; } if ( _isScheduling ) { DBG_PRV << "Scheduling triggered during scheduling, returning immediately." << std::endl; return; } const int cpuLimit = #ifdef _SC_NPROCESSORS_ONLN sysconf(_SC_NPROCESSORS_ONLN) * 2; #else DEFAULT_CPU_WORKERS; #endif // helper lambda to find the worker that is idle for the longest time constexpr auto findLaziestWorker = []( const auto &workerQueues, const auto &idleNames ) { auto candidate = workerQueues.end(); ProvideQueue::TimePoint candidateIdleSince = ProvideQueue::TimePoint::max(); //find the worker thats idle the longest for ( const auto &name : idleNames ) { auto thisElem = workerQueues.find(name); if ( thisElem == workerQueues.end() ) continue; const auto idleS = thisElem->second->idleSince(); if ( idleS && ( candidate == workerQueues.end() || *idleS < candidateIdleSince ) ) { candidateIdleSince = *idleS; candidate = thisElem; } } if ( candidate != workerQueues.end() ) MIL_PRV << "Found idle worker:" << candidate->first << " idle since: " << candidateIdleSince.time_since_epoch().count() << std::endl; return candidate; }; // clean up old media for ( auto iMedia = _attachedMediaInfos.begin(); iMedia != _attachedMediaInfos.end(); ) { if ( (*iMedia)->refCount() > 1 ) { MIL_PRV << "Not releasing media " << (*iMedia)->_name << " refcount is not zero" << std::endl; ++iMedia; continue; } if ( (*iMedia)->_workerType == ProvideQueue::Config::Downloading ) { // we keep the information around for an hour so we do not constantly download the media files for no reason if ( (*iMedia)->_idleSince && std::chrono::steady_clock::now() - (*iMedia)->_idleSince.value() >= std::chrono::hours(1) ) { MIL << "Detaching medium " << (*iMedia)->_name << " for baseUrl " << (*iMedia)->_attachedUrl << std::endl; iMedia = _attachedMediaInfos.erase(iMedia); continue; } else { MIL_PRV << "Not releasing media " << (*iMedia)->_name << " downloading worker and not timed out yet." << std::endl; } } else { // mounting handlers, we need to send a request to the workers auto bQueue = (*iMedia)->_backingQueue.lock(); if ( bQueue ) { zypp::Url url = (*iMedia)->_attachedUrl; url.setScheme( url.getScheme() + std::string( constants::ATTACHED_MEDIA_SUFFIX) ); url.setAuthority( (*iMedia)->_name ); const auto &req = ProvideRequest::createDetach( url ); if ( req ) { MIL << "Detaching medium " << (*iMedia)->_name << " for baseUrl " << (*iMedia)->_attachedUrl << std::endl; bQueue->enqueue ( *req ); iMedia = _attachedMediaInfos.erase(iMedia); continue; } else { ERR << "Could not send detach request, creating the request failed" << std::endl; } } else { ERR << "Could not send detach request since no backing queue was defined" << std::endl; } } ++iMedia; } zypp::DtorReset schedFlag( _isScheduling, false ); _isScheduling = true; const auto schedStart = std::chrono::steady_clock::now(); MIL_PRV << "Start scheduling" << std::endl; zypp::OnScopeExit deferExitMessage( [&](){ const auto dur = std::chrono::steady_clock::now() - schedStart; MIL_PRV << "Exit scheduling after:" << std::chrono::duration_cast( dur ).count () << std::endl; }); // bump inactive items for ( auto it = _items.begin (); it != _items.end(); ) { // was maybe released during scheduling if ( !(*it) ) it = _items.erase(it); else { auto &item = *it; if ( item->state() == ProvideItem::Uninitialized ) { item->initialize(); } it++; } } // we are scheduling now, everything that triggered the timer until now we can forget about _scheduleTrigger->stop(); for( auto queueIter = _queues.begin(); queueIter != _queues.end(); queueIter ++ ) { const auto &scheme = queueIter->_schemeName; auto &queue = queueIter->_requests; if ( !queue.size() ) continue; const auto &configOpt = schemeConfig ( scheme ); MIL_PRV << "Start scheduling for scheme:" << scheme << " queue size is: " << queue.size() << std::endl; if ( !configOpt ) { // FAIL all requests in this queue ERR << "Scheme: " << scheme << " failed to return a valid configuration." << std::endl; while( queue.size() ) { auto item = std::move( queue.front() ); queue.pop_front(); if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR(zypp::media::MediaException("Failed to query scheme config.")) ); } continue; } // the scheme config that defines how we schedule requests on this set of queues const auto &config = configOpt.get(); const auto isSingleInstance = ( (config.cfg_flags() & ProvideQueue::Config::SingleInstance) == ProvideQueue::Config::SingleInstance ); if ( config.worker_type() == ProvideQueue::Config::Downloading && !isSingleInstance ) { for( auto i = queue.begin (); i != queue.end(); ) { // this is the only place where we remove elements from the queue when the scheduling flag is active // other code just nulls out requests in the queue if during scheduling items need to be removed while ( i != queue.end() && !(*i) ) { i = queue.erase(i); } if ( i == queue.end() ) break; ProvideRequestRef item = *i; // Downloading queues do not support attaching via a AttachRequest, this is handled by simply providing the media verification files // If we hit this code path, its a bug if( item->code() == ProvideMessage::Code::Attach || item->code() == ProvideMessage::Code::Detach ) { i = queue.erase(i); if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR( zypp::Exception("Downloading Queues do not support ProvideMessage::Code::Attach requests") ) ); continue; } MIL_PRV << "Trying to schedule request: " << item->urls().front() << std::endl; // how many workers for this type do already exist int existingTypeWorkers = 0; // how many currently active connections are there int existingConnections = 0; // all currently available possible queues for the request std::vector< std::pair > possibleHostWorkers; // currently idle workers std::vector idleWorkers; // all mirrors without a existing worker std::vector mirrsWithoutWorker; for ( const auto &url : item->urls() ) { if ( effectiveScheme( url.getScheme() ) != scheme ) { MIL << "Mirror URL " << url << " is incompatible with current scheme: " << scheme << ", ignoring." << std::endl; continue; } if( item->owner()->canRedirectTo( item, url ) ) mirrsWithoutWorker.push_back( url ); else { MIL_PRV << "URL was rejected" << url << std::endl; } } // at this point the list contains all useable mirrors, if this list is empty the request needs to fail if( mirrsWithoutWorker.size() == 0 ) { MIL << "Request has NO usable URLs" << std::endl; if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR(zypp::media::MediaException("No usable URLs in request spec.")) ); i = queue.erase(i); continue; } for ( auto &[ queueName, workerQueue ] : _workerQueues ) { if ( ProvideQueue::Config::Downloading != workerQueue->workerConfig().worker_type() ) continue; existingTypeWorkers ++; existingConnections += workerQueue->activeRequests(); if ( workerQueue->isIdle() ) idleWorkers.push_back (queueName); if ( !zypp::str::startsWith( queueName, scheme ) ) continue; for ( auto i = mirrsWithoutWorker.begin (); i != mirrsWithoutWorker.end(); ) { const auto &u = *i; if ( u.getHost() == workerQueue->hostname() ) { if ( workerQueue->requestCount() < constants::DEFAULT_ACTIVE_CONN_PER_HOST ) possibleHostWorkers.push_back( {u, workerQueue.get()} ); i = mirrsWithoutWorker.erase( i ); // we can not stop after removing the first hit, since there could be multiple mirrors with the same hostname } else { ++i; } } } if( provideDebugEnabled() ) { MIL << "Current stats: " << std::endl; MIL << "Existing type workers: " << existingTypeWorkers << std::endl; MIL << "Existing active connections: " << existingConnections << std::endl; MIL << "Possible host workers: "<< possibleHostWorkers.size() << std::endl; MIL << "Mirrors without worker: " << mirrsWithoutWorker.size() << std::endl; } // need to wait for requests to finish in order to schedule more requests if ( existingConnections >= constants::DEFAULT_ACTIVE_CONN ) { MIL_PRV << "Reached maximum nr of connections, break" << std::endl; break; } // if no workers are running, take the first mirror and start a worker for it // if < nr of workers are running, use a mirror we do not have a conn yet to if ( existingTypeWorkers < constants::DEFAULT_MAX_DYNAMIC_WORKERS && mirrsWithoutWorker.size() ) { MIL_PRV << "Free worker slots and available mirror URLs, starting a new worker" << std::endl; //@TODO out of the available mirrors use the best one based on statistics ( if available ) bool found = false; for( const auto &url : mirrsWithoutWorker ) { // mark this URL as used now, in case the queue can not be started we won't try it anymore if ( !item->owner()->safeRedirectTo ( item, url ) ) continue; ProvideQueueRef q = std::make_shared( *this ); if ( !q->startup( scheme, _workDir / scheme / url.getHost(), url.getHost() ) ) { break; } else { MIL_PRV << "Started worker for " << url.getHost() << " enqueing request" << std::endl; item->setActiveUrl(url); found = true; std::string str = zypp::str::Format("%1%://%2%") % scheme % url.getHost(); _workerQueues[str] = q; q->enqueue( item ); break; } } if( found ) { i = queue.erase(i); continue; } } // if we cannot start a new worker, find the best queue where we can push the item into if ( possibleHostWorkers.size() ) { MIL_PRV << "No free worker slots, looking for the best existing worker" << std::endl; bool found = false; while( possibleHostWorkers.size () ) { std::vector< std::pair >::iterator candidate = possibleHostWorkers.begin(); for ( auto i = candidate+1; i != possibleHostWorkers.end(); i++ ) { if ( i->second->activeRequests () < candidate->second->activeRequests () ) candidate = i; } if ( !item->owner()->safeRedirectTo( item, candidate->first ) ) { possibleHostWorkers.erase( candidate ); continue; } MIL_PRV << "Using existing worker " << candidate->first.getHost() << " to download request" << std::endl; found = true; item->setActiveUrl( candidate->first ); candidate->second->enqueue( item ); break; } if( found ) { i = queue.erase(i); continue; } } // if we reach this place all we can now try is to decomission idle queues and use the new slot to start // a new worker if ( idleWorkers.size() && mirrsWithoutWorker.size() ) { MIL_PRV << "No free worker slots, no slots in existing queues, trying to decomission idle queues." << std::endl; auto candidate = findLaziestWorker( _workerQueues, idleWorkers ); if ( candidate != _workerQueues.end() ) { // for now we decomission the worker and start a new one, should we instead introduce a "reset" message // that repurposes the worker to another hostname/workdir config? _workerQueues.erase(candidate); //@TODO out of the available mirrors use the best one based on statistics ( if available ) bool found = false; for( const auto &url : mirrsWithoutWorker ) { if ( !item->owner()->safeRedirectTo ( item, url ) ) continue; ProvideQueueRef q = std::make_shared( *this ); if ( !q->startup( scheme, _workDir / scheme / url.getHost(), url.getHost() ) ) { break; } else { MIL_PRV << "Replaced worker for " << url.getHost() << ", enqueing request" << std::endl; item->setActiveUrl(url); found = true; auto str = zypp::str::Format("%1%://%2%") % scheme % url.getHost(); _workerQueues[str] = q; q->enqueue( item ); } } if( found ) { i = queue.erase(i); continue; } } } // if we reach here we skip over the item and try to schedule it again later MIL_PRV << "End of line, deferring request for next try." << std::endl; i++; } } else if ( config.worker_type() == ProvideQueue::Config::CPUBound && !isSingleInstance ) { for( auto i = queue.begin (); i != queue.end(); ) { // this is the only place where we remove elements from the queue when the scheduling flag is active // other code just nulls out requests in the queue if during scheduling items need to be removed while ( i != queue.end() && !(*i) ) { i = queue.erase(i); } if ( i == queue.end() ) break; // make a real reference so it does not dissapear when we remove it from the queue ProvideRequestRef item = *i; // CPU bound queues do not support attaching via a AttachRequest, this is handled by simply providing the media verification files // If we hit this code path, its a bug if( item->code() == ProvideMessage::Code::Attach || item->code() == ProvideMessage::Code::Detach ) { i = queue.erase(i); if ( item->owner () ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR( zypp::Exception("CPU bound Queues do not support ProvideAttachSpecRef requests") ) ); continue; } MIL_PRV << "Trying to schedule request: " << item->urls().front() << std::endl; // how many workers for this type do already exist int existingTypeWorkers = 0; int existingSchemeWorkers = 0; // all currently available possible queues for the request std::vector< ProvideQueue* > possibleWorkers; // currently idle workers std::vector idleWorkers; // the URL we are going to use this time zypp::Url url; //CPU bound queues do not spawn per mirrors, we use the first compatible URL for ( const auto &tmpurl : item->urls() ) { if ( effectiveScheme( tmpurl.getScheme() ) != scheme ) { MIL << "Mirror URL " << tmpurl << " is incompatible with current scheme: " << scheme << ", ignoring." << std::endl; continue; } url = tmpurl; break; } // at this point if the URL is empty the request needs to fail if( !url.isValid() ) { MIL << "Request has NO usable URLs" << std::endl; if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR(zypp::media::MediaException("No usable URLs in request spec.")) ); i = queue.erase(i); continue; } for ( auto &[ queueName, workerQueue ] : _workerQueues ) { if ( ProvideQueue::Config::CPUBound != workerQueue->workerConfig().worker_type() ) continue; const bool thisScheme = zypp::str::startsWith( queueName, scheme ); existingTypeWorkers ++; if ( thisScheme ) { existingSchemeWorkers++; if ( workerQueue->canScheduleMore() ) possibleWorkers.push_back(workerQueue.get()); } if ( workerQueue->isIdle() ) idleWorkers.push_back(queueName); } if( provideDebugEnabled() ) { MIL << "Current stats: " << std::endl; MIL << "Existing type workers: " << existingTypeWorkers << std::endl; MIL << "Possible CPU workers: "<< possibleWorkers.size() << std::endl; } // first we use existing idle workers of the current type if ( possibleWorkers.size() ) { bool found = false; for ( auto &w : possibleWorkers ) { if ( w->isIdle() ) { MIL_PRV << "Using existing idle worker to provide request" << std::endl; // this is not really required because we are not doing redirect checks item->owner()->redirectTo ( item, url ); item->setActiveUrl( url ); w->enqueue( item ); i = queue.erase(i); found = true; break; } } if ( found ) continue; } // we first start as many workers as we need before queueing more request to existing ones if ( existingTypeWorkers < cpuLimit ) { MIL_PRV << "Free CPU slots, starting a new worker" << std::endl; // this is not really required because we are not doing redirect checks item->owner()->redirectTo ( item, url ); ProvideQueueRef q = std::make_shared( *this ); if ( q->startup( scheme, _workDir / scheme ) ) { item->setActiveUrl(url); auto str = zypp::str::Format("%1%#%2%") % scheme % existingSchemeWorkers; _workerQueues[str] = q; q->enqueue( item ); i = queue.erase(i); continue; } else { // CPU bound requests can not recover from this error i = queue.erase(i); if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR( zypp::Exception("Unable to start worker for request.") ) ); continue; } } // we can not start more workers, all we can do now is fill up queues of existing ones if ( possibleWorkers.size() ) { MIL_PRV << "No free CPU slots, looking for the best existing worker" << std::endl; if( possibleWorkers.size () ) { std::vector::iterator candidate = possibleWorkers.begin(); for ( auto i = candidate+1; i != possibleWorkers.end(); i++ ) { if ( (*i)->activeRequests () < (*candidate)->activeRequests () ) candidate = i; } // this is not really required because we are not doing redirect checks item->owner()->redirectTo ( item, url ); MIL_PRV << "Using existing worker to provide request" << std::endl; item->setActiveUrl( url ); (*candidate)->enqueue( item ); i = queue.erase(i); continue; } } // if we reach this place all we can now try is to decomission idle queues and use the new slot to start // a new worker if ( idleWorkers.size() ) { MIL_PRV << "No free CPU slots, no slots in existing queues, trying to decomission idle queues." << std::endl; auto candidate = findLaziestWorker( _workerQueues, idleWorkers ); if ( candidate != _workerQueues.end() ) { _workerQueues.erase(candidate); // this is not really required because we are not doing redirect checks item->owner()->redirectTo ( item, url ); ProvideQueueRef q = std::make_shared( *this ); if ( q->startup( scheme, _workDir / scheme ) ) { MIL_PRV << "Replaced worker, enqueing request" << std::endl; item->setActiveUrl(url); auto str = zypp::str::Format("%1%#%2%") % scheme % ( existingSchemeWorkers + 1 ); _workerQueues[str] = q; q->enqueue( item ); i = queue.erase(i); continue; } else { // CPU bound requests can not recover from this error i = queue.erase(i); if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR( zypp::Exception("Unable to start worker for request.") ) ); continue; } } } else { MIL_PRV << "No idle workers and no free CPU spots, wait for the next schedule run" << std::endl; break; } // if we reach here we skip over the item and try to schedule it again later MIL_PRV << "End of line, deferring request for next try." << std::endl; i++; } } else { // either SingleInstance worker or Mounting/VolatileMounting for( auto i = queue.begin (); i != queue.end(); ) { // this is the only place where we remove elements from the queue when the scheduling flag is active // other code just nulls out requests in the queue if during scheduling items need to be removed while ( i != queue.end() && !(*i) ) { i = queue.erase(i); } if ( i == queue.end() ) break; // make a real reference so it does not dissapear when we remove it from the queue ProvideRequestRef item = *i; MIL_PRV << "Trying to schedule request: " << item->urls().front() << std::endl; zypp::Url url; //mounting queues do not spawn per mirrors, we use the first compatible URL for ( const auto &tmpurl : item->urls() ) { if ( effectiveScheme( tmpurl.getScheme() ) != scheme ) { MIL << "Mirror URL " << tmpurl << " is incompatible with current scheme: " << scheme << ", ignoring." << std::endl; continue; } url = tmpurl; break; } // at this point if the URL is empty the request needs to fail if( !url.isValid() ) { MIL << "Request has NO usable URLs" << std::endl; if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR(zypp::media::MediaException("No usable URLs in request spec.")) ); i = queue.erase(i); continue; } ProvideQueue *qToUse = nullptr; if ( !_workerQueues.count(scheme) ) { ProvideQueueRef q = std::make_shared( *this ); if ( !q->startup( scheme, _workDir / scheme ) ) { ERR << "Worker startup failed!" << std::endl; // mounting/single instance requests can not recover from this error i = queue.erase(i); if ( item->owner() ) item->owner()->finishReq( nullptr, item, ZYPP_EXCPT_PTR( zypp::Exception("Unable to start worker for request.") ) ); continue; } MIL_PRV << "Started worker, enqueing request" << std::endl; qToUse = q.get(); _workerQueues[scheme] = q; } else { MIL_PRV << "Found worker, enqueing request" << std::endl; qToUse = _workerQueues.at(scheme).get(); } // this is not really required because we are not doing redirect checks item->owner()->redirectTo ( item, url ); item->setActiveUrl(url); qToUse->enqueue( item ); i = queue.erase(i); } } } } std::list &ProvidePrivate::items() { return _items; } zypp::media::CredManagerOptions &ProvidePrivate::credManagerOptions () { return _credManagerOptions; } std::vector ProvidePrivate::sanitizeUrls(const std::vector &urls) { std::vector usableMirrs; std::optional scheme; for ( auto mirrIt = urls.begin() ; mirrIt != urls.end(); mirrIt++ ) { const auto &s = schemeConfig( effectiveScheme( mirrIt->getScheme() ) ); if ( !s ) { WAR << "URL: " << *mirrIt << " is not supported, ignoring!" << std::endl; continue; } if ( !scheme ) { scheme = *s; usableMirrs.push_back ( *mirrIt ); } else { if ( scheme->worker_type () == s->worker_type () ) { usableMirrs.push_back( *mirrIt ); } else { WAR << "URL: " << *mirrIt << " has different worker type than the primary URL: "<< usableMirrs.front() <<", ignoring!" << std::endl; } } } if ( !scheme || usableMirrs.empty() ) { return {}; } return usableMirrs; } std::vector &ProvidePrivate::attachedMediaInfos() { return _attachedMediaInfos; } expected ProvidePrivate::schemeConfig( const std::string &scheme ) { if ( auto i = _schemeConfigs.find( scheme ); i != _schemeConfigs.end() ) { return expected::success(i->second); } else { // we do not have the queue config yet, we need to start a worker to get one ProvideQueue q( *this ); if ( !q.startup( scheme, _workDir / scheme ) ) { return expected::error(ZYPP_EXCPT_PTR(zypp::media::MediaException("Failed to start worker to read scheme config."))); } auto newItem = _schemeConfigs.insert( std::make_pair( scheme, q.workerConfig() )); return expected::success(newItem.first->second); } } std::optional ProvidePrivate::addToFileCache( const zypp::filesystem::Pathname &downloadedFile ) { const auto &key = downloadedFile.asString(); if ( !zypp::PathInfo(downloadedFile).isExist() ) { _fileCache.erase ( key ); return {}; } auto i = _fileCache.insert( { key, FileCacheItem() } ); if ( !i.second ) { // file did already exist in the cache, return the shared data i.first->second._deathTimer.reset(); return i.first->second._file; } i.first->second._file = zypp::ManagedFile( downloadedFile, zypp::filesystem::unlink ); return i.first->second._file; } bool ProvidePrivate::isInCache ( const zypp::Pathname &downloadedFile ) const { const auto &key = downloadedFile.asString(); return (_fileCache.count(key) > 0); } void ProvidePrivate::queueItem ( ProvideItemRef item ) { _items.push_back( item ); schedule( ProvidePrivate::EnqueueItem ); } void ProvidePrivate::dequeueItem( ProvideItem *item) { auto elem = std::find_if( _items.begin(), _items.end(), [item]( const auto &i){ return i.get() == item; } ); if ( elem != _items.end() ) { if ( _isScheduling ) { (*elem).reset(); } else { _items.erase(elem); } } } std::string ProvidePrivate::nextMediaId() const { zypp::AutoDispose rawStr( g_uuid_string_random (), g_free ); return zypp::str::asString ( rawStr.value() ); } AttachedMediaInfo_Ptr ProvidePrivate::addMedium( AttachedMediaInfo_Ptr &&medium ) { assert( medium ); if ( !medium ) return nullptr; MIL_PRV << "Registered new media attachment with ID: " << medium->name() << " with mountPoint: (" << medium->_localMountPoint.value_or(zypp::Pathname()) << ")" << std::endl; _attachedMediaInfos.push_back( std::move(medium) ); return _attachedMediaInfos.back(); } bool ProvidePrivate::queueRequest ( ProvideRequestRef req ) { const auto &schemeName = effectiveScheme( req->url().getScheme() ); auto existingQ = std::find_if( _queues.begin (), _queues.end(), [&schemeName]( const auto &qItem) { return (qItem._schemeName == schemeName); }); if ( existingQ != _queues.end() ) { existingQ->_requests.push_back(req); } else { _queues.push_back( ProvidePrivate::QueueItem{ schemeName, {req} } ); } schedule( ProvidePrivate::EnqueueReq ); return true; } bool ProvidePrivate::dequeueRequest(ProvideRequestRef req , std::exception_ptr error) { auto queue = req->currentQueue (); if ( queue ) { queue->cancel( req.get(), error ); return true; } else { // Request not started yet, search request queues for ( auto &q : _queues ) { auto elem = std::find( q._requests.begin(), q._requests.end(), req ); if ( elem != q._requests.end() ) { q._requests.erase(elem); if ( req->owner() ) req->owner()->finishReq( nullptr, req, error ); return true; } } } return false; } const zypp::Pathname &ProvidePrivate::workerPath() const { return _workerPath; } const std::string ProvidePrivate::queueName( ProvideQueue &q ) const { for ( const auto &v : _workerQueues ) { if ( v.second.get() == &q ) return v.first; } return {}; } bool ProvidePrivate::isRunning() const { return _isRunning; } std::string ProvidePrivate::effectiveScheme(const std::string &scheme) const { const std::string &ss = zypp::str::stripSuffix( scheme, constants::ATTACHED_MEDIA_SUFFIX ); if ( auto it = _workerAlias.find ( ss ); it != _workerAlias.end () ) { return it->second; } return ss; } void ProvidePrivate::onPulseTimeout( Timer & ) { DBG_PRV << "Pulse timeout" << std::endl; auto now = std::chrono::steady_clock::now(); if ( _log ) _log->pulse(); // release old cache files for ( auto i = _fileCache.begin (); i != _fileCache.end(); ) { auto &cacheItem = i->second; if ( cacheItem._file.unique() ) { if ( cacheItem._deathTimer ) { if ( now - *cacheItem._deathTimer < std::chrono::seconds(20) ) { MIL << "Releasing file " << *i->second._file << " from cache, death timeout." << std::endl; i = _fileCache.erase(i); continue; } } else { // start the death timeout cacheItem._deathTimer = std::chrono::steady_clock::now(); } } ++i; } } void ProvidePrivate::onQueueIdle() { if ( !_items.empty() ) return; for ( auto &[k,q] : _workerQueues ) { if ( !q->empty() ) return; } // all queues are empty _sigIdle.emit(); } void ProvidePrivate::onItemStateChanged( ProvideItem &item ) { if ( item.state() == ProvideItem::Finished ) { auto itemRef = item.shared_this(); auto i = std::find( _items.begin(), _items.end(), itemRef ); if ( i == _items.end() ) { ERR << "State of unknown Item changed, ignoring" << std::endl; return; } if ( _isScheduling ) i->reset(); else _items.erase(i); } if ( _items.empty() ) onQueueIdle(); } uint32_t ProvidePrivate::nextRequestId() { //@TODO is it required to handle overflow? return ++_nextRequestId; } ProvideMediaHandle::ProvideMediaHandle(Provide &parent, AttachedMediaInfo_Ptr mediaInfoRef ) : _parent( parent.weak_this() ) , _mediaRef( std::move(mediaInfoRef) ) {} std::shared_ptr ProvideMediaHandle::parent() const { return _parent.lock(); } bool ProvideMediaHandle::isValid() const { return ( _mediaRef.get() != nullptr ); } std::string ProvideMediaHandle::handle() const { if ( !_mediaRef ) return {}; return _mediaRef->_name; } const zypp::Url &ProvideMediaHandle::baseUrl() const { static zypp::Url invalidHandle; if ( !_mediaRef ) return invalidHandle; return _mediaRef->_attachedUrl; } const std::optional &ProvideMediaHandle::localPath() const { static std::optional invalidHandle; if ( !_mediaRef ) return invalidHandle; return _mediaRef->_localMountPoint; } AttachedMediaInfo_constPtr ProvideMediaHandle::mediaInfo() const { return _mediaRef; } Provide::Provide( const zypp::Pathname &workDir ) : Base( *new ProvidePrivate( zypp::Pathname(workDir), *this ) ) { Z_D(); connect( *d->_pulseTimer, &Timer::sigExpired, *d, &ProvidePrivate::onPulseTimeout ); } ProvideRef Provide::create( const zypp::filesystem::Pathname &workDir ) { return ProvideRef( new Provide(workDir) ); } expected Provide::prepareMedia(const std::vector &urls, const ProvideMediaSpec &request) { Z_D(); // sanitize the mirrors to contain only URLs that have same worker types std::vector usableMirrs = d->sanitizeUrls( urls ); if ( usableMirrs.empty() ) { return expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("No valid mirrors available") )); } return expected::success( shared_this(), std::move(usableMirrs), request ); } expected Provide::prepareMedia(const zypp::Url &url, const ProvideMediaSpec &request) { return prepareMedia( std::vector{url}, request ); } AsyncOpRef > Provide::attachMediaIfNeeded( LazyMediaHandle lazyHandle) { using namespace zyppng::operators; if ( lazyHandle.attached() ) return makeReadyResult( expected::success( *lazyHandle.handle() ) ); MIL << "Attaching lazy medium with label: [" << lazyHandle.spec().label() << "]" << std::endl; return attachMedia( lazyHandle.urls(), lazyHandle.spec () ) | and_then([lazyHandle]( MediaHandle handle ) { lazyHandle._sharedData->_mediaHandle = handle; return expected::success( std::move(handle) ); }); } AsyncOpRef> Provide::attachMedia( const zypp::Url &url, const ProvideMediaSpec &request ) { return attachMedia ( std::vector{url}, request ); } AsyncOpRef> Provide::attachMedia( const std::vector &urls, const ProvideMediaSpec &request ) { Z_D(); // sanitize the mirrors to contain only URLs that have same worker types std::vector usableMirrs = d->sanitizeUrls( urls ); if ( usableMirrs.empty() ) { return makeReadyResult( expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("No valid mirrors available") )) ); } // first check if there is a already attached medium we can use as well auto &attachedMedia = d->attachedMediaInfos (); for ( auto &medium : attachedMedia ) { if ( medium->isSameMedium ( usableMirrs, request ) ) { return makeReadyResult( expected::success( Provide::MediaHandle( *this, medium ) )); } } auto op = AttachMediaItem::create( usableMirrs, request, *d_func() ); d->queueItem (op); return op->promise(); } AsyncOpRef< expected > Provide::provide( const std::vector &urls, const ProvideFileSpec &request ) { Z_D(); auto op = ProvideFileItem::create( urls, request, *d ); d->queueItem (op); return op->promise(); } AsyncOpRef< expected > Provide::provide( const zypp::Url &url, const ProvideFileSpec &request ) { return provide( std::vector{ url }, request ); } AsyncOpRef< expected > Provide::provide( const MediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request ) { Z_D(); const auto i = std::find( d->_attachedMediaInfos.begin(), d->_attachedMediaInfos.end(), attachHandle.mediaInfo() ); if ( i == d->_attachedMediaInfos.end() ) { return makeReadyResult( expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaException("Invalid attach handle")) ) ); } // for downloading items we need to make the baseUrl part of the request URL zypp::Url url = (*i)->_attachedUrl; // real mount devices use a ID to reference a attached medium, for those we do not need to send the baseUrl as well since its already // part of the mount point, so if we mount host:/path/to/repo to the ID 1234 and look for the file /path/to/repo/file1 the request URL will look like: nfs-media://1234/file1 if ( (*i)->_workerType == ProvideQueue::Config::SimpleMount || (*i)->_workerType == ProvideQueue::Config::VolatileMount ) { url = zypp::Url(); // work around the zypp::Url requirements for certain Url schemes by attaching a suffix, that way we are always able to have a authority url.setScheme( (*i)->_attachedUrl.getScheme() + std::string(constants::ATTACHED_MEDIA_SUFFIX) ); url.setAuthority( (*i)->_name ); url.setPathName("/"); } url.appendPathName( fileName ); auto op = ProvideFileItem::create( {url}, request, *d ); op->setMediaRef( MediaHandle( *this, (*i) )); d->queueItem (op); return op->promise(); } AsyncOpRef > Provide::provide( const LazyMediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request ) { using namespace zyppng::operators; return attachMediaIfNeeded ( attachHandle ) | and_then([weakMe = weak_this(), fName = fileName, req = request ]( MediaHandle handle ){ auto me = weakMe.lock(); if ( !me ) return makeReadyResult(expected::error(ZYPP_EXCPT_PTR(zypp::Exception("Provide was released during a operation")))); return me->provide( handle, fName, req); }); } zyppng::AsyncOpRef > Provide::checksumForFile( const zypp::Pathname &p, const std::string &algorithm ) { using namespace zyppng::operators; zypp::Url url("chksum:///"); url.setPathName( p ); auto fut = provide( url, zyppng::ProvideFileSpec().setCustomHeaderValue( "chksumType", algorithm ) ) | and_then( [algorithm]( zyppng::ProvideRes &&chksumRes ) { if ( chksumRes.headers().contains(algorithm) ) { try { return expected::success( zypp::CheckSum( algorithm, chksumRes.headers().value(algorithm).asString() ) ); } catch ( ... ) { return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } return expected::error( ZYPP_EXCPT_PTR( zypp::FileCheckException("Invalid/Empty checksum returned from worker") ) ); } ); return fut; } AsyncOpRef> Provide::copyFile ( const zypp::Pathname &source, const zypp::Pathname &target ) { using namespace zyppng::operators; zypp::Url url("copy:///"); url.setPathName( source ); auto fut = provide( url, ProvideFileSpec().setDestFilenameHint( target )) | and_then( [&]( ProvideRes &©Res ) { return expected::success( copyRes.asManagedFile() ); } ); return fut; } AsyncOpRef > Provide::copyFile( ProvideRes &&source, const zypp::filesystem::Pathname &target ) { using namespace zyppng::operators; auto fName = source.file(); return copyFile( fName, target ) | [ resSave = std::move(source) ] ( auto &&result ) { // callback lambda to keep the ProvideRes reference around until the op is finished, // if the op fails the callback will be cleaned up and so the reference return result; }; } void Provide::start () { Z_D(); d->_isRunning = true; d->_pulseTimer->start( 5000 ); d->schedule( ProvidePrivate::ProvideStart ); if ( d->_log ) d->_log->provideStart(); } void Provide::setWorkerPath(const zypp::filesystem::Pathname &path) { d_func()->_workerPath = path; } bool Provide::ejectDevice(const std::string &queueRef, const std::string &device) { if ( !queueRef.empty() ) { return zypp::media::CDTools::openTray(device); } return false; } void Provide::setStatusTracker( ProvideStatusRef tracker ) { d_func()->_log = tracker; } const zypp::Pathname &Provide::providerWorkdir () const { return d_func()->_workDir; } const zypp::media::CredManagerOptions &Provide::credManangerOptions () const { Z_D(); return d->_credManagerOptions; } void Provide::setCredManagerOptions( const zypp::media::CredManagerOptions & opt ) { d_func()->_credManagerOptions = opt; } SignalProxy Provide::sigIdle() { return d_func()->_sigIdle; } SignalProxy &, const std::optional &)> Provide::sigMediaChangeRequested() { return d_func()->_sigMediaChange; } SignalProxy< std::optional ( const zypp::Url &reqUrl, const std::string &triedUsername, const std::map &extraValues ) > Provide::sigAuthRequired() { return d_func()->_sigAuthRequired; } ZYPP_IMPL_PRIVATE(Provide); ProvideStatus::ProvideStatus( ProvideRef parent ) : _provider( parent ) { } void ProvideStatus::provideStart () { _stats = Stats(); _stats._startTime = std::chrono::steady_clock::now(); _stats._lastPulseTime = std::chrono::steady_clock::now(); } void ProvideStatus::itemDone ( ProvideItem &item ) { const auto &sTime = item.startTime(); const auto &fTime = item.finishedTime(); if ( sTime > sTime.min() && fTime >= sTime ) { auto duration = std::chrono::duration_cast( item.finishedTime() - item.startTime() ); if ( duration.count() ) MIL << "Item finished after " << duration.count() << " seconds, with " << zypp::ByteCount( item.currentStats()->_bytesProvided.operator zypp::ByteCount::SizeType() / duration.count() ) << "/s" << std::endl; MIL << "Item finished after " << (item.finishedTime() - item.startTime()).count() << " ns" << std::endl; } pulse( ); } void ProvideStatus::itemFailed ( ProvideItem &item ) { MIL << "Item failed" << std::endl; } const ProvideStatus::Stats& ProvideStatus::stats() const { return _stats; } void ProvideStatus::pulse ( ) { auto prov = _provider.lock(); if ( !prov ) return; const auto lastFinishedBytes = _stats._finishedBytes; const auto lastPartialBytes = _stats._partialBytes; _stats._expectedBytes = _stats._finishedBytes; // finished bytes are expected too! zypp::ByteCount tmpPartialBytes (0); // bytes that are finished in staging, but not commited to cache yet for ( const auto &i : prov->d_func()->items() ) { if ( !i // maybe released during scheduling || i->state() == ProvideItem::Cancelling ) continue; if ( i->state() == ProvideItem::Uninitialized || i->state() == ProvideItem::Pending ) { _stats._expectedBytes += i->bytesExpected(); continue; } i->pulse(); const auto & stats = i->currentStats(); const auto & prevStats = i->previousStats(); if ( !stats || !prevStats ) { ERR << "Bug! Stats should be initialized by now" << std::endl; continue; } if ( i->state() == ProvideItem::Downloading || i->state() == ProvideItem::Processing || i->state() == ProvideItem::Finalizing ) { _stats._expectedBytes += stats->_bytesExpected; tmpPartialBytes += stats->_bytesProvided; } else if ( i->state() == ProvideItem::Finished ) { _stats._finishedBytes += stats->_bytesProvided; // remember those bytes are finished in stats directly _stats._expectedBytes += stats->_bytesProvided; } } const auto now = std::chrono::steady_clock::now(); const auto sinceLast = std::chrono::duration_cast( now - _stats._lastPulseTime ); const auto lastFinB = lastPartialBytes + lastFinishedBytes; const auto currFinB = tmpPartialBytes + _stats._finishedBytes; const auto diff = currFinB - lastFinB; _stats._lastPulseTime = now; _stats._partialBytes = tmpPartialBytes; if ( sinceLast >= std::chrono::seconds(1) ) _stats._perSecondSinceLastPulse = ( diff / ( sinceLast.count() ) ); auto sinceStart = std::chrono::duration_cast( _stats._lastPulseTime - _stats._startTime ); if ( sinceStart.count() ) { const size_t diff = _stats._finishedBytes + _stats._partialBytes; _stats._perSecond = zypp::ByteCount( diff / sinceStart.count() ); } } } libzypp-17.36.5/zypp-media/ng/provide.h000066400000000000000000000206511476576476200177260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_PROVIDE_H_INCLUDED #define ZYPP_MEDIA_PROVIDE_H_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include namespace zypp { class Url; namespace media { struct CredManagerOptions; } } /*! * @TODO Fix bsc#1174011 "auth=basic ignored in some cases" for provider * We should proactively add the password to the request if basic auth is configured * and a password is available in the credentials but not in the URL. * * We should be a bit paranoid here and require that the URL has a user embedded, otherwise we go the default route * and ask the server first about the auth method * * @TODO Make sure URLs are rewritten, e.g. MediaSetAccess::rewriteUrl */ namespace zyppng { class ProvidePrivate; using AnyMap = std::unordered_map; DEFINE_PTR_TYPE(AttachedMediaInfo); /*! * RAII helper for media handles */ class ProvideMediaHandle { public: using ParentType = Provide; ProvideMediaHandle () = default; ProvideMediaHandle ( Provide &parent, AttachedMediaInfo_Ptr mediaInfoRef ); std::shared_ptr parent() const; bool isValid () const; std::string handle() const; const zypp::Url &baseUrl() const; const std::optional &localPath() const; zyppng::AttachedMediaInfo_constPtr mediaInfo() const; private: ProvideWeakRef _parent; AttachedMediaInfo_Ptr _mediaRef; }; /*! * Provide status observer object, this can be used to provide good insight into the status of the provider, its items and * all running requests. */ class ProvideStatus { public: struct Stats { std::chrono::steady_clock::time_point _startTime; std::chrono::steady_clock::time_point _lastPulseTime; uint _itemsSinceStart = 0; //< How many items have been started since Provide::start() was called uint _runningItems = 0; //< How many items are currently running zypp::ByteCount _finishedBytes; //< The number of bytes that were finished completely zypp::ByteCount _expectedBytes; //< The number of currently expected bytes zypp::ByteCount _partialBytes; //< The number of bytes of items that were already partially downloaded but the item they belong to is not finished zypp::ByteCount _perSecondSinceLastPulse; //< The download speed since the last pulse zypp::ByteCount _perSecond; //< The download speed we are currently operating with }; ProvideStatus( ProvideRef parent ); virtual ~ProvideStatus(){} virtual void provideStart (); virtual void provideDone (){} virtual void itemStart ( ProvideItem &item ){} virtual void itemDone ( ProvideItem &item ); virtual void itemFailed ( ProvideItem &item ); virtual void requestStart ( ProvideItem &item, uint32_t reqId, const zypp::Url &url, const AnyMap &extraData = {} ){} virtual void requestDone ( ProvideItem &item, uint32_t reqId, const AnyMap &extraData = {} ){} virtual void requestRedirect ( ProvideItem &item, uint32_t reqId, const zypp::Url &toUrl, const AnyMap &extraData = {} ){} virtual void requestFailed ( ProvideItem &item, uint32_t reqId, const std::exception_ptr &err, const AnyMap &requestData = {} ){} virtual void pulse ( ); const Stats &stats() const; private: Stats _stats; ProvideWeakRef _provider; }; class Provide : public Base { ZYPP_DECLARE_PRIVATE(Provide) template friend class ProvidePromise; friend class ProvideItem; friend class ProvideMediaHandle; friend class ProvideStatus; public: using MediaHandle = ProvideMediaHandle; using LazyMediaHandle = zyppng::LazyMediaHandle; using Res = ProvideRes; static ProvideRef create( const zypp::Pathname &workDir = "" ); /*! * Prepares a lazy handle, that is attached only if a actual provide() is called onto it. * Use this to delay a media attach until its used the first time */ expected prepareMedia ( const std::vector &urls, const ProvideMediaSpec &request ); expected prepareMedia ( const zypp::Url &url, const ProvideMediaSpec &request ); AsyncOpRef> attachMediaIfNeeded( LazyMediaHandle lazyHandle ); AsyncOpRef> attachMedia( const std::vector &urls, const ProvideMediaSpec &request ); AsyncOpRef> attachMedia( const zypp::Url &url, const ProvideMediaSpec &request ); AsyncOpRef> provide( const std::vector &urls, const ProvideFileSpec &request ); AsyncOpRef> provide( const zypp::Url &url, const ProvideFileSpec &request ); AsyncOpRef> provide( const MediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request ); AsyncOpRef> provide( const LazyMediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request ); /*! * Schedules a job to calculate the checksum for the given file */ AsyncOpRef> checksumForFile ( const zypp::Pathname &p, const std::string &algorithm ); /*! * Schedules a copy job to copy a file from \a source to \a target */ AsyncOpRef> copyFile ( const zypp::Pathname &source, const zypp::Pathname &target ); AsyncOpRef> copyFile ( ProvideRes &&source, const zypp::Pathname &target ); void start(); void setWorkerPath( const zypp::Pathname &path ); bool isRunning() const; bool ejectDevice ( const std::string &queueRef, const std::string &device ); void setStatusTracker( ProvideStatusRef tracker ); const zypp::Pathname &providerWorkdir () const; const zypp::media::CredManagerOptions &credManangerOptions () const; void setCredManagerOptions( const zypp::media::CredManagerOptions & opt ); SignalProxy sigIdle(); enum Action { ABORT, // abort and return error RETRY, // retry SKIP // abort and set skip request }; using MediaChangeAction = std::optional; /*! * Connect to this signal to handle media change requests * * \note It is NOT supported to shutdown the provider or cancel items when in this callback * Returning Abort here will effectively cancel the current item anyway. */ SignalProxy &devices, const std::optional &desc )> sigMediaChangeRequested( ); /*! * This signal is emitted in case a request signaled a need to get Auth Info and nothing was found * in the \ref zypp::media::CredentialManager. */ SignalProxy< std::optional ( const zypp::Url &reqUrl, const std::string &triedUsername, const std::map &extraValues ) > sigAuthRequired(); static auto copyResultToDest ( ProvideRef provider, const zypp::Pathname &targetPath ) { return [ providerRef=std::move(provider), targetPath = targetPath ]( ProvideRes &&file ){ zypp::filesystem::assert_dir( targetPath.dirname () ); return providerRef->copyFile( std::move(file), targetPath ); }; } private: Provide( const zypp::Pathname &workDir ); }; } #endif libzypp-17.36.5/zypp-media/ng/providefwd.h000066400000000000000000000023611476576476200204250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * You have been warned! * */ #ifndef ZYPP_MEDIA_PROVIDE_FWD_H_INCLUDED #define ZYPP_MEDIA_PROVIDE_FWD_H_INCLUDED #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (Provide); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProvideMediaSpec); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProvideFileSpec); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProvideItem); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProvideRequest); ZYPP_FWD_DECL_TYPE_WITH_REFS (MediaDataVerifier); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProvideStatus); class HeaderValueMap; class ProvideMediaHandle; } #endif libzypp-17.36.5/zypp-media/ng/provideitem.cc000066400000000000000000001266571476576476200207600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "private/providedbg_p.h" #include "private/provideitem_p.h" #include "private/provide_p.h" #include "private/providemessage_p.h" #include "private/provideres_p.h" #include "provide-configvars.h" #include #include #include "mediaverifier.h" #include using namespace std::literals; namespace zyppng { static constexpr std::string_view DEFAULT_MEDIA_VERIFIER("SuseMediaV1"); expected ProvideRequest::create(ProvideItem &owner, const std::vector &urls, const std::string &id, ProvideMediaSpec &spec ) { if ( urls.empty() ) return expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("List of URLs can not be empty") ) ); auto m = ProvideMessage::createAttach( ProvideQueue::InvalidId, urls.front(), id, spec.label() ); if ( !spec.mediaFile().empty() ) { m.setValue( AttachMsgFields::VerifyType, std::string(DEFAULT_MEDIA_VERIFIER.data()) ); m.setValue( AttachMsgFields::VerifyData, spec.mediaFile().asString() ); m.setValue( AttachMsgFields::MediaNr, int32_t(spec.medianr()) ); } const auto &cHeaders = spec.customHeaders(); for ( auto i = cHeaders.beginList (); i != cHeaders.endList(); i++) { for ( const auto &val : i->second ) m.addValue( i->first, val ); } return expected::success( ProvideRequestRef( new ProvideRequest(&owner, urls, std::move(m))) ); } expected ProvideRequest::create( ProvideItem &owner, const std::vector &urls, ProvideFileSpec &spec ) { if ( urls.empty() ) return expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("List of URLs can not be empty") ) ); auto m = ProvideMessage::createProvide ( ProvideQueue::InvalidId, urls.front() ); const auto &destFile = spec.destFilenameHint(); const auto &deltaFile = spec.deltafile(); const int64_t fSize = spec.downloadSize();; if ( !destFile.empty() ) m.setValue( ProvideMsgFields::Filename, destFile.asString() ); if ( !deltaFile.empty() ) m.setValue( ProvideMsgFields::DeltaFile, deltaFile.asString() ); if ( fSize ) m.setValue( ProvideMsgFields::ExpectedFilesize, fSize ); m.setValue( ProvideMsgFields::CheckExistOnly, spec.checkExistsOnly() ); const auto &cHeaders = spec.customHeaders(); for ( auto i = cHeaders.beginList (); i != cHeaders.endList(); i++) { for ( const auto &val : i->second ) m.addValue( i->first, val ); } return expected::success( ProvideRequestRef( new ProvideRequest(&owner, urls, std::move(m)) ) ); } expected ProvideRequest::createDetach( const zypp::Url &url ) { auto m = ProvideMessage::createDetach ( ProvideQueue::InvalidId , url ); return expected::success( ProvideRequestRef( new ProvideRequest( nullptr, { url }, std::move(m) ) ) ); } ZYPP_IMPL_PRIVATE(ProvideItem); ProvideItem::ProvideItem( ProvidePrivate &parent ) : Base( *new ProvideItemPrivate( parent, *this ) ) { } ProvideItem::~ProvideItem() { } ProvidePrivate &ProvideItem::provider() { return d_func()->_parent; } bool ProvideItem::safeRedirectTo( ProvideRequestRef startedReq, const zypp::Url &url ) { if ( !canRedirectTo( startedReq, url ) ) return false; redirectTo( startedReq, url ); return true; } void ProvideItem::redirectTo( ProvideRequestRef startedReq, const zypp::Url &url ) { //@TODO strip irrelevant stuff from URL startedReq->_pastRedirects.push_back ( url ); } bool ProvideItem::canRedirectTo( ProvideRequestRef startedReq, const zypp::Url &url ) { // make sure there is no redirect loop if ( !startedReq->_pastRedirects.size() ) return true; if ( std::find( startedReq->_pastRedirects.begin(), startedReq->_pastRedirects.end(), url ) != startedReq->_pastRedirects.end() ) return false; return true; } const std::optional &ProvideItem::currentStats() const { return d_func()->_currStats; } const std::optional &ProvideItem::previousStats() const { return d_func()->_prevStats; } std::chrono::steady_clock::time_point ProvideItem::startTime() const { return d_func()->_itemStarted; } std::chrono::steady_clock::time_point ProvideItem::finishedTime() const { return d_func()->_itemFinished; } void ProvideItem::pulse () { Z_D(); if ( d->_currStats ) d->_prevStats = d->_currStats; d->_currStats = makeStats(); // once the item is finished the pulse time is always the finish time if ( d->_itemState == Finished ) d->_currStats->_pulseTime = d->_itemFinished; } zypp::ByteCount ProvideItem::bytesExpected () const { return 0; } ProvideItem::ItemStats ProvideItem::makeStats () { return ItemStats { ._pulseTime = std::chrono::steady_clock::now(), ._runningRequests = _runningReq ? (uint)1 : (uint)0 }; } void ProvideItem::informalMessage ( ProvideQueue &, ProvideRequestRef req, const ProvideMessage &msg ) { if ( req != _runningReq ) { WAR << "Received event for unknown request, ignoring" << std::endl; return; } if ( msg.code() == ProvideMessage::Code::ProvideStarted ) { MIL << "Request: "<< req->url() << " was started" << std::endl; } } void ProvideItem::cacheMiss( ProvideRequestRef req ) { if ( req != _runningReq ) { WAR << "Received event for unknown request, ignoring" << std::endl; return; } MIL << "Request: "<< req->url() << " CACHE MISS, request will be restarted by queue." << std::endl; } void ProvideItem::finishReq(ProvideQueue &, ProvideRequestRef finishedReq, const ProvideMessage &msg ) { if ( finishedReq != _runningReq ) { WAR << "Received event for unknown request, ignoring" << std::endl; return; } auto log = provider().log(); // explicitely handled codes const auto code = msg.code(); if ( code == ProvideMessage::Code::Redirect ) { // remove the old request _runningReq.reset(); try { MIL << "Request finished with redirect." << std::endl; zypp::Url newUrl( msg.value( RedirectMsgFields::NewUrl ).asString() ); if ( !safeRedirectTo( finishedReq, newUrl ) ) { cancelWithError( ZYPP_EXCPT_PTR ( zypp::media::MediaException("Redirect Loop")) ); return; } MIL << "Request redirected to: " << newUrl << std::endl; if ( log ) log->requestRedirect( *this, msg.requestId(), newUrl ); finishedReq->setUrl( newUrl ); if ( !enqueueRequest( finishedReq ) ) { cancelWithError( ZYPP_EXCPT_PTR(zypp::media::MediaException("Failed to queue request")) ); } } catch ( ... ) { cancelWithError( std::current_exception() ); return; } return; } else if ( code == ProvideMessage::Code::Metalink ) { // remove the old request _runningReq.reset(); MIL << "Request finished with mirrorlist from server." << std::endl; //@TODO do we need to merge this with the mirrorlist we got from the user? // or does a mirrorlist from d.o.o invalidate that? std::vector urls; const auto &mirrors = msg.values( MetalinkRedirectMsgFields::NewUrl ); for( auto i = mirrors.cbegin(); i != mirrors.cend(); i++ ) { try { zypp::Url newUrl( i->asString() ); if ( !canRedirectTo( finishedReq, newUrl ) ) continue; urls.push_back ( newUrl ); } catch ( ... ) { if ( i->isString() ) WAR << "Received invalid URL from worker: " << i->asString() << " ignoring!" << std::endl; else WAR << "Received invalid value for newUrl from worker ignoring!" << std::endl; } } if ( urls.size () == 0 ) { cancelWithError( ZYPP_EXCPT_PTR ( zypp::media::MediaException("No mirrors left to redirect to.")) ); return; } MIL << "Found usable nr of mirrors: " << urls.size () << std::endl; finishedReq->setUrls( urls ); // disable metalink finishedReq->provideMessage().setValue( ProvideMsgFields::MetalinkEnabled, false ); if ( log ) log->requestDone( *this, msg.requestId() ); if ( !enqueueRequest( finishedReq ) ) { cancelWithError( ZYPP_EXCPT_PTR(zypp::media::MediaException("Failed to queue request")) ); } MIL << "End of mirrorlist handling"<< std::endl; return; } else if ( code >= ProvideMessage::Code::FirstClientErrCode && code <= ProvideMessage::Code::LastSrvErrCode ) { // remove the old request _runningReq.reset(); std::exception_ptr errPtr; try { const auto reqUrl = finishedReq->activeUrl().value(); const auto reason = msg.value( ErrMsgFields::Reason ).asString(); switch ( code ) { case ProvideMessage::Code::BadRequest: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException (zypp::str::Str() << "Bad request for URL: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::PeerCertificateInvalid: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException(zypp::str::Str() << "PeerCertificateInvalid Error for URL: " << reqUrl << " " << reason) ); break; case ProvideMessage::Code::ConnectionFailed: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException(zypp::str::Str() << "ConnectionFailed Error for URL: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::ExpectedSizeExceeded: { std::optional filesize; const auto &hdrs = finishedReq->provideMessage ().headers (); if ( hdrs.contains( ProvideMsgFields::ExpectedFilesize ) ) { const auto &val = hdrs.value ( ProvideMsgFields::ExpectedFilesize ); if ( val.valid() ) filesize = val.asInt64(); } if ( !filesize ) { errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "ExceededExpectedSize Error for URL: " << reqUrl << " " << reason ) ); } else { errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaFileSizeExceededException(reqUrl, *filesize ) ); } break; } case ProvideMessage::Code::Cancelled: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "Request was cancelled: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::InvalidChecksum: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "InvalidChecksum Error for URL: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::Timeout: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaTimeoutException(reqUrl) ); break; case ProvideMessage::Code::NotFound: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaFileNotFoundException(reqUrl, "") ); break; case ProvideMessage::Code::Forbidden: case ProvideMessage::Code::Unauthorized: { const auto &hintVal = msg.value( "authHint"sv ); std::string hint; if ( hintVal.valid() && hintVal.isString() ) { hint = hintVal.asString(); } //@TODO retry here with timestamp from cred store check // we let the request fail after it checked the store errPtr = ZYPP_EXCPT_PTR ( zypp::media::MediaUnauthorizedException( reqUrl, reason, "", hint )); break; } case ProvideMessage::Code::MountFailed: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "MountFailed Error for URL: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::Jammed: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaJammedException() ); break; case ProvideMessage::Code::MediaChangeSkip: errPtr = ZYPP_EXCPT_PTR( zypp::SkipRequestException ( zypp::str::Str() << "User-requested skipping for URL: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::MediaChangeAbort: errPtr = ZYPP_EXCPT_PTR( zypp::AbortRequestException( zypp::str::Str() <<"Aborting requested by user for URL: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::InternalError: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "WorkerSpecific Error for URL: " << reqUrl << " " << reason ) ); break; case ProvideMessage::Code::NotAFile: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaNotAFileException(reqUrl, "") ); break; case ProvideMessage::Code::MediumNotDesired: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaNotDesiredException(reqUrl) ); break; default: errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "Unknown Error for URL: " << reqUrl << " " << reason ) ); break; } } catch (...) { errPtr = ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "Invalid error message received for URL: " << *finishedReq->activeUrl() << " code: " << code ) ); } if ( log ) log->requestFailed( *this, msg.requestId(), errPtr ); // finish the request cancelWithError( errPtr ); return; } // if we reach here we don't know how to handle the message _runningReq.reset(); cancelWithError( ZYPP_EXCPT_PTR (zypp::media::MediaException("Unhandled message received for ProvideFileItem")) ); } void ProvideItem::finishReq(ProvideQueue *, ProvideRequestRef finishedReq , const std::exception_ptr excpt) { if ( finishedReq != _runningReq ) { WAR << "Received event for unknown request, ignoring" << std::endl; return; } if ( _runningReq ) { auto log = provider().log(); if ( log ) log->requestFailed( *this, finishedReq->provideMessage().requestId(), excpt ); } _runningReq.reset(); cancelWithError(excpt); } expected ProvideItem::authenticationRequired ( ProvideQueue &queue, ProvideRequestRef req, const zypp::Url &effectiveUrl, int64_t lastTimestamp, const std::map &extraFields ) { if ( req != _runningReq ) { WAR << "Received authenticationRequired for unknown request, rejecting" << std::endl; return expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unknown request in authenticationRequired, this is a bug.") ) ); } try { zypp::media::CredentialManager mgr ( provider().credManagerOptions() ); MIL << "Looking for existing auth data for " << effectiveUrl << "more recent then " << lastTimestamp << std::endl; auto credPtr = mgr.getCred( effectiveUrl ); if ( credPtr && credPtr->lastDatabaseUpdate() > lastTimestamp ) { MIL << "Found existing auth data for " << effectiveUrl << "ts: " << credPtr->lastDatabaseUpdate() << std::endl; return expected::success( *credPtr ); } if ( credPtr ) MIL << "Found existing auth data for " << effectiveUrl << "but too old ts: " << credPtr->lastDatabaseUpdate() << std::endl; std::string username; if ( auto i = extraFields.find( std::string(AuthDataRequestMsgFields::LastUser) ); i != extraFields.end() ) { username = i->second; } MIL << "NO Auth data found, asking user. Last tried username was: " << username << std::endl; auto userAuth = provider()._sigAuthRequired.emit( effectiveUrl, username, extraFields ); if ( !userAuth || !userAuth->valid() ) { MIL << "User rejected to give auth" << std::endl; return expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaException("No auth given by user." ) ) ); } mgr.addCred( *userAuth ); mgr.save(); // rather ugly, but update the timestamp to the last mtime of the cred database our URL belongs to // otherwise we'd need to reload the cred database userAuth->setLastDatabaseUpdate( mgr.timestampForCredDatabase( effectiveUrl ) ); return expected::success(*userAuth); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } bool ProvideItem::enqueueRequest( ProvideRequestRef request ) { // base item just supports one running request at a time if ( _runningReq ) return ( _runningReq == request ); _runningReq = request; return d_func()->_parent.queueRequest( request ); } void ProvideItem::updateState( const State newState ) { Z_D(); if ( d->_itemState != newState ) { bool started = ( d->_itemState == Uninitialized && ( newState != Finished )); auto log = provider().log(); const auto oldState = d->_itemState; d->_itemState = newState; d->_sigStateChanged( *this, oldState, d->_itemState ); if ( started ) { d->_itemStarted = std::chrono::steady_clock::now(); pulse(); if ( log ) log->itemStart( *this ); } if ( newState == Finished ) { d->_itemFinished = std::chrono::steady_clock::now(); pulse(); if ( log) log->itemDone( *this ); d->_parent.dequeueItem(this); } // CAREFUL, 'this' might be invalid from here on } } void ProvideItem::released() { if ( state() == Finished || state() == Finalizing ) return; MIL << "Item Cleanup due to released Promise in state:" << state() << std::endl; cancelWithError( ZYPP_EXCPT_PTR(zypp::media::MediaException("Cancelled by user.")) ); } ProvideItem::State ProvideItem::state () const { return d_func()->_itemState; } void ProvideRequest::setCurrentQueue( ProvideQueueRef ref ) { _myQueue = ref; } ProvideQueueRef ProvideRequest::currentQueue() { return _myQueue.lock(); } const std::optional ProvideRequest::activeUrl() const { ProvideMessage::FieldVal url; switch ( this->_message.code () ) { case ProvideMessage::Code::Attach: url = _message.value( AttachMsgFields::Url ); break; case ProvideMessage::Code::Detach: url = _message.value( DetachMsgFields::Url ); break; case ProvideMessage::Code::Prov: url = _message.value( ProvideMsgFields::Url ); break; default: // should never happen because we guard the constructor throw std::logic_error("Invalid message type in ProvideRequest"); } if ( !url.valid() ) { return {}; } try { auto u = zypp::Url( url.asString() ); return u; } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); } return {}; } void ProvideRequest::setActiveUrl(const zypp::Url &urlToUse) { switch ( this->_message.code () ) { case ProvideMessage::Code::Attach: this->_message.setValue( AttachMsgFields::Url, urlToUse.asCompleteString() ); break; case ProvideMessage::Code::Detach: this->_message.setValue( DetachMsgFields::Url, urlToUse.asCompleteString() ); break; case ProvideMessage::Code::Prov: this->_message.setValue( ProvideMsgFields::Url, urlToUse.asCompleteString() ); break; default: // should never happen because we guard the constructor throw std::logic_error("Invalid message type in ProvideRequest"); } } ProvideFileItem::ProvideFileItem(const std::vector &urls, const ProvideFileSpec &request, ProvidePrivate &parent) : ProvideItem( parent ) , _mirrorList ( urls ) , _initialSpec ( request ) { } ProvideFileItemRef ProvideFileItem::create(const std::vector &urls, const ProvideFileSpec &request, ProvidePrivate &parent ) { return ProvideFileItemRef( new ProvideFileItem( urls, request, parent ) ); } void ProvideFileItem::initialize() { if ( state() != Uninitialized || _runningReq ) { WAR << "Double init of ProvideFileItem!" << std::endl; return; } auto req = ProvideRequest::create( *this, _mirrorList, _initialSpec ); if ( !req ){ cancelWithError( req.error() ); return ; } if ( enqueueRequest( *req ) ) { _expectedBytes = _initialSpec.downloadSize(); updateState( Pending ); } else { cancelWithError( ZYPP_EXCPT_PTR(zypp::media::MediaException("Failed to queue request")) ); return ; } } ProvidePromiseRef ProvideFileItem::promise() { if ( !_promiseCreated ) { _promiseCreated = true; auto promiseRef = std::make_shared>( shared_this() ); _promise = promiseRef; return promiseRef; } return _promise.lock(); } void ProvideFileItem::setMediaRef ( Provide::MediaHandle &&hdl ) { _handleRef = std::move(hdl); } Provide::MediaHandle &ProvideFileItem::mediaRef () { return _handleRef; } void ProvideFileItem::informalMessage ( ProvideQueue &, ProvideRequestRef req, const ProvideMessage &msg ) { if ( req != _runningReq ) { WAR << "Received event for unknown request, ignoring" << std::endl; return; } if ( msg.code() == ProvideMessage::Code::ProvideStarted ) { MIL << "Provide File Request: "<< req->url() << " was started" << std::endl; auto log = provider().log(); auto locPath = msg.value( ProvideStartedMsgFields::LocalFilename, std::string() ).asString(); if ( !locPath.empty() ) _targetFile = zypp::Pathname(locPath); locPath = msg.value( ProvideStartedMsgFields::StagingFilename, std::string() ).asString(); if ( !locPath.empty() ) _stagingFile = zypp::Pathname(locPath); if ( log ) { auto effUrl = req->activeUrl().value_or( zypp::Url() ); try { effUrl = zypp::Url( msg.value( ProvideStartedMsgFields::Url).asString() ); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT(e); } AnyMap m; m["spec"] = _initialSpec; if ( log ) log->requestStart( *this, msg.requestId(), effUrl, m ); updateState( Downloading ); } } } void zyppng::ProvideFileItem::ProvideFileItem::finishReq( zyppng::ProvideQueue &queue, ProvideRequestRef finishedReq, const ProvideMessage &msg ) { if ( finishedReq != _runningReq ) { WAR << "Received event for unknown request, ignoring" << std::endl; return; } if ( msg.code () == ProvideMessage::Code::ProvideFinished ) { auto log = provider().log(); if ( log ) { AnyMap m; m["spec"] = _initialSpec; if ( log ) log->requestDone( *this, msg.requestId(), m ); } MIL << "Request was successfully finished!" << std::endl; // request is def done _runningReq.reset(); std::optional resFile; try { const auto locFilename = msg.value( ProvideFinishedMsgFields::LocalFilename ).asString(); const auto cacheHit = msg.value( ProvideFinishedMsgFields::CacheHit ).asBool(); const auto &wConf = queue.workerConfig(); const bool checkExistsOnly = _initialSpec.checkExistsOnly(); const bool doesDownload = wConf.worker_type() == ProvideQueue::Config::Downloading; const bool fileNeedsCleanup = doesDownload || ( wConf.worker_type() == ProvideQueue::Config::CPUBound && wConf.cfg_flags() & ProvideQueue::Config::FileArtifacts ); if ( doesDownload && !checkExistsOnly ) { resFile = provider().addToFileCache ( locFilename ); if ( !resFile ) { if ( cacheHit ) { MIL << "CACHE MISS, file " << locFilename << " was already removed, queueing again" << std::endl; cacheMiss ( finishedReq ); finishedReq->clearForRestart(); enqueueRequest( finishedReq ); return; } else { // if we reach here it seems that a new file, that was not in cache before, vanished between // providing it and receiving the finished message. // unlikely this can happen but better be safe than sorry cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaException("File vanished between downloading and adding it to cache.")) ); return; } } } else { resFile = zypp::ManagedFile( zypp::filesystem::Pathname(locFilename) ); if ( fileNeedsCleanup && !checkExistsOnly ) resFile->setDispose( zypp::filesystem::unlink ); else resFile->resetDispose(); } _targetFile = locFilename; } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); cancelWithError( std::current_exception() ); } catch ( const std::exception &e ) { ZYPP_CAUGHT(e); cancelWithError( std::current_exception() ); } catch ( ...) { cancelWithError( std::current_exception() ); } // keep the media handle around as long as the file is used by the code auto resObj = std::make_shared(); resObj->_mediaHandle = this->_handleRef; resObj->_myFile = *resFile; resObj->_resourceUrl = *(finishedReq->activeUrl()); resObj->_responseHeaders = msg.headers(); // if there is a exception escaping the pipeline we need to rethrow it after cleaning up std::exception_ptr excpt; auto p = promise(); if ( p ) { try { p->setReady( expected::success( ProvideRes( resObj )) ); } catch( const zypp::Exception &e ) { ERR << "Caught unhandled pipline exception:" << e << std::endl; ZYPP_CAUGHT(e); excpt = std::current_exception (); } catch ( const std::exception &e ) { ERR << "Caught unhandled pipline exception:" << e.what() << std::endl; ZYPP_CAUGHT(e); excpt = std::current_exception (); } catch ( ...) { ERR << "Caught unhandled unknown exception:" << std::endl; excpt = std::current_exception (); } } updateState( Finished ); if ( excpt ) { ERR << "Rethrowing pipeline exception, this is a BUG!" << std::endl; std::rethrow_exception ( excpt ); } } else { ProvideItem::finishReq ( queue, finishedReq, msg ); } } void zyppng::ProvideFileItem::cancelWithError( std::exception_ptr error ) { if ( _runningReq ) { auto weakThis = weak_from_this (); provider().dequeueRequest ( _runningReq, error ); if ( weakThis.expired () ) return; } // if we reach this place for some reason finishReq was not called, lets clean up manually _runningReq.reset(); auto p = promise(); if ( p ) { try { p->setReady( expected::error( error ) ); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT(e); } } updateState( Finished ); } expected ProvideFileItem::authenticationRequired ( ProvideQueue &queue, ProvideRequestRef req, const zypp::Url &effectiveUrl, int64_t lastTimestamp, const std::map &extraFields ) { zypp::Url urlToUse = effectiveUrl; if ( _handleRef.isValid() ) { // if we have a attached medium this overrules the URL we are going to ask the user about... this is how the old media backend did handle this // i guess there were never password protected repositories that have different credentials on the redirection targets auto &attachedMedia = provider().attachedMediaInfos(); if ( std::find( attachedMedia.begin(), attachedMedia.end(), _handleRef.mediaInfo() ) == attachedMedia.end() ) return expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaException("Attachment handle vanished during request.") ) ); urlToUse = _handleRef.mediaInfo()->_attachedUrl; } return ProvideItem::authenticationRequired( queue, req, urlToUse, lastTimestamp, extraFields ); } ProvideFileItem::ItemStats ProvideFileItem::makeStats () { zypp::ByteCount providedByNow; bool checkStaging = false; if ( !_targetFile.empty() ) { zypp::PathInfo inf( _targetFile ); if ( inf.isExist() && inf.isFile() ) providedByNow = zypp::ByteCount( inf.size() ); else checkStaging = true; } if ( checkStaging && !_stagingFile.empty() ) { zypp::PathInfo inf( _stagingFile ); if ( inf.isExist() && inf.isFile() ) providedByNow = zypp::ByteCount( inf.size() ); } auto baseStats = ProvideItem::makeStats(); baseStats._bytesExpected = bytesExpected(); baseStats._bytesProvided = providedByNow; return baseStats; } zypp::ByteCount ProvideFileItem::bytesExpected () const { return (_initialSpec.checkExistsOnly() ? zypp::ByteCount(0) : _expectedBytes); } AttachMediaItem::AttachMediaItem( const std::vector &urls, const ProvideMediaSpec &request, ProvidePrivate &parent ) : ProvideItem ( parent ) , _mirrorList ( urls ) , _initialSpec ( request ) { } AttachMediaItem::~AttachMediaItem() { MIL << "Killing the AttachMediaItem" << std::endl; } ProvidePromiseRef AttachMediaItem::promise() { if ( !_promiseCreated ) { _promiseCreated = true; auto promiseRef = std::make_shared>( shared_this() ); _promise = promiseRef; return promiseRef; } return _promise.lock(); } void AttachMediaItem::initialize() { if ( state() != Uninitialized ) { WAR << "Double init of AttachMediaItem!" << std::endl; return; } updateState(Processing); if ( _mirrorList.empty() ) { cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaException("No usable mirrors in mirrorlist.")) ); return; } // shortcut to the provider instance auto &prov= provider(); // sanitize the mirrors to contain only URLs that have same worker types std::vector usableMirrs; std::optional scheme; for ( auto mirrIt = _mirrorList.begin() ; mirrIt != _mirrorList.end(); mirrIt++ ) { const auto &s = prov.schemeConfig( prov.effectiveScheme( mirrIt->getScheme() ) ); if ( !s ) { WAR << "URL: " << *mirrIt << " is not supported, ignoring!" << std::endl; continue; } if ( !scheme ) { scheme = *s; usableMirrs.push_back ( *mirrIt ); } else { if ( scheme->worker_type () == s->worker_type () ) { usableMirrs.push_back( *mirrIt ); } else { WAR << "URL: " << *mirrIt << " has different worker type than the primary URL: "<< usableMirrs.front() <<", ignoring!" << std::endl; } } } // save the sanitized mirrors _mirrorList = usableMirrs; if ( !scheme || _mirrorList.empty() ) { auto prom = promise(); if ( prom ) { try { prom->setReady( expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("No valid mirrors available") )) ); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT(e); } } updateState( Finished ); return; } // first check if there is a already attached medium we can use as well auto &attachedMedia = prov.attachedMediaInfos (); for ( auto &medium : attachedMedia ) { if ( medium->isSameMedium ( _mirrorList, _initialSpec ) ) { finishWithSuccess ( medium ); return; } } for ( auto &otherItem : prov.items() ) { auto attachIt = std::dynamic_pointer_cast(otherItem); if ( !attachIt // not the right type || attachIt.get() == this // do not attach to ourselves || attachIt->state () == Uninitialized // item was not initialized || attachIt->state () == Finalizing // item cleaning up || attachIt->state () == Finished ) // item done continue; // does this Item attach the same medium? const auto sameMedium = attachIt->_initialSpec.isSameMedium( _initialSpec); if ( zypp::indeterminate(sameMedium) ) { // check the primary URLs ( should we do a full list compare? ) if ( attachIt->_mirrorList.front() != _mirrorList.front() ) continue; } else if ( !(bool)sameMedium ) continue; MIL << "Found item providing the same medium, attaching to finished signal and waiting for it to be finished" << std::endl; // it does, connect to its ready signal and just wait _masterItemConn = connect( *attachIt, &AttachMediaItem::sigReady, *this, &AttachMediaItem::onMasterItemReady ); return; } _workerType = scheme->worker_type(); switch( _workerType ) { case ProvideQueue::Config::Downloading: { // if the media file is empty in the spec we can not do anything // simply pretend attach worked if( _initialSpec.mediaFile().empty() ) { finishWithSuccess( prov.addMedium( zypp::make_intrusive( provider().nextMediaId(), _workerType, _mirrorList.front(), _initialSpec ) ) ); return; } // prepare the verifier with the data auto smvDataLocal = MediaDataVerifier::createVerifier("SuseMediaV1"); if ( !smvDataLocal ) { cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unable to verify the medium, no verifier instance was returned.")) ); return; } if ( !smvDataLocal->load( _initialSpec.mediaFile() ) ) { cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unable to verify the medium, unable to load local verify data.")) ); return; } _verifier = smvDataLocal; std::vector urls; urls.reserve( _mirrorList.size () ); for ( zypp::Url url : _mirrorList ) { url.appendPathName ( ( zypp::str::Format("/media.%d/media") % _initialSpec.medianr() ).asString() ); urls.push_back(url); } // for downloading schemes we ask for the /media.x/media file and check the data manually ProvideFileSpec spec; spec.customHeaders() = _initialSpec.customHeaders(); // disable metalink spec.customHeaders().set( std::string(NETWORK_METALINK_ENABLED), false ); auto req = ProvideRequest::create( *this, urls, spec ); if ( !req ) { cancelWithError( req.error() ); return; } if ( !enqueueRequest( *req ) ) { cancelWithError( ZYPP_EXCPT_PTR(zypp::media::MediaException("Failed to queue request")) ); return; } updateState ( Downloading ); break; } case ProvideQueue::Config::VolatileMount: case ProvideQueue::Config::SimpleMount: { const auto &newId = provider().nextMediaId(); auto req = ProvideRequest::create( *this, _mirrorList, newId, _initialSpec ); if ( !req ) { cancelWithError( req.error() ); return; } if ( !enqueueRequest( *req ) ) { ERR << "Failed to queue request" << std::endl; cancelWithError( ZYPP_EXCPT_PTR(zypp::media::MediaException("Failed to queue request")) ); return; } break; } default: { auto prom = promise(); if ( prom ) { try { prom->setReady( expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("URL scheme does not support attaching.") )) ); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT(e); } } updateState( Finished ); return; } } } void AttachMediaItem::finishWithSuccess( AttachedMediaInfo_Ptr medium ) { updateState(Finalizing); auto prom = promise(); try { if ( prom ) { try { prom->setReady( expected::success( Provide::MediaHandle( *static_cast( provider().z_func() ), medium ) ) ); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT(e); } } } catch ( const std::exception &e ) { ERR << "WTF " << e.what () << std::endl; } catch ( ... ) { ERR << "WTF " << std::endl; } // tell others as well _sigReady.emit( zyppng::expected::success(medium.get()) ); prom->isReady (); MIL << "Before setFinished" << std::endl; updateState( Finished ); return; } void AttachMediaItem::cancelWithError( std::exception_ptr error ) { MIL << "Cancelling Item with error" << std::endl; updateState(Finalizing); // tell children _sigReady.emit( expected::error(error) ); if ( _runningReq ) { // we might get deleted when calling dequeueRequest auto weakThis = weak_from_this (); provider().dequeueRequest ( _runningReq, error ); if ( weakThis.expired () ) return; } // if we reach this place we had no runningReq, clean up manually _runningReq.reset(); _masterItemConn.disconnect(); auto p = promise(); if ( p ) { try { p->setReady( expected::error( error ) ); } catch( const zypp::Exception &e ) { ZYPP_CAUGHT(e); } } updateState( Finished ); } void AttachMediaItem::onMasterItemReady( const zyppng::expected &result ) { _masterItemConn.disconnect(); if ( result ) { finishWithSuccess( AttachedMediaInfo_Ptr(result.get()) ); } else { try { std::rethrow_exception ( result.error() ); } catch ( const zypp::media::MediaRequestCancelledException & e) { // in case a item was cancelled, we revert to Pending state and trigger the scheduler. // This will make sure that all our sibilings that also depend on the master // can revert to pending state and we only get one new master in the next schedule run MIL_PRV << "Master item was cancelled, reverting to Uninitialized state and waiting for scheduler to run again" << std::endl; updateState (Uninitialized); provider().schedule( ProvidePrivate::RestartAttach ); } catch ( ... ) { cancelWithError( std::current_exception() ); } } } AttachMediaItemRef AttachMediaItem::create( const std::vector &urls, const ProvideMediaSpec &request, ProvidePrivate &parent ) { return AttachMediaItemRef( new AttachMediaItem(urls, request, parent) ); } SignalProxy &)> AttachMediaItem::sigReady() { return _sigReady; } void AttachMediaItem::finishReq ( ProvideQueue &queue, ProvideRequestRef finishedReq, const ProvideMessage &msg ) { if ( finishedReq != _runningReq ) { WAR << "Received event for unknown request, ignoring" << std::endl; return; } if( _workerType == ProvideQueue::Config::Downloading ) { // success if ( msg.code() == ProvideMessage::Code::ProvideFinished ) { updateState(Finalizing); zypp::Url baseUrl = *finishedReq->activeUrl(); // remove /media.n/media baseUrl.setPathName( zypp::Pathname(baseUrl.getPathName()).dirname().dirname() ); // we got the file, lets parse it auto smvDataRemote = MediaDataVerifier::createVerifier("SuseMediaV1"); if ( !smvDataRemote ) { return cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unable to verify the medium, no verifier instance was returned.")) ); } if ( !smvDataRemote->load( msg.value( ProvideFinishedMsgFields::LocalFilename ).asString() ) ) { return cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unable to verify the medium, unable to load remote verify data.")) ); } // check if we got a valid media file if ( !smvDataRemote->valid () ) { return cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unable to verify the medium, unable to load local verify data.")) ); } // check if the received file matches with the one we have in the spec if (! _verifier->matches( smvDataRemote ) ) { DBG << "expect: " << _verifier << " medium " << _initialSpec.medianr() << std::endl; DBG << "remote: " << smvDataRemote << std::endl; return cancelWithError( ZYPP_EXCPT_PTR( zypp::media::MediaNotDesiredException( *finishedReq->activeUrl() ) ) ); } // all good, register the medium and tell all child items _runningReq.reset(); return finishWithSuccess( provider().addMedium( zypp::make_intrusive( provider().nextMediaId(), _workerType, baseUrl, _initialSpec) ) ); } else if ( msg.code() == ProvideMessage::Code::NotFound ) { // simple downloading attachment we need to check the media file contents // in case of a error we might tolerate a file not found error in certain situations if ( _verifier->totalMedia () == 1 ) { // relaxed , tolerate a vanished media file _runningReq.reset(); return finishWithSuccess( provider().addMedium( zypp::make_intrusive( provider().nextMediaId(), _workerType, _mirrorList.front(), _initialSpec ) ) ); } else { return ProvideItem::finishReq ( queue, finishedReq, msg ); } } else { return ProvideItem::finishReq ( queue, finishedReq, msg ); } } else { // real device attach if ( msg.code() == ProvideMessage::Code::AttachFinished ) { std::optional mntPoint; auto mountPtVal = msg.value( zyppng::AttachFinishedMsgFields::LocalMountPoint ); if ( mountPtVal.valid() && mountPtVal.isString() ) { mntPoint = zypp::Pathname(mountPtVal.asString()); } _runningReq.reset(); return finishWithSuccess( provider().addMedium( zypp::make_intrusive( finishedReq->provideMessage().value( AttachMsgFields::AttachId ).asString() , queue.weak_this() , _workerType , *finishedReq->activeUrl() , _initialSpec , mntPoint ) ) ); } } // unhandled message , let the base impl do it return ProvideItem::finishReq ( queue, finishedReq, msg ); } expected AttachMediaItem::authenticationRequired ( ProvideQueue &queue, ProvideRequestRef req, const zypp::Url &effectiveUrl, int64_t lastTimestamp, const std::map &extraFields ) { zypp::Url baseUrl = effectiveUrl; if( _workerType == ProvideQueue::Config::Downloading ) { // remove /media.n/media baseUrl.setPathName( zypp::Pathname(baseUrl.getPathName()).dirname().dirname() ); } return ProvideItem::authenticationRequired( queue, req, baseUrl, lastTimestamp, extraFields ); } } libzypp-17.36.5/zypp-media/ng/provideitem.h000066400000000000000000000164231476576476200206070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_PROVIDEITEM_H_INCLUDED #define ZYPP_MEDIA_PROVIDEITEM_H_INCLUDED #include #include #include #include namespace zyppng { class ProvidePrivate; class ProvideItemPrivate; /*! * Represents a operation added to the provide queue by the user code. A "user" operation can have multiple * steps of downloading and processing one or multiple files. Even though this class is in public API space it's * not possible to implement custom Items since more internal API would be required for it. It is only public to * support the \ref ProvideStatus class, so it can query details of a Item. */ class ProvideItem : public Base { ZYPP_DECLARE_PRIVATE(ProvideItem) friend class Provide; friend class ProvidePrivate; friend class ProvideQueue; public: enum State { Uninitialized, //< Item was added to the queue but not yet initialized Pending, //< The Item is waiting to be queued and does nothing Downloading, //< The Item is fetching data Processing, //< The Item has fetched all data but is still doing other things Cancelling, //< The Item was cancelled and waits Finalizing, //< The Item has finished all work and is currently cleaning up Finished //< The Item is done and can be dequeued }; struct ItemStats { std::chrono::steady_clock::time_point _pulseTime; uint _runningRequests; zypp::ByteCount _bytesProvided; zypp::ByteCount _bytesExpected; }; ProvideItem( ProvidePrivate &parent ); ~ProvideItem (); /*! * Called by the controller when the item is supposed to start fetching / processing */ virtual void initialize () = 0; /*! * Called when the promise reference is released by the user process, cancel all running requests if there are any and clean up */ virtual void released (); State state () const; /*! * Signal that is emitted when the state of the Item has changed */ SignalProxy sigStateChanged(); ProvidePrivate &provider(); /*! * Returns true if a redirect is allowed and does not conflict with previous redirects. * Otherwise false is returned. This does not remember the passed URL as a redirect */ virtual bool canRedirectTo ( ProvideRequestRef startedReq, const zypp::Url &url ); /*! * Returns the item statistics that were collected the last time pulse() was called on the item. * If the item has not been started yet, this returns a empty optional */ const std::optional ¤tStats() const; /*! * Returns the item statistics that were collected the previous time pulse() was called on the item. * \note The item needs to be started and pulse() needs to be called at least once for this func to return something */ const std::optional &previousStats() const; /*! * Returns the time point when the item started to process/download. * If the item has not started yet, this returns epoch */ virtual std::chrono::steady_clock::time_point startTime() const; /*! * Returns the time point when the item was finished. * If the item was not finished yet, this returns epoch */ virtual std::chrono::steady_clock::time_point finishedTime() const; /*! * Updates the item statistics, this is called automatically by the \ref Provide instance and usually does not * need to be called explicitely by usercode. */ void pulse (); /*! * Returns the bytes the item expects to provide, the default impl returns 0 */ virtual zypp::ByteCount bytesExpected () const; protected: virtual ItemStats makeStats (); /*! * Request received a informal message, e.g. ProvideStarted */ virtual void informalMessage ( ProvideQueue &, ProvideRequestRef req, const ProvideMessage &msg ); /*! * Request had a cache miss and will be queued again, forget all about the request */ virtual void cacheMiss ( ProvideRequestRef req ); /*! * Request was finished by the queue * Base implementation handles redirect, metalink and error messages. If a different message is * received, \ref cancelWithError is called. * * A subclass has to overload this function to handle success messages */ virtual void finishReq ( ProvideQueue &queue, ProvideRequestRef finishedReq, const ProvideMessage &msg ); /*! * Request was finished with a error * The base implementation simply calls \ref cancelWithError * * \note \a queue is allowed to be a nullptr here */ virtual void finishReq ( ProvideQueue *queue, ProvideRequestRef finishedReq, const std::exception_ptr excpt ); /*! * Request needs authentication data, the function is supposed to return the AuthData to use for the response, or an error * The default implementation simply uses the given URL to look for a Auth match in the \ref zypp::media::CredentialManager. */ virtual expected authenticationRequired ( ProvideQueue &queue, ProvideRequestRef req, const zypp::Url &effectiveUrl, int64_t lastTimestamp, const std::map &extraFields ); /*! * Remembers previous redirects and returns false if the URL was encountered before, use this * to prevent the item getting caught in a redirect loop */ bool safeRedirectTo ( ProvideRequestRef startedReq, const zypp::Url &url ); /*! * Similar to \ref safeRedirectTo, but does not check if a URL was already used by this Request before. */ void redirectTo ( ProvideRequestRef startedReq, const zypp::Url &url ); /*! * Enqueue the request in the correct queue, the item implementation is supposed to hold its own * reference to all started requests, the base implementation just keeps track of 1 request at a time. */ virtual bool enqueueRequest( ProvideRequestRef request ); /*! * Cancels all running requests and immediately moves to error state */ virtual void cancelWithError ( std::exception_ptr error ) = 0; /*! * Dequeue this item and stop all requests in queues running * Call this when the item is cancelled or finished. */ bool dequeue (); /*! * Call this when the state of the item changes. * * \note calling updateState with state \ref Finished will potentially delete the Item instance */ void updateState( const State newState ); void setFinished (); protected: ProvideRequestRef _runningReq; }; } #endif // ZYPP_MEDIA_PROVIDEITEM_H_INCLUDED libzypp-17.36.5/zypp-media/ng/providemessage.cc000066400000000000000000000674671476576476200214510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "private/providemessage_p.h" #include "zypp-core/zyppng/rpc/stompframestream.h" #include #include #include namespace zyppng { zyppng::expected ProviderConfiguration::toStompMessage() const { auto frame = rpc::prepareFrame(); for ( const auto &v : *this ) { frame.addHeader( v.first, v.second ); } return zyppng::expected::success( std::move(frame) ); } zyppng::expected ProviderConfiguration::fromStompMessage(const zypp::PluginFrame &msg) { try { if ( msg.command() != ProviderConfiguration::typeName ) ZYPP_THROW( InvalidMessageReceivedException("Message is not of type ProviderConfiguration") ); ProviderConfiguration res; for ( auto i = msg.headerBegin (); i != msg.headerEnd(); i++ ) { res.insert_or_assign ( i->first, i->second ); } return zyppng::expected::success ( std::move(res) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } /*! * Worker Capabilities , sent by the workers to the provider */ WorkerCaps::WorkerCaps() { } WorkerCaps::~WorkerCaps() { } uint32_t WorkerCaps::protocol_version() const { return _protocolVersion; } WorkerCaps::WorkerType WorkerCaps::worker_type() const { return static_cast(_workerType); } WorkerCaps::Flags WorkerCaps::cfg_flags() const { return static_cast(_cfgFlags); } const std::string &WorkerCaps::worker_name() const { return _workerName; } void WorkerCaps::set_protocol_version(uint32_t v) { _protocolVersion = v; } void WorkerCaps::set_worker_type(WorkerType t) { _workerType = t; } void WorkerCaps::set_cfg_flags(Flags f) { _cfgFlags = f; } void WorkerCaps::set_worker_name(std::string name) { _workerName = std::move(name); } zyppng::expected WorkerCaps::toStompMessage() const { try { zypp::PluginFrame pf = zyppng::rpc::prepareFrame(); pf.addHeader ( "protocolVersion", zypp::str::asString (_protocolVersion) ); pf.addHeader ( "workerType" , zypp::str::asString (_workerType) ); pf.addHeader ( "cfgFlags" , zypp::str::asString (_cfgFlags) ); pf.addHeader ( "workerName" , zypp::str::asString (_workerName) ); return zyppng::expected::success ( std::move(pf) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } zyppng::expected WorkerCaps::fromStompMessage(const zypp::PluginFrame &msg) { try { if ( msg.command() != WorkerCaps::typeName ) ZYPP_THROW( InvalidMessageReceivedException("Message is not of type WorkerCaps") ); WorkerCaps res; zyppng::rpc::parseHeaderIntoField( msg, "protocolVersion", res._protocolVersion ); zyppng::rpc::parseHeaderIntoField( msg, "workerType", res._workerType ); zyppng::rpc::parseHeaderIntoField( msg, "cfgFlags", res._cfgFlags ); zyppng::rpc::parseHeaderIntoField( msg, "workerName", res._workerName ); return zyppng::expected::success ( std::move(res) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT (e); return zyppng::expected::error( ZYPP_EXCPT_PTR(e) ); } } template static zyppng::expected doParseField( const std::string &val, ProvideMessage &t, std::string_view msgtype, std::string_view name ) { try { T tVal; // the target value type zyppng::rpc::parseDataIntoField ( val, tVal ); t.addValue( name, std::move(tVal) ); return zyppng::expected::success(); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); return zyppng::expected::error( ZYPP_EXCPT_PTR( InvalidMessageReceivedException( zypp::str::Str() << "Parse error " << msgtype << ", Field " << name << " has invalid type" ) ) ); } } ProvideMessage::ProvideMessage() { } expected ProvideMessage::create(const zypp::PluginFrame &msg) { if ( msg.command() != ProvideMessage::typeName ) { return zyppng::expected::error( ZYPP_EXCPT_PTR( InvalidMessageReceivedException("Message is not of type WorkerCaps") ) ); } const std::string &codeStr = msg.getHeaderNT( std::string(ProvideMessageFields::RequestCode) ); if ( codeStr.empty () ) { return zyppng::expected::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException("Invalid message, PluginFrame has no requestId header.")) ); } const auto c = zyppng::str::safe_strtonum( codeStr ).value_or ( NoCode ); const auto validCode = ( c >= ProvideMessage::Code::FirstInformalCode && c <= ProvideMessage::Code::LastInformalCode ) || ( c >= ProvideMessage::Code::FirstSuccessCode && c <= ProvideMessage::Code::LastSuccessCode ) || ( c >= ProvideMessage::Code::FirstRedirCode && c <= ProvideMessage::Code::LastRedirCode ) || ( c >= ProvideMessage::Code::FirstClientErrCode && c <= ProvideMessage::Code::LastClientErrCode ) || ( c >= ProvideMessage::Code::FirstSrvErrCode && c <= ProvideMessage::Code::LastSrvErrCode ) || ( c >= ProvideMessage::Code::FirstControllerCode && c <= ProvideMessage::Code::LastControllerCode) || ( c >= ProvideMessage::Code::FirstWorkerCode && c <= ProvideMessage::Code::LastWorkerCode ); if ( !validCode ) { return zyppng::expected::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException("Invalid code in PluginFrame")) ); } const std::string & idStr = msg.getHeaderNT( std::string(ProvideMessageFields::RequestId) ); if ( idStr.empty () ) { return zyppng::expected::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException("Invalid message, PluginFrame has no requestId header.")) ); } const auto &maybeId = zyppng::str::safe_strtonum( idStr ); if ( !maybeId ) { return zyppng::expected::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException("Invalid message, can not parse requestId header.")) ); } ProvideMessage pMessage; pMessage.setCode ( static_cast(c) ); pMessage.setRequestId ( *maybeId ); #define DEF_REQ_FIELD( fname ) bool has_##fname = false #define PARSE_FIELD( msgtype, fname, ftype, _C_ ) \ if ( name == #fname ) { \ const auto &res = doParseField( val, pMessage, #msgtype, #fname ); \ if ( !res ) { \ return zyppng::expected::error(res.error()); \ } \ _C_ \ } #define HANDLE_UNKNOWN_FIELD( fname, val ) { \ pMessage.addValue( fname, val ); \ } #define OR_HANDLE_UNKNOWN_FIELD( fname, val ) else HANDLE_UNKNOWN_FIELD( fname, val ) #define BEGIN_PARSE_HEADERS \ for ( const auto &header : msg.headerList() ) { \ const auto &name = header.first; \ const auto &val = header.second; #define END_PARSE_HEADERS } #define PARSE_REQ_FIELD( msgtype, fname, ftype ) PARSE_FIELD( msgtype, fname, ftype, has_##fname = true; ) #define OR_PARSE_REQ_FIELD( msgtype, fname, ftype ) else PARSE_REQ_FIELD( msgtype, fname, ftype ) #define PARSE_OPT_FIELD( msgtype, fname, ftype ) PARSE_FIELD( msgtype, fname, ftype, ) #define OR_PARSE_OPT_FIELD( msgtype, fname, ftype ) else PARSE_OPT_FIELD( msgtype, fname, ftype ) #define FAIL_IF_NOT_SEEN_REQ_FIELD( msgtype, fname ) \ if ( !has_##fname ) \ return expected::error( ZYPP_EXCPT_PTR( InvalidMessageReceivedException( zypp::str::Str() << #msgtype <<" message does not contain required " << #fname << " field" ) ) ) auto validateErrorMsg = [&]( const auto &msg ){ DEF_REQ_FIELD(reason); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( Error, reason, std::string ) OR_PARSE_OPT_FIELD ( Error, history, std::string ) OR_PARSE_OPT_FIELD ( Error, transient, bool ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( Error, reason ); return expected::success( std::move(pMessage) ); }; switch ( c ) { case ProvideMessage::Code::ProvideStarted: { DEF_REQ_FIELD(url); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( ProvideStarted, url, std::string ) OR_PARSE_OPT_FIELD ( ProvideStarted, local_filename, std::string ) OR_PARSE_OPT_FIELD ( ProvideStarted, staging_filename, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( ProvideStarted, url ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::ProvideFinished: { DEF_REQ_FIELD(cacheHit); DEF_REQ_FIELD(local_filename); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( ProvideFinished, cacheHit, bool ) OR_PARSE_REQ_FIELD ( ProvideFinished, local_filename, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( ProvideFinished, cacheHit ); FAIL_IF_NOT_SEEN_REQ_FIELD( ProvideFinished, local_filename ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::AttachFinished: { BEGIN_PARSE_HEADERS PARSE_OPT_FIELD ( AttachFinished, local_mountpoint, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::DetachFinished: { // no known fields BEGIN_PARSE_HEADERS HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::AuthInfo: { DEF_REQ_FIELD(username); DEF_REQ_FIELD(password); DEF_REQ_FIELD(auth_timestamp); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( AuthInfo, username, std::string ) OR_PARSE_REQ_FIELD ( AuthInfo, password, std::string ) OR_PARSE_REQ_FIELD ( AuthInfo, auth_timestamp, int64_t ) OR_PARSE_OPT_FIELD ( AuthInfo, authType, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( ProvideStarted, username ); FAIL_IF_NOT_SEEN_REQ_FIELD( ProvideStarted, password ); FAIL_IF_NOT_SEEN_REQ_FIELD( ProvideStarted, auth_timestamp ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::MediaChanged: // no known fields BEGIN_PARSE_HEADERS HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS return expected::success( std::move(pMessage) ); case ProvideMessage::Code::Redirect: { DEF_REQ_FIELD(new_url); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( Redirect, new_url, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( Redirect, new_url ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::Metalink: { DEF_REQ_FIELD(new_url); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( Metalink, new_url, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( Metalink, new_url ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::BadRequest: case ProvideMessage::Code::Unauthorized: case ProvideMessage::Code::Forbidden: case ProvideMessage::Code::PeerCertificateInvalid: case ProvideMessage::Code::NotFound: case ProvideMessage::Code::ExpectedSizeExceeded: case ProvideMessage::Code::ConnectionFailed: case ProvideMessage::Code::Timeout: case ProvideMessage::Code::Cancelled: case ProvideMessage::Code::InvalidChecksum: case ProvideMessage::Code::MountFailed: case ProvideMessage::Code::Jammed: case ProvideMessage::Code::NoAuthData: case ProvideMessage::Code::MediaChangeAbort: case ProvideMessage::Code::MediaChangeSkip: case ProvideMessage::Code::InternalError: { return validateErrorMsg(msg); } case ProvideMessage::Code::Prov: { DEF_REQ_FIELD(url); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( Provide, url, std::string ) OR_PARSE_OPT_FIELD ( Provide, filename, std::string ) OR_PARSE_OPT_FIELD ( Provide, delta_file, std::string ) OR_PARSE_OPT_FIELD ( Provide, expected_filesize, int64_t ) OR_PARSE_OPT_FIELD ( Provide, check_existance_only, bool ) OR_PARSE_OPT_FIELD ( Provide, metalink_enabled, bool ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( Provide, url ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::Cancel: // no known fields BEGIN_PARSE_HEADERS HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS return expected::success( std::move(pMessage) ); case ProvideMessage::Code::Attach: { std::exception_ptr error; DEF_REQ_FIELD(url); DEF_REQ_FIELD(attach_id); DEF_REQ_FIELD(label); // not really required, but this way we can check if all false or all true DEF_REQ_FIELD(verify_type); DEF_REQ_FIELD(verify_data); DEF_REQ_FIELD(media_nr); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( Attach, url , std::string ) OR_PARSE_REQ_FIELD ( Attach, attach_id , std::string ) OR_PARSE_REQ_FIELD ( Attach, label , std::string ) OR_PARSE_REQ_FIELD ( Attach, verify_type, std::string ) OR_PARSE_REQ_FIELD ( Attach, verify_data, std::string ) OR_PARSE_REQ_FIELD ( Attach, media_nr , int32_t ) OR_PARSE_OPT_FIELD ( Attach, device , std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( Provide, url ); FAIL_IF_NOT_SEEN_REQ_FIELD( Provide, label ); FAIL_IF_NOT_SEEN_REQ_FIELD( Provide, attach_id ); if ( ! ( ( has_verify_data == has_verify_type ) && ( has_verify_type == has_media_nr ) ) ) return expected::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException("Error in Attach message, one of the following fields is not set or invalid: ( verify_type, verify_data, media_nr ). Either none or all need to be set. ")) ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::Detach: { DEF_REQ_FIELD(url); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( Detach, url, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( Detach, url ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::AuthDataRequest: { DEF_REQ_FIELD(effective_url); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( AuthDataRequest, effective_url, std::string ) OR_PARSE_OPT_FIELD ( AuthDataRequest, last_auth_timestamp, int64_t ) OR_PARSE_OPT_FIELD ( AuthDataRequest, username, std::string ) OR_PARSE_OPT_FIELD ( AuthDataRequest, authHint, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( AuthDataRequest, effective_url ); return expected::success( std::move(pMessage) ); } case ProvideMessage::Code::MediaChangeRequest: { DEF_REQ_FIELD(label); DEF_REQ_FIELD(media_nr); DEF_REQ_FIELD(device); BEGIN_PARSE_HEADERS PARSE_REQ_FIELD ( MediaChangeRequest, label, std::string ) OR_PARSE_REQ_FIELD ( MediaChangeRequest, media_nr, int32_t ) OR_PARSE_REQ_FIELD ( MediaChangeRequest, device, std::string ) OR_PARSE_OPT_FIELD ( MediaChangeRequest, desc, std::string ) OR_HANDLE_UNKNOWN_FIELD( name, val ) END_PARSE_HEADERS FAIL_IF_NOT_SEEN_REQ_FIELD( MediaChangeRequest, label ); FAIL_IF_NOT_SEEN_REQ_FIELD( MediaChangeRequest, media_nr ); FAIL_IF_NOT_SEEN_REQ_FIELD( MediaChangeRequest, device ); return expected::success( std::move(pMessage) ); } default: { // all error messages have the same format if ( c >= ProvideMessage::Code::FirstClientErrCode && c <= ProvideMessage::Code::LastSrvErrCode ) { return validateErrorMsg(msg); } } } // we should never reach this line because we check in the beginning if the know the message code return zyppng::expected::error( ZYPP_EXCPT_PTR ( InvalidMessageReceivedException("Unknown code in PluginFrame")) ); } expected ProvideMessage::toStompMessage() const { zypp::PluginFrame f = rpc::prepareFrame(); f.addHeader ( std::string(ProvideMessageFields::RequestCode), zypp::str::asString (static_cast(_code)) ); f.addHeader ( std::string(ProvideMessageFields::RequestId), zypp::str::asString (_reqId) ); for ( auto i = _headers.beginList (); i != _headers.endList(); i++ ) { for ( const auto &val : i->second ) { const auto &strVal = std::visit([&]( const auto &val ){ if constexpr( std::is_same_v, std::monostate> ) return std::string(); else { return zypp::str::asString(val); } }, val.asVariant() ); if ( strVal.empty () ) continue; f.addHeader( i->first, strVal ); } } return expected::success ( std::move(f) ); } expected ProvideMessage::fromStompMessage(const zypp::PluginFrame &msg) { return ProvideMessage::create(msg); } ProvideMessage ProvideMessage::createProvideStarted( const uint32_t reqId, const zypp::Url &url, const std::optional &localFilename, const std::optional &stagingFilename ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::ProvideStarted ); msg.setRequestId ( reqId ); msg.setValue ( ProvideStartedMsgFields::Url, url.asCompleteString() ); if ( localFilename ) msg.setValue ( ProvideStartedMsgFields::LocalFilename, *localFilename ); if ( stagingFilename ) msg.setValue ( ProvideStartedMsgFields::StagingFilename, *stagingFilename ); return msg; } ProvideMessage ProvideMessage::createProvideFinished( const uint32_t reqId, const std::string &localFilename, bool cacheHit ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::ProvideFinished ); msg.setRequestId ( reqId ); msg.setValue ( ProvideFinishedMsgFields::LocalFilename, localFilename ); msg.setValue ( ProvideFinishedMsgFields::CacheHit, cacheHit ); return msg; } ProvideMessage ProvideMessage::createAttachFinished(const uint32_t reqId , const std::optional &localMountPoint ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::AttachFinished ); msg.setRequestId ( reqId ); if ( localMountPoint ) msg.setValue ( AttachFinishedMsgFields::LocalMountPoint, *localMountPoint ); return msg; } ProvideMessage ProvideMessage::createDetachFinished(const uint32_t reqId) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::DetachFinished ); msg.setRequestId ( reqId ); return msg; } ProvideMessage ProvideMessage::createAuthInfo( const uint32_t reqId, const std::string &user, const std::string &pw, int64_t timestamp, const std::map &extraValues ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::AuthInfo ); msg.setRequestId ( reqId ); msg.setValue ( AuthInfoMsgFields::Username, user ); msg.setValue ( AuthInfoMsgFields::Password, pw ); msg.setValue ( AuthInfoMsgFields::AuthTimestamp, timestamp ); for ( const auto& i : extraValues ) { msg.setValue( i.first, i.second ); } return msg; } ProvideMessage ProvideMessage::createMediaChanged( const uint32_t reqId ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::MediaChanged ); msg.setRequestId ( reqId ); return msg; } ProvideMessage ProvideMessage::createRedirect( const uint32_t reqId, const zypp::Url &newUrl ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::Redirect ); msg.setRequestId ( reqId ); msg.setValue ( RedirectMsgFields::NewUrl, newUrl.asCompleteString() ); return msg; } ProvideMessage ProvideMessage::createMetalinkRedir( const uint32_t reqId, const std::vector &newUrls ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::Metalink ); msg.setRequestId ( reqId ); for( const auto &val : newUrls ) msg.addValue( MetalinkRedirectMsgFields::NewUrl, val.asCompleteString() ); return msg; } ProvideMessage ProvideMessage::createErrorResponse( const uint32_t reqId, const Code code, const std::string &reason, bool transient ) { ProvideMessage msg; if ( code < Code::FirstClientErrCode || code > Code::LastSrvErrCode ) ZYPP_THROW(std::out_of_range("code must be between 400 and 599")); msg.setCode ( code ); msg.setRequestId ( reqId ); msg.setValue ( ErrMsgFields::Reason, reason ); msg.setValue ( ErrMsgFields::Transient, transient ); return msg; } ProvideMessage ProvideMessage::createProvide( const uint32_t reqId, const zypp::Url &url, const std::optional &filename, const std::optional &deltaFile, const std::optional &expFilesize, bool checkExistOnly ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::Prov ); msg.setRequestId ( reqId ); msg.setValue ( ProvideMsgFields::Url, url.asCompleteString() ); if ( filename ) msg.setValue ( ProvideMsgFields::Filename, *filename ); if ( deltaFile ) msg.setValue ( ProvideMsgFields::DeltaFile, *deltaFile ); if ( expFilesize ) msg.setValue ( ProvideMsgFields::ExpectedFilesize, *expFilesize ); msg.setValue ( ProvideMsgFields::CheckExistOnly, checkExistOnly ); return msg; } ProvideMessage ProvideMessage::createCancel( const uint32_t reqId ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::Cancel ); msg.setRequestId ( reqId ); return msg; } ProvideMessage ProvideMessage::createAttach(const uint32_t reqId, const zypp::Url &url, const std::string attachId, const std::string &label, const std::optional &verifyType, const std::optional &verifyData, const std::optional &mediaNr ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::Attach ); msg.setRequestId ( reqId ); msg.setValue ( AttachMsgFields::Url, url.asCompleteString() ); msg.setValue ( AttachMsgFields::AttachId, attachId ); msg.setValue ( AttachMsgFields::Label, label ); if ( verifyType.has_value() && verifyData.has_value() && mediaNr.has_value() ) { msg.setValue ( AttachMsgFields::VerifyType, *verifyType ); msg.setValue ( AttachMsgFields::VerifyData, *verifyData ); msg.setValue ( AttachMsgFields::MediaNr, *mediaNr ); } else { if ( !( ( verifyType.has_value() == verifyData.has_value() ) && ( verifyData.has_value() == mediaNr.has_value() ) ) ) WAR << "Attach message requires verifyType, verifyData and mediaNr either set together or not set at all." << std::endl; } return msg; } ProvideMessage ProvideMessage::createDetach( const uint32_t reqId, const zypp::Url &attachUrl ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::Detach ); msg.setRequestId ( reqId ); msg.setValue ( DetachMsgFields::Url, attachUrl.asCompleteString() ); return msg; } ProvideMessage ProvideMessage::createAuthDataRequest( const uint32_t reqId, const zypp::Url &effectiveUrl, const std::string &lastTriedUser, const std::optional &lastAuthTimestamp, const std::map &extraValues ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::AuthDataRequest ); msg.setRequestId ( reqId ); msg.setValue ( AuthDataRequestMsgFields::EffectiveUrl, effectiveUrl.asCompleteString() ); if ( lastTriedUser.size() ) msg.setValue( AuthDataRequestMsgFields::LastUser, lastTriedUser ); if ( lastAuthTimestamp ) msg.setValue ( AuthDataRequestMsgFields::LastAuthTimestamp, *lastAuthTimestamp ); return msg; } ProvideMessage ProvideMessage::createMediaChangeRequest( const uint32_t reqId, const std::string &label, int32_t mediaNr, const std::vector &devices, const std::optional &desc ) { ProvideMessage msg; msg.setCode ( ProvideMessage::Code::MediaChangeRequest ); msg.setRequestId ( reqId ); msg.setValue ( MediaChangeRequestMsgFields::Label, label ); msg.setValue ( MediaChangeRequestMsgFields::MediaNr, mediaNr ); for ( const auto &device : devices ) msg.addValue ( MediaChangeRequestMsgFields::Device, device ); if ( desc ) msg.setValue ( MediaChangeRequestMsgFields::Desc, *desc ); return msg; } uint ProvideMessage::requestId() const { return _reqId; } void ProvideMessage::setRequestId(const uint id) { _reqId = id; } ProvideMessage::Code ProvideMessage::code() const { return _code; } void ProvideMessage::setCode(const ProvideMessage::Code newCode ) { _code = newCode; } const std::vector &ProvideMessage::values( const std::string_view &str ) const { return _headers.values ( str ); } const std::vector &ProvideMessage::values( const std::string &str ) const { return values( std::string_view(str)); } ProvideMessage::FieldVal ProvideMessage::value( const std::string_view &str, const FieldVal &defaultVal ) const { return _headers.value ( str, defaultVal ); } const HeaderValueMap &ProvideMessage::headers() const { return _headers; } ProvideMessage::FieldVal ProvideMessage::value( const std::string &str, const FieldVal &defaultVal ) const { return value( std::string_view(str), defaultVal ); } void ProvideMessage::setValue( const std::string &name, const FieldVal &value ) { setValue( std::string_view(name), value ); } void ProvideMessage::setValue( const std::string_view &name, const FieldVal &value ) { _headers.set( std::string(name), value ); } void ProvideMessage::addValue( const std::string &name, const FieldVal &value ) { return addValue( std::string_view(name), value ); } void ProvideMessage::addValue( const std::string_view &name, const FieldVal &value ) { _headers.add( std::string(name), value ); } } libzypp-17.36.5/zypp-media/ng/providequeue.cc000066400000000000000000000710411476576476200211300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "private/providequeue_p.h" #include "private/provideitem_p.h" #include "private/provide_p.h" #include "private/providedbg_p.h" #include #include #include #include #include #include #include #include namespace zyppng { bool ProvideQueue::Item::isAttachRequest() const { if ( !_request ) return false; return ( _request->code () == ProvideMessage::Code::Attach ); } bool ProvideQueue::Item::isFileRequest() const { if ( !_request ) return false; return ( _request->code () == ProvideMessage::Code::Prov ); } bool ProvideQueue::Item::isDetachRequest() const { if ( !_request ) return false; return ( _request->code () == ProvideMessage::Code::Detach ); } ProvideQueue::ProvideQueue(ProvidePrivate &parent) : _parent(parent) { } ProvideQueue::~ProvideQueue() { if ( zyppng::provideDebugEnabled() ) { if ( this->_activeItems.size() || this->_waitQueue.size() ) { DBG << "Queue shutdown with Items still running" << std::endl; } } immediateShutdown(std::make_exception_ptr(zypp::media::MediaException("Cancelled by queue shutdown"))); } bool ProvideQueue::startup(const std::string &workerScheme, const zypp::filesystem::Pathname &workDir, const std::string &hostname ) { if ( _workerProc ) { ERR << "Queue Worker was already initialized" << std::endl; return true; } _myHostname = hostname; const auto &pN = _parent.workerPath() / ( "zypp-media-"+workerScheme ) ; MIL << "Trying to start " << pN << std::endl; const auto &pi = zypp::PathInfo( pN ); if ( !pi.isExist() ) { ERR << "Failed to find worker for " << workerScheme << std::endl; return false; } if ( !pi.userMayX() ) { ERR << "Failed to start worker for " << workerScheme << " binary " << pi.asString() << " is not executable." << std::endl; return false; } if ( zypp::filesystem::assert_dir( workDir ) != 0 ) { ERR << "Failed to assert working directory '" << workDir << "' for worker " << workerScheme << std::endl; return false; } _currentExe = pN; _workerProc = Process::create(); _workerProc->setWorkingDirectory ( workDir ); _messageStream = StompFrameStream::create( _workerProc ); return doStartup(); } void ProvideQueue::enqueue( ProvideRequestRef request ) { Item i; i._request = request; i._request->provideMessage().setRequestId( nextRequestId() ); request->setCurrentQueue( shared_this() ); _waitQueue.push_back( std::move(i) ); if ( _parent.isRunning() ) scheduleNext(); } void ProvideQueue::cancel( ProvideRequest *item , std::exception_ptr error ) { const auto &isSameItem = [item]( const Item &i ){ if ( i.isDetachRequest () ) return false; return i._request.get() == item; }; if ( !item ) return; if ( item->code() != ProvideMessage::Code::Attach && item->code() != ProvideMessage::Code::Prov ) { ERR << "Can not cancel a " << item->code() << " request!" << std::endl; return; } if ( auto i = std::find_if( _waitQueue.begin(), _waitQueue.end(), isSameItem ); i != _waitQueue.end() ) { auto &reqRef = i->_request; reqRef->setCurrentQueue(nullptr); if ( reqRef->owner() ) reqRef->owner()->finishReq( this, reqRef, error ); _waitQueue.erase(i); _parent.schedule( ProvidePrivate::FinishReq ); // let the parent scheduler run since we have a open spot now } else if ( auto i = std::find_if( _activeItems.begin(), _activeItems.end(), isSameItem ); i != _activeItems.end() ) { cancelActiveItem(i, error); } } std::list::iterator ProvideQueue::dequeueActive( std::list::iterator it ) { if ( it == _activeItems.end() ) return it; if ( it->_request ) it->_request->setCurrentQueue( nullptr ); auto i = _activeItems.erase(it); _parent.schedule ( ProvidePrivate::FinishReq ); // Trigger the scheduler scheduleNext (); // keep the active items full return i; } void ProvideQueue::fatalWorkerError( const std::exception_ptr &reason ) { immediateShutdown( reason ? reason : std::make_exception_ptr( zypp::media::MediaException("Fatal worker error")) ); } void ProvideQueue::immediateShutdown( const std::exception_ptr &reason ) { _queueShuttingDown = true; while ( _waitQueue.size() ) { auto &item = _waitQueue.front(); auto &reqRef = item._request; if ( reqRef && reqRef->owner() && !item.isDetachRequest() ) reqRef->owner()->finishReq( this, reqRef, reason ); _waitQueue.pop_front(); } for ( auto i = _activeItems.begin(); i != _activeItems.end(); ) { auto &reqRef = i->_request; if ( reqRef && reqRef->owner() && !i->isDetachRequest() ) { i = cancelActiveItem(i, reason ); } else { i++; } } if ( _workerProc && _workerProc->isRunning() ) { _workerProc->flush(); _workerProc->closeWriteChannel(); _workerProc->waitForExit(); readAllStderr(); } } std::list< ProvideQueue::Item >::iterator ProvideQueue::cancelActiveItem( std::list< Item >::iterator i , const std::__exception_ptr::exception_ptr &error ) { auto &reqRef = i->_request; // already in cancelling process or finished if ( i->_state == Item::Cancelling || i->_state == Item::Finished ) return (++i); // not possible but lets be safe if ( i->_state == Item::Pending ) { reqRef->setCurrentQueue(nullptr); if ( reqRef->owner() ) reqRef->owner()->finishReq( this, reqRef, error ); return dequeueActive(i); } // we first need to cancel the item auto c = ProvideMessage::createCancel ( i->_request->provideMessage().requestId() ); if( !_messageStream->sendMessage(c) ) ERR << "Failed to send cancel message to worker" << std::endl; i->_state = Item::Cancelling; reqRef->setCurrentQueue(nullptr); if ( reqRef->owner() ) reqRef->owner()->finishReq( this, reqRef, error ); reqRef.reset(); return (++i); } void ProvideQueue::scheduleNext() { if ( _queueShuttingDown ) return; while ( _waitQueue.size() && canScheduleMore() ) { auto item = std::move( _waitQueue.front() ); _waitQueue.pop_front(); auto &reqRef = item._request; if ( !reqRef->activeUrl() ) { ERR << "Item without active URL enqueued, this is a BUG." << std::endl; if ( reqRef->owner() ) reqRef->owner()->finishReq( this, reqRef, ZYPP_EXCPT_PTR (zypp::media::MediaException("Item needs a activeURL to be queued.")) ); continue; } if ( !_messageStream->sendMessage( reqRef->provideMessage() ) ) { ERR << "Failed to send message to worker process." << std::endl; fatalWorkerError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Failed to communicate with worker process.") ) ); return; } item._state = Item::Queued; _activeItems.push_back( std::move(item) ); _idleSince.reset(); } if ( _waitQueue.empty() && _activeItems.empty() ) { _parent.schedule( ProvidePrivate::QueueIdle ); if ( !_idleSince ) _idleSince = std::chrono::steady_clock::now(); _sigIdle.emit(); } } bool ProvideQueue::canScheduleMore() const { return ( _activeItems.size() == 0 || ( _capabilities.cfg_flags () & zyppng::WorkerCaps::Pipeline ) == zyppng::WorkerCaps::Pipeline ); } bool ProvideQueue::isIdle() const { return ( empty() ); } std::optional ProvideQueue::idleSince() const { return _idleSince; } bool ProvideQueue::empty() const { return ( _activeItems.empty() && _waitQueue.empty() ); } uint ProvideQueue::requestCount() const { return _activeItems.size() + _waitQueue.size(); } uint ProvideQueue::activeRequests() const { return _activeItems.size(); } zypp::ByteCount ProvideQueue::expectedProvideSize() const { zypp::ByteCount dlSize; for ( const auto &i : _waitQueue ) { if ( i.isDetachRequest () ) continue; auto &reqRef = i._request; if ( reqRef->code() != ProvideMessage::Code::Prov ) continue; dlSize += reqRef->provideMessage().value( ProvideMsgFields::ExpectedFilesize, int64_t(0) ).asInt64(); } for ( const auto &i : _activeItems ) { if ( i.isDetachRequest () ) continue; auto &reqRef = i._request; if ( reqRef->code() != ProvideMessage::Code::Prov ) continue; dlSize += reqRef->provideMessage().value( ProvideMsgFields::ExpectedFilesize, int64_t(0) ).asInt64(); } return dlSize; } const std::string &ProvideQueue::hostname() const { return _myHostname; } const ProvideQueue::Config &ProvideQueue::workerConfig() const { return _capabilities; } SignalProxy ProvideQueue::sigIdle() { return _sigIdle; } bool ProvideQueue::doStartup() { if ( _currentExe.empty() ) return false; //const char *argv[] = { "gdbserver", ":10000", _currentExe.c_str(), nullptr }; const char *argv[] = { _currentExe.c_str(), nullptr }; if ( !_workerProc->start( argv) ) { ERR << "Failed to execute worker" << std::endl; _messageStream.reset (); _workerProc.reset (); return false; } // make sure the default read channel is StdOut so RpcMessageStream gets all the rpc messages _workerProc->setReadChannel ( Process::StdOut ); // we are ready to send the data ProviderConfiguration conf; // @TODO actually write real config data :D conf.insert ( { AGENT_STRING_CONF.data (), "ZYpp " LIBZYPP_VERSION_STRING } ); conf.insert ( { ATTACH_POINT.data (), _workerProc->workingDirectory().asString() } ); conf.insert ( { PROVIDER_ROOT.data (), _parent.z_func()->providerWorkdir().asString() } ); const auto &cleanupOnErr = [&](){ readAllStderr(); _messageStream.reset (); _workerProc->close(); _workerProc.reset(); return false; }; if ( !_messageStream->sendMessage( conf ) ) { ERR << "Failed to send initial message to queue worker" << std::endl; return cleanupOnErr(); } // wait for the data to be written _workerProc->flush (); // wait until we receive a message const auto &caps = _messageStream->nextMessageWait(); if ( !caps || caps->command() != WorkerCaps::typeName ) { ERR << "Worker did not sent a capabilities message, aborting" << std::endl; return cleanupOnErr(); } { auto p = _messageStream->parseMessage( *caps ); if ( !p ) return cleanupOnErr(); _capabilities = std::move(*p); } DBG << "Received config for worker: " << this->_currentExe.asString() << " Worker Type: " << this->_capabilities.worker_type() << " Flags: " << std::bitset<32>( _capabilities.cfg_flags() ).to_string() << std::endl; // now we can set up signals and start processing messages connect( *_messageStream, &StompFrameStream::sigMessageReceived, *this, &ProvideQueue::processMessage ); connect( *_workerProc, &IODevice::sigChannelReadyRead, *this, &ProvideQueue::processReadyRead ); connect( *_workerProc, &Process::sigFinished, *this, &ProvideQueue::procFinished ); // make sure we do not miss messages processMessage(); return true; } void ProvideQueue::processMessage() { const auto &getRequest = [&]( const auto &exp ) -> decltype(_activeItems)::iterator { if ( !exp ) { ERR << "Ignoring invalid request!" << std::endl; return _activeItems.end(); } auto i = std::find_if( _activeItems.begin(), _activeItems.end(), [&]( const auto &elem ) { if ( ! elem._request ) return false; return exp->requestId() == elem._request->provideMessage().requestId(); }); if ( i == _activeItems.end() ) { ERR << "Ignoring unknown request ID: " << exp->requestId() << std::endl; return _activeItems.end(); } return i; }; const auto &sendErrorToWorker = [&]( const uint32_t reqId, const MessageCodes code, const std::string &reason, bool transient = false ) { auto r = ProvideMessage::createErrorResponse ( reqId, code, reason, transient ); if ( !_messageStream->sendMessage( r ) ) { ERR << "Failed to send Error message to worker process." << std::endl; fatalWorkerError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Failed to communicate with worker process.") ) ); return false; } return true; }; const bool doesDownload = this->_capabilities.worker_type() == Config::Downloading; const bool fileNeedsCleanup = doesDownload || ( _capabilities.worker_type() == Config::CPUBound && _capabilities.cfg_flags() & Config::FileArtifacts ); while ( auto msg = _messageStream->nextMessage () ) { if ( msg->command() == ProvideMessage::typeName ) { const auto &provMsg = ProvideMessage::create(*msg); if ( !provMsg ) { fatalWorkerError( provMsg.error() ); return; } const auto &reqIter = getRequest( provMsg ); if ( reqIter == _activeItems.end() ) { if ( provMsg->code() == ProvideMessage::Code::ProvideFinished && fileNeedsCleanup ) { const auto locFName = provMsg->value( ProvideFinishedMsgFields::LocalFilename ).asString(); if ( !_parent.isInCache(locFName) ) { MIL << "Received a ProvideFinished message for a non existant request. Since this worker reported to create file artifacts, the file is cleaned up." << std::endl; zypp::filesystem::unlink( locFName ); } } continue; } auto &req = *reqIter; auto &reqRef =req._request; const auto code = provMsg->code(); if ( code >= ProvideMessage::Code::FirstInformalCode && code <= ProvideMessage::Code::LastInformalCode ) { // send the message to the item but don't dequeue if ( reqRef && reqRef->owner() ) reqRef->owner()->informalMessage ( *this, reqRef, *provMsg ); continue; } else if ( code >= ProvideMessage::Code::FirstSuccessCode && code <= ProvideMessage::Code::LastSuccessCode ) { if ( req._state == Item::Cancelling ) { req._state = Item::Finished; dequeueActive( reqIter ); continue; } if ( code == ProvideMessage::Code::ProvideFinished ) { // we are going to register the file to the cache if this is a downloading worker, so it can not leak // no matter if the item does the correct dance or not, this code is duplicated by all ProvideItems that receive ProvideFinished // results that require file cleanups. // we keep the ref around until after sending the result to the item. At that point it should take a reference std::optional dataRef; if ( !reqIter->isFileRequest() ) { ERR << "Invalid message for request ID: " << reqIter->_request->provideMessage().requestId() << std::endl; fatalWorkerError(); return; } const auto &isCheckExistsOnlyVal = reqRef->provideMessage().value( ProvideMsgFields::CheckExistOnly ); bool isCheckExistsOnly = isCheckExistsOnlyVal.valid() ? isCheckExistsOnlyVal.asBool() : false; // when a worker is downloading we keep a internal book of cache files if ( doesDownload && !isCheckExistsOnly ) { const auto locFName = provMsg->value( ProvideFinishedMsgFields::LocalFilename ).asString(); if ( provMsg->value( ProvideFinishedMsgFields::CacheHit, false ).asBool()) { dataRef = _parent.addToFileCache ( locFName ); if ( !dataRef ) { MIL << "CACHE MISS, file " << locFName << " was already removed, queueing again" << std::endl; if ( reqRef->owner() ) reqRef->owner()->cacheMiss( reqRef ); reqRef->provideMessage().setRequestId( InvalidId ); req._state = Item::Pending; _waitQueue.push_front( req ); dequeueActive( reqIter ); continue; } } else { dataRef = _parent.addToFileCache ( locFName ); // unlikely this can happen but better be safe than sorry if ( !dataRef ) { req._state = Item::Finished; reqRef->setCurrentQueue(nullptr); auto resp = ProvideMessage::createErrorResponse ( provMsg->requestId(), ProvideMessage::Code::InternalError, "File vanished between downloading and adding it to cache." ); if ( reqRef->owner() ) reqRef->owner()->finishReq( *this, reqRef, resp ); dequeueActive( reqIter ); continue; } } } } // send the message to the item and dequeue reqRef->setCurrentQueue(nullptr); if ( reqRef->owner() ) reqRef->owner()->finishReq( *this, reqRef, *provMsg ); req._state = Item::Finished; dequeueActive( reqIter ); continue; } else if ( code >= ProvideMessage::Code::FirstClientErrCode && code <= ProvideMessage::Code::LastSrvErrCode ) { if ( req._state == Item::Cancelling ) { req._state = Item::Finished; dequeueActive( reqIter ); continue; } // send the message to the item and dequeue reqRef->setCurrentQueue(nullptr); if ( reqRef->owner() ) reqRef->owner()->finishReq( *this, reqRef, *provMsg ); req._state = Item::Finished; dequeueActive( reqIter ); continue; } else if ( code >= ProvideMessage::Code::FirstRedirCode && code <= ProvideMessage::Code::LastRedirCode ) { // redir is like a finished message, we can simply forgot about a cancelling request if ( req._state == Item::Cancelling ) { req._state = Item::Finished; dequeueActive( reqIter ); continue; } // send the message to the item and dequeue reqRef->setCurrentQueue(nullptr); if ( reqRef->owner() ) reqRef->owner()->finishReq( *this, reqRef, *provMsg ); req._state = Item::Finished; dequeueActive( reqIter ); continue; } else if ( code >= ProvideMessage::Code::FirstControllerCode && code <= ProvideMessage::Code::LastControllerCode ) { ERR << "Received Controller message from worker, this is a fatal error. Cancelling all requests!" << std::endl; fatalWorkerError ( ZYPP_EXCPT_PTR( zypp::media::MediaException("Controller message received from worker.") ) ); return; } else if ( code >= ProvideMessage::Code::FirstWorkerCode && code <= ProvideMessage::Code::LastWorkerCode ) { if ( code == ProvideMessage::Code::AuthDataRequest ) { if ( !reqIter->isFileRequest() && !reqIter->isAttachRequest() ) { ERR << "Invalid message for request ID: " << reqRef->provideMessage().requestId() << std::endl; fatalWorkerError(); return; } // if the file was cancelled we send a failure back if( reqIter->_state == Item::Cancelling ) { if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData, "Item was cancelled") ) return; continue; } // we need a owner item to fetch the auth data for us if ( !reqRef->owner() ) { if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData, "Request has no owner" ) ) return; continue; } if ( !reqRef->activeUrl() ) { if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData, "Item has no active URL, this is a bug." ) ) return; continue; } try { zypp::Url u( provMsg->value( AuthDataRequestMsgFields::EffectiveUrl ).asString() ); std::map extraVals; for( const auto &hdr : provMsg->headers() ) { if ( hdr.first == AuthDataRequestMsgFields::EffectiveUrl || hdr.first == AuthDataRequestMsgFields::LastAuthTimestamp ) continue; if ( !hdr.second.isString() ) { WAR << "Ignoring non string value for " << hdr.first << std::endl; continue; } extraVals[hdr.first] = hdr.second.asString(); } const auto &authOpt = reqRef->owner()->authenticationRequired( *this, reqRef, u, provMsg->value( AuthDataRequestMsgFields::LastAuthTimestamp ).asInt64(), extraVals ); if ( !authOpt ) { if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData, "No auth given by user." ) ) return; continue; } auto r = ProvideMessage::createAuthInfo ( reqRef->provideMessage().requestId(), authOpt->username(), authOpt->password(), authOpt->lastDatabaseUpdate(), authOpt->extraValues() ); if ( !_messageStream->sendMessage( r ) ) { ERR << "Failed to send AuthorizationInfo to worker process." << std::endl; fatalWorkerError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Failed to communicate with worker process.") ) ); return; } continue; } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData, e.asString() ) ) return; continue; } } else if ( code == ProvideMessage::Code::MediaChangeRequest ) { if ( !reqIter->isAttachRequest() ) { ERR << "Invalid message for request ID: " << reqIter->_request->provideMessage().requestId() << std::endl; fatalWorkerError(); return; } // if the file was cancelled we send a failure back if( reqIter->_state == Item::Cancelling ) { if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeAbort, "Item was cancelled" ) ) return; continue; } MIL << "Worker sent a MediaChangeRequest, asking the user to insert the correct medium" << std::endl; //const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc std::vector freeDevs; for ( const auto &val : provMsg->values( MediaChangeRequestMsgFields::Device) ) { freeDevs.push_back( val.asString() ); } std::optional desc; const auto &descVal = provMsg->value( MediaChangeRequestMsgFields::Desc ); if ( descVal.valid () && descVal.isString() ) desc = descVal.asString(); auto res = _parent._sigMediaChange.emit( _parent.queueName(*this), provMsg->value( MediaChangeRequestMsgFields::Label ).asString(), provMsg->value( MediaChangeRequestMsgFields::MediaNr ).asInt(), freeDevs, desc ); auto action = res ? *res : Provide::Action::ABORT; switch ( action ) { case Provide::Action::RETRY: { MIL << "Sending back a MediaChanged message, retrying to find medium " << std::endl; auto r = ProvideMessage::createMediaChanged ( reqIter->_request->provideMessage().requestId() ); if ( !_messageStream->sendMessage( r ) ){ ERR << "Failed to send MediaChanged to worker process." << std::endl; fatalWorkerError( ZYPP_EXCPT_PTR( zypp::media::MediaException("Failed to communicate with worker process.") ) ); return; } continue; } case Provide::Action::ABORT: { MIL << "Sending back a MediaChangeFailure message, request will fail " << std::endl; if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeAbort, "Cancelled by User" ) ) return; continue; } case Provide::Action::SKIP: { MIL << "Sending back a MediaChangeFailure message, request will fail " << std::endl; if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeSkip, "Skipped by User" ) ) return; continue; } } } else { // if there is a unsupported worker request we need to stop immediately because the worker will be blocked until it gets a answer ERR << "Unsupported worker request: "<command() << " with code " << code << " ignoring! " << std::endl; } } else { ERR << "Received unsupported message " << msg->command() << "ignoring" << std::endl; } } } /*! * Reads all of the log lines from stderr, call only when shutting down the queue * because this will also read partial lines and forwards them */ void ProvideQueue::readAllStderr() { // read all stderr data so we get the full logs auto ba = _workerProc->channelReadLine(Process::StdErr); while ( !ba.empty() ) { forwardToLog(std::string( ba.data(), ba.size() ) ); ba = _workerProc->channelReadLine(Process::StdErr); } } void ProvideQueue::forwardToLog( std::string &&logLine ) { if ( (_capabilities.cfg_flags () & zyppng::WorkerCaps::ZyppLogFormat) == zyppng::WorkerCaps::ZyppLogFormat ) zypp::base::LogControl::instance ().logRawLine( std::move(logLine) ); else MIL << "Message from worker: " << _capabilities.worker_name() << ":" << logLine << std::endl; } void ProvideQueue::processReadyRead(int channel) { // ignore stdout here if ( channel == Process::StdOut ) return; // forward the stderr output to the log bypassing the formatter // the worker already formatted the line while ( _workerProc->canReadLine(Process::StdErr) ) { const auto &data = _workerProc->channelReadLine( Process::StdErr ); if ( data.empty() ) return; forwardToLog(std::string( data.data(), data.size() ) ); } } void ProvideQueue::procFinished(int exitCode) { // process all pending messages processMessage(); // get all of the log lines readAllStderr(); // shut down // @todo implement worker restart in case of a unexpected exit if ( !_queueShuttingDown ) immediateShutdown( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unexpected queue worker exit!") ) ); #if 0 if ( !_queueShuttingDown ) { _crashCounter++; if ( _crashCounter > 3 ) { immediateShutdown( ZYPP_EXCPT_PTR( zypp::media::MediaException("Unexpected queue worker exit!") ) ); return; } MIL << "Unexpected queue worker exit with code: " << exitCode << std::endl; // try to spawn the worker again, move active items back to wait list and start over if ( !doStartup () ) { } } #endif } uint32_t ProvideQueue::nextRequestId() { return _parent.nextRequestId(); } } libzypp-17.36.5/zypp-media/ng/provideres.cc000066400000000000000000000024061476576476200205740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "provideres.h" #include "private/provideres_p.h" namespace zyppng { ProvideRes::ProvideRes( std::shared_ptr dataPtr ) : _data(dataPtr) { } ProvideRes::~ProvideRes() { } const zypp::filesystem::Pathname ProvideRes::file() const { return _data->_myFile; } const zypp::ManagedFile & ProvideRes::asManagedFile () const { return _data->_myFile; } const ProvideMediaHandle &ProvideRes::mediaHandle () const { return _data->_mediaHandle; } const zypp::Url &ProvideRes::resourceUrl () const { return _data->_resourceUrl; } const HeaderValueMap &ProvideRes::headers () const { return _data->_responseHeaders; } } libzypp-17.36.5/zypp-media/ng/provideres.h000066400000000000000000000045701476576476200204420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/source/ProvideRes.h */ #ifndef ZYPP_MEDIA_PROVIDERES_H_INCLUDED #define ZYPP_MEDIA_PROVIDERES_H_INCLUDED #include #include #include #include namespace zyppng { struct ProvideResourceData; /** * \class ProvideRes * A ProvideRes object is a reference counted ownership of a resource in the cache provided by * a \ref Provide instance. * It is generally advisable to release a ProvideRes instance asap, to make sure resources * can be released and devices are free to be ejected. * * \note all ProvideRes instances will become invalid when the \ref Provide instance is * released. */ class ProvideRes { public: ProvideRes( std::shared_ptr dataPtr ); virtual ~ProvideRes(); /*! * Returns the path to the provided file */ const zypp::Pathname file () const; /*! * Returns a reference to the internally used managed file instance. * \note If you obtain this for a file that is inside the providers working directory ( e.g. a provide result for a download ), * the continued use after the Provide instance was relased is undefined behaviour and not supported! */ const zypp::ManagedFile & asManagedFile () const; /*! * Returns a reference to the currently held media handle, this can be a invalid handle */ const ProvideMediaHandle &mediaHandle () const; /*! * The URL this ressource was provided from, can be empty */ const zypp::Url &resourceUrl () const; /*! * All headers that were received from the worker when sending the result */ const HeaderValueMap &headers () const; private: std::shared_ptr _data; }; } #endif libzypp-17.36.5/zypp-media/ng/providespec.cc000066400000000000000000000220151476576476200207330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-media/providespec.cc * */ #include #include #include "providespec.h" using std::endl; namespace zyppng { class ProvideSpecBasePrivate { public: ProvideSpecBasePrivate() {} ProvideSpecBasePrivate(const ProvideSpecBasePrivate &) = default; ProvideSpecBasePrivate(ProvideSpecBasePrivate &&) = delete; ProvideSpecBasePrivate &operator=(const ProvideSpecBasePrivate &) = delete; ProvideSpecBasePrivate &operator=(ProvideSpecBasePrivate &&) = delete; virtual ~ProvideSpecBasePrivate() {} HeaderValueMap _customHeaders; }; class ProvideMediaSpec::Impl : public ProvideSpecBasePrivate { public: Impl() {} Impl( std::string &&label, zypp::Pathname &&vPath, unsigned medianr ) : _label(std::move( label )) , _medianr( medianr ) , _verifyDataPath(std::move(vPath)) {} std::string _label; unsigned _medianr = 0U; zypp::Pathname _verifyDataPath; public: /** Offer default Impl. */ static zypp::shared_ptr nullimpl() { static zypp::shared_ptr _nullimpl( new Impl ); return _nullimpl; } private: friend ProvideMediaSpec::Impl * zypp::rwcowClone( const ProvideMediaSpec::Impl * rhs ); Impl * clone() const { return new Impl( *this ); } }; class ProvideFileSpec::Impl : public ProvideSpecBasePrivate { public: Impl() {} zypp::Pathname _destFilenameHint; zypp::Pathname _mediaSpecFile; bool _checkExistsOnly = false; bool _optional = false; zypp::ByteCount _downloadSize; zypp::CheckSum _checksum; zypp::ByteCount _openSize; zypp::CheckSum _openChecksum; zypp::ByteCount _headerSize; zypp::CheckSum _headerChecksum; zypp::Pathname _deltafile; public: /** Offer default Impl. */ static zypp::shared_ptr nullimpl() { static zypp::shared_ptr _nullimpl( new Impl ); return _nullimpl; } private: friend ProvideFileSpec::Impl * zypp::rwcowClone( const ProvideFileSpec::Impl * rhs ); Impl * clone() const { return new Impl( *this ); } }; ProvideMediaSpec::ProvideMediaSpec( std::string label, zypp::filesystem::Pathname verifyData, unsigned medianr ) : _pimpl( new Impl( std::move(label), std::move(verifyData), medianr ) ) { } const std::string &ProvideMediaSpec::label() const { return _pimpl->_label; } ProvideMediaSpec &ProvideMediaSpec::setLabel(const std::string &label) { _pimpl->_label = label; return *this; } unsigned ProvideMediaSpec::medianr() const { return _pimpl->_medianr; } ProvideMediaSpec &ProvideMediaSpec::setMedianr(unsigned medianr) { _pimpl->_medianr = medianr; return *this; } zypp::filesystem::Pathname ProvideMediaSpec::mediaFile() const { return _pimpl->_verifyDataPath; } ProvideMediaSpec &ProvideMediaSpec::setMediaFile(const zypp::filesystem::Pathname &pName) { _pimpl->_verifyDataPath = pName; return *this; } HeaderValueMap &ProvideMediaSpec::customHeaders() { return _pimpl->_customHeaders; } const HeaderValueMap &ProvideMediaSpec::customHeaders() const { return _pimpl->_customHeaders; } ProvideMediaSpec &ProvideMediaSpec::setCustomHeaderValue(const std::string &key, const HeaderValueMap::Value &val) { _pimpl->_customHeaders.set( key,val ); return *this; } ProvideMediaSpec &ProvideMediaSpec::addCustomHeaderValue(const std::string &key, const HeaderValueMap::Value &val) { _pimpl->_customHeaders.add( key,val ); return *this; } zypp::TriBool ProvideMediaSpec::isSameMedium( const ProvideMediaSpec &other ) { // first check if we have the same media data if ( _pimpl->_verifyDataPath != other._pimpl->_verifyDataPath ) return false; // if the verify file is not empty check the medianr if ( !_pimpl->_verifyDataPath.empty() ) { return _pimpl->_medianr == other._pimpl->_medianr; } // can't tell without the URL return zypp::indeterminate; } /** \relates ProvideSpec::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const ProvideFileSpec::Impl & obj ) { return str << "{" << obj._destFilenameHint << "{" << obj._downloadSize << "|" << obj._checksum << "|" << obj._deltafile << "}" << "}"; } /** \relates ProvideSpec::Impl Verbose stream output */ inline std::ostream & dumpOn( std::ostream & str, const ProvideFileSpec::Impl & obj ) { return str << obj; } ProvideFileSpec::ProvideFileSpec() : _pimpl( new Impl() ) {} ProvideFileSpec::ProvideFileSpec( const zypp::OnMediaLocation &loc ) : _pimpl( new Impl() ) { setDownloadSize( loc.downloadSize() ); setOptional( loc.optional() ); setChecksum( loc.checksum() ); setOpenSize( loc.openSize() ); setOpenChecksum( loc.openChecksum() ); setHeaderSize( loc.headerSize() ); setHeaderChecksum( loc.headerChecksum() ); setDeltafile( loc.deltafile() ); } ProvideFileSpec::~ProvideFileSpec() {} const zypp::filesystem::Pathname &ProvideFileSpec::destFilenameHint() const { return _pimpl->_destFilenameHint; } ProvideFileSpec &ProvideFileSpec::setDestFilenameHint(const zypp::filesystem::Pathname &filename) { _pimpl->_destFilenameHint = filename; return *this; } bool ProvideFileSpec::checkExistsOnly() const { return _pimpl->_checkExistsOnly; } ProvideFileSpec &ProvideFileSpec::setCheckExistsOnly(const bool set) { _pimpl->_checkExistsOnly = set; return *this; } bool ProvideFileSpec::optional() const { return _pimpl->_optional; } ProvideFileSpec & ProvideFileSpec::setOptional( bool val_r ) { _pimpl->_optional = (val_r); return *this; } const zypp::ByteCount & ProvideFileSpec::downloadSize() const { return _pimpl->_downloadSize; } ProvideFileSpec & ProvideFileSpec::setDownloadSize( const zypp::ByteCount &val_r ) { _pimpl->_downloadSize = (val_r); return *this; } const zypp::CheckSum & ProvideFileSpec::checksum() const { return _pimpl->_checksum; } ProvideFileSpec & ProvideFileSpec::setChecksum( const zypp::CheckSum &val_r ) { _pimpl->_checksum = (val_r); return *this; } const zypp::ByteCount & ProvideFileSpec::openSize() const { return _pimpl->_openSize; } ProvideFileSpec & ProvideFileSpec::setOpenSize( const zypp::ByteCount &val_r ) { _pimpl->_openSize = (val_r); return *this; } const zypp::CheckSum & ProvideFileSpec::openChecksum() const { return _pimpl->_openChecksum; } ProvideFileSpec & ProvideFileSpec::setOpenChecksum( const zypp::CheckSum &val_r ) { _pimpl->_openChecksum = (val_r); return *this; } const zypp::ByteCount & ProvideFileSpec::headerSize() const { return _pimpl->_headerSize; } ProvideFileSpec & ProvideFileSpec::setHeaderSize( const zypp::ByteCount &val_r ) { _pimpl->_headerSize = (val_r); return *this; } const zypp::CheckSum & ProvideFileSpec::headerChecksum() const { return _pimpl->_headerChecksum; } ProvideFileSpec & ProvideFileSpec::setHeaderChecksum( const zypp::CheckSum &val_r ) { _pimpl->_headerChecksum = (val_r); return *this; } const zypp::Pathname &ProvideFileSpec::deltafile() const { return _pimpl->_deltafile; } ProvideFileSpec &ProvideFileSpec::setDeltafile( const zypp::Pathname &path ) { _pimpl->_deltafile = (path); return *this; } HeaderValueMap &ProvideFileSpec::customHeaders() { return _pimpl->_customHeaders; } const HeaderValueMap &ProvideFileSpec::customHeaders() const { return _pimpl->_customHeaders; } ProvideFileSpec &ProvideFileSpec::setCustomHeaderValue(const std::string &key, const HeaderValueMap::Value &val) { _pimpl->_customHeaders.set( key,val ); return *this; } ProvideFileSpec &ProvideFileSpec::addCustomHeaderValue(const std::string &key, const HeaderValueMap::Value &val) { _pimpl->_customHeaders.add( key,val ); return *this; } zypp::OnMediaLocation ProvideFileSpec::asOnMediaLocation( const zypp::Pathname &path, unsigned int mediaNr ) const { return zypp::OnMediaLocation( path, mediaNr ) .setDownloadSize( downloadSize() ) .setOptional( optional() ) .setChecksum( checksum() ) .setOpenSize( openSize() ) .setOpenChecksum( openChecksum() ) .setHeaderSize( headerSize() ) .setHeaderChecksum( headerChecksum() ) .setDeltafile( deltafile() ); } std::ostream & operator<<( std::ostream & str, const ProvideFileSpec & obj ) { return str << *obj._pimpl; } std::ostream & dumpOn( std::ostream & str, const ProvideFileSpec & obj ) { return dumpOn( str, *obj._pimpl ); } } // namespace zypp libzypp-17.36.5/zypp-media/ng/providespec.h000066400000000000000000000162131476576476200206000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/source/ProvideSpec.h */ #ifndef ZYPP_MEDIA_PROVIDESPEC_H_INCLUDED #define ZYPP_MEDIA_PROVIDESPEC_H_INCLUDED #include #include #include #include #include #include #include #include #include namespace zyppng { class ProvideMediaSpec { public: ProvideMediaSpec(std::string label="", zypp::Pathname verifyData = zypp::Pathname(), unsigned medianr = 1 ); /*! * The label of the medium, this will be shown in case a media change is required */ const std::string &label() const; /*! * Changes the label of the medium */ ProvideMediaSpec &setLabel( const std::string &label ); /*! * The media number the resource is located on. */ unsigned medianr() const; /*! * Individual manipulation of \c medianr (prefer \ref setLocation). */ ProvideMediaSpec & setMedianr( unsigned medianr ); /*! * Returns the media validation file path. This can be empty if there * is no file to validate. */ zypp::Pathname mediaFile () const; /*! * Changes the media file to the name path \a pName. */ ProvideMediaSpec &setMediaFile( const zypp::Pathname &pName ); /*! * Returns a map of custom key->value pairs that can control special aspects * of how all files are provided by the medium after it was attached */ HeaderValueMap &customHeaders(); const HeaderValueMap &customHeaders() const; /*! * Set the custom header value identified by \a key to \a val */ ProvideMediaSpec &setCustomHeaderValue ( const std::string &key, const HeaderValueMap::Value &val ); /*! * Adds the custom header value \a val to the list of values identified by \a key */ ProvideMediaSpec &addCustomHeaderValue ( const std::string &key, const HeaderValueMap::Value &val ); zypp::TriBool isSameMedium ( const ProvideMediaSpec &other ); public: class Impl; ///< Implementation class. private: zypp::RWCOW_pointer _pimpl; ///< Pointer to implementation. }; class ProvideFileSpec { friend std::ostream & operator<<( std::ostream &str, const ProvideFileSpec &obj ); friend std::ostream & dumpOn( std::ostream &str, const ProvideFileSpec &obj ); public: ProvideFileSpec(); ProvideFileSpec(const zypp::OnMediaLocation &loc); ProvideFileSpec(const ProvideFileSpec &) = default; ProvideFileSpec(ProvideFileSpec &&) noexcept = default; ProvideFileSpec &operator=(const ProvideFileSpec &) = default; ProvideFileSpec &operator=(ProvideFileSpec &&) noexcept = default; /** Dtor */ ~ProvideFileSpec(); template static ProvideFileSpecRef create ( T... args ) { return std::make_shared( std::forward(args)... ); } /*! * The destination file name, this is optional and is only * a hint to the \ref Provide instance where to put the file IF possible. The * file provider does not need to consider this. */ const zypp::Pathname &destFilenameHint() const; ProvideFileSpec &setDestFilenameHint ( const zypp::Pathname &filename ); bool checkExistsOnly () const; ProvideFileSpec & setCheckExistsOnly( const bool set = true ); /** Whether this is an optional resource. * This is a hint to the downloader not to report an error if * the resource is not present on the server. */ bool optional() const; /** Set whether the resource is \ref optional. */ ProvideFileSpec & setOptional( bool val ); /** The size of the resource on the server. */ const zypp::ByteCount &downloadSize() const; /** Set the \ref downloadSize. */ ProvideFileSpec &setDownloadSize( const zypp::ByteCount &val_r ); /** The checksum of the resource on the server. */ const zypp::CheckSum &checksum() const; /** Set the \ref checksum. */ ProvideFileSpec &setChecksum( const zypp::CheckSum &val_r ); /** The size of the resource once it has been uncompressed or unpacked. */ const zypp::ByteCount &openSize() const; /** Set the \ref openSize. */ ProvideFileSpec &setOpenSize( const zypp::ByteCount &val_r ); /** The checksum of the resource once it has been uncompressed or unpacked. */ const zypp::CheckSum &openChecksum() const; /** Set the \ref openChecksum. */ ProvideFileSpec &setOpenChecksum( const zypp::CheckSum &val_r ); /** The size of the header prepending the resource (e.g. for zchunk). */ const zypp::ByteCount &headerSize() const; /** Set the \ref headerSize. */ ProvideFileSpec &setHeaderSize( const zypp::ByteCount &val_r ); /** The checksum of the header prepending the resource (e.g. for zchunk). */ const zypp::CheckSum &headerChecksum() const; /** Set the \ref headerChecksum. */ ProvideFileSpec &setHeaderChecksum( const zypp::CheckSum &val_r ); /** The existing deltafile that can be used to reduce download size ( zchunk or metalink ) */ const zypp::Pathname &deltafile() const; /** Set the \ref deltafile. */ ProvideFileSpec &setDeltafile( const zypp::Pathname &path ); /*! * Returns a map of custom key->value pairs that can control special aspects * of how the provide operation is processed. * * @todo should this actually just be a list of pair(string,string) instead of map? -> easier way to send multiple values to a worker */ HeaderValueMap &customHeaders(); const HeaderValueMap &customHeaders() const; /*! * Set the custom header value identified by \a key to \a val */ ProvideFileSpec &setCustomHeaderValue ( const std::string &key, const HeaderValueMap::Value &val ); /*! * Adds the custom header value \a val to the list of values identified by \a key */ ProvideFileSpec &addCustomHeaderValue ( const std::string &key, const HeaderValueMap::Value &val ); zypp::OnMediaLocation asOnMediaLocation ( const zypp::Pathname &path, unsigned int mediaNr ) const; public: class Impl; ///< Implementation class. private: zypp::RWCOW_pointer _pimpl; ///< Pointer to implementation. }; /** \relates ProvideSpec Stream output */ std::ostream & operator<<( std::ostream &str, const ProvideFileSpec &obj ); /** \relates ProvideSpec Verbose stream output */ std::ostream & dumpOn( std::ostream &str, const ProvideFileSpec &obj ); } // namespace zypp #endif // ZYPP_MEDIA_PROVIDESPEC_H_INCLUDED libzypp-17.36.5/zypp-media/ng/worker/000077500000000000000000000000001476576476200174125ustar00rootroot00000000000000libzypp-17.36.5/zypp-media/ng/worker/DeviceDriver000066400000000000000000000000321476576476200217030ustar00rootroot00000000000000#include "devicedriver.h" libzypp-17.36.5/zypp-media/ng/worker/MountingWorker000066400000000000000000000000341476576476200223240ustar00rootroot00000000000000#include "mountingworker.h" libzypp-17.36.5/zypp-media/ng/worker/ProvideWorker000066400000000000000000000000331476576476200221330ustar00rootroot00000000000000#include "provideworker.h" libzypp-17.36.5/zypp-media/ng/worker/devicedriver.cc000066400000000000000000000300151476576476200223730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "devicedriver.h" #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zyppng::worker::DeviceDriver" namespace zyppng::worker { DeviceDriver::DeviceDriver ( WorkerCaps::WorkerType wType ) : _wType( wType ) { } void DeviceDriver::setProvider ( ProvideWorkerWeakRef workerRef ) { _parentWorker = workerRef; } zyppng::expected DeviceDriver::initialize(const zyppng::worker::Configuration &conf) { if ( const auto &i = conf.find( std::string(zyppng::ATTACH_POINT) ); i != conf.end() ) { const auto &val = i->second; MIL << "Got attachpoint from controller: " << val << std::endl; _attachRoot = zypp::Pathname(val).realpath(); } else { return zyppng::expected::error(ZYPP_EXCPT_PTR( zypp::Exception("Attach point required to work.") )); } _config = conf; zyppng::worker::WorkerCaps caps; caps.set_worker_type ( _wType ); caps.set_cfg_flags( zyppng::worker::WorkerCaps::Flags ( zyppng::worker::WorkerCaps::Pipeline | zyppng::worker::WorkerCaps::ZyppLogFormat | zyppng::worker::WorkerCaps::SingleInstance ) ); return zyppng::expected::success(caps); } bool DeviceDriver::detachMedia ( const std::string &attachId ) { auto i = _attachedMedia.find( attachId ); if ( i == _attachedMedia.end() ) return false; _attachedMedia.erase(i); return true; } void DeviceDriver::releaseIdleDevices () { for ( auto i = _sysDevs.begin (); i != _sysDevs.end(); ) { if ( i->use_count() == 1 && !(*i)->_mountPoint.empty() ) { MIL << "Unmounting device " << (*i)->_name << " since its not used anymore" << std::endl; unmountDevice(*(*i)); if ( (*i)->_ephemeral ) { i = _sysDevs.erase(i); continue; } } ++i; } } void DeviceDriver::detectDevices() { return; } std::vector> &DeviceDriver::knownDevices() { return _sysDevs; } const std::vector> &DeviceDriver::knownDevices() const { return _sysDevs; } std::unordered_map &DeviceDriver::attachedMedia() { return _attachedMedia; } void DeviceDriver::immediateShutdown() { // here we need to unmount everything for ( auto i = _sysDevs.begin (); i != _sysDevs.end(); ) { unmountDevice(*(*i)); if ( (*i)->_ephemeral ) { i = _sysDevs.erase(i); continue; } ++i; } _attachedMedia.clear(); } ProvideWorkerRef DeviceDriver::parentWorker () const { return _parentWorker.lock(); } void DeviceDriver::unmountDevice ( Device &dev ) { if ( dev._mountPoint.empty () ) return; try { zypp::media::Mount mount; mount.umount( dev._mountPoint.asString() ); removeAttachPoint( dev._mountPoint ); } catch (const zypp::media::MediaException & excpt_r) { ERR << "Failed to unmount device: " << dev._name << std::endl; ZYPP_CAUGHT(excpt_r); } dev._mountPoint = zypp::Pathname(); } bool DeviceDriver::isVolatile () const { return false; } void DeviceDriver::setAttachRoot ( const zypp::Pathname &root ) { _attachRoot = root; } zypp::Pathname DeviceDriver::attachRoot () const { if ( _attachRoot.empty() ) { MIL << "Attach root is empty" << std::endl; return zypp::Pathname(".").realpath(); } return _attachRoot; } const zyppng::worker::Configuration &DeviceDriver::config() const { return _config; } zyppng::expected DeviceDriver::isDesiredMedium ( const zypp::Url &deviceUrl, const zypp::Pathname &mountPoint, const zyppng::MediaDataVerifierRef &verifier, uint mediaNr ) { if ( !verifier ) { // at least the requested path must exist on the medium zypp::PathInfo p( mountPoint ); if ( p.isExist() && p.isDir() ) return zyppng::expected::success(); // we have no valid data return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaNotDesiredException( deviceUrl ) ) ); } auto devVerifier = verifier->clone(); if ( !devVerifier ) { // unlikely to happen return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::Exception("Failed to clone verifier") ) ); } // bsc#1180851: If there is just one not-volatile medium in the set // tolerate a missing (vanished) media identifier and let the URL rule. bool relaxed = verifier->totalMedia() == 1 && !isVolatile(); const auto &relMediaPath = devVerifier->mediaFilePath( mediaNr ); zypp::Pathname mediaFile { mountPoint / relMediaPath }; zypp::PathInfo pi( mediaFile ); if ( !pi.isExist() ) { if ( relaxed ) return zyppng::expected::success(); auto excpt = zypp::media::MediaFileNotFoundException( deviceUrl, relMediaPath ) ; excpt.addHistory( verifier->expectedAsUserString( mediaNr ) ); return zyppng::expected::error( ZYPP_EXCPT_PTR( std::move(excpt) ) ); } if ( !pi.isFile() ) { if ( relaxed ) return zyppng::expected::success(); auto excpt = zypp::media::MediaNotAFileException( deviceUrl, relMediaPath ) ; excpt.addHistory( verifier->expectedAsUserString( mediaNr ) ); return zyppng::expected::error( ZYPP_EXCPT_PTR( std::move(excpt) ) ); } if ( !devVerifier->load( mediaFile ) ) { return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::Exception("Failed to load media information from medium") ) ); } if ( !verifier->matches( devVerifier ) ) { return zyppng::expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaNotDesiredException( deviceUrl ) ) ); } return zyppng::expected::success(); } zypp::Pathname DeviceDriver::createAttachPoint( const zypp::Pathname &attach_root ) const { zypp::Pathname apoint; if( attach_root.empty() || !attach_root.absolute()) { ERR << "Create attach point: invalid attach root: '" << attach_root << "'" << std::endl; return apoint; } zypp::PathInfo adir( attach_root ); if( !adir.isDir() || (geteuid() != 0 && !adir.userMayRWX())) { DBG << "Create attach point: attach root is not a writable directory: '" << attach_root << "'" << std::endl; return apoint; } static bool cleanup_once( true ); if ( cleanup_once ) { cleanup_once = false; DBG << "Look for orphaned attach points in " << adir << std::endl; std::list entries; zypp::filesystem::readdir( entries, attach_root, false ); for ( const std::string & entry : entries ) { if ( ! zypp::str::hasPrefix( entry, "AP_0x" ) ) continue; zypp::PathInfo sdir( attach_root + entry ); if ( sdir.isDir() && sdir.dev() == adir.dev() && ( zypp::Date::now()-sdir.mtime() > zypp::Date::month ) ) { DBG << "Remove orphaned attach point " << sdir << std::endl; zypp::filesystem::recursive_rmdir( sdir.path() ); } } } zypp::filesystem::TmpDir tmpdir( attach_root, "AP_0x" ); if ( tmpdir ) { apoint = tmpdir.path().asString(); if ( ! apoint.empty() ) { tmpdir.autoCleanup( false ); // Take responsibility for cleanup. } else { ERR << "Unable to resolve real path for attach point " << tmpdir << std::endl; } } else { ERR << "Unable to create attach point below " << attach_root << std::endl; } return apoint; } void DeviceDriver::removeAttachPoint( const zypp::filesystem::Pathname &attachRoot ) const { if( !attachRoot.empty() && zypp::PathInfo(attachRoot).isDir() && attachRoot != "/" ) { int res = rmdir( attachRoot ); if ( res == 0 ) { MIL << "Deleted default attach point " << attachRoot << std::endl; } else { ERR << "Failed to Delete default attach point " << attachRoot << " errno(" << res << ")" << std::endl; } } } bool DeviceDriver::checkAttached ( const zypp::filesystem::Pathname &mountPoint, const std::function predicate ) { bool isAttached = false; time_t old_mtime = _attach_mtime; _attach_mtime = zypp::media::Mount::getMTime(); if( !(old_mtime <= 0 || _attach_mtime != old_mtime) ) { // OK, skip the check (we've seen it at least once) isAttached = true; } else { if( old_mtime > 0) DBG << "Mount table changed - rereading it" << std::endl; else DBG << "Forced check of the mount table" << std::endl; for( const auto &entry : zypp::media::Mount::getEntries() ) { if ( mountPoint != zypp::Pathname(entry.dir) ) continue; // at least the mount points must match if ( predicate(entry) ) { isAttached = true; break; } } } // force recheck if ( !isAttached ) _attach_mtime = 0; return isAttached; } const std::function DeviceDriver::devicePredicate( unsigned int majNr, unsigned int minNr ) { return [ majNr, minNr ]( const zypp::media::MountEntry &entry ) -> bool { if( entry.isBlockDevice() ) { zypp::PathInfo dev_info( entry.src ); if ( dev_info.devMajor () == majNr && dev_info.devMinor () == minNr ) { DBG << "Found device " << majNr << ":" << minNr << " in the mount table as " << entry.src << std::endl; return true; } } return false; }; } const std::function DeviceDriver::fstypePredicate( const std::string &src, const std::vector &fstypes ) { return [ srcdev=src, fst=fstypes ]( const zypp::media::MountEntry &entry ) -> bool { if( !entry.isBlockDevice() ) { if ( std::find( fst.begin(), fst.end(), entry.type ) != fst.end() ) { if ( srcdev == entry.src ) { DBG << "Found media mount" << " in the mount table as " << entry.src << std::endl; return true; } } } return false; }; } const std::function DeviceDriver::bindMountPredicate( const std::string &src ) { return [ srcdev=src ]( const zypp::media::MountEntry &entry ) -> bool { if( !entry.isBlockDevice() ) { if ( srcdev == entry.src ) { DBG << "Found bound media " << " in the mount table as " << entry.src << std::endl; return true; } } return false; }; } AttachError::AttachError ( const MessageCodes code, const std::string &reason, const bool transient, const HeaderValueMap &extra) : _code( code ), _reason( reason ), _transient( transient ), _extra( extra ) { } AttachError::AttachError ( const MessageCodes code, const bool transient, const zypp::Exception &e ) : _code( code ), _reason( e.asUserString() ), _transient( transient ) { if ( !e.historyEmpty() ) { _extra = { { std::string(zyppng::ErrMsgFields::History), { zyppng::HeaderValueMap::Value(e.historyAsString()) }} }; } } } libzypp-17.36.5/zypp-media/ng/worker/devicedriver.h000066400000000000000000000164411476576476200222440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_NG_WORKER_DEVICEDRIVER_H_INCLUDED #define ZYPP_MEDIA_NG_WORKER_DEVICEDRIVER_H_INCLUDED #include #include #include #include #include #include #include #include #include #include namespace zyppng::worker { ZYPP_FWD_DECL_TYPE_WITH_REFS (DeviceDriver); struct Device { std::string _name; //!< Path of the device node or URL for e.g. nfs devices unsigned int _maj_nr = 0; //!< Major number of the device unsigned int _min_nr = 0; //!< Minor number of the device zypp::Pathname _mountPoint = {};//!< Mountpoint of the device, if empty dev is not mounted bool _ephemeral = false; //!< If set to true the device is removed from the internal list after the last attachpoint was released std::unordered_map _properties = {}; }; struct AttachedMedia { std::shared_ptr _dev; zypp::Pathname _attachRoot; }; struct AttachError { AttachError ( const MessageCodes code, const std::string &reason, const bool transient, const HeaderValueMap &extra = {} ); AttachError ( const MessageCodes code, const bool transient, const zypp::Exception &e ); MessageCodes _code; std::string _reason; bool _transient; HeaderValueMap _extra; }; // either the mountpoint or an error using AttachResult = expected; /*! * Abstract base class to be used together with the \sa MountingWorker class to control * attaching and detaching of a multitude of different media types via a unified interface. * Reimplement this class to easily support a new backend that utilizes the "mount" command to * attach real filesystems to the system. */ class DeviceDriver : public zyppng::Base { public: DeviceDriver ( WorkerCaps::WorkerType wType ); /*! * Tells the driver which provide worker to use when requiring auth data or media changes */ void setProvider ( ProvideWorkerWeakRef workerRef ); /*! * Called by the provide loop whenever a attach request is received. */ virtual AttachResult mountDevice ( const uint32_t id, const zypp::Url &mediaUrl, const std::string &attachId, const std::string &label, const HeaderValueMap &extras ) = 0; virtual zyppng::expected initialize(const zyppng::worker::Configuration &conf); /*! * Detaches the medium referenced by \a attachId. * Returns false if the medium could not be found * * \note this will not unmount the physical devices. * Call \ref releaseIdleDevices to force this. * */ bool detachMedia ( const std::string &attachId ); /*! * Physically detaches all devices that are not referenced by a attachment anymore */ void releaseIdleDevices (); /*! * Called by the parent to populate the device array every time a provide request arrives, only * relevant for workers that operate on detectable devices. * The base implementation does nothing */ virtual void detectDevices(); /*! * Returns a list of all currently known devices, a subclass should always make sure * that all currently mounted devices are present in that list. */ std::vector> &knownDevices(); /*! * Returns a list of all currently known devices, a subclass should always make sure * that all currently mounted devices are present in that list. */ const std::vector> &knownDevices() const; /*! * Returns the list of currently attached medias */ std::unordered_map &attachedMedia(); /*! * Returns true if the worker handles volatile devices ( e.g. DVDs ). * The default impl returns false. */ virtual bool isVolatile () const; /*! * Changes the attach root to a specific path, otherwise realpath(".") is used. */ void setAttachRoot ( const zypp::Pathname &root ); /*! * Returns the \a attachRoot as dictated by the controller */ zypp::Pathname attachRoot () const; /*! * The system is shutting down, release all ressources */ virtual void immediateShutdown(); /*! * Returns the parent worker if set */ ProvideWorkerRef parentWorker () const; /*! * Returns the configuration that was sent by the controller */ const zyppng::worker::Configuration &config() const; protected: /*! * Forcefully unmounts the device, this does not check if there any attached medias still relying on it */ virtual void unmountDevice ( Device &dev ); /*! * Checks if the medium \a deviceUrl mounted on \a path matches the \a verifier and \a mediaNr */ zyppng::expected isDesiredMedium ( const zypp::Url &deviceUrl, const zypp::Pathname &mountPoint, const zyppng::MediaDataVerifierRef &verifier, uint mediaNr = 1 ); zypp::Pathname createAttachPoint(const zypp::Pathname &attach_root) const; void removeAttachPoint ( const zypp::Pathname &attach_pt ) const; bool checkAttached ( const zypp::Pathname &mountPoint, const std::function predicate ); /*! * Returns a predicate for the \ref checkAttached function that looks for a real device in the mount table */ static const std::function devicePredicate ( unsigned int majNr, unsigned int minNr ); /*! * Returns a predicate for the \ref checkAttached function that looks for a virtual mount ( like smb or nfs ) in the mount table */ static const std::function fstypePredicate ( const std::string &src, const std::vector &fstypes ); /*! * Returns a predicate for the \ref checkAttached function that looks for a bind mount in the mount table */ static const std::function bindMountPredicate ( const std::string &src ); private: WorkerCaps::WorkerType _wType; ProviderConfiguration _config; time_t _attach_mtime = 0; //< Timestamp of the mtab we did read zypp::Pathname _attachRoot; std::vector> _sysDevs; std::unordered_map _attachedMedia; ProvideWorkerWeakRef _parentWorker; }; } #endif libzypp-17.36.5/zypp-media/ng/worker/mountingworker.cc000066400000000000000000000145601476576476200230210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "mountingworker.h" #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "MountingWorker" namespace zyppng::worker { MountingWorker::MountingWorker( std::string_view workerName, DeviceDriverRef driver ) : ProvideWorker( workerName ) , _driver(driver) { } MountingWorker::~MountingWorker() { _driver->immediateShutdown(); } zyppng::expected MountingWorker::initialize( const zyppng::worker::Configuration &conf ) { return _driver->initialize(conf); } void MountingWorker::provide() { _driver->detectDevices(); auto &queue = requestQueue(); if ( !queue.size() ) return; auto req = queue.front(); queue.pop_front(); MIL_PRV << "Received provide: " << req->_spec.code() << std::endl; try { switch ( req->_spec.code () ) { case zyppng::ProvideMessage::Code::Attach: { const auto attachUrl = zypp::Url( req->_spec.value( zyppng::AttachMsgFields::Url ).asString() ); const auto label = req->_spec.value( zyppng::AttachMsgFields::Label, "No label" ).asString(); const auto attachId = req->_spec.value( zyppng::AttachMsgFields::AttachId ).asString(); HeaderValueMap vals; for ( const auto &i : req->_spec.headers() ) { if ( i.first == zyppng::AttachMsgFields::Url || i.first == zyppng::AttachMsgFields::Label || i.first == zyppng::AttachMsgFields::AttachId ) continue; vals.set( i.first, i.second ); } const auto &res = _driver->mountDevice( req->_spec.requestId(), attachUrl, attachId, label, vals ); if ( !res ) { const auto &err = res.error(); req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , err._code , err._reason , err._transient , err._extra ); return; } MIL << "Attach of " << attachUrl << " was successfull" << std::endl; attachSuccess( req->_spec.requestId(), res.get().asString() ); return; } case zyppng::ProvideMessage::Code::Detach: { const auto url = zypp::Url( req->_spec.value( zyppng::DetachMsgFields::Url ).asString() ); const auto &attachId = url.getAuthority(); if ( _driver->detachMedia( attachId ) ) { detachSuccess ( req->_spec.requestId() ); } else { provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotFound , "Attach ID not known." , false , {} ); return; } _driver->releaseIdleDevices(); return; } case zyppng::ProvideMessage::Code::Prov: { const auto url = zypp::Url( req->_spec.value( zyppng::DetachMsgFields::Url ).asString() ); const auto &attachId = url.getAuthority(); const auto &path = zypp::Pathname(url.getPathName()); const auto &availMedia = _driver->attachedMedia(); auto i = availMedia.find( attachId ); if ( i == availMedia.end() ) { ERR << "Unknown Attach ID " << attachId << std::endl; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotFound , "Attach ID not known." , false , {} ); return; } const auto &locPath = i->second._dev->_mountPoint / i->second._attachRoot / path; MIL << "Trying to find file: " << locPath << std::endl; zypp::PathInfo info( locPath ); if( info.isFile() ) { provideSuccess ( req->_spec.requestId(), false, locPath ); return; } if (info.isExist()) provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotAFile , zypp::str::Str() << "Path " << path << " exists, but its not a file" , false , {} ); else provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::NotFound , zypp::str::Str() << "File " << path << " not found on medium" , false , {} ); break; } default: { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , "Request type not implemented" , false , {} ); return; } } } catch ( const zypp::Exception &e ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , e.asString() , false , {} ); return; } catch ( const std::exception &e ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , e.what() , false , {} ); return; } catch ( ... ) { req->_state = zyppng::worker::ProvideWorkerItem::Finished; provideFailed( req->_spec.requestId() , zyppng::ProvideMessage::Code::BadRequest , "Unknown exception" , false , {} ); return; } } void MountingWorker::cancel( const std::deque::iterator &i ) { ERR << "Bug, cancel should never be called for running items" << std::endl; } void MountingWorker::immediateShutdown() { _driver->immediateShutdown(); } } libzypp-17.36.5/zypp-media/ng/worker/mountingworker.h000066400000000000000000000031051476576476200226540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_NG_WORKER_MOUNTINGWORKER_H_INCLUDED #define ZYPP_MEDIA_NG_WORKER_MOUNTINGWORKER_H_INCLUDED #include #include #include #include #include namespace zyppng::worker { class MountingWorker : public zyppng::worker::ProvideWorker { public: MountingWorker( std::string_view workerName, DeviceDriverRef driver ); ~MountingWorker(); void immediateShutdown() override; protected: // ProvideWorker interface zyppng::expected initialize(const zyppng::worker::Configuration &conf) override; void provide() override; void cancel( const std::deque::iterator &i ) override; private: DeviceDriverRef _driver; bool _devicesDetected = false; //< We delay device detection to the first attach request, to avoid doing it without needing it }; } #endif libzypp-17.36.5/zypp-media/ng/worker/provideworker.cc000066400000000000000000000422171476576476200226310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "provideworker.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "ProvideWorker" namespace zyppng::worker { using namespace zyppng::operators; RequestCancelException::RequestCancelException() : zypp::media::MediaException ("Request was cancelled") { } ProvideWorker::ProvideWorker(std::string_view workerName) : _workerName(workerName) { // do not change the order of these calls, otherwise showing the threadname does not work // enableLogForwardingMode will initialize the log which would override the current thread name zypp::base::LogControl::instance().enableLogForwardingMode( true ); ThreadData::current().setName( workerName ); // we use a singleshot timer that triggers message handling connect( *_msgAvail, &Timer::sigExpired, *this, &ProvideWorker::messageLoop ); _msgAvail->setSingleShot(true); // another timer to trigger a delayed shutdown connectFunc( *_delayedShutdown, &Timer::sigExpired, [this]( zyppng::Timer & ) { maybeDelayedShutdown(); }, *this ); _delayedShutdown->setSingleShot(true); } ProvideWorker::~ProvideWorker() { } StompFrameStreamRef ProvideWorker::messageStream() const { return _stream; } expected ProvideWorker::run( int recv, int send ) { // reentry not supported assert ( !_isRunning ); zypp::DtorReset res( _isRunning ); _isRunning = true; initLog(); zypp::OnScopeExit cleanup([&](){ _stream.reset(); _controlIO.reset(); _loop.reset(); }); _controlIO = AsyncDataSource::create(); if ( !_controlIO->openFds( { recv }, send ) ) { return expected::error( ZYPP_EXCPT_PTR(zypp::Exception("Failed to open control FDs")) ); } connect( *_controlIO, &AsyncDataSource::sigReadFdClosed, *this, &ProvideWorker::readFdClosed ); connect( *_controlIO, &AsyncDataSource::sigWriteFdClosed, *this, &ProvideWorker::writeFdClosed ); _stream = StompFrameStream::create( _controlIO ); return executeHandshake () | and_then( [&]() { AutoDisconnect disC[] = { connect( *_stream, &StompFrameStream::sigMessageReceived, *this, &ProvideWorker::messageReceived ), connect( *_stream, &StompFrameStream::sigInvalidMessageReceived, *this, &ProvideWorker::onInvalidMessageReceived ) }; _loop->run(); if ( _fatalError ) return expected::error( _fatalError ); return expected::success(); }); } std::deque &ProvideWorker::requestQueue() { return _pendingProvides; } ProvideWorker::ProvideNotificatioMode ProvideWorker::provNotificationMode() const { return _provNotificationMode; } void ProvideWorker::setProvNotificationMode( const ProvideNotificatioMode &provNotificationMode ) { _provNotificationMode = provNotificationMode; } void ProvideWorker::initLog() { // by default we log to strErr, if user code wants to change that it can overload this function zypp::base::LogControl::instance().logToStdErr(); } ProvideWorkerItemRef ProvideWorker::makeItem( ProvideMessage &&spec ) { return std::make_shared( std::move(spec) ); } void ProvideWorker::provideStart(const uint32_t id, const zypp::Url &url, const zypp::filesystem::Pathname &localFile, const zypp::Pathname &stagingFile ) { if ( !_stream->sendMessage( ProvideMessage::createProvideStarted ( id , url , localFile.empty () ? std::optional() : localFile.asString () , stagingFile.empty () ? std::optional() : stagingFile.asString () ) ) ) { ERR << "Failed to send ProvideStart message" << std::endl; } } void ProvideWorker::provideSuccess(const uint32_t id, bool cacheHit, const zypp::filesystem::Pathname &localFile, const HeaderValueMap extra ) { MIL_PRV << "Sending provideSuccess for id " << id << " file " << localFile << std::endl; auto msg = ProvideMessage::createProvideFinished( id ,localFile.asString() ,cacheHit); for ( auto i = extra.beginList (); i != extra.endList(); i++ ) { for ( const auto &val : i->second ) msg.addValue( i->first, val ); } if ( !_stream->sendMessage( msg ) ) { ERR << "Failed to send ProvideSuccess message" << std::endl; } } void ProvideWorker::provideFailed(const uint32_t id, const ProvideMessage::Code code, const std::string &reason, const bool transient, const HeaderValueMap extra ) { MIL_PRV << "Sending provideFailed for request " << id << " err: " << reason << std::endl; auto msg = ProvideMessage::createErrorResponse ( id, code, reason, transient ); for ( auto i = extra.beginList (); i != extra.endList(); i++ ) { for ( const auto &val : i->second ) msg.addValue( i->first, val ); } if ( !_stream->sendMessage( msg ) ) { ERR << "Failed to send ProvideFailed message" << std::endl; } } void ProvideWorker::provideFailed ( const uint32_t id, const ProvideMessage::Code code, const bool transient, const zypp::Exception &e ) { zyppng::HeaderValueMap extra; if ( !e.historyEmpty() ) { extra = { { std::string(zyppng::ErrMsgFields::History), { zyppng::HeaderValueMap::Value(e.historyAsString()) }} }; } provideFailed( id , code , e.asUserString() , transient , extra ); } void ProvideWorker::attachSuccess(const uint32_t id, const std::optional &localMountPoint) { MIL_PRV << "Sending attachSuccess for request " << id << std::endl; if ( !_stream->sendMessage( ProvideMessage::createAttachFinished ( id, localMountPoint ) ) ) { ERR << "Failed to send AttachFinished message" << std::endl; } else { MIL << "Sent back attach success" << std::endl; } } void ProvideWorker::detachSuccess(const uint32_t id) { MIL_PRV << "Sending detachSuccess for request " << id << std::endl; if ( !_stream->sendMessage( ProvideMessage::createDetachFinished ( id ) ) ) { ERR << "Failed to send DetachFinished message" << std::endl; } } expected ProvideWorker::sendAndWaitForResponse( const ProvideMessage &request , const std::vector &responseCodes ) { // make sure immediateShutdown is not called while we are blocking here zypp::DtorReset delayedReset( _inControllerRequest ); _inControllerRequest = true; if ( !_stream->sendMessage( request ) ) return expected::error( ZYPP_EXCPT_PTR(zypp::Exception("Failed to send message")) ); // flush the io device, this will block until all bytes are written _controlIO->flush(); while ( !_fatalError ) { const auto &msg = _stream->nextMessageWait() | [&]( auto &&nextMessage ) { if ( !nextMessage ) { if ( _fatalError ) return expected::error( _fatalError ); else return expected::error( ZYPP_EXCPT_PTR(zypp::Exception("Failed to wait for response")) ); } return expected::success( std::move(*nextMessage) ); } | and_then ( [&]( auto && m) { return parseReceivedMessage(m); } ); if ( !msg ) { ERR << "Failed to receive message" << std::endl; return msg; } if ( std::find( responseCodes.begin (), responseCodes.end(), msg->code() ) != responseCodes.end() ) { return msg; } // remember other messages for later MIL << "Remembering message for later: " << msg->code () << std::endl; _pendingMessages.push_back(*msg); _msgAvail->start(0); } return expected::error( _fatalError ); } ProvideWorker::MediaChangeRes ProvideWorker::requestMediaChange(const uint32_t id, const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc ) { return sendAndWaitForResponse( ProvideMessage::createMediaChangeRequest ( id, label, mediaNr, devices, desc ), { ProvideMessage::Code::MediaChanged, ProvideMessage::Code::MediaChangeAbort, ProvideMessage::Code::MediaChangeSkip } ) | [&]( expected &&m ) { if ( !m ) { MIL << "Failed to wait for message, aborting the request " << std::endl; return ProvideWorker::MediaChangeRes::ABORT; } MIL << "Wait finished, with messages still pending: " << this->_pendingMessages.size() << " and provs still pending: " << this->_pendingProvides.size() << std::endl; if ( m->code() == ProvideMessage::Code::MediaChanged ) return ProvideWorker::MediaChangeRes::SUCCESS; else if ( m->code() == ProvideMessage::Code::MediaChangeSkip ) return ProvideWorker::MediaChangeRes::SKIP; else return ProvideWorker::MediaChangeRes::ABORT; }; } expected ProvideWorker::requireAuthorization( const uint32_t id, const zypp::Url &url, const std::string &lastTriedUsername, const int64_t lastTimestamp, const std::map &extraFields ) { return sendAndWaitForResponse( ProvideMessage::createAuthDataRequest( id, url, lastTriedUsername, lastTimestamp, extraFields ), { ProvideMessage::Code::AuthInfo, ProvideMessage::Code::NoAuthData } ) | and_then( [&]( ProvideMessage &&m ) { if ( m.code() == ProvideMessage::Code::AuthInfo ) { AuthInfo inf; for( const auto &hdr : m.headers () ) { if ( hdr.first == AuthInfoMsgFields::Username ) { inf.username = hdr.second.asString(); } else if ( hdr.first == AuthInfoMsgFields::Password ) { inf.password = hdr.second.asString(); } else if ( hdr.first == AuthInfoMsgFields::AuthTimestamp ) { inf.last_auth_timestamp = hdr.second.asInt64(); } else { if ( !hdr.second.isString() ) { ERR << "Ignoring invalid extra value, " << hdr.first << " is not of type string" << std::endl; } inf.extraKeys[hdr.first] = hdr.second.asString(); } } return expected::success(inf); } return expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaException("No Auth data")) ); }); } AsyncDataSource &ProvideWorker::controlIO() { return *_controlIO.get(); } expected ProvideWorker::executeHandshake() { const auto &helo = _stream->nextMessageWait(); if ( !helo ) { ERR << "Could not receive a handshake message, aborting" << std::endl; return expected::error( ZYPP_EXCPT_PTR(zypp::Exception("Failed to receive handshake message")) );; } auto exp = _stream->parseMessage( *helo ); if ( !exp ) { invalidMessageReceived( exp.error() ); return expected::error(exp.error()); } return std::move(*exp) | [&]( auto conf ) { _workerConf = std::move(conf); auto &mediaConf = zypp::MediaConfig::instance(); for( const auto &[key,value] : _workerConf ) { zypp::Url keyUrl( key ); if ( keyUrl.getScheme() == "zconfig" && keyUrl.getAuthority() == "main" ) { mediaConf.setConfigValue( keyUrl.getAuthority(), zypp::Pathname(keyUrl.getPathName()).basename(), value ); } } return initialize( _workerConf ) | and_then([&]( WorkerCaps &&caps ){ caps.set_worker_name( _workerName.data() ); caps.set_cfg_flags ( WorkerCaps::Flags(caps.cfg_flags() | WorkerCaps::ZyppLogFormat) ); if ( !_stream->sendMessage ( caps ) ) { return expected::error( ZYPP_EXCPT_PTR(zypp::Exception("Failed to send capabilities")) ); } return expected::success (); }); }; } void ProvideWorker::messageLoop( Timer & ) { if ( _fatalError ) return; while ( _pendingMessages.size () ) { auto m = _pendingMessages.front (); _pendingMessages.pop_front (); handleSingleMessage(m); } if ( !_fatalError && _pendingProvides.size() ) { provide(); } // keep poking until there are no provides anymore if ( !_fatalError && ( _pendingMessages.size() || ( _pendingProvides.size () && _provNotificationMode == QUEUE_NOT_EMTPY ) ) ) { _msgAvail->start(0); } } void ProvideWorker::maybeDelayedShutdown() { if ( _inControllerRequest ) { _delayedShutdown->start(0); return; } immediateShutdown(); _loop->quit (); } void ProvideWorker::readFdClosed( uint, AsyncDataSource::ChannelCloseReason ) { MIL << "Read FD closed, exiting." << std::endl; maybeDelayedShutdown(); } void ProvideWorker::writeFdClosed( AsyncDataSource::ChannelCloseReason ) { MIL << "Write FD closed, exiting." << std::endl; maybeDelayedShutdown(); } void ProvideWorker::messageReceived() { while ( auto message = _stream->nextMessage() ) { if ( _fatalError ) break; pushSingleMessage(*message); } } void ProvideWorker::onInvalidMessageReceived() { invalidMessageReceived( std::exception_ptr() ); } void ProvideWorker::invalidMessageReceived( std::exception_ptr p ) { ERR << "Received a invalid message on the input stream, aborting" << std::endl; if ( p ) _fatalError = p; else _fatalError = ZYPP_EXCPT_PTR( InvalidMessageReceivedException() ); immediateShutdown(); _loop->quit(); } void ProvideWorker::handleSingleMessage( const ProvideMessage &provide ) { const auto code = provide.code(); // we only accept requests here if ( code >= ProvideMessage::Code::FirstControllerCode && code <= ProvideMessage::Code::LastControllerCode ) { MIL_PRV << "Received request: " << code << std::endl; if ( code == ProvideMessage::Code::Cancel ) { const auto &i = std::find_if( _pendingProvides.begin (), _pendingProvides.end(), [ id = provide.requestId() ]( const auto &it ){ return it->_spec.requestId() == id; } ); if ( i != _pendingProvides.end() ) { switch ( (*i)->_state ) { case ProvideWorkerItem::Pending: _stream->sendMessage ( ProvideMessage::createErrorResponse ( provide.requestId (), ProvideMessage::Code::Cancelled, "Cancelled by user." ) ); _pendingProvides.erase(i); break; case ProvideWorkerItem::Running: cancel(i); break; case ProvideWorkerItem::Finished: break; } MIL << "Received Cancel for unknown request: " << provide.requestId() << ", ignoring!" << std::endl; } return; } _pendingProvides.push_back( makeItem (ProvideMessage(provide)) ); return; } ERR << "Unsupported request with code: " << code << " received!" << std::endl; } void ProvideWorker::pushSingleMessage( const zypp::PluginFrame &message ) { const auto &handle = [&]( const zypp::PluginFrame &message ){ return parseReceivedMessage (message ) | and_then( [&]( ProvideMessage &&provide ){ _pendingMessages.push_back(provide); _msgAvail->start(0); return expected::success(); }) | or_else( [&]( std::exception_ptr ) -> expected { return expected::error( ZYPP_EXCPT_PTR( std::invalid_argument(zypp::str::Str()<<"Unknown message received: " << message.command() )) ); }); }; const auto &exp = handle( message ); if ( !exp ) { try { std::rethrow_exception ( exp.error () ); } catch ( const zypp::Exception &e ) { ERR << "Catched exception during message handling: " << e << std::endl; } catch ( const std::exception &e ) { ERR << "Catched exception during message handling: " << e.what()<< std::endl; } catch ( ... ) { ERR << "Unknown Exception during message handling" << std::endl; } } } expected ProvideWorker::parseReceivedMessage( const zypp::PluginFrame &m) { auto exp = ProvideMessage::create(m); if ( !exp ) invalidMessageReceived( exp.error() ); return exp; } } libzypp-17.36.5/zypp-media/ng/worker/provideworker.h000066400000000000000000000211011476576476200224600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_PROVIDE_WORKER_H_INCLUDED #define ZYPP_MEDIA_PROVIDE_WORKER_H_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng::worker { using WorkerCaps = zyppng::WorkerCaps; using Message = zyppng::ProvideMessage; using Configuration = zyppng::ProviderConfiguration; struct AuthInfo { std::string username; std::string password; int64_t last_auth_timestamp = 0; std::map extraKeys = {}; }; class ZYPP_API RequestCancelException : public zypp::media::MediaException { public: RequestCancelException(); }; ZYPP_FWD_DECL_TYPE_WITH_REFS (ProvideWorker); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProvideWorkerItem); class ProvideWorkerItem : public zyppng::Base { public: enum State { Pending, Running, Finished }; ProvideWorkerItem( ProvideMessage &&spec ) : _spec( std::move(spec) ) { } State _state = Pending; ProvideMessage _spec; }; class ProvideWorker : public Base { public: enum ProvideNotificatioMode { ONLY_NEW_PROVIDES, // provide is called only when new provide requests are added to the queue QUEUE_NOT_EMTPY // provide is called continiously until the queue is empty }; ProvideWorker( std::string_view workerName ); virtual ~ProvideWorker(); StompFrameStreamRef messageStream() const; expected run ( int recv = STDIN_FILENO, int send = STDOUT_FILENO ); std::deque &requestQueue(); /*! * Called when the worker process exits */ virtual void immediateShutdown (){}; /*! * This will request a media change from the user and BLOCK until it was acknowledged. * */ enum MediaChangeRes { SUCCESS, ABORT, SKIP }; MediaChangeRes requestMediaChange ( const uint32_t id, const std::string &label, const int32_t mediaNr, const std::vector &devices, const std::optional &desc = {} ); /*! * This will send a authorization request message to the controller, asking for credentials for a given \a url. * The \a lastTimstamp should be initialized with the last \ref AuthInfo timestamp that was received from the controller * or -1 if none was received before. * * \note this blocks until a answer is received, all other received messages are delayed */ expected requireAuthorization ( const uint32_t id, const zypp::Url &url, const std::string &lastTriedUsername = "", const int64_t lastTimestamp = -1, const std::map &extraFields = {} ); ProvideNotificatioMode provNotificationMode() const; void setProvNotificationMode(const ProvideNotificatioMode &provNotificationMode); protected: virtual void initLog(); virtual expected initialize ( const Configuration &conf ) = 0; /*! * Automatically called whenever a new item is enqueued. */ virtual void provide ( ) = 0; virtual void cancel ( const std::deque::iterator &request ) = 0; /*! * Always called to create new items for the request queue, * override this to populate the queue with instances of custom \ref ProvideItem subclasses. * * Cancel requests are directly handled by calling cancel(), however Attach and Detach requests are enqueued as well */ virtual ProvideWorkerItemRef makeItem (ProvideMessage &&spec ); /*! * Send a \a ProvideStart signal to the controller, this is to notify the controller that we have started providing the file * the argument \a localFile has to refer to the file where the file will be provided into, it will be used to calculate * statistics about download speed on the controller side. * The \a stagingFile argument can be used for cases where the worker uses a staging area to download files into but later moves * the file over to the result filename. In those cases the provider will check both locations for the file when calculating stats * * \note Always call \ref ref before sending this message. */ void provideStart ( const uint32_t id, const zypp::Url &url, const zypp::Pathname &localFile, const zypp::Pathname &stagingFile = {} ); /*! * Send a \a ProvideSuccess message to the controller. This is to signal that we are finished with providing a file * and release the file to be used by the controller side. */ void provideSuccess (const uint32_t id, bool cacheHit, const zypp::Pathname &localFile, const HeaderValueMap extra = {} ); /*! * Send a \a ProvideFailed message to the controller. This is to signal that we are failed providing a resource * * \note If the request referenced a \a ident before make sure to manually release it after sending the message. */ void provideFailed (const uint32_t id, const ProvideMessage::Code code, const std::string &reason, const bool transient, const HeaderValueMap extra = {} ); /*! * Overload of provideFailed that takes a \ref zypp::Exception to fill in the error details * * \note If the request referenced a \a ident before make sure to manually release it after sending the message. */ void provideFailed (const uint32_t id, const ProvideMessage::Code code, const bool transient, const zypp::Exception &e ); /*! * Send a \a AttachSuccess message to the controller. This is to signal that we are finished with mounting and verifying a medium */ void attachSuccess ( const uint32_t id, const std::optional &localMountPoint = {} ); /*! * Send a \a DetachSuccess message to the controller. This is to signal that we are finished unmounting a medium */ void detachSuccess ( const uint32_t id ); /*! * Send a \a Redirect message to the controller for the given request ID. This is similar to sending a \a ProvideSuccess message * and the request will be removed from the queue, which means the worker also has to remove it from its internal queue. */ void redirect ( const uint32_t id, const zypp::Url &url, const zypp::Pathname &newPath ); /*! * Returns the control IO datasource, only valid after \ref run was called */ AsyncDataSource &controlIO (); private: expected executeHandshake (); void maybeDelayedShutdown (); void messageLoop ( Timer & ); void readFdClosed ( uint, AsyncDataSource::ChannelCloseReason ); void writeFdClosed ( AsyncDataSource::ChannelCloseReason ); void messageReceived (); void onInvalidMessageReceived ( ); void invalidMessageReceived ( std::exception_ptr p ); void handleSingleMessage (const ProvideMessage &provide ); void pushSingleMessage (const zypp::PluginFrame &msg ); expected sendAndWaitForResponse ( const ProvideMessage &request, const std::vector &responseCodes ); expected parseReceivedMessage(const zypp::PluginFrame &m ); private: ProvideNotificatioMode _provNotificationMode = QUEUE_NOT_EMTPY; bool _inControllerRequest = false; //< Used to signalize that we are currently in a blocking controller callback bool _isRunning = false; std::string_view _workerName; EventLoop::Ptr _loop = EventLoop::create(); Timer::Ptr _msgAvail = Timer::create(); Timer::Ptr _delayedShutdown = Timer::create(); AsyncDataSource::Ptr _controlIO; StompFrameStreamRef _stream; ProviderConfiguration _workerConf; std::exception_ptr _fatalError; //< Error that caused the eventloop to stop std::deque _pendingMessages; std::deque _pendingProvides; }; } #endif libzypp-17.36.5/zypp-tui/000077500000000000000000000000001476576476200152175ustar00rootroot00000000000000libzypp-17.36.5/zypp-tui/Application000066400000000000000000000000311476576476200173770ustar00rootroot00000000000000#include "application.h" libzypp-17.36.5/zypp-tui/CMakeLists.txt000066400000000000000000000046231476576476200177640ustar00rootroot00000000000000# Collect all files that may contain translatable texts FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" ) SET( POT_FILE_DEPENDS_ZYPP_TUI ${POT_FILE_DEPENDS} PARENT_SCOPE ) INCLUDE_DIRECTORIES ( ${LIBZYPP_SOURCE_DIR} ) ADD_DEFINITIONS( -DLOCALEDIR="${CMAKE_INSTALL_PREFIX}/share/locale" -DTEXTDOMAIN="zypp" -DZYPP_DLL ) FIND_PACKAGE( Readline REQUIRED ) SET( zypp_tui_toplevel_headers Application application.h Config config.h Table.h ) INSTALL( FILES ${zypp_tui_toplevel_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-tui" ) SET( zypp_tui_output_headers output/AliveCursor.h output/Out.h output/OutNormal.h output/PromptOptions output/promptoptions.h output/Utf8.h ) INSTALL( FILES ${zypp_tui_output_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-tui/output" ) SET( zypp_tui_utils_headers utils/ansi.h utils/colors.h utils/console.h utils/richtext.h utils/text.h ) INSTALL( FILES ${zypp_tui_utils_headers} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp-tui/utils" ) SET( zypp_tui_headers ${zypp_tui_toplevel_headers} ${zypp_tui_output_headers} ${zypp_tui_utils_headers} ) SET( zypp_tui_SRCS application.cc config.cc Table.cc output/Out.cc output/OutNormal.cc output/promptoptions.cc utils/colors.cc utils/console.cc utils/richtext.cc utils/text.cc ) SET ( zypp_HEADERS ${zypp_tui_headers} ) SET ( zypp_SRCS ${zypp_tui_SRCS} ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) ADD_LIBRARY( zypp-tui STATIC ${zypp_SRCS} ${zypp_HEADERS} ) add_dependencies( zypp-tui zypp-core ) set_target_properties( zypp-tui PROPERTIES COMPILE_FLAGS "-ffat-lto-objects") target_link_libraries( zypp-tui PRIVATE zypp_lib_compiler_flags ) target_link_libraries( zypp-tui INTERFACE ${READLINE_LIBRARY}) target_include_directories( zypp-tui PUBLIC ${READLINE_INCLUDE_DIR}) # target_compile_options( zypp-tui PUBLIC ${READLINE_CFLAGS_OTHER}) INSTALL(TARGETS zypp-tui ARCHIVE DESTINATION ${LIB_INSTALL_DIR} ) # utils/text.* utils/console.* utils/colors.* utils/ansi.h output/Utf8.h output/AliveCursor.h utils/richtext.* output/Out.* output/OutNormal.* Table.* # -> move config for colors to zypp-tui libzypp-17.36.5/zypp-tui/Config000066400000000000000000000000241476576476200163430ustar00rootroot00000000000000#include "config.h" libzypp-17.36.5/zypp-tui/Table.cc000066400000000000000000000333771476576476200165720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include "Table.h" // libzypp logger settings #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypper" namespace ztui { const char * asYesNo( bool val_r ) { return val_r ? _("Yes") : _("No"); } TableLineStyle Table::defaultStyle = Ascii; static const char * lines[][3] = { { "|", "-", "+"}, ///< Ascii // utf 8 { "\xE2\x94\x82", "\xE2\x94\x80", "\xE2\x94\xBC" }, ///< light { "\xE2\x94\x83", "\xE2\x94\x81", "\xE2\x95\x8B" }, ///< heavy { "\xE2\x95\x91", "\xE2\x95\x90", "\xE2\x95\xAC" }, ///< double { "\xE2\x94\x86", "\xE2\x94\x84", "\xE2\x94\xBC" }, ///< light 3 { "\xE2\x94\x87", "\xE2\x94\x85", "\xE2\x94\x8B" }, ///< heavy 3 { "\xE2\x94\x82", "\xE2\x94\x81", "\xE2\x94\xBF" }, ///< v light, h heavy { "\xE2\x94\x82", "\xE2\x95\x90", "\xE2\x95\xAA" }, ///< v light, h double { "\xE2\x94\x83", "\xE2\x94\x80", "\xE2\x95\x82" }, ///< v heavy, h light { "\xE2\x95\x91", "\xE2\x94\x80", "\xE2\x95\xAB" }, ///< v double, h light { ":", "-", "+" }, ///< colon separated values }; namespace { /// Compare wchar_t case sensitive. inline int wccmp( const wchar_t & l, const wchar_t & r ) { return l == r ? 0 : l < r ? -1 : 1; } /// Compare wchar_t case insensitive. inline int wccasecmp( const wchar_t & l, const wchar_t & r ) { return ::wcsncasecmp( &l, &r, 1 ); } /// Whether wchar_t is a Zero digit. inline bool isZero( const wchar_t & ch ) { return ch == L'0'; } /// Whether wchar_t is a digit. inline bool isDigit( const wchar_t & ch ) { return ::iswdigit( ch ); } /// Whether both wchar_t are digits. inline bool bothDigits( const wchar_t & l, const wchar_t & r ) { return isDigit( l ) && isDigit( r ); } /// Whether both wchar_t are no digits. inline bool bothNotDigits( const wchar_t & l, const wchar_t & r ) { return not ( isDigit( l ) || isDigit( r ) ); } /// Whether both are at the end of the string. inline bool bothAtEnd( const mbs::MbsIteratorNoSGR & lit, const mbs::MbsIteratorNoSGR & rit ) { return lit.atEnd() && rit.atEnd(); } /// Whether there are one or more trailing Zeros. inline bool skipTrailingZeros( mbs::MbsIteratorNoSGR & it ) { if ( isZero( *it ) ) { do { ++it; } while ( isZero( *it ) ); return it.atEnd(); } return false; } /// compare like numbers: longer digit sequence wins, otherwise first difference inline int wcnumcmpValue( mbs::MbsIteratorNoSGR & lit, mbs::MbsIteratorNoSGR & rit ) { // PRE: no leading Zeros // POST: if 0(equal) is returned, all digis were skipped int diff = 0; for ( ;; ++lit, ++rit ) { if ( isDigit( *lit ) ) { if ( isDigit( *rit ) ) { if ( not diff && *lit != *rit ) diff = *lit < *rit ? -1 : 1; } else return 1; // DIG !DIG } else { if ( isDigit( *rit ) ) return -1; // !DIG DIG else return diff; // !DIG !DIG } } } } // namespace int TableRow::Less::defaultStrComp( bool ci_r, const std::string & lhs, const std::string & rhs ) { auto wcharcmp = &wccmp; // always start with case sensitive compare int nbias = 0; // remember the 1st difference (in case num compare equal) int cbias = 0; // remember the 1st difference (in case ci compare equal) int cmp = 0; mbs::MbsIteratorNoSGR lit { lhs }; mbs::MbsIteratorNoSGR rit { rhs }; while ( true ) { // Endgame: tricky: trailing Zeros are ignored, but count as nbias if there is none. if ( lit.atEnd() ) { if ( skipTrailingZeros( rit ) && not nbias ) return -1; return rit.atEnd() ? (nbias ? nbias : cbias) : -1; } if ( rit.atEnd() ) { if ( skipTrailingZeros( lit ) && not nbias ) return 1; return lit.atEnd() ? (nbias ? nbias : cbias) : 1; } // num <> num? if ( bothDigits( *lit, *rit ) ) { if ( isZero( *lit ) || isZero( *rit ) ) { int lead = 0; // the more leasing zeros a number has, the less: 001 01 1 while ( isZero( *lit ) ) { ++lit; --lead; } while ( isZero( *rit ) ) { ++rit; ++lead; } if ( not nbias && lead ) nbias = bothAtEnd( lit, rit ) ? -lead : lead; // the less trailing zeros, the less: a a0 a00 } if ( (cmp = wcnumcmpValue( lit, rit )) ) return cmp; continue; // already skipped all digits } else { if ( (cmp = wcharcmp( *lit, *rit )) ) { if ( not cbias ) cbias = cmp; // remember the 1st difference (by wccmp) if ( ci_r ) { if ( (cmp = wccasecmp( *lit, *rit )) ) return cmp; wcharcmp = &wccasecmp; ci_r = false; } else return cmp; } } ++lit; ++rit; } } TableRow & TableRow::add( std::string s ) { if ( _translateColumns ) _translatedColumns.push_back( _(s.c_str()) ); _columns.push_back( std::move(s) ); return *this; } TableRow & TableRow::addDetail( std::string s ) { _details.push_back( std::move(s) ); return *this; } // 1st implementation: no width calculation, just tabs std::ostream & TableRow::dumbDumpTo( std::ostream & stream ) const { bool seen_first = false; for ( container::const_iterator i = _columns.begin(); i != _columns.end(); ++i ) { if ( seen_first ) stream << '\t'; seen_first = true; stream << *i; } return stream << std::endl; } std::ostream & TableRow::dumpDetails( std::ostream & stream, const Table & parent ) const { mbs::MbsWriteWrapped mww( stream, 4, parent._screen_width ); for ( const std::string & text : _details ) { mww.writePar( text ); } mww.gotoParBegin(); return stream; } std::ostream & TableRow::dumpTo( std::ostream & stream, const Table & parent ) const { const char * vline = parent._style == none ? "" : lines[parent._style][0]; unsigned ssize = 0; // string size in columns bool seen_first = false; stream.setf( std::ios::left, std::ios::adjustfield ); stream << std::string( parent._margin, ' ' ); // current position at currently printed line int curpos = parent._margin; // On a table with 2 edition columns highlight the editions // except for the common prefix. std::string::size_type editionSep( std::string::npos ); container::const_iterator i = _columns.begin (), e = _columns.end (); const unsigned lastCol = _columns.size() - 1; for ( unsigned c = 0; i != e ; ++i, ++c ) { const std::string & s( *i ); if ( seen_first ) { bool do_wrap = parent._do_wrap // user requested wrapping && parent._width > parent._screen_width // table is wider than screen && ( curpos + (int)parent._max_width[c] + (parent._style == none ? 2 : 3) > parent._screen_width // the next table column would exceed the screen size || parent._force_break_after == (int)(c - 1) ); // or the user wishes to first break after the previous column if ( do_wrap ) { // start printing the next table columns to new line, // indent by 2 console columns stream << std::endl << std::string( parent._margin + 2, ' ' ); curpos = parent._margin + 2; // indent == 2 } else // vertical line, padded with spaces stream << ' ' << vline << ' '; stream.width( 0 ); } else seen_first = true; // stream.width (widths[c]); // that does not work with multibyte chars ssize = mbs_width( s ); if ( ssize > parent._max_width[c] ) { unsigned cutby = parent._max_width[c] - 2; std::string cutstr = mbs_substr_by_width( s, 0, cutby ); stream << ( _ctxt << cutstr ) << std::string(cutby - mbs_width( cutstr ), ' ') << "->"; } else { if ( !parent._inHeader && parent.header().hasStyle( c, table::CStyle::Edition ) && Application::instance().config().do_colors ) { const std::set & editionColumns { parent.header().editionColumns() }; // Edition column if ( editionColumns.size() == 2 ) { // 2 Edition columns - highlight difference if ( editionSep == std::string::npos ) { editionSep = zypp::str::commonPrefix( _columns[*editionColumns.begin()], _columns[*(++editionColumns.begin())] ); } if ( editionSep == 0 ) { stream << ( ColorContext::CHANGE << s ); } else if ( editionSep == s.size() ) { stream << ( _ctxt << s ); } else { stream << ( _ctxt << s.substr( 0, editionSep ) ) << ( ColorContext::CHANGE << s.substr( editionSep ) ); } } else { // highlight edition-release separator editionSep = s.find( '-' ); if ( editionSep != std::string::npos ) { stream << ( _ctxt << s.substr( 0, editionSep ) << ( ColorContext::HIGHLIGHT << "-" ) << s.substr( editionSep+1 ) ); } else // no release part { stream << ( _ctxt << s ); } } } else // no special style { stream << ( _ctxt << s ); } stream.width( c == lastCol ? 0 : parent._max_width[c] - ssize ); } stream << ""; curpos += parent._max_width[c] + (parent._style == none ? 2 : 3); } stream << std::endl; if ( !_details.empty() ) { dumpDetails( stream, parent ); } return stream; } // ----------------------( Table )--------------------------------------------- Table::Table() : _has_header( false ) , _max_col( 0 ) , _max_width( 1, 0 ) , _width( 0 ) , _style( defaultStyle ) , _screen_width( get_screen_width() ) , _margin( 0 ) , _force_break_after( -1 ) , _do_wrap( false ) , _inHeader( false ) {} Table & Table::add( TableRow tr ) { _rows.push_back( std::move(tr) ); return *this; } Table & Table::setHeader( TableHeader tr ) { _header = std::move(tr); _has_header = !_header.empty(); return *this; } void Table::allowAbbrev( unsigned column) { if ( column >= _abbrev_col.size() ) { _abbrev_col.reserve( column + 1 ); _abbrev_col.insert( _abbrev_col.end(), column - _abbrev_col.size() + 1, false ); } _abbrev_col[column] = true; } void Table::updateColWidths( const TableRow & tr ) const { // how much columns spearators add to the width of the table int sepwidth = _style == none ? 2 : 3; // initialize the width to -sepwidth (the first column does not have a line // on the left) _width = -sepwidth; // ensure that _max_width[col] exists const auto &columns = tr.columns(); if ( _max_width.size() < columns.size() ) { _max_width.resize( columns.size(), 0 ); _max_col = _max_width.size()-1; } unsigned c = 0; for ( const auto & col : columns ) { unsigned &max = _max_width[c++]; unsigned cur = mbs_width( col ); if ( max < cur ) max = cur; _width += max + sepwidth; } _width += _margin * 2; } void Table::dumpRule( std::ostream &stream ) const { const char * hline = _style != none ? lines[_style][1] : " "; const char * cross = _style != none ? lines[_style][2] : " "; bool seen_first = false; stream.width( 0 ); stream << std::string(_margin, ' ' ); for ( unsigned c = 0; c <= _max_col; ++c ) { if ( seen_first ) stream << hline << cross << hline; seen_first = true; // FIXME: could use fill character if hline were a (wide) character for ( unsigned i = 0; i < _max_width[c]; ++i ) stream << hline; } stream << std::endl; } std::ostream & Table::dumpTo( std::ostream & stream ) const { // compute column sizes if ( _has_header ) updateColWidths( _header ); for ( const auto & row : _rows ) updateColWidths( row ); // reset column widths for columns that can be abbreviated //! \todo allow abbrev of multiple columns? unsigned c = 0; for ( std::vector::const_iterator it = _abbrev_col.begin(); it != _abbrev_col.end() && c <= _max_col; ++it, ++c ) { if ( *it && _width > _screen_width && // don't resize the column to less than 3, or if the resulting table // would still exceed the screen width (bnc #534795) _max_width[c] > 3 && _width - _screen_width < ((int) _max_width[c]) - 3 ) { _max_width[c] -= _width - _screen_width; break; } } if ( _has_header ) { zypp::DtorReset inHeader( _inHeader, false ); _inHeader = true; _header.dumpTo( stream, *this ); dumpRule (stream); } for ( const auto & row : _rows ) row.dumpTo( stream, *this ); return stream; } void Table::wrap( int force_break_after ) { if ( force_break_after >= 0 ) _force_break_after = force_break_after; _do_wrap = true; } void Table::lineStyle( TableLineStyle st ) { if ( st < TLS_End ) _style = st; } void Table::margin( unsigned margin ) { if ( margin < (unsigned)(_screen_width/2) ) _margin = margin; else ERR << "margin of " << margin << " is greater than half of the screen" << std::endl; } // Local Variables: // c-basic-offset: 2 // End: } libzypp-17.36.5/zypp-tui/Table.h000066400000000000000000000501361476576476200164240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_TABULE_H #define ZYPP_TUI_TABULE_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ztui { const char * asYesNo( bool val_r ); ///> _("Yes") or _("No") /** Custom sort index type for table rows representing solvables (like detailed search results). */ using SolvableCSI = std::pair; /////////////////////////////////////////////////////////////////// // Custom sort index helpers namespace csidetail { /** Default comparator for custom sort indices (std::compare semantic). */ template inline int simpleAnyTypeComp ( const boost::any &l_r, const boost::any &r_r ) { T l = boost::any_cast(l_r); T r = boost::any_cast(r_r); return ( l < r ? -1 : l > r ? 1 : 0 ); } template <> inline int simpleAnyTypeComp ( const boost::any &l_r, const boost::any &r_r ) { SolvableCSI l = boost::any_cast(l_r); SolvableCSI r = boost::any_cast(r_r); if ( l.first == r.first ) return 0; // quick check Solvable Id int cmp = l.first.name().compare( r.first.name() ); if ( cmp ) return cmp; cmp = l.first.kind().compare( r.first.kind() ); if ( cmp ) return cmp; if ( l.second == r.second ) return 0; return ( l.second < r.second ? -1 : 1 ); // `>`! best version up } } // namespace csidetail /////////////////////////////////////////////////////////////////// //! table drawing style enum TableLineStyle { Ascii = 0, ///< | - + Light, Heavy, Double, Light3, Heavy3, LightHeavy, LightDouble, HeavyLight, DoubleLight, Colon, none, TLS_End, ///< sentinel }; class Table; /////////////////////////////////////////////////////////////////// // Conditional Table column helpers. namespace ctcdetail { /// Remember either \a _if or \a _else function. template struct ColumnIf { ColumnIf( bool condition_r, std::function if_r, std::function else_r ) { if ( condition_r ) _if = std::move(if_r); else _else = std::move(else_r); } std::function _if; std::function _else; }; /// Specialization both functions return the same type template struct ColumnIf { ColumnIf( bool condition_r, std::function if_r, std::function else_r ) : _ifelse { condition_r ? std::move(if_r) : std::move(else_r) } {} ColumnIf( bool condition_r, std::function && if_r ) { if ( condition_r ) _ifelse = std::move(if_r); } std::function _ifelse; }; } /////////////////////////////////////////////////////////////////// /// Conditional Table column factory. /// /// Creates an conditional \ref TableRow or \ref TableHeader entry, /// depending on the value of \a condition_r. The columns content, /// if needed, is determined calling the function object matching the /// condition. /// /// An empty function object will cause the column to be hidden and no /// content will be retrieved (see overloaded operator<<(TableRow &,..)). /// /// \code /// TableRow() /// << "first" /// << ColumnIf( condition, [](){ return "second"; }, [](){ return "one but last"; } ) /// << "last"; /// \endcode template auto ColumnIf( bool condition_r, Tif_ && if_r, Telse_ && else_r ) -> ctcdetail::ColumnIf { return { condition_r, std::forward(if_r), std::forward(else_r) }; } /** \overload no column on 'else' */ template auto ColumnIf( bool condition_r, Tif_ && if_r ) -> ctcdetail::ColumnIf { return { condition_r, std::forward(if_r) }; } namespace table { /// Table column styles /// /// \see \ref Column style setter below. /// \code /// th << table::Column( N_("Name"), CStyle::SortCi ); /// \endcode enum class CStyle { Default = 0, Edition, ///< Editions with v-r setparator highlighted SortCi, ///< String values to be sorted case insensitive }; } class TableRow { private: std::ostream & dumpDetails( std::ostream & stream, const Table & parent ) const; public: struct Less; ///< Binary predicate for sorting. TableRow() : _ctxt( ColorContext::DEFAULT ) {} explicit TableRow( unsigned c ) : _ctxt( ColorContext::DEFAULT ) { _columns.reserve(c); } explicit TableRow( ColorContext ctxt_r ) : _ctxt( ctxt_r ) {} TableRow( unsigned c, ColorContext ctxt_r ) : _ctxt( ctxt_r ) { _columns.reserve(c); } TableRow & add( std::string s ); template TableRow & add( const Tp_ & val_r ) { return add( zypp::str::asString( val_r ) ); } TableRow & addDetail( std::string s ); template TableRow & addDetail( const Tp_ & val_r ) { return addDetail( zypp::str::asString( val_r ) ); } bool empty() const { return _columns.empty(); } // return number of columns unsigned size() const { return _columns.size(); } unsigned cols() const { return size(); } //! tab separated output std::ostream & dumbDumpTo( std::ostream & stream ) const; //! output with \a parent table attributes std::ostream & dumpTo( std::ostream & stream, const Table & parent ) const; using container = std::vector; const boost::any &userData() const { return _userData; } void userData( const boost::any &n_r ) { _userData = n_r; } // BinaryPredicate const container & columns() const { return _translateColumns ? _translatedColumns : _columns; } container & columns() { return _translateColumns ? _translatedColumns : _columns; } const container & columnsNoTr() const { return _columns; } container & columnsNoTr() { return _columns; } protected: bool _translateColumns = false; private: container _columns; container _translatedColumns; container _details; ColorContext _ctxt; boost::any _userData; ///< user defined sort index, e.g. if string values don't work due to coloring }; /** \relates TableRow Add colummn. */ template TableRow & operator<<( TableRow & tr, Tp_ && val ) { return tr.add( zypp::asString( std::forward(val) ) ); } /** \overload preserving TableRow rvalue reference. */ template TableRow && operator<<( TableRow && tr, Tp_ && val ) { return std::move( tr << std::forward(val) ); } /** \overload universal refernce for conditional Table columns */ template TableRow & operator<<( TableRow & tr, const ctcdetail::ColumnIf & val ) { if ( val._if ) tr.add( val._if() ); else if ( val._else ) tr.add( val._else() ); return tr; } /** \overload universal refernce for conditional Table columns */ template TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf & val ) { if ( val._if ) tr.add( val._if() ); else if ( val._else ) tr.add( val._else() ); return tr; } /** \overload universal refernce for conditional Table columns */ template TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf && val ) { if ( val._if ) tr.add( val._if() ); else if ( val._else ) tr.add( val._else() ); return tr; } /** \overload universal refernce for conditional Table columns (specialized) */ template TableRow & operator<<( TableRow & tr, const ctcdetail::ColumnIf & val ) { if ( val._ifelse ) tr.add( val._ifelse() ); return tr; } /** \overload universal refernce for conditional Table columns (specialized) */ template TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf & val ) { if ( val._ifelse ) tr.add( val._ifelse() ); return tr; } /** \overload universal refernce for conditional Table columns (specialized) */ template TableRow & operator<<( TableRow & tr, ctcdetail::ColumnIf && val ) { if ( val._ifelse ) tr.add( val._ifelse() ); return tr; } class TableHeader : public TableRow { public: using CStyle = table::CStyle; //! Constructor. Reserve place for c columns. TableHeader (unsigned c = 0): TableRow (c) { _translateColumns = true; } bool hasStyle( unsigned c, CStyle s ) const { return _cstyle.count(c) && _cstyle.at(c) == s; } CStyle style( unsigned c ) const { return _cstyle.count(c) ? _cstyle.at(c) : CStyle::Default; } void style( unsigned c, CStyle s ) { _cstyle[c] = s; } std::set editionColumns() const { std::set ret; for ( const auto & [c,s] : _cstyle ) { if ( s == CStyle::Edition ) ret.insert( c ); } return ret; } private: std::map _cstyle; ///< Column style and sort hints are remembered here }; /** \relates TableHeader Add column. */ template TableHeader & operator<<( TableHeader & th, Tp_ && val ) { static_cast(th) << std::forward(val); return th; } /** \overload preserving TableHeader rvalue reference. */ template TableHeader && operator<<( TableHeader && th, Tp_ && val ) { return std::move( th << std::forward(val) ); } struct TableRow::Less { using SortParam = std::tuple; ///< column and sortCI Less( const TableHeader & header_r, const std::list& by_columns_r ) { for ( unsigned curr_column : by_columns_r ) { _by_columns.push_back( SortParam( curr_column, header_r.hasStyle( curr_column, table::CStyle::SortCi ) ) ); } } bool operator()( const TableRow & a_r, const TableRow & b_r ) const { int c = 0; for ( const SortParam &sortParam : _by_columns ) { if ( (c = compCol( sortParam, a_r, b_r )) ) return c < 0; } return false; } private: int compCol( const SortParam & sortParam_r, const TableRow & a_r, const TableRow & b_r ) const { const auto & [ byColumn, sortCI ] { sortParam_r }; bool noL = byColumn >= a_r._columns.size(); bool noR = byColumn >= b_r._columns.size(); if ( noL || noR ) { if ( noL && noR ) { using csidetail::simpleAnyTypeComp; const boost::any &lUserData = a_r.userData(); const boost::any &rUserData = b_r.userData(); if ( lUserData.empty() && !rUserData.empty() ) return -1; else if ( !lUserData.empty() && rUserData.empty() ) return 1; else if ( lUserData.empty() && rUserData.empty() ) return 0; else if ( lUserData.type() != rUserData.type() ) { ZYPP_THROW( zypp::Exception( zypp::str::form("Incompatible user types") ) ); } else if ( lUserData.type() == typeid(SolvableCSI) ) { return simpleAnyTypeComp ( lUserData, rUserData ); } else if ( lUserData.type() == typeid(std::string) ) { return simpleAnyTypeComp( lUserData, rUserData ); } else if ( lUserData.type() == typeid(unsigned) ) { return simpleAnyTypeComp( lUserData, rUserData ); } else if ( lUserData.type() == typeid(int) ) { return simpleAnyTypeComp( lUserData, rUserData ); } ZYPP_THROW( zypp::Exception( zypp::str::form("Unsupported user types") ) ); } else return ( noL && ! noR ? -1 : ! noL && noR ? 1 : 0); } return defaultStrComp( sortCI, a_r._columns[byColumn], b_r._columns[byColumn] ); } /** Natural('sort -V' like) [case insensitive] compare ignoring ANSI SGR chars. */ static int defaultStrComp( bool ci_r, const std::string & lhs, const std::string & rhs ); private: std::list _by_columns; }; /** \todo nice idea but poor interface */ class Table { public: using container = std::list; static TableLineStyle defaultStyle; Table & add( TableRow tr ); Table & setHeader( TableHeader tr ); std::ostream & dumpTo( std::ostream & stream ) const; bool empty() const { return _rows.empty(); } /** Unsorted - pseudo sort column indicating not to sort. */ static constexpr unsigned Unsorted = unsigned(-1); /** UserData - sort column using a custom sort index. */ static constexpr unsigned UserData = unsigned(-2); /** Get the default sort column or \ref Unsorted (default) */ unsigned defaultSortColumn() const { return _defaultSortColumn; } /** Set a \ref defaultSortColumn */ void defaultSortColumn( unsigned byColumn_r ) { _defaultSortColumn = byColumn_r; } /** Sort by \ref defaultSortColumn */ void sort() { sort( unsigned(_defaultSortColumn ) ); } /** Sort by \a byColumn_r */ void sort( unsigned byColumn_r ) { if ( byColumn_r != Unsorted ) _rows.sort( TableRow::Less( header(), { byColumn_r } ) ); } void sort( const std::list & byColumns_r ) { if ( byColumns_r.size() ) _rows.sort( TableRow::Less( header(), byColumns_r ) ); } void sort( std::list && byColumns_r ) { if ( byColumns_r.size() ) _rows.sort( TableRow::Less( header(), std::move(byColumns_r) ) ); } /** Custom sort */ template, int> = 0> void sort( TCompare && less_r ) { _rows.sort( std::forward(less_r) ); } void lineStyle( TableLineStyle st ); void wrap( int force_break_after = -1 ); void allowAbbrev( unsigned column ); void margin( unsigned margin ); const TableHeader & header() const { return _header; } const container & rows() const { return _rows; } container & rows() { return _rows; } Table(); private: void dumpRule( std::ostream & stream ) const; void updateColWidths( const TableRow & tr ) const; bool _has_header; TableHeader _header; container _rows; //! maximum column index seen in this table mutable unsigned _max_col; //! maximum width of respective columns mutable std::vector _max_width; //! table width (columns) mutable int _width; //! table line drawing style TableLineStyle _style; //! amount of space we have to print this table int _screen_width; //! whether to abbreviate the respective column if needed std::vector _abbrev_col; //! left/right margin in number of spaces unsigned _margin; //! if _do_wrap is set, first break the table at this column; //! If negative, wrap as needed. int _force_break_after; //! Whether to wrap the table if it exceeds _screen_width bool _do_wrap; zypp::DefaultIntegral _defaultSortColumn; mutable bool _inHeader; friend class TableRow; }; namespace table { /// Table column style setter. /// /// \see \ref CStyle colum styles. /// \code /// th << table::Column( N_("Name"), CStyle::SortCi ); /// \endcode struct Column { Column( std::string header_r, CStyle style_r = CStyle::Default ) : _header( std::move(header_r) ) , _style( style_r ) {} std::string _header; CStyle _style; }; /** \relates table::Column set \ref TableHeader style. */ inline TableHeader & operator<<( TableHeader & th, Column && obj ) { th.style( th.cols(), obj._style ); return th << std::move(obj._header); } /** \relates table::Column set \ref TableHeader style.*/ inline TableHeader && operator<<( TableHeader && th, Column && obj ) { return std::move( th << std::move(obj) ); } } inline Table & operator<<( Table & table, TableRow tr ) { return table.add( std::move(tr) ); } inline Table & operator<<( Table & table, TableHeader tr ) { return table.setHeader( std::move(tr) ); } inline std::ostream & operator<<( std::ostream & stream, const Table & table ) { return table.dumpTo( stream ); } /////////////////////////////////////////////////////////////////// /// \class PropertyTable /// \brief Aligned key/value with multiline support /// Key : value 1 /// LongKey : value 2 /// Multiline : /// line 1 /// line 2 /// Next Key : value 3 /// /////////////////////////////////////////////////////////////////// class PropertyTable { public: PropertyTable() { _table.lineStyle( ztui::Colon ); } static const char * emptyListTag() { return "---"; } public: /////////////////////////////////////////////////////////////////// // Key / Value template PropertyTable & add( const KeyType & key_r ) { _table << ( TableRow() << key_r << "" ); return *this; } template PropertyTable & add( const KeyType & key_r, const ValueType & val_r ) { _table << ( TableRow() << key_r << val_r ); return *this; } template PropertyTable & add( const KeyType & key_r, bool val_r ) { _table << ( TableRow() << key_r << asYesNo( val_r ) ); return *this; } /////////////////////////////////////////////////////////////////// // Key / Value in details (e.g. Description:) template PropertyTable & addDetail( const ValueType & val_r ) { last().addDetail( val_r ); return *this; } template PropertyTable & addDetail( const KeyType & key_r, const ValueType & val_r ) { _table << ( TableRow() << key_r << "" ).addDetail( val_r ); return *this; } /////////////////////////////////////////////////////////////////// // Key / Container template PropertyTable & add( const KeyType & key_r, Iterator_ begin_r, Iterator_ end_r, bool forceDetails_r = false ) { TableRow r; r << key_r; if ( begin_r != end_r ) { unsigned cnt = 1; Iterator_ first = begin_r++; if ( begin_r == end_r && ! forceDetails_r ) r << *first; // only one value else { r.addDetail( *first ); // list all in details while ( begin_r != end_r ) { ++cnt; r.addDetail( *(begin_r++) ); } r << "["+zypp::str::numstring(cnt)+"]"; // size as value } } else { r << emptyListTag(); } // dummy to get the ":" if empty _table << r; return *this; } template PropertyTable & lst( const KeyType & key_r, const ContainerType & lst_r, bool forceDetails_r = false ) { return add( key_r, lst_r.begin(), lst_r.end(), forceDetails_r ); } template PropertyTable & add( const KeyType & key_r, const std::set & lst_r, bool forceDetails_r = false ) { return lst( key_r, lst_r, forceDetails_r ); } template PropertyTable & add( const KeyType & key_r, const std::list & lst_r, bool forceDetails_r = false ) { return lst( key_r, lst_r, forceDetails_r ); } template PropertyTable & add( const KeyType & key_r, const std::vector & lst_r, bool forceDetails_r = false ) { return lst( key_r, lst_r, forceDetails_r ); } /////////////////////////////////////////////////////////////////// // misc PropertyTable & paint( ansi::Color color_r, bool cond_r = true ) { if ( cond_r ) { // FIXME re-coloring like this works only once std::string & lastval( _table.rows().back().columns().back() ); lastval = ColorString( lastval, color_r ).str(); } return *this; } TableRow & last() { return _table.rows().back(); } std::string & lastKey() { return last().columns()[0]; } std::string & lastValue() { return last().columns()[1]; } public: friend std::ostream & operator << ( std::ostream & str, const PropertyTable & obj ) { return str << obj._table; } private: Table _table; }; } // Local Variables: // c-basic-offset: 2 // End: #endif libzypp-17.36.5/zypp-tui/application.cc000066400000000000000000000041371476576476200200360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include "application.h" #include #include namespace ztui { namespace { Application **getApplicationInstance () { thread_local Application *app = nullptr; return &app; } } Application::Application() : _exitCode(ZTUI_EXIT_OK) , _config( new Config() ) { init(); } Application::Application(std::shared_ptr &&cfg) : _exitCode(ZTUI_EXIT_OK) , _config( std::move(cfg) ) { init(); } void Application::init() { // ALWAYS do this FIRST! *getApplicationInstance() = this; _out = std::make_shared(); } Application::~Application() { // set the thread local global to null again *getApplicationInstance() = nullptr; } Application &Application::instance() { auto instPtr = *getApplicationInstance (); if ( !instPtr ) ZYPP_THROW( zypp::Exception("No ztui::Application intance registered, its required to create one manually before using ztui.") ); return *instPtr; } const Config &Application::config() const { return *_config; } Config &Application::mutableConfig() { return *_config; } Out &Application::out() { if ( not _out ) { _out.reset(new OutNormal( Out::QUIET )); } return *_out; } void Application::setOutputWriter(Out *out) { if ( out == _out.get() ) return; _out.reset ( out ); } void Application::setExitCode(int exit) { WAR << "setExitCode " << exit << std::endl; _exitCode = exit; } } libzypp-17.36.5/zypp-tui/application.h000066400000000000000000000031331476576476200176730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_TUIAPPLICATION_INCLUDED #define ZYPP_TUI_TUIAPPLICATION_INCLUDED #include #include #include namespace ztui { class Out; static constexpr int ZTUI_EXIT_OK = 0; class Application : private zypp::base::NonCopyable { public: Application(); virtual ~Application(); /*! * Returns the \ref Application instance for the current thread after it * was created. */ static Application & instance(); const Config &config () const; Config &mutableConfig(); virtual Out & out(); virtual void setOutputWriter( Out * out ); int exitCode() const { return _exitCode; } void setExitCode( int exit ); protected: Application ( std::shared_ptr &&cfg ); private: void init(); int _exitCode; std::shared_ptr _config; std::shared_ptr _out; }; } #endif libzypp-17.36.5/zypp-tui/config.cc000066400000000000000000000027751476576476200170060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include "config.h" #include #include #include namespace ztui { Config::Config() : do_ttyout ( mayUseANSIEscapes() ) , do_colors ( hasANSIColor() ) , color_result (ansi::Color::fromString("default")) , color_msgStatus (ansi::Color::fromString("default")) , color_msgError (ansi::Color::fromString("red")) , color_msgWarning (ansi::Color::fromString("purple")) , color_prompt (ansi::Color::fromString("bold")) , color_promptOption(ansi::Color::nocolor()) // follow color_prompt , color_positive (ansi::Color::fromString("green")) , color_change (ansi::Color::fromString("brown")) , color_negative (ansi::Color::fromString("red")) , color_highlight (ansi::Color::fromString("cyan")) , color_lowlight (ansi::Color::fromString("brown")) , color_osdebug (ansi::Color::fromString("default") < ansi::Color::Attr::Reverse) { } } libzypp-17.36.5/zypp-tui/config.h000066400000000000000000000031731476576476200166410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_CONFIG_INCLUDED #define ZYPP_TUI_CONFIG_INCLUDED #include namespace ztui { class Config { public: Config (); /** * True unless output is a dumb tty or file. In this case we should not use * any ANSI Escape sequences (at least those moving the cursor; color may * be explicitly enabled 'zypper --color ..| less' */ bool do_ttyout; /** * Whether to colorize the output. This is evaluated according to * color_useColors and do_ttyout. */ bool do_colors; ansi::Color color_result; ansi::Color color_msgStatus; ansi::Color color_msgError; ansi::Color color_msgWarning; ansi::Color color_prompt; ansi::Color color_promptOption; ansi::Color color_positive; ansi::Color color_change; ansi::Color color_negative; ansi::Color color_highlight; ansi::Color color_lowlight; ansi::Color color_osdebug; }; } #endif libzypp-17.36.5/zypp-tui/output/000077500000000000000000000000001476576476200165575ustar00rootroot00000000000000libzypp-17.36.5/zypp-tui/output/AliveCursor.h000066400000000000000000000032461476576476200211730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_OUTPUT_ALIVE_CURSOR_H #define ZYPP_TUI_OUTPUT_ALIVE_CURSOR_H #include namespace ztui { class AliveCursor { public: friend std::ostream & operator<<( std::ostream & str, const AliveCursor & obj ); AliveCursor() : _current('-') {} char current() const { return _current; } void increase() { switch ( _current ) { case '-': _current = '\\'; break; case '\\': _current = '|'; break; case '|': _current = '/'; break; case '/': _current = '-'; break; } } AliveCursor & operator++() { increase(); return *this; } AliveCursor & operator++(int) { increase(); return *this; } AliveCursor & done() { _current = '*'; return *this; } private: char _current; }; /** \relates Date Stream output */ inline std::ostream & operator<<( std::ostream & str, const AliveCursor & obj ) { return str << obj.current(); } } #endif libzypp-17.36.5/zypp-tui/output/Out.cc000066400000000000000000000134611476576476200176420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include "Out.h" #include #include #include "Utf8.h" namespace ztui { namespace text { // translator: usually followed by a ' ' and some explanatory text ColorString tagNote() { return HIGHLIGHTString(_("Note:") ); } // translator: usually followed by a ' ' and some explanatory text ColorString tagWarning() { return MSG_WARNINGString(_("Warning:") ); } // translator: usually followed by a ' ' and some explanatory text ColorString tagError() { return MSG_ERRORString(_("Error:") ); } const char * qContinue() { return _("Continue?"); } } /////////////////////////////////////////////////////////////////// namespace out { unsigned defaultTermwidth() { return Application::instance().out().termwidth(); } } // namespace out /////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // class TermLine //////////////////////////////////////////////////////////////////////////////// std::string TermLine::get( unsigned width_r, SplitFlags flags_r, char exp_r ) const { utf8::string l(lhs); // utf8::string::size() returns visible chars (ignores ansi SGR)! utf8::string r(rhs); if ( width_r == out::termwidthUnlimited ) return zypp::str::Str() << l << r; // plain string if zero width unsigned llen = l.size(); unsigned rlen = r.size(); int diff = width_r - llen - rlen; //AutoDispose _delay( 1, ::sleep ); if ( diff > 0 ) { // expand... if ( ! ( flags_r.testFlag( SF_EXPAND ) && ::isatty(STDOUT_FILENO) ) ) return zypp::str::Str() << l << r; if ( percentHint < 0 || percentHint > 100 ) return zypp::str::Str() << l << std::string( diff, exp_r ) << r; // else: draw % indicator // ------- // <1%>=== // .<99%>= // .<100%> if ( percentHint == 0 ) return zypp::str::Str() << l << std::string( diff, '-' ) << r; unsigned pc = diff * percentHint / 100; // diff > 0 && percentHint > 0 if ( diff < 6 ) // not enough space for fancy stuff return zypp::str::Str() << l << std::string( pc, '.' ) << std::string( diff-pc, '=' ) << r; // else: less boring std::string tag( zypp::str::Str() << '<' << percentHint << "%>" ); pc = pc > tag.size() ? (diff - tag.size()) * percentHint / 100 : 0; return zypp::str::Str() << l << std::string( pc, '.' ) << tag << std::string( diff-pc-tag.size(), '=' ) << r; } else if ( diff < 0 ) { // truncate... if ( flags_r.testFlag( SF_CRUSH ) ) { if ( rlen > width_r ) return r.substr( 0, width_r ).str(); return zypp::str::Str() << l.substr( 0, width_r - rlen ) << r; } else if ( flags_r.testFlag( SF_SPLIT ) ) { zypp::str::Str out; if ( llen > width_r ) mbs_write_wrapped( out.stream(), l.str(), 0, width_r ); else out << l; return out << "\n" << ( rlen > width_r ? r.substr( 0, width_r ) : std::string( width_r - rlen, ' ' ) + r ); } // else: return zypp::str::Str() << l << r; } // else: fits exactly return zypp::str::Str() << l << r; } //////////////////////////////////////////////////////////////////////////////// // class Out //////////////////////////////////////////////////////////////////////////////// constexpr Out::Type Out::TYPE_NONE; constexpr Out::Type Out::TYPE_ALL; Out::~Out() {} bool Out::progressFilter() { return verbosity() < Out::NORMAL; } std::string Out::zyppExceptionReport(const zypp::Exception & e) { return e.asUserHistory(); } void Out::searchResult( const Table & table_r ) { std::cout << table_r; } void Out::progressEnd( const std::string & id, const std::string & label, ProgressEnd donetag_r ) { // translator: Shown as result tag in a progress bar: ............[done] static const std::string done { _("done") }; // translator: Shown as result tag in a progress bar: .......[attention] static const std::string attention { MSG_WARNINGString(_("attention")).str() }; // translator: Shown as result tag in a progress bar: ...........[error] static const std::string error { MSG_ERRORString(_("error")).str() }; const std::string & donetag { donetag_r==ProgressEnd::done ? done : donetag_r==ProgressEnd::error ? error : attention }; progressEnd( id, label, donetag, donetag_r==ProgressEnd::error ); } //////////////////////////////////////////////////////////////////////////////// // class Out::Error //////////////////////////////////////////////////////////////////////////////// int Out::Error::report( Application & app_r ) const { if ( ! ( _msg.empty() && _hint.empty() ) ) app_r.out().error( _msg, _hint ); if ( _exitcode != ZTUI_EXIT_OK ) // ZTUI_EXIT_OK indicates exitcode is already set. app_r.setExitCode( _exitcode ); return app_r.exitCode(); } std::string Out::Error::combine( std::string && msg_r, const zypp::Exception & ex_r ) { if ( msg_r.empty() ) { msg_r = combine( ex_r ); } else { msg_r += "\n"; msg_r += combine( ex_r ); } return std::move(msg_r); } std::string Out::Error::combine( const zypp::Exception & ex_r ) { return Application::instance().out().zyppExceptionReport( ex_r ); } } libzypp-17.36.5/zypp-tui/output/Out.h000066400000000000000000001217531476576476200175100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef OUT_H_ #define OUT_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace ztui { class Application; /// ProgressBars default end tags. enum class ProgressEnd { done, attention, error }; namespace text { ColorString tagNote(); ///< translated "Note:" highlighted ColorString tagWarning(); ///< translated "Warning:" warning color ColorString tagError(); ///< translated "Error:" error color const char * qContinue(); ///< translated "Continue?" /** Simple join of two string types */ template inline std::string join( const Tltext & ltext, const Trtext & rtext, const char * sep = " " ) { std::string ret( zypp::str::asString(ltext) ); ret += sep; ret += zypp::str::asString(rtext); return ret; } /** Whether the \a str_r ends with a WS. */ inline bool endsOnWS( const std::string & str_r ) { bool ret = false; if ( !str_r.empty() ) { int l = *str_r.rbegin(); if ( ::strchr( " \n\t", l ) ) ret = true; } return ret; } inline const char * optBlankAfter( const std::string & str_r ) { return( endsOnWS( str_r ) ? "" : " " ); } } namespace out { static constexpr unsigned termwidthUnlimited = 0u; unsigned defaultTermwidth(); // Zypper::instance().out().termwidth() } // namespace out namespace out { /*! * \class ListLayout * \brief Basic list layout * \todo fix design made in eile */ struct ListLayout { template struct Writer; ListLayout( bool singleline_r, bool wrapline_r, bool gaped_r, unsigned indent_r ) : _singleline( singleline_r ) , _wrapline( wrapline_r ) , _gaped( gaped_r ) , _indent( indent_r ) {} bool _singleline; ///< one list element per line bool _wrapline; ///< fold lines longer than \c _linewidth bool _gaped; ///< add extra NL before element (if singleline) unsigned _indent; ///< amount of indent }; namespace detail { template struct ListLayoutInit : public ListLayout { ListLayoutInit() : ListLayout( singleline_, wrapline_, gaped_, indent_ ) {} }; } using XmlListLayout = detail::ListLayoutInit; using DefaultListLayout = detail::ListLayoutInit; ///< one element per line, no indent using DefaultGapedListLayout = detail::ListLayoutInit; ///< one element per line, no indent, gaped using IndentedListLayout = detail::ListLayoutInit; ///< one element per line, indented using IndentedGapedListLayout = detail::ListLayoutInit;///< one element per line, indented, gaped using CompressedListLayout = detail::ListLayoutInit; ///< multiple elements per line, indented /*! * \class TableLayout * \brief Basic table layout */ struct TableLayout { template struct Writer; }; using DefaultTableLayout = TableLayout; ///< Simple Table // Either specialize per Type or define a custom Formater: /** \relates XmlFormater XML representation of types [no default] */ template std::string asXmlListElement( const Tp & val_r ); inline std::string asXmlListElement( const std::string & val_r ){ return val_r; } inline std::string asXmlListElement( const char * val_r ) { return val_r; } /** \relates ListFormater NORMAL representation of types in lists [no default] */ template std::string asListElement( const Tp & val_r ); inline std::string asListElement( const std::string & val_r ) { return val_r; } inline std::string asListElement( const char * val_r ) { return val_r; } /** \relates TableFormater NORMAL representation of types as TableHeader [no default] */ template TableHeader asTableHeader(); template <> inline TableHeader asTableHeader() { return TableHeader(); } /** \relates TableFormater NORMAL representation of types as TableRow [no default] */ template TableRow asTableRow( const Tp & val_r ); /////////////////////////////////////////////////////////////////// /// \class XmlFormater /// \brief XML representation of types in container [asXmlListElement] /////////////////////////////////////////////////////////////////// struct XmlFormater { template std::string xmlListElement( const Tp & val_r ) const//< XML representation of element { return asXmlListElement( val_r ); } }; /////////////////////////////////////////////////////////////////// /// \class ListFormater /// \brief Default representation of types in Lists [asListElement] /////////////////////////////////////////////////////////////////// struct ListFormater : public XmlFormater { using NormalLayout = DefaultListLayout; //< ListLayout for NORMAL lists template std::string listElement( const Tp & val_r ) const //< NORMAL representation of list element { return asListElement( val_r ); } }; /////////////////////////////////////////////////////////////////// /// \class TableFormater /// \brief Special list formater writing a Table [asTableHeader|asTableRow] /////////////////////////////////////////////////////////////////// struct TableFormater : public XmlFormater { using NormalLayout = DefaultTableLayout; //< NORMAL layout as Table TableHeader header() const //< TableHeader for TableRow representation { return asTableHeader<>(); } template //< Representation as TableRow TableRow row( const Tp & val_r ) const { return asTableRow( val_r ); } }; /////////////////////////////////////////////////////////////////// /// \class XmlFormaterAdaptor /// \brief Adaptor mapping xmlListElement->listElement for container XML output /////////////////////////////////////////////////////////////////// /** Adaptor */ template struct XmlFormaterAdaptor { using NormalLayout = XmlListLayout; //< Layout as XML list template std::string listElement( const Tp & val_r ) const //< use TFormater::asXmlListElement { return _formater.xmlListElement( val_r ); } XmlFormaterAdaptor( const TFormater & formater_r ) : _formater( formater_r ) {} private: const TFormater & _formater; }; } // namespace out /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace out { /////////////////////////////////////////////////////////////////// /// \class ListLayout::Writer /// \brief Write out a List according to the layout // TODO: wrap singlelines; support for attributed text; /////////////////////////////////////////////////////////////////// template struct ListLayout::Writer { NON_COPYABLE( Writer ); Writer( std::ostream & str_r, const ListLayout & layout_r, const TFormater & formater_r ) : _str( str_r ) , _layout( layout_r ) , _formater( formater_r ) , _linewidth( defaultTermwidth() ) , _indent( _layout._indent, ' ' ) {} ~Writer() { if ( !_layout._singleline && _cpos ) _str << std::endl; } template void operator<<( Tp && val_r ) const { const std::string & element( _formater.listElement( std::forward(val_r) ) ); if ( _layout._singleline ) { if ( _layout._gaped ) _str << std::endl; _str << _indent << element << std::endl; } else { if ( _cpos != 0 && ! fitsOnLine( 1/*' '*/ + element.size() ) ) endLine(); if ( _cpos == 0 ) { if ( !_indent.empty() ) printAndCount( _indent ); } else printAndCount( " " ); printAndCount( element ); } } private: bool fitsOnLine( unsigned size_r ) const { return( !_layout._wrapline || _linewidth == out::termwidthUnlimited || _cpos + size_r <= _linewidth ); } void printAndCount( const std::string & element_r ) const { _cpos += element_r.size(); _str << element_r; } void endLine() const { _str << std::endl; _cpos = 0U; } private: std::ostream & _str; const ListLayout & _layout; const TFormater & _formater; const unsigned _linewidth; ///< desired line width const std::string _indent; mutable unsigned _cpos = 0U; }; /////////////////////////////////////////////////////////////////// /// \class TableLayout::Writer /// \brief Write out a Table according to the layout /////////////////////////////////////////////////////////////////// template struct TableLayout::Writer { NON_COPYABLE( Writer ); Writer( std::ostream & str_r, const TableLayout & layout_r, const TFormater & formater_r ) : _str( str_r ) , _layout( layout_r ) , _formater( formater_r ) {} ~Writer() { if ( !_t.empty() ) { _t.setHeader( _formater.header() ); _str << _t; } } template void operator<<( Tp && val_r ) const { _t.add( _formater.row( std::forward(val_r) ) ); } private: std::ostream & _str; const TableLayout & _layout; const TFormater & _formater; mutable Table _t; }; /** Write formatted container to stream */ template void writeContainer( std::ostream & str_r, const TContainer & container_r, const TFormater & formater_r, const TLayout & layout_r = TLayout() ) { typedef typename TLayout::template Writer Writer; Writer writer( str_r, layout_r, formater_r ); for ( auto && el : container_r ) writer << el; } /** Write XML formatted container to stream */ template void xmlWriteContainer( std::ostream & str_r, const TContainer & container_r, const TFormater & formater_r ) { writeContainer( str_r, container_r, out::XmlFormaterAdaptor(formater_r) ); } } // namespace out /////////////////////////////////////////////////////////////////// // Too simple on small terminals as esc-sequences may get truncated. // A table like writer for attributed strings is desirable. struct TermLine { enum SplitFlag { SF_CRUSH = 1<<0, //< truncate lhs, then rhs SF_SPLIT = 1<<1, //< split line across two SF_EXPAND = 1<<2 //< expand short lines iff stdout is a tty }; ZYPP_DECLARE_FLAGS( SplitFlags, SplitFlag ); TermLine( SplitFlags flags_r, char exp_r ) : flagsHint( flags_r ), expHint( exp_r ) {} TermLine( SplitFlags flags_r ) : flagsHint( flags_r ) {} TermLine( char exp_r ) : expHint( exp_r ) {} TermLine() {} SplitFlags flagsHint; //< flags to use if not passed to \ref get zypp::DefaultIntegral expHint; //< expand char to use if not passed to \ref get zypp::DefaultIntegral percentHint; //< draw progress indicator in expanded space if in [0,100] zypp::str::Str lhs; //< left side zypp::str::Str rhs; //< right side /** Return plain line made of lhs + rhs */ std::string get() const { return std::string(lhs) + std::string(rhs); } /** Return line optionally formatted according to \a width_r and \a flags_r. * If \a width_r or \a flags_r is zero a plain line made of lhs + rhs is returned. */ std::string get( unsigned width_r, SplitFlags flags_r, char exp_r ) const; /** \overload */ std::string get( unsigned width_r, SplitFlags flags_r ) const { return get( width_r, flags_r, expHint ); } /** \overload */ std::string get( unsigned width_r, char exp_r ) const { return get( width_r, flagsHint, exp_r ); } /** \overload */ std::string get( unsigned width_r ) const { return get( width_r, flagsHint, expHint ); } }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS( TermLine::SplitFlags ); /** * Base class for producing common (for now) zypper output. * * This is an abstract class providing interface for writing output like * info messages, warnings, error messages, user prompts, progress reports, * and download progress reports. See descriptions of the methods for more * details. * * The output is produced using Out derived class instances. * * * * // create output object * SomePointerType out; * if (options.count("xmlout")) * out = new OutXML(); * else * out = new OutNormal(); * * out->info("output instance ready to use", Out::HIGH); * out->info("Doing foo"); * try * { * foo(); * out->prompt(PROMPT_FOO, "Need your action?", "y/n"); // see output/prompt.h * if (action()) * out->info("result", Out::QUIET); // always show the result * else * cout << "special result" << endl; // special output must be done * // the usual way for now * } * catch(const Exception & e) * { * out->error(e, "Problem doing foo", "Do 'bar' to deal with this"); * } * * */ class Out : private zypp::base::NonCopyable { public: /** Verbosity levels. */ typedef enum { QUIET = 0, ///< Only important messages (no progress or status, only the result). NORMAL = 1, ///< Default output verbosity level. Progress for important tasks, moderate ///< amount of status messages, operation information, result. HIGH = 2, ///< More detailed description of the operations. DEBUG = 3 ///< \todo drop this level in favor of zypper.log? } Verbosity; /** Known output types implemented by derived classes. */ enum TypeBit { TYPE_NORMAL = 0x01<<0, ///< plain text output TYPE_XML = 0x01<<1 ///< xml output }; ZYPP_DECLARE_FLAGS(Type,TypeBit); static constexpr Type TYPE_NONE = Type(0x00); static constexpr Type TYPE_ALL = Type(0xff); using PromptId = unsigned; protected: Out(TypeBit type, Verbosity verbosity = NORMAL) : _verbosity(verbosity), _type(type) {} public: virtual ~Out(); protected: /////////////////////////////////////////////////////////////////// /// \class ParentOut /// \brief Convenience base class storing the back reference to Out. struct ParentOut { ParentOut( Out & out_r ) : _out( out_r ) {} Out & out() { return _out; } private: Out & _out; }; public: /////////////////////////////////////////////////////////////////// /// \class XmlNode /// \brief XML only: RAII writing a XML nodes start/end tag /// \code /// { /// XmlNode( "node", { "attr", "val" } ); // /// ... /// } // /// \endcode struct XmlNode : protected ParentOut { using Attr = zypp::xmlout::Node::Attr; /** Ctor taking nodename and attribute list. */ XmlNode( Out & out_r, const std::string & name_r, const std::initializer_list & attrs_r = {} ) : ParentOut( out_r ) { if ( out().typeXML() && ! name_r.empty() ) { _node.reset( new zypp::xmlout::Node( std::cout, name_r, attrs_r ) ); } } /** Convenience ctor for one attribute pair */ XmlNode( Out & out_r, const std::string & name_r, Attr attr_r ) : XmlNode( out_r, name_r, { std::move(attr_r) } ) {} /** Move ctor */ XmlNode( XmlNode && rhs ) noexcept : ParentOut( rhs ) { _node.swap( rhs._node ); } private: zypp::scoped_ptr _node; }; /////////////////////////////////////////////////////////////////// /** XML only: Write a leaf node without PCDATA * \code * * \endcode */ void xmlNode( const std::string & name_r, const std::initializer_list & attrs_r = {} ) { if ( typeXML() ) { zypp::xmlout::node( std::cout, name_r, attrs_r ); } } /** \overload for one attribute pair */ void xmlNode( const std::string & name_r, XmlNode::Attr attr_r ) { xmlNode( name_r, { std::move(attr_r) } ); } /////////////////////////////////////////////////////////////////// /// \class TitleNode /// \brief XmlNode with optional normal text headline (NL appended) struct TitleNode : public XmlNode { TitleNode( XmlNode && node_r, const std::string & title_r = "" ) : XmlNode( std::move(node_r) ) { if ( out().typeNORMAL() && ! title_r.empty() ) std::cout << title_r << std::endl; } }; private: /** Write container creating a TitleNode with \c size="nnn" attribute and * replacing optional \c %1% in \a title_r with size. */ template void container( const std::string & nodeName_r, const std::string & title_r, const TContainer & container_r, const TFormater & formater_r ) { TitleNode guard( XmlNode( *this, nodeName_r, XmlNode::Attr( "size", zypp::str::numstring( container_r.size() ) ) ), zypp::str::Format( title_r ) % container_r.size() ); switch ( type() ) { case TYPE_NORMAL: writeContainer( std::cout, container_r, formater_r ); break; case TYPE_XML: ztui::out::xmlWriteContainer( std::cout, container_r, formater_r ); break; } } public: /** Write list from container creating a TitleNode with \c size="nnn" attribute and * replacing optional \c %1% in \a title_r with size. */ template void list( const std::string & nodeName_r, const std::string & title_r, const TContainer & container_r, const TFormater & formater_r = TFormater() ) { container( nodeName_r, title_r, container_r, formater_r ); } /** Write table from container creating a TitleNode with \c size="nnn" attribute and * replacing optional \c %1% in \a title_r with size. */ template void table( const std::string & nodeName_r, const std::string & title_r, const TContainer & container_r, const TFormater & formater_r = TFormater() ) { container( nodeName_r, title_r, container_r, formater_r ); } public: /** NORMAL: An empty line */ void gap() { if ( type() == TYPE_NORMAL ) std::cout << std::endl; } void printRichText( std::string text, unsigned indent_r = 0U ) { ztui::printRichText( std::cout, std::move(text), indent_r, termwidth() ); } /** Less common Paragraph formats */ struct ParFormat // placeholder until we need it {}; /** Paragraph of text, optionally indented, or without leading gap */ template void par( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() ) { gap(); // if needed make it optional via ParFormat zypp::str::Str formated; mbs_write_wrapped( formated.stream(), zypp::str::asString(text_r), indent_r, defaultFormatWidth( 100 ) ); info( formated ); } /** \overload convenience for unindented */ template void par( const Text & text_r, ParFormat format_r = ParFormat() ) { par( 0, text_r, format_r ); } /** Paragraph of text preceded by 'tag_r' and a ' ' */ template void taggedPar( size_t indent_r, const TText & tag_r, const Text & text_r, ParFormat format_r = ParFormat() ) { par( indent_r, text::join( tag_r, text_r ), format_r ); } /** \overload convenience for unindented par */ template void taggedPar( const TText & tag_r, const Text & text_r, ParFormat format_r = ParFormat() ) { taggedPar( 0, tag_r, text_r, format_r ); } /** Paragraph tagged with 'Note: ' */ template void notePar( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() ) { taggedPar( indent_r, text::tagNote(), text_r, format_r ); } /** \overload convenience for unindented par */ template void notePar( const Text & text_r, ParFormat format_r = ParFormat() ) { notePar( 0, text_r, format_r ); } /** Paragraph tagged with 'Warning: ' */ template void warningPar( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() ) { taggedPar( indent_r, text::tagWarning(), text_r, format_r ); } /** \overload convenience for unindented par */ template void warningPar( const Text & text_r, ParFormat format_r = ParFormat() ) { warningPar( 0, text_r, format_r ); } /** Paragraph tagged with 'Error: ' */ template void errorPar( size_t indent_r, const Text & text_r, ParFormat format_r = ParFormat() ) { taggedPar( indent_r, text::tagError(), text_r, format_r ); } /** \overload convenience for unindented par */ template void errorPar( const Text & text_r, ParFormat format_r = ParFormat() ) { errorPar( 0, text_r, format_r ); } public: /** * Show an info message. * * \param msg The message to be displayed. * \param verbosity Minimal level o verbosity in which the message will be * shown. Out::QUIET means the message will be always be * displayed. Out::HIGH means the message will be displayed * only if the current verbosity level is HIGH (-v) or DEBUG * (-vv). * \param mask Determines the types of output for which is this message * intended. By default, the message will be shown in all * types of output. */ virtual void info(const std::string & msg, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL) = 0; /** \overload concatenating 2 strings (e.g. translated and untranslated parts) */ void info( std::string msg, const std::string & msg2, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL ) { info( (msg+=msg2), verbosity, mask ); } /** \ref info taking a \ref TermLine */ virtual void infoLine(const TermLine & msg_r, Verbosity verbosity_r = NORMAL, Type mask_r = TYPE_ALL) { info( msg_r.get(), verbosity_r, mask_r ); } struct Info : protected ParentOut { NON_COPYABLE( Info ); Info( Out & out_r ) : ParentOut( out_r ) , _str( new std::ostringstream ) {} Info( Out::Info && rhs ) noexcept : ParentOut( rhs ) , _str( std::move(rhs._str) ) {} ~Info() { out().info( _str->str() ); } template std::ostream & operator<<( const Tp & val ) { return (*_str) << val; /*return *this;*/ } operator std::ostream &() { return *_str; } std::ostream & stream() { return *_str; } private: std::unique_ptr _str; // work around missing move ctor }; Info info() { return Info( *this ); } /** Info message, 2 strings L/R-adjusted. */ void infoLR( const std::string & lmsg, const std::string & rmsg, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL ) { TermLine outstr( TermLine::SF_SPLIT | TermLine::SF_EXPAND ); outstr.lhs << lmsg; outstr.rhs << ' ' << rmsg; infoLine( outstr, verbosity, mask ); } /** Info message with R-adjusted "(hint)". */ void infoLRHint( const std::string & lmsg, const std::string & hint, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL ) { TermLine outstr( TermLine::SF_SPLIT | TermLine::SF_EXPAND ); outstr.lhs << lmsg; outstr.rhs << " (" << hint << ')'; infoLine( outstr, verbosity, mask ); } /** * Show a warning. * * \param msg The warning message to be displayed. * \param verbosity Minimal level o verbosity in which the message will be * shown. Out::QUIET means the message will be always be * displayed. Out::HIGH means the message will be displayed * only if the current verbosity level is HIGH (-v) or DEBUG * (-vv). * \param mask Determines the types of output for which is this message * intended. By default, the message will be shown in all * types of output. */ virtual void warning(const std::string & msg, Verbosity verbosity = NORMAL, Type mask = TYPE_ALL) = 0; /** Convenience class for error reporting. */ struct Error; /** * Show an error message and an optional hint. * * An error message should be shown regardless of the verbosity level. * * \param problem_desc Problem description (what happened) * \param hint Hint for the user (what to do, or explanation) */ virtual void error(const std::string & problem_desc, const std::string & hint = "") = 0; /** * Prints the problem description caused by an exception, its cause and, * optionally, a hint for the user. * * \param e Exception which caused the problem. * \param Problem description for the user. * \param Hint for the user how to cope with the problem. */ virtual void error(const zypp::Exception & e, const std::string & problem_desc, const std::string & hint = "") = 0; //! \todo provide an error() method with a/r/i prompt, more read_action_ari here /** \name Progress of an operation. */ //@{ /** Convenience class for progress output. */ class ProgressBar; /** * Start of an operation with reported progress. * * \param id Identifier. Any string used to match multiple overlapping * progress reports (doesn't happen now, * but probably will in the future). * \param label Progress description. * \param is_tick false for known progress percentage, true * for 'still alive' notifications */ virtual void progressStart(const std::string & id, const std::string & label, bool is_tick = false) = 0; /** * Progress report for an on-going operation. * * \param id Identifier. Any string used to match multiple overlapping * progress reports. * \param label Progress description. * \param value Percentage value or -1 if unknown ('still alive' * notification) */ virtual void progress(const std::string & id, const std::string & label, int value = -1) = 0; /** * End of an operation with reported progress. * * \param id Identifier. Any string used to match multiple overlapping * progress reports. * \param label Progress description. * \param donetag Optional string overwriting the default [done]/[error] tags. * \param error false if the operation finished with success, * true otherwise. */ virtual void progressEnd(const std::string & id, const std::string & label, const std::string & donetag, bool error = false) = 0; /** \overload using the default [done]/[attention]/[error] tags in screen output. depending on \a donetag. */ void progressEnd( const std::string & id, const std::string & label, ProgressEnd donetag ); /** \overload using the default [done]/[error] tags in screen output depending on \a error. */ void progressEnd( const std::string & id, const std::string & label, bool error = false ) { progressEnd( id, label, error ? ProgressEnd::error : ProgressEnd::done ); } //@} /** \name Download progress with download rate */ //@{ /** * Reoprt start of a download. * * \param uri Uri of the file to download. */ virtual void dwnldProgressStart(const zypp::Url & uri) = 0; /** * Reports download progress. * * \param uri Uri of the file being downloaded. * \param value Value of the progress in percents. -1 if unknown. * \param rate Current download rate in B/s. -1 if unknown. */ virtual void dwnldProgress(const zypp::Url & uri, int value = -1, long rate = -1) = 0; /** * Reports end of a download. * * \param uri Uri of the file to download. * \param rate Average download rate at the end. -1 if unknown. * \param error Error flag - did the download finish with error? \c indeterminate == 'not found' */ virtual void dwnldProgressEnd(const zypp::Url & uri, long rate = -1, zypp::TriBool error = false) = 0; //@} /** * Print out a search result. * * Default implementation prints \a table_r on \c stdout. * * \param table_r Table containing the search result. * * \todo Using a more generic format than a Table is desired. */ virtual void searchResult( const Table & table_r ); /** * Prompt the user for a decision. * * \param id Unique prompt identifier for use by machines. * \param prompt Prompt text. * \param options A PromptOptions object * \param startdesc Initial detailed description of the prompt to be * prepended to the \a prompt text. Should be used * only whe prompting for the first time and left empty * when retrying after an invalid answer has been given. * \see prompt.h * \see ../zypper-prompt.h */ virtual void prompt(PromptId id, const std::string & prompt, const PromptOptions & poptions, const std::string & startdesc = "") = 0; /** * Print help for prompt, if available. * This method should be called after '?' prompt option has been entered. */ virtual void promptHelp(const PromptOptions & poptions) = 0; public: /** Get current verbosity. */ Verbosity verbosity() const { return _verbosity; } /** Set current verbosity. */ void setVerbosity(Verbosity verbosity) { _verbosity = verbosity; } /** Convenience macro for exception safe scoped verbosity change * \code * { * // shut up zypper * SCOPED_VERBOSITY( Zypper::instance().out(), Out::QUIET ); * // expands to: * // const auto & raii __attribute__ ((__unused__))( Zypper::instance().out().scopedVerbosity( Out::QUIET ) ); * ... * // leaving the block restores previous verbosity * } * \endcode */ #define SCOPED_VERBOSITY( OUT, LEVEL ) const auto & raii __attribute__ ((__unused__))( (OUT).scopedVerbosity( LEVEL )) /** Return RAII class for exception safe scoped verbosity change. */ zypp::DtorReset scopedVerbosity( Verbosity verbosity_r ) { std::swap( _verbosity, verbosity_r ); return zypp::DtorReset( _verbosity, verbosity_r ); } /** Hint for a handler whether config would allow to use colors. */ virtual void setUseColors( bool yesno ) {} public: /** Return the type of the instance. */ TypeBit type() const { return _type; } /** Test for a specific type */ bool type( TypeBit type_r ) const { return type() == type_r; } /** \overload test for TYPE_NORMAL */ bool typeNORMAL() const { return type( TYPE_NORMAL ); } /** \overload test for TPE_XML */ bool typeXML() const { return type( TYPE_XML ); } /** Terminal width or 150 if unlimited. * If a \a desired_r value is given, return the * closest width that fits the terminal. */ unsigned defaultFormatWidth( unsigned desired_r = 0 ) const { unsigned ret = termwidth(); if ( ret == out::termwidthUnlimited ) ret = desired_r ? desired_r : 150U; else if ( desired_r < ret ) ret = desired_r; return ret; } /** Width for formatted output [0==unlimited]. */ virtual unsigned termwidth() const { return out::termwidthUnlimited; } protected: /** * Determine whether the output is intended for the particular type. */ virtual bool mine(Type type) = 0; /** * Determine whether to show progress. * * \return true if the progress should be filtered out, * false if it should be shown. */ virtual bool progressFilter(); /** * Return a Exception as a string suitable for output. */ virtual std::string zyppExceptionReport(const zypp::Exception & e); private: Verbosity _verbosity; const TypeBit _type; }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Out::Type); /////////////////////////////////////////////////////////////////// /// \class Out::ProgressBar /// \brief Convenience class for progress output. /// /// Progress start and end messages are provided upon object /// construction and deletion. Progress data are sent through a /// ProgressData object accessible via \ref operator->. /// /// \code /// { /// Out::ProgressBar report( _zypper.out(), "Prepare action" ); /// for ( unsigned i = 0; i < 10; ++ i ) /// { /// report->tick(); // turn wheel /// sleep(1); /// } /// report->range( 10 ); // switch to percent mode [0,10] /// report.print( "Running action" ); /// for ( unsigned i = 0; i < 10; ++ i ) /// { /// report-> /// report->set( i ); // send 0%, 10%, ... /// sleep(1); /// } /// // report.error( "Action failed" ); /// } /// \endcode /// /// If non zero values for \a current_r or \a total_r are passed to /// the ctor, the label is prefixed by either "(#C)" or "(#C/#T)" /// /// \todo ProgressData provides NumericId which might be used as /// id for_out.progress*(). /////////////////////////////////////////////////////////////////// class Out::ProgressBar : private zypp::base::NonCopyable { public: /** Indicator type for ctor not drawing an initial start bar. */ struct NoStartBar {}; /** Indicator argument for ctor not drawing an initial start bar.*/ static constexpr NoStartBar noStartBar = NoStartBar(); public: /** Ctor not displaying an initial progress bar. * If non zero values for \a current_r or \a total_r are passed, * the label is prefixed by either "(#C)" or "(#C/#T)" */ ProgressBar( Out & out_r, NoStartBar, std::string progressId_r, const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 ) : _out( out_r ) , _progressId(std::move( progressId_r )) { if ( total_r ) _labelPrefix = zypp::str::form( "(%*u/%u) ", numDigits( total_r ), current_r, total_r ); else if ( current_r ) _labelPrefix = zypp::str::form( "(%u) ", current_r ); _progress.name( label_r ); _progress.sendTo( Print( *this ) ); } ProgressBar( Out & out_r,NoStartBar, const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 ) : ProgressBar( out_r, noStartBar, "", label_r, current_r, total_r ) {} /** Ctor displays initial progress bar. * If non zero values for \a current_r or \a total_r are passed, * the label is prefixed by either "(#C)" or "(#C/#T)" */ ProgressBar( Out & out_r, const std::string & progressId_r, const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 ) : ProgressBar( out_r, noStartBar, progressId_r, label_r, current_r, total_r ) { // print the initial progress bar _out.progressStart( _progressId, outLabel( _progress.name() ) ); } ProgressBar( Out & out_r, const std::string & label_r, unsigned current_r = 0, unsigned total_r = 0 ) : ProgressBar( out_r, "", label_r, current_r, total_r ) {} /** Dtor displays final progress bar. * Unless \ref error has explicitly been set, an error is indicated if * a \ref ProgressData range has been set, but 100% were not reached. */ ~ProgressBar() { _progress.noSend(); // suppress ~ProgressData final report if ( not _donetag ) error( _progress.reportValue() != 100 && _progress.reportPercent() ); _out.progressEnd( _progressId, outLabel( _progress.name() ), *_donetag ); } /** Immediately print the progress bar not waiting for a new trigger. */ void print() { _out.progress( _progressId, outLabel( _progress.name() ), _progress.reportValue() ); } /** \overload also change the progress bar label. */ void print( const std::string & label_r ) { _progress.name( label_r ); print(); } /** Explicitly indicate the error condition for the final progress bar. */ void error( ProgressEnd donetag_r = ProgressEnd::error ) { _donetag = donetag_r; } /** \overload just done/error. */ void error( bool error_r ) { _donetag = error_r ? ProgressEnd::error : ProgressEnd::done; } /** Reset any error condition. */ void errorreset() { _donetag.reset(); } /** \overload also change the progress bar label. */ void error( const std::string & label_r ) { _progress.name( label_r ); error( true ); } /** \overload also change the progress bar label and disambiguate. */ void error( const char * label_r ) { _progress.name( label_r ); error( true ); } public: /** \name Access the embedded ProgressData object */ //@{ zypp::ProgressData * operator->() { return &_progress; } const zypp::ProgressData * operator->() const { return &_progress; } zypp::ProgressData & operator*() { return _progress; } const zypp::ProgressData & operator*() const { return _progress; } //@} private: /** ProgressData::ReceiverFnc printing to a ProgressBar. * * \note This could also be used to let an external \ref ProgressData object * trigger a \ref ProgressBar. \ref ProgressBar::label and \ref ProgressBar::print * however use the embedded ProgressData object (esp. it's label). So don't mix this. */ struct Print { Print( ProgressBar & bar_r ) : _bar( &bar_r ) {} bool operator()( const zypp::ProgressData & progress_r ) { _bar->_out.progress( _bar->_progressId, _bar->outLabel( progress_r.name() ), progress_r.reportValue() ); return true; } private: ProgressBar * _bar; }; std::string outLabel( const std::string & msg_r ) const { return _labelPrefix.empty() ? msg_r : _labelPrefix + msg_r; } int numDigits( unsigned num_r ) const { int ret = 1; while ( num_r /= 10 ) ++ret; return ret; } private: Out & _out; std::optional _donetag; zypp::ProgressData _progress; std::string _progressId; std::string _labelPrefix; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class Out::Error /// \brief Convenience class Error reporting. /// /// Called action methods may \c throw this as exception. The calling function /// should catch and process it (e.g. by calling \ref report). /// /// This allows e.g. active \ref Out::ProgressBar objects to close properly /// before the error message is displayed. /// /// \code /// try { /// Out::ProgressBar report( zypper_r.out(), _("Scanning download directory") ); /// report->range( todolist.size() ); /// // now report will indicate an error id closed before reaching 100% /// .... /// if ( some error ) /// throw( Out::Error( ZYPPER_EXIT_ERR_BUG, /// _("Failed to read download directory"), /// Errno().asString() ) ); /// /// } /// catch ( const SourceDownloadImpl::Error & error_r ) /// { /// // Default way of processing a caught Error exception: /// // - Write error message and optional hint to screen. /// // - Set the ZYPPER_EXIT_ code if necessary. /// // - Return the current ZYPPER_EXIT_ code. /// return error_r.report( zypper_r ); /// } /// \endcode /////////////////////////////////////////////////////////////////// struct Out::Error { Error( int exitcode_r ) : _exitcode( exitcode_r ) {} // basic: code msg hint Error( int exitcode_r, std::string msg_r, std::string hint_r = std::string() ) : _exitcode( exitcode_r ), _msg( std::move(msg_r) ), _hint( std::move(hint_r) ) {} // code exception hint Error( int exitcode_r, const zypp::Exception & ex_r, std::string hint_r = std::string() ) : _exitcode( exitcode_r ), _msg( combine( ex_r ) ), _hint( std::move(hint_r) ) {} // code (msg exception) hint Error( int exitcode_r, std::string msg_r, const zypp::Exception & ex_r, std::string hint_r = std::string() ) : _exitcode( exitcode_r ), _msg( combine( std::move(msg_r), ex_r ) ), _hint( std::move(hint_r) ) {} /** Default way of processing a caught \ref Error exception. * \li Write error message and optional hint to screen. * \li Set the ZYPPER_EXIT_ code if necessary. * \returns the zypper exitcode. */ int report( Application & app_r ) const; int _exitcode; //< ZYPPER_EXIT_OK indicates exitcode is already set. std::string _msg; std::string _hint; private: static std::string combine( std::string && msg_r, const zypp::Exception & ex_r ); static std::string combine( const zypp::Exception & ex_r ); }; } #endif /*OUT_H_*/ libzypp-17.36.5/zypp-tui/output/OutNormal.cc000066400000000000000000000303411476576476200210070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include #include #include // for download progress reporting #include #include // for toUpper() #include #include #include #include "OutNormal.h" using std::cout; using std::cerr; using std::endl; namespace ztui { OutNormal::OutNormal( Verbosity verbosity_r ) : Out( TYPE_NORMAL, verbosity_r ) , _use_colors( false ) , _isatty( do_ttyout() ) , _newline( true ) , _oneup( false ) {} OutNormal::~OutNormal() {} bool OutNormal::mine( Type type ) { return( type & Out::TYPE_NORMAL ); } bool OutNormal::infoWarningFilter( Verbosity verbosity_r, Type mask ) { if ( !mine( mask ) ) return true; if ( verbosity() < verbosity_r ) return true; return false; } void OutNormal::fixupProgressNL() { if ( !_newline ) // An active Progress bar is not NL terminated cout << ansi::tty::clearLN; // Wipe it before writing out a normal line to the screen // Alternative : cout << endl; to Keep the progress bar visible. } void OutNormal::info( const std::string & msg_r, Verbosity verbosity_r, Type mask ) { if ( infoWarningFilter( verbosity_r, mask ) ) return; fixupProgressNL(); ColorString msg( msg_r, ColorContext::MSG_STATUS ); if ( verbosity_r == Out::QUIET ) msg = ColorContext::RESULT; else if ( verbosity_r == Out::DEBUG ) msg = ColorContext::OSDEBUG; cout << msg << endl; _newline = true; } void OutNormal::infoLine( const TermLine & msg, Verbosity verbosity_r, Type mask ) { info( msg.get( termwidth() ), verbosity_r, mask ); } void OutNormal::warning( const std::string & msg, Verbosity verbosity_r, Type mask ) { if ( infoWarningFilter( verbosity_r, mask ) ) return; fixupProgressNL(); cout << ( ColorContext::MSG_WARNING << _("Warning: ") ) << msg << endl; _newline = true; } void OutNormal::error( const std::string & problem_desc, const std::string & hint ) { fixupProgressNL(); cerr << ( ColorContext::MSG_ERROR << problem_desc ); if ( !hint.empty() && verbosity() > Out::QUIET ) cerr << endl << hint; cerr << endl; _newline = true; } // ---------------------------------------------------------------------------- void OutNormal::error( const zypp::Exception & e, const std::string & problem_desc, const std::string & hint ) { fixupProgressNL(); // problem and cause cerr << ( ColorContext::MSG_ERROR << problem_desc << endl << zyppExceptionReport(e) ) << endl; // hint if ( !hint.empty() && verbosity() > Out::QUIET ) cerr << hint << endl; _newline = true; } // ---------------------------------------------------------------------------- inline std::ostream & PROGRESS_FLUSH( std::ostream & str ) { static const bool dbg = getenv("ZYPPER_PBD"); // every progress bar redraw on a single line return (dbg ? str << std::endl : str << std::flush ); } void OutNormal::displayProgress ( const std::string & s, int percent ) { static AliveCursor cursor; if ( _isatty ) { TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' ); outstr.lhs << s << ' '; // dont display percents if invalid if ( percent >= 0 && percent <= 100 ) { outstr.percentHint = percent; } ++cursor; outstr.rhs << '[' << cursor.current() << ']'; if ( _oneup ) cout << ansi::tty::clearLN << ansi::tty::cursorUP; cout << ansi::tty::clearLN; std::string outline( outstr.get( termwidth() ) ); cout << outline << PROGRESS_FLUSH; // no _oneup if CRUSHed // _oneup = ( outline.length() > termwidth() ); } else cout << '.' << std::flush; } // ---------------------------------------------------------------------------- void OutNormal::displayTick( const std::string & s ) { static AliveCursor cursor; if ( _isatty ) { TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' ); ++cursor; outstr.lhs << s << ' '; outstr.rhs << '[' << cursor.current() << ']'; if( _oneup ) cout << ansi::tty::clearLN << ansi::tty::cursorUP; cout << ansi::tty::clearLN; std::string outline( outstr.get( termwidth() ) ); cout << outline << PROGRESS_FLUSH; // no _oneup if CRUSHed // _oneup = ( outline.length() > termwidth() ); } else cout << '.' << std::flush; } // ---------------------------------------------------------------------------- void OutNormal::progressStart( const std::string & id, const std::string & label, bool is_tick ) { if ( progressFilter() ) return; if ( !_isatty ) cout << label << " ["; if ( is_tick ) displayTick( label ); else displayProgress( label, 0 ); _newline = false; } void OutNormal::progress( const std::string & id, const std::string & label, int value ) { if (progressFilter()) return; if (value) displayProgress(label, value); else displayTick(label); _newline = false; } void OutNormal::progressEnd( const std::string & id, const std::string & label, const std::string & donetag, bool error ) { if ( progressFilter() ) return; if ( !error && _use_colors ) cout << ColorContext::MSG_STATUS; TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '.' ); if ( _isatty ) { if ( _oneup ) { cout << ansi::tty::clearLN << ansi::tty::cursorUP; _oneup = false; } cout << ansi::tty::clearLN; outstr.lhs << label << ' '; outstr.rhs << '['; } // else: just write the donetag outstr.rhs << donetag << ']'; std::string outline( outstr.get( termwidth() ) ); cout << outline << endl << std::flush; _newline = true; if ( !error && _use_colors ) cout << ColorContext::DEFAULT; } // progress with download rate void OutNormal::dwnldProgressStart( const zypp::Url & uri ) { if ( verbosity() < NORMAL ) return; if ( _isatty ) cout << ansi::tty::clearLN; TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' ); outstr.lhs << _("Retrieving:") << ' '; if ( verbosity() == DEBUG ) outstr.lhs << uri; else outstr.lhs << zypp::Pathname(uri.getPathName()).basename(); outstr.lhs << ' '; if (_isatty) outstr.rhs << '[' << _("starting") << ']'; else outstr.rhs << '[' ; std::string outline( outstr.get( termwidth() ) ); cout << outline << PROGRESS_FLUSH; // no _oneup if CRUSHed // _oneup = (outline.length() > termwidth()); _newline = false; } void OutNormal::dwnldProgress( const zypp::Url & uri, int value, long rate ) { if ( verbosity() < NORMAL ) return; if ( !_isatty ) { cout << '.' << std::flush; return; } if( _oneup ) cout << ansi::tty::clearLN << ansi::tty::cursorUP; cout << ansi::tty::clearLN; TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '-' ); outstr.lhs << _("Retrieving:") << " "; if ( verbosity() == DEBUG ) outstr.lhs << uri; else outstr.lhs << zypp::Pathname(uri.getPathName()).basename(); outstr.lhs << ' '; // dont display percents if invalid if ( value >= 0 && value <= 100 ) outstr.percentHint = value; static AliveCursor cursor; ++cursor; outstr.rhs << '[' << cursor.current(); if ( rate > 0 ) outstr.rhs << " (" << zypp::ByteCount(rate) << "/s)"; outstr.rhs << ']'; std::string outline( outstr.get( termwidth() ) ); cout << outline << PROGRESS_FLUSH; // no _oneup if CRUSHed // _oneup = (outline.length() > termwidth()); _newline = false; } void OutNormal::dwnldProgressEnd( const zypp::Url & uri, long rate, zypp::TriBool error ) { if ( verbosity() < NORMAL ) return; if ( bool(!error) && _use_colors ) cout << ColorContext::MSG_STATUS; TermLine outstr( TermLine::SF_CRUSH | TermLine::SF_EXPAND, '.' ); if ( _isatty ) { if( _oneup ) cout << ansi::tty::clearLN << ansi::tty::cursorUP; cout << ansi::tty::clearLN; outstr.lhs << _("Retrieving:") << " "; if ( verbosity() == DEBUG ) outstr.lhs << uri; else outstr.lhs << zypp::Pathname(uri.getPathName()).basename(); outstr.lhs << ' '; outstr.rhs << '['; if ( zypp::indeterminate( error ) ) // Translator: download progress bar result: "........[not found]" outstr.rhs << CHANGEString(_("not found") ); else if ( error ) // Translator: download progress bar result: "............[error]" outstr.rhs << NEGATIVEString(_("error") ); else // Translator: download progress bar result: ".............[done]" outstr.rhs << _("done"); } else outstr.rhs << ( zypp::indeterminate( error ) ? _("not found") : ( error ? _("error") : _("done") ) ); if ( rate > 0 ) outstr.rhs << " (" << zypp::ByteCount(rate) << "/s)"; outstr.rhs << ']'; std::string outline( outstr.get( termwidth() ) ); cout << outline << endl << std::flush; _newline = true; if ( bool(!error) && _use_colors ) cout << ColorContext::DEFAULT; } void OutNormal::prompt( PromptId id, const std::string & prompt, const PromptOptions & poptions, const std::string & startdesc ) { fixupProgressNL(); if ( startdesc.empty() ) { if ( _isatty ) cout << ansi::tty::clearLN; } else cout << startdesc << endl; std::ostringstream pstr; ColorStream cout( pstr, ColorContext::PROMPT ); // scoped color on std::cout cout << prompt; if ( ! poptions.empty() ) cout << text::optBlankAfter(prompt) << ColorString( poptions.optionString() ); cout << ": "; if ( do_colors() ) { // bsc#948566: Terminal is dumb and simply counts the amount of printable // characters. If the number of printable characters within ansi SGR sequences // is not a multiple of 8, tab stops are not computed correctly. We use // superfluous resets ("\033[0m"; 3 printable chars) to fill up. // Better ideas are welcome. size_t invis = 0; bool insgr = false; for ( char ch : pstr.str() ) { if ( insgr ) { ++invis; if ( ch == 'm' ) insgr = false; } else if ( ch == '\033' ) insgr = true; } invis %= 8; if ( invis ) { // "\033[0m" has 3 printable chars: // ( resets[to fill] * 3 ) % 8 == to fill // 0 1 2 3 4 5 6 7 static const size_t resets[] = { 0,3,6,1,4,7,2,5 }; for ( size_t i = resets[8-invis]; i; --i ) cout << ansi::Color::SGRReset(); } } std::cout << pstr.str() << std::flush; // prompt ends with newline (user hits ) unless exited abnormaly _newline = true; } void OutNormal::promptHelp( const PromptOptions & poptions ) { cout << endl; if ( poptions.helpEmpty() ) cout << _("No help available for this prompt.") << endl; // Nevertheless list all option names and their '#NUM' shortcut unsigned pos = 0; // Userland counter #NUM (starts with #1) zypp::str::Format fopt { "#%-2d: %-10s" }; for ( unsigned idx = 0; idx < poptions.options().size(); ++idx ) { if ( poptions.isDisabled(idx) ) continue; cout << ( fopt % ++pos % poptions.options()[idx] ); if ( ! poptions.helpEmpty() ) { const std::string & help { poptions.optionHelp(idx) }; cout << " - "; if ( help.empty() ) cout << ( ColorContext::LOWLIGHT << "(" << _("no help available for this option") << ")" ); else cout << help; } cout << endl; } ColorStream cout( std::cout, ColorContext::PROMPT ); // scoped color on std::cout cout << endl << ColorString( poptions.optionString() ) << ": " << std::flush; // prompt ends with newline (user hits ) unless exited abnormaly _newline = true; } unsigned OutNormal::termwidth() const { if ( _isatty ) { struct winsize wns; if ( !ioctl( 1, TIOCGWINSZ, &wns ) ) return wns.ws_col; } return Out::termwidth(); // unlimited } } libzypp-17.36.5/zypp-tui/output/OutNormal.h000066400000000000000000000056501476576476200206560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef OUTNORMAL_H_ #define OUTNORMAL_H_ #include #include #include namespace ztui { class OutNormal : public Out { public: OutNormal(Verbosity verbosity = NORMAL); ~OutNormal() override; public: void info( const std::string & msg, Verbosity verbosity, Type mask ) override; void infoLine( const TermLine & msg, Verbosity verbosity, Type mask ) override; void warning( const std::string & msg, Verbosity verbosity, Type mask ) override; void error( const std::string & problem_desc, const std::string & hint ) override; void error( const zypp::Exception & e, const std::string & problem_desc, const std::string & hint ) override; // progress void progressStart( const std::string & id, const std::string & label, bool is_tick ) override; void progress( const std::string & id, const std::string & label, int value ) override; void progressEnd( const std::string & id, const std::string & label, const std::string & donetag, bool error) override; // progress with download rate void dwnldProgressStart( const zypp::Url & uri ) override; void dwnldProgress( const zypp::Url & uri, int value, long rate ) override; void dwnldProgressEnd( const zypp::Url & uri, long rate, zypp::TriBool error ) override; void prompt( PromptId id, const std::string & prompt, const PromptOptions & poptions, const std::string & startdesc ) override; void promptHelp( const PromptOptions & poptions ) override; void setUseColors( bool value ) override { _use_colors = value; } protected: bool mine( Type type ) override; /* Return current terminal width or 'unsigned(-1)' when failed */ unsigned termwidth() const override; private: bool infoWarningFilter(Verbosity verbosity, Type mask); void fixupProgressNL(); //< Make sure we're at BOL even if a ProgressBar is active void displayProgress(const std::string & s, int percent); void displayTick(const std::string & s); bool _use_colors; bool _isatty; /* Newline flag. false if the last output did not end with new line character * (like in a self-overwriting progress line), false otherwise. */ bool _newline; /* True if the last output line was longer than the terminal width */ bool _oneup; }; } #endif /*OUTNORMAL_H_*/ libzypp-17.36.5/zypp-tui/output/PromptOptions000066400000000000000000000000331476576476200213330ustar00rootroot00000000000000#include "promptoptions.h" libzypp-17.36.5/zypp-tui/output/Utf8.h000066400000000000000000000131111476576476200175530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_OUTPUT_UTF8_H_ #define ZYPP_TUI_OUTPUT_UTF8_H_ #include #include #include #include #include #include namespace ztui { /////////////////////////////////////////////////////////////////// namespace utf8 { /** Simple utf8 string */ class string { public: using size_type = std::string::size_type; static const size_type npos = std::string::npos; public: string() {} string( const char * rhs ) : _str( rhs ) {} string( std::string rhs ) : _str(std::move( rhs )) {} public: const char * c_str() const { return _str.c_str(); } const std::string & str() const { return _str; } std::string & str() { return _str; } public: /** utf8 size */ size_type size() const { // test for locales using dual width fonts: static bool isCJK = []()->bool { const char * lang = ::getenv( "LANG" ); return ( lang && ( !strncmp( lang, "zh", 2 ) || !strncmp( lang, "ko", 2 ) || !strncmp( lang, "ja", 2 ) ) ); }(); if ( isCJK ) { // this should actually be correct for ALL locales: size_type len = 0; const char *s = _str.c_str(); for ( size_type slen = _str.size(); slen > 0; ) { if ( *s == '\033' && *(s+1) == '[' ) // skip ansi SGR { slen -= 2; s += 2; while ( slen > 0 && *s != 'm' ) { --slen; ++s; } if ( slen > 0 ) { --slen; ++s; } continue; } wchar_t wc = 0; size_t bytes = mbrtowc( &wc, s, slen, NULL ); if ( bytes <= 0 ) break; len += wcwidth( wc ); slen -= bytes; s += bytes; } return len; } // NON CJK: faster and hopefully accurate enough: // simply do not count continuation bytes '10xxxxxx' size_type ret = _str.size(); size_type ansi = 0; for ( auto ch : _str ) { if ( ansi ) { if ( ansi == 1 && ch == '[' ) { ansi = 2; continue; } else if ( ansi >= 2 ) // not testing for in [0-9;m] { ++ansi; if ( ch == 'm' ) // SGR end { ret -= ansi; ansi = 0; } continue; } } if ( isContinuationByte( ch ) ) --ret; else if ( ch == '\033' ) ansi = 1; } return ret; } /** \overload std::string has both too */ size_type length() const { return size(); } /** utf8 substring */ string substr( size_type pos_r = 0, size_type len_r = npos ) const { size_type p = upos( pos_r ); size_type l = upos( len_r, p ); return string( _str.substr( p, ( l == npos ? npos : l-p ) ) ); } private: /** Test for continuation byte \c '10xxxxxx' */ bool isContinuationByte( char ch ) const { return( (ch & 0xC0) == 0x80 ); } /** Return start of codepoint \a pos_r starting at position \c start_r. */ size_type upos( size_type pos_r, size_type start_r = 0 ) const { if ( pos_r == npos || start_r > _str.size() ) return npos; size_type upos = start_r; for ( const char * chp = _str.c_str() + upos; *chp; ++chp, ++upos ) { if ( ! isContinuationByte( *chp ) ) { if ( pos_r ) --pos_r; else return upos; while ( *chp == '\033' && *(chp+1) == '[' ) // skip any ansi SGR { chp += 2; upos += 2; while ( *chp && *chp != 'm' ) { ++chp; ++upos; } if ( *chp ) { ++chp; ++upos; } else break; // incomplete ansi SGR } if ( ! *chp ) break; // incomplete ansi SGR } } return( pos_r ? npos : upos ); } private: std::string _str; }; /** \relates string concatenation */ inline string operator+( const string & lhs, const string & rhs ) { return string( lhs.str() + rhs.str() ); } /** \overload */ inline string operator+( const string & lhs, const std::string & rhs ) { return string( lhs.str() + rhs ); } /** \overload */ inline string operator+( const std::string & lhs, const string & rhs ) { return string( lhs + rhs.str() ); } /** \overload */ inline string operator+( const string & lhs, const char * rhs ) { return string( lhs.str() + rhs ); } /** \overload */ inline string operator+( const char * lhs, const string & rhs ) { return string( lhs + rhs.str() ); } /** \relates string Stream output */ inline std::ostream & operator<<( std::ostream & str, const string & obj ) { return str << obj.str(); } } // namespace utf8 /////////////////////////////////////////////////////////////////// } #endif // ZYPP_TUI_OUTPUT_UTF8_H_ libzypp-17.36.5/zypp-tui/output/promptoptions.cc000066400000000000000000000127221476576476200220270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include "promptoptions.h" #include #include #include namespace ztui { // ---------------------------------------------------------------------------- PromptOptions::PromptOptions( StrVector options_r, unsigned defaultOpt_r ) { setOptions( std::move(options_r), defaultOpt_r ); } PromptOptions::PromptOptions( const std::string & optionstr_r, unsigned defaultOpt_r ) { setOptions( optionstr_r, defaultOpt_r ); } // ---------------------------------------------------------------------------- PromptOptions::~PromptOptions() {} // ---------------------------------------------------------------------------- void PromptOptions::setOptions( StrVector options_r, unsigned defaultOpt_r ) { _options.swap( options_r ); if ( _options.size() <= defaultOpt_r ) { INT << "Invalid default option index " << defaultOpt_r << std::endl; _default = 0; } else _default = defaultOpt_r; } void PromptOptions::setOptions( const std::string & optionstr_r, unsigned defaultOpt_r ) { StrVector options; zypp::str::split( optionstr_r, back_inserter(options), "/" ); setOptions( std::move(options), defaultOpt_r ); } ColorString PromptOptions::optionString() const { bool hidden = false; // have enabled options not shown at the prompt (/...)? unsigned shown = 0; unsigned showmax = ( _shown_count < 0 ? _options.size() : (unsigned)_shown_count ); std::ostringstream str; str << "["; const char * slash = ""; // "/" after the 1st option for ( unsigned idx = 0; idx < _options.size(); ++idx ) { if ( isDisabled(idx) ) continue; if ( shown < showmax ) { str << slash << ( ColorContext::PROMPT_OPTION << _options[idx] ); if ( !shown ) slash = "/"; ++shown; } else { hidden = true; break; // don't mind how many } } if ( hidden || !_opt_help.empty() ) { str << slash << ( hidden ? "..." : "" ) << ( ColorContext::PROMPT_OPTION << "?" ); if ( hidden ) // translators: Press '?' to see all options embedded in this prompt: "Continue? [y/n/? shows all options] (y):" str << " " << _("shows all options"); } str << "]"; if ( !_options.empty() ) str << " (" << ( ColorContext::PROMPT_OPTION << _options[_default] ) << ")"; return ColorString( str.str() ); } void PromptOptions::setOptionHelp( unsigned opt, const std::string & help_str ) { if ( help_str.empty() ) return; if ( opt >= _options.size() ) { WAR << "attempt to set option help for non-existing option." << " text: " << help_str << std::endl; return; } if ( opt >= _opt_help.capacity() ) _opt_help.reserve( _options.size() ); if ( opt >= _opt_help.size( )) _opt_help.resize( _options.size() ); _opt_help[opt] = help_str; } std::vector PromptOptions::getReplyMatches( const std::string & reply_r ) const { std::vector ret; // #NUM ? (direct index into option vector) if ( reply_r[0] == '#' && reply_r[1] != '\0' ) { unsigned num = 0; // -1 : if no match for ( const char * cp = reply_r.c_str()+1; *cp; ++cp ) { if ( '0' <= *cp && *cp <= '9' ) { num *= 10; num += (*cp-'0'); } else { num = unsigned(-1); break; } } if ( num != unsigned(-1) ) { // userland counting! #1 is the 1st (enabled) option (#0 will never match) if ( num != 0 ) { for ( unsigned i = 0; i < _options.size(); ++i ) { if ( isDisabled(i) ) continue; if ( --num == 0 ) { ret.push_back( i ); break; } } } return ret; // a match - good or bad - will be eaten } // no match falls through.... } const std::string & lreply { zypp::str::toLower( reply_r ) }; for ( unsigned i = 0; i < _options.size(); ++i ) { if ( isDisabled(i) ) continue; const std::string & lopt { zypp::str::toLower( _options[i] ) }; if ( lopt == lreply ) { // prefer an exact match ("1/11") ret.clear(); ret.push_back( i ); break; } else if ( zypp::str::hasPrefix( lopt, lreply ) ) ret.push_back( i ); } return ret; } std::string PromptOptions::replyMatchesStr( const std::vector & matches_r ) const { zypp::str::Str str; const char * sep = "("; // "," after the 1st option for ( unsigned idx : matches_r ) { str << sep << _options[idx]; if ( *sep != ',' ) sep =","; } return str << ")"; } bool PromptOptions::isYesNoPrompt() const { return _options.size() == 2 && _options[0] == _("yes") && _options[1] == _("no"); } } libzypp-17.36.5/zypp-tui/output/promptoptions.h000066400000000000000000000077151476576476200216770ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_OUTPUT_PROMPTOPTIONS_H_INCLUDED #define ZYPP_TUI_OUTPUT_PROMPTOPTIONS_H_INCLUDED #include #include #include #include namespace ztui { /** * Example: * * PromptOptions popts; * popts.setOptions(_("y/n/p"), 0 / * default reply * /); * popts.setOptionHelp(0, _("Help for option 'y'")); * popts.setOptionHelp(1, _("Help for option 'n'")); * ... * zypper.out().prompt(PROMPT_YN_INST_REMOVE_CONTINUE, prompt_text, popts); * unsigned reply = * get_prompt_reply(zypper, PROMPT_YN_INST_REMOVE_CONTINUE, popts); * */ class PromptOptions { public: using StrVector = std::vector; /** * Default c-tor. */ PromptOptions() {}; /** Ctor taking the option values as vector */ PromptOptions( StrVector options_r, unsigned defaultOpt_r ); /** * Constructor. * * \param optionstr_r translated option string containing one or more * options separated by slash '/' character * e.g. "yes/no/?" or "1/s/r/c" * \param defaultOpt_r index of the default answer within the \a option_str */ PromptOptions( const std::string & optionstr_r, unsigned defaultOpt_r ); /** D-tor */ ~PromptOptions(); const StrVector & options() const { return _options; } void setOptions( StrVector options_r, unsigned defaultOpt_r ); void setOptions( const std::string & optionstr_r, unsigned defaultOpt_r ); unsigned defaultOpt() const { return _default; } /** Option string (may have embedded color codes) */ ColorString optionString() const; bool empty() const { return _options.empty(); } bool isYesNoPrompt() const; const std::string & optionHelp(unsigned opt) const { static std::string empty; return opt < _opt_help.size() ? _opt_help[opt] : empty; } //const std::string getOptionHelp(const std::string & opt_str); void setOptionHelp(unsigned opt, const std::string & help_str); bool helpEmpty() const { return _opt_help.empty(); } bool isEnabled(unsigned opt) const { return !isDisabled(opt); } bool isDisabled(unsigned opt) const { return _disabled.count(opt); } void disable(unsigned opt) { _disabled.insert(opt); } void enable(unsigned opt) { _disabled.erase(opt); } void enableAll() { _disabled.clear(); } unsigned shownCount() const { return _shown_count; } void setShownCount(unsigned count) { _shown_count = count; } /** Return the indices of option string matches (lowercase/prefix or #NUM). */ std::vector getReplyMatches( const std::string & reply_r ) const; /** The returned reply matches as '(,)' list. */ std::string replyMatchesStr( const std::vector & matches_r ) const; private: /** option strings */ StrVector _options; /** index of the default option */ unsigned _default = 0; /** help strings corresponding to options */ StrVector _opt_help; /** set of options to ignore */ std::set _disabled; /** * Number of options to show (the rest will still be available and visible * through '?' help). If negative, all options will be shown. Zero is allowed. */ int _shown_count = -1; }; } #endif // ZYPP_TUI_OUTPUT_PROMPTOPTIONS_H_INCLUDED libzypp-17.36.5/zypp-tui/utils/000077500000000000000000000000001476576476200163575ustar00rootroot00000000000000libzypp-17.36.5/zypp-tui/utils/ansi.h000066400000000000000000000670511476576476200174730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_UTILS_ANSI_H #define ZYPP_TUI_UTILS_ANSI_H #include #include #include #include #include #include #include #include namespace ztui { /** True unless output is a dumb tty or file. * In this case we should not use any ANSI Escape sequences moving the cursor. */ bool do_ttyout(); // implemented in colors.cc /** If output is done in colors (depends on config) */ bool do_colors(); // implemented in colors.cc /** Simple check whether stdout is a (not dumb) tty */ bool mayUseANSIEscapes(); /** Simple check whether stdout can handle colors */ bool hasANSIColor(); /////////////////////////////////////////////////////////////////// namespace ansi { /////////////////////////////////////////////////////////////////// namespace tty { /////////////////////////////////////////////////////////////////// /// \class EscapeSequence /// \brief ANSI Escape sequences and their fallback if no tty /////////////////////////////////////////////////////////////////// class EscapeSequence { public: EscapeSequence( const char * ansi_r, const char * fallback_r = "" ) : _seq( ansi_r ) , _fbck( fallback_r ) {} const char * str() const { if ( _fbck ) // determine _seq<>_fbck on 1st use (dtor is too early as do_ttyout() is not yet ready) { if ( ! do_ttyout() ) _seq = _fbck; _fbck = nullptr; } return _seq; } private: mutable const char * _seq; mutable const char * _fbck; }; /** \relates EscapeSequence stream output */ inline std::ostream & operator<<( std::ostream & str, const EscapeSequence & obj ) { return str << obj.str(); } // EscapeSequence definitions in colors.cc extern const EscapeSequence clearLN; ///< Clear entire line extern const EscapeSequence cursorUP; ///< Cursor up 1 line extern const EscapeSequence cursorDOWN; ///< Cursor down 1 line extern const EscapeSequence cursorRIGHT; ///< Cursor right 1 char extern const EscapeSequence cursorLEFT; ///< Cursor left 1 char } // namespace tty /////////////////////////////////////////////////////////////////// #define ZYPPER_TRACE_SGR 0 #undef ESC #if ( ZYPPER_TRACE_SGR < 2 ) #define ESC "\033" #else #define ESC "@" #endif /////////////////////////////////////////////////////////////////// /// \class ColorTraits /// \brief Traits class to enable custom \ref Color construction /// /// This enables using user types (usaually enums) to be used as \ref Color /// with \ref ColorString or \ref ColorStream classes: /// \code /// enum ColorContext { Red, Green, Blue }; /// /// cout << "default" /// << ( ColorContext::Green << "green" /// << ColorContext::Red << "switch to red" /// << ( ColorContext::Blue << "blue" ) /// << "still red" ) /// << "default" << endl; /// \endcode /// /// You need to define a function ansi::Color customColorCtor( EnumType enum_r ) /// which associates enum value and \ref Color: /// \code /// ansi::Color customColorCtor( ColorContext ctxt_r ) /// { return Color associated with each enum value } /// \endcode /// /// Then specailize \ref ColorTraits for your enum to enable using it as \ref ColorStream /// \code /// namespace ansi /// { /// template<> /// struct ColorTraits /// { enum { customColorCtor = true }; }; /// } /// \endcode /// /// This will enable your enum being impicitly converted into ansi::Color, especially /// when used together with \ref ColorString and \ref ColorStream. Printing your enum /// on a stream, will also print the associated colors SGR sequence: /// \code /// // provided via ColorTraits: /// std::ostream & operator<<( std::ostream & str, ColorContext obj ) /// { return str << ansi::Color( obj ); } /// \endcode /////////////////////////////////////////////////////////////////// template struct ColorTraits { enum { customColorCtor = false }; }; // enabled via ctor Color::Constant -> Color /** \relates ColorTraits SFINAE: hide template signatures unless enum is enabled in \ref ColorTraits */ template using EnableIfCustomColorCtor = std::enable_if_t< ansi::ColorTraits>::customColorCtor >; /** \relates ColorTraits SFINAE: hide template signatures unless enum is enabled in \ref ColorTraits */ template using DisableIfCustomColorCtor = std::enable_if_t< !ansi::ColorTraits>::customColorCtor >; /////////////////////////////////////////////////////////////////// /// \class Color /// \brief Various ways to define ansi SGR sequences. /// /// Any color component (\ref Attr, \ref Fg, \ref Bg) may have the /// value \c Uchanged, indicating that this component should remain /// unchanged when the terminal color is set. To mimic this use /// \ref operator<<= which updates a color by omitting \c Unchanged /// components. ///nocolor /// \note The function \ref do_colors determines if ansi SGR sequences /// are generated for colors at all. /// /////////////////////////////////////////////////////////////////// class Color { public: /** Color attributes */ enum class Attr : std::uint8_t { Unchanged, Normal, Bright, Reverse }; /** Foreground colors */ enum class Fg : std::uint8_t { Unchanged, Default, Black, Red, Green, Yellow, Blue, Magenta, Cyan, White }; /** Backgroud colors */ enum class Bg : std::uint8_t { Unchanged, Default, Black, Red, Green, Yellow, Blue, Magenta, Cyan, White }; /** Color unique id type */ using UidType = std::uint32_t; /** Predefined (foregreound) color contants * Intentionally not an enum class, so it can be used as * \c Color::Red, \c Color::Default, etc. */ enum Constant : std::uint8_t { Black, BrightBlack, // BrightBlack = Darkgray Red, BrightRed, Green, BrightGreen, Yellow, BrightYellow, // Yellow = Brown on Standard VGA Blue, BrightBlue, Magenta, BrightMagenta, Cyan, BrightCyan, White, BrightWhite, // White = Gray Default, BrightDefault }; public: /** Default ctor: terminal default color */ Color() : _comp( Attr::Normal, Fg::Default, Bg::Default ) {} Color( Attr attr_r, Fg fg_r = Fg::Unchanged, Bg bg_r = Bg::Unchanged ) : _comp( attr_r, fg_r, bg_r ) {} Color( Attr attr_r, Bg bg_r ) : _comp( attr_r, Fg::Unchanged, bg_r ) {} Color( Fg fg_r, Bg bg_r = Bg::Unchanged ) : _comp( Attr::Unchanged, fg_r, bg_r ) {} Color( Bg bg_r ) : _comp( Attr::Unchanged, Fg::Unchanged, bg_r ) {} /** Color constant combined with background (\ref Bg::Default) */ Color( Constant color_r, Bg bg_r = Bg::Default ) : _comp( ( color_r % 2 ? Attr::Bright : Attr::Normal ), Fg::Default, bg_r ) { switch ( color_r ) { case Black: case BrightBlack: _comp.fg = Fg::Black; break; case Red: case BrightRed: _comp.fg = Fg::Red; break; case Green: case BrightGreen: _comp.fg = Fg::Green; break; case Yellow: case BrightYellow: _comp.fg = Fg::Yellow; break; case Blue: case BrightBlue: _comp.fg = Fg::Blue; break; case Magenta: case BrightMagenta: _comp.fg = Fg::Magenta; break; case Cyan: case BrightCyan: _comp.fg = Fg::Cyan; break; case White: case BrightWhite: _comp.fg = Fg::White; break; default: case Default: case BrightDefault: break; } } /** Custom ctor from ColorTraits enabled type */ template> Color( CCC_ && color_r ) : Color( customColorCtor( std::forward(color_r) ) ) {} public: /** Leave everything unchanged */ static Color nocolor() { return Color( UidType(0) ); } /*! * Returns the Color corresponding to the \a colorName. * If \a colorName does not match a known string this returns the * same as \ref nocolor. * * \code * Color::fromString("bold red"); * \endcode * */ static Color fromString( const std::string &colorName ); /** Evaluate in boolean context (not \ref nocolor) */ explicit operator bool() const { return uid(); } /** ANSI SGR sesquence to reset all attributes * \note Printing this SGR sequence has the same visible effect as setting * \ref Color::Default. Classes supporting re-coloring, like \ref ColorString, * however differ between both. While Color::Default is a color to use, * thus to keep when re-coloring, \ref SGRReset is used as placeholder for * later coloring. */ static const std::string & SGRReset() { #if ( ZYPPER_TRACE_SGR ) static const std::string & _reset( *(new std::string( ESC"[0m[!]" )) ); // live until program ends #else static const std::string & _reset( *(new std::string( ESC"[0m" )) ); // live until program ends #endif static const std::string & _noreset( *(new std::string( "" )) ); // live until program ends if(!do_colors()) return _noreset; return _reset; } public: /** Update Color (assign components which are not \c Unchanged in rhs ) */ Color & operator<=( Color rhs ) { if ( rhs._comp.attr != Attr::Unchanged ) _comp.attr = rhs._comp.attr; if ( rhs._comp.fg != Fg::Unchanged ) _comp.fg = rhs._comp.fg; if ( rhs._comp.bg != Bg::Unchanged ) _comp.bg = rhs._comp.bg; return *this; } /** \overload */ Color & operator<=( Color::Attr rhs ) { if ( rhs != Attr::Unchanged ) _comp.attr = rhs; return *this; } /** \overload */ Color & operator<=( Color::Fg rhs ) { if ( rhs != Fg::Unchanged ) _comp.fg = rhs; return *this; } /** \overload */ Color & operator<=( Color::Bg rhs ) { if ( rhs != Bg::Unchanged ) _comp.bg = rhs; return *this; } /** \overload */ inline Color & operator<=( Color::Constant rhs ); /** Return updated color */ Color operator<( Color rhs ) const { return Color(*this) <= rhs; } /** \overload */ Color operator<( Color::Attr rhs ) const { return Color(*this) <= rhs; } /** \overload */ Color operator<( Color::Fg rhs ) const { return Color(*this) <= rhs; } /** \overload */ Color operator<( Color::Bg rhs ) const { return Color(*this) <= rhs; } /** \overload */ inline Color operator<( Color::Constant rhs ) const; public: Attr attr() const { return _comp.attr; } Color & attr( Attr attr_r ) { _comp.attr = attr_r; return *this; } Fg fg() const { return _comp.fg; } Color & fg( Fg fg_r ) { _comp.fg = fg_r; return *this; } Bg bg() const { return _comp.bg; } Color & bg( Bg bg_r ) { _comp.bg = bg_r; return *this; } /** Each color has a unique numeric id */ UidType uid() const { return _comp.uid; } /** The colors SGRsequence if \ref do_colors is \c true */ const std::string & str() const { return genSGR( *this ); } /** The colors SGRsequence human readable */ std::string debugstr() const { return genSGR( *this ).c_str()+1; } public: /** \relates Color */ friend inline bool operator==( Color lhs, Color rhs ) { return( lhs.uid() == rhs.uid() ); } /** \relates Color */ friend inline bool operator!=( Color lhs, Color rhs ) { return ! ( lhs == rhs ); } private: /** Return a colors SGRsequence if \ref do_colors retruns \c true */ static std::string & genSGR( Color color_r ) { static std::map & _def( *(new std::map) ); // live until program ends if ( ! ( color_r && do_colors() ) ) // nocolor, all ::Unchanged, uid 0: return empty string { #if ( ZYPPER_TRACE_SGR ) std::string & ret( _def[0] ); if ( ret.empty() ) ret = "[]"; return ret; #else return _def[0]; #endif } std::string & ret( _def[color_r._comp.uid] ); if ( ret.empty() ) { ret += ESC"["; switch ( color_r._comp.attr ) { case Attr::Normal: ret += "22;27;"; break; case Attr::Bright: ret += "1;"; break; case Attr::Reverse: ret += "7;"; break; default: case Attr::Unchanged: break; } switch ( color_r._comp.fg ) { case Fg::Black: ret += "30;"; break; case Fg::Red: ret += "31;"; break; case Fg::Green: ret += "32;"; break; case Fg::Yellow: ret += "33;"; break; case Fg::Blue: ret += "34;"; break; case Fg::Magenta: ret += "35;"; break; case Fg::Cyan: ret += "36;"; break; case Fg::White: ret += "37;"; break; case Fg::Default: ret += "39;"; break; default: case Fg::Unchanged: break; } switch ( color_r._comp.bg ) { case Bg::Black: ret += "40;"; break; case Bg::Red: ret += "41;"; break; case Bg::Green: ret += "42;"; break; case Bg::Yellow: ret += "43;"; break; case Bg::Blue: ret += "44;"; break; case Bg::Magenta: ret += "45;"; break; case Bg::Cyan: ret += "46;"; break; case Bg::White: ret += "47;"; break; case Bg::Default: ret += "49;"; break; default: case Bg::Unchanged: break; } *ret.rbegin() = 'm'; // turn trailing ';' into 'm' #if ( ZYPPER_TRACE_SGR ) ret += ( color_r == Color() ? "[*]" : "[@]" ); #endif } return ret; } private: /** ctor nocolor, all ::Unchanged, uid 0 */ Color ( UidType ) {} union Comp { Comp() // nocolor, all ::Unchanged, uid 0 : uid( 0 ) {} Comp( Attr attr_r, Fg fg_r, Bg bg_r ) : attr( attr_r ), fg( fg_r ), bg( bg_r ), _f( 0 ) {} struct { Color::Attr attr; // std::uint8_t Color::Fg fg; // std::uint8_t Color::Bg bg; // std::uint8_t std::uint8_t _f; // std::uint8_t }; UidType uid; // std::uint32_t } _comp; }; template<> struct ColorTraits { enum { customColorCtor = true }; }; // enabled via ctor Color::Constant -> Color // Implememtation after ColorTraits instantiation ! Color & Color::operator<=( Color::Constant rhs ) { return this->operator<=( Color( rhs, Bg::Unchanged ) ); } Color Color::operator<( Color::Constant rhs ) const { return Color(*this) <= rhs; } /** \relates Color Print the colors SGRsequence if \ref do_colors is \c true */ inline std::ostream & operator<<( std::ostream & str, Color obj ) { return str << obj.str(); } /////////////////////////////////////////////////////////////////// /// \class ColorString /// \brief Colored string if \ref do_colors /// /// Stores a plain std::string (which may have color codes embedded) /// along with a \ref Color. Retrieving the string will render /// all uncolored (\ref Color::nololor) parts of the string in the /// \ref Color. /// /// In contrary to a \ref ColorStream you can change the basic color /// of the string without losing embedded highlights. /// /// \note Printing a \ref ColorString renderd in \ref Color::noclolor /// on a \ref ColorStream will render the string in the ColorStreams /// color. /////////////////////////////////////////////////////////////////// class ColorString { public: ColorString() : _color( Color::nocolor() ) {} /** Ctor from color */ explicit ColorString( Color color_r ) : _color( color_r ) {} /** Ctor from string */ explicit ColorString( const std::string & str_r ) : _str( str_r ) , _color( Color::nocolor() ) {} /** \overload moving */ explicit ColorString( std::string && str_r ) : _str( std::move(str_r) ) , _color( Color::nocolor() ) {} /** Ctor from string and color */ ColorString( const std::string & str_r, Color color_r ) : _str( str_r ) , _color( color_r ) {} /** \overload moving */ ColorString( std::string && str_r, Color color_r ) : _str( std::move(str_r) ) , _color( color_r ) {} /** Ctor from color and string */ ColorString( Color color_r, const std::string & str_r ) : _str( str_r ) , _color( color_r ) {} /** \overload moving */ ColorString( Color color_r, std::string && str_r ) : _str( std::move(str_r) ) , _color( color_r ) {} public: /** Assign new string */ ColorString & operator=( const std::string & str_r ) { _str = str_r; return *this; } /** \overload moving */ ColorString & operator=( std::string && str_r ) { _str = std::move(str_r); return *this; } /////////////////////////////////////////////////////////////////// // Append via '<<' (not '+=' '+') because it's // strictly evaluated left-to-right: // // ColorString sep( "-", Color::Cyan ); // ColorString ver( "version" ); // // ver << sep << "release"; // + prints "-" in cyan :) // // ver += sep + "release"; // - prints "-release" in cyan :( // ver += sep += "release"; // - prints "-release" in cyan :( // (ver += sep) += "release"; // + but ugly syntax // /** Append a \Ref ColorString */ ColorString & operator<<( const ColorString & rhs ) { _str += rhs.str(); return *this; } /** Append a string */ ColorString & operator<<( const std::string & str_r ) { _str += str_r; return *this; } public: /** Assign \ref Color */ ColorString & operator=( Color color_r ) { _color = color_r; return *this; } /** Update \ref Color */ ColorString & operator<=( Color color_r ) { _color <= color_r; return *this; } /** Return a copy with different color. */ ColorString operator()( Color color_r ) const { return ColorString( _str, color_r ); } public: /** Return strings \ref Color */ Color color() const { return _color; } public: /** Whether the underlying string is empty */ bool empty() const { return plainstr().empty(); } /** Size of the underlying string */ std::string::size_type size() const { return plainstr().size(); } /** Return the colored string if \ref do_colors */ std::string str() const { return str( _color ); } /** \overload */ std::string asString() const { return str(); } /** Return the string rendered in a differernt color if \ref do_colors */ std::string str( Color color_r ) const { std::string ret( plainstr() ); if ( do_colors() && color_r ) { using zypp::str::replaceAll; replaceAll( ret, Color::SGRReset(), color_r.str() ); ret = color_r.str() + ret + Color::SGRReset(); } #if ( ZYPPER_TRACE_SGR ) return "[\"<]" + ret + "[>\"]"; #endif return ret; } public: /** Return the underlying plain string */ const std::string & plainstr() const { return _str; } /** Return the underlying plain string */ std::string & plainstr() { return _str; } /** Access the underlying plain string via \c operator* */ const std::string & operator*() const { return plainstr(); } /** Access the underlying plain string via \c operator* */ std::string & operator*() { return plainstr(); } private: std::string _str; Color _color; }; /** \relates ColorString Print colored on ostream */ inline std::ostream & operator<<( std::ostream & str, const ColorString & obj ) { return str << obj.str(); } /////////////////////////////////////////////////////////////////// /// \class ColorStream /// \brief Colored stream output if \ref do_colors /// /// If an \c ostream& is passed to the constructor, we directly print /// to this steam. Otherwise an ostringstream is used as buffer until /// the buffered \ref ColorStream itself is printed. Printing an unbuffered /// steam prints an empty string. /// /// \note Printing directly to a stream, the color is active throughout the /// ColorStreams lifetime (set in ctor, reset in dtor). /// /// \see \ref ColorTraits for how to enable convenient \class ColorStream /// handling via an enum type. /// \code /// ColorStream cstr( std::move( ColorContext::Red << "Error " << 42 ) ); /// /// cout << "default" /// << ( ColorContext::Green << "prints green" /// << ColorContext::Red << "switch to red" /// << ( ColorContext::Blue << "prints blue" ) /// << "still prints red" ) /// << "default" << endl; /// \endcode /// /// \note This class is not copyable but movable. /////////////////////////////////////////////////////////////////// class ColorStream { struct nullDeleter { void operator() (void const *) const {}; }; public: /** Default Ctor (\ref Color::Default) */ ColorStream() {} /** Ctor taking a \ref Color */ explicit ColorStream( Color color_r ) : _color( color_r ) {} /** Ctor directly printing to a \ref std::ostream (\ref Color::Default) */ explicit ColorStream( std::ostream & direct_r ) : ColorStream( direct_r, Color::Default ) {} /** Ctor directly printing to a \ref std::ostream in \ref Color */ ColorStream( std::ostream & direct_r, Color color_r ) : _directP( &direct_r ) , _color( color_r ) { (*_directP) << _color; } /** non copyable */ ColorStream( const ColorStream & ) = delete; ColorStream & operator=( const ColorStream & ) = delete; /** movable */ ColorStream( ColorStream && ) = default; ColorStream & operator=( ColorStream && ) = default; ~ColorStream() { if ( _directP ) (*_directP) << Color::SGRReset(); } /** Explicit conversion to \ref std::ostream (creates buffer if not direct) */ explicit operator std::ostream &() { return stream(); } public: /** Change the streams \ref Color */ ColorStream & operator=( Color color_r ) { _color = color_r; if ( hasStream() ) stream() << _color; return *this; } /** Update the streams \ref Color */ ColorStream & operator<=( Color color_r ) { _color <= color_r; if ( hasStream() ) stream() << _color; return *this; } public: /** Return streams \ref Color */ Color color() const { return _color; } public: /** Return a buffered streams content as (colored) string */ std::string str() const { std::string ret; if ( hasContent() ) { ret = _bufferP->str(); ret += Color::SGRReset(); } return ret; } public: /** Printing a \ref Color (also via enum) updates the streams \ref Color */ ColorStream & operator<<( Color color_r ) { return operator<=( color_r ); } /** Printing a \ref ColorString using his \ref Color * \note \ref ColorString in \ref Color::nocolor is renderd in streams color */ ColorStream & operator<<( const ColorString & val_r ) { stream() << ( val_r.color() ? val_r.str() : val_r.str(_color) ) << _color; return *this; } /** Printing another \ref ColorStream using his \ref Color */ ColorStream & operator<<( const ColorStream & val_r ) #if ( ZYPPER_TRACE_SGR ) { if ( val_r.hasContent() ) stream() << "[<<]" << val_r.content() << _color << "[>>]"; return *this; } #else { if ( val_r.hasContent() ) stream() << val_r.content() << _color; return *this; } #endif /** All other types are printed via std::ostream */ template> ColorStream & operator<<( const Tp_ & val_r ) // ! Universal reference here would be too greedy { stream() << val_r; return *this; } /** \overload for omaip */ ColorStream & operator<<( std::ostream & (*omanip)( std:: ostream & ) ) { stream() << omanip; return *this; } public: /** \relates ColorStream Print colored on ostream */ friend inline std::ostream & operator<<( std::ostream & str, const ColorStream & obj ) #if ( ZYPPER_TRACE_SGR ) { if ( obj.hasContent() ) str << "[<<]" << obj.content() << Color::SGRReset() << "[>>]"; return str; } #else { if ( obj.hasContent() ) str << obj.content() << Color::SGRReset(); return str; } #endif private: /** Direct or non-empty buffer */ bool hasStream() const { return _directP || _bufferP; } /** Reference to the underlying ostream (direct or auto-created buffer) */ std::ostream & stream() const { if ( _directP ) return *_directP; if ( !_bufferP ) { _bufferP.reset( new std::ostringstream ); *_bufferP << _color; } return *_bufferP; } /** Non-empty buffer (implies direct) */ bool hasContent() const { return !!_bufferP; } /** Content of a non-empty buffered stream or empty */ std::string content() const { std::string ret; if ( hasContent() ) ret = _bufferP->str(); return ret; } private: std::unique_ptr _directP; mutable std::unique_ptr _bufferP; Color _color; }; /////////////////////////////////////////////////////////////////// #undef ZYPPER_TRACE_SGR } // namespace ansi /////////////////////////////////////////////////////////////////// // Drag them into this namespace: using ansi::ColorString; using ansi::ColorStream; /** \relates ColorStream Create \ref ColorStream via \ref Color */ template inline ansi::ColorStream operator<<( ansi::Color color_r, Tp_ && val_r ) { return std::move( ansi::ColorStream( color_r ) << std::forward(val_r) ); } /** \overload for omanip */ inline ansi::ColorStream operator<<( ansi::Color color_r, std::ostream & (*omanip)( std::ostream & ) ) { return std::move( ansi::ColorStream( color_r ) << omanip ); } /** \relates ColorStream Create \ref ColorStream via enum << expr */ template > inline ansi::ColorStream operator<<( CCC_ && color_r, Tp_ && val_r ) { return std::move( ansi::ColorStream( std::forward(color_r) ) << std::forward(val_r) ); } /** \overload for omanip */ template > inline ansi::ColorStream operator<<( CCC_ && color_r, std::ostream & (*omanip)( std:: ostream & ) ) { return std::move( ansi::ColorStream( std::forward(color_r) ) << omanip ); } } namespace std { /** \relates ansi::Color Stream oputput for ColorTraits enabled types * Defined in namespace 'std' because namespace of 'CCC_' may vary */ template> inline ostream & operator<<( ostream & str, CCC_ && color_r ) { return str << ztui::ansi::Color( forward(color_r) ); } } // namespace std #endif // ZYPP_TUI_UTILS_ANSI_H libzypp-17.36.5/zypp-tui/utils/colors.cc000066400000000000000000000105231476576476200201700ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include #include "colors.h" namespace ztui { namespace env { inline bool NO_COLOR() { return ::getenv("NO_COLOR"); } } // namespace env /////////////////////////////////////////////////////////////////// // from ansi.h bool do_ttyout() { return Application::instance().config().do_ttyout; } bool do_colors() { return Application::instance().config().do_colors; } bool mayUseANSIEscapes() { constexpr auto detectAnsiEscapes = [](){ if ( ::isatty(STDOUT_FILENO) ) { char *term = ::getenv("TERM"); if ( term && ::strcmp( term, "dumb" ) ) return true; } return false; }; static bool mayUse = detectAnsiEscapes(); return mayUse; } bool hasANSIColor() { return mayUseANSIEscapes() && not env::NO_COLOR(); } namespace ansi { namespace tty { const EscapeSequence clearLN ( "\033[2K\r", "\n" ); const EscapeSequence cursorUP ( "\033[1A" ); const EscapeSequence cursorDOWN ( "\033[1B" ); const EscapeSequence cursorRIGHT ( "\033[1C" ); const EscapeSequence cursorLEFT ( "\033[1D" ); } // namespace tty Color Color::fromString(const std::string &colorName) { static const std::map _def = { { "black", ansi::Color::Black }, { "darkgrey", ansi::Color::BrightBlack }, { "red", ansi::Color::Red }, { "green", ansi::Color::Green }, { "brown", ansi::Color::Yellow }, { "yellow", ansi::Color::BrightYellow }, { "blue", ansi::Color::Blue }, { "magenta", ansi::Color::Magenta }, { "purple", ansi::Color::Magenta }, { "cyan", ansi::Color::Cyan }, { "grey", ansi::Color::White }, { "white", ansi::Color::BrightWhite }, { "default", ansi::Color::Default }, { "", ansi::Color::Default }, // matches "bold" "light" "bright" NOT "" }; ansi::Color ret = ansi::Color::nocolor(); if ( colorName.empty() ) // "" when undefined in config file return ret; std::string name_r = zypp::str::toLower( colorName ); if ( zypp::str::hasPrefix( name_r, "bold" ) ) { name_r.erase( 0, 4 ); ret <= ansi::Color::Attr::Bright; } else if ( zypp::str::hasPrefix( name_r, "light" ) ) { name_r.erase( 0, 5 ); ret <= ansi::Color::Attr::Bright; } else if ( zypp::str::hasPrefix( name_r, "bright" ) ) { name_r.erase( 0, 6 ); ret <= ansi::Color::Attr::Bright; } auto && it = _def.find( name_r ); if ( it == _def.end() ) { ERR << "Unknown color name '" << name_r << "'" << std::endl; ret = ansi::Color::Default; } else { ret = ( it->second < ret ); } return ret; } } // namespace tty // from ansi.h /////////////////////////////////////////////////////////////////// ansi::Color customColorCtor( ColorContext ctxt_r ) { const ztui::Config & conf( Application::instance().config() ); switch ( ctxt_r ) { case ColorContext::RESULT: return conf.color_result; case ColorContext::MSG_STATUS: return conf.color_msgStatus; case ColorContext::MSG_WARNING: return conf.color_msgWarning; case ColorContext::MSG_ERROR: return conf.color_msgError; case ColorContext::PROMPT: return conf.color_prompt; case ColorContext::PROMPT_OPTION: return conf.color_promptOption; case ColorContext::POSITIVE: return conf.color_positive; case ColorContext::CHANGE: return conf.color_change; case ColorContext::NEGATIVE: return conf.color_negative; case ColorContext::HIGHLIGHT: return conf.color_highlight; case ColorContext::LOWLIGHT: return conf.color_lowlight; case ColorContext::OSDEBUG: return conf.color_osdebug; case ColorContext::DEFAULT: break; // use default... } return ansi::Color::Default; // default } } libzypp-17.36.5/zypp-tui/utils/colors.h000066400000000000000000000051571476576476200200410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_UTILS_COLORS_H_ #define ZYPP_TUI_UTILS_COLORS_H_ #include #include #include "ansi.h" namespace ztui { /** True unless output is a dumb tty or file. * In this case we should not use any ANSI Escape sequences moving the cursor. */ bool do_ttyout(); /** If output is done in colors (depends on config) */ bool do_colors(); /////////////////////////////////////////////////////////////////// enum class ColorContext { DEFAULT, RESULT, MSG_STATUS, MSG_ERROR, MSG_WARNING, PROMPT, PROMPT_OPTION, POSITIVE, CHANGE, NEGATIVE, HIGHLIGHT, LOWLIGHT, OSDEBUG }; /** \relates ColorContext map to \ref ansi::Color */ ansi::Color customColorCtor( ColorContext ctxt_r ); namespace ansi { // Enable using ColorContext as ansi::SGRSequence template<> struct ColorTraits { enum { customColorCtor = true }; }; } // ColorString types template struct CCString : public ColorString { CCString() : ColorString( _ctxt ) {} explicit CCString( const std::string & str_r ) : ColorString( _ctxt, str_r ) {} explicit CCString( std::string && str_r ) : ColorString( _ctxt, std::move(str_r) ) {} }; template inline ansi::ColorStream & operator<<( ansi::ColorStream & cstr_r, const CCString<_ctxt> & cstring_r ) { return cstr_r << static_cast(cstring_r); } using DEFAULTString = CCString; using MSG_STATUSString = CCString; using MSG_ERRORString = CCString; using MSG_WARNINGString = CCString; using POSITIVEString = CCString; using CHANGEString = CCString; using NEGATIVEString = CCString; using HIGHLIGHTString = CCString; using LOWLIGHTString = CCString; } #endif /* ZYPP_TUI_UTILS_COLORS_H_ */ libzypp-17.36.5/zypp-tui/utils/console.cc000066400000000000000000000040131476576476200203260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ /** \file console.cc * Miscellaneous console utilities. */ #include #include #include #include #include #include namespace ztui { // ---------------------------------------------------------------------------- // Read a string. "\004" (^D) on EOF. std::string readline_getline() { std::string ret; //::rl_catch_signals = 0; /* Get a line from the user. */ if ( char * line_read = ::readline( "zypper> " ) ) { ret = line_read; /* If the line has any text in it, save it on the history. */ if ( *line_read ) ::add_history( line_read ); ::free( line_read ); } else ret = "\004"; return ret; } // ---------------------------------------------------------------------------- unsigned get_screen_width() { if ( !::isatty(STDOUT_FILENO) ) return -1; // no clipping int width = 80; const char *cols_env = getenv("COLUMNS"); if ( cols_env ) width = ::atoi( cols_env ); else { ::rl_initialize(); //::rl_reset_screen_size(); ::rl_get_screen_size( NULL, &width ); } // safe default if ( !width ) width = 80; return width; } // ---------------------------------------------------------------------------- void clear_keyboard_buffer() { // note: this will not clear characters typed after the last \n std::ifstream stm( "/dev/tty" ); char s[8]; while (stm.good() && stm.readsome(s, 8)); } } libzypp-17.36.5/zypp-tui/utils/console.h000066400000000000000000000030071476576476200201720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ /** \file console.h * Miscellaneous console utilities. */ #ifndef ZYPP_TUI_UTILS_CONSOLE_H_ #define ZYPP_TUI_UTILS_CONSOLE_H_ #include namespace ztui { /** Use readline to get line of input. */ std::string readline_getline(); /** * Reads COLUMNS environment variable or gets the screen width from readline, * in that order. Falls back to 80 if all that fails. * * \NOTE In case stdout is not connected to a terminal max. unsigned * is returned. This should prevent clipping when output is redirected. */ unsigned get_screen_width(); /** * Clear the keyboard buffer. * Useful before showing the user prompt message to catch any unwanted * key hits (bnc #649248). * * \NOTE This will not clear characters typed after the last \n */ void clear_keyboard_buffer(); } #endif /* ZYPP_TUI_UTILS_CONSOLE_H_ */ libzypp-17.36.5/zypp-tui/utils/richtext.cc000066400000000000000000000140761476576476200205300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #include #include #include #include #include #include namespace ztui { using std::endl; using namespace zypp; enum tags { PARAGRAPH, PRE, BLOCKQUOTE, BOLD, UNDERLINED, ANCHOR, HEADER1, HEADER2, HEADER3, BREAK_LINE, EM, ITALIC, HR, LI, OL, UL, TT, QT, BIG, CODE, CENTER, //special for unknown tags UNKNOWN }; std::map _rtTagmap; bool pre; bool ordered; unsigned count_list_items; void fillTagmap() { _rtTagmap["p"] = PARAGRAPH; _rtTagmap["a"] = ANCHOR; _rtTagmap["b"] = BOLD; _rtTagmap["u"] = UNDERLINED; _rtTagmap["i"] = ITALIC; _rtTagmap["br"] = BREAK_LINE; _rtTagmap["em"] = EM; _rtTagmap["h1"] = HEADER1; _rtTagmap["h2"] = HEADER2; _rtTagmap["h3"] = HEADER3; _rtTagmap["hr"] = HR; _rtTagmap["li"] = LI; _rtTagmap["ol"] = OL; _rtTagmap["ul"] = UL; _rtTagmap["qt"] = QT; _rtTagmap["tt"] = TT; _rtTagmap["big"] = BIG; _rtTagmap["pre"] = PRE; _rtTagmap["bold"] = BOLD; _rtTagmap["code"] = CODE; _rtTagmap["font"] = UNKNOWN; //not parsed in parser _rtTagmap["large"] = UNKNOWN; //same as ncurses _rtTagmap["small"] = UNKNOWN; // same as necurses _rtTagmap["center"] = CENTER; _rtTagmap["strong"] = BOLD; // same as necurses _rtTagmap["blockquote"] = BLOCKQUOTE; // same as necurses } std::string closeTag( std::vector& tagStack ) { if( tagStack.empty() ) { WAR << "closing tag before any opening" << endl;; return ""; } tags t = tagStack.back(); tagStack.pop_back(); switch ( t ) { case PARAGRAPH: return "\n\n"; case LI: return "\n"; case PRE: pre = false; //fall thrue default: return ""; } } std::string openTag( std::vector& tagStack, std::string & tag ) { tag = str::trim(tag); std::map::const_iterator it = _rtTagmap.find( tag ); tags t; if ( it == _rtTagmap.end() ) { if ( tag.size() > 3 && tag[0] == '!' && tag[1] == '-' && tag[2] == '-' ) return ""; //comment WAR << "unknown rich text tag " << tag << endl; t = UNKNOWN; } else { t = it->second; } tagStack.push_back( t ); switch ( t ) { case HR: tagStack.pop_back(); //hr haven't closing tag return "--------------------"; case PARAGRAPH: return ""; case BREAK_LINE: tagStack.pop_back(); //br haven't closing tag return "\n"; case OL: ordered = true; count_list_items = 0; return "\n"; case UL: ordered = false; return "\n"; case LI: if ( ordered ) { std::ostringstream res; res << ++count_list_items << ") "; return res.str(); } else { return "- "; } case PRE: pre = true; //fall thrue default: return ""; } } std::map ampersmap; void fillAmpersmap() { ampersmap["gt"] =">"; ampersmap["lt"] ="<"; ampersmap["amp"] ="&"; ampersmap["quot"] ="\""; ampersmap["nbsp"] =" "; //TODO REAL NBSP ampersmap["product"] ="product"; //TODO replace with real name } std::string getStringFromAmpr( const std::string & str ) { if ( ampersmap.empty() ) fillAmpersmap(); std::string::size_type end = str.find( ';' ); DBG << "val ampr is: " << str << endl; if ( str[0] == '#' ) //first is value { int res = 0; std::istringstream sstr( str.substr( 1, end ) ); sstr >> res; DBG << res << endl; if ( res != 0 ) { return std::string( 1,(char)res ); //return char } else { WAR << "unknown number " << str << endl; return ""; } } DBG << end << " " << str.substr( 0, end ) << endl; return ampersmap[str.substr( 0, end )]; } std::string processRichText( const std::string& text ) { if ( _rtTagmap.empty() ) fillTagmap(); //state machine vars pre = false; std::vector tagStack; std::string res; res.reserve( text.size() ); std::string::size_type pos = 0; do { switch( text[pos] ) { case ' ': case '\n': case '\t': case '\v': case '\r': if ( pre ) res.push_back( text[pos] ); else { if ( text[pos] == ' ' ) res.push_back( ' ' ); } break; case '<': if ( pos+1 == text.npos ) { WAR << "ended with nonclosed tag."<< endl; return res; //chyba, tohle by se nemelo stavat } if ( text[pos+1] == '/' ) //close tag { pos = text.find( '>', pos ); res.append( closeTag( tagStack ) ); } else { std::string::size_type tagEndPos = text.find( '>', pos ); if ( tagEndPos == text.npos ) { WAR << "ended with non-closed tag " << endl; return res; } std::string tagname( text.substr( pos+1, tagEndPos-pos-1 ) ); pos = tagEndPos; res.append( openTag( tagStack, tagname ) ); } break; case '&': { std::string::size_type semipos = text.find( ';', pos ); std::string tmp = getStringFromAmpr( text.substr( pos+1, pos-semipos-1 ) ); DBG << "tmp is: " << tmp << endl; res.append( tmp ); pos = semipos; break; } default: res.push_back( text[pos] ); } ++pos; } while ( pos != text.size() ); return res; } } libzypp-17.36.5/zypp-tui/utils/richtext.h000066400000000000000000000033751476576476200203720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_TUI_UTILS_RICHTEXT_H_ #define ZYPP_TUI_UTILS_RICHTEXT_H_ #include #include #include namespace ztui { /** Print [Rich]Text optionally indented. * Richtext is introduced by a '' * or '

* The need for refresh is evaluated according to the following conditions, * in that order: *

    *
  • the refresh policy (refresh may be forced) *
  • the repo.refresh.delay ZConfig value compared to the difference between * cached index file timestamp and actual time *
  • the timestamp of cached repo index file compared to the remote * index file timestamp. *
*

* This method checks the status against the specified url only. If more * baseurls are defined for in the RepoInfo, each one must be check * individually. Example: * * * * RepoInfo info; * // try urls one by one * for ( RepoInfo::urls_const_iterator it = info.baseUrlsBegin(); * it != info.baseUrlsEnd(); ++it ) * { * try * { * // check whether to refresh metadata * // if the check fails for this url, it throws, so another url will be checked * if (checkIfToRefreshMetadata(info, *it, policy)!=RepoInfo::REFRESH_NEEDED) * return; * * // do the actual refresh * } * catch (const Exception & e) * { * ZYPP_CAUGHT(e); * ERR << *it << " doesn't look good. Trying another url." << endl; * } * } // for all urls * * handle("No more URLs."); * * * * \param info * \param url * \param policy * \return state of repository * \see RefreshCheckStatus * \throws RepoUnknownTypeException * \throws repo::RepoNoAliasException if can't figure an alias * \throws Exception on unknown error * */ RefreshCheckStatus checkIfToRefreshMetadata( const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy = RefreshIfNeeded); /** * \short Path where the metadata is downloaded and kept * * Given a repoinfo, tells where \ref RepoManager will download * and keep the raw metadata. * * \param info Repository information * * \throws repo::RepoNoAliasException if can't figure an alias */ Pathname metadataPath( const RepoInfo &info ) const; /** * \short Path where the rpm packages are downloaded and kept * * Given a repoinfo, tells where \ref RepoProvidePackage will download * and keep the .rpm files. * * \param info Repository information * * \throws repo::RepoNoAliasException if can't figure an alias */ Pathname packagesPath( const RepoInfo &info ) const; /** * \short Refresh local raw cache * * Will try to download the metadata * * In case of falure the metadata remains * as it was before. * * \throws repo::RepoNoUrlException if no urls are available. * \throws repo::RepoNoAliasException if can't figure an alias * \throws repo::RepoUnknownTypeException if the metadata is unknown * \throws repo::RepoNoPermissionException if the user has no permission to update(write) the caches * \throws repo::RepoException if the repository is invalid * (no valid metadata found at any of baseurls) */ void refreshMetadata( const RepoInfo &info, RawMetadataRefreshPolicy policy = RefreshIfNeeded, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Clean local metadata * * Empty local metadata. * * \throws repo::RepoNoAliasException if can't figure an alias * \throws Exception on unknown error. */ void cleanMetadata( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Clean local package cache * * Empty local directory with downloaded packages * * \throws repo::RepoNoAliasException if can't figure an alias * \throws Exception on unknown error. */ void cleanPackages( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Status of metadata cache */ RepoStatus cacheStatus( const RepoInfo &info ) const; /** * \short Refresh local cache * * Will try to build the cache from local metadata. * * If the cache exists it will be overwriten. * * \note the local metadata must be valid. * * \throws repo::RepoNoAliasException if can't figure * an alias to look in cache * \throws repo::RepoMetadataException if the metadata * is not enough to build a cache (empty, incorrect, or * refresh needed) * \throws repo::RepoNoPermissionException if the user has no permission to update(write) the caches * \throws repo::RepoUnknownTypeException * \throws parser::ParseException if parser encounters an error. * \throws Exception on unknown error. */ void buildCache( const RepoInfo &info, CacheBuildPolicy policy = BuildIfNeeded, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short clean local cache * * Clean the cached version of the metadata * * \note the local metadata must be valid. * * \throws repo::RepoNoAliasException if can't figure an alias to look in cache * \throws cache::CacheRecordNotFoundException if the cache could not be * cleaned because of repository record not found. * \throws Exception on unknown error. */ void cleanCache( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Whether a repository exists in cache * * \param RepoInfo to be checked. */ bool isCached( const RepoInfo &info ) const; /** * \short Load resolvables into the pool * * Creating from cache requires that the repository is * refreshed (metadata downloaded) and cached * * \throws repo::RepoNoAliasException if can't figure an alias to look in cache * \throw RepoNotCachedException When the source is not cached. */ void loadFromCache( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * Remove any subdirectories of cache directories which no longer belong * to any of known repositories. * * These can be temporary directories left by interrupted refresh, * or dirs left after changing .repo files outside of libzypp. */ void cleanCacheDirGarbage( const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Probe repo metadata type. * * The location to probe consists of the base \a url (you may think of it as * a mountpoint) and the \a path to the repository on the mounted media * (ususally \c / ). */ repo::RepoType probe( const Url & url, const Pathname & path ) const; /** * \overload Using the default path \c "/". */ repo::RepoType probe( const Url & url ) const; /** * \short Adds a repository to the list of known repositories. * * * * \throws repo::RepoAlreadyExistsException If the repo clash some * unique attribute like alias * \throws RepoUnknownType * If RepoManagerOptions::probe is true * and repository type can't be determined. * \throws RepoException * If RepoManagerOptions::probe is true and access to the url fails. * \throws Exception On other errors. */ void addRepository( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Adds repositores from a repo file to the list of known repositories. * \param url Url of the repo file. The URL is subject to repo variable expansion. * * \throws repo::RepoAlreadyExistsException If the repo clash some * unique attribute like alias * \throws MediaException If the access to the url fails * \throws ParseException If the file parsing fails * \throws RepoUnknownType If repository type can't be determined * \throws RepoException ON other repository related errors * \throws Exception On other errors. */ void addRepositories( const Url &url, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Remove the best matching repository from known repos list * * \throws RepoNotFoundException If no repo match */ void removeRepository( const RepoInfo & info, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Modify repository attributes * * \throws RepoAlreadyExistsException if the alias specified in newinfo * is already used by another repository * \throws RepoNotFoundException If no repo match * \throws ParseException If the file parsing fails * \throws Exception On other errors. */ void modifyRepository( const std::string &alias, const RepoInfo & newinfo, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** \overload Take alias from RepoInfo. */ void modifyRepository( const RepoInfo & newinfo, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ) { modifyRepository( newinfo.alias(), newinfo, progressrcv ); } /** * \short Find a matching repository info * * \note if multiple repositories incorrectly share the * same alias, the first one found will be returned. * * \param alias Repository alias * \param progressrcv Progress reporting function * \return RepoInfo of the found repository * \throws RepoNotFoundException If no repo match the alias * \throws ParseException If the file parsing fails * \throws Exception On other errors. */ RepoInfo getRepositoryInfo( const std::string &alias, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** * \short Find repository info by URL. * * \param url URL to find. * \param urlview url::ViewOption to influence URL matching. * \param progressrcv Progress receiver function. * \return RepoInfo of the found repository. * * \note if multpile repositories incorrectly share the * same URL, the first one found will be returned. * * \note the string representation of the URLs are compared. * The \a urlview can be used to influence which parts of the URL are to be compared. * * \throws RepoNotFoundException If no repo match * \throws ParseException If the file parsing fails * \throws Exception On other errors. */ RepoInfo getRepositoryInfo( const Url & url, const url::ViewOption & urlview = url::ViewOption::DEFAULTS, const ProgressData::ReceiverFnc & progressrcv = ProgressData::ReceiverFnc() ); /** \name Known services. * * The known services are read from * \ref RepoManagerOptions::knownServicesPath passed on the Ctor. * Which defaults to ZYpp global settings. */ //@{ /** * Gets true if no service is in RepoManager (so no one in specified location) * * \return true if any ServiceInfo is in RepoManager */ bool serviceEmpty() const; /** * Gets count of service in RepoManager (in specified location) * * \return count of service */ ServiceSizeType serviceSize() const; /** * Iterator to first service in internal storage. * \note Iterator is immutable, so you cannot change pointed ServiceInfo * \return Iterator to first service */ ServiceConstIterator serviceBegin() const; /** * Iterator to place behind last service in internal storage. * \return iterator to end */ ServiceConstIterator serviceEnd() const; /** Iterate the known services. */ Iterable services() const; /** List of known services. */ std::list knownServices() const { return std::list(serviceBegin(),serviceEnd()); } /** * \short Finds ServiceInfo by alias or return \ref ServiceInfo::noService * * \param alias unique identifier of service * \return information about service */ ServiceInfo getService( const std::string & alias ) const; /** Return whether there is a known service for \c alias. */ bool hasService( const std::string & alias ) const; //@} /** * \short Probe the type or the service. */ repo::ServiceType probeService( const Url &url ) const; /** * Adds a new service by its alias and URL * * \param alias unique identifier of the service * \param url url to service * * \throws FIXME RepoAlreadyExistException and as reponame is service name */ void addService( const std::string & alias, const Url& url ); /** * Adds new service * * \param service service info * * \throws FIXME RepoAlreadyExistException and as reponame is service name */ void addService( const ServiceInfo & service ); /** * Removes service specified by its name * * \param alias unique indientifier of the service to remove * * \throws RepoException if service is not found or file with ServiceInfo cannot be deleted * \throws Exception if file contain more services and rewrite file failed */ void removeService( const std::string & alias ); /** \overload Take alias from ServiceInfo */ void removeService( const ServiceInfo & service ); /** * Refreshes all enabled services. * * \see refreshService(ServiceInfo) */ void refreshServices( const RefreshServiceOptions & options_r = RefreshServiceOptions() ); /** * Refresh specific service. * * \param alias unique indientifier of the service to refresh * * \throws RepoException if service is not found. * \throws MediaException If there's a problem downloading the repo index file. */ void refreshService( const std::string & alias, const RefreshServiceOptions & options_r = RefreshServiceOptions() ); /** \overload Take alias from ServiceInfo */ void refreshService( const ServiceInfo & service, const RefreshServiceOptions & options_r = RefreshServiceOptions() ); /** * Modifies service file (rewrites it with new values) and underlying * repositories if needed. * * Modifications of a service can lead to rewrite of all .repo files of * contained repositories. Particularily, disabling a service (changing * ServiceInfo::enabled() from true to false) will disable all contained * repositories. Renaming of a service will modify the "service" key * of all contained repositories. * * \param oldAlias Old alias of the service * \param service ServiceInfo object containing new data * * \throws RepoException if sservice with oldAlias is not known * \throws Exception if have problems with files */ void modifyService( const std::string & oldAlias, const ServiceInfo & service ); /** \overload Take alias from ServiceInfo. */ void modifyService( const ServiceInfo & service ) { modifyService( service.alias(), service ); } /*! * Checks for any of the given \a urls if there is no geoip data available, caches the results * in the metadata cache for 24hrs. The given urls need to be configured as valid geoIP targets ( usually download.opensuse.org ) */ void refreshGeoIp ( const RepoInfo::url_set &urls ); private: /** * Functor thats filter RepoInfo by service which it belongs to. */ struct MatchServiceAlias { public: MatchServiceAlias( std::string alias_ ) : alias(std::move(alias_)) {} bool operator()( const RepoInfo & info ) const { return info.service() == alias; } private: std::string alias; }; public: /** * fill to output iterator repositories in service name. This output iterator can perform * any action on with Repo or service Container, because it is sets and it isn't dynamic recreate. * * \note Don't use this function with RepoManager::removeRepository(), it will lead to segfaults * due to invalidated internal iterators. FIXME can this be solved (using STL) so that this * warning would not be needed? * * \param alias service alias * \param out output iterator which get all the repositories belonging to * specified service * * example how set priority for each RepoInfo in this service: * \code * //functor * class ChangePriority * { * private: * int priority; * public: * ChangePriority(int prio) : priority(prio) {} * // missing rewrite priority back via RepoManager::modifyRepo * void doIt( RepoInfo info ) { info.setPriority(priority); } * } * * //somewhere in code * ChangePriority changer(10); * getRepositoriesInService(name, * boost::make_function_output_iterator( * bind(&ChangePriority::doIt, &changer, _1))); * \endcode */ template void getRepositoriesInService( const std::string & alias, OutputIterator out ) const { MatchServiceAlias filter(alias); std::copy( boost::make_filter_iterator( filter, repoBegin(), repoEnd() ), boost::make_filter_iterator( filter, repoEnd(), repoEnd() ), out); } private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates RepoManager Stream output */ std::ostream & operator<<( std::ostream & str, const RepoManager & obj ) ZYPP_API; /** Iterate the known repositories. */ inline Iterable RepoManager::repos() const { return makeIterable( repoBegin(), repoEnd() ); } /** Iterate the known services. */ inline Iterable RepoManager::services() const { return makeIterable( serviceBegin(), serviceEnd() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP2_REPOMANAGER_H libzypp-17.36.5/zypp/RepoManagerFlags.h000066400000000000000000000035031476576476200177470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoManager.h * */ #ifndef ZYPP_REPOMANAGER_FLAGS_INCLUDED_H #define ZYPP_REPOMANAGER_FLAGS_INCLUDED_H #include namespace zypp { namespace RepoManagerFlags { enum RawMetadataRefreshPolicy { RefreshIfNeeded, RefreshForced, RefreshIfNeededIgnoreDelay }; enum CacheBuildPolicy { BuildIfNeeded, BuildForced }; /** Flags for tuning RefreshService */ enum RefreshServiceBit { RefreshService_restoreStatus = (1<<0), ///< Force restoring repo enabled/disabled status RefreshService_forceRefresh = (1<<1), ///< Force refresh even if TTL is not reached }; ZYPP_DECLARE_FLAGS(RefreshServiceFlags,RefreshServiceBit); /** Options tuning RefreshService */ using RefreshServiceOptions = RefreshServiceFlags; /** * Possibly return state of RepoManager::checkIfToRefreshMetadata function */ enum RefreshCheckStatus { REFRESH_NEEDED, /**< refresh is needed */ REPO_UP_TO_DATE, /**< repository not changed */ REPO_CHECK_DELAYED /**< refresh is delayed due to settings */ }; } ZYPP_DECLARE_OPERATORS_FOR_FLAGS( RepoManagerFlags::RefreshServiceFlags ); } #endif //ZYPP_REPOMANAGER_FLAGS_INCLUDED_H libzypp-17.36.5/zypp/RepoManagerOptions.cc000066400000000000000000000052331476576476200205060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoManagerOptions.cc * */ #include "RepoManagerOptions.h" #include namespace zypp { /////////////////////////////////////////////////////////////////// // // class RepoManagerOptions // //////////////////////////////////////////////////////////////////// RepoManagerOptions::RepoManagerOptions( const Pathname & root_r ) { repoCachePath = Pathname::assertprefix( root_r, ZConfig::instance().repoCachePath() ); repoRawCachePath = Pathname::assertprefix( root_r, ZConfig::instance().repoMetadataPath() ); repoSolvCachePath = Pathname::assertprefix( root_r, ZConfig::instance().repoSolvfilesPath() ); repoPackagesCachePath = Pathname::assertprefix( root_r, ZConfig::instance().repoPackagesPath() ); knownReposPath = Pathname::assertprefix( root_r, ZConfig::instance().knownReposPath() ); knownServicesPath = Pathname::assertprefix( root_r, ZConfig::instance().knownServicesPath() ); pluginsPath = Pathname::assertprefix( root_r, ZConfig::instance().pluginsPath() ); probe = ZConfig::instance().repo_add_probe(); rootDir = root_r; } RepoManagerOptions RepoManagerOptions::makeTestSetup( const Pathname & root_r ) { RepoManagerOptions ret; ret.repoCachePath = root_r; ret.repoRawCachePath = root_r/"raw"; ret.repoSolvCachePath = root_r/"solv"; ret.repoPackagesCachePath = root_r/"packages"; ret.knownReposPath = root_r/"repos.d"; ret.knownServicesPath = root_r/"services.d"; ret.pluginsPath = root_r/"plugins"; ret.rootDir = root_r; return ret; } std::ostream & operator<<( std::ostream & str, const RepoManagerOptions & obj ) { #define OUTS(X) str << " " #X "\t" << obj.X << std::endl str << "RepoManagerOptions (" << obj.rootDir << ") {" << std::endl; OUTS( repoRawCachePath ); OUTS( repoSolvCachePath ); OUTS( repoPackagesCachePath ); OUTS( knownReposPath ); OUTS( knownServicesPath ); OUTS( pluginsPath ); str << "}" << std::endl; #undef OUTS return str; } } libzypp-17.36.5/zypp/RepoManagerOptions.h000066400000000000000000000046061476576476200203530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoManager.h * */ #ifndef ZYPP_REPOMANAGER_OPTIONS_H #define ZYPP_REPOMANAGER_OPTIONS_H #include #include #include namespace zypp { /** * Repo manager settings. * Settings default to ZYpp global settings. */ struct ZYPP_API RepoManagerOptions { /** Default ctor following \ref ZConfig global settings. * If an optional \c root_r directory is given, all paths will * be prefixed accordingly. * \code * root_r\repoCachePath * \repoRawCachePath * \repoSolvCachePath * \repoPackagesCachePath * \knownReposPath * \endcode */ RepoManagerOptions( const Pathname & root_r = Pathname() ); /** Test setup adjusting all paths to be located below one \c root_r directory. * \code * root_r\ - repoCachePath * \raw - repoRawCachePath * \solv - repoSolvCachePath * \packages - repoPackagesCachePath * \repos.d - knownReposPath * \endcode */ static RepoManagerOptions makeTestSetup( const Pathname & root_r ); Pathname repoCachePath; Pathname repoRawCachePath; Pathname repoSolvCachePath; Pathname repoPackagesCachePath; Pathname knownReposPath; Pathname knownServicesPath; Pathname pluginsPath; bool probe; /** * Target distro ID to be used when refreshing repo index services. * Repositories not maching this ID will be skipped/removed. * * If empty, \ref Target::targetDistribution() will be used instead. */ std::string servicesTargetDistro; /** remembers root_r value for later use */ Pathname rootDir; }; std::ostream & operator<<( std::ostream & str, const RepoManagerOptions & obj ); } #endif libzypp-17.36.5/zypp/RepoStatus.cc000066400000000000000000000167241476576476200170520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoStatus.cc * */ #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { /** Recursive computation of max dir timestamp. */ void recursiveTimestamp( const Pathname & dir_r, time_t & max_r ) { std::list dircontent; if ( filesystem::readdir( dircontent, dir_r, false/*no dots*/ ) != 0 ) return; // readdir logged the error for_( it, dircontent.begin(), dircontent.end() ) { PathInfo pi( dir_r + *it, PathInfo::LSTAT ); if ( pi.isDir() ) { if ( pi.mtime() > max_r ) max_r = pi.mtime(); recursiveTimestamp( pi.path(), max_r ); } } } } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoStatus::Impl // /** RepoStatus implementation. */ struct RepoStatus::Impl { using Checksums = std::set; public: /** Assign data called from RepoStatus ctor (adds magic). * * \Note Changing magic will at once invalidate all solv file caches. * Helpfull if solv file content must be refreshed (e.g. due to different * repo2solv arguments) even if raw metadata are unchanged. Only values * set from a RepoStatus ctor need magic to be added! */ void assignFromCtor( std::string && checksum_r, Date && timestamp_r ) { if ( !checksum_r.empty() ) { static const std::string magic( "43" ); checksum_r += magic; _checksums.insert( std::move(checksum_r) ); } _timestamp = std::move(timestamp_r); } /** Inject raw data (no magic added). */ void inject( std::string && checksum_r, Date && timestamp_r ) { if ( !checksum_r.empty() ) { _checksums.insert( std::move(checksum_r) ); _cachedchecksum.reset(); } if ( timestamp_r > _timestamp ) _timestamp = std::move(timestamp_r); } /** Inject the raw data from rhs */ void injectFrom( const Impl & rhs ) { if ( &rhs == this ) // no self insert return; if ( !rhs._checksums.empty() ) { _checksums.insert( rhs._checksums.begin(), rhs._checksums.end() ); _cachedchecksum.reset(); } if ( rhs._timestamp > _timestamp ) _timestamp = rhs._timestamp; } bool empty() const { return _checksums.empty(); } std::string checksum() const { std::string ret; if ( _checksums.empty() ) return ret; if ( _checksums.size() == 1 ) ret = *_checksums.begin(); else { if ( !_cachedchecksum ) { std::stringstream ss; for ( std::string_view c : _checksums ) ss << c; _cachedchecksum = CheckSum::sha1(ss).checksum(); } ret = *_cachedchecksum; } return ret; } Date timestamp() const { return _timestamp; } /** Dump to log file (not to/from CookieFile). */ std::ostream & dumpOn( std::ostream & str ) const { return str << ( empty() ? "NO_REPOSTATUS" : checksum() ) << " " << time_t(_timestamp); } public: void assignFromCookieFile( const Pathname & path_r, bool useMtime_r = false ) { std::ifstream file( path_r.c_str() ); if ( not file ) { WAR << "No cookie file " << path_r << endl; return; } // line := "[checksum] time_t" !!! ALWAYS strip time from line std::string line { str::getline( file ) }; const std::string & time { str::stripLastWord( line ) }; Date stmp { useMtime_r ? PathInfo( path_r ).mtime() : str::strtonum( time ) }; inject( std::move(line), std::move(stmp) ); // raw inject to avoid magic being added } private: Checksums _checksums; Date _timestamp; mutable std::optional _cachedchecksum; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoStatus // /////////////////////////////////////////////////////////////////// RepoStatus::RepoStatus() : _pimpl( new Impl() ) {} RepoStatus::RepoStatus( const Pathname & path_r ) : _pimpl( new Impl() ) { PathInfo info( path_r ); if ( info.isExist() ) { if ( info.isFile() ) { _pimpl->assignFromCtor( filesystem::sha1sum( path_r ), Date( info.mtime() ) ); } else if ( info.isDir() ) { time_t t = info.mtime(); recursiveTimestamp( path_r, t ); _pimpl->assignFromCtor( CheckSum::sha1FromString( str::numstring( t ) ).checksum(), Date( t ) ); } } } RepoStatus::RepoStatus( const RepoInfo & info_r ) : _pimpl( new Impl() ) { _pimpl->assignFromCtor( CheckSum::sha1FromString( info_r.repoStatusString() ).checksum(), Date() ); } RepoStatus::RepoStatus( std::string checksum_r, Date timestamp_r ) : _pimpl( new Impl() ) { _pimpl->assignFromCtor( std::move(checksum_r), std::move(timestamp_r) ); } RepoStatus::~RepoStatus() {} RepoStatus RepoStatus::fromCookieFile( const Pathname & path_r ) { RepoStatus ret; ret._pimpl->assignFromCookieFile( path_r ); return ret; } RepoStatus RepoStatus::fromCookieFileUseMtime( const Pathname & path_r ) { RepoStatus ret; ret._pimpl->assignFromCookieFile( path_r, /*useMtime*/true ); return ret; } void RepoStatus::saveToCookieFile( const Pathname & path_r ) const { std::ofstream file(path_r.c_str()); if (!file) { ZYPP_THROW (Exception( "Can't open " + path_r.asString() ) ); } file << _pimpl->checksum() << " " << time_t(_pimpl->timestamp()) << endl; file.close(); } bool RepoStatus::empty() const { return _pimpl->empty(); } Date RepoStatus::timestamp() const { return _pimpl->timestamp(); } std::ostream & operator<<( std::ostream & str, const RepoStatus & obj ) { return obj._pimpl->dumpOn( str ); } RepoStatus operator&&( const RepoStatus & lhs, const RepoStatus & rhs ) { RepoStatus result { lhs }; result._pimpl->injectFrom( *rhs._pimpl ); return result; } bool operator==( const RepoStatus & lhs, const RepoStatus & rhs ) { return lhs._pimpl->checksum() == rhs._pimpl->checksum(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/RepoStatus.h000066400000000000000000000114561476576476200167110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoStatus.h * */ #ifndef ZYPP2_REPOSTATUS_H #define ZYPP2_REPOSTATUS_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class RepoInfo; /////////////////////////////////////////////////////////////////// /// \class RepoStatus /// \brief Track changing files or directories. /// /// Compute timestamp and checksum for individual files or /// directories (recursively) to track changing content. /// /// The timestamp most probably denotes the time the data were /// changed the last time, that's why it is exposed. /// /// The checksum however is an implementation detail and of no /// use outside this class. \ref operator== tells if the checksums /// of two rRepoStatus are the same. /////////////////////////////////////////////////////////////////// class ZYPP_API RepoStatus { friend std::ostream & operator<<( std::ostream & str, const RepoStatus & obj ); friend RepoStatus operator&&( const RepoStatus & lhs, const RepoStatus & rhs ); friend bool operator==( const RepoStatus & lhs, const RepoStatus & rhs ); public: /** Default ctor */ RepoStatus(); /** Compute status for single file or directory (recursively) * * Timestamp is the files mtime or the youngest mtime in the * directory tree. * * \note Construction from a non existing file or direcory * will result in an empty status. */ explicit RepoStatus( const Pathname & path_r ); /** Compute status of a \a RepoInfo to track changes requiring a refresh. */ explicit RepoStatus( const RepoInfo & info_r ); /** Explicitly specify checksum string and timestamp to use. */ RepoStatus( std::string checksum_r, Date timestamp_r ); /** Dtor */ ~RepoStatus(); RepoStatus(const RepoStatus &) = default; RepoStatus(RepoStatus &&) noexcept = default; RepoStatus &operator=(const RepoStatus &) = default; RepoStatus &operator=(RepoStatus &&) noexcept = default; public: /** Reads the status from a cookie file. * \returns An empty \ref RepoStatus if the file does not * exist or is not readable. * \see \ref saveToCookieFile */ static RepoStatus fromCookieFile( const Pathname & path ); /** Reads the status from a cookie file but uses the files mtime. * Similar to the ctor's behavior, the returned timestamp * is the cookie file's mtime. By touching an index or cookie * file one may state the last time the data were found being * up-to-date. * Such a CookieFile is used e.g. as a pseudo metadata indexfile * for plaindir repos. */ static RepoStatus fromCookieFileUseMtime( const Pathname & path ); /** Save the status information to a cookie file * \throws Exception if the file can't be saved * \see \ref fromCookieFile */ void saveToCookieFile( const Pathname & path_r ) const; public: /** Whether the status is empty (empty checksum) */ bool empty() const; /** The time the data were changed the last time */ Date timestamp() const; public: struct Impl; ///< Implementation private: RWCOW_pointer _pimpl; ///< Pointer to implementation }; /////////////////////////////////////////////////////////////////// /** \relates RepoStatus Stream output */ std::ostream & operator<<( std::ostream & str, const RepoStatus & obj ) ZYPP_API; /** \relates RepoStatus Combine two RepoStatus (combined checksum and newest timestamp) */ RepoStatus operator&&( const RepoStatus & lhs, const RepoStatus & rhs ) ZYPP_API; /** \relates RepoStatus Whether 2 RepoStatus refer to the same content checksum */ bool operator==( const RepoStatus & lhs, const RepoStatus & rhs ) ZYPP_API; /** \relates RepoStatus Whether 2 RepoStatus refer to different content checksums */ inline bool operator!=( const RepoStatus & lhs, const RepoStatus & rhs ) { return ! ( lhs == rhs ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP2_REPOSTATUS_H libzypp-17.36.5/zypp/Repository.cc000066400000000000000000000340471476576476200171160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Repository.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// const Repository Repository::noRepository; const std::string & Repository::systemRepoAlias() { return sat::detail::PoolImpl::systemRepoAlias(); } ///////////////////////////////////////////////////////////////// sat::detail::CRepo * Repository::get() const { return myPool().getRepo( _id ); } #define NO_REPOSITORY_RETURN( VAL ) \ sat::detail::CRepo * _repo( get() ); \ if ( ! _repo ) return VAL #define NO_REPOSITORY_THROW( VAL ) \ sat::detail::CRepo * _repo( get() ); \ if ( ! _repo ) ZYPP_THROW( VAL ) bool Repository::isSystemRepo() const { NO_REPOSITORY_RETURN( false ); return myPool().isSystemRepo( _repo ); } std::string Repository::alias() const { NO_REPOSITORY_RETURN( std::string() ); if ( ! _repo->name ) return std::string(); return _repo->name; } std::string Repository::name() const { return info().name(); } std::string Repository::label() const { return info().label(); } int Repository::satInternalPriority() const { NO_REPOSITORY_RETURN( INT_MIN ); return _repo->priority; } int Repository::satInternalSubPriority() const { NO_REPOSITORY_RETURN( INT_MIN ); return _repo->subpriority; } Repository::ContentRevision Repository::contentRevision() const { NO_REPOSITORY_RETURN( ContentRevision() ); sat::LookupRepoAttr q( sat::SolvAttr::repositoryRevision, *this ); return q.empty() ? std::string() : q.begin().asString(); } Repository::ContentIdentifier Repository::contentIdentifier() const { NO_REPOSITORY_RETURN( ContentIdentifier() ); sat::LookupRepoAttr q( sat::SolvAttr::repositoryRepoid, *this ); return q.empty() ? std::string() : q.begin().asString(); } bool Repository::hasContentIdentifier( const ContentIdentifier & id_r ) const { NO_REPOSITORY_RETURN( false ); sat::LookupRepoAttr q( sat::SolvAttr::repositoryRepoid, *this ); for_( it, q.begin(), q.end() ) if ( it.asString() == id_r ) return true; return false; } zypp::Date Repository::generatedTimestamp() const { NO_REPOSITORY_RETURN( 0 ); sat::LookupRepoAttr q( sat::SolvAttr::repositoryTimestamp, *this ); return( q.empty() ? 0 : q.begin().asUnsigned() ); } zypp::Date Repository::suggestedExpirationTimestamp() const { NO_REPOSITORY_RETURN( 0 ); Date generated = generatedTimestamp(); if ( ! generated ) return 0; // do not calculate over a missing generated timestamp sat::LookupRepoAttr q( sat::SolvAttr::repositoryExpire, *this ); if ( q.empty() ) return 0; return generated + Date(q.begin().asUnsigned()); } Repository::Keywords Repository::keywords() const { NO_REPOSITORY_RETURN( Keywords() ); return Keywords( sat::SolvAttr::repositoryKeywords, *this, sat::LookupAttr::REPO_ATTR ); } bool Repository::hasKeyword( const std::string & val_r ) const { for ( const auto & val : keywords() ) if ( val == val_r ) return true; return false; } bool Repository::maybeOutdated() const { NO_REPOSITORY_RETURN( false ); // system repo is not mirrored if ( isSystemRepo() ) return false; Date suggested = suggestedExpirationTimestamp(); // if no data, don't suggest if ( ! suggested ) return false; return suggestedExpirationTimestamp() < Date::now(); } bool Repository::providesUpdatesFor( const CpeId & cpeid_r ) const { NO_REPOSITORY_RETURN( false ); if ( ! cpeid_r ) return false; // filter queries/products without CpeId, as an empty CpeId matches ANYthing. // check in repository metadata for_( it, updatesProductBegin(), updatesProductEnd() ) { if ( compare( cpeid_r, it.cpeId(), SetRelation::subset ) ) return true; } // check whether known products refer to this as update repo sat::LookupRepoAttr myIds( sat::SolvAttr::repositoryRepoid, *this ); // usually just one, but... if ( ! myIds.empty() ) { const ResPool & pool( ResPool::instance() ); for_( it, pool.byKindBegin(), pool.byKindEnd() ) { Product::constPtr prod( (*it)->asKind() ); if ( compare( cpeid_r, prod->cpeId(), SetRelation::superset ) ) { for_( myId, myIds.begin(), myIds.end() ) { if ( prod->hasUpdateContentIdentifier( myId.asString() ) ) return true; } } } } return false; } bool Repository::isUpdateRepo() const { NO_REPOSITORY_RETURN( false ); // check in repository metadata if ( updatesProductBegin() != updatesProductEnd() ) return true; // check whether known products refer to this as update repo sat::LookupRepoAttr myIds( sat::SolvAttr::repositoryRepoid, *this ); // usually just one, but... if ( ! myIds.empty() ) { const ResPool & pool( ResPool::instance() ); for_( it, pool.byKindBegin(), pool.byKindEnd() ) { for_( myId, myIds.begin(), myIds.end() ) { if ( (*it)->asKind()->hasUpdateContentIdentifier( myId.asString() ) ) return true; } } } return false; } bool Repository::solvablesEmpty() const { NO_REPOSITORY_RETURN( true ); return !_repo->nsolvables; } Repository::size_type Repository::solvablesSize() const { NO_REPOSITORY_RETURN( 0 ); return _repo->nsolvables; } Repository::SolvableIterator Repository::solvablesBegin() const { NO_REPOSITORY_RETURN( make_filter_iterator( detail::ByRepository( *this ), sat::detail::SolvableIterator(), sat::detail::SolvableIterator() ) ); return make_filter_iterator( detail::ByRepository( *this ), sat::detail::SolvableIterator(_repo->start), sat::detail::SolvableIterator(_repo->end) ); } Repository::SolvableIterator Repository::solvablesEnd() const { NO_REPOSITORY_RETURN( make_filter_iterator( detail::ByRepository( *this ), sat::detail::SolvableIterator(), sat::detail::SolvableIterator() ) ); return make_filter_iterator(detail::ByRepository( *this ), sat::detail::SolvableIterator(_repo->end), sat::detail::SolvableIterator(_repo->end) ); } Repository::ProductInfoIterator Repository::compatibleWithProductBegin() const { NO_REPOSITORY_RETURN( ProductInfoIterator() ); return ProductInfoIterator( sat::SolvAttr::repositoryDistros, *this ); } Repository::ProductInfoIterator Repository::compatibleWithProductEnd() const { return ProductInfoIterator(); } Repository::ProductInfoIterator Repository::updatesProductBegin() const { NO_REPOSITORY_RETURN( ProductInfoIterator() ); return ProductInfoIterator( sat::SolvAttr::repositoryUpdates, *this ); } Repository::ProductInfoIterator Repository::updatesProductEnd() const { return ProductInfoIterator(); } RepoInfo Repository::info() const { NO_REPOSITORY_RETURN( RepoInfo() ); return myPool().repoInfo( _repo ); } void Repository::setInfo( const RepoInfo & info_r ) { NO_REPOSITORY_THROW( Exception( "Can't set RepoInfo for norepo." ) ); if ( info_r.alias() != alias() ) { ZYPP_THROW( Exception( str::form( "RepoInfo alias (%s) does not match repository alias (%s)", info_r.alias().c_str(), alias().c_str() ) ) ); } myPool().setRepoInfo( _repo, info_r ); MIL << *this << endl; } void Repository::clearInfo() { NO_REPOSITORY_RETURN(); myPool().setRepoInfo( _repo, RepoInfo() ); } void Repository::eraseFromPool() { NO_REPOSITORY_RETURN(); MIL << *this << " removed from pool" << endl; myPool()._deleteRepo( _repo ); _id = sat::detail::noRepoId; } Repository Repository::nextInPool() const { NO_REPOSITORY_RETURN( noRepository ); for_( it, sat::Pool::instance().reposBegin(), sat::Pool::instance().reposEnd() ) { if ( *it == *this ) { if ( ++it != _for_end ) return *it; break; } } return noRepository; } void Repository::addSolv( const Pathname & file_r ) { NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo." ) ); AutoDispose file( ::fopen( file_r.c_str(), "re" ), ::fclose ); if ( file == NULL ) { file.resetDispose(); ZYPP_THROW( Exception( "Can't open solv-file: "+file_r.asString() ) ); } if ( myPool()._addSolv( _repo, file ) != 0 ) { ZYPP_THROW( Exception( "Error reading solv-file: "+file_r.asString() ) ); } MIL << *this << " after adding " << file_r << endl; } void Repository::addHelix( const Pathname & file_r ) { NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo." ) ); std::string command( file_r.extension() == ".gz" ? "zcat " : "cat " ); command += file_r.asString(); AutoDispose file( ::popen( command.c_str(), "re" ), ::pclose ); if ( file == NULL ) { file.resetDispose(); ZYPP_THROW( Exception( "Can't open helix-file: "+file_r.asString() ) ); } if ( myPool()._addHelix( _repo, file ) != 0 ) { ZYPP_THROW( Exception( "Error reading helix-file: "+file_r.asString() ) ); } MIL << *this << " after adding " << file_r << endl; } void Repository::addTesttags( const Pathname & file_r ) { NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo." ) ); std::string command( file_r.extension() == ".gz" ? "zcat " : "cat " ); command += file_r.asString(); AutoDispose file( ::popen( command.c_str(), "re" ), ::pclose ); if ( file == NULL ) { file.resetDispose(); ZYPP_THROW( Exception( "Can't open testtags-file: "+file_r.asString() ) ); } if ( myPool()._addTesttags( _repo, file ) != 0 ) { ZYPP_THROW( Exception( "Error reading testtags-file: "+file_r.asString() ) ); } MIL << *this << " after adding " << file_r << endl; } sat::detail::SolvableIdType Repository::addSolvables( unsigned count_r ) { NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo.") ); return myPool()._addSolvables( _repo, count_r ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const Repository & obj ) { if ( ! obj ) return str << "noRepository"; return str << "sat::repo(" << obj.alias() << ")" << "{" << "prio " << obj.get()->priority << '.' << obj.get()->subpriority << ", size " << obj.solvablesSize() << "}"; } std::ostream & dumpAsXmlOn( std::ostream & str, const Repository & obj ) { return xmlout::node( str, "repository", { { "name", obj.name() }, { "alias", obj.alias() } } ); } ////////////////////////////////////////////////////////////////// namespace detail { void RepositoryIterator::increment() { if ( base() ) { sat::detail::CPool * satpool = sat::Pool::instance().get(); do { ++base_reference(); } while ( base() < satpool->repos+satpool->nrepos && !*base() ); } } } // namespace detail ////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // Repository::ProductInfoIterator // /////////////////////////////////////////////////////////////////// Repository::ProductInfoIterator::ProductInfoIterator( sat::SolvAttr attr_r, Repository repo_r ) { base_reference() = sat::LookupRepoAttr( std::move(attr_r), repo_r ).begin(); } std::string Repository::ProductInfoIterator::label() const { return base_reference().subFind( sat::SolvAttr::repositoryProductLabel ).asString(); } CpeId Repository::ProductInfoIterator::cpeId() const { return CpeId( base_reference().subFind( sat::SolvAttr::repositoryProductCpeid ).asString(), CpeId::noThrow ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Repository.h000066400000000000000000000451231476576476200167550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Repository.h * */ #ifndef ZYPP_SAT_REPOSITORY_H #define ZYPP_SAT_REPOSITORY_H #include #include #include #include #include // LookupAttrTools.h included at EOF #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace detail { struct ByRepository; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Repository // /** */ class ZYPP_API Repository : protected sat::detail::PoolMember { public: using SolvableIterator = filter_iterator; using size_type = sat::detail::size_type; using IdType = sat::detail::RepoIdType; using Keywords = sat::ArrayAttr; using ContentRevision = std::string; using ContentIdentifier = std::string; public: /** Default ctor creates \ref noRepository.*/ Repository() : _id( sat::detail::noRepoId ) {} Repository(const Repository &) = default; Repository(Repository &&) noexcept = default; Repository &operator=(const Repository &) = default; Repository &operator=(Repository &&) noexcept = default; /** \ref PoolImpl ctor. */ explicit Repository( IdType id_r ) : _id( id_r ) {} public: /** Represents no \ref Repository. */ static const Repository noRepository; /** Evaluate \ref Repository in a boolean context (\c != \c noRepository). */ explicit operator bool() const { return get() != nullptr; } /** Reserved system repository alias \c @System. */ static const std::string & systemRepoAlias(); /** Return whether this is the system repository. */ bool isSystemRepo() const; public: /** * Short unique string to identify a repo. * ie: openSUSE-10.3 * * If you are looking for a label to display * see \ref name(). * ie: "openSUSE 10.3 Main repository" * */ std::string alias() const; /** Label to display for this repo. */ std::string name() const; /** Alias or name, according to \ref ZConfig::repoLabelIsAlias */ std::string label() const; /** User string: \ref label (alias or name) */ std::string asUserString() const { return label(); } public: /** Timestamp or arbitrary user supplied string. * \c /repomd/revision/text() in \c repomd.xml. */ ContentRevision contentRevision() const; /** Unique string identifying a repositories content. * \c /repomd/tags/repo/text() in \c repomd.xml. * \code * * * obsrepository://build.suse.de/SUSE:Factory:Head:Internal/standard * \endcode * Semantically the value is just a plain string, even * if OBS often uses the location of the project as * unique identifier. */ ContentIdentifier contentIdentifier() const; /** Whether \a id_r matches this repos content identifier. */ bool hasContentIdentifier( const ContentIdentifier & id_r ) const; /** * Timestamp when this repository was generated * * Usually this value is calculated as the newer * timestamp from the timestamp of all the resources * that conform the repository's metadata. * * For example in a rpm-md repository, it would be * the resource specified in the xml file whith * the newest timestamp attribute (which is the * timestamp of the file in the server ). * * The timestamp is 0 if the repository does not * specify when it was generated. * */ Date generatedTimestamp() const; /** * Suggested expiration timestamp. * * Repositories can define an amount of time * they expire, with the generated timestamp as * the base point of time. * * Note that is the responsability of the repository * to freshen the generated timestamp to tell the * client that the repo is alive and updating the * metadata. * * The timestamp is 0 if the repository does not specify * an expiration date. * */ Date suggestedExpirationTimestamp() const; /** * repository keywords (tags) */ Keywords keywords() const; /** Whether \a val_r is present in keywords. */ bool hasKeyword( const std::string & val_r ) const; /** * The suggested expiration date of this repository * already passed * * rpm-md repositories can provide this tag using the * expire extension tag: * \see http://en.opensuse.org/Standards/Rpm_Metadata#SUSE_repository_info_.28suseinfo.xml.29.2C_extensions_to_repomd.xml */ bool maybeOutdated() const; /** Hint whether the Repo may provide updates for a product. * * Either the repository claims to update a product via a repository updates * tag in its metadata or a known product lists the repositories ContentIdentifier * as a required update repo. */ bool isUpdateRepo() const; /** Hint whether the Repo may provide updates for a product identified by its \ref CpeId * * Either the repository claims to update a product via a repository updates * tag in its metadata or a known product lists the repositories ContentIdentifier * as required update repo. */ bool providesUpdatesFor( const CpeId & cpeid_r ) const; /** Whether \ref Repository contains solvables. */ bool solvablesEmpty() const; /** Number of solvables in \ref Repository. */ size_type solvablesSize() const; /** Iterator to the first \ref Solvable. */ SolvableIterator solvablesBegin() const; /** Iterator behind the last \ref Solvable. */ SolvableIterator solvablesEnd() const; /** Iterate the repositories Solvables. */ Iterable solvables() const; public: /** Query class for Repository related products */ class ProductInfoIterator; /** * Get an iterator to the beginning of the repository * compatible distros. * \note This is only a hint. There is no guarantee that * the repository is built for that product. * \see Repository::ProductInfoIterator */ ProductInfoIterator compatibleWithProductBegin() const; /** * Get an iterator to the end of the repository * compatible distros. * \see Repository::ProductInfoIterator */ ProductInfoIterator compatibleWithProductEnd() const; /** Iterate the repository compatible distros. */ Iterable compatibleWithProduct() const; /** * Get an iterator to the beginning of distos the repository * provides upadates for. * \note This is only a hint within the repositories metadata. * The same realation might be expressed by a product listing * this repositories ContentIdentifier as required update repo. * \see Repository::ProductInfoIterator */ ProductInfoIterator updatesProductBegin() const; /** * Get an iterator to the end of distos the repository * provides upadates for. * \see Repository::ProductInfoIterator */ ProductInfoIterator updatesProductEnd() const; /** Iterate distos the repository provides upadates for. */ Iterable updatesProduct() const; public: /** Return any associated \ref RepoInfo. */ RepoInfo info() const; /** Set \ref RepoInfo for this repository. * \throws Exception if this is \ref noRepository * \throws Exception if the \ref RepoInfo::alias * does not match the \ref Repository::name. */ void setInfo( const RepoInfo & info_r ); /** Remove any \ref RepoInfo set for this repository. */ void clearInfo(); public: /** Remove this \ref Repository from its \ref Pool. */ void eraseFromPool(); /** Functor calling \ref eraseFromPool. */ struct EraseFromPool; public: /** Return next Repository in \ref Pool (or \ref noRepository). */ Repository nextInPool() const; public: /** \name Repository content manipulating methods. * \todo maybe a separate Repository/Solvable content manip interface * provided by the pool. */ //@{ /** Load \ref Solvables from a solv-file. * In case of an exception the repository remains in the \ref Pool. * \throws Exception if this is \ref noRepository * \throws Exception if loading the solv-file fails. * \see \ref Pool::addRepoSolv and \ref Repository::EraseFromPool */ void addSolv( const Pathname & file_r ); /** Load \ref Solvables from a helix-file. * Supports loading of gzip compressed files (.gz). In case of an exception * the repository remains in the \ref Pool. * \throws Exception if this is \ref noRepository * \throws Exception if loading the helix-file fails. * \see \ref Pool::addRepoHelix and \ref Repository::EraseFromPool */ void addHelix( const Pathname & file_r ); /** Load \ref Solvables from a libsolv testtags-file. * Supports loading of gzip compressed files (.gz). In case of an exception * the repository remains in the \ref Pool. * \throws Exception if this is \ref noRepository * \throws Exception if loading the helix-file fails. * \see \ref Pool::addRepoTesttags and \ref Repository::EraseFromPool */ void addTesttags(const Pathname &file_r); /** Add \c count_r new empty \ref Solvable to this \ref Repository. */ sat::Solvable::IdType addSolvables( unsigned count_r ); /** \overload Add only one new \ref Solvable. */ sat::Solvable::IdType addSolvable() { return addSolvables( 1 ); } //@} public: /** Expert backdoor. */ sat::detail::CRepo * get() const; /** Expert backdoor. */ IdType id() const { return _id; } /** libsolv internal priorities. * Unlike the \ref RepoInfo priority which tries to be YUM conform * (H[1-99]L), this one is the solver's internal priority representation. * It is type \c int and, as one might expect, the higher the value, * the higher the priority. Subpriority is currently used to express * media preferences (\see \ref MediaPriority). */ //@{ int satInternalPriority() const; int satInternalSubPriority() const; //@} private: IdType _id; }; /////////////////////////////////////////////////////////////////// /** \relates Repository Stream output */ std::ostream & operator<<( std::ostream & str, const Repository & obj ) ZYPP_API; /** \relates Repository XML output */ std::ostream & dumpAsXmlOn( std::ostream & str, const Repository & obj ) ZYPP_API; /** \relates Repository */ inline bool operator==( const Repository & lhs, const Repository & rhs ) { return lhs.get() == rhs.get(); } /** \relates Repository */ inline bool operator!=( const Repository & lhs, const Repository & rhs ) { return lhs.get() != rhs.get(); } /** \relates Repository */ inline bool operator<( const Repository & lhs, const Repository & rhs ) { return lhs.get() < rhs.get(); } /////////////////////////////////////////////////////////////////// /** * Query class for Repository related products * * Products are identified by CpeIds within the repositories metadata. * \see http://en.opensuse.org/Standards/Rpm_Metadata#SUSE_repository_info_.28suseinfo.xml.29.2C_extensions_to_repomd.xml * * The iterator does not provide a dereference * operator so you can do * on it, but you can * access the attributes of each related product * directly from the iterator. * * \code * for_( it, repo.compatibleWithProductBegin(), repo.compatibleWithProductEnd() ) * { * cout << it.label() << ": " << it.cpeid() << endl; * } * \endcode * */ class Repository::ProductInfoIterator : public boost::iterator_adaptor< Repository::ProductInfoIterator // Derived , sat::LookupAttr::iterator // Base , int // Value , boost::forward_traversal_tag // CategoryOrTraversal , int // Reference > { public: ProductInfoIterator() {} /** Product label */ std::string label() const; /** The Common Platform Enumeration name for this product. */ CpeId cpeId() const; private: friend class Repository; /** Hide ctor as just a limited set of attributes is valid. */ explicit ProductInfoIterator( sat::SolvAttr attr_r, Repository repo_r ); private: friend class boost::iterator_core_access; int dereference() const { return 0; } }; /////////////////////////////////////////////////////////////////// /** Iterate the repository compatible distros. */ inline Iterable Repository::compatibleWithProduct() const { return makeIterable( compatibleWithProductBegin(), compatibleWithProductEnd() ); } /** Iterate distos the repository provides upadates for. */ inline Iterable Repository::updatesProduct() const { return makeIterable( updatesProductBegin(), updatesProductEnd() ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Repository::EraseFromPool // /** Functor removing \ref Repository from its \ref Pool. * * E.g. used as dispose function in. \ref AutoDispose * to provide a convenient and exception safe temporary * \ref Repository. * \code * sat::Pool satpool; * MIL << "1 " << satpool << endl; * { * AutoDispose tmprepo( (Repository::EraseFromPool()) ); * *tmprepo = satpool.reposInsert( "A" ); * tmprepo->addSolv( "sl10.1-beta7-packages.solv" ); * DBG << "2 " << satpool << endl; * // Calling 'tmprepo.resetDispose();' here * // would keep the Repo. * } * MIL << "3 " << satpool << endl; * \endcode * \code * 1 sat::pool(){0repos|2solv} * 2 sat::pool(){1repos|2612solv} * 3 sat::pool(){0repos|2solv} * \endcode * Leaving the block without calling tmprepo.resetDispose(); * before, will automatically remove the \ref Repo from its \ref Pool. */ struct Repository::EraseFromPool { void operator()( Repository repository_r ) const { repository_r.eraseFromPool(); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepositoryIterator // /** */ class ZYPP_API RepositoryIterator : public boost::iterator_adaptor< RepositoryIterator // Derived , sat::detail::CRepo ** // Base , Repository // Value , boost::forward_traversal_tag // CategoryOrTraversal , Repository // Reference > { public: RepositoryIterator() : RepositoryIterator::iterator_adaptor_( 0 ) {} explicit RepositoryIterator( sat::detail::CRepo ** p ) : RepositoryIterator::iterator_adaptor_( p ) {} private: friend class boost::iterator_core_access; Repository dereference() const { return Repository( *base() ); } void increment(); }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ByRepository // /** Functor filtering \ref Solvable by \ref Repository.*/ struct ByRepository { public: ByRepository( const Repository & repository_r ) : _repository( repository_r ) {} ByRepository( sat::detail::RepoIdType id_r ) : _repository( id_r ) {} ByRepository() {} bool operator()( const sat::Solvable & slv_r ) const { return slv_r.repository() == _repository; } private: Repository _repository; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// inline Iterable Repository::solvables() const { return makeIterable( solvablesBegin(), solvablesEnd() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// // Late include as sat::ArrayAttr requires Repository.h #include #endif // ZYPP_SAT_REPOSITORY_H libzypp-17.36.5/zypp/ResFilters.h000066400000000000000000000244761476576476200166700ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResFilters.h * */ #ifndef ZYPP_RESFILTERS_H #define ZYPP_RESFILTERS_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace resfilter { ///////////////////////////////////////////////////////////////// /** \defgroup RESFILTERS Filter functors operating on ResObjects. * \ingroup g_Functor * * A simple filter is a function or functor matching the signature: * \code * bool simplefilter( ResObject::Ptr ); * \endcode * * \note It's not neccessary that your function or functor actually * returns \c bool. Anything which is convertible into a \c bool * will do; * * Besides basic filter functors which actually evaluate the * \c ResObject (e.g. \ref ByKind, \ref ByName) you may * use \ref LOGICALFILTERS to build more complex filters. * * \code * // some 'action' functor, printing and counting * // ResObjects. * struct PrintAndCount * { * PrintAndCount( unsigned & counter_r ) * : _counter( counter_r ) * {} * * bool operator()( ResObject::Ptr p ) const * { * DBG << *p << endl; * ++_counter; * return true; * } * * unsigned & _counter; * }; * * ResStore store; * unsigned counter = 0; * * // print and count all resolvables * store.forEach( PrintAndCount(counter) ); * * // print and count all resolvables named "kernel" * counter = 0; * store.forEach( ByName("kernel"), PrintAndCount(counter) ); * * // print and count all Packages named "kernel" * counter = 0; * store.forEach( chain( ByKind(ResKind::package), * ByName("kernel") ), * PrintAndCount(counter) ); * * // print and count all Packages not named "kernel" * counter = 0; * store.forEach( chain( ByKind(ResKind::package), * not_c(ByName("kernel")) ), * PrintAndCount(counter) ); * * // same as above ;) * counter = 0; * store.forEach( chain( ByKind(ResKind::package), * chain( not_c(ByName("kernel")), * PrintAndCount(counter) ) ), * true_c() ); * \endcode * * As you can see in the last example there is no difference in using * a filter or an action functor, as both have the same signature. * A difference of course is the way forEach interprets the returned * value. * * Consequently you can netgate and chain actions as well. Thus * PrintAndCount(counter) could be * chain(Print(),Count(counter)), if these functors are * provided. * * \note These functors are not limited to be used with ResStore::forEach. * You can use them with std::algorithms as well. * * \c PrintAndCount is an example how a functor can return data collected * during the query. You ca easily write a collector, that takes a * std:list\\& and fills it with the matches * found. * * But as a rule of thumb, a functor should be lightweight. If you * want to get data out, pass references to variables in (and assert * these variables live as long as the query lasts). Or use std::ref. * * Internally all functors are passed by value. Thus it would not help * you to create an instance of some collecting functor, and pass it * to the query. The query will then fill a copy of your functor, you * won't get the data back. (Well, you probabely could, by using * boosr::ref). * * Why functors and not plain functions? * * You can use plain functions if they don't have to deliver data back to * the application. * The \c C-style approach is having functions that take a void * data * as last argument. This \c data pointer is then passed arround and casted * up and down. * * If you look at a functor, you'll see that it contains both, the function * to call (its operator()) and the data you'd otherwise pass as * void * data. That's nice and safe. * * \todo migrate to namespace filter and enhance to support Solvables as well. */ //@{ /////////////////////////////////////////////////////////////////// // // Some ResObject attributes // /////////////////////////////////////////////////////////////////// /** */ template inline filter::ByKind byKind() { return filter::ByKind( ResTraits::kind ); } /** Select ResObject by name. */ struct ByName { ByName() {} ByName( std::string name_r ) : _name(std::move( name_r )) {} bool operator()( const ResObject::constPtr& p ) const { return p->name() == _name; } std::string _name; }; /** Select ResObject by repository or repository alias. */ struct ByRepository { ByRepository( Repository repository_r ) : _alias( repository_r.info().alias() ) {} ByRepository( std::string alias_r ) : _alias(std::move( alias_r )) {} bool operator()( const ResObject::constPtr& p ) const { return p->repoInfo().alias() == _alias; } std::string _alias; }; /** Select ResObject by Edition using \a TCompare functor. * * Selects ResObject if TCompare( ResObject->edition(), _edition ) * is \c true. * \code * // use the convenience funktions to create ByEdition: * * byEdition( someedition ); // selects ResObjects with edition == someedition * * byEdition( someedition, CompareByGT() ) // edition > someedition * \endcode */ template > struct ByEdition { ByEdition( Edition edition_r, TCompare cmp_r ) : _edition(std::move( edition_r )) , _cmp( cmp_r ) {} bool operator()( const ResObject::constPtr& p ) const { return _cmp( p->edition(), _edition ); } Edition _edition; TCompare _cmp; }; /** */ template ByEdition byEdition( const Edition & edition_r, TCompare cmp_r ) { return ByEdition( edition_r, cmp_r ); } /** */ template ByEdition byEdition( const Edition & edition_r ) { return byEdition( edition_r, TCompare() ); } /** Select ResObject by Arch using \a TCompare functor. * * Selects ResObject if TCompare( ResObject->arch(), _arch ) * is \c true. * \code * // use the convenience funktions to create ByArch: * * byArch( somearch ); // selects ResObjects with arch == somearch * * byArch( somearch, CompareByGT() ) // arch > somearch * \endcode */ template > struct ByArch { ByArch( const Arch & arch_r, TCompare cmp_r ) : _arch( arch_r ) , _cmp( cmp_r ) {} bool operator()( const ResObject::constPtr& p ) const { return _cmp( p->arch(), _arch ); } Arch _arch; TCompare _cmp; }; /** */ template ByArch byArch( const Arch & arch_r, TCompare cmp_r ) { return ByArch( arch_r, cmp_r ); } /** */ template ByArch byArch( const Arch & arch_r ) { return byArch( arch_r, TCompare() ); } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // Some PoolItem attributes // /////////////////////////////////////////////////////////////////// /** Select PoolItem by installed. */ struct ByInstalled { bool operator()( const PoolItem & p ) const { return p.status().isInstalled(); } }; /** Select PoolItem by uninstalled. */ struct ByUninstalled { bool operator()( const PoolItem & p ) const { return p.status().isUninstalled(); } }; /** Select PoolItem by transact. */ struct ByTransact { bool operator()( const PoolItem & p ) const { return p.status().transacts(); } }; /** Select PoolItem by lock. */ struct ByLock { bool operator()( const PoolItem & p ) const { return p.status().isLocked(); } }; /** Select PoolItem by keep. */ struct ByKeep { bool operator()( const PoolItem & p ) const { return p.status().isKept(); } }; /** PoolItem which is recommended. */ struct ByRecommended { bool operator()( const PoolItem & p ) const { return p.status().isRecommended(); } }; /** PoolItem which is suggested. */ struct BySuggested { bool operator()( const PoolItem & p ) const { return p.status().isSuggested(); } }; //@} ///////////////////////////////////////////////////////////////// } // namespace resfilter /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESFILTERS_H libzypp-17.36.5/zypp/ResKind.cc000066400000000000000000000055371476576476200163000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResKind.cc * */ #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// const ResKind ResKind::nokind; const ResKind ResKind::package ( "package" ); const ResKind ResKind::patch ( "patch" ); const ResKind ResKind::pattern ( "pattern" ); const ResKind ResKind::product ( "product" ); const ResKind ResKind::srcpackage ( "srcpackage" ); const ResKind ResKind::application ( "application" ); template<> const ResKind ResTraits ::kind( ResKind::package ); template<> const ResKind ResTraits ::kind( ResKind::patch ); template<> const ResKind ResTraits ::kind( ResKind::pattern ); template<> const ResKind ResTraits ::kind( ResKind::product ); template<> const ResKind ResTraits ::kind( ResKind::srcpackage ); template<> const ResKind ResTraits::kind( ResKind::application ); ResKind ResKind::explicitBuiltin( const char * str_r ) { if ( str_r && str_r[0] && str_r[1] && str_r[2] ) { switch ( str_r[3] ) { // NOTE: it needs to be assertd that the separating ':' is present // if a known kind is retuirned. Dependent code relies on this! #define OUTS(K,S) if ( !::strncmp( str_r, ResKind::K.c_str(), S ) && str_r[S] == ':' ) return ResKind::K // ----v case 'c': OUTS( patch, 5 ); break; case 'd': OUTS( product, 7 ); break; case 'k': OUTS( package, 7 ); break; case 'l': OUTS( application, 11 );break; case 'p': OUTS( srcpackage, 10 ); break; case 't': OUTS( pattern, 7 ); break; #undef OUTS } } return nokind; } std::string ResKind::satIdent( const ResKind & refers_r, const std::string & name_r ) { if ( ! refers_r || refers_r == package || refers_r == srcpackage ) return name_r; return str::form( "%s:%s", refers_r.c_str(), name_r.c_str() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ResKind.h000066400000000000000000000076021476576476200161350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResKind.h * */ #ifndef ZYPP_RESKIND_H #define ZYPP_RESKIND_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class ResKind /// \brief Resolvable kinds. /// A \b lowercased string and used as identification. Comparison /// against string values is always case insensitive. /////////////////////////////////////////////////////////////////// class ZYPP_API ResKind : public IdStringType { public: /** \name Some builtin ResKind constants. */ //@{ /** Value representing \c nokind ("")*/ static const ResKind nokind; static const ResKind package; static const ResKind patch; static const ResKind pattern; static const ResKind product; static const ResKind srcpackage; static const ResKind application; //@} /** Return the builtin kind if \a str_r explicitly prefixed. * \a str_r must start with a builtin kind followed by a \c ':'. * If no builtin kind is detected, \ref nokind is returned, * which usually indicates a \ref package or \ref srcpackage. */ static ResKind explicitBuiltin( const char * str_r ); /** \overload */ static ResKind explicitBuiltin( const std::string & str_r ) { return explicitBuiltin( str_r.c_str() ); } /** \overload */ static ResKind explicitBuiltin( const IdString & str_r ) { return explicitBuiltin( str_r.c_str() ); } public: /** Default ctor: \ref nokind */ ResKind() {} /** Ctor taking kind as string. */ explicit ResKind( sat::detail::IdType id_r ) : _str( str::toLower(IdString(id_r).c_str()) ) {} explicit ResKind( const IdString & idstr_r ) : _str( str::toLower(idstr_r.c_str()) ) {} explicit ResKind( const std::string & str_r ) : _str( str::toLower(str_r) ) {} explicit ResKind( const char * cstr_r ) : _str( str::toLower(cstr_r) ) {} public: /** Return libsolv identifier for name. * Libsolv combines the objects kind and name in a single * identifier \c "pattern:kde_multimedia", \b except for packages * and source packes. They are not prefixed by any kind string. */ static std::string satIdent( const ResKind & refers_r, const std::string & name_r ); /** \overload */ std::string satIdent( const std::string & name_r ) const { return satIdent( *this, name_r ); } private: static int _doCompare( const char * lhs, const char * rhs ) { if ( lhs == rhs ) return 0; if ( lhs && rhs ) return ::strcasecmp( lhs, rhs ); return( lhs ? 1 : -1 ); } private: friend class IdStringType; IdString _str; }; /** \relates ResKind XML output. */ inline std::ostream & dumpAsXmlOn( std::ostream & str, const ResKind & obj ) { return str << "" << obj << ""; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESKIND_H libzypp-17.36.5/zypp/ResObject.cc000066400000000000000000000033571476576476200166170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResObject.cc * */ #include using namespace zypp; /////////////////////////////////////////////////////////////////// namespace zypp { IMPL_PTR_TYPE(ResObject); ResObject::ResObject( const sat::Solvable & solvable_r ) : Resolvable( solvable_r ) {} ResObject::~ResObject() {} std::ostream & ResObject::dumpOn( std::ostream & str ) const { return Resolvable::dumpOn( str ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #include /////////////////////////////////////////////////////////////////// namespace zypp { ResObject::Ptr makeResObject( const sat::Solvable & solvable_r ) { if ( ! solvable_r ) return 0; ResKind kind( solvable_r.kind() ); #define OUTS(X) if ( kind == ResTraits::kind ) return make( solvable_r ); OUTS( Package ); OUTS( Patch ); OUTS( Pattern ); OUTS( Product ); OUTS( SrcPackage ); OUTS( Application ); #undef OUTS // unknow => return a plain ResObject return new ResObject( solvable_r ); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ResObject.h000066400000000000000000000127651476576476200164640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResObject.h * */ #ifndef ZYPP_RESOBJECT_H #define ZYPP_RESOBJECT_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class ResObject /// \brief Base for resolvable objects /// /// \note \ref Resolvable is a SolvableType, which provides direct /// access to many of the underlying sat::Solvables properties. /// Don't add common properties here, but in \ref sat::Solvable /// and extend \ref sat::SolvableType. /// /// \see \ref makeResObject for how to construct ResObjects. /// \todo Merge with Resolvable /////////////////////////////////////////////////////////////////// class ZYPP_API ResObject : public Resolvable { public: using Self = ResObject; using TraitsType = ResTraits; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: /** Convert \c this into a Ptr of a certain Kind. * This is a convenience to access type specific * attributes. * \return \c NULL if \c this is not of the specified kind. * \code * PoolItem pi; * Package::constPtr pkg = pi->asKind(); * * if ( pi->isKind() ) * DBG << pi->asKind()->keywords() << endl; * \endcode */ template inline typename ResTraits::constPtrType asKind() const; template inline typename ResTraits::PtrType asKind(); public: /** * \short Vendor * \deprecated Though typedef'ed to std::string, Vendor is actually an \ref IdString. */ Vendor vendor() const { return Resolvable::vendor().asString(); } protected: friend ResObject::Ptr makeResObject( const sat::Solvable & solvable_r ); /** Ctor */ ResObject( const sat::Solvable & solvable_r ); /** Dtor */ ~ResObject() override; /** Helper for stream output */ std::ostream & dumpOn( std::ostream & str ) const override; /** This is a \ref sat::SolvableType (allow implicit conversion in derived classes). */ operator sat::Solvable() const { return satSolvable(); } }; /////////////////////////////////////////////////////////////////// /** Create \ref ResObject from \ref sat::Solvable. * * This function creates the apropriate kind of ResObject * depending on the sat::Solvables kind, and returns a smart * pointer to it. * * If the sat::Solvables kind is not convertible, a NULL * pointer is returned. * * \code * sat::Solvable s; * ResObject::Ptr p( makeResObject( s ) ); * ResObject::Ptr q( make( s ) ); * Package::Ptr pkg( make( s ) ); * \endcode */ ResObject::Ptr makeResObject( const sat::Solvable & solvable_r ) ZYPP_API; /** Directly create a certain kind of ResObject from \ref sat::Solvable. * * If the sat::Solvables kind is not appropriate, a NULL * pointer is returned. * \code * sat::Solvable s; * ResObject::Ptr p( makeResObject( s ) ); * ResObject::Ptr q( make( s ) ); * Package::Ptr pkg( make( s ) ); * \endcode * \todo make<> was a poor choice (AFAIR because gcc had some trouble with * asKind<>(sat::Solvable)). Remove it in favour of asKind<>(sat::Solvable) */ template inline typename ResTraits::PtrType make( const sat::Solvable & solvable_r ) { return( isKind( solvable_r ) ? new TRes( solvable_r ) : 0 ); } /** \overload Specialisation for ResObject autodetecting the kind of resolvable. */ template<> inline ResObject::Ptr make( const sat::Solvable & solvable_r ) { return makeResObject( solvable_r ); } /** Directly create a certain kind of ResObject from \ref sat::Solvable. */ template inline typename ResTraits::PtrType asKind( const sat::Solvable & solvable_r ) { return make( solvable_r ); } /** Convert ResObject::Ptr into Ptr of a certain Kind. * \return \c NULL iff \a p is \c NULL or points to a Resolvable * not of the specified Kind. * \relates ResObject * \code * asKind(resPtr); * \endcode */ template inline typename ResTraits::PtrType asKind( const ResObject::Ptr & p ) { return dynamic_pointer_cast(p); } template inline typename ResTraits::constPtrType asKind( const ResObject::constPtr & p ) { return dynamic_pointer_cast(p); } template inline typename ResTraits::constPtrType ResObject::asKind() const { return dynamic_cast( this ); } template inline typename ResTraits::PtrType ResObject::asKind() { return dynamic_cast( this ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESOBJECT_H libzypp-17.36.5/zypp/ResObjects.h000066400000000000000000000015351476576476200166400ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResObjects.h * */ #ifndef ZYPP_RESOBJECTS_H #define ZYPP_RESOBJECTS_H #include #include #include #include #include #include #endif // ZYPP_RESOBJECTS_H libzypp-17.36.5/zypp/ResPool.cc000066400000000000000000000123701476576476200163150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResPool.cc * */ #include #include //#include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // class ResPool /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResPool::instance // METHOD TYPE : ResPool // ResPool ResPool::instance() { static ResPool _val( pool::PoolTraits::Impl_Ptr( new pool::PoolImpl ) ); return _val; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResPool::ResPool // METHOD TYPE : Ctor // ResPool::ResPool( pool::PoolTraits::Impl_Ptr impl_r ) : _pimpl( std::move(impl_r) ) {} /////////////////////////////////////////////////////////////////// // // Forward to impementation: // /////////////////////////////////////////////////////////////////// ResPoolProxy ResPool::proxy() const { return _pimpl->proxy( *this ); } Resolver & ResPool::resolver() const { return *getZYpp()->resolver(); } const SerialNumber & ResPool::serial() const { return _pimpl->serial(); } bool ResPool::empty() const { return _pimpl->empty(); } ResPool::size_type ResPool::size() const { return _pimpl->size(); } PoolItem ResPool::find( const sat::Solvable & slv_r ) const { return _pimpl->find( slv_r ); } ResPool::EstablishedStates ResPool::establishedStates() const { return _pimpl->establishedStates(); } ResPool::size_type ResPool::knownRepositoriesSize() const { return _pimpl->knownRepositoriesSize(); } ResPool::repository_iterator ResPool::knownRepositoriesBegin() const { return _pimpl->knownRepositoriesBegin(); } ResPool::repository_iterator ResPool::knownRepositoriesEnd() const { return _pimpl->knownRepositoriesEnd(); } Repository ResPool::reposFind( const std::string & alias_r ) const { return _pimpl->reposFind( alias_r ); } bool ResPool::hardLockQueriesEmpty() const { return _pimpl->hardLockQueries().empty(); } ResPool::size_type ResPool::hardLockQueriesSize() const { return _pimpl->hardLockQueries().size(); } ResPool::hardLockQueries_iterator ResPool::hardLockQueriesBegin() const { return _pimpl->hardLockQueries().begin(); } ResPool::hardLockQueries_iterator ResPool::hardLockQueriesEnd() const { return _pimpl->hardLockQueries().end(); } void ResPool::setHardLockQueries( const HardLockQueries & newLocks_r ) { _pimpl->setHardLockQueries( newLocks_r ); } void ResPool::getHardLockQueries( HardLockQueries & activeLocks_r ) { _pimpl->getHardLockQueries( activeLocks_r ); } const pool::PoolTraits::ItemContainerT & ResPool::store() const { return _pimpl->store(); } const pool::PoolTraits::Id2ItemT & ResPool::id2item() const { return _pimpl->id2item(); } /////////////////////////////////////////////////////////////////// // // Forward to sat::Pool: // /////////////////////////////////////////////////////////////////// void ResPool::setRequestedLocales( const LocaleSet & locales_r ) { sat::Pool::instance().setRequestedLocales( locales_r ); } bool ResPool::addRequestedLocale( const Locale & locale_r ) { return sat::Pool::instance().addRequestedLocale( locale_r ); } bool ResPool::eraseRequestedLocale( const Locale & locale_r ) { return sat::Pool::instance().eraseRequestedLocale( locale_r ); } const LocaleSet & ResPool::getRequestedLocales() const { return sat::Pool::instance().getRequestedLocales(); } bool ResPool::isRequestedLocale( const Locale & locale_r ) const { return sat::Pool::instance().isRequestedLocale( locale_r ); } const LocaleSet & ResPool::getAvailableLocales() const { return sat::Pool::instance().getAvailableLocales(); } bool ResPool::isAvailableLocale( const Locale & locale_r ) const { return sat::Pool::instance().isAvailableLocale( locale_r ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ResPool & obj ) { return dumpPoolStats( str << "ResPool " << sat::Pool::instance() << endl << " ", obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ResPool.h000066400000000000000000000445521476576476200161660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResPool.h * */ #ifndef ZYPP_RESPOOL_H #define ZYPP_RESPOOL_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class SerialNumber; class ResPoolProxy; class Resolver; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ResPool // /** Global ResObject pool. * * Explicitly shared singleton. * * \note Filter iterators provided by ResPool are intended to * operate on internal index tables for faster access. If the * the index is not yet implemented, they are realized as * an ordinary filter iterator. Do not provide filter iterators * here, if there is no index table for it. * * For most (*Begin,*End) iterator-pairs there's also an \ref Iterable * provided, so you can use then in range-based for loops: * \code * // classic: * for_( it, pool.filterBegin(myfilter), pool.filterEnd(myfilter) ) * { ... } * * // range based: * for ( const PoolItem & pi : pool.filter(myfilter) ) * { ... } * \endcode * * \include n_ResPool_nomorenameiter */ class ZYPP_API ResPool { friend std::ostream & operator<<( std::ostream & str, const ResPool & obj ); public: /** \ref PoolItem */ using value_type = PoolItem; using size_type = pool::PoolTraits::size_type; using const_iterator = pool::PoolTraits::const_iterator; using repository_iterator = pool::PoolTraits::repository_iterator; public: /** Singleton ctor. */ static ResPool instance(); /** preliminary */ ResPoolProxy proxy() const; /** The Resolver */ Resolver & resolver() const; public: /** The pools serial number. Changing whenever the * whenever the content changes. (Resolvables or * Dependencies). */ const SerialNumber & serial() const; public: /** */ bool empty() const; /** */ size_type size() const; /** \name Iterate over all PoolItems (all kinds). */ //@{ /** */ const_iterator begin() const { return make_filter_begin( pool::ByPoolItem(), store() ); } /** */ const_iterator end() const { return make_filter_end( pool::ByPoolItem(), store() ); } //@} public: /** Return the corresponding \ref PoolItem. * Pool and sat pool should be in sync. Returns an empty * \ref PoolItem if there is no corresponding \ref PoolItem. * \see \ref PoolItem::satSolvable. */ PoolItem find( const sat::Solvable & slv_r ) const; /** \overload */ PoolItem find( const ResObject::constPtr & resolvable_r ) const { return( resolvable_r ? find( resolvable_r->satSolvable() ) : PoolItem() ); } public: /** \name Iterate over all PoolItems matching a \c TFilter. */ //@{ template filter_iterator filterBegin( const TFilter & filter_r ) const { return make_filter_begin( filter_r, *this ); } template filter_iterator filterEnd( const TFilter & filter_r ) const { return make_filter_end( filter_r, *this ); } template Iterable > filter( const TFilter & filter_r ) const { return makeIterable( filterBegin( filter_r ), filterEnd( filter_r ) ); } //@} /** \name Iterate over all PoolItems by status. * * Simply pass the \ref ResStatus predicate you want to use as filter: * \code * // iterate over all orphaned items: * for_( it, pool.byStatusBegin(&ResStatus::isOrphaned), pool.byStatusEnd(&ResStatus::isOrphaned) ) * {...} * \endcode * * Or use \ref filter::ByStatus in more complex queries: * \code * // iterate over all (orphaned and recommended) items: * functor::Chain myfilter( filter::ByStatus(&ResStatus::isOrphaned), * filter::ByStatus(&ResStatus::isRecommended) ); * for_( it, pool.filterBegin(myfilter), pool.filterEnd(myfilter) ) * { ... } * \endcode */ //@{ filter_iterator byStatusBegin( const filter::ByStatus & filter_r ) const { return make_filter_begin( filter_r, *this ); } filter_iterator byStatusEnd( const filter::ByStatus & filter_r ) const { return make_filter_end( filter_r, *this ); } Iterable > byStatus( const filter::ByStatus & filter_r ) const { return makeIterable( byStatusBegin( filter_r ), byStatusEnd( filter_r ) ); } //@} public: /** \name Iterate over all PoolItems of a certain name and kind. */ //@{ using ByIdent = pool::ByIdent; using byIdent_iterator = pool::PoolTraits::byIdent_iterator; byIdent_iterator byIdentBegin( const ByIdent & ident_r ) const { return make_transform_iterator( id2item().equal_range( ident_r.get() ).first, pool::PoolTraits::Id2ItemValueSelector() ); } byIdent_iterator byIdentBegin( ResKind kind_r, IdString name_r ) const { return byIdentBegin( ByIdent(std::move(kind_r),name_r) ); } byIdent_iterator byIdentBegin( ResKind kind_r, const C_Str & name_r ) const { return byIdentBegin( ByIdent(std::move(kind_r),name_r) ); } template byIdent_iterator byIdentBegin( IdString name_r ) const { return byIdentBegin( ByIdent(ResTraits::kind,name_r) ); } template byIdent_iterator byIdentBegin( const C_Str & name_r ) const { return byIdentBegin( ByIdent(ResTraits::kind,name_r) ); } /** Derive name and kind from \ref PoolItem. */ byIdent_iterator byIdentBegin( const PoolItem & pi_r ) const { return byIdentBegin( ByIdent(pi_r.satSolvable()) ); } /** Derive name and kind from \ref sat::Solvable. */ byIdent_iterator byIdentBegin( sat::Solvable slv_r ) const { return byIdentBegin( ByIdent(slv_r) ); } /** Takes a \ref sat::Solvable::ident string. */ byIdent_iterator byIdentBegin( IdString ident_r ) const { return byIdentBegin( ByIdent(ident_r) ); } byIdent_iterator byIdentEnd( const ByIdent & ident_r ) const { return make_transform_iterator( id2item().equal_range( ident_r.get() ).second, pool::PoolTraits::Id2ItemValueSelector() ); } byIdent_iterator byIdentEnd( ResKind kind_r, IdString name_r ) const { return byIdentEnd( ByIdent(std::move(kind_r),name_r) ); } byIdent_iterator byIdentEnd( ResKind kind_r, const C_Str & name_r ) const { return byIdentEnd( ByIdent(std::move(kind_r),name_r) ); } template byIdent_iterator byIdentEnd( IdString name_r ) const { return byIdentEnd( ByIdent(ResTraits::kind,name_r) ); } template byIdent_iterator byIdentEnd( const C_Str & name_r ) const { return byIdentEnd( ByIdent(ResTraits::kind,name_r) ); } /** Derive name and kind from \ref PoolItem. */ byIdent_iterator byIdentEnd( const PoolItem & pi_r ) const { return byIdentEnd( ByIdent(pi_r.satSolvable()) ); } /** Derive name and kind from \ref sat::Solvable. */ byIdent_iterator byIdentEnd( sat::Solvable slv_r ) const { return byIdentEnd( ByIdent(slv_r) ); } /** Takes a \ref sat::Solvable::ident string. */ byIdent_iterator byIdentEnd( IdString ident_r ) const { return byIdentEnd( ByIdent(ident_r) ); } Iterable byIdent( const ByIdent & ident_r ) const { return makeIterable( byIdentBegin( ident_r ), byIdentEnd( ident_r ) ); } Iterable byIdent( const ResKind& kind_r, IdString name_r ) const { return makeIterable( byIdentBegin( kind_r, name_r ), byIdentEnd( kind_r, name_r ) ); } Iterable byIdent( const ResKind& kind_r, const C_Str & name_r ) const { return makeIterable( byIdentBegin( kind_r, name_r ), byIdentEnd( kind_r, name_r ) ); } template Iterable byIdent( IdString name_r ) const { return makeIterable( byIdentBegin( name_r ), byIdentEnd( name_r ) ); } template Iterable byIdent( const C_Str & name_r ) const { return makeIterable( byIdentBegin( name_r ), byIdentEnd( name_r ) ); } Iterable byIdent( const PoolItem & pi_r ) const { return makeIterable( byIdentBegin( pi_r ), byIdentEnd( pi_r ) ); } Iterable byIdent(sat::Solvable slv_r ) const { return makeIterable( byIdentBegin( slv_r ), byIdentEnd( slv_r ) ); } Iterable byIdent( IdString ident_r ) const { return makeIterable( byIdentBegin( ident_r ), byIdentEnd( ident_r ) ); } //@} public: /** \name Iterate over all ResObjects of a certain kind. */ //@{ using ByKind = filter::ByKind; using byKind_iterator = filter_iterator; byKind_iterator byKindBegin( const ResKind & kind_r ) const { return make_filter_begin( ByKind(kind_r), *this ); } template byKind_iterator byKindBegin() const { return make_filter_begin( resfilter::byKind(), *this ); } byKind_iterator byKindEnd( const ResKind & kind_r ) const { return make_filter_end( ByKind(kind_r), *this ); } template byKind_iterator byKindEnd() const { return make_filter_end( resfilter::byKind(), *this ); } Iterable byKind( const ResKind & kind_r ) const { return makeIterable( byKindBegin( kind_r ), byKindEnd( kind_r ) ); } template Iterable byKind() const { return makeIterable( byKindBegin(), byKindEnd() ); } //@} public: /** \name Iterate over all ResObjects with a certain name (all kinds). */ //@{ using ByName = zypp::resfilter::ByName; using byName_iterator = filter_iterator; byName_iterator byNameBegin( const std::string & name_r ) const { return make_filter_begin( ByName(name_r), *this ); } byName_iterator byNameEnd( const std::string & name_r ) const { return make_filter_end( ByName(name_r), *this ); } Iterable byName( const std::string & name_r ) const { return makeIterable( byNameBegin( name_r ), byNameEnd( name_r ) ); } //@} public: /** \name Misc Data. */ //@{ /////////////////////////////////////////////////////////////////// /// A copy of the Pools initial ValidateValues of pseudo installed items. /// /// AKA Patch status. Whenever the Pools content changes, the status /// of pseudo installed items (like Patches) is computed (roughly whether /// their dependencies are broken or satisfied) and remembered. /// /// Comparing the item's established state against its current state /// tells how the current transaction would influence the item (break /// or repair a Patch). /// class EstablishedStates { public: ~EstablishedStates(); /** Map holding pseudo installed items where current and established status differ. */ using ChangedPseudoInstalled = std::map; /** Return all pseudo installed items whose current state differs from the established one */ ChangedPseudoInstalled changedPseudoInstalled() const; private: class Impl; RW_pointer _pimpl; private: friend class pool::PoolImpl; /** Factory: \ref ResPool::establishedStates */ EstablishedStates( shared_ptr pimpl_r ) : _pimpl { std::move(pimpl_r) } {} }; /////////////////////////////////////////////////////////////////// /** Factory for \ref EstablishedStates. * A few internal algorithms benefit from keeping an instance across pool * content changes. User code usually want's to call \ref changedPseudoInstalled * directly. */ EstablishedStates establishedStates() const; /** Map holding pseudo installed items where current and established status differ. */ using ChangedPseudoInstalled = EstablishedStates::ChangedPseudoInstalled; /** Return all pseudo installed items whose current state differs from their initial one. * E.g. a Patch may become SATISFIED by updating the packages it refers to. * For this to happen it does not matter whether you selected the Patch or * whether you selected the individual Packages. * A Patches status is computed and updated with every solver run. */ ChangedPseudoInstalled changedPseudoInstalled() const { return establishedStates().changedPseudoInstalled(); } //@} public: /** \name Iterate over all Repositories that contribute ResObjects. */ //@{ size_type knownRepositoriesSize() const; repository_iterator knownRepositoriesBegin() const; repository_iterator knownRepositoriesEnd() const; /** Find a \ref Repository named \c alias_r. * Returns \ref Repository::noRepository if there is no such \ref Repository. */ Repository reposFind( const std::string & alias_r ) const; Iterable knownRepositories() const { return makeIterable( knownRepositoriesBegin(), knownRepositoriesEnd() ); } //@} public: /** \name Handle locale support. * * A \ref filter::ByLocaleSupport is provided to iterate over * all items supporting a specific locale. * * \see \ref sat::LocaleSupport for a more convenient interface. * * \code * ResPool pool( ResPool::instance() ); * * filter::ByLocaleSupport f( Locale("de") ); * for_( it, pool.filterBegin(f), pool.filterEnd(f) ) * { * MIL << *it << endl; // supporting "de" * } * * f = filter::ByLocaleSupport( pool.getRequestedLocales() ); * for_( it, pool.filterBegin(f), pool.filterEnd(f) ) * { * MIL << *it << endl; // supporting any requested locale * } * \endcode */ //@{ /** Set the requested locales. * Languages to be supported by the system, e.g. language specific * packages to be installed. */ void setRequestedLocales( const LocaleSet & locales_r ); /** Add one \ref Locale to the set of requested locales. * Return \c true if \c locale_r was newly added to the set. */ bool addRequestedLocale( const Locale & locale_r ); /** Erase one \ref Locale from the set of requested locales. * Return \c false if \c locale_r was not found in the set. */ bool eraseRequestedLocale( const Locale & locale_r ); /** Return the requested locales. * \see \ref setRequestedLocales */ const LocaleSet & getRequestedLocales() const; /** Whether this \ref Locale is in the set of requested locales. */ bool isRequestedLocale( const Locale & locale_r ) const; /** Get the set of available locales. * This is computed from the package data so it actually * represents all locales packages claim to support. */ const LocaleSet & getAvailableLocales() const; /** Whether this \ref Locale is in the set of available locales. */ bool isAvailableLocale( const Locale & locale_r ) const; //@} public: /** \name Handle hard locks (e.g set from /etc/zypp/locks). * * As this kind of lock is query based, it's quite expensive. * * These queries are re-evaluated when adding new repos to the pool. */ //@{ using HardLockQueries = pool::PoolTraits::HardLockQueries; using hardLockQueries_iterator = pool::PoolTraits::hardLockQueries_iterator; bool hardLockQueriesEmpty() const; size_type hardLockQueriesSize() const; hardLockQueries_iterator hardLockQueriesBegin() const; hardLockQueries_iterator hardLockQueriesEnd() const; Iterable hardLockQueries() const { return makeIterable( hardLockQueriesBegin(), hardLockQueriesEnd() ); } /** Set a new set of queries. * The hard-locks of existing PoolItems are adjusted according * to the queries. (usually called on target load) */ void setHardLockQueries( const HardLockQueries & newLocks_r ); /** Suggest a new set of queries based on the current selection. * (usually remembered on commit). */ void getHardLockQueries( HardLockQueries & activeLocks_r ); //@} private: const pool::PoolTraits::ItemContainerT & store() const; const pool::PoolTraits::Id2ItemT & id2item() const; private: /** Ctor */ ResPool( pool::PoolTraits::Impl_Ptr impl_r ); /** Access to implementation. */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates ResPool Stream output */ std::ostream & operator<<( std::ostream & str, const ResPool & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #include #endif // ZYPP_RESPOOL_H libzypp-17.36.5/zypp/ResPoolProxy.cc000066400000000000000000000253161476576476200173630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResPoolProxy.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Tem. friend of PoolItem */ struct PoolItemSaver { void saveState( const ResPool& pool_r ) { std::for_each( pool_r.begin(), pool_r.end(), std::mem_fn(&PoolItem::saveState) ); } void saveState( const ResPool& pool_r, const ResKind & kind_r ) { std::for_each( pool_r.byKindBegin(kind_r), pool_r.byKindEnd(kind_r), std::mem_fn(&PoolItem::saveState) ); } void restoreState( const ResPool& pool_r ) { std::for_each( pool_r.begin(), pool_r.end(), std::mem_fn(&PoolItem::restoreState) ); } void restoreState( const ResPool& pool_r, const ResKind & kind_r ) { std::for_each( pool_r.byKindBegin(kind_r), pool_r.byKindEnd(kind_r), std::mem_fn(&PoolItem::restoreState) ); } bool diffState( const ResPool& pool_r ) const { // return whether some PoolItem::sameState reported \c false. return( invokeOnEach( pool_r.begin(), pool_r.end(), std::mem_fn(&PoolItem::sameState) ) < 0 ); } bool diffState( const ResPool& pool_r, const ResKind & kind_r ) const { // return whether some PoolItem::sameState reported \c false. return( invokeOnEach( pool_r.byKindBegin(kind_r), pool_r.byKindEnd(kind_r), std::mem_fn(&PoolItem::sameState) ) < 0 ); } }; namespace { ui::Selectable::Ptr makeSelectablePtr( pool::PoolImpl::Id2ItemT::const_iterator begin_r, pool::PoolImpl::Id2ItemT::const_iterator end_r ) { pool::PoolTraits::byIdent_iterator begin( begin_r, pool::PoolTraits::Id2ItemValueSelector() ); pool::PoolTraits::byIdent_iterator end( end_r, pool::PoolTraits::Id2ItemValueSelector() ); sat::Solvable solv( begin->satSolvable() ); return new ui::Selectable( ui::Selectable::Impl_Ptr( new ui::Selectable::Impl( solv.kind(), solv.name(), begin, end ) ) ); } } // namespace /////////////////////////////////////////////////////////////////// // // CLASS NAME : ResPoolProxy::Impl // /** ResPoolProxy implementation. * \todo Seedup as it is still using old index */ struct ResPoolProxy::Impl { friend std::ostream & operator<<( std::ostream & str, const Impl & obj ); friend std::ostream & dumpOn( std::ostream & str, const Impl & obj ); using SelectableIndex = std::unordered_map; using const_iterator = ResPoolProxy::const_iterator; public: Impl() :_pool( ResPool::instance() ) {} Impl( ResPool &&pool_r, const pool::PoolImpl & poolImpl_r ) : _pool( std::move(pool_r) ) { const pool::PoolImpl::Id2ItemT & id2item( poolImpl_r.id2item() ); if ( ! id2item.empty() ) { // set startpoint pool::PoolImpl::Id2ItemT::const_iterator cbegin = id2item.begin(); for_( it, id2item.begin(), id2item.end() ) { if ( it->first != cbegin->first ) { // starting a new Selectable, create the previous one ui::Selectable::Ptr p( makeSelectablePtr( cbegin, it ) ); _selPool.insert( SelectablePool::value_type( p->kind(), p ) ); _selIndex[cbegin->first] = p; // remember new startpoint cbegin = it; } } // create the final one ui::Selectable::Ptr p( makeSelectablePtr( cbegin, id2item.end() ) ); _selPool.insert( SelectablePool::value_type( p->kind(), p ) ); _selIndex[cbegin->first] = p; } } public: ui::Selectable::Ptr lookup( const pool::ByIdent & ident_r ) const { SelectableIndex::const_iterator it( _selIndex.find( ident_r.get() ) ); if ( it != _selIndex.end() ) return it->second; return ui::Selectable::Ptr(); } public: bool empty() const { return _selPool.empty(); } size_type size() const { return _selPool.size(); } const_iterator begin() const { return make_map_value_begin( _selPool ); } const_iterator end() const { return make_map_value_end( _selPool ); } public: bool empty( const ResKind & kind_r ) const { return( _selPool.count( kind_r ) == 0 ); } size_type size( const ResKind & kind_r ) const { return _selPool.count( kind_r ); } const_iterator byKindBegin( const ResKind & kind_r ) const { return make_map_value_lower_bound( _selPool, kind_r ); } const_iterator byKindEnd( const ResKind & kind_r ) const { return make_map_value_upper_bound( _selPool, kind_r ); } public: size_type knownRepositoriesSize() const { return _pool.knownRepositoriesSize(); } repository_iterator knownRepositoriesBegin() const { return _pool.knownRepositoriesBegin(); } repository_iterator knownRepositoriesEnd() const { return _pool.knownRepositoriesEnd(); } public: void saveState() const { PoolItemSaver().saveState( _pool ); } void saveState( const ResKind & kind_r ) const { PoolItemSaver().saveState( _pool, kind_r ); } void restoreState() const { PoolItemSaver().restoreState( _pool ); } void restoreState( const ResKind & kind_r ) const { PoolItemSaver().restoreState( _pool, kind_r ); } bool diffState() const { return PoolItemSaver().diffState( _pool ); } bool diffState( const ResKind & kind_r ) const { return PoolItemSaver().diffState( _pool, kind_r ); } private: ResPool _pool; mutable SelectablePool _selPool; mutable SelectableIndex _selIndex; public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } }; /////////////////////////////////////////////////////////////////// /** \relates ResPoolProxy::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const ResPoolProxy::Impl & obj ) { return str << "ResPoolProxy (" << obj._pool.serial() << ") [" << obj._pool.size() << "solv/" << obj.size()<< "sel]"; } namespace detail { struct DumpFilter { bool operator()( const ui::Selectable::Ptr & selp ) const { return selp->toModify(); } }; } /** \relates ResPoolProxy::Impl Verbose stream output */ inline std::ostream & dumpOn( std::ostream & str, const ResPoolProxy::Impl & obj ) { detail::DumpFilter f; return dumpRange( str << obj << " toModify: ", make_filter_begin( f, obj ), make_filter_end( f, obj ) ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : ResPoolProxy // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResPoolProxy::ResPoolProxy // METHOD TYPE : Ctor // ResPoolProxy::ResPoolProxy() : _pimpl( Impl::nullimpl() ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResPoolProxy::ResPoolProxy // METHOD TYPE : Ctor // ResPoolProxy::ResPoolProxy( ResPool pool_r, const pool::PoolImpl & poolImpl_r ) : _pimpl( new Impl( std::move(pool_r), poolImpl_r ) ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResPoolProxy::~ResPoolProxy // METHOD TYPE : Dtor // ResPoolProxy::~ResPoolProxy() {} /////////////////////////////////////////////////////////////////// // // forward to implementation // /////////////////////////////////////////////////////////////////// ui::Selectable::Ptr ResPoolProxy::lookup( const pool::ByIdent & ident_r ) const { return _pimpl->lookup( ident_r ); } bool ResPoolProxy::empty() const { return _pimpl->empty(); } ResPoolProxy::size_type ResPoolProxy::size() const { return _pimpl->size(); } ResPoolProxy::const_iterator ResPoolProxy::begin() const { return _pimpl->begin(); } ResPoolProxy::const_iterator ResPoolProxy::end() const { return _pimpl->end(); } bool ResPoolProxy::empty( const ResKind & kind_r ) const { return _pimpl->empty( kind_r ); } ResPoolProxy::size_type ResPoolProxy::size( const ResKind & kind_r ) const { return _pimpl->size( kind_r ); } ResPoolProxy::const_iterator ResPoolProxy::byKindBegin( const ResKind & kind_r ) const { return _pimpl->byKindBegin( kind_r ); } ResPoolProxy::const_iterator ResPoolProxy::byKindEnd( const ResKind & kind_r ) const { return _pimpl->byKindEnd( kind_r ); } ResPoolProxy::size_type ResPoolProxy::knownRepositoriesSize() const { return _pimpl->knownRepositoriesSize(); } ResPoolProxy::repository_iterator ResPoolProxy::knownRepositoriesBegin() const { return _pimpl->knownRepositoriesBegin(); } ResPoolProxy::repository_iterator ResPoolProxy::knownRepositoriesEnd() const { return _pimpl->knownRepositoriesEnd(); } void ResPoolProxy::saveState() const { _pimpl->saveState(); } void ResPoolProxy::saveState( const ResKind & kind_r ) const { _pimpl->saveState( kind_r ); } void ResPoolProxy::restoreState() const { _pimpl->restoreState(); } void ResPoolProxy::restoreState( const ResKind & kind_r ) const { _pimpl->restoreState( kind_r ); } bool ResPoolProxy::diffState() const { return _pimpl->diffState(); } bool ResPoolProxy::diffState( const ResKind & kind_r ) const { return _pimpl->diffState( kind_r ); } std::ostream & operator<<( std::ostream & str, const ResPoolProxy & obj ) { return str << *obj._pimpl; } std::ostream & dumpOn( std::ostream & str, const ResPoolProxy & obj ) { return dumpOn( str, *obj._pimpl ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ResPoolProxy.h000066400000000000000000000224751476576476200172300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResPoolProxy.h * */ #ifndef ZYPP_RESPOOLPROXY_H #define ZYPP_RESPOOLPROXY_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ResPoolProxy // /** ResPool::instance().proxy(); * \todo integrate it into ResPool */ class ZYPP_API ResPoolProxy { friend std::ostream & operator<<( std::ostream & str, const ResPoolProxy & obj ); friend std::ostream & dumpOn( std::ostream & str, const ResPoolProxy & obj ); using SelectablePool = std::multimap; public: /** Implementation */ struct Impl; using const_iterator = MapKVIteratorTraits::Value_const_iterator; using size_type = SelectablePool::size_type; using repository_iterator = ResPool::repository_iterator; public: /** Default ctor: no pool * Nonempty proxies are provided by \ref ResPool. * \see \ref ResPool::proxy * \code * ResPoolProxy p( ResPool::instance().proxy() ); * \endcode */ ResPoolProxy(); /** Dtor */ ~ResPoolProxy(); public: /** \name Lookup individual Selectables. */ //@{ ui::Selectable::Ptr lookup( const pool::ByIdent & ident_r ) const; ui::Selectable::Ptr lookup( IdString ident_r ) const { return lookup( pool::ByIdent( ident_r ) ); } ui::Selectable::Ptr lookup( ResKind kind_r, const std::string & name_r ) const { return lookup( pool::ByIdent( std::move(kind_r), name_r ) ); } ui::Selectable::Ptr lookup( const sat::Solvable & solv_r ) const { return lookup( pool::ByIdent( solv_r ) ); } ui::Selectable::Ptr lookup( const ResObject::constPtr & resolvable_r ) const { return resolvable_r ? lookup( resolvable_r->satSolvable() ) : ui::Selectable::Ptr(); } ui::Selectable::Ptr lookup( const PoolItem & pi_r ) const { return lookup( pi_r.satSolvable() ); } //@} public: /** \name Iterate through all Selectables of a all kind. */ //@{ bool empty() const; size_type size() const; const_iterator begin() const; const_iterator end() const; //@} /** \name Iterate through all Selectables of a certain kind. */ //@{ /** True if there are items of a certain kind. */ bool empty( const ResKind & kind_r ) const; template bool empty() const { return empty( ResTraits::kind ); } /** Number of Items of a certain kind. */ size_type size( const ResKind & kind_r ) const; template size_type size() const { return size( ResTraits::kind ); } const_iterator byKindBegin( const ResKind & kind_r ) const; template const_iterator byKindBegin() const { return byKindBegin( ResTraits::kind ); } const_iterator byKindEnd( const ResKind & kind_r ) const; template const_iterator byKindEnd() const { return byKindEnd( ResTraits::kind ); } Iterable byKind( const ResKind & kind_r ) const { return makeIterable( byKindBegin( kind_r ), byKindEnd( kind_r ) ); } template Iterable byKind() const { return makeIterable( byKindBegin(), byKindEnd() ); } //@} public: /** \name Iterate through all Repositories that contribute ResObjects. */ //@{ size_type knownRepositoriesSize() const; repository_iterator knownRepositoriesBegin() const; repository_iterator knownRepositoriesEnd() const; Iterable knownRepositories() const { return makeIterable( knownRepositoriesBegin(), knownRepositoriesEnd() ); } //@} public: /** Test whether there is at least one ui::Selectable with * an installed object. */ bool hasInstalledObj( const ResKind & kind_r ) const { return( make_begin( kind_r ) != make_end( kind_r ) ); } template bool hasInstalledObj() const { return hasInstalledObj( ResTraits::kind ); } public: /** \name Save and restore state per kind of resolvable. * Simple version, no safety net. So don't restore or diff, * if you didn't save before. * * Diff returns true, if current stat differs from the saved * state. * * Use \ref scopedSaveState for exception safe scoped save/restore */ //@{ void saveState() const; void saveState( const ResKind & kind_r ) const; template void saveState() const { return saveState( ResTraits::kind ); } void restoreState() const; void restoreState( const ResKind & kind_r ) const; template void restoreState() const { return restoreState( ResTraits::kind ); } bool diffState() const; bool diffState( const ResKind & kind_r ) const; template bool diffState() const { return diffState( ResTraits::kind ); } /** * \class ScopedSaveState * \brief Exception safe scoped save/restore state. * Call \ref acceptState to prevent the class from restoring * the remembered state. * \ingroup g_RAII */ struct ScopedSaveState; ScopedSaveState scopedSaveState() const; ScopedSaveState scopedSaveState( const ResKind & kind_r ) const; template ScopedSaveState && scopedSaveState() const { return scopedSaveState( ResTraits::kind ); } //@} private: template filter_iterator make_begin( TFilter filter_r, const ResKind & kind_r ) const { return make_filter_iterator( filter_r, byKindBegin(kind_r), byKindEnd(kind_r) ); } template filter_iterator make_begin( const ResKind & kind_r ) const { return make_begin( TFilter(), kind_r ); } template filter_iterator make_end( TFilter filter_r, const ResKind & kind_r ) const { return make_filter_iterator( filter_r, byKindEnd(kind_r), byKindEnd(kind_r) ); } template filter_iterator make_end( const ResKind & kind_r ) const { return make_end( TFilter(), kind_r ); } private: friend class pool::PoolImpl; /** Ctor */ ResPoolProxy( ResPool pool_r, const pool::PoolImpl & poolImpl_r ); /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates ResPoolProxy Stream output */ std::ostream & operator<<( std::ostream & str, const ResPoolProxy & obj ); /** \relates ResPoolProxy Verbose stream output */ std::ostream & dumpOn( std::ostream & str, const ResPoolProxy & obj ); /////////////////////////////////////////////////////////////////// struct ResPoolProxy::ScopedSaveState { NON_COPYABLE_BUT_MOVE( ScopedSaveState ); ScopedSaveState( const ResPoolProxy & pool_r ) : _pimpl( new Impl( pool_r ) ) { _pimpl->saveState(); } ScopedSaveState( const ResPoolProxy & pool_r, const ResKind & kind_r ) : _pimpl( new Impl( pool_r, kind_r ) ) { _pimpl->saveState(); } ~ScopedSaveState() { if ( _pimpl ) _pimpl->restoreState(); } void acceptState() { _pimpl.reset(); } private: struct Impl { Impl( const ResPoolProxy & pool_r ) : _pool( pool_r ) {} Impl( const ResPoolProxy & pool_r, const ResKind & kind_r ) : _pool( pool_r ), _kind( new ResKind( kind_r ) ) {} void saveState() { if ( _kind ) _pool.saveState( *_kind ); else _pool.saveState(); } void restoreState() { if ( _kind ) _pool.restoreState( *_kind ); else _pool.restoreState(); } ResPoolProxy _pool; scoped_ptr _kind; }; std::unique_ptr _pimpl; }; inline ResPoolProxy::ScopedSaveState ResPoolProxy::scopedSaveState() const { return ScopedSaveState( *this ); } inline ResPoolProxy::ScopedSaveState ResPoolProxy::scopedSaveState( const ResKind & kind_r ) const { return ScopedSaveState( *this, kind_r ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESPOOLPROXY_H libzypp-17.36.5/zypp/ResStatus.cc000066400000000000000000000116251476576476200166710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResStatus.cc * */ #include //#include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// const ResStatus ResStatus::toBeInstalled (UNINSTALLED, UNDETERMINED, TRANSACT); const ResStatus ResStatus::toBeUninstalled (INSTALLED, UNDETERMINED, TRANSACT); const ResStatus ResStatus::toBeUninstalledDueToUpgrade (INSTALLED, UNDETERMINED, TRANSACT, EXPLICIT_INSTALL, DUE_TO_UPGRADE); const ResStatus ResStatus::toBeUninstalledDueToObsolete(INSTALLED, UNDETERMINED, TRANSACT, EXPLICIT_INSTALL, DUE_TO_OBSOLETE); /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResStatus::ResStatus // METHOD TYPE : Ctor // ResStatus::ResStatus() {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResStatus::ResStatus // METHOD TYPE : Ctor // ResStatus::ResStatus( bool isInstalled_r ) : _bitfield( isInstalled_r ? INSTALLED : UNINSTALLED ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ResStatus::~ResStatus // METHOD TYPE : Dtor // ResStatus::~ResStatus() {} ResStatus::ResStatus (enum StateValue s, enum ValidateValue v, enum TransactValue t, enum InstallDetailValue i, enum RemoveDetailValue r) : _bitfield (s) { fieldValueAssign(v); fieldValueAssign(t); if (t == TRANSACT) { if (s == INSTALLED) fieldValueAssign(r); else fieldValueAssign(i); } } namespace { // NOTE: Strings defined here are written to the history file // and used by zypper. Do not change them! static const char* strBROKEN = "needed"; static const char* strSATISFIED = "applied"; static const char* strNONRELEVANT = "not-needed"; static const char* strUNDETERMINED = "undetermined"; } std::string ResStatus::validateValueAsString( ValidateValue val_r ) { const char* ret = strUNDETERMINED; switch ( val_r ) { case BROKEN: ret = strBROKEN; break; case SATISFIED: ret = strSATISFIED; break; case NONRELEVANT: ret = strNONRELEVANT; break; case UNDETERMINED:break;// to avoid default: } return ret; } ResStatus::ValidateValue ResStatus::stringToValidateValue( const std::string & str_r ) { ValidateValue ret = UNDETERMINED; if ( str_r == strBROKEN ) ret = BROKEN; else if ( str_r == strSATISFIED ) ret = SATISFIED; else if ( str_r == strNONRELEVANT ) ret = NONRELEVANT; return ret; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ResStatus & obj ) { str << (obj.isInstalled() ? "I" : "U"); str << (obj.isBroken() ? "B" : ( obj.isSatisfied() ? "S" : ( obj.isNonRelevant() ? "N" : "_") ) ); str << (obj.transacts () ? "T" : (obj.isLocked() ? "L" : "_") ); if (obj.isBySolver()) str << "s"; else if (obj.isByApplLow()) str << "l"; else if (obj.isByApplHigh()) str << "h"; else if (obj.isByUser()) str << "u"; str << (obj.isToBeUninstalledDueToObsolete() ? "O" : ( obj.isToBeUninstalledDueToUpgrade() ? "U" : ( obj.isToBeInstalledSoft() ? "S" : "_" ) ) ); str << (obj.isRecommended() ? "r" : "" ); str << (obj.isSuggested() ? "s" : "" ); str << (obj.isOrphaned() ? "o" : "" ); str << (obj.isUnneeded() ? "u" : "" ); return str; } #define OUTS(X) case ResStatus::X: return str << #X; break std::ostream & operator<<( std::ostream & str, ResStatus::TransactValue obj ) { switch ( obj ) { OUTS( KEEP_STATE ); OUTS( LOCKED ); OUTS( TRANSACT ); } return str; } std::ostream & operator<<( std::ostream & str, ResStatus::TransactByValue obj ) { switch ( obj ) { OUTS( SOLVER ); OUTS( APPL_LOW ); OUTS( APPL_HIGH ); OUTS( USER ); } return str; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ResStatus.h000066400000000000000000000602541476576476200165350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResStatus.h * */ #ifndef ZYPP_RESSTATUS_H #define ZYPP_RESSTATUS_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace resstatus { struct UserLockQueryManip; class StatusBackup; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : ResStatus // /** Status bitfield. * * \li \c StateField Whether the resolvable is or uninstalled (available). * \li \c ValidateField Validate status computed by the solver as * nonrelevant: it is unimportant for the user * satisfied: it important nothing has to be done * broken: it is incomplete. So e.g. an update is needed * \li \c TransactField Whether to transact this resolvable * (delete if installed install if uninstalled). * In case the resolvable is locked, only USER may modify the * transact bit. * \li \c TransactByField Who triggered the transaction. Transaction * bit may be reset by higer levels only. * \li \c TransactDetailField Reason why the Resolvable transacts. * Splitted into \c InstallDetailValue and \c RemoveDetailValue * dependent on the kind of transaction. * \li \c WeakField The solvable will be recommended/suggested by * a to be installed/deleted solvable. * */ class ZYPP_API ResStatus { friend std::ostream & operator<<( std::ostream & str, const ResStatus & obj ); friend bool operator==( const ResStatus & lhs, const ResStatus & rhs ); public: /** \name BitField range definitions. * * \note Enlarge FieldType if more bits are needed. It's not yet * checked by the compiler. */ //@{ using FieldType = uint16_t; using BitFieldType = bit::BitField; // Bit Ranges within FieldType defined by 1st bit and size: using StateField = bit::Range; using ValidateField = bit::Range; using TransactField = bit::Range; using TransactByField = bit::Range; using TransactDetailField = bit::Range; using LicenceConfirmedField = bit::Range; using WeakField = bit::Range; using UserLockQueryField = bit::Range; // internal // enlarge FieldType if more bits are needed. It's not yet // checked by the compiler. //@} public: /** \name Status values. * * Each enum corresponds to a BitField range. * \note Take care that enumerator values actually fit into * the corresponding field. It's not yet checked by the compiler. */ //@{ enum StateValue { UNINSTALLED = bit::RangeValue::value, INSTALLED = bit::RangeValue::value }; enum ValidateValue { UNDETERMINED = bit::RangeValue::value, BROKEN = bit::RangeValue::value, SATISFIED = bit::RangeValue::value, NONRELEVANT = bit::RangeValue::value }; enum TransactValue { KEEP_STATE = bit::RangeValue::value, LOCKED = bit::RangeValue::value, // locked, must not transact TRANSACT = bit::RangeValue::value // transact according to state }; enum TransactByValue { SOLVER = bit::RangeValue::value, APPL_LOW = bit::RangeValue::value, APPL_HIGH = bit::RangeValue::value, USER = bit::RangeValue::value }; enum DetailValue { /** Detail for no transact, i.e. reset any Install/RemoveDetailValue. */ NO_DETAIL = bit::RangeValue::value, }; enum InstallDetailValue { EXPLICIT_INSTALL = bit::RangeValue::value, SOFT_INSTALL = bit::RangeValue::value }; enum RemoveDetailValue { EXPLICIT_REMOVE = bit::RangeValue::value, SOFT_REMOVE = bit::RangeValue::value, DUE_TO_OBSOLETE = bit::RangeValue::value, DUE_TO_UPGRADE = bit::RangeValue::value }; enum LicenceConfirmedValue { LICENCE_UNCONFIRMED = bit::RangeValue::value, LICENCE_CONFIRMED = bit::RangeValue::value }; enum WeakValue // Unlike the other fields those are BITS that may be or'ed! { NO_WEAK = bit::RangeValue::value, SUGGESTED = bit::RangeValue::value, RECOMMENDED = bit::RangeValue::value, ORPHANED = bit::RangeValue::value, UNNEEDED = bit::RangeValue::value }; enum UserLockQuery // internal { USERLOCK_NOMATCH = bit::RangeValue::value, USERLOCK_MATCH = bit::RangeValue::value }; //@} public: /** Default ctor. */ ResStatus(); /** Ctor setting the initial . */ ResStatus( bool isInstalled_r ); /** Dtor. */ ~ResStatus(); ResStatus(const ResStatus &) = default; ResStatus(ResStatus &&) noexcept = default; ResStatus &operator=(const ResStatus &) = default; ResStatus &operator=(ResStatus &&) noexcept = default; /** Debug helper returning the bitfield. * It's save to expose the bitfield, as it can't be used to * recreate a ResStatus. So it is not possible to bypass * transition rules. */ BitFieldType bitfield() const { return _bitfield; } public: bool isLicenceConfirmed() const { return fieldValueIs( LICENCE_CONFIRMED ); } void setLicenceConfirmed( bool toVal_r = true ) { fieldValueAssign( toVal_r ? LICENCE_CONFIRMED : LICENCE_UNCONFIRMED ); } public: bool isRecommended() const { return _bitfield.test( RECOMMENDED ); } bool isSuggested() const { return _bitfield.test( SUGGESTED ); } bool isOrphaned() const { return _bitfield.test( ORPHANED ); } bool isUnneeded() const { return _bitfield.test( UNNEEDED ); } bool hasWeak() const { return ! fieldValueIs( NO_WEAK ); } void resetWeak() { return fieldValueAssign( NO_WEAK ); } void setRecommended( bool toVal_r = true ) { _bitfield.set( RECOMMENDED, toVal_r ); } void setSuggested( bool toVal_r = true ) { _bitfield.set( SUGGESTED, toVal_r ); } void setOrphaned( bool toVal_r = true ) { _bitfield.set( ORPHANED, toVal_r ); } void setUnneeded( bool toVal_r = true ) { _bitfield.set( UNNEEDED, toVal_r ); } public: ValidateValue validate() const { return (ValidateValue)_bitfield.value(); } bool isUndetermined() const { return fieldValueIs( UNDETERMINED ); } bool isSatisfied() const { return fieldValueIs( SATISFIED ); } bool isBroken() const { return fieldValueIs( BROKEN ); } bool isNonRelevant() const { return fieldValueIs( NONRELEVANT ); } std::string validateValueAsString() const { return validateValueAsString( validate() ); } /** ValidateValue to string used in the history file. */ static std::string validateValueAsString( ValidateValue val_r ); /** ValidateValue from string used in the history file. */ static ValidateValue stringToValidateValue( const std::string & str_r ); public: // These two are IMMUTABLE! bool isInstalled() const { return fieldValueIs( INSTALLED ); } bool isUninstalled() const { return fieldValueIs( UNINSTALLED ); } public: bool staysInstalled() const { return isInstalled() && !transacts(); } bool wasInstalled() const { return staysInstalled(); } //for old status bool isToBeInstalled() const { return isUninstalled() && transacts(); } bool staysUninstalled() const { return isUninstalled() && !transacts(); } bool wasUninstalled() const { return staysUninstalled(); } // for old status bool isToBeUninstalled() const { return isInstalled() && transacts(); } bool isLocked() const { return fieldValueIs( LOCKED ); } bool isUserLocked() const { return isLocked() && isByUser(); } bool isSoftLocked() const { return isKept() && ( isByApplLow() || isByUser() ); } bool isKept() const { return fieldValueIs( KEEP_STATE ); } bool transacts() const { return fieldValueIs( TRANSACT ); } TransactValue getTransactValue() const { return (TransactValue)_bitfield.value(); } /** True if would be on system after commit. */ bool onSystem() const { return( isInstalled() != transacts() ); } /** True if would be off system after commit. */ bool offSystem() const { return ! onSystem(); } bool isBySolver() const { return fieldValueIs( SOLVER ); } bool isByApplLow() const { return fieldValueIs( APPL_LOW ); } bool isByApplHigh() const { return fieldValueIs( APPL_HIGH ); } bool isByUser() const { return fieldValueIs( USER ); } TransactByValue getTransactByValue() const { return (TransactByValue)_bitfield.value(); } bool setTransactByValue(TransactByValue causer) { if ( isLessThan( causer ) ) { fieldValueAssign( causer ); return true; } else { return false; } } bool isToBeUninstalledDueToObsolete () const { return isToBeUninstalled() && fieldValueIs( DUE_TO_OBSOLETE ); } bool isToBeUninstalledDueToUpgrade() const { return isToBeUninstalled() && fieldValueIs( DUE_TO_UPGRADE ); } bool isToBeInstalledSoft () const { return isToBeInstalled() && fieldValueIs( SOFT_INSTALL ); } bool isToBeInstalledNotSoft () const { return isToBeInstalled() && !fieldValueIs( SOFT_INSTALL ); } bool isToBeUninstalledSoft () const { return isToBeUninstalled() && fieldValueIs( SOFT_REMOVE ); } private: /** \name Internal hard lock maintenance */ //@{ friend struct resstatus::UserLockQueryManip; void setUserLockQueryMatch( bool match_r ) { fieldValueAssign( match_r ? USERLOCK_MATCH : USERLOCK_NOMATCH ); } //@} public: bool isUserLockQueryMatch() const { return fieldValueIs( USERLOCK_MATCH ); } public: //------------------------------------------------------------------------ // get/set functions, returning \c true if requested status change // was successful (i.e. leading to the desired transaction). // If a lower level (e.g.SOLVER) wants to transact, but it's // already set by a higher level, \c true should be returned. // Removing a higher levels transaction bit should fail. // // The may functions checks only, if the action would return true // if it is called. /** Set TransactValue. * Convenience to set TransactValue from enum. */ bool setTransactValue( TransactValue newVal_r, TransactByValue causer_r ) { switch ( newVal_r ) { case KEEP_STATE: return setTransact( false, causer_r ); break; case LOCKED: return setLock( true, causer_r ); break; case TRANSACT: return setTransact( true, causer_r ); break; } return false; } bool maySetTransactValue( TransactValue newVal_r, TransactByValue causer_r ) { bit::BitField savBitfield = _bitfield; bool ret = setTransactValue( newVal_r, causer_r ); _bitfield = savBitfield; return ret; } /** Apply a lock (prevent transaction). * Currently by USER or APPL_HIGH only, but who knows... * Set LOCKED from KEEP_STATE to be sure all transaction * details were reset properly. */ bool setLock( bool toLock_r, TransactByValue causer_r ) { if ( toLock_r == isLocked() ) { // we're already in the desired state, but in case of // LOCKED, remember a superior causer. if ( isLocked() && isLessThan( causer_r ) ) fieldValueAssign( causer_r ); return true; } // Here: Lock status is to be changed: if ( causer_r != USER && causer_r != APPL_HIGH ) return false; if ( toLock_r ) { // We're in unlocked state, which includes TRANSACT. // Causer must be allowed to reset this. But from // KEEP_STATE every causer is allowed to set the lock. if ( ! setTransact( false, causer_r ) ) return false; fieldValueAssign( LOCKED ); fieldValueAssign( causer_r ); } else { // To leave Locked state it needs a superior causer. if ( isGreaterThan( causer_r ) ) return false; fieldValueAssign( KEEP_STATE ); fieldValueAssign( SOLVER ); // reset to lowest causer // in order to distinguish from keep_state_by_user } return true; } bool maySetLock( bool to_r, TransactByValue causer_r ) { bit::BitField savBitfield = _bitfield; bool ret = setLock( to_r, causer_r ); _bitfield = savBitfield; return ret; } /** Toggle between TRANSACT and KEEP_STATE. * LOCKED state means KEEP_STATE. But in contrary to KEEP_STATE, * LOCKED state is immutable for \a causer_r less than TransactByValue. * KEEP_STATE may be changed by any \a causer_r. */ bool setTransact( bool toTansact_r, TransactByValue causer_r ) { if ( toTansact_r == transacts() ) { // we're already in the desired state, but in case of // TRANSACT, remember a superior causer. if ( transacts() && isLessThan( causer_r ) ) fieldValueAssign( causer_r ); fieldValueAssign( NO_DETAIL ); // Details has to be set again return true; } // Here: transact status is to be changed: if ( ! fieldValueIs( KEEP_STATE ) && isGreaterThan( causer_r ) ) { return false; } if ( toTansact_r ) { fieldValueAssign( TRANSACT ); } else { fieldValueAssign( KEEP_STATE ); } fieldValueAssign( NO_DETAIL ); // Details has to be set again fieldValueAssign( causer_r ); return true; } bool maySetTransact( bool val_r, TransactByValue causer ) { bit::BitField savBitfield = _bitfield; bool ret = setTransact (val_r, causer); _bitfield = savBitfield; return ret; } /** */ bool setSoftLock( TransactByValue causer_r ) { if ( ! setTransact( false, causer_r ) ) return false; if ( fieldValueIs( KEEP_STATE ) && isLessThan( causer_r ) ) fieldValueAssign( causer_r ); return true; } /** Not the same as setTransact( false ). */ bool resetTransact( TransactByValue causer_r ) { if ( ! setTransact( false, causer_r ) ) return false; if ( fieldValueIs( KEEP_STATE ) ) fieldValueAssign( SOLVER ); return true; } /** Soft toggle between TRANSACT and KEEP_STATE. * Similar to setTransact, but leaving KEEP_STATE also requires * a superior \a causerLimit_r. So this is a kind of soft lock. * \code * // SOLVER wants to set TRANSACT, iff KEEP_STATE is * // not superior to APPL_LOW. * setSoftTransact( true, SOLVER, APPL_LOW ); * \endcode */ bool setSoftTransact( bool toTansact_r, TransactByValue causer_r, TransactByValue causerLimit_r ) { if ( fieldValueIs( KEEP_STATE ) && toTansact_r != transacts() && isGreaterThan( causerLimit_r ) ) { // any transact status change requires a superior causer. return false; } return setTransact( toTansact_r, causer_r ); } bool setSoftTransact( bool toTansact_r, TransactByValue causer_r ) { return setSoftTransact( toTansact_r, causer_r, causer_r ); } bool maySetSoftTransact( bool val_r, TransactByValue causer, TransactByValue causerLimit_r ) { bit::BitField savBitfield = _bitfield; bool ret = setSoftTransact( val_r, causer, causerLimit_r ); _bitfield = savBitfield; return ret; } bool maySetSoftTransact( bool val_r, TransactByValue causer ) { return maySetSoftTransact( val_r, causer, causer ); } bool setToBeInstalled (TransactByValue causer) { if (isInstalled()) return false; return setTransact (true, causer); } bool maySetToBeInstalled (TransactByValue causer) { bit::BitField savBitfield = _bitfield; bool ret = setToBeInstalled (causer); _bitfield = savBitfield; return ret; } bool setToBeUninstalled (TransactByValue causer) { if (!isInstalled()) return false; return setTransact (true, causer); } bool maySetToBeUninstalled (TransactByValue causer) { bit::BitField savBitfield = _bitfield; bool ret = setToBeUninstalled (causer); _bitfield = savBitfield; return ret; } //------------------------------------------------------------------------ // *** These are only for the Resolver *** bool setToBeUninstalledDueToObsolete ( ) { if (!setToBeUninstalled (SOLVER)) return false; fieldValueAssign(DUE_TO_OBSOLETE); return true; } bool setToBeUninstalledDueToUpgrade ( TransactByValue causer ) { if (!setToBeUninstalled (causer)) return false; fieldValueAssign(DUE_TO_UPGRADE); return true; } bool setToBeInstalledSoft ( ) { if (isInstalled() || !setSoftTransact (true, SOLVER)) return false; fieldValueAssign(SOFT_INSTALL); return true; } bool setToBeUninstalledSoft ( ) { if (!isInstalled() || !setSoftTransact (true, SOLVER)) return false; fieldValueAssign(SOFT_REMOVE); return true; } bool maySetToBeUninstalledSoft () { bit::BitField savBitfield = _bitfield; bool ret = setToBeUninstalledSoft (); _bitfield = savBitfield; return ret; } bool isSoftInstall () { return fieldValueIs (SOFT_INSTALL); } bool isSoftUninstall () { return fieldValueIs (SOFT_REMOVE); } bool setSoftInstall (bool flag) { fieldValueAssign(flag?SOFT_INSTALL:0); return true; } bool setSoftUninstall (bool flag) { fieldValueAssign(flag?SOFT_REMOVE:0); return true; } bool setUndetermined () { fieldValueAssign(UNDETERMINED); return true; } bool setSatisfied () { fieldValueAssign(SATISFIED); return true; } bool setBroken () { fieldValueAssign(BROKEN); return true; } bool setNonRelevant () { fieldValueAssign(NONRELEVANT); return true; } bool setStatus( const ResStatus& newStatus_r ) { // State field is immutable! if ( _bitfield.value() != newStatus_r._bitfield.value() ) return false; // Transaction state change allowed? if ( ! setTransactValue( newStatus_r.getTransactValue(), newStatus_r.getTransactByValue() ) ) return false; // Ok, we take it all.. _bitfield = newStatus_r._bitfield; return true; } /** \name Builtin ResStatus constants. */ //@{ static const ResStatus toBeInstalled; static const ResStatus toBeUninstalled; static const ResStatus toBeUninstalledDueToUpgrade; static const ResStatus toBeUninstalledDueToObsolete; //@} private: /** Ctor for intialization of builtin constants. */ ResStatus( StateValue s, ValidateValue v = UNDETERMINED, TransactValue t = KEEP_STATE, InstallDetailValue i = EXPLICIT_INSTALL, RemoveDetailValue r = EXPLICIT_REMOVE ); /** Return whether the corresponding Field has value \a val_r. */ template bool fieldValueIs( FieldType val_r ) const { return _bitfield.isEqual( val_r ); } /** Set the corresponding Field to value \a val_r. */ template void fieldValueAssign( FieldType val_r ) { _bitfield.assign( val_r ); } /** compare two values. */ template bool isGreaterThan( FieldType val_r ) { return _bitfield.value() > val_r; } template bool isLessThan( FieldType val_r ) { return _bitfield.value() < val_r; } private: friend class resstatus::StatusBackup; BitFieldType _bitfield; }; /////////////////////////////////////////////////////////////////// /** \relates ResStatus Stream output */ std::ostream & operator<<( std::ostream & str, const ResStatus & obj ) ZYPP_API; /** \relates ResStatus Stream output */ std::ostream & operator<<( std::ostream & str, ResStatus::TransactValue obj ) ZYPP_API; /** \relates ResStatus Stream output */ std::ostream & operator<<( std::ostream & str, ResStatus::TransactByValue obj ) ZYPP_API; /** \relates ResStatus */ inline bool operator==( const ResStatus & lhs, const ResStatus & rhs ) { return lhs._bitfield == rhs._bitfield; } /** \relates ResStatus */ inline bool operator!=( const ResStatus & lhs, const ResStatus & rhs ) { return ! (lhs == rhs); } /////////////////////////////////////////////////////////////////// namespace resstatus { class StatusBackup { public: StatusBackup() : _status( 0 ) {} StatusBackup( ResStatus & status_r ) : _status( &status_r ) , _bitfield( _status->_bitfield ) {} void replay() { if ( _status ) _status->_bitfield = _bitfield; } private: ResStatus * _status; ResStatus::BitFieldType _bitfield; }; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESSTATUS_H libzypp-17.36.5/zypp/ResTraits.h000066400000000000000000000124031476576476200165110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResTraits.h * */ #ifndef ZYPP_RESTRAITS_H #define ZYPP_RESTRAITS_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace traits { ///////////////////////////////////////////////////////////////// /** Those are denoted to be installed, if the * solver verifies them as being satisfied. */ inline bool isPseudoInstalled( const ResKind& kind_r ) { return( kind_r == ResKind::patch ); } ///////////////////////////////////////////////////////////////// } // namespace traits /////////////////////////////////////////////////////////////////// /** \defgroup ZYPP_RESOLVABLE_SMART_POINTER_TYPES * Resolvable smart pointer types. * * Forward declaration of all Resolvable smart pointer * types provided in \c ResTraits.h (recommended in header files): * \code * #include "zypp/ResTraits.h" * * Resolvable_Ptr // Resolvable * * ResTraits::PtrType // same as above * * Resolvable_constPtr // const Resolvable * * ResTraits::constPtrType // same as above * \endcode * * Synonym, but requires \c Resolvable.h being included: * \code * #include "zypp/Resolvable.h" * * Resolvable::Ptr // same as Resolvable_Ptr but requires Resolvable.h * Resolvable::constPtr // same as Resolvable_constPtr but requires Resolvable.h * \endcode * * \note When adding a \c NewResolvable type here, dont forgett to * put IMPL_PTR_TYPE(NewResolvable); into the \c NewResolvable.cc. * Also check class \ref ResKind, ResKind.cc, ResObject.cc(makeResObject) */ //@{ DEFINE_PTR_TYPE( Resolvable ); DEFINE_PTR_TYPE( ResObject ); DEFINE_PTR_TYPE( Package ); DEFINE_PTR_TYPE( SrcPackage ); DEFINE_PTR_TYPE( Pattern ); DEFINE_PTR_TYPE( Product ); DEFINE_PTR_TYPE( Patch ); DEFINE_PTR_TYPE( Application ); //@} /** Frequently associated. */ class PoolItem; /** ResTraits. Defines common types and the ResKind value. */ template struct ResTraits { using KindType = ResKind; using PtrType = intrusive_ptr; using constPtrType = intrusive_ptr; static const ResKind kind ZYPP_API; ///< Defined in ResKind.cc /** Those are denoted to be installed, if the * solver verifies them as being satisfied. */ static bool isPseudoInstalled() { return traits::isPseudoInstalled( kind ); } }; // Defined in ResKind.cc template<> const ResKind ResTraits::kind ZYPP_API; template<> const ResKind ResTraits::kind ZYPP_API; template<> const ResKind ResTraits::kind ZYPP_API; template<> const ResKind ResTraits::kind ZYPP_API; template<> const ResKind ResTraits::kind ZYPP_API; template<> const ResKind ResTraits::kind ZYPP_API; /** ResTraits specialisation for Resolvable. * Resolvable is common base and has no Kind value. */ template<> struct ResTraits { using KindType = ResKind; using PtrType = intrusive_ptr; using constPtrType = intrusive_ptr; }; /** ResTraits specialisation for ResObject. * ResObject is common base and has no Kind value. */ template<> struct ResTraits { using KindType = ResKind; using PtrType = intrusive_ptr; using constPtrType = intrusive_ptr; }; /** Convenient access to well known ResKinds. * \code * ResKind packagekind = ResKind::package; * ResKind packagekind = resKind(); * \endcode */ template inline ResKind resKind() { return ResTraits::kind; } /** Convenient test for ResKinds. * \code * ResKind value; * if ( ResKind::package == value ) * if ( resKind() == value ) * if ( isKind( value ) ) * \endcode */ template inline bool isKind( const ResKind & val_r ) { return( resKind() == val_r ); } /** \overload */ template inline bool isKind( const std::string & val_r ) { return( resKind() == val_r ); } /** \overload */ template inline bool isKind( const char * val_r ) { return( resKind() == val_r ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESTRAITS_H libzypp-17.36.5/zypp/Resolvable.cc000066400000000000000000000022711476576476200170270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Resolvable.cc * */ #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { IMPL_PTR_TYPE(Resolvable); Resolvable::Resolvable( const sat::Solvable & solvable_r ) : _solvable( solvable_r ) {} Resolvable::~Resolvable() {} PoolItem Resolvable::poolItem() const { return PoolItem( *this ); } std::ostream & Resolvable::dumpOn( std::ostream & str ) const { return str << satSolvable(); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Resolvable.h000066400000000000000000000134101476576476200166660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Resolvable.h * */ #ifndef ZYPP_RESOLVABLE_H #define ZYPP_RESOLVABLE_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { class PoolItem; /////////////////////////////////////////////////////////////////// /// \class Resolvable /// \brief Base for resolvable objects /// /// \note \ref Resolvable is a SolvableType, which provides direct /// access to many of the underlying sat::Solvables properties. /// Don't add common properties here, but in \ref sat::Solvable /// and extend \ref sat::SolvableType. /// /// In most cases you want to retrieve the common properties directly /// from a \ref PoolItem or \ref sat::Solvable. Construction from and /// explicit conversion to sat::Solvable are supported. Next goal is /// to get rid of the smart pointer hierarchy. A Resolvable is actually /// an unsigned and derived classes contain no data, so it makes little /// sense to wrap this into ReferenceCounted smart pointer. /// /// \todo Merge with ResObject /// \todo Get rid of refcout/smart_prt bloat, as this type is actually IdBased (i.e. sizeof(unsigned)) /////////////////////////////////////////////////////////////////// class ZYPP_API Resolvable : public sat::SolvableType, public base::ReferenceCounted, private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const Resolvable & obj ); public: using Self = Resolvable; using TraitsType = ResTraits; using Kind = TraitsType::KindType; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: /** This is a \ref sat::SolvableType. */ explicit operator sat::Solvable() const { return _solvable; } /** Access the corresponding \ref PoolItem. */ PoolItem poolItem() const; protected: /** Ctor */ Resolvable( const sat::Solvable & solvable_r ); /** Dtor */ ~Resolvable() override; /** Helper for stream output */ std::ostream & dumpOn( std::ostream & str ) const override; private: sat::Solvable _solvable; }; /////////////////////////////////////////////////////////////////// /** \relates Resolvable Stream output */ inline std::ostream & operator<<( std::ostream & str, const Resolvable & obj ) { return obj.dumpOn( str ); } /** \relates Resolvable More verbose stream output including dependencies */ inline std::ostream & dumpOn( std::ostream & str, const Resolvable & obj ) { return dumpOn( str, obj.satSolvable() ); } /** Test whether a Resolvable::Ptr is of a certain Kind. * \return \c Ture iff \a p is not \c NULL and points to a Resolvable * of the specified Kind. * \relates Resolvable * \code * isKind(resPtr); * \endcode */ template inline bool isKind( const Resolvable::constPtr & p ) { return p && p->isKind(); } // Specialization for Resolvable: Always true. template<> inline bool isKind( const Resolvable::constPtr & p ) { return !!p; } // Specialization for ResObject: Always true. template<> inline bool isKind( const Resolvable::constPtr & p ) { return !!p; } /** Convert Resolvable::Ptr into Ptr of a certain Kind. * \return \c NULL iff \a p is \c NULL or points to a Resolvable * not of the specified Kind. * \relates Resolvable * \code * asKind(resPtr); * \endcode */ template inline typename ResTraits::PtrType asKind( const Resolvable::Ptr & p ) { return dynamic_pointer_cast(p); } template inline typename ResTraits::constPtrType asKind( const Resolvable::constPtr & p ) { return dynamic_pointer_cast(p); } /////////////////////////////////////////////////////////////////// /** \relates Resolvable Compare Resolvable::constPtr according to \a kind and \a name. * \deprecated Get rid of refcout/smart_prt bloat, use */ inline int compareByN( const Resolvable::constPtr & lhs, const Resolvable::constPtr & rhs ) { int ret = 0; if ( lhs != rhs ) { if ( lhs && rhs ) ret = compareByN( *lhs, *rhs ); else ret = lhs ? 1 : -1; } return ret; } /** \relates Resolvable Compare according to \a kind, \a name and \a edition. */ inline int compareByNVR( const Resolvable::constPtr & lhs, const Resolvable::constPtr & rhs ) { int ret = 0; if ( lhs != rhs ) { if ( lhs && rhs ) ret = compareByNVR( *lhs, *rhs ); else ret = lhs ? 1 : -1; } return ret; } /** \relates Resolvable Compare Resolvable::constPtr according to \a kind, \a name, \a edition and \a arch. */ inline int compareByNVRA( const Resolvable::constPtr & lhs, const Resolvable::constPtr & rhs ) { int ret = 0; if ( lhs != rhs ) { if ( lhs && rhs ) ret = compareByNVRA( *lhs, *rhs ); else ret = lhs ? 1 : -1; } return ret; } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESOLVABLE_H libzypp-17.36.5/zypp/Resolver.cc000066400000000000000000000202151476576476200165300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Resolver.cc * */ #include #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// using namespace solver; IMPL_PTR_TYPE(Resolver); /////////////////////////////////////////////////////////////////// // // METHOD NAME : Resolver::Resolver // METHOD TYPE : Ctor // Resolver::Resolver( const ResPool & pool ) : _pimpl( new solver::detail::ResolverInternal(pool) ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Resolver::~Resolver // METHOD TYPE : Dtor // Resolver::~Resolver() {} /////////////////////////////////////////////////////////////////// // // Resolver interface forwarded to implementation // /////////////////////////////////////////////////////////////////// void Resolver::setDefaultSolverFlags( bool all_r ) { return _pimpl->setDefaultSolverFlags( all_r ); } sat::detail::CSolver * Resolver::get() const { return _pimpl->get(); } bool Resolver::verifySystem () { return _pimpl->verifySystem(); } bool Resolver::resolvePool () { return _pimpl->resolvePool(); } bool Resolver::resolveQueue( solver::detail::SolverQueueItemList & queue ) { return _pimpl->resolveQueue(queue); } void Resolver::undo() { _pimpl->undo(); } ResolverProblemList Resolver::problems () { return _pimpl->problems (); } void Resolver::applySolutions( const ProblemSolutionList & solutions ) { _pimpl->applySolutions (solutions); } sat::Transaction Resolver::getTransaction() { return _pimpl->getTransaction(); } bool Resolver::doUpgrade() { return _pimpl->doUpgrade(); } void Resolver::doUpdate() { _pimpl->doUpdate(); } void Resolver::setFocus( ResolverFocus focus_r ) { _pimpl->setFocus( focus_r ); } ResolverFocus Resolver::focus() const { return _pimpl->focus(); } void Resolver::setForceResolve( bool yesno_r ) { _pimpl->setForceResolve( yesno_r ); } bool Resolver::forceResolve() const { return _pimpl->forceResolve(); } void Resolver::setIgnoreAlreadyRecommended( bool yesno_r) { _pimpl->setIgnoreAlreadyRecommended( yesno_r ); } bool Resolver::ignoreAlreadyRecommended() const { return _pimpl->ignoreAlreadyRecommended(); } void Resolver::setOnlyRequires( bool yesno_r ) { _pimpl->setOnlyRequires( yesno_r ); } void Resolver::resetOnlyRequires() { _pimpl->setOnlyRequires( indeterminate ); } bool Resolver::onlyRequires() const { return _pimpl->onlyRequires(); } void Resolver::setUpgradeMode( bool yesno_r ) { return _pimpl->setUpgradeMode( yesno_r ); } bool Resolver::upgradeMode() const { return _pimpl->isUpgradeMode(); } void Resolver::setUpdateMode( bool yesno_r ) { return _pimpl->setUpdateMode( yesno_r ); } bool Resolver::updateMode() const { return _pimpl->isUpdateMode(); } void Resolver::setRemoveOrphaned( bool yesno_r ) { return _pimpl->setRemoveOrphaned( yesno_r ); } bool Resolver::removeOrphaned() const { return _pimpl->removeOrphaned(); } void Resolver::setRemoveUnneeded( bool yesno_r ) { return _pimpl->setRemoveUnneeded( yesno_r ); } bool Resolver::removeUnneeded() const { return _pimpl->removeUnneeded(); } void Resolver::setSystemVerification( bool yesno_r ) { _pimpl->setVerifyingMode( yesno_r ); } void Resolver::setDefaultSystemVerification() { _pimpl->setVerifyingMode( indeterminate ); } bool Resolver::systemVerification() const { return _pimpl->isVerifyingMode(); } void Resolver::setSolveSrcPackages( bool yesno_r ) { _pimpl->setSolveSrcPackages( yesno_r ); } void Resolver::setDefaultSolveSrcPackages() { _pimpl->setSolveSrcPackages( indeterminate ); } bool Resolver::solveSrcPackages() const { return _pimpl->solveSrcPackages(); } void Resolver::setCleandepsOnRemove( bool yesno_r ) { _pimpl->setCleandepsOnRemove( yesno_r ); } void Resolver::setDefaultCleandepsOnRemove() { _pimpl->setCleandepsOnRemove( indeterminate ); } bool Resolver::cleandepsOnRemove() const { return _pimpl->cleandepsOnRemove(); } #define ZOLV_FLAG_BOOL( ZSETTER, ZGETTER ) \ void Resolver::ZSETTER( bool yesno_r ){ _pimpl->ZSETTER( yesno_r ); } \ bool Resolver::ZGETTER() const { return _pimpl->ZGETTER(); } \ #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZDEFAULT, ZGETTER ) \ ZOLV_FLAG_BOOL( ZSETTER , ZGETTER ) \ void Resolver::ZDEFAULT() { _pimpl->ZSETTER( indeterminate ); } \ ZOLV_FLAG_TRIBOOL( setAllowDowngrade, setDefaultAllowDowngrade, allowDowngrade ) ZOLV_FLAG_TRIBOOL( setAllowNameChange, setDefaultAllowNameChange, allowNameChange ) ZOLV_FLAG_TRIBOOL( setAllowArchChange, setDefaultAllowArchChange, allowArchChange ) ZOLV_FLAG_TRIBOOL( setAllowVendorChange, setDefaultAllowVendorChange, allowVendorChange ) ZOLV_FLAG_TRIBOOL( dupSetAllowDowngrade, dupSetDefaultAllowDowngrade, dupAllowDowngrade ) ZOLV_FLAG_TRIBOOL( dupSetAllowNameChange, dupSetDefaultAllowNameChange, dupAllowNameChange ) ZOLV_FLAG_TRIBOOL( dupSetAllowArchChange, dupSetDefaultAllowArchChange, dupAllowArchChange ) ZOLV_FLAG_TRIBOOL( dupSetAllowVendorChange, dupSetDefaultAllowVendorChange, dupAllowVendorChange ) #undef ZOLV_FLAG_BOOL #undef ZOLV_FLAG_TRIBOOL void Resolver::addUpgradeRepo( Repository repo_r ) { _pimpl->addUpgradeRepo( repo_r ); } bool Resolver::upgradingRepos() const { return !_pimpl->upgradeRepos().empty(); } bool Resolver::upgradingRepo( Repository repo_r ) const { return _pimpl->upgradingRepo( repo_r ); } void Resolver::removeUpgradeRepo( Repository repo_r ) { _pimpl->removeUpgradeRepo( repo_r ); } void Resolver::removeUpgradeRepos() { _pimpl->removeUpgradeRepos(); } void Resolver::addRequire( const Capability & capability ) { _pimpl->addExtraRequire( capability ); } void Resolver::addConflict( const Capability & capability ) { _pimpl->addExtraConflict( capability ); } void Resolver::removeRequire( const Capability & capability ) { _pimpl->removeExtraRequire( capability ); } void Resolver::removeConflict( const Capability & capability ){ _pimpl->removeExtraConflict( capability ); } CapabilitySet Resolver::getRequire() const { return _pimpl->extraRequires(); } CapabilitySet Resolver::getConflict() const { return _pimpl->extraConflicts(); } std::list Resolver::problematicUpdateItems() const { return _pimpl->problematicUpdateItems(); } bool Resolver::createSolverTestcase( const std::string & dumpPath, bool runSolver ) { solver::detail::Testcase testcase (dumpPath); return testcase.createTestcase(*_pimpl, true, runSolver); } solver::detail::ItemCapKindList Resolver::isInstalledBy( const PoolItem & item ) { return _pimpl->isInstalledBy (item); } solver::detail::ItemCapKindList Resolver::installs( const PoolItem & item ) { return _pimpl->installs (item); } solver::detail::ItemCapKindList Resolver::satifiedByInstalled( const PoolItem & item ) { return _pimpl->satifiedByInstalled (item); } solver::detail::ItemCapKindList Resolver::installedSatisfied( const PoolItem & item ) { return _pimpl->installedSatisfied (item); } void Resolver::reset() { _pimpl->reset( false ); /* Do not keep extra requires/conflicts */ } std::ostream & operator<<( std::ostream & str, const Resolver & obj ) { return str << *obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Resolver.h000066400000000000000000000434161476576476200164020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Resolver.h * */ #ifndef ZYPP_RESOLVER_H #define ZYPP_RESOLVER_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace sat { class Transaction; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Resolver // /** * Dependency resolver interface. * * To resolve dependencies after making changes to the \ref ResPool (using * \ref addRequire(), \ref addConflict(), \ref applySolutions(), or by making * the changes directly on the \ref PoolItem status objects, * call the \ref resolvePool() method. */ class ZYPP_API Resolver : public base::ReferenceCounted, private base::NonCopyable { public: /** Ctor */ Resolver( const ResPool & pool ); /** Dtor */ ~Resolver() override; /** * Reset all solver flags to the systems default (e.g. from zypp.conf). * * Call this to discard all settings you explicitly applied here. All flags * are adjusted to follow the current systems default. If you want to reset * just a specific flag, call its 'setDefault...' method. * * Calling the method with \a all_r is set to \c false, is used internally. * It updates only those flags which were not explicitly changed. E.g after * switching to a target which uses different defaults in its zypp.conf.. */ void setDefaultSolverFlags( bool all_r = true ); /** * Resolve package dependencies: * * Enter \ref systemVerification mode to monitor and repair dependencies * of already installed packages, and solve immediately. * * Call \ref setSystemVerification to turn of this mode. **/ bool verifySystem(); /** * Resolve package dependencies: * * Try to execute all pending transactions (there may be more than * one!). * The solver collects all transactions (install/delete resolvables) * from the pool, generates task, solving it and writes the * results back to pool * * Returns "true" on success (i.e., if there were no problems that * need user interaction) and "false" if there were problems. In * the latter case, use problems() and later applySolutions() * below. **/ bool resolvePool(); /** * Resolve package dependencies: * * The solver works off the given queue and writes back the solution * to pool. * * Returns "true" on success (i.e., if there were no problems that * need user interaction) and "false" if there were problems. In * the latter case, use problems() and later applySolutions() * below. * The solution could be that the solver remove/add some entries * in the task queue. So make a new call of resolveQueue after you * have applied any solution AND check the parameter "queue" if * there has been any changes by the solver and adapt these changes * to e.g. the selectables. * **/ bool resolveQueue( solver::detail::SolverQueueItemList & queue ); /* * Undo solver changes done in resolvePool() * Throwing away all ignored dependencies. */ void undo(); /* * Resets solver information and verify option. */ void reset(); /** * Do an distribution upgrade (DUP) * * Perform a distribution upgrade. This performs an update of * all packages with a special resolver algorithm which takes * care of package splits, pattern and product updates, * etc. * This call also turns the solver into \ref upgradeMode, so * consecutive calls to \ref resolvePool performed in this * mode too. Call \ref setUpgradeMode to turn this mode off. * * \see \ref addUpgradeRepo **/ bool doUpgrade(); /** * Update to newest package * * Install the newest version of your installed packages as * far as possible. This means a newer package will NOT be * installed if it generates dependency problems. * So the user will not get an error message. * **/ void doUpdate( ); /** * Unmaintained packages which does not fit to * the updated system (broken dependencies) will be * deleted. * Return the list of deleted items. * Note : This list is valid after the call doUpgrade() only. **/ std::list problematicUpdateItems() const; /** * Return the dependency problems found by the last call to * resolveDependencies(). If there were no problems, the returned * list will be empty. **/ ResolverProblemList problems(); /** * Apply problem solutions. No more than one solution per problem * can be applied. **/ void applySolutions( const ProblemSolutionList & solutions ); /** * Return the \ref Transaction computed by the last solver run. */ sat::Transaction getTransaction(); /** * Define the resolver's general attitude when resolving jobs. * \see \ref ResolverFocus */ void setFocus( ResolverFocus focus_r ); ResolverFocus focus() const; /** * Remove resolvables which are conflicts with others or * have unfulfilled requirements. * This behaviour is favourited by ZMD. **/ void setForceResolve( bool force ); bool forceResolve() const; /** * Ignore recommended packages that were already recommended by * the installed packages **/ void setIgnoreAlreadyRecommended( bool yesno_r ); bool ignoreAlreadyRecommended() const; /** * Setting whether required packages are installed ONLY * So recommended packages, language packages and packages which depend * on hardware (modalias) will not be regarded. **/ void setOnlyRequires( bool yesno_r ); void resetOnlyRequires(); // set back to default (described in zypp.conf) bool onlyRequires() const; /** * Setting whether the solver should perform in 'upgrade' mode or * not. * \see \ref doUpgrade. */ void setUpgradeMode( bool yesno_r ); bool upgradeMode() const; /** * Setting whether the solver should perform in 'update' mode or * not. If on, it will add a resolver job to update all packages. * \see \ref doUpdate. */ void setUpdateMode( bool yesno_r ); bool updateMode() const; /** * Set whether to remove unused orphans in 'upgrade' mode. * * Orphaned packages are those which are neither provided by any repository * not have update candidates within any repository. They often denoted as * dropped or not-wanted. They are leftovers of previous distribution * versions. * * \Note 3rd party .rpm packages simply installed are seen as orphaned and * may be removed by dup. Collecting these packages in a directory and * adding this directory as a (plaindir) repo turns them into wanted * packages. They are kind of protected by being part of an enabled * repository. */ void setRemoveOrphaned( bool yesno_r ); bool removeOrphaned() const; /** * File weak remove jobs for unneeded installed packages. * * \Note There needs to be one (even if empty) solver run before * unneeded installed packages are determined. So this does not * contribute to the very first solver run. * * \Note In order to tailor the \c unneeded classification one needs * to be able to control the \c autoinstalled property of a package. * Only autoinstalled packages can be unneeded. So switching the * autoinstalled property is the way to (potentially) add or (surely) * remove a package from the unneeded set. */ void setRemoveUnneeded( bool yesno_r ); bool removeUnneeded() const; /** \name Solver flags (non DUP modes) * Default for all flags is \c false unless overwritten by zypp.conf. */ //@{ /** Whether to allow one to downgrade installed solvable */ void setAllowDowngrade( bool yesno_r ); void setDefaultAllowDowngrade(); // Set back to default bool allowDowngrade() const; /** Whether to allow one to change name of installed solvable */ void setAllowNameChange( bool yesno_r ); void setDefaultAllowNameChange(); // Set back to default bool allowNameChange() const; /** Whether to allow one to change architecture of installed solvables */ void setAllowArchChange( bool yesno_r ); void setDefaultAllowArchChange(); // Set back to default bool allowArchChange() const; /** Whether to allow one to change vendor of installed solvables * \see \ref VendorAttr for definition of vendor equivalence. */ void setAllowVendorChange( bool yesno_r ); void setDefaultAllowVendorChange(); // Set back to default bool allowVendorChange() const; //@} /** * System verification mode also monitors and repairs dependencies * of already installed packages. * \see \ref verifySystem */ void setSystemVerification( bool yesno_r ); void setDefaultSystemVerification(); bool systemVerification() const; /** * Set whether to solve source packages build dependencies per default. * Usually turned off and if, enabled per source package. * \NOTE This affects only source packges selected in the \ref ResPool. No solver rule * will be generated for them. Source packages requested via e.g. \ref addRequire will * always be solved. * \NOTE Be carefull. The older the source package is, the stranger may be the * result of solving its build dependencies. */ void setSolveSrcPackages( bool yesno_r ); void setDefaultSolveSrcPackages(); bool solveSrcPackages() const; /** * Cleanup when deleting packages. Whether the solver should, per default, * try to remove packages exclusively required by the ones it's asked to delete. */ void setCleandepsOnRemove( bool yesno_r ); void setDefaultCleandepsOnRemove(); // set back to default (in zypp.conf) bool cleandepsOnRemove() const; /** \name Solver flags for DUP mode. * DUP mode default settings differ from 'ordinary' ones. Default for * all DUP flags is \c true unless overwritten by zypp.conf. */ //@{ /** dup mode: allow one to downgrade installed solvable */ void dupSetAllowDowngrade( bool yesno_r ); void dupSetDefaultAllowDowngrade(); // Set back to default (in zypp.conf) bool dupAllowDowngrade() const; /** dup mode: allow one to change name of installed solvable */ void dupSetAllowNameChange( bool yesno_r ); void dupSetDefaultAllowNameChange(); // Set back to default (in zypp.conf) bool dupAllowNameChange() const; /** dup mode: allow one to change architecture of installed solvables */ void dupSetAllowArchChange( bool yesno_r ); void dupSetDefaultAllowArchChange(); // Set back to default (in zypp.conf) bool dupAllowArchChange() const; /** dup mode: allow one to change vendor of installed solvables*/ void dupSetAllowVendorChange( bool yesno_r ); void dupSetDefaultAllowVendorChange(); // Set back to default (in zypp.conf) bool dupAllowVendorChange() const; //@} /** \name Upgrade to content of a specific repository. * \note This is an ordinary solver request. You should simply * \ref resolvePool to execute, and not \ref doUpgrade. */ //@{ /** * Adding request to perform a dist upgrade restricted to this repository. * * This is what e.g. zypper dup --repo myrepo should perform. * \see \ref doUpgrade */ void addUpgradeRepo( Repository repo_r ); /** * Whether there is at least one \c UpgradeRepo request pending */ bool upgradingRepos() const; /** * Whether there is an \c UpgradeRepo request pending for this repo. */ bool upgradingRepo( Repository repo_r ) const; /** * Remove an upgrade request for this repo. */ void removeUpgradeRepo( Repository repo_r ); /** * Remove all upgrade repo requests. */ void removeUpgradeRepos(); //@} /** * Adding additional requirement * */ void addRequire( const Capability & capability ); /** * Adding additional conflict * */ void addConflict( const Capability & capability ); /** * Remove the additional requirement set by \ref addRequire(Capability). * */ void removeRequire( const Capability & capability ); /** * Remove the additional conflict set by \ref addConflict(Capability). * */ void removeConflict( const Capability & capability ); /** * Get all the additional requirements set by \ref addRequire(Capability). * */ CapabilitySet getRequire() const; /** * Get all the additional conflicts set by \ref addConflict(Capability). * */ CapabilitySet getConflict() const; /** * Generates a solver Testcase of the current state * * \parame dumpPath destination directory of the created directory * \return true if it was successful */ bool createSolverTestcase( const std::string & dumpPath = "/var/log/YaST2/solverTestcase", bool runSolver = true ); /** * Gives information about WHO has pused an installation of an given item. * * \param item Evaluate additional information for this resolvable. * \return A list of structures which contains: * item Item which has triggered the installation of the given param item. * initialInstallation This item has triggered the installation * Not already fullfilled requierement only. * cap Capability which has triggerd this installation * capKind Kind of that capability (e.g. Dep::REQUIRES,Dep::RECOMMENDS,... ) * * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid. * */ solver::detail::ItemCapKindList isInstalledBy( const PoolItem & item ); /** * Gives information about WHICH additional items will be installed due the installation of an item. * * \param item Evaluate additional information for this resolvable. * \return A list of structures which contains: * item Item which has triggered the installation of the given param item. * initialInstallation This item has triggered the installation * Not already fullfilled requierement only. * cap Capability which has triggerd this installation * capKind Kind of that capability (e.g. Dep::REQUIRES,Dep::RECOMMENDS,... ) * * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid. * */ solver::detail::ItemCapKindList installs( const PoolItem & item ); /** * Gives information about WHICH installed items are requested by the installation of an item. * * \param item Evaluate additional information for this resolvable. * \return A list of structures which contains: * item Item which has triggered the installation of the given param item. * initialInstallation This item has triggered the installation * Not already fullfilled requierement only. * cap Capability which has triggerd this installation * capKind Kind of that capability (e.g. Dep::REQUIRES,Dep::RECOMMENDS,... ) * * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid. * */ solver::detail::ItemCapKindList satifiedByInstalled( const PoolItem & item ); /** * Gives information about WHICH items require an already installed item. * * \param item Evaluate additional information for this resolvable. * \return A list of structures which contains: * item Item which has triggered the installation of the given param item. * initialInstallation This item has triggered the installation * Not already fullfilled requierement only. * cap Capability which has triggerd this installation * capKind Kind of that capability (e.g. Dep::REQUIRES,Dep::RECOMMENDS,... ) * * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid. * */ solver::detail::ItemCapKindList installedSatisfied( const PoolItem & item ); public: /** Expert backdoor. */ sat::detail::CSolver * get() const; private: friend std::ostream & operator<<( std::ostream & str, const Resolver & obj ); zypp::RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates Resolver Stream output */ std::ostream & operator<<( std::ostream & str, const Resolver & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESOLVER_H libzypp-17.36.5/zypp/ResolverFocus.cc000066400000000000000000000040601476576476200175300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResolverFocus.cc */ #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { std::string asString( const ResolverFocus & val_r ) { switch ( val_r ) { #define OUTS(V) case ResolverFocus::V: return #V; break OUTS( Default ); OUTS( Job ); OUTS( Installed ); OUTS( Update ); #undef OUTS } // Oops! std::string ret { str::Str() << "ResolverFocus(" << static_cast(val_r) << ")" }; WAR << "asString: dubious " << ret << endl; return ret; } bool fromString( const std::string & val_r, ResolverFocus & ret_r ) { switch ( val_r[0] ) { #define OUTS(V) if ( ::strcasecmp( val_r.c_str(), #V ) == 0 ) { ret_r = ResolverFocus::V; return true; } case 'D': case 'd': OUTS( Default ); break; case 'J': case 'j': OUTS( Job ); break; case 'I': case 'i': OUTS( Installed ); break; case 'U': case 'u': OUTS( Update ); break; case '\0': ret_r = ResolverFocus::Default; return true; break; #undef OUTS } // Oops! WAR << "fromString: unknown ResolverFocus '" << val_r << "'" << endl; return false; } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ResolverFocus.h000066400000000000000000000043131476576476200173730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResolverFocus.h */ #ifndef ZYPP_RESOLVERFOCUS_H #define ZYPP_RESOLVERFOCUS_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /** The resolver's general attitude. */ enum class ResolverFocus { Default = 0 ///< Request the standard behavior (as defined in zypp.conf or 'Job') ,Job ///< Focus on installing the best version of the requested packages ,Installed ///< Focus on applying as little changes to the installed packages as needed ,Update ///< Focus on updating requested packages and their dependencies as much as possible }; /** \relates ResolverFocus Conversion to string (enumerator name) */ std::string asString( const ResolverFocus & val_r ) ZYPP_API; /** \relates ResolverFocus Conversion from string (enumerator name, case insensitive, empty string is Default) * \returns \c false if \a val_r is not recognized */ bool fromString( const std::string & val_r, ResolverFocus & ret_r ) ZYPP_API; /** \relates ResolverFocus Conversion from string (convenience) * \returns \ref ResolverFocus::Default if \a val_r is not recognized */ inline ResolverFocus resolverFocusFromString( const std::string & val_r ) { ResolverFocus ret_r { ResolverFocus::Default }; fromString( val_r, ret_r ); return ret_r; } /** \relates ResolverFocus Stream output */ inline std::ostream & operator<<( std::ostream & str, const ResolverFocus & obj ) { return str << asString( obj ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESOLVERFOCUS_H libzypp-17.36.5/zypp/ResolverNamespace.h000066400000000000000000000053121476576476200202100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ResolverNamespace.h */ #ifndef ZYPP_RESOLVERNAMESPACE_H #define ZYPP_RESOLVERNAMESPACE_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /** The resolver's dependency namespaces */ enum class ResolverNamespace : std::uint8_t { language = 1<<0, ///< language support modalias = 1<<1, ///< hardware support filesystem = 1<<2, ///< filesystems }; /** \relates ResolverNamespace Flags */ ZYPP_DECLARE_FLAGS_AND_OPERATORS(ResolverNamespaces,ResolverNamespace); /** \relates ResolverNamespace All bits set. */ static constexpr const ResolverNamespaces NoResolverNamespaces = ResolverNamespace(); /** \relates ResolverNamespace All bits set. */ static constexpr const ResolverNamespaces AllResolverNamespaces = ResolverNamespace(0xff); /** \relates ResolverNamespace The underlying libsolv ID */ inline constexpr IdString asIdString( ResolverNamespace obj ) { return IdString( obj == ResolverNamespace::language ? sat::detail::namespaceLanguage : obj == ResolverNamespace::modalias ? sat::detail::namespaceModalias : obj == ResolverNamespace::filesystem ? sat::detail::namespaceFilesystem : sat::detail::noId ); } /** \relates ResolverNamespace String representation */ inline std::string asString( ResolverNamespace obj ) { return asIdString( obj ).asString(); } /** \relates ResolverNamespace Stream output */ inline std::ostream & operator<<( std::ostream & str, ResolverNamespace obj ) { return str << asIdString( obj ); } /** \relates ResolverNamespaces Stream output */ inline std::ostream & operator<<( std::ostream & str, ResolverNamespaces obj ) { return str << stringify( obj, { { ResolverNamespace::language, "language" }, { ResolverNamespace::modalias, "modalias" }, { ResolverNamespace::filesystem, "filesystem" }, }, "namespace:", "|", "" ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RESOLVERNAMESPACE_H libzypp-17.36.5/zypp/ResolverProblem.cc000066400000000000000000000122371476576476200200560ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* ResolverProblem.cc * * Easy-to use interface to the ZYPP dependency resolver * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { IMPL_PTR_TYPE(ResolverProblem); ///////////////////////////////////////////////////////////////////////// namespace { // HACK for bsc#985674: filter duplicate solutions // inline bool solutionInList( const ProblemSolutionList & solutions_r, const ProblemSolution_Ptr & solution_r ) { for ( const ProblemSolution_Ptr & solution : solutions_r ) { if ( solution->description() == solution_r->description() && solution->details() == solution_r->details() && solution->actions().size() == solution_r->actions().size() ) return true; } return false; } } // namespace ///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class ResolverProblem::Impl /// \brief ResolverProblem implementation. /////////////////////////////////////////////////////////////////// struct ResolverProblem::Impl { Impl() {} Impl( std::string && description ) : _description( std::move(description) ) {} Impl( std::string && description, std::string && details ) : _description( std::move(description) ) , _details( std::move(details) ) {} Impl( std::string && description, std::string && details, std::vector &&completeProblemInfo ) : _description( std::move(description) ) , _details( std::move(details) ) , _completeProblemInfo ( std::move(completeProblemInfo) ) {} std::string _description; std::string _details; ProblemSolutionList _solutions; std::vector _completeProblemInfo; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// ResolverProblem::ResolverProblem() : _pimpl( new Impl() ) {} ResolverProblem::ResolverProblem( std::string description ) : _pimpl( new Impl( std::move(description) ) ) {} ResolverProblem::ResolverProblem( std::string description, std::string details ) : _pimpl( new Impl( std::move(description), std::move(details) ) ) {} ResolverProblem::ResolverProblem( std::string description, std::string details, std::vector &&completeProblemInfo ) : _pimpl( new Impl( std::move(description), std::move(details), std::move(completeProblemInfo) ) ) {} ResolverProblem::~ResolverProblem() {} const std::string & ResolverProblem::description() const { return _pimpl->_description; } const std::string & ResolverProblem::details() const { return _pimpl->_details; } const ProblemSolutionList & ResolverProblem::solutions() const { return _pimpl->_solutions; } const std::vector & ResolverProblem::completeProblemInfo() const { return _pimpl->_completeProblemInfo; } void ResolverProblem::setDescription( std::string description ) { _pimpl->_description = std::move(description); } void ResolverProblem::setDetails( std::string details ) { _pimpl->_details = std::move(details); } void ResolverProblem::addSolution( const ProblemSolution_Ptr& solution, bool inFront ) { if ( ! solutionInList( _pimpl->_solutions, solution ) ) // bsc#985674: filter duplicate solutions { if (inFront) { _pimpl->_solutions.push_front( solution ); } else { _pimpl->_solutions.push_back( solution ); } } } std::ostream & operator<<( std::ostream & os, const ResolverProblem & obj ) { os << "Problem:" << endl; os << "==============================" << endl; os << obj.description() << endl; os << obj.details() << endl; os << "------------------------------" << endl; os << obj.solutions(); os << "==============================" << endl; return os; } std::ostream & operator<<( std::ostream & os, const ResolverProblemList & obj ) { return dumpRange( os, obj.begin(), obj.end(), "", "", ", ", "", "" ); } } // namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ResolverProblem.h000066400000000000000000000062011476576476200177120ustar00rootroot00000000000000/* * * Easy-to use interface to the ZYPP dependency resolver * * Author: Stefan Hundhammer * **/ #ifndef ZYPP_RESOLVERPROBLEM_H #define ZYPP_RESOLVERPROBLEM_H #include #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /// \class ResolverProblem /// \brief Describe a solver problem and offer solutions. /////////////////////////////////////////////////////////////////////// class ZYPP_API ResolverProblem : public base::ReferenceCounted { public: /** Constructor. */ ResolverProblem(); /** Constructor. */ ResolverProblem( std::string description ); /** Constructor. */ ResolverProblem( std::string description, std::string details ); /** Constructor. */ ResolverProblem( std::string description, std::string details, std::vector &&completeProblemInfo ); /** Destructor. */ ~ResolverProblem() override; /** * Return a one-line description of the problem. **/ const std::string & description() const; /** * Return a (possibly muti-line) detailed description of the problem * or an empty string if there are no useful details. **/ const std::string & details() const; /** * Return a one-line description for each problematic rule in the problem tree **/ const std::vector & completeProblemInfo() const; /** * Return the possible solutions to this problem. * All problems should have at least 2-3 (mutually exclusive) solutions: * * - Undo: Do not perform the offending transaction * (do not install the package that had unsatisfied requirements, * do not remove the package that would break other packages' requirements) * * - Remove referrers: Remove all packages that would break because * they depend on the package that is requested to be removed * * - Ignore: Inject artificial "provides" for a missing requirement * (pretend that requirement is satisfied) **/ const ProblemSolutionList & solutions() const; /** * Set description of the problem. **/ void setDescription( std::string description ); /** * Set detail description of the problem. **/ void setDetails( std::string details ); /** * Add a solution to this problem. This class takes over ownership of * the problem and will delete it when neccessary. **/ void addSolution( const ProblemSolution_Ptr& solution, bool inFront = false ); private: struct Impl; RWCOW_pointer _pimpl; }; /** \relates ResolverProblem Stream output */ std::ostream & operator<<( std::ostream &, const ResolverProblem & obj ) ZYPP_API; /** \relates ResolverProblem Stream output */ std::ostream & operator<<( std::ostream &, const ResolverProblemList & obj ) ZYPP_API; } // namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_RESOLVERPROBLEM_H libzypp-17.36.5/zypp/ServiceInfo.cc000066400000000000000000000202601476576476200171430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ServiceInfo.cc * */ #include #include #include #include #include #include #include using std::endl; using zypp::xml::escape; /////////////////////////////////////////////////////////////////////////////// namespace zypp {////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ServiceInfo::Impl // struct ServiceInfo::Impl { using ReposToEnable = ServiceInfo::ReposToEnable; using ReposToDisable = ServiceInfo::ReposToDisable; public: RepoVariablesReplacedUrl _url; repo::ServiceType _type; ReposToEnable _reposToEnable; ReposToDisable _reposToDisable; RepoStates _repoStates; DefaultIntegral _ttl; Date _lrf; public: Impl() {} Impl(const Url &url_r) : _url(url_r) {} Impl(const Impl &) = default; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() {} void setProbedType( const repo::ServiceType & type_r ) const { if ( _type == repo::ServiceType::NONE && type_r != repo::ServiceType::NONE ) { // lazy init! const_cast(this)->_type = type_r; } } private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ServiceInfo::Impl // /////////////////////////////////////////////////////////////////// const ServiceInfo ServiceInfo::noService; ServiceInfo::ServiceInfo() : _pimpl( new Impl() ) {} ServiceInfo::ServiceInfo(const std::string & alias) : repo::RepoInfoBase(alias), _pimpl( new Impl() ) {} ServiceInfo::ServiceInfo(const std::string & alias, const Url & url) : repo::RepoInfoBase(alias), _pimpl( new Impl(url) ) {} ServiceInfo::~ServiceInfo() {} Url ServiceInfo::url() const // Variables replaced { return _pimpl->_url.transformed(); } Url ServiceInfo::rawUrl() const // Raw { return _pimpl->_url.raw(); } void ServiceInfo::setUrl( const Url& url ) // Raw { _pimpl->_url.raw() = url; } repo::ServiceType ServiceInfo::type() const { return _pimpl->_type; } void ServiceInfo::setType( const repo::ServiceType & type ) { _pimpl->_type = type; } void ServiceInfo::setProbedType( const repo::ServiceType &t ) const { _pimpl->setProbedType( t ); } Date::Duration ServiceInfo::ttl() const { return _pimpl->_ttl; } void ServiceInfo::setTtl( Date::Duration ttl_r ) { _pimpl->_ttl = ttl_r; } void ServiceInfo::setProbedTtl( Date::Duration ttl_r ) const { const_cast(this)->setTtl( ttl_r ); } Date ServiceInfo::lrf() const { return _pimpl->_lrf; } void ServiceInfo::setLrf( Date lrf_r ) { _pimpl->_lrf = lrf_r; } bool ServiceInfo::reposToEnableEmpty() const { return _pimpl->_reposToEnable.empty(); } ServiceInfo::ReposToEnable::size_type ServiceInfo::reposToEnableSize() const { return _pimpl->_reposToEnable.size(); } ServiceInfo::ReposToEnable::const_iterator ServiceInfo::reposToEnableBegin() const { return _pimpl->_reposToEnable.begin(); } ServiceInfo::ReposToEnable::const_iterator ServiceInfo::reposToEnableEnd() const { return _pimpl->_reposToEnable.end(); } bool ServiceInfo::repoToEnableFind( const std::string & alias_r ) const { return( _pimpl->_reposToEnable.find( alias_r ) != _pimpl->_reposToEnable.end() ); } void ServiceInfo::addRepoToEnable( const std::string & alias_r ) { _pimpl->_reposToEnable.insert( alias_r ); _pimpl->_reposToDisable.erase( alias_r ); } void ServiceInfo::delRepoToEnable( const std::string & alias_r ) { _pimpl->_reposToEnable.erase( alias_r ); } void ServiceInfo::clearReposToEnable() { _pimpl->_reposToEnable.clear(); } bool ServiceInfo::reposToDisableEmpty() const { return _pimpl->_reposToDisable.empty(); } ServiceInfo::ReposToDisable::size_type ServiceInfo::reposToDisableSize() const { return _pimpl->_reposToDisable.size(); } ServiceInfo::ReposToDisable::const_iterator ServiceInfo::reposToDisableBegin() const { return _pimpl->_reposToDisable.begin(); } ServiceInfo::ReposToDisable::const_iterator ServiceInfo::reposToDisableEnd() const { return _pimpl->_reposToDisable.end(); } bool ServiceInfo::repoToDisableFind( const std::string & alias_r ) const { return( _pimpl->_reposToDisable.find( alias_r ) != _pimpl->_reposToDisable.end() ); } void ServiceInfo::addRepoToDisable( const std::string & alias_r ) { _pimpl->_reposToDisable.insert( alias_r ); _pimpl->_reposToEnable.erase( alias_r ); } void ServiceInfo::delRepoToDisable( const std::string & alias_r ) { _pimpl->_reposToDisable.erase( alias_r ); } void ServiceInfo::clearReposToDisable() { _pimpl->_reposToDisable.clear(); } const ServiceInfo::RepoStates & ServiceInfo::repoStates() const { return _pimpl->_repoStates; } void ServiceInfo::setRepoStates( RepoStates newStates_r ) { swap( _pimpl->_repoStates, newStates_r ); } std::ostream & operator<<( std::ostream & str, const ServiceInfo::RepoState & obj ) { return str << "enabled=" << obj.enabled << " " << "autorefresh=" << obj.autorefresh << " " << "priority=" << obj.priority; } std::ostream & ServiceInfo::dumpAsIniOn( std::ostream & str ) const { RepoInfoBase::dumpAsIniOn(str) << "url = " << hotfix1050625::asString( rawUrl() ) << endl << "type = " << type() << endl; if ( ttl() ) str << "ttl_sec = " << ttl() << endl; if ( lrf() ) str << "lrf_dat = " << lrf().asSeconds() << endl; if ( ! repoStates().empty() ) { unsigned cnt = 0U; for ( const auto & el : repoStates() ) { std::string tag( "repo_" ); tag += str::numstring( ++cnt ); const RepoState & state( el.second ); str << tag << "=" << el.first << endl << tag << "_enabled=" << state.enabled << endl << tag << "_autorefresh=" << state.autorefresh << endl; if ( state.priority != RepoInfo::defaultPriority() ) str << tag << "_priority=" << state.priority << endl; } } if ( ! reposToEnableEmpty() ) str << "repostoenable = " << str::joinEscaped( reposToEnableBegin(), reposToEnableEnd() ) << endl; if ( ! reposToDisableEmpty() ) str << "repostodisable = " << str::joinEscaped( reposToDisableBegin(), reposToDisableEnd() ) << endl; return str; } std::ostream & ServiceInfo::dumpAsXmlOn( std::ostream & str, const std::string & content ) const { str << "" << endl; else str << ">" << endl << content << "" << endl; return str; } std::ostream & operator<<( std::ostream& str, const ServiceInfo &obj ) { return obj.dumpAsIniOn(str); } /////////////////////////////////////////////////////////////////////////////// } //namespace zypp /////////////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ServiceInfo.h000066400000000000000000000175211476576476200170130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ServiceInfo.h * */ #ifndef ZYPP_SERVICE_H #define ZYPP_SERVICE_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class ServiceInfo /// \brief Service data /// /// \note Name and Url are subject to repo variable replacement /// (\see \ref RepoVariablesStringReplacer). /// class ZYPP_API ServiceInfo : public repo::RepoInfoBase { public: /** Default ctor creates \ref noService.*/ ServiceInfo(); /** * Creates ServiceInfo with specified alias. * * \param alias unique short name of service */ ServiceInfo( const std::string & alias ); /** * ServiceInfo with alias and its URL * * \param alias unique shortname of service * \param url url to service */ ServiceInfo( const std::string & alias, const Url& url ); ~ServiceInfo() override; public: /** Represents an empty service. */ static const ServiceInfo noService ZYPP_API; public: /** The service url */ Url url() const; /** The service raw url (no variables replaced) */ Url rawUrl() const; /** Set the service url (raw value) */ void setUrl( const Url& url ); /** Service type */ repo::ServiceType type() const; /** Set service type */ void setType( const repo::ServiceType & type ); /** Lazy init service type */ void setProbedType( const repo::ServiceType & t ) const; /** \name Housekeeping data * You don't want to use the setters unless you are a \ref RepoManager. */ //@{ /** Sugested TTL between two metadata auto-refreshs. * The value (in seconds) may be provided in repoindex.xml:xpath:/repoindex@ttl. * Default is \a 0 - perform each auto-refresh request. */ Date::Duration ttl() const; /** Set sugested TTL. */ void setTtl( Date::Duration ttl_r ); /** Lazy init sugested TTL. */ void setProbedTtl( Date::Duration ttl_r ) const; /** Date of last refresh (if known). */ Date lrf() const; /** Set date of last refresh. */ void setLrf( Date lrf_r ); //@} // /** \name Set of repos (repository aliases) to enable on next refresh. * * Per default new repositories are created in disabled state. But repositories * mentioned here will be created in enabled state on the next refresh. * Afterwards they get removed from the list. */ //@{ /** Container of repos. */ using ReposToEnable = std::set; bool reposToEnableEmpty() const; ReposToEnable::size_type reposToEnableSize() const; ReposToEnable::const_iterator reposToEnableBegin() const; ReposToEnable::const_iterator reposToEnableEnd() const; Iterable reposToEnable() const { return makeIterable( reposToEnableBegin(), reposToEnableEnd() ); } /** Whether \c alias_r is mentioned in ReposToEnable. */ bool repoToEnableFind( const std::string & alias_r ) const; /** Add \c alias_r to the set of ReposToEnable. */ void addRepoToEnable( const std::string & alias_r ); /** Remove \c alias_r from the set of ReposToEnable. */ void delRepoToEnable( const std::string & alias_r ); /** Clear the set of ReposToEnable. */ void clearReposToEnable(); //@} /** \name Set of repos (repository aliases) to disable on next refresh. * * Repositories mentioned here will be disabled on the next refresh, in case they * still exist. Afterwards they get removed from the list. */ //@{ /** Container of repos. */ using ReposToDisable = std::set; bool reposToDisableEmpty() const; ReposToDisable::size_type reposToDisableSize() const; ReposToDisable::const_iterator reposToDisableBegin() const; ReposToDisable::const_iterator reposToDisableEnd() const; Iterable reposToDisable() const { return makeIterable( reposToDisableBegin(), reposToDisableEnd() ); } /** Whether \c alias_r is mentioned in ReposToDisable. */ bool repoToDisableFind( const std::string & alias_r ) const; /** Add \c alias_r to the set of ReposToDisable. */ void addRepoToDisable( const std::string & alias_r ); /** Remove \c alias_r from the set of ReposToDisable. */ void delRepoToDisable( const std::string & alias_r ); /** Clear the set of ReposToDisable. */ void clearReposToDisable(); //@} /** \name The original repo state as defined by the repoindex.xml upon last refresh. * * This state is remembered to detect any user modifications applied to the repos. * It may not be available for all repos or in plugin services. In this case all * changes requested by a service refresh are applied unconditionally. */ //@{ struct RepoState { bool enabled; bool autorefresh; unsigned priority; RepoState() : enabled( false ), autorefresh( true ), priority( RepoInfo::defaultPriority() ) {} RepoState( const RepoInfo & repo_r ) : enabled( repo_r.enabled() ), autorefresh( repo_r.autorefresh() ), priority( repo_r.priority() ) {} bool operator==( const RepoState & rhs ) const { return( enabled==rhs.enabled && autorefresh==rhs.autorefresh && priority==rhs.priority ); } bool operator!=( const RepoState & rhs ) const { return ! operator==( rhs ); } friend std::ostream & operator<<( std::ostream & str, const RepoState & obj ); }; using RepoStates = std::map; /** Access the remembered repository states. */ const RepoStates & repoStates() const; /** Remember a new set of repository states. */ void setRepoStates( RepoStates newStates_r ); //@} public: /** * Writes ServiceInfo to stream in ".service" format * * \param str stream where serialized version service is written */ std::ostream & dumpAsIniOn( std::ostream & str ) const override; /** * Write an XML representation of this ServiceInfo object. * * \param str * \param content if not empty, produces content * otherwise */ std::ostream & dumpAsXmlOn( std::ostream & str, const std::string & content = "" ) const override; struct Impl; private: RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates ServiceInfo */ using ServiceInfo_Ptr = shared_ptr; /** \relates ServiceInfo */ using ServiceInfo_constPtr = shared_ptr; /** \relates ServiceInfo */ using ServiceInfoList = std::list; /** \relates ServiceInfo Stream output */ std::ostream & operator<<( std::ostream & str, const ServiceInfo & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_REPOSITORY_H libzypp-17.36.5/zypp/Signature.cc000066400000000000000000000020731476576476200166720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// Signature::Signature() { } std::ostream & Signature::dumpOn( std::ostream & str ) const { return str; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Signature.h000066400000000000000000000024461476576476200165400ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_Signature_H #define ZYPP_Signature_H /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class Signature { public: Signature(); ~Signature(); /** Overload to realize stream output. */ std::ostream & dumpOn( std::ostream & str ) const; private: }; /** \relates Signature Stream output */ inline std::ostream & operator<<( std::ostream & str, const Signature & obj ) { return obj.dumpOn( str ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_Signature_H libzypp-17.36.5/zypp/SrcPackage.cc000066400000000000000000000042611476576476200167350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/SrcPackage.cc * */ #include /////////////////////////////////////////////////////////////////// namespace zyppintern { using namespace zypp; // in Package.cc Pathname cachedLocation( const OnMediaLocation & loc_r, const RepoInfo & repo_r ); } // namespace zyppintern /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SrcPackage); /////////////////////////////////////////////////////////////////// // // METHOD NAME : SrcPackage::SrcPackage // METHOD TYPE : Ctor // SrcPackage::SrcPackage( const sat::Solvable & solvable_r ) : ResObject( solvable_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : SrcPackage::~SrcPackage // METHOD TYPE : Dtor // SrcPackage::~SrcPackage() {} /////////////////////////////////////////////////////////////////// // // SrcPackage interface forwarded to implementation // /////////////////////////////////////////////////////////////////// std::string SrcPackage::sourcePkgType() const { return lookupStrAttribute( sat::SolvAttr::arch ); } OnMediaLocation SrcPackage::location() const { return lookupLocation(); } Pathname SrcPackage::cachedLocation() const { return zyppintern::cachedLocation( location(), repoInfo() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/SrcPackage.h000066400000000000000000000040661476576476200166020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/SrcPackage.h * */ #ifndef ZYPP_SRCPACKAGE_H #define ZYPP_SRCPACKAGE_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(SrcPackage); /////////////////////////////////////////////////////////////////// // // CLASS NAME : SrcPackage // /** SrcPackage interface. */ class ZYPP_API SrcPackage : public ResObject { public: using Self = SrcPackage; using TraitsType = ResTraits; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: /** The type of the source rpm ("src" or "nosrc"). */ std::string sourcePkgType() const; /** location of resolvable in repo */ OnMediaLocation location() const; /** Location of the downloaded package in cache or an empty path. */ Pathname cachedLocation() const; /** Whether the package is cached. */ bool isCached() const { return ! cachedLocation().empty(); } protected: friend Ptr make( const sat::Solvable & solvable_r ); /** Ctor */ SrcPackage( const sat::Solvable & solvable_r ); /** Dtor */ ~SrcPackage() override; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SRCPACKAGE_H libzypp-17.36.5/zypp/SysContent.cc000066400000000000000000000325421476576476200170460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/SysContent.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace syscontent { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace // Writer helpers { ///////////////////////////////////////////////////////////////// /** writeXml helper. * \return tag="value" if value not empty, else * an empty string. */ inline std::string attrIf( const std::string & tag_r, const std::string & value_r ) { std::string ret; if ( ! value_r.empty() ) { ret += " "; ret += tag_r; ret += "=\""; ret += value_r; ret += "\""; } return ret; } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Writer::Impl // /** \see Writer */ class Writer::Impl { public: std::ostream & writeXml( std::ostream & str ) const; public: std::string _name; Edition _edition; std::string _description; StorageT _onsys; public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : Writer::Impl::writeXml // METHOD TYPE : std::ostream & // std::ostream & Writer::Impl::writeXml( std::ostream & str ) const { // intro str << "\n"; str << "\n"; // ident data str << " \n"; str << " " << _name << "\n"; str << " \n"; str << " " << _description << "\n"; str << " " << Date::now().asSeconds() << "\n"; str << " \n"; // ResObjects str << " \n"; for ( iterator it = _onsys.begin(); it != _onsys.end(); ++it ) { str << " kind().asString() ) << attrIf( "name", (*it)->name() ) << attrIf( "epoch", str::numstring((*it)->edition().epoch()) ) << attrIf( "ver", (*it)->edition().version() ) << attrIf( "rel", (*it)->edition().release() ) << attrIf( "arch", (*it)->arch().asString() ) << "/>\n"; } str << " \n"; // extro str << "" << endl; return str; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : Writer // /////////////////////////////////////////////////////////////////// Writer::Writer() : _pimpl( Impl::nullimpl() ) {} const std::string & Writer::name() const { return _pimpl->_name; } Writer & Writer::name( const std::string & val_r ) { _pimpl->_name = val_r; return *this; } const Edition & Writer::edition() const { return _pimpl->_edition; } Writer & Writer::edition( const Edition & val_r ) { _pimpl->_edition = val_r; return *this; } const std::string & Writer::description() const { return _pimpl->_description; } Writer & Writer::description( const std::string & val_r ) { _pimpl->_description = val_r; return *this; } void Writer::addInstalled( const PoolItem & obj_r ) { if ( obj_r.status().isInstalled() ) { _pimpl->_onsys.insert( obj_r.resolvable() ); } } void Writer::addIf( const PoolItem & obj_r ) { if ( obj_r.status().isInstalled() != obj_r.status().transacts() && ! ( obj_r.status().transacts() && obj_r.status().isBySolver() ) ) { _pimpl->_onsys.insert( obj_r.resolvable() ); } } void Writer::add( const ResObject::constPtr & obj_r ) { _pimpl->_onsys.insert( obj_r ); } bool Writer::empty() const { return _pimpl->_onsys.empty(); } Writer::size_type Writer::size() const { return _pimpl->_onsys.size(); } Writer::const_iterator Writer::begin() const { return _pimpl->_onsys.begin(); } Writer::const_iterator Writer::end() const { return _pimpl->_onsys.end(); } std::ostream & Writer::writeXml( std::ostream & str ) const { return _pimpl->writeXml( str ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Reader::Entry::Impl // class Reader::Entry::Impl { public: std::string _kind; std::string _name; Edition _edition; Arch _arch; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Reader::Entry // /////////////////////////////////////////////////////////////////// Reader::Entry::Entry() : _pimpl( new Impl ) {} Reader::Entry::Entry( const shared_ptr & pimpl_r ) : _pimpl( pimpl_r ) {} const std::string & Reader::Entry::kind() const { return _pimpl->_kind; } const std::string & Reader::Entry::name() const { return _pimpl->_name; } const Edition & Reader::Entry::edition() const { return _pimpl->_edition; } const Arch & Reader::Entry::arch() const { return _pimpl->_arch; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Reader::Impl // /** \see Reader */ class Reader::Impl { public: Impl() {} Impl( std::istream & input_r ); public: std::string _name; Edition _edition; std::string _description; Date _created; std::list _content; public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace // Reader helpers { ///////////////////////////////////////////////////////////////// using namespace xml; /** Sycontent xml node structure. */ struct SycontentNode : public ParseDef { SycontentNode( Mode mode_r ) : ParseDef( "syscontent", mode_r ) { (*this)("ident", OPTIONAL) ("onsys", OPTIONAL) ; (*this)["ident"] ("name", OPTIONAL) ("version", OPTIONAL) ("description", OPTIONAL) ("created", OPTIONAL) ; (*this)["onsys"] ("entry", MULTIPLE_OPTIONAL) ; } }; /** Parse Edition from ver/rel/eopch attributes. */ struct ConsumeEdition : public ParseDefConsume { ConsumeEdition( Edition & value_r ) : _value( & value_r ) {} void start( const Node & node_r ) override { *_value = Edition( node_r.getAttribute("ver").asString(), node_r.getAttribute("rel").asString(), node_r.getAttribute("epoch").asString() ); } Edition *_value; }; /** Parse std::string from node value. */ struct ConsumeString : public ParseDefConsume { ConsumeString( std::string & value_r ) : _value( & value_r ) {} void text( const Node & node_r ) override { *_value = node_r.value().asString(); } std::string *_value; }; /** Parse Date from node value. */ struct ConsumeDate : public ParseDefConsume { ConsumeDate( Date & value_r ) : _value( & value_r ) {} void text( const Node & node_r ) override { *_value = Date(node_r.value().asString()); } Date *_value; }; /** Parse entry list. */ struct ConsumeEntries : public ParseDefConsume { ConsumeEntries( std::list & value_r ) : _value( & value_r ) {} void start( const Node & node_r ) override { shared_ptr centry( new Reader::Entry::Impl ); centry->_kind = node_r.getAttribute("kind").asString(); centry->_name = node_r.getAttribute("name").asString(); centry->_edition = Edition( node_r.getAttribute("ver").asString(), node_r.getAttribute("rel").asString(), node_r.getAttribute("epoch").asString() ); centry->_arch = Arch( node_r.getAttribute("arch").asString() ); _value->push_back( Reader::Entry( centry ) ); } std::list *_value; }; ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::Impl::Impl // METHOD TYPE : Constructor // Reader::Impl::Impl( std::istream & input_r ) { xml::Reader reader( input_r ); SycontentNode rootNode( xml::ParseDef::MANDTAORY ); rootNode["ident"]["name"].setConsumer ( new ConsumeString( _name ) ); rootNode["ident"]["version"].setConsumer ( new ConsumeEdition( _edition ) ); rootNode["ident"]["description"].setConsumer ( new ConsumeString( _description ) ); rootNode["ident"]["created"].setConsumer ( new ConsumeDate( _created ) ); rootNode["onsys"]["entry"].setConsumer ( new ConsumeEntries( _content ) ); // parse rootNode.take( reader ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Reader // /////////////////////////////////////////////////////////////////// Reader::Reader() : _pimpl( Impl::nullimpl() ) {} Reader::Reader( std::istream & input_r ) : _pimpl( new Impl( input_r ) ) {} const std::string & Reader::name() const { return _pimpl->_name; } const Edition & Reader::edition() const { return _pimpl->_edition; } const std::string & Reader::description() const { return _pimpl->_description; } const Date & Reader::ctime() const { return _pimpl->_created; } bool Reader::empty() const { return _pimpl->_content.empty(); } Reader::size_type Reader::size() const { return _pimpl->_content.size(); } Reader::const_iterator Reader::begin() const { return _pimpl->_content.begin(); } Reader::const_iterator Reader::end() const { return _pimpl->_content.end(); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : inline std::ostream & */ std::ostream & operator<<( std::ostream & str, const Reader & obj ) { return str << "syscontent(" << obj.name() << "-" << obj.edition() << ", " << obj.size() << " entries" << ", created " << obj.ctime() << ")"; } ///////////////////////////////////////////////////////////////// } // namespace syscontent /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/SysContent.h000066400000000000000000000171711476576476200167110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/SysContent.h * */ #ifndef ZYPP_SYSCONTENT_H #define ZYPP_SYSCONTENT_H #include #include #include #include #include #include #include #ifdef YUILogComponent // Work around https://github.com/libyui/libyui/issues/78 // The hack here is needed to allow older libyui-qt-pkg building // against current libzypp. Otherwise libyui builds for Code15.4 // or older will break. #define BOOST_BIND_GLOBAL_PLACEHOLDERS #include #endif /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace syscontent { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Writer // /** Collect and serialize a set of \ref ResObject. * \code * * * * mycollection * * All the cool stuff... * 1165270942 * * * * * * * \endcode * \see Reader */ class ZYPP_API Writer { using StorageT = std::set; public: using value_type = StorageT::value_type; using size_type = StorageT::size_type; using iterator = StorageT::iterator; using const_iterator = StorageT::const_iterator; public: /** Default Ctor. */ Writer(); public: /** \name Identification. * User provided optional data to identify the collection. */ //@{ /** Get name. */ const std::string & name() const; /** Set name. */ Writer & name( const std::string & val_r ); /** Get edition. */ const Edition & edition() const; /** Set edition. */ Writer & edition( const Edition & val_r ); /** Get description. */ const std::string & description() const; /** Set description.*/ Writer & description( const std::string & val_r ); //@} public: /** \name Collecting data. * \code * syscontent::Writer contentW; * contentW.name( "mycollection" ) * .edition( Edition( "1.0" ) ) * .description( "All the cool stuff..." ); * * ResPool pool( getZYpp()->pool() ); * for_each( pool.begin(), pool.end(), * bind( &syscontent::Writer::addIf, ref(contentW), _1 ) ); * * std::ofstream my_file( "some_file" ); * my_file << contentW; * my_file.close(); * \endcode */ //@{ /** Collect currently installed \ref PoolItem. */ void addInstalled( const PoolItem & obj_r ); /** Collect \ref PoolItem if it stays on the system. * I.e. it stays installed or is tagged to be installed. * Solver selected items are omitted. */ void addIf( const PoolItem & obj_r ); /** Unconditionally add this \ref ResObject (or \ref PoolItem). */ void add( const ResObject::constPtr & obj_r ); //@} public: /** \name Collected data. */ //@{ /** Whether no data collected so far. */ bool empty() const; /** Number of items collected. */ size_type size() const; /** Iterator to the begin of collected data. */ const_iterator begin() const; /** Iterator to the end of collected data. */ const_iterator end() const; //@} public: /** Write collected data as XML. * Read them back using \ref Reader. */ std::ostream & writeXml( std::ostream & str ) const; private: class Impl; RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates Writer Stream output */ inline std::ostream & operator<<( std::ostream & str, const Writer & obj ) { return obj.writeXml( str ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Reader // /** Retrieve \ref ResObject data serialized by \ref Writer. * \see Writer */ class ZYPP_API Reader { public: /** Restored \ref ResObject data. */ class Entry; private: using StorageT = std::list; public: using value_type = StorageT::value_type; using size_type = StorageT::size_type; using iterator = StorageT::iterator; using const_iterator = StorageT::const_iterator; public: /** Default Ctor. */ Reader(); /** Ctor parsing data from \a input_r. * \throws Exception on read or parse error. */ Reader( std::istream & input_r ); public: /** \name Identification. * User provided optional data to identify the collection. */ //@{ /** Get name. */ const std::string & name() const; /** Get edition. */ const Edition & edition() const; /** Get description. */ const std::string & description() const; /** Get creation date. */ const Date & ctime() const; public: /** \name Collected data. */ //@{ /** Whether no data collected so far. */ bool empty() const; /** Number of items collected. */ size_type size() const; /** Iterator to the begin of collected data. */ const_iterator begin() const; /** Iterator to the end of collected data. */ const_iterator end() const; //@} private: class Impl; RWCOW_pointer _pimpl; }; /** \relates Reader Stream output */ std::ostream & operator<<( std::ostream & str, const Reader & obj ); /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Reader::Entry // /** Restored \ref ResObject data. */ class ZYPP_API Reader::Entry { public: Entry(); const std::string & kind() const; const std::string & name() const; const Edition & edition() const; const Arch & arch() const; public: class Impl; Entry( const shared_ptr & pimpl_r ); private: RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace syscontent /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SYSCONTENT_H libzypp-17.36.5/zypp/Target.cc000066400000000000000000000114531476576476200161610ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Target.cc * */ #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(Target); /////////////////////////////////////////////////////////////////// // // METHOD NAME : Target::Target // METHOD TYPE : Ctor // Target::Target( const Pathname & root, bool doRebuild_r ) : _pimpl( new Impl(root,doRebuild_r) ) { } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Target::Target // METHOD TYPE : Ctor // Target::Target( const Impl_Ptr & impl_r ) : _pimpl( impl_r ) { assert( impl_r ); } std::ostream & operator<<( std::ostream & str, const Target::DistributionLabel & obj ) { str << "summary=" << obj.summary << endl; str << "shortName=" << obj.shortName << endl; return str; } /////////////////////////////////////////////////////////////////// // // Forward to TargetImpl: // /////////////////////////////////////////////////////////////////// void Target::buildCache() { _pimpl->buildCache(); } void Target::cleanCache() { _pimpl->clearCache(); } void Target::load() { _pimpl->load(); } void Target::reload() { _pimpl->reload(); } void Target::unload() { _pimpl->unload(); } target::rpm::RpmDb & Target::rpmDb() { return _pimpl->rpm(); } Pathname Target::root() const { return _pimpl->root(); } bool Target::providesFile (const std::string & name_str, const std::string & path_str) const { return _pimpl->providesFile (name_str, path_str); } std::string Target::whoOwnsFile (const std::string & path_str) const { return _pimpl->whoOwnsFile (path_str); } std::ostream & Target::dumpOn( std::ostream & str ) const { return _pimpl->dumpOn( str ); } Product::constPtr Target::baseProduct() const { return _pimpl->baseProduct(); } LocaleSet Target::requestedLocales() const { return _pimpl->requestedLocales(); } LocaleSet Target::requestedLocales( const Pathname & root_r ) { return target::TargetImpl::requestedLocales( root_r ); } void Target::updateAutoInstalled() { return _pimpl->updateAutoInstalled(); } std::string Target::targetDistribution() const { return _pimpl->targetDistribution(); } std::string Target::targetDistribution( const Pathname & root_r ) { return target::TargetImpl::targetDistribution( root_r ); } std::string Target::targetDistributionRelease() const { return _pimpl->targetDistributionRelease(); } std::string Target::targetDistributionRelease( const Pathname & root_r ) { return target::TargetImpl::targetDistributionRelease( root_r ); } std::string Target::targetDistributionFlavor() const { return _pimpl->targetDistributionFlavor(); } std::string Target::targetDistributionFlavor( const Pathname & root_r ) { return target::TargetImpl::targetDistributionFlavor( root_r ); } Target::DistributionLabel Target::distributionLabel() const { return _pimpl->distributionLabel(); } Target::DistributionLabel Target::distributionLabel( const Pathname & root_r ) { return target::TargetImpl::distributionLabel( root_r ); } std::string Target::distributionVersion() const { return _pimpl->distributionVersion(); } std::string Target::distributionVersion( const Pathname & root_r ) { return target::TargetImpl::distributionVersion( root_r ); } std::string Target::distributionFlavor() const { return _pimpl->distributionFlavor(); } std::string Target::distributionFlavor( const Pathname & root_r ) { return target::TargetImpl::distributionFlavor( root_r ); } std::string Target::anonymousUniqueId() const { return _pimpl->anonymousUniqueId(); } std::string Target::anonymousUniqueId( const Pathname & root_r ) { return target::TargetImpl::anonymousUniqueId( root_r ); } const VendorAttr & Target::vendorAttr() const { return _pimpl->vendorAttr(); } void Target::vendorAttr( VendorAttr vendorAttr_r ) { _pimpl->vendorAttr( std::move(vendorAttr_r) ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Target.h000066400000000000000000000205451476576476200160250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Target.h * */ #ifndef ZYPP_TARGET_H #define ZYPP_TARGET_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class VendorAttr; namespace target { class TargetImpl; namespace rpm { class RpmDb; } } namespace zypp_detail { class ZYppImpl; } DEFINE_PTR_TYPE(Target); /////////////////////////////////////////////////////////////////// // // CLASS NAME : Target // /** */ class ZYPP_API Target : public base::ReferenceCounted, public base::NonCopyable { public: using Impl = target::TargetImpl; using Impl_Ptr = intrusive_ptr; using PoolItemList = std::list; public: /** * builds or refreshes the target cache */ void buildCache(); /** * cleans the target cache (.solv files) */ void cleanCache(); /** * load resolvables into the pool */ void load(); void reload(); /** * unload target resolvables from the * pool */ void unload(); /** Refference to the RPM database */ target::rpm::RpmDb & rpmDb(); /** If the package is installed and provides the file Needed to evaluate split provides during Resolver::Upgrade() */ bool providesFile (const std::string & name_str, const std::string & path_str) const; /** Return name of package owning \a path_str * or empty string if no installed package owns \a path_str. **/ std::string whoOwnsFile (const std::string & path_str) const; /** Return the root set for this target */ Pathname root() const; /** Whether the targets \ref root is not \c "/". */ bool chrooted() const { return( ! root().emptyOrRoot() ); } /** Return the path prefixed by the target root, unless it already is prefixed. */ Pathname assertRootPrefix( const Pathname & path_r ) const { return Pathname::assertprefix( root(), path_r ); } /** * returns the target base installed product, also known as * the distribution or platform. * * returns 0 if there is no base installed product in the * pool. * * \note this method requires the target to be loaded, * otherwise it will return 0 as no product is found. * * if you require some base product attributes when the * target is not loaded into the pool, see * \ref targetDistribution , \ref targetDistributionRelease * and \ref distributionVersion that obtain the data * on demand from the installed product information. */ Product::constPtr baseProduct() const; /** * \brief Languages to be supported by the system. * E.g. language specific packages to be installed. */ LocaleSet requestedLocales() const; /** \overload Use a specific root_r, if empty the default targets root, or '/' */ static LocaleSet requestedLocales( const Pathname & root_r ); /** Update the database of autoinstalled packages. * This is done on commit, so you usually don't need to call this explicitly. */ void updateAutoInstalled(); public: /** \name Base product and registration. * * Static methods herein allow one to retrieve the values without explicitly * initializing the \ref Target. They take a targets root directory as * argument. If an empty \ref Pathname is passed, an already existing * Targets root is used, otherwise \c "/" is assumed. */ //@{ /** This is \c register.target attribute of the installed base product. * Used for registration and \ref Service refresh. */ std::string targetDistribution() const; /** \overload */ static std::string targetDistribution( const Pathname & root_r ); /** This is \c register.release attribute of the installed base product. * Used for registration. */ std::string targetDistributionRelease() const; /** \overload */ static std::string targetDistributionRelease( const Pathname & root_r ); /** This is \c register.flavor attribute of the installed base product. * Used for registration. * \note don't mistake this for \ref distributionFlavor */ std::string targetDistributionFlavor() const; /** \overload */ static std::string targetDistributionFlavor( const Pathname & root_r ); struct DistributionLabel { std::string shortName; std::string summary; }; /** This is \c shortName and \c summary attribute of the installed base product. * Used e.g. for the bootloader menu. */ DistributionLabel distributionLabel() const; /** \overload */ static DistributionLabel distributionLabel( const Pathname & root_r ); /** This is \c version attribute of the installed base product. * For example http://download.opensue.org/update/11.0 * The 11.0 corresponds to the base product version. */ std::string distributionVersion() const; /** \overload */ static std::string distributionVersion( const Pathname & root_r ); /** * This is \c flavor attribute of the installed base product * but does not require the target to be loaded as it remembers * the last used one. It can be empty is the target has never * been loaded, as the value is not present in the system * but computer from a package provides * \note don't mistake this for \ref targetDistributionFlavor */ std::string distributionFlavor() const; /** \overload */ static std::string distributionFlavor( const Pathname & root_r ); /** * anonymous unique id * * This id is generated once and stays in the * saved in the target. * It is unique and is used only for statistics. * */ std::string anonymousUniqueId() const; /** \overload */ static std::string anonymousUniqueId( const Pathname & root_r ); //@} public: /** \name Definition of vendor equivalence. * \see \ref VendorAttr */ //@{ /** The targets current vendor equivalence settings. * Initialized from the targets /etc/zypp/vendors.d. */ const VendorAttr & vendorAttr() const; /** Assign new vendor equivalence settings to the target. */ void vendorAttr( VendorAttr vendorAttr_r ); //@} public: /** Ctor. If \c doRebuild_r is \c true, an already existing * database is rebuilt (rpm --rebuilddb ). * \internal */ explicit Target( const Pathname & root = "/", bool doRebuild_r = false ) ZYPP_LOCAL; /** * Ctor * \internal */ explicit Target( const Impl_Ptr & impl_r ) ZYPP_LOCAL; private: friend std::ostream & operator<<( std::ostream & str, const Target & obj ); /** Stream output. */ std::ostream & dumpOn( std::ostream & str ) const override; private: /** Direct access to Impl. */ friend class zypp_detail::ZYppImpl; /** Pointer to implementation */ RW_pointer > _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates Target Stream output. */ inline std::ostream & operator<<( std::ostream & str, const Target & obj ) { return obj.dumpOn( str ); } /** \relates Target::DistributionLabel Stream output. * Write out the content as key/value pairs: * \code * summary=Beautiful Name * shortName=BN * \endcode */ std::ostream & operator<<( std::ostream & str, const Target::DistributionLabel & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_H libzypp-17.36.5/zypp/TmpPath.cc000066400000000000000000000011501476576476200163010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/TmpPath.cc * */ libzypp-17.36.5/zypp/TmpPath.h000066400000000000000000000012111476576476200161410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/TmpPath.h * */ #include libzypp-17.36.5/zypp/TriBool.h000066400000000000000000000000371476576476200161430ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Url.h000066400000000000000000000000331476576476200153270ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/UserData.h000066400000000000000000000000401476576476200162730ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Vendor.h000066400000000000000000000021061476576476200160250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Vendor.h * */ #ifndef ZYPP_VENDOR_H #define ZYPP_VENDOR_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// using Vendor = std::string; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #include "VendorAttr.h" #endif // ZYPP_VENDOR_H libzypp-17.36.5/zypp/VendorAttr.cc000066400000000000000000000272151476576476200170260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/VendorAttr.cc */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::VendorAttr" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class VendorAttr::Impl /// \brief VendorAttr implementation. /////////////////////////////////////////////////////////////////// class VendorAttr::Impl // : private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const Impl & obj ); public: /** Ctor. * bsc#1030686: The legacy default equivalence of 'suse' and 'opensuse' * has been removed. * bnc#812608: No prefix compare in opensuse namespace, so just create * a class for 'suse*' */ Impl() { _vendorGroupMap["suse"] = ++_vendorGroupId; } public: /** Add a new equivalent vendor set. */ void addVendorList( VendorList && vendorList_r ); /** Return whether two vendor strings should be treated as equivalent.*/ bool equivalent( IdString lVendor, IdString rVendor ) const { return lVendor == rVendor || vendorMatchId( lVendor ) == vendorMatchId( rVendor ); } /** Return whether two vendor strings should be treated as equivalent or are (suse/opensuse).*/ bool relaxedEquivalent( IdString lVendor, IdString rVendor ) const { if ( equivalent( lVendor, rVendor ) ) return true; static const IdString suse { "suse" }; static const IdString opensuse { "opensuse" }; unsigned sid = vendorMatchId( suse ); unsigned oid = vendorMatchId( opensuse ); if ( sid == oid ) return false; // (suse/opensuse) are equivalent, so these are not auto isSuse = [sid,oid]( unsigned v )-> bool { return v==sid || v==oid; }; return isSuse( vendorMatchId(lVendor) ) && isSuse( vendorMatchId(rVendor) ); } unsigned foreachVendorList( const std::function& fnc_r ) const { std::map lists; for( const auto & el : _vendorGroupMap ) lists[el.second].push_back( el.first ); unsigned ret = 0; for ( auto& el : lists ) { VendorList & vlist { el.second }; if ( vlist.empty() ) continue; ++ret; if ( fnc_r && !fnc_r( std::move(vlist) ) ) break; } return ret; } private: using VendorGroupMap = std::map; VendorGroupMap _vendorGroupMap; ///< Vendor group definition. Equivalent groups share the same ID. unsigned _vendorGroupId = 0; ///< Highest group ID in use (incremented). private: using VendorMatchEntry = DefaultIntegral; using VendorMatch = std::unordered_map; mutable VendorMatch _vendorMatch; ///< Cache mapping vendor strings to equivalence class ID mutable unsigned _nextId = 0; ///< Least equivalence class ID in use (decremented). /** Reset vendor match cache if _vendorGroupMap was changed. */ void vendorMatchIdReset() { _nextId = 0; _vendorMatch.clear(); } /** Helper mapping a vendor string to its eqivalence class ID. * * \li Return the vendor strings eqivalence class ID stored in _vendorMatch. * \li If not found, assign and return the eqivalence class ID of the lowercased string. * \li If not found, assign and return a new ID (look into the predefined VendorGroupMap (id>0), * otherwise create a new ID (<0)). */ unsigned vendorMatchId( IdString vendor ) const; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; unsigned VendorAttr::Impl::vendorMatchId( IdString vendor ) const { VendorMatchEntry & ent { _vendorMatch[vendor] }; if ( ! ent ) { IdString lcvendor { str::toLower( vendor.asString() ) }; VendorMatchEntry & lcent( _vendorMatch[lcvendor] ); if ( ! lcent ) { // Cache miss - check whether it belongs to a vendor group. // Otherwise assign a new class ID to it. unsigned myid = 0; // bnc#812608: no prefix compare in opensuse namespace if ( str::hasPrefix( lcvendor.c_str(), "opensuse" ) ) { if ( auto it = _vendorGroupMap.find( lcvendor.c_str() ); it != _vendorGroupMap.end() ) myid = it->second; } else { // Compare this entry with the global vendor map. // Reversed to get the longest prefix. for ( VendorGroupMap::const_reverse_iterator it = _vendorGroupMap.rbegin(); it != _vendorGroupMap.rend(); ++it ) { if ( str::hasPrefix( lcvendor.c_str(), it->first ) ) { myid = it->second; break; // found } } } if ( ! myid ) myid = --_nextId; // get a new class ID ent = lcent = myid; // remember the new DI } else ent = lcent; // take the ID from the lowercased vendor string } return ent; } void VendorAttr::Impl::addVendorList( VendorList && vendorList_r ) { // Will add a new equivalence group unless we merge with existing groups. unsigned targetId = _vendorGroupId + 1; // (!) Convert the group strings in place to lowercase before adding/checking. // Extend/join already existing groups if they are referenced. for ( std::string & vendor : vendorList_r ) { vendor = str::toLower( std::move(vendor) ); if ( _vendorGroupMap.count( vendor ) ) { unsigned joinId = _vendorGroupMap[vendor]; if ( targetId == _vendorGroupId + 1 ) { targetId = joinId; // will extend the existing group } else if ( targetId != joinId ) { // yet another existing group -> join it into the target group for ( auto & el : _vendorGroupMap ) { if ( el.second == joinId ) el.second = targetId; } } vendor.clear(); // no need to add it later } } // Now add the new entries for ( std::string & vendor : vendorList_r ) { if ( ! vendor.empty() ) _vendorGroupMap[vendor] = targetId; } if ( targetId == _vendorGroupId + 1 ) ++_vendorGroupId; // invalidate any match cache vendorMatchIdReset(); } /** \relates VendorAttr::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const VendorAttr::Impl & obj ) { str << "Equivalent vendors:"; for( const auto & p : obj._vendorGroupMap ) { str << endl << " [" << p.second << "] " << p.first; } return str; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : VendorAttr // /////////////////////////////////////////////////////////////////// const VendorAttr & VendorAttr::instance() { Target_Ptr trg { getZYpp()->getTarget() }; return trg ? trg->vendorAttr() : noTargetInstance(); } VendorAttr & VendorAttr::noTargetInstance() { static VendorAttr _val { ZConfig::instance().vendorPath() }; return _val; } VendorAttr::VendorAttr() : _pimpl( new Impl ) { MIL << "Initial: " << *this << endl; } VendorAttr::VendorAttr( const Pathname & initial_r ) : _pimpl( new Impl ) { addVendorDirectory( initial_r ); MIL << "Initial " << initial_r << ": " << *this << endl; } VendorAttr::~VendorAttr() {} bool VendorAttr::addVendorDirectory( const Pathname & dirname_r ) { if ( PathInfo pi { dirname_r }; ! pi.isDir() ) { MIL << "Not a directory " << pi << endl; return false; } filesystem::dirForEach( dirname_r, filesystem::matchNoDots(), [this]( const Pathname & dir_r, const std::string & str_r )->bool { this->addVendorFile( dir_r/str_r ); return true; } ); return true; } bool VendorAttr::addVendorFile( const Pathname & filename_r ) { if ( PathInfo pi { filename_r }; ! pi.isFile() ) { MIL << "Not a file " << pi << endl; return false; } parser::IniDict dict { InputStream(filename_r) }; for ( const auto & el : dict.entries("main") ) { if ( el.first == "vendors" ) { VendorList tmp; strv::split( el.second, ",", strv::Trim::trim, [&tmp]( std::string_view word ) { if ( ! word.empty() ) tmp.push_back( std::string(word) ); } ); _addVendorList( std::move(tmp) ); break; } } return true; } void VendorAttr::_addVendorList( VendorList && vendorList_r ) { _pimpl->addVendorList( std::move(vendorList_r) ); } unsigned VendorAttr::foreachVendorList( std::function fnc_r ) const { return _pimpl->foreachVendorList( std::move(fnc_r) ); } ////////////////////////////////////////////////////////////////// // vendor equivalence: ////////////////////////////////////////////////////////////////// bool VendorAttr::equivalent( IdString lVendor, IdString rVendor ) const { return _pimpl->equivalent( lVendor, rVendor );} bool VendorAttr::equivalent( const Vendor & lVendor, const Vendor & rVendor ) const { return _pimpl->equivalent( IdString( lVendor ), IdString( rVendor ) ); } bool VendorAttr::equivalent( sat::Solvable lVendor, sat::Solvable rVendor ) const { return _pimpl->equivalent( lVendor.vendor(), rVendor.vendor() ); } bool VendorAttr::equivalent( const PoolItem & lVendor, const PoolItem & rVendor ) const { return _pimpl->equivalent( lVendor.satSolvable().vendor(), rVendor.satSolvable().vendor() ); } bool VendorAttr::relaxedEquivalent( IdString lVendor, IdString rVendor ) const { return _pimpl->relaxedEquivalent( lVendor, rVendor );} bool VendorAttr::relaxedEquivalent( const Vendor & lVendor, const Vendor & rVendor ) const { return _pimpl->relaxedEquivalent( IdString( lVendor ), IdString( rVendor ) ); } bool VendorAttr::relaxedEquivalent( sat::Solvable lVendor, sat::Solvable rVendor ) const { return _pimpl->relaxedEquivalent( lVendor.vendor(), rVendor.vendor() ); } bool VendorAttr::relaxedEquivalent( const PoolItem & lVendor, const PoolItem & rVendor ) const { return _pimpl->relaxedEquivalent( lVendor.satSolvable().vendor(), rVendor.satSolvable().vendor() ); } ////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const VendorAttr & obj ) { return str << *obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/VendorAttr.h000066400000000000000000000141761476576476200166720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/VendorAttr.h */ #ifndef ZYPP_VENDORATTR_H #define ZYPP_VENDORATTR_H #include #include #include #include #include #include #include #include // LEGACY macros /////////////////////////////////////////////////////////////////// namespace zypp { ////////////////////////////////////////////////////////////////// class PoolItem; namespace sat { class Solvable; } /** Definition of vendor equivalence. * * Packages with equivalent vendor strings may replace themselves without * creating a solver error. * * Per default vendor strings starting with \c "suse" are treated as * being equivalent. This may be tuned by providing customized * vendor description files in \c /etc/zypp/vendors.d. * * \code * [main] * vendors = MyVendor,AlternateName * \endcode * * By this vendor strings starting with "MyVendor" or "AlternateName" * are considered to be equivalent. Packages from equivalent vendors * may replace each other without being considered as a 'vendor change'. * * \note bnc#812608: Within the "opensuse*" namespace exact matches * (case insensitive) are required. "vendors = suse,opensuse" will * allow switching between "suse*" and "opensuse", but not e.g. * "opensuse build service". * * \see \ref pg_zypp-solv-vendorchange */ class ZYPP_API VendorAttr { friend std::ostream & operator<<( std::ostream & str, const VendorAttr & obj ); public: /** (Pseudo)Singleton, mapped to the current \ref Target::vendorAttr settings or to \ref noTargetInstance. */ static const VendorAttr & instance(); /** Singleton, settings used if no \ref Target is active. * The instance is initialized with the settings found in the system below /. * The active Targets settings can be changed via \ref Target::vendorAttr. */ static VendorAttr & noTargetInstance(); public: /** Ctor providing the default set. */ VendorAttr(); /** Ctor reading the \a initial_r definitions from a dir or file. */ VendorAttr( const Pathname & initial_r ); /** Dtor */ ~VendorAttr(); VendorAttr(const VendorAttr &) = default; VendorAttr(VendorAttr &&) noexcept = default; VendorAttr &operator=(const VendorAttr &) = default; VendorAttr &operator=(VendorAttr &&) noexcept = default; /** * Adding new equivalent vendors described in a directory **/ bool addVendorDirectory( const Pathname & dirname_r ); /** * Adding new equivalent vendors described in a file **/ bool addVendorFile( const Pathname & filename_r ); /** Preferred type to pass equivalent vendor strings. */ using VendorList = std::vector; /** * Adding new equivalent vendor strings container. **/ void addVendorList( VendorList && list_r ) { _addVendorList( std::move(list_r) ); } /** \overload copying the data */ void addVendorList( const VendorList & list_r ) { _addVendorList( VendorList(list_r) ); } /** \overload from arbitrary string container */ template void addVendorList( const TContainer & container_r ) { VendorList tmp; for ( const auto & el : container_r ) tmp.push_back( std::string(el) ); _addVendorList( std::move(tmp) ); } /** \overload from std::initializer_list */ template void addVendorList( const std::initializer_list & container_r ) { VendorList tmp; for ( const auto & el : container_r ) tmp.push_back( std::string(el) ); _addVendorList( std::move(tmp) ); } /** Return whether two vendor strings should be treated as the same vendor. * Usually the solver is allowed to automatically select a package of an * equivalent vendor when updating. Replacing a package with one of a * different vendor usually must be confirmed by the user. */ bool equivalent( const Vendor & lVendor, const Vendor & rVendor ) const; /** \overload using \ref IdStrings */ bool equivalent( IdString lVendor, IdString rVendor ) const; /** \overload using \ref sat::Solvable */ bool equivalent( sat::Solvable lVendor, sat::Solvable rVendor ) const; /** \overload using \ref PoolItem */ bool equivalent( const PoolItem & lVendor, const PoolItem & rVendor ) const; /** Like \ref equivalent but always unifies suse and openSUSE vendor */ bool relaxedEquivalent( const Vendor & lVendor, const Vendor & rVendor ) const; /** \overload using \ref IdStrings */ bool relaxedEquivalent( IdString lVendor, IdString rVendor ) const; /** \overload using \ref sat::Solvable */ bool relaxedEquivalent( sat::Solvable lVendor, sat::Solvable rVendor ) const; /** \overload using \ref PoolItem */ bool relaxedEquivalent( const PoolItem & lVendor, const PoolItem & rVendor ) const; public: /** Call \a fnc_r for each equivalent vendor list (return \c false to break). * \return The number of calls to \a fnc_r. */ unsigned foreachVendorList( std::function fnc_r ) const; public: class Impl; ///< Implementation class. RWCOW_pointer _pimpl; ///< Pointer to implementation. void _addVendorList( VendorList && list_r ); }; /** \relates VendorAttr Stream output */ std::ostream & operator<<( std::ostream & str, const VendorAttr & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// }; // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_VENDORATTR_H libzypp-17.36.5/zypp/VendorSupportOptions.cc000066400000000000000000000042761476576476200211460ustar00rootroot00000000000000 #include #include namespace zypp { std::string asUserString( VendorSupportOption opt ) { switch (opt) { case VendorSupportUnknown: return _("unknown"); break; case VendorSupportUnsupported: return _("unsupported"); break; case VendorSupportLevel1: return _("Level 1"); break; case VendorSupportLevel2: return _("Level 2"); break; case VendorSupportLevel3: return _("Level 3"); break; case VendorSupportACC: return _("Additional Customer Contract Necessary"); case VendorSupportSuperseded: return _("Discontinued and superseded by a different package"); } return _("invalid"); } std::string asUserStringDescription( VendorSupportOption opt ) { switch (opt) { case VendorSupportUnknown: return _("The level of support is unspecified"); break; case VendorSupportUnsupported: return _("The vendor does not provide support."); break; case VendorSupportLevel1: return _("Problem determination, which means technical support designed to provide compatibility information, installation assistance, usage support, on-going maintenance and basic troubleshooting. Level 1 Support is not intended to correct product defect errors."); break; case VendorSupportLevel2: return _("Problem isolation, which means technical support designed to duplicate customer problems, isolate problem area and provide resolution for problems not resolved by Level 1 Support."); break; case VendorSupportLevel3: return _("Problem resolution, which means technical support designed to resolve complex problems by engaging engineering in resolution of product defects which have been identified by Level 2 Support."); break; case VendorSupportACC: return _("An additional customer contract is necessary for getting support."); case VendorSupportSuperseded: return _("The package was discontinued and has been superseded by a new package with a different name."); } return _("Unknown support option. Description not available"); } } libzypp-17.36.5/zypp/VendorSupportOptions.h000066400000000000000000000071551476576476200210070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/VendorSupportOptions.h * */ #ifndef ZYPP_VendorSupportOptions_H #define ZYPP_VendorSupportOptions_H #include #include namespace zypp { enum VendorSupportOption { /** * The support for this package is unknown */ VendorSupportUnknown = 0, /** * The package is known to be unsupported by the vendor */ VendorSupportUnsupported = (1<<0), /** * Additional Customer Contract necessary */ VendorSupportACC = (1<<1), /** * Problem determination, which means technical support * designed to provide compatibility information, * installation assistance, usage support, on-going maintenance * and basic troubleshooting. Level 1 Support is not intended to * correct product defect errors. * * May have different semantics for different organizations. */ VendorSupportLevel1 = (1<<2), /** * Problem isolation, which means technical support designed * to duplicate customer problems, isolate problem area and provide * resolution for problems not resolved by Level 1 Support. * * May have different semantics for different organizations. */ VendorSupportLevel2 = (1<<3), /** * Problem resolution, which means technical support designed * to resolve complex problems by engaging engineering in resolution * of product defects which have been identified by Level 2 Support. * * May have different semantics for different organizations. */ VendorSupportLevel3 = (1<<4), /** * The package was discontinued and has been superseded by a new package * with a different name. The new package is the successor of the * old package, and as such only the new package is supported * in the future. * * The old package will not receive updates anymore, so it's highly * recommended to switch to the new package as soon as possible. * * \Note Packages carrying this flag also return the name of a * successor in \ref Package::supersededBy(). */ VendorSupportSuperseded = (1<<5), }; // Make a flag set for this ZYPP_DECLARE_FLAGS(VendorSupportOptions,VendorSupportOption); ZYPP_DECLARE_OPERATORS_FOR_FLAGS(VendorSupportOptions) /** * converts the support option to a name intended to be printed * to the user. * * Note the description is based in the way Novell defines the support * levels, and the semantics may be different for other vendors. */ std::string asUserString( VendorSupportOption ) ZYPP_API; /** * converts the support option to a description intended to be printed * to the user. * * Note the description is based in the way Novell defines the support * levels, and the semantics may be different for other vendors. */ std::string asUserStringDescription( VendorSupportOption ) ZYPP_API; } #endif libzypp-17.36.5/zypp/ZConfig.cc000066400000000000000000001421731476576476200162760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZConfig.cc * */ extern "C" { #include #include #if __GLIBC_PREREQ (2,16) #include // getauxval for PPC64P7 detection #endif #include #include } #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; using namespace zypp::filesystem; using namespace zypp::parser; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zconfig" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** \addtogroup ZyppConfig Zypp Configuration Options * * The global \c zypp.conf configuration file is per default located in \c /etc/zypp/. * An alternate config file can be set using the environment varaible \c ZYPP_CONF= * (see \ref zypp-envars). * * \section ZyppConfig_ZyppConfSample Sample zypp.conf * \include ../zypp.conf */ /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // From rpm's lib/rpmrc.c # if defined(__linux__) && defined(__x86_64__) static inline void cpuid(uint32_t op, uint32_t op2, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) { asm volatile ( "cpuid\n" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) : "a" (op), "c" (op2)); } /* From gcc's gcc/config/i386/cpuid.h */ /* Features (%eax == 1) */ /* %ecx */ #define bit_SSE3 (1 << 0) #define bit_SSSE3 (1 << 9) #define bit_FMA (1 << 12) #define bit_CMPXCHG16B (1 << 13) #define bit_SSE4_1 (1 << 19) #define bit_SSE4_2 (1 << 20) #define bit_MOVBE (1 << 22) #define bit_POPCNT (1 << 23) #define bit_OSXSAVE (1 << 27) #define bit_AVX (1 << 28) #define bit_F16C (1 << 29) /* Extended Features (%eax == 0x80000001) */ /* %ecx */ #define bit_LAHF_LM (1 << 0) #define bit_LZCNT (1 << 5) /* Extended Features (%eax == 7) */ /* %ebx */ #define bit_BMI (1 << 3) #define bit_AVX2 (1 << 5) #define bit_BMI2 (1 << 8) #define bit_AVX512F (1 << 16) #define bit_AVX512DQ (1 << 17) #define bit_AVX512CD (1 << 28) #define bit_AVX512BW (1 << 30) #define bit_AVX512VL (1u << 31) static int get_x86_64_level(void) { int level = 1; unsigned int op_1_ecx = 0, op_80000001_ecx = 0, op_7_ebx = 0, unused = 0; cpuid(1, 0, &unused, &unused, &op_1_ecx, &unused); cpuid(0x80000001, 0, &unused, &unused, &op_80000001_ecx, &unused); cpuid(7, 0, &unused, &op_7_ebx, &unused, &unused); const unsigned int op_1_ecx_lv2 = bit_SSE3 | bit_SSSE3 | bit_CMPXCHG16B | bit_SSE4_1 | bit_SSE4_2 | bit_POPCNT; if ((op_1_ecx & op_1_ecx_lv2) == op_1_ecx_lv2 && (op_80000001_ecx & bit_LAHF_LM)) level = 2; const unsigned int op_1_ecx_lv3 = bit_FMA | bit_MOVBE | bit_OSXSAVE | bit_AVX | bit_F16C; const unsigned int op_7_ebx_lv3 = bit_BMI | bit_AVX2 | bit_BMI2; if (level == 2 && (op_1_ecx & op_1_ecx_lv3) == op_1_ecx_lv3 && (op_7_ebx & op_7_ebx_lv3) == op_7_ebx_lv3 && (op_80000001_ecx & bit_LZCNT)) level = 3; const unsigned int op_7_ebx_lv4 = bit_AVX512F | bit_AVX512DQ | bit_AVX512CD | bit_AVX512BW | bit_AVX512VL; if (level == 3 && (op_7_ebx & op_7_ebx_lv4) == op_7_ebx_lv4) level = 4; return level; } # endif /////////////////////////////////////////////////////////////////// /** Determine system architecture evaluating \c uname and \c /proc/cpuinfo. */ Arch _autodetectSystemArchitecture() { struct ::utsname buf; if ( ::uname( &buf ) < 0 ) { ERR << "Can't determine system architecture" << endl; return Arch_noarch; } Arch architecture( buf.machine ); MIL << "Uname architecture is '" << buf.machine << "'" << endl; if ( architecture == Arch_x86_64 ) { #if defined(__linux__) && defined(__x86_64__) switch ( get_x86_64_level() ) { case 2: architecture = Arch_x86_64_v2; WAR << "CPU has 'x86_64': architecture upgraded to '" << architecture << "'" << endl; break; case 3: architecture = Arch_x86_64_v3; WAR << "CPU has 'x86_64': architecture upgraded to '" << architecture << "'" << endl; break; case 4: architecture = Arch_x86_64_v4; WAR << "CPU has 'x86_64': architecture upgraded to '" << architecture << "'" << endl; break; } # endif } else if ( architecture == Arch_i686 ) { // some CPUs report i686 but dont implement cx8 and cmov // check for both flags in /proc/cpuinfo and downgrade // to i586 if either is missing (cf bug #18885) std::ifstream cpuinfo( "/proc/cpuinfo" ); if ( cpuinfo ) { for( iostr::EachLine in( cpuinfo ); in; in.next() ) { if ( str::hasPrefix( *in, "flags" ) ) { if ( in->find( "cx8" ) == std::string::npos || in->find( "cmov" ) == std::string::npos ) { architecture = Arch_i586; WAR << "CPU lacks 'cx8' or 'cmov': architecture downgraded to '" << architecture << "'" << endl; } break; } } } else { ERR << "Cant open " << PathInfo("/proc/cpuinfo") << endl; } } else if ( architecture == Arch_sparc || architecture == Arch_sparc64 ) { // Check for sun4[vum] to get the real arch. (bug #566291) std::ifstream cpuinfo( "/proc/cpuinfo" ); if ( cpuinfo ) { for( iostr::EachLine in( cpuinfo ); in; in.next() ) { if ( str::hasPrefix( *in, "type" ) ) { if ( in->find( "sun4v" ) != std::string::npos ) { architecture = ( architecture == Arch_sparc64 ? Arch_sparc64v : Arch_sparcv9v ); WAR << "CPU has 'sun4v': architecture upgraded to '" << architecture << "'" << endl; } else if ( in->find( "sun4u" ) != std::string::npos ) { architecture = ( architecture == Arch_sparc64 ? Arch_sparc64 : Arch_sparcv9 ); WAR << "CPU has 'sun4u': architecture upgraded to '" << architecture << "'" << endl; } else if ( in->find( "sun4m" ) != std::string::npos ) { architecture = Arch_sparcv8; WAR << "CPU has 'sun4m': architecture upgraded to '" << architecture << "'" << endl; } break; } } } else { ERR << "Cant open " << PathInfo("/proc/cpuinfo") << endl; } } else if ( architecture == Arch_armv8l || architecture == Arch_armv7l || architecture == Arch_armv6l ) { std::ifstream platform( "/etc/rpm/platform" ); if (platform) { for( iostr::EachLine in( platform ); in; in.next() ) { if ( str::hasPrefix( *in, "armv8hl-" ) ) { architecture = Arch_armv8hl; WAR << "/etc/rpm/platform contains armv8hl-: architecture upgraded to '" << architecture << "'" << endl; break; } if ( str::hasPrefix( *in, "armv7hl-" ) ) { architecture = Arch_armv7hl; WAR << "/etc/rpm/platform contains armv7hl-: architecture upgraded to '" << architecture << "'" << endl; break; } if ( str::hasPrefix( *in, "armv6hl-" ) ) { architecture = Arch_armv6hl; WAR << "/etc/rpm/platform contains armv6hl-: architecture upgraded to '" << architecture << "'" << endl; break; } } } } #if __GLIBC_PREREQ (2,16) else if ( architecture == Arch_ppc64 ) { const char * platform = (const char *)getauxval( AT_PLATFORM ); int powerlvl = 0; if ( platform && sscanf( platform, "power%d", &powerlvl ) == 1 && powerlvl > 6 ) architecture = Arch_ppc64p7; } #endif return architecture; } /** The locale to be used for texts and messages. * * For the encoding to be used the preference is * * LC_ALL, LC_CTYPE, LANG * * For the language of the messages to be used, the preference is * * LANGUAGE, LC_ALL, LC_MESSAGES, LANG * * Note that LANGUAGE can contain more than one locale name, it can be * a list of locale names like for example * * LANGUAGE=ja_JP.UTF-8:de_DE.UTF-8:fr_FR.UTF-8 * \todo Support dynamic fallbacklists defined by LANGUAGE */ Locale _autodetectTextLocale() { Locale ret( Locale::enCode ); const char * envlist[] = { "LC_ALL", "LC_MESSAGES", "LANG", NULL }; for ( const char ** envvar = envlist; *envvar; ++envvar ) { const char * envlang = getenv( *envvar ); if ( envlang ) { std::string envstr( envlang ); if ( envstr != "POSIX" && envstr != "C" ) { Locale lang( envstr ); if ( lang ) { MIL << "Found " << *envvar << "=" << envstr << endl; ret = lang; break; } } } } MIL << "Default text locale is '" << ret << "'" << endl; #warning HACK AROUND BOOST_TEST_CATCH_SYSTEM_ERRORS setenv( "BOOST_TEST_CATCH_SYSTEM_ERRORS", "no", 1 ); return ret; } inline Pathname _autodetectZyppConfPath() { const char *env_confpath = getenv( "ZYPP_CONF" ); return env_confpath ? env_confpath : "/etc/zypp/zypp.conf"; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// /** Mutable option. */ template struct Option { using value_type = Tp; /** No default ctor, explicit initialisation! */ Option( value_type initial_r ) : _val( std::move(initial_r) ) {} Option & operator=( value_type newval_r ) { set( std::move(newval_r) ); return *this; } /** Get the value. */ const value_type & get() const { return _val; } /** Autoconversion to value_type. */ operator const value_type &() const { return _val; } /** Set a new value. */ void set( value_type newval_r ) { _val = std::move(newval_r); } private: value_type _val; }; /** Mutable option with initial value also remembering a config value. */ template struct DefaultOption : public Option { using value_type = Tp; using option_type = Option; explicit DefaultOption( value_type initial_r ) : Option( initial_r ) , _default( std::move(initial_r) ) {} DefaultOption & operator=( value_type newval_r ) { this->set( std::move(newval_r) ); return *this; } /** Reset value to the current default. */ void restoreToDefault() { this->set( _default.get() ); } /** Reset value to a new default. */ void restoreToDefault( value_type newval_r ) { setDefault( std::move(newval_r) ); restoreToDefault(); } /** Get the current default value. */ const value_type & getDefault() const { return _default.get(); } /** Set a new default value. */ void setDefault( value_type newval_r ) { _default.set( std::move(newval_r) ); } private: option_type _default; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZConfig::Impl // /** ZConfig implementation. * \todo Enrich section and entry definition by some comment * (including the default setting and provide some method to * write this into a sample zypp.conf. */ class ZConfig::Impl { using MultiversionSpec = std::set; /// Settings that follow a changed Target struct TargetDefaults { TargetDefaults() : solver_focus ( ResolverFocus::Default ) , solver_onlyRequires ( false ) , solver_allowVendorChange ( false ) , solver_dupAllowDowngrade ( true ) , solver_dupAllowNameChange ( true ) , solver_dupAllowArchChange ( true ) , solver_dupAllowVendorChange ( true ) , solver_cleandepsOnRemove ( false ) , solver_upgradeTestcasesToKeep ( 2 ) , solverUpgradeRemoveDroppedPackages ( true ) {} bool consume( const std::string & entry, const std::string & value ) { if ( entry == "solver.focus" ) { fromString( value, solver_focus ); } else if ( entry == "solver.onlyRequires" ) { solver_onlyRequires.set( str::strToBool( value, solver_onlyRequires ) ); } else if ( entry == "solver.allowVendorChange" ) { solver_allowVendorChange.set( str::strToBool( value, solver_allowVendorChange ) ); } else if ( entry == "solver.dupAllowDowngrade" ) { solver_dupAllowDowngrade.set( str::strToBool( value, solver_dupAllowDowngrade ) ); } else if ( entry == "solver.dupAllowNameChange" ) { solver_dupAllowNameChange.set( str::strToBool( value, solver_dupAllowNameChange ) ); } else if ( entry == "solver.dupAllowArchChange" ) { solver_dupAllowArchChange.set( str::strToBool( value, solver_dupAllowArchChange ) ); } else if ( entry == "solver.dupAllowVendorChange" ) { solver_dupAllowVendorChange.set( str::strToBool( value, solver_dupAllowVendorChange ) ); } else if ( entry == "solver.cleandepsOnRemove" ) { solver_cleandepsOnRemove.set( str::strToBool( value, solver_cleandepsOnRemove ) ); } else if ( entry == "solver.upgradeTestcasesToKeep" ) { solver_upgradeTestcasesToKeep.set( str::strtonum( value ) ); } else if ( entry == "solver.upgradeRemoveDroppedPackages" ) { solverUpgradeRemoveDroppedPackages.restoreToDefault( str::strToBool( value, solverUpgradeRemoveDroppedPackages.getDefault() ) ); } else return false; return true; } ResolverFocus solver_focus; Option solver_onlyRequires; Option solver_allowVendorChange; Option solver_dupAllowDowngrade; Option solver_dupAllowNameChange; Option solver_dupAllowArchChange; Option solver_dupAllowVendorChange; Option solver_cleandepsOnRemove; Option solver_upgradeTestcasesToKeep; DefaultOption solverUpgradeRemoveDroppedPackages; }; public: Impl() : _parsedZyppConf ( _autodetectZyppConfPath() ) , cfg_arch ( defaultSystemArchitecture() ) , cfg_textLocale ( defaultTextLocale() ) , cfg_cache_path { "/var/cache/zypp" } , cfg_metadata_path { "" } // empty - follows cfg_cache_path , cfg_solvfiles_path { "" } // empty - follows cfg_cache_path , cfg_packages_path { "" } // empty - follows cfg_cache_path , updateMessagesNotify ( "" ) , repo_add_probe ( false ) , repo_refresh_delay ( 10 ) , repoLabelIsAlias ( false ) , download_use_deltarpm ( LIBZYPP_CONFIG_USE_DELTARPM_BY_DEFAULT ) , download_use_deltarpm_always ( false ) , download_media_prefer_download( true ) , download_mediaMountdir ( "/var/adm/mount" ) , commit_downloadMode ( DownloadDefault ) , gpgCheck ( true ) , repoGpgCheck ( indeterminate ) , pkgGpgCheck ( indeterminate ) , apply_locks_file ( true ) , pluginsPath ( "/usr/lib/zypp/plugins" ) , geoipEnabled ( true ) , geoipHosts { "download.opensuse.org" } { MIL << "libzypp: " LIBZYPP_VERSION_STRING << " (" << LIBZYPP_CODESTREAM << ")" << endl; if ( PathInfo(_parsedZyppConf).isExist() ) { parser::IniDict dict( _parsedZyppConf ); for ( IniDict::section_const_iterator sit = dict.sectionsBegin(); sit != dict.sectionsEnd(); ++sit ) { const std::string& section(*sit); //MIL << section << endl; for ( IniDict::entry_const_iterator it = dict.entriesBegin(*sit); it != dict.entriesEnd(*sit); ++it ) { std::string entry(it->first); std::string value(it->second); if ( _mediaConf.setConfigValue( section, entry, value ) ) continue; //DBG << (*it).first << "=" << (*it).second << endl; if ( section == "main" ) { if ( _initialTargetDefaults.consume( entry, value ) ) continue; if ( entry == "arch" ) { Arch carch( value ); if ( carch != cfg_arch ) { WAR << "Overriding system architecture (" << cfg_arch << "): " << carch << endl; cfg_arch = carch; } } else if ( entry == "cachedir" ) { cfg_cache_path.restoreToDefault( value ); } else if ( entry == "metadatadir" ) { cfg_metadata_path.restoreToDefault( value ); } else if ( entry == "solvfilesdir" ) { cfg_solvfiles_path.restoreToDefault( value ); } else if ( entry == "packagesdir" ) { cfg_packages_path.restoreToDefault( value ); } else if ( entry == "configdir" ) { cfg_config_path = Pathname(value); } else if ( entry == "reposdir" ) { cfg_known_repos_path = Pathname(value); } else if ( entry == "servicesdir" ) { cfg_known_services_path = Pathname(value); } else if ( entry == "varsdir" ) { cfg_vars_path = Pathname(value); } else if ( entry == "repo.add.probe" ) { repo_add_probe = str::strToBool( value, repo_add_probe ); } else if ( entry == "repo.refresh.delay" ) { str::strtonum(value, repo_refresh_delay); } else if ( entry == "repo.refresh.locales" ) { std::vector tmp; str::split( value, back_inserter( tmp ), ", \t" ); boost::function transform( [](const std::string & str_r)->Locale{ return Locale(str_r); } ); repoRefreshLocales.insert( make_transform_iterator( tmp.begin(), transform ), make_transform_iterator( tmp.end(), transform ) ); } else if ( entry == "download.use_deltarpm" ) { download_use_deltarpm = str::strToBool( value, download_use_deltarpm ); } else if ( entry == "download.use_deltarpm.always" ) { download_use_deltarpm_always = str::strToBool( value, download_use_deltarpm_always ); } else if ( entry == "download.media_preference" ) { download_media_prefer_download.restoreToDefault( str::compareCI( value, "volatile" ) != 0 ); } else if ( entry == "download.media_mountdir" ) { download_mediaMountdir.restoreToDefault( Pathname(value) ); } else if ( entry == "download.use_geoip_mirror") { geoipEnabled = str::strToBool( value, geoipEnabled ); } else if ( entry == "commit.downloadMode" ) { commit_downloadMode.set( deserializeDownloadMode( value ) ); } else if ( entry == "gpgcheck" ) { gpgCheck.restoreToDefault( str::strToBool( value, gpgCheck ) ); } else if ( entry == "repo_gpgcheck" ) { repoGpgCheck.restoreToDefault( str::strToTriBool( value ) ); } else if ( entry == "pkg_gpgcheck" ) { pkgGpgCheck.restoreToDefault( str::strToTriBool( value ) ); } else if ( entry == "vendordir" ) { cfg_vendor_path = Pathname(value); } else if ( entry == "multiversiondir" ) { cfg_multiversion_path = Pathname(value); } else if ( entry == "multiversion.kernels" ) { cfg_kernel_keep_spec = value; } else if ( entry == "solver.checkSystemFile" ) { solver_checkSystemFile = Pathname(value); } else if ( entry == "solver.checkSystemFileDir" ) { solver_checkSystemFileDir = Pathname(value); } else if ( entry == "multiversion" ) { MultiversionSpec & defSpec( _multiversionMap.getDefaultSpec() ); str::splitEscaped( value, std::inserter( defSpec, defSpec.end() ), ", \t" ); } else if ( entry == "locksfile.path" ) { locks_file = Pathname(value); } else if ( entry == "locksfile.apply" ) { apply_locks_file = str::strToBool( value, apply_locks_file ); } else if ( entry == "update.datadir" ) { // ignore, this is a constant anyway and should not be user configurabe // update_data_path = Pathname(value); } else if ( entry == "update.scriptsdir" ) { // ignore, this is a constant anyway and should not be user configurabe // update_scripts_path = Pathname(value); } else if ( entry == "update.messagessdir" ) { // ignore, this is a constant anyway and should not be user configurabe // update_messages_path = Pathname(value); } else if ( entry == "update.messages.notify" ) { updateMessagesNotify.set( value ); } else if ( entry == "rpm.install.excludedocs" ) { rpmInstallFlags.setFlag( target::rpm::RPMINST_EXCLUDEDOCS, str::strToBool( value, false ) ); } else if ( entry == "history.logfile" ) { history_log_path = Pathname(value); } else if ( entry == "techpreview.ZYPP_SINGLE_RPMTRANS" ) { DBG << "techpreview.ZYPP_SINGLE_RPMTRANS=" << value << endl; ::setenv( "ZYPP_SINGLE_RPMTRANS", value.c_str(), 1 ); } else if ( entry == "techpreview.ZYPP_MEDIANETWORK" ) { DBG << "techpreview.ZYPP_MEDIANETWORK=" << value << endl; ::setenv( "ZYPP_MEDIANETWORK", value.c_str(), 1 ); } } } } } else { MIL << _parsedZyppConf << " not found, using defaults instead." << endl; _parsedZyppConf = _parsedZyppConf.extend( " (NOT FOUND)" ); } // legacy: if ( getenv( "ZYPP_TESTSUITE_FAKE_ARCH" ) ) { Arch carch( getenv( "ZYPP_TESTSUITE_FAKE_ARCH" ) ); if ( carch != cfg_arch ) { WAR << "ZYPP_TESTSUITE_FAKE_ARCH: Overriding system architecture (" << cfg_arch << "): " << carch << endl; cfg_arch = carch; } } MIL << "ZConfig singleton created." << endl; } Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() {} /** bsc#1237044: Provide \ref announceSystemRoot to allow commands * using --root without launching a Target. An announced SystemRoot * is used rather than / when no Target is up. This enables sub * components (e.g. VarReplacer) to refer to the right context. * * Setting or re-setting a Target clears any announced SystemRoot. */ Pathname _autodetectSystemRoot() const { Target_Ptr target( getZYpp()->getTarget() ); return target ? target->root() : _announced_root_path; } void notifyTargetChanged() { _announced_root_path = Pathname(); // first of all reset any previously _announced_root_path Pathname newRoot { _autodetectSystemRoot() }; MIL << "notifyTargetChanged (" << newRoot << ")" << endl; if ( newRoot.emptyOrRoot() ) { _currentTargetDefaults.reset(); // to initial settigns from / } else { _currentTargetDefaults = TargetDefaults(); Pathname newConf { newRoot/_autodetectZyppConfPath() }; if ( PathInfo(newConf).isExist() ) { parser::IniDict dict( newConf ); for ( const auto & [entry,value] : dict.entries( "main" ) ) { (*_currentTargetDefaults).consume( entry, value ); } } else { MIL << _parsedZyppConf << " not found, using defaults." << endl; } } } public: /** Remember any parsed zypp.conf. */ Pathname _parsedZyppConf; Pathname _announced_root_path; Arch cfg_arch; Locale cfg_textLocale; DefaultOption cfg_cache_path; // Settings from the config file are also remembered DefaultOption cfg_metadata_path; // 'default'. Cleanup in RepoManager e.g needs to tell DefaultOption cfg_solvfiles_path; // whether settings in effect are config values or DefaultOption cfg_packages_path; // custom settings applied vie set...Path(). Pathname cfg_config_path; Pathname cfg_known_repos_path; Pathname cfg_known_services_path; Pathname cfg_vars_path; Pathname cfg_repo_mgr_root_path; Pathname cfg_vendor_path; Pathname cfg_multiversion_path; std::string cfg_kernel_keep_spec; Pathname locks_file; DefaultOption updateMessagesNotify; bool repo_add_probe; unsigned repo_refresh_delay; LocaleSet repoRefreshLocales; bool repoLabelIsAlias; bool download_use_deltarpm; bool download_use_deltarpm_always; DefaultOption download_media_prefer_download; DefaultOption download_mediaMountdir; Option commit_downloadMode; DefaultOption gpgCheck; DefaultOption repoGpgCheck; DefaultOption pkgGpgCheck; Pathname solver_checkSystemFile; Pathname solver_checkSystemFileDir; MultiversionSpec & multiversion() { return getMultiversion(); } const MultiversionSpec & multiversion() const { return getMultiversion(); } bool apply_locks_file; target::rpm::RpmInstFlags rpmInstallFlags; Pathname history_log_path; std::string userData; Option pluginsPath; bool geoipEnabled; std::vector geoipHosts; /* Other config singleton instances */ MediaConfig &_mediaConf = MediaConfig::instance(); public: const TargetDefaults & targetDefaults() const { return _currentTargetDefaults ? *_currentTargetDefaults : _initialTargetDefaults; } TargetDefaults & targetDefaults() { return _currentTargetDefaults ? *_currentTargetDefaults : _initialTargetDefaults; } private: TargetDefaults _initialTargetDefaults; ///< Initial TargetDefaults from / std::optional _currentTargetDefaults; ///< TargetDefaults while --root private: // HACK for bnc#906096: let pool re-evaluate multiversion spec // if target root changes. ZConfig returns data sensitive to // current target root. // TODO Actually we'd need to scan the target systems zypp.conf and // overlay all system specific values. struct MultiversionMap { using SpecMap = std::map; MultiversionSpec & getSpec( Pathname root_r, const Impl & zConfImpl_r ) // from system at root { // _specMap[] - the plain zypp.conf value // _specMap[/] - combine [] and multiversion.d scan // _specMap[root] - scan root/zypp.conf and root/multiversion.d if ( root_r.empty() ) root_r = "/"; bool cacheHit = _specMap.count( root_r ); MultiversionSpec & ret( _specMap[root_r] ); // creates new entry on the fly if ( ! cacheHit ) { // bsc#1193488: If no (/root)/.../zypp.conf exists use the default zypp.conf // multiversion settings. It is a legacy that the packaged multiversion setting // in zypp.conf (the kernel) may differ from the builtin default (empty). // But we want a missing config to behave similar to the default one, otherwise // a bare metal install easily runs into trouble. if ( root_r == "/" || scanConfAt( root_r, ret, zConfImpl_r ) == 0 ) ret = _specMap[Pathname()]; scanDirAt( root_r, ret, zConfImpl_r ); // add multiversion.d at root_r using zypp::operator<<; MIL << "MultiversionSpec '" << root_r << "' = " << ret << endl; } return ret; } MultiversionSpec & getDefaultSpec() // Spec from zypp.conf parsing; called before any getSpec { return _specMap[Pathname()]; } private: int scanConfAt( const Pathname& root_r, MultiversionSpec & spec_r, const Impl & zConfImpl_r ) { static const str::regex rx( "^multiversion *= *(.*)" ); str::smatch what; return iostr::simpleParseFile( InputStream( Pathname::assertprefix( root_r, _autodetectZyppConfPath() ) ), [&]( int num_r, std::string line_r )->bool { if ( line_r[0] == 'm' && str::regex_match( line_r, what, rx ) ) { str::splitEscaped( what[1], std::inserter( spec_r, spec_r.end() ), ", \t" ); return false; // stop after match } return true; } ); } void scanDirAt( const Pathname& root_r, MultiversionSpec & spec_r, const Impl & zConfImpl_r ) { // NOTE: Actually we'd need to scan and use the root_r! zypp.conf values. Pathname multiversionDir( zConfImpl_r.cfg_multiversion_path ); if ( multiversionDir.empty() ) multiversionDir = ( zConfImpl_r.cfg_config_path.empty() ? Pathname("/etc/zypp") : zConfImpl_r.cfg_config_path ) / "multiversion.d"; filesystem::dirForEach( Pathname::assertprefix( root_r, multiversionDir ), [&spec_r]( const Pathname & dir_r, const char *const & name_r )->bool { MIL << "Parsing " << dir_r/name_r << endl; iostr::simpleParseFile( InputStream( dir_r/name_r ), [&spec_r]( int num_r, std::string line_r )->bool { DBG << " found " << line_r << endl; spec_r.insert( std::move(line_r) ); return true; } ); return true; } ); } private: SpecMap _specMap; }; MultiversionSpec & getMultiversion() const { return _multiversionMap.getSpec( _autodetectSystemRoot(), *this ); } mutable MultiversionMap _multiversionMap; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ZConfig::instance // METHOD TYPE : ZConfig & // ZConfig & ZConfig::instance() { static ZConfig _instance; // The singleton return _instance; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ZConfig::ZConfig // METHOD TYPE : Ctor // ZConfig::ZConfig() : _pimpl( new Impl ) { about( MIL ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ZConfig::~ZConfig // METHOD TYPE : Dtor // ZConfig::~ZConfig( ) {} void ZConfig::notifyTargetChanged() { return _pimpl->notifyTargetChanged(); } Pathname ZConfig::systemRoot() const { return _pimpl->_autodetectSystemRoot(); } Pathname ZConfig::repoManagerRoot() const { return ( _pimpl->cfg_repo_mgr_root_path.empty() ? systemRoot() : _pimpl->cfg_repo_mgr_root_path ); } void ZConfig::setRepoManagerRoot(const zypp::filesystem::Pathname &root) { _pimpl->cfg_repo_mgr_root_path = root; } void ZConfig::announceSystemRoot( const Pathname & root_r ) { _pimpl->_announced_root_path = root_r; } /////////////////////////////////////////////////////////////////// // // system architecture // /////////////////////////////////////////////////////////////////// Arch ZConfig::defaultSystemArchitecture() { static Arch _val( _autodetectSystemArchitecture() ); return _val; } Arch ZConfig::systemArchitecture() const { return _pimpl->cfg_arch; } void ZConfig::setSystemArchitecture( const Arch & arch_r ) { if ( arch_r != _pimpl->cfg_arch ) { WAR << "Overriding system architecture (" << _pimpl->cfg_arch << "): " << arch_r << endl; _pimpl->cfg_arch = arch_r; } } /////////////////////////////////////////////////////////////////// // // text locale // /////////////////////////////////////////////////////////////////// Locale ZConfig::defaultTextLocale() { static Locale _val( _autodetectTextLocale() ); return _val; } Locale ZConfig::textLocale() const { return _pimpl->cfg_textLocale; } void ZConfig::setTextLocale( const Locale & locale_r ) { if ( locale_r != _pimpl->cfg_textLocale ) { WAR << "Overriding text locale (" << _pimpl->cfg_textLocale << "): " << locale_r << endl; _pimpl->cfg_textLocale = locale_r; // Propagate changes sat::Pool::instance().setTextLocale( locale_r ); } } /////////////////////////////////////////////////////////////////// // user data /////////////////////////////////////////////////////////////////// bool ZConfig::hasUserData() const { return !_pimpl->userData.empty(); } std::string ZConfig::userData() const { return _pimpl->userData; } bool ZConfig::setUserData( const std::string & str_r ) { for_( ch, str_r.begin(), str_r.end() ) { if ( *ch < ' ' && *ch != '\t' ) { ERR << "New user data string rejectded: char " << (int)*ch << " at position " << (ch - str_r.begin()) << endl; return false; } } MIL << "Set user data string to '" << str_r << "'" << endl; _pimpl->userData = str_r; return true; } /////////////////////////////////////////////////////////////////// Pathname ZConfig::repoCachePath() const { return ( _pimpl->cfg_cache_path.get().empty() ? Pathname("/var/cache/zypp") : _pimpl->cfg_cache_path.get() ); } Pathname ZConfig::pubkeyCachePath() const { return repoCachePath()/"pubkeys"; } void ZConfig::setRepoCachePath(const zypp::filesystem::Pathname &path_r) { _pimpl->cfg_cache_path = path_r; } Pathname ZConfig::repoMetadataPath() const { return ( _pimpl->cfg_metadata_path.get().empty() ? (repoCachePath()/"raw") : _pimpl->cfg_metadata_path.get() ); } void ZConfig::setRepoMetadataPath(const zypp::filesystem::Pathname &path_r) { _pimpl->cfg_metadata_path = path_r; } Pathname ZConfig::repoSolvfilesPath() const { return ( _pimpl->cfg_solvfiles_path.get().empty() ? (repoCachePath()/"solv") : _pimpl->cfg_solvfiles_path.get() ); } void ZConfig::setRepoSolvfilesPath(const zypp::filesystem::Pathname &path_r) { _pimpl->cfg_solvfiles_path = path_r; } Pathname ZConfig::repoPackagesPath() const { return ( _pimpl->cfg_packages_path.get().empty() ? (repoCachePath()/"packages") : _pimpl->cfg_packages_path.get() ); } void ZConfig::setRepoPackagesPath(const zypp::filesystem::Pathname &path_r) { _pimpl->cfg_packages_path = path_r; } Pathname ZConfig::builtinRepoCachePath() const { return _pimpl->cfg_cache_path.getDefault().empty() ? Pathname("/var/cache/zypp") : _pimpl->cfg_cache_path.getDefault(); } Pathname ZConfig::builtinRepoMetadataPath() const { return _pimpl->cfg_metadata_path.getDefault().empty() ? (builtinRepoCachePath()/"raw") : _pimpl->cfg_metadata_path.getDefault(); } Pathname ZConfig::builtinRepoSolvfilesPath() const { return _pimpl->cfg_solvfiles_path.getDefault().empty() ? (builtinRepoCachePath()/"solv") : _pimpl->cfg_solvfiles_path.getDefault(); } Pathname ZConfig::builtinRepoPackagesPath() const { return _pimpl->cfg_packages_path.getDefault().empty() ? (builtinRepoCachePath()/"packages") : _pimpl->cfg_packages_path.getDefault(); } /////////////////////////////////////////////////////////////////// Pathname ZConfig::configPath() const { return ( _pimpl->cfg_config_path.empty() ? Pathname("/etc/zypp") : _pimpl->cfg_config_path ); } Pathname ZConfig::knownReposPath() const { return ( _pimpl->cfg_known_repos_path.empty() ? (configPath()/"repos.d") : _pimpl->cfg_known_repos_path ); } Pathname ZConfig::knownServicesPath() const { return ( _pimpl->cfg_known_services_path.empty() ? (configPath()/"services.d") : _pimpl->cfg_known_services_path ); } Pathname ZConfig::needrebootFile() const { return configPath()/"needreboot"; } Pathname ZConfig::needrebootPath() const { return configPath()/"needreboot.d"; } void ZConfig::setGeoipEnabled( bool enable ) { _pimpl->geoipEnabled = enable; } bool ZConfig::geoipEnabled () const { return _pimpl->geoipEnabled; } Pathname ZConfig::geoipCachePath() const { return builtinRepoCachePath()/"geoip.d"; } const std::vector ZConfig::geoipHostnames () const { return _pimpl->geoipHosts; } Pathname ZConfig::varsPath() const { return ( _pimpl->cfg_vars_path.empty() ? (configPath()/"vars.d") : _pimpl->cfg_vars_path ); } Pathname ZConfig::vendorPath() const { return ( _pimpl->cfg_vendor_path.empty() ? (configPath()/"vendors.d") : _pimpl->cfg_vendor_path ); } Pathname ZConfig::locksFile() const { return ( _pimpl->locks_file.empty() ? (configPath()/"locks") : _pimpl->locks_file ); } /////////////////////////////////////////////////////////////////// bool ZConfig::repo_add_probe() const { return _pimpl->repo_add_probe; } unsigned ZConfig::repo_refresh_delay() const { return _pimpl->repo_refresh_delay; } LocaleSet ZConfig::repoRefreshLocales() const { return _pimpl->repoRefreshLocales.empty() ? Target::requestedLocales("") :_pimpl->repoRefreshLocales; } bool ZConfig::repoLabelIsAlias() const { return _pimpl->repoLabelIsAlias; } void ZConfig::repoLabelIsAlias( bool yesno_r ) { _pimpl->repoLabelIsAlias = yesno_r; } bool ZConfig::download_use_deltarpm() const { return _pimpl->download_use_deltarpm; } bool ZConfig::download_use_deltarpm_always() const { return download_use_deltarpm() && _pimpl->download_use_deltarpm_always; } bool ZConfig::download_media_prefer_download() const { return _pimpl->download_media_prefer_download; } void ZConfig::set_download_media_prefer_download( bool yesno_r ) { _pimpl->download_media_prefer_download.set( yesno_r ); } void ZConfig::set_default_download_media_prefer_download() { _pimpl->download_media_prefer_download.restoreToDefault(); } long ZConfig::download_max_concurrent_connections() const { return _pimpl->_mediaConf.download_max_concurrent_connections(); } long ZConfig::download_min_download_speed() const { return _pimpl->_mediaConf.download_min_download_speed(); } long ZConfig::download_max_download_speed() const { return _pimpl->_mediaConf.download_max_download_speed(); } long ZConfig::download_max_silent_tries() const { return _pimpl->_mediaConf.download_max_silent_tries(); } long ZConfig::download_transfer_timeout() const { return _pimpl->_mediaConf.download_transfer_timeout(); } Pathname ZConfig::download_mediaMountdir() const { return _pimpl->download_mediaMountdir; } void ZConfig::set_download_mediaMountdir( Pathname newval_r ) { _pimpl->download_mediaMountdir.set( std::move(newval_r) ); } void ZConfig::set_default_download_mediaMountdir() { _pimpl->download_mediaMountdir.restoreToDefault(); } DownloadMode ZConfig::commit_downloadMode() const { return _pimpl->commit_downloadMode; } bool ZConfig::gpgCheck() const { return _pimpl->gpgCheck; } TriBool ZConfig::repoGpgCheck() const { return _pimpl->repoGpgCheck; } TriBool ZConfig::pkgGpgCheck() const { return _pimpl->pkgGpgCheck; } void ZConfig::setGpgCheck( bool val_r ) { _pimpl->gpgCheck.set( val_r ); } void ZConfig::setRepoGpgCheck( TriBool val_r ) { _pimpl->repoGpgCheck.set( val_r ); } void ZConfig::setPkgGpgCheck( TriBool val_r ) { _pimpl->pkgGpgCheck.set( val_r ); } void ZConfig::resetGpgCheck() { _pimpl->gpgCheck.restoreToDefault(); } void ZConfig::resetRepoGpgCheck() { _pimpl->repoGpgCheck.restoreToDefault(); } void ZConfig::resetPkgGpgCheck() { _pimpl->pkgGpgCheck.restoreToDefault(); } ResolverFocus ZConfig::solver_focus() const { return _pimpl->targetDefaults().solver_focus; } bool ZConfig::solver_onlyRequires() const { return _pimpl->targetDefaults().solver_onlyRequires; } bool ZConfig::solver_allowVendorChange() const { return _pimpl->targetDefaults().solver_allowVendorChange; } bool ZConfig::solver_dupAllowDowngrade() const { return _pimpl->targetDefaults().solver_dupAllowDowngrade; } bool ZConfig::solver_dupAllowNameChange() const { return _pimpl->targetDefaults().solver_dupAllowNameChange; } bool ZConfig::solver_dupAllowArchChange() const { return _pimpl->targetDefaults().solver_dupAllowArchChange; } bool ZConfig::solver_dupAllowVendorChange() const { return _pimpl->targetDefaults().solver_dupAllowVendorChange; } bool ZConfig::solver_cleandepsOnRemove() const { return _pimpl->targetDefaults().solver_cleandepsOnRemove; } unsigned ZConfig::solver_upgradeTestcasesToKeep() const { return _pimpl->targetDefaults().solver_upgradeTestcasesToKeep; } bool ZConfig::solverUpgradeRemoveDroppedPackages() const { return _pimpl->targetDefaults().solverUpgradeRemoveDroppedPackages; } void ZConfig::setSolverUpgradeRemoveDroppedPackages( bool val_r ) { _pimpl->targetDefaults().solverUpgradeRemoveDroppedPackages.set( val_r ); } void ZConfig::resetSolverUpgradeRemoveDroppedPackages() { _pimpl->targetDefaults().solverUpgradeRemoveDroppedPackages.restoreToDefault(); } Pathname ZConfig::solver_checkSystemFile() const { return ( _pimpl->solver_checkSystemFile.empty() ? (configPath()/"systemCheck") : _pimpl->solver_checkSystemFile ); } Pathname ZConfig::solver_checkSystemFileDir() const { return ( _pimpl->solver_checkSystemFileDir.empty() ? (configPath()/"systemCheck.d") : _pimpl->solver_checkSystemFileDir ); } namespace { inline void sigMultiversionSpecChanged() { sat::detail::PoolMember::myPool().multiversionSpecChanged(); } } const std::set & ZConfig::multiversionSpec() const { return _pimpl->multiversion(); } void ZConfig::multiversionSpec( std::set new_r ) { _pimpl->multiversion().swap( new_r ); sigMultiversionSpecChanged(); } void ZConfig::clearMultiversionSpec() { _pimpl->multiversion().clear(); sigMultiversionSpecChanged(); } void ZConfig::addMultiversionSpec( const std::string & name_r ) { _pimpl->multiversion().insert( name_r ); sigMultiversionSpecChanged(); } void ZConfig::removeMultiversionSpec( const std::string & name_r ) { _pimpl->multiversion().erase( name_r ); sigMultiversionSpecChanged(); } bool ZConfig::apply_locks_file() const { return _pimpl->apply_locks_file; } Pathname ZConfig::update_dataPath() #if LEGACY(1735) const #endif { return Pathname("/var/adm"); } Pathname ZConfig::update_messagesPath() #if LEGACY(1735) const #endif { return Pathname(update_dataPath()/"update-messages"); } Pathname ZConfig::update_scriptsPath() #if LEGACY(1735) const #endif { return Pathname(update_dataPath()/"update-scripts"); } std::string ZConfig::updateMessagesNotify() const { return _pimpl->updateMessagesNotify; } void ZConfig::setUpdateMessagesNotify( const std::string & val_r ) { _pimpl->updateMessagesNotify.set( val_r ); } void ZConfig::resetUpdateMessagesNotify() { _pimpl->updateMessagesNotify.restoreToDefault(); } /////////////////////////////////////////////////////////////////// target::rpm::RpmInstFlags ZConfig::rpmInstallFlags() const { return _pimpl->rpmInstallFlags; } Pathname ZConfig::historyLogFile() const { return ( _pimpl->history_log_path.empty() ? Pathname("/var/log/zypp/history") : _pimpl->history_log_path ); } Pathname ZConfig::credentialsGlobalDir() const { return _pimpl->_mediaConf.credentialsGlobalDir(); } Pathname ZConfig::credentialsGlobalFile() const { return _pimpl->_mediaConf.credentialsGlobalFile(); } /////////////////////////////////////////////////////////////////// std::string ZConfig::distroverpkg() const { return "system-release"; } /////////////////////////////////////////////////////////////////// Pathname ZConfig::pluginsPath() const { return _pimpl->pluginsPath.get(); } std::string ZConfig::multiversionKernels() const { return _pimpl->cfg_kernel_keep_spec; } /////////////////////////////////////////////////////////////////// std::ostream & ZConfig::about( std::ostream & str ) const { str << "libzypp: " LIBZYPP_VERSION_STRING << " (" << LIBZYPP_CODESTREAM << ")" << endl; str << "libsolv: " << solv_version; if ( ::strcmp( solv_version, LIBSOLV_VERSION_STRING ) ) str << " (built against " << LIBSOLV_VERSION_STRING << ")"; str << endl; str << "zypp.conf: '" << _pimpl->_parsedZyppConf << "'" << endl; str << "TextLocale: '" << textLocale() << "' (" << defaultTextLocale() << ")" << endl; str << "SystemArchitecture: '" << systemArchitecture() << "' (" << defaultSystemArchitecture() << ")" << endl; return str; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ZConfig.h000066400000000000000000000511441476576476200161350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZConfig.h * */ #ifndef ZYPP_ZCONFIG_H #define ZYPP_ZCONFIG_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { // just for the friend declaration template class RepoManager; } /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class RepoManager; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZConfig // /** Interim helper class to collect global options and settings. * Use it to avoid hardcoded values and calls to getZYpp() just * to retrieve some value like architecture, languages or temppath. * * It reads /etc/zypp/zypp.conf, the filename can be overridden by * setting the ZYPP_CONF environment variable to a different file. * Config values for \ref MediaConfig are forwarded to the MediaConfig * singleton. * * Note, if you add settings to this file, please follow the following * convention: * * namespace.settingname * * should become * * namespace_settingName() * * \ingroup ZyppConfig * \ingroup Singleton */ class ZYPP_API ZConfig : private base::NonCopyable { public: /** Singleton ctor */ static ZConfig & instance(); /** Print some detail about the current libzypp version.*/ std::ostream & about( std::ostream & str ) const; public: /** The target root directory. * Returns an empty path if no target is set. */ Pathname systemRoot() const; /** The RepoManager root directory. * Returns the same as \ref systemRoot() if not explicitly set. */ Pathname repoManagerRoot() const; /** Sets the RepoManager root directory. * \sa repoManagerRoot() */ void setRepoManagerRoot ( const Pathname &root ); /** Announce a target root directory without launching the Target. * This can be used by workflows which want to run ---root but * without immediately launching the \ref Target. The value is * cleared as soon as a real \ref Target is up. */ void announceSystemRoot( const Pathname & root_r ); public: /** The autodetected system architecture. */ static Arch defaultSystemArchitecture(); /** The system architecture zypp uses. */ Arch systemArchitecture() const; /** Override the zypp system architecture. * This is useful for test scenarious. But be warned, zypp does * not expect the system architecture to change at runtime. So * set it at the very beginning before you access any other * zypp component. */ void setSystemArchitecture( const Arch & arch_r ); /** Reset the zypp system architecture to the default. */ void resetSystemArchitecture() { setSystemArchitecture( defaultSystemArchitecture() ); } public: /** The autodetected preferred locale for translated texts. */ static Locale defaultTextLocale(); /** The locale for translated texts zypp uses. */ Locale textLocale() const; /** Set the preferred locale for translated texts. */ void setTextLocale( const Locale & locale_r ); /** Reset the locale for translated texts to the default. */ void resetTextLocale() { setTextLocale( defaultTextLocale() ); } public: /** \name Maintain user data * \see \ref zypp-userdata */ //@{ /** Whether a (non empty) user data sting is defined. */ bool hasUserData() const; /** User defined string value to be passed to log, history, plugins... */ std::string userData() const; /** Set a new \ref userData string. * \returns \c TRUE if the string was accepted; \c FALSE if the * string was rejected due to nonprintable characters or newlines. */ bool setUserData( const std::string & str_r ); //@} public: /** * Path where the caches are kept (/var/cache/zypp) * \ingroup g_ZC_REPOCACHE */ Pathname repoCachePath() const; /** * Set a new \a path as the default repo cache path */ void setRepoCachePath ( const Pathname &path_r ); /** * Path where the pubkey caches */ Pathname pubkeyCachePath() const; /** * Path where the repo metadata is downloaded and kept (repoCachePath()/raw). * \ingroup g_ZC_REPOCACHE */ Pathname repoMetadataPath() const; /** * Set a new \a path as the default repo cache path */ void setRepoMetadataPath ( const Pathname &path_r ); /** * Path where the repo solv files are created and kept (repoCachePath()/solv). * \ingroup g_ZC_REPOCACHE */ Pathname repoSolvfilesPath() const; /** * Set a new \a path as the default repo cache path */ void setRepoSolvfilesPath ( const Pathname &path_r ); /** * Path where the repo packages are downloaded and kept (repoCachePath()/packages). * \ingroup g_ZC_REPOCACHE */ Pathname repoPackagesPath() const; /** * Set a new \a path as the default repo cache path */ void setRepoPackagesPath ( const Pathname &path_r ); /** * Path where the configfiles are kept (/etc/zypp). * \ingroup g_ZC_CONFIGFILES */ Pathname configPath() const; /** * Path where the known repositories .repo files are kept (configPath()/repos.d). * \ingroup g_ZC_CONFIGFILES */ Pathname knownReposPath() const; /** * Path where the known services .service files are kept (configPath()/services.d). * \ingroup g_ZC_CONFIGFILES */ Pathname knownServicesPath() const; /** * Path of the default needreboot config file (configPath()/needreboot). * \ingroup g_ZC_CONFIGFILES */ Pathname needrebootFile() const; /** * Path where the custom needreboot config files are kept (configPath()/needreboot.d). * \ingroup g_ZC_CONFIGFILES */ Pathname needrebootPath() const; /** * Enables or disables the use of the geoip feature of download.opensuse.org */ void setGeoipEnabled( bool enable = true ); /** * Returns true if zypp should use the geoip feature of download.opensuse.org */ bool geoipEnabled () const; /** * Path where the geoip caches are kept (/var/cache/zypp/geoip) */ Pathname geoipCachePath() const; /** * All hostnames we want to rewrite using the geoip feature. The \ref RepoManager * will try to query each hostname via: https://hostname/geoip to receive a redirection * target for requests to the given hostname. The geoip targets are cached in \ref geoipCachePath. */ const std::vector geoipHostnames () const; /** * Path containing custom repo variable definitions (configPath()/vars.d). * \see \ref zypp::repo::RepoVarExpand Repo variable expander * \ingroup g_ZC_CONFIGFILES */ Pathname varsPath() const; /** * Whether repository urls should be probed. / config option * repo.add.probe */ bool repo_add_probe() const; /** * Amount of time in minutes that must pass before another refresh. */ unsigned repo_refresh_delay() const; /** * List of locales for which translated package descriptions should be downloaded. */ LocaleSet repoRefreshLocales() const; /** * Whether to use repository alias or name in user messages (progress, * exceptions, ...). * True: use alias, false: use name. */ bool repoLabelIsAlias() const; /** * Whether to use repository alias or name in user messages (progress, * exceptions, ...). Console applications might prefer to use and display * the shorter alias instead of full repository name. * * Default: false; i.e. repo label is 'name' */ void repoLabelIsAlias( bool yesno_r ); /** * Maximum number of concurrent connections for a single transfer */ long download_max_concurrent_connections() const; /** * Minimum download speed (bytes per second) * until the connection is dropped */ long download_min_download_speed() const; /** * Maximum download speed (bytes per second) */ long download_max_download_speed() const; /** * Maximum silent tries */ long download_max_silent_tries() const; /** * Maximum time in seconds that you allow a transfer operation to take. */ long download_transfer_timeout() const; /** Whether to consider using a deltarpm when downloading a package. * Config option download.use_deltarpm (true) */ bool download_use_deltarpm() const; /** Whether to consider using a deltarpm even when rpm is local. * This requires \ref download_use_deltarpm being \c true. * Config option download.use_deltarpm.always (false) */ bool download_use_deltarpm_always() const; /** * Hint which media to prefer when installing packages (download vs. CD). * \see class \ref media::MediaPriority */ bool download_media_prefer_download() const; /** \overload */ bool download_media_prefer_volatile() const { return ! download_media_prefer_download(); } /** * Set \ref download_media_prefer_download to a specific value. */ void set_download_media_prefer_download( bool yesno_r ); /** * Set \ref download_media_prefer_download to the configfiles default. */ void set_default_download_media_prefer_download(); /** Path where media are preferably mounted or downloaded. * Config option download.media_mountdir (/var/adm/mount) * Needs to be a (writable) directory, otherwise /var/tmp is fallback. */ Pathname download_mediaMountdir() const; /** Set alternate value. */ void set_download_mediaMountdir( Pathname newval_r ); /** Reset to zypp.cong default. */ void set_default_download_mediaMountdir(); /** * Commit download policy to use as default. */ DownloadMode commit_downloadMode() const; /** \name Signature checking (repodata and packages) * If \ref gpgcheck is \c on (the default), we will either check the signature * of repo metadata (packages are secured via checksum in the metadata), or the * signature of an rpm package to install if its repo metadata is not signed * or not checked. If \ref gpgcheck is \c off, no checks are performed. * * The default behavior can be altered by explicitly setting \ref repo_gpgcheck and/or * \ref pkg_gpgcheck to perform those checks always (\c on) or never (\c off). * * Explicitly setting \c gpgcheck, \c repo_gpgcheck or \c pkg_gpgcheck in a * repositories \a .repo file will overwrite the defaults here. */ //@{ bool gpgCheck() const; ///< Turn signature checking on/off (on) TriBool repoGpgCheck() const; ///< Check repo matadata signatures (indeterminate - according to gpgcheck) TriBool pkgGpgCheck() const; ///< Check rpm package signatures (indeterminate - according to gpgcheck) void setGpgCheck( bool val_r ); ///< Change the value void setRepoGpgCheck( TriBool val_r ); ///< Change the value void setPkgGpgCheck( TriBool val_r ); ///< Change the value void resetGpgCheck(); ///< Reset to the zconfig default void resetRepoGpgCheck(); ///< Reset to the zconfig default void resetPkgGpgCheck(); ///< Reset to the zconfig default //@} // /** * Directory for equivalent vendor definitions (configPath()/vendors.d) * \ingroup g_ZC_CONFIGFILES */ Pathname vendorPath() const; /** * The resolver's general attitude when resolving jobs. */ ResolverFocus solver_focus() const; /** * Solver regards required packages,patterns,... only */ bool solver_onlyRequires() const; /** * File in which dependencies described which has to be * fulfilled for a running system. */ Pathname solver_checkSystemFile() const; /** * Directory, which may or may not contain files in which * dependencies described which has to be fulfilled for a * running system. */ Pathname solver_checkSystemFileDir() const; /** * Whether vendor check is by default enabled. */ bool solver_allowVendorChange() const; /** DUP tune: Whether to allow version downgrades upon DUP. */ bool solver_dupAllowDowngrade() const; /** DUP tune: Whether to follow package renames upon DUP. */ bool solver_dupAllowNameChange() const; /** DUP tune: Whether to allow package arch changes upon DUP. */ bool solver_dupAllowArchChange() const; /** DUP tune: Whether to allow package vendor changes upon DUP. */ bool solver_dupAllowVendorChange() const; /** * Whether removing a package should also remove no longer needed requirements. */ bool solver_cleandepsOnRemove() const; /** * When committing a dist upgrade (e.g. zypper dup) * a solver testcase is written. It is needed in bugreports, * in case something went wrong. This returns the number of * testcases to keep on the system. Old cases will be deleted, * as new ones are created. Use \c 0 to write no testcase at all. */ unsigned solver_upgradeTestcasesToKeep() const; /** Whether dist upgrade should remove a products dropped packages (true). * * A new product may suggest a list of old and no longer supported * packages (dropped packages). Performing a dist upgrade the solver * may try to delete them, even if they do not cause any dependency * problem. * * Turning this option off, the solver will not try to remove those * packages unless they actually do cause dependency trouble. At any * time you may use zypper to detect orphaned packages, and do the * cleanup manually. Or simply leave them installed as long as you don't * need the disk space. */ bool solverUpgradeRemoveDroppedPackages() const; /** Set \ref solverUpgradeRemoveDroppedPackages to \a val_r. */ void setSolverUpgradeRemoveDroppedPackages( bool val_r ); /** Reset \ref solverUpgradeRemoveDroppedPackages to the \c zypp.conf default. */ void resetSolverUpgradeRemoveDroppedPackages(); /** \name Packages which can be installed in different versions at the same time. * * This returns the config file values (\c names or \c provides:...). The * corresponding packages have the \c multiversionInstall property set. Those * packages will be installed using 'rpm -i', so they will not implicitly obsolete * other installed versions. * * \see \ref sat::SolvableType */ //@{ const std::set & multiversionSpec() const; void multiversionSpec( std::set new_r ); void clearMultiversionSpec(); void addMultiversionSpec( const std::string & name_r ); void removeMultiversionSpec( const std::string & name_r ); //@} /** * Path where zypp can find or create lock file (configPath()/locks) * \ingroup g_ZC_CONFIGFILES */ Pathname locksFile() const; /** * Whether locks file should be read and applied after start (true) */ bool apply_locks_file() const; #if LEGACY(1735) /** * Path where the update items are kept (/var/adm) */ Pathname update_dataPath() const; /** * Path where the update scripts are stored ( /var/adm/update-scripts ) */ Pathname update_scriptsPath() const; /** * Path where the update messages are stored ( /var/adm/update-messages ) */ Pathname update_messagesPath() const; #else /** * Path where the update items are kept (/var/adm) */ static Pathname update_dataPath(); /** * Path where the update scripts are stored ( /var/adm/update-scripts ) */ static Pathname update_scriptsPath(); /** * Path where the update messages are stored ( /var/adm/update-messages ) */ static Pathname update_messagesPath(); #endif /** \name Command to be invoked to send update messages. */ //@{ /** Command definition for sending update messages.*/ std::string updateMessagesNotify() const; /** Set a new command definition (see update.messages.notify in zypp.conf). */ void setUpdateMessagesNotify( const std::string & val_r ); /** Reset to the zypp.conf default. */ void resetUpdateMessagesNotify(); //@} /** \name Options for package installation */ //@{ /** The default \ref target::rpm::RpmInstFlags for \ref ZYppCommitPolicy. * Or-combination of \ref target::rpm::RpmInstFlag. * \code * ZConfig.instance().rpmInstallFlags().testFlag( target::rpm::RPMINST_EXCLUDEDOCS ); * \endcode */ target::rpm::RpmInstFlags rpmInstallFlags() const; //@} /** * Path where ZYpp install history is logged. Defaults to * /var/log/zypp/history. * * \see http://en.opensuse.org/Libzypp/Package_History */ Pathname historyLogFile() const; /** * Defaults to /etc/zypp/credentials.d */ Pathname credentialsGlobalDir() const; /** * Defaults to /etc/zypp/credentials.cat */ Pathname credentialsGlobalFile() const; /** Package telling the "product version" on systems not using /etc/product.d/baseproduct. * * On RHEL, Fedora and others the "product version" is determined by the first package * providing 'system-release'. This value is not hardcoded in YUM and can be configured * with the $distroverpkg variable. * * Defaults to 'system-release'. */ std::string distroverpkg() const; /** \name Plugins */ //@{ /** * Defaults to \c /usr/lib/zypp/plugins */ Pathname pluginsPath() const; /*! * Defaults to a empty string, if no keep spec is defined no kernels are removed */ std::string multiversionKernels() const; //@} public: class Impl; ZConfig(const ZConfig &) = delete; ZConfig(ZConfig &&) = delete; ZConfig &operator=(const ZConfig &) = delete; ZConfig &operator=(ZConfig &&) = delete; /** Dtor */ ~ZConfig(); void notifyTargetChanged(); ///< internal private: friend class RepoManager; template friend class zyppng::RepoManager; /** The builtin config file value. */ Pathname builtinRepoCachePath() const; /** The builtin config file value. */ Pathname builtinRepoMetadataPath() const; /** The builtin config file value. */ Pathname builtinRepoSolvfilesPath() const; /** The builtin config file value. */ Pathname builtinRepoPackagesPath() const; private: friend class Impl; /** Default ctor. */ ZConfig(); /** Pointer to implementation */ RW_pointer > _pimpl; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZCONFIG_H libzypp-17.36.5/zypp/ZYpp.cc000066400000000000000000000064351476576476200156410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYpp.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// // class ZYpp: // ctor and dtor implemented in ZYppFactory.cc std::ostream & operator<<( std::ostream & str, const ZYpp & obj ) { return str << *obj._pimpl; } /////////////////////////////////////////////////////////////////// // // Forward to Impl: // /////////////////////////////////////////////////////////////////// ResPool ZYpp::pool() const { return _pimpl->pool(); } DiskUsageCounter::MountPointSet ZYpp::diskUsage() { return _pimpl->diskUsage(); } void ZYpp::setPartitions(const DiskUsageCounter::MountPointSet &mp) { return _pimpl->setPartitions(mp); } DiskUsageCounter::MountPointSet ZYpp::getPartitions() const { return _pimpl->getPartitions(); } ResPoolProxy ZYpp::poolProxy() const { return _pimpl->poolProxy(); } Resolver_Ptr ZYpp::resolver() const { return _pimpl->resolver(); } KeyRing_Ptr ZYpp::keyRing() const { return _pimpl->keyRing(); } /////////////////////////////////////////////////////////////////// // // Forward to Impl: // /////////////////////////////////////////////////////////////////// Target_Ptr ZYpp::target() const { return _pimpl->target(); } Target_Ptr ZYpp::getTarget() const { return _pimpl->getTarget(); } void ZYpp::initializeTarget( const Pathname & root, bool doRebuild_r ) { _pimpl->initializeTarget( root, doRebuild_r ); } void ZYpp::finishTarget() { _pimpl->finishTarget(); } void ZYpp::setShutdownSignal() { zypp_detail::ZYppImpl::setShutdownSignal(); } void ZYpp::clearShutdownSignal() { zypp_detail::ZYppImpl::clearShutdownSignal(); } ZYppCommitResult ZYpp::commit( const ZYppCommitPolicy & policy_r ) { return _pimpl->commit( policy_r ); } void ZYpp::installSrcPackage( const SrcPackage_constPtr & srcPackage_r ) { _pimpl->installSrcPackage( srcPackage_r ); } ManagedFile ZYpp::provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ) {return _pimpl->provideSrcPackage( srcPackage_r ); } /////////////////////////////////////////////////////////////////// Pathname ZYpp::homePath() const { return _pimpl->homePath(); } Pathname ZYpp::tmpPath() const { return _pimpl->tmpPath(); } void ZYpp::setHomePath( const Pathname & path ) { _pimpl->setHomePath(path); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ZYpp.h000066400000000000000000000113351476576476200154760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYpp.h * */ #ifndef ZYPP_ZYPP_H #define ZYPP_ZYPP_H #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { class Context; } /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace zypp_detail { class ZYppImpl; } class ZYppFactory; class ResPool; class ResPoolProxy; class KeyRing; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYpp // /** * \todo define Exceptions * ZYpp API main interface */ class ZYPP_API ZYpp : private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const ZYpp & obj ); public: using Ptr = shared_ptr; using constPtr = shared_ptr; public: /** * Access to the global resolvable pool. * Same as \ref zypp::ResPool::instance */ ResPool pool() const; /** Pool of ui::Selectable. * Based on the ResPool, ui::Selectable groups ResObjetcs of * same kind and name. */ ResPoolProxy poolProxy() const; DiskUsageCounter::MountPointSet diskUsage(); void setPartitions(const DiskUsageCounter::MountPointSet &mp); DiskUsageCounter::MountPointSet getPartitions() const; public: /** * \throws Exception */ Target_Ptr target() const; /** Same as \ref target but returns NULL if target is not * initialized, instead of throwing. */ Target_Ptr getTarget() const; /** * \throws Exception * Just init the target, dont populate store or pool. * If \c doRebuild_r is \c true, an already existing * database is rebuilt (rpm --rebuilddb ). */ void initializeTarget(const Pathname & root, bool doRebuild_r = false); /** * \throws Exception */ void finishTarget(); /** * To be called from zyppers signal handlers. Sets a shutdown signal * in a signal and thread safe way. */ static void setShutdownSignal(); /** * To be called from zypper code. This resets the shutdown signal state * to normal.. */ static void clearShutdownSignal(); public: using CommitResult = ZYppCommitResult; /** Commit changes and transactions. * \param \ref CommitPolicy * \return \ref CommitResult * \throws Exception */ ZYppCommitResult commit( const ZYppCommitPolicy & policy_r ); /** Install a source package on the Target. * \throws Exception */ void installSrcPackage( const SrcPackage_constPtr & srcPackage_r ); /** Provides a source package on the Target. * \throws Exception */ ManagedFile provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ); public: /** */ Resolver_Ptr resolver() const; KeyRing_Ptr keyRing() const; public: /** Get the path where zypp related plugins store persistent data and caches */ Pathname homePath() const; /** Get the path where zypp related plugins store temp data */ Pathname tmpPath() const; /** set the home, if you need to change it */ void setHomePath( const Pathname & path ); private: /** Factory */ friend class ZYppFactory; using Impl = zypp_detail::ZYppImpl; using Impl_Ptr = shared_ptr; /** Factory ctor */ explicit ZYpp( const Impl_Ptr & impl_r ); private: /** Deleted via shared_ptr */ friend void ::boost::checked_delete(ZYpp*) BOOST_NOEXCEPT; // template inline void checked_delete(T * x) /** Dtor */ ~ZYpp(); private: /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPP_H libzypp-17.36.5/zypp/ZYppCallbacks.h000066400000000000000000001111571476576476200173010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppCallbacks.h * */ #ifndef ZYPP_ZYPPCALLBACKS_H #define ZYPP_ZYPPCALLBACKS_H #include #include #include #include #include #include #include #include #include #include #include #include // bsc#1194597: CurlAuthData must be exposed for zypper /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { class Queue; class FileConflicts; } // namespace sat /////////////////////////////////////////////////////////////////// struct ZYPP_API ProgressReport : public callback::ReportBase { virtual void start( const ProgressData &/*task*/ ) {} virtual bool progress( const ProgressData &/*task*/ ) { return true; } // virtual Action problem( // Repo /*source*/ // , Error /*error*/ // , const std::string &/*description*/ ) // { return ABORT; } virtual void finish( const ProgressData &/*task*/ ) {} }; struct ProgressReportAdaptor { ProgressReportAdaptor( callback::SendReport &report ) : _report(report) , _first(true) {} ProgressReportAdaptor( const ProgressData::ReceiverFnc &fnc, callback::SendReport &report ) : _fnc(fnc) , _report(report) , _first(true) {} bool operator()( const ProgressData &progress ) { if ( _first ) { _report->start(progress); _first = false; } bool value = _report->progress(progress); if ( _fnc ) value &= _fnc(progress); if ( progress.finalReport() ) { _report->finish(progress); } return value; } ProgressData::ReceiverFnc _fnc; callback::SendReport &_report; bool _first; }; //////////////////////////////////////////////////////////////////////////// namespace repo { // progress for downloading a resolvable struct ZYPP_API DownloadResolvableReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE, // ignore this resolvable but continue }; enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error INVALID // the downloaded file is invalid }; /** Hint that package is available in the local cache (no download needed). * This will be the only trigger for an already cached package. */ virtual void infoInCache( Resolvable::constPtr res_r, const Pathname & localfile_r ) {} virtual void start( Resolvable::constPtr /*resolvable_ptr*/ , const Url &/*url*/ ) {} // Dowmload delta rpm: // - path below url reported on start() // - expected download size (0 if unknown) // - download is interruptable // - problems are just informal virtual void startDeltaDownload( const Pathname & /*filename*/, const ByteCount & /*downloadsize*/ ) {} virtual bool progressDeltaDownload( int /*value*/ ) { return true; } virtual void problemDeltaDownload( const std::string &/*description*/ ) {} virtual void finishDeltaDownload() {} // Apply delta rpm: // - local path of downloaded delta // - aplpy is not interruptable // - problems are just informal virtual void startDeltaApply( const Pathname & /*filename*/ ) {} virtual void progressDeltaApply( int /*value*/ ) {} virtual void problemDeltaApply( const std::string &/*description*/ ) {} virtual void finishDeltaApply() {} // return false if the download should be aborted right now virtual bool progress(int /*value*/, Resolvable::constPtr /*resolvable_ptr*/) { return true; } virtual Action problem( Resolvable::constPtr /*resolvable_ptr*/ , Error /*error*/ , const std::string &/*description*/ ) { return ABORT; } /** Detail information about the result of a performed pkgGpgCheck. * * Userdata sent: * \param "ResObject" ResObject::constPtr of the downloaded package (Package or SrcPackage) * \param "Localpath" Pathname to downloaded package on disk * \param "CheckPackageResult" RpmDb::CheckPackageResult of signature check * \param "CheckPackageDetail" RpmDb::CheckPackageDetail logmessages of rpm signature check * * Userdata accepted: * \param "Action" DownloadResolvableReport::Action user advice how to behave on error (ABORT). * If you set just an empty value here, a default problem report will be triggered. * * Legacy data: * \param "Package" Replaced by \c "ResObject" in 16.10.0. Package::constPtr of the package (\c nullptr in case of a SrcPackage) */ virtual void pkgGpgCheck( const UserData & userData_r = UserData() ) {} virtual void finish(Resolvable::constPtr /*resolvable_ptr*/ , Error /*error*/ , const std::string &/*reason*/ ) {} }; // progress for probing a source /** \deprecated Is not sent by zypp. */ struct ZYPP_API ZYPP_DEPRECATED ProbeRepoReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY // retry }; enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error INVALID, // th source is invalid UNKNOWN }; virtual void start(const Url &/*url*/) {} virtual void failedProbe( const Url &/*url*/, const std::string &/*type*/ ) {} virtual void successProbe( const Url &/*url*/, const std::string &/*type*/ ) {} virtual void finish(const Url &/*url*/, Error /*error*/, const std::string &/*reason*/ ) {} virtual bool progress(const Url &/*url*/, int /*value*/) { return true; } virtual Action problem( const Url &/*url*/, Error /*error*/, const std::string &/*description*/ ) { return ABORT; } }; /** \deprecated Is not sent by zypp. */ struct ZYPP_API ZYPP_DEPRECATED RepoCreateReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // skip refresh, ignore failed refresh }; enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error REJECTED, INVALID, // th source is invali UNKNOWN }; virtual void start( const zypp::Url &/*url*/ ) {} virtual bool progress( int /*value*/ ) { return true; } virtual Action problem( const zypp::Url &/*url*/ , Error /*error*/ , const std::string &/*description*/ ) { return ABORT; } virtual void finish( const zypp::Url &/*url*/ , Error /*error*/ , const std::string &/*reason*/ ) {} }; /** \deprecated Is not sent by zypp. */ struct ZYPP_API ZYPP_DEPRECATED RepoReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // skip refresh, ignore failed refresh }; enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error INVALID // th source is invalid }; virtual void start( const ProgressData &/*task*/, const RepoInfo /*repo*/ ) {} virtual bool progress( const ProgressData &/*task*/ ) { return true; } virtual Action problem( Repository /*source*/ , Error /*error*/ , const std::string &/*description*/ ) { return ABORT; } virtual void finish( Repository /*source*/ , const std::string &/*task*/ , Error /*error*/ , const std::string &/*reason*/ ) {} }; ///////////////////////////////////////////////////////////////// } // namespace source /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace media { // media change request callback struct ZYPP_API MediaChangeReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE, // ignore this media in future, not available anymore IGNORE_ID, // ignore wrong medium id CHANGE_URL, // change media URL EJECT // eject the medium }; enum Error { NO_ERROR, NOT_FOUND, // the medie not found at all IO, // error accessing the media INVALID, // media is broken WRONG, // wrong media, need a different one IO_SOFT /**< IO error which can happen on worse connection like timeout exceed */ }; /** * * \param url in: url for which the media is requested, * out: url to use instead of the original one * \param mediumNr requested medium number * \param label label of requested medium * \param error type of error from \ref Error enum * \param description error message (media not desired or error foo occured) * \param devices list of the available devices (for eject) * \param dev_current in: index of the currently used device in the \a devices list * out: index of the devices to be ejected in the \a devices list * \return \ref Action (ABORT by default) */ virtual Action requestMedia( Url & /* url (I/O parameter) */ , unsigned /*mediumNr*/ , const std::string & /* label */ , Error /*error*/ , const std::string & /*description*/ , const std::vector & /* devices */ , unsigned int & /* dev_current (I/O param) */ ) { return ABORT; } }; /////////////////////////////////////////////////////////////////// /// \class ScopedDisableMediaChangeReport /// \brief Temporarily disable MediaChangeReport /// Sometimes helpful to suppress interactive messages connected to /// MediaChangeReport while fallback URLs are avaialble. struct ZYPP_API ScopedDisableMediaChangeReport { /** Disbale MediaChangeReport if \a condition_r is \c true.*/ ScopedDisableMediaChangeReport( bool condition_r = true ); private: shared_ptr > _guard; }; // progress for downloading a file struct ZYPP_API DownloadProgressReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // ignore the failure }; enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error ACCESS_DENIED, // user authent. failed while accessing restricted file ERROR // other error }; virtual void start( const Url &/*file*/, Pathname /*localfile*/ ) {} /** * Download progress. * * \param value Percentage value. * \param file File URI. * \param dbps_avg Average download rate so far. -1 if unknown. * \param dbps_current Current download (cca last 1 sec). -1 if unknown. */ virtual bool progress(int /*value*/, const Url &/*file*/, double dbps_avg = -1, double dbps_current = -1) { return true; } virtual Action problem( const Url &/*file*/ , Error /*error*/ , const std::string &/*description*/ ) { return ABORT; } virtual void finish( const Url &/*file*/ , Error /*error*/ , const std::string &/*reason*/ ) {} }; // progress for concurrently preloading a entire commit struct ZYPP_API CommitPreloadReport : public callback::ReportBase { enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error ACCESS_DENIED, // user authent. failed while accessing restricted file ERROR // other error }; /*! * Prefetch of all files has started */ virtual void start( const UserData &userData = UserData() ) {} /** * Overall Download progress. * * \param value Percentage value. * Userdata sent: * \param dbps_avg Average download rate so far. (type: double) (optional) * \param dbps_current Current download (cca last 1 sec). (type: double) (optional) * \param bytesReceived Already received bytes (type: double) (optional) * \param bytesRequired Bytes we need to download (type: double) (optional) */ virtual bool progress( int value, const UserData &userData = UserData() ) { return true; } /** * File just started to download * * Userdata sent: * \param "Url" Url where this request is downloaded from. (type: zypp::Url) (optional) */ virtual void fileStart( const Pathname &localfile, const UserData &userData = UserData() ) {} /** * File finished to download, Error indicated if it * was successful for not. * * Userdata sent: * \param "Url" zypp::Url where this request is downloaded from (type: zypp::Url) (optional) * \param "description" Description of the error (type: std::String) (optional) */ virtual void fileDone( const Pathname &localfile, Error error, const UserData &userData = UserData() ) {} enum Result { SUCCESS, //< everything was fetched as expected MISS //< some files are missing }; /*! * Prefetch finished */ virtual void finish( Result res, const UserData &userData = UserData() ) {} }; // authentication issues report struct ZYPP_API AuthenticationReport : public callback::ReportBase { /** * Prompt for authentication data. * * \param url URL which required the authentication * \param msg prompt text * \param auth_data input/output object for handling authentication * data. As an input parameter auth_data can be prefilled with * username (from previous try) or auth_type (available * authentication methods aquired from server (only CurlAuthData)). * As an output parameter it serves for sending username, password * or other special data (derived AuthData objects). * \return true if user chooses to continue with authentication, * false otherwise */ virtual bool prompt(const Url & /* url */, const std::string & /* msg */, AuthData & /* auth_data */) { return false; } }; ///////////////////////////////////////////////////////////////// } // namespace media /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { /** Request to display the pre commit message of a patch. */ struct ZYPP_API PatchMessageReport : public callback::ReportBase { /** Display \c patch->message(). * Return \c true to continue, \c false to abort commit. */ virtual bool show( Patch::constPtr & /*patch*/ ) { return true; } }; /** Indicate execution of a patch script. This is a sort of * \c %post script shipped by a package and to be executed * after the package was installed. */ struct ZYPP_API PatchScriptReport : public callback::ReportBase { enum Notify { OUTPUT, PING }; enum Action { ABORT, // abort commit and return error RETRY, // (re)try to execute this script IGNORE // ignore any failue and continue }; /** Start executing the script provided by package. */ virtual void start( const Package::constPtr & /*package*/, const Pathname & /*script path*/ ) {} /** Progress provides the script output. If the script is quiet, * from time to time still-alive pings are sent to the ui. Returning \c FALSE * aborts script execution. */ virtual bool progress( Notify /*OUTPUT or PING*/, const std::string & /*output*/ = std::string() ) { return true; } /** Report error. */ virtual Action problem( const std::string & /*description*/ ) { return ABORT; } /** Report success. */ virtual void finish() {} }; /////////////////////////////////////////////////////////////////// /// \class FindFileConflictstReport /// \brief Check for package file conflicts in commit (after download) /// /// File conflict check requires that all packages are downloaded and /// now available in the cache (need to access the filelists). Missing /// packages are omitted from check and their number is reported in /// \a noFilelist_r. This usually happens if download mode 'as-needed' /// is used. /////////////////////////////////////////////////////////////////// struct ZYPP_API FindFileConflictstReport : public callback::ReportBase { /** * \param progress_r Progress counter for packages to check. * \return \c true to continue, \c false upon user abort request. */ virtual bool start( const ProgressData & progress_r ) { return true; } /** * \param progress_r Progress counter for packages to check. * \param noFilelist_r Queue of so far skipped solvables (no filelist/not yet downloaded). * \return \c true to continue, \c false upon user abort request. */ virtual bool progress( const ProgressData & progress_r, const sat::Queue & noFilelist_r ) { return true; } /** * \param progress_r Progress counter for packages to check. * \param noFilelist_r Queue of skipped solvables (no filelist/not yet downloaded). * \param conflicts_r File conflits queue. * \return \c true to continue, \c false upon user abort request. */ virtual bool result( const ProgressData & progress_r, const sat::Queue & noFilelist_r, const sat::FileConflicts & conflicts_r ) { return true; } }; /////////////////////////////////////////////////////////////////// namespace rpm { // progress for installing a resolvable struct ZYPP_API InstallResolvableReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // ignore the failure }; enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error INVALID // th resolvable is invalid }; // the level of RPM pushing /** \deprecated We fortunately no longer do 3 attempts. */ enum RpmLevel { RPM, RPM_NODEPS, RPM_NODEPS_FORCE //!< only this one used }; virtual void start( Resolvable::constPtr /*resolvable*/ ) {} virtual bool progress(int /*value*/, Resolvable::constPtr /*resolvable*/) { return true; } virtual Action problem( Resolvable::constPtr /*resolvable*/ , Error /*error*/ , const std::string &/*description*/ , RpmLevel /*level*/ ) { return ABORT; } virtual void finish( Resolvable::constPtr /*resolvable*/ , Error /*error*/ , const std::string &/*reason*/ , RpmLevel /*level*/ ) {} /** "rpmout/installpkg": Additional rpm output (sent immediately). * Data: * solvable : satSolvable processed * line : std::reference_wrapper * lineno : unsigned */ static const UserData::ContentType contentRpmout ZYPP_API; }; // progress for removing a resolvable struct ZYPP_API RemoveResolvableReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // ignore the failure }; enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error INVALID // th resolvable is invalid }; virtual void start( Resolvable::constPtr /*resolvable*/ ) {} virtual bool progress(int /*value*/, Resolvable::constPtr /*resolvable*/) { return true; } virtual Action problem( Resolvable::constPtr /*resolvable*/ , Error /*error*/ , const std::string &/*description*/ ) { return ABORT; } virtual void finish( Resolvable::constPtr /*resolvable*/ , Error /*error*/ , const std::string &/*reason*/ ) {} /** "rpmout/removepkg": Additional rpm output (sent immediately). * For data \see \ref InstallResolvableReport::contentRpmout */ static const UserData::ContentType contentRpmout ZYPP_API; }; // progress for rebuilding the database struct ZYPP_API RebuildDBReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // ignore the failure }; enum Error { NO_ERROR, FAILED // failed to rebuild }; virtual void start(Pathname /*path*/) {} virtual bool progress(int /*value*/, Pathname /*path*/) { return true; } virtual Action problem( Pathname /*path*/ , Error /*error*/ , const std::string &/*description*/ ) { return ABORT; } virtual void finish( Pathname /*path*/ , Error /*error*/ , const std::string &/*reason*/ ) {} }; #if LEGACY(17) // progress for converting the database /// \deprecated Still used by y2-bindings in Code15 (libyzpp major 17) struct ZYPP_DEPRECATED ConvertDBReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // ignore the failure }; enum Error { NO_ERROR, FAILED // conversion failed }; virtual void start( Pathname /*path*/ ) {} virtual bool progress( int/*value*/, Pathname/*path*/ ) { return true; } virtual Action problem( Pathname/*path*/, Error/*error*/, const std::string &/*description*/ ) { return ABORT; } virtual void finish( Pathname/*path*/, Error/*error*/, const std::string &/*reason*/ ) {} }; #endif /////////////////////////////////////////////////////////////////// /// \brief Report active throughout the whole rpm transaction. /// /// The report covers events not directly related to an individual /// sub-task. Mostly log lines. /// \todo maybe include the sub-task reports here as well, so it /// becomes the only report needed to follow the transaction. /////////////////////////////////////////////////////////////////// struct ZYPP_API SingleTransReport : public callback::ReportBase { /** \c "zypp-rpm/logline" report a line suitable to be written to the screen. * UserData: * \c "line" : std::reference_wrapper; the line to show * \c "level" : enum class loglevel; rendering hint */ static const UserData::ContentType contentLogline ZYPP_API; /** Rendering hint for log-lines to show. */ enum class loglevel { dbg, msg, war, err, crt }; /** Suggested prefix for log-lines to show. */ static const char *const loglevelPrefix( loglevel level_r ) { switch ( level_r ) { case loglevel::crt: return "fatal error: "; case loglevel::err: return "error: "; case loglevel::war: return "warning: "; case loglevel::msg: return ""; case loglevel::dbg: return "D: "; } return ""; } }; // Generic transaction reports, this is used for verifying and preparing tasks, the name param // for the start function defines which report we are looking at struct ZYPP_API TransactionReportSA : public callback::ReportBase { enum Error { NO_ERROR, // everything went perfectly fine FINISHED_WITH_ERRORS, // the transaction was finished, but some errors happened FAILED // the transaction failed completely }; virtual void start( const std::string &/*name*/, const UserData & = UserData() /*userdata*/ ) {} virtual void progress( int /*value*/, const UserData & = UserData() /*userdata*/ ) { } virtual void finish( Error /*error*/, const UserData & = UserData() /*userdata*/ ) {} /** "zypp-rpm/transactionsa": Additional rpm output (sent immediately). * Data: * line : std::reference_wrapper */ static const UserData::ContentType contentRpmout ZYPP_API; }; // progress for installing a resolvable in single transaction mode struct ZYPP_API InstallResolvableReportSA : public callback::ReportBase { enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error INVALID // th resolvable is invalid }; virtual void start( Resolvable::constPtr /*resolvable*/, const UserData & = UserData() /*userdata*/ ) {} virtual void progress( int /*value*/, Resolvable::constPtr /*resolvable*/, const UserData & = UserData() /*userdata*/ ) { return; } virtual void finish( Resolvable::constPtr /*resolvable*/ , Error /*error*/, const UserData & = UserData() /*userdata*/ ) {} /** "zypp-rpm/installpkgsa": Additional rpm output (sent immediately). * Data: * solvable : satSolvable processed * line : std::reference_wrapper */ static const UserData::ContentType contentRpmout ZYPP_API; }; // progress for removing a resolvable in single transaction mode struct ZYPP_API RemoveResolvableReportSA : public callback::ReportBase { enum Error { NO_ERROR, NOT_FOUND, // the requested Url was not found IO, // IO error INVALID // th resolvable is invalid }; virtual void start( Resolvable::constPtr /*resolvable*/, const UserData & = UserData() /*userdata*/ ) {} virtual void progress( int /*value*/, Resolvable::constPtr /*resolvable*/, const UserData & = UserData() /*userdata*/ ) { return; } virtual void finish( Resolvable::constPtr /*resolvable*/ , Error /*error*/ , const UserData & = UserData() /*userdata*/ ) {} /** "zypp-rpm/removepkgsa": Additional rpm output (sent immediately). * For data \see \ref InstallResolvableReportSA::contentRpmout */ static const UserData::ContentType contentRpmout ZYPP_API; }; // progress for cleaning up the old version of a package after it was upgraded to a new version struct ZYPP_API CleanupPackageReportSA : public callback::ReportBase { enum Error { NO_ERROR }; virtual void start( const std::string & /*nvra*/, const UserData & = UserData() /*userdata*/ ) {} virtual void progress( int /*value*/, const UserData & = UserData() /*userdata*/ ) { return; } virtual void finish( Error /*error*/, const UserData & = UserData() /*userdata*/ ) {} /** "zypp-rpm/cleanupkgsa": Additional rpm output (sent immediately). * For data \see \ref InstallResolvableReportSA::contentRpmout */ static const UserData::ContentType contentRpmout ZYPP_API; }; // progress for script thats executed during a commit transaction // the resolvable can be null, for things like posttrans scripts struct ZYPP_API CommitScriptReportSA : public callback::ReportBase { enum Error { NO_ERROR, WARN, CRITICAL // the script failure prevented solvable installation }; virtual void start( const std::string & /*scriptType*/, const std::string & /*packageName ( can be empty )*/, Resolvable::constPtr /*resolvable ( can be null )*/, const UserData & = UserData() /*userdata*/ ) {} virtual void progress( int /*value*/, Resolvable::constPtr /*resolvable*/, const UserData & = UserData() /*userdata*/ ) { return; } virtual void finish( Resolvable::constPtr /*resolvable*/ , Error /*error*/, const UserData & = UserData() /*userdata*/ ) {} /** "zypp-rpm/scriptsa": Additional rpm output (sent immediately). * Data: * solvable : satSolvable processed ( can be empty ) * line : std::reference_wrapper */ static const UserData::ContentType contentRpmout ZYPP_API; }; ///////////////////////////////////////////////////////////////// } // namespace rpm /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// class PoolQuery; /** \name Locks */ //@{ /** * Callback for cleaning locks which doesn't lock anything in pool. */ struct ZYPP_API CleanEmptyLocksReport : public callback::ReportBase { /** * action performed by cleaning api to specific lock */ enum Action { ABORT, /**< abort and return error */ DELETE, /**< delete empty lock */ IGNORE /**< skip empty lock */ }; /** * result of cleaning */ enum Error { NO_ERROR, /**< no problem */ ABORTED /** cleaning aborted by user */ }; /** * cleaning is started */ virtual void start( ) {} /** * progress of cleaning specifies in percents * \return if continue */ virtual bool progress(int /*value*/) { return true; } /** * When find empty lock ask what to do with it * \return action */ virtual Action execute( const PoolQuery& /*error*/ ) { return DELETE; } /** * cleaning is done */ virtual void finish( Error /*error*/ ) {} }; /** * this callback handles merging old locks with newly added or removed */ struct ZYPP_API SavingLocksReport : public callback::ReportBase { /** * action for old lock which is in conflict * \see ConflictState */ enum Action { ABORT, /**< abort and return error*/ DELETE, /**< delete conflicted lock */ IGNORE /**< skip conflict lock */ }; /** * result of merging */ enum Error { NO_ERROR, /**< no problem */ ABORTED /**< cleaning aborted by user */ }; /** * type of conflict of old and new lock */ enum ConflictState{ SAME_RESULTS, /**< locks lock same item in pool but its parameters are different */ INTERSECT /**< locks lock some file and unlocking lock unlock only part * of iti, so removing old lock can unlock more items in pool */ }; virtual void start() {} /** * merging still live * \return if continue */ virtual bool progress() { return true; } /** * When user unlock something which is locked by non-identical query */ virtual Action conflict( const PoolQuery&, /**< problematic query*/ ConflictState ) { return DELETE; } virtual void finish( Error /*error*/ ) {} }; /////////////////////////////////////////////////////////////////// /// \class JobReport /// \brief Generic report for sending messages. /////////////////////////////////////////////////////////////////// struct ZYPP_API JobReport : public callback::ReportBase { public: /** message type (use like 'enum class \ref MsgType') */ struct EMsgTypeDef { enum Enum { debug, info, warning, error, important, data }; }; typedef base::EnumClass MsgType; ///< 'enum class MsgType' /** typsafe map of userdata */ typedef callback::UserData UserData; public: /** Send a ready to show message text. */ virtual bool message( MsgType type_r, const std::string & msg_r, const UserData & userData_r ) const { return true; } /** \name Static sender instance */ //@{ /** Singleton sender instance */ static callback::SendReport & instance(); // impl in ZYppImpl.cc /** send debug message text */ static bool debug( const std::string & msg_r, const UserData & userData_r = UserData() ) { return instance()->message( MsgType::debug, msg_r, userData_r ); } /** send message text */ static bool info( const std::string & msg_r, const UserData & userData_r = UserData() ) { return instance()->message( MsgType::info, msg_r, userData_r ); } /** send warning text */ static bool warning( const std::string & msg_r, const UserData & userData_r = UserData() ) { return instance()->message( MsgType::warning, msg_r, userData_r ); } /** send error text */ static bool error( const std::string & msg_r, const UserData & userData_r = UserData() ) { return instance()->message( MsgType::error, msg_r, userData_r ); } /** send important message text */ static bool important( const std::string & msg_r, const UserData & userData_r = UserData() ) { return instance()->message( MsgType::important, msg_r, userData_r ); } /** send data message */ static bool data( const std::string & msg_r, const UserData & userData_r = UserData() ) { return instance()->message( MsgType::data, msg_r, userData_r ); } //@} }; /////////////////////////////////////////////////////////////////// /// \class UserDataJobReport /// \brief \ref JobReport convenience sending this instance of \ref UserData with each message. /////////////////////////////////////////////////////////////////// struct ZYPP_API UserDataJobReport : public JobReport::UserData { using JobReport::UserData::UserData; bool debug( const std::string & msg_r ) { return JobReport::debug( msg_r, *this ); } bool info( const std::string & msg_r ) { return JobReport::info( msg_r, *this ); } bool warning( const std::string & msg_r ) { return JobReport::warning( msg_r, *this ); } bool error( const std::string & msg_r ) { return JobReport::error( msg_r, *this ); } bool important( const std::string & msg_r ) { return JobReport::important( msg_r, *this ); } bool data( const std::string & msg_r ) { return JobReport::data( msg_r, *this ); } }; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPPCALLBACKS_H libzypp-17.36.5/zypp/ZYppCommit.h000066400000000000000000000021101476576476200166360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppCommit.h * */ #ifndef ZYPP_ZYPPCOMMIT_H #define ZYPP_ZYPPCOMMIT_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPPCOMMIT_H libzypp-17.36.5/zypp/ZYppCommitPolicy.cc000066400000000000000000000173571476576476200201770ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppCommitPolicy.cc * */ #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// inline bool ImZYPPER() { static bool ret = filesystem::readlink( "/proc/self/exe" ).basename() == "zypper"; return ret; } inline bool singleTransInEnv() { const char *val = ::getenv("ZYPP_SINGLE_RPMTRANS"); return ( val && std::string_view( val ) == "1" ); } inline bool singleTransEnabled() { #ifdef SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER return ImZYPPER(); #else // SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER return ImZYPPER() && singleTransInEnv(); #endif // SINGLE_RPMTRANS_AS_DEFAULT_FOR_ZYPPER } inline bool isPreUsrmerge( const Pathname & root_r ) { // If systems /lib is a directory and not a symlink. return PathInfo( root_r / "lib", PathInfo::LSTAT ).isDir(); } inline bool transactionWillUsrmerge() { // A package providing "may-perform-usrmerge" is going to be installed. const sat::WhatProvides q { Capability("may-perform-usrmerge") }; for ( const auto & pi : q.poolItem() ) { if ( pi.status().isToBeInstalled() ) return true; } return false; } inline bool pendingUsrmerge() { // NOTE: Bug 1189788 - UsrMerge: filesystem package breaks system when // upgraded in a single rpm transaction. Target::Commit must amend this // request depending on whether a UsrMerge may be performed by the // transaction. Target_Ptr target { getZYpp()->getTarget() }; bool ret = target && isPreUsrmerge( target->root() ) && transactionWillUsrmerge(); return ret; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppCommitPolicy::Impl // /////////////////////////////////////////////////////////////////// class ZYppCommitPolicy::Impl { public: Impl() : _restrictToMedia ( 0 ) , _downloadMode ( ZConfig::instance().commit_downloadMode() ) , _rpmInstFlags ( ZConfig::instance().rpmInstallFlags() ) , _syncPoolAfterCommit ( true ) , _singleTransMode ( singleTransEnabled() ) {} public: unsigned _restrictToMedia; DownloadMode _downloadMode; target::rpm::RpmInstFlags _rpmInstFlags; bool _syncPoolAfterCommit; mutable bool _singleTransMode; // mutable: [bsc#1189788] pending usrmerge must disable singletrans private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppCommitPolicy // /////////////////////////////////////////////////////////////////// ZYppCommitPolicy::ZYppCommitPolicy() : _pimpl( new Impl ) {} ZYppCommitPolicy & ZYppCommitPolicy::restrictToMedia( unsigned mediaNr_r ) { _pimpl->_restrictToMedia = ( mediaNr_r == 1 ) ? 1 : 0; return *this; } unsigned ZYppCommitPolicy::restrictToMedia() const { return _pimpl->_restrictToMedia; } ZYppCommitPolicy & ZYppCommitPolicy::dryRun( bool yesNo_r ) { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_TEST, yesNo_r ); return *this; } bool ZYppCommitPolicy::dryRun() const { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_TEST );} ZYppCommitPolicy & ZYppCommitPolicy::downloadMode( DownloadMode val_r ) { _pimpl->_downloadMode = val_r; return *this; } DownloadMode ZYppCommitPolicy::downloadMode() const { if ( singleTransModeEnabled() && _pimpl->_downloadMode == DownloadAsNeeded ) { DBG << _pimpl->_downloadMode << " is not compatible with singleTransMode, falling back to " << DownloadInAdvance << std::endl; return DownloadInAdvance; } return _pimpl->_downloadMode; } ZYppCommitPolicy & ZYppCommitPolicy::rpmInstFlags( target::rpm::RpmInstFlags newFlags_r ) { _pimpl->_rpmInstFlags = newFlags_r; return *this; } ZYppCommitPolicy & ZYppCommitPolicy::rpmNoSignature( bool yesNo_r ) { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_NOSIGNATURE, yesNo_r ); return *this; } ZYppCommitPolicy & ZYppCommitPolicy::rpmExcludeDocs( bool yesNo_r ) { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_EXCLUDEDOCS, yesNo_r ); return *this; } target::rpm::RpmInstFlags ZYppCommitPolicy::rpmInstFlags() const { return _pimpl->_rpmInstFlags; } bool ZYppCommitPolicy::rpmNoSignature() const { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_NOSIGNATURE ); } bool ZYppCommitPolicy::rpmExcludeDocs() const { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_EXCLUDEDOCS ); } ZYppCommitPolicy &ZYppCommitPolicy::allowDowngrade(bool yesNo_r) { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_ALLOWDOWNGRADE, yesNo_r ); return *this; } bool ZYppCommitPolicy::allowDowngrade() const { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_ALLOWDOWNGRADE ); } ZYppCommitPolicy &ZYppCommitPolicy::replaceFiles( bool yesNo_r ) { _pimpl->_rpmInstFlags.setFlag( target::rpm::RPMINST_REPLACEFILES, yesNo_r ); return *this; } bool ZYppCommitPolicy::replaceFiles( ) const { return _pimpl->_rpmInstFlags.testFlag( target::rpm::RPMINST_REPLACEFILES ); } ZYppCommitPolicy & ZYppCommitPolicy::syncPoolAfterCommit( bool yesNo_r ) { _pimpl->_syncPoolAfterCommit = yesNo_r; return *this; } bool ZYppCommitPolicy::syncPoolAfterCommit() const { return _pimpl->_syncPoolAfterCommit; } bool ZYppCommitPolicy::singleTransModeEnabled() const { if ( _pimpl->_singleTransMode and pendingUsrmerge() ) { WAR << "Ignore $ZYPP_SINGLE_RPMTRANS=1: Bug 1189788 - UsrMerge: filesystem package breaks system when upgraded in a single rpm transaction" << std::endl; JobReport::info( "[bsc#1189788] The filesystem package seems to be unable to perform the pending\n" " UsrMerge reliably in a single transaction. The single_rpmtrans\n" " backend will therefore be IGNORED and the transaction is performed\n" " by the classic_rpmtrans backend." , JobReport::UserData( "cmdout", "[bsc#1189788]" ) ); _pimpl->_singleTransMode = false; } return _pimpl->_singleTransMode; } std::ostream & operator<<( std::ostream & str, const ZYppCommitPolicy & obj ) { str << "CommitPolicy("; if ( obj.restrictToMedia() ) str << " restrictToMedia:" << obj.restrictToMedia(); if ( obj.dryRun() ) str << " dryRun"; str << " " << obj.downloadMode(); if ( obj.syncPoolAfterCommit() ) str << " syncPoolAfterCommit"; if ( obj.rpmInstFlags() ) str << " rpmInstFlags{" << str::hexstring(obj.rpmInstFlags()) << "}"; return str << " )"; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ZYppCommitPolicy.h000066400000000000000000000076051476576476200200340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppCommitPolicy.h * */ #ifndef ZYPP_ZYPPCOMMITPOLICY_H #define ZYPP_ZYPPCOMMITPOLICY_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppCommitPolicy // /** Options and policies for ZYpp::commit. * \see \ref ZYpp::commit */ class ZYPP_API ZYppCommitPolicy { public: ZYppCommitPolicy(); public: /** Restrict commit to media 1. * Fake outstanding YCP fix: Honour restriction to media 1 * at installation, but install all remaining packages if * post-boot (called with mediaNr_r > 1). */ ZYppCommitPolicy & restrictToMedia( unsigned mediaNr_r ); /** Process all media (default) */ ZYppCommitPolicy & allMedia() { return restrictToMedia( 0 ); } unsigned restrictToMedia() const; /** Set dry run (default: false). * Dry-run should not change anything on the system, unless * the \ref downloadMode is set to \ref DownloadOnly. In that * case packages are downloaded to the local cache. */ ZYppCommitPolicy & dryRun( bool yesNo_r ); bool dryRun() const; /** Commit download policy to use. (default: \ref DownloadDefault) * \note \ref DownloadOnly also implies a \ref dryRun. */ ZYppCommitPolicy & downloadMode( DownloadMode val_r ); DownloadMode downloadMode() const; /** The default \ref target::rpm::RpmInstFlags. (default: none)*/ ZYppCommitPolicy & rpmInstFlags( target::rpm::RpmInstFlags newFlags_r ); /** Use rpm option --nosignature (default: false) */ ZYppCommitPolicy & rpmNoSignature( bool yesNo_r ); /** Use rpm option --excludedocs (default: false) */ ZYppCommitPolicy & rpmExcludeDocs( bool yesNo_r ); target::rpm::RpmInstFlags rpmInstFlags() const; bool rpmNoSignature() const; bool rpmExcludeDocs() const; /** Allow to replace a newer package with an older one (rollback to a older version). */ ZYppCommitPolicy & allowDowngrade( bool yesNo_r ); bool allowDowngrade() const; /** If enabled it allows installation of packages even if they replace files from other, already installed, packages. */ ZYppCommitPolicy & replaceFiles( bool yesNo_r ); bool replaceFiles() const; /** Kepp pool in sync with the Target databases after commit (default: true) */ ZYppCommitPolicy & syncPoolAfterCommit( bool yesNo_r ); bool syncPoolAfterCommit() const; bool singleTransModeEnabled () const; public: /** Implementation */ class Impl; private: /** Pointer to data. */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates ZYppCommitPolicy Stream output. */ std::ostream & operator<<( std::ostream & str, const ZYppCommitPolicy & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPPCOMMITPOLICY_H libzypp-17.36.5/zypp/ZYppCommitResult.cc000066400000000000000000000101651476576476200202040ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppCommitResult.cc * */ #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppCommitResult::Impl // /////////////////////////////////////////////////////////////////// class ZYppCommitResult::Impl { public: Impl() {} public: Pathname _root; FalseBool _attemptToModify; FalseBool _singleTransactionMode; sat::Transaction _transaction; TransactionStepList _transactionStepList; UpdateNotifications _updateMessages; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppCommitResult // /////////////////////////////////////////////////////////////////// ZYppCommitResult::ZYppCommitResult() : _pimpl( new Impl ) {} ZYppCommitResult::ZYppCommitResult( const ZYppCommitResult & lhs_r ) : _pimpl( lhs_r._pimpl ) {} ZYppCommitResult::ZYppCommitResult( const Pathname & root_r ) : _pimpl( new Impl ) { _pimpl->_root = root_r; } ZYppCommitResult::~ZYppCommitResult() {} const Pathname & ZYppCommitResult::root() const { return _pimpl->_root; } bool ZYppCommitResult::attemptToModify() const { return _pimpl->_attemptToModify; } void ZYppCommitResult::attemptToModify( bool yesno_r ) { _pimpl->_attemptToModify = yesno_r; } bool ZYppCommitResult::singleTransactionMode() const { return _pimpl->_singleTransactionMode; } void ZYppCommitResult::setSingleTransactionMode( bool yesno_r ) { _pimpl->_singleTransactionMode = yesno_r; } const sat::Transaction & ZYppCommitResult::transaction() const { return _pimpl->_transaction; } sat::Transaction & ZYppCommitResult::rTransaction() { return _pimpl->_transaction; } const ZYppCommitResult::TransactionStepList & ZYppCommitResult::transactionStepList() const { return _pimpl->_transactionStepList; } ZYppCommitResult::TransactionStepList & ZYppCommitResult::rTransactionStepList() { return _pimpl->_transactionStepList; } const UpdateNotifications & ZYppCommitResult::updateMessages() const { return _pimpl->_updateMessages; } UpdateNotifications & ZYppCommitResult::rUpdateMessages() { return _pimpl->_updateMessages; } /////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const ZYppCommitResult & obj ) { DefaultIntegral result[4]; for_( it, obj.transaction().actionBegin(), obj.transaction().actionEnd() ) { ++result[0]; switch ( it->stepStage() ) { case sat::Transaction::STEP_DONE : ++result[1]; break; case sat::Transaction::STEP_ERROR : ++result[2]; break; case sat::Transaction::STEP_TODO : ++result[3]; break; } } str << "CommitResult " << " (total " << result[0] << ", done " << result[1] << ", error " << result[2] << ", skipped " << result[3] << ", updateMessages " << obj.updateMessages().size() << ")"; return str; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ZYppCommitResult.h000066400000000000000000000166041476576476200200520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppCommitResult.h * */ #ifndef ZYPP_ZYPPCOMMITRESULT_H #define ZYPP_ZYPPCOMMITRESULT_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace sat { class Transaction; } /** Pair of \ref sat::Solvable and \ref Pathname. */ class UpdateNotificationFile { public: UpdateNotificationFile( sat::Solvable solvable_r, Pathname file_r ) : _solvable( solvable_r ), _file(std::move( file_r )) {} public: sat::Solvable solvable() const { return _solvable; } const Pathname & file() const { return _file; } private: sat::Solvable _solvable; Pathname _file; }; using UpdateNotifications = std::list; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppCommitResult // /** Result returned from ZYpp::commit. * * \note Transaction data are provided and maintained during commit. * Though the interface does not inhibit manipulation of transaction * data outside commit (those methods could have been made \c private:), * this is not recommended as you may easily mess up things. * * \see \ref ZYpp::commit */ class ZYPP_API ZYppCommitResult { public: using TransactionStepList = std::vector; public: ZYppCommitResult(); ZYppCommitResult( const ZYppCommitResult & lhs_r ); ZYppCommitResult( const Pathname & root_r ); ~ZYppCommitResult(); public: /** Remembered root directory of the target. * \Note Pathnames within this class are relative to the * targets root directory. */ const Pathname & root() const; /** \c True if at least one attempt to actually install/remove packages was made. * While this is false there should have been no serious modifications to the system. * Mainly used to detect whether commit failed while preloading the caches or within * the real action. */ bool attemptToModify() const; /** Set \ref attemptToModify */ void attemptToModify( bool yesno_r ); /** * \c True if the commit was executed in one big rpm transaction. This can be used to figure out * when it is required to show more information about which packages failed during the transaction, * because otherwise, that information might get lost in the backlog. */ bool singleTransactionMode() const; void setSingleTransactionMode( bool yesno_r ); /** The full transaction list. * The complete list including transaction steps that do not require * any action (like obsoletes or non-package actions). Depending on * \ref ZYppCommitPolicy::restrictToMedia only a subset of this * transaction might have been executed. * \see \ref transactionStepList. */ const sat::Transaction & transaction() const; /** Manipulate \ref transaction */ sat::Transaction & rTransaction(); /** List of \ref sat::Transaction::Step to be executed by commit. * The list of transaction step commit actually tried to execute. */ const TransactionStepList & transactionStepList() const; /** Manipulate \ref transactionStepList. */ TransactionStepList & rTransactionStepList(); /** List of update messages installed during this commit. * \Note Pathnames are relative to the targets root directory. * \code * ZYppCommitResult result; * ... * if ( ! result.updateMessages().empty() ) * { * MIL << "Received " << result.updateMessages().size() << " update notification(s):" << endl; * for_( it, result.updateMessages().begin(), result.updateMessages().end() ) * { * MIL << "- From " << it->solvable().asString() << " in file " << Pathname::showRootIf( result.root(), it->file() ) << ":" << endl; * { * // store message files content in a string: * InputStream istr( Pathname::assertprefix( result.root(), it->file() ) ); * std::ostringstream strstr; * iostr::copy( istr, strstr ); * std::string message( strstr.str() ); // contains the message * } * { * // or write out the message file indented: * InputStream istr( Pathname::assertprefix( result.root(), it->file() ) ); * iostr::copyIndent( istr, MIL, "> " ) << endl; * } * } * } * \endcode */ const UpdateNotifications & updateMessages() const; /** Manipulate \ref updateMessages * \Note Pathnames are relative to the targets root directory. */ UpdateNotifications & rUpdateMessages(); public: /** \name Some statistics based on \ref Transaction * * Class \ref Transaction allows to count and iterate the action steps to * get more detailed information about the transaction result. Here are just * a few convenience methods for easy evaluation. * * \code * ZYppCommitResult result; * const sat::Transaction & trans( result.transaction() ); * for_( it, trans.actionBegin(~sat::Transaction::STEP_DONE), trans.actionEnd() ) * { * // process all steps not DONE (ERROR and TODO) * if ( it->satSolvable() ) * std::cout << it->satSolvable() << endl; * else // deleted @System solvable: print post mortem data available * std::cout << it->ident() << endl; * } * \endcode * \see \ref Transaction, \ref transaction() */ //@{ /** Whether all steps were performed successfully (none skipped or error) */ bool allDone() const { return transaction().actionEmpty( ~sat::Transaction::STEP_DONE ); } /** Whether an error ocurred (skipped streps are ok). */ bool noError() const { return transaction().actionEmpty( sat::Transaction::STEP_ERROR ); } //@} public: /** Implementation */ class Impl; private: /** Pointer to data. */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates ZYppCommitResult Stream output. */ std::ostream & operator<<( std::ostream & str, const ZYppCommitResult & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPPCOMMITRESULT_H libzypp-17.36.5/zypp/ZYppFactory.cc000066400000000000000000000356421476576476200171730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppFactory.cc * */ extern "C" { #include } #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using boost::interprocess::file_lock; using boost::interprocess::scoped_lock; using boost::interprocess::sharable_lock; using std::endl; namespace zyppintern { void repoVariablesReset(); } // upon re-acquiring the lock... /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace sighandler { /// Signal handler logging a stack trace template class SigBacktraceHandler { static void backtraceHandler( int sig ) { INT << "Error: signal " << SIG << endl << dumpBacktrace << endl; base::LogControl::instance().emergencyShutdown(); ::signal( SIG, lastSigHandler ); } static ::sighandler_t lastSigHandler; }; template ::sighandler_t SigBacktraceHandler::lastSigHandler { ::signal( SIG, SigBacktraceHandler::backtraceHandler ) }; // Explicit instantiation installs the handler: template class SigBacktraceHandler; template class SigBacktraceHandler; } namespace env { /** Hack to circumvent the currently poor --root support. */ inline Pathname ZYPP_LOCKFILE_ROOT() { return getenv("ZYPP_LOCKFILE_ROOT") ? getenv("ZYPP_LOCKFILE_ROOT") : "/"; } } /////////////////////////////////////////////////////////////////// namespace zypp_readonly_hack { ///////////////////////////////////////////////////////////////// static bool active = getenv("ZYPP_READONLY_HACK"); ZYPP_API void IWantIt() // see zypp/zypp_detail/ZYppReadOnlyHack.h { active = true; MIL << "ZYPP_READONLY promised." << endl; } bool IGotIt() { return active; } ///////////////////////////////////////////////////////////////// } // namespace zypp_readonly_hack /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class ZYppGlobalLock /// \brief Our broken global lock /// /////////////////////////////////////////////////////////////////// class ZYppGlobalLock { public: ZYppGlobalLock(Pathname &&lFilePath) : _zyppLockFilePath(std::move(lFilePath)), _zyppLockFile(NULL), _lockerPid(0), _cleanLock(false) { filesystem::assert_dir(_zyppLockFilePath.dirname() ); } ZYppGlobalLock(const ZYppGlobalLock &) = delete; ZYppGlobalLock(ZYppGlobalLock &&) = delete; ZYppGlobalLock &operator=(const ZYppGlobalLock &) = delete; ZYppGlobalLock &operator=(ZYppGlobalLock &&) = delete; ~ZYppGlobalLock() { if ( _cleanLock ) try { // Exception safe access to the lockfile. ScopedGuard closeOnReturn( accessLockFile() ); { scoped_lock flock( _zyppLockFileLock ); // aquire write lock // Truncate the file rather than deleting it. Other processes may // still use it to synchronsize. ftruncate( fileno(_zyppLockFile), 0 ); } MIL << "Cleaned lock file. (" << getpid() << ")" << std::endl; } catch(...) {} // let no exception escape. } pid_t lockerPid() const { return _lockerPid; } const std::string & lockerName() const { return _lockerName; } const Pathname & zyppLockFilePath() const { return _zyppLockFilePath; } private: Pathname _zyppLockFilePath; file_lock _zyppLockFileLock; FILE * _zyppLockFile; pid_t _lockerPid; std::string _lockerName; bool _cleanLock; private: using ScopedGuard = shared_ptr; /** Exception safe access to the lockfile. * \code * // Exception safe access to the lockfile. * ScopedGuard closeOnReturn( accessLockFile() ); * \endcode */ ScopedGuard accessLockFile() { _openLockFile(); return ScopedGuard( static_cast(0), std::bind( std::mem_fn( &ZYppGlobalLock::_closeLockFile ), this ) ); } /** Use \ref accessLockFile. */ void _openLockFile() { if ( _zyppLockFile != NULL ) return; // is open // open pid file rw so we are sure it exist when creating the flock _zyppLockFile = fopen( _zyppLockFilePath.c_str(), "a+" ); if ( _zyppLockFile == NULL ) ZYPP_THROW( Exception( "Cant open " + _zyppLockFilePath.asString() ) ); _zyppLockFileLock = _zyppLockFilePath.c_str(); MIL << "Open lockfile " << _zyppLockFilePath << endl; } /** Use \ref accessLockFile. */ void _closeLockFile() { if ( _zyppLockFile == NULL ) return; // is closed clearerr( _zyppLockFile ); fflush( _zyppLockFile ); // http://www.boost.org/doc/libs/1_50_0/doc/html/interprocess/synchronization_mechanisms.html // If you are using a std::fstream/native file handle to write to the file // while using file locks on that file, don't close the file before releasing // all the locks of the file. _zyppLockFileLock = file_lock(); fclose( _zyppLockFile ); _zyppLockFile = NULL; MIL << "Close lockfile " << _zyppLockFilePath << endl; } bool isProcessRunning( pid_t pid_r ) { // it is another program, not me, see if it is still running Pathname procdir( Pathname("/proc")/str::numstring(pid_r) ); PathInfo status( procdir ); MIL << "Checking " << status << endl; if ( ! status.isDir() ) { DBG << "No such process." << endl; return false; } static char buffer[513]; buffer[0] = buffer[512] = 0; // man proc(5): /proc/[pid]/cmdline is empty if zombie. if ( std::ifstream( (procdir/"cmdline").c_str() ).read( buffer, 512 ).gcount() > 0 ) { _lockerName = buffer; DBG << "Is running: " << _lockerName << endl; return true; } DBG << "In zombie state." << endl; return false; } pid_t readLockFile() { clearerr( _zyppLockFile ); fseek( _zyppLockFile, 0, SEEK_SET ); long readpid = 0; fscanf( _zyppLockFile, "%ld", &readpid ); MIL << "read: Lockfile " << _zyppLockFilePath << " has pid " << readpid << " (our pid: " << getpid() << ") "<< std::endl; return (pid_t)readpid; } void writeLockFile() { clearerr( _zyppLockFile ); fseek( _zyppLockFile, 0, SEEK_SET ); ftruncate( fileno(_zyppLockFile), 0 ); fprintf(_zyppLockFile, "%ld\n", (long)getpid() ); fflush( _zyppLockFile ); _cleanLock = true; // cleanup on exit MIL << "write: Lockfile " << _zyppLockFilePath << " got pid " << getpid() << std::endl; } /*! * Expects the calling function to lock the access lock */ bool safeCheckIsLocked() { _lockerPid = readLockFile(); if ( _lockerPid == 0 ) { // no or empty lock file return false; } else if ( _lockerPid == getpid() ) { // keep my own lock return false; } else { // a foreign pid in lock if ( isProcessRunning( _lockerPid ) ) { WAR << _lockerPid << " is running and has a ZYpp lock. Sorry." << std::endl; return true; } else { MIL << _lockerPid << " is dead. Ignoring the existing lock file." << std::endl; return false; } } } public: bool isZyppLocked() { if ( geteuid() != 0 ) return false; // no lock as non-root // Exception safe access to the lockfile. ScopedGuard closeOnReturn( accessLockFile() ); scoped_lock flock( _zyppLockFileLock ); // aquire write lock return safeCheckIsLocked (); } /** Try to aquire a lock. * \return \c true if zypp is already locked by another process. */ bool zyppLocked() { if ( geteuid() != 0 ) return false; // no lock as non-root // Exception safe access to the lockfile. ScopedGuard closeOnReturn( accessLockFile() ); scoped_lock flock( _zyppLockFileLock ); // aquire write lock if ( !safeCheckIsLocked() ) { writeLockFile(); return false; } return true; } }; /////////////////////////////////////////////////////////////////// namespace { static weak_ptr _theZYppInstance; static scoped_ptr _theGlobalLock; // on/off in sync with _theZYppInstance ZYppGlobalLock & globalLock() { if ( !_theGlobalLock ) _theGlobalLock.reset( new ZYppGlobalLock( ZYppFactory::lockfileDir() / "zypp.pid" ) ); return *_theGlobalLock; } } //namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYpp // /////////////////////////////////////////////////////////////////// ZYpp::ZYpp( const Impl_Ptr & impl_r ) : _pimpl( impl_r ) { ::zyppintern::repoVariablesReset(); // upon re-acquiring the lock... MIL << "ZYpp is on..." << endl; } ZYpp::~ZYpp() { _theGlobalLock.reset(); MIL << "ZYpp is off..." << endl; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppFactoryException // /////////////////////////////////////////////////////////////////// ZYppFactoryException::ZYppFactoryException( std::string msg_r, pid_t lockerPid_r, std::string lockerName_r ) : Exception( std::move(msg_r) ) , _lockerPid( lockerPid_r ) , _lockerName(std::move( lockerName_r )) {} ZYppFactoryException::~ZYppFactoryException() throw () {} /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppFactory // /////////////////////////////////////////////////////////////////// ZYppFactory ZYppFactory::instance() { return ZYppFactory(); } ZYppFactory::ZYppFactory() {} ZYppFactory::~ZYppFactory() {} /////////////////////////////////////////////////////////////////// // ZYpp::Ptr ZYppFactory::getZYpp() const { const auto &makeLockedError = []( pid_t pid, const std::string &lockerName ){ const std::string &t = str::form(_("System management is locked by the application with pid %d (%s).\n" "Close this application before trying again."), pid, lockerName.c_str() ); return ZYppFactoryException(t, pid, lockerName ); }; ZYpp::Ptr _instance = _theZYppInstance.lock(); if ( ! _instance ) { if ( geteuid() != 0 ) { MIL << "Running as user. Skip creating " << globalLock().zyppLockFilePath() << std::endl; } else if ( zypp_readonly_hack::active ) { MIL << "ZYPP_READONLY active." << endl; } else if ( globalLock().zyppLocked() ) { bool failed = true; // bsc#1184399,1213231: A negative ZYPP_LOCK_TIMEOUT will wait forever. const long LOCK_TIMEOUT = str::strtonum( getenv( "ZYPP_LOCK_TIMEOUT" ) ); if ( LOCK_TIMEOUT != 0 ) { Date logwait = Date::now(); Date giveup; /* 0 = forever */ if ( LOCK_TIMEOUT > 0 ) { giveup = logwait+LOCK_TIMEOUT; MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Waiting for the zypp lock until " << giveup << endl; } else MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Waiting for the zypp lock..." << endl; unsigned delay = 0; do { if ( delay < 60 ) delay += 1; else { Date now { Date::now() }; if ( now - logwait > Date::day ) { WAR << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Another day has passed waiting for the zypp lock..." << endl; logwait = now; } } sleep( delay ); { zypp::base::LogControl::TmpLineWriter shutUp; // be quiet failed = globalLock().zyppLocked(); } } while ( failed && ( not giveup || Date::now() <= giveup ) ); if ( failed ) { MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Gave up waiting for the zypp lock." << endl; } else { MIL << "$ZYPP_LOCK_TIMEOUT=" << LOCK_TIMEOUT << " sec. Finally got the zypp lock." << endl; } } if ( failed ) ZYPP_THROW( makeLockedError( globalLock().lockerPid(), globalLock().lockerName() )); // we got the global lock, now make sure zypp-rpm is not still running { ZYppGlobalLock zyppRpmLock( ZYppFactory::lockfileDir() / "zypp-rpm.pid" ); if ( zyppRpmLock.isZyppLocked () ) { // release global lock, we will exit now _theGlobalLock.reset(); ZYPP_THROW( makeLockedError( zyppRpmLock.lockerPid(), zyppRpmLock.lockerName() )); } } } // Here we go... static ZYpp::Impl_Ptr _theImplInstance; // for now created once if ( !_theImplInstance ) _theImplInstance.reset( new ZYpp::Impl ); _instance.reset( new ZYpp( _theImplInstance ) ); _theZYppInstance = _instance; } return _instance; } /////////////////////////////////////////////////////////////////// // bool ZYppFactory::haveZYpp() const { return !_theZYppInstance.expired(); } zypp::Pathname ZYppFactory::lockfileDir() { return env::ZYPP_LOCKFILE_ROOT() / "run"; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ZYppFactory & obj ) { return str << "ZYppFactory"; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ZYppFactory.h000066400000000000000000000050521476576476200170250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ZYppFactory.h * */ #ifndef ZYPP_ZYPPFACTORY_H #define ZYPP_ZYPPFACTORY_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class ZYPP_API ZYppFactoryException : public Exception { public: ZYppFactoryException( std::string msg_r, pid_t lockerPid_r, std::string lockerName_r ); ~ZYppFactoryException() throw () override; public: pid_t lockerPid() const { return _lockerPid; } const std::string & lockerName() const { return _lockerName; } private: pid_t _lockerPid; std::string _lockerName; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppFactory // /** ZYpp factory class (Singleton) */ class ZYPP_API ZYppFactory { friend std::ostream & operator<<( std::ostream & str, const ZYppFactory & obj ); public: /** Singleton ctor */ static ZYppFactory instance(); /** Dtor */ ~ZYppFactory(); public: /** \return Pointer to the ZYpp instance. * \throw EXCEPTION In case we can't acquire a lock. */ ZYpp::Ptr getZYpp() const; /** Whether the ZYpp instance is already created.*/ bool haveZYpp() const; static zypp::Pathname lockfileDir (); private: /** Default ctor. */ ZYppFactory(); }; /////////////////////////////////////////////////////////////////// /** \relates ZYppFactory Stream output */ std::ostream & operator<<( std::ostream & str, const ZYppFactory & obj ); /** \relates ZYppFactory Convenience to get the Pointer * to the ZYpp instance. * \see ZYppFactory::getZYpp */ inline ZYpp::Ptr getZYpp() { return ZYppFactory::instance().getZYpp(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPPFACTORY_H libzypp-17.36.5/zypp/base/000077500000000000000000000000001476576476200153325ustar00rootroot00000000000000libzypp-17.36.5/zypp/base/Algorithm.h000066400000000000000000000053301476576476200174320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Algorithm.h * */ #ifndef ZYPP_BASE_ALGORITHM_H #define ZYPP_BASE_ALGORITHM_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Iterate through [begin_r,end_r) and invoke \a fnc_r * on each item that passes \a filter_r. * * Iteration aborts if \a fnc_r returns \c false. * * \return Number of invokations of \a fnc_r, negative if * loop was aborted by \a fnc_. */ template inline int invokeOnEach( TIterator begin_r, TIterator end_r, TFilter filter_r, TFunction fnc_r ) { int cnt = 0; for ( TIterator it = begin_r; it != end_r; ++it ) { if ( filter_r( *it ) ) { ++cnt; if ( ! fnc_r( *it ) ) return -cnt; } } return cnt; } /** Iterate through [begin_r,end_r) and invoke \a fnc_r * on each item. * * Iteration aborts if \a fnc_r returns \c false. * * \return Number of invokations of \a fnc_r, negative if * loop was aborted by \a fnc_. */ template inline int invokeOnEach( TIterator begin_r, TIterator end_r, TFunction fnc_r ) { int cnt = 0; for ( TIterator it = begin_r; it != end_r; ++it ) { ++cnt; if ( ! fnc_r( *it ) ) return -cnt; } return cnt; } template bool contains ( const Container &c, const Elem &elem ) { return ( std::find( c.begin(), c.end(), elem ) != c.end() ); } template bool any_of ( const Container &c, Fnc &&cb ) { return std::any_of( c.begin(), c.end(), std::forward(cb) ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_ALGORITHM_H libzypp-17.36.5/zypp/base/Backtrace.cc000066400000000000000000000066601476576476200175300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Backtrace.cc */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { std::ostream & dumpBacktrace( std::ostream & stream_r ) { // get void*'s for all entries on the stack static const size_t arraySize = 50; void *array[arraySize]; size_t size = ::backtrace( array, arraySize ); // Print out all frames to stderr. Separate sigsegvHandler stack // [dumpBacktrace][sigsegvHandler][libc throwing] from actual // code stack. char ** messages = ::backtrace_symbols( array, size ); if ( messages ) { static const size_t handlerStack = 3; // [dumpBacktrace][sigsegvHandler][libc throwing] static const size_t first = 0; for ( size_t i = first; i < size; ++i ) { char * mangled_name = 0; char * offset_begin = 0; char * offset_end = 0; // find parentheses and +address offset surrounding mangled name for ( char * p = messages[i]; *p; ++p ) { if ( *p == '(' ) { mangled_name = p; } else if ( *p == '+' ) { offset_begin = p; } else if ( *p == ')' ) { offset_end = p; break; } } int btLevel = i-handlerStack; // negative level in sigsegvHandler if ( i > first ) { stream_r << endl; if ( btLevel == 0 ) stream_r << "vvvvvvvvvv----------------------------------------" << endl; } stream_r << "[" << (btLevel<0 ?"hd":"bt") << "]: (" << btLevel << ") "; // if the line could be processed, attempt to demangle the symbol if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) { *mangled_name++ = '\0'; *offset_begin++ = '\0'; *offset_end++ = '\0'; int status = 0; char * real_name = ::abi::__cxa_demangle( mangled_name, 0, 0, &status ); // if demangling is successful, output the demangled function name if ( status == 0 ) { stream_r << messages[i] << " : " << real_name << "+" << offset_begin << offset_end; } // otherwise, output the mangled function name else { stream_r << messages[i] << " : " << mangled_name << "+" << offset_begin << offset_end; } ::free( real_name ); } else { // otherwise, print the whole line stream_r << messages[i]; } } ::free( messages ); } return stream_r; } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/base/Backtrace.h000066400000000000000000000025071476576476200173660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Backtrace.h */ #ifndef ZYPP_BASE_BACKTRACE_H #define ZYPP_BASE_BACKTRACE_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /** Dump current stack trace to a stream. * Thanks to http://stackoverflow.com/questions/77005. * \code * #include * std::cerr << zypp::dumpBacktrace << std::endl; * \endcode * \code * #include * std::string trace( str::Str() << zypp::dumpBacktrace ); * \endcode */ std::ostream & dumpBacktrace( std::ostream & stream_r ) ZYPP_API; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_BACKTRACE_H libzypp-17.36.5/zypp/base/Collector.h000066400000000000000000000045301476576476200174330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Collector.h * */ #ifndef ZYPP_BASE_COLLECTOR_H #define ZYPP_BASE_COLLECTOR_H /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace functor { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Collector // /** Functor feeding values to an output_iterator. * * \code * LocaleSet locales; * for_each( begin(), end(), * collector( std::inserter( locales_r, locales_r.begin() ) ) ); * \endcode * * \see Convenience constructor \ref collector. */ template struct Collector { Collector( TOutputIterator iter_r ) : _iter( iter_r ) {} template bool operator()( const Tp & value_r ) const { *_iter++ = value_r; return true; } private: mutable TOutputIterator _iter; }; /////////////////////////////////////////////////////////////////// /** \relates Collector Convenience constructor. */ template inline Collector collector( TOutputIterator iter_r ) { return Collector( iter_r ); } /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace functor /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_COLLECTOR_H libzypp-17.36.5/zypp/base/Counter.h000066400000000000000000000030221476576476200171170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Counter.h * */ #ifndef ZYPP_BASE_COUNTER_H #define ZYPP_BASE_COUNTER_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Counter // /** Integral type with initial value \c 0. */ template class Counter { public: Counter( TInt value_r = TInt(0) ) : _value( TInt( value_r ) ) {} operator TInt &() { return _value; } operator const TInt &() const { return _value; } public: TInt _value; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_COUNTER_H libzypp-17.36.5/zypp/base/Debug.h000066400000000000000000000146641476576476200165440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Debug.h * * Debuging tools which should not be used in released code. */ #ifndef ZYPP_NDEBUG #warning ZYPP_BASE_DEBUG_H included #ifndef ZYPP_BASE_DEBUG_H #define ZYPP_BASE_DEBUG_H #include //#include //#include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace debug { ///////////////////////////////////////////////////////////////// /** \defgroup DEBUG Debug tools */ #define TAG INT << __PRETTY_FUNCTION__ << std::endl /** 'ps v' */ inline std::ostream & dumpMemOn( std::ostream & str, const std::string & msg = std::string() ) { static std::string mypid( str::numstring( getpid() ) ); const char* argv[] = { "ps", "v", mypid.c_str(), NULL }; ExternalProgram prog(argv,ExternalProgram::Discard_Stderr, false, -1, true); str << "MEMUSAGE " << msg << std::endl; for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) str << line; prog.close(); return str; } /////////////////////////////////////////////////////////////////// /** \defgroup DBG_TRACER Tracer * \ingroup DEBUG */ //@{ /** Base for a simple tracer. Provides an enum indicating which * traced functions were called. */ struct TraceCADBase { enum What { CTOR, COPYCTOR, MOVECTOR, ASSIGN, MOVEASSIGN, DTOR, PING }; std::string _ident; }; /** \relates TraceCADBase Stream output of TraceCADBase::What. */ inline std::ostream & operator<<( std::ostream & str, TraceCADBase::What obj ) { switch( obj ) { case TraceCADBase::CTOR: return str << "CTOR"; case TraceCADBase::COPYCTOR: return str << "COPYCTOR"; case TraceCADBase::MOVECTOR: return str << "MOVECTOR"; case TraceCADBase::ASSIGN: return str << "ASSIGN"; case TraceCADBase::MOVEASSIGN: return str << "MOVEASSIGN"; case TraceCADBase::DTOR: return str << "DTOR"; case TraceCADBase::PING: return str << "PING"; } return str; } /** A simple tracer for (copy) Construction, Assignment, and * Destruction. To trace class Foo, derive public from * TraceCAD. This tracer simply calls traceCAD in each * traced method, and traceCAD simply drops a line in the log. * * This tracer logs construction, copy construction, assignment, * destruction and ping. * * assignment: In case the traced class defines an operator= * it must be altered to call TraceCAD::operator=, otherwise it * won't be triggered. * * ping: Completely up to you. Call ping somewhere in the traced * class to indicate something. In case you overload traceCAD, do * whatever is appropriate on ping. It's just an offer to perform * logging or actions here, and not in the traced code. * * But traceCAD may be overloaded to produce more stats. * * \see \c Example.COW_debug.cc. */ template struct TraceCAD : public base::ProvideNumericId, unsigned long> , public TraceCADBase { static unsigned long & _totalTraceCAD() { static unsigned long _val = 0; return _val; } TraceCAD() { _ident = __PRETTY_FUNCTION__; ++_totalTraceCAD(); traceCAD( CTOR, *this, *this ); } TraceCAD( const TraceCAD & rhs ) { ++_totalTraceCAD(); traceCAD( COPYCTOR, *this, rhs ); } TraceCAD( TraceCAD && rhs ) noexcept { ++_totalTraceCAD(); traceCAD( MOVECTOR, *this, rhs ); } TraceCAD & operator=( const TraceCAD & rhs ) { traceCAD( ASSIGN, *this, rhs ); return *this; } TraceCAD & operator=( TraceCAD && rhs ) noexcept { traceCAD( MOVEASSIGN, *this, rhs ); return *this; } virtual ~TraceCAD() { --_totalTraceCAD(); traceCAD( DTOR, *this, *this ); } void ping() const { traceCAD( PING, *this, *this ); } }; /** \relates TraceCAD Stream output. */ template inline std::ostream & operator<<( std::ostream & str, const TraceCAD & obj ) { return str << "(ID " << obj.numericId() << ", TOTAL " << obj._totalTraceCAD() << ") [" << &obj << "] "; } /** Drop a log line about the traced method. Overload to * fit your needs. */ template void traceCAD( TraceCADBase::What what_r, const TraceCAD & self_r, const TraceCAD & rhs_r ) { switch( what_r ) { case TraceCADBase::CTOR: case TraceCADBase::PING: case TraceCADBase::DTOR: L_DBG("DEBUG") << what_r << self_r << " (" << self_r._ident << ")" << std::endl; break; case TraceCADBase::COPYCTOR: case TraceCADBase::MOVECTOR: case TraceCADBase::ASSIGN: case TraceCADBase::MOVEASSIGN: L_DBG("DEBUG") << what_r << self_r << "( " << rhs_r << ")" << " (" << self_r._ident << ")" << std::endl; break; } } //@} /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace debug /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_DEBUG_H #endif // ZYPP_NDEBUG libzypp-17.36.5/zypp/base/DefaultIntegral.h000066400000000000000000000000521476576476200205520ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/DrunkenBishop.h000066400000000000000000000000541476576476200202550ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/DtorReset.h000066400000000000000000000000441476576476200174140ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Easy.h000066400000000000000000000000411476576476200163770ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/EnumClass.h000066400000000000000000000000461476576476200173750ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Env.h000066400000000000000000000046061476576476200162410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Env.h */ #ifndef ZYPP_BASE_ENV_H #define ZYPP_BASE_ENV_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace env { /////////////////////////////////////////////////////////////////// /// \class ScopedSet /// \brief Temporarily set/unset an environment variable /// \ingroup g_RAII struct ScopedSet { ScopedSet( const ScopedSet & ) = delete; ScopedSet & operator=( const ScopedSet & ) = delete; ScopedSet( ScopedSet && ) = default; ScopedSet & operator=( ScopedSet && ) = default; public: /** Default ctor (NOOP). */ ScopedSet() {} /** Set \a var_r to \a val_r (unsets \a var_r if \a val_r is a \c nullptr). */ ScopedSet( std::string var_r, const char * val_r ) : _var { std::move(var_r) } { if ( !_var.empty() ) { if ( const char * orig = ::getenv( _var.c_str() ) ) _val.reset( new std::string( orig ) ); setval( val_r ); } } /** Restore the original setting. */ ~ScopedSet() { if ( !_var.empty() ) setval( _val ? _val->c_str() : nullptr ); } private: void setval( const char * val_r ) { if ( val_r ) ::setenv( _var.c_str(), val_r, 1 ); else ::unsetenv( _var.c_str() ); } private: std::string _var; std::unique_ptr _val; }; } // namespace env /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_ENV_H libzypp-17.36.5/zypp/base/Errno.h000066400000000000000000000000421476576476200165640ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Exception.h000066400000000000000000000000461476576476200174410ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/ExternalDataSource.h000066400000000000000000000000571476576476200212420ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Flags.h000066400000000000000000000000421476576476200165330ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Function.h000066400000000000000000000000451476576476200172670ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Functional.h000066400000000000000000000200231476576476200176020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Functional.h * */ #ifndef ZYPP_BASE_FUNCTIONAL_H #define ZYPP_BASE_FUNCTIONAL_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace functor { ///////////////////////////////////////////////////////////////// /** \defgroup LOGICALFILTERS Functors for building compex queries. * \ingroup g_Functor * * Some logical functors to build more complex queries: * * \li \ref True and \ref False. No supprise, they always return * \c true or \c false. * \li \ref Not\. TCondition is a functor, and * its result is inverted. * \li \ref Chain\. \c TACondition and \c TBCondition * are functors, and Chain evaluates TACondition && TBCondition. * * As it's no fun to get and write the correct template arguments, * convenience functions creating the correct functor are provided. * * \li \c true_c and \c false_c. (provided just to match the schema) * \li \c not_c. Takes a functor as argument and returns the appropriate * \ref Not functor. * \li \c chain. Takes two functors and returns the appropriate * \ref Cain functor. * * \code * struct Print; // functor printing elements * struct Count; // functor counting number of elements * * std::for_each( c.begin(), c.end(), * chain( Print(), Count() ) ); * \endcode */ //@{ /* functor that always returns a copied value */ template struct Constant { Constant( const TConst &value ) : _value(value) {} template TConst operator()( Tp ) const { return _value; } TConst operator()() const { return _value; } TConst _value; }; template inline Constant constant( const TConst &value ) { return Constant(value); } /** Logical functor always \c true. */ struct True { template bool operator()( Tp ) const { return true; } }; /** Convenience function for creating a True. */ inline True true_c() { return True(); } /** Logical functor always \c false. */ struct False { template bool operator()( Tp ) const { return false; } }; /** Convenience function for creating a False. */ inline False false_c() { return False(); } /** Logical functor inverting \a TCondition. */ template struct Not { Not( TCondition cond_r ) : _cond( cond_r ) {} template bool operator()( Tp t ) const { return ! _cond( t ); } TCondition _cond; }; /** Convenience function for creating a Not from \a TCondition. */ template inline Not not_c( TCondition cond_r ) { return Not( cond_r ); } /** Logical functor chaining \a TACondition \c OR \a TBCondition. */ template struct Or { Or( TACondition conda_r, TBCondition condb_r ) : _conda( conda_r ) , _condb( condb_r ) {} template bool operator()( Tp t ) const { return _conda( t ) || _condb( t ); } TACondition _conda; TBCondition _condb; }; /** Convenience function for creating a Or from two conditions * \a conda_r OR \a condb_r. */ template inline Or or_c( TACondition conda_r, TBCondition condb_r ) { return Or( conda_r, condb_r ); } /** Logical functor chaining \a TACondition \c AND \a TBCondition. */ template struct Chain { Chain( TACondition conda_r, TBCondition condb_r ) : _conda( conda_r ) , _condb( condb_r ) {} template bool operator()( Tp t ) const { return _conda( t ) && _condb( t ); } TACondition _conda; TBCondition _condb; }; /** Convenience function for creating a Chain from two conditions * \a conda_r and \a condb_r. */ template inline Chain chain( TACondition conda_r, TBCondition condb_r ) { return Chain( conda_r, condb_r ); } //@} /////////////////////////////////////////////////////////////////// /** \defgroup ACTIONFUNCTOR * \ingroup g_Functor */ //@{ /** Strore the 1st result found in the variable passed to the ctor. * \code * PoolItem result; * invokeOnEach( pool.byIdentBegin(installed), pool.byIdentEnd(installed), * filter::SameItem( installed ), * getFirst( result ) ); * \endcode */ template struct GetFirst { GetFirst( Tp & result_r ) : _result( &result_r ) {} bool operator()( const Tp & val_r ) { *_result = val_r; return false; } private: Tp * _result; }; /** Convenience function for creating \ref GetFirst. */ template GetFirst getFirst( Tp & result_r ) { return GetFirst( result_r ); } /** Strore the last result found in the variable passed to the ctor. */ template struct GetLast { GetLast( Tp & result_r ) : _result( &result_r ) {} bool operator()( const Tp & val_r ) { *_result = val_r; return true; } private: Tp * _result; }; /** Convenience function for creating \ref GetLast. */ template GetLast getLast( Tp & result_r ) { return GetLast( result_r ); } /** Store all results found to some output_iterator. * \code * std::vector result; * parser::ProductFileReader::scanDir( functor::getAll( std::back_inserter( result ) ), sysRoot / "etc/products.d" ); * \endcode */ template struct GetAll { GetAll( TOutputIterator result_r ) : _result( result_r ) {} template bool operator()( const Tp & val_r ) const { *(_result++) = val_r; return true; } private: mutable TOutputIterator _result; }; /** Convenience function for creating \ref GetAll. */ template GetAll getAll( TOutputIterator result_r ) { return GetAll( result_r ); } //@} /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace functor /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_FUNCTIONAL_H libzypp-17.36.5/zypp/base/Gettext.h000066400000000000000000000000441476576476200171250ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/GzStream.h000066400000000000000000000000431476576476200172340ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Hash.h000066400000000000000000000000411476576476200163610ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/IOStream.h000066400000000000000000000000451476576476200171650ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/IOTools.h000066400000000000000000000000441476576476200170310ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/InputStream.h000066400000000000000000000000461476576476200177560ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Iterable.h000066400000000000000000000000451476576476200172310ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Iterator.h000066400000000000000000000000451476576476200172730ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Json.h000066400000000000000000000310061476576476200164140ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Json.h * */ #ifndef ZYPP_BASE_JSON_H #define ZYPP_BASE_JSON_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace json { // JSN Keywords inline static const std::string & nullJSON() { static const std::string _s( "null" ); return _s; } inline static const std::string & trueJSON() { static const std::string _s( "true" ); return _s; } inline static const std::string & falseJSON() { static const std::string _s( "false" ); return _s; } /////////////////////////////////////////////////////////////////// namespace detail { inline std::string strEncode( std::string val_r ) { typedef unsigned char uchar; std::string::size_type add = 2; // enclosing "s for_( r, val_r.begin(), val_r.end() ) { if ( uchar(*r) < 32u ) { switch ( *r ) { case '\b': case '\f': case '\n': case '\r': case '\t': add += 1; // "\c" break; default: add += 5; // "\uXXXX" break; } } else { switch ( *r ) { case '"': case '/': case '\\': add += 1; // \-escape break; } } } val_r.resize( val_r.size() + add, '@' ); auto w( val_r.rbegin() ); auto r( w + add ); *w++ = '"'; for ( ; r != val_r.rend(); ++r ) { if ( uchar(*r) < 32u ) { static const char * digit = "0123456789abcdef"; switch ( *r ) { case '\b': // "\c" *w++ = 'b'; *w++ = '\\'; break; case '\f': // "\c" *w++ = 'f'; *w++ = '\\'; break; case '\n': // "\c" *w++ = 'n'; *w++ = '\\'; break; case '\r': // "\c" *w++ = 'r'; *w++ = '\\'; break; case '\t': // "\c" *w++ = 't'; *w++ = '\\'; break; default: // "\uXXXX" *w++ = digit[uchar(*r) % 15]; *w++ = digit[uchar(*r) / 16]; *w++ = '0'; *w++ = '0'; *w++ = 'u'; *w++ = '\\'; break; } } else { switch ( (*w++ = *r) ) { case '"': case '/': case '\\': // \-escape *w++ = '\\'; break; } } } *w++ = '"'; return val_r; } } // namespace detail /////////////////////////////////////////////////////////////////// // null inline std::string toJSON( void ) { return nullJSON(); } inline std::string toJSON( std::nullptr_t ) { return nullJSON(); } // bool inline std::string toJSON( bool val_r ) { return val_r ? trueJSON() : falseJSON(); } inline std::string toJSON( const void * val_r ) { return val_r ? trueJSON() : falseJSON(); } // numbers inline std::string toJSON( short val_r ) { return str::numstring( val_r ); } inline std::string toJSON( unsigned short val_r ) { return str::numstring( val_r ); } inline std::string toJSON( int val_r ) { return str::numstring( val_r ); } inline std::string toJSON( unsigned val_r ) { return str::numstring( val_r ); } inline std::string toJSON( long val_r ) { return str::numstring( val_r ); } inline std::string toJSON( unsigned long val_r ) { return str::numstring( val_r ); } inline std::string toJSON( long long val_r ) { return str::numstring( val_r ); } inline std::string toJSON( unsigned long long val_r ){ return str::numstring( val_r ); } // strings inline std::string toJSON( const char val_r ) { return detail::strEncode( std::string( 1, val_r ) ); } inline std::string toJSON( const char * val_r ) { return val_r ? detail::strEncode( val_r ) : nullJSON(); } inline std::string toJSON( const std::string & val_r ){ return detail::strEncode( val_r ); } // container to Array template std::string toJSON( const std::vector & cont_r ); template std::string toJSON( const std::list & cont_r ); template std::string toJSON( const std::set & cont_r ); // map to Object template std::string toJSON( const std::map & cont_r ); /** Type to JSON string representation. * This can be implemented as non-static memberfunction \c asJSON, * or as non-memberfunction \c toJSON; * \code * class Type; * std::string Type::asJSON() const; * std::string toJSON( const Type & ); * \endcode */ template std::string toJSON( const T & val_r ) { return val_r.asJSON(); } /////////////////////////////////////////////////////////////////// /// \class Value /// \brief JSON representation of datatypes via \ref toJSON /// \code /// namespace mynamspace /// { /// struct Mydata /// {...}; /// /// std::string toJSON( const Mydata & ) /// { return json::Array{ "answer", 42 }.asJSON(); } /// } /// /// mynamspace::Mydata data; /// json::Object bigone { /// { "mydata", data }, /// { "panic", false }, /// { "nested", json::Object{ {"one",1}, {"two",2}, {"three",3} } } /// }; /// /// cout << bigone << endl; ///\endcode /// \see http://www.json.org/ /////////////////////////////////////////////////////////////////// struct Value { /** Default ctor (null) */ Value() : _data( toJSON() ) {} /** Copy ctor */ Value( const Value & rhs ) : _data( rhs._data ) {} /** Ctor creating a JSON representation of \a T via \ref toJSON(T) */ template Value( const T & val_r ) : _data( toJSON( val_r ) ) {} /** JSON representation */ const std::string & asJSON() const { return _data; } /** String representation */ const std::string & asString() const { return asJSON(); } /** Stream output */ std::ostream & dumpOn( std::ostream & str ) const { return str << _data; } private: std::string _data; }; /** \relates Value Stream output */ inline std::ostream & operator<<( std::ostream & str, const Value & obj ) { return obj.dumpOn( str ); } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class String /// \brief JSON string /// Force representation as JSON string, mapping e.g. \c null values /// to an empty string. Maninly used in \ref Object as key. /////////////////////////////////////////////////////////////////// struct String : public Value { String() : Value( "" ) {} String( std::nullptr_t ) : Value( "" ) {} String( const char val_r ) : Value( val_r ) {} String( const char * val_r ) : Value( val_r ? val_r : "" ) {} String( const std::string & val_r ): Value( val_r ) {} }; /////////////////////////////////////////////////////////////////// /// \class Array /// \brief JSON array /////////////////////////////////////////////////////////////////// struct Array { Array() {} /** Construct from container iterator */ template Array( Iterator begin, Iterator end ) { for_( it, begin, end ) add( *it ); } /** Construct from container initializer list { v1, v2,... } */ Array( const std::initializer_list & contents_r ) : Array( contents_r.begin(), contents_r.end() ) {} /** Push JSON Value to Array */ void add( const Value & val_r ) { _data.push_back( val_r.asJSON() ); } /** \overload from container initializer list { v1, v2,... } */ void add( const std::initializer_list & contents_r ) { for_( it, contents_r.begin(), contents_r.end() ) add( *it ); } /** JSON representation */ std::string asJSON() const { return str::Str() << *this; } /** String representation */ std::string asString() const { return asJSON(); } /** Stream output */ std::ostream & dumpOn( std::ostream & str ) const { if ( _data.empty() ) return str << "[]"; str << '[' << *_data.begin(); for_( val, ++_data.begin(), _data.end() ) str << ", " << *val; return str << ']'; } private: std::list _data; }; /** \relates Array Stream output */ inline std::ostream & operator<<( std::ostream & str, const Array & obj ) { return obj.dumpOn( str ); } template std::string toJSON( const std::vector & cont_r ) { return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); } template std::string toJSON( const std::list & cont_r ) { return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); } template std::string toJSON( const std::set & cont_r ) { return json::Array( cont_r.begin(), cont_r.end() ).asJSON(); } /////////////////////////////////////////////////////////////////// /// \class Object /// \brief JSON object /////////////////////////////////////////////////////////////////// struct Object { Object() {} /** Construct from map-iterator */ template Object( Iterator begin, Iterator end ) { for_( it, begin, end ) add( it->first, it->second ); } /** Construct from map-initializer list { {k1,v1}, {k2,v2},... } */ Object( const std::initializer_list> & contents_r ) : Object( contents_r.begin(), contents_r.end() ) {} /** Add key/value pair */ void add( const String & key_r, const Value & val_r ) { _data[key_r.asJSON()] = val_r.asJSON(); } /** \overload from map-initializer list { {k1,v1}, {k2,v2},... } */ void add( const std::initializer_list> & contents_r ) { for_( it, contents_r.begin(), contents_r.end() ) add( it->first, it->second ); } /** JSON representation */ std::string asJSON() const { return str::Str() << *this; } /** String representation */ std::string asString() const { return asJSON(); } /** Stream output */ std::ostream & dumpOn( std::ostream & str ) const { using std::endl; if ( _data.empty() ) return str << "{}"; dumpOn( str << '{' << endl, _data.begin() ); for_ ( val, ++_data.begin(), _data.end() ) dumpOn( str << ',' << endl, val ); return str << endl << '}'; } private: std::ostream & dumpOn( std::ostream & str, std::map::const_iterator val_r ) const { return str << val_r->first << ": " << val_r->second; } std::map _data; }; /** \relates Object Stream output */ inline std::ostream & operator<<( std::ostream & str, const Object & obj ) { return obj.dumpOn( str ); } template std::string toJSON( const std::map & cont_r ) { return json::Object( cont_r.begin(), cont_r.end() ).asJSON(); } } // namespace json /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_JSON_H libzypp-17.36.5/zypp/base/LocaleGuard.h000066400000000000000000000041561476576476200176730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/LocaleGuard.h */ #ifndef ZYPP_BASE_LOCALEGUARD_H #define ZYPP_BASE_LOCALEGUARD_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class LocaleGuard /// \brief Temorarily change a locale category value /// \ingroup g_RAII /////////////////////////////////////////////////////////////////// class LocaleGuard { NON_COPYABLE(LocaleGuard); NON_MOVABLE(LocaleGuard); public: /** Ctor saving the current locale category value. */ LocaleGuard( int category_r, const std::string & value_r = "C" ) : _category( -1 ) { const char * ovalue = ::setlocale( category_r, nullptr ); if ( ovalue && ovalue != value_r ) { _category = category_r; _value = ovalue; ::setlocale( _category, value_r.c_str() ); } } /** Dtor asserts the saved locale category value is restored. */ ~LocaleGuard() { restore(); } /** immediately restore the saved locale category value. */ void restore() { if ( _category != -1 ) { ::setlocale( _category, _value.c_str() ); _category = -1; } } private: int _category; ///< saved category or -1 if no restore needed std::string _value; ///< saved category value }; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_LOCALEGUARD_H libzypp-17.36.5/zypp/base/LogControl.h000066400000000000000000000000471476576476200175660ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/LogTools.h000066400000000000000000000000451476576476200172440ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Logger.h000066400000000000000000000000431476576476200167170ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Measure.cc000066400000000000000000000166261476576476200172550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Measure.cc * */ extern "C" { #include #include } #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "Measure" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace debug { ///////////////////////////////////////////////////////////////// /** Times measured by \ref Measure. */ struct Tm { Tm() : _real( 0 ) , _proc( tmsEmpty ) {} void get() { _real = ::time(NULL); ::times( &_proc ); } Tm operator-( const Tm & rhs ) const { Tm ret( *this ); ret._real -= rhs._real; ret._proc.tms_utime -= rhs._proc.tms_utime; ret._proc.tms_stime -= rhs._proc.tms_stime; ret._proc.tms_cutime -= rhs._proc.tms_cutime; ret._proc.tms_cstime -= rhs._proc.tms_cstime; return ret; } std::string asString() const { std::string ret( timeStr( _real ) ); ret += " (u "; ret += timeStr( asSec( _proc.tms_utime ) ); ret += " s "; ret += timeStr( asSec( _proc.tms_stime ) ); ret += " c "; ret += timeStr( asSec( _proc.tms_cutime + _proc.tms_cstime ) ); ret += ")"; return ret; } std::string stringIf( clock_t ticks_r, const std::string & tag_r ) const { std::string ret; if ( ticks_r ) { ret += tag_r; ret += timeStr( asSec( ticks_r ) ); } return ret; } double asSec( clock_t ticks_r ) const { return double(ticks_r) / ticks; } std::string timeStr( time_t sec_r ) const { time_t h = sec_r/3600; sec_r -= h*3600; time_t m = sec_r/60; sec_r -= m*60; if ( h ) return str::form( "%lu:%02lu:%02lu", h, m, sec_r ); if ( m ) return str::form( "%lu:%02lu", m, sec_r ); return str::form( "%lu", sec_r ); } std::string timeStr( double sec_r ) const { time_t h = time_t(sec_r)/3600; sec_r -= h*3600; time_t m = time_t(sec_r)/60; sec_r -= m*60; if ( h ) return str::form( "%lu:%02lu:%05.2lf", h, m, sec_r ); if ( m ) return str::form( "%lu:%05.2lf", m, sec_r ); return str::form( "%.2lf", sec_r ); } /** Systems ticks per second. */ static const long ticks; /** Empty struct tms. */ static const struct tms tmsEmpty; /** Real time via \c ::time. */ time_t _real; /** Process times via \c ::times. */ struct tms _proc; }; const struct tms Tm::tmsEmpty = { 0, 0, 0, 0 }; const long Tm::ticks = sysconf(_SC_CLK_TCK); /** \refers Tm Stream output. */ std::ostream & operator<<( std::ostream & str, const Tm & obj ) { return str << obj.asString(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Measure::Impl // /** Measure implementation. */ class Measure::Impl { public: Impl( std::string &&ident_r, std::ostream * log_r = nullptr ) : _ident (std::move( ident_r )) , _level ( _glevel ) , _seq ( 0 ) , _log ( log_r ) { _glevel += ".."; log() << _level << "START MEASURE(" << _ident << ")" << endl; _start.get(); } Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() { _stop.get(); ++_seq; std::ostream & str( log() << _level << "MEASURE(" << _ident << ") " ); dumpMeasure( str ); _glevel.erase( 0, 2 ); } void restart() { log() << _level << "RESTART MEASURE(" << _ident << ")" << endl; _start = _stop; } void elapsed( const std::string & tag_r = std::string() ) const { _stop.get(); ++_seq; std::ostream & str( log() << _level << "ELAPSED(" << _ident << ") " ); dumpMeasure( str, tag_r ); _elapsed = _stop; } /** Return the log stream. */ std::ostream & log() const { return _log ? *_log : INT; } std::ostream * logp() const { return _log; } private: std::ostream & dumpMeasure( std::ostream & str_r, const std::string & tag_r = std::string() ) const { str_r << ( _stop - _start ); if ( _seq > 1 ) // diff to previous _elapsed { str_r << " [" << ( _stop - _elapsed ) << "]"; } if ( ! tag_r.empty() ) str_r << " - " << tag_r; return str_r << endl; } private: static std::string _glevel; std::string _ident; std::string _level; Tm _start; mutable unsigned _seq; mutable Tm _elapsed; mutable Tm _stop; std::ostream * _log = nullptr; }; std::string Measure::Impl::_glevel; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Measure // /////////////////////////////////////////////////////////////////// Measure::Measure() {} Measure::Measure( std::string ident_r ) : _pimpl( new Impl( std::move(ident_r) ) ) {} Measure::Measure( std::string ident_r, std::ostream & out_r ) : _pimpl( new Impl( std::move(ident_r), &out_r ) ) {} Measure::~Measure() {} void Measure::start( std::string ident_r ) { stop(); _pimpl.reset( _pimpl ? new Impl( std::move(ident_r), _pimpl->logp() ) : new Impl( std::move(ident_r) ) ); } void Measure::restart() { _pimpl->restart(); } void Measure::elapsed() const { if ( _pimpl ) _pimpl->elapsed(); } void Measure::elapsed( const std::string & tag_r ) const { if ( _pimpl ) _pimpl->elapsed( tag_r ); } void Measure::elapsed( long tag_r ) const { if ( _pimpl ) _pimpl->elapsed( asString( tag_r ) ); } void Measure::stop() { _pimpl.reset(); } ///////////////////////////////////////////////////////////////// } // namespace debug /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/base/Measure.h000066400000000000000000000077571476576476200171240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Measure.h * */ #ifndef ZYPP_BASE_MEASURE_H #define ZYPP_BASE_MEASURE_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace debug { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Measure // /** Tool to measure elapsed real and process times. * * Timer is started by either passing a string to the ctor, * or callign \ref start. The string passed is printed on * all messages to help identifying the timer. * * Elapsed time is printed on calling \ref elapsed (timer * keeps running) or \ref stop. * * Calling \ref stop, stops the timer. The same, if the timer * goes out of scope. * * Elapsed time is printed as: * \code * 'REAL TIME' (u 'USER TIME' s 'SYSTEM TIME' c 'TIME OF CHILDREN') * \endcode * In brackets the time elapsed since a previous call to \ref elapsed. * All units are seconds. * * \code * Measure m( "Parse" ); * ... * m.elapsed(); * ... * m.elapsed(); * ... * m.elapsed(); * ... * m.stop(); * * // START MEASURE(Parse) * // ELAPSED(Parse) 0 (u 0.13 s 0.00 c 0.00) * // ELAPSED(Parse) 0 (u 0.15 s 0.02 c 0.00) [ 0 (u 0.02 s 0.02 c 0.00)] * // ELAPSED(Parse) 0 (u 0.17 s 0.02 c 0.00) [ 0 (u 0.02 s 0.00 c 0.00)] * // MEASURE(Parse) 0 (u 0.17 s 0.02 c 0.00) [ 0 (u 0.00 s 0.00 c 0.00)] * \endcode */ class ZYPP_API Measure { public: /** Default Ctor does nothing. */ Measure(); /** Ctor taking \a ident_r string and auto starts timer. */ explicit Measure(std::string ident_r ); /** \overload log to custom ostream */ Measure(std::string ident_r, std::ostream & out_r ); /** Dtor. */ ~Measure(); /** Start timer for \a ident_r string. * Implies stoping a running timer. */ void start(std::string ident_r = std::string() ); /** re start the timer without reset-ing it. */ void restart(); /** Print elapsed time for a running timer. * Timer keeps on running. */ void elapsed() const; /** \overload Tagging the time with some text * \code * elapsed( "after action foo..." ); * \endcode */ void elapsed( const std::string & tag_r ) const; /** \overload Tagging the time with e.g. a line number * \code * elapsed( __LINE__ ); * \endcode */ void elapsed( long tag_r ) const; /** Stop a running timer. */ void stop(); private: /** Implementation. */ class Impl; /** Pointer to implementation. */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace debug /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_MEASURE_H libzypp-17.36.5/zypp/base/NamedValue.h000066400000000000000000000123111476576476200175220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/NamedValue.h * */ #ifndef ZYPP_BASE_NAMEDVALUE_H #define ZYPP_BASE_NAMEDVALUE_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class NamedValue /// \brief Simple value<>name mapping supporting aliases. /// \code /// enum Commands { /// CMD_1, /// CMD_2 /// }; /// NamedValue clist; /// // Value | Name | Alias... /// clist( CMD_1 ) | "cmd1"; /// clist( CMD_2 ) | "cmd2" | "second"; /// /// std::string name( clist.getName( CMD_1 ) ); /// Commands cmd( clist.getValue( "second" ) ); /// \endcode /////////////////////////////////////////////////////////////////// template< class Tp, const bool _tWithAlias = true > class NamedValue { using NameMap = std::map; using ValueMap = std::map; public: /** Whether not initialized (no (name,value) pair remembered) */ bool empty() const { return( _nameMap.empty() && _valueMap.empty() ); } public: /** \name Get value for name or alias. */ //@{ /** Whether there is a \c value mapped for \a name_r. */ bool haveValue( const std::string & name_r ) const { typename NameMap::const_iterator it( _nameMap.find( name_r ) ); return( it != _nameMap.end() ); } /** Get value mapped for name or alias. * \return \c true if name or alias was found. */ bool getValue( const std::string & name_r, Tp & value_r ) const { typename NameMap::const_iterator it( _nameMap.find( name_r ) ); if ( it == _nameMap.end() ) return false; value_r = it->second; return true; } /** \overload \throws std::out_of_range exception if \a name_r was not found. */ const Tp & getValue( const std::string & name_r ) const { return _nameMap.at( name_r ); } //@} /** \name Get name for value. */ //@{ /** Whether there is a \c name mapped for \a value_r. */ bool haveName( const std::string & value_r ) const { typename ValueMap::const_iterator it( _valueMap.find( value_r ) ); return( it != _valueMap.end() ); } /** Get name of value. * \return \c true if name or alias was found. */ bool getName( const Tp & value_r, std::string & name_r ) const { typename ValueMap::const_iterator it( _valueMap.find( value_r ) ); if ( it == _valueMap.end() ) return false; value_r = it->second; return true; } /** \overload \throws std::out_of_range exception if \a value_r was not found. */ const std::string & getName( const Tp & value_r ) const { return _valueMap.at( value_r ); } //@} public: /** \name Inserter */ //@{ class TInserter { public: TInserter( NamedValue & parent_r, const Tp & value_r ) : _parent( &parent_r ) , _value( value_r ) {} TInserter & operator|( const std::string & name_r ) { _parent->insert( _value, name_r ); return *this; } private: NamedValue * _parent; Tp _value; }; TInserter operator()( const Tp & value_r ) { return TInserter( *this, value_r ); } //@} /** Remember name (1st call) or alias (subsequent calls). * \return \C true if this is the 1st call for \a value_r. * \throws std::logic_error if \a name_r is already used as name or alias. * \throws std::logic_error if \c _tWithAlias is \c false and a name for \a value_r is already defined. */ bool insert( const Tp & value_r, const std::string & name_r ) { typename NameMap::const_iterator nit( _nameMap.find( name_r ) ); if ( nit != _nameMap.end() ) // duplicate name throw std::logic_error( "NamedValue::insert name" ); typename ValueMap::const_iterator tit( _valueMap.find( value_r ) ); if ( tit != _valueMap.end() ) // duplicate value, i.e. an alias { if ( !_tWithAlias ) throw std::logic_error( "NamedValue::insert alias" ); _nameMap[name_r] = value_r; return false; } // here: 1st entry for value_r _nameMap[name_r] = value_r; _valueMap[value_r] = name_r; return true; } private: NameMap _nameMap; ValueMap _valueMap; }; /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_NAMEDVALUE_H libzypp-17.36.5/zypp/base/NonCopyable.h000066400000000000000000000000501476576476200177070ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/ProfilingFormater.h000066400000000000000000000000561476576476200211350ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/ProvideNumericId.h000066400000000000000000000000531476576476200207110ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/PtrTypes.h000066400000000000000000000000451476576476200172740ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Random.cc000066400000000000000000000017011476576476200170600ustar00rootroot00000000000000#include #include #include #include namespace zypp { namespace base { // Taken from KApplication int random_int() { static bool init = false; if (!init) { unsigned int seed = 0; init = true; int fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC); if (fd < 0 || ::read(fd, &seed, sizeof(seed)) != sizeof(seed)) { // No /dev/urandom... try something else. srand(getpid()); seed = rand()+time(0); } if (fd >= 0) close(fd); srand(seed); } return rand(); } // Taken from KApplication std::string random_string(int length) { if (length <=0 ) return std::string(); std::string str; str.resize( length ); int i = 0; while (length--) { int r=::random() % 62; r+=48; if (r>57) r+=7; if (r>90) r+=6; str[i++] = char(r); // so what if I work backwards? } return str; } } } libzypp-17.36.5/zypp/base/Random.h000066400000000000000000000030331476576476200167220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_BASE_Random_H #define ZYPP_BASE_Random_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { /////////////////////////// // Taken from KApplication int random_int(); // Taken from KApplication std::string random_string(int length); /** Return a random number from [0,RAND_MAX[. */ inline unsigned random() { return random_int(); } /** Return a random number from [0,size_r[. */ inline unsigned random( unsigned size_r ) { return random_int() % size_r; } /** Return a random number from [min_r,min_r+size_r[. */ inline unsigned random( unsigned min_r, unsigned size_r ) { return min_r + random( size_r ); } } //ns base } // ns zypp #endif libzypp-17.36.5/zypp/base/ReferenceCounted.h000066400000000000000000000014251476576476200207250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/ReferenceCounted.h * */ #ifndef ZYPP_BASE_REFERENCECOUNTED_H #define ZYPP_BASE_REFERENCECOUNTED_H #include #endif // ZYPP_BASE_REFERENCECOUNTED_H libzypp-17.36.5/zypp/base/Regex.h000066400000000000000000000000421476576476200165510ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/SerialNumber.cc000066400000000000000000000062061476576476200202350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/SerialNumber.cc * */ #include //#include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SerialNumber // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : SerialNumber::SerialNumber // METHOD TYPE : Ctor // SerialNumber::SerialNumber( bool dirty_r ) : _dirty( dirty_r ) , _serial( 0 ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : SerialNumber::~SerialNumber // METHOD TYPE : Dtor // SerialNumber::~SerialNumber() {} /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const SerialNumber & obj ) { return str << "SERIAL" << (obj._dirty?"*":"(") << obj._serial << (obj._dirty?"*":")"); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : SerialNumberWatcher // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : SerialNumberWatcher::SerialNumberWatcher // METHOD TYPE : Ctor // SerialNumberWatcher::SerialNumberWatcher( unsigned serial_r ) : _serial( serial_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : SerialNumberWatcher::SerialNumberWatcher // METHOD TYPE : Ctor // SerialNumberWatcher::SerialNumberWatcher( const SerialNumber & serial_r ) : _serial( serial_r.serial() ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : SerialNumber::~SerialNumber // METHOD TYPE : Dtor // SerialNumberWatcher::~SerialNumberWatcher() {} /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const SerialNumberWatcher & obj ) { return str << "LAST_SERIAL(" << obj._serial << ")"; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/base/SerialNumber.h000066400000000000000000000132321476576476200200740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/SerialNumber.h * */ #ifndef ZYPP_BASE_SERIALNUMBER_H #define ZYPP_BASE_SERIALNUMBER_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SerialNumber // /** Simple serial number provider. * * \ref serial returns a serial number. The number returned stays * the same unless \ref setDirty was called to bring the object * into \c dirty state. The next call to \ref serial will increment * the serial number and bring the object into \c clean state. * * \code * SerialNumber sno; * sno.serial(); // SERIAL(0); () = clean * sno.setDirty(); // SERIAL*0*; ** = dirty * sno.serial(); // SERIAL(1) * sno.setDirty(); // SERIAL*1* * sno.setDirty(); // SERIAL*1* * sno.serial(); // SERIAL(2) * \endcode */ class SerialNumber { friend std::ostream & operator<<( std::ostream & str, const SerialNumber & obj ); public: /** Ctor taking initial \c dirty value. */ SerialNumber( bool dirty_r = false ); /** Dtor */ virtual ~SerialNumber(); public: void setDirty() { _dirty = true; } public: bool dirty() const { return _dirty; } bool clean() const { return !_dirty; } unsigned serial() const { if ( _dirty ) { ++_serial; _dirty = false; } return _serial; } private: mutable bool _dirty; mutable unsigned _serial; }; /////////////////////////////////////////////////////////////////// /** \relates SerialNumber Stream output */ std::ostream & operator<<( std::ostream & str, const SerialNumber & obj ); /////////////////////////////////////////////////////////////////// // // CLASS NAME : SerialNumberWatcher // /** Simple serial number watcher. * * \ref SerialNumberWatcher remembers a serial number * and tells whenever new numbers you feed change. * * All methods are overloaded to take an \unsigned or a * const SerialNumber & as argument. * * \code * SerialNumber sno; * * void check() * { * static SerialNumberWatcher watcher( sno ); * * if ( watcher.remember( sno ) ) * { * cout << "Serial number changed." << endl; * } * } * * int main() * { * check(); // This call would trigger, if check used a * // default constructed SerialNumberWatcher. * * check(); // * sno.dirty(); * check(); // "Serial number changed." * check(); // * sno.dirty(); * check(); // "Serial number changed." * \endcode */ class SerialNumberWatcher { friend std::ostream & operator<<( std::ostream & str, const SerialNumberWatcher & obj ); public: /** Ctor taking an initial \c serial value. * * A default constructed SerialNumberWatcher remembers the serial * number (unsigned)-1. So it is most likely the the 1st * call to \ref remember returns \ref isDirty. * * Vice versa, initializing the SerialNumberWatcher with the current * SerialNumber, most likely prevents the 1st to \ref remember to * return \ref isDirty. */ SerialNumberWatcher( unsigned serial_r = (unsigned)-1 ); /** Ctor taking an initial \c serial value. */ SerialNumberWatcher( const SerialNumber & serial_r ); /** Dtor */ virtual ~SerialNumberWatcher(); public: /** Return whether \c serial_r differs. */ bool isDirty( unsigned serial_r ) const { return( _serial != serial_r ); } /** \overload */ bool isDirty( const SerialNumber & serial_r ) const { return( _serial != serial_r.serial() ); } /** Return whether \c serial_r is still unchanged. */ bool isClean( unsigned serial_r ) const { return( _serial == serial_r ); } /** \overload */ bool isClean( const SerialNumber & serial_r ) const { return( _serial == serial_r.serial() ); } public: /** Return \ref isDirty, storing \c serial_r as new value. */ bool remember( unsigned serial_r ) const { if ( isDirty( serial_r ) ) { _serial = serial_r; return true; } return false; } /** \overload */ bool remember( const SerialNumber & serial_r ) const { return remember( serial_r.serial() ); } private: mutable unsigned _serial; }; /////////////////////////////////////////////////////////////////// /** \relates SerialNumberWatcher Stream output */ std::ostream & operator<<( std::ostream & str, const SerialNumberWatcher & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_SERIALNUMBER_H libzypp-17.36.5/zypp/base/SetRelationMixin.cc000066400000000000000000000027631476576476200211070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/SetRelationMixin.cc */ #include #include /////////////////////////////////////////////////////////////////// namespace zypp { const std::string & ESetCompareDef::asString( Enum val_r ) { static std::map _table = { { uncomparable, "{?}" }, { equal, "{=}" }, { properSubset, "{<}" }, { properSuperset, "{>}" }, { disjoint, "{ }" }, }; return _table[val_r]; } const std::string & ESetRelationDef::asString( Enum val_r ) { static std::map _table = { { uncomparable, "{??}" }, { equal, "{==}" }, { properSubset, "{<<}" }, { properSuperset, "{>>}" }, { disjoint, "{ }" }, { subset, "{<=}" }, { superset, "{>=}" }, }; return _table[val_r]; } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/base/SetRelationMixin.h000066400000000000000000000255431476576476200207520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/SetRelationMixin.h */ #ifndef ZYPP_BASE_SETRELATIONMIXIN_H #define ZYPP_BASE_SETRELATIONMIXIN_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class ESetCompareDef /// \brief Result of set comparison (use like 'enum class \ref SetCompare') /// This is the type a \c compare function should return. /////////////////////////////////////////////////////////////////// struct ESetCompareDef { enum Enum { uncomparable = 0, ///< "{?}" equal = (1<<0), ///< "{=}" properSubset = (1<<1), ///< "{<}" properSuperset = (1<<2), ///< "{>}" disjoint = (1<<3), ///< "{ }" }; /** String representantion */ static const std::string & asString( Enum val_r ) ZYPP_API; }; /** \relates ESetCompareDef typedef 'enum class SetCompare' */ using SetCompare = base::EnumClass; /** \relates SetCompare Stream output */ inline std::ostream & operator<<( std::ostream & str, const SetCompare::Enum & obj ) { return str << SetCompare::asString( obj ); } /** \overload */ inline std::ostream & operator<<( std::ostream & str, const SetCompare & obj ) { return str << obj.asEnum(); } /////////////////////////////////////////////////////////////////// /// \class ESetRelationDef /// \brief Set Relation based on \ref SetCompare (use like 'enum class \ref SetRelation') /// Comparison (\c== \c!=) between \ref SetRelation and \ref SetCompare /// is defined to let \c SetRelation::subset match \c SetCompare::equal /// as well as \c SetCompare::properSubset. Accordingly \c SetRelation::subset /// matches \c SetCompare::equal as well as \c SetCompare::properSuperset. /////////////////////////////////////////////////////////////////// struct ESetRelationDef { enum Enum { uncomparable = SetCompare::uncomparable, ///< "{??}" equal = SetCompare::equal, ///< "{==}" properSubset = SetCompare::properSubset, ///< "{<<}" properSuperset = SetCompare::properSuperset, ///< "{>>}" disjoint = SetCompare::disjoint, ///< "{ }" subset = properSubset|equal, ///< "{<=}" superset = properSuperset|equal, ///< "{>=}" }; /** String representantion */ static const std::string & asString( Enum val_r ) ZYPP_API; }; /** \relates ESetRelationDef typedef 'enum class SetRelation' */ using SetRelation = base::EnumClass; /** \relates SetRelation Stream output */ inline std::ostream & operator<<( std::ostream & str, const SetRelation::Enum & obj ) { return str << SetRelation::asString( obj ); } /** \overload */ inline std::ostream & operator<<( std::ostream & str, const SetRelation & obj ) { return str << obj.asEnum(); } /** \relates SetRelation \relates SetCompare Matching \ref SetCompare and \ref SetRelation */ inline bool operator==( const SetRelation::Enum & lhs, const SetCompare::Enum & rhs ) { return( lhs&rhs || !(lhs|rhs) ); } /** \overload */ inline bool operator==( const SetRelation::Enum & lhs, const SetCompare & rhs ) { return( lhs == rhs.asEnum() ); } /** \overload */ inline bool operator==( const SetRelation & lhs, const SetCompare::Enum & rhs ) { return( lhs.asEnum() == rhs ); } /** \overload */ inline bool operator==( const SetRelation & lhs, const SetCompare & rhs ) { return( lhs.asEnum() == rhs.asEnum() ); } /** \overload */ inline bool operator==( const SetCompare::Enum & lhs, const SetRelation::Enum & rhs ) { return( rhs == lhs ); } /** \overload */ inline bool operator==( const SetCompare::Enum & lhs, const SetRelation & rhs ) { return( rhs == lhs ); } /** \overload */ inline bool operator==( const SetCompare & lhs, const SetRelation::Enum & rhs ) { return( rhs == lhs ); } /** \overload */ inline bool operator==( const SetCompare & lhs, const SetRelation & rhs ) { return( rhs == lhs ); } /** \relates SetRelation \relates SetCompare Matching \ref SetCompare and \ref SetRelation */ inline bool operator!=( const SetRelation::Enum & lhs, const SetCompare::Enum & rhs ) { return !( lhs == rhs ); } /** \overload */ inline bool operator!=( const SetRelation::Enum & lhs, const SetCompare & rhs ) { return !( lhs == rhs ); } /** \overload */ inline bool operator!=( const SetRelation & lhs, const SetCompare::Enum & rhs ) { return !( lhs == rhs ); } /** \overload */ inline bool operator!=( const SetRelation & lhs, const SetCompare & rhs ) { return !( lhs == rhs ); } /** \overload */ inline bool operator!=( const SetCompare::Enum & lhs, const SetRelation::Enum & rhs ) { return !( lhs == rhs ); } /** \overload */ inline bool operator!=( const SetCompare::Enum & lhs, const SetRelation & rhs ) { return !( lhs == rhs ); } /** \overload */ inline bool operator!=( const SetCompare & lhs, const SetRelation::Enum & rhs ) { return !( lhs == rhs ); } /** \overload */ inline bool operator!=( const SetCompare & lhs, const SetRelation & rhs ) { return !( lhs == rhs ); } /////////////////////////////////////////////////////////////////// namespace base { /////////////////////////////////////////////////////////////////// /// \class SetRelationMixin /// \brief Provide set relation methods based on Derived::setRelationMixinCompare /// A class using this mixin must provide: /// \code /// SetCompare setRelationMixinCompare( const Derived & rhs ) const; /// \endcode /// \see \ref SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN /// \ingroup g_CRTP /////////////////////////////////////////////////////////////////// template class SetRelationMixin { public: /** Compare sets */ SetCompare compare( const Derived & trg ) const { return derived().setRelationMixinCompare( trg ); } /** \overload */ SetCompare compare( const SetRelationMixin & trg ) const { return compare( trg.derived() ); } /** Compare sets and match against \ref SetCompare */ bool compare( const Derived & trg, SetCompare cmp ) const { return compare( trg ) == cmp; } /** \overload */ bool compare( const SetRelationMixin & trg, SetCompare cmp ) const { return compare( trg ) == cmp; } /** Compare sets and match against \ref SetRelation */ bool compare( const Derived & trg, SetRelation rel ) const { return compare( trg ) == rel; } /** \overload */ bool compare( const SetRelationMixin & trg, SetRelation rel ) const { return compare( trg ) == rel; } protected: SetRelationMixin() {} DEFAULT_COPYABLE( SetRelationMixin ); DEFAULT_MOVABLE( SetRelationMixin ); ~SetRelationMixin() {} private: /** Access to sublass Derived*/ const Derived & derived() const { return *static_cast( this ); } }; /** \relates SetRelationMixin Compare sets */ template inline SetCompare compare( const SetRelationMixin & src, const SetRelationMixin & trg ) { return src.compare( trg ); } /** \relates SetRelationMixin Compare sets and match against \ref SetCompare */ template inline bool compare( const SetRelationMixin & src, const SetRelationMixin & trg, SetCompare cmp ) { return src.compare( trg, cmp ); } /** \relates SetRelationMixin Compare sets and match against \ref SetRelation */ template inline bool compare( const SetRelationMixin & src, const SetRelationMixin & trg, SetRelation rel ) { return src.compare( trg, rel ); } /** \relates SetRelationMixin Equal */ template inline bool operator==( const SetRelationMixin & src, const SetRelationMixin & trg ) { return src.compare( trg, SetRelation::equal ); } /** \relates SetRelationMixin Unequal */ template inline bool operator!=( const SetRelationMixin & src, const SetRelationMixin & trg ) { return !( src == trg ); } /** \relates SetRelationMixin Define compare between Derived and some other type (e.g. std::string) * \code * class Foo : public base::SetRelationMixin {...}; * SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN( Foo, const char * ); * SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN( Foo, const std::string & ); * \endcode */ #define SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN(DERIVED_TYPE,OTHER_TYPE) \ inline SetCompare compare( const base::SetRelationMixin & src, OTHER_TYPE trg ) \ { return src.compare( DERIVED_TYPE(trg) ); } \ inline SetCompare compare( OTHER_TYPE src, const base::SetRelationMixin & trg ) \ { return DERIVED_TYPE(src).compare( trg ); } \ \ inline bool compare( const base::SetRelationMixin & src, OTHER_TYPE trg, SetCompare cmp ) \ { return src.compare( DERIVED_TYPE(trg), cmp ); } \ inline bool compare( OTHER_TYPE src, const base::SetRelationMixin & trg, SetCompare cmp ) \ { return DERIVED_TYPE(src).compare( trg, cmp ); } \ \ inline bool compare( const base::SetRelationMixin & src, OTHER_TYPE trg, SetRelation rel ) \ { return src.compare( DERIVED_TYPE(trg), rel ); } \ inline bool compare( OTHER_TYPE src, const base::SetRelationMixin & trg, SetRelation rel ) \ { return DERIVED_TYPE(src).compare( trg, rel ); } \ \ inline bool operator==( const base::SetRelationMixin & src, OTHER_TYPE trg ) \ { return src.compare( DERIVED_TYPE(trg), SetRelation::equal ); } \ inline bool operator==( OTHER_TYPE src, const base::SetRelationMixin & trg ) \ { return DERIVED_TYPE(src).compare( trg, SetRelation::equal ); } \ \ inline bool operator!=( const base::SetRelationMixin & src, OTHER_TYPE trg ) \ { return !( src == trg ); } \ inline bool operator!=( OTHER_TYPE src, const base::SetRelationMixin & trg ) \ { return !( src == trg ); } } // namespace base /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_SETRELATIONMIXIN_H libzypp-17.36.5/zypp/base/SetTracker.h000066400000000000000000000150411476576476200175530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/SetTracker.h */ #ifndef ZYPP_BASE_SETTRACKER_H #define ZYPP_BASE_SETTRACKER_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace base { /////////////////////////////////////////////////////////////////// /// \class SetTracker /// \brief Track added/removed set items based on an initial set. /// /// The class maintains the \ref current set of items and also records /// the changes compared to the initial set (\ref added and \ref removed /// items) if you use the tracking API. /// /// It is also possible to directly manipulate the three sets. /// /// \note The tracking API expects the template arg to have set semantic. /////////////////////////////////////////////////////////////////// template struct SetTracker { typedef TSet set_type; typedef typename TSet::key_type key_type; typedef typename TSet::value_type value_type; /** Default Ctor: empty set */ SetTracker() {} /** Ctor taking an initial set */ SetTracker( set_type initial_r ) : _current( std::move(initial_r) ) {} /// \name Tracking API //@{ /** (Re-)Start tracking the current set (discards previously tracked changes). * \return \c False (set did not change) */ bool setInitial() { _added.clear(); _removed.clear(); return false; } /** Start tracking a new set (discards previously tracked changes). * \return Whether the set did change (new!=current) */ bool setInitial( set_type new_r ) { setInitial(); bool changed = ( new_r != _current ); if ( changed ) { _current = std::move(new_r); } return changed; } /** Set a \a new_r set and track changes. * \return Whether the set has changed */ bool set( set_type new_r ) { bool changed = ( new_r != _current ); if ( changed ) { // build the initial (cur-add+rem) set in _current setDifference( _current, _added, _removed ); _current.swap( _removed ); _added.clear(); _removed.clear(); const set_type & initial( _current ); setDifference( initial, new_r, _removed ); setDifference( new_r, initial, _added ); _current.swap( new_r ); } return changed; } /** Add an element to the set and track changes. * \return Whether the set has changed */ bool add( const value_type & val_r ) { bool done = _current.insert( val_r ).second; if ( done ) { if ( ! _removed.erase( val_r ) ) _added.insert( val_r ); } return done; } /** Remove an element from the set and track changes. * \return Whether the set has changed */ bool remove( const value_type & val_r ) { bool done = _current.erase( val_r ); if ( done ) { if ( ! _added.erase( val_r ) ) _removed.insert( val_r ); } return done; } //@} /// \name Query and retrieval //@{ /** Whether \a val_r is in the set. */ bool contains( const key_type & key_r ) const { return find( _current, key_r ); } /** Whether \a val_r is tracked as added. */ bool wasAdded( const key_type & key_r ) const { return find( _added, key_r ); } /** Whether \a val_r is tracked as removed. */ bool wasRemoved( const key_type & key_r ) const { return find( _removed, key_r ); } /** Return the current set. */ const set_type & current() const { return _current; } /** Return the set of added items. */ const set_type & added() const { return _added; } /** Return the set of removed items. */ const set_type & removed() const { return _removed; } //@} /// \name Direct manipulation //@{ /** Return the current set. */ set_type & current() { return _current; } /** Return the set of added items. */ set_type & added() { return _added; } /** Return the set of removed items. */ set_type & removed() { return _removed; } //@} private: static bool find( const set_type & set_r, const key_type & key_r ) { return set_r.find( key_r ) != set_r.end(); } template static void setDifference( const TORDERED_SET & lhs, const TORDERED_SET & rhs, TORDERED_SET & result_r ) { // std::set_difference requires ordered sets! std::set_difference( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), std::inserter( result_r, result_r.end() ), typename TORDERED_SET::key_compare() ); } template static void setDifference( const TUNORDERED_SET & lhs, const TUNORDERED_SET & rhs, TUNORDERED_SET & result_r ) { // std::set_difference requires ordered sets! for ( const auto & l : lhs ) { if ( rhs.find( l ) == rhs.end() ) result_r.insert( l ); } } private: set_type _current; set_type _added; set_type _removed; }; /** \relates SetTracker Stream output */ template std::ostream & operator<<( std::ostream & str, const SetTracker & obj ) { return str << "set(" << obj.current().size() << "|+" << obj.added().size() << "|-" << obj.removed().size() << ')'; } } // namespace base /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_SETTRACKER_H libzypp-17.36.5/zypp/base/Signal.h000066400000000000000000000052101476576476200167160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Signal.h * */ #ifndef ZYPP_BASE_SIGNAL_H #define ZYPP_BASE_SIGNAL_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Exception safe signal handler save/restore. * \ingroup g_RAII */ class SignalSaver { public: SignalSaver( int signum_r, sighandler_t handler_r ) : _signum( signum_r ) { _orighandler = ::signal( signum_r, handler_r ); } ~SignalSaver() { ::signal( _signum, _orighandler ); } private: int _signum; ::sighandler_t _orighandler; }; /** Exception safe sigprocmask save/restore. * \ingroup g_RAII */ class SigprocmaskSaver { public: /** Ctor saving the original sigprocmask. */ SigprocmaskSaver() { ::sigprocmask( SIG_SETMASK, NULL, &_origmask ); } /** Dtor restoring the original sigprocmask. */ ~SigprocmaskSaver() { ::sigprocmask( SIG_SETMASK, &_origmask, NULL ); } public: /** Temporary block signal. */ void block( int signum_r ) { ::sigset_t mask; ::sigemptyset( & mask ); ::sigaddset( & mask, signum_r ); ::sigprocmask( SIG_BLOCK, &mask, NULL ); } /** Temporary unblock signal. */ void unblock( int signum_r ) { ::sigset_t mask; ::sigemptyset( & mask ); ::sigaddset( & mask, signum_r ); ::sigprocmask( SIG_UNBLOCK, &mask, NULL ); } /** Whether signal delivery is pending. */ bool pending( int signum_r ) { ::sigset_t mask; ::sigpending( &mask ); return ::sigismember( &mask, signum_r ); } /** Wait for signals not blocked in original sigprocmask. */ void suspend() { ::sigsuspend( &_origmask ); } private: ::sigset_t _origmask; }; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_SIGNAL_H libzypp-17.36.5/zypp/base/SimpleStreambuf.h000066400000000000000000000000521476576476200206020ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/StrMatcher.cc000066400000000000000000000251451476576476200177240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/StrMatcher.cc * */ extern "C" { #include } #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// // class Match /////////////////////////////////////////////////////////////////// const int Match::_modemask = SEARCH_STRINGMASK; const int Match::_flagmask = ~_modemask; // option flags const Match Match::NOCASE (SEARCH_NOCASE); // sat::LookupAttr option flags const Match Match::NO_STORAGE_SOLVABLE(SEARCH_NO_STORAGE_SOLVABLE); const Match Match::SUB (SEARCH_SUB); const Match Match::ARRAYSENTINEL (SEARCH_ARRAYSENTINEL); const Match Match::DISABLED_REPOS (SEARCH_DISABLED_REPOS); const Match Match::COMPLETE_FILELIST (SEARCH_COMPLETE_FILELIST); const Match Match::SKIP_KIND (SEARCH_SKIP_KIND); const Match Match::FILES (SEARCH_FILES); const Match Match::CHECKSUMS (SEARCH_CHECKSUMS); Match::Mode Match::mode() const { switch ( modeval() ) { case 0: return NOTHING; break; case SEARCH_STRING: return STRING; break; case SEARCH_STRINGSTART: return STRINGSTART; break; case SEARCH_STRINGEND: return STRINGEND; break; case SEARCH_SUBSTRING: return SUBSTRING; break; case SEARCH_GLOB: return GLOB; break; case SEARCH_REGEX: return REGEX; break; } return OTHER; } int Match::modeval( Mode mode_r ) { switch ( mode_r ) { case NOTHING: return 0; break; case STRING: return SEARCH_STRING; break; case STRINGSTART: return SEARCH_STRINGSTART; break; case STRINGEND: return SEARCH_STRINGEND; break; case SUBSTRING: return SEARCH_SUBSTRING; break; case GLOB: return SEARCH_GLOB; break; case REGEX: return SEARCH_REGEX; break; case OTHER: return SEARCH_STRINGMASK; break; } return SEARCH_STRINGMASK; } std::string Match::asString() const { std::ostringstream str; str << *this; return str.str(); } std::ostream & operator<<( std::ostream & str, Match::Mode obj ) { switch ( obj ) { #define OUTS(V) case Match::V: return str << #V; break OUTS( NOTHING ); OUTS( STRING ); OUTS( STRINGSTART ); OUTS( STRINGEND ); OUTS( SUBSTRING ); OUTS( GLOB ); OUTS( REGEX ); OUTS( OTHER ); #undef OUTS } return str << "Match::Mode::UNKNOWN"; } std::ostream & operator<<( std::ostream & str, const Match & obj ) { if ( ! obj ) return str << "NOTHING"; const char * sep = "|"; Match::Mode mode( obj.mode() ); switch ( mode ) { case Match::NOTHING: sep = 0; // suppress 'NOTHING|' break; case Match::OTHER: str << mode<<"("< _matcher; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( _search, _flags ); } }; /** \relates StrMatcher::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const StrMatcher::Impl & obj ) { return str << "\"" << obj.searchstring() << "\"{" << obj.flags() << "}"; } /////////////////////////////////////////////////////////////////// // class StrMatcher /////////////////////////////////////////////////////////////////// StrMatcher::StrMatcher() : _pimpl( new Impl ) {} StrMatcher::StrMatcher( const std::string & search_r ) : _pimpl( new Impl( search_r, Match::STRING ) ) {} StrMatcher::StrMatcher( std::string && search_r ) : _pimpl( new Impl( std::move(search_r), Match::STRING ) ) {} StrMatcher::StrMatcher( const std::string & search_r, const Match & flags_r ) : _pimpl( new Impl( search_r, flags_r ) ) {} StrMatcher::StrMatcher( std::string && search_r, const Match & flags_r ) : _pimpl( new Impl( std::move(search_r), flags_r ) ) {} StrMatcher::StrMatcher( const std::string & search_r, const Match::Mode & flags_r ) : _pimpl( new Impl( search_r, flags_r ) ) {} StrMatcher::StrMatcher( std::string && search_r, const Match::Mode & flags_r ) : _pimpl( new Impl( std::move(search_r), flags_r ) ) {} StrMatcher::StrMatcher( const std::string & search_r, int flags_r ) : _pimpl( new Impl( search_r, Match(flags_r) ) ) {} StrMatcher::StrMatcher( std::string && search_r, int flags_r ) : _pimpl( new Impl( std::move(search_r), Match(flags_r) ) ) {} void StrMatcher::compile() const { return _pimpl->compile(); } bool StrMatcher::isCompiled() const { return _pimpl->isCompiled(); } bool StrMatcher::doMatch( const char * string_r ) const { return _pimpl->doMatch( string_r ); } const std::string & StrMatcher::searchstring() const { return _pimpl->searchstring(); } void StrMatcher::setSearchstring( const std::string & string_r ) { _pimpl->setSearchstring( string_r ); } void StrMatcher::setSearchstring( std::string && string_r ) { _pimpl->setSearchstring( std::move(string_r) ); } void StrMatcher::setSearchstring( const std::string & string_r, const Match & flags_r ) { _pimpl->setSearchstring( string_r ); _pimpl->setFlags( flags_r ); } void StrMatcher::setSearchstring( std::string && string_r, const Match & flags_r ) { _pimpl->setSearchstring( std::move(string_r) ); _pimpl->setFlags( flags_r ); } const Match & StrMatcher::flags() const { return _pimpl->flags(); } void StrMatcher::setFlags( const Match & flags_r ) { _pimpl->setFlags( flags_r ); } std::ostream & operator<<( std::ostream & str, const StrMatcher & obj ) { return str << *obj._pimpl; } bool operator==( const StrMatcher & lhs, const StrMatcher & rhs ) { return ( lhs.flags() == rhs.flags() && lhs.searchstring() == rhs.searchstring() ); } bool operator<( const StrMatcher & lhs, const StrMatcher & rhs ) { if ( lhs.flags().get() != rhs.flags().get() ) return ( lhs.flags().get() < rhs.flags().get() ); return ( lhs.searchstring() < rhs.searchstring() ); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/base/StrMatcher.h000066400000000000000000000343301476576476200175620ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/StrMatcher.h * */ #ifndef ZYPP_BASE_STRMATCHER_H #define ZYPP_BASE_STRMATCHER_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class Match /// \brief String matching option flags as used e.g. by \ref StrMatcher. /// /// \code /// Match mode( Match::GLOB | Match::NOCASE ); /// \endcode /////////////////////////////////////////////////////////////////// class ZYPP_API Match { private: static const int _modemask; static const int _flagmask; public: /** Mode flags (mutual exclusive). */ enum Mode { NOTHING, //!< Match nothing STRING, //!< Excat matching STRINGSTART, //!< Match at string start STRINGEND, //!< Match at string end SUBSTRING, //!< Match substring GLOB, //!< Glob REGEX, //!< Regular Expression OTHER //!< Something else. }; /** \name \ref Option flags * Most flags are actually \ref sat::LookupAttr specific, as they tell * how to retrieve the attribute values from solv-files. The plain * \ref StrMatcher will ignore those flags and use the ones related * to string matching only. */ //@{ static const Match NOCASE; //!< If set, match case insensitive. //@} /** \name \ref sat::LookupAttr option flags * These flags are actually \ref sat::LookupAttr specific, as they tell * how to retrieve the attribute values from solv-files. The plain * \ref StrMatcher will ignore these flags and use the ones related * to string matching only. */ //@{ static const Match NO_STORAGE_SOLVABLE; //!< LookupAttr: internal static const Match SUB; //!< LookupAttr: internal static const Match ARRAYSENTINEL; //!< LookupAttr: internal static const Match DISABLED_REPOS; //!< LookupAttr: internal static const Match COMPLETE_FILELIST; //!< LookupAttr: internal static const Match SKIP_KIND; //!< LookupAttr: skip any \c kind: prefix when looking at a \ref Solvable name. static const Match FILES; //!< LookupAttr: match full path when matching in filelists, otherwise just the basenames. static const Match CHECKSUMS; //!< LookupAttr: also look for matches in checksums //@} public: /** Default ctor \c 0 or \ref NOTHING. */ Match() : _val( 0 ) {} /** Ctor from \ref Mode value. */ Match( Mode val_r ) : _val( modeval( val_r ) ) {} /** Just in case one needs it. */ explicit Match( int val_r ) : _val( val_r ) {} /** Evaluate in a boolean context ( != 0 ). */ explicit operator bool() const { return _val; } public: /** Test whether \c all of the \a rhs bits are set (same mode if \a rhs has one). */ bool test( const Match & rhs ) const { return ( ( flagval() & rhs.flagval() ) == rhs.flagval() ) && ( !rhs.modeval() || rhs.modeval() == modeval() ); } /** Whether at least one of the \a rhs bits is set (or the same mode). */ bool testAnyOf( const Match & rhs ) const { return ( flagval() & rhs.flagval() ) || ( rhs.modeval() && rhs.modeval() == modeval() ); } /** Set all of the \a rhs bits (setting a new mode if \a rhs has one). */ void set( const Match & rhs ) { if ( rhs.modeval() ) _val = rhs._val | flagval(); // also set the rhs mode else _val |= rhs._val; // just set the flags } /** Unset all of the \a rhs bits (unsets mode if the same as \a rhs). */ void unset( const Match & rhs ) { if ( modeval() == rhs.modeval() ) _val = flagval() & ~rhs.flagval(); // also unset mode else _val &= ~rhs.flagval(); // just unset falgs } /** Depending on the value of \a onoff, set or unset flags. */ void turn( const Match & rhs, bool onoff ) { onoff ? set( rhs ) : unset( rhs ); } /** Add flags. */ Match & operator|=( const Match & rhs ) { set( rhs ); return *this; } /** Remove flags.*/ Match & operator-=( const Match & rhs ) { unset( rhs ); return *this; } public: /** Return the \c mode part. */ Mode mode() const; /** Return the \c flags part. */ Match flags() const { return Match( flagval() ); } public: /** \name Low level integer representation. */ //@{ /** Return the integer representation. */ int get() const { return _val; } /** Return the modes integer representation. */ int modeval() const { return _val & _modemask; } /** Return the flags integer representation. */ int flagval() const { return _val & _flagmask; } //@} public: /** \name Mode flag manip/query convenience. */ //@{ /** Whether this has mode \a rhs */ bool isMode( Mode rhs ) const { return modeval() == modeval( rhs ); } /** Whether this has mode \ref STRING. */ bool isModeString() const { return isMode( STRING ); } /** Whether this has mode \ref STRINGSTART. */ bool isModeStringstart() const { return isMode( STRINGSTART ); } /** Whether this has mode \ref STRINGEND. */ bool isModeStringend() const { return isMode( STRINGEND ); } /** Whether this has mode \ref SUBSTRING. */ bool isModeSubstring() const { return isMode( SUBSTRING ); } /** Whether this has mode \ref GLOB. */ bool isModeGlob() const { return isMode( GLOB ); } /** Whether this has mode \ref REGEX. */ bool isModeRegex() const { return isMode( REGEX ); } /** Set the mode part to \a rhs . */ void setMode( Mode rhs ) { _val = modeval( rhs ) | flagval(); } /** Set the mode \ref STRING. */ void setModeString() { setMode( STRING ); } /** Set the mode \ref STRINGSTART. */ void setModeStringstart() { setMode( STRINGSTART ); } /** Set the mode \ref STRINGEND. */ void setModeStringend() { setMode( STRINGEND ); } /** Set the mode \ref SUBSTRING. */ void setModeSubstring() { setMode( SUBSTRING ); } /** Set the mode \ref GLOB. */ void setModeGlob() { setMode( GLOB ); } /** Set the mode \ref REGEX. */ void setModeRegex() { setMode( REGEX ); } //@} /** String representation. */ std::string asString() const; private: /** Numeric value for enum (short for Match(m).get()). */ static int modeval( Mode mode_r ); private: int _val; }; /** \relates Match */ inline bool operator==( const Match & lhs, const Match & rhs ) { return lhs.get() == rhs.get(); } /** \relates Match */ inline bool operator!=( const Match & lhs, const Match & rhs ) { return lhs.get() != rhs.get(); } /** \relates Match */ inline Match operator|( const Match & lhs, const Match & rhs ) { return Match(lhs) |= rhs; } /** \relates Match \overload to disambiguate 'int|int'. */ inline Match operator|( Match::Mode lhs, Match::Mode rhs ) { return Match(lhs) |= rhs; } /** \relates Match */ inline Match operator-( const Match & lhs, const Match & rhs ) { return Match(lhs) -= rhs; } /** \relates Match \overload to disambiguate 'int-int'. */ inline Match operator-( Match::Mode lhs, Match::Mode rhs ) { return Match(lhs) -= rhs; } /** \relates Match::Mode Stream output */ std::ostream & operator<<( std::ostream & str, Match::Mode obj ) ZYPP_API; /** \relates Match Stream output */ std::ostream & operator<<( std::ostream & str, const Match & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// /// \class MatchException /// \brief Exceptions thrown from attribute matching. /////////////////////////////////////////////////////////////////// struct ZYPP_API MatchException : public Exception { /** Supplied message. */ explicit MatchException( const std::string & msg_r ) : Exception( msg_r ) {} }; /////////////////////////////////////////////////////////////////// /// \class MatchUnknownModeException /// \brief Unknown match mode. /////////////////////////////////////////////////////////////////// struct ZYPP_API MatchUnknownModeException : public MatchException { /** Supplied message. */ explicit MatchUnknownModeException( const std::string & msg_r ) : MatchException( msg_r ) {} /** Build message including the \a mode and optional the pattern string. */ MatchUnknownModeException( const Match & mode_r, const std::string & msg_r = std::string() ); }; /////////////////////////////////////////////////////////////////// /// \class MatchInvalidRegexException /// \brief Invalid regular expression (failed ::regcomp). /////////////////////////////////////////////////////////////////// struct ZYPP_API MatchInvalidRegexException : public MatchException { /** Supplied message. */ explicit MatchInvalidRegexException( const std::string & msg_r ) : MatchException( msg_r ) {} /** Build message including the \a regex and \c ::regcomp returncode (use \c 0 if unknown). */ MatchInvalidRegexException( const std::string & regex_r, int regcomp_r ); }; /////////////////////////////////////////////////////////////////// /// \class StrMatcher /// \brief String matching (STRING|SUBSTRING|GLOB|REGEX). /// /// Used by e.g. \ref PoolQuery and \ref LookupAttr for queries, /// but it can also be used for matching arbitrary strings. /// /// \code /// StrMatcher matches( "foo", Match::SUBSTRING ); /// for_( it, stringlist.begin(), stringlist().end() ) /// { /// if ( matches( *it ) ) /// cout << *it << " has substring 'foo'" << endl; /// } /// \endcode /// /// \Note Those flags are always set: REG_EXTENDED | REG_NOSUB | REG_NEWLINE /////////////////////////////////////////////////////////////////// class StrMatcher { friend std::ostream & operator<<( std::ostream & str, const StrMatcher & obj ); public: using Exception = MatchException; public: /** Implementation */ struct Impl; public: /** Default ctor matches nothing. */ StrMatcher(); /** Ctor from string matches in \ref Match::STRING mode per default. */ StrMatcher( const std::string & search_r ); /** \overload for rvalues */ StrMatcher( std::string && search_r ); /** Ctor taking string and \ref Match flags. */ StrMatcher( const std::string & search_r, const Match & flags_r ); /** \overload for rvalues */ StrMatcher( std::string && search_r, const Match & flags_r ); /** Ctor taking string and \ref Match::Mode. * Needed because we want them to be treated as \ref Match, * and not as \ref int as the compiler woud do. */ StrMatcher( const std::string & search_r, const Match::Mode & flags_r ); /** \overload for rvalues */ StrMatcher( std::string && search_r, const Match::Mode & flags_r ); /** Low level interface wraps \a flags into \ref Match. */ StrMatcher( const std::string & search_r, int flags_r ); /** \overload for rvalues */ StrMatcher( std::string && search_r, int flags_r ); /** Evaluate in a boolean context ( ! searchstring().empty() ). */ explicit operator bool() const { return !searchstring().empty(); } public: /** Return whether string matches. * You can use it with any class that impements \c c_str. * (\c std::string, \ref Pathname, \ref IdString, ...). * \Note \c NULL never matches. */ template bool operator()( const Tp & string_r ) const { return doMatch( string_r.c_str() ); } /** \overload */ bool operator()( const char * string_r ) const { return doMatch( string_r ); } public: /** The current searchstring. */ const std::string & searchstring() const; /** Set a new searchstring. */ void setSearchstring( const std::string & string_r ); /** \overload for rvalues */ void setSearchstring( std::string && string_r ); /** Set a new searchstring and flags. */ void setSearchstring( const std::string & string_r, const Match & flags_r ); /** \overload for rvalues */ void setSearchstring( std::string && string_r, const Match & flags_r ); /** The current search flags. */ const Match & flags() const; /** Set new search flags. */ void setFlags( const Match & flags_r ); public: /** Compile the pattern e.g. in case of \c REGEX. * \throws MatchUnknownModeException If the \ref Match flag more than * one mode bit set. * \throws MatchInvalidRegexException If \ref Match::REGEX is set * and \ref searchstring is not a valid regular expression. */ void compile() const; /** Whether the \ref StrMatcher is already compiled. */ bool isCompiled() const; /** Return whether string matches. * Compiles the \ref StrMatcher if this was not yet done. * \throws MatchException Any of the exceptions thrown by \ref StrMatcher::compile. */ bool doMatch( const char * string_r ) const; private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /** \relates StrMatcher Stream output */ std::ostream & operator<<( std::ostream & str, const StrMatcher & obj ); /** \relates StrMatcher */ bool operator==( const StrMatcher & lhs, const StrMatcher & rhs ); /** \relates StrMatcher */ inline bool operator!=( const StrMatcher & lhs, const StrMatcher & rhs ) { return !( lhs == rhs ); } /** \relates StrMatcher Arbitrary order for std::container. */ bool operator<( const StrMatcher & lhs, const StrMatcher & rhs ); } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_STRMATCHER_H libzypp-17.36.5/zypp/base/String.h000066400000000000000000000000431476576476200167460ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/StringV.h000066400000000000000000000000441476576476200170750ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Sysconfig.h000066400000000000000000000000461476576476200174470ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/TypeTraits.h000066400000000000000000000035701476576476200176200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/TypeTraits.h */ #ifndef ZYPP_TYPETRAITS_H #define ZYPP_TYPETRAITS_H #include /////////////////////////////////////////////////////////////////// // Helper types from https://en.cppreference.com/ namespace std { #if __cplusplus < 202002L #endif // __cplusplus < 202002L #if __cplusplus < 201703L template< class Base, class Derived > inline constexpr bool is_base_of_v = is_base_of::value; template< class T > inline constexpr bool is_integral_v = is_integral::value; template< class T > inline constexpr bool is_pointer_v = is_pointer::value; #endif // __cplusplus < 201703L #if __cplusplus < 201402L template< bool B, class T, class F > using conditional_t = typename conditional::type; template< class T > using decay_t = typename decay::type; template< bool B, class T = void > using enable_if_t = typename enable_if::type; template< class T > using remove_reference_t = typename remove_reference::type; template< class T > using result_of_t = typename result_of::type; template< class T > using underlying_type_t = typename underlying_type::type; #endif // __cplusplus < 201402L } // namespace std /////////////////////////////////////////////////////////////////// #endif // ZYPP_TYPETRAITS_H libzypp-17.36.5/zypp/base/Unit.h000066400000000000000000000000411476576476200164150ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/UserRequestException.h000066400000000000000000000000571476576476200216530ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/ValueTransform.h000066400000000000000000000135301476576476200204550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/ValueTransform.h */ #ifndef ZYPP_BASE_VALUETRANSFORM_H #define ZYPP_BASE_VALUETRANSFORM_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace base { /////////////////////////////////////////////////////////////////// /// \class ValueTransform /// \brief Helper managing raw values with transformed representation /// /// This helper enforces to explicitly state whether you are using /// the raw or the variable replaced value. Usually you set \c raw /// and get \c transformed (unless writing \c raw to some config file). /// /// Used e.g. vor variable replaced config strings. /////////////////////////////////////////////////////////////////// template struct ValueTransform { using RawType = Tp; using Transformator = TUnaryFunction; #if __cplusplus < 201703L using TransformedType = std::result_of_t; // yast in 15.[23] uses c++11 #else using TransformedType = std::invoke_result_t; #endif public: ValueTransform() {} explicit ValueTransform( RawType raw_r ) : _raw( std::move(raw_r) ) {} ValueTransform( RawType raw_r, Transformator transform_r ) : _raw( std::move(raw_r) ), _transform( std::move(transform_r) ) {} public: /** Get the raw value */ const RawType & raw() const { return _raw; } /** Set the raw value */ RawType & raw() { return _raw; } public: /** Return a transformed copy of the raw value */ TransformedType transformed() const { return _transform( _raw ); } /** Return a transformed copy of an arbitrary \a RawType */ TransformedType transformed( const RawType & raw_r ) const { return _transform( raw_r ); } /** Return the transformator */ const Transformator & transformator() const { return _transform; } private: RawType _raw; Transformator _transform; }; /////////////////////////////////////////////////////////////////// /// \class ContainerTransform /// \brief Helper managing a container of raw values with transformed representation /// /// This helper enforces to explicitly state wheter you are using /// the raw or the variable replaced value. Usually you set \c raw /// and get \c transformed (uness writing \c raw to some config file). /// /// Offers iterating over transformed strings in the list. /////////////////////////////////////////////////////////////////// template struct ContainerTransform { using Container = TContainer; using Transformator = TUnaryFunction; using size_type = typename Container::size_type; using RawType = typename Container::value_type; #if __cplusplus < 201703L using TransformedType = std::result_of_t; // yast in 15.[23] uses c++11 #else using TransformedType = std::invoke_result_t; #endif public: ContainerTransform() {} explicit ContainerTransform( Container raw_r ) : _raw( std::move(raw_r) ) {} ContainerTransform( Container raw_r, Transformator transform_r ) : _raw( std::move(raw_r) ), _transform( std::move(transform_r) ) {} public: bool empty() const { return _raw.empty(); } size_type size() const { return _raw.size(); } using RawConstIterator = typename Container::const_iterator; RawConstIterator rawBegin() const { return _raw.begin(); } RawConstIterator rawEnd() const { return _raw.end(); } /** Get the raw value */ const Container & raw() const { return _raw; } /** Set the raw value */ Container & raw() { return _raw; } public: using TransformedConstIterator = transform_iterator; TransformedConstIterator transformedBegin() const { return make_transform_iterator( _raw.begin(), _transform ); } TransformedConstIterator transformedEnd() const { return make_transform_iterator( _raw.end(), _transform ); } /** Return copy with transformed variables (expensive) */ Container transformed() const { return Container( transformedBegin(), transformedEnd() ); } /** Return a transformed copy of an arbitrary \a RawType */ TransformedType transformed( const RawType & raw_r ) const { return _transform( raw_r ); } /** Return a transformed copy of a \a RawConstIterator raw value */ TransformedType transformed( const RawConstIterator & rawIter_r ) const { return _transform( *rawIter_r ); } /** Return the transformator */ const Transformator & transformator() const { return _transform; } private: Container _raw; Transformator _transform; }; } // namespace base /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_VALUETRANSFORM_H libzypp-17.36.5/zypp/base/WatchFile.h000066400000000000000000000000421476576476200173450ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/Xml.h000066400000000000000000000000401476576476200162350ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/ZckStream.h000066400000000000000000000000441476576476200174040ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/base/fXstream.h000066400000000000000000000000451476576476200172730ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/libzypp.map000066400000000000000000000003021476576476200166030ustar00rootroot00000000000000ZYPP_plain { global: extern "C++" { zypp::*; vtable?for?zypp::*; typeinfo?for?zypp::*; typeinfo?name?for?zypp::*; guard?variable?for?zypp::*; }; local: *; }; libzypp-17.36.5/zypp/media/000077500000000000000000000000001476576476200154775ustar00rootroot00000000000000libzypp-17.36.5/zypp/media/CredentialFileReader.h000066400000000000000000000000601476576476200216410ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/CredentialManager.h000066400000000000000000000000551476576476200212150ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/CurlConfig.h000066400000000000000000000000401476576476200176750ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/MediaBlockList.h000066400000000000000000000000531476576476200204740ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/MediaCD.cc000066400000000000000000000463671476576476200172540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCD.cc * */ extern "C" { #include #include #if HAVE_UDEV #include #endif } #include // strerror #include // getenv #include #include #include #include #include #include #include #include #include using std::endl; /* ** if to throw exception on eject errors or ignore them */ #define REPORT_EJECT_ERRORS 0 ////////////////////////////////////////////////////////////////// namespace zypp { ////////////////////////////////////////////////////////////////// namespace media { ////////////////////////////////////////////////////////////////// namespace { using DeviceList = std::list; ////////////////////////////////////////////////////////////////// /// \brief Try to detect cd/dvd devices using udev /// /// Returns an empty device list on error. ////////////////////////////////////////////////////////////////// DeviceList systemDetectDevices( bool supportingDVD_r ) { DeviceList detected; #ifdef HAVE_UDEV // http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/index.html zypp::AutoDispose udev( ::udev_new(), ::udev_unref ); if ( ! udev ) { ERR << "Can't create udev context." << endl; return DeviceList(); } zypp::AutoDispose enumerate( ::udev_enumerate_new(udev), ::udev_enumerate_unref ); if ( ! enumerate ) { ERR << "Can't create udev list entry." << endl; return DeviceList(); } ::udev_enumerate_add_match_subsystem( enumerate, "block" ); ::udev_enumerate_add_match_property( enumerate, "ID_CDROM", "1" ); ::udev_enumerate_scan_devices( enumerate ); struct udev_list_entry * entry = 0; udev_list_entry_foreach( entry, ::udev_enumerate_get_list_entry( enumerate ) ) { zypp::AutoDispose device( ::udev_device_new_from_syspath( ::udev_enumerate_get_udev( enumerate ), ::udev_list_entry_get_name( entry ) ), ::udev_device_unref ); if ( ! device ) { ERR << "Can't create udev device." << endl; continue; } if ( supportingDVD_r && ! ::udev_device_get_property_value( device, "ID_CDROM_DVD" ) ) { continue; // looking for dvd only } const char * devnodePtr( ::udev_device_get_devnode( device ) ); if ( ! devnodePtr ) { ERR << "Got NULL devicenode." << endl; continue; } // In case we need it someday: //const char * mountpath = ::udev_device_get_property_value( device, "FSTAB_DIR" ); PathInfo devnode( devnodePtr ); if ( devnode.isBlk() ) { MediaSource media( "cdrom", devnode.path().asString(), devnode.devMajor(), devnode.devMinor() ); DBG << "Found (udev): " << media << std::endl; detected.push_back( media ); } } if ( detected.empty() ) { WAR << "Did not find any CD/DVD device." << endl; } #endif return detected; } } // namespace ////////////////////////////////////////////////////////////////// MediaCD::MediaCD( const Url & url_r, const Pathname & attach_point_hint_r ) : MediaHandler( url_r, attach_point_hint_r, url_r.getPathName(), false ) , _lastdev( -1 ) , _lastdev_tried( -1 ) { MIL << "MediaCD::MediaCD(" << url_r << ", " << attach_point_hint_r << ")" << endl; if ( url_r.getScheme() != "dvd" && url_r.getScheme() != "cd" ) { ERR << "Unsupported schema in the Url: " << url_r.asString() << endl; ZYPP_THROW(MediaUnsupportedUrlSchemeException(_url)); } std::string devices = _url.getQueryParam( "devices" ); if ( ! devices.empty() ) { std::vector words; str::split( devices, std::back_inserter(words), "," ); for ( const std::string & device : words ) { if ( device.empty() ) continue; MediaSource media( "cdrom", device, 0, 0 ); _devices.push_back( media ); DBG << "use device (delayed verify)" << device << endl; } } else { DBG << "going to use on-demand device list" << endl; return; } if ( _devices.empty() ) { ERR << "Unable to find any cdrom drive for " << _url.asString() << endl; ZYPP_THROW(MediaBadUrlEmptyDestinationException(_url)); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCD::openTray // METHOD TYPE : bool // bool MediaCD::openTray( const std::string & device_r ) { return CDTools::openTray(device_r); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCD::closeTray // METHOD TYPE : bool // bool MediaCD::closeTray( const std::string & device_r ) { return CDTools::closeTray(device_r); } MediaCD::DeviceList MediaCD::detectDevices( bool supportingDVD_r ) const { DeviceList detected( systemDetectDevices( supportingDVD_r ) ); if ( detected.empty() ) { WAR << "CD/DVD drive detection with UDEV failed! Guessing..." << std::endl; PathInfo dvdinfo( "/dev/dvd" ); PathInfo cdrinfo( "/dev/cdrom" ); if ( dvdinfo.isBlk() ) { MediaSource media( "cdrom", dvdinfo.path().asString(), dvdinfo.devMajor(), dvdinfo.devMinor() ); DBG << "Found (GUESS): " << media << std::endl; detected.push_back( media ); } if ( cdrinfo.isBlk() && ! ( cdrinfo.devMajor() == dvdinfo.devMajor() && cdrinfo.devMinor() == dvdinfo.devMinor() ) ) { MediaSource media( "cdrom", cdrinfo.path().asString(), cdrinfo.devMajor(), cdrinfo.devMinor() ); DBG << "Found (GUESS): " << media << std::endl; detected.push_back( media ); } } // NOTE: On the fly build on-demand device list. Code was moved to // here to get rid of code duplication, while keeping the ABI. Acuallty // this code should be moved to a _devices accessor method. if ( _devices.empty() ) { DBG << "creating on-demand device list" << endl; //default is /dev/cdrom; for dvd: /dev/dvd if it exists std::string device( "/dev/cdrom" ); if ( _url.getScheme() == "dvd" && PathInfo( "/dev/dvd" ).isBlk() ) { device = "/dev/dvd"; } PathInfo dinfo( device ); if ( dinfo.isBlk() ) { MediaSource media( "cdrom", device, dinfo.devMajor(), dinfo.devMinor() ); if ( detected.empty() ) { _devices.push_front( media ); // better try this than nothing } else { for( const auto & d : detected ) { // /dev/cdrom or /dev/dvd to the front if ( media.equals( d ) ) _devices.push_front( d ); else _devices.push_back( d ); } } } else { // no /dev/cdrom or /dev/dvd link _devices = detected; } } return detected; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCD::attachTo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that not already attached, and attachPoint is a directory. // void MediaCD::attachTo( bool next ) { DBG << "next " << next << " last " << _lastdev << " last tried " << _lastdev_tried << endl; if ( next && _lastdev == -1 ) ZYPP_THROW(MediaNotSupportedException(url())); // This also fills the _devices list on demand DeviceList detected( detectDevices( _url.getScheme() == "dvd" ? true : false ) ); Mount mount; MediaMountException merr; std::string options = _url.getQueryParam( "mountoptions" ); if ( options.empty() ) { options="ro"; } //TODO: make configurable std::list filesystems; filesystems.push_back("iso9660"); // if DVD, try UDF filesystem after iso9660 if ( _url.getScheme() == "dvd" ) filesystems.push_back("udf"); // try all devices in sequence int count = 0; std::string mountpoint( attachPoint().asString() ); bool mountsucceeded = false; for ( DeviceList::iterator it = _devices.begin() ; ! mountsucceeded && it != _devices.end() ; ++it, ++count ) { DBG << "count " << count << endl; if (next && count <=_lastdev_tried ) { DBG << "skipping device " << it->name << endl; continue; } _lastdev_tried = count; // bnc#755815: _devices contains either devices passed as url option // or autodetected ones. Accept both as long as they are block // devices. MediaSource temp( *it ); PathInfo dinfo( temp.name ); if ( ! dinfo.isBlk() ) { WAR << "skipping non block device: " << dinfo << endl; continue; } DBG << "trying device " << dinfo << endl; temp.maj_nr = dinfo.devMajor(); temp.min_nr = dinfo.devMinor(); MediaSourceRef media( new MediaSource(temp)); AttachedMedia ret( findAttachedMedia( media)); if( ret.mediaSource && ret.attachPoint && !ret.attachPoint->empty()) { DBG << "Using a shared media " << ret.mediaSource->name << " attached on " << ret.attachPoint->path << endl; removeAttachPoint(); setAttachPoint(ret.attachPoint); setMediaSource(ret.mediaSource); _lastdev = count; mountsucceeded = true; break; } { MediaManager manager; MountEntries entries( manager.getMountEntries()); MountEntries::const_iterator e; for( e = entries.begin(); e != entries.end(); ++e) { bool is_device = false; std::string dev_path(Pathname(e->src).asString()); PathInfo dev_info; if( dev_path.compare(0, sizeof("/dev/")-1, "/dev/") == 0 && dev_info(e->src) && dev_info.isBlk()) { is_device = true; } if( is_device && media->maj_nr == dev_info.devMajor() && media->min_nr == dev_info.devMinor()) { AttachPointRef ap( new AttachPoint(e->dir, false)); AttachedMedia am( media, ap); { DBG << "Using a system mounted media " << media->name << " attached on " << ap->path << endl; media->iown = false; // mark attachment as foreign setMediaSource(media); setAttachPoint(ap); _lastdev = count; mountsucceeded = true; break; } } } if( mountsucceeded) break; } // close tray closeTray( it->name ); // try all filesystems in sequence for(std::list::iterator fsit = filesystems.begin() ; !mountsucceeded && fsit != filesystems.end() ; ++fsit) { try { if( !isUseableAttachPoint( attachPoint() ) ) { setAttachPoint( createAttachPoint(), true ); mountpoint = attachPoint().asString(); } mount.mount(it->name, mountpoint, *fsit, options); setMediaSource(media); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 2; while( !(mountsucceeded=isAttached()) && --limit) { WAR << "Wait for /proc/mounts update and retry...." << endl; sleep(1); } if( mountsucceeded) { _lastdev = count; } else { setMediaSource(MediaSourceRef()); try { mount.umount(attachPoint().asString()); } catch (const MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW(MediaMountException( "Unable to verify that the media was mounted", it->name, mountpoint )); } } catch (const MediaMountException &e) { merr = e; removeAttachPoint(); ZYPP_CAUGHT(e); } catch (const MediaException & excpt_r) { removeAttachPoint(); ZYPP_CAUGHT(excpt_r); } } // for filesystems } // for _devices if (!mountsucceeded) { _lastdev = -1; if( !merr.mountOutput().empty()) { ZYPP_THROW(MediaMountException(merr.mountError(), _url.asString(), mountpoint, merr.mountOutput())); } else { ZYPP_THROW(MediaMountException("Mounting media failed", _url.asString(), mountpoint)); } } DBG << _lastdev << " " << count << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCD::releaseFrom // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaCD::releaseFrom( const std::string & ejectDev ) { Mount mount; try { AttachedMedia am( attachedMedia()); if(am.mediaSource && am.mediaSource->iown) mount.umount(am.attachPoint->path.asString()); } catch (const Exception & excpt_r) { ZYPP_CAUGHT(excpt_r); if (!ejectDev.empty()) { forceRelaseAllMedia(false); if(openTray( ejectDev )) return; } ZYPP_RETHROW(excpt_r); } // eject device if (!ejectDev.empty()) { forceRelaseAllMedia(false); if( !openTray( ejectDev )) { #if REPORT_EJECT_ERRORS ZYPP_THROW(MediaNotEjectedException(ejectDev)); #endif } } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCD::forceEject // METHOD TYPE : void // // Asserted that media is not attached. // void MediaCD::forceEject( const std::string & ejectDev_r ) { #if REPORT_EJECT_ERRORS bool ejected = false; #endif if ( ! isAttached() ) // no device mounted in this instance { // This also fills the _devices list on demand DeviceList detected( detectDevices( _url.getScheme() == "dvd" ? true : false ) ); for_( it, _devices.begin(), _devices.end() ) { MediaSourceRef media( new MediaSource( *it ) ); if ( media->name != ejectDev_r ) continue; // bnc#755815: _devices contains either devices passed as url option // or autodetected ones. Accept both as long as they are block // devices. PathInfo dinfo( media->name ); if( ! dinfo.isBlk() ) { WAR << "skipping non block device: " << dinfo << endl; continue; } DBG << "trying device " << dinfo << endl; // FIXME: we have also to check if it is mounted in the system AttachedMedia ret( findAttachedMedia( media)); if( !ret.mediaSource ) { forceRelaseAllMedia( media, false ); if ( openTray( it->name ) ) { #if REPORT_EJECT_ERRORS ejected = true; #endif break; // on 1st success } } } } #if REPORT_EJECT_ERRORS if( !ejected) { ZYPP_THROW(MediaNotEjectedException()); } #endif } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaCD::isAttached // METHOD TYPE : bool // // DESCRIPTION : Override check if media is attached. // bool MediaCD::isAttached() const { return checkAttached(false); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaCD::getFile // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaCD::getFile( const OnMediaLocation &file ) const { MediaHandler::getFile( file ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaCD::getDir // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaCD::getDir( const Pathname & dirname, bool recurse_r ) const { MediaHandler::getDir( dirname, recurse_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCD::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaCD::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCD::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaCD::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } bool MediaCD::getDoesFileExist( const Pathname & filename ) const { return MediaHandler::getDoesFileExist( filename ); } bool MediaCD::hasMoreDevices() { if (_devices.size() == 0) return false; else if (_lastdev_tried < 0) return true; return (unsigned) _lastdev_tried < _devices.size() - 1; } void MediaCD::getDetectedDevices( std::vector & devices, unsigned int & index ) const { if ( ! devices.empty() ) devices.clear(); if ( _devices.empty() ) // This also fills the _devices list on demand detectDevices( _url.getScheme() == "dvd" ? true : false ); for ( const auto & it : _devices ) devices.push_back( it.name ); index = ( _lastdev >= 0 ? (unsigned)_lastdev : 0 ); MIL << "got " << devices.size() << " detected devices, current: " << (index < devices.size() ? devices[index] : "") << "(" << index << ")" << endl; } } // namespace media ////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/media/MediaCD.h000066400000000000000000000053561476576476200171070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCD.h * */ #ifndef ZYPP_MEDIA_MEDIACD_H #define ZYPP_MEDIA_MEDIACD_H #include #include namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaCD /** * @short Implementation class for CD/DVD MediaHandler * @see MediaHandler **/ class MediaCD : public MediaHandler { private: using DeviceList = std::list; /** list of devices to try to mount */ mutable DeviceList _devices; /** number of last successful mounted device in list */ int _lastdev; int _lastdev_tried; static bool openTray( const std::string & device_r ); static bool closeTray( const std::string & device_r ); DeviceList detectDevices(bool supportingDVD) const; protected: void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev ) override; void getFile(const OnMediaLocation & file) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; bool getDoesFileExist( const Pathname & filename ) const override; void forceEject(const std::string & ejectDev) override; bool hasMoreDevices() override; void getDetectedDevices(std::vector & devices, unsigned int & index) const override; public: MediaCD( const Url & url_r, const Pathname & attach_point_hint_r ); ~MediaCD() override { try { release(); } catch(...) {} } bool isAttached() const override; }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIACD_H libzypp-17.36.5/zypp/media/MediaCIFS.cc000066400000000000000000000337761476576476200175120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCIFS.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; namespace zypp { namespace media { /****************************************************************** ** ** ** FUNCTION NAME : getShare ** FUNCTION TYPE : inline Pathname ** ** Get the 1st path component (CIFS share name). */ inline std::string getShare( const Pathname& spath_r ) { if ( spath_r.empty() ) return std::string(); std::string share( spath_r.absolutename().asString() ); std::string::size_type sep = share.find( '/', 1 ); if ( sep == std::string::npos ) share = share.erase( 0, 1 ); // nothing but the share name in spath_r else share = share.substr( 1, sep-1 ); // deescape %2f in sharename while ( (sep = share.find( "%2f" )) != std::string::npos ) { share.replace( sep, 3, "/" ); } return share; } /****************************************************************** ** ** ** FUNCTION NAME : stripShare ** FUNCTION TYPE : inline Pathname ** ** Strip off the 1st path component (CIFS share name). */ inline Pathname stripShare( const Pathname& spath_r ) { if ( spath_r.empty() ) return Pathname(); std::string striped( spath_r.absolutename().asString() ); std::string::size_type sep = striped.find( '/', 1 ); if ( sep == std::string::npos ) return "/"; // nothing but the share name in spath_r return striped.substr( sep ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaCIFS // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCIFS::MediaCIFS // METHOD TYPE : Constructor // // DESCRIPTION : // MediaCIFS::MediaCIFS( const Url & url_r, const Pathname & attach_point_hint_r ) : MediaHandler( url_r, attach_point_hint_r, stripShare( url_r.getPathName() ), // urlpath WITHOUT share name at attachpoint false ) // does_download { MIL << "MediaCIFS::MediaCIFS(" << url_r << ", " << attach_point_hint_r << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCIFS::attachTo // METHOD TYPE : PMError /** * Asserted that not already attached, and attachPoint is a directory. * * Authentication: credentials can be specified in the following few ways * (the first has the highest preference). * - URL username:password * - mountoptions URL query parameter (see man mount.cifs) * - CredentialManager - either previously saved credentials will be used * or the user will be promted for them via AuthenticationReport callback. * * \note The implementation currently serves both, "smb" and * and "cifs" URLs, but passes "cifs" to the mount command * in any case. */ void MediaCIFS::attachTo(bool next) { if(_url.getHost().empty()) ZYPP_THROW(MediaBadUrlEmptyHostException(_url)); if(next) ZYPP_THROW(MediaNotSupportedException(_url)); std::string path = "//"; path += _url.getHost() + "/" + getShare( _url.getPathName() ); MediaSourceRef media( new MediaSource( "cifs", path)); AttachedMedia ret( findAttachedMedia( media)); if( ret.mediaSource && ret.attachPoint && !ret.attachPoint->empty()) { DBG << "Using a shared media " << ret.mediaSource->name << " attached on " << ret.attachPoint->path << endl; removeAttachPoint(); setAttachPoint(ret.attachPoint); setMediaSource(ret.mediaSource); return; } if( !isUseableAttachPoint( attachPoint() ) ) { setAttachPoint( createAttachPoint(), true ); } std::string mountpoint( attachPoint().asString() ); Mount mount; CredentialManager cm(CredManagerOptions(ZConfig::instance().repoManagerRoot())); Mount::Options options( _url.getQueryParam("mountoptions") ); std::string username = _url.getUsername(); std::string password = _url.getPassword(); if ( ! options.has( "rw" ) ) { options["ro"]; } // look for a workgroup std::string workgroup = _url.getQueryParam("workgroup"); if ( workgroup.empty() ) workgroup = _url.getQueryParam("domain"); if ( !workgroup.empty() ) options["domain"] = workgroup; // extract 'username', do not overwrite any _url.username Mount::Options::iterator toEnv; toEnv = options.find("username"); if ( toEnv != options.end() ) { if ( username.empty() ) username = toEnv->second; options.erase( toEnv ); } toEnv = options.find("user"); // actually cifs specific if ( toEnv != options.end() ) { if ( username.empty() ) username = toEnv->second; options.erase( toEnv ); } // extract 'password', do not overwrite any _url.password toEnv = options.find("password"); if ( toEnv != options.end() ) { if ( password.empty() ) password = toEnv->second; options.erase( toEnv ); } toEnv = options.find("pass"); // actually cifs specific if ( toEnv != options.end() ) { if ( password.empty() ) password = toEnv->second; options.erase( toEnv ); } if ( username.empty() || password.empty() ) { AuthData_Ptr c = cm.getCred(_url); if (c) { username = c->username(); password = c->password(); } } bool firstTry = true; bool authRequired = false; AuthData authdata; do // repeat this while the mount returns "Permission denied" error { // get credentials from authenicate() if ( !firstTry ) { username = authdata.username(); password = authdata.password(); } // pass 'username' and 'password' via environment Mount::Environment environment; if ( !username.empty() ) environment["USER"] = username; if ( !password.empty() ) environment["PASSWD"] = password; ////////////////////////////////////////////////////// // In case we need a tmpfile, credentials will remove // it in its destructor after the mout call below. filesystem::TmpPath credentials; if ( !username.empty() || !password.empty() ) { filesystem::TmpFile tmp; std::ofstream outs( tmp.path().asString().c_str() ); outs << "username=" << username << endl; outs << "password=" << password << endl; outs.close(); credentials = tmp; options["credentials"] = credentials.path().asString(); } else { // Use 'guest' option unless explicitly disabled (bnc #547354) if ( options.has( "noguest" ) ) options.erase( "noguest" ); else // prevent smbmount from asking for password // only add this option if 'credentials' is not used (bnc #560496) options["guest"]; } // ////////////////////////////////////////////////////// try { mount.mount( path, mountpoint, "cifs", options.asString(), environment ); setMediaSource(media); break; } catch (const MediaMountException & e) { ZYPP_CAUGHT( e ); if ( e.mountError() == "Permission denied" ) authRequired = authenticate( authdata, firstTry ); else ZYPP_RETHROW( e ); } firstTry = false; } while ( authRequired ); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; while( !(mountsucceeded=isAttached()) && --limit) sleep(1); if ( !mountsucceeded ) { setMediaSource(MediaSourceRef()); try { mount.umount(attachPoint().asString()); } catch (const MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW(MediaMountException( "Unable to verify that the media was mounted", path, mountpoint )); } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaCIFS::isAttached // METHOD TYPE : bool // // DESCRIPTION : Override check if media is attached. // bool MediaCIFS::isAttached() const { return checkAttached(true); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCIFS::releaseFrom // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaCIFS::releaseFrom( const std::string & ejectDev ) { Mount mount; mount.umount(attachPoint().asString()); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaCIFS::getFile // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaCIFS::getFile ( const OnMediaLocation &file ) const { MediaHandler::getFile( file ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaCIFS::getDir // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaCIFS::getDir( const Pathname & dirname, bool recurse_r ) const { MediaHandler::getDir( dirname, recurse_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCIFS::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaCIFS::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaCIFS::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaCIFS::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } bool MediaCIFS::getDoesFileExist( const Pathname & filename ) const { return MediaHandler::getDoesFileExist( filename ); } bool MediaCIFS::authenticate(AuthData & authdata, bool firstTry) const { //! \todo need a way to pass different CredManagerOptions here CredentialManager cm(CredManagerOptions(ZConfig::instance().repoManagerRoot())); // get stored credentials AuthData_Ptr cmcred = cm.getCred(_url); AuthData_Ptr smbcred; smbcred.reset(new AuthData()); callback::SendReport auth_report; // preset the username if present in current url if (!_url.getUsername().empty() && firstTry) smbcred->setUsername(_url.getUsername()); // if CM has found some credentials, preset the username from there else if (cmcred) smbcred->setUsername(cmcred->username()); // indicate we have no good credentials from CM cmcred.reset(); std::string prompt_msg = str::form( //!\todo add comma to the message for the next release _("Authentication required for '%s'"), _url.asString().c_str()); // ask user if (auth_report->prompt(_url, prompt_msg, *smbcred)) { DBG << "callback answer: retry" << endl << "AuthData: " << *smbcred << endl; if (smbcred->valid()) { cmcred = smbcred; // if (credentials->username() != _url.getUsername()) // _url.setUsername(credentials->username()); /** * \todo find a way to save the url with changed username * back to repoinfo or dont store urls with username * (and either forbid more repos with the same url and different * user, or return a set of credentials from CM and try them one * by one) */ } } else DBG << "callback answer: cancel" << endl; // set username and password if (cmcred) { authdata.setUsername(cmcred->username()); authdata.setPassword(cmcred->password()); // save the credentials cmcred->setUrl(_url); cm.addCred(*cmcred); cm.save(); return true; } return false; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp/media/MediaCIFS.h000066400000000000000000000043371476576476200173430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCIFS.h * */ #ifndef ZYPP_MEDIA_MEDIACIFS_H #define ZYPP_MEDIA_MEDIACIFS_H #include namespace zypp { namespace media { class AuthData; /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaCIFS /** * @short Implementation class for CIFS MediaHandler * * NOTE: The implementation serves both, "smb" and "cifs" URLs, * but passes "cifs" to the mount command in any case. * @see MediaHandler **/ class MediaCIFS : public MediaHandler { protected: void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; bool getDoesFileExist( const Pathname & filename ) const override; public: MediaCIFS( const Url& url_r, const Pathname & attach_point_hint_r ); ~MediaCIFS() override { try { release(); } catch(...) {} } bool isAttached() const override; private: bool authenticate( AuthData & authdata, bool firstTry ) const; }; ///////////////////////////////////////////////////////////////////A } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIACIFS_H libzypp-17.36.5/zypp/media/MediaCurl.cc000066400000000000000000001343541476576476200176650ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCurl.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // for zypp_poll #include #include #include #include #include #include #include #include "detail/OptionalDownloadProgressReport.h" using std::endl; namespace internal { using namespace zypp; struct ProgressData { ProgressData( CURL *curl, time_t timeout = 0, zypp::Url url = zypp::Url(), zypp::ByteCount expectedFileSize_r = 0, zypp::callback::SendReport *_report = nullptr ); void updateStats( curl_off_t dltotal = 0.0, curl_off_t dlnow = 0.0 ); int reportProgress() const; CURL * curl() { return _curl; } bool timeoutReached() const { return _timeoutReached; } bool fileSizeExceeded() const { return _fileSizeExceeded; } ByteCount expectedFileSize() const { return _expectedFileSize; } void expectedFileSize( ByteCount newval_r ) { _expectedFileSize = newval_r; } private: CURL * _curl; zypp::Url _url; time_t _timeout; bool _timeoutReached; bool _fileSizeExceeded; ByteCount _expectedFileSize; zypp::callback::SendReport *report; time_t _timeStart = 0; ///< Start total stats time_t _timeLast = 0; ///< Start last period(~1sec) time_t _timeRcv = 0; ///< Start of no-data timeout time_t _timeNow = 0; ///< Now curl_off_t _dnlTotal = 0.0; ///< Bytes to download or 0 if unknown curl_off_t _dnlLast = 0.0; ///< Bytes downloaded at period start curl_off_t _dnlNow = 0.0; ///< Bytes downloaded now int _dnlPercent= 0; ///< Percent completed or 0 if _dnlTotal is unknown double _drateTotal= 0.0; ///< Download rate so far double _drateLast = 0.0; ///< Download rate in last period }; ProgressData::ProgressData(CURL *curl, time_t timeout, Url url, ByteCount expectedFileSize_r, zypp::callback::SendReport< zypp::media::DownloadProgressReport> *_report) : _curl( curl ) , _url(std::move( url )) , _timeout( timeout ) , _timeoutReached( false ) , _fileSizeExceeded ( false ) , _expectedFileSize( expectedFileSize_r ) , report( _report ) {} void ProgressData::updateStats( curl_off_t dltotal, curl_off_t dlnow ) { time_t now = _timeNow = time(0); // If called without args (0.0), recompute based on the last values seen if ( dltotal && dltotal != _dnlTotal ) _dnlTotal = dltotal; if ( dlnow && dlnow != _dnlNow ) { _timeRcv = now; _dnlNow = dlnow; } // init or reset if time jumps back if ( !_timeStart || _timeStart > now ) _timeStart = _timeLast = _timeRcv = now; // timeout condition if ( _timeout ) _timeoutReached = ( (now - _timeRcv) > _timeout ); // check if the downloaded data is already bigger than what we expected _fileSizeExceeded = _expectedFileSize > 0 && _expectedFileSize < static_cast(_dnlNow); // percentage: if ( _dnlTotal ) _dnlPercent = int( _dnlNow * 100 / _dnlTotal ); // download rates: _drateTotal = double(_dnlNow) / std::max( int(now - _timeStart), 1 ); if ( _timeLast < now ) { _drateLast = double(_dnlNow - _dnlLast) / int(now - _timeLast); // start new period _timeLast = now; _dnlLast = _dnlNow; } else if ( _timeStart == _timeLast ) _drateLast = _drateTotal; } int ProgressData::reportProgress() const { if ( _fileSizeExceeded ) return 1; if ( _timeoutReached ) return 1; // no-data timeout if ( report && !(*report)->progress( _dnlPercent, _url, _drateTotal, _drateLast ) ) return 1; // user requested abort return 0; } /// Attempt to work around certain issues by autoretry in MediaCurl::getFileCopy /// E.g. curl error: 92: HTTP/2 PROTOCOL_ERROR as in bsc#1205843, zypper/issues/457,... /// ma: These errors were caused by a space terminated user agent string (bsc#1212187) class MediaCurlExceptionMayRetryInternaly : public media::MediaCurlException { public: MediaCurlExceptionMayRetryInternaly( const Url & url_r, const std::string & err_r, const std::string & msg_r ) : media::MediaCurlException( url_r, err_r, msg_r ) {} //~MediaCurlExceptionMayRetryInternaly() noexcept {} }; } using namespace internal; using namespace zypp::base; namespace zypp { namespace media { Pathname MediaCurl::_cookieFile = "/var/lib/YaST2/cookies"; // we use this define to unbloat code as this C setting option // and catching exception is done frequently. /** \todo deprecate SET_OPTION and use the typed versions below. */ #define SET_OPTION(opt,val) do { \ ret = curl_easy_setopt ( _curl, opt, val ); \ if ( ret != 0) { \ ZYPP_THROW(MediaCurlSetOptException(_url, _curlError)); \ } \ } while ( false ) #define SET_OPTION_OFFT(opt,val) SET_OPTION(opt,(curl_off_t)val) #define SET_OPTION_LONG(opt,val) SET_OPTION(opt,(long)val) #define SET_OPTION_VOID(opt,val) SET_OPTION(opt,(void*)val) MediaCurl::MediaCurl( const Url & url_r, const Pathname & attach_point_hint_r ) : MediaNetworkCommonHandler( url_r, attach_point_hint_r, "/", // urlpath at attachpoint true ), // does_download _curl( NULL ), _customHeaders(0L) { _curlError[0] = '\0'; MIL << "MediaCurl::MediaCurl(" << url_r << ", " << attach_point_hint_r << ")" << endl; globalInitCurlOnce(); if( !attachPoint().empty()) { PathInfo ainfo(attachPoint()); Pathname apath(attachPoint() + "XXXXXX"); char *atemp = ::strdup( apath.asString().c_str()); char *atest = NULL; if( !ainfo.isDir() || !ainfo.userMayRWX() || atemp == NULL || (atest=::mkdtemp(atemp)) == NULL) { WAR << "attach point " << ainfo.path() << " is not useable for " << url_r.getScheme() << endl; setAttachPoint("", true); } else if( atest != NULL) ::rmdir(atest); if( atemp != NULL) ::free(atemp); } } Url MediaCurl::clearQueryString(const Url &url) const { return internal::clearQueryString(url); } void MediaCurl::setCookieFile( const Pathname &fileName ) { _cookieFile = fileName; } void MediaCurl::setCurlError(const char* error) { // FIXME(dmllr): Use strlcpy if available for better performance strncpy(_curlError, error, sizeof(_curlError)-1); _curlError[sizeof(_curlError)-1] = '\0'; } /////////////////////////////////////////////////////////////////// void MediaCurl::checkProtocol(const Url &url) const { curl_version_info_data *curl_info = NULL; curl_info = curl_version_info(CURLVERSION_NOW); // curl_info does not need any free (is static) if (curl_info->protocols) { const char * const *proto = nullptr; std::string scheme( url.getScheme()); bool found = false; for(proto=curl_info->protocols; !found && *proto; ++proto) { if( scheme == std::string((const char *)*proto)) found = true; } if( !found) { std::string msg("Unsupported protocol '"); msg += scheme; msg += "'"; ZYPP_THROW(MediaBadUrlException(_url, msg)); } } } void MediaCurl::setupEasy() { ::internal::setupZYPP_MEDIA_CURL_DEBUG( _curl ); curl_easy_setopt(_curl, CURLOPT_HEADERFUNCTION, log_redirects_curl); curl_easy_setopt(_curl, CURLOPT_HEADERDATA, &_lastRedirect); CURLcode ret = curl_easy_setopt( _curl, CURLOPT_ERRORBUFFER, _curlError ); if ( ret != 0 ) { ZYPP_THROW(MediaCurlSetOptException(_url, "Error setting error buffer")); } SET_OPTION(CURLOPT_FAILONERROR, 1L); SET_OPTION(CURLOPT_NOSIGNAL, 1L); // create non persistant settings // so that we don't add headers twice TransferSettings vol_settings(_settings); // add custom headers for download.opensuse.org (bsc#955801) if ( _url.getHost() == "download.opensuse.org" ) { vol_settings.addHeader(anonymousIdHeader()); vol_settings.addHeader(distributionFlavorHeader()); } vol_settings.addHeader("Pragma:"); _settings.setUserAgentString(agentString()); // fill some settings from url query parameters try { fillSettingsFromUrl(_url, _settings); } catch ( const MediaException &e ) { disconnectFrom(); ZYPP_RETHROW(e); } // if the proxy was not set (or explicitly unset) by url, then look... if ( _settings.proxy().empty() ) { // ...at the system proxy settings fillSettingsSystemProxy(_url, _settings); } /** Force IPv4/v6 */ switch ( env::ZYPP_MEDIA_CURL_IPRESOLVE() ) { case 4: SET_OPTION(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); break; case 6: SET_OPTION(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); break; } /** * Connect timeout */ SET_OPTION(CURLOPT_CONNECTTIMEOUT, _settings.connectTimeout()); // If a transfer timeout is set, also set CURLOPT_TIMEOUT to an upper limit // just in case curl does not trigger its progress callback frequently // enough. if ( _settings.timeout() ) { SET_OPTION(CURLOPT_TIMEOUT, 3600L); } // follow any Location: header that the server sends as part of // an HTTP header (#113275) SET_OPTION(CURLOPT_FOLLOWLOCATION, 1L); // 3 redirects seem to be too few in some cases (bnc #465532) SET_OPTION(CURLOPT_MAXREDIRS, 6L); if ( _url.getScheme() == "https" ) { if ( :: internal::setCurlRedirProtocols ( _curl ) != CURLE_OK ) { ZYPP_THROW(MediaCurlSetOptException(_url, _curlError)); } if( _settings.verifyPeerEnabled() || _settings.verifyHostEnabled() ) { SET_OPTION(CURLOPT_CAPATH, _settings.certificateAuthoritiesPath().c_str()); } if( ! _settings.clientCertificatePath().empty() ) { SET_OPTION(CURLOPT_SSLCERT, _settings.clientCertificatePath().c_str()); } if( ! _settings.clientKeyPath().empty() ) { SET_OPTION(CURLOPT_SSLKEY, _settings.clientKeyPath().c_str()); } #ifdef CURLSSLOPT_ALLOW_BEAST // see bnc#779177 ret = curl_easy_setopt( _curl, CURLOPT_SSL_OPTIONS, CURLSSLOPT_ALLOW_BEAST ); if ( ret != 0 ) { disconnectFrom(); ZYPP_THROW(MediaCurlSetOptException(_url, _curlError)); } #endif SET_OPTION(CURLOPT_SSL_VERIFYPEER, _settings.verifyPeerEnabled() ? 1L : 0L); SET_OPTION(CURLOPT_SSL_VERIFYHOST, _settings.verifyHostEnabled() ? 2L : 0L); // bnc#903405 - POODLE: libzypp should only talk TLS SET_OPTION(CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); } SET_OPTION(CURLOPT_USERAGENT, _settings.userAgentString().c_str() ); /* Fixes bsc#1174011 "auth=basic ignored in some cases" * We should proactively add the password to the request if basic auth is configured * and a password is available in the credentials but not in the URL. * * We will be a bit paranoid here and require that the URL has a user embedded, otherwise we go the default route * and ask the server first about the auth method */ if ( _settings.authType() == "basic" && _settings.username().size() && !_settings.password().size() ) { CredentialManager cm(CredManagerOptions(ZConfig::instance().repoManagerRoot())); const auto cred = cm.getCred( _url ); if ( cred && cred->valid() ) { if ( !_settings.username().size() ) _settings.setUsername(cred->username()); _settings.setPassword(cred->password()); } } /*---------------------------------------------------------------* CURLOPT_USERPWD: [user name]:[password] Url::username/password -> CURLOPT_USERPWD If not provided, anonymous FTP identification *---------------------------------------------------------------*/ if ( _settings.userPassword().size() ) { SET_OPTION(CURLOPT_USERPWD, _settings.userPassword().c_str()); std::string use_auth = _settings.authType(); if (use_auth.empty()) use_auth = "digest,basic"; // our default long auth = CurlAuthData::auth_type_str2long(use_auth); if( auth != CURLAUTH_NONE) { DBG << "Enabling HTTP authentication methods: " << use_auth << " (CURLOPT_HTTPAUTH=" << auth << ")" << std::endl; SET_OPTION(CURLOPT_HTTPAUTH, auth); } } if ( _settings.proxyEnabled() && ! _settings.proxy().empty() ) { DBG << "Proxy: '" << _settings.proxy() << "'" << endl; SET_OPTION(CURLOPT_PROXY, _settings.proxy().c_str()); SET_OPTION(CURLOPT_PROXYAUTH, CURLAUTH_BASIC|CURLAUTH_DIGEST|CURLAUTH_NTLM ); /*---------------------------------------------------------------* * CURLOPT_PROXYUSERPWD: [user name]:[password] * * Url::option(proxyuser and proxypassword) -> CURLOPT_PROXYUSERPWD * If not provided, $HOME/.curlrc is evaluated *---------------------------------------------------------------*/ std::string proxyuserpwd = _settings.proxyUserPassword(); if ( proxyuserpwd.empty() ) { CurlConfig curlconf; CurlConfig::parseConfig(curlconf); // parse ~/.curlrc if ( curlconf.proxyuserpwd.empty() ) DBG << "Proxy: ~/.curlrc does not contain the proxy-user option" << endl; else { proxyuserpwd = curlconf.proxyuserpwd; DBG << "Proxy: using proxy-user from ~/.curlrc" << endl; } } else { DBG << "Proxy: using provided proxy-user '" << _settings.proxyUsername() << "'" << endl; } if ( ! proxyuserpwd.empty() ) { SET_OPTION(CURLOPT_PROXYUSERPWD, curlUnEscape( proxyuserpwd ).c_str()); } } #if CURLVERSION_AT_LEAST(7,19,4) else if ( _settings.proxy() == EXPLICITLY_NO_PROXY ) { // Explicitly disabled in URL (see fillSettingsFromUrl()). // This should also prevent libcurl from looking into the environment. DBG << "Proxy: explicitly NOPROXY" << endl; SET_OPTION(CURLOPT_NOPROXY, "*"); } #endif else { DBG << "Proxy: not explicitly set" << endl; DBG << "Proxy: libcurl may look into the environment" << endl; } /** Speed limits */ if ( _settings.minDownloadSpeed() != 0 ) { SET_OPTION(CURLOPT_LOW_SPEED_LIMIT, _settings.minDownloadSpeed()); // default to 10 seconds at low speed SET_OPTION(CURLOPT_LOW_SPEED_TIME, 60L); } #if CURLVERSION_AT_LEAST(7,15,5) if ( _settings.maxDownloadSpeed() != 0 ) SET_OPTION_OFFT(CURLOPT_MAX_RECV_SPEED_LARGE, _settings.maxDownloadSpeed()); #endif /*---------------------------------------------------------------* *---------------------------------------------------------------*/ _currentCookieFile = _cookieFile.asString(); if ( ::geteuid() == 0 || PathInfo(_currentCookieFile).owner() == ::geteuid() ) filesystem::assert_file_mode( _currentCookieFile, 0600 ); const auto &cookieFileParam = _url.getQueryParam( "cookies" ); if ( !cookieFileParam.empty() && str::strToBool( cookieFileParam, true ) ) SET_OPTION(CURLOPT_COOKIEFILE, _currentCookieFile.c_str() ); else MIL << "No cookies requested" << endl; SET_OPTION(CURLOPT_COOKIEJAR, _currentCookieFile.c_str() ); SET_OPTION(CURLOPT_XFERINFOFUNCTION, &progressCallback ); SET_OPTION(CURLOPT_NOPROGRESS, 0L); #if CURLVERSION_AT_LEAST(7,18,0) // bnc #306272 SET_OPTION(CURLOPT_PROXY_TRANSFER_MODE, 1L ); #endif // Append settings custom headers to curl. // TransferSettings assert strings are trimmed (HTTP/2 RFC 9113) for ( const auto &header : vol_settings.headers() ) { _customHeaders = curl_slist_append(_customHeaders, header.c_str()); if ( !_customHeaders ) ZYPP_THROW(MediaCurlInitException(_url)); } SET_OPTION(CURLOPT_HTTPHEADER, _customHeaders); } /////////////////////////////////////////////////////////////////// void MediaCurl::attachTo (bool next) { if ( next ) ZYPP_THROW(MediaNotSupportedException(_url)); if ( !_url.isValid() ) ZYPP_THROW(MediaBadUrlException(_url)); checkProtocol(_url); if( !isUseableAttachPoint( attachPoint() ) ) { setAttachPoint( createAttachPoint(), true ); } disconnectFrom(); // clean _curl if needed _curl = curl_easy_init(); if ( !_curl ) { ZYPP_THROW(MediaCurlInitException(_url)); } try { setupEasy(); } catch (Exception & ex) { disconnectFrom(); ZYPP_RETHROW(ex); } // FIXME: need a derived class to propelly compare url's MediaSourceRef media( new MediaSource(_url.getScheme(), _url.asString())); setMediaSource(media); } bool MediaCurl::checkAttachPoint(const Pathname &apoint) const { return MediaHandler::checkAttachPoint( apoint, true, true); } /////////////////////////////////////////////////////////////////// void MediaCurl::disconnectFrom() { if ( _customHeaders ) { curl_slist_free_all(_customHeaders); _customHeaders = 0L; } if ( _curl ) { // bsc#1201092: Strange but within global_dtors we may exceptions here. try { curl_easy_cleanup( _curl ); } catch (...) { ; } _curl = NULL; } } /////////////////////////////////////////////////////////////////// void MediaCurl::releaseFrom( const std::string & ejectDev ) { disconnect(); } /////////////////////////////////////////////////////////////////// void MediaCurl::getFile( const OnMediaLocation &file ) const { // Use absolute file name to prevent access of files outside of the // hierarchy below the attach point. getFileCopy( file, localPath(file.filename()).absolutename() ); } /////////////////////////////////////////////////////////////////// void MediaCurl::getFileCopy( const OnMediaLocation & srcFile , const Pathname & target ) const { const auto &filename = srcFile.filename(); // Optional files will send no report until data are actually received (we know it exists). OptionalDownloadProgressReport reportfilter( srcFile.optional() ); callback::SendReport report; Url fileurl(getFileUrl(filename)); bool firstAuth = true; // bsc#1210870: authenticate must not return stored credentials more than once. unsigned internalTry = 0; static constexpr unsigned maxInternalTry = 3; do { try { doGetFileCopy( srcFile, target, report ); break; // success! } // retry with proper authentication data catch (MediaUnauthorizedException & ex_r) { if ( authenticate(ex_r.hint(), firstAuth) ) { firstAuth = false; // must not return stored credentials again continue; // retry } report->finish(fileurl, zypp::media::DownloadProgressReport::ACCESS_DENIED, ex_r.asUserHistory()); ZYPP_RETHROW(ex_r); } // unexpected exception catch (MediaException & excpt_r) { if ( typeid(excpt_r) == typeid( MediaCurlExceptionMayRetryInternaly ) ) { ++internalTry; if ( internalTry < maxInternalTry ) { // just report (NO_ERROR); no interactive request to the user report->problem(fileurl, media::DownloadProgressReport::NO_ERROR, excpt_r.asUserHistory()+_("Will try again...")); continue; // retry } excpt_r.addHistory( str::Format(_("Giving up after %1% attempts.")) % maxInternalTry ); } media::DownloadProgressReport::Error reason = media::DownloadProgressReport::ERROR; if( typeid(excpt_r) == typeid( media::MediaFileNotFoundException ) || typeid(excpt_r) == typeid( media::MediaNotAFileException ) ) { reason = media::DownloadProgressReport::NOT_FOUND; } report->finish(fileurl, reason, excpt_r.asUserHistory()); ZYPP_RETHROW(excpt_r); } } while ( true ); report->finish(fileurl, zypp::media::DownloadProgressReport::NO_ERROR, ""); } /////////////////////////////////////////////////////////////////// bool MediaCurl::getDoesFileExist( const Pathname & filename ) const { bool retry = false; do { try { return doGetDoesFileExist( filename ); } // authentication problem, retry with proper authentication data catch (MediaUnauthorizedException & ex_r) { if(authenticate(ex_r.hint(), !retry)) retry = true; else ZYPP_RETHROW(ex_r); } // unexpected exception catch (MediaException & excpt_r) { ZYPP_RETHROW(excpt_r); } } while (retry); return false; } /////////////////////////////////////////////////////////////////// void MediaCurl::evaluateCurlCode(const Pathname &filename, CURLcode code, bool timeout_reached) const { if ( code != 0 ) { Url url; if (filename.empty()) url = _url; else url = getFileUrl(filename); std::string err; { switch ( code ) { case CURLE_UNSUPPORTED_PROTOCOL: err = " Unsupported protocol"; if ( !_lastRedirect.empty() ) { err += " or redirect ("; err += _lastRedirect; err += ")"; } break; case CURLE_URL_MALFORMAT: case CURLE_URL_MALFORMAT_USER: err = " Bad URL"; break; case CURLE_LOGIN_DENIED: ZYPP_THROW( MediaUnauthorizedException(url, "Login failed.", _curlError, "")); break; case CURLE_HTTP_RETURNED_ERROR: { long httpReturnCode = 0; CURLcode infoRet = curl_easy_getinfo( _curl, CURLINFO_RESPONSE_CODE, &httpReturnCode ); if ( infoRet == CURLE_OK ) { std::string msg = "HTTP response: " + str::numstring( httpReturnCode ); switch ( httpReturnCode ) { case 401: { std::string auth_hint = getAuthHint(); DBG << msg << " Login failed (URL: " << url.asString() << ")" << std::endl; DBG << "MediaUnauthorizedException auth hint: '" << auth_hint << "'" << std::endl; ZYPP_THROW(MediaUnauthorizedException( url, "Login failed.", _curlError, auth_hint )); } case 502: // bad gateway (bnc #1070851) case 503: // service temporarily unavailable (bnc #462545) ZYPP_THROW(MediaTemporaryProblemException(url)); case 504: // gateway timeout ZYPP_THROW(MediaTimeoutException(url)); case 403: { std::string msg403; if ( url.getHost().find(".suse.com") != std::string::npos ) msg403 = _("Visit the SUSE Customer Center to check whether your registration is valid and has not expired."); else if (url.asString().find("novell.com") != std::string::npos) msg403 = _("Visit the Novell Customer Center to check whether your registration is valid and has not expired."); ZYPP_THROW(MediaForbiddenException(url, msg403)); } case 404: case 410: ZYPP_THROW(MediaFileNotFoundException(_url, filename)); } DBG << msg << " (URL: " << url.asString() << ")" << std::endl; ZYPP_THROW(MediaCurlException(url, msg, _curlError)); } else { std::string msg = "Unable to retrieve HTTP response:"; DBG << msg << " (URL: " << url.asString() << ")" << std::endl; ZYPP_THROW(MediaCurlException(url, msg, _curlError)); } } break; case CURLE_FTP_COULDNT_RETR_FILE: #if CURLVERSION_AT_LEAST(7,16,0) case CURLE_REMOTE_FILE_NOT_FOUND: #endif case CURLE_FTP_ACCESS_DENIED: case CURLE_TFTP_NOTFOUND: err = "File not found"; ZYPP_THROW(MediaFileNotFoundException(_url, filename)); break; case CURLE_BAD_PASSWORD_ENTERED: case CURLE_FTP_USER_PASSWORD_INCORRECT: err = "Login failed"; break; case CURLE_COULDNT_RESOLVE_PROXY: case CURLE_COULDNT_RESOLVE_HOST: case CURLE_COULDNT_CONNECT: case CURLE_FTP_CANT_GET_HOST: err = "Connection failed"; break; case CURLE_WRITE_ERROR: err = "Write error"; break; case CURLE_PARTIAL_FILE: case CURLE_OPERATION_TIMEDOUT: timeout_reached = true; // fall though to TimeoutException // fall though... case CURLE_ABORTED_BY_CALLBACK: if( timeout_reached ) { err = "Timeout reached"; ZYPP_THROW(MediaTimeoutException(url)); } else { err = "User abort"; } break; default: err = "Curl error " + str::numstring( code ); break; } // uhm, no 0 code but unknown curl exception ZYPP_THROW(MediaCurlException(url, err, _curlError)); } } else { // actually the code is 0, nothing happened } } /////////////////////////////////////////////////////////////////// bool MediaCurl::doGetDoesFileExist( const Pathname & filename ) const { DBG << filename.asString() << endl; if(!_url.isValid()) ZYPP_THROW(MediaBadUrlException(_url)); if(_url.getHost().empty()) ZYPP_THROW(MediaBadUrlEmptyHostException(_url)); Url url(getFileUrl(filename)); DBG << "URL: " << url.asString() << endl; // Use URL without options and without username and passwd // (some proxies dislike them in the URL). // Curl seems to need the just scheme, hostname and a path; // the rest was already passed as curl options (in attachTo). Url curlUrl( clearQueryString(url) ); // // See also Bug #154197 and ftp url definition in RFC 1738: // The url "ftp://user@host/foo/bar/file" contains a path, // that is relative to the user's home. // The url "ftp://user@host//foo/bar/file" (or also with // encoded slash as %2f) "ftp://user@host/%2ffoo/bar/file" // contains an absolute path. // _lastRedirect.clear(); std::string urlBuffer( curlUrl.asString()); CURLcode ret = curl_easy_setopt( _curl, CURLOPT_URL, urlBuffer.c_str() ); if ( ret != 0 ) { ZYPP_THROW(MediaCurlSetOptException(url, _curlError)); } // If no head requests allowed (?head_requests=no): // Instead of returning no data with NOBODY, we return // little data, that works with broken servers, and // works for ftp as well, because retrieving only headers // ftp will return always OK code ? // See http://curl.haxx.se/docs/knownbugs.html #58 /// RAII Handler for temp. setting a head/range request struct TempSetHeadRequest { TempSetHeadRequest(CURL *curl_r, bool doHttpHeadRequest_r) : _curl{curl_r}, _doHttpHeadRequest{doHttpHeadRequest_r} { if ( _doHttpHeadRequest ) { curl_easy_setopt( _curl, CURLOPT_NOBODY, 1L ); } else { curl_easy_setopt( _curl, CURLOPT_RANGE, "0-1" ); } } TempSetHeadRequest(const TempSetHeadRequest &) = delete; TempSetHeadRequest(TempSetHeadRequest &&) = delete; TempSetHeadRequest &operator=(const TempSetHeadRequest &) = delete; TempSetHeadRequest &operator=(TempSetHeadRequest &&) = delete; ~TempSetHeadRequest() { if ( _doHttpHeadRequest ) { curl_easy_setopt( _curl, CURLOPT_NOBODY, 0L); /* yes, this is why we never got to get NOBODY working before, because setting it changes this option too, and we also* need to reset it See: http://curl.haxx.se/mail/archive-2005-07/0073.html */ curl_easy_setopt( _curl, CURLOPT_HTTPGET, 1L ); } else { curl_easy_setopt( _curl, CURLOPT_RANGE, NULL ); } } private: CURL * _curl; bool _doHttpHeadRequest; } _guard( _curl, (_url.getScheme() == "http" || _url.getScheme() == "https") && _settings.headRequestsAllowed() ); AutoFILE file { ::fopen( "/dev/null", "w" ) }; if ( !file ) { ERR << "fopen failed for /dev/null" << endl; ZYPP_THROW(MediaWriteException("/dev/null")); } ret = curl_easy_setopt( _curl, CURLOPT_WRITEDATA, (*file) ); if ( ret != 0 ) { ZYPP_THROW(MediaCurlSetOptException(url, _curlError)); } CURLcode ok = executeCurl(); MIL << "perform code: " << ok << " [ " << curl_easy_strerror(ok) << " ]" << endl; // as we are not having user interaction, the user can't cancel // the file existence checking, a callback or timeout return code // will be always a timeout. try { evaluateCurlCode( filename, ok, true /* timeout */); } catch ( const MediaFileNotFoundException &e ) { // if the file did not exist then we can return false return false; } catch ( const MediaException &e ) { // some error, we are not sure about file existence, rethrw ZYPP_RETHROW(e); } // exists return ( ok == CURLE_OK ); } /////////////////////////////////////////////////////////////////// void MediaCurl::doGetFileCopy( const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport & report, RequestOptions options ) const { Pathname dest = target.absolutename(); if( assert_dir( dest.dirname() ) ) { DBG << "assert_dir " << dest.dirname() << " failed" << endl; ZYPP_THROW( MediaSystemException(getFileUrl(srcFile.filename()), "System error on " + dest.dirname().asString()) ); } ManagedFile destNew { target.extend( ".new.zypp.XXXXXX" ) }; AutoFILE file; { AutoFREE buf { ::strdup( (*destNew).c_str() ) }; if( ! buf ) { ERR << "out of memory for temp file name" << endl; ZYPP_THROW(MediaSystemException(getFileUrl(srcFile.filename()), "out of memory for temp file name")); } AutoFD tmp_fd { ::mkostemp( buf, O_CLOEXEC ) }; if( tmp_fd == -1 ) { ERR << "mkstemp failed for file '" << destNew << "'" << endl; ZYPP_THROW(MediaWriteException(destNew)); } destNew = ManagedFile( (*buf), filesystem::unlink ); file = ::fdopen( tmp_fd, "we" ); if ( ! file ) { ERR << "fopen failed for file '" << destNew << "'" << endl; ZYPP_THROW(MediaWriteException(destNew)); } tmp_fd.resetDispose(); // don't close it here! ::fdopen moved ownership to file } DBG << "dest: " << dest << endl; DBG << "temp: " << destNew << endl; // set IFMODSINCE time condition (no download if not modified) if( PathInfo(target).isExist() && !(options & OPTION_NO_IFMODSINCE) ) { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, (long)PathInfo(target).mtime()); } else { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); } try { doGetFileCopyFile( srcFile, dest, file, report, options); } catch (Exception &e) { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); ZYPP_RETHROW(e); } long httpReturnCode = 0; CURLcode infoRet = curl_easy_getinfo(_curl, CURLINFO_RESPONSE_CODE, &httpReturnCode); bool modified = true; if (infoRet == CURLE_OK) { DBG << "HTTP response: " + str::numstring(httpReturnCode); if ( httpReturnCode == 304 || ( httpReturnCode == 213 && (_url.getScheme() == "ftp" || _url.getScheme() == "tftp") ) ) // not modified { DBG << " Not modified."; modified = false; } DBG << endl; } else { WAR << "Could not get the response code." << endl; } if (modified || infoRet != CURLE_OK) { // apply umask if ( ::fchmod( ::fileno(file), filesystem::applyUmaskTo( 0644 ) ) ) { ERR << "Failed to chmod file " << destNew << endl; } file.resetDispose(); // we're going to close it manually here if ( ::fclose( file ) ) { ERR << "Fclose failed for file '" << destNew << "'" << endl; ZYPP_THROW(MediaWriteException(destNew)); } // move the temp file into dest if ( rename( destNew, dest ) != 0 ) { ERR << "Rename failed" << endl; ZYPP_THROW(MediaWriteException(dest)); } destNew.resetDispose(); // no more need to unlink it } DBG << "done: " << PathInfo(dest) << endl; } /////////////////////////////////////////////////////////////////// void MediaCurl::doGetFileCopyFile( const OnMediaLocation & srcFile, const Pathname & dest, FILE *file, callback::SendReport & report, RequestOptions options ) const { DBG << srcFile.filename().asString() << endl; if(!_url.isValid()) ZYPP_THROW(MediaBadUrlException(_url)); if(_url.getHost().empty()) ZYPP_THROW(MediaBadUrlEmptyHostException(_url)); Url url(getFileUrl(srcFile.filename())); DBG << "URL: " << url.asString() << endl; // Use URL without options and without username and passwd // (some proxies dislike them in the URL). // Curl seems to need the just scheme, hostname and a path; // the rest was already passed as curl options (in attachTo). Url curlUrl( clearQueryString(url) ); // // See also Bug #154197 and ftp url definition in RFC 1738: // The url "ftp://user@host/foo/bar/file" contains a path, // that is relative to the user's home. // The url "ftp://user@host//foo/bar/file" (or also with // encoded slash as %2f) "ftp://user@host/%2ffoo/bar/file" // contains an absolute path. // _lastRedirect.clear(); std::string urlBuffer( curlUrl.asString()); CURLcode ret = curl_easy_setopt( _curl, CURLOPT_URL, urlBuffer.c_str() ); if ( ret != 0 ) { ZYPP_THROW(MediaCurlSetOptException(url, _curlError)); } ret = curl_easy_setopt( _curl, CURLOPT_WRITEDATA, file ); if ( ret != 0 ) { ZYPP_THROW(MediaCurlSetOptException(url, _curlError)); } // Set callback and perform. internal::ProgressData progressData(_curl, _settings.timeout(), url, srcFile.downloadSize(), &report); if (!(options & OPTION_NO_REPORT_START)) report->start(url, dest); if ( curl_easy_setopt( _curl, CURLOPT_PROGRESSDATA, &progressData ) != 0 ) { WAR << "Can't set CURLOPT_PROGRESSDATA: " << _curlError << endl;; } ret = executeCurl(); #if CURLVERSION_AT_LEAST(7,19,4) // bnc#692260: If the client sends a request with an If-Modified-Since header // with a future date for the server, the server may respond 200 sending a // zero size file. // curl-7.19.4 introduces CURLINFO_CONDITION_UNMET to check this condition. if ( ftell(file) == 0 && ret == 0 ) { long httpReturnCode = 33; if ( curl_easy_getinfo( _curl, CURLINFO_RESPONSE_CODE, &httpReturnCode ) == CURLE_OK && httpReturnCode == 200 ) { long conditionUnmet = 33; if ( curl_easy_getinfo( _curl, CURLINFO_CONDITION_UNMET, &conditionUnmet ) == CURLE_OK && conditionUnmet ) { WAR << "TIMECONDITION unmet - retry without." << endl; curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); ret = executeCurl(); } } } #endif if ( curl_easy_setopt( _curl, CURLOPT_PROGRESSDATA, NULL ) != 0 ) { WAR << "Can't unset CURLOPT_PROGRESSDATA: " << _curlError << endl;; } if ( ret != 0 ) { ERR << "curl error: " << ret << ": " << _curlError << ", temp file size " << ftell(file) << " bytes." << endl; // the timeout is determined by the progress data object // which holds whether the timeout was reached or not, // otherwise it would be a user cancel try { if ( progressData.fileSizeExceeded() ) ZYPP_THROW(MediaFileSizeExceededException(url, progressData.expectedFileSize())); evaluateCurlCode( srcFile.filename(), ret, progressData.timeoutReached() ); } catch ( const MediaException &e ) { // some error, we are not sure about file existence, rethrw ZYPP_RETHROW(e); } } } /////////////////////////////////////////////////////////////////// void MediaCurl::getDir( const Pathname & dirname, bool recurse_r ) const { filesystem::DirContent content; getDirInfo( content, dirname, /*dots*/false ); for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) { Pathname filename = dirname + it->name; int res = 0; switch ( it->type ) { case filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all case filesystem::FT_FILE: getFile( OnMediaLocation( filename ) ); break; case filesystem::FT_DIR: // newer directory.yast contain at least directory info if ( recurse_r ) { getDir( filename, recurse_r ); } else { res = assert_dir( localPath( filename ) ); if ( res ) { WAR << "Ignore error (" << res << ") on creating local directory '" << localPath( filename ) << "'" << endl; } } break; default: // don't provide devices, sockets, etc. break; } } } /////////////////////////////////////////////////////////////////// void MediaCurl::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { getDirectoryYast( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// void MediaCurl::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { getDirectoryYast( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// // int MediaCurl::aliveCallback( void *clientp, curl_off_t /*dltotal*/, curl_off_t dlnow, curl_off_t /*ultotal*/, curl_off_t /*ulnow*/ ) { internal::ProgressData *pdata = reinterpret_cast( clientp ); if( pdata ) { // Do not propagate dltotal in alive callbacks. MultiCurl uses this to // prevent a percentage raise while downloading a metalink file. Download // activity however is indicated by propagating the download rate (via dlnow). pdata->updateStats( 0.0, dlnow ); return pdata->reportProgress(); } return 0; } int MediaCurl::progressCallback( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow ) { internal::ProgressData *pdata = reinterpret_cast( clientp ); if( pdata ) { // work around curl bug that gives us old data long httpReturnCode = 0; if ( curl_easy_getinfo( pdata->curl(), CURLINFO_RESPONSE_CODE, &httpReturnCode ) != CURLE_OK || httpReturnCode == 0 ) return aliveCallback( clientp, dltotal, dlnow, ultotal, ulnow ); pdata->updateStats( dltotal, dlnow ); return pdata->reportProgress(); } return 0; } CURL *MediaCurl::progressCallback_getcurl( void *clientp ) { internal::ProgressData *pdata = reinterpret_cast(clientp); return pdata ? pdata->curl() : 0; } /////////////////////////////////////////////////////////////////// std::string MediaCurl::getAuthHint() const { long auth_info = CURLAUTH_NONE; CURLcode infoRet = curl_easy_getinfo(_curl, CURLINFO_HTTPAUTH_AVAIL, &auth_info); if(infoRet == CURLE_OK) { return CurlAuthData::auth_type_long2str(auth_info); } return ""; } /** * MediaMultiCurl needs to reset the expected filesize in case a metalink file is downloaded * otherwise this function should not be called */ void MediaCurl::resetExpectedFileSize(void *clientp, const ByteCount &expectedFileSize) { internal::ProgressData *data = reinterpret_cast(clientp); if ( data ) { data->expectedFileSize( expectedFileSize ); } } /*! * Executes the given curl handle in a multi context * * \note this should not be a const function, but API forces us to do so */ CURLcode MediaCurl::executeCurl() const { // initialize our helpers AutoDispose cMulti( internal::CurlPollHelper::CurlPoll{ curl_multi_init() } ,[](auto &releaseMe ){ if (releaseMe._multi) curl_multi_cleanup(releaseMe._multi); } ); if (!cMulti->_multi) ZYPP_THROW(MediaCurlInitException(_url)); // we could derive from that, but currently that does not make a lot of sense internal::CurlPollHelper _curlHelper(cMulti.value()); // add the easy handle to the multi instance if ( curl_multi_add_handle( cMulti->_multi, _curl ) != CURLM_OK ) ZYPP_THROW(MediaCurlException( _url, "curl_multi_add_handle", "unknown error")); // make sure the handle is cleanly removed from the multi handle OnScopeExit autoRemove([&](){ curl_multi_remove_handle( cMulti->_multi, _curl ); }); // kickstart curl, this will cause libcurl to go over the added handles and register sockets and timeouts CURLMcode mcode = _curlHelper.handleTimout(); if (mcode != CURLM_OK) ZYPP_THROW(MediaCurlException( _url, "curl_multi_socket_action", "unknown error")); bool canContinue = true; while ( canContinue ) { CURLMsg *msg = nullptr; int nqueue = 0; while ((msg = curl_multi_info_read( cMulti->_multi, &nqueue)) != 0) { if ( msg->msg != CURLMSG_DONE ) continue; if ( msg->easy_handle != _curl ) continue; return msg->data.result; } // copy watched sockets in case curl changes the vector as we go over the events later std::vector requestedFds = _curlHelper.socks; int r = zypp_detail::zypp_poll( requestedFds, _curlHelper.timeout_ms.value_or( -1 ) ); if ( r == -1 ) ZYPP_THROW( MediaCurlException(_url, "zypp_poll() failed", "unknown error") ); // run curl if ( r == 0 ) { CURLMcode mcode = _curlHelper.handleTimout(); if (mcode != CURLM_OK) ZYPP_THROW(MediaCurlException(_url, "curl_multi_socket_action", "unknown error")); } else { CURLMcode mcode = _curlHelper.handleSocketActions( requestedFds ); if (mcode != CURLM_OK) ZYPP_THROW(MediaCurlException(_url, "curl_multi_socket_action", "unknown error")); } } return CURLE_OK; } /////////////////////////////////////////////////////////////////// bool MediaCurl::authenticate(const std::string & availAuthTypes, bool firstTry) const { //! \todo need a way to pass different CredManagerOptions here CredentialManager cm(CredManagerOptions(ZConfig::instance().repoManagerRoot())); CurlAuthData_Ptr credentials; // get stored credentials AuthData_Ptr cmcred = cm.getCred(_url); if (cmcred && firstTry) { credentials.reset(new CurlAuthData(*cmcred)); DBG << "got stored credentials:" << endl << *credentials << endl; } // if not found, ask user else { CurlAuthData_Ptr curlcred; curlcred.reset(new CurlAuthData()); callback::SendReport auth_report; // preset the username if present in current url if (!_url.getUsername().empty() && firstTry) curlcred->setUsername(_url.getUsername()); // if CM has found some credentials, preset the username from there else if (cmcred) curlcred->setUsername(cmcred->username()); // indicate we have no good credentials from CM cmcred.reset(); std::string prompt_msg = str::Format(_("Authentication required for '%s'")) % _url.asString(); // set available authentication types from the exception // might be needed in prompt curlcred->setAuthType(availAuthTypes); // ask user if (auth_report->prompt(_url, prompt_msg, *curlcred)) { DBG << "callback answer: retry" << endl << "CurlAuthData: " << *curlcred << endl; if (curlcred->valid()) { credentials = curlcred; // if (credentials->username() != _url.getUsername()) // _url.setUsername(credentials->username()); /** * \todo find a way to save the url with changed username * back to repoinfo or dont store urls with username * (and either forbid more repos with the same url and different * user, or return a set of credentials from CM and try them one * by one) */ } } else { DBG << "callback answer: cancel" << endl; } } // set username and password if (credentials) { // HACK, why is this const? const_cast(this)->_settings.setUsername(credentials->username()); const_cast(this)->_settings.setPassword(credentials->password()); // set username and password CURLcode ret = curl_easy_setopt(_curl, CURLOPT_USERPWD, _settings.userPassword().c_str()); if ( ret != 0 ) ZYPP_THROW(MediaCurlSetOptException(_url, _curlError)); // set available authentication types from the exception if (credentials->authType() == CURLAUTH_NONE) credentials->setAuthType(availAuthTypes); // set auth type (seems this must be set _after_ setting the userpwd) if (credentials->authType() != CURLAUTH_NONE) { // FIXME: only overwrite if not empty? const_cast(this)->_settings.setAuthType(credentials->authTypeAsString()); ret = curl_easy_setopt(_curl, CURLOPT_HTTPAUTH, credentials->authType()); if ( ret != 0 ) ZYPP_THROW(MediaCurlSetOptException(_url, _curlError)); } if (!cmcred) { credentials->setUrl(_url); cm.addCred(*credentials); cm.save(); } return true; } return false; } //need a out of line definiton, otherwise vtable is emitted for every translation unit MediaCurl::Callbacks::~Callbacks() {} } // namespace media } // namespace zypp // libzypp-17.36.5/zypp/media/MediaCurl.h000066400000000000000000000142241476576476200175200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCurl.h * */ #ifndef ZYPP_MEDIA_MEDIACURL_H #define ZYPP_MEDIA_MEDIACURL_H #include #include #include #include namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaCurl /** * @short Implementation class for FTP, HTTP and HTTPS MediaHandler * @see MediaHandler **/ class MediaCurl : public MediaNetworkCommonHandler { public: enum RequestOption { /** Defaults */ OPTION_NONE = 0x0, /** retrieve only a range of the file */ OPTION_RANGE = 0x1, /** only issue a HEAD (or equivalent) request */ OPTION_HEAD = 0x02, /** to not add a IFMODSINCE header if target exists */ OPTION_NO_IFMODSINCE = 0x04, /** do not send a start ProgressReport */ OPTION_NO_REPORT_START = 0x08, }; ZYPP_DECLARE_FLAGS(RequestOptions,RequestOption); protected: Url clearQueryString(const Url &url) const; void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; /** * Repeatedly calls doGetDoesFileExist() until it successfully returns, * fails unexpectedly, or user cancels the operation. This is used to * handle authentication or similar retry scenarios on media level. */ bool getDoesFileExist( const Pathname & filename ) const override; /** * \see MediaHandler::getDoesFileExist */ virtual bool doGetDoesFileExist( const Pathname & filename ) const; /** * * \throws MediaException * */ void disconnectFrom() override; /** * * \throws MediaException * */ void getFileCopy( const OnMediaLocation& srcFile, const Pathname & targetFilename ) const override; /** * * \throws MediaException * */ virtual void doGetFileCopy( const OnMediaLocation &srcFile, const Pathname & targetFilename, callback::SendReport & _report, RequestOptions options = OPTION_NONE ) const; bool checkAttachPoint(const Pathname &apoint) const override; public: MediaCurl( const Url & url_r, const Pathname & attach_point_hint_r ); ~MediaCurl() override { try { release(); } catch(...) {} } static void setCookieFile( const Pathname & ); class Callbacks { public: virtual ~Callbacks(); virtual bool progress( int percent ) = 0; }; protected: /** Callback sending just an alive trigger to the UI, without stats (e.g. during metalink download). */ static int aliveCallback( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow ); /** Callback reporting download progress. */ static int progressCallback( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow ); static CURL *progressCallback_getcurl( void *clientp ); /** * check the url is supported by the curl library * \throws MediaBadUrlException if there is a problem **/ void checkProtocol(const Url &url) const; /** * initializes the curl easy handle with the data from the url * \throws MediaCurlSetOptException if there is a problem **/ virtual void setupEasy(); /** * Evaluates a curl return code and throws the right MediaException * \p filename Filename being downloaded * \p code Code curl returnes * \p timeout Whether we reached timeout, which we need to differentiate * in case the codes aborted-by-callback or timeout are returned by curl * Otherwise we can't differentiate abort from timeout. Here you may * want to pass the progress data object timeout-reached value, or * just true if you are not doing user interaction. * * \throws MediaException If there is a problem */ void evaluateCurlCode(const zypp::Pathname &filename, CURLcode code, bool timeout) const; void doGetFileCopyFile( const OnMediaLocation & srcFile, const Pathname & dest, FILE *file, callback::SendReport & report, RequestOptions options = OPTION_NONE ) const; static void resetExpectedFileSize ( void *clientp, const ByteCount &expectedFileSize ); private: CURLcode executeCurl() const; /** * Return a comma separated list of available authentication methods * supported by server. */ std::string getAuthHint() const; bool authenticate(const std::string & availAuthTypes, bool firstTry) const; bool detectDirIndex() const; private: std::string _currentCookieFile; static Pathname _cookieFile; char _curlError[ CURL_ERROR_SIZE ]; mutable std::string _lastRedirect; ///< to log/report redirections protected: CURL *_curl; curl_slist *_customHeaders; const char* curlError() const { return _curlError; }; void setCurlError(const char* error); }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS(MediaCurl::RequestOptions); /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIACURL_H libzypp-17.36.5/zypp/media/MediaCurl2.cc000066400000000000000000000671541476576476200177520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCurl2.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // for zypp_poll #include #include #include #include #include #include #include #include #include #include #include #include "detail/DownloadProgressTracker.h" #include "detail/OptionalDownloadProgressReport.h" #include "zypp-curl/ng/network/private/mediadebug_p.h" #ifdef ENABLE_ZCHUNK_COMPRESSION #include #endif /*! * TODOS: * - Add overall timeout for the request * - IFMODSINCE */ using std::endl; using namespace internal; using namespace zypp::base; namespace zypp { namespace media { MediaCurl2::MediaCurl2( const Url & url_r, const Pathname & attach_point_hint_r ) : MediaNetworkCommonHandler( url_r, attach_point_hint_r, "/", // urlpath at attachpoint true ) // does_download , _evDispatcher( zyppng::ThreadData::current().ensureDispatcher() ) , _nwDispatcher( std::make_shared() ) { MIL << "MediaCurl2::MediaCurl2(" << url_r << ", " << attach_point_hint_r << ")" << endl; if( !attachPoint().empty()) { PathInfo ainfo(attachPoint()); Pathname apath(attachPoint() + "XXXXXX"); char *atemp = ::strdup( apath.asString().c_str()); char *atest = NULL; if( !ainfo.isDir() || !ainfo.userMayRWX() || atemp == NULL || (atest=::mkdtemp(atemp)) == NULL) { WAR << "attach point " << ainfo.path() << " is not useable for " << url_r.getScheme() << endl; setAttachPoint("", true); } else if( atest != NULL) ::rmdir(atest); if( atemp != NULL) ::free(atemp); } _nwDispatcher->setAgentString ( str::asString( agentString () ) ); _nwDispatcher->setHostSpecificHeader ("download.opensuse.org", "X-ZYpp-DistributionFlavor", str::asString(distributionFlavorHeader()) ); _nwDispatcher->setHostSpecificHeader ("download.opensuse.org", "X-ZYpp-AnonymousId", str::asString(anonymousIdHeader()) ); } Url MediaCurl2::clearQueryString(const Url &url) const { return ::internal::clearQueryString(url); } /////////////////////////////////////////////////////////////////// void MediaCurl2::checkProtocol(const Url &url) const { if ( !zyppng::NetworkRequestDispatcher::supportsProtocol ( url ) ) { std::string msg("Unsupported protocol '"); msg += url.getScheme(); msg += "'"; ZYPP_THROW(MediaBadUrlException(_url, msg)); } } void MediaCurl2::setupEasy() { // fill some settings from url query parameters try { _effectiveSettings = _settings; fillSettingsFromUrl(_url, _effectiveSettings); } catch ( const MediaException &e ) { disconnectFrom(); ZYPP_RETHROW(e); } // if the proxy was not set (or explicitly unset) by url, then look... if ( _effectiveSettings.proxy().empty() ) { // ...at the system proxy settings fillSettingsSystemProxy(_url, _effectiveSettings); } /* Fixes bsc#1174011 "auth=basic ignored in some cases" * We should proactively add the password to the request if basic auth is configured * and a password is available in the credentials but not in the URL. * * We will be a bit paranoid here and require that the URL has a user embedded, otherwise we go the default route * and ask the server first about the auth method */ if ( _effectiveSettings.authType() == "basic" && _effectiveSettings.username().size() && !_effectiveSettings.password().size() ) { CredentialManager cm(CredManagerOptions(ZConfig::instance().repoManagerRoot())); const auto cred = cm.getCred( _url ); if ( cred && cred->valid() ) { if ( !_effectiveSettings.username().size() ) _effectiveSettings.setUsername(cred->username()); _effectiveSettings.setPassword(cred->password()); } } } void MediaCurl2::attachTo (bool next) { if ( next ) ZYPP_THROW(MediaNotSupportedException(_url)); if ( !_url.isValid() ) ZYPP_THROW(MediaBadUrlException(_url)); checkProtocol(_url); if( !isUseableAttachPoint( attachPoint() ) ) { setAttachPoint( createAttachPoint(), true ); } disconnectFrom(); // clean state if needed // here : setup TransferSettings setupEasy(); // FIXME: need a derived class to propelly compare url's MediaSourceRef media( new MediaSource(_url.getScheme(), _url.asString())); setMediaSource(media); } bool MediaCurl2::checkAttachPoint(const Pathname &apoint) const { return MediaHandler::checkAttachPoint( apoint, true, true); } void MediaCurl2::disconnectFrom() { // clear effective settings _effectiveSettings = _settings; } /////////////////////////////////////////////////////////////////// void MediaCurl2::releaseFrom( const std::string & ejectDev ) { disconnect(); } /////////////////////////////////////////////////////////////////// void MediaCurl2::getFile( const OnMediaLocation &file ) const { // Use absolute file name to prevent access of files outside of the // hierarchy below the attach point. getFileCopy( file, localPath(file.filename()).absolutename() ); } /////////////////////////////////////////////////////////////////// void MediaCurl2::getFileCopy( const OnMediaLocation & srcFile , const Pathname & target ) const { const auto &filename = srcFile.filename(); // Optional files will send no report until data are actually received (we know it exists). OptionalDownloadProgressReport reportfilter( srcFile.optional() ); callback::SendReport report; Url fileurl(getFileUrl(filename)); do { try { doGetFileCopy( srcFile, target, report ); break; // success! } // unexpected exception catch (MediaException & excpt_r) { media::DownloadProgressReport::Error reason = media::DownloadProgressReport::ERROR; if( typeid(excpt_r) == typeid( media::MediaFileNotFoundException ) || typeid(excpt_r) == typeid( media::MediaNotAFileException ) ) { reason = media::DownloadProgressReport::NOT_FOUND; } report->finish(fileurl, reason, excpt_r.asUserHistory()); ZYPP_RETHROW(excpt_r); } } while ( true ); report->finish(fileurl, zypp::media::DownloadProgressReport::NO_ERROR, ""); } bool MediaCurl2::getDoesFileExist( const Pathname & filename ) const { DBG << filename.asString() << endl; if(!_url.isValid()) ZYPP_THROW(MediaBadUrlException(_url)); if(_url.getHost().empty()) ZYPP_THROW(MediaBadUrlEmptyHostException(_url)); Url url(getFileUrl(filename)); DBG << "URL: " << url.asString() << endl; // Use URL without options and without username and passwd // (some proxies dislike them in the URL). // Curl seems to need the just scheme, hostname and a path; // the rest was already passed as curl options (in attachTo). Url curlUrl( clearQueryString(url) ); auto req = std::make_shared( curlUrl, "/dev/null" ); req->setOptions ( zyppng::NetworkRequest::HeadRequest ); // just check for existance // as we are not having user interaction, the user can't cancel // the file existence checking, a callback or timeout return code // will be always a timeout. try { const_cast(this)->executeRequest ( req ); } catch ( const MediaFileNotFoundException &e ) { // if the file did not exist then we can return false return false; } catch ( const MediaException &e ) { // some error, we are not sure about file existence, rethrw ZYPP_RETHROW(e); } // exists return ( !req->hasError() ); } /////////////////////////////////////////////////////////////////// void MediaCurl2::doGetFileCopy( const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport & report, RequestOptions options ) const { Pathname dest = target.absolutename(); if( assert_dir( dest.dirname() ) ) { DBG << "assert_dir " << dest.dirname() << " failed" << endl; ZYPP_THROW( MediaSystemException(getFileUrl(srcFile.filename()), "System error on " + dest.dirname().asString()) ); } ManagedFile destNew { target.extend( ".new.zypp.XXXXXX" ) }; { AutoFREE buf { ::strdup( (*destNew).c_str() ) }; if( ! buf ) { ERR << "out of memory for temp file name" << endl; ZYPP_THROW(MediaSystemException(getFileUrl(srcFile.filename()), "out of memory for temp file name")); } AutoFD tmp_fd { ::mkostemp( buf, O_CLOEXEC ) }; if( tmp_fd == -1 ) { ERR << "mkstemp failed for file '" << destNew << "'" << endl; ZYPP_THROW(MediaWriteException(destNew)); } destNew = ManagedFile( (*buf), filesystem::unlink ); } DBG << "dest: " << dest << endl; DBG << "temp: " << destNew << endl; #if 0 Not implemented here yet because NetworkRequest can not do IFMODSINCE yet // set IFMODSINCE time condition (no download if not modified) if( PathInfo(target).isExist() && !(options & OPTION_NO_IFMODSINCE) ) { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, (long)PathInfo(target).mtime()); } else { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); } #endif DBG << srcFile.filename().asString() << endl; if(!_url.isValid()) ZYPP_THROW(MediaBadUrlException(_url)); if(_url.getHost().empty()) ZYPP_THROW(MediaBadUrlEmptyHostException(_url)); Url url(getFileUrl(srcFile.filename())); DBG << "URL: " << url.asString() << endl; // Use URL without options and without username and passwd // (some proxies dislike them in the URL). // Curl seems to need the just scheme, hostname and a path; // the rest was already passed as curl options (in attachTo). Url curlUrl( clearQueryString(url) ); auto req = std::make_shared( curlUrl, destNew, zyppng::NetworkRequest::WriteShared /*do not truncate*/ ); req->setExpectedFileSize ( srcFile.downloadSize () ); bool done = false; #ifdef ENABLE_ZCHUNK_COMPRESSION done = const_cast(this)->tryZchunk(req, srcFile, destNew, report); #endif if ( !done ) { req->resetRequestRanges(); const_cast(this)->executeRequest ( req, &report ); } #if 0 Also disabled IFMODSINCE code, see above while not yet implemented here #if CURLVERSION_AT_LEAST(7,19,4) // bnc#692260: If the client sends a request with an If-Modified-Since header // with a future date for the server, the server may respond 200 sending a // zero size file. // curl-7.19.4 introduces CURLINFO_CONDITION_UNMET to check this condition. if ( ftell(file) == 0 && ret == 0 ) { long httpReturnCode = 33; if ( curl_easy_getinfo( _curl, CURLINFO_RESPONSE_CODE, &httpReturnCode ) == CURLE_OK && httpReturnCode == 200 ) { long conditionUnmet = 33; if ( curl_easy_getinfo( _curl, CURLINFO_CONDITION_UNMET, &conditionUnmet ) == CURLE_OK && conditionUnmet ) { WAR << "TIMECONDITION unmet - retry without." << endl; curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); ret = executeCurl(); } } } #endif #endif // apply umask if ( ::chmod( destNew->c_str(), filesystem::applyUmaskTo( 0644 ) ) ) { ERR << "Failed to chmod file " << destNew << endl; } // move the temp file into dest if ( rename( destNew, dest ) != 0 ) { ERR << "Rename failed" << endl; ZYPP_THROW(MediaWriteException(dest)); } destNew.resetDispose(); // no more need to unlink it DBG << "done: " << PathInfo(dest) << endl; } bool MediaCurl2::tryZchunk( zyppng::NetworkRequestRef req, const OnMediaLocation &srcFile, const Pathname &target, callback::SendReport &report ) { #ifdef ENABLE_ZCHUNK_COMPRESSION // HERE add zchunk logic if required if ( !srcFile.deltafile().empty() && zyppng::ZckHelper::isZchunkFile (srcFile.deltafile ()) && srcFile.headerSize () > 0 ) { // first fetch the zck header std::optional digest; UByteArray sum; const auto &headerSum = srcFile.headerChecksum(); if ( !headerSum.empty () ) { digest = zypp::Digest(); if ( !digest->create( headerSum.type() ) ) { ERR << "Unknown header checksum type " << headerSum.type() << std::endl; return false; } sum = zypp::Digest::hexStringToUByteArray( headerSum.checksum() ); } req->addRequestRange( 0, srcFile.headerSize(), std::move(digest), sum ); executeRequest ( req, nullptr ); req->resetRequestRanges(); auto res = zyppng::ZckHelper::prepareZck( srcFile.deltafile(), target, srcFile.downloadSize() ); switch(res._code) { case zyppng::ZckHelper::PrepareResult::Error: { ERR << "Failed to setup zchunk because of: " << res._message << std::endl; return false; } case zyppng::ZckHelper::PrepareResult::NothingToDo: return true; // already done case zyppng::ZckHelper::PrepareResult::ExceedsMaxLen: ZYPP_THROW( MediaFileSizeExceededException( req->url(), srcFile.downloadSize(), res._message )); case zyppng::ZckHelper::PrepareResult::Success: break; } for ( const auto &block : res._blocks ) { if ( block._checksum.size() && block._chksumtype.size() ) { std::optional dig = zypp::Digest(); if ( !dig->create( block._chksumtype ) ) { WAR_MEDIA << "Trying to create Digest with chksum type " << block._chksumtype << " failed " << std::endl; return false; } if ( zypp::env::ZYPP_MEDIA_CURL_DEBUG() > 3 ) DBG_MEDIA << "Starting block " << block._start << " with checksum " << zypp::Digest::digestVectorToString( block._checksum ) << "." << std::endl; req->addRequestRange( block._start, block._len, std::move(dig), block._checksum, {}, block._relevantDigestLen, block._chksumPad ); } }; executeRequest ( req, &report ); //we might have the file ready std::string err; if ( !zyppng::ZckHelper::validateZckFile( target, err) ) { ERR << "ZCK failed with error: " << err << std::endl; return false; } return true; } #endif return false; } /////////////////////////////////////////////////////////////////// void MediaCurl2::getDir( const Pathname & dirname, bool recurse_r ) const { filesystem::DirContent content; getDirInfo( content, dirname, /*dots*/false ); for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) { Pathname filename = dirname + it->name; int res = 0; switch ( it->type ) { case filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all case filesystem::FT_FILE: getFile( OnMediaLocation( filename ) ); break; case filesystem::FT_DIR: // newer directory.yast contain at least directory info if ( recurse_r ) { getDir( filename, recurse_r ); } else { res = assert_dir( localPath( filename ) ); if ( res ) { WAR << "Ignore error (" << res << ") on creating local directory '" << localPath( filename ) << "'" << endl; } } break; default: // don't provide devices, sockets, etc. break; } } } /////////////////////////////////////////////////////////////////// void MediaCurl2::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { getDirectoryYast( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// void MediaCurl2::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { getDirectoryYast( retlist, dirname, dots ); } void MediaCurl2::executeRequest( zyppng::NetworkRequestRef req , callback::SendReport *report ) { auto loop = zyppng::EventLoop::create(); _nwDispatcher->run(); bool firstAuth = true; bool retry = true; int maxTries = _effectiveSettings.maxSilentTries(); while ( retry ) { std::optional progTracker; std::vector signalConnections { req->sigStarted().connect( [&]( zyppng::NetworkRequest &req ){ if ( !report) return; (*report)->start( req.url(), req.targetFilePath() ); }), req->sigProgress().connect( [&]( zyppng::NetworkRequest &req, off_t dlTotal, off_t dlNow, off_t, off_t ){ if ( !report || !progTracker ) return; progTracker->updateStats( dlTotal, dlNow ); if ( !(*report)->progress( progTracker->_dnlPercent, req.url(), progTracker-> _drateTotal, progTracker->_drateLast ) ) _nwDispatcher->cancel ( req ); }), req->sigFinished().connect( [&]( zyppng::NetworkRequest &req, const zyppng::NetworkRequestError &err ) { loop->quit(); }) }; // clean up slots for every loop zypp_defer { std::for_each( signalConnections.begin(), signalConnections.end(), []( auto &conn ) { conn.disconnect(); }); signalConnections.clear(); }; if ( report ) { progTracker = internal::ProgressTracker(); } maxTries--; retry = false; // normally we don't retry req->transferSettings() = _effectiveSettings; // use settings from MediaCurl _nwDispatcher->enqueue ( req ); loop->run(); // once the request is done there should be nothing there anymore if ( _nwDispatcher->count () != 0 ) { ZYPP_THROW( zypp::Exception("Unexpected request count after finishing MediaCurl2 request!") ); } if ( req->hasError() ) { auto errCode = zypp::media::DownloadProgressReport::ERROR; std::exception_ptr excp; const auto &error = req->error(); switch ( error.type() ) { case zyppng::NetworkRequestError::InternalError: case zyppng::NetworkRequestError::InvalidChecksum: case zyppng::NetworkRequestError::UnsupportedProtocol: case zyppng::NetworkRequestError::MalformedURL: case zyppng::NetworkRequestError::PeerCertificateInvalid: case zyppng::NetworkRequestError::ConnectionFailed: case zyppng::NetworkRequestError::ServerReturnedError: case zyppng::NetworkRequestError::MissingData: case zyppng::NetworkRequestError::RangeFail: { excp = ZYPP_EXCPT_PTR( zypp::media::MediaCurlException( req->url(), error.toString(), error.nativeErrorString() ) ); break; } case zyppng::NetworkRequestError::Cancelled: { excp = ZYPP_EXCPT_PTR( zypp::media::MediaRequestCancelledException( error.toString() ) ); break; } case zyppng::NetworkRequestError::ExceededMaxLen: { excp = ZYPP_EXCPT_PTR( zypp::media::MediaFileSizeExceededException( req->url(), req->expectedFileSize() ) ); break; } case zyppng::NetworkRequestError::TemporaryProblem: { excp = ZYPP_EXCPT_PTR( zypp::media::MediaTemporaryProblemException( req->url(), error.toString() ) ); break; } case zyppng::NetworkRequestError::Timeout: { excp = ZYPP_EXCPT_PTR( zypp::media::MediaTimeoutException( req->url(), error.toString() ) ); break; } case zyppng::NetworkRequestError::Forbidden: { excp = ZYPP_EXCPT_PTR( zypp::media::MediaForbiddenException( req->url(), error.toString() ) ); break; } case zyppng::NetworkRequestError::NotFound: { errCode = zypp::media::DownloadProgressReport::NOT_FOUND; //@BUG using getPathName() can result in wrong error messages excp = ZYPP_EXCPT_PTR( zypp::media::MediaFileNotFoundException( _url, req->url().getPathName() ) ); break; } case zyppng::NetworkRequestError::Unauthorized: case zyppng::NetworkRequestError::AuthFailed: { //in case we got a auth hint from the server the error object will contain it std::string authHint = error.extraInfoValue("authHint", std::string()); if ( authenticate( authHint, firstAuth ) ) { firstAuth = false; retry = true; continue; } errCode = zypp::media::DownloadProgressReport::ACCESS_DENIED; excp = ZYPP_EXCPT_PTR( zypp::media::MediaUnauthorizedException( req->url(), error.toString(), error.nativeErrorString(), "" ) ); break; } case zyppng::NetworkRequestError::NoError: // should never happen DBG << "BUG: Download error flag is set , but Error code is NoError" << std::endl; break; case zyppng::NetworkRequestError::Http2Error: case zyppng::NetworkRequestError::Http2StreamError: { excp = ZYPP_EXCPT_PTR( zypp::media::MediaCurlException( req->url(), error.toString(), error.nativeErrorString() ) ); break; } } if ( excp ) { if ( maxTries > 0 ) { retry = true; continue; } if ( report ) (*report)->finish( req->url(), errCode, error.toString() ); std::rethrow_exception( excp ); } } } if ( report ) (*report)->finish( req->url(), zypp::media::DownloadProgressReport::NO_ERROR, "" ); } bool MediaCurl2::authenticate(const std::string & availAuthTypes, bool firstTry) { //! \todo need a way to pass different CredManagerOptions here CredentialManager cm(CredManagerOptions(ZConfig::instance().repoManagerRoot())); return authenticate( _url, cm, _effectiveSettings, availAuthTypes, firstTry ); } bool MediaCurl2::authenticate(const Url &url, CredentialManager &cm, TransferSettings &settings, const std::string & availAuthTypes, bool firstTry) { CurlAuthData_Ptr credentials; // get stored credentials AuthData_Ptr cmcred = cm.getCred(url); if (cmcred && firstTry) { credentials.reset(new CurlAuthData(*cmcred)); DBG << "got stored credentials:" << endl << *credentials << endl; } // if not found, ask user else { CurlAuthData_Ptr curlcred; curlcred.reset(new CurlAuthData()); callback::SendReport auth_report; // preset the username if present in current url if (!url.getUsername().empty() && firstTry) curlcred->setUsername(url.getUsername()); // if CM has found some credentials, preset the username from there else if (cmcred) curlcred->setUsername(cmcred->username()); // indicate we have no good credentials from CM cmcred.reset(); std::string prompt_msg = str::Format(_("Authentication required for '%s'")) % url.asString(); // set available authentication types from the exception // might be needed in prompt curlcred->setAuthType(availAuthTypes); // ask user if (auth_report->prompt(url, prompt_msg, *curlcred)) { DBG << "callback answer: retry" << endl << "CurlAuthData: " << *curlcred << endl; if (curlcred->valid()) { credentials = curlcred; // if (credentials->username() != _url.getUsername()) // _url.setUsername(credentials->username()); /** * \todo find a way to save the url with changed username * back to repoinfo or dont store urls with username * (and either forbid more repos with the same url and different * user, or return a set of credentials from CM and try them one * by one) */ } } else { DBG << "callback answer: cancel" << endl; } } // set username and password if (credentials) { settings.setUsername(credentials->username()); settings.setPassword(credentials->password()); // set available authentication types from the exception if (credentials->authType() == CURLAUTH_NONE) credentials->setAuthType(availAuthTypes); // set auth type (seems this must be set _after_ setting the userpwd) if (credentials->authType() != CURLAUTH_NONE) { settings.setAuthType(credentials->authTypeAsString()); } if (!cmcred) { credentials->setUrl(url); cm.addCred(*credentials); cm.save(); } return true; } return false; } } // namespace media } // namespace zypp // libzypp-17.36.5/zypp/media/MediaCurl2.h000066400000000000000000000116641476576476200176070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaCurl2.h * */ #ifndef ZYPP_MEDIA_MEDIACURL2_H #define ZYPP_MEDIA_MEDIACURL2_H #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (EventDispatcher); ZYPP_FWD_DECL_TYPE_WITH_REFS (NetworkRequestDispatcher); ZYPP_FWD_DECL_TYPE_WITH_REFS (NetworkRequest); } namespace zypp { namespace media { class CredentialManager; /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaCurl2 /** * @short Implementation class for FTP, HTTP and HTTPS MediaHandler * @see MediaHandler **/ class MediaCurl2 : public MediaNetworkCommonHandler { public: enum RequestOption { /** Defaults */ OPTION_NONE = 0x0, /** retrieve only a range of the file */ OPTION_RANGE = 0x1, /** only issue a HEAD (or equivalent) request */ OPTION_HEAD = 0x02, /** to not add a IFMODSINCE header if target exists */ OPTION_NO_IFMODSINCE = 0x04, /** do not send a start ProgressReport */ OPTION_NO_REPORT_START = 0x08, }; ZYPP_DECLARE_FLAGS(RequestOptions,RequestOption); protected: Url clearQueryString(const Url &url) const; void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; /** * Repeatedly calls doGetDoesFileExist() until it successfully returns, * fails unexpectedly, or user cancels the operation. This is used to * handle authentication or similar retry scenarios on media level. */ bool getDoesFileExist( const Pathname & filename ) const override; /** * * \throws MediaException * */ void disconnectFrom() override; /** * * \throws MediaException * */ void getFileCopy( const OnMediaLocation& srcFile, const Pathname & targetFilename ) const override; /** * * \throws MediaException * */ virtual void doGetFileCopy( const OnMediaLocation &srcFile, const Pathname & targetFilename, callback::SendReport & _report, RequestOptions options = OPTION_NONE ) const; bool checkAttachPoint(const Pathname &apoint) const override; public: MediaCurl2( const Url & url_r, const Pathname & attach_point_hint_r ); ~MediaCurl2() override { try { release(); } catch(...) {} } // standard auth procedure, shared with CommitPackagePreloader static bool authenticate( const Url &url, CredentialManager &cm, TransferSettings &settings, const std::string & availAuthTypes, bool firstTry); protected: /** * check the url is supported by the curl library * \throws MediaBadUrlException if there is a problem **/ void checkProtocol(const Url &url) const; /** * initializes the curl easy handle with the data from the url * \throws MediaCurlSetOptException if there is a problem **/ void setupEasy(); private: void executeRequest( zyppng::NetworkRequestRef req, callback::SendReport *report = nullptr ); bool authenticate(const std::string & availAuthTypes, bool firstTry); bool tryZchunk( zyppng::NetworkRequestRef req, const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport & report ); private: zyppng::EventDispatcherRef _evDispatcher; //< keep the ev dispatcher alive as long as MediaCurl2 is zyppng::NetworkRequestDispatcherRef _nwDispatcher; //< keep the dispatcher alive as well TransferSettings _effectiveSettings; // use another level of indirection, _settings contains the user modified settings }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS(MediaCurl2::RequestOptions); /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIACURL2_H libzypp-17.36.5/zypp/media/MediaDIR.cc000066400000000000000000000127631476576476200173750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaDIR.cc * */ #include #include #include #include #include using std::endl; namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaDIR // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDIR::MediaDIR // METHOD TYPE : Constructor // // DESCRIPTION : Attach point is always url_r.getPathName(), // as files are not copied. // Thus attach_point_hint_r is ignored. // MediaDIR::MediaDIR( const Url & url_r, const Pathname & /*attach_point_hint_r*/ ) : MediaHandler( url_r, url_r.getPathName(), "/", // urlpath below attachpoint false ) // does_download { MIL << "MediaDIR::MediaDIR(" << url_r << ")" << endl; if( !url_r.getHost().empty()) { ZYPP_THROW(MediaBadUrlException(url_r, "Hostname not allowed in the Url" )); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDIR::attachTo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that not already attached, and attachPoint is a directory. // void MediaDIR::attachTo(bool next) { if(next) ZYPP_THROW(MediaNotSupportedException(url())); // fetch attach point from url again if needed ... // it may happen that attachPointHint (and attachPoint()) // does not contain any path, because the directory has // not existed while the handler was constructed. if( attachPoint().empty() && !url().getPathName().empty()) { Pathname real( getRealPath(url().getPathName())); PathInfo adir( real); if( adir.isDir()) { // set attachpoint only if the dir exists setAttachPoint( real, false); } else { ZYPP_THROW(MediaBadUrlException(url(), "Specified path '" + url().getPathName() + "' is not a directory" )); } } // attach point is same as source path... we do not mount here if(attachPoint().empty()) { ZYPP_THROW(MediaBadUrlException(url(), "The media URL does not provide any useable directory path" )); } else if(!PathInfo(attachPoint()).isDir()) { ZYPP_THROW(MediaBadUrlException(url(), "Specified path '" + attachPoint().asString() + "' is not a directory" )); } MediaSourceRef media(new MediaSource("dir", attachPoint().asString())); setMediaSource(media); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDIR::releaseFrom // METHOD TYPE : void // // DESCRIPTION : Asserted that media is attached. // void MediaDIR::releaseFrom( const std::string & ejectDev ) { return; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDIR::getFile // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaDIR::getFile( const OnMediaLocation &file ) const { MediaHandler::getFile( file ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaDIR::getDir // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaDIR::getDir( const Pathname & dirname, bool recurse_r ) const { MediaHandler::getDir( dirname, recurse_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDIR::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaDIR::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDIR::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaDIR::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } bool MediaDIR::getDoesFileExist( const Pathname & filename ) const { return MediaHandler::getDoesFileExist( filename ); } } // namespace media } // namespace zypp libzypp-17.36.5/zypp/media/MediaDIR.h000066400000000000000000000037411476576476200172330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaDIR.h * */ #ifndef ZYPP_MEDIA_MEDIADIR_H #define ZYPP_MEDIA_MEDIADIR_H #include namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaDIR /** * @short Implementation class for DIR MediaHandler * @see MediaHandler **/ class MediaDIR : public MediaHandler { protected: void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; bool getDoesFileExist( const Pathname & filename ) const override; public: MediaDIR( const Url & url_r, const Pathname & attach_point_hint_r ); ~MediaDIR() override { try { release(); } catch(...) {} } }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIADIR_H libzypp-17.36.5/zypp/media/MediaDISK.cc000066400000000000000000000276131476576476200175110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaDISK.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /* ** verify devices names as late as possible (while attach) */ #define DELAYED_VERIFY 1 namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaDISK // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDISK::MediaDISK // METHOD TYPE : Constructor // // DESCRIPTION : // MediaDISK::MediaDISK( const Url & url_r, const Pathname & attach_point_hint_r ) : MediaHandler( url_r, attach_point_hint_r, url_r.getPathName(), // urlpath below attachpoint false ) // does_download { MIL << "MediaDISK::MediaDISK(" << url_r << ", " << attach_point_hint_r << ")" << endl; _device = Pathname(_url.getQueryParam("device")).asString(); if( _device.empty()) { ERR << "Media url does not contain a device specification" << std::endl; ZYPP_THROW(MediaBadUrlEmptyDestinationException(_url)); } #if DELAYED_VERIFY DBG << "Verify of " << _device << " delayed" << std::endl; #else if( !verifyIfDiskVolume( _device)) { ZYPP_THROW(MediaBadUrlEmptyDestinationException(_url)); } #endif _filesystem = _url.getQueryParam("filesystem"); if(_filesystem.empty()) _filesystem="auto"; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaDISK::verifyIfDiskVolume // METHOD TYPE : void // // DESCRIPTION : Check if specified device file name is // a disk volume device or throw an error. // bool MediaDISK::verifyIfDiskVolume(const Pathname &dev_name) { if( dev_name.empty() || dev_name.asString().compare(0, sizeof("/dev/")-1, "/dev/")) { ERR << "Specified device name " << dev_name << " is not allowed" << std::endl; return false; } PathInfo dev_info(dev_name); if( !dev_info.isBlk()) { ERR << "Specified device name " << dev_name << " is not a block device" << std::endl; return false; } // check if a volume using /dev/disk/by-uuid links first { Pathname dpath("/dev/disk/by-uuid"); std::list dlist; if( zypp::filesystem::readdir(dlist, dpath) == 0) { std::list::const_iterator it; for(it = dlist.begin(); it != dlist.end(); ++it) { PathInfo vol_info(*it); if( vol_info.isBlk() && vol_info.devMajor() == dev_info.devMajor() && vol_info.devMinor() == dev_info.devMinor()) { DBG << "Specified device name " << dev_name << " is a volume (disk/by-uuid link " << vol_info.path() << ")" << std::endl; return true; } } } } // check if a volume using /dev/disk/by-label links // (e.g. vbd mapped volumes in a XEN vm) { Pathname dpath("/dev/disk/by-label"); std::list dlist; if( zypp::filesystem::readdir(dlist, dpath) == 0) { std::list::const_iterator it; for(it = dlist.begin(); it != dlist.end(); ++it) { PathInfo vol_info(*it); if( vol_info.isBlk() && vol_info.devMajor() == dev_info.devMajor() && vol_info.devMinor() == dev_info.devMinor()) { DBG << "Specified device name " << dev_name << " is a volume (disk/by-label link " << vol_info.path() << ")" << std::endl; return true; } } } } // check if a filesystem volume using the 'blkid' tool // (there is no /dev/disk link for some of them) ExternalProgram::Arguments args; args.push_back( "blkid" ); args.push_back( "-p" ); args.push_back( dev_name.asString() ); ExternalProgram cmd( args, ExternalProgram::Stderr_To_Stdout ); cmd >> DBG; if ( cmd.close() != 0 ) { ERR << cmd.execError() << endl << "Specified device name " << dev_name << " is not a usable disk volume" << std::endl; return false; } return true; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDISK::attachTo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that not already attached, and attachPoint is a directory. // void MediaDISK::attachTo(bool next) { if(next) ZYPP_THROW(MediaNotSupportedException(url())); // FIXME // do mount --bind /

'(bsc#935885) tag. */ inline std::ostream & printRichText( std::ostream & str, std::string text, unsigned indent_r = 0U, unsigned width_r = 0U ) { std::string processRichText( const std::string& text ); if ( text.empty() ) return str; static const zypp::str::regex rttag("^[ \t\r\n]*<(p|!--[- ]*DT:Rich[ -]*--)>"); if( zypp::str::regex_match( text, rttag ) ) text = processRichText( text ); return zypp::str::printIndented( str, text, indent_r, width_r ); // even unindented as it also asserts a trailing '/n' } /** Return [Rich]Text optionally indented as string. */ inline std::string printRichText( std::string text, unsigned indent_r = 0U, unsigned width_r = 0U ) { zypp::str::Str s; printRichText( s.stream(), std::move(text), indent_r, width_r ); return s.str(); } } #endif libzypp-17.36.5/zypp-tui/utils/text.cc000066400000000000000000000041471476576476200176600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------*/ #include #include #include "text.h" namespace ztui { std::string mbs_substr_by_width( boost::string_ref text_r, std::string::size_type colpos_r, std::string::size_type collen_r ) { std::string ret; if ( collen_r ) { const char * spos = nullptr; size_t slen = 0; size_t colend = ( collen_r == std::string::npos ? std::string::npos : colpos_r+collen_r ); // will exploit npos == size_t(-1) size_t pos = 0; for( mbs::MbsIterator it( text_r ); ! it.atEnd(); ++it ) { // collect sequences [pos,end[ in [colpos_r,colend[ // partial overlaps are padded size_t end = pos + it.columns(); if ( pos < colpos_r ) // starts before range { if ( end > colpos_r ) // pad incomplete sequence at range begin ret += std::string( std::min(end,colend)-colpos_r, ' ' ); } else // starts inside range (pos < colend by the way we loop) { if ( end <= colend ) // completely inside { if ( !spos ) spos = it.pos(); slen += it.size(); } else // partial outside { if ( spos ) { ret += std::string( spos, slen ); spos = nullptr; slen = 0; // don't collect it after loop } ret += std::string( colend-pos, ' ' ); break; // done } } if ( end >= colend ) break; pos = end; } if ( spos ) ret += std::string( spos, slen ); } return ret; } } libzypp-17.36.5/zypp-tui/utils/text.h000066400000000000000000000475241476576476200175300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | ----------------------------------------------------------------------/ * * This file contains private API, this might break at any time between releases. * Strictly for internal use! */ #ifndef ZYPP_UTILS_TEXT_H_ #define ZYPP_UTILS_TEXT_H_ #include #include #include #include #include namespace ztui { /////////////////////////////////////////////////////////////////// namespace mbs { #define ZYPPER_TRACE_MBS 0 struct MbToWc { static const char _oooooooo = static_cast(0000); static const char _Xooooooo = static_cast(0200); static const char _XXoooooo = static_cast(0300); static const char _XXXooooo = static_cast(0340); static const char _XXXXoooo = static_cast(0360); static const char _XXXXXooo = static_cast(0370); static const char _ooXXXXXX = static_cast(0077); MbToWc( char ch ) : _wc( ch ) , _cont( -1 ) { if ( (_wc & _XXXooooo) == _XXoooooo ) // '110xxxxx' { _wc &= ~_XXXooooo; _cont = 1; } else if ( (_wc & _XXXXoooo) == _XXXooooo ) // '1110xxxx' { _wc &= ~_XXXXoooo; _cont = 2; } else if ( (_wc & _XXXXXooo) == _XXXXoooo ) // '11110xxx' { _wc &= ~_XXXXXooo; _cont = 3; } else if ( (_wc & _Xooooooo) == _oooooooo ) // '0xxxxxxx' { _cont = 0; } else // something broken { _wc = L'?'; } } bool add( char ch ) // return whether ch is a continuation char { if ( (ch & _XXoooooo) == _Xooooooo ) // '10xxxxxx' { if ( _cont > 0 ) { _wc = (_wc<<6)+(ch & _ooXXXXXX); --_cont; } return true; } if ( _cont > 0 ) // error, else ignore excess chars { _wc = L'?'; _cont = -1; } return false; } wchar_t _wc; char _cont; }; /////////////////////////////////////////////////////////////////// /// \class MbsIterator /// \brief Iterate chars and ANSI SGR in a multi-byte character string /// /// The iterator offers (\ref pos, \ref size) of the current \c wchar /// within the original \a text_r. Also the number of \ref columns the /// current \c wchar occupies on the screen. /// /// \note: The iterator contents fakes all WS to either '\n' or ' '. /// \note: \ref isCH includes SGR sequences /////////////////////////////////////////////////////////////////// struct MbsIterator { MbsIterator( boost::string_ref text_r ) : _text( text_r ) , _tpos( _text.data() ) , _trest( _text.size() ) , _tread( 0 ) , _cols( size_t(-1) ) , _wc( L'\0' ) { memset( &_mbstate, 0, sizeof(_mbstate) ); operator++(); } /** Use with care; all WS are faked to either '\n' or ' ' */ wchar_t & operator*() { return _wc; } const wchar_t & operator*() const { return _wc; } const char * pos() const { return _tpos; } size_t size() const { return _tread; } size_t columns() const { if ( _cols == size_t(-1) ) { if ( _wc < L' ' ) _cols = 0; // CTRLs else { _cols = ::wcwidth( _wc ); if ( _cols == size_t(-1) ) _cols = 1; // -1 due to LC_CTYPE? } } return _cols; } boost::string_ref ref() const { return boost::string_ref( _tpos, _tread ); } bool atEnd() const { return _trest == 0; } bool isNL() const { return( _wc == L'\n' ); } bool isWS() const { return( _wc == L' ' ); } bool isCH() const { return !( atEnd() || isNL() || isWS() ); } bool isSGR() const { return not atEnd() && _wc == L'\033'; } MbsIterator & operator++() { if ( !atEnd() ) { _tpos += _tread; _trest -= _tread; //we hit the end if ( _trest == 0 ) { setToEnd(); return *this; } _tread = ::mbrtowc( &_wc, _tpos, _trest, &_mbstate ); _cols = size_t(-1); if ( _tread >= (size_t)-2 ) { // common case is -1 due to LC_CTYPE // skip this and continue with next mb memset( &_mbstate, 0, sizeof(_mbstate) ); _tread = 1; MbToWc c( *_tpos ); while ( ( _tread < _trest ) && c.add( *(_tpos+_tread) ) ) _tread += 1; _wc = c._wc; } switch ( _tread ) { // case (size_t)-2: // case (size_t)-1: // _tread = 0; // // fall through case 0: setToEnd(); break; default: if ( ::iswspace(_wc) ) { switch ( _wc ) { case L'\n': case L' ': break; default: _wc = L' '; } } else if ( _wc == L'\033' ) // ansi SGR ? { unsigned asize = ansiSize( _tpos ); if ( asize && asize <= _trest ) _tread = asize; } break; } } return *this; } private: unsigned ansiSize( const char * pos_r ) { unsigned ret = 0; const char * p = pos_r; if ( *p == '\033' && *(++p) == '[' ) { for ( char ch = *(++p); ( '0' <= ch && ch <= '9' ) || ch ==';'; ch = *(++p) ) {;} if ( *p == 'm' ) ret = p+1 - pos_r; } return ret; } void setToEnd () { _trest = 0; // atEnd _wc = L'\0'; } boost::string_ref _text; const char * _tpos; // start of last ::mbrtowc size_t _trest; // _tpos to end of string size_t _tread; // consumed in last ::mbrtowc mutable size_t _cols; // number of columns occupied on screen wchar_t _wc; // result of last ::mbrtowc mbstate_t _mbstate; }; /////////////////////////////////////////////////////////////////// /// \class MbsIteratorNoSGR /// \brief \ref MbsIterator skipping ANSI SGR /////////////////////////////////////////////////////////////////// struct MbsIteratorNoSGR : public MbsIterator { MbsIteratorNoSGR( boost::string_ref text_r ) : MbsIterator( text_r ) { skipSGR(); } MbsIteratorNoSGR & operator++() { MbsIterator::operator++(); skipSGR(); return *this; } private: void skipSGR() { while ( isSGR() ) MbsIterator::operator++(); } }; /////////////////////////////////////////////////////////////////// /// \class MbsWriteWrapped /// \brief Write MBString optionally wrapped and indented. /// /// The class assumes the output starts at the beginning of a /// new term line. Every '\n' in text starts a new paragraph /// (on an new line with default indent). /// /// WS at par begin increments indent for this par. /// /// Use \ref gotoNextLine to open a new indented line without /// stating a new par. /// /// If MbsWriteWrapped is used in conjunction with plain screen /// output, you can use \ref resetToParBegin to reset housekeeping /// data after plain screen output. /////////////////////////////////////////////////////////////////// struct MbsWriteWrapped { MbsWriteWrapped( std::ostream & out ) : MbsWriteWrapped( out, 0, 0 ) {} MbsWriteWrapped( std::ostream & out, size_t wrap_r ) : MbsWriteWrapped( out, 0, wrap_r ) {} MbsWriteWrapped( std::ostream & out, size_t indent_r, size_t wrap_r, int indentFix_r = 0 ) : _out( out ) , _defaultWrap( wrap_r ) , _defaultIndent( indent_r ) , _defaultIndentFix( indentFix_r ) , _indent( saneIncrementIndent( 0, _defaultIndent, _defaultWrap ) ) , _indentFix( _defaultIndentFix ) , _indentGap( 0 ) , _lpos( 0 ) , _gap( 0 ) , _gapForced( 0 ) , _gapLines( 0 ) , _word( nullptr ) , _wSize( 0 ) , _wColumns( 0 ) {} size_t defaultWrap() const { return _defaultWrap; } size_t defaultIndent() const { return _defaultIndent; } int defaultIndentFix() const { return _defaultIndentFix; } size_t indent() const { return _indent; } size_t lpos() const { return _lpos; } bool atLineBegin() const { return( _lpos == 0 ); } bool atParBegin() const { return( _lpos == 0 && !_gapLines ); } /** Reset housekeeping data to the beginning of a paragraph (does not write anything) */ void resetToParBegin() { clearGap(); clearWord(); clearIndent(); _lpos = 0; } /** Write out any pending word and start a new par (NL unconditionally) */ void gotoNextPar() { writeout(true); clearIndent(); #if ( ZYPPER_TRACE_MBS) _out << "" << std::endl; // "" #else _out << std::endl; // "" #endif _lpos = 0; } /** Open a new paragraph if not \ref atParBegin */ void gotoParBegin() { if ( ! atParBegin() ) gotoNextPar(); } /** Add \a count_r (1) new lines in this par (BR unconditionally) */ void gotoNextLine( size_t count_r = 1 ) { if ( count_r ) { writeout(true); // but keep indent _gapLines += count_r; #if ( ZYPPER_TRACE_MBS ) while ( count_r-- ) _out << "
" << std::endl; // "
" #else _out << std::string( count_r, '\n' ); #endif _lpos = 0; } } /** Open a new line in this paragraph if not \ref atLineBegin */ void gotoLineBegin() { if ( ! atLineBegin() ) gotoNextLine(); } /** Temporarily increase indent */ struct ScopedIndentIncrement : private zypp::DtorReset { ScopedIndentIncrement( MbsWriteWrapped & mww_r, size_t increment_r ) : DtorReset( mww_r._indent ) { mww_r._indent = mww_r.saneIncrementIndent( increment_r ); } }; /** \relates ScopedIndentIncrement Temporarily increase indent. */ ScopedIndentIncrement scopedIndentIncrement( size_t increment_r ) { return ScopedIndentIncrement( *this, increment_r ); } /** Write \a text_r; starting a new paragraph. */ void startPar( boost::string_ref text_r ) { gotoParBegin(); write( text_r ); } /** \overload Indented */ void startPar( boost::string_ref text_r, size_t increment_r ) { ScopedIndentIncrement s1( *this, increment_r ); startPar( text_r ); } /** Continue writing text at the current position. */ void addString( boost::string_ref text_r ) { write( text_r ); } /** \overload Indented */ void addString( boost::string_ref text_r, size_t increment_r ) { ScopedIndentIncrement s1( *this, increment_r ); addString( text_r ); } /** Continue writing text (separated by WS if not \ref atLineBegin). */ void writeText( boost::string_ref text_r ) { _gapForced = 1; write( text_r ); } /** \overload Indented */ void writeText( boost::string_ref text_r, size_t increment_r ) { ScopedIndentIncrement s1( *this, increment_r ); writeText( text_r ); } /** Write \a text_r; starting a new paragraph and ending it after the text was written. */ void writePar( boost::string_ref text_r ) { gotoParBegin(); write( text_r ); gotoParBegin(); } /** \overload Indented */ void writePar( boost::string_ref text_r, size_t increment_r ) { ScopedIndentIncrement s1( *this, increment_r ); writePar( text_r ); } /** Write a \a tag_r with indented definition \a text_r. * Optional \a tagincr_r (0) and \a textincr_r (28) are counted on * top of the base increment. */ void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r, size_t tagincr_r, size_t textincr_r ) { gotoParBegin(); { ScopedIndentIncrement s1( *this, tagincr_r ); write( tag_r, /*leadingWSindents_r*/false ); } { ScopedIndentIncrement s1( *this, textincr_r ); if ( _lpos < _indent ) _gapForced = _indent - _lpos; else gotoNextLine(); write( text_r ); } gotoParBegin(); } /** \overload Use default tag/text increment */ void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r ) { writeDefinition( tag_r, text_r, 0, 28 ); } /** \overload Indented */ void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r, size_t tagincr_r, size_t textincr_r, size_t increment_r ) { ScopedIndentIncrement s1( *this, increment_r ); writeDefinition( tag_r, text_r, tagincr_r, textincr_r ); } /** \overload Indented using default tag/text increment */ void writeDefinition( boost::string_ref tag_r, boost::string_ref text_r, size_t increment_r ) { ScopedIndentIncrement s1( *this, increment_r ); writeDefinition( tag_r, text_r ); } private: /** Append \a text_r indented and wrapped at the current position. * All words and NL are written, only trailing WS is remembered. */ void write( boost::string_ref text_r, bool leadingWSindents_r = true ) { for( MbsIterator it( text_r ); ! it.atEnd(); ++it ) { if ( it.isNL() ) { gotoNextPar(); // write out any pending word and start new par } else if ( it.isWS() ) { if ( _word ) // write out pending word and start new gap { writeout(); ++_gap; } else { if ( atParBegin() && leadingWSindents_r ) // ws at par begin may increment indent ++_indentGap; else ++_gap; } } else // non WS // remember in word { if ( !_word ) _word = it.pos(); _wSize += it.size(); _wColumns += it.columns(); } } writeout(); // write out any pending word; gaps are remembered for next text } /** Write any pending "indent/gap+word" and reset for next word. * If \a force_r, gap is cleared even if no word is pending. This * is used before writing a '\n'. */ void writeout( bool force_r = false ) { if ( _word ) { _writeoutPending(); // reset gaps and word clearGap(); clearWord(); } else if ( force_r ) clearGap(); } void _writeoutPending() { // NOTE: we are either atLineBegin or in a _gap between words if ( !atLineBegin() ) { if ( _gap < _gapForced ) _gap = _gapForced; if ( !_defaultWrap || _lpos+_gap+_wColumns <= _defaultWrap ) { _out << std::string( _gap, ' ' ) << boost::string_ref( _word, _wSize ); _lpos += _gap + _wColumns; return; } // Here: did not fit on this line // suppress gap and write indented on next line clearGap(); _out << std::endl; _lpos = 0; } // Here: atLineBegin unsigned useIndent = fixIndent( _indent + _indentGap + _gap ); if ( _defaultWrap ) // fix large indent { while ( useIndent >= _defaultWrap ) useIndent -= _defaultWrap; } // Try writing the whole word if ( !_defaultWrap || useIndent+_wColumns <= _defaultWrap ) { _out << std::string( useIndent, ' ' ) << boost::string_ref( _word, _wSize ); _lpos += useIndent + _wColumns; return; } // Still here: word is too big, we need to split it :( for( MbsIterator it( boost::string_ref( _word, _wSize ) ); ! it.atEnd(); ++it ) { if ( atLineBegin() ) { _out << std::string( useIndent, ' ' ); _lpos += useIndent; } _out << it.ref(); ++_lpos; if ( _lpos >= _defaultWrap ) { _out << std::endl; _lpos = 0; } } } /** Return fixed indent_r */ static size_t fixIndent( size_t indent_r, int indentFix_r ) { if ( indentFix_r ) { if ( indentFix_r < 0 && ( size_t(-indentFix_r) >= indent_r ) ) indent_r = 0; else indent_r += indentFix_r; } return indent_r; } /** Return fixed indent_r (unsets _indentFix) */ size_t fixIndent( size_t indent_r ) { indent_r = fixIndent( indent_r, _indentFix ); _indentFix = 0; return indent_r; } /** Return incremented indent, but not to more than 50% of the remaining line size if wrapped. */ static size_t saneIncrementIndent( size_t current_r, size_t increment_r, size_t wrap_r ) { if ( ! increment_r ) return current_r; increment_r += current_r; if ( wrap_r && current_r < wrap_r ) { size_t limit = current_r + ( (wrap_r-current_r)/2 ); if ( limit < increment_r ) increment_r = limit; } return increment_r; } /** Return incremented \c _indent, but not more than 50% of the remaining line size if wrapped. */ size_t saneIncrementIndent( size_t increment_r ) { return saneIncrementIndent( _indent, increment_r, _defaultWrap ); } /** Set default indent at par start (reloads \c _indentFix) */ void clearIndent() { _indentFix = _defaultIndentFix; _indentGap = 0; } /** Set no gaps */ void clearGap() { _gap = 0; _gapForced = 0; _gapLines = 0; } /** Set no word pending */ void clearWord() { _word = nullptr; _wSize = 0; _wColumns = 0; } std::ostream & _out; const size_t _defaultWrap; const size_t _defaultIndent; const int _defaultIndentFix; size_t _indent; // base indent for par int _indentFix; // indent correction for a pars 1st line size_t _indentGap; // additional indent for current par size_t _lpos; // cursor pos on current line size_t _gap; // amount of WS before next word size_t _gapForced; // forced WS before next word size_t _gapLines; // forced NL before next word/par const char * _word; // current word start in text size_t _wSize; // current word size in byte size_t _wColumns; // current word screen columns }; #undef ZYPPER_TRACE_MBS } // namespace mbs /////////////////////////////////////////////////////////////////// /** * Wrap and indent given \a text and write it to the output stream \a out. * * TODO * - delete whitespace at the end of lines * - keep one-letter words with the next * * \param out output stream to write to * \param test text to wrap * \param indent number of columns by which to indent the whole text * \param wrap number of columns the text should be wrapped into * \param indentFix additional indent/outdent for the first line (default: \c 0) */ inline void mbs_write_wrapped( std::ostream & out, boost::string_ref text_r, size_t indent_r, size_t wrap_r, int indentFix_r = 0 ) { mbs::MbsWriteWrapped mww( out, indent_r, wrap_r, indentFix_r ); mww.addString( text_r ); } /** \overload for str::Str */ inline void mbs_write_wrapped( std::ostream & out, const zypp::str::Str & text_r, size_t indent_r, size_t wrap_r, int indentFix_r = 0 ) { mbs_write_wrapped( out, text_r.str(), indent_r, wrap_r, indentFix_r ); } /** Returns the column width of a multi-byte character string \a text_r */ inline size_t mbs_width( boost::string_ref text_r ) { size_t ret = 0; for( mbs::MbsIterator it( text_r ); ! it.atEnd(); ++it ) ret += it.columns(); return ret; } /** * Returns a substring of a multi-byte character string \a text_r starting * at screen column \a cpos_r and being at most \a clen_r columns wide. * The string is ' ' padded if multicolumn characters are clipped at start * or end. */ std::string mbs_substr_by_width( boost::string_ref text_r, std::string::size_type colpos_r = 0, std::string::size_type collen_r = std::string::npos ); } #endif /* ZYPP_UTILS_TEXT_H_ */ libzypp-17.36.5/zypp.conf000066400000000000000000000531171476576476200152760ustar00rootroot00000000000000## Configuration file for software management ## /etc/zypp/zypp.conf ## ## Boolean values are 0 1 yes no on off true false [main] ## ## Override the detected architecture ## ## Valid values: i586, i686, x86_64, ppc, ppc64, ia64, s390, s390x, .. ## Default value: Autodetected ## ## ** CAUTION: Only set if you know what you're doing ! ## ** Changing this needs a full refresh (incl. download) ## ** of all repository data. ## # arch = s390 ## ## Path where the caches are kept. ## ## Valid values: A directory ## Default value: /var/cache/zypp ## # cachedir = /var/cache/zypp ## ## Path where the repo metadata is downloaded and kept. ## ## Valid values: A directory ## Default value: {cachedir}/raw ## ## Changing this needs a full refresh (incl. download) of all repository data ## # metadatadir = /var/cache/zypp/raw ## ## Path where the repo solv files are created and kept. ## ## Valid values: A directory ## Default value: {cachedir}/solv ## # solvfilesdir = /var/cache/zypp/solv ## ## Path where the repo packages are downloaded and kept. ## ## Valid values: A directory ## Default value: {cachedir}/packages ## # packagesdir = /var/cache/zypp/packages ## ## Path where the configuration files are kept. ## ## Valid values: A directory ## Default value: /etc/zypp ## # configdir = /etc/zypp ## ## Path where the known repositories .repo files are kept ## ## Valid values: A directory ## Default value: {configdir}/repos.d ## ## Changing this invalidates all known repositories ## # reposdir = /etc/zypp/repos.d ## ## Path where the known services .service files are kept ## ## Valid values: A directory ## Default value: {configdir}/services.d ## ## Changing this invalidates all known services ## # servicesdir = /etc/zypp/services.d ## ## Path where custom repo variable definitions are kept ## ## Valid values: A directory ## Default value: {configdir}/vars.d ## ## Changing this undefines all custom repo variables. Built-in ## variables (like '$arch', '$basearch' or $releasever) are not ## affected, but reset to their default values. ## ## A custom repo variable is defined by creating a file inside the ## directory. The variable name equals the file name. The file's first ## line (up to but not including the newline character) defines the ## variables value. ## # varsdir = /etc/zypp/vars.d ## ## Whether repository urls should be probed when added ## ## Valid values: boolean ## Default value: false ## ## If true, accessability of repositories is checked immediately (when added) ## (e.g. 'zypper ar' will check immediately) ## If false, accessability of repositories is checked when refreshed ## (e.g. 'zypper ar' will delay the check until the next refresh) ## # repo.add.probe = false ## ## Amount of time in minutes that must pass before another refresh. ## ## Valid values: Integer ## Default value: 10 ## ## If you have autorefresh enabled for a repository, it is checked for ## up-to-date metadata not more often than every ## minutes. If an automatic request for refresh comes before ## minutes passed since the last check, the request is ignored. ## ## A value of 0 means the repository will always be checked. To get the opposite ## effect, disable autorefresh for your repositories. ## ## This option has no effect for repositories with autorefresh disabled, nor for ## user-requested refresh. ## # repo.refresh.delay = 10 ## ## Translated package descriptions to download from repos. ## ## A list of locales for which translated package descriptions should ## be downloaded, in case they are available and the repo supports this. ## Not all repo formats support downloading specific translations only. ## ## Valid values: List of locales like 'en', 'en_US'... ## Default value: RequestedLocales ## ## If data for a specific locale are not available, we try to find some ## fallback. Translations for 'en' are always downloaded. ## # repo.refresh.locales = en, de ## ## Maximum number of concurrent connections to use per transfer ## ## Valid values: Integer ## Default value: 5 ## ## This setting is only used if more than one is possible ## Setting it to a reasonable number avoids flooding servers ## # download.max_concurrent_connections = 5 ## ## Sets the minimum download speed (bytes per second) ## until the connection is dropped ## This can be useful to prevent security attacks on hosts by ## providing updates at very low speeds. ## ## 0 means no limit ## # download.min_download_speed = 0 ## Maximum download speed (bytes per second) ## 0 means no limit # download.max_download_speed = 0 ## Number of tries per download which will be ## done without user interaction ## 0 means no limit (use with caution) # download.max_silent_tries = 5 ## ## Maximum time in seconds that you allow the connection phase to the server to take. ## ## This only limits the connection phase, it has no impact once it has connected. ## (see also CURLOPT_CONNECTTIMEOUT) ## ## Valid values: Integer ## Default value: 60 ## # download.connect_timeout = 60 ## ## Maximum time in seconds that you allow a transfer operation to take. ## ## This is useful for preventing your batch jobs from hanging for hours due ## to slow networks or links going down. Limiting operations to less than a ## few minutes risk aborting perfectly normal operations. ## ## Valid values: [0,3600] ## Default value: 180 ## # download.transfer_timeout = 180 ## ## Whether to consider using a .delta.rpm when downloading a package ## ## Valid values: boolean ## Default value: false ## true on SUSE-15.6 and older ## ## Using a delta rpm will decrease the download size for package updates ## since it does not contain all files of the package but only the binary ## diff of changed ones. Recreating the rpm package on the local machine ## is an expensive operation (memory,CPU). If your network connection is ## not too slow, you benefit from disabling .delta.rpm. ## # download.use_deltarpm = false ## ## Whether to consider using a deltarpm even when rpm is local ## ## Valid values: boolean ## Default value: false ## ## This option has no effect unless download.use_deltarpm is set true. ## # download.use_deltarpm.always = false ## ## Hint which media to prefer when installing packages (download vs. CD). ## ## Valid values: download, volatile ## Default value: download ## ## Note that this just a hint. First of all the solver will choose the 'best' ## package according to its repos priority, version and architecture. But if ## there is a choice, we will prefer packages from the desired media. ## ## Packages available locally are always preferred. The question is whether ## you prefer packages being downloaded via FTP/HTTP/HTTPS (download), rather ## than being prompted to insert a CD/DVD (volatile), in case they are available ## on both media. ## ## Name | Priority | URI ## openSUSE-11.1 99 dvd:/// ## openSUSE-11.1-Oss 99 http://download.opensuse.org/distribution/11.1/repo/oss ## ## In the above example 2 repositories with similar content are used. Rather ## than raising the priority of one of them to 'prefer' a certain media, you ## should use the same priority for both and set download.media_preference ## instead. ## ## download.media_preference = download ## ## Path where media are preferably mounted or downloaded ## ## Valid values: A (writable) directory ## Default value: /var/adm/mount ## ## The media backend will try to organize media mount points and download areas ## below this directory, unless a different location is requested by the application. ## ## If the directory is not accessible and read/writable for a specific user, ## the fallback is to use /var/tmp. ## ## download.media_mountdir = /var/adm/mount ## ## Whether to use the geoip feature of download.opensuse.org ## ## Valid values: boolean ## Default value: true ## ## The media backend can rewrite download requests to the geographically closest available mirror. ## Which exact mirror is used will be determined by requesting a "geoip" file from download.opensuse.org ## via a HTTP GET request to https://download.opensuse.org/geoip , the server will use the clients IP to ## determine the closest mirror if available. ## Some specific files are however excluded from this redirection due to security reasons, especially the ## repo metadata index and it's key and checksum files: repomd.xml, repomd.xml.key and repomd.xml.asc ## ## download.use_geoip_mirror = true ## ## Signature checking (repo metadata and downloaded rpm packages) ## ## boolean gpgcheck (default: on) ## boolean repo_gpgcheck (default: unset -> according to gpgcheck) ## boolean pkg_gpgcheck (default: unset -> according to gpgcheck) ## ## Explicitly setting 'gpgcheck', 'repo_gpgcheck' 'pkg_gpgcheck' in a ## repositories .repo file will overwrite the defaults for this specific ## repo. ## ## If 'gpgcheck' is 'on' (the default) we will check the signature of repo metadata ## (packages are secured via checksum inside the metadata). Using unsigned repos ## needs to be confirmed. ## Packages from signed repos are accepted if their checksum matches the checksum ## stated in the repo metadata. ## Packages from unsigned repos need a valid gpg signature, using unsigned packages ## needs to be confirmed. ## ## The above default behavior can be tuned by explicitly setting 'repo_gpgcheck' ## and/or 'pkg_gpgcheck': ## ## 'repo_gpgcheck = on' same as the default. ## ## 'repo_gpgcheck = off' will silently accept unsigned repos. It will NOT turn off ## signature checking on the whole. Nevertheless, it's not a secure setting. ## ## 'pkg_gpgcheck = on' will enforce the package signature checking and the need ## to confirm unsigned packages for all repos (signed and unsigned). ## ## 'pkg_gpgcheck = off' will silently accept unsigned packages. It will NOT turn off ## signature checking on the whole. Nevertheless, it's not a secure setting. ## ## If 'gpgCheck' is 'off' (not recommended), no checks are performed. You can still ## enable them individually by setting 'repo_gpgcheck' and/or 'pkg_gpgcheck' to 'on'. ## ## DISABLING GPG CHECKS IS NOT RECOMMENDED. ## Signing data enables the recipient to verify that no modifications ## occurred after the data were signed. Accepting data with no, wrong ## or unknown signature can lead to a corrupted system and in extreme ## cases even to a system compromise. ## # repo_gpgcheck = unset -> according to gpgcheck # pkg_gpgcheck = unset -> according to gpgcheck ## ## Commit download policy to use as default. ## ## DownloadOnly, Just download all packages to the local cache. ## Do not install. Implies a dry-run. ## ## DownloadInAdvance, First download all packages to the local cache. ## Then start to install. ## ## DownloadInHeaps, Similar to DownloadInAdvance, but try to split ## the transaction into heaps, where at the end of ## each heap a consistent system state is reached. ## ## DownloadAsNeeded Alternating download and install. Packages are ## cached just to avid CD/DVD hopping. This is the ## traditional behaviour. ## ## If a value is not set, empty or unknown, we pick ## some sane default. ## ## commit.downloadMode = ## ## Defining directory which contains vendor description files. ## ## Each file in this directory defines a (comma separated) list of ## equivalent vendors string prefixes (case-insensitive comparison): ## ------------------------- file begin ----------------------- ## [main] ## vendors = MyVendor,AlternateName ## ------------------------- file end ----------------------- ## By this vendor strings starting with "MyVendor" or "AlternateName" ## are considered to be equivalent. Packages from equivalent vendors ## may replace each other without being considered as a 'vendor change'. ## ## NOTE: Within the "opensuse*" namespace exact matches (case insensitive) ## are required. "vendors = suse,opensuse" will allow switching between ## "suse*" and "opensuse", but not e.g. "opensuse build service". ## ## Valid values: A directory ## Default value: {configdir}/vendors.d ## # vendordir = /etc/zypp/vendors.d ## ## The solver's general attitude when resolving jobs. ## ## Valid values: ## ## Job - Focus on installing the best version of the requested packages. ## Add missing dependencies as needed. This is the solver's default. ## ## Installed - Focus on applying as little changes to the installed packages ## as needed. Choosing an older version of a package is valid if ## its dependencies require less changes to the system. ## ## Update - Focus on updating requested packages and their dependencies as ## much as possible. ## ## Default - If the value is not set, empty or unknown, we use the default. ## # solver.focus = ## ## Whether only required packages are installed. ## ## Recommended packages, will not be regarded. ## ## Valid values: boolean ## Default value: false ## # solver.onlyRequires = false ## ## EXPERTS ONLY: Per default the solver will not replace packages of ## different vendors, unless you explicitly ask to do so. Setting this ## option to TRUE will disable this vendor check (unless the application ## explicitly re-enables it). Packages will then be considered based on ## repository priority and version only. This may easily damage your system. ## ## Valid values: boolean ## Default value: false ## # solver.allowVendorChange = false ## ## EXPERTS ONLY: TUNE DISTRIBUTION UPGRADE (DUP) ## Set whether to allow package version downgrades upon DUP. ## ## Valid values: boolean ## Default value: true ## # solver.dupAllowDowngrade = true ## ## EXPERTS ONLY: TUNE DISTRIBUTION UPGRADE (DUP) ## Set whether follow package renames upon DUP. ## ## Valid values: boolean ## Default value: true ## # solver.dupAllowNameChange = true ## ## EXPERTS ONLY: TUNE DISTRIBUTION UPGRADE (DUP) ## Set whether to allow changing the packages architecture upon DUP. ## ## Valid values: boolean ## Default value: true ## # solver.dupAllowArchChange = true ## ## EXPERTS ONLY: TUNE DISTRIBUTION UPGRADE (DUP) ## Set whether to allow changing the packages vendor upon DUP. If you ## are following a continuous distribution like Tumbleweed or Factory ## where you use 'zypper dup --no-allow-vendor-change' quite frequently, ## you may indeed benefit from disabling the VendorChange. Packages from ## OBS repos will then be kept rather than being overwritten by Tumbleweeds ## version. ## ## Valid values: boolean ## Default value: true ## # solver.dupAllowVendorChange = true ## ## EXPERTS ONLY: Cleanup when deleting packages. Whether the solver should ## per default try to remove packages exclusively required by the ones it's ## asked to delete. ## ## This option should be used on a case by case basis, enabled via ## command line options or switches the applications offer. Changing ## the global default on a system where unattended actions are performed, ## may easily damage your system. ## ## CHANGING THE DEFAULT IS NOT RECOMMENDED. ## ## Valid values: boolean ## Default value: false ## # solver.cleandepsOnRemove = false ## ## This file contains requirements/conflicts which fulfill the ## needs of a running system. ## For example the system would be broken if not glibc or kernel is ## installed. ## So the user will be informed if these packages will be deleted. ## ## Format: Each line represents one dependency: ## e.g. ## requires:kernel ## requires:glibc ## Default value: {configdir}/systemCheck ## # solver.checkSystemFile = /etc/zypp/systemCheck ## ## This directory can contain files that contain requirements/conflicts ## which fulfill the needs of a running system (see checkSystemFile). ## ## Files are read in alphabetical order. ## ## Default value: {configdir}/systemCheck.d ## # solver.checkSystemFileDir = /etc/zypp/systemCheck.d ## ## When committing a dist upgrade (e.g. 'zypper dup') a solver testcase ## is written to /var/log/updateTestcase-. It is needed in bugreports. ## This option returns the number of testcases to keep on the system. Old ## cases will be deleted, as new ones are created. ## ## Use 0 to write no testcase at all, or -1 to keep all testcases. ## ## Valid values: Integer ## Default value: 2 ## # solver.upgradeTestcasesToKeep = 2 ## ## Whether dist upgrade should remove a products dropped packages. ## ## A new product may suggest a list of old and no longer supported ## packages (dropped packages). Performing a dist upgrade the solver ## may try to delete them, even if they do not cause any dependency ## problem. ## ## Turning this option off, the solver will not try to remove those ## packages unless they actually do cause dependency trouble. You may ## do the cleanup manually, or simply leave them installed as long ## as you don't need the disk space. ## ## Valid values: Boolean ## Default value: true ## # solver.upgradeRemoveDroppedPackages = true ## ## Packages which can be installed in different versions at the same time. ## ## Packages are selected either by name, or by provides. In the later case ## the string must start with "provides:" immediately followed by the capability. ## ## Example: ## kernel - just packages with name 'kernel' ## provides:multiversion(kernel) - all packages providing 'multiversion(kernel)' ## (kernel and kmp packages should do this) ## Valid values: ## Comma separated list of packages. ## ## Default value: ## empty ## multiversion = provides:multiversion(kernel) ## ## Defining directory which may contain additional multiversion definitions. ## ## If the directory exists, each file in this directory is scanned, expecting ## one valid multiversion list entry per line. Empty lines and lines starting ## with '#' are ignored. ## ------------------------- [/etc/zypp/multiversion.d/example file begin] ----------------------- ## # An alternate way to enable kernel packages being ## # installed in parallel: ## ## provides:multiversion(kernel) ## ------------------------- [/etc/zypp/multiversion.d/example file end] ----------------------- ## ## Valid values: A directory ## Default value: {configdir}/multiversion.d ## # multiversiondir = /etc/zypp/multiversion.d ## Comma separated list of kernel packages to keep installed in parallel, if the ## above multiversion variable is set. Packages can be specified as ## 2.6.32.12-0.7 - Exact version to keep ## latest - Keep kernel with the highest version number ## latest-N - Keep kernel with the Nth highest version number ## running - Keep the running kernel ## oldest - Keep kernel with the lowest version number (the GA kernel) ## oldest+N - Keep kernel with the Nth lowest version number ## ## Note: This entry is not evaluated by libzypp, but by the ## purge-kernels service (via /sbin/purge-kernels). ## ## Default: Do not delete any kernels if multiversion = provides:multiversion(kernel) is set multiversion.kernels = latest,latest-1,running ## ## Path to locks file. If not exist then is create. ## In this file is saved also UI locks. ## ## valid value: path to file or place where file can be created ## default value: {configdir}/locks ## # locksfile.path = /etc/zypp/locks ## ## Whether to apply locks in locks file after zypp start. ## ## Valid values: boolean ## Default value: true ## # locksfile.apply = true ## ## Command to be invoked to send update messages. ## ## Packages may leave an update message file in {update.messagesdir}. ## At the end of each commit, zypp collects those messages and may send ## a notification to the user. ## ## zypp will prepare the update messages according to the selected ## content format and pipe the content to the command. ## ## Format: ## single - For each update message invoke the command and send ## the message. ## none - For each update message invoke the command but don't ## use a pipe to send any data. You probably want to pass ## the message file on the commandline using %P (see ## Substitutions). ## digest - Single invocation of the command, sending the path ## names of all update message. One per line. ## bulk - Single invocation of the command, sending the ## concatenated content of all update messages, separated ## by Ctrl-L. ## ## Substitutions: ## %p - package identification (name-version-release.arch) ## %P - full path to the update message file ## ## Valid values: The value is specified as "format | command". ## An empty value will turn off any notification. ## ## Examples: single | mail -s 'Update message from %p' root ## none | my-send-script -f %P ## ## Default value: ## # update.messages.notify = ## ## Options for package installation: excludedocs ## ## Don't install any files which are marked as documentation. ## ## Valid values: boolean ## Default value: no ## # rpm.install.excludedocs = no ## ## Location of history log file. ## ## The history log is described at ## http://en.opensuse.org/Libzypp/Package_History ## ## Valid values: absolute path to a file ## Default value: /var/log/zypp/history ## # history.logfile = /var/log/zypp/history ## ## Global credentials directory path. ## ## If a URL contains ?credentials= parameter, the credentials will ## be stored and looked for in a file named in this directory. ## ## Valid values: absolute path to a directory ## Default value: /etc/zypp/credentials.d ## # credentials.global.dir = /etc/zypp/credentials.d ## ## Global credentials catalog file path. ## ## This file contains a catalog of all known user credentials which were ## not stored via the ?credentials= URL parameter, i.e. passed ## in URL as username:password component, or entered by user in ## an authentication dialog. ## ## Valid values: absolute path to a file ## Default value: /etc/zypp/credentials.cat ## # credentials.global.file = /etc/zypp/credentials.cat libzypp-17.36.5/zypp/000077500000000000000000000000001476576476200144205ustar00rootroot00000000000000libzypp-17.36.5/zypp/APIConfig.h000066400000000000000000000000411476576476200163230ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Application.cc000066400000000000000000000020471476576476200171750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Application.cc */ #include //#include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { IMPL_PTR_TYPE( Application ); Application::Application( const sat::Solvable & solvable_r ) : ResObject( solvable_r ) {} Application::~Application() {} } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Application.h000066400000000000000000000031511476576476200170340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Application.h */ #ifndef ZYPP_APPLICATION_H #define ZYPP_APPLICATION_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { DEFINE_PTR_TYPE(Application); /////////////////////////////////////////////////////////////////// /// \class Application /// \brief Class representing an application (appdata.xml) /////////////////////////////////////////////////////////////////// class ZYPP_API Application : public ResObject { public: using Self = Application; using TraitsType = ResTraits; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: // no attributes defined by now protected: friend Ptr make( const sat::Solvable & solvable_r ); /** Ctor */ Application( const sat::Solvable & solvable_r ); /** Dtor */ ~Application() override; }; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_APPLICATION_H libzypp-17.36.5/zypp/Arch.cc000066400000000000000000000474551476576476200156230ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Arch.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Arch::CompatEntry // /** Holds an architecture ID and its compatible relation. * An architecture is compatibleWith, if its _idBit is set in * _compatBits. noarch has ID 0, non-builtin archs have ID 1 and * have to be treated specially. */ struct Arch::CompatEntry { /** Bitfield for architecture IDs and compatBits relation. * \note Need one bit for each builtin Arch. * \todo Migrate to some infinite BitField */ using CompatBits = bit::BitField; CompatEntry( const std::string & archStr_r, CompatBits::IntT idBit_r = 1 ) : _idStr( archStr_r ) , _archStr( archStr_r ) , _idBit( idBit_r ) , _compatBits( idBit_r ) {} CompatEntry( IdString archStr_r, CompatBits::IntT idBit_r = 1 ) : _idStr( archStr_r ) , _archStr( archStr_r.asString() ) , _idBit( idBit_r ) , _compatBits( idBit_r ) {} void addCompatBit( const CompatBits & idBit_r ) const { if ( idBit_r && ! (_compatBits & idBit_r) ) { _compatBits |= idBit_r; } } /** Return whether \c this is compatible with \a targetEntry_r.*/ bool compatibleWith( const CompatEntry & targetEntry_r ) const { switch ( _idBit.value() ) { case 0: // this is noarch and always comatible return true; break; case 1: // this is a non builtin: self compatible only return _archStr == targetEntry_r._archStr; break; } // This is a builtin: compatible if mentioned in targetEntry_r return bool( targetEntry_r._compatBits & _idBit ); } /** compare by score, then archStr. */ int compare( const CompatEntry & rhs ) const { if ( _idBit.value() != rhs. _idBit.value() ) return( _idBit.value() < rhs. _idBit.value() ? -1 : 1 ); return _archStr.compare( rhs._archStr ); // Id 1: non builtin } bool isBuiltIn() const { return( _idBit != CompatBits(1) ); } IdString::IdType id() const { return _idStr.id(); } IdString _idStr; std::string _archStr; // frequently used by the UI so we keep a reference CompatBits _idBit; mutable CompatBits _compatBits; }; /////////////////////////////////////////////////////////////////// /** \relates Arch::CompatEntry Stream output */ inline std::ostream & operator<<( std::ostream & str, const Arch::CompatEntry & obj ) { Arch::CompatEntry::CompatBits bit( obj._idBit ); unsigned bitnum = 0; while ( bit ) { ++bitnum; bit >>= 1; } return str << str::form( "%-15s ", obj._archStr.c_str() ) << str::numstring(bitnum,2) << ' ' << obj._compatBits << ' ' << obj._compatBits.value(); } /** \relates Arch::CompatEntry */ inline bool operator==( const Arch::CompatEntry & lhs, const Arch::CompatEntry & rhs ) { return lhs._idStr == rhs._idStr; } /** \relates Arch::CompatEntry */ inline bool operator!=( const Arch::CompatEntry & lhs, const Arch::CompatEntry & rhs ) { return ! ( lhs == rhs ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// ZYPP_DEFINE_ID_HASHABLE( zypp::Arch::CompatEntry ); /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// // Builtin architecture STRING VALUES to be // used in defCompatibleWith below! // // const IdString _foo( "foo" ); // const Arch Arch_foo( _foo() ); // // NOTE: Builtin CLASS Arch CONSTANTS are defined below. // You have to change them accordingly in Arch.h. // // NOTE: Thake care CompatBits::IntT is able to provide one // bit for each architecture. // #define DEF_BUILTIN(A) \ namespace { static inline const IdString & a_##A () { static IdString _str(#A); return _str; } } \ const Arch Arch_##A( a_##A() ) DEF_BUILTIN( noarch ); DEF_BUILTIN( i386 ); DEF_BUILTIN( i486 ); DEF_BUILTIN( i586 ); DEF_BUILTIN( i686 ); DEF_BUILTIN( athlon ); DEF_BUILTIN( x86_64 ); DEF_BUILTIN( x86_64_v2 ); DEF_BUILTIN( x86_64_v3 ); DEF_BUILTIN( x86_64_v4 ); DEF_BUILTIN( pentium3 ); DEF_BUILTIN( pentium4 ); DEF_BUILTIN( s390 ); DEF_BUILTIN( s390x ); DEF_BUILTIN( ppc ); DEF_BUILTIN( ppc64 ); DEF_BUILTIN( ppc64p7 ); DEF_BUILTIN( ppc64le ); DEF_BUILTIN( ia64 ); DEF_BUILTIN( alphaev67 ); DEF_BUILTIN( alphaev6 ); DEF_BUILTIN( alphapca56 ); DEF_BUILTIN( alphaev56 ); DEF_BUILTIN( alphaev5 ); DEF_BUILTIN( alpha ); DEF_BUILTIN( sparc64v ); DEF_BUILTIN( sparcv9v ); DEF_BUILTIN( sparc64 ); DEF_BUILTIN( sparcv9 ); DEF_BUILTIN( sparcv8 ); DEF_BUILTIN( sparc ); DEF_BUILTIN( aarch64 ); DEF_BUILTIN( armv7tnhl ); /* exists? */ DEF_BUILTIN( armv7thl ); /* exists? */ DEF_BUILTIN( armv7hnl ); /* legacy: */DEF_BUILTIN( armv7nhl ); DEF_BUILTIN( armv8hl ); DEF_BUILTIN( armv7hl ); DEF_BUILTIN( armv6hl ); DEF_BUILTIN( armv8l ); DEF_BUILTIN( armv7l ); DEF_BUILTIN( armv6l ); DEF_BUILTIN( armv5tejl ); DEF_BUILTIN( armv5tel ); DEF_BUILTIN( armv5tl ); DEF_BUILTIN( armv5l ); DEF_BUILTIN( armv4tl ); DEF_BUILTIN( armv4l ); DEF_BUILTIN( armv3l ); DEF_BUILTIN( riscv64 ); DEF_BUILTIN( sh3 ); DEF_BUILTIN( sh4 ); DEF_BUILTIN( sh4a ); DEF_BUILTIN( m68k ); DEF_BUILTIN( mips ); DEF_BUILTIN( mipsel ); DEF_BUILTIN( mips64 ); DEF_BUILTIN( mips64el ); DEF_BUILTIN( loong64 ); #undef DEF_BUILTIN /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : CompatSet // /** Maintain architecture compatibility (Singleton by the way it is used). * * Povides \ref Arch::CompatEntry for \ref Arch. Defines the * compatibleWith relation. * \li \c noarch has _idBit 0 * \li \c nonbuiltin archs have _idBit 1 */ struct ArchCompatSet : private base::NonCopyable { using CompatEntry = Arch::CompatEntry; using CompatBits = CompatEntry::CompatBits; using Set = std::unordered_set; using iterator = Set::iterator; using const_iterator = Set::const_iterator; /** Singleton access. */ static ArchCompatSet & instance() { static ArchCompatSet _instance; return _instance; } /** Return the entry related to \a archStr_r. * Creates an entry for nonbuiltin archs. */ const Arch::CompatEntry & assertDef( const std::string & archStr_r ) { return *_compatSet.insert( Arch::CompatEntry( archStr_r ) ).first; } /** \overload */ const Arch::CompatEntry & assertDef( IdString archStr_r ) { return *_compatSet.insert( Arch::CompatEntry( archStr_r ) ).first; } const_iterator begin() const { return _compatSet.begin(); } const_iterator end() const { return _compatSet.end(); } struct DumpOnCompare { int operator()( const CompatEntry & lhs, const CompatEntry & rhs ) const { return lhs._idBit.value() < rhs._idBit.value(); } }; std::ostream & dumpOn( std::ostream & str ) const { str << "ArchCompatSet:"; std::list ov( _compatSet.begin(), _compatSet.end() ); ov.sort( DumpOnCompare() ); for_( it, ov.begin(), ov.end() ) { str << endl << ' ' << *it; } return str; } private: /** Singleton ctor. */ ArchCompatSet() { // _noarch must have _idBit 0. // Other builtins have 1-bit set // and are initialized done on the fly. _compatSet.insert( Arch::CompatEntry( a_noarch(), 0 ) ); /////////////////////////////////////////////////////////////////// // Define the CompatibleWith relation: // // NOTE: Order of definition is significant! (Arch::compare) // - define compatible (less) architectures first! // defCompatibleWith( a_i386(), a_noarch() ); defCompatibleWith( a_i486(), a_noarch(),a_i386() ); defCompatibleWith( a_i586(), a_noarch(),a_i386(),a_i486() ); defCompatibleWith( a_i686(), a_noarch(),a_i386(),a_i486(),a_i586() ); defCompatibleWith( a_athlon(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() ); defCompatibleWith( a_x86_64(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon() ); defCompatibleWith( a_x86_64_v2(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64() ); defCompatibleWith( a_x86_64_v3(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64(),a_x86_64_v2() ); defCompatibleWith( a_x86_64_v4(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_athlon(),a_x86_64(),a_x86_64_v2(),a_x86_64_v3() ); defCompatibleWith( a_pentium3(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() ); defCompatibleWith( a_pentium4(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686(),a_pentium3() ); defCompatibleWith( a_ia64(), a_noarch(),a_i386(),a_i486(),a_i586(),a_i686() ); // defCompatibleWith( a_s390(), a_noarch() ); defCompatibleWith( a_s390x(), a_noarch(),a_s390() ); // defCompatibleWith( a_ppc(), a_noarch() ); defCompatibleWith( a_ppc64(), a_noarch(),a_ppc() ); defCompatibleWith( a_ppc64p7(), a_noarch(),a_ppc(),a_ppc64() ); // defCompatibleWith( a_ppc64le(), a_noarch() ); // defCompatibleWith( a_alpha(), a_noarch() ); defCompatibleWith( a_alphaev5(), a_noarch(),a_alpha() ); defCompatibleWith( a_alphaev56(), a_noarch(),a_alpha(),a_alphaev5() ); defCompatibleWith( a_alphapca56(), a_noarch(),a_alpha(),a_alphaev5(),a_alphaev56() ); defCompatibleWith( a_alphaev6(), a_noarch(),a_alpha(),a_alphaev5(),a_alphaev56(),a_alphapca56() ); defCompatibleWith( a_alphaev67(), a_noarch(),a_alpha(),a_alphaev5(),a_alphaev56(),a_alphapca56(),a_alphaev6() ); // defCompatibleWith( a_sparc(), a_noarch() ); defCompatibleWith( a_sparcv8(), a_noarch(),a_sparc() ); defCompatibleWith( a_sparcv9(), a_noarch(),a_sparc(),a_sparcv8() ); defCompatibleWith( a_sparcv9v(), a_noarch(),a_sparc(),a_sparcv8(),a_sparcv9() ); // defCompatibleWith( a_sparc64(), a_noarch(),a_sparc(),a_sparcv8(),a_sparcv9() ); defCompatibleWith( a_sparc64v(), a_noarch(),a_sparc(),a_sparcv8(),a_sparcv9(),a_sparcv9v(),a_sparc64() ); // defCompatibleWith( a_armv3l(), a_noarch() ); defCompatibleWith( a_armv4l(), a_noarch(),a_armv3l() ); defCompatibleWith( a_armv4tl(), a_noarch(),a_armv3l(),a_armv4l() ); defCompatibleWith( a_armv5l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl() ); defCompatibleWith( a_armv5tl(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l() ); defCompatibleWith( a_armv5tel(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl() ); defCompatibleWith( a_armv5tejl(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel() ); defCompatibleWith( a_armv6l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel(),a_armv5tejl() ); defCompatibleWith( a_armv7l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel(),a_armv5tejl(),a_armv6l() ); defCompatibleWith( a_armv8l(), a_noarch(),a_armv3l(),a_armv4l(),a_armv4tl(),a_armv5l(),a_armv5tl(),a_armv5tel(),a_armv5tejl(),a_armv6l(),a_armv7l() ); defCompatibleWith( a_armv6hl(), a_noarch() ); defCompatibleWith( a_armv7hl(), a_noarch(),a_armv6hl() ); defCompatibleWith( a_armv8hl(), a_noarch(),a_armv7hl() ); defCompatibleWith( a_armv7hnl(), a_noarch(),a_armv7hl(),a_armv6hl() ); /*legacy: rpm uses v7hnl */ defCompatibleWith( a_armv7nhl(), a_noarch(),a_armv7hnl(),a_armv7hl(),a_armv6hl() ); /*?*/defCompatibleWith( a_armv7thl(), a_noarch(),a_armv7hl() ); /*?*/defCompatibleWith( a_armv7tnhl(), a_noarch(),a_armv7hl(),a_armv7nhl(),a_armv7thl() ); defCompatibleWith( a_aarch64(), a_noarch() ); // defCompatibleWith( a_riscv64(), a_noarch() ); // defCompatibleWith( a_sh3(), a_noarch() ); // defCompatibleWith( a_sh4(), a_noarch() ); defCompatibleWith( a_sh4a(), a_noarch(),a_sh4() ); defCompatibleWith( a_m68k(), a_noarch() ); defCompatibleWith( a_mips(), a_noarch() ); defCompatibleWith( a_mipsel(), a_noarch() ); defCompatibleWith( a_mips64(), a_noarch() ); defCompatibleWith( a_mips64el(), a_noarch() ); defCompatibleWith( a_loong64(), a_noarch() ); // /////////////////////////////////////////////////////////////////// // dumpOn( USR ) << endl; } private: /** Return the next avialable _idBit. * Ctor injects _noarch into the _compatSet, 1 is for * nonbuiltin archs, so we can use size for * buitin archs. */ CompatBits::IntT nextIdBit() const { if ( CompatBits::size == _compatSet.size() ) { // Provide more bits in CompatBits::IntT INT << "Need more than " << CompatBits::size << " bits to encode architectures." << endl; ZYPP_THROW( Exception("Need more bits to encode architectures.") ); } CompatBits::IntT nextBit = CompatBits::IntT(1) << (_compatSet.size()); return nextBit; } /** Assert each builtin Arch gets an unique _idBit when * inserted into the _compatSet. */ const CompatEntry & assertCompatSetEntry( IdString archStr_r ) { return *_compatSet.insert( Arch::CompatEntry( archStr_r, nextIdBit() ) ).first; } /** Initialize builtin Archs and set _compatBits. */ void defCompatibleWith( IdString targetArch_r, IdString arch0_r, IdString arch1_r = IdString(), IdString arch2_r = IdString(), IdString arch3_r = IdString(), IdString arch4_r = IdString(), IdString arch5_r = IdString(), IdString arch6_r = IdString(), IdString arch7_r = IdString(), IdString arch8_r = IdString(), IdString arch9_r = IdString() ) { const CompatEntry & target( assertCompatSetEntry( targetArch_r ) ); target.addCompatBit( assertCompatSetEntry( arch0_r )._idBit ); #define SETARG(N) if ( arch##N##_r.empty() ) return; target.addCompatBit( assertCompatSetEntry( arch##N##_r )._idBit ) SETARG(1); SETARG(2); SETARG(3); SETARG(4); SETARG(5); SETARG(6); SETARG(7); SETARG(8); SETARG(9); #undef SETARG } private: Set _compatSet; }; ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Arch // /////////////////////////////////////////////////////////////////// const Arch Arch_empty ( IdString::Empty ); // remaining Arch_* constants are defined by DEF_BUILTIN above. /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::Arch // METHOD TYPE : Ctor // Arch::Arch() : _entry( &ArchCompatSet::instance().assertDef( a_noarch() ) ) {} Arch::Arch( IdString::IdType id_r ) : _entry( &ArchCompatSet::instance().assertDef( IdString(id_r) ) ) {} Arch::Arch( const IdString & idstr_r ) : _entry( &ArchCompatSet::instance().assertDef( idstr_r ) ) {} Arch::Arch( const std::string & str_r ) : _entry( &ArchCompatSet::instance().assertDef( str_r ) ) {} Arch::Arch( const char * cstr_r ) : _entry( &ArchCompatSet::instance().assertDef( cstr_r ) ) {} Arch::Arch( const CompatEntry & rhs ) : _entry( &rhs ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::idStr // METHOD TYPE : IdString // IdString Arch::idStr() const { return _entry->_idStr; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::asString // METHOD TYPE : const std::string & // const std::string & Arch::asString() const { return _entry->_archStr; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::isBuiltIn // METHOD TYPE : bool // bool Arch::isBuiltIn() const { return _entry->isBuiltIn(); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::compatibleWith // METHOD TYPE : bool // bool Arch::compatibleWith( const Arch & targetArch_r ) const { return _entry->compatibleWith( *targetArch_r._entry ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::baseArch // METHOD TYPE : Arch // Arch Arch::baseArch( ) const { // check the multilib archs: if (Arch_x86_64.compatibleWith(*this)) { return Arch_x86_64; } if (Arch_sparc64v.compatibleWith(*this)) { return Arch_sparc64v; } if (Arch_sparc64.compatibleWith(*this)) { return Arch_sparc64; } if (Arch_ppc64.compatibleWith(*this)) { return Arch_ppc64; } if (Arch_s390x.compatibleWith(*this)) { return Arch_s390x; } // Here: no multilib; return arch before noarch CompatSet cset( compatSet( *this ) ); if ( cset.size() > 2 ) // systemArchitecture, ..., basearch, noarch { return *(++cset.rbegin()); } return *this; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::compare // METHOD TYPE : bool // int Arch::compare( const Arch & rhs ) const { return _entry->compare( *rhs._entry ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Arch::compatSet // METHOD TYPE : Arch::CompatSet // Arch::CompatSet Arch::compatSet( const Arch & targetArch_r ) { Arch::CompatSet ret; for ( ArchCompatSet::const_iterator it = ArchCompatSet::instance().begin(); it != ArchCompatSet::instance().end(); ++it ) { if ( it->compatibleWith( *targetArch_r._entry ) ) { ret.insert( Arch(*it) ); } } return ret; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Arch.h000066400000000000000000000272671476576476200154640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Arch.h * */ #ifndef ZYPP_ARCH_H #define ZYPP_ARCH_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Arch // /** Architecture. */ class ZYPP_API Arch { public: /** Default ctor \ref Arc_noarch. */ Arch(); /** Ctor taking Arch as string. */ explicit Arch( IdString::IdType id_r ); explicit Arch( const IdString & idstr_r ); explicit Arch( const std::string & str_r ); explicit Arch( const char * cstr_r ); public: /** \name IdStringType like interface. * We can't use the complete \ref IdStringType mixin until * _doCompare can be redefined on any level, not just as char*. */ //@{ /** String representation of Arch. */ IdString idStr() const; /** \overload */ const std::string & asString() const; /** \overload */ const char * c_str() const { return asString().c_str(); } /** Test for an empty Arch (this is \ref Arch_epmty, not \ref Arch_noarch ). */ bool empty() const { return asString().empty(); } /** Size of the string representation. */ unsigned size() const { return asString().size(); } /** Expert backdoor. */ IdString::IdType id() const { return idStr().id(); } //@} public: /** Whether this is a buitin (or known) architecture. * Used e.g. in \ref Capability to determine whether * some trailing \c ".string" is part ot the name or * restriction to an architecture. */ bool isBuiltIn() const; public: /** Compatibility relation. * \return \c True iff \c this is compatible with \a targetArch_r. * \code * Arch_noarch.compatibleWith( ... ) ==> always true; * Arch_i686.compatibleWith( Arch_x86_64 ) ==> true; * Arch_x86_64.compatibleWith( Arch_i686 ) ==> false; * \endcode */ bool compatibleWith( const Arch & targetArch_r ) const; /** * \return the arch before noarch if it's not a multilib arch * (e.g. x86_64,sparc64v,sparc64,ppc64,s390x). */ Arch baseArch() const; /** \overload static version. */ static Arch baseArch( const Arch & targetArch_r ) { return targetArch_r.baseArch(); } /** Arch comparison. * Compatible architectures are treated as \c less (i.e. i686>i386>noarch). * So \c Arch_noarch is the least Arch. Equivalent architectures * (compatible in both directions) are ordered arbitrary. */ int compare( const Arch & rhs ) const; /** Arch comparison (static version). */ static int compare( const Arch & lhs, const Arch & rhs ) { return lhs.compare( rhs ); } public: /** Reversed arch order, best Arch first. */ using CompatSet = std::set>; /** Return a set of all Arch's \ref compatibleWith a \a targetArch_r. * \note The set is ordered according to compare, thus iterating * will start at \a targetArch_r and end with \c Arch_noarch. * \code * Arch::CompatSet cset( Arch::compatSet( Arch_x86_64 ) ); * * cout << str::join( make_transform_iterator( cset.begin(), std::mem_fn(&Arch::asString) ), * make_transform_iterator( cset.end(), std::mem_fn(&Arch::asString) ) ) * << endl; * * // Prints: x86_64 athlon i686 i586 i486 i386 noarch * \endcode */ static CompatSet compatSet( const Arch & targetArch_r ); /** */ static std::string asString( const CompatSet & cset ) { // Explicitely select the overload we want, clang seems to choke if there is a static overload for the // member function we want to capture in std::mem_fn (fixes GH-478) const std::string & (Arch::*memfn)( ) const = &Arch::asString; return str::join( make_transform_iterator( cset.begin(), std::mem_fn( memfn ) ), make_transform_iterator( cset.end(), std::mem_fn( memfn ) ) ); } public: struct CompatEntry; private: Arch( const CompatEntry & ); const CompatEntry * _entry; }; /////////////////////////////////////////////////////////////////// /** \name Builtin architecture constants. * * Defined outside Arch as e.g. \c Arch_i386, because some names, * like \c i388, are used as \c #define, thus unusable as identifier * like \c Arch::i386. */ //@{ /** \relates Arch * This is an empty \ref Arch represented by an empty string. * Sometimes used to indicate an any or an unknown Arch. Don't * confuse this with \ref Arch_noarch, which is in fact an * architecture. */ extern const Arch Arch_empty ZYPP_API; /** \relates Arch */ extern const Arch Arch_noarch ZYPP_API; /** \relates Arch */ extern const Arch Arch_pentium4 ZYPP_API; /** \relates Arch */ extern const Arch Arch_pentium3 ZYPP_API; /** \relates Arch */ extern const Arch Arch_x86_64_v4 ZYPP_API; /** \relates Arch */ extern const Arch Arch_x86_64_v3 ZYPP_API; /** \relates Arch */ extern const Arch Arch_x86_64_v2 ZYPP_API; /** \relates Arch */ extern const Arch Arch_x86_64 ZYPP_API; /** \relates Arch */ extern const Arch Arch_athlon ZYPP_API; /** \relates Arch */ extern const Arch Arch_i686 ZYPP_API; /** \relates Arch */ extern const Arch Arch_i586 ZYPP_API; /** \relates Arch */ extern const Arch Arch_i486 ZYPP_API; /** \relates Arch */ extern const Arch Arch_i386 ZYPP_API; /** \relates Arch */ extern const Arch Arch_s390x ZYPP_API; /** \relates Arch */ extern const Arch Arch_s390 ZYPP_API; /** \relates Arch */ extern const Arch Arch_ppc64le ZYPP_API; /** \relates Arch */ extern const Arch Arch_ppc64p7 ZYPP_API; /** \relates Arch */ extern const Arch Arch_ppc64 ZYPP_API; /** \relates Arch */ extern const Arch Arch_ppc ZYPP_API; /** \relates Arch */ extern const Arch Arch_ia64 ZYPP_API; /** \relates Arch */ extern const Arch Arch_alphaev67 ZYPP_API; /** \relates Arch */ extern const Arch Arch_alphaev6 ZYPP_API; /** \relates Arch */ extern const Arch Arch_alphapca56 ZYPP_API; /** \relates Arch */ extern const Arch Arch_alphaev56 ZYPP_API; /** \relates Arch */ extern const Arch Arch_alphaev5 ZYPP_API; /** \relates Arch */ extern const Arch Arch_alpha ZYPP_API; /** \relates Arch */ extern const Arch Arch_sparc64v ZYPP_API; /** \relates Arch */ extern const Arch Arch_sparc64 ZYPP_API; /** \relates Arch */ extern const Arch Arch_sparcv9v ZYPP_API; /** \relates Arch */ extern const Arch Arch_sparcv9 ZYPP_API; /** \relates Arch */ extern const Arch Arch_sparcv8 ZYPP_API; /** \relates Arch */ extern const Arch Arch_sparc ZYPP_API; /** \relates Arch */ extern const Arch Arch_aarch64 ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv7tnh ZYPP_API; /* exists? */ /** \relates Arch */ extern const Arch Arch_armv7thl ZYPP_API; /* exists? */ /** \relates Arch */ extern const Arch Arch_armv7hnl ZYPP_API, /* legacy: */Arch_armv7nhl ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv7hl ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv6hl ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv8hl ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv8l ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv7l ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv6l ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv5tejl ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv5tel ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv5tl ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv5l ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv4tl ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv4l ZYPP_API; /** \relates Arch */ extern const Arch Arch_armv3l ZYPP_API; /** \relates Arch */ extern const Arch Arch_riscv64 ZYPP_API; /** \relates Arch */ extern const Arch Arch_sh3 ZYPP_API; /** \relates Arch */ extern const Arch Arch_sh4 ZYPP_API; /** \relates Arch */ extern const Arch Arch_sh4a ZYPP_API; /** \relates Arch */ extern const Arch Arch_m68k ZYPP_API; /** \relates Arch */ extern const Arch Arch_mips ZYPP_API; /** \relates Arch */ extern const Arch Arch_mipsel ZYPP_API; /** \relates Arch */ extern const Arch Arch_mips64 ZYPP_API; /** \relates Arch */ extern const Arch Arch_mips64el ZYPP_API; /** \relates Arch */ extern const Arch Arch_loong64 ZYPP_API; //@} /////////////////////////////////////////////////////////////////// /** \relates Arch stream output. */ inline std::ostream & operator<<( std::ostream & str, const Arch & obj ) { return str << obj.asString(); } /** \relates Arch XML output. */ inline std::ostream & dumpAsXmlOn( std::ostream & str, const Arch & obj ) { return str << "" << obj << ""; } /** \name Equality based on string value. */ //@{ /** \relates Arch */ inline bool operator==( const Arch & lhs, const Arch & rhs ) { return lhs.asString() == rhs.asString(); } /** \relates Arch */ inline bool operator==( const Arch & lhs, const std::string & rhs ) { return lhs.asString() == rhs; } /** \relates Arch */ inline bool operator==( const std::string & lhs, const Arch & rhs ) { return lhs == rhs.asString(); } /** \relates Arch */ inline bool operator!=( const Arch & lhs, const Arch & rhs ) { return !( lhs == rhs ); } /** \relates Arch */ inline bool operator!=( const Arch & lhs, const std::string & rhs ) { return !( lhs == rhs ); } /** \relates Arch */ inline bool operator!=( const std::string & lhs, const Arch & rhs ) { return !( lhs == rhs ); } //@} /////////////////////////////////////////////////////////////////// /** Functor finding compatible architectures. * \see Arch::compatibleWith */ struct ArchCompatibleWith { /** The target architecture */ Arch _targetArch; /** Ctor taking the target architecture */ ArchCompatibleWith( const Arch & targetArch_r ) : _targetArch( targetArch_r ) {} /** Call Arch::compatibleWith ( \c _targetArch ) on \a rhs. */ bool operator()( const Arch & rhs ) const { return rhs.compatibleWith( _targetArch ); } }; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace std { ///////////////////////////////////////////////////////////////// /** \relates zypp::Arch Default order for std::container based Arch::compare.*/ template<> #ifdef __clang__ constexpr #endif inline bool less::operator()( const zypp::Arch & lhs, const zypp::Arch & rhs ) const { return lhs.compare( rhs ) < 0; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ARCH_H libzypp-17.36.5/zypp/AutoDispose.h000066400000000000000000000000431476576476200170250ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Bit.h000066400000000000000000000255761476576476200153260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Bit.h * */ #ifndef ZYPP_BIT_H #define ZYPP_BIT_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /** * \todo Use boost::mpl library to assert constraints * at compiletime! There various like (TInt is an integral type) * (begin+size < maxbits) or ( field dependent * constants must be within the range defined by size ). */ namespace bit { ///////////////////////////////////////////////////////////////// namespace bit_detail { /** Generate constants with \a _size trailing '1'-bits */ template struct Gen1Bits { static const TInt value = (Gen1Bits::value << 1)+1; }; /** Specialization for \a _length 0 */ template struct Gen1Bits { static const TInt value = 0; }; } /** Number of bits available in \a TInt. */ template struct MaxBits { using IntT = TInt; static const unsigned value = (sizeof(IntT)*8); }; /** For printing bits. */ template inline std::string asString( TInt val, char zero = '0', char one = '1' ) { std::string s( MaxBits::value, zero ); for( unsigned i = MaxBits::value; i; ) { --i; if ( val & (TInt)1 ) s[i] = one; val = val >> 1; }; return s; } /** A bitmaks of \a _size 1-bits starting at bit \a _begin. */ template struct Mask { using IntT = TInt; static const IntT value = bit_detail::Gen1Bits::value << _begin; static const IntT inverted = ~value; }; /** Range of bits starting at bit \a _begin with length \a _size. */ template struct Range { using IntT = TInt; using MaxBits = zypp::bit::MaxBits; using Mask = zypp::bit::Mask; static const unsigned begin = _begin; static const unsigned size = _size; static const unsigned end = _begin + _size; }; /** Range specialisation for (illegal) zero \a _size. * Force error at compiletime. Currently because types * and values are undefined */ template struct Range {}; /** A value with in a Range. * \code * typedef Range SubField; // bits 2,3,4 in a char field * SubField::Mask::value; // 00011100 * RangeValue::value; // 00000000 * RangeValue::value; // 00000100 * RangeValue::value; // 00001000 * RangeValue::value; // 00001100 * \endcode */ template struct RangeValue { using RangeT = TRange; using IntT = typename TRange::IntT; static const IntT value = _value << RangeT::begin; }; /** A single 1-bit within a Range. * \code * typedef Range SubField; // bits 2,3,4 in a char field * SubField::Mask::value; // 00011100 * RangeBit::value; // 00000100 * RangeBit::value; // 00001000 * RangeBit::value; // 00010000 * \endcode */ template struct RangeBit { using RangeT = TRange; using IntT = typename TRange::IntT; static const IntT value = IntT(1) << (RangeT::begin + _pos); }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : BitField // /** An integral type used as BitField. * * Most methods exist as templated and nontemplated * version. The nontemplated operates on the complete * BitField, while the tamplated ones are restricted * to the given Range. * \code * BitField bf; // 00000000 * typedef Range SubField; // bits 2,3,4 in a char field * * bf.assign( -1 ); // assign SubField in -1 * // to SubField in bf. * // 00011100 * bf.assign( -1 ); // assign -1 to bf * // 11111111 * bf.assign( 0 ); // 11100011 * \endcode */ template class BitField : public Range::value> { public: /** Default ctor: zero. */ BitField() : _value( (TInt)0 ) {} /** Ctor taking an \a TInt. */ BitField( const TInt & value_r ) : _value( value_r ) {} public: /** Validate in a boolean context. */ explicit operator bool() const { return _value != (TInt)0; } public: /** Return the value. */ template TInt value() const { return _value & TRange::Mask::value; } TInt value() const { return _value; } /** Value as bit string. */ template std::string asString() const { return bit::asString( _value & TRange::Mask::value, '_' ); } std::string asString() const { return bit::asString( _value, '_' ); } /** Assign Range in \a rhs to \c this. */ template BitField & assign( TInt rhs ) { _value = (_value & TRange::Mask::inverted) | (rhs & TRange::Mask::value); return *this; } BitField & assign( TInt rhs ) { _value = rhs; return *this; } /** Test for equal value within a Range. */ template bool isEqual( TInt rhs ) const { return (_value & TRange::Mask::value) == (rhs & TRange::Mask::value); } bool isEqual( TInt rhs ) const { return _value == rhs; } public: /** Set or unset bits of \a rhs. */ template BitField & set( TInt rhs, bool doset_r ) { return set( (rhs & TRange::Mask::value), doset_r ); } BitField & set( TInt rhs, bool doset_r ) { return doset_r ? set( rhs ) : unset( rhs ); } /** Set bits of \a rhs. */ template BitField & set( TInt rhs ) { return set( rhs & TRange::Mask::value ); } BitField & set( TInt rhs ) { _value |= rhs; return *this; } /** Unset bits of \a rhs. */ template BitField & unset( TInt rhs ) { return unset( rhs & TRange::Mask::value ); } BitField & unset( TInt rhs ) { _value &= ~rhs; return *this; } /** Test whether \b all bits of \a rhs are set. */ template bool test( TInt rhs ) { return test( rhs & TRange::Mask::value ); } bool test( TInt rhs ) const { return (_value & rhs) == rhs; } /** Test whether \b at \b least \b one bit of \a rhs is set. */ template bool testAnyOf( TInt rhs ) { return testAnyOf( rhs & TRange::Mask::value ); } bool testAnyOf( TInt rhs ) const { return (_value & rhs); } public: BitField & operator=( const BitField & rhs ) { _value = rhs._value; return *this; } BitField & operator&=( const BitField & rhs ) { _value &= rhs._value; return *this; } BitField & operator|=( const BitField & rhs ) { _value |= rhs._value; return *this; } BitField & operator^=( const BitField & rhs ) { _value ^= rhs._value; return *this; } BitField & operator<<=( unsigned num ) { _value <<= num; return *this; } BitField & operator>>=( unsigned num ) { _value >>= num; return *this; } BitField operator~() const { return ~_value; } private: TInt _value; }; /////////////////////////////////////////////////////////////////// /** \relates BitField Stream output */ template std::ostream & operator<<( std::ostream & str, const BitField & obj ) { return str << obj.asString(); } /** \relates BitField */ template inline bool operator==( const BitField & lhs, const BitField & rhs ) { return lhs.value() == rhs.value(); } /** \relates BitField */ template inline bool operator!=( const BitField & lhs, const BitField & rhs ) { return ! (lhs == rhs); } /** \relates BitField */ template inline BitField operator&( const BitField & lhs, const BitField & rhs ) { return BitField(lhs) &= rhs; } /** \relates BitField */ template inline BitField operator|( const BitField & lhs, const BitField & rhs ) { return BitField(lhs) |= rhs; } /** \relates BitField */ template inline BitField operator^( const BitField & lhs, const BitField & rhs ) { return BitField(lhs) ^= rhs; } /** \relates BitField */ template inline BitField operator<<( const BitField & lhs, unsigned num ) { return BitField(lhs) <<= num; } /** \relates BitField */ template inline BitField operator>>( const BitField & lhs, unsigned num ) { return BitField(lhs) >>= num; } ///////////////////////////////////////////////////////////////// } // namespace bit /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BIT_H libzypp-17.36.5/zypp/Bitmap.h000066400000000000000000000016151476576476200160100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Bitmap.h * */ #ifndef ZYPP_BITMAP_H #define ZYPP_BITMAP_H #include /////////////////////////////////////////////////////////////////// namespace zypp { using Bitmap = sat::Map; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BITMAP_H libzypp-17.36.5/zypp/ByteArray.h000066400000000000000000000000411476576476200164660ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/ByteCount.h000066400000000000000000000000411476576476200165000ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/CMakeLists.txt000066400000000000000000000561631476576476200171730ustar00rootroot00000000000000# Collect all files that may contain translatable texts FILE( GLOB_RECURSE POT_FILE_DEPENDS RELATIVE ${LIBZYPP_SOURCE_DIR} "*.h" "*.cc" ) SET( POT_FILE_DEPENDS_ZYPP ${POT_FILE_DEPENDS} PARENT_SCOPE ) ADD_DEFINITIONS( -DZYPP_DLL ) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/sywu/include ) INCLUDE_DIRECTORIES( ${LIBZYPP_SOURCE_DIR} ${LIBZYPP_BINARY_DIR} ${LIBZYPP_SOURCE_DIR}/libs/zypp-core SYSTEM ) FIND_PACKAGE(Rpm REQUIRED) IF ( NOT RPM_FOUND) MESSAGE( FATAL_ERROR " rpm-devel not found" ) ENDIF ( NOT RPM_FOUND) # add_definitions( -DENABLE_SYWU ) # add_subdirectory(sywu) IF (ENABLE_ZCHUNK_COMPRESSION) INCLUDE_DIRECTORIES( ${ZCHUNK_INCLUDEDIR} ) ENDIF(ENABLE_ZCHUNK_COMPRESSION) #FILE(WRITE filename "message to write"... ) SET( zypp_SRCS Application.cc Capabilities.cc Capability.cc CapMatch.cc Changelog.cc CheckSum.cc CpeId.cc Dep.cc Digest.cc DiskUsageCounter.cc DownloadMode.cc Edition.cc PluginScript.cc PluginScriptException.cc PluginExecutor.cc Fetcher.cc FileChecker.cc Glob.cc HistoryLog.cc HistoryLogData.cc IdString.cc InstanceId.cc KeyRing.cc KeyRingContexts.cc Locks.cc MediaSetAccess.cc Package.cc Patch.cc PathInfo.cc Pattern.cc PoolItem.cc PoolItemBest.cc PoolQuery.cc PoolQueryResult.cc ProblemSolution.cc Product.cc ProvideFilePolicy.cc PurgeKernels.cc Range.cc Rel.cc RepoInfo.cc RepoManager.cc RepoManagerOptions.cc Repository.cc RepoStatus.cc ResKind.cc ResObject.cc Resolvable.cc Resolver.cc ResolverFocus.cc ResolverProblem.cc ResPool.cc ResPoolProxy.cc ResStatus.cc ServiceInfo.cc Signature.cc SrcPackage.cc SysContent.cc Target.cc TmpPath.cc VendorAttr.cc VendorSupportOptions.cc ZYpp.cc ZYppCommitPolicy.cc ZYppCommitResult.cc ZYppFactory.cc ) SET( zypp_EARLY_SRCS ZConfig.cc Arch.cc Locale.cc CountryCode.cc LanguageCode.cc ) SET( zypp_HEADERS APIConfig.h Application.h Arch.h Bit.h Bitmap.h Callback.h Capabilities.h Capability.h CapMatch.h Changelog.h CheckSum.h ContentType.h CountryCode.h CpeId.h Dep.h Digest.h DiskUsageCounter.h DownloadMode.h Edition.h PluginScript.h PluginScriptException.h PluginExecutor.h Fetcher.h FileChecker.h Glob.h HistoryLog.h HistoryLogData.h IdString.h IdStringType.h InstanceId.h KeyContext.h KeyManager.h KeyRing.h KeyRingContexts.h KVMap.h LanguageCode.h Locale.h Locks.h ManagedFile.h MediaProducts.h MediaSetAccess.h Vendor.h OnMediaLocation.h Package.h PackageKeyword.h Patch.h PathInfo.h Pattern.h PoolItem.h PoolItemBest.h PoolQuery.h PoolQueryUtil.tcc PoolQueryResult.h ProblemSolution.h ProblemTypes.h Product.h ProvideFilePolicy.h PublicKey.h PurgeKernels.h Range.h RelCompare.h Rel.h RepoInfo.h RepoManager.h RepoManagerFlags.h RepoManagerOptions.h Repository.h RepoStatus.h Filter.h ResFilters.h ResKind.h ResObject.h ResObjects.h Resolvable.h Resolver.h ResolverFocus.h ResolverNamespace.h ResolverProblem.h ResPool.h ResPoolProxy.h ResStatus.h ResTraits.h ServiceInfo.h Signature.h SrcPackage.h SysContent.h Target.h TmpPath.h UserData.h VendorAttr.h VendorSupportOptions.h ZConfig.h ZYppCallbacks.h ZYppCommit.h ZYppCommitPolicy.h ZYppCommitResult.h ZYppFactory.h ZYpp.h ) INSTALL( FILES ${zypp_HEADERS} DESTINATION "${INCLUDE_INSTALL_DIR}/zypp" ) SET( zypp_base_SRCS base/Backtrace.cc base/SerialNumber.cc base/Random.cc base/Measure.cc base/SetRelationMixin.cc base/StrMatcher.h base/StrMatcher.cc ) SET( zypp_base_HEADERS base/Backtrace.h base/Collector.h base/DrunkenBishop.h base/SerialNumber.h base/Env.h base/Random.h base/Algorithm.h base/Counter.h base/Debug.h base/Functional.h base/Json.h base/LocaleGuard.h base/Measure.h base/NamedValue.h base/ReferenceCounted.h base/SetRelationMixin.h base/SetTracker.h base/Signal.h base/StrMatcher.h base/TypeTraits.h base/ValueTransform.h ) INSTALL( FILES ${zypp_base_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/base ) SET( zypp_media_detail_HEADERS media/detail/DownloadProgressTracker.h media/detail/OptionalDownloadProgressReport.h ) SET( zypp_media_SRCS media/detail/DownloadProgressTracker.cc media/detail/OptionalDownloadProgressReport.cc media/MediaHandler.cc media/MediaHandlerFactory.cc media/MediaNFS.cc media/MediaCD.cc media/MediaDIR.cc media/MediaDISK.cc media/MediaCIFS.cc media/MediaNetworkCommonHandler.cc media/MediaCurl.cc media/MediaCurl2.cc media/MediaMultiCurl.cc media/MediaISO.cc media/MediaPlugin.cc media/MediaSource.cc media/MediaManager.cc media/MediaPriority.cc media/UrlResolverPlugin.cc ) SET( zypp_media_HEADERS media/MediaCD.h media/MediaCIFS.h media/MediaCurl.h media/MediaCurl2.h media/MediaMultiCurl.h media/MediaNetworkCommonHandler.h media/MediaDIR.h media/MediaDISK.h media/MediaException.h media/MediaHandler.h media/MediaHandlerFactory.h media/MediaISO.h media/MediaPlugin.h media/MediaManager.h media/MediaNFS.h media/MediaSource.h media/MediaPriority.h media/UrlResolverPlugin.h ) INSTALL( FILES ${zypp_media_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/media ) SET( zypp_ng_SRCS ng/context.cc ng/progressobserveradaptor.cc ng/reporthelper.cc ng/repomanager.cc ng/userrequest.cc ng/repo/downloader.cc ng/repo/refresh.cc ng/repo/workflows/plaindir.cc ng/repo/workflows/repodownloaderwf.cc ng/repo/workflows/repomanagerwf.cc ng/repo/workflows/rpmmd.cc ng/repo/workflows/serviceswf.cc ng/repo/workflows/susetags.cc ng/workflows/checksumwf.cc ng/workflows/contextfacade.cc ng/workflows/downloadwf.cc ng/workflows/keyringwf.cc ng/workflows/mediafacade.cc ng/workflows/repoinfowf.cc ng/workflows/signaturecheckwf.cc ) SET( zypp_ng_HEADERS ng/context.h ng/Context ng/progressobserveradaptor.h ng/reporthelper.h ng/repomanager.h ng/RepoManager ng/userrequest.h ng/UserRequest ng/repo/downloader.h ng/repo/Downloader ng/repo/refresh.h ng/repo/Refresh ng/repo/workflows/plaindir.h ng/repo/workflows/repodownloaderwf.h ng/repo/workflows/repomanagerwf.h ng/repo/workflows/rpmmd.h ng/repo/workflows/serviceswf.h ng/repo/workflows/susetags.h ng/workflows/checksumwf.h ng/workflows/contextfacade.h ng/workflows/downloadwf.h ng/workflows/keyringwf.h ng/workflows/mediafacade.h ng/workflows/logichelpers.h ng/workflows/repoinfowf.h ng/workflows/signaturecheckwf.h ) SET( zypp_ng_private_HEADERS ng/private/context_p.h ng/private/repomanager_p.h ) #INSTALL( FILES # ${zypp_ng_HEADERS} # DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/repo #) SET( zypp_parser_SRCS parser/HistoryLogReader.cc parser/RepoFileReader.cc parser/RepoindexFileReader.cc parser/ServiceFileReader.cc parser/ProductFileReader.cc ) SET( zypp_parser_HEADERS parser/HistoryLogReader.h parser/RepoFileReader.h parser/RepoindexFileReader.h parser/ServiceFileReader.h parser/ProductFileReader.h ) INSTALL( FILES ${zypp_parser_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/parser ) SET( zypp_parser_susetags_SRCS parser/susetags/RepoIndex.cc parser/susetags/ContentFileReader.cc ) SET( zypp_parser_susetags_HEADERS parser/susetags/RepoIndex.h parser/susetags/ContentFileReader.h ) INSTALL( FILES ${zypp_parser_susetags_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/parser/susetags ) SET( zypp_parser_xml_SRCS parser/xml/Node.cc parser/xml/ParseDef.cc parser/xml/ParseDefConsume.cc parser/xml/ParseDefException.cc parser/xml/Reader.cc parser/xml/XmlString.cc parser/xml/libxmlfwd.cc ) SET( zypp_parser_xml_HEADERS parser/xml/Parse.h parser/xml/Node.h parser/xml/ParseDef.h parser/xml/ParseDefConsume.h parser/xml/ParseDefException.h parser/xml/ParseDefTraits.h parser/xml/Reader.h parser/xml/XmlString.h parser/xml/libxmlfwd.h ) INSTALL( FILES ${zypp_parser_xml_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/parser/xml ) SET( zypp_parser_yum_SRCS parser/yum/RepomdFileReader.cc ) SET( zypp_parser_yum_HEADERS parser/yum/RepomdFileReader.h ) INSTALL( FILES ${zypp_parser_yum_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/parser/yum ) SET( zypp_pool_SRCS pool/PoolImpl.cc pool/PoolStats.cc ) SET( zypp_pool_HEADERS pool/PoolImpl.h pool/PoolStats.h pool/PoolTraits.h pool/ByIdent.h ) INSTALL( FILES ${zypp_pool_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/pool ) # SET( zypp_solver_detail_SRCS ) SET( zypp_solver_HEADERS solver/Types.h ) INSTALL( FILES ${zypp_solver_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/solver ) SET( zypp_solver_detail_SRCS solver/detail/ProblemSolutionIgnore.cc solver/detail/ProblemSolutionCombi.cc solver/detail/Resolver.cc solver/detail/SolutionAction.cc solver/detail/Testcase.cc solver/detail/SolverQueueItem.cc solver/detail/SolverQueueItemInstall.cc solver/detail/SolverQueueItemDelete.cc solver/detail/SolverQueueItemUpdate.cc solver/detail/SolverQueueItemInstallOneOf.cc solver/detail/SolverQueueItemLock.cc solver/detail/SATResolver.cc solver/detail/SystemCheck.cc ) SET( zypp_solver_detail_HEADERS solver/detail/ProblemSolutionIgnore.h solver/detail/ProblemSolutionCombi.h solver/detail/Resolver.h solver/detail/SolutionAction.h solver/detail/Testcase.h solver/detail/Types.h solver/detail/SolverQueueItem.h solver/detail/SolverQueueItemInstall.h solver/detail/SolverQueueItemDelete.h solver/detail/SolverQueueItemUpdate.h solver/detail/SolverQueueItemInstallOneOf.h solver/detail/SolverQueueItemLock.h solver/detail/ItemCapKind.h solver/detail/SATResolver.h solver/detail/SystemCheck.h ) INSTALL( FILES ${zypp_solver_detail_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/solver/detail ) SET( zypp_sat_SRCS sat/Pool.cc sat/Solvable.cc sat/SolvableSet.cc sat/SolvableSpec.cc sat/SolvIterMixin.cc sat/Map.cc sat/Queue.cc sat/FileConflicts.cc sat/Transaction.cc sat/WhatProvides.cc sat/WhatObsoletes.cc sat/LocaleSupport.cc sat/LookupAttr.cc sat/SolvAttr.cc ) SET( zypp_sat_HEADERS sat/Pool.h sat/Solvable.h sat/SolvableSet.h sat/SolvableType.h sat/SolvableSpec.h sat/SolvIterMixin.h sat/Map.h sat/Queue.h sat/FileConflicts.h sat/Transaction.h sat/WhatProvides.h sat/WhatObsoletes.h sat/LocaleSupport.h sat/LookupAttr.h sat/LookupAttrTools.h sat/SolvAttr.h ) INSTALL( FILES ${zypp_sat_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/sat ) SET( zypp_sat_detail_SRCS sat/detail/PoolImpl.cc ) SET( zypp_sat_detail_HEADERS sat/detail/PoolMember.h sat/detail/PoolImpl.h ) INSTALL( FILES ${zypp_sat_detail_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/sat/detail ) SET( zypp_target_SRCS target/RpmPostTransCollector.cc target/RequestedLocalesFile.cc target/SolvIdentFile.cc target/HardLocksFile.cc target/commitpackagepreloader.cc target/CommitPackageCache.cc target/CommitPackageCacheImpl.cc target/CommitPackageCacheReadAhead.cc target/TargetCallbackReceiver.cc target/TargetException.cc target/TargetImpl.cc target/TargetImpl.commitFindFileConflicts.cc ) SET( zypp_target_HEADERS target/RpmPostTransCollector.h target/RequestedLocalesFile.h target/SolvIdentFile.h target/HardLocksFile.h target/CommitPackageCache.h target/CommitPackageCacheImpl.h target/CommitPackageCacheReadAhead.h target/TargetCallbackReceiver.h target/TargetException.h target/TargetImpl.h ) SET( zypp_target_detail_HEADERS target/private/commitpackagepreloader_p.h ) INSTALL( FILES ${zypp_target_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/target ) SET( zypp_target_modalias_SRCS target/modalias/Modalias.cc ) SET( zypp_target_modalias_HEADERS target/modalias/Modalias.h ) INSTALL( FILES ${zypp_target_modalias_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/target/modalias ) SET( zypp_target_rpm_SRCS target/rpm/BinHeader.cc target/rpm/RpmCallbacks.cc target/rpm/RpmDb.cc target/rpm/RpmException.cc target/rpm/RpmHeader.cc target/rpm/librpmDb.cc ) SET( zypp_target_rpm_HEADERS target/rpm/BinHeader.h target/rpm/RpmCallbacks.h target/rpm/RpmFlags.h target/rpm/RpmDb.h target/rpm/RpmException.h target/rpm/RpmHeader.h target/rpm/librpm.h target/rpm/librpmDb.h ) INSTALL( FILES ${zypp_target_rpm_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/target/rpm ) SET( zypp_ui_SRCS ui/Selectable.cc ui/SelectableImpl.cc ui/Status.cc ui/UserWantedPackages.cc ) SET( zypp_ui_HEADERS ui/SelFilters.h ui/Selectable.h ui/SelectableImpl.h ui/SelectableTraits.h ui/Status.h ui/UserWantedPackages.h ) INSTALL( FILES ${zypp_ui_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/ui ) INSTALL( FILES ${zypp_url_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/url ) SET( zypp_zypp_detail_SRCS zypp_detail/ZYppImpl.cc ) SET( zypp_zypp_detail_HEADERS zypp_detail/keyring_p.h zypp_detail/urlcredentialextractor_p.h zypp_detail/ZYppImpl.h zypp_detail/ZYppReadOnlyHack.h ) INSTALL( FILES ${zypp_zypp_detail_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/zypp_detail ) SET( zypp_repo_SRCS repo/RepoException.cc repo/RepoMirrorList.cc repo/RepoType.cc repo/ServiceType.cc repo/PackageProvider.cc repo/SrcPackageProvider.cc repo/RepoProvideFile.cc repo/DeltaCandidates.cc repo/Applydeltarpm.cc repo/PackageDelta.cc repo/SUSEMediaVerifier.cc repo/MediaInfoDownloader.cc repo/RepoVariables.cc repo/RepoInfoBase.cc repo/PluginRepoverification.cc repo/PluginServices.cc ) SET( zypp_repo_HEADERS repo/RepoException.h repo/RepoMirrorList.h repo/RepoType.h repo/ServiceType.h repo/PackageProvider.h repo/SrcPackageProvider.h repo/RepoProvideFile.h repo/DeltaCandidates.h repo/Applydeltarpm.h repo/PackageDelta.h repo/SUSEMediaVerifier.h repo/MediaInfoDownloader.h repo/RepoVariables.h repo/RepoInfoBase.h repo/PluginRepoverification.h repo/PluginServices.h ) INSTALL( FILES ${zypp_repo_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/repo ) SET( zypp_repo_yum_SRCS repo/yum/RepomdFileCollector.cc ) SET( zypp_repo_yum_HEADERS repo/yum/RepomdFileCollector.h ) SET( zypp_repo_susetags_SRCS ) SET( zypp_repo_susetags_HEADERS ) #################################################################### SET( zypp_misc_HEADERS Misc.h misc/DefaultLoadSystem.h misc/CheckAccessDeleted.h misc/TestcaseSetup.h misc/LoadTestcase.h ) SET( zypp_misc_SRCS misc/DefaultLoadSystem.cc misc/CheckAccessDeleted.cc misc/TestcaseSetup.cc misc/LoadTestcase.cc ) INSTALL( FILES ${zypp_misc_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/misc ) #################################################################### SET ( zypp_core_compat_HEADERS ByteCount.h Url.h Globals.h ExternalProgram.h Date.h AutoDispose.h TriBool.h Pathname.h ByteArray.h ProgressData.h ) INSTALL( FILES ${zypp_core_compat_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp ) SET ( zypp_core_base_compat_HEADERS base/Xml.h base/Function.h base/Flags.h base/StringV.h base/Iterator.h base/NonCopyable.h base/Exception.h base/Unit.h base/String.h base/Regex.h base/IOTools.h base/IOStream.h base/Gettext.h base/EnumClass.h base/Logger.h base/Easy.h base/ProfilingFormater.h base/ExternalDataSource.h base/LogTools.h base/LogControl.h base/Hash.h base/PtrTypes.h base/Errno.h base/Iterable.h base/DefaultIntegral.h base/DtorReset.h base/GzStream.h base/InputStream.h base/ProvideNumericId.h base/SimpleStreambuf.h base/Sysconfig.h base/UserRequestException.h base/WatchFile.h base/fXstream.h ) IF (ENABLE_ZCHUNK_COMPRESSION) list( APPEND zypp_core_base_compat_HEADERS base/ZckStream.h ) ENDIF(ENABLE_ZCHUNK_COMPRESSION) INSTALL( FILES ${zypp_core_base_compat_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/base ) SET ( zypp_core_url_compat_HEADERS url/UrlException.h url/UrlUtils.h url/UrlBase.h ) INSTALL( FILES ${zypp_core_url_compat_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/url ) SET ( zypp_media_compat_HEADERS media/CredentialFileReader.h media/CredentialManager.h media/MediaBlockList.h media/MediaUserAuth.h media/MetaLinkParser.h media/ProxyInfo.h media/TransferSettings.h media/Mount.h media/CurlConfig.h ) INSTALL( FILES ${zypp_media_compat_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/media ) SET ( zypp_core_parser_xml_compat_HEADERS parser/xml/XmlEscape.h ) INSTALL( FILES ${zypp_core_parser_xml_compat_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/parser/xml ) SET ( zypp_core_parser_compat_HEADERS parser/IniDict.h parser/IniParser.h parser/ParseException.h ) INSTALL( FILES ${zypp_core_parser_compat_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/parser ) IF ( LIBPROXY_FOUND ) SET(zypp_media_proxyinfo_libproxy_HEADERS media/proxyinfo/ProxyInfoLibproxy.h) ENDIF( LIBPROXY_FOUND ) SET( zypp_media_compat_proxyinfo_HEADERS media/proxyinfo/ProxyInfoImpl.h media/proxyinfo/ProxyInfoSysconfig.h ${zypp_media_proxyinfo_libproxy_HEADERS} media/proxyinfo/ProxyInfos.h ) INSTALL( FILES ${zypp_media_compat_proxyinfo_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}/zypp/media/proxyinfo ) SET( zypp_lib_SRCS ${zypp_misc_SRCS} ${zypp_pool_SRCS} ${zypp_parser_susetags_SRCS} ${zypp_parser_xml_SRCS} ${zypp_parser_yum_SRCS} ${zypp_parser_SRCS} ${zypp_media_proxyinfo_SRCS} ${zypp_media_SRCS} ${zypp_ng_SRCS} ${zypp_url_SRCS} ${zypp_repo_SRCS} ${zypp_repo_yum_SRCS} ${zypp_repo_susetags_SRCS} ${zypp_repo_data_SRCS} ${zypp_target_rpm_SRCS} ${zypp_target_hal_SRCS} ${zypp_target_modalias_SRCS} ${zypp_target_SRCS} ${zypp_solver_detail_SRCS} ${zypp_ui_SRCS} ${zypp_SRCS} ${zypp_zypp_detail_SRCS} ${zypp_sat_SRCS} ${zypp_sat_detail_SRCS} ${zypp_EARLY_SRCS} ${zypp_base_SRCS} ) SET( zypp_lib_HEADERS ${zypp_target_rpm_HEADERS} ${zypp_parser_tagfile_HEADERS} ${zypp_parser_susetags_HEADERS} ${zypp_parser_yum_HEADERS} ${zypp_parser_xml_HEADERS} ${zypp_parser_HEADERS} ${zypp_ui_HEADERS} ${zypp_media_HEADERS} ${zypp_media_detail_HEADERS} ${zypp_media_compat_proxyinfo_HEADERS} ${zypp_ng_HEADERS} ${zypp_ng_private_HEADERS} ${zypp_base_HEADERS} ${zypp_solver_HEADERS} ${zypp_solver_detail_HEADERS} ${zypp_sat_HEADERS} ${zypp_sat_detail_HEADERS} ${zypp_url_HEADERS} ${zypp_HEADERS} ${zypp_zypp_detail_HEADERS} ${zypp_repo_HEADERS} ${zypp_source_susetags_HEADERS} ${zypp_target_modalias_HEADERS} ${zypp_target_HEADERS} ${zypp_target_detail_HEADERS} ${zypp_pool_HEADERS} ${zypp_misc_HEADERS} ${zypp_core_compat_HEADERS} ${zypp_core_base_compat_HEADERS} ${zypp_core_url_compat_HEADERS} ${zypp_core_parser_compat_HEADERS} ${zypp_media_compat_HEADERS} ) # Default loggroup for all files SET_LOGGROUP( "zypp" ${zypp_lib_SRCS} ) # override some defaults SET_LOGGROUP( "libsolv" ${zypp_sat_SRCS} ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) message(NOTICE "Enabling static analysis: ${ZYPP_CXX_CLANG_TIDY} ${ZYPP_CXX_CPPCHECK}") set_source_files_properties( target/TargetImpl.cc PROPERTIES SKIP_LINTING ON ) if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) # due to limitations in cmake object libraries feature( object files are not derived transiently, they are only added to the target if they are added DIRECTLY) # we have this function that adds all zypp objects to a specified target. function(add_zypp_lib target shared_or_static ) set ( _link_mode PRIVATE ) if ( ${shared_or_static} STREQUAL STATIC ) message(NOTICE "Building ${target} static") set ( _link_mode INTERFACE ) else() message(NOTICE "Building ${target} shared") endif() ADD_LIBRARY( ${target} ${shared_or_static} ) SET_TARGET_PROPERTIES ( ${target} PROPERTIES VERSION "${LIBZYPP_VERSION_INFO}" ) SET_TARGET_PROPERTIES ( ${target} PROPERTIES SOVERSION "${LIBZYPP_SOVERSION_INFO}" ) target_link_libraries( ${target} PRIVATE zypp_lib_compiler_flags ) TARGET_LINK_LIBRARIES( ${target} PRIVATE zypp-objlib ) target_link_libraries( ${target} PRIVATE commit-proto-obj ) # CAUTION, link those libs always first and always in that order, # otherwise you get symbol lookup errors when linking against libzypp TARGET_LINK_LIBRARIES( ${target} ${_link_mode} zypp-common ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} zypp-curl ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} zypp-media ) # CAUTION, link zypp-tui.a at last, to prevent undefined references # in case tui functions are used in libzypp. TARGET_LINK_LIBRARIES( ${target} ${_link_mode} zypp-tui ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} zypp-core ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} ${LibSolv_LIBRARIES} ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} ${RPM_LIBRARY} ${RPMIO_LIBRARY} ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} ${GETTEXT_LIBRARIES} ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} ${Boost_THREAD_LIBRARY}) target_link_libraries( ${target} ${_link_mode} ${YAML_CPP_LIBRARIES}) IF ( UDEV_FOUND ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} ${UDEV_LIBRARY} ) ELSE ( UDEV_FOUND ) IF ( HAL_FOUND ) TARGET_LINK_LIBRARIES( ${target} ${_link_mode} ${HAL_LIBRARY} ${HAL_STORAGE_LIBRARY} ${DBUS_LIBRARY} ) ENDIF ( HAL_FOUND ) ENDIF ( UDEV_FOUND ) endfunction() ADD_LIBRARY( zypp-objlib OBJECT ${zypp_lib_SRCS} ${zypp_lib_HEADERS} ) target_link_libraries( zypp-objlib PRIVATE zypp_lib_compiler_flags ) target_include_directories( zypp-objlib PUBLIC ${RPM_INCLUDE_DIR}) # fix includes not relative to rpm target_include_directories( zypp-objlib PUBLIC ${RPM_INCLUDE_DIR}/rpm) # rpm verify function and callback states were introduced in rpm-4.15 if( RPM_LIB_VER VERSION_GREATER_EQUAL "4.15.0" AND RPM_LIB_VER VERSION_LESS "5.0.0") target_compile_definitions( zypp-objlib PUBLIC HAVE_RPM_VERIFY_TRANSACTION_STEP ) endif() if( RPM_LIB_VER VERSION_GREATER_EQUAL "5.0.0" ) MESSAGE( STATUS "rpm found: enable rpm-4 compat interface." ) target_compile_definitions( zypp-objlib PUBLIC _RPM_5) endif () add_zypp_lib( zypp SHARED ) set_target_properties ( zypp PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libzypp.map" ) INSTALL(TARGETS zypp LIBRARY DESTINATION ${LIB_INSTALL_DIR} ) # library with more symbols for tests etc add_zypp_lib( zypp-allsym STATIC ) #this part does nothing yet, only when switching away from using a map file to #a approach where symbols are exported explicitly it would make a difference #ZYPPNG symbols need to be added to the map file to be exported IF( EXPORT_NG_API ) ADD_DEFINITIONS(-DEXPORT_EXPERIMENTAL_API) INCLUDE(GenerateExportHeader) message("Exporting experimental libzypp-ng API") GENERATE_EXPORT_HEADER( zypp BASE_NAME zypp-ng PREFIX_NAME LIB ) ENDIF ( EXPORT_NG_API ) # install XML schemas FILE( GLOB YUM_SCHEMA_FILES ${LIBZYPP_SOURCE_DIR}/zypp/parser/yum/schema/*.rng ) INSTALL(FILES ${YUM_SCHEMA_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/zypp/schema/yum" ) ADD_CUSTOM_TARGET ( buildmon COMMAND test ! -x ./buildmon || ./buildmon ) ADD_CUSTOM_COMMAND ( TARGET zypp POST_BUILD COMMAND test ! -x ./buildmon || ./buildmon ) libzypp-17.36.5/zypp/Callback.h000066400000000000000000000235651476576476200163000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Callback.h * */ #ifndef ZYPP_CALLBACK_H #define ZYPP_CALLBACK_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** \todo Eliminate this! */ namespace HACK { class Callback { }; } // namespace HACK /////////////////////////////////////////////////////////////////// /** Callbacks light. * * \par The task report structure (SENDER SIDE). * * A default constructible struct derived from callback::ReportBase. * It \b must \b not contain any data, just virtual methods. * * These are the functions the sender invokes, and which will be forwarded * to some receiver. If no receiver is present, the defined default * implementations are invoked. * * For methods returning non-void, define a reasonable return value, * because this is what you get back in case no receiver is listening. * * This way, the sending side does not need to know whether some receiver * is listening, and it enables the receiver to return a reasonable value * in case it has got no idea what else to return. * * \code * struct Foo : public callback::ReportBase * { * virtual void ping( int i ) * {} * virtual int pong() * { return -1; } * * }; * \endcode * * \par Sending a Task report (SENDER SIDE). * * Simply create a callback::SendReport, where TReport * is your task report structure. Invoke the callback functions * as needed. That's it. * * \note Even creation and destruction of a callback::SendReport * are indicated to a receiver. So even in case of an Exception, * the receiver is able to recognize, that the task ended. * So don't create it without need. * * \code * { * callback::SendReport report; * report->ping( 13 ); * int response = report->pong(); * } * \endcode * * \par Receiving Task reports (RECEIVER SIDE). * * To receive task reports of type \c Foo the recipient class * derives from callback::ReceiveReport\. callback::ReceiveReport * inherits \c Foo and provides two additional virtual methods: * * \code * virtual void reportbegin() {} * virtual void reportend() {} * \endcode * * These two are automatically invoked, whenever the sender * creates a callback::SendReport instance, and when it gets * destructed. So even if the sending task is aborted without * sending an explicit notification, the reciever may notice it, * by overloading \c reportend. * * Overload the methods you're interested in. * * \note In case you must return some value and don't know which, * return the task structures default. The author of the task * structure had to provide this value, so it's probably better * than anything you \e invent. * \code * int somefunction() * { * ...// don't know what to return? * return Foo::somefunction(); * } * \endcode * * \par Connecting the Receiver * * For this callback::ReceiveReport provides 4 methods: * \code * void connect(); * void disconnect(); * bool connected() const; * ReceiveReport * whoIsConnected() const; * \endcode * * \li \c connect Connect this ReceiveReport (in case some other * ReceiveReport is connected, it get disconnected. Remember it is * a Callback light). * \li \c disconnect Disconnect this ReceiveReport in case it is * connected. If not connected, nothing happens. * \li \c connected Test whether this ReceiveReport is currently * connected. * \li \c whoIsConnected Return a 'ReceiveReport*' to the currently * connected ReceiveReport, or \c NULL if none is connected. * * \par Passing Userdata via Callbacks * * For typesafe passing of user data via callbacks, \see \ref UserData. * * ReportBase provides a generic \ref callback::ReportBase:report method * which can be used to communicate by encoding everything in its \a UserData * argument. * * Convenient sending can be achieved by installing non-virtual methods * in the TReport class, which encode the arguments in UserData and send * them via ReportBase::report(). * * Convenient receiving can be achieved by installing virtual methods in * the TReport class, which can be simply overloaded by the receiver. Downside * of this is that adding virtual methods breaks binary compatibility. */ namespace callback { ///////////////////////////////////////////////////////////////// /** */ struct ZYPP_API ReportBase { typedef callback::UserData UserData; typedef UserData::ContentType ContentType; /** The most generic way of sending/receiving data. */ virtual void report( const UserData & userData_r = UserData() ) {} virtual ~ReportBase() {} }; /** */ template struct DistributeReport; /** */ template struct ZYPP_API ReceiveReport : public TReport { typedef TReport ReportType; typedef ReceiveReport Receiver; typedef DistributeReport Distributor; virtual ~ReceiveReport() { disconnect(); } ReceiveReport * whoIsConnected() const { return Distributor::instance().getReceiver(); } bool connected() const { return whoIsConnected() == this; } void connect() { Distributor::instance().setReceiver( *this ); } void disconnect() { Distributor::instance().unsetReceiver( *this ); } virtual void reportbegin() {} virtual void reportend() {} }; /** */ template struct ZYPP_API DistributeReport { public: typedef TReport ReportType; typedef ReceiveReport Receiver; typedef DistributeReport Distributor; static DistributeReport & instance() { static DistributeReport _self; return _self; } Receiver * getReceiver() const { return _receiver == &_noReceiver ? 0 : _receiver; } void setReceiver( Receiver & rec_r ) { _receiver = &rec_r; } void unsetReceiver( Receiver & rec_r ) { if ( _receiver == &rec_r ) noReceiver(); } void noReceiver() { _receiver = &_noReceiver; } public: Receiver * operator->() { return _receiver; } private: DistributeReport() : _receiver( &_noReceiver ) {} Receiver _noReceiver; Receiver * _receiver; }; /** */ template struct ZYPP_API SendReport : private zypp::base::NonCopyable { typedef TReport ReportType; typedef ReceiveReport Receiver; typedef DistributeReport Distributor; SendReport() { Distributor::instance()->reportbegin(); } ~SendReport() { Distributor::instance()->reportend(); } static Receiver * whoIsConnected() { return Distributor::instance().getReceiver(); } static bool connected() { return whoIsConnected(); } Distributor & operator->() { return Distributor::instance(); } }; /** Temporarily connect a ReceiveReport then restore the previous one. * * Pass the ReceiveReport you want to connect temporarily * to the ctor. The ReceiveReport is connected, a previously * connected ReceiveReport is remembered and re-connected in * the dtor. * Use the default ctpr to temporarily disconnect any connected report. * \code * struct FooReceive : public callback::ReceiveReport * {..}; * struct FooReceive2 : public callback::ReceiveReport * {..}; * * FooReceive r; * FooReceive2 r2; * * r.connect(); * ... // r receiving the report * { * callback::TempConnect temp( r2 ); * ...// r2 receiving the report * } * ...// r receiving the report * \endcode */ template struct ZYPP_API TempConnect { typedef TReport ReportType; typedef ReceiveReport Receiver; typedef DistributeReport Distributor; TempConnect() : _oldRec( Distributor::instance().getReceiver() ) { Distributor::instance().noReceiver(); } TempConnect( Receiver & rec_r ) : _oldRec( Distributor::instance().getReceiver() ) { rec_r.connect(); } ~TempConnect() { if ( _oldRec ) Distributor::instance().setReceiver( *_oldRec ); else Distributor::instance().noReceiver(); } private: Receiver * _oldRec; }; ///////////////////////////////////////////////////////////////// } // namespace callback /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CALLBACK_H libzypp-17.36.5/zypp/CapMatch.cc000066400000000000000000000027721476576476200164170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CapMatch.cc * */ #include //#include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// const CapMatch CapMatch::yes( true ); const CapMatch CapMatch::no( false ); const CapMatch CapMatch::irrelevant; /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const CapMatch & obj ) { if ( obj._result == CapMatch::IRRELEVANT ) return str << "IRRELEVANT"; return str << ( obj._result == CapMatch::MATCH ? "MATCH" : "NOMATCH" ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/CapMatch.h000066400000000000000000000063571476576476200162640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CapMatch.h * */ #ifndef ZYPP_CAPMATCH_H #define ZYPP_CAPMATCH_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : CapMatch // /** Tri state Capability match result. * * CapMatch::irrelevant denotes a result value that should be ignored. * Therfore it behaves neutral when used in ! && || expressions. * * \code * CapMatch any * (CapMatch::irrelevant && any) == any // true * (CapMatch::irrelevant || any) == any // true * ( !CapMatch::irrelevant ) == CapMatch::irrelevant // true * \endcode */ class ZYPP_API CapMatch { enum Result { NOMATCH, MATCH, IRRELEVANT }; public: CapMatch() : _result( IRRELEVANT ) {} CapMatch( bool val_r ) : _result( val_r ? MATCH : NOMATCH ) {} static const CapMatch yes; static const CapMatch no; static const CapMatch irrelevant; friend bool operator==( const CapMatch & lhs, const CapMatch & rhs ) { return lhs._result == rhs._result; } friend bool operator!=( const CapMatch & lhs, const CapMatch & rhs ) { return lhs._result != rhs._result; } friend CapMatch operator!( const CapMatch & lhs ) { if ( lhs._result == CapMatch::IRRELEVANT ) return lhs; return !(lhs._result == CapMatch::MATCH); } friend CapMatch operator&&( const CapMatch & lhs, const CapMatch & rhs ) { if ( lhs._result == CapMatch::IRRELEVANT ) return rhs; if ( rhs._result == CapMatch::IRRELEVANT ) return lhs; return (lhs._result == CapMatch::MATCH) && (rhs._result == CapMatch::MATCH); } friend CapMatch operator||( const CapMatch & lhs, const CapMatch & rhs ) { if ( lhs._result == CapMatch::IRRELEVANT ) return rhs; if ( rhs._result == CapMatch::IRRELEVANT ) return lhs; return (lhs._result == CapMatch::MATCH) || (rhs._result == CapMatch::MATCH); } friend std::ostream & operator<<( std::ostream & str, const CapMatch & obj ); private: Result _result; }; /////////////////////////////////////////////////////////////////// /** \relates CapMatch Stream output */ std::ostream & operator<<( std::ostream & str, const CapMatch & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CAPMATCH_H libzypp-17.36.5/zypp/Capabilities.cc000066400000000000000000000040621476576476200173220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Capabilities.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// Capabilities:: Capabilities( const sat::detail::IdType * base_r, sat::detail::IdType skip_r ) : _begin( base_r ) { if ( ! _begin ) return; if ( skip_r ) { for ( const sat::detail::IdType * end = _begin; *end; ++end ) { if ( *end == skip_r ) { _begin = end+1; return; } } } // skipp all ==> empty _begin = 0; } Capabilities::size_type Capabilities::size() const { if ( ! _begin ) return 0; // jump over libsolvs internal ids. Capabilities::size_type ret = 0; for ( const sat::detail::IdType * end = _begin; *end; ++end ) { if ( ! sat::detail::isDepMarkerId( *end ) ) ++ret; } return ret; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const Capabilities & obj ) { return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Capabilities.h000066400000000000000000000141371476576476200171700ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Capabilities.h * */ #ifndef ZYPP_SAT_CAPABILITIES_H #define ZYPP_SAT_CAPABILITIES_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Capabilities // /** Container of \ref Capability (currently read only). * * \note libsolv dependency lists may include internal ids * which must be skipped on iteration or size calculation * (\see \ref detail::isDepMarkerId). */ class ZYPP_API Capabilities { public: typedef Capability value_type; typedef unsigned size_type; enum Mode { SKIP_TO_INTERNAL }; public: /** Default ctor */ Capabilities() : _begin( 0 ) {} /** Ctor from Id pointer (friend \ref Solvable). */ explicit Capabilities( const sat::detail::IdType * base_r ) : _begin( base_r ) {} /** Ctor from Id pointer (friend \ref Solvable). * Jump behind skip_r (e.g. behind prereqMarker). */ Capabilities( const sat::detail::IdType * base_r, sat::detail::IdType skip_r ); public: /** Whether the container is empty. */ bool empty() const { return ! ( _begin && *_begin ); } /** Number of capabilities inside. */ size_type size() const; public: class const_iterator; /** Iterator pointing to the first \ref Capability. */ const_iterator begin() const; /** Iterator pointing behind the last \ref Capability. */ const_iterator end() const; public: /** Return whether the set contains \a lhs (the Id)*/ bool contains( const Capability & lhs ) const; /** Return whether \a lhs matches at least one capability in set. */ bool matches( const Capability & lhs ) const; private: const sat::detail::IdType * _begin; }; /////////////////////////////////////////////////////////////////// /** \relates Capabilities Stream output */ std::ostream & operator<<( std::ostream & str, const Capabilities & obj ); /////////////////////////////////////////////////////////////////// // // CLASS NAME : Capabilities::const_iterator // /** \ref Capabilities iterator. */ class Capabilities::const_iterator : public boost::iterator_adaptor< const_iterator // Derived , const sat::detail::IdType * // Base , const Capability // Value , boost::forward_traversal_tag // CategoryOrTraversal , const Capability // Reference > { public: const_iterator() : const_iterator::iterator_adaptor_( 0 ) {} explicit const_iterator( const sat::detail::IdType * _idx ) : const_iterator::iterator_adaptor_( _idx ) { if ( base_reference() && sat::detail::isDepMarkerId( *base_reference() ) ) { _tagged = true; ++base_reference(); } } public: /** Return \c true if the \ref Capability is \c tagged. * The meaning of \c tagged depends on the kind of dependency you * are processing. It is a hint that the iteratir skipped some * internal marker, indicating that subsequent cabailities have * a special property. Within a \ref Solvables requirements e.g. * the pre-requirements are tagged. * \code * Capabilities req( solvable.requires() ); * for_( it, req.begin(), req.end() ) * { * if ( it.tagged() ) * cout << *it << " (is prereq)" << endl; * else * cout << *it << endl; * } * \endcode */ bool tagged() const { return _tagged; } private: friend class boost::iterator_core_access; reference dereference() const { return ( base() ) ? Capability( *base() ) : Capability::Null; } template bool equal( const boost::iterator_adaptor & rhs ) const { // NULL pointer is eqal pointer to Id 0 return ( base() == rhs.base() // includes both NULL... || ( !rhs.base() && !*base() ) || ( !base() && !*rhs.base() ) ); } void increment() { // jump over libsolvs internal ids. if ( sat::detail::isDepMarkerId( *(++base_reference()) ) ) { _tagged = true; ++base_reference(); } } private: DefaultIntegral _tagged; }; /////////////////////////////////////////////////////////////////// inline Capabilities::const_iterator Capabilities::begin() const { return const_iterator( _begin ); } inline Capabilities::const_iterator Capabilities::end() const { return const_iterator( 0 ); } inline bool Capabilities::contains( const Capability & lhs ) const { for ( const Capability & rhs : *this ) if ( lhs == rhs ) return true; return false; } inline bool Capabilities::matches( const Capability & lhs ) const { for ( const Capability & rhs : *this ) if ( lhs.matches( rhs ) == CapMatch::yes ) return true; return false; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_CAPABILITIES_H libzypp-17.36.5/zypp/Capability.cc000066400000000000000000000620431476576476200170150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Capability.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// /// Round Robin string buffer template struct TempStrings { /** Reference to the next (cleared) tempstring. */ std::string & getNext() { unsigned c = _next; _next = (_next+1) % TLen; _buf[c].clear(); return _buf[c]; } private: unsigned _next = 0; std::string _buf[TLen]; }; /** backward skip whitespace starting at pos_r */ inline std::string::size_type backskipWs( const std::string & str_r, std::string::size_type pos_r ) { for ( ; pos_r != std::string::npos; --pos_r ) { char ch = str_r[pos_r]; if ( ch != ' ' && ch != '\t' ) break; } return pos_r; } /** backward skip non-whitespace starting at pos_r */ inline std::string::size_type backskipNWs( const std::string & str_r, std::string::size_type pos_r ) { for ( ; pos_r != std::string::npos; --pos_r ) { char ch = str_r[pos_r]; if ( ch == ' ' || ch == '\t' ) break; } return pos_r; } /** Split any 'op edition' from str_r */ void splitOpEdition( std::string & str_r, Rel & op_r, Edition & ed_r ) { if ( str_r.empty() ) return; std::string::size_type ch( str_r.size()-1 ); // check whether the one but last word is a valid Rel: if ( (ch = backskipWs( str_r, ch )) != std::string::npos ) { std::string::size_type ee( ch ); if ( (ch = backskipNWs( str_r, ch )) != std::string::npos ) { std::string::size_type eb( ch ); if ( (ch = backskipWs( str_r, ch )) != std::string::npos ) { std::string::size_type oe( ch ); ch = backskipNWs( str_r, ch ); // now before 'op'? begin if ( op_r.parseFrom( str_r.substr( ch+1, oe-ch ) ) ) { // found a legal 'op' ed_r = Edition( str_r.substr( eb+1, ee-eb ) ); if ( ch != std::string::npos ) // 'op' is not at str_r begin, so skip WS ch = backskipWs( str_r, ch ); str_r.erase( ch+1 ); return; } } } } // HERE: Didn't find 'name op edition' // As a convenience we check for an embeded 'op' (not surounded by WS). // But just '[<=>]=?|!=' and not inside '()'. ch = str_r.find_last_of( "<=>)" ); if ( ch != std::string::npos && str_r[ch] != ')' ) { std::string::size_type oe( ch ); // do edition first: ch = str_r.find_first_not_of( " \t", oe+1 ); if ( ch != std::string::npos ) ed_r = Edition( str_r.substr( ch ) ); // now finish op: ch = oe-1; if ( str_r[oe] != '=' ) // '[<>]' { op_r = ( str_r[oe] == '<' ) ? Rel::LT : Rel::GT; } else { // '?=' if ( ch != std::string::npos ) { switch ( str_r[ch] ) { case '<': --ch; op_r = Rel::LE; break; case '>': --ch; op_r = Rel::GE; break; case '!': --ch; op_r = Rel::NE; break; case '=': --ch; // fall through default: op_r = Rel::EQ; break; } } } // finally name: if ( ch != std::string::npos ) // 'op' is not at str_r begin, so skip WS ch = backskipWs( str_r, ch ); str_r.erase( ch+1 ); return; } // HERE: It's a plain 'name' } /** Build \ref Capability from data. No parsing required. */ sat::detail::IdType relFromStr( sat::detail::CPool * pool_r, const Arch & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & kind_r ) { // First build the name, non-packages prefixed by kind sat::Solvable::SplitIdent split( kind_r, name_r ); sat::detail::IdType nid( split.ident().id() ); if ( split.kind() == ResKind::srcpackage ) { // map 'kind srcpackage' to 'arch src', the pseudo architecture // libsolv uses. nid = ::pool_rel2id( pool_r, nid, IdString(ARCH_SRC).id(), REL_ARCH, /*create*/true ); } // Extend name by architecture, if provided and not a srcpackage if ( ! arch_r.empty() && kind_r != ResKind::srcpackage ) { nid = ::pool_rel2id( pool_r, nid, arch_r.id(), REL_ARCH, /*create*/true ); } // Extend 'op edition', if provided if ( op_r != Rel::ANY && ed_r != Edition::noedition ) { nid = ::pool_rel2id( pool_r, nid, ed_r.id(), op_r.bits(), /*create*/true ); } return nid; } /** Build \ref Capability from data, just parsing name for '[.arch]' and detect * 'kind srcpackage' (will be mapped to arch \c src). */ sat::detail::IdType relFromStr( sat::detail::CPool * pool_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & kind_r ) { static const Arch srcArch( IdString(ARCH_SRC).asString() ); static const Arch nosrcArch( IdString(ARCH_NOSRC).asString() ); static const std::string srcKindPrefix( ResKind::srcpackage.asString() + ':' ); // check for an embedded 'srcpackage:foo' to be mapped to 'foo' and 'ResKind::srcpackage'. if ( kind_r.empty() && str::hasPrefix( name_r, srcKindPrefix ) ) { return relFromStr( pool_r, Arch_empty, name_r.substr( srcKindPrefix.size() ), op_r, ed_r, ResKind::srcpackage ); } Arch arch( Arch_empty ); std::string name( name_r ); std::string::size_type asep( name_r.rfind( '.' ) ); if ( asep != std::string::npos ) { Arch ext( name_r.substr( asep+1 ) ); if ( ext.isBuiltIn() || ext == srcArch || ext == nosrcArch ) { arch = ext; name.erase( asep ); } } return relFromStr( pool_r, arch, name, op_r, ed_r, kind_r ); } /** Full parse from string, unless Capability::PARSED. */ sat::detail::IdType relFromStr( sat::detail::CPool * pool_r, const Arch & arch_r, // parse from name if empty const std::string & str_r, const ResKind & kind_r, Capability::CtorFlag flag_r ) { std::string name( str_r ); Rel op; Edition ed; if ( flag_r == Capability::UNPARSED ) { splitOpEdition( name, op, ed ); } if ( arch_r.empty() ) return relFromStr( pool_r, name, op, ed, kind_r ); // parses for name[.arch] // else return relFromStr( pool_r, arch_r, name, op, ed, kind_r ); } /** Parse richdeps from string, otherwise fall back to the traditional parser. */ sat::detail::IdType richOrRelFromStr( sat::detail::CPool * pool_r, const std::string & str_r, const ResKind & prefix_r, Capability::CtorFlag flag_r ) { if ( str_r[0] == '(' ) { sat::detail::IdType res { sat::detail::PoolMember::myPool().parserpmrichdep( str_r.c_str() ) }; if ( res ) return res; // else: no richdep, so fall back to the ordinary parser which in // case of doubt turns the string into a NAMED cap. } return relFromStr( pool_r, Arch_empty, str_r, prefix_r, flag_r ); } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// const Capability Capability::Null( STRID_NULL ); const Capability Capability::Empty( STRID_EMPTY ); ///////////////////////////////////////////////////////////////// Capability::Capability( const char * str_r, const ResKind & prefix_r, CtorFlag flag_r ) : _id( richOrRelFromStr( myPool().getPool(), str_r, prefix_r, flag_r ) ) {} Capability::Capability( const std::string & str_r, const ResKind & prefix_r, CtorFlag flag_r ) : _id( richOrRelFromStr( myPool().getPool(), str_r, prefix_r, flag_r ) ) {} Capability::Capability( const Arch & arch_r, const char * str_r, const ResKind & prefix_r, CtorFlag flag_r ) : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) ) {} Capability::Capability( const Arch & arch_r, const std::string & str_r, const ResKind & prefix_r, CtorFlag flag_r ) : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) ) {} Capability::Capability( const char * str_r, CtorFlag flag_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), Arch_empty, str_r, prefix_r, flag_r ) ) {} Capability::Capability( const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), Arch_empty, str_r, prefix_r, flag_r ) ) {} Capability::Capability( const Arch & arch_r, const char * str_r, CtorFlag flag_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) ) {} Capability::Capability( const Arch & arch_r, const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), arch_r, str_r, prefix_r, flag_r ) ) {} /////////////////////////////////////////////////////////////////// // Ctor from . /////////////////////////////////////////////////////////////////// Capability::Capability( const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), name_r, Rel(op_r), Edition(ed_r), prefix_r ) ) {} Capability::Capability( const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), name_r, op_r, Edition(ed_r), prefix_r ) ) {} Capability::Capability( const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), name_r, op_r, ed_r, prefix_r ) ) {} /////////////////////////////////////////////////////////////////// // Ctor from . /////////////////////////////////////////////////////////////////// Capability::Capability( const std::string & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), Arch(arch_r), name_r, Rel(op_r), Edition(ed_r), prefix_r ) ) {} Capability::Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), Arch(arch_r), name_r, op_r, Edition(ed_r), prefix_r ) ) {} Capability::Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), Arch(arch_r), name_r, op_r, ed_r, prefix_r ) ) {} Capability::Capability( const Arch & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), arch_r, name_r, Rel(op_r), Edition(ed_r), prefix_r ) ) {} Capability::Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), arch_r, name_r, op_r, Edition(ed_r), prefix_r ) ) {} Capability::Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r ) : _id( relFromStr( myPool().getPool(), arch_r, name_r, op_r, ed_r, prefix_r ) ) {} /////////////////////////////////////////////////////////////////// // Ctor creating a namespace: capability. /////////////////////////////////////////////////////////////////// Capability::Capability( ResolverNamespace namespace_r, IdString value_r ) : _id( ::pool_rel2id( myPool().getPool(), asIdString(namespace_r).id(), (value_r.empty() ? STRID_NULL : value_r.id() ), REL_NAMESPACE, /*create*/true ) ) {} /////////////////////////////////////////////////////////////////// // https://rpm-software-management.github.io/rpm/manual/boolean_dependencies.html namespace { inline const char * opstr( int op_r ) { switch ( op_r ) { case REL_GT: return " > "; case REL_EQ: return " = "; case REL_LT: return " < "; case REL_GT|REL_EQ: return " >= "; case REL_LT|REL_EQ: return " <= "; case REL_GT|REL_LT: return " != "; case REL_GT|REL_LT|REL_EQ: return " <=> "; case REL_AND: return " and "; case REL_OR: return " or "; case REL_COND: return " if "; case REL_UNLESS: return " unless "; case REL_ELSE: return " else "; case REL_WITH: return " with "; case REL_WITHOUT: return " without "; } return "UNKNOWNCAPREL"; } inline bool isBoolOp( int op_r ) { switch ( op_r ) { case REL_AND: case REL_OR: case REL_COND: case REL_UNLESS: case REL_ELSE: case REL_WITH: case REL_WITHOUT: return true; } return false; } inline bool needsBrace( int op_r, int parop_r ) { return ( isBoolOp( parop_r ) || parop_r == 0 ) && isBoolOp( op_r ) && ( parop_r != op_r || op_r == REL_COND || op_r == REL_UNLESS || op_r == REL_ELSE ) && not ( ( parop_r == REL_COND || parop_r == REL_UNLESS ) && op_r == REL_ELSE ); } void cap2strHelper( std::string & outs_r, sat::detail::CPool * pool_r, sat::detail::IdType id_r, int parop_r ) { if ( ISRELDEP(id_r) ) { ::Reldep * rd = GETRELDEP( pool_r, id_r ); int op = rd->flags; if ( op == CapDetail::CAP_ARCH ) { if ( rd->evr == ARCH_SRC || rd->evr == ARCH_NOSRC ) { // map arch .{src,nosrc} to kind srcpackage outs_r += ResKind::srcpackage.c_str(); outs_r += ":"; outs_r += IdString(rd->name).c_str(); return; } cap2strHelper( outs_r, pool_r, rd->name, op ); outs_r += "."; cap2strHelper( outs_r, pool_r, rd->evr, op ); return; } if ( op == CapDetail::CAP_NAMESPACE ) { cap2strHelper( outs_r, pool_r, rd->name, op ); outs_r += "("; cap2strHelper( outs_r, pool_r, rd->evr, op ); outs_r += ")"; return; } if ( op == REL_FILECONFLICT ) { cap2strHelper( outs_r, pool_r, rd->name, op ); return; } if ( needsBrace( op, parop_r ) ) { outs_r += "("; cap2strHelper( outs_r, pool_r, rd->name, op ); outs_r += opstr( op ); cap2strHelper( outs_r, pool_r, rd->evr, op ); outs_r += ")"; return; } cap2strHelper( outs_r, pool_r, rd->name, op ); outs_r += opstr( op ); cap2strHelper( outs_r, pool_r, rd->evr, op ); } else outs_r += IdString(id_r).c_str(); } } // namespace /////////////////////////////////////////////////////////////////// const char * Capability::c_str() const { if ( not id() ) return ""; if ( not ISRELDEP(id()) ) return IdString(id()).c_str(); static TempStrings<5> tempstrs; // Round Robin buffer to prolong the lifetime of the returned char* std::string & outs { tempstrs.getNext() }; cap2strHelper( outs, myPool().getPool(), id(), 0 ); return outs.c_str(); } CapMatch Capability::_doMatch( sat::detail::IdType lhs, sat::detail::IdType rhs ) { if ( lhs == rhs ) return CapMatch::yes; CapDetail l( lhs ); CapDetail r( rhs ); switch ( l.kind() ) { case CapDetail::NOCAP: return( r.kind() == CapDetail::NOCAP ); // NOCAP matches NOCAP only break; case CapDetail::EXPRESSION: return CapMatch::irrelevant; break; case CapDetail::NAMED: case CapDetail::VERSIONED: break; } switch ( r.kind() ) { case CapDetail::NOCAP: return CapMatch::no; // match case handled above break; case CapDetail::EXPRESSION: return CapMatch::irrelevant; break; case CapDetail::NAMED: case CapDetail::VERSIONED: break; } // comparing two simple caps: if ( l.name() != r.name() ) return CapMatch::no; // if both are arch restricted they must match if ( l.arch() != r.arch() && ! ( l.arch().empty() || r.arch().empty() ) ) return CapMatch::no; // isNamed matches ANY edition: if ( l.isNamed() || r.isNamed() ) return CapMatch::yes; // both are versioned: return overlaps( Edition::MatchRange( l.op(), l.ed() ), Edition::MatchRange( r.op(), r.ed() ) ); } bool Capability::isInterestingFileSpec( const char * name_r ) { static str::smatch what; static const str::regex filenameRegex( "/(s?bin|lib(64)?|etc)/|^/usr/(games/|share/(dict/words|magic\\.mime)$)|^/opt/gnome/games/", str::regex::nosubs ); return str::regex_match( name_r, what, filenameRegex ); } Capability Capability::guessPackageSpec( const std::string & str_r, bool & rewrote_r ) { Capability cap( str_r ); CapDetail detail( cap.detail() ); // str_r might be the form "libzypp-1.2.3-4.5(.arch)' // correctly parsed as name capability by the ctor. // TODO: Think about allowing glob char in name - for now don't process if ( detail.isNamed() && !::strpbrk( detail.name().c_str(), "*?[{" ) && ::strrchr( detail.name().c_str(), '-' ) && sat::WhatProvides( cap ).empty() ) { Arch origArch( detail.arch() ); // to support a trailing .arch std::string guess( detail.name().asString() ); std::string::size_type pos( guess.rfind( '-' ) ); guess[pos] = '='; Capability guesscap( origArch, guess ); detail = guesscap.detail(); ResPool pool( ResPool::instance() ); // require name part matching a pool items name (not just provides!) if ( pool.byIdentBegin( detail.name() ) != pool.byIdentEnd( detail.name() ) ) { rewrote_r = true; return guesscap; } // try the one but last '-' if ( pos ) { guess[pos] = '-'; if ( (pos = guess.rfind( '-', pos-1 )) != std::string::npos ) { guess[pos] = '='; guesscap = Capability( origArch, guess ); detail = guesscap.detail(); // require name part matching a pool items name (not just provides!) if ( pool.byIdentBegin( detail.name() ) != pool.byIdentEnd( detail.name() ) ) { rewrote_r = true; return guesscap; } } } } rewrote_r = false; return cap; } Capability Capability::guessPackageSpec( const std::string & str_r ) { bool dummy = false; return guessPackageSpec( str_r, dummy ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const Capability & obj ) { return str << obj.c_str(); } std::ostream & dumpOn( std::ostream & str, const Capability & obj ) { return str << ( obj ? ::pool_dep2str( sat::Pool::instance().get(), obj.id() ) : "" ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : CapDetail // /////////////////////////////////////////////////////////////////// void CapDetail::_init() { // : _kind( NOCAP ), _lhs( id_r ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 ) if ( _lhs == sat::detail::emptyId || _lhs == sat::detail::noId ) return; // NOCAP if ( ! ISRELDEP(_lhs) ) { // this is name without arch! _kind = NAMED; return; } ::Reldep * rd = GETRELDEP( myPool().getPool(), _lhs ); _lhs = rd->name; _rhs = rd->evr; _flag = rd->flags; if ( Rel::isRel( _flag ) ) { _kind = VERSIONED; // Check for name.arch... if ( ! ISRELDEP(_lhs) ) return; // this is name without arch! rd = GETRELDEP( myPool().getPool(), _lhs ); if ( rd->flags != CAP_ARCH ) return; // this is not name.arch // This is name.arch: _lhs = rd->name; _archIfSimple = rd->evr; } else if ( rd->flags == CAP_ARCH ) { _kind = NAMED; // This is name.arch: _lhs = rd->name; _archIfSimple = rd->evr; } else { _kind = EXPRESSION; return; } // map back libsolvs pseudo arch 'src' to kind srcpackage if ( _archIfSimple == ARCH_SRC || _archIfSimple == ARCH_NOSRC ) { _lhs = IdString( (ResKind::srcpackage.asString() + ":" + IdString(_lhs).c_str()).c_str() ).id(); _archIfSimple = 0; } } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const CapDetail & obj ) { static const char archsep = '.'; switch ( obj.kind() ) { case CapDetail::NOCAP: return str << ""; break; case CapDetail::NAMED: str << obj.name(); if ( obj.hasArch() ) str << archsep << obj.arch(); return str; break; case CapDetail::VERSIONED: str << obj.name(); if ( obj.hasArch() ) str << archsep << obj.arch(); return str << " " << obj.op() << " " << obj.ed(); break; case CapDetail::EXPRESSION: { std::string outs; auto pool = sat::Pool::instance().get(); auto op = obj.capRel(); if ( obj.capRel() == CapDetail::CAP_NAMESPACE ) { cap2strHelper( outs, pool, obj.lhs().id(), op ); outs += "("; cap2strHelper( outs, pool, obj.rhs().id(), op ); outs += ")"; } else { outs += "("; cap2strHelper( outs, pool, obj.lhs().id(), op ); outs += opstr( op ); cap2strHelper( outs, pool, obj.rhs().id(), op ); outs += ")"; } return str << outs; } break; } return str << ""; } std::ostream & operator<<( std::ostream & str, CapDetail::Kind obj ) { switch ( obj ) { case CapDetail::NOCAP: return str << "NoCap"; break; case CapDetail::NAMED: return str << "NamedCap"; break; case CapDetail::VERSIONED: return str << "VersionedCap"; break; case CapDetail::EXPRESSION: return str << "CapExpression"; break; } return str << "UnknownCap"; } std::ostream & operator<<( std::ostream & str, CapDetail::CapRel obj ) { switch ( obj ) { case CapDetail::REL_NONE: return str << "NoCapRel"; break; case CapDetail::CAP_AND: return str << "and"; break; // & case CapDetail::CAP_OR: return str << "or"; break; // | case CapDetail::CAP_COND: return str << "if"; break; case CapDetail::CAP_UNLESS: return str << "unless"; break; case CapDetail::CAP_ELSE: return str << "else"; break; case CapDetail::CAP_WITH: return str << "with"; break; // + case CapDetail::CAP_WITHOUT: return str << "without"; break; // - case CapDetail::CAP_NAMESPACE: return str << "NAMESPACE"; break; case CapDetail::CAP_ARCH: return str << "ARCH"; break; } return str << "UnknownCapRel("+str::numstring(obj)+")"; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Capability.h000066400000000000000000000441731476576476200166630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Capability.h * */ #ifndef ZYPP_CAPABILITY_H #define ZYPP_CAPABILITY_H #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class Capability; class CapDetail; class Arch; using CapabilitySet = std::unordered_set; /////////////////////////////////////////////////////////////////// // // CLASS NAME : Capability // /** A sat capability. * * A Capability: "name[.arch] [op edition]" or a \c richdep[1] * * If a certain \ref ResKind is specified upon construction, the * capabilities name part is prefixed, unless it already contains a * well known kind spec. If no \ref ResKind is specified, it's assumed * you refer to a package or the name is already prefixed: * \code * Capability( "foo" ) ==> 'foo' * Capability( "foo", ResKind::package ) ==> 'foo' * Capability( "foo", ResKind::pattern ) ==> 'pattern:foo' * Capability( "pattern:foo" ) ==> 'pattern:foo' * // in doubt an explicit name prefix wins: * Capability( "pattern:foo", ResKind::package ) ==> 'pattern:foo' * Capability( "package:foo", ResKind::pattern ) ==> 'foo' * \endcode * * [1] https://rpm-software-management.github.io/rpm/manual/boolean_dependencies.html * \see \ref CapDetail */ class ZYPP_API Capability: protected sat::detail::PoolMember { public: enum CtorFlag { PARSED, UNPARSED }; public: /** Default ctor, \ref Empty capability. */ Capability() : _id( sat::detail::emptyId ) {} /** Ctor from id. */ explicit Capability( sat::detail::IdType id_r ) : _id( id_r ) {} /** \name Ctors parsing a Capability: "name[.arch] [op edition]" or ( arch, "name [op edition]") */ //@{ /** Ctor from string. * \a str_r is parsed to see if it forms a richdep. Subsequent arguments are meaningless * in that case. If it's no richdep we continue as described below. * * \a str_r is parsed to check whether it contains an [op edition] part, * unless the \ref PARSED flag is passed to the ctor. In that case "name[.arch]" * is assumed. * * \ref Capability legacy is to parse everything unknown into a \ref NAMED * cap. This is often used to turn user supplied search strings with an optional * edition range restriction into \ref PoolQuery arguments ('/gcc[0-9]+/ >= 8'). */ explicit Capability( const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED ); /** \overload */ explicit Capability( const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED ); /** \overload Explicitly specify the \c arch. */ Capability( const Arch & arch_r, const char * str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED ); /** \overload Explicitly specify the \c arch. */ Capability( const Arch & arch_r, const std::string & str_r, const ResKind & prefix_r = ResKind(), CtorFlag flag_r = UNPARSED ); /** \overload Convenience for parsed (name only, no "[op edition]) packages: Capability( "glibc", PARSED ); */ Capability( const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() ); /** \overload Explicitly specify the \c arch. */ Capability( const Arch & arch_r, const char * str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const Arch & arch_r, const std::string & str_r, CtorFlag flag_r, const ResKind & prefix_r = ResKind() ); //@} /** \name Ctors parsing a broken down Capability: ( "name[.arch]", op, edition ) */ //@{ /** Ctor from name[.arch] op edition. */ Capability( const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() ); //@} /** \name Ctors taking a broken down Capability: ( arch, name, op, edition ) */ //@{ /** Ctor from arch name op edition. */ Capability( const std::string & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const std::string & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const Arch & arch_r, const std::string & name_r, const std::string & op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const std::string & ed_r, const ResKind & prefix_r = ResKind() ); /** \overload */ Capability( const Arch & arch_r, const std::string & name_r, Rel op_r, const Edition & ed_r, const ResKind & prefix_r = ResKind() ); //@} /** \name Ctor creating a namespace: capability. * An empty \a value_r (std::string or IdString) will also be mapped to IdString::Null, * creating a namespace: capability which in most contexts matches all members of this namespace. */ //@{ Capability( ResolverNamespace namespace_r, IdString value_r = IdString::Null ); Capability( ResolverNamespace namespace_r, const char * value_r ) : Capability( namespace_r, IdString(value_r) ) {} Capability( ResolverNamespace namespace_r, const std::string & value_r ) : Capability( namespace_r, IdString(value_r) ) {} //@} public: /** No or Null \ref Capability ( Id \c 0 ). */ static const Capability Null; /** Empty Capability. */ static const Capability Empty; public: /** Evaluate in a boolean context ( ! empty() ). */ explicit operator bool() const { return ! empty(); } /** Whether the \ref Capability is empty. * This is true for \ref Null and \ref Empty. */ bool empty() const { return( _id == sat::detail::emptyId || _id == sat::detail::noId ); } public: /** Conversion to const char * */ const char * c_str() const; /** \overload */ std::string asString() const { return c_str(); } public: /** Helper providing more detailed information about a \ref Capability. */ CapDetail detail() const; public: /** \name Match two simple capabilities. * * Two simple capabilities match if they have the same \c name * and their \c edition ranges overlap. Where no edition matches * ANY edition. \see \ref Edition::match. * * If a capability expression is involved, \ref matches returns * \ref CapMatch::irrelevant. */ //@{ static CapMatch matches( const Capability & lhs, const Capability & rhs ) { return _doMatch( lhs.id(), rhs.id() ); } static CapMatch matches( const Capability & lhs, const IdString & rhs ) { return _doMatch( lhs.id(), rhs.id() ); } static CapMatch matches( const Capability & lhs, const std::string & rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); } static CapMatch matches( const Capability & lhs, const char * rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() );} static CapMatch matches( const IdString & lhs, const Capability & rhs ) { return _doMatch( lhs.id(), rhs.id() ); } static CapMatch matches( const IdString & lhs, const IdString & rhs ) { return _doMatch( lhs.id(), rhs.id() ); } static CapMatch matches( const IdString & lhs, const std::string & rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); } static CapMatch matches( const IdString & lhs, const char * rhs ) { return _doMatch( lhs.id(), Capability(rhs).id() ); } static CapMatch matches( const std::string & lhs, const Capability & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() );} static CapMatch matches( const std::string & lhs, const IdString & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() ); } static CapMatch matches( const std::string & lhs, const std::string & rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); } static CapMatch matches( const std::string & lhs, const char * rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); } static CapMatch matches( const char * lhs, const Capability & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() );} static CapMatch matches( const char * lhs, const IdString & rhs ) { return _doMatch( Capability(lhs).id(), rhs.id() ); } static CapMatch matches( const char * lhs, const std::string & rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); } static CapMatch matches( const char * lhs, const char * rhs ) { return _doMatch( Capability(lhs).id(), Capability(rhs).id() ); } CapMatch matches( const Capability & rhs ) const { return _doMatch( id(), rhs.id() ); } CapMatch matches( const IdString & rhs ) const { return _doMatch( id(), rhs.id() ); } CapMatch matches( const std::string & rhs ) const { return _doMatch( id(), Capability(rhs).id() ); } CapMatch matches( const char * rhs ) const { return _doMatch( id(), Capability(rhs).id() ); } //@} /** \ref matches functor. */ struct Matches { CapMatch operator()( const Capability & lhs, const Capability & rhs ) const { return Capability::matches( lhs, rhs ); } }; public: /** Test for a filename that is likely being REQUIRED. * Files below \c /bin , \c /sbin , \c /lib etc. Scanning a * packages filelist, an \e interesting filename might be worth * being remembered in PROVIDES. */ static bool isInterestingFileSpec( const IdString & name_r ) { return isInterestingFileSpec( name_r.c_str() ); } static bool isInterestingFileSpec( const std::string & name_r ) { return isInterestingFileSpec( name_r.c_str() ); } static bool isInterestingFileSpec( const char * name_r ); /** \ref Capability parser also guessing \c "libzypp-1.2.3-4.5.x86_64" formats. * * The argument might be in the form \c "libzypp-devel-1.2.3.x86_64". * Passed to the Capability ctor, this would correctly be parsed as name * capability, because actually the edition part had to be separated by a * \c '=', and the architecture had to be appended to the name. * So this is how it actually had to look like: \c "libzypp-devel.x86_64=1.2.3" * * Obviously we have to guess if, and where to split name and edition. In * fact \c "devel" could also be the version and \c "1.2.3" would be the * release then. * * Assuming this Capability should be provided by some package in * the \ref ResPool, we check this. If unprovided, we substitute the last, * (or one but last) \c '-' by a \c '='. If the name part (without version) * of the resulting Capability matches a package name (not provides!) in * the \ref ResPool, this Capability is returned. * * Otherwise we return the Capability originally created from * \a str_r. * * \note: As this method will access the global pool, the returned * result depends on the pools content. */ static Capability guessPackageSpec( const std::string & str_r ); /** \overload Taking an additional bool indicating whether \c str_r made * a valid \ref Capability (\c true) or the result was was guessed by * rewiting a \c '-' to \c '='. (\c false). */ static Capability guessPackageSpec( const std::string & str_r, bool & rewrote_r ); public: /** Expert backdoor. */ sat::detail::IdType id() const { return _id; } private: /** Match two Capabilities */ static CapMatch _doMatch( sat::detail::IdType lhs, sat::detail::IdType rhs ); private: sat::detail::IdType _id; }; /////////////////////////////////////////////////////////////////// /** \relates Capability Stream output */ std::ostream & operator<<( std::ostream & str, const Capability & obj ) ZYPP_API; /** \relates Capability Detailed stream output */ std::ostream & dumpOn( std::ostream & str, const Capability & obj ) ZYPP_API; /** \relates Capability */ inline bool operator==( const Capability & lhs, const Capability & rhs ) { return lhs.id() == rhs.id(); } /** \relates Capability */ inline bool operator!=( const Capability & lhs, const Capability & rhs ) { return lhs.id() != rhs.id(); } /** \relates Capability Arbitrary order. */ inline bool operator<( const Capability & lhs, const Capability & rhs ) { return lhs.id() < rhs.id(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : CapDetail // /** Helper providing more detailed information about a \ref Capability. * * Capabilities are classified to be either \c SIMPLE: * \code * name[.arch] [op edition] * with op := <|<=|=|>=|>|!= * \endcode * or formed by some \c EXPRESSION: * \code * ( left_cap op right_cap ) * with op := and|or|if|unless|else|with|without * \endcode * */ class ZYPP_API CapDetail: protected sat::detail::PoolMember { public: enum Kind { NOCAP = 0x00, NAMED = 0x01, VERSIONED = 0x02, EXPRESSION = 0x04 }; /** Enum values corresponding with libsolv defines. * \note MPL check in PoolImpl.cc */ enum CapRel { REL_NONE = 0, ///< Not an expression CAP_AND = 16, ///< \c and CAP_OR = 17, ///< \c or CAP_COND = 22, ///< \c if CAP_UNLESS = 29, ///< \c unless CAP_ELSE = 26, ///< \c else CAP_WITH = 18, ///< \c with CAP_WITHOUT = 28, ///< \c without CAP_NAMESPACE = 19, ///< CAP_ARCH = 20, ///< Used internally }; public: CapDetail() : _kind( NOCAP ), _lhs( 0 ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 ) {} explicit CapDetail( const Capability & cap_r ) : _kind( NOCAP ), _lhs( cap_r.id() ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 ) { _init(); } explicit CapDetail( sat::detail::IdType id_r ) : _kind( NOCAP ), _lhs( id_r ), _rhs( 0 ), _flag( 0 ), _archIfSimple( 0 ) { _init(); } public: Kind kind() const { return _kind; } bool isNull() const { return _kind == NOCAP; } bool isNamed() const { return _kind == NAMED; } bool isVersioned() const { return _kind == VERSIONED; } bool isSimple() const { return _kind & (NAMED|VERSIONED); } bool isExpression() const { return _kind == EXPRESSION; } /** \name Is simple: name[.arch] [op edition] */ //@{ bool hasArch() const { return _archIfSimple; } IdString arch() const { return _archIfSimple ? IdString( _archIfSimple ) : IdString(); } IdString name() const { return isSimple() ? IdString( _lhs ) : IdString(); } Rel op() const { return isVersioned() ? Rel( _flag ) : isSimple() ? Rel::ANY : Rel::NONE; } Edition ed() const { return isVersioned() ? Edition( _rhs ) : Edition(); } //@} /** \name Is expression cap op cap */ //@{ Capability lhs() const { return isExpression() ? Capability( _lhs ) : Capability::Null; } CapRel capRel() const { return isExpression() ? CapRel(_flag) : REL_NONE; } Capability rhs() const { return isExpression() ? Capability( _rhs ) : Capability::Null; } //@} private: void _init(); private: Kind _kind; sat::detail::IdType _lhs; sat::detail::IdType _rhs; unsigned _flag; sat::detail::IdType _archIfSimple; }; /////////////////////////////////////////////////////////////////// /** \relates CapDetail Stream output */ std::ostream & operator<<( std::ostream & str, const CapDetail & obj ) ZYPP_API; /** \relates CapDetail Stream output */ std::ostream & operator<<( std::ostream & str, CapDetail::Kind obj ) ZYPP_API; /** \relates CapDetail Stream output */ std::ostream & operator<<( std::ostream & str, CapDetail::CapRel obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// inline CapDetail Capability::detail() const { return CapDetail( _id ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// ZYPP_DEFINE_ID_HASHABLE( ::zypp::Capability ); #endif // ZYPP_CAPABILITY_H libzypp-17.36.5/zypp/Changelog.cc000066400000000000000000000022021476576476200166120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Changelog.cc * */ #include #include #include using std::endl; namespace zypp { ///////////////////////////////////////////////////////////////// /** \relates ChangelogEntry */ std::ostream & operator<<( std::ostream & out, const ChangelogEntry & obj ) { out << obj.date() << " " << obj.author() << endl << obj.text() << endl; return out; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Changelog.h000066400000000000000000000036661476576476200164730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Changelog.h * */ #ifndef ZYPP_CHANGELOG_H #define ZYPP_CHANGELOG_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ChangelogEntry // /** Single entry in a change log */ class ChangelogEntry { public: /** Default ctor */ ChangelogEntry( const Date & d, std::string a, std::string t ) : _date( d ), _author(std::move( a )), _text(std::move( t )) {}; /** Dtor */ ~ChangelogEntry() {} Date date() const { return _date; } std::string author() const { return _author; } std::string text() const { return _text; } private: Date _date; std::string _author; std::string _text; }; /** List of ChangelogEntry. */ using Changelog = std::list; /** \relates ChangelogEntry */ std::ostream & operator<<( std::ostream & out, const ChangelogEntry & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CHANGELOG_H libzypp-17.36.5/zypp/CheckSum.cc000066400000000000000000000011511476576476200164270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CheckSum.cc * */ libzypp-17.36.5/zypp/CheckSum.h000066400000000000000000000013241476576476200162730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CheckSum.h * */ #ifndef ZYPP_CHECKSUM_H #define ZYPP_CHECKSUM_H #include #endif // ZYPP_CHECKSUM_H libzypp-17.36.5/zypp/ContentType.h000066400000000000000000000111731476576476200170500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ContentType.h */ #ifndef ZYPP_CONTENTTYPE_H #define ZYPP_CONTENTTYPE_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class ContentType /// \brief Mime type like \c 'type/subtype' classification of content /// /// Used e.g. in \ref callback::UserData to describe the kind of /// user data passed as \c void* to a callback. Neither type nor /// subtype may contain a '/'. /////////////////////////////////////////////////////////////////// class ContentType { public: /** Default ctor: empty */ ContentType() {} /** Ctor taking "type[/subtype]" * \throws std::invalid_argument if string is malformed */ explicit ContentType( std::string type_r ) { std::string::size_type pos = type_r.find( '/' ); if ( pos != std::string::npos ) { testAndSet( _subtype, type_r.substr( pos+1 ) ); type_r.erase( pos ); } testAndSet( _type, std::move(type_r) ); } /** Ctor taking type and subtype * \throws std::invalid_argument if string is malformed */ ContentType( std::string type_r, std::string subtype_r ) { testAndSet( _type, std::move(type_r) ); testAndSet( _subtype, std::move(subtype_r) ); } public: /** Get type */ const std::string & type() const { return _type; } /** Set type * \throws std::invalid_argument if string is malformed */ void type( std::string type_r ) { _type = std::move(type_r); } /** Get subtype */ const std::string & subtype() const { return _subtype; } /** Set subtype * \throws std::invalid_argument if string is malformed */ void subtype( std::string subtype_r ) { _subtype = std::move(subtype_r); } public: /** Whether type and subtype are empty */ bool empty() const { return emptyType() && emptySubtype(); } /** Whether type is empty */ bool emptyType() const { return _type.empty(); } /** Whether subtype is empty */ bool emptySubtype() const { return _subtype.empty(); } /** Validate object in a boolean context: !empty */ explicit operator bool () const { return !empty(); } /** String representation "type[/subtype]" */ std::string asString() const { std::string ret( type() ); if ( ! emptySubtype() ) { ret += "/"; ret += subtype(); } return ret; } private: void testAndSet( std::string & var_r, std::string val_r ) { if ( val_r.find_first_of( "/ \t\r\n" ) != std::string::npos ) throw std::invalid_argument( "ContentType: illegal char in '" + val_r + "'" ); var_r = std::move(val_r); } private: std::string _type; std::string _subtype; }; /** \relates ContentType Stream output */ inline std::ostream & operator<<( std::ostream & str, const ContentType & obj ) { return str << obj.asString(); } /** \relates ContentType */ inline bool operator==( const ContentType & lhs, const ContentType & rhs ) { return lhs.type() == rhs.type() && lhs.subtype() == rhs.subtype(); } /** \relates ContentType */ inline bool operator!=( const ContentType & lhs, const ContentType & rhs ) { return !( lhs == rhs ); } /** \relates ContentType */ inline bool operator<( const ContentType & lhs, const ContentType & rhs ) { int cmp = lhs.type().compare( rhs.type() ); return cmp < 0 || ( cmp == 0 && lhs.subtype() < rhs.subtype() ); } /** \relates ContentType */ inline bool operator<=( const ContentType & lhs, const ContentType & rhs ) { return lhs < rhs || lhs == rhs; } /** \relates ContentType */ inline bool operator>( const ContentType & lhs, const ContentType & rhs ) { return !( lhs <= rhs ); } /** \relates ContentType */ inline bool operator>=( const ContentType & lhs, const ContentType & rhs ) { return !( lhs < rhs ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CONTENTTYPE_H libzypp-17.36.5/zypp/CountryCode.cc000066400000000000000000000442101476576476200171660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CountryCode.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { /** Wrap static codemap data. */ struct CodeMaps // singleton { /** The singleton */ static CodeMaps & instance() { static CodeMaps _instance; return _instance; } /** Lookup (translated) name for \a index_r.*/ std::string name( IdString index_r ) { Link link( getIndex( index_r ) ); std::string ret; if ( link->second ) { ret = _(link->second); } else { ret = _("Unknown country: "); ret += "'"; ret += index_r.c_str(); ret += "'"; } return ret; } private: using CodeMap = std::unordered_map; using Link = CodeMap::const_iterator; using IndexMap = std::unordered_map; /** Ctor initializes the code maps. * http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html */ CodeMaps(); /** Return \ref Link for \a index_r, creating it if necessary. */ Link getIndex( IdString index_r ) { auto it = _indexMap.find( index_r ); return( it != _indexMap.end() ? it->second : newIndex( index_r, index_r.asString() ) ); } /** Return the CodeMap Index for \a code_r. */ Link newIndex( IdString index_r, const std::string & code_r ) { Link link = _codeMap.find( code_r ); if ( link != _codeMap.end() ) return (_indexMap[index_r] = link); // not found: Remember a new code CodeMap::value_type nval( code_r, nullptr ); if ( code_r.size() != 2 ) WAR << "Malformed CountryCode '" << code_r << "' (expect 2-letter)" << endl; std::string ucode( str::toUpper( code_r ) ); if ( ucode != code_r ) { WAR << "Malformed CountryCode '" << code_r << "' (not upper case)" << endl; // but maybe we're lucky with the lower case code // and find a language name. link = _codeMap.find( ucode ); if ( link != _codeMap.end() ) { nval.second = link->second; } } MIL << "Remember CountryCode '" << code_r << "': '" << (nval.second?nval.second:"Unknown country") << "'" << endl; return (_indexMap[index_r] = _codeMap.insert( nval ).first); } private: CodeMap _codeMap; IndexMap _indexMap; }; } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // class CountryCode /////////////////////////////////////////////////////////////////// const CountryCode CountryCode::noCode; CountryCode::CountryCode() {} CountryCode::CountryCode( IdString str_r ) : _str( str_r ) {} CountryCode::CountryCode( const std::string & str_r ) : _str( str_r ) {} CountryCode::CountryCode( const char * str_r ) : _str( str_r ) {} CountryCode::~CountryCode() {} std::string CountryCode::name() const { return CodeMaps::instance().name( _str ); } /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// CodeMaps::CodeMaps() { // Defined CountryCode constants _codeMap[""] = N_( "No Code" ); struct Init { const char *iso3166; const char *name; }; const Init init[] = { {"AD", N_( "Andorra" ) }, // :AND:020: {"AE", N_( "United Arab Emirates" ) }, // :ARE:784: {"AF", N_( "Afghanistan" ) }, // :AFG:004: {"AG", N_( "Antigua and Barbuda" ) }, // :ATG:028: {"AI", N_( "Anguilla" ) }, // :AIA:660: {"AL", N_( "Albania" ) }, // :ALB:008: {"AM", N_( "Armenia" ) }, // :ARM:051: {"AN", N_( "Netherlands Antilles" ) }, // :ANT:530: {"AO", N_( "Angola" ) }, // :AGO:024: {"AQ", N_( "Antarctica" ) }, // :ATA:010: {"AR", N_( "Argentina" ) }, // :ARG:032: {"AS", N_( "American Samoa" ) }, // :ASM:016: {"AT", N_( "Austria" ) }, // :AUT:040: {"AU", N_( "Australia" ) }, // :AUS:036: {"AW", N_( "Aruba" ) }, // :ABW:533: {"AX", N_( "Aland Islands" ) }, // :ALA:248: {"AZ", N_( "Azerbaijan" ) }, // :AZE:031: {"BA", N_( "Bosnia and Herzegovina" ) }, // :BIH:070: {"BB", N_( "Barbados" ) }, // :BRB:052: {"BD", N_( "Bangladesh" ) }, // :BGD:050: {"BE", N_( "Belgium" ) }, // :BEL:056: {"BF", N_( "Burkina Faso" ) }, // :BFA:854: {"BG", N_( "Bulgaria" ) }, // :BGR:100: {"BH", N_( "Bahrain" ) }, // :BHR:048: {"BI", N_( "Burundi" ) }, // :BDI:108: {"BJ", N_( "Benin" ) }, // :BEN:204: {"BM", N_( "Bermuda" ) }, // :BMU:060: {"BN", N_( "Brunei Darussalam" ) }, // :BRN:096: {"BO", N_( "Bolivia" ) }, // :BOL:068: {"BR", N_( "Brazil" ) }, // :BRA:076: {"BS", N_( "Bahamas" ) }, // :BHS:044: {"BT", N_( "Bhutan" ) }, // :BTN:064: {"BV", N_( "Bouvet Island" ) }, // :BVT:074: {"BW", N_( "Botswana" ) }, // :BWA:072: {"BY", N_( "Belarus" ) }, // :BLR:112: {"BZ", N_( "Belize" ) }, // :BLZ:084: {"CA", N_( "Canada" ) }, // :CAN:124: {"CC", N_( "Cocos (Keeling) Islands" ) }, // :CCK:166: {"CD", N_( "Congo" ) }, // :COD:180: {"CF", N_( "Central African Republic" ) }, // :CAF:140: {"CG", N_( "Congo" ) }, // :COG:178: {"CH", N_( "Switzerland" ) }, // :CHE:756: {"CI", N_( "Cote D'Ivoire" ) }, // :CIV:384: {"CK", N_( "Cook Islands" ) }, // :COK:184: {"CL", N_( "Chile" ) }, // :CHL:152: {"CM", N_( "Cameroon" ) }, // :CMR:120: {"CN", N_( "China" ) }, // :CHN:156: {"CO", N_( "Colombia" ) }, // :COL:170: {"CR", N_( "Costa Rica" ) }, // :CRI:188: {"CU", N_( "Cuba" ) }, // :CUB:192: {"CV", N_( "Cape Verde" ) }, // :CPV:132: {"CX", N_( "Christmas Island" ) }, // :CXR:162: {"CY", N_( "Cyprus" ) }, // :CYP:196: {"CZ", N_( "Czech Republic" ) }, // :CZE:203: {"DE", N_( "Germany" ) }, // :DEU:276: {"DJ", N_( "Djibouti" ) }, // :DJI:262: {"DK", N_( "Denmark" ) }, // :DNK:208: {"DM", N_( "Dominica" ) }, // :DMA:212: {"DO", N_( "Dominican Republic" ) }, // :DOM:214: {"DZ", N_( "Algeria" ) }, // :DZA:012: {"EC", N_( "Ecuador" ) }, // :ECU:218: {"EE", N_( "Estonia" ) }, // :EST:233: {"EG", N_( "Egypt" ) }, // :EGY:818: {"EH", N_( "Western Sahara" ) }, // :ESH:732: {"ER", N_( "Eritrea" ) }, // :ERI:232: {"ES", N_( "Spain" ) }, // :ESP:724: {"ET", N_( "Ethiopia" ) }, // :ETH:231: {"FI", N_( "Finland" ) }, // :FIN:246: {"FJ", N_( "Fiji" ) }, // :FJI:242: {"FK", N_( "Falkland Islands (Malvinas)" ) }, // :FLK:238: {"FM", N_( "Federated States of Micronesia" ) }, // :FSM:583: {"FO", N_( "Faroe Islands" ) }, // :FRO:234: {"FR", N_( "France" ) }, // :FRA:250: {"FX", N_( "Metropolitan France" ) }, // :FXX:249: {"GA", N_( "Gabon" ) }, // :GAB:266: {"GB", N_( "United Kingdom" ) }, // :GBR:826: {"GD", N_( "Grenada" ) }, // :GRD:308: {"GE", N_( "Georgia" ) }, // :GEO:268: {"GF", N_( "French Guiana" ) }, // :GUF:254: {"GG", N_( "Guernsey" ) }, {"GH", N_( "Ghana" ) }, // :GHA:288: {"GI", N_( "Gibraltar" ) }, // :GIB:292: {"GL", N_( "Greenland" ) }, // :GRL:304: {"GM", N_( "Gambia" ) }, // :GMB:270: {"GN", N_( "Guinea" ) }, // :GIN:324: {"GP", N_( "Guadeloupe" ) }, // :GLP:312: {"GQ", N_( "Equatorial Guinea" ) }, // :GNQ:226: {"GR", N_( "Greece" ) }, // :GRC:300: {"GS", N_( "South Georgia and the South Sandwich Islands" ) }, // :SGS:239: {"GT", N_( "Guatemala" ) }, // :GTM:320: {"GU", N_( "Guam" ) }, // :GUM:316: {"GW", N_( "Guinea-Bissau" ) }, // :GNB:624: {"GY", N_( "Guyana" ) }, // :GUY:328: {"HK", N_( "Hong Kong" ) }, // :HKG:344: {"HM", N_( "Heard Island and McDonald Islands" ) }, // :HMD:334: {"HN", N_( "Honduras" ) }, // :HND:340: {"HR", N_( "Croatia" ) }, // :HRV:191: {"HT", N_( "Haiti" ) }, // :HTI:332: {"HU", N_( "Hungary" ) }, // :HUN:348: {"ID", N_( "Indonesia" ) }, // :IDN:360: {"IE", N_( "Ireland" ) }, // :IRL:372: {"IL", N_( "Israel" ) }, // :ISR:376: {"IM", N_( "Isle of Man" ) }, {"IN", N_( "India" ) }, // :IND:356: {"IO", N_( "British Indian Ocean Territory" ) }, // :IOT:086: {"IQ", N_( "Iraq" ) }, // :IRQ:368: {"IR", N_( "Iran" ) }, // :IRN:364: {"IS", N_( "Iceland" ) }, // :ISL:352: {"IT", N_( "Italy" ) }, // :ITA:380: {"JE", N_( "Jersey" ) }, {"JM", N_( "Jamaica" ) }, // :JAM:388: {"JO", N_( "Jordan" ) }, // :JOR:400: {"JP", N_( "Japan" ) }, // :JPN:392: {"KE", N_( "Kenya" ) }, // :KEN:404: {"KG", N_( "Kyrgyzstan" ) }, // :KGZ:417: {"KH", N_( "Cambodia" ) }, // :KHM:116: {"KI", N_( "Kiribati" ) }, // :KIR:296: {"KM", N_( "Comoros" ) }, // :COM:174: {"KN", N_( "Saint Kitts and Nevis" ) }, // :KNA:659: {"KP", N_( "North Korea" ) }, // :PRK:408: {"KR", N_( "South Korea" ) }, // :KOR:410: {"KW", N_( "Kuwait" ) }, // :KWT:414: {"KY", N_( "Cayman Islands" ) }, // :CYM:136: {"KZ", N_( "Kazakhstan" ) }, // :KAZ:398: {"LA", N_( "Lao People's Democratic Republic" ) }, // :LAO:418: {"LB", N_( "Lebanon" ) }, // :LBN:422: {"LC", N_( "Saint Lucia" ) }, // :LCA:662: {"LI", N_( "Liechtenstein" ) }, // :LIE:438: {"LK", N_( "Sri Lanka" ) }, // :LKA:144: {"LR", N_( "Liberia" ) }, // :LBR:430: {"LS", N_( "Lesotho" ) }, // :LSO:426: {"LT", N_( "Lithuania" ) }, // :LTU:440: {"LU", N_( "Luxembourg" ) }, // :LUX:442: {"LV", N_( "Latvia" ) }, // :LVA:428: {"LY", N_( "Libya" ) }, // :LBY:434: {"MA", N_( "Morocco" ) }, // :MAR:504: {"MC", N_( "Monaco" ) }, // :MCO:492: {"MD", N_( "Moldova" ) }, // :MDA:498: {"ME", N_( "Montenegro" ) }, {"MF", N_( "Saint Martin" ) }, {"MG", N_( "Madagascar" ) }, // :MDG:450: {"MH", N_( "Marshall Islands" ) }, // :MHL:584: {"MK", N_( "Macedonia" ) }, // :MKD:807: {"ML", N_( "Mali" ) }, // :MLI:466: {"MM", N_( "Myanmar" ) }, // :MMR:104: {"MN", N_( "Mongolia" ) }, // :MNG:496: {"MO", N_( "Macao" ) }, // :MAC:446: {"MP", N_( "Northern Mariana Islands" ) }, // :MNP:580: {"MQ", N_( "Martinique" ) }, // :MTQ:474: {"MR", N_( "Mauritania" ) }, // :MRT:478: {"MS", N_( "Montserrat" ) }, // :MSR:500: {"MT", N_( "Malta" ) }, // :MLT:470: {"MU", N_( "Mauritius" ) }, // :MUS:480: {"MV", N_( "Maldives" ) }, // :MDV:462: {"MW", N_( "Malawi" ) }, // :MWI:454: {"MX", N_( "Mexico" ) }, // :MEX:484: {"MY", N_( "Malaysia" ) }, // :MYS:458: {"MZ", N_( "Mozambique" ) }, // :MOZ:508: {"NA", N_( "Namibia" ) }, // :NAM:516: {"NC", N_( "New Caledonia" ) }, // :NCL:540: {"NE", N_( "Niger" ) }, // :NER:562: {"NF", N_( "Norfolk Island" ) }, // :NFK:574: {"NG", N_( "Nigeria" ) }, // :NGA:566: {"NI", N_( "Nicaragua" ) }, // :NIC:558: {"NL", N_( "Netherlands" ) }, // :NLD:528: {"NO", N_( "Norway" ) }, // :NOR:578: {"NP", N_( "Nepal" ) }, // :NPL:524: {"NR", N_( "Nauru" ) }, // :NRU:520: {"NU", N_( "Niue" ) }, // :NIU:570: {"NZ", N_( "New Zealand" ) }, // :NZL:554: {"OM", N_( "Oman" ) }, // :OMN:512: {"PA", N_( "Panama" ) }, // :PAN:591: {"PE", N_( "Peru" ) }, // :PER:604: {"PF", N_( "French Polynesia" ) }, // :PYF:258: {"PG", N_( "Papua New Guinea" ) }, // :PNG:598: {"PH", N_( "Philippines" ) }, // :PHL:608: {"PK", N_( "Pakistan" ) }, // :PAK:586: {"PL", N_( "Poland" ) }, // :POL:616: {"PM", N_( "Saint Pierre and Miquelon" ) }, // :SPM:666: {"PN", N_( "Pitcairn" ) }, // :PCN:612: {"PR", N_( "Puerto Rico" ) }, // :PRI:630: {"PS", N_( "Palestinian Territory" ) }, // :PSE:275: {"PT", N_( "Portugal" ) }, // :PRT:620: {"PW", N_( "Palau" ) }, // :PLW:585: {"PY", N_( "Paraguay" ) }, // :PRY:600: {"QA", N_( "Qatar" ) }, // :QAT:634: {"RE", N_( "Reunion" ) }, // :REU:638: {"RO", N_( "Romania" ) }, // :ROU:642: {"RS", N_( "Serbia" ) }, {"RU", N_( "Russian Federation" ) }, // :RUS:643: {"RW", N_( "Rwanda" ) }, // :RWA:646: {"SA", N_( "Saudi Arabia" ) }, // :SAU:682: {"SB", N_( "Solomon Islands" ) }, // :SLB:090: {"SC", N_( "Seychelles" ) }, // :SYC:690: {"SD", N_( "Sudan" ) }, // :SDN:736: {"SE", N_( "Sweden" ) }, // :SWE:752: {"SG", N_( "Singapore" ) }, // :SGP:702: {"SH", N_( "Saint Helena" ) }, // :SHN:654: {"SI", N_( "Slovenia" ) }, // :SVN:705: {"SJ", N_( "Svalbard and Jan Mayen" ) }, // :SJM:744: {"SK", N_( "Slovakia" ) }, // :SVK:703: {"SL", N_( "Sierra Leone" ) }, // :SLE:694: {"SM", N_( "San Marino" ) }, // :SMR:674: {"SN", N_( "Senegal" ) }, // :SEN:686: {"SO", N_( "Somalia" ) }, // :SOM:706: {"SR", N_( "Suriname" ) }, // :SUR:740: {"ST", N_( "Sao Tome and Principe" ) }, // :STP:678: {"SV", N_( "El Salvador" ) }, // :SLV:222: {"SY", N_( "Syria" ) }, // :SYR:760: {"SZ", N_( "Swaziland" ) }, // :SWZ:748: {"TC", N_( "Turks and Caicos Islands" ) }, // :TCA:796: {"TD", N_( "Chad" ) }, // :TCD:148: {"TF", N_( "French Southern Territories" ) }, // :ATF:260: {"TG", N_( "Togo" ) }, // :TGO:768: {"TH", N_( "Thailand" ) }, // :THA:764: {"TJ", N_( "Tajikistan" ) }, // :TJK:762: {"TK", N_( "Tokelau" ) }, // :TKL:772: {"TM", N_( "Turkmenistan" ) }, // :TKM:795: {"TN", N_( "Tunisia" ) }, // :TUN:788: {"TO", N_( "Tonga" ) }, // :TON:776: {"TL", N_( "East Timor" ) }, // :TLS:626: {"TR", N_( "Turkey" ) }, // :TUR:792: {"TT", N_( "Trinidad and Tobago" ) }, // :TTO:780: {"TV", N_( "Tuvalu" ) }, // :TUV:798: {"TW", N_( "Taiwan" ) }, // :TWN:158: {"TZ", N_( "Tanzania" ) }, // :TZA:834: {"UA", N_( "Ukraine" ) }, // :UKR:804: {"UG", N_( "Uganda" ) }, // :UGA:800: {"UM", N_( "United States Minor Outlying Islands" ) },// :UMI:581: {"US", N_( "United States" ) }, // :USA:840: {"UY", N_( "Uruguay" ) }, // :URY:858: {"UZ", N_( "Uzbekistan" ) }, // :UZB:860: {"VA", N_( "Holy See (Vatican City State)" ) }, // :VAT:336: {"VC", N_( "Saint Vincent and the Grenadines" ) }, // :VCT:670: {"VE", N_( "Venezuela" ) }, // :VEN:862: {"VG", N_( "British Virgin Islands" ) }, // :VGB:092: {"VI", N_( "Virgin Islands, U.S." ) }, // :VIR:850: {"VN", N_( "Vietnam" ) }, // :VNM:704: {"VU", N_( "Vanuatu" ) }, // :VUT:548: {"WF", N_( "Wallis and Futuna" ) }, // :WLF:876: {"WS", N_( "Samoa" ) }, // :WSM:882: {"YE", N_( "Yemen" ) }, // :YEM:887: {"YT", N_( "Mayotte" ) }, // :MYT:175: {"ZA", N_( "South Africa" ) }, // :ZAF:710: {"ZM", N_( "Zambia" ) }, // :ZMB:894: {"ZW", N_( "Zimbabwe" ) }, // :ZWE:716: { NULL, NULL } }; for (const Init * i = init; i->iso3166 != NULL; ++i) _codeMap[i->iso3166] = i->name; } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/CountryCode.h000066400000000000000000000043041476576476200170300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CountryCode.h * */ #ifndef ZYPP_COUNTRYCODE_H #define ZYPP_COUNTRYCODE_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class CountryCode /// \brief Country codes (iso3166-1-alpha-2). /// /// In fact the class will not prevent to use a non iso country code. /// Just a warning will appear in the log. /////////////////////////////////////////////////////////////////// class ZYPP_API CountryCode : public IdStringType { public: /** Default Ctor: \ref noCode */ CountryCode(); /** Ctor from string. */ explicit CountryCode( IdString str_r ); /** Ctor from string. */ explicit CountryCode( const std::string & str_r ); /** Ctor from string. */ explicit CountryCode( const char * str_r ); /** Dtor */ ~CountryCode(); public: /** \name CountryCode constants. */ //@{ /** Empty code. */ static const CountryCode noCode; //@} public: /** Return the country code asString. */ std::string code() const { return std::string(_str); } /** Return the translated country name; if unknown the country code. */ std::string name() const; private: friend class IdStringType; IdString _str; }; } // namespace zypp /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// ZYPP_DEFINE_ID_HASHABLE( ::zypp::CountryCode ); #endif // ZYPP_COUNTRYCODE_H libzypp-17.36.5/zypp/CpeId.cc000066400000000000000000001024661476576476200157240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CpeId.cc */ #include #include #include #include #include #include using std::endl; /** Initializer list with all wfn attributes */ #define WFN_ATTRIBUTES {\ Attribute::part, \ Attribute::vendor, \ Attribute::product, \ Attribute::version, \ Attribute::update, \ Attribute::edition, \ Attribute::language, \ Attribute::sw_edition,\ Attribute::target_sw, \ Attribute::target_hw, \ Attribute::other, \ } /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { /** Hex-digit to number or -1. */ inline int heDecodeCh( char ch ) { if ( '0' <= ch && ch <= '9' ) return( ch - '0' ); if ( 'A' <= ch && ch <= 'F' ) return( ch - 'A' + 10 ); if ( 'a' <= ch && ch <= 'f' ) return( ch - 'a' + 10 ); return -1; } /** Printable non whitespace in [0x00,0x7f] valid in WFN */ inline bool chIsValidRange( char ch ) { return( '!' <= ch && ch <= '~' ); } /** Alpha */ inline bool chIsAlpha( char ch ) { return( ( 'a' <= ch && ch <= 'z' ) || ( 'A' <= ch && ch <= 'Z' ) ); } /** Digit */ inline bool chIsNum( char ch ) { return( '0' <= ch && ch <= '9' ); } /** Alphanum */ inline bool chIsAlNum( char ch ) { return( chIsAlpha( ch ) || chIsNum( ch ) ); } /** Alphanum or \c underscore are unescaped in WFN */ inline bool chIsWfnUnescaped( char ch ) { return( chIsAlNum( ch ) || ch == '_' ); } } // namespace /////////////////////////////////////////////////////////////////// constexpr CpeId::NoThrowType CpeId::noThrow; /////////////////////////////////////////////////////////////////// /// \class CpeId::Impl /// \brief CpeId implementation. /////////////////////////////////////////////////////////////////// class CpeId::Impl : private base::NonCopyable { using Wfn = std::array; public: Impl() {} Impl( const std::string & cpe_r ) : _wfn( unbind( cpe_r ) ) {} public: explicit operator bool() const { for ( const auto & val : _wfn ) if ( ! val.isANY() ) return true; return false; } std::string asFs() const { str::Str ret; ret << "cpe:2.3"; for ( auto ai : WFN_ATTRIBUTES ) { ret << ':' << _wfn[ai].asFs(); } return ret; } std::string asUri() const { str::Str ret; ret << "cpe:/"; unsigned colon = 0; // to remember trailing colons for ( auto ai : WFN_ATTRIBUTES ) { std::string val = _wfn[ai].asUri(); if ( ai == Attribute::edition ) { if ( ! ( _wfn[Attribute::sw_edition].isANY() && _wfn[Attribute::target_sw].isANY() && _wfn[Attribute::target_hw].isANY() && _wfn[Attribute::other].isANY() ) ) { // packing is needed val = str::Str() << '~' << val//Attribute::edition << '~' << _wfn[Attribute::sw_edition].asUri() << '~' << _wfn[Attribute::target_sw].asUri() << '~' << _wfn[Attribute::target_hw].asUri() << '~' << _wfn[Attribute::other].asUri(); } } if ( ! val.empty() ) { if ( colon ) ret << std::string( colon, ':' ); ret << val; colon = 1; } else ++colon; if ( ai == Attribute::language ) break; // remaining attrs packaed in edition } return ret; } std::string asWfn() const { str::Str ret; ret << "wfn:["; for ( auto ai : WFN_ATTRIBUTES ) { const Value & val( _wfn[ai] ); if ( ! val.isANY() ) { if ( ai ) ret << ','; ret << Attribute::asString( ai ) << '='; if ( val.isString() ) ret << '"' << val << '"'; else ret << "NA"; // as ANY is omitted, it must be NA } } return ret << "]"; } public: SetCompare setRelationMixinCompare( const Impl & trg ) const { SetCompare ret = SetCompare::equal; for ( auto ai : WFN_ATTRIBUTES ) { switch ( _wfn[ai].compare( trg._wfn[ai] ).asEnum() ) { case SetCompare::uncomparable: ret = SetCompare::uncomparable; break; case SetCompare::equal: break; case SetCompare::properSubset: if ( ret == SetCompare::equal ) ret = SetCompare::properSubset; else if ( ret != SetCompare::properSubset ) ret = SetCompare::uncomparable; break; case SetCompare::properSuperset: if ( ret == SetCompare::equal ) ret = SetCompare::properSuperset; else if ( ret != SetCompare::properSuperset ) ret = SetCompare::uncomparable; break; case SetCompare::disjoint: ret = SetCompare::disjoint; break; } if ( ret == SetCompare::uncomparable || ret == SetCompare::disjoint ) break; } return ret; } private: /** Assign \a val_r if it meets \a attr_r specific contraints. * \throws std::invalid_argument if string is malformed */ static void assignAttr( Wfn & wfn_r, Attribute attr_r, const Value & val_r ) { if ( val_r.isString() ) { switch ( attr_r.asEnum() ) { case Attribute::part: { const std::string & wfn( val_r.asWfn() ); switch ( wfn[0] ) { case 'h': case 'o': case 'a': if ( wfn[1] == '\0' ) break; // else: fallthrough default: throw std::invalid_argument( str::Str() << "CpeId:Wfn:part: '" << wfn << "' illegal value; expected: 'h' | 'o' | 'a'" ); break; } } break; case Attribute::language: { const std::string & wfn( val_r.asWfn() ); std::string::size_type len = 0; // (2*3ALPHA) ["-" (2ALPHA / 3DIGIT)] if ( chIsAlpha( wfn[0] ) && chIsAlpha( wfn[1] ) ) { len = chIsAlpha( wfn[2] ) ? 3 : 2; if ( wfn[len] == '-' ) { if ( chIsAlpha( wfn[len+1] ) && chIsAlpha( wfn[len+2] ) ) len += 3; else if ( chIsNum( wfn[len+1] ) && chIsNum( wfn[len+2] ) && chIsNum( wfn[len+3] ) ) len += 4; } } if ( wfn.size() != len ) throw std::invalid_argument( str::Str() << "CpeId:Wfn:language: '" << wfn << "' illegal value; expected RFC5646 conform: language ['-' region]" ); } break; default: // no contraints break; } } wfn_r[attr_r.asIntegral()] = val_r; } private: /** Parse magic and unbind accordingly * \throws std::invalid_argument if string is malformed */ static Wfn unbind( const std::string & cpe_r ); /** Parse Uri and unbind * \throws std::invalid_argument if string is malformed */ static Wfn unbindUri( const std::string & cpe_r ); /** Parse Fs and unbind * \throws std::invalid_argument if string is malformed */ static Wfn unbindFs( const std::string & cpe_r ); private: Wfn _wfn; }; CpeId::Impl::Wfn CpeId::Impl::unbind( const std::string & cpe_r ) { Wfn ret; if ( cpe_r[0] == 'c' && cpe_r[1] == 'p' && cpe_r[2] == 'e' && cpe_r[3] == ':' ) { if ( cpe_r[4] == '/' ) { ret = unbindUri( cpe_r ); } else if ( cpe_r[4] == '2' && cpe_r[5] == '.' && cpe_r[6] == '3' && cpe_r[7] == ':' ) { ret = unbindFs( cpe_r ); } else throw std::invalid_argument( "CpeId: bad magic; expected: 'cpe:2.3:' | 'cpe:/'" ); } else if ( cpe_r[0] != '\0' ) throw std::invalid_argument( "CpeId: bad magic; expected: 'cpe:2.3:' | 'cpe:/'" ); return ret; } CpeId::Impl::Wfn CpeId::Impl::unbindUri( const std::string & cpe_r ) { Wfn ret; static constexpr unsigned numUriAttr = 7u; // basic URI attibutes std::vector field; field.reserve( Attribute::numAttributes ); // reserve 7 + 4 for packed extened attrs in edition if ( str::splitFields( cpe_r.c_str()+5/* skip magic 'cpe:/' */, std::back_inserter(field), ":" ) > numUriAttr ) throw std::invalid_argument( str::Str() << "CpeId:Uri: too many fields (" << field.size() << "); expected " << numUriAttr ); field.resize( Attribute::numAttributes ); // fillup with ANY(""), for ( auto ai : WFN_ATTRIBUTES ) { if ( ai == Attribute::edition && field[ai][0] == '~' ) { // unpacking is needed static constexpr unsigned numPacks = 6u; // dummy_before_~ + edition + 4 extended attributes std::vector pack; pack.reserve( numPacks ); if ( str::splitFields( field[ai], std::back_inserter(pack), "~" ) > numPacks ) throw std::invalid_argument( str::Str() << "CpeId:Uri:edition: too many packs (" << pack.size() << "); expected " << numPacks ); pack.resize( numPacks ); // fillup with ANY(""), should be noOP pack[1].swap( field[Attribute::edition] ); pack[2].swap( field[Attribute::sw_edition] ); pack[3].swap( field[Attribute::target_sw] ); pack[4].swap( field[Attribute::target_hw] ); pack[5].swap( field[Attribute::other] ); } assignAttr( ret, ai, Value( field[ai], Value::uriFormat ) ); } return ret; } CpeId::Impl::Wfn CpeId::Impl::unbindFs( const std::string & cpe_r ) { Wfn ret; std::vector field; field.reserve( Attribute::numAttributes ); if ( str::splitFields( cpe_r.c_str()+8/* skip magic 'cpe:2.3:' */, std::back_inserter(field), ":" ) > Attribute::numAttributes ) throw std::invalid_argument( str::Str() << "CpeId:Fs: too many fields (" << field.size() << "); expected 11" /*<< Attribute::numAttributes but g++ currently can't resoolve this as constexpr*/ ); if ( !field.empty() && field.back().empty() ) // A trailing ':' leads to an empty (illegal) field, but we fillup missing fields with ANY|"*" field.back() = "*"; field.resize( Attribute::numAttributes, "*" ); // fillup with ANY|"*" for ( auto ai : WFN_ATTRIBUTES ) { assignAttr( ret, ai, Value( field[ai], Value::fsFormat ) ); } return ret; } /////////////////////////////////////////////////////////////////// // class CpeId /////////////////////////////////////////////////////////////////// std::string CpeId::NoThrowType::lastMalformed; CpeId::CpeId() : _pimpl( new Impl ) {} CpeId::CpeId( const std::string & cpe_r ) : _pimpl( new Impl( cpe_r ) ) {} CpeId::CpeId( const std::string & cpe_r, NoThrowType ) { try { _pimpl.reset( new Impl( cpe_r ) ); NoThrowType::lastMalformed.clear(); } catch(...) { _pimpl.reset( new Impl ); NoThrowType::lastMalformed = cpe_r; } } CpeId::~CpeId() {} CpeId::operator bool() const { return bool(*_pimpl); } std::string CpeId::asFs() const { return _pimpl->asFs(); } std::string CpeId::asUri() const { return _pimpl->asUri(); } std::string CpeId::asWfn() const { return _pimpl->asWfn(); } SetCompare CpeId::setRelationMixinCompare( const CpeId & trg ) const { return _pimpl->setRelationMixinCompare( *trg._pimpl ); } /////////////////////////////////////////////////////////////////// // class CpeId::WfnAttribute /////////////////////////////////////////////////////////////////// const std::string & CpeId::EAttributeDef::asString( Enum val_r ) { static std::map _table = { #define OUTS(N) { N, #N } OUTS( part ), OUTS( vendor ), OUTS( product ), OUTS( version ), OUTS( update ), OUTS( edition ), OUTS( language ), OUTS( sw_edition ), OUTS( target_sw ), OUTS( target_hw ), OUTS( other ), #undef OUTS }; return _table[val_r]; } /////////////////////////////////////////////////////////////////// // class CpeId::Value /////////////////////////////////////////////////////////////////// const CpeId::Value CpeId::Value::ANY; const CpeId::Value CpeId::Value::NA( "" ); constexpr CpeId::Value::FsFormatType CpeId::Value::fsFormat; constexpr CpeId::Value::UriFormatType CpeId::Value::uriFormat; CpeId::Value::Value( const std::string & value_r ) { if ( value_r.empty() ) // NA { if ( ! CpeId::Value::NA._value ) // initialized by this ctor! _value.reset( new std::string ); else _value = CpeId::Value::NA._value; } else if ( value_r != "*" ) // ANY is default constructed { bool starting = true; // false after the 1st non-? for_( chp, value_r.begin(), value_r.end() ) { switch ( *chp ) { case '\\': // quoted ++chp; if ( ! chIsValidRange( *chp ) ) { if ( *chp ) throw std::invalid_argument( str::Str() << "CpeId:Wfn: illegal quoted character '\\" << reinterpret_cast(*chp) << "'" ); else throw std::invalid_argument( "CpeId:Wfn: Backslash escapes nothing" ); } else if ( chIsWfnUnescaped( *chp ) ) throw std::invalid_argument( str::Str() << "CpeId:Wfn: unnecessarily quoted character '\\" << *chp << "'" ); else if ( starting && *chp == '-' && chp+1 == value_r.end() ) throw std::invalid_argument( str::Str() << "CpeId:Wfn: '\\-' is illegal value" ); break; case '?': // sequence at beginning or end of string while ( *(chp+1) == '?' ) ++chp; if ( ! ( starting || chp+1 == value_r.end() ) ) throw std::invalid_argument( "CpeId:Wfn: embedded ?" ); break; case '*': // single at beginning or end of string if ( ! ( starting || chp+1 == value_r.end() ) ) throw std::invalid_argument( "CpeId:Wfn: embedded *" ); break; default: // everything else unquoted if ( ! chIsWfnUnescaped( *chp ) ) { if ( chIsValidRange( *chp ) ) throw std::invalid_argument( str::Str() << "CpeId:Wfn: missing quote before '" << *chp << "'" ); else throw std::invalid_argument( str::Str() << "CpeId:Wfn: illegal character '" << reinterpret_cast(*chp) << "'" ); } break; } if ( starting ) starting = false; } _value.reset( new std::string( value_r ) ); } } CpeId::Value::Value( const std::string & encoded_r, FsFormatType ) { if ( encoded_r != "*" ) // ANY is default constructed { if ( encoded_r == "-" ) // NA { _value = CpeId::Value::NA._value; } else { str::Str result; bool starting = true; // false after the 1st non-? for_( chp, encoded_r.begin(), encoded_r.end() ) { switch ( *chp ) { case '\\': // may stay quoted ++chp; if ( chIsWfnUnescaped( *chp ) ) result << *chp; else if ( chIsValidRange( *chp ) ) result << '\\' << *chp; else if ( *chp ) throw std::invalid_argument( str::Str() << "CpeId:Fs: illegal quoted character '\\" << *chp << "'" ); else throw std::invalid_argument( "CpeId:Fs: Backslash escapes nothing" ); break; case '?': // sequence at beginning or end of string result << '?'; while ( *(chp+1) == '?' ) { ++chp; result << '?'; } if ( ! ( starting || chp+1 == encoded_r.end() ) ) throw std::invalid_argument( "CpeId:Fs: embedded ?" ); break; case '*': // single at beginning or end of string if ( starting || chp+1 == encoded_r.end() ) result << '*'; else throw std::invalid_argument( "CpeId:Fs: embedded *" ); break; default: if ( chIsWfnUnescaped( *chp ) ) result << *chp; else if ( chIsValidRange( *chp ) ) result << '\\' << *chp; else throw std::invalid_argument( str::Str() << "CpeId:Fs: illegal character '" << reinterpret_cast(*chp) << "'" ); break; } if ( starting ) starting = false; } if ( starting ) throw std::invalid_argument( "CpeId:Fs: '' value is illegal" ); _value.reset( new std::string( result ) ); } } } CpeId::Value::Value( const std::string & encoded_r, UriFormatType ) { if ( ! encoded_r.empty() ) // ANY is default constructed { if ( encoded_r == "-" ) // NA { _value = CpeId::Value::NA._value; } else { str::Str result; bool starting = true; // false after the 1st non-? (%01) for_( chp, encoded_r.begin(), encoded_r.end() ) { char ch = *chp; if ( ch == '%' ) // legal '%xx' sequence first { int d1 = heDecodeCh( *(chp+1) ); if ( d1 != -1 ) { int d2 = heDecodeCh( *(chp+2) ); if ( d2 != -1 ) { chp += 2; // skip sequence if ( d1 == 0 ) { if ( d2 == 1 ) // %01 - ? valid sequence at begin or end { result << '?'; while ( *(chp+1) == '%' && *(chp+2) == '0' && *(chp+3) == '1' ) { chp += 3; result << '?'; } if ( starting || chp+1 == encoded_r.end() ) { starting = false; continue; // -> continue; } else throw std::invalid_argument( "CpeId:Uri: embedded %01" ); } else if ( d2 == 2 ) // %02 - * valid at begin or end { if ( starting || chp+1 == encoded_r.end() ) { result << '*'; starting = false; continue; // -> continue; } else throw std::invalid_argument( "CpeId:Uri: embedded %02" ); } } ch = (d1<<4)|d2; if ( ! chIsValidRange( ch ) ) throw std::invalid_argument( str::Str() << "CpeId:Uri: illegal % encoded character '" << reinterpret_cast(ch) << "'" ); } } } else if ( ! chIsValidRange( ch ) ) throw std::invalid_argument( str::Str() << "CpeId:Uri: illegal character '" << reinterpret_cast(ch) << "'" ); if ( chIsWfnUnescaped( ch ) ) result << ch; else result << '\\' << ch; if ( starting ) starting = false; } _value.reset( new std::string( result ) ); } } } std::string CpeId::Value::asWfn() const { std::string ret; if ( ! _value ) { static const std::string any( "*" ); ret = any; } else ret = *_value; // includes "" for NA return ret; } std::string CpeId::Value::asFs() const { std::string ret; if ( isANY() ) { static const std::string asterisk( "*" ); ret = asterisk; } else if ( isNA() ) { static const std::string dash( "-" ); ret = dash; } else { str::Str result; for_( chp, _value->begin(), _value->end() ) { if ( *chp != '\\' ) result << *chp; else { ++chp; switch ( *chp ) { case '-': case '.': case '_': result << *chp; // without escaping break; case '\0': throw std::invalid_argument( "CpeId:Wfn: Backslash escapes nothing" ); break; default: result << '\\' << *chp; break; } } } ret = result; } return ret; } std::string CpeId::Value::asUri() const { std::string ret; // ANY if ( ! isANY() ) { if ( isNA() ) { static const std::string dash( "-" ); ret = dash; } else { str::Str result; for_( chp, _value->begin(), _value->end() ) { if ( chIsWfnUnescaped( *chp ) ) { result << *chp; } else { static const char *const hdig = "0123456789abcdef"; switch ( *chp ) { case '\\': ++chp; switch ( *chp ) { case '-': case '.': result << *chp; // without encodeing break; case '\0': throw std::invalid_argument( "CpeId:Wfn: Backslash escapes nothing" ); break; default: result << '%' << hdig[(unsigned char)(*chp)/16] << hdig[(unsigned char)(*chp)%16]; break; } break; case '?': result << "%01"; break; case '*': result << "%02"; break; default: throw std::invalid_argument( str::Str() << "CpeId:Wfn: illegal char '" << *chp << "' in WFN" ); break; } } } ret = result; } } return ret; } /////////////////////////////////////////////////////////////////// namespace { /** Whether it's a wildcard character ([*?]). */ inline bool isWildchar( char ch_r ) { return( ch_r == '*' || ch_r == '?' ); } /** Whether there is an even number of consecutive backslashes before and including \a rbegin_r * An even number of backslashes means the character following is unescaped. */ inline bool evenNumberOfBackslashes( const std::string::const_reverse_iterator& rbegin_r, const std::string::const_reverse_iterator& rend_r ) { unsigned backslashes = 0; for_( it, rbegin_r, rend_r ) { if ( *it == '\\' ) ++backslashes; else break; } return !(backslashes & 1U); } /** Number of chars (not counting escaping backslashes) in [begin_r,end_r[ */ inline unsigned trueCharsIn( const std::string & str_r, std::string::size_type begin_r, std::string::size_type end_r ) { unsigned chars = 0; for_( it, begin_r, end_r ) { ++chars; if ( str_r[it] == '\\' ) { if ( ++it == end_r ) break; } } return chars; } /** Match helper comparing 2 Wildcardfree string values (case insensitive). */ inline bool matchWildcardfreeString( const std::string & lhs, const std::string & rhs ) { return( str::compareCI( lhs, rhs ) == 0 ); } /** Match helper matching Wildcarded source against Wildcardfree target. * * Constraints on usage of the unquoted question mark (zero or one char in \a trg): * 1. An unquoted question mark MAY be used at the beginning and/or the end of an * attribute-value string. * 2. A contiguous sequence of unquoted question marks MAY appear at the beginning * and/or the end of an attribute-value string. * 3. An unquoted question mark SHALL NOT be used in any other place in an * attribute-value string. * * Constraints on usage of the unquoted asterisk (zero or more chars in \a trg): * 1. A single unquoted asterisk MAY be used as the entire attribute-value string. * 2. A single unquoted asterisk MAY be used at the beginning and/or end of an * attribute-value string. * 3. An unquoted asterisk SHALL NOT be used in any other place in an attribute-value * string. * * Unquoted question marks and asterisks MAY appear in the same attribute-value string * as long as they meet the constraints above. * * Example of illegal usage: "foo?bar", "bar??baz", "q??x", * "foo*bar", "**foo", "bar***", * "*?foobar", "foobar*?" * * \note Relies on \a src and \a trg being wellformed. */ inline bool matchWildcardedString( std::string src, std::string trg ) { // std::string::npos remembers an asterisk // unescaped wildcard prefix std::string::size_type prefx = 0; switch ( *src.begin() ) // wellformed implies not empty { case '*': if ( src.size() == 1 ) return true; // "*" matches always: superset // else prefx = std::string::npos; src.erase( 0, 1 ); break; case '?': ++prefx; for_( it, ++src.begin(), src.end() ) { if ( *it == '?' ) ++prefx; else break; } if ( src.size() == prefx ) return( trg.size() <= prefx ); // "??..?": superset if at most #prefx chars // else src.erase( 0, prefx ); break; default: break; } // unescaped wildcard suffix std::string::size_type suffx = 0; if ( ! src.empty() ) { switch ( *src.rbegin() ) { case '*': if ( evenNumberOfBackslashes( ++src.rbegin(), src.rend() ) ) { suffx = std::string::npos; src.erase( src.size()-1 ); } break; case '?': ++suffx; for_( it, ++src.rbegin(), src.rend() ) { if ( *it == '?' ) ++suffx; else break; } if ( ! evenNumberOfBackslashes( src.rbegin()+suffx, src.rend() ) ) --suffx; // last '?' was escaped. src.erase( src.size()-suffx ); break; default: break; } } // now match; find src in trg an check surrounding wildcards src = str::toLower( src ); trg = str::toLower( trg ); for ( std::string::size_type match = trg.find( src, 0 ); match != std::string::npos; match = trg.find( src, match+1 ) ) { if ( prefx != std::string::npos && trueCharsIn( trg, 0, match ) > prefx ) break; // not "*", and already more chars than "?"s before match: disjoint std::string::size_type frontSize = match + src.size(); if ( suffx != std::string::npos && trueCharsIn( trg, frontSize, trg.size() ) > suffx ) continue; // not "*", and still more chars than "?"s after match: check next match return true; // match: superset } return false; // disjoint } } // namespace /////////////////////////////////////////////////////////////////// bool CpeId::Value::containsWildcard() const { const std::string & value( *_value ); return ( isWildchar( *value.begin() ) || ( isWildchar( *value.rbegin() ) && evenNumberOfBackslashes( ++value.rbegin(), value.rend() ) ) ); } /////////////////////////////////////////////////////////////////// /// Symmetric attribute compare if wildcards are involved! /// The specs define any comarison with a wildcarded attribute as /// target to return \c uncomparable: /// \code /// wildcardfree <=> wildcarded ==> uncomparable, /// wildcarded <=> wildcardfree ==> superset or disjoint /// \endcode /// But a symmetric result is much more intuitive: /// \code /// wildcardfree <=> wildcarded ==> subset or disjoint /// wildcarded <=> wildcardfree ==> superset or disjoint /// \endcode /////////////////////////////////////////////////////////////////// #define WFN_STRICT_SPEC 0 #if WFN_STRICT_SPEC //SetCompare CpeId::Value::setRelationMixinCompare( const CpeId::Value & trg ) const { static const SetCompare kNeedsCloserLook( SetCompare::Enum(-1) ); // artificial Compare value static const SetCompare matchTabel[4][4] = {{ /* ANY, ANY */ SetCompare::equal, /* ANY, NA */ SetCompare::properSuperset, /* ANY, wildcardfree */ SetCompare::properSuperset, /* ANY, wildcarded */ SetCompare::uncomparable, },{ /* NA, ANY */ SetCompare::properSubset, /* NA, NA */ SetCompare::equal, /* NA, wildcardfree */ SetCompare::disjoint, /* NA, wildcarded */ SetCompare::uncomparable, },{ /* wildcardfree, ANY */ SetCompare::properSubset, /* wildcardfree, NA */ SetCompare::disjoint, /* wildcardfree, wildcardfree */ kNeedsCloserLook, // equal or disjoint /* wildcardfree, wildcarded */ SetCompare::uncomparable, },{ /* wildcarded, ANY */ SetCompare::properSubset, /* wildcarded, NA */ SetCompare::disjoint, /* wildcarded, wildcardfree */ kNeedsCloserLook, // superset or disjoint /* wildcarded, wildcarded */ SetCompare::uncomparable, }}; Type srcType = type(); Type trgType = trg.type(); SetCompare ret = matchTabel[srcType.asIntegral()][trgType.asIntegral()]; if ( ret == kNeedsCloserLook ) { if ( srcType == Type::wildcardfree ) // trgType == Type::wildcardfree { // simple string compare ret = matchWildcardfreeString( *_value, *trg._value ) ? SetCompare::equal : SetCompare::disjoint; } else if ( srcType == Type::wildcarded ) // trgType == Type::wildcardfree { // Needs wildcard compare ret = matchWildcardedString( *_value, *trg._value ) ? SetCompare::properSuperset : SetCompare::disjoint; } } return ret; } #else SetCompare CpeId::Value::setRelationMixinCompare( const CpeId::Value & trg ) const { /////////////////////////////////////////////////////////////////// // ANY, ANY => equal // ANY, NA => properSuperset // ANY, wildcardfree => properSuperset // ANY, wildcarded => properSuperset // // NA, ANY => properSubset // NA, NA => equal // NA, wildcardfree => disjoint // NA, wildcarded => disjoint // // wildcardfree, ANY => properSubset // wildcardfree, NA => disjoint // wildcardfree, wildcardfree => NeedsCloserLook: equal or disjoint // wildcardfree, wildcarded => NeedsCloserLook: subset or disjoint // // wildcarded, ANY => properSubset // wildcarded, NA => disjoint // wildcarded, wildcardfree => NeedsCloserLook: superset or disjoint // wildcarded, wildcarded => NeedsCloserLook" equal or uncomparable /////////////////////////////////////////////////////////////////// SetCompare ret = SetCompare::disjoint; if ( isANY() ) { ret = trg.isANY() ? SetCompare::equal : SetCompare::properSuperset; } else if ( trg.isANY() ) { ret = SetCompare::properSubset; } else if ( isNA() ) { if ( trg.isNA() ) ret = SetCompare::equal; // else: SetCompare::disjoint; } else if ( ! trg.isNA() ) // else: SetCompare::disjoint; { // NeedsCloserLook: if ( isWildcarded() ) { if ( trg.isWildcarded() ) { // simple string compare just to detect 'equal' ret = matchWildcardfreeString( *_value, *trg._value ) ? SetCompare::equal : SetCompare::uncomparable; } else { // Needs wildcard compare (src,trg) if ( matchWildcardedString( *_value, *trg._value ) ) ret = SetCompare::properSuperset; // else: SetCompare::disjoint; } } else { if ( trg.isWildcarded() ) { // Needs wildcard compare (trg,src) if ( matchWildcardedString( *trg._value, *_value ) ) ret = SetCompare::properSubset; // else: SetCompare::disjoint; } else { // simple string compare if ( matchWildcardfreeString( *_value, *trg._value ) ) ret = SetCompare::equal; // else: SetCompare::disjoint; } } } return ret; } #endif // WFN_STRICT_SPEC std::ostream & operator<<( std::ostream & str, const CpeId::Value & obj ) { return str << obj.asString(); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/CpeId.h000066400000000000000000000244501476576476200155620ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/CpeId.h */ #ifndef ZYPP_CPEID_H #define ZYPP_CPEID_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class CpeId /// \brief Common Platform Enumearation (2.3) /// See http://cpe.mitre.org/ for more information on the /// Common Platform Enumearation. /////////////////////////////////////////////////////////////////// class ZYPP_API CpeId : public base::SetRelationMixin { public: /** WFN attribute value */ class Value; public: /** WFN attributes (use like 'enum class \ref Attribute') */ struct EAttributeDef { enum Enum { part, //< attribute (2.2) vendor, //< attribute (2.2) product, //< attribute (2.2) version, //< attribute (2.2) update, //< attribute (2.2) edition, //< attribute (2.2) language, //< attribute (2.2) sw_edition, //< extended attribute (2.3) target_sw, //< extended attribute (2.3) target_hw, //< extended attribute (2.3) other //< extended attribute (2.3) }; static constexpr unsigned numAttributes = other+1; ///< number of attributes static const std::string & asString( Enum val_r ); ///< string representantion }; using Attribute = base::EnumClass; ///< 'enum class Attribute' public: /** Indicator type for non-trowing ctor. */ struct NoThrowType { static std::string lastMalformed; }; /** Indicator argument for non-trowing ctor. */ static constexpr NoThrowType noThrow = NoThrowType(); public: /** Default ctor: ANY-Cpeid, all attribute values are ANY */ CpeId(); /** Ctor parsing from string representation (empty or URI or FS) * \throws std::invalid_argument if string is malformed */ explicit CpeId( const std::string & cpe_r ); /** Ctor parsing from string representation (empty or URI or FS) * \throws std::invalid_argument if string is malformed */ explicit CpeId( const char * cpe_r ) : CpeId( std::string( cpe_r ? cpe_r : "" ) ) {} /** Ctor parsing from string (empty or URI or FS, non throwing) * Creates an empty CpeId if string is malformed. */ CpeId( const std::string & cpe_r, NoThrowType ); /** Dtor */ ~CpeId(); public: /** Evaluate in boolean context: not an ANY-CpeId */ explicit operator bool() const; /** Default string representation [\ref asFS]. */ std::string asString() const { return asFs(); } /** String representation as Formated-String (in/out). * \code * cpe:2.3:a:opensuse:libzypp:14.16.0:beta:*:*:*:*:*:* * \endcode */ std::string asFs() const; /** String representation as URI (in/out). * \code * cpe:/a:opensuse:libzypp:14.16.0:beta * \endcode */ std::string asUri() const; /** String representation as Well-Formed-Name (internal format, out only). * \code * wfn:[part="a",vendor="opensuse",product="libzypp", version="14\.16\.0",update="beta"] * \endcode */ std::string asWfn() const; private: friend SetCompare base::SetRelationMixin::compare( const CpeId & ) const; /** CPE name matching hook for \ref SetRelationMixin */ SetCompare setRelationMixinCompare( const CpeId & trg ) const; public: class Impl; ///< Implementation class. private: RWCOW_pointer _pimpl; ///< Pointer to implementation. }; SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN( CpeId, const char * ); SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN( CpeId, const std::string & ); /** \relates CpeId Stream output */ inline std::ostream & operator<<( std::ostream & str, const CpeId & obj ) { return str << obj.asString(); } /** \relates CpeId::Attribute Stream output */ inline std::ostream & operator<<( std::ostream & str, const CpeId::Attribute & obj ) { return str << CpeId::Attribute::asString( obj.asEnum() ); } /////////////////////////////////////////////////////////////////// /// \class CpeId::Value /// \brief WFN attribute value /// /// Valid WFN string values are not empty, contain alphanumeric chars, underscore, /// no whitespace, printable non-alphanumeric characters must be quoted by a /// backslash. /// /// Unescaped asterisk and question mark are special characters and may occur at /// the beginning and or end of the string. The asterisk must not be used more than /// once in asequense. The question mark may be used more than once in a sequence. /// /// A single asterisk must not be used as attribute value, nor a single quoted hyphen. /// /// A single question mark may be used as value. /// /// \see http://cpe.mitre.org/ for more information on the Common Platform Enumeration. /////////////////////////////////////////////////////////////////// class CpeId::Value : public base::SetRelationMixin { public: /** Logical value matching ANY value. */ static const Value ANY; /** Logical value indicating “not applicable/not used" */ static const Value NA; public: /** Indicator type for ctor arg in FS format. */ struct FsFormatType {}; /** Indicator argument for ctor arg in FS format. */ static constexpr FsFormatType fsFormat = FsFormatType(); /** Indicator type for ctor arg in URI format. */ struct UriFormatType {}; /** Indicator argument for ctor arg in URI format. */ static constexpr UriFormatType uriFormat = UriFormatType(); public: /** Default ctor: ANY */ Value() {} /** Ctor from string (WFN format; \c "*" represents ANY; \c "" represents NA) * \throws std::invalid_argument if string is malformed (\see \ref isValidWfn). */ explicit Value( const std::string & value_r ); /** Ctor from char* (WFN format; \c nullptr or \c "*" represent ANY; \c "" represents NA) * \throws std::invalid_argument if string is malformed (\see \ref isValidWfn). */ explicit Value( const char * value_r ) : Value( std::string( value_r ? value_r : "*" ) ) {} /** Ctor from string (FS format, \c "*" represents ANY; \c "-" represents NA) * \throws std::invalid_argument if string is malformed. */ Value( const std::string & encoded_r, FsFormatType ); /** Ctor from string (URI format, \c "" represents ANY; \c "-" represents NA) * \throws std::invalid_argument if string is malformed. */ Value( const std::string & encoded_r, UriFormatType ); public: /** Classification of \ref Value types mostly for \ref match (use like 'enum class \ref Type') */ struct ETypeDef { enum Enum { ANY, NA, wildcardfree, wildcarded, }; }; using Type = base::EnumClass; ///< 'enum class Type' /** Return the \ref Type of this \ref Value. */ Type type() const { if ( !_value ) return Type::ANY; if ( _value->empty() ) return Type::NA; return( isWildcarded() ? Type::wildcarded : Type::wildcardfree ); } /** Whether value is ANY. ) */ bool isANY() const { return !_value; } /** Whether value is NA. ) */ bool isNA() const { return _value && _value->empty(); } /** Whether it's a logical value (ANY|NA). */ bool isLogical() const { return !_value || _value->empty(); } /** \overload for Type */ bool isLogical( Type type_r ) const { return( type_r == Type::ANY || type_r == Type::NA ); } /** Whether it's an attribute value string (not logical value). */ bool isString() const { return _value && !_value->empty(); } /** \overload for Type */ bool isString( Type type_r ) const { return( type_r == Type::wildcardfree || type_r == Type::wildcarded ); } /** An attribute value string without wildcards ([*?] at begin and/or end) */ bool isWildcardfree() const { return isString() && ! containsWildcard(); } /** An attribute value string with wildcards ([*?] at begin and/or end) */ bool isWildcarded() const { return isString() && containsWildcard(); } public: /** Default string representation [\ref asWfn]. */ std::string asString() const { return asWfn(); } /** String representation as in Well-Formed-Name (ANY:"*", NA:""). * \code * wfn:[part="a",vendor="opensuse",product="libzypp", version="14\.16\.0",update="beta"] * \endcode */ std::string asWfn() const; /** String representation as in Formated-String (ANY:"*", NA:"-") * \code * cpe:2.3:a:opensuse:libzypp:14.16.0:beta:*:*:*:*:*:* * \endcode */ std::string asFs() const; /** String representation as in URI (ANY:"", NA:"-") * \code * cpe:/a:opensuse:libzypp:14.16.0:beta * \endcode */ std::string asUri() const; private: friend SetCompare base::SetRelationMixin::compare( const Value & ) const; /** CPE name matching hook for \ref SetRelationMixin */ SetCompare setRelationMixinCompare( const Value & trg ) const; /** HAs unquoted [*?] at begin and/or end of value. * \note \ref isString() must be asserted! */ bool containsWildcard() const; private: RWCOW_pointer _value; }; SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN( CpeId::Value, const char * ); SETRELATIONMIXIN_DEFINE_COMPARE_BETWEEN( CpeId::Value, const std::string & ); /** \relates CpeId::Value Stream output */ std::ostream & operator<<( std::ostream & str, const CpeId::Value & obj ); } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CPEID_H libzypp-17.36.5/zypp/Date.h000066400000000000000000000000341476576476200154430ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Dep.cc000066400000000000000000000074261476576476200154500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Dep.cc * */ #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace { inline Dep::for_use_in_switch parse( const std::string & strval_r ) { const std::map _table = { { "provides", Dep::PROVIDES_e }, { "prerequires", Dep::PREREQUIRES_e }, { "requires", Dep::REQUIRES_e }, { "conflicts", Dep::CONFLICTS_e }, { "obsoletes", Dep::OBSOLETES_e }, { "recommends", Dep::RECOMMENDS_e }, { "suggests", Dep::SUGGESTS_e }, { "enhances", Dep::ENHANCES_e }, { "supplements", Dep::SUPPLEMENTS_e } }; auto it = _table.find( str::toLower( strval_r ) ); if ( it == _table.end() ) { ZYPP_THROW( Exception("Dep parse: illegal string value '"+strval_r+"'") ); } return it->second; } } /////////////////////////////////////////////////////////////////// const Dep Dep::PROVIDES ( Dep::PROVIDES_e ); const Dep Dep::PREREQUIRES( Dep::PREREQUIRES_e ); const Dep Dep::REQUIRES ( Dep::REQUIRES_e ); const Dep Dep::CONFLICTS ( Dep::CONFLICTS_e ); const Dep Dep::OBSOLETES ( Dep::OBSOLETES_e ); const Dep Dep::RECOMMENDS ( Dep::RECOMMENDS_e ); const Dep Dep::SUGGESTS ( Dep::SUGGESTS_e ); const Dep Dep::ENHANCES ( Dep::ENHANCES_e ); const Dep Dep::SUPPLEMENTS( Dep::SUPPLEMENTS_e ); /////////////////////////////////////////////////////////////////// // // METHOD NAME : Dep::Dep // METHOD TYPE : Ctor // Dep::Dep( const std::string & strval_r ) : _type( parse( strval_r ) ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Dep::asString // METHOD TYPE : const std::string & // const std::string & Dep::asString() const { static const std::map _table = { { PROVIDES_e, "provides" }, { PREREQUIRES_e, "prerequires" }, { REQUIRES_e, "requires" }, { CONFLICTS_e, "conflicts" }, { OBSOLETES_e, "obsoletes" }, { RECOMMENDS_e, "recommends" }, { SUGGESTS_e, "suggests" }, { ENHANCES_e, "enhances" }, { SUPPLEMENTS_e, "supplements" } }; return _table.at(_type); } std::string Dep::asUserString() const { switch ( inSwitch() ) { case PROVIDES_e: return _("Provides"); break; case PREREQUIRES_e: return _("Prerequires"); break; case REQUIRES_e: return _("Requires"); break; case CONFLICTS_e: return _("Conflicts"); break; case OBSOLETES_e: return _("Obsoletes"); break; case RECOMMENDS_e: return _("Recommends"); break; case SUGGESTS_e: return _("Suggests"); break; case ENHANCES_e: return _("Enhances"); break; case SUPPLEMENTS_e: return _("Supplements"); break; } return ""; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Dep.h000066400000000000000000000075331476576476200153110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Dep.h * */ #ifndef ZYPP_DEP_H #define ZYPP_DEP_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Dep // /** Enumeration class of dependency types. * \ingroup g_EnumerationClass */ struct ZYPP_API Dep { friend bool operator==( const Dep & lhs, const Dep & rhs ); friend bool operator!=( const Dep & lhs, const Dep & rhs ); /** Arbitrary order to allow Dep as key in std::container. */ friend bool operator<( const Dep & lhs, const Dep & rhs ); /** \name Dependency types * These are the \em real dependency type contants to * use. Don't mind that it's not an enum. * \see \ref zypp::Dep::inSwitch */ //@{ static const Dep PROVIDES ZYPP_API; static const Dep PREREQUIRES ZYPP_API; static const Dep REQUIRES ZYPP_API; static const Dep CONFLICTS ZYPP_API; static const Dep OBSOLETES ZYPP_API; static const Dep RECOMMENDS ZYPP_API; static const Dep SUGGESTS ZYPP_API; static const Dep ENHANCES ZYPP_API; static const Dep SUPPLEMENTS ZYPP_API; //@} /** Enumarators provided \b only for use \ref inSwitch statement. * \see inSwitch */ enum for_use_in_switch { PROVIDES_e, PREREQUIRES_e, REQUIRES_e, CONFLICTS_e, OBSOLETES_e, RECOMMENDS_e, SUGGESTS_e, ENHANCES_e, SUPPLEMENTS_e, }; /** Ctor from string. * Legal values for \a strval_r are the constants names * (case insignificant). * * \throw PARSE if \a strval_r is not legal. * \todo refine exceptions and check throw. */ explicit Dep( const std::string & strval_r ); /** String representation of dependency type. * \return The constants names lowercased. */ const std::string & asString() const ZYPP_API; /** Translated dependency type (capitalized). * \return The capitalized constants names translated. */ std::string asUserString() const ZYPP_API; /** Enumarator provided for use in \c switch statement. */ for_use_in_switch inSwitch() const { return _type; } private: /** Ctor to initialize the dependency type contants. */ Dep( for_use_in_switch type_r ) : _type( type_r ) {} /** The operator. */ for_use_in_switch _type; }; /////////////////////////////////////////////////////////////////// /** \relates Dep Stream output */ inline std::ostream & operator<<( std::ostream & str, const Dep & obj ) { return str << obj.asString(); } /////////////////////////////////////////////////////////////////// /** \relates Dep */ inline bool operator==( const Dep & lhs, const Dep & rhs ) { return lhs._type == rhs._type; } /** \relates Dep */ inline bool operator!=( const Dep & lhs, const Dep & rhs ) { return lhs._type != rhs._type; } /** \relates Dep */ inline bool operator<( const Dep & lhs, const Dep & rhs ) { return lhs._type < rhs._type; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_DEP_H libzypp-17.36.5/zypp/Digest.cc000066400000000000000000000037051476576476200161530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Digest.cc * * \todo replace by Blocxx * */ #include #include #ifdef DIGEST_TESTSUITE #include #endif #include #include using std::endl; namespace zypp { bool DigestReport::askUserToAcceptNoDigest( const zypp::Pathname &file ) { return false; } bool DigestReport::askUserToAccepUnknownDigest( const Pathname &file, const std::string &name ) { return false; } bool DigestReport::askUserToAcceptWrongDigest( const Pathname &file, const std::string &requested, const std::string &found ) { return false; } #ifdef DIGEST_TESTSUITE int main(int argc, char *argv[]) { using namespace std; bool openssl = false; unsigned argpos = 1; if(argc > 1 && std::string(argv[argpos]) == "--openssl") { openssl = true; ++argpos; } if(argc - argpos < 2) { cerr << "Usage: " << argv[0] << " " << endl; return 1; } const char* digestname = argv[argpos++]; const char* fn = argv[argpos++]; std::ifstream file(fn); std::string digest = Digest::digest(digestname, file); if(openssl) cout << digestname << "(" << fn << ")= " << digest << endl; else cout << digest << " " << fn << endl; return 0; } #endif } // namespace zypp libzypp-17.36.5/zypp/Digest.h000066400000000000000000000022541476576476200160130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Digest.h * * \todo replace by Blocxx * */ #ifndef ZYPP_MEDIA_DIGEST_H #define ZYPP_MEDIA_DIGEST_H #include #include #include namespace zypp { struct ZYPP_API DigestReport : public callback::ReportBase { virtual bool askUserToAcceptNoDigest( const zypp::Pathname &file ); virtual bool askUserToAccepUnknownDigest( const Pathname &file, const std::string &name ); virtual bool askUserToAcceptWrongDigest( const Pathname &file, const std::string &requested, const std::string &found ); }; } // namespace zypp #endif libzypp-17.36.5/zypp/DiskUsageCounter.cc000066400000000000000000000303761476576476200201570ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/DiskUsageCounter.cc * */ extern "C" { #include } #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// DiskUsageCounter::MountPointSet calcDiskUsage( DiskUsageCounter::MountPointSet result, const Bitmap & installedmap_r ) { if ( result.empty() ) { // partitioning is not set return result; } sat::Pool satpool( sat::Pool::instance() ); // init libsolv result vector with mountpoints static const ::DUChanges _initdu = { 0, 0, 0, 0 }; std::vector< ::DUChanges> duchanges( result.size(), _initdu ); { unsigned idx = 0; for_( it, result.begin(), result.end() ) { duchanges[idx].path = it->dir.c_str(); if ( it->growonly ) duchanges[idx].flags |= DUCHANGES_ONLYADD; ++idx; } } // now calc... ::pool_calc_duchanges( satpool.get(), const_cast(installedmap_r), &duchanges[0], duchanges.size() ); // and process the result { unsigned idx = 0; for_( it, result.begin(), result.end() ) { // Limit estimated waste (half block per file) as it does not apply to // btrfs, which reports up to 64K blocksize (bsc#974275,bsc#965322) static const ByteCount blockAdjust( 2, ByteCount::K ); // (files * blocksize) / 2 / 1K; result value in K! it->pkg_size = it->used_size // current usage + duchanges[idx].kbytes // package data size + ( duchanges[idx].files * ( it->fstype == "btrfs" ? 4096 : it->block_size ) / blockAdjust ); // half block per file ++idx; } } return result; } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// DiskUsageCounter::MountPointSet DiskUsageCounter::disk_usage( const ResPool & pool_r ) const { Bitmap bitmap( Bitmap::poolSize ); // build installedmap (installed != transact) // stays installed or gets installed for_( it, pool_r.begin(), pool_r.end() ) { if ( it->status().isInstalled() != it->status().transacts() ) { bitmap.set( sat::asSolvable()(*it).id() ); } } return calcDiskUsage( _mps, bitmap ); } DiskUsageCounter::MountPointSet DiskUsageCounter::disk_usage( sat::Solvable solv_r ) const { Bitmap bitmap( Bitmap::poolSize ); bitmap.set( solv_r.id() ); // temp. unset @system Repo DtorReset tmp( sat::Pool::instance().get()->installed ); sat::Pool::instance().get()->installed = nullptr; return calcDiskUsage( _mps, bitmap ); } DiskUsageCounter::MountPointSet DiskUsageCounter::disk_usage( const Bitmap & bitmap_r ) const { // temp. unset @system Repo DtorReset tmp( sat::Pool::instance().get()->installed ); sat::Pool::instance().get()->installed = nullptr; return calcDiskUsage( _mps, bitmap_r ); } DiskUsageCounter::MountPointSet DiskUsageCounter::detectMountPoints( const std::string & rootdir ) { DiskUsageCounter::MountPointSet ret; typedef std::map Btrfsfilter; Btrfsfilter btrfsfilter; // see btrfs hack below std::ifstream procmounts( "/proc/mounts" ); if ( !procmounts ) { WAR << "Unable to read /proc/mounts" << std::endl; } else { std::string prfx; if ( rootdir != "/" ) prfx = rootdir; // rootdir not / while ( procmounts ) { std::string l = str::getline( procmounts ); if ( !(procmounts.fail() || procmounts.bad()) ) { // data to consume // rootfs / rootfs rw 0 0 // /dev/root / reiserfs rw 0 0 // proc /proc proc rw 0 0 // devpts /dev/pts devpts rw 0 0 // /dev/hda5 /boot ext2 rw 0 0 // shmfs /dev/shm shm rw 0 0 // usbdevfs /proc/bus/usb usbdevfs rw 0 0 std::vector words; str::split( l, std::back_inserter(words) ); if ( words.size() < 3 ) { WAR << "Suspicious entry in /proc/mounts: " << l << std::endl; continue; } // // Filter devices without '/' (proc,shmfs,..) // if ( words[0].find( '/' ) == std::string::npos ) { DBG << "Discard mount point : " << l << std::endl; continue; } // remove /proc entry if (words[0] == "/proc") { DBG << "Discard /proc filesystem: " << l << std::endl; continue; } // // Filter mountpoints not at or below _rootdir // std::string mp = words[1]; if ( prfx.size() ) { if ( mp.compare( 0, prfx.size(), prfx ) != 0 ) { // mountpoint not below rootdir DBG << "Unwanted mount point : " << l << std::endl; continue; } // strip prfx mp.erase( 0, prfx.size() ); if ( mp.empty() ) { mp = "/"; } else if ( mp[0] != '/' ) { // mountpoint not below rootdir DBG << "Unwanted mount point : " << l << std::endl; continue; } } // // Filter cdrom // if ( words[2] == "iso9660" ) { DBG << "Discard cdrom : " << l << std::endl; continue; } if ( words[2] == "vfat" || words[2] == "fat" || words[2] == "ntfs" || words[2] == "ntfs-3g") { MIL << words[1] << " contains ignored fs (" << words[2] << ')' << std::endl; continue; } // // Filter some common unwanted mountpoints // const char * mpunwanted[] = { "/mnt", "/media", "/mounts", "/floppy", "/cdrom", "/suse", "/tmp", "/var/tmp", "/var/adm/mount", "/var/adm/YaST", /*last*/0/*entry*/ }; const char ** nomp = mpunwanted; for ( ; *nomp; ++nomp ) { std::string pre( *nomp ); if ( mp.compare( 0, pre.size(), pre ) == 0 // mp has prefix pre && ( mp.size() == pre.size() || mp[pre.size()] == '/' ) ) { break; } } if ( *nomp ) { DBG << "Filter mount point : " << l << std::endl; continue; } // // Check whether mounted readonly // MountPoint::HintFlags hints; std::vector flags; str::split( words[3], std::back_inserter(flags), "," ); for ( unsigned i = 0; i < flags.size(); ++i ) { if ( flags[i] == "ro" ) { hints |= MountPoint::Hint_readonly; break; } } if ( hints.testFlag( MountPoint::Hint_readonly ) ) { DBG << "Filter ro mount point : " << l << std::endl; continue; } // // check for snapshotting btrfs // bool btrfshack = false; if ( words[2] == "btrfs" ) { btrfshack = true; if ( geteuid() != 0 ) { DBG << "Assume snapshots on " << words[1] << ": non-root user can't check" << std::endl; hints |= MountPoint::Hint_growonly; } else { // For now just check whether there is // at least one snapshot on the volume: ExternalProgram prog({"btrfs","subvolume","list","-s",words[1]}); std::string line( prog.receiveLine() ); if ( ! line.empty() ) { DBG << "Found a snapshot on " << words[1] << ": " << line; // has trailing std::endl hints |= MountPoint::Hint_growonly; } prog.kill(); } } // // statvfs (full path!) and get the data // struct statvfs sb; if ( statvfs( words[1].c_str(), &sb ) != 0 ) { WAR << "Unable to statvfs(" << words[1] << "); errno " << errno << std::endl; ret.insert( DiskUsageCounter::MountPoint( mp, words[2], 0LL, 0LL, 0LL, 0LL, hints ) ); } else { // // Filter zero sized devices (bnc#769819) // if ( sb.f_blocks == 0 || sb.f_bsize == 0 ) { DBG << "Filter zero-sized mount point : " << l << std::endl; continue; } if ( btrfshack ) { // HACK: // Collect just the top/1st mountpoint of each btrfs volume // (by device). This filters away nested subvolumes // which otherwise break per package disk usage computation. // FIX: Computation must learn to handle multiple mount points // contributing to the same file system. MountPoint & bmp( btrfsfilter[words[0]] ); if ( bmp.fstype.empty() ) // 1st occurance { bmp = DiskUsageCounter::MountPoint( mp, words[2], sb.f_bsize, ((long long)sb.f_blocks)*sb.f_bsize/1024, ((long long)(sb.f_blocks - sb.f_bfree))*sb.f_bsize/1024, 0LL, hints ); } else if ( bmp.dir > mp ) bmp.dir = mp; continue; } ret.insert( DiskUsageCounter::MountPoint( mp, words[2], sb.f_bsize, ((long long)sb.f_blocks)*sb.f_bsize/1024, ((long long)(sb.f_blocks - sb.f_bfree))*sb.f_bsize/1024, 0LL, hints ) ); } } } } // collect filtered btrfs volumes for ( auto && bmp : btrfsfilter ) ret.insert( std::move(bmp.second) ); return ret; } DiskUsageCounter::MountPointSet DiskUsageCounter::justRootPartition() { DiskUsageCounter::MountPointSet ret; ret.insert( DiskUsageCounter::MountPoint() ); return ret; } std::ostream & operator<<( std::ostream & str, const DiskUsageCounter::MountPoint & obj ) { str << "dir:[" << obj.dir << "] [ bs: " << obj.blockSize() << " ts: " << obj.totalSize() << " us: " << obj.usedSize() << " (+-: " << obj.commitDiff() << ")" << (obj.readonly?"r":"") << (obj.growonly?"g":"") << " " << obj.fstype << "]"; return str; } std::ostream & operator<<( std::ostream & str, const DiskUsageCounter::MountPointSet & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/DiskUsageCounter.h000066400000000000000000000222231476576476200200110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/DiskUsageCounter.h * */ #ifndef ZYPP_DISKUSAGE_COUNTER_H #define ZYPP_DISKUSAGE_COUNTER_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class DiskUsageCounter /// \brief Compute disk space occupied by packages across partitions/directories /////////////////////////////////////////////////////////////////// class ZYPP_API DiskUsageCounter { public: /////////////////////////////////////////////////////////////////// /// \class MountPoint /// \brief Mount point description /// If \ref block_size is set \ref DiskUsageCoutner will assume /// half a block_size is wasted per file, in case a package /// provides detailed isk usage information. /////////////////////////////////////////////////////////////////// struct MountPoint { friend std::ostream & operator<<( std::ostream & str, const MountPoint & obj ); std::string dir; ///< Directory name std::string fstype; ///< Filesystem type (provided by \ref detectMountPoints) long long block_size; ///< Block size of the filesystem in B (0 if you don't care) long long total_size; ///< Total size of the filesystem in KiB (0 if you don't care) long long used_size; ///< Used size of the filesystem in KiB (0 if you don't care) mutable long long pkg_size; ///< Used size after installation in KiB (computed by \ref DiskUsageCoutner) // hint bits: bool readonly:1; ///< hint for readonly partitions bool growonly:1; ///< hint for growonly partitions (e.g. snapshotting btrfs) /** HinFlags for ctor */ enum Hint { NoHint = 0, Hint_readonly = (1<<0), ///< readonly partitions Hint_growonly = (1<<1), ///< growonly partitions (e.g. snapshotting btrfs) }; ZYPP_DECLARE_FLAGS(HintFlags,Hint); /** Ctor initialize directory, fstype and sizes */ MountPoint( std::string d = "/", std::string f = std::string(), long long bs = 0LL, long long total = 0LL, long long used = 0LL, long long pkg = 0LL, HintFlags hints = NoHint ) : dir(std::move(d)), fstype(std::move(f)) , block_size(bs), total_size(total), used_size(used), pkg_size(pkg) , readonly(hints.testFlag(Hint_readonly)) , growonly(hints.testFlag(Hint_growonly)) {} /** \overload const char * to allow e.g. initiailzer lists * \code * MountPointSet( { "/", "/usr", "/var" } ) * \endcode */ MountPoint( const char * d, const std::string & f = std::string(), long long bs = 0LL, long long total = 0LL, long long used = 0LL, long long pkg = 0LL, HintFlags hints = NoHint ) : MountPoint( std::string(d?d:""), f, bs, total, used, pkg, hints ) {} /** Ctor initialize directory and sizes */ MountPoint( const std::string & d, long long bs, long long total = 0LL, long long used = 0LL, long long pkg = 0LL, HintFlags hints = NoHint ) : MountPoint( d, std::string(), bs, total, used, pkg, hints ) {} /** \overload const char * */ MountPoint( const char * d, long long bs, long long total = 0LL, long long used = 0LL, long long pkg = 0LL, HintFlags hints = NoHint ) : MountPoint( std::string(d?d:""), bs, total, used, pkg, hints ) {} /** Ctor just name and hints, all sizes 0 */ MountPoint( const std::string & d, HintFlags hints ) : MountPoint( d, std::string(), 0LL, 0LL, 0LL, 0LL, hints ) {} /** \overload const char * */ MountPoint( const char * d, HintFlags hints ) : MountPoint( std::string(d?d:""), hints ) {} /** \overload to prevent propagation Hint -> long long */ MountPoint( const std::string & d, Hint hint ) : MountPoint( d, HintFlags(hint) ) {} /** \overload to prevent propagation Hint -> long long */ MountPoint( const char * d, Hint hint ) : MountPoint( std::string(d?d:""), HintFlags(hint) ) {} /** Sort by directory name */ bool operator<( const MountPoint & rhs ) const { return dir < rhs.dir; } /** Block size of the filesystem as \ref ByteCount for convenience. */ ByteCount blockSize() const { return ByteCount( block_size, ByteCount::B ); } /** Total size of the filesystem as \ref ByteCount for convenience. */ ByteCount totalSize() const { return ByteCount( total_size, ByteCount::K ); } /** Used size of the filesystem as \ref ByteCount for convenience. */ ByteCount usedSize() const { return ByteCount( used_size, ByteCount::K ); } /** Free size of the filesystem as \ref ByteCount for convenience. */ ByteCount freeSize() const { return ByteCount( total_size-used_size, ByteCount::K ); } /** Used size after installation as \ref ByteCount for convenience. */ ByteCount usedAfterCommit() const { return ByteCount( pkg_size, ByteCount::K ); } /** Free size after installation as \ref ByteCount for convenience. */ ByteCount freeAfterCommit() const { return ByteCount( total_size-pkg_size, ByteCount::K ); } /** Size change due to installation as \ref ByteCount for convenience. */ ByteCount commitDiff() const { return ByteCount( pkg_size-used_size, ByteCount::K ); } }; /////////////////////////////////////////////////////////////////// using MountPointSet = std::set; DiskUsageCounter() {} /** Ctor taking the MountPointSet to compute */ DiskUsageCounter( MountPointSet mps_r ) : _mps(std::move( mps_r )) {} /** Set a MountPointSet to compute */ void setMountPoints( const MountPointSet & mps_r ) { _mps = mps_r; } /** Get the current MountPointSet */ const MountPointSet & getMountPoints() const { return _mps; } /** Get mountpoints of system below \a rootdir * If we happen to detect snapshotting btrfs partitions, the MountPoint::growonly * hint is set. Disk usage computation will assume that deleted packages will not * free any space (kept in a snapshot). */ static MountPointSet detectMountPoints( const std::string & rootdir = "/" ); /** Only one entry for "/" to collect total sizes */ static MountPointSet justRootPartition(); /** Compute disk usage if the current transaction woud be commited. */ MountPointSet disk_usage( const ResPool & pool ) const; /** Compute disk usage of a single Solvable */ MountPointSet disk_usage( sat::Solvable solv_r ) const; /** \overload for PoolItem */ MountPointSet disk_usage( const PoolItem & pi_r ) const { return disk_usage( sat::asSolvable()( pi_r ) ); } /** \overload for ResObject */ MountPointSet disk_usage( const ResObject::constPtr & obj_r ) const { return disk_usage( sat::asSolvable()( obj_r ) ); } /** Compute disk usage of a collection defined by a solvable bitmap. */ MountPointSet disk_usage( const Bitmap & bitmap_r ) const; /** Compute disk usage of a collection (convertible by \ref asSolvable). */ template MountPointSet disk_usage( Iterator begin_r, Iterator end_r ) const { Bitmap bitmap( Bitmap::poolSize ); for_( it, begin_r, end_r ) bitmap.set( sat::asSolvable()( *it ).id() ); return disk_usage( bitmap ); } private: MountPointSet _mps; }; /////////////////////////////////////////////////////////////////// ZYPP_DECLARE_OPERATORS_FOR_FLAGS(DiskUsageCounter::MountPoint::HintFlags); /** \relates DiskUsageCounter::MountPoint Stream output */ std::ostream & operator<<( std::ostream & str, const DiskUsageCounter::MountPoint & obj ) ZYPP_API; /** \relates DiskUsageCounter::MountPointSet Stream output */ std::ostream & operator<<( std::ostream & str, const DiskUsageCounter::MountPointSet & obj ) ZYPP_API; /** \relates DiskUsageCounter Stream output */ inline std::ostream & operator<<( std::ostream & str, const DiskUsageCounter & obj ) { return str << obj.getMountPoints(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_DISKUSAGE_COUNTER_H libzypp-17.36.5/zypp/DownloadMode.cc000066400000000000000000000033071476576476200173060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/DownloadMode.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// bool deserialize( const std::string & str_r, DownloadMode & result_r ) { #define OUTS(VAL) if ( str::compareCI( str_r, #VAL ) == 0 ) { result_r = VAL; return true; } OUTS( DownloadOnly ); OUTS( DownloadInAdvance ); OUTS( DownloadInHeaps ); OUTS( DownloadAsNeeded ); #undef OUTS return false; } std::ostream & operator<<( std::ostream & str, DownloadMode obj ) { switch ( obj ) { #define OUTS(VAL) case VAL: return str << #VAL; break OUTS( DownloadDefault ); OUTS( DownloadOnly ); OUTS( DownloadInAdvance ); OUTS( DownloadInHeaps ); OUTS( DownloadAsNeeded ); #undef OUTS } return str << "DownloadMode(" << int(obj) << ")"; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/DownloadMode.h000066400000000000000000000051251476576476200171500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/DownloadMode.h * */ #ifndef ZYPP_DOWNLOADMODE_H #define ZYPP_DOWNLOADMODE_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Supported commit download policies. */ enum DownloadMode { DownloadDefault, //!< libzypp will decide what to do. DownloadOnly, //!< Just download all packages to the local cache. //!< Do not install. Implies a dry-run. DownloadInAdvance, //!< First download all packages to the local cache. //!< Then start to install. DownloadInHeaps, //!< Similar to DownloadInAdvance, but try to split //!< the transaction into heaps, where at the end of //!< each heap a consistent system state is reached. DownloadAsNeeded //!< Alternating download and install. Packages are //!< cached just to avid CD/DVD hopping. This is the //!< traditional behaviour. }; /** \relates DownloadMode Parse from string. * On success the \ref DownloadMode is returned via \a result_r, * and the function returns \c true. Otherwise it returns \c false * and \a result_r remains unchanged. */ bool deserialize( const std::string & str_r, DownloadMode & result_r ); /** \relates DownloadMode Parse from string. * Similar as \ref deserialize, but silently return \ref DownloadDefault * in case of a parse error. */ inline DownloadMode deserializeDownloadMode( const std::string & str_r ) { DownloadMode ret( DownloadDefault ); deserialize( str_r, ret ); return ret; } /** \relates DownloadMode Stream output. */ std::ostream & operator<<( std::ostream & str, DownloadMode obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_DOWNLOADMODE_H libzypp-17.36.5/zypp/Edition.cc000066400000000000000000000105201476576476200163200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Edition.cc * */ extern "C" { #include } #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// inline std::string makeevrstr( const std::string & version_r, const std::string & release_r, Edition::epoch_t epoch_r ) { std::string ret( version_r ); if ( ! release_r.empty() ) { ret += "-"; ret += release_r; } return ( epoch_r ? str::numstring( epoch_r ) + ":" + ret : ret ); } inline std::string makeevrstr( const char * version_r, const char * release_r, Edition::epoch_t epoch_r ) { return makeevrstr( std::string(version_r?version_r:""), std::string(release_r?release_r:""), epoch_r ); } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// const Edition Edition::noedition; /////////////////////////////////////////////////////////////////// Edition::Edition( const std::string & version_r, const std::string & release_r, epoch_t epoch_r ) : _str( makeevrstr( version_r, release_r, epoch_r ) ) {} Edition::Edition( const char * version_r, const char * release_r, epoch_t epoch_r ) : _str( makeevrstr( version_r, release_r, epoch_r ) ) {} Edition::Edition( const std::string & version_r, const std::string & release_r, const std::string & epoch_r ) : _str( makeevrstr( version_r, release_r, str::strtonum( epoch_r ) ) ) {} Edition::Edition( const char * version_r, const char * release_r, const char * epoch_r ) : _str( makeevrstr( version_r, release_r, str::strtonum( epoch_r ) ) ) {} Edition::epoch_t Edition::epoch() const { const char * str( c_str() ); const char * sep = str; // skip edition for ( ; *sep >= '0' && *sep <= '9'; ++sep ) ; // NOOP if ( *sep == ':' ) return str::strtonum( std::string( str, sep-str ) ); return 0; } std::string Edition::version() const { const char * str( c_str() ); const char * sep = str; // skip edition for ( ; *sep >= '0' && *sep <= '9'; ++sep ) ; // NOOP if ( *sep == ':' ) str = sep+1; // strip release sep = ::strrchr( str, '-' ); if ( sep ) return std::string( str, sep-str ); return str; } std::string Edition::release() const { const char * str( c_str() ); const char * sep = ::strrchr( str, '-' ); // get release if ( sep ) return sep+1; return std::string(); } int Edition::_doCompare( const char * lhs, const char * rhs ) { if ( lhs == rhs ) return 0; if ( lhs && rhs ) return ::pool_evrcmp_str( myPool().getPool(), lhs, rhs, EVRCMP_COMPARE ); return( lhs ? 1 : -1 ); } int Edition::_doMatch( const char * lhs, const char * rhs ) { if ( lhs == rhs ) return 0; if ( lhs && rhs ) return ::pool_evrcmp_str( myPool().getPool(), lhs, rhs, EVRCMP_MATCH ); return( lhs ? 1 : -1 ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Edition.h000066400000000000000000000176171476576476200162000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Edition.h * */ #ifndef ZYPP_EDITION_H #define ZYPP_EDITION_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Edition // /** Edition represents [epoch:]version[-release] * * \li \c epoch (optional) number, Edition::noepoch if not supplied * \li \c version (required) string, may not contain '-' * \li \c release (optional) string, may not contain '-' * * Comparison is actually \reg g_BackendSpecific. * * \li \b RPM: Edition are ordered according to \c epoch, then \c version, * then \c release. Version and release strings are compared by splitting * them into segments of alpha or digit sequences. Segments are compared * according to their type. On mixed types a string compares less than a * number. * \code * compare( 1.a, 1.0 ) == -1 (<) * compare( 1.0, 1.a ) == 1 (>) * compare( 1.0, 1_0 ) == 0 (==) * \endcode * * \attention operator< defines equivalence classes of version strings, as non * alphanumeric chars are ignored. That' why \c 1.0 and \c 1_0 compare equal * in the example.
* * \attention Edition::match compares two editions, treating empty * version or release strings as wildcard. Thus match is not transitive, * and you don't want to use it to order keys in a a std::container. * * \ingroup g_BackendSpecific */ class ZYPP_API Edition : public IdStringType { public: /** Type of an epoch. */ using epoch_t = unsigned int; /** Value representing \c noepoch. */ static const epoch_t noepoch = 0; /** Value representing \c noedition ("") * This is in fact a valid Edition. It's what the default ctor * creates or will be parsed from an empty string. */ static const Edition noedition; public: /** Default ctor: \ref noedition. */ Edition() {} /** Ctor taking edition as string. */ explicit Edition( IdString::IdType id_r ) : _str( id_r ) {} explicit Edition( const IdString & idstr_r ) : _str( idstr_r ) {} explicit Edition( const std::string & str_r ) : _str( str_r ) {} explicit Edition( const char * cstr_r ) : _str( cstr_r ) {} /** Ctor taking \a version_r, \a release_r and optional \a epoch_r */ Edition( const std::string & version_r, const std::string & release_r, epoch_t epoch_r = noepoch ); /** \overload */ Edition( const char * version_r, const char * release_r, epoch_t epoch_r = noepoch ); /** Ctor taking \a version_r, \a release_r and optional \a epoch_r as string. */ Edition( const std::string & version_r, const std::string & release_r, const std::string & epoch_r ); /** \overload */ Edition( const char * version_r, const char * release_r, const char * epoch_r ); public: /** Epoch */ epoch_t epoch() const; /** Version */ std::string version() const; /** Release */ std::string release() const; public: /** \ref compare functor. * \see \ref RelCompare. */ using Compare = zypp::Compare; /** \ref Edition \ref Range based on \ref Compare. * \see \ref RelCompare. */ using CompareRange = Range; public: /** \name Match two Editions * Match two Editions returning -1,0,1, treating empty * version/release strings as \c ANY. */ //@{ static int match( const Edition & lhs, const Edition & rhs ) { return match( lhs.idStr(), rhs.idStr() ); } static int match( const Edition & lhs, const IdString & rhs ) { return match( lhs.idStr(), rhs ); } static int match( const Edition & lhs, const std::string & rhs ) { return _doMatch( lhs.c_str(), rhs.c_str() ); } static int match( const Edition & lhs, const char * rhs ) { return _doMatch( lhs.c_str(), rhs );} static int match( const IdString & lhs, const Edition & rhs ) { return match( lhs, rhs.idStr() ); } static int match( const IdString & lhs, const IdString & rhs ) { return lhs.compareEQ( rhs ) ? 0 : _doMatch( lhs.c_str(), rhs.c_str() ); } static int match( const IdString & lhs, const std::string & rhs ) { return _doMatch( lhs.c_str(), rhs.c_str() ); } static int match( const IdString & lhs, const char * rhs ) { return _doMatch( lhs.c_str(), rhs ); } static int match( const std::string & lhs, const Edition & rhs ) { return _doMatch( lhs.c_str(), rhs.c_str() );} static int match( const std::string & lhs, const IdString & rhs ) { return _doMatch( lhs.c_str(), rhs.c_str() ); } static int match( const std::string & lhs, const std::string & rhs ) { return _doMatch( lhs.c_str(), rhs.c_str() ); } static int match( const std::string & lhs, const char * rhs ) { return _doMatch( lhs.c_str(), rhs ); } static int match( const char * lhs, const Edition & rhs ) { return _doMatch( lhs, rhs.c_str() );} static int match( const char * lhs, const IdString & rhs ) { return _doMatch( lhs, rhs.c_str() ); } static int match( const char * lhs, const std::string & rhs ) { return _doMatch( lhs, rhs.c_str() ); } static int match( const char * lhs, const char * rhs ) { return _doMatch( lhs, rhs ); } int match( const Edition & rhs ) const { return match( idStr(), rhs.idStr() ); } int match( const IdString & rhs ) const { return match( idStr(), rhs ); } int match( const std::string & rhs ) const { return _doMatch( c_str(), rhs.c_str() ); } int match( const char * rhs ) const { return _doMatch( c_str(), rhs ); } //@} /** \ref match functor. * \see \ref RelCompare. */ struct Match { int operator()( const Edition & lhs, const Edition & rhs ) const { return Edition::match( lhs, rhs ); } }; /** \ref Edition \ref Range based on \ref Match. * \see \ref RelCompare. */ using MatchRange = Range; private: static int _doCompare( const char * lhs, const char * rhs ) ZYPP_API; static int _doMatch( const char * lhs, const char * rhs ); private: friend class IdStringType; IdString _str; }; /////////////////////////////////////////////////////////////////// /** \relates Edition XML output. */ inline std::ostream & dumpAsXmlOn( std::ostream & str, const Edition & obj ) { return str << ""; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_EDITION_H libzypp-17.36.5/zypp/ExternalProgram.h000066400000000000000000000000471476576476200177040ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Fetcher.cc000066400000000000000000000767261476576476200163310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Fetcher.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::fetcher" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** * class that represents indexes which add metadata * to fetcher jobs and therefore need to be retrieved * in advance. */ struct FetcherIndex { FetcherIndex( const OnMediaLocation &loc ) : location(loc) {} /** Index localtion. */ OnMediaLocation location; /** Whether we read this index. */ DefaultIntegral read; }; using FetcherIndex_Ptr = shared_ptr; /** std::set ordering (less semantic) */ struct SameFetcherIndex { bool operator()( const FetcherIndex_Ptr & lhs, const FetcherIndex_Ptr & rhs ) const { if ( lhs == rhs ) return false; // incl. NULL == NULL if ( ! lhs ) return true; // NULL < nonNULL if ( ! rhs ) return false; // nonNULL > NULL // both nonNULL ==> compare medianr and path if ( lhs->location.medianr() == rhs->location.medianr() ) return lhs->location.filename() < rhs->location.filename(); //else return lhs->location.medianr() < rhs->location.medianr(); } }; /** * Class to encapsulate the \ref OnMediaLocation object * and the \ref FileChecker together */ struct FetcherJob { enum Flag { None = 0x0000, Directory = 0x0001, Recursive = 0x0002, RecursiveDirectory = Directory | Recursive, // check checksums even if there is no such // checksum (warns of no checksum) AlwaysVerifyChecksum = 0x0004, }; ZYPP_DECLARE_FLAGS(Flags, Flag); FetcherJob(const FetcherJob &) = default; FetcherJob(FetcherJob &&) = default; FetcherJob &operator=(const FetcherJob &) = default; FetcherJob &operator=(FetcherJob &&) = default; FetcherJob(const OnMediaLocation &loc) : location(loc), flags(None) { //MIL << location << endl; } ~FetcherJob() { //MIL << location << " | * " << checkers.size() << endl; } OnMediaLocation location; //CompositeFileChecker checkers; std::list checkers; Flags flags; }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS(FetcherJob::Flags); using FetcherJob_Ptr = shared_ptr; std::ostream & operator<<( std::ostream & str, const FetcherJob_Ptr & obj ) { return str << obj->location; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Fetcher::Impl // /** Fetcher implementation. */ class Fetcher::Impl { friend std::ostream & operator<<( std::ostream & str, const Fetcher::Impl & obj ); public: Impl(); Impl(const Impl &) = default; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() {} struct CacheInfo{ zypp::Pathname _pathName; Fetcher::CacheOptions _options = Fetcher::Default; friend bool operator<( const CacheInfo &a, const CacheInfo & b) { return a._pathName < b._pathName; } }; void setOptions( Fetcher::Options options ); Fetcher::Options options() const; void addIndex( const OnMediaLocation &resource ); void enqueueDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker = FileChecker() ); void enqueueDigestedDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker = FileChecker() ); void enqueue( const OnMediaLocation &resource, const FileChecker &checker = FileChecker() ); void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker = FileChecker() ); void addCachePath( const Pathname &cache_dir, Fetcher::CacheOptions options ); void reset(); void setMediaSetAccess ( MediaSetAccess &media ); void start( const Pathname &dest_dir, const ProgressData::ReceiverFnc &progress ); void start( const Pathname &dest_dir, MediaSetAccess &media, const ProgressData::ReceiverFnc & progress_receiver ); /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } private: /** * download the indexes and reads them */ void downloadAndReadIndexList( MediaSetAccess &media, const Pathname &dest_dir); /** * download the indexes and reads them */ void downloadIndex( MediaSetAccess &media, const OnMediaLocation &resource, const Pathname &dest_dir); /** * reads a downloaded index file and updates internal * attributes table * * The index lists files relative to a directory, which is * normally the same as the index file is located. */ void readIndex( const Pathname &index, const Pathname &basedir ); /** specific version of \ref readIndex for CHECKSUMS file */ void readChecksumsIndex( const Pathname &index, const Pathname &basedir ); /** specific version of \ref readIndex for content file */ void readContentFileIndex( const Pathname &index, const Pathname &basedir ); /** reads the content of a directory but keeps a cache **/ void getDirectoryContent( MediaSetAccess &media, const OnMediaLocation &resource, filesystem::DirContent &content ); /** * Tries to locate the file represented by job by looking at * the cache (matching checksum is mandatory). Returns the * location of the cached file or an empty \ref Pathname. */ ManagedFile locateInCache( const OnMediaLocation & resource_r, const Pathname & destDir_r ); /** * Validates the provided file against its checkers. * \throws Exception */ void validate( const Pathname & localfile_r, const std::list & checkers_r ); /** * scan the directory and adds the individual jobs */ void addDirJobs( MediaSetAccess &media, const OnMediaLocation &resource, const Pathname &dest_dir, FetcherJob::Flags flags ); /** * auto discovery and reading of indexes */ void autoaddIndexes( const filesystem::DirContent &content, MediaSetAccess &media, const OnMediaLocation &resource, const Pathname &dest_dir ); /** * Provide the resource to \ref dest_dir */ void provideToDest( MediaSetAccess & media_r, const Pathname & destDir_r , const FetcherJob_Ptr & jobp_r ); private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } std::list _resources; std::set _indexes; std::set _caches; // checksums read from the indexes std::map _checksums; // cache of dir contents std::map _dircontent; MediaSetAccess * _mediaSetAccess = nullptr; Fetcher::Options _options; }; /////////////////////////////////////////////////////////////////// void Fetcher::Impl::enqueueDigested( const OnMediaLocation &resource, const FileChecker & ) { if ( _mediaSetAccess ) _mediaSetAccess->precacheFiles( {resource} ); FetcherJob_Ptr job; job.reset(new FetcherJob(resource)); job->flags |= FetcherJob:: AlwaysVerifyChecksum; _resources.push_back(job); } Fetcher::Impl::Impl() : _options(0) { } void Fetcher::Impl::setOptions( Fetcher::Options options ) { _options = options; } Fetcher::Options Fetcher::Impl::options() const { return _options; } void Fetcher::Impl::enqueueDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker ) { FetcherJob_Ptr job; job.reset(new FetcherJob(resource)); if ( checker ) job->checkers.push_back(checker); if ( recursive ) job->flags |= FetcherJob::Recursive; job->flags |= FetcherJob::Directory; _resources.push_back(job); } void Fetcher::Impl::enqueueDigestedDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker ) { FetcherJob_Ptr job; job.reset(new FetcherJob(resource)); if ( checker ) job->checkers.push_back(checker); if ( recursive ) job->flags |= FetcherJob::Recursive; job->flags |= FetcherJob::Directory; job->flags |= FetcherJob::AlwaysVerifyChecksum; _resources.push_back(job); } void Fetcher::Impl::enqueue( const OnMediaLocation &resource, const FileChecker &checker ) { if ( _mediaSetAccess ) _mediaSetAccess->precacheFiles( {resource} ); FetcherJob_Ptr job; job.reset(new FetcherJob(resource)); if ( checker ) job->checkers.push_back(checker); _resources.push_back(job); } void Fetcher::Impl::addIndex( const OnMediaLocation &resource ) { MIL << "adding index " << resource << endl; _indexes.insert(FetcherIndex_Ptr(new FetcherIndex(resource))); } void Fetcher::Impl::reset() { _resources.clear(); _indexes.clear(); _checksums.clear(); _dircontent.clear(); } void Fetcher::Impl::setMediaSetAccess( MediaSetAccess &media ) { _mediaSetAccess = &media; } void Fetcher::Impl::addCachePath( const Pathname &cache_dir, Fetcher::CacheOptions options ) { PathInfo info(cache_dir); if ( info.isExist() ) { if ( info.isDir() ) { DBG << "Adding fetcher cache: '" << cache_dir << "'." << endl; _caches.insert( { cache_dir, options } ); } else { // don't add bad cache directory, just log the error ERR << "Not adding cache: '" << cache_dir << "'. Not a directory." << endl; } } else { ERR << "Not adding cache '" << cache_dir << "'. Path does not exists." << endl; } } ManagedFile Fetcher::Impl::locateInCache( const OnMediaLocation & resource_r, const Pathname & destDir_r ) { // No checksum - no match if ( resource_r.checksum().empty() ) return {}; // first check in the destination directory ManagedFile cacheLocation(destDir_r / resource_r.filename()); if ( PathInfo(cacheLocation).isExist() && is_checksum( cacheLocation, resource_r.checksum() ) ) { return cacheLocation; } MIL << "start fetcher with " << _caches.size() << " cache directories." << endl; for( const CacheInfo & cacheInfo : _caches ) { cacheLocation = ManagedFile(cacheInfo._pathName / resource_r.filename()); if ( PathInfo(cacheLocation).isExist() && is_checksum( cacheLocation, resource_r.checksum() ) ) { MIL << "file " << resource_r.filename() << " found in cache " << cacheInfo._pathName << endl; if ( cacheInfo._options & Fetcher::CleanFiles ) cacheLocation.setDispose( filesystem::unlink ); return cacheLocation; } } return {}; } void Fetcher::Impl::validate( const Pathname & localfile_r, const std::list & checkers_r ) { try { MIL << "Checking job [" << localfile_r << "] (" << checkers_r.size() << " checkers )" << endl; for ( const FileChecker & chkfnc : checkers_r ) { if ( chkfnc ) chkfnc( localfile_r ); else ERR << "Invalid checker for '" << localfile_r << "'" << endl; } } catch ( const FileCheckException &e ) { throw; // let known exceptions bypass silently } catch ( const Exception &e ) { throw; // slet known exceptions bypass silently } catch (...) { ZYPP_THROW(Exception("Unknown error while validating " + localfile_r.asString())); } } void Fetcher::Impl::autoaddIndexes( const filesystem::DirContent &content, MediaSetAccess &media, const OnMediaLocation &resource, const Pathname &dest_dir ) { auto fnc_addIfInContent( [&]( const std::string & index_r ) -> bool { if ( find( content.begin(), content.end(), filesystem::DirEntry(index_r,filesystem::FT_FILE) ) == content.end() ) return false; // add the index of this directory OnMediaLocation indexloc( resource ); indexloc.changeFilename( resource.filename() + index_r ); addIndex( indexloc ); // we need to read it now downloadAndReadIndexList( media, dest_dir ); return true; } ); if ( _options & AutoAddChecksumsIndexes ) { fnc_addIfInContent( "CHECKSUMS" ) || fnc_addIfInContent( "SHA1SUMS" ); } if ( _options & AutoAddContentFileIndexes ) { fnc_addIfInContent( "content" ); } } void Fetcher::Impl::getDirectoryContent( MediaSetAccess &media, const OnMediaLocation &resource, filesystem::DirContent &content ) { if ( _dircontent.find(resource.filename().asString()) != _dircontent.end() ) { filesystem::DirContent filled(_dircontent[resource.filename().asString()]); std::copy(filled.begin(), filled.end(), std::back_inserter(content)); } else { filesystem::DirContent tofill; media.dirInfo( tofill, resource.filename(), false /* dots */, resource.medianr()); std::copy(tofill.begin(), tofill.end(), std::back_inserter(content)); _dircontent[resource.filename().asString()] = tofill; } } void Fetcher::Impl::addDirJobs( MediaSetAccess &media, const OnMediaLocation &resource, const Pathname &dest_dir, FetcherJob::Flags flags ) { // first get the content of the directory so we can add // individual transfer jobs MIL << "Adding directory " << resource.filename() << endl; filesystem::DirContent content; try { getDirectoryContent(media, resource, content); } catch ( media::MediaFileNotFoundException & exception ) { ZYPP_CAUGHT( exception ); WAR << "Skipping subtree hidden at " << resource.filename() << endl; return; } // this method test for the option flags so indexes are added // only if the options are enabled autoaddIndexes(content, media, resource, dest_dir); for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) { // skip CHECKSUMS* as they were already retrieved if ( str::hasPrefix(it->name, "CHECKSUMS") || str::hasPrefix(it->name, "SHA1SUMS") ) continue; Pathname filename = resource.filename() + it->name; switch ( it->type ) { case filesystem::FT_NOT_AVAIL: // old directory.yast contains no typeinfo at all case filesystem::FT_FILE: { CheckSum chksm(resource.checksum()); if ( _checksums.find(filename.asString()) != _checksums.end() ) { // the checksum can be replaced with the one in the index. chksm = _checksums[filename.asString()]; //MIL << "resource " << filename << " has checksum in the index file." << endl; } else WAR << "Resource " << filename << " has no checksum in the index either." << endl; if ( flags & FetcherJob::AlwaysVerifyChecksum ) enqueueDigested(OnMediaLocation(filename, resource.medianr()).setChecksum(chksm)); else enqueue(OnMediaLocation(filename, resource.medianr()).setChecksum(chksm)); break; } case filesystem::FT_DIR: // newer directory.yast contain at least directory info if ( flags & FetcherJob::Recursive ) addDirJobs(media, filename, dest_dir, flags); break; default: // don't provide devices, sockets, etc. break; } } } void Fetcher::Impl::provideToDest( MediaSetAccess & media_r, const Pathname & destDir_r , const FetcherJob_Ptr & jobp_r ) { const OnMediaLocation & resource( jobp_r->location ); try { scoped_ptr releaseFileGuard; // will take care provided files get released // get cached file (by checksum) or provide from media ManagedFile managedTmpFile = locateInCache( resource, destDir_r ); Pathname tmpFile = managedTmpFile; if ( tmpFile.empty() ) { MIL << "Not found in cache, retrieving..." << endl; tmpFile = media_r.provideFile( resource, resource.optional() ? MediaSetAccess::PROVIDE_NON_INTERACTIVE : MediaSetAccess::PROVIDE_DEFAULT ); releaseFileGuard.reset( new MediaSetAccess::ReleaseFileGuard( media_r, resource ) ); // release it when we leave the block } // The final destination: locateInCache also checks destFullPath! // If we find a cache match (by checksum) at destFullPath, take // care it gets deleted, in case the validation fails. ManagedFile destFullPath( destDir_r / resource.filename() ); if ( tmpFile == destFullPath ) destFullPath.setDispose( filesystem::unlink ); // validate the file (throws if not valid) validate( tmpFile, jobp_r->checkers ); // move it to the final destination if ( tmpFile == destFullPath ) destFullPath.resetDispose(); // keep it! else { if ( assert_dir( destFullPath->dirname() ) != 0 ) ZYPP_THROW( Exception( "Can't create " + destFullPath->dirname().asString() ) ); if ( filesystem::hardlinkCopy( tmpFile, destFullPath ) != 0 ) ZYPP_THROW( Exception( "Can't hardlink/copy " + tmpFile.asString() + " to " + destDir_r.asString() ) ); } } catch ( Exception & excpt ) { if ( resource.optional() ) { ZYPP_CAUGHT( excpt ); WAR << "optional resource " << resource << " could not be transferred." << endl; return; } else { excpt.remember( "Can't provide " + resource.filename().asString() ); ZYPP_RETHROW( excpt ); } } } // helper class to consume a content file struct ContentReaderHelper : public parser::susetags::ContentFileReader { ContentReaderHelper() { setRepoIndexConsumer( bind( &ContentReaderHelper::consumeIndex, this, _1 ) ); } void consumeIndex( const parser::susetags::RepoIndex_Ptr & data_r ) { _repoindex = data_r; } parser::susetags::RepoIndex_Ptr _repoindex; }; // generic function for reading indexes void Fetcher::Impl::readIndex( const Pathname &index, const Pathname &basedir ) { if ( index.basename() == "CHECKSUMS" || index.basename() == "SHA1SUMS" ) readChecksumsIndex(index, basedir); else if ( index.basename() == "content" ) readContentFileIndex(index, basedir); else WAR << index << ": index file format not known" << endl; } // reads a content file index void Fetcher::Impl::readContentFileIndex( const Pathname &index, const Pathname &basedir ) { ContentReaderHelper reader; reader.parse(index); MIL << index << " contains " << reader._repoindex->mediaFileChecksums.size() << " checksums." << endl; for_( it, reader._repoindex->mediaFileChecksums.begin(), reader._repoindex->mediaFileChecksums.end() ) { // content file entries don't start with / _checksums[(basedir + it->first).asString()] = it->second; } } // reads a CHECKSUMS (old SHA1SUMS) file index void Fetcher::Impl::readChecksumsIndex( const Pathname &index, const Pathname &basedir ) { std::ifstream in( index.c_str() ); if ( ! in.fail() ) { std::string buffer; while ( getline( in, buffer ) ) { if ( buffer[0] == '#' ) continue; // simple comment CheckSum checksum( str::stripFirstWord( buffer, /*ltrim before strip*/true ) ); if ( checksum.empty() ) continue; // empty line | unknown cheksum format if ( buffer.empty() ) { WAR << "Missing filename in CHECKSUMS file: " << index.asString() << " (" << checksum << ")" << endl; continue; } _checksums[(basedir/buffer).asString()] = checksum; } } else ZYPP_THROW(Exception("Can't open CHECKSUMS file: " + index.asString())); } void Fetcher::Impl::downloadIndex( MediaSetAccess &media, const OnMediaLocation &resource, const Pathname &dest_dir) { MIL << "downloading index " << resource << endl; // create a new fetcher with a different state to transfer the // file containing checksums and its signature Fetcher fetcher; // signature checker for index. We havent got the signature from // the nextwork yet. SignatureFileChecker sigchecker; // build the name of the index and the signature const OnMediaLocation& idxloc(resource); OnMediaLocation sigloc(resource); OnMediaLocation keyloc(resource); // we should not fail the download if those don't exists // the checking will warn later sigloc.setOptional(true); keyloc.setOptional(true); // calculate signature and key name sigloc.changeFilename( sigloc.filename().extend(".asc") ); keyloc.changeFilename( keyloc.filename().extend(".key") ); //assert_dir(dest_dir + idxloc.filename().dirname()); // transfer the signature fetcher.enqueue(sigloc); fetcher.start( dest_dir, media ); // if we get the signature, update the checker if ( PathInfo(dest_dir + sigloc.filename()).isExist() ) sigchecker = SignatureFileChecker(dest_dir + sigloc.filename()); fetcher.reset(); // now the key fetcher.enqueue(keyloc); fetcher.start( dest_dir, media ); fetcher.reset(); // try to import the key if ( PathInfo(dest_dir + keyloc.filename()).isExist() ) getZYpp()->keyRing()->importKey(PublicKey(dest_dir + keyloc.filename()), false); else WAR << "No public key specified by user for index '" << keyloc.filename() << "'"<< endl; // now the index itself fetcher.enqueue( idxloc, FileChecker(sigchecker) ); fetcher.start( dest_dir, media ); fetcher.reset(); } // this method takes all the user pointed indexes, gets them and also tries to // download their signature, and verify them. After that, it parses each one // to fill the checksum cache. void Fetcher::Impl::downloadAndReadIndexList( MediaSetAccess &media, const Pathname &dest_dir) { // if there is no indexes, then just return to avoid // the directory listing if ( _indexes.empty() ) { MIL << "No indexes to read." << endl; return; } for_( it_idx, _indexes.begin(), _indexes.end() ) { if ( (*it_idx)->read ) { DBG << "Already read index " << PathInfo(dest_dir + (*it_idx)->location.filename()) << endl; } else { // base::LogControl::TmpLineWriter shutUp; downloadIndex( media, (*it_idx)->location, dest_dir ); // now we have the indexes in dest_dir readIndex( dest_dir + (*it_idx)->location.filename(), (*it_idx)->location.filename().dirname() ); // Take care we don't process it again MIL << "Remember read index " << PathInfo(dest_dir + (*it_idx)->location.filename()) << endl; (*it_idx)->read = true; } } MIL << "done reading indexes" << endl; } void Fetcher::Impl::start( const Pathname &dest_dir, const ProgressData::ReceiverFnc & progress ) { if ( !_mediaSetAccess ) ZYPP_THROW( zypp::Exception("Called Fetcher::start without setting MediaSetAccess before.") ); start( dest_dir, *_mediaSetAccess, progress ); } // start processing all fetcher jobs. // it processes any user pointed index first void Fetcher::Impl::start( const Pathname &dest_dir, MediaSetAccess &media, const ProgressData::ReceiverFnc & progress_receiver ) { _mediaSetAccess = nullptr; //reset the internally stored MediaSetAccess ProgressData progress(_resources.size()); progress.sendTo(progress_receiver); downloadAndReadIndexList(media, dest_dir); for ( const FetcherJob_Ptr & jobp : _resources ) { if ( jobp->flags & FetcherJob::Directory ) { const OnMediaLocation location(jobp->location); addDirJobs(media, location, dest_dir, jobp->flags); continue; } // may be this code can be factored out // together with the autodiscovery of indexes // of addDirJobs if ( ( _options & AutoAddChecksumsIndexes ) || ( _options & AutoAddContentFileIndexes ) ) { // if auto indexing is enabled, then we need to read the // index for each file. We look only in the directory // where the file is. this is expensive of course. filesystem::DirContent content; getDirectoryContent(media, jobp->location.filename().dirname(), content); // this method test for the option flags so indexes are added // only if the options are enabled MIL << "Autodiscovering signed indexes on '" << jobp->location.filename().dirname() << "' for '" << jobp->location.filename() << "'" << endl; autoaddIndexes(content, media, jobp->location.filename().dirname(), dest_dir); // also look in the root of the media content.clear(); getDirectoryContent(media, Pathname("/"), content); // this method test for the option flags so indexes are added // only if the options are enabled MIL << "Autodiscovering signed indexes on '" << "/" << "' for '" << jobp->location.filename() << "'" << endl; autoaddIndexes(content, media, Pathname("/"), dest_dir); } // if the checksum is empty, but the checksum is in one of the // indexes checksum, then add a checker if ( jobp->location.checksum().empty() ) { if ( _checksums.find(jobp->location.filename().asString()) != _checksums.end() ) { CheckSum chksm = _checksums[jobp->location.filename().asString()]; ChecksumFileChecker digest_check(chksm); jobp->checkers.push_back(digest_check); } else { // if the index checksum is empty too, we only add the checker // if the AlwaysVerifyChecksum option is set on if ( jobp->flags & FetcherJob::AlwaysVerifyChecksum ) { // add the checker with the empty checksum ChecksumFileChecker digest_check(jobp->location.checksum()); jobp->checkers.push_back(digest_check); } } } else { // checksum is not empty, so add a checksum checker ChecksumFileChecker digest_check(jobp->location.checksum()); jobp->checkers.push_back(digest_check); } // Provide and validate the file. If the file was not transferred // and no exception was thrown, it was an optional file. provideToDest( media, dest_dir, jobp ); if ( ! progress.incr() ) ZYPP_THROW(AbortRequestException()); } // for each job } /** \relates Fetcher::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const Fetcher::Impl & obj ) { for ( std::list::const_iterator it_res = obj._resources.begin(); it_res != obj._resources.end(); ++it_res ) { str << *it_res; } return str; } Fetcher::Fetcher() : _pimpl( new Impl() ) {} Fetcher::~Fetcher() {} void Fetcher::setOptions( Fetcher::Options options ) { _pimpl->setOptions(options); } Fetcher::Options Fetcher::options() const { return _pimpl->options(); } void Fetcher::enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker, const Pathname &deltafile ) { enqueueDigested( OnMediaLocation(resource).setDeltafile(deltafile), checker ); } void Fetcher::enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker ) { _pimpl->enqueueDigested( resource, checker ); } void Fetcher::enqueueDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker ) { _pimpl->enqueueDir(resource, recursive, checker); } void Fetcher::enqueueDigestedDir( const OnMediaLocation &resource, bool recursive, const FileChecker &checker ) { _pimpl->enqueueDigestedDir(resource, recursive, checker); } void Fetcher::addIndex( const OnMediaLocation &resource ) { _pimpl->addIndex(resource); } void Fetcher::enqueue( const OnMediaLocation &resource, const FileChecker &checker ) { _pimpl->enqueue(resource, checker); } void Fetcher::addCachePath( const Pathname &cache_dir ) { _pimpl->addCachePath(cache_dir, Fetcher::Default); } void Fetcher::addCachePath(const Pathname &cache_dir, CacheOptions options) { _pimpl->addCachePath(cache_dir, options); } void Fetcher::reset() { _pimpl->reset(); } void Fetcher::setMediaSetAccess( MediaSetAccess &media ) { _pimpl->setMediaSetAccess( media ); } void Fetcher::start(const zypp::filesystem::Pathname &dest_dir, const ProgressData::ReceiverFnc &progress) { _pimpl->start( dest_dir, progress ); } void Fetcher::start( const Pathname &dest_dir, MediaSetAccess &media, const ProgressData::ReceiverFnc & progress_receiver ) { _pimpl->start(dest_dir, media, progress_receiver); } std::ostream & operator<<( std::ostream & str, const Fetcher & obj ) { return str << *obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Fetcher.h000066400000000000000000000274611476576476200161630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Fetcher.h * */ #ifndef ZYPP_FETCHER_H #define ZYPP_FETCHER_H #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** * This class allows to retrieve a group of files in a confortable * way, providing some smartness that does not belong to the * media layer like: * * \li Configurable local caches to retrieve already * donwloaded files. * \li File checkers that can check for right checksums * digital signatures, etc. * * \code * MediaSetAccess access(url, path); * Fetcher fetcher; * fetcher.enqueue( OnMediaLocation().setLocation("/somefile") ); * fetcher.addCachePath("/tmp/cache") * fetcher.start( "/download-dir, access ); * fetcher.reset(); * \endcode * * To use the checkers. just create a functor implementing * bool operator()(const Pathname &file) \see FileChecker. * Pass the necessary validation data in the constructor * of the functor, and pass the object to the \ref enqueue * method. * * \code * ChecksumFileChecker checker(CheckSum("sha1", "...."); * fetcher.enqueue( location, checker); * \endcode * * If you need to use more than one checker * \see CompositeFileChecker * * Additionally, you can automatically enqueue a job * with a checksum checker by using \ref enqueueDigested * which will use the \ref OnMediaLocation checksum * automatically. * * \code * location.setChecksum(CheckSum("sha1", "....")); * fetcher.enqueueDigested(location); * \endcode * * \note If the checksum of the location is empty, but * \ref enqueueDigested is used, then the user will get a * warning that the file has no checksum. * * Additionally, Fetcher supports checking the downloaded * content by using signed indexes on the remote side. * * \code * MediaSetAccess access(url, path); * Fetcher fetcher; * fetcher.addIndex(OnMediaLocation("/content")); * fetcher.enqueue( OnMediaLocation().setLocation("/somefile") ); * fetcher.start( "/download-dir, access ); * fetcher.reset(); * \endcode * * Indexes are supported in CHECKSUMS format (simple text file) * with checksum and file name, or content file, whith * HASH SHA1 line entries. * * \note The indexes file names are relative to the directory * where the index is. * * \note libzypp-11.x: Introduction of sha256 lead to the insight * that using SHA1SUMS as filename was a bad choice. New media store * the checksums in a CHECKSUMS file. If a CHECKSUMS file is not * present, we fall back looking for a SHA1SUMS file. The checksum * type (md5,sha1,sha256) is auto detected by looking at the cheksums * length. No need to somehow encode it in the filename. */ class ZYPP_API Fetcher { friend std::ostream & operator<<( std::ostream & str, const Fetcher & obj ); public: /** Implementation */ class Impl; public: /** * Various option flags to change behavior */ enum Option { /** * If a content file is found, it is * downloaded and read. */ AutoAddContentFileIndexes = 0x0001, /** * If a CHECKSUMS file is found, it is * downloaded and read. */ AutoAddChecksumsIndexes = 0x0002, /** * If a content or CHECKSUMS file is found, * it is downloaded and read. */ AutoAddIndexes = AutoAddContentFileIndexes | AutoAddChecksumsIndexes, }; ZYPP_DECLARE_FLAGS(Options, Option); /** Default ctor */ Fetcher(); /** Dtor */ virtual ~Fetcher(); public: /** * Set the Fetcher options * \see Fetcher::Options */ void setOptions( Options options ); /** * Get current options * \see Fetcher::Options */ Options options() const; /** * Adds an index containing metadata (for example * checksums ) that will be retrieved and read * before the job processing starts. * * Nothing will be transferred or checked * until \ref start() is called. * * The index is relative to the media path, and * the listed files too. * * Indexes in the SHA1SUM format, and YaST * content file * * The file has to be signed or the user will be * warned that the file is unsigned. You can * place the signature next to the file adding the * .asc extension. * * If you expect the key to not to be in the target * system, then you can place it next to the index * using adding the .key extension. * */ void addIndex( const OnMediaLocation &resource ); /** * Enqueue a object for transferal, they will not * be transferred until \ref start() is called * */ void enqueue( const OnMediaLocation &resource, const FileChecker &checker = FileChecker() ); /** * Enqueue a object for transferal, they will not * be transferred until \ref start() is called * * \note As \ref OnMediaLocation contains the digest information, * a \ref ChecksumFileChecker is automatically added to the * transfer job, so make sure you don't add another one or * the user could be asked twice. * * \todo FIXME implement checker == operator to avoid this. */ void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker = FileChecker() ); /** * \deprecated * the deltafile argument is part of OnMediaLocation now, please use \ref enqueueDigested without the * deltafile argument */ ZYPP_DEPRECATED void enqueueDigested( const OnMediaLocation &resource, const FileChecker &checker, const Pathname &deltafile ); /** * Enqueue a directory * * As the files to be enqueued are not known * in advance, all files whose checksum can * be found in some index are enqueued with * checksum checking. Otherwise they are not. * * Some index may provide * the checksums, either by \ref addIndex or * using \ref AutoAddIndexes flag. * * Files are checked by providing a * CHECKSUMS or content file listing * filename * and a respective CHECKSUMS.asc/content.asc which has * the signature for the checksums. * * If you expect the user to not have the key of * the signature either in the trusted or untrusted * keyring, you can offer it as CHECKSUMS.key (or content.key) * * \param recursive True if the complete tree should * be enqueued. * * \note As \ref checksums are read from the index, * a \ref ChecksumFileChecker is automatically added to * transfer jobs having a checksum available, * so make sure you don't add another one or * the user could be asked twice. * * \note The format of the file CHECKSUMS is the output of: * ls | grep -v CHECKSUMS | xargs sha256sum > CHECKSUMS * in each subdirectory. * * \note Every file CHECKSUMS.* except of CHECKSUMS.(asc|key|(void)) will * not be transferred and will be ignored. * */ void enqueueDir( const OnMediaLocation &resource, bool recursive = false, const FileChecker &checker = FileChecker() ); /** * Enqueue a directory and always check for * checksums. * * As the files to be enqueued are not known * in advance, all files are enqueued with * checksum checking. If the checksum of some file is * not in some index, then there will be a verification * warning ( \ref DigestReport ). * * Therefore some index will need to provide * the checksums, either by \ref addIndex or * using \ref AutoAddIndexes flag. * * Files are checked by providing a * CHECKSUMS or content file listing * filename * and a respective CHECKSUMS.asc/content.asc which has * the signature for the checksums. * * If you expect the user to not have the key of * the signature either in the trusted or untrusted * keyring, you can offer it as CHECKSUMS.key (or content.key) * * \param recursive True if the complete tree should * be enqueued. * * \note As \ref checksums are read from the index, * a \ref ChecksumFileChecker is automatically added to every * transfer job, so make sure you don't add another one or * the user could be asked twice. * * \note The format of the file CHECKSUMS is the output of: * ls | grep -v CHECKSUMS | xargs sha256sum > CHECKSUMS * in each subdirectory. * * \note Every file CHECKSUMS.* except of CHECKSUMS.(asc|key|(void)) will * not be transferred and will be ignored. * */ void enqueueDigestedDir( const OnMediaLocation &resource, bool recursive = false, const FileChecker &checker = FileChecker() ); /** * adds a directory to the list of directories * where to look for cached files */ void addCachePath( const Pathname &cache_dir ); enum CacheOptions { Default = 0, CleanFiles = 1 }; /** * adds a directory to the list of directories * where to look for cached files and options on how to handle the cache */ void addCachePath( const Pathname &cache_dir, CacheOptions options ); /** * Reset the transfer (jobs) list * \note It does not reset the cache directory list */ void reset(); /** * Sets the media set access that will be used to precache and * to download the files when \ref start is called. Calling \ref start * will reset the media access. */ void setMediaSetAccess ( MediaSetAccess &media ); /** * start the transfer to a destination directory * \a dest_dir * The media has to be provides with \ref setMediaSetAccess before * calling this version of start. * The file tree will be replicated inside this * directory * */ void start( const Pathname &dest_dir, const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc() ); /** * start the transfer to a destination directory * \a dest_dir * You have to provde a media set access * \a media to get the files from * The file tree will be replicated inside this * directory * */ void start( const Pathname &dest_dir, MediaSetAccess &media, const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc() ); private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Fetcher::Options); /** \relates Fetcher Stream output */ std::ostream & operator<<( std::ostream & str, const Fetcher & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_FETCHER_H libzypp-17.36.5/zypp/FileChecker.cc000066400000000000000000000073241476576476200171010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/FileChecker.cc * */ #include #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "FileChecker" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// ChecksumFileChecker::ChecksumFileChecker( CheckSum checksum ) : _checksum(std::move(checksum)) {} void ChecksumFileChecker::operator()( const Pathname &file ) const { const auto &res = zyppng::CheckSumWorkflow::verifyChecksum ( zyppng::SyncContext::create(), _checksum, file ); if ( !res ) { std::rethrow_exception( res.error ( ) ); } } void NullFileChecker::operator()(const Pathname &file ) const { MIL << "+ null check on " << file << endl; return; } void CompositeFileChecker::operator()(const Pathname &file ) const { //MIL << _checkers.size() << " checkers" << endl; for ( std::list::const_iterator it = _checkers.begin(); it != _checkers.end(); ++it ) { if ( *it ) { //MIL << "+ chk" << endl; (*it)(file); } else { ERR << "Invalid checker" << endl; } } } void CompositeFileChecker::add( const FileChecker &checker ) { _checkers.push_back(checker); } SignatureFileChecker::SignatureFileChecker() {} SignatureFileChecker::SignatureFileChecker( Pathname signature_r ) { _verifyContext.signature( std::move(signature_r) ); } void SignatureFileChecker::addPublicKey( const Pathname & publickey_r ) { addPublicKey( PublicKey(publickey_r) ); } void SignatureFileChecker::addPublicKey( const PublicKey & publickey_r ) { getZYpp()->keyRing()->importKey( publickey_r, false ); } void SignatureFileChecker::operator()( const Pathname & file_r ) const { // const_cast because the workflow is allowed to store result values here SignatureFileChecker & self { const_cast(*this) }; self._verifyContext.file( file_r ); auto res = zyppng::SignatureFileCheckWorkflow::verifySignature ( zyppng::SyncContext::create(), keyring::VerifyFileContext(_verifyContext) ); if ( !res ) { std::rethrow_exception( res.error ( ) ); } self._verifyContext = std::move( *res ); } keyring::VerifyFileContext &SignatureFileChecker::verifyContext() { return _verifyContext; } const keyring::VerifyFileContext &SignatureFileChecker::verifyContext() const { return _verifyContext; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const FileChecker & obj ) { return str; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/FileChecker.h000066400000000000000000000111531476576476200167360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/FileChecker.h * */ #ifndef ZYPP_FILECHECKER_H #define ZYPP_FILECHECKER_H #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class PublicKey; /** * Functor signature used to check files. * \param file File to check. * * \throws FileCheckException when the file does not * validate and the user don't want to continue. */ typedef function FileChecker; /** * Built in file checkers */ /** * \short Checks for a valid checksum and interacts with the user. */ class ChecksumFileChecker { public: typedef CheckSumCheckException ExceptionType; /** * Constructor. * \param checksum Checksum that validates the file */ ChecksumFileChecker( CheckSum checksum ); /** * \short Try to validate the file * \param file File to validate. * * \throws CheckSumCheckException if validation fails */ void operator()( const Pathname &file ) const; private: CheckSum _checksum; }; /** * \short Checks for the validity of a signature */ class SignatureFileChecker { public: typedef SignatureCheckException ExceptionType; public: /** Default Ctor for unsigned files. * * Use it when you don't have a signature and you want * to check whether the user accepts an unsigned file. */ SignatureFileChecker(); /** Ctor taking the detached signature. */ SignatureFileChecker( Pathname signature_r ); /** Add a public key to the list of known keys. */ void addPublicKey( const PublicKey & publickey_r ); /** \overload Convenience taking the public keys pathname. */ void addPublicKey( const Pathname & publickey_r ); /** Call \ref KeyRing::verifyFileSignatureWorkflow to verify the file. * * Keep in mind the the workflow may return \c true (\ref fileAccepted) due to user interaction * or global defaults even if a signature was not actually sucessfully verified. Whether a * signature was actually sucessfully verified can be determined by checking \ref fileValidated * which is invokes IFF a signature for this file actually validated. * * \param file_r File to validate. * * \throws SignatureCheckException if validation fails */ void operator()( const Pathname & file_r ) const; keyring::VerifyFileContext &verifyContext(); const keyring::VerifyFileContext &verifyContext() const; private: keyring::VerifyFileContext _verifyContext; }; /** * \short Checks for nothing * Used as the default checker */ class NullFileChecker { public: void operator()( const Pathname &file ) const; }; /** * \short Checker composed of more checkers. * * Allows to create a checker composed of various * checkers altothether. It will only * validate if all the checkers validate. * * \code * CompositeFileChecker com; * com.add(checker1); * com.add(checker2); * fetcher.enqueue(location, com); * \endcode */ class CompositeFileChecker { public: void add( const FileChecker &checker ); /** * \throws FileCheckException if validation fails */ void operator()( const Pathname &file ) const; int checkersSize() const { return _checkers.size(); } private: std::list _checkers; }; /** \relates FileChecker Stream output */ std::ostream & operator<<( std::ostream & str, const FileChecker & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_FILECHECKER_H libzypp-17.36.5/zypp/Filter.h000066400000000000000000000153361476576476200160260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Filter.h * */ #ifndef ZYPP_FILTER_H #define ZYPP_FILTER_H #include #include #include #include // #include included at the end! #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace filter { ///////////////////////////////////////////////////////////////// /** \defgroup POOLFILTER Collection solvable filter functors. * * All functors should be able to process \ref Solvable as well * as \ref PoolItem. * * \code * // The same filter... * filter::ByLocaleSupport f( Locale("de") ); * * // ...can be used to iterate the sat::Pool... * sat::Pool satpool( sat::Pool::instance() ); * for_( it, satpool.filterBegin(f), satpool.filterEnd(f) ) * { * MIL << *it << endl; // prints sat::Solvable * } * * // ...as well as the ResPool. * ResPool pool ( ResPool::instance() ); * for_( it, pool.filterBegin(f), pool.filterEnd(f) ) * { * MIL << *it << endl; // prints PoolItem * } * \endcode * \ingroup g_Functor */ //@{ /////////////////////////////////////////////////////////////////// // // CLASS NAME : ByLocaleSupport // /** Filter solvables according to their locale support. */ class ByLocaleSupport { private: using LS1 = bool (sat::Solvable::*)(const Locale &) const; using LS2 = bool (sat::Solvable::*)(const LocaleSet &) const; public: /** Solvables with locale support. */ ByLocaleSupport() : _sel( std::mem_fn(&sat::Solvable::supportsLocales) ) {} /** Solvables supporting \c locale_r. */ explicit ByLocaleSupport( const Locale & locale_r ) : _sel( std::bind( std::mem_fn((LS1)&sat::Solvable::supportsLocale), _1, locale_r ) ) {} /** Solvables supporting at least one locale in \c locales_r. */ explicit ByLocaleSupport( const LocaleSet & locales_r ) : _sel( std::bind( std::mem_fn((LS2)&sat::Solvable::supportsLocale), _1, locales_r ) ) {} public: /** Filter on \ref Solvable. */ bool operator()( const sat::Solvable & solv_r ) const { return _sel && _sel( solv_r ); } /** Filter fitting PoolItem/ResObject. */ template bool operator()( const TSolv & solv_r ) const { return operator()( solv_r.satSolvable() ); } private: function _sel; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ByKind // /** Filter solvables according to their kind. */ class ByKind { public: ByKind() {} ByKind( ResKind kind_r ) : _kind(std::move( kind_r )) {} public: /** Filter on \ref Solvable. */ bool operator()( const sat::Solvable & solv_r ) const { return solv_r.isKind( _kind ); } /** Filter fitting PoolItem/ResObject. */ template bool operator()( const TSolv & solv_r ) const { return operator()( solv_r.satSolvable() ); } private: ResKind _kind; }; /** \relates ByKind templated convenience ctor. */ template inline ByKind byKind() { return ByKind( ResTraits::kind ); } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ByStatus // /** Filter solvables according to their status. */ class ByStatus { public: using Predicate = bool (ResStatus::*)() const; public: ByStatus( Predicate pred_r = 0 ) : _pred( pred_r ) {} public: /** Filter on \ref PoolItem. */ bool operator()( const PoolItem & pi_r ) const { return _pred && (pi_r.status().*_pred)(); } /** Filter fitting sat::Solvable/ResObject. */ template bool operator()( const TSolv & solv_r ) const { return operator()( PoolItem(solv_r) ); } private: Predicate _pred; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SameItemAs // /** Filter items with at least same NVRA, vendor. * This is usually used to find available packages * that matche an insytalled one. */ class SameItemAs { public: SameItemAs( const sat::Solvable & solv_r ) : _item( solv_r ) {} /** Fitting PoolItem/ResObject. */ template SameItemAs( const TSolv & solv_r ) : _item( solv_r.satSolvable() ) {} public: /** Filter on \ref Solvable. */ bool operator()( const sat::Solvable & solv_r ) const { return solv_r.name() == _item.name() && solv_r.edition() == _item.edition() && solv_r.arch() == _item.arch() && solv_r.vendor() == _item.vendor(); } /** Filter fitting PoolItem/ResObject. */ template bool operator()( const TSolv & solv_r ) const { return operator()( solv_r.satSolvable() ); } private: sat::Solvable _item; }; /////////////////////////////////////////////////////////////////// //@} ///////////////////////////////////////////////////////////////// } // namespace filter /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #include #endif // ZYPP_FILTER_H libzypp-17.36.5/zypp/Glob.cc000066400000000000000000000042331476576476200156140ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Glob.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace filesystem { ///////////////////////////////////////////////////////////////// int Glob::add( const char * pattern_r, Flags flags_r ) { static Flags kAppend( GLOB_APPEND ); // not published if ( ! flags_r ) flags_r = _defaultFlags; if ( _result ) flags_r |= kAppend; else _result.reset( new ::glob_t ); return( _lastGlobReturn = ::glob( pattern_r, flags_r, NULL, &(*_result) ) ); } void Glob::clear() { if ( _result ) { ::globfree( &(*_result) ); _result.reset(); _lastGlobReturn = 0; } } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const Glob & obj ) { return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace filesystem /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Glob.h000066400000000000000000000245641476576476200154670ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Glob.h * */ #ifndef ZYPP_GLOB_H #define ZYPP_GLOB_H extern "C" { #include } #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace filesystem { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Glob // /** Find pathnames matching a pattern. * \code * Glob glob( Glob::kBrace ); * glob.add( "/somewhere/solverTestcase/ *{.xml,.xml.gz}" ); * glob.add( "/somewhere/else/a*" ); * for_( it, glob.begin(), glob.end() ) * ... * \endcode * \code * std::list plist; * Glob::collect( "/somewherre/solverTestcase/ *{.xml,.xml.gz}", Glob::kBrace, * std::back_inserter( plist ) ); * \endcode * \see Manual page glob(3) */ class ZYPP_API Glob : private base::NonCopyable { public: using size_type = size_t; using value_type = const char *; /** Iterate NULL terminated \c char* array. */ class const_iterator : public boost::iterator_adaptor< const_iterator // Derived , char ** // Base , value_type // Value , boost::forward_traversal_tag // CategoryOrTraversal , const value_type // Reference > { public: const_iterator() : const_iterator::iterator_adaptor_( 0 ) {} explicit const_iterator( char ** _idx ) : const_iterator::iterator_adaptor_( _idx && *_idx ? _idx : 0 ) {} private: friend class boost::iterator_core_access; void increment() { if ( base_reference() && !*(++base_reference()) ) base_reference() = 0; } reference dereference() const { return( base() ? *base() : 0 ); } }; /////////////////////////////////////////////////////////////////// public: /** Individual bits to combine in \ref Flags. */ enum Bits { kErr = GLOB_ERR, //!< Return on read errors. kMark = GLOB_MARK, //!< Append a slash to each name. kNoSort = GLOB_NOSORT, //!< Don't sort the names. // unsupported kDoOffs = GLOB_DOOFFS, //!< Insert PGLOB->gl_offs NULLs. kNoCheck = GLOB_NOCHECK, //!< If nothing matches, return the pattern. // autoapplied kAppend = GLOB_APPEND, //!< Append to results of a previous call. kNoEscape = GLOB_NOESCAPE, //!< Backslashes don't quote metacharacters. kPeriod = GLOB_PERIOD, //!< Leading `.' can be matched by metachars. // unsupported kMagChar = GLOB_MAGCHAR,//!< Set in gl_flags if any metachars seen. kAltDirFunc = GLOB_ALTDIRFUNC, //!< Use gl_opendir et al functions. kBrace = GLOB_BRACE, //!< Expand "{a,b}" to "a" "b". kNoMagic = GLOB_NOMAGIC, //!< If no magic chars, return the pattern. kTilde = GLOB_TILDE, //!< Expand ~user and ~ to home directories. kOnlyDir = GLOB_ONLYDIR, //!< Match only directories. kTildeCheck = GLOB_TILDE_CHECK, //!< Like GLOB_TILDE but return an error if the user name is not available. }; /** type Flags: Type-safe OR-combination of \ref Bits. */ ZYPP_DECLARE_FLAGS( Flags, Bits ); public: /** Default ctor optionally taking the default flags. * The flags passed here are the default for \ref add. * \see \ref setDefaultFlags */ Glob( Flags flags_r = Flags() ) : _defaultFlags( flags_r ) {} /** Ctor adding pathnames matching \a pattern_r. * The flags passed here are the default for \ref add. * \see \ref setDefaultFlags */ explicit Glob( const Pathname & pattern_r, Flags flags_r = Flags() ) : _defaultFlags( flags_r ) { add( pattern_r, flags_r ); } /** \overload */ explicit Glob( const std::string & pattern_r, Flags flags_r = Flags() ) : _defaultFlags( flags_r ) { add( pattern_r, flags_r ); } /** \overload */ explicit Glob( const char * pattern_r, Flags flags_r = Flags() ) : _defaultFlags( flags_r ) { add( pattern_r, flags_r ); } /** Dtor */ ~Glob() { if ( _result ) ::globfree( &(*_result) ); } /** Add pathnames matching \a pattern_r to the current result. * * Any flags passed here override the global default passed to * the ctor. GLOB_APPEND is atomatically added to the flags * f needed. * * This invalidates all iterators. * \see \ref setDefaultFlags * \return the value returned by ::glob(). */ int add( const Pathname & pattern_r, Flags flags_r = Flags() ) { return add( pattern_r.c_str(), flags_r ); } /** \overload */ int add( const std::string & pattern_r, Flags flags_r = Flags() ) { return add( pattern_r.c_str(), flags_r ); } /** \overload */ int add( const char * pattern_r, Flags flags_r = Flags() ); /** Clear all results found so far. \ref defaultFlags remain active. */ void clear(); /** Clear all results and reset \ref defaultFlags. */ void reset( Flags flags_r = Flags() ) { clear(); setDefaultFlags( flags_r ); } public: /** The default flags passed to \c ::glob(). */ Flags defaultFlags() const { return _defaultFlags; } /** Set the default flags passed to \c ::glob(). */ void setDefaultFlags( Flags flags_r = Flags() ) { _defaultFlags = flags_r; } /** Returns the value returned by the last call to \c ::glob(). * \c Zero on successful completion. Otherwise \c GLOB_NOSPACE or \c GLOB_ABORTED * or \c GLOB_NOMATCH. */ int lastGlobReturn() const { return _lastGlobReturn; } public: /** Whether matches were found. */ bool empty() const { return ! ( _result && _result->gl_pathc ); } /** The number of matches found so far. */ size_type size() const { return( _result ? _result->gl_pathc : 0 ); } /** Iterator pointing to the first result. */ const_iterator begin() const { return( _result ? const_iterator( _result->gl_pathv ) : const_iterator() ); } /** Iterator pointing behind the last result. */ const_iterator end() const { return const_iterator(); } public: /** \name Collecting Glob results to some TOutputIterator * \code * std::list p; * Glob::collect( "/bin/a*.dat}", std::back_inserter(p) ); * Glob::collect( "/bin/a*{.xml,.xml.gz}", Glob::kBrace, std::back_inserter(p) ); * \endcode */ //@{ /** Write glob result to some \c OutputIterator. */ template static int collect( const Pathname & pattern_r, TOutputIterator result_r ) { return collect( pattern_r.c_str(), Flags(), result_r ); } /** \overload */ template static int collect( const std::string & pattern_r, TOutputIterator result_r ) { return collect( pattern_r.c_str(), Flags(), result_r ); } /** \overload */ template static int collect( const char * pattern_r, TOutputIterator result_r ) { return collect( pattern_r, Flags(), result_r ); } /** \overload With \ref Flags */ template static int collect( const Pathname & pattern_r, Flags flags_r, TOutputIterator result_r ) { return collect( pattern_r.c_str(), flags_r, result_r ); } /** \overload */ template static int collect( const std::string & pattern_r, Flags flags_r, TOutputIterator result_r ) { return collect( pattern_r.c_str(), flags_r, result_r ); } /** \overload */ template static int collect( const char * pattern_r, Flags flags_r, TOutputIterator result_r ) { Glob glob( pattern_r, flags_r ); if ( glob.lastGlobReturn() == 0 ) for_( it, glob.begin(), glob.end() ) (*result_r)++ = typename TOutputIterator::container_type::value_type(*it); return glob.lastGlobReturn(); } //@} private: Flags _defaultFlags; scoped_ptr< ::glob_t> _result; DefaultIntegral _lastGlobReturn; }; /////////////////////////////////////////////////////////////////// /** \relates Glob Stream output */ std::ostream & operator<<( std::ostream & str, const Glob & obj ); /** \relates Glob::const_iterator Stream output */ inline std::ostream & operator<<( std::ostream & str, const Glob::const_iterator & obj ) { return str << *obj; } ZYPP_DECLARE_OPERATORS_FOR_FLAGS( Glob::Flags ); /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace filesystem /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_GLOB_H libzypp-17.36.5/zypp/Globals.h000066400000000000000000000000371476576476200161540ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/HistoryLog.cc000066400000000000000000000237201476576476200170360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/HistoryLog.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; using std::string; namespace zypp { namespace { inline string timestamp() { return zypp::Date::now().form( HISTORY_LOG_DATE_FORMAT ); } inline string userAtHostname() { static char buf[256]; string result; char * tmp = ::cuserid(buf); if (tmp) { result = string(tmp); if (!::gethostname(buf, 255)) result += "@" + string(buf); } return result; } static std::string pidAndAppname() { static std::string _val; if ( _val.empty() ) { pid_t mypid = getpid(); zypp::Pathname p( "/proc/"+zypp::str::numstring(mypid)+"/exe" ); zypp::Pathname myname( zypp::filesystem::readlink( p ) ); _val += zypp::str::numstring(mypid); _val += ":"; _val += myname.basename(); } return _val; } static std::string cmdline() { static std::string _val; if ( _val.empty() ) { pid_t mypid = getpid(); { std::ifstream cmdlineStr( Pathname("/proc/"+zypp::str::numstring(mypid)+"/cmdline").c_str() ); char ch = 0; const char * sep = "'"; while ( cmdlineStr && cmdlineStr.get( ch ) ) { if ( sep ) { _val += sep; sep = nullptr; } switch ( ch ) { case '\0': _val += '\''; sep = " '"; break; case '\n': _val += ' '; break; case '\\': _val += '\\'; _val += '\\'; break; case '|': _val += '\\'; _val += '|'; break; default: _val += ch; break; } } } } return _val; } } // namespace namespace { const char _sep = '|'; std::ofstream _log; unsigned _refcnt = 0; Pathname _fname; Pathname _fnameLastFail; inline void openLog() { if ( _fname.empty() ) _fname = ZConfig::instance().historyLogFile(); _log.clear(); _log.open( _fname.asString().c_str(), std::ios::out|std::ios::app ); if( !_log && _fnameLastFail != _fname ) { ERR << "Could not open logfile '" << _fname << "'" << endl; _fnameLastFail = _fname; } } inline void closeLog() { _log.clear(); _log.close(); } inline void refUp() { if ( !_refcnt ) openLog(); ++_refcnt; } inline void refDown() { --_refcnt; if ( !_refcnt ) closeLog(); } } // namespace /////////////////////////////////////////////////////////////////// // // CLASS NAME : HistoryLog // /////////////////////////////////////////////////////////////////// HistoryLog::HistoryLog( const Pathname & rootdir ) { setRoot( rootdir ); refUp(); } HistoryLog::~HistoryLog() { refDown(); } void HistoryLog::setRoot( const Pathname & rootdir ) { if ( ! rootdir.absolute() ) return; if ( _refcnt ) closeLog(); _fname = ZConfig::instance().historyLogFile(); if ( _fname != "/dev/null" ) // no need to redirect /dev/null into the target _fname = rootdir / _fname; filesystem::assert_dir( _fname.dirname() ); MIL << "installation log file " << _fname << endl; if ( _refcnt ) openLog(); } const Pathname & HistoryLog::fname() { if ( _fname.empty() ) _fname = ZConfig::instance().historyLogFile(); return _fname; } ///////////////////////////////////////////////////////////////////////// void HistoryLog::comment( const string & comment, bool timestamp_r ) { if (comment.empty()) return; _log << "# "; if ( timestamp_r ) _log << timestamp() << " "; const char * s = comment.c_str(); const char * c = s; unsigned size = comment.size(); // ignore the last newline if (comment[size-1] == '\n') --size; for ( unsigned i = 0; i < size; ++i, ++c ) if ( *c == '\n' ) { _log << string( s, c + 1 - s ) << "# "; s = c + 1; } if ( s < c ) _log << std::string( s, c-s ); _log << endl; } ///////////////////////////////////////////////////////////////////////// void HistoryLog::stampCommand() { _log << timestamp() // 1 timestamp << _sep << HistoryActionID::STAMP_COMMAND.asString(true) // 2 action << _sep << userAtHostname() // 3 requested by << _sep << cmdline() // 4 command << _sep << str::escape(ZConfig::instance().userData(), _sep) // 6 userdata << endl; } void HistoryLog::install( const PoolItem & pi ) { if ( ! pi.isKind() ) return; const Package::constPtr p = asKind(pi.resolvable()); _log << timestamp() // 1 timestamp << _sep << HistoryActionID::INSTALL.asString(true) // 2 action << _sep << p->name() // 3 name << _sep << p->edition() // 4 evr << _sep << p->arch(); // 5 arch // ApplLow is what the solver selected on behalf of the user. if (pi.status().isByUser() || pi.status().isByApplLow() ) _log << _sep << userAtHostname(); // 6 requested by else if (pi.status().isByApplHigh()) _log << _sep << pidAndAppname(); else _log << _sep; _log << _sep << p->repoInfo().alias() // 7 repo alias << _sep << p->checksum().checksum() // 8 checksum << _sep << str::escape(ZConfig::instance().userData(), _sep) // 9 userdata << endl; } void HistoryLog::remove( const PoolItem & pi ) { if ( ! pi.isKind() ) return; const Package::constPtr p = asKind(pi.resolvable()); _log << timestamp() // 1 timestamp << _sep << HistoryActionID::REMOVE.asString(true) // 2 action << _sep << p->name() // 3 name << _sep << p->edition() // 4 evr << _sep << p->arch(); // 5 arch // ApplLow is what the solver selected on behalf of the user. if ( pi.status().isByUser() || pi.status().isByApplLow() ) _log << _sep << userAtHostname(); // 6 requested by else if (pi.status().isByApplHigh()) _log << _sep << pidAndAppname(); else _log << _sep; _log << _sep << str::escape(ZConfig::instance().userData(), _sep) // 7 userdata << endl; } ///////////////////////////////////////////////////////////////////////// void HistoryLog::addRepository(const RepoInfo & repo) { _log << timestamp() // 1 timestamp << _sep << HistoryActionID::REPO_ADD.asString(true) // 2 action << _sep << str::escape(repo.alias(), _sep) // 3 alias << _sep << str::escape(repo.url().asString(), _sep) // 4 primary URL << _sep << str::escape(ZConfig::instance().userData(), _sep) // 5 userdata << endl; } void HistoryLog::removeRepository(const RepoInfo & repo) { _log << timestamp() // 1 timestamp << _sep << HistoryActionID::REPO_REMOVE.asString(true) // 2 action << _sep << str::escape(repo.alias(), _sep) // 3 alias << _sep << str::escape(ZConfig::instance().userData(), _sep) // 4 userdata << endl; } void HistoryLog::modifyRepository( const RepoInfo & oldrepo, const RepoInfo & newrepo) { if (oldrepo.alias() != newrepo.alias()) { _log << timestamp() // 1 timestamp << _sep << HistoryActionID::REPO_CHANGE_ALIAS.asString(true) // 2 action << _sep << str::escape(oldrepo.alias(), _sep) // 3 old alias << _sep << str::escape(newrepo.alias(), _sep) // 4 new alias << _sep << str::escape(ZConfig::instance().userData(), _sep) // 5 userdata << endl; } if ( oldrepo.url() != newrepo.url() ) { _log << timestamp() // 1 timestamp << _sep << HistoryActionID::REPO_CHANGE_URL.asString(true) // 2 action << _sep << str::escape(oldrepo.url().asString(), _sep) // 3 old url << _sep << str::escape(newrepo.url().asString(), _sep) // 4 new url << _sep << str::escape(ZConfig::instance().userData(), _sep) // 5 userdata << endl; } } void HistoryLog::patchStateChange( const PoolItem & pi, ResStatus::ValidateValue oldstate ) { if ( ! pi.isKind() ) return; const Patch::constPtr p = asKind(pi.resolvable()); _log << timestamp() // 1 timestamp << _sep << HistoryActionID::PATCH_STATE_CHANGE.asString(true) // 2 action << _sep << p->name() // 3 name << _sep << p->edition() // 4 evr << _sep << p->arch() // 5 arch << _sep << p->repoInfo().alias() // 6 repo alias << _sep << p->severity() // 7 severity << _sep << p->category() // 8 category << _sep << ResStatus::validateValueAsString( oldstate ) // 9 old state << _sep << pi.status().validateValueAsString() // 10 new state << _sep << str::escape(ZConfig::instance().userData(), _sep) // 11 userdata << endl; } /////////////////////////////////////////////////////////////////// } // namespace zypp libzypp-17.36.5/zypp/HistoryLog.h000066400000000000000000000101751476576476200167000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/HistoryLog.h * */ #ifndef ZYPP_TARGET_COMMITLOG_H #define ZYPP_TARGET_COMMITLOG_H #include #include #include namespace zypp { class PoolItem; class RepoInfo; /////////////////////////////////////////////////////////////////// /// \class HistoryLog /// \brief Writing the zypp history file /// \ingroup g_ZyppHistory /// /// Reference counted signleton for writhing the zypp history file. /// The history file is opened on demand and closed when the last /// HistoryLog object drops its reference. Thus HistoryLog objects /// should be local to those functions, writing the log, and must /// not be stored permanently. /// /// \code /// some method () /// { /// PoolItem pi; /// ... /// HistoryLog().install(pi); /// ... /// HistoryLog().comment(someMessage); /// } /// \endcode /// /// \note Take care to set proper target root dir if needed. Either pass /// it via the constructor, or set it via setRoot(Pathname) method. /// The default location of the file is determined by /// \ref zypp::ZConfig::historyLogPath (default: \c /var/log/zypp/history). /// /// \todo The implementation as pseudo signleton is questionable. /// Use shared_ptr instead of handcrafted ref/unref. Manage multiple /// logs at different locations. /////////////////////////////////////////////////////////////////// class HistoryLog { HistoryLog( const HistoryLog & ); HistoryLog & operator=( const HistoryLog & ); public: /** * Constructor with an optional root directory. * * \param rootdir actual target root directory */ HistoryLog( const Pathname & rootdir = Pathname() ); ~HistoryLog(); /** * Set new root directory to the default history log file path. * * This path will be prepended to the default log file path. This should * be done where there is a potential that the target root has changed. * * \param root new root directory. */ static void setRoot( const Pathname & root ); /** * Get the current log file path. */ static const Pathname & fname(); /** * Log a comment (even multiline). * * \param comment the comment * \param timestamp whether to include a timestamp at the start of the comment */ void comment( const std::string & comment, bool timestamp = false ); /** Log info about the current process. */ void stampCommand(); /** * Log installation (or update) of a package. */ void install( const PoolItem & pi ); /** * Log removal of a package */ void remove( const PoolItem & pi ); /** * Log a newly added repository. * * \param repo info about the added repository */ void addRepository( const RepoInfo & repo ); /** * Log recently removed repository. * * \param repo info about the removed repository */ void removeRepository( const RepoInfo & repo ); /** * Log certain modifications to a repository. * * \param oldrepo info about the old repository * \param newrepo info about the new repository */ void modifyRepository( const RepoInfo & oldrepo, const RepoInfo & newrepo ); /** * Log state changes in patches * * \param oldstate info about the old state */ void patchStateChange( const PoolItem & pi, ResStatus::ValidateValue oldstate ); }; /////////////////////////////////////////////////////////////////// } // namespace zypp #endif // ZYPP_TARGET_COMMITLOG_H libzypp-17.36.5/zypp/HistoryLogData.cc000066400000000000000000000346131476576476200176330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/HistoryLogData.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { using parser::ParseException; /////////////////////////////////////////////////////////////////// // // class HistoryActionID // /////////////////////////////////////////////////////////////////// const HistoryActionID HistoryActionID::NONE (HistoryActionID::NONE_e); const HistoryActionID HistoryActionID::INSTALL (HistoryActionID::INSTALL_e); const HistoryActionID HistoryActionID::REMOVE (HistoryActionID::REMOVE_e); const HistoryActionID HistoryActionID::REPO_ADD (HistoryActionID::REPO_ADD_e); const HistoryActionID HistoryActionID::REPO_REMOVE (HistoryActionID::REPO_REMOVE_e); const HistoryActionID HistoryActionID::REPO_CHANGE_ALIAS (HistoryActionID::REPO_CHANGE_ALIAS_e); const HistoryActionID HistoryActionID::REPO_CHANGE_URL (HistoryActionID::REPO_CHANGE_URL_e); const HistoryActionID HistoryActionID::STAMP_COMMAND (HistoryActionID::STAMP_COMMAND_e); const HistoryActionID HistoryActionID::PATCH_STATE_CHANGE (HistoryActionID::PATCH_STATE_CHANGE_e); HistoryActionID::HistoryActionID(const std::string & strval_r) : _id(parse(strval_r)) {} HistoryActionID::ID HistoryActionID::parse( const std::string & strval_r ) { typedef std::map MapType; static MapType _table; if ( _table.empty() ) { // initialize it _table["install"] = INSTALL_e; _table["remove"] = REMOVE_e; _table["radd"] = REPO_ADD_e; _table["rremove"] = REPO_REMOVE_e; _table["ralias"] = REPO_CHANGE_ALIAS_e; _table["rurl"] = REPO_CHANGE_URL_e; _table["command"] = STAMP_COMMAND_e; _table["patch"] = PATCH_STATE_CHANGE_e; _table["NONE"] = _table["none"] = NONE_e; } MapType::const_iterator it = _table.find( strval_r ); if ( it != _table.end() ) return it->second; // else: WAR << "Unknown history action ID '" + strval_r + "'" << endl; return NONE_e; } const std::string & HistoryActionID::asString( bool pad ) const { typedef std::pair PairType; typedef std::map MapType; static MapType _table; if ( _table.empty() ) { // initialize it pad(7) (for now) _table[INSTALL_e] = PairType( "install" , "install" ); _table[REMOVE_e] = PairType( "remove" , "remove " ); _table[REPO_ADD_e] = PairType( "radd" , "radd " ); _table[REPO_REMOVE_e] = PairType( "rremove" , "rremove" ); _table[REPO_CHANGE_ALIAS_e] = PairType( "ralias" , "ralias " ); _table[REPO_CHANGE_URL_e] = PairType( "rurl" , "rurl " ); _table[STAMP_COMMAND_e] = PairType( "command" , "command" ); _table[PATCH_STATE_CHANGE_e]= PairType( "patch" , "patch " ); _table[NONE_e] = PairType( "NONE" , "NONE " ); } return( pad ? _table[_id].second : _table[_id].first ); } std::ostream & operator << (std::ostream & str, const HistoryActionID & id) { return str << id.asString(); } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // class HistoryLogData::Impl // /////////////////////////////////////////////////////////////////// class HistoryLogData::Impl { public: Impl( FieldVector & fields_r, size_type expect_r ) { _checkFields( fields_r, expect_r ); _field.swap( fields_r ); // For whatever reason writer is ' '-padding the action field // but we don't want to modify the vector before we moved it. _field[ACTION_INDEX] = str::trim( _field[ACTION_INDEX] ); _action = HistoryActionID( _field[ACTION_INDEX] ); } Impl( FieldVector & fields_r, HistoryActionID action_r, size_type expect_r ) { _checkFields( fields_r, expect_r ); // For whatever reason writer is ' '-padding the action field // but we don't want to modify the vector before we moved it. std::string trimmed( str::trim( fields_r[ACTION_INDEX] ) ); _action = HistoryActionID( trimmed ); if ( _action != action_r ) { ZYPP_THROW( ParseException( str::form( "Bad action id. Got %s, expected %s.", _action.asString().c_str(), action_r.asString().c_str() ) ) ); } _field.swap( fields_r ); // now adjust action field: _field[ACTION_INDEX] = trimmed; } void _checkFields( const FieldVector & fields_r, size_type expect_r ) { if ( expect_r < 2 ) // at least 2 fields (date and action) are required expect_r = 2; if ( fields_r.size() < expect_r ) { ZYPP_THROW( ParseException( str::form( "Bad number of fields. Got %zd, expected at least %zd.", fields_r.size(), expect_r ) ) ); } try { _date = Date( fields_r[DATE_INDEX], HISTORY_LOG_DATE_FORMAT ); } catch ( const std::exception & excpt ) { ZYPP_THROW( ParseException( excpt.what() ) ); // invalid date format } // _action handled later } public: FieldVector _field; Date _date; HistoryActionID _action; }; /////////////////////////////////////////////////////////////////// // // class HistoryLogData // /////////////////////////////////////////////////////////////////// HistoryLogData::HistoryLogData( FieldVector & fields_r, size_type expect_r ) : _pimpl( new Impl( fields_r, expect_r ) ) {} HistoryLogData::HistoryLogData( FieldVector & fields_r, HistoryActionID expectedId_r, size_type expect_r ) : _pimpl( new Impl( fields_r, expectedId_r, expect_r ) ) {} HistoryLogData::~HistoryLogData() {} HistoryLogData::Ptr HistoryLogData::create( FieldVector & fields_r ) { if ( fields_r.size() >= 2 ) { // str::trim( _field[ACTION_INDEX] ); switch ( HistoryActionID( str::trim( fields_r[ACTION_INDEX] ) ).toEnum() ) { #define OUTS(E,T) case HistoryActionID::E: return Ptr( new T( fields_r ) ); break; OUTS( INSTALL_e, HistoryLogDataInstall ); OUTS( REMOVE_e, HistoryLogDataRemove ); OUTS( REPO_ADD_e, HistoryLogDataRepoAdd ); OUTS( REPO_REMOVE_e, HistoryLogDataRepoRemove ); OUTS( REPO_CHANGE_ALIAS_e, HistoryLogDataRepoAliasChange ); OUTS( REPO_CHANGE_URL_e, HistoryLogDataRepoUrlChange ); OUTS( STAMP_COMMAND_e, HistoryLogDataStampCommand ); OUTS( PATCH_STATE_CHANGE_e, HistoryLogPatchStateChange ); #undef OUTS // intentionally no default: case HistoryActionID::NONE_e: break; } } // unknown action or invalid fields? Ctor will accept or throw. return Ptr( new HistoryLogData( fields_r ) ); } bool HistoryLogData::empty() const { return _pimpl->_field.empty(); } HistoryLogData::size_type HistoryLogData::size() const { return _pimpl->_field.size(); } HistoryLogData::const_iterator HistoryLogData::begin() const { return _pimpl->_field.begin(); } HistoryLogData::const_iterator HistoryLogData::end() const { return _pimpl->_field.end(); } const std::string & HistoryLogData::optionalAt( size_type idx_r ) const { static const std::string _empty; return( idx_r < size() ? _pimpl->_field[idx_r] : _empty ); } const std::string & HistoryLogData::at( size_type idx_r ) const { return _pimpl->_field.at( idx_r ); } Date HistoryLogData::date() const { return _pimpl->_date; } HistoryActionID HistoryLogData::action() const { return _pimpl->_action; } std::ostream & operator<<( std::ostream & str, const HistoryLogData & obj ) { return str << str::joinEscaped( obj.begin(), obj.end(), '|' ); } /////////////////////////////////////////////////////////////////// // class HistoryLogDataInstall /////////////////////////////////////////////////////////////////// HistoryLogDataInstall::HistoryLogDataInstall( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogDataInstall::name() const { return optionalAt( NAME_INDEX ); } Edition HistoryLogDataInstall::edition() const { return Edition( optionalAt( EDITION_INDEX ) ); } Arch HistoryLogDataInstall::arch() const { return Arch( optionalAt( ARCH_INDEX ) ); } std::string HistoryLogDataInstall::reqby() const { return optionalAt( REQBY_INDEX ); } std::string HistoryLogDataInstall::repoAlias() const { return optionalAt( REPOALIAS_INDEX ); } CheckSum HistoryLogDataInstall::checksum() const { return optionalAt( CHEKSUM_INDEX ); } std::string HistoryLogDataInstall::userdata() const { return optionalAt( USERDATA_INDEX ); } /////////////////////////////////////////////////////////////////// // class HistoryLogPatchStateChange /////////////////////////////////////////////////////////////////// HistoryLogPatchStateChange::HistoryLogPatchStateChange( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogPatchStateChange::name() const { return optionalAt( NAME_INDEX ); } Edition HistoryLogPatchStateChange::edition() const { return Edition( optionalAt( EDITION_INDEX ) ); } Arch HistoryLogPatchStateChange::arch() const { return Arch( optionalAt( ARCH_INDEX ) ); } std::string HistoryLogPatchStateChange::repoAlias() const { return optionalAt( REPOALIAS_INDEX ); } Patch::SeverityFlag HistoryLogPatchStateChange::severity() const { return Patch::severityFlag( optionalAt( SEVERITY_INDEX ) ); } Patch::Category HistoryLogPatchStateChange::category() const { return Patch::categoryEnum( optionalAt( CATEGORY_INDEX ) ); } std::string HistoryLogPatchStateChange::oldstate() const { return optionalAt( OLDSTATE_INDEX ); } std::string HistoryLogPatchStateChange::newstate() const { return optionalAt( NEWSTATE_INDEX ); } std::string HistoryLogPatchStateChange::userdata() const { return optionalAt( USERDATA_INDEX ); } /////////////////////////////////////////////////////////////////// // class HistoryLogDataRemove /////////////////////////////////////////////////////////////////// HistoryLogDataRemove::HistoryLogDataRemove( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogDataRemove::name() const { return optionalAt( NAME_INDEX ); } Edition HistoryLogDataRemove::edition() const { return Edition( optionalAt( EDITION_INDEX ) ); } Arch HistoryLogDataRemove::arch() const { return Arch( optionalAt( ARCH_INDEX ) ); } std::string HistoryLogDataRemove::reqby() const { return optionalAt( REQBY_INDEX ); } std::string HistoryLogDataRemove::userdata() const { return optionalAt( USERDATA_INDEX ); } /////////////////////////////////////////////////////////////////// // class HistoryLogDataRepoAdd /////////////////////////////////////////////////////////////////// HistoryLogDataRepoAdd::HistoryLogDataRepoAdd( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogDataRepoAdd::alias() const { return optionalAt( ALIAS_INDEX ); } Url HistoryLogDataRepoAdd::url() const { return optionalAt( URL_INDEX ); } std::string HistoryLogDataRepoAdd::userdata() const { return optionalAt( USERDATA_INDEX ); } /////////////////////////////////////////////////////////////////// // class HistoryLogDataRepoRemove /////////////////////////////////////////////////////////////////// HistoryLogDataRepoRemove::HistoryLogDataRepoRemove( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogDataRepoRemove::alias() const { return optionalAt( ALIAS_INDEX ); } std::string HistoryLogDataRepoRemove::userdata() const { return optionalAt( USERDATA_INDEX ); } /////////////////////////////////////////////////////////////////// // class HistoryLogDataRepoAliasChange /////////////////////////////////////////////////////////////////// HistoryLogDataRepoAliasChange::HistoryLogDataRepoAliasChange( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogDataRepoAliasChange::oldAlias() const { return optionalAt( OLDALIAS_INDEX ); } std::string HistoryLogDataRepoAliasChange::newAlias() const { return optionalAt( NEWALIAS_INDEX ); } std::string HistoryLogDataRepoAliasChange::userdata() const { return optionalAt( USERDATA_INDEX ); } /////////////////////////////////////////////////////////////////// // class HistoryLogDataRepoUrlChange /////////////////////////////////////////////////////////////////// HistoryLogDataRepoUrlChange::HistoryLogDataRepoUrlChange( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogDataRepoUrlChange::alias() const { return optionalAt( ALIAS_INDEX ); } Url HistoryLogDataRepoUrlChange::newUrl() const { return optionalAt( NEWURL_INDEX ); } std::string HistoryLogDataRepoUrlChange::userdata() const { return optionalAt( USERDATA_INDEX ); } /////////////////////////////////////////////////////////////////// // class HistoryLogDataStampCommand /////////////////////////////////////////////////////////////////// HistoryLogDataStampCommand::HistoryLogDataStampCommand( FieldVector & fields_r ) : HistoryLogData( fields_r ) {} std::string HistoryLogDataStampCommand::executedBy() const { return optionalAt( USER_INDEX ); } std::string HistoryLogDataStampCommand::command() const { return optionalAt( COMMAND_INDEX ); } std::string HistoryLogDataStampCommand::userdata() const { return optionalAt( USERDATA_INDEX ); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/HistoryLogData.h000066400000000000000000000422621476576476200174740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/HistoryLogData.h * */ #ifndef ZYPP_HISTORYLOGDATA_H_ #define ZYPP_HISTORYLOGDATA_H_ #include #include #include #include #include #include #include #include #define HISTORY_LOG_DATE_FORMAT "%Y-%m-%d %H:%M:%S" /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class HistoryActionID /// \brief Enumeration of known history actions. /// \ingroup g_EnumerationClass /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// struct HistoryActionID { static const HistoryActionID NONE ZYPP_API; static const HistoryActionID INSTALL ZYPP_API; static const HistoryActionID REMOVE ZYPP_API; static const HistoryActionID REPO_ADD ZYPP_API; static const HistoryActionID REPO_REMOVE ZYPP_API; static const HistoryActionID REPO_CHANGE_ALIAS ZYPP_API; static const HistoryActionID REPO_CHANGE_URL ZYPP_API; static const HistoryActionID STAMP_COMMAND ZYPP_API; static const HistoryActionID PATCH_STATE_CHANGE ZYPP_API; enum ID { NONE_e, INSTALL_e, REMOVE_e, REPO_ADD_e, REPO_REMOVE_e, REPO_CHANGE_ALIAS_e, REPO_CHANGE_URL_e, STAMP_COMMAND_e, PATCH_STATE_CHANGE_e }; HistoryActionID() : _id(NONE_e) {} HistoryActionID(ID id) : _id(id) {} explicit HistoryActionID(const std::string & strval_r); ID toEnum() const { return _id; } static HistoryActionID::ID parse(const std::string & strval_r); const std::string & asString(bool pad = false) const; private: ID _id; }; /** \relates HistoryActionID */ inline bool operator==( const HistoryActionID & lhs, const HistoryActionID & rhs ) { return lhs.toEnum() == rhs.toEnum(); } /** \relates HistoryActionID */ inline bool operator!=( const HistoryActionID & lhs, const HistoryActionID & rhs ) { return lhs.toEnum() != rhs.toEnum(); } /** \relates HistoryActionID */ std::ostream & operator << (std::ostream & str, const HistoryActionID & id); /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class HistoryLogData /// \brief A zypp history log line split into fields /// \ingroup g_ZyppHistory /// /// Each valid history log line starts with a date and HistoryActionID /// field. Subsequent fields depend on the kind of action. See derived /// classes for convenient access to those flields. /// /// HistoryLogData itself provides mostly generic access to the fields /// plain string values. Derived classes for well known entries tell /// /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; using FieldVector = std::vector; using size_type = FieldVector::size_type; using const_iterator = FieldVector::const_iterator; public: /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has not at least \a expect_r entries * \note 2 fields (date and action) are always required. */ explicit HistoryLogData( FieldVector & fields_r, size_type expect_r = 2 ); /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or not at least \a expect_r entries. * \note 2 fields (date and action) are always required. */ HistoryLogData( FieldVector & fields_r, HistoryActionID action_r, size_type expect_r = 2 ); /** Dtor */ virtual ~HistoryLogData(); /** Factory method creating HistoryLogData classes. * * Moves \a fields_r into a HistoryLogData or derived object, depending on the * HistoryActionID. For known action ids a coresponing HistoryLogData class * is created, to allow convenient access to the field values. For unknown * action ids a plain HistoryLogData object is created. \ref HistoryActionID * \ref NONE_e id used in this case. * * \throws ParseException if \a fields_r does not contain the required format. */ static Ptr create( FieldVector & fields_r ); public: /** Whether FieldVector is empty. */ bool empty() const; /** Number of fields in vector. */ size_type size() const; /** Iterator pointing to 1st element in vector (or end()). */ const_iterator begin() const; /** Iterator pointing behind the last element in vector. */ const_iterator end() const; /** Access (optional) field by number. * \returns an empty string if \a idx_r is out of range. * \see \ref at */ const std::string & optionalAt( size_type idx_r ) const; /** \overload */ const std::string & operator[]( size_type idx_r ) const { return optionalAt( idx_r ); } /** Access (required) field by number. * \throws std::out_of_range if \a idx_r is out of range. * \see \ref optionalAt */ const std::string & at( size_type idx_r ) const; public: enum Index ///< indices of known fields { DATE_INDEX = 0, ///< date ACTION_INDEX = 1, ///< HistoryActionID }; public: Date date() const; ///< date HistoryActionID action() const; ///< HistoryActionID (or \c NONE_e if unknown) public: class Impl; ///< Implementation class private: RWCOW_pointer _pimpl; ///< Pointer to implementation protected: HistoryLogData & operator=( const HistoryLogData & ); ///< no base class assign }; /** \relates HistoryLogData Stream output */ std::ostream & operator<<( std::ostream & str, const HistoryLogData & obj ); /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class HistoryLogDataInstall /// \brief A zypp history log line for an installed packaged. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogDataInstall : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogDataInstall( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, NAME_INDEX, ///< package name EDITION_INDEX, ///< package edition ARCH_INDEX, ///< package architecture REQBY_INDEX, ///< requested by (user@hostname, pid:appname, or empty (solver)) REPOALIAS_INDEX, ///< repository providing the package CHEKSUM_INDEX, ///< package checksum USERDATA_INDEX, ///< userdata/transactionID }; public: std::string name() const; ///< package name Edition edition() const; ///< package edition Arch arch() const; ///< package architecture std::string reqby() const; ///< requested by (user@hostname, pid:appname, or empty (solver)) std::string repoAlias() const; ///< repository providing the package CheckSum checksum() const; ///< package checksum std::string userdata() const; ///< userdata/transactionID }; //PATCH SEVERITY CATEGORY OLDSTATE NEWSTATE /////////////////////////////////////////////////////////////////// /// \class HistoryLogPatchStateChange /// \brief A zypp history log line for an installed packaged. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogPatchStateChange : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogPatchStateChange( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, NAME_INDEX, ///< patch name EDITION_INDEX, ///< patch edition ARCH_INDEX, ///< patch architecture REPOALIAS_INDEX, ///< repository providing the patch SEVERITY_INDEX, ///< patch severity CATEGORY_INDEX, ///< patch category OLDSTATE_INDEX, ///< the state of the patch before the change NEWSTATE_INDEX, ///< the state of the patch after the change USERDATA_INDEX, ///< userdata/transactionID }; public: std::string name() const; ///< package name Edition edition() const; ///< package edition Arch arch() const; ///< package architecture std::string repoAlias() const; ///< repository providing the package Patch::SeverityFlag severity() const; Patch::Category category() const; std::string oldstate() const; std::string newstate() const; std::string userdata() const; ///< userdata/transactionID }; /////////////////////////////////////////////////////////////////// /// \class HistoryLogDataRemove /// \brief A zypp history log line for a removed packge. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogDataRemove : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogDataRemove( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, NAME_INDEX, ///< package name EDITION_INDEX, ///< package edition ARCH_INDEX, ///< package architecture REQBY_INDEX, ///< requested by (user@hostname, pid:appname, or empty (solver)) USERDATA_INDEX, ///< userdata/transactionID }; public: std::string name() const; ///< package name Edition edition() const; ///< package edition Arch arch() const; ///< package architecture std::string reqby() const; ///< requested by (user@hostname, pid:appname, or empty (solver)) std::string userdata() const; ///< userdata/transactionID }; /////////////////////////////////////////////////////////////////// /// \class HistoryLogDataRepoAdd /// \brief A zypp history log line for an added repository. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogDataRepoAdd : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogDataRepoAdd( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, ALIAS_INDEX, ///< repository alias URL_INDEX, ///< repository url USERDATA_INDEX, ///< userdata/transactionID }; public: std::string alias() const; ///< repository alias Url url() const; ///< repository url std::string userdata() const; ///< userdata/transactionID }; /////////////////////////////////////////////////////////////////// /// \class HistoryLogDataRepoRemove /// \brief A zypp history log line for a removed repository. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogDataRepoRemove : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogDataRepoRemove( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, ALIAS_INDEX, ///< repository alias USERDATA_INDEX, ///< userdata/transactionID }; public: std::string alias() const; ///< repository alias std::string userdata() const; ///< userdata/transactionID }; /////////////////////////////////////////////////////////////////// /// \class HistoryLogDataRepoAliasChange /// \brief A zypp history log line for a repo alias change. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogDataRepoAliasChange : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogDataRepoAliasChange( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, OLDALIAS_INDEX, ///< repositories old alias NEWALIAS_INDEX, ///< repositories new alias USERDATA_INDEX, ///< userdata/transactionID }; public: std::string oldAlias() const; ///< repositories old alias std::string newAlias() const; ///< repositories new alias std::string userdata() const; ///< userdata/transactionID }; /////////////////////////////////////////////////////////////////// /// \class HistoryLogDataRepoUrlChange /// \brief A zypp history log line for a repo url change. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogDataRepoUrlChange : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogDataRepoUrlChange( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, ALIAS_INDEX, ///< repository alias NEWURL_INDEX, ///< repositories new url USERDATA_INDEX, ///< userdata/transactionID }; public: std::string alias() const; ///< repository alias Url newUrl() const; ///< repositories new url std::string userdata() const; ///< userdata/transactionID }; /////////////////////////////////////////////////////////////////// /// \class HistoryLogDataStampCommand /// \brief A zypp history log line identifying the program that /// triggered the following commit. /// \ingroup g_ZyppHistory /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogDataStampCommand : public HistoryLogData { public: using Ptr = shared_ptr; using constPtr = shared_ptr; /** Ctor \b moving \a FieldVector (via swap). * \throws ParseException if \a fields_r has the wrong \ref HistoryActionID or number of fields. */ HistoryLogDataStampCommand( FieldVector & fields_r ); public: enum Index ///< indices of known fields { DATE_INDEX = HistoryLogData::DATE_INDEX, ACTION_INDEX = HistoryLogData::ACTION_INDEX, USER_INDEX, ///< executed by user@hostname COMMAND_INDEX, ///< the commandline executed USERDATA_INDEX, ///< userdata/transactionID }; public: std::string executedBy() const; ///< executed by user@hostname std::string command() const; ///< the commandline executed std::string userdata() const; ///< userdata/transactionID }; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif /* ZYPP_HISTORYLOGDATA_H_ */ libzypp-17.36.5/zypp/IdString.cc000066400000000000000000000053761476576476200164650ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/IdString.cc * */ #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// const IdString IdString::Null ( sat::detail::noId ); const IdString IdString::Empty( sat::detail::emptyId ); ///////////////////////////////////////////////////////////////// IdString::IdString( const char * str_r ) : _id( ::pool_str2id( myPool().getPool(), str_r, /*create*/true ) ) {} IdString::IdString( const char * str_r, unsigned len_r ) : _id( ::pool_strn2id( myPool().getPool(), str_r, len_r, /*create*/true ) ) {} IdString::IdString( const std::string & str_r ) : IdString( str_r.c_str(), str_r.length() ) {} IdString::IdString( boost::string_ref str_r ) : IdString( str_r.data(), str_r.length() ) {} unsigned IdString::size() const { return ::strlen( c_str() ); } const char * IdString::c_str() const { return _id ? ::pool_id2str( myPool().getPool(), _id ) : ""; } int IdString::compare( const IdString & rhs ) const { if ( _id == rhs._id ) return 0; // Explicitly handle IdString::Null < "" if ( ! _id ) return -1; if ( ! rhs._id ) return 1; return ::strcmp( c_str(), rhs.c_str() ); } int IdString::compare( const char * rhs ) const { // Explicitly handle IdString::Null == (const char *)0 if ( ! _id ) return rhs ? -1 : 0; if ( ! rhs ) return _id ? 1 : 0; return ::strcmp( c_str(), rhs ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const IdString & obj ) { return str << obj.c_str(); } std::ostream & dumpOn( std::ostream & str, const IdString & obj ) { return str << '(' << obj.id() << ')' << obj.c_str(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/IdString.h000066400000000000000000000205521476576476200163200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/IdString.h * */ #ifndef ZYPP_SAT_IDSTR_H #define ZYPP_SAT_IDSTR_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class IdString; using IdStringSet = std::unordered_set; /////////////////////////////////////////////////////////////////// // // CLASS NAME : IdString // /** Access to the sat-pools string space. * * Construction from string will place a copy of the string in the * string space, if it is not already present. * * While comparison differs between \ref IdString::Null and \ref IdString::Empty * ( \c NULL and \c "" ), both are represented by an empty string \c "". */ class ZYPP_API IdString : protected sat::detail::PoolMember { public: using IdType = sat::detail::IdType; public: /** Default ctor, empty string. */ constexpr IdString() : _id( sat::detail::emptyId ) {} /** Ctor from id. */ constexpr explicit IdString( IdType id_r ) : _id( id_r ) {} /** Ctor from string. */ explicit IdString( const char * str_r ); /** Ctor from string (pointer,length). */ IdString( const char * str_r, unsigned len_r ); /** Ctor from string. */ explicit IdString( const std::string & str_r ); /** Ctor from boost::string_ref. */ explicit IdString( boost::string_ref str_r ); #ifdef __cpp_lib_string_view explicit IdString( std::string_view str_r ) : IdString( str_r.data(), str_r.size() ) {} #endif public: /** No or Null string ( Id \c 0 ). */ static const IdString Null; /** Empty string. */ static const IdString Empty; public: /** Evaluate in a boolean context ( != \c Null ). */ constexpr explicit operator bool() const { return _id; } /** Whether the string is empty. * This is true for \ref Null and \ref Empty. */ constexpr bool empty() const { return( _id == sat::detail::emptyId || _id == sat::detail::noId ); } /** The strings size. */ unsigned size() const; public: /** Conversion to const char * */ const char * c_str() const; /** Conversion to std::string */ std::string asString() const { return c_str(); } /** Explicit conversion to std::string */ explicit operator std::string() const { return asString(); } #ifdef __cpp_lib_string_view /** As \c std::string_view */ std::string_view asStringView() const { return { c_str(), size() }; } /** Explicit conversion to \c std::string_view */ explicit operator std::string_view() const { return asStringView(); } #endif public: /** Fast compare equal. */ bool compareEQ( const IdString & rhs ) const { return( _id == rhs.id() ); } /** Compare IdString returning -1,0,1. */ int compare( const IdString & rhs ) const; /** \overload */ int compare( const char * rhs ) const; /** \overload */ int compare( const std::string & rhs ) const { return compare( rhs.c_str() ); } public: /** Expert backdoor. */ IdType id() const { return _id; } private: IdType _id; }; /////////////////////////////////////////////////////////////////// /** \relates IdString Stream output */ std::ostream & operator<<( std::ostream & str, const IdString & obj ) ZYPP_API; /** \relates IdString Stream output */ std::ostream & dumpOn( std::ostream & str, const IdString & obj ) ZYPP_API; /** \relates IdString Equal */ inline bool operator==( const IdString & lhs, const IdString & rhs ) { return lhs.compareEQ( rhs ); } /** \overload */ inline bool operator==( const IdString & lhs, const char * rhs ) { return lhs.compare( rhs ) == 0; } /** \overload */ inline bool operator==( const IdString & lhs, const std::string & rhs ) { return lhs.compare( rhs ) == 0; } /** \overload */ inline bool operator==( const char * lhs, const IdString & rhs ) { return rhs.compare( lhs ) == 0; } /** \overload */ inline bool operator==( const std::string & lhs, const IdString & rhs ) { return rhs.compare( lhs ) == 0; } /** \relates IdString NotEqual */ inline bool operator!=( const IdString & lhs, const IdString & rhs ) { return ! lhs.compareEQ( rhs ); } /** \overload */ inline bool operator!=( const IdString & lhs, const char * rhs ) { return lhs.compare( rhs ) != 0; } /** \overload */ inline bool operator!=( const IdString & lhs, const std::string & rhs ) { return lhs.compare( rhs ) != 0; } /** \overload */ inline bool operator!=( const char * lhs, const IdString & rhs ) { return rhs.compare( lhs ) != 0; } /** \overload */ inline bool operator!=( const std::string & lhs, const IdString & rhs ) { return rhs.compare( lhs ) != 0; } /** \relates IdString Less */ inline bool operator<( const IdString & lhs, const IdString & rhs ) { return lhs.compare( rhs ) < 0; } /** \overload */ inline bool operator<( const IdString & lhs, const char * rhs ) { return lhs.compare( rhs ) < 0; } /** \overload */ inline bool operator<( const IdString & lhs, const std::string & rhs ) { return lhs.compare( rhs ) < 0; } /** \overload */ inline bool operator<( const char * lhs, const IdString & rhs ) { return rhs.compare( lhs ) >= 0; } /** \overload */ inline bool operator<( const std::string & lhs, const IdString & rhs ) { return rhs.compare( lhs ) >= 0; } /** \relates IdString LessEqual*/ inline bool operator<=( const IdString & lhs, const IdString & rhs ) { return lhs.compare( rhs ) <= 0; } /** \overload */ inline bool operator<=( const IdString & lhs, const char * rhs ) { return lhs.compare( rhs ) <= 0; } /** \overload */ inline bool operator<=( const IdString & lhs, const std::string & rhs ) { return lhs.compare( rhs ) <= 0; } /** \overload */ inline bool operator<=( const char * lhs, const IdString & rhs ) { return rhs.compare( lhs ) > 0; } /** \overload */ inline bool operator<=( const std::string & lhs, const IdString & rhs ) { return rhs.compare( lhs ) > 0; } /** \relates IdString Greater */ inline bool operator>( const IdString & lhs, const IdString & rhs ) { return lhs.compare( rhs ) > 0; } /** \overload */ inline bool operator>( const IdString & lhs, const char * rhs ) { return lhs.compare( rhs ) > 0; } /** \overload */ inline bool operator>( const IdString & lhs, const std::string & rhs ) { return lhs.compare( rhs ) > 0; } /** \overload */ inline bool operator>( const char * lhs, const IdString & rhs ) { return rhs.compare( lhs ) <= 0; } /** \overload */ inline bool operator>( const std::string & lhs, const IdString & rhs ) { return rhs.compare( lhs ) <= 0; } /** \relates IdString GreaterEqual */ inline bool operator>=( const IdString & lhs, const IdString & rhs ) { return lhs.compare( rhs ) >= 0; } /** \overload */ inline bool operator>=( const IdString & lhs, const char * rhs ) { return lhs.compare( rhs ) >= 0; } /** \overload */ inline bool operator>=( const IdString & lhs, const std::string & rhs ) { return lhs.compare( rhs ) >= 0; } /** \overload */ inline bool operator>=( const char * lhs, const IdString & rhs ) { return rhs.compare( lhs ) < 0; } /** \overload */ inline bool operator>=( const std::string & lhs, const IdString & rhs ) { return rhs.compare( lhs ) < 0; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// ZYPP_DEFINE_ID_HASHABLE( ::zypp::IdString ); #endif // ZYPP_SAT_IDSTR_H libzypp-17.36.5/zypp/IdStringType.h000066400000000000000000000360161476576476200171640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/IdStringType.h * */ #ifndef ZYPP_IDSTRINGTYPE_H #define ZYPP_IDSTRINGTYPE_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : IdStringType // /** Base class for creating \ref IdString based types. * * Just by deriving from \ref IdStringType a class provides all * the operations an \ref IdString does. (incl. conversion to string types, * comparison of string types and stream output). * * To disable any comparison, declare (but do not define) \ref _doCompare * in your class. * \code * class NoCompare : public IdStringType * { * private: * static int _doCompare( const char * lhs, const char * rhs ); * * }; * \endcode * * If you need a different than the default lexicographical * order, write your own \ref _doCompare. * * \code * // uses default lexicographical order * class CaseCmp : public IdStringType * { * public: * CaseCmp() {} * explicit CaseCmp( const char * cstr_r ) : _str( cstr_r ) {} * private: * friend class IdStringType; * IdString _str; * }; * * // uses case insensitive comparison order * class NoCaseCmp : public IdStringType * { * public: * NoCaseCmp() {} * explicit NoCaseCmp( const char * cstr_r ) : _str( cstr_r ) {} * private: * static int _doCompare( const char * lhs, const char * rhs ) * { * if ( lhs == rhs ) return 0; * if ( lhs && rhs ) return ::strcasecmp( lhs, rhs ); * return( lhs ? 1 : -1 ); * } * private: * friend class IdStringType; * IdString _str; * }; * * CaseCmp ca( "a" ); * NoCaseCmp na( "a" ); * DBG << "ca == a ? " << (ca == "a") << endl; // ca == a ? 1 * DBG << "ca == A ? " << (ca == "A") << endl; // ca == A ? 0 * DBG << "na == a ? " << (na == "a") << endl; // na == a ? 1 * DBG << "na == A ? " << (na == "A") << endl; // na == A ? 1 * \endcode * \todo allow redefinition of order vis _doCompare not only for char* but on any level * \ingroup g_CRTP */ template class IdStringType : protected sat::detail::PoolMember { public: using IdType = IdString::IdType; protected: IdStringType() = default; IdStringType(const IdStringType &) = default; IdStringType &operator=(const IdStringType &) = default; IdStringType(IdStringType &&) noexcept = default; IdStringType &operator=(IdStringType &&) noexcept = default; ~IdStringType() = default; private: const Derived & self() const { return *static_cast( this ); } public: IdString idStr() const { return self()._str; } bool empty() const { return idStr().empty(); } unsigned size() const { return idStr().size(); } const char * c_str() const { return idStr().c_str(); } std::string asString() const { return idStr().asString(); } #ifdef __cpp_lib_string_view std::string_view asStringView() const { return idStr().asStringView(); } explicit operator std::string_view() const { return asStringView(); } #endif IdType id() const { return idStr().id(); } public: /** Evaluate in a boolean context ( ! empty() ). */ explicit operator bool() const { return ! empty(); } /** Explicit conversion to IdString */ explicit operator IdString() const { return idStr(); } /** Explicit conversion to std::string */ explicit operator std::string() const { return asString(); } public: // - break it down to idString/const char* <=> idString/cont char* // - handle idString(0)/NULL being the least value // - everything else goes to _doCompare (no NULL) static int compare( const Derived & lhs, const Derived & rhs ) { return compare( lhs.idStr(), rhs.idStr() ); } static int compare( const Derived & lhs, const IdString & rhs ) { return compare( lhs.idStr(), rhs ); } static int compare( const Derived & lhs, const std::string & rhs ) { return compare( lhs.idStr(), rhs.c_str() ); } static int compare( const Derived & lhs, const char * rhs ) { return compare( lhs.idStr(), rhs );} static int compare( const IdString & lhs, const Derived & rhs ) { return compare( lhs, rhs.idStr() ); } static int compare( const IdString & lhs, const IdString & rhs ) { return lhs == rhs ? 0 : Derived::_doCompare( (lhs ? lhs.c_str() : (const char *)0 ), (rhs ? rhs.c_str() : (const char *)0 ) ); } static int compare( const IdString & lhs, const std::string & rhs ) { return compare( lhs, rhs.c_str() ); } static int compare( const IdString & lhs, const char * rhs ) { return Derived::_doCompare( (lhs ? lhs.c_str() : (const char *)0 ), rhs ); } static int compare( const std::string & lhs, const Derived & rhs ) { return compare( lhs.c_str(), rhs.idStr() ); } static int compare( const std::string & lhs, const IdString & rhs ) { return compare( lhs.c_str(), rhs ); } static int compare( const std::string & lhs, const std::string & rhs ) { return compare( lhs.c_str(), rhs.c_str() ); } static int compare( const std::string & lhs, const char * rhs ) { return compare( lhs.c_str(), rhs ); } static int compare( const char * lhs, const Derived & rhs ) { return compare( lhs, rhs.idStr() ); } static int compare( const char * lhs, const IdString & rhs ) { return Derived::_doCompare( lhs, (rhs ? rhs.c_str() : (const char *)0 ) ); } static int compare( const char * lhs, const std::string & rhs ) { return compare( lhs, rhs.c_str() ); } static int compare( const char * lhs, const char * rhs ) { return Derived::_doCompare( lhs, rhs ); } public: int compare( const Derived & rhs ) const { return compare( idStr(), rhs.idStr() ); } int compare( const IdStringType & rhs ) const { return compare( idStr(), rhs.idStr() ); } int compare( const IdString & rhs ) const { return compare( idStr(), rhs ); } int compare( const std::string & rhs ) const { return compare( idStr(), rhs.c_str() ); } int compare( const char * rhs ) const { return compare( idStr(), rhs ); } private: static inline int _doCompare( const char * lhs, const char * rhs ) ZYPP_API { if ( ! lhs ) return rhs ? -1 : 0; return rhs ? ::strcmp( lhs, rhs ) : 1; } }; /////////////////////////////////////////////////////////////////// /** \relates IdStringType Stream output */ template inline std::ostream & operator<<( std::ostream & str, const IdStringType & obj ) { return str << obj.c_str(); } /** \relates IdStringType Equal */ template inline bool operator==( const IdStringType & lhs, const IdStringType & rhs ) { return lhs.compare( rhs ) == 0; } /** \overload */ template inline bool operator==( const IdStringType & lhs, const IdString & rhs ) { return lhs.compare( rhs ) == 0; } /** \overload */ template inline bool operator==( const IdStringType & lhs, const char * rhs ) { return lhs.compare( rhs ) == 0; } /** \overload */ template inline bool operator==( const IdStringType & lhs, const std::string & rhs ) { return lhs.compare( rhs ) == 0; } /** \overload */ template inline bool operator==( const IdString & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) == 0; } /** \overload */ template inline bool operator==( const char * lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) == 0; } /** \overload */ template inline bool operator==( const std::string & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) == 0; } /** \relates IdStringType NotEqual */ template inline bool operator!=( const IdStringType & lhs, const IdStringType & rhs ) { return lhs.compare( rhs ) != 0; } /** \overload */ template inline bool operator!=( const IdStringType & lhs, const IdString & rhs ) { return lhs.compare( rhs ) != 0; } /** \overload */ template inline bool operator!=( const IdStringType & lhs, const char * rhs ) { return lhs.compare( rhs ) != 0; } /** \overload */ template inline bool operator!=( const IdStringType & lhs, const std::string & rhs ) { return lhs.compare( rhs ) != 0; } /** \overload */ template inline bool operator!=( const IdString & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) != 0; } /** \overload */ template inline bool operator!=( const char * lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) != 0; } /** \overload */ template inline bool operator!=( const std::string & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) != 0; } /** \relates IdStringType Less */ template inline bool operator<( const IdStringType & lhs, const IdStringType & rhs ) { return lhs.compare( rhs ) < 0; } /** \overload */ template inline bool operator<( const IdStringType & lhs, const IdString & rhs ) { return lhs.compare( rhs ) < 0; } /** \overload */ template inline bool operator<( const IdStringType & lhs, const char * rhs ) { return lhs.compare( rhs ) < 0; } /** \overload */ template inline bool operator<( const IdStringType & lhs, const std::string & rhs ) { return lhs.compare( rhs ) < 0; } /** \overload */ template inline bool operator<( const IdString & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) >= 0; } /** \overload */ template inline bool operator<( const char * lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) >= 0; } /** \overload */ template inline bool operator<( const std::string & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) >= 0; } /** \relates IdStringType LessEqual */ template inline bool operator<=( const IdStringType & lhs, const IdStringType & rhs ) { return lhs.compare( rhs ) <= 0; } /** \overload */ template inline bool operator<=( const IdStringType & lhs, const IdString & rhs ) { return lhs.compare( rhs ) <= 0; } /** \overload */ template inline bool operator<=( const IdStringType & lhs, const char * rhs ) { return lhs.compare( rhs ) <= 0; } /** \overload */ template inline bool operator<=( const IdStringType & lhs, const std::string & rhs ) { return lhs.compare( rhs ) <= 0; } /** \overload */ template inline bool operator<=( const IdString & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) > 0; } /** \overload */ template inline bool operator<=( const char * lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) > 0; } /** \overload */ template inline bool operator<=( const std::string & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) > 0; } /** \relates IdStringType Greater */ template inline bool operator>( const IdStringType & lhs, const IdStringType & rhs ) { return lhs.compare( rhs ) > 0; } /** \overload */ template inline bool operator>( const IdStringType & lhs, const IdString & rhs ) { return lhs.compare( rhs ) > 0; } /** \overload */ template inline bool operator>( const IdStringType & lhs, const char * rhs ) { return lhs.compare( rhs ) > 0; } /** \overload */ template inline bool operator>( const IdStringType & lhs, const std::string & rhs ) { return lhs.compare( rhs ) > 0; } /** \overload */ template inline bool operator>( const IdString & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) <= 0; } /** \overload */ template inline bool operator>( const char * lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) <= 0; } /** \overload */ template inline bool operator>( const std::string & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) <= 0; } /** \relates IdStringType GreaterEqual */ template inline bool operator>=( const IdStringType & lhs, const IdStringType & rhs ) { return lhs.compare( rhs ) >= 0; } /** \overload */ template inline bool operator>=( const IdStringType & lhs, const IdString & rhs ) { return lhs.compare( rhs ) >= 0; } /** \overload */ template inline bool operator>=( const IdStringType & lhs, const char * rhs ) { return lhs.compare( rhs ) >= 0; } /** \overload */ template inline bool operator>=( const IdStringType & lhs, const std::string & rhs ) { return lhs.compare( rhs ) >= 0; } /** \overload */ template inline bool operator>=( const IdString & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) < 0; } /** \overload */ template inline bool operator>=( const char * lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) < 0; } /** \overload */ template inline bool operator>=( const std::string & lhs, const IdStringType & rhs ) { return rhs.compare( lhs ) < 0; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_IDSTRINGTYPE_H libzypp-17.36.5/zypp/InstanceId.cc000066400000000000000000000073061476576476200167560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/InstanceId.cc * */ //#include //#include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// std::string InstanceId::getIdFor( sat::Solvable slv_r ) const { if ( ! slv_r ) return std::string(); std::string ret( _namespace ); if ( ! ret.empty() ) ret += ':'; if ( slv_r.isKind() ) // libsolv uses no namespace in SrcPackage ident! { ret += ResKind::srcpackage.c_str(); ret += ':'; } ret += str::form( "%s-%s-%s.%s@%s", slv_r.ident().c_str(), slv_r.edition().version().c_str(), slv_r.edition().release().c_str(), slv_r.arch().c_str(), slv_r.repository().alias().c_str() ); return ret; } PoolItem InstanceId::findPoolItem( const std::string& str_r ) const { // [namespace:]--.@ std::string::size_type namespaceOff( _namespace.size() ); if ( namespaceOff ) { if ( ! str::hasPrefix( str_r, _namespace ) || str_r[namespaceOff] != ':' ) return PoolItem(); ++namespaceOff; // for the ':' } // check repo std::string::size_type rdelim( str_r.find( '@' ) ); if ( rdelim == std::string::npos ) return PoolItem(); Repository repo( sat::Pool::instance().reposFind( str_r.substr( rdelim+1) ) ); if ( ! repo ) return PoolItem(); // check n-v-r.a from behind std::string::size_type delim = str_r.rfind( '.', rdelim ); if ( delim == std::string::npos ) return PoolItem(); Arch arch( str_r.substr( delim+1, rdelim-delim-1 ) ); // v-r starts at one but last '-' rdelim = delim; delim = str_r.rfind( '-', rdelim ); if ( delim == std::string::npos ) return PoolItem(); if ( delim == rdelim-1 ) // supress an empty release rdelim = delim; delim = str_r.rfind( '-', delim-1 ); if ( delim == std::string::npos ) return PoolItem(); Edition ed( str_r.substr( delim+1, rdelim-delim-1 ) ); // eveythig before is name (except the leading ":") std::string identstring( str_r.substr( namespaceOff, delim-namespaceOff ) ); // now lookup in pool.. sat::Solvable::SplitIdent ident( (IdString(identstring)) ); ResPool pool( ResPool::instance() ); for_( it, pool.byIdentBegin( ident.kind(), ident.name() ), pool.byIdentEnd( ident.kind(), ident.name() ) ) { sat::Solvable solv( (*it).satSolvable() ); if ( solv.repository() == repo && solv.arch() == arch && solv.edition() == ed ) { return *it; } } return PoolItem(); } bool InstanceId::isSystemId( const std::string& str_r ) const { return str::hasSuffix( str_r, Repository::systemRepoAlias() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/InstanceId.h000066400000000000000000000071521476576476200166170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/InstanceId.h * */ #ifndef ZYPP_INSTANCEID_H #define ZYPP_INSTANCEID_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : InstanceId // /** * Build string to identify/retrieve a specific \a Solvable. * * "[:]--.@" * * Any namespace that prepends the InstanceIds must be * passed to the ctor. Conversion to/from instanceId can * be done via function call \c operator(). * * \code * InstanceId instanceId( "SUSE:" ); // using a namespace * * ResPool pool( ResPool::instance() ); * for_( it, pool.begin(), pool.end() ) * { * std::cout << instanceId(*it) << endl; * } * \endcode */ class ZYPP_API InstanceId { public: /** Default ctor empty empty namespace */ InstanceId() {} /** Ctor taking namespace */ InstanceId( std::string namespace_r ) : _namespace(std::move( namespace_r )) {} public: /** \ref Solvable to \ref InstanceId string. */ std::string getIdFor( sat::Solvable slv_r ) const; /** \ref PoolItem to \ref InstanceId string. */ std::string getIdFor( const PoolItem & pi_r ) const { return getIdFor( pi_r.satSolvable() ); } /** \ref InstanceId string to \ref Solvable. */ sat::Solvable findSolvable( const std::string &str_r ) const { return findPoolItem( str_r ).satSolvable(); } /** \ref InstanceId string to \ref PoolItem. */ PoolItem findPoolItem( const std::string& str_r ) const; public: /** \ref Solvable to \ref InstanceId string. */ std::string operator()( sat::Solvable slv_r ) const { return getIdFor( slv_r ); } /** \ref PoolItem to \ref InstanceId string. */ std::string operator()( const PoolItem & pi_r ) const { return getIdFor( pi_r ); } /** \ref InstanceId string to \ref PoolItem. */ PoolItem operator()( const std::string &str_r ) const { return findPoolItem( str_r ); } /** Quick test whether the InstanceId string would refer * to a system (installed) Solvable. */ bool isSystemId( const std::string& str_r ) const; public: /** The namespace in use. */ const std::string & getNamespace() const { return _namespace; } /** Set a new namespace. */ void setNamespace( const std::string & namespace_r ) { _namespace = namespace_r; } /** Set no (empty) namespace. */ void unsetNamespace() { _namespace.clear(); } private: std::string _namespace; }; ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_INSTANCEID_H libzypp-17.36.5/zypp/KVMap.h000066400000000000000000000000331476576476200155430ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/KeyContext.h000066400000000000000000000010151476576476200166630ustar00rootroot00000000000000#ifndef KEYCONTEXT_H_ #define KEYCONTEXT_H_ #include namespace zypp { struct KeyContext { public: KeyContext(){} KeyContext( const RepoInfo & repoinfo ) : _repoInfo( repoinfo ) {} /** Is the context unknown? */ bool empty() const { return _repoInfo.alias().empty(); } public: const RepoInfo repoInfo() const { return _repoInfo; } void setRepoInfo(const RepoInfo & repoinfo) { _repoInfo = repoinfo; } private: RepoInfo _repoInfo; }; } #endif /*KEYCONTEXT_H_*/ libzypp-17.36.5/zypp/KeyManager.h000066400000000000000000000000441476576476200166120ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/KeyRing.cc000066400000000000000000000200561476576476200163020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/KeyRing.cc * */ #include "zypp_detail/keyring_p.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // JobReport::instance #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::KeyRing" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(KeyRing); namespace { KeyRing::DefaultAccept _keyRingDefaultAccept( KeyRing::ACCEPT_NOTHING ); } KeyRing::DefaultAccept KeyRing::defaultAccept() { return _keyRingDefaultAccept; } void KeyRing::setDefaultAccept( DefaultAccept value_r ) { MIL << "Set new KeyRing::DefaultAccept: " << value_r << endl; _keyRingDefaultAccept = value_r; } void KeyRingReport::infoVerify( const std::string & file_r, const PublicKeyData & keyData_r, const KeyContext & keycontext ) {} bool KeyRingReport::askUserToAcceptUnsignedFile( const std::string & file, const KeyContext & keycontext ) { return _keyRingDefaultAccept.testFlag( KeyRing::ACCEPT_UNSIGNED_FILE ); } KeyRingReport::KeyTrust KeyRingReport::askUserToAcceptKey( const PublicKey & key, const KeyContext & keycontext ) { if ( _keyRingDefaultAccept.testFlag( KeyRing::TRUST_KEY_TEMPORARILY ) ) return KEY_TRUST_TEMPORARILY; if ( _keyRingDefaultAccept.testFlag( KeyRing::TRUST_AND_IMPORT_KEY ) ) return KEY_TRUST_AND_IMPORT; return KEY_DONT_TRUST; } bool KeyRingReport::askUserToAcceptUnknownKey( const std::string & file, const std::string & id, const KeyContext & keycontext ) { return _keyRingDefaultAccept.testFlag( KeyRing::ACCEPT_UNKNOWNKEY ); } bool KeyRingReport::askUserToAcceptVerificationFailed( const std::string & file, const PublicKey & key, const KeyContext & keycontext ) { return _keyRingDefaultAccept.testFlag( KeyRing::ACCEPT_VERIFICATION_FAILED ); } bool KeyRingReport::askUserToAcceptPackageKey(const PublicKey &key_r, const KeyContext &keycontext_r) { UserData data(ACCEPT_PACKAGE_KEY_REQUEST); data.set("PublicKey", key_r); data.set("KeyContext", keycontext_r); report(data); if ( data.hasvalue("TrustKey") ) return data.get("TrustKey"); return false; } void KeyRingReport::reportNonImportedKeys(const std::set &keys_r) { UserData data(KEYS_NOT_IMPORTED_REPORT); data.set("Keys", keys_r); report(data); } void KeyRingReport::reportAutoImportKey( const std::list & keyDataList_r, const PublicKeyData & keySigning_r, const KeyContext &keyContext_r ) { UserData data { REPORT_AUTO_IMPORT_KEY }; data.set( "KeyDataList", keyDataList_r ); data.set( "KeySigning", keySigning_r ); data.set( "KeyContext", keyContext_r ); report( data ); } namespace { /// Handle signal emission from within KeyRing::Impl::importKey struct ImportKeyCBHelper { void operator()( const PublicKey & key_r ) { try { _rpmdbEmitSignal->trustedKeyAdded( key_r ); _emitSignal->trustedKeyAdded( key_r ); } catch ( const Exception & excp ) { ERR << "Could not import key into rpmdb: " << excp << endl; // TODO: JobReport as hotfix for bsc#1057188; should bubble up and go through some callback JobReport::error( excp.asUserHistory() ); } } private: callback::SendReport _rpmdbEmitSignal; callback::SendReport _emitSignal; }; } // namespace KeyRing::Impl::Impl(const filesystem::Pathname &baseTmpDir) : KeyRingImpl( baseTmpDir ) { MIL << "Current KeyRing::DefaultAccept: " << _keyRingDefaultAccept << std::endl; sigTrustedKeyAdded ().connect ([]( const PublicKey &key ){ ImportKeyCBHelper emit; emit(key); }); sigTrustedKeyRemoved ().connect ([]( const PublicKey &key ){ try { callback::SendReport rpmdbEmitSignal; rpmdbEmitSignal->trustedKeyRemoved( key ); callback::SendReport emitSignal; emitSignal->trustedKeyRemoved( key ); } catch ( const Exception & excp ) { ERR << "Could not delete key from rpmmdb: " << excp << endl; // TODO: JobReport as hotfix for bsc#1057188; should bubble up and go through some callback JobReport::error( excp.asUserHistory() ); } }); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : KeyRing // /////////////////////////////////////////////////////////////////// KeyRing::KeyRing( const Pathname & baseTmpDir ) : _pimpl( new Impl( baseTmpDir ) ) {} KeyRing::~KeyRing() {} KeyRing::Impl &KeyRing::pimpl() { return *_pimpl; } void KeyRing::allowPreload( bool yesno_r ) { _pimpl->allowPreload( yesno_r ); } void KeyRing::importKey( const PublicKey & key, bool trusted ) { _pimpl->importKey( key, trusted ); } void KeyRing::multiKeyImport( const Pathname & keyfile_r, bool trusted_r ) { _pimpl->multiKeyImport( keyfile_r, trusted_r ); } std::string KeyRing::readSignatureKeyId( const Pathname & signature ) { return _pimpl->readSignatureKeyId( signature ); } void KeyRing::deleteKey( const std::string & id, bool trusted ) { _pimpl->deleteKey( id, trusted ); } std::list KeyRing::publicKeys() { return _pimpl->publicKeys(); } std:: list KeyRing::trustedPublicKeys() { return _pimpl->trustedPublicKeys(); } std::list KeyRing::publicKeyData() { return _pimpl->publicKeyData(); } std::list KeyRing::trustedPublicKeyData() { return _pimpl->trustedPublicKeyData(); } PublicKeyData KeyRing::publicKeyData( const std::string &id_r ) { return _pimpl->publicKeyExists( id_r ); } PublicKeyData KeyRing::trustedPublicKeyData(const std::string &id_r) { return _pimpl->trustedPublicKeyExists( id_r ); } bool KeyRing::verifyFileSignature( const Pathname & file, const Pathname & signature ) { return _pimpl->verifyFileSignature( file, signature ); } bool KeyRing::verifyFileTrustedSignature( const Pathname & file, const Pathname & signature ) { return _pimpl->verifyFileTrustedSignature( file, signature ); } void KeyRing::dumpPublicKey( const std::string & id, bool trusted, std::ostream & stream ) { _pimpl->dumpPublicKey( id, trusted, stream ); } PublicKey KeyRing::exportPublicKey( const PublicKeyData & keyData ) { return _pimpl->exportPublicKey( keyData ); } PublicKey KeyRing::exportTrustedPublicKey( const PublicKeyData & keyData ) { return _pimpl->exportTrustedPublicKey( keyData ); } bool KeyRing::isKeyTrusted( const std::string & id ) { return _pimpl->isKeyTrusted( id ); } bool KeyRing::isKeyKnown( const std::string & id ) { return _pimpl->isKeyKnown( id ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/KeyRing.h000066400000000000000000000265121476576476200161470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/KeyRing.h * */ #ifndef ZYPP_KEYRING_H #define ZYPP_KEYRING_H #include #include #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(KeyRing); /** Callbacks from signature verification workflow. * * Per default all methods answer \c false. This may be canged * by calling \ref KeyRing::setDefaultAccept. * \code * KeyRing::setDefaultAccept( KeyRing::ACCEPT_UNSIGNED_FILE | KeyRing::ACCEPT_VERIFICATION_FAILED ); * \endcode * \see \ref KeyRing */ struct ZYPP_API KeyRingReport : public callback::ReportBase { /** * User reply options for the askUserToTrustKey callback. * * \param filedes Name of the file (repo alias) or filename if not available */ enum KeyTrust { /** * User has chosen not to trust the key. */ KEY_DONT_TRUST = 0, /** * This basically means, we knew the key, but it was not trusted. User * has chosen to continue, but not import the key. */ KEY_TRUST_TEMPORARILY, /** * Import the key. * This means saving the key in the trusted database so next run it will appear as trusted. * Nothing to do with KEY_TRUST_TEMPORARILY, as you CAN trust a key without importing it, * basically you will be asked every time again. * There are programs who prefer to manage the trust keyring on their own and use trustKey * without importing it into rpm. */ KEY_TRUST_AND_IMPORT }; /** * Ask user to trust and/or import the key to trusted keyring. * \see KeyTrust */ virtual KeyTrust askUserToAcceptKey( const PublicKey &key, const KeyContext &keycontext = KeyContext() ); /** Informal callback showing the trusted key that will be used for verification. */ virtual void infoVerify( const std::string & file_r, const PublicKeyData & keyData_r, const KeyContext &keycontext = KeyContext() ); virtual bool askUserToAcceptUnsignedFile( const std::string &file, const KeyContext &keycontext = KeyContext() ); /** * we DONT know the key, only its id, but we have never seen it, the difference * with trust key is that if you dont have it, you can't import it later. * The answer means continue yes or no? * */ virtual bool askUserToAcceptUnknownKey( const std::string &file, const std::string &id, const KeyContext &keycontext = KeyContext() ); /** * The file \ref filedesc is signed but the verification failed * * \param filedesc Filename or its description. */ virtual bool askUserToAcceptVerificationFailed( const std::string &file, const PublicKey &key, const KeyContext &keycontext = KeyContext() ); /** * Ask user to trust and/or import the package key to trusted keyring, using ReportBase::report * * The UserData object will have the following fields: * UserData::type \ref ACCEPT_PACKAGE_KEY_REQUEST * "PublicKey" The PublicKey to be accepted * "KeyContext" The KeyContext * * Userdata accepted: * "TrustKey" bool user can either trust or not trust the key * * \see KeyTrust * \sa ReportBase::report * \note this is a non virtual function and will use ReportBase::report to send the report. * */ bool askUserToAcceptPackageKey( const PublicKey &key_r, const KeyContext &keycontext_r = KeyContext() ); /** \relates askUserToAcceptPackageKey generic reports UserData::type */ constexpr static const char * ACCEPT_PACKAGE_KEY_REQUEST = "KeyRingReport/AcceptPackageKey"; /** * Notify the user about keys that were not imported from the * rpm key database into zypp keyring * * The UserData object will have the following fields: * UserData::type \ref KEYS_NOT_IMPORTED_REPORT * std::set "Keys" set of keys that were not imported * */ void reportNonImportedKeys( const std::set &keys_r ); /** \relates reportNonImportedKeys generic reports UserData::type */ constexpr static const char *KEYS_NOT_IMPORTED_REPORT = "KeyRingReport/KeysNotImported"; /** * Notify that a repository auto imported new package signing keys. * * To auto import new package signing keys, the repositories metadata must be * signed by an already trusted key. * * The UserData object will have the following fields: * UserData::type \ref REPORT_AUTO_IMPORT_KEY * "KeyDataList" List of KeyData to import * "KeySigning" KeyData of signing key * "KeyContext" The KeyContext */ void reportAutoImportKey( const std::list & keyDataList_r, const PublicKeyData & keySigning_r, const KeyContext &keyContext_r ); /** \relates reportAutoImportKey generic reports UserData::type */ constexpr static const char *REPORT_AUTO_IMPORT_KEY = "KeyRingReport/reportAutoImportKey"; }; struct ZYPP_API KeyRingSignals : public callback::ReportBase { virtual void trustedKeyAdded( const PublicKey &/*key*/ ) {} virtual void trustedKeyRemoved( const PublicKey &/*key*/ ) {} }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : KeyRing // /** Gpg key handling. * */ class ZYPP_API KeyRing : public base::ReferenceCounted, private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const KeyRing & obj ); public: /** \name Default answers in verification workflow. * Per default all answers are \c false. */ //@{ /** \ref DefaultAccept flags (\see \ref base::Flags) are used to * define the default callback answers during signature verification. * \code * KeyRing::setDefaultAccept( KeyRing::ACCEPT_UNSIGNED_FILE | ACCEPT_VERIFICATION_FAILED ); * \endcode * \see \ref KeyRingReport. */ enum DefaultAcceptBits { ACCEPT_NOTHING = 0x0000, ACCEPT_UNSIGNED_FILE = 0x0001, ACCEPT_UNKNOWNKEY = 0x0002, TRUST_KEY_TEMPORARILY = 0x0004, TRUST_AND_IMPORT_KEY = 0x0008, ACCEPT_VERIFICATION_FAILED = 0x0010, }; ZYPP_DECLARE_FLAGS( DefaultAccept, DefaultAcceptBits ); /** Get the active accept bits. */ static DefaultAccept defaultAccept(); /** Set the active accept bits. */ static void setDefaultAccept( DefaultAccept value_r ); //@} public: /** Implementation */ struct Impl; public: /** Default ctor */ KeyRing(const Pathname &baseTmpDir); /** * imports a key from a file. * throw if key was not imported */ void importKey( const PublicKey &key, bool trusted = false); /** Initial import from \ref RpmDb. */ void multiKeyImport( const Pathname & keyfile_r, bool trusted_r = false ); void dumpTrustedPublicKey( const std::string &id, std::ostream &stream ) { dumpPublicKey(id, true, stream); } void dumpUntrustedPublicKey( const std::string &id, std::ostream &stream ) { dumpPublicKey(id, false, stream); } void dumpPublicKey( const std::string &id, bool trusted, std::ostream &stream ); /** Export a public key identified by its key data. */ PublicKey exportPublicKey( const PublicKeyData & keyData ); /** Export a trusted public key identified by its key data. */ PublicKey exportTrustedPublicKey( const PublicKeyData & keyData ); /** * reads the public key id from a signature */ std::string readSignatureKeyId( const Pathname &signature ); /** * true if the key id is trusted */ bool isKeyTrusted( const std::string &id ); /** * true if the key id is knows, that means * at least exist on the untrusted keyring */ bool isKeyKnown( const std::string &id ); /** * removes a key from the keyring. * If trusted is true, Remove it from trusted keyring too. */ void deleteKey( const std::string &id, bool trusted = false ); /** * Get a list of public keys in the keyring (incl. ASCII armored keys in tmpfiles) */ std::list publicKeys(); /** * Get a list of trusted public keys in the keyring (incl. ASCII armored keys in tmpfiles) */ std::list trustedPublicKeys(); /** * Get a list of public key data in the keyring (key data only) */ std::list publicKeyData(); /** * Get a list of trusted public key data in the keyring (key data only) */ std::list trustedPublicKeyData(); /** * Get a public key's data in the keyring (key data only) */ PublicKeyData publicKeyData( const std::string &id ); /** * Get a trusted public key's data in the keyring (key data only) */ PublicKeyData trustedPublicKeyData( const std::string &id ); /** * Verifies a file against a signature, with no user interaction * * \param file Path of the file to be verified * \param signature Signature to verify the file against */ bool verifyFileSignature( const Pathname &file, const Pathname &signature ) ZYPP_API; bool verifyFileTrustedSignature( const Pathname &file, const Pathname &signature ) ZYPP_API; /** Dtor */ ~KeyRing() override; /** Access to private functions for the KeyRingWorkflow implementations */ KeyRing::Impl &pimpl(); public: /** The general keyring may be populated with known keys stored on the system. */ void allowPreload( bool yesno_r ); private: /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates KeyRing Stream output */ inline std::ostream & operator<<( std::ostream & str, const KeyRing & /*obj*/ ) { //return str << obj.asString(); return str; } /** \relates KeyRing::DefaultAccept */ ZYPP_DECLARE_OPERATORS_FOR_FLAGS( KeyRing::DefaultAccept ); /////////////////////////////////////////////////////////////////// namespace target { namespace rpm { /** Internal connection to rpm database. Not for public use. */ struct KeyRingSignals : public ::zypp::KeyRingSignals {}; } } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_KEYRING_H libzypp-17.36.5/zypp/KeyRingContexts.cc000066400000000000000000000111721476576476200200310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/KeyRingContexts.cc */ #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp::keyring { /////////////////////////////////////////////////////////////////// /// \class VerifyFileContext::Impl /// Directly accessed by verifyFileSignatureWorkflow /// to set the result data. /////////////////////////////////////////////////////////////////// class VerifyFileContext::Impl { public: Impl() {} Impl( Pathname file_r ) : _file( std::move(file_r) ) {} Impl( Pathname file_r, Pathname signature_r ) : _file( std::move(file_r) ) , _signature( std::move(signature_r) ) {} void resetResults() { _fileAccepted = _fileValidated = _signatureIdTrusted = false; _signatureId.clear(); } // In: Pathname _file; Pathname _signature; std::optional _shortFile; KeyContext _keyContext; BuddyKeys _buddyKeys; // Results: bool _fileAccepted = false; bool _fileValidated = false; std::string _signatureId; bool _signatureIdTrusted = false; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; VerifyFileContext::VerifyFileContext() : _pimpl( new Impl() ) {} VerifyFileContext::VerifyFileContext( Pathname file_r ) : _pimpl( new Impl( std::move(file_r) ) ) {} VerifyFileContext::VerifyFileContext( Pathname file_r, Pathname signature_r ) : _pimpl( new Impl( std::move(file_r), std::move(signature_r) ) ) {} VerifyFileContext::~VerifyFileContext() {} // In: const Pathname & VerifyFileContext::file() const { return _pimpl->_file; } void VerifyFileContext::file( Pathname file_r ) { _pimpl->_file = std::move(file_r); } const Pathname & VerifyFileContext::signature() const { return _pimpl->_signature; } void VerifyFileContext::signature( Pathname signature_r ) { _pimpl->_signature = std::move(signature_r); } std::string VerifyFileContext::shortFile() const { return _pimpl->_shortFile.has_value() ? _pimpl->_shortFile.value() : _pimpl->_file.basename(); } void VerifyFileContext::shortFile( std::string shortFile_r ) { _pimpl->_shortFile = std::move(shortFile_r); } const KeyContext & VerifyFileContext::keyContext() const { return _pimpl->_keyContext; } void VerifyFileContext::keyContext( KeyContext keyContext_r ) { _pimpl->_keyContext = std::move(keyContext_r); } const VerifyFileContext::BuddyKeys & VerifyFileContext::buddyKeys() const { return _pimpl->_buddyKeys; } void VerifyFileContext::addBuddyKey( std::string sid_r ) { _pimpl->_buddyKeys.insert( std::move(sid_r) ); } // Results: void VerifyFileContext::resetResults() { _pimpl->resetResults(); } bool VerifyFileContext::fileAccepted() const { return _pimpl->_fileAccepted; } void VerifyFileContext::fileAccepted( bool yesno_r ) { _pimpl->_fileAccepted = yesno_r; } bool VerifyFileContext::fileValidated() const { return _pimpl->_fileValidated; } void VerifyFileContext::fileValidated( bool yesno_r ) { _pimpl->_fileValidated = yesno_r; } const std::string & VerifyFileContext::signatureId() const { return _pimpl->_signatureId; } void VerifyFileContext::signatureId( std::string signatureId_r ) { _pimpl->_signatureId = std::move(signatureId_r); } bool VerifyFileContext::signatureIdTrusted() const { return _pimpl->_signatureIdTrusted; } void VerifyFileContext::signatureIdTrusted( bool yesno_r ) { _pimpl->_signatureIdTrusted = yesno_r; } std::ostream & operator<<( std::ostream & str, const VerifyFileContext & obj ) { return str << obj.file() << "[" << obj.signature().basename() << " accepted:" << asString( obj.fileAccepted() ) << ", validated:" << ( obj.fileValidated() ? ( obj.signatureIdTrusted() ? "trusted" : "true" ) : "false" ) << "(" << obj.signatureId() << ")" << "]";; } } // namespace zypp::keyring /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/KeyRingContexts.h000066400000000000000000000071401476576476200176730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/KeyRingContexts.h */ #ifndef ZYPP_KEYRINGCONTEXTS_H #define ZYPP_KEYRINGCONTEXTS_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp::keyring { /////////////////////////////////////////////////////////////////// /// I/O context for KeyRing::verifyFileSignatureWorkflow. /////////////////////////////////////////////////////////////////// class ZYPP_API VerifyFileContext { public: /** Ctor. */ VerifyFileContext(); /** Ctor may take file to verify and detatched signature. */ explicit VerifyFileContext( Pathname file_r ); /** Ctor may take file to verify and detatched signature. */ VerifyFileContext( Pathname file_r, Pathname signature_r ); VerifyFileContext(const VerifyFileContext &) = default; VerifyFileContext(VerifyFileContext &&) noexcept = default; VerifyFileContext &operator=(const VerifyFileContext &) = default; VerifyFileContext &operator=(VerifyFileContext &&) noexcept = default; ~VerifyFileContext(); /** File to verify. */ const Pathname & file() const; void file( Pathname file_r ); /** Detached signature or empty. */ const Pathname & signature() const; void signature( Pathname signature_r ); /** Short name for file (default: basename). */ std::string shortFile() const; void shortFile( std::string shortFile_r ); /** \ref KeyContext passed to callbacks */ const KeyContext & keyContext() const; void keyContext( KeyContext keyContext_r ); /** List of key safe key ids to import IFF \ref fileValidated. */ using BuddyKeys = std::set; const BuddyKeys & buddyKeys() const; void addBuddyKey( std::string sid_r ); /** \name Results provided by \ref KeyRing::verifyFileSignatureWorkflow. */ //@{ /** Reset all result values to safe defaults. */ void resetResults(); /** May return \c true due to user interaction or global defaults even if the signature was not actually verified. */ bool fileAccepted() const; void fileAccepted( bool yesno_r) ; /** Whether the signature was actually successfully verified. */ bool fileValidated() const; void fileValidated( bool yesno_r ); /** The id of the gpg key which signed the file. */ const std::string & signatureId() const; void signatureId( std::string signatureId_r ); /** Whether the \ref SignatureId is in the trusted keyring (not temp. trusted). */ bool signatureIdTrusted() const; void signatureIdTrusted( bool yesno_r ); //@} public: class Impl; ///< Implementation private: RWCOW_pointer _pimpl; ///< Pointer to implementation }; /** \relates VerifyFileContext Stream output */ std::ostream & operator<<( std::ostream & str, const VerifyFileContext & obj ); } // namespace zypp::keyring /////////////////////////////////////////////////////////////////// #endif // ZYPP_KEYRINGCONTEXTS_H libzypp-17.36.5/zypp/LanguageCode.cc000066400000000000000000001272311476576476200172530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/LanguageCode.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { /** Wrap static codemap data. */ struct CodeMaps { /** The singleton */ static CodeMaps & instance() { static CodeMaps _instance; return _instance; } /** Lookup (translated) name for \a index_r.*/ std::string name( IdString index_r ) { Link link( getIndex( index_r ) ); std::string ret; if ( link->second ) { ret = _(link->second); } else { ret = _("Unknown language: "); ret += "'"; ret += index_r.c_str(); ret += "'"; } return ret; } private: using CodeMap = std::unordered_map; using Link = CodeMap::const_iterator; using IndexMap = std::unordered_map; /** Ctor initializes the code maps. * http://www.loc.gov/standards/iso639-2/ISO-639-2_values_8bits.txt */ CodeMaps(); /** Return \ref Link for \a index_r, creating it if necessary. */ Link getIndex( IdString index_r ) { auto it = _indexMap.find( index_r ); return( it != _indexMap.end() ? it->second : newIndex( index_r, index_r.asString() ) ); } /** Return the CodeMap Index for \a code_r. */ Link newIndex( IdString index_r, const std::string & code_r ) { Link link = _codeMap.find( code_r ); if ( link != _codeMap.end() ) return (_indexMap[index_r] = link); // not found: Remember a new code CodeMap::value_type nval( code_r, nullptr ); if ( code_r.size() > 3 || code_r.size() < 2 ) WAR << "Malformed LanguageCode '" << code_r << "' (expect 2 or 3-letter)" << endl; std::string lcode( str::toLower( code_r ) ); if ( lcode != code_r ) { WAR << "Malformed LanguageCode '" << code_r << "' (not lower case)" << endl; // but maybe we're lucky with the lower case code // and find a language name. link = _codeMap.find( lcode ); if ( link != _codeMap.end() ) { nval.second = link->second; } } MIL << "Remember LanguageCode '" << code_r << "': '" << (nval.second?nval.second:"Unknown language") << "'" << endl; return (_indexMap[index_r] = _codeMap.insert( nval ).first); } private: CodeMap _codeMap; IndexMap _indexMap; }; } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // class LanguageCode /////////////////////////////////////////////////////////////////// const LanguageCode LanguageCode::noCode; //const LanguageCode LanguageCode::enCode("en"); in Locale.cc as Locale::enCode depends on it LanguageCode::LanguageCode() {} LanguageCode::LanguageCode( IdString str_r ) : _str( str_r ) {} LanguageCode::LanguageCode( const std::string & str_r ) : _str( str_r ) {} LanguageCode::LanguageCode( const char * str_r ) : _str( str_r ) {} LanguageCode::~LanguageCode() {} std::string LanguageCode::name() const { return CodeMaps::instance().name( _str ); } /////////////////////////////////////////////////////////////////// namespace { CodeMaps::CodeMaps() { // Defined LanguageCode constants _codeMap[""] = N_("No Code"); struct LangInit { const char *iso639_2; const char *iso639_1; const char *name; }; // some languages have more than one iso639_2 code // so there are items with duplicate names const LangInit langInit[] = { // language code: aar aa { "aar", "aa", N_( "Afar" ) }, // language code: abk ab { "abk", "ab", N_( "Abkhazian" ) }, // language code: ace { "ace", NULL, N_( "Achinese" ) }, // language code: ach { "ach", NULL, N_( "Acoli" ) }, // language code: ada { "ada", NULL, N_( "Adangme" ) }, // language code: ady { "ady", NULL, N_( "Adyghe" ) }, // language code: afa { "afa", NULL, N_( "Afro-Asiatic (Other)" ) }, // language code: afh { "afh", NULL, N_( "Afrihili" ) }, // language code: afr af { "afr", "af", N_( "Afrikaans" ) }, // language code: ain { "ain", NULL, N_( "Ainu" ) }, // language code: aka ak { "aka", "ak", N_( "Akan" ) }, // language code: akk { "akk", NULL, N_( "Akkadian" ) }, // language code: alb sqi sq { "alb", "sq", N_( "Albanian" ) }, // language code: alb sqi sq { "sqi", NULL, N_( "Albanian" ) }, // language code: ale { "ale", NULL, N_( "Aleut" ) }, // language code: alg { "alg", NULL, N_( "Algonquian Languages" ) }, // language code: alt { "alt", NULL, N_( "Southern Altai" ) }, // language code: amh am { "amh", "am", N_( "Amharic" ) }, // language code: ang { "ang", NULL, N_( "English, Old (ca.450-1100)" ) }, // language code: apa { "apa", NULL, N_( "Apache Languages" ) }, // language code: ara ar { "ara", "ar", N_( "Arabic" ) }, // language code: arc { "arc", NULL, N_( "Aramaic" ) }, // language code: arg an { "arg", "an", N_( "Aragonese" ) }, // language code: arm hye hy { "arm", "hy", N_( "Armenian" ) }, // language code: arm hye hy { "hye", NULL, N_( "Armenian" ) }, // language code: arn { "arn", NULL, N_( "Araucanian" ) }, // language code: arp { "arp", NULL, N_( "Arapaho" ) }, // language code: art { "art", NULL, N_( "Artificial (Other)" ) }, // language code: arw { "arw", NULL, N_( "Arawak" ) }, // language code: asm as { "asm", "as", N_( "Assamese" ) }, // language code: ast { "ast", NULL, N_( "Asturian" ) }, // language code: ath { "ath", NULL, N_( "Athapascan Languages" ) }, // language code: aus { "aus", NULL, N_( "Australian Languages" ) }, // language code: ava av { "ava", "av", N_( "Avaric" ) }, // language code: ave ae { "ave", "ae", N_( "Avestan" ) }, // language code: awa { "awa", NULL, N_( "Awadhi" ) }, // language code: aym ay { "aym", "ay", N_( "Aymara" ) }, // language code: aze az { "aze", "az", N_( "Azerbaijani" ) }, // language code: bad { "bad", NULL, N_( "Banda" ) }, // language code: bai { "bai", NULL, N_( "Bamileke Languages" ) }, // language code: bak ba { "bak", "ba", N_( "Bashkir" ) }, // language code: bal { "bal", NULL, N_( "Baluchi" ) }, // language code: bam bm { "bam", "bm", N_( "Bambara" ) }, // language code: ban { "ban", NULL, N_( "Balinese" ) }, // language code: baq eus eu { "baq", "eu", N_( "Basque" ) }, // language code: baq eus eu { "eus", NULL, N_( "Basque" ) }, // language code: bas { "bas", NULL, N_( "Basa" ) }, // language code: bat { "bat", NULL, N_( "Baltic (Other)" ) }, // language code: bej { "bej", NULL, N_( "Beja" ) }, // language code: bel be { "bel", "be", N_( "Belarusian" ) }, // language code: bem { "bem", NULL, N_( "Bemba" ) }, // language code: ben bn { "ben", "bn", N_( "Bengali" ) }, // language code: ber { "ber", NULL, N_( "Berber (Other)" ) }, // language code: bho { "bho", NULL, N_( "Bhojpuri" ) }, // language code: bih bh { "bih", "bh", N_( "Bihari" ) }, // language code: bik { "bik", NULL, N_( "Bikol" ) }, // language code: bin { "bin", NULL, N_( "Bini" ) }, // language code: bis bi { "bis", "bi", N_( "Bislama" ) }, // language code: bla { "bla", NULL, N_( "Siksika" ) }, // language code: bnt { "bnt", NULL, N_( "Bantu (Other)" ) }, // language code: bos bs { "bos", "bs", N_( "Bosnian" ) }, // language code: bra { "bra", NULL, N_( "Braj" ) }, // language code: bre br { "bre", "br", N_( "Breton" ) }, // language code: btk { "btk", NULL, N_( "Batak (Indonesia)" ) }, // language code: bua { "bua", NULL, N_( "Buriat" ) }, // language code: bug { "bug", NULL, N_( "Buginese" ) }, // language code: bul bg { "bul", "bg", N_( "Bulgarian" ) }, // language code: bur mya my { "bur", "my", N_( "Burmese" ) }, // language code: bur mya my { "mya", NULL, N_( "Burmese" ) }, // language code: byn { "byn", NULL, N_( "Blin" ) }, // language code: cad { "cad", NULL, N_( "Caddo" ) }, // language code: cai { "cai", NULL, N_( "Central American Indian (Other)" ) }, // language code: car { "car", NULL, N_( "Carib" ) }, // language code: cat ca { "cat", "ca", N_( "Catalan" ) }, // language code: cau { "cau", NULL, N_( "Caucasian (Other)" ) }, // language code: ceb { "ceb", NULL, N_( "Cebuano" ) }, // language code: cel { "cel", NULL, N_( "Celtic (Other)" ) }, // language code: cha ch { "cha", "ch", N_( "Chamorro" ) }, // language code: chb { "chb", NULL, N_( "Chibcha" ) }, // language code: che ce { "che", "ce", N_( "Chechen" ) }, // language code: chg { "chg", NULL, N_( "Chagatai" ) }, // language code: chi zho zh { "chi", "zh", N_( "Chinese" ) }, // language code: chi zho zh { "zho", NULL, N_( "Chinese" ) }, // language code: chk { "chk", NULL, N_( "Chuukese" ) }, // language code: chm { "chm", NULL, N_( "Mari" ) }, // language code: chn { "chn", NULL, N_( "Chinook Jargon" ) }, // language code: cho { "cho", NULL, N_( "Choctaw" ) }, // language code: chp { "chp", NULL, N_( "Chipewyan" ) }, // language code: chr { "chr", NULL, N_( "Cherokee" ) }, // language code: chu cu { "chu", "cu", N_( "Church Slavic" ) }, // language code: chv cv { "chv", "cv", N_( "Chuvash" ) }, // language code: chy { "chy", NULL, N_( "Cheyenne" ) }, // language code: cmc { "cmc", NULL, N_( "Chamic Languages" ) }, // language code: cop { "cop", NULL, N_( "Coptic" ) }, // language code: cor kw { "cor", "kw", N_( "Cornish" ) }, // language code: cos co { "cos", "co", N_( "Corsican" ) }, // language code: cpe { "cpe", NULL, N_( "Creoles and Pidgins, English-Based (Other)" ) }, // language code: cpf { "cpf", NULL, N_( "Creoles and Pidgins, French-Based (Other)" ) }, // language code: cpp { "cpp", NULL, N_( "Creoles and Pidgins, Portuguese-Based (Other)" ) }, // language code: cre cr { "cre", "cr", N_( "Cree" ) }, // language code: crh { "crh", NULL, N_( "Crimean Tatar" ) }, // language code: crp { "crp", NULL, N_( "Creoles and Pidgins (Other)" ) }, // language code: csb { "csb", NULL, N_( "Kashubian" ) }, // language code: cus { "cus", NULL, N_( "Cushitic (Other)" ) }, // language code: cze ces cs { "cze", "cs", N_( "Czech" ) }, // language code: cze ces cs { "ces", NULL, N_( "Czech" ) }, // language code: dak { "dak", NULL, N_( "Dakota" ) }, // language code: dan da { "dan", "da", N_( "Danish" ) }, // language code: dar { "dar", NULL, N_( "Dargwa" ) }, // language code: day { "day", NULL, N_( "Dayak" ) }, // language code: del { "del", NULL, N_( "Delaware" ) }, // language code: den { "den", NULL, N_( "Slave (Athapascan)" ) }, // language code: dgr { "dgr", NULL, N_( "Dogrib" ) }, // language code: din { "din", NULL, N_( "Dinka" ) }, // language code: div dv { "div", "dv", N_( "Divehi" ) }, // language code: doi { "doi", NULL, N_( "Dogri" ) }, // language code: dra { "dra", NULL, N_( "Dravidian (Other)" ) }, // language code: dsb { "dsb", NULL, N_( "Lower Sorbian" ) }, // language code: dua { "dua", NULL, N_( "Duala" ) }, // language code: dum { "dum", NULL, N_( "Dutch, Middle (ca.1050-1350)" ) }, // language code: dut nld nl { "dut", "nl", N_( "Dutch" ) }, // language code: dut nld nl { "nld", NULL, N_( "Dutch" ) }, // language code: dyu { "dyu", NULL, N_( "Dyula" ) }, // language code: dzo dz { "dzo", "dz", N_( "Dzongkha" ) }, // language code: efi { "efi", NULL, N_( "Efik" ) }, // language code: egy { "egy", NULL, N_( "Egyptian (Ancient)" ) }, // language code: eka { "eka", NULL, N_( "Ekajuk" ) }, // language code: elx { "elx", NULL, N_( "Elamite" ) }, // language code: eng en { "eng", "en", N_( "English" ) }, // language code: enm { "enm", NULL, N_( "English, Middle (1100-1500)" ) }, // language code: epo eo { "epo", "eo", N_( "Esperanto" ) }, // language code: est et { "est", "et", N_( "Estonian" ) }, // language code: ewe ee { "ewe", "ee", N_( "Ewe" ) }, // language code: ewo { "ewo", NULL, N_( "Ewondo" ) }, // language code: fan { "fan", NULL, N_( "Fang" ) }, // language code: fao fo { "fao", "fo", N_( "Faroese" ) }, // language code: fat { "fat", NULL, N_( "Fanti" ) }, // language code: fij fj { "fij", "fj", N_( "Fijian" ) }, // language code: fil { "fil", NULL, N_( "Filipino" ) }, // language code: fin fi { "fin", "fi", N_( "Finnish" ) }, // language code: fiu { "fiu", NULL, N_( "Finno-Ugrian (Other)" ) }, // language code: fon { "fon", NULL, N_( "Fon" ) }, // language code: fre fra fr { "fre", "fr", N_( "French" ) }, // language code: fre fra fr { "fra", NULL, N_( "French" ) }, // language code: frm { "frm", NULL, N_( "French, Middle (ca.1400-1600)" ) }, // language code: fro { "fro", NULL, N_( "French, Old (842-ca.1400)" ) }, // language code: fry fy { "fry", "fy", N_( "Frisian" ) }, // language code: ful ff { "ful", "ff", N_( "Fulah" ) }, // language code: fur { "fur", NULL, N_( "Friulian" ) }, // language code: gaa { "gaa", NULL, N_( "Ga" ) }, // language code: gay { "gay", NULL, N_( "Gayo" ) }, // language code: gba { "gba", NULL, N_( "Gbaya" ) }, // language code: gem { "gem", NULL, N_( "Germanic (Other)" ) }, // language code: geo kat ka { "geo", "ka", N_( "Georgian" ) }, // language code: geo kat ka { "kat", NULL, N_( "Georgian" ) }, // language code: ger deu de { "ger", "de", N_( "German" ) }, // language code: ger deu de { "deu", NULL, N_( "German" ) }, // language code: gez { "gez", NULL, N_( "Geez" ) }, // language code: gil { "gil", NULL, N_( "Gilbertese" ) }, // language code: gla gd { "gla", "gd", N_( "Gaelic" ) }, // language code: gle ga { "gle", "ga", N_( "Irish" ) }, // language code: glg gl { "glg", "gl", N_( "Galician" ) }, // language code: glv gv { "glv", "gv", N_( "Manx" ) }, // language code: gmh { "gmh", NULL, N_( "German, Middle High (ca.1050-1500)" ) }, // language code: goh { "goh", NULL, N_( "German, Old High (ca.750-1050)" ) }, // language code: gon { "gon", NULL, N_( "Gondi" ) }, // language code: gor { "gor", NULL, N_( "Gorontalo" ) }, // language code: got { "got", NULL, N_( "Gothic" ) }, // language code: grb { "grb", NULL, N_( "Grebo" ) }, // language code: grc { "grc", NULL, N_( "Greek, Ancient (to 1453)" ) }, // language code: gre ell el { "gre", "el", N_( "Greek, Modern (1453-)" ) }, // language code: gre ell el { "ell", NULL, N_( "Greek, Modern (1453-)" ) }, // language code: grn gn { "grn", "gn", N_( "Guarani" ) }, // language code: guj gu { "guj", "gu", N_( "Gujarati" ) }, // language code: gwi { "gwi", NULL, N_( "Gwich'in" ) }, // language code: hai { "hai", NULL, N_( "Haida" ) }, // language code: hat ht { "hat", "ht", N_( "Haitian" ) }, // language code: hau ha { "hau", "ha", N_( "Hausa" ) }, // language code: haw { "haw", NULL, N_( "Hawaiian" ) }, // language code: heb he { "heb", "he", N_( "Hebrew" ) }, // language code: her hz { "her", "hz", N_( "Herero" ) }, // language code: hil { "hil", NULL, N_( "Hiligaynon" ) }, // language code: him { "him", NULL, N_( "Himachali" ) }, // language code: hin hi { "hin", "hi", N_( "Hindi" ) }, // language code: hit { "hit", NULL, N_( "Hittite" ) }, // language code: hmn { "hmn", NULL, N_( "Hmong" ) }, // language code: hmo ho { "hmo", "ho", N_( "Hiri Motu" ) }, // language code: hsb { "hsb", NULL, N_( "Upper Sorbian" ) }, // language code: hun hu { "hun", "hu", N_( "Hungarian" ) }, // language code: hup { "hup", NULL, N_( "Hupa" ) }, // language code: iba { "iba", NULL, N_( "Iban" ) }, // language code: ibo ig { "ibo", "ig", N_( "Igbo" ) }, // language code: ice isl is { "ice", "is", N_( "Icelandic" ) }, // language code: ice isl is { "isl", NULL, N_( "Icelandic" ) }, // language code: ido io { "ido", "io", N_( "Ido" ) }, // language code: iii ii { "iii", "ii", N_( "Sichuan Yi" ) }, // language code: ijo { "ijo", NULL, N_( "Ijo" ) }, // language code: iku iu { "iku", "iu", N_( "Inuktitut" ) }, // language code: ile ie { "ile", "ie", N_( "Interlingue" ) }, // language code: ilo { "ilo", NULL, N_( "Iloko" ) }, // language code: ina ia { "ina", "ia", N_( "Interlingua (International Auxiliary Language Association)" ) }, // language code: inc { "inc", NULL, N_( "Indic (Other)" ) }, // language code: ind id { "ind", "id", N_( "Indonesian" ) }, // language code: ine { "ine", NULL, N_( "Indo-European (Other)" ) }, // language code: inh { "inh", NULL, N_( "Ingush" ) }, // language code: ipk ik { "ipk", "ik", N_( "Inupiaq" ) }, // language code: ira { "ira", NULL, N_( "Iranian (Other)" ) }, // language code: iro { "iro", NULL, N_( "Iroquoian Languages" ) }, // language code: ita it { "ita", "it", N_( "Italian" ) }, // language code: jav jv { "jav", "jv", N_( "Javanese" ) }, // language code: jbo { "jbo", NULL, N_( "Lojban" ) }, // language code: jpn ja { "jpn", "ja", N_( "Japanese" ) }, // language code: jpr { "jpr", NULL, N_( "Judeo-Persian" ) }, // language code: jrb { "jrb", NULL, N_( "Judeo-Arabic" ) }, // language code: kaa { "kaa", NULL, N_( "Kara-Kalpak" ) }, // language code: kab { "kab", NULL, N_( "Kabyle" ) }, // language code: kac { "kac", NULL, N_( "Kachin" ) }, // language code: kal kl { "kal", "kl", N_( "Kalaallisut" ) }, // language code: kam { "kam", NULL, N_( "Kamba" ) }, // language code: kan kn { "kan", "kn", N_( "Kannada" ) }, // language code: kar { "kar", NULL, N_( "Karen" ) }, // language code: kas ks { "kas", "ks", N_( "Kashmiri" ) }, // language code: kau kr { "kau", "kr", N_( "Kanuri" ) }, // language code: kaw { "kaw", NULL, N_( "Kawi" ) }, // language code: kaz kk { "kaz", "kk", N_( "Kazakh" ) }, // language code: kbd { "kbd", NULL, N_( "Kabardian" ) }, // language code: kha { "kha", NULL, N_( "Khasi" ) }, // language code: khi { "khi", NULL, N_( "Khoisan (Other)" ) }, // language code: khm km { "khm", "km", N_( "Khmer" ) }, // language code: kho { "kho", NULL, N_( "Khotanese" ) }, // language code: kik ki { "kik", "ki", N_( "Kikuyu" ) }, // language code: kin rw { "kin", "rw", N_( "Kinyarwanda" ) }, // language code: kir ky { "kir", "ky", N_( "Kirghiz" ) }, // language code: kmb { "kmb", NULL, N_( "Kimbundu" ) }, // language code: kok { "kok", NULL, N_( "Konkani" ) }, // language code: kom kv { "kom", "kv", N_( "Komi" ) }, // language code: kon kg { "kon", "kg", N_( "Kongo" ) }, // language code: kor ko { "kor", "ko", N_( "Korean" ) }, // language code: kos { "kos", NULL, N_( "Kosraean" ) }, // language code: kpe { "kpe", NULL, N_( "Kpelle" ) }, // language code: krc { "krc", NULL, N_( "Karachay-Balkar" ) }, // language code: kro { "kro", NULL, N_( "Kru" ) }, // language code: kru { "kru", NULL, N_( "Kurukh" ) }, // language code: kua kj { "kua", "kj", N_( "Kuanyama" ) }, // language code: kum { "kum", NULL, N_( "Kumyk" ) }, // language code: kur ku { "kur", "ku", N_( "Kurdish" ) }, // language code: kut { "kut", NULL, N_( "Kutenai" ) }, // language code: lad { "lad", NULL, N_( "Ladino" ) }, // language code: lah { "lah", NULL, N_( "Lahnda" ) }, // language code: lam { "lam", NULL, N_( "Lamba" ) }, // language code: lao lo { "lao", "lo", N_( "Lao" ) }, // language code: lat la { "lat", "la", N_( "Latin" ) }, // language code: lav lv { "lav", "lv", N_( "Latvian" ) }, // language code: lez { "lez", NULL, N_( "Lezghian" ) }, // language code: lim li { "lim", "li", N_( "Limburgan" ) }, // language code: lin ln { "lin", "ln", N_( "Lingala" ) }, // language code: lit lt { "lit", "lt", N_( "Lithuanian" ) }, // language code: lol { "lol", NULL, N_( "Mongo" ) }, // language code: loz { "loz", NULL, N_( "Lozi" ) }, // language code: ltz lb { "ltz", "lb", N_( "Luxembourgish" ) }, // language code: lua { "lua", NULL, N_( "Luba-Lulua" ) }, // language code: lub lu { "lub", "lu", N_( "Luba-Katanga" ) }, // language code: lug lg { "lug", "lg", N_( "Ganda" ) }, // language code: lui { "lui", NULL, N_( "Luiseno" ) }, // language code: lun { "lun", NULL, N_( "Lunda" ) }, // language code: luo { "luo", NULL, N_( "Luo (Kenya and Tanzania)" ) }, // language code: lus { "lus", NULL, N_( "Lushai" ) }, // language code: mac mkd mk { "mac", "mk", N_( "Macedonian" ) }, // language code: mac mkd mk { "mkd", NULL, N_( "Macedonian" ) }, // language code: mad { "mad", NULL, N_( "Madurese" ) }, // language code: mag { "mag", NULL, N_( "Magahi" ) }, // language code: mah mh { "mah", "mh", N_( "Marshallese" ) }, // language code: mai { "mai", NULL, N_( "Maithili" ) }, // language code: mak { "mak", NULL, N_( "Makasar" ) }, // language code: mal ml { "mal", "ml", N_( "Malayalam" ) }, // language code: man { "man", NULL, N_( "Mandingo" ) }, // language code: mao mri mi { "mao", "mi", N_( "Maori" ) }, // language code: mao mri mi { "mri", NULL, N_( "Maori" ) }, // language code: map { "map", NULL, N_( "Austronesian (Other)" ) }, // language code: mar mr { "mar", "mr", N_( "Marathi" ) }, // language code: mas { "mas", NULL, N_( "Masai" ) }, // language code: may msa ms { "may", "ms", N_( "Malay" ) }, // language code: may msa ms { "msa", NULL, N_( "Malay" ) }, // language code: mdf { "mdf", NULL, N_( "Moksha" ) }, // language code: mdr { "mdr", NULL, N_( "Mandar" ) }, // language code: men { "men", NULL, N_( "Mende" ) }, // language code: mga { "mga", NULL, N_( "Irish, Middle (900-1200)" ) }, // language code: mic { "mic", NULL, N_( "Mi'kmaq" ) }, // language code: min { "min", NULL, N_( "Minangkabau" ) }, // language code: mis { "mis", NULL, N_( "Miscellaneous Languages" ) }, // language code: mkh { "mkh", NULL, N_( "Mon-Khmer (Other)" ) }, // language code: mlg mg { "mlg", "mg", N_( "Malagasy" ) }, // language code: mlt mt { "mlt", "mt", N_( "Maltese" ) }, // language code: mnc { "mnc", NULL, N_( "Manchu" ) }, // language code: mni { "mni", NULL, N_( "Manipuri" ) }, // language code: mno { "mno", NULL, N_( "Manobo Languages" ) }, // language code: moh { "moh", NULL, N_( "Mohawk" ) }, // language code: mol mo { "mol", "mo", N_( "Moldavian" ) }, // language code: mon mn { "mon", "mn", N_( "Mongolian" ) }, // language code: mos { "mos", NULL, N_( "Mossi" ) }, // language code: mul { "mul", NULL, N_( "Multiple Languages" ) }, // language code: mun { "mun", NULL, N_( "Munda languages" ) }, // language code: mus { "mus", NULL, N_( "Creek" ) }, // language code: mwl { "mwl", NULL, N_( "Mirandese" ) }, // language code: mwr { "mwr", NULL, N_( "Marwari" ) }, // language code: myn { "myn", NULL, N_( "Mayan Languages" ) }, // language code: myv { "myv", NULL, N_( "Erzya" ) }, // language code: nah { "nah", NULL, N_( "Nahuatl" ) }, // language code: nai { "nai", NULL, N_( "North American Indian" ) }, // language code: nap { "nap", NULL, N_( "Neapolitan" ) }, // language code: nau na { "nau", "na", N_( "Nauru" ) }, // language code: nav nv { "nav", "nv", N_( "Navajo" ) }, // language code: nbl nr { "nbl", "nr", N_( "Ndebele, South" ) }, // language code: nde nd { "nde", "nd", N_( "Ndebele, North" ) }, // language code: ndo ng { "ndo", "ng", N_( "Ndonga" ) }, // language code: nds { "nds", NULL, N_( "Low German" ) }, // language code: nep ne { "nep", "ne", N_( "Nepali" ) }, // language code: new { "new", NULL, N_( "Nepal Bhasa" ) }, // language code: nia { "nia", NULL, N_( "Nias" ) }, // language code: nic { "nic", NULL, N_( "Niger-Kordofanian (Other)" ) }, // language code: niu { "niu", NULL, N_( "Niuean" ) }, // language code: nno nn { "nno", "nn", N_( "Norwegian Nynorsk" ) }, // language code: nob nb { "nob", "nb", N_( "Norwegian Bokmal" ) }, // language code: nog { "nog", NULL, N_( "Nogai" ) }, // language code: non { "non", NULL, N_( "Norse, Old" ) }, // language code: nor no { "nor", "no", N_( "Norwegian" ) }, // language code: nso { "nso", NULL, N_( "Northern Sotho" ) }, // language code: nub { "nub", NULL, N_( "Nubian Languages" ) }, // language code: nwc { "nwc", NULL, N_( "Classical Newari" ) }, // language code: nya ny { "nya", "ny", N_( "Chichewa" ) }, // language code: nym { "nym", NULL, N_( "Nyamwezi" ) }, // language code: nyn { "nyn", NULL, N_( "Nyankole" ) }, // language code: nyo { "nyo", NULL, N_( "Nyoro" ) }, // language code: nzi { "nzi", NULL, N_( "Nzima" ) }, // language code: oci oc { "oci", "oc", N_( "Occitan (post 1500)" ) }, // language code: oji oj { "oji", "oj", N_( "Ojibwa" ) }, // language code: ori or { "ori", "or", N_( "Oriya" ) }, // language code: orm om { "orm", "om", N_( "Oromo" ) }, // language code: osa { "osa", NULL, N_( "Osage" ) }, // language code: oss os { "oss", "os", N_( "Ossetian" ) }, // language code: ota { "ota", NULL, N_( "Turkish, Ottoman (1500-1928)" ) }, // language code: oto { "oto", NULL, N_( "Otomian Languages" ) }, // language code: paa { "paa", NULL, N_( "Papuan (Other)" ) }, // language code: pag { "pag", NULL, N_( "Pangasinan" ) }, // language code: pal { "pal", NULL, N_( "Pahlavi" ) }, // language code: pam { "pam", NULL, N_( "Pampanga" ) }, // language code: pan pa { "pan", "pa", N_( "Panjabi" ) }, // language code: pap { "pap", NULL, N_( "Papiamento" ) }, // language code: pau { "pau", NULL, N_( "Palauan" ) }, // language code: peo { "peo", NULL, N_( "Persian, Old (ca.600-400 B.C.)" ) }, // language code: per fas fa { "per", "fa", N_( "Persian" ) }, // language code: per fas fa { "fas", NULL, N_( "Persian" ) }, // language code: phi { "phi", NULL, N_( "Philippine (Other)" ) }, // language code: phn { "phn", NULL, N_( "Phoenician" ) }, // language code: pli pi { "pli", "pi", N_( "Pali" ) }, // language code: pol pl { "pol", "pl", N_( "Polish" ) }, // language code: pon { "pon", NULL, N_( "Pohnpeian" ) }, // language code: por pt { "por", "pt", N_( "Portuguese" ) }, // language code: pra { "pra", NULL, N_( "Prakrit Languages" ) }, // language code: pro { "pro", NULL, N_( "Provencal, Old (to 1500)" ) }, // language code: pus ps { "pus", "ps", N_( "Pushto" ) }, // language code: que qu { "que", "qu", N_( "Quechua" ) }, // language code: raj { "raj", NULL, N_( "Rajasthani" ) }, // language code: rap { "rap", NULL, N_( "Rapanui" ) }, // language code: rar { "rar", NULL, N_( "Rarotongan" ) }, // language code: roa { "roa", NULL, N_( "Romance (Other)" ) }, // language code: roh rm { "roh", "rm", N_( "Raeto-Romance" ) }, // language code: rom { "rom", NULL, N_( "Romany" ) }, // language code: rum ron ro { "rum", "ro", N_( "Romanian" ) }, // language code: rum ron ro { "ron", NULL, N_( "Romanian" ) }, // language code: run rn { "run", "rn", N_( "Rundi" ) }, // language code: rus ru { "rus", "ru", N_( "Russian" ) }, // language code: sad { "sad", NULL, N_( "Sandawe" ) }, // language code: sag sg { "sag", "sg", N_( "Sango" ) }, // language code: sah { "sah", NULL, N_( "Yakut" ) }, // language code: sai { "sai", NULL, N_( "South American Indian (Other)" ) }, // language code: sal { "sal", NULL, N_( "Salishan Languages" ) }, // language code: sam { "sam", NULL, N_( "Samaritan Aramaic" ) }, // language code: san sa { "san", "sa", N_( "Sanskrit" ) }, // language code: sas { "sas", NULL, N_( "Sasak" ) }, // language code: sat { "sat", NULL, N_( "Santali" ) }, // language code: scc srp sr { "scc", "sr", N_( "Serbian" ) }, // language code: scc srp sr { "srp", NULL, N_( "Serbian" ) }, // language code: scn { "scn", NULL, N_( "Sicilian" ) }, // language code: sco { "sco", NULL, N_( "Scots" ) }, // language code: scr hrv hr { "scr", "hr", N_( "Croatian" ) }, // language code: scr hrv hr { "hrv", NULL, N_( "Croatian" ) }, // language code: sel { "sel", NULL, N_( "Selkup" ) }, // language code: sem { "sem", NULL, N_( "Semitic (Other)" ) }, // language code: sga { "sga", NULL, N_( "Irish, Old (to 900)" ) }, // language code: sgn { "sgn", NULL, N_( "Sign Languages" ) }, // language code: shn { "shn", NULL, N_( "Shan" ) }, // language code: sid { "sid", NULL, N_( "Sidamo" ) }, // language code: sin si { "sin", "si", N_( "Sinhala" ) }, // language code: sio { "sio", NULL, N_( "Siouan Languages" ) }, // language code: sit { "sit", NULL, N_( "Sino-Tibetan (Other)" ) }, // language code: sla { "sla", NULL, N_( "Slavic (Other)" ) }, // language code: slo slk sk { "slo", "sk", N_( "Slovak" ) }, // language code: slo slk sk { "slk", NULL, N_( "Slovak" ) }, // language code: slv sl { "slv", "sl", N_( "Slovenian" ) }, // language code: sma { "sma", NULL, N_( "Southern Sami" ) }, // language code: sme se { "sme", "se", N_( "Northern Sami" ) }, // language code: smi { "smi", NULL, N_( "Sami Languages (Other)" ) }, // language code: smj { "smj", NULL, N_( "Lule Sami" ) }, // language code: smn { "smn", NULL, N_( "Inari Sami" ) }, // language code: smo sm { "smo", "sm", N_( "Samoan" ) }, // language code: sms { "sms", NULL, N_( "Skolt Sami" ) }, // language code: sna sn { "sna", "sn", N_( "Shona" ) }, // language code: snd sd { "snd", "sd", N_( "Sindhi" ) }, // language code: snk { "snk", NULL, N_( "Soninke" ) }, // language code: sog { "sog", NULL, N_( "Sogdian" ) }, // language code: som so { "som", "so", N_( "Somali" ) }, // language code: son { "son", NULL, N_( "Songhai" ) }, // language code: sot st { "sot", "st", N_( "Sotho, Southern" ) }, // language code: spa es { "spa", "es", N_( "Spanish" ) }, // language code: srd sc { "srd", "sc", N_( "Sardinian" ) }, // language code: srr { "srr", NULL, N_( "Serer" ) }, // language code: ssa { "ssa", NULL, N_( "Nilo-Saharan (Other)" ) }, // language code: ssw ss { "ssw", "ss", N_( "Swati" ) }, // language code: suk { "suk", NULL, N_( "Sukuma" ) }, // language code: sun su { "sun", "su", N_( "Sundanese" ) }, // language code: sus { "sus", NULL, N_( "Susu" ) }, // language code: sux { "sux", NULL, N_( "Sumerian" ) }, // language code: swa sw { "swa", "sw", N_( "Swahili" ) }, // language code: swe sv { "swe", "sv", N_( "Swedish" ) }, // language code: syr { "syr", NULL, N_( "Syriac" ) }, // language code: tah ty { "tah", "ty", N_( "Tahitian" ) }, // language code: tai { "tai", NULL, N_( "Tai (Other)" ) }, // language code: tam ta { "tam", "ta", N_( "Tamil" ) }, // language code: tat tt { "tat", "tt", N_( "Tatar" ) }, // language code: tel te { "tel", "te", N_( "Telugu" ) }, // language code: tem { "tem", NULL, N_( "Timne" ) }, // language code: ter { "ter", NULL, N_( "Tereno" ) }, // language code: tet { "tet", NULL, N_( "Tetum" ) }, // language code: tgk tg { "tgk", "tg", N_( "Tajik" ) }, // language code: tgl tl { "tgl", "tl", N_( "Tagalog" ) }, // language code: tha th { "tha", "th", N_( "Thai" ) }, // language code: tib bod bo { "tib", "bo", N_( "Tibetan" ) }, // language code: tib bod bo { "bod", NULL, N_( "Tibetan" ) }, // language code: tig { "tig", NULL, N_( "Tigre" ) }, // language code: tir ti { "tir", "ti", N_( "Tigrinya" ) }, // language code: tiv { "tiv", NULL, N_( "Tiv" ) }, // language code: tkl { "tkl", NULL, N_( "Tokelau" ) }, // language code: tlh { "tlh", NULL, N_( "Klingon" ) }, // language code: tli { "tli", NULL, N_( "Tlingit" ) }, // language code: tmh { "tmh", NULL, N_( "Tamashek" ) }, // language code: tog { "tog", NULL, N_( "Tonga (Nyasa)" ) }, // language code: ton to { "ton", "to", N_( "Tonga (Tonga Islands)" ) }, // language code: tpi { "tpi", NULL, N_( "Tok Pisin" ) }, // language code: tsi { "tsi", NULL, N_( "Tsimshian" ) }, // language code: tsn tn { "tsn", "tn", N_( "Tswana" ) }, // language code: tso ts { "tso", "ts", N_( "Tsonga" ) }, // language code: tuk tk { "tuk", "tk", N_( "Turkmen" ) }, // language code: tum { "tum", NULL, N_( "Tumbuka" ) }, // language code: tup { "tup", NULL, N_( "Tupi Languages" ) }, // language code: tur tr { "tur", "tr", N_( "Turkish" ) }, // language code: tut { "tut", NULL, N_( "Altaic (Other)" ) }, // language code: tvl { "tvl", NULL, N_( "Tuvalu" ) }, // language code: twi tw { "twi", "tw", N_( "Twi" ) }, // language code: tyv { "tyv", NULL, N_( "Tuvinian" ) }, // language code: udm { "udm", NULL, N_( "Udmurt" ) }, // language code: uga { "uga", NULL, N_( "Ugaritic" ) }, // language code: uig ug { "uig", "ug", N_( "Uighur" ) }, // language code: ukr uk { "ukr", "uk", N_( "Ukrainian" ) }, // language code: umb { "umb", NULL, N_( "Umbundu" ) }, // language code: und { "und", NULL, N_( "Undetermined" ) }, // language code: urd ur { "urd", "ur", N_( "Urdu" ) }, // language code: uzb uz { "uzb", "uz", N_( "Uzbek" ) }, // language code: vai { "vai", NULL, N_( "Vai" ) }, // language code: ven ve { "ven", "ve", N_( "Venda" ) }, // language code: vie vi { "vie", "vi", N_( "Vietnamese" ) }, // language code: vol vo { "vol", "vo", N_( "Volapuk" ) }, // language code: vot { "vot", NULL, N_( "Votic" ) }, // language code: wak { "wak", NULL, N_( "Wakashan Languages" ) }, // language code: wal { "wal", NULL, N_( "Walamo" ) }, // language code: war { "war", NULL, N_( "Waray" ) }, // language code: was { "was", NULL, N_( "Washo" ) }, // language code: wel cym cy { "wel", "cy", N_( "Welsh" ) }, // language code: wel cym cy { "cym", NULL, N_( "Welsh" ) }, // language code: wen { "wen", NULL, N_( "Sorbian Languages" ) }, // language code: wln wa { "wln", "wa", N_( "Walloon" ) }, // language code: wol wo { "wol", "wo", N_( "Wolof" ) }, // language code: xal { "xal", NULL, N_( "Kalmyk" ) }, // language code: xho xh { "xho", "xh", N_( "Xhosa" ) }, // language code: yao { "yao", NULL, N_( "Yao" ) }, // language code: yap { "yap", NULL, N_( "Yapese" ) }, // language code: yid yi { "yid", "yi", N_( "Yiddish" ) }, // language code: yor yo { "yor", "yo", N_( "Yoruba" ) }, // language code: ypk { "ypk", NULL, N_( "Yupik Languages" ) }, // language code: zap { "zap", NULL, N_( "Zapotec" ) }, // language code: zen { "zen", NULL, N_( "Zenaga" ) }, // language code: zha za { "zha", "za", N_( "Zhuang" ) }, // language code: znd { "znd", NULL, N_( "Zande" ) }, // language code: zul zu { "zul", "zu", N_( "Zulu" ) }, // language code: zun { "zun", NULL, N_( "Zuni" ) }, { NULL, NULL, NULL } }; for (const LangInit * i = langInit; i->iso639_2 != NULL; ++i) { const char * name( i->name ); _codeMap[i->iso639_2] = name; if (i->iso639_1 != NULL) _codeMap[i->iso639_1] = name; } } } // namespace /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/LanguageCode.h000066400000000000000000000043271476576476200171150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/LanguageCode.h * */ #ifndef ZYPP_LANGUAGECODE_H #define ZYPP_LANGUAGECODE_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class LanguageCode /// \brief Language codes (iso639_2/iso639_1). /// /// In fact the class will not prevent to use a non iso language code. /// Just a warning will appear in the log. /////////////////////////////////////////////////////////////////// class ZYPP_API LanguageCode : public IdStringType { public: /** Default Ctor: \ref noCode */ LanguageCode(); /** Ctor from string. */ explicit LanguageCode( IdString str_r ); /** Ctor from string. */ explicit LanguageCode( const std::string & str_r ); /** Ctor from string. */ explicit LanguageCode( const char * str_r ); /** Dtor */ ~LanguageCode(); public: /** \name LanguageCode constants. */ //@{ /** Empty code. */ static const LanguageCode noCode; /** Last resort "en". */ static const LanguageCode enCode; //@} public: /** Return the language code asString. */ std::string code() const { return std::string(_str); } /** Return the translated language name; if unknown the language code. */ std::string name() const; private: friend class IdStringType; IdString _str; }; } // namespace zypp /////////////////////////////////////////////////////////////////// ZYPP_DEFINE_ID_HASHABLE( ::zypp::LanguageCode ); #endif // ZYPP_LANGUAGECODE_H libzypp-17.36.5/zypp/Locale.cc000066400000000000000000000156131476576476200161340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Locale.cc * */ #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /** Wrap static codemap data. */ struct CodeMaps { /** Return IdString without trailing garbage. */ static IdString withoutTrash( IdString code_r ) { boost::string_ref::size_type sep = trashStart( code_r ); if ( sep != boost::string_ref::npos ) code_r = IdString( code_r.c_str(), sep ); return code_r; } /** Return IdString without trailing garbage. */ static IdString withoutTrash( const std::string & code_r ) { return withoutTrash( boost::string_ref(code_r) ); } /** Return IdString without trailing garbage. */ static IdString withoutTrash( const char * code_r ) { return( code_r ? withoutTrash( boost::string_ref(code_r) ) : IdString::Null ); } /** Return IdString from language/country codes. */ static IdString combineLC( const LanguageCode& language_r, const CountryCode& country_r ) { IdString ret; if ( language_r ) { if ( country_r ) ret = IdString( std::string(language_r) + "_" + country_r.c_str() ); else ret = IdString(language_r); } else { if ( country_r ) ret = IdString( "_" + std::string(country_r) ); else if ( ! ( IdString(language_r) || IdString(country_r) ) ) ret = IdString::Null; // else IdString::Empty } return ret; } /** The singleton */ static CodeMaps & instance() { static CodeMaps _instance; return _instance; } LanguageCode language( IdString index_r ) { return getIndex( index_r )._l; } CountryCode country( IdString index_r ) { return getIndex( index_r )._c; } std::string name( IdString index_r ) { const LC & lc( getIndex( index_r ) ); std::string ret( lc._l.name() ); if ( lc._c ) { ret += " ("; ret += lc._c.name(); ret += ")"; } return ret; } Locale fallback( IdString index_r ) { static const IdString special( "pt_BR" ); Locale ret; if ( index_r == special ) // "pt_BR"->"en" - by now the only fallback exception ret = Locale::enCode; else { const LC & lc( getIndex( index_r ) ); if ( lc._c ) ret = lc._l; else if ( lc._l && lc._l != LanguageCode::enCode ) ret = Locale::enCode; } return ret; } private: static IdString withoutTrash( boost::string_ref code_r ) { boost::string_ref::size_type sep = trashStart( code_r ); if ( sep != boost::string_ref::npos ) code_r = code_r.substr( 0, sep ); return IdString( code_r ); } static boost::string_ref::size_type trashStart( boost::string_ref code_r ) { return code_r.find_first_of( "@." ); } static boost::string_ref::size_type trashStart( IdString code_r ) { return trashStart( boost::string_ref(code_r.c_str()) ); } private: struct LC { LC() {} LC( const LanguageCode& l_r ) : _l( l_r ) {} LC( const LanguageCode& l_r, const CountryCode& c_r ) : _l( l_r ), _c( c_r ) {} LanguageCode _l; CountryCode _c; }; using CodeMap = std::unordered_map; /** Ctor initializes the code maps. */ CodeMaps() : _codeMap( { { IdString::Null, LC( LanguageCode(IdString::Null), CountryCode(IdString::Null) ) } , { IdString::Empty, LC( LanguageCode(IdString::Empty), CountryCode(IdString::Empty) ) } } ) {} /** Return \ref LC for \a index_r, creating it if necessary. */ const LC & getIndex( IdString index_r ) { auto it = _codeMap.find( index_r ); if ( it == _codeMap.end() ) { CodeMap::value_type newval( index_r, LC() ); boost::string_ref str( index_r.c_str() ); boost::string_ref::size_type sep = str.find( '_' ); if ( sep == boost::string_ref::npos ) newval.second._l = LanguageCode( index_r ); else { // bsc#1064999: dup! Creating a new IdString may invalidate the IdString.c_str() stored in str. std::string dup( str ); str = dup; newval.second._l = LanguageCode( IdString(str.substr( 0, sep )) ); newval.second._c = CountryCode( IdString(str.substr( sep+1 )) ); } it = _codeMap.insert( std::move(newval) ).first; } return it->second; } private: CodeMap _codeMap; }; /////////////////////////////////////////////////////////////////// // class Locale /////////////////////////////////////////////////////////////////// const Locale Locale::noCode; const LanguageCode LanguageCode::enCode("en"); // from in LanguageCode.cc as Locale::enCode depends on it const Locale Locale::enCode( LanguageCode::enCode ); Locale::Locale() {} Locale::Locale( IdString str_r ) : _str( CodeMaps::withoutTrash( str_r ) ) {} Locale::Locale( const std::string & str_r ) : _str( CodeMaps::withoutTrash( str_r ) ) {} Locale::Locale( const char * str_r ) : _str( CodeMaps::withoutTrash( str_r ) ) {} Locale::Locale( const LanguageCode& language_r, const CountryCode& country_r ) : _str( CodeMaps::combineLC( language_r, country_r ) ) {} Locale::~Locale() {} LanguageCode Locale::language() const { return CodeMaps::instance().language( _str ); } CountryCode Locale::country() const { return CodeMaps::instance().country( _str ); } std::string Locale::name() const { return CodeMaps::instance().name( _str ); } Locale Locale::fallback() const { return CodeMaps::instance().fallback( _str ); } /////////////////////////////////////////////////////////////////// Locale Locale::bestMatch( const LocaleSet & avLocales_r, Locale requested_r ) { if ( ! avLocales_r.empty() ) { if ( ! requested_r ) requested_r = ZConfig::instance().textLocale(); for ( ; requested_r; requested_r = requested_r.fallback() ) { if ( avLocales_r.count( requested_r ) ) return requested_r; } } return Locale(); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Locale.h000066400000000000000000000072761476576476200160040ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Locale.h * */ #ifndef ZYPP_LOCALE_H #define ZYPP_LOCALE_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { class Locale; using LocaleSet = std::unordered_set; /////////////////////////////////////////////////////////////////// /// \class Locale /// \brief 'Language[_Country]' codes. /// /// In fact the class will not prevent to use a non iso code. /// Just a warning will appear in the log. Construction from string /// consider everything up to the first \c '.' or \c '@'. /// \code /// Locale l( "de_DE.UTF-8" ); /// /// l.code() == "de_DE"; /// l.language() == "de"; /// l.country() == "DE"; /// /// l.fallback() == "de"; /// l.fallback().fallback() == Locale::enCode == "en"; /// l.fallback().fallback().fallback() == Locale::noCode == ""; /// \endcode /////////////////////////////////////////////////////////////////// class ZYPP_API Locale : public IdStringType { public: /** Default Ctor: \ref noCode */ Locale(); /** Ctor from string. */ explicit Locale( IdString str_r ); /** Ctor from string. */ explicit Locale( const std::string & str_r ); /** Ctor from string. */ explicit Locale( const char * str_r ); /** Ctor taking LanguageCode and optional CountryCode. */ Locale( const LanguageCode& language_r, const CountryCode& country_r = CountryCode() ); /** Dtor */ ~Locale(); public: /** \name Locale constants. */ //@{ /** Empty code. */ static const Locale noCode; /** Last resort "en". */ static const Locale enCode; //@} public: /** The language part. */ LanguageCode language() const; /** The county part.*/ CountryCode country() const; /** Return the locale code asString. */ std::string code() const { return std::string(_str); } /** Return the translated locale name. */ std::string name() const; public: /** Return the fallback locale for this locale, if no fallback exists the empty Locale::noCode. * The usual fallback sequence is "language_COUNTRY" -> "language" -> Locale::enCode ("en") * ->Locale::noCode (""). Some exceptions like "pt_BR"->"en"->"" do exist. */ Locale fallback() const; /** Return the best match for \ref Locale \a requested_r within the available \a avLocales_r. * * If \a requested_r is not specified \ref ZConfig::textLocale is assumed. * * If neither \c requested_r nor any of its \ref fallback locales are available * in \a avLocales_r, \ref Locale::noCode is returned. */ static Locale bestMatch( const LocaleSet & avLocales_r, Locale requested_r = Locale() ); private: friend class IdStringType; IdString _str; }; } // namespace zypp /////////////////////////////////////////////////////////////////// ZYPP_DEFINE_ID_HASHABLE( ::zypp::Locale ); #endif // ZYPP_LOCALE_H libzypp-17.36.5/zypp/Locks.cc000066400000000000000000000265221476576476200160110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "locks" #include using std::endl; namespace zypp { Locks& Locks::instance() { static Locks _instance; return _instance; } using LockSet = std::set; template void remove_if( LockSet & lockset_r, TPredicate pred_r ) { LockSet::iterator first = lockset_r.begin(); LockSet::iterator last = lockset_r.end(); while ( first != last ) { LockSet::iterator next = first; ++next; if ( pred_r( *first ) ) lockset_r.erase( first ); first = next; } } class Locks::Impl { public: LockSet toAdd; LockSet toRemove; bool locksDirty; bool mergeList(callback::SendReport& report); Impl() : locksDirty( false ) , _APIdirty( false ) {} // need to control manip locks _locks to maintain the legacy API LockList::iterator begin/end const LockSet & locks() const { return _locks; } LockSet & MANIPlocks() { if ( !_APIdirty ) _APIdirty = true; return _locks; } const LockList & APIlocks() const { if ( _APIdirty ) { _APIlocks.clear(); _APIlocks.insert( _APIlocks.end(), _locks.begin(), _locks.end() ); _APIdirty = false; } return _APIlocks; } private: // need to control manip in ordert to maintain the legacy API LockList::iterator begin/end LockSet _locks; mutable LockList _APIlocks; mutable bool _APIdirty; }; Locks::Locks() : _pimpl(new Impl){} Locks::const_iterator Locks::begin() const { return _pimpl->APIlocks().begin(); } Locks::const_iterator Locks::end() const { return _pimpl->APIlocks().end(); } Locks::LockList::size_type Locks::size() const { return _pimpl->locks().size(); } bool Locks::empty() const { return _pimpl->locks().empty(); } struct ApplyLock { void operator()(const PoolQuery& query) const { for ( const PoolItem & item : query.poolItem() ) { item.status().setLock(true,ResStatus::USER); DBG << "lock "<< item.name(); } } }; /** * iterator that takes lock, lock all solvables from query * and send query to output iterator */ template struct LockingOutputIterator { LockingOutputIterator(OutputIterator& out_) : out(out_) {} void operator()(const PoolQuery& query) const { ApplyLock a;a(query); *out++ = query; } private: OutputIterator& out; }; void Locks::readAndApply( const Pathname& file ) { MIL << "read and apply locks from "< ii( _pimpl->MANIPlocks(), _pimpl->MANIPlocks().end() ); LockingOutputIterator > lout(ii); readPoolQueriesFromFile( file, boost::make_function_output_iterator(lout) ); } else MIL << "file does not exist(or cannot be stat), no lock added." << endl; } void Locks::read( const Pathname& file ) { MIL << "read locks from "<(_pimpl->MANIPlocks(), _pimpl->MANIPlocks().end()) ); else MIL << "file does not exist(or cannot be stat), no lock added." << endl; } void Locks::apply() const { DBG << "apply locks" << endl; for_each(_pimpl->locks().begin(), _pimpl->locks().end(), ApplyLock()); } void Locks::addLock( const PoolQuery& query ) { MIL << "add new lock" << endl; for_( it,query.begin(),query.end() ) { PoolItem item(*it); item.status().setLock(true,ResStatus::USER); } if ( _pimpl->toRemove.erase( query ) ) { DBG << "query removed from toRemove" << endl; } else { DBG << "query added as new" << endl; _pimpl->toAdd.insert( query ); } } void Locks::addLock( const IdString& ident_r ) { sat::Solvable::SplitIdent id(ident_r); addLock(id.kind(),id.name()); } void Locks::addLock( const ResKind& kind_r, const C_Str & name_r ) { addLock(kind_r,IdString(name_r)); } void Locks::addLock( const ResKind& kind_r, const IdString& name_r ) { PoolQuery q; q.addAttribute( sat::SolvAttr::name,name_r.asString() ); q.addKind( kind_r ); q.setMatchExact(); q.setCaseSensitive(true); DBG << "add lock by identifier" << endl; addLock( q ); } void Locks::removeLock( const PoolQuery& query ) { MIL << "remove lock" << endl; for_( it,query.begin(),query.end() ) { PoolItem item(*it); item.status().setLock(false,ResStatus::USER); } if ( _pimpl->toAdd.erase( query ) ) { DBG << "query removed from added" << endl; } else { DBG << "need to remove some old lock" << endl; _pimpl->toRemove.insert( query ); } } void Locks::removeLock( const IdString& ident_r ) { sat::Solvable::SplitIdent id(ident_r); removeLock(id.kind(),id.name()); } void Locks::removeLock( const ResKind& kind_r, const C_Str & name_r ) { removeLock(kind_r,IdString(name_r)); } void Locks::removeLock( const ResKind &kind_r, const IdString &name_r ) { PoolQuery q; q.addAttribute( sat::SolvAttr::name,name_r.asString() ); q.addKind( kind_r ); q.setMatchExact(); q.setCaseSensitive(true); DBG << "remove lock by Selectable" << endl; removeLock(q); } bool Locks::existEmpty() const { for_( it, _pimpl->locks().begin(), _pimpl->locks().end() ) { if( it->empty() ) return true; } return false; } //handle locks during removing class LocksCleanPredicate{ private: bool skip_rest; size_t searched; size_t all; callback::SendReport &report; public: LocksCleanPredicate(size_t count, callback::SendReport &_report): skip_rest(false),searched(0),all(count), report(_report){} bool aborted(){ return skip_rest; } bool operator()( const PoolQuery & q ) { if( skip_rest ) return false; searched++; if( !q.empty() ) return false; if (!report->progress((100*searched)/all)) { skip_rest = true; return false; } switch (report->execute(q)) { case CleanEmptyLocksReport::ABORT: report->finish(CleanEmptyLocksReport::ABORTED); skip_rest = true; return false; case CleanEmptyLocksReport::DELETE: return true; case CleanEmptyLocksReport::IGNORE: return false; default: INT << "Unexpected return value from callback. Need to adapt switch statement." << std::endl; } return false; } }; void Locks::removeEmpty() { MIL << "clean of locks" << endl; callback::SendReport report; report->start(); size_t sum = _pimpl->locks().size(); LocksCleanPredicate p(sum, report); remove_if( _pimpl->MANIPlocks(), p ); if( p.aborted() ) { MIL << "cleaning aborted" << endl; report->finish(CleanEmptyLocksReport::ABORTED); } else { report->finish(CleanEmptyLocksReport::NO_ERROR); } if ( sum != _pimpl->locks().size() ) //some locks has been removed _pimpl->locksDirty = true; } class LocksRemovePredicate { private: std::set& solvs; const PoolQuery& query; callback::SendReport& report; bool aborted_; //1 for subset of set, 2 only intersect, 0 for not intersect int contains(const PoolQuery& q, std::set& s) { bool intersect = false; for_( it,q.begin(),q.end() ) { if ( s.find(*it)!=s.end() ) { intersect = true; } else { if (intersect) return 2; } } return intersect ? 1 : 0; } public: LocksRemovePredicate(std::set& s, const PoolQuery& q, callback::SendReport& r) : solvs(s), query(q),report(r),aborted_(false) {} bool operator()(const PoolQuery& q) { if (aborted()) return false; if( q==query ) {//identical DBG << "identical queries" << endl; return true; } SavingLocksReport::ConflictState cs; switch( contains(q,solvs) ) { case 0: return false; //another lock case 1: cs = SavingLocksReport::SAME_RESULTS; break; case 2: cs = SavingLocksReport::INTERSECT; break; default: return true; } MIL << "find conflict: " << cs << endl; switch (report->conflict(q,cs)) { case SavingLocksReport::ABORT: aborted_ = true; DBG << "abort merging" << endl; return false; case SavingLocksReport::DELETE: DBG << "force delete" << endl; return true; case SavingLocksReport::IGNORE: DBG << "skip lock" << endl; return false; } INT << "Unexpected return value from callback. Need to adapt switch statement." << std::endl; return false; } bool aborted(){ return aborted_; } }; bool Locks::Impl::mergeList(callback::SendReport& report) { MIL << "merge list old: " << locks().size() << " to add: " << toAdd.size() << " to remove: " << toRemove.size() << endl; for_(it,toRemove.begin(),toRemove.end()) { std::set s(it->begin(),it->end()); remove_if( MANIPlocks(), LocksRemovePredicate(s,*it, report) ); } if (!report->progress()) return false; for ( const auto & q : toAdd ) { const auto & [i,b] { MANIPlocks().insert( q ) }; if ( not b && i->comment() != q.comment() ) i->setComment( q.comment() ); // update comment if query already exists } toAdd.clear(); toRemove.clear(); return true; } void Locks::merge() { if( (_pimpl->toAdd.size() | _pimpl->toRemove.size())==0) { return; //nothing to merge } callback::SendReport report; report->start(); if (!_pimpl->mergeList(report)) { report->finish(SavingLocksReport::ABORTED); return; } DBG << "locks merged" << endl; report->finish(SavingLocksReport::NO_ERROR); _pimpl->locksDirty = true; } void Locks::save( const Pathname& file ) { if( ((_pimpl->toAdd.size() | _pimpl->toRemove.size())==0) && !_pimpl->locksDirty ) { DBG << "nothing changed in locks - no write to file" << endl; return; } callback::SendReport report; report->start(); if ((_pimpl->toAdd.size() | _pimpl->toRemove.size())!=0) { if (!_pimpl->mergeList(report)) { report->finish(SavingLocksReport::ABORTED); return; } } DBG << "wrote "<< _pimpl->locks().size() << "locks" << endl; writePoolQueriesToFile( file, _pimpl->locks().begin(), _pimpl->locks().end() ); report->finish(SavingLocksReport::NO_ERROR); } void Locks::removeDuplicates() { /* NOP since implementation uses std::set */ } } // ns zypp libzypp-17.36.5/zypp/Locks.h000066400000000000000000000074721476576476200156560ustar00rootroot00000000000000#ifndef ZYPP_LOCKS_H #define ZYPP_LOCKS_H #include #include #include #include namespace zypp { /** \name Locks */ //@{ /** * Singleton class which manipulate with locks file and apply locks on pool. * for user information about locksfile and its format see * http://en.opensuse.org/Libzypp/Locksfile */ class ZYPP_API Locks { public: using LockList = std::list; using const_iterator = LockList::const_iterator; using size_type = LockList::size_type; public: class Impl; /** * Gets instance of this class. * Singleton method. */ static Locks& instance(); const_iterator begin() const; const_iterator end() const; LockList::size_type size() const; bool empty() const; /** * TODO add: * toBeAdded{Begin,End,Size,Empty} * toBeRemoved{Begin,End,Size,Empty} */ /** * locks result of query and add this lock as toAdd */ void addLock( const PoolQuery& query ); /** * add lock by identifier (e.g. Selectable->ident() * and add this lock as toAdd */ void addLock( const IdString& ident_r ); /** * add lock by name and kind and * add this lock as toAdd */ void addLock( const ResKind& kind_r, const IdString& name_r ); /** * add lock by name and kind and * add this lock as toAdd */ void addLock( const ResKind& kind_r, const C_Str& name_r ); /** * unlocks by result of query and add to toRemove. * * If unlock non-saved lock (so it is in toAdd list) then both is deleted * and nothing happens during save */ void removeLock( const PoolQuery& query ); /** * remove lock by identifier (e.g. Selectable->ident() * * If unlock non-saved lock (so it is in toAdd list) then both is deleted * and nothing happens during save */ void removeLock( const IdString& ident_r ); /** * remove lock by name and kind * * If unlock non-saved lock (so it is in toAdd list) then both is deleted * and nothing happens during save */ void removeLock( const ResKind& kind_r, const IdString& name_r ); void removeLock( const ResKind& kind_r, const C_Str & name_r ); /** * Optimalized version of read and apply. * \see read * \see apply */ void readAndApply( const Pathname& file = ZConfig::instance().locksFile() ); /** * Read locks from file to list of stable locks (locks which is not changed * during session) */ void read( const Pathname& file = ZConfig::instance().locksFile() ); /** * Applies locks in stable list (locks which is not changed during session). */ void apply() const; /** * Merges toAdd and ToRemove list to stable list and * save that stable list to file. * \see SavingLocksReport */ void save( const Pathname& file = ZConfig::instance().locksFile() ); /** * Merges toAdd and ToRemove list to stable list. * \note Can call callback if problem during merging occure * \see SavingLocksReport */ void merge(); /** * Gets true if some lock doesn't lock any object in pool * This can happen e.g. if package is removed or * due to user bad definition of lock */ bool existEmpty() const; /** * Call callback for each empty lock. * \see existEmpty * \see CleanEmptyLocksReport * \note you must call \a save to write cleaned locks to file */ void removeEmpty(); /** * Delete all query duplicate in loaded locks. * \note you must call \a save to write cleaned locks to file */ void removeDuplicates(); //@} private: Locks(); RW_pointer > _pimpl; }; } #endif libzypp-17.36.5/zypp/ManagedFile.h000066400000000000000000000012161476576476200167250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ManagedFile.h * */ #include libzypp-17.36.5/zypp/MediaProducts.h000066400000000000000000000071211476576476200173350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/MediaProducts.h * Functions to find out products in media */ #ifndef ZYPP_MEDIAPRODUCTS_H_ #define ZYPP_MEDIAPRODUCTS_H_ #include #include #include #include #include #include #include #include #include namespace zypp { /** * \short Represents an available product in media */ struct MediaProductEntry { Pathname _dir; std::string _name; /** * \short Ctor */ MediaProductEntry( Pathname dir_r = "/", std::string name_r = std::string() ) : _dir(std::move(dir_r)), _name(std::move(name_r)) { } bool operator<( const MediaProductEntry &rhs ) const { int res = _name.compare( rhs._name ); return ( res < 0 || ( res == 0 && _dir < rhs._dir ) ); } }; /** * A set of available products in media */ using MediaProductSet = std::set; /** * FIXME: add a comment here... */ template static void scanProductsFile( const Pathname & file_r, TOutputIterator result ) { std::ifstream pfile( file_r.asString().c_str() ); while ( pfile.good() ) { std::string value = str::getline( pfile, str::TRIM ); if ( pfile.bad() ) { ERR << "Error parsing " << file_r << std::endl; ZYPP_THROW(Exception("Error parsing " + file_r.asString())); } if ( pfile.fail() ) { break; // no data on last line } std::string tag = str::stripFirstWord( value, true ); if ( tag.size() ) { *result = MediaProductEntry( tag, value ); } } } /** * \short Available products in a url location * * \param url_r url to inspect * \param result output iterator where \ref MediaProductEntry * items will be inserted. * \throws MediaException If accessng the media fails */ template void productsInMedia( const Url & url_r, TOutputIterator result ) { media::MediaManager media_mgr; // open the media media::MediaAccessId id = media_mgr.open(url_r); media_mgr.attach(id); Pathname products_file = Pathname("media.1/products"); try { media_mgr.provideFile (id, OnMediaLocation(products_file) ); products_file = media_mgr.localPath (id, products_file); scanProductsFile (products_file, result); } catch ( const Exception & excpt ) { ZYPP_CAUGHT(excpt); MIL << "No products description found on the Url" << std::endl; } media_mgr.release(id, ""); } /** * \short Available products in a url location * * \param url_r url to inspect * \param set ef MediaProductEntry set where * items will be inserted. * \throws MediaException If accessng the media fails */ void productsInMedia( const Url & url_r, MediaProductSet &set ) { productsInMedia(url_r, std::inserter(set, set.end())); } } // ns zypp #endif // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/MediaSetAccess.cc000066400000000000000000000374111476576476200175520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include //#include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::fetcher" using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(MediaSetAccess); /////////////////////////////////////////////////////////////////// MediaSetAccess::MediaSetAccess(Url url, Pathname prefered_attach_point) : _url(std::move(url)) , _prefAttachPoint(std::move(prefered_attach_point)) {} MediaSetAccess::MediaSetAccess(std::string label_r, Url url, Pathname prefered_attach_point) : _url(std::move(url)) , _prefAttachPoint(std::move(prefered_attach_point)) , _label(std::move( label_r )) {} MediaSetAccess::~MediaSetAccess() { try { media::MediaManager manager; for ( const auto & mm : _medias ) manager.close( mm.second ); } catch(...) {} // don't let exception escape a dtor. } void MediaSetAccess::setVerifier( unsigned media_nr, const media::MediaVerifierRef& verifier ) { if (_medias.find(media_nr) != _medias.end()) { // the media already exists, set theverifier media::MediaAccessId id = _medias[media_nr]; media::MediaManager media_mgr; media_mgr.addVerifier( id, verifier ); // remove any saved verifier for this media _verifiers.erase(media_nr); } else { // save the verifier in the map, and set it when // the media number is first attached _verifiers[media_nr] = verifier; } } void MediaSetAccess::releaseFile( const OnMediaLocation & on_media_file ) { releaseFile( on_media_file.filename(), on_media_file.medianr() ); } void MediaSetAccess::releaseFile( const Pathname & file, unsigned media_nr) { media::MediaManager media_mgr; media::MediaAccessId media = getMediaAccessId( media_nr); DBG << "Going to release file " << file << " from media number " << media_nr << endl; if ( ! media_mgr.isAttached(media) ) return; //disattached media is free media_mgr.releaseFile (media, file); } void MediaSetAccess::dirInfo( filesystem::DirContent &retlist, const Pathname &dirname, bool dots, unsigned media_nr ) { media::MediaManager media_mgr; media::MediaAccessId media = getMediaAccessId(media_nr); // try to attach the media if ( ! media_mgr.isAttached(media) ) media_mgr.attach(media); media_mgr.dirInfo(media, retlist, dirname, dots); } struct ProvideFileOperation { Pathname result; void operator()( media::MediaAccessId media, const OnMediaLocation &file ) { media::MediaManager media_mgr; media_mgr.provideFile( media, file ); result = media_mgr.localPath( media, file.filename() ); } }; struct ProvideDirTreeOperation { Pathname result; void operator()( media::MediaAccessId media, const OnMediaLocation &file ) { const auto &fName = file.filename(); media::MediaManager media_mgr; media_mgr.provideDirTree( media, fName ); result = media_mgr.localPath( media, fName ); } }; struct ProvideDirOperation { Pathname result; void operator()( media::MediaAccessId media, const OnMediaLocation &file ) { const auto &fName = file.filename(); media::MediaManager media_mgr; media_mgr.provideDir( media, fName ); result = media_mgr.localPath( media, fName ); } }; struct ProvideFileExistenceOperation { bool result; ProvideFileExistenceOperation() : result(false) {} void operator()( media::MediaAccessId media, const OnMediaLocation &file ) { const auto &fName = file.filename(); media::MediaManager media_mgr; result = media_mgr.doesFileExist( media, fName ); } }; Pathname MediaSetAccess::provideFile( const OnMediaLocation &resource, ProvideFileOptions options ) { ProvideFileOperation op; provide( std::ref(op), resource, options ); return op.result; } Pathname MediaSetAccess::provideFile( const OnMediaLocation & resource, ProvideFileOptions options, const Pathname &deltafile ) { return provideFile( OnMediaLocation( resource ).setDeltafile( deltafile ), options ); } Pathname MediaSetAccess::provideFile(const Pathname & file, unsigned media_nr, ProvideFileOptions options ) { return provideFile( OnMediaLocation( file, media_nr ), options ); } Pathname MediaSetAccess::provideOptionalFile( const Pathname & file, unsigned media_nr ) { try { return provideFile( OnMediaLocation( file, media_nr ).setOptional( true ), PROVIDE_NON_INTERACTIVE ); } catch ( const media::MediaFileNotFoundException & excpt_r ) { ZYPP_CAUGHT( excpt_r ); } catch ( const media::MediaForbiddenException & excpt_r ) { ZYPP_CAUGHT( excpt_r ); } catch ( const media::MediaNotAFileException & excpt_r ) { ZYPP_CAUGHT( excpt_r ); } return Pathname(); } ManagedFile MediaSetAccess::provideFileFromUrl(const Url &file_url, ProvideFileOptions options) { Url url(file_url); Pathname path(url.getPathName()); url.setPathName ("/"); MediaSetAccess access(url); ManagedFile tmpFile = filesystem::TmpFile::asManagedFile(); bool optional = options & PROVIDE_NON_INTERACTIVE; Pathname file = access.provideFile( OnMediaLocation(path, 1).setOptional( optional ), options ); //prevent the file from being deleted when MediaSetAccess gets out of scope if ( filesystem::hardlinkCopy(file, tmpFile) != 0 ) ZYPP_THROW(Exception("Can't copy file from " + file.asString() + " to " + tmpFile->asString() )); return tmpFile; } ManagedFile MediaSetAccess::provideOptionalFileFromUrl( const Url & file_url ) { try { return provideFileFromUrl( file_url, PROVIDE_NON_INTERACTIVE ); } catch ( const media::MediaFileNotFoundException & excpt_r ) { ZYPP_CAUGHT( excpt_r ); } catch ( const media::MediaNotAFileException & excpt_r ) { ZYPP_CAUGHT( excpt_r ); } return ManagedFile(); } bool MediaSetAccess::doesFileExist(const Pathname & file, unsigned media_nr ) { ProvideFileExistenceOperation op; OnMediaLocation resource(file, media_nr); provide( std::ref(op), resource, PROVIDE_DEFAULT ); return op.result; } void MediaSetAccess::precacheFiles(const std::vector &files) { media::MediaManager media_mgr; for ( const auto &resource : files ) { unsigned media_nr(resource.medianr()); media::MediaAccessId media = getMediaAccessId( media_nr ); if ( !media_mgr.isOpen( media ) ) { MIL << "Skipping precache of file " << resource.filename() << " media is not open"; continue; } if ( ! media_mgr.isAttached(media) ) media_mgr.attach(media); media_mgr.precacheFiles( media, { resource } ); } } void MediaSetAccess::provide( const ProvideOperation& op, const OnMediaLocation &resource, ProvideFileOptions options ) { const auto &file(resource.filename()); unsigned media_nr(resource.medianr()); callback::SendReport report; media::MediaManager media_mgr; media::MediaAccessId media = 0; do { // get the mediaId, but don't try to attach it here media = getMediaAccessId( media_nr); try { DBG << "Going to try to provide " << (resource.optional() ? "optional" : "") << " file " << file << " from media number " << media_nr << endl; // try to attach the media if ( ! media_mgr.isAttached(media) ) media_mgr.attach(media); op(media, resource); break; } catch ( media::MediaException & excp ) { ZYPP_CAUGHT(excp); media::MediaChangeReport::Action user = media::MediaChangeReport::ABORT; unsigned int devindex = 0; std::vector devices; media_mgr.getDetectedDevices(media, devices, devindex); do { // set up the reason media::MediaChangeReport::Error reason = media::MediaChangeReport::INVALID; if( typeid(excp) == typeid( media::MediaFileNotFoundException ) || typeid(excp) == typeid( media::MediaNotAFileException ) ) { reason = media::MediaChangeReport::NOT_FOUND; } else if( typeid(excp) == typeid( media::MediaNotDesiredException) || typeid(excp) == typeid( media::MediaNotAttachedException) ) { reason = media::MediaChangeReport::WRONG; } else if( typeid(excp) == typeid( media::MediaTimeoutException) || typeid(excp) == typeid( media::MediaTemporaryProblemException)) { reason = media::MediaChangeReport::IO_SOFT; } // Propagate the original error if _no_ callback receiver is connected, or // non_interactive mode (for optional files) is used (except for wrong media). if ( ! callback::SendReport::connected() || (( options & PROVIDE_NON_INTERACTIVE ) && reason != media::MediaChangeReport::WRONG ) ) { MIL << "Can't provide file. Non-Interactive mode." << endl; ZYPP_RETHROW(excp); } else { // release all media before requesting another (#336881) media_mgr.releaseAll(); user = report->requestMedia ( _url, media_nr, _label, reason, excp.asUserHistory(), devices, devindex ); } MIL << "ProvideFile exception caught, callback answer: " << user << endl; if( user == media::MediaChangeReport::ABORT ) { DBG << "Aborting" << endl; AbortRequestException aexcp("Aborting requested by user"); aexcp.remember(excp); ZYPP_THROW(aexcp); } else if ( user == media::MediaChangeReport::IGNORE ) { DBG << "Skipping" << endl; SkipRequestException nexcp("User-requested skipping of a file"); nexcp.remember(excp); ZYPP_THROW(nexcp); } else if ( user == media::MediaChangeReport::EJECT ) { DBG << "Eject: try to release" << endl; try { media_mgr.releaseAll(); media_mgr.release (media, devindex < devices.size() ? devices[devindex] : ""); } catch ( const Exception & e) { ZYPP_CAUGHT(e); } } else if ( user == media::MediaChangeReport::RETRY || user == media::MediaChangeReport::CHANGE_URL ) { // retry DBG << "Going to try again" << endl; // invalidate current media access id media_mgr.close(media); _medias.erase(media_nr); // not attaching, media set will do that for us // this could generate uncaught exception (#158620) break; } else { DBG << "Don't know, let's ABORT" << endl; ZYPP_RETHROW ( excp ); } } while( user == media::MediaChangeReport::EJECT ); } // retry or change URL } while( true ); } Pathname MediaSetAccess::provideDir(const Pathname & dir, bool recursive, unsigned media_nr, ProvideFileOptions options ) { OnMediaLocation resource(dir, media_nr); if ( recursive ) { ProvideDirTreeOperation op; provide( std::ref(op), resource, options ); return op.result; } ProvideDirOperation op; provide( std::ref(op), resource, options ); return op.result; } media::MediaAccessId MediaSetAccess::getMediaAccessId (media::MediaNr medianr) { if ( _medias.find( medianr ) != _medias.end() ) { return _medias[medianr]; } Url url( medianr > 1 ? rewriteUrl( _url, medianr ) : _url ); media::MediaManager media_mgr; media::MediaAccessId id = media_mgr.open( url, _prefAttachPoint ); _medias[medianr] = id; try { if ( _verifiers.find(medianr) != _verifiers.end() ) { // a verifier is set for this media // FIXME check the case where the verifier exists // but we have no access id for the media media_mgr.delVerifier( id ); media_mgr.addVerifier( id, _verifiers[medianr] ); // remove any saved verifier for this media _verifiers.erase( medianr ); } } catch ( const Exception &e ) { ZYPP_CAUGHT(e); WAR << "Verifier not found" << endl; } return id; } Url MediaSetAccess::rewriteUrl (const Url & url_r, const media::MediaNr medianr) { std::string scheme = url_r.getScheme(); if (scheme == "cd" || scheme == "dvd") return url_r; DBG << "Rewriting url " << url_r << endl; if( scheme == "iso") { // TODO the iso parameter will not be required in the future, this // code has to be adapted together with the MediaISO change. // maybe some MediaISOURL interface should be used. std::string isofile = url_r.getQueryParam("iso"); str::regex e("^(.*)(cd|dvd|media)[0-9]+\\.iso$", str::regex::icase); str::smatch what; if(str::regex_match(isofile, what, e)) { Url url( url_r); isofile = what[1] + what[2] + str::numstring(medianr) + ".iso"; url.setQueryParam("iso", isofile); DBG << "Url rewrite result: " << url << endl; return url; } } else { std::string pathname = url_r.getPathName(); str::regex e("^(.*)(cd|dvd|media)[0-9]+(/)?$", str::regex::icase); str::smatch what; if(str::regex_match(pathname, what, e)) { Url url( url_r); pathname = what[1] + what[2] + str::numstring(medianr) + what[3]; url.setPathName(pathname); DBG << "Url rewrite result: " << url << endl; return url; } } return url_r; } void MediaSetAccess::release() { DBG << "Releasing all media IDs held by this MediaSetAccess" << endl; media::MediaManager manager; for (MediaMap::const_iterator m = _medias.begin(); m != _medias.end(); ++m) manager.release(m->second, ""); } std::ostream & MediaSetAccess::dumpOn( std::ostream & str ) const { str << "MediaSetAccess (URL='" << _url << "', attach_point_hint='" << _prefAttachPoint << "')"; return str; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/MediaSetAccess.h000066400000000000000000000375121476576476200174160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MediaSetAccess_H #define ZYPP_MediaSetAccess_H #include #include #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(MediaSetAccess); /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaSetAccess // /** * Media access layer responsible for handling files distributed on a set * of media with media change and abort/retry/ingore user callback handling. * * This is provided as a means to handle CD or DVD sets accessible through * dir, iso, nfs or other URL schemes other than cd/dvd (see * \ref MediaManager for info on different implemented media backends). * Currently it handles URLs ending on (case insensitive ) CD#, DVD# or MEDIA#, * where # is the number of a particular medium in the set. * * Examples: * \code * "iso:/?iso=/path/to/iso/images/openSUSE-10.3-Alpha2plus-DVD-x86_64-DVD1.iso" * "dir:/path/to/cdset/sources/openSUSE-10.3/Alpha2plus/CD1" * \endcode * * MediaSetAccess accesses files on the desired medium by rewriting * the original URL, replacing the digit (usually) 1 with requested media * number and uses \ref MediaManager to get the files from the new URL. * * NOTE: Access to medium #1 always uses the url passed to the CTOR! * * Additionaly, each media number can be assinged a media verifier which * checks if the media we are trying to access is the desired one. See * \ref MediaVerifierBase for more info. * * Code example: * \code * Url url("dir:/path/to/cdset/sources/openSUSE-10.3/Alpha2plus/CD1"); * * MediaSetAccess access(url); * * access.setVerifier(1, media1VerifierRef); * access.setVerifier(2, media2VerifierRef); * * Pathname file1 = "/some/file/on/media1"; * Pathname providedfile1 = access.provideFile(file1, 1); * Pathname file2 = "/some/file/on/media2"; * Pathname providedfile2 = access.provideFile(file1, 2); * * \endcode */ class ZYPP_API MediaSetAccess : public base::ReferenceCounted, private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const MediaSetAccess & obj ); public: /** * Creates a callback enabled media access for specified \a url. * * \param url * \param prefered_attach_point Prefered attach (mount) point. Use, if * you want to mount the media to a specific directory. */ MediaSetAccess( Url url, Pathname prefered_attach_point = "" ); /** \overload Also taking a \ref label. */ MediaSetAccess( std::string label_r, Url url, Pathname prefered_attach_point = "" ); ~MediaSetAccess() override; /** * Sets a \ref MediaVerifier verifier for given media number. */ void setVerifier( unsigned media_nr, const media::MediaVerifierRef& verifier ); /** * The label identifing this media set and to be sent in a media change request. */ const std::string & label() const { return _label; } /** * Set the label identifing this media set and to be sent in a media change request. */ void setLabel( const std::string & label_r ) { _label = label_r; } enum ProvideFileOption { /** * The user is not asked anything, and the error * exception is just propagated */ PROVIDE_DEFAULT = 0x0, PROVIDE_NON_INTERACTIVE = 0x1 }; ZYPP_DECLARE_FLAGS(ProvideFileOptions,ProvideFileOption); /** * Tries to fetch the given files and precaches them. Those files * need to be queried using provideFile and can be read from the cache directly. * The implementation is not allowed to block but needs to use seperate means to * download the files concurrently. * A backend can choose to completely ignore this functionaly, the default implementation * does nothing. * * \param files List of files that should be precached */ void precacheFiles(const std::vector &files); /** * Provides a file from a media location. * * \param resource location of the file on media * \return local pathname of the requested file * * \throws MediaException if a problem occured and user has chosen to * abort the operation. The calling code should take care * to quit the current operation. * \throws SkipRequestException if a problem occured and user has chosen * to skip the current operation. The calling code should continue * with the next one, if possible. * * * If the resource is marked as optional, no Exception is thrown * and Pathname() is returned * * the optional deltafile argument describes a file that can * be used for delta download algorithms. * * \note interaction with the user does not ocurr if * \ref ProvideFileOptions::NON_INTERACTIVE is set. * * \note OnMediaLocation::optional() hint has no effect on the transfer. * * \see zypp::media::MediaManager::provideFile() */ Pathname provideFile( const OnMediaLocation & resource, ProvideFileOptions options = PROVIDE_DEFAULT ); /** * \deprecated The deltafile argument is part of the OnMediaLocation now, use the version of \ref provideFile( const OnMediaLocation & resource, ProvideFileOptions options ) */ ZYPP_DEPRECATED Pathname provideFile( const OnMediaLocation & resource, ProvideFileOptions options, const Pathname &deltafile ); /** * Provides \a file from media \a media_nr. * * \param file path to the file relative to media URL * \param media_nr the media number in the media set * \return local pathname of the requested file * * \note interaction with the user does not ocurr if * \ref ProvideFileOptions::NON_INTERACTIVE is set. * * \note OnMediaLocation::optional() hint has no effect on the transfer. * * \throws MediaException if a problem occured and user has chosen to * abort the operation. The calling code should take care * to quit the current operation. * \throws SkipRequestException if a problem occured and user has chosen * to skip the current operation. The calling code should continue * with the next one, if possible. * \see zypp::media::MediaManager::provideFile() */ Pathname provideFile(const Pathname & file, unsigned media_nr = 1, ProvideFileOptions options = PROVIDE_DEFAULT ); /** * Provides an optional \a file from media \a media_nr. * * Like \ref provideFile (NON_INTERACTIVE), but return an empty \ref Pathname * rather than throwing a \ref MediaException if the file is not present on * the media. */ Pathname provideOptionalFile( const Pathname & file, unsigned media_nr = 1 ); /** * Provides \a file from \a url. * * \param absolute url to the file * \return local pathname of the requested file * * \note interaction with the user does not ocurr if * \ref ProvideFileOptions::NON_INTERACTIVE is set. * * \throws MediaException if a problem occured and user has chosen to * abort the operation. The calling code should take care * to quit the current operation. * \throws SkipRequestException if a problem occured and user has chosen * to skip the current operation. The calling code should continue * with the next one, if possible. * \see zypp::media::MediaManager::provideFile() */ static ManagedFile provideFileFromUrl( const Url & file_url, ProvideFileOptions options = PROVIDE_DEFAULT ); /** * Provides an optional \a file from \a url. * * Like \ref provideFileFromUrl( NON_INTERACTIVE ), but return an empty \ref Pathname * rather than throwing a \ref MediaException if the file is not present on * the media. */ static ManagedFile provideOptionalFileFromUrl( const Url & file_url ); /** * Release file from media. * This signal that file is not needed anymore. * * \param resource location of the file on media */ void releaseFile( const OnMediaLocation &resource ); /** * Release file from media. * This signal that file is not needed anymore. * * \param file path to the file relative to media URL * \param media_nr the media number in the media set */ void releaseFile(const Pathname & file, unsigned media_nr = 1 ); /////////////////////////////////////////////////////////////////// /// \class MediaSetAccess::ReleaseFileGuard /// \brief Release a provided file upon destruction. /// In case you don't want to wait until the \ref MediaSetAccess /// itself goes out of scope. /// \code /// MediaSetAccess media; /// OnMediaLocation loc; /// { /// Pathname file = media.provideFile( loc ); /// ReleaseFileGuard guard( media, loc ); /// } // provided file is released here. /// \endcode /// \ingroup g_RAII /////////////////////////////////////////////////////////////////// struct ReleaseFileGuard { NON_COPYABLE( ReleaseFileGuard ); NON_MOVABLE( ReleaseFileGuard ); ReleaseFileGuard( MediaSetAccess & media_r, const OnMediaLocation & loc_r ) : _media( media_r ) , _loc( loc_r ) {} ~ReleaseFileGuard() { _media.releaseFile( _loc ); } private: MediaSetAccess & _media; const OnMediaLocation & _loc; }; /** * Provides direcotry \a dir from media number \a media_nr. * * \param dir path to the directory relative to media URL * \param recursive whether to provide the whole directory subtree * \param media_nr the media number in the media set * \return local pathname of the requested directory * * \throws MediaException if a problem occured and user has chosen to * abort the operation. The calling code should take care * to quit the current operation. * \todo throw SkipRequestException if a problem occured and user has chosen * to skip the current operation. The calling code should continue * with the next one, if possible. * \see zypp::media::MediaManager::provideDir() * \see zypp::media::MediaManager::provideDirTree() */ Pathname provideDir(const Pathname & dir, bool recursive, unsigned media_nr = 1, ProvideFileOptions options = PROVIDE_DEFAULT ); /** * Checks if a file exists on the specified media, with user callbacks. * * \param file file to check * \param media_nr Media number * * \throws MediaException if a problem occured and user has chosen to * abort the operation. The calling code should take care * to quit the current operation. * \throws SkipRequestException if a problem occured and user has chosen * to skip the current operation. The calling code should continue * with the next one, if possible. * \see zypp::media::MediaManager::doesFileExist(MediaAccessId,const Pathname&) */ bool doesFileExist(const Pathname & file, unsigned media_nr = 1 ); /** * Fills \ref retlist with directory information. */ void dirInfo( filesystem::DirContent &retlist, const Pathname &dirname, bool dots = true, unsigned media_nr = 1 ); /** * Release all attached media of this set. * * \throws MediaNotOpenException for invalid access IDs. */ void release(); /** * Replaces media number in specified url with given \a medianr. * * Media number in the URL is searched for with regex * "^(.*(cd|dvd|media))([0-9]+)(\\.iso)$" for iso scheme and * with "^(.*(cd|dvd|media))([0-9]+)(/?)$" for other schemes. * * For cd and dvd scheme it returns the original URL, as well as for * URL which do not match the above regexes. * * \param url_r original URL * \param medianr requested media number * \return rewritten URL if applicable, the original URL otherwise */ static Url rewriteUrl (const Url & url_r, const media::MediaNr medianr); protected: /** * Provides the \a file from medium number \a media_nr and returns its * local path. * * \note The method must not throw if \a checkonly is true. * * \throws MediaException \a checkonly is false and * a problem occured and user has chosen to * abort the operation. The calling code should take care * to quit the current operation. * \throws SkipRequestException \a checkonly is false and * a problem occured and user has chosen * to skip the current operation. The calling code should continue * with the next one, if possible. */ Pathname provideFileInternal( const OnMediaLocation &resource, ProvideFileOptions options ); using ProvideOperation = function; void provide( const ProvideOperation& op, const OnMediaLocation &resource, ProvideFileOptions options ); media::MediaAccessId getMediaAccessId (media::MediaNr medianr); std::ostream & dumpOn( std::ostream & str ) const override; private: /** Media or media set URL */ Url _url; /** * Prefered mount point. * * \see MediaManager::open(Url,Pathname) * \see MediaHandler::_attachPoint */ Pathname _prefAttachPoint; std::string _label; using MediaMap = std::map; using VerifierMap = std::map; /** Mapping between media number and Media Access ID */ MediaMap _medias; /** Mapping between media number and corespondent verifier */ VerifierMap _verifiers; }; /////////////////////////////////////////////////////////////////// ZYPP_DECLARE_OPERATORS_FOR_FLAGS(MediaSetAccess::ProvideFileOptions); /** \relates MediaSetAccess Stream output */ inline std::ostream & operator<<( std::ostream & str, const MediaSetAccess & obj ) { return obj.dumpOn( str ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SOURCE_MediaSetAccess_H libzypp-17.36.5/zypp/Misc.h000066400000000000000000000013671476576476200154730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Misc.h * */ #ifndef ZYPP_MISC_H #define ZYPP_MISC_H #include #include #endif // ZYPP_MISC_H libzypp-17.36.5/zypp/OnMediaLocation.h000066400000000000000000000000471476576476200175770ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Package.cc000066400000000000000000000254111476576476200162650ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Package.cc * */ #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zyppintern { using namespace zypp; /** getVendorSupportOption return value */ using GetVendorSupportOptionReturn = std::pair>>; /** Get VendorSupportOption and the PKGNAME if VendorSupportSuperseded */ GetVendorSupportOptionReturn getVendorSupportOption( sat::Solvable solv_r ) { static const IdString support_unsupported( "support_unsupported" ); static const IdString support_acc( "support_acc" ); static const IdString support_l1( "support_l1" ); static const IdString support_l2( "support_l2" ); static const IdString support_l3( "support_l3" ); static const IdString support_superseded( "support_superseded" ); // opt. followed by "(PKGNAME)" GetVendorSupportOptionReturn ret { VendorSupportUnknown, std::nullopt }; // max over all identical packages for ( const auto & solv : sat::WhatProvides( (Capability(solv_r.ident().id())) ) ) { if ( solv.edition() == solv_r.edition() && solv.ident() == solv_r.ident() && solv_r.identical( solv ) ) { for ( PackageKeyword kw : Package::Keywords( sat::SolvAttr::keywords, solv ) ) { switch ( ret.first ) { case VendorSupportUnknown: if ( kw == support_unsupported ) { ret.first = VendorSupportUnsupported; break; } case VendorSupportUnsupported: if ( kw == support_acc ) { ret.first = VendorSupportACC; break; } case VendorSupportACC: if ( kw == support_l1 ) { ret.first = VendorSupportLevel1; break; } case VendorSupportLevel1: if ( kw == support_l2 ) { ret.first = VendorSupportLevel2; break; } case VendorSupportLevel2: if ( kw == support_l3 ) { ret.first = VendorSupportLevel3; break; } case VendorSupportLevel3: case VendorSupportSuperseded: // VendorSupportSuperseded is special as the kw may also contain a '(PKGNAME)'. // In fact even multiple (PKGNAMES) derived from multiple keywords. if ( strv::hasPrefix( kw.asStringView(), support_superseded.asStringView() ) ) { ret.first = VendorSupportSuperseded; if ( kw.c_str()[support_superseded.size()] == '(' && kw.c_str()[kw.size()-1] == ')' ) { std::string_view val { kw.c_str()+support_superseded.size()+1, kw.size()-support_superseded.size()-2 }; if ( not val.empty() ) { if ( not ret.second ) ret.second = std::set(); ret.second->insert( val ); } else { WAR << "No superseding package defined in " << kw << endl; } } else { WAR << "No superseding package defined in " << kw << endl; } } } } } } return ret; } inline bool schemeIsLocalDir( const Url & url_r ) { const std::string & s( url_r.getScheme() ); return s == "dir" || s == "file"; } // here and from SrcPackage.cc Pathname cachedLocation( const OnMediaLocation & loc_r, const RepoInfo & repo_r ) { PathInfo pi( repo_r.packagesPath() / repo_r.path() / loc_r.filename() ); if ( ! pi.isExist() ) return Pathname(); // no file in cache if ( loc_r.checksum().empty() ) { Url url( repo_r.url() ); if ( ! schemeIsLocalDir( url ) ) return Pathname(); // same name but no checksum to verify // for local repos compare with the checksum in repo if ( CheckSum( CheckSum::md5Type(), std::ifstream( (url.getPathName() / repo_r.path() / loc_r.filename()).c_str() ) ) != CheckSum( CheckSum::md5Type(), std::ifstream( pi.c_str() ) ) ) return Pathname(); // same name but wrong checksum } else { if ( loc_r.checksum() != CheckSum( loc_r.checksum().type(), std::ifstream( pi.c_str() ) ) ) return Pathname(); // same name but wrong checksum } return pi.path(); // the right one } } // namespace zyppintern /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(Package); /////////////////////////////////////////////////////////////////// // // METHOD NAME : Package::Package // METHOD TYPE : Ctor // Package::Package( const sat::Solvable & solvable_r ) : ResObject( solvable_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Package::~Package // METHOD TYPE : Dtor // Package::~Package() {} VendorSupportOption Package::vendorSupport() const { return zyppintern::getVendorSupportOption( satSolvable() ).first; } bool Package::maybeUnsupported() const { switch ( vendorSupport() ) { case VendorSupportUnknown: case VendorSupportUnsupported: case VendorSupportACC: case VendorSupportSuperseded: return true; case VendorSupportLevel1: case VendorSupportLevel2: case VendorSupportLevel3: break; // intentionally no default: } return false; } std::vector Package::supersededBy() const { std::vector ret; const auto & res = zyppintern::getVendorSupportOption( satSolvable() ); if ( res.second ) { // translate the string_view set into stings for ( const auto & v : *res.second ) ret.push_back( std::string( v ) ); } return ret; } std::pair,std::vector> Package::supersededByItems() const { std::pair,std::vector> ret; std::vector todo { supersededBy() }; if ( not todo.empty() ) { std::set done; // taken from todo and processed std::set unresolved; // supersededBy does not name a package std::set resolved; // supersededBy resolved to package (not superseded) while ( not todo.empty() ) { auto doneit { done.insert( std::move(todo.back()) ) }; todo.pop_back(); if ( not doneit.second ) continue; // already processed const std::string & next { *doneit.first }; if ( auto sel = ui::Selectable::get( next ) ) { const std::vector & more { sel->supersededBy() }; if ( more.empty() ) { resolved.insert( sel->ident() ); } else { todo.insert( todo.end(), more.begin(), more.end() ); } } else { unresolved.insert( next ); } } if ( not resolved.empty() ) ret.first.insert( ret.first.end(), resolved.begin(), resolved.end() ); if ( not unresolved.empty() ) ret.second.insert( ret.second.end(), unresolved.begin(), unresolved.end() ); } return ret; } Changelog Package::changelog() const { Target_Ptr target( getZYpp()->getTarget() ); if ( ! target ) { ERR << "Target not initialized. Changelog is not available." << std::endl; return Changelog(); } if ( repository().isSystemRepo() ) { target::rpm::RpmHeader::constPtr header; target->rpmDb().getData(name(), header); return header ? header->tag_changelog() : Changelog(); // might be deleted behind our back (bnc #530595) } WAR << "changelog is not available for uninstalled packages" << std::endl; return Changelog(); } std::string Package::buildhost() const { return lookupStrAttribute( sat::SolvAttr::buildhost ); } std::string Package::distribution() const { return lookupStrAttribute( sat::SolvAttr::distribution ); } std::string Package::license() const { return lookupStrAttribute( sat::SolvAttr::license ); } std::string Package::packager() const { return lookupStrAttribute( sat::SolvAttr::packager ); } std::string Package::group() const { return lookupStrAttribute( sat::SolvAttr::group ); } Package::Keywords Package::keywords() const { return Keywords( sat::SolvAttr::keywords, satSolvable() ); } std::string Package::url() const { return lookupStrAttribute( sat::SolvAttr::url ); } ByteCount Package::sourcesize() const { return lookupNumAttribute( sat::SolvAttr::sourcesize ); } std::list Package::authors() const { std::list ret; str::split( lookupStrAttribute( sat::SolvAttr::authors ), std::back_inserter(ret), "\n" ); return ret; } Package::FileList Package::filelist() const { return FileList( sat::SolvAttr::filelist, satSolvable() ); } CheckSum Package::checksum() const { return lookupCheckSumAttribute( sat::SolvAttr::checksum ); } OnMediaLocation Package::location() const { return lookupLocation(); } Pathname Package::cachedLocation() const { return zyppintern::cachedLocation( location(), repoInfo() ); } std::string Package::sourcePkgName() const { // no id means same as package sat::detail::IdType id( lookupIdAttribute( sat::SolvAttr::sourcename ) ); return id ? IdString( id ).asString() : name(); } Edition Package::sourcePkgEdition() const { // no id means same as package sat::detail::IdType id( lookupIdAttribute( sat::SolvAttr::sourceevr ) ); return id ? Edition( id ) : edition(); } std::string Package::sourcePkgType() const { return lookupStrAttribute( sat::SolvAttr::sourcearch ); } std::string Package::sourcePkgLongName() const { return str::form( "%s-%s.%s", sourcePkgName().c_str(), sourcePkgEdition().c_str(), sourcePkgType().c_str() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Package.h000066400000000000000000000125701476576476200161310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Package.h * */ #ifndef ZYPP_PACKAGE_H #define ZYPP_PACKAGE_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(Package); /////////////////////////////////////////////////////////////////// // // CLASS NAME : Package // /** Package interface. */ class ZYPP_API Package : public ResObject { public: using Self = Package; using TraitsType = ResTraits; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: using Keywords = sat::ArrayAttr; using FileList = sat::ArrayAttr; public: /** * Returns the level of supportability the vendor * gives to this package. * * If the identical package happens to appear in multiple * repos with different support levels, the maximum * level is returned. * * This is one value from \ref VendorSupportOption. */ VendorSupportOption vendorSupport() const; /** * True if the vendor support for this package * is unknown or explicitly unsupported. */ bool maybeUnsupported() const; /** The name(s) of the successor package if \ref vendorSupport is \ref VendorSupportSuperseded. * Ideally only one name, but it might be that different repos * provide different successor names. These are the pure metadata * values. \see \ref supersededByItems and \ref ui::Selectable::supersededBy */ std::vector supersededBy() const; /** The successor package(s) if \ref vendorSupport is \ref VendorSupportSuperseded. * Each name returned by \ref supersededBy is resolved into the * \ref Solvable::ident of an Item in the pool (collapsing chains * of superseeded packages). * * The std::pair returned contains the IdString idents of superseeding packages and * any std::strings which could not be resolved into a package name. * * Ideally you get back one IdString and no unresolved names. Multiple IdStrings * express a choice. Unresolved names hint to broken repo metadata, as superseeding * packages should be available in the repo. */ std::pair,std::vector> supersededByItems() const; /** Get the package change log */ Changelog changelog() const; /** */ std::string buildhost() const; /** */ std::string distribution() const; /** */ std::string license() const; /** */ std::string packager() const; /** */ std::string group() const; /** */ Keywords keywords() const; /** Don't ship it as class Url, because it might be * in fact anything but a legal Url. */ std::string url() const; /** Size of corresponding the source package. */ ByteCount sourcesize() const; /** */ std::list authors() const; /** Return the packages filelist (if available). * The returned \ref FileList appears to be a container of * \c std::string. In fact it is a query, so it does not * consume much memory. */ FileList filelist() const; /** \name Source package handling */ //@{ /** Name of the source rpm this package was built from. */ std::string sourcePkgName() const; /** Edition of the source rpm this package was built from. */ Edition sourcePkgEdition() const; /** The type of the source rpm (\c "src" or \c "nosrc"). */ std::string sourcePkgType() const; /** The source rpms \c "name-version-release.type" */ std::string sourcePkgLongName() const; //@} /** * Checksum the source says this package should have. * \see \ref location */ CheckSum checksum() const; /** Location of the resolvable in the repository. * \ref OnMediaLocation conatins all information required to * retrieve the packge (url, checksum, etc.). */ OnMediaLocation location() const; /** Location of the downloaded package in cache or an empty path. */ Pathname cachedLocation() const; /** Whether the package is cached. */ bool isCached() const { return ! cachedLocation().empty(); } protected: friend Ptr make( const sat::Solvable & solvable_r ); /** Ctor */ Package( const sat::Solvable & solvable_r ); /** Dtor */ ~Package() override; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PACKAGE_H libzypp-17.36.5/zypp/PackageKeyword.h000066400000000000000000000035421476576476200174750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PackageKeyword.h * */ #ifndef ZYPP_PACKAGEKEYWORD_H #define ZYPP_PACKAGEKEYWORD_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PackageKeyword // /** Package keywords. * \see \ref IdStringType */ class PackageKeyword : public IdStringType { public: /** Default ctor: empty keyword */ PackageKeyword() {} /** Ctor taking keyword as string. */ explicit PackageKeyword( sat::detail::IdType id_r ) : _str( id_r ) {} explicit PackageKeyword( const IdString & idstr_r ) : _str( idstr_r ) {} explicit PackageKeyword( const std::string & str_r ) : _str( str_r ) {} explicit PackageKeyword( const char * cstr_r ) : _str( cstr_r ) {} private: friend class IdStringType; IdString _str; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PACKAGEKEYWORD_H libzypp-17.36.5/zypp/Patch.cc000066400000000000000000000257011476576476200157730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Patch.cc * */ #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE( Patch ); /////////////////////////////////////////////////////////////////// // // METHOD NAME : Patch::Patch // METHOD TYPE : Ctor // Patch::Patch( const sat::Solvable & solvable_r ) : ResObject( solvable_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Patch::~Patch // METHOD TYPE : Dtor // Patch::~Patch() {} /////////////////////////////////////////////////////////////////// std::string Patch::category() const { return str::toLower(lookupStrAttribute( sat::SolvAttr::patchcategory )); } Patch::Category Patch::categoryEnum() const { return categoryEnum( category() ); } bool Patch::isCategory( const std::string & category_r ) const { // bsc#1179847: identify the wellknown categories Category catenum = categoryEnum( category_r ); return ( catenum == CAT_OTHER && str::compareCI( category_r, category() ) == 0 ) || ( catenum == categoryEnum() ); } bool Patch::isCategory( Categories category_r ) const { return category_r.testFlag( categoryEnum() ); } Patch::Category Patch::categoryEnum( const std::string & category_r ) { switch ( category_r[0] ) { // CAT_YAST case 'y': case 'Y': if ( str::compareCI( category_r, "yast" ) == 0 ) return CAT_YAST; break; // CAT_SECURITY case 's': case 'S': if ( str::compareCI( category_r, "security" ) == 0 ) return CAT_SECURITY; break; // CAT_RECOMMENDED case 'r': case 'R': if ( str::compareCI( category_r, "recommended" ) == 0 ) return CAT_RECOMMENDED; break; case 'b': case 'B': if ( str::compareCI( category_r, "bugfix" ) == 0 ) // rhn return CAT_RECOMMENDED; break; // CAT_OPTIONAL case 'o': case 'O': if ( str::compareCI( category_r, "optional" ) == 0 ) return CAT_OPTIONAL; break; case 'f': case 'F': if ( str::compareCI( category_r, "feature" ) == 0 ) return CAT_OPTIONAL; break; case 'e': case 'E': if ( str::compareCI( category_r, "enhancement" ) == 0 ) // rhn return CAT_OPTIONAL; break; // CAT_DOCUMENT case 'd': case 'D': if ( str::compareCI( category_r, "document" ) == 0 ) return CAT_DOCUMENT; break; } // default: INT << "Unrecognized Patch::Category string '" << category_r << "'" << endl; return CAT_OTHER; } std::string asString( const Patch::Category & obj ) { switch ( obj ) { case Patch::CAT_OTHER: return std::string( "other" ); break; case Patch::CAT_YAST: return std::string( "yast" ); break; case Patch::CAT_SECURITY: return std::string( "security" ); break; case Patch::CAT_RECOMMENDED: return std::string( "recommended" ); break; case Patch::CAT_OPTIONAL: return std::string( "optional" ); break; case Patch::CAT_DOCUMENT: return std::string( "document" ); break; } // make gcc happy: return std::string( "other" ); } /////////////////////////////////////////////////////////////////// std::string Patch::severity() const { return str::toLower(lookupStrAttribute( sat::SolvAttr::severity )); } Patch::SeverityFlag Patch::severityFlag() const { return severityFlag( severity() ); } bool Patch::isSeverity( const std::string & severity_r ) const { return( str::compareCI( severity_r, severity() ) == 0 ); } bool Patch::isSeverity( SeverityFlags severity_r ) const { return severity_r.testFlag( severityFlag() ); } Patch::SeverityFlag Patch::severityFlag( const std::string & severity_r ) { switch ( severity_r[0] ) { case 'l': case 'L': if ( str::compareCI( severity_r, "low" ) == 0 ) return SEV_LOW; break; case 'm': case 'M': if ( str::compareCI( severity_r, "moderate" ) == 0 ) return SEV_MODERATE; break; case 'i': case 'I': if ( str::compareCI( severity_r, "important" ) == 0 ) return SEV_IMPORTANT; break; case 'c': case 'C': if ( str::compareCI( severity_r, "critical" ) == 0 ) return SEV_CRITICAL; break; case 'u': case 'U': if ( str::compareCI( severity_r, "unspecified" ) == 0 ) return SEV_NONE; break; case '\0': return SEV_NONE; break; } // default: INT << "Unrecognized Patch::Severity string '" << severity_r << "'" << endl; return SEV_OTHER; } std::string asString( const Patch::SeverityFlag & obj ) { switch ( obj ) { case Patch::SEV_OTHER: return std::string( "unknown" ); break; case Patch::SEV_NONE: return std::string( "unspecified" ); break; case Patch::SEV_LOW: return std::string( "low" ); break; case Patch::SEV_MODERATE: return std::string( "moderate" ); break; case Patch::SEV_IMPORTANT:return std::string( "important" ); break; case Patch::SEV_CRITICAL: return std::string( "critical" ); break; } // make gcc happy: return std::string( "unknown" ); } /////////////////////////////////////////////////////////////////// // std::string Patch::message( const Locale & lang_r ) const { return lookupStrAttribute( sat::SolvAttr::message, lang_r ); } bool Patch::rebootSuggested() const { return lookupBoolAttribute( sat::SolvAttr::rebootSuggested ); } bool Patch::restartSuggested() const { return lookupBoolAttribute( sat::SolvAttr::restartSuggested ); } bool Patch::reloginSuggested() const { return lookupBoolAttribute( sat::SolvAttr::reloginSuggested ); } Patch::InteractiveFlags Patch::interactiveFlags() const { InteractiveFlags patchFlags (NoFlags); if ( rebootSuggested() ) patchFlags |= Reboot; if ( ! message().empty() ) patchFlags |= Message; if ( ! licenseToConfirm().empty() ) patchFlags |= License; Patch::Contents c( contents() ); for_( it, c.begin(), c.end() ) { if ( ! makeResObject(*it)->licenseToConfirm().empty() ) { patchFlags |= License; break; } } return patchFlags; } bool Patch::interactiveWhenIgnoring( InteractiveFlags flags_r ) const { if ( interactiveFlags() & ( ~flags_r ) ) { return true; } else { return false; } } bool Patch::interactive() const { return interactiveWhenIgnoring(); } std::string asString( const Patch::InteractiveFlag & obj ) { switch ( obj ) { case Patch::NoFlags: return ""; break; case Patch::Reboot: return "reboot"; break; case Patch::Message: return "message"; break; case Patch::License: return "license"; break; } return str::hexstring(obj); } Patch::Contents Patch::contents() const { Contents result; // DBG << *this << endl; sat::LookupAttr updateCollection( sat::SolvAttr::updateCollection, satSolvable() ); for_( entry, updateCollection.begin(), updateCollection.end() ) { IdString name ( entry.subFind( sat::SolvAttr::updateCollectionName ).idStr() ); Edition edition ( entry.subFind( sat::SolvAttr::updateCollectionEvr ).idStr() ); Arch arch ( entry.subFind( sat::SolvAttr::updateCollectionArch ).idStr() ); if ( name.empty() ) { WAR << "Ignore malformed updateCollection entry: " << name << "-" << edition << "." << arch << endl; continue; } // The entry is relevant if there is an installed // package with the same name and arch. bool relevant = false; sat::WhatProvides providers( (Capability( name.id() )) ); for_( it, providers.begin(), providers.end() ) { if ( it->isSystem() && it->ident() == name && it->arch() == arch ) { relevant = true; break; } } if ( ! relevant ) { // DBG << "Not relevant: " << name << "-" << edition << "." << arch << endl; continue; } /* find exact providers first (this matches the _real_ 'collection content' of the patch */ providers = sat::WhatProvides( Capability( arch, name.c_str(), Rel::EQ, edition, ResKind::package ) ); if ( providers.empty() ) { /* no exact providers: find 'best' providers: those with a larger evr */ providers = sat::WhatProvides( Capability( arch, name.c_str(), Rel::GT, edition, ResKind::package ) ); if ( providers.empty() ) { // Hmm, this patch is not installable, no one is providing the package in the collection // FIXME: raise execption ? fake a solvable ? WAR << "Missing provider: " << name << "-" << edition << "." << arch << endl; continue; } } // FIXME ?! loop over providers and try to find installed ones ? // DBG << "Found " << name << "-" << edition << "." << arch << ": " << *(providers.begin()) << endl; result.get().insert( *(providers.begin()) ); } return result; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Patch::ReferenceIterator // /////////////////////////////////////////////////////////////////// Patch::ReferenceIterator::ReferenceIterator( const sat::Solvable & val_r ) { base_reference() = sat::LookupAttr( sat::SolvAttr::updateReference, val_r ).begin(); } std::string Patch::ReferenceIterator::id() const { return base_reference().subFind( sat::SolvAttr::updateReferenceId ).asString(); } std::string Patch::ReferenceIterator::href() const { return base_reference().subFind( sat::SolvAttr::updateReferenceHref ).asString(); } std::string Patch::ReferenceIterator::title() const { return base_reference().subFind( sat::SolvAttr::updateReferenceTitle ).asString(); } std::string Patch::ReferenceIterator::type() const { return base_reference().subFind( sat::SolvAttr::updateReferenceType ).asString(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Patch.h000066400000000000000000000233771476576476200156440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Patch.h * */ #ifndef ZYPP_PATCH_H #define ZYPP_PATCH_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(Patch); /** * Class representing a patch. * * A patch represents a specific problem that * can be fixed by pulling in the patch dependencies. * * Patches can be marked for installation but their * installation is a no-op. */ class ZYPP_API Patch : public ResObject { public: using Self = Patch; using TraitsType = ResTraits; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: using Contents = sat::SolvableSet; enum Category { CAT_OTHER = 1, //!< unknown value specified CAT_YAST = 1<<1, //!< CAT_SECURITY = 1<<2, //!< CAT_RECOMMENDED = 1<<3, //!< CAT_OPTIONAL = 1<<4, //!< CAT_DOCUMENT = 1<<5 //!< }; ZYPP_DECLARE_FLAGS(Categories, Category); /** * Flags defining if and why this * patch is interactive. */ enum InteractiveFlag { NoFlags = 0x0000, Reboot = 0x0001, Message = 0x0002, License = 0x0004 }; ZYPP_DECLARE_FLAGS(InteractiveFlags, InteractiveFlag); /** * \brief Possible severity levels for (security) patches. * Metadata string values are mapped to this enum to ease * computations. For a string representation call * \ref asSring( const Patch::SeverityFlag & ). */ enum SeverityFlag { SEV_OTHER = 1, //!< unknown value specified SEV_NONE = 1<<1, //!< no value specified SEV_LOW = 1<<2, //!< Low SEV_MODERATE = 1<<3, //!< Moderate SEV_IMPORTANT = 1<<4, //!< Important SEV_CRITICAL = 1<<5 //!< Critical }; ZYPP_DECLARE_FLAGS(SeverityFlags, SeverityFlag); public: /** * Issue date time. For now it is the same as * \ref buildtime(). */ Date timestamp() const { return buildtime(); } /** \name Patch Category */ //@{ /** * Patch category (recommended, security,...) */ std::string category() const; /** This patch's category as enum of wellknown categories. * Unknown values are mapped to \ref CAT_OTHER. */ Category categoryEnum() const; /** Whether this patch's category matches \a category_r */ bool isCategory( const std::string & category_r ) const; /** \overload taking OR'ed \ref Categories */ bool isCategory( Categories category_r ) const; /** \overload taking container of category strings * 2nd template arg just to prevent instantiation for Category */ template bool isCategory( const TContainer & categories_r ) const { for ( const std::string & el : categories_r ) { if ( isCategory( el ) ) return true; } return false; } /** Patch category as enum of wellknown categories. * Unknown values are mapped to \ref CAT_OTHER. */ static Category categoryEnum( const std::string & category_r ); //@} /** \name Patch Severity */ //@{ /** * Severity string as specified in metadata. * For use in computaions see \ref severityFlag. */ std::string severity() const; /** * Severity string mapped to an enum. * Unknown string values are mapped to \ref SEV_OTHER */ SeverityFlag severityFlag() const; /** Whether this patch's severity matches \a severity_r */ bool isSeverity( const std::string & severity_r ) const; /** \overload taking OR'ed \ref SeverityFlags */ bool isSeverity( SeverityFlags severity_r ) const; /** \overload taking container of severity strings * 2nd template arg just to prevent instantiation for SeverityFlag */ template bool isSeverity( const TContainer & severities_r ) const { for ( const std::string & el : severities_r ) { if ( isSeverity( el ) ) return true; } return false; } /** Severity string mapped to an enum. * Unknown string values are mapped to \ref SEV_OTHER */ static SeverityFlag severityFlag( const std::string & category_r ); //@} /** * Does the system need to reboot to finish the update process? */ bool rebootSuggested() const; /** * Does the patch affect the package manager itself? * restart is suggested then */ bool restartSuggested() const; /** * Does the patch needs the user to relogin to take effect? * relogin is suggested then */ bool reloginSuggested() const; /** * \short Information or warning to be displayed to the user */ std::string message( const Locale & lang_r = Locale() ) const; /** * Get the InteractiveFlags of this Patch */ InteractiveFlags interactiveFlags() const; /** * Is the patch still interactive when ignoring this flags? */ bool interactiveWhenIgnoring( InteractiveFlags flags_r = NoFlags ) const; /** * Is the patch installation interactive? (does it need user input?) * * For security reasons patches requiring a reboot are not * installed in an unattended mode. They are considered to be * \c interactive so the user gets informed about the need for * reboot. \a ignoreRebootFlag_r may be used to explicitly turn * off this behavior and include those patches (unless they actually * contain interactive components as well, like messages or licenses). */ bool interactive() const; public: /** * The collection of packages associated with this patch. */ Contents contents() const; public: /** Query class for Patch issue references */ class ReferenceIterator; /** * Get an iterator to the beginning of the patch * references. \see Patch::ReferenceIterator */ ReferenceIterator referencesBegin() const; /** * Get an iterator to the end of the patch * references. \see Patch::ReferenceIterator */ ReferenceIterator referencesEnd() const; protected: friend Ptr make( const sat::Solvable & solvable_r ); /** Ctor */ Patch( const sat::Solvable & solvable_r ); /** Dtor */ ~Patch() override; }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Patch::Categories); ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Patch::InteractiveFlags); ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Patch::SeverityFlags); /** \relates Patch::Category string representation.*/ std::string asString( const Patch::Category & obj ) ZYPP_API; /** \relates Patch::InteractiveFlag string representation.*/ std::string asString( const Patch::InteractiveFlag & obj ) ZYPP_API; /** \relates Patch::SeverityFlag string representation.*/ std::string asString( const Patch::SeverityFlag & obj ) ZYPP_API; /** * Query class for Patch issue references * like bugzilla and security issues the * patch is supposed to fix. * * The iterator does not provide a dereference * operator so you can do * on it, but you can * access the attributes of each patch issue reference * directly from the iterator. * * \code * for ( Patch::ReferenceIterator it = patch->referencesBegin(); * it != patch->referencesEnd(); * ++it ) * { * cout << it.href() << endl; * } * \endcode * */ class Patch::ReferenceIterator : public boost::iterator_adaptor< Patch::ReferenceIterator // Derived , sat::LookupAttr::iterator // Base , int // Value , boost::forward_traversal_tag // CategoryOrTraversal , int // Reference > { public: ReferenceIterator() {} explicit ReferenceIterator( const sat::Solvable & val_r ); /** * The id of the reference. For bugzilla entries * this is the bug number as a string. */ std::string id() const; /** * Url or pointer where to find more information */ std::string href() const; /** * Title describing the issue */ std::string title() const; /** * Type of the reference. For example * "bugzilla" */ std::string type() const; private: friend class boost::iterator_core_access; int dereference() const { return 0; } }; inline Patch::ReferenceIterator Patch::referencesBegin() const { return ReferenceIterator(satSolvable()); } inline Patch::ReferenceIterator Patch::referencesEnd() const { return ReferenceIterator(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PATCH_H libzypp-17.36.5/zypp/PathInfo.cc000066400000000000000000000037511476576476200164450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PathInfo.cc * */ #include #include using std::endl; using std::string; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace filesystem { const StrMatcher & matchNoDots() { static StrMatcher noDots( "[^.]*", Match::GLOB ); return noDots; } int dirForEach( const Pathname & dir_r, const StrMatcher & matcher_r, function fnc_r ) { if ( ! fnc_r ) return 0; bool nodots = ( &matcher_r == &matchNoDots() ); return dirForEach( dir_r, [&]( const Pathname & dir_r, const char *const name_r )->bool { if ( ( nodots && name_r[0] == '.' ) || ! matcher_r( name_r ) ) return true; return fnc_r( dir_r, name_r ); } ); } ///////////////////////////////////////////////////////////////// } // namespace filesystem /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PathInfo.h000066400000000000000000000057471476576476200163160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PathInfo.h * */ #ifndef ZYPP_PATHINFO_H #define ZYPP_PATHINFO_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class StrMatcher; /////////////////////////////////////////////////////////////////// /** Types and functions for filesystem operations. * \todo move zypp::filesystem stuff into separate header * \todo Add tmpfile and tmpdir handling. * \todo think about using Exceptions in zypp::filesystem * \todo provide a readdir iterator; at least provide an interface * using an insert_iterator to be independent from std::container. */ namespace filesystem { /** * Convenience returning StrMatcher( "[^.]*", Match::GLOB ) * \see \ref dirForEach */ const StrMatcher & matchNoDots(); /** * \overload taking a \ref StrMatcher to filter the entries for which \a fnc_r is invoked. * * For convenience a \ref StrMatcher \ref matchNoDots is provided in this namespace.
* * \code * bool cbfnc( const Pathname & dir_r, const char *const str_r ) * { * D BG <*< " - " << dir_r/str_r << endl; * return true; * } * // Print no-dot files in "/tmp" via callback * filesystem::dirForEach( "/tmp", filesystem::matchNoDots(), cbfnc ); * * // same via lambda * filesystem::dirForEach( "/tmp", filesystem::matchNoDots(), * [](const Pathname & dir_r, const std::string & str_r)->bool * { * DBG << " - " << dir_r/str_r << endl; * return true; * }); * \endcode */ int dirForEach( const Pathname & dir_r, const StrMatcher & matcher_r, function fnc_r ); ///////////////////////////////////////////////////////////////// } // namespace filesystem /////////////////////////////////////////////////////////////////// /** Dragged into namespace zypp. */ using filesystem::PathInfo; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PATHINFO_H libzypp-17.36.5/zypp/Pathname.h000066400000000000000000000000401476576476200163200ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/Pattern.cc000066400000000000000000000334501476576476200163510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Pattern.cc * */ #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace { inline Capability autoCapability( const Capabilities & provides_r ) { static const Capability autopattern( "autopattern()" ); for ( const auto & cap : provides_r ) if ( cap.matches( autopattern ) == CapMatch::yes ) return cap; return Capability(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PatternExpander // /** Recursively expand a Pattern. * * This means recursively expanding Patterns included by this or * extending this. The result is a \c set of Pattern::constPtr * accessible via iterator. */ class PatternExpander { public: using PatternMap = std::map>; using size_type = PatternMap::size_type; using value_type = PatternMap::key_type; using const_iterator = MapKVIteratorTraits::Key_const_iterator; public: PatternExpander() {} /** Recursively expand Pattern. */ size_type doExpand( const Pattern::constPtr& pat_r ) { // INT << "+++ " << pat_r << " ++++++++++++++++++++++++++++++++++" << endl; _patternMap.clear(); if ( pat_r ) { _patternMap[pat_r]; Pattern::constPtr unprocessed( pat_r ); // MIL << _patternMap << endl; do { expandIncludes( unprocessed ); expandExtending( unprocessed ); _patternMap[unprocessed] = true; // MIL << _patternMap << endl; } while( (unprocessed = nextUnprocessed()) ); } // SEC << "--- " << _patternMap.size() << " ----------------------------------" << endl; return _patternMap.size(); } const_iterator begin() const { return make_map_key_begin( _patternMap ); } const_iterator end() const { return make_map_key_end( _patternMap ); } private: /** Get the next unprocessed Pattern in \c _patternMap. */ Pattern::constPtr nextUnprocessed() const { for_( it, _patternMap.begin(), _patternMap.end() ) { if ( ! it->second ) return it->first; } return NULL; } private: /** Store all included patterns in \c _patternMap. */ void expandIncludes( const Pattern::constPtr & pat_r ) { Pattern::NameList c( pat_r->includes() ); for_( it, c.begin(), c.end() ) { expandInclude( Capability( it->c_str()/*, *ResKind::pattern*/ ) ); } } /** Store Patterns matching an \c Includes capability in \c _patternMap. */ void expandInclude( const Capability & include_r ) { sat::WhatProvides w( include_r ); for_( it, w.begin(), w.end() ) { _patternMap[asKind(PoolItem(*it))]; } } private: /** Store all patterns extending \c pat_r in \c _patternMap. */ void expandExtending( const Pattern::constPtr & pat_r ) { ResPool pool( ResPool::instance() ); for_( it, pool.byKindBegin(), pool.byKindEnd() ) { expandIfExtends( pat_r, *it ); } } /** Store \c extending_r if it extends \c pat_r. */ void expandIfExtends( const Pattern::constPtr & pat_r, const PoolItem & extending_r ) { Pattern::constPtr extending( asKind(extending_r) ); Pattern::NameList c( extending->extends() ); for_( it, c.begin(), c.end() ) { if ( providedBy( pat_r, Capability( it->c_str()/*, *ResKind::pattern*/ ) ) ) { // an extends matches the Pattern _patternMap[extending]; break; } } } /** Return true if Capability \c extends_r is provided by Pattern. */ bool providedBy( const Pattern::constPtr & pat_r, const Capability & extends_r ) { if ( !pat_r ) return false; sat::Solvable pat( pat_r->satSolvable() ); sat::WhatProvides w( extends_r ); for_( it, w.begin(), w.end() ) { if ( pat == *it ) return true; } return false; } private: PatternMap _patternMap; }; } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // Pattern /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(Pattern); Pattern::Pattern( const sat::Solvable & solvable_r ) : ResObject( solvable_r ) {} Pattern::~Pattern() {} bool Pattern::isDefault() const { return lookupBoolAttribute( sat::SolvAttr::isdefault ); } bool Pattern::userVisible() const { // bsc#900769: If visibility is a string(solvable ident) the pattern // is visible IFF ident is available in the pool. IdString ident( lookupStrAttribute( sat::SolvAttr::isvisible ) ); return( ident.empty() ? lookupBoolAttribute( sat::SolvAttr::isvisible ) : ! ResPool::instance().byIdent( ident ).empty() ); } std::string Pattern::category( const Locale & lang_r ) const { return lookupStrAttribute( sat::SolvAttr::category, lang_r ); } Pathname Pattern::icon() const { return lookupStrAttribute( sat::SolvAttr::icon ); } Pathname Pattern::script() const { return lookupStrAttribute( sat::SolvAttr::script ); } std::string Pattern::order() const { return lookupStrAttribute( sat::SolvAttr::order ); } bool Pattern::isAutoPattern() const { return bool(autoCapability( dep_provides() )); } sat::Solvable Pattern::autoPackage() const { Capability autocap( autoCapability( dep_provides() ) ); if ( autocap ) { Capability pkgCap( arch(), autocap.detail().ed().asString(), Rel::EQ, edition() ); for ( const auto & solv: sat::WhatProvides( pkgCap ) ) if ( solv.repository() == repository() ) return solv; } return sat::Solvable(); } Pattern::NameList Pattern::includes() const { return NameList( sat::SolvAttr::includes, satSolvable() ); } Pattern::NameList Pattern::extends() const { return NameList( sat::SolvAttr::extends, satSolvable() ); } /////////////////////////////////////////////////////////////////// namespace { inline void addCaps( CapabilitySet & caps_r, sat::Solvable solv_r, Dep dep_r ) { Capabilities c( solv_r[dep_r] ); if ( ! c.empty() ) { caps_r.insert( c.begin(),c.end() ); } } } //namespace /////////////////////////////////////////////////////////////////// Pattern::Contents Pattern::core() const { // Content dependencies are either associated with // the autoPackage or the (oldstype) pattern itself. // load requires CapabilitySet caps; addCaps( caps, *this, Dep::REQUIRES ); sat::Solvable depKeeper( autoPackage() ); if ( depKeeper ) addCaps( caps, depKeeper, Dep::REQUIRES ); // get items providing the requirements sat::WhatProvides prv( caps ); // return packages only. return Pattern::Contents( make_filter_begin( filter::byKind(), prv ), make_filter_end( filter::byKind(), prv ) ); } Pattern::Contents Pattern::depends( bool includeSuggests_r ) const { // Content dependencies are either associated with // the autoPackage or the (oldstype) pattern itself. // load requires, recommends[, suggests] CapabilitySet caps; addCaps( caps, *this, Dep::REQUIRES ); addCaps( caps, *this, Dep::RECOMMENDS ); if ( includeSuggests_r ) addCaps( caps, *this, Dep::SUGGESTS ); sat::Solvable depKeeper( autoPackage() ); if ( depKeeper ) { addCaps( caps, depKeeper, Dep::REQUIRES ); addCaps( caps, depKeeper, Dep::RECOMMENDS ); if ( includeSuggests_r ) addCaps( caps, depKeeper, Dep::SUGGESTS ); } // get items providing the above sat::WhatProvides prv( caps ); // return packages only. return Pattern::Contents( make_filter_begin( filter::byKind(), prv ), make_filter_end( filter::byKind(), prv ) ); } Pattern::Contents Pattern::contents( bool includeSuggests_r ) const { PatternExpander expander; if ( ! expander.doExpand( this ) ) return Contents(); // empty pattern set Contents result; for_( it, expander.begin(), expander.end() ) { Contents c( (*it)->depends( includeSuggests_r ) ); result.get().insert( c.begin(), c.end() ); } return result; } /////////////////////////////////////////////////////////////////// namespace { // Get packages referenced by depKeeper dependency. inline void dependsSetDoCollect( sat::Solvable depKeeper_r, Dep dep_r, Pattern::Contents & set_r ) { CapabilitySet caps; addCaps( caps, depKeeper_r, dep_r ); sat::WhatProvides prv( caps ); for ( const ui::Selectable::Ptr& sel : prv.selectable() ) { const PoolItem & pi( sel->theObj() ); if ( pi.isKind() ) set_r.insert( pi ); } } // Get packages referenced by depKeeper. inline void dependsSet( sat::Solvable depKeeper_r, Pattern::ContentsSet & collect_r ) { dependsSetDoCollect( depKeeper_r, Dep::REQUIRES, collect_r.req ); dependsSetDoCollect( depKeeper_r, Dep::RECOMMENDS, collect_r.rec ), dependsSetDoCollect( depKeeper_r, Dep::SUGGESTS, collect_r.sug ); } // Whether this is a patterns depkeeper. inline bool isPatternsPackage( sat::Solvable depKeeper_r ) { static const Capability indicator( "pattern()" ); return depKeeper_r.dep_provides().matches( indicator ); } } // namespace /////////////////////////////////////////////////////////////////// void Pattern::contentsSet( ContentsSet & collect_r, bool recursively_r ) const { sat::Solvable depKeeper( autoPackage() ); // (my required) patterns-package if ( ! depKeeper ) return; // step 2 data std::set recTodo; // recommended patterns-packages to process std::set allDone; // patterns-packages already expanded { // step 1: Expand requirements, remember recommends.... // step 1 data (scoped to step1) std::set reqTodo; // required patterns-packages to process collect_r.req.insert( depKeeper );// collect the depKeeper reqTodo.insert( depKeeper ); // and expand it... while ( ! reqTodo.empty() ) { // pop one patterns-package from todo depKeeper = ( *reqTodo.begin() ); reqTodo.erase( reqTodo.begin() ); allDone.insert( depKeeper ); // collects stats ContentsSet result; dependsSet( depKeeper, result ); // evaluate result.... for ( sat::Solvable solv : result.req ) // remember unprocessed required patterns-packages... { if ( collect_r.req.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) reqTodo.insert( solv ); } for ( sat::Solvable solv : result.rec ) // remember unprocessed recommended patterns-packages... { if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) recTodo.insert( solv ); } for ( sat::Solvable solv : result.sug ) // NOTE: We don't expand suggested patterns! { collect_r.sug.insert( solv ); } } } // step 2: All requirements are expanded, now check remaining recommends.... while ( ! recTodo.empty() ) { // pop one patterns-package from todo depKeeper = ( *recTodo.begin() ); recTodo.erase( recTodo.begin() ); if ( ! allDone.insert( depKeeper ).second ) continue; // allready expanded (in requires) // collects stats ContentsSet result; dependsSet( depKeeper, result ); // evaluate result.... for ( sat::Solvable solv : result.req ) // remember unprocessed required patterns-packages... { // NOTE: Requirements of recommended patterns count as 'recommended' if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) recTodo.insert( solv ); } for ( sat::Solvable solv : result.rec ) // remember unprocessed recommended patterns-packages... { if ( collect_r.rec.insert( solv ) && recursively_r && isPatternsPackage( solv ) ) recTodo.insert( solv ); } for ( sat::Solvable solv : result.sug ) // NOTE: We don't expand suggested patterns! { collect_r.sug.insert( solv ); } } } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Pattern.h000066400000000000000000000106711476576476200162130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Pattern.h * */ #ifndef ZYPP_PATTERN_H #define ZYPP_PATTERN_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(Pattern); /////////////////////////////////////////////////////////////////// // // CLASS NAME : Pattern // /** Pattern interface. */ class ZYPP_API Pattern : public ResObject { public: using Self = Pattern; using TraitsType = ResTraits; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: using NameList = sat::ArrayAttr; using Contents = sat::SolvableSet; public: /** */ bool isDefault() const; /** */ bool userVisible() const; /** */ std::string category( const Locale & lang_r = Locale() ) const; /** */ Pathname icon() const; /** */ Pathname script() const; /** */ std::string order() const; public: /** \name Auto patterns (libyzpp-14) * Patterns are no longer defined by separate metadate files, but via * special dependencies provided by a corresponding patterns- package. * The pattern itself requires only its patterns- package. The package * contains all further dependencies. * This way, patterns are no longer pseudo-installed objects with a computed * status, but installed, iff the corresponding patterns- package is * installed. */ //@{ /** This patterns is auto-defined by a patterns- package. */ bool isAutoPattern() const; /** The corresponding patterns- package if \ref isAutoPattern. */ sat::Solvable autoPackage() const; //@} public: /** Ui hint: included patterns. */ NameList includes() const; /** Ui hint: patterns this one extends. */ NameList extends() const; /** Ui hint: Required Packages. */ Contents core() const; /** Ui hint: Dependent packages. * This also includes recommended and suggested (optionally exclude) packages. */ Contents depends( bool includeSuggests_r = true ) const; /** \overload Without SUGGESTS. */ Contents dependsNoSuggests() const { return depends( false ); } /** The collection of packages associated with this pattern. * This also evaluates the patterns includes/extends relation. * Optionally exclude \c SUGGESTED packages. */ Contents contents( bool includeSuggests_r = true ) const; /** \overload Without SUGGESTS. */ Contents contentsNoSuggests() const { return contents( false ); } public: struct ContentsSet { Contents req; ///< required content set Contents rec; ///< recommended content set Contents sug; ///< suggested content set }; /** Dependency based content set (does not evaluate includes/extends relation). * If \a recursively_r, required and recommended * patterns are recursively expanded. */ void contentsSet( ContentsSet & collect_r, bool recursively_r = false ) const; /** \overload Convenience for recursively expanded contentsSet */ void fullContentsSet( ContentsSet & collect_r ) const { return contentsSet( collect_r, /*recursively_r*/true ); } protected: friend Ptr make( const sat::Solvable & solvable_r ); /** Ctor */ Pattern( const sat::Solvable & solvable_r ); /** Dtor */ ~Pattern() override; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PATTERN_H libzypp-17.36.5/zypp/PluginExecutor.cc000066400000000000000000000123571476576476200177140ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginExecutor.cc */ #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::plugin" /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class PluginExecutor::Impl /// \brief PluginExecutor implementation. /////////////////////////////////////////////////////////////////// class PluginExecutor::Impl : private base::NonCopyable { public: Impl() {} Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() { if ( ! empty() ) send( PluginFrame( "PLUGINEND" ) ); // ~PluginScript will disconnect all remaining plugins! } bool empty() const { return _scripts.empty(); } size_t size() const { return _scripts.size(); } void load( const Pathname & path_r ) { PathInfo pi( path_r ); DBG << "+++++++++++++++ load " << pi << endl; if ( pi.isDir() ) { std::list entries; if ( filesystem::readdir( entries, pi.path(), false ) != 0 ) { WAR << "Plugin dir is not readable: " << pi << endl; return; } for_( it, entries.begin(), entries.end() ) { PathInfo pii( *it ); if ( pii.isFile() && pii.userMayRX() ) doLoad( pii ); } } else if ( pi.isFile() ) { if ( pi.userMayRX() ) doLoad( pi ); else WAR << "Plugin file is not executable: " << pi << endl; } else { WAR << "Plugin path is neither dir nor file: " << pi << endl; } DBG << "--------------- load " << pi << endl; } void send( const PluginFrame & frame_r ) { DBG << "+++++++++++++++ send " << frame_r << endl; for ( auto it = _scripts.begin(); it != _scripts.end(); ) { doSend( *it, frame_r ); if ( it->isOpen() ) ++it; else it = _scripts.erase( it ); } DBG << "--------------- send " << frame_r << endl; } const std::list scripts() const { return _scripts; } private: /** Launch a plugin sending PLUGINSTART message. */ void doLoad( const PathInfo & pi_r ) { MIL << "Load plugin: " << pi_r << endl; try { PluginScript plugin( pi_r.path() ); plugin.open(); PluginFrame frame( "PLUGINBEGIN" ); if ( ZConfig::instance().hasUserData() ) frame.setHeader( "userdata", ZConfig::instance().userData() ); doSend( plugin, frame ); // closes on error if ( plugin.isOpen() ) _scripts.push_back( plugin ); } catch( const zypp::Exception & e ) { WAR << "Failed to load plugin " << pi_r << endl; } } PluginFrame doSend( PluginScript & script_r, const PluginFrame & frame_r ) { PluginFrame ret; try { script_r.send( frame_r ); ret = script_r.receive(); } catch( const zypp::Exception & e ) { ZYPP_CAUGHT(e); WAR << e.asUserHistory() << endl; } // Allow using "/bin/cat" as reflector-script for testing if ( ! ( ret.isAckCommand() || ret.isEnomethodCommand() || ( script_r.script() == "/bin/cat" && frame_r.command() != "ERROR" ) ) ) { WAR << "Bad plugin response from " << script_r << ": " << ret << endl; WAR << "(Expected " << PluginFrame::ackCommand() << " or " << PluginFrame::enomethodCommand() << ")" << endl; script_r.close(); } return ret; } private: std::list _scripts; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : PluginExecutor // /////////////////////////////////////////////////////////////////// PluginExecutor::PluginExecutor() : _pimpl( new Impl() ) {} PluginExecutor::~PluginExecutor() {} bool PluginExecutor::empty() const { return _pimpl->empty(); } size_t PluginExecutor::size() const { return _pimpl->size(); } void PluginExecutor::load( const Pathname & path_r ) { _pimpl->load( path_r ); } void PluginExecutor::send( const PluginFrame & frame_r ) { _pimpl->send( frame_r ); } std::ostream & operator<<( std::ostream & str, const PluginExecutor & obj ) { return str << obj._pimpl->scripts(); } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PluginExecutor.h000066400000000000000000000070061476576476200175510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginExecutor.h */ #ifndef ZYPP_PLUGINEXECUTOR_H #define ZYPP_PLUGINEXECUTOR_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class PluginExecutor /// \brief Parallel execution of stateful PluginScripts /// /// Sent PluginFrames are distributed to all open PluginScripts and /// need to be receipted by sending back either \c ACK or \c _ENOMETHOD /// command. /// /// All PluginScripts receive an initial \c PLUGINBEGIN frame, containing /// a \c userdata header if \ref ZConfig::userData are defined. /// \see also zypper '--userdata' option /// /// A final \c PLUGINEND frame is sent and open scripts are closed, when the /// executors last reference goes out of scope. Failing PluginScripts are /// closed immediately. /// /// \see PluginScript /// \ingroup g_RAII /////////////////////////////////////////////////////////////////// class ZYPP_API PluginExecutor { friend std::ostream & operator<<( std::ostream & str, const PluginExecutor & obj ); friend bool operator==( const PluginExecutor & lhs, const PluginExecutor & rhs ); public: /** Default ctor: Empty plugin list */ PluginExecutor(); /** Dtor: Send \c PLUGINEND and close all plugins */ ~PluginExecutor(); public: /** Validate object in a boolean context: There are plugins waiting for input */ explicit operator bool() const { return !empty(); } /** Whether no plugins are waiting */ bool empty() const; /** Number of open plugins */ size_t size() const; public: /** Find and launch plugins sending \c PLUGINBEGIN. * * If \a path_r is a directory all executable files within are * expected to be plugins. Otherwise \a path_r must point to an * executable plugin. */ void load( const Pathname & path_r ); /** Send \ref PluginFrame to all open plugins. * Failed plugins are removed from the execution list. */ void send( const PluginFrame & frame_r ); public: class Impl; ///< Implementation class. private: RW_pointer _pimpl; ///< Pointer to implementation. }; /** \relates PluginExecutor Stream output */ std::ostream & operator<<( std::ostream & str, const PluginExecutor & obj ); /** \relates PluginExecutor Comparison based on reference. */ inline bool operator==( const PluginExecutor & lhs, const PluginExecutor & rhs ) { return ( lhs._pimpl == rhs._pimpl ); } /** \relates PluginExecutor Comparison based on reference. */ inline bool operator!=( const PluginExecutor & lhs, const PluginExecutor & rhs ) { return( ! operator==( lhs, rhs ) ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PLUGINEXECUTOR_H libzypp-17.36.5/zypp/PluginScript.cc000066400000000000000000000403721476576476200173600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginScript.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::plugin" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace { const char * PLUGIN_DEBUG = getenv( "ZYPP_PLUGIN_DEBUG" ); /** Dump buffer string if PLUGIN_DEBUG is on. * \ingroup g_RAII */ struct PluginDebugBuffer { PluginDebugBuffer(const std::string &buffer_r) : _buffer(buffer_r) {} PluginDebugBuffer(const PluginDebugBuffer &) = delete; PluginDebugBuffer(PluginDebugBuffer &&) = delete; PluginDebugBuffer &operator=(const PluginDebugBuffer &) = delete; PluginDebugBuffer &operator=(PluginDebugBuffer &&) = delete; ~PluginDebugBuffer() { if ( PLUGIN_DEBUG ) { if ( _buffer.empty() ) { L_DBG("PLUGIN") << "< (empty)" << endl; } else { std::istringstream datas( _buffer ); iostr::copyIndent( datas, L_DBG("PLUGIN"), "< " ) << endl; } } } const std::string & _buffer; }; /** Dump programms stderr. * \ingroup g_RAII */ struct PluginDumpStderr { PluginDumpStderr(ExternalProgramWithStderr &prog_r) : _prog(prog_r) {} PluginDumpStderr(const PluginDumpStderr &) = delete; PluginDumpStderr(PluginDumpStderr &&) = delete; PluginDumpStderr &operator=(const PluginDumpStderr &) = delete; PluginDumpStderr &operator=(PluginDumpStderr &&) = delete; ~PluginDumpStderr() { std::string line; while ( _prog.stderrGetline( line ) ) L_WAR("PLUGIN") << "! " << line << endl; } ExternalProgramWithStderr & _prog; }; inline void setBlocking( FILE * file_r, bool yesno_r = true ) { if ( ! file_r ) ZYPP_THROW( PluginScriptException( "setNonBlocking" ) ); int fd = ::fileno( file_r ); if ( fd == -1 ) ZYPP_THROW( PluginScriptException( "setNonBlocking" ) ); int flags = ::fcntl( fd, F_GETFL ); if ( flags == -1 ) ZYPP_THROW( PluginScriptException( "setNonBlocking" ) ); if ( ! yesno_r ) flags |= O_NONBLOCK; else if ( flags & O_NONBLOCK ) flags ^= O_NONBLOCK; flags = ::fcntl( fd, F_SETFL, flags ); if ( flags == -1 ) ZYPP_THROW( PluginScriptException( "setNonBlocking" ) ); } inline void setNonBlocking( FILE * file_r, bool yesno_r = true ) { setBlocking( file_r, !yesno_r ); } } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PluginScript::Impl // /** \ref PluginScript implementation. */ struct PluginScript::Impl { public: Impl( Pathname &&script_r = Pathname(), Arguments &&args_r = Arguments() ) : _sendTimeout( _defaultSendTimeout ) , _receiveTimeout( _defaultReceiveTimeout ) , _script(std::move( script_r )) , _args(std::move( args_r )) {} Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() { try { close(); } catch (...) { } } public: static long _defaultSendTimeout; static long _defaultReceiveTimeout; long _sendTimeout; long _receiveTimeout; public: const Pathname & script() const { return _script; } const Arguments & args() const { return _args; } pid_t getPid() const { return _cmd ? _cmd->getpid() : NotConnected; } bool isOpen() const { return _cmd != nullptr; } int lastReturn() const { return _lastReturn; } const std::string & lastExecError() const { return _lastExecError; } public: void open( const Pathname & script_r = Pathname(), const Arguments & args_r = Arguments() ); int close(); void send( const PluginFrame & frame_r ) const; PluginFrame receive() const; private: Pathname _script; Arguments _args; scoped_ptr _cmd; DefaultIntegral _lastReturn; std::string _lastExecError; }; /////////////////////////////////////////////////////////////////// /** \relates PluginScrip::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const PluginScript::Impl & obj ) { return str << "PluginScript[" << obj.getPid() << "] " << obj.script(); } /////////////////////////////////////////////////////////////////// namespace { const long PLUGIN_TIMEOUT = str::strtonum( getenv( "ZYPP_PLUGIN_TIMEOUT" ) ); const long PLUGIN_SEND_TIMEOUT = str::strtonum( getenv( "ZYPP_PLUGIN_SEND_TIMEOUT" ) ); const long PLUGIN_RECEIVE_TIMEOUT = str::strtonum( getenv( "ZYPP_PLUGIN_RECEIVE_TIMEOUT" ) ); } long PluginScript::Impl::_defaultSendTimeout = ( PLUGIN_SEND_TIMEOUT > 0 ? PLUGIN_SEND_TIMEOUT : ( PLUGIN_TIMEOUT > 0 ? PLUGIN_TIMEOUT : 30 ) ); long PluginScript::Impl::_defaultReceiveTimeout = ( PLUGIN_RECEIVE_TIMEOUT > 0 ? PLUGIN_RECEIVE_TIMEOUT : ( PLUGIN_TIMEOUT > 0 ? PLUGIN_TIMEOUT : 30 ) ); /////////////////////////////////////////////////////////////////// void PluginScript::Impl::open( const Pathname & script_r, const Arguments & args_r ) { dumpRangeLine( DBG << "Open " << script_r, args_r.begin(), args_r.end() ) << endl; if ( _cmd ) ZYPP_THROW( PluginScriptException( "Already connected", str::Str() << *this ) ); { PathInfo pi( script_r ); if ( ! ( pi.isFile() && pi.isX() ) ) ZYPP_THROW( PluginScriptException( "Script is not executable", str::Str() << pi ) ); } // go and launch script // TODO: ExternalProgram::maybe use Stderr_To_FileDesc for script loging Arguments args; args.reserve( args_r.size()+1 ); args.push_back( script_r.asString() ); args.insert( args.end(), args_r.begin(), args_r.end() ); _cmd.reset( new ExternalProgramWithStderr( args ) ); // Be protected against full pipe, etc. setNonBlocking( _cmd->outputFile() ); setNonBlocking( _cmd->inputFile() ); // store running scripts data _script = script_r; _args = args_r; _lastReturn.reset(); _lastExecError.clear(); dumpRangeLine( DBG << *this, _args.begin(), _args.end() ) << endl; } int PluginScript::Impl::close() { if ( _cmd ) { DBG << "Close:" << *this << endl; bool doKill = true; try { // do not kill script if _DISCONNECT is ACKed. send( PluginFrame( "_DISCONNECT" ) ); PluginFrame ret( receive() ); if ( ret.isAckCommand() ) { doKill = false; str::strtonum( ret.getHeaderNT( "exit" ), _lastReturn.get() ); _lastExecError = ret.body().asString(); } } catch (...) { /* NOP */ } if ( doKill ) { _cmd->kill(); _lastReturn = _cmd->close(); _lastExecError = _cmd->execError(); } DBG << *this << " -> [" << _lastReturn << "] " << _lastExecError << endl; _cmd.reset(); } return _lastReturn; } void PluginScript::Impl::send( const PluginFrame & frame_r ) const { if ( !_cmd ) ZYPP_THROW( PluginScriptNotConnected( "Not connected", str::Str() << *this ) ); if ( frame_r.command().empty() ) WAR << "Send: No command in frame" << frame_r << endl; // prepare frame data to write std::string data; { std::ostringstream datas; frame_r.writeTo( datas ); datas.str().swap( data ); } DBG << *this << " ->send " << frame_r << endl; if ( PLUGIN_DEBUG ) { std::istringstream datas( data ); iostr::copyIndent( datas, L_DBG("PLUGIN") ) << endl; } // try writing the pipe.... FILE * filep = _cmd->outputFile(); if ( ! filep ) ZYPP_THROW( PluginScriptException( "Bad file pointer." ) ); int fd = ::fileno( filep ); if ( fd == -1 ) ZYPP_THROW( PluginScriptException( "Bad file descriptor" ) ); //DBG << " ->[" << fd << " " << (::feof(filep)?'e':'_') << (::ferror(filep)?'F':'_') << "]" << endl; { PluginDumpStderr _dump( *_cmd ); // dump scripts stderr before leaving SignalSaver sigsav( SIGPIPE, SIG_IGN ); const char * buffer = data.c_str(); ssize_t buffsize = data.size(); do { GPollFD watchFd; watchFd.fd = fd; watchFd.events = G_IO_OUT | G_IO_ERR; watchFd.revents = 0; errno = 0; int retval = g_poll( &watchFd, 1, _sendTimeout * 1000 ); if ( retval > 0 ) // FD_ISSET( fd, &wfds ) will be true. { //DBG << "Ready to write..." << endl; ssize_t ret = ::write( fd, buffer, buffsize ); if ( ret == buffsize ) { //DBG << "::write(" << buffsize << ") -> " << ret << endl; ::fflush( filep ); break; // -> done } else if ( ret > 0 ) { //WAR << "::write(" << buffsize << ") -> " << ret << " INCOMPLETE..." << endl; ::fflush( filep ); buffsize -= ret; buffer += ret; // -> continue } else // ( retval == -1 ) { if ( errno != EINTR ) { ERR << "write(): " << Errno() << endl; if ( errno == EPIPE ) ZYPP_THROW( PluginScriptDiedUnexpectedly( "Send: script died unexpectedly", str::Str() << Errno() ) ); else ZYPP_THROW( PluginScriptException( "Send: send error", str::Str() << Errno() ) ); } } } else if ( retval == 0 ) { WAR << "Not ready to write within timeout." << endl; ZYPP_THROW( PluginScriptSendTimeout( "Not ready to write within timeout." ) ); } else // ( retval == -1 ) { if ( errno != EINTR ) { ERR << "select(): " << Errno() << endl; ZYPP_THROW( PluginScriptException( "Error waiting on file descriptor", str::Str() << Errno() ) ); } } } while( true ); } } PluginFrame PluginScript::Impl::receive() const { if ( !_cmd ) ZYPP_THROW( PluginScriptNotConnected( "Not connected", str::Str() << *this ) ); // try reading the pipe.... FILE * filep = _cmd->inputFile(); if ( ! filep ) ZYPP_THROW( PluginScriptException( "Bad file pointer." ) ); int fd = ::fileno( filep ); if ( fd == -1 ) ZYPP_THROW( PluginScriptException( "Bad file descriptor" ) ); ::clearerr( filep ); std::string data; { PluginDebugBuffer _debug( data ); // dump receive buffer if PLUGIN_DEBUG PluginDumpStderr _dump( *_cmd ); // dump scripts stderr before leaving do { int ch = fgetc( filep ); if ( ch != EOF ) { data.push_back( ch ); if ( ch == '\0' ) break; } else if ( ::feof( filep ) ) { WAR << "Unexpected EOF" << endl; ZYPP_THROW( PluginScriptDiedUnexpectedly( "Receive: script died unexpectedly", str::Str() << Errno() ) ); } else if ( errno != EINTR ) { if ( errno == EWOULDBLOCK ) { // wait a while for fd to become ready for reading... GPollFD rfd; rfd.fd = fd; rfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; rfd.revents = 0; int retval = g_poll( &rfd, 1, _receiveTimeout * 1000 ); if ( retval > 0 ) // rfd.revents was filled { ::clearerr( filep ); } else if ( retval == 0 ) { WAR << "Not ready to read within timeout." << endl; ZYPP_THROW( PluginScriptReceiveTimeout( "Not ready to read within timeout." ) ); } else // ( retval == -1 ) { if ( errno != EINTR ) { ERR << "select(): " << Errno() << endl; ZYPP_THROW( PluginScriptException( "Error waiting on file descriptor", str::Str() << Errno() ) ); } } } else { ERR << "read(): " << Errno() << endl; ZYPP_THROW( PluginScriptException( "Receive: receive error", str::Str() << Errno() ) ); } } } while ( true ); } // DBG << " <-read " << data.size() << endl; std::istringstream datas( data ); PluginFrame ret( datas ); DBG << *this << " <-" << ret << endl; return ret; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PluginScript // /////////////////////////////////////////////////////////////////// const pid_t PluginScript::NotConnected( -1 ); long PluginScript::defaultSendTimeout() { return Impl::_defaultSendTimeout; } long PluginScript::defaultReceiveTimeout() { return Impl::_defaultReceiveTimeout; } void PluginScript::defaultSendTimeout( long newval_r ) { Impl::_defaultSendTimeout = newval_r > 0 ? newval_r : 0; } void PluginScript::defaultReceiveTimeout( long newval_r ) { Impl::_defaultReceiveTimeout = newval_r > 0 ? newval_r : 0; } long PluginScript::sendTimeout() const { return _pimpl->_sendTimeout; } long PluginScript::receiveTimeout() const { return _pimpl->_receiveTimeout; } void PluginScript::sendTimeout( long newval_r ) { _pimpl->_sendTimeout = newval_r > 0 ? newval_r : 0; } void PluginScript::receiveTimeout( long newval_r ) { _pimpl->_receiveTimeout = newval_r > 0 ? newval_r : 0; } PluginScript::PluginScript() : _pimpl( new Impl ) {} PluginScript::PluginScript( Pathname script_r ) : _pimpl( new Impl( std::move(script_r) ) ) {} PluginScript::PluginScript( Pathname script_r, Arguments args_r ) : _pimpl( new Impl( std::move(script_r), std::move(args_r) ) ) {} const Pathname & PluginScript::script() const { return _pimpl->script(); } const PluginScript::Arguments & PluginScript::args() const { return _pimpl->args(); } bool PluginScript::isOpen() const { return _pimpl->isOpen(); } pid_t PluginScript::getPid() const { return _pimpl->getPid(); } int PluginScript::lastReturn() const { return _pimpl->lastReturn(); } const std::string & PluginScript::lastExecError() const { return _pimpl->lastExecError(); } void PluginScript::open() { _pimpl->open( _pimpl->script(), _pimpl->args() ); } void PluginScript::open( const Pathname & script_r ) { _pimpl->open( script_r ); } void PluginScript::open( const Pathname & script_r, const Arguments & args_r ) { _pimpl->open( script_r, args_r ); } int PluginScript::close() { return _pimpl->close(); } void PluginScript::send( const PluginFrame & frame_r ) const { _pimpl->send( frame_r ); } PluginFrame PluginScript::receive() const { return _pimpl->receive(); } /////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const PluginScript & obj ) { return str << *obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PluginScript.h000066400000000000000000000153061476576476200172210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginScript.h * */ #ifndef ZYPP_PLUGINSCRIPT_H #define ZYPP_PLUGINSCRIPT_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** * \brief Interface to plugin scripts using a \c Stomp inspired communication protocol. * * \note \ref PluginScript is copyable and assignable, but the connection is shared * among multiple copies. It gets automatically closed if the last copy goes out of * scope. * * Timeout when sending/receiving data to/from a plugin default to 30 sec. The value * (in seconds) my be changed via the environment variables \c ZYPP_PLUGIN_SEND_TIMEOUT, * \c ZYPP_PLUGIN_RECEIVE_TIMEOUT or \c ZYPP_PLUGIN_TIMEOUT (both: send and receive). * * \code * // Setup comnnection to plugin script * PluginScript scr; * PluginScript::Arguments args; * args.push_back( "-v" ); * scr.open( "/soem/testplugin", args ); * * // send frame to plugin * PluginFrame f( "COMMAND" ); * f.setHeader( "key", "value" ); * f.setBody( "some\ndata" ); * scr.send( f ); * * // receive frame from plugin * PluginFrame r( scr.receive() ); * * // explicitly close or let PluginScript go out of scope * scr.close(); * \endcode * * \see https://stomp.github.io */ class ZYPP_API PluginScript { friend std::ostream & operator<<( std::ostream & str, const PluginScript & obj ); public: /** Commandline arguments passed to a script on \ref open. */ using Arguments = std::vector; /** \c pid_t(-1) constant indicating no connection. */ static const pid_t NotConnected; public: /** \name Get/set the global timeout settings. * Timeout when sending/receiving data to/from a plugin default to 30 sec. The value * (in seconds) my be changed via the environment variables \c ZYPP_PLUGIN_SEND_TIMEOUT, * \c ZYPP_PLUGIN_RECEIVE_TIMEOUT or \c ZYPP_PLUGIN_TIMEOUT (both: send and receive). */ //@{ /** Global default timeout (sec.) when sending data. */ static long defaultSendTimeout(); /** Global default timeout (sec.) when receiving data. */ static long defaultReceiveTimeout(); /** Set global default timeout (sec.) when sending data. */ static void defaultSendTimeout( long newval_r ); /** Set global default timeout (sec.) when receiving data. */ static void defaultReceiveTimeout( long newval_r ); /** Set global default timeout (sec.) (both: send and receive).*/ static void defaultTimeout( long newval_r ) { defaultSendTimeout( newval_r ); defaultReceiveTimeout( newval_r ); } //@} public: /** Default ctor. */ PluginScript(); /** Ctor taking script path and no arguments. */ PluginScript( Pathname script_r ); /** Ctor taking script path and script arguments. */ PluginScript( Pathname script_r, Arguments args_r ); public: /** Return the script path if set. */ const Pathname & script() const; /** Return the script arguments if set. */ const Arguments & args() const; /** Whether we are connected to a script. */ bool isOpen() const; /** Return a connected scripts pid or \ref NotConnected. */ pid_t getPid() const; /** Remembers a scripts return value after \ref close until next \ref open. */ int lastReturn() const; /** Remembers a scripts execError string after \ref close until next \ref open. * \see \ref ExternalProgram::execError. */ const std::string & lastExecError() const; public: /** \name Get/set local timeout settings. */ //@{ /** Local default timeout (sec.) when sending data. */ long sendTimeout() const; /** Local default timeout (sec.) when receiving data. */ long receiveTimeout() const; /** Set local default timeout (sec.) when sending data. */ void sendTimeout( long newval_r ); /** Set local default timeout (sec.) when receiving data. */ void receiveTimeout( long newval_r ); /** Set local default timeout (sec.) (both: send and receive).*/ void timeout( long newval_r ) { sendTimeout( newval_r ); receiveTimeout( newval_r ); } //@} public: /** Setup connection and execute script. * \throw PluginScriptException if already connected to a script * \throw PluginScriptException if script does not exist or is not executable * \throw PluginScriptException on error */ void open(); /** \overload taking script path and no arguments. */ void open( const Pathname & script_r ); /** \overload taking script path and script arguments. */ void open( const Pathname & script_r, const Arguments & args_r ); /** Close any open connection. */ int close(); public: /** Send a \ref PluginFrame. * \throw PluginScriptNotConnected * \throw PluginScriptSendTimeout * \throw PluginScriptDiedUnexpectedly (does not \ref close) * \throw PluginScriptException on error * */ void send( const PluginFrame & frame_r ) const; /** Receive a \ref PluginFrame. * \throw PluginScriptNotConnected * \throw PluginScriptReceiveTimeout * \throw PluginScriptDiedUnexpectedly (does not \ref close) * \throw PluginScriptException on error */ PluginFrame receive() const; public: /** Implementation. */ struct Impl; private: /** Pointer to implementation. */ RW_pointer _pimpl; }; /** \relates PluginScript Stream output */ std::ostream & operator<<( std::ostream & str, const PluginScript & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PLUGINSCRIPT_H libzypp-17.36.5/zypp/PluginScriptException.cc000066400000000000000000000027461476576476200212420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginScriptException.cc * */ #include //#include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// PluginScriptException::PluginScriptException() : Exception( "PluginScriptException" ) {} PluginScriptException::PluginScriptException( const std::string & msg_r ) : Exception( msg_r ) {} PluginScriptException::PluginScriptException( const std::string & msg_r, const std::string & hist_r ) : Exception( msg_r ) { addHistory( hist_r ); } PluginScriptException::~PluginScriptException() throw() {} ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PluginScriptException.h000066400000000000000000000046571476576476200211070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PluginScriptException.h * */ #ifndef ZYPP_PLUGINSCRIPTEXCEPTION_H #define ZYPP_PLUGINSCRIPTEXCEPTION_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Base class for \ref PluginScript \ref Exception. */ class ZYPP_API PluginScriptException : public Exception { public: PluginScriptException(); PluginScriptException( const std::string & msg_r ); PluginScriptException( const std::string & msg_r, const std::string & hist_r ); ~PluginScriptException() throw() override; }; /** Convenience macro to declare more specific PluginScriptExceptions. */ #define declException( EXCP, BASE ) \ class ZYPP_API EXCP : public BASE { \ public: \ EXCP() : BASE( #EXCP ) {} \ EXCP( const std::string & msg_r ) : BASE( msg_r ) {} \ EXCP( const std::string & msg_r, const std::string & hist_r ) : BASE( msg_r, hist_r ) {} \ virtual ~EXCP() throw() {} \ } /** Script connection not open. */ declException( PluginScriptNotConnected, PluginScriptException ); /** Script died unexpectedly. */ declException( PluginScriptDiedUnexpectedly, PluginScriptException ); /** Communication timeout. */ declException( PluginScriptTimeout, PluginScriptException ); /** Timeout while sending data. */ declException( PluginScriptSendTimeout, PluginScriptTimeout ); /** Timeout while receiving data. */ declException( PluginScriptReceiveTimeout, PluginScriptTimeout ); #undef declException ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PLUGINSCRIPTEXCEPTION_H libzypp-17.36.5/zypp/PoolItem.cc000066400000000000000000000157561476576476200164750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolItem.cc * */ #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolItem::Impl // /** PoolItem implementation. * \c _buddy handling: * \li \c ==0 no buddy * \li \c >0 this uses \c _buddy status * \li \c <0 this status used by \c -_buddy */ struct PoolItem::Impl { public: Impl() {} Impl( ResObject::constPtr &&res_r, ResStatus &&status_r ) : _status( std::move(status_r) ) , _resolvable( std::move(res_r) ) {} ResStatus & status() const { return _buddy > 0 ? PoolItem(buddy()).status() : _status; } sat::Solvable buddy() const { if ( !_buddy ) return sat::Solvable::noSolvable; if ( _buddy < 0 ) return sat::Solvable( -_buddy ); return sat::Solvable( _buddy ); } void setBuddy( const sat::Solvable & solv_r ); ResObject::constPtr resolvable() const { return _resolvable; } ResStatus & statusReset() const { _status.setLock( false, zypp::ResStatus::USER ); _status.resetTransact( zypp::ResStatus::USER ); return _status; } ResStatus & statusReinit() const { _status.setLock( _status.isUserLockQueryMatch(), zypp::ResStatus::USER ); _status.resetTransact( zypp::ResStatus::USER ); return _status; } public: bool isUndetermined() const { return status().isUndetermined(); } bool isRelevant() const { return !status().isNonRelevant(); } bool isSatisfied() const { return status().isSatisfied(); } bool isBroken() const { return status().isBroken(); } bool isNeeded() const { return status().isToBeInstalled() || ( isBroken() && ! status().isLocked() ); } bool isUnwanted() const { return isBroken() && status().isLocked(); } private: mutable ResStatus _status; ResObject::constPtr _resolvable; DefaultIntegral _buddy; /** \name Poor man's save/restore state. * \todo There may be better save/restore state strategies. */ //@{ public: void saveState() const { _savedStatus = status(); } void restoreState() const { status() = _savedStatus; } bool sameState() const { if ( status() == _savedStatus ) return true; // some bits changed... if ( status().getTransactValue() != _savedStatus.getTransactValue() && ( ! status().isBySolver() // ignore solver state changes // removing a user lock also goes to bySolver || _savedStatus.getTransactValue() == ResStatus::LOCKED ) ) return false; if ( status().isLicenceConfirmed() != _savedStatus.isLicenceConfirmed() ) return false; return true; } private: mutable ResStatus _savedStatus; //@} public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } }; /////////////////////////////////////////////////////////////////// /** \relates PoolItem::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const PoolItem::Impl & obj ) { str << obj.status(); if (obj.resolvable()) str << *obj.resolvable(); else str << "(NULL)"; return str; } inline void PoolItem::Impl::setBuddy( const sat::Solvable & solv_r ) { PoolItem myBuddy( solv_r ); if ( myBuddy ) { if ( myBuddy._pimpl->_buddy ) { ERR << *this << " would be buddy2 in " << myBuddy << endl; return; } myBuddy._pimpl->_buddy = -resolvable()->satSolvable().id(); _buddy = myBuddy.satSolvable().id(); DBG << *this << " has buddy " << myBuddy << endl; } } /////////////////////////////////////////////////////////////////// // class PoolItem /////////////////////////////////////////////////////////////////// PoolItem::PoolItem() : _pimpl( Impl::nullimpl() ) {} PoolItem::PoolItem( const sat::Solvable & solvable_r ) : _pimpl( ResPool::instance().find( solvable_r )._pimpl ) {} PoolItem::PoolItem( const ResObject::constPtr & resolvable_r ) : _pimpl( ResPool::instance().find( resolvable_r )._pimpl ) {} PoolItem::PoolItem( Impl * implptr_r ) : _pimpl( implptr_r ) {} PoolItem PoolItem::makePoolItem( const sat::Solvable & solvable_r ) { return PoolItem( new Impl( makeResObject( solvable_r ), solvable_r.isSystem() ) ); } PoolItem::~PoolItem() {} ResPool PoolItem::pool() const { return ResPool::instance(); } ResStatus & PoolItem::status() const { return _pimpl->status(); } ResStatus & PoolItem::statusReset() const { return _pimpl->statusReset(); } ResStatus & PoolItem::statusReinit() const { return _pimpl->statusReinit(); } sat::Solvable PoolItem::buddy() const { return _pimpl->buddy(); } void PoolItem::setBuddy( const sat::Solvable & solv_r ) { _pimpl->setBuddy( solv_r ); } bool PoolItem::isUndetermined() const { return _pimpl->isUndetermined(); } bool PoolItem::isRelevant() const { return _pimpl->isRelevant(); } bool PoolItem::isSatisfied() const { return _pimpl->isSatisfied(); } bool PoolItem::isBroken() const { return _pimpl->isBroken(); } bool PoolItem::isNeeded() const { return _pimpl->isNeeded(); } bool PoolItem::isUnwanted() const { return _pimpl->isUnwanted(); } void PoolItem::saveState() const { _pimpl->saveState(); } void PoolItem::restoreState() const { _pimpl->restoreState(); } bool PoolItem::sameState() const { return _pimpl->sameState(); } ResObject::constPtr PoolItem::resolvable() const { return _pimpl->resolvable(); } std::ostream & operator<<( std::ostream & str, const PoolItem & obj ) { return str << *obj._pimpl; } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PoolItem.h000066400000000000000000000164651476576476200163350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolItem.h * */ #ifndef ZYPP_POOLITEM_H #define ZYPP_POOLITEM_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { class ResPool; namespace pool { class PoolImpl; } /////////////////////////////////////////////////////////////////// /// \class PoolItem /// \brief Combining \ref sat::Solvable and \ref ResStatus. /// /// The "real" PoolItem is usually somewhere in the ResPool. This is /// a reference to it. All copies made will reference (and modify) /// the same PoolItem. All changes via a PoolItem are immediately /// visible in all copies (now COW). /// /// \note PoolItem is a SolvableType, which provides direct access to /// many of the underlying sat::Solvables properties. /// \see \ref sat::SolvableType /// /// \note Constness: Like pointer types, a const PoolItem /// does \b not refer to a const PoolItem. The reference is /// \c const, i.e. you can't change the refered PoolItem. The PoolItem /// (i.e. the status) is always mutable. /////////////////////////////////////////////////////////////////// class ZYPP_API PoolItem : public sat::SolvableType { friend std::ostream & operator<<( std::ostream & str, const PoolItem & obj ); public: /** Default ctor for use in std::container. */ PoolItem(); /** Ctor looking up the \ref sat::Solvable in the \ref ResPool. */ explicit PoolItem( const sat::Solvable & solvable_r ); /** Ctor looking up the \ref sat::Solvable in the \ref ResPool. */ template explicit PoolItem( const SolvableType & solvable_r ) : PoolItem( solvable_r.satSolvable() ) {} /** Ctor looking up the \ref ResObject in the \ref ResPool. */ explicit PoolItem( const ResObject::constPtr & resolvable_r ); /** Dtor */ ~PoolItem(); public: /** \name Status related methods. */ //@{ /** Returns the current status. */ ResStatus & status() const; /** Resets status to the default state (KEEP_STATE bySOLVER; clears any lock!). */ ResStatus & statusReset() const; /** Resets status to it's initial state in the ResPool (KEEP_STATE bySOLVER or LOCKED byUSER). * The state depends on whether the PoolItem matched a hard lock defined * in /etc/zypp/locks or not. */ ResStatus & statusReinit() const; //@} /** \name Status validation. * Performed for non-packages. */ //@{ /** No validation is performed for packages. */ bool isUndetermined() const; /** Returns true if the solvable is relevant which means e.g. for patches * that at least one package of the patch is installed. */ bool isRelevant() const; /** Whether a relevant items requirements are met. */ bool isSatisfied() const; /** Whether a relevant items requirements are broken. */ bool isBroken() const; /** This includes \c unlocked broken patches, as well as those already * selected to be installed (otherwise classified as \c satisfied). */ bool isNeeded() const; /** Broken (needed) but locked patches. */ bool isUnwanted() const; //@} public: /** Return the \ref ResPool the item belongs to. */ ResPool pool() const; /** This is a \ref sat::SolvableType. */ explicit operator sat::Solvable() const { return resolvable() ? resolvable()->satSolvable() : sat::Solvable::noSolvable; } /** Return the buddy we share our status object with. * A \ref Product e.g. may share its status with an associated reference \ref Package. */ sat::Solvable buddy() const; public: /** Returns the ResObject::constPtr. * \see \ref operator-> */ ResObject::constPtr resolvable() const; /** Implicit conversion into ResObject::constPtr to * support query filters operating on ResObject. */ operator ResObject::constPtr() const { return resolvable(); } /** Forward \c -> access to ResObject. */ ResObject::constPtr operator->() const { return resolvable(); } private: friend class pool::PoolImpl; /** \ref PoolItem generator for \ref pool::PoolImpl. */ static PoolItem makePoolItem( const sat::Solvable & solvable_r ); /** Buddies are set by \ref pool::PoolImpl.*/ void setBuddy( const sat::Solvable & solv_r ); /** internal ctor */ public: struct Impl; ///< Expose type only private: explicit PoolItem( Impl * implptr_r ); /** Pointer to implementation */ RW_pointer _pimpl; private: /** \name tmp hack for save/restore state. */ /** \todo get rid of it. */ //@{ friend struct PoolItemSaver; void saveState() const; void restoreState() const; bool sameState() const; //@} }; /////////////////////////////////////////////////////////////////// /** \relates PoolItem Stream output */ std::ostream & operator<<( std::ostream & str, const PoolItem & obj ) ZYPP_API; /** \relates PoolItem Required to disambiguate vs. (PoolItem,ResObject::constPtr) due to implicit PoolItem::operator ResObject::constPtr */ inline bool operator==( const PoolItem & lhs, const PoolItem & rhs ) { return lhs.resolvable() == rhs.resolvable(); } /** \relates PoolItem Convenience compare */ inline bool operator==( const PoolItem & lhs, const ResObject::constPtr & rhs ) { return lhs.resolvable() == rhs; } /** \relates PoolItem Convenience compare */ inline bool operator==( const ResObject::constPtr & lhs, const PoolItem & rhs ) { return lhs == rhs.resolvable(); } /** \relates PoolItem Required to disambiguate vs. (PoolItem,ResObject::constPtr) due to implicit PoolItem::operator ResObject::constPtr */ inline bool operator!=( const PoolItem & lhs, const PoolItem & rhs ) { return ! (lhs==rhs); } /** \relates PoolItem Convenience compare */ inline bool operator!=( const PoolItem & lhs, const ResObject::constPtr & rhs ) { return ! (lhs==rhs); } /** \relates PoolItem Convenience compare */ inline bool operator!=( const ResObject::constPtr & lhs, const PoolItem & rhs ) { return ! (lhs==rhs); } /** Solvable to PoolItem transform functor. * \relates PoolItem * \relates sat::SolvIterMixin */ struct asPoolItem { using result_type = PoolItem; PoolItem operator()( const sat::Solvable & solv_r ) const { return PoolItem( solv_r ); } }; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOLITEM_H libzypp-17.36.5/zypp/PoolItemBest.cc000066400000000000000000000064761476576476200173120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolItemBest.cc * */ #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolItemBest::Impl // /** PoolItemBest implementation. */ struct PoolItemBest::Impl { Impl( bool preferNotLocked_r ) : _preferNotLocked { preferNotLocked_r } {} Container _container; bool _preferNotLocked; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolItemBest // /////////////////////////////////////////////////////////////////// void PoolItemBest::_ctor_init( bool preferNotLocked_r ) { _dont_use_this_use_pimpl.reset( new RWCOW_pointer(new Impl( preferNotLocked_r )) ); } void PoolItemBest::_ctor_init() { _ctor_init( /*preferNotLocked*/false ); } const PoolItemBest::Container & PoolItemBest::container() const { return pimpl()->_container; } void PoolItemBest::add( const PoolItem & pi_r ) { Container & container( pimpl()->_container ); PoolItem & ccand( container[pi_r.satSolvable().ident()] ); if ( ! ccand ) ccand = pi_r; else if ( pimpl()->_preferNotLocked ) { if ( ! pi_r.status().isLocked() ) { if ( ccand.status().isLocked() || ui::SelectableTraits::AVOrder()( pi_r, ccand ) ) ccand = pi_r; } else if ( ccand.status().isLocked() ) { if ( ui::SelectableTraits::AVOrder()( pi_r, ccand ) ) ccand = pi_r; } } else if ( ui::SelectableTraits::AVOrder()( pi_r, ccand ) ) ccand = pi_r; } PoolItem PoolItemBest::find( IdString ident_r ) const { const Container & container( pimpl()->_container ); Container::const_iterator it( container.find( ident_r ) ); return it != container.end() ? it->second : PoolItem(); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const PoolItemBest & obj ) { return dumpRange( str << "(" << obj.size() << ") ", obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PoolItemBest.h000066400000000000000000000145211476576476200171420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolItemBest.h * */ #ifndef ZYPP_POOLITEMBEST_H #define ZYPP_POOLITEMBEST_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolItemBest // /** Find the best candidates e.g. in a \ref PoolQuery result. * * The class basically maintains a \c map and remembers * for each \c ident (\ref sat::Solvable::ident) the best \ref PoolItem that * was added. * * The default \ref Predicate to determine the best choice is the same that * sorts the \ref ui::Selectable list of available objects, thus follows the * same rules the \ref resolver will apply. * * Ctor argument \ref preferNotLocked causes locked packages to be considered * less than not locked packages. * * \code * PoolQuery q; * q.addAttribute(sat::SolvAttr::name, "lib*"); * q.setMatchGlob(); * * // get the best matches and tag them for installation: * PoolItemBest bestMatches( q.begin(), q.end() ); * if ( ! bestMatches.empty() ) * { * for_( it, bestMatches.begin(), bestMatches.end() ) * { * ui::asSelectable()( *it )->setOnSystem( *it, ResStatus::USER ); * } * } * \endcode * * \todo Support arbitrary Predicates. */ class ZYPP_API PoolItemBest { using Container = std::unordered_map; public: /** Predicate returning \c True if \a lhs is a better choice. */ using Predicate = boost::function; using size_type = Container::size_type; using value_type = Container::value_type; using iterator = MapKVIteratorTraits::Value_const_iterator; using ident_iterator = MapKVIteratorTraits::Key_const_iterator; public: /** Indicator argument for ctor: consider locked packages less than not locked packages. */ static constexpr bool preferNotLocked = true; public: /** Default ctor. */ PoolItemBest( bool preferNotLocked_r = false ) { _ctor_init( preferNotLocked_r ); } /** Ctor feeding a \ref sat::Solvable. */ PoolItemBest( sat::Solvable slv_r, bool preferNotLocked_r = false ) { _ctor_init( preferNotLocked_r ); add( slv_r ); } /** Ctor feeding a \ref PoolItem. */ PoolItemBest( const PoolItem & pi_r, bool preferNotLocked_r = false ) { _ctor_init( preferNotLocked_r ); add( pi_r ); } /** Ctor feeding a range of \ref sat::Solvable or \ref PoolItem. */ template PoolItemBest( TIterator begin_r, TIterator end_r, bool preferNotLocked_r = false ) { _ctor_init( preferNotLocked_r ); add( begin_r, end_r ); } public: /** Feed one \ref sat::Solvable. */ void add( sat::Solvable slv_r ) { add( PoolItem( slv_r ) ); } /** Feed one \ref PoolItem. */ void add( const PoolItem & pi_r ); /** Feed a range of \ref sat::Solvable or \ref PoolItem. */ template void add( TIterator begin_r, TIterator end_r ) { for_( it, begin_r, end_r ) add( *it ); } public: /** \name Iterate the collected PoolItems. */ //@{ /** Whether PoolItems were collected. */ bool empty() const { return container().empty(); } /** Number of PoolItems collected. */ size_type size() const { return container().size(); } /** Pointer to the first PoolItem. */ iterator begin() const { return make_map_value_begin( container() ); } /** Pointer behind the last PoolItem. */ iterator end() const { return make_map_value_end( container() ); } /** Return the collected \ref PoolItem with \ref sat::Solvable::ident \a ident_r. */ PoolItem find( IdString ident_r ) const; /** \overload Use Solvables ident string. */ PoolItem find( sat::Solvable slv_r ) const { return find( slv_r.ident() ); } /** \overload Use PoolItems ident string. */ PoolItem find( const PoolItem & pi_r ) const { return find( pi_r.satSolvable().ident() ); } //@} /** \name Iterate the collected PoolItems ident strings. */ //@{ /** Pointer to the first item. */ ident_iterator identBegin() const { return make_map_key_begin( container() ); } /** Pointer behind the last item. */ ident_iterator identEnd() const { return make_map_key_end( container() ); } //@} private: void _ctor_init( bool preferNotLocked_r ); void _ctor_init(/*preferNotLocked = false*/); ///< bin.compat legacy const Container & container() const; private: /** Implementation */ struct Impl; /** Pointer to implementation */ RWCOW_pointer & pimpl() { return *(reinterpret_cast*>( _dont_use_this_use_pimpl.get() )); } /** Pointer to implementation */ const RWCOW_pointer & pimpl() const { return *(reinterpret_cast*>( _dont_use_this_use_pimpl.get() )); } /** Avoid need to include Impl definition when inlined ctors (due to tepmlate) are provided. */ shared_ptr _dont_use_this_use_pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates PoolItemBest Stream output */ std::ostream & operator<<( std::ostream & str, const PoolItemBest & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOLITEMBEST_H libzypp-17.36.5/zypp/PoolQuery.cc000066400000000000000000001667651476576476200167130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolQuery.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "PoolQuery" using std::endl; using namespace zypp::sat; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// // some Helpers and Predicates ///////////////////////////////////////////////////////////////// bool isDependencyAttribute( const sat::SolvAttr& attr_r ) { static sat::SolvAttr deps[] = { SolvAttr::dep_provides, SolvAttr::dep_requires, SolvAttr::dep_recommends, SolvAttr::dep_obsoletes, SolvAttr::dep_conflicts, SolvAttr::dep_suggests, SolvAttr::dep_supplements, SolvAttr::dep_enhances, }; for_( it, arrayBegin(deps), arrayEnd(deps) ) if ( *it == attr_r ) return true; return false; } /** Whether the current capabilities edition range ovelaps and/or its solvables arch matches. * Query asserts \a iter_r points to a capability and we * have to check the range only. */ struct EditionRangePredicate { EditionRangePredicate( const Rel & op, const Edition & edition ) : _range( op, edition ) , _arch( Arch_empty ) {} EditionRangePredicate( const Rel & op, const Edition & edition, const Arch & arch ) : _range( op, edition ) , _arch( arch ) {} bool operator()( const sat::LookupAttr::iterator& iter_r ) { if ( !_arch.empty() && iter_r.inSolvable().arch() != _arch ) return false; CapDetail cap( iter_r.id() ); if ( ! cap.isSimple() ) return false; if ( cap.isNamed() ) // no range to match return true; return overlaps( Edition::MatchRange( cap.op(), cap.ed() ), _range ); } std::string serialize() const { std::string ret( "EditionRange" ); str::appendEscaped( ret, _range.op.asString() ); str::appendEscaped( ret, _range.value.asString() ); str::appendEscaped( ret, _arch.asString() ); return ret; } Edition::MatchRange _range; Arch _arch; }; /** Whether the current Solvables edition is within a given range and/or its arch matches. */ struct SolvableRangePredicate { SolvableRangePredicate( const Rel & op, const Edition & edition ) : _range( op, edition ) , _arch( Arch_empty ) {} SolvableRangePredicate( const Rel & op, const Edition & edition, const Arch & arch ) : _range( op, edition ) , _arch( arch ) {} bool operator()( const sat::LookupAttr::iterator& iter_r ) { if ( !_arch.empty() && iter_r.inSolvable().arch() != _arch ) return false; return overlaps( Edition::MatchRange( Rel::EQ, iter_r.inSolvable().edition() ), _range ); } std::string serialize() const { std::string ret( "SolvableRange" ); str::appendEscaped( ret, _range.op.asString() ); str::appendEscaped( ret, _range.value.asString() ); str::appendEscaped( ret, _arch.asString() ); return ret; } Edition::MatchRange _range; Arch _arch; }; /** Whether the current capability matches a given one. * Query asserts \a iter_r points to a capability and we * have to check the match only. */ struct CapabilityMatchPredicate { CapabilityMatchPredicate( Capability cap_r ) : _cap( cap_r ) {} bool operator()( const sat::LookupAttr::iterator& iter_r ) const { return _cap.matches( iter_r.asType() ) == CapMatch::yes; } std::string serialize() const { std::string ret( "CapabilityMatch" ); str::appendEscaped( ret, _cap.asString() ); return ret; } Capability _cap; }; ///////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// /** Match data per attribtue. * * This includes the attribute itself, an optional \ref StrMatcher * to restrict the query to certain string values, and an optional * boolean \ref Predicate that may apply further restrictions that can * not be expressed by the \ref strMatcher. * * Example for such a \ref predicate would be an additional edition range * check whan looking for dependencies. The \ref strMatcher would * find potential matches by looking at the dependencies name, the * predicate will then check the edition ranges. * * As the \ref predicate takes an iterator pointing to the current * match, it's also suitable for sub-structure (flexarray) inspection * (\see \ref sat::LookupAttr::iterator::solvAttrSubEntry). * * (bsc#1035729) If SolvAttr::name searches for an explicit \c kind:name, * this \c kind is stored in \ref kindPredicate and will overwrite any * 'global' kind restriction applied via \ref PoolQuery::addKind. This * task can't be passed off to a predicate, as \ref PoolQueryMatcher::isAMatch * must accept only explicit-kind-checking predicate matches, in case the * 'global' kind restriction woudl otherwise discard the match. * * \note: \see \ref addPredicate for further constraints. */ struct AttrMatchData { using Predicate = function; static bool always( const sat::LookupAttr::iterator& ) { return true; } static bool never( const sat::LookupAttr::iterator& ) { return false; } AttrMatchData() {} AttrMatchData( sat::SolvAttr attr_r ) : attr(std::move( attr_r )) {} AttrMatchData( sat::SolvAttr attr_r, StrMatcher strMatcher_r ) : attr(std::move( attr_r )) , strMatcher(std::move( strMatcher_r )) {} AttrMatchData( sat::SolvAttr attr_r, StrMatcher strMatcher_r, Predicate predicate_r, std::string predicateStr_r ) : attr(std::move( attr_r )) , strMatcher(std::move( strMatcher_r )) , predicate(std::move( predicate_r )) , predicateStr(std::move( predicateStr_r )) {} /** A usable Predicate must provide a string serialization. * As there is no \c operator== for \ref Predicate, we compare its * string representation instead. If you add new predicate, check the * deserialization code in \ref deserialize. */ template void addPredicate( const TPredicate & predicate_r ) { predicate = predicate_r; predicateStr = predicate_r.serialize(); } /** Dumb serialization. * \code * AttrMatchData ATTRIBUTE SEARCHSTRING [C|SEARCHMODE|X] SERIALIZED_PREDICATE * \endcode */ std::string serialize() const { std::string ret( "AttrMatchData" ); str::appendEscaped( ret, attr.asString() ); str::appendEscaped( ret, strMatcher.searchstring() ); str::appendEscaped( ret, serializeMode( strMatcher.flags().mode() ) ); str::appendEscaped( ret, predicateStr ); return ret; } /** Dumb restore from serialized string. * \throw Exception on parse error. */ static AttrMatchData deserialize( const std::string & str_r ) { std::vector words; str::splitEscaped( str_r, std::back_inserter(words) ); if ( words.empty() || words[0] != "AttrMatchData" ) ZYPP_THROW( Exception( str::Str() << "Expecting AttrMatchData: " << str_r ) ); if ( words.size() != 5 ) ZYPP_THROW( Exception( str::Str() << "Wrong number of words: " << str_r ) ); AttrMatchData ret; ret.attr = sat::SolvAttr( words[1] ); ret.strMatcher = StrMatcher( words[2] ); if ( Match::Mode mode = deserializeMode( words[3] ) ) ret.strMatcher.setFlags( mode ); ret.predicateStr = words[4]; // now the predicate words.clear(); str::splitEscaped( ret.predicateStr, std::back_inserter(words) ); if ( ! words.empty() ) { if ( words[0] == "EditionRange" ) { switch( words.size() ) { case 3: ret.predicate = EditionRangePredicate( Rel(words[1]), Edition(words[2]) ); break; case 4: ret.predicate = EditionRangePredicate( Rel(words[1]), Edition(words[2]), Arch(words[3]) ); break; default: ZYPP_THROW( Exception( str::Str() << "Wrong number of words: " << str_r ) ); break; } } else if ( words[0] == "SolvableRange" ) { switch( words.size() ) { case 3: ret.predicate = SolvableRangePredicate( Rel(words[1]), Edition(words[2]) ); break; case 4: ret.predicate = SolvableRangePredicate( Rel(words[1]), Edition(words[2]), Arch(words[3]) ); break; default: ZYPP_THROW( Exception( str::Str() << "Wrong number of words: " << str_r ) ); break; } } else if ( words[0] == "CapabilityMatch" ) { if ( words.size() != 2 ) ZYPP_THROW( Exception( str::Str() << "Wrong number of words: " << str_r ) ); ret.predicate = CapabilityMatchPredicate( Capability(words[1]) ); } else ZYPP_THROW( Exception( str::Str() << "Unknown predicate: " << str_r ) ); } return ret; } sat::SolvAttr attr; StrMatcher strMatcher; Predicate predicate; std::string predicateStr; ResKind kindPredicate = ResKind::nokind; // holds the 'kind' part if SolvAttr:name looks for an explicit 'kind:name' private: /** Serialize \ref strMatcher \ref Match::Mode */ static std::string serializeMode( Match::Mode mode_r ) { // Legacy code used "[C|X]" to differ just between OTHER (need to (C)ompile) and // using the default search mode. As we now allow to specify a SEARCHMODE we // need to serialize it: switch ( mode_r ) { #define OUTS(M,S) case Match::M: return #S; break // (C)ompile OUTS( OTHER, C ); // well known modes: OUTS( STRING, T ); OUTS( STRINGSTART, S ); OUTS( STRINGEND, E ); OUTS( SUBSTRING, B ); OUTS( GLOB, G ); OUTS( REGEX, R ); #undef OUTS // everything else use default case Match::NOTHING: break; } return "X"; } /** Deserialize \ref strMatcher \ref Match::Mode */ static Match::Mode deserializeMode( const std::string & str_r ) { switch ( str_r[0] ) { #define OUTS(M,C) case *#C: return Match::M; break // (C)ompile OUTS( OTHER, C ); // well known modes: OUTS( STRING, T ); OUTS( STRINGSTART, S ); OUTS( STRINGEND, E ); OUTS( SUBSTRING, B ); OUTS( GLOB, G ); OUTS( REGEX, R ); #undef OUTS // everything else use default default: break; } return Match::NOTHING; } }; /** \relates AttrMatchData */ inline std::ostream & operator<<( std::ostream & str, const AttrMatchData & obj ) { str << obj.attr << ": " << obj.strMatcher; if ( obj.kindPredicate ) str << " +(" << obj.kindPredicate << ")"; if ( obj.predicate ) str << " +(" << obj.predicateStr << ")"; return str; } /** \relates AttrMatchData */ inline bool operator==( const AttrMatchData & lhs, const AttrMatchData & rhs ) { return ( lhs.attr == rhs.attr && lhs.strMatcher == rhs.strMatcher && lhs.predicateStr == rhs.predicateStr ); } /** \relates AttrMatchData */ inline bool operator!=( const AttrMatchData & lhs, const AttrMatchData & rhs ) { return !( lhs == rhs ); } /** \relates AttrMatchData Arbitrary order for std::container. */ inline bool operator<( const AttrMatchData & lhs, const AttrMatchData & rhs ) { if ( lhs.attr != rhs.attr ) return ( lhs.attr < rhs.attr ); if ( lhs.strMatcher != rhs.strMatcher ) return ( lhs.strMatcher < rhs.strMatcher ); if ( lhs.predicateStr != rhs.predicateStr ) return ( lhs.predicateStr < rhs.predicateStr ); return false; } using AttrMatchList = std::list; } ///////////////////////////////////////////////////////////////// // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolQuery::Impl // /** */ class PoolQuery::Impl { public: Impl() : _flags( Match::SUBSTRING | Match::NOCASE | Match::SKIP_KIND ) , _match_word(false) , _status_flags(ALL) {} Impl(const Impl &) = default; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() {} public: /** String representation */ std::string asString() const; /** \name Raw query options. */ //@{ /** Raw search strings. */ StrContainer _strings; /** Raw attributes */ AttrRawStrMap _attrs; /** Uncompiled attributes with predicate. */ std::set _uncompiledPredicated; /** Sat solver search flags */ Match _flags; bool _match_word; /** Sat solver status flags */ StatusFilter _status_flags; /** Edition condition operand */ Edition _edition; /** Operator for edition condition */ Rel _op; /** Repos to search. */ StrContainer _repos; /** Kinds to search */ Kinds _kinds; /** Optional comment string for serialization. */ mutable std::string _comment; //@} public: bool operator<( const PoolQuery::Impl & rhs ) const { #define OUTS(A) if ( A != rhs.A ) return A < rhs.A; OUTS( _strings ); OUTS( _attrs ); OUTS( _uncompiledPredicated ); OUTS( _flags.get() ); OUTS( _match_word ); OUTS( _status_flags ); OUTS( _edition ); OUTS( _op.inSwitch() ); OUTS( _repos ); OUTS( _kinds ); #undef OUTS return false; } bool operator==( const PoolQuery::Impl & rhs ) const { if ( _flags == rhs._flags // bnc#792901: while libzypp uses exact match mode for a single // package name lock, zypper always uses glob. :( // We unify those two forms to enable zypper to remove zypp locks // without need to actually evaluate the query (which would require // repos to be loaded). || ( ( ( _flags.isModeString() && rhs._flags.isModeGlob() ) || ( _flags.isModeGlob() && rhs._flags.isModeString() ) ) && _strings.empty() && _attrs.size() == 1 && _attrs.begin()->first == sat::SolvAttr::name ) ) { // ma: Intentionally a different _comment is not considered. return ( _strings == rhs._strings && _attrs == rhs._attrs && _uncompiledPredicated == rhs._uncompiledPredicated && _match_word == rhs._match_word && _status_flags == rhs._status_flags && _edition == rhs._edition && _op == rhs._op && _repos == rhs._repos && _kinds == rhs._kinds ); } return false; } bool operator!=( const PoolQuery::Impl & rhs ) const { return ! operator==( rhs ); } public: /** Compile the regex. * Basically building the \ref _attrMatchList from strings. * \throws MatchException Any of the exceptions thrown by \ref StrMatcher::compile. */ void compile() const; /** StrMatcher per attribtue. */ mutable AttrMatchList _attrMatchList; private: /** Join patterns in \a container_r according to \a flags_r into a single \ref StrMatcher. * The \ref StrMatcher returned will be a REGEX if more than one pattern was passed. */ StrMatcher joinedStrMatcher( const StrContainer & container_r, const Match & flags_r ) const; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// struct MyInserter { MyInserter(PoolQuery::StrContainer & cont) : _cont(cont) {} bool operator()(const std::string & str) { _cont.insert(str); return true; } PoolQuery::StrContainer & _cont; }; struct EmptyFilter { bool operator()(const std::string & str) { return !str.empty(); } }; void PoolQuery::Impl::compile() const { _attrMatchList.clear(); if ( _flags.mode() == Match::OTHER ) // this will never succeed... ZYPP_THROW( MatchUnknownModeException( _flags ) ); // 'different' - will have to iterate through all and match by ourselves (slow) // 'same' - will pass the compiled string to dataiterator_init // 'one-attr' - will pass it to dataiterator_init // 'one-non-regex-str' - will pass to dataiterator_init, set flag to SEARCH_STRING or SEARCH_SUBSTRING // // NO ATTRIBUTE // else // for all _strings // create regex; store in rcstrings; if more strings flag regex; if (_attrs.empty()) { ; // A default 'query-all' will be added after all sources are processed. } // // ONE ATTRIBUTE // else if _attrs is not empty but it contains just one attr // for all _strings and _attr[key] strings // create regex; flag 'one-attr'; if more strings flag regex; else if (_attrs.size() == 1) { StrContainer joined; invokeOnEach(_strings.begin(), _strings.end(), EmptyFilter(), MyInserter(joined)); invokeOnEach(_attrs.begin()->second.begin(), _attrs.begin()->second.end(), EmptyFilter(), MyInserter(joined)); _attrMatchList.push_back( AttrMatchData( _attrs.begin()->first, joinedStrMatcher( joined, _flags ) ) ); } // // MULTIPLE ATTRIBUTES else { // check whether there are any per-attribute strings bool attrvals_empty = true; for_( ai, _attrs.begin(), _attrs.end() ) { if ( ai->second.empty() ) continue; for_( it, ai->second.begin(), ai->second.end() ) { if ( !it->empty() ) { attrvals_empty = false; break; } } if ( ! attrvals_empty ) break; } // chceck whether the per-attribute strings are all the same bool attrvals_thesame = true; AttrRawStrMap::const_iterator ai = _attrs.begin(); const StrContainer & set1 = ai->second; ++ai; for (; ai != _attrs.end(); ++ai) { StrContainer result; set_difference( set1.begin(), set1.end(), ai->second.begin(), ai->second.end(), inserter(result, result.begin())/*, ltstr()*/); if (!result.empty()) { attrvals_thesame = false; break; } } // // THE SAME STRINGS FOR DIFFERENT ATTRS // else if _attrs is not empty but it does not contain strings // for each key in _attrs take all _strings // create regex; store in rcstrings; flag 'same'; if more strings flag regex; if (attrvals_empty || attrvals_thesame) { StrContainer joined; if (attrvals_empty) { invokeOnEach(_strings.begin(), _strings.end(), EmptyFilter(), MyInserter(joined)); } else { invokeOnEach(_strings.begin(), _strings.end(), EmptyFilter(), MyInserter(joined)); invokeOnEach(_attrs.begin()->second.begin(), _attrs.begin()->second.end(), EmptyFilter(), MyInserter(joined)); } // May use the same StrMatcher for all StrMatcher matcher( joinedStrMatcher( joined, _flags ) ); for_( ai, _attrs.begin(), _attrs.end() ) { _attrMatchList.push_back( AttrMatchData( ai->first, matcher ) ); } } // // DIFFERENT STRINGS FOR DIFFERENT ATTRS // if _attrs is not empty and it contains non-empty vectors with non-empty strings // for each key in _attrs take all _strings + all _attrs[key] strings // create regex; flag 'different'; if more strings flag regex; else { for_(ai, _attrs.begin(), _attrs.end()) { StrContainer joined; invokeOnEach(_strings.begin(), _strings.end(), EmptyFilter(), MyInserter(joined)); invokeOnEach(ai->second.begin(), ai->second.end(), EmptyFilter(), MyInserter(joined)); _attrMatchList.push_back( AttrMatchData( ai->first, joinedStrMatcher( joined, _flags ) ) ); } } } // Now handle any predicated queries if ( ! _uncompiledPredicated.empty() ) { StrContainer global; invokeOnEach( _strings.begin(), _strings.end(), EmptyFilter(), MyInserter(global) ); for_( it, _uncompiledPredicated.begin(), _uncompiledPredicated.end() ) { if ( it->strMatcher.flags().mode() == Match::OTHER ) { // need to compile: StrContainer joined( global ); const std::string & mstr( it->strMatcher.searchstring() ); if ( ! mstr.empty() ) joined.insert( mstr ); // copy and exchange the StrMatcher AttrMatchData nattr( *it ); nattr.strMatcher = joinedStrMatcher( joined, _flags ); _attrMatchList.push_back( std::move(nattr) ); } else { // copy matcher _attrMatchList.push_back( *it ); } } } // If no attributes defined at all, then add 'query all' if ( _attrMatchList.empty() ) { _attrMatchList.push_back( AttrMatchData( sat::SolvAttr::allAttr, joinedStrMatcher( _strings, _flags ) ) ); } // Finally check here, whether all involved regex compile. for_( it, _attrMatchList.begin(), _attrMatchList.end() ) { it->strMatcher.compile(); // throws on error } //DBG << asString() << endl; } /////////////////////////////////////////////////////////////////// namespace { /** Escape \a str_r for use in a regex. * \a flags_r determines whether the input string is interpreted * as regex, glob or plain string. */ std::string rxEscape( std::string str_r, const Match & flags_r ) { if ( str_r.empty() || flags_r.isModeRegex() ) return str_r; if ( flags_r.isModeGlob() ) return str::rxEscapeGlob( std::move(str_r) ); return str::rxEscapeStr( std::move(str_r) ); } } // namespace /////////////////////////////////////////////////////////////////// StrMatcher PoolQuery::Impl::joinedStrMatcher( const StrContainer & container_r, const Match & flags_r ) const { if ( container_r.empty() ) return StrMatcher( std::string(), flags_r ); if ( container_r.size() == 1 && !_match_word ) // use RX to match words return StrMatcher( *container_r.begin(), flags_r ); // Convert to a regex. // Note: Modes STRING and GLOB match whole strings (anchored ^ $) // SUBSTRING and REGEX match substrings (match_word anchores SUBSTRING \b) Match retflags( flags_r ); retflags.setModeRegex(); str::Str ret; if ( flags_r.isModeString() || flags_r.isModeGlob() ) ret << "^"; else if ( _match_word ) ret << "\\b"; // (..|..|..) char sep = '('; for ( const::std::string & s : container_r ) { ret << sep << rxEscape( s, flags_r ); if ( sep == '(' ) sep = '|'; } ret << ')'; if ( flags_r.isModeString() || flags_r.isModeGlob() ) ret << "$"; else if ( _match_word ) ret << "\\b"; return StrMatcher( ret, retflags ); } std::string PoolQuery::Impl::asString() const { std::ostringstream o; o << "kinds: "; if ( _kinds.empty() ) o << "ALL"; else { for(Kinds::const_iterator it = _kinds.begin(); it != _kinds.end(); ++it) o << *it << " "; } o << endl; o << "repos: "; if ( _repos.empty() ) o << "ALL"; else { for(StrContainer::const_iterator it = _repos.begin(); it != _repos.end(); ++it) o << *it << " "; } o << endl; o << "version: "<< _op << " " << _edition.asString() << endl; o << "status: " << ( _status_flags ? ( _status_flags == INSTALLED_ONLY ? "INSTALLED_ONLY" : "UNINSTALLED_ONLY" ) : "ALL" ) << endl; o << "string match flags: " << Match(_flags) << endl; // raw o << "strings: "; for(StrContainer::const_iterator it = _strings.begin(); it != _strings.end(); ++it) o << *it << " "; o << endl; o << "attributes: " << endl; for(AttrRawStrMap::const_iterator ai = _attrs.begin(); ai != _attrs.end(); ++ai) { o << "* " << ai->first << ": "; for(StrContainer::const_iterator vi = ai->second.begin(); vi != ai->second.end(); ++vi) o << *vi << " "; o << endl; } o << "predicated: " << endl; for_( it, _uncompiledPredicated.begin(), _uncompiledPredicated.end() ) { o << "* " << *it << endl; } // compiled o << "last attribute matcher compiled: " << endl; if ( _attrMatchList.empty() ) { o << "not yet compiled" << endl; } else { for_( it, _attrMatchList.begin(), _attrMatchList.end() ) { o << "* " << *it << endl; } } return o.str(); } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolQuery // /////////////////////////////////////////////////////////////////// PoolQuery::PoolQuery() : _pimpl(new Impl()) {} PoolQuery::~PoolQuery() {} void PoolQuery::addRepo(const std::string &repoalias) { if (repoalias.empty()) { WAR << "ignoring an empty repository alias" << endl; return; } _pimpl->_repos.insert(repoalias); } void PoolQuery::addKind(const ResKind & kind) { _pimpl->_kinds.insert(kind); } void PoolQuery::setComment(const std::string & comment) const { _pimpl->_comment = comment; } void PoolQuery::addString(const std::string & value) { _pimpl->_strings.insert(value); } void PoolQuery::addAttribute(const sat::SolvAttr & attr, const std::string & value) { _pimpl->_attrs[attr].insert(value); } void PoolQuery::addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition ) { // Default Match::OTHER indicates need to compile, i.e. to merge name into the global search string and mode. return addDependency( attr, name, op, edition, Arch_empty, Match::OTHER ); } void PoolQuery::addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition, const Arch & arch ) { // Default Match::OTHER indicates need to compile, i.e. to merge name into the global search string and mode. return addDependency( attr, name, op, edition, arch, Match::OTHER ); } void PoolQuery::addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition, const Arch & arch, Match::Mode mode ) { if ( op == Rel::NONE ) // will never match. return; // SolvAttr::name with explicit 'kind:name' will overwrite the default _kinds ResKind explicitKind; if ( attr == sat::SolvAttr::name ) explicitKind = ResKind::explicitBuiltin( name ); // Legacy: Match::OTHER and no additional constraints on edition/arch/kind // require addAttribute, otherwise de-serialisation breaks (serialized // and de-serialized query could be !=). // From the results POV we could also use the predicated case below. if ( op == Rel::ANY && arch.empty() && !explicitKind && mode == Match::OTHER ) { addAttribute( attr, name ); return; } // Match::OTHER indicates need to compile // (merge global search strings into name). AttrMatchData attrMatchData( attr ); if ( !explicitKind ) attrMatchData.strMatcher = StrMatcher( name, mode ); else { // ResKind::explicitBuiltin call above asserts the presence of the ':' in name attrMatchData.strMatcher = StrMatcher( strchr( name.c_str(), ':')+1, mode ); attrMatchData.kindPredicate = explicitKind; } if ( isDependencyAttribute( attr ) ) attrMatchData.addPredicate( EditionRangePredicate( op, edition, arch ) ); else attrMatchData.addPredicate( SolvableRangePredicate( op, edition, arch ) ); _pimpl->_uncompiledPredicated.insert( attrMatchData ); } void PoolQuery::addDependency( const sat::SolvAttr & attr, Capability cap_r ) { CapDetail cap( cap_r ); if ( ! cap.isSimple() ) // will never match. return; // Matches STRING per default. (won't get compiled!) AttrMatchData attrMatchData( attr, StrMatcher( cap.name().asString() ) ); if ( isDependencyAttribute( attr ) ) attrMatchData.addPredicate( CapabilityMatchPredicate( cap_r ) ); else attrMatchData.addPredicate( SolvableRangePredicate( cap.op(), cap.ed() ) ); _pimpl->_uncompiledPredicated.insert( attrMatchData ); } void PoolQuery::setEdition(const Edition & edition, const Rel & op) { _pimpl->_edition = edition; _pimpl->_op = op; } void PoolQuery::setMatchSubstring() { _pimpl->_flags.setModeSubstring(); _pimpl->_match_word = false; } void PoolQuery::setMatchExact() { _pimpl->_flags.setModeString(); _pimpl->_match_word = false; } void PoolQuery::setMatchRegex() { _pimpl->_flags.setModeRegex(); _pimpl->_match_word = false; } void PoolQuery::setMatchGlob() { _pimpl->_flags.setModeGlob(); _pimpl->_match_word = false; } void PoolQuery::setMatchWord() { _pimpl->_flags.setModeSubstring(); _pimpl->_match_word = true; } Match PoolQuery::flags() const { return _pimpl->_flags; } void PoolQuery::setFlags( const Match & flags ) { _pimpl->_flags = flags; } void PoolQuery::setInstalledOnly() { _pimpl->_status_flags = INSTALLED_ONLY; } void PoolQuery::setUninstalledOnly() { _pimpl->_status_flags = UNINSTALLED_ONLY; } void PoolQuery::setStatusFilterFlags( PoolQuery::StatusFilter flags ) { _pimpl->_status_flags = flags; } const PoolQuery::StrContainer & PoolQuery::strings() const { return _pimpl->_strings; } const PoolQuery::AttrRawStrMap & PoolQuery::attributes() const { return _pimpl->_attrs; } const PoolQuery::StrContainer & PoolQuery::attribute(const sat::SolvAttr & attr) const { static const PoolQuery::StrContainer nocontainer; AttrRawStrMap::const_iterator it = _pimpl->_attrs.find(attr); return it != _pimpl->_attrs.end() ? it->second : nocontainer; } const Edition PoolQuery::edition() const { return _pimpl->_edition; } const Rel PoolQuery::editionRel() const { return _pimpl->_op; } const PoolQuery::Kinds & PoolQuery::kinds() const { return _pimpl->_kinds; } const PoolQuery::StrContainer & PoolQuery::repos() const { return _pimpl->_repos; } const std::string & PoolQuery::comment() const { return _pimpl->_comment; } bool PoolQuery::caseSensitive() const { return !_pimpl->_flags.test( Match::NOCASE ); } void PoolQuery::setCaseSensitive( bool value ) { _pimpl->_flags.turn( Match::NOCASE, !value ); } bool PoolQuery::filesMatchFullPath() const { return _pimpl->_flags.test( Match::FILES ); } void PoolQuery::setFilesMatchFullPath( bool value ) { _pimpl->_flags.turn( Match::FILES, value ); } bool PoolQuery::matchExact() const { return _pimpl->_flags.isModeString(); } bool PoolQuery::matchSubstring() const { return _pimpl->_flags.isModeSubstring() && !_pimpl->_match_word; } bool PoolQuery::matchGlob() const { return _pimpl->_flags.isModeGlob(); } bool PoolQuery::matchRegex() const { return _pimpl->_flags.isModeRegex(); } bool PoolQuery::matchWord() const { return _pimpl->_flags.isModeSubstring() && _pimpl->_match_word; } PoolQuery::StatusFilter PoolQuery::statusFilterFlags() const { return _pimpl->_status_flags; } bool PoolQuery::empty() const { try { return begin() == end(); } catch (const Exception & ex) {} return true; } PoolQuery::size_type PoolQuery::size() const { try { size_type count = 0; for_( it, begin(), end() ) ++count; return count; } catch (const Exception & ex) {} return 0; } void PoolQuery::execute(ProcessResolvable fnc) { invokeOnEach( begin(), end(), std::move(fnc)); } /*DEPRECATED LEGACY:*/void PoolQuery::setRequireAll( bool ) {} /*DEPRECATED LEGACY:*/bool PoolQuery::requireAll() const { return false; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolQuery::Attr // /** * represents all atributes in PoolQuery except SolvAtributes, which are * used as is (not needed extend anything if someone adds new solv attr) */ struct PoolQueryAttr : public IdStringType { private: friend class IdStringType; IdString _str; public: //noAttr PoolQueryAttr(){} explicit PoolQueryAttr( const char* cstr_r ) : _str( cstr_r ) {} explicit PoolQueryAttr( const std::string & str_r ) : _str( str_r ) {} // unknown atributes static const PoolQueryAttr noAttr; // PoolQuery's own attributes static const PoolQueryAttr repoAttr; static const PoolQueryAttr kindAttr; static const PoolQueryAttr commentAttr; static const PoolQueryAttr stringAttr; static const PoolQueryAttr stringTypeAttr; static const PoolQueryAttr requireAllAttr; // LEAGACY: attribute was defined but never implemented. static const PoolQueryAttr caseSensitiveAttr; static const PoolQueryAttr installStatusAttr; static const PoolQueryAttr editionAttr; static const PoolQueryAttr complexAttr; }; const PoolQueryAttr PoolQueryAttr::noAttr; const PoolQueryAttr PoolQueryAttr::repoAttr( "repo" ); const PoolQueryAttr PoolQueryAttr::kindAttr( "type" ); const PoolQueryAttr PoolQueryAttr::commentAttr( "comment" ); const PoolQueryAttr PoolQueryAttr::stringAttr( "query_string" ); const PoolQueryAttr PoolQueryAttr::stringTypeAttr("match_type"); const PoolQueryAttr PoolQueryAttr::requireAllAttr("require_all"); // LEAGACY: attribute was defined but never implemented. const PoolQueryAttr PoolQueryAttr::caseSensitiveAttr("case_sensitive"); const PoolQueryAttr PoolQueryAttr::installStatusAttr("install_status"); const PoolQueryAttr PoolQueryAttr::editionAttr("version"); const PoolQueryAttr PoolQueryAttr::complexAttr("complex"); class StringTypeAttr : public IdStringType { friend class IdStringType; IdString _str; public: StringTypeAttr(){} explicit StringTypeAttr( const char* cstr_r ) : _str( cstr_r ){} explicit StringTypeAttr( const std::string & str_r ) : _str( str_r ){} static const StringTypeAttr noAttr; static const StringTypeAttr exactAttr; static const StringTypeAttr substringAttr; static const StringTypeAttr regexAttr; static const StringTypeAttr globAttr; static const StringTypeAttr wordAttr; }; const StringTypeAttr StringTypeAttr::noAttr; const StringTypeAttr StringTypeAttr::exactAttr("exact"); const StringTypeAttr StringTypeAttr::substringAttr("substring"); const StringTypeAttr StringTypeAttr::regexAttr("regex"); const StringTypeAttr StringTypeAttr::globAttr("glob"); const StringTypeAttr StringTypeAttr::wordAttr("word"); /////////////////////////////////////////////////////////////////// //\TODO maybe ctor with stream can be useful //\TODO let it throw, let it throw, let it throw. bool PoolQuery::recover( std::istream &str, char delim ) { bool finded_something = false; //indicates some atributes is finded std::string s; do { if ( str.eof() ) break; getline( str, s, delim ); if ((!s.empty()) && s[0]=='#') //comment { continue; } std::string::size_type pos = s.find(':'); if (s.empty() || pos == s.npos) // some garbage on line... act like blank line { if (finded_something) //is first blank line after record? { break; } else { continue; } } finded_something = true; std::string attrName(str::trim(std::string(s,0,pos))); // trimmed name of atribute std::string attrValue(str::trim(std::string(s,pos+1,s.npos))); //trimmed value PoolQueryAttr attribute( attrName ); if ( attribute==PoolQueryAttr::repoAttr ) { addRepo( attrValue ); } /* some backwards compatibility */ else if ( attribute==PoolQueryAttr::kindAttr || attribute=="kind" ) { addKind( ResKind(attrValue) ); } else if ( attribute==PoolQueryAttr::commentAttr ) { setComment( attrValue ); } else if ( attribute==PoolQueryAttr::stringAttr || attribute=="global_string") { addString( attrValue ); } else if ( attribute==PoolQueryAttr::stringTypeAttr || attribute=="string_type" ) { StringTypeAttr s(attrValue); if( s == StringTypeAttr::regexAttr ) { setMatchRegex(); } else if ( s == StringTypeAttr::globAttr ) { setMatchGlob(); } else if ( s == StringTypeAttr::exactAttr ) { setMatchExact(); } else if ( s == StringTypeAttr::substringAttr ) { setMatchSubstring(); } else if ( s == StringTypeAttr::wordAttr ) { setMatchWord(); } else if ( s == StringTypeAttr::noAttr ) { WAR << "unknown string type " << attrValue << endl; } else { WAR << "forget recover some attribute defined as String type attribute: " << attrValue << endl; } } else if ( attribute==PoolQueryAttr::requireAllAttr ) { // LEAGACY: attribute was defined but never implemented. // Actually it should not occur outside our testcases. } else if ( attribute==PoolQueryAttr::caseSensitiveAttr ) { if ( str::strToTrue(attrValue) ) { setCaseSensitive(true); } else if ( !str::strToFalse(attrValue) ) { setCaseSensitive(false); } else { WAR << "unknown boolean value " << attrValue << endl; } } else if ( attribute==PoolQueryAttr::installStatusAttr ) { if( attrValue == "all" ) { setStatusFilterFlags( ALL ); } else if( attrValue == "installed" ) { setInstalledOnly(); } else if( attrValue == "not-installed" ) { setUninstalledOnly(); } else { WAR << "Unknown value for install status " << attrValue << endl; } } else if ( attribute == PoolQueryAttr::editionAttr) { std::string::size_type pos = 0; Rel rel("=="); if (attrValue.find_first_of("=<>!") == 0) { pos = attrValue.find_last_of("=<>"); rel = Rel(attrValue.substr(0, pos+1)); attrValue = str::trim(attrValue.substr(pos+1, attrValue.npos)); } setEdition(Edition(attrValue), rel); } else if ( attribute == PoolQueryAttr::complexAttr ) { try { _pimpl->_uncompiledPredicated.insert( AttrMatchData::deserialize( attrValue ) ); } catch ( const Exception & err ) { WAR << "Unparsable value for complex: " << err.asUserHistory() << endl; } } else if ( attribute==PoolQueryAttr::noAttr ) { WAR << "empty attribute name" << endl; } else { std::string s = attrName; str::replaceAll( s,"_",":" ); SolvAttr a(s); if ( a == SolvAttr::name || isDependencyAttribute( a ) ) { Capability c( attrValue ); CapDetail d( c ); if ( d.isVersioned() ) addDependency( a, d.name().asString(), d.op(), d.ed() ); else addDependency( a, attrValue ); } else addAttribute( a, attrValue ); } } while ( true ); // OLD STYLE VERSIONED LOCKS: // solvable_name: kernel // version: > 1 // // NEW STYLE VERSIONED LOCKS: // complex: AttrMatchData solvable:name kernel C SolvableRange\ >\ 1\ \"\" // or // solvable_name: kernel > 1 // // Semantically equivalent as locks, but due to the different syntax // the complex lock is wrongly handled by zypper. // // bsc#1112911: Unfortunately all styles are found in real-life locks-files. // libzypp will try to make sure, when parsing the locks-file, that complex // locks are rewritten into to OLD STYLE queries zypper can handle. if ( !_pimpl->_attrs.count(SolvAttr::name) && _pimpl->_uncompiledPredicated.size() == 1 ) { // No OLD STYLE lock for SolvAttr::name and exactly one complex lock... const AttrMatchData & attrmatch { *_pimpl->_uncompiledPredicated.begin() }; if ( attrmatch.attr == SolvAttr::name && attrmatch.strMatcher.flags().mode() == Match::OTHER ) { // ...for SolvAttr::name and following the global search flags. // A candidate for a rewrite? std::vector words; str::splitEscaped( attrmatch.predicateStr, std::back_inserter(words) ); if ( words.size() < 4 || words[3].empty() ) { // We have _NO_ arch rule in the complex predicate, so we can simplify it. // // NOTE: AFAIK it's not possible to create (or have created) a complex lock // with arch rule with zypper means. Nevertheless, in case such a rule made it // into a locks file, it's better to have a strange looking 'zypper locks' list // than to lock the wrong packages. // (and remember that you can't use "addAttribute( SolvAttr::arch, ... )" because // attributes are `OR`ed) // kind if ( attrmatch.kindPredicate ) { _pimpl->_kinds.clear(); // an explicit kind overwrites any global one addKind( attrmatch.kindPredicate ); } // name addAttribute( SolvAttr::name, attrmatch.strMatcher.searchstring() ); // edition std::vector words; str::splitEscaped( attrmatch.predicateStr, std::back_inserter(words) ); if ( ! words.empty() ) { if ( words[0] == "EditionRange" || words[0] == "SolvableRange" ) { setEdition( Edition(words[2]), Rel(words[1]) ); } } // finally remove the complex lock _pimpl->_uncompiledPredicated.clear(); } } } return finded_something; } void PoolQuery::serialize( std::ostream &str, char delim ) const { //separating delim str << delim; //iterate thrue all settings and write it static const zypp::PoolQuery q; //not save default options, so create default query example for_( it, repos().begin(), repos().end() ) { str << "repo: " << *it << delim ; } for_( it, kinds().begin(), kinds().end() ) { str << PoolQueryAttr::kindAttr.asString() << ": " << it->idStr() << delim ; } if (editionRel() != Rel::ANY && edition() != Edition::noedition) str << PoolQueryAttr::editionAttr.asString() << ": " << editionRel() << " " << edition() << delim; if (matchMode()!=q.matchMode()) { switch( matchMode() ) { case Match::STRING: str << PoolQueryAttr::stringTypeAttr.asString() << ": exact" << delim; break; case Match::SUBSTRING: str << PoolQueryAttr::stringTypeAttr.asString() << ": substring" << delim; break; case Match::GLOB: str << PoolQueryAttr::stringTypeAttr.asString() << ": glob" << delim; break; case Match::REGEX: str << PoolQueryAttr::stringTypeAttr.asString() << ": regex" << delim; break; default: WAR << "unknown match type " << matchMode() << endl; } } if( caseSensitive() != q.caseSensitive() ) { str << "case_sensitive: "; if (caseSensitive()) { str << "on" << delim; } else { str << "off" << delim; } } if( statusFilterFlags() != q.statusFilterFlags() ) { switch( statusFilterFlags() ) { case ALL: str << "install_status: all" << delim; break; case INSTALLED_ONLY: str << "install_status: installed" << delim; break; case UNINSTALLED_ONLY: str << "install_status: not-installed" << delim; break; } } for_( it, strings().begin(), strings().end() ) { str << PoolQueryAttr::stringAttr.asString()<< ": " << *it << delim; } for_( it, attributes().begin(), attributes().end() ) { std::string s = it->first.asString(); str::replaceAll(s,":","_"); for_( it2,it->second.begin(),it->second.end() ) { str << s <<": "<< *it2 << delim; } } for_( it, _pimpl->_uncompiledPredicated.begin(), _pimpl->_uncompiledPredicated.end() ) { str << "complex: "<< it->serialize() << delim; } if ( const std::string & c { comment() }; not c.empty() ) str << PoolQueryAttr::commentAttr.asString() << ": " << c << delim ; //separating delim - protection str << delim; } std::string PoolQuery::asString() const { return _pimpl->asString(); } std::ostream & operator<<( std::ostream & str, const PoolQuery & obj ) { return str << obj.asString(); } std::ostream & dumpOn( std::ostream & str, const PoolQuery & obj ) { return dumpRange( str << obj, obj.begin(), obj.end() ); } bool PoolQuery::operator==( const PoolQuery & rhs ) const { return *_pimpl == *rhs._pimpl; } bool PoolQuery::operator<( const PoolQuery & rhs ) const { return *_pimpl < *rhs._pimpl; } /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolQueryMatcher // /** Store \ref PoolQuery settings and assist \ref PoolQueryIterator. * * Basically the matcher performs a base query, which should preselect * candidates for a match. And has some filter conditions on top of it. * Query and fileter depend on the \ref PoolQuery settings. * * Matcher must be stateless, as it is shared between multiple * \ref PoolQueryIterator instances. * * If \ref base_iterator is at the \ref end, \ref advance moves it * to the first match. Otherwise advance moves to the next match, or * to the \ref end, if there is no more match. * * \note The original implementation treated an empty search string as * "match always". We stay compatible. */ class PoolQueryMatcher { public: using base_iterator = sat::LookupAttr::iterator; public: const base_iterator & end() const { static base_iterator _end; return _end; } bool advance( base_iterator & base_r ) const { if ( base_r == end() ) base_r = startNewQyery(); // first candidate else { base_r.nextSkipSolvable(); // assert we don't visit this Solvable again ++base_r; // advance to next candidate } while ( base_r != end() ) { if ( isAMatch( base_r ) ) return true; // No match: try next ++base_r; } return false; } /** Provide all matching attributes within this solvable. * */ void matchDetail( const base_iterator & base_r, std::vector & return_r ) const { if ( base_r == end() ) return; sat::Solvable inSolvable( base_r.inSolvable() ); if ( _attrMatchList.size() == 1 ) { // base_r is already on the 1st matching attribute! // String matching is done by the base iterator. We must check the predicate here. // Let's see if there are more matches for this solvable: base_iterator base( base_r ); base.stayInThisSolvable(); // avoid discarding matches we found far away from here. return_r.push_back( base ); const AttrMatchData::Predicate & predicate( _attrMatchList.front().predicate ); for ( ++base; base.inSolvable() == inSolvable; ++base ) // safe even if base == end() { if ( ! predicate || predicate( base ) ) return_r.push_back( base ); } } else { // Here: search all attributes ;( for_( mi, _attrMatchList.begin(), _attrMatchList.end() ) { const AttrMatchData & matchData( *mi ); sat::LookupAttr q( matchData.attr, inSolvable ); if ( matchData.strMatcher ) // an empty searchstring matches always q.setStrMatcher( matchData.strMatcher ); if ( ! q.empty() ) // there are matches. { // now check any predicate: const AttrMatchData::Predicate & predicate( matchData.predicate ); for_( it, q.begin(), q.end() ) { if ( ! predicate || predicate( it ) ) return_r.push_back( it ); } } } } } public: PoolQueryMatcher(const PoolQueryMatcher &) = default; PoolQueryMatcher(PoolQueryMatcher &&) = default; PoolQueryMatcher &operator=(const PoolQueryMatcher &) = default; PoolQueryMatcher &operator=(PoolQueryMatcher &&) = default; /** Ctor stores the \ref PoolQuery settings. * \throw MatchException Any of the exceptions thrown by \ref PoolQuery::Impl::compile. */ PoolQueryMatcher( const shared_ptr & query_r ) { query_r->compile(); // Repo restriction: sat::Pool satpool( sat::Pool::instance() ); for_( it, query_r->_repos.begin(), query_r->_repos.end() ) { Repository r( satpool.reposFind( *it ) ); if ( r ) _repos.insert( r ); else _neverMatchRepo = true; } // _neverMatchRepo: we just need to catch the case that no repo // matched, so we'd interpret the empty list as 'take from all' if ( _neverMatchRepo && ! _repos.empty() ) _neverMatchRepo = false; // Kind restriction: _kinds = query_r->_kinds; // Edition restriction: _op = query_r->_op; _edition = query_r->_edition; // Status restriction: _status_flags = query_r->_status_flags; // StrMatcher _attrMatchList = query_r->_attrMatchList; } ~PoolQueryMatcher() {} private: /** Initialize a new base query. */ base_iterator startNewQyery() const { sat::LookupAttr q; if ( _neverMatchRepo ) return q.end(); // Repo restriction: if ( _repos.size() == 1 ) q.setRepo( *_repos.begin() ); // else: handled in isAMatch. // Attribute restriction: if ( _attrMatchList.size() == 1 ) // all (SolvAttr::allAttr) or 1 attr { const AttrMatchData & matchData( _attrMatchList.front() ); q.setAttr( matchData.attr ); if ( matchData.strMatcher ) // empty searchstring matches always q.setStrMatcher( matchData.strMatcher ); } else // more than 1 attr (but not all) { // no restriction, it's all handled in isAMatch. q.setAttr( sat::SolvAttr::allAttr ); } return q.begin(); } /** Check whether we are on a match. * * The check covers the whole Solvable, not just the current * attribute \c base_r points to. If there's no match, also * prepare \c base_r to advance appropriately. If there is * a match, simply return \c true. \ref advance always moves * to the next Solvable if there was a match. * * \note: Caller asserts we're not at \ref end. */ bool isAMatch( base_iterator & base_r ) const { ///////////////////////////////////////////////////////////////////// Repository inRepo( base_r.inRepo() ); // Status restriction: if ( _status_flags && ( (_status_flags == PoolQuery::INSTALLED_ONLY) != inRepo.isSystemRepo() ) ) { base_r.nextSkipRepo(); return false; } // Repo restriction: if ( _repos.size() > 1 && _repos.find( inRepo ) == _repos.end() ) { base_r.nextSkipRepo(); return false; } ///////////////////////////////////////////////////////////////////// sat::Solvable inSolvable( base_r.inSolvable() ); // Edition restriction: if ( _op != Rel::ANY && !compareByRel( _op, inSolvable.edition(), _edition, Edition::Match() ) ) { base_r.nextSkipSolvable(); return false; } // Kind restriction: // Delay the decision to nextSkipSolvable and return false, as there may be // some explicit kind:name predicate which overrules the global kinds. bool globalKindOk =( _kinds.empty() || inSolvable.isKind( _kinds.begin(), _kinds.end() ) ); ///////////////////////////////////////////////////////////////////// // string and predicate matching: if ( _attrMatchList.size() == 1 ) { // String matching was done by the base iterator. // Now check any predicate: const AttrMatchData & matchData( _attrMatchList.front() ); if ( matchData.kindPredicate ) { if ( matchData.kindPredicate != inSolvable.kind() ) { base_r.nextSkipSolvable(); // this matchData will never match in this solvable return false; } } else if ( !globalKindOk ) return false; // only matching kindPredicate could overwrite this if ( !matchData.predicate || matchData.predicate( base_r ) ) return true; return false; // no skip as there may be more occurrences in this solvable of this attr. } // Here: search all attributes ;( for_( mi, _attrMatchList.begin(), _attrMatchList.end() ) { const AttrMatchData & matchData( *mi ); if ( matchData.kindPredicate ) { if ( matchData.kindPredicate != inSolvable.kind() ) continue; // this matchData does not apply } else if ( !globalKindOk ) continue; // only matching kindPredicate could overwrite this sat::LookupAttr q( matchData.attr, inSolvable ); if ( matchData.strMatcher ) // an empty searchstring matches always q.setStrMatcher( matchData.strMatcher ); if ( ! q.empty() ) // there are matches. { // now check any predicate: const AttrMatchData::Predicate & predicate( matchData.predicate ); if ( predicate ) { for_( it, q.begin(), q.end() ) { if ( predicate( it ) ) return true; } } else return true; } } base_r.nextSkipSolvable(); return false; } private: /** Repositories include in the search. */ std::set _repos; DefaultIntegral _neverMatchRepo; /** Resolvable kinds to include. */ std::set _kinds; /** Edition filter. */ Rel _op; Edition _edition; /** Installed status filter flags. \see PoolQuery::StatusFilter */ int _status_flags; /** StrMatcher per attribtue. */ AttrMatchList _attrMatchList; }; /////////////////////////////////////////////////////////////////// void PoolQueryIterator::increment() { // matcher restarts if at end! It is called from the ctor // to get the 1st match. But if the end is reached, it should // be deleted, otherwise we'd start over again. if ( !_matcher ) return; // at end if ( _matches ) _matches.reset(); // invalidate old matches if ( ! _matcher->advance( base_reference() ) ) _matcher.reset(); } const PoolQueryIterator::Matches & PoolQueryIterator::matches() const { if ( _matches ) return *_matches; if ( !_matcher ) { // at end of query: static const Matches _none; return _none; } _matches.reset( new Matches ); _matcher->matchDetail( base_reference(), *_matches ); return *_matches; } std::ostream & dumpOn( std::ostream & str, const PoolQueryIterator & obj ) { str << *obj; if ( ! obj.matchesEmpty() ) { for_( it, obj.matchesBegin(), obj.matchesEnd() ) { str << endl << " " << it->inSolvAttr() << "\t" << it->asString(); } } return str; } /////////////////////////////////////////////////////////////////// } //namespace detail /////////////////////////////////////////////////////////////////// detail::PoolQueryIterator PoolQuery::begin() const { return shared_ptr( new detail::PoolQueryMatcher( _pimpl.getPtr() ) ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PoolQuery.h000066400000000000000000000561441476576476200165420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolQuery.h * */ #ifndef ZYPP_POOLQUERY_H #define ZYPP_POOLQUERY_H #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace detail { class PoolQueryIterator; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolQuery // /** * Meta-data query API. Returns solvables of specified kinds from specified * repositories with attributes matching the specified search strings. * * The search strings can be specified via \ref addString() and * \ref addAttribute() methods. String matching type can be set using the * setMatch*() methods. Multiple search strings for a particular attribute * will be combined into a regex (see \ref addString() and * \ref addAttribute() for more details). * * The begin() and end() methods return a PoolQueryIterator returning * \ref sat::Solvable objects which can easily be turned into \ref Resolvable * objects. Additionally, thanx to the \ref sat::SolvIterMixin, a Selectable * and PoolItem iterators are automatically available. * * \note You will sometimes face the problem, that when using the \ref PoolItem * iterator you hit multiple version of the same package, while when using the * \ref ui::Selectable iterator the information which of the available candidates * actually matched got lost. In this case class \ref PoolItemBest may help you. * Use it to pick the best version only. * * * PoolQuery q; * q.addAttribute(sat::SolvAttr::name, "zypp*"); * q.addKind(ResKind::package); * q.setMatchGlob(); * * for (PoolQuery::Selectable_iterator it = q.selectableBegin(); * it != q.selectableEnd(); ++it) * { * ui::Selectable::constPtr s = *it; * // ... * } * * * Performance considerations * * Results of simple queries like those using one string and/or one attribute * and/or one repository are filtered by sat-solver's Dataiterator directly, * and thus it is fast. * * Queries with multiple strings are implemented using regexes. Queries based * on kinds, multiple repos, and multiple attributes are filtered inside * the PoolQuery, so these tend to be slower. * * \see detail::PoolQueryIterator on how to inspect matches in detail. * \see tests/zypp/PoolQuery_test.cc for more examples * \see sat::SolvIterMixin */ class ZYPP_API PoolQuery : public sat::SolvIterMixin { public: using Kinds = std::set; using StrContainer = std::set; using AttrRawStrMap = std::map; using const_iterator = detail::PoolQueryIterator; using size_type = unsigned int; public: using ProcessResolvable = function; PoolQuery(); ~PoolQuery(); /** Query result accessers. */ //@{ /** * Compile the query and return an iterator to the result. * * \return An iterator (\ref detail::PoolQueryIterator) returning * sat::Solvable objects pointing at the beginning of the query result. * \throws sat::MatchInvalidRegexException if the query was about to use a regex which * failed to compile. * * \note Note that PoolQuery is derived from \ref sat::SolvIterMixin which * makes PoolItem and Selectable iterators automatically available. * \see \ref sat::SolvIterMixin */ const_iterator begin() const; /** An iterator pointing to the end of the query result. */ const_iterator end() const; /** Whether the result is empty. */ bool empty() const; /** Number of solvables in the query result. */ size_type size() const; //@} /** * Executes the query with the current settings. * Results are yielded via the \a fnc callback. */ void execute(ProcessResolvable fnc); /** * Filter by selectable kind. * * By default, all kinds will be returned. If addKind() is used, * only the specified kinds will be returned (multiple kinds will be ORed). * * \note This kind filter does not apply if you explicitly specify a ResKind * when searching for \c sat::SolvAttr::name. The following will always match * and include the kernel \c packages, no matter which kind filter is set. * \code * addDependency( sat::SolvAttr::name, "package:kernel" ); * \endcode * * Pass ResKind constants to this method, (e.g. ResKind::package). */ void addKind(const ResKind & kind); /** * Filter by repo. * * By default, all repos will be returned. If addRepo() is used, * only the specified repo will be returned (multiple repos will be ORed). */ void addRepo(const std::string &repoalias); /** Set an optional comment string describing the purpose of the query. * Stored and retrieved when serializing the query. E.g. as lock. */ void setComment(const std::string & comment) const; /** Installed status filter setters. */ //@{ /** * Filter by status (installed uninstalled) */ enum StatusFilter { ALL = 0, // both install filter and uninstall filter bits are 0 INSTALLED_ONLY = 1, UNINSTALLED_ONLY = 2 }; /** Return only @System repo packages */ void setInstalledOnly(); /** Return only packages from repos other than @System. */ void setUninstalledOnly(); /** Set status filter directly \see StatusFilter */ void setStatusFilterFlags( StatusFilter flags ); //@} /** * Add a global query string. The string added via this method is applied * to all query attributes as if addAttribute(..., \value) was called * for all of them. * * This method can be used multiple times in which case the query strings * will be combined (together with strings added via addAttribute()) into * a regex. Searched attribute value will match this regex if any * of these strings will match the value. */ void addString(const std::string & value); /** * Filter by the \a value of the specified \a attr attribute. This can * be any of the available solvable attributes. * * This method can be used multiple times with the same \a attr in which * case the query strings will be combined (together with strings added * via addString()) into a regex. Searched attribute value will match * this regex if any of these strings will match the value. * * \note Though it is possible to use dependency attributes like * \ref Solv::Attr::provides here, note that the query string is * matched against a dependencies \c "name" part only. Any * "op edition" part of a \ref Capability is \b not * considered at all. \see \ref addDependency on how to query for * capabilities including edition ranges. * * \note Solvables of a kind not supporting the specified attribute will * not be returned. * \todo check the above * * \param attr Attribute identfier. Use sat::Solvattr::* constants * \param value What to search for. * * \see sat::SolvAttr */ void addAttribute( const sat::SolvAttr & attr, const std::string & value = "" ); /** \name Filter by dependencies matching a broken down capability name [op edition] and/or architecture. * * The capabilities \c name part may be defined as query string * like with \ref addAttribute. Globing and regex are supported. * Global query strings defined by \ref addString are considered. * * So without any op edition arch addDependency behaves the * same as \ref addAttribute. If an edition range is given, matches * are restricted accordingly. There are various overloads, so pick * the one you like best. * * An optional \c arch argument will additionally require the matching * solvable to be of this arch. * * \code * { * setMatchGlob(); * setCaseSensitive( false ); * addDependency( sat::SolvAttr::provides, "kde*", Rel::EQ, Edition("2.0") ); * addDependency( sat::SolvAttr::provides, "kde*", Edition("2.0") ); // same as above * } * { * setMatchGlob(); * setCaseSensitive( false ); * addString( "kde*" ); * addDependency( sat::SolvAttr::provides, Rel::EQ, Edition("2.0") );// same as above * addDependency( sat::SolvAttr::provides, Edition("2.0") ); // same as above * } * \endcode * * \note Thre's also a version of \ref addDependency provided, that takes a * complete \ref Capability as argument. This always requires an exact match * of the name part (as the resolver would do it). * * This is the list of valid dependency attributes: * \code * SolvAttr::provides * SolvAttr::obsoletes * SolvAttr::conflicts * SolvAttr::requires * SolvAttr::recommends * SolvAttr::suggests * SolvAttr::supplements * SolvAttr::enhances * \endcode * * \note What happens if a non dependency attribute is passed?<\b> * If an edition range is given, it is matched against the matching * solvables edition instead. Without edition range it behaves the * same as \ref addAttribute. * * \code * // Find all packages providing "kernel > 2.0" * addDependency( sat::SolvAttr::provides, "kernel", Rel::GT, Edition("2.0") ); * * // // Find all packages named "kernel" and with edition "> 2.0" * addDependency( sat::SolvAttr::name, "kernel", Rel::GT, Edition("2.0") ); * \endcode */ //@{ /** Query "name|global op edition". */ void addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition ); /** \overload also restricting architecture */ void addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition, const Arch & arch ); /** \overload also use an individual Match::Mode for the \a name */ void addDependency( const sat::SolvAttr & attr, const std::string & name, const Rel & op, const Edition & edition, const Arch & arch, Match::Mode mode ); /** \overload Query "name|global == edition". */ void addDependency( const sat::SolvAttr & attr, const std::string & name, const Edition & edition ) { addDependency( attr, name, Rel::EQ, edition ); } /** \overload also restricting architecture */ void addDependency( const sat::SolvAttr & attr, const std::string & name, const Edition & edition, const Arch & arch ) { addDependency( attr, name, Rel::EQ, edition, arch ); } /** \overload Query "name|global". */ void addDependency( const sat::SolvAttr & attr, const std::string & name ) { addDependency( attr, name, Rel::ANY, Edition() ); } /** \overload also restricting architecture */ void addDependency( const sat::SolvAttr & attr, const std::string & name, const Arch & arch ) { addDependency( attr, name, Rel::ANY, Edition(), arch ); } /** \overload Query "global op edition".*/ void addDependency( const sat::SolvAttr & attr, const Rel & op, const Edition & edition ) { addDependency( attr, std::string(), op, edition ); } /** \overload also restricting architecture */ void addDependency( const sat::SolvAttr & attr, const Rel & op, const Edition & edition, const Arch & arch ) { addDependency( attr, std::string(), op, edition, arch ); } /** \overload Query "global == edition". */ void addDependency( const sat::SolvAttr & attr, const Edition & edition ) { addDependency( attr, std::string(), Rel::EQ, edition ); } /** \overload also restricting architecture */ void addDependency( const sat::SolvAttr & attr, const Edition & edition, const Arch & arch ) { addDependency( attr, std::string(), Rel::EQ, edition, arch ); } /** \overload Query "global". */ void addDependency( const sat::SolvAttr & attr ) { addDependency( attr, std::string(), Rel::ANY, Edition() ); } /** \overload also restricting architecture */ void addDependency( const sat::SolvAttr & attr, const Arch & arch ) { addDependency( attr, std::string(), Rel::ANY, Edition(), arch ); } /** \overload Query taking a \ref Capability (always exact name match). * \note If a non dependency attribute is passed, the \ref Capability * will always be matched against the Solvables \c name and \c edition. */ void addDependency( const sat::SolvAttr & attr, Capability cap_r ); //@} /** * Set version condition. This will filter out solvables not matching * solvableEdition \a op \a edition. * * \param edition Edition to look for. * \param op Found-wanted relation operator. */ void setEdition(const Edition & edition, const Rel & op = Rel::EQ); /** \name Text Matching Options * \note The implementation treats an empty search string as * "match always". So if you want to actually match * an empty value, try ( "^$", setMatchRegex ). */ //@{ /** * Turn case sentitivity on or off (unsets or sets \ref SEARCH_NOCASE flag). * PoolQuery defaults to case insensitive search unless this method * is used. * * \param value Whether to turn the case sensitivity on (default) or off. */ void setCaseSensitive( bool value = true ); /** * If set (default), look at the full path when searching in filelists. * Otherwise just match the the basenames. * \see \ref Match::FILES */ void setFilesMatchFullPath( bool value = true ); /** \overload */ void setFilesMatchBasename( bool value = true ) { setFilesMatchFullPath( !value ); } /** Set to match exact string instead of substring.*/ void setMatchExact(); /** Set to substring (the default). */ void setMatchSubstring(); /** Set to match globs. */ void setMatchGlob(); /** Set to use the query strings as regexes */ void setMatchRegex(); /** Set substring to match words */ void setMatchWord(); //void setLocale(const Locale & locale); //@} /** \name getters */ //@{ /** Search strings added via addString() */ const StrContainer & strings() const; /** * Map (map) of attribute values added via * addAttribute(), addDep in string form */ const AttrRawStrMap & attributes() const; const StrContainer & attribute(const sat::SolvAttr & attr) const; const Kinds & kinds() const; const StrContainer & repos() const; const std::string & comment() const; const Edition edition() const; const Rel editionRel() const; /** * returns true if search is case sensitive */ bool caseSensitive() const; /** Whether searching in filelists looks at the full path or just at the basenames. */ bool filesMatchFullPath() const; /** \overload */ bool filesMatchBasename() const { return !filesMatchFullPath(); } bool matchExact() const; bool matchSubstring() const; bool matchGlob() const; bool matchRegex() const; bool matchWord() const; /** Returns string matching mode as enum. * \see \ref Match::Mode */ Match::Mode matchMode() const { return flags().mode(); } StatusFilter statusFilterFlags() const; //@} /** * Reads from stream query. Attributes is sepated by delim. Query is * separated by two delim. * * \param str input stream which contains query * \param delim delimeter for attributes * \return true if non-empty query is recovered * * \see readPoolQueriesFromFile */ bool recover( std::istream &str, char delim = '\n' ); /** * Writes a machine-readable string representation of the query to stream. * Use \a delim as attribute delimiter. * * \param str output stream to write to * \param delim delimiter for attributes * * \see writePoolQueriesToFile */ void serialize( std::ostream &str, char delim = '\n' ) const; /** Return a human-readable description of the query */ std::string asString() const; bool operator<(const PoolQuery& b) const; bool operator==(const PoolQuery& b) const; bool operator!=(const PoolQuery& b) const { return !(*this == b ); } // low level API /** * Free function to get libsolv repo search * flags. * * \see \ref Match */ Match flags() const; /** * Free function to set libsolv repo search * flags. * * \see \ref Match */ void setFlags( const Match & flags ); public: /** \deprecated Attribute was defined but never implemented/used. Will be removed in future versions. */ void setRequireAll( bool require_all = true ) ZYPP_DEPRECATED; /** \deprecated Attribute was defined but never implemented/used. Will be removed in future versions. */ bool requireAll() const ZYPP_DEPRECATED; public: class Impl; private: /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates PoolQuery Stream output. */ std::ostream & operator<<( std::ostream & str, const PoolQuery & obj ) ZYPP_API; /** \relates PoolQuery Detailed stream output. */ std::ostream & dumpOn( std::ostream & str, const PoolQuery & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// class PoolQueryMatcher; /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolQuery::PoolQueryIterator // /** \ref PoolQuery iterator as returned by \ref PoolQuery::begin. * * The \ref PoolQueryIterator visits sat::Solavables that do contain matches. * * But it also provides an iterator by itself, to allow a detailed inspection of * the individual attribute matches within the current Solvable. */ class ZYPP_API PoolQueryIterator : public boost::iterator_adaptor< PoolQueryIterator // Derived , sat::LookupAttr::iterator // Base , const sat::Solvable // Value , boost::forward_traversal_tag // CategoryOrTraversal , const sat::Solvable // Reference > { using Matches = std::vector; public: using size_type = Matches::size_type; using matches_iterator = Matches::const_iterator; public: /** Default ctor is also \c end.*/ PoolQueryIterator() {} /** \Ref PoolQuery ctor. */ PoolQueryIterator( const shared_ptr & matcher_r ) : _matcher( matcher_r ) { increment(); } /** \name Detailed inspection of attribute matches within the current Solvable. * * The \ref matches_iterator visits all attribute matches within the current Solvable, * providing a \ref sat::LookupAttr::iterator pointing to attribute. While a * \ref matches_iterator itself becomes invalid if the PoolQueryIterator is advanced, * the \ref sat::LookupAttr::iterator it pointed to stays valid, even after the query * ended. * * \code * // Setup query for "libzypp" in name or requires: * PoolQuery q; * q.addString( "libzypp" ); * q.setMatchSubstring(); * q.setCaseSensitive( false ); * q.addAttribute( sat::SolvAttr::name ); * q.addDependency( sat::SolvAttr::requires ); * * // Iterate the result: * for_( solvIter, q.begin(), q.end() ) * { * sat::Solvable solvable( *solvIter ); * cout << "Found matches in " << solvable << endl; * if ( verbose ) * for_( attrIter, solvIter.matchesBegin(), solvIter.matchesEnd() ) * { * sat::LookupAttr::iterator attr( *attrIter ); * cout << " " << attr.inSolvAttr() << "\t\"" << attr.asString() << "\"" << endl; * } * } * * * Found matches in PackageKit-0.3.11-1.12.i586(@System) * solvable:requires "libzypp.so.523" * Found matches in libqdialogsolver1-1.2.6-1.1.2.i586(@System) * solvable:requires "libzypp.so.523" * solvable:requires "libzypp >= 5.25.3-0.1.2" * Found matches in libzypp-5.30.3-0.1.1.i586(@System) * solvable:name "libzypp" * Found matches in libzypp-testsuite-tools-4.2.6-8.1.i586(@System) * solvable:name "libzypp-testsuite-tools" * solvable:requires "libzypp.so.523" * ... * \endcode */ //@{ /** \c False unless this is the \c end iterator. */ bool matchesEmpty() const { return ! _matcher; } /** Number of attribute matches. */ size_type matchesSize() const { return matches().size(); } /** Begin of matches. */ matches_iterator matchesBegin() const { return matches().begin(); } /** End of matches. */ matches_iterator matchesEnd() const { return matches().end(); } //@} private: friend class boost::iterator_core_access; sat::Solvable dereference() const { return base_reference().inSolvable(); } void increment(); private: const Matches & matches() const; private: shared_ptr _matcher; mutable shared_ptr _matches; }; /////////////////////////////////////////////////////////////////// /** \relates PoolQueryIterator Stream output. */ inline std::ostream & operator<<( std::ostream & str, const PoolQueryIterator & obj ) { return str << obj.base(); } /** \relates PoolQueryIterator Detailed stream output. */ std::ostream & dumpOn( std::ostream & str, const PoolQueryIterator & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// } //namespace detail /////////////////////////////////////////////////////////////////// inline detail::PoolQueryIterator PoolQuery::end() const { return detail::PoolQueryIterator(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOLQUERY_H libzypp-17.36.5/zypp/PoolQueryResult.cc000066400000000000000000000024571476576476200200750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolQueryResult.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const PoolQueryResult & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/PoolQueryResult.h000066400000000000000000000170031476576476200177300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolQueryResult.h * */ #ifndef ZYPP_POOLQUERYRESULT_H #define ZYPP_POOLQUERYRESULT_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolQueryResult // /** Helper class to collect (not only) \ref PoolQuery results. * * \note Unfortunately \ref PoolQuery::begin might throw. Exceptions * are caught and the query is treated as empty. * * \ref PoolQueryResult maintains a set of \ref sat::Solvable. You can * add/remove solvables to/from the set defined by: * * \li a single \ref sat::Solvable * \li a single \ref PoolItem * \li a \ref PoolQuery * \li an other \ref PoolQueryResult * \li any iterator pair with \c value_type \ref sat::Solvable * or \ref PoolItem or \ref PoolQuery or any type that fits * \c operator+=. * * The class is a \ref sat::SolvIterMixin, so you can iterate the result * not just as \ref sat::Solvable, but also as \ref PoolItem or * \ref ui::Selectable. * * \code * // Constructed from PoolItem iterator pair * PoolQueryResult result( pool.byKindBegin(), pool.byKindEnd() ); * MIL << result.size() << endl; * * { * // Removing a PoolQuery result * PoolQuery q; * q.addAttribute( sat::SolvAttr::name, "[a-zA-Z]*" ); * q.setMatchGlob(); * result -= q; * MIL << result.size() << endl; * } * MIL << result << endl; * * // Removing a range of sat::Solvables * sat::WhatProvides poviders( Capability("3ddiag") ); * result -= PoolQueryResult( poviders.begin(), poviders.end() ); * * // packages not starting with a letter, except 3ddiag * MIL << result << endl; * \endcode */ class PoolQueryResult : public sat::SolvIterMixin::const_iterator> { public: using ResultSet = std::unordered_set; using size_type = ResultSet::size_type; using const_iterator = ResultSet::const_iterator; public: /** Default ctor (empty result) */ PoolQueryResult() {} /** Ctor adding one \ref sat::Solvable. */ explicit PoolQueryResult( sat::Solvable result_r ) { operator+=( result_r ); } /** Ctor adding one \ref PoolItem. */ explicit PoolQueryResult( const PoolItem & result_r ) { operator+=( result_r ); } /** Ctor adding one \ref PoolQuery result. */ explicit PoolQueryResult( const PoolQuery & query_r ) { operator+=( query_r ); } /** Ctor adding a range of items for which \ref operator+= is defined. */ template PoolQueryResult( TQueryResultIter begin_r, TQueryResultIter end_r ) { for_( it, begin_r, end_r ) { operator+=( *it ); } } public: /** Whether the result is empty. */ bool empty() const { return _result.empty(); } /** The number of \ref sat::Solvables. */ size_type size() const { return _result.size(); } /** */ const_iterator begin() const { return _result.begin(); } /** */ const_iterator end() const { return _result.end(); } /** Test whether some item is in the result set. */ bool contains(sat::Solvable result_r ) const { return( _result.find( result_r ) != _result.end() ); } /** \overload */ bool contains( const PoolItem & result_r ) const { return contains( result_r.satSolvable() ); } public: /** Clear the result. */ void clear() { _result.clear(); } /** Add items to the result. */ PoolQueryResult & operator+=( const PoolQueryResult & query_r ) { if ( ! query_r.empty() ) _result.insert( query_r.begin(), query_r.end() ); return *this; } /** \overload */ PoolQueryResult & operator+=( const PoolQuery & query_r ) { try { for_( it, query_r.begin(), query_r.end() ) _result.insert( *it ); } catch ( const Exception & ) {} return *this; } /** \overload */ PoolQueryResult & operator+=( sat::Solvable result_r ) { _result.insert( result_r ); return *this; } /** \overload */ PoolQueryResult & operator+=( const PoolItem & result_r ) { _result.insert( result_r.satSolvable() ); return *this; } /** Remove Items from the result. */ PoolQueryResult & operator-=( const PoolQueryResult & query_r ) { if ( &query_r == this ) // catch self removal! clear(); else for_( it, query_r.begin(), query_r.end() ) _result.erase( *it ); return *this; } /** \overload */ PoolQueryResult & operator-=( const PoolQuery & query_r ) { try { for_( it, query_r.begin(), query_r.end() ) _result.erase( *it ); } catch ( const Exception & ) {} return *this; } /** \overload */ PoolQueryResult & operator-=( sat::Solvable result_r ) { _result.erase( result_r ); return *this; } /** \overload */ PoolQueryResult & operator-=( const PoolItem & result_r ) { _result.erase( result_r.satSolvable() ); return *this; } public: /** Combine results. */ PoolQueryResult operator+( const PoolQueryResult & query_r ) const { return PoolQueryResult(*this) += query_r; } /** \overload */ PoolQueryResult operator+( const PoolQuery & query_r ) const { return PoolQueryResult(*this) += query_r; } /** \overload */ PoolQueryResult operator+( sat::Solvable result_r ) const { return PoolQueryResult(*this) += result_r; } /** Intersect results. */ PoolQueryResult operator-( const PoolQueryResult & query_r ) const { return PoolQueryResult(*this) -= query_r; } /** \overload */ PoolQueryResult operator-( const PoolQuery & query_r ) const { return PoolQueryResult(*this) -= query_r; } /** \overload */ PoolQueryResult operator-( sat::Solvable result_r ) const { return PoolQueryResult(*this) -= result_r; } private: ResultSet _result; }; /////////////////////////////////////////////////////////////////// /** \relates PoolQueryResult Stream output */ std::ostream & operator<<( std::ostream & str, const PoolQueryResult & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOLQUERYRESULT_H libzypp-17.36.5/zypp/PoolQueryUtil.tcc000066400000000000000000000041061476576476200177110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PoolQueryUtil.tcc * * including fstream is not hell here because this header only included * by implementation file, header doesn't need include it. */ #ifndef ZYPP_POOLQUERYUTIL_TCC #define ZYPP_POOLQUERYUTIL_TCC #include #include #include #include namespace zypp { /** * sends to output iterator all queries readed from file. * * \code * list s; * insert_iterator > ii(s, s.end()); * readPoolQueriesFromStream(f,ii); * \endcode */ template void readPoolQueriesFromFile(const zypp::filesystem::Pathname &file, OutputIterator out ) { bool found = false; std::ifstream fin( file.c_str() ); if (!fin) ZYPP_THROW(Exception(str::form("Cannot open file %s",file.c_str()))); do { zypp::PoolQuery q; found = q.recover( fin ); if (found) *out++ = q; } while ( found ); fin.close(); } /** * Writes all queries from begin to end. */ template void writePoolQueriesToFile(const zypp::filesystem::Pathname &file, InputIterator begin, InputIterator end ) { std::ofstream fout( file.c_str(), std::ios_base::out | std::ios_base::trunc ); if (!fout) ZYPP_THROW(Exception(str::form("Cannot open file %s",file.c_str()))); for_( it, begin, end ) { it->serialize( fout ); } fout.close(); } } #endif // ZYPP_POOLQUERYUTIL_H libzypp-17.36.5/zypp/ProblemSolution.cc000066400000000000000000000121641476576476200200700ustar00rootroot00000000000000 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* ProblemSolution.cc * * Easy-to use interface to the ZYPP dependency resolver * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { IMPL_PTR_TYPE(ProblemSolution); /////////////////////////////////////////////////////////////////// /// \class ProblemSolution::Impl /// \brief ProblemSolution implementation. /////////////////////////////////////////////////////////////////// struct ProblemSolution::Impl { Impl() {} Impl( std::string && description ) : _description( std::move(description) ) {} Impl( std::string && description, std::string && details ) : _description( std::move(description) ) , _details( std::move(details) ) {} std::string _description; std::string _details; SolutionActionList _actions; std::set collectActionItems() const { std::set ret; for ( const auto & aptr : _actions ) ret.insert( aptr->item() ); return ret; } template bool allActionsMatch( Predicate && predicate ) const { if ( _actions.empty() ) return false; for ( const auto & aptr : _actions ) if ( not std::invoke( std::forward(predicate), aptr ) ) return false; return true; } private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// ProblemSolution::ProblemSolution() : _pimpl( new Impl() ) {} ProblemSolution::ProblemSolution( std::string description ) : _pimpl( new Impl( std::move(description) ) ) {} ProblemSolution::ProblemSolution( std::string description, std::string details ) : _pimpl( new Impl( std::move(description), std::move(details) ) ) {} ProblemSolution::~ProblemSolution() {} const std::string & ProblemSolution::description() const { return _pimpl->_description; } const std::string & ProblemSolution::details() const { return _pimpl->_details; } const ProblemSolution::SolutionActionList & ProblemSolution::actions() const { return _pimpl->_actions; } void ProblemSolution::setDescription( std::string description ) { _pimpl->_description = std::move(description); } void ProblemSolution::setDetails( const std::string& details ) { _pimpl->_details += "\n"; _pimpl->_details += details; } void ProblemSolution::pushDescriptionDetail( std::string description, bool front ) { if ( _pimpl->_details.empty() ) { if ( _pimpl->_description.empty() ) // first entry { _pimpl->_description = std::move(description); return; } else // second entry: form headline in _description { _pimpl->_description.swap( _pimpl->_details ); _pimpl->_description = _("Following actions will be done:"); } } if ( front ) { _pimpl->_details.swap( description ); } _pimpl->_details += "\n"; _pimpl->_details += description; } void ProblemSolution::addAction( const solver::detail::SolutionAction_Ptr& action ) { _pimpl->_actions.push_back( action ); } bool ProblemSolution::skipsPatchesOnly() const { return _pimpl->allActionsMatch( []( const SolutionAction_Ptr & aptr ) -> bool { return aptr->skipsPatchesOnly(); } ); } std::optional> ProblemSolution::getIfSkipsPatchesOnly() const { if ( not skipsPatchesOnly() ) return std::nullopt; return _pimpl->collectActionItems(); } std::ostream & operator<<( std::ostream & os, const ProblemSolution & obj ) { os << "Solution:" << endl; os << obj.description() << endl; if ( ! obj.details().empty() ) os << obj.details() << endl; os << obj.actions(); return os; } std::ostream & operator<<( std::ostream & os, const ProblemSolutionList & obj ) { for ( const auto & ptr: obj ) { os << ptr; } return os; } } // namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ProblemSolution.h000066400000000000000000000066521476576476200177370ustar00rootroot00000000000000/** * * Easy-to use interface to the ZYPP dependency resolver * * Author: Stefan Hundhammer * **/ #ifndef ZYPP_PROBLEMSOLUTION_H #define ZYPP_PROBLEMSOLUTION_H #include #include #include #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////////////// /// \class ProblemSolution /// \brief Class representing one possible solution to a problem found during resolving /// /// All problems should have at least 2-3 (mutually exclusive) solutions: /// /// - Undo: Do not perform the offending transaction /// (do not install the package that had unsatisfied requirements, /// do not remove the package that would break other packages' requirements) /// /// - Remove referrers: Remove all packages that would break because /// they depend on the package that is requested to be removed /// /// - Ignore: Inject artificial "provides" for a missing requirement /// (pretend that requirement is satisfied) ///////////////////////////////////////////////////////////////////////// class ZYPP_API ProblemSolution : public base::ReferenceCounted { public: using SolutionAction_Ptr = solver::detail::SolutionAction_Ptr; using SolutionActionList = solver::detail::SolutionActionList; /** Constructor. */ ProblemSolution(); /** Constructor. */ ProblemSolution( std::string description ); /** Constructor. */ ProblemSolution( std::string description, std::string details ); /** Destructor. */ ~ProblemSolution() override; /** * Return a one-line text description of this solution. **/ const std::string & description() const; /** * Return a (possibly multi-line) detailed description of this * solution or an empty string if there are no useful details. **/ const std::string & details() const; /** * Return the list of actions forming this solution. **/ const SolutionActionList & actions() const; /** * Set description of the solution. **/ void setDescription( std::string description ); /** * Set detail description of the solution. **/ void setDetails( const std::string& details ); /** * Collect multiple action descriptions in \ref details (NL separated) **/ void pushDescriptionDetail( std::string description, bool front = false ); /** * Add an action to the actions list. **/ void addAction( const SolutionAction_Ptr& action ); public: /** The solution contains only 'do not install patch:' actions. */ bool skipsPatchesOnly() const; #ifdef __cpp_lib_optional // YAST/PK explicitly use c++11 until 15-SP3 /** The patches if \ref skipsPatchesOnly is true. */ std::optional> getIfSkipsPatchesOnly() const; #endif private: struct Impl; RWCOW_pointer _pimpl; }; /** \relates ProblemSolution Stream output */ std::ostream& operator<<(std::ostream&, const ProblemSolution & obj ) ZYPP_API; /** \relates ProblemSolution Stream output */ std::ostream& operator<<(std::ostream&, const ProblemSolutionList & obj ) ZYPP_API; } // namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_PROBLEMSOLUTION_H libzypp-17.36.5/zypp/ProblemTypes.h000066400000000000000000000030721476576476200172200ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* Types.h * * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_PROBLEMTYPES_H #define ZYPP_PROBLEMTYPES_H #include #include #include #include #include #include #include #include #include #include // SolutionAction type ///////////////////////////////////////////////////////////////////////// namespace zypp { DEFINE_PTR_TYPE(Resolver); DEFINE_PTR_TYPE(ProblemSolution); using ProblemSolutionList = std::list; DEFINE_PTR_TYPE(ResolverProblem); using ResolverProblemList = std::list; } // namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_SOLVER_DETAIL_TYPES_H libzypp-17.36.5/zypp/Product.cc000066400000000000000000000232341476576476200163530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Product.cc * */ #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(Product); namespace { void fillList( std::list & ret_r, sat::Solvable solv_r, sat::SolvAttr attr_r ) { sat::LookupAttr query( std::move(attr_r), solv_r ); for_( it, query.begin(), query.end() ) { ret_r.push_back( it.asString() ); } } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Product::Product // METHOD TYPE : Ctor // Product::Product( const sat::Solvable & solvable_r ) : ResObject( solvable_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Product::~Product // METHOD TYPE : Dtor // Product::~Product() {} /////////////////////////////////////////////////////////////////// sat::Solvable Product::referencePackage() const { // Look for a provider of 'product(name) = version' of same // architecture and within the same repo. // // Code12: Update repos may have multiple release package versions // providing the same product. Prefer the one matching the buildtime, // as the product buildtime is derived from the -release package. Capability identCap( str::form( "product(%s) = %s", name().c_str(), edition().c_str() ) ); sat::Solvable found; bool foundBuildTime = false; sat::WhatProvides providers( identCap ); for_( it, providers.begin(), providers.end() ) { if ( it->repository() == repository() && it->arch() == arch() ) { bool fitsBuildtime = ( it->buildtime() == buildtime() ); if ( found ) { bool lowerEdition = ( it->edition() <= found.edition() ); if ( ( foundBuildTime && ( !fitsBuildtime || lowerEdition ) ) || ( !foundBuildTime && ( !fitsBuildtime && lowerEdition ) ) ) continue; } found = *it; if ( fitsBuildtime ) foundBuildTime = true; } } if ( ! found && isSystem() ) { // bnc#784900: for installed products check whether the file is owned by // some package. If so, ust this as buddy. sat::LookupAttr q( sat::SolvAttr::filelist, repository() ); std::string refFile( referenceFilename() ); // the basename only! if ( ! refFile.empty() ) { StrMatcher matcher( "/etc/products.d/"+refFile, Match::STRING | Match::FILES ); q.setStrMatcher( matcher ); if ( ! q.empty() ) found = q.begin().inSolvable(); } else INT << "Product referenceFilename unexpectedly empty!" << endl; } if ( ! found ) WAR << *this << ": no reference package found: " << identCap << endl; return found; } std::string Product::referenceFilename() const { return lookupStrAttribute( sat::SolvAttr::productReferenceFile ); } Product::ReplacedProducts Product::replacedProducts() const { std::vector ret; // By now we simply collect what is obsoleted by the Product, // or by the products buddy (release-package). // Check our own dependencies. We should not have any, // but just to be shure. sat::WhatObsoletes obsoleting( satSolvable() ); for_( it, obsoleting.begin(), obsoleting.end() ) { if ( it->isKind( ResKind::product ) ) ret.push_back( make( *it ) ); } // If we have a buddy, we check what product buddies the // buddy replaces. obsoleting = sat::WhatObsoletes( poolItem().buddy() ); for_( it, obsoleting.poolItemBegin(), obsoleting.poolItemEnd() ) { if ( (*it).buddy().isKind( ResKind::product ) ) ret.push_back( make( (*it).buddy() ) ); } return ret; } CapabilitySet Product::droplist() const { return poolItem().buddy().valuesOfNamespace( "weakremover" ); } std::string Product::productLine() const { return lookupStrAttribute( sat::SolvAttr::productProductLine ); } /////////////////////////////////////////////////////////////////// std::string Product::shortName() const { std::string ret( lookupStrAttribute( sat::SolvAttr::productShortlabel ) ); if ( ret.empty() ) ret = name(); return ret; } std::string Product::flavor() const { // Look for a provider of 'product_flavor(name) = version' // within the same repo. Unlike the reference package, we // can be relaxed and ignore the architecture. Capability identCap( str::form( "product_flavor(%s) = %s", name().c_str(), edition().c_str() ) ); sat::WhatProvides providers( identCap ); for_( it, providers.begin(), providers.end() ) { if ( it->repository() == repository() ) { // Got the package now try to get the provided 'flavor(...)' Capabilities provides( it->dep_provides() ); for_( cap, provides.begin(), provides.end() ) { std::string capstr( cap->asString() ); if ( str::hasPrefix( capstr, "flavor(" ) ) { capstr = str::stripPrefix( capstr, "flavor(" ); capstr.erase( capstr.size()-1 ); // trailing ')' return capstr; } } } } return std::string(); } std::string Product::type() const { return lookupStrAttribute( sat::SolvAttr::productType ); } std::list Product::flags() const { std::list ret; fillList( ret, satSolvable(), sat::SolvAttr::productFlags ); return ret; } Date Product::endOfLife() const { return Date( lookupNumAttribute( sat::SolvAttr::productEndOfLife ) );} bool Product::hasEndOfLife() const { return( lookupNumAttribute( sat::SolvAttr::productEndOfLife, -1 ) != (unsigned long long)(-1) ); } bool Product::hasEndOfLife( Date & value ) const { Date res( lookupNumAttribute( sat::SolvAttr::productEndOfLife, -1 ) ); if ( res == -1 ) return false; // else: value = res; return true; } std::vector Product::updateContentIdentifier() const { std::vector ret; sat::LookupAttr q( sat::SolvAttr::productUpdatesRepoid, sat::SolvAttr::productUpdates, *this ); if ( ! q.empty() ) { ret.reserve( 2 ); for_( it, q.begin(), q.end() ) ret.push_back( it.asString() ); } return ret; } bool Product::hasUpdateContentIdentifier( const Repository::ContentIdentifier & cident_r ) const { sat::LookupAttr q( sat::SolvAttr::productUpdatesRepoid, sat::SolvAttr::productUpdates, *this ); for_( it, q.begin(), q.end() ) { if ( it.asString() == cident_r ) return true; } return false; } bool Product::isTargetDistribution() const { return isSystem() && lookupStrAttribute( sat::SolvAttr::productType ) == "base"; } std::string Product::registerTarget() const { return lookupStrAttribute( sat::SolvAttr::productRegisterTarget ); } std::string Product::registerRelease() const { return lookupStrAttribute( sat::SolvAttr::productRegisterRelease ); } std::string Product::registerFlavor() const { return lookupStrAttribute( sat::SolvAttr::productRegisterFlavor ); } ///////////////////////////////////////////////////////////////// Product::UrlList Product::urls( const std::string & key_r ) const { UrlList ret; sat::LookupAttr url( sat::SolvAttr::productUrl, *this ); sat::LookupAttr url_type( sat::SolvAttr::productUrlType, *this ); sat::LookupAttr::iterator url_it(url.begin()); sat::LookupAttr::iterator url_type_it(url_type.begin()); for (;url_it != url.end(); ++url_it, ++url_type_it) { /* safety checks, shouldn't happen (tm) */ if (url_type_it == url_type.end()) { ERR << *this << " : The thing that should not happen, happened." << endl; break; } if ( url_type_it.asString() == key_r ) { ret._list.push_back(url_it.asString()); } } /* while (attribute array) */ return ret; } Product::UrlList Product::releaseNotesUrls() const { return urls( "releasenotes" ); } Product::UrlList Product::registerUrls() const { return urls( "register" ); } Product::UrlList Product::smoltUrls() const { return urls( "smolt" ); } Product::UrlList Product::updateUrls() const { return urls( "update" ); } Product::UrlList Product::extraUrls() const { return urls( "extra" ); } Product::UrlList Product::optionalUrls() const { return urls( "optional" ); } std::ostream & operator<<( std::ostream & str, const Product::UrlList & obj ) { return dumpRange( str << obj.key() << ' ', obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Product.h000066400000000000000000000176011476576476200162160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Product.h * */ #ifndef ZYPP_PRODUCT_H #define ZYPP_PRODUCT_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(Product); /////////////////////////////////////////////////////////////////// // // CLASS NAME : Product // /** Product interface. */ class ZYPP_API Product : public ResObject { public: using Self = Product; using TraitsType = ResTraits; using Ptr = TraitsType::PtrType; using constPtr = TraitsType::constPtrType; public: /** The reference package providing the product metadata, * if such a package exists. */ sat::Solvable referencePackage() const; /** For installed products the name of the corresponding * \c /etc/products.d entry. .*/ std::string referenceFilename() const; /** List of packages included in older versions of this product and now dropped. * * This evaluates the \ref referencePackage \c weakremover namespace. It actually * returns a \ref CapabilitySet, because we support to drop specific versions or * version ranges of a package. Use \ref sat::WhatProvides to get the actually * installed and available packages matching this list. * \code * const Product & openSUSE; * sat::WhatProvides dropped( openSUSE.droplist() ); * for_( it, dropped.poolItemBegin(), dropped.poolItemEnd() ) * { * if ( it->status().isInstalled() ) * { * MIL << "Installed but no longer supported package: " << *it << endl; * } * } * \endcode */ CapabilitySet droplist() const; public: /***/ using ReplacedProducts = std::vector; /** Array of \b installed Products that would be replaced by * installing this one. */ ReplacedProducts replacedProducts() const; /** Vendor specific string denoting the product line. */ std::string productLine() const; public: /** Untranslated short name like SLES 10 (fallback: name) */ std::string shortName() const; /** The product flavor (LiveCD Demo, FTP edition,...). */ std::string flavor() const; /** Get the product type * Well, in an ideal world there is only one base product. * It's the installed product denoted by a symlink in * \c /etc/products.d. */ std::string type() const; /** The product flags */ std::list flags() const; /** The date when this Product goes out of support as indicated by its medadata. * Use \ref hasEOfLife if it's important to distinguish whether the value * is not defined in the metadata, or defined but empty/invalid/TBD. */ Date endOfLife() const; /** Return whether an EndOfLife value is actually defined in the metadata. * A missing value (\c false) usually indicates that there will be no EOL, * while an empty/invalid value indicates that there will be an EOL date, * but it's not yet known (FATE#320699). */ bool hasEndOfLife() const; /** \overload additionally returning the date (0 if TBD) * false, ( unchanged ) : no EOL * true, ( 0 ) : EOL is still TBD * true, ( !=0 ) : a valid EOL date */ bool hasEndOfLife( Date & value ) const; /** ContentIdentifier of required update repositories. */ std::vector updateContentIdentifier() const; /** Whether \a cident_r is listed as required update repository. */ bool hasUpdateContentIdentifier( const Repository::ContentIdentifier & cident_r ) const; /** Whether one of the ContentIdentifier is listed as required update repository. */ template bool hasUpdateContentIdentifier( TIterator begin, TIterator end ) const { for_( it, begin, end ) if ( hasUpdateContentIdentifier( *it ) ) return true; return false; } public: /** This is the \b installed product that is also targeted by the * \c /etc/products.d/baseproduct symlink. */ bool isTargetDistribution() const; /** This is \c register.target attribute of a product. * Used for registration and filtering service repos. */ std::string registerTarget() const; /** This is \c register.release attribute of an \b installed product. * Used for registration. */ std::string registerRelease() const; /** This is \c register.flavor attribute of a product. * Used for registration. */ std::string registerFlavor() const; public: /***/ class UrlList; /** Retrieve URLs flagged with \c key_r for this product. * * This is the most common interface. There are convenience methods for * wellknown flags like \c "releasenotes", \c "register", \c "updateurls", * \c "extraurls", \c "optionalurls" and \c "smolt" below. */ UrlList urls( const std::string & key_r ) const; /** The URL to download the release notes for this product. */ UrlList releaseNotesUrls() const; /** The URL for registration. */ UrlList registerUrls() const; /** The URL for SMOLT \see http://smolts.org/wiki/Main_Page. */ UrlList smoltUrls() const; /** * Online updates for the product. * They are complementary, not alternatives. #163192 */ UrlList updateUrls() const; /** * Additional software for the product * They are complementary, not alternatives. */ UrlList extraUrls() const; /** * Optional software for the product. * (for example. Non OSS repositories) * They are complementary, not alternatives. */ UrlList optionalUrls() const; protected: friend Ptr make( const sat::Solvable & solvable_r ); /** Ctor */ Product( const sat::Solvable & solvable_r ); /** Dtor */ ~Product() override; }; /** Helper to iterate a products URL lists. * \ref first is a convenience for 'lists' with just * one entry (e.g. releaseNotesUrls) */ class Product::UrlList { private: /** \todo Change to directly iterate the .solv */ using ListType = std::list; public: using value_type = ListType::value_type; using size_type = ListType::size_type; using const_iterator = ListType::const_iterator; bool empty() const { return _list.empty(); } size_type size() const { return _list.size(); } const_iterator begin() const { return _list.begin(); } const_iterator end() const { return _list.end(); } /** The first Url or an empty Url. */ Url first() const { return empty() ? value_type() : _list.front(); } public: /** The key used to retrieve this list (for debug) */ std::string key() const { return _key; } private: friend class Product; /** Change to directly iterate the .solv */ std::string _key; ListType _list; }; /** \relates Product::UrlList Stream output. */ std::ostream & operator<<( std::ostream & str, const Product::UrlList & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PRODUCT_H libzypp-17.36.5/zypp/ProgressData.h000066400000000000000000000000451476576476200171660ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/ProvideFilePolicy.cc000066400000000000000000000024151476576476200203210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ProvideFilePolicy // /////////////////////////////////////////////////////////////////// bool ProvideFilePolicy::progress( int value ) const { if ( _progressCB ) return _progressCB( value ); return true; } } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ProvideFilePolicy.h000066400000000000000000000041001476576476200201540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_PROVIDEFILEPOLICY_H #define ZYPP_PROVIDEFILEPOLICY_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class ProvideFilePolicy /// \brief Policy for \ref provideFile and \ref RepoMediaAccess. /// /// Provides callback hook for progress reporting and an optional /// \ref FileCecker passed down to the \ref Fetcher. /////////////////////////////////////////////////////////////////// class ProvideFilePolicy { public: /** Progress callback signature. */ using ProgressCB = function; /** Set callback. */ ProvideFilePolicy & progressCB( ProgressCB progressCB_r ) { _progressCB = std::move(progressCB_r); return *this; } /** Evaluate callback. */ bool progress( int value ) const; public: /** Add a \ref FileCecker passed down to the \ref Fetcher */ ProvideFilePolicy & fileChecker( FileChecker fileChecker_r ) { _fileChecker = std::move(fileChecker_r); return *this; } /** The \ref FileCecker. */ const FileChecker & fileChecker() const { return _fileChecker; } private: FileChecker _fileChecker; ProgressCB _progressCB; }; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PROVIDEFILEPOLICY_H libzypp-17.36.5/zypp/PublicKey.h000066400000000000000000000000431476576476200164550ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/PurgeKernels.cc000066400000000000000000000701611476576476200173420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PurgeKernels.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "PurgeKernels" namespace zypp { using Flavour = std::string; using SolvableList = std::list; using EditionToSolvableMap = std::map; using ArchToEditionMap = std::map; struct GroupInfo { enum GroupType { None, //<< Just here to support default construction Kernels, //<< Map contains kernel packages, so need to receive special handling and flavour matching RelatedBinaries, //<< Map contains related binary packages, so need to receive special handling and flavour matching Sources //<< Map contains source packages, so when matching those against running we ignore the flavour } groupType; GroupInfo( const GroupType type = None, std::string flav = "") : groupType(type), groupFlavour( std::move(flav) ) { } ArchToEditionMap archToEdMap; //<< Map of actual packages std::string groupFlavour; //<< This would contain a specific flavour if there is one calculated }; using GroupMap = std::unordered_map; struct PurgeKernels::Impl { Impl() { struct utsname unameData; if ( uname( &unameData) == 0 ) { const auto archStr = str::regex_substitute( unameData.machine, str::regex( "^i.86$", str::regex::match_extended ), "i586" ); _kernelArch = Arch( archStr ); setUnameR( std::string( unameData.release ) ); _detectedRunning = true; MIL << "Detected running kernel: Flavour: " << _runningKernelFlavour << " Arch: " << _kernelArch << "\n"; for ( const auto &edVar : _runningKernelEditionVariants ) MIL << "Edition variant: " << edVar << "\n"; MIL << std::endl; } else { MIL << "Failed to detect running kernel: " << errno << std::endl; } } void setUnameR ( const std::string &uname ) { _uname_r = uname; MIL << "Set uname " << uname << std::endl; const std::string flavour = str::regex_substitute( _uname_r, str::regex( ".*-", str::regex::match_extended ), "", true ); std::string version = str::regex_substitute( _uname_r, str::regex( "-[^-]*$", str::regex::match_extended | str::regex::newline ), "", true ); const std::string release = str::regex_substitute( version, str::regex( ".*-", str::regex::match_extended ), "", true ); version = str::regex_substitute( version, str::regex( "-[^-]*$", str::regex::match_extended | str::regex::newline ), "", true ); auto makeRcVariant = [ &release ]( std::string myVersion, const std::string &replace ){ // from purge-kernels script, was copied from kernel-source/rpm/mkspec myVersion = str::regex_substitute( myVersion, str::regex( "\\.0-rc", str::regex::match_extended ), replace, true ); myVersion = str::regex_substitute( myVersion, str::regex( "-rc\\d+", str::regex::match_extended ), "", true ); myVersion = str::regex_substitute( myVersion, str::regex( "-", str::regex::match_extended ), ".", true ); return Edition( myVersion, release ); }; _runningKernelEditionVariants.clear(); _runningKernelEditionVariants.insert( makeRcVariant( version, "~rc") ); _runningKernelEditionVariants.insert( makeRcVariant( version, ".rc") ); _runningKernelFlavour = flavour; MIL << "Parsed info from uname: " << std::endl; MIL << "Kernel Flavour: " << _runningKernelFlavour << std::endl; MIL << "Kernel Edition Variants: \n"; for ( const auto &var : _runningKernelEditionVariants ) MIL << " " << var << "\n"; MIL << std::endl; } bool removePackageAndCheck( const sat::Solvable slv, const std::set &keepList , const std::set &removeList ) const; static bool versionMatch ( const Edition &a, const Edition &b ); void parseKeepSpec(); void fillKeepList(const GroupMap &installedKernels, std::set &keepList , std::set &removeList ) const; std::set _keepLatestOffsets = { 0 }; std::set _keepOldestOffsets; std::set _keepSpecificEditions; std::string _uname_r; /*! * A kernel uname can expand into multiple variants especially with rc kernels, * older rc releases replaced the upstream tag -rc with .rc, however newer code * replaces it with ~rc. We need to check against all variants to match the correct one. */ std::set _runningKernelEditionVariants; Flavour _runningKernelFlavour; Arch _kernelArch; std::string _keepSpec = ZConfig::instance().multiversionKernels(); bool _keepRunning = true; bool _detectedRunning = false; }; /*! * tries to remove a the \ref PoolItem \a pi from the pool, solves and checks if no unexpected packages are removed due to the \a validRemovals regex. * If the constraint fails the changes are reverted and \a false is returned. */ bool PurgeKernels::Impl::removePackageAndCheck( const sat::Solvable slv, const std::set &keepList , const std::set &removeList ) const { const filter::ByStatus toBeUninstalledFilter( &ResStatus::isToBeUninstalled ); PoolItem pi ( slv ); auto pool = ResPool::instance(); // make sure the pool is clean if ( !pool.resolver().resolvePool() ) { MIL << "Pool failed to resolve, not doing anything" << std::endl; return false; } MIL << "Request to remove package: " << pi << std::endl; //list of packages that are allowed to be removed automatically. const str::regex validRemovals("(kernel-syms(-.*)?|kgraft-patch(-.*)?|kernel-(.*)-livepatch(-.*)?|kernel-livepatch(-.*)?|.*-kmp(-.*)?)"); if ( pi.status().isLocked() ) { MIL << "Package " << pi << " is locked by the user, not removing." << std::endl; return false; } //remember which packages are already marked for removal, we do not need to check them again std::set currentSetOfRemovals; for ( const PoolItem & p : pool.byStatus( toBeUninstalledFilter ) ) { currentSetOfRemovals.insert( p.satSolvable() ); } pi.status().setToBeUninstalled( ResStatus::USER ); if ( !pool.resolver().resolvePool() ) { MIL << "Failed to resolve pool, skipping " << pi << std::endl; pool.resolver().problems(); pi.statusReset(); return false; } std::set removedInThisRun; removedInThisRun.insert( slv ); for ( const PoolItem & p : pool.byStatus( toBeUninstalledFilter ) ) { //check if that package is removeable if ( p.status().isByUser() //this was set by us, ignore it || (currentSetOfRemovals.find( p.satSolvable() ) != currentSetOfRemovals.end()) //this was marked by a previous removal, ignore them ) continue; // remember for later we need remove the debugsource and debuginfo packages as well removedInThisRun.insert( p.satSolvable() ); MIL << "Package " << p << " was marked by the solver for removal." << std::endl; // if we do not plan to remove that package anyway, we need to check if its allowed to be removed ( package in removelist can never be in keep list ) if ( removeList.find( p.satSolvable() ) != removeList.end() ) continue; if ( keepList.find( p.satSolvable() ) != keepList.end() ) { MIL << "Package " << p << " is in keep spec, skipping" << pi << std::endl; pi.statusReset(); return false; } /* * bsc#1185325 We can not solely rely on name matching to figure out * which packages are kmod's, in SLES from Leap 15.3 forward we have the * kernel-flavour-extra packages ( and others similarly named ) that are basically * a collection of kmod's. So checking the name for .*-kmp(-.*)? is not enough. * We first check if the package provides kmod(*) or ksym(*) and only fall back to name * checking if that is not the case. * Just to be safe I'll leave the regex in the fallback case as well, but it should be completely * redundant now. */ bool mostLikelyKmod = false; StrMatcher matchMod( "kmod(*)", Match::GLOB ); StrMatcher matchSym( "ksym(*)", Match::GLOB ); for ( const auto &prov : p.dep_provides() ) { if ( matchMod.doMatch( prov.detail().name().c_str()) || matchSym.doMatch( prov.detail().name().c_str() ) ) { mostLikelyKmod = true; break; } } if ( mostLikelyKmod ) { MIL << "Package " << p << " is most likely a kmod " << std::endl; } else { str::smatch what; if ( !str::regex_match( p.name(), what, validRemovals) ) { MIL << "Package " << p << " should not be removed, skipping " << pi << std::endl; pi.statusReset(); return false; } } } MIL << "Successfully marked package: " << pi << " for removal."<= 2 ) { versionStr.replace( matches.begin(0), (matches.end(0) - matches.begin(0))+1, matches[1] ); return a == Edition(versionStr); } } return false; } /*! * Parse the config line keep spec that tells us which kernels should be kept */ void PurgeKernels::Impl::parseKeepSpec( ) { //keep spec parse regex, make sure to edit the group offsets if changing this regex const str::regex specRegex( "^(latest|oldest)([+-][0-9]+)?$", str::regex::match_extended ); const unsigned tokenGrp = 1; //index of the group matching the token const unsigned modifierGrp = 2; //index of the group matching the offset modifier MIL << "Parsing keep spec: " << _keepSpec << std::endl; std::vector words; str::split( _keepSpec, std::back_inserter(words), ",", str::TRIM ); if ( words.empty() ) { WAR << "Invalid keep spec: " << _keepSpec << " using default latest,running." << std::endl; return; } _keepRunning = false; _keepLatestOffsets.clear(); _keepOldestOffsets.clear(); for ( const std::string &word : words ) { if ( word == "running" ) { _keepRunning = true; } else { str::smatch what; if ( !str::regex_match( word, what, specRegex ) ) { // Allow uname_r version numbers by cutting off any postfix that comes after a second dash, including the second dash. // Github-Issue openSUSE/zypper#418 std::string_view edition(word); const auto firstDash = word.find_first_of ('-'); if ( firstDash != std::string::npos ) { const auto secondDash = word.find_first_of ('-', firstDash+1 ); if ( secondDash != std::string::npos ) { WAR << "Ignoring possible flavor postfix:'"<< word.substr (secondDash) <<"' in keep spec: " << word << std::endl; edition = std::string_view( word.c_str (), secondDash ); } } _keepSpecificEditions.insert( Edition(IdString(edition)) ); continue; } auto addKeepOff = []( const auto &off, auto &set, const auto &constraint ){ const off_t num = off.empty() ? 0 : str::strtonum( off ); if ( !constraint(num) ) return false; set.insert( static_cast(std::abs(num)) ); return true; }; if ( what[tokenGrp] == "oldest" ) { addKeepOff( what[modifierGrp], _keepOldestOffsets, [ &word ]( off_t num ) { if ( num < 0 ) { WAR << "Ignoring invalid modifier in keep spec: " << word << ", oldest supports only positive modifiers." << std::endl; return false; } return true; }); } else { addKeepOff( what[modifierGrp], _keepLatestOffsets, [ &word ]( off_t num ) { if ( num > 0 ) { WAR << "Ignoring invalid modifier in keep spec: " << word << ", latest supports only negative modifiers." << std::endl; return false; } return true; }); } } } } /*! * Go over the list of available Editions for each flavour/arch combinations, apply the keep spec and mark the * packages that belong to a matching category as to keep * * All packages with Arch_noarch will only be matched against the version but NOT the flavour, reasoning for that is * simply that source flavours not necessarily match the binary flavours. Without a translation table that would not be * doable. This is also what the perl script did. * */ void PurgeKernels::Impl::fillKeepList( const GroupMap &installedKernels, std::set &keepList, std::set &removeList ) const { const auto markAsKeep = [ &keepList, &removeList ]( sat::Solvable pck ) { MIL << "Marking package " << pck << " as to keep." << std::endl; keepList.insert( pck ) ; removeList.erase( pck ); }; const auto versionPredicate = []( const auto &editionVariants ){ return [ &editionVariants ]( const auto &elem ) { const auto &f = std::bind( versionMatch, _1, elem.first ); return std::any_of( editionVariants.begin(), editionVariants.end(), f ); }; }; for ( const auto &groupInfo : installedKernels ) { MIL << "Starting with group " << groupInfo.first << std::endl; for ( const auto &archMap : groupInfo.second.archToEdMap ) { MIL << "Starting with arch " << archMap.first << std::endl; size_t currOff = 0; //the current "oldest" offset ( runs from map start to end ) size_t currROff = archMap.second.size() - 1; // the current "latest" offset ( runs from map end to start ) const EditionToSolvableMap &map = archMap.second; if ( _keepRunning && ( ( archMap.first == _kernelArch && groupInfo.second.groupFlavour == _runningKernelFlavour ) || groupInfo.second.groupType == GroupInfo::Sources ) ) { MIL << "Matching packages against running kernel "<< _runningKernelFlavour << "-" <<_kernelArch << "\nVariants:\n"; for ( const auto &var : _runningKernelEditionVariants ) MIL << var << "\n"; MIL << std::endl; const auto &editionPredicate = versionPredicate( _runningKernelEditionVariants ); auto it = std::find_if( map.begin(), map.end(), editionPredicate ); if ( it == map.end() ) { // If we look at Sources we cannot match the flavour but we still want to keep on checking the rest of the keep spec if ( groupInfo.second.groupType != GroupInfo::Sources ) { MIL << "Running kernel " << _runningKernelFlavour << "-" <<_kernelArch << "\n"; for ( const auto &var : _runningKernelEditionVariants ) MIL << " Possible Variant:" << var << "\n"; MIL << "Not installed! \n"; MIL << "NOT removing any packages for flavor "<<_runningKernelFlavour<<"-"<<_kernelArch<<" ."<first << std::endl; auto nit = it; for ( nit++ ; nit != map.end() && editionPredicate( *nit ) ; nit++ ) { MIL << "Found possible more recent running candidate edition: " << nit->first << std::endl; it = nit; } } // mark all packages of the running version as keep if ( it != map.end() ) { for( sat::Solvable pck : it->second ) { markAsKeep(pck); } } } for ( const auto &kernelMap : map ) { //if we find one of the running offsets in the keepspec, we add the kernel id the the list of packages to keep if ( _keepOldestOffsets.find( currOff ) != _keepOldestOffsets.end() || _keepLatestOffsets.find( currROff ) != _keepLatestOffsets.end() ) { std::for_each( kernelMap.second.begin(), kernelMap.second.end(), markAsKeep ); } currOff++; currROff--; // a kernel package might be explicitly locked by version // We need to go over all package name provides ( provides is named like the package ) and match // them against the specified version to know which ones to keep. (bsc#1176740 bsc#1176192) std::for_each( kernelMap.second.begin(), kernelMap.second.end(), [ & ]( sat::Solvable solv ){ for ( Capability prov : solv.dep_provides() ) { if ( prov.detail().name() == solv.name() && _keepSpecificEditions.count( prov.detail().ed() ) ) { markAsKeep( solv ); break; } } }); } } } } PurgeKernels::PurgeKernels() : _pimpl( new Impl() ) { } void PurgeKernels::markObsoleteKernels() { MIL << std::endl << "--------------------- Starting to mark obsolete kernels ---------------------"<_keepSpec.empty() ) { WAR << "Keep spec is empty, removing nothing." << std::endl; return; } _pimpl->parseKeepSpec(); if ( _pimpl->_keepRunning && !_pimpl->_detectedRunning ) { WAR << "Unable to detect running kernel, but keeping the running kernel was requested. Not removing any packages." << std::endl; return; } auto pool = ResPool::instance(); pool.resolver().setForceResolve( true ); // set allow uninstall flag const filter::ByStatus toBeUninstalledFilter( &ResStatus::isToBeUninstalled ); // kernel flavour regex const str::regex kernelFlavourRegex("^kernel-(.*)$"); // the map of all installed kernel packages, grouped by Flavour -> Arch -> Version -> (List of all packages in that category) // devel and source packages are grouped together GroupMap installedKrnlPackages; // packages that we plan to remove std::set packagesToRemove; const auto addPackageToMap = [&installedKrnlPackages, &packagesToRemove] ( const GroupInfo::GroupType type, const std::string &ident, const std::string &flavour, const sat::Solvable &installedKrnlPck ) { if ( !installedKrnlPackages.count( ident ) ) installedKrnlPackages.insert( std::make_pair( ident, GroupInfo(type, flavour) ) ); auto &groupInfo = installedKrnlPackages[ ident ]; if ( groupInfo.groupType != type || groupInfo.groupFlavour != flavour ) { ERR << "Got inconsistent type and flavour for ident this is a BUG: " << ident << std::endl << "Original Flavour-Type: "< packagesToKeep; //collect the list of installed kernel packages PoolQuery q; q.addKind( zypp::ResKind::package ); q.addAttribute( sat::SolvAttr::dep_provides, "multiversion(kernel)" ); q.setInstalledOnly(); q.setMatchExact(); MIL << "Searching for obsolete multiversion kernel packages." << std::endl; for ( sat::Solvable installedKrnlPck : q ) { MIL << "Found installed multiversion kernel package " << installedKrnlPck << std::endl; if ( installedKrnlPck.dep_provides().matches(Capability("kernel-uname-r")) ) { MIL << "Identified as a kernel package " << std::endl; // we group kernel packages by flavour str::smatch what; str::regex_match( installedKrnlPck.name(), what, kernelFlavourRegex ); if ( what[1].empty() ) { WAR << "Could not detect flavour for: " << installedKrnlPck << " ...skipping" << std::endl; continue; } std::string flavour = what[1]; // XXX: No dashes in flavor names const auto dash = flavour.find_first_of('-'); if ( dash != std::string::npos ) { flavour = flavour.substr( 0, dash ); } // the ident for kernels is the flavour, to also handle cases like kernel-base and kernel which should be in the same group handled together addPackageToMap( GroupInfo::Kernels, flavour, flavour, installedKrnlPck ); } else { // if adapting the groups do not forget to explicitly handle the group when querying the matches const str::regex explicitlyHandled("kernel-syms(-.*)?|kernel(-.*)?-devel"); MIL << "Not a kernel package, inspecting more closely " << std::endl; // we directly handle all noarch packages that export multiversion(kernel) if ( installedKrnlPck.arch() == Arch_noarch ) { MIL << "Handling package explicitly due to architecture (noarch)."<< std::endl; addPackageToMap( GroupInfo::Sources, installedKrnlPck.name(), "", installedKrnlPck ); } else if ( str::smatch match; str::regex_match( installedKrnlPck.name(), match, explicitlyHandled ) ) { // try to get the flavour from the name // if we have a kernel-syms getting no flavour means we have the "default" one, otherwise we use the flavour // getting no flavour for a kernel(-*)?-devel means we have the kernel-devel package otherwise the flavour specific one // ...yes this is horrible std::string flav; // first group match is a kernel-syms if ( match.size() > 1 && match[1].size() ) flav = match[1].substr(1); // second group match is a kernel-flavour-devel else if ( match.size() > 2 && match[2].size() ) flav = match[2].substr(1); else if ( installedKrnlPck.name() == "kernel-syms" ) flav = "default"; MIL << "Handling package explicitly due to name match."<< std::endl; addPackageToMap ( GroupInfo::RelatedBinaries, installedKrnlPck.name(), flav, installedKrnlPck ); } else { MIL << "Package not explicitly handled" << std::endl; } } } MIL << "Grouped packages: " << std::endl; std::for_each( installedKrnlPackages.begin(), installedKrnlPackages.end(),[]( const auto &ident ){ MIL << "\tGroup ident: "<fillKeepList( installedKrnlPackages, packagesToKeep, packagesToRemove ); for ( sat::Solvable slv : packagesToRemove ) _pimpl->removePackageAndCheck( slv, packagesToKeep, packagesToRemove ); } void PurgeKernels::setUnameR( const std::string &val ) { _pimpl->setUnameR( val ); } std::string PurgeKernels::unameR() const { return _pimpl->_uname_r; } void PurgeKernels::setKernelArch(const Arch &arch) { _pimpl->_kernelArch = arch; } Arch PurgeKernels::kernelArch() const { return _pimpl->_kernelArch; } void PurgeKernels::setKeepSpec( const std::string &val ) { _pimpl->_keepSpec = val; } std::string PurgeKernels::keepSpec() const { return _pimpl->_keepSpec; } } libzypp-17.36.5/zypp/PurgeKernels.h000066400000000000000000000043701476576476200172030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/PurgeKernels.h * */ #include #include #include namespace zypp { namespace str { class regex; } /*! * Implements the logic of the "purge-kernels" command. * */ class ZYPP_API PurgeKernels { public: PurgeKernels(); /*! * Marks all currently obsolete Kernels according to the keep spec. * \note This will not commit the changes */ void markObsoleteKernels(); /*! * Force a specific uname to be set, only used for testing, * in production the running kernel is detected. */ void setUnameR( const std::string &val ); std::string unameR() const; /*! * Force a specific kernel arch to be set, only used for testing, * in production the running kernel arch is detected. */ void setKernelArch( const zypp::Arch &arch ); Arch kernelArch() const; /*! * Overrides the keep spec, the default value is read from ZConfig. * The keep spec is a string of tokens seperated by ",". * It only supports 3 different tokens: * - "running" matches only the currently running kernel of the system * - "oldest" matches the kernel version for each flavour/arch combination with the lowest edition * can be modified with a positive number: oldest+n * - "latest" matches the kernel version for each flavour/arch combination with the highest edition * can be modified with a negative number: latest-n */ void setKeepSpec( const std::string &val ); std::string keepSpec () const; struct Impl; private: RW_pointer _pimpl; }; } libzypp-17.36.5/zypp/Range.cc000066400000000000000000000067431476576476200157750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Range.cc * */ #include //#include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace range_detail { /** Compute Range overlaps. * Takes the \a lhs and \a rhs operator and the result * of comparing \a lhs and \a rhs (-1,0,1). * */ bool overlaps( Rel lhs, Rel rhs, int cmp ) { if ( lhs == Rel::NONE || rhs == Rel::NONE ) return false; if ( lhs == Rel::ANY || rhs == Rel::ANY ) return true; if ( lhs == Rel::NE ) { if ( cmp < 0 ) { // lhs < rhs return( rhs == Rel::GE || rhs == Rel::EQ ); } else if ( cmp > 0) { // lhs > rhs return( rhs == Rel::LT || rhs == Rel::EQ ); } else { //lhs == rhs return ( rhs == Rel::GT || rhs == Rel::LT ); } } if ( rhs == Rel::NE ) { if ( cmp < 0 ) { // lhs < rhs return( lhs == Rel::LE || lhs == Rel::EQ ); } else if ( cmp > 0) { // lhs > rhs return( lhs == Rel::GT || lhs == Rel::EQ ); } else { //lhs == rhs return ( lhs == Rel::GT || lhs == Rel::LT ); } } if ( cmp < 0 ) { // lhs < rhs: either lhs includes greater values or rhs includes lower. return( lhs == Rel::GT || lhs == Rel::GE || rhs == Rel::LT || rhs == Rel::LE ); } if ( cmp > 0 ) { // lhs > rhs: either lhs includes lower values or rhs includes greater. return( lhs == Rel::LT || lhs == Rel::LE || rhs == Rel::GT || rhs == Rel::GE ); } // lhs == rhs: either both ranges include Rel::EQ, or both head // into the same direction. if ( ( lhs == Rel::LE || lhs == Rel::EQ || lhs == Rel::GE ) && ( rhs == Rel::LE || rhs == Rel::EQ || rhs == Rel::GE ) ) return true; if ( ( lhs == Rel::LT && ( rhs == Rel::LT || rhs == Rel::LE ) ) || ( lhs == Rel::GT && ( rhs == Rel::GT || rhs == Rel::GE ) ) || ( rhs == Rel::LT && ( lhs == Rel::LT || lhs == Rel::LE ) ) || ( rhs == Rel::GT && ( lhs == Rel::GT || lhs == Rel::GE ) ) ) return true; // else return false; } } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Range.h000066400000000000000000000054201476576476200156260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Range.h * */ #ifndef ZYPP_RANGE_H #define ZYPP_RANGE_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace range_detail { bool overlaps( Rel lhs, Rel rhs, int cmp ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Range // /** * */ template > struct Range { /** */ Rel op; /** */ Tp value; /** Default ctor: \ref Rel::ANY. */ Range() : op( Rel::ANY ) {} /** Ctor taking \a Tp (\ref Rel::EQ). */ Range( const Tp & value_r ) : op( Rel::EQ ) , value( value_r ) {} /** Ctor taking \ref Rel and \a Tp. */ Range( Rel op_r, const Tp & value_r ) : op( op_r ) , value( value_r ) {} /** Return whether two Ranges overlap. */ bool overlaps( const Range & rhs ) const { return range_detail::overlaps( op, rhs.op, TCompare()( value, rhs.value ) ); } }; /////////////////////////////////////////////////////////////////// template inline bool overlaps( const Range & lhs, const Range & rhs ) { return lhs.overlaps( rhs ); } /////////////////////////////////////////////////////////////////// template inline bool operator==( const Range & lhs, const Range & rhs ) { return( lhs.op == rhs.op && ( lhs.op == Rel::ANY || lhs.op == Rel::NONE || relCompare( Rel::EQ, lhs.value, rhs.value, TCompare() ) ) ); } template inline bool operator!=( const Range & lhs, const Range & rhs ) { return ! ( lhs == rhs ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RANGE_H libzypp-17.36.5/zypp/Rel.cc000066400000000000000000000100771476576476200154560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Rel.cc * */ #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace { std::map _table; std::map::const_iterator findStr( const std::string & strval_r ) { if ( _table.empty() ) { // initialize it _table["EQ"] = _table["eq"] = _table["=="] = _table["="] = Rel::EQ_e; _table["NE"] = _table["ne"] = _table["!="] = Rel::NE_e; _table["LT"] = _table["lt"] = _table["<"] = Rel::LT_e; _table["LE"] = _table["le"] = _table["lte"] = _table["<="] = Rel::LE_e; _table["GT"] = _table["gt"] = _table[">"] = Rel::GT_e; _table["GE"] = _table["ge"] = _table["gte"] = _table[">="] = Rel::GE_e; _table["ANY"] = _table["any"] = _table["(any)"] = _table[""] = Rel::ANY_e; _table["NONE"] = _table["none"] = Rel::NONE_e; } return _table.find( strval_r ); } Rel::for_use_in_switch parse( const std::string & strval_r ) { std::map::const_iterator it = findStr( strval_r ); if ( it == _table.end() ) { ZYPP_THROW( Exception("Rel parse: illegal string value '"+strval_r+"'") ); } return it->second; } Rel::for_use_in_switch parse( const std::string & strval_r, const Rel & default_r ) { std::map::const_iterator it = findStr( strval_r ); if ( it == _table.end() ) { return default_r.inSwitch(); } return it->second; } } /////////////////////////////////////////////////////////////////// const Rel Rel::EQ( Rel::EQ_e ); const Rel Rel::NE( Rel::NE_e ); const Rel Rel::LT( Rel::LT_e ); const Rel Rel::LE( Rel::LE_e ); const Rel Rel::GT( Rel::GT_e ); const Rel Rel::GE( Rel::GE_e ); const Rel Rel::ANY( Rel::ANY_e ); const Rel Rel::NONE( Rel::NONE_e ); /////////////////////////////////////////////////////////////////// // // METHOD NAME : Rel::Rel // METHOD TYPE : Constructor // Rel::Rel( const std::string & strval_r ) : _op( parse( strval_r ) ) {} Rel::Rel( const std::string & strval_r, const Rel & default_r ) : _op( parse( strval_r, default_r ) ) {} bool Rel::parseFrom( const std::string & strval_r ) { std::map::const_iterator it = findStr( strval_r ); if ( it == _table.end() ) { return false; } _op = it->second; return true; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Rel::asString // METHOD TYPE : const std::string & // const std::string & Rel::asString() const { static std::map _table; if ( _table.empty() ) { // initialize it _table[EQ_e] = "="; _table[NE_e] = "!="; _table[LT_e] = "<"; _table[LE_e] = "<="; _table[GT_e] = ">"; _table[GE_e] = ">="; _table[ANY_e] = "ANY"; _table[NONE_e] = "NONE"; } return _table[_op]; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/Rel.h000066400000000000000000000130321476576476200153120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Rel.h * */ #ifndef ZYPP_REL_H #define ZYPP_REL_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Rel // /** Relational operators. * Yes, it could as well be simply an \c enum.
* Yes, you can use the relational operators as if it was an \c enum.
* Except for use in a \c switch statement; see \ref inSwitch for this. * * But we want to construct them from a string representation, as well as * providing one. And this way they are wrapped into a namespace, which is * a good idea anyway. * * \ref ANY and \ref NONE are somewhat special. \ref ANY is the * operator created by the default ctor, and it should always resolve * to \c true. This may be handy in queries when you're looking for a * Resolvable in \c ANY Edition if no operator was specified. * While \ref NONE should always resolve to \c false. * * \ingroup g_EnumerationClass */ struct ZYPP_API Rel { /** \name Relational operators * These are the \em real relational operator contants to * use. Don't mind that it's not an enum. See also: \ref zypp::Rel::inSwitch */ //@{ static const Rel EQ; static const Rel NE; static const Rel LT; static const Rel LE; static const Rel GT; static const Rel GE; static const Rel ANY; static const Rel NONE; //@} /** Enumarators provided \b only for use \ref inSwitch statement. * \see inSwitch * \note Enumarator values also correspond to the values libsolv * uses to encode these relations. */ enum for_use_in_switch { NONE_e = 0U, GT_e = 1U, EQ_e = 2U, LT_e = 4U, GE_e = GT_e|EQ_e, LE_e = LT_e|EQ_e, NE_e = GT_e|LT_e, ANY_e = GT_e|EQ_e|LT_e, }; /** DefaultCtor ANY. */ Rel() : _op( ANY_e ) {} /** Ctor from string. * Legal values for \a strval_r are: "="/"==", "!=", "<", "<=", ">", ">=",
* as well as "EQ", "NE", "LT", "LE", "GT", "GE", "ANY", "NONE"
* and "" (empty string resolves to ANY). * * Lower case names are accepted as well. * * \throw PARSE if \a strval_r is not legal. * \todo refine exceptions and check throw. */ explicit Rel( const std::string & strval_r ); /** Ctor from string (non-throwing). * Illegal string values resolve to \c default_r */ Rel( const std::string & strval_r, const Rel & default_r ); /** Assign from string IFF it contains a legal value. * \return Whether \a strval_r contained a legal value. */ bool parseFrom( const std::string & strval_r ); /** Ctor from bits. */ explicit Rel( unsigned bits_r ) : _op( for_use_in_switch(bits_r & ANY_e) ) {} /** Test whether \a bits_r is a valid \ref Rel (no extra bits set). */ static bool isRel( unsigned bits_r ) { return (bits_r & ANY_e) == bits_r; } /** String representation of relational operator. * \return "=", "!=", "<", "<=", ">", ">=", "ANY" or "NONE" */ const std::string & asString() const; /** \overload */ const char * c_str() const { return asString().c_str(); } /** Enumarator provided for use in \c switch statement. * The sole reason for providing enum \ref for_use_in_switch is, * that we may want to use the relational operators in a \c switch * statement. Tht's the only case where you should have to use the * enumarator. * \code * Rel op; * switch ( op.inSwitch() ) * { * case Rel::EQ_e: * ... * break; * case Rel::NE_e: * ... * * // No default! Let compiler warn if case is missing * } * \endcode */ for_use_in_switch inSwitch() const { return _op; } /** Enumarator values suitable for libsolv. */ unsigned bits() const { return _op; } private: /** Ctor to initialize the relational operator contants. */ Rel( for_use_in_switch op_r ) : _op( op_r ) {} /** The operator. */ for_use_in_switch _op; }; /////////////////////////////////////////////////////////////////// /** \relates Rel Stream output. */ inline std::ostream & operator<<( std::ostream & str, const Rel & obj ) { return str << obj.asString(); } /////////////////////////////////////////////////////////////////// /** \relates Rel */ inline bool operator==( const Rel & lhs, const Rel & rhs ) { return lhs.inSwitch() == rhs.inSwitch(); } /** \relates Rel */ inline bool operator!=( const Rel & lhs, const Rel & rhs ) { return ! ( lhs == rhs ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REL_H libzypp-17.36.5/zypp/RelCompare.h000066400000000000000000000172441476576476200166320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RelCompare.h * */ #ifndef ZYPP_RELCOMPARE_H #define ZYPP_RELCOMPARE_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** \defgroup RelCompare Comparison using relational operator zypp::Rel. * * . Take a class like zypp::Edition. Editions are comaprable. * You can compare them lexicographical, or according to their * version and release values, or match them (i.e. taking empty * version or release values as wildcard). * * No matter which way is appropriate within a certain context. * You need functions to compare, and may want to use classes like * zypp::Range, based on the desired comparison. * * All the class has to do, is providing a general comparison * method (preferably static) * \code * // Compare two elements returning -1, 0, 1 * // if the elemants compare <,==,>. * static int compare( const Tp & lhs, const Tp & rhs ); * \endcode * * Compare\ provides a functor wrapping \c compare. * In case the general comparison method is named differently, the * class, or you, have to provide an approriate functor. * * compareByRel then compares two elements using a certain * operator and general comparison method. * \code * compareByRel( Rel::EQ, lhs, rhs, Edition::compare ); * compareByRel( Rel::EQ, lhs, rhs, Edition::match ); * compareByRel( Rel::EQ, lhs, rhs ); // defaults to Compare\ * // thus Edition::compare * \endcode * * Furthermore a bunch of functors using a certain operator is * defined. All templated by type and general comparison * method (defaults to Compare\). * \code * // Editions sets use lexicographical order per default: * std::set * * // An Edition set using Edition::compare as order: * std::set >; * * // Edition::match is not transitive, thus not an appropriate * // order relation for std::set or std::map. * \endcode * * Classes like zypp:Range are templated by by type and general * comparison method as well. Thus you may use Edition ranges based * on Edition::Compare, as well as ranges based on Edition::Match * (Edition provides these two functors). * * Again: Everything a class has to provide is the general * comparison method. Comparison functors and ranges are then * immediately available. */ //@{ /** General compare functor returning -1, 0, 1. * Expects Tp::compare to be a static comparison method * returning -1, 0, 1 if the elements compare * \<,==,\>. */ template struct Compare { int operator()( const Tp & lhs, const Tp & rhs ) const { return Tp::compare( lhs, rhs ); } }; /////////////////////////////////////////////////////////////////// /** Comparison of two elements using relational operator \a op. * Expects \a TCompare to be a binary operator returning * -1, 0, 1 if the elements compare \<,==,\>. * \code * // Signature of compare function or functor: * int compare( const Tp & lhs, const Tp & rhs ); * \endcode * \li If \a op is Rel::ANY, the expression is always \c true. * \li If \a op is Rel::NONE, the expression is always \c false. * \li Otherwise the expression is evaluated using \a compare. * * \ingroup RelCompare */ template inline bool compareByRel( Rel op, const Tp & lhs, const Tp & rhs, TCompare compare ) { switch ( op.inSwitch() ) { case Rel::EQ_e: return compare( lhs, rhs ) == 0; break; case Rel::NE_e: return compare( lhs, rhs ) != 0; break; case Rel::LT_e: return compare( lhs, rhs ) < 0; break; case Rel::LE_e: return compare( lhs, rhs ) <= 0; break; case Rel::GT_e: return compare( lhs, rhs ) > 0; break; case Rel::GE_e: return compare( lhs, rhs ) >= 0; break; case Rel::ANY_e: return true; break; case Rel::NONE_e: return false; break; } return false; } /** \ref compareByRel convenience using Compare as general compare * functor. */ template inline bool compareByRel( Rel op, const Tp & lhs, const Tp & rhs ) { return compareByRel( op, lhs, rhs, Compare() ); } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /** Functor to compare two elements by \ref Rel based on * a general \a TCompare functor. * * Expects \a TCompare to be suitable for use in \ref compareByRel. * Defaults to Compare\. */ template > struct CompareBy { CompareBy( Rel op_r ) : _op( op_r ) {} bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( _op, lhs, rhs, TCompare() ); } Rel _op; }; template > struct CompareByEQ { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::EQ, lhs, rhs, TCompare() ); } }; template > struct CompareByNE { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::NE, lhs, rhs, TCompare() ); } }; template > struct CompareByLT { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::LT, lhs, rhs, TCompare() ); } }; template > struct CompareByLE { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::LE, lhs, rhs, TCompare() ); } }; template > struct CompareByGT { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::GT, lhs, rhs, TCompare() ); } }; template > struct CompareByGE { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::GE, lhs, rhs, TCompare() ); } }; template > struct CompareByANY { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::ANY, lhs, rhs, TCompare() ); } }; template > struct CompareByNONE { bool operator()( const Tp & lhs, const Tp & rhs ) const { return compareByRel( Rel::NONE, lhs, rhs, TCompare() ); } }; /////////////////////////////////////////////////////////////////// //@} ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_RELCOMPARE_H libzypp-17.36.5/zypp/RepoInfo.cc000066400000000000000000001036471476576476200164630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoInfo.cc * */ #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 using std::endl; using zypp::xml::escape; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace { repo::RepoType probeCache( const Pathname & path_r ) { repo::RepoType ret = repo::RepoType::NONE; if ( PathInfo(path_r).isDir() ) { if ( PathInfo(path_r/"/repodata/repomd.xml").isFile() ) { ret = repo::RepoType::RPMMD; } else if ( PathInfo(path_r/"/content").isFile() ) { ret = repo::RepoType::YAST2; } else if ( PathInfo(path_r/"/cookie").isFile() ) { ret = repo::RepoType::RPMPLAINDIR; } } DBG << "Probed cached type " << ret << " at " << path_r << endl; return ret; } } // namespace /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoInfo::Impl // /** RepoInfo implementation. */ struct RepoInfo::Impl { Impl() : _rawGpgCheck( indeterminate ) , _rawRepoGpgCheck( indeterminate ) , _rawPkgGpgCheck( indeterminate ) , _validRepoSignature( indeterminate ) , _type(repo::RepoType::NONE_e) , keeppackages(indeterminate) , _mirrorListForceMetalink(false) , emptybaseurls(false) {} Impl(const Impl &) = default; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() {} public: static const unsigned defaultPriority = 99; static const unsigned noPriority = unsigned(-1); void setType( const repo::RepoType & t ) { _type = t; } void setProbedType( const repo::RepoType & t ) const { if ( _type == repo::RepoType::NONE && t != repo::RepoType::NONE ) { const_cast(this)->_type = t; } } repo::RepoType type() const { if ( _type == repo::RepoType::NONE && not metadataPath().empty() ) setProbedType( probeCache( metadataPath() / path ) ); return _type; } public: /** Path to a license tarball in case it exists in the repo. */ Pathname licenseTgz( const std::string & name_r ) const { Pathname ret; if ( !metadataPath().empty() ) { std::string licenseStem( "license" ); if ( !name_r.empty() ) { licenseStem += "-"; licenseStem += name_r; } filesystem::Glob g; // TODO: REPOMD: this assumes we know the name of the tarball. In fact // we'd need to get the file from repomd.xml () g.add( metadataPath() / path / ("repodata/*"+licenseStem+".tar.gz") ); if ( g.empty() ) g.add( metadataPath() / path / (licenseStem+".tar.gz") ); if ( !g.empty() ) ret = *g.begin(); } return ret; } const RepoVariablesReplacedUrlList & baseUrls() const { const Url & mlurl( _mirrorListUrl.transformed() ); // Variables replaced! if ( _baseUrls.empty() && ! mlurl.asString().empty() ) { emptybaseurls = true; DBG << "MetadataPath: " << metadataPath() << endl; repo::RepoMirrorList rmurls( mlurl, metadataPath(), _mirrorListForceMetalink ); _baseUrls.raw().insert( _baseUrls.raw().end(), rmurls.getUrls().begin(), rmurls.getUrls().end() ); } return _baseUrls; } RepoVariablesReplacedUrlList & baseUrls() { return _baseUrls; } bool baseurl2dump() const { return !emptybaseurls && !_baseUrls.empty(); } const RepoVariablesReplacedUrlList & gpgKeyUrls() const { return _gpgKeyUrls; } RepoVariablesReplacedUrlList & gpgKeyUrls() { return _gpgKeyUrls; } std::string repoStatusString() const { baseUrls(); // ! call baseUrls() to be sure emptybaseurls is initialized. if ( emptybaseurls ) return _mirrorListUrl.transformed().asString(); if ( baseUrls().empty() ) return std::string(); return (*baseUrls().transformedBegin()).asString(); } const std::set & contentKeywords() const { hasContent()/*init if not yet done*/; return _keywords.second; } void addContent( const std::string & keyword_r ) { _keywords.second.insert( keyword_r ); if ( ! hasContent() ) _keywords.first = true; } bool hasContent() const { if ( !_keywords.first && ! metadataPath().empty() ) { // HACK directly check master index file until RepoManager offers // some content probing and zypper uses it. ///////////////////////////////////////////////////////////////// MIL << "Empty keywords...." << metadataPath() << endl; Pathname master; if ( PathInfo( (master=metadataPath()/"/repodata/repomd.xml") ).isFile() ) { //MIL << "GO repomd.." << endl; xml::Reader reader( master ); while ( reader.seekToNode( 2, "content" ) ) { _keywords.second.insert( reader.nodeText().asString() ); reader.seekToEndNode( 2, "content" ); } _keywords.first = true; // valid content in _keywords even if empty } else if ( PathInfo( (master=metadataPath()/"/content") ).isFile() ) { //MIL << "GO content.." << endl; iostr::forEachLine( InputStream( master ), [this]( int num_r, const std::string& line_r )->bool { if ( str::startsWith( line_r, "REPOKEYWORDS" ) ) { std::vector words; if ( str::split( line_r, std::back_inserter(words) ) > 1 && words[0].length() == 12 /*"REPOKEYWORDS"*/ ) { this->_keywords.second.insert( ++words.begin(), words.end() ); } return true; // mult. occurrances are ok. } return( ! str::startsWith( line_r, "META " ) ); // no need to parse into META section. } ); _keywords.first = true; // valid content in _keywords even if empty } ///////////////////////////////////////////////////////////////// } return _keywords.first; } bool hasContent( const std::string & keyword_r ) const { return( hasContent() && _keywords.second.find( keyword_r ) != _keywords.second.end() ); } /** Signature check result needs to be stored/retrieved from _metadataPath. * Don't call them from outside validRepoSignature/setValidRepoSignature */ //@{ TriBool internalValidRepoSignature() const { if ( ! indeterminate(_validRepoSignature) ) return _validRepoSignature; // check metadata: if ( ! metadataPath().empty() ) { // A missing ".repo_gpgcheck" might be plaindir(no Downloader) or not yet refreshed signed repo! TriBool linkval = triBoolFromPath( metadataPath() / ".repo_gpgcheck" ); return linkval; } return indeterminate; } void internalSetValidRepoSignature( TriBool value_r ) { if ( PathInfo(metadataPath()).isDir() ) { Pathname gpgcheckFile( metadataPath() / ".repo_gpgcheck" ); if ( PathInfo(gpgcheckFile).isExist() ) { TriBool linkval( indeterminate ); if ( triBoolFromPath( gpgcheckFile, linkval ) && linkval == value_r ) return; // existing symlink fits value_r else filesystem::unlink( gpgcheckFile ); // will write a new one } filesystem::symlink( asString(value_r), gpgcheckFile ); } _validRepoSignature = value_r; } /** We definitely have a symlink pointing to "indeterminate" (for repoGpgCheckIsMandatory)? * I.e. user accepted the unsigned repo in Downloader. A test whether `internalValidRepoSignature` * is indeterminate would include not yet checked repos, which is unwanted here. */ bool internalUnsignedConfirmed() const { TriBool linkval( true ); // want to see it being switched to indeterminate return triBoolFromPath( metadataPath() / ".repo_gpgcheck", linkval ) && indeterminate(linkval); } bool triBoolFromPath( const Pathname & path_r, TriBool & ret_r ) const { static const Pathname truePath( "true" ); static const Pathname falsePath( "false" ); static const Pathname indeterminatePath( "indeterminate" ); // Quiet readlink; static const ssize_t bufsiz = 63; static char buf[bufsiz+1]; ssize_t ret = ::readlink( path_r.c_str(), buf, bufsiz ); buf[ret == -1 ? 0 : ret] = '\0'; Pathname linkval( buf ); bool known = true; if ( linkval == truePath ) ret_r = true; else if ( linkval == falsePath ) ret_r = false; else if ( linkval == indeterminatePath ) ret_r = indeterminate; else known = false; return known; } TriBool triBoolFromPath( const Pathname & path_r ) const { TriBool ret(indeterminate); triBoolFromPath( path_r, ret ); return ret; } //@} private: TriBool _rawGpgCheck; ///< default gpgcheck behavior: Y/N/ZConf TriBool _rawRepoGpgCheck; ///< need to check repo sign.: Y/N/(ZConf(Y/N/gpgCheck)) TriBool _rawPkgGpgCheck; ///< need to check pkg sign.: Y/N/(ZConf(Y/N/gpgCheck)) public: TriBool rawGpgCheck() const { return _rawGpgCheck; } TriBool rawRepoGpgCheck() const { return _rawRepoGpgCheck; } TriBool rawPkgGpgCheck() const { return _rawPkgGpgCheck; } void rawGpgCheck( TriBool val_r ) { _rawGpgCheck = val_r; } void rawRepoGpgCheck( TriBool val_r ) { _rawRepoGpgCheck = val_r; } void rawPkgGpgCheck( TriBool val_r ) { _rawPkgGpgCheck = val_r; } bool cfgGpgCheck() const { return indeterminate(_rawGpgCheck) ? ZConfig::instance().gpgCheck() : (bool)_rawGpgCheck; } TriBool cfgRepoGpgCheck() const { return indeterminate(_rawGpgCheck) && indeterminate(_rawRepoGpgCheck) ? ZConfig::instance().repoGpgCheck() : _rawRepoGpgCheck; } TriBool cfgPkgGpgCheck() const { return indeterminate(_rawGpgCheck) && indeterminate(_rawPkgGpgCheck) ? ZConfig::instance().pkgGpgCheck() : _rawPkgGpgCheck; } private: TriBool _validRepoSignature; ///< have signed and valid repo metadata repo::RepoType _type; public: TriBool keeppackages; RepoVariablesReplacedUrl _mirrorListUrl; bool _mirrorListForceMetalink; Pathname path; std::string service; std::string targetDistro; void metadataPath( Pathname new_r ) { _metadataPath = std::move( new_r ); } void packagesPath( Pathname new_r ) { _packagesPath = std::move( new_r ); } bool usesAutoMetadataPaths() const { return str::hasSuffix( _metadataPath.asString(), "/%AUTO%" ); } Pathname metadataPath() const { if ( usesAutoMetadataPaths() ) return _metadataPath.dirname() / "%RAW%"; return _metadataPath; } Pathname packagesPath() const { if ( _packagesPath.empty() && usesAutoMetadataPaths() ) return _metadataPath.dirname() / "%PKG%"; return _packagesPath; } Pathname predownloadPath() const { return packagesPath() / ".preload"; } DefaultIntegral priority; mutable bool emptybaseurls; private: Pathname _metadataPath; Pathname _packagesPath; mutable RepoVariablesReplacedUrlList _baseUrls; mutable std::pair > _keywords; RepoVariablesReplacedUrlList _gpgKeyUrls; friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /** \relates RepoInfo::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const RepoInfo::Impl & obj ) { return str << "RepoInfo::Impl"; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoInfo // /////////////////////////////////////////////////////////////////// const RepoInfo RepoInfo::noRepo; RepoInfo::RepoInfo() : _pimpl( new Impl() ) {} RepoInfo::~RepoInfo() {} unsigned RepoInfo::priority() const { return _pimpl->priority; } unsigned RepoInfo::defaultPriority() { return Impl::defaultPriority; } unsigned RepoInfo::noPriority() { return Impl::noPriority; } void RepoInfo::setPriority( unsigned newval_r ) { _pimpl->priority = newval_r ? newval_r : Impl::defaultPriority; } bool RepoInfo::gpgCheck() const { return _pimpl->cfgGpgCheck(); } void RepoInfo::setGpgCheck( TriBool value_r ) { _pimpl->rawGpgCheck( value_r ); } void RepoInfo::setGpgCheck( bool value_r ) // deprecated legacy and for squid { setGpgCheck( TriBool(value_r) ); } bool RepoInfo::repoGpgCheck() const { return gpgCheck() || bool(_pimpl->cfgRepoGpgCheck()); } bool RepoInfo::repoGpgCheckIsMandatory() const { bool ret = ( gpgCheck() && indeterminate(_pimpl->cfgRepoGpgCheck()) ) || bool(_pimpl->cfgRepoGpgCheck()); if ( ret && _pimpl->internalUnsignedConfirmed() ) // relax if unsigned repo was confirmed in the past ret = false; return ret; } void RepoInfo::setRepoGpgCheck( TriBool value_r ) { _pimpl->rawRepoGpgCheck( value_r ); } bool RepoInfo::pkgGpgCheck() const { return bool(_pimpl->cfgPkgGpgCheck()) || ( gpgCheck() && !bool(validRepoSignature())/*enforced*/ ) ; } bool RepoInfo::pkgGpgCheckIsMandatory() const { return bool(_pimpl->cfgPkgGpgCheck()) || ( gpgCheck() && indeterminate(_pimpl->cfgPkgGpgCheck()) && !bool(validRepoSignature())/*enforced*/ ); } void RepoInfo::setPkgGpgCheck( TriBool value_r ) { _pimpl->rawPkgGpgCheck( value_r ); } void RepoInfo::getRawGpgChecks( TriBool & g_r, TriBool & r_r, TriBool & p_r ) const { g_r = _pimpl->rawGpgCheck(); r_r = _pimpl->rawRepoGpgCheck(); p_r = _pimpl->rawPkgGpgCheck(); } TriBool RepoInfo::validRepoSignature() const { TriBool ret( _pimpl->internalValidRepoSignature() ); if ( ret && !repoGpgCheck() ) ret = false; // invalidate any old signature if repoGpgCheck is off return ret; } void RepoInfo::setValidRepoSignature( TriBool value_r ) { _pimpl->internalSetValidRepoSignature( value_r ); } /////////////////////////////////////////////////////////////////// namespace { inline bool changeGpgCheckTo( TriBool & lhs, TriBool rhs ) { if ( ! sameTriboolState( lhs, rhs ) ) { lhs = rhs; return true; } return false; } inline bool changeGpgCheckTo( TriBool ogpg[3], TriBool g, TriBool r, TriBool p ) { bool changed = false; if ( changeGpgCheckTo( ogpg[0], g ) ) changed = true; if ( changeGpgCheckTo( ogpg[1], r ) ) changed = true; if ( changeGpgCheckTo( ogpg[2], p ) ) changed = true; return changed; } } // namespace /////////////////////////////////////////////////////////////////// bool RepoInfo::setGpgCheck( GpgCheck mode_r ) { TriBool ogpg[3]; // Gpg RepoGpg PkgGpg getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] ); bool changed = false; switch ( mode_r ) { case GpgCheck::On: changed = changeGpgCheckTo( ogpg, true, indeterminate, indeterminate ); break; case GpgCheck::Strict: changed = changeGpgCheckTo( ogpg, true, true, true ); break; case GpgCheck::AllowUnsigned: changed = changeGpgCheckTo( ogpg, true, false, false ); break; case GpgCheck::AllowUnsignedRepo: changed = changeGpgCheckTo( ogpg, true, false, indeterminate ); break; case GpgCheck::AllowUnsignedPackage: changed = changeGpgCheckTo( ogpg, true, indeterminate, false ); break; case GpgCheck::Default: changed = changeGpgCheckTo( ogpg, indeterminate, indeterminate, indeterminate ); break; case GpgCheck::Off: changed = changeGpgCheckTo( ogpg, false, indeterminate, indeterminate ); break; case GpgCheck::indeterminate: // no change break; } if ( changed ) { setGpgCheck ( ogpg[0] ); setRepoGpgCheck( ogpg[1] ); setPkgGpgCheck ( ogpg[2] ); } return changed; } void RepoInfo::setMirrorListUrl( const Url & url_r ) // Raw { _pimpl->_mirrorListUrl.raw() = url_r; _pimpl->_mirrorListForceMetalink = false; } void RepoInfo::setMirrorListUrls( url_set urls ) // Raw { setMirrorListUrl( urls.empty() ? Url() : urls.front() ); } void RepoInfo::setMetalinkUrl( const Url & url_r ) // Raw { _pimpl->_mirrorListUrl.raw() = url_r; _pimpl->_mirrorListForceMetalink = true; } void RepoInfo::setMetalinkUrls( url_set urls ) // Raw { setMetalinkUrl( urls.empty() ? Url() : urls.front() ); } void RepoInfo::setGpgKeyUrls( url_set urls ) { _pimpl->gpgKeyUrls().raw().swap( urls ); } void RepoInfo::setGpgKeyUrl( const Url & url_r ) { _pimpl->gpgKeyUrls().raw().clear(); _pimpl->gpgKeyUrls().raw().push_back( url_r ); } std::string RepoInfo::repoStatusString() const { return _pimpl->repoStatusString(); } Pathname RepoInfo::provideKey(const std::string &keyID_r, const Pathname &targetDirectory_r) const { return zyppng::RepoInfoWorkflow::provideKey( zyppng::SyncContext::defaultContext(), *this, keyID_r, targetDirectory_r ); } void RepoInfo::addBaseUrl( Url url_r ) { for ( const auto & url : _pimpl->baseUrls().raw() ) // Raw unique! if ( url == url_r ) return; _pimpl->baseUrls().raw().push_back( std::move(url_r) ); } void RepoInfo::setBaseUrl( Url url_r ) { _pimpl->baseUrls().raw().clear(); _pimpl->baseUrls().raw().push_back( std::move(url_r) ); } void RepoInfo::setBaseUrls( url_set urls ) { _pimpl->baseUrls().raw().swap( urls ); } void RepoInfo::setPath( const Pathname &path ) { _pimpl->path = path; } void RepoInfo::setType( const repo::RepoType &t ) { _pimpl->setType( t ); } void RepoInfo::setProbedType( const repo::RepoType &t ) const { _pimpl->setProbedType( t ); } void RepoInfo::setMetadataPath( const Pathname &path ) { _pimpl->metadataPath( path ); } void RepoInfo::setPackagesPath( const Pathname &path ) { _pimpl->packagesPath( path ); } Pathname RepoInfo::predownloadPath() const { return _pimpl->predownloadPath(); } void RepoInfo::setKeepPackages( bool keep ) { _pimpl->keeppackages = keep; } void RepoInfo::setService( const std::string& name ) { _pimpl->service = name; } void RepoInfo::setTargetDistribution( const std::string & targetDistribution ) { _pimpl->targetDistro = targetDistribution; } bool RepoInfo::keepPackages() const { return indeterminate(_pimpl->keeppackages) ? false : (bool)_pimpl->keeppackages; } bool RepoInfo::effectiveKeepPackages() const { return keepPackages() || PathInfo(packagesPath().dirname()/".keep_packages").isExist(); } Pathname RepoInfo::metadataPath() const { return _pimpl->metadataPath(); } Pathname RepoInfo::packagesPath() const { return _pimpl->packagesPath(); } bool RepoInfo::usesAutoMetadataPaths() const { return _pimpl->usesAutoMetadataPaths(); } repo::RepoType RepoInfo::type() const { return _pimpl->type(); } Url RepoInfo::mirrorListUrl() const // Variables replaced! { return _pimpl->_mirrorListUrl.transformed(); } Url RepoInfo::rawMirrorListUrl() const // Raw { return _pimpl->_mirrorListUrl.raw(); } bool RepoInfo::gpgKeyUrlsEmpty() const { return _pimpl->gpgKeyUrls().empty(); } RepoInfo::urls_size_type RepoInfo::gpgKeyUrlsSize() const { return _pimpl->gpgKeyUrls().size(); } RepoInfo::url_set RepoInfo::gpgKeyUrls() const // Variables replaced! { return _pimpl->gpgKeyUrls().transformed(); } RepoInfo::url_set RepoInfo::rawGpgKeyUrls() const // Raw { return _pimpl->gpgKeyUrls().raw(); } Url RepoInfo::gpgKeyUrl() const // Variables replaced! { return( _pimpl->gpgKeyUrls().empty() ? Url() : *_pimpl->gpgKeyUrls().transformedBegin() ); } Url RepoInfo::rawGpgKeyUrl() const // Raw { return( _pimpl->gpgKeyUrls().empty() ? Url() : *_pimpl->gpgKeyUrls().rawBegin() ) ; } RepoInfo::url_set RepoInfo::baseUrls() const // Variables replaced! { return _pimpl->baseUrls().transformed(); } RepoInfo::url_set RepoInfo::rawBaseUrls() const // Raw { return _pimpl->baseUrls().raw(); } Pathname RepoInfo::path() const { return _pimpl->path; } std::string RepoInfo::service() const { return _pimpl->service; } std::string RepoInfo::targetDistribution() const { return _pimpl->targetDistro; } Url RepoInfo::rawUrl() const { return( _pimpl->baseUrls().empty() ? Url() : *_pimpl->baseUrls().rawBegin() ); } RepoInfo::urls_const_iterator RepoInfo::baseUrlsBegin() const { return _pimpl->baseUrls().transformedBegin(); } RepoInfo::urls_const_iterator RepoInfo::baseUrlsEnd() const { return _pimpl->baseUrls().transformedEnd(); } RepoInfo::urls_size_type RepoInfo::baseUrlsSize() const { return _pimpl->baseUrls().size(); } bool RepoInfo::baseUrlsEmpty() const { return _pimpl->baseUrls().empty(); } bool RepoInfo::baseUrlSet() const { return _pimpl->baseurl2dump(); } const std::set & RepoInfo::contentKeywords() const { return _pimpl->contentKeywords(); } void RepoInfo::addContent( const std::string & keyword_r ) { _pimpl->addContent( keyword_r ); } bool RepoInfo::hasContent() const { return _pimpl->hasContent(); } bool RepoInfo::hasContent( const std::string & keyword_r ) const { return _pimpl->hasContent( keyword_r ); } /////////////////////////////////////////////////////////////////// bool RepoInfo::hasLicense() const { return hasLicense( std::string() ); } bool RepoInfo::hasLicense( const std::string & name_r ) const { return !_pimpl->licenseTgz( name_r ).empty(); } bool RepoInfo::needToAcceptLicense() const { return needToAcceptLicense( std::string() ); } bool RepoInfo::needToAcceptLicense( const std::string & name_r ) const { const Pathname & licenseTgz( _pimpl->licenseTgz( name_r ) ); if ( licenseTgz.empty() ) return false; // no licenses at all ExternalProgram::Arguments cmd; cmd.push_back( "tar" ); cmd.push_back( "-t" ); cmd.push_back( "-z" ); cmd.push_back( "-f" ); cmd.push_back( licenseTgz.asString() ); ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout ); bool accept = true; static const std::string noAcceptanceFile = "no-acceptance-needed\n"; for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { if ( output == noAcceptanceFile ) { accept = false; } } prog.close(); MIL << "License(" << name_r << ") in " << name() << " has to be accepted: " << (accept?"true":"false" ) << endl; return accept; } std::string RepoInfo::getLicense( const Locale & lang_r ) { return const_cast(this)->getLicense( std::string(), lang_r ); } std::string RepoInfo::getLicense( const Locale & lang_r ) const { return getLicense( std::string(), lang_r ); } std::string RepoInfo::getLicense( const std::string & name_r, const Locale & lang_r ) const { LocaleSet avlocales( getLicenseLocales( name_r ) ); if ( avlocales.empty() ) return std::string(); Locale getLang( Locale::bestMatch( avlocales, lang_r ) ); if ( !getLang && avlocales.find( Locale::noCode ) == avlocales.end() ) { WAR << "License(" << name_r << ") in " << name() << " contains no fallback text!" << endl; // Using the fist locale instead of returning no text at all. // So the user might recognize that there is a license, even if they // can't read it. getLang = *avlocales.begin(); } // now extract the license file. static const std::string licenseFileFallback( "license.txt" ); std::string licenseFile( !getLang ? licenseFileFallback : str::form( "license.%s.txt", getLang.c_str() ) ); ExternalProgram::Arguments cmd; cmd.push_back( "tar" ); cmd.push_back( "-x" ); cmd.push_back( "-z" ); cmd.push_back( "-O" ); cmd.push_back( "-f" ); cmd.push_back( _pimpl->licenseTgz( name_r ).asString() ); // if it not exists, avlocales was empty. cmd.push_back( licenseFile ); std::string ret; ExternalProgram prog( cmd, ExternalProgram::Discard_Stderr ); for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { ret += output; } prog.close(); return ret; } LocaleSet RepoInfo::getLicenseLocales() const { return getLicenseLocales( std::string() ); } LocaleSet RepoInfo::getLicenseLocales( const std::string & name_r ) const { const Pathname & licenseTgz( _pimpl->licenseTgz( name_r ) ); if ( licenseTgz.empty() ) return LocaleSet(); ExternalProgram::Arguments cmd; cmd.push_back( "tar" ); cmd.push_back( "-t" ); cmd.push_back( "-z" ); cmd.push_back( "-f" ); cmd.push_back( licenseTgz.asString() ); LocaleSet ret; ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout ); for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { static const C_Str license( "license." ); static const C_Str dotTxt( ".txt\n" ); if ( str::hasPrefix( output, license ) && str::hasSuffix( output, dotTxt ) ) { if ( output.size() <= license.size() + dotTxt.size() ) // license.txt ret.insert( Locale() ); else ret.insert( Locale( std::string( output.c_str()+license.size(), output.size()- license.size() - dotTxt.size() ) ) ); } } prog.close(); return ret; } /////////////////////////////////////////////////////////////////// std::ostream & RepoInfo::dumpOn( std::ostream & str ) const { RepoInfoBase::dumpOn(str); if ( _pimpl->baseurl2dump() ) { for ( const auto & url : _pimpl->baseUrls().raw() ) { str << "- url : " << url << std::endl; } } // print if non empty value auto strif( [&] ( const std::string & tag_r, const std::string & value_r ) { if ( ! value_r.empty() ) str << tag_r << value_r << std::endl; }); strif( (_pimpl->_mirrorListForceMetalink ? "- metalink : " : "- mirrorlist : "), rawMirrorListUrl().asString() ); strif( "- path : ", path().asString() ); str << "- type : " << type() << std::endl; str << "- priority : " << priority() << std::endl; // Yes No Default(Y) Default(N) #define OUTS(T,B) ( indeterminate(T) ? (std::string("D(")+(B?"Y":"N")+")") : ((bool)T?"Y":"N") ) str << "- gpgcheck : " << OUTS(_pimpl->rawGpgCheck(),gpgCheck()) << " repo" << OUTS(_pimpl->rawRepoGpgCheck(),repoGpgCheck()) << (repoGpgCheckIsMandatory() ? "* ": " " ) << "sig" << asString( validRepoSignature(), "?", "Y", "N" ) << " pkg" << OUTS(_pimpl->rawPkgGpgCheck(),pkgGpgCheck()) << (pkgGpgCheckIsMandatory() ? "* ": " " ) << std::endl; #undef OUTS for ( const auto & url : _pimpl->gpgKeyUrls().raw() ) { str << "- gpgkey : " << url << std::endl; } if ( ! indeterminate(_pimpl->keeppackages) ) str << "- keeppackages: " << keepPackages() << std::endl; strif( "- service : ", service() ); strif( "- targetdistro: ", targetDistribution() ); strif( "- filePath: ", filepath().asString() ); strif( "- metadataPath: ", metadataPath().asString() ); strif( "- packagesPath: ", packagesPath().asString() ); return str; } std::ostream & RepoInfo::dumpAsIniOn( std::ostream & str ) const { RepoInfoBase::dumpAsIniOn(str); if ( _pimpl->baseurl2dump() ) { str << "baseurl="; std::string indent; for ( const auto & url : _pimpl->baseUrls().raw() ) { str << indent << hotfix1050625::asString( url ) << endl; if ( indent.empty() ) indent = " "; // "baseurl=" } } if ( ! _pimpl->path.empty() ) str << "path="<< path() << endl; if ( ! (rawMirrorListUrl().asString().empty()) ) str << (_pimpl->_mirrorListForceMetalink ? "metalink=" : "mirrorlist=") << hotfix1050625::asString( rawMirrorListUrl() ) << endl; if ( type() != repo::RepoType::NONE ) str << "type=" << type().asString() << endl; if ( priority() != defaultPriority() ) str << "priority=" << priority() << endl; if ( ! indeterminate(_pimpl->rawGpgCheck()) ) str << "gpgcheck=" << (_pimpl->rawGpgCheck() ? "1" : "0") << endl; if ( ! indeterminate(_pimpl->rawRepoGpgCheck()) ) str << "repo_gpgcheck=" << (_pimpl->rawRepoGpgCheck() ? "1" : "0") << endl; if ( ! indeterminate(_pimpl->rawPkgGpgCheck()) ) str << "pkg_gpgcheck=" << (_pimpl->rawPkgGpgCheck() ? "1" : "0") << endl; { std::string indent( "gpgkey="); for ( const auto & url : _pimpl->gpgKeyUrls().raw() ) { str << indent << url << endl; if ( indent[0] != ' ' ) indent = " "; } } if (!indeterminate(_pimpl->keeppackages)) str << "keeppackages=" << keepPackages() << endl; if( ! service().empty() ) str << "service=" << service() << endl; return str; } std::ostream & RepoInfo::dumpAsXmlOn( std::ostream & str, const std::string & content ) const { std::string tmpstr; str << "rawGpgCheck()) ) str << " raw_gpgcheck=\"" << (_pimpl->rawGpgCheck() ? "1" : "0") << "\""; if ( ! indeterminate(_pimpl->rawRepoGpgCheck()) ) str << " raw_repo_gpgcheck=\"" << (_pimpl->rawRepoGpgCheck() ? "1" : "0") << "\""; if ( ! indeterminate(_pimpl->rawPkgGpgCheck()) ) str << " raw_pkg_gpgcheck=\"" << (_pimpl->rawPkgGpgCheck() ? "1" : "0") << "\""; if (!(tmpstr = gpgKeyUrl().asString()).empty()) if (!(tmpstr = gpgKeyUrl().asString()).empty()) str << " gpgkey=\"" << escape(tmpstr) << "\""; if (!(tmpstr = mirrorListUrl().asString()).empty()) str << (_pimpl->_mirrorListForceMetalink ? " metalink=\"" : " mirrorlist=\"") << escape(tmpstr) << "\""; str << ">" << endl; if ( _pimpl->baseurl2dump() ) { for_( it, baseUrlsBegin(), baseUrlsEnd() ) // !transform iterator replaces variables str << "" << escape((*it).asString()) << "" << endl; } str << "" << endl; return str; } std::ostream & operator<<( std::ostream & str, const RepoInfo & obj ) { return obj.dumpOn(str); } std::ostream & operator<<( std::ostream & str, const RepoInfo::GpgCheck & obj ) { switch ( obj ) { #define OUTS( V ) case RepoInfo::V: return str << #V; break OUTS( GpgCheck::On ); OUTS( GpgCheck::Strict ); OUTS( GpgCheck::AllowUnsigned ); OUTS( GpgCheck::AllowUnsignedRepo ); OUTS( GpgCheck::AllowUnsignedPackage ); OUTS( GpgCheck::Default ); OUTS( GpgCheck::Off ); OUTS( GpgCheck::indeterminate ); #undef OUTS } return str << "GpgCheck::UNKNOWN"; } bool RepoInfo::requireStatusWithMediaFile () const { // We skip the check for downloading media unless a local copy of the // media file exists and states that there is more than one medium. bool canSkipMediaCheck = std::all_of( baseUrlsBegin(), baseUrlsEnd(), []( const zypp::Url &url ) { return url.schemeIsDownloading(); }); if ( canSkipMediaCheck ) { const auto &mDataPath = metadataPath(); if ( not mDataPath.empty() ) { PathInfo mediafile { mDataPath/"media.1/media" }; if ( mediafile.isExist() ) { repo::SUSEMediaVerifier lverifier { mediafile.path() }; if ( lverifier && lverifier.totalMedia() > 1 ) { canSkipMediaCheck = false; } } } } if ( canSkipMediaCheck ) DBG << "Can SKIP media.1/media check for status calc of repo " << alias() << endl; return not canSkipMediaCheck; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/RepoInfo.h000066400000000000000000000543301476576476200163170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoInfo.h * */ #ifndef ZYPP2_REPOSITORYINFO_H #define ZYPP2_REPOSITORYINFO_H #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoInfo // /** * \short What is known about a repository * * The class RepoInfo represents everything that * is known about a software repository. * * It can be used to store information about known * sources. * * This class tries to be compatible with the * concept of a .repo file used by YUM and * also available in the openSUSE build service. * See man yum.conf. * * Example file * * \code * [ruby] * name=Ruby repository (openSUSE_10.2) * type=rpm-md * baseurl=http://software.opensuse.org/download/ruby/openSUSE_10.2/ * http://some.opensuse.mirror/ruby/openSUSE_10.2/ * gpgcheck=1 * gpgkey=http://software.opensuse.org/openSUSE-Build-Service.asc * enabled=1 * priority=10 * \endcode * * \note A RepoInfo is a hint about how * to create a Repository. * * \note Name, baseUrls and mirrorUrl are subject to repo variable replacement * (\see \ref RepoVariablesStringReplacer). */ class ZYPP_API RepoInfo : public repo::RepoInfoBase { friend std::ostream & operator<<( std::ostream & str, const RepoInfo & obj ); public: RepoInfo(); ~RepoInfo() override; RepoInfo(const RepoInfo &) = default; RepoInfo(RepoInfo &&) = default; RepoInfo &operator=(const RepoInfo &) = default; RepoInfo &operator=(RepoInfo &&) = default; /** Represents no Repository (one with an empty alias). */ static const RepoInfo noRepo; public: /** * The default priority (\c 99). */ static unsigned defaultPriority(); /** * The least priority (unsigned(-1)). */ static unsigned noPriority(); /** * Repository priority for solver. * Some number between \c 1 (highest priority) and \c 99 (\ref defaultPriority). */ unsigned priority() const; /** * Set repository priority for solver. * A \c newval_r of \c 0 sets the default priority. * \see \ref priority. */ void setPriority( unsigned newval_r ); using url_set = std::list; using urls_size_type = url_set::size_type; using urls_const_iterator = transform_iterator; /** * whether repository urls are available */ bool baseUrlsEmpty() const; /** * Whether there are manualy configured repository urls. * If \c false, a mirrorlist might be used. */ bool baseUrlSet() const; /** * number of repository urls */ urls_size_type baseUrlsSize() const; /** * iterator that points at begin of repository urls */ urls_const_iterator baseUrlsBegin() const; /** * iterator that points at end of repository urls */ urls_const_iterator baseUrlsEnd() const; /** * Pars pro toto: The first repository url */ Url url() const { return( baseUrlsEmpty() ? Url() : *baseUrlsBegin()); } /** * Pars pro toto: The first repository raw url (no variables replaced) */ Url rawUrl() const; /** * The complete set of repository urls * * These are either the configured baseurls, or if empty, the downloaded * mirror list (\see \ref mirrorListUrl) */ url_set baseUrls() const; /** * The complete set of raw repository urls (no variables replaced) */ url_set rawBaseUrls() const; /** * Add a base url. \see baseUrls * \param url The base url for the repository. * * To recreate the base URLs list, use \ref setBaseUrl(const Url &) followed * by addBaseUrl(). */ void addBaseUrl( Url url ); /** * Clears current base URL list and adds \a url. */ void setBaseUrl( Url url ); /** * Clears current base URL list and adds an \ref url_set. */ void setBaseUrls( url_set urls ); /** * \short Repository path * * Pathname relative to the base Url where the product/repository * is located * * For media containing more than one product, or repositories not * located at the root of the media it is important to know the path * to the product directory relative to the media root. So a media * verifier can be set for that media. You may also read it as * baseUrl = url to mount and path = path on the * mounted media. * * It is not mandatory, and the default is \c /. * * \note As a repository can have multiple Urls, the path is unique and * the same for all Urls, so it is assumed all the Urls have the * same media layout. * */ Pathname path() const; /** * set the product path. \see path() * \param path the path to the product */ void setPath( const Pathname &path ); /** * Url of a file which contains a list of repository urls */ Url mirrorListUrl() const; /** * The raw mirrorListUrl (no variables replaced). */ Url rawMirrorListUrl() const; /** * Set mirror list url. \see mirrorListUrl * \param url The base url for the list */ void setMirrorListUrl( const Url &url ); /** Like \ref setMirrorListUrl but take an \a url_set */ void setMirrorListUrls( url_set urls ); /** Like \ref setMirrorListUrl but expect metalink format. */ void setMetalinkUrl( const Url &url ); /** Like \ref setMirrorListUrls but expect metalink format. */ void setMetalinkUrls( url_set urls ); /** * Type of repository, * */ repo::RepoType type() const; /** * This allows to adjust the \ref RepoType lazy, from \c NONE to * some probed value, even for const objects. * * This is a NOOP if the current type is not \c NONE. */ void setProbedType( const repo::RepoType &t ) const; /** * set the repository type \see type * \param t */ void setType( const repo::RepoType &t ); /** * \short Path where this repo metadata was read from * * \note could be an empty pathname for repo * infos created in memory. */ Pathname metadataPath() const; /** * \short Set the path where the local metadata is stored * * The path to the repositories metadata is usually provided by * the RepoManager. If you want to use a temporary repository * (not under RepoManagers control), and you set a metadataPath * with basename \c %AUTO%, all data directories (raw metadata, * solv file and package cache) will be created by replacing \c %AUTO% * with \c %RAW%, \c %SLV% or \c %PKG% . This will change the value * of \ref packagesPath accordingly, unless you assigned a custom * value using \ref setPackagesPath. * * \code * RepoInfo repo; * repo.setAlias( "Temp" ); * repo.setBaseUrl( Url("http://someserver/somepath/") ); * repo.setMetadataPath( "/tmp/temprepodata/%AUTO%" ); * * // will use * // /tmp/temprepodata/%RAW% - raw metadata * // /%SLV% - solv file * // /%PKG% - packages *\endcode * * \param path directory path */ void setMetadataPath( const Pathname &path ); /** Whether \ref metadataPath uses \c %AUTO% setup. */ bool usesAutoMetadataPaths() const; /** * \short Path where this repo packages are cached */ Pathname packagesPath() const; /** * \short set the path where the local packages are stored * * \param path directory path */ void setPackagesPath( const Pathname &path ); /** * \short Path where this repo packages are predownloaded */ Pathname predownloadPath() const; /** \name Repository gpgchecks * How signature checking should be performed for this repo. * * The values are computed based in the settings of \c gpgcheck, \c repo_gpgcheck * end \c pkg_gpgcheck in \c zypp.conf. Explicitly setting these values in the * repositories \a .repo file will overwrite the defaults from \c zypp.conf for this * repo. * * If \c gpgcheck is \c on (the default) we will check the signature of repo metadata * (packages are secured via checksum inside the metadata). Using unsigned repos * needs to be confirmed. * Packages from signed repos are accepted if their checksum matches the checksum * stated in the repo metadata. * Packages from unsigned repos need a valid gpg signature, using unsigned packages * needs to be confirmed. * * The above default behavior can be tuned by explicitly setting \c repo_gpgcheck * and/or \c pkg_gpgcheck: * * \c repo_gpgcheck = \c on same as the default. * * \c repo_gpgcheck = \c off will silently accept unsigned repos. It will NOT turn of * signature checking on the whole. Nevertheless, it's not a secure setting. * * \c pkg_gpgcheck = \c on will enforce the package signature checking and the need * to confirm unsigned packages for all repos (signed and unsigned). * * \c pkg_gpgcheck = \c off will silently accept unsigned packages. It will NOT turn of * signature checking on the whole. Nevertheless, it's not a secure setting. * * If \c gpgCheck is \c off (not recommneded), no checks are performed. You can still * enable them individually by setting \c repo_gpgcheck and/or \c pkg_gpgcheck to \c on. * * \code * R: check repo signature is mandatory, confirm unsigned repos * r: check repo signature, unsigned repos are ok but enforce p * : do not check repo signatures * * P: check package signature always, confirm unsigned packages * p: like P for unsigned repos, accepted by checksum for signed repos * b: like p but accept unsigned packages * : do not check package signatures * pkg_ * gpgcheck 1| * 0 1 * ------------------------------------ * repo_ *1| R/p R/b R/P * 0| r/p r/b r/P * * pkg_ * gpgcheck 0| * 0 1 * ------------------------------------ * repo_ *0| P * 1| R R R/P * \endcode */ //@{ /** Whether default signature checking should be performed. */ bool gpgCheck() const; /** Set the value for \ref gpgCheck (or \c indeterminate to use the default). */ void setGpgCheck( TriBool value_r ); /** \overload \deprecated legacy and for squid */ void setGpgCheck( bool value_r ); /** Whether the signature of repo metadata should be checked for this repo. */ bool repoGpgCheck() const; /** Mandatory check (\ref repoGpgCheck is \c on) must ask to confirm using unsigned repos. */ bool repoGpgCheckIsMandatory() const; /** Set the value for \ref repoGpgCheck (or \c indeterminate to use the default). */ void setRepoGpgCheck( TriBool value_r ); /** Whether the signature of rpm packages should be checked for this repo. */ bool pkgGpgCheck() const; /** Mandatory check (\ref pkgGpgCheck is not \c off) must ask to confirm using unsigned packages. */ bool pkgGpgCheckIsMandatory() const; /** Set the value for \ref pkgGpgCheck (or \c indeterminate to use the default). */ void setPkgGpgCheck( TriBool value_r ); /** Whether the repo metadata are signed and successfully validated or \c indeterminate if unsigned. * The value is usually set by \ref repo::Downloader when retrieving the metadata. */ TriBool validRepoSignature() const; /** Set the value for \ref validRepoSignature (or \c indeterminate if unsigned). */ void setValidRepoSignature( TriBool value_r ); /** Some predefined settings */ enum class GpgCheck { indeterminate, //< not specified On, //< 1** --gpgcheck Strict, //< 111 --gpgcheck-strict AllowUnsigned, //< 100 --gpgcheck-allow-unsigned AllowUnsignedRepo, //< 10* --gpgcheck-allow-unsigned-repo AllowUnsignedPackage, //< 1*0 --gpgcheck-allow-unsigned-package Default, //< *** --default-gpgcheck Off, //< 0** --no-gpgcheck }; /** Adjust *GpgCheck settings according to \a mode_r. * \c GpgCheck::indeterminate will leave the settings as they are. * \return whether setting were changed */ bool setGpgCheck( GpgCheck mode_r ); //@} /** Whether gpgkey URLs are defined */ bool gpgKeyUrlsEmpty() const; /** Number of gpgkey URLs defined */ urls_size_type gpgKeyUrlsSize() const; /** The list of gpgkey URLs defined for this repo */ url_set gpgKeyUrls() const; /** The list of raw gpgkey URLs defined for this repo (no variables replaced) */ url_set rawGpgKeyUrls() const; /** Set a list of gpgkey URLs defined for this repo */ void setGpgKeyUrls( url_set urls ); /** (leagcy API) The 1st gpgkey URL defined for this repo */ Url gpgKeyUrl() const; /** (leagcy API) The 1st raw gpgkey URL defined for this repo (no variables replaced) */ Url rawGpgKeyUrl() const; /** (leagcy API) Set the gpgkey URL defined for this repo */ void setGpgKeyUrl( const Url &gpgkey ); /** downloads all configured gpg keys into the defined directory */ Pathname provideKey(const std::string &keyID_r, const Pathname &targetDirectory_r ) const; /** * \short Whether packages downloaded from this repository will be kept in local cache */ bool keepPackages() const; /** * \short Set if packaqes downloaded from this repository will be kept in local cache * * If the setting is true, all downloaded packages from this repository will be * copied to the local raw cache. * * \param keep true (keep the downloaded packages) or false (delete them after installation) * */ void setKeepPackages( bool keep ); /** \ref keepPackages unless the package cache itself enforces keeping the packages. * This can be done by creating a file named \c .keep_packages in the package * cache's toplevel directory (e.g. /var/cache/zypp/packages/.keep_packages) */ bool effectiveKeepPackages() const; /** * Gets name of the service to which this repository belongs or empty string * if it has been added manually. */ std::string service() const; /** * sets service which added this repository */ void setService( const std::string& name ); /** * Distribution for which is this repository meant. */ std::string targetDistribution() const; /** * Sets the distribution for which is this repository meant. This is * an in-memory value only, does not get written to the .repo file upon * saving. */ void setTargetDistribution(const std::string & targetDistribution); /** Content keywords defined. */ const std::set & contentKeywords() const; /** Add content keywords */ void addContent( const std::string & keyword_r ); /** \overload add keywords from container */ template void addContentFrom( TIterator begin_r, TIterator end_r ) { for_( it, begin_r, end_r ) addContent( *it ); } /** \overload */ template void addContentFrom( const TContainer & container_r ) { addContentFrom( container_r.begin(), container_r.end() ); } /** Check for content keywords. * They may be missing due to missing metadata in disabled repos. */ bool hasContent() const; /** \overload check for a keywords being present */ bool hasContent( const std::string & keyword_r ) const; /** \overload check for \b all keywords being present */ template bool hasContentAll( TIterator begin_r, TIterator end_r ) const { for_( it, begin_r, end_r ) if ( ! hasContent( *it ) ) return false; return true; } /** \overload */ template bool hasContentAll( const TContainer & container_r ) const { return hasContentAll( container_r.begin(), container_r.end() ); } /** \overload check for \b any keyword being present */ template bool hasContentAny( TIterator begin_r, TIterator end_r ) const { for_( it, begin_r, end_r ) if ( hasContent( *it ) ) return true; return false; } /** \overload */ template bool hasContentAny( const TContainer & container_r ) const { return hasContentAny( container_r.begin(), container_r.end() ); } public: /** \name Repository/Product license * In case a repository provides multiple license tarballs in repomd.xml * \code * ... * ... * ... * \endcode * you can address the individual licenses by passing their name * (e.g. \c "sles" to access the \c type="license-sles"). * No on an empty name will refer to \c type="license". */ //@{ /** Whether there is a license associated with the repo. */ bool hasLicense() const; /** \overload taking a (product)name */ bool hasLicense( const std::string & name_r ) const; /** Whether the repo license has to be accepted, e.g. there is no * no acceptance needed for openSUSE. */ bool needToAcceptLicense() const; /** \overload taking a (product)name */ bool needToAcceptLicense( const std::string & name_r ) const; /** Return the best license for the current (or a specified) locale. */ std::string getLicense( const Locale & lang_r = Locale() ) const; /** \overload not const LEGACY API */ std::string getLicense( const Locale & lang_r = Locale() ); // LEGACY API /** \overload taking a (product)name */ std::string getLicense( const std::string & name_r, const Locale & lang_r = Locale() ) const; /** Return the locales the license is available for. * \ref Locale::noCode is included in case of \c license.txt which does * not specify a specific locale. */ LocaleSet getLicenseLocales() const; /** \overload taking a (product)name */ LocaleSet getLicenseLocales( const std::string & name_r ) const; //@} /** * Returns true if this repository requires the media.1/media file to be included * in the metadata status and repo status calculations. */ bool requireStatusWithMediaFile () const; public: /** * Write a human-readable representation of this RepoInfo object * into the \a str stream. Useful for logging. */ std::ostream & dumpOn( std::ostream & str ) const override; /** * Write this RepoInfo object into \a str in a .repo
file format. * Raw values, no variable replacement. */ std::ostream & dumpAsIniOn( std::ostream & str ) const override; /** * Write an XML representation of this RepoInfo object. * Repo variables replaced. * * \param str * \param content this argument is ignored (used in other classed derived * from RepoInfoBase. */ std::ostream & dumpAsXmlOn( std::ostream & str, const std::string & content = "" ) const override; /** Raw values for RepoManager * \internal */ void getRawGpgChecks( TriBool & g_r, TriBool & r_r, TriBool & p_r ) const; /** A string value to track changes requiring a refresh. * The strings value is arbitrary but it should change if the * repositories URL changes. * \internal */ std::string repoStatusString() const; struct Impl; private: friend class RepoManager; /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates RepoInfo */ using RepoInfo_Ptr = shared_ptr; /** \relates RepoInfo */ using RepoInfo_constPtr = shared_ptr; /** \relates RepoInfo */ using RepoInfoList = std::list; /** \relates RepoInfo Stream output */ std::ostream & operator<<( std::ostream & str, const RepoInfo & obj ) ZYPP_API; /** \relates RepoInfo::GpgCheck Stream output */ std::ostream & operator<<( std::ostream & str, const RepoInfo::GpgCheck & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP2_REPOSITORYINFO_H libzypp-17.36.5/zypp/RepoManager.cc000066400000000000000000000266321476576476200171400ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoManager.cc * */ #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" using std::endl; using std::string; using namespace zypp::repo; #define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc() /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class RepoManager::Impl /// \brief RepoManager implementation. /// /////////////////////////////////////////////////////////////////// struct ZYPP_LOCAL RepoManager::Impl { public: Impl( zyppng::SyncContextRef &&ctx, RepoManagerOptions &&opt) { _ngMgr = zyppng::SyncRepoManager::create( std::move(ctx), std::move(opt) ).unwrap(); } Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; public: const zyppng::SyncRepoManager &ngMgr() const { return *_ngMgr; } zyppng::SyncRepoManager &ngMgr() { return *_ngMgr; } private: zyppng::SyncRepoManagerRef _ngMgr; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( zyppng::SyncContextRef(_ngMgr->zyppContext()), RepoManagerOptions(_ngMgr->options()) ); } }; /////////////////////////////////////////////////////////////////// /** \relates RepoManager::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const RepoManager::Impl & obj ) { return str << "RepoManager::Impl"; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoManager // /////////////////////////////////////////////////////////////////// RepoManager::RepoManager( RepoManagerOptions opt ) : _pimpl( new Impl( zyppng::SyncContext::defaultContext(), std::move(opt)) ) {} RepoManager::~RepoManager() {} bool RepoManager::repoEmpty() const { return _pimpl->ngMgr().repoEmpty(); } RepoManager::RepoSizeType RepoManager::repoSize() const { return _pimpl->ngMgr().repoSize(); } RepoManager::RepoConstIterator RepoManager::repoBegin() const { return _pimpl->ngMgr().repoBegin(); } RepoManager::RepoConstIterator RepoManager::repoEnd() const { return _pimpl->ngMgr().repoEnd(); } RepoInfo RepoManager::getRepo( const std::string & alias ) const { return _pimpl->ngMgr().getRepo( alias ); } bool RepoManager::hasRepo( const std::string & alias ) const { return _pimpl->ngMgr().hasRepo( alias ); } std::string RepoManager::makeStupidAlias( const Url & url_r ) { std::string ret( url_r.getScheme() ); if ( ret.empty() ) ret = "repo-"; else ret += "-"; std::string host( url_r.getHost() ); if ( ! host.empty() ) { ret += host; ret += "-"; } static Date::ValueType serial = Date::now(); ret += Digest::digest( Digest::sha1(), str::hexstring( ++serial ) +url_r.asCompleteString() ).substr(0,8); return ret; } RepoStatus RepoManager::metadataStatus( const RepoInfo & info ) const { return _pimpl->ngMgr().metadataStatus( info ).unwrap(); } RepoManager::RefreshCheckStatus RepoManager::checkIfToRefreshMetadata( const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy ) { return _pimpl->ngMgr().checkIfToRefreshMetadata( info, url, policy ).unwrap(); } Pathname RepoManager::metadataPath( const RepoInfo &info ) const { return _pimpl->ngMgr().metadataPath( info ).unwrap(); } Pathname RepoManager::packagesPath( const RepoInfo &info ) const { return _pimpl->ngMgr().packagesPath( info ).unwrap(); } void RepoManager::refreshMetadata( const RepoInfo &info, RawMetadataRefreshPolicy policy, const ProgressData::ReceiverFnc & progressrcv ) { // Suppress (interactive) media::MediaChangeReport if we in have multiple basurls (>1) zypp::media::ScopedDisableMediaChangeReport guard( info.baseUrlsSize() > 1 ); return _pimpl->ngMgr().refreshMetadata( info, policy, nullptr ).unwrap(); } void RepoManager::cleanMetadata( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().cleanMetadata( info, nullptr ).unwrap(); } void RepoManager::cleanPackages( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().cleanPackages( info, nullptr ).unwrap(); } RepoStatus RepoManager::cacheStatus( const RepoInfo &info ) const { return _pimpl->ngMgr().cacheStatus( info ).unwrap(); } void RepoManager::buildCache( const RepoInfo &info, CacheBuildPolicy policy, const ProgressData::ReceiverFnc & progressrcv ) { callback::SendReport report; auto adapt = zyppng::ProgressObserverAdaptor( progressrcv, report ); return _pimpl->ngMgr().buildCache( info, policy, adapt.observer() ).unwrap(); } void RepoManager::cleanCache( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().cleanCache( info, nullptr ).unwrap(); } bool RepoManager::isCached( const RepoInfo &info ) const { return _pimpl->ngMgr().isCached( info ).unwrap(); } void RepoManager::loadFromCache( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().loadFromCache( info, nullptr ).unwrap(); } void RepoManager::cleanCacheDirGarbage( const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().cleanCacheDirGarbage( nullptr ).unwrap(); } repo::RepoType RepoManager::probe( const Url & url, const Pathname & path ) const { return _pimpl->ngMgr().probe( url, path ).unwrap(); } repo::RepoType RepoManager::probe( const Url & url ) const { return _pimpl->ngMgr().probe( url ).unwrap(); } void RepoManager::addRepository( const RepoInfo &info, const ProgressData::ReceiverFnc & progressrcv ) { callback::SendReport report; auto adapt = zyppng::ProgressObserverAdaptor( progressrcv, report ); RepoInfo updatedRepo = _pimpl->ngMgr().addRepository( info, adapt.observer() ).unwrap(); // We should fix the API as we must inject those paths // into the repoinfo in order to keep it usable. RepoInfo & oinfo( const_cast(info) ); oinfo.setFilepath( updatedRepo.filepath() ); oinfo.setMetadataPath( zyppng::rawcache_path_for_repoinfo( _pimpl->ngMgr().options(), updatedRepo ).unwrap() ); oinfo.setPackagesPath( zyppng::packagescache_path_for_repoinfo( _pimpl->ngMgr().options(), updatedRepo ).unwrap() ); } void RepoManager::addRepositories( const Url &url, const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().addRepositories( url, nullptr ).unwrap(); } void RepoManager::removeRepository( const RepoInfo & info, const ProgressData::ReceiverFnc & progressrcv ) { callback::SendReport report; auto adapt = zyppng::ProgressObserverAdaptor( progressrcv, report ); return _pimpl->ngMgr().removeRepository( info, adapt.observer() ).unwrap(); } void RepoManager::modifyRepository( const std::string &alias, const RepoInfo & newinfo, const ProgressData::ReceiverFnc & progressrcv ) { RepoInfo updated = _pimpl->ngMgr().modifyRepository( alias, newinfo, nullptr ).unwrap(); // We should fix the API as we must inject those paths // into the repoinfo in order to keep it usable. RepoInfo & oinfo( const_cast(newinfo) ); oinfo.setFilepath( updated.filepath()); oinfo.setMetadataPath( zyppng::rawcache_path_for_repoinfo( _pimpl->ngMgr().options(), updated ).unwrap() ); oinfo.setPackagesPath( zyppng::packagescache_path_for_repoinfo( _pimpl->ngMgr().options(), updated ).unwrap() ); } RepoInfo RepoManager::getRepositoryInfo( const std::string &alias, const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().getRepositoryInfo( alias ).unwrap(); } RepoInfo RepoManager::getRepositoryInfo( const Url & url, const url::ViewOption & urlview, const ProgressData::ReceiverFnc & progressrcv ) { return _pimpl->ngMgr().getRepositoryInfo( url, urlview ).unwrap(); } bool RepoManager::serviceEmpty() const { return _pimpl->ngMgr().serviceEmpty(); } RepoManager::ServiceSizeType RepoManager::serviceSize() const { return _pimpl->ngMgr().serviceSize(); } RepoManager::ServiceConstIterator RepoManager::serviceBegin() const { return _pimpl->ngMgr().serviceBegin(); } RepoManager::ServiceConstIterator RepoManager::serviceEnd() const { return _pimpl->ngMgr().serviceEnd(); } ServiceInfo RepoManager::getService( const std::string & alias ) const { return _pimpl->ngMgr().getService( alias ); } bool RepoManager::hasService( const std::string & alias ) const { return _pimpl->ngMgr().hasService( alias ); } repo::ServiceType RepoManager::probeService( const Url &url ) const { return _pimpl->ngMgr().probeService( url ).unwrap(); } void RepoManager::addService( const std::string & alias, const Url& url ) { return _pimpl->ngMgr().addService( alias, url ).unwrap(); } void RepoManager::addService( const ServiceInfo & service ) { return _pimpl->ngMgr().addService( service ).unwrap(); } void RepoManager::removeService( const std::string & alias ) { return _pimpl->ngMgr().removeService( alias ).unwrap(); } void RepoManager::removeService( const ServiceInfo & service ) { return _pimpl->ngMgr().removeService( service ).unwrap(); } void RepoManager::refreshServices( const RefreshServiceOptions & options_r ) { return _pimpl->ngMgr().refreshServices( options_r ).unwrap(); } void RepoManager::refreshService( const std::string & alias, const RefreshServiceOptions & options_r ) { return _pimpl->ngMgr().refreshService( alias, options_r ).unwrap(); } void RepoManager::refreshService( const ServiceInfo & service, const RefreshServiceOptions & options_r ) { return _pimpl->ngMgr().refreshService( service, options_r ).unwrap(); } void RepoManager::modifyService( const std::string & oldAlias, const ServiceInfo & service ) { return _pimpl->ngMgr().modifyService( oldAlias, service ).unwrap(); } void RepoManager::refreshGeoIp (const RepoInfo::url_set &urls) { (void) _pimpl->ngMgr().refreshGeoIp( urls ); } //////////////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const RepoManager & obj ) { return str << *obj._pimpl; } std::list readRepoFile(const Url &repo_file) { return zyppng::RepoManagerWorkflow::readRepoFile( zyppng::SyncContext::defaultContext (), repo_file ).unwrap(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/RepoManager.h000066400000000000000000000602571476576476200170030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/RepoManager.h * */ #ifndef ZYPP_REPOMANAGER_H #define ZYPP_REPOMANAGER_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** * Parses \a repo_file and returns a list of \ref RepoInfo objects * corresponding to repositories found within the file. * * \param repo_file Valid URL of the repo file. The URL is subject to * repo variable expansion. * * \return found list * * \throws MediaException If the access to the url fails * \throws ParseException If the file parsing fails * \throws Exception On other errors. */ std::list readRepoFile(const Url & repo_file) ZYPP_API; /** * \short creates and provides information about known sources. * */ class ZYPP_API RepoManager { friend std::ostream & operator<<( std::ostream & str, const RepoManager & obj ); public: /** Implementation */ struct Impl; /** ServiceInfo typedefs */ using ServiceSet = std::set; using ServiceConstIterator = ServiceSet::const_iterator; using ServiceSizeType = ServiceSet::size_type; /** RepoInfo typedefs */ using RepoSet = std::set; using RepoConstIterator = RepoSet::const_iterator; using RepoSizeType = RepoSet::size_type; public: RepoManager( RepoManagerOptions options = RepoManagerOptions() ); /** Dtor */ ~RepoManager(); using RawMetadataRefreshPolicy = RepoManagerFlags::RawMetadataRefreshPolicy; static constexpr RawMetadataRefreshPolicy RefreshIfNeeded = RepoManagerFlags::RefreshIfNeeded; static constexpr RawMetadataRefreshPolicy RefreshForced = RepoManagerFlags::RefreshForced; static constexpr RawMetadataRefreshPolicy RefreshIfNeededIgnoreDelay = RepoManagerFlags::RefreshIfNeededIgnoreDelay; using CacheBuildPolicy = RepoManagerFlags::CacheBuildPolicy; static constexpr CacheBuildPolicy BuildIfNeeded = CacheBuildPolicy::BuildIfNeeded; static constexpr CacheBuildPolicy BuildForced = CacheBuildPolicy::BuildForced; /** Flags for tuning RefreshService */ using RefreshServiceBit = RepoManagerFlags::RefreshServiceBit; static constexpr RefreshServiceBit RefreshService_restoreStatus = RefreshServiceBit::RefreshService_restoreStatus; static constexpr RefreshServiceBit RefreshService_forceRefresh = RefreshServiceBit::RefreshService_forceRefresh; using RefreshServiceFlags = RepoManagerFlags::RefreshServiceFlags; /** Options tuning RefreshService */ using RefreshServiceOptions = RepoManagerFlags::RefreshServiceFlags; /** \name Known repositories. * * The known repositories are read from * \ref RepoManagerOptions::knownReposPath passed on the Ctor. * Which defaults to ZYpp global settings. */ //@{ bool repoEmpty() const; RepoSizeType repoSize() const; RepoConstIterator repoBegin() const; RepoConstIterator repoEnd() const; Iterable repos() const; /** List of known repositories. */ std::list knownRepositories() const { return std::list(repoBegin(),repoEnd()); } /** Find RepoInfo by alias or return \ref RepoInfo::noRepo. */ RepoInfo getRepo( const std::string & alias ) const; /** \overload Take alias from RepoInfo. */ RepoInfo getRepo( const RepoInfo & info_r ) const { return getRepo( info_r.alias() ); } /** Return whether there is a known repository for \c alias. */ bool hasRepo( const std::string & alias ) const; /** \overload Take alias from RepoInfo. */ bool hasRepo( const RepoInfo & info_r ) const { return hasRepo( info_r.alias() ); } /** Some stupid string but suitable as alias for your url if nothing better is available. * Something like \c "http-download.opensuse.org-83df67e5" */ static std::string makeStupidAlias( const Url & url_r = Url() ); //@} /** * \short Status of local metadata */ RepoStatus metadataStatus( const RepoInfo &info ) const; using RefreshCheckStatus = RepoManagerFlags::RefreshCheckStatus; static constexpr RefreshCheckStatus REFRESH_NEEDED = RefreshCheckStatus::REFRESH_NEEDED; /**< refresh is needed */ static constexpr RefreshCheckStatus REPO_UP_TO_DATE = RefreshCheckStatus::REPO_UP_TO_DATE; /**< repository not changed */ static constexpr RefreshCheckStatus REPO_CHECK_DELAYED = RefreshCheckStatus::REPO_CHECK_DELAYED; /**< refresh is delayed due to settings */ /** * Checks whether to refresh metadata for specified repository and url. *

to // mount /dev/ /tmp_mount // mount /tmp_mount/ --bind -o ro // FIXME: try all filesystems if(_device.empty()) ZYPP_THROW(MediaBadUrlEmptyDestinationException(url())); PathInfo dev_info(_device); if(!dev_info.isBlk()) ZYPP_THROW(MediaBadUrlEmptyDestinationException(url())); #if DELAYED_VERIFY DBG << "Verifying " << _device << " ..." << std::endl; if( !verifyIfDiskVolume( _device)) { ZYPP_THROW(MediaBadUrlEmptyDestinationException(_url)); } #endif if(_filesystem.empty()) ZYPP_THROW(MediaBadUrlEmptyFilesystemException(url())); MediaSourceRef media( new MediaSource( "disk", _device, dev_info.devMajor(), dev_info.devMinor() )); AttachedMedia ret( findAttachedMedia( media)); if( ret.mediaSource && ret.attachPoint && !ret.attachPoint->empty()) { DBG << "Using a shared media " << ret.mediaSource->name << " attached on " << ret.attachPoint->path << endl; removeAttachPoint(); setAttachPoint(ret.attachPoint); setMediaSource(ret.mediaSource); return; } MediaManager manager; MountEntries entries( manager.getMountEntries()); MountEntries::const_iterator e; for( e = entries.begin(); e != entries.end(); ++e) { bool is_device = false; std::string dev_path(Pathname(e->src).asString()); PathInfo dev_info; if( dev_path.compare(0, sizeof("/dev/")-1, "/dev/") == 0 && dev_info(e->src) && dev_info.isBlk()) { is_device = true; } if( is_device && media->maj_nr == dev_info.devMajor() && media->min_nr == dev_info.devMinor()) { AttachPointRef ap( new AttachPoint(e->dir, false)); AttachedMedia am( media, ap); { DBG << "Using a system mounted media " << media->name << " attached on " << ap->path << endl; media->iown = false; // mark attachment as foreign setMediaSource(media); setAttachPoint(ap); return; } } } if( !isUseableAttachPoint( attachPoint() ) ) { setAttachPoint( createAttachPoint(), true ); } std::string mountpoint( attachPoint().asString() ); Mount mount; std::string options = _url.getQueryParam("mountoptions"); if(options.empty()) { options = "ro"; } if( !media->bdir.empty()) { options += ",bind"; mount.mount(media->bdir, mountpoint, "none", options); } else { mount.mount(_device, mountpoint, _filesystem, options); } setMediaSource(media); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; while( !(mountsucceeded=isAttached()) && --limit) { sleep(1); } if( !mountsucceeded) { setMediaSource(MediaSourceRef()); try { mount.umount(attachPoint().asString()); } catch (const MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW(MediaMountException( "Unable to verify that the media was mounted", _device, mountpoint )); } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaDISK::isAttached // METHOD TYPE : bool // // DESCRIPTION : Override check if media is attached. // bool MediaDISK::isAttached() const { return checkAttached(false); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDISK::releaseFrom // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaDISK::releaseFrom( const std::string & ejectDev ) { AttachedMedia am( attachedMedia()); if(am.mediaSource && am.mediaSource->iown) { Mount mount; mount.umount(attachPoint().asString()); } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaDISK::getFile // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaDISK::getFile ( const OnMediaLocation &file ) const { MediaHandler::getFile( file ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaDISK::getDir // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaDISK::getDir( const Pathname & dirname, bool recurse_r ) const { MediaHandler::getDir( dirname, recurse_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDISK::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaDISK::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaDISK::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaDISK::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } bool MediaDISK::getDoesFileExist( const Pathname & filename ) const { return MediaHandler::getDoesFileExist( filename ); } } // namespace media } // namespace zypp // vim: set ts=8 sts=2 sw=2 ai noet: libzypp-17.36.5/zypp/media/MediaDISK.h000066400000000000000000000042321476576476200173430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaDISK.h * */ #ifndef ZYPP_MEDIA_MEDIADISK_H #define ZYPP_MEDIA_MEDIADISK_H #include namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaDISK /** * @short Implementation class for DISK MediaHandler * @see MediaHandler **/ class MediaDISK : public MediaHandler { private: std::string _device; std::string _filesystem; protected: void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; bool getDoesFileExist( const Pathname & filename ) const override; public: MediaDISK( const Url & url_r, const Pathname & attach_point_hint_r ); ~MediaDISK() override { try { release(); } catch(...) {} } bool isAttached() const override; bool verifyIfDiskVolume(const Pathname &name); }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIADISK_H libzypp-17.36.5/zypp/media/MediaException.h000066400000000000000000000000451476576476200205450ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/MediaHandler.cc000066400000000000000000001043471476576476200203340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaHandler.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; // use directory.yast on every media (not just via ftp/http) #define NONREMOTE_DIRECTORY_YAST 1 namespace zypp { namespace media { Pathname MediaHandler::_attachPrefix(""); /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaHandler // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::MediaHandler // METHOD TYPE : Constructor // // DESCRIPTION : // MediaHandler::MediaHandler ( Url url_r, const Pathname & attach_point_r, Pathname urlpath_below_attachpoint_r, const bool does_download_r ) : _mediaSource() , _attachPoint( new AttachPoint()) , _attachPointHint() , _relativeRoot(std::move( urlpath_below_attachpoint_r)) , _does_download( does_download_r ) , _attach_mtime(0) , _url(std::move( url_r )) , _parentId(0) { Pathname real_attach_point( getRealPath(attach_point_r.asString())); if ( !real_attach_point.empty() ) { /////////////////////////////////////////////////////////////////// // check if provided attachpoint is usable. /////////////////////////////////////////////////////////////////// PathInfo adir( real_attach_point ); // // The verify if attach_point_r isn't a mountpoint of another // device is done in the particular media handler (if needed). // // We just verify, if attach_point_r is a directory and for // schemes other than "file" and "dir", if it is absolute. // if ( !adir.isDir() || (_url.getScheme() != "file" && _url.getScheme() != "dir" && !real_attach_point.absolute()) ) { ERR << "Provided attach point is not a absolute directory: " << adir << endl; } else { attachPointHint( real_attach_point, false); setAttachPoint( real_attach_point, false); } } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::~MediaHandler // METHOD TYPE : Destructor // // DESCRIPTION : // MediaHandler::~MediaHandler() { try { removeAttachPoint(); } catch(...) {} } void MediaHandler::resetParentId() { _parentId = 0; } std::string MediaHandler::getRealPath(const std::string &path) { return getRealPath(zypp::Pathname(path)).asString(); } zypp::Pathname MediaHandler::getRealPath(const Pathname &path) { return path.realpath(); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::removeAttachPoint // METHOD TYPE : void // // DESCRIPTION : // void MediaHandler::removeAttachPoint() { if ( _mediaSource ) { INT << "MediaHandler deleted with media attached." << endl; return; // no cleanup if media still mounted! } DBG << "MediaHandler - checking if to remove attach point" << endl; if ( _attachPoint.unique() && _attachPoint->temp && !_attachPoint->path.empty() && PathInfo(_attachPoint->path).isDir()) { Pathname path(_attachPoint->path); setAttachPoint("", true); int res = recursive_rmdir( path ); if ( res == 0 ) { MIL << "Deleted default attach point " << path << endl; } else { ERR << "Failed to Delete default attach point " << path << " errno(" << res << ")" << endl; } } else { if( !_attachPoint->path.empty() && !_attachPoint->temp) DBG << "MediaHandler - attachpoint is not temporary" << endl; } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attachPoint // METHOD TYPE : Pathname // // DESCRIPTION : // Pathname MediaHandler::attachPoint() const { return _attachPoint->path; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attachPoint // METHOD TYPE : // // DESCRIPTION : // void MediaHandler::setAttachPoint(const Pathname &path, bool temporary) { _attachPoint.reset( new AttachPoint(path, temporary)); } Pathname MediaHandler::localRoot() const { if( _attachPoint->path.empty()) return Pathname(); else return _attachPoint->path + _relativeRoot; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attachPoint // METHOD TYPE : // // DESCRIPTION : // void MediaHandler::setAttachPoint(const AttachPointRef &ref) { if( ref) AttachPointRef(ref).swap(_attachPoint); else _attachPoint.reset( new AttachPoint()); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attachPointHint // METHOD TYPE : void // // DESCRIPTION : // void MediaHandler::attachPointHint(const Pathname &path, bool temporary) { _attachPointHint.path = path; _attachPointHint.temp = temporary; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attachPointHint // METHOD TYPE : AttachPoint // // DESCRIPTION : // AttachPoint MediaHandler::attachPointHint() const { return _attachPointHint; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::findAttachedMedia // METHOD TYPE : AttachedMedia // // DESCRIPTION : // AttachedMedia MediaHandler::findAttachedMedia(const MediaSourceRef &media) const { return MediaManager().findAttachedMedia(media); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::setAttachPrefix // METHOD TYPE : void // // DESCRIPTION : // bool MediaHandler::setAttachPrefix(const Pathname &attach_prefix) { if( attach_prefix.empty()) { MIL << "Resetting to built-in attach point prefixes." << std::endl; MediaHandler::_attachPrefix = attach_prefix; return true; } else if( MediaHandler::checkAttachPoint(attach_prefix, false, true)) { MIL << "Setting user defined attach point prefix: " << attach_prefix << std::endl; MediaHandler::_attachPrefix = attach_prefix; return true; } return false; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attach // METHOD TYPE : Pathname // // DESCRIPTION : // Pathname MediaHandler::createAttachPoint() const { Pathname aroot; Pathname apoint; { aroot = MediaHandler::_attachPrefix; // explicit request if ( ! aroot.empty() ) apoint = createAttachPoint( aroot ); } if ( apoint.empty() ) // fallback to config value { aroot = ZConfig::instance().download_mediaMountdir(); if ( ! aroot.empty() ) apoint = createAttachPoint( aroot ); } if ( apoint.empty() ) // fall back to temp space { aroot = filesystem::TmpPath::defaultLocation(); if ( ! aroot.empty() ) apoint = createAttachPoint( aroot ); } if ( apoint.empty() ) { auto except = MediaBadAttachPointException( url() ); except.addHistory( _("Create attach point: Can't find a writable directory to create an attach point") ); ZYPP_THROW( except ); } MIL << "Created default attach point " << apoint << std::endl; return apoint; } Pathname MediaHandler::createAttachPoint(const Pathname &attach_root) const { Pathname apoint; if( attach_root.empty() || !attach_root.absolute()) { ERR << "Create attach point: invalid attach root: '" << attach_root << "'" << std::endl; return apoint; } PathInfo adir( attach_root ); if( !adir.isDir() || (geteuid() != 0 && !adir.userMayRWX())) { DBG << "Create attach point: attach root is not a writable directory: '" << attach_root << "'" << std::endl; return apoint; } static bool cleanup_once( true ); if ( cleanup_once ) { cleanup_once = false; DBG << "Look for orphaned attach points in " << adir << std::endl; std::list entries; filesystem::readdir( entries, attach_root, false ); for ( const std::string & entry : entries ) { if ( ! str::hasPrefix( entry, "AP_0x" ) ) continue; PathInfo sdir( attach_root + entry ); if ( sdir.isDir() && sdir.dev() == adir.dev() && ( Date::now()-sdir.mtime() > Date::month ) ) { DBG << "Remove orphaned attach point " << sdir << std::endl; filesystem::recursive_rmdir( sdir.path() ); } } } filesystem::TmpDir tmpdir( attach_root, "AP_0x" ); if ( tmpdir ) { apoint = getRealPath( tmpdir.path().asString() ); if ( ! apoint.empty() ) { tmpdir.autoCleanup( false ); // Take responsibility for cleanup. } else { ERR << "Unable to resolve real path for attach point " << tmpdir << std::endl; } } else { ERR << "Unable to create attach point below " << attach_root << std::endl; } return apoint; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::isUseableAttachPoint // METHOD TYPE : bool // // DESCRIPTION : // bool MediaHandler::isUseableAttachPoint(const Pathname &path, bool mtab) const { MediaManager manager; return manager.isUseableAttachPoint(path, mtab); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::setMediaSource // METHOD TYPE : void // // DESCRIPTION : // void MediaHandler::setMediaSource(const MediaSourceRef &ref) { _mediaSource.reset(); if( ref && !ref->type.empty() && !ref->name.empty()) _mediaSource = ref; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attachedMedia // METHOD TYPE : AttachedMedia // // DESCRIPTION : // AttachedMedia MediaHandler::attachedMedia() const { if ( _mediaSource && _attachPoint) return AttachedMedia(_mediaSource, _attachPoint); else return AttachedMedia(); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::isSharedMedia // METHOD TYPE : bool // // DESCRIPTION : // bool MediaHandler::isSharedMedia() const { return !_mediaSource.unique(); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::checkAttached // METHOD TYPE : bool // // DESCRIPTION : // bool MediaHandler::checkAttached(bool matchMountFs) const { bool _isAttached = false; AttachedMedia ref( attachedMedia() ); if( ref.mediaSource ) { time_t old_mtime = _attach_mtime; _attach_mtime = MediaManager::getMountTableMTime(); if( !(old_mtime <= 0 || _attach_mtime != old_mtime) ) { // OK, skip the check (we've seen it at least once) _isAttached = true; } else { if( old_mtime > 0) DBG << "Mount table changed - rereading it" << std::endl; else DBG << "Forced check of the mount table" << std::endl; MountEntries entries( MediaManager::getMountEntries()); for_( e, entries.begin(), entries.end() ) { if ( ref.attachPoint->path != Pathname(e->dir) ) continue; // at least the mount points must match bool is_device = e->isBlockDevice(); if( is_device && (ref.mediaSource->maj_nr && ref.mediaSource->bdir.empty())) { PathInfo dev_info(e->src); std::string mtype(matchMountFs ? e->type : ref.mediaSource->type); MediaSource media(mtype, e->src, dev_info.devMajor(), dev_info.devMinor()); if( ref.mediaSource->equals( media ) ) { DBG << "Found media device " << ref.mediaSource->asString() << " in the mount table as " << e->src << std::endl; _isAttached = true; break; } // differs } else if(!is_device && (!ref.mediaSource->maj_nr || !ref.mediaSource->bdir.empty())) { if( ref.mediaSource->bdir.empty()) { // bnc#710269: Type nfs may appear as nfs4 in in the mount table // and maybe vice versa. Similar cifs/smb. Need to unify these types: if ( matchMountFs && e->type != ref.mediaSource->type ) { if ( str::hasPrefix( e->type, "nfs" ) && str::hasPrefix( ref.mediaSource->type, "nfs" ) ) matchMountFs = false; else if ( ( e->type == "cifs" || e->type == "smb" ) && ( ref.mediaSource->type == "cifs" || ref.mediaSource->type == "smb" ) ) matchMountFs = false; else continue; // different types cannot match } // Here: Types are ok or not to check. // Check the name except for nfs (bnc#804544; symlink resolution in mount path) // // [fibonacci]$ ls -l /Local/ma/c12.1 // lrwxrwxrwx /Local/ma/c12.1 -> zypp-SuSE-Code-12_1-Branch/ // // [localhost]$ mount -t nfs4 fibonacci:/Local/ma/c12.1 /mnt // [localhost]$ mount // fibonacci:/Local/ma/zypp-SuSE-Code-12_1-Branch on /mnt // std::string mtype(matchMountFs ? e->type : ref.mediaSource->type); // MediaSource media(mtype, e->src); if( ref.mediaSource->name == e->src || str::hasPrefix( ref.mediaSource->type, "nfs" ) ) { DBG << "Found media name " << ref.mediaSource->asString() << " in the mount table as " << e->src << std::endl; _isAttached = true; break; } } else { if ( ref.mediaSource->bdir == e->src ) { DBG << "Found bound media " << ref.mediaSource->asString() << " in the mount table as " << e->src << std::endl; _isAttached = true; break; } } // differs } else // mixed cases: { // Type ISO: Since 11.1 mtab might contain the name of // the loop device instead of the iso file: if ( ref.mediaSource->type == "iso" && str::hasPrefix( Pathname(e->src).asString(), "/dev/loop" ) && ref.attachPoint->path == Pathname(e->dir) ) { DBG << "Found bound media " << ref.mediaSource->asString() << " in the mount table as " << e->src << std::endl; _isAttached = true; break; } } } if( !_isAttached) { MIL << "Looking for " << ref << endl; if( entries.empty() ) { ERR << "Unable to find any entry in the /etc/mtab file" << std::endl; } else { dumpRange( DBG << "MountEntries: ", entries.begin(), entries.end() ) << endl; } if( old_mtime > 0 ) { ERR << "Attached media not in mount table any more - forcing reset!" << std::endl; _mediaSource.reset(); } else { WAR << "Attached media not in mount table ..." << std::endl; } // reset the mtime and force a new check to make sure, // that we've found the media at least once in the mtab. _attach_mtime = 0; } } } return _isAttached; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::attach // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::attach( bool next ) { if ( isAttached() ) return; // reset it in case of overloaded isAttached() // that checks the media against /etc/mtab ... setMediaSource(MediaSourceRef()); AttachPoint ap( attachPointHint()); setAttachPoint(ap.path, ap.temp); try { attachTo( next ); // pass to concrete handler } catch(const MediaException &e) { removeAttachPoint(); ZYPP_RETHROW(e); } MIL << "Attached: " << *this << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::localPath // METHOD TYPE : Pathname // Pathname MediaHandler::localPath( const Pathname & pathname ) const { Pathname _localRoot( localRoot()); if ( _localRoot.empty() ) return _localRoot; // we must check maximum file name length // this is important for fetching the suseservers, the // url with all parameters can get too long (bug #42021) return _localRoot + pathname.absolutename(); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::disconnect // METHOD TYPE : PMError // void MediaHandler::disconnect() { if ( !isAttached() ) return; disconnectFrom(); // pass to concrete handler MIL << "Disconnected: " << *this << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::release // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::release( const std::string & ejectDev ) { if ( !isAttached() ) { DBG << "Request to release media - not attached; eject '" << ejectDev << "'" << std::endl; if ( !ejectDev.empty() ) forceEject(ejectDev); return; } DBG << "Request to release attached media " << _mediaSource->asString() << ", use count=" << _mediaSource.use_count() << std::endl; if( _mediaSource.unique()) { DBG << "Releasing media " << _mediaSource->asString() << std::endl; try { releaseFrom( ejectDev ); // pass to concrete handler } catch(const MediaNotEjectedException &e) { // not ejected because the media // is mounted by somebody else // (if our attach point is busy, // we get an umount exception) _mediaSource.reset(NULL); removeAttachPoint(); // OK, retrow now ZYPP_RETHROW(e); } _mediaSource.reset(NULL); removeAttachPoint(); } else if( !ejectDev.empty() ) { // // Can't eject a shared media // //ZYPP_THROW(MediaIsSharedException(_mediaSource->asString())); MediaSourceRef media( new MediaSource(*_mediaSource)); _mediaSource.reset(NULL); MediaManager manager; manager.forceReleaseShared(media); setMediaSource(media); DBG << "Releasing media (forced) " << _mediaSource->asString() << std::endl; try { releaseFrom( ejectDev ); // pass to concrete handler } catch(const MediaNotEjectedException &e) { // not ejected because the media // is mounted by somebody else // (if our attach point is busy, // we get an umount exception) _mediaSource.reset(NULL); removeAttachPoint(); // OK, retrow now ZYPP_RETHROW(e); } _mediaSource.reset(NULL); removeAttachPoint(); } else { DBG << "Releasing shared media reference only" << std::endl; _mediaSource.reset(NULL); setAttachPoint("", true); } MIL << "Released: " << *this << endl; } void MediaHandler::forceRelaseAllMedia(bool matchMountFs) { forceRelaseAllMedia( attachedMedia().mediaSource, matchMountFs); } void MediaHandler::forceRelaseAllMedia(const MediaSourceRef &ref, bool matchMountFs) { if( !ref) return; MountEntries entries( MediaManager::getMountEntries()); MountEntries::const_iterator e; for( e = entries.begin(); e != entries.end(); ++e) { bool is_device = false; PathInfo dev_info; if( str::hasPrefix( Pathname(e->src).asString(), "/dev/" ) && dev_info(e->src) && dev_info.isBlk()) { is_device = true; } if( is_device && ref->maj_nr) { std::string mtype(matchMountFs ? e->type : ref->type); MediaSource media(mtype, e->src, dev_info.devMajor(), dev_info.devMinor()); if( ref->equals( media) && e->type != "subfs") { DBG << "Forcing release of media device " << ref->asString() << " in the mount table as " << e->src << std::endl; try { Mount mount; mount.umount(e->dir); } catch (const Exception &e) { ZYPP_CAUGHT(e); } } } else if(!is_device && !ref->maj_nr) { std::string mtype(matchMountFs ? e->type : ref->type); MediaSource media(mtype, e->src); if( ref->equals( media)) { DBG << "Forcing release of media name " << ref->asString() << " in the mount table as " << e->src << std::endl; try { Mount mount; mount.umount(e->dir); } catch (const Exception &e) { ZYPP_CAUGHT(e); } } } } } bool MediaHandler::checkAttachPoint(const Pathname &apoint) const { return MediaHandler::checkAttachPoint( apoint, true, false); } // STATIC bool MediaHandler::checkAttachPoint(const Pathname &apoint, bool emptydir, bool writeable) { if( apoint.empty() || !apoint.absolute()) { ERR << "Attach point '" << apoint << "' is not absolute" << std::endl; return false; } if( apoint == "/") { ERR << "Attach point '" << apoint << "' is not allowed" << std::endl; return false; } PathInfo ainfo(apoint); if( !ainfo.isDir()) { ERR << "Attach point '" << apoint << "' is not a directory" << std::endl; return false; } if( emptydir) { if( 0 != zypp::filesystem::is_empty_dir(apoint)) { ERR << "Attach point '" << apoint << "' is not a empty directory" << std::endl; return false; } } if( writeable) { Pathname apath(apoint + "XXXXXX"); char *atemp = ::strdup( apath.asString().c_str()); char *atest = NULL; if( !ainfo.userMayRWX() || atemp == NULL || (atest=::mkdtemp(atemp)) == NULL) { if( atemp != NULL) ::free(atemp); ERR << "Attach point '" << ainfo.path() << "' is not a writeable directory" << std::endl; return false; } else if( atest != NULL) ::rmdir(atest); if( atemp != NULL) ::free(atemp); } return true; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaHandler::dependsOnParent // METHOD TYPE : bool // // DESCRIPTION : // bool MediaHandler::dependsOnParent() { return _parentId != 0; } bool MediaHandler::dependsOnParent(MediaAccessId parentId, bool exactIdMatch) { if( _parentId != 0) { if(parentId == _parentId) return true; if( !exactIdMatch) { MediaManager mm; AttachedMedia am1 = mm.getAttachedMedia(_parentId); AttachedMedia am2 = mm.getAttachedMedia(parentId); if( am1.mediaSource && am2.mediaSource) { return am1.mediaSource->equals( *(am2.mediaSource)); } } } return false; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::provideFile // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::provideFileCopy( const OnMediaLocation &srcFile, const Pathname& targetFilename ) const { if ( !isAttached() ) { INT << "Media not_attached on provideFileCopy(" << srcFile << "," << targetFilename << ")" << endl; ZYPP_THROW(MediaNotAttachedException(url())); } getFileCopy( srcFile, targetFilename ); // pass to concrete handler DBG << "provideFileCopy(" << srcFile << "," << targetFilename << ")" << endl; } void MediaHandler::provideFile( const OnMediaLocation &file ) const { if ( !isAttached() ) { INT << "Error: Not attached on provideFile(" << file << ")" << endl; ZYPP_THROW(MediaNotAttachedException(url())); } getFile( file ); // pass to concrete handler DBG << "provideFile(" << file << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::provideDir // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::provideDir( const Pathname& dirname ) const { if ( !isAttached() ) { INT << "Error: Not attached on provideDir(" << dirname << ")" << endl; ZYPP_THROW(MediaNotAttachedException(url())); } getDir( dirname, /*recursive*/false ); // pass to concrete handler MIL << "provideDir(" << dirname << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::provideDirTree // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::provideDirTree( const Pathname& dirname ) const { if ( !isAttached() ) { INT << "Error Not attached on provideDirTree(" << dirname << ")" << endl; ZYPP_THROW(MediaNotAttachedException(url())); } getDir( dirname, /*recursive*/true ); // pass to concrete handler MIL << "provideDirTree(" << dirname << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::releasePath // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::releasePath( const Pathname& pathname ) const { if ( ! _does_download || _attachPoint->empty() ) return; PathInfo info( localPath( pathname ) ); if ( info.isFile() ) { unlink( info.path() ); } else if ( info.isDir() ) { if ( info.path() != localRoot() ) { recursive_rmdir( info.path() ); } else { clean_dir( info.path() ); } } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::dirInfo // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::dirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { retlist.clear(); if ( !isAttached() ) { INT << "Error: Not attached on dirInfo(" << dirname << ")" << endl; ZYPP_THROW(MediaNotAttachedException(url())); } getDirInfo( retlist, dirname, dots ); // pass to concrete handler MIL << "dirInfo(" << dirname << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::dirInfo // METHOD TYPE : PMError // // DESCRIPTION : // void MediaHandler::dirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { retlist.clear(); if ( !isAttached() ) { INT << "Error: Not attached on dirInfo(" << dirname << ")" << endl; ZYPP_THROW(MediaNotAttachedException(url())); } getDirInfo( retlist, dirname, dots ); // pass to concrete handler MIL << "dirInfo(" << dirname << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::doesFileExist // METHOD TYPE : PMError // // DESCRIPTION : // bool MediaHandler::doesFileExist( const Pathname & filename ) const { // TODO do some logging if ( !isAttached() ) { INT << "Error Not attached on doesFileExist(" << filename << ")" << endl; ZYPP_THROW(MediaNotAttachedException(url())); } return getDoesFileExist( filename ); MIL << "doesFileExist(" << filename << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::getDirectoryYast // METHOD TYPE : PMError // void MediaHandler::getDirectoryYast( std::list & retlist, const Pathname & dirname, bool dots ) const { retlist.clear(); filesystem::DirContent content; getDirectoryYast( content, dirname, dots ); // convert to std::list for ( filesystem::DirContent::const_iterator it = content.begin(); it != content.end(); ++it ) { retlist.push_back( it->name ); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::getDirectoryYast // METHOD TYPE : PMError // void MediaHandler::getDirectoryYast( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { retlist.clear(); // look for directory.yast auto dirFile = OnMediaLocation( dirname + "directory.yast" ); getFile( dirFile ); DBG << "provideFile(" << dirFile << "): " << "OK" << endl; // using directory.yast std::ifstream dir( localPath( dirFile.filename() ).asString().c_str() ); if ( dir.fail() ) { ERR << "Unable to load '" << localPath( dirFile.filename() ) << "'" << endl; ZYPP_THROW(MediaSystemException(url(), "Unable to load '" + localPath( dirFile.filename() ).asString() + "'")); } std::string line; while( getline( dir, line ) ) { if ( line.empty() ) continue; if ( line == "directory.yast" ) continue; // Newer directory.yast append '/' to directory names // Remaining entries are unspecified, although most probabely files. filesystem::FileType type = filesystem::FT_NOT_AVAIL; if ( *line.rbegin() == '/' ) { line.erase( line.end()-1 ); type = filesystem::FT_DIR; } if ( dots ) { if ( line == "." || line == ".." ) continue; } else { if ( *line.begin() == '.' ) continue; } retlist.push_back( filesystem::DirEntry( line, type ) ); } } /****************************************************************** ** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : ostream & */ std::ostream & operator<<( std::ostream & str, const MediaHandler & obj ) { str << obj.url() << ( obj.isAttached() ? "" : " not" ) << " attached; localRoot \"" << obj.localRoot() << "\""; return str; } void MediaHandler::getFile( const OnMediaLocation &file ) const { PathInfo info( localPath( file.filename() ) ); if( info.isFile() ) { return; } if (info.isExist()) ZYPP_THROW(MediaNotAFileException(url(), localPath(file.filename()))); else ZYPP_THROW(MediaFileNotFoundException(url(), file.filename())); } void MediaHandler::getFileCopy( const OnMediaLocation &file, const Pathname &targetFilename ) const { getFile( file ); if ( copy( localPath( file.filename() ), targetFilename ) != 0 ) { ZYPP_THROW(MediaWriteException(targetFilename)); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::getDir // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // Default implementation of pure virtual. // void MediaHandler::getDir( const Pathname & dirname, bool recurse_r ) const { PathInfo info( localPath( dirname ) ); if( info.isDir() ) { return; } if (info.isExist()) ZYPP_THROW(MediaNotADirException(url(), localPath(dirname))); else ZYPP_THROW(MediaFileNotFoundException(url(), dirname)); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // Default implementation of pure virtual. // void MediaHandler::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { PathInfo info( localPath( dirname ) ); if( ! info.isDir() ) { ZYPP_THROW(MediaNotADirException(url(), localPath(dirname))); } #if NONREMOTE_DIRECTORY_YAST // use directory.yast if available try { getDirectoryYast( retlist, dirname, dots ); } catch (const MediaException & excpt_r) { #endif // readdir int res = readdir( retlist, info.path(), dots ); if ( res ) { MediaSystemException nexcpt(url(), "readdir failed"); #if NONREMOTE_DIRECTORY_YAST nexcpt.remember(excpt_r); #endif ZYPP_THROW(nexcpt); } #if NONREMOTE_DIRECTORY_YAST } #endif return; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // Default implementation of pure virtual. // void MediaHandler::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { PathInfo info( localPath( dirname ) ); if( ! info.isDir() ) { ZYPP_THROW(MediaNotADirException(url(), localPath(dirname))); } #if NONREMOTE_DIRECTORY_YAST // use directory.yast if available try { getDirectoryYast( retlist, dirname, dots ); } catch (const MediaException & excpt_r) { #endif // readdir int res = readdir( retlist, info.path(), dots ); if ( res ) { MediaSystemException nexcpt(url(), "readdir failed"); #if NONREMOTE_DIRECTORY_YAST nexcpt.remember(excpt_r); #endif ZYPP_THROW(nexcpt); } #if NONREMOTE_DIRECTORY_YAST } #endif } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaHandler::getDoesFileExist // METHOD TYPE : PMError // // DESCRIPTION : Asserted that file is not a directory // Default implementation of pure virtual. // bool MediaHandler::getDoesFileExist( const Pathname & filename ) const { PathInfo info( localPath( filename ) ); if( info.isDir() ) { ZYPP_THROW(MediaNotAFileException(url(), localPath(filename))); } return info.isExist(); } bool MediaHandler::hasMoreDevices() { return false; } void MediaHandler::getDetectedDevices(std::vector & devices, unsigned int & index) const { // clear the vector by default if (!devices.empty()) devices.clear(); index = 0; DBG << "No devices for this medium" << endl; } void MediaHandler::precacheFiles( const std::vector & ) { /* do nothing */ } } // namespace media } // namespace zypp // vim: set ts=8 sts=2 sw=2 ai noet: libzypp-17.36.5/zypp/media/MediaHandler.h000066400000000000000000000615111476576476200201710ustar00rootroot00000000000000 /*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaHandler.h * */ #ifndef ZYPP_MEDIA_MEDIAHANDLERL_H #define ZYPP_MEDIA_MEDIAHANDLERL_H #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::media" namespace zypp { namespace media { class MediaManager; /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaHandler /** * @short Abstract base class for 'physical' MediaHandler like MediaCD, etc. * * Handles the requests forwarded by @ref MediaAccess. The public interface * contains nonvirtual methods, which should do common sanitychecks and * logging. For the real action they call virtual methods overloaded by the * concrete handler. **/ class MediaHandler { friend std::ostream & operator<<( std::ostream & str, const MediaHandler & obj ); public: using Ptr = shared_ptr; using constPtr = shared_ptr; static bool setAttachPrefix(const Pathname &attach_prefix); static std::string getRealPath(const std::string &path); static Pathname getRealPath(const Pathname &path); private: /** * User defined default attach point prefix. */ static Pathname _attachPrefix; /** * The attached media source description reference. */ mutable MediaSourceRef _mediaSource; /** * This is where the media will be actually attached ("mounted"). * All files are provided bellow this + _relativeRoot directory. **/ AttachPointRef _attachPoint; /** * The user provided attach preferred point. It may contain * following values: * * "", true => create temporary attach point bellow of * _attachPrefix or a built-in default and * remove it if not needed any more. * * dir, false => user specified attach point (not removed) */ AttachPoint _attachPointHint; /** * The relative root directory of the data on the media. * See also localRoot() and urlpath_below_attachpoint_r * constructor argument. */ Pathname _relativeRoot; /** * True if concrete handler downloads files to the local * filesystem. If true releaseFile/Dir will delete them. **/ bool _does_download; /** timestamp of the the last attach verification */ mutable time_t _attach_mtime; protected: /** * Url to handle **/ const Url _url; /** * Access Id of media handler we depend on. */ MediaAccessId _parentId; public: /** * Check if the current media handler depends on an * another handler specified by media access id. * \param parentId The id of the parent handler to check against. * \return true if it depends, false if not. */ bool dependsOnParent(MediaAccessId parentId, bool exactIdMatch); bool dependsOnParent(); /** * Called in case, where the media manager takes over the * destruction of the parent id (e.g. while destruction * of the media manager). */ void resetParentId(); /** * Return the currently used attach point. **/ Pathname attachPoint() const; /** * Set a new attach point. * \param path The attach point directory path. * \param temp If to remove the attach point while cleanup. */ void setAttachPoint(const Pathname &path, bool temp); /** * Set a (shared) attach point. * \param ref New attach point reference. */ void setAttachPoint(const AttachPointRef &ref); /** * Get the actual attach point hint. */ AttachPoint attachPointHint() const; /** * Set the attach point hint as specified by the user. * \param path The attach point directory path. * \param temp If to remove the attach point while cleanup. */ void attachPointHint(const Pathname &path, bool temp); /** * Try to create a default / temporary attach point. * It tries to create it in attachPrefix if avaliable, * then in built-in directories. * \throws MediaBadAttachPointException if no attach point can be created * \return The name of the new attach point */ Pathname createAttachPoint() const; /** * Try to create a temporary attach point in specified root. * \param attach_root The attach root dir where to create the * attach point in. * \return The name of the new attach point or empty path name. */ Pathname createAttachPoint(const Pathname &attach_root) const; /** * Remove unused attach point. If the attach point is temporary, * the attach point directory and all it content will be removed. */ void removeAttachPoint(); /** * Verify if the specified directory as attach point (root) * as requires by the particular media handler implementation. * \param apoint The directory to check. * \return True, if the directory checks succeeded. */ virtual bool checkAttachPoint(const Pathname &apoint) const; /** * Verify if the specified directory as attach point (root) * using requested checks. * \param apoint The directory to check. * \param empty_dir Check if the directory is empty. * \param writeable Check if the directory is writeable. * \return True, if the directory checks succeeded. */ static bool checkAttachPoint(const Pathname &apoint, bool empty_dir, bool writeable); /** * Ask media manager, if the specified path is already used * as attach point or if there are another attach points * bellow of it. * \param path The attach point path to check. * \param mtab Whether to check against the mtab, too. * \return True, if the path can be used as attach point. */ bool isUseableAttachPoint(const Pathname &path, bool mtab=true) const; /** * Get the media source name or an empty string. * \return media source name or empty string. */ std::string mediaSourceName() const { return _mediaSource ? _mediaSource->name : ""; } /** * Set new media source reference. * \param ref The new reference. */ void setMediaSource(const MediaSourceRef &ref); /** * Ask the media manager if specified media source * is already attached. */ AttachedMedia findAttachedMedia(const MediaSourceRef &media) const; /** * Returns the attached media. Used by MediaManager * to find other handlers using the same source. * \note This function increments reference counters * on the mediaSource and attachPoint references * it contains, for the life time of the returned * object. That is, it enables a (temporary) sharing * of them. * \return The AttachedMedia struct containing (shared) * references to media source and attach point. */ AttachedMedia attachedMedia() const; /** * Returns a hint if the media is shared or not. * \return true, if media is shared. */ bool isSharedMedia() const; /** * Check actual mediaSource attachment against the current * mount table of the system. Used to implement isAttached(). * \param matchMountFs If to use the filesystem type from the * mount table (nfs, smb and cifs) or from mediaSource * while compare of a mount entry with mediaSource. * \return true, if the media appears in the mount table. */ bool checkAttached(bool matchMountFs) const; /** * Call to this function will try to release all media matching * the currenlty attached media source, that it is able to find * in the mount table. This means also foreign (user) mounts! * \param matchMountFs If to use the filesystem type from the * mount table (nfs, smb and cifs) or from mediaSource * while compare of a mount entry with mediaSource. */ void forceRelaseAllMedia(bool matchMountFs); void forceRelaseAllMedia(const MediaSourceRef &ref, bool matchMountFs); protected: /////////////////////////////////////////////////////////////////// // // Real action interface to be overloaded by concrete handler. // /////////////////////////////////////////////////////////////////// /** * Call concrete handler to attach the media. * * Asserted that not already attached, and attachPoint is a directory. * * @param next try next available device in turn until end of device * list is reached (for media which are accessible through multiple * devices like cdroms). * * \throws MediaException * **/ virtual void attachTo(bool next = false) = 0; /** * Call concrete handler to disconnect media. * * Asserted that media is attached. * * This is useful for media which e.g. holds open a connection to a * server like FTP. After calling disconnect() the media object still is * valid and files are present. * * After calling disconnect(), it's not possible to call provideFile() or * provideDir() anymore. * * \throws MediaException * **/ virtual void disconnectFrom() { return; } /** * Call concrete handler to release the media. * * If eject is true, and the media is used in one handler * instance only, physically eject the media (i.e. CD-ROM). * * Asserted that media is attached. * \param ejectDev Device to eject. None if empty. * * \throws MediaException * **/ virtual void releaseFrom( const std::string & ejectDev = "" ) = 0; /** * Call concrete handler to physically eject the media (i.e. CD-ROM) * in case the media is not attached.. * * Asserted that media is not attached. **/ virtual void forceEject( const std::string & device ) {} /** * Call concrete handler to provide file below attach point. * * Default implementation provided, that returns whether a file * is located at 'localRoot + filename'. * * Asserted that media is attached. * * \throws MediaException * **/ virtual void getFile( const OnMediaLocation &file ) const; /** * Call concrete handler to provide a file under a different place * in the file system (usually not under attach point) as a copy. * Media must be attached before by callee. * * Default implementation provided that calls getFile(srcFilename) * and copies the result around. * * \throws MediaException * **/ virtual void getFileCopy( const OnMediaLocation & file, const Pathname & targetFilename ) const; /** * Call concrete handler to provide directory content (not recursive!) * below attach point. * * Return E_not_supported_by_media if media does not support retrieval of * directory content. * * Default implementation provided, that returns whether a directory * is located at 'localRoot + dirname'. * * Asserted that media is attached. * * \throws MediaException * **/ virtual void getDir( const Pathname & dirname, bool recurse_r ) const = 0; /** * Call concrete handler to provide a content list of directory on media * via retlist. If dots is false entries starting with '.' are not reported. * * Return E_not_supported_by_media if media does not support retrieval of * directory content. * * Default implementation provided, that returns the content of a * directory at 'localRoot + dirnname' retrieved via 'readdir'. * * Asserted that media is attached and retlist is empty. * * \throws MediaException * **/ virtual void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const = 0; /** * Basically the same as getDirInfo above. The content list is returned as * filesystem::DirContent, which includes name and filetype of each directory * entry. Retrieving the filetype usg. requires an additional ::stat call for * each entry, thus it's more expensive than a simple readdir. * * Asserted that media is attached and retlist is empty. * * \throws MediaException * **/ virtual void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const = 0; /** * check if a file exists * * Asserted that url is a file and not a dir. * * \throws MediaException * **/ virtual bool getDoesFileExist( const Pathname & filename ) const = 0; protected: /** * Retrieve and if available scan dirname/directory.yast. * * Asserted that media is attached. * * \throws MediaException * **/ void getDirectoryYast( std::list & retlist, const Pathname & dirname, bool dots = true ) const; /** * Retrieve and if available scan dirname/directory.yast. * * Asserted that media is attached. * * \throws MediaException * **/ void getDirectoryYast( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const; public: /** * If the concrete media handler provides a nonempty * attach_point, it must be an existing directory. * * On an empty attach_point, MediaHandler will create * a temporay directory, which will be erased from * destructor. * * On any error, the attach_point is set to an empty Pathname, * which should lead to E_bad_attachpoint. **/ MediaHandler ( Url url_r, const Pathname & attach_point_r, Pathname urlpath_below_attachpoint_r, const bool does_download_r ); /** * Contolling MediaAccess takes care, that attached media is released * prior to deleting this. **/ virtual ~MediaHandler(); public: /////////////////////////////////////////////////////////////////// // // MediaAccess interface. Does common checks and logging. // Invokes real action if necessary. // /////////////////////////////////////////////////////////////////// /** * Hint if files are downloaded or not. */ bool downloads() const { return _does_download; } /** * Protocol hint for MediaAccess. **/ std::string protocol() const { return _url.getScheme(); } /** * Url used. **/ Url url() const { return _url; } /** * Use concrete handler to attach the media. * * @param next try next available device in turn until end of device * list is reached (for media which are accessible through multiple * devices like cdroms). * * \throws MediaException * **/ void attach(bool next); /** * True if media is attached. **/ virtual bool isAttached() const { return _mediaSource != nullptr; } /** * Return the local directory that corresponds to medias url, * no matter if media isAttached or not. Files requested will * be available at 'localRoot() + filename' or better * 'localPath( filename )'. * * Returns empty pathname if E_bad_attachpoint **/ Pathname localRoot() const; /** * Files provided will be available at 'localPath(filename)'. * * Returns empty pathname if E_bad_attachpoint **/ Pathname localPath( const Pathname & pathname ) const; /** * Use concrete handler to isconnect media. * * This is useful for media which e.g. holds open a connection to a * server like FTP. After calling disconnect() the media object still is * valid and files are present. * * After calling disconnect(), it's not possible to call provideFile() or * provideDir() anymore. * * \throws MediaException * **/ void disconnect(); /** * Use concrete handler to release the media. * @param eject Device to physically eject. None if empty. * * \throws MediaException **/ void release( const std::string & ejectDev = "" ); /** * Use concrete handler to provide file denoted by path below * 'localRoot'. Filename is interpreted relative to the * attached url and a path prefix is preserved. * * \throws MediaException * **/ void provideFile( const OnMediaLocation &file ) const; /** * Call concrete handler to provide a copy of a file under a different place * in the file system (usually not under attach point) as a copy. * Media must be attached before by callee. * * @param srcFilename Filename of source file on the media * @param targetFilename Filename for the target in the file system * * \throws MediaException * **/ void provideFileCopy( const OnMediaLocation &srcFile, const Pathname& targetFilename ) const; /** * Use concrete handler to provide directory denoted * by path below 'localRoot' (not recursive!). * dirname is interpreted relative to the * attached url and a path prefix is preserved. * * \throws MediaException * **/ void provideDir( const Pathname& dirname ) const; /** * Use concrete handler to provide directory tree denoted * by path below 'localRoot' (recursive!!). * dirname is interpreted relative to the * attached url and a path prefix is preserved. * * \throws MediaException * **/ void provideDirTree( const Pathname& dirname ) const; /** * Remove filename below localRoot IFF handler downloads files * to the local filesystem. Never remove anything from media. * * \throws MediaException * **/ void releaseFile( const Pathname & filename ) const { return releasePath( filename ); } /** * Remove directory tree below localRoot IFF handler downloads files * to the local filesystem. Never remove anything from media. * * \throws MediaException * **/ void releaseDir( const Pathname & dirname ) const { return releasePath( dirname ); } /** * Remove pathname below localRoot IFF handler downloads files * to the local filesystem. Never remove anything from media. * * If pathname denotes a directory it is recursively removed. * If pathname is empty or '/' everything below the localRoot * is recursively removed. * If pathname denotes a file it is unlinked. * * \throws MediaException * **/ void releasePath( const Pathname& pathname ) const; public: /** * Return content of directory on media via retlist. If dots is false * entries starting with '.' are not reported. * * The request is forwarded to the concrete handler, * which may atempt to retieve the content e.g. via 'readdir' * * Caution: This is not supported by all media types. * Be prepared to handle E_not_supported_by_media. * * \throws MediaException * **/ void dirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const; /** * Basically the same as dirInfo above. The content is returned as * filesystem::DirContent, which includes name and filetype of each directory * entry. Retrieving the filetype usg. requires an additional ::stat call for * each entry, thus it's more expensive than a simple readdir. * * Caution: This is not supported by all media types. * Be prepared to handle E_not_supported_by_media. * * \throws MediaException * **/ void dirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const; /** * check if a file exists * * Asserted that url is a file and not a dir. * * \throws MediaException * **/ bool doesFileExist( const Pathname & filename ) const; /** * Check if the media has one more device available for attach(true). */ virtual bool hasMoreDevices(); /** * Fill in a vector of detected ejectable devices and the index of the * currently attached device within the vector. The contents of the vector * are the device names (/dev/cdrom and such). * * \param devices vector to load with the device names * \param index index of the currently used device in the devices vector */ virtual void getDetectedDevices(std::vector & devices, unsigned int & index) const; /** * Tries to fetch the given files and precaches them. Those files * need to be queried using provideFile and can be read from the cache directly. * The implementation is not allowed to block but needs to use seperate means to * download the files concurrently. * A backend can choose to completely ignore this functionaly, the default implementation * does nothing. * * \param files List of files that should be precached, the OnMediaLocation needs to belong to the handler it is passed to */ virtual void precacheFiles ( const std::vector< OnMediaLocation > &files ); }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIAHANDLERL_H libzypp-17.36.5/zypp/media/MediaHandlerFactory.cc000066400000000000000000000130261476576476200216550ustar00rootroot00000000000000#include "MediaHandlerFactory.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zypp::media { MediaHandlerFactory::MediaHandlerFactory() { } std::optional MediaHandlerFactory::handlerType(const Url &url) { std::string scheme = url.getScheme(); if (scheme == "cd" || scheme == "dvd") return MediaCDType; else if (scheme == "nfs" || scheme == "nfs4") return MediaNFSType; else if (scheme == "iso") return MediaISOType; else if (scheme == "file" || scheme == "dir") return MediaFileType; else if (scheme == "hd" ) return MediaDISKType; else if (scheme == "cifs" || scheme == "smb") return MediaCIFSType; else if (scheme == "ftp" || scheme == "tftp" || scheme == "http" || scheme == "https") return MediaCURLType; else if (scheme == "plugin" ) return MediaPluginType; return {}; } std::unique_ptr MediaHandlerFactory::createHandler( const Url &o_url, const Pathname &preferred_attach_point ) { if(!o_url.isValid()) { MIL << "Url is not valid" << std::endl; ZYPP_THROW(MediaBadUrlException(o_url)); } UrlResolverPlugin::HeaderList custom_headers; Url url = UrlResolverPlugin::resolveUrl(o_url, custom_headers); MIL << "Trying scheme '" << url.getScheme() << "'" << std::endl; const auto hdlType = handlerType( url ); if ( !hdlType ) { ZYPP_THROW(MediaUnsupportedUrlSchemeException(url)); } std::unique_ptr _handler; switch(*hdlType) { case MediaCDType: { _handler = std::make_unique (url,preferred_attach_point); break; } case MediaNFSType: { _handler = std::make_unique (url,preferred_attach_point); break; } case MediaISOType: { _handler = std::make_unique (url,preferred_attach_point); break; } case MediaFileType: { _handler = std::make_unique (url,preferred_attach_point); break; } case MediaDISKType: { _handler = std::make_unique (url,preferred_attach_point); break; } case MediaCIFSType: { _handler = std::make_unique (url,preferred_attach_point); break; } case MediaCURLType: { enum WhichHandler { choose, curl, curl2, multicurl }; WhichHandler which = choose; // Leagcy: choose handler in UUrl query if ( const std::string & queryparam = url.getQueryParam("mediahandler"); ! queryparam.empty() ) { if ( queryparam == "network" || queryparam == "multicurl" ) which = multicurl; else if ( queryparam == "curl" ) which = curl; else if ( queryparam == "curl2" ) which = curl2; else WAR << "Unknown mediahandler='" << queryparam << "' in URL; Choosing the default" << std::endl; } // Otherwise choose handler through ENV if ( which == choose ) { auto getenvIs = []( std::string_view var, std::string_view val )->bool { const char * v = ::getenv( var.data() ); return v && v == val; }; which = multicurl; if ( getenvIs( "ZYPP_MULTICURL", "0" ) ) { WAR << "multicurl manually disabled." << std::endl; which = curl; } if ( getenvIs( "ZYPP_CURL2", "1" ) ) { WAR << "Curl2 manually selected." << std::endl; which = curl2; } } // Finally use the default std::unique_ptr handler; switch ( which ) { default: case multicurl: handler = std::make_unique( url, preferred_attach_point ); break; case curl: handler = std::make_unique( url, preferred_attach_point ); break; case curl2: handler = std::make_unique( url, preferred_attach_point ); break; } // Set up the handler for ( const auto & el : custom_headers ) { std::string header { el.first }; header += ": "; header += el.second; MIL << "Added custom header -> " << header << std::endl; handler->settings().addHeader( std::move(header) ); } _handler = std::move(handler); break; } case MediaPluginType: { // bsc#1228208: MediaPluginType must be resolved to a valid schema by the // above UrlResolverPlugin::resolveUrl call. MediaPlugin exists as a stub, // but is not a usable handler type. ZYPP_THROW(MediaUnsupportedUrlSchemeException(url)); break; } } if ( !_handler ) { ZYPP_THROW(MediaUnsupportedUrlSchemeException(url)); } // check created handler if ( !_handler ){ ERR << "Failed to create media handler" << std::endl; ZYPP_THROW(MediaSystemException(url, "Failed to create media handler")); } MIL << "Opened: " << *_handler << std::endl; return _handler; } } libzypp-17.36.5/zypp/media/MediaHandlerFactory.h000066400000000000000000000012751476576476200215220ustar00rootroot00000000000000#ifndef MEDIAHANDLERFACTORY_H #define MEDIAHANDLERFACTORY_H #include #include #include #include namespace zypp::media { class MediaHandler; class MediaHandlerFactory { public: enum MediaHandlerType { MediaCDType, MediaNFSType, MediaISOType, MediaFileType, MediaDISKType, MediaCIFSType, MediaCURLType, MediaPluginType }; MediaHandlerFactory(); static std::unique_ptr createHandler (const Url& o_url, const Pathname & preferred_attach_point); static std::optional handlerType( const Url &url ); }; } #endif // MEDIAHANDLERFACTORY_H libzypp-17.36.5/zypp/media/MediaISO.cc000066400000000000000000000226101476576476200174010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaISO.cc * */ #include #include #include #include using std::endl; ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace media { ////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // MediaISO Url: // // Schema: iso // Path name: subdir to the location of desired files inside // of the ISO. // Query parameters: // url: The iso filename source media url pointing // to a directory containing the ISO file. // mnt: Prefered attach point for source media url. // iso: The name of the iso file. // filesystem: Optional, defaults to "auto". // /////////////////////////////////////////////////////////////////// MediaISO::MediaISO(const Url &url_r, const Pathname &attach_point_hint_r) : MediaHandler(url_r, attach_point_hint_r, url_r.getPathName(), // urlpath below attachpoint false) // does_download { MIL << "MediaISO::MediaISO(" << url_r << ", " << attach_point_hint_r << ")" << std::endl; _isofile = _url.getQueryParam("iso"); if( _isofile.empty()) { ERR << "Media url does not contain iso filename" << std::endl; ZYPP_THROW(MediaBadUrlEmptyDestinationException(_url)); } _filesystem = _url.getQueryParam("filesystem"); if( _filesystem.empty()) _filesystem = "auto"; Url src; { const std::string & arg { _url.getQueryParam("url") }; if ( arg.empty() ) { src = "dir:/"; src.setPathName( _isofile.dirname() ); _isofile = _isofile.basename(); } else try { src = arg; } catch( const url::UrlException & e ) { ZYPP_CAUGHT(e); ERR << "Unable to parse iso filename source media url" << std::endl; MediaBadUrlException ne(_url); ne.remember(e); ZYPP_THROW(ne); } } if( !src.isValid()) { ERR << "Invalid iso filename source media url" << std::endl; ZYPP_THROW(MediaBadUrlException(src)); } if( src.getScheme() == "iso") { ERR << "ISO filename source media url with iso scheme (nested iso): " << src.asString() << std::endl; ZYPP_THROW(MediaUnsupportedUrlSchemeException(src)); } else if( !(src.getScheme() == "hd" || src.getScheme() == "dir" || src.getScheme() == "file" || src.getScheme() == "nfs" || src.getScheme() == "nfs4" || src.getScheme() == "smb" || src.getScheme() == "cifs")) { ERR << "ISO filename source media url scheme is not supported: " << src.asString() << std::endl; ZYPP_THROW(MediaUnsupportedUrlSchemeException(src)); } MediaManager manager; _parentId = manager.open(src, _url.getQueryParam("mnt")); } // --------------------------------------------------------------- MediaISO::~MediaISO() { try { release(); if( _parentId) { DBG << "Closing parent handler..." << std::endl; MediaManager manager; if(manager.isOpen(_parentId)) manager.close(_parentId); _parentId = 0; } } catch( ... ) {} } // --------------------------------------------------------------- bool MediaISO::isAttached() const { return checkAttached(false); } // --------------------------------------------------------------- void MediaISO::attachTo(bool next) { if(next) ZYPP_THROW(MediaNotSupportedException(_url)); MediaManager manager; manager.attach(_parentId); try { manager.provideFile(_parentId, OnMediaLocation(_isofile) ); } catch(const MediaException &e1) { ZYPP_CAUGHT(e1); try { manager.release(_parentId); } catch(const MediaException &e2) { ZYPP_CAUGHT(e2); } MediaMountException e3( "Unable to find iso filename on source media", _url.asString(), attachPoint().asString() ); e3.remember(e1); ZYPP_THROW(e3); } // if the provided file is a symlink, expand it (#274651) // (this will probably work only for file/dir and cd/dvd schemes) Pathname isofile = expandlink(manager.localPath(_parentId, _isofile)); if( isofile.empty() || !PathInfo(isofile).isFile()) { ZYPP_THROW(MediaNotSupportedException(_url)); } MediaSourceRef media( new MediaSource("iso", isofile.asString() ) ); AttachedMedia ret( findAttachedMedia(media)); if( ret.mediaSource && ret.attachPoint && !ret.attachPoint->empty()) { DBG << "Using a shared media " << ret.mediaSource->name << " attached on " << ret.attachPoint->path << std::endl; removeAttachPoint(); setAttachPoint(ret.attachPoint); setMediaSource(ret.mediaSource); return; } if( !isUseableAttachPoint( attachPoint() ) ) { setAttachPoint( createAttachPoint(), true ); } std::string mountpoint( attachPoint().asString() ); std::string mountopts("ro,loop"); Mount mount; mount.mount(isofile.asString(), mountpoint, _filesystem, mountopts); setMediaSource(media); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; while( !(mountsucceeded=isAttached()) && --limit) { sleep(1); } if( !mountsucceeded) { setMediaSource(MediaSourceRef()); try { mount.umount(attachPoint().asString()); manager.release(_parentId); } catch (const MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW(MediaMountException( "Unable to verify that the media was mounted", isofile.asString(), mountpoint )); } } // --------------------------------------------------------------- void MediaISO::releaseFrom(const std::string & ejectDev) { Mount mount; mount.umount(attachPoint().asString()); if( _parentId) { // Unmounting the iso already succeeded, // so don't let exceptions escape. MediaManager manager; try { manager.release(_parentId); } catch ( const Exception & excpt_r ) { ZYPP_CAUGHT( excpt_r ); WAR << "Not been able to cleanup the parent mount." << endl; } } // else: // the media manager has reset the _parentId // and will destroy the parent handler itself. } // --------------------------------------------------------------- void MediaISO::getFile( const OnMediaLocation &file ) const { MediaHandler::getFile(file); } // --------------------------------------------------------------- void MediaISO::getDir(const Pathname &dirname, bool recurse_r) const { MediaHandler::getDir(dirname, recurse_r); } // --------------------------------------------------------------- void MediaISO::getDirInfo(std::list &retlist, const Pathname &dirname, bool dots) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } // --------------------------------------------------------------- void MediaISO::getDirInfo(filesystem::DirContent &retlist, const Pathname &dirname, bool dots) const { MediaHandler::getDirInfo(retlist, dirname, dots); } bool MediaISO::getDoesFileExist( const Pathname & filename ) const { return MediaHandler::getDoesFileExist( filename ); } ////////////////////////////////////////////////////////////////// } // namespace media //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/zypp/media/MediaISO.h000066400000000000000000000052171476576476200172470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaISO.h * */ #ifndef ZYPP_MEDIA_MEDIAISO_H #define ZYPP_MEDIA_MEDIAISO_H #include #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace media { ////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaISO // /** * @short Implementation class for ISO MediaHandler * @see MediaHandler **/ class MediaISO : public MediaHandler { private: Pathname _isofile; std::string _filesystem; protected: void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev = "" ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; bool getDoesFileExist( const Pathname & filename ) const override; public: MediaISO(const Url &url_r, const Pathname &attach_point_hint_r); ~MediaISO() override; bool isAttached() const override; }; ////////////////////////////////////////////////////////////////// } // namespace media //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// #endif // ZYPP_MEDIA_MEDIAISO_H // vim: set ts=2 sts=2 sw=2 ai et: libzypp-17.36.5/zypp/media/MediaManager.cc000066400000000000000000000734771476576476200203420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaManager.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace media { ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// namespace // anonymous { //////////////////////////////////////////////////////////////// struct ManagedMedia; std::ostream & operator<<( std::ostream & str, const ManagedMedia & obj ); // ------------------------------------------------------------- struct ManagedMedia { ~ManagedMedia() { try { if ( _handler ) close(); // !!! make sure handler gets properly deleted. } catch(...) {} } ManagedMedia(const ManagedMedia &) = delete; ManagedMedia &operator=(const ManagedMedia &) = delete; ManagedMedia(ManagedMedia &&m) noexcept : desired(m.desired), verifier(std::move(m.verifier)), _handler(std::move(m._handler)) {} static ManagedMedia makeManagedMedia ( const Url &o_url, const Pathname &preferred_attach_point, const MediaVerifierRef &v ) { auto handler = MediaHandlerFactory::createHandler( o_url, preferred_attach_point ); if ( !handler ) { ERR << "Failed to create media handler" << std::endl; ZYPP_THROW( MediaSystemException(o_url, "Failed to create media handler")); } return ManagedMedia( std::move(handler), v ); } ManagedMedia &operator= ( ManagedMedia &&other ) = default; operator bool () const { return ( _handler ? true : false ); } inline MediaHandler &handler() { if ( !_handler ) ZYPP_THROW(MediaNotOpenException("Accessing ManagedMedia after it was closed")); return *_handler; } inline const MediaHandler &handler() const { if ( !_handler ) ZYPP_THROW(MediaNotOpenException("Accessing ManagedMedia after it was closed")); return *_handler; } std::ostream & dumpOn( std::ostream & str ) const { if ( !_handler ) return str << "ManagedMedia( closed )"; str << _handler->protocol() << "(" << *_handler << ")"; return str; } inline void close () { /////////////////////////////////////////////////////////////////// // !!! make shure handler gets properly deleted. // I.e. release attached media before deleting the handler. /////////////////////////////////////////////////////////////////// try { handler().release(); } catch (const MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); WAR << "Close: " << *this << " (" << excpt_r << ")" << std::endl; ZYPP_RETHROW(excpt_r); } MIL << "Close: " << *this << " (OK)" << std::endl; } inline void checkAttached(MediaAccessId id) { if( !handler().isAttached()) { DBG << "checkAttached(" << id << ") not attached" << std::endl; desired = false; ZYPP_THROW(MediaNotAttachedException( handler().url() )); } } inline void checkDesired( MediaAccessId id ) { checkAttached( id ); if ( !desired ) { const auto &hdl = handler(); try { desired = verifier->isDesiredMedia( handler() ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT( e ); media::MediaNotDesiredException newEx ( hdl.url() ); newEx.remember( e ); ZYPP_THROW( newEx ); } if( !desired ) { DBG << "checkDesired(" << id << "): not desired (report by " << verifier->info() << ")" << std::endl; ZYPP_THROW( MediaNotDesiredException( hdl.url() ) ); } DBG << "checkDesired(" << id << "): desired (report by " << verifier->info() << ")" << std::endl; } else { DBG << "checkDesired(" << id << "): desired (cached)" << std::endl; } } bool desired; MediaVerifierRef verifier; Pathname deltafile; private: ManagedMedia( std::unique_ptr &&h, MediaVerifierRef v) : desired (false) , verifier(std::move(v)) , _handler ( std::move(h) ) {} std::unique_ptr _handler; }; std::ostream & operator<<( std::ostream & str, const ManagedMedia & obj ) { return obj.dumpOn( str ); } // ------------------------------------------------------------- using ManagedMediaMap = std::map; //////////////////////////////////////////////////////////////// } // anonymous ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// std::string MediaVerifierBase::info() const { return std::string(typeid((*this)).name()); } ////////////////////////////////////////////////////////////////// std::string NoVerifier::info() const { return std::string("zypp::media::NoVerifier"); } ////////////////////////////////////////////////////////////////// class MediaManager_Impl { private: friend class MediaManager; MediaAccessId last_accessid; ManagedMediaMap mediaMap; MediaManager_Impl() : last_accessid(0) {} public: MediaManager_Impl(const MediaManager_Impl &) = delete; MediaManager_Impl(MediaManager_Impl &&) = delete; MediaManager_Impl &operator=(const MediaManager_Impl &) = delete; MediaManager_Impl &operator=(MediaManager_Impl &&) = delete; ~MediaManager_Impl() { try { // remove depending (iso) handlers first ManagedMediaMap::iterator it; bool found = false; do { found = false; for(it = mediaMap.begin(); it != mediaMap.end(); /**/) { if( it->second && it->second.handler().dependsOnParent() ) { found = true; // let it forget its parent, we will // destroy it later (in clear())... it->second.handler().resetParentId(); it = mediaMap.erase( it ); // postfix! Incrementing before erase } else { ++it; } } } while(found); // remove all other handlers mediaMap.clear(); } catch( ... ) {} } inline MediaAccessId nextAccessId() { return ++last_accessid; } inline bool hasId(MediaAccessId accessId) const { return mediaMap.find(accessId) != mediaMap.end(); } inline ManagedMedia & findMM(MediaAccessId accessId) { ManagedMediaMap::iterator it( mediaMap.find(accessId)); if( it == mediaMap.end()) { ZYPP_THROW(MediaNotOpenException( "Invalid media access id " + str::numstring(accessId) )); } return it->second; } static inline time_t getMountTableMTime() { return Mount::getMTime(); } static inline MountEntries getMountEntries() { return Mount::getEntries(); } }; ////////////////////////////////////////////////////////////////// // STATIC zypp::RW_pointer MediaManager::m_impl; ////////////////////////////////////////////////////////////////// MediaManager::MediaManager() { if( !m_impl) { m_impl.reset( new MediaManager_Impl()); } } // --------------------------------------------------------------- MediaManager::~MediaManager() { } // --------------------------------------------------------------- MediaAccessId MediaManager::open(const Url &url, const Pathname &preferred_attach_point) { // create new access handler for it MediaVerifierRef verifier( new NoVerifier()); ManagedMedia tmp = ManagedMedia::makeManagedMedia( url, preferred_attach_point, verifier ); MediaAccessId nextId = m_impl->nextAccessId(); m_impl->mediaMap.insert( std::make_pair( nextId, std::move(tmp) ) ); //m_impl->mediaMap[nextId] = std::move(tmp); DBG << "Opened new media access using id " << nextId << " to " << url.asString() << std::endl; return nextId; } // --------------------------------------------------------------- void MediaManager::close(MediaAccessId accessId) { // // The MediaISO handler internally requests an accessId // of a "parent" handler providing the iso file. // The parent handler accessId is private to MediaISO, // but the attached media source may be shared reference. // This means, that if the accessId exactly matches the // parent handler id, close was used on uninitialized // accessId variable (or the accessId was guessed) and // the close request to this id will be rejected here. // ManagedMediaMap::iterator m(m_impl->mediaMap.begin()); for( ; m != m_impl->mediaMap.end(); ++m) { if( m->second.handler().dependsOnParent(accessId, true)) { ZYPP_THROW(MediaIsSharedException( m->second.handler().url().asString() )); } } DBG << "Close to access handler using id " << accessId << " requested" << std::endl; ManagedMedia &ref( m_impl->findMM(accessId)); ref.close(); m_impl->mediaMap.erase(accessId); } // --------------------------------------------------------------- bool MediaManager::isOpen(MediaAccessId accessId) const { ManagedMediaMap::iterator it( m_impl->mediaMap.find(accessId)); return it != m_impl->mediaMap.end(); } // --------------------------------------------------------------- std::string MediaManager::protocol(MediaAccessId accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); return ref.handler().protocol(); } // --------------------------------------------------------------- bool MediaManager::downloads(MediaAccessId accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); return ref.handler().downloads(); } // --------------------------------------------------------------- Url MediaManager::url(MediaAccessId accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); return ref.handler().url(); } // --------------------------------------------------------------- void MediaManager::addVerifier(MediaAccessId accessId, const MediaVerifierRef &verifier) { if( !verifier) ZYPP_THROW(MediaException("Invalid verifier reference")); ManagedMedia &ref( m_impl->findMM(accessId)); ref.desired = false; MediaVerifierRef(verifier).swap(ref.verifier); DBG << "MediaVerifier change: id=" << accessId << ", verifier=" << verifier->info() << std::endl; } // --------------------------------------------------------------- void MediaManager::delVerifier(MediaAccessId accessId) { ManagedMedia &ref( m_impl->findMM(accessId)); MediaVerifierRef verifier( new NoVerifier()); ref.desired = false; ref.verifier.swap(verifier); DBG << "MediaVerifier change: id=" << accessId << ", verifier=" << verifier->info() << std::endl; } // --------------------------------------------------------------- bool MediaManager::setAttachPrefix(const Pathname &attach_prefix) { return MediaHandler::setAttachPrefix(attach_prefix); } // --------------------------------------------------------------- void MediaManager::attach(MediaAccessId accessId) { ManagedMedia &ref( m_impl->findMM(accessId)); auto &hdl = ref.handler(); DBG << "attach(id=" << accessId << ")" << std::endl; // try first mountable/mounted device hdl.attach(false); try { ref.checkDesired(accessId); return; } catch (const MediaException & ex) { ZYPP_CAUGHT(ex); if (!hdl.hasMoreDevices()) ZYPP_RETHROW(ex); if (hdl.isAttached()) hdl.release(); } MIL << "checkDesired(" << accessId << ") of first device failed," " going to try others with attach(true)" << std::endl; while (hdl.hasMoreDevices()) { try { // try to attach next device hdl.attach(true); ref.checkDesired(accessId); return; } catch (const MediaNotDesiredException & ex) { ZYPP_CAUGHT(ex); if (!hdl.hasMoreDevices()) { MIL << "No desired media found after trying all detected devices." << std::endl; ZYPP_RETHROW(ex); } AttachedMedia media(hdl.attachedMedia()); DBG << "Skipping " << media.mediaSource->asString() << ": not desired media." << std::endl; hdl.release(); } catch (const MediaException & ex) { ZYPP_CAUGHT(ex); if (!hdl.hasMoreDevices()) ZYPP_RETHROW(ex); AttachedMedia media(hdl.attachedMedia()); DBG << "Skipping " << media.mediaSource->asString() << " because of exception thrown by attach(true)" << std::endl; if (hdl.isAttached()) hdl.release(); } } } // --------------------------------------------------------------- void MediaManager::release(MediaAccessId accessId, const std::string & ejectDev) { ManagedMedia &ref( m_impl->findMM(accessId)); DBG << "release(id=" << accessId; if (!ejectDev.empty()) DBG << ", " << ejectDev; DBG << ")" << std::endl; if(!ejectDev.empty()) { // // release MediaISO handlers, that are using the one // specified with accessId, because it provides the // iso file and it will disappear now (forced release // with eject). // ManagedMediaMap::iterator m(m_impl->mediaMap.begin()); for( ; m != m_impl->mediaMap.end(); ++m) { auto &hdl = m->second.handler(); if( hdl.dependsOnParent(accessId, false)) { try { DBG << "Forcing release of handler depending on access id " << accessId << std::endl; m->second.desired = false; hdl.release(); } catch(const MediaException &e) { ZYPP_CAUGHT(e); } } } } ref.desired = false; ref.handler().release(ejectDev); } // --------------------------------------------------------------- void MediaManager::releaseAll() { MIL << "Releasing all attached media" << std::endl; auto releaseAction = []( MediaAccessId mId_r, ManagedMedia & mManagedMedia_r, bool ifDependsOnParent_r ) { auto & hdl = mManagedMedia_r.handler(); if ( hdl.dependsOnParent() == ifDependsOnParent_r ) { try { if ( hdl.isAttached() ) { DBG << "Releasing media id " << mId_r << std::endl; mManagedMedia_r.desired = false; hdl.release(); } else { DBG << "Media id " << mId_r << " not attached " << std::endl; } } catch ( const MediaException & e ) { ZYPP_CAUGHT(e); ERR << "Failed to release media id " << mId_r << std::endl; } } }; // 1st pass releases any stacked mounts (ISO) for ( auto & [ mId, mManagedMedia ] : m_impl->mediaMap ) { releaseAction( mId, mManagedMedia, /*ifDependsOnParent*/true ); } // 2nd pass releases all the rest for ( auto & [ mId, mManagedMedia ] : m_impl->mediaMap ) { releaseAction( mId, mManagedMedia, /*ifDependsOnParent*/false ); } MIL << "Exit" << std::endl; } // --------------------------------------------------------------- void MediaManager::disconnect(MediaAccessId accessId) { ManagedMedia &ref( m_impl->findMM(accessId)); ref.handler().disconnect(); } // --------------------------------------------------------------- bool MediaManager::isAttached(MediaAccessId accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); return ref.handler().isAttached(); } // --------------------------------------------------------------- bool MediaManager::isSharedMedia(MediaAccessId accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); return ref.handler().isSharedMedia(); } // --------------------------------------------------------------- bool MediaManager::isDesiredMedia(MediaAccessId accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); if( !ref.handler().isAttached()) { ref.desired = false; } else { try { ref.desired = ref.verifier->isDesiredMedia( ref.handler() ); } catch(const zypp::Exception &e) { ZYPP_CAUGHT(e); ref.desired = false; } } DBG << "isDesiredMedia(" << accessId << "): " << (ref.desired ? "" : "not ") << "desired (report by " << ref.verifier->info() << ")" << std::endl; return ref.desired; } // --------------------------------------------------------------- bool MediaManager::isDesiredMedia(MediaAccessId accessId, const MediaVerifierRef &verifier) const { MediaVerifierRef v(verifier); if( !v) ZYPP_THROW(MediaException("Invalid verifier reference")); ManagedMedia &ref( m_impl->findMM(accessId)); bool desired = false; if( ref.handler().isAttached()) { try { desired = v->isDesiredMedia( ref.handler() ); } catch(const zypp::Exception &e) { ZYPP_CAUGHT(e); desired = false; } } DBG << "isDesiredMedia(" << accessId << "): " << (desired ? "" : "not ") << "desired (report by " << v->info() << ")" << std::endl; return desired; } // --------------------------------------------------------------- bool MediaManager::isChangeable(MediaAccessId accessId) { return url(accessId).getScheme() == "cd" || url(accessId).getScheme() == "dvd"; } // --------------------------------------------------------------- Pathname MediaManager::localRoot(MediaAccessId accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); Pathname path; path = ref.handler().localRoot(); return path; } // --------------------------------------------------------------- Pathname MediaManager::localPath(MediaAccessId accessId, const Pathname & pathname) const { ManagedMedia &ref( m_impl->findMM(accessId)); Pathname path; path = ref.handler().localPath(pathname); return path; } void MediaManager::provideFile(MediaAccessId accessId, const Pathname &filename, const ByteCount &expectedFileSize ) const { ManagedMedia &ref( m_impl->findMM(accessId)); auto loc = OnMediaLocation( filename ) .setDownloadSize( expectedFileSize ) .setDeltafile( ref.deltafile ); provideFile( accessId, loc ); } // --------------------------------------------------------------- void MediaManager::provideFile(MediaAccessId accessId, const Pathname &filename ) const { ManagedMedia &ref( m_impl->findMM(accessId)); auto loc = OnMediaLocation( filename ) .setDeltafile( ref.deltafile ); provideFile( accessId, loc ); } void MediaManager::provideFile( MediaAccessId accessId, const OnMediaLocation &file ) const { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkDesired(accessId); ref.handler().provideFile( file ); } // --------------------------------------------------------------- void MediaManager::setDeltafile(MediaAccessId accessId, const Pathname &filename ) const { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkDesired(accessId); ref.deltafile = filename; } void MediaManager::precacheFiles(MediaAccessId accessId, const std::vector &files) { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkDesired(accessId); ref.handler().precacheFiles( files ); } // --------------------------------------------------------------- void MediaManager::provideDir(MediaAccessId accessId, const Pathname &dirname) const { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkDesired(accessId); ref.handler().provideDir(dirname); } // --------------------------------------------------------------- void MediaManager::provideDirTree(MediaAccessId accessId, const Pathname &dirname) const { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkDesired(accessId); ref.handler().provideDirTree(dirname); } // --------------------------------------------------------------- void MediaManager::releaseFile(MediaAccessId accessId, const Pathname &filename) const { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkAttached(accessId); ref.handler().releaseFile(filename); } // --------------------------------------------------------------- void MediaManager::releaseDir(MediaAccessId accessId, const Pathname &dirname) const { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkAttached(accessId); ref.handler().releaseDir(dirname); } // --------------------------------------------------------------- void MediaManager::releasePath(MediaAccessId accessId, const Pathname &pathname) const { ManagedMedia &ref( m_impl->findMM(accessId)); ref.checkAttached(accessId); ref.handler().releasePath(pathname); } // --------------------------------------------------------------- void MediaManager::dirInfo(MediaAccessId accessId, std::list &retlist, const Pathname &dirname, bool dots) const { ManagedMedia &ref( m_impl->findMM(accessId)); // FIXME: ref.checkDesired(accessId); ??? ref.checkAttached(accessId); ref.handler().dirInfo(retlist, dirname, dots); } // --------------------------------------------------------------- void MediaManager::dirInfo(MediaAccessId accessId, filesystem::DirContent &retlist, const Pathname &dirname, bool dots) const { ManagedMedia &ref( m_impl->findMM(accessId)); // FIXME: ref.checkDesired(accessId); ??? ref.checkAttached(accessId); ref.handler().dirInfo(retlist, dirname, dots); } // --------------------------------------------------------------- bool MediaManager::doesFileExist(MediaAccessId accessId, const Pathname & filename ) const { ManagedMedia &ref( m_impl->findMM(accessId)); // FIXME: ref.checkDesired(accessId); ??? ref.checkAttached(accessId); return ref.handler().doesFileExist(filename); } // --------------------------------------------------------------- void MediaManager::getDetectedDevices(MediaAccessId accessId, std::vector & devices, unsigned int & index) const { ManagedMedia &ref( m_impl->findMM(accessId)); return ref.handler().getDetectedDevices(devices, index); } // --------------------------------------------------------------- // STATIC time_t MediaManager::getMountTableMTime() { return MediaManager_Impl::getMountTableMTime(); } // --------------------------------------------------------------- // STATIC MountEntries MediaManager::getMountEntries() { return MediaManager_Impl::getMountEntries(); } // --------------------------------------------------------------- bool MediaManager::isUseableAttachPoint(const Pathname &path, bool mtab) const { if( path.empty() || path == "/" || !PathInfo(path).isDir()) return false; // // check against our current attach points // ManagedMediaMap::const_iterator m(m_impl->mediaMap.begin()); for( ; m != m_impl->mediaMap.end(); ++m) { AttachedMedia ret = m->second.handler().attachedMedia(); if( ret.mediaSource && ret.attachPoint) { std::string mnt(ret.attachPoint->path.asString()); const std::string& our(path.asString()); if( our == mnt) { // already used as attach point return false; } else if( mnt.size() > our.size() && mnt.at(our.size()) == '/' && !mnt.compare(0, our.size(), our)) { // mountpoint is bellow of path // (would hide the content) return false; } } } if( !mtab) return true; // // check against system mount entries // MountEntries entries( m_impl->getMountEntries()); MountEntries::const_iterator e; for( e = entries.begin(); e != entries.end(); ++e) { std::string mnt(Pathname(e->dir).asString()); const std::string& our(path.asString()); if( our == mnt) { // already used as mountpoint return false; } else if( mnt.size() > our.size() && mnt.at(our.size()) == '/' && !mnt.compare(0, our.size(), our)) { // mountpoint is bellow of path // (would hide the content) return false; } } return true; } // --------------------------------------------------------------- AttachedMedia MediaManager::getAttachedMedia(MediaAccessId &accessId) const { ManagedMedia &ref( m_impl->findMM(accessId)); return ref.handler().attachedMedia(); } // --------------------------------------------------------------- AttachedMedia MediaManager::findAttachedMedia(const MediaSourceRef &media) const { if( !media || media->type.empty()) return AttachedMedia(); ManagedMediaMap::const_iterator m(m_impl->mediaMap.begin()); for( ; m != m_impl->mediaMap.end(); ++m) { if( !m->second.handler().isAttached()) continue; AttachedMedia ret = m->second.handler().attachedMedia(); if( ret.mediaSource && ret.mediaSource->equals( *media)) return ret; } return AttachedMedia(); } // --------------------------------------------------------------- void MediaManager::forceReleaseShared(const MediaSourceRef &media) { if( !media || media->type.empty()) return; ManagedMediaMap::iterator m(m_impl->mediaMap.begin()); for( ; m != m_impl->mediaMap.end(); ++m) { if( !m->second.handler().isAttached()) continue; AttachedMedia ret = m->second.handler().attachedMedia(); if( ret.mediaSource && ret.mediaSource->equals( *media)) { m->second.handler().release(); m->second.desired = false; } } } ////////////////////////////////////////////////////////////////// } // namespace media //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp/media/MediaManager.h000066400000000000000000001017751476576476200201750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaManager.h * */ #ifndef ZYPP_MEDIA_MEDIAMANAGER_H #define ZYPP_MEDIA_MEDIAMANAGER_H #include #include #include #include #include #include #include #include #include #include namespace zypp::media { class MediaHandler; using MediaNr = unsigned int; /////////////////////////////////////////////////////////////////// // forward declaration struct MountEntry; class MediaManager_Impl; /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaVerifierBase // /** * Interface to implement a media verifier. */ class MediaVerifierBase //: private zypp::NonCopyable { public: MediaVerifierBase() {} virtual ~MediaVerifierBase() {} /** * Returns a string with some info about the verifier. * By default, the type info name is returned. */ virtual std::string info() const; /* ** Check if the specified attached media contains ** the desired media (e.g. SLES10 CD1). */ virtual bool isDesiredMedia(const MediaHandler &ref) const = 0; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : NoVerifier // /** * Dummy default media verifier, which is always happy. */ class NoVerifier : public MediaVerifierBase { public: NoVerifier(): MediaVerifierBase() {} ~NoVerifier() override {} /** * Returns the "zypp::media::NoVerifier" string. */ std::string info() const override; /* ** Don't check if the specified attached media contains ** the desired media number. Always return true. */ bool isDesiredMedia(const MediaHandler &ref) const override { return true; } }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaVerifierRef // /** * A shared reference to the MediaVerifier implementation. */ using MediaVerifierRef = zypp::RW_pointer; /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaManager // /** * Manages access to the 'physical' media, e.g CDROM drives, * Disk volumes, directory trees, etc, using \ref MediaAccessUrl's. * * \note The MediaManager class is just an envelope around an * inner singleton like implementation.
* That is, you can create as many managers as you want, * also temporary in a function call.
* But don't declare static MediaManager instances, * unless you want to force (mutex) initialization order * problems! * * \section MediaAccessUrl Media Access Url * The MediaManager uses several media access handlers (backends), * that can be specified by a Media Access URL in its open() method. * * All URLs may contain following query parameters, that are * reserved by the Source classes and unused/ignored by the media * manager: * - alias: A source specific media alias string. * * Currently, following access handlers (backends) are implemented: * - \ref MediaCD_Url * - \ref MediaDISK_Url * . * - \ref MediaISO_Url * - \ref MediaDIR_Url * . * - \ref MediaNFS_Url * - \ref MediaCIFS_Url * - \ref MediaCurl_Url * * \subsection MediaCD_Url MediaCD - CD/DVD drives (cd, dvd) * The access handler for media on CD / DVD drives. * - Scheme: * - cd: Requires a drive supporting CD media. * - dvd: Prefers a drive supporting DVD media. * - Examples: * \code * "cd:/" * "cd:/?devices=/dev/hda,/dev/hdb" * "cd:/subdir?devices=/dev/hda,/dev/hdb" * * "dvd:/" * "dvd:/?devices=/dev/hda,/dev/hdb" * "dvd:/subdir?devices=/dev/hda,/dev/hdb" * \endcode * Note: You can use either "dvd:/" (just path, no authority) * or "dvd:///" (path and empty authority). * - Query parameters: * - devices: * Optional parameter, containing a comma separated list of * block device names to use, e.g.: "/dev/sr0,/dev/sr1". *
* The device names will be verified. If one of the provided * devices is not usable (not a block device, or does not * support required media type), an exception is thrown. *
* If the devices parameter is not provided (or empty), available * CD/DVD drives will be auto-detected. The preferred device is * the one denoted by "/dev/dvd" ("dvd" scheme only) or "/dev/cdrom". * - Authority: * A non-empty authority URL component (e.g. containing a host * name) is not allowed. * - Path name: * Mandatory URL component, that specifies a subdirectory on the * CD/DVD, where the desired files are located. * * \subsection MediaDISK_Url MediaDISK - HD disk volumes (hd) * The access handler for media on a disk volume (partition). * - Scheme: * - hd * - Examples: * \code * "hd:/?device=/dev/hda1" * "hd:/subdir?device=/dev/sda1" * "hd:/subdir?device=/dev/sda1&filesystem=reiserfs" * \endcode * Note: You can use either "hd:/" (just path, no authority) * or "hd:///" (path and empty authority). * - Query parameters: * - device: * Mandatory parameter specifying the name of the block device of * the partition to mount. * - filesystem: * The name of the filesystem. Defaults to "auto". * - Authority: * A non-empty authority URL component is not allowed. * - Path name: * Mandatory URL component, that specifies a subdirectory on the disk * partition, where the desired files are located. * * \subsection MediaDIR_Url MediaDIR - Local directory tree (dir, file) * The access handler to media stored in a local directory tree. * - Scheme: * - dir * - file * - Examples: * \code * "dir:/directory/name" * "file:/directory/name" * \endcode * - Query parameters: * none * - Authority: * A non-empty authority URL component (e.g. containing * a host name) is not allowed. * - Path name: * Mandatory URL component, that specifies a directory, where * the desired files are located. * * \subsection MediaISO_Url MediaISO - Loopback ISO images (iso) * The access handler for media in a ISO image (loopback mount). * - Scheme: * - iso * - Examples: * \code * "iso:/?iso=/path/to/CD1.iso" * "iso:/?iso=CD1.iso&url=dir:/path/to" * * "iso:/?iso=CD1.iso&url=nfs://server/path/to/media" * "iso:/?iso=CD1.iso&url=hd:/?device=/dev/hda" * * "iso:/subdir?iso=DVD1.iso&url=nfs://nfs-server/directory&mnt=/nfs/attach/point&filesystem=udf" * \endcode * - Query parameters: * - iso: * Mandatory parameter specifying the name of the iso file.
* If the url parameter is missed, the iso parameter has to contain * an absolute iso file name. * - url: * Optional parameter specifying the URL to the directory containing * the iso file.
* The supported URL schemes are: hd, dir, * file, nfs, nfs4, smb, cifs. * - mnt: * Optional parameter specifying the prefered attach point for the * source media url. * - filesystem: * Optional name of the filesystem used in the iso file. Defaults * to "auto". * - Authority: * A non-empty authority URL component is not allowed. * - Path name: * Mandatory URL component, that specifies a subdirectory inside of * the iso file, where the desired files are located. * * \subsection MediaNFS_Url MediaNFS - NFS directory tree (nfs) * The access handler for media on NFS exported directory tree. * - Scheme: * - nfs * - nfs * - Examples: * \code * "nfs://nfs-server/exported/path" * "nfs://nfs-server/exported/path?mountoptions=ro" * "nfs://nfs-server/exported/path&type=nfs4" * "nfs4://nfs-server/exported/path" * \endcode * - Query parameters: * - mountoptions: * The mount options separated by comma ','. * Default is the "ro" option. * - type=nfs4: * Whether to mount as nfs4. This is the default for scheme nfs4. * - Authority: * The authority component has to provide a hostname. * Username, password and port are currently ignored. * - Path name: * Mandatory URL component, that specifies the exported * (sub-)directory on the NFS server, where the desired * files are located. * * \subsection MediaCIFS_Url MediaCIFS - CIFS/SMB directory tree (cifs, smb) * The access handler for media in a CIFS/SMB shared directory tree. * - Scheme: * - cifs * - smb * - Examples: * \code * "cifs://servername/share/path/on/the/share" * "cifs://username:passwd@servername/share/path/on/the/share?mountoptions=ro" * "cifs://username:passwd@servername/share/path/on/the/share?mountoptions=noguest" * "smb://servername/share/path/on/the/share" * "smb://username:passwd@servername/share/path/on/the/share?mountoptions=ro" * \endcode * Note: There is no difference between cifs and smb scheme * (any more). In both cases the 'cifs' filesystem is used. * - Query parameters: * - mountoptions: * The mount options separated by a comma ','. Default are the * "ro" and "guest" options. Specify "noguest" to turn off * "guest". This is necessary if Samba is configured to reject * guest connections. * - workgroup or domain: * The name of the workgroup. * - username: * Alternative username to username in URL authority. * - password: * Alternative password to password in URL authority. * - user: * Alternative username (cifs specific variant) * - pass: * Alternative password (cifs specific variant) * - Authority: * The authority component has to provide a hostname. Optionally * also a username and password. * - Path name: * Mandatory URL component, that specifies the share name with * optional subdirectory, where the desired files are located. * * \subsection MediaCurl_Url MediaCurl - FTP/HTTP directory tree (ftp, tftp, http, https) * The access handler to media directory tree on a ftp/http server. * - Scheme: * - ftp * - tftp * - http * - https * - Examples: * \code * "ftp://server/relative/path/to/media/dir" * "ftp://server/%2fabsolute/path/to/media/dir" * * "ftp://user:pass@server/path/to/media/dir" * "ftp://user:pass@server/%2f/home/user/path/to/media/dir" * * "http://server/path/on/server" * "http://user:pass@server/path" * "https://user:pass@server/path?proxy=foo&proxyuser=me&proxypass=pw" * \endcode * Note: The "ftp" url scheme supports absolute and relative * paths to the default ftp server directory * (RFC1738, Section 3.2.2).
* To use an absolute path, you have to prepend the path with an * additional slash, what results in a "/%2f" combination * (second "/" encoded to "%2f") at the begin of the URL path. *
* This is important, especially in user authenticated ftp, * where the users home is usually the default directory of the * server (except when the server chroots into the users home * directory). *
* For example, if the user "user" has a home directory * "/home/user", you can use either an URL with a relative path * to the home directory "ftp://user:pass@server/path/to/media" * or the absolute path * "ftp://user:pass@server/%2fhome/user/path/to/media" -- both * URLs points to the same directory on the server. * - Query parameters: * - cookies: * Turn off using cookies by setting it to "0" (or false, no, off). * - proxy: * A proxy hostname or hostname and port separated by ':'. * Setting the hostname to '_none_' explicitly disables the use of a * proxy even if configured in /etc/sysconfig/proxy or the environment. * - proxyport: * Alternative way to provide the proxy port. * - proxyuser: * The proxy username. * - proxypass: * The proxy password. * - ssl_capath: * The absolute CA directory to use, default is /etc/ssl/certs. * - ssl_verify: Flag to modify the ssl verify behaviour. * Valid values are: 'yes', 'no' and a comma separated list of * 'host' and 'peer' flags. * - 'no': * disables ssl verify * - 'yes': * enables ssl verify, this is the default * and is equivalent to 'host,peer'. * - 'host': The server is considered the intended one, when the * 'Common Name' field or a 'Subject Alternate Name' field in * the certificate matches the host name in the URL. * - 'peer': Verifies whether the certificate provided by the * server is authentic against the chain of digital signatures * found in ssl_capath. * - ssl_clientcert * Path to the ssl client certificate for authentication to a repo (CURLOPT_SSLCERT). * - ssl_clientkey * Path to the ssl client key for authentication to a repo (CURLOPT_SSLKEY). * - timeout: * Transfer timeout in seconds between 0 and 3600, 0 disables * the timeout, default timeout is 180 seconds. * - auth: A comma separated list of http authentication * method names to use: 'basic', 'digest', 'ntlm', 'negotiate', * 'spnego', 'gssnego'. * Note, that this list depends on the list of methods supported * by the curl library. * - mediahandler: Set the mediahandler for this url * Valid values are: 'curl', 'multicurl' * - Authority: * The authority component has to provide a hostname. Optionally * also a username and password. In case of the 'ftp' scheme, * username and password defaults to 'anonymous' and 'yast2@'. * - Path name: * Mandatory URL component, that specifies the path name on the * server, where the desired files are located. * * Proxy settings: If no proxy settings are present in tha URLs * query parameters, the media handler reads the system wide proxy * settings from the /etc/sysconfig/proxy file. * If a proxy setting was present, but the proxy password not, * it attempts to read the proxy-user variable from the * ~/.curlrc (/root/.curlrc) file. *
* If no proxy setting was present, then libzypp does not pass any * proxy settings to curl, but curl fallbacks to use the content of * the http_proxy, ftp_proxy, etc environment * variables. * * \subsection MediaPlugin_Url MediaPlugin - custom media handler * Media access is delegated to a script located in the libzypp * media plugin directory. The URLs query options are translated * into commandline arguments passed to the script. * - Scheme: * - plugin * - Examples: * \code * "plugin:script?loptv=lvalue&v=optv&lopt=&o&=foo" * \__________/ \____/ \___/ | \_/ * __________/__ ____/_ _|_ \ \___ * / \ / \ / \ /\ / \ * script --loptv "lvalue" -v "optv" --lopt -o -- foo * \endcode * - Query parameters: * - The URLs query options are translated into commandline * arguments passed to the script. * - \b Note: No option may appear twice, as the (option,value) * pairs are stored in a hash. * - \b Note: The order in which the query options are passes to the * script is arbitrary, except for an option with an empty key, which * is translated into '-- value' and passed as final option. * - 'c[=[value]]' ist passed as '-c [value]' * - 'word[=[value]]' ist passed as '--word [value]' * - '[=value]' ist passed as last args as '-- [value]' * - \c script<->libzypp communication: * - \TODO to be documented. */ class ZYPP_API MediaManager: private zypp::base::NonCopyable { public: /** * Creates a MediaManager envelope instance. * * In the case, that the inner implementation is not already * allocated, and the MediaManager constructor was unable to * allocate it, a std::bad_alloc exception is thrown. * * All further instances increase the use counter only. * * \throws std::bad_alloc */ MediaManager(); /** * Destroys MediaManager envelope instance. * Decreases the use counter of the inner implementation. */ ~MediaManager(); /** * Opens the media access for specified with the url. * * If the \p preferred_attach_point parameter does not * point to a usable attach point directory, the media * manager automatically creates a temporary attach * point in a default directory. This default directory * can be changed using setAttachPrefix() function. * * Remember to close() each id you've opened and not * need any more. It is like a new and delete! * * \param url The \ref MediaAccessUrl. * \param preferred_attach_point The preferred, already * existing directory, where the media should be * attached. * \return a new media access id. * \throws std::bad_alloc * \throws MediaException */ MediaAccessId open(const Url &url, const Pathname & preferred_attach_point = ""); /** * Close the media access with specified id. * \param accessId The media access id to close. */ void close(MediaAccessId accessId); /** * Query if the media access is open / exists. * * \param accessId The media access id to query. * \return true, if access id is known and open. */ bool isOpen(MediaAccessId accessId) const; /** * Query the protocol name used by the media access * handler. Similar to url().getScheme(). * * \param accessId The media access id to query. * \return The protocol name used by the media access * handler, otherwise 'unknown'. * \throws MediaNotOpenException for invalid access id. */ std::string protocol(MediaAccessId accessId) const; /** * Hint if files are downloaded or not. * \param accessId The media access id to query. * \return True, if provideFile downloads files. */ bool downloads(MediaAccessId accessId) const; /** * Returns the \ref MediaAccessUrl of the media access id. * * \param accessId The media access id to query. * \return The \ref MediaAccessUrl used by the media access id. * \throws MediaNotOpenException for invalid access id. */ Url url(MediaAccessId accessId) const; public: /** * Add verifier implementation for the specified media id. * By default, the NoVerifier is used. * * \param accessId A media access id. * \param verifier The new verifier. * \throws MediaNotOpenException for invalid access id. */ void addVerifier(MediaAccessId accessId, const MediaVerifierRef &verifier); /** * Remove verifier for specified media id. * It resets the verifier to NoVerifier. * * \param accessId A media access id. * \throws MediaNotOpenException for invalid access id. */ void delVerifier(MediaAccessId accessId); public: /** * Set or resets the directory name, where the media manager * handlers create their temporary attach points (see open() * function). * It has effect to newly created temporary attach points only. * * \param attach_prefix The new prefix for temporary attach * points, or empty pathname to reset to defaults. * \return True on success, false if the \p attach_prefix * parameters contains a path name, that does not * point to a writable directory. */ bool setAttachPrefix(const Pathname &attach_prefix); /** * Attach the media using the concrete handler (checks all devices). * * Remember to release() or close() each id you've attached * and not need any more. Attach is like an open of a file! * * \param accessId A media access id. * \throws MediaNotOpenException for invalid access id. */ void attach(MediaAccessId accessId); /** * Release the attached media and optionally eject. * * If the \p ejectDev parameter is not empty all other access * id's are released and the specified drive (CD/DVD drive) is * ejected. * * \param accessId A media access id. * \param ejectDev Device to eject. None if empty. * \throws MediaNotOpenException for invalid access id. */ void release(MediaAccessId accessId, const std::string & ejectDev = ""); /** * Release all attached media. */ void releaseAll(); /** * Disconnect a remote media. * * This is useful for media which e.g. holds open a connection * to a server like FTP. After calling disconnect() the media * object (attach point) is still valid and files are present. * * But after calling disconnect(), it's not possible to call * fetch more data using the provideFile() or provideDir() * functions anymore. * * \param accessId A media access id. * \throws MediaNotOpenException for invalid access id. */ void disconnect(MediaAccessId accessId); /** * Check if media is attached or not. * * \param accessId A media access id. * \return True if media is attached. * \throws MediaNotOpenException for invalid access id. */ bool isAttached(MediaAccessId accessId) const; /** * Returns information if media is on a shared * physical device or not. * * \param accessId A media access id. * \return True if it is shared, false if not. * \throws MediaNotOpenException for invalid access id. */ bool isSharedMedia(MediaAccessId accessId) const; /** * Ask the registered verifier if the attached * media is the desired one or not. * * \param accessId A media access id. * \return True if media is attached and desired * according to the actual verifier. * \throws MediaNotOpenException for invalid access id. */ bool isDesiredMedia(MediaAccessId accessId) const; /** * Ask the specified verifier if the attached * media is the desired one or not. * * \param accessId A media access id. * \param verifier A verifier to use. * \return True if media is attached and desired * according to the specified verifier. * \throws MediaNotOpenException for invalid access id. */ bool isDesiredMedia(MediaAccessId accessId, const MediaVerifierRef &verifier) const; /** * Simple check, based on media's URL scheme, telling whether the * it is possible to physically change the media inside its drive, like * CDs or DVDs. Useful to decide whether to request media change from * user or not. * * \param accessId The media access id. * \return false if the media is not changeable, * true otherwise. * \throws MediaNotOpenException for invalid access id. */ bool isChangeable(MediaAccessId accessId); /** * Return the local directory that corresponds to medias url, * no matter if media isAttached or not. Files requested will * be available at 'localRoot() + filename' or even better * 'localPath( filename )' * * \param accessId A media access id. * \returns The directory name pointing to the media root * in local filesystem or an empty pathname if the * media is not attached. * \throws MediaNotOpenException for invalid access id. */ Pathname localRoot(MediaAccessId accessId) const; /** * Shortcut for 'localRoot() + pathname', but returns an empty * pathname if media is not attached. * Files provided will be available at 'localPath(filename)'. * * \param accessId A media access id. * \param pathname A path name relative to the localRoot(). * \returns The directory name in local filesystem pointing * to the desired relative pathname on the media * or an empty pathname if the media is not attached. * \throws MediaNotOpenException for invalid access id. */ Pathname localPath(MediaAccessId accessId, const Pathname & pathname) const; public: /** * \deprecated Deprecated function, please use the provideFile version that * takes a \ref OnMediaLocation argument */ ZYPP_DEPRECATED void provideFile(MediaAccessId accessId, const Pathname &filename, const ByteCount &expectedFileSize) const; /** * \deprecated Deprecated function, please use the provideFile version that * takes a \ref OnMediaLocation argument */ ZYPP_DEPRECATED void provideFile(MediaAccessId accessId, const Pathname &filename ) const; /** * Provide provide file denoted by relative path below of the * 'attach point' of the specified media and the path prefix * on the media. * * \param accessId The media access id to use. * \param file The \ref OnMediaLocation specifiying the file to download * * \throws MediaNotOpenException in case of invalid access id. * \throws MediaNotAttachedException in case, that the media is not attached. * \throws MediaNotDesiredException in case, that the media verification failed. * \throws MediaNotAFileException in case, that the requested filename is not a file. * \throws MediaFileNotFoundException in case, that the requested filenamedoes not exists. * \throws MediaWriteException in case, that the file can't be copied from from remote source. * \throws MediaSystemException in case a system operation fails. * \throws MediaException derived exception, depending on the url (handler). */ void provideFile(MediaAccessId accessId, const OnMediaLocation &file ) const; /** * FIXME: see MediaAccess class. */ void provideDir(MediaAccessId accessId, const Pathname &dirname) const; /** * FIXME: see MediaAccess class. */ void provideDirTree(MediaAccessId accessId, const Pathname &dirname) const; /** * FIXME: see MediaAccess class. */ void releaseFile(MediaAccessId accessId, const Pathname &filename) const; /** * FIXME: see MediaAccess class. */ void releaseDir(MediaAccessId accessId, const Pathname &dirname) const; /** * FIXME: see MediaAccess class. */ void releasePath(MediaAccessId accessId, const Pathname &pathname) const; /** * FIXME: see MediaAccess class. */ void dirInfo(MediaAccessId accessId, std::list &retlist, const Pathname &dirname, bool dots = true) const; /** * FIXME: see MediaAccess class. */ void dirInfo(MediaAccessId accessId, filesystem::DirContent &retlist, const Pathname &dirname, bool dots = true) const; /** * FIXME: see MediaAccess class. */ bool doesFileExist(MediaAccessId accessId, const Pathname & filename ) const; /** * Fill in a vector of detected ejectable devices and the index of the * currently attached device within the vector. The contents of the vector * are the device names (/dev/cdrom and such). * * \param accessId Medium id. * \param devices vector to load with the device names * \param index index of the currently used device in the devices vector */ void getDetectedDevices(MediaAccessId accessId, std::vector & devices, unsigned int & index) const; ZYPP_DEPRECATED void setDeltafile(MediaAccessId accessId, const Pathname &filename ) const; /** * Tries to fetch the given files and precaches them. Those files * need to be queried using provideFile and can be read from the cache directly. * The implementation is not allowed to block but needs to use seperate means to * download the files concurrently. * A backend can choose to completely ignore this functionaly, the default implementation * does nothing. * * \param accessId Medium id. * \param files List of files that should be precached */ void precacheFiles( MediaAccessId accessId, const std::vector &files); public: /** * Get the modification time of the /etc/mtab file. * \return Modification time of the /etc/mtab file. */ static time_t getMountTableMTime(); /** * Get current mount entries from /etc/mtab file. * \return Current mount entries from /etc/mtab file. */ static std::vector getMountEntries(); /** * Check if the specified \p path is useable as * attach point. * * \param path The attach point to check. * \param mtab Whether to check against the mtab, too. * \return True, if it is a directory and there are * no another attach points bellow of it. */ bool isUseableAttachPoint(const Pathname &path, bool mtab=true) const; private: friend class MediaHandler; /** * \internal * Return the attached media reference of the specified * media access id. Used to resolve nested attachments * as used in the MediaISO (iso-loop) handler. * Causes temporary creation of a shared attachment * (increases reference counters on attachedMedia). * \param media A media access id. */ AttachedMedia getAttachedMedia(MediaAccessId &accessId) const; /** * \internal * Called by media handler in while attach() to retrieve * attached media reference matching the specified media * source reference. * Causes temporary creation of a shared attachment * (increases reference counters on attachedMedia). * \param media The media source reference to search for. */ AttachedMedia findAttachedMedia(const MediaSourceRef &media) const; /** * \internal * Called by media handler in case of relase(eject=true) * to release all access id's using the specified media. * Causes temporary creation of a shared attachment * (increases reference counters on attachedMedia). * \param media The media source reference to release. */ void forceReleaseShared(const MediaSourceRef &media); private: /** * Static reference to the implementation (singleton). */ static zypp::RW_pointer m_impl; }; //////////////////////////////////////////////////////////////////// } // namespace zypp::media ////////////////////////////////////////////////////////////////////// #endif // ZYPP_MEDIA_MEDIAMANAGER_H /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp/media/MediaMultiCurl.cc000066400000000000000000001771001476576476200206740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaMultiCurl.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; using namespace zypp::base; #undef CURLVERSION_AT_LEAST #define CURLVERSION_AT_LEAST(M,N,O) LIBCURL_VERSION_NUM >= ((((M)<<8)+(N))<<8)+(O) namespace zypp { namespace media { using MultiByteHandler = zyppng::CurlMultiPartHandler; /*! * General Idea how the MultiFetchRequest pulls data from the server * * We download files in ranges using a worker per mirror URL and we want to limit the number of requests we need to start * for a download. Since we can not control the size of the ranges we need from files, those * are defined by the delta algorithm, we need to fetch multiple ranges per request. This however * adds another factor, the delta argorithm marks all ranges that we can reuse already, but those are scattered * all across the file we need to download, meaning we will have a list of ranges with gaps between them. * * For example we need the ranges: [(0,100), (200,100), (300,100), (1000, 100) ]. * Because of the gaps we can not just coalesce many ranges into a big range (0, 1100), we need to utilize multi range HTTP requests * and fetch [(0,100), (200, 200), (1000, 100)] as multibyte HTTP requests. * * Based on the filesize we calculate the nr of bytes we want to fetch per request and group the required ranges * into what we call "Stripes". Doing that will help us with the stealing algorithm that is described later. * * The logic is split in 2 main parts: * - multifetchrequest, which is the class that holds information about the full request itself * - multifetchworker, which is the worker for a specific mirror working on a specific Stripe * * When the algorithm is started, multifetchrequest will spawn a worker ( up to configured max workers ) for each mirror URL, * then calls multifetchworker::nextjob() for each worker and waits for their results on a internal event loop. * * A worker when starting up will first go into a DNS check to see if the mirror it has does resolve, then it will look into the * request instance to see what the next stripe is it needs to download. There is a simple stripe index , called _stripeNo, in the * parent request that tells the worker what the next stripe is that needs fetching. If that number is still a valid index the worker * will increase it and claim the stripe for itself. Building a HTTP request and waiting for its result. * * Some servers do only support fetching a max number of ranges, in that instance the worker will finish the request and return true * for "hasMoreWork". In that cases the event loop in multifetchrequest will tell the worker to continue the job until all blocks were * fetched. * * Before writing to a block or starting a new block, a worker will first check if it was already marked as FINALIZED in the stripe, if that is the case the worker will * set itself to WORKER_DISCARD and ask for a new job, otherwise it will start writing into the block and set it to COMPETING. * * At the end of writing a block, the worker will first check if the data it received was valid via the given digest and go into WORKER_BROKEN if is not. * When valid data was received it checks the state of the block in the stripe, if it is set to FETCH the block is marked as * FINALIZED and considered to be done and valid. If the block is already marked as COMPETING, the worker will recalc the checksum and mark the block * as FINALIZED if the result is valid, otherwise the block is marked with REFETCH to force redownloading it. * * In case of a error, the request is stopped and the worker reports back to the multifetchrequest event loop which will set the * worker into a "Broken" state stopping it from fetching more jobs. If there are more mirrors available, it will spawn a new worker * which then can also start to claim jobs. This makes sure that even when we have errors, we try all mirrors until we run out of them. * The broken worker will not be deleted, instead it will stay in the list of workers until another one will "steal" the work from it and * hopefully finish it. * * Now, once all Stripes have been claimed and a worker was asked to get the next job it will start to steal from others. Meaning it will * go over the list of currently running workers and try to figure out the best candidate for stealing. This is based on the performance of the * worker and how many workers already compete on a stripe. * * - If the worker finds a best candidate it will start competition on the stripe and * will request all ranges not marked as "FINALIZED" from the server as well. The worker finishing a block first wins, the one loosing will * stop downloading and report back to get a next job if there is one. * - If the worker can not find a best candidate , it will set itself to "WORKER_DONE" and stop stealing stripes * * * Once a worker is done it needs to check if all blocks from its current stripe are marked as FINALIZED, otherwise they need to be refetched. */ class multifetchrequest; struct Stripe { enum RState { PENDING, //< Pending Range FETCH, //< Fetch is running! COMPETING, //< Competing workers, needs checksum recheck FINALIZED, //< Done, don't write to it anymore REFETCH //< This block needs a refetch }; std::vector blocks; //< required block numbers from blocklist std::vector blockStates; //< current state of each block in blocks }; enum MultiFetchWorkerState { WORKER_STARTING, WORKER_LOOKUP, WORKER_FETCH, WORKER_DISCARD, WORKER_DONE, WORKER_SLEEP, WORKER_BROKEN }; // Hack: we derive from MediaCurl just to get the storage space for // settings, url, curlerrors and the like class multifetchworker : private MediaCurl, public zyppng::CurlMultiPartDataReceiver { friend class multifetchrequest; public: multifetchworker(int no, multifetchrequest &request, const Url &url); multifetchworker(const multifetchworker &) = delete; multifetchworker(multifetchworker &&) = delete; multifetchworker &operator=(const multifetchworker &) = delete; multifetchworker &operator=(multifetchworker &&) = delete; ~multifetchworker() override; /*! * Fetches the next job from the parent request, * then calls runjob to execute it */ void nextjob(); /*! * Fetches all jobs from the currently claimed stripe or calls nextjob() * if the current stripe has all blocks marked as FINALIZED */ void runjob(); /*! * Continues a running job, only called by the dispatcher * if the multibyte handler indicates it has more work * to trigger fetching the next range batch */ bool continueJob(); /*! * Rechecks the checksum of the given block at \a blockIdx. * The index is relative to the workers blocklist */ bool recheckChecksum( off_t blockIdx ); /*! * Stop all competing workers and set them to WORKER_DISCARD */ void disableCompetition(); /*! * Starts the dns check */ void checkdns(); void adddnsfd( std::vector &waitFds ); void dnsevent(const std::vector &waitFds ); const int _workerno; MultiFetchWorkerState _state = WORKER_STARTING; bool _competing = false; std::vector _blocks; std::vector _rangeToStripeBlock; MultiByteHandler::ProtocolMode _protocolMode = MultiByteHandler::ProtocolMode::Basic; std::unique_ptr _multiByteHandler; off_t _stripe = 0; //< The current stripe we are downloading size_t _datasize = 0; //< The nr of bytes we need to download overall double _starttime = 0; //< When was the current job started size_t _datareceived = 0; //< Data downloaded in the current job only off_t _received = 0; //< Overall data"MultiByteHandler::prepare failed" fetched by this worker double _avgspeed = 0; double _maxspeed = 0; double _sleepuntil = 0; private: void run(); void stealjob(); bool setupHandle(); MultiByteHandler::Range rangeFromBlock( off_t blockNo ) const; size_t writefunction ( char *ptr, std::optional offset, size_t bytes ) override; size_t headerfunction ( char *ptr, size_t bytes ) override; bool beginRange ( off_t range, std::string &cancelReason ) override; bool finishedRange ( off_t range, bool validated, std::string &cancelReason ) override; multifetchrequest *_request = nullptr; int _pass = 0; std::string _urlbuf; pid_t _pid = 0; int _dnspipe = -1; }; class multifetchrequest : protected internal::CurlPollHelper::CurlPoll { public: multifetchrequest(const MediaMultiCurl *context, Pathname filename, Url baseurl, CURLM *multi, FILE *fp, callback::SendReport *report, MediaBlockList &&blklist, off_t filesize); multifetchrequest(const multifetchrequest &) = delete; multifetchrequest(multifetchrequest &&) = delete; multifetchrequest &operator=(const multifetchrequest &) = delete; multifetchrequest &operator=(multifetchrequest &&) = delete; ~multifetchrequest(); void run(std::vector &urllist); static ByteCount makeBlksize( uint maxConns, size_t filesize ); MediaBlockList &blockList() { return _blklist; } protected: friend class multifetchworker; const MediaMultiCurl *_context; const Pathname _filename; Url _baseurl; FILE *_fp = nullptr; callback::SendReport *_report = nullptr; MediaBlockList _blklist; std::vector _requiredStripes; // all the data we need off_t _filesize = 0; //< size of the file we want to download std::list< std::unique_ptr > _workers; bool _stealing = false; bool _havenewjob = false; zypp::ByteCount _defaultBlksize = 0; //< The blocksize to use if the metalink file does not specify one off_t _stripeNo = 0; //< next stripe to download size_t _activeworkers = 0; size_t _lookupworkers = 0; size_t _sleepworkers = 0; double _minsleepuntil = 0; bool _finished = false; off_t _totalsize = 0; //< nr of bytes we need to download ( e.g. filesize - ( bytes reused from deltafile ) ) off_t _fetchedsize = 0; off_t _fetchedgoodsize = 0; double _starttime = 0; double _lastprogress = 0; double _lastperiodstart = 0; double _lastperiodfetched = 0; double _periodavg = 0; public: double _timeout = 0; double _connect_timeout = 0; double _maxspeed = 0; int _maxworkers = 0; }; constexpr auto MIN_REQ_MIRRS = 4; constexpr auto MAXURLS = 10; // TCP communication scales up as a connection proceeds. This is due to TCP slowstart where // the congestion window scales up. The stripe calculation assumes that every package can be fairly // downloaded from multiple mirrors omits that attempting to download say 1MB from 4 mirrors // means 4 requests of 256k, where then you have four congestion windows that need to increase // meaning the overall download speed is significantly lower. Counter intuitively this leads to // cases where *more* mirrors being available to zypper significantly lowers performance. // // Instead, there should be a minimum stripe size cap. This way any item smaller than the value // is downloaded in a single request, where as larger items are downloaded from many mirrors // but each range has enough time to increase it's congestion window to something reasonable. // // Initial value 4 MB; constexpr auto MIN_STRIPE_SIZE_KB = 4096; ////////////////////////////////////////////////////////////////////// static double currentTime() { #if _POSIX_C_SOURCE >= 199309L struct timespec ts; if ( clock_gettime( CLOCK_MONOTONIC, &ts) ) return 0; return ts.tv_sec + ts.tv_nsec / 1000000000.; #else struct timeval tv; if (gettimeofday(&tv, NULL)) return 0; return tv.tv_sec + tv.tv_usec / 1000000.; #endif } size_t multifetchworker::writefunction(char *ptr, std::optional offset, size_t bytes) { if ( _state == WORKER_BROKEN || _state == WORKER_DISCARD ) return bytes ? 0 : 1; double now = currentTime(); // update stats of overall data _datareceived += bytes; _received += bytes; _request->_lastprogress = now; const auto &currRange = _multiByteHandler->currentRange(); if (!currRange) return 0; // we always write to a range auto &stripeDesc = _request->_requiredStripes[_stripe]; if ( !_request->_fp || stripeDesc.blockStates[ _rangeToStripeBlock[*currRange] ] == Stripe::FINALIZED ) { // someone else finished our block first! // we stop here and fetch new jobs if there are still some _state = WORKER_DISCARD; _competing = false; return 0; } const auto &blk = _blocks[*currRange]; off_t seekTo = blk._start + blk.bytesWritten; if ( ftell( _request->_fp ) != seekTo ) { // if we can't seek the file there is no purpose in trying again if (fseeko(_request->_fp, seekTo, SEEK_SET)) return bytes ? 0 : 1; } size_t cnt = fwrite(ptr, 1, bytes, _request->_fp); _request->_fetchedsize += cnt; return cnt; } bool multifetchworker::beginRange ( off_t workerRangeOff, std::string &cancelReason ) { auto &stripeDesc = _request->_requiredStripes[_stripe]; auto stripeRangeOff = _rangeToStripeBlock[workerRangeOff]; const auto &currRangeState = stripeDesc.blockStates[stripeRangeOff]; if ( currRangeState == Stripe::FINALIZED ){ cancelReason = "Cancelled because stripe block is already finalized"; _state = WORKER_DISCARD; WAR << "#" << _workerno << ": trying to start a range ("<_stealing << endl; return false; } stripeDesc.blockStates[stripeRangeOff] = currRangeState == Stripe::PENDING ? Stripe::FETCH : Stripe::COMPETING; return true; } bool multifetchworker::finishedRange ( off_t workerRangeOff, bool validated, std::string &cancelReason ) { auto &stripeDesc = _request->_requiredStripes[_stripe]; auto stripeRangeOff = _rangeToStripeBlock[workerRangeOff]; const auto &currRangeState = stripeDesc.blockStates[stripeRangeOff]; if ( !validated ) { // fail, worker will go into WORKER_BROKEN cancelReason = "Block failed to validate"; return false; } if ( currRangeState == Stripe::FETCH ) { // only us who wrote here, block is finalized stripeDesc.blockStates[stripeRangeOff] = Stripe::FINALIZED; _request->_fetchedgoodsize += _blocks[workerRangeOff]._len; } else { // others wrote here, we need to check the full checksum if ( recheckChecksum ( workerRangeOff ) ) { stripeDesc.blockStates[stripeRangeOff] = Stripe::FINALIZED; _request->_fetchedgoodsize += _blocks[workerRangeOff]._len; } else { // someone messed that block up, set it to refetch but continue since our // data is valid WAR << "#" << _workerno << ": Broken data in COMPETING block, requesting refetch. Stealing is: " << _request->_stealing << endl; stripeDesc.blockStates[stripeRangeOff] = Stripe::REFETCH; } } return true; } size_t multifetchworker::headerfunction( char *p, size_t bytes ) { size_t l = bytes; if (l > 9 && !strncasecmp(p, "Location:", 9)) { std::string line(p + 9, l - 9); if (line[l - 10] == '\r') line.erase(l - 10, 1); XXX << "#" << _workerno << ": redirecting to" << line << endl; return bytes; } const auto &repSize = _multiByteHandler->reportedFileSize (); if ( repSize && *repSize != _request->_filesize ) { XXX << "#" << _workerno << ": filesize mismatch" << endl; _state = WORKER_BROKEN; setCurlError("filesize mismatch"); return 0; } return bytes; } multifetchworker::multifetchworker(int no, multifetchrequest &request, const Url &url) : MediaCurl(url, Pathname()) , _workerno( no ) , _maxspeed( request._maxspeed ) , _request ( &request ) { Url curlUrl( clearQueryString(url) ); _urlbuf = curlUrl.asString(); _curl = _request->_context->fromEasyPool(_url.getHost()); if (_curl) XXX << "reused worker from pool" << endl; if (!_curl && !(_curl = curl_easy_init())) { _state = WORKER_BROKEN; setCurlError("curl_easy_init failed"); return; } if ( url.getScheme() == "http" || url.getScheme() == "https" ) _protocolMode = MultiByteHandler::ProtocolMode::HTTP; setupHandle(); checkdns(); } bool multifetchworker::setupHandle() { try { setupEasy(); } catch (Exception &ex) { curl_easy_cleanup(_curl); _curl = 0; _state = WORKER_BROKEN; setCurlError("curl_easy_setopt failed"); return false; } curl_easy_setopt(_curl, CURLOPT_PRIVATE, this); curl_easy_setopt(_curl, CURLOPT_URL, _urlbuf.c_str()); // if this is the same host copy authorization // (the host check is also what curl does when doing a redirect) // (note also that unauthorized exceptions are thrown with the request host) if ( _url.getHost() == _request->_context->_url.getHost()) { _settings.setUsername(_request->_context->_settings.username()); _settings.setPassword(_request->_context->_settings.password()); _settings.setAuthType(_request->_context->_settings.authType()); if ( _settings.userPassword().size() ) { curl_easy_setopt(_curl, CURLOPT_USERPWD, _settings.userPassword().c_str()); std::string use_auth = _settings.authType(); if (use_auth.empty()) use_auth = "digest,basic"; // our default long auth = CurlAuthData::auth_type_str2long(use_auth); if( auth != CURLAUTH_NONE) { XXX << "#" << _workerno << ": Enabling HTTP authentication methods: " << use_auth << " (CURLOPT_HTTPAUTH=" << auth << ")" << std::endl; curl_easy_setopt(_curl, CURLOPT_HTTPAUTH, auth); } } } return true; } multifetchworker::~multifetchworker() { if (_curl) { if (_state == WORKER_FETCH || _state == WORKER_DISCARD) curl_multi_remove_handle(_request->_multi, _curl); if (_state == WORKER_DONE || _state == WORKER_SLEEP) { #if CURLVERSION_AT_LEAST(7,15,5) curl_easy_setopt(_curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t)0); #endif curl_easy_setopt(_curl, CURLOPT_PRIVATE, (void *)0); curl_easy_setopt(_curl, CURLOPT_WRITEFUNCTION, (void *)0); curl_easy_setopt(_curl, CURLOPT_WRITEDATA, (void *)0); curl_easy_setopt(_curl, CURLOPT_HEADERFUNCTION, (void *)0); curl_easy_setopt(_curl, CURLOPT_HEADERDATA, (void *)0); _request->_context->toEasyPool(_url.getHost(), _curl); } else curl_easy_cleanup(_curl); _curl = 0; } if (_pid) { kill(_pid, SIGKILL); int status = 0; zyppng::eintrSafeCall( waitpid, _pid, &status, 0); _pid = 0; } if (_dnspipe != -1) { close(_dnspipe); _dnspipe = -1; } // the destructor in MediaCurl doesn't call disconnect() if // the media is not attached, so we do it here manually disconnectFrom(); } static inline bool env_isset(const std::string& name) { const char *s = getenv(name.c_str()); return s && *s ? true : false; } void multifetchworker::checkdns() { std::string host = _url.getHost(); if (host.empty()) return; if (_request->_context->isDNSok(host)) return; // no need to do dns checking for numeric hosts char addrbuf[128]; if (inet_pton(AF_INET, host.c_str(), addrbuf) == 1) return; if (inet_pton(AF_INET6, host.c_str(), addrbuf) == 1) return; // no need to do dns checking if we use a proxy if (!_settings.proxy().empty()) return; if (env_isset("all_proxy") || env_isset("ALL_PROXY")) return; std::string schemeproxy = _url.getScheme() + "_proxy"; if (env_isset(schemeproxy)) return; if (schemeproxy != "http_proxy") { std::transform(schemeproxy.begin(), schemeproxy.end(), schemeproxy.begin(), ::toupper); if (env_isset(schemeproxy)) return; } XXX << "checking DNS lookup of " << host << endl; int pipefds[2]; if (pipe(pipefds)) { _state = WORKER_BROKEN; setCurlError("DNS pipe creation failed"); return; } _pid = fork(); if (_pid == pid_t(-1)) { close(pipefds[0]); close(pipefds[1]); _pid = 0; _state = WORKER_BROKEN; setCurlError("DNS checker fork failed"); return; } else if (_pid == 0) { close(pipefds[0]); // XXX: close all other file descriptors struct addrinfo *ai = nullptr, aihints; memset(&aihints, 0, sizeof(aihints)); aihints.ai_family = PF_UNSPEC; int tstsock = socket(PF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0); if (tstsock == -1) aihints.ai_family = PF_INET; else close(tstsock); aihints.ai_socktype = SOCK_STREAM; aihints.ai_flags = AI_CANONNAME; unsigned int connecttimeout = _request->_connect_timeout; if (connecttimeout) alarm(connecttimeout); signal(SIGALRM, SIG_DFL); if (getaddrinfo(host.c_str(), NULL, &aihints, &ai)) _exit(1); _exit(0); } close(pipefds[1]); _dnspipe = pipefds[0]; _state = WORKER_LOOKUP; } void multifetchworker::adddnsfd(std::vector &waitFds) { if (_state != WORKER_LOOKUP) return; waitFds.push_back ( GPollFD { .fd = _dnspipe, .events = G_IO_IN | G_IO_HUP | G_IO_ERR, .revents = 0 }); } void multifetchworker::dnsevent( const std::vector &waitFds ) { bool hasEvent = std::any_of( waitFds.begin (), waitFds.end(),[this]( const GPollFD &waitfd ){ return ( waitfd.fd == _dnspipe && waitfd.revents != 0 ); }); if (_state != WORKER_LOOKUP || !hasEvent) return; int status = 0; zyppng::eintrSafeCall( waitpid, _pid, &status, 0); _pid = 0; if (_dnspipe != -1) { close(_dnspipe); _dnspipe = -1; } if (!WIFEXITED(status)) { _state = WORKER_BROKEN; setCurlError("DNS lookup failed"); _request->_activeworkers--; return; } int exitcode = WEXITSTATUS(status); XXX << "#" << _workerno << ": DNS lookup returned " << exitcode << endl; if (exitcode != 0) { _state = WORKER_BROKEN; setCurlError("DNS lookup failed"); _request->_activeworkers--; return; } _request->_context->setDNSok(_url.getHost()); nextjob(); } bool multifetchworker::recheckChecksum( off_t workerRangeIdx ) { // XXX << "recheckChecksum block " << _blkno << endl; if (!_request->_fp || !_datasize || !_blocks.size() ) return true; auto &blk = _blocks[workerRangeIdx]; if ( !blk._digest ) return true; const auto currOf = ftell( _request->_fp ); if ( currOf == -1 ) return false; if (fseeko(_request->_fp, blk._start, SEEK_SET)) return false; zypp::Digest newDig = blk._digest->clone(); char buf[4096]; size_t l = blk._len; while (l) { size_t cnt = l > sizeof(buf) ? sizeof(buf) : l; if (fread(buf, cnt, 1, _request->_fp) != 1) return false; newDig.update(buf, cnt); l -= cnt; } if (fseeko(_request->_fp, currOf, SEEK_SET)) return false; blk._digest = std::move(newDig); if (!_multiByteHandler->validateRange(blk)) { WAR << "#" << _workerno << " Stripe: " << _stripe << ": Stripe-Block: " << _rangeToStripeBlock[workerRangeIdx] << " failed to validate" << endl; return false; } return true; } /*! * Calculates the range information for the given \a blkNo ( actual block index in the request blocklist, NOT the stripe or worker index ) */ zyppng::CurlMultiPartHandler::Range multifetchworker::rangeFromBlock( off_t blkNo ) const { UByteArray sum; std::optional digest; std::optional relDigLen; std::optional blkSumPad; const auto &blk = _request->_blklist.getBlock( blkNo ); if ( _request->_blklist.haveChecksum ( blkNo ) ) { sum = _request->_blklist.getChecksum( blkNo ); relDigLen = sum.size( ); blkSumPad = _request->_blklist.checksumPad( ); digest = zypp::Digest(); digest->create( _request->_blklist.getChecksumType() ); } return MultiByteHandler::Range::make( blk.off, blk.size, std::move(digest), std::move(sum), {}, // empty user data std::move(relDigLen), std::move(blkSumPad) ); } void multifetchworker::stealjob() { if (!_request->_stealing) { XXX << "start stealing!" << endl; _request->_stealing = true; } multifetchworker *best = 0; // best choice for the worker we want to compete with double now = 0; // look through all currently running workers to find the best candidate we // could steal from for (auto workeriter = _request->_workers.begin(); workeriter != _request->_workers.end(); ++workeriter) { multifetchworker *worker = workeriter->get(); if (worker == this) continue; if (worker->_pass == -1) continue; // do not steal! if (worker->_state == WORKER_DISCARD || worker->_state == WORKER_DONE || worker->_state == WORKER_SLEEP || !worker->_datasize) continue; // do not steal finished jobs if (!worker->_avgspeed && worker->_datareceived) { // calculate avg speed for the worker if that was not done yet if (!now) now = currentTime(); if (now > worker->_starttime) worker->_avgspeed = worker->_datareceived / (now - worker->_starttime); } // only consider worker who still have work if ( worker->_datasize - worker->_datareceived <= 0 ) continue; if (!best || best->_pass > worker->_pass) { best = worker; continue; } if (best->_pass < worker->_pass) continue; // if it is the same stripe, our current best choice is competing with the worker we are looking at // we need to check if we are faster than the fastest one competing for this stripe, so we want the best. // Otherwise the worst. if (worker->_stripe == best->_stripe) { if ((worker->_datasize - worker->_datareceived) * best->_avgspeed < (best->_datasize - best->_datareceived) * worker->_avgspeed) best = worker; } else { if ((worker->_datasize - worker->_datareceived) * best->_avgspeed > (best->_datasize - best->_datareceived) * worker->_avgspeed) best = worker; } } if (!best) { _state = WORKER_DONE; _request->_activeworkers--; _request->_finished = true; return; } // do not sleep twice if (_state != WORKER_SLEEP) { if (!_avgspeed && _datareceived) { if (!now) now = currentTime(); if (now > _starttime) _avgspeed = _datareceived / (now - _starttime); } // lets see if we should sleep a bit XXX << "me #" << _workerno << ": " << _avgspeed << ", size " << best->_datasize << endl; XXX << "best #" << best->_workerno << ": " << best->_avgspeed << ", size " << (best->_datasize - best->_datareceived) << endl; // check if we could download the full data from best faster than best could download its remaining data if ( _avgspeed && best->_avgspeed // we and best have average speed information && _avgspeed <= best->_avgspeed ) // and we are not faster than best { if (!now) now = currentTime(); double sl = (best->_datasize - best->_datareceived) / best->_avgspeed * 2; if (sl > 1) sl = 1; XXX << "#" << _workerno << ": going to sleep for " << sl * 1000 << " ms" << endl; _sleepuntil = now + sl; _state = WORKER_SLEEP; _request->_sleepworkers++; return; } } _competing = true; best->_competing = true; _stripe = best->_stripe; best->_pass++; _pass = best->_pass; runjob(); } void multifetchworker::disableCompetition() { for ( auto workeriter = _request->_workers.begin(); workeriter != _request->_workers.end(); ++workeriter) { multifetchworker *worker = workeriter->get(); if (worker == this) continue; if (worker->_stripe == _stripe) { if (worker->_state == WORKER_FETCH) worker->_state = WORKER_DISCARD; worker->_pass = -1; /* do not steal this one, we already have it */ } } } void multifetchworker::nextjob() { _datasize = 0; _blocks.clear(); // claim next stripe for us, or steal if there nothing left to claim if ( _request->_stealing || _request->_stripeNo >= _request->_requiredStripes.size() ) { stealjob(); return; } _stripe = _request->_stripeNo++; runjob(); } void multifetchworker::runjob() { _datasize = 0; _blocks.clear (); _rangeToStripeBlock.clear (); auto &stripeDesc = _request->_requiredStripes[_stripe]; for ( uint i = 0; i < stripeDesc.blocks.size(); i++ ) { // ignore verified and finalized ranges if( stripeDesc.blockStates[i] == Stripe::FINALIZED ) { continue; } else { _blocks.push_back( rangeFromBlock(stripeDesc.blocks[i]) ); _rangeToStripeBlock.push_back( i ); _datasize += _blocks.back()._len; } } if ( _datasize == 0 ) { // no blocks left in this stripe _state = WORKER_DONE; _request->_activeworkers--; if ( !_request->_activeworkers ) _request->_finished = true; return; } DBG << "#" << _workerno << "Done adding blocks to download, going to download: " << _blocks.size() << " nr of block with " << _datasize << " nr of bytes" << std::endl; _multiByteHandler.reset( nullptr ); _multiByteHandler = std::make_unique(_protocolMode, _curl, _blocks, *this ); _starttime = currentTime(); _datareceived = 0; run(); } bool multifetchworker::continueJob() { bool hadRangeFail = _multiByteHandler->lastError() == MultiByteHandler::Code::RangeFail; if ( !_multiByteHandler->prepareToContinue() ) { setCurlError(_multiByteHandler->lastErrorMessage().c_str()); return false; } if ( hadRangeFail ) { // we reset the handle to default values. We do this to not run into // "transfer closed with outstanding read data remaining" error CURL sometimes returns when // we cancel a connection because of a range error to request a smaller batch. // The error will still happen but much less frequently than without resetting the handle. // // Note: Even creating a new handle will NOT fix the issue curl_easy_reset( _curl ); if ( !setupHandle()) return false; } run(); return true; } void multifetchworker::run() { if (_state == WORKER_BROKEN || _state == WORKER_DONE) return; // just in case... if ( !_multiByteHandler->prepare() ) { _request->_activeworkers--; _state = WORKER_BROKEN; setCurlError(_multiByteHandler->lastErrorMessage ().c_str()); return; } if (curl_multi_add_handle(_request->_multi, _curl) != CURLM_OK) { _request->_activeworkers--; _state = WORKER_BROKEN; setCurlError("curl_multi_add_handle failed"); return; } _request->_havenewjob = true; _state = WORKER_FETCH; } ////////////////////////////////////////////////////////////////////// multifetchrequest::multifetchrequest(const MediaMultiCurl *context, Pathname filename, Url baseurl, CURLM *multi, FILE *fp, callback::SendReport *report, MediaBlockList &&blklist, off_t filesize) : internal::CurlPollHelper::CurlPoll{ multi } , _context(context) , _filename(std::move(filename)) , _baseurl(std::move(baseurl)) , _fp(fp) , _report(report) , _blklist(std::move(blklist)) , _filesize(filesize) , _starttime(currentTime()) , _timeout(context->_settings.timeout()) , _connect_timeout(context->_settings.connectTimeout()) , _maxspeed(context->_settings.maxDownloadSpeed()) , _maxworkers(context->_settings.maxConcurrentConnections()) { _lastperiodstart = _lastprogress = _starttime; if (_maxworkers > MAXURLS) _maxworkers = MAXURLS; if (_maxworkers <= 0) _maxworkers = 1; // calculate the total size of our download for (size_t blkno = 0; blkno < _blklist.numBlocks(); blkno++) _totalsize += _blklist.getBlock(blkno).size; // equally distribute the data we want to download over all workers _defaultBlksize = makeBlksize( _maxworkers, _totalsize ); // lets build stripe informations zypp::ByteCount currStripeSize = 0; for (size_t blkno = 0; blkno < _blklist.numBlocks(); blkno++) { const MediaBlock &blk = _blklist.getBlock(blkno); if ( _requiredStripes.empty() || currStripeSize >= _defaultBlksize ) { _requiredStripes.push_back( Stripe{} ); currStripeSize = 0; } _requiredStripes.back().blocks.push_back(blkno); _requiredStripes.back().blockStates.push_back(Stripe::PENDING); currStripeSize += blk.size; } MIL << "Downloading " << _blklist.numBlocks() << " blocks via " << _requiredStripes.size() << " stripes on " << _maxworkers << " connections." << endl; } multifetchrequest::~multifetchrequest() { _workers.clear(); } void multifetchrequest::run(std::vector &urllist) { int workerno = 0; std::vector::iterator urliter = urllist.begin(); internal::CurlPollHelper _curlHelper(*this); // kickstart curl CURLMcode mcode = _curlHelper.handleTimout(); if (mcode != CURLM_OK) ZYPP_THROW(MediaCurlException(_baseurl, "curl_multi_socket_action", "unknown error")); for (;;) { // list of all fds we want to poll std::vector waitFds; int dnsFdCount = 0; if (_finished) { XXX << "finished!" << endl; break; } if ((int)_activeworkers < _maxworkers && urliter != urllist.end() && _workers.size() < MAXURLS) { // spawn another worker! _workers.push_back(std::make_unique(workerno++, *this, *urliter)); auto &worker = _workers.back(); if (worker->_state != WORKER_BROKEN) { _activeworkers++; if (worker->_state != WORKER_LOOKUP) { worker->nextjob(); } else _lookupworkers++; } ++urliter; continue; } if (!_activeworkers) { WAR << "No more active workers!" << endl; // show the first worker error we find for (auto workeriter = _workers.begin(); workeriter != _workers.end(); ++workeriter) { if ((*workeriter)->_state != WORKER_BROKEN) continue; ZYPP_THROW(MediaCurlException(_baseurl, "Server error", (*workeriter)->curlError())); } break; } if (_lookupworkers) for (auto workeriter = _workers.begin(); workeriter != _workers.end(); ++workeriter) (*workeriter)->adddnsfd( waitFds ); // if we added a new job we have to call multi_perform once // to make it show up in the fd set. do not sleep in this case. // setting timeout to 0 and not -1 will make sure the poll() case further down is actually entered, do not change // without adapting the logic around poll int timeoutMs = _havenewjob ? 0 : 200; if ( _sleepworkers && !_havenewjob ) { if (_minsleepuntil == 0) { for (auto workeriter = _workers.begin(); workeriter != _workers.end(); ++workeriter) { multifetchworker *worker = workeriter->get(); if (worker->_state != WORKER_SLEEP) continue; if (!_minsleepuntil || _minsleepuntil > worker->_sleepuntil) _minsleepuntil = worker->_sleepuntil; } } double sl = _minsleepuntil - currentTime(); if (sl < 0) { sl = 0; _minsleepuntil = 0; } if (sl < .2) timeoutMs = sl * 1000; } if ( _curlHelper.timeout_ms.has_value() ) timeoutMs = std::min( timeoutMs, _curlHelper.timeout_ms.value() ); dnsFdCount = waitFds.size(); // remember how many dns fd's we have waitFds.insert( waitFds.end(), _curlHelper.socks.begin(), _curlHelper.socks.end() ); // add the curl fd's to the poll data // run poll only if we either have a valid timeout or sockets to wait for... otherwise we end up waiting forever (bsc#1230912) if ( !waitFds.empty() || timeoutMs != -1) { int r = zypp_detail::zypp_poll( waitFds, timeoutMs ); if ( r == -1 ) ZYPP_THROW(MediaCurlException(_baseurl, "zypp_poll() failed", "unknown error")); if ( r != 0 && _lookupworkers ) { for (auto workeriter = _workers.begin(); workeriter != _workers.end(); ++workeriter) { multifetchworker *worker = workeriter->get(); if (worker->_state != WORKER_LOOKUP) continue; (*workeriter)->dnsevent( waitFds ); if (worker->_state != WORKER_LOOKUP) _lookupworkers--; } } // run curl if ( r == 0 ) { CURLMcode mcode = _curlHelper.handleTimout(); if (mcode != CURLM_OK) ZYPP_THROW(MediaCurlException(_baseurl, "curl_multi_socket_action", "unknown error")); } else { CURLMcode mcode = _curlHelper.handleSocketActions( waitFds, dnsFdCount ); if (mcode != CURLM_OK) ZYPP_THROW(MediaCurlException(_baseurl, "curl_multi_socket_action", "unknown error")); } // reset havenewjobs, we just called into curl_multi_socket_action ... no need to call another time just because // we maybe added jobs during checking the dns worker events _havenewjob = false; } double now = currentTime(); // update periodavg if (now > _lastperiodstart + .5) { if (!_periodavg) _periodavg = (_fetchedsize - _lastperiodfetched) / (now - _lastperiodstart); else _periodavg = (_periodavg + (_fetchedsize - _lastperiodfetched) / (now - _lastperiodstart)) / 2; _lastperiodfetched = _fetchedsize; _lastperiodstart = now; } // wake up sleepers if (_sleepworkers) { for (auto workeriter = _workers.begin(); workeriter != _workers.end(); ++workeriter) { multifetchworker *worker = workeriter->get(); if (worker->_state != WORKER_SLEEP) continue; if (worker->_sleepuntil > now) continue; if (_minsleepuntil == worker->_sleepuntil) _minsleepuntil = 0; XXX << "#" << worker->_workerno << ": sleep done, wake up" << endl; _sleepworkers--; // nextjob changes the state worker->nextjob(); } } // collect all curl results, (re)schedule jobs CURLMsg *msg = nullptr; int nqueue = 0; while ((msg = curl_multi_info_read(_multi, &nqueue)) != 0) { if (msg->msg != CURLMSG_DONE) continue; CURL *easy = msg->easy_handle; CURLcode cc = msg->data.result; multifetchworker *worker = nullptr; if (curl_easy_getinfo(easy, CURLINFO_PRIVATE, &worker) != CURLE_OK) ZYPP_THROW(MediaCurlException(_baseurl, "curl_easy_getinfo", "unknown error")); if (worker->_datareceived && now > worker->_starttime) { if (worker->_avgspeed) worker->_avgspeed = (worker->_avgspeed + worker->_datareceived / (now - worker->_starttime)) / 2; else worker->_avgspeed = worker->_datareceived / (now - worker->_starttime); } XXX << "#" << worker->_workerno << " done code " << cc << " speed " << worker->_avgspeed << endl; curl_multi_remove_handle(_multi, easy); const auto &setWorkerBroken = [&]( const std::string &str = {} ){ worker->_state = WORKER_BROKEN; if ( !str.empty () ) worker->setCurlError(str.c_str()); _activeworkers--; if (!_activeworkers && !(urliter != urllist.end() && _workers.size() < MAXURLS)) { // end of workers reached! goodbye! worker->evaluateCurlCode(Pathname(), cc, false); } }; if ( !worker->_multiByteHandler ) { WAR << "#" << worker->_workerno << ": has no multibyte handler, this is a bug" << endl; setWorkerBroken("Multibyte handler error"); continue; } // tell the worker to finalize the current block worker->_multiByteHandler->finalize(); if ( worker->_multiByteHandler->hasMoreWork() && ( cc == CURLE_OK || worker->_multiByteHandler->canRecover() ) ) { WAR << "#" << worker->_workerno << ": still has work to do or can recover from a error, continuing the job!" << endl; // the current job is not done, or we failed and need to try more, enqueue and start again if ( !worker->continueJob() ) { WAR << "#" << worker->_workerno << ": failed to continue (" << worker->_multiByteHandler->lastErrorMessage() << ")" << endl; setWorkerBroken( worker->_multiByteHandler->lastErrorMessage() ); } continue; } // --- from here on worker has no more ranges in its current job, or had a error it can't recover from --- if ( cc != CURLE_OK ) { if ( worker->_state != WORKER_DISCARD ) { // something went wrong and we can not recover, broken worker! setWorkerBroken(); continue; } else { WAR << "#" << worker->_workerno << ": failed, but was set to discard, reusing for new requests" << endl; } } else { // we got what we asked for, maybe. Lets see if all ranges have been marked as finalized if( !worker->_multiByteHandler->verifyData() ) { WAR << "#" << worker->_workerno << ": error: " << worker->_multiByteHandler->lastErrorMessage() << ", disable worker" << endl; setWorkerBroken(); continue; } // from here on we know THIS worker only got data that verified // now lets see if the stripe was finished too // stripe blocks can now be only in FINALIZED or ERROR states if (worker->_state == WORKER_FETCH ) { if ( worker->_competing ) { worker->disableCompetition (); } auto &wrkerStripe = _requiredStripes[worker->_stripe]; bool done = std::all_of( wrkerStripe.blockStates.begin(), wrkerStripe.blockStates.begin(), []( const Stripe::RState s ) { return s == Stripe::FINALIZED; } ); if ( !done ) { // all ranges that are not finalized are in a bogus state, refetch them std::for_each( wrkerStripe.blockStates.begin(), wrkerStripe.blockStates.begin(), []( Stripe::RState &s ) { if ( s != Stripe::FINALIZED) s = Stripe::PENDING; }); _finished = false; //reset finished flag worker->runjob(); continue; } } // make bad workers ( bad as in really slow ) sleep a little double maxavg = 0; int maxworkerno = 0; int numbetter = 0; for (auto workeriter = _workers.begin(); workeriter != _workers.end(); ++workeriter) { multifetchworker *oworker = workeriter->get(); if (oworker->_state == WORKER_BROKEN) continue; if (oworker->_avgspeed > maxavg) { maxavg = oworker->_avgspeed; maxworkerno = oworker->_workerno; } if (oworker->_avgspeed > worker->_avgspeed) numbetter++; } if (maxavg && !_stealing) { double ratio = worker->_avgspeed / maxavg; ratio = 1 - ratio; if (numbetter < 3) // don't sleep that much if we're in the top two ratio = ratio * ratio; if (ratio > .01) { XXX << "#" << worker->_workerno << ": too slow ("<< ratio << ", " << worker->_avgspeed << ", #" << maxworkerno << ": " << maxavg << "), going to sleep for " << ratio * 1000 << " ms" << endl; worker->_sleepuntil = now + ratio; worker->_state = WORKER_SLEEP; _sleepworkers++; continue; } } // do rate control (if requested) // should use periodavg, but that's not what libcurl does if (_maxspeed && now > _starttime) { double avg = _fetchedsize / (now - _starttime); avg = worker->_maxspeed * _maxspeed / avg; if (avg < _maxspeed / _maxworkers) avg = _maxspeed / _maxworkers; if (avg > _maxspeed) avg = _maxspeed; if (avg < 1024) avg = 1024; worker->_maxspeed = avg; #if CURLVERSION_AT_LEAST(7,15,5) curl_easy_setopt(worker->_curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t)(avg)); #endif } worker->nextjob(); } if ( _filesize > 0 && _fetchedgoodsize > _filesize ) { ZYPP_THROW(MediaFileSizeExceededException(_baseurl, _filesize)); } } // send report if (_report) { int percent = _totalsize ? (100 * (_fetchedgoodsize + _fetchedsize)) / (_totalsize + _fetchedsize) : 0; double avg = 0; if (now > _starttime) avg = _fetchedsize / (now - _starttime); if (!(*(_report))->progress(percent, _baseurl, avg, _lastperiodstart == _starttime ? avg : _periodavg)) ZYPP_THROW(MediaCurlException(_baseurl, "User abort", "cancelled")); } if (_timeout && now - _lastprogress > _timeout) break; } if (!_finished) ZYPP_THROW(MediaTimeoutException(_baseurl)); // print some download stats WAR << "overall result" << endl; for (auto workeriter = _workers.begin(); workeriter != _workers.end(); ++workeriter) { multifetchworker *worker = workeriter->get(); WAR << "#" << worker->_workerno << ": state: " << worker->_state << " received: " << worker->_received << " url: " << worker->_url << endl; } } inline zypp::ByteCount multifetchrequest::makeBlksize ( uint maxConns, size_t filesize ) { // If the calculated strip size is too small and can cause a loss in TCP throughput. Raise // it to a reasonable value. return std::max( filesize / std::min( std::max( 1, maxConns ) , MAXURLS ), zypp::ByteCount(MIN_STRIPE_SIZE_KB, zypp::ByteCount::K) ); } ////////////////////////////////////////////////////////////////////// MediaMultiCurl::MediaMultiCurl(const Url &url_r, const Pathname & attach_point_hint_r) : MediaCurl(url_r, attach_point_hint_r) { MIL << "MediaMultiCurl::MediaMultiCurl(" << url_r << ", " << attach_point_hint_r << ")" << endl; _multi = 0; _customHeadersMetalink = 0; } MediaMultiCurl::~MediaMultiCurl() { if (_customHeadersMetalink) { curl_slist_free_all(_customHeadersMetalink); _customHeadersMetalink = 0; } if (_multi) { curl_multi_cleanup(_multi); _multi = 0; } std::map::iterator it; for (it = _easypool.begin(); it != _easypool.end(); it++) { CURL *easy = it->second; if (easy) { curl_easy_cleanup(easy); it->second = NULL; } } } void MediaMultiCurl::setupEasy() { MediaCurl::setupEasy(); if (_customHeadersMetalink) { curl_slist_free_all(_customHeadersMetalink); _customHeadersMetalink = 0; } struct curl_slist *sl = _customHeaders; for (; sl; sl = sl->next) _customHeadersMetalink = curl_slist_append(_customHeadersMetalink, sl->data); //, application/x-zsync _customHeadersMetalink = curl_slist_append(_customHeadersMetalink, "Accept: */*, application/x-zsync, application/metalink+xml, application/metalink4+xml"); } // here we try to suppress all progress coming from a metalink download // bsc#1021291: Nevertheless send alive trigger (without stats), so UIs // are able to abort a hanging metalink download via callback response. int MediaMultiCurl::progressCallback( void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { CURL *_curl = MediaCurl::progressCallback_getcurl(clientp); if (!_curl) return MediaCurl::aliveCallback(clientp, dltotal, dlnow, ultotal, ulnow); // bsc#408814: Don't report any sizes before we don't have data on disk. Data reported // due to redirection etc. are not interesting, but may disturb filesize checks. FILE *fp = 0; if ( curl_easy_getinfo( _curl, CURLINFO_PRIVATE, &fp ) != CURLE_OK || !fp ) return MediaCurl::aliveCallback( clientp, dltotal, dlnow, ultotal, ulnow ); if ( ftell( fp ) == 0 ) return MediaCurl::aliveCallback( clientp, dltotal, 0.0, ultotal, ulnow ); // (no longer needed due to the filesize check above?) // work around curl bug that gives us old data long httpReturnCode = 0; if (curl_easy_getinfo(_curl, CURLINFO_RESPONSE_CODE, &httpReturnCode ) != CURLE_OK || httpReturnCode == 0) return MediaCurl::aliveCallback(clientp, dltotal, dlnow, ultotal, ulnow); char *ptr = NULL; bool ismetalink = false; if (curl_easy_getinfo(_curl, CURLINFO_CONTENT_TYPE, &ptr) == CURLE_OK && ptr) { std::string ct = std::string(ptr); if (ct.find("application/x-zsync") == 0 || ct.find("application/metalink+xml") == 0 || ct.find("application/metalink4+xml") == 0) ismetalink = true; } if (!ismetalink && dlnow < 256) { // can't tell yet, ... return MediaCurl::aliveCallback(clientp, dltotal, dlnow, ultotal, ulnow); } if (!ismetalink) { fflush(fp); ismetalink = looks_like_meta_file(fp) != MetaDataType::None; DBG << "looks_like_meta_file: " << ismetalink << endl; } if (ismetalink) { // this is a metalink file change the expected filesize MediaCurl::resetExpectedFileSize( clientp, ByteCount( 2, ByteCount::MB) ); // we're downloading the metalink file. Just trigger aliveCallbacks curl_easy_setopt(_curl, CURLOPT_XFERINFOFUNCTION, &MediaCurl::aliveCallback); return MediaCurl::aliveCallback(clientp, dltotal, dlnow, ultotal, ulnow); } curl_easy_setopt(_curl, CURLOPT_XFERINFOFUNCTION, &MediaCurl::progressCallback); return MediaCurl::progressCallback(clientp, dltotal, dlnow, ultotal, ulnow); } void MediaMultiCurl::doGetFileCopy( const OnMediaLocation &srcFile , const Pathname & target, callback::SendReport & report, RequestOptions options ) const { Pathname dest = target.absolutename(); if( assert_dir( dest.dirname() ) ) { DBG << "assert_dir " << dest.dirname() << " failed" << endl; ZYPP_THROW( MediaSystemException(getFileUrl(srcFile.filename()), "System error on " + dest.dirname().asString()) ); } ManagedFile destNew { target.extend( ".new.zypp.XXXXXX" ) }; AutoFILE file; { AutoFREE buf { ::strdup( (*destNew).c_str() ) }; if( ! buf ) { ERR << "out of memory for temp file name" << endl; ZYPP_THROW(MediaSystemException(getFileUrl(srcFile.filename()), "out of memory for temp file name")); } AutoFD tmp_fd { ::mkostemp( buf, O_CLOEXEC ) }; if( tmp_fd == -1 ) { ERR << "mkstemp failed for file '" << destNew << "'" << endl; ZYPP_THROW(MediaWriteException(destNew)); } destNew = ManagedFile( (*buf), filesystem::unlink ); file = ::fdopen( tmp_fd, "we" ); if ( ! file ) { ERR << "fopen failed for file '" << destNew << "'" << endl; ZYPP_THROW(MediaWriteException(destNew)); } tmp_fd.resetDispose(); // don't close it here! ::fdopen moved ownership to file } DBG << "dest: " << dest << endl; DBG << "temp: " << destNew << endl; // set IFMODSINCE time condition (no download if not modified) if( PathInfo(target).isExist() && !(options & OPTION_NO_IFMODSINCE) ) { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_IFMODSINCE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, (long)PathInfo(target).mtime()); } else { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); } // change header to include Accept: metalink curl_easy_setopt(_curl, CURLOPT_HTTPHEADER, _customHeadersMetalink); // change to our own progress funcion curl_easy_setopt(_curl, CURLOPT_XFERINFOFUNCTION, &progressCallback); curl_easy_setopt(_curl, CURLOPT_PRIVATE, (*file) ); // important to pass the FILE* explicitly (passing through varargs) try { MediaCurl::doGetFileCopyFile( srcFile, dest, file, report, options ); } catch (Exception &ex) { curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); curl_easy_setopt(_curl, CURLOPT_HTTPHEADER, _customHeaders); curl_easy_setopt(_curl, CURLOPT_PRIVATE, (void *)0); ZYPP_RETHROW(ex); } curl_easy_setopt(_curl, CURLOPT_TIMECONDITION, CURL_TIMECOND_NONE); curl_easy_setopt(_curl, CURLOPT_TIMEVALUE, 0L); curl_easy_setopt(_curl, CURLOPT_HTTPHEADER, _customHeaders); curl_easy_setopt(_curl, CURLOPT_PRIVATE, (void *)0); long httpReturnCode = 0; CURLcode infoRet = curl_easy_getinfo(_curl, CURLINFO_RESPONSE_CODE, &httpReturnCode); if (infoRet == CURLE_OK) { DBG << "HTTP response: " + str::numstring(httpReturnCode) << endl; if ( httpReturnCode == 304 || ( httpReturnCode == 213 && _url.getScheme() == "ftp" ) ) // not modified { DBG << "not modified: " << PathInfo(dest) << endl; return; } } else { WAR << "Could not get the response code." << endl; } MetaDataType ismetalink = MetaDataType::None; char *ptr = NULL; if (curl_easy_getinfo(_curl, CURLINFO_CONTENT_TYPE, &ptr) == CURLE_OK && ptr) { std::string ct = std::string(ptr); if (ct.find("application/x-zsync") == 0 ) ismetalink = MetaDataType::Zsync; else if (ct.find("application/metalink+xml") == 0 || ct.find("application/metalink4+xml") == 0) ismetalink = MetaDataType::MetaLink; } if ( ismetalink == MetaDataType::None ) { // some proxies do not store the content type, so also look at the file to find // out if we received a metalink (bnc#649925) fflush(file); ismetalink = looks_like_meta_file(destNew); } if ( ismetalink != MetaDataType::None ) { bool userabort = false; Pathname failedFile = ZConfig::instance().repoCachePath() / "MultiCurl.failed"; file = nullptr; // explicitly close destNew before the parser reads it. try { MediaBlockList bl; std::vector urls; if ( ismetalink == MetaDataType::Zsync ) { ZsyncParser parser; parser.parse( destNew ); bl = parser.getBlockList(); urls = parser.getUrls(); XXX << getFileUrl(srcFile.filename()) << " returned zsync meta data." << std::endl; } else { MetaLinkParser mlp; mlp.parse(destNew); bl = mlp.getBlockList(); urls = mlp.getUrls(); XXX << getFileUrl(srcFile.filename()) << " returned metalink meta data." << std::endl; } if ( bl.numBlocks() ) XXX << "With " << bl.numBlocks() << " nr of blocks and a blocksize of " << bl.getBlock(0).size << std::endl; else XXX << "With no blocks" << std::endl; /* * gihub issue libzipp:#277 Multicurl backend breaks with MirrorCache and Metalink with unknown filesize. * Fall back to a normal download if we have no knowledge about the filesize we want to download. */ if ( !bl.haveFilesize() && ! srcFile.downloadSize() ) { XXX << "No filesize in metalink file and no expected filesize, aborting multicurl." << std::endl; ZYPP_THROW( MediaException("Multicurl requires filesize but none was provided.") ); } #if 0 Disabling this workaround for now, since we now do zip ranges into bigger requests /* * bsc#1191609 In certain locations we do not receive a suitable number of metalink mirrors, and might even * download chunks serially from one and the same server. In those cases we need to fall back to a normal download. */ if ( urls.size() < MIN_REQ_MIRRS ) { ZYPP_THROW( MediaException("Multicurl enabled but not enough mirrors provided") ); } #endif // XXX << bl << endl; file = fopen((*destNew).c_str(), "w+e"); if (!file) ZYPP_THROW(MediaWriteException(destNew)); if (PathInfo(target).isExist()) { XXX << "reusing blocks from file " << target << endl; bl.reuseBlocks(file, target.asString()); XXX << bl << endl; } if (bl.haveChecksum(1) && PathInfo(failedFile).isExist()) { XXX << "reusing blocks from file " << failedFile << endl; bl.reuseBlocks(file, failedFile.asString()); XXX << bl << endl; filesystem::unlink(failedFile); } const Pathname& df = srcFile.deltafile(); if (!df.empty()) { XXX << "reusing blocks from file " << df << endl; bl.reuseBlocks(file, df.asString()); XXX << bl << endl; } try { multifetch(srcFile.filename(), file, &urls, &report, std::move(bl), srcFile.downloadSize()); } catch (MediaCurlException &ex) { userabort = ex.errstr() == "User abort"; ZYPP_RETHROW(ex); } } catch (MediaFileSizeExceededException &ex) { ZYPP_RETHROW(ex); } catch (Exception &ex) { // something went wrong. fall back to normal download file = nullptr; // explicitly close destNew before moving it WAR<< "Failed to multifetch file " << ex << " falling back to single Curl download!" << std::endl; if (PathInfo(destNew).size() >= 63336) { ::unlink(failedFile.asString().c_str()); filesystem::hardlinkCopy(destNew, failedFile); } if (userabort) { ZYPP_RETHROW(ex); } file = fopen((*destNew).c_str(), "w+e"); if (!file) ZYPP_THROW(MediaWriteException(destNew)); // use the default progressCallback curl_easy_setopt(_curl, CURLOPT_XFERINFOFUNCTION, &MediaCurl::progressCallback); MediaCurl::doGetFileCopyFile(srcFile, dest, file, report, options | OPTION_NO_REPORT_START); } } if (::fchmod( ::fileno(file), filesystem::applyUmaskTo( 0644 ))) { ERR << "Failed to chmod file " << destNew << endl; } file.resetDispose(); // we're going to close it manually here if (::fclose(file)) { filesystem::unlink(destNew); ERR << "Fclose failed for file '" << destNew << "'" << endl; ZYPP_THROW(MediaWriteException(destNew)); } if ( rename( destNew, dest ) != 0 ) { ERR << "Rename failed" << endl; ZYPP_THROW(MediaWriteException(dest)); } destNew.resetDispose(); // no more need to unlink it DBG << "done: " << PathInfo(dest) << endl; } void MediaMultiCurl::multifetch(const Pathname & filename, FILE *fp, std::vector *urllist, MediaBlockList &&blklist, callback::SendReport *report, off_t filesize) const { Url baseurl(getFileUrl(filename)); if (filesize == off_t(-1) && blklist.haveFilesize()) filesize = blklist.getFilesize(); if (!blklist.haveBlocks() && filesize != 0) { if ( filesize == -1 ) { ZYPP_THROW(MediaException("No filesize and no blocklist, falling back to normal download.")); } // build a blocklist on demand just so that we have ranges MIL << "Generate blocklist, since there was none in the metalink file." << std::endl; off_t currOff = 0; const auto prefSize = multifetchrequest::makeBlksize( _settings.maxConcurrentConnections(), filesize ); while ( currOff < filesize ) { auto blksize = filesize - currOff ; if ( blksize > prefSize ) blksize = prefSize; blklist.addBlock( currOff, blksize ); currOff += blksize; } XXX << "Generated blocklist: " << std::endl << blklist << std::endl << " End blocklist " << std::endl; } if (filesize == 0 || !blklist.numBlocks()) { checkFileDigest(baseurl, fp, blklist); return; } if (filesize == 0) return; if (!_multi) { _multi = curl_multi_init(); if (!_multi) ZYPP_THROW(MediaCurlInitException(baseurl)); } multifetchrequest req(this, filename, baseurl, _multi, fp, report, std::move(blklist), filesize); std::vector myurllist; for (std::vector::iterator urliter = urllist->begin(); urliter != urllist->end(); ++urliter) { try { std::string scheme = urliter->getScheme(); if (scheme == "http" || scheme == "https" || scheme == "ftp" || scheme == "tftp") { checkProtocol(*urliter); myurllist.push_back(internal::propagateQueryParams(*urliter, _url)); } } catch (...) { } } if (!myurllist.size()) myurllist.push_back(baseurl); req.run(myurllist); checkFileDigest(baseurl, fp, req.blockList() ); } void MediaMultiCurl::checkFileDigest(Url &url, FILE *fp, MediaBlockList &blklist) const { if ( !blklist.haveFileChecksum() ) return; if (fseeko(fp, off_t(0), SEEK_SET)) ZYPP_THROW(MediaCurlException(url, "fseeko", "seek error")); Digest dig; blklist.createFileDigest(dig); char buf[4096]; size_t l = 0; while ((l = fread(buf, 1, sizeof(buf), fp)) > 0) dig.update(buf, l); if (!blklist.verifyFileDigest(dig)) ZYPP_THROW(MediaCurlException(url, "file verification failed", "checksum error")); } bool MediaMultiCurl::isDNSok(const std::string &host) const { return _dnsok.find(host) == _dnsok.end() ? false : true; } void MediaMultiCurl::setDNSok(const std::string &host) const { _dnsok.insert(host); } CURL *MediaMultiCurl::fromEasyPool(const std::string &host) const { if (_easypool.find(host) == _easypool.end()) return 0; CURL *ret = _easypool[host]; _easypool.erase(host); return ret; } void MediaMultiCurl::toEasyPool(const std::string &host, CURL *easy) const { CURL *oldeasy = _easypool[host]; _easypool[host] = easy; if (oldeasy) curl_easy_cleanup(oldeasy); } } // namespace media } // namespace zypp libzypp-17.36.5/zypp/media/MediaMultiCurl.h000066400000000000000000000062501476576476200205330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaMultiCurl.h * */ #ifndef ZYPP_MEDIA_MEDIAMULTICURL_H #define ZYPP_MEDIA_MEDIAMULTICURL_H #include #include #include #include #include #include #include #include #include namespace zypp { namespace media { /** * @short Implementation class for FTP, HTTP and HTTPS MediaHandler * * @author Michael Schroeder * * @see MediaHandler **/ class multifetchrequest; class multifetchworker; class MediaMultiCurl : public MediaCurl { public: friend class multifetchrequest; friend class multifetchworker; MediaMultiCurl(const Url &url_r, const Pathname & attach_point_hint_r); ~MediaMultiCurl() override; void doGetFileCopy( const OnMediaLocation & srcFile, const Pathname & targetFilename, callback::SendReport & _report, RequestOptions options = OPTION_NONE ) const override; void multifetch(const Pathname &filename, FILE *fp, std::vector *urllist, MediaBlockList &&blklist, callback::SendReport *report = 0, off_t filesize = off_t(-1)) const; /** \overload translating ByteCount(0) into off_t(-1) * bsc#1153557: In the zypp media backend 'we don't know the size' is * represented by ByteCount(0). The more C-isch MultiCurl uses off_t(-1). */ void multifetch(const Pathname &filename, FILE *fp, std::vector *urllist, callback::SendReport *report, MediaBlockList &&blklist, const ByteCount & filesize ) const { multifetch( filename, fp, urllist, std::move(blklist), report, ( filesize ? off_t(filesize) : off_t(-1) ) ); } protected: bool isDNSok(const std::string &host) const; void setDNSok(const std::string &host) const; CURL *fromEasyPool(const std::string &host) const; void toEasyPool(const std::string &host, CURL *easy) const; void setupEasy() override; void checkFileDigest(Url &url, FILE *fp, MediaBlockList &blklist) const; static int progressCallback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow ); private: // the custom headers from MediaCurl plus a "Accept: metalink" header curl_slist *_customHeadersMetalink; mutable CURLM *_multi; // reused for all fetches so we can make use of the dns cache mutable std::set _dnsok; mutable std::map _easypool; }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIAMULTICURL_H libzypp-17.36.5/zypp/media/MediaNFS.cc000066400000000000000000000174761476576476200174130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaNFS.cc * */ #include #include #include #include #include #include #include using std::endl; namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaNFS // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaNFS::MediaNFS // METHOD TYPE : Constructor // // DESCRIPTION : // MediaNFS::MediaNFS( const Url & url_r, const Pathname & attach_point_hint_r ) : MediaHandler( url_r, attach_point_hint_r, "/", // urlpath at attachpoint false ) // does_download { MIL << "MediaNFS::MediaNFS(" << url_r << ", " << attach_point_hint_r << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaNFS::attachTo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that not already attached, and attachPoint is a directory. // void MediaNFS::attachTo(bool next) { if(_url.getHost().empty()) ZYPP_THROW(MediaBadUrlEmptyHostException(_url)); if(next) ZYPP_THROW(MediaNotSupportedException(_url)); std::string path = _url.getHost(); path += ':'; path += Pathname(_url.getPathName()).asString(); MediaSourceRef media( new MediaSource("nfs", path)); AttachedMedia ret( findAttachedMedia( media)); if( ret.mediaSource && ret.attachPoint && !ret.attachPoint->empty()) { DBG << "Using a shared media " << ret.mediaSource->name << " attached on " << ret.attachPoint->path << endl; removeAttachPoint(); setAttachPoint(ret.attachPoint); setMediaSource(ret.mediaSource); return; } if( !isUseableAttachPoint( attachPoint() ) ) { setAttachPoint( createAttachPoint(), true ); } std::string mountpoint( attachPoint().asString() ); std::string filesystem( _url.getScheme() ); if ( filesystem != "nfs4" && _url.getQueryParam("type") == "nfs4" ) { filesystem = "nfs4"; } std::string options = _url.getQueryParam("mountoptions"); if(options.empty()) { options="ro"; } std::vector optionList; str::split( options, std::back_inserter(optionList), "," ); std::vector::const_iterator it; bool contains_lock = false, contains_soft = false, contains_timeo = false, contains_hard = false; for( it = optionList.begin(); it != optionList.end(); ++it ) { if ( *it == "lock" || *it == "nolock" ) contains_lock = true; else if ( *it == "soft") contains_soft = true; else if ( *it == "hard") contains_hard = true; else if ( it->find("timeo") != std::string::npos ) contains_timeo = true; } if ( !(contains_lock && contains_soft) ) { // Add option "nolock", unless option "lock" or "unlock" is already set. // This should prevent the mount command hanging when the portmapper isn't // running. if ( !contains_lock ) { optionList.push_back( "nolock" ); } // Add options "soft,timeo=NFS_MOUNT_TIMEOUT", unless they are set // already or "hard" option is explicitly specified. This prevent // the mount command from hanging when the nfs server is not responding // and file transactions from an unresponsive to throw an error after // a short time instead of hanging forever if ( !(contains_soft || contains_hard) ) { optionList.push_back( "soft" ); if ( !contains_timeo ) { std::ostringstream s; s << "timeo=" << NFS_MOUNT_TIMEOUT; optionList.push_back( s.str() ); } } options = str::join( optionList, "," ); } Mount mount; mount.mount(path,mountpoint,filesystem,options); setMediaSource(media); // wait for /etc/mtab update ... // (shouldn't be needed) int limit = 3; bool mountsucceeded = false; while( !(mountsucceeded=isAttached()) && --limit) { sleep(1); } if( !mountsucceeded) { setMediaSource(MediaSourceRef()); try { mount.umount(attachPoint().asString()); } catch (const MediaException & excpt_r) { ZYPP_CAUGHT(excpt_r); } ZYPP_THROW(MediaMountException( "Unable to verify that the media was mounted", path, mountpoint )); } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaNFS::isAttached // METHOD TYPE : bool // // DESCRIPTION : Override check if media is attached. // bool MediaNFS::isAttached() const { return checkAttached(true); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaNFS::releaseFrom // METHOD TYPE : void // // DESCRIPTION : Asserted that media is attached. // void MediaNFS::releaseFrom( const std::string & ejectDev ) { Mount mount; mount.umount(attachPoint().asString()); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaNFS::getFile // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaNFS::getFile (const OnMediaLocation &file ) const { MediaHandler::getFile( file ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaNFS::getDir // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached. // void MediaNFS::getDir( const Pathname & dirname, bool recurse_r ) const { MediaHandler::getDir( dirname, recurse_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaNFS::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaNFS::getDirInfo( std::list & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : MediaNFS::getDirInfo // METHOD TYPE : PMError // // DESCRIPTION : Asserted that media is attached and retlist is empty. // void MediaNFS::getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots ) const { MediaHandler::getDirInfo( retlist, dirname, dots ); } bool MediaNFS::getDoesFileExist( const Pathname & filename ) const { return MediaHandler::getDoesFileExist( filename ); } } // namespace media } // namespace zypp libzypp-17.36.5/zypp/media/MediaNFS.h000066400000000000000000000044321476576476200172410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaNFS.h * */ #ifndef ZYPP_MEDIA_MEDIANFS_H #define ZYPP_MEDIA_MEDIANFS_H #include /** * Value of NFS mount minor timeout (passed to timeo option * of the NFS mount) in tenths of a second. * * The value of 300 should give a major timeout after 3.5 minutes * for UDP and 1.5 minutes for TCP. (#350309) */ #define NFS_MOUNT_TIMEOUT 300 namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaNFS /** * @short Implementation class for NFS MediaHandler * @see MediaHandler **/ class MediaNFS : public MediaHandler { protected: void attachTo (bool next = false) override; void releaseFrom( const std::string & ejectDev ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname, bool recurse_r ) const override; void getDirInfo( std::list & retlist, const Pathname & dirname, bool dots = true ) const override; void getDirInfo( filesystem::DirContent & retlist, const Pathname & dirname, bool dots = true ) const override; bool getDoesFileExist( const Pathname & filename ) const override; public: MediaNFS( const Url& url_r, const Pathname & attach_point_hint_r ); ~MediaNFS() override { try { release(); } catch(...) {} } bool isAttached() const override; }; /////////////////////////////////////////////////////////////////// } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIANFS_H libzypp-17.36.5/zypp/media/MediaNetworkCommonHandler.cc000066400000000000000000000116671476576476200230610ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaNetworkCommonHandler.cc * */ #include "MediaNetworkCommonHandler.h" #include #include #include #include #include #include #include namespace zypp::media { zypp::Url MediaNetworkCommonHandler::findGeoIPRedirect ( const zypp::Url &url ) { try { const auto &conf = ZConfig::instance(); if ( !conf.geoipEnabled() ) { MIL << "GeoIp rewrites disabled via ZConfig." << std::endl; return Url(); } if ( !( url.getQueryParam("COUNTRY").empty() && url.getQueryParam("AVOID_COUNTRY").empty() )) { MIL << "GeoIp rewrites disabled since the baseurl " << url << " uses an explicit country setting." << std::endl; return Url(); } const auto &hostname = url.getHost(); auto geoipFile = conf.geoipCachePath() / hostname ; if ( PathInfo( geoipFile ).isFile() ) { MIL << "Found GeoIP file for host: " << hostname << std::endl; std::ifstream in( geoipFile.asString() ); if (!in.is_open()) { MIL << "Failed to open GeoIP for host: " << hostname << std::endl; return Url(); } try { std::string newHost; in >> newHost; Url newUrl = url; newUrl.setHost( newHost ); MIL << "Found GeoIP rewrite: " << hostname << " -> " << newHost << std::endl; return newUrl; } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); MIL << "No valid GeoIP rewrite target found for " << url << std::endl; } } } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); MIL << "Failed to query GeoIP data, url rewriting disabled." << std::endl; } // no rewrite return Url(); } const char *MediaNetworkCommonHandler::anonymousIdHeader() { // we need to add the release and identifier to the // agent string. // The target could be not initialized, and then this information // is guessed. // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space static const std::string _value( str::trim( str::form( "X-ZYpp-AnonymousId: %s", Target::anonymousUniqueId( Pathname()/*guess root*/ ).c_str() ))); return _value.c_str(); } const char *MediaNetworkCommonHandler::distributionFlavorHeader() { // we need to add the release and identifier to the // agent string. // The target could be not initialized, and then this information // is guessed. // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space static const std::string _value( str::trim( str::form( "X-ZYpp-DistributionFlavor: %s", Target::distributionFlavor( Pathname()/*guess root*/ ).c_str() ))); return _value.c_str(); } Url MediaNetworkCommonHandler::getFileUrl( const Pathname & filename_r ) const { static const zypp::str::regex invalidRewrites("^.*\\/repomd.xml(.asc|.key)?$|^\\/geoip$"); const bool canRedir = _redirTarget.isValid() && !invalidRewrites.matches(filename_r.asString()); const auto &baseUrl = ( canRedir ) ? _redirTarget : _url; if ( canRedir ) MIL << "Redirecting " << filename_r << " request to geoip location." << std::endl; // Simply extend the URLs pathname: Url newurl { baseUrl }; newurl.appendPathName( filename_r ); return newurl; } const char *MediaNetworkCommonHandler::agentString() { // we need to add the release and identifier to the // agent string. // The target could be not initialized, and then this information // is guessed. // bsc#1212187: HTTP/2 RFC 9113 forbids fields ending with a space static const std::string _value(str::trim(str::form( "ZYpp " LIBZYPP_VERSION_STRING " (curl %s) %s", curl_version_info(CURLVERSION_NOW)->version, Target::targetDistribution(Pathname() /*guess root*/).c_str()))); return _value.c_str(); } } // namespace zypp::media libzypp-17.36.5/zypp/media/MediaNetworkCommonHandler.h000066400000000000000000000053361476576476200227170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaNetworkCommonHandler.h */ #ifndef ZYPP_MEDIA_MEDIANETWORKCOMMONHANDLER_H #define ZYPP_MEDIA_MEDIANETWORKCOMMONHANDLER_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace media { /////////////////////////////////////////////////////////////////// /// \class MediaNetworkCommonHandler /// \brief Baseclass for MediaCurl /// /// Access to commonly used stuff like \ref TransferSettings mainly // to avoid duplicated code. /////////////////////////////////////////////////////////////////// class MediaNetworkCommonHandler : public MediaHandler { public: MediaNetworkCommonHandler( const Url & url_r, const Pathname & attach_point_r, const Pathname & urlpath_below_attachpoint_r, const bool does_download_r ) : MediaHandler( url_r, attach_point_r, urlpath_below_attachpoint_r, does_download_r ) , _redirTarget( findGeoIPRedirect(url_r) ) {} public: TransferSettings & settings() { return _settings; } protected: /** * concatenate the attach url and the filename to a complete * download url **/ Url getFileUrl(const Pathname & filename) const; /** * Rewrites the baseURL to the geoIP target if one is found in the metadata cache, * otherwise simply returns the url again. */ static zypp::Url findGeoIPRedirect ( const zypp::Url &url ); public: static const char * anonymousIdHeader(); static const char * distributionFlavorHeader(); static const char *agentString(); protected: mutable TransferSettings _settings; Url _redirTarget; }; } // namespace media /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_MEDIA_MEDIANETWORKCOMMONHANDLER_H libzypp-17.36.5/zypp/media/MediaPlugin.cc000066400000000000000000000045761476576476200202200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaPlugin.cc * */ #include #include #include #include #include #include using std::endl; ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace media { ////////////////////////////////////////////////////////////////// MediaPlugin::MediaPlugin( const Url & url_r, const Pathname & attach_point_hint_r ) : MediaHandler( url_r, attach_point_hint_r, /*path below attachpoint*/"/", /*does_download*/false ) { MIL << "MediaPlugin::MediaPlugin(" << url_r << ", " << attach_point_hint_r << ")" << endl; } void MediaPlugin::attachTo( bool next_r ) {} void MediaPlugin::releaseFrom( const std::string & ejectDev_r ) {} void MediaPlugin::getFile( const OnMediaLocation &file ) const {} void MediaPlugin::getDir( const Pathname & dirname_r, bool recurse_r ) const {} void MediaPlugin::getDirInfo( std::list & retlist_r, const Pathname & dirname_r, bool dots_r ) const {} void MediaPlugin::getDirInfo( filesystem::DirContent & retlist_r, const Pathname & dirname_r, bool dots_r ) const {} bool MediaPlugin::getDoesFileExist( const Pathname & filename_r ) const { return false; } ////////////////////////////////////////////////////////////////// } // namespace media //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/media/MediaPlugin.h000066400000000000000000000044711476576476200200540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaPlugin.h * */ #ifndef ZYPP_MEDIA_MEDIAPLUGIN_H #define ZYPP_MEDIA_MEDIAPLUGIN_H #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// namespace media { ////////////////////////////////////////////////////////////////// /** * \brief Implementation class for plugin MediaHandler * * @see MediaHandler */ class MediaPlugin : public MediaHandler { public: MediaPlugin( const Url & url_r, const Pathname & attach_point_hint_r ); ~MediaPlugin() override { try { release(); } catch(...) {} } protected: void attachTo( bool next_r = false ) override; void releaseFrom( const std::string & ejectDev_r ) override; void getFile( const OnMediaLocation & file ) const override; void getDir( const Pathname & dirname_r, bool recurse_r ) const override; void getDirInfo( std::list & retlist_r, const Pathname & dirname_r, bool dots_r = true ) const override; void getDirInfo( filesystem::DirContent & retlist_r, const Pathname & dirname_r, bool dots_r = true ) const override; bool getDoesFileExist( const Pathname & filename_r ) const override; }; ////////////////////////////////////////////////////////////////// } // namespace media //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// #endif // ZYPP_MEDIA_MEDIAPLUGIN_H libzypp-17.36.5/zypp/media/MediaPriority.cc000066400000000000000000000073451476576476200206000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaPriority.cc * */ #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace media { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// /** * 4: local: file,dir,hd * 3: remote: nfs,cifs,smb * ?: download: http,https,ftp,sftp, tftp * ?: volatile: cd,dvd * 0: the rest */ MediaPriority::value_type scheme2priority( const std::string & scheme_r ) { switch ( scheme_r[0] ) { #define RETURN_IF(scheme,value) \ if ( ::strcmp( scheme+1, scheme_r.c_str()+1 ) == 0 ) return value; case 'c': RETURN_IF( "cd", ZConfig::instance().download_media_prefer_download() ? 1 : 2 ); RETURN_IF( "cifs", 3 ); break; case 'd': RETURN_IF( "dvd", ZConfig::instance().download_media_prefer_download() ? 1 : 2 ); RETURN_IF( "dir", 4 ); break; case 'f': RETURN_IF( "file", 4 ); RETURN_IF( "ftp", ZConfig::instance().download_media_prefer_download() ? 2 : 1); break; case 't': RETURN_IF( "tftp", ZConfig::instance().download_media_prefer_download() ? 2 : 1); break; case 'h': RETURN_IF( "http", ZConfig::instance().download_media_prefer_download() ? 2 : 1 ); RETURN_IF( "https", ZConfig::instance().download_media_prefer_download() ? 2 : 1 ); RETURN_IF( "hd", 4 ); break; case 'n': RETURN_IF( "nfs", 3 ); RETURN_IF( "nfs4", 3 ); break; case 's': RETURN_IF( "sftp", ZConfig::instance().download_media_prefer_download() ? 2 : 1 ); RETURN_IF( "smb", 3 ); break; #undef RETURN_IF } return 0; } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : MediaPriority::MediaPriority // METHOD TYPE : Ctor // MediaPriority::MediaPriority( const std::string & scheme_r ) : _val( scheme2priority( scheme_r ) ) {} MediaPriority::MediaPriority( const Url & url_r ) : _val( scheme2priority( url_r.getScheme() ) ) {} ///////////////////////////////////////////////////////////////// } // namespace media /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/media/MediaPriority.h000066400000000000000000000066051476576476200204400ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaPriority.h * */ #ifndef ZYPP_MEDIA_MEDIAPRIORITY_H #define ZYPP_MEDIA_MEDIAPRIORITY_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class Url; /////////////////////////////////////////////////////////////////// namespace media { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : MediaPriority // /** Derive a numeric priority from \ref Url scheme according to zypp.conf(download.media_preference). * * The class is simple. Constructable and assignable from \ref Url * or scheme string. Implicit convertible into a numic \ref value_type. * * \code * if ( MediaPriority("cd") \< MediaPriority("ftp") ) * ... * \endcode * * \todo Maybe introduce a static tribool, to allow overwriting zypp.conf(download.media_preference) default. */ class MediaPriority { public: using value_type = int; public: /** Default ctor. Least priority \c 0.*/ MediaPriority() : _val( 0 ) {} /** Copy ctor. */ MediaPriority( value_type val_r ) : _val( val_r ) {} /** Ctor from scheme string.*/ MediaPriority( const std::string & scheme_r ); /** Ctor from scheme string defined by Url. */ MediaPriority( const Url & url_r ); public: /** Assign. */ MediaPriority & operator=( value_type rhs ) { _val = rhs; return *this; } /** Assign priority of scheme string. */ MediaPriority & operator=( const std::string & scheme_r ) { _val = MediaPriority(scheme_r); return *this; } /** Assign priority of scheme string defined by Url. */ MediaPriority & operator=( const Url & url_r ) { _val = MediaPriority(url_r); return *this; } public: /** Conversion to value_type. */ //@{ /** Explicit */ value_type & get() { return _val; } /** Explicit */ const value_type & get() const { return _val; } /** Implicit */ operator value_type &() { return get(); } /** Implicit */ operator const value_type &() const { return get(); } //@} private: value_type _val; }; ///////////////////////////////////////////////////////////////// } // namespace media /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_MEDIA_MEDIAPRIORITY_H libzypp-17.36.5/zypp/media/MediaSource.cc000066400000000000000000000021031476576476200202020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaSource.cc */ #include #include namespace zypp { namespace media { std::ostream & operator<<( std::ostream & str, const AttachPoint & obj ) { return str << (obj.temp ? "*" : "") << obj.path; } std::ostream & operator<<( std::ostream & str, const AttachedMedia & obj ) { return str << "media(" << obj.mediaSource << ")attached(" << obj.attachPoint << ")"; } } // namespace media } // namespace zypp libzypp-17.36.5/zypp/media/MediaSource.h000066400000000000000000000107671476576476200200630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/MediaSource.h * */ #ifndef ZYPP_MEDIA_MEDIASOURCE_H #define ZYPP_MEDIA_MEDIASOURCE_H #include #include #include #include #include namespace zypp { namespace media { /////////////////////////////////////////////////////////////////// /** * Media manager access Id type. */ using MediaAccessId = unsigned int; /////////////////////////////////////////////////////////////////// /** * Media source internally used by MediaManager and MediaHandler. */ class MediaSource { public: MediaSource(std::string _type, std::string _name, unsigned int _maj=0, unsigned int _min=0, std::string _bdir=std::string(), bool _own=true) : maj_nr(_maj) , min_nr(_min) , type(std::move(_type)) , name(std::move(_name)) , bdir(std::move(_bdir)) , iown(_own) {} MediaSource() : maj_nr(0) , min_nr(0) {} virtual ~MediaSource() {} /** * Check if the both sources are equal. */ virtual bool equals(const MediaSource &src) const { if( type == src.type) { if( maj_nr == 0) return name == src.name; else return maj_nr == src.maj_nr && min_nr == src.min_nr; } return false; } /** * Return media source as string for debuging purposes. */ virtual std::string asString() const { std::string tmp1; if(maj_nr != 0) { tmp1 = "[" + str::numstring(maj_nr) + "," + str::numstring(min_nr) + "]"; } return type + "<" + name + tmp1 + ">"; } unsigned int maj_nr; //!< A major number if source is a device. unsigned int min_nr; //!< A minor number if source is a device. std::string type; //!< A media handler specific source type. std::string name; //!< A media handler specific source name. std::string bdir; //!< Directory, the media may be bound to. bool iown; //!< True, if mounted by media manager. }; /** \relates MediaSource Stream output */ inline std::ostream & operator<<( std::ostream & str, const MediaSource & obj ) { return str << obj.asString(); } /////////////////////////////////////////////////////////////////// /** * Attach point of a media source. */ class AttachPoint { public: AttachPoint(Pathname _path=Pathname(), bool _temp=true) : path(std::move(_path)) , temp(_temp) {} bool empty() const { return path.empty(); } Pathname path; //!< The path name (mount point). bool temp; //!< If it was created temporary. }; /** \relates AttachPoint Stream output */ std::ostream & operator<<( std::ostream & str, const AttachPoint & obj ); /////////////////////////////////////////////////////////////////// using MediaSourceRef = zypp::RW_pointer; using AttachPointRef = zypp::RW_pointer; /////////////////////////////////////////////////////////////////// /** * A simple structure containing references * to a media source and its attach point. */ struct AttachedMedia { AttachedMedia() {} AttachedMedia(MediaSourceRef _mediaSource, AttachPointRef _attachPoint) : mediaSource(std::move( _mediaSource)) , attachPoint(std::move( _attachPoint)) {} MediaSourceRef mediaSource; AttachPointRef attachPoint; }; /** \relates AttachedMedia Stream output */ std::ostream & operator<<( std::ostream & str, const AttachedMedia & obj ); } // namespace media } // namespace zypp #endif // ZYPP_MEDIA_MEDIASOURCE_H libzypp-17.36.5/zypp/media/MediaUserAuth.h000066400000000000000000000000441476576476200203460ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/MetaLinkParser.h000066400000000000000000000000531476576476200205270ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/Mount.h000066400000000000000000000000341476576476200167470ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/ProxyInfo.h000066400000000000000000000000371476576476200176050ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/TransferSettings.h000066400000000000000000000000461476576476200211550ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/UrlResolverPlugin.cc000066400000000000000000000072161476576476200214570ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/UrlResolverPlugin.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace media { ///////////////////////////////////////////////////////////////// /** UrlResolverPlugin implementation. */ struct UrlResolverPlugin::Impl { }; /////////////////////////////////////////////////////////////////// Url UrlResolverPlugin::resolveUrl(const Url & o_url, HeaderList &headers) { if (o_url.getScheme() != "plugin") return o_url; Url url(o_url); std::string name = url.getPathName(); Pathname plugin_path = (ZConfig::instance().pluginsPath()/"urlresolver")/name; if (PathInfo(plugin_path).isExist()) { PluginScript scr; scr.open(plugin_path); // send frame to plugin PluginFrame f("RESOLVEURL"); url::ParamMap params = url.getQueryStringMap(); url::ParamMap::const_iterator param_it; for( param_it = params.begin(); param_it != params.end(); ++param_it) f.setHeader(param_it->first, param_it->second); scr.send(f); PluginFrame r(scr.receive()); if (r.command() == "RESOLVEDURL") { // now set url = Url(r.body().asString()); PluginFrame::HeaderListIterator it; for (it = r.headerBegin(); it != r.headerEnd(); ++it) { std::pair values(*it); // curl resets headers that are empty, so we use a workaround if (values.second.empty()) { values.second = "\r\nX-libcurl-Empty-Header-Workaround: *"; } headers.insert(values); } } else if (r.command() == "ERROR") { ZYPP_THROW(MediaException(r.body().asString())); } } return url; } /** \relates UrlResolverPlugin::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin::Impl & obj ) { return str << "UrlResolverPlugin::Impl"; } UrlResolverPlugin::~UrlResolverPlugin() {} std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin & obj ) { return str << *obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace media /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/media/UrlResolverPlugin.h000066400000000000000000000050101476576476200213070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/media/UrlResolverPlugin.h * */ #ifndef ZYPP_MEDIA_URLRESOLVERPLUGIN_H #define ZYPP_MEDIA_URLRESOLVERPLUGIN_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace media { ///////////////////////////////////////////////////////////////// // openSUSE/libzypp#560: Keep it public while foreign test depend on it. class ZYPP_API UrlResolverPlugin { friend std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin & obj ); public: struct Impl; using HeaderList = std::multimap; /** * Resolves an url using the installed plugins * If no plugin is found the url is resolved as * its current value. * * Custom headers are inserted in the provided header list */ static Url resolveUrl(const Url &url, HeaderList &headers); public: /** Dtor */ ~UrlResolverPlugin(); private: /** Default ctor */ UrlResolverPlugin(); /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates UrlResolverPlugin Stream output */ std::ostream & operator<<( std::ostream & str, const UrlResolverPlugin & obj ); ///////////////////////////////////////////////////////////////// } // namespace media /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_MEDIA_URLRESOLVERPLUGIN_H libzypp-17.36.5/zypp/media/detail/000077500000000000000000000000001476576476200167415ustar00rootroot00000000000000libzypp-17.36.5/zypp/media/detail/DownloadProgressTracker.cc000066400000000000000000000031571476576476200240660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "DownloadProgressTracker.h" #include namespace zypp::internal { void ProgressTracker::updateStats(double dltotal, double dlnow) { clock::time_point now = clock::now(); if ( !_timeStart ) _timeStart = _timeLast = now; // If called without args (0.0), recompute based on the last values seen if ( dltotal && dltotal != _dnlTotal ) _dnlTotal = dltotal; if ( dlnow && dlnow != _dnlNow ) { _dnlNow = dlnow; } // percentage: if ( _dnlTotal ) _dnlPercent = int(_dnlNow * 100 / _dnlTotal); // download rates: _drateTotal = _dnlNow / std::max( std::chrono::duration_cast(now - *_timeStart).count(), int64_t(1) ); if ( _timeLast < now ) { const auto duration = std::chrono::duration_cast(now - *_timeLast).count(); if ( duration >= 1 ) { _drateLast = (_dnlNow - _dnlLast) / duration; // start new period _timeLast = now; _dnlLast = _dnlNow; } } else if ( _timeStart == _timeLast ) _drateLast = _drateTotal; } } libzypp-17.36.5/zypp/media/detail/DownloadProgressTracker.h000066400000000000000000000026441476576476200237300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_DETAIL_DOWNLOADPROGRESSTRACKER_INCLUDED #define ZYPP_MEDIA_DETAIL_DOWNLOADPROGRESSTRACKER_INCLUDED #include #include namespace zypp::internal { struct ProgressTracker { using clock = std::chrono::steady_clock; std::optional _timeStart; ///< Start total stats std::optional _timeLast; ///< Start last period(~1sec) double _dnlTotal = 0.0; ///< Bytes to download or 0 if unknown double _dnlLast = 0.0; ///< Bytes downloaded at period start double _dnlNow = 0.0; ///< Bytes downloaded now int _dnlPercent= 0; ///< Percent completed or 0 if _dnlTotal is unknown double _drateTotal= 0.0; ///< Download rate so far double _drateLast = 0.0; ///< Download rate in last period void updateStats( double dltotal = 0.0, double dlnow = 0.0 ); }; } #endif libzypp-17.36.5/zypp/media/detail/OptionalDownloadProgressReport.cc000066400000000000000000000063451476576476200254560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "OptionalDownloadProgressReport.h" namespace internal { using namespace zypp; OptionalDownloadProgressReport::OptionalDownloadProgressReport(bool isOptional) : _oldRec { Distributor::instance().getReceiver() } , _isOptional { isOptional } { connect(); } OptionalDownloadProgressReport::~OptionalDownloadProgressReport() { if (_oldRec) Distributor::instance().setReceiver(*_oldRec); else Distributor::instance().noReceiver(); } void OptionalDownloadProgressReport::reportbegin() { if ( _oldRec ) _oldRec->reportbegin(); } void OptionalDownloadProgressReport::reportend() { if ( _oldRec ) _oldRec->reportend(); } void OptionalDownloadProgressReport::report(const UserData &userData_r) { if ( _oldRec ) _oldRec->report( userData_r ); } void OptionalDownloadProgressReport::start(const Url &file_r, Pathname localfile_r) { if ( not _oldRec ) return; if ( _isOptional ) { // delay start until first data are received. _startFile = file_r; _startLocalfile = std::move(localfile_r); return; } _oldRec->start( file_r, localfile_r ); } bool OptionalDownloadProgressReport::progress(int value_r, const Url &file_r, double dbps_avg_r, double dbps_current_r) { if ( not _oldRec ) return true; if ( notStarted() ) { if ( not ( value_r || dbps_avg_r || dbps_current_r ) ) return true; sendStart(); } //static constexpr std::chrono::milliseconds minfequency { 1000 }; only needed if we'd avoid sending reports without change static constexpr std::chrono::milliseconds maxfequency { 100 }; TimePoint now { TimePoint::clock::now() }; TimePoint::duration elapsed { now - _lastProgressSent }; if ( elapsed < maxfequency ) return true; // continue _lastProgressSent = now; return _oldRec->progress( value_r, file_r, dbps_avg_r, dbps_current_r ); } media::DownloadProgressReport::Action OptionalDownloadProgressReport::problem(const Url &file_r, Error error_r, const std::string &description_r) { if ( not _oldRec || notStarted() ) return ABORT; return _oldRec->problem( file_r, error_r, description_r ); } void OptionalDownloadProgressReport::finish(const Url &file_r, Error error_r, const std::string &reason_r) { if ( not _oldRec || notStarted() ) return; _oldRec->finish( file_r, error_r, reason_r ); } bool OptionalDownloadProgressReport::notStarted() const { return _isOptional; } void OptionalDownloadProgressReport::sendStart() { if ( _isOptional ) { // we know _oldRec is valid... _oldRec->start( _startFile, std::move(_startLocalfile) ); _isOptional = false; } } } libzypp-17.36.5/zypp/media/detail/OptionalDownloadProgressReport.h000066400000000000000000000050031476576476200253060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MEDIA_DETAIL_OPTIONALDOWNLOADPROGRESSREPORT_INCLUDED #define ZYPP_MEDIA_DETAIL_OPTIONALDOWNLOADPROGRESSREPORT_INCLUDED #include #include namespace internal { /// \brief Bottleneck filtering all DownloadProgressReport issued from Media[Muli]Curl. /// - Optional files will send no report until data are actually received (we know it exists). /// - Control the progress report frequency passed along to the application. struct OptionalDownloadProgressReport : public zypp::callback::ReceiveReport { using TimePoint = std::chrono::steady_clock::time_point; OptionalDownloadProgressReport( bool isOptional=false ); OptionalDownloadProgressReport(const OptionalDownloadProgressReport &) = delete; OptionalDownloadProgressReport(OptionalDownloadProgressReport &&) = delete; OptionalDownloadProgressReport &operator= (const OptionalDownloadProgressReport &) = delete; OptionalDownloadProgressReport &operator= (OptionalDownloadProgressReport &&) = delete; ~OptionalDownloadProgressReport() override; void reportbegin() override; void reportend() override; void report( const UserData & userData_r = UserData() ) override; void start( const zypp::Url & file_r, zypp::Pathname localfile_r ) override; bool progress( int value_r, const zypp::Url & file_r, double dbps_avg_r = -1, double dbps_current_r = -1 ) override; Action problem( const zypp::Url & file_r, Error error_r, const std::string & description_r ) override; void finish( const zypp::Url & file_r, Error error_r, const std::string & reason_r ) override; private: // _isOptional also indicates the delayed start bool notStarted() const; void sendStart(); private: Receiver *const _oldRec; bool _isOptional; zypp::Url _startFile; zypp::Pathname _startLocalfile; TimePoint _lastProgressSent; }; } #endif libzypp-17.36.5/zypp/media/proxyinfo/000077500000000000000000000000001476576476200175345ustar00rootroot00000000000000libzypp-17.36.5/zypp/media/proxyinfo/ProxyInfoImpl.h000066400000000000000000000000571476576476200224660ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/proxyinfo/ProxyInfoLibproxy.h000066400000000000000000000000611476576476200233700ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/proxyinfo/ProxyInfoSysconfig.h000066400000000000000000000000621476576476200235250ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/media/proxyinfo/ProxyInfos.h000066400000000000000000000000541476576476200220240ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/misc/000077500000000000000000000000001476576476200153535ustar00rootroot00000000000000libzypp-17.36.5/zypp/misc/CheckAccessDeleted.cc000066400000000000000000000470261476576476200213210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/CheckAccessDeleted.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::misc" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// // // lsof output lines are a sequence of NUL terminated fields, // where the 1st char determines the fields type. // // (pcuL) pid command userid loginname // (ftkn).filedescriptor type linkcount filename // ///////////////////////////////////////////////////////////////// /** lsof output line + files extracted so far for this PID */ using CacheEntry = std::pair>; ///////////////////////////////////////////////////////////////// /// \class FilterRunsInContainer /// \brief Functor guessing whether \a PID is running in a container. /// /// Use /proc to guess if a process is running in a container ///////////////////////////////////////////////////////////////// struct FilterRunsInContainer { private: enum Type { IGNORE, HOST, CONTAINER }; /*! * Checks if the given file in proc is part of our root * or not. If the file was unlinked, IGNORE is returned to signal * that it is better to check the next file. */ Type in_our_root( const Pathname &path ) const { const PathInfo procInfoStat( path ); // if we can not stat the file continue to the next one if ( procInfoStat.error() ) return IGNORE; // if the file was unlinked ignore it if ( procInfoStat.nlink() == 0 ) return IGNORE; // get the file the link points to, if that fails continue to the next const Pathname linkTarget = filesystem::readlink( path ); if ( linkTarget.empty() ) return IGNORE; // Pipe or socket 'type:[inode]' or an 'anon_inode:' // They may or may not belong to a container... (bsc#1218291) if ( linkTarget.relative() ) return IGNORE; // bsc#1226014. Ignore snaps. Execuables below /snap/ // (may also be detectable via /proc/PID/cgroup) if ( str::startsWith( linkTarget.asString(), "/snap/" ) ) return CONTAINER; // get stat info for the target file const PathInfo linkStat( linkTarget ); // Non-existent path means it's not reachable by us. if ( !linkStat.isExist() ) return CONTAINER; // If the file exists, it could simply mean it exists in and outside a container, check inode to be safe if ( linkStat.ino() != procInfoStat.ino()) return CONTAINER; // If the inode is the same, it could simply mean it exists in and outside a container but on different devices, check to be safe if ( linkStat.dev() != procInfoStat.dev() ) return CONTAINER; // assume HOST if all tests fail return HOST; } public: /*! * Iterates over the /proc contents for the given pid */ bool operator()( const pid_t pid ) const { // first check the exe file const Pathname pidDir = Pathname("/proc") / asString(pid); const Pathname exeFile = pidDir / "exe"; auto res = in_our_root( exeFile ); if ( res > IGNORE ) return res == CONTAINER; // if IGNORE was returned we need to continue testing all the files in /proc//map_files until we hopefully // find a still existing file. If all tests fail we will simply assume this pid is running on the HOST // a map of all already tested files, each file can be mapped multiple times and we do not want to check them more than once std::unordered_set tested; // iterate over all the entries in /proc//map_files filesystem::dirForEach( pidDir / "map_files", [ this, &tested, &res ]( const Pathname & dir_r, const char *const & name_r ){ // some helpers to make the code more self explanatory constexpr bool contloop = true; constexpr bool stoploop = false; const Pathname entryName = dir_r / name_r; // get the links target file and check if we alreadys know it, also if we can not read link information we skip the file const Pathname linkTarget = filesystem::readlink( entryName ); if ( linkTarget.empty() || !tested.insert( linkTarget.asString() ).second ) return contloop; // try to get file type const auto mappedFileType = in_our_root( entryName ); // if we got something, remember the value and stop the loop if ( mappedFileType > IGNORE ) { res = mappedFileType; return stoploop; } return contloop; }); // If res is still IGNORE, we did not find a explicit answer. So, to be safe, we assume it is running on the host. if ( res == IGNORE ) return false; // can't tell for sure, lets assume host return res == CONTAINER; } FilterRunsInContainer() {} }; /** bsc#1099847: Check for lsof version < 4.90 which does not support '-K i' * Just a quick check to allow code15 libzypp runnig in a code12 environment. * bsc#1036304: '-K i' was backported to older lsof versions, indicated by * lsof providing 'backported-option-Ki'. */ bool lsofNoOptKi() { using target::rpm::librpmDb; librpmDb::db_const_iterator it( "/" ); return( it.findPackage( "lsof" ) && it->tag_edition() < Edition("4.90") && !it->tag_provides().count( Capability("backported-option-Ki") ) ); } } //namespace ///////////////////////////////////////////////////////////////// class CheckAccessDeleted::Impl { public: CheckAccessDeleted::Impl *clone() const; bool addDataIf( const CacheEntry & cache_r, std::vector *debMap = nullptr ); void addCacheIf( CacheEntry & cache_r, const std::string & line_r, std::vector *debMap = nullptr ); std::map filterInput( externalprogram::ExternalDataSource &source ); CheckAccessDeleted::size_type createProcInfo( const std::map &in ); std::vector _data; bool _fromLsofFileMode = false; // Set if we currently process data from a debug file bool _verbose = false; std::map> debugMap; //will contain all used lsof files after filtering Pathname _debugFile; }; CheckAccessDeleted::Impl *CheckAccessDeleted::Impl::clone() const { Impl *myClone = new Impl( *this ); return myClone; } /** Add \c cache to \c data if the process is accessing deleted files. * \c pid string in \c cache is the proc line \c (pcuLR), \c files * are already in place. Always clear the \c cache.files! */ inline bool CheckAccessDeleted::Impl::addDataIf( const CacheEntry & cache_r, std::vector *debMap ) { const auto & filelist( cache_r.second ); if ( filelist.empty() ) return false; // at least one file access so keep it: _data.push_back( CheckAccessDeleted::ProcInfo() ); CheckAccessDeleted::ProcInfo & pinfo( _data.back() ); pinfo.files.insert( pinfo.files.begin(), filelist.begin(), filelist.end() ); const std::string & pline( cache_r.first ); std::string commandname; // pinfo.command if still needed... std::ostringstream pLineStr; //rewrite the first line in debug cache for_( ch, pline.begin(), pline.end() ) { switch ( *ch ) { case 'p': pinfo.pid = &*(ch+1); if ( debMap ) pLineStr <<&*(ch)<<'\0'; break; case 'R': pinfo.ppid = &*(ch+1); if ( debMap ) pLineStr <<&*(ch)<<'\0'; break; case 'u': pinfo.puid = &*(ch+1); if ( debMap ) pLineStr <<&*(ch)<<'\0'; break; case 'L': pinfo.login = &*(ch+1); if ( debMap ) pLineStr <<&*(ch)<<'\0'; break; case 'c': if ( pinfo.command.empty() ) { commandname = &*(ch+1); // the lsof command name might be truncated, so we prefer /proc//exe if (!_fromLsofFileMode) pinfo.command = filesystem::readlink( Pathname("/proc")/pinfo.pid/"exe" ).basename(); if ( pinfo.command.empty() ) pinfo.command = std::move(commandname); if ( debMap ) pLineStr <<'c'<front() = pLineStr.str(); } //entry was added return true; } /** Add file to cache if it refers to a deleted executable or library file: * - Either the link count \c(k) is \c 0, or no link cout is present. * - The type \c (t) is set to \c REG or \c DEL * - The filedescriptor \c (f) is set to \c txt, \c mem or \c DEL */ inline void CheckAccessDeleted::Impl::addCacheIf( CacheEntry & cache_r, const std::string & line_r, std::vector *debMap ) { const char * f = 0; const char * t = 0; const char * n = 0; // match any stat error appended to file path static const str::regex statErr(R"(.*\(stat: [^)]+\)$)"); for_( ch, line_r.c_str(), ch+line_r.size() ) { switch ( *ch ) { case 'k': if ( *(ch+1) != '0' ) // skip non-zero link counts return; break; case 'f': f = ch+1; break; case 't': t = ch+1; break; case 'n': n = ch+1; break; } if ( *ch == '\n' ) break; // end of data do { ++ch; } while ( *ch != '\0' ); // skip to next field } if ( !t || !f || !n ) return; // wrong filedescriptor/type/name if ( !( ( *t == 'R' && *(t+1) == 'E' && *(t+2) == 'G' && *(t+3) == '\0' ) || ( *t == 'D' && *(t+1) == 'E' && *(t+2) == 'L' && *(t+3) == '\0' ) ) ) return; // wrong type if ( !( ( *f == 'm' && *(f+1) == 'e' && *(f+2) == 'm' && *(f+3) == '\0' ) || ( *f == 't' && *(f+1) == 'x' && *(f+2) == 't' && *(f+3) == '\0' ) || ( *f == 'D' && *(f+1) == 'E' && *(f+2) == 'L' && *(f+3) == '\0' ) || ( *f == 'l' && *(f+1) == 't' && *(f+2) == 'x' && *(f+3) == '\0' ) ) ) return; // wrong filedescriptor type // lib/dialects/linux/dproc.c will append stat error to file path // if the file has not been detected as deleted. Ignore those cases if ( str::regex_match( n, statErr ) ) return; // Avoid reporting false positive due to insufficient permission. if ( ! _verbose ) { if ( ! ( str::contains( n, "/lib" ) || str::contains( n, "bin/" ) ) ) return; // Try to avoid reporting false positive unless verbose. } if ( *f == 'm' || *f == 'D' ) // skip some wellknown nonlibrary memorymapped files { static const char * black[] = { "/SYSV" , "/var/" , "/dev/" , "/tmp/" , "/proc/" , "/memfd:" , "/snap/" }; for_( it, arrayBegin( black ), arrayEnd( black ) ) { if ( str::hasPrefix( n, *it ) ) return; } } // Add if no duplicate if ( debMap && cache_r.second.find(n) == cache_r.second.end() ) { debMap->push_back(line_r); } cache_r.second.insert( n ); } CheckAccessDeleted::CheckAccessDeleted( bool doCheck_r ) : _pimpl(new Impl) { if ( doCheck_r ) check(); } CheckAccessDeleted::size_type CheckAccessDeleted::check( const Pathname &lsofOutput_r, bool verbose_r ) { _pimpl->_verbose = verbose_r; _pimpl->_fromLsofFileMode = true; FILE *inFile = fopen( lsofOutput_r.c_str(), "r" ); if ( !inFile ) { ZYPP_THROW( Exception( str::Format("Opening input file %1% failed.") % lsofOutput_r.c_str() ) ); } //inFile is closed by ExternalDataSource externalprogram::ExternalDataSource inSource( inFile, nullptr ); auto cache = _pimpl->filterInput( inSource ); return _pimpl->createProcInfo( cache ); } std::map CheckAccessDeleted::Impl::filterInput( externalprogram::ExternalDataSource &source ) { // cachemap: PID => (deleted files) // NOTE: omit PIDs running in a (lxc/docker) container std::map cachemap; bool debugEnabled = !_debugFile.empty(); pid_t cachepid = 0; FilterRunsInContainer runsInLXC; MIL << "Silently scanning lsof output..." << endl; zypp::base::LogControl::TmpLineWriter shutUp; // suppress excessive readdir etc. logging in runsInLXC for( std::string line = source.receiveLine( 30 * 1000 ); ! line.empty(); line = source.receiveLine( 30 * 1000 ) ) { // NOTE: line contains '\0' separeated fields! if ( line[0] == 'p' ) { str::strtonum( line.c_str()+1, cachepid ); // line is "p\0...." if ( _fromLsofFileMode || !runsInLXC( cachepid ) ) { if ( debugEnabled ) { auto &pidMad = debugMap[cachepid]; if ( pidMad.empty() ) debugMap[cachepid].push_back( line ); else debugMap[cachepid].front() = line; } cachemap[cachepid].first.swap( line ); } else { cachepid = 0; // ignore this pid } } else if ( cachepid ) { auto &dbgMap = debugMap[cachepid]; addCacheIf( cachemap[cachepid], line, debugEnabled ? &dbgMap : nullptr); } } return cachemap; } CheckAccessDeleted::size_type CheckAccessDeleted::check( bool verbose_r ) { static const char* argv[] = { "lsof", "-n", "-FpcuLRftkn0", "-K", "i", NULL }; if ( lsofNoOptKi() ) argv[3] = NULL; _pimpl->_verbose = verbose_r; _pimpl->_fromLsofFileMode = false; ExternalProgram prog( argv, ExternalProgram::Discard_Stderr ); std::map cachemap; try { cachemap = _pimpl->filterInput( prog ); } catch ( const io::TimeoutException &e ) { ZYPP_CAUGHT( e ); prog.kill(); ZYPP_THROW ( Exception( "Reading data from 'lsof' timed out.") ); } int ret = prog.close(); if ( ret != 0 ) { if ( ret == 129 ) { ZYPP_THROW( Exception(_("Please install package 'lsof' first.") ) ); } Exception err( str::Format("Executing 'lsof' failed (%1%).") % ret ); err.remember( prog.execError() ); ZYPP_THROW( err ); } return _pimpl->createProcInfo( cachemap ); } CheckAccessDeleted::size_type CheckAccessDeleted::Impl::createProcInfo(const std::map &in) { std::ofstream debugFileOut; bool debugEnabled = false; if ( !_debugFile.empty() ) { debugFileOut.open( _debugFile.c_str() ); debugEnabled = debugFileOut.is_open(); if ( !debugEnabled ) { ERR<<"Unable to open debug file: "<<_debugFile< *mapPtr = nullptr; auto dbgInfo = debugMap.find(cached.first); if ( dbgInfo != debugMap.end() ) mapPtr = &(dbgInfo->second); if( !addDataIf( cached.second, mapPtr ) ) continue; for ( const std::string &dbgLine: dbgInfo->second ) { debugFileOut.write( dbgLine.c_str(), dbgLine.length() ); } } } return _data.size(); } bool CheckAccessDeleted::empty() const { return _pimpl->_data.empty(); } CheckAccessDeleted::size_type CheckAccessDeleted::size() const { return _pimpl->_data.size(); } CheckAccessDeleted::const_iterator CheckAccessDeleted::begin() const { return _pimpl->_data.begin(); } CheckAccessDeleted::const_iterator CheckAccessDeleted::end() const { return _pimpl->_data.end(); } void CheckAccessDeleted::setDebugOutputFile(const Pathname &filename_r) { _pimpl->_debugFile = filename_r; } std::string CheckAccessDeleted::findService( pid_t pid_r ) { ProcInfo p; p.pid = str::numstring( pid_r ); return p.service(); } std::string CheckAccessDeleted::ProcInfo::service() const { // cgroup entries like: // 1:name=systemd:/system.slice/systemd-udevd.service // 0::/system.slice/systemd-udevd.service // 0::/system.slice/systemd-udevd.service/udev static const str::regex rx( "(0::|[0-9]+:name=systemd:)/system.slice/(.*/)?(.*).service(/.*)?$" ); str::smatch what; std::string ret; iostr::simpleParseFile( InputStream( Pathname("/proc")/pid/"cgroup" ), [&]( int num_r, const std::string& line_r )->bool { if ( str::regex_match( line_r, what, rx ) ) { ret = what[3]; return false; // stop after match } return true; } ); return ret; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const CheckAccessDeleted & obj ) { return dumpRange( str << "CheckAccessDeleted ", obj.begin(), obj.end() ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const CheckAccessDeleted::ProcInfo & obj ) { if ( obj.pid.empty() ) return str << ""; return dumpRangeLine( str << obj.command << '<' << obj.pid << '|' << obj.ppid << '|' << obj.puid << '|' << obj.login << '>', obj.files.begin(), obj.files.end() ); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/misc/CheckAccessDeleted.h000066400000000000000000000115611476576476200211560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/CheckAccessDeleted.h * */ #ifndef ZYPP_MISC_CHECKACCESSDELETED_H #define ZYPP_MISC_CHECKACCESSDELETED_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** * Check for running processes which access deleted executables or libraries. * * Executed after commit, this gives a hint which processes/services * need to be restarted. * * Per default upon construction or explicit call to \ref check, * information about running processes which access deleted files * or libraries is collected and provided as a \ref ProcInfo * container. * * Provides support for reproducing check results from a foreign system by * creating a debug output file containing all required information, * enabled by \ref setDebugOutputFile.\n * This data file can be used as datasource when passed to \ref check(const Pathname &, bool). */ class ZYPP_API CheckAccessDeleted { public: class Impl; /** * Data about one running process accessing deleted files. */ struct ProcInfo { std::string pid; //!< process ID std::string ppid; //!< parent process ID std::string puid; //!< process user ID std::string login; //!< process login name std::string command; //!< process command name std::vector files; //!< list of deleted executables or libraries accessed /** Guess if command was started by a systemd service script. * The service name might be used to restart the service. * \warning This is just a guess. */ std::string service() const; }; using size_type = size_t; using value_type = ProcInfo; using const_iterator = std::vector::const_iterator; public: /** Default ctor performs check immediately. * Pass \c false and the initial check is omitted. * \throws Exception if \ref check throws. * \see \ref check. */ CheckAccessDeleted( bool doCheck_r = true ); public: /** Check for running processes which access deleted executables or libraries. * * Per default \ref check will try guess and collect executables and * libraries only by looking at the files path and name. (e.g named * \c lib* or located in \c *bin/). * * A verbose check will omit this test and collect all processes using * any deleted file. * * \return the number of processes found. * \throws Exception On error collecting the data (e.g. no lsof installed) */ size_type check( bool verbose_r = false ); /** * \overload * Performs the same checks but instead of investigating the current system it * uses information from \a lsofOutput_r to support debugging. * * \sa setDebugOutputFile */ size_type check( const Pathname &lsofOutput_r, bool verbose_r = false ); bool empty() const; size_type size() const; const_iterator begin() const; const_iterator end() const; /** * Writes all filtered process entries that make it into the final set into * a file specified by \a filename_r. */ void setDebugOutputFile (const Pathname &filename_r); public: /** Guess if pid was started by a systemd service script. * The service name might be used to restart the service. * \warning This is just a guess. */ static std::string findService( pid_t pid_r ); private: RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates CheckAccessDeleted Stream output */ std::ostream & operator<<( std::ostream & str, const CheckAccessDeleted & obj ); /** \relates CheckAccessDeleted::ProcInfo Stream output */ std::ostream & operator<<( std::ostream & str, const CheckAccessDeleted::ProcInfo & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_MISC_CHECKACCESSDELETED_H libzypp-17.36.5/zypp/misc/DefaultLoadSystem.cc000066400000000000000000000103611476576476200212540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/DefaultLoadSystem.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::misc" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace misc { ///////////////////////////////////////////////////////////////// void defaultLoadSystem( const Pathname & sysRoot_r, LoadSystemFlags flags_r ) { if ( not flags_r && geteuid() != 0 ) { flags_r |= LS_NOREFRESH; } MIL << str::form( "*** Load system at '%s' (%lx)", sysRoot_r.c_str(), (unsigned long)flags_r ) << endl; if ( ! PathInfo( sysRoot_r ).isDir() ) ZYPP_THROW( Exception(str::form("sysRoot_r argument needs to be a directory. (%s)", sysRoot_r.c_str())) ); if ( ZYppFactory::instance().haveZYpp() ) ZYPP_THROW( Exception("ZYpp instance is already created. (Call this method earlier.)") ); if ( flags_r.testFlag( LS_READONLY ) ) zypp_readonly_hack::IWantIt (); sat::Pool satpool( sat::Pool::instance() ); if ( 1 ) { MIL << "*** load target '" << Repository::systemRepoAlias() << "'\t" << endl; getZYpp()->initializeTarget( sysRoot_r ); getZYpp()->target()->load(); MIL << satpool.systemRepo() << endl; } if ( not flags_r.testFlag( LS_NOREPOS ) ) { RepoManager repoManager( sysRoot_r ); RepoInfoList repos = repoManager.knownRepositories(); for_( it, repos.begin(), repos.end() ) { RepoInfo & nrepo( *it ); if ( ! nrepo.enabled() ) continue; if ( ! flags_r.testFlag( LS_NOREFRESH ) ) { if ( repoManager.isCached( nrepo ) && ( nrepo.type() == repo::RepoType::RPMPLAINDIR // refreshes always || repoManager.checkIfToRefreshMetadata( nrepo, nrepo.url() ) == RepoManager::REFRESH_NEEDED ) ) { MIL << str::form( "*** clean cache for repo '%s'\t", nrepo.name().c_str() ) << endl; repoManager.cleanCache( nrepo ); MIL << str::form( "*** refresh repo '%s'\t", nrepo.name().c_str() ) << endl; repoManager.refreshMetadata( nrepo ); } } if ( ! repoManager.isCached( nrepo ) ) { MIL << str::form( "*** build cache for repo '%s'\t", nrepo.name().c_str() ) << endl; repoManager.buildCache( nrepo ); } MIL << str::form( "*** load repo '%s'\t", nrepo.name().c_str() ) << std::flush; try { repoManager.loadFromCache( nrepo ); MIL << satpool.reposFind( nrepo.alias() ) << endl; } catch ( const Exception & exp ) { ERR << "*** load repo failed: " << exp.asString() + "\n" + exp.historyAsString() << endl; ZYPP_RETHROW ( exp ); } } } MIL << str::form( "*** Read system at '%s'", sysRoot_r.c_str() ) << endl; } ///////////////////////////////////////////////////////////////// } // namespace misc /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/misc/DefaultLoadSystem.h000066400000000000000000000046561476576476200211300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/DefaultLoadSystem.h * */ #ifndef ZYPP_MISC_DEFAULTLOADSYSTEM_H #define ZYPP_MISC_DEFAULTLOADSYSTEM_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace misc { ///////////////////////////////////////////////////////////////// /** * Bits for tuning \ref defaultLoadSystem. * * Use \ref LoadSystemFlags as a type-safe way of * storing OR-combinations. */ enum LoadSystemFlag { LS_READONLY = (1 << 0), //!< // Create readonly ZYpp instance. LS_NOREFRESH = (1 << 1), //!< // Don't refresh existing repos. LS_NOREPOS = (1 << 2), //!< // Don't loag existing repos (just Target). }; /** \relates LoadSystemFlag Type-safe way of storing OR-combinations. */ ZYPP_DECLARE_FLAGS_AND_OPERATORS( LoadSystemFlags, LoadSystemFlag ); /** * Create the ZYpp instance and load target and enabled repositories. * * \see LoadSystemFlag for options. * * \throws Exception on error * * \todo properly handle service refreshs */ void defaultLoadSystem( const Pathname & sysRoot_r = "/", LoadSystemFlags flags_r = LoadSystemFlags() ); /** \overload */ inline void defaultLoadSystem( LoadSystemFlags flags_r ) { defaultLoadSystem( "/", flags_r ); } ///////////////////////////////////////////////////////////////// } // namespace misc /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_MISC_DEFAULTLOADSYSTEM_H libzypp-17.36.5/zypp/misc/HelixHelpers.h000066400000000000000000000242751476576476200201320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/HelixHelpers.h * */ #ifndef ZYPP_MISC_HELIXHELPERS_H #define ZYPP_MISC_HELIXHELPERS_H #include #include #include #include #include #include #include #include #include #include namespace helix::detail { template struct AutoXmlFree : public zypp::AutoDispose { AutoXmlFree( Tp* ptr_r = nullptr ) : zypp::AutoDispose( ptr_r, [] ( Tp* ptr_r ) { if ( ptr_r ) ::xmlFree( ptr_r ); } ) {} }; class XmlNode { private: xmlNodePtr _node; public: XmlNode (const xmlNodePtr node) : _node(node){}; virtual ~XmlNode (){}; // ---------------------------------- accessors std::string_view name() const { return (std::string_view((const char *)_node->name)); } xmlElementType type() const { return (_node->type); } xmlNodePtr node() const { return (_node); } std::optional next() const { return (_node->next == NULL ? std::optional() : XmlNode (_node->next)); } std::optional children() const { return (_node->xmlChildrenNode == NULL ? std::optional() : XmlNode (_node->xmlChildrenNode)); } // ---------------------------------- methods bool equals (const std::string_view & n) const { return (strncasecmp ( name().data(), n.data(), n.length() ) == 0); } bool isElement (void) const { return (type() == XML_ELEMENT_NODE); } std::map getAllProps () const { std::map res; for( xmlAttrPtr attr = _node->properties; NULL != attr; attr = attr->next ) { if ( !attr->children ) continue; AutoXmlFree value( xmlNodeListGetString( _node->doc, attr->children, 1 ) ); res.insert( std::make_pair( std::string((char *)attr->name), std::string( (char *)value.value() ) ) ); } return res; } std::string getContent (void) const { AutoXmlFree buf; std::string ret; *buf = xmlNodeGetContent (_node); ret = std::string ((const char *)buf.value()); return (ret); } std::string getProp (const std::string & name, const std::string & deflt = "") const { AutoXmlFree ret; std::string gs; *ret = xmlGetProp (_node, (const xmlChar *)name.c_str()); if (ret) { gs = std::string ((const char *)ret.value()); return gs; } return deflt; } template T getValue ( const std::string & name, const T& deflt ) const; template bool getValue ( const std::string & name, T& target ) const; }; template<> bool XmlNode::getValue ( const std::string & name, std::string& target ) const { AutoXmlFree xml_s; xmlNode *child; *xml_s = xmlGetProp(_node, (const xmlChar *)name.c_str()); if (xml_s) { target = std::string ((const char *)xml_s.value()); return true; } child = _node->xmlChildrenNode; while (child) { if (strcasecmp((const char *)(child->name), name.c_str()) == 0) { xml_s = xmlNodeGetContent(child); if (xml_s) { target = std::string ((const char *)xml_s.value()); return true; } } child = child->next; } return false; } template<> std::string XmlNode::getValue ( const std::string & name, const std::string& deflt ) const { std::string res; if ( !getValue( name, res ) ) return deflt; return res; } bool parseSetup ( const XmlNode &setup, zypp::misc::testcase::TestcaseSetup &t, std::string *err ) { auto &target = t.data(); auto architecture = setup.getProp( "arch" ); if ( !architecture.empty() ) { try { target.architecture = ( zypp::Arch(architecture) ); } catch( const zypp::Exception & excpt_r ) { ZYPP_CAUGHT( excpt_r ); if ( err ) *err = zypp::str::Str() << "Bad architecture '" << architecture << "' in "; return false; } } auto node = setup.children(); while ( node ) { if ( !node->isElement() ) { node = node->next(); continue; } #define if_SolverFlag( N ) if ( node->equals( #N ) ) { target.N = true; } if_SolverFlag( ignorealreadyrecommended ) else if ( node->equals( "ignorealready" ) ) { target.ignorealreadyrecommended = true; } else if_SolverFlag( onlyRequires ) else if ( node->equals( "ignorerecommended" ) ) { target.onlyRequires = true; } else if_SolverFlag( forceResolve ) else if_SolverFlag( cleandepsOnRemove ) else if_SolverFlag( allowDowngrade ) else if_SolverFlag( allowNameChange ) else if_SolverFlag( allowArchChange ) else if_SolverFlag( allowVendorChange ) else if_SolverFlag( dupAllowDowngrade ) else if_SolverFlag( dupAllowNameChange ) else if_SolverFlag( dupAllowArchChange ) else if_SolverFlag( dupAllowVendorChange ) #undef if_SolverFlag else if ( node->equals("focus") ) { target.resolverFocus = zypp::resolverFocusFromString( node->getProp("value") ); } else if ( node->equals("system") ) { target.systemRepo = zypp::misc::testcase::RepoDataImpl { zypp::misc::testcase::TestcaseRepoType::Helix, "@System", 99, node->getProp("file") }; } else if ( node->equals("hardwareInfo") ) { target.hardwareInfoFile = target.globalPath / node->getProp("path"); } else if ( node->equals("modalias") ) { target.modaliasList.push_back( node->getProp("name") ); } else if ( node->equals("multiversion") ) { target.multiversionSpec.insert( node->getProp("name") ); } else if (node->equals ("channel")) { std::string name = node->getProp("name"); std::string file = node->getProp("file"); std::string type = node->getProp("type"); unsigned prio = 99; std::string priority = node->getProp("priority"); if ( !priority.empty() ) { prio = zypp::str::strtonum( priority ); } target.repos.push_back( zypp::misc::testcase::RepoDataImpl{ zypp::misc::testcase::TestcaseRepoType::Helix, name, prio, file }); } else if ( node->equals("source") ) { std::string url = node->getProp("url"); std::string alias = node->getProp("name"); target.repos.push_back( zypp::misc::testcase::RepoDataImpl{ zypp::misc::testcase::TestcaseRepoType::Url, alias, 99, url }); } else if ( node->equals("force-install") ) { target.forceInstallTasks.push_back( zypp::misc::testcase::ForceInstallImpl{ node->getProp("channel"), node->getProp("package"), node->getProp("kind") }); } else if ( node->equals("mediaid") ) { target.show_mediaid = true; } else if ( node->equals("arch") ) { MIL << " deprecated, use instead" << std::endl; std::string architecture = node->getProp("name"); if ( architecture.empty() ) { ERR << "Property 'name=' in missing or empty" << std::endl; } else { MIL << "Setting architecture to '" << architecture << "'" << std::endl; target.architecture = zypp::Arch( architecture ); } } else if ( node->equals("locale") ) { zypp::Locale loc( node->getProp("name") ); std::string fate = node->getProp("fate"); if ( !loc ) { ERR << "Bad or missing name in " << std::endl; } else if ( fate == "added" ) { target.localesTracker.added().insert( loc ); } else if ( fate == "removed" ) { target.localesTracker.removed().insert( loc ); } else { target.localesTracker.current().insert( loc ); } } else if ( node->equals("autoinst") ) { target.autoinstalled.push( zypp::IdString( node->getProp("name") ).id() ); } else if ( node->equals("systemCheck") ) { target.systemCheck = target.globalPath / node->getProp("path"); } else if ( node->equals("setlicencebit") ) { target.set_licence = true; } else { ERR << "Unrecognized tag '" << node->name() << "' in setup" << std::endl; } node = node->next(); } return true; } bool parseTrialNode ( const XmlNode &node, zypp::misc::testcase::TestcaseTrial::Node &testcaseNode ) { testcaseNode.name() = node.name(); const auto & content = node.getContent(); if ( !content.empty() ) { testcaseNode.value() = content; } testcaseNode.properties() = node.getAllProps(); for ( auto childNode = node.children(); childNode; childNode = childNode->next() ) { auto testNode = std::make_shared(); if ( !parseTrialNode( *childNode, *testNode ) ) return false; testcaseNode.children().push_back( testNode ); } return true; } bool parseTrial ( const XmlNode &trial, zypp::misc::testcase::TestcaseTrial &target, std::string * ) { auto node = trial.children(); while (node) { if (!node->isElement()) { node = node->next(); continue; } zypp::misc::testcase::TestcaseTrial::Node testcaseNode; parseTrialNode( *node, testcaseNode ); target.nodes().push_back( testcaseNode ); node = node->next(); } return true; } } #endif libzypp-17.36.5/zypp/misc/LoadTestcase.cc000066400000000000000000000162771476576476200202520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/LoadTestcase.cc * */ #include "LoadTestcase.h" #include "HelixHelpers.h" #include "YamlTestcaseHelpers.h" #include #include namespace zypp::misc::testcase { static const std::string helixControlFile = "solver-test.xml"; static const std::string yamlControlFile = "zypp-control.yaml"; struct LoadTestcase::Impl { TestcaseSetup _setup; TestcaseTrials _trials; bool loadHelix (const Pathname &filename, std::string *err); bool loadYaml ( const Pathname &path, std::string *err); }; struct TestcaseTrial::Impl { std::vector nodes; Impl *clone() const { return new Impl(*this); } }; struct TestcaseTrial::Node::Impl { std::string name; std::string value; std::map properties; std::vector> children; Impl *clone() const { return new Impl(*this); } }; TestcaseTrial::TestcaseTrial() : _pimpl ( new Impl() ) { } TestcaseTrial::~TestcaseTrial() { } const std::vector &TestcaseTrial::nodes() const { return _pimpl->nodes; } std::vector &TestcaseTrial::nodes() { return _pimpl->nodes; } TestcaseTrial::Node::Node() : _pimpl ( new Impl() ) { } TestcaseTrial::Node::~Node() { } const std::string &TestcaseTrial::Node::name() const { return _pimpl->name; } std::string &TestcaseTrial::Node::name() { return _pimpl->name; } const std::string &TestcaseTrial::Node::value() const { return _pimpl->value; } std::string &TestcaseTrial::Node::value() { return _pimpl->value; } const std::string &TestcaseTrial::Node::getProp( const std::string &name, const std::string &def ) const { auto it { _pimpl->properties.find( name ) }; return it == _pimpl->properties.end() ? def : it->second; } const std::map &TestcaseTrial::Node::properties() const { return _pimpl->properties; } std::map &TestcaseTrial::Node::properties() { return _pimpl->properties; } const std::vector > &TestcaseTrial::Node::children() const { return _pimpl->children; } std::vector > &TestcaseTrial::Node::children() { return _pimpl->children; } bool LoadTestcase::Impl::loadHelix(const zypp::filesystem::Pathname &filename, std::string *err) { xmlDocPtr xml_doc = xmlParseFile ( filename.c_str() ); if (xml_doc == NULL) { if ( err ) *err = (str::Str() << "Can't parse test file '" << filename << "'"); return false; } auto root = helix::detail::XmlNode (xmlDocGetRootElement (xml_doc)); DBG << "Parsing file '" << filename << "'" << std::endl; if (!root.equals("test")) { if ( err ) *err = (str::Str() << "Node not 'test' in parse_xml_test():" << root.name() << "'"); return false; } bool setupDone = false; auto node = root.children(); while (node) { if (node->type() == XML_ELEMENT_NODE) { if (node->equals( "setup" )) { if ( setupDone ) { if ( err ) *err = "Multiple setup tags found, this is not supported"; return false; } setupDone = true; if ( !helix::detail::parseSetup( *node, _setup, err ) ) return false; } else if (node->equals( "trial" )) { if ( !setupDone ) { if ( err ) *err = "Any trials must be preceded by the setup!"; return false; } TestcaseTrial trial; if ( !helix::detail::parseTrial( *node, trial, err ) ) return false; _trials.push_back( trial ); } else { ERR << "Unknown tag '" << node->name() << "' in test" << std::endl; } } node = ( node->next() ); } xmlFreeDoc (xml_doc); return true; } bool LoadTestcase::Impl::loadYaml(const zypp::filesystem::Pathname &path, std::string *err) { DBG << "Parsing file '" << path << "'" << std::endl; const auto makeError = [&]( const std::string_view &errStr ){ if ( err ) *err = errStr; return false; }; YAML::Node control; try { control = YAML::LoadFile( path.asString() ); if ( control.Type() != YAML::NodeType::Map ) return makeError("Root node must be of type Map."); const auto &setup = control["setup"]; if ( !setup ) return makeError("The 'setup' section is required."); if ( !yamltest::detail::parseSetup( setup, _setup, err) ) return false; const auto &trials = control["trials"]; if ( !trials ) return makeError("The 'trials' section is required."); if ( trials.Type() != YAML::NodeType::Sequence ) return makeError("The 'trials' section must be of type Sequence."); for ( const auto &trial : trials ) { zypp::misc::testcase::TestcaseTrial t; if ( !trial["trial"] ) return makeError("Every element in the trials sequence needs to have the 'trial' key."); if ( !yamltest::detail::parseTrial( trial["trial"], t, _setup.data().globalPath, err) ) return false; _trials.push_back( t ); } } catch ( YAML::Exception &e ) { if ( err ) *err = e.what(); return false; } catch ( ... ) { if ( err ) *err = "Unknown error when parsing the control file"; return false; } return true; } LoadTestcase::LoadTestcase() : _pimpl( new Impl() ) { } LoadTestcase::~LoadTestcase() { } bool LoadTestcase::loadTestcaseAt(const zypp::filesystem::Pathname &path, std::string *err) { const auto t = testcaseTypeAt( path ); if ( t == LoadTestcase::None ) { if ( err ) *err = "Unsopported or no testcase in directory"; return false; } // reset everything _pimpl.reset( new Impl() ); _pimpl->_setup.data().globalPath = path; switch (t) { case LoadTestcase::Helix: return _pimpl->loadHelix( path / helixControlFile, err ); case LoadTestcase::Yaml: return _pimpl->loadYaml( path / yamlControlFile, err ); default: return false; } } LoadTestcase::Type LoadTestcase::testcaseTypeAt(const zypp::filesystem::Pathname &path) { if ( filesystem::PathInfo( path / helixControlFile ).isFile() ) { return LoadTestcase::Helix; } else if ( filesystem::PathInfo( path / yamlControlFile ).isFile() ) { return LoadTestcase::Yaml; } return LoadTestcase::None; } const TestcaseSetup &LoadTestcase::setupInfo() const { return _pimpl->_setup; } const LoadTestcase::TestcaseTrials &LoadTestcase::trialInfo() const { return _pimpl->_trials; } } libzypp-17.36.5/zypp/misc/LoadTestcase.h000066400000000000000000000045011476576476200200770ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/LoadTestcase.h * */ #ifndef ZYPP_MISC_LOADTESTCASE_H #define ZYPP_MISC_LOADTESTCASE_H #include #include #include #include #include #include #include #include namespace zypp::misc::testcase { struct ZYPP_API_DEPTESTOMATIC TestcaseTrial { struct Node { struct Impl; Node(); ~Node(); const std::string &name () const; std::string &name (); const std::string &value () const; std::string &value (); const std::string &getProp( const std::string &name, const std::string &def = std::string() ) const; const std::map &properties() const; std::map &properties(); const std::vector> &children() const; std::vector> &children(); private: RWCOW_pointer _pimpl; }; TestcaseTrial(); ~TestcaseTrial(); const std::vector &nodes () const; std::vector &nodes (); private: struct Impl; RWCOW_pointer _pimpl; }; class ZYPP_API LoadTestcase : private zypp::base::NonCopyable { public: struct Impl; using TestcaseTrials = std::vector; enum Type { None, Helix, Yaml }; LoadTestcase(); ~LoadTestcase(); bool loadTestcaseAt ( const zypp::Pathname &path, std::string *err ); static Type testcaseTypeAt ( const zypp::Pathname &path ); const TestcaseSetup &setupInfo() const; const TestcaseTrials &trialInfo() const; private: std::unique_ptr _pimpl; }; } #endif // ZYPP_MISC_LOADTESTCASE_H libzypp-17.36.5/zypp/misc/TestcaseSetup.cc000066400000000000000000000166761476576476200204760ustar00rootroot00000000000000#include "TestcaseSetupImpl.h" namespace zypp::misc::testcase { RepoData::RepoData() : _pimpl( new RepoDataImpl ) {} RepoData::~RepoData() { } RepoData::RepoData(RepoDataImpl &&data) : _pimpl( new RepoDataImpl( std::move(data)) ) { } TestcaseRepoType RepoData::type() const { return _pimpl->type; } const std::string &RepoData::alias() const { return _pimpl->alias; } uint RepoData::priority() const { return _pimpl->priority; } const std::string &RepoData::path() const { return _pimpl->path; } const RepoDataImpl &RepoData::data() const { return *_pimpl; } RepoDataImpl &RepoData::data() { return *_pimpl; } ForceInstall::ForceInstall() : _pimpl( new ForceInstallImpl ) { } ForceInstall::~ForceInstall() { } ForceInstall::ForceInstall(ForceInstallImpl &&data) : _pimpl( new ForceInstallImpl( std::move(data) )) { } const ForceInstallImpl &ForceInstall::data() const { return *_pimpl; } ForceInstallImpl &ForceInstall::data() { return *_pimpl; } const std::string &ForceInstall::channel() const { return _pimpl->channel; } const std::string &ForceInstall::package() const { return _pimpl->package; } const std::string &ForceInstall::kind() const { return _pimpl->kind; } TestcaseSetup::TestcaseSetup() : _pimpl( new TestcaseSetupImpl ) { } TestcaseSetup::~TestcaseSetup() { } Arch TestcaseSetup::architecture() const { return _pimpl->architecture; } const std::optional &TestcaseSetup::systemRepo() const { return _pimpl->systemRepo; } const std::vector &TestcaseSetup::repos() const { return _pimpl->repos; } ResolverFocus TestcaseSetup::resolverFocus() const { return _pimpl->resolverFocus; } const zypp::filesystem::Pathname &TestcaseSetup::globalPath() const { return _pimpl->globalPath; } const zypp::filesystem::Pathname &TestcaseSetup::hardwareInfoFile() const { return _pimpl->hardwareInfoFile; } const zypp::filesystem::Pathname &TestcaseSetup::systemCheck() const { return _pimpl->systemCheck; } const target::Modalias::ModaliasList &TestcaseSetup::modaliasList() const { return _pimpl->modaliasList; } const base::SetTracker &TestcaseSetup::localesTracker() const { return _pimpl->localesTracker; } const std::vector > &TestcaseSetup::vendorLists() const { return _pimpl->vendorLists; } const sat::StringQueue &TestcaseSetup::autoinstalled() const { return _pimpl->autoinstalled; } const std::set &TestcaseSetup::multiversionSpec() const { return _pimpl->multiversionSpec; } const std::vector &TestcaseSetup::forceInstallTasks() const { return _pimpl->forceInstallTasks; } bool TestcaseSetup::set_licence() const { return _pimpl->set_licence; } bool TestcaseSetup::show_mediaid() const { return _pimpl->show_mediaid; } bool TestcaseSetup::ignorealreadyrecommended() const { return _pimpl->ignorealreadyrecommended; } bool TestcaseSetup::onlyRequires() const { return _pimpl->onlyRequires; } bool TestcaseSetup::forceResolve() const { return _pimpl->forceResolve; } bool TestcaseSetup::cleandepsOnRemove() const { return _pimpl->cleandepsOnRemove; } bool TestcaseSetup::allowDowngrade() const { return _pimpl->allowDowngrade; } bool TestcaseSetup::allowNameChange() const { return _pimpl->allowNameChange; } bool TestcaseSetup::allowArchChange() const { return _pimpl->allowArchChange; } bool TestcaseSetup::allowVendorChange() const { return _pimpl->allowVendorChange; } bool TestcaseSetup::dupAllowDowngrade() const { return _pimpl->dupAllowDowngrade; } bool TestcaseSetup::dupAllowNameChange() const { return _pimpl->dupAllowNameChange; } bool TestcaseSetup::dupAllowArchChange() const { return _pimpl->dupAllowArchChange; } bool TestcaseSetup::dupAllowVendorChange() const { return _pimpl->dupAllowVendorChange; } bool TestcaseSetup::applySetup( zypp::RepoManager &manager ) const { const auto &setup = data(); if ( !setup.architecture.empty() ) { MIL << "Setting architecture to '" << setup.architecture << "'" << std::endl; ZConfig::instance().setSystemArchitecture( setup.architecture ); setenv ("ZYPP_TESTSUITE_FAKE_ARCH", setup.architecture.c_str(), 1); } if ( setup.systemRepo ) { if (!loadRepo( manager, *this, *setup.systemRepo ) ) { ERR << "Can't setup 'system'" << std::endl; return false; } } if ( !setup.hardwareInfoFile.empty() ) { setenv( "ZYPP_MODALIAS_SYSFS", setup.hardwareInfoFile.asString().c_str(), 1 ); MIL << "setting HardwareInfo to: " << setup.hardwareInfoFile.asString() << std::endl; } for ( const auto &channel : setup.repos ) { if ( !loadRepo( manager, *this, channel ) ) { ERR << "Can't setup 'channel'" << std::endl; return false; } } if ( !setup.systemCheck.empty() ) { MIL << "setting systemCheck to: " << setup.systemCheck.asString() << std::endl; SystemCheck::instance().setFile( setup.systemCheck ); } return true; } bool TestcaseSetup::loadRepo( zypp::RepoManager &manager, const TestcaseSetup &setup, const RepoData &data ) { const auto &repoData = data.data(); Pathname pathname = setup._pimpl->globalPath + repoData.path; MIL << "'" << pathname << "'" << std::endl; Repository repo; using TrType = zypp::misc::testcase::TestcaseRepoType; if ( repoData.type == TrType::Url ) { try { MIL << "Load from Url '" << repoData.path << "'" << std::endl; RepoInfo nrepo; nrepo.setAlias ( repoData.alias ); nrepo.setName ( repoData.alias ); nrepo.setEnabled ( true ); nrepo.setAutorefresh( false ); nrepo.setPriority ( repoData.priority ); nrepo.addBaseUrl ( Url(repoData.path) ); manager.refreshMetadata( nrepo ); manager.buildCache( nrepo ); manager.loadFromCache( nrepo ); } catch ( Exception & excpt_r ) { ZYPP_CAUGHT (excpt_r); ERR << "Couldn't load packages from Url '" << repoData.path << "'" << std::endl; return false; } } else { try { MIL << "Load from File '" << pathname << "'" << std::endl; zypp::Repository satRepo; if ( repoData.alias == "@System" ) { satRepo = zypp::sat::Pool::instance().systemRepo(); } else { satRepo = zypp::sat::Pool::instance().reposInsert( repoData.alias ); } RepoInfo nrepo; nrepo.setAlias ( repoData.alias ); nrepo.setName ( repoData.alias ); nrepo.setEnabled ( true ); nrepo.setAutorefresh( false ); nrepo.setPriority ( repoData.priority ); nrepo.addBaseUrl ( pathname.asUrl() ); satRepo.setInfo (nrepo); if ( repoData.type == TrType::Helix ) satRepo.addHelix( pathname ); else satRepo.addTesttags( pathname ); MIL << "Loaded " << satRepo.solvablesSize() << " resolvables from " << ( repoData.path.empty()?pathname.asString():repoData.path) << "." << std::endl; } catch ( Exception & excpt_r ) { ZYPP_CAUGHT (excpt_r); ERR << "Couldn't load packages from XML file '" << repoData.path << "'" << std::endl; return false; } } return true; } TestcaseSetupImpl &TestcaseSetup::data() { return *_pimpl; } const TestcaseSetupImpl &TestcaseSetup::data() const { return *_pimpl; } } libzypp-17.36.5/zypp/misc/TestcaseSetup.h000066400000000000000000000071741476576476200203310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/TestcaseSetup.h * */ #ifndef ZYPP_MISC_TESTCASESETUP_H #define ZYPP_MISC_TESTCASESETUP_H #include #include #include #include #include #include #include #include #include #include #include #include namespace zypp { class RepoManager; } namespace zypp::misc::testcase { enum class TestcaseRepoType { Helix, Testtags, Url }; struct RepoDataImpl; struct ForceInstallImpl; struct TestcaseSetupImpl; class RepoData { public: RepoData (); ~RepoData (); RepoData ( RepoDataImpl &&data ); TestcaseRepoType type() const; const std::string &alias() const; uint priority() const; const std::string &path() const; const RepoDataImpl &data() const; RepoDataImpl &data(); private: RWCOW_pointer _pimpl; }; class ZYPP_API_DEPTESTOMATIC ForceInstall { public: ForceInstall (); ~ForceInstall (); ForceInstall ( ForceInstallImpl &&data ); const std::string &channel () const; const std::string &package () const; const std::string &kind () const; const ForceInstallImpl &data() const; ForceInstallImpl &data(); private: RWCOW_pointer _pimpl; }; class ZYPP_API_DEPTESTOMATIC TestcaseSetup { public: TestcaseSetup(); ~TestcaseSetup(); Arch architecture () const; const std::optional &systemRepo() const; const std::vector &repos() const; // solver flags: default to false - set true if mentioned in ResolverFocus resolverFocus() const; const Pathname &globalPath() const; const Pathname &hardwareInfoFile() const; const Pathname &systemCheck() const; const target::Modalias::ModaliasList &modaliasList() const; const base::SetTracker &localesTracker() const; const std::vector> &vendorLists() const; const sat::StringQueue &autoinstalled() const; const std::set &multiversionSpec() const; const std::vector &forceInstallTasks() const; bool set_licence() const; bool show_mediaid() const; bool ignorealreadyrecommended() const; bool onlyRequires() const; bool forceResolve() const; bool cleandepsOnRemove() const; bool allowDowngrade() const; bool allowNameChange() const; bool allowArchChange() const; bool allowVendorChange() const; bool dupAllowDowngrade() const; bool dupAllowNameChange() const; bool dupAllowArchChange() const; bool dupAllowVendorChange() const; bool applySetup ( zypp::RepoManager &manager ) const; static bool loadRepo (zypp::RepoManager &manager, const TestcaseSetup &setup, const RepoData &data ); TestcaseSetupImpl &data(); const TestcaseSetupImpl &data() const; private: RWCOW_pointer _pimpl; }; } #endif // ZYPP_MISC_TESTCASESETUPIMPL_H libzypp-17.36.5/zypp/misc/TestcaseSetupImpl.h000066400000000000000000000051041476576476200211420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_MISC_TESTCASESETUPIMPL_H #define ZYPP_MISC_TESTCASESETUPIMPL_H #include #include #include #include #include #include #define ZYPP_USE_RESOLVER_INTERNALS #include namespace zypp::misc::testcase { struct RepoDataImpl { TestcaseRepoType type; std::string alias; uint priority = 99; std::string path; RepoDataImpl *clone () const { return new RepoDataImpl(*this); } }; struct ForceInstallImpl { std::string channel; std::string package; std::string kind; ForceInstallImpl *clone () const { return new ForceInstallImpl(*this); } }; struct TestcaseSetupImpl { Arch architecture = Arch_noarch; std::optional systemRepo; std::vector repos; // solver flags: default to false - set true if mentioned in ResolverFocus resolverFocus = ResolverFocus::Default; Pathname globalPath; Pathname hardwareInfoFile; Pathname systemCheck; target::Modalias::ModaliasList modaliasList; base::SetTracker localesTracker; std::vector> vendorLists; sat::StringQueue autoinstalled; std::set multiversionSpec; std::vector forceInstallTasks; bool set_licence = false; bool show_mediaid = false; bool ignorealreadyrecommended = false; bool onlyRequires = false; bool forceResolve = false; bool cleandepsOnRemove = false; bool allowDowngrade = false; bool allowNameChange = false; bool allowArchChange = false; bool allowVendorChange = false; bool dupAllowDowngrade = false; bool dupAllowNameChange = false; bool dupAllowArchChange = false; bool dupAllowVendorChange = false; TestcaseSetupImpl *clone () const { return new TestcaseSetupImpl(*this); } }; } #endif libzypp-17.36.5/zypp/misc/YamlTestcaseHelpers.h000066400000000000000000000311221476576476200214440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/misc/YamlTestcaseHelpers.h * */ #ifndef ZYPP_MISC_YAMLTESTCASEHELPERS_H #define ZYPP_MISC_YAMLTESTCASEHELPERS_H #include #include "LoadTestcase.h" #include "TestcaseSetupImpl.h" #include #include namespace yamltest::detail { bool parseSetup ( const YAML::Node &setup, zypp::misc::testcase::TestcaseSetup &t, std::string *err ) { auto &target = t.data(); MIL << "Parsing setup node " << std::endl; for ( YAML::const_iterator it = setup.begin(); it != setup.end(); it++ ) { const std::string &key = it->first.as(); const auto &data = it->second; MIL << "Found key " << key << std::endl; // reads a sequence either from a file or inline, depending on the type of "data" auto readListInlineOrFromFile = [&]( const auto &cb , std::string *err ) -> bool { if ( data.Type() == YAML::NodeType::Sequence ) { int cnt = 0; for ( const auto &node: data ) { if ( !cb( node, err ) ) return false; cnt ++; } MIL << "Loaded " << cnt << " Elements inline" << std::endl; } else { const std::string &fName = data.as(); MIL << "Trying to load list from file " << fName << std::endl; try { auto doc = YAML::LoadFile( (target.globalPath / fName).asString() ); if ( doc.Type() != YAML::NodeType::Sequence ) { if ( err ) *err = "Expected the top node to be a sequence in external file for key: "; return false; } int cnt = 0; for ( const auto &node : doc ) { if ( !cb( node, err ) ) return false; cnt ++; } MIL << "Loaded " << cnt << " Elements from file" << std::endl; } catch ( YAML::Exception &e ) { if ( err ) { auto errStr = zypp::str::Str(); errStr << e.what(); if ( !e.mark.is_null() ) { errStr << " Line: " << e.mark.line << " Col: " << e.mark.column << " pos: " << e.mark.pos; } *err = errStr; } return false; } catch ( ... ) { if ( err ) *err = zypp::str::Str() << "Unknown error when parsing the file for " << key; return false; } } return true; }; if ( key == "resolverFlags" ) { #define if_SolverFlag( N ) if ( data[#N] ) { target.N = data[#N].as(); } if_SolverFlag( ignorealreadyrecommended ) if ( data["ignorealready"] ) { target.ignorealreadyrecommended = data["ignorealready"].as(); } if_SolverFlag( onlyRequires ) if ( data["ignorerecommended"] ) { target.onlyRequires = data["ignorerecommended"].as(); } if_SolverFlag( forceResolve ) if_SolverFlag( cleandepsOnRemove ) if_SolverFlag( allowDowngrade ) if_SolverFlag( allowNameChange ) if_SolverFlag( allowArchChange ) if_SolverFlag( allowVendorChange ) if_SolverFlag( dupAllowDowngrade ) if_SolverFlag( dupAllowNameChange ) if_SolverFlag( dupAllowArchChange ) if_SolverFlag( dupAllowVendorChange ) #undef if_SolverFlag if ( data["focus"] ) { target.resolverFocus = zypp::resolverFocusFromString( data["focus"].as() ); } } else if ( key == ("system") ) { target.systemRepo = zypp::misc::testcase::RepoDataImpl { zypp::misc::testcase::TestcaseRepoType::Testtags, "@System", 99, data["file"].as() }; } else if ( key == ("hardwareInfo") ) { target.hardwareInfoFile = data.as(); } else if ( key == ("modalias") ) { bool success = readListInlineOrFromFile( [&target]( const YAML::Node &dataNode, auto ){ target.modaliasList.push_back( dataNode.as() ); return true; }, err ); if ( !success ) return false; } else if ( key == ("multiversion") ) { bool success = readListInlineOrFromFile( [&target]( const YAML::Node &dataNode, auto ){ target.multiversionSpec.insert( dataNode.as() ); return true; }, err ); if ( !success ) return false; } else if (key == ("channels")) { bool success = readListInlineOrFromFile( [&target]( const YAML::Node &dataNode, auto ){ std::string name = dataNode["alias"].as(); std::string file = dataNode["file"].as(); unsigned prio = 99; if ( dataNode["priority"] ) prio = dataNode["priority"].as(); target.repos.push_back( zypp::misc::testcase::RepoDataImpl{ zypp::misc::testcase::TestcaseRepoType::Testtags, name, prio, file }); return true; }, err ); if ( !success ) return false; } else if ( key == ("sources") ) { bool success = readListInlineOrFromFile( [&target]( const YAML::Node &dataNode, auto ){ std::string url = dataNode["url"].as(); std::string alias = dataNode["name"].as(); target.repos.push_back( zypp::misc::testcase::RepoDataImpl{ zypp::misc::testcase::TestcaseRepoType::Url, alias, 99, url }); return true; }, err ); if ( !success ) return false; } else if ( key == ("force-install") ) { bool success = readListInlineOrFromFile( [&target]( const YAML::Node &dataNode, auto ){ target.forceInstallTasks.push_back( zypp::misc::testcase::ForceInstallImpl{ dataNode["channel"].as(), dataNode["package"].as(), dataNode["kind"].as() }); return true; }, err ); if ( !success ) return false; } else if ( key == ("mediaid") ) { target.show_mediaid = data.as(); } else if ( key == ("arch") ) { std::string architecture = data.as(); if ( architecture.empty() ) { if (err) *err = zypp::str::Str() << "Property 'arch' in setup can not be empty." << std::endl; return false; } else { MIL << "Setting architecture to '" << architecture << "'" << std::endl; target.architecture = zypp::Arch( architecture ); } } else if ( key == ("locales") ) { bool success = readListInlineOrFromFile( [&target]( const YAML::Node &dataNode, std::string *err ){ zypp::Locale loc( dataNode["name"].as() ); std::string fate = dataNode["fate"].as(); if ( !loc ) { if (err) *err = zypp::str::Str() << "Bad or missing name in locale..." << std::endl; return false; } else if ( fate == "added" ) { target.localesTracker.added().insert( loc ); } else if ( fate == "removed" ) { target.localesTracker.removed().insert( loc ); } else { target.localesTracker.current().insert( loc ); } return true; }, err ); if ( !success ) return false; } else if ( key == ("vendors") ) { bool success = readListInlineOrFromFile( [&target]( const YAML::Node & dataNode, std::string * err ) { std::vector vlist; for ( const auto & node : dataNode ) vlist.push_back( node.as() ); if ( ! vlist.empty() ) target.vendorLists.push_back( std::move(vlist) ); return true; }, err ); if ( !success ) return false; } else if ( key == ("autoinst") ) { bool success = readListInlineOrFromFile( [&]( const YAML::Node &dataNode, std::string * err ){ target.autoinstalled.push( zypp::IdString( dataNode.as() ).id() ); return true; }, err ); if ( !success ) return false; } else if ( key == ("systemCheck") ) { target.systemCheck = data.as(); } else if ( key == ("setlicencebit") ) { target.set_licence = data.as(); } else { ERR << "Ignoring unrecognized tag '" << key << "' in setup" << std::endl; } } return true; } template bool parseJobs ( const YAML::Node &trial, std::vector &target, const zypp::Pathname &testcaseDir, std::string *err ); template bool parseSingleJob ( const YAML::Node &jobNode, std::vector &target, const zypp::Pathname &testcaseDir, std::string *err ) { constexpr bool isSubNode = std::is_same_v>; if ( jobNode["include"] ) { //handle include const auto &fName = jobNode["include"].as(); MIL << "Including file " << fName << std::endl; try { auto doc = YAML::LoadFile( (testcaseDir / fName).asString() ); if ( !parseJobs( doc, target, testcaseDir, err ) ) return false; MIL << "Including file " << fName << "was successful" << std::endl; } catch ( YAML::Exception &e ) { if ( err ) *err = e.what(); return false; } catch ( ... ) { if ( err ) *err = zypp::str::Str() << "Unknown error when parsing the file: " << fName; return false; } return true; } zypp::misc::testcase::TestcaseTrial::Node n; if ( !jobNode["job"] ) { if ( err ) { auto errStr = zypp::str::Str(); const auto &mark = jobNode.Mark(); errStr << "'job' key missing from trial node."; if ( !mark.is_null() ) { errStr << " Line: " << mark.line << " Col: " << mark.column << " pos: " << mark.pos; } *err = errStr; } return false; } for ( const auto &elem : jobNode ) { const std::string &key = elem.first.as(); const auto &data = elem.second; if ( key == "job" ) { n.name() = data.as(); } else if ( key == "__content") { n.value() = data.as(); } else { if( data.IsScalar() ) { n.properties().insert( { key, data.as() } ); } else if ( data.IsSequence() ) { // if the type of a data field is a sequence, we treat all the elements in there // as sub elements. Just like in XML you can have sub nodes its the same here // the key name is ignored in those cases and can be chosen freely if ( !parseJobs( data, n.children(), testcaseDir, err ) ) return false; } else if ( data.IsMap() ) { // if the type of a data field is a map, we build a child node from it. // Just like with sequence but a single field. // The key name is ignored in those cases and can be chosen freely if ( !parseSingleJob( data, n.children(), testcaseDir, err) ) return false; } else { ERR << "Ignoring field " << key << " with unsupported type:" << data.Type() << std::endl; } } } if constexpr ( isSubNode ) { target.push_back( std::make_shared( std::move(n) ) ); } else { target.push_back( std::move(n) ); } return true; } template bool parseJobs ( const YAML::Node &trial, std::vector &target, const zypp::Pathname &testcaseDir, std::string *err ) { for ( const auto &jobNode : trial ) { if ( !parseSingleJob( jobNode, target, testcaseDir, err ) ) return false; } return true; } bool parseTrial ( const YAML::Node &trial, zypp::misc::testcase::TestcaseTrial &target, const zypp::Pathname &testcaseDir, std::string *err ) { MIL << "Parsing trials." << std::endl; return parseJobs( trial, target.nodes(), testcaseDir, err ); } } #endif // ZYPP_MISC_YAMLTESTCASEHELPERS_H libzypp-17.36.5/zypp/ng/000077500000000000000000000000001476576476200150245ustar00rootroot00000000000000libzypp-17.36.5/zypp/ng/Context000066400000000000000000000000251476576476200163700ustar00rootroot00000000000000#include "context.h" libzypp-17.36.5/zypp/ng/RepoManager000066400000000000000000000000311476576476200171410ustar00rootroot00000000000000#include "repomanager.h" libzypp-17.36.5/zypp/ng/UserRequest000066400000000000000000000000311476576476200172300ustar00rootroot00000000000000#include "userrequest.h" libzypp-17.36.5/zypp/ng/context.cc000066400000000000000000000035641476576476200170270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "private/context_p.h" #include #include #include #include namespace zyppng { ZYPP_IMPL_PRIVATE( Context ) ZYPP_IMPL_PRIVATE_CONSTR( Context ) : UserInterface( *new ContextPrivate( *this ) ) { Z_D(); d->_zyppPtr = zypp::getZYpp(); d->_eventDispatcher = ThreadData::current().ensureDispatcher(); d->_provider = Provide::create( d->_providerDir ); // @TODO should start be implicit as soon as something is enqueued? d->_provider->start(); } ProvideRef Context::provider() const { Z_D(); return d->_provider; } KeyRingRef Context::keyRing() const { return d_func()->_zyppPtr->keyRing(); } zypp::ZConfig &Context::config() { return zypp::ZConfig::instance(); } zypp::ResPool Context::pool() { return zypp::ResPool::instance(); } zypp::ResPoolProxy Context::poolProxy() { return zypp::ResPool::instance().proxy(); } zypp::sat::Pool Context::satPool() { return zypp::sat::Pool::instance(); } void Context::executeImpl(const AsyncOpBaseRef& op) { auto loop = EventLoop::create(); op->sigReady().connect([&](){ loop->quit(); }); loop->run(); return; } } libzypp-17.36.5/zypp/ng/context.h000066400000000000000000000044571476576476200166730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_CONTEXT_INCLUDED #define ZYPP_NG_CONTEXT_INCLUDED #include #include #include #include namespace zypp { DEFINE_PTR_TYPE(KeyRing); class ZConfig; } namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS( Context ); ZYPP_FWD_DECL_TYPE_WITH_REFS( ProgressObserver ); ZYPP_FWD_DECL_TYPE_WITH_REFS( Provide ); using KeyRing = zypp::KeyRing; using KeyRingRef = zypp::KeyRing_Ptr; class ContextPrivate; /*! * The Context class is the central object of libzypp, carrying all state that is * required to manage the system. */ class Context : public UserInterface { ZYPP_DECLARE_PRIVATE(Context) ZYPP_ADD_CREATE_FUNC(Context) public: using ProvideType = Provide; ZYPP_DECL_PRIVATE_CONSTR(Context); template void execute ( AsyncOpRef op ) { if ( op->isReady () ) return; return executeImpl( op ); } ProvideRef provider() const; KeyRingRef keyRing () const; zypp::ZConfig &config(); /** * Access to the resolvable pool. */ zypp::ResPool pool(); /** Pool of ui::Selectable. * Based on the ResPool, ui::Selectable groups ResObjetcs of * same kind and name. */ zypp::ResPoolProxy poolProxy(); /** * Access to the sat pool. */ zypp::sat::Pool satPool(); private: void executeImpl ( const AsyncOpBaseRef& op ); }; template auto joinPipeline( ContextRef ctx, AsyncOpRef res ) { if constexpr ( detail::is_async_op_v ) { ctx->execute(res); return res->get(); } else { return res; } } } #endif libzypp-17.36.5/zypp/ng/private/000077500000000000000000000000001476576476200164765ustar00rootroot00000000000000libzypp-17.36.5/zypp/ng/private/context_p.h000066400000000000000000000022711476576476200206540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_PRIVATE_CONTEXT_P_H #define ZYPP_NG_PRIVATE_CONTEXT_P_H #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS ( EventDispatcher ); class ContextPrivate : public UserInterfacePrivate { public: ContextPrivate ( Context &b ) : UserInterfacePrivate(b){} EventDispatcherRef _eventDispatcher; zypp::filesystem::TmpDir _providerDir; ProvideRef _provider; zypp::ZYpp::Ptr _zyppPtr; }; } #endif libzypp-17.36.5/zypp/ng/private/repomanager_p.h000066400000000000000000000026661476576476200215000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_PRIVATE_REPOMANAGER_P_H #define ZYPP_NG_PRIVATE_REPOMANAGER_P_H #include #include #include namespace zyppng { class ZYPP_LOCAL RepoManagerPrivate : public BasePrivate, public zypp::RepoManagerBaseImpl { ZYPP_DECLARE_PUBLIC(RepoManager) public: RepoManagerPrivate( ContextRef ctx, RepoManagerOptions repoOpts, RepoManager &p ); AsyncOpRef> probe( const zypp::Url & url, const zypp::Pathname & path = zypp::Pathname() ) const; ContextWeakRef _context; //< weak ref to our context to prevent a ref loop, this should always be valid // RepoManagerBaseImpl interface public: void removeRepository(const zypp::RepoInfo &info, const zypp::ProgressData::ReceiverFnc &) override; }; } #endif libzypp-17.36.5/zypp/ng/progressobserveradaptor.cc000066400000000000000000000042151476576476200223240ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "progressobserveradaptor.h" namespace zyppng { void ProgressObserverAdaptor::init() { _observer = ProgressObserver::create(); _observer->connectFunc( &ProgressObserver::sigStarted, [this](auto &obs) { update(); }, *_observer); _observer->connectFunc( &ProgressObserver::sigLabelChanged, [this](auto &obs, const auto &) { if(!_first) update(); }, *_observer); _observer->connectFunc( &ProgressObserver::sigProgressChanged, [this](auto &obs, const auto &p) { update(); }, *_observer); _observer->connectFunc( &ProgressObserver::sigFinished, [this](auto &obs, const auto &) { update(true); }, *_observer); } ProgressObserverAdaptor::ProgressObserverAdaptor( zypp::callback::SendReport &report) : _report(report) { init(); } ProgressObserverAdaptor::ProgressObserverAdaptor( const zypp::ProgressData::ReceiverFnc &fnc, zypp::callback::SendReport &report) : _fnc(fnc), _report(report) { init(); } ProgressObserverRef ProgressObserverAdaptor::observer() { return _observer; } bool ProgressObserverAdaptor::update(bool fin) { zypp::ProgressData progress(0, 100, _observer->progress()); progress.name(_observer->label()); if (_first) { _report->start(progress); _first = false; } bool value = _report->progress(progress); if (_fnc) value &= _fnc(progress); if (fin) { _report->finish(progress); } return value; } } // namespace zyppng libzypp-17.36.5/zypp/ng/progressobserveradaptor.h000066400000000000000000000025311476576476200221650ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_PROGRESSOBSERVERADAPTOR_INCLUDED #define ZYPP_NG_PROGRESSOBSERVERADAPTOR_INCLUDED #include #include namespace zyppng { struct ProgressObserverAdaptor { ProgressObserverAdaptor( zypp::callback::SendReport &report ); ProgressObserverAdaptor( const zypp::ProgressData::ReceiverFnc &fnc, zypp::callback::SendReport &report ); ProgressObserverRef observer(); private: void init(); bool update(bool fin = false); ProgressObserverRef _observer; zypp::ProgressData::ReceiverFnc _fnc; zypp::callback::SendReport &_report; bool _first = true; }; } #endif // ZYPP_NG_PROGRESSOBSERVERADAPTOR_INCLUDED libzypp-17.36.5/zypp/ng/repo/000077500000000000000000000000001476576476200157715ustar00rootroot00000000000000libzypp-17.36.5/zypp/ng/repo/Downloader000066400000000000000000000000301476576476200200030ustar00rootroot00000000000000#include "downloader.h" libzypp-17.36.5/zypp/ng/repo/Refresh000066400000000000000000000000251476576476200173070ustar00rootroot00000000000000#include "refresh.h" libzypp-17.36.5/zypp/ng/repo/downloader.cc000066400000000000000000000047161476576476200204460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "downloader.h" #include #include #include #include #include #include #include #include #include #include #include namespace zyppng::repo { using namespace zyppng::operators; template DownloadContext::DownloadContext(ContextRefType zyppContext, const zypp::RepoInfo &info, const zypp::Pathname &destDir ) : CacheProviderContext( typename CacheProviderContext::private_constr_t{}, std::move(zyppContext), destDir ) , _repoinfo(info) {} template const zypp::RepoInfo &DownloadContext::repoInfo() const { return _repoinfo; } template const zypp::filesystem::Pathname &DownloadContext::deltaDir() const { return _deltaDir; } template zypp::RepoInfo &DownloadContext::repoInfo() { return _repoinfo; } template std::vector &DownloadContext::files() { return _files; } template const std::optional::PluginRepoverification> &DownloadContext::pluginRepoverification() const { return _pluginRepoverification; } template void DownloadContext::setDeltaDir(const zypp::Pathname &newDeltaDir) { _deltaDir = newDeltaDir; } // explicitely intantiate the template types we want to work with template class DownloadContext; template class DownloadContext; } libzypp-17.36.5/zypp/ng/repo/downloader.h000066400000000000000000000054051476576476200203040ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_REPO_DOWNLOADER_INCLUDED #define ZYPP_NG_REPO_DOWNLOADER_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS( Context ); ZYPP_FWD_DECL_TYPE_WITH_REFS( SyncContext ); } namespace zyppng::repo { template class DownloadContext : public CacheProviderContext { public: using PluginRepoverification = zypp_private::repo::PluginRepoverification; using ContextType = typename ContextRefType::element_type; using ProvideType = typename ContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; DownloadContext( ContextRefType zyppContext, const zypp::RepoInfo &info, const zypp::Pathname &destDir ); const zypp::RepoInfo &repoInfo () const; const zypp::Pathname &deltaDir () const; zypp::RepoInfo &repoInfo(); std::vector &files(); const std::optional &pluginRepoverification() const; void setPluginRepoverification( std::optional pluginRepoverification_r ) { _pluginRepoverification = std::move(pluginRepoverification_r); } void setNoPluginRepoverification() { setPluginRepoverification( std::nullopt ); } void setDeltaDir(const zypp::Pathname &newDeltaDir); private: zypp::RepoInfo _repoinfo; zypp::Pathname _deltaDir; std::vector _files; ///< Files downloaded std::optional _pluginRepoverification; ///< \see \ref plugin-repoverification }; using SyncDownloadContext = DownloadContext; using AsyncDownloadContext = DownloadContext; ZYPP_FWD_DECL_REFS(SyncDownloadContext); ZYPP_FWD_DECL_REFS(AsyncDownloadContext); } #endif libzypp-17.36.5/zypp/ng/repo/refresh.cc000066400000000000000000000131361476576476200177420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "refresh.h" #include #include #include #include #include namespace zyppng::repo { template RefreshContext::RefreshContext( private_constr_t, ZyppContextRefType &&zyppContext, zypp::RepoInfo &&info, zypp::Pathname &&rawCachePath, zypp::filesystem::TmpDir &&tempDir, RepoManagerRef &&repoManager ) : _zyppContext( std::move(zyppContext) ) , _repoManager( std::move(repoManager) ) , _repoInfo( std::move(info) ) , _rawCachePath( std::move(rawCachePath) ) , _tmpDir( std::move(tempDir) ) { if ( _repoManager->pluginRepoverification().checkIfNeeded() ) _pluginRepoverification = _repoManager->pluginRepoverification(); } template expected> RefreshContext::create( ZyppContextRefType zyppContext, zypp::RepoInfo info, RepoManagerRef repoManager ) { using namespace operators; using CtxType = RefreshContext; using CtxRefType = RefreshContextRef; return rawcache_path_for_repoinfo ( repoManager->options(), info ) | and_then( [&]( zypp::Pathname rawCachePath ) { zypp::filesystem::TmpDir tmpdir( zypp::filesystem::TmpDir::makeSibling( rawCachePath, 0755 ) ); if( tmpdir.path().empty() && geteuid() != 0 ) { tmpdir = zypp::filesystem::TmpDir(); // non-root user may not be able to write the cache } if( tmpdir.path().empty() ) { return expected::error( ZYPP_EXCPT_PTR(zypp::Exception(_("Can't create metadata cache directory."))) ); } MIL << "Creating RefreshContext " << std::endl; return expected::success( std::make_shared( private_constr_t{} , std::move(zyppContext) , std::move(info) , std::move(rawCachePath) , std::move(tmpdir) , std::move(repoManager))); } ); } template RefreshContext::~RefreshContext() { MIL << "Deleting RefreshContext" << std::endl; } template void RefreshContext::saveToRawCache() { zypp::filesystem::exchange( _tmpDir.path(), _rawCachePath ); } template const zypp::Pathname &RefreshContext::rawCachePath() const { return _rawCachePath; } template zypp::Pathname RefreshContext::targetDir() const { return _tmpDir.path(); } template const ZyppContextRefType &RefreshContext::zyppContext() const { return _zyppContext; } template const zypp::RepoInfo &RefreshContext::repoInfo() const { return _repoInfo; } template zypp::RepoInfo &RefreshContext::repoInfo() { return _repoInfo; } template const RepoManagerRef &RefreshContext::repoManager() const { return _repoManager; } template const zypp::RepoManagerOptions &RefreshContext::repoManagerOptions() const { return _repoManager->options(); } template repo::RawMetadataRefreshPolicy RefreshContext::policy() const { return _policy; } template void RefreshContext::setPolicy(RawMetadataRefreshPolicy newPolicy) { _policy = newPolicy; } template const std::optional::PluginRepoverification> &RefreshContext::pluginRepoverification() const { return _pluginRepoverification; } template void RefreshContext::setProbedType(zypp::repo::RepoType rType) { if ( _probedType && *_probedType == rType ) return; _probedType = rType; _sigProbedTypeChanged.emit(rType); } template const std::optional &RefreshContext::probedType() const { return _probedType; } template SignalProxy RefreshContext::sigProbedTypeChanged() { return _sigProbedTypeChanged; } // explicitely intantiate the template types we want to work with template class RefreshContext; template class RefreshContext; } libzypp-17.36.5/zypp/ng/repo/refresh.h000066400000000000000000000134161476576476200176050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_REPO_REFRESH_INCLUDED #define ZYPP_NG_REPO_REFRESH_INCLUDED #include #include #include #include #include #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS( Context ); ZYPP_FWD_DECL_TYPE_WITH_REFS( SyncContext ); } namespace zyppng::repo { ZYPP_FWD_DECL_TEMPL_TYPE_WITH_REFS_ARG1 (RefreshContext, ZyppContextRefType); using RawMetadataRefreshPolicy = zypp::RepoManagerFlags::RawMetadataRefreshPolicy; using RefreshCheckStatus = zypp::RepoManagerFlags::RefreshCheckStatus; /*! * * Context class for all refresh workflow operations of a repo, operating * on a local cache and a remote repository, as defined by the \ref zypp::RepoInfo * */ template class RefreshContext : public Base, public MaybeAsyncMixin< std::is_same_v > { ZYPP_ADD_PRIVATE_CONSTR_HELPER(); ZYPP_ENABLE_MAYBE_ASYNC_MIXIN( (std::is_same_v) ); public: using ContextRefType = ZyppContextRefType; using ContextType = typename ZyppContextRefType::element_type; using ProvideType = typename ContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using PluginRepoverification = zypp_private::repo::PluginRepoverification; static expected> create( ZyppContextRefType zyppContext, zypp::RepoInfo info, RepoManagerRef repoManager ); ZYPP_DECL_PRIVATE_CONSTR_ARGS(RefreshContext, ZyppContextRefType &&zyppContext, zypp::RepoInfo &&info, zypp::Pathname &&rawCachePath, zypp::filesystem::TmpDir &&tempDir, RepoManagerRef &&repoManager ); ~RefreshContext() override; /*! * Commits the internal temporary cache into the raw cache * of the \ref zypp::RepoInfo this context is currently operating * on. */ void saveToRawCache(); /*! * The raw cache path belonging to this context's \ref zypp::RepoInfo */ const zypp::Pathname &rawCachePath() const; /*! * The current temporary target dir where the refresh workflow is * storing the metadata during operation. Once we have a finished * set of metadata and cache we exchange it with the rawCache */ zypp::Pathname targetDir() const; /*! * Current zypp context we are working on, either \ref zyppng::Context * or \ref zyppng::SyncContext. */ const ZyppContextRefType &zyppContext () const; /*! * Current \ref zypp::RepoInfo this refresh context is operating with, * the workflow is free to change data in this \ref zypp::RepoInfo , so calling * code should take care to use it once the workflow has finished. */ const zypp::RepoInfo &repoInfo () const; zypp::RepoInfo &repoInfo (); /*! * Reference to the \ref zyppng::RepoManager that initiated the refresh */ const RepoManagerRef &repoManager() const; const zypp::RepoManagerOptions &repoManagerOptions() const; /*! * The refresh policy, defines wether a refresh is forced, or only done if needed. */ RawMetadataRefreshPolicy policy() const; void setPolicy(RawMetadataRefreshPolicy newPolicy); /*! * Optional repo verification via a plugin */ const std::optional &pluginRepoverification() const; void setPluginRepoverification( std::optional pluginRepoverification_r ) { _pluginRepoverification = std::move(pluginRepoverification_r); } /*! * Disabled plugin based repo verification */ void setNoPluginRepoverification() { setPluginRepoverification( std::nullopt ); } /*! * Updated the probed repo type in \ref zypp::RepoInfo, calling code should * take care to fetch the updated one at the end of the refresh workflow. */ void setProbedType( zypp::repo::RepoType rType ); const std::optional &probedType() const; SignalProxy sigProbedTypeChanged(); private: ZyppContextRefType _zyppContext; RepoManagerRef _repoManager; zypp::RepoInfo _repoInfo; zypp::Pathname _rawCachePath; zypp::filesystem::TmpDir _tmpDir; repo::RawMetadataRefreshPolicy _policy = RawMetadataRefreshPolicy::RefreshIfNeeded; std::optional _pluginRepoverification; ///< \see \ref plugin-repoverification std::optional _probedType; Signal _sigProbedTypeChanged; }; using SyncRefreshContext = RefreshContext; using AsyncRefreshContext = RefreshContext; ZYPP_FWD_DECL_REFS(SyncRefreshContext); ZYPP_FWD_DECL_REFS(AsyncRefreshContext); } #endif libzypp-17.36.5/zypp/ng/repo/workflows/000077500000000000000000000000001476576476200200265ustar00rootroot00000000000000libzypp-17.36.5/zypp/ng/repo/workflows/plaindir.cc000066400000000000000000000107351476576476200221450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "plaindir.h" #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" namespace zyppng::PlaindirWorkflows { namespace { template auto statusLogic( DlContextRefType &&ctx, MediaHandle mediaHandle ) { constexpr bool isAsync = std::is_same_v; // this can only happen if this function is called with a non mounting medium, but those do not support plaindir anyway if ( !mediaHandle.localPath().has_value() ) { return makeReadyResult, isAsync>( expected::error( ZYPP_EXCPT_PTR( zypp::Exception("Medium does not support plaindir") )) ); } // dir status const auto &repoInfo = std::forward(ctx)->repoInfo(); auto rStatus = zypp::RepoStatus( repoInfo ) && zypp::RepoStatus( mediaHandle.localPath().value() / repoInfo.path() ); return makeReadyResult, isAsync> ( expected::success(std::move(rStatus)) ); } } AsyncOpRef > repoStatus(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle) { return statusLogic( std::move(dl), std::move(mediaHandle) ); } expected repoStatus(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle) { return statusLogic( std::move(dl), std::move(mediaHandle) ); } namespace { template auto dlLogic( DlContextRefType &&ctx, MediaHandle mediaHandle, ProgressObserverRef progressObserver ) { constexpr bool isAsync = std::is_same_v; using Ret = expected; try { // this can only happen if this function is called with a non mounting medium, but those do not support plaindir anyway if ( !mediaHandle.localPath().has_value() ) { return makeReadyResult( Ret::error( ZYPP_EXCPT_PTR( zypp::Exception("Medium does not support plaindir") )) ); } if ( progressObserver ) progressObserver->inc(); // as substitute for real metadata remember the checksum of the directory we refreshed const auto &repoInfo = std::forward(ctx)->repoInfo(); auto newstatus = zypp::RepoStatus( mediaHandle.localPath().value() / repoInfo.path() ); // dir status zypp::Pathname productpath( std::forward(ctx)->destDir() / repoInfo.path() ); zypp::filesystem::assert_dir( productpath ); newstatus.saveToCookieFile( productpath/"cookie" ); if ( progressObserver ) progressObserver->setFinished(); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); return makeReadyResult( Ret::error( ZYPP_FWD_CURRENT_EXCPT() ) ); } catch ( ... ) { return makeReadyResult( Ret::error( ZYPP_FWD_CURRENT_EXCPT() ) ); } return makeReadyResult( Ret::success( std::forward(ctx) ) ); } } AsyncOpRef > download(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return dlLogic( std::move(dl), std::move(mediaHandle), std::move(progressObserver) ); } expected download(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return dlLogic( std::move(dl), std::move(mediaHandle), std::move(progressObserver) ); } } libzypp-17.36.5/zypp/ng/repo/workflows/plaindir.h000066400000000000000000000031671476576476200220100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_PLAINDIR_WORKFLOW_INCLUDED #define ZYPP_NG_PLAINDIR_WORKFLOW_INCLUDED #include #include #include #include #include namespace zyppng { class ProvideMediaHandle; class SyncMediaHandle; ZYPP_FWD_DECL_TYPE_WITH_REFS( ProgressObserver ); namespace PlaindirWorkflows { AsyncOpRef> repoStatus( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle ); expected repoStatus( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle ); AsyncOpRef> download ( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); expected download ( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); } } #endif // ZYPP_NG_PLAINDIR_WORKFLOW_INCLUDED libzypp-17.36.5/zypp/ng/repo/workflows/repodownloaderwf.cc000066400000000000000000000511301476576476200237160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "repodownloaderwf.h" #include #include "zypp/parser/yum/RepomdFileReader.h" #include #include #include #include #include #include #include #include #include #include #include // sync workflow helpers #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" namespace zyppng { namespace { using namespace zyppng::operators; template < class Executor, class OpType > struct DownloadMasterIndexLogic : public LogicBase { public: ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); using DlContextRefType = std::conditional_t, repo::AsyncDownloadContextRef, repo::SyncDownloadContextRef>; using ZyppContextType = typename remove_smart_ptr_t::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; DownloadMasterIndexLogic( DlContextRefType &&ctxRef, MediaHandle &&mediaHandle, zypp::filesystem::Pathname &&masterIndex_r ) : _dlContext( std::move(ctxRef) ) , _media(std::move( mediaHandle )) , _masterIndex(std::move( masterIndex_r )) { } public: MaybeAsyncRef> execute( ) { // always download them, even if repoGpgCheck is disabled _sigpath = _masterIndex.extend( ".asc" ); _keypath = _masterIndex.extend( ".key" ); _destdir = _dlContext->destDir(); auto providerRef = _dlContext->zyppContext()->provider(); return provider()->provide( _media, _masterIndex, ProvideFileSpec().setDownloadSize( zypp::ByteCount( 20, zypp::ByteCount::MB ) ) ) | and_then( [this]( ProvideRes && masterres ) { return std::vector { // fetch signature and keys provider()->provide( _media, _sigpath, ProvideFileSpec().setOptional( true ).setDownloadSize( zypp::ByteCount( 20, zypp::ByteCount::MB ) ) ) | and_then( ProvideType::copyResultToDest ( provider(), _destdir / _sigpath ) ), provider()->provide( _media, _keypath, ProvideFileSpec().setOptional( true ).setDownloadSize( zypp::ByteCount( 20, zypp::ByteCount::MB ) ) ) | and_then( ProvideType::copyResultToDest ( provider(), _destdir / _keypath ) ), } | join() | [this,masterres=std::move(masterres)]( std::vector> &&res ) { // remember downloaded files std::for_each( res.begin (), res.end(), [this]( expected &f){ if (f.is_valid () ) { _dlContext->files().push_back( std::move(f.get())); } }); return make_expected_success( std::move(masterres) ); }; } ) // execute plugin verification if there is one | and_then( std::bind( &DownloadMasterIndexLogic::pluginVerification, this, std::placeholders::_1 ) ) // signature checking | and_then( std::bind( &DownloadMasterIndexLogic::signatureCheck, this, std::placeholders::_1 ) ) // copy everything into a directory | and_then( ProvideType::copyResultToDest ( providerRef, _destdir / _masterIndex ) ) // final tasks | and_then([this]( zypp::ManagedFile &&masterIndex ) { // Accepted! _dlContext->repoInfo().setMetadataPath( _destdir ); _dlContext->repoInfo().setValidRepoSignature( _repoSigValidated ); // release the media handle _media = MediaHandle(); auto &allFiles = _dlContext->files(); // make sure the masterIndex is in front allFiles.insert( allFiles.begin (), std::move(masterIndex) ); return make_expected_success( std::move(_dlContext) ); }); } private: auto provider () { return _dlContext->zyppContext()->provider(); } MaybeAsyncRef> signatureCheck ( ProvideRes &&res ) { if ( _dlContext->repoInfo().repoGpgCheck() ) { // The local files are in destdir_r, if they were present on the server zypp::Pathname sigpathLocal { _destdir/_sigpath }; zypp::Pathname keypathLocal { _destdir/_keypath }; bool isSigned = zypp::PathInfo(sigpathLocal).isExist(); if ( isSigned || _dlContext->repoInfo().repoGpgCheckIsMandatory() ) { auto verifyCtx = zypp::keyring::VerifyFileContext( res.file() ); // only add the signature if it exists if ( isSigned ) verifyCtx.signature( sigpathLocal ); // only add the key if it exists if ( zypp::PathInfo(keypathLocal).isExist() ) { try { _dlContext->zyppContext()->keyRing()->importKey( zypp::PublicKey(keypathLocal), false ); } catch (...) { return makeReadyResult( expected::error( ZYPP_FWD_CURRENT_EXCPT() ) ); } } // set the checker context even if the key is not known // (unsigned repo, key file missing; bnc #495977) verifyCtx.keyContext( _dlContext->repoInfo() ); return getExtraKeysInRepomd( std::move(res ) ) | and_then([this, vCtx = std::move(verifyCtx) ]( ProvideRes &&res ) mutable { for ( const auto &keyData : _buddyKeys ) { DBG << "Keyhint remember buddy " << keyData << std::endl; vCtx.addBuddyKey( keyData.id() ); } return SignatureFileCheckWorkflow::verifySignature( _dlContext->zyppContext(), std::move(vCtx)) | and_then([ this, res = std::move(res) ]( zypp::keyring::VerifyFileContext verRes ){ // remember the validation status _repoSigValidated = verRes.fileValidated(); return make_expected_success(std::move(res)); }); }); } else { WAR << "Accept unsigned repository because repoGpgCheck is not mandatory for " << _dlContext->repoInfo().alias() << std::endl; } } else { WAR << "Signature checking disabled in config of repository " << _dlContext->repoInfo().alias() << std::endl; } return makeReadyResult(expected::success(res)); } // execute the repo verification if there is one expected pluginVerification ( ProvideRes &&prevRes ) { // The local files are in destdir_r, if they were present on the server zypp::Pathname sigpathLocal { _destdir/_sigpath }; zypp::Pathname keypathLocal { _destdir/_keypath }; if ( _dlContext->pluginRepoverification() && _dlContext->pluginRepoverification()->isNeeded() ) { try { _dlContext->pluginRepoverification()->getChecker( sigpathLocal, keypathLocal, _dlContext->repoInfo() )( prevRes.file() ); } catch ( ... ) { return expected::error( std::current_exception () ); } } return make_expected_success(std::move(prevRes)); } /*! * Returns a sync or async expected result depending on the * implementation class. */ MaybeAsyncRef> getExtraKeysInRepomd ( ProvideRes &&res ) { if ( _masterIndex.basename() != "repomd.xml" ) { return makeReadyResult( expected::success( std::move(res) ) ); } std::vector> keyhints { zypp::parser::yum::RepomdFileReader(res.file()).keyhints() }; if ( keyhints.empty() ) return makeReadyResult( expected::success( std::move(res) ) ); DBG << "Check keyhints: " << keyhints.size() << std::endl; auto keyRing { _dlContext->zyppContext()->keyRing() }; return zypp::parser::yum::RepomdFileReader(res.file()).keyhints() | transform([this, keyRing]( std::pair val ) { const auto& [ file, keyid ] = val; auto keyData = keyRing->trustedPublicKeyData( keyid ); if ( keyData ) { DBG << "Keyhint is already trusted: " << keyid << " (" << file << ")" << std::endl; return makeReadyResult ( expected::success(keyData) ); // already a trusted key } DBG << "Keyhint search key " << keyid << " (" << file << ")" << std::endl; keyData = keyRing->publicKeyData( keyid ); if ( keyData ) return makeReadyResult( expected::success(keyData) ); // TODO: Enhance the key caching in general... const zypp::ZConfig & conf = _dlContext->zyppContext()->config(); zypp::Pathname cacheFile = conf.repoManagerRoot() / conf.pubkeyCachePath() / file; return zypp::PublicKey::noThrow(cacheFile) | [ keyid = keyid ]( auto &&key ){ if ( key.fileProvidesKey( keyid ) ) return make_expected_success( std::forward(key) ); else return expected::error( std::make_exception_ptr (zypp::Exception("File does not provide key"))); } | or_else ([ this, file = file, keyid = keyid, cacheFile ] ( auto ) mutable -> MaybeAsyncRef> { auto providerRef = _dlContext->zyppContext()->provider(); return providerRef->provide( _media, file, ProvideFileSpec().setOptional(true) ) | and_then( ProvideType::copyResultToDest( providerRef, _destdir / file ) ) | and_then( [this, providerRef, file, keyid , cacheFile = std::move(cacheFile)]( zypp::ManagedFile &&res ) { // remember we downloaded the file _dlContext->files().push_back ( std::move(res) ); auto key = zypp::PublicKey::noThrow( _dlContext->files().back() ); if ( not key.fileProvidesKey( keyid ) ) { const std::string str = (zypp::str::Str() << "Keyhint " << file << " does not contain a key with id " << keyid << ". Skipping it."); WAR << str << std::endl; return makeReadyResult(expected::error( std::make_exception_ptr( zypp::Exception(str)) )); } // Try to cache it... zypp::filesystem::assert_dir( cacheFile.dirname() ); return providerRef->copyFile( key.path(), cacheFile ) | [ key ]( expected res ) mutable { if ( res ) { // do not delete from cache res->resetDispose (); } return expected::success( std::move(key) ); }; }); }) | and_then( [ keyRing, keyid = keyid ]( zypp::PublicKey key ){ keyRing->importKey( key, false ); // store in general keyring (not trusted!) return expected::success(keyRing->publicKeyData( keyid )); // fetch back from keyring in case it was a hidden key }); }) | [this, res = res] ( std::vector> &&keyHints ) mutable { std::for_each( keyHints.begin(), keyHints.end(), [this]( expected &keyData ){ if ( keyData && *keyData ) { if ( not zypp::PublicKey::isSafeKeyId( keyData->id() ) ) { WAR << "Keyhint " << keyData->id() << " for " << *keyData << " is not strong enough for auto import. Just caching it." << std::endl; return; } _buddyKeys.push_back ( std::move(keyData.get()) ); } }); MIL << "Check keyhints done. Buddy keys: " << _buddyKeys.size() << std::endl; return expected::success (std::move(res)); }; } DlContextRefType _dlContext; MediaHandle _media; zypp::Pathname _masterIndex; zypp::Pathname _destdir; zypp::Pathname _sigpath; zypp::Pathname _keypath; zypp::TriBool _repoSigValidated = zypp::indeterminate; std::vector _buddyKeys; }; } AsyncOpRef > RepoDownloaderWorkflow::downloadMasterIndex(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, zypp::Pathname masterIndex_r) { return SimpleExecutor>>::run( std::move(dl), std::move(mediaHandle), std::move(masterIndex_r) ); } expected RepoDownloaderWorkflow::downloadMasterIndex(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, zypp::Pathname masterIndex_r) { return SimpleExecutor>>::run( std::move(dl), std::move(mediaHandle), std::move(masterIndex_r) ); } AsyncOpRef> RepoDownloaderWorkflow::downloadMasterIndex ( repo::AsyncDownloadContextRef dl, AsyncLazyMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r ) { using namespace zyppng::operators; return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle ) | and_then([ dl, mi = std::move(masterIndex_r) ]( ProvideMediaHandle handle ) mutable { return downloadMasterIndex( std::move(dl), std::move(handle), std::move(mi) ); }); } expected RepoDownloaderWorkflow::downloadMasterIndex ( repo::SyncDownloadContextRef dl, SyncLazyMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r ) { using namespace zyppng::operators; return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle ) | and_then([ dl, mi = std::move(masterIndex_r) ]( SyncMediaHandle handle ) mutable { return downloadMasterIndex( std::move(dl), std::move(handle), std::move(mi) ); }); } namespace { template auto statusImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle ) { constexpr bool isAsync = std::is_same_v; const auto finalizeStatus = [ dlCtx ]( zypp::RepoStatus status ){ return expected::success( zypp::RepoStatus( dlCtx->repoInfo()) && status ); }; switch( dlCtx->repoInfo().type().toEnum()) { case zypp::repo::RepoType::RPMMD_e: return RpmmdWorkflows::repoStatus( dlCtx, std::forward(mediaHandle) ) | and_then( std::move(finalizeStatus) ); case zypp::repo::RepoType::YAST2_e: return SuseTagsWorkflows::repoStatus( dlCtx, std::forward(mediaHandle) ) | and_then( std::move(finalizeStatus) ); case zypp::repo::RepoType::RPMPLAINDIR_e: return PlaindirWorkflows::repoStatus ( dlCtx, std::forward(mediaHandle) ) | and_then( std::move(finalizeStatus) ); case zypp::repo::RepoType::NONE_e: break; } return makeReadyResult, isAsync >( expected::error( ZYPP_EXCPT_PTR (zypp::repo::RepoUnknownTypeException(dlCtx->repoInfo()))) ); } } AsyncOpRef > RepoDownloaderWorkflow::repoStatus(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle) { return statusImpl( dl, std::move(mediaHandle) ); } expected RepoDownloaderWorkflow::repoStatus(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle) { return statusImpl( dl, std::move(mediaHandle) ); } AsyncOpRef > RepoDownloaderWorkflow::repoStatus( repo::AsyncDownloadContextRef dl, AsyncLazyMediaHandle mediaHandle ) { using namespace zyppng::operators; return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle ) | and_then([ dl ]( ProvideMediaHandle handle ) { return repoStatus( dl, std::move(handle) ); }); } expected RepoDownloaderWorkflow::repoStatus( repo::SyncDownloadContextRef dl, SyncLazyMediaHandle mediaHandle ) { using namespace zyppng::operators; return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle ) | and_then([ dl ]( SyncMediaHandle handle ) { return repoStatus( dl, std::move(handle) ); }); } namespace { template auto downloadImpl ( DlContextRefType dlCtx, MediaHandleType &&mediaHandle, ProgressObserverRef &&progressObserver ) { constexpr bool isAsync = std::is_same_v; switch( dlCtx->repoInfo().type().toEnum()) { case zypp::repo::RepoType::RPMMD_e: return RpmmdWorkflows::download( std::move(dlCtx), std::forward(mediaHandle), std::move(progressObserver) ); case zypp::repo::RepoType::YAST2_e: return SuseTagsWorkflows::download( std::move(dlCtx), std::forward(mediaHandle), std::move(progressObserver) ); case zypp::repo::RepoType::RPMPLAINDIR_e: return PlaindirWorkflows::download ( std::move(dlCtx), std::forward(mediaHandle) ); case zypp::repo::RepoType::NONE_e: break; } return makeReadyResult, isAsync >( expected::error( ZYPP_EXCPT_PTR (zypp::repo::RepoUnknownTypeException(dlCtx->repoInfo()))) ); } } AsyncOpRef > RepoDownloaderWorkflow::download(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) ); } expected RepoDownloaderWorkflow::download(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return downloadImpl( dl, std::move(mediaHandle), std::move(progressObserver) ); } AsyncOpRef > RepoDownloaderWorkflow::download(repo::AsyncDownloadContextRef dl, AsyncLazyMediaHandle mediaHandle, ProgressObserverRef progressObserver) { using namespace zyppng::operators; return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle ) | and_then([ dl, po = std::move(progressObserver) ]( ProvideMediaHandle handle ) mutable { return downloadImpl( dl, std::move(handle), std::move(po) ); }); } expected RepoDownloaderWorkflow::download(repo::SyncDownloadContextRef dl, SyncLazyMediaHandle mediaHandle, ProgressObserverRef progressObserver) { using namespace zyppng::operators; return dl->zyppContext()->provider()->attachMediaIfNeeded( mediaHandle ) | and_then([ dl, po = std::move(progressObserver) ]( SyncMediaHandle handle ) mutable { return downloadImpl( dl, std::move(handle), std::move(po) ); }); } } libzypp-17.36.5/zypp/ng/repo/workflows/repodownloaderwf.h000066400000000000000000000100131476576476200235530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_REPODOWNLOADER_WORKFLOW_INCLUDED #define ZYPP_NG_REPODOWNLOADER_WORKFLOW_INCLUDED #include #include #include #include #include #include #include #include #include namespace zyppng { class Provide; class MediaSyncFacade; class ProvideMediaHandle; class SyncMediaHandle; using AsyncLazyMediaHandle = LazyMediaHandle; using SyncLazyMediaHandle = LazyMediaHandle; namespace RepoDownloaderWorkflow { AsyncOpRef> downloadMasterIndex ( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r ); AsyncOpRef> downloadMasterIndex ( repo::AsyncDownloadContextRef dl, AsyncLazyMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r ); expected downloadMasterIndex ( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r ); expected downloadMasterIndex ( repo::SyncDownloadContextRef dl, SyncLazyMediaHandle mediaHandle, zypp::filesystem::Pathname masterIndex_r ); AsyncOpRef> repoStatus( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle ); AsyncOpRef > repoStatus( repo::AsyncDownloadContextRef dl, AsyncLazyMediaHandle mediaHandle ); expected repoStatus( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle ); expected repoStatus( repo::SyncDownloadContextRef dl, SyncLazyMediaHandle mediaHandle ); AsyncOpRef> download ( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); AsyncOpRef > download(repo::AsyncDownloadContextRef dl, AsyncLazyMediaHandle mediaHandle, ProgressObserverRef progressObserver); expected download ( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); expected download(repo::SyncDownloadContextRef dl, SyncLazyMediaHandle mediaHandle, ProgressObserverRef progressObserver); template auto downloadMediaInfo ( MediaHandle &&mediaHandle, const zypp::filesystem::Pathname &destdir ) { using namespace zyppng::operators; using ProvideType = typename std::decay_t::ParentType; // check if we have a async media handle constexpr bool isAsync = std::is_same_v; auto provider = mediaHandle.parent(); if ( !provider ) return makeReadyResult, isAsync>( expected::error(ZYPP_EXCPT_PTR(zypp::media::MediaException("Invalid handle"))) ); return provider->provide( std::forward(mediaHandle), "/media.1/media", ProvideFileSpec().setOptional(true).setDownloadSize( zypp::ByteCount(20, zypp::ByteCount::MB ) )) | and_then( ProvideType::copyResultToDest( provider, destdir / "/media.1/media" ) ); } } } #endif libzypp-17.36.5/zypp/ng/repo/workflows/repomanagerwf.cc000066400000000000000000001542411476576476200232010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "repomanagerwf.h" #include "zypp/parser/xml/Reader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" namespace zyppng::RepoManagerWorkflow { using namespace zyppng::operators; namespace { template struct ProbeRepoLogic : public LogicBase { protected: ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using ZyppContextRefType = std::conditional_t, ContextRef, SyncContextRef >; using ProvideType = typename remove_smart_ptr_t::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using LazyMediaHandle = typename ProvideType::LazyMediaHandle; using ProvideRes = typename ProvideType::Res; ProbeRepoLogic(ZyppContextRefType zyppCtx, LazyMediaHandle &&medium, zypp::Pathname &&path, std::optional &&targetPath ) : _zyppContext(std::move(zyppCtx)) , _medium(std::move(medium)) , _path(std::move(path)) , _targetPath(std::move(targetPath)) {} MaybeAsyncRef> execute( ) { const auto &url = _medium.baseUrl(); MIL << "going to probe the repo type at " << url << " (" << _path << ")" << std::endl; if ( url.getScheme() == "dir" && ! zypp::PathInfo( url.getPathName()/_path ).isDir() ) { // Handle non existing local directory in advance MIL << "Probed type NONE (not exists) at " << url << " (" << _path << ")" << std::endl; return makeReadyResult(expected::success(zypp::repo::RepoType::NONE)); } // prepare exception to be thrown if the type could not be determined // due to a media exception. We can't throw right away, because of some // problems with proxy servers returning an incorrect error // on ftp file-not-found(bnc #335906). Instead we'll check another types // before throwing. std::shared_ptr providerRef = _zyppContext->provider(); // TranslatorExplanation '%s' is an URL _error = zypp::repo::RepoException (zypp::str::form( _("Error trying to read from '%s'"), url.asString().c_str() )); return providerRef->attachMediaIfNeeded( _medium ) | and_then([this, providerRef]( MediaHandle medium ) { // first try rpmmd return providerRef->provide( medium, _path/"repodata/repomd.xml", ProvideFileSpec().setCheckExistsOnly( !_targetPath.has_value() ) ) | and_then( maybeCopyResultToDest("repodata/repomd.xml") ) | and_then( [](){ return expected::success(zypp::repo::RepoType::RPMMD); } ) // try susetags if rpmmd fails and remember the error | or_else( [this, providerRef, medium]( std::exception_ptr err ) { try { std::rethrow_exception (err); } catch ( const zypp::media::MediaFileNotFoundException &e ) { // do nothing ; } catch( const zypp::media::MediaException &e ) { DBG << "problem checking for repodata/repomd.xml file" << std::endl; _error.remember ( err ); _gotMediaError = true; } catch( ... ) { // any other error, we give up return makeReadyResult( expected::error( ZYPP_FWD_CURRENT_EXCPT() ) ); } return providerRef->provide( medium, _path/"content", ProvideFileSpec().setCheckExistsOnly( !_targetPath.has_value() ) ) | and_then( maybeCopyResultToDest("content") ) | and_then( []()->expected{ return expected::success(zypp::repo::RepoType::YAST2); } ); }) // no rpmmd and no susetags! | or_else( [this, medium]( std::exception_ptr err ) { try { std::rethrow_exception (err); } catch ( const zypp::media::MediaFileNotFoundException &e ) { // do nothing ; } catch( const zypp::media::MediaException &e ) { DBG << "problem checking for content file" << std::endl; _error.remember ( err ); _gotMediaError = true; } catch( zypp::Exception &e ) { _error.remember(e); // any other error, we give up return expected::error( ZYPP_EXCPT_PTR(_error) ); } catch(...) { // any other error, we give up return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } const auto &url = medium.baseUrl(); // if it is a non-downloading URL denoting a directory (bsc#1191286: and no plugin) if ( ! ( url.schemeIsDownloading() || url.schemeIsPlugin() ) ) { if ( medium.localPath() && zypp::PathInfo(medium.localPath().value()/_path).isDir() ) { // allow empty dirs for now MIL << "Probed type RPMPLAINDIR at " << url << " (" << _path << ")" << std::endl; return expected::success(zypp::repo::RepoType::RPMPLAINDIR); } } if( _gotMediaError ) return expected::error( ZYPP_EXCPT_PTR( _error )); MIL << "Probed type NONE at " << url << " (" << _path << ")" << std::endl; return expected::success(zypp::repo::RepoType::NONE); }) ; }); } private: /** * creates a callback that copies the downloaded file into the target directory if it was given. * \returns expected::success() if everything worked out */ auto maybeCopyResultToDest ( std::string &&subPath ) { return [this, subPath = std::move(subPath)]( ProvideRes file ) -> MaybeAsyncRef> { if ( _targetPath ) { MIL << "Target path is set, copying " << file.file() << " to " << *_targetPath/subPath << std::endl; return std::move(file) | ProvideType::copyResultToDest( _zyppContext->provider(), *_targetPath/subPath) | and_then([]( zypp::ManagedFile file ){ file.resetDispose(); return expected::success(); } ); } return makeReadyResult( expected::success() ); }; } private: ZyppContextRefType _zyppContext; LazyMediaHandle _medium; zypp::Pathname _path; std::optional _targetPath; zypp::repo::RepoException _error; bool _gotMediaError = false; }; template auto probeRepoLogic( RefreshContextRef ctx, RepoInfo repo, std::optional targetPath) { using namespace zyppng::operators; return ctx->provider()->prepareMedia( repo.url(), zyppng::ProvideMediaSpec() ) | and_then( [ctx, path = repo.path() ]( auto &&mediaHandle ) { return probeRepoType( ctx, std::forward(mediaHandle), path ); }); } } AsyncOpRef > probeRepoType(ContextRef ctx, AsyncLazyMediaHandle medium, zypp::Pathname path, std::optional targetPath) { return SimpleExecutor< ProbeRepoLogic, AsyncOp> >::run( std::move(ctx), std::move(medium), std::move(path), std::move(targetPath) ); } expected probeRepoType(SyncContextRef ctx, SyncLazyMediaHandle medium, zypp::Pathname path, std::optional targetPath ) { return SimpleExecutor< ProbeRepoLogic, SyncOp> >::run( std::move(ctx), std::move(medium), std::move(path), std::move(targetPath) ); } AsyncOpRef > probeRepoType( ContextRef ctx, RepoInfo repo, std::optional targetPath ) { return probeRepoLogic( std::move(ctx), std::move(repo), std::move(targetPath) ); } expected probeRepoType ( SyncContextRef ctx, RepoInfo repo, std::optional targetPath ) { return probeRepoLogic( std::move(ctx), std::move(repo), std::move(targetPath) ); } namespace { template auto readRepoFileLogic( ZyppContextRef ctx, zypp::Url repoFileUrl ) { using namespace zyppng::operators; return ctx->provider()->provide( repoFileUrl, ProvideFileSpec() ) | and_then([repoFileUrl]( auto local ){ DBG << "reading repo file " << repoFileUrl << ", local path: " << local.file() << std::endl; return repositories_in_file( local.file() ); }); } } AsyncOpRef > > readRepoFile(ContextRef ctx, zypp::Url repoFileUrl) { return readRepoFileLogic( std::move(ctx), std::move(repoFileUrl) ); } expected > readRepoFile(SyncContextRef ctx, zypp::Url repoFileUrl) { return readRepoFileLogic( std::move(ctx), std::move(repoFileUrl) ); } namespace { template struct CheckIfToRefreshMetadataLogic : public LogicBase { ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using RefreshContextRefType = std::conditional_t, repo::AsyncRefreshContextRef, repo::SyncRefreshContextRef>; using ZyppContextRefType = typename RefreshContextRefType::element_type::ContextRefType; using ZyppContextType = typename RefreshContextRefType::element_type::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using LazyMediaHandle = typename ProvideType::LazyMediaHandle; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; CheckIfToRefreshMetadataLogic( RefreshContextRefType refCtx, LazyMediaHandle &&medium, ProgressObserverRef progressObserver ) : _refreshContext(std::move(refCtx)) , _progress(std::move( progressObserver )) , _medium(std::move( medium )) {} MaybeAsyncRef> execute( ) { MIL << "Going to CheckIfToRefreshMetadata" << std::endl; return assert_alias( _refreshContext->repoInfo() ) | and_then( [this] { const auto &info = _refreshContext->repoInfo(); MIL << "Check if to refresh repo " << _refreshContext->repoInfo().alias() << " at " << _medium.baseUrl() << " (" << info.type() << ")" << std::endl; // first check old (cached) metadata return zyppng::RepoManager::metadataStatus( info, _refreshContext->repoManagerOptions() ); }) | and_then( [this](zypp::RepoStatus oldstatus) { const auto &info = _refreshContext->repoInfo(); if ( oldstatus.empty() ) { MIL << "No cached metadata, going to refresh" << std::endl; return makeReadyResult( expected::success(zypp::RepoManagerFlags::REFRESH_NEEDED) ); } if ( _medium.baseUrl().schemeIsVolatile() ) { MIL << "Never refresh CD/DVD" << std::endl; return makeReadyResult( expected::success(zypp::RepoManagerFlags::REPO_UP_TO_DATE) ); } if ( _refreshContext->policy() == zypp::RepoManagerFlags::RefreshForced ) { MIL << "Forced refresh!" << std::endl; return makeReadyResult( expected::success(zypp::RepoManagerFlags::REFRESH_NEEDED) ); } if ( _medium.baseUrl().schemeIsLocal() ) { _refreshContext->setPolicy( zypp::RepoManagerFlags::RefreshIfNeededIgnoreDelay ); } // Check whether repo.refresh.delay applies... if ( _refreshContext->policy() != zypp::RepoManagerFlags::RefreshIfNeededIgnoreDelay ) { // bsc#1174016: Prerequisite to skipping the refresh is that metadata // and solv cache status match. They will not, if the repos URL was // changed e.g. due to changed repovars. expected cachestatus = zyppng::RepoManager::cacheStatus( info, _refreshContext->repoManagerOptions() ); if ( !cachestatus ) return makeReadyResult( expected::error(cachestatus.error()) ); if ( oldstatus == *cachestatus ) { // difference in seconds double diff = ::difftime( (zypp::Date::ValueType)zypp::Date::now(), (zypp::Date::ValueType)oldstatus.timestamp() ) / 60; const auto refDelay = _refreshContext->zyppContext()->config().repo_refresh_delay(); if ( diff < refDelay ) { if ( diff < 0 ) { WAR << "Repository '" << info.alias() << "' was refreshed in the future!" << std::endl; } else { MIL << "Repository '" << info.alias() << "' has been refreshed less than repo.refresh.delay (" << refDelay << ") minutes ago. Advising to skip refresh" << std::endl; return makeReadyResult( expected::success(zypp::RepoManagerFlags::REPO_CHECK_DELAYED) ); } } } else { MIL << "Metadata and solv cache don't match. Check data on server..." << std::endl; } } return info.type() | [this]( zypp::repo::RepoType repokind ) { // if unknown: probe it if ( repokind == zypp::repo::RepoType::NONE ) return probeRepoType( _refreshContext->zyppContext(), _medium, _refreshContext->repoInfo().path()/*, _refreshContext->targetDir()*/ ); return makeReadyResult( expected::success(repokind) ); } | and_then([this, oldstatus]( zypp::repo::RepoType repokind ) { // make sure to remember the repo type _refreshContext->repoInfo().setProbedType( repokind ); auto dlContext = std::make_shared>( _refreshContext->zyppContext(), _refreshContext->repoInfo(), _refreshContext->targetDir() ); return RepoDownloaderWorkflow::repoStatus ( dlContext, _medium ) | and_then( [this, dlContext, oldstatus]( zypp::RepoStatus newstatus ){ // check status if ( oldstatus == newstatus ) { MIL << "repo has not changed" << std::endl; return zyppng::RepoManager::touchIndexFile( _refreshContext->repoInfo(), _refreshContext->repoManagerOptions() ) | and_then([](){ return expected::success(zypp::RepoManagerFlags::REPO_UP_TO_DATE); }); } else { // includes newstatus.empty() if e.g. repo format changed MIL << "repo has changed, going to refresh" << std::endl; MIL << "Old status: " << oldstatus << " New Status: " << newstatus << std::endl; return expected::success(zypp::RepoManagerFlags::REFRESH_NEEDED); } }); }); }); } protected: RefreshContextRefType _refreshContext; ProgressObserverRef _progress; LazyMediaHandle _medium; }; } AsyncOpRef > checkIfToRefreshMetadata(repo::AsyncRefreshContextRef refCtx, LazyMediaHandle medium, ProgressObserverRef progressObserver) { return SimpleExecutor< CheckIfToRefreshMetadataLogic , AsyncOp> >::run( std::move(refCtx), std::move(medium), std::move(progressObserver) ); } expected checkIfToRefreshMetadata(repo::SyncRefreshContextRef refCtx, LazyMediaHandle medium, ProgressObserverRef progressObserver) { return SimpleExecutor< CheckIfToRefreshMetadataLogic , SyncOp> >::run( std::move(refCtx), std::move(medium), std::move(progressObserver) ); } namespace { template struct RefreshMetadataLogic : public LogicBase{ ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using RefreshContextRefType = std::conditional_t, repo::AsyncRefreshContextRef, repo::SyncRefreshContextRef>; using ZyppContextRefType = typename RefreshContextRefType::element_type::ContextRefType; using ZyppContextType = typename RefreshContextRefType::element_type::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using LazyMediaHandle = typename ProvideType::LazyMediaHandle; using ProvideRes = typename ProvideType::Res; using DlContextType = repo::DownloadContext; using DlContextRefType = std::shared_ptr; RefreshMetadataLogic( RefreshContextRefType refCtx, LazyMediaHandle &&medium, ProgressObserverRef progressObserver ) : _refreshContext(std::move(refCtx)) , _progress ( std::move( progressObserver ) ) , _medium ( std::move( medium ) ) { } MaybeAsyncRef> execute() { return assert_alias( _refreshContext->repoInfo() ) | and_then( [this](){ return assert_urls( _refreshContext->repoInfo() ); }) | and_then( [this](){ return checkIfToRefreshMetadata ( _refreshContext, _medium, _progress ); }) | and_then( [this]( repo::RefreshCheckStatus status ){ MIL << "RefreshCheckStatus returned: " << status << std::endl; // check whether to refresh metadata // if the check fails for this url, it throws, so another url will be checked if ( status != zypp::RepoManagerFlags::REFRESH_NEEDED ) return makeReadyResult ( expected::success( std::move(_refreshContext) ) ); // if REFRESH_NEEDED but we don't have the permission to write the cache, stop here. if ( zypp::IamNotRoot() && not zypp::PathInfo(_refreshContext->rawCachePath().dirname()).userMayWX() ) { WAR << "No permision to write cache " << zypp::PathInfo(_refreshContext->rawCachePath().dirname()) << std::endl; auto exception = ZYPP_EXCPT_PTR( zypp::repo::RepoNoPermissionException( _refreshContext->repoInfo() ) ); return makeReadyResult( expected::error( std::move(exception) ) ); } MIL << "Going to refresh metadata from " << _medium.baseUrl() << std::endl; // bsc#1048315: Always re-probe in case of repo format change. // TODO: Would be sufficient to verify the type and re-probe // if verification failed (or type is RepoType::NONE) return probeRepoType ( _refreshContext->zyppContext(), _medium, _refreshContext->repoInfo().path() /*, _refreshContext->targetDir()*/ ) | and_then([this]( zypp::repo::RepoType repokind ) { auto &info = _refreshContext->repoInfo(); if ( info.type() != repokind ) { _refreshContext->setProbedType( repokind ); // Adjust the probed type in RepoInfo info.setProbedType( repokind ); // lazy init! } // no need to continue with an unknown type if ( repokind.toEnum() == zypp::repo::RepoType::NONE_e ) return makeReadyResult( expected::error( ZYPP_EXCPT_PTR ( zypp::repo::RepoUnknownTypeException( info ))) ); const zypp::Pathname &mediarootpath = _refreshContext->rawCachePath(); if( zypp::filesystem::assert_dir(mediarootpath) ) { auto exception = ZYPP_EXCPT_PTR (zypp::Exception(zypp::str::form( _("Can't create %s"), mediarootpath.c_str() ))); return makeReadyResult( expected::error( std::move(exception) )); } auto dlContext = std::make_shared( _refreshContext->zyppContext(), _refreshContext->repoInfo(), _refreshContext->targetDir() ); dlContext->setPluginRepoverification( _refreshContext->pluginRepoverification() ); return RepoDownloaderWorkflow::download ( dlContext, _medium, _progress ); }) | and_then([this]( DlContextRefType && ) { // ok we have the metadata, now exchange // the contents _refreshContext->saveToRawCache(); // if ( ! isTmpRepo( info ) ) // reposManip(); // remember to trigger appdata refresh // we are done. return expected::success( std::move(_refreshContext) ); }); }); } RefreshContextRefType _refreshContext; ProgressObserverRef _progress; LazyMediaHandle _medium; zypp::Pathname _mediarootpath; }; } AsyncOpRef > refreshMetadata( repo::AsyncRefreshContextRef refCtx, LazyMediaHandle medium, ProgressObserverRef progressObserver ) { return SimpleExecutor>>::run( std::move(refCtx), std::move(medium), std::move(progressObserver)); } expected refreshMetadata( repo::SyncRefreshContextRef refCtx, LazyMediaHandle medium, ProgressObserverRef progressObserver ) { return SimpleExecutor>>::run( std::move(refCtx), std::move(medium), std::move(progressObserver)); } namespace { template auto refreshMetadataLogic( RefreshContextRef refCtx, ProgressObserverRef progressObserver) { // small shared helper struct to pass around the exception and to remember that we tried the first URL struct ExHelper { // We will throw this later if no URL checks out fine. // The first exception will be remembered, further exceptions just added to the history. ExHelper( const RepoInfo & info_r ) : rexception { info_r, _("Failed to retrieve new repository metadata.") } {} void remember( const zypp::Exception & old_r ) { if ( rexception.historyEmpty() ) { rexception.remember( old_r ); } else { rexception.addHistory( old_r.asUserString() ); } } zypp::repo::RepoException rexception; }; auto helper = std::make_shared( ExHelper{ refCtx->repoInfo() } ); // the actual logic pipeline, attaches the medium and tries to refresh from it auto refreshPipeline = [ refCtx, progressObserver ]( zypp::Url url ){ return refCtx->zyppContext()->provider()->prepareMedia( url, zyppng::ProvideMediaSpec() ) | and_then( [ refCtx , progressObserver]( auto mediaHandle ) mutable { return refreshMetadata ( std::move(refCtx), std::move(mediaHandle), progressObserver ); } ); }; // predicate that accepts only valid results, and in addition collects all errors in rexception auto predicate = [ info = refCtx->repoInfo(), helper ]( const expected &res ) -> bool{ if ( !res ) { try { ZYPP_RETHROW( res.error() ); } catch ( const zypp::repo::RepoNoPermissionException &e ) { // We deliver the Exception caught here (no permission to write chache) and give up. ERR << "Giving up..." << std::endl; helper->remember( e ); return true; // stop processing } catch ( const zypp::Exception &e ) { ERR << "Trying another url..." << std::endl; helper->remember( e ); } return false; } return true; }; // now go over the urls until we find one that works return refCtx->repoInfo().baseUrls() | firstOf( std::move(refreshPipeline), expected::error( std::make_exception_ptr(NotFoundException()) ), std::move(predicate) ) | [helper]( expected result ) { if ( !result ) { // none of the URLs worked ERR << "No more urls..." << std::endl; return expected::error( ZYPP_EXCPT_PTR(helper->rexception) ); } // we are done. return result; }; } } AsyncOpRef > refreshMetadata( repo::AsyncRefreshContextRef refCtx, ProgressObserverRef progressObserver) { return refreshMetadataLogic ( std::move(refCtx), std::move(progressObserver) ); } expected refreshMetadata( repo::SyncRefreshContextRef refCtx, ProgressObserverRef progressObserver) { return refreshMetadataLogic ( std::move(refCtx), std::move(progressObserver) ); } namespace { template struct Repo2SolvOp; template <> struct Repo2SolvOp : public AsyncOp> { Repo2SolvOp() { } static AsyncOpRef> run( zypp::RepoInfo repo, zypp::ExternalProgram::Arguments args ) { MIL << "Starting repo2solv for repo " << repo.alias () << std::endl; auto me = std::make_shared>(); me->_repo = std::move(repo); me->_proc = Process::create(); me->_proc->connect( &Process::sigFinished, *me, &Repo2SolvOp::procFinished ); me->_proc->connect( &Process::sigReadyRead, *me, &Repo2SolvOp::readyRead ); std::vector argsIn; argsIn.reserve ( args.size() ); std::for_each( args.begin (), args.end(), [&]( const std::string &s ) { argsIn.push_back(s.data()); }); argsIn.push_back (nullptr); me->_proc->setOutputChannelMode ( Process::Merged ); if (!me->_proc->start( argsIn.data() )) { return makeReadyResult( expected::error(ZYPP_EXCPT_PTR(zypp::repo::RepoException ( me->_repo, _("Failed to cache repo ( unable to start repo2solv ).") ))) ); } return me; } void readyRead (){ const ByteArray &data = _proc->readLine(); const std::string &line = data.asString(); WAR << " " << line; _errdetail += line; } void procFinished( int ret ) { while ( _proc->canReadLine() ) readyRead(); if ( ret != 0 ) { zypp::repo::RepoException ex( _repo, zypp::str::form( _("Failed to cache repo (%d)."), ret )); ex.addHistory( zypp::str::Str() << _proc->executedCommand() << std::endl << _errdetail << _proc->execError() ); // errdetail lines are NL-terminaled! setReady( expected::error(ZYPP_EXCPT_PTR(ex)) ); return; } setReady( expected::success() ); } private: ProcessRef _proc; zypp::RepoInfo _repo; std::string _errdetail; }; template <> struct Repo2SolvOp { static expected run( zypp::RepoInfo repo, zypp::ExternalProgram::Arguments args ) { zypp::ExternalProgram prog( args, zypp::ExternalProgram::Stderr_To_Stdout ); std::string errdetail; for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { WAR << " " << output; errdetail += output; } int ret = prog.close(); if ( ret != 0 ) { zypp::repo::RepoException ex(repo, zypp::str::form( _("Failed to cache repo (%d)."), ret )); ex.addHistory( zypp::str::Str() << prog.command() << std::endl << errdetail << prog.execError() ); // errdetail lines are NL-terminaled! return expected::error(ZYPP_EXCPT_PTR(ex)); } return expected::success(); } }; template struct BuildCacheLogic : public LogicBase{ using RefreshContextRefType = std::conditional_t, repo::AsyncRefreshContextRef, repo::SyncRefreshContextRef>; using ZyppContextRefType = typename RefreshContextRefType::element_type::ContextRefType; using ZyppContextType = typename RefreshContextRefType::element_type::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); BuildCacheLogic( RefreshContextRefType &&refCtx, zypp::RepoManagerFlags::CacheBuildPolicy policy, ProgressObserverRef &&progressObserver ) : _refCtx( std::move(refCtx) ) , _policy( policy ) , _progressObserver( std::move(progressObserver) ) {} MaybeAsyncRef> execute() { ProgressObserver::setup ( _progressObserver, zypp::str::form(_("Building repository '%s' cache"), _refCtx->repoInfo().label().c_str()), 100 ); return assert_alias(_refCtx->repoInfo() ) | and_then( mtry( [this] { _mediarootpath = rawcache_path_for_repoinfo( _refCtx->repoManagerOptions(), _refCtx->repoInfo() ).unwrap(); _productdatapath = rawproductdata_path_for_repoinfo( _refCtx->repoManagerOptions(), _refCtx->repoInfo() ).unwrap(); })) | and_then( [this] { const auto &options = _refCtx->repoManagerOptions(); if( zypp::filesystem::assert_dir( options.repoCachePath ) ) { auto ex = ZYPP_EXCPT_PTR( zypp::Exception (zypp::str::form( _("Can't create %s"), options.repoCachePath.c_str()) ) ); return expected::error( std::move(ex) ); } return RepoManager::metadataStatus( _refCtx->repoInfo(), options ); }) | and_then( [this](RepoStatus raw_metadata_status ) { if ( raw_metadata_status.empty() ) { // If there is no raw cache at this point, we refresh the raw metadata. // This may happen if no autorefresh is configured and no explicit // refresh was called. // zypp::Pathname mediarootParent { _mediarootpath.dirname() }; if ( zypp::filesystem::assert_dir( mediarootParent ) == 0 && ( zypp::IamRoot() || zypp::PathInfo(mediarootParent).userMayWX() ) ) { return refreshMetadata( _refCtx, ProgressObserver::makeSubTask( _progressObserver ) ) | and_then([this]( auto /*refCtx*/) { return RepoManager::metadataStatus( _refCtx->repoInfo(), _refCtx->repoManagerOptions() ); } ); } else { // Non-root user is not allowed to write the raw cache. WAR << "No permission to write raw cache " << mediarootParent << std::endl; auto exception = ZYPP_EXCPT_PTR( zypp::repo::RepoNoPermissionException( _refCtx->repoInfo() ) ); return makeReadyResult( expected::error( std::move(exception) ) ); } } return makeReadyResult( make_expected_success (raw_metadata_status) ); }) | and_then( [this]( RepoStatus raw_metadata_status ) { bool needs_cleaning = false; const auto &info = _refCtx->repoInfo(); if ( _refCtx->repoManager()->isCached( info ) ) { MIL << info.alias() << " is already cached." << std::endl; expected cache_status = RepoManager::cacheStatus( info, _refCtx->repoManagerOptions() ); if ( !cache_status ) return makeReadyResult( expected::error(cache_status.error()) ); if ( *cache_status == raw_metadata_status ) { MIL << info.alias() << " cache is up to date with metadata." << std::endl; if ( _policy == zypp::RepoManagerFlags::BuildIfNeeded ) { // On the fly add missing solv.idx files for bash completion. return makeReadyResult( solv_path_for_repoinfo( _refCtx->repoManagerOptions(), info) | and_then([this]( zypp::Pathname base ){ if ( ! zypp::PathInfo(base/"solv.idx").isExist() ) return mtry( zypp::sat::updateSolvFileIndex, base/"solv" ); return expected::success (); }) ); } else { MIL << info.alias() << " cache rebuild is forced" << std::endl; } } needs_cleaning = true; } ProgressObserver::start( _progressObserver ); if (needs_cleaning) { auto r = _refCtx->repoManager()->cleanCache(info); if ( !r ) return makeReadyResult( expected::error(r.error()) ); } MIL << info.alias() << " building cache..." << info.type() << std::endl; expected base = solv_path_for_repoinfo( _refCtx->repoManagerOptions(), info); if ( !base ) return makeReadyResult( expected::error(base.error()) ); if( zypp::filesystem::assert_dir(*base) ) { zypp::Exception ex(zypp::str::form( _("Can't create %s"), base->c_str()) ); return makeReadyResult( expected::error(ZYPP_EXCPT_PTR(ex)) ); } if( zypp::IamNotRoot() && not zypp::PathInfo(*base).userMayW() ) { zypp::Exception ex(zypp::str::form( _("Can't create cache at %s - no writing permissions."), base->c_str()) ); return makeReadyResult( expected::error(ZYPP_EXCPT_PTR(ex)) ); } zypp::Pathname solvfile = *base / "solv"; // do we have type? zypp::repo::RepoType repokind = info.type(); // if the type is unknown, try probing. switch ( repokind.toEnum() ) { case zypp::repo::RepoType::NONE_e: // unknown, probe the local metadata repokind = RepoManager::probeCache( _productdatapath ); break; default: break; } MIL << "repo type is " << repokind << std::endl; return mountIfRequired( repokind, info ) | and_then([this, repokind, solvfile = std::move(solvfile) ]( std::optional forPlainDirs ) mutable { const auto &info = _refCtx->repoInfo(); switch ( repokind.toEnum() ) { case zypp::repo::RepoType::RPMMD_e : case zypp::repo::RepoType::YAST2_e : case zypp::repo::RepoType::RPMPLAINDIR_e : { // Take care we unlink the solvfile on error zypp::ManagedFile guard( solvfile, zypp::filesystem::unlink ); zypp::ExternalProgram::Arguments cmd; #ifdef ZYPP_REPO2SOLV_PATH cmd.push_back( ZYPP_REPO2SOLV_PATH ); #else cmd.push_back( zypp::PathInfo( "/usr/bin/repo2solv" ).isFile() ? "repo2solv" : "repo2solv.sh" ); #endif // repo2solv expects -o as 1st arg! cmd.push_back( "-o" ); cmd.push_back( solvfile.asString() ); cmd.push_back( "-X" ); // autogenerate pattern from pattern-package // bsc#1104415: no more application support // cmd.push_back( "-A" ); // autogenerate application pseudo packages if ( repokind == zypp::repo::RepoType::RPMPLAINDIR ) { // recusive for plaindir as 2nd arg! cmd.push_back( "-R" ); std::optional localPath = forPlainDirs.has_value() ? forPlainDirs->localPath() : zypp::Pathname(); if ( !localPath ) return makeReadyResult( expected::error( ZYPP_EXCPT_PTR( zypp::repo::RepoException( zypp::str::Format(_("Failed to cache repo %1%")) % _refCtx->repoInfo() ))) ); // FIXME this does only work for dir: URLs cmd.push_back( (*localPath / info.path().absolutename()).c_str() ); } else cmd.push_back( _productdatapath.asString() ); return Repo2SolvOp::run( info, std::move(cmd) ) | and_then( [this, guard = std::move(guard), solvfile = std::move(solvfile) ]() mutable { // We keep it. guard.resetDispose(); return mtry( zypp::sat::updateSolvFileIndex, solvfile ); // content digest for zypper bash completion }); } break; default: return makeReadyResult( expected::error( ZYPP_EXCPT_PTR(zypp::repo::RepoUnknownTypeException( info, _("Unhandled repository type") )) ) ); break; } }) | and_then([this, raw_metadata_status](){ // update timestamp and checksum return _refCtx->repoManager()->setCacheStatus( _refCtx->repoInfo(), raw_metadata_status ); }); }) | and_then( [this](){ MIL << "Commit cache.." << std::endl; ProgressObserver::finish( _progressObserver, ProgressObserver::Success ); return make_expected_success ( _refCtx ); }) | or_else ( [this]( std::exception_ptr e ) { ProgressObserver::finish( _progressObserver, ProgressObserver::Success ); return expected::error(e); }); } private: MaybeAsyncRef>> mountIfRequired ( zypp::repo::RepoType repokind, zypp::RepoInfo info ) { if ( repokind != zypp::repo::RepoType::RPMPLAINDIR ) return makeReadyResult( make_expected_success( std::optional() )); return _refCtx->zyppContext()->provider()->attachMedia( info.url(), ProvideMediaSpec() ) | and_then( [this]( MediaHandle handle ) { return makeReadyResult( make_expected_success( std::optional( std::move(handle)) )); }); } private: RefreshContextRefType _refCtx; zypp::RepoManagerFlags::CacheBuildPolicy _policy; ProgressObserverRef _progressObserver; zypp::Pathname _mediarootpath; zypp::Pathname _productdatapath; }; } AsyncOpRef > buildCache(repo::AsyncRefreshContextRef refCtx, zypp::RepoManagerFlags::CacheBuildPolicy policy, ProgressObserverRef progressObserver) { return SimpleExecutor>>::run( std::move(refCtx), policy, std::move(progressObserver)); } expected buildCache(repo::SyncRefreshContextRef refCtx, zypp::RepoManagerFlags::CacheBuildPolicy policy, ProgressObserverRef progressObserver) { return SimpleExecutor>>::run( std::move(refCtx), policy, std::move(progressObserver)); } // Add repository logic namespace { template struct AddRepoLogic : public LogicBase{ using RepoManagerPtrType = std::conditional_t, AsyncRepoManagerRef, SyncRepoManagerRef>; ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); AddRepoLogic( RepoManagerPtrType &&repoMgrRef, RepoInfo &&info, ProgressObserverRef &&myProgress ) : _repoMgrRef( std::move(repoMgrRef) ) , _info( std::move(info) ) , _myProgress ( std::move(myProgress) ) {} MaybeAsyncRef > execute() { using namespace zyppng::operators; return assert_alias(_info) | and_then([this]( ) { MIL << "Try adding repo " << _info << std::endl; ProgressObserver::setup( _myProgress, zypp::str::form(_("Adding repository '%s'"), _info.label().c_str()) ); ProgressObserver::start( _myProgress ); if ( _repoMgrRef->repos().find(_info) != _repoMgrRef->repos().end() ) return makeReadyResult( expected::error( ZYPP_EXCPT_PTR(zypp::repo::RepoAlreadyExistsException(_info)) ) ); // check the first url for now if ( _repoMgrRef->options().probe ) { DBG << "unknown repository type, probing" << std::endl; return assert_urls(_info) | and_then([this]{ return probeRepoType( _repoMgrRef->zyppContext(), _info ); }) | and_then([this]( zypp::repo::RepoType probedtype ) { if ( probedtype == zypp::repo::RepoType::NONE ) return expected::error( ZYPP_EXCPT_PTR(zypp::repo::RepoUnknownTypeException(_info)) ); RepoInfo tosave = _info; tosave.setType(probedtype); return make_expected_success(tosave); }); } return makeReadyResult( make_expected_success(_info) ); }) | inspect( operators::setProgress( _myProgress, 50 ) ) | and_then( [this]( RepoInfo tosave ){ return _repoMgrRef->addProbedRepository( tosave, tosave.type() ); }) | and_then( [this]( RepoInfo updated ) { ProgressObserver::finish( _myProgress ); MIL << "done" << std::endl; return expected::success( updated ); }) | or_else( [this]( std::exception_ptr e) { ProgressObserver::finish ( _myProgress, ProgressObserver::Error ); MIL << "done" << std::endl; return expected::error(e); }) ; } RepoManagerPtrType _repoMgrRef; RepoInfo _info; ProgressObserverRef _myProgress; }; }; AsyncOpRef > addRepository( AsyncRepoManagerRef mgr, RepoInfo info, ProgressObserverRef myProgress ) { return SimpleExecutor>>::run( std::move(mgr), std::move(info), std::move(myProgress) ); } expected addRepository( SyncRepoManagerRef mgr, const RepoInfo &info, ProgressObserverRef myProgress ) { return SimpleExecutor>>::run( std::move(mgr), RepoInfo(info), std::move(myProgress) ); } namespace { template struct AddReposLogic : public LogicBase{ using RepoManagerPtrType = std::conditional_t, AsyncRepoManagerRef, SyncRepoManagerRef>; ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); AddReposLogic( RepoManagerPtrType &&repoMgrRef, zypp::Url &&url, ProgressObserverRef &&myProgress ) : _repoMgrRef( std::move(repoMgrRef) ) , _url( std::move(url) ) , _myProgress ( std::move(myProgress) ) {} MaybeAsyncRef> execute() { using namespace zyppng::operators; return mtry( zypp::repo::RepoVariablesUrlReplacer(), _url ) | and_then([this]( zypp::Url repoFileUrl ) { return readRepoFile( _repoMgrRef->zyppContext(), std::move(repoFileUrl) ); } ) | and_then([this]( std::list repos ) { for ( std::list::const_iterator it = repos.begin(); it != repos.end(); ++it ) { // look if the alias is in the known repos. for_ ( kit, _repoMgrRef->repoBegin(), _repoMgrRef->repoEnd() ) { if ( (*it).alias() == (*kit).alias() ) { ERR << "To be added repo " << (*it).alias() << " conflicts with existing repo " << (*kit).alias() << std::endl; return expected::error(ZYPP_EXCPT_PTR(zypp::repo::RepoAlreadyExistsException(*it))); } } } std::string filename = zypp::Pathname(_url.getPathName()).basename(); if ( filename == zypp::Pathname() ) { // TranslatorExplanation '%s' is an URL return expected::error(ZYPP_EXCPT_PTR(zypp::repo::RepoException(zypp::str::form( _("Invalid repo file name at '%s'"), _url.asString().c_str() )))); } const auto &options = _repoMgrRef->options(); // assert the directory exists zypp::filesystem::assert_dir( options.knownReposPath ); zypp::Pathname repofile = _repoMgrRef->generateNonExistingName( options.knownReposPath, filename ); // now we have a filename that does not exists MIL << "Saving " << repos.size() << " repo" << ( repos.size() ? "s" : "" ) << " in " << repofile << std::endl; std::ofstream file(repofile.c_str()); if (!file) { // TranslatorExplanation '%s' is a filename return expected::error(ZYPP_EXCPT_PTR( zypp::Exception(zypp::str::form( _("Can't open file '%s' for writing."), repofile.c_str() )))); } for ( std::list::iterator it = repos.begin(); it != repos.end(); ++it ) { MIL << "Saving " << (*it).alias() << std::endl; const auto &rawCachePath = rawcache_path_for_repoinfo( options, *it ); if ( !rawCachePath ) return expected::error(rawCachePath.error()); const auto &pckCachePath = packagescache_path_for_repoinfo( options, *it ) ; if ( !pckCachePath ) return expected::error(pckCachePath.error()); it->dumpAsIniOn(file); it->setFilepath(repofile); it->setMetadataPath( *rawCachePath ); it->setPackagesPath( *pckCachePath ); _repoMgrRef->reposManip().insert(*it); zypp::HistoryLog( _repoMgrRef->options().rootDir).addRepository(*it); } MIL << "done" << std::endl; return expected::success(); }); } private: RepoManagerPtrType _repoMgrRef; zypp::Url _url; ProgressObserverRef _myProgress; }; } AsyncOpRef> addRepositories( AsyncRepoManagerRef mgr, zypp::Url url, ProgressObserverRef myProgress ) { return SimpleExecutor>>::run( std::move(mgr), std::move(url), std::move(myProgress) ); } expected addRepositories( SyncRepoManagerRef mgr, zypp::Url url, ProgressObserverRef myProgress) { return SimpleExecutor>>::run( std::move(mgr), std::move(url), std::move(myProgress) ); } namespace { template struct RefreshGeoIpLogic : public LogicBase{ protected: ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using ZyppContextRefType = std::conditional_t, ContextRef, SyncContextRef >; using ZyppContextType = typename ZyppContextRefType::element_type; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; RefreshGeoIpLogic( ZyppContextRefType &&zyppCtx, RepoInfo::url_set &&urls ) : _zyppCtx( std::move(zyppCtx) ) , _urls( std::move(urls) ) { } MaybeAsyncRef> execute() { using namespace zyppng::operators; if ( !_zyppCtx->config().geoipEnabled() ) { MIL << "GeoIp disabled via ZConfig, not refreshing the GeoIP information." << std::endl; return makeReadyResult(expected::success()); } std::vector hosts; for ( const auto &baseUrl : _urls ) { const auto &host = baseUrl.getHost(); if ( zypp::any_of( _zyppCtx->config().geoipHostnames(), [&host]( const auto &elem ){ return ( zypp::str::compareCI( host, elem ) == 0 ); } ) ) { hosts.push_back( host ); break; } } if ( hosts.empty() ) { MIL << "No configured geoip URL found, not updating geoip data" << std::endl; return makeReadyResult(expected::success()); } _geoIPCache = _zyppCtx->config().geoipCachePath(); if ( zypp::filesystem::assert_dir( _geoIPCache ) != 0 ) { MIL << "Unable to create cache directory for GeoIP." << std::endl; return makeReadyResult(expected::success()); } if ( zypp::IamNotRoot() && not zypp::PathInfo(_geoIPCache).userMayRWX() ) { MIL << "No access rights for the GeoIP cache directory." << std::endl; return makeReadyResult(expected::success()); } // remove all older cache entries zypp::filesystem::dirForEachExt( _geoIPCache, []( const zypp::Pathname &dir, const zypp::filesystem::DirEntry &entry ) { if ( entry.type != zypp::filesystem::FT_FILE ) return true; zypp::PathInfo pi( dir/entry.name ); auto age = std::chrono::system_clock::now() - std::chrono::system_clock::from_time_t( pi.mtime() ); if ( age < std::chrono::hours(24) ) return true; MIL << "Removing GeoIP file for " << entry.name << " since it's older than 24hrs." << std::endl; zypp::filesystem::unlink( dir/entry.name ); return true; }); auto firstOfCb = [this]( std::string hostname ) { // do not query files that are still there if ( zypp::PathInfo( _geoIPCache / hostname ).isExist() ) { MIL << "Skipping GeoIP request for " << hostname << " since a valid cache entry exists." << std::endl; return makeReadyResult(false); } MIL << "Query GeoIP for " << hostname << std::endl; zypp::Url url; try { url.setHost(hostname); url.setScheme("https"); } catch(const zypp::Exception &e ) { ZYPP_CAUGHT(e); MIL << "Ignoring invalid GeoIP hostname: " << hostname << std::endl; return makeReadyResult(false); } // always https ,but attaching makes things easier return _zyppCtx->provider()->attachMedia( url, ProvideMediaSpec() ) | and_then( [this]( MediaHandle provideHdl ) { return _zyppCtx->provider()->provide( provideHdl, "/geoip", ProvideFileSpec() ); }) | inspect_err( [hostname]( const std::exception_ptr& ){ MIL << "Failed to query GeoIP from hostname: " << hostname << std::endl; } ) | and_then( [hostname, this]( ProvideRes provideRes ) { // here we got something from the server, we will stop after this hostname and mark the process as success() constexpr auto writeHostToFile = []( const zypp::Pathname &fName, const std::string &host ){ std::ofstream out; out.open( fName.asString(), std::ios_base::trunc ); if ( out.is_open() ) { out << host << std::endl; } else { MIL << "Failed to create/open GeoIP cache file " << fName << std::endl; } }; std::string geoipMirror; try { zypp::xml::Reader reader( provideRes.file() ); if ( reader.seekToNode( 1, "host" ) ) { const auto &str = reader.nodeText().asString(); // make a dummy URL to ensure the hostname is valid zypp::Url testUrl; testUrl.setHost(str); testUrl.setScheme("https"); if ( testUrl.isValid() ) { MIL << "Storing geoIP redirection: " << hostname << " -> " << str << std::endl; geoipMirror = str; } } else { MIL << "No host entry or empty file returned for GeoIP, remembering for 24hrs" << std::endl; } } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); MIL << "Empty or invalid GeoIP file, not requesting again for 24hrs" << std::endl; } writeHostToFile( _geoIPCache / hostname, geoipMirror ); return expected::success(); // need to return a expected<> due to and_then requirements }) | []( expected res ) { return res.is_valid(); }; }; return std::move(hosts) | firstOf( std::move(firstOfCb), false, zyppng::detail::ContinueUntilValidPredicate() ) | []( bool foundGeoIP ){ if ( foundGeoIP ) { MIL << "Successfully queried GeoIP data." << std::endl; return expected::success (); } MIL << "Failed to query GeoIP data." << std::endl; return expected::error( std::make_exception_ptr( zypp::Exception("No valid geoIP url found" )) ); }; } private: ZyppContextRefType _zyppCtx; RepoInfo::url_set _urls; zypp::Pathname _geoIPCache; }; } AsyncOpRef > refreshGeoIPData( ContextRef ctx, RepoInfo::url_set urls ) { return SimpleExecutor>>::run( std::move(ctx), std::move(urls) ); } expected refreshGeoIPData( SyncContextRef ctx, RepoInfo::url_set urls ) { return SimpleExecutor>>::run( std::move(ctx), std::move(urls) ); } } libzypp-17.36.5/zypp/ng/repo/workflows/repomanagerwf.h000066400000000000000000000103331476576476200230340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_REPOMANAGER_WORKFLOW_INCLUDED #define ZYPP_NG_REPOMANAGER_WORKFLOW_INCLUDED #include #include #include #include #include //@ TODO move required types into their own files... e.g. CheckStatus #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (Context); ZYPP_FWD_DECL_TYPE_WITH_REFS (SyncContext); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProgressObserver); class Provide; class MediaSyncFacade; using AsyncLazyMediaHandle = LazyMediaHandle; using SyncLazyMediaHandle = LazyMediaHandle; namespace RepoManagerWorkflow { AsyncOpRef > probeRepoType( ContextRef ctx, AsyncLazyMediaHandle medium, zypp::Pathname path, std::optional targetPath = {} ); expected probeRepoType ( SyncContextRef ctx, SyncLazyMediaHandle medium, zypp::Pathname path, std::optional targetPath = {} ); AsyncOpRef > probeRepoType( ContextRef ctx, RepoInfo repo, std::optional targetPath = {} ); expected probeRepoType ( SyncContextRef ctx, RepoInfo repo, std::optional targetPath = {} ); AsyncOpRef>> readRepoFile( ContextRef ctx, zypp::Url repoFileUrl ); expected> readRepoFile( SyncContextRef ctx, zypp::Url repoFileUrl ); AsyncOpRef > checkIfToRefreshMetadata( repo::AsyncRefreshContextRef refCtx, AsyncLazyMediaHandle medium, ProgressObserverRef progressObserver = nullptr ); expected checkIfToRefreshMetadata( repo::SyncRefreshContextRef refCtx, SyncLazyMediaHandle medium, ProgressObserverRef progressObserver = nullptr ); AsyncOpRef > refreshMetadata( repo::AsyncRefreshContextRef refCtx, ProgressObserverRef progressObserver = nullptr ); expected refreshMetadata( repo::SyncRefreshContextRef refCtx, ProgressObserverRef progressObserver = nullptr ); AsyncOpRef > refreshMetadata( repo::AsyncRefreshContextRef refCtx, AsyncLazyMediaHandle medium, ProgressObserverRef progressObserver = nullptr ); expected refreshMetadata( repo::SyncRefreshContextRef refCtx, SyncLazyMediaHandle medium, ProgressObserverRef progressObserver = nullptr ); AsyncOpRef > buildCache( repo::AsyncRefreshContextRef refCtx, zypp::RepoManagerFlags::CacheBuildPolicy policy, ProgressObserverRef progressObserver = nullptr ); expected buildCache( repo::SyncRefreshContextRef refCtx, zypp::RepoManagerFlags::CacheBuildPolicy policy, ProgressObserverRef progressObserver = nullptr ); AsyncOpRef> addRepository( AsyncRepoManagerRef mgr, RepoInfo info, ProgressObserverRef myProgress = nullptr ); expected addRepository( SyncRepoManagerRef mgr, const RepoInfo &info, ProgressObserverRef myProgress = nullptr ); AsyncOpRef> addRepositories( AsyncRepoManagerRef mgr, zypp::Url url, ProgressObserverRef myProgress = nullptr ); expected addRepositories( SyncRepoManagerRef mgr, zypp::Url url, ProgressObserverRef myProgress = nullptr ); AsyncOpRef> refreshGeoIPData( ContextRef ctx, RepoInfo::url_set urls ); expected refreshGeoIPData( SyncContextRef ctx, RepoInfo::url_set urls ); } } #endif libzypp-17.36.5/zypp/ng/repo/workflows/rpmmd.cc000066400000000000000000000201521476576476200214540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "rpmmd.h" #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" namespace zyppng::RpmmdWorkflows { namespace { using namespace zyppng::operators; template struct StatusLogic : public LogicBase{ ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using DlContextRefType = std::conditional_t, repo::AsyncDownloadContextRef, repo::SyncDownloadContextRef>; using ZyppContextType = typename DlContextRefType::element_type::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; StatusLogic( DlContextRefType ctx, MediaHandle &&media ) : _ctx(std::move(ctx)) , _handle(std::move(media)) {} MaybeAsyncRef> execute() { return _ctx->zyppContext()->provider()->provide( _handle, _ctx->repoInfo().path() / "/repodata/repomd.xml" , ProvideFileSpec() ) | [this]( expected repomdFile ) { if ( !repomdFile ) return makeReadyResult( make_expected_success (zypp::RepoStatus() )); zypp::RepoStatus status ( repomdFile->file() ); if ( !status.empty() && _ctx->repoInfo ().requireStatusWithMediaFile()) { return _ctx->zyppContext()->provider()->provide( _handle, "/media.1/media" , ProvideFileSpec()) | [status = std::move(status)]( expected mediaFile ) mutable { if ( mediaFile ) { return make_expected_success( status && zypp::RepoStatus( mediaFile->file()) ); } return make_expected_success( std::move(status) ); }; } return makeReadyResult( make_expected_success(std::move(status)) ); }; } DlContextRefType _ctx; MediaHandle _handle; }; } AsyncOpRef > repoStatus(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle) { return SimpleExecutor< StatusLogic, AsyncOp> >::run( std::move(dl), std::move(mediaHandle) ); } expected repoStatus(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle) { return SimpleExecutor< StatusLogic, SyncOp> >::run( std::move(dl), std::move(mediaHandle) ); } namespace { using namespace zyppng::operators; template struct DlLogic : public LogicBase, private zypp::repo::yum::RepomdFileCollector { ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using DlContextRefType = std::conditional_t, repo::AsyncDownloadContextRef, repo::SyncDownloadContextRef>; using ZyppContextType = typename DlContextRefType::element_type::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; DlLogic( DlContextRefType ctx, MediaHandle &&mediaHandle, ProgressObserverRef &&progressObserver ) : zypp::repo::yum::RepomdFileCollector( ctx->destDir() ) , _ctx( std::move(ctx)) , _mediaHandle(std::move(mediaHandle)) , _progressObserver(std::move(progressObserver)) {} auto execute() { // download media file here return RepoDownloaderWorkflow::downloadMediaInfo( _mediaHandle, _ctx->destDir() ) | [this]( expected &&mediaInfo ) { // remember the media info if we had one if ( mediaInfo ) _ctx->files().push_back ( std::move(mediaInfo.get()) ); if ( _progressObserver ) _progressObserver->inc(); return RepoDownloaderWorkflow::downloadMasterIndex( _ctx, _mediaHandle, _ctx->repoInfo().path() / "/repodata/repomd.xml" ) | inspect( incProgress( _progressObserver ) ) | and_then( [this] ( DlContextRefType && ) { zypp::Pathname repomdPath = _ctx->files().front(); std::vector requiredFiles; try { zypp::parser::yum::RepomdFileReader reader( repomdPath, [this]( const zypp::OnMediaLocation & loc_r, const std::string & typestr_r ){ return collect( loc_r, typestr_r ); }); finalize([&]( const zypp::OnMediaLocation &file ){ if ( file.medianr () != 1 ) { // ALL repo files NEED to come from media nr 1 , otherwise we fail ZYPP_THROW(zypp::repo::RepoException( _ctx->repoInfo(), "Repo can only require metadata files from primary medium.")); } requiredFiles.push_back( file ); }); } catch ( ... ) { return makeReadyResult(expected::error( ZYPP_FWD_CURRENT_EXCPT() ) ); } // add the required files to the base steps if ( _progressObserver ) _progressObserver->setBaseSteps ( _progressObserver->baseSteps () + requiredFiles.size() ); return transform_collect ( std::move(requiredFiles), [this]( zypp::OnMediaLocation file ) { return DownloadWorkflow::provideToCacheDir( _ctx, _mediaHandle, file.filename(), ProvideFileSpec(file) ) | inspect ( incProgress( _progressObserver ) ); }) | and_then ( [this]( std::vector &&dlFiles ) { auto &downloadedFiles = _ctx->files(); downloadedFiles.insert( downloadedFiles.end(), std::make_move_iterator(dlFiles.begin()), std::make_move_iterator(dlFiles.end()) ); return expected::success( std::move(_ctx) ); }); }); } | finishProgress( _progressObserver ); } private: const zypp::RepoInfo &repoInfo() const override { return _ctx->repoInfo(); } const zypp::filesystem::Pathname &deltaDir() const override { return _ctx->deltaDir(); } DlContextRefType _ctx; MediaHandle _mediaHandle; ProgressObserverRef _progressObserver; }; } AsyncOpRef > download(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return SimpleExecutor< DlLogic, AsyncOp> >::run( std::move(dl), std::move(mediaHandle), std::move(progressObserver) ); } expected download(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return SimpleExecutor< DlLogic, SyncOp> >::run( std::move(dl), std::move(mediaHandle), std::move(progressObserver) ); } } libzypp-17.36.5/zypp/ng/repo/workflows/rpmmd.h000066400000000000000000000033711476576476200213220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_RPMMD_WORKFLOW_INCLUDED #define ZYPP_NG_RPMMD_WORKFLOW_INCLUDED #include #include #include #include #include namespace zyppng { class ProvideMediaHandle; class SyncMediaHandle; ZYPP_FWD_DECL_TYPE_WITH_REFS( ProgressObserver ); /** * \short Downloader workspace for YUM (rpm-nmd) repositories * Encapsulates all the knowledge of which files have * to be downloaded to the local disk. */ namespace RpmmdWorkflows { AsyncOpRef> repoStatus( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle ); expected repoStatus(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle ); AsyncOpRef> download ( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); expected download ( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); } } #endif libzypp-17.36.5/zypp/ng/repo/workflows/serviceswf.cc000066400000000000000000000772361476576476200225340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "serviceswf.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" namespace zyppng::RepoServicesWorkflow { using namespace zyppng::operators; namespace { zypp::Url adaptServiceUrlToChroot( zypp::Url serviceUrl, zypp::Pathname root ) { // if file:// or dir:// path we must prefix with the root_r const auto &scheme = serviceUrl.getScheme(); if ( !root.empty() && (scheme == "dir" || scheme == "file") ) { serviceUrl.setPathName ( root / zypp::Pathname(serviceUrl.getPathName()) ); } return serviceUrl; } template struct FetchRIMServiceLogic : public LogicBase { protected: ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using ZyppContextRefType = std::conditional_t, ContextRef, SyncContextRef >; using RepoMgrRefType = RepoManagerRef; FetchRIMServiceLogic( ZyppContextRefType &&ctx, zypp::Pathname &&root_r, ServiceInfo &&service, ProgressObserverRef &&myProgress ) : _ctx( std::move(ctx) ) , _root_r( std::move(root_r) ) , _service( std::move(service) ) , _myProgress( std::move(myProgress) ) {} MaybeAsyncRef >> execute() { using namespace zyppng::operators; return zyppng::mtry( [this]{ // repoindex.xml must be fetched always without using cookies (bnc #573897) zypp::Url serviceUrl = _service.url(); serviceUrl.setQueryParam( "cookies", "0" ); return adaptServiceUrlToChroot( serviceUrl, _root_r ); }) | and_then( [this]( zypp::Url serviceUrl ){ return _ctx->provider()->attachMedia( serviceUrl, ProvideMediaSpec() ); }) | and_then( [this]( auto mediaHandle ) { return _ctx->provider()->provide( mediaHandle, "repo/repoindex.xml", ProvideFileSpec() ); } ) | and_then( [this]( auto provideResult ) { try { zypp::RepoInfoList repos; auto callback = [&]( const zypp::RepoInfo &r) { repos.push_back(r); return true; }; zypp::parser::RepoindexFileReader reader( provideResult.file(), callback); _service.setProbedTtl( reader.ttl() ); // hack! Modifying the const Service to set parsed TTL return make_expected_success( std::make_pair( _service, std::move(repos) ) ); } catch ( const zypp::Exception &e ) { //Reader throws a bare exception, we need to translate it into something our calling //code expects and handles (bnc#1116840) ZYPP_CAUGHT ( e ); zypp::repo::ServicePluginInformalException ex ( e.msg() ); ex.remember( e ); return expected>::error( ZYPP_EXCPT_PTR( ex ) ); } }); } private: ZyppContextRefType _ctx; zypp::Pathname _root_r; ServiceInfo _service; ProgressObserverRef _myProgress; }; template struct FetchPluginServiceLogic : public LogicBase { protected: ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using ZyppContextRefType = std::conditional_t, ContextRef, SyncContextRef >; using RepoMgrRefType = RepoManagerRef; using Ret = expected>; FetchPluginServiceLogic( ZyppContextRefType &&ctx, zypp::Pathname &&root_r, ServiceInfo &&service, ProgressObserverRef &&myProgress ) : _ctx( std::move(ctx) ) , _root_r( std::move(root_r) ) , _service( std::move(service) ) , _myProgress( std::move(myProgress) ) {} MaybeAsyncRef execute() { using namespace zyppng::operators; // bsc#1080693: Service script needs to be executed chrooted to the RepoManagers rootDir. // The service is not aware of the rootDir, so it's explicitly passed and needs to be // stripped from the URLs path. auto stripped = zypp::Pathname::stripprefix( _root_r, _service.url().getPathName() ).asString(); return executor()->runPlugin( std::move(stripped) ) | and_then( [this]( int exitCode ) { if ( exitCode != 0 ) { // ServicePluginInformalException: // Ignore this error but we'd like to report it somehow... ERR << "Capture plugin error:[" << std::endl << _stderrBuf << std::endl << ']' << std::endl; return Ret::error( ZYPP_EXCPT_PTR( zypp::repo::ServicePluginInformalException( _service, _stderrBuf ) ) ); } try { zypp::RepoInfoList repos; auto callback = [&]( const zypp::RepoInfo &r) { repos.push_back(r); return true; }; std::stringstream buffer( _stdoutBuf ); zypp::parser::RepoFileReader parser( buffer, callback ); return make_expected_success( std::make_pair( _service, std::move(repos) ) ); } catch (...) { return Ret::error( std::current_exception () ); } }); } protected: ZyppContextRefType _ctx; zypp::Pathname _root_r; ServiceInfo _service; ProgressObserverRef _myProgress; std::string _stdoutBuf; std::string _stderrBuf; }; struct SyncFetchPluginService : FetchPluginServiceLogic >>> { using FetchPluginServiceLogic::FetchPluginServiceLogic; expected runPlugin( std::string command ) { try { std::stringstream buffer; zypp::ExternalProgram::Arguments args; args.reserve( 3 ); args.push_back( "/bin/sh" ); args.push_back( "-c" ); args.push_back( command ); zypp::ExternalProgramWithStderr prog( args, _root_r ); prog >> buffer; _stdoutBuf = buffer.str(); int retCode = prog.close(); if ( retCode != 0 ) { // ServicePluginInformalException: // Ignore this error but we'd like to report it somehow... prog.stderrGetUpTo( _stderrBuf, '\0' ); } return make_expected_success(retCode); } catch ( ... ) { return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } }; struct ASyncFetchPluginService : FetchPluginServiceLogic >>> { using FetchPluginServiceLogic::FetchPluginServiceLogic; AsyncOpRef> runPlugin( std::string command ) { using namespace zyppng::operators; const char *args[] = { "/bin/sh", "-c", command.c_str(), nullptr }; auto pluginProcess = Process::create(); pluginProcess->setChroot ( _root_r ); // make sure our process is actually running, if not finalize right away if ( !pluginProcess->start( args ) || !pluginProcess->isRunning () ) { return makeReadyResult ( finalize( std::move(pluginProcess) ) ); } return std::move(pluginProcess) | await( &Process::sigFinished ) // wait for finished sig | [this]( ProcessRef proc ) { return finalize( std::move(proc) ); }; } expected finalize( ProcessRef proc ) { if ( proc->isRunning () ) { proc->stop ( SIGKILL ); return expected::error( ZYPP_EXCPT_PTR( zypp::Exception("Bug, plugin process was still running after receiving sigFinished")) ); } _stdoutBuf = proc->readAll( Process::StdOut ).asString(); if ( proc->exitStatus() != 0 ) { _stderrBuf = proc->readAll( Process::StdErr ).asString(); } return make_expected_success ( proc->exitStatus () ); } }; } AsyncOpRef>> fetchRepoListfromService( ContextRef ctx, zypp::Pathname root_r, ServiceInfo service, ProgressObserverRef myProgress ) { if ( service.type() == zypp::repo::ServiceType::PLUGIN ) return ASyncFetchPluginService::run( std::move(ctx), std::move(root_r), std::move(service), std::move(myProgress) ); else return SimpleExecutor >>>::run( std::move(ctx), std::move(root_r), std::move(service), std::move(myProgress) ); } expected> fetchRepoListfromService( SyncContextRef ctx, zypp::Pathname root_r, ServiceInfo service, ProgressObserverRef myProgress ) { if ( service.type() == zypp::repo::ServiceType::PLUGIN ) return SyncFetchPluginService::run( std::move(ctx), std::move(root_r), std::move(service), std::move(myProgress) ); else return SimpleExecutor >>>::run( std::move(ctx), std::move(root_r), std::move(service), std::move(myProgress) ); } namespace { template auto probeServiceLogic( ContextRefType ctx, const zypp::Url &url ) { constexpr bool isAsync = std::is_same_v; using MediaHandle = std::conditional_t; using ProvideRes = std::conditional_t; return ctx->provider()->attachMedia( url, ProvideMediaSpec() ) | and_then( [ctx]( MediaHandle medium ) { return ctx->provider()->provide( medium, "/repo/repoindex.xml", ProvideFileSpec().setCheckExistsOnly()); } ) | [url]( expected result ) { if ( result ) return expected::success( zypp::repo::ServiceType::RIS ); try{ std::rethrow_exception( result.error() ); } catch ( const zypp::media::MediaFileNotFoundException &e ) { // fall through } catch ( const zypp::media::MediaException &e ) { ZYPP_CAUGHT(e); // TranslatorExplanation '%s' is an URL zypp::repo::RepoException enew(zypp::str::form( _("Error trying to read from '%s'"), url.asString().c_str() )); enew.remember(e); return expected::error( ZYPP_EXCPT_PTR(enew) ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); // TranslatorExplanation '%s' is an URL zypp::Exception enew(zypp::str::form( _("Unknown error reading from '%s'"), url.asString().c_str() )); enew.remember(e); return expected::error( ZYPP_EXCPT_PTR(enew) ); } catch ( ... ) { // TranslatorExplanation '%s' is an URL zypp::Exception enew(zypp::str::form( _("Unknown error reading from '%s'"), url.asString().c_str() )); enew.remember( std::current_exception() ); return expected::error( ZYPP_EXCPT_PTR(enew) ); } return expected::success( zypp::repo::ServiceType::NONE ); }; } } AsyncOpRef > probeServiceType(ContextRef ctx, const zypp::Url &url) { return probeServiceLogic( std::move(ctx), url ); } expected probeServiceType(SyncContextRef ctx, const zypp::Url &url) { return probeServiceLogic( std::move(ctx), url ); } namespace { template struct RefreshServiceLogic : public LogicBase { protected: ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using ZyppContextRefType = std::conditional_t, ContextRef, SyncContextRef >; using RepoMgrRefType = RepoManagerRef; using Ret = expected; RefreshServiceLogic( RepoMgrRefType &&repoMgr, zypp::ServiceInfo &&info, zypp::RepoManager::RefreshServiceOptions options ) : _repoMgr( std::move(repoMgr) ) , _service( std::move(info) ) , _options(options) { } MaybeAsyncRef> probeServiceIfNeeded() { // if the type is unknown, try probing. if ( _service.type() == zypp::repo::ServiceType::NONE ) { return probeServiceType( _repoMgr->zyppContext(), adaptServiceUrlToChroot( _service.url(), _repoMgr->options().rootDir ) ) | and_then( [this]( zypp::repo::ServiceType type ){ _service.setProbedType( type ); // lazy init! _serviceModified = true; return expected::success(); } ); } return makeReadyResult( expected::success() ); } MaybeAsyncRef execute() { try { assert_alias( _service ).unwrap(); assert_url( _service ).unwrap(); } catch (...) { return makeReadyResult(Ret::error(ZYPP_FWD_CURRENT_EXCPT())); } MIL << "Going to refresh service '" << _service.alias() << "', url: " << _service.url() << ", opts: " << _options << std::endl; if ( _service.ttl() && !( _options.testFlag( zypp::RepoManager::RefreshService_forceRefresh) || _options.testFlag( zypp::RepoManager::RefreshService_restoreStatus ) ) ) { // Service defines a TTL; maybe we can re-use existing data without refresh. zypp::Date lrf = _service.lrf(); if ( lrf ) { zypp::Date now( zypp::Date::now() ); if ( lrf <= now ) { if ( (lrf+=_service.ttl()) > now ) // lrf+= ! { MIL << "Skip: '" << _service.alias() << "' metadata valid until " << lrf << std::endl; return makeReadyResult( Ret::success() ); } } else WAR << "Force: '" << _service.alias() << "' metadata last refresh in the future: " << lrf << std::endl; } } //! \todo add callbacks for apps (start, end, repo removed, repo added, repo changed)? return probeServiceIfNeeded () // if the type is unknown, try probing. | and_then( [this]() { // FIXME bsc#1080693: Shortcoming of (plugin)services (and repos as well) is that they // are not aware of the RepoManagers rootDir. The service url, as created in known_services, // contains the full path to the script. The script however has to be executed chrooted. // Repos would need to know the RepoMangers rootDir to use the correct vars.d to replace // repos variables. Until RepoInfoBase is aware if the rootDir, we need to explicitly pass it // to ServiceRepos. return fetchRepoListfromService( _repoMgr->zyppContext(), _repoMgr->options().rootDir, _service, nullptr ); } ) | [this]( expected> serviceReposExp ) { if ( !serviceReposExp ) { try { std::rethrow_exception( serviceReposExp.error() ); } catch ( const zypp::repo::ServicePluginInformalException & e ) { /* ignore ServicePluginInformalException and throw later */ _informalError = e; } catch ( ... ) { // all other errors cancel the operation return Ret::error( ZYPP_FWD_CURRENT_EXCPT() ); } } std::pair serviceRepos = serviceReposExp.is_valid() ? std::move( serviceReposExp.get() ) : std::make_pair( _service, RepoInfoList{} ); // get target distro identifier std::string servicesTargetDistro = _repoMgr->options().servicesTargetDistro; if ( servicesTargetDistro.empty() ) { servicesTargetDistro = zypp::Target::targetDistribution( zypp::Pathname() ); } DBG << "ServicesTargetDistro: " << servicesTargetDistro << std::endl; // filter repos by target distro RepoCollector collector( servicesTargetDistro ); std::for_each( serviceRepos.second.begin(), serviceRepos.second.end(), [&]( const auto &r ){ collector.collect(r); } ); if ( _service.ttl () != serviceRepos.first.ttl () ) { // repoindex.xml changed ttl if ( !serviceRepos.first.ttl() ) serviceRepos.first.setLrf( zypp::Date() ); // don't need lrf when zero ttl _serviceModified = true; } // service was maybe updated _service = serviceRepos.first; //////////////////////////////////////////////////////////////////////////// // On the fly remember the new repo states as defined the reopoindex.xml. // Move into ServiceInfo later. ServiceInfo::RepoStates newRepoStates; // set service alias and base url for all collected repositories for_( it, collector.repos.begin(), collector.repos.end() ) { // First of all: Prepend service alias: it->setAlias( zypp::str::form( "%s:%s", _service.alias().c_str(), it->alias().c_str() ) ); // set reference to the parent service it->setService( _service.alias() ); // remember the new parsed repo state newRepoStates[it->alias()] = *it; // - If the repo url was not set by the repoindex parser, set service's url. // - Libzypp currently has problem with separate url + path handling so just // append a path, if set, to the baseurls // - Credentials in the url authority will be extracted later, either if the // repository is added or if we check for changed urls. zypp::Pathname path; if ( !it->path().empty() ) { if ( it->path() != "/" ) path = it->path(); it->setPath(""); } if ( it->baseUrlsEmpty() ) { zypp::Url url( _service.rawUrl() ); if ( !path.empty() ) url.setPathName( url.getPathName() / path ); it->setBaseUrl( std::move(url) ); } else if ( !path.empty() ) { RepoInfo::url_set urls( it->rawBaseUrls() ); for ( zypp::Url & url : urls ) { url.setPathName( url.getPathName() / path ); } it->setBaseUrls( std::move(urls) ); } } //////////////////////////////////////////////////////////////////////////// // Now compare collected repos with the ones in the system... // RepoInfoList oldRepos; _repoMgr->getRepositoriesInService( _service.alias(), std::back_inserter( oldRepos ) ); //////////////////////////////////////////////////////////////////////////// // find old repositories to remove... for_( oldRepo, oldRepos.begin(), oldRepos.end() ) { if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) ) { if ( oldRepo->enabled() ) { // Currently enabled. If this was a user modification remember the state. const auto & last = _service.repoStates().find( oldRepo->alias() ); if ( last != _service.repoStates().end() && ! last->second.enabled ) { DBG << "Service removes user enabled repo " << oldRepo->alias() << std::endl; _service.addRepoToEnable( oldRepo->alias() ); _serviceModified = true; } else DBG << "Service removes enabled repo " << oldRepo->alias() << std::endl; } else DBG << "Service removes disabled repo " << oldRepo->alias() << std::endl; auto remRes = _repoMgr->removeRepository( *oldRepo ); if ( !remRes ) return Ret::error( remRes.error() ); } } //////////////////////////////////////////////////////////////////////////// // create missing repositories and modify existing ones if needed... zypp::UrlCredentialExtractor urlCredentialExtractor( _repoMgr->options().rootDir ); // To collect any credentials stored in repo URLs for_( it, collector.repos.begin(), collector.repos.end() ) { // User explicitly requested the repo being enabled? // User explicitly requested the repo being disabled? // And hopefully not both ;) If so, enable wins. zypp::TriBool toBeEnabled( zypp::indeterminate ); // indeterminate - follow the service request DBG << "Service request to " << (it->enabled()?"enable":"disable") << " service repo " << it->alias() << std::endl; if ( _options.testFlag( zypp::RepoManagerFlags::RefreshService_restoreStatus ) ) { DBG << "Opt RefreshService_restoreStatus " << it->alias() << std::endl; // this overrides any pending request! // Remove from enable request list. // NOTE: repoToDisable is handled differently. // It gets cleared on each refresh. _service.delRepoToEnable( it->alias() ); // toBeEnabled stays indeterminate! } else { if ( _service.repoToEnableFind( it->alias() ) ) { DBG << "User request to enable service repo " << it->alias() << std::endl; toBeEnabled = true; // Remove from enable request list. // NOTE: repoToDisable is handled differently. // It gets cleared on each refresh. _service.delRepoToEnable( it->alias() ); _serviceModified = true; } else if ( _service.repoToDisableFind( it->alias() ) ) { DBG << "User request to disable service repo " << it->alias() << std::endl; toBeEnabled = false; } } RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) ); if ( oldRepo == oldRepos.end() ) { // Not found in oldRepos ==> a new repo to add // Make sure the service repo is created with the appropriate enablement if ( ! indeterminate(toBeEnabled) ) it->setEnabled( ( bool ) toBeEnabled ); DBG << "Service adds repo " << it->alias() << " " << (it->enabled()?"enabled":"disabled") << std::endl; const auto &addRes = _repoMgr->addRepository( *it ); if (!addRes) return Ret::error( addRes.error() ); } else { // ==> an exising repo to check bool oldRepoModified = false; if ( indeterminate(toBeEnabled) ) { // No user request: check for an old user modificaton otherwise follow service request. // NOTE: Assert toBeEnabled is boolean afterwards! if ( oldRepo->enabled() == it->enabled() ) toBeEnabled = it->enabled(); // service requests no change to the system else if ( _options.testFlag( zypp::RepoManagerFlags::RefreshService_restoreStatus ) ) { toBeEnabled = it->enabled(); // RefreshService_restoreStatus forced DBG << "Opt RefreshService_restoreStatus " << it->alias() << " forces " << (toBeEnabled?"enabled":"disabled") << std::endl; } else { const auto & last = _service.repoStates().find( oldRepo->alias() ); if ( last == _service.repoStates().end() || last->second.enabled != it->enabled() ) toBeEnabled = it->enabled(); // service request has changed since last refresh -> follow else { toBeEnabled = oldRepo->enabled(); // service request unchaned since last refresh -> keep user modification DBG << "User modified service repo " << it->alias() << " may stay " << (toBeEnabled?"enabled":"disabled") << std::endl; } } } // changed enable? if ( toBeEnabled == oldRepo->enabled() ) { DBG << "Service repo " << it->alias() << " stays " << (oldRepo->enabled()?"enabled":"disabled") << std::endl; } else if ( toBeEnabled ) { DBG << "Service repo " << it->alias() << " gets enabled" << std::endl; oldRepo->setEnabled( true ); oldRepoModified = true; } else { DBG << "Service repo " << it->alias() << " gets disabled" << std::endl; oldRepo->setEnabled( false ); oldRepoModified = true; } // all other attributes follow the service request: // changed name (raw!) if ( oldRepo->rawName() != it->rawName() ) { DBG << "Service repo " << it->alias() << " gets new NAME " << it->rawName() << std::endl; oldRepo->setName( it->rawName() ); oldRepoModified = true; } // changed autorefresh if ( oldRepo->autorefresh() != it->autorefresh() ) { DBG << "Service repo " << it->alias() << " gets new AUTOREFRESH " << it->autorefresh() << std::endl; oldRepo->setAutorefresh( it->autorefresh() ); oldRepoModified = true; } // changed priority? if ( oldRepo->priority() != it->priority() ) { DBG << "Service repo " << it->alias() << " gets new PRIORITY " << it->priority() << std::endl; oldRepo->setPriority( it->priority() ); oldRepoModified = true; } // changed url? { RepoInfo::url_set newUrls( it->rawBaseUrls() ); urlCredentialExtractor.extract( newUrls ); // Extract! to prevent passwds from disturbing the comparison below if ( oldRepo->rawBaseUrls() != newUrls ) { DBG << "Service repo " << it->alias() << " gets new URLs " << newUrls << std::endl; oldRepo->setBaseUrls( std::move(newUrls) ); oldRepoModified = true; } } // changed gpg check settings? // ATM only plugin services can set GPG values. if ( _service.type() == zypp::repo::ServiceType::PLUGIN ) { zypp::TriBool ogpg[3]; // Gpg RepoGpg PkgGpg zypp::TriBool ngpg[3]; oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] ); it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] ); #define Z_CHKGPG(I,N) \ if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \ { \ DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << std::endl; \ oldRepo->set##N##Check( ngpg[I] ); \ oldRepoModified = true; \ } Z_CHKGPG( 0, Gpg ); Z_CHKGPG( 1, RepoGpg ); Z_CHKGPG( 2, PkgGpg ); #undef Z_CHKGPG } // save if modified: if ( oldRepoModified ) { auto modRes = _repoMgr->modifyRepository( oldRepo->alias(), *oldRepo ); if ( !modRes ) return Ret::error( modRes.error() ); } } } // Unlike reposToEnable, reposToDisable is always cleared after refresh. if ( ! _service.reposToDisableEmpty() ) { _service.clearReposToDisable(); _serviceModified = true; } // Remember original service request for next refresh if ( _service.repoStates() != newRepoStates ) { _service.setRepoStates( std::move(newRepoStates) ); _serviceModified = true; } //////////////////////////////////////////////////////////////////////////// // save service if modified: (unless a plugin service) if ( _service.type() != zypp::repo::ServiceType::PLUGIN ) { if ( _service.ttl() ) { _service.setLrf( zypp::Date::now() ); // remember last refresh _serviceModified = true; // or use a cookie file } if ( _serviceModified ) { // write out modified service file. auto modRes = _repoMgr->modifyService( _service.alias(), _service ); if ( !modRes ) return Ret::error( modRes.error() ); } } if ( _informalError ) { return Ret::error( std::make_exception_ptr (_informalError.value()) ); } return Ret::success( ); }; } RepoMgrRefType _repoMgr; zypp::ServiceInfo _service; zypp::RepoManager::RefreshServiceOptions _options; // NOTE: It might be necessary to modify and rewrite the service info. // Either when probing the type, or when adjusting the repositories // enable/disable state.: bool _serviceModified = false; // FIXME Ugly hack: ServiceRepos may throw ServicePluginInformalException // which is actually a notification. Using an exception for this // instead of signal/callback is bad. Needs to be fixed here, in refreshServices() // and in zypper. std::optional _informalError; }; } AsyncOpRef> refreshService(AsyncRepoManagerRef repoMgr, ServiceInfo info, zypp::RepoManagerFlags::RefreshServiceOptions options) { return SimpleExecutor>>::run( std::move(repoMgr), std::move(info), std::move(options) ); } expected refreshService(SyncRepoManagerRef repoMgr, ServiceInfo info, zypp::RepoManagerFlags::RefreshServiceOptions options) { return SimpleExecutor>>::run( std::move(repoMgr), std::move(info), std::move(options) ); } } libzypp-17.36.5/zypp/ng/repo/workflows/serviceswf.h000066400000000000000000000040501476576476200223560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_SERVICES_WORKFLOW_INCLUDED #define ZYPP_NG_SERVICES_WORKFLOW_INCLUDED #include #include #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (Context); ZYPP_FWD_DECL_TYPE_WITH_REFS (SyncContext); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProgressObserver); namespace RepoServicesWorkflow { AsyncOpRef>> fetchRepoListfromService( ContextRef ctx, zypp::Pathname root_r, ServiceInfo service, ProgressObserverRef myProgress = nullptr ); expected> fetchRepoListfromService( SyncContextRef ctx, zypp::Pathname root_r, ServiceInfo service, ProgressObserverRef myProgress = nullptr ); AsyncOpRef > probeServiceType( ContextRef ctx, const zypp::Url &url ); expected probeServiceType ( SyncContextRef ctx, const zypp::Url &url ); AsyncOpRef> refreshService ( AsyncRepoManagerRef repoMgr, zypp::ServiceInfo info, zypp::RepoManagerFlags::RefreshServiceOptions options ); expected refreshService ( SyncRepoManagerRef repoMgr, zypp::ServiceInfo info, zypp::RepoManagerFlags::RefreshServiceOptions options ); } } // namespace zyppng; #endif libzypp-17.36.5/zypp/ng/repo/workflows/susetags.cc000066400000000000000000000375321476576476200222050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "susetags.h" #include "zypp-core/base/Regex.h" #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" namespace zyppng::SuseTagsWorkflows { namespace { using namespace zyppng::operators; /*! * Implementation of the susetags status calculation logic * * \TODO this is basically the same as the RPMMD workflow with changed filenames, can we unite them? */ template struct StatusLogic : public LogicBase{ ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using DlContextRefType = std::conditional_t, repo::AsyncDownloadContextRef, repo::SyncDownloadContextRef>; using ZyppContextType = typename DlContextRefType::element_type::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; StatusLogic( DlContextRefType ctx, MediaHandle &&media ) : _ctx(std::move(ctx)) , _handle(std::move(media)) {} MaybeAsyncRef> execute() { return _ctx->zyppContext()->provider()->provide( _handle, _ctx->repoInfo().path() / "content" , ProvideFileSpec() ) | [this]( expected contentFile ) { // mandatory master index is missing -> stay empty if ( !contentFile ) return makeReadyResult( make_expected_success (zypp::RepoStatus() )); zypp::RepoStatus status ( contentFile->file() ); if ( !status.empty() /* && _ctx->repoInfo().requireStatusWithMediaFile() */ ) { return _ctx->zyppContext()->provider()->provide( _handle, "/media.1/media" , ProvideFileSpec()) | [status = std::move(status)]( expected mediaFile ) mutable { if ( mediaFile ) { return make_expected_success(status && zypp::RepoStatus( mediaFile->file()) ); } return make_expected_success( std::move(status) ); }; } return makeReadyResult( make_expected_success(std::move(status)) ); }; } DlContextRefType _ctx; MediaHandle _handle; }; } AsyncOpRef > repoStatus(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle) { return SimpleExecutor< StatusLogic, AsyncOp> >::run( std::move(dl), std::move(mediaHandle) ); } expected repoStatus(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle) { return SimpleExecutor< StatusLogic, SyncOp> >::run( std::move(dl), std::move(mediaHandle) ); } namespace { using namespace zyppng::operators; // search old repository file file to run the delta algorithm on static zypp::Pathname search_deltafile( const zypp::Pathname &dir, const zypp::Pathname &file ) { zypp::Pathname deltafile(dir + file.basename()); if (zypp::PathInfo(deltafile).isExist()) return deltafile; return zypp::Pathname(); } template struct DlLogic : public LogicBase { ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: using DlContextRefType = std::conditional_t, repo::AsyncDownloadContextRef, repo::SyncDownloadContextRef>; using ZyppContextType = typename DlContextRefType::element_type::ContextType; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; DlLogic( DlContextRefType ctx, MediaHandle &&mediaHandle, ProgressObserverRef &&progressObserver ) : _ctx( std::move(ctx)) , _mediaHandle(std::move(mediaHandle)) , _progressObserver(std::move(progressObserver)) {} auto execute() { // download media file here return RepoDownloaderWorkflow::downloadMediaInfo( _mediaHandle, _ctx->destDir() ) | [this]( expected &&mediaInfo ) { // remember the media info if we had one if ( mediaInfo ) _ctx->files().push_back ( std::move(mediaInfo.get()) ); if ( _progressObserver ) _progressObserver->inc(); return RepoDownloaderWorkflow::downloadMasterIndex( _ctx, _mediaHandle, _ctx->repoInfo().path() / "content" ) | inspect( incProgress( _progressObserver ) ) | and_then( [this] ( DlContextRefType && ) { zypp::Pathname contentPath = _ctx->files().front(); std::vector requiredFiles; // Content file first to get the repoindex try { const zypp::Pathname &inputfile = contentPath; zypp::parser::susetags::ContentFileReader content; content.setRepoIndexConsumer( [this]( const auto & data_r ) { MIL << "Consuming repo index" << std::endl; _repoindex = data_r; }); content.parse( inputfile ); if ( ! _repoindex ) { ZYPP_THROW( zypp::parser::ParseException( ( _ctx->destDir() / _ctx->repoInfo().path() ).asString() + ": " + "No repository index in content file." ) ); } MIL << "RepoIndex: " << _repoindex << std::endl; if ( _repoindex->metaFileChecksums.empty() ) { ZYPP_THROW( zypp::parser::ParseException( ( _ctx->destDir() / _ctx->repoInfo().path() ).asString() + ": " + "No metadata checksums in content file." ) ); } if ( _repoindex->signingKeys.empty() ) { WAR << "No signing keys defined." << std::endl; } // Prepare parsing zypp::Pathname descr_dir = _repoindex->descrdir; // path below reporoot //_datadir = _repoIndex->datadir; // path below reporoot std::map availablePackageTranslations; for_( it, _repoindex->metaFileChecksums.begin(), _repoindex->metaFileChecksums.end() ) { // omit unwanted translations if ( zypp::str::hasPrefix( it->first, "packages" ) ) { static const zypp::str::regex rx_packages( "^packages((.gz)?|(.([^.]*))(.gz)?)$" ); zypp::str::smatch what; if ( zypp::str::regex_match( it->first, what, rx_packages ) ) { if ( what[4].empty() // packages(.gz)? || what[4] == "DU" || what[4] == "en" ) { ; /* always downloaded */ } else if ( what[4] == "FL" ) { continue; /* never downloaded */ } else { // remember and decide later availablePackageTranslations[what[4]] = it; continue; } } else continue; // discard } else if ( it->first == "patterns.pat" || it->first == "patterns.pat.gz" ) { // take all patterns in one go } else if ( zypp::str::endsWith( it->first, ".pat" ) || zypp::str::endsWith( it->first, ".pat.gz" ) ) { // *** see also zypp/parser/susetags/RepoParser.cc *** // omit unwanted patterns, see https://bugzilla.novell.com/show_bug.cgi?id=298716 // expect "..pat[.gz]", might contain additional dots // split at dots, take .pat or .pat.gz into account std::vector patparts; unsigned archpos = 2; // expect "..pat[.gz]", might contain additional dots unsigned count = zypp::str::split( it->first, std::back_inserter(patparts), "." ); if ( patparts[count-1] == "gz" ) archpos++; if ( count > archpos ) { try { // might by an invalid architecture zypp::Arch patarch( patparts[count-archpos] ); if ( !patarch.compatibleWith( zConfig().systemArchitecture() ) ) { // discard, if not compatible MIL << "Discarding pattern " << it->first << std::endl; continue; } } catch ( const zypp::Exception & excpt ) { WAR << "Pattern file name does not contain recognizable architecture: " << it->first << std::endl; // keep .pat file if it doesn't contain an recognizable arch } } } MIL << "adding job " << it->first << std::endl; auto location = zypp::OnMediaLocation( repoInfo().path() + descr_dir + it->first, 1 ) .setChecksum( it->second ) .setDeltafile( search_deltafile( _ctx->deltaDir() + descr_dir, it->first) ); requiredFiles.push_back( std::move(location) ); } // check whether to download more package translations: { auto fnc_checkTransaltions( [&]( const zypp::Locale & locale_r ) { for ( zypp::Locale toGet( locale_r ); toGet; toGet = toGet.fallback() ) { auto it( availablePackageTranslations.find( toGet.code() ) ); if ( it != availablePackageTranslations.end() ) { auto mit( it->second ); MIL << "adding job " << mit->first << std::endl; requiredFiles.push_back( zypp::OnMediaLocation( repoInfo().path() + descr_dir + mit->first, 1 ) .setChecksum( mit->second ) .setDeltafile( search_deltafile( deltaDir() + descr_dir, mit->first) )); break; } } }); for ( const zypp::Locale & it : zConfig().repoRefreshLocales() ) { fnc_checkTransaltions( it ); } fnc_checkTransaltions( zConfig().textLocale() ); } for( const auto &it : _repoindex->mediaFileChecksums ) { // Repo adopts license files listed in HASH if ( it.first != "license.tar.gz" ) continue; MIL << "adding job " << it.first << std::endl; requiredFiles.push_back( zypp::OnMediaLocation ( repoInfo().path() + it.first, 1 ) .setChecksum( it.second ) .setDeltafile( search_deltafile( deltaDir(), it.first ) )); } for( const auto &it : _repoindex->signingKeys ) { MIL << "adding job " << it.first << std::endl; zypp::OnMediaLocation location( repoInfo().path() + it.first, 1 ); location.setChecksum( it.second ); requiredFiles.push_back( std::move(location) ); } } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT( e ); return makeReadyResult(expected::error( ZYPP_FWD_CURRENT_EXCPT() ) ); } catch ( ... ) { return makeReadyResult(expected::error( ZYPP_FWD_CURRENT_EXCPT() ) ); } // add the required files to the base steps if ( _progressObserver ) _progressObserver->setBaseSteps ( _progressObserver->baseSteps () + requiredFiles.size() ); return transform_collect ( std::move(requiredFiles), [this]( zypp::OnMediaLocation file ) { return DownloadWorkflow::provideToCacheDir( _ctx, _mediaHandle, file.filename(), ProvideFileSpec(file) ) | inspect ( incProgress( _progressObserver ) ); }) | and_then ( [this]( std::vector &&dlFiles ) { auto &downloadedFiles = _ctx->files(); downloadedFiles.insert( downloadedFiles.end(), std::make_move_iterator(dlFiles.begin()), std::make_move_iterator(dlFiles.end()) ); return expected::success( std::move(_ctx) ); }); }); } | finishProgress( _progressObserver ); } private: const zypp::RepoInfo &repoInfo() const { return _ctx->repoInfo(); } const zypp::filesystem::Pathname &deltaDir() const { return _ctx->deltaDir(); } zypp::ZConfig &zConfig() { return _ctx->zyppContext()->config(); } DlContextRefType _ctx; zypp::parser::susetags::RepoIndex_Ptr _repoindex; MediaHandle _mediaHandle; ProgressObserverRef _progressObserver; }; } AsyncOpRef > download(repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return SimpleExecutor< DlLogic, AsyncOp> >::run( std::move(dl), std::move(mediaHandle), std::move(progressObserver) ); } expected download(repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver) { return SimpleExecutor< DlLogic, SyncOp> >::run( std::move(dl), std::move(mediaHandle), std::move(progressObserver) ); } } libzypp-17.36.5/zypp/ng/repo/workflows/susetags.h000066400000000000000000000037271476576476200220460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_SUSETAGS_WORKFLOW_INCLUDED #define ZYPP_NG_SUSETAGS_WORKFLOW_INCLUDED #include #include #include #include #include namespace zyppng { class ProvideMediaHandle; class SyncMediaHandle; ZYPP_FWD_DECL_TYPE_WITH_REFS( ProgressObserver ); /** * \short Download workflow namespace for SUSETags (YaST2) repositories * Encapsulates all the knowledge of which files have * to be downloaded to the local disk and how to calculate the repo status. */ namespace SuseTagsWorkflows { /*! * Calculate status of the remote SUSETags repository */ AsyncOpRef> repoStatus( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle ); expected repoStatus( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle ); /*! * Download metadata to a local directory */ AsyncOpRef> download ( repo::AsyncDownloadContextRef dl, ProvideMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); expected download ( repo::SyncDownloadContextRef dl, SyncMediaHandle mediaHandle, ProgressObserverRef progressObserver = nullptr ); } } #endif // ZYPP_NG_SUSETAGS_WORKFLOW_INCLUDED libzypp-17.36.5/zypp/ng/repomanager.cc000066400000000000000000001600051476576476200176350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "repomanager.h" #include "zypp-core/ExternalProgram.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 #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::repomanager" namespace zypp::zypp_readonly_hack { bool IGotIt(); // in readonly-mode } namespace zyppng { namespace env { /** To trigger appdata refresh unconditionally */ inline bool ZYPP_PLUGIN_APPDATA_FORCE_COLLECT() { const char * env = getenv("ZYPP_PLUGIN_APPDATA_FORCE_COLLECT"); return( env && zypp::str::strToBool( env, true ) ); } } // namespace env namespace { /** Delete \a cachePath_r subdirs not matching known aliases in \a repoEscAliases_r (must be sorted!) * \note bnc#891515: Auto-cleanup only zypp.conf default locations. Otherwise * we'd need some magic file to identify zypp cache directories. Without this * we may easily remove user data (zypper --pkg-cache-dir . download ...) */ inline void cleanupNonRepoMetadataFolders( const zypp::Pathname & cachePath_r, const zypp::Pathname & defaultCachePath_r, const std::list & repoEscAliases_r ) { if ( cachePath_r != defaultCachePath_r ) return; std::list entries; if ( zypp::filesystem::readdir( entries, cachePath_r, false ) == 0 ) { entries.sort(); std::set oldfiles; set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(), std::inserter( oldfiles, oldfiles.end() ) ); // bsc#1178966: Files or symlinks here have been created by the user // for whatever purpose. It's our cache, so we purge them now before // they may later conflict with directories we need. zypp::PathInfo pi; for ( const std::string & old : oldfiles ) { if ( old == zypp::Repository::systemRepoAlias() ) // don't remove the @System solv file continue; pi( cachePath_r/old ); if ( pi.isDir() ) zypp::filesystem::recursive_rmdir( pi.path() ); else zypp::filesystem::unlink( pi.path() ); } } } } // namespace std::ostream & operator<<( std::ostream & str, zypp::RepoManagerFlags::RawMetadataRefreshPolicy obj ) { switch ( obj ) { #define OUTS(V) case zypp::RepoManagerFlags::V: str << #V; break OUTS( RefreshIfNeeded ); OUTS( RefreshForced ); OUTS( RefreshIfNeededIgnoreDelay ); #undef OUTS } return str; } std::ostream & operator<<( std::ostream & str, zypp::RepoManagerFlags::RefreshCheckStatus obj ) { switch ( obj ) { #define OUTS(V) case zypp::RepoManagerFlags::V: str << #V; break OUTS( REFRESH_NEEDED ); OUTS( REPO_UP_TO_DATE ); OUTS( REPO_CHECK_DELAYED ); #undef OUTS } return str; } std::ostream & operator<<( std::ostream & str, zypp::RepoManagerFlags::CacheBuildPolicy obj ) { switch ( obj ) { #define OUTS(V) case zypp::RepoManagerFlags::V: str << #V; break OUTS( BuildIfNeeded ); OUTS( BuildForced ); #undef OUTS } return str; } std::string filenameFromAlias(const std::string &alias_r, const std::string &stem_r) { std::string filename( alias_r ); // replace slashes with underscores zypp::str::replaceAll( filename, "/", "_" ); filename = zypp::Pathname(filename).extend("."+stem_r).asString(); MIL << "generating filename for " << stem_r << " [" << alias_r << "] : '" << filename << "'" << std::endl; return filename; } bool RepoCollector::collect(const RepoInfo &repo) { // skip repositories meant for other distros than specified if (!targetDistro.empty() && !repo.targetDistribution().empty() && repo.targetDistribution() != targetDistro) { MIL << "Skipping repository meant for '" << repo.targetDistribution() << "' distribution (current distro is '" << targetDistro << "')." << std::endl; return true; } repos.push_back(repo); return true; } expected> repositories_in_file(const zypp::Pathname &file) { try { MIL << "repo file: " << file << std::endl; RepoCollector collector; zypp::parser::RepoFileReader parser( file, std::bind( &RepoCollector::collect, &collector, std::placeholders::_1 ) ); return expected>::success( std::move(collector.repos) ); } catch ( ... ) { return expected>::error( ZYPP_FWD_CURRENT_EXCPT() ); } } /** * \short List of RepoInfo's from a directory * * Goes trough every file ending with ".repo" in a directory and adds all * RepoInfo's contained in that file. * * \param zyppContext current context used for reports * \param dir pathname of the directory to read. */ template std::list repositories_in_dir( ZContextRef zyppContext, const zypp::Pathname &dir ) { MIL << "directory " << dir << std::endl; std::list repos; bool nonroot( geteuid() != 0 ); if ( nonroot && ! zypp::PathInfo(dir).userMayRX() ) { JobReportHelper(zyppContext).warning( zypp::str::Format(_("Cannot read repo directory '%1%': Permission denied")) % dir ); } else { std::list entries; if ( zypp::filesystem::readdir( entries, dir, false ) != 0 ) { // TranslatorExplanation '%s' is a pathname ZYPP_THROW(zypp::Exception(zypp::str::form(_("Failed to read directory '%s'"), dir.c_str()))); } zypp::str::regex allowedRepoExt("^\\.repo(_[0-9]+)?$"); for ( std::list::const_iterator it = entries.begin(); it != entries.end(); ++it ) { if ( zypp::str::regex_match(it->extension(), allowedRepoExt) ) { if ( nonroot && ! zypp::PathInfo(*it).userMayR() ) { JobReportHelper(zyppContext).warning( zypp::str::Format(_("Cannot read repo file '%1%': Permission denied")) % *it ); } else { const std::list tmp( repositories_in_file( *it ).unwrap() ); repos.insert( repos.end(), tmp.begin(), tmp.end() ); } } } } return repos; } expected assert_urls(const RepoInfo &info) { if ( info.baseUrlsEmpty() ) return expected::error( ZYPP_EXCPT_PTR ( zypp::repo::RepoNoUrlException( info ) ) ); return expected::success(); } bool autoPruneInDir(const zypp::Pathname &path_r) { return not zypp::PathInfo(path_r/".no_auto_prune").isExist(); } template RepoManager::RepoManager( ZYPP_PRIVATE_CONSTR_ARG, ZyppContextRefType zyppCtx, RepoManagerOptions opt ) : _zyppContext( std::move(zyppCtx) ) , _options( std::move(opt) ) , _pluginRepoverification( _options.pluginsPath / "repoverification", _options.rootDir) { } template RepoManager::~RepoManager() { // trigger appdata refresh if some repos change if ( ( _reposDirty || env::ZYPP_PLUGIN_APPDATA_FORCE_COLLECT() ) && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir == "/" ) ) { try { std::list entries; zypp::filesystem::readdir( entries, _options.pluginsPath/"appdata", false ); if ( ! entries.empty() ) { zypp::ExternalProgram::Arguments cmd; cmd.push_back( "<" ); // discard stdin cmd.push_back( ">" ); // discard stdout cmd.push_back( "PROGRAM" ); // [2] - fix index below if changing! for ( const auto & rinfo : repos() ) { if ( ! rinfo.enabled() ) continue; cmd.push_back( "-R" ); cmd.push_back( rinfo.alias() ); cmd.push_back( "-t" ); cmd.push_back( rinfo.type().asString() ); cmd.push_back( "-p" ); cmd.push_back( (rinfo.metadataPath()/rinfo.path()).asString() ); // bsc#1197684: path to the repodata/ directory inside the cache } for_( it, entries.begin(), entries.end() ) { zypp::PathInfo pi( *it ); //DBG << "/tmp/xx ->" << pi << endl; if ( pi.isFile() && pi.userMayRX() ) { // trigger plugin cmd[2] = pi.asString(); // [2] - PROGRAM zypp::ExternalProgram prog( cmd, zypp::ExternalProgram::Stderr_To_Stdout ); } } } } catch (...) {} // no throw in dtor } } template expected RepoManager::initialize() { using namespace zyppng::operators; return init_knownServices() | and_then( [this](){ return init_knownRepositories(); } ); } template const RepoManagerOptions &RepoManager::options() const { return _options; } template expected RepoManager::metadataStatus(const RepoInfo & info , const RepoManagerOptions &options) { try { using namespace zyppng::operators; // ATTENTION when making this pipeline async // consider moving it into a workflow object // this var is caputured by ref to modify it from // inside the pipeline, which would break. zypp::Pathname mediarootpath; return rawcache_path_for_repoinfo( options, info ) | and_then( [&]( zypp::Pathname mrPath ) { mediarootpath = std::move(mrPath); return rawproductdata_path_for_repoinfo( options, info ); }) | and_then( [&]( zypp::Pathname productdatapath ) { zypp::repo::RepoType repokind = info.type(); // If unknown, probe the local metadata if ( repokind == zypp::repo::RepoType::NONE ) repokind = probeCache( productdatapath ); // NOTE: The calling code expects an empty RepoStatus being returned // if the metadata cache is empty. So additional components like the // RepoInfos status are joined after the switch IFF the status is not // empty.huhu RepoStatus status; switch ( repokind.toEnum() ) { case zypp::repo::RepoType::RPMMD_e : status = RepoStatus( productdatapath/"repodata/repomd.xml"); if ( info.requireStatusWithMediaFile() ) status = status && RepoStatus( mediarootpath/"media.1/media" ); break; case zypp::repo::RepoType::YAST2_e : status = RepoStatus( productdatapath/"content" ) && RepoStatus( mediarootpath/"media.1/media" ); break; case zypp::repo::RepoType::RPMPLAINDIR_e : // Dir status at last refresh. Plaindir uses the cookiefile as pseudo metadata index file. // It gets touched if the refresh check finds the data being up-to-date. That's why we use // the files mtime as timestamp (like the RepoStatus ctor in the other cases above). status = RepoStatus::fromCookieFileUseMtime( productdatapath/"cookie" ); break; case zypp::repo::RepoType::NONE_e : // Return default RepoStatus in case of RepoType::NONE // indicating it should be created? // ZYPP_THROW(RepoUnknownTypeException()); break; } if ( ! status.empty() ) status = status && RepoStatus( info ); return expected::success(status); }); } catch (...) { return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } template expected RepoManager::metadataStatus(const RepoInfo &info) const { return metadataStatus( info, _options ); } template expected RepoManager::cleanMetadata(const RepoInfo &info, ProgressObserverRef myProgress ) { try { ProgressObserver::setup( myProgress, _("Cleaning metadata"), 100 ); ProgressObserver::start( myProgress ); zypp::filesystem::recursive_rmdir( _zyppContext->config().geoipCachePath() ); ProgressObserver::setCurrent ( myProgress, 50 ); zypp::filesystem::recursive_rmdir( rawcache_path_for_repoinfo(_options, info).unwrap() ); ProgressObserver::finish ( myProgress ); } catch ( ... ) { ProgressObserver::finish ( myProgress, ProgressObserver::Error ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } return expected::success(); } template expected RepoManager::cleanPackages(const RepoInfo &info, ProgressObserverRef myProgress, bool isAutoClean ) { try { ProgressObserver::setup( myProgress, _("Cleaning packages"), 100 ); ProgressObserver::start( myProgress ); // bsc#1204956: Tweak to prevent auto pruning package caches zypp::Pathname rpc { packagescache_path_for_repoinfo(_options, info).unwrap() }; if ( not isAutoClean || autoPruneInDir( rpc.dirname() ) ) zypp::filesystem::recursive_rmdir( rpc ); ProgressObserver::finish ( myProgress ); } catch (...) { ProgressObserver::finish ( myProgress, ProgressObserver::Error ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } return expected::success(); } /** Probe Metadata in a local cache directory * * \note Metadata in local cache directories must not be probed using \ref probe as * a cache path must not be rewritten (bnc#946129) */ template zypp::repo::RepoType RepoManager::probeCache( const zypp::Pathname & path_r ) { MIL << "going to probe the cached repo at " << path_r << std::endl; zypp::repo::RepoType ret = zypp::repo::RepoType::NONE; if ( zypp::PathInfo(path_r/"/repodata/repomd.xml").isFile() ) { ret = zypp::repo::RepoType::RPMMD; } else if ( zypp::PathInfo(path_r/"/content").isFile() ) { ret = zypp::repo::RepoType::YAST2; } else if ( zypp::PathInfo(path_r/"/cookie").isFile() ) { ret = zypp::repo::RepoType::RPMPLAINDIR; } MIL << "Probed cached type " << ret << " at " << path_r << std::endl; return ret; } template expected RepoManager::cleanCacheDirGarbage( ProgressObserverRef myProgress ) { try { MIL << "Going to clean up garbage in cache dirs" << std::endl; std::list cachedirs; cachedirs.push_back(_options.repoRawCachePath); cachedirs.push_back(_options.repoPackagesCachePath); cachedirs.push_back(_options.repoSolvCachePath); ProgressObserver::setup( myProgress, _("Cleaning up cache dirs"), cachedirs.size() ); ProgressObserver::start( myProgress ); for( const auto &dir : cachedirs ) { // increase progress on end of every iteration zypp_defer { ProgressObserver::increase( myProgress ); }; if ( zypp::PathInfo(dir).isExist() ) { std::list entries; if ( zypp::filesystem::readdir( entries, dir, false ) != 0 ) // TranslatorExplanation '%s' is a pathname ZYPP_THROW(zypp::Exception(zypp::str::form(_("Failed to read directory '%s'"), dir.c_str()))); if ( !entries.size() ) continue; auto dirProgress = ProgressObserver::makeSubTask( myProgress, 1.0, zypp::str::Format( _("Cleaning up directory: %1%") ) % dir, entries.size() ); for( const auto &subdir : entries ) { // if it does not belong known repo, make it disappear bool found = false; for_( r, repoBegin(), repoEnd() ) if ( subdir.basename() == r->escaped_alias() ) { found = true; break; } if ( ! found && ( zypp::Date::now()-zypp::PathInfo(subdir).mtime() > zypp::Date::day ) ) zypp::filesystem::recursive_rmdir( subdir ); ProgressObserver::increase( dirProgress ); } ProgressObserver::finish( dirProgress ); } } } catch (...) { // will finish all subprogress children ProgressObserver::finish ( myProgress, ProgressObserver::Error ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } ProgressObserver::finish ( myProgress ); return expected::success(); } template expected RepoManager::cleanCache(const RepoInfo &info, ProgressObserverRef myProgress ) { try { ProgressObserver::setup( myProgress, _("Cleaning cache"), 100 ); ProgressObserver::start( myProgress ); MIL << "Removing raw metadata cache for " << info.alias() << std::endl; zypp::filesystem::recursive_rmdir(solv_path_for_repoinfo(_options, info).unwrap()); ProgressObserver::finish( myProgress ); return expected::success(); } catch (...) { // will finish all subprogress children ProgressObserver::finish ( myProgress, ProgressObserver::Error ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } template expected RepoManager::loadFromCache( const RepoInfo & info, ProgressObserverRef myProgress ) { using namespace zyppng::operators; return zyppng::mtry( [this, info, myProgress](){ ProgressObserver::setup( myProgress, _("Loading from cache"), 3 ); ProgressObserver::start( myProgress ); assert_alias(info).unwrap(); zypp::Pathname solvfile = solv_path_for_repoinfo(_options, info).unwrap() / "solv"; if ( ! zypp::PathInfo(solvfile).isExist() ) ZYPP_THROW(zypp::repo::RepoNotCachedException(info)); _zyppContext->satPool().reposErase( info.alias() ); ProgressObserver::increase ( myProgress ); zypp::Repository repo = _zyppContext->satPool().addRepoSolv( solvfile, info ); ProgressObserver::increase ( myProgress ); // test toolversion in order to rebuild solv file in case // it was written by a different libsolv-tool parser. const std::string & toolversion( zypp::sat::LookupRepoAttr( zypp::sat::SolvAttr::repositoryToolVersion, repo ).begin().asString() ); if ( toolversion != LIBSOLV_TOOLVERSION ) { repo.eraseFromPool(); ZYPP_THROW(zypp::Exception(zypp::str::Str() << "Solv-file was created by '"<satPool().addRepoSolv( solv_path_for_repoinfo(_options, info).unwrap() / "solv", info ); })); }) | and_then([myProgress]{ ProgressObserver::finish ( myProgress ); return expected::success(); }) | or_else([myProgress]( auto ex ){ ProgressObserver::finish ( myProgress, ProgressObserver::Error ); return expected::error(ex); }) ; } template expected RepoManager::addProbedRepository( RepoInfo info, zypp::repo::RepoType probedType ) { try { auto tosave = info; // assert the directory exists zypp::filesystem::assert_dir(_options.knownReposPath); zypp::Pathname repofile = generateNonExistingName( _options.knownReposPath, generateFilename(tosave)); // now we have a filename that does not exists MIL << "Saving repo in " << repofile << std::endl; std::ofstream file(repofile.c_str()); if (!file) { // TranslatorExplanation '%s' is a filename ZYPP_THROW( zypp::Exception(zypp::str::form( _("Can't open file '%s' for writing."), repofile.c_str() ))); } tosave.dumpAsIniOn(file); tosave.setFilepath(repofile); tosave.setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ).unwrap() ); tosave.setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ).unwrap() ); reposManip().insert(tosave); // check for credentials in Urls zypp::UrlCredentialExtractor( _options.rootDir ).collect( tosave.baseUrls() ); zypp::HistoryLog(_options.rootDir).addRepository(tosave); // return the new repoinfo return expected::success( tosave ); } catch (...) { return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } template expected RepoManager::removeRepository( const RepoInfo & info, ProgressObserverRef myProgress ) { try { ProgressObserver::setup( myProgress, zypp::str::form(_("Removing repository '%s'"), info.label().c_str()), 1 ); ProgressObserver::start( myProgress ); MIL << "Going to delete repo " << info.alias() << std::endl; for( const auto &repo : repos() ) { // they can be the same only if the provided is empty, that means // the provided repo has no alias // then skip if ( (!info.alias().empty()) && ( info.alias() != repo.alias() ) ) continue; // TODO match by url // we have a matching repository, now we need to know // where it does come from. RepoInfo todelete = repo; if (todelete.filepath().empty()) { ZYPP_THROW(zypp::repo::RepoException( todelete, _("Can't figure out where the repo is stored.") )); } else { // figure how many repos are there in the file: std::list filerepos = repositories_in_file(todelete.filepath()).unwrap(); if ( filerepos.size() == 0 // bsc#984494: file may have already been deleted ||(filerepos.size() == 1 && filerepos.front().alias() == todelete.alias() ) ) { // easy: file does not exist, contains no or only the repo to delete: delete the file int ret = zypp::filesystem::unlink( todelete.filepath() ); if ( ! ( ret == 0 || ret == ENOENT ) ) { // TranslatorExplanation '%s' is a filename ZYPP_THROW(zypp::repo::RepoException( todelete, zypp::str::form( _("Can't delete '%s'"), todelete.filepath().c_str() ))); } MIL << todelete.alias() << " successfully deleted." << std::endl; } else { // there are more repos in the same file // write them back except the deleted one. //TmpFile tmp; //std::ofstream file(tmp.path().c_str()); // assert the directory exists zypp::filesystem::assert_dir(todelete.filepath().dirname()); std::ofstream file(todelete.filepath().c_str()); if (!file) { // TranslatorExplanation '%s' is a filename ZYPP_THROW( zypp::Exception(zypp::str::form( _("Can't open file '%s' for writing."), todelete.filepath().c_str() ))); } for ( std::list::const_iterator fit = filerepos.begin(); fit != filerepos.end(); ++fit ) { if ( (*fit).alias() != todelete.alias() ) (*fit).dumpAsIniOn(file); } } // now delete it from cache if ( isCached(todelete) ) cleanCache( todelete, ProgressObserver::makeSubTask( myProgress, 0.2 )).unwrap(); // now delete metadata (#301037) cleanMetadata( todelete, ProgressObserver::makeSubTask( myProgress, 0.4 )).unwrap(); cleanPackages( todelete, ProgressObserver::makeSubTask( myProgress, 0.4 ), true/*isAutoClean*/ ).unwrap(); reposManip().erase(todelete); MIL << todelete.alias() << " successfully deleted." << std::endl; zypp::HistoryLog(_options.rootDir).removeRepository(todelete); ProgressObserver::finish(myProgress); return expected::success(); } // else filepath is empty } // should not be reached on a sucess workflow ZYPP_THROW(zypp::repo::RepoNotFoundException(info)); } catch (...) { ProgressObserver::finish( myProgress, ProgressObserver::Error ); return expected::error( std::current_exception () ); } } template expected RepoManager::modifyRepository( const std::string & alias, const RepoInfo & newinfo_r, ProgressObserverRef myProgress ) { try { ProgressObserver::setup( myProgress, _("Modifying repository"), 5 ); ProgressObserver::start( myProgress ); RepoInfo toedit = getRepositoryInfo(alias).unwrap(); RepoInfo newinfo( newinfo_r ); // need writable copy to upadte housekeeping data // check if the new alias already exists when renaming the repo if ( alias != newinfo.alias() && hasRepo( newinfo.alias() ) ) { ZYPP_THROW(zypp::repo::RepoAlreadyExistsException(newinfo)); } if (toedit.filepath().empty()) { ZYPP_THROW(zypp::repo::RepoException( toedit, _("Can't figure out where the repo is stored.") )); } else { ProgressObserver::increase( myProgress ); // figure how many repos are there in the file: std::list filerepos = repositories_in_file(toedit.filepath()).unwrap(); // there are more repos in the same file // write them back except the deleted one. //TmpFile tmp; //std::ofstream file(tmp.path().c_str()); // assert the directory exists zypp::filesystem::assert_dir(toedit.filepath().dirname()); std::ofstream file(toedit.filepath().c_str()); if (!file) { // TranslatorExplanation '%s' is a filename ZYPP_THROW( zypp::Exception(zypp::str::form( _("Can't open file '%s' for writing."), toedit.filepath().c_str() ))); } for ( std::list::const_iterator fit = filerepos.begin(); fit != filerepos.end(); ++fit ) { // if the alias is different, dump the original // if it is the same, dump the provided one if ( (*fit).alias() != toedit.alias() ) (*fit).dumpAsIniOn(file); else newinfo.dumpAsIniOn(file); } ProgressObserver::increase( myProgress ); if ( toedit.enabled() && !newinfo.enabled() ) { // On the fly remove solv.idx files for bash completion if a repo gets disabled. const zypp::Pathname solvidx = solv_path_for_repoinfo(_options, newinfo).unwrap()/"solv.idx"; if ( zypp::PathInfo(solvidx).isExist() ) zypp::filesystem::unlink( solvidx ); } newinfo.setFilepath(toedit.filepath()); newinfo.setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ).unwrap() ); newinfo.setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ).unwrap() ); ProgressObserver::increase( myProgress ); reposManip().erase(toedit); reposManip().insert(newinfo); ProgressObserver::increase( myProgress ); // check for credentials in Urls zypp::UrlCredentialExtractor( _options.rootDir ).collect( newinfo.baseUrls() ); zypp::HistoryLog(_options.rootDir).modifyRepository(toedit, newinfo); MIL << "repo " << alias << " modified" << std::endl; ProgressObserver::finish ( myProgress ); return expected::success( newinfo ); } } catch ( ... ) { ProgressObserver::finish ( myProgress, ProgressObserver::Error ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } template expected RepoManager::getRepositoryInfo( const std::string & alias ) { try { RepoConstIterator it( findAlias( alias, repos() ) ); if ( it != repos().end() ) return make_expected_success(*it); RepoInfo info; info.setAlias( alias ); ZYPP_THROW( zypp::repo::RepoNotFoundException(info) ); } catch ( ... ) { return expected::error( std::current_exception () ); } } template expected RepoManager::getRepositoryInfo( const zypp::Url & url, const zypp::url::ViewOption & urlview ) { try { for_( it, repoBegin(), repoEnd() ) { for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() ) { if ( (*urlit).asString(urlview) == url.asString(urlview) ) return make_expected_success(*it); } } RepoInfo info; info.setBaseUrl( url ); ZYPP_THROW( zypp::repo::RepoNotFoundException(info) ); } catch ( ... ) { return expected::error( std::current_exception () ); } } template expected::RefreshCheckStatus> RepoManager::checkIfToRefreshMetadata(const RepoInfo &info, const zypp::Url &url, RawMetadataRefreshPolicy policy) { using namespace zyppng::operators; return joinPipeline( _zyppContext, RepoManagerWorkflow::refreshGeoIPData( _zyppContext, {url} ) | [this, info](auto) { return zyppng::repo::RefreshContext::create( _zyppContext, info, shared_this>() ); } | and_then( [this, url, policy]( zyppng::repo::RefreshContextRef &&refCtx ) { refCtx->setPolicy ( static_cast( policy ) ); return _zyppContext->provider()->prepareMedia( url, zyppng::ProvideMediaSpec() ) | and_then( [ r = std::move(refCtx) ]( auto mediaHandle ) mutable { return zyppng::RepoManagerWorkflow::checkIfToRefreshMetadata ( std::move(r), std::move(mediaHandle), nullptr ); } ); }) ); } template expected RepoManager::refreshMetadata( const RepoInfo &info, RawMetadataRefreshPolicy policy, ProgressObserverRef myProgress ) { using namespace zyppng::operators; // helper callback in case the repo type changes on the remote // do NOT capture by reference here, since this is possibly executed async const auto &updateProbedType = [this, info = info]( zypp::repo::RepoType repokind ) { // update probed type only for repos in system for( const auto &repo : repos() ) { if ( info.alias() == repo.alias() ) { RepoInfo modifiedrepo = repo; modifiedrepo.setType( repokind ); // don't modify .repo in refresh. // modifyRepository( info.alias(), modifiedrepo ); break; } } }; return joinPipeline( _zyppContext, // make sure geoIP data is up 2 date, but ignore errors RepoManagerWorkflow::refreshGeoIPData( _zyppContext, info.baseUrls() ) | [this, info = info](auto) { return zyppng::repo::RefreshContext::create( _zyppContext, info, shared_this>()); } | and_then( [policy, myProgress, cb = updateProbedType]( repo::RefreshContextRef refCtx ) { refCtx->setPolicy( static_cast( policy ) ); // in case probe detects a different repokind, update our internal repos refCtx->connectFunc( &repo::RefreshContext::sigProbedTypeChanged, cb ); return zyppng::RepoManagerWorkflow::refreshMetadata ( std::move(refCtx), myProgress ); }) | and_then([rMgr = shared_this>()]( repo::RefreshContextRef ctx ) { if ( ! isTmpRepo( ctx->repoInfo() ) ) rMgr->reposManip(); // remember to trigger appdata refresh return expected::success (); })); } template std::vector>> RepoManager::refreshMetadata( std::vector infos, RawMetadataRefreshPolicy policy, ProgressObserverRef myProgress ) { using namespace zyppng::operators; ProgressObserver::setup( myProgress, "Refreshing repositories" , 1 ); auto r = std::move(infos) | transform( [this, policy, myProgress]( const RepoInfo &info ) { auto subProgress = ProgressObserver::makeSubTask( myProgress, 1.0, zypp::str::Str() << _("Refreshing Repository: ") << info.alias(), 3 ); // helper callback in case the repo type changes on the remote // do NOT capture by reference here, since this is possibly executed async const auto &updateProbedType = [this, info = info]( zypp::repo::RepoType repokind ) { // update probed type only for repos in system for( const auto &repo : repos() ) { if ( info.alias() == repo.alias() ) { RepoInfo modifiedrepo = repo; modifiedrepo.setType( repokind ); // don't modify .repo in refresh. // modifyRepository( info.alias(), modifiedrepo ); break; } } }; auto sharedThis = shared_this>(); return // make sure geoIP data is up 2 date, but ignore errors RepoManagerWorkflow::refreshGeoIPData( _zyppContext, info.baseUrls() ) | [sharedThis, info = info](auto) { return zyppng::repo::RefreshContext::create( sharedThis->_zyppContext, info, sharedThis); } | inspect( incProgress( subProgress ) ) | and_then( [policy, subProgress, cb = updateProbedType]( repo::RefreshContextRef refCtx ) { refCtx->setPolicy( static_cast( policy ) ); // in case probe detects a different repokind, update our internal repos refCtx->connectFunc( &repo::RefreshContext::sigProbedTypeChanged, cb ); return zyppng::RepoManagerWorkflow::refreshMetadata ( std::move(refCtx), ProgressObserver::makeSubTask( subProgress ) ); }) | inspect( incProgress( subProgress ) ) | and_then([subProgress]( repo::RefreshContextRef ctx ) { if ( ! isTmpRepo( ctx->repoInfo() ) ) ctx->repoManager()->reposManip(); // remember to trigger appdata refresh return zyppng::RepoManagerWorkflow::buildCache ( std::move(ctx), CacheBuildPolicy::BuildIfNeeded, ProgressObserver::makeSubTask( subProgress ) ); }) | inspect( incProgress( subProgress ) ) | [ info = info, subProgress ]( expected> result ) { if ( result ) { ProgressObserver::finish( subProgress, ProgressObserver::Success ); return std::make_pair(info, expected::success() ); } else { ProgressObserver::finish( subProgress, ProgressObserver::Error ); return std::make_pair(info, expected::error( result.error() ) ); } }; } | [myProgress]( auto res ) { ProgressObserver::finish( myProgress, ProgressObserver::Success ); return res; } ); return joinPipeline( _zyppContext, r ); } /** Probe the metadata type of a repository located at \c url. * Urls here may be rewritten by \ref MediaSetAccess or \ref zyppng::Provide to reflect the correct media number. * * \note Metadata in local cache directories must be probed using \ref probeCache as * a cache path must not be rewritten (bnc#946129) */ template expected RepoManager::probe(const zypp::Url &url, const zypp::Pathname &path) const { using namespace zyppng::operators; return joinPipeline( _zyppContext, RepoManagerWorkflow::refreshGeoIPData( _zyppContext, {url} ) | [this, url=url](auto) { return _zyppContext->provider()->prepareMedia( url, zyppng::ProvideMediaSpec() ); } | and_then( [this, path = path]( auto mediaHandle ) { return RepoManagerWorkflow::probeRepoType( _zyppContext, std::forward(mediaHandle), path ); })); } template expected RepoManager::buildCache( const RepoInfo &info, CacheBuildPolicy policy, ProgressObserverRef myProgress ) { using namespace zyppng::operators; return joinPipeline( _zyppContext, zyppng::repo::RefreshContext::create( _zyppContext, info, shared_this>() ) | and_then( [policy, myProgress]( repo::RefreshContextRef refCtx ) { return zyppng::RepoManagerWorkflow::buildCache ( std::move(refCtx), policy, myProgress ); }) | and_then([]( auto ){ return expected::success(); }) ); } template expected RepoManager::addRepository(const RepoInfo &info, ProgressObserverRef myProgress) { return joinPipeline( _zyppContext, RepoManagerWorkflow::addRepository( shared_this>(), info, std::move(myProgress) ) ); } template expected RepoManager::addRepositories(const zypp::Url &url, ProgressObserverRef myProgress) { using namespace zyppng::operators; return joinPipeline( _zyppContext, RepoManagerWorkflow::addRepositories( shared_this>(), url, std::move(myProgress))); } template expected RepoManager::probeService( const zypp::Url & url ) const { return joinPipeline( _zyppContext, RepoServicesWorkflow::probeServiceType ( _zyppContext, url ) ); } template expected RepoManager::addService( const ServiceInfo & service ) { try { assert_alias( service ).unwrap(); // check if service already exists if ( hasService( service.alias() ) ) ZYPP_THROW( zypp::repo::ServiceAlreadyExistsException( service ) ); // Writable ServiceInfo is needed to save the location // of the .service file. Finaly insert into the service list. ServiceInfo toSave( service ); saveService( toSave ).unwrap(); _services.insert( toSave ); // check for credentials in Url zypp::UrlCredentialExtractor( _options.rootDir ).collect( toSave.url() ); MIL << "added service " << toSave.alias() << std::endl; } catch ( ... ) { return expected::error( std::current_exception () ); } return expected::success(); } template expected RepoManager::refreshService( const std::string &alias, const RefreshServiceOptions &options_r ) { return joinPipeline ( _zyppContext, RepoServicesWorkflow::refreshService( shared_this>(), getService( alias ), options_r ) ); } /*! * \todo ignore ServicePluginInformalException in calling code */ template expected RepoManager::refreshServices(const RefreshServiceOptions &options_r) { using namespace zyppng::operators; // copy the set of services since refreshService // can eventually invalidate the iterator ServiceSet servicesCopy( serviceBegin(), serviceEnd() ); // convert the set into a vector, transform needs a container with push_back support std::vector servicesVec; std::copy( std::make_move_iterator(servicesCopy.begin()), std::make_move_iterator(servicesCopy.end()), std::back_inserter(servicesVec)); return joinPipeline( _zyppContext, std::move(servicesVec) | transform( [options_r, this]( ServiceInfo i ){ return RepoServicesWorkflow::refreshService( shared_this>(), i, options_r ); } ) | join() | collect() ); } //////////////////////////////////////////////////////////////////////////// template expected RepoManager::removeService( const std::string & alias ) { try { MIL << "Going to delete service " << alias << std::endl; const ServiceInfo & service = getService( alias ); zypp::Pathname location = service.filepath(); if( location.empty() ) { ZYPP_THROW(zypp::repo::ServiceException( service, _("Can't figure out where the service is stored.") )); } ServiceSet tmpSet; zypp::parser::ServiceFileReader( location, ServiceCollector(tmpSet) ); // only one service definition in the file if ( tmpSet.size() == 1 ) { if ( zypp::filesystem::unlink(location) != 0 ) { // TranslatorExplanation '%s' is a filename ZYPP_THROW(zypp::repo::ServiceException( service, zypp::str::form( _("Can't delete '%s'"), location.c_str() ) )); } MIL << alias << " successfully deleted." << std::endl; } else { zypp::filesystem::assert_dir(location.dirname()); std::ofstream file(location.c_str()); if( !file ) { // TranslatorExplanation '%s' is a filename ZYPP_THROW( zypp::Exception(zypp::str::form( _("Can't open file '%s' for writing."), location.c_str() ))); } for_(it, tmpSet.begin(), tmpSet.end()) { if( it->alias() != alias ) it->dumpAsIniOn(file); } MIL << alias << " successfully deleted from file " << location << std::endl; } // now remove all repositories added by this service RepoCollector rcollector; getRepositoriesInService( alias, boost::make_function_output_iterator( std::bind( &RepoCollector::collect, &rcollector, std::placeholders::_1 ) ) ); // cannot do this directly in getRepositoriesInService - would invalidate iterators for_(rit, rcollector.repos.begin(), rcollector.repos.end()) removeRepository(*rit).unwrap(); return expected::success(); } catch ( ... ) { return expected::error( std::current_exception () ); } } template expected RepoManager::modifyService( const std::string & oldAlias, const ServiceInfo & newService ) { try { MIL << "Going to modify service " << oldAlias << std::endl; // we need a writable copy to link it to the file where // it is saved if we modify it ServiceInfo service(newService); if ( service.type() == zypp::repo::ServiceType::PLUGIN ) { ZYPP_THROW(zypp::repo::ServicePluginImmutableException( service )); } const ServiceInfo & oldService = getService(oldAlias); zypp::Pathname location = oldService.filepath(); if( location.empty() ) { ZYPP_THROW(zypp::repo::ServiceException( oldService, _("Can't figure out where the service is stored.") )); } // remember: there may multiple services being defined in one file: ServiceSet tmpSet; zypp::parser::ServiceFileReader( location, ServiceCollector(tmpSet) ); zypp::filesystem::assert_dir(location.dirname()); std::ofstream file(location.c_str()); for_(it, tmpSet.begin(), tmpSet.end()) { if( *it != oldAlias ) it->dumpAsIniOn(file); } service.dumpAsIniOn(file); file.close(); service.setFilepath(location); _services.erase(oldAlias); _services.insert(service); // check for credentials in Urls zypp::UrlCredentialExtractor( _options.rootDir ).collect( service.url() ); // changed properties affecting also repositories if ( oldAlias != service.alias() // changed alias || oldService.enabled() != service.enabled() ) // changed enabled status { std::vector toModify; getRepositoriesInService(oldAlias, std::back_inserter(toModify)); for_( it, toModify.begin(), toModify.end() ) { if ( oldService.enabled() != service.enabled() ) { if ( service.enabled() ) { // reset to last refreshs state const auto & last = service.repoStates().find( it->alias() ); if ( last != service.repoStates().end() ) it->setEnabled( last->second.enabled ); } else it->setEnabled( false ); } if ( oldAlias != service.alias() ) it->setService(service.alias()); modifyRepository(it->alias(), *it).unwrap(); } } return expected::success(); } catch ( ... ) { return expected::error( std::current_exception () ); } //! \todo refresh the service automatically if url is changed? } template expected RepoManager::saveService( ServiceInfo & service ) const { try { zypp::filesystem::assert_dir( _options.knownServicesPath ); zypp::Pathname servfile = generateNonExistingName( _options.knownServicesPath, generateFilename( service ) ); service.setFilepath( servfile ); MIL << "saving service in " << servfile << std::endl; std::ofstream file( servfile.c_str() ); if ( !file ) { // TranslatorExplanation '%s' is a filename ZYPP_THROW( zypp::Exception(zypp::str::form( _("Can't open file '%s' for writing."), servfile.c_str() ))); } service.dumpAsIniOn( file ); MIL << "done" << std::endl; return expected::success(); } catch ( ... ) { return expected::error( std::current_exception () ); } } /** * Generate a non existing filename in a directory, using a base * name. For example if a directory contains 3 files * * |-- bar * |-- foo * `-- moo * * If you try to generate a unique filename for this directory, * based on "ruu" you will get "ruu", but if you use the base * "foo" you will get "foo_1" * * \param dir Directory where the file needs to be unique * \param basefilename string to base the filename on. */ template zypp::Pathname RepoManager::generateNonExistingName( const zypp::Pathname & dir, const std::string & basefilename ) const { std::string final_filename = basefilename; int counter = 1; while ( zypp::PathInfo(dir + final_filename).isExist() ) { final_filename = basefilename + "_" + zypp::str::numstring(counter); ++counter; } return dir + zypp::Pathname(final_filename); } template expected RepoManager::touchIndexFile(const RepoInfo &info, const RepoManagerOptions &options) { try { zypp::Pathname productdatapath = rawproductdata_path_for_repoinfo( options, info ).unwrap(); zypp::repo::RepoType repokind = info.type(); if ( repokind.toEnum() == zypp::repo::RepoType::NONE_e ) // unknown, probe the local metadata repokind = probeCache( productdatapath ); // if still unknown, just return if (repokind == zypp::repo::RepoType::NONE_e) return expected::success(); zypp::Pathname p; switch ( repokind.toEnum() ) { case zypp::repo::RepoType::RPMMD_e : p = zypp::Pathname(productdatapath + "/repodata/repomd.xml"); break; case zypp::repo::RepoType::YAST2_e : p = zypp::Pathname(productdatapath + "/content"); break; case zypp::repo::RepoType::RPMPLAINDIR_e : p = zypp::Pathname(productdatapath + "/cookie"); break; case zypp::repo::RepoType::NONE_e : default: break; } // touch the file, ignore error (they are logged anyway) zypp::filesystem::touch(p); } catch ( ... ) { return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } return expected::success(); } template expected RepoManager::refreshGeoIp( const RepoInfo::url_set &urls ) { return joinPipeline( _zyppContext, RepoManagerWorkflow::refreshGeoIPData( _zyppContext, urls) ); } template expected RepoManager::touchIndexFile( const RepoInfo & info ) { return touchIndexFile( info, _options ); } template expected RepoManager::init_knownServices() { try { zypp::Pathname dir = _options.knownServicesPath; std::list entries; if (zypp::PathInfo(dir).isExist()) { if ( zypp::filesystem::readdir( entries, dir, false ) != 0 ) { // TranslatorExplanation '%s' is a pathname ZYPP_THROW(zypp::Exception(zypp::str::form(_("Failed to read directory '%s'"), dir.c_str()))); } //str::regex allowedServiceExt("^\\.service(_[0-9]+)?$"); for_(it, entries.begin(), entries.end() ) { zypp::parser::ServiceFileReader(*it, ServiceCollector(_services)); } } zypp::repo::PluginServices(_options.pluginsPath/"services", ServiceCollector(_services)); return expected::success(); } catch ( ... ) { return expected::error( std::current_exception () ); } } namespace { /** Delete \a cachePath_r subdirs not matching known aliases in \a repoEscAliases_r (must be sorted!) * \note bnc#891515: Auto-cleanup only zypp.conf default locations. Otherwise * we'd need some magic file to identify zypp cache directories. Without this * we may easily remove user data (zypper --pkg-cache-dir . download ...) * \note bsc#1210740: Don't cleanup if read-only mode was promised. */ inline void cleanupNonRepoMetadtaFolders( const zypp::Pathname & cachePath_r, const zypp::Pathname & defaultCachePath_r, const std::list & repoEscAliases_r ) { if ( zypp::zypp_readonly_hack::IGotIt() ) return; if ( cachePath_r != defaultCachePath_r ) return; std::list entries; if ( zypp::filesystem::readdir( entries, cachePath_r, false ) == 0 ) { entries.sort(); std::set oldfiles; set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(), std::inserter( oldfiles, oldfiles.end() ) ); // bsc#1178966: Files or symlinks here have been created by the user // for whatever purpose. It's our cache, so we purge them now before // they may later conflict with directories we need. zypp::PathInfo pi; for ( const std::string & old : oldfiles ) { if ( old == zypp::Repository::systemRepoAlias() ) // don't remove the @System solv file continue; pi( cachePath_r/old ); if ( pi.isDir() ) zypp::filesystem::recursive_rmdir( pi.path() ); else zypp::filesystem::unlink( pi.path() ); } } } } // namespace template expected RepoManager::init_knownRepositories() { try { MIL << "start construct known repos" << std::endl; if ( zypp::PathInfo(_options.knownReposPath).isExist() ) { std::list repoEscAliases; std::list orphanedRepos; for ( RepoInfo & repoInfo : repositories_in_dir( _zyppContext, _options.knownReposPath ) ) { // set the metadata path for the repo repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo).unwrap() ); // set the downloaded packages path for the repo repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo).unwrap() ); // remember it _reposX.insert( repoInfo ); // direct access via _reposX in ctor! no reposManip. // detect orphaned repos belonging to a deleted service const std::string & serviceAlias( repoInfo.service() ); if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) ) { WAR << "Schedule orphaned service repo for deletion: " << repoInfo << std::endl; orphanedRepos.push_back( repoInfo ); continue; // don't remember it in repoEscAliases } repoEscAliases.push_back(repoInfo.escaped_alias()); } // Cleanup orphanded service repos: if ( ! orphanedRepos.empty() ) { for ( const auto & repoInfo : orphanedRepos ) { MIL << "Delete orphaned service repo " << repoInfo.alias() << std::endl; // translators: Cleanup a repository previously owned by a meanwhile unknown (deleted) service. // %1% = service name // %2% = repository name JobReportHelper(_zyppContext).warning( zypp::str::Format(_("Unknown service '%1%': Removing orphaned service repository '%2%'")) % repoInfo.service() % repoInfo.alias() ); try { removeRepository( repoInfo ).unwrap(); } catch ( const zypp::Exception & caugth ) { JobReportHelper(_zyppContext).error( caugth.asUserHistory() ); } } } // bsc#1210740: Don't cleanup if read-only mode was promised. if ( not zypp::zypp_readonly_hack::IGotIt() ) { // delete metadata folders without corresponding repo (e.g. old tmp directories) // // bnc#891515: Auto-cleanup only zypp.conf default locations. Otherwise // we'd need somemagic file to identify zypp cache directories. Without this // we may easily remove user data (zypper --pkg-cache-dir . download ...) repoEscAliases.sort(); cleanupNonRepoMetadtaFolders( _options.repoRawCachePath, zypp::Pathname::assertprefix( _options.rootDir, _zyppContext->config().builtinRepoMetadataPath() ), repoEscAliases ); cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath, zypp::Pathname::assertprefix( _options.rootDir, _zyppContext->config().builtinRepoSolvfilesPath() ), repoEscAliases ); // bsc#1204956: Tweak to prevent auto pruning package caches if ( autoPruneInDir( _options.repoPackagesCachePath ) ) cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath, zypp::Pathname::assertprefix( _options.rootDir, _zyppContext->config().builtinRepoPackagesPath() ), repoEscAliases ); } } MIL << "end construct known repos" << std::endl; return expected::success(); } catch ( ... ) { return expected::error( std::current_exception () ); } } // explicitely intantiate the template types we want to work with template class RepoManager; template class RepoManager; } // namespace zyppng libzypp-17.36.5/zypp/ng/repomanager.h000066400000000000000000000472331476576476200175060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/zypp_detail/repomanagerbase_p.h * */ #ifndef ZYPP_NG_REPOMANAGER_INCLUDED #define ZYPP_NG_REPOMANAGER_INCLUDED #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { using RepoInfo = zypp::RepoInfo; using RepoStatus = zypp::RepoStatus; using RepoInfoList = zypp::RepoInfoList; using ServiceInfo = zypp::ServiceInfo; using RepoManagerOptions = zypp::RepoManagerOptions; using PluginRepoverification = zypp_private::repo::PluginRepoverification; ZYPP_FWD_DECL_TYPE_WITH_REFS( Context ); ZYPP_FWD_DECL_TYPE_WITH_REFS( SyncContext ); ZYPP_FWD_DECL_TYPE_WITH_REFS( ProgressObserver ); ZYPP_FWD_DECL_TEMPL_TYPE_WITH_REFS_ARG1 ( RepoManager, ZyppContextRefType ); using SyncRepoManager = RepoManager; using SyncRepoManagerRef = RepoManagerRef; using AsyncRepoManager = RepoManager; using AsyncRepoManagerRef = RepoManagerRef; /** Whether repo is not under RM control and provides its own methadata paths. */ inline bool isTmpRepo( const RepoInfo & info_r ) { return( info_r.filepath().empty() && info_r.usesAutoMetadataPaths() ); } inline expected assert_alias(const RepoInfo &info) { if ( info.alias().empty() ) return expected::error( ZYPP_EXCPT_PTR(zypp::repo::RepoNoAliasException( info ) ) ); // bnc #473834. Maybe we can match the alias against a regex to define // and check for valid aliases if ( info.alias()[0] == '.') return expected::error( ZYPP_EXCPT_PTR( zypp::repo::RepoInvalidAliasException( info, _("Repository alias cannot start with dot."))) ); return expected::success(); } inline expected assert_alias(const ServiceInfo &info) { if (info.alias().empty()) return expected::error( ZYPP_EXCPT_PTR(zypp::repo::ServiceNoAliasException(info))); // bnc #473834. Maybe we can match the alias against a regex to define // and check for valid aliases if (info.alias()[0] == '.') return expected::error( ZYPP_EXCPT_PTR(zypp::repo::ServiceInvalidAliasException( info, _("Service alias cannot start with dot.")))); return expected::success(); } /** Check if alias_r is present in repo/service container. */ template inline bool foundAliasIn( const std::string & alias_r, Iterator begin_r, Iterator end_r ) { for_( it, begin_r, end_r ) if ( it->alias() == alias_r ) return true; return false; } /** \overload */ template inline bool foundAliasIn( const std::string & alias_r, const Container & cont_r ) { return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); } /** Find alias_r in repo/service container. */ template inline Iterator findAlias( const std::string & alias_r, Iterator begin_r, Iterator end_r ) { for_( it, begin_r, end_r ) if ( it->alias() == alias_r ) return it; return end_r; } /** \overload */ template inline typename Container::iterator findAlias( const std::string & alias_r, Container & cont_r ) { return findAlias( alias_r, cont_r.begin(), cont_r.end() ); } /** \overload */ template inline typename Container::const_iterator findAlias( const std::string & alias_r, const Container & cont_r ) { return findAlias( alias_r, cont_r.begin(), cont_r.end() ); } /** \short Generate a related filename from a repo/service infos alias */ std::string filenameFromAlias( const std::string & alias_r, const std::string & stem_r ); /** * \short Simple callback to collect the results * * Classes like RepoFileReader call the callback * once per each repo in a file. * * Passing this functor as callback, you can collect * all results at the end, without dealing with async * code. * * If targetDistro is set, all repos with non-empty RepoInfo::targetDistribution() * will be skipped. * * \todo do this through a separate filter */ struct RepoCollector : private zypp::base::NonCopyable { RepoCollector() {} RepoCollector(std::string targetDistro_) : targetDistro(std::move(targetDistro_)) {} bool collect( const RepoInfo &repo ); RepoInfoList repos; std::string targetDistro; }; //////////////////////////////////////////////////////////////////////////// /** * Reads RepoInfo's from a repo file. * * \param file pathname of the file to read. */ expected> repositories_in_file( const zypp::Pathname & file ); //////////////////////////////////////////////////////////////////////////// expected assert_urls( const RepoInfo & info ); inline expected assert_url( const ServiceInfo & info ) { if ( ! info.url().isValid() ) return expected::error( ZYPP_EXCPT_PTR ( zypp::repo::ServiceNoUrlException( info ) ) ); return expected::success(); } /** * \short Calculates the raw cache path for a repository, this is usually * /var/cache/zypp/alias */ inline expected rawcache_path_for_repoinfo( const RepoManagerOptions &opt, const RepoInfo &info ) { using namespace zyppng::operators; return assert_alias(info) | and_then( [&](){ return make_expected_success( isTmpRepo( info ) ? info.metadataPath() : opt.repoRawCachePath / info.escaped_alias()); }); } /** * \short Calculates the raw product metadata path for a repository, this is * inside the raw cache dir, plus an optional path where the metadata is. * * It should be different only for repositories that are not in the root of * the media. * for example /var/cache/zypp/alias/addondir */ inline expected rawproductdata_path_for_repoinfo( const RepoManagerOptions &opt, const RepoInfo &info ) { using namespace zyppng::operators; return rawcache_path_for_repoinfo( opt, info ) | and_then( [&]( zypp::Pathname p ) { return make_expected_success( p / info.path() ); } ); } /** * \short Calculates the packages cache path for a repository */ inline expected packagescache_path_for_repoinfo( const RepoManagerOptions &opt, const RepoInfo &info ) { using namespace zyppng::operators; return assert_alias(info) | and_then([&](){ return make_expected_success(isTmpRepo( info ) ? info.packagesPath() : opt.repoPackagesCachePath / info.escaped_alias()); }); } /** * \short Calculates the solv cache path for a repository */ inline expected solv_path_for_repoinfo( const RepoManagerOptions &opt, const RepoInfo &info ) { using namespace zyppng::operators; return assert_alias(info) | and_then([&](){ return make_expected_success(isTmpRepo( info ) ? info.metadataPath().dirname() / "%SLV%" : opt.repoSolvCachePath / info.escaped_alias()); }); } //////////////////////////////////////////////////////////////////////////// /** Functor collecting ServiceInfos into a ServiceSet. */ class ServiceCollector { public: using ServiceSet = std::set; ServiceCollector( ServiceSet & services_r ) : _services( services_r ) {} bool operator()( const ServiceInfo & service_r ) const { _services.insert( service_r ); return true; } private: ServiceSet & _services; }; //////////////////////////////////////////////////////////////////////////// /** bsc#1204956: Tweak to prevent auto pruning package caches. */ bool autoPruneInDir( const zypp::Pathname & path_r ); /*! * \brief The RepoManager class * Provides knowledge and methods to maintain repo settings and metadata for a given context. * * Depending on the \a ZyppContextRefType the convenienve functions execute the workflows in * a sync or async way. In sync mode libzypp's legacy reports are executed. Otherwise progress report * is only provided via the \ref ProgressObserver classes. */ template class RepoManager : public Base, private MaybeAsyncMixin> { ZYPP_ADD_PRIVATE_CONSTR_HELPER (); ZYPP_ENABLE_MAYBE_ASYNC_MIXIN( (std::is_same_v) ); public: using ContextRefType = ZyppContextRefType; using ContextType = typename ZyppContextRefType::element_type; using RawMetadataRefreshPolicy = zypp::RepoManagerFlags::RawMetadataRefreshPolicy; using CacheBuildPolicy = zypp::RepoManagerFlags::CacheBuildPolicy; using RefreshCheckStatus = zypp::RepoManagerFlags::RefreshCheckStatus; /** Flags for tuning RefreshService */ using RefreshServiceBit = zypp::RepoManagerFlags::RefreshServiceBit; using RefreshServiceOptions = zypp::RepoManagerFlags::RefreshServiceOptions; ZYPP_DECL_PRIVATE_CONSTR_ARGS (RepoManager, ZyppContextRefType zyppCtx, RepoManagerOptions opt ); template < typename ...Args > inline static expected>> create ( Args && ...args ) { using namespace zyppng::operators; auto mgr = std::make_shared< RepoManager >( private_constr_t{}, std::forward(args)... ); return mgr->initialize() | and_then( [mgr](){ return make_expected_success(mgr); } ); } public: /** * Functor thats filter RepoInfo by service which it belongs to. */ struct MatchServiceAlias { public: MatchServiceAlias( std::string alias_ ) : alias(std::move(alias_)) {} bool operator()( const RepoInfo & info ) const { return info.service() == alias; } private: std::string alias; }; /** ServiceInfo typedefs */ using ServiceSet = std::set; using ServiceConstIterator = ServiceSet::const_iterator; using ServiceSizeType = ServiceSet::size_type; /** RepoInfo typedefs */ using RepoSet = std::set; using RepoConstIterator = RepoSet::const_iterator; using RepoSizeType = RepoSet::size_type; virtual ~RepoManager(); public: expected initialize (); ContextRefType zyppContext() const { return _zyppContext; } const RepoManagerOptions &options() const; bool repoEmpty() const { return repos().empty(); } RepoSizeType repoSize() const { return repos().size(); } RepoConstIterator repoBegin() const { return repos().begin(); } RepoConstIterator repoEnd() const { return repos().end(); } bool hasRepo( const std::string & alias ) const { return foundAliasIn( alias, repos() ); } RepoInfo getRepo( const std::string & alias ) const { RepoConstIterator it( findAlias( alias, repos() ) ); return it == repos().end() ? RepoInfo::noRepo : *it; } public: expected metadataPath( const RepoInfo & info ) const { return rawcache_path_for_repoinfo( _options, info ); } expected packagesPath( const RepoInfo & info ) const { return packagescache_path_for_repoinfo( _options, info ); } static expected metadataStatus( const RepoInfo & info, const RepoManagerOptions &options ); expected metadataStatus( const RepoInfo & info ) const; expected cleanMetadata( const RepoInfo & info, ProgressObserverRef myProgress = nullptr ); expected cleanPackages( const RepoInfo & info, ProgressObserverRef myProgress = nullptr , bool isAutoClean = false ); static zypp::repo::RepoType probeCache( const zypp::Pathname & path_r ); expected cleanCacheDirGarbage( ProgressObserverRef myProgress = nullptr ); expected cleanCache( const RepoInfo & info, ProgressObserverRef myProgress = nullptr ); expected isCached( const RepoInfo & info ) const { using namespace zyppng::operators; return solv_path_for_repoinfo( _options, info ) | and_then( [&]( zypp::Pathname solvPath) { return make_expected_success( zypp::PathInfo(solvPath / "solv").isExist()); } ); } expected cacheStatus( const RepoInfo & info ) const { return cacheStatus( info, _options ); } static expected cacheStatus( const RepoInfo & info, const RepoManagerOptions &options ) { using namespace zyppng::operators; return solv_path_for_repoinfo( options, info ) | and_then( [&]( zypp::Pathname solvPath) { return make_expected_success ( RepoStatus::fromCookieFile(solvPath / "cookie") ); }); } expected loadFromCache( const RepoInfo & info, ProgressObserverRef myProgress = nullptr ); expected addProbedRepository( RepoInfo info, zypp::repo::RepoType probedType ); expected removeRepository( const RepoInfo & info, ProgressObserverRef myProgress = nullptr ); expected modifyRepository( const std::string & alias, const RepoInfo & newinfo_r, ProgressObserverRef myProgress = nullptr ); expected getRepositoryInfo( const std::string & alias ); expected getRepositoryInfo( const zypp::Url & url, const zypp::url::ViewOption &urlview ); expected checkIfToRefreshMetadata( const RepoInfo & info, const zypp::Url & url, RawMetadataRefreshPolicy policy ); /** * \short Refresh local raw cache * * Will try to download the metadata * * In case of failure the metadata remains as it was before. * * The returned expected can contain one of the following errors: * \ref repo::RepoNoUrlException if no urls are available. * \ref repo::RepoNoAliasException if can't figure an alias * \ref repo::RepoUnknownTypeException if the metadata is unknown * \ref repo::RepoException if the repository is invalid * (no valid metadata found at any of baseurls) * * \todo Currently no progress is generated, especially for the async code * We might need to change this */ expected refreshMetadata( const RepoInfo & info, RawMetadataRefreshPolicy policy, ProgressObserverRef myProgress = nullptr ); std::vector > > refreshMetadata(std::vector infos, RawMetadataRefreshPolicy policy, ProgressObserverRef myProgress = nullptr ); expected probe( const zypp::Url & url, const zypp::Pathname & path = zypp::Pathname() ) const; expected buildCache( const RepoInfo & info, CacheBuildPolicy policy, ProgressObserverRef myProgress = nullptr ); /*! * Adds the repository in \a info and returns the updated \ref RepoInfo object. */ expected addRepository( const RepoInfo & info, ProgressObserverRef myProgress = nullptr ); expected addRepositories( const zypp::Url & url, ProgressObserverRef myProgress = nullptr ); public: bool serviceEmpty() const { return _services.empty(); } ServiceSizeType serviceSize() const { return _services.size(); } ServiceConstIterator serviceBegin() const { return _services.begin(); } ServiceConstIterator serviceEnd() const { return _services.end(); } bool hasService( const std::string & alias ) const { return foundAliasIn( alias, _services ); } ServiceInfo getService( const std::string & alias ) const { ServiceConstIterator it( findAlias( alias, _services ) ); return it == _services.end() ? ServiceInfo::noService : *it; } public: expected probeService( const zypp::Url & url ) const; expected addService( const ServiceInfo & service ); expected addService( const std::string & alias, const zypp::Url & url ) { return addService( ServiceInfo( alias, url ) ); } expected removeService( const std::string & alias ); expected removeService( const ServiceInfo & service ) { return removeService( service.alias() ); } expected refreshService( const std::string & alias, const RefreshServiceOptions & options_r ); expected refreshService( const ServiceInfo & service, const RefreshServiceOptions & options_r ) { return refreshService( service.alias(), options_r ); } expected refreshServices( const RefreshServiceOptions & options_r ); expected modifyService( const std::string & oldAlias, const ServiceInfo & newService ); static expected touchIndexFile( const RepoInfo & info, const RepoManagerOptions &options ); expected setCacheStatus( const RepoInfo & info, const RepoStatus & status ) { using namespace zyppng::operators; return solv_path_for_repoinfo( _options, info ) | and_then( [&]( zypp::Pathname base ){ try { zypp::filesystem::assert_dir(base); status.saveToCookieFile( base / "cookie" ); } catch ( const zypp::Exception &e ) { return expected::error( std::make_exception_ptr(e) ); } return expected::success(); }); } /*! * Checks for any of the given \a urls if there is no geoip data available, caches the results * in the metadata cache for 24hrs. The given urls need to be configured as valid geoIP targets ( usually download.opensuse.org ) */ expected refreshGeoIp ( const RepoInfo::url_set &urls ); template void getRepositoriesInService( const std::string & alias, OutputIterator out ) const { MatchServiceAlias filter( alias ); std::copy( boost::make_filter_iterator( filter, repos().begin(), repos().end() ), boost::make_filter_iterator( filter, repos().end(), repos().end() ), out); } zypp::Pathname generateNonExistingName( const zypp::Pathname & dir, const std::string & basefilename ) const; std::string generateFilename( const RepoInfo & info ) const { return filenameFromAlias( info.alias(), "repo" ); } std::string generateFilename( const ServiceInfo & info ) const { return filenameFromAlias( info.alias(), "service" ); } protected: expected saveService( ServiceInfo & service ) const; expected touchIndexFile( const RepoInfo & info ); protected: expected init_knownServices(); expected init_knownRepositories(); public: const RepoSet & repos() const { return _reposX; } RepoSet & reposManip() { if ( ! _reposDirty ) _reposDirty = true; return _reposX; } public: PluginRepoverification pluginRepoverification() const { return _pluginRepoverification; } protected: ContextRefType _zyppContext; RepoManagerOptions _options; RepoSet _reposX; ServiceSet _services; PluginRepoverification _pluginRepoverification; zypp::DefaultIntegral _reposDirty; }; } #endif //ZYPP_NG_REPOMANAGER_INCLUDED libzypp-17.36.5/zypp/ng/reporthelper.cc000066400000000000000000000254761476576476200200640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "reporthelper.h" #include #include namespace zyppng { template BasicReportHelper::BasicReportHelper(ZyppContextRef &&ctx) : _ctx( std::move(ctx) ) { } template bool DigestReportHelper::askUserToAcceptNoDigest(const zypp::Pathname &file) { if constexpr ( async() ) { std::string label = (zypp::str::Format(_("No digest for file %s.")) % file ).str(); auto req = BooleanChoiceRequest::create( label, false, AcceptNoDigestRequest::makeData(file) ); this->_ctx->sendUserRequest( req ); return req->choice (); } else { return _report->askUserToAcceptNoDigest(file); } } template bool DigestReportHelper::askUserToAccepUnknownDigest(const zypp::Pathname &file, const std::string &name) { if constexpr ( async() ) { std::string label = (zypp::str::Format(_("Unknown digest %s for file %s.")) %name % file).str(); auto req = BooleanChoiceRequest::create( label, false, AcceptUnknownDigestRequest::makeData(file, name) ); this->_ctx->sendUserRequest( req ); return req->choice (); } else { return _report->askUserToAccepUnknownDigest( file, name ); } } template bool DigestReportHelper::askUserToAcceptWrongDigest(const zypp::Pathname &file, const std::string &requested, const std::string &found) { if constexpr ( async() ) { std::string label = (zypp::str::Format(_("Digest verification failed for file '%s'")) % file).str(); auto req = BooleanChoiceRequest::create( label, false, AcceptWrongDigestRequest::makeData(file, requested, found) ); this->_ctx->sendUserRequest( req ); return req->choice (); } else { return _report->askUserToAcceptWrongDigest( file, requested, found ); } } template bool KeyRingReportHelper::askUserToAcceptUnsignedFile(const std::string &file, const zypp::KeyContext &keycontext) { if constexpr ( async() ) { std::string label; if (keycontext.empty()) label = zypp::str::Format( // TranslatorExplanation: speaking of a file _("File '%s' is unsigned, continue?")) % file; else label = zypp::str::Format( // TranslatorExplanation: speaking of a file _("File '%s' from repository '%s' is unsigned, continue?")) % file % keycontext.repoInfo().asUserString(); auto req = BooleanChoiceRequest::create ( label, false, AcceptUnsignedFileRequest::makeData ( file, keycontext ) ); this->_ctx->sendUserRequest ( req ); return req->choice (); } else { return _report->askUserToAcceptUnsignedFile( file, keycontext ); } } template zypp::KeyRingReport::KeyTrust KeyRingReportHelper::askUserToAcceptKey(const zypp::PublicKey &key, const zypp::KeyContext &keycontext) { if constexpr ( async() ) { auto req = TrustKeyRequest::create( _("Do you want to reject the key, trust temporarily, or trust always?"), TrustKeyRequest::KEY_DONT_TRUST, AcceptKeyRequest::makeData ( key, keycontext ) ); this->_ctx->sendUserRequest ( req ); return static_cast(req->choice()); } else { return _report->askUserToAcceptKey( key, keycontext ); } } template bool KeyRingReportHelper::askUserToAcceptPackageKey(const zypp::PublicKey &key_r, const zypp::KeyContext &keycontext_r) { if constexpr ( async() ) { ERR << "Not implemented yet" << std::endl; return false; } else { return _report->askUserToAcceptPackageKey ( key_r, keycontext_r ); } } template void KeyRingReportHelper::infoVerify(const std::string &file_r, const zypp::PublicKeyData &keyData_r, const zypp::KeyContext &keycontext) { if constexpr ( async() ) { std::string label = zypp::str::Format( _("Key Name: %1%")) % keyData_r.name(); auto req = ShowMessageRequest::create( label, ShowMessageRequest::MType::Info, VerifyInfoEvent::makeData ( file_r, keyData_r, keycontext) ); this->_ctx->sendUserRequest ( req ); } else { return _report->infoVerify( file_r, keyData_r, keycontext ); } } template void KeyRingReportHelper::reportAutoImportKey(const std::list &keyDataList_r, const zypp::PublicKeyData &keySigning_r, const zypp::KeyContext &keyContext_r) { if constexpr ( async() ) { const std::string &lbl = zypp::str::Format( PL_( "Received %1% new package signing key from repository \"%2%\":", "Received %1% new package signing keys from repository \"%2%\":", keyDataList_r.size() )) % keyDataList_r.size() % keyContext_r.repoInfo().asUserString(); this->_ctx->sendUserRequest( ShowMessageRequest::create( lbl, ShowMessageRequest::MType::Info, KeyAutoImportInfoEvent::makeData( keyDataList_r, keySigning_r, keyContext_r) ) ); } else { return _report->reportAutoImportKey( keyDataList_r, keySigning_r, keyContext_r ); } } template bool KeyRingReportHelper::askUserToAcceptVerificationFailed(const std::string &file, const zypp::PublicKey &key, const zypp::KeyContext &keycontext) { if constexpr ( async() ) { std::string label; if ( keycontext.empty() ) // translator: %1% is a file name label = zypp::str::Format(_("Signature verification failed for file '%1%'.") ) % file; else // translator: %1% is a file name, %2% a repositories na me label = zypp::str::Format(_("Signature verification failed for file '%1%' from repository '%2%'.") ) % file % keycontext.repoInfo().asUserString(); // @TODO use a centralized Continue string! label += std::string(" ") + _("Continue?"); auto req = BooleanChoiceRequest::create ( label, false, AcceptFailedVerificationRequest::makeData ( file, key, keycontext ) ); this->_ctx->sendUserRequest ( req ); return req->choice (); } else { return _report->askUserToAcceptVerificationFailed( file, key, keycontext ); } } template bool KeyRingReportHelper::askUserToAcceptUnknownKey( const std::string &file, const std::string &id, const zypp::KeyContext &keycontext ) { if constexpr ( async() ) { std::string label; if (keycontext.empty()) label = zypp::str::Format( // translators: the last %s is gpg key ID _("File '%s' is signed with an unknown key '%s'. Continue?")) % file % id; else label = zypp::str::Format( // translators: the last %s is gpg key ID _("File '%s' from repository '%s' is signed with an unknown key '%s'. Continue?")) % file % keycontext.repoInfo().asUserString() % id; auto req = BooleanChoiceRequest::create ( label, false, AcceptUnknownKeyRequest::makeData ( file, id, keycontext ) ); this->_ctx->sendUserRequest ( req ); return req->choice (); } else { return _report->askUserToAcceptUnknownKey( file, id, keycontext ); } } template bool JobReportHelper::debug(std::string msg_r, UserData userData_r) { if constexpr ( async() ) { this->_ctx->sendUserRequest( ShowMessageRequest::create( std::move(msg_r), ShowMessageRequest::MType::Debug, std::move(userData_r) ) ); return true; } else { return zypp::JobReport::debug ( msg_r, userData_r ); } } template bool JobReportHelper::info( std::string msg_r, UserData userData_r) { if constexpr ( async() ) { this->_ctx->sendUserRequest( ShowMessageRequest::create( std::move(msg_r), ShowMessageRequest::MType::Info, std::move(userData_r) ) ); return true; } else { return zypp::JobReport::info ( msg_r, userData_r ); } } template bool JobReportHelper::warning( std::string msg_r, UserData userData_r) { if constexpr ( async() ) { this->_ctx->sendUserRequest( ShowMessageRequest::create( std::move(msg_r), ShowMessageRequest::MType::Warning, std::move(userData_r) ) ); return true; } else { return zypp::JobReport::warning ( msg_r, userData_r ); } } template bool JobReportHelper::error( std::string msg_r, UserData userData_r) { if constexpr ( async() ) { this->_ctx->sendUserRequest( ShowMessageRequest::create( std::move(msg_r), ShowMessageRequest::MType::Error, std::move(userData_r) ) ); return true; } else { return zypp::JobReport::error ( msg_r, userData_r ); } } template bool JobReportHelper::important( std::string msg_r, UserData userData_r) { if constexpr ( async() ) { this->_ctx->sendUserRequest( ShowMessageRequest::create( std::move(msg_r), ShowMessageRequest::MType::Important, std::move(userData_r) ) ); return true; } else { return zypp::JobReport::important ( msg_r, userData_r ); } } template bool JobReportHelper::data( std::string msg_r, UserData userData_r) { if constexpr ( async() ) { this->_ctx->sendUserRequest( ShowMessageRequest::create( std::move(msg_r), ShowMessageRequest::MType::Data, std::move(userData_r) ) ); return true; } else { return zypp::JobReport::data ( msg_r, userData_r ); } } // explicitely intantiate the template types we want to work with template class BasicReportHelper; template class BasicReportHelper; template class DigestReportHelper; template class DigestReportHelper; template class KeyRingReportHelper; template class KeyRingReportHelper; template class JobReportHelper; template class JobReportHelper; } libzypp-17.36.5/zypp/ng/reporthelper.h000066400000000000000000000137041476576476200177150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/zypp_detail/repomanagerbase_p.h * */ #ifndef ZYPP_NG_REPORTHELPER_INCLUDED #define ZYPP_NG_REPORTHELPER_INCLUDED #include #include #include #include #include #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_REFS (Context); namespace detail { template class ReportHolder; template class ReportHolder {}; template class ReportHolder { public: ReportHolder() : _d( std::make_shared>() ){} ReportHolder(const ReportHolder &) = default; ReportHolder(ReportHolder &&) = default; ReportHolder &operator=(const ReportHolder &) = default; ReportHolder &operator=(ReportHolder &&) = default; auto &operator->() { return *_d; } std::shared_ptr> _d; }; } template class BasicReportHelper { public: BasicReportHelper(const BasicReportHelper &) = default; BasicReportHelper(BasicReportHelper &&) = default; BasicReportHelper &operator=(const BasicReportHelper &) = default; BasicReportHelper &operator=(BasicReportHelper &&) = default; const ZyppContextRef &zyppContext() { return _ctx; } static constexpr bool async () { return std::is_same(); } protected: BasicReportHelper( ZyppContextRef &&ctx ); ZyppContextRef _ctx; }; template class DigestReportHelper : public BasicReportHelper { public: using BasicReportHelper::async; DigestReportHelper(ZyppContextRef r) : BasicReportHelper(std::move(r)) {} DigestReportHelper(const DigestReportHelper &) = default; DigestReportHelper(DigestReportHelper &&) = default; DigestReportHelper &operator=(const DigestReportHelper &) = default; DigestReportHelper &operator=(DigestReportHelper &&) = default; bool askUserToAcceptNoDigest ( const zypp::Pathname &file ); bool askUserToAccepUnknownDigest ( const zypp::Pathname &file, const std::string &name ); bool askUserToAcceptWrongDigest ( const zypp::Pathname &file, const std::string &requested, const std::string &found ); private: detail::ReportHolder _report; }; template class KeyRingReportHelper : public BasicReportHelper { public: using BasicReportHelper::async; KeyRingReportHelper(ZyppContextRef r) : BasicReportHelper(std::move(r)) {} KeyRingReportHelper(const KeyRingReportHelper &) = default; KeyRingReportHelper(KeyRingReportHelper &&) = default; KeyRingReportHelper &operator=(const KeyRingReportHelper &) = default; KeyRingReportHelper &operator=(KeyRingReportHelper &&) = default; // -- Key Ring reports -- // bool askUserToAcceptUnsignedFile( const std::string &file, const zypp::KeyContext &keycontext = {} ); zypp::KeyRingReport::KeyTrust askUserToAcceptKey( const zypp::PublicKey &key, const zypp::KeyContext &keycontext = {} ); bool askUserToAcceptPackageKey( const zypp::PublicKey &key_r, const zypp::KeyContext &keycontext_r = {} ); void infoVerify( const std::string & file_r, const zypp::PublicKeyData & keyData_r, const zypp::KeyContext &keycontext = {} ); void reportAutoImportKey( const std::list & keyDataList_r, const zypp::PublicKeyData & keySigning_r, const zypp::KeyContext &keyContext_r ); bool askUserToAcceptVerificationFailed( const std::string &file, const zypp::PublicKey &key, const zypp::KeyContext &keycontext = {} ); bool askUserToAcceptUnknownKey( const std::string &file, const std::string &id, const zypp::KeyContext &keycontext = {} ); private: detail::ReportHolder _report; }; template class JobReportHelper : public BasicReportHelper { public: using BasicReportHelper::async; JobReportHelper(ZyppContextRef r) : BasicReportHelper(std::move(r)) {} JobReportHelper(const JobReportHelper &) = default; JobReportHelper(JobReportHelper &&) = default; JobReportHelper &operator=(const JobReportHelper &) = default; JobReportHelper &operator=(JobReportHelper &&) = default; /** send debug message text */ bool debug( std::string msg_r, UserData userData_r = UserData() ); /** send message text */ bool info( std::string msg_r, UserData userData_r = UserData() ); /** send warning text */ bool warning( std::string msg_r, UserData userData_r = UserData() ); /** send error text */ bool error( std::string msg_r, UserData userData_r = UserData() ); /** send important message text */ bool important( std::string msg_r, UserData userData_r = UserData() ); /** send data message */ bool data( std::string msg_r, UserData userData_r = UserData() ); }; } #endif //ZYPP_NG_REPORTHELPER_INCLUDED libzypp-17.36.5/zypp/ng/userrequest.cc000066400000000000000000000076271476576476200177360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "userrequest.h" namespace zyppng { UserData AcceptNoDigestRequest::makeData(const zypp::Pathname &p) { UserData d( CTYPE.data() ); d.set( FILE.data(), p ); return d; } UserData AcceptUnknownDigestRequest::makeData(const zypp::Pathname &p, const std::string &name) { UserData d( CTYPE.data() ); d.set( FILE.data(), p ); d.set( NAME.data(), name ); return d; } UserData AcceptWrongDigestRequest::makeData(const zypp::Pathname &p, const std::string &requested, const std::string &found) { UserData d( CTYPE.data() ); d.set( FILE.data(), p ); d.set( NAME_REQUESTED.data(), requested ); d.set( NAME_FOUND.data(), found ); return d; } ZYPP_IMPL_PRIVATE_CONSTR_ARGS(TrustKeyRequest, std::string label, KeyTrust trust, UserData userData ) : UserRequest( std::move(userData) ) , _label( std::move(label) ) , _answer(trust) { } void TrustKeyRequest::setChoice(const KeyTrust sel) { _answer = sel; } TrustKeyRequest::KeyTrust TrustKeyRequest::choice() const { return _answer; } const std::string TrustKeyRequest::label() const { return _label; } UserRequestType TrustKeyRequest::type() const { return UserRequestType::KeyTrust; } UserData AcceptKeyRequest::makeData(const zypp::PublicKey &key, const zypp::KeyContext &keycontext) { UserData d( CTYPE.data() ); d.set( KEY.data(), key ); d.set( KEY_CONTEXT.data(), keycontext ); return d; } UserData VerifyInfoEvent::makeData(const std::string &file_r, const zypp::PublicKeyData &keyData_r, const zypp::KeyContext &keycontext) { UserData d( CTYPE.data() ); d.set( FILE.data(), file_r ); d.set( KEY_DATA.data(), keyData_r ); d.set( KEY_CONTEXT.data(), keycontext ); return d; } UserData AcceptUnsignedFileRequest::makeData(const std::string &file, const zypp::KeyContext &keycontext) { UserData d( CTYPE.data() ); d.set( FILE.data(), file ); d.set( KEY_CONTEXT.data(), keycontext ); return d; } UserData AcceptUnknownKeyRequest::makeData(const std::string &file, const std::string &id, const zypp::KeyContext &keycontext) { UserData d( CTYPE.data() ); d.set( KEYID.data(), id ); d.set( FILE.data(), file ); d.set( KEY_CONTEXT.data(), keycontext ); return d; } UserData AcceptFailedVerificationRequest::makeData(const std::string &file, const zypp::PublicKey &key, const zypp::KeyContext &keycontext) { UserData d( CTYPE.data() ); d.set( KEY.data(), key ); d.set( FILE.data(), file ); d.set( KEY_CONTEXT.data(), keycontext ); return d; } UserData AcceptPackageKeyRequest::makeData(const zypp::PublicKey &key_r, const zypp::KeyContext &keycontext_r) { UserData d( CTYPE.data() ); d.set( KEY.data(), key_r ); d.set( KEY_CONTEXT.data(), keycontext_r ); return d; } UserData NonImportedKeysInfoEvent::makeData(const std::set &keys_r) { UserData d( CTYPE.data() ); d.set( KEYS.data(), &keys_r ); return d; } UserData KeyAutoImportInfoEvent::makeData(const std::list &keyDataList_r, const zypp::PublicKeyData &keySigning_r, const zypp::KeyContext &keyContext_r) { UserData d( CTYPE.data() ); d.set( KEY_DATA_LIST.data(), &keyDataList_r ); d.set( KEY_DATA.data(), keySigning_r ); d.set( KEY_CONTEXT.data(), keyContext_r ); return d; } } libzypp-17.36.5/zypp/ng/userrequest.h000066400000000000000000000220721476576476200175670ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_USERREQUEST_H_INCLUDED #define ZYPP_NG_USERREQUEST_H_INCLUDED #include #include #include namespace zyppng { /*! * A digest user request asking the user to accept * verification of a file that has no checksum available. * * Something like: "File foo.bar has no checksum. Continue?" * * Userdata fields: * - "file" Path of the file to be validated */ namespace AcceptNoDigestRequest { constexpr std::string_view CTYPE ("digest/accept-no-digest"); constexpr std::string_view FILE ("file"); UserData makeData ( const zypp::Pathname &p); } /*! * A digest user request asking the user to accept * verification with a unknown digest. * * Something like: "Unknown digest for file ." * * Userdata fields: * - "file" Path of the file to be validated * - "name" Name of the digest */ namespace AcceptUnknownDigestRequest { constexpr std::string_view CTYPE ("digest/accept-unknown-digest"); constexpr std::string_view FILE ("file"); constexpr std::string_view NAME ("name"); UserData makeData ( const zypp::Pathname &p, const std::string &name ); } /*! * A digest user request asking the user to accept * a wrong digest. * * Something like: "Unknown digest for file ." * * Userdata fields: * - "file" Path of the file to be validated * - "name" Name of the digest */ namespace AcceptWrongDigestRequest { constexpr std::string_view CTYPE ("digest/accept-unknown-digest"); constexpr std::string_view FILE ("file"); constexpr std::string_view NAME_REQUESTED ("requested"); constexpr std::string_view NAME_FOUND ("found"); UserData makeData ( const zypp::Pathname &p, const std::string &requested, const std::string &found ); } ZYPP_FWD_DECL_TYPE_WITH_REFS(TrustKeyRequest); class TrustKeyRequest : public UserRequest { ZYPP_ADD_CREATE_FUNC(TrustKeyRequest) public: /*! * Keep in sync with zypp::KeyRingReport::KeyTrust, we do not want * to include old APIs here if possible. */ enum KeyTrust { /** * User has chosen not to trust the key. */ KEY_DONT_TRUST = 0, /** * This basically means, we knew the key, but it was not trusted. User * has chosen to continue, but not import the key. */ KEY_TRUST_TEMPORARILY, /** * Import the key. * This means saving the key in the trusted database so next run it will appear as trusted. * Nothing to do with KEY_TRUST_TEMPORARILY, as you CAN trust a key without importing it, * basically you will be asked every time again. * There are programs who prefer to manage the trust keyring on their own and use trustKey * without importing it into rpm. */ KEY_TRUST_AND_IMPORT }; ZYPP_DECL_PRIVATE_CONSTR_ARGS(TrustKeyRequest, std::string label, KeyTrust trust = KEY_DONT_TRUST, UserData userData = {} ); void setChoice ( const KeyTrust sel ); KeyTrust choice() const; const std::string label() const; UserRequestType type() const override; private: std::string _label; KeyTrust _answer = KEY_DONT_TRUST; }; /*! * Ask user to trust and/or import the key to trusted keyring. * \see zypp::KeyTrust * * Userdata fields: * - "key" Key to import into the trusted keyring * - "key-context" context the key is used in */ namespace AcceptKeyRequest { constexpr std::string_view CTYPE ("keyring/accept-key"); constexpr std::string_view KEY ("key"); constexpr std::string_view KEY_CONTEXT("key-context"); UserData makeData ( const zypp::PublicKey &key, const zypp::KeyContext &keycontext = zypp::KeyContext() ); } /*! * Informal event showing the trusted key that will be used for verification. * * Userdata fields: * - "file" File that was verified * - "key-data" Key data that was used to verify the file * - "key-context" context the key is used in */ namespace VerifyInfoEvent { constexpr std::string_view CTYPE ("keyring/info-verify"); constexpr std::string_view FILE ("file"); constexpr std::string_view KEY_DATA("key-data"); constexpr std::string_view KEY_CONTEXT("key-context"); UserData makeData ( const std::string & file_r, const zypp::PublicKeyData & keyData_r, const zypp::KeyContext &keycontext = zypp::KeyContext() ); } /*! * Ask user to accept or reject a unsigned file * * Userdata fields: * - "file" The file zypp needs to be accepted or rejected * - "key-context" context the file came up in */ namespace AcceptUnsignedFileRequest { constexpr std::string_view CTYPE ("keyring/accept-unsigned-file"); constexpr std::string_view FILE ("file"); constexpr std::string_view KEY_CONTEXT("key-context"); UserData makeData ( const std::string &file, const zypp::KeyContext &keycontext = zypp::KeyContext() ); } /** * Ask the user to accept a unknown key. * We DONT know the key, only its id, but we have never seen it, the difference * with trust key is that if you dont have it, you can't import it later. * The answer means continue yes or no? * * Userdata fields: * - "keyid" The key ID in question * - "file" The file signed with the given key id * - "key-context" context the file came up in * */ namespace AcceptUnknownKeyRequest { constexpr std::string_view CTYPE ("keyring/accept-unknown-key"); constexpr std::string_view KEYID ("keyid"); constexpr std::string_view FILE ("file"); constexpr std::string_view KEY_CONTEXT("key-context"); UserData makeData ( const std::string &file, const std::string &id, const zypp::KeyContext &keycontext = zypp::KeyContext() ); } /** * Ask the user to accept a file that is signed but where the * signature verification failed. * * Userdata fields: * - "file" The file in question * - "key" Key zypp tried to verify with * - "key-context" context the file came up in */ namespace AcceptFailedVerificationRequest { constexpr std::string_view CTYPE ("keyring/accept-failed-verification"); constexpr std::string_view FILE ("file"); constexpr std::string_view KEY ("key"); constexpr std::string_view KEY_CONTEXT ("key-context"); UserData makeData ( const std::string &file, const zypp::PublicKey &key, const zypp::KeyContext &keycontext = zypp::KeyContext() ); } /** * Ask user to trust and/or import the package key to trusted keyring * * Userdata fields: * - "key" The PublicKey to be accepted * - "key-context" The KeyContext * * \see zypp::KeyTrust */ namespace AcceptPackageKeyRequest { constexpr std::string_view CTYPE ("keyring/accept-package-key"); constexpr std::string_view KEY ("key"); constexpr std::string_view KEY_CONTEXT ("key-context"); UserData makeData ( const zypp::PublicKey &key_r, const zypp::KeyContext &keycontext_r = zypp::KeyContext() ); } /** * Notify the user about keys that were not imported from the * rpm key database into zypp keyring * * Userdata fields: * const std::set * "Keys" set of keys that were not imported * */ namespace NonImportedKeysInfoEvent { constexpr std::string_view CTYPE ("keyring/keys-not-imported"); constexpr std::string_view KEYS ("keys"); UserData makeData ( const std::set &keys_r ); } /** * Notify that a repository auto imported new package signing keys. * * To auto import new package signing keys, the repositories metadata must be * signed by an already trusted key. * * Userdata fields: * const std::list * "key-data-list" List of KeyData to import * zypp::PublicKeyData "key-data" KeyData of signing key * zypp::KeyContext "key-context" The KeyContext */ namespace KeyAutoImportInfoEvent { constexpr std::string_view CTYPE ("keyring/auto-import-key-info"); constexpr std::string_view KEY_DATA_LIST ("key-data-list"); constexpr std::string_view KEY_DATA ("key-data"); constexpr std::string_view KEY_CONTEXT ("key-context"); UserData makeData ( const std::list & keyDataList_r, const zypp::PublicKeyData & keySigning_r, const zypp::KeyContext &keyContext_r ); } } #endif // ZYPP_NG_USERREQUEST_H_INCLUDED libzypp-17.36.5/zypp/ng/workflows/000077500000000000000000000000001476576476200170615ustar00rootroot00000000000000libzypp-17.36.5/zypp/ng/workflows/checksumwf.cc000066400000000000000000000145651476576476200215420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "checksumwf.h" #include "logichelpers.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng::CheckSumWorkflow { using namespace zyppng::operators; template struct CheckSumWorkflowLogic : public LogicBase { ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); using ZyppContextRefType = MaybeAsyncContextRef; using ZyppContextType = remove_smart_ptr_t; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; CheckSumWorkflowLogic( ZyppContextRefType zyppContext, zypp::CheckSum &&checksum, zypp::Pathname file ) : _context( std::move(zyppContext) ) , _report( _context ) , _checksum(std::move( checksum )) , _file(std::move( file )) {} auto execute() { //MIL << "checking " << file << " file against checksum '" << _checksum << "'" << endl; if ( _checksum.empty() ) { MIL << "File " << _file << " has no checksum available." << std::endl; if ( _report.askUserToAcceptNoDigest( _file ) ) { MIL << "User accepted " << _file << " with no checksum." << std::endl; return makeReadyResult( expected::success() ); } else { return makeReadyResult( expected::error( ZYPP_EXCPT_PTR(zypp::FileCheckException( _file.basename() + " has no checksum" ) ) ) ); } } else { return _context->provider()->checksumForFile ( _file, _checksum.type() ) | [] ( expected sum ) { if ( !sum ) return zypp::CheckSum( ); return sum.get(); } | [this, _file=_file]( zypp::CheckSum real_checksum ){ if ( (real_checksum != _checksum) ) { // Remember askUserToAcceptWrongDigest decision for at most 12hrs in memory; // Actually we just want to prevent asking the same question again when the // previously downloaded file is retrieved from the disk cache. static std::map exceptions; static zypp::Date exceptionsAge; zypp::Date now( zypp::Date::now() ); if ( !exceptions.empty() && now-exceptionsAge > 12*zypp::Date::hour ) exceptions.clear(); WAR << "File " << _file << " has wrong checksum " << real_checksum << " (expected " << _checksum << ")" << std::endl; if ( !exceptions.empty() && exceptions[real_checksum.checksum()] == _checksum.checksum() ) { WAR << "User accepted " << _file << " with WRONG CHECKSUM. (remembered)" << std::endl; return expected::success(); } else if ( _report.askUserToAcceptWrongDigest( _file, _checksum.checksum(), real_checksum.checksum() ) ) { WAR << "User accepted " << _file << " with WRONG CHECKSUM." << std::endl; exceptions[real_checksum.checksum()] = _checksum.checksum(); exceptionsAge = now; return expected::success(); } else { return expected::error( ZYPP_EXCPT_PTR(zypp::FileCheckException( _file.basename() + " has wrong checksum" ) ) ); } } return expected::success(); }; } } protected: ZyppContextRefType _context; DigestReportHelper _report; zypp::CheckSum _checksum; zypp::Pathname _file; }; expected verifyChecksum( SyncContextRef zyppCtx, zypp::CheckSum checksum, zypp::Pathname file ) { return SimpleExecutor>>::run( std::move(zyppCtx), std::move(checksum), std::move(file) ); } AsyncOpRef > verifyChecksum( ContextRef zyppCtx, zypp::CheckSum checksum, zypp::filesystem::Pathname file ) { return SimpleExecutor>>::run( std::move(zyppCtx), std::move(checksum), std::move(file) ); } std::function > (ProvideRes &&)> checksumFileChecker( ContextRef zyppCtx, zypp::CheckSum checksum ) { using zyppng::operators::operator|; return [ zyppCtx, checksum=std::move(checksum) ]( ProvideRes res ) mutable -> AsyncOpRef> { return verifyChecksum( zyppCtx, std::move(checksum), res.file() ) | [ res ] ( expected result ) mutable { if ( result ) return expected::success( std::move(res) ); else return expected::error( std::move(result.error()) ); }; }; } std::function (SyncProvideRes &&)> checksumFileChecker(SyncContextRef zyppCtx, zypp::CheckSum checksum) { using zyppng::operators::operator|; return [ zyppCtx = std::move(zyppCtx), checksum=std::move(checksum) ]( SyncProvideRes res ) mutable -> expected { return verifyChecksum( zyppCtx, std::move(checksum), res.file() ) | [ res ] ( expected result ) mutable { if ( result ) return expected::success( std::move(res) ); else return expected::error( std::move(result.error()) ); }; }; } } libzypp-17.36.5/zypp/ng/workflows/checksumwf.h000066400000000000000000000033761476576476200214020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_CHECKSUMWORKFLOW_INCLUDED #define ZYPP_NG_CHECKSUMWORKFLOW_INCLUDED #include #include #include #include #include namespace zypp { namespace filesystem { class Pathname; } using filesystem::Pathname; class CheckSum; } namespace zyppng { class ProvideRes; ZYPP_FWD_DECL_TYPE_WITH_REFS(Context); namespace CheckSumWorkflow { expected verifyChecksum ( SyncContextRef zyppCtx, zypp::CheckSum checksum, zypp::Pathname file ); AsyncOpRef> verifyChecksum ( ContextRef zyppCtx, zypp::CheckSum checksum, zypp::Pathname file ); /*! * Returns a callable that executes the verify checksum as part of a pipeline, * forwarding the \ref ProvideRes if the workflow was successful. */ std::function< AsyncOpRef>( ProvideRes && ) > checksumFileChecker( ContextRef zyppCtx, zypp::CheckSum checksum ); std::function< expected( SyncProvideRes && ) > checksumFileChecker( SyncContextRef zyppCtx, zypp::CheckSum checksum ); } } #endif libzypp-17.36.5/zypp/ng/workflows/contextfacade.cc000066400000000000000000000032221476576476200221770ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "contextfacade.h" #include namespace zyppng { ZYPP_IMPL_PRIVATE_CONSTR(SyncContext) : _media( MediaSyncFacade::create() ) { } /*! * Returns the default sync zypp context. * This is only a workaround to support the Legacy APIs. * For new style APIs the Context should always explicitely be passed down. So use it * only in top level external classes where we can not touch the API. */ SyncContextRef SyncContext::defaultContext() { static SyncContextRef def = SyncContext::create(); return def; } MediaSyncFacadeRef SyncContext::provider() const { return _media; } KeyRingRef SyncContext::keyRing() const { return zypp::getZYpp()->keyRing(); } zypp::ZConfig &SyncContext::config() { return zypp::ZConfig::instance(); } zypp::ResPool SyncContext::pool() { return zypp::ResPool::instance(); } zypp::ResPoolProxy SyncContext::poolProxy() { return zypp::ResPool::instance().proxy(); } zypp::sat::Pool SyncContext::satPool() { return zypp::sat::Pool::instance(); } } libzypp-17.36.5/zypp/ng/workflows/contextfacade.h000066400000000000000000000032021476576476200220370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_CONTEXTFACADE_INCLUDED #define ZYPP_NG_CONTEXTFACADE_INCLUDED #include "zypp/ng/context.h" #include namespace zypp { DEFINE_PTR_TYPE(KeyRing); class ZConfig; } namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS( SyncContext ); using KeyRing = zypp::KeyRing; using KeyRingRef = zypp::KeyRing_Ptr; class ZYPP_API SyncContext { ZYPP_ADD_CREATE_FUNC(SyncContext) public: ZYPP_DECL_PRIVATE_CONSTR(SyncContext); using ProvideType = MediaSyncFacade; static SyncContextRef defaultContext(); MediaSyncFacadeRef provider() const; KeyRingRef keyRing () const; zypp::ZConfig &config(); zypp::ResPool pool(); zypp::ResPoolProxy poolProxy(); zypp::sat::Pool satPool(); private: MediaSyncFacadeRef _media; }; template using MaybeAsyncContextRef = std::conditional_t, ContextRef, SyncContextRef>; template auto joinPipeline( SyncContextRef ctx, T &&val ) { return std::forward(val); } } #endif libzypp-17.36.5/zypp/ng/workflows/downloadwf.cc000066400000000000000000000216571476576476200215470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "downloadwf.h" #include #include #include #include #include #include #include #include #include namespace zyppng { template CacheProviderContext::CacheProviderContext( ZYPP_PRIVATE_CONSTR_ARG, ZyppContextRefType zyppContext, zypp::Pathname destDir ) : _zyppContext( std::move(zyppContext) ) , _destDir( std::move(destDir) ) { } template const typename CacheProviderContext::ContextRefType &CacheProviderContext::zyppContext() const { return _zyppContext; } template const zypp::Pathname &CacheProviderContext::destDir() const { return _destDir; } template void CacheProviderContext::addCacheDir(const zypp::Pathname &p) { _cacheDirs.push_back ( p ); } template const std::vector &CacheProviderContext::cacheDirs() const { return _cacheDirs; } template class CacheProviderContext; template class CacheProviderContext; namespace { using namespace zyppng::operators; class CacheMissException : public zypp::Exception { public: CacheMissException( const zypp::Pathname &filename ) : zypp::Exception( zypp::str::Str() << filename << " not found in target cache" ) { } }; template struct showme; template struct ProvideFromCacheOrMediumLogic : public LogicBase { protected: ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); using CacheProviderContextRefType = std::conditional_t, AsyncCacheProviderContextRef, SyncCacheProviderContextRef>; using ContextType = typename remove_smart_ptr_t::ContextType; using ProvideType = typename ContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; public: ProvideFromCacheOrMediumLogic( CacheProviderContextRefType cacheContext, MediaHandle &&medium, zypp::Pathname &&file, ProvideFileSpec &&filespec ) : _ctx( std::move(cacheContext) ) , _medium( std::move(medium) ) , _file(std::move( file )) , _filespec( std::move(filespec) ) {} MaybeAsyncRef> execute() { return findFileInCache( ) | [this]( expected cached ) -> MaybeAsyncRef> { if ( !cached ) { MIL << "Didn't find " << _file << " in the caches, providing from medium" << std::endl; // we didn't find it in the caches or the lookup failed, lets provide and check it std::shared_ptr provider = _ctx->zyppContext()->provider(); return provider->provide( _medium, _file, _filespec ) | and_then( [this]( ProvideRes res ) { return verifyFile( res.file() ) | and_then( [res = res]() { return expected::success( std::move(res) ); }); }) | and_then( ProvideType::copyResultToDest( _ctx->zyppContext()->provider(), _ctx->destDir() / _file ) ) | and_then( []( zypp::ManagedFile &&file ){ file.resetDispose (); return make_expected_success (std::move(file)); }) ; } else { return verifyFile ( cached.get() ) | and_then([ this, cachedFile = cached.get() ]() mutable { if ( cachedFile == _ctx->destDir() / _file ) { cachedFile.resetDispose(); // make sure dispose is reset return makeReadyResult( expected::success(std::move(cachedFile) )); } const auto &targetPath = _ctx->destDir() / _file; zypp::filesystem::assert_dir( targetPath.dirname () ); return _ctx->zyppContext()->provider()->copyFile( cachedFile, _ctx->destDir() / _file ) | and_then( [cachedFile]( zypp::ManagedFile &&f) { f.resetDispose(); return make_expected_success (std::move(f)); }); }); } }; } protected: /*! * Looks for a specific file in a cache dir, if it exists there and the checksum matches the one in the \sa ProvideFileSpec * it is used and returned. */ MaybeAsyncRef> findFileInCache( ) { // No checksum - no match if ( _filespec.checksum().empty() ) return makeReadyResult( expected::error(std::make_exception_ptr( CacheMissException(_file) )) ); const auto &confDirs = _ctx->cacheDirs(); const auto targetFile = _ctx->destDir() / _file ; std::vector caches; caches.push_back( _ctx->destDir() ); caches.insert( caches.end(), confDirs.begin(), confDirs.end() ); auto makeSearchPipeline = [this, targetFile]( zypp::Pathname cachePath ){ zypp::Pathname cacheFilePath( cachePath / _file ); zypp::PathInfo cacheFileInfo( cacheFilePath ); if ( !cacheFileInfo.isExist () ) { return makeReadyResult(expected::error( std::make_exception_ptr (CacheMissException(_file)) )); } else { auto provider = _ctx->zyppContext()->provider(); // calc checksum, but do not use the workflow. Here we don't want to ask the user if a wrong checksum should // be accepted return provider->checksumForFile( cacheFilePath, _filespec.checksum().type() ) | and_then([this, cacheFilePath, targetFile]( zypp::CheckSum sum ) { auto mgdFile = zypp::ManagedFile( cacheFilePath ); // if the file is in the target dir, make sure to release it if its not used if ( cacheFilePath == targetFile ) mgdFile.setDispose ( zypp::filesystem::unlink ); if ( sum == _filespec.checksum () ) { // we found the file! return expected::success( std::move(mgdFile) ); } return expected::error( std::make_exception_ptr (CacheMissException(_file)) ); }); } }; auto defVal = expected::error( std::make_exception_ptr (CacheMissException(_file) ) ); return std::move(caches) | firstOf( std::move(makeSearchPipeline), std::move(defVal), detail::ContinueUntilValidPredicate() ); } MaybeAsyncRef> verifyFile ( const zypp::Pathname &dlFilePath ) { return zypp::Pathname( dlFilePath ) | [this]( zypp::Pathname &&dlFilePath ) { if ( !_filespec.checksum().empty () ) { return CheckSumWorkflow::verifyChecksum( _ctx->zyppContext(), _filespec.checksum (), std::move(dlFilePath) ); } return makeReadyResult(expected::success()); }; // add other verifier here via and_then(), like a signature based one } CacheProviderContextRefType _ctx; MediaHandle _medium; zypp::Pathname _file; ProvideFileSpec _filespec; }; } namespace DownloadWorkflow { AsyncOpRef > provideToCacheDir( AsyncCacheProviderContextRef cacheContext, ProvideMediaHandle medium, zypp::Pathname file, ProvideFileSpec filespec ) { return SimpleExecutor>>::run( std::move(cacheContext), std::move(medium), std::move(file), std::move(filespec) ); } expected provideToCacheDir(SyncCacheProviderContextRef cacheContext, SyncMediaHandle medium, zypp::Pathname file, ProvideFileSpec filespec ) { return SimpleExecutor>>::run( std::move(cacheContext), std::move(medium), std::move(file), std::move(filespec) ); } } } libzypp-17.36.5/zypp/ng/workflows/downloadwf.h000066400000000000000000000047701476576476200214060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_WORKFLOWS_DOWNLOAD_INCLUDED #define ZYPP_NG_WORKFLOWS_DOWNLOAD_INCLUDED #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (Context); ZYPP_FWD_DECL_TYPE_WITH_REFS (SyncContext); ZYPP_FWD_DECL_TYPE_WITH_REFS (ProgressObserver); class ProvideMediaHandle; class SyncMediaHandle; class ProvideFileSpec; template class CacheProviderContext : public Base { protected: ZYPP_ADD_PRIVATE_CONSTR_HELPER(); public: using ContextRefType = ZyppContextRefType; using ContextType = typename ZyppContextRefType::element_type; using ProvideType = typename ContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; ZYPP_DECL_PRIVATE_CONSTR_ARGS(CacheProviderContext, ZyppContextRefType zyppContext, zypp::Pathname destDir ); const ContextRefType &zyppContext() const; const zypp::Pathname &destDir() const; void addCacheDir( const zypp::Pathname &p ); const std::vector &cacheDirs() const; protected: ContextRefType _zyppContext; zypp::Pathname _destDir; std::vector _cacheDirs; }; using AsyncCacheProviderContext = CacheProviderContext; using SyncCacheProviderContext = CacheProviderContext; ZYPP_FWD_DECL_REFS(AsyncCacheProviderContext); ZYPP_FWD_DECL_REFS(SyncCacheProviderContext); namespace DownloadWorkflow { AsyncOpRef> provideToCacheDir( AsyncCacheProviderContextRef cacheContext, ProvideMediaHandle medium, zypp::Pathname file, ProvideFileSpec filespec ); expected provideToCacheDir( SyncCacheProviderContextRef cacheContext, SyncMediaHandle medium, zypp::Pathname file, ProvideFileSpec filespec ); } } #endif // ZYPP_NG_WORKFLOWS_DOWNLOAD_INCLUDED libzypp-17.36.5/zypp/ng/workflows/keyringwf.cc000066400000000000000000000372731476576476200214110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "keyringwf.h" #include "logichelpers.h" #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng::KeyRingWorkflow { template struct ImportKeyFromRepoLogic : public LogicBase { using ZyppContextRefType = MaybeAsyncContextRef; using ZyppContextType = remove_smart_ptr_t; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); public: ImportKeyFromRepoLogic( ZyppContextRefType context, std::string &&keyId, zypp::RepoInfo &&info ) : _context( std::move(context) ), _keyId(std::move(keyId)), _repo( std::move(info) ) { } MaybeAsyncRef execute () { using namespace zyppng::operators; using zyppng::operators::operator|; using zyppng::expected; if ( _keyId.empty() || !_context ) return makeReadyResult(false); const zypp::ZConfig &conf = _context->config(); zypp::Pathname cacheDir = conf.repoManagerRoot() / conf.pubkeyCachePath(); return RepoInfoWorkflow::provideKey( _context, _repo, _keyId, cacheDir ) | [this, cacheDir]( zypp::Pathname myKey ) { if ( myKey.empty() ) // if we did not find any keys, there is no point in checking again, break return false; zypp::PublicKey key; try { key = zypp::PublicKey( myKey ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); return false; } if ( !key.isValid() ) { ERR << "Key [" << _keyId << "] from cache: " << cacheDir << " is not valid" << std::endl; return false; } MIL << "Key [" << _keyId << "] " << key.name() << " loaded from cache" << std::endl; zypp::KeyContext context; context.setRepoInfo( _repo ); if ( !KeyRingReportHelper(_context).askUserToAcceptPackageKey( key, context ) ) { return false; } MIL << "User wants to import key [" << _keyId << "] " << key.name() << " from cache" << std::endl; try { _context->keyRing()->importKey( key, true ); } catch ( const zypp::KeyRingException &e ) { ZYPP_CAUGHT(e); ERR << "Failed to import key: "<<_keyId; return false; } return true; }; } ZyppContextRefType _context; std::string _keyId; zypp::RepoInfo _repo; }; bool provideAndImportKeyFromRepository( SyncContextRef ctx, std::string id_r, zypp::RepoInfo info_r ) { return SimpleExecutor>::run( ctx, std::move(id_r), std::move(info_r) ); } AsyncOpRef provideAndImportKeyFromRepository( ContextRef ctx, std::string id_r, zypp::RepoInfo info_r) { return SimpleExecutor>::run( ctx, std::move(id_r), std::move(info_r) ); } namespace { /*! * \class VerifyFileSignatureLogic * Implementation of the logic part for the verifyFileSignature workflow */ template struct VerifyFileSignatureLogic : public LogicBase { ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); using ZyppContextRefType = MaybeAsyncContextRef; using KeyTrust = zypp::KeyRingReport::KeyTrust; VerifyFileSignatureLogic( ZyppContextRefType zyppContext, KeyRingRef &&keyRing, zypp::keyring::VerifyFileContext &&ctx ) : _zyppContext( std::move(zyppContext) ) , _keyringReport( _zyppContext ) , _keyRing( std::move(keyRing) ) , _verifyContext( std::move(ctx) ) { } struct FoundKeyData { zypp::PublicKeyData _foundKey; zypp::Pathname _whichKeyRing; bool trusted = false; }; MaybeAsyncRef findKey ( const std::string &id ) { using zyppng::operators::operator|; if ( id.empty() ) return makeReadyResult(FoundKeyData{zypp::PublicKeyData(), zypp::Pathname()}); // does key exists in trusted keyring zypp::PublicKeyData trustedKeyData( _keyRing->pimpl().publicKeyExists( id, _keyRing->pimpl().trustedKeyRing() ) ); if ( trustedKeyData ) { MIL << "Key is trusted: " << trustedKeyData << std::endl; // lets look if there is an updated key in the // general keyring zypp::PublicKeyData generalKeyData( _keyRing->pimpl().publicKeyExists( id, _keyRing->pimpl().generalKeyRing() ) ); if ( generalKeyData ) { // bnc #393160: Comment #30: Compare at least the fingerprint // in case an attacker created a key the the same id. // // FIXME: bsc#1008325: For keys using subkeys, we'd actually need // to compare the subkey sets, to tell whether a key was updated. // because created() remains unchanged if the primary key is not touched. // For now we wait until a new subkey signs the data and treat it as a // new key (else part below). if ( trustedKeyData.fingerprint() == generalKeyData.fingerprint() && trustedKeyData.created() < generalKeyData.created() ) { MIL << "Key was updated. Saving new version into trusted keyring: " << generalKeyData << std::endl; _keyRing->importKey( _keyRing->pimpl().exportKey( generalKeyData, _keyRing->pimpl().generalKeyRing() ), true ); trustedKeyData = _keyRing->pimpl().publicKeyExists( id, _keyRing->pimpl().trustedKeyRing() ); // re-read: invalidated by import? } } return makeReadyResult( FoundKeyData{ trustedKeyData, _keyRing->pimpl().trustedKeyRing(), true } ); } else { zypp::PublicKeyData generalKeyData( _keyRing->pimpl().publicKeyExists( id, _keyRing->pimpl().generalKeyRing() ) ); if ( generalKeyData ) { zypp::PublicKey key( _keyRing->pimpl().exportKey( generalKeyData, _keyRing->pimpl().generalKeyRing() ) ); MIL << "Key [" << id << "] " << key.name() << " is not trusted" << std::endl; // ok the key is not trusted, ask the user to trust it or not zypp::KeyRingReport::KeyTrust reply = _keyringReport.askUserToAcceptKey( key, _verifyContext.keyContext() ); if ( reply == zypp::KeyRingReport::KEY_TRUST_TEMPORARILY || reply == zypp::KeyRingReport::KEY_TRUST_AND_IMPORT ) { zypp::Pathname whichKeyring; MIL << "User wants to trust key [" << id << "] " << key.name() << std::endl; if ( reply == zypp::KeyRingReport::KEY_TRUST_AND_IMPORT ) { MIL << "User wants to import key [" << id << "] " << key.name() << std::endl; _keyRing->importKey( key, true ); whichKeyring = _keyRing->pimpl().trustedKeyRing(); } else whichKeyring = _keyRing->pimpl().generalKeyRing(); return makeReadyResult(FoundKeyData { std::move(generalKeyData), std::move(whichKeyring), true }); } else { MIL << "User does not want to trust key [" << id << "] " << key.name() << std::endl; return makeReadyResult(FoundKeyData { std::move(generalKeyData), _keyRing->pimpl().generalKeyRing(), false }); } } else if ( ! _verifyContext.keyContext().empty() ) { // try to find the key in the repository info return provideAndImportKeyFromRepository ( _zyppContext, id, _verifyContext.keyContext().repoInfo() ) | [this, id]( bool success ) { if ( !success ) { return FoundKeyData{ zypp::PublicKeyData(), zypp::Pathname() }; } return FoundKeyData{ _keyRing->pimpl().publicKeyExists( id, _keyRing->pimpl().trustedKeyRing() ), _keyRing->pimpl().trustedKeyRing(), true }; }; } } return makeReadyResult(FoundKeyData{ zypp::PublicKeyData(), zypp::Pathname() }); } // returns std::pair auto execute () { _verifyContext.resetResults(); const zypp::Pathname & file { _verifyContext.file() }; const zypp::Pathname & signature { _verifyContext.signature() }; const std::string & filedesc { _verifyContext.shortFile() }; MIL << "Going to verify signature for " << filedesc << " ( " << file << " ) with " << signature << std::endl; // if signature does not exists, ask user if they want to accept unsigned file. if( signature.empty() || (!zypp::PathInfo( signature ).isExist()) ) { bool res = _keyringReport.askUserToAcceptUnsignedFile( filedesc, _verifyContext.keyContext() ); MIL << "askUserToAcceptUnsignedFile: " << res << std::endl; return makeReadyResult( makeReturn(res) ); } // get the id of the signature (it might be a subkey id!) _verifyContext.signatureId( _keyRing->readSignatureKeyId( signature ) ); //throws ! const std::string & id = _verifyContext.signatureId(); // collect the buddies std::list buddies; // Could be imported IFF the file is validated by a trusted key for ( const auto & sid : _verifyContext.buddyKeys() ) { if ( not zypp::PublicKeyData::isSafeKeyId( sid ) ) { WAR << "buddy " << sid << ": key id is too short to safely identify a gpg key. Skipping it." << std::endl; continue; } if ( _keyRing->pimpl().trustedPublicKeyExists( sid ) ) { MIL << "buddy " << sid << ": already in trusted key ring. Not needed." << std::endl; continue; } auto pk = _keyRing->pimpl().publicKeyExists( sid ); if ( not pk ) { WAR << "buddy " << sid << ": not available in the public key ring. Skipping it." << std::endl; continue; } if ( pk.providesKey(id) ) { MIL << "buddy " << sid << ": is the signing key. Handled separately." << std::endl; continue; } MIL << "buddy " << sid << ": candidate for auto import. Remeber it." << std::endl; buddies.push_back( pk ); } using zyppng::operators::operator|; return findKey( id ) | [this, id, buddies=std::move(buddies)]( FoundKeyData res ) { const zypp::Pathname & file { _verifyContext.file() }; const zypp::KeyContext & keyContext { _verifyContext.keyContext() }; const zypp::Pathname & signature { _verifyContext.signature() }; const std::string & filedesc { _verifyContext.shortFile() }; if ( res._foundKey ) { // we found a key but it is not trusted ( e.g. user did not want to trust it ) if ( !res.trusted ) return makeReturn(false); // it exists, is trusted, does it validate? _verifyContext.signatureIdTrusted( res._whichKeyRing == _keyRing->pimpl().trustedKeyRing() ); _keyringReport.infoVerify( filedesc, res._foundKey, keyContext ); if ( _keyRing->pimpl().verifyFile( file, signature, res._whichKeyRing ) ) { _verifyContext.fileValidated( true ); if ( _verifyContext.signatureIdTrusted() && not buddies.empty() ) { // Check for buddy keys to be imported... MIL << "Validated with trusted key: importing buddy list..." << std::endl; _keyringReport.reportAutoImportKey( buddies, res._foundKey, keyContext ); for ( const auto & kd : buddies ) { _keyRing->importKey( _keyRing->pimpl().exportKey( kd, _keyRing->pimpl().generalKeyRing() ), true ); } } return makeReturn(_verifyContext.fileValidated()); // signature is actually successfully validated! } else { bool userAnswer = _keyringReport.askUserToAcceptVerificationFailed( filedesc, _keyRing->pimpl().exportKey( res._foundKey, res._whichKeyRing ), keyContext ); MIL << "askUserToAcceptVerificationFailed: " << userAnswer << std::endl; return makeReturn(userAnswer); } } else { // signed with an unknown key... MIL << "File [" << file << "] ( " << filedesc << " ) signed with unknown key [" << id << "]" << std::endl; bool res = _keyringReport.askUserToAcceptUnknownKey( filedesc, id, _verifyContext.keyContext() ); MIL << "askUserToAcceptUnknownKey: " << res << std::endl; return makeReturn(res); } return makeReturn(false); }; } protected: ZyppContextRefType _zyppContext; KeyRingReportHelper _keyringReport; KeyRingRef _keyRing; zypp::keyring::VerifyFileContext _verifyContext; private: inline std::pair makeReturn( bool res ){ _verifyContext.fileAccepted( res ); return std::make_pair( res, std::move(_verifyContext) ) ; } }; } std::pair verifyFileSignature( SyncContextRef zyppContext, zypp::keyring::VerifyFileContext &&context_r ) { auto kr = zyppContext->keyRing(); return SimpleExecutor >>::run( std::move(zyppContext), std::move(kr), std::move(context_r) ); } AsyncOpRef> verifyFileSignature( ContextRef zyppContext, zypp::keyring::VerifyFileContext &&context_r ) { auto kr = zyppContext->keyRing(); return SimpleExecutor >>::run( std::move(zyppContext), std::move(kr), std::move(context_r) ); } std::pair verifyFileSignature( SyncContextRef zyppContext, zypp::KeyRing_Ptr keyRing, zypp::keyring::VerifyFileContext &&context_r ) { return SimpleExecutor >>::run( std::move(zyppContext), std::move(keyRing), std::move(context_r) ); } AsyncOpRef> verifyFileSignature(ContextRef zyppContext, zypp::KeyRing_Ptr keyRing, zypp::keyring::VerifyFileContext &&context_r ) { return SimpleExecutor >>::run( std::move(zyppContext), std::move(keyRing), std::move(context_r) ); } } libzypp-17.36.5/zypp/ng/workflows/keyringwf.h000066400000000000000000000067301476576476200212450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_KEYRINGWORKFLOW_INCLUDED #define ZYPP_NG_KEYRINGWORKFLOW_INCLUDED #include #include namespace zypp { class RepoInfo; DEFINE_PTR_TYPE(KeyRing); namespace keyring { class VerifyFileContext; } } namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (Context); ZYPP_FWD_DECL_TYPE_WITH_REFS (SyncContext); /*! * \namespace KeyRingWorkflow * Contains all KeyRing related workflows. * * \sa zypp::KeyRing */ namespace KeyRingWorkflow { /** * Try to find the \a id in key cache or repository specified in \a info. Ask the user to trust * the key if it was found */ bool provideAndImportKeyFromRepository(SyncContextRef ctx, std::string id_r, zypp::RepoInfo info_r ); AsyncOpRef provideAndImportKeyFromRepository(ContextRef ctx, std::string id_r, zypp::RepoInfo info_r ); /** * Follows a signature verification interacting with the user. * The bool returned depends on user decision to trust or not. * * To propagate user decisions, either connect to the \ref KeyRingReport * or use its static methods to set the desired defaults. * * A second bool passed as reference arg \a sigValid_r tells whether the * signature was actually successfully verified. If \a sigValid_r returns * \c false, but the method \c true, you know it's due to user callback or * defaults. * * \code * struct KeyRingReportReceive : public callback::ReceiveReport * { * KeyRingReportReceive() { connect(); } * * // Overload the virtual methods to return the appropriate values. * virtual bool askUserToAcceptUnsignedFile( const std::string &file ); * ... * }; * \endcode * * \param keyRing The KeyRing instance the file verification should run against * \param context_r The verification context containing all required informations * * \returns a std::pair, containing a boolean signalling if the verification was successful or not and the \ref zypp::keyring::VerifyFileContext containing * more detailed informations. * * \see \ref zypp::KeyRingReport */ std::pair verifyFileSignature( SyncContextRef zyppContext, zypp::keyring::VerifyFileContext && context_r ); AsyncOpRef> verifyFileSignature( ContextRef zyppContext, zypp::keyring::VerifyFileContext && context_r ); std::pair verifyFileSignature( SyncContextRef zyppContext, zypp::KeyRing_Ptr keyRing, zypp::keyring::VerifyFileContext &&context_r ); AsyncOpRef> verifyFileSignature( ContextRef zyppContext, zypp::KeyRing_Ptr keyRing, zypp::keyring::VerifyFileContext &&context_r ); } } #endif libzypp-17.36.5/zypp/ng/workflows/logichelpers.h000066400000000000000000000206051476576476200217150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_LOGICHELPERS_INCLUDED #define ZYPP_NG_LOGICHELPERS_INCLUDED #include namespace zyppng { namespace detail { template struct LogicBaseExec : public Op { }; template struct LogicBaseExec>> : public Op { protected: AsyncOpRef _innerPipeline; }; } /*! * Helper Mixin for types that need to return async results if * they are compiled in a async context. */ template struct MaybeAsyncMixin { // Make the isAsync flag accessible for subclasses. static constexpr bool is_async = isAsync; /*! * Evaluates to either \a AsyncOpRef or \a Type ,based on the \a isAsync template param. */ template using MaybeAsyncRef = std::conditional_t< isAsync, AsyncOpRef, Type>; protected: /*! * Returns the value given in \a res either as \ref AsyncOpRef or as T depending on the * \a isAsync template param. */ template inline auto makeReadyResult( T &&res ) { return zyppng::makeReadyResult ( std::forward(res) ); } }; /*! * Forward declares some convenience functions from MaybeAsyncMixin class so they can be used directly * See \ref MaybeAsyncMixin for documentation */ #define ZYPP_ENABLE_MAYBE_ASYNC_MIXIN( IsAsync ) \ using MaybeAsyncMixin::makeReadyResult; \ template \ using MaybeAsyncRef = typename MaybeAsyncMixin:: template MaybeAsyncRef /*! * Logic base class template, this allows us to implement certain workflows * in a sync/async agnostic way, based on the OpType the code is either * sync or async: * * \code * * // ------------------ computeint.h --------------------------- * * // the public interface for the workflows are just functions, usually with some * // context object just save passing a gazillion of arguments to the func and * // to carry some state. * AsyncOpRef> computeInt( ContextRef context ); * expected computeInt( SyncContextRef context ); * * // ------------------ computeint.cc --------------------------- * * namespace { * template < * typename Executor ///< The Final Executor type that subclasses from ComputeIntLogic * , typename OpType ///< The SyncOp or AsyncOp result type, LogicBase will derive from it * > * struct ComputeIntLogic : public LogicBase * { * // declare some helper tools from the base * ZYPP_ENABLE_LOGIC_BASE(Executor, OpType); * * // declare our context type based on the OpType we are * using ZyppContextRefType = MaybeAsyncContextRef; * * // all arguments to the sync/async function are passed to the constructor * LogicImpl( ZyppContextRefType ctx ) * : LogicBase() * , _ctx( std::move(ctx) ) * {} * * // every logic type must implement execute() without any arguments, returning * // the result type. In async world the pipeline will be stored in the object until its ready * MaybeAsyncRef<> execute() { * return executor()->computeSomeInt() * | and_then( [this]( int result ) { * std::cout<< "Int calculated as: " << result << std::endl; * return expected::success(result); * }); * } * * protected: * ZyppContextRefType _ctx; * }; * * // AsyncOp Executor for ComputeIntLogic implementation, * // here we put all code that can not be implementedin a * // sync/async agnostic way. Usually sending reports to the user. * // If no such code is required, simply use the \ref SimpleExecutor template * class ComputeIntAsyncExecutor : public ComputeIntLogic> * { * // usually we just want to use Logic's constructors * using ComputeIntLogic>::ComputeIntLogic; * AsyncOpRef> computeSomeInt() { * // .... some implementation that asynchronously computes a int and returns it * } * }; * * // SyncOp Executor for ComputeIntLogic implementation, * // here we put all the sync variants of code that can not be implemented in a * // sync/async agnostic way. Usually sending reports to the user. * // If no such code is required, simply use the \ref SimpleExecutor template * class ComputeIntSyncExecutor : public ComputeIntLogic> * { * using ComputeIntLogic>::ComputeIntLogic; * expected computeSomeInt(){ * // .... some implementation that synchronously computes a int and returns it * } * }; * * } //namespace * * // by overloading this function on the (Sync)ContextRef type other workflow implementations * // can call the async/sync version just by passing the right parameters * AsyncOpRef> computeInt( ContextRef context ) { * // the run() static method is provided by the LogicBase subclass * return ComputeIntAsyncExecutor::run( std::move(context) ); * } * * expected computeInt( SyncContextRef context ) { * // the run() static method is provided by the LogicBase subclass * return ComputeIntSyncExecutor::run( std::move(context) ); * } * * \endcode */ template struct LogicBase : public detail::LogicBaseExec, public MaybeAsyncMixin> { using ExecutorType = Executor; using Result = typename OpType::value_type; LogicBase( ){ } virtual ~LogicBase(){} template static std::enable_if_t< detail::is_async_op_v, AsyncOpRef> run( Args &&...args ) { auto op = std::make_shared( std::forward(args)... ); op->asyncExecute(); return op; } template static std::enable_if_t< !detail::is_async_op_v, Result> run( Args &&...args ) { return Executor( std::forward(args)... ).execute(); } /*! * Allows access to functionality provided by the \a Executor parent class, * usually used for sending user reports because those are too different for sync and async. */ Executor *executor () { return static_cast(this); } private: template std::enable_if_t< detail::is_async_op_v, void> asyncExecute() { this->_innerPipeline = static_cast(this)->execute(); this->_innerPipeline->onReady([this]( auto &&val ){ this->setReady( std::forward(val) ); }); } }; /*! * Helper base class for the sync * only parts of a logic implementation */ template struct SyncOp : public Base { using value_type = Result; }; template typename Logic , typename OpType> struct SimpleExecutor : public Logic, OpType> { public: template SimpleExecutor( Args &&...args ) : Logic, OpType>( std::forward(args)...) {} }; /*! * Forward declares some convenience functions from Base class so they can be used directly * See \ref LogicBase for documentation */ #define ZYPP_ENABLE_LOGIC_BASE(Executor, OpType) \ using LogicBase::executor; \ using LogicBase::makeReadyResult; \ template \ using MaybeAsyncRef = typename LogicBase:: template MaybeAsyncRef } #endif libzypp-17.36.5/zypp/ng/workflows/mediafacade.cc000066400000000000000000000540651476576476200216050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "mediafacade.h" #include "zypp/media/MediaHandlerFactory.h" #include #include #include #include #include #include #include namespace zyppng { class AttachedSyncMediaInfo : public zypp::base::ReferenceCounted, private zypp::base::NonCopyable { public: AttachedSyncMediaInfo( MediaSyncFacadeRef parentRef, zypp::media::MediaAccessId mediaId, zypp::Url baseUrl, ProvideMediaSpec mediaSpec, const zypp::Pathname &locPath ); zypp::media::MediaAccessId mediaId () const; const ProvideMediaSpec &spec() const; const zypp::Url &url() const; const std::optional &rootPath() const; MediaSyncFacadeRef parent() const; /*! * Returns true if \a other requests the same medium as this instance */ bool isSameMedium ( const std::vector &urls, const ProvideMediaSpec &spec ); // ReferenceCounted interface protected: void unref_to(unsigned int) const override; private: zypp::media::MediaAccessId _id; zypp::Url _attachedUrl; ProvideMediaSpec _spec; MediaSyncFacadeRef _parent; std::optional _localPath; }; IMPL_PTR_TYPE( AttachedSyncMediaInfo ); AttachedSyncMediaInfo::AttachedSyncMediaInfo(MediaSyncFacadeRef parentRef, zypp::media::MediaAccessId mediaId, zypp::Url baseUrl, ProvideMediaSpec mediaSpec, const zypp::Pathname &locPath) : _id( mediaId ) , _attachedUrl(std::move( baseUrl )) , _spec(std::move( mediaSpec )) , _parent(std::move( parentRef )) , _localPath( locPath ) {} zypp::media::MediaAccessId AttachedSyncMediaInfo::mediaId() const { return _id; } const ProvideMediaSpec &AttachedSyncMediaInfo::spec() const { return _spec; } const zypp::Url &AttachedSyncMediaInfo::url() const { return _attachedUrl; } const std::optional &AttachedSyncMediaInfo::rootPath() const { return _localPath; } MediaSyncFacadeRef AttachedSyncMediaInfo::parent() const { return _parent; } bool AttachedSyncMediaInfo::isSameMedium(const std::vector &urls, const ProvideMediaSpec &spec) { const auto check = _spec.isSameMedium(spec); if ( !zypp::indeterminate (check) ) return (bool)check; // let the URL rule return ( std::find( urls.begin(), urls.end(), _attachedUrl ) != urls.end() ); } void AttachedSyncMediaInfo::unref_to( unsigned int count ) const { // once count reaches 1 only the MediaSyncFacade holds a reference, // time to release the medium if ( count == 1 ) { _parent->releaseMedium ( this ); // !!!! careful from here on out 'this' is most likely invalid !!!! return; } } SyncMediaHandle::SyncMediaHandle(){ } SyncMediaHandle::SyncMediaHandle(AttachedSyncMediaInfo_Ptr dataPtr) : _data( std::move(dataPtr) ) { } MediaSyncFacadeRef SyncMediaHandle::parent() const { return _data->parent(); } bool SyncMediaHandle::isValid() const { return _data.get() != nullptr; } const zypp::Url &SyncMediaHandle::baseUrl() const { static zypp::Url invalidHandle; if ( !_data ) return invalidHandle; return _data->url(); } const std::optional &SyncMediaHandle::localPath() const { static std::optional invalidPath; if ( !_data ) return invalidPath; return _data->rootPath(); } const AttachedSyncMediaInfo &SyncMediaHandle::info() const { return *_data; } MediaSyncFacade::Res::Res(MediaHandle hdl, zypp::ManagedFile file) : _res( std::move(file) ) , _provideHandle( std::move (hdl) ) { } const zypp::Pathname MediaSyncFacade::Res::file() const { return _res; } ZYPP_IMPL_PRIVATE_CONSTR (MediaSyncFacade) { } std::vector MediaSyncFacade::sanitizeUrls(const std::vector &urls) const { std::vector usableMirrs; std::optional handlerType; for ( auto mirrIt = urls.begin() ; mirrIt != urls.end(); mirrIt++ ) { const auto &s = zypp::media::MediaHandlerFactory::handlerType ( *mirrIt ); if ( !s ) { WAR << "URL: " << *mirrIt << " is not supported, ignoring!" << std::endl; continue; } if ( !handlerType ) { handlerType = *s; usableMirrs.push_back ( *mirrIt ); } else { if ( handlerType == *s) { usableMirrs.push_back( *mirrIt ); } else { WAR << "URL: " << *mirrIt << " has different handler type than the primary URL: "<< usableMirrs.front() <<", ignoring!" << std::endl; } } } if ( !handlerType || usableMirrs.empty() ) { return {}; } return usableMirrs; } expected MediaSyncFacade::attachMedia( const zypp::Url &url, const ProvideMediaSpec &request ) { bool isVolatile = url.schemeIsVolatile(); auto effectiveUrl = url; std::optional attachId; zypp::callback::SendReport report; // nothing attached, make a new one zypp::media::MediaManager mgr; do { try { if ( !attachId ) { if ( request.medianr() > 1 ) effectiveUrl = zypp::MediaSetAccess::rewriteUrl( effectiveUrl, request.medianr() ); attachId = mgr.open( effectiveUrl ); if ( !request.mediaFile().empty() ) { mgr.addVerifier( *attachId, zypp::media::MediaVerifierRef( new zypp::repo::SUSEMediaVerifier( request.mediaFile(), request.medianr() ) ) ); } } // attach the medium mgr.attach( *attachId ); auto locPath = mgr.localPath( *attachId, "/" ); auto attachInfo = AttachedSyncMediaInfo_Ptr( new AttachedSyncMediaInfo( shared_this(), *attachId, url, request, locPath ) ); _attachedMedia.push_back( attachInfo ); return expected::success( std::move(attachInfo) ); } catch ( const zypp::media::MediaException &excp ) { ZYPP_CAUGHT(excp); // if no one is listening, just return the error as is if ( !zypp::callback::SendReport::connected() || !attachId ) { return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } // default action is to cancel zypp::media::MediaChangeReport::Action user = zypp::media::MediaChangeReport::ABORT; do { // here: Manager tried all not attached drives and could not find the desired medium // we need to send the media change report // set up the reason auto reason = zypp::media::MediaChangeReport::INVALID; if( typeid(excp) == typeid( zypp::media::MediaNotDesiredException) ) { reason = zypp::media::MediaChangeReport::WRONG; } unsigned int devindex = 0; std::vector devices; mgr.getDetectedDevices(*attachId, devices, devindex); std::optional currentlyUsed; if ( devices.size() ) currentlyUsed = devices[devindex]; if ( isVolatile ) { // filter devices that are mounted, aka used, we can not eject them const auto &mountedDevs = zypp::media::Mount::getEntries(); devices.erase( std::remove_if( devices.begin (), devices.end(), [&](const std::string &dev) { zypp::PathInfo devInfo(dev); return std::any_of( mountedDevs.begin (), mountedDevs.end(), [&devInfo]( const zypp::media::MountEntry &e ) { zypp::PathInfo pi( e.src ); return ( pi.isBlk() && pi.devMajor() == devInfo.devMajor() && pi.devMinor() == devInfo.devMinor() ); }); }), devices.end() ); if ( !devices.size () ) { // Jammed, no currently free device MIL << "No free device available, return jammed and try again later ( hopefully) " << std::endl; if ( attachId ) mgr.close ( *attachId ); return expected::error( ZYPP_EXCPT_PTR(zypp::media::MediaJammedException()) ); } // update index to currenty used dev bool foundCurrent = false; if ( currentlyUsed ) { for ( unsigned int i = 0; i < devices.size(); i++ ) { if ( devices[i] == *currentlyUsed ) { foundCurrent = true; devindex = i; break; } } } if ( !foundCurrent ){ devindex = 0; // seems 0 is what is set in the handlers too if there is no current } } user = report->requestMedia ( effectiveUrl, request.medianr(), request.label(), reason, excp.asUserHistory(), devices, devindex ); MIL << "ProvideFile exception caught, callback answer: " << user << std::endl; switch ( user ) { case zypp::media::MediaChangeReport::ABORT: { DBG << "Aborting" << std::endl; if ( attachId ) mgr.close ( *attachId ); zypp::AbortRequestException aexcp("Aborting requested by user"); aexcp.remember(excp); return expected::error( ZYPP_EXCPT_PTR(aexcp) ); } case zypp::media::MediaChangeReport::IGNORE: { DBG << "Skipping" << std::endl; if ( attachId ) mgr.close ( *attachId ); zypp::SkipRequestException nexcp("User-requested skipping of a file"); nexcp.remember(excp); return expected::error( ZYPP_EXCPT_PTR(nexcp) ); } case zypp::media::MediaChangeReport::EJECT: { DBG << "Eject: try to release" << std::endl; try { // MediaSetAccess does a releaseAll, but we can not release other devices that are in use // media_mgr.releaseAll(); mgr.release (*attachId, devindex < devices.size() ? devices[devindex] : ""); } catch ( const zypp::Exception & e) { ZYPP_CAUGHT(e); } break; } case zypp::media::MediaChangeReport::RETRY: case zypp::media::MediaChangeReport::CHANGE_URL: { // retry DBG << "Going to try again" << std::endl; // invalidate current media access id if ( attachId ) { mgr.close(*attachId); attachId.reset(); } // not attaching, media set will do that for us // this could generate uncaught exception (#158620) break; } default: { DBG << "Don't know, let's ABORT" << std::endl; if ( attachId ) mgr.close ( *attachId ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } } while( user == zypp::media::MediaChangeReport::EJECT ); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); if ( attachId ) mgr.close ( *attachId ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } catch (...) { // didn't work -> clean up if ( attachId ) mgr.close ( *attachId ); return expected::error( ZYPP_FWD_CURRENT_EXCPT() ); } } while ( true ); } expected MediaSyncFacade::attachMedia( const std::vector &urls, const ProvideMediaSpec &request ) { // rewrite and sanitize the urls if required std::vector useableUrls = sanitizeUrls(urls); if ( useableUrls.empty () ) return expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("No valid mirrors available") )); // first try and find a already attached medium auto i = std::find_if( _attachedMedia.begin (), _attachedMedia.end(), [&]( const AttachedSyncMediaInfo_Ptr &medium ) { return medium->isSameMedium( useableUrls, request ); }); if ( i != _attachedMedia.end() ) { return expected::success( *i ); } std::exception_ptr lastError; std::exception_ptr jammedError; // from here call attachMedia with just one URL // catch errors, if one of the URLS returns JAMMED, remember it // continue to try other URLs, if they all fail and JAMMED was remembered // return it, otherwise the last error for ( const auto &url : useableUrls ) { try { return expected::success( attachMedia( url, request ).unwrap() ); } catch ( zypp::media::MediaJammedException &e) { ZYPP_CAUGHT(e); if ( !jammedError ) jammedError = std::current_exception (); } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); lastError = std::current_exception(); } catch (...) { // didn't work -> clean up lastError = std::current_exception(); } } if ( jammedError ) { // if we encountered a jammed error return it, there might be still a chance // that invoking the provide again after other pipelines have finished might succeed return expected::error( ZYPP_FWD_EXCPT(jammedError) ); } else if ( lastError ) { // if we have a error stored, return that one return expected::error( ZYPP_FWD_EXCPT(lastError) ); } return expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaException("No URL to attach") ) ); } zyppng::MediaSyncFacade::~MediaSyncFacade() { // this should never happen because every handle has a reference to the media manager, but still add a debug output // so we know in case we have weird behavior. if ( _attachedMedia.size () ) { WAR << "Releasing zyppng::MediaSyncFacade with still valid MediaHandles, this is a bug!" << std::endl; } } expected MediaSyncFacade::prepareMedia(const std::vector &urls, const ProvideMediaSpec &request) { const auto &useableUrls = sanitizeUrls(urls); if ( useableUrls.empty () ) return expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("No valid mirrors available") )); return expected::success( shared_this(), std::move(useableUrls), request ); } expected MediaSyncFacade::prepareMedia(const zypp::Url &url, const ProvideMediaSpec &request) { return prepareMedia( std::vector{url}, request ); } expected MediaSyncFacade::attachMediaIfNeeded( LazyMediaHandle lazyHandle) { using namespace zyppng::operators; if ( lazyHandle.attached() ) return expected::success( *lazyHandle.handle() ); MIL << "Attaching lazy medium with label: [" << lazyHandle.spec().label() << "]" << std::endl; return attachMedia( lazyHandle.urls(), lazyHandle.spec () ) | and_then([lazyHandle]( MediaHandle handle ) { lazyHandle._sharedData->_mediaHandle = handle; return expected::success( std::move(handle) ); }); } expected MediaSyncFacade::provide(const std::vector &urls, const ProvideFileSpec &request) { using namespace zyppng::operators; if ( !urls.size() ) return expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaException("Can not provide a file without a URL.") )); std::optional> lastErr; for ( const zypp::Url& file_url : urls ) { zypp::Url url(file_url); zypp::Pathname fileName(url.getPathName()); url.setPathName ("/"); expected res = attachMedia( url, ProvideMediaSpec( "" ) ) | and_then( [&, this]( const MediaSyncFacade::MediaHandle& handle ) { return provide( handle, fileName, request.asOnMediaLocation(fileName, 1)); }); if ( res ) return res; lastErr = res; } // we always should have a last error, except if the URLs are empty if ( lastErr ) return *lastErr; // we should not get here, but if we do simply use the first entry to make a not found error zypp::Url url( urls.front() ); zypp::Pathname fileName(url.getPathName()); url.setPathName ("/"); return expected::error( ZYPP_EXCPT_PTR ( zypp::media::MediaFileNotFoundException( url, fileName ))); } expected MediaSyncFacade::provide(const zypp::Url &url, const ProvideFileSpec &request) { return provide( std::vector{url}, request ); } expected MediaSyncFacade::provide(const MediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request) { zypp::media::MediaManager mgr; const auto &handleInfo = attachHandle.info(); try { if ( request.checkExistsOnly() ) { if ( !mgr.doesFileExist ( handleInfo.mediaId (), fileName ) ) { return expected::error( ZYPP_EXCPT_PTR( zypp::media::MediaFileNotFoundException( handleInfo.url(), fileName ) ) ); } // we return a result pointing to a non existant file, since the code just asked us to check if the file exists return expected::success( attachHandle, zypp::ManagedFile( mgr.localPath( handleInfo.mediaId(), fileName ) ) ); } else { mgr.provideFile( handleInfo.mediaId (), request.asOnMediaLocation( fileName, handleInfo.spec().medianr()) ); zypp::ManagedFile locFile( mgr.localPath( handleInfo.mediaId(), fileName ) ); // do not clean up files for now, they are cleaned up anyways on detach #if 0 // if the file is downloaded we want to clean it up again if ( handleInfo.url().schemeIsDownloading() ) locFile.setDispose ( zypp::filesystem::unlink ); #endif return expected::success( attachHandle, locFile ); } } catch ( const zypp::Exception &e ) { ZYPP_CAUGHT(e); return expected::error(ZYPP_FWD_CURRENT_EXCPT()); } catch (...) { return expected::error(ZYPP_FWD_CURRENT_EXCPT()); } } expected MediaSyncFacade::provide( const LazyMediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request ) { using namespace zyppng::operators; return attachMediaIfNeeded ( attachHandle ) | and_then([weakMe = weak_this(), fName = fileName, req = request ]( MediaHandle handle ){ auto me = weakMe.lock(); if ( !me ) return expected::error(ZYPP_EXCPT_PTR(zypp::Exception("Provide was released during a operation"))); return me->provide( handle, fName, req); }); } zyppng::expected MediaSyncFacade::checksumForFile(const zypp::Pathname &p, const std::string &algorithm) { try { return expected::success( zypp::CheckSum( algorithm, zypp::filesystem::checksum ( p, algorithm ) ) ); } catch(...) { return expected::error ( std::current_exception () ); } } expected MediaSyncFacade::copyFile(const zypp::Pathname &source, const zypp::Pathname &target) { try { // do what Provide would do and make a URL zypp::Url url("copy:///"); url.setPathName( source ); auto sourcePi = zypp::PathInfo(source); if ( !sourcePi.isExist() ) { return expected::error ( ZYPP_EXCPT_PTR( zypp::media::MediaFileNotFoundException( url, "" ) ) ); } if ( !sourcePi.isFile () ) return expected::error ( ZYPP_EXCPT_PTR( zypp::media::MediaNotAFileException( url, "" ) ) ); auto res = zypp::filesystem::hardlinkCopy( source, target.asString() ); if ( res == 0 ) { return expected::success( zypp::ManagedFile( target, zypp::filesystem::unlink ) ); } else { return expected::error ( ZYPP_EXCPT_PTR( zypp::media::MediaException( zypp::str::Str() << "Failed to create file " << target << " errno: " << res ) ) ); } } catch(...) { return expected::error ( std::current_exception () ); } } expected MediaSyncFacade::copyFile(zyppng::MediaSyncFacade::Res source, const zypp::Pathname &target) { // not much to do here, since this will block until the file has been copied we do not need to remember the ProvideRes return copyFile( source.file(), target ); } void zyppng::MediaSyncFacade::releaseMedium(const AttachedSyncMediaInfo *ptr) { if ( !ptr ) return; auto i = std::find_if(_attachedMedia.begin (), _attachedMedia.end(), [&]( const auto &p ) { return p.get() == ptr; } ); try { zypp::media::MediaManager mgr; mgr.close ( ptr->mediaId() ); } catch ( const zypp::Exception & e ) { ZYPP_CAUGHT(e); } if ( i != _attachedMedia.end() ) { _attachedMedia.erase(i); } else { ERR << "Releasing unknown medium " << ptr->mediaId () << " should not happen"; } } } libzypp-17.36.5/zypp/ng/workflows/mediafacade.h000066400000000000000000000113201476576476200214320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_MEDIASETFACADE_INCLUDED #define ZYPP_NG_MEDIASETFACADE_INCLUDED #include #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS ( MediaSyncFacade ); DEFINE_PTR_TYPE(AttachedSyncMediaInfo); class SyncMediaHandle { public: using ParentType = MediaSyncFacade; SyncMediaHandle(); SyncMediaHandle( AttachedSyncMediaInfo_Ptr dataPtr ); MediaSyncFacadeRef parent() const; bool isValid () const; const zypp::Url &baseUrl() const; const std::optional &localPath() const; const AttachedSyncMediaInfo &info ()const; private: AttachedSyncMediaInfo_Ptr _data; }; /*! * A Facade class that mimics the behavior of the Provide * class just in a sync way. Meaning every operation will finish immediately * instead of returning a \ref AsyncOp. */ class ZYPP_API MediaSyncFacade : public Base { ZYPP_ADD_CREATE_FUNC(MediaSyncFacade) public: friend class AttachedSyncMediaInfo; using MediaHandle = SyncMediaHandle; using LazyMediaHandle = ::zyppng::LazyMediaHandle; class Res { public: Res( MediaHandle hdl, zypp::ManagedFile file ); /*! * Returns the path to the provided file */ const zypp::Pathname file () const; /*! * Returns a reference to the internally used managed file instance. * \note If you obtain this for a file that is inside the providers working directory ( e.g. a provide result for a download ), * the continued use after the Provide instance was relased is undefined behaviour and not supported! */ const zypp::ManagedFile & asManagedFile () const { return _res; } private: zypp::ManagedFile _res; MediaHandle _provideHandle; }; ZYPP_DECL_PRIVATE_CONSTR ( MediaSyncFacade ); ~MediaSyncFacade() override; expected prepareMedia ( const std::vector &urls, const ProvideMediaSpec &request ); expected prepareMedia ( const zypp::Url &url, const ProvideMediaSpec &request ); expected attachMediaIfNeeded( LazyMediaHandle lazyHandle ); expected attachMedia( const std::vector &urls, const ProvideMediaSpec &request ); expected attachMedia( const zypp::Url &url, const ProvideMediaSpec &request ); expected provide( const std::vector &urls, const ProvideFileSpec &request ); expected provide( const zypp::Url &url, const ProvideFileSpec &request ); expected provide( const MediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request ); expected provide( const LazyMediaHandle &attachHandle, const zypp::Pathname &fileName, const ProvideFileSpec &request ); /*! * Schedules a job to calculate the checksum for the given file */ expected checksumForFile ( const zypp::Pathname &p, const std::string &algorithm ); /*! * Schedules a copy job to copy a file from \a source to \a target */ expected copyFile ( const zypp::Pathname &source, const zypp::Pathname &target ); expected copyFile ( Res source, const zypp::Pathname &target ); static auto copyResultToDest ( MediaSyncFacadeRef provider, const zypp::Pathname &targetPath ) { return [ providerRef=std::move(provider), targetPath = targetPath ]( Res &&file ){ zypp::filesystem::assert_dir( targetPath.dirname () ); return providerRef->copyFile( std::move(file), targetPath ); }; } protected: void releaseMedium ( const AttachedSyncMediaInfo *ptr ); private: std::vector sanitizeUrls(const std::vector &urls) const; std::vector _attachedMedia; }; using SyncProvideRes = MediaSyncFacade::Res; //template //using MediaFacade = std::conditional_t; } #endif libzypp-17.36.5/zypp/ng/workflows/repoinfowf.cc000066400000000000000000000220341476576476200215470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "repoinfowf.h" #include "zypp/ng/reporthelper.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zyppng { namespace { using namespace zyppng::operators; template struct RepoInfoProvideKeyLogic : public LogicBase { using ZyppContextRefType = MaybeAsyncContextRef; using ZyppContextType = remove_smart_ptr_t; using ProvideType = typename ZyppContextType::ProvideType; using MediaHandle = typename ProvideType::MediaHandle; using ProvideRes = typename ProvideType::Res; RepoInfoProvideKeyLogic( ZyppContextRefType &&zyppContext, zypp::RepoInfo &&info, std::string &&keyID_r, zypp::Pathname &&targetDirectory_r ) : _reports( std::move(zyppContext )) , _info( std::move(info) ) , _keyID_r(std::move( keyID_r )) , _targetDirectory_r(std::move( targetDirectory_r )) , _keyIDStr( _keyID_r.size() > 8 ? _keyID_r.substr( _keyID_r.size()-8 ) : _keyID_r ) // print short ID in Jobreports , _tempKeyRing( _tmpKeyRingDir ) { } ZYPP_ENABLE_LOGIC_BASE( Executor, OpType ); MaybeAsyncRef execute () { using namespace zyppng::operators; using zyppng::operators::operator|; using zyppng::expected; if ( _keyID_r.empty() ) return makeReadyResult(zypp::Pathname{}); importKeysInTargetDir(); if ( _tempKeyRing.isKeyTrusted( _keyID_r) ) { return makeReadyResult(writeKeysToTargetDir()); } if ( _info.gpgKeyUrlsEmpty() ) { // translator: %1% is a repositories name _reports.info( zypp::str::Format(_("Repository %1% does not define additional 'gpgkey=' URLs.") ) % _info.asUserString() ); return makeReadyResult(writeKeysToTargetDir()); } // no key in the cache is what we are looking for, lets download // all keys specified in gpgkey= entries // translator: %1% is a gpg key ID like 3DBDC284 // %2% is a repositories name _reports.info( zypp::str::Format(_("Looking for gpg key ID %1% in repository %2%.") ) % _keyIDStr % _info.asUserString() ); return _info.gpgKeyUrls() | transform( [this]( const zypp::Url &url ) { _reports.info( " gpgkey=" + url.asString() ); return fetchKey( url ) | and_then( [this, url]( zypp::ManagedFile f ) -> expected { try { if ( f->empty() ) return expected::error(std::make_exception_ptr( zypp::Exception("Empty ManagedFile returned.") )); zypp::PublicKey key(f); if ( !key.isValid() ) return expected::error(std::make_exception_ptr( zypp::Exception("Invalid public key.") )); // import all keys into our temporary keyring _tempKeyRing.multiKeyImport(f, true); } catch ( const std::exception & e ) { //ignore and continue to next url ZYPP_CAUGHT(e); MIL << "Key import from url:'"<::error( ZYPP_FWD_CURRENT_EXCPT() ); } return expected::success(); }); }) | [this]( std::list> && ) ->zypp::Pathname { return writeKeysToTargetDir(); }; } protected: MaybeAsyncRef> fetchKey ( const zypp::Url &url ) { return _reports.zyppContext()->provider ()->provide( url, zyppng::ProvideFileSpec() ) | and_then( ProvideType::copyResultToDest( _reports.zyppContext()->provider(), _targetDirectory_r / zypp::Pathname( url.getPathName() ).basename() ) ); } void importKeysInTargetDir () { MIL << "Check for " << _keyID_r << " at " << _targetDirectory_r << std::endl; // translator: %1% is a gpg key ID like 3DBDC284 // %2% is a cache directories path _reports.info( zypp::str::Format(_("Looking for gpg key ID %1% in cache %2%.") ) % _keyIDStr % _targetDirectory_r ); zypp::filesystem::dirForEach( _targetDirectory_r, zypp::StrMatcher(".key", zypp::Match::STRINGEND), [this]( const zypp::Pathname & dir_r, const std::string & str_r ){ try { // deprecate a month old keys zypp::PathInfo fileInfo ( dir_r/str_r ); if ( zypp::Date::now() - fileInfo.mtime() > zypp::Date::month ) { //if unlink fails, the file will be overriden in the next step, no need //to show a error zypp::filesystem::unlink( dir_r/str_r ); } else { _tempKeyRing.multiKeyImport(dir_r/str_r, true); } } catch (const zypp::KeyRingException& e) { ZYPP_CAUGHT(e); ERR << "Error importing cached key from file '"< _reports; const zypp::RepoInfo _info; const std::string _keyID_r; const zypp::Pathname _targetDirectory_r; const std::string _keyIDStr; zypp::filesystem::TmpDir _tmpKeyRingDir; zypp::KeyRing _tempKeyRing; }; struct AsyncRepoInfoProvideKey : public RepoInfoProvideKeyLogic> { using RepoInfoProvideKeyLogic::RepoInfoProvideKeyLogic; }; struct SyncRepoInfoProvideKey : public RepoInfoProvideKeyLogic> { using RepoInfoProvideKeyLogic::RepoInfoProvideKeyLogic; }; } zypp::filesystem::Pathname RepoInfoWorkflow::provideKey( SyncContextRef ctx, zypp::RepoInfo info, std::string keyID_r, zypp::filesystem::Pathname targetDirectory_r ) { return SimpleExecutor>::run( std::move(ctx), std::move(info), std::move(keyID_r), std::move(targetDirectory_r) ); } AsyncOpRef RepoInfoWorkflow::provideKey(ContextRef ctx, zypp::RepoInfo info, std::string keyID_r, zypp::filesystem::Pathname targetDirectory_r ) { return SimpleExecutor>::run( std::move(ctx), std::move(info), std::move(keyID_r), std::move(targetDirectory_r) ); } } libzypp-17.36.5/zypp/ng/workflows/repoinfowf.h000066400000000000000000000022621476576476200214120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_REPOINFOWORKFLOW_INCLUDED #define ZYPP_NG_REPOINFOWORKFLOW_INCLUDED #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (Context); ZYPP_FWD_DECL_TYPE_WITH_REFS (SyncContext); namespace RepoInfoWorkflow { zypp::Pathname provideKey ( SyncContextRef ctx, zypp::RepoInfo info, std::string keyID_r, zypp::Pathname targetDirectory_r ); AsyncOpRef provideKey ( ContextRef ctx, zypp::RepoInfo info, std::string keyID_r, zypp::Pathname targetDirectory_r ); } } #endif libzypp-17.36.5/zypp/ng/workflows/signaturecheckwf.cc000066400000000000000000000057011476576476200227270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "signaturecheckwf.h" #include "keyringwf.h" #include "logichelpers.h" #include #include #include namespace zyppng { namespace { using namespace zyppng::operators; template struct VerifySignatureLogic : public LogicBase { ZYPP_ENABLE_LOGIC_BASE(Executor,OpType); using ZyppContextRefType = MaybeAsyncContextRef; VerifySignatureLogic( ZyppContextRefType &&zyppCtx, zypp::keyring::VerifyFileContext &&ctx ) : _zyppCtx( std::move(zyppCtx) ) , _verifyCtx( std::move(ctx) ) { } MaybeAsyncRef> execute () { const zypp::Pathname & sig { _verifyCtx.signature() }; if ( not ( sig.empty() || zypp::PathInfo(sig).isExist() ) ) { return makeReadyResult( expected::error(ZYPP_EXCPT_PTR( zypp::SignatureCheckException("Signature " + sig.asString() + " not found.") ))); } MIL << "Checking " << _verifyCtx.file ()<< " file validity using digital signature.." << std::endl; return KeyRingWorkflow::verifyFileSignature( _zyppCtx, zypp::keyring::VerifyFileContext( _verifyCtx ) ) | []( auto &&res ) { if ( not res.first ) return expected::error( ZYPP_EXCPT_PTR( zypp::SignatureCheckException( "Signature verification failed for " + res.second.file().basename() ) ) ); return expected::success ( std::move( res.second ) ); }; } protected: ZyppContextRefType _zyppCtx; zypp::keyring::VerifyFileContext _verifyCtx; }; } namespace SignatureFileCheckWorkflow { expected verifySignature(SyncContextRef ctx, zypp::keyring::VerifyFileContext context ) { return SimpleExecutor>>::run( std::move(ctx), std::move(context) ); } AsyncOpRef > verifySignature(ContextRef ctx, zypp::keyring::VerifyFileContext context ) { return SimpleExecutor>>::run( std::move(ctx), std::move(context) ); } } } libzypp-17.36.5/zypp/ng/workflows/signaturecheckwf.h000066400000000000000000000024551476576476200225740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_NG_SIGNATURECHECK_WORKFLOW_INCLUDED #define ZYPP_NG_SIGNATURECHECK_WORKFLOW_INCLUDED #include #include #include #include #include // async helper #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS (Context); namespace SignatureFileCheckWorkflow { expected verifySignature( SyncContextRef ctx, zypp::keyring::VerifyFileContext context ); AsyncOpRef> verifySignature( ContextRef ctx, zypp::keyring::VerifyFileContext context ); } } #endif libzypp-17.36.5/zypp/parser/000077500000000000000000000000001476576476200157145ustar00rootroot00000000000000libzypp-17.36.5/zypp/parser/HistoryLogReader.cc000066400000000000000000000164271476576476200214630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file HistoryLogReader.cc * */ #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////////// // // class HistoryLogReader::Impl // ///////////////////////////////////////////////////////////////////// struct HistoryLogReader::Impl { Impl( Pathname &&historyFile_r, Options &&options_r, ProcessData &&callback_r ) : _filename( std::move(historyFile_r) ) , _options( std::move(options_r) ) , _callback( std::move(callback_r) ) {} bool parseLine( const std::string & line_r, unsigned int lineNr_r ); void readAll( const ProgressData::ReceiverFnc & progress_r ); void readFrom( const Date & date_r, const ProgressData::ReceiverFnc & progress_r ); void readFromTo( const Date & fromDate_r, const Date & toDate_r, const ProgressData::ReceiverFnc & progress_r ); void addActionFilter( const HistoryActionID & action_r ) { if ( action_r == HistoryActionID::NONE ) _actionfilter.clear(); else _actionfilter.insert( action_r.asString() ); } Pathname _filename; Options _options; ProcessData _callback; std::set _actionfilter; }; bool HistoryLogReader::Impl::parseLine( const std::string & line_r, unsigned lineNr_r ) { // parse into fields HistoryLogData::FieldVector fields; str::splitEscaped( line_r, std::back_inserter(fields), "|", true ); if ( fields.size() < 2 ) { WAR << "Ignore invalid history log entry on line #" << lineNr_r << " '"<< line_r << "'" << endl; return true; // At least an action field[1] is needed! } fields[1] = str::trim( std::move(fields[1]) ); // for whatever reason writer is padding the action field if ( !_actionfilter.empty() && !_actionfilter.count( fields[1] ) ) return true; // move into data class HistoryLogData::Ptr data; try { data = HistoryLogData::create( fields ); } catch ( const Exception & excpt ) { ZYPP_CAUGHT( excpt ); if ( _options.testFlag( IGNORE_INVALID_ITEMS ) ) { WAR << "Ignore invalid history log entry on line #" << lineNr_r << " '"<< line_r << "'" << endl; return true; } else { ERR << "Invalid history log entry on line #" << lineNr_r << " '"<< line_r << "'" << endl; ParseException newexcpt( str::Str() << "Error in history log on line #" << lineNr_r ); newexcpt.remember( excpt ); ZYPP_THROW( newexcpt ); } } // consume data if ( _callback && !_callback( data ) ) { WAR << "Stop parsing requested by consumer callback on line #" << lineNr_r << endl; return false; } return true; } void HistoryLogReader::Impl::readAll( const ProgressData::ReceiverFnc & progress_r ) { InputStream is( _filename ); iostr::EachLine line( is ); ProgressData pd; pd.sendTo( progress_r ); pd.toMin(); for ( ; line; line.next(), pd.tick() ) { // ignore comments if ( (*line)[0] == '#' ) continue; if ( ! parseLine( *line, line.lineNo() ) ) break; // requested by consumer callback } pd.toMax(); } void HistoryLogReader::Impl::readFrom( const Date & date_r, const ProgressData::ReceiverFnc & progress_r ) { InputStream is( _filename ); iostr::EachLine line( is ); ProgressData pd; pd.sendTo( progress_r ); pd.toMin(); bool pastDate = false; for ( ; line; line.next(), pd.tick() ) { const std::string & s = *line; // ignore comments if ( s[0] == '#' ) continue; if ( pastDate ) { if ( ! parseLine( s, line.lineNo() ) ) break; // requested by consumer callback } else { Date logDate( s.substr( 0, s.find('|') ), HISTORY_LOG_DATE_FORMAT ); if ( logDate > date_r ) { pastDate = true; if ( ! parseLine( s, line.lineNo() ) ) break; // requested by consumer callback } } } pd.toMax(); } void HistoryLogReader::Impl::readFromTo( const Date & fromDate_r, const Date & toDate_r, const ProgressData::ReceiverFnc & progress_r ) { InputStream is( _filename ); iostr::EachLine line( is ); ProgressData pd; pd.sendTo( progress_r ); pd.toMin(); bool pastFromDate = false; for ( ; line; line.next(), pd.tick() ) { const std::string & s = *line; // ignore comments if ( s[0] == '#' ) continue; Date logDate( s.substr( 0, s.find('|') ), HISTORY_LOG_DATE_FORMAT ); // past toDate - stop reading if ( logDate >= toDate_r ) break; // past fromDate - start reading if ( !pastFromDate && logDate > fromDate_r ) pastFromDate = true; if ( pastFromDate ) { if ( ! parseLine( s, line.lineNo() ) ) break; // requested by consumer callback } } pd.toMax(); } ///////////////////////////////////////////////////////////////////// // // class HistoryLogReader // ///////////////////////////////////////////////////////////////////// HistoryLogReader::HistoryLogReader( Pathname historyFile_r, Options options_r, ProcessData callback_r ) : _pimpl( new HistoryLogReader::Impl( std::move(historyFile_r), std::move(options_r), std::move(callback_r) ) ) {} HistoryLogReader::~HistoryLogReader() {} void HistoryLogReader::setIgnoreInvalidItems( bool ignoreInvalid_r ) { _pimpl->_options.setFlag( IGNORE_INVALID_ITEMS, ignoreInvalid_r ); } bool HistoryLogReader::ignoreInvalidItems() const { return _pimpl->_options.testFlag( IGNORE_INVALID_ITEMS ); } void HistoryLogReader::readAll( const ProgressData::ReceiverFnc & progress_r ) { _pimpl->readAll( progress_r ); } void HistoryLogReader::readFrom( const Date & date_r, const ProgressData::ReceiverFnc & progress_r ) { _pimpl->readFrom( date_r, progress_r ); } void HistoryLogReader::readFromTo( const Date & fromDate_r, const Date & toDate_r, const ProgressData::ReceiverFnc & progress_r ) { _pimpl->readFromTo( fromDate_r, toDate_r, progress_r ); } void HistoryLogReader::addActionFilter( const HistoryActionID & action_r ) { _pimpl->addActionFilter( action_r ); } } // namespace parser /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/HistoryLogReader.h000066400000000000000000000136331476576476200213210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/HistoryLogReader.h * */ #ifndef ZYPP_PARSER_HISTORYLOGREADER_H_ #define ZYPP_PARSER_HISTORYLOGREADER_H_ #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { class Date; /////////////////////////////////////////////////////////////////// namespace parser { /////////////////////////////////////////////////////////////////// /// \class HistoryLogReader /// \brief Zypp history file parser /// \ingroup g_ZyppHistory /// \ingroup g_ZyppParser /// /// Reads a zypp history log file and calls the \ref ProcessData callback /// passed in the constructor for each valid history line read. The callbacks /// return value indicates whether to continue parsing. /// /// \code /// std::vector history; /// parser::HistoryLogReader parser( ZConfig::instance().historyLogFile(), /// HistoryLogReader::Options(), /// [&history]( HistoryLogData::Ptr ptr )->bool { /// history.push_back( ptr ); /// return true; /// } ); /// parser.readAll(); /// ... /// if ( history[0]->action() == HistoryActionID::INSTALL ) /// { /// // generic access to data fields plain string values: /// MIL << (*p)[HistoryLogDataInstall::USERDATA_INDEX] << endl; /// /// // The same maybe more convenient though derived classes: /// HistoryLogDataInstall::Ptr ip( dynamic_pointer_cast( p ) ); /// MIL << ip->userdata() << endl; /// } /// \endcode /// \see \ref HistoryLogData for how to access the individual data fields. /// /////////////////////////////////////////////////////////////////// class ZYPP_API HistoryLogReader { public: enum OptionBits ///< Parser option flags { IGNORE_INVALID_ITEMS = (1 << 0) ///< ignore invalid items and continue parsing }; ZYPP_DECLARE_FLAGS( Options, OptionBits ); public: /** Callback type to consume a single history line split into fields. * The return value indicates whether to continue parsing. */ using ProcessData = function; /** Ctor taking file to parse and data consumer callback. * As \a options_r argument pass \c HistoryLogReader::Options() to * use the default stettings, or an OR'ed combination of \ref OptionBits. */ HistoryLogReader(Pathname historyFile_r, zypp::parser::HistoryLogReader::Options options_r, ProcessData callback_r ); ~HistoryLogReader(); /** * Read the whole log file. * * \param progress An optional progress data receiver function. */ void readAll( const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc() ); /** * Read log from specified \a date. * * \param date Date from which to read. * \param progress An optional progress data receiver function. * * \see readFromTo() */ void readFrom( const Date & date, const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc() ); /** * Read log between \a fromDate and \a toDate. * * The date comparison's precision goes to seconds. Omitted time parts * get replaced by zeroes, so if e.g. the time is not specified at all, the * date means midnight of the specified date. So * * * fromDate = Date("2009-01-01", "%Y-%m-%d"); * toDate = Date("2009-01-02", "%Y-%m-%d"); * * * will yield log entries from midnight of January, 1st untill * one second before midnight of January, 2nd. * * \param fromDate Date from which to read. * \param toDate Date on which to stop reading. * \param progress An optional progress data receiver function. */ void readFromTo( const Date & fromDate, const Date & toDate, const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc() ); /** * Set the reader to ignore invalid log entries and continue with the rest. * * \param ignoreInvalid true will cause the reader to ignore invalid entries */ void setIgnoreInvalidItems( bool ignoreInvalid = false ); /** * Whether the reader is set to ignore invalid log entries. * * \see setIngoreInvalidItems() */ bool ignoreInvalidItems() const; /** Process only specific HistoryActionIDs. * Call repeatedly to add multiple HistoryActionIDs to process. * Passing an empty HistoryActionID (HistoryActionID::NONE) clears * the filter. */ void addActionFilter( const HistoryActionID & action_r ); /** Clear any HistoryActionIDs. */ void clearActionFilter() { addActionFilter( HistoryActionID::NONE ); } private: /** Implementation */ struct Impl; RW_pointer > _pimpl; }; /** \relates HistoryLogReader::Options */ ZYPP_DECLARE_OPERATORS_FOR_FLAGS( HistoryLogReader::Options ); /////////////////////////////////////////////////////////////////// } // namespace parser ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif /* ZYPP_PARSER_HISTORYLOGREADER_H_ */ libzypp-17.36.5/zypp/parser/IniDict.h000066400000000000000000000000441476576476200174060ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/parser/IniParser.h000066400000000000000000000000461476576476200177610ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/parser/ParseException.h000066400000000000000000000000531476576476200210140ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/parser/ProductFileReader.cc000066400000000000000000000251561476576476200215770ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/ProductFileReader.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// // // class ProductFileData::Upgrade // ///////////////////////////////////////////////////////////////// struct ProductFileData::Upgrade::Impl { std::string _name; std::string _summary; std::string _repository; std::string _product; DefaultIntegral _notify; std::string _status; }; ProductFileData::Upgrade::Upgrade( Impl * allocated_r ) : _pimpl( allocated_r ? allocated_r : new Impl ) {} std::string ProductFileData::Upgrade::name() const { return _pimpl->_name; } std::string ProductFileData::Upgrade::summary() const { return _pimpl->_summary; } std::string ProductFileData::Upgrade::repository() const { return _pimpl->_repository; } std::string ProductFileData::Upgrade::product() const { return _pimpl->_product; } bool ProductFileData::Upgrade::notify() const { return _pimpl->_notify; } std::string ProductFileData::Upgrade::status() const { return _pimpl->_status; } ///////////////////////////////////////////////////////////////// // // class ProductFileData // ///////////////////////////////////////////////////////////////// struct ProductFileData::Impl { IdString _vendor; IdString _name; Edition _edition; Arch _arch; std::string _shortName; std::string _summary; std::string _productline; std::string _registerTarget; std::string _registerRelease; std::string _registerFlavor; std::string _updaterepokey; Upgrades _upgrades; }; ProductFileData::ProductFileData( Impl * allocated_r ) : _pimpl( allocated_r ? allocated_r : new Impl ) {} IdString ProductFileData::vendor() const { return _pimpl->_vendor; } IdString ProductFileData::name() const { return _pimpl->_name; } Edition ProductFileData::edition() const { return _pimpl->_edition; } Arch ProductFileData::arch() const { return _pimpl->_arch; } std::string ProductFileData::shortName() const { return _pimpl->_shortName; } std::string ProductFileData::summary() const { return _pimpl->_summary; } std::string ProductFileData::productline() const { return _pimpl->_productline; } std::string ProductFileData::registerTarget() const { return _pimpl->_registerTarget; } std::string ProductFileData::registerRelease() const { return _pimpl->_registerRelease; } std::string ProductFileData::registerFlavor() const { return _pimpl->_registerFlavor; } std::string ProductFileData::updaterepokey() const { return _pimpl->_updaterepokey; } const ProductFileData::Upgrades & ProductFileData::upgrades() const { return _pimpl->_upgrades; } std::ostream & operator<<( std::ostream & str, const ProductFileData & obj ) { str << str::form( "|product|%s|%s|%s|%s|", obj.name().c_str(), obj.edition().c_str(), obj.arch().c_str(), obj.vendor().c_str() ); if ( ! obj.upgrades().empty() ) { for_( it, obj.upgrades().begin(), obj.upgrades().end() ) str << endl << " " << *it; } return str; } std::ostream & operator<<( std::ostream & str, const ProductFileData::Upgrade & obj ) { str << str::form( "|upgrade|%s|%s|%s|%s|%s|", obj.name().c_str(), obj.repository().c_str(), obj.product().c_str(), obj.status().c_str(), (obj.notify() ? "notify" : "noNotify") ); return str; } ///////////////////////////////////////////////////////////////// // // class ProductFileReader // ///////////////////////////////////////////////////////////////// struct ProductNode : public xml::ParseDef { ProductNode( ProductFileData::Impl & pdata_r ) : ParseDef( "product", MANDTAORY ) , _pdata( pdata_r ) { (*this) ("vendor", OPTIONAL, xml::parseDefAssign( _pdata._vendor ) ) ("name", MANDTAORY, xml::parseDefAssign( _pdata._name ) ) ("version", MANDTAORY, xml::parseDefAssign( _version ) ) ("release", MANDTAORY, xml::parseDefAssign( _release ) ) ("arch", MANDTAORY, xml::parseDefAssign( _pdata._arch ) ) ("shortsummary", OPTIONAL, xml::parseDefAssign( _pdata._shortName ) ) ("summary", MULTIPLE_OPTIONAL, xml::parseDefAssign( _ttext )( "lang", _tlocale ) >>std::bind( std::mem_fn(&ProductNode::doneLocalizedDefault), this, _1, std::ref(_pdata._summary) )) ("productline", OPTIONAL, xml::parseDefAssign( _pdata._productline ) ) ("register", OPTIONAL) ("updaterepokey", OPTIONAL, xml::parseDefAssign( _pdata._updaterepokey ) ) ("upgrades", OPTIONAL) ; (*this)["register"] ("target", OPTIONAL, xml::parseDefAssign( _pdata._registerTarget ) ) ("release", OPTIONAL, xml::parseDefAssign( _pdata._registerRelease ) ) ("flavor", OPTIONAL, xml::parseDefAssign( _pdata._registerFlavor ) ) ; (*this)["upgrades"] ("upgrade", MULTIPLE_OPTIONAL, xml::parseDefAssign() >> bind( &ProductNode::doneUpgrade, this, _1 )) ; (*this)["upgrades"]["upgrade"] ("name", OPTIONAL, xml::parseDefAssign( _upgrade._name ) ) ("summary", OPTIONAL, xml::parseDefAssign( _upgrade._summary ) ) ("repository", OPTIONAL, xml::parseDefAssign( _upgrade._repository ) ) ("product", OPTIONAL, xml::parseDefAssign( _upgrade._product ) ) ("notify", OPTIONAL, xml::parseDefAssign( _upgrade._notify ) ) ("status", OPTIONAL, xml::parseDefAssign( _upgrade._status ) ) ; // callback to build edition. setConsumer( xml::parseDefAssign() >> bind( &ProductNode::done, this, _1 ) ); // xml::ParseDef::_debug = true; } /** collect _upgrade */ void doneUpgrade( const xml::Node & _node ) { ProductFileData::Upgrade cdata( new ProductFileData::Upgrade::Impl( _upgrade ) ); _pdata._upgrades.push_back( cdata ); _upgrade = ProductFileData::Upgrade::Impl(); } /** collect localized data */ void doneLocalizedDefault( const xml::Node & _node, std::string & store_r ) { // take 1st or default if ( store_r.empty() || _tlocale.empty() ) store_r = _ttext; } /** finally */ void done( const xml::Node & _node ) { _pdata._edition = Edition( _version, _release ); } private: ProductFileData::Impl & _pdata; std::string _version; std::string _release; std::string _ttext; std::string _tlocale; ProductFileData::Upgrade::Impl _upgrade; }; bool ProductFileReader::parse( const InputStream & input_r ) const { MIL << "+++" << input_r << endl; bool ret = true; ProductFileData::Impl * pdataImpl = 0; ProductFileData pdata( (pdataImpl = new ProductFileData::Impl) ); try { xml::Reader reader( input_r ); ProductNode rootNode( *pdataImpl ); rootNode.take( reader ); } catch ( const Exception & err ) { // parse error ERR << err << endl; ERR << "---" << ret << " - " << input_r << endl; return ret; } if ( _consumer ) { ret = _consumer( pdata ); } MIL << "---" << ret << " - " << input_r << endl; return ret; } ///////////////////////////////////////////////////////////////// bool ProductFileReader::scanDir( const Consumer & consumer_r, const Pathname & dir_r ) { std::list retlist; int res = filesystem::readdir( retlist, dir_r, /*dots*/false ); if ( res != 0 ) { WAR << "scanDir " << dir_r << " failed (" << res << ")" << endl; return true; } ProductFileReader reader( consumer_r ); for_( it, retlist.begin(), retlist.end() ) { if ( PathInfo( *it, PathInfo::LSTAT ).isFile() && ! reader.parse( *it ) ) { return false; // consumer_r request to stop parsing. } } return true; } ProductFileData ProductFileReader::scanFile( const Pathname & file_r ) { if ( ! PathInfo( file_r ).isFile() ) { WAR << "scanFile " << PathInfo( file_r ) << " is not a file." << endl; return ProductFileData(); } ProductFileData ret; ProductFileReader reader( functor::getFirst( ret ), file_r ); return ret; } ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/ProductFileReader.h000066400000000000000000000135371476576476200214410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/ProductFileReader.h * */ #ifndef ZYPP_PARSER_PRODUCTSDREADER_H #define ZYPP_PARSER_PRODUCTSDREADER_H #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ProductFileData // /** Data returned by \ref ProductFileReader * \see \ref ProductFileReader */ class ZYPP_API ProductFileData { public: struct Impl; /** Ctor takes ownership of \c allocated_r. */ ProductFileData( Impl * allocated_r = 0 ); /** Whether this is an empty object without valid data. */ bool empty() const { return name().empty(); } public: IdString vendor() const; IdString name() const; Edition edition() const; Arch arch() const; std::string shortName() const; std::string summary() const; public: std::string productline() const; std::string registerTarget() const; std::string registerRelease() const; std::string registerFlavor() const; public: std::string updaterepokey() const; public: /////////////////////////////////////////////////////////////////// /** \see http://en.opensuse.org/Product_Management/Code11/Upgrade */ struct Upgrade { public: struct Impl; /** Ctor takes ownership of \c allocated_r. */ Upgrade( Impl * allocated_r = 0 ); public: std::string name() const; std::string summary() const; std::string repository() const; std::string product() const; bool notify() const; std::string status() const; private: RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// using Upgrades = std::vector; const Upgrades & upgrades() const; private: RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates ProductFileData Stream output */ std::ostream & operator<<( std::ostream & str, const ProductFileData & obj ) ZYPP_API; /** \relates ProductFileData::Upgrade Stream output */ std::ostream & operator<<( std::ostream & str, const ProductFileData::Upgrade & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ProductFileReader // /** Parser for /etc/products.d enries (just relevant entires). * * \code * #include "zypp/base/Functional.h" // functor::getAll * * std::vector result; * ProductFileReader::scanDir( functor::getAll( std::back_inserter( result ) ), * "/etc/products.d" ); * \endcode */ class ZYPP_API ProductFileReader { public: /** Callback being invoked for each \ref ProductFileData parsed. * Return \c false to stop parsing. */ using Consumer = function; public: ProductFileReader() {} ProductFileReader( Consumer consumer_r ) : _consumer(std::move( consumer_r )) {} ProductFileReader( Consumer consumer_r, const InputStream & input_r ) : _consumer(std::move( consumer_r )) { parse( input_r ); } public: const Consumer & consumer() const { return _consumer; } void setConsumer( const Consumer & consumer_r ) { _consumer = consumer_r; } public: /** Parse the input stream and call \c _consumer for each * parsed section. * * Returns \c false if the \c _consumer requested to stop parsing. */ bool parse( const InputStream & input_r = InputStream() ) const; public: /** Parse all files (no symlinks) in \c dir_r and call \c consumer_r * for each \ref ProductFileData parsed. * * Returns \c false if the \c _consumer requested to stop parsing. */ static bool scanDir( const Consumer & consumer_r, const Pathname & dir_r ); /** Parse one file (or symlink) and return the \ref ProductFileData parsed. */ static ProductFileData scanFile( const Pathname & file_r ); private: Consumer _consumer; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_PRODUCTSDREADER_H libzypp-17.36.5/zypp/parser/RepoFileReader.cc000066400000000000000000000225271476576476200210630ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoFileReader.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace parser { /////////////////////////////////////////////////////////////////// namespace { /////////////////////////////////////////////////////////////////// /// \class RepoFileParser /// \brief Modified \ref IniDict to allow parsing multiple 'baseurl=' entries /////////////////////////////////////////////////////////////////// class RepoFileParser : public IniDict { public: RepoFileParser( const InputStream & is_r ) { read( is_r ); } using IniDict::consume; // don't hide overloads we don't redefine here void consume( const std::string & section_r, const std::string & key_r, const std::string & value_r ) override { if ( key_r == "baseurl" ) { _inMultiline = MultiLine::baseurl; storeUrl( _baseurls[section_r], value_r ); } else if ( key_r == "gpgkey" ) { _inMultiline = MultiLine::gpgkey; storeUrl( _gpgkeys[section_r], value_r ); } else if ( key_r == "mirrorlist" ) { _inMultiline = MultiLine::mirrorlist; storeUrl( _mirrorlist[section_r], value_r ); } else if ( key_r == "metalink" ) { _inMultiline = MultiLine::metalink; storeUrl( _metalink[section_r], value_r ); } else { _inMultiline = MultiLine::none; IniDict::consume( section_r, key_r, value_r ); } } void garbageLine( const std::string & section_r, const std::string & line_r ) override { switch ( _inMultiline ) { case MultiLine::baseurl: storeUrl( _baseurls[section_r], line_r ); break; case MultiLine::gpgkey: storeUrl( _gpgkeys[section_r], line_r ); break; case MultiLine::mirrorlist: storeUrl( _mirrorlist[section_r], line_r ); break; case MultiLine::metalink: storeUrl( _metalink[section_r], line_r ); break; case MultiLine::none: IniDict::garbageLine( section_r, line_r ); // throw break; } } std::list & baseurls( const std::string & section_r ) { return _baseurls[section_r]; } std::list & gpgkeys( const std::string & section_r ) { return _gpgkeys[section_r]; } std::list & mirrorlist( const std::string & section_r ) { return _mirrorlist[section_r]; } std::list & metalink( const std::string & section_r ) { return _metalink[section_r]; } private: void storeUrl( std::list & store_r, const std::string & line_r ) { // #285: Fedora/dnf allows WS separated urls (and an optional comma) strv::splitRx( line_r, "[,[:blank:]]*[[:blank:]][,[:blank:]]*", [&store_r]( std::string_view w ) { if ( ! w.empty() ) store_r.push_back( Url(std::string(w)) ); }); } enum class MultiLine { none, baseurl, gpgkey, mirrorlist, metalink }; MultiLine _inMultiline = MultiLine::none; std::map> _baseurls; std::map> _gpgkeys; std::map> _mirrorlist; std::map> _metalink; }; } //namespace /////////////////////////////////////////////////////////////////// /** * \short List of RepoInfo's from a file. * \param file pathname of the file to read. */ static void repositories_in_stream( const InputStream &is, const RepoFileReader::ProcessRepo &callback, const ProgressData::ReceiverFnc &progress ) try { RepoFileParser dict(is); for_( its, dict.sectionsBegin(), dict.sectionsEnd() ) { RepoInfo info; info.setAlias(*its); std::string proxy; std::string proxyport; for_( it, dict.entriesBegin(*its), dict.entriesEnd(*its) ) { //MIL << (*it).first << endl; if (it->first == "name" ) info.setName(it-> second); else if ( it->first == "enabled" ) info.setEnabled( str::strToTrue( it->second ) ); else if ( it->first == "priority" ) info.setPriority( str::strtonum( it->second ) ); else if ( it->first == "path" ) info.setPath( Pathname(it->second) ); else if ( it->first == "type" ) ; // bsc#1177427 et.al.: type in a .repo file is legacy - ignore it and let RepoManager probe else if ( it->first == "autorefresh" ) info.setAutorefresh( str::strToTrue( it->second ) ); else if ( it->first == "gpgcheck" ) info.setGpgCheck( str::strToTriBool( it->second ) ); else if ( it->first == "repo_gpgcheck" ) info.setRepoGpgCheck( str::strToTrue( it->second ) ); else if ( it->first == "pkg_gpgcheck" ) info.setPkgGpgCheck( str::strToTrue( it->second ) ); else if ( it->first == "keeppackages" ) info.setKeepPackages( str::strToTrue( it->second ) ); else if ( it->first == "service" ) info.setService( it->second ); else if ( it->first == "proxy" ) { // Translate it into baseurl queryparams // NOTE: The hack here does not add proxy to mirrorlist urls but the // original code worked without complains, so keep it for now. static const str::regex ex( ":[0-9]+$" ); // portspec str::smatch what; if ( str::regex_match( it->second, what, ex ) ) { proxy = it->second.substr( 0, it->second.size() - what[0].size() ); proxyport = what[0].substr( 1 ); } else { proxy = it->second; } } else ERR << "Unknown attribute in [" << *its << "]: " << it->first << "=" << it->second << " ignored" << endl; } for ( auto & url : dict.baseurls( *its ) ) { if ( ! proxy.empty() && url.getQueryParam( "proxy" ).empty() ) { url.setQueryParam( "proxy", proxy ); url.setQueryParam( "proxyport", proxyport ); } info.addBaseUrl( url ); } if ( ! dict.gpgkeys( *its ).empty() ) info.setGpgKeyUrls( std::move(dict.gpgkeys( *its )) ); if ( ! dict.mirrorlist( *its ).empty() ) info.setMirrorListUrls( std::move(dict.mirrorlist( *its )) ); if ( ! dict.metalink( *its ).empty() ) info.setMetalinkUrls( std::move(dict.metalink( *its )) ); info.setFilepath(is.path()); MIL << info << endl; // add it to the list. callback(info); //if (!progress.tick()) // ZYPP_THROW(AbortRequestException()); } } catch ( Exception & ex ) { ex.addHistory( "Parsing .repo file "+is.name() ); ZYPP_RETHROW( ex ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoFileReader // /////////////////////////////////////////////////////////////////// RepoFileReader::RepoFileReader( const Pathname & repo_file, ProcessRepo callback, const ProgressData::ReceiverFnc &progress ) : _callback(std::move(callback)) { repositories_in_stream(InputStream(repo_file), _callback, progress); } RepoFileReader::RepoFileReader( const InputStream &is, ProcessRepo callback, const ProgressData::ReceiverFnc &progress ) : _callback(std::move(callback)) { repositories_in_stream(is, _callback, progress); } RepoFileReader::~RepoFileReader() {} std::ostream & operator<<( std::ostream & str, const RepoFileReader & obj ) { return str; } } // namespace parser /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/RepoFileReader.h000066400000000000000000000105221476576476200207150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoFileReader.h * */ #ifndef ZYPP_REPO_REPOFILEREADER_H #define ZYPP_REPO_REPOFILEREADER_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// /** * \short Read repository data from a .repo file * * After each repo is read, a \ref RepoInfo is prepared and \ref _callback * is called with the object passed in. * * The \ref _callback is provided on construction. * * \code * RepoFileReader reader(repo_file, * bind( &SomeClass::callbackfunc, &SomeClassInstance, _1, _2 ) ); * \endcode * * \note Multiple baseurls in a repo file are supported using this style: * \code * baseurl=http://server.a/path/to/repo * http://server.b/path/to/repo * http://server.c/path/to/repo * \endcode * Repeating the \c baseurl= tag on each line is also accepted, but when the * file has to be written, the preferred style is used. */ class RepoFileReader { friend std::ostream & operator<<( std::ostream & str, const RepoFileReader & obj ); public: /** * Callback definition. * First parameter is a \ref RepoInfo object with the resource * second parameter is the resource type. * * Return false from the callback to get a \ref AbortRequestException * to be thrown and the processing to be cancelled. */ using ProcessRepo = function; /** Implementation */ class Impl; public: /** * \short Constructor. Creates the reader and start reading. * * \param repo_file A valid .repo file * \param callback Callback that will be called for each repository. * \param progress Optional progress function. \see ProgressData * * \throws AbortRequestException If the callback returns false * \throws Exception If a error occurs at reading / parsing * */ RepoFileReader( const Pathname & repo_file, ProcessRepo callback, const ProgressData::ReceiverFnc &progress = ProgressData::ReceiverFnc() ); /** * \short Constructor. Creates the reader and start reading. * * \param is A valid input stream * \param callback Callback that will be called for each repository. * \param progress Optional progress function. \see ProgressData * * \throws AbortRequestException If the callback returns false * \throws Exception If a error occurs at reading / parsing * */ RepoFileReader( const InputStream &is, ProcessRepo callback, const ProgressData::ReceiverFnc &progress = ProgressData::ReceiverFnc() ); /** * Dtor */ ~RepoFileReader(); private: ProcessRepo _callback; }; /////////////////////////////////////////////////////////////////// /** \relates RepoFileReader Stream output */ std::ostream & operator<<( std::ostream & str, const RepoFileReader & obj ); ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REPO_REPOFILEREADER_H libzypp-17.36.5/zypp/parser/RepoindexFileReader.cc000066400000000000000000000210511476576476200221020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/RepoindexFileReader.cc * Implementation of repoindex.xml file reader. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "parser" using std::endl; namespace zypp { namespace parser { using xml::Reader; using xml::XmlString; /////////////////////////////////////////////////////////////////// namespace { class VarReplacer : private base::NonCopyable { public: /** */ void setVar( const std::string & key_r, const std::string & val_r ) { //MIL << "*** Inject " << key_r << " = " << val_r; _vars[key_r] = replace( val_r ); //MIL << " (" << _vars[key_r] << ")" << endl; } std::string replace( const std::string & val_r ) const { std::string::size_type vbeg = val_r.find( "%{", 0 ); if ( vbeg == std::string::npos ) return val_r; str::Str ret; std::string::size_type cbeg = 0; for( ; vbeg != std::string::npos; vbeg = val_r.find( "%{", vbeg ) ) { std::string::size_type nbeg = vbeg+2; std::string::size_type nend = val_r.find( '}', nbeg ); if ( nend == std::string::npos ) { WAR << "Incomplete variable in '" << val_r << "'" << endl; break; } const auto & iter = _vars.find( val_r.substr( nbeg, nend-nbeg ) ); if ( iter != _vars.end() ) { if ( cbeg < vbeg ) ret << val_r.substr( cbeg, vbeg-cbeg ); ret << iter->second; cbeg = nend+1; } else WAR << "Undefined variable %{" << val_r.substr( nbeg, nend-nbeg ) << "} in '" << val_r << "'" << endl; vbeg = nend+1; } if ( cbeg < val_r.size() ) ret << val_r.substr( cbeg ); return ret; } private: std::unordered_map _vars; }; } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoindexFileReader::Impl // class RepoindexFileReader::Impl : private base::NonCopyable { public: /** * CTOR * * \see RepoindexFileReader::RepoindexFileReader(Pathname,ProcessResource) */ Impl(const InputStream &is, ProcessResource &&callback); /** * Callback provided to the XML parser. */ bool consumeNode( Reader & reader_r ); DefaultIntegral _ttl; private: bool getAttrValue( const std::string & key_r, Reader & reader_r, std::string & value_r ) { const XmlString & s( reader_r->getAttribute( key_r ) ); if ( s.get() ) { value_r = _replacer.replace( s.asString() ); return !value_r.empty(); } value_r.clear(); return false; } private: /** Function for processing collected data. Passed-in through constructor. */ ProcessResource _callback; VarReplacer _replacer; }; /////////////////////////////////////////////////////////////////////// RepoindexFileReader::Impl::Impl(const InputStream &is, ProcessResource &&callback) : _callback(std::move(callback)) { Reader reader( is ); MIL << "Reading " << is.path() << endl; reader.foreachNode( bind( &RepoindexFileReader::Impl::consumeNode, this, _1 ) ); } // -------------------------------------------------------------------------- /* * xpath and multiplicity of processed nodes are included in the code * for convenience: * * // xpath: (?|*|+) * * if multiplicity is ommited, then the node has multiplicity 'one'. */ // -------------------------------------------------------------------------- bool RepoindexFileReader::Impl::consumeNode( Reader & reader_r ) { if ( reader_r->nodeType() == XML_READER_TYPE_ELEMENT ) { // xpath: /repoindex if ( reader_r->name() == "repoindex" ) { while ( reader_r.nextNodeAttribute() ) { const std::string & name( reader_r->localName().asString() ); const std::string & value( reader_r->value().asString() ); _replacer.setVar( name, value ); // xpath: /repoindex@ttl if ( name == "ttl" ) _ttl = str::strtonum(value); } return true; } // xpath: /repoindex/data (+) if ( reader_r->name() == "repo" ) { RepoInfo info; // Set some defaults that are not contained in the repo information info.setAutorefresh( true ); info.setEnabled(false); std::string attrValue; // required alias // mandatory, so we can allow it in var replacement without reset if ( getAttrValue( "alias", reader_r, attrValue ) ) { info.setAlias( attrValue ); _replacer.setVar( "alias", attrValue ); } else throw ParseException(str::form(_("Required attribute '%s' is missing."), "alias")); // required url // SLES HACK: or path, but beware of the hardcoded '/repo' prefix! { std::string urlstr; std::string pathstr; getAttrValue( "url", reader_r, urlstr ); getAttrValue( "path", reader_r, pathstr ); if ( urlstr.empty() ) { if ( pathstr.empty() ) throw ParseException(str::form(_("One or both of '%s' or '%s' attributes is required."), "url", "path")); else info.setPath( Pathname("/repo") / pathstr ); } else { if ( pathstr.empty() ) info.setBaseUrl( Url(urlstr) ); else { Url url( urlstr ); url.setPathName( Pathname(url.getPathName()) / "repo" / pathstr ); info.setBaseUrl( url ); } } } // optional name if ( getAttrValue( "name", reader_r, attrValue ) ) info.setName( attrValue ); // optional targetDistro if ( getAttrValue( "distro_target", reader_r, attrValue ) ) info.setTargetDistribution( attrValue ); // optional priority if ( getAttrValue( "priority", reader_r, attrValue ) ) info.setPriority( str::strtonum( attrValue ) ); // optional enabled if ( getAttrValue( "enabled", reader_r, attrValue ) ) info.setEnabled( str::strToBool( attrValue, info.enabled() ) ); // optional autorefresh if ( getAttrValue( "autorefresh", reader_r, attrValue ) ) info.setAutorefresh( str::strToBool( attrValue, info.autorefresh() ) ); DBG << info << endl; // ignore the rest _callback(info); return true; } } return true; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoindexFileReader // /////////////////////////////////////////////////////////////////// RepoindexFileReader::RepoindexFileReader( Pathname repoindex_file, ProcessResource callback ) : _pimpl(new Impl( InputStream(std::move(repoindex_file)), std::move(callback) )) {} RepoindexFileReader::RepoindexFileReader(const InputStream &is, ProcessResource callback ) : _pimpl(new Impl( is, std::move(callback) )) {} RepoindexFileReader::~RepoindexFileReader() {} Date::Duration RepoindexFileReader::ttl() const { return _pimpl->_ttl; } } // ns parser } // ns zypp // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/parser/RepoindexFileReader.h000066400000000000000000000053641476576476200217550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/RepoindexFileReader.h * Interface of repoindex.xml file reader. */ #ifndef zypp_source_yum_RepoindexFileReader_H #define zypp_source_yum_RepoindexFileReader_H #include #include #include #include #include #include namespace zypp { class RepoInfo; namespace parser { /** * Reads through a repoindex.xml file and collects repositories. * * After each repository is read, a \ref RepoInfo * is prepared and \ref _callback * is called with this object passed in. * * The \ref _callback is provided on construction. * * * \code * RepoindexFileReader reader(repoindex_file, * bind( &SomeClass::callbackfunc, &SomeClassInstance, _1) ); * \endcode */ class ZYPP_API RepoindexFileReader : private base::NonCopyable { public: /** * Callback definition. * First parameter is a \ref RepoInfo object with the resource * FIXME return value is ignored */ using ProcessResource = function; /** * CTOR. Creates also \ref xml::Reader and starts reading. * * \param repoindexFile is the repoindex.xml file you want to read * \param callback is a function. * * \see RepoindexFileReader::ProcessResource */ RepoindexFileReader(Pathname repoindexFile, ProcessResource callback); /** * \short Constructor. Creates the reader and start reading. * * \param is a valid input stream * \param callback Callback that will be called for each repository. * * \see RepoindexFileReader::ProcessResource */ RepoindexFileReader( const InputStream &is, ProcessResource callback ); /** * DTOR */ ~RepoindexFileReader(); /** Metadata TTL (repoindex.xml:xpath:/repoindex@ttl or 0). */ Date::Duration ttl() const; private: class Impl; RW_pointer > _pimpl; }; } // ns parser } // ns zypp #endif /*zypp_source_yum_RepoindexFileReader_H*/ // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/parser/ServiceFileReader.cc000066400000000000000000000154421476576476200215540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/RepoFileReader.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; using zypp::parser::IniDict; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// class ServiceFileReader::Impl { public: static void parseServices( const Pathname & file, const ServiceFileReader::ProcessService & callback ); }; void ServiceFileReader::Impl::parseServices( const Pathname & file, const ServiceFileReader::ProcessService & callback/*, const ProgressData::ReceiverFnc &progress*/ ) try { InputStream is(file); if( is.stream().fail() ) { ZYPP_THROW(Exception("Failed to open service file")); } parser::IniDict dict(is); for ( parser::IniDict::section_const_iterator its = dict.sectionsBegin(); its != dict.sectionsEnd(); ++its ) { MIL << (*its) << endl; ServiceInfo service(*its); std::map> repoStates; // > for ( IniDict::entry_const_iterator it = dict.entriesBegin(*its); it != dict.entriesEnd(*its); ++it ) { // MIL << (*it).first << endl; if ( it->first == "name" ) service.setName( it->second ); else if ( it->first == "url" && ! it->second.empty() ) service.setUrl( Url (it->second) ); else if ( it->first == "enabled" ) service.setEnabled( str::strToTrue( it->second ) ); else if ( it->first == "autorefresh" ) service.setAutorefresh( str::strToTrue( it->second ) ); else if ( it->first == "type" ) service.setType( repo::ServiceType(it->second) ); else if ( it->first == "ttl_sec" ) service.setTtl( str::strtonum(it->second) ); else if ( it->first == "lrf_dat" ) service.setLrf( Date( it->second ) ); else if ( it->first == "repostoenable" ) { std::vector aliases; str::splitEscaped( it->second, std::back_inserter(aliases) ); for_( ait, aliases.begin(), aliases.end() ) { service.addRepoToEnable( *ait ); } } else if ( it->first == "repostodisable" ) { std::vector aliases; str::splitEscaped( it->second, std::back_inserter(aliases) ); for_( ait, aliases.begin(), aliases.end() ) { service.addRepoToDisable( *ait ); } } else if ( str::startsWith( it->first, "repo_" ) ) { static str::regex rxexpr( "([0-9]+)(_(.*))?" ); str::smatch what; if ( str::regex_match( it->first.c_str()+5/*repo_*/, what, rxexpr ) ) { std::string tag( what[1] ); if ( what.size() > 3 ) { // attribute if ( what[3] == "enabled" ) repoStates[tag].second.enabled = str::strToBool( it->second, repoStates[tag].second.enabled ); else if ( what[3] == "autorefresh" ) repoStates[tag].second.autorefresh = str::strToBool( it->second, repoStates[tag].second.autorefresh ); else if ( what[3] == "priority" ) str::strtonum( it->second, repoStates[tag].second.priority ); else ERR << "Unknown attribute " << it->first << " ignored" << endl; } else { // alias repoStates[tag].first = it->second; } } else ERR << "Unknown attribute " << it->first << " ignored" << endl; } else ERR << "Unknown attribute " << it->first << " ignored" << endl; } if ( ! repoStates.empty() ) { ServiceInfo::RepoStates data; for ( const auto & el : repoStates ) { if ( el.second.first.empty() ) ERR << "Missing alias for repo_" << el.first << "; ignore entry" << endl; else data[el.second.first] = el.second.second; } if ( ! data.empty() ) service.setRepoStates( std::move(data) ); } MIL << "Linking ServiceInfo with file " << file << endl; service.setFilepath(file); // add it to the list. if ( !callback(service) ) ZYPP_THROW(AbortRequestException()); } } catch ( Exception & ex ) { ex.addHistory( "Parsing .service file "+file.asString() ); ZYPP_RETHROW( ex ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoFileReader // /////////////////////////////////////////////////////////////////// ServiceFileReader::ServiceFileReader( const Pathname & repo_file, const ProcessService & callback/*, const ProgressData::ReceiverFnc &progress */) { Impl::parseServices(repo_file, callback/*, progress*/); //MIL << "Done" << endl; } ServiceFileReader::~ServiceFileReader() {} std::ostream & operator<<( std::ostream & str, const ServiceFileReader & obj ) { return str; } ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/ServiceFileReader.h000066400000000000000000000062341476576476200214150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/ServiceFileReader.h * */ #ifndef ZYPP_REPO_SERVICEFILEREADER_H #define ZYPP_REPO_SERVICEFILEREADER_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class ServiceInfo; /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// /** * \short Read service data from a .service file * * After each service is read, a \ref ServiceInfo is prepared and \ref _callback * is called with the object passed in. * * The \ref _callback is provided on construction. * * \code * ServiceFileReader reader(service_file, * bind( &SomeClass::callbackfunc, &SomeClassInstance, _1 ) ); * \endcode */ class ServiceFileReader { friend std::ostream & operator<<( std::ostream & str, const ServiceFileReader & obj ); public: /** * Callback definition. * First parameter is a \ref ServiceInfo object with the resource. * * Return false from the callback to get a \ref AbortRequestException * to be thrown and the processing to be cancelled. */ using ProcessService = function; /** Implementation */ class Impl; public: /** * \short Constructor. Creates the reader and start reading. * * \param serviceFile A valid .repo file * \param callback Callback that will be called for each repository. * * \throws AbortRequestException If the callback returns false * \throws Exception If a error occurs at reading / parsing * */ ServiceFileReader( const Pathname & serviceFile, const ProcessService & callback); /** * Dtor */ ~ServiceFileReader(); }; /////////////////////////////////////////////////////////////////// /** \relates ServiceFileReader Stream output */ std::ostream & operator<<( std::ostream & str, const ServiceFileReader & obj ); ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REPO_SERVICEFILEREADER_H libzypp-17.36.5/zypp/parser/schema/000077500000000000000000000000001476576476200171545ustar00rootroot00000000000000libzypp-17.36.5/zypp/parser/schema/repoindex.rnc000066400000000000000000000024221476576476200216550ustar00rootroot00000000000000# repoindex.xml RNC schema start = repoindex-element repoindex-element = element repoindex { element repo { # Internal repo identifier attribute alias { xsd:string }, # Human-readable name of the repository attribute name { xsd:string }?, # More detailed description of what's inside attribute description { xsd:string }?, ( # Path relative to the base url of the service # WARNING 'repo/' is always prepended to this path # (this is inherited from NU services) attribute path { xsd:string } | # Full URI of the repository (can also be outside of the service base) attribute url { xsd:anyURI } ), # unique identifier of the target distribution (distroname-version-arch) # if not specified, all the repositories will be added by the client attribute distro_target { xsd:string }?, # An optional repository type. Will be determined automatically if not # specified. attribute type { xsd:string }?, # Repository priority. Starts from 1 (the highest); the higher number, # the lowe priority. attribute priority { xsd:integer }?, # legacy attribute, currently not used attribute pub { xsd:boolean }? } } libzypp-17.36.5/zypp/parser/susetags/000077500000000000000000000000001476576476200175525ustar00rootroot00000000000000libzypp-17.36.5/zypp/parser/susetags/ContentFileReader.cc000066400000000000000000000216201476576476200234170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/susetags/ContentFileReader.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "parser::susetags" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace susetags { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ContentFileReader::Impl // /** ContentFileReader implementation. */ struct ContentFileReader::Impl { public: Impl() {} RepoIndex & repoindex() { if ( !_repoindex ) _repoindex = new RepoIndex; return *_repoindex; } bool hasRepoIndex() const { return _repoindex != nullptr; } RepoIndex_Ptr handoutRepoIndex() { RepoIndex_Ptr ret; ret.swap( _repoindex ); _repoindex = nullptr; return ret; } public: bool setFileCheckSum( std::map & map_r, const std::string & value ) const { bool error = false; std::vector words; if ( str::split( value, std::back_inserter( words ) ) == 3 ) { map_r[words[2]] = CheckSum( words[0], words[1] ); } else { error = true; } return error; } public: std::string _inputname; private: RepoIndex_Ptr _repoindex; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ContentFileReader // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ContentFileReader::ContentFileReader // METHOD TYPE : Ctor // ContentFileReader::ContentFileReader() {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ContentFileReader::~ContentFileReader // METHOD TYPE : Dtor // ContentFileReader::~ContentFileReader() {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ContentFileReader::beginParse // METHOD TYPE : void // void ContentFileReader::beginParse() { _pimpl.reset( new Impl() ); // actually mandatory, but in case they were forgotten... _pimpl->repoindex().descrdir = "suse/setup/descr"; _pimpl->repoindex().datadir = "suse"; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ContentFileReader::endParse // METHOD TYPE : void // void ContentFileReader::endParse() { // consume oldData if ( _pimpl->hasRepoIndex() ) { if ( _repoIndexConsumer ) _repoIndexConsumer( _pimpl->handoutRepoIndex() ); } MIL << "[Content]" << endl; _pimpl.reset(); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ContentFileReader::userRequestedAbort // METHOD TYPE : void // void ContentFileReader::userRequestedAbort( unsigned lineNo_r ) { ZYPP_THROW( AbortRequestException( errPrefix( lineNo_r ) ) ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ContentFileReader::errPrefix // METHOD TYPE : std::string // std::string ContentFileReader::errPrefix( unsigned lineNo_r, const std::string & msg_r, const std::string & line_r ) const { return str::form( "%s:%u:%s | %s", _pimpl->_inputname.c_str(), lineNo_r, line_r.c_str(), msg_r.c_str() ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ContentFileReader::parse // METHOD TYPE : void // void ContentFileReader::parse( const InputStream & input_r, const ProgressData::ReceiverFnc & fnc_r ) { MIL << "Start parsing content repoindex" << input_r << endl; if ( ! input_r.stream() ) { std::ostringstream s; s << "Can't read bad stream: " << input_r; ZYPP_THROW( ParseException( s.str() ) ); } beginParse(); _pimpl->_inputname = input_r.name(); ProgressData ticks( makeProgressData( input_r ) ); ticks.sendTo( fnc_r ); if ( ! ticks.toMin() ) userRequestedAbort( 0 ); iostr::EachLine line( input_r ); for( ; line; line.next() ) { // strip 1st word from line to separate tag and value. std::string value( *line ); std::string key( str::stripFirstWord( value, /*ltrim_first*/true ) ); if ( key.empty() || *key.c_str() == '#' ) // empty or comment line { continue; } // strip modifier if exists std::string modifier; std::string::size_type pos = key.rfind( '.' ); if ( pos != std::string::npos ) { modifier = key.substr( pos+1 ); key.erase( pos ); } // // ReppoIndex related data: // else if ( key == "DESCRDIR" ) { _pimpl->repoindex().descrdir = value; } else if ( key == "DATADIR" ) { _pimpl->repoindex().datadir = value; } else if ( key == "KEY" ) { if ( _pimpl->setFileCheckSum( _pimpl->repoindex().signingKeys, value ) ) { ZYPP_THROW( ParseException( errPrefix( line.lineNo(), "Expected [KEY algorithm checksum filename]", *line ) ) ); } } else if ( key == "META" ) { if ( _pimpl->setFileCheckSum( _pimpl->repoindex().metaFileChecksums, value ) ) { ZYPP_THROW( ParseException( errPrefix( line.lineNo(), "Expected [algorithm checksum filename]", *line ) ) ); } } else if ( key == "HASH" ) { if ( _pimpl->setFileCheckSum( _pimpl->repoindex().mediaFileChecksums, value ) ) { ZYPP_THROW( ParseException( errPrefix( line.lineNo(), "Expected [algorithm checksum filename]", *line ) ) ); } } else { DBG << errPrefix( line.lineNo(), "ignored", *line ) << endl; } if ( ! ticks.set( input_r.stream().tellg() ) ) userRequestedAbort( line.lineNo() ); } // // post processing // if ( ! ticks.toMax() ) userRequestedAbort( line.lineNo() ); endParse(); MIL << "Done parsing " << input_r << endl; } ///////////////////////////////////////////////////////////////// } // namespace susetags /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/susetags/ContentFileReader.h000066400000000000000000000077761476576476200233010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/susetags/ContentFileReader.h * */ #ifndef ZYPP_PARSER_SUSETAGS_CONTENTFILEREADER_H #define ZYPP_PARSER_SUSETAGS_CONTENTFILEREADER_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace susetags { ///////////////////////////////////////////////////////////////// class RepoIndex; DEFINE_PTR_TYPE(RepoIndex); /////////////////////////////////////////////////////////////////// // // CLASS NAME : ContentFileReader // /** Parse repoindex part from a \c content file. * This is all the downloader needs. */ class ContentFileReader : private base::NonCopyable { public: using RepoIndexConsumer = function; public: /** Default ctor */ ContentFileReader(); /** Dtor */ virtual ~ContentFileReader(); /** Parse the stream. * \throw ParseException on errors. * \throw AbortRequestException on user request. * Invokes \ref consume for each tag. \ref consume might throw * other exceptions as well. */ virtual void parse( const InputStream & imput_r, const ProgressData::ReceiverFnc & fnc_r = ProgressData::ReceiverFnc() ); public: /** Consumer to call when repo index was parsed. */ void setRepoIndexConsumer( const RepoIndexConsumer & fnc_r ) { _repoIndexConsumer = fnc_r; } protected: /** Called when start parsing. */ virtual void beginParse(); /** Called when the parse is done. */ virtual void endParse(); protected: /** Called when user(callback) request to abort. * \throws AbortRequestException unless overloaded. */ virtual void userRequestedAbort( unsigned lineNo_r ); protected: /** Prefix exception message with line information. */ std::string errPrefix( unsigned lineNo_r, const std::string & msg_r = std::string(), const std::string & line_r = "-" ) const; private: struct Impl; RW_pointer > _pimpl; RepoIndexConsumer _repoIndexConsumer; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace susetags /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_SUSETAGS_CONTENTFILEREADER_H libzypp-17.36.5/zypp/parser/susetags/RepoIndex.cc000066400000000000000000000041261476576476200217610ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/susetags/RepoIndex.cc * */ #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "parser::susetags" /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace susetags { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(RepoIndex); std::ostream & RepoIndex::dumpOn( std::ostream & str ) const { return str << "RepoIndex checksums: META files " << metaFileChecksums.size() << ", HASH files " << mediaFileChecksums.size() << ", KEY files " << signingKeys.size(); } ///////////////////////////////////////////////////////////////// } // namespace susetags /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/susetags/RepoIndex.h000066400000000000000000000056421476576476200216270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/susetags/RepoIndex.h * */ #ifndef ZYPP_PARSER_SUSETAGS_REPOINDEX_H #define ZYPP_PARSER_SUSETAGS_REPOINDEX_H #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace parser { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace susetags { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(RepoIndex); /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoIndex // /** Repository content data (from /content file). * File and Checksum definitions required by Downloader and Parser. * (Do not confuse with NU's repoindex.xml) */ class RepoIndex : public base::ReferenceCounted, private base::NonCopyable { friend class ContentFileReader; public: using FileChecksumMap = std::map; Pathname descrdir; Pathname datadir; FileChecksumMap metaFileChecksums; FileChecksumMap mediaFileChecksums; FileChecksumMap signingKeys; protected: /** Overload to realize std::ostream & operator\<\<. */ std::ostream & dumpOn( std::ostream & str ) const override; }; ////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace susetags /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace parser /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_SUSETAGS_REPOINDEX_H libzypp-17.36.5/zypp/parser/xml/000077500000000000000000000000001476576476200165145ustar00rootroot00000000000000libzypp-17.36.5/zypp/parser/xml/Node.cc000066400000000000000000000055031476576476200177130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/Reader.cc * */ #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// xmlTextReaderPtr const Node::_no_reader = 0; /////////////////////////////////////////////////////////////////// // // METHOD NAME : Node::Node // METHOD TYPE : Constructor // Node::Node() : _reader( _no_reader ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Node::Node // METHOD TYPE : Constructor // Node::Node( xmlTextReaderPtr const & reader_r ) : _reader( reader_r ) {} /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const Node & obj ) { if ( ! obj ) return str << "NoNode" << endl; #define X(m) obj.m() str << X(depth) << ":" << std::string( X(depth), ' ') << X(nodeType) << " <"; if ( X(nodeType) == XML_READER_TYPE_NONE ) { return str << '[' << X(readState) << "]>"; } if ( obj.prefix() ) str << X(prefix) << ':'; str << X(localName) << "> "; if ( X(hasAttributes) ) str << " [attr " << X(attributeCount); else str << " [noattr"; if ( X(isEmptyElement) ) str << "|empty"; str << ']'; if ( X(hasValue) ) str << " {" << X(value) << '}'; #undef X return str; } ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/xml/Node.h000066400000000000000000000151351476576476200175570ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/Node.h * */ #ifndef ZYPP_PARSER_XML_NODE_H #define ZYPP_PARSER_XML_NODE_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Node // /** xmlTextReader based interface to \ref Reader's current node. * Node provides xmlTextReader methods that do not change * the readers position in the file. Mostly access to the * nodes attributes. **/ class Node { public: /** Default ctor. */ Node(); /** Ctor referencing a \ref Reader. */ Node( xmlTextReaderPtr const & reader_r ); /** Validate Node in a boolean context. */ explicit operator bool() const { return _reader; } public: /** Provides the number of attributes of the current node. */ int attributeCount() const { return xmlTextReaderAttributeCount( _reader ); } /** The base URI of the node. */ XmlString baseUri() const { return xmlTextReaderConstBaseUri( _reader ); } /** Provide the column number of the current parsing point. */ int columnNumber() const { return xmlTextReaderGetParserColumnNumber( _reader ); } /** The depth of the node in the tree. */ int depth() const { return xmlTextReaderDepth( _reader ); } /** Determine the encoding of the document being read. */ XmlString encoding() const { return xmlTextReaderConstEncoding( _reader ); } /** Provides a copy of the attribute value with the specified * qualified name. */ XmlString getAttribute( const char * name_r ) const { return XmlString( xmlTextReaderGetAttribute( _reader, reinterpret_cast(name_r) ), XmlString::FREE ); } /** \overload */ XmlString getAttribute( const std::string & name_r ) const { return getAttribute( name_r.c_str() ); } /** Provides a copy of the attribute value with the specified * index relative to the containing element. */ XmlString getAttributeNo( int no_r ) const { return XmlString( xmlTextReaderGetAttributeNo( _reader, no_r ), XmlString::FREE ); } /** Whether the node has attributes. */ int hasAttributes() const { return xmlTextReaderHasAttributes( _reader ); } /** Whether the node can have a text value. */ int hasValue() const { return xmlTextReaderHasValue( _reader ); } /** Whether this is an Attribute node. */ bool isAttribute() const { return( nodeType() == XML_READER_TYPE_ATTRIBUTE ); } /** Whether an Attribute node was generated from the default value * defined in the DTD or schema. */ int isDefault() const { return xmlTextReaderIsDefault( _reader ); } /** Check if the current node is empty. */ int isEmptyElement() const { return xmlTextReaderIsEmptyElement( _reader ); } /** Determine whether the current node is a namespace declaration * rather than a regular attribute.*/ int isNamespaceDecl() const { return xmlTextReaderIsNamespaceDecl( _reader ); } /** Provide the line number of the current parsing point. */ int lineNumber() const { return xmlTextReaderGetParserLineNumber( _reader ); } /** The local name of the node. */ XmlString localName() const { return xmlTextReaderConstLocalName( _reader ); } /** The qualified name of the node, equal to Prefix :LocalName. */ XmlString name() const { return xmlTextReaderConstName( _reader ); } /** The URI defining the namespace associated with the node. */ XmlString namespaceUri() const { return xmlTextReaderConstNamespaceUri( _reader ); } /** Get the node type of the current node. */ NodeType nodeType() const { return (NodeType)xmlTextReaderNodeType( _reader ); } /** A shorthand reference to the namespace associated with the node. */ XmlString prefix() const { return xmlTextReaderConstPrefix( _reader ); } /** The quotation mark character used to enclose the value of an attribute. * \return \c " or \c ' or -1 in case of error. */ int quoteChar() const { return xmlTextReaderQuoteChar( _reader ); } /** Gets the read state of the reader. */ ReadState readState() const { return (ReadState)xmlTextReaderReadState( _reader ); } /** Provides the text value of the node if present. */ XmlString value() const { return xmlTextReaderConstValue( _reader ); } /** Provides a copy of the text value of the node if present. */ XmlString getValue() const { return XmlString( xmlTextReaderValue( _reader ), XmlString::FREE ); } /** The xml:lang scope within which the node resides. */ XmlString xmlLang() const { return xmlTextReaderConstXmlLang( _reader ); } /** Determine the XML version of the document being read. */ XmlString xmlVersion() const { return xmlTextReaderConstXmlVersion( _reader ); } private: /** NULL Reader referenced by default ctor. */ static xmlTextReaderPtr const _no_reader; /** Reference to the \ref Reader. */ xmlTextReaderPtr const & _reader; }; /////////////////////////////////////////////////////////////////// /** \relates Node Stream output. */ std::ostream & operator<<( std::ostream & str, const Node & obj ); ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_NODE_H libzypp-17.36.5/zypp/parser/xml/Parse.h000066400000000000000000000076241476576476200177500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/Parse.h * */ #ifndef ZYPP_PARSER_XML_PARSE_H #define ZYPP_PARSER_XML_PARSE_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /** Parse xml \c input_r and store data in \c data_r. * * \c TData must be defaultconstructible and assignable. * * \c TData::RootNode must be a \ref xml::ParseDef constructible * from \c TData&. * * \throws ParseDefException on parse errors. * * To parse a xml file like this: * \code * * value * * * * \endcode * * You need something like this: * \code * struct XmlData * { * // data * unsigned attr; * std::string value; * std:list names; * * public: * // Convenience parsing to *this. * void parse( const Pathname & path_r ) * { xml::rnParse( path_r, *this ); } * * public: * // Parser description * struct RootNode : public xml::ParseDef * { * RootNode( XmlData & data ) * : ParseDef( "test", MANDTAORY ) * , _data( data ) * { * (*this) * ("setup", MANDTAORY, * xml::parseDefAssign( data.value ) * ( "attr", data.attr ) ) * // Each individual list entry is collected locally * // and appended to the list after the node is done. * ("list", MULTIPLE_OPTIONAL, * xml::parseDefAssign( "name", _cname ) * >> bind( &RootNode::cdone, this, _1 ) ) * ; * } * * void cdone( const xml::Node & node_r ) * { * _data.push_back( _cname ); * _cname.clear(); // prepare for next * } * * private: * XmlData & _data; // stored just because notification callbacks are used. * std::string _cname; * }; * }; * * XmlData xmlData; * xmlData.parse( "/tmp/mytest.xml" ); * \endcode */ template inline void rnParse( const InputStream & input_r, TData & data_r ) { typedef typename TData::RootNode RootNode; TData pdata; xml::Reader reader( input_r ); RootNode rootNode( pdata ); rootNode.take( reader ); data_r = pdata; } ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_PARSEDEF_H libzypp-17.36.5/zypp/parser/xml/ParseDef.cc000066400000000000000000000367761476576476200205370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/ParseDef.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefImplConsume // /** */ struct ParseDefImplConsume : public ParseDefConsumeRedirect { void start( const Node & node_r ) override { debuglog( "START ", node_r ); ParseDefConsumeRedirect::start( node_r ); } void text( const Node & node_r ) override { debuglog( "TEXT ", node_r ); ParseDefConsumeRedirect::text( node_r ); } void cdata( const Node & node_r ) override { debuglog( "CDATA ", node_r ); ParseDefConsumeRedirect::cdata( node_r ); } void done( const Node & node_r ) override { debuglog( "DONE ", node_r ); ParseDefConsumeRedirect::done( node_r ); } void startSubnode( const Node & node_r ) override { debuglog( "---> ", node_r ); ParseDefConsumeRedirect::startSubnode( node_r ); } void doneSubnode( const Node & node_r ) override { debuglog( "<--- ", node_r ); ParseDefConsumeRedirect::doneSubnode( node_r ); } void debuglog( const char *const tag_r, const Node & node_r ) { if ( ParseDef::_debug ) DBG << tag_r << node_r << endl; } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDef::Impl // /** ParseDef implementation. * \todo Check using share_ptr_from_this for parent in addNode. */ class ParseDef::Impl { friend std::ostream & operator<<( std::ostream & str, const ParseDef::Impl & obj ); public: using ImplPtr = shared_ptr; using SubNodes = std::map; public: Impl(std::string &&name_r, Mode mode_r, shared_ptr &&target_r = shared_ptr()) : _name(std::move(name_r)), _mode(mode_r), _parent(NULL) { if ( target_r ) _callback.setRedirect( std::move(target_r) ); } Impl(const Impl &) = default; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() { for ( SubNodes::iterator it = _subnodes.begin(); it != _subnodes.end(); ++it ) { it->second->_parent = NULL; } } bool isOptional() const { return Traits::ModeBits(_mode).isEqual( Traits::BIT_OPTIONAL ); } bool isMandatory() const { return Traits::ModeBits(_mode).isEqual( Traits::BIT_MANDTAORY ); } bool singleDef() const { return Traits::ModeBits(_mode).isEqual( Traits::BIT_ONCE ); } bool multiDef() const { return Traits::ModeBits(_mode).isEqual( Traits::BIT_MULTIPLE ); } public: void addNode( const ImplPtr & subnode_r ); ImplPtr getNode( const std::string & name_r ) const { SubNodes::const_iterator it = _subnodes.find( name_r ); if ( it != _subnodes.end() ) return it->second; return ImplPtr(); } void take( Reader & reader_r ); private: /** Skip the current node. * \pre Current node must be XML_READER_TYPE_ELEMENT. * \post At the corresponding end node. (XML_READER_TYPE_END_ELEMENT or atill at the same node, if it'a an empty element <node />). * \return last call to xml::Reader::nextNode. * \throws ParseDefValidateException if no matching end node found. */ bool skipNode( Reader & reader_r ); std::string exstr( const std::string & what_r, const Impl & impl_r ) const { std::ostringstream str; str << impl_r << ": " << what_r; return str.str(); } std::string exstr( const std::string & what_r, const Impl & impl_r, const Reader & reader_r ) const { std::ostringstream str; str << impl_r << ": " << what_r << " |reading " << *reader_r; return str.str(); } public: std::string _name; Mode _mode; DefaultIntegral _visited; Impl * _parent; SubNodes _subnodes; ParseDefImplConsume _callback; DefaultIntegral _parseDepth; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDef::Impl::addNode // METHOD TYPE : void // void ParseDef::Impl::addNode( const ImplPtr & subnode_r ) { std::pair res = _subnodes.insert( std::make_pair( subnode_r->_name, subnode_r ) ); if ( ! res.second ) { ZYPP_THROW( ParseDefBuildException( exstr("Multiple definiton of subnode "+subnode_r->_name, *this) ) ); } if ( res.first->second->_parent ) { ZYPP_THROW( ParseDefBuildException( exstr("Can not reparent subnode "+subnode_r->_name, *this) ) ); } res.first->second->_parent = this; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDef::Impl::take // METHOD TYPE : void // void ParseDef::Impl::take( Reader & reader_r ) { if ( reader_r->nodeType() != XML_READER_TYPE_ELEMENT ) { if ( reader_r->depth() == 0 ) { // on the very first level we skip any initial whitespace and comments... do { // advance to next node if ( ! reader_r.nextNode() ) { ZYPP_THROW( ParseDefValidateException( exstr( "Unexpected EOF ", *this ) ) ); } } while( reader_r->nodeType() != XML_READER_TYPE_ELEMENT ); } else { ZYPP_THROW( ParseDefValidateException( exstr("Expected ELEMENT", *this, reader_r) ) ); } } if ( reader_r->name() != _name ) { ZYPP_THROW( ParseDefValidateException( exstr("Wrong ELEMENT name", *this, reader_r) ) ); } if ( _visited >= 1 && ! multiDef() ) { ZYPP_THROW( ParseDefValidateException( exstr("Multiple definitions", *this, reader_r) ) ); } ++_visited; // Accepted to parse DtorReset x( _parseDepth, -1 ); _parseDepth = reader_r->depth(); // Parse attributes _callback.start( *reader_r ); // Get content up to end node // Empty element () has no separate end node, so // there's nothing to parse. if ( ! reader_r->isEmptyElement() ) { // For non empty elements () parse known nodes // text and cdata elelments skip unknown nodes. for ( bool done = false; ! done ; /*advance in inside loop*/) { // advance to next node if ( ! reader_r.nextNode() ) { ZYPP_THROW( ParseDefValidateException( exstr( "Unexpected EOF ", *this ) ) ); } switch ( reader_r->nodeType() ) { case XML_READER_TYPE_ELEMENT: // Parse or skip unknown. Anyway reader is located at the // corresponding end node, or an exception was thrown. { ImplPtr sub( getNode( reader_r->name().asString() ) ); if ( sub ) { _callback.startSubnode( *reader_r ); sub->take( reader_r ); _callback.doneSubnode( *reader_r ); } else { if ( ParseDef::_debug ) WAR << "Skip unknown node " << *reader_r << " in "<< *this << endl; skipNode( reader_r ); } } break; case XML_READER_TYPE_END_ELEMENT: // This must be the corresponding end node! if ( reader_r->depth() == _parseDepth && reader_r->name() == _name ) { done = true; } else { ZYPP_THROW( ParseDefValidateException( exstr("unexpected END_ELEMENT name", *this, reader_r) ) ); } break; case XML_READER_TYPE_TEXT: // collect or skip _callback.text( *reader_r ); break; case XML_READER_TYPE_CDATA: // collect or skip _callback.cdata( *reader_r ); break; default: //DBG << exstr("SKIP ", *this, reader_r) << endl; break; } } } // Parsing complete. Check whether all mandatory nodes were // present. Finally position behind the end node. for ( SubNodes::iterator it = _subnodes.begin(); it != _subnodes.end(); ++it ) { if ( ! it->second->_visited && it->second->isMandatory() ) { ZYPP_THROW( ParseDefValidateException( exstr("Mandatory ELEMENT missing", *(it->second), reader_r) ) ); } it->second->_visited = 0; // reset to be ready for an other visit to this!! } _callback.done( *reader_r ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDef::Impl::skipNode // METHOD TYPE : void // bool ParseDef::Impl::skipNode( xml::Reader & reader_r ) { if ( ! reader_r.seekToEndNode( reader_r->depth(), reader_r->name().asString() ) ) { ZYPP_THROW( ParseDefValidateException ( exstr( str::form( "EOF while looking for [%d] <\\%s>", reader_r->depth(), reader_r->name().c_str() ), *this ) ) ); } return true; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ParseDef::Impl & obj ) { return str << "ParseDef(" << obj._name << ", " << obj._mode << ", visits " << obj._visited << ")"; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDef // /////////////////////////////////////////////////////////////////// bool ParseDef::_debug = false; /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDef::ParseDef // METHOD TYPE : Ctor // ParseDef::ParseDef( std::string name_r, Mode mode_r ) : _pimpl( new Impl( std::move(name_r), mode_r ) ) {} ParseDef::ParseDef( std::string name_r, Mode mode_r, shared_ptr target_r ) : _pimpl( new Impl( std::move(name_r), mode_r, std::move(target_r) ) ) {} ParseDef::ParseDef( const shared_ptr & pimpl_r ) : _pimpl( pimpl_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDef::~ParseDef // METHOD TYPE : Dtor // ParseDef::~ParseDef() {} const std::string & ParseDef::name() const { return _pimpl->_name; } ParseDef::Mode ParseDef::mode() const { return _pimpl->_mode; } bool ParseDef::isOptional() const { return _pimpl->isOptional(); } bool ParseDef::isMandatory() const { return _pimpl->isMandatory(); } bool ParseDef::singleDef() const { return _pimpl->singleDef(); } bool ParseDef::multiDef() const { return _pimpl->multiDef(); } unsigned ParseDef::visited() const { return _pimpl->_visited; } ParseDef & ParseDef::addNode( ParseDef & subnode_r ) { _pimpl->addNode( subnode_r._pimpl.getPtr() ); return *this; } ParseDef ParseDef::operator[]( const std::string & name_r ) { shared_ptr retimpl( _pimpl->getNode( name_r ) ); if ( ! retimpl ) { ZYPP_THROW( ParseDefBuildException( "No subnode "+name_r ) ); } return retimpl; } void ParseDef::setConsumer( const shared_ptr & target_r ) { _pimpl->_callback.setRedirect( target_r ); } void ParseDef::setConsumer( ParseDefConsume * allocatedTarget_r ) { _pimpl->_callback.setRedirect( allocatedTarget_r ); } void ParseDef::setConsumer( ParseDefConsume & target_r ) { _pimpl->_callback.setRedirect( target_r ); } void ParseDef::cancelConsumer() { _pimpl->_callback.cancelRedirect(); } shared_ptr ParseDef::getConsumer() const { return _pimpl->_callback.getRedirect(); } void ParseDef::take( Reader & reader_r ) { _pimpl->take( reader_r ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, ParseDef::Mode obj ) { switch ( obj ) { #define X(T) case ParseDef::T: return str << #T X(OPTIONAL); X(MANDTAORY); X(MULTIPLE_OPTIONAL); X(MULTIPLE_MANDTAORY); #undef X } return str; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ParseDef & obj ) { return str << obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/xml/ParseDef.h000066400000000000000000000206731476576476200203660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/ParseDef.h * */ #ifndef ZYPP_PARSER_XML_PARSEDEF_H #define ZYPP_PARSER_XML_PARSEDEF_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// class Reader; struct ParseDefConsume; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDef // /** Define a xml node structure to parse. * * An xml file like this: * \code * * * * mycollection * * All the cool stuff... * 1165270942 * * * * * * * \endcode * * Could be described by: * \code * using namespace xml; * struct SycontentNode : public ParseDef * { * SycontentNode( Mode mode_r ) * : ParseDef( "syscontent", mode_r ) * { * (*this)("ident", OPTIONAL) * ("onsys", OPTIONAL) * ; * * (*this)["ident"] * ("name", OPTIONAL) * ("version", OPTIONAL) * ("description", OPTIONAL) * ("created", OPTIONAL) * ; * * (*this)["onsys"] * ("entry", MULTIPLE_OPTIONAL) * ; * } * }; * \endcode * * To parse it using an \ref xml::Reader: * \code * xml::Reader reader( input_r ); * SycontentNode rootNode( xml::ParseDef::MANDTAORY ); * // Define data consumers here. * rootNode.take( reader ); * \endcode * * Whithout data consumers this will just parse the file * but not retrieve any data. You may attach a consumer * derived from \ref xml::ParseDefConsume to each node: * * \code * // Parse Edition from ver/rel/eopch attributes. * struct ConsumeEdition : public ParseDefConsume * { * ConsumeEdition( Edition & value_r ) * : _value( & value_r ) * {} * * virtual void start( const Node & node_r ) * { * *_value = Edition( node_r.getAttribute("ver").asString(), * node_r.getAttribute("rel").asString(), * node_r.getAttribute("epoch").asString() ); * } * * Edition *_value; * }; * \endcode * \see \ref xml::ParseDefConsume * * \code * xml::Reader reader( input_r ); * SycontentNode rootNode( xml::ParseDef::MANDTAORY ); * * // Define data consumers here. * Edition _edition; * rootNode["ident"]["version"].setConsumer * ( new ConsumeEdition( _edition ) ); * * rootNode.take( reader ); * \endcode * * That's just one way to collect the data. You could as well * use a \ref xml::ParseDefConsumeCallback, and redirect the * \c start call to some arbitrary function or method. */ class ParseDef { using Traits = ParseDefTraits; public: enum Mode { OPTIONAL = Traits::BIT_OPTIONAL | Traits::BIT_ONCE, MANDTAORY = Traits::BIT_MANDTAORY | Traits::BIT_ONCE, MULTIPLE_OPTIONAL = Traits::BIT_OPTIONAL | Traits::BIT_MULTIPLE, MULTIPLE_MANDTAORY = Traits::BIT_MANDTAORY | Traits::BIT_MULTIPLE }; public: ParseDef( std::string name_r, Mode mode_r ); ParseDef( std::string name_r, Mode mode_r, shared_ptr target_r ); virtual ~ParseDef(); public: const std::string & name() const; Mode mode() const; bool isOptional() const; bool isMandatory() const; bool singleDef() const; bool multiDef() const; unsigned visited() const; public: /** Add subnode definition. * \note As ParseDef copies share their implementation you can * not add the same subnode to multiple parents. * \return *this. * \throws ParseDefBuildException if a subnode with the same name * is already defined, or if the subnode is already * subnode of an other ParseDef. */ ParseDef & addNode( ParseDef & subnode_r ); ParseDef & addNode( const std::string & name_r, Mode mode_r ) { ParseDef tmp( name_r, mode_r ); return addNode( tmp ); } ParseDef & addNode( const std::string & name_r, Mode mode_r, const shared_ptr & target_r ) { ParseDef tmp( name_r, mode_r, target_r ); return addNode( tmp ); } /** Add subnode definition. * \see addNode. */ ParseDef & operator()( ParseDef & subnode_r ) { return addNode( subnode_r ); } ParseDef & operator()( const std::string & name_r, Mode mode_r ) { return addNode( name_r, mode_r ); } ParseDef & operator()( const std::string & name_r, Mode mode_r, const shared_ptr & target_r ) { return addNode( name_r, mode_r, target_r ); } /** Get subnode by name. * \throws ParseDefBuildException if no subnode with \a name_r exists. */ ParseDef operator[]( const std::string & name_r ); public: /** Set data consumer. */ void setConsumer( const shared_ptr & target_r ); /** Set data consumer. * \note \a allocatedTarget_r is immediately wraped into a * shared_ptr. */ void setConsumer( ParseDefConsume * allocatedTarget_r ); /** Set data consumer. */ void setConsumer( ParseDefConsume & target_r ); /** Unset data consumer. */ void cancelConsumer(); /** Get data consumer. */ shared_ptr getConsumer() const; /** Parse the node. * This parses the node and all defined subnodes. Unknown * subnodes are skipped and leave a warning in the logfile. * \pre Current node must be XML_READER_TYPE_ELEMENT matching * this ParseDefs name. * \post All data parsed. At the corresponding end node. * (XML_READER_TYPE_END_ELEMENT or atill at the same node, * if it'a an empty element <node />). * \throws ParseDefException on error. */ void take( Reader & reader_r ); private: /** Implementation */ class Impl; /** Pointer to implementation (shared!) */ RW_pointer _pimpl; ParseDef( const shared_ptr & pimpl_r ); friend std::ostream & operator<<( std::ostream & str, const ParseDef & obj ); friend std::ostream & operator<<( std::ostream & str, const ParseDef::Impl & obj ); public: static bool _debug; }; /////////////////////////////////////////////////////////////////// /** \relates ParseDef ParseDef::Mode stream output. */ std::ostream & operator<<( std::ostream & str, ParseDef::Mode obj ); /** \relates ParseDef Stream output. */ std::ostream & operator<<( std::ostream & str, const ParseDef & obj ); ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_PARSEDEF_H libzypp-17.36.5/zypp/parser/xml/ParseDefConsume.cc000066400000000000000000000120031476576476200220420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/ParseDefConsume.cc * */ #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefConsume // /////////////////////////////////////////////////////////////////// ParseDefConsume::~ParseDefConsume() {} void ParseDefConsume::start( const Node & _node ) {} void ParseDefConsume::text( const Node & _node ) {} void ParseDefConsume::cdata( const Node & _node ) {} void ParseDefConsume::done( const Node & _node ) {} void ParseDefConsume::startSubnode( const Node & _node ) {} void ParseDefConsume::doneSubnode( const Node & _node ) {} /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefConsumeRedirect // /////////////////////////////////////////////////////////////////// ParseDefConsumeRedirect::ParseDefConsumeRedirect() {} ParseDefConsumeRedirect::ParseDefConsumeRedirect( shared_ptr target_r ) : _target( std::move(target_r) ) {} ParseDefConsumeRedirect::ParseDefConsumeRedirect( ParseDefConsume * allocatedTarget_r ) : _target( allocatedTarget_r ) {} ParseDefConsumeRedirect::ParseDefConsumeRedirect( ParseDefConsume & target_r ) : _target( &target_r, NullDeleter() ) {} ParseDefConsumeRedirect::~ParseDefConsumeRedirect() {} void ParseDefConsumeRedirect::setRedirect( shared_ptr target_r ) { _target = std::move(target_r); } void ParseDefConsumeRedirect::setRedirect( ParseDefConsume * allocatedTarget_r ) { _target.reset( allocatedTarget_r ); } void ParseDefConsumeRedirect::setRedirect( ParseDefConsume & target_r ) { _target.reset( &target_r, NullDeleter() ); } void ParseDefConsumeRedirect::cancelRedirect() { _target.reset(); } shared_ptr ParseDefConsumeRedirect::getRedirect() const { return _target; } void ParseDefConsumeRedirect::start( const Node & _node ) { if ( _target ) _target->start( _node ); } void ParseDefConsumeRedirect::text( const Node & _node ) { if ( _target ) _target->text( _node ); } void ParseDefConsumeRedirect::cdata( const Node & _node ) { if ( _target ) _target->cdata( _node ); } void ParseDefConsumeRedirect::done( const Node & _node ) { if ( _target ) _target->done( _node ); } void ParseDefConsumeRedirect::startSubnode( const Node & _node ) { if ( _target ) _target->startSubnode( _node ); } void ParseDefConsumeRedirect::doneSubnode ( const Node & _node ) { if ( _target ) _target->doneSubnode( _node ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefConsumeCallback // /////////////////////////////////////////////////////////////////// ParseDefConsumeCallback::ParseDefConsumeCallback() {} ParseDefConsumeCallback::~ParseDefConsumeCallback() {} void ParseDefConsumeCallback::start( const Node & node_r ) { if ( _start ) _start( node_r ); } void ParseDefConsumeCallback::text( const Node & node_r ) { if ( _text ) _text( node_r ); } void ParseDefConsumeCallback::cdata( const Node & node_r ) { if ( _cdata ) _cdata( node_r ); } void ParseDefConsumeCallback::done( const Node & node_r ) { if ( _done ) _done( node_r ); } void ParseDefConsumeCallback::startSubnode( const Node & node_r ) { if ( _startSubnode ) _startSubnode( node_r ); } void ParseDefConsumeCallback::doneSubnode( const Node & node_r ) { if ( _doneSubnode ) _doneSubnode( node_r ); } ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/xml/ParseDefConsume.h000066400000000000000000000330151476576476200217120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/ParseDefConsume.h * */ #ifndef ZYPP_PARSER_XML_PARSEDEFCONSUME_H #define ZYPP_PARSER_XML_PARSEDEFCONSUME_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// class Node; /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefConsume // /** Base class for ParseDef consumer. */ struct ParseDefConsume { virtual ~ParseDefConsume(); virtual void start( const Node & _node ); virtual void text ( const Node & _node ); virtual void cdata( const Node & _node ); virtual void done ( const Node & _node ); virtual void startSubnode( const Node & _node ); virtual void doneSubnode ( const Node & _node ); }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefConsumeRedirect // /** ParseDef consumer redirecting all events to another consumer. * \note Allocated ParseDefConsume * passed are * immediately wraped into a shared_ptr. */ class ParseDefConsumeRedirect : public ParseDefConsume { public: ParseDefConsumeRedirect(); ParseDefConsumeRedirect( shared_ptr target_r ); ParseDefConsumeRedirect( ParseDefConsume * allocatedTarget_r ); ParseDefConsumeRedirect( ParseDefConsume & target_r ); ~ParseDefConsumeRedirect() override; public: void setRedirect( shared_ptr target_r ); void setRedirect( ParseDefConsume * allocatedTarget_r ); void setRedirect( ParseDefConsume & target_r ); void cancelRedirect(); shared_ptr getRedirect() const; public: void start( const Node & _node ) override; void text ( const Node & _node ) override; void cdata( const Node & _node ) override; void done ( const Node & _node ) override; void startSubnode( const Node & _node ) override; void doneSubnode ( const Node & _node ) override; private: shared_ptr _target; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefConsumeCallback // /** ParseDef consumer that invokes callbacks. */ class ParseDefConsumeCallback : public ParseDefConsume { public: using Callback = function; ParseDefConsumeCallback(); ~ParseDefConsumeCallback() override; public: void start( const Node & node_r ) override; void text( const Node & node_r ) override; void cdata( const Node & node_r ) override; void done( const Node & node_r ) override; void startSubnode( const Node & node_r ) override; void doneSubnode( const Node & node_r ) override; public: Callback _start; Callback _text; Callback _cdata; Callback _done; Callback _startSubnode; Callback _doneSubnode; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /** \ref parseDefAssign exposed details */ namespace parse_def_assign { ///////////////////////////////////////////////////////////////// template struct Assigner; using AssignerRef = shared_ptr>; /** Common interface to all Assigner types. */ template <> struct Assigner { virtual ~Assigner() {} virtual void assign( const char * text_r ) {} }; /** Assigner assigns text to types constructible from \c char*. * \see \ref assigner convenience constructor. */ template struct Assigner : public Assigner { Assigner( Tp & value_r ) : _value( &value_r ) {} void assign( const char * text_r ) override { *_value = Tp( text_r ); } private: Tp * _value; }; /** \name Assigner specialisation for numeric and boolean values. * \relates Assigner */ //@{ template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strtonum( text_r, *_value ); } template <> inline void Assigner::assign( const char * text_r ) { str::strToBoolNodefault( text_r, *_value ); } //@} /** \name \relates Assigner Convenience constructor */ //@{ template inline AssignerRef assigner( Tp & value_r ) { return AssignerRef( new Assigner( value_r ) ); } template inline AssignerRef assigner( DefaultIntegral & value_r ) { return AssignerRef( new Assigner( value_r.get() ) ); } //@} /** \ref ParseDef consumer assigning \ref Node text and attribues values to variables. * * This can be used with all types supported by \ref Assigner. * Basically all types constructible from \c char*, or where a * specialisation exists (e.g. numeric and bool). * * You may also set a void( const Node & ) notification * callback which is invoked after the node was processed. * * \note Use and see \ref xml::parseDefAssign convenience constructor. * * \code * // parsedef for 'value' * ParseDef( "attr", MANDTAORY, xml::parseDefAssign( data.value ) * ( "attr", data.attr ) ) * \endcode */ struct Consumer : public ParseDefConsume { /** Extend \ref Consumer. */ void add( const AssignerRef & assigner_r ) { _text.push_back( assigner_r ); } /** Extend \ref Consumer. */ void add( const std::string & attr_r, const AssignerRef & assigner_r ) { _attr[attr_r].push_back( assigner_r ); } /** Set pre notification callback. */ void prenotify( function pre_r ) { _pre = std::move(pre_r); } /** Set post notification callback. */ void postnotify( function post_r ) { _post = std::move(post_r); } void start( const xml::Node & node_r ) override { if ( _pre ) _pre( node_r ); if ( ! _attr.empty() ) for_( it, _attr.begin(), _attr.end() ) assign( it->second, node_r.getAttribute( it->first.c_str() ).c_str() ); } void text( const xml::Node & node_r ) override { if ( ! _text.empty() ) assign( _text, node_r.value().c_str() ); } void done( const xml::Node & node_r ) override { if ( _post ) _post( node_r ); } private: void assign( const std::vector & vec_r, const char * value_r ) { if ( value_r ) for_( it, vec_r.begin(), vec_r.end() ) (*it)->assign( value_r ); } private: std::unordered_map > _attr; std::vector _text; function _pre; function _post; }; /** Helper class to build a \ref Consumer. * \relates Consumer * * The class constructs the consumer, allows to extend it via * \ref operator(), and provides a conversion to * \c shared_ptr, so it can be passed as a * node consumer to \ref ParseDef. * * You may also set a void( const Node & ) notification * callback which is invoked before/after the node was processed. * * \note Use and see \ref xml::parseDefAssign convenience constructor. */ struct Builder { /** Contruct \ref Consumer. */ Builder() : _ptr( new Consumer ) {} /** Contruct \ref Consumer. */ template Builder( Tp & value_r ) : _ptr( new Consumer ) { operator()( value_r ); } /** Contruct \ref Consumer. */ template Builder( const std::string & attr_r, Tp & value_r ) : _ptr( new Consumer ) { operator()( attr_r, value_r ); } /** Extend \ref Consumer. */ template Builder & operator()( Tp & value_r ) { _ptr->add( assigner( value_r ) ); return *this; } /** Extend \ref Consumer. */ template Builder & operator()( const std::string & attr_r, Tp & value_r ) { _ptr->add( attr_r, assigner( value_r ) ); return *this; } /** Set pre notification callback. */ Builder & operator<<( function done_r ) { _ptr->prenotify( std::move(done_r) ); return *this; } /** Set post notification callback. */ Builder & operator>>( function done_r ) { _ptr->postnotify( std::move(done_r) ); return *this; } /** Type conversion so this can be passed as node consumer to \ref ParseDef. */ operator shared_ptr () const { return _ptr; } private: shared_ptr _ptr; }; ///////////////////////////////////////////////////////////////// } // namespace parse_def_assign /////////////////////////////////////////////////////////////////// /** \name \ref ParseDef consumer assigning \ref Node text and attribues values to variables. * \relates parse_def_assign::Consumer * \relates parse_def_assign::Builder * * This function allows convenient contruction of a \ref parse_def_assign::Consumer * to be passed as \ref Node conssumer to \ref ParseDef. Simply list each attribute's * name together with the variable its value should be assigned to. If the attribute * name is omitted, the node's text value gets assigned. * * Target variables can be of any type tsupported by \ref Assigner. * Basically all types constructible from \c char*, or where a * specialisation exists (e.g. numeric and bool). * * \code * void setupDone( const xml::Node & _node ) * { ... } * * // parsedef for 'value' * ParseDef( "attr", MANDTAORY, * xml::parseDefAssign( data.value ) * ( "attr", data.attr ) * >> &setupDone ); * \endcode * * \see \ref xml::rnParse for more example. */ //@{ inline parse_def_assign::Builder parseDefAssign() { return parse_def_assign::Builder(); } template inline parse_def_assign::Builder parseDefAssign( Tp & value_r ) { return parse_def_assign::Builder( value_r ); } template inline parse_def_assign::Builder parseDefAssign( const std::string & attr_r, Tp & value_r ) { return parse_def_assign::Builder( attr_r, value_r ); } //@} ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_PARSEDEFCONSUME_H libzypp-17.36.5/zypp/parser/xml/ParseDefException.cc000066400000000000000000000047421476576476200224020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/ParseDefException.cc * */ #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDefException::ParseDefException // METHOD TYPE : Constructor // ParseDefException::ParseDefException( const std::string & what_r ) : Exception( what_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDefBuildException::ParseDefBuildException // METHOD TYPE : Constructor // ParseDefBuildException::ParseDefBuildException( const std::string & what_r ) : ParseDefException( what_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDefValidateException::ParseDefValidateException // METHOD TYPE : Constructor // ParseDefValidateException::ParseDefValidateException( const std::string & what_r ) : ParseDefException( what_r ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : ParseDefDataException::ParseDefDataException // METHOD TYPE : Constructor // ParseDefDataException::ParseDefDataException( const std::string & what_r ) : ParseDefException( what_r ) {} ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/xml/ParseDefException.h000066400000000000000000000057111476576476200222410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/ParseDefException.h * */ #ifndef ZYPP_PARSER_XML_PARSEDEFEXCEPTION_H #define ZYPP_PARSER_XML_PARSEDEFEXCEPTION_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefException // /** Common base class for \ref ParseDef exceptions. */ struct ParseDefException : public Exception { ParseDefException( const std::string & what_r ); }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefBuildException // /** Exceptions when building a ParseDef tree. */ struct ParseDefBuildException : public ParseDefException { ParseDefBuildException( const std::string & what_r ); }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefValidateException // /** Parse exceptions related to the documents node structure. */ struct ParseDefValidateException : public ParseDefException { ParseDefValidateException( const std::string & what_r ); }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefDataException // /** Parse exceptions related to the nodes content. */ struct ParseDefDataException : public ParseDefException { ParseDefDataException( const std::string & what_r ); }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_PARSEDEFEXCEPTION_H libzypp-17.36.5/zypp/parser/xml/ParseDefTraits.h000066400000000000000000000042331476576476200215470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/ParseDefTraits.h * */ #ifndef ZYPP_PARSER_XML_PARSEDEFTRAITS_H #define ZYPP_PARSER_XML_PARSEDEFTRAITS_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ParseDefTraits // /** */ struct ParseDefTraits { using ModeBitsType = unsigned char; using ModeBits = bit::BitField; using TypeBits = bit::Range; using VisitBits = bit::Range; enum TypeValue { BIT_OPTIONAL = bit::RangeValue::value, BIT_MANDTAORY = bit::RangeValue::value }; enum VisitValue { BIT_ONCE = bit::RangeValue::value, BIT_MULTIPLE = bit::RangeValue::value }; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_PARSEDEFTRAITS_H libzypp-17.36.5/zypp/parser/xml/Reader.cc000066400000000000000000000157751476576476200202440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/Reader.cc * */ #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// int ioread( void * context_r, char * buffer_r, int bufferLen_r ) { if ( context_r && buffer_r ) { return reinterpret_cast(context_r) ->stream().read( buffer_r, bufferLen_r ).gcount(); } INT << "XML parser error: null pointer check failed " << context_r << ' ' << static_cast(buffer_r) << endl; return -1; } int ioclose( void * /*context_r*/ ) { return 0; } std::list structuredErrors; #if LIBXML_VERSION >= 21200 void structuredErrorFunc( void * userData, const xmlError * error ) #else void structuredErrorFunc( void * userData, xmlError * error ) #endif { if ( error ) { // error->message is NL terminated std::string err( str::form( "%s[%d] %s", Pathname::basename(error->file).c_str(), error->line, str::stripSuffix( error->message, "\n" ).c_str() ) ); structuredErrors.push_back( err ); WAR << err << endl; } } struct ParseException : public Exception { ParseException() : Exception( "Parse error: " + ( structuredErrors.empty() ? std::string("unknown error"): structuredErrors.back() ) ) { for_( it, structuredErrors.begin(), --structuredErrors.end() ) addHistory( *it ); } }; ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::Reader // METHOD TYPE : Constructor // Reader::Reader( const InputStream & stream_r, const Validate & validate_r ) : _stream( stream_r ) , _reader( xmlReaderForIO( ioread, ioclose, &_stream, stream_r.path().asString().c_str(), "utf-8", XML_PARSE_PEDANTIC ) ) , _node( _reader ) { MIL << "Start Parsing " << _stream << endl; if ( ! _reader || ! stream_r.stream().good() ) ZYPP_THROW( Exception( "Bad input stream" ) ); // set error handler // TODO: Fix using a global lastStructuredError string is not reentrant. structuredErrors.clear(); xmlTextReaderSetStructuredErrorHandler( _reader, structuredErrorFunc, NULL ); // TODO: set validation // advance to 1st node nextNode(); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::~Reader // METHOD TYPE : Destructor // Reader::~Reader() { if ( _reader ) { xmlFreeTextReader( _reader ); } MIL << "Done Parsing " << _stream << endl; } XmlString Reader::nodeText() { if ( ! _node.isEmptyElement() ) { if ( nextNode() ) { if ( _node.nodeType() == XML_READER_TYPE_TEXT ) { return _node.value(); } } } return XmlString(); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::nextNode // METHOD TYPE : bool // bool Reader::nextNode() { int ret = xmlTextReaderRead( _reader ); if ( ret == 1 ) { return true; } xmlTextReaderClose( _reader ); if ( ret != 0 ) { ZYPP_THROW( ParseException() ); } return false; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::nextNodeAttribute // METHOD TYPE : bool // bool Reader::nextNodeAttribute() { int ret = xmlTextReaderMoveToNextAttribute( _reader ); if ( ret == 1 ) { return true; } if ( ret != 0 ) { ZYPP_THROW( ParseException() ); } return false; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::close // METHOD TYPE : void // void Reader::close() { if ( _reader ) { xmlTextReaderClose( _reader ); } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::seekToNode // METHOD TYPE : bool // bool Reader::seekToNode( int depth_r, const std::string & name_r ) { do { if ( _node.depth() == depth_r && _node.name() == name_r && _node.nodeType() == XML_READER_TYPE_ELEMENT ) { break; } } while( nextNode() ); return ! atEnd(); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Reader::seekToEndNode // METHOD TYPE : bool // bool Reader::seekToEndNode( int depth_r, const std::string & name_r ) { // Empty element has no separate end node: do { if ( _node.depth() == depth_r && _node.name() == name_r && ( _node.nodeType() == XML_READER_TYPE_END_ELEMENT || ( _node.nodeType() == XML_READER_TYPE_ELEMENT && _node.isEmptyElement() ) ) ) { break; } } while( nextNode() ); return ! atEnd(); } ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/xml/Reader.h000066400000000000000000000131341476576476200200710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/Reader.h * */ #ifndef ZYPP_PARSER_XML_READER_H #define ZYPP_PARSER_XML_READER_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Validate // /** xmlTextReader document validation. * \todo Implement RelaxNG and W3C XSD **/ struct Validate { static Validate none() { return Validate(); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Reader // /** xmlTextReader based interface to iterate xml streams. * * \code * // Consume a node. * bool consumeNode( xml::Reader & reader_r ) * { * DBG << *reader_r << endl; * return true; * } * * // Consume all nodes (omitting attributes) * void example() * { * try * { * xml::Reader reader( "/Local/repodata/repomd.xml" ); * reader.foreachNode( consumeNode ); * } * catch ( const Exception & ) * { ; } // parse error * } * \endcode * * \code * // Consume a node. * bool consumeNodeAndAttribute( xml::Reader & reader_r ) * { * consumeNode( reader_r ); * return reader_r.foreachNodeAttribute( consumeNode ); * } * * // Consume all nodes and their attributes. * void example() * { * Pathname repodata( "/Local/repodata/repomd.xml" ); * try * { * xml::Reader reader( "/Local/repodata/repomd.xml" ); * reader.foreachNode( consumeNodeAndAttribute ); * // or: * // reader.foreachNodeOrAttribute( consumeNode ) * } * catch ( const Exception & ) * { ; } // parse error * } * \endcode **/ class ZYPP_API Reader : private zypp::base::NonCopyable { public: /** Ctor. Setup xmlTextReader and advance to the 1st Node. */ Reader( const InputStream & stream_r, const Validate & validate_r = Validate::none() ); /** Dtor. */ ~Reader(); public: /** * If the current node is not empty, advances the reader to the next * node, and returns the value * * \note if the node has a xml subtree you will probably jump to that node * and get a empty text value back. Use it only if you are sure the node * has no XML subtree. */ XmlString nodeText(); /** */ bool nextNode(); /** */ bool nextNodeAttribute(); /** */ bool nextNodeOrAttribute() { return( nextNodeAttribute() || nextNode() ); } /** */ bool atEnd() const { return( _node.readState() == XML_TEXTREADER_MODE_CLOSED ); } /** */ const Node & operator*() const { return _node; } /** */ const Node * operator->() const { return &_node; } public: /** */ using ProcessNode = function; /** */ bool foreachNode( const ProcessNode& fnc_r ) { if ( _node.isAttribute() ) nextNode(); for ( ; ! atEnd(); nextNode() ) { if ( ! fnc_r( *this ) ) return false; } return true; } /** */ bool foreachNodeAttribute( const ProcessNode& fnc_r ) { if ( _node.isAttribute() && ! fnc_r( *this ) ) return false; while( nextNodeAttribute() ) { if ( ! fnc_r( *this ) ) return false; } return true; } /** */ bool foreachNodeOrAttribute( const ProcessNode& fnc_r ) { for ( ; ! atEnd(); nextNodeOrAttribute() ) { if ( ! fnc_r( *this ) ) return false; } return true; } public: /** */ bool seekToNode( int depth_r, const std::string & name_r ); /** */ bool seekToEndNode( int depth_r, const std::string & name_r ); private: void close(); private: InputStream _stream; xmlTextReaderPtr _reader; Node _node; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_READER_H libzypp-17.36.5/zypp/parser/xml/XmlEscape.h000066400000000000000000000000541476576476200205450ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/parser/xml/XmlString.cc000066400000000000000000000041111476576476200207470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/XmlString.cc * */ #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : XmlString::XmlString // METHOD TYPE : Constructor // XmlString::XmlString( const xmlChar *const xmlstr_r, OnDelete ondelete_r ) { if ( xmlstr_r ) { if ( ondelete_r == FREE ) _xmlstr.reset( xmlstr_r, Deleter() ); else _xmlstr.reset( xmlstr_r, NullDeleter() ); } } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const XmlString & obj ) { if ( obj ) return str << obj.c_str(); return str << "NULL"; } ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/xml/XmlString.h000066400000000000000000000076571476576476200206330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/XmlString.h * */ #ifndef ZYPP_PARSER_XML_XMLSTRING_H #define ZYPP_PARSER_XML_XMLSTRING_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : XmlString // /** xmlChar * wrapper. * * Common handling of xmlChar * that do or do not need to * be freed. If the wraped xmlChar * needs to be freed by * calling \c xmlFree, pass \c FREE as 2nd argument to the ctor. **/ class ZYPP_API XmlString { /** shared_ptr custom deleter calling \c xmlFree. */ struct Deleter { void operator()( const xmlChar * xmlstr_r ) const { xmlFree( (void*)(xmlstr_r) ); } }; public: /** Dtor policy. */ enum OnDelete { NOFREE, FREE }; /** Ctor from xmlChar. * Pass \c FREE as 2nd arg if \c xmlFree needs to be called on destruction. */ XmlString( const xmlChar *const xmlstr_r = NULL, OnDelete ondelete_r = NOFREE ); /** Access the xmlChar *. */ const xmlChar * get() const { if ( ! _xmlstr ) return NULL; return &(*_xmlstr); } /** Implicit conversion to xmlChar *. */ operator const xmlChar * () const { return get(); } /** Explicit conversion to const char *. */ const char * c_str() const { return reinterpret_cast(get()); } /** Explicit conversion to std::string. */ std::string asString() const { if ( ! _xmlstr ) return std::string(); return c_str(); } bool operator==( const std::string & rhs ) const { return( rhs == c_str() ); } bool operator!=( const std::string & rhs ) const { return( rhs != c_str() ); } bool operator==( const char *const rhs ) const { return( asString() == rhs ); } bool operator!=( const char *const rhs ) const { return( asString() != rhs ); } bool operator==( const XmlString & rhs ) const { return( asString() == rhs.c_str() ); } bool operator!=( const XmlString & rhs ) const { return( asString() != rhs.c_str() ); } private: /** Wraps the xmlChar *. * The appropriate custom deleter is set by the ctor. */ shared_ptr _xmlstr; }; /////////////////////////////////////////////////////////////////// /** \relates XmlString Stream output. */ std::ostream & operator<<( std::ostream & str, const XmlString & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_XMLSTRING_H libzypp-17.36.5/zypp/parser/xml/libxmlfwd.cc000066400000000000000000000052211476576476200210130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/libxmlfwd.cc * */ #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ReadState & obj ) { switch ( obj ) { #define X(T) case XML_TEXTREADER_MODE_##T: return str << #T X(INITIAL); X(INTERACTIVE); X(ERROR); X(EOF); X(CLOSED); X(READING); #undef X } return str << "UNKNOWN_READ_STATE"; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const NodeType & obj ) { switch ( obj ) { #define X(T) case XML_READER_TYPE_##T: return str << #T X(NONE); X(ELEMENT); X(ATTRIBUTE); X(TEXT); X(CDATA); X(ENTITY_REFERENCE); X(ENTITY); X(PROCESSING_INSTRUCTION); X(COMMENT); X(DOCUMENT); X(DOCUMENT_TYPE); X(DOCUMENT_FRAGMENT); X(NOTATION); X(WHITESPACE); X(SIGNIFICANT_WHITESPACE); X(END_ELEMENT); X(END_ENTITY); X(XML_DECLARATION); #undef X } return str << "UNKNOWN_NODE_TYPE"; } ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/parser/xml/libxmlfwd.h000066400000000000000000000033431476576476200206600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/xml/libxmlfwd.h * */ #ifndef ZYPP_PARSER_XML_LIBXMLFWD_H #define ZYPP_PARSER_XML_LIBXMLFWD_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace xml { ///////////////////////////////////////////////////////////////// using ReadState = xmlTextReaderMode; /** \relates ReadState Stream output. */ std::ostream & operator<<( std::ostream & str, const ReadState & obj ); using NodeType = xmlReaderTypes; /** \relates NodeType Stream output. */ std::ostream & operator<<( std::ostream & str, const NodeType & obj ); ///////////////////////////////////////////////////////////////// } // namespace xml /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_XML_LIBXMLFWD_H libzypp-17.36.5/zypp/parser/yum/000077500000000000000000000000001476576476200165265ustar00rootroot00000000000000libzypp-17.36.5/zypp/parser/yum/RepomdFileReader.cc000066400000000000000000000157571476576476200222250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/yum/RepomdFileReader.cc * Implementation of repomd.xml file reader. */ #include #include #include #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "parser::yum" using std::endl; using namespace zypp::xml; namespace zypp { namespace parser { namespace yum { /////////////////////////////////////////////////////////////////////// // // CLASS NAME : RepomdFileReader::Impl // class RepomdFileReader::Impl : private base::NonCopyable { public: /** Ctro taking a ProcessResource callback */ Impl(const Pathname &repomd_file, ProcessResource &&callback ) : _callback( std::move(callback) ) { Reader reader( repomd_file ); MIL << "Reading " << repomd_file << endl; reader.foreachNode( bind( &RepomdFileReader::Impl::consumeNode, this, _1 ) ); } /** * Callback provided to the XML parser. */ bool consumeNode( Reader & reader_r ); /** repo keywords parsed on the fly */ const std::set & keywords() const { return _keywords; } private: /** Retrieve a checksum node. */ CheckSum getChecksum( Reader & reader_r ) { return CheckSum( reader_r->getAttribute("type").asString(), reader_r.nodeText().asString() ); } /** Retrieve a size node. */ ByteCount getSize( Reader & reader_r ) { return ByteCount( str::strtonum( reader_r.nodeText().asString() ) ); } private: /** Function for processing collected data. Passed-in through constructor. */ ProcessResource _callback; /** The resource type string. */ std::string _typeStr; /** Location of metadata file. */ OnMediaLocation _location; std::set _keywords; ///< repo keywords parsed on the fly }; /////////////////////////////////////////////////////////////////////// /* * xpath and multiplicity of processed nodes are included in the code * for convenience: * * // xpath: (?|*|+) * * if multiplicity is ommited, then the node has multiplicity 'one'. */ // -------------------------------------------------------------------------- bool RepomdFileReader::Impl::consumeNode( Reader & reader_r ) { if ( reader_r->nodeType() == XML_READER_TYPE_ELEMENT ) { // xpath: /repomd if ( reader_r->name() == "repomd" ) { return true; } // xpath: /repomd/data (+) if ( reader_r->name() == "data" ) { _typeStr = reader_r->getAttribute("type").asString(); return true; } // xpath: /repomd/location if ( reader_r->name() == "location" ) { _location.setLocation( reader_r->getAttribute("href").asString(), 1 ); // ignoring attribute xml:base return true; } // xpath: /repomd/checksum if ( reader_r->name() == "checksum" ) { _location.setChecksum( getChecksum( reader_r ) ); return true; } // xpath: /repomd/header-checksum if ( reader_r->name() == "header-checksum" ) { _location.setHeaderChecksum( getChecksum( reader_r ) ); return true; } // xpath: /repomd/timestamp if ( reader_r->name() == "timestamp" ) { // ignore it return true; } // xpath: /repomd/size if ( reader_r->name() == "size" ) { _location.setDownloadSize( getSize( reader_r ) ); return true; } // xpath: /repomd/header-size if ( reader_r->name() == "header-size" ) { _location.setHeaderSize( getSize( reader_r ) ); return true; } // xpath: /tags/content if ( reader_r->name() == "content" ) { const auto & tag = reader_r.nodeText(); if ( tag.c_str() && *tag.c_str() ) _keywords.insert( tag.asString() ); // remember keyword return true; } } else if ( reader_r->nodeType() == XML_READER_TYPE_END_ELEMENT ) { // xpath: /repomd/data if ( reader_r->name() == "data" ) { if (_callback) { _callback( std::move(_location), _typeStr ); _location = OnMediaLocation(); _typeStr.clear(); } return true; } } return true; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepomdFileReader // /////////////////////////////////////////////////////////////////// RepomdFileReader::RepomdFileReader( const Pathname & repomd_file, ProcessResource callback ) : _pimpl( new Impl(repomd_file, std::move(callback)) ) {} RepomdFileReader::RepomdFileReader( const Pathname & repomd_file ) : _pimpl( new Impl(repomd_file, ProcessResource()) ) {} RepomdFileReader::~RepomdFileReader() {} const std::set & RepomdFileReader::keywords() const { return _pimpl->keywords(); } std::vector> RepomdFileReader::keyhints() const { std::vector> ret; for ( const std::string & tag : keywords() ) { // Get keyhints on the fly: // gpg-pubkey-39db7c82-5847eb1f.asc?fpr=22C07BA534178CD02EFE22AAB88B2FD43DBDC284 // Fingerprint is explicitly mentioned or id/fpr can be derived from the filename if ( tag.compare( 0,10,"gpg-pubkey" ) != 0 ) continue; static const str::regex rx( "^(gpg-pubkey([^?]*))(\\?fpr=([[:xdigit:]]{8,}))?$" ); str::smatch what; if ( str::regex_match( tag.c_str(), what, rx ) ) { std::string keyfile { what[1] }; std::string keyident; if ( what.size(4) != std::string::npos ) { // with fpr= keyident = what[4]; } else { static const str::regex rx( /*gpg-pubkey*/"^-([[:xdigit:]]{8,})" ); if ( str::regex_match( what[2], what, rx ) ) { keyident = what[1]; } else { DBG << "Tag " << tag << " does not contain a keyident. ignore it." << endl; continue; } } ret.push_back( std::make_pair( std::move(keyfile), std::move(keyident) ) ); } } return ret; } } // ns yum } // ns parser } // ns zypp // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/parser/yum/RepomdFileReader.h000066400000000000000000000045501476576476200220540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/yum/RepomdFileReader.h * Interface of repomd.xml file reader. */ #ifndef zypp_source_yum_RepomdFileReader_H #define zypp_source_yum_RepomdFileReader_H #include #include #include #include #include namespace zypp { namespace parser { namespace yum { /** * Reads through a repomd.xml file and collects type, location, checksum and * other data about metadata files to be processed. * * After each file entry is read, an \ref OnMediaLocation and the resource type * string are prepared and passed to the \ref _callback. */ class RepomdFileReader : private base::NonCopyable { public: /** Callback taking \ref OnMediaLocation and the resource type string */ using ProcessResource = function; /** * CTOR. Creates also \ref xml::Reader and starts reading. * * \param repomd_file is the repomd.xml file you want to read * \param callback is a function. * * \see RepomdFileReader::ProcessResource */ RepomdFileReader(const Pathname & repomd_file, ProcessResource callback ); /** \overload Quick parsing keywords and keyhints. */ RepomdFileReader( const Pathname & repomd_file ); /** DTOR */ ~RepomdFileReader(); public: /** repo keywords parsed on the fly */ const std::set & keywords() const; /** gpg key hits shipped in keywords (bsc#1184326) */ std::vector> keyhints() const; private: class Impl; RW_pointer > _pimpl; }; } // namespace yum } // namespace parser } // namespace zypp #endif // zypp_source_yum_RepomdFileReader_H libzypp-17.36.5/zypp/parser/yum/schema/000077500000000000000000000000001476576476200177665ustar00rootroot00000000000000libzypp-17.36.5/zypp/parser/yum/schema/common-inc.rnc000066400000000000000000000040011476576476200225240ustar00rootroot00000000000000# private is not an XML namespace, just a holder for reusable # attribute/element sets private.positive = xsd:positiveInteger { pattern="[1-9][0-9]*" } private.nonnegative = "0" | private.positive # Unix timestamp (seconds since epoch) # For our purposes, this is always positive private.unixts = private.positive private.size = private.nonnegative private.checksum = (attribute type { "md5" }, xsd:string { length="32" pattern="[0-9a-f]*" }) | (attribute type { "sha" }, xsd:string { length="40" pattern="[0-9a-f]*" }) | (attribute type { "sha256" }, xsd:string { length="64" pattern="[0-9a-f]*" }) | (attribute type { "sha" }, xsd:string { length="32" pattern="[0-9a-f]*" }) # The last option is totally broken, but is in the wild!!! :( private.evr = attribute epoch { private.nonnegative }?, attribute ver { text }, attribute rel { text }? private.localizedtext = attribute lang { "en" | "de" }, text private.archenum = "noarch" | "i386" | "i486" | "i586" | "i686" | "athlon" | "x86_64" | "pentium3" | "pentium4" | "s390" | "s390x" | "ppc" | "ppc64" | "ia64" | "alphaev67" | "alphaev6" | "alphapca56" | "alphaev56" | "alphaev5" | "alpha" | "sparc64v" | "sparcv9v" | "sparc64" | "sparcv9" | "sparcv8" | "sparc" | "aarch64" | "armv8hl" | "armv8l" | "armv7tnhl" | "armv7thl" | "armv7nhl" | "armv7hl" | "armv7l" | "armv6l" | "armv5tejl" | "armv5tel" | "armv5l" | "armv4tl" | "armv4l" | "armv3l" | "riscv64" | "loong64" | "sh3" | "sh4" | "sh4a" | "m68k" | "src" libzypp-17.36.5/zypp/parser/yum/schema/common-inc.rng000066400000000000000000000073611476576476200225440ustar00rootroot00000000000000 [1-9][0-9]* 0 md5 32 [0-9a-f]* sha 40 [0-9a-f]* sha256 64 [0-9a-f]* sha 32 [0-9a-f]* en de noarch i386 i486 i586 i686 athlon x86_64 pentium3 pentium4 s390 s390x ppc ppc64 ia64 alphaev67 alphaev6 alphapca56 alphaev56 alphaev5 alpha sparc64v sparcv9v sparc64 sparcv9 sparcv8 sparc aarch64 armv8hl armv8l armv7tnhl armv7thl armv7nhl armv7hl armv7l armv6l armv5tejl armv5tel armv5l armv4tl armv4l armv3l riscv64 loong64 sh3 sh4 sh4a m68k src libzypp-17.36.5/zypp/parser/yum/schema/deltainfo.rnc000066400000000000000000000012311476576476200224340ustar00rootroot00000000000000include "common-inc.rnc" start = element deltainfo { element newpackage { attribute name { text }, attribute arch { private.archenum }, attribute version { text }, attribute release { text }, element delta { attribute oldepoch { private.nonnegative }, # two different formats, with different attribute names with same data ((attribute oldversion { text }, attribute oldrelease { text }) | (attribute ver { text }, attribute rel { text })), element filename { text }, element sequence { text }, element size { private.size }, element checksum { private.checksum } }+ }* } libzypp-17.36.5/zypp/parser/yum/schema/deltainfo.rng000066400000000000000000000030121476576476200224370ustar00rootroot00000000000000 libzypp-17.36.5/zypp/parser/yum/schema/filelists.rnc000066400000000000000000000006351476576476200224740ustar00rootroot00000000000000default namespace = "http://linux.duke.edu/metadata/filelists" include "common-inc.rnc" start = element filelists { attribute packages { xsd:nonNegativeInteger }, element package { attribute pkgid { text }, attribute name { text }, attribute arch { private.archenum }, element version { private.evr }, element file { attribute type { "dir" | "ghost" }?, text }* }* } libzypp-17.36.5/zypp/parser/yum/schema/filelists.rng000066400000000000000000000021711476576476200224750ustar00rootroot00000000000000 dir ghost libzypp-17.36.5/zypp/parser/yum/schema/other.rnc000066400000000000000000000006721476576476200216200ustar00rootroot00000000000000default namespace = "http://linux.duke.edu/metadata/other" include "common-inc.rnc" start = element otherdata { attribute packages { private.nonnegative }, element package { attribute pkgid { text }, attribute name { text }, attribute arch { private.archenum }, element version { private.evr }, element changelog { attribute author { text }, attribute date { private.unixts }, text }* }* } libzypp-17.36.5/zypp/parser/yum/schema/other.rng000066400000000000000000000017251476576476200216240ustar00rootroot00000000000000 libzypp-17.36.5/zypp/parser/yum/schema/patch.rnc000066400000000000000000000066661476576476200216070ustar00rootroot00000000000000default namespace = "http://novell.com/package/metadata/suse/patch" namespace yum = "http://linux.duke.edu/metadata/common" namespace suse = "http://novell.com/package/metadata/suse/common" include "rpm-inc.rnc" yum.name = element yum:name { text } yum.arch = element yum:arch { private.archenum } yum.version = element yum:version { private.evr } suse.freshens = element suse:freshens { element suse:entry { attribute kind { "package" }, attribute name { text } }+ } group.deps = rpm.requires?, rpm.obsoletes?, rpm.provides?, rpm.recommends?, rpm.supplements?, rpm.conflicts?, suse.freshens? patch.location = element location { attribute href { xsd:anyURI } } patch.checksum = element checksum { private.checksum } patch.time = element time { attribute file { private.unixts }, attribute build { private.unixts } } patch.size = element size { attribute package { private.size }, attribute archive { private.size } } start = element patch { attribute patchid { text }, attribute timestamp { private.unixts }, attribute engine { "1.0" }, yum.name, element summary { private.localizedtext }+, element description { private.localizedtext }+, element license-to-confirm { private.localizedtext }?, yum.version, group.deps, element reboot-needed { empty }?, element package-manager { empty }?, element category { "security" | "recommended" | "optional" }, # This is in two places (with slightly different definiton) # because that is what is seen in the wild element license-to-confirm { text }?, element atoms { element message { yum.name, yum.version, element text { private.localizedtext }, group.deps }?, element yum:package { attribute type { "rpm" }, yum.name, yum.arch, yum.version, element yum:checksum { attribute pkgid { "YES" }, private.checksum }, element yum:time { attribute file { private.unixts }, attribute build { private.unixts } }, element yum:size { attribute package { private.size }, attribute installed { private.size }, attribute archive { xsd:nonNegativeInteger } }, element yum:location { attribute href { xsd:anyURI } }, element yum:format { group.deps }, element pkgfiles { element patchrpm { patch.location, patch.checksum, patch.time, patch.size, element base-version { private.evr }+ }?, element deltarpm { patch.location, patch.checksum, patch.time, patch.size, element base-version { private.evr, attribute md5sum { xsd:string { length="32" pattern="[0-9a-f]*" } }, attribute buildtime { private.unixts }, attribute sequence_info { text } } }* } }*, element message { yum.name, yum.version, element text { private.localizedtext }, group.deps }?, element script { yum.name, yum.version, # Script can either be remote (do-location and do-checksum) # or inline (do), but not both ((element do-location { attribute href { xsd:anyURI } }, element do-checksum { private.checksum }) | element do { text }), group.deps }? }? } libzypp-17.36.5/zypp/parser/yum/schema/patch.rng000066400000000000000000000204221476576476200215750ustar00rootroot00000000000000 package 1.0 security recommended optional rpm YES 32 [0-9a-f]* libzypp-17.36.5/zypp/parser/yum/schema/patches.rnc000066400000000000000000000005511476576476200221220ustar00rootroot00000000000000default namespace = "http://novell.com/package/metadata/suse/patches" include "common-inc.rnc" start = element patches { element patch { attribute id { text }, element checksum { private.checksum }, element location { attribute href { xsd:anyURI } }, element category { "recommended" | "security" | "optional" }? }* } libzypp-17.36.5/zypp/parser/yum/schema/patches.rng000066400000000000000000000017101476576476200221240ustar00rootroot00000000000000 recommended security optional libzypp-17.36.5/zypp/parser/yum/schema/patterns.rnc000066400000000000000000000015231476576476200223330ustar00rootroot00000000000000namespace suse = "http://novell.com/package/metadata/suse/pattern" namespace rpm = "http://linux.duke.edu/metadata/rpm" include "rpm-inc.rnc" suse.uservisible = element suse:uservisible { empty } suse.category = element suse:category { private.localizedtext } suse.plaincat = element suse:category { text } start = element patterns { # seen missing in the wild attribute count { xsd:nonNegativeInteger }?, element suse:pattern { element suse:name { text }, element suse:arch { private.archenum }?, element suse:version { private.evr }?, element suse:summary { text }, element suse:description { text }?, ((suse.uservisible, suse.category?) | (suse.plaincat, suse.uservisible?)), rpm.provides?, element rpm:freshens { rpm.entry+ }?, rpm.suggests?, rpm.requires?, rpm.recommends? }+ } libzypp-17.36.5/zypp/parser/yum/schema/patterns.rng000066400000000000000000000047321476576476200223440ustar00rootroot00000000000000 libzypp-17.36.5/zypp/parser/yum/schema/primary.rnc000066400000000000000000000046661476576476200221710ustar00rootroot00000000000000default namespace = "http://linux.duke.edu/metadata/common" namespace rpm = "http://linux.duke.edu/metadata/rpm" namespace suse = "http://novell.com/package/metadata/suse/common" include "rpm-inc.rnc" yum.name = element name { text } yum.arch = element arch { private.archenum } yum.version = element version { private.evr } group.deps = rpm.provides?, rpm.requires?, rpm.conflicts?, rpm.obsoletes?, rpm.suggests?, rpm.recommends?, rpm.supplements?, rpm.enhances? group.deps1 = rpm.provides?, rpm.requires?, rpm.conflicts?, rpm.obsoletes?, rpm.suggests?, rpm.enhances?, rpm.recommends?, rpm.supplements? group.deps2 = rpm.provides?, rpm.conflicts?, rpm.obsoletes?, rpm.enhances?, rpm.supplements?, rpm.suggests?, rpm.recommends?, rpm.requires? yum.location = element location { attribute href { xsd:anyURI } } yum.checksum = element checksum { attribute pkgid { "YES" }, private.checksum } yum.time = element time { attribute file { private.unixts }, attribute build { private.unixts } } yum.size = element size { attribute package { private.size }, # Found this blank in the wild attribute archive { private.size | "" }, attribute installed { private.size } } start = element metadata { attribute packages { private.nonnegative }, element package { attribute type { "rpm" }, yum.name, yum.arch, yum.version, yum.checksum, # Found unlocalized in the wild element summary { private.localizedtext | text }, element description { private.localizedtext | text }, element packager { text }, # 10-SP1 stuff has a broken URL in the wild element url { xsd:anyURI | text }, yum.time, yum.size, yum.location, element format { element rpm:license { text }, element rpm:vendor { text }, element rpm:group { text }, element rpm:buildhost { text }, # Two different options seen in the wild # one omits the element, the other leaves the value empty element rpm:sourcerpm { text | empty }?, element rpm:header-range { attribute start { private.positive }, attribute end { private.positive } }, # any of these orders is valid, all are in use (group.deps | group.deps1 | group.deps2), element file { attribute type { "dir" | "ghost" }?, text }* }, element suse:license-to-confirm { text }? }* } libzypp-17.36.5/zypp/parser/yum/schema/primary.rng000066400000000000000000000146171476576476200221720ustar00rootroot00000000000000 YES rpm dir ghost libzypp-17.36.5/zypp/parser/yum/schema/product.rnc000066400000000000000000000011401476576476200221460ustar00rootroot00000000000000default namespace = "http://novell.com/package/metadata/suse/product" include "rpm-inc.rnc" start = element product { attribute type { "add-on" | "base" }, element vendor { text }, element name { text }, element arch { private.archenum }, element version { private.evr }, element displayname { private.localizedtext }, element shortname { text }, element distribution-name { text }, element distribution-edition { text }, element description { private.localizedtext }, element release-notes-url { xsd:anyURI }?, rpm.provides, rpm.obsoletes?, rpm.requires?, rpm.conflicts? } libzypp-17.36.5/zypp/parser/yum/schema/product.rng000066400000000000000000000027761476576476200221720ustar00rootroot00000000000000 add-on base libzypp-17.36.5/zypp/parser/yum/schema/products.rnc000066400000000000000000000005261476576476200223400ustar00rootroot00000000000000include "common-inc.rnc" start = element products { element product { attribute id { text }?, attribute schemeversion { "0" }?, element name { text }, element version { private.evr }, element arch { private.archenum }, element vendor { text }, element summary { text }, element description { text } }+ } libzypp-17.36.5/zypp/parser/yum/schema/products.rng000066400000000000000000000017621476576476200223470ustar00rootroot00000000000000 0 libzypp-17.36.5/zypp/parser/yum/schema/repomd.rnc000066400000000000000000000014721476576476200217640ustar00rootroot00000000000000default namespace = "http://linux.duke.edu/metadata/repo" include "common-inc.rnc" repomd.location = element location { attribute href { xsd:anyURI } } repomd.meta = element checksum { private.checksum }, # Oddity in the wild: a timestamp wiht a decimal element timestamp { private.unixts | xsd:decimal }, element size { private.positive }?, element open-size { private.positive }?, element open-checksum { private.checksum } start = element repomd { element revision { private.unixts }?, element tags { element repo { xsd:anyURI } }?, element data { attribute type { "deltainfo" | "filelists" | "other" | "primary" | "susedata" | "suseinfo" | "updateinfo" | "patches" | "products" | "product" | "patterns" | "pattern" }, ((repomd.meta, repomd.location) | (repomd.location, repomd.meta)) }* } libzypp-17.36.5/zypp/parser/yum/schema/repomd.rng000066400000000000000000000044621476576476200217720ustar00rootroot00000000000000 deltainfo filelists other primary susedata suseinfo updateinfo patches products product patterns pattern libzypp-17.36.5/zypp/parser/yum/schema/rnc2rng000077500000000000000000000001741476576476200212710ustar00rootroot00000000000000#!/bin/bash for i in *.rnc; do g=${i%.rnc}.rng test $i -ot $g && continue echo $i... trang -I rnc -O rng $i $g done libzypp-17.36.5/zypp/parser/yum/schema/rpm-inc.rnc000066400000000000000000000015361476576476200220440ustar00rootroot00000000000000namespace rpm = "http://linux.duke.edu/metadata/rpm" include "common-inc.rnc" rpm.entry = element rpm:entry { attribute pre { "1" }?, attribute kind { "atom" | "message" | "package" | "script" | "product" | "patch" | "pattern" }?, attribute name { text }, (private.evr, attribute flags { "EQ" | "GE" | "LE" | "LT" | "GT" })? } rpm.requires = element rpm:requires { # pre should not be here, but it is in the wild attribute pre { "1" }?, rpm.entry* } rpm.obsoletes = element rpm:obsoletes { rpm.entry+ } rpm.provides = element rpm:provides { rpm.entry* } rpm.recommends = element rpm:recommends { rpm.entry* } rpm.supplements = element rpm:supplements { rpm.entry* } rpm.conflicts = element rpm:conflicts { rpm.entry+ } rpm.enhances = element rpm:enhances { rpm.entry+ } rpm.suggests = element rpm:suggests { rpm.entry* } libzypp-17.36.5/zypp/parser/yum/schema/rpm-inc.rng000066400000000000000000000050301476576476200220410ustar00rootroot00000000000000 1 atom message package script product patch pattern EQ GE LE LT GT 1 libzypp-17.36.5/zypp/parser/yum/schema/susedata.rnc000066400000000000000000000015331476576476200223050ustar00rootroot00000000000000namespace susedata = "http://linux.duke.edu/metadata/susedata" include "common-inc.rnc" ns.susedata = element susedata:susedata { attribute packages { private.nonnegative }, element susedata:package { attribute pkgid { text }, attribute name { text }, attribute arch { private.archenum }, element susedata:version { private.evr }, element susedata:eula { text }?, element susedata:keyword { text }? }* } plain.susedata = element susedata { attribute packages { private.nonnegative }, element package { attribute pkgid { text }, attribute name { text }, attribute arch { private.archenum }, element version { private.evr }, element eula { text }?, element keyword { text }? }* } # Unfortunately there are some susedata files without namespaces in the wild start = (ns.susedata | plain.susedata) libzypp-17.36.5/zypp/parser/yum/schema/susedata.rng000066400000000000000000000037371476576476200223210ustar00rootroot00000000000000 libzypp-17.36.5/zypp/parser/yum/schema/suseinfo.rnc000066400000000000000000000005611476576476200223270ustar00rootroot00000000000000namespace yum = "http://linux.duke.edu/metadata/repo" include "common-inc.rnc" # There is a horribly broken suseinfo variant we have to handle good = element yum:suseinfo { element yum:expire { private.positive } } bad = element suseinfo { element keywords { element k { empty } }, element products { element id { empty } } } start = (good | bad) libzypp-17.36.5/zypp/parser/yum/schema/suseinfo.rng000066400000000000000000000015071476576476200223340ustar00rootroot00000000000000 libzypp-17.36.5/zypp/parser/yum/schema/updateinfo.rnc000066400000000000000000000032141476576476200226300ustar00rootroot00000000000000default namespace = "http://novell.com/package/metadata/suse/updateinfo" include "common-inc.rnc" start = element updates { element update { # Seen missing in the wild attribute from { "maint-coord@suse.de" }?, attribute status { "stable" }, attribute type { "recommended" | "security" | "optional" | "feature" }, attribute version { xsd:string }, element id { text }, element title { text }, # Seen missing in the wild element release { text }?, # Usually with date attribute, but seen in the wild with content instead element issued { (attribute date { private.unixts } | private.unixts) }, # Seen missing in the wild element references { element reference { # Appears to always start with https://bugzilla.novellc.om/show_bug.cgi?id= # if type="bugzilla" and http://cve.mitre.org/cgi-bin/cvename.cgi?name= # if type="cve" attribute href { xsd:anyURI }, attribute id { xsd:string }, attribute title { xsd:string }, attribute type { "bugzilla" | "cve" } }+ }?, element description { text }, element pkglist { element collection { element package { attribute name { xsd:string }, attribute arch { private.archenum }, # not private.evr because "version" and "release" are spelled out attribute epoch { private.nonnegative }?, attribute version { text }?, attribute release { text }?, element filename { text }, element restart_suggested { "1" }?, element reboot_suggested { "1" }?, element relogin_suggested { "1" }? }+ } } }+ } libzypp-17.36.5/zypp/parser/yum/schema/updateinfo.rng000066400000000000000000000106501476576476200226360ustar00rootroot00000000000000 maint-coord@suse.de stable recommended security optional feature bugzilla cve 1 1 1 libzypp-17.36.5/zypp/parser/yum/schema/validate-all000077500000000000000000000075271476576476200222660ustar00rootroot00000000000000#!/bin/bash DEBUG=1 TARGET=/mounts/you #TARGET=/mounts/dist/ibs #TARGET=/mounts/mirror/SuSE/* SCHEMAS=$(dirname "$0") val_jing_compact() { gzip -dcf "$2" | jing -c "$SCHEMAS/$1.rnc" /proc/self/fd/0 } val_jing() { gzip -dcf "$2" | jing "$SCHEMAS/$1.rng" /proc/self/fd/0 } val_xmllint() { gzip -dcf "$2" | xmllint --noout --relaxng "$SCHEMAS/$1.rng" - 2>/dev/null } validate() { [ $DEBUG -gt 4 ] && echo "$2" >&2 if [ ! -f "$2" ]; then echo "File missing: $2" return 5 fi $VAL "$1" "$2" if [ $? -ne 0 ]; then echo "Validation failed: $2 (using $1)" return 2 fi } get_xpath_href() { xpath "$1" "$2" 2>/dev/null | sed -r -e 's/ href="/\n/g;s/$/\n/' \ | sed -e 's/"$//' | tail -n +2 } get_data_type() { get_xpath_href "$1" '/repomd/data[@type="'"$2"'"]/location/@href' } get_patches() { get_xpath_href "$1" '/patches/patch/location/@href' } if [ $(type -p xmllint) ]; then VAL=val_xmllint elif [ $(type -p jing) ]; then VAL=val_jing_compact else echo "No validators found!!" exit 100 fi if [ -z $(type -p xpath) ]; then echo "xpath command not fond" fi find $TARGET -noleaf -name 'repomd.xml' 2>/dev/null | while read FN; do [ $DEBUG -gt 0 ] && echo "$FN" >&2 validate repomd "$FN" # [ $? -eq 0 ] || break D=$(dirname "$FN") BASE=$(dirname "$D") B=$(basename "$D") if [ "$B" != "repodata" ]; then echo "Found $FN not in repodata directory" exit 3 fi get_data_type "$FN" patterns | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate patterns "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" pattern | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate patterns "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" primary | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate primary "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" other | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate other "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" filelists | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate filelists "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" suseinfo | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate suseinfo "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" susedata | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate susedata "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" product | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate product "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" products | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate products "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" updateinfo | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate updateinfo "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" deltainfo | while read UIFN; do [ $DEBUG -gt 1 ] && echo "$UIFN" >&2 validate deltainfo "$BASE/$UIFN" [ $? -eq 0 ] || exit 11 done get_data_type "$FN" patches | while read PFN; do [ $DEBUG -gt 1 ] && echo "$PFN" >&2 validate patches "$BASE/$PFN" [ $? -eq 0 ] || exit 12 get_patches "$BASE/$PFN" | while read PATCH; do [ $DEBUG -gt 2 ] && echo "$PATCH" >&2 validate patch "$BASE/$PATCH" [ $? -eq 0 ] || exit 13 done done done libzypp-17.36.5/zypp/pool/000077500000000000000000000000001476576476200153715ustar00rootroot00000000000000libzypp-17.36.5/zypp/pool/ByIdent.h000066400000000000000000000071121476576476200171010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/pool/ByIdent.h * */ #ifndef ZYPP_POOL_BYIDENT_H #define ZYPP_POOL_BYIDENT_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace pool { ///////////////////////////////////////////////////////////////// /** Main filter selecting PoolItems by \c name and \c kind. */ class ByIdent { public: ByIdent() : _id( 0 ) {} explicit ByIdent( sat::Solvable slv_r ) : _id( makeIdent( slv_r ) ) {} explicit ByIdent( IdString ident_r ) : _id( ident_r.id() ) {} ByIdent( ResKind kind_r, IdString name_r ) : _id( makeIdent( std::move(kind_r), name_r ) ) {} ByIdent( ResKind kind_r, const C_Str & name_r ) : _id( makeIdent( std::move(kind_r), name_r ) ) {} public: bool operator()( sat::Solvable slv_r ) const { return _id >= 0 ? ( slv_r.ident().id() == _id && ! slv_r.isKind( ResKind::srcpackage ) ) : ( slv_r.ident().id() == -_id && slv_r.isKind( ResKind::srcpackage ) ); } bool operator()( const PoolItem & pi_r ) const { return operator()( pi_r.satSolvable() ); } bool operator()( const ResObject::constPtr& p_r ) const { return p_r ? operator()( p_r->satSolvable() ) : !_id; } private: sat::detail::IdType makeIdent( sat::Solvable slv_r ) { return slv_r.isKind( ResKind::srcpackage ) ? -slv_r.ident().id() : slv_r.ident().id(); } sat::detail::IdType makeIdent( const ResKind& kind_r, IdString name_r ) { if ( kind_r == ResKind::package ) return name_r.id(); else if ( kind_r == ResKind::srcpackage ) return -name_r.id(); return IdString( str::form( "%s:%s", kind_r.c_str(), name_r.c_str() ) ).id(); } sat::detail::IdType makeIdent( const ResKind& kind_r, const C_Str & name_r ) { if ( kind_r == ResKind::package ) return IdString( name_r ).id(); else if ( kind_r == ResKind::srcpackage ) return -(IdString( name_r ).id()); return IdString( str::form( "%s:%s", kind_r.c_str(), name_r.c_str() ) ).id(); } public: sat::detail::IdType get() const { return _id; } private: /** negative \c _id for \c srcpackage, as they use the same \c ident * as \c package. */ sat::detail::IdType _id; }; ///////////////////////////////////////////////////////////////// } // namespace pool /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOL_BYIDENT_H libzypp-17.36.5/zypp/pool/PoolImpl.cc000066400000000000000000000041261476576476200174360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/pool/PoolImpl.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// ResPool::EstablishedStates::~EstablishedStates() {} ResPool::EstablishedStates::ChangedPseudoInstalled ResPool::EstablishedStates::changedPseudoInstalled() const { return _pimpl->changedPseudoInstalled(); } /////////////////////////////////////////////////////////////////// namespace pool { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // Class PoolImpl::PoolImpl // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : PoolImpl::PoolImpl // METHOD TYPE : Ctor // PoolImpl::PoolImpl() {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : PoolImpl::~PoolImpl // METHOD TYPE : Dtor // PoolImpl::~PoolImpl() {} ///////////////////////////////////////////////////////////////// } // namespace pool /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/pool/PoolImpl.h000066400000000000000000000417631476576476200173100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/pool/PoolImpl.h * */ #ifndef ZYPP_POOL_POOLIMPL_H #define ZYPP_POOL_POOLIMPL_H #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace resstatus { /** Manipulator for \ref ResStatus::UserLockQueryField. * Field is not public available. It is intended to remember the * initial lock status usually derived from /etc/zypp/locks. So * we are able to detect changes we have to write back on commit. */ struct UserLockQueryManip { /** Set lock and UserLockQuery bit according to \c yesno_r. */ static void setLock( ResStatus & status_r, bool yesno_r ) { status_r.setLock( yesno_r, ResStatus::USER ); status_r.setUserLockQueryMatch( yesno_r ); } /** Update lock and UserLockQuery bit IFF the item gained the bit. */ static void reapplyLock( ResStatus & status_r, bool yesno_r ) { if ( yesno_r && ! status_r.isUserLockQueryMatch() ) { status_r.setLock( yesno_r, ResStatus::USER ); status_r.setUserLockQueryMatch( yesno_r ); } } /** Test whether the lock status differs from the remembered UserLockQuery bit. */ static int diffLock( const ResStatus & status_r ) { bool userLock( status_r.isUserLocked() ); if ( userLock == status_r.isUserLockQueryMatch() ) return 0; return userLock ? 1 : -1; } }; } namespace { inline PoolQuery makeTrivialQuery( IdString ident_r ) { sat::Solvable::SplitIdent ident( ident_r ); PoolQuery q; q.addAttribute( sat::SolvAttr::name, ident.name().asString() ); q.addKind( ident.kind() ); q.setMatchExact(); q.setCaseSensitive(true); return q; } inline bool hardLockQueriesRemove( pool::PoolTraits::HardLockQueries & activeLocks_r, IdString ident_r ) { unsigned s( activeLocks_r.size() ); activeLocks_r.remove( makeTrivialQuery( ident_r ) ); return( activeLocks_r.size() != s ); } inline bool hardLockQueriesAdd( pool::PoolTraits::HardLockQueries & activeLocks_r, IdString ident_r ) { PoolQuery q( makeTrivialQuery( ident_r ) ); for_( it, activeLocks_r.begin(), activeLocks_r.end() ) { if ( *it == q ) return false; } activeLocks_r.push_back( q ); return true; } } /////////////////////////////////////////////////////////////////// namespace solver { namespace detail { void establish( sat::Queue & pseudoItems_r, sat::Queue & pseudoFlags_r ); // in solver/detail/SATResolver.cc } } /////////////////////////////////////////////////////////////////// /// Store initial establish status of pseudo installed items. /// class ResPool::EstablishedStates::Impl { public: Impl() { solver::detail::establish( _pseudoItems, _pseudoFlags ); } /** Return all pseudo installed items whose current state differs from their initial one. */ ResPool::EstablishedStates::ChangedPseudoInstalled changedPseudoInstalled() const { ChangedPseudoInstalled ret; if ( ! _pseudoItems.empty() ) { for ( sat::Queue::size_type i = 0; i < _pseudoItems.size(); ++i ) { PoolItem pi { sat::Solvable(_pseudoItems[i]) }; ResStatus::ValidateValue vorig { validateValue( i ) }; if ( pi.status().validate() != vorig ) ret[pi] = vorig; } } return ret; } private: ResStatus::ValidateValue validateValue( sat::Queue::size_type i ) const { ResStatus::ValidateValue ret { ResStatus::UNDETERMINED }; switch ( _pseudoFlags[i] ) { case 0: ret = ResStatus::BROKEN /*2*/; break; case 1: ret = ResStatus::SATISFIED /*4*/; break; case -1: ret = ResStatus::NONRELEVANT /*6*/; break; } return ret; } private: sat::Queue _pseudoItems; sat::Queue _pseudoFlags; }; /////////////////////////////////////////////////////////////////// namespace pool { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolImpl // /** */ class PoolImpl { friend std::ostream & operator<<( std::ostream & str, const PoolImpl & obj ); public: /** */ using ContainerT = PoolTraits::ItemContainerT; using size_type = PoolTraits::size_type; using const_iterator = PoolTraits::const_iterator; using Id2ItemT = PoolTraits::Id2ItemT; using repository_iterator = PoolTraits::repository_iterator; using SolvableIdType = sat::detail::SolvableIdType; using EstablishedStatesImpl = ResPool::EstablishedStates::Impl; public: /** Default ctor */ PoolImpl(); /** Dtor */ ~PoolImpl(); public: /** convenience. */ const sat::Pool satpool() const { return sat::Pool::instance(); } /** Housekeeping data serial number. */ const SerialNumber & serial() const { return satpool().serial(); } /////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////// public: /** */ bool empty() const { return satpool().solvablesEmpty(); } /** */ size_type size() const { return satpool().solvablesSize(); } const_iterator begin() const { return make_filter_begin( pool::ByPoolItem(), store() ); } const_iterator end() const { return make_filter_end( pool::ByPoolItem(), store() ); } public: /** Return the corresponding \ref PoolItem. * Pool and sat pool should be in sync. Returns an empty * \ref PoolItem if there is no corresponding \ref PoolItem. * \see \ref PoolItem::satSolvable. */ PoolItem find( const sat::Solvable & slv_r ) const { const ContainerT & mystore( store() ); return( slv_r.id() < mystore.size() ? mystore[slv_r.id()] : PoolItem() ); } /////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////// public: /** \name Save and restore state. */ //@{ void SaveState( const ResKind & kind_r ); void RestoreState( const ResKind & kind_r ); //@} /////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////// public: ResPoolProxy proxy( ResPool self ) const { checkSerial(); if ( !_poolProxy ) { _poolProxy.reset( new ResPoolProxy( std::move(self), *this ) ); } return *_poolProxy; } /** True factory for \ref ResPool::EstablishedStates. * Internally we maintain the ResPool::EstablishedStates::Impl * reference shared_ptr. Updated whenever the pool content changes. * On demand hand it out as ResPool::EstablishedStates Impl. */ ResPool::EstablishedStates establishedStates() const { store(); return ResPool::EstablishedStates( _establishedStates ); } public: /** Forward list of Repositories that contribute ResObjects from \ref sat::Pool */ size_type knownRepositoriesSize() const { checkSerial(); return satpool().reposSize(); } repository_iterator knownRepositoriesBegin() const { checkSerial(); return satpool().reposBegin(); } repository_iterator knownRepositoriesEnd() const { checkSerial(); return satpool().reposEnd(); } Repository reposFind( const std::string & alias_r ) const { checkSerial(); return satpool().reposFind( alias_r ); } /////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////// public: using HardLockQueries = PoolTraits::HardLockQueries; using hardLockQueries_iterator = PoolTraits::hardLockQueries_iterator; const HardLockQueries & hardLockQueries() const { return _hardLockQueries; } void reapplyHardLocks() const { // It is assumed that reapplyHardLocks is called after new // items were added to the pool, but the _hardLockQueries // did not change since. Action is to be performed only on // those items that gained the bit in the UserLockQueryField. MIL << "Re-apply " << _hardLockQueries.size() << " HardLockQueries" << endl; PoolQueryResult locked; for_( it, _hardLockQueries.begin(), _hardLockQueries.end() ) { locked += *it; } MIL << "HardLockQueries match " << locked.size() << " Solvables." << endl; for_( it, begin(), end() ) { // NOTE bsc#1225267: While reapplyLock sets but never unsets a lock, // we don't need to care about buddies like in setHardLockQueries. resstatus::UserLockQueryManip::reapplyLock( it->status(), locked.contains( *it ) ); } } void setHardLockQueries( const HardLockQueries & newLocks_r ) { MIL << "Apply " << newLocks_r.size() << " HardLockQueries" << endl; _hardLockQueries = newLocks_r; // now adjust the pool status PoolQueryResult locked; for_( it, _hardLockQueries.begin(), _hardLockQueries.end() ) { locked += *it; } MIL << "HardLockQueries match " << locked.size() << " Solvables." << endl; for_( it, begin(), end() ) { // NOTE bsc#1225267: If the item has a buddy (a shared ResStatus), we lock if // the item or the buddy is locked. Otherwise the item occurring later in the // pool would dictate the status (unsetting a previously set lock). bool yesno = locked.contains( *it ) || ( it->buddy() && locked.contains( PoolItem(it->buddy()) ) ); resstatus::UserLockQueryManip::setLock( it->status(), yesno ); } } bool getHardLockQueries( HardLockQueries & activeLocks_r ) { activeLocks_r = _hardLockQueries; // current queries // Now diff to the pool collecting names only. // Thus added and removed locks are not necessarily // disjoint. Added locks win. typedef std::unordered_set IdentSet; IdentSet addedLocks; IdentSet removedLocks; for_( it, begin(), end() ) { switch ( resstatus::UserLockQueryManip::diffLock( it->status() ) ) { case 0: // unchanged break; case 1: addedLocks.insert( it->satSolvable().ident() ); break; case -1: removedLocks.insert( it->satSolvable().ident() ); break; } } // now the bad part - adjust the queries bool setChanged = false; for_( it, removedLocks.begin(), removedLocks.end() ) { if ( addedLocks.find( *it ) != addedLocks.end() ) continue; // Added locks win if ( hardLockQueriesRemove( activeLocks_r, *it ) && ! setChanged ) setChanged = true; } for_( it, addedLocks.begin(), addedLocks.end() ) { if ( hardLockQueriesAdd( activeLocks_r, *it ) && ! setChanged ) setChanged = true; } return setChanged; } public: const ContainerT & store() const { checkSerial(); if ( _storeDirty ) { sat::Pool pool( satpool() ); bool addedItems = false; bool reusedIDs = _watcherIDs.remember( pool.serialIDs() ); std::list addedProducts; _store.resize( pool.capacity() ); if ( pool.capacity() ) { for ( sat::detail::SolvableIdType i = pool.capacity()-1; i != 0; --i ) { sat::Solvable s( i ); PoolItem & pi( _store[i] ); if ( ! s && pi ) { // the PoolItem got invalidated (e.g unloaded repo) pi = PoolItem(); } else if ( reusedIDs || (s && ! pi) ) { // new PoolItem to add pi = PoolItem::makePoolItem( s ); // the only way to create a new one! // remember products for buddy processing (requires clean store) if ( s.isKind( ResKind::product ) ) addedProducts.push_back( pi ); if ( !addedItems ) addedItems = true; } } } _storeDirty = false; // Now, as the pool is adjusted, .... // .... we check for product buddies. if ( ! addedProducts.empty() ) { for_( it, addedProducts.begin(), addedProducts.end() ) { it->setBuddy( asKind(*it)->referencePackage() ); } } // .... we must reapply those query based hard locks. if ( addedItems ) { reapplyHardLocks(); } // Compute the initial status of Patches etc. if ( !_establishedStates ) _establishedStates.reset( new EstablishedStatesImpl ); } return _store; } const Id2ItemT & id2item () const { checkSerial(); if ( _id2itemDirty ) { store(); _id2item = Id2ItemT( size() ); for_( it, begin(), end() ) { const sat::Solvable &s = (*it)->satSolvable(); sat::detail::IdType id = s.ident().id(); if ( s.isKind( ResKind::srcpackage ) ) id = -id; _id2item.insert( std::make_pair( id, *it ) ); } //INT << _id2item << endl; _id2itemDirty = false; } return _id2item; } /////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////// private: void checkSerial() const { if ( _watcher.remember( serial() ) ) invalidate(); satpool().prepare(); // always ajust dependencies. } void invalidate() const { _storeDirty = true; _id2itemDirty = true; _id2item.clear(); _poolProxy.reset(); _establishedStates.reset(); } private: /** Watch sat pools serial number. */ SerialNumberWatcher _watcher; /** Watch sat pools Serial number of IDs - changes whenever resusePoolIDs==true - ResPool must also invalidate its PoolItems! */ SerialNumberWatcher _watcherIDs; mutable ContainerT _store; mutable DefaultIntegral _storeDirty; mutable Id2ItemT _id2item; mutable DefaultIntegral _id2itemDirty; private: mutable shared_ptr _poolProxy; mutable shared_ptr _establishedStates; private: /** Set of queries that define hardlocks. */ HardLockQueries _hardLockQueries; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace pool /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOL_POOLIMPL_H libzypp-17.36.5/zypp/pool/PoolStats.cc000066400000000000000000000034771476576476200176430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/pool/PoolStats.cc * */ #include //#include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace pool { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const PoolStats & obj ) { str << "ResObjects: " << obj._total; for( PoolStats::KindMap::const_iterator it = obj._perKind.begin(); it != obj._perKind.end(); ++it ) { str << endl << " " << it->first << ":\t" << it->second; } return str; } ///////////////////////////////////////////////////////////////// } // namespace pool /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/pool/PoolStats.h000066400000000000000000000054041476576476200174750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/pool/PoolStats.h * */ #ifndef ZYPP_POOL_POOLSTATS_H #define ZYPP_POOL_POOLSTATS_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace pool { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolStats // /** Functor counting ResObjects per Kind. * \see dumpPoolStats * \code * Total: 2830 * language: 81 * package: 2710 * product: 2 * selection: 36 * system: 1 * \endcode */ struct PoolStats { void operator()( const ResObject::constPtr& ptr ) { ++_total; ++_perKind[ptr->kind()]; } public: using KindMap = std::map>; Counter _total; KindMap _perKind; }; /////////////////////////////////////////////////////////////////// /** \relates PoolStats Stream output */ std::ostream & operator<<( std::ostream & str, const PoolStats & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace pool /////////////////////////////////////////////////////////////////// /** \relates pool::PoolStats Convenience to count and print out the * number of ResObjects per Kind in a container. * Fits container of ResObject::Ptr or PoolItem. */ template std::ostream & dumpPoolStats( std::ostream & str, TIterator begin_r, TIterator end_r ) { pool::PoolStats stats; std::for_each( begin_r, end_r, std::ref(stats) ); return str << stats; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOL_POOLSTATS_H libzypp-17.36.5/zypp/pool/PoolTraits.h000066400000000000000000000064341476576476200176510ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/pool/PoolTraits.h * */ #ifndef ZYPP_POOL_POOLTRAITS_H #define ZYPP_POOL_POOLTRAITS_H #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class PoolQuery; /////////////////////////////////////////////////////////////////// namespace pool { ///////////////////////////////////////////////////////////////// class PoolImpl; /** Pool internal filter skiping invalid/unwanted PoolItems. */ struct ByPoolItem { bool operator()( const PoolItem & pi ) const { return bool(pi); } }; /** std::_Select2nd */ template struct P_Select2nd { typename TPair::second_type& operator()(TPair& __x) const { return __x.second; } const typename TPair::second_type& operator()(const TPair& __x) const { return __x.second; } }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolTraits // /** */ struct PoolTraits { public: using SolvableIdType = sat::detail::SolvableIdType; /** pure items */ using ItemContainerT = std::vector; using item_iterator = ItemContainerT::const_iterator; using const_iterator = filter_iterator; using size_type = ItemContainerT::size_type; /** ident index */ using Id2ItemT = std::unordered_multimap; using Id2ItemValueSelector = P_Select2nd; using byIdent_iterator = transform_iterator; /** list of known Repositories */ using repository_iterator = sat::Pool::RepositoryIterator; /** hard locks from etc/zypp/locks */ using HardLockQueries = std::list; using hardLockQueries_iterator = HardLockQueries::const_iterator; using Impl = PoolImpl; using Impl_Ptr = shared_ptr; using Impl_constPtr = shared_ptr; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace pool /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_POOL_POOLTRAITS_H libzypp-17.36.5/zypp/repo/000077500000000000000000000000001476576476200153655ustar00rootroot00000000000000libzypp-17.36.5/zypp/repo/Applydeltarpm.cc000066400000000000000000000144371476576476200205230ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/source/Applydeltarpm.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace applydeltarpm { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// const Pathname applydeltarpm_prog( "/usr/bin/applydeltarpm" ); const str::regex applydeltarpm_tick ( "([0-9]+) percent finished" ); /****************************************************************** ** ** FUNCTION NAME : applydeltarpm ** FUNCTION TYPE : bool */ bool applydeltarpm( const char *const argv_r[], const Progress & report_r = Progress() ) { ExternalProgram prog( argv_r, ExternalProgram::Stderr_To_Stdout ); str::smatch what; for ( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) { if ( report_r && str::regex_match( line, what, applydeltarpm_tick ) ) { report_r( str::strtonum( what[1] ) ); } else DBG << "Applydeltarpm : " << line; } return( prog.close() == 0 ); } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : haveApplydeltarpm ** FUNCTION TYPE : bool */ bool haveApplydeltarpm() { // To track changes in availability of applydeltarpm. static TriBool _last = indeterminate; PathInfo prog( applydeltarpm_prog ); bool have = prog.isX(); if ( _last == have ) ; // TriBool! 'else' is not '_last != have' else { // _last is 'indeterminate' or '!have' if ( (_last = have) ) MIL << "Found executable " << prog << endl; else WAR << "No executable " << prog << endl; } return ( bool ) _last; } /****************************************************************** ** ** FUNCTION NAME : check ** FUNCTION TYPE : bool */ bool check( const std::string & sequenceinfo_r, bool quick_r ) { if ( ! haveApplydeltarpm() ) return false; const char *const argv[] = { "/usr/bin/applydeltarpm", ( quick_r ? "-C" : "-c" ), "-s", sequenceinfo_r.c_str(), NULL }; return( applydeltarpm( argv ) ); } /****************************************************************** ** ** FUNCTION NAME : check ** FUNCTION TYPE : bool */ bool check( const Pathname & delta_r, bool quick_r ) { if ( ! haveApplydeltarpm() ) return false; const char *const argv[] = { "/usr/bin/applydeltarpm", ( quick_r ? "-C" : "-c" ), delta_r.asString().c_str(), NULL }; return( applydeltarpm( argv ) ); } /****************************************************************** ** ** FUNCTION NAME : provide ** FUNCTION TYPE : bool */ bool provide( const Pathname & delta_r, const Pathname & new_r, const Progress & report_r ) { // cleanup on error AutoDispose guard( new_r, filesystem::unlink ); if ( ! haveApplydeltarpm() ) return false; const char *const argv[] = { "/usr/bin/applydeltarpm", "-p", "-p", // twice to get percent output one per line delta_r.asString().c_str(), new_r.asString().c_str(), NULL }; filesystem::assert_dir( new_r.dirname() ); // bsc#1219442: in case .rpm and .drpm are not in the same directory if ( ! applydeltarpm( argv, report_r ) ) return false; guard.resetDispose(); // no cleanup on success return true; } /****************************************************************** ** ** FUNCTION NAME : provide ** FUNCTION TYPE : bool */ bool provide( const Pathname & old_r, const Pathname & delta_r, const Pathname & new_r, const Progress & report_r ) { // cleanup on error AutoDispose guard( new_r, filesystem::unlink ); if ( ! haveApplydeltarpm() ) return false; const char *const argv[] = { "/usr/bin/applydeltarpm", "-p", "-p", // twice to get percent output one per line "-r", old_r.asString().c_str(), delta_r.asString().c_str(), new_r.asString().c_str(), NULL }; filesystem::assert_dir( new_r.dirname() ); // bsc#1219442: in case .rpm and .drpm are not in the same directory if ( ! applydeltarpm( argv, report_r ) ) return false; guard.resetDispose(); // no cleanup on success return true; } ///////////////////////////////////////////////////////////////// } // namespace applydeltarpm /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/Applydeltarpm.h000066400000000000000000000061141476576476200203560ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/source/Applydeltarpm.h * */ #ifndef ZYPP_SOURCE_APPLYDELTARPM_H #define ZYPP_SOURCE_APPLYDELTARPM_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Namespace wrapping invocations of /usr/bin/applydeltarpm. */ /////////////////////////////////////////////////////////////////// namespace applydeltarpm { ///////////////////////////////////////////////////////////////// /** Test whether an execuatble applydeltarpm program is available. */ bool haveApplydeltarpm(); /** \name Check if reconstruction of rpm is possible. * \see man applydeltarpm */ //@{ /** Check via sequence info. * \see applydeltarpm [-c|-C] -s sequence */ bool check( const std::string & sequenceinfo_r, bool quick_r = false ); /** Check via deltarpm. * \see applydeltarpm [-c|-C] deltarpm */ bool check( const Pathname & delta_r, bool quick_r = false ); /** Quick via check sequence info.*/ inline bool quickcheck( const std::string & sequenceinfo_r ) { return check( sequenceinfo_r, true ); } /** Quick check via deltarpm.*/ inline bool quickcheck( const Pathname & delta_r ) { return check( delta_r, true ); } //@} /** \name Re-create a new rpm from binary delta. * \see man applydeltarpm */ //@{ /** progress reporting */ using Progress = function; /** Apply a binary delta to on-disk data to re-create a new rpm. * \see applydeltarpm deltarpm newrpm */ bool provide( const Pathname & delta_r, const Pathname & new_r, const Progress & report_r = Progress() ); /** Apply a binary delta to an old rpm to re-create a new rpm. * \see applydeltarpm -r oldrpm deltarpm newrpm */ bool provide( const Pathname & old_r, const Pathname & delta_r, const Pathname & new_r, const Progress & report_r = Progress() ); //@} ///////////////////////////////////////////////////////////////// } // namespace applydeltarpm /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SOURCE_APPLYDELTARPM_H libzypp-17.36.5/zypp/repo/DeltaCandidates.cc000066400000000000000000000075531476576476200207170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ extern "C" { #include } #include #include #include #include #include #include using std::endl; using namespace zypp::packagedelta; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /** DeltaCandidates implementation. */ struct DeltaCandidates::Impl { public: Impl() {} Impl( std::list &&repos, std::string &&pkgname = "" ) : repos(std::move(repos)), pkgname(std::move(pkgname)) {} std::list repos; std::string pkgname; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /** \relates DeltaCandidates::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const DeltaCandidates::Impl & obj ) { return str << "DeltaCandidates::Impl"; } /////////////////////////////////////////////////////////////////// // // class DeltaCandidates // /////////////////////////////////////////////////////////////////// DeltaCandidates::DeltaCandidates() : _pimpl( new Impl ) {} DeltaCandidates::DeltaCandidates(std::list repos, std::string pkgname) : _pimpl( new Impl(std::move(repos), std::move(pkgname)) ) {} DeltaCandidates::~DeltaCandidates() {} std::list DeltaCandidates::deltaRpms(const Package::constPtr & package) const { std::list candidates; DBG << "package: " << package << endl; for_( rit, _pimpl->repos.begin(), _pimpl->repos.end() ) { sat::LookupRepoAttr q( sat::SolvAttr::repositoryDeltaInfo, *rit ); for_( it, q.begin(), q.end() ) { if ( _pimpl->pkgname.empty() || it.subFind( sat::SolvAttr(DELTA_PACKAGE_NAME) ).asString() == _pimpl->pkgname ) { DeltaRpm delta( it ); //DBG << "checking delta: " << delta << endl; if ( ! package || ( package->name() == delta.name() && package->edition() == delta.edition() && package->arch() == delta.arch() ) ) { DBG << "got delta candidate: " << delta << endl; candidates.push_back( delta ); } } } } return candidates; } std::ostream & operator<<( std::ostream & str, const DeltaCandidates & obj ) { return str << *obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/DeltaCandidates.h000066400000000000000000000066751476576476200205650ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_REPO_DELTACANDIDATES_H #define ZYPP_REPO_DELTACANDIDATES_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /** * \short Candidate delta and patches for a package * * Basically a container that given N repositories, * gets all patches and deltas from them for a given * package. */ class ZYPP_API DeltaCandidates { friend std::ostream & operator<<( std::ostream & str, const DeltaCandidates & obj ); public: /** Implementation */ struct Impl; public: DeltaCandidates(); DeltaCandidates(const DeltaCandidates &) = default; DeltaCandidates(DeltaCandidates &&) noexcept = default; DeltaCandidates &operator=(const DeltaCandidates &) = default; DeltaCandidates &operator=(DeltaCandidates &&) noexcept = default; /** * \short Creates a candidate calculator * \param repos Set of repositories providing patch and delta packages */ DeltaCandidates( std::list repos, std::string pkgname = "" ); /** Dtor */ ~DeltaCandidates(); std::list deltaRpms(const Package::constPtr & package) const; private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates DeltaCandidates Stream output */ std::ostream & operator<<( std::ostream & str, const DeltaCandidates & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// /** \relates DeltaCandidates Convenient construction. * \todo templated ctor */ template inline DeltaCandidates makeDeltaCandidates( RepoIter begin_r, RepoIter end_r ) { return DeltaCandidates( std::list( begin_r, end_r ) ); } /** \relates DeltaCandidates Convenient construction. * \todo templated ctor */ template inline DeltaCandidates makeDeltaCandidates( const RepoContainer & cont_r ) { return makeDeltaCandidates( cont_r.begin(), cont_r.end() ); } ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REPO_DELTACANDIDATES_H libzypp-17.36.5/zypp/repo/MediaInfoDownloader.cc000066400000000000000000000025371476576476200215550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include "MediaInfoDownloader.h" #include namespace zypp { namespace repo { void downloadMediaInfo( const Pathname &dest_dir, MediaSetAccess &media, const ProgressData::ReceiverFnc & progressrcv ) { Fetcher fetcher; //hardcode the max filesize to 20MB, to prevent unlimited data downloads but this limit will //never be reached in a sane setup fetcher.enqueue( OnMediaLocation("/media.1/media").setOptional(true).setDownloadSize( ByteCount(20, ByteCount::MB ) ) ); fetcher.start( dest_dir, media, progressrcv ); // ready, go! fetcher.reset(); } }// ns repo } // ns zypp libzypp-17.36.5/zypp/repo/MediaInfoDownloader.h000066400000000000000000000026071476576476200214150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_REPO_MEDIAINFO_DOWNLOADER #define ZYPP_REPO_MEDIAINFO_DOWNLOADER #include #include #include #include #include #include namespace zypp { namespace repo { /** * \short Downloads the media info (/media.1) to a local directory * \param dest_dir Destination directory * \param media \ref MediaSetAccess object to some media * \param progress Progress callback function * * \throws Exception on error */ void downloadMediaInfo( const Pathname &dest_dir, MediaSetAccess &media, const ProgressData::ReceiverFnc & progress = ProgressData::ReceiverFnc() ); } // ns repo } // ns zypp #endif libzypp-17.36.5/zypp/repo/PackageDelta.cc000066400000000000000000000102211476576476200201750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/source/PackageDelta.cc * */ #include extern "C" { #include } #include #include #include using std::endl; using std::string; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace packagedelta { ///////////////////////////////////////////////////////////////// DeltaRpm::DeltaRpm( const sat::LookupAttr::iterator& deltaInfo_r ) { if ( deltaInfo_r.inSolvAttr() != sat::SolvAttr::repositoryDeltaInfo ) { INT << "Illegal non-repositoryDeltaInfo iterator: " << deltaInfo_r << endl; return; } _repo = deltaInfo_r.inRepo(); IdString locdir; IdString locname; IdString locevr; IdString locsuffix; IdString seqname; IdString seqevr; std::string seqnum; for_( it, deltaInfo_r.subBegin(), deltaInfo_r.subEnd() ) { switch ( it.inSolvAttr().id() ) { case DELTA_PACKAGE_NAME: _name = it.asString(); break; case DELTA_PACKAGE_EVR: _edition = Edition( it.idStr() ); break; case DELTA_PACKAGE_ARCH: _arch = Arch( it.idStr() ); break; case DELTA_LOCATION_DIR: locdir = it.idStr(); break; case DELTA_LOCATION_NAME: locname = it.idStr(); break; case DELTA_LOCATION_EVR: locevr = it.idStr(); break; case DELTA_LOCATION_SUFFIX: locsuffix = it.idStr(); break; case DELTA_DOWNLOADSIZE: _location.setDownloadSize( ByteCount( it.asUnsignedLL() ) ); break; case DELTA_CHECKSUM: _location.setChecksum( it.asCheckSum() ); break; case DELTA_BASE_EVR: _baseversion.setEdition( Edition( it.idStr() ) ); break; case DELTA_SEQ_NAME: seqname = it.idStr(); break; case DELTA_SEQ_EVR: seqevr = it.idStr(); break; case DELTA_SEQ_NUM: seqnum = it.asString(); break; default: WAR << "Ignore unknown attribute: " << it << endl; } } _location.setLocation( str::form( "%s/%s-%s.%s", locdir.c_str(), locname.c_str(), locevr.c_str(), locsuffix.c_str() ) ); _baseversion.setSequenceinfo( str::form( "%s-%s-%s", seqname.c_str(), seqevr.c_str(), seqnum.c_str() ) ); } std::ostream & operator<<( std::ostream & str, const DeltaRpm & obj ) { return str << "DeltaRpm[" << obj.name() << "-" << obj.edition() << "." << obj.arch() << "](" << obj.location() << '|' << obj.baseversion().edition() << ')'; } ///////////////////////////////////////////////////////////////// } // namespace packagedelta /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/PackageDelta.h000066400000000000000000000074071476576476200200530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/source/PackageDelta.h * */ #ifndef ZYPP_SOURCE_PACKAGEDELTA_H #define ZYPP_SOURCE_PACKAGEDELTA_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace packagedelta { ///////////////////////////////////////////////////////////////// /** \todo cheap copy! (switch to RWCOW) */ class DeltaRpm { public: class BaseVersion { public: BaseVersion() {} public: const Edition & edition() const { return _edition; } const std::string & sequenceinfo() const { return _sequenceinfo; } public: BaseVersion & setEdition( const Edition & val_r ) { _edition = val_r; return *this; } BaseVersion & setSequenceinfo( const std::string & val_r ) { _sequenceinfo = val_r; return *this; } private: Edition _edition; std::string _sequenceinfo; }; public: DeltaRpm() {} DeltaRpm( const sat::LookupAttr::iterator& deltaInfo_r ); public: /** \name Target package ident. */ //@{ const std::string & name() const { return _name; } const Edition & edition() const { return _edition; } const Arch & arch() const { return _arch; } //@} const OnMediaLocation & location() const { return _location; } const BaseVersion & baseversion() const { return _baseversion; } const Repository & repository() const { return _repo; } public: DeltaRpm & setName( const std::string & val_r ) { _name = val_r; return *this; } DeltaRpm & setEdition( const Edition & val_r ) { _edition = val_r; return *this; } DeltaRpm & setArch( const Arch & val_r ) { _arch = val_r; return *this; } DeltaRpm & setLocation( const OnMediaLocation & val_r ) { _location = val_r; return *this; } DeltaRpm & setBaseversion( const BaseVersion & val_r ) { _baseversion = val_r; return *this; } private: std::string _name; Edition _edition; Arch _arch; OnMediaLocation _location; BaseVersion _baseversion; Repository _repo; }; /** \relates DeltaRpm Stream output. */ std::ostream & operator<<( std::ostream & str, const DeltaRpm & obj ); /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace packagedelta /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SOURCE_PACKAGEDELTA_H libzypp-17.36.5/zypp/repo/PackageProvider.cc000066400000000000000000000711631476576476200207520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/PackageProvider.cc * */ #include "zypp/ng/workflows/contextfacade.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace repo { /////////////////////////////////////////////////////////////////// /// \class RpmSigCheckException /// \brief Exception thrown by \ref PackageProviderImpl::rpmSigFileChecker /////////////////////////////////////////////////////////////////// class RpmSigCheckException : public FileCheckException { public: RpmSigCheckException( repo::DownloadResolvableReport::Action action_r, std::string msg_r = "RpmSigCheckException" ) : FileCheckException( std::move(msg_r) ) , _action( action_r ) {} /** Users final decision how to proceed */ const repo::DownloadResolvableReport::Action & action() const { return _action; } private: repo::DownloadResolvableReport::Action _action; }; /////////////////////////////////////////////////////////////////// // class PackageProviderPolicy /////////////////////////////////////////////////////////////////// bool PackageProviderPolicy::queryInstalled( const std::string & name_r, const Edition & ed_r, const Arch & arch_r ) const { if ( _queryInstalledCB ) return _queryInstalledCB( name_r, ed_r, arch_r ); return false; } /////////////////////////////////////////////////////////////////// /// \class PackageProvider::Impl /// \brief PackageProvider implementation interface. /////////////////////////////////////////////////////////////////// struct PackageProvider::Impl : private base::NonCopyable { Impl() {} Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; virtual ~Impl() {} /** Provide the package. * The basic workflow. * \throws Exception. */ virtual ManagedFile providePackage() const = 0; /** Provide the package if it is cached. */ virtual ManagedFile providePackageFromCache() const = 0; /** Whether the package is cached. */ virtual bool isCached() const = 0; }; /////////////////////////////////////////////////////////////////// /// \class PackageProviderImpl /// \brief PackageProvider implementation for \c Package and \c SrcPackage /////////////////////////////////////////////////////////////////// template class PackageProviderImpl : public PackageProvider::Impl { using TPackagePtr = typename TPackage::constPtr; // Package or SrcPackage using UserData = callback::UserData; public: /** Ctor taking the Package to provide. */ PackageProviderImpl( RepoMediaAccess &access_r, TPackagePtr &&package_r, PackageProviderPolicy &&policy_r ) : _policy(std::move( policy_r )) , _package(std::move( package_r )) , _access( access_r ) , _retry(false) {} PackageProviderImpl(const PackageProviderImpl &) = delete; PackageProviderImpl(PackageProviderImpl &&) = delete; PackageProviderImpl &operator=(const PackageProviderImpl &) = delete; PackageProviderImpl &operator=(PackageProviderImpl &&) = delete; ~PackageProviderImpl() override {} public: /** Provide the package. * The basic workflow. * \throws Exception. */ ManagedFile providePackage() const override; /** Provide the package if it is cached. */ ManagedFile providePackageFromCache() const override { ManagedFile ret( doProvidePackageFromCache() ); if ( ! ( ret->empty() || _package->repoInfo().effectiveKeepPackages() ) ) ret.setDispose( filesystem::unlink ); return ret; } /** Whether the package is cached. */ bool isCached() const override { return ! doProvidePackageFromCache()->empty(); } protected: using Base = PackageProviderImpl; using Report = callback::SendReport; /** Lookup the final rpm in cache. * * A cache hit will return a non empty ManagedFile and an empty one on cache miss. * * \note File disposal depending on the repos effectiveKeepPackages setting * are not set here, but in \ref providePackage or \ref providePackageFromCache. */ ManagedFile doProvidePackageFromCache() const { return ManagedFile( _package->cachedLocation() ); } /** Actually provide the final rpm. * Report start/problem/finish and retry loop are hadled by \ref providePackage. * Here you trigger just progress and delta/plugin callbacks as needed. * * Proxy method for progressPackageDownload is provided here. * \code * ProvideFilePolicy policy; * policy.progressCB( bind( &Base::progressPackageDownload, this, _1 ) ); * return _access.provideFile( _package->repoInfo(), loc, policy ); * \endcode * * \note The provided default implementation retrieves the packages default * location. */ virtual ManagedFile doProvidePackage() const { ManagedFile ret; OnMediaLocation loc = _package->location(); ProvideFilePolicy policy; policy.progressCB( bind( &Base::progressPackageDownload, this, _1 ) ); policy.fileChecker( bind( &Base::rpmSigFileChecker, this, _1 ) ); return _access.provideFile( _package->repoInfo(), loc, policy ); } protected: /** Access to the DownloadResolvableReport */ Report & report() const { return *_report; } /** Redirect ProvideFilePolicy package download progress to this. */ bool progressPackageDownload( int value ) const { return report()->progress( value, _package ); } /** \name Validate a rpm packages signature. * * This is the \ref FileChecker passed down to the \ref Fetcher to validate * a provided rpm package. This builtin checker includes the workflow * communicating with the user in case of a problem with the package * signature. * * \throws RpmSigCheckException if the package is not accepted, propagating * the users decision how to proceed (\ref DownloadResolvableReport::Action). * * \note This check is also needed, if the the rpm is built locally by using * delta rpms! \ref \see RpmPackageProvider */ //@{ void rpmSigFileChecker( const Pathname & file_r ) const { RepoInfo info = _package->repoInfo(); if ( info.pkgGpgCheck() ) { UserData userData( "pkgGpgCheck" ); ResObject::constPtr roptr( _package ); // gcc6 needs it more explcit. Has problem deducing userData.set( "ResObject", roptr ); // a type for '_package->asKind()'... /*legacy:*/userData.set( "Package", roptr->asKind() ); userData.set( "Localpath", file_r ); RpmDb::CheckPackageResult res = RpmDb::CHK_NOKEY; while ( res == RpmDb::CHK_NOKEY ) { res = packageSigCheck( file_r, info.pkgGpgCheckIsMandatory(), userData ); // publish the checkresult, even if it is OK. Apps may want to report something... report()->pkgGpgCheck( userData ); if ( res == RpmDb::CHK_NOKEY ) { // if the check fails because we don't know the key // we try to resolv it with gpgkey urls from the // repository, if available target::rpm::RpmHeader::constPtr hr = target::rpm::RpmHeader::readPackage( file_r ); if ( !hr ) { // we did not find any information about the key in the header // this should never happen WAR << "Unable to read package header from " << hr << endl; break; } std::string keyID = hr->signatureKeyID(); if ( keyID.length() > 0 ) { if ( !zyppng::KeyRingWorkflow::provideAndImportKeyFromRepository ( zyppng::SyncContext::defaultContext(), keyID, info ) ) break; } else { // we did not find any information about the key in the header // this should never happen WAR << "packageSigCheck returned without setting providing missing key information" << endl; break; } } } if ( res != RpmDb::CHK_OK ) { if ( userData.hasvalue( "Action" ) ) // pkgGpgCheck report provided an user error action { resolveSignatureErrorAction( userData.get( "Action", repo::DownloadResolvableReport::ABORT ) ); } else if ( userData.haskey( "Action" ) ) // pkgGpgCheck requests the default problem report (wo. details) { defaultReportSignatureError( res ); } else // no advice from user => usedefaults { switch ( res ) { case RpmDb::CHK_OK: // Signature is OK break; case RpmDb::CHK_NOKEY: // Public key is unavailable case RpmDb::CHK_NOTFOUND: // Signature is unknown type case RpmDb::CHK_FAIL: // Signature does not verify case RpmDb::CHK_NOTTRUSTED: // Signature is OK, but key is not trusted case RpmDb::CHK_ERROR: // File does not exist or can't be opened case RpmDb::CHK_NOSIG: // File is unsigned default: // report problem (w. details), throw if to abort, else retry/ignore defaultReportSignatureError( res, str::Str() << userData.get( "CheckPackageDetail" ) ); break; } } } } } using RpmDb = target::rpm::RpmDb; /** Actual rpm package signature check. */ RpmDb::CheckPackageResult packageSigCheck( const Pathname & path_r, bool isMandatory_r, UserData & userData ) const { if ( !_target ) _target = getZYpp()->getTarget(); RpmDb::CheckPackageResult ret = RpmDb::CHK_ERROR; RpmDb::CheckPackageDetail detail; if ( _target ) { ret = _target->rpmDb().checkPackageSignature( path_r, detail ); if ( ret == RpmDb::CHK_NOSIG && !isMandatory_r ) { WAR << "Relax CHK_NOSIG: Config says unsigned packages are OK" << endl; ret = RpmDb::CHK_OK; } } else detail.push_back( RpmDb::CheckPackageDetail::value_type( ret, "OOps. Target is not initialized!" ) ); userData.set( "CheckPackageResult", ret ); userData.set( "CheckPackageDetail", std::move(detail) ); return ret; } /** React on signature verification error user action. * \note: IGNORE == accept insecure file (no SkipRequestException!) */ void resolveSignatureErrorAction( repo::DownloadResolvableReport::Action action_r ) const { switch ( action_r ) { case repo::DownloadResolvableReport::IGNORE: WAR << _package->asUserString() << ": " << "User requested to accept insecure file" << endl; break; default: case repo::DownloadResolvableReport::RETRY: case repo::DownloadResolvableReport::ABORT: ZYPP_THROW(RpmSigCheckException(action_r,"Signature verification failed")); break; } } /** Default signature verification error handling. */ void defaultReportSignatureError( RpmDb::CheckPackageResult ret, const std::string & detail_r = std::string() ) const { str::Str msg; msg << _package->asUserString() << ": " << _("Signature verification failed") << " " << ret; if ( ! detail_r.empty() ) msg << "\n" << detail_r; resolveSignatureErrorAction( report()->problem( _package, repo::DownloadResolvableReport::INVALID, msg.str() ) ); } //@} protected: PackageProviderPolicy _policy; TPackagePtr _package; RepoMediaAccess & _access; private: using ScopedGuard = shared_ptr; ScopedGuard newReport() const { _report.reset( new Report ); // Use a custom deleter calling _report.reset() when guard goes out of // scope (cast required as reset is overloaded). We want report to end // when leaving providePackage and not wait for *this going out of scope. return shared_ptr( static_cast(0), std::bind( std::mem_fn(static_cast::*)()>(&shared_ptr::reset)), std::ref(_report) ) ); } mutable bool _retry; mutable shared_ptr _report; mutable Target_Ptr _target; }; /////////////////////////////////////////////////////////////////// template ManagedFile PackageProviderImpl::providePackage() const { ScopedGuard guardReport( newReport() ); // check for cache hit: ManagedFile ret( providePackageFromCache() ); if ( ! ret->empty() ) { MIL << "provided Package from cache " << _package << " at " << ret << endl; report()->infoInCache( _package, ret ); return ret; // <-- cache hit } // HERE: cache misss, check toplevel cache or do download: RepoInfo info = _package->repoInfo(); // Check toplevel cache { RepoManagerOptions topCache; if ( info.packagesPath().dirname() != topCache.repoPackagesCachePath ) // not using toplevel cache { const OnMediaLocation & loc( _package->location() ); if ( ! loc.checksum().empty() ) // no cache hit without checksum { PathInfo pi( topCache.repoPackagesCachePath / info.packagesPath().basename() / info.path() / loc.filename() ); if ( pi.isExist() && loc.checksum() == CheckSum( loc.checksum().type(), std::ifstream( pi.c_str() ) ) ) { report()->start( _package, pi.path().asFileUrl() ); const Pathname & dest( info.packagesPath() / info.path() / loc.filename() ); if ( filesystem::assert_dir( dest.dirname() ) == 0 && filesystem::hardlinkCopy( pi.path(), dest ) == 0 ) { ret = ManagedFile( dest ); if ( ! info.effectiveKeepPackages() ) ret.setDispose( filesystem::unlink ); MIL << "provided Package from toplevel cache " << _package << " at " << ret << endl; report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() ); return ret; // <-- toplevel cache hit } } } } } // FIXME we only support the first url for now. if ( info.baseUrlsEmpty() ) ZYPP_THROW(Exception("No url in repository.")); MIL << "provide Package " << _package << endl; Url url = * info.baseUrlsBegin(); try { do { _retry = false; if ( ! ret->empty() ) { ret.setDispose( filesystem::unlink ); ret.reset(); } report()->start( _package, url ); try { ret = doProvidePackage(); } catch ( const UserRequestException & excpt ) { ERR << "Failed to provide Package " << _package << endl; if ( ! _retry ) ZYPP_RETHROW( excpt ); } catch ( const RpmSigCheckException & excpt ) { ERR << "Failed to provide Package " << _package << endl; if ( ! _retry ) { // Signature verification error was already reported by the // rpmSigFileChecker. Just handle the users action decision: switch ( excpt.action() ) { case repo::DownloadResolvableReport::RETRY: _retry = true; break; case repo::DownloadResolvableReport::IGNORE: ZYPP_THROW(SkipRequestException("User requested skip of corrupted file")); break; default: case repo::DownloadResolvableReport::ABORT: ZYPP_THROW(AbortRequestException("User requested to abort")); break; } } } catch ( const FileCheckException & excpt ) { ERR << "Failed to provide Package " << _package << endl; if ( ! _retry ) { const std::string & package_str = _package->asUserString(); // TranslatorExplanation %s = package being checked for integrity switch ( report()->problem( _package, repo::DownloadResolvableReport::INVALID, str::form(_("Package %s seems to be corrupted during transfer. Do you want to retry retrieval?"), package_str.c_str() ) ) ) { case repo::DownloadResolvableReport::RETRY: _retry = true; break; case repo::DownloadResolvableReport::IGNORE: ZYPP_THROW(SkipRequestException("User requested skip of corrupted file")); break; default: case repo::DownloadResolvableReport::ABORT: ZYPP_THROW(AbortRequestException("User requested to abort")); break; } } } catch ( const Exception & excpt ) { ERR << "Failed to provide Package " << _package << endl; if ( ! _retry ) { // Aything else gets reported const std::string & package_str = _package->asUserString(); // TranslatorExplanation %s = name of the package being processed. std::string detail_str( str::form(_("Failed to provide Package %s. Do you want to retry retrieval?"), package_str.c_str() ) ); detail_str += str::form( "\n\n%s", excpt.asUserHistory().c_str() ); switch ( report()->problem( _package, repo::DownloadResolvableReport::IO, detail_str.c_str() ) ) { case repo::DownloadResolvableReport::RETRY: _retry = true; break; case repo::DownloadResolvableReport::IGNORE: ZYPP_THROW(SkipRequestException("User requested skip of file", excpt)); break; default: case repo::DownloadResolvableReport::ABORT: ZYPP_THROW(AbortRequestException("User requested to abort", excpt)); break; } } } } while ( _retry ); } catch(...){ // bsc#1045735: Be sure no invalid files stay in the cache! if ( ! ret->empty() ) ret.setDispose( filesystem::unlink ); throw; } report()->finish( _package, repo::DownloadResolvableReport::NO_ERROR, std::string() ); MIL << "provided Package " << _package << " at " << ret << endl; return ret; } /////////////////////////////////////////////////////////////////// /// \class RpmPackageProvider /// \brief RPM PackageProvider implementation (with deltarpm processing). /////////////////////////////////////////////////////////////////// class RpmPackageProvider : public PackageProviderImpl { public: RpmPackageProvider( RepoMediaAccess & access_r, Package::constPtr &&package_r, DeltaCandidates &&deltas_r, PackageProviderPolicy &&policy_r ) : PackageProviderImpl( access_r, std::move(package_r), std::move(policy_r) ) , _deltas( std::move(deltas_r) ) {} protected: ManagedFile doProvidePackage() const override; private: using DeltaRpm = packagedelta::DeltaRpm; ManagedFile tryDelta( const DeltaRpm & delta_r ) const; bool progressDeltaDownload( int value ) const { return report()->progressDeltaDownload( value ); } void progressDeltaApply( int value ) const { return report()->progressDeltaApply( value ); } bool queryInstalled( const Edition & ed_r = Edition() ) const { return _policy.queryInstalled( _package->name(), ed_r, _package->arch() ); } private: DeltaCandidates _deltas; }; /////////////////////////////////////////////////////////////////// ManagedFile RpmPackageProvider::doProvidePackage() const { // check whether to process patch/delta rpms // FIXME we only check the first url for now. if ( ZConfig::instance().download_use_deltarpm() && ( _package->repoInfo().url().schemeIsDownloading() || ZConfig::instance().download_use_deltarpm_always() ) ) { std::list deltaRpms; _deltas.deltaRpms( _package ).swap( deltaRpms ); if ( ! deltaRpms.empty() && queryInstalled() && applydeltarpm::haveApplydeltarpm() ) { for_( it, deltaRpms.begin(), deltaRpms.end()) { DBG << "tryDelta " << *it << endl; ManagedFile ret( tryDelta( *it ) ); if ( ! ret->empty() ) return ret; } } } // no patch/delta -> provide full package return Base::doProvidePackage(); } ManagedFile RpmPackageProvider::tryDelta( const DeltaRpm & delta_r ) const { if ( delta_r.baseversion().edition() != Edition::noedition && ! queryInstalled( delta_r.baseversion().edition() ) ) return ManagedFile(); if ( ! applydeltarpm::quickcheck( delta_r.baseversion().sequenceinfo() ) ) return ManagedFile(); report()->startDeltaDownload( delta_r.location().filename(), delta_r.location().downloadSize() ); ManagedFile delta; try { ProvideFilePolicy policy; policy.progressCB( bind( &RpmPackageProvider::progressDeltaDownload, this, _1 ) ); delta = _access.provideFile( delta_r.repository().info(), delta_r.location(), policy ); } catch ( const Exception & excpt ) { report()->problemDeltaDownload( excpt.asUserHistory() ); return ManagedFile(); } report()->finishDeltaDownload(); report()->startDeltaApply( delta ); if ( ! applydeltarpm::check( delta_r.baseversion().sequenceinfo() ) ) { report()->problemDeltaApply( _("applydeltarpm check failed.") ); return ManagedFile(); } // Build the package Pathname cachedest( _package->repoInfo().packagesPath() / _package->repoInfo().path() / _package->location().filename() ); Pathname builddest( cachedest.extend( ".drpm" ) ); if ( ! applydeltarpm::provide( delta, builddest, bind( &RpmPackageProvider::progressDeltaApply, this, _1 ) ) ) { report()->problemDeltaApply( _("applydeltarpm failed.") ); return ManagedFile(); } ManagedFile builddestCleanup( builddest, filesystem::unlink ); report()->finishDeltaApply(); // Check and move it into the cache // Here the rpm itself is ready. If the packages sigcheck fails, it // makes no sense to return a ManagedFile() and fallback to download the // full rpm. It won't be different. So let the exceptions escape... rpmSigFileChecker( builddest ); if ( filesystem::hardlinkCopy( builddest, cachedest ) != 0 ) ZYPP_THROW( Exception( str::Str() << "Can't hardlink/copy " << builddest << " to " << cachedest ) ); return ManagedFile( cachedest, filesystem::unlink ); } /////////////////////////////////////////////////////////////////// // class PackageProvider /////////////////////////////////////////////////////////////////// namespace factory { inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r, DeltaCandidates &&deltas_r, PackageProviderPolicy &&policy_r ) { if ( pi_r.isKind() ) return new RpmPackageProvider( access_r, pi_r->asKind(), std::move(deltas_r), std::move(policy_r) ); else if ( pi_r.isKind() ) return new PackageProviderImpl( access_r, pi_r->asKind(), std::move(policy_r) ); else ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) ); } inline PackageProvider::Impl * make( RepoMediaAccess & access_r, const PoolItem & pi_r, PackageProviderPolicy &&policy_r ) { if ( pi_r.isKind() ) return new PackageProviderImpl( access_r, pi_r->asKind(), std::move(policy_r) ); else if ( pi_r.isKind() ) return new PackageProviderImpl( access_r, pi_r->asKind(), std::move(policy_r) ); else ZYPP_THROW( Exception( str::Str() << "Don't know how to cache non-package " << pi_r.asUserString() ) ); } inline PackageProvider::Impl * make( RepoMediaAccess & access_r, Package::constPtr &&package_r, DeltaCandidates &&deltas_r, PackageProviderPolicy &&policy_r ) { return new RpmPackageProvider( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ); } } // namespace factory /////////////////////////////////////////////////////////////////// PackageProvider::PackageProvider( RepoMediaAccess & access_r, const PoolItem & pi_r, DeltaCandidates deltas_r, PackageProviderPolicy policy_r ) : _pimpl( factory::make( access_r, pi_r, std::move(deltas_r), std::move(policy_r) ) ) {} PackageProvider::PackageProvider( RepoMediaAccess & access_r, const PoolItem & pi_r, PackageProviderPolicy policy_r ) : _pimpl( factory::make( access_r, pi_r, std::move(policy_r) ) ) {} /* legacy */ PackageProvider::PackageProvider( RepoMediaAccess & access_r, Package::constPtr package_r, DeltaCandidates deltas_r, PackageProviderPolicy policy_r ) : _pimpl( factory::make( access_r, std::move(package_r), std::move(deltas_r), std::move(policy_r) ) ) {} PackageProvider::~PackageProvider() {} ManagedFile PackageProvider::providePackage() const { return _pimpl->providePackage(); } ManagedFile PackageProvider::providePackageFromCache() const { return _pimpl->providePackageFromCache(); } bool PackageProvider::isCached() const { return _pimpl->isCached(); } } // namespace repo /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/PackageProvider.h000066400000000000000000000100371476576476200206050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/PackageProvider.h * */ #ifndef ZYPP_REPO_PACKAGEPROVIDER_H #define ZYPP_REPO_PACKAGEPROVIDER_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace repo { /////////////////////////////////////////////////////////////////// /// \class PackageProviderPolicy /// \brief Policies and options for \ref PackageProvider /////////////////////////////////////////////////////////////////// class ZYPP_API PackageProviderPolicy { public: /** Get installed Editions callback signature. */ typedef function QueryInstalledCB; /** Set callback. */ PackageProviderPolicy & queryInstalledCB( QueryInstalledCB queryInstalledCB_r ) { _queryInstalledCB = queryInstalledCB_r; return *this; } /** Evaluate callback. */ bool queryInstalled( const std::string & name_r, const Edition & ed_r, const Arch & arch_r ) const; private: QueryInstalledCB _queryInstalledCB; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class PackageProvider /// \brief Provide a package from a Repo. /// /// Use available deltarpm if apropriate. /////////////////////////////////////////////////////////////////// class ZYPP_API PackageProvider { public: /** Ctor taking the package to provide. * \throws Exception If pi_r refers to neither a \c Package nor a \c SrcPackage. */ PackageProvider( RepoMediaAccess & access, const PoolItem & pi_r, PackageProviderPolicy policy_r = PackageProviderPolicy() ); /** \overload Ctor taking additional hint to deltarpms (not used for SrcPackages) * \throws Exception If pi_r refers to neither a \c Package nor a \c SrcPackage. */ PackageProvider( RepoMediaAccess & access, const PoolItem & pi_r, DeltaCandidates deltas, PackageProviderPolicy policy_r = PackageProviderPolicy() ); /** Legacy Ctor taking a \c Package::constPtr to provide. */ PackageProvider( RepoMediaAccess & access, Package::constPtr package, DeltaCandidates deltas, PackageProviderPolicy policy_r = PackageProviderPolicy() ); ~PackageProvider(); public: /** Provide the package. * \throws Exception. */ ManagedFile providePackage() const; /** Provide the package if it is cached. */ ManagedFile providePackageFromCache() const; /** Whether the package is cached. */ bool isCached() const; public: struct Impl; ///< Implementation class. private: RW_pointer _pimpl; ///< Pointer to implementation. }; /////////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SOURCE_PACKAGEPROVIDER_H libzypp-17.36.5/zypp/repo/PluginRepoverification.cc000066400000000000000000000270721476576476200223730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/PluginRepoverification.cc */ #include #include #include #include "PluginRepoverification.h" #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp_private { using namespace zypp; /////////////////////////////////////////////////////////////////// namespace repo { struct Monitor { /** Report a line of output (without trailing NL) otherwise a life ping on timeout. */ using Callback = std::function)>; Monitor( io::timeout_type timeout_r = io::no_timeout ) : _timeout { timeout_r } {} int operator()( ExternalProgram & prog_r, Callback cb_r = Callback() ) { std::string line; bool goOn = true; prog_r.setBlocking( false ); FILE * inputfile = prog_r.inputFile(); do { const auto &readResult = io::receiveUpto( inputfile, '\n', _timeout ); line += readResult.second; // we always may have received a partial line goOn = true; switch ( readResult.first ) { case io::ReceiveUpToResult::Success: goOn = reportLine( line, cb_r ); line.clear(); // in case the CB did not move it out break; case io::ReceiveUpToResult::Timeout: goOn = reportTimeout( cb_r ); break; case io::ReceiveUpToResult::Error: case io::ReceiveUpToResult::EndOfFile: reportFinalLineUnlessEmpty( line, cb_r ); line.clear(); // in case the CB did not move it out goOn = false; break; } } while ( goOn ); if ( prog_r.running() ) { WAR << "ABORT by callback: pid " << prog_r.getpid() << endl; prog_r.kill(); } return prog_r.close(); } private: bool reportLine( std::string & line_r, Callback & cb_r ) { if ( cb_r ) { if ( not line_r.empty() && line_r.back() == '\n' ) line_r.pop_back(); return cb_r( std::move(line_r) ); } return true; } bool reportTimeout( Callback & cb_r ) { return cb_r ? cb_r( std::nullopt ) : true; } bool reportFinalLineUnlessEmpty( std::string & line_r, Callback & cb_r ) { if ( cb_r && not line_r.empty() ) // implies an incomplete line (no NL) cb_r( std::move(line_r) ); return false; } private: io::timeout_type _timeout = io::no_timeout; }; /////////////////////////////////////////////////////////////////// /// \class PluginRepoverification::Checker::Impl /// \brief PluginRepoverification::Checker data storage. /////////////////////////////////////////////////////////////////// class PluginRepoverification::Checker::Impl { public: Impl( RW_pointer parent_r, Pathname &&sigpathLocal_r, Pathname &&keypathLocal_r, RepoInfo &&repo_r ) : _parent { std::move( parent_r ) } , _sigpathLocal { std::move(sigpathLocal_r) } , _keypathLocal { std::move(keypathLocal_r) } , _repoinfo { std::move(repo_r) } {} RW_pointer _parent; Pathname _sigpathLocal; Pathname _keypathLocal; RepoInfo _repoinfo; }; /////////////////////////////////////////////////////////////////// /// \class PluginRepoverification::Impl /// \brief PluginRepoverification implementation. /////////////////////////////////////////////////////////////////// class PluginRepoverification::Impl { friend std::ostream & operator<<( std::ostream & str, const Impl & obj ); friend std::ostream & dumpOn( std::ostream & str, const Impl & obj ); public: Impl() {} Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; Impl(Pathname &&plugindir_r, Pathname &&chroot_r) : _watchPlugindir{std::move(plugindir_r), WatchFile::NO_INIT}, _chroot{std::move(chroot_r)} {} ~Impl() {} bool isNeeded() const { return _isNeeded; } bool checkIfNeeded() { if ( _watchPlugindir.hasChanged() ) { _isNeeded = false; // check for at least one executable plugin inside.. filesystem::dirForEach( plugindir(), [this]( const Pathname & dir_r, const char *const name_r ) -> bool { PathInfo pi ( dir_r/name_r ); if ( pi.isFile() && pi.userMayRX() ) { this->_isNeeded = true; return false; } return true; } ); } return _isNeeded; } void verifyWorkflow( const Pathname & file_r, RW_pointer datap_r ) const { // Execute the plugins. They will throw if something is wrong... filesystem::dirForEach( plugindir(), [&,this]( const Pathname & dir_r, const char *const name_r ) -> bool { PathInfo pi ( dir_r/name_r ); if ( pi.isFile() && pi.userMayRX() ) this->pluginVerify( name_r, file_r, *datap_r ); return true; } ); } private: void pluginVerify( std::string plugin_r, const Pathname & file_r, const PluginRepoverification::Checker::Impl & data_r ) const { Pathname pluginPath { plugindir()/plugin_r }; if ( not _chroot.emptyOrRoot() ) { pluginPath = Pathname::stripprefix( _chroot, pluginPath ); // we need to make sure the files are available inside the chroot INT << "chroot PluginRepoverification does not yet work." << endl; return; } ExternalProgram::Arguments args; args.push_back( pluginPath.asString() ); /// NOTE: Update plugin-repoverification page if new args are supplied args.push_back( "--file" ); args.push_back( file_r.asString() ); args.push_back( "--fsig" ); args.push_back( data_r._sigpathLocal.asString() ); args.push_back( "--fkey" ); args.push_back( data_r._keypathLocal.asString() ); args.push_back( "--ralias" ); args.push_back( data_r._repoinfo.alias() ); ExternalProgram cmd { args, ExternalProgram::Stderr_To_Stdout, false, -1, false, _chroot }; // draft: maybe integrate jobReport into Monitor Monitor monitor( 800 ); UserDataJobReport jobReport { "cmdout", "monitor" }; jobReport.set( "CmdId", unsigned(cmd.getpid()) ); jobReport.set( "CmdTag", str::numstring( cmd.getpid() ) ); jobReport.set( "CmdName", "Repoverification plugin "+plugin_r ); jobReport.set( "RepoInfo", data_r._repoinfo ); std::optional buffer; // Send output in exception is no one is listening jobReport.debug( "?" ); // someone listening? if ( not jobReport.haskey( "!" ) ) // no buffer = std::ostringstream(); int ret = monitor( cmd, [&jobReport,&buffer,&cmd]( std::optional line_r )->bool { if ( line_r ) { DBG << "["< " << *line_r << endl; if ( buffer ) (*buffer) << *line_r << endl; return jobReport.data( *line_r ); } else { return jobReport.debug( "ping" ); } return true; } ); if ( ret ) { const std::string & msg { str::Format( "Metadata rejected by '%1%' plugin (returned %2%)" ) % plugin_r % ret }; ExceptionType excp { msg }; if ( buffer ) excp.addHistory( buffer->str() ); excp.addHistory( str::Format( "%1%%2% returned %3%" ) % (_chroot.emptyOrRoot()?"":"("+_chroot.asString()+")") % pluginPath % ret ); ZYPP_THROW( excp ); } } const Pathname & plugindir() const { return _watchPlugindir.path(); } private: WatchFile _watchPlugindir; Pathname _chroot; bool _isNeeded = false; }; /** \relates PluginRepoverification::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const PluginRepoverification::Impl & obj ) { return str << "PluginRepoverification(" << obj.plugindir() << ", " << obj.isNeeded() << ")"; } /** \relates PluginRepoverification::Impl Verbose stream output */ inline std::ostream & dumpOn( std::ostream & str, const PluginRepoverification::Impl & obj ) { return str << obj; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PluginRepoverification // /////////////////////////////////////////////////////////////////// PluginRepoverification::PluginRepoverification() : _pimpl( new Impl ) {} PluginRepoverification::PluginRepoverification( Pathname plugindir_r, Pathname chroot_r ) : _pimpl( new Impl( std::move(plugindir_r), std::move(chroot_r) ) ) {} PluginRepoverification::~PluginRepoverification() {} bool PluginRepoverification::isNeeded() const { return _pimpl->isNeeded(); } bool PluginRepoverification::checkIfNeeded() { return _pimpl->checkIfNeeded(); } PluginRepoverification::Checker PluginRepoverification::getChecker( Pathname sigpathLocal_r, Pathname keypathLocal_r, RepoInfo repo_r ) const { return Checker( new Checker::Impl( _pimpl, std::move(sigpathLocal_r), std::move(keypathLocal_r), std::move(repo_r) ) ); } std::ostream & operator<<( std::ostream & str, const PluginRepoverification & obj ) { return str << *obj._pimpl; } std::ostream & dumpOn( std::ostream & str, const PluginRepoverification & obj ) { return dumpOn( str, *obj._pimpl ); } bool operator==( const PluginRepoverification & lhs, const PluginRepoverification & rhs ) { return lhs._pimpl == rhs._pimpl; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : PluginRepoverification::Checker // /////////////////////////////////////////////////////////////////// PluginRepoverification::Checker::Checker( Impl* pimpl_r ) : _pimpl { pimpl_r } {} PluginRepoverification::Checker::~Checker() {} void PluginRepoverification::Checker::operator()( const Pathname & file_r ) const { _pimpl->_parent->verifyWorkflow( file_r, _pimpl ); } } // namespace repo /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/PluginRepoverification.h000066400000000000000000000121571476576476200222330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/PluginRepoverification.h */ #ifndef ZYPP_REPO_PLUGINREPOVERIFICATION_H #define ZYPP_REPO_PLUGINREPOVERIFICATION_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp_private { using namespace zypp; /////////////////////////////////////////////////////////////////// namespace repo { /////////////////////////////////////////////////////////////////// /// \class PluginRepoverificationCheckException /// \brief Exceptiontype thrown if a plugins verification fails. /////////////////////////////////////////////////////////////////// class ZYPP_API PluginRepoverificationCheckException : public FileCheckException { public: PluginRepoverificationCheckException( const std::string &msg ) : FileCheckException(msg) {} }; /////////////////////////////////////////////////////////////////// /// \class PluginRepoverification /// \brief Repository metadata verification beyond GPG. /// /// Implements the repoverification plugin setup and workflow. Also /// serves as factory for a file \ref FileChecker that can be passed /// to e.g. \ref repo::Downloader when fetching the repos master index file. /// /// If a root dir is defined, plugin scripts will be executed chrooted. /// /// \see \ref plugin-repoverification for more details. /////////////////////////////////////////////////////////////////// class PluginRepoverification { friend std::ostream & operator<<( std::ostream & str, const PluginRepoverification & obj ); friend std::ostream & dumpOn( std::ostream & str, const PluginRepoverification & obj ); friend bool operator==( const PluginRepoverification & lhs, const PluginRepoverification & rhs ); using ExceptionType = PluginRepoverificationCheckException; public: /** Default ctor, do nothing */ PluginRepoverification(); /** Ctor monitoring a \a plugindir_r and optional chroot for plugin execution */ PluginRepoverification( Pathname plugindir_r, Pathname chroot_r = Pathname() ); /** Dtor */ ~PluginRepoverification(); public: /** Whether the last \ref checkIfNeeded found plugins to execute at all. */ bool isNeeded() const; /** Checks whether there are plugins to execute at all. */ bool checkIfNeeded(); public: /////////////////////////////////////////////////////////////////// /// \class Checker /// \brief \ref FileChecker checking all repoverification plugins. /////////////////////////////////////////////////////////////////// class Checker { public: ~Checker(); /** Check the downloaded master index file. * \throws PluginRepoverificationCheckException If a plugins verification fails. */ void operator()( const Pathname & file_r ) const; public: class Impl; ///< Implementation class. private: friend class PluginRepoverification; ///< Factory for \ref Checker Checker( Impl* pimpl ); private: RW_pointer _pimpl; ///< Pointer to implementation (ref). }; /////////////////////////////////////////////////////////////////// /** \ref FileChecker factory remembering the location of the master index files GPG signature and key. */ Checker getChecker( Pathname sigpathLocal_r, Pathname keypathLocal_r, RepoInfo repo_r ) const; public: class Impl; ///< Implementation class. private: RW_pointer _pimpl; ///< Pointer to implementation (ref). }; /** \relates PluginRepoverification Stream output */ std::ostream & operator<<( std::ostream & str, const PluginRepoverification & obj ); /** \relates PluginRepoverification Verbose stream output */ std::ostream & dumOn( std::ostream & str, const PluginRepoverification & obj ); /** \relates PluginRepoverification */ bool operator==( const PluginRepoverification & lhs, const PluginRepoverification & rhs ); /** \relates PluginRepoverification */ inline bool operator!=( const PluginRepoverification & lhs, const PluginRepoverification & rhs ) { return !( lhs == rhs ); } } // namespace repo /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REPO_PLUGINREPOVERIFICATION_H libzypp-17.36.5/zypp/repo/PluginServices.cc000066400000000000000000000063641476576476200206470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include using std::endl; using std::stringstream; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// class PluginServices::Impl { public: static void loadServices( const Pathname &path, const PluginServices::ProcessService &callback ); }; void PluginServices::Impl::loadServices( const Pathname &path, const PluginServices::ProcessService & callback/*, const ProgressData::ReceiverFnc &progress*/ ) { std::list entries; if (PathInfo(path).isExist()) { if ( filesystem::readdir( entries, path, false ) != 0 ) { // TranslatorExplanation '%s' is a pathname ZYPP_THROW(Exception(str::form(_("Failed to read directory '%s'"), path.c_str()))); } //str::regex allowedServiceExt("^\\.service(_[0-9]+)?$"); for_(it, entries.begin(), entries.end() ) { ServiceInfo service_info; service_info.setAlias((*it).basename()); Url url; url.setPathName((*it).asString()); url.setScheme("file"); service_info.setUrl(url); service_info.setType(ServiceType::PLUGIN); service_info.setAutorefresh( true ); DBG << "Plugin Service: " << service_info << endl; callback(service_info); } } } PluginServices::PluginServices( const Pathname &path, const ProcessService & callback/*, const ProgressData::ReceiverFnc &progress */) { Impl::loadServices(path, callback/*, progress*/); } PluginServices::~PluginServices() {} std::ostream & operator<<( std::ostream & str, const PluginServices & obj ) { return str; } ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/PluginServices.h000066400000000000000000000044541476576476200205070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_REPO_PLUGINSERVICES_H #define ZYPP_REPO_PLUGINSERVICES_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class ServiceInfo; /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// class PluginServices { friend std::ostream & operator<<( std::ostream & str, const PluginServices& obj ); public: /** * Callback definition. * First parameter is a \ref ServiceInfo object with the resource. * * Return false from the callback to get a \ref AbortRequestException * to be thrown and the processing to be cancelled. */ using ProcessService = function; /** Implementation */ class Impl; public: PluginServices(const Pathname &path, const ProcessService & callback); /** * Dtor */ ~PluginServices(); }; /////////////////////////////////////////////////////////////////// /** \relates ServiceFileReader Stream output */ std::ostream & operator<<( std::ostream & str, const PluginServices & obj ); ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REPO_LOCALSERVICES_H libzypp-17.36.5/zypp/repo/RepoException.cc000066400000000000000000000134611476576476200204650ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoException.cc * */ #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // Repository related exceptions // /////////////////////////////////////////////////////////////////// RepoException::RepoException() : Exception( "Repo exception" ) {} RepoException::RepoException( const std::string & msg_r ) : Exception( msg_r ) {} RepoException::RepoException( const RepoInfo & info ) : Exception( "Repo exception" ), _info( info ) {} RepoException::RepoException( const RepoInfo & info, const std::string& msg_r ) : Exception( msg_r ), _info( info ) {} RepoException::~RepoException() throw() {} std::ostream & RepoException::dumpOn( std::ostream & str ) const { str << "[" << _info.alias() << "|" << _info.url() << "] "; return Exception::dumpOn( str ); } /////////////////////////////////////////////////////////////////// #define DEF_CTORS( CLASS, MSG ) \ CLASS::CLASS() : RepoException( MSG ) {} \ CLASS::CLASS( const std::string & msg_r ) : RepoException( msg_r ) {} \ CLASS::CLASS( const RepoInfo & service_r ) : RepoException( service_r, MSG ) {} \ CLASS::CLASS( const RepoInfo & service_r, const std::string & msg_r ) : RepoException( service_r, msg_r ) {} DEF_CTORS( RepoNotCachedException, "Repository is not cached" ); DEF_CTORS( RepoNoUrlException, "Repository has no or invalid url defined." ); DEF_CTORS( RepoNoAliasException, "Repository has no alias defined." ); DEF_CTORS( RepoInvalidAliasException, "Repository has an invalid alias." ); DEF_CTORS( RepoNotFoundException, "Repository not found." ); DEF_CTORS( RepoAlreadyExistsException, "Repository already exists." ); DEF_CTORS( RepoUnknownTypeException, "Repository type can't be determined." ); DEF_CTORS( RepoMetadataException, "Repository metadata not usable." ); DEF_CTORS( RepoNoPermissionException, _("No permission to write repository cache.") ); #undef DEF_CTORS /////////////////////////////////////////////////////////////////// // // Service related exceptions // /////////////////////////////////////////////////////////////////// ServiceException::ServiceException() : Exception( "Service exception" ) {} ServiceException::ServiceException( const std::string & msg_r ) : Exception( msg_r ) {} ServiceException::ServiceException( const ServiceInfo & service_r ) : Exception( "Service exception" ), _service( service_r ) {} ServiceException::ServiceException( const ServiceInfo & service_r, const std::string & msg_r ) : Exception( msg_r ), _service( service_r ) {} ServiceException::~ServiceException() throw() {} std::ostream & ServiceException::dumpOn( std::ostream & str ) const { str << "[" << _service.alias() << "|" << _service.url() << "] "; return Exception::dumpOn( str ); } /////////////////////////////////////////////////////////////////// #define DEF_CTORS( CLASS, MSG ) \ CLASS::CLASS() : DEF_BASECLASS( MSG ) {} \ CLASS::CLASS( const std::string & msg_r ) : DEF_BASECLASS( msg_r ) {} \ CLASS::CLASS( const ServiceInfo & service_r ) : DEF_BASECLASS( service_r, MSG ) {} \ CLASS::CLASS( const ServiceInfo & service_r, const std::string & msg_r ) : DEF_BASECLASS( service_r, msg_r ) {} #define DEF_BASECLASS ServiceException DEF_CTORS( ServiceNoAliasException, "Service has no alias defined." ); DEF_CTORS( ServiceInvalidAliasException, "Service has an invalid alias." ); DEF_CTORS( ServiceAlreadyExistsException, "Service already exists." ); DEF_CTORS( ServiceNoUrlException, "Service has no or invalid url defined." ); // sub classes: DEF_CTORS( ServicePluginException, "PLUGIN service exception." ); /////////////////////////////////////////////////////////////////// // sub class: ServicePluginException #undef DEF_BASECLASS #define DEF_BASECLASS ServicePluginException DEF_CTORS( ServicePluginInformalException, "Service plugin has trouble providing the metadata but this should not be treated as error." ); DEF_CTORS( ServicePluginImmutableException, _("Service plugin does not support changing an attribute.") ); #undef DEF_CTORS ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/RepoException.h000066400000000000000000000241121476576476200203220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/parser/tagfile/RepoException.h * */ #ifndef ZYPP_REPO_REPOEXCEPTION_H #define ZYPP_REPO_REPOEXCEPTION_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /** \name Repository related exceptions. */ //@{ /** * \short Exception for repository handling. */ class ZYPP_API RepoException : public Exception { public: RepoException(); RepoException( const std::string & msg_r ); RepoException( const RepoInfo & info ); RepoException( const RepoInfo & info, const std::string & msg_r ); ~RepoException() throw() override; RepoInfo info() { return _info; } std::string alias() { return info().alias(); } protected: std::ostream & dumpOn( std::ostream & str ) const override; private: RepoInfo _info; }; /////////////////////////////////////////////////////////////////// /** * The repository cache is not built yet * so you can't create the repostories from * the cache. */ class ZYPP_API RepoNotCachedException : public RepoException { public: RepoNotCachedException(); RepoNotCachedException( const std::string & msg_r ); RepoNotCachedException( const RepoInfo & info ); RepoNotCachedException( const RepoInfo & info, const std::string & msg_r ); }; /** * thrown when it was impossible to * determine one url for this repo. */ class ZYPP_API RepoNoUrlException : public RepoException { public: RepoNoUrlException(); RepoNoUrlException( const std::string & msg_r ); RepoNoUrlException( const RepoInfo & info ); RepoNoUrlException( const RepoInfo & info, const std::string & msg_r ); }; /** * thrown when it was impossible to * determine an alias for this repo. */ class ZYPP_API RepoNoAliasException : public RepoException { public: RepoNoAliasException(); RepoNoAliasException( const std::string & msg_r ); RepoNoAliasException( const RepoInfo & info ); RepoNoAliasException( const RepoInfo & info, const std::string & msg_r ); }; /** * Thrown when the repo alias is found to be invalid. */ class ZYPP_API RepoInvalidAliasException : public RepoException { public: RepoInvalidAliasException(); RepoInvalidAliasException( const std::string & msg_r ); RepoInvalidAliasException( const RepoInfo & info ); RepoInvalidAliasException( const RepoInfo & info, const std::string & msg_r ); }; /** * thrown when it was impossible to * match a repository */ class ZYPP_API RepoNotFoundException : public RepoException { public: RepoNotFoundException(); RepoNotFoundException( const std::string & msg_r ); RepoNotFoundException( const RepoInfo & info ); RepoNotFoundException( const RepoInfo & info, const std::string & msg_r ); }; /** * Repository already exists and some unique * attribute can't be duplicated. */ class ZYPP_API RepoAlreadyExistsException : public RepoException { public: RepoAlreadyExistsException(); RepoAlreadyExistsException( const std::string & msg_r ); RepoAlreadyExistsException( const RepoInfo & info ); RepoAlreadyExistsException( const RepoInfo & info, const std::string & msg_r ); }; /** * thrown when it was impossible to * determine this repo type. */ class ZYPP_API RepoUnknownTypeException : public RepoException { public: RepoUnknownTypeException(); RepoUnknownTypeException( const std::string & msg_r ); RepoUnknownTypeException( const RepoInfo & info ); RepoUnknownTypeException( const RepoInfo & info, const std::string & msg_r ); }; /** * thrown when it was impossible to * use the raw metadata for this repo. */ class ZYPP_API RepoMetadataException : public RepoException { public: RepoMetadataException(); RepoMetadataException( const std::string & msg_r ); RepoMetadataException( const RepoInfo & info ); RepoMetadataException( const RepoInfo & info, const std::string & msg_r ); }; /** * thrown if the user has no permission to update(write) the caches. */ class ZYPP_API RepoNoPermissionException : public RepoException { public: RepoNoPermissionException(); RepoNoPermissionException( const std::string & msg_r ); RepoNoPermissionException( const RepoInfo & info ); RepoNoPermissionException( const RepoInfo & info, const std::string & msg_r ); }; //@} /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /** \name Service related exceptions. */ //@{ /** Base Exception for service handling. */ class ZYPP_API ServiceException : public Exception { public: ServiceException(); ServiceException( const std::string & msg_r ); ServiceException( const ServiceInfo & service_r ); ServiceException( const ServiceInfo & service_r, const std::string & msg_r ); ~ServiceException() throw() override; ServiceInfo service() { return _service; } std::string alias() { return service().alias(); } protected: std::ostream & dumpOn( std::ostream & str ) const override; private: ServiceInfo _service; }; /////////////////////////////////////////////////////////////////// /** Service without alias was used in an operation. */ class ZYPP_API ServiceNoAliasException : public ServiceException { public: ServiceNoAliasException(); ServiceNoAliasException( const std::string & msg_r ); ServiceNoAliasException( const ServiceInfo & service_r ); ServiceNoAliasException( const ServiceInfo & service_r, const std::string & msg_r ); }; /** * Thrown when the repo alias is found to be invalid. */ class ZYPP_API ServiceInvalidAliasException : public ServiceException { public: ServiceInvalidAliasException(); ServiceInvalidAliasException( const std::string & msg_r ); ServiceInvalidAliasException( const ServiceInfo & info ); ServiceInvalidAliasException( const ServiceInfo & info, const std::string & msg_r ); }; /** Service already exists and some unique attribute can't be duplicated. */ class ZYPP_API ServiceAlreadyExistsException : public ServiceException { public: ServiceAlreadyExistsException(); ServiceAlreadyExistsException( const std::string & msg_r ); ServiceAlreadyExistsException( const ServiceInfo & service_r ); ServiceAlreadyExistsException( const ServiceInfo & service_r, const std::string & msg_r ); }; /** Service has no or invalid url defined. */ class ZYPP_API ServiceNoUrlException : public ServiceException { public: ServiceNoUrlException(); ServiceNoUrlException( const std::string & msg_r ); ServiceNoUrlException( const ServiceInfo & service_r ); ServiceNoUrlException( const ServiceInfo & service_r, const std::string & msg_r ); }; //@} /** \name PLUGIN Service related exceptions. */ //@{ /** PLUGIN Service related exceptions */ class ZYPP_API ServicePluginException : public ServiceException { public: ServicePluginException(); ServicePluginException( const std::string & msg_r ); ServicePluginException( const ServiceInfo & service_r ); ServicePluginException( const ServiceInfo & service_r, const std::string & msg_r ); }; /** Service plugin has trouble providing the metadata but this should not be treated as error. */ class ZYPP_API ServicePluginInformalException : public ServicePluginException { public: ServicePluginInformalException(); ServicePluginInformalException( const std::string & msg_r ); ServicePluginInformalException( const ServiceInfo & service_r ); ServicePluginInformalException( const ServiceInfo & service_r, const std::string & msg_r ); }; /** Service plugin is immutable. */ class ZYPP_API ServicePluginImmutableException : public ServicePluginException { public: ServicePluginImmutableException(); ServicePluginImmutableException( const std::string & msg_r ); ServicePluginImmutableException( const ServiceInfo & service_r ); ServicePluginImmutableException( const ServiceInfo & service_r, const std::string & msg_r ); }; //@} ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PARSER_TAGFILE_PARSEEXCEPTION_H libzypp-17.36.5/zypp/repo/RepoInfoBase.cc000066400000000000000000000121341476576476200202110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoInfoBase.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace repo { /////////////////////////////////////////////////////////////////// /// \class RepoInfoBase::Impl /// \brief RepoInfoBase data /////////////////////////////////////////////////////////////////// struct RepoInfoBase::Impl { Impl() : _enabled( indeterminate ) , _autorefresh( indeterminate ) {} Impl( const std::string & alias_r ) : _enabled( indeterminate ) , _autorefresh( indeterminate ) { setAlias( alias_r ); } public: TriBool _enabled; TriBool _autorefresh; std::string _alias; std::string _escaped_alias; RepoVariablesReplacedString _name; Pathname _filepath; public: void setAlias( const std::string & alias_r ) { _alias = _escaped_alias = alias_r; // replace slashes with underscores str::replaceAll( _escaped_alias, "/", "_" ); } private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoInfoBase // /////////////////////////////////////////////////////////////////// RepoInfoBase::RepoInfoBase() : _pimpl( new Impl() ) {} RepoInfoBase::RepoInfoBase(const std::string & alias) : _pimpl( new Impl(alias) ) {} RepoInfoBase::~RepoInfoBase() {} void RepoInfoBase::setEnabled( bool enabled ) { _pimpl->_enabled = enabled; } void RepoInfoBase::setAutorefresh( bool autorefresh ) { _pimpl->_autorefresh = autorefresh; } void RepoInfoBase::setAlias( const std::string &alias ) { _pimpl->setAlias(alias); } void RepoInfoBase::setName( const std::string &name ) { _pimpl->_name.raw() = name; } void RepoInfoBase::setFilepath( const Pathname &filepath ) { _pimpl->_filepath = filepath; } // true by default (if not set by setEnabled()) bool RepoInfoBase::enabled() const { return indeterminate(_pimpl->_enabled) ? true : (bool) _pimpl->_enabled; } // false by default (if not set by setAutorefresh()) bool RepoInfoBase::autorefresh() const { return indeterminate(_pimpl->_autorefresh) ? false : (bool) _pimpl->_autorefresh; } std::string RepoInfoBase::alias() const { return _pimpl->_alias; } std::string RepoInfoBase::escaped_alias() const { return _pimpl->_escaped_alias; } std::string RepoInfoBase::name() const { if ( rawName().empty() ) return alias(); return repo::RepoVariablesStringReplacer()( rawName() ); } std::string RepoInfoBase::rawName() const { return _pimpl->_name.raw(); } std::string RepoInfoBase::label() const { if ( ZConfig::instance().repoLabelIsAlias() ) return alias(); return name(); } Pathname RepoInfoBase::filepath() const { return _pimpl->_filepath; } std::ostream & RepoInfoBase::dumpOn( std::ostream & str ) const { str << "--------------------------------------" << std::endl; str << "- alias : " << alias() << std::endl; if ( ! rawName().empty() ) str << "- name : " << rawName() << std::endl; str << "- enabled : " << enabled() << std::endl; str << "- autorefresh : " << autorefresh() << std::endl; return str; } std::ostream & RepoInfoBase::dumpAsIniOn( std::ostream & str ) const { // we save the original data without variable replacement str << "[" << alias() << "]" << endl; if ( ! rawName().empty() ) str << "name=" << rawName() << endl; str << "enabled=" << (enabled() ? "1" : "0") << endl; str << "autorefresh=" << (autorefresh() ? "1" : "0") << endl; return str; } std::ostream & RepoInfoBase::dumpAsXmlOn( std::ostream & str, const std::string & content ) const { return str << "" << endl; } std::ostream & operator<<( std::ostream & str, const RepoInfoBase & obj ) { return obj.dumpOn(str); } } // namespace repo /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/RepoInfoBase.h000066400000000000000000000144101476576476200200520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoInfoBase.h * */ #ifndef REPOINFOBASE_H_ #define REPOINFOBASE_H_ #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RepoInfoBase // /** * \short Base class implementing common features of \ref RepoInfo and * \ref ServiceInfo. * * \note Name is subject to repo variable replacement * (\see \ref RepoVariablesStringReplacer). */ class ZYPP_API RepoInfoBase { friend std::ostream & operator<<( std::ostream & str, const RepoInfoBase & obj ); public: RepoInfoBase(); RepoInfoBase(const std::string &alias); virtual ~RepoInfoBase(); RepoInfoBase(const RepoInfoBase &) = default; RepoInfoBase(RepoInfoBase &&) noexcept = default; RepoInfoBase &operator=(const RepoInfoBase &) = default; RepoInfoBase &operator=(RepoInfoBase &&) noexcept = default; /** * unique identifier for this source. If not specified * It should be generated from the base url. * * Normally, in a .repo file the section name is used * ( [somerepo] ) */ std::string alias() const; /** * Same as alias(), just escaped in a way to be a valid file name. */ std::string escaped_alias() const; /** * \short Repository name * * Short label or description of the repository. Defaults to \ref alias. * Subject to repo variable replacement (\see \ref RepoVariablesStringReplacer). * ie: "SUSE Linux 10.2 updates" */ std::string name() const; /** The raw metadata name (no default, no variables replaced). */ std::string rawName() const; /** * \short Label for use in messages for the user interface. * * Returns an alias or name, according to ZConfig::repoLabelIsAlias(). */ std::string label() const; /** User string: \ref label (alias or name) */ std::string asUserString() const { return label(); } /** * If enabled is false, then this repository must be ignored as if does * not exists, except when checking for duplicate alias. */ bool enabled() const; /** * If true, the repostory must be refreshed before creating resolvables * from it */ bool autorefresh() const; /** * \short File where this repo was read from * * \note could be an empty pathname for repo * infos created in memory. */ Pathname filepath() const; public: /** * set the repository alias \see alias * \param alias */ void setAlias( const std::string &alias ); /** * set the repository name \see name * \param name */ void setName( const std::string &name ); /** * enable or disable the repository \see enabled * \param enabled */ void setEnabled( bool enabled ); /** * enable or disable autorefresh \see autorefresh * \param enabled */ void setAutorefresh( bool autorefresh ); /** * \short set the path to the .repo file * * The path to the .repo file where this repository * was defined, or empty if nowhere. * * \param path File path */ void setFilepath( const Pathname &filename ); /** * Write a human-readable representation of this RepoInfoBase object * into the \a str stream. Useful for logging. */ virtual std::ostream & dumpOn( std::ostream & str ) const; /** * Write this RepoInfoBase object into \a str in a .repo
(ini) file format. * Raw values, no variable replacement. */ virtual std::ostream & dumpAsIniOn( std::ostream & str ) const; /** * Write an XML representation of this object with content (if available). * Repo variables replaced. */ virtual std::ostream & dumpAsXmlOn( std::ostream & str, const std::string & content = "" ) const; struct Impl; private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates RepoInfoBase */ inline bool operator==( const RepoInfoBase & lhs, const RepoInfoBase & rhs ) { return lhs.alias() == rhs.alias(); } /** \relates RepoInfoBase */ inline bool operator!=( const RepoInfoBase & lhs, const RepoInfoBase & rhs ) { return lhs.alias() != rhs.alias(); } inline bool operator<( const RepoInfoBase & lhs, const RepoInfoBase & rhs ) { return lhs.alias() < rhs.alias(); } /** \relates RepoInfoBase Stream output */ std::ostream & operator<<( std::ostream & str, const RepoInfoBase & obj ); /** \relates RepoInfoBase */ using RepoInfoBase_Ptr = shared_ptr; /** \relates RepoInfoBase */ using RepoInfoBase_constPtr = shared_ptr; ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif /*REPOINFOBASE_H_*/ libzypp-17.36.5/zypp/repo/RepoMirrorList.cc000066400000000000000000000143711476576476200206360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoMirrorList.cc * */ #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { /////////////////////////////////////////////////////////////////// /// \class RepoMirrorListTempProvider /// \brief Provide access to downloaded mirror list (in temp space) /// \ingroup g_RAII /// /// Tempspace (and mirror list) are deleted when provider goes out /// of scope. struct RepoMirrorListTempProvider { RepoMirrorListTempProvider() {} RepoMirrorListTempProvider( Pathname localfile_r ) : _localfile(std::move( localfile_r )) {} RepoMirrorListTempProvider( const Url & url_r ) { Url abs_url( url_r ); abs_url.setPathName( "/" ); abs_url.setQueryParam( "mediahandler", "curl" ); _access.reset( new MediaSetAccess( abs_url ) ); _localfile = _access->provideFile( url_r.getPathName() ); } const Pathname & localfile() const { return _localfile; } private: shared_ptr _access; Pathname _localfile; }; /////////////////////////////////////////////////////////////////// inline std::vector RepoMirrorListParseXML( const Pathname &tmpfile ) { InputStream tmpfstream (tmpfile); media::MetaLinkParser metalink; metalink.parse(tmpfstream); return metalink.getUrls(); } inline std::vector RepoMirrorListParseTXT( const Pathname &tmpfile ) { InputStream tmpfstream (tmpfile); std::vector my_urls; std::string tmpurl; while (getline(tmpfstream.stream(), tmpurl)) { if ( tmpurl[0] == '#' ) continue; try { my_urls.push_back(Url(tmpurl)); } catch (...) {;} // ignore malformed urls } return my_urls; } /** Parse a local mirrorlist \a listfile_r and return usable URLs */ inline std::vector RepoMirrorListParse( const Url & url_r, const Pathname & listfile_r, bool mirrorListForceMetalink_r ) { USR << url_r << " " << listfile_r << endl; std::vector mirrorurls; if ( mirrorListForceMetalink_r || url_r.asString().find( "/metalink" ) != std::string::npos ) mirrorurls = RepoMirrorListParseXML( listfile_r ); else mirrorurls = RepoMirrorListParseTXT( listfile_r ); std::vector ret; for ( auto & murl : mirrorurls ) { if ( murl.getScheme() != "rsync" ) { size_t delpos = murl.getPathName().find("repodata/repomd.xml"); if( delpos != std::string::npos ) { murl.setPathName( murl.getPathName().erase(delpos) ); } ret.push_back( murl ); if ( ret.size() >= 4 ) // why 4? break; } } return ret; } } // namespace /////////////////////////////////////////////////////////////////// RepoMirrorList::RepoMirrorList( const Url & url_r, const Pathname & metadatapath_r, bool mirrorListForceMetalink_r ) { if ( url_r.getScheme() == "file" ) { // never cache for local mirrorlist _urls = RepoMirrorListParse( url_r, url_r.getPathName(), mirrorListForceMetalink_r ); } else if ( ! PathInfo( metadatapath_r).isDir() ) { // no cachedir RepoMirrorListTempProvider provider( url_r ); // RAII: lifetime of any downloaded files _urls = RepoMirrorListParse( url_r, provider.localfile(), mirrorListForceMetalink_r ); } else { // have cachedir Pathname cachefile( metadatapath_r ); if ( mirrorListForceMetalink_r || url_r.asString().find( "/metalink" ) != std::string::npos ) cachefile /= "mirrorlist.xml"; else cachefile /= "mirrorlist.txt"; zypp::filesystem::PathInfo cacheinfo( cachefile ); if ( !cacheinfo.isFile() || cacheinfo.mtime() < time(NULL) - (long) ZConfig::instance().repo_refresh_delay() * 60 ) { DBG << "Getting MirrorList from URL: " << url_r << endl; RepoMirrorListTempProvider provider( url_r ); // RAII: lifetime of downloaded file // Create directory, if not existing DBG << "Copy MirrorList file to " << cachefile << endl; zypp::filesystem::assert_dir( metadatapath_r ); zypp::filesystem::hardlinkCopy( provider.localfile(), cachefile ); } _urls = RepoMirrorListParse( url_r, cachefile, mirrorListForceMetalink_r ); if( _urls.empty() ) { DBG << "Removing Cachefile as it contains no URLs" << endl; zypp::filesystem::unlink( cachefile ); } } } ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/RepoMirrorList.h000066400000000000000000000024071476576476200204750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_REPO_MIRRORLIST_H_ #define ZYPP_REPO_MIRRORLIST_H_ #include #include #include namespace zypp { namespace repo { class RepoMirrorList { public: RepoMirrorList( const Url & url_r, const Pathname & metadatapath_r, bool mirrorListForceMetalink_r ); RepoMirrorList( const Url & url_r ) : RepoMirrorList( url_r, Pathname(), false ) {} const std::vector & getUrls() const { return _urls; } std::vector & getUrls() { return _urls; } private: std::vector _urls; }; } // ns repo } // ns zypp #endif // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/repo/RepoProvideFile.cc000066400000000000000000000310471476576476200207370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/source/RepoProvideFile.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; using std::set; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // provideFile // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// /** Hack to extract progress information from media::DownloadProgressReport. * We redirect the static report triggered from RepoInfo::provideFile * to feed the ProvideFilePolicy callbacks in addition to any connected * media::DownloadProgressReport. */ struct DownloadFileReportHack : public callback::ReceiveReport { using BaseType = callback::ReceiveReport; using RedirectType = function; DownloadFileReportHack(RedirectType &&redirect_r) : _oldRec(Distributor::instance().getReceiver()), _redirect(std::move(redirect_r)) { connect(); } DownloadFileReportHack(const DownloadFileReportHack &) = delete; DownloadFileReportHack(DownloadFileReportHack &&) = delete; DownloadFileReportHack &operator=(const DownloadFileReportHack &) = delete; DownloadFileReportHack &operator=(DownloadFileReportHack &&) = delete; ~DownloadFileReportHack() override { if ( _oldRec ) Distributor::instance().setReceiver( *_oldRec ); else Distributor::instance().noReceiver(); } void start( const Url & file, Pathname localfile ) override { if ( _oldRec ) _oldRec->start( file, localfile ); else BaseType::start( file, localfile ); } bool progress( int value, const Url & file, double dbps_avg = -1, double dbps_current = -1 ) override { bool ret = true; if ( _oldRec ) ret &= _oldRec->progress( value, file, dbps_avg, dbps_current ); if ( _redirect ) ret &= _redirect( value ); return ret; } Action problem( const Url & file, Error error, const std::string & description ) override { if ( _oldRec ) return _oldRec->problem( file, error, description ); return BaseType::problem( file, error, description ); } void finish( const Url & file, Error error, const std::string & reason ) override { if ( _oldRec ) _oldRec->finish( file, error, reason ); else BaseType::finish( file, error, reason ); } private: Receiver * _oldRec; RedirectType _redirect; }; ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// ManagedFile provideFile( RepoInfo repo_r, const OnMediaLocation & loc_r, const ProvideFilePolicy & policy_r ) { RepoMediaAccess access; return access.provideFile(std::move(repo_r), loc_r, policy_r ); } /////////////////////////////////////////////////////////////////// class RepoMediaAccess::Impl { public: Impl(ProvideFilePolicy &&defaultPolicy_r) : _defaultPolicy(std::move(defaultPolicy_r)) {} Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() { std::map >::iterator it; for ( it = _medias.begin(); it != _medias.end(); ++it ) { it->second->release(); } } /** Provide a MediaSetAccess for \c url with label and verifier adjusted. * * As the same url (e.g. \c 'dvd:///' ) might be used for multiple repos * we must always adjust the repo specific data (label,verifier). * * \todo This mixture of media and repos specific data is fragile. */ shared_ptr mediaAccessForUrl( const Url &url, RepoInfo repo ) { std::map >::const_iterator it; it = _medias.find(url); shared_ptr media; if ( it != _medias.end() ) { media = it->second; } else { media.reset( new MediaSetAccess(url) ); _medias[url] = media; } setVerifierForRepo( std::move(repo), media ); return media; } private: void setVerifierForRepo( const RepoInfo& repo, const shared_ptr& media ) { // Always set the MediaSetAccess label. media->setLabel( repo.name() ); // set a verifier if the repository has it Pathname mediafile = repo.metadataPath() + "/media.1/media"; if ( ! repo.metadataPath().empty() ) { if ( PathInfo(mediafile).isExist() ) { std::map, RepoInfo>::const_iterator it; it = _verifier.find(media); if ( it != _verifier.end() ) { if ( it->second.alias() == repo.alias() ) { // this media is already using this repo verifier return; } } SUSEMediaVerifier lverifier { mediafile }; if ( lverifier ) { DBG << "Verifier for repo '" << repo.alias() << "':" << lverifier << endl; for ( media::MediaNr i = 1; i <= lverifier.totalMedia(); ++i ) { media::MediaVerifierRef verifier( new repo::SUSEMediaVerifier( lverifier, i ) ); media->setVerifier( i, verifier); } _verifier[media] = repo; } else { WAR << "Invalid verifier for repo '" << repo.alias() << "' in '" << repo.metadataPath() << "': " << lverifier << endl; } } else { DBG << "No media verifier for repo '" << repo.alias() << "' media.1/media does not exist in '" << repo.metadataPath() << "'" << endl; } } else { WAR << "'" << repo.alias() << "' metadata path is empty. Can't set verifier. Probably this repository does not come from RepoManager." << endl; } } private: std::map, RepoInfo> _verifier; std::map > _medias; public: ProvideFilePolicy _defaultPolicy; }; /////////////////////////////////////////////////////////////////// RepoMediaAccess::RepoMediaAccess( ProvideFilePolicy defaultPolicy_r ) : _impl( new Impl( std::move(defaultPolicy_r) ) ) {} RepoMediaAccess::~RepoMediaAccess() {} void RepoMediaAccess::setDefaultPolicy( const ProvideFilePolicy & policy_r ) { _impl->_defaultPolicy = policy_r; } const ProvideFilePolicy & RepoMediaAccess::defaultPolicy() const { return _impl->_defaultPolicy; } ManagedFile RepoMediaAccess::provideFile( const RepoInfo& repo_r, const OnMediaLocation & loc_rx, const ProvideFilePolicy & policy_r ) { const OnMediaLocation locWithPath( OnMediaLocation(loc_rx).prependPath( repo_r.path() ) ); MIL << locWithPath << endl; // Arrange DownloadFileReportHack to recieve the source::DownloadFileReport // and redirect download progress triggers to call the ProvideFilePolicy // callback. DownloadFileReportHack dumb( std::bind( std::mem_fn(&ProvideFilePolicy::progress), std::ref(policy_r), _1 ) ); RepoException repo_excpt(repo_r, str::form(_("Can't provide file '%s' from repository '%s'"), locWithPath.filename().c_str(), repo_r.alias().c_str() ) ); if ( repo_r.baseUrlsEmpty() ) { repo_excpt.remember(RepoException(_("No url in repository."))); ZYPP_THROW(repo_excpt); } Fetcher fetcher; fetcher.addCachePath( repo_r.packagesPath() ); MIL << "Added cache path " << repo_r.packagesPath() << endl; fetcher.addCachePath( repo_r.predownloadPath(), Fetcher::CleanFiles ); MIL << "Added cache path " << repo_r.predownloadPath() << endl; // Test whether download destination is writable, if not // switch into the tmpspace (e.g. bnc#755239, download and // install srpms as user). Pathname destinationDir( repo_r.packagesPath() ); PathInfo pi( destinationDir ); if ( ! pi.isExist() ) { // try to create it... assert_dir( destinationDir ); pi(); } if ( geteuid() != 0 && ! pi.userMayW() ) { WAR << "Destination dir '" << destinationDir << "' is not user writable, using tmp space." << endl; destinationDir = getZYpp()->tmpPath() / destinationDir; assert_dir( destinationDir ); fetcher.addCachePath( destinationDir ); MIL << "Added cache path " << destinationDir << endl; } // Suppress (interactive) media::MediaChangeReport if we in have multiple basurls (>1) media::ScopedDisableMediaChangeReport guard( repo_r.baseUrlsSize() > 1 ); for ( RepoInfo::urls_const_iterator it = repo_r.baseUrlsBegin(); it != repo_r.baseUrlsEnd(); /* incremented in the loop */ ) { Url url( *it ); ++it; try { MIL << "Providing file of repo '" << repo_r.alias() << "' from " << url << endl; shared_ptr access = _impl->mediaAccessForUrl( url, repo_r ); fetcher.enqueue( locWithPath, policy_r.fileChecker() ); fetcher.start( destinationDir, *access ); // reached if no exception has been thrown, so this is the correct file ManagedFile ret( destinationDir + locWithPath.filename() ); if ( !repo_r.keepPackages() ) { ret.setDispose( filesystem::unlink ); } MIL << "provideFile at " << ret << endl; return ret; } catch ( const UserRequestException & excpt ) { ZYPP_RETHROW( excpt ); } catch ( const FileCheckException & excpt ) { ZYPP_RETHROW( excpt ); } catch ( const Exception &e ) { ZYPP_CAUGHT( e ); repo_excpt.remember(e); WAR << "Trying next url" << endl; continue; } } // iteration over urls ZYPP_THROW(repo_excpt); return ManagedFile(); // not reached } ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/RepoProvideFile.h000066400000000000000000000100721476576476200205740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoProvideFile.h * */ #ifndef ZYPP_REPO_REPOPROVIDEFILE_H #define ZYPP_REPO_REPOPROVIDEFILE_H #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // provideFile // /////////////////////////////////////////////////////////////////// /** Provide a file from a Repository. * Let \a source_r provide the file described by \a loc_r. In case * \a loc_r contains a checksum, the file is verified. \a policy_r * provides callback hooks for download progress reporting and behaviour * on failed checksum verification. * * \throws Exception */ ManagedFile provideFile( RepoInfo repo_r, const OnMediaLocation & loc_r, const ProvideFilePolicy & policy_r = ProvideFilePolicy() ); /** * \short Provides files from different repos * * Class that allows to get files from repositories * It handles automatically setting media verifiers if the * repo is cached, and reuses media set access opened for * repositories during its scope, so you can provide * files from different repositories in different order * without opening and closing medias all the time */ class ZYPP_API RepoMediaAccess { public: /** Ctor taking the default \ref ProvideFilePolicy. */ RepoMediaAccess(ProvideFilePolicy defaultPolicy_r = ProvideFilePolicy() ); ~RepoMediaAccess(); /** Provide a file from a Repository. * Let \a source_r provide the file described by \a loc_r. In case * \a loc_r contains a checksum, the file is verified. \a policy_r * provides callback hooks for download progress reporting and behaviour * on failed checksum verification. * * \throws Exception * \todo Investigate why this needs a non-const Repository as arg. */ ManagedFile provideFile( const RepoInfo& repo_r, const OnMediaLocation & loc_r, const ProvideFilePolicy & policy_r ); /** \overload Using the current default \ref ProvideFilePolicy. */ ManagedFile provideFile( RepoInfo repo_r, const OnMediaLocation & loc_r ) { return provideFile( std::move(repo_r), loc_r, defaultPolicy() ); } public: /** Set a new default \ref ProvideFilePolicy. */ void setDefaultPolicy( const ProvideFilePolicy & policy_r ); /** Get the current default \ref ProvideFilePolicy. */ const ProvideFilePolicy & defaultPolicy() const; private: class Impl; RW_pointer _impl; }; ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REPO_REPOPROVIDEFILE_H libzypp-17.36.5/zypp/repo/RepoType.cc000066400000000000000000000041371476576476200174500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include "RepoType.h" namespace zypp { namespace repo { /////////////////////////////////////////////////////////////////// namespace { static NamedValue & table() { static NamedValue & _t( *new NamedValue ); if ( _t.empty() ) { _t( RepoType::RPMMD_e ) | "rpm-md" |"rpm"|"rpmmd"|"repomd"|"yum"|"up2date"; _t( RepoType::YAST2_e ) | "yast2" |"yast"|"susetags"; _t( RepoType::RPMPLAINDIR_e ) | "plaindir"; _t( RepoType::NONE_e ) | "N/A" |"n/a"|"NONE"| "none"; } return _t; } } // namespace /////////////////////////////////////////////////////////////////// const RepoType RepoType::RPMMD ( RepoType::RPMMD_e ); const RepoType RepoType::YAST2 ( RepoType::YAST2_e ); const RepoType RepoType::RPMPLAINDIR ( RepoType::RPMPLAINDIR_e ); const RepoType RepoType::NONE ( RepoType::NONE_e ); RepoType::RepoType(const std::string & strval_r) : _type(parse(strval_r)) {} RepoType::Type RepoType::parse( const std::string & strval_r ) { RepoType::Type type; if ( ! table().getValue( str::toLower( strval_r ), type ) ) { ZYPP_THROW( RepoUnknownTypeException( "Unknown repository type '" + strval_r + "'") ); } return type; } const std::string & RepoType::asString() const { return table().getName( _type ); } } // ns repo } // ns zypp // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/repo/RepoType.h000066400000000000000000000034221476576476200173060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_REPO_TYPE_H_ #define ZYPP_REPO_TYPE_H_ #include #include #include namespace zypp { namespace repo { /** * \short Repository type enumeration * * Repositories can be from varous types * ... */ struct ZYPP_API RepoType { static const RepoType RPMMD; static const RepoType YAST2; static const RepoType RPMPLAINDIR; static const RepoType NONE; enum Type { NONE_e, RPMMD_e, YAST2_e, RPMPLAINDIR_e, }; RepoType() : _type(NONE_e) {} RepoType(Type type) : _type(type) {} explicit RepoType(const std::string & strval_r); Type toEnum() const { return _type; } RepoType::Type parse(const std::string & strval_r); const std::string & asString() const; Type _type; }; inline std::ostream & operator<<( std::ostream & str, const RepoType & obj ) { return str << obj.asString(); } inline bool operator==(const RepoType & obj1, const RepoType & obj2) { return obj1._type == obj2._type; } inline bool operator!=(const RepoType & obj1, const RepoType & obj2) { return ! (obj1 == obj2); } } // ns repo } // ns zypp #endif // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/repo/RepoVariables.cc000066400000000000000000000540661476576476200204450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #include #include #define ZYPP_DBG_VAREXPAND 0 #if ( ZYPP_DBG_VAREXPAND ) #warning ZYPP_DBG_VAREXPAND is on using std::cout; #endif // ZYPP_DBG_VAREXPAND /////////////////////////////////////////////////////////////////// namespace zypp { namespace env { /** Use faked releasever (e.g. for 'zupper dup' to next distro version */ inline std::string ZYPP_REPO_RELEASEVER() { const char * env = getenv("ZYPP_REPO_RELEASEVER"); return( env ? env : "" ); } } /////////////////////////////////////////////////////////////////// namespace repo { /////////////////////////////////////////////////////////////////// // RepoVarExpand /////////////////////////////////////////////////////////////////// namespace { /////////////////////////////////////////////////////////////////// /// \class FindVar /// \brief Helper scanning for variable definitions in a string /////////////////////////////////////////////////////////////////// struct FindVar { bool _embedded; ///< A (formerly) embedded string may have esacped \c $, \c closebrace and \c backslash const char * _sbeg; ///< start of string to scan const char * _vbeg; ///< [$]{variable:-word} / [$]{variable} / if embedded also on [\\] const char * _nbeg; ///< ${[v]ariable:-word} / ${[v]ariable} const char * _nend; ///< ${variable[:]-word} / ${variable[}] const char * _vend; ///< ${variable:-word}[] / ${variable}[] const char * _send; ///< end of scan (next $ or nullptr if done) FindVar( const std::string & str_r, bool embedded_r ) : _embedded( embedded_r ) , _sbeg( str_r.c_str() ) , _vbeg( nullptr ) , _nbeg( nullptr ) , _nend( nullptr ) , _vend( nullptr ) , _send( findVarStart( _sbeg ) ) {} /** Nullptr in _send indicates we scanned the whole string. */ bool done() const { return !_send; } /** Advance to first/next var if there is one */ bool nextVar() { if ( done() ) return false; do { if ( _vbeg && !_vend ) // loop internal: no findVarEnd at current $; skip it _send = findVarStart( _vbeg+1 ); _vbeg = _send; // next $ or null if string end _nbeg = _nend = _vend = _send = nullptr; if ( ! _vbeg ) // done! return false; } while( ! findVarEnd() ); return true; } /** Valid _vend indicates valid var data in scan. */ bool hasVar() const { return _vend; } // // Methods below are only valid if hasVar() == true // /** Return the full var text */ std::string var() const { return std::string( _vbeg, _vend ); } /** Return the var name */ std::string varName() const { return std::string( _nbeg, _nend ); } /** Whether this is a conditional var (${..:[+-]...}) */ bool varIsConditional() const { return( *(_vbeg+1) == '{' && *_nend == ':' ); } /** The var type: \c \, \c $, \c - , \c + * \li \c \ backslash escaped literal * \li \c $ plain variable * \li \c - conditional: default value * \li \c + conditional: alternate value */ int varType() const { return( varIsConditional() ? *(_nend+1) : *_vbeg ); } /** Return embedded value in conditional vars or empty string */ std::string varEmbedded() const { return( varIsConditional() ? std::string( _nend+2, _vend-1 ) : std::string() ); } /** Have unwritten data before var? */ bool hasVarPrefix() const { return ( _sbeg != _vbeg ); } /** Return unwritten data before var */ std::string varPrefix() const { return std::string( _sbeg, _vbeg ); } /** Indicate all data up to _vend were written */ void wroteVar() { _sbeg = _vend; } private: /** Return next \c $ */ const char * findVarStart( const char * sbeg_r ) const { for ( ; *sbeg_r; ++sbeg_r ) if ( *sbeg_r == '$' || ( _embedded && *sbeg_r == '\\' ) ) return sbeg_r; return nullptr; } /** Valid var name char */ bool isnamech( int ch ) const { return ch == '_' || isalnum( ch ); } /** Scan for a valid variable starting at _vbeg (storing the values) */ bool findVarEnd() { // asserted: *_vbeg == '$' || '\\' if ( ! findVarEnd( _vbeg, _nbeg, _nend, _vend ) ) return false; _send = findVarStart( _vend ); return true; } /** Skip over valid variable starting at vbeg (return end in \a vend). */ const char * findVarEnd( const char * vbeg ) const { // asserted: *_vbeg == '$' const char * nbeg = nullptr; const char * nend = nullptr; const char * vend = nullptr; findVarEnd( vbeg, nbeg, nend, vend ); return vend; } /** Scan for a valid variable starting at vbeg (const version returning the values). */ bool findVarEnd( const char * vbeg, const char *& nbeg, const char *& nend, const char *& vend ) const { // embedded only: handle backslash escaped chars if ( *_vbeg == '\\' ) { nbeg = vbeg+1; if ( *nbeg == '$' || *nbeg == '}' || *nbeg == '\\' ) { nend = vend = vbeg+2; return true; } return false; } // asserted: *vbeg == '$' // vbeg: [$]{variable:-word} / [$]{variable} // nbeg: ${[v]ariable:-word} / ${[v]ariable} bool braced = ( *(vbeg+1) == '{' ); //} nbeg = vbeg+( braced ? 2 : 1 ); if ( !isnamech( *nbeg ) ) // don't allow empty var name return false; for ( nend = nbeg+1; isnamech( *nend ); ++nend ) {;} // skip over var name // nend: ${variable[:]-word} / ${variable[}] // vend: ${variable:-word}[] / ${variable}[] // stay with ( vend == nullptr ) until you know it's valid if ( braced ) { if ( *nend == '}' ) { vend = nend+1; } else if ( *nend == ':' ) { const char * scan = nend+1; if ( *scan == '+' || *scan == '-' ) { ++scan; // find first not escaped '}' while ( *scan ) { if ( *scan == '\\' ) { ++scan; // next char is skipped if ( *scan ) ++scan; } else if ( *scan == '$' ) { // an embedded var? if ( ! (scan = findVarEnd( scan )) ) return false; } else if ( *scan == '}' ) { vend = scan+1; // ==> unesacped '}', we're done! break; } else ++scan; // literal } // ( ! *scan ) => end of string while looking for unesacped '}' } else ; // err: ':' not followed by '+' or '-' } else ; // err: braced name must end with '}' or ':' } else { vend = nend; // un-braced } return( vend != nullptr ); } }; bool _expand( std::string &, const std::string & value_r, unsigned level_r, RepoVarExpand::VarRetriever & varRetriever_r ); inline std::string expand( const std::string & value_r, unsigned level_r, RepoVarExpand::VarRetriever & varRetriever_r ) { std::string ret; if ( ! _expand( ret, value_r, level_r, varRetriever_r ) ) ret = value_r; return ret; } inline std::string expand( std::string && value_r, unsigned level_r, RepoVarExpand::VarRetriever & varRetriever_r ) { std::string ret; if ( ! _expand( ret, value_r, level_r, varRetriever_r ) ) ret = std::move(value_r); return ret; } /** Expand variables in \a value_r depending on \a level-r * level_r > 0 may have escaped chars outside braces. */ inline bool _expand( std::string & result_r, const std::string & value_r, unsigned level_r, RepoVarExpand::VarRetriever & varRetriever_r ) { #if ( ZYPP_DBG_VAREXPAND ) cout << std::string( 2*level_r, ' ' ) << "\033[7m>>" << value_r << "<<\033[27m" << endl; std::ostringstream dbg; const char * dbgsbeg = value_r.c_str(); // track vars we already added to dbg unsigned dbgi = 0; // color 1-5 var / 6 moved value_r dbg << std::string( 2*level_r, ' ' ) << ">>"; #endif // ZYPP_DBG_VAREXPAND bool expanded = false; if ( ! value_r.empty() ) { FindVar scan( value_r, level_r ); // level_r > 0 is embedded while ( scan.nextVar() ) { static const std::string _emptyValue; const std::string *const knownVar = ( varRetriever_r ? varRetriever_r( scan.varName() ) : nullptr ); const std::string & varValue( knownVar ? *knownVar : _emptyValue ); #if ( ZYPP_DBG_VAREXPAND ) dbg << std::string(dbgsbeg,scan._vbeg) << "\033[3" << ((dbgi%5)+1) << "m" << scan.var() << "\033[0m"; cout << dbg.str() << "|<< " << scan.varName() << " " << (knownVar?"("+varValue+")":"-") << " {" << scan.varEmbedded() << "}" << endl; dbgsbeg = scan._vend; dbgi++; #endif // ZYPP_DBG_VAREXPAND bool mustSubstitute = false; // keep original text per default std::string substitutionValue; int varType = scan.varType(); if ( varType == '$' ) // plain var { if ( knownVar ) { mustSubstitute = true; substitutionValue = varValue; } else ; // keep original text per default } else if ( varType == '-' ) // ':-' default value { mustSubstitute = true; if ( varValue.empty() ) substitutionValue = expand( scan.varEmbedded(), level_r+1, varRetriever_r ); else substitutionValue = varValue; } else if ( varType == '+' ) // ':+' alternate value { mustSubstitute = true; if ( ! varValue.empty() ) substitutionValue = expand( scan.varEmbedded(), level_r+1, varRetriever_r ); else ; // empty substitutionValue } else if ( varType == '\\' ) // backslash escaped literal (in varName) { mustSubstitute = true; substitutionValue = scan.varName(); } else ; // keep original text per default if ( mustSubstitute ) { if ( scan.hasVarPrefix() ) result_r += scan.varPrefix(); if ( ! substitutionValue.empty() ) result_r += substitutionValue; scan.wroteVar(); // this moves scan._sbeg so we can later see what's already written } } #if ( ZYPP_DBG_VAREXPAND ) dbg << std::string( dbgsbeg ) << (scan._sbeg == value_r.c_str() ? "<<\033[36m(moved)\033[0m" : ""); #endif // ZYPP_DBG_VAREXPAND // handle unwritten data: if ( scan._sbeg != value_r.c_str() ) { expanded = true; if ( *scan._sbeg ) result_r += std::string( scan._sbeg ); } else ; // no replacements at all } #if ( ZYPP_DBG_VAREXPAND ) dbg << "<<"; cout << dbg.str() << endl; cout << std::string( 2*level_r, ' ' ) << "\033[36m->" << result_r << "<-\033[0m" << endl; #endif // ZYPP_DBG_VAREXPAND return expanded; } } // namespace /////////////////////////////////////////////////////////////////// std::string RepoVarExpand::operator()( const std::string & value_r, VarRetriever varRetriever_r ) const { return expand( value_r, 0, varRetriever_r ); } std::string RepoVarExpand::operator()( std::string && value_r, VarRetriever varRetriever_r ) const { return expand( std::move(value_r), 0, varRetriever_r ); } /////////////////////////////////////////////////////////////////// // RepoVariables*Replace /////////////////////////////////////////////////////////////////// namespace { class RepoVarsMap : public std::map { public: static RepoVarsMap & instance() { static RepoVarsMap _instance; return _instance; } static const std::string * lookup( const std::string & name_r ) { return instance()._lookup( name_r ); } private: const std::string * _lookup( const std::string & name_r ) { // Safe guard in case the caller does not own a zypp instance. In this case // getZYpp()->getTarget() in checkOverride would create a zypp instance which // would clear the variables parsed so far. auto guard { getZYpp() }; // bsc#1237044: The context in which the variables are to be evaluated. // TODO: In fact we should have a RepoVarsMap per context, no singleton. // The code here reflects the weakness of the classic ZConfig singleton. // We need to reset if the contextRoot changes and can't have different // ZConfig::instance().varsPath() per context. const Pathname contextRoot { ZConfig::instance().repoManagerRoot() }; const Pathname contextVarsPath { ZConfig::instance().varsPath() }; if ( contextRoot != _contextRoot ) { MIL << "RepoVars context changed from " << _contextRoot << " -> " << contextRoot << endl; _contextRoot = contextRoot; clear(); } if ( empty() ) // at init / after reset { // load user definitions from vars.d filesystem::dirForEach( contextRoot / contextVarsPath, filesystem::matchNoDots(), bind( &RepoVarsMap::parse, this, _1, _2 ) ); // releasever_major/_minor are per default derived from releasever. // If releasever is userdefined, inject missing _major/_minor too. deriveFromReleasever( "releasever", /*dont't overwrite user defined values*/false ); dumpOn( DBG ); // add builtin vars except for releasever{,_major,_minor} (see checkOverride) { const Arch & arch( ZConfig::instance().systemArchitecture() ); { std::string & var( operator[]( "arch" ) ); if ( var.empty() ) var = arch.asString(); } { std::string & var( operator[]( "basearch" ) ); if ( var.empty() ) var = arch.baseArch().asString(); } } } const std::string * ret = checkOverride( name_r, contextRoot ); if ( !ret ) { // get value from map iterator it = find( name_r ); if ( it != end() ) ret = &(it->second); } return ret; } std::ostream & dumpOn( std::ostream & str ) const { for ( auto && kv : *this ) { str << '{' << kv.first << '=' << kv.second << '}' << endl; } return str; } private: /** Get first line from file */ bool parse( const Pathname & dir_r, const std::string & str_r ) { std::ifstream file( (dir_r/str_r).c_str() ); operator[]( str_r ) = str::getline( file, /*trim*/false ); return true; } /** Derive \c releasever_major/_minor from \c releasever, keeping or overwrititing existing values. */ void deriveFromReleasever( const std::string & stem_r, bool overwrite_r ) { if ( count( stem_r ) ) // releasever is defined.. { const std::string & stem_major( stem_r+"_major" ); const std::string & stem_minor( stem_r+"_minor" ); if ( overwrite_r ) splitReleaseverTo( operator[]( stem_r ), &operator[]( stem_major ), &operator[]( stem_minor ) ); else splitReleaseverTo( operator[]( stem_r ), count( stem_major ) ? nullptr : &operator[]( stem_major ), count( stem_minor ) ? nullptr : &operator[]( stem_minor ) ); } } /** Split \c releasever at \c '.' and store major/minor parts as requested. */ void splitReleaseverTo( const std::string & releasever_r, std::string * major_r, std::string * minor_r ) const { if ( major_r || minor_r ) { std::string::size_type pos = releasever_r.find( '.' ); if ( pos == std::string::npos ) { if ( major_r ) *major_r = releasever_r; if ( minor_r ) minor_r->clear(); } else { if ( major_r ) *major_r = releasever_r.substr( 0, pos ); if ( minor_r ) *minor_r = releasever_r.substr( pos+1 ) ; } } } /** Check for conditions overwriting the (user) defined values. */ const std::string * checkOverride( const std::string & name_r, const Pathname & contextRoot_r ) { /////////////////////////////////////////////////////////////////// // Always check for changing releasever{,_major,_minor} (bnc#943563) if ( str::startsWith( name_r, "releasever" ) && ( name_r.size() == 10 || strcmp( name_r.c_str()+10, "_minor" ) == 0 || strcmp( name_r.c_str()+10, "_major" ) == 0 ) ) { std::string val( env::ZYPP_REPO_RELEASEVER() ); if ( !val.empty() ) { // $ZYPP_REPO_RELEASEVER always overwrites any defined value if ( val != operator[]( "$releasever" ) ) { operator[]( "$releasever" ) = std::move(val); deriveFromReleasever( "$releasever", /*overwrite previous values*/true ); } return &operator[]( "$"+name_r ); } else if ( !count( name_r ) ) { // No user defined value, so we follow the target val = Target::distributionVersion( contextRoot_r ); if ( val != operator[]( "$_releasever" ) ) { operator[]( "$_releasever" ) = std::move(val); deriveFromReleasever( "$_releasever", /*overwrite previous values*/true ); } return &operator[]( "$_"+name_r ); } // else: return nullptr; // get user value from map } /////////////////////////////////////////////////////////////////// return nullptr; // get user value from map } private: Pathname _contextRoot; }; } // namespace /////////////////////////////////////////////////////////////////// std::string RepoVariablesStringReplacer::operator()( const std::string & value ) const { return RepoVarExpand()( value, RepoVarsMap::lookup ); } std::string RepoVariablesStringReplacer::operator()( std::string && value ) const { return RepoVarExpand()( std::move(value), RepoVarsMap::lookup ); } Url RepoVariablesUrlReplacer::operator()( const Url & value ) const { Url::ViewOptions toReplace = value.getViewOptions() - url::ViewOption::WITH_USERNAME - url::ViewOption::WITH_PASSWORD; // Legacy: Not 100% correct because it substitutes inside the 'proxypass=' value, // but this was done before as well. The final fix will have to keep the proxypasswd // out side the url in a cedential file. Url tmpurl { value }; tmpurl.setViewOptions( toReplace ); const std::string & replaced( RepoVarExpand()( hotfix1050625::asString( tmpurl ), RepoVarsMap::lookup ) ); Url newurl; if ( !replaced.empty() ) { newurl = replaced; newurl.setUsername( value.getUsername( url::E_ENCODED ), url::E_ENCODED ); newurl.setPassword( value.getPassword( url::E_ENCODED ), url::E_ENCODED ); newurl.setViewOptions( value.getViewOptions() ); } return newurl; } } // namespace repo /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zyppintern { using namespace zypp; // internal helper called when re-acquiring the lock void repoVariablesReset() { repo::RepoVarsMap::instance().clear(); } } // namespace zyppintern /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/RepoVariables.h000066400000000000000000000137011476576476200202760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/RepoVariables.h */ #ifndef ZYPP_REPO_VARIABLES_H_ #define ZYPP_REPO_VARIABLES_H_ #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace repo { /////////////////////////////////////////////////////////////////// /// \class RepoVarExpand /// \brief Functor expanding repo variables in a string /// /// Known variables are determined by a callback function taking a variable /// name and returning a pointer to the variable value or \c nullptr if unset. /// /// The \c $ character introduces variable expansion. A valid variable name /// is any non-empty case-insensitive sequence of [[:alnum:]_]. /// The variable name to be expanded may be enclosed in braces, which are /// optional but serve to protect the variable to be expanded from characters /// immediately following it which could be interpreted as part of the name. /// /// When braces are used, the matching ending brace is the first \c } not /// escaped by a backslash and not within an embedded variable expansion. /// Within braces only \c $, \c } and \c backslash are escaped by a /// backslash. There is no escaping outside braces, to stay comaptible /// with \c YUM (which does not support braces). /// ///
    ///
  • \c ${variable} /// If \c variable is unset the original is preserved like in \c YUM. /// Otherwise, the value of \c variable is substituted.
  • /// ///
  • \c ${variable:-word} (default value) /// If \c variable is unset or empty, the expansion of \c word is substituted. /// Otherwise, the value of \c variable is substituted.
  • /// ///
  • \c ${variable:+word} (alternate value) /// If variable is unset or empty nothing is substituted. /// Otherwise, the expansion of \c word is substituted.
  • ///
struct ZYPP_API RepoVarExpand { /** Function taking a variable name and returning a pointer to the variable value or \c nullptr if unset. */ using VarRetriever = function; /** Return a copy of \a value_r with embedded variables expanded. */ std::string operator()( const std::string & value_r, VarRetriever varRetriever_r ) const; /** \overload moving */ std::string operator()( std::string && value_r, VarRetriever varRetriever_r ) const; }; /** * \short Functor replacing repository variables * * Replaces the built-in '$arch', '$basearch' and '$releasever' ans also * custom repo variables (\see \ref zypp-repovars) in a string with the * assigned values. * * Additionally $releasever_major and $releasever_minor can be used * to refer to $releasever major number (everything up to the 1st \c '.' ) * and minor number (everything after the 1st \c '.' ). * * \note The $releasever value is overwritten by the environment * variable \c ZYPP_REPO_RELEASEVER. This might be handy for * distribution upogrades like this: * \code * $ export ZYPP_REPO_RELEASEVER=13.2 * $ zypper lr -u * $ zypper dup * ....upgrades to 13.2... * \endcode * The same can be achieved by using zyppers --releasever global option: * \code * $ zypper --releasever 13.2 lr -u * $ zypper --releasever 13.2 dup * ....upgrades to 13.2... * \endcode * (see \ref zypp-envars) * * \code * Example: * ftp://user:secret@site.net/$arch/ -> ftp://user:secret@site.net/i686/ * http://site.net/?basearch=$basearch -> http://site.net/?basearch=i386 * \endcode * * \see \ref RepoVarExpand for supported variable syntax. */ struct ZYPP_API RepoVariablesStringReplacer { std::string operator()( const std::string & value_r ) const; /** \overload moving */ std::string operator()( std::string && value_r ) const; }; /** * \short Functor replacing repository variables * * Replaces repository variables in the URL (except for user/pass inside authority) * \see RepoVariablesStringReplacer */ struct ZYPP_API RepoVariablesUrlReplacer { Url operator()( const Url & url_r ) const; }; } // namespace repo /////////////////////////////////////////////////////////////////// /** \relates RepoVariablesStringReplacer Helper managing repo variables replaced strings */ using RepoVariablesReplacedString = base::ValueTransform; /** \relates RepoVariablesStringReplacer Helper managing repo variables replaced string lists */ using RepoVariablesReplacedStringList = base::ContainerTransform, repo::RepoVariablesStringReplacer>; /** \relates RepoVariablesUrlReplacer Helper managing repo variables replaced urls */ using RepoVariablesReplacedUrl = base::ValueTransform; /** \relates RepoVariablesUrlReplacer Helper managing repo variables replaced url lists */ using RepoVariablesReplacedUrlList = base::ContainerTransform, repo::RepoVariablesUrlReplacer>; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif libzypp-17.36.5/zypp/repo/SUSEMediaVerifier.cc000066400000000000000000000163331476576476200211150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include using std::endl; namespace zypp { namespace repo { /////////////////////////////////////////////////////////////////// /// Data parsed from a media.1/media file /// struct SMVData { SMVData( const Pathname & path_r ) { std::ifstream inp( path_r.c_str() ); if ( !inp ) { ERR << "Can't setup a SUSEMediaVerifier from file: " << path_r.asString() << endl; return; } getline( inp, _mediaVendor ); getline( inp, _mediaIdent ); std::string buffer; getline( inp, buffer ); str::strtonum( buffer, _totalMedia ); //if ( !_totalMedia ) _totalMedia = 1; } /** Validate object in a boolean context: valid */ explicit operator bool() const { return valid(); } /** Data considered to be valid if we have vendor and ident. */ bool valid() const { return ! (_mediaVendor.empty() || _mediaIdent.empty()); } /** Whether \a rhs belongs to the same media set. */ bool matches( const SMVData & rhs ) const { return valid() && rhs._mediaVendor == _mediaVendor && rhs._mediaIdent == _mediaIdent; } std::string _mediaVendor; std::string _mediaIdent; media::MediaNr _totalMedia = 0; }; /** \relates SMVData Stream output */ inline std::ostream & operator<<( std::ostream & str, const SMVData & obj ) { return str << "[" << obj._mediaVendor << "|" << obj._mediaIdent << "/" << obj._totalMedia << "]"; } /////////////////////////////////////////////////////////////////// /// SUSEMediaVerifier::Impl /// /// Data parsed from the media.1/media file can be shared among different /// verifiers for this media. /// /// This type of verifier however is convenience to tell in advance if the /// wrong media is inserted. Errors when retrieving the data are logged, /// but won't let any verification fail. If the medium happens to be right, /// everything is fine. If it's wrong, download time will tell. /// class SUSEMediaVerifier::Impl { public: Impl( const Pathname & path_r, media::MediaNr mediaNr_r ) : _smvData { new SMVData( path_r ) } , _mediaNr { mediaNr_r } {} Impl( const Impl & rhs, media::MediaNr mediaNr_r ) : _smvData { rhs._smvData } , _mediaNr { mediaNr_r } {} const SMVData & smvData() const { return *_smvData; } media::MediaNr mediaNr() const { return _mediaNr; } Pathname mediaFilePath( media::MediaNr mediaNr_r = 0 ) const { str::Format fmt { "/media.%d/media" }; fmt % str::numstring( mediaNr_r ? mediaNr_r : _mediaNr ); return fmt.str(); } std::string expectedAsUserString() const { // Translator: %1% the expected medium number; %2% the total number of media in the set; %3% the ident file on the medium. str::Format fmt { _("Expected medium %1%/%2% identified by file '%3%' with content:") }; return str::Str() << ( fmt % mediaNr() % smvData()._totalMedia % mediaFilePath() ) << endl << " " << smvData()._mediaVendor << endl << " " << smvData()._mediaIdent; } private: shared_ptr _smvData; media::MediaNr _mediaNr = 1; }; /** \relates SUSEMediaVerifier::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const SUSEMediaVerifier::Impl & obj ) { return str << obj.smvData() << "(" << obj.mediaNr() << ")"; } /////////////////////////////////////////////////////////////////// // SUSEMediaVerifier /////////////////////////////////////////////////////////////////// SUSEMediaVerifier::SUSEMediaVerifier( const Pathname & path_r, media::MediaNr mediaNr_r ) : _pimpl { new Impl( path_r, mediaNr_r ) } {} SUSEMediaVerifier::SUSEMediaVerifier( const SUSEMediaVerifier & rhs, media::MediaNr mediaNr_r ) : _pimpl { new Impl( *rhs._pimpl, mediaNr_r ) } {} SUSEMediaVerifier::~SUSEMediaVerifier() {} bool SUSEMediaVerifier::valid() const { return _pimpl->smvData().valid(); } const std::string & SUSEMediaVerifier::vendor() const { return _pimpl->smvData()._mediaVendor; } const std::string & SUSEMediaVerifier::ident() const { return _pimpl->smvData()._mediaIdent; } media::MediaNr SUSEMediaVerifier::totalMedia() const { return _pimpl->smvData()._totalMedia; } media::MediaNr SUSEMediaVerifier::mediaNr() const { return _pimpl->mediaNr(); } bool SUSEMediaVerifier::isDesiredMedia( const media::MediaHandler & ref ) const { bool ret = true; // optimistic return unless we definitely know it does not match const SMVData & smvData = _pimpl->smvData(); if ( ! smvData ) return ret; // we have no valid data // bsc#1180851: If there is just one not-volatile medium in the set // tolerate a missing (vanished) media identifier and let the URL rule. bool relaxed = smvData._totalMedia == 1 && ! Url::schemeIsVolatile( ref.protocol() ); SEC << smvData << endl; SEC << ref.protocol() << " " << Url::schemeIsVolatile( ref.protocol() ) << endl; // if we have a downloading URL and can do relaxed verification we do not check the media file again if ( relaxed && Url::schemeIsDownloading( ref.protocol() ) ) { DBG << "Skipping verification due to downloading medium" << std::endl; return ret; } Pathname mediaFile { _pimpl->mediaFilePath() }; try { ref.provideFile( OnMediaLocation(mediaFile) ); mediaFile = ref.localPath( mediaFile ); } catch ( media::MediaFileNotFoundException & excpt_r ) { if ( relaxed ) { ZYPP_CAUGHT( excpt_r ); return ret; } excpt_r.addHistory( _pimpl->expectedAsUserString() ); ZYPP_RETHROW( excpt_r ); } catch ( media::MediaNotAFileException & excpt_r ) { if ( relaxed ) { ZYPP_CAUGHT( excpt_r ); return ret; } excpt_r.addHistory( _pimpl->expectedAsUserString() ); ZYPP_CAUGHT( excpt_r ); return ret; } SMVData remote { mediaFile }; ret = smvData.matches( remote ); if ( ! ret ) { DBG << "expect: " << smvData << " medium " << mediaNr() << endl; DBG << "remote: " << remote << endl; } return ret; } std::ostream & operator<<( std::ostream & str, const SUSEMediaVerifier & obj ) { return str << *obj._pimpl; } } // namespace repo } // namespace zypp libzypp-17.36.5/zypp/repo/SUSEMediaVerifier.h000066400000000000000000000056411476576476200207570ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_SUSE_MEDIAVERIFIER_H #define ZYPP_SUSE_MEDIAVERIFIER_H #include #include #include #include namespace zypp { namespace repo { /////////////////////////////////////////////////////////////////// /// /// \short Implementation of the traditional SUSE media verifier /// class SUSEMediaVerifier : public media::MediaVerifierBase { public: /** Ctor creating a verifier by parsing media file * * \param path_r Path to media.1/media kind file */ explicit SUSEMediaVerifier( const Pathname & path_r, media::MediaNr mediaNr_r = 1 ); /** Ctor cloning a verifier for a different \a mediaNr_r * * \param path_r Path to media.1/media kind file */ SUSEMediaVerifier( const SUSEMediaVerifier & rhs, media::MediaNr mediaNr_r ); /** Dtor */ ~SUSEMediaVerifier() override; public: /** Validate object in a boolean context: valid */ explicit operator bool() const { return valid(); } /** Data considered to be valid if we have vendor and ident. */ bool valid() const; /** Medias expected vendor string. */ const std::string & vendor() const; /** Medias expected ident string. */ const std::string & ident() const; /** The total number of media in this set (or 0 if not known). */ media::MediaNr totalMedia() const; /** Media number expected by this verifier (starts with 1). */ media::MediaNr mediaNr() const; public: /** Check if \ref_r accesses the desired media. * * The check is optimistic. If we can't get reliable data from the server, * we nevertheless assume the media is valid. File downloads will fail if * this was not true. */ bool isDesiredMedia( const media::MediaHandler & ref_r ) const override; public: class Impl; ///< Implementation class. friend std::ostream & operator<<( std::ostream & str, const SUSEMediaVerifier & obj ); private: RW_pointer _pimpl; ///< Pointer to implementation. }; /** \relates SUSEMediaVerifier Stream output */ //std::ostream & operator<<( std::ostream & str, const SUSEMediaVerifier & obj ); } // namespace repo } // namespace zypp #endif libzypp-17.36.5/zypp/repo/ServiceType.cc000066400000000000000000000040341476576476200201370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include #include #include #include #include "ServiceType.h" namespace zypp { namespace repo { /////////////////////////////////////////////////////////////////// namespace { static NamedValue & table() { static NamedValue & _t( *new NamedValue ); if ( _t.empty() ) { _t( ServiceType::RIS_e ) | "ris" |"RIS"|"nu"|"NU"; _t( ServiceType::PLUGIN_e ) | "plugin" |"PLUGIN"; _t( ServiceType::NONE_e ) | "N/A" |"n/a"|"NONE"|"none"; } return _t; } } // namespace /////////////////////////////////////////////////////////////////// const ServiceType ServiceType::RIS(ServiceType::RIS_e); const ServiceType ServiceType::NONE(ServiceType::NONE_e); const ServiceType ServiceType::PLUGIN(ServiceType::PLUGIN_e); ServiceType::ServiceType(const std::string & strval_r) : _type(parse(strval_r)) {} ServiceType::Type ServiceType::parse(const std::string & strval_r) { ServiceType::Type type; if ( ! table().getValue( str::toLower( strval_r ), type ) ) { ZYPP_THROW( RepoUnknownTypeException( "Unknown service type '" + strval_r + "'") ); } return type; } const std::string & ServiceType::asString() const { return table().getName( _type ); } } // ns repo } // ns zypp // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/repo/ServiceType.h000066400000000000000000000042461476576476200200060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_SERVICE_TYPE_H_ #define ZYPP_SERVICE_TYPE_H_ #include #include namespace zypp { namespace repo { /** * \short Service type enumeration * * Currently we have only RIS service, but more can come later. */ struct ZYPP_API ServiceType { /** * Repository Index Service (RIS) * (formerly known as 'Novell Update' (NU) service) */ static const ServiceType RIS ZYPP_API; /** No service set. */ static const ServiceType NONE ZYPP_API; /** * Plugin services are scripts installed on * your system that provide the package manager with * repositories. * * The mechanism used to create this repository list * is completely up to the script */ static const ServiceType PLUGIN ZYPP_API; enum Type { NONE_e, RIS_e, PLUGIN_e, }; ServiceType() : _type(NONE_e) {} ServiceType(Type type) : _type(type) {} explicit ServiceType(const std::string & strval_r); Type toEnum() const { return _type; } ServiceType::Type parse(const std::string & strval_r); const std::string & asString() const; Type _type; }; inline std::ostream & operator<<( std::ostream & str, const ServiceType & obj ) { return str << obj.asString(); } inline bool operator==(const ServiceType & obj1, const ServiceType & obj2) { return obj1._type == obj2._type; } inline bool operator!=(const ServiceType & obj1, const ServiceType & obj2) { return ! (obj1 == obj2); } } // ns repo } // ns zypp #endif /* ZYPP_SERVICE_TYPE_H_ */ // vim: set ts=2 sts=2 sw=2 et ai: libzypp-17.36.5/zypp/repo/SrcPackageProvider.cc000066400000000000000000000030001476576476200214030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/SrcPackageProvider.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace repo { SrcPackageProvider::SrcPackageProvider( repo::RepoMediaAccess & access_r ) : _access( access_r ) {} SrcPackageProvider::~SrcPackageProvider() {} ManagedFile SrcPackageProvider::provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ) const { return _access.provideFile( srcPackage_r->repoInfo(), srcPackage_r->location() ); } } // namespace repo /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/repo/SrcPackageProvider.h000066400000000000000000000042461476576476200212620ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/repo/SrcPackageProvider.h * */ #ifndef ZYPP_REPO_SRCPACKAGEPROVIDER_H #define ZYPP_REPO_SRCPACKAGEPROVIDER_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace repo { ///////////////////////////////////////////////////////////////// class RepoMediaAccess; /////////////////////////////////////////////////////////////////// // // CLASS NAME : SrcPackageProvider // /** */ class ZYPP_API SrcPackageProvider : private base::NonCopyable { public: /** Ctor */ SrcPackageProvider( repo::RepoMediaAccess & access_r ); /** Dtor */ ~SrcPackageProvider(); public: /** Provide SrcPackage in a local file. */ ManagedFile provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ) const; private: RepoMediaAccess & _access; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace repo /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_REPO_SRCPACKAGEPROVIDER_H libzypp-17.36.5/zypp/repo/yum/000077500000000000000000000000001476576476200161775ustar00rootroot00000000000000libzypp-17.36.5/zypp/repo/yum/RepomdFileCollector.cc000066400000000000000000000120251476576476200224030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #include "RepomdFileCollector.h" #include #include #include #include namespace zypp::env { bool ZYPP_REPOMD_WITH_OTHER() { static bool val = [](){ const char * env = getenv("ZYPP_REPOMD_WITH_OTHER"); return( env && zypp::str::strToBool( env, true ) ); }(); return val; } bool ZYPP_REPOMD_WITH_FILELISTS() { static bool val = [](){ const char * env = getenv("ZYPP_REPOMD_WITH_FILELISTS"); return( env && zypp::str::strToBool( env, true ) ); }(); return val; } } namespace zypp::repo::yum { namespace { inline OnMediaLocation loc_with_path_prefix( OnMediaLocation loc_r, const Pathname & prefix_r ) { if ( ! prefix_r.empty() && prefix_r != "/" ) loc_r.changeFilename( prefix_r / loc_r.filename() ); return loc_r; } // search old repository file to run the delta algorithm on Pathname search_deltafile( const Pathname & dir, const Pathname & file ) { Pathname deltafile; if ( ! PathInfo(dir).isDir() ) return deltafile; // Strip the checksum preceding the file stem so we can look for an // old *-primary.xml which may contain some reusable blocks. std::string base { file.basename() }; size_t hypoff = base.find( '-' ); if ( hypoff != std::string::npos ) base.replace( 0, hypoff + 1, "" ); std::list retlist; if ( ! filesystem::readdir( retlist, dir, false ) ) { for ( const auto & fn : retlist ) { if ( str::endsWith( fn, base ) ) deltafile = fn; } } if ( !deltafile.empty() ) return dir/deltafile; return deltafile; } } // namespace /** * \class RepomdFileCollector * \brief Helper filtering the files offered by a RepomdFileReader * * Collected files from repomd.xml: * File types: * type (plain) * type_db (sqlite, ignored by zypp) * type_zck (zchunk, preferred) * Localized type: * susedata.LOCALE */ RepomdFileCollector::RepomdFileCollector( const Pathname &destDir_r ) : _destDir { destDir_r } { addWantedLocale( ZConfig::instance().textLocale() ); for ( const Locale & it : ZConfig::instance().repoRefreshLocales() ) addWantedLocale( it ); } RepomdFileCollector::~RepomdFileCollector() { } /** The callback invoked by the RepomdFileReader. * It's a pity, but in the presence of separate "type" and "type_zck" entries, * we have to scan the whole file before deciding what to download.... */ bool RepomdFileCollector::collect(const OnMediaLocation &loc_r, const std::string &typestr_r) { if ( str::endsWith( typestr_r, "_db" ) ) return true; // skip sqlitedb bool zchk { str::endsWith( typestr_r, "_zck" ) }; #if defined(LIBSOLVEXT_FEATURE_ZCHUNK_COMPRESSION) const std::string & basetype { zchk ? typestr_r.substr( 0, typestr_r.size()-4 ) : typestr_r }; #else if ( zchk ) return true; // skip zchunk if not supported by libsolv const std::string & basetype { typestr_r }; #endif // filter well known resource types if ( basetype == "other" && not env::ZYPP_REPOMD_WITH_OTHER() ) return true; // skip it if ( basetype == "filelists" && not env::ZYPP_REPOMD_WITH_FILELISTS() ) return true; // skip it // filter localized susedata if ( str::startsWith( basetype, "susedata." ) ) { // susedata.LANG if ( ! wantLocale( Locale(basetype.c_str()+9) ) ) return true; // skip it } // may take it... (prefer zchnk) if ( zchk || !_wantedFiles.count( basetype ) ) _wantedFiles[basetype] = loc_r; return true; } void RepomdFileCollector::finalize(const FinalizeCb &cb) { // schedule fileS for download for ( const auto & el : _wantedFiles ) { const OnMediaLocation & loc { el.second }; const OnMediaLocation & loc_with_path { loc_with_path_prefix( loc, repoInfo().path() ) }; cb( OnMediaLocation(loc_with_path).setDeltafile( search_deltafile( deltaDir()/"repodata", loc.filename() ) ) ); } } bool RepomdFileCollector::wantLocale(const Locale &locale_r) const { return _wantedLocales.count( locale_r ); } void RepomdFileCollector::addWantedLocale(Locale locale_r) { while ( locale_r ) { _wantedLocales.insert( locale_r ); locale_r = locale_r.fallback(); } } } libzypp-17.36.5/zypp/repo/yum/RepomdFileCollector.h000066400000000000000000000032351476576476200222500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_SOURCE_YUM_REPOMDFILECOLLECTOR #define ZYPP_SOURCE_YUM_REPOMDFILECOLLECTOR #include #include #include #include #include #include #include namespace zypp::repo::yum { struct RepomdFileCollector { NON_COPYABLE( RepomdFileCollector ); NON_MOVABLE( RepomdFileCollector ); using FinalizeCb = std::function; RepomdFileCollector( const Pathname & destDir_r ); virtual ~RepomdFileCollector(); bool collect( const OnMediaLocation & loc_r, const std::string & typestr_r ); void finalize( const FinalizeCb &cb ); protected: virtual const RepoInfo &repoInfo() const = 0; virtual const Pathname &deltaDir() const = 0; private: bool wantLocale( const Locale & locale_r ) const; void addWantedLocale( Locale locale_r ); protected: const Pathname & _destDir; LocaleSet _wantedLocales; ///< Locales do download std::map _wantedFiles; }; } #endif libzypp-17.36.5/zypp/sat/000077500000000000000000000000001476576476200152075ustar00rootroot00000000000000libzypp-17.36.5/zypp/sat/FileConflicts.cc000066400000000000000000000144241476576476200202470ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/FileConflicts.cc */ #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { std::string FileConflicts::Conflict::asUserString() const { if ( lhsFilename() == rhsFilename() ) { static const char * text[2][2] = {{ // [lhs][rhs] 0 = installed; 1 = to be installed // TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) N_( "File %1%\n" " from package\n" " %2%\n" " conflicts with file from package\n" " %3%" ), // TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) N_( "File %1%\n" " from package\n" " %2%\n" " conflicts with file from install of\n" " %3%" ) },{ // TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) N_( "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from package\n" " %3%" ), // TranslatorExplanation %1%(filename) %2%(package1) %3%(package2) N_( "File %1%\n" " from install of\n" " %2%\n" " conflicts with file from install of\n" " %3%" ) }}; return str::Format( text[lhsSolvable().isSystem()?0:1][rhsSolvable().isSystem()?0:1] ) % lhsFilename() % lhsSolvable().asUserString() % rhsSolvable().asUserString(); } else { static const char * text[2][2] = {{ // [lhs][rhs] 0 = installed; 1 = to be installed // TranslatorExplanation %1%(filename1) %2%(package1) %%3%(filename2) 4%(package2) N_( "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" ), // TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) N_( "File %1%\n" " from package\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" ) },{ // TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) N_( "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from package\n" " %4%" ), // TranslatorExplanation %1%(filename1) %2%(package1) %3%(filename2) %4%(package2) N_( "File %1%\n" " from install of\n" " %2%\n" " conflicts with file\n" " %3%\n" " from install of\n" " %4%" ) }}; return str::Format( text[lhsSolvable().isSystem()?0:1][rhsSolvable().isSystem()?0:1] ) % lhsFilename() % lhsSolvable().asUserString() % rhsFilename() % rhsSolvable().asUserString(); } } std::ostream & operator<<( std::ostream & str, const FileConflicts & obj ) { return dumpRange( str << "(" << obj.size() << ") ", obj.begin(), obj.end() ); } std::ostream & operator<<( std::ostream & str, const FileConflicts::Conflict & obj ) { if ( obj.lhsFilename() == obj.rhsFilename() ) return str << str::Format( "%s:\n %s[%s]\n %s[%s]" ) % obj.lhsFilename() % obj.lhsSolvable() % obj.lhsFilemd5() % obj.rhsSolvable() % obj.rhsFilemd5(); return str << str::Format( "%s - %s:\n %s[%s]\n %s[%s]" ) % obj.lhsFilename() % obj.rhsFilename() % obj.lhsSolvable() % obj.lhsFilemd5() % obj.rhsSolvable() % obj.rhsFilemd5(); } std::ostream & dumpAsXmlOn( std::ostream & str, const FileConflicts & obj ) { xmlout::Node guard( str, "fileconflicts", { "size", obj.size() } ); if ( ! obj.empty() ) { *guard << "\n"; for ( const auto & el : obj ) dumpAsXmlOn( *guard, el ) << "\n"; } return str; } namespace { std::ostream & dumpAsXmlHelper( std::ostream & str, const std::string & tag_r, IdString filename_r, IdString md5sum_r, Solvable solv_r ) { xmlout::Node guard( str, tag_r ); *xmlout::Node( *guard, "file" ) << filename_r; dumpAsXmlOn( *guard, CheckSum( md5sum_r.asString() ) ); dumpAsXmlOn( *guard, solv_r ); return str; } } std::ostream & dumpAsXmlOn( std::ostream & str, const FileConflicts::Conflict & obj ) { xmlout::Node guard( str, "fileconflict" ); dumpAsXmlHelper( *guard<<"\n", "lhs", obj.lhsFilename(), obj.lhsFilemd5(), obj.lhsSolvable() ); dumpAsXmlHelper( *guard<<"\n", "rhs", obj.rhsFilename(), obj.rhsFilemd5(), obj.rhsSolvable() ); return str; } } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/FileConflicts.h000066400000000000000000000074211476576476200201100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/FileConflicts.h */ #ifndef ZYPP_SAT_FILECONFLICTS_H #define ZYPP_SAT_FILECONFLICTS_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { /////////////////////////////////////////////////////////////////// /// \class FileConflicts /// \brief Libsolv queue representing file conflicts. /////////////////////////////////////////////////////////////////// class ZYPP_API FileConflicts : private Queue { friend bool operator==( const FileConflicts & lhs, const FileConflicts & rhs ); static constexpr size_type queueBlockSize = 6; public: /** * \class Conflict * \brief A file conflict. */ struct Conflict { IdString lhsFilename() const { return IdString( _data[0] ); } Solvable lhsSolvable() const { return Solvable( _data[1] ); } IdString lhsFilemd5() const { return IdString( _data[2] ); } IdString rhsFilename() const { return IdString( _data[3] ); } Solvable rhsSolvable() const { return Solvable( _data[4] ); } IdString rhsFilemd5() const { return IdString( _data[5] ); } /** Ready to use (translated) string describing the Conflict */ std::string asUserString() const; private: detail::IdType _data[queueBlockSize]; }; public: using Queue::size_type; using value_type = Conflict; using const_iterator = const value_type *; using Queue::empty; size_type size() const { return Queue::size()/queueBlockSize; } const_iterator begin() const { return reinterpret_cast(Queue::begin()); } const_iterator end() const { return reinterpret_cast(Queue::end()); } public: using Queue::operator detail::CQueue *; ///< libsolv backdoor using Queue::operator const detail::CQueue *; ///< libsolv backdoor }; /** \relates FileConflicts Stream output */ std::ostream & operator<<( std::ostream & str, const FileConflicts & obj ) ZYPP_API; /** \relates FileConflicts::Conflict Stream output */ std::ostream & operator<<( std::ostream & str, const FileConflicts::Conflict & obj ) ZYPP_API; /** \relates FileConflicts XML output */ std::ostream & dumpAsXmlOn( std::ostream & str, const FileConflicts & obj ) ZYPP_API; /** \relates FileConflicts::Conflict XML output */ std::ostream & dumpAsXmlOn( std::ostream & str, const FileConflicts::Conflict & obj ) ZYPP_API; /** \relates FileConflicts */ inline bool operator==( const FileConflicts & lhs, const FileConflicts & rhs ) { return static_cast(lhs) == static_cast(rhs); } /** \relates FileConflicts */ inline bool operator!=( const FileConflicts & lhs, const FileConflicts & rhs ) { return !( lhs == rhs ); } } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_FILECONFLICTS_H libzypp-17.36.5/zypp/sat/LocaleSupport.cc000066400000000000000000000037471476576476200203250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/LocaleSupport.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const LocaleSupport & obj ) { return str << obj.locale() << '(' << (obj.isAvailable()?'a':'_') << (obj.isRequested()?'R':'_') << ')'; } /****************************************************************** ** ** FUNCTION NAME : dumpOn ** FUNCTION TYPE : std::ostream & */ std::ostream & dumpOn( std::ostream & str, const LocaleSupport & obj ) { return dumpRange( str << obj, obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/LocaleSupport.h000066400000000000000000000115701476576476200201600ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/LocaleSupport.h * */ #ifndef ZYPP_SAT_LOCALESUPPORT_H #define ZYPP_SAT_LOCALESUPPORT_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : LocaleSupport // /** Convenience methods to manage support for a specific \ref Locale. * * \code * sat::LocaleSupport myLocale( Locale("de") ); * * if ( myLocale.isAvailable() ) * { * MIL << "Support for locale '" << myLocale.locale() << "' is available." << endl; * } * if ( ! myLocale.isRequested() ) * { * MIL << "Will enable support for locale '" << myLocale.locale() << "'." << endl; * myLocale.setRequested( true ); * } * MIL << "Packages supporting locale '" << myLocale.locale() << "':" << endl; * for_( it, myLocale.begin(), myLocale.end() ) * { * // iterate over sat::Solvables * MIL << " " << *it << endl; * // or get the PoolItems * DBG << " " << PoolItem(*it) << endl; * } * \endcode * * \todo If iterator is too slow install a proxy watching the Pool::serial. */ class LocaleSupport : public SolvIterMixin > , protected detail::PoolMember { public: /** Default ctor */ LocaleSupport() {} /** Ctor taking a \ref Locale. */ LocaleSupport( const Locale & locale_r ) : _locale( locale_r ) {} public: /** My \ref Locale */ const Locale & locale() const { return _locale; } /** Whether there are language specific packages supporting my \ref Locale. */ bool isAvailable() const { return Pool(*this).isAvailableLocale( _locale ); } /** Whether the solver will automatically select language specific packages for my \ref Locale. */ bool isRequested() const { return Pool(*this).isRequestedLocale( _locale ); } /** Turn on/off solver support for my \ref Locale.*/ void setRequested( bool yesno_r ) { yesno_r ? Pool(*this).addRequestedLocale( _locale ) : Pool(*this).eraseRequestedLocale( _locale ); } public: /** \name Iterate through all \ref sat::Solvables supporting my \ref Locale. */ //@{ using iterator = Solvable_iterator; // from SolvIterMixin iterator begin() const { return Pool(*this).filterBegin( filter::ByLocaleSupport( _locale ) ); } iterator end() const { return Pool(*this).filterEnd( filter::ByLocaleSupport( _locale ) ); } //@} private: Locale _locale; }; /////////////////////////////////////////////////////////////////// /** \relates LocaleSupport Stream output */ std::ostream & operator<<( std::ostream & str, const LocaleSupport & obj ); /** \relates LocaleSupport More verbose stream output including dependencies */ std::ostream & dumpOn( std::ostream & str, const LocaleSupport & obj ); /** \relates LocaleSupport */ inline bool operator==( const LocaleSupport & lhs, const LocaleSupport & rhs ) { return lhs.locale() == rhs.locale(); } /** \relates LocaleSupport */ inline bool operator!=( const LocaleSupport & lhs, const LocaleSupport & rhs ) { return lhs.locale() != rhs.locale(); } /** \relates LocaleSupport */ inline bool operator<( const LocaleSupport & lhs, const LocaleSupport & rhs ) { return lhs.locale() < rhs.locale(); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_LOCALESUPPORT_H libzypp-17.36.5/zypp/sat/LookupAttr.cc000066400000000000000000000603531476576476200176310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/LookupAttr.cc * */ #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// using detail::noSolvableId; /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupAttr::Impl // /////////////////////////////////////////////////////////////////// /** * LookupAttr implememtation. * * Repository and Solvable must not be set at the same time! * * \note When looking in pool or repo, \ref Solvable \c _solv is * somewhat abused to store eiter \c Id \c 0 or \c SOLVID_META, which * indicates whether the dataiterator should look into solvable or * repository metadata. Remember that all \ref Solvables with an * \e invalid \c Id, are treated as == Solvable::noSolvable, * and in a boolean context evaluate to \c false. Thus \c noSolvable * may have different \c Ids. */ class LookupAttr::Impl { public: Impl() : _parent( SolvAttr::noAttr ) {} Impl( const SolvAttr& attr_r, Location loc_r ) : _attr( attr_r ), _parent( attr_r.parent() ), _solv( loc_r == REPO_ATTR ? SOLVID_META : noSolvableId ) {} Impl( const SolvAttr& attr_r, Repository repo_r, Location loc_r ) : _attr( attr_r ), _parent( attr_r.parent() ), _repo( repo_r ), _solv( loc_r == REPO_ATTR ? SOLVID_META : noSolvableId ) {} Impl( const SolvAttr& attr_r, Solvable solv_r ) : _attr( attr_r ), _parent( attr_r.parent() ), _solv( solv_r ) {} public: SolvAttr attr() const { return _attr; } void setAttr( SolvAttr attr_r ) { _attr = std::move(attr_r); SolvAttr p( _attr.parent() ); if ( p != SolvAttr::noAttr ) _parent = p; } const StrMatcher & strMatcher() const { return _strMatcher; } void setStrMatcher( const StrMatcher & matcher_r ) { matcher_r.compile(); _strMatcher = matcher_r; } public: bool pool() const { return ! (_repo || _solv); } void setPool( Location loc_r ) { _repo = Repository::noRepository; _solv = Solvable( loc_r == REPO_ATTR ? SOLVID_META : noSolvableId ); } Repository repo() const { return _repo; } void setRepo( Repository repo_r, Location loc_r ) { _repo = repo_r; _solv = Solvable( loc_r == REPO_ATTR ? SOLVID_META : noSolvableId ); } Solvable solvable() const { return _solv; } void setSolvable( Solvable solv_r ) { _repo = Repository::noRepository; _solv = solv_r; } SolvAttr parent() const { return _parent; } void setParent( SolvAttr attr_r ) { _parent = std::move(attr_r); } public: LookupAttr::iterator begin() const { if ( _attr == SolvAttr::noAttr || sat::Pool::instance().reposEmpty() ) return end(); detail::RepoIdType whichRepo = detail::noRepoId; // all repos if ( _solv ) whichRepo = _solv.repository().id(); else if ( _repo ) whichRepo = _repo.id(); detail::DIWrap dip( whichRepo, _solv.id(), _attr.id(), _strMatcher.searchstring(), _strMatcher.flags().get() ); if ( _parent != SolvAttr::noAttr ) ::dataiterator_prepend_keyname( dip.get(), _parent.id() ); return iterator( dip ); // iterator takes over ownership! } LookupAttr::iterator end() const { return iterator(); } private: SolvAttr _attr; SolvAttr _parent; Repository _repo; Solvable _solv; StrMatcher _strMatcher; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupAttr // /////////////////////////////////////////////////////////////////// LookupAttr::LookupAttr() : _pimpl( new Impl ) {} LookupAttr::LookupAttr( SolvAttr attr_r, Location loc_r ) : _pimpl( new Impl( std::move(attr_r), std::move(loc_r) ) ) {} LookupAttr::LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Location loc_r ) : _pimpl( new Impl( std::move(attr_r), std::move(loc_r) ) ) { _pimpl->setParent( std::move(parent_r) ); } LookupAttr::LookupAttr( SolvAttr attr_r, Repository repo_r, Location loc_r ) : _pimpl( new Impl( std::move(attr_r), std::move(repo_r), std::move(loc_r) ) ) {} LookupAttr::LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Repository repo_r, Location loc_r ) : _pimpl( new Impl( std::move(attr_r), std::move(repo_r), std::move(loc_r) ) ) { _pimpl->setParent( std::move(parent_r) ); } LookupAttr::LookupAttr( SolvAttr attr_r, Solvable solv_r ) : _pimpl( new Impl( std::move(attr_r), std::move(solv_r) ) ) {} LookupAttr::LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Solvable solv_r ) : _pimpl( new Impl( std::move(attr_r), std::move(solv_r) ) ) { _pimpl->setParent( std::move(parent_r) ); } /////////////////////////////////////////////////////////////////// SolvAttr LookupAttr::attr() const { return _pimpl->attr(); } void LookupAttr::setAttr( SolvAttr attr_r ) { _pimpl->setAttr( std::move(attr_r) ); } const StrMatcher & LookupAttr::strMatcher() const { return _pimpl->strMatcher(); } void LookupAttr::setStrMatcher( const StrMatcher & matcher_r ) { _pimpl->setStrMatcher( matcher_r ); } /////////////////////////////////////////////////////////////////// bool LookupAttr::pool() const { return _pimpl->pool(); } void LookupAttr::setPool( Location loc_r ) { _pimpl->setPool( loc_r ); } Repository LookupAttr::repo() const { return _pimpl->repo(); } void LookupAttr::setRepo( Repository repo_r, Location loc_r ) { _pimpl->setRepo( repo_r, loc_r ); } Solvable LookupAttr::solvable() const { return _pimpl->solvable(); } void LookupAttr::setSolvable( Solvable solv_r ) { _pimpl->setSolvable( solv_r ); } SolvAttr LookupAttr::parent() const { return _pimpl->parent(); } void LookupAttr::setParent( SolvAttr attr_r ) { _pimpl->setParent( std::move(attr_r) ); } /////////////////////////////////////////////////////////////////// LookupAttr::iterator LookupAttr::begin() const { return _pimpl->begin(); } LookupAttr::iterator LookupAttr::end() const { return _pimpl->end(); } bool LookupAttr::empty() const { return begin() == end(); } LookupAttr::size_type LookupAttr::size() const { size_type c = 0; for_( it, begin(), end() ) ++c; return c; } /////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const LookupAttr & obj ) { if ( obj.attr() == SolvAttr::noAttr ) return str << "search nothing"; if ( obj.attr() ) str << "search " << obj.attr() << " in "; else str << "search ALL in "; if ( obj.solvable() ) return str << obj.solvable(); if ( obj.repo() ) return str << obj.repo(); return str << "pool"; } std::ostream & dumpOn( std::ostream & str, const LookupAttr & obj ) { return dumpRange( str << obj, obj.begin(), obj.end() ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupRepoAttr // /////////////////////////////////////////////////////////////////// LookupRepoAttr::LookupRepoAttr( SolvAttr attr_r, Repository repo_r ) : LookupAttr( std::move(attr_r), repo_r, REPO_ATTR ) {} void LookupRepoAttr::setRepo( Repository repo_r ) { LookupAttr::setRepo( repo_r, REPO_ATTR ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : detail::DIWrap // /////////////////////////////////////////////////////////////////// namespace detail { DIWrap::DIWrap( RepoIdType repoId_r, SolvableIdType solvId_r, IdType attrId_r, std::string mstring_r, int flags_r ) : _dip( new ::Dataiterator ) , _mstring(std::move( mstring_r )) { ::dataiterator_init( _dip, sat::Pool::instance().get(), repoId_r, solvId_r, attrId_r, _mstring.empty() ? 0 : _mstring.c_str(), flags_r ); } DIWrap::DIWrap( RepoIdType repoId_r, SolvableIdType solvId_r, IdType attrId_r, const char * mstring_r, int flags_r ) : _dip( new ::Dataiterator ) , _mstring( mstring_r ? mstring_r : "" ) { ::dataiterator_init( _dip, sat::Pool::instance().get(), repoId_r, solvId_r, attrId_r, _mstring.empty() ? 0 : _mstring.c_str(), flags_r ); } DIWrap::DIWrap( const DIWrap & rhs ) : _dip( 0 ) , _mstring( rhs._mstring ) { if ( rhs._dip ) { _dip = new ::Dataiterator; ::dataiterator_init_clone( _dip, rhs._dip ); ::dataiterator_strdup( _dip ); } } DIWrap::~DIWrap() { if ( _dip ) { ::dataiterator_free( _dip ); delete _dip; } } std::ostream & operator<<( std::ostream & str, const DIWrap & obj ) { return str << obj.get(); } } /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupAttr::iterator // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // position and moving /////////////////////////////////////////////////////////////////// Repository LookupAttr::iterator::inRepo() const { return _dip ? Repository( _dip->repo ) : Repository::noRepository; } Solvable LookupAttr::iterator::inSolvable() const { return _dip ? Solvable( _dip->solvid ) : Solvable::noSolvable; } SolvAttr LookupAttr::iterator::inSolvAttr() const { return _dip ? SolvAttr( _dip->key->name ) : SolvAttr::noAttr; } void LookupAttr::iterator::nextSkipSolvAttr() { if ( _dip ) ::dataiterator_skip_attribute( _dip.get() ); } void LookupAttr::iterator::nextSkipSolvable() { if ( _dip ) ::dataiterator_skip_solvable( _dip.get() ); } void LookupAttr::iterator::nextSkipRepo() { if ( _dip ) ::dataiterator_skip_repo( _dip.get() ); } void LookupAttr::iterator::stayInThisSolvable() { if ( _dip ) { _dip.get()->repoid = -1; _dip.get()->flags |= SEARCH_THISSOLVID; } } void LookupAttr::iterator::stayInThisRepo() { if ( _dip ) { _dip.get()->repoid = -1; } } /////////////////////////////////////////////////////////////////// // attr value type test /////////////////////////////////////////////////////////////////// detail::IdType LookupAttr::iterator::solvAttrType() const { return _dip ? _dip->key->type : detail::noId; } bool LookupAttr::iterator::solvAttrNumeric() const { switch ( solvAttrType() ) { case REPOKEY_TYPE_NUM: case REPOKEY_TYPE_CONSTANT: return true; break; } return false; } bool LookupAttr::iterator::solvAttrString() const { switch ( solvAttrType() ) { case REPOKEY_TYPE_ID: case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_CONSTANTID: case REPOKEY_TYPE_STR: case REPOKEY_TYPE_DIRSTRARRAY: return true; break; } return false; } bool LookupAttr::iterator::solvAttrIdString() const { switch ( solvAttrType() ) { case REPOKEY_TYPE_ID: case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_CONSTANTID: return true; break; } return false; } bool LookupAttr::iterator::solvAttrCheckSum() const { switch ( solvAttrType() ) { case REPOKEY_TYPE_MD5: case REPOKEY_TYPE_SHA1: case REPOKEY_TYPE_SHA256: return true; break; } return false; } /////////////////////////////////////////////////////////////////// namespace { enum SubType { ST_NONE, // no sub-structure ST_FLEX, // flexarray ST_SUB }; // inside sub-structure SubType subType( const detail::DIWrap & dip ) { if ( ! dip ) return ST_NONE; if ( dip.get()->key->type == REPOKEY_TYPE_FLEXARRAY ) return ST_FLEX; return dip.get()->kv.parent ? ST_SUB : ST_NONE; } } /////////////////////////////////////////////////////////////////// bool LookupAttr::iterator::solvAttrSubEntry() const { return subType( _dip ) != ST_NONE; } /////////////////////////////////////////////////////////////////// // Iterate sub-structures. /////////////////////////////////////////////////////////////////// bool LookupAttr::iterator::subEmpty() const { return( subBegin() == subEnd() ); } LookupAttr::size_type LookupAttr::iterator::subSize() const { size_type c = 0; for_( it, subBegin(), subEnd() ) ++c; return c; } LookupAttr::iterator LookupAttr::iterator::subBegin() const { SubType subtype( subType( _dip ) ); if ( subtype == ST_NONE ) return subEnd(); // setup the new sub iterator with the remembered position detail::DIWrap dip( 0, 0, 0 ); ::dataiterator_clonepos( dip.get(), _dip.get() ); switch ( subtype ) { case ST_NONE: // not reached break; case ST_FLEX: ::dataiterator_seek( dip.get(), DI_SEEK_CHILD|DI_SEEK_STAY ); break; case ST_SUB: ::dataiterator_seek( dip.get(), DI_SEEK_REWIND|DI_SEEK_STAY ); break; } return iterator( dip ); // iterator takes over ownership! } LookupAttr::iterator LookupAttr::iterator::subEnd() const { return iterator(); } LookupAttr::iterator LookupAttr::iterator::subFind( const SolvAttr& attr_r ) const { iterator it = subBegin(); if ( attr_r != sat::SolvAttr::allAttr ) { while ( it != subEnd() && it.inSolvAttr() != attr_r ) ++it; } return it; } LookupAttr::iterator LookupAttr::iterator::subFind( const C_Str & attrname_r ) const { if ( attrname_r.empty() ) return subBegin(); SubType subtype( subType( _dip ) ); if ( subtype == ST_NONE ) return subBegin(); std::string subattr( inSolvAttr().asString() ); if ( subtype == ST_FLEX ) { // append ":attrname" subattr += ":"; subattr += attrname_r; } else { // replace "oldname" after ':' with "attrname" std::string::size_type pos( subattr.rfind( ':' ) ); if ( pos != std::string::npos ) { subattr.erase( pos+1 ); subattr += attrname_r; } else subattr = attrname_r; // no ':' so replace all. } return subFind( SolvAttr( subattr ) ); } /////////////////////////////////////////////////////////////////// // attr value retrieval /////////////////////////////////////////////////////////////////// int LookupAttr::iterator::asInt() const { if ( _dip ) { switch ( solvAttrType() ) { case REPOKEY_TYPE_NUM: case REPOKEY_TYPE_CONSTANT: return _dip->kv.num; break; } } return 0; } unsigned LookupAttr::iterator::asUnsigned() const { return asInt(); } unsigned long long LookupAttr::iterator::asUnsignedLL() const { if ( _dip ) { switch ( solvAttrType() ) { case REPOKEY_TYPE_NUM: case REPOKEY_TYPE_CONSTANT: return SOLV_KV_NUM64(&_dip->kv); break; } } return 0; } bool LookupAttr::iterator::asBool() const { return asInt(); } const char * LookupAttr::iterator::c_str() const { if ( _dip ) { switch ( solvAttrType() ) { case REPOKEY_TYPE_ID: case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_CONSTANTID: if ( _dip->data && _dip->data->localpool ) return ::stringpool_id2str( &_dip->data->spool, _dip->kv.id ); // in local pool else return IdString( _dip->kv.id ).c_str(); // in global pool break; case REPOKEY_TYPE_STR: return _dip->kv.str; break; case REPOKEY_TYPE_DIRSTRARRAY: // may or may not be stringified depending on SEARCH_FILES flag return( _dip->flags & SEARCH_FILES ? _dip->kv.str : ::repodata_dir2str( _dip->data, _dip->kv.id, _dip->kv.str ) ); break; } } return 0; } std::string LookupAttr::iterator::asString() const { if ( _dip ) { switch ( solvAttrType() ) { case REPOKEY_TYPE_ID: case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_CONSTANTID: { detail::IdType id = ::repodata_globalize_id( _dip->data, _dip->kv.id, 1 ); return ISRELDEP(id) ? Capability( id ).asString() : IdString( id ).asString(); } break; case REPOKEY_TYPE_STR: case REPOKEY_TYPE_DIRSTRARRAY: { const char * ret( c_str() ); return ret ? ret : ""; } break; case REPOKEY_TYPE_NUM: case REPOKEY_TYPE_CONSTANT: return str::numstring( asInt() ); break; case REPOKEY_TYPE_MD5: case REPOKEY_TYPE_SHA1: case REPOKEY_TYPE_SHA256: { return asCheckSum().asString(); } break; case REPOKEY_TYPE_FLEXARRAY: { std::ostringstream str; str << "{" << endl; for_( it, subBegin(), subEnd() ) { str << " " << it.inSolvAttr() << " = " << it.asString() << endl; } str << "}"; return str.str(); } break; } } return std::string(); } IdString LookupAttr::iterator::idStr() const { if ( _dip ) { switch ( solvAttrType() ) { case REPOKEY_TYPE_ID: case REPOKEY_TYPE_IDARRAY: case REPOKEY_TYPE_CONSTANTID: return IdString( ::repodata_globalize_id( _dip->data, _dip->kv.id, 1 ) ); break; } } return IdString(); } CheckSum LookupAttr::iterator::asCheckSum() const { if ( _dip ) { switch ( solvAttrType() ) { case REPOKEY_TYPE_MD5: return CheckSum::md5( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) ); break; case REPOKEY_TYPE_SHA1: return CheckSum::sha1( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) ); break; case REPOKEY_TYPE_SHA224: return CheckSum::sha224( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) ); break; case REPOKEY_TYPE_SHA256: return CheckSum::sha256( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) ); break; case REPOKEY_TYPE_SHA384: return CheckSum::sha384( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) ); break; case REPOKEY_TYPE_SHA512: return CheckSum::sha512( ::repodata_chk2str( _dip->data, solvAttrType(), (unsigned char *)_dip->kv.str ) ); break; } } return CheckSum(); } /////////////////////////////////////////////////////////////////// // internal stuff below /////////////////////////////////////////////////////////////////// LookupAttr::iterator::iterator() : iterator_adaptor_( 0 ) {} LookupAttr::iterator::iterator( const iterator & rhs ) : iterator_adaptor_( 0 ) , _dip( rhs._dip ) { base_reference() = _dip.get(); } LookupAttr::iterator::iterator( detail::DIWrap & dip_r ) : iterator_adaptor_( 0 ) { _dip.swap( dip_r ); // take ownership! base_reference() = _dip.get(); increment(); } LookupAttr::iterator::~iterator() {} LookupAttr::iterator & LookupAttr::iterator::operator=( const iterator & rhs ) { if ( &rhs != this ) { _dip = rhs._dip; base_reference() = _dip.get(); } return *this; } /////////////////////////////////////////////////////////////////// bool LookupAttr::iterator::dip_equal( const detail::CDataiterator & lhs, const detail::CDataiterator & rhs ) const { // Iterator equal is same position in same container. // Here: same attribute in same solvable. return( lhs.solvid == rhs.solvid && lhs.key->name == rhs.key->name ); } detail::IdType LookupAttr::iterator::dereference() const { return _dip ? ::repodata_globalize_id( _dip->data, _dip->kv.id, 1 ) : detail::noId; } void LookupAttr::iterator::increment() { if ( _dip ) { if ( ! ::dataiterator_step( _dip.get() ) ) { _dip.reset(); base_reference() = 0; } else { ::dataiterator_strdup( _dip.get() ); } } } std::ostream & operator<<( std::ostream & str, const LookupAttr::iterator & obj ) { const detail::CDataiterator * dip = obj.get(); if ( ! dip ) return str << "EndOfQuery"; if ( obj.inSolvable() ) str << obj.inSolvable(); else if ( obj.inRepo() ) str << obj.inRepo(); str << '<' << obj.inSolvAttr() << (obj.solvAttrSubEntry() ? ">(*" : ">(") << IdString(obj.solvAttrType()) << ") = " << obj.asString(); return str; } template<> CheckSum LookupAttr::iterator::asType() const { return asCheckSum(); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const zypp::sat::detail::CDataiterator * obj ) { str << "detail::CDataiterator("; if ( ! obj ) { str << "NULL"; } else { str << "|" << zypp::Repository(obj->repo); str << "|" << zypp::sat::Solvable(obj->solvid); str << "|" << zypp::IdString(obj->key->name); str << "|" << zypp::IdString(obj->key->type); str << "|" << obj->repodataid; str << "|" << obj->repoid; } return str << ")"; } /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/LookupAttr.h000066400000000000000000000536371476576476200175020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/LookupAttr.h * */ #ifndef ZYPP_SAT_LOOKUPATTR_H #define ZYPP_SAT_LOOKUPATTR_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class CheckSum; class Match; struct MatchException; class StrMatcher; /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupAttr // /** Lightweight attribute value lookup. * * Search for an attribute in \ref Pool, one \ref Repository * or one \ref Solvable. \ref LookupAttr builds the query, * \ref LookupAttr::iterator iterates over the result. * * Per default \ref LookupAttr looks for attributes associated with * a \ref Solvable. But you may also pass \ref REPO_ATTR as * \ref Location argument, to lookup attributes associated with * the \ref Repository (e.g. DeltaRpm information). * * For convenience \see \ref LookupRepoAttr. * * Modifying the query will not affect any running * iterator. * * Use \ref SolvAttr::allAttr to search all attributes. * * To search for attributes located in a sub-structure (flexarray) * you also have to pass the sub-structures attribute as parent. * Passing \ref SolvAttr::allAttr a parent will lookup the attribute * in \c any sub-structure. Few attributes are known to have a parent * (\see \ref SolvAttr::parent). Setting those attributes will automatically * initialize their parent value. * * \code * // Lookup all 'name' attributes: * sat::LookupAttr q( sat::SolvAttr::name ); * // Lookup all 'name' attributes within a sub-structure 'data': * sat::LookupAttr q( sat::SolvAttr::name, sat::SolvAttr::data ); * // Lookup all 'name' attributes within any sub-structure: * sat::LookupAttr q( sat::SolvAttr::name, sat::SolvAttr::allAttr ); * \endcode * * \code * // look for all attributes of one solvable * void ditest( sat::Solvable slv_r ) * { * sat::LookupAttr q( sat::SolvAttr::allAttr, slv_r ); * MIL << q << ": " << endl; * for_( it, q.begin(), q.end() ) * { * MIL << " " << it.inSolvAttr() << " = " << it.asString() << endl; * } * } * \endcode * * \code * // look for an attribute in the pool. * sat::LookupAttr q( sat::SolvAttr("susetags:datadir") ); * MIL << q << ": " << endl; * for_( it, q.begin(), q.end() ) * { * MIL << " " << it << endl; * } * \endcode * * \code * // look for a repo attribute in the pool. * sat::LookupRepoAttr q( sat::SolvAttr::repositoryAddedFileProvides ); * MIL << q << ": " << endl; * for_( it, q.begin(), q.end() ) * { * MIL << " " << it << endl; * } * \endcode */ class ZYPP_API LookupAttr { public: using Exception = MatchException; public: using size_type = unsigned int; /** Specify the where to look for the attribule. */ enum Location { SOLV_ATTR = 0, //!< Search for solvable attributes (default) REPO_ATTR = -1 //!< Search for repository attributes }; public: /** Default ctor finds nothing. */ LookupAttr(); LookupAttr(const LookupAttr &) = default; LookupAttr(LookupAttr &&) noexcept = default; LookupAttr &operator=(const LookupAttr &) = default; LookupAttr &operator=(LookupAttr &&) noexcept = default; /** Lookup \ref SolvAttr in \ref Pool (all repositories). */ explicit LookupAttr( SolvAttr attr_r, Location = SOLV_ATTR ); /** \overload SolvAttr within sub-structure \a parent_r. */ LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Location = SOLV_ATTR ); /** Lookup \ref SolvAttr in one\ref Repository. */ LookupAttr( SolvAttr attr_r, Repository repo_r, Location = SOLV_ATTR ); /** \overload SolvAttr within sub-structure \a parent_r. */ LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Repository repo_r, Location = SOLV_ATTR ); /** Lookup \ref SolvAttr in one \ref Solvable. */ LookupAttr( SolvAttr attr_r, Solvable solv_r ); /** \overload SolvAttr within sub-structure \a parent_r. */ LookupAttr( SolvAttr attr_r, SolvAttr parent_r, Solvable solv_r ); public: /** \name Search result. */ //@{ /** Result iterator. */ class iterator; /** Iterator to the begin of query results. */ iterator begin() const; /** Iterator behind the end of query results. */ iterator end() const; /** Whether the query is empty. */ bool empty() const; /** Ammount of results. * \note This is not a cheap call. It runs the query. */ size_type size() const; /** TransformIterator returning an \ref iterator vaue of type \c TResult. */ template class TransformIterator; //@} public: /** \name What to search. */ //@{ /** The \ref SolvAttr to search. */ SolvAttr attr() const; /** Set the \ref SolvAttr to search. */ void setAttr( SolvAttr attr_r ); //@} /** \name Restrict attributes to match a pattern. */ //@{ /** The pattern to match. * You can also evaluate \ref StrMatcher in a boolean context, * in order to test whether an \ref StrMatcher is set: * \code * LookupAttr q; * if ( q.strMatcher() ) * ...; // an StrMatcher is set * \endcode */ const StrMatcher & strMatcher() const; /** Set the pattern to match. * \throws MatchException Any of the exceptions thrown by \ref StrMatcher::compile. */ void setStrMatcher( const StrMatcher & matcher_r ); /** Reset the pattern to match. */ void resetStrMatcher(); //@} public: /** \name Where to search. */ //@{ /** Whether to search in \ref Pool. */ bool pool() const; /** Set search in \ref Pool (all repositories). */ void setPool( Location = SOLV_ATTR ); /** Whether to search in one \ref Repository. */ Repository repo() const; /** Set search in one \ref Repository. */ void setRepo( Repository repo_r, Location = SOLV_ATTR ); /** Whether to search in one \ref Solvable. */ Solvable solvable() const; /** Set search in one \ref Solvable. */ void setSolvable( Solvable solv_r ); /** Whether to search within a sub-structure (\ref SolvAttr::noAttr if not) */ SolvAttr parent() const; /** Set search within a sub-structure (\ref SolvAttr::noAttr for none) */ void setParent( SolvAttr attr_r ); //@} private: class Impl; RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates LookupAttr Stream output. */ std::ostream & operator<<( std::ostream & str, const LookupAttr & obj ) ZYPP_API; /** \relates LookupAttr Verbose stream output including the query result. */ std::ostream & dumpOn( std::ostream & str, const LookupAttr & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupRepoAttr // /** Lightweight repository attribute value lookup. * * This is just a convenience class that overloads all * \ref LookupAttr methods which take a \ref LookupAttr::Location * argument and sets it to \ref REPO_ATTR. * * \code * // look for a repo attribute in the pool: * sat::LookupAttr p( sat::SolvAttr::repositoryAddedFileProvides, sat::LookupAttr::REPO_ATTR ); * * // Equivalent but using LookupRepoAttr: * sat::LookupRepoAttr q( sat::SolvAttr::repositoryAddedFileProvides ); * \endcode * * \see \ref LookupAttr */ class LookupRepoAttr : public LookupAttr { public: /** \copydoc LookupAttr::LookupAttr() */ LookupRepoAttr() {} /** \copydoc LookupAttr::LookupAttr(SolvAttr) */ explicit LookupRepoAttr( SolvAttr attr_r ) : LookupAttr( std::move(attr_r), REPO_ATTR ) {} /** \copydoc LookupAttr::LookupAttr(SolvAttr,Repository) */ explicit LookupRepoAttr( SolvAttr attr_r, Repository repo_r ); public: /** \copydoc LookupAttr::setPool */ void setPool() { LookupAttr::setPool( REPO_ATTR ); } /** \copydoc LookupAttr::setRepo */ void setRepo( Repository repo_r ); private: // Hide. You can't look inside and outside Solvables at the same time. using LookupAttr::solvable; using LookupAttr::setSolvable; }; /////////////////////////////////////////////////////////////////// namespace detail { /** Wrapper around sat \c detail::CDataiterator. * * Manages copy and assign, and release of allocated * resources like datamatcher inside the dataiterator. * Also maintains a copy of the matchstring in order to * keep the char* passed to the dataiterator valid. */ class DIWrap { public: /** \c NULL \c detail::CDataiterator */ DIWrap() : _dip( 0 ) {} /** Initializes */ DIWrap( RepoIdType repoId_r, SolvableIdType solvId_r, IdType attrId_r, std::string mstring_r = std::string(), int flags_r = 0 ); /** \overload to catch \c NULL \a mstring_r. */ DIWrap( RepoIdType repoId_r, SolvableIdType solvId_r, IdType attrId_r, const char * mstring_r, int flags_r = 0 ); DIWrap( const DIWrap & rhs ); ~DIWrap(); public: void swap( DIWrap & rhs ) noexcept { if ( &rhs != this ) // prevent self assign! { std::swap( _dip, rhs._dip ); std::swap( _mstring, rhs._mstring ); } } DIWrap & operator=( const DIWrap & rhs ) { if ( &rhs != this ) // prevent self assign! DIWrap( rhs ).swap( *this ); return *this; } void reset() { DIWrap().swap( *this ); } public: /** Evaluate in a boolean context ( _dip != NULL ). */ explicit operator bool() const { return _dip; } public: detail::CDataiterator * operator->() const { return _dip; } detail::CDataiterator * get() const { return _dip; } const std::string & getstr() const { return _mstring; } private: detail::CDataiterator * _dip; std::string _mstring; }; /** \relates DIWrap Stream output. */ std::ostream & operator<<( std::ostream & str, const DIWrap & obj ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupAttr::iterator // /** Result iterator. * Extended iterator methods valid only if not @end. * \note Implementation: Keep iterator_adaptor base and _dip in sync! */ class LookupAttr::iterator : public boost::iterator_adaptor< iterator // Derived , detail::CDataiterator * // Base , detail::IdType // Value , boost::forward_traversal_tag // CategoryOrTraversal , detail::IdType // Reference > { public: /** \name Moving fast forward. */ //@{ /** On the next call to \ref operator++ advance to the next \ref SolvAttr. */ void nextSkipSolvAttr(); /** On the next call to \ref operator++ advance to the next \ref Solvable. */ void nextSkipSolvable(); /** On the next call to \ref operator++ advance to the next \ref Repository. */ void nextSkipRepo(); /** Immediately advance to the next \ref SolvAttr. */ void skipSolvAttr() { nextSkipSolvAttr(); increment(); } /** Immediately advance to the next \ref Solvable. */ void skipSolvable() { nextSkipSolvable(); increment(); } /** Immediately advance to the next \ref Repository. */ void skipRepo() { nextSkipRepo(); increment(); } /** Stop after all matches in the current \ref Solvable are processed. */ void stayInThisSolvable(); /** Stop after all matches in the current \ref Repository are processed. */ void stayInThisRepo(); //@} /** \name Current position info. */ //@{ /** The current \ref Repository. */ Repository inRepo() const; /** The current \ref Solvable. */ Solvable inSolvable() const; /** The current \ref SolvAttr. */ SolvAttr inSolvAttr() const; /** Whether this points to the end of a query (Iterator is invalid). */ bool atEnd() const { return !_dip; } //@} /** \name Test attribute value type. */ //@{ /** The current \ref SolvAttr type. */ detail::IdType solvAttrType() const; /** Whether this is a numeric attribute (incl. boolean). */ bool solvAttrNumeric() const; /** Whether this is a string attribute. */ bool solvAttrString() const; /** Whether this string attribute is available as \ref IdString. */ bool solvAttrIdString() const; /** Whether this is a CheckSum attribute.*/ bool solvAttrCheckSum() const; /** Whether this is the entry to a sub-structure (flexarray). * This is the entry to a sequence of attributes. To * acces them use \ref subBegin and \ref subEnd. */ bool solvAttrSubEntry() const; //@} /** \name Iterate sub-structures. * * These are usable iff \ref solvAttrSubEntry is \c true. * * \note Unfortunately the underlying libsolv dataiterator as returned * by \ref subBegin and \ref subFind loses some context when being created. * Thus, it's not possible to invoke \ref subBegin and \ref subFind on an * iterator that was previously returned by one of those methods. The result * will be an \c end iterator. For the same reason, it is not possible for an * iterator to leave the sub-structure again. * * \code * // Lookup all "update:reference" entries for a specific solvable * sat::LookupAttr q( sat::SolvAttr::updateReference, p->satSolvable() ); * for_( res, q.begin(), q.end() ) * { * // List all sub values * for_( sub, res.subBegin(), res.subEnd() ) * { * cout << sub.asString() << endl; * } * * // Directly access c specific value: * sat::LookupAttr::iterator it( res.subFind( sat::SolvAttr::updateReferenceHref ) ); * if ( it != res.subEnd() ) * cout << it.asString() << endl; * } * \endcode */ //@{ /** Whether the sub-structure is empty. */ bool subEmpty() const; /** Ammount of attributes in the sub-structure. * \note This is not a cheap call. It runs the query. */ size_type subSize() const; /** Iterator to the begin of a sub-structure. * \see \ref solvAttrSubEntry */ iterator subBegin() const; /** Iterator behind the end of a sub-structure. * \see \ref solvAttrSubEntry */ iterator subEnd() const; /** Iterator pointing to the first occurance of \ref SolvAttr \a attr_r in sub-structure. * If \ref sat::SolvAttr::allAttr is passed, \ref subBegin is returned. * \see \ref solvAttrSubEntry */ iterator subFind( const SolvAttr& attr_r ) const; /** \overload Extending the current attribute name with by \c ":attrname_r". * * This assumes a sub-structur \c "update:reference" has attributes * like \c "update:reference:type", \c "update:reference:href". * * If an empty \c attrname_r is passed, \ref subBegin is returned. */ iterator subFind( const C_Str & attrname_r ) const; //@} /** \name Retrieving attribute values. */ //@{ /** Conversion to numeric types. */ int asInt() const; /** \overload */ unsigned asUnsigned() const; /** \overload */ bool asBool() const; /** \overload */ unsigned long long asUnsignedLL() const; /** Conversion to string types. */ const char * c_str() const; /** \overload * If used with non-string types, this method tries to create * some appropriate string representation. */ std::string asString() const; /** As \ref IdStr. * This is only done for poolized string types. Large strings like * summary or descriptions are not available via \ref IdStr, only * via \ref c_str and \ref asString. */ IdString idStr() const; /** \overload Directly returning the \c Id */ detail::IdType id() const { return idStr().id(); } /** As \ref CheckSum. */ CheckSum asCheckSum() const; /** Templated return type. * Per default assumes an Id based type, so try to construct * it from the Id. * * Should be specialized for supported types above. */ template Tp asType() const { return Tp(id()); } //@} /////////////////////////////////////////////////////////////////// // internal stuff below /////////////////////////////////////////////////////////////////// public: iterator(); iterator( const iterator & rhs ); iterator & operator=( const iterator & rhs ); ~iterator(); public: /** * C-tor taking over ownership of the passed \c detail::CDataiterator * and doing its first iteration (::dataiterator_step) */ iterator( detail::DIWrap & dip_r ); private: friend class boost::iterator_core_access; template bool equal( const boost::iterator_adaptor & rhs ) const { return ( bool(base()) == bool(rhs.base()) ) && ( ! base() || dip_equal( *base(), *rhs.base() ) ); } bool dip_equal( const detail::CDataiterator & lhs, const detail::CDataiterator & rhs ) const; detail::IdType dereference() const; void increment(); public: /** Expert backdoor. */ detail::CDataiterator * get() const { return _dip.get(); } private: detail::DIWrap _dip; }; /////////////////////////////////////////////////////////////////// /** \relates LookupAttr::iterator Stream output. */ std::ostream & operator<<( std::ostream & str, const LookupAttr::iterator & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// /** \name Helpers and forward declarations from LookupAttrTools.h */ //@{ template<> inline int LookupAttr::iterator::asType() const { return asInt(); } template<> inline unsigned LookupAttr::iterator::asType() const { return asUnsigned(); } template<> inline unsigned long long LookupAttr::iterator::asType() const { return asUnsignedLL(); } template<> inline bool LookupAttr::iterator::asType() const { return asBool(); } template<> inline const char * LookupAttr::iterator::asType() const { return c_str(); } template<> inline std::string LookupAttr::iterator::asType() const { return asString(); } template<> inline IdString LookupAttr::iterator::asType() const { return idStr(); } template<> CheckSum LookupAttr::iterator::asType() const; template class ArrayAttr; //@} ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// /** \relates LookupAttr::iterator Stream output of the underlying iterator for debug. */ std::ostream & operator<<( std::ostream & str, const zypp::sat::detail::CDataiterator * obj ); /** \relates LookupAttr::iterator Stream output of the underlying iterator for debug. */ inline std::ostream & operator<<( std::ostream & str, const zypp::sat::detail::CDataiterator & obj ) { return str << &obj; } #endif // ZYPP_SAT_LOOKUPATTR_H libzypp-17.36.5/zypp/sat/LookupAttrTools.h000066400000000000000000000164461476576476200205200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/LookupAttrTools.h * */ #ifndef ZYPP_SAT_LOOKUPATTRTOOLS_H #define ZYPP_SAT_LOOKUPATTRTOOLS_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : LookupAttr::TransformIterator // /** TransformIterator returning an \ref iterator value of type \c TResult. * * The underlying LookupAttr::iterators value is retrieved \ref asType * and the returned \ref ResultT is constructed fron that value. * * \code * class Keywords * { * public: * Keywords( sat::Solvable solv_r ) * : _q( sat::SolvAttr::keywords, solv_r ) * {} * * public: * typedef sat::LookupAttr::TransformIterator iterator; * * iterator begin() const { return iterator( _q.begin() ); } * iterator end() const { return iterator( _q.end() ); } * * private: * sat::LookupAttr _q; * }; * \endcode * * \see \ref ArrayAttr. */ template class LookupAttr::TransformIterator : public boost::iterator_adaptor< TransformIterator // Derived , LookupAttr::iterator // Base , TResult // Value , boost::forward_traversal_tag // CategoryOrTraversal , TResult // Reference > { public: TransformIterator() {} explicit TransformIterator( const LookupAttr::iterator & val_r ) { this->base_reference() = val_r; } public: /** \name Moving fast forward. */ //@{ /** On the next call to \ref operator++ advance to the next \ref SolvAttr. */ void nextSkipSolvAttr() { this->base_reference().nextSkipSolvAttr(); } /** On the next call to \ref operator++ advance to the next \ref Solvable. */ void nextSkipSolvable() { this->base_reference().nextSkipSolvable(); } /** On the next call to \ref operator++ advance to the next \ref Repository. */ void nextSkipRepo() { this->base_reference().nextSkipRepo(); } /** Immediately advance to the next \ref SolvAttr. */ void skipSolvAttr() { this->base_reference().skipSolvAttr(); } /** Immediately advance to the next \ref Solvable. */ void skipSolvable() { this->base_reference().skipSolvable(); } /** Immediately advance to the next \ref Repository. */ void skipRepo() { this->base_reference().skipRepo(); } //@} /** \name Current position info. */ //@{ /** The current \ref Repository. */ Repository inRepo() const { return this->base_reference().inRepo(); } /** The current \ref Solvabele. */ Solvable inSolvable() const { return this->base_reference().inSolvable(); } /** The current \ref SolvAttr. */ SolvAttr inSolvAttr() const { return this->base_reference().inSolvAttr(); } //@} private: friend class boost::iterator_core_access; TResult dereference() const { const LookupAttr::iterator lit( this->base_reference() ); return TResult( lit.asType() ); } }; /////////////////////////////////////////////////////////////////// template class ArrayAttr; template std::ostream & operator<<( std::ostream & str, const ArrayAttr & obj ); /////////////////////////////////////////////////////////////////// // // CLASS NAME : ArrayAttr // /** \ref LookupAttr::TransformIterator based container to retrieve list attributes. * * You may pass \ref LookupAttr::REPO_ATTR as \ref LookupAttr::Location argument, * to lookup attributes associated with the \ref Repository as a whole * (e.g. repository keywords). * * \see \ref LookupAttr for details. * * \code * typedef ArrayAttr Keywords; * Keywords k( sat::SolvAttr::keywords ); * dumpRange( MIL << "All Keywords: ", k.begin(), k.end() ) << endl; * \endcode * * \todo Maybe add some way to unify the result. */ template class ArrayAttr { friend std::ostream & operator<< ( std::ostream & str, const ArrayAttr & obj ); public: ArrayAttr() {} ArrayAttr( SolvAttr attr_r, LookupAttr::Location loc_r = LookupAttr::SOLV_ATTR ) : _q( std::move(attr_r), loc_r ) {} ArrayAttr( SolvAttr attr_r, Repository repo_r, LookupAttr::Location loc_r = LookupAttr::SOLV_ATTR ) : _q( std::move(attr_r), repo_r, loc_r ) {} ArrayAttr( SolvAttr attr_r, Solvable solv_r ) : _q( std::move(attr_r), solv_r ) {} public: using iterator = LookupAttr::TransformIterator; using size_type = LookupAttr::size_type; iterator begin() const { return iterator( _q.begin() ); } iterator end() const { return iterator( _q.end() ); } bool empty() const { return _q.empty(); } size_type size() const { size_type count = 0; for_( it, begin(), end() ) ++count; return count; } public: iterator find( const TResult & key_r ) const { for_( it, begin(), end() ) { if ( *it == key_r ) return it; } return end(); } private: LookupAttr _q; }; /////////////////////////////////////////////////////////////////// /** \relates LookupAttr::iterator Stream output. */ template inline std::ostream & operator<<( std::ostream & str, const ArrayAttr & obj ) { return dumpOn( str, obj._q ); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_LOOKUPATTRTOOLS_H libzypp-17.36.5/zypp/sat/Map.cc000066400000000000000000000076211476576476200162410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Map.cc */ extern "C" { #include } #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// template<> sat::detail::CMap * rwcowClone( const sat::detail::CMap * rhs ) { sat::detail::CMap * ret = new sat::detail::CMap; ::map_init_clone( ret, const_cast(rhs) ); return ret; } /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// constexpr Map::PoolSizeType Map::poolSize; Map::Map() : _pimpl( new detail::CMap ) { ::map_init( _pimpl.get(), 0 ); } Map::Map( size_type size_r ) : _pimpl( new detail::CMap ) { ::map_init( _pimpl.get(), size_r ); } Map::Map( PoolSizeType ) : _pimpl( new detail::CMap ) { ::map_init( _pimpl.get(), Pool::instance().capacity() ); } Map::~Map() { ::map_free( _pimpl.get() ); } bool Map::empty() const { return( _pimpl->size == 0 ); } Map::size_type Map::size() const { return _pimpl->size << 3; } void Map::grow( size_type size_r ) { ::map_grow( _pimpl.get(), size_r ); } void Map::setAll() { assignAll( true ); } void Map::clearAll() { assignAll( false ); } void Map::assignAll( bool val_r ) { if ( _pimpl->size ) ::memset( _pimpl->map, (val_r?-1:0), _pimpl->size ); } #define M_RANGE_CKECK(IDX,LOC) if ( ((IDX) >> 3) >= size_type(_pimpl->size) ) throw std::out_of_range( "zypp::sat::Map::" LOC ) void Map::set( size_type idx_r ) { M_RANGE_CKECK( idx_r, "set" ); MAPSET( _pimpl, idx_r ); } void Map::clear( size_type idx_r ) { M_RANGE_CKECK( idx_r, "clear" ); MAPCLR( _pimpl, idx_r ); } void Map::assign( size_type idx_r, bool val_r ) { M_RANGE_CKECK( idx_r, "assign" ); if ( val_r ) { MAPSET( _pimpl, idx_r ); } else { MAPCLR( _pimpl, idx_r ); } } bool Map::test( size_type idx_r ) const { M_RANGE_CKECK( idx_r, "test" ); return MAPTST( _pimpl, idx_r ); } std::string Map::asString( const char on_r, const char off_r ) const { if ( empty() ) return std::string(); std::string ret( size(), off_r ); for_( idx, size_type(0), size() ) { if ( test( idx ) ) ret[idx] = on_r; } return ret; } Map::operator detail::CMap *() // COW: nonconst version can't be inlined { return _pimpl.get(); } // without exposing detail::CMap bool operator==( const Map & lhs, const Map & rhs ) { const detail::CMap * l = lhs; const detail::CMap * r = rhs; return( l == r || ( l->size == r->size && ::memcmp( l->map, r->map, l->size ) == 0 ) ); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/Map.h000066400000000000000000000101751476576476200161010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Map.h */ #ifndef ZYPP_SAT_MAP_H #define ZYPP_SAT_MAP_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { /////////////////////////////////////////////////////////////////// /// \class Map /// \brief Libsolv (bit)Map wrapper. /// /// \Note Requested sizes are filled up to the next multiple of eight. /// Libsolv bitmaps are not shrinkable. /////////////////////////////////////////////////////////////////// class ZYPP_API Map { public: using size_type = unsigned long; /** Type to indicate the bitmap should match the current pools capacity. */ struct PoolSizeType {}; /** An object indicating the bitmap should match the current pools capacity. */ static constexpr PoolSizeType poolSize = PoolSizeType(); public: /** Default ctor: empty Map */ Map(); /** Ctor taking the Map size */ explicit Map( size_type size_r ); /** Ctor creating a Map matching the current pools capacity */ Map( PoolSizeType ); /** Dtor */ ~Map(); public: /** Whether Map is empty. */ bool empty() const; /** Size of the Map. */ size_type size() const; /** Grow the Map if necessary. */ void grow( size_type size_r ); public: /** Set all bits. */ void setAll(); /** Clear all bits. */ void clearAll(); /** Assign \c val_r to all bits. */ void assignAll( bool val_r ); /** Set bit \c idx_r. * \throws std::out_of_range if \a idx_r is out of range */ void set( size_type idx_r ); /** Clear bit \c idx_r. * \throws std::out_of_range if \a idx_r is out of range */ void clear( size_type idx_r ); /** Assign \c val_r to bit \c idx_r. * \throws std::out_of_range if \a idx_r is out of range */ void assign( size_type idx_r, bool val_r ); public: /** Test bit \c idx_r. * \throws std::out_of_range if \a idx_r is out of range */ bool test( size_type idx_r ) const; /** Test bit \c idx_r. * \throws std::out_of_range if \a idx_r is out of range */ bool operator[]( size_type idx_r ) const { return test( idx_r ); } public: /** String representation */ std::string asString( const char on_r = '1', const char off_r = '0' ) const; public: operator detail::CMap *(); ///< libsolv backdoor operator const detail::CMap *() const ///< libsolv backdoor { return _pimpl.get(); } private: RWCOW_pointer _pimpl; ///< Pointer to implementation }; /** \relates Map Stream output */ inline std::ostream & operator<<( std::ostream & str, const Map & obj ) { return str << obj.asString(); } /** \relates Map */ bool operator==( const Map & lhs, const Map & rhs ) ZYPP_API; /** \relates Map */ inline bool operator!=( const Map & lhs, const Map & rhs ) { return !( lhs == rhs ); } } // namespace sat /////////////////////////////////////////////////////////////////// /** \relates Map Clone function for RWCOW_pointer */ template<> sat::detail::CMap * rwcowClone( const sat::detail::CMap * rhs ); using Bitmap = sat::Map; } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_MAP_H libzypp-17.36.5/zypp/sat/Pool.cc000066400000000000000000000253611476576476200164360ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Pool.cc * */ #include #include #include extern "C" { #include #include #include } #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// const std::string & Pool::systemRepoAlias() { return detail::PoolImpl::systemRepoAlias(); } detail::CPool * Pool::get() const { return myPool().getPool(); } Pool::size_type Pool::capacity() const { return myPool()->nsolvables; } const SerialNumber & Pool::serial() const { return myPool().serial(); } const SerialNumber & Pool::serialIDs() const { return myPool().serialIDs(); } void Pool::prepare() const { return myPool().prepare(); } Pathname Pool::rootDir() const { return myPool().rootDir(); } void Pool::rootDir( const Pathname & root_r ) { return myPool().rootDir( root_r ); } bool Pool::reposEmpty() const { return ! myPool()->urepos; } Pool::size_type Pool::reposSize() const { return myPool()->urepos; } Pool::RepositoryIterator Pool::reposBegin() const { if ( myPool()->urepos ) { // repos[0] == NULL for_( it, myPool()->repos+1, myPool()->repos+myPool()->nrepos ) if ( *it ) return RepositoryIterator( it ); } return reposEnd(); } Pool::RepositoryIterator Pool::reposEnd() const { return RepositoryIterator( myPool()->repos+myPool()->nrepos ); } bool Pool::solvablesEmpty() const { // return myPool()->nsolvables; // nsolvables is the array size including // invalid Solvables. for_( it, reposBegin(), reposEnd() ) { if ( ! it->solvablesEmpty() ) return false; } return true; } Pool::size_type Pool::solvablesSize() const { // Do not return myPool()->nsolvables; // nsolvables is the array size including // invalid Solvables. size_type ret = 0; for_( it, reposBegin(), reposEnd() ) { ret += it->solvablesSize(); } return ret; } Pool::SolvableIterator Pool::solvablesBegin() const { return SolvableIterator( myPool().getFirstId() ); } Pool::SolvableIterator Pool::solvablesEnd() const { return SolvableIterator(); } sat::Queue Pool::whatMatchesDep( const SolvAttr &attr, const Capability &cap ) const { sat::Queue q; pool_whatmatchesdep( get(), attr.id(), cap.id(), q, 0); return q; } Queue Pool::whatMatchesSolvable( const SolvAttr &attr, const Solvable &solv ) const { sat::Queue q; pool_whatmatchessolvable( get(), attr.id(), static_cast( solv.id() ), q, 0 ); return q; } Queue Pool::whatContainsDep( const SolvAttr &attr, const Capability &cap ) const { sat::Queue q; pool_whatcontainsdep( get(), attr.id(), cap.id(), q, 0 ); return q; } Repository Pool::reposInsert( const std::string & alias_r ) { Repository ret( reposFind( alias_r ) ); if ( ret ) return ret; ret = Repository( myPool()._createRepo( alias_r ) ); if ( ret.isSystemRepo() ) { // autoprovide (dummy) RepoInfo RepoInfo info; info.setAlias( alias_r ); info.setName( alias_r ); info.setAutorefresh( true ); info.setEnabled( true ); ret.setInfo( info ); } return ret; } Repository Pool::reposFind( const std::string & alias_r ) const { for_( it, reposBegin(), reposEnd() ) { if ( alias_r == it->alias() ) return *it; } return Repository(); } Repository Pool::findSystemRepo() const { return Repository( myPool().systemRepo() ); } Repository Pool::systemRepo() { if ( myPool().systemRepo() ) return Repository( myPool().systemRepo() ); return reposInsert( systemRepoAlias() ); } Repository Pool::addRepoSolv( const Pathname & file_r, const std::string & alias_r ) { // Using a temporay repo! (The additional parenthesis are required.) AutoDispose tmprepo( (Repository::EraseFromPool()) ); *tmprepo = reposInsert( alias_r ); tmprepo->addSolv( file_r ); // no exceptions so we keep it: tmprepo.resetDispose(); return tmprepo; } Repository Pool::addRepoSolv( const Pathname & file_r ) { return addRepoSolv( file_r, file_r.basename() ); } Repository Pool::addRepoSolv( const Pathname & file_r, const RepoInfo & info_r ) { Repository ret( addRepoSolv( file_r, info_r.alias() ) ); ret.setInfo( info_r ); return ret; } ///////////////////////////////////////////////////////////////// Repository Pool::addRepoHelix( const Pathname & file_r, const std::string & alias_r ) { // Using a temporay repo! (The additional parenthesis are required.) AutoDispose tmprepo( (Repository::EraseFromPool()) ); *tmprepo = reposInsert( alias_r ); tmprepo->addHelix( file_r ); // no exceptions so we keep it: tmprepo.resetDispose(); return tmprepo; } Repository Pool::addRepoHelix( const Pathname & file_r ) { return addRepoHelix( file_r, file_r.basename() ); } Repository Pool::addRepoHelix( const Pathname & file_r, const RepoInfo & info_r ) { Repository ret( addRepoHelix( file_r, info_r.alias() ) ); ret.setInfo( info_r ); return ret; } ///////////////////////////////////////////////////////////////// void Pool::setTextLocale( const Locale & locale_r ) { myPool().setTextLocale( locale_r ); } void Pool::setRequestedLocales( const LocaleSet & locales_r ) { myPool().setRequestedLocales( locales_r ); } bool Pool::addRequestedLocale( const Locale & locale_r ) { return myPool().addRequestedLocale( locale_r ); } bool Pool::eraseRequestedLocale( const Locale & locale_r ) { return myPool().eraseRequestedLocale( locale_r ); } const LocaleSet & Pool::getRequestedLocales() const { return myPool().getRequestedLocales(); } bool Pool::isRequestedLocale( const Locale & locale_r ) const { return myPool().isRequestedLocale( locale_r ); } void Pool::initRequestedLocales( const LocaleSet & locales_r ) { myPool().initRequestedLocales( locales_r ); } const LocaleSet & Pool::getAddedRequestedLocales() const { return myPool().getAddedRequestedLocales(); } const LocaleSet & Pool::getRemovedRequestedLocales() const { return myPool().getRemovedRequestedLocales(); } const LocaleSet & Pool::getAvailableLocales() const { return myPool().getAvailableLocales(); } bool Pool::isAvailableLocale( const Locale & locale_r ) const { return myPool().isAvailableLocale( locale_r ); } const Pool::MultiversionList & Pool::multiversion() const { return myPool().multiversionList(); } Queue Pool::autoInstalled() const { return myPool().autoInstalled(); } void Pool::setAutoInstalled( const Queue & autoInstalled_r ){ myPool().setAutoInstalled( autoInstalled_r ); } void Pool::setNeedrebootSpec( sat::SolvableSpec needrebootSpec_r ) { myPool().setNeedrebootSpec( std::move(needrebootSpec_r) ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const Pool & obj ) { return str << "sat::pool(" << obj.serial() << ")[" << obj.capacity() << "]{" << obj.reposSize() << "repos|" << obj.solvablesSize() << "solv}"; } ///////////////////////////////////////////////////////////////// #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "solvidx" void updateSolvFileIndex( const Pathname & solvfile_r ) { AutoDispose solv( ::fopen( solvfile_r.c_str(), "re" ), ::fclose ); if ( solv == NULL ) { solv.resetDispose(); ERR << "Can't open solv-file: " << solv << endl; return; } std::string solvidxfile( solvfile_r.extend(".idx").asString() ); if ( ::unlink( solvidxfile.c_str() ) == -1 && errno != ENOENT ) { ERR << "Can't unlink solv-idx: " << Errno() << endl; return; } { int fd = ::open( solvidxfile.c_str(), O_CREAT|O_EXCL|O_WRONLY|O_TRUNC, 0644 ); if ( fd == -1 ) { ERR << "Can't create solv-idx: " << Errno() << endl; return; } ::close( fd ); } std::ofstream idx( solvidxfile.c_str() ); detail::CPool * _pool = ::pool_create(); detail::CRepo * _repo = ::repo_create( _pool, "" ); if ( ::repo_add_solv( _repo, solv, 0 ) == 0 ) { int _id = 0; detail::CSolvable * _solv = nullptr; FOR_REPO_SOLVABLES( _repo, _id, _solv ) { if ( _solv ) { #define SEP '\t' #define idstr(V) pool_id2str( _pool, _solv->V ) if ( _solv->arch == ARCH_SRC || _solv->arch == ARCH_NOSRC ) idx << "srcpackage:" << idstr(name) << SEP << idstr(evr) << SEP << "noarch" << endl; else idx << idstr(name) << SEP << idstr(evr) << SEP << idstr(arch) << endl; } } } else { ERR << "Can't read solv-file: " << ::pool_errstr( _pool ) << endl; } ::repo_free( _repo, 0 ); ::pool_free( _pool ); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/Pool.h000066400000000000000000000266241476576476200163030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Pool.h * */ #ifndef ZYPP_SAT_POOL_H #define ZYPP_SAT_POOL_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class SerialNumber; class RepoInfo; /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// class SolvableSpec; /////////////////////////////////////////////////////////////////// // // CLASS NAME : Pool // /** Global sat-pool. * * Explicitly shared singleton \ref Pool::instance. */ class ZYPP_API Pool : protected detail::PoolMember { public: using SolvableIterator = detail::SolvableIterator; using RepositoryIterator = zypp::detail::RepositoryIterator; using size_type = detail::size_type; public: /** Singleton ctor. */ static Pool instance() { return Pool(); } /** Ctor from \ref PoolMember. */ Pool( const detail::PoolMember & ) {} public: /** Internal array size for stats only. */ size_type capacity() const; /** Housekeeping data serial number. */ const SerialNumber & serial() const; /** Serial number changing whenever resusePoolIDs==true was used. ResPool must also invalidate its PoolItems! */ const SerialNumber & serialIDs() const; /** Update housekeeping data if necessary (e.g. whatprovides). */ void prepare() const; /** Get rootdir (for file conflicts check) */ Pathname rootDir() const; /** Set rootdir (for file conflicts check) */ void rootDir( const Pathname & root_r ); public: /** Whether \ref Pool contains repos. */ bool reposEmpty() const; /** Number of repos in \ref Pool. */ size_type reposSize() const; /** Iterator to the first \ref Repository. */ RepositoryIterator reposBegin() const; /** Iterator behind the last \ref Repository. */ RepositoryIterator reposEnd() const; /** Iterate the repositories. */ Iterable repos() const { return makeIterable( reposBegin(), reposEnd() ); } /** Return a \ref Repository named \c alias_r. * It a such a \ref Repository does not already exist * a new empty \ref Repository is created. */ Repository reposInsert( const std::string & alias_r ); /** Find a \ref Repository named \c alias_r. * Returns \ref noRepository if there is no such \ref Repository. */ Repository reposFind( const std::string & alias_r ) const; /** Remove a \ref Repository named \c alias_r. * \see \ref Repository::eraseFromPool */ void reposErase( const std::string & alias_r ) { reposFind( alias_r ).eraseFromPool(); } /** Remove all repos from the pool. * This also shrinks a pool which may have become large * after having added and removed repos lots of times. */ void reposEraseAll() { while ( ! reposEmpty() ) reposErase( reposBegin()->alias() ); } public: /** Reserved system repository alias \c @System. */ static const std::string & systemRepoAlias(); /** Return the system repository if it is on the pool. */ Repository findSystemRepo() const; /** Return the system repository, create it if missing. */ Repository systemRepo(); public: /** Load \ref Solvables from a solv-file into a \ref Repository named \c name_r. * In case of an exception the \ref Repository is removed from the \ref Pool. * \throws Exception if loading the solv-file fails. * \see \ref Repository::EraseFromPool */ Repository addRepoSolv( const Pathname & file_r, const std::string & name_r ); /** \overload Using the files basename as \ref Repository name. */ Repository addRepoSolv( const Pathname & file_r ); /** \overload Using the \ref RepoInfo::alias \ref Repo name. * Additionally stores the \ref RepoInfo. \See \ref Prool::setInfo. */ Repository addRepoSolv( const Pathname & file_r, const RepoInfo & info_r ); public: /** Load \ref Solvables from a helix-file into a \ref Repository named \c name_r. * Supports loading of gzip compressed files (.gz). In case of an exception * the \ref Repository is removed from the \ref Pool. * \throws Exception if loading the helix-file fails. * \see \ref Repository::EraseFromPool */ Repository addRepoHelix( const Pathname & file_r, const std::string & name_r ); /** \overload Using the files basename as \ref Repository name. */ Repository addRepoHelix( const Pathname & file_r ); /** \overload Using the \ref RepoInfo::alias \ref Repo name. * Additionally stores the \ref RepoInfo. \See \ref Prool::setInfo. */ Repository addRepoHelix( const Pathname & file_r, const RepoInfo & info_r ); public: /** Whether \ref Pool contains solvables. */ bool solvablesEmpty() const; /** Number of solvables in \ref Pool. */ size_type solvablesSize() const; /** Iterator to the first \ref Solvable. */ SolvableIterator solvablesBegin() const; /** Iterator behind the last \ref Solvable. */ SolvableIterator solvablesEnd() const; /** Iterate the solvables. */ Iterable solvables() const { return makeIterable( solvablesBegin(), solvablesEnd() ); } public: /** \name Iterate all Solvables matching a \c TFilter. */ //@{ template filter_iterator filterBegin( const TFilter & filter_r ) const { return make_filter_iterator( filter_r, solvablesBegin(), solvablesEnd() ); } template filter_iterator filterEnd( const TFilter & filter_r ) const { return make_filter_iterator( filter_r, solvablesEnd(), solvablesEnd() ); } //@} public: /** Conainer of all \ref Solvable providing \c cap_r. */ WhatProvides whatProvides( Capability cap_r ) const { return WhatProvides( cap_r ); } Queue whatMatchesDep( const SolvAttr &attr, const Capability &cap ) const; Queue whatMatchesSolvable ( const SolvAttr &attr, const Solvable &solv ) const; Queue whatContainsDep ( const SolvAttr &attr, const Capability &cap ) const; public: /** \name Requested locales. */ //@{ /** Set the default language for retrieving translated texts. * Updated when calling \ref ZConfig::setTextLocale. */ void setTextLocale( const Locale & locale_r ); /** Set the requested locales. * Languages to be supported by the system, e.g. language specific * packages to be installed. */ void setRequestedLocales( const LocaleSet & locales_r ); /** Add one \ref Locale to the set of requested locales. * Return \c true if \c locale_r was newly added to the set. */ bool addRequestedLocale( const Locale & locale_r ); /** Erase one \ref Locale from the set of requested locales. * Return \c false if \c locale_r was not found in the set. */ bool eraseRequestedLocale( const Locale & locale_r ); /** Return the requested locales. * \see \ref setRequestedLocales */ const LocaleSet & getRequestedLocales() const; /** Whether this \ref Locale is in the set of requested locales. */ bool isRequestedLocale( const Locale & locale_r ) const; /** Start tracking changes based on this \a locales_r. */ void initRequestedLocales( const LocaleSet & locales_r ); /** Added since last initRequestedLocales. */ const LocaleSet & getAddedRequestedLocales() const; /** Removed since last initRequestedLocales.*/ const LocaleSet & getRemovedRequestedLocales() const; /** Get the set of available locales. * This is computed from the package data so it actually * represents all locales packages claim to support. */ const LocaleSet & getAvailableLocales() const; /** Whether this \ref Locale is in the set of available locales. */ bool isAvailableLocale( const Locale & locale_r ) const; //@} public: /** \name Multiversion install. * Whether the pool contains packages which are multiversion installable. * \see \ref Solvable::multiversionInstall * \see \ref ZConfig::multiversionSpec */ //@{ using MultiversionList = SolvableSet; const MultiversionList & multiversion() const; /** \deprecated Legacy, use multiversion().empty() instead. */ ZYPP_DEPRECATED bool multiversionEmpty() const { return multiversion().empty(); } //@} public: /** \name Autoinstalled */ //@{ /** Get ident list of all autoinstalled solvables. */ Queue autoInstalled() const; /** Set ident list of all autoinstalled solvables. */ void setAutoInstalled( const Queue & autoInstalled_r ); //@} public: /** \name Needreboot */ //@{ /** Solvables which should trigger the reboot-needed hint if installed/updated. */ void setNeedrebootSpec( sat::SolvableSpec needrebootSpec_r ); //@} public: /** Expert backdoor. */ detail::CPool * get() const; private: /** Default ctor */ Pool() {} }; /////////////////////////////////////////////////////////////////// /** \relates Pool Stream output */ std::ostream & operator<<( std::ostream & str, const Pool & obj ) ZYPP_API; /** \relates Pool */ inline bool operator==( const Pool & lhs, const Pool & rhs ) { return lhs.get() == rhs.get(); } /** \relates Pool */ inline bool operator!=( const Pool & lhs, const Pool & rhs ) { return lhs.get() != rhs.get(); } /** Create solv file content digest for zypper bash completion */ void updateSolvFileIndex( const Pathname & solvfile_r ); ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_POOL_H libzypp-17.36.5/zypp/sat/Queue.cc000066400000000000000000000105561476576476200166110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Queue.cc */ extern "C" { #include } #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { template<> sat::detail::CQueue * rwcowClone( const sat::detail::CQueue * rhs ) { sat::detail::CQueue * ret = new sat::detail::CQueue; ::queue_init_clone( ret, const_cast(rhs) ); return ret; } /////////////////////////////////////////////////////////////////// namespace sat { Queue::Queue() : _pimpl( new detail::CQueue ) { ::queue_init( _pimpl.get() ); } Queue::~Queue() { ::queue_free( _pimpl.get() ); } bool Queue::empty() const { return( _pimpl->count == 0 ); } Queue::size_type Queue::size() const { return _pimpl->count; } Queue::const_iterator Queue::begin() const { return _pimpl->elements; } Queue::const_iterator Queue::end() const { return _pimpl->elements + _pimpl->count;} Queue::const_iterator Queue::find( value_type val_r ) const { for_( it, begin(), end() ) if ( *it == val_r ) return it; return end(); } Queue::value_type Queue::first() const { if ( _pimpl->count ) return *_pimpl->elements; return 0; } Queue::value_type Queue::last() const { if ( _pimpl->count ) return _pimpl->elements[_pimpl->count-1]; return 0; } #define M_RANGE_CKECK(IDX,LOC) if ( IDX >= size_type(_pimpl->count) ) throw std::out_of_range( "zypp::sat::Queue::" LOC ) const Queue::value_type & Queue::at( size_type idx_r ) const { M_RANGE_CKECK( idx_r, "at" ); return _pimpl->elements[idx_r]; } Queue::value_type & Queue::at( size_type idx_r ) { M_RANGE_CKECK( idx_r, "at" ); return _pimpl->elements[idx_r]; } const Queue::value_type & Queue::operator[]( size_type idx_r ) const { return _pimpl->elements[idx_r]; } Queue::value_type & Queue::operator[]( size_type idx_r ) { return _pimpl->elements[idx_r]; } void Queue::clear() { ::queue_empty( *this ); } void Queue::remove( value_type val_r ) { for ( const_iterator it( find( val_r ) ); it != end(); it = find( val_r ) ) ::queue_delete( _pimpl.get(), it - begin() ); } void Queue::push( value_type val_r ) { ::queue_push( _pimpl.get(), val_r ); } void Queue::pushUnique( value_type val_r ) { ::queue_pushunique( _pimpl.get(), val_r ); } Queue::value_type Queue::pop() { return ::queue_pop( _pimpl.get() ); } void Queue::push_front( value_type val_r ) { ::queue_unshift( _pimpl.get(), val_r ); } Queue::value_type Queue::pop_front() { return ::queue_shift( _pimpl.get() ); } Queue::operator detail::CQueue *() // COW: nonconst version can't be inlined { return _pimpl.get(); } // without exposing detail::CQueue std::ostream & operator<<( std::ostream & str, const Queue & obj ) { return dumpRangeLine( str << "Queue ", obj.begin(), obj.end() ); } std::ostream & dumpOn( std::ostream & str, const Queue & obj ) { str << "Queue {"; if ( ! obj.empty() ) { str << endl; for_( it, obj.begin(), obj.end() ) str << " " << Solvable(*it) << endl; } return str << "}"; } bool operator==( const Queue & lhs, const Queue & rhs ) { const detail::CQueue * l = lhs; const detail::CQueue * r = rhs; return( l == r || ( l->count == r->count && ::memcmp( l->elements, r->elements, l->count ) == 0 ) ); } } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/Queue.h000066400000000000000000000115051476576476200164460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Queue.h */ #ifndef ZYPP_SAT_QUEUE_H #define ZYPP_SAT_QUEUE_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { class Queue; using SolvableQueue = Queue; ///< Queue with Solvable ids using StringQueue = Queue; ///< Queue with String ids /////////////////////////////////////////////////////////////////// /// \class Queue /// \brief Libsolv Id queue wrapper. /// \todo template value_type to work with IString and other Id based types /////////////////////////////////////////////////////////////////// class ZYPP_API Queue { public: using size_type = unsigned int; using value_type = detail::IdType; using const_iterator = const value_type *; public: /** Default ctor: empty Queue. */ Queue(); /** Dtor */ ~Queue(); bool empty() const; size_type size() const; const_iterator begin() const; const_iterator end() const; /** Return iterator to the 1st occurance of \a val_r or \ref end. */ const_iterator find( value_type val_r ) const; /** Return whether the Queue contais at lest one element with value \a val_r. */ bool contains( value_type val_r ) const { return( find( val_r ) != end() ); } /** Return the 1st Id in the queue or \c 0 if empty. */ value_type first() const; /** Return the last Id in the queue or \c 0 if empty. */ value_type last() const; /** Return the Id at \a idx_r in the queue * \throws std::out_of_range if \a idx_r is out of range */ const value_type & at( size_type idx_r ) const; /** Return the Id at \a idx_r in the queue * \throws std::out_of_range if \a idx_r is out of range */ value_type & at( size_type idx_r ); /** Return the Id at \a idx_r in the queue (no range check) */ const value_type & operator[]( size_type idx_r ) const; /** Return the Id at \a idx_r in the queue (no range check) */ value_type & operator[]( size_type idx_r ); /** Clear the queue. */ void clear(); /** Remove all occurances of \a val_r from the queue. */ void remove( value_type val_r ); /** Push a value to the end off the Queue. */ void push( value_type val_r ); /** \overload */ void push_back( value_type val_r ) { push( val_r ); } /** Push a value if it's not yet in the Queue. */ void pushUnique( value_type val_r ); /** Pop and return the last Id from the queue or \c 0 if empty. */ value_type pop(); /** \overload */ value_type pop_back() { return pop(); } /** Push a value to the beginning off the Queue. */ void push_front( value_type val_r ); /** Pop and return the 1st Id from the queue or \c 0 if empty. */ value_type pop_front(); public: operator detail::CQueue *(); ///< libsolv backdoor operator const detail::CQueue *() const ///< libsolv backdoor { return _pimpl.get(); } private: RWCOW_pointer _pimpl; ///< Pointer to implementation }; /** \relates Queue Stream output */ std::ostream & operator<<( std::ostream & str, const Queue & obj ) ZYPP_API; /** \relates Queue Stream output assuming a Solvable queue. */ std::ostream & dumpOn( std::ostream & str, const Queue & obj ) ZYPP_API; /** \relates Queue */ bool operator==( const Queue & lhs, const Queue & rhs ) ZYPP_API; /** \relates Queue */ inline bool operator!=( const Queue & lhs, const Queue & rhs ) { return !( lhs == rhs ); } } // namespace sat /////////////////////////////////////////////////////////////////// /** \relates Queue Clone function for RWCOW_pointer */ template<> sat::detail::CQueue * rwcowClone( const sat::detail::CQueue * rhs ); } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_QUEUE_H libzypp-17.36.5/zypp/sat/SolvAttr.cc000066400000000000000000000222741476576476200173030ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/SolvAttr.cc * */ extern "C" { #include } #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// const SolvAttr SolvAttr::allAttr( detail::noId ); const SolvAttr SolvAttr::noAttr; // There are some attributes here which are not provided by solv files. // At least the ones that do nat have a solv/knownid. const SolvAttr SolvAttr::name ( SOLVABLE_NAME ); const SolvAttr SolvAttr::edition ( SOLVABLE_EVR ); const SolvAttr SolvAttr::arch ( SOLVABLE_ARCH ); const SolvAttr SolvAttr::vendor ( SOLVABLE_VENDOR ); #if __cplusplus < 202002L const SolvAttr SolvAttr::provides ( SOLVABLE_PROVIDES ); const SolvAttr SolvAttr::obsoletes ( SOLVABLE_OBSOLETES ); const SolvAttr SolvAttr::conflicts ( SOLVABLE_CONFLICTS ); const SolvAttr SolvAttr::requires ( SOLVABLE_REQUIRES ); const SolvAttr SolvAttr::recommends ( SOLVABLE_RECOMMENDS ); const SolvAttr SolvAttr::suggests ( SOLVABLE_SUGGESTS ); const SolvAttr SolvAttr::supplements ( SOLVABLE_SUPPLEMENTS ); const SolvAttr SolvAttr::enhances ( SOLVABLE_ENHANCES ); #endif const SolvAttr SolvAttr::dep_provides ( SOLVABLE_PROVIDES ); const SolvAttr SolvAttr::dep_obsoletes ( SOLVABLE_OBSOLETES ); const SolvAttr SolvAttr::dep_conflicts ( SOLVABLE_CONFLICTS ); const SolvAttr SolvAttr::dep_requires ( SOLVABLE_REQUIRES ); const SolvAttr SolvAttr::dep_recommends ( SOLVABLE_RECOMMENDS ); const SolvAttr SolvAttr::dep_suggests ( SOLVABLE_SUGGESTS ); const SolvAttr SolvAttr::dep_supplements( SOLVABLE_SUPPLEMENTS ); const SolvAttr SolvAttr::dep_enhances ( SOLVABLE_ENHANCES ); const SolvAttr SolvAttr::summary ( SOLVABLE_SUMMARY ); // translated const SolvAttr SolvAttr::description ( SOLVABLE_DESCRIPTION ); // translated const SolvAttr SolvAttr::insnotify ( SOLVABLE_MESSAGEINS ); // translated const SolvAttr SolvAttr::delnotify ( SOLVABLE_MESSAGEDEL ); // translated const SolvAttr SolvAttr::eula ( SOLVABLE_EULA ); // translated const SolvAttr SolvAttr::cpeid ( SOLVABLE_CPEID ); const SolvAttr SolvAttr::installtime ( SOLVABLE_INSTALLTIME ); const SolvAttr SolvAttr::buildtime ( SOLVABLE_BUILDTIME ); const SolvAttr SolvAttr::installsize ( SOLVABLE_INSTALLSIZE ); const SolvAttr SolvAttr::downloadsize ( SOLVABLE_DOWNLOADSIZE ); const SolvAttr SolvAttr::diskusage ( SOLVABLE_DISKUSAGE ); //package const SolvAttr SolvAttr::checksum ( SOLVABLE_CHECKSUM ); const SolvAttr SolvAttr::medianr ( SOLVABLE_MEDIANR ); const SolvAttr SolvAttr::mediafile ( SOLVABLE_MEDIAFILE ); const SolvAttr SolvAttr::mediadir ( SOLVABLE_MEDIADIR ); const SolvAttr SolvAttr::changelog ( "changelog" ); const SolvAttr SolvAttr::buildhost ( SOLVABLE_BUILDHOST ); const SolvAttr SolvAttr::distribution ( SOLVABLE_DISTRIBUTION ); const SolvAttr SolvAttr::license ( SOLVABLE_LICENSE ); const SolvAttr SolvAttr::packager ( SOLVABLE_PACKAGER ); const SolvAttr SolvAttr::group ( SOLVABLE_GROUP ); const SolvAttr SolvAttr::keywords ( SOLVABLE_KEYWORDS ); const SolvAttr SolvAttr::sourcesize ( "sourcesize" ); const SolvAttr SolvAttr::authors ( SOLVABLE_AUTHORS ); const SolvAttr SolvAttr::filelist ( SOLVABLE_FILELIST ); const SolvAttr SolvAttr::sourcearch ( SOLVABLE_SOURCEARCH ); const SolvAttr SolvAttr::sourcename ( SOLVABLE_SOURCENAME ); const SolvAttr SolvAttr::sourceevr ( SOLVABLE_SOURCEEVR ); const SolvAttr SolvAttr::headerend ( SOLVABLE_HEADEREND ); const SolvAttr SolvAttr::url ( SOLVABLE_URL ); // patch const SolvAttr SolvAttr::patchcategory ( SOLVABLE_PATCHCATEGORY ); const SolvAttr SolvAttr::rebootSuggested ( UPDATE_REBOOT ); const SolvAttr SolvAttr::restartSuggested ( UPDATE_RESTART ); const SolvAttr SolvAttr::reloginSuggested ( UPDATE_RELOGIN ); const SolvAttr SolvAttr::message ( UPDATE_MESSAGE ); const SolvAttr SolvAttr::severity ( UPDATE_SEVERITY ); const SolvAttr SolvAttr::updateStatus ( UPDATE_STATUS ); const SolvAttr SolvAttr::updateCollection ( UPDATE_COLLECTION ); const SolvAttr SolvAttr::updateCollectionName ( UPDATE_COLLECTION_NAME ); const SolvAttr SolvAttr::updateCollectionEvr ( UPDATE_COLLECTION_EVR ); const SolvAttr SolvAttr::updateCollectionArch ( UPDATE_COLLECTION_ARCH ); const SolvAttr SolvAttr::updateCollectionFilename ( UPDATE_COLLECTION_FILENAME ); const SolvAttr SolvAttr::updateCollectionFlags ( UPDATE_COLLECTION_FLAGS ); const SolvAttr SolvAttr::updateReference ( UPDATE_REFERENCE ); const SolvAttr SolvAttr::updateReferenceType ( UPDATE_REFERENCE_TYPE ); const SolvAttr SolvAttr::updateReferenceHref ( UPDATE_REFERENCE_HREF ); const SolvAttr SolvAttr::updateReferenceId ( UPDATE_REFERENCE_ID ); const SolvAttr SolvAttr::updateReferenceTitle ( UPDATE_REFERENCE_TITLE ); //pattern const SolvAttr SolvAttr::isvisible ( SOLVABLE_ISVISIBLE ); const SolvAttr SolvAttr::icon ( SOLVABLE_ICON ); const SolvAttr SolvAttr::order ( SOLVABLE_ORDER ); const SolvAttr SolvAttr::isdefault ( "isdefault" ); const SolvAttr SolvAttr::category ( SOLVABLE_CATEGORY ); // translated const SolvAttr SolvAttr::script ( "script" ); const SolvAttr SolvAttr::includes ( SOLVABLE_INCLUDES ); const SolvAttr SolvAttr::extends ( SOLVABLE_EXTENDS ); // product const SolvAttr SolvAttr::productReferenceFile ( PRODUCT_REFERENCEFILE ); const SolvAttr SolvAttr::productProductLine ( PRODUCT_PRODUCTLINE ); const SolvAttr SolvAttr::productShortlabel ( PRODUCT_SHORTLABEL ); const SolvAttr SolvAttr::productDistproduct ( PRODUCT_DISTPRODUCT ); const SolvAttr SolvAttr::productDistversion ( PRODUCT_DISTVERSION ); const SolvAttr SolvAttr::productType ( PRODUCT_TYPE ); const SolvAttr SolvAttr::productFlags ( PRODUCT_FLAGS ); const SolvAttr SolvAttr::productEndOfLife ( PRODUCT_ENDOFLIFE ); const SolvAttr SolvAttr::productRegisterTarget ( PRODUCT_REGISTER_TARGET ); const SolvAttr SolvAttr::productRegisterRelease( PRODUCT_REGISTER_RELEASE ); const SolvAttr SolvAttr::productRegisterFlavor ( PRODUCT_REGISTER_FLAVOR ); const SolvAttr SolvAttr::productUrl ( PRODUCT_URL ); const SolvAttr SolvAttr::productUrlType ( PRODUCT_URL_TYPE ); /** array of repoids, hopefully label s too */ const SolvAttr SolvAttr::productUpdates ( PRODUCT_UPDATES ); const SolvAttr SolvAttr::productUpdatesRepoid ( PRODUCT_UPDATES_REPOID ); // repository const SolvAttr SolvAttr::repositoryDeltaInfo ( REPOSITORY_DELTAINFO ); const SolvAttr SolvAttr::repositoryAddedFileProvides ( REPOSITORY_ADDEDFILEPROVIDES ); const SolvAttr SolvAttr::repositoryRpmDbCookie ( REPOSITORY_RPMDBCOOKIE ); const SolvAttr SolvAttr::repositoryTimestamp ( REPOSITORY_TIMESTAMP ); const SolvAttr SolvAttr::repositoryExpire ( REPOSITORY_EXPIRE ); /** array of repositoryProductLabel repositoryProductCpeid pairs */ const SolvAttr SolvAttr::repositoryUpdates ( REPOSITORY_UPDATES ); /** array of repositoryProductLabel repositoryProductCpeid pairs */ const SolvAttr SolvAttr::repositoryDistros ( REPOSITORY_DISTROS ); const SolvAttr SolvAttr::repositoryProductLabel ( REPOSITORY_PRODUCT_LABEL ); const SolvAttr SolvAttr::repositoryProductCpeid ( REPOSITORY_PRODUCT_CPEID ); const SolvAttr SolvAttr::repositoryRepoid ( REPOSITORY_REPOID ); const SolvAttr SolvAttr::repositoryKeywords ( REPOSITORY_KEYWORDS ); const SolvAttr SolvAttr::repositoryRevision ( REPOSITORY_REVISION ); const SolvAttr SolvAttr::repositoryToolVersion ( REPOSITORY_TOOLVERSION ); ///////////////////////////////////////////////////////////////// SolvAttr SolvAttr::parent() const { switch( id() ) { case UPDATE_COLLECTION_NAME: case UPDATE_COLLECTION_EVR: case UPDATE_COLLECTION_ARCH: case UPDATE_COLLECTION_FILENAME: case UPDATE_COLLECTION_FLAGS: return updateCollection; break; case UPDATE_REFERENCE_TYPE: case UPDATE_REFERENCE_HREF: case UPDATE_REFERENCE_ID: case UPDATE_REFERENCE_TITLE: return updateReference; break; } return noAttr; } } // namespace sat ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/SolvAttr.h000066400000000000000000000203751476576476200171450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvAttr.h * */ #ifndef ZYPP_SAT_SOLVATTR_H #define ZYPP_SAT_SOLVATTR_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolvAttr // /** Solvable attribute keys. * * Attributes associated with individual solvables, * or with the repository as a whole. * * \note If you add well known subsructure attributes, update \ref parent. * * \see \ref LookupAttr */ class ZYPP_API SolvAttr : public IdStringType { public: /** \name Some builtin SolvAttr constants. */ //@{ /** Value to request searching all Attributes (0). */ static const SolvAttr allAttr; /** Value representing \c noAttr ("")*/ static const SolvAttr noAttr; /** \name special solvable attributes which are part of the ::Solvable struct */ //@{ static const SolvAttr name; static const SolvAttr edition; static const SolvAttr arch; static const SolvAttr vendor; //@} #if __cplusplus < 202002L /** \name dependency attributes */ static const SolvAttr provides ZYPP_DEPRECATED; // use dep_ prefixed version instead static const SolvAttr obsoletes ZYPP_DEPRECATED; // use dep_ prefixed version instead static const SolvAttr conflicts ZYPP_DEPRECATED; // use dep_ prefixed version instead #if __GNUC__ >= 10 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wc++20-compat" #endif static const SolvAttr requires ZYPP_DEPRECATED; // use dep_ prefixed version instead #if __GNUC__ >= 10 #pragma GCC diagnostic pop #endif static const SolvAttr recommends ZYPP_DEPRECATED; // use dep_ prefixed version instead static const SolvAttr suggests ZYPP_DEPRECATED; // use dep_ prefixed version instead static const SolvAttr supplements ZYPP_DEPRECATED; // use dep_ prefixed version instead static const SolvAttr enhances ZYPP_DEPRECATED; // use dep_ prefixed version instead #endif /** \name dependency attributes */ static const SolvAttr dep_provides; static const SolvAttr dep_obsoletes; static const SolvAttr dep_conflicts; static const SolvAttr dep_requires; static const SolvAttr dep_recommends; static const SolvAttr dep_suggests; static const SolvAttr dep_supplements; static const SolvAttr dep_enhances; /** \name common */ //@{ static const SolvAttr summary; static const SolvAttr description; static const SolvAttr insnotify; static const SolvAttr delnotify; static const SolvAttr eula; static const SolvAttr installtime; static const SolvAttr buildtime; static const SolvAttr installsize; static const SolvAttr downloadsize; static const SolvAttr diskusage; static const SolvAttr cpeid; //@} /** \name package */ //@{ static const SolvAttr checksum; static const SolvAttr mediadir; static const SolvAttr medianr; static const SolvAttr mediafile; static const SolvAttr changelog; static const SolvAttr buildhost; static const SolvAttr distribution; static const SolvAttr license; static const SolvAttr packager; static const SolvAttr group; static const SolvAttr keywords; static const SolvAttr sourcesize; static const SolvAttr authors; static const SolvAttr filelist; static const SolvAttr sourcearch; static const SolvAttr sourcename; static const SolvAttr sourceevr; static const SolvAttr headerend; static const SolvAttr url; //@} /** \name patch */ //@{ static const SolvAttr patchcategory; static const SolvAttr rebootSuggested; static const SolvAttr restartSuggested; static const SolvAttr reloginSuggested; static const SolvAttr message; static const SolvAttr severity; static const SolvAttr updateStatus; // "retracted", "stable",... static const SolvAttr updateCollection; // SUB-STRUCTURE: static const SolvAttr updateCollectionName; // name static const SolvAttr updateCollectionEvr; // evr static const SolvAttr updateCollectionArch; // arch static const SolvAttr updateCollectionFilename; // filename static const SolvAttr updateCollectionFlags; // flags static const SolvAttr updateReference; // SUB-STRUCTURE: static const SolvAttr updateReferenceType; // type static const SolvAttr updateReferenceHref; // href static const SolvAttr updateReferenceId; // id static const SolvAttr updateReferenceTitle; // title //@} /** \name pattern */ //@{ static const SolvAttr isvisible; static const SolvAttr icon; static const SolvAttr order; static const SolvAttr isdefault; static const SolvAttr category; static const SolvAttr script; static const SolvAttr includes; static const SolvAttr extends; //@} /** \name product */ //@{ static const SolvAttr productReferenceFile; static const SolvAttr productProductLine; static const SolvAttr productShortlabel; static const SolvAttr productDistproduct; static const SolvAttr productDistversion; static const SolvAttr productType; static const SolvAttr productFlags; static const SolvAttr productEndOfLife; static const SolvAttr productRegisterTarget; static const SolvAttr productRegisterRelease; static const SolvAttr productRegisterFlavor; static const SolvAttr productUrl; static const SolvAttr productUrlType; static const SolvAttr productUpdates; // SUB-STRUCTURE: static const SolvAttr productUpdatesRepoid; // repoid //@} /** \name repository */ //@{ static const SolvAttr repositoryDeltaInfo; static const SolvAttr repositoryAddedFileProvides; static const SolvAttr repositoryRpmDbCookie; static const SolvAttr repositoryTimestamp; static const SolvAttr repositoryExpire; static const SolvAttr repositoryUpdates; static const SolvAttr repositoryDistros; static const SolvAttr repositoryProductLabel; static const SolvAttr repositoryProductCpeid; static const SolvAttr repositoryRepoid; static const SolvAttr repositoryKeywords; static const SolvAttr repositoryRevision; static const SolvAttr repositoryToolVersion; //@} //@} public: /** Default ctor: \ref noAttr */ SolvAttr() {} /** Ctor taking kind as string. */ explicit SolvAttr( sat::detail::IdType id_r ) : _str( id_r ) {} explicit SolvAttr( const IdString & idstr_r ) : _str( idstr_r ) {} explicit SolvAttr( const std::string & str_r ) : _str( str_r ) {} explicit SolvAttr( const char * cstr_r ) : _str( cstr_r ) {} /** Return the parent of well know sub-structure attributes (\ref SolvAttr::noAttr if none). * \li \ref updateCollection * \li \ref updateReference */ SolvAttr parent() const; /** Whether this is a well know sub-structure attribute. */ bool hasParent() const { return parent() != noAttr; } private: friend class IdStringType; IdString _str; }; ///////////////////////////////////////////////////////////////// } // namespace sat } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_sat_SolvAttr_H libzypp-17.36.5/zypp/sat/SolvIterMixin.cc000066400000000000000000000051341476576476200202750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvIterMixin.cc * */ //#include //#include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// namespace solvitermixin_detail { bool UnifyByIdent::operator()( const Solvable & solv_r ) const { // Need to use pool::ByIdent because packages and srcpackages have the same id. return( solv_r && _uset->insert( pool::ByIdent( solv_r ).get() ).second ); } } /////////////////////////////////////////////////////////////////// // asSolvable /////////////////////////////////////////////////////////////////// Solvable asSolvable::operator()( const PoolItem & pi_r ) const { return pi_r.satSolvable(); } Solvable asSolvable::operator()( const ResObject_constPtr & res_r ) const { return res_r ? res_r->satSolvable() : Solvable(); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// Selectable_Ptr asSelectable::operator()( const sat::Solvable & sov_r ) const { return ResPool::instance().proxy().lookup( sov_r ); } ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/SolvIterMixin.h000066400000000000000000000201341476576476200201340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvIterMixin.h * */ #ifndef ZYPP_SAT_SOLVITERMIXIN_H #define ZYPP_SAT_SOLVITERMIXIN_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// class Solvable; //class asSolvable; // transform functor namespace solvitermixin_detail { /** Unify by \c ident \c (kind:name). * Return true on the 1st appearance of a new \c ident. This is * used in \ref SolvIterMixin when mapping a Solvable iterator * to a Selectable iterator. */ struct ZYPP_API UnifyByIdent { bool operator()( const Solvable & solv_r ) const; using Uset = std::unordered_set; UnifyByIdent() : _uset( new Uset ) {} shared_ptr _uset; }; } // namespace solvitermixin_detail /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolvIterMixin // /** Base class providing common iterator types based on a \ref Solvable iterator. * * A class deriving from \ref SolvIterMixin must provide two methods * \c begin and \c end returning iterator over \ref sat::Solvable. * * \ref SolvIterMixin will then provide iterators over the corresponding * \ref PoolItem and \ref ui::Selectable_Ptr. * * \ref SolvIterMixin will also provide default implementations for \ref empty * and \ref size by iterating from \c begin to \c end. In case \c Derived is * able to provide a more efficient implementation, the methods should be overloaded. * * \note You will sometimes face the problem, that when using the \ref PoolItem * iterator you hit multiple version of the same package, while when using the * \ref ui::Selectable iterator the information which of the available candidates * actually matched got lost. In this case class \ref PoolItemBest may help you. * Use it to pick the best version only. * * \code * namespace detail * { * class WhatProvidesIterator; * } * * class WhatProvides : public SolvIterMixin * { * public: * typedef detail::WhatProvidesIterator const_iterator; * * // Iterator pointing to the first Solvable. * const_iterator begin() const; * * // Iterator pointing behind the last Solvable. * const_iterator end() const; * * }; * * namespace detail * { * class WhatProvidesIterator : public boost::iterator_adaptor< * WhatProvidesIterator // Derived * , const detail::IdType * // Base * , const Solvable // Value * , boost::forward_traversal_tag // CategoryOrTraversal * , const Solvable // Reference * > * { * ... * }; * } * \endcode * \ingroup g_CRTP */ template class SolvIterMixin { public: using size_type = size_t; public: /** \name Convenience methods. * In case \c Derived is able to provide a more efficient implementation, * the methods should be overloaded. */ //@{ /** Whether the collection is epmty. */ bool empty() const { return( self().begin() == self().end() ); } /** Size of the collection. */ size_type size() const { size_type s = 0; for_( it, self().begin(), self().end() ) ++s; return s;} /** Whether collection contains a specific \ref Solvable. */ template bool contains( const TSolv & solv_r ) const { Solvable solv( asSolvable()( solv_r ) ); for_( it, self().begin(), self().end() ) if ( *it == solv ) return true; return false; } //@} public: /** \name Iterate as Solvable */ //@{ using Solvable_iterator = DerivedSolvable_iterator; Solvable_iterator solvableBegin() const { return self().begin(); } Solvable_iterator solvableEnd() const { return self().end(); } Iterable solvable() const { return makeIterable( solvableBegin(), solvableEnd() ); } //@} /** \name Iterate as PoolItem */ //@{ using PoolItem_iterator = transform_iterator; PoolItem_iterator poolItemBegin() const { return make_transform_iterator( solvableBegin(), asPoolItem() ); } PoolItem_iterator poolItemEnd() const { return make_transform_iterator( solvableEnd(), asPoolItem() ); } Iterable poolItem() const { return makeIterable( poolItemBegin(), poolItemEnd() ); } //@} private: using UnifiedSolvable_iterator = filter_iterator; public: /** \name Iterate ui::Selectable::Ptr */ //@{ using Selectable_iterator = transform_iterator; Selectable_iterator selectableBegin() const { return make_transform_iterator( unifiedSolvableBegin(), ui::asSelectable() ); } Selectable_iterator selectableEnd() const { return make_transform_iterator( unifiedSolvableEnd(), ui::asSelectable() ); } Iterable selectable() const { return makeIterable( selectableBegin(), selectableEnd() ); } //@} private: /** \name Iterate unified Solbvables to be transformed into Selectable. */ //@{ UnifiedSolvable_iterator unifiedSolvableBegin() const { return make_filter_iterator( solvitermixin_detail::UnifyByIdent(), solvableBegin(), solvableEnd() ); } UnifiedSolvable_iterator unifiedSolvableEnd() const { return make_filter_iterator( solvitermixin_detail::UnifyByIdent(), solvableEnd(), solvableEnd() ); } Iterable unifiedSolvable() const { return makeIterable( unifiedSolvableBegin(), unifiedSolvableEnd() ); } //@} private: const Derived & self() const { return *static_cast( this ); } protected: SolvIterMixin() {} ~SolvIterMixin() {} SolvIterMixin(const SolvIterMixin &) = default; SolvIterMixin & operator=(const SolvIterMixin &) = default; SolvIterMixin(SolvIterMixin &&) noexcept = default; SolvIterMixin &operator=(SolvIterMixin &&) noexcept = default; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_SOLVITERMIXIN_H libzypp-17.36.5/zypp/sat/Solvable.cc000066400000000000000000000643421476576476200172760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Solvable.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { /////////////////////////////////////////////////////////////////// namespace { void _doSplit( IdString & _ident, ResKind & _kind, IdString & _name ) { if ( ! _ident ) return; ResKind explicitKind = ResKind::explicitBuiltin( _ident.c_str() ); // NOTE: kind package and srcpackage do not have namespaced ident! if ( ! explicitKind ) { _name = _ident; // No kind defaults to package if ( !_kind ) _kind = ResKind::package; else if ( ! ( _kind == ResKind::package || _kind == ResKind::srcpackage ) ) _ident = IdString( str::form( "%s:%s", _kind.c_str(), _ident.c_str() ) ); } else { // strip kind spec from name _name = IdString( ::strchr( _ident.c_str(), ':' )+1 ); _kind = explicitKind; if ( _kind == ResKind::package || _kind == ResKind::srcpackage ) _ident = _name; } return; } } // namespace /////////////////////////////////////////////////////////////////// Solvable::SplitIdent::SplitIdent( IdString ident_r ) : _ident( ident_r ) { _doSplit( _ident, _kind, _name ); } Solvable::SplitIdent::SplitIdent( const char * ident_r ) : _ident( ident_r ) { _doSplit( _ident, _kind, _name ); } Solvable::SplitIdent::SplitIdent( const std::string & ident_r ) : _ident( ident_r ) { _doSplit( _ident, _kind, _name ); } Solvable::SplitIdent::SplitIdent( ResKind kind_r, IdString name_r ) : _ident( name_r ) , _kind(std::move( kind_r )) { _doSplit( _ident, _kind, _name ); } Solvable::SplitIdent::SplitIdent( ResKind kind_r, const C_Str & name_r ) : _ident( name_r ) , _kind(std::move( kind_r )) { _doSplit( _ident, _kind, _name ); } ///////////////////////////////////////////////////////////////// // class Solvable ///////////////////////////////////////////////////////////////// const Solvable Solvable::noSolvable; const IdString Solvable::retractedToken { "retracted-patch-package()" }; const IdString Solvable::ptfMasterToken { "ptf()" }; const IdString Solvable::ptfPackageToken { "ptf-package()" }; ///////////////////////////////////////////////////////////////// detail::CSolvable * Solvable::get() const { return myPool().getSolvable( _id ); } #define NO_SOLVABLE_RETURN( VAL ) \ detail::CSolvable * _solvable( get() ); \ if ( ! _solvable ) return VAL Solvable Solvable::nextInPool() const { return Solvable( myPool().getNextId( _id ) ); } Solvable Solvable::nextInRepo() const { NO_SOLVABLE_RETURN( noSolvable ); for ( detail::SolvableIdType next = _id+1; next < unsigned(_solvable->repo->end); ++next ) { detail::CSolvable * nextS( myPool().getSolvable( next ) ); if ( nextS && nextS->repo == _solvable->repo ) { return Solvable( next ); } } return noSolvable; } std::string Solvable::lookupStrAttribute( const SolvAttr & attr ) const { NO_SOLVABLE_RETURN( std::string() ); const char * s = ::solvable_lookup_str( _solvable, attr.id() ); return s ? s : std::string(); } std::string Solvable::lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const { NO_SOLVABLE_RETURN( std::string() ); const char * s = 0; if ( !lang_r ) { s = ::solvable_lookup_str_poollang( _solvable, attr.id() ); } else { for ( Locale l( lang_r ); l; l = l.fallback() ) { if ( (s = ::solvable_lookup_str_lang( _solvable, attr.id(), l.c_str(), 0 )) ) return s; } // here: no matching locale, so use default s = ::solvable_lookup_str_lang( _solvable, attr.id(), 0, 0 ); } return s ? s : std::string(); } unsigned long long Solvable::lookupNumAttribute( const SolvAttr & attr ) const { NO_SOLVABLE_RETURN( 0 ); return ::solvable_lookup_num( _solvable, attr.id(), 0 ); } unsigned long long Solvable::lookupNumAttribute( const SolvAttr & attr, unsigned long long notfound_r ) const { NO_SOLVABLE_RETURN( notfound_r ); return ::solvable_lookup_num( _solvable, attr.id(), notfound_r ); } bool Solvable::lookupBoolAttribute( const SolvAttr & attr ) const { NO_SOLVABLE_RETURN( false ); return ::solvable_lookup_bool( _solvable, attr.id() ); } detail::IdType Solvable::lookupIdAttribute( const SolvAttr & attr ) const { NO_SOLVABLE_RETURN( detail::noId ); return ::solvable_lookup_id( _solvable, attr.id() ); } CheckSum Solvable::lookupCheckSumAttribute( const SolvAttr & attr ) const { NO_SOLVABLE_RETURN( CheckSum() ); detail::IdType chksumtype = 0; const char * s = ::solvable_lookup_checksum( _solvable, attr.id(), &chksumtype ); if ( ! s ) return CheckSum(); switch ( chksumtype ) { case REPOKEY_TYPE_MD5: return CheckSum::md5( s ); case REPOKEY_TYPE_SHA1: return CheckSum::sha1( s ); case REPOKEY_TYPE_SHA224: return CheckSum::sha224( s ); case REPOKEY_TYPE_SHA256: return CheckSum::sha256( s ); case REPOKEY_TYPE_SHA384: return CheckSum::sha384( s ); case REPOKEY_TYPE_SHA512: return CheckSum::sha512( s ); } return CheckSum( std::string(), s ); // try to autodetect } /////////////////////////////////////////////////////////////////// namespace { inline Pathname lookupDatadirIn( Repository repor_r ) { static const SolvAttr susetagsDatadir( "susetags:datadir" ); Pathname ret; // First look for repo attribute "susetags:datadir". If not found, // look into the solvables as Code11 libsolv placed it there. LookupRepoAttr datadir( susetagsDatadir, repor_r ); if ( ! datadir.empty() ) ret = datadir.begin().asString(); else { LookupAttr datadir( susetagsDatadir, repor_r ); if ( ! datadir.empty() ) ret = datadir.begin().asString(); } return ret; } } // namespace /////////////////////////////////////////////////////////////////// OnMediaLocation Solvable::lookupLocation() const { NO_SOLVABLE_RETURN( OnMediaLocation() ); // medianumber and path unsigned medianr = 0; const char * file = ::solvable_lookup_location( _solvable, &medianr ); if ( ! file ) return OnMediaLocation(); if ( ! medianr ) medianr = 1; OnMediaLocation ret; Pathname path; switch ( repository().info().type().toEnum() ) { case repo::RepoType::NONE_e: { path = lookupDatadirIn( repository() ); if ( ! path.empty() ) repository().info().setProbedType( repo::RepoType::YAST2_e ); } break; case repo::RepoType::YAST2_e: { path = lookupDatadirIn( repository() ); if ( path.empty() ) path = "suse"; } break; default: break; } ret.setLocation ( path/file, medianr ); ret.setDownloadSize( ByteCount( lookupNumAttribute( SolvAttr::downloadsize ) ) ); ret.setChecksum ( lookupCheckSumAttribute( SolvAttr::checksum ) ); // Not needed/available for solvables? //ret.setOpenSize ( ByteCount( lookupNumAttribute( SolvAttr::opensize ) ) ); //ret.setOpenChecksum( lookupCheckSumAttribute( SolvAttr::openchecksum ) ); return ret; } IdString Solvable::ident() const { NO_SOLVABLE_RETURN( IdString() ); return IdString( _solvable->name ); } ResKind Solvable::kind() const { NO_SOLVABLE_RETURN( ResKind() ); // detect srcpackages by 'arch' switch ( _solvable->arch ) { case ARCH_SRC: case ARCH_NOSRC: return ResKind::srcpackage; break; } // either explicitly prefixed... const char * ident = IdString( _solvable->name ).c_str(); ResKind knownKind( ResKind::explicitBuiltin( ident ) ); if ( knownKind ) return knownKind; // ...or no ':' in package names (hopefully)... const char * sep = ::strchr( ident, ':' ); if ( ! sep ) return ResKind::package; // ...or something unknown. return ResKind( std::string( ident, sep-ident ) ); } bool Solvable::isKind( const ResKind & kind_r ) const { NO_SOLVABLE_RETURN( false ); // detect srcpackages by 'arch' switch ( _solvable->arch ) { case ARCH_SRC: case ARCH_NOSRC: return( kind_r == ResKind::srcpackage ); break; } // no ':' in package names (hopefully) const char * ident = IdString( _solvable->name ).c_str(); if ( kind_r == ResKind::package ) { return( ::strchr( ident, ':' ) == 0 ); } // look for a 'kind:' prefix const char * kind = kind_r.c_str(); unsigned ksize = ::strlen( kind ); return( ::strncmp( ident, kind, ksize ) == 0 && ident[ksize] == ':' ); } std::string Solvable::name() const { NO_SOLVABLE_RETURN( std::string() ); const char * ident = IdString( _solvable->name ).c_str(); const char * sep = ::strchr( ident, ':' ); return( sep ? sep+1 : ident ); } Edition Solvable::edition() const { NO_SOLVABLE_RETURN( Edition() ); return Edition( _solvable->evr ); } Arch Solvable::arch() const { NO_SOLVABLE_RETURN( Arch_noarch ); //ArchId() ); switch ( _solvable->arch ) { case ARCH_SRC: case ARCH_NOSRC: return Arch_noarch; //ArchId( ARCH_NOARCH ); break; } return Arch( IdString(_solvable->arch).asString() ); //return ArchId( _solvable->arch ); } IdString Solvable::vendor() const { NO_SOLVABLE_RETURN( IdString() ); return IdString( _solvable->vendor ); } Repository Solvable::repository() const { NO_SOLVABLE_RETURN( Repository::noRepository ); return Repository( _solvable->repo ); } RepoInfo Solvable::repoInfo() const { return repository().info(); } bool Solvable::isSystem() const { NO_SOLVABLE_RETURN( _id == detail::systemSolvableId ); return myPool().isSystemRepo( _solvable->repo ); } bool Solvable::onSystemByUser() const { return isSystem() && myPool().isOnSystemByUser( ident() ); } bool Solvable::onSystemByAuto() const { return isSystem() && myPool().isOnSystemByAuto( ident() ); } bool Solvable::identIsAutoInstalled( const IdString & ident_r ) { return myPool().isOnSystemByAuto( ident_r ); } bool Solvable::isNeedreboot() const { NO_SOLVABLE_RETURN( false ); return myPool().isNeedreboot( *this ); } // TODO: Optimize bool Solvable::isBlacklisted() const { return isPtf() || isRetracted(); } bool Solvable::isRetracted() const { NO_SOLVABLE_RETURN( false ); if ( isKind() ) return myPool().isRetracted( *this ); if ( isKind() ) return lookupStrAttribute( SolvAttr::updateStatus ) == "retracted"; return false; } bool Solvable::isPtf() const { return isPtfPackage() || isPtfMaster(); } bool Solvable::isPtfMaster() const { NO_SOLVABLE_RETURN( false ); return myPool().isPtfMaster( *this ); } bool Solvable::isPtfPackage() const { NO_SOLVABLE_RETURN( false ); return myPool().isPtfPackage( *this ); } bool Solvable::multiversionInstall() const { NO_SOLVABLE_RETURN( false ); return myPool().isMultiversion( *this ); } Date Solvable::buildtime() const { NO_SOLVABLE_RETURN( Date() ); return Date( lookupNumAttribute( SolvAttr::buildtime ) ); } Date Solvable::installtime() const { NO_SOLVABLE_RETURN( Date() ); return Date( lookupNumAttribute( SolvAttr::installtime ) ); } std::string Solvable::asString() const { NO_SOLVABLE_RETURN( (_id == detail::systemSolvableId ? "systemSolvable" : "noSolvable") ); return str::form( "%s-%s.%s", IdString( _solvable->name ).c_str(), IdString( _solvable->evr ).c_str(), IdString( _solvable->arch ).c_str() ); } std::string Solvable::asUserString() const\ { NO_SOLVABLE_RETURN( (_id == detail::systemSolvableId ? "systemSolvable" : "noSolvable") ); return str::form( "%s-%s.%s (%s)", IdString( _solvable->name ).c_str(), IdString( _solvable->evr ).c_str(), IdString( _solvable->arch ).c_str(), repository().asUserString().c_str() ); } bool Solvable::identical( const Solvable & rhs ) const { NO_SOLVABLE_RETURN( ! rhs.get() ); detail::CSolvable * rhssolvable( rhs.get() ); return rhssolvable && ( _solvable == rhssolvable || ::solvable_identical( _solvable, rhssolvable ) ); } /////////////////////////////////////////////////////////////////// namespace { inline Capabilities _getCapabilities( detail::IdType * idarraydata_r, ::Offset offs_r ) { return offs_r ? Capabilities( idarraydata_r + offs_r ) : Capabilities(); } } // namespace /////////////////////////////////////////////////////////////////// Capabilities Solvable::dep_provides() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_provides ); } Capabilities Solvable::dep_requires() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_requires ); } Capabilities Solvable::dep_conflicts() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_conflicts ); } Capabilities Solvable::dep_obsoletes() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_obsoletes ); } Capabilities Solvable::dep_recommends() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_recommends ); } Capabilities Solvable::dep_suggests() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_suggests ); } Capabilities Solvable::dep_enhances() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_enhances ); } Capabilities Solvable::dep_supplements() const { NO_SOLVABLE_RETURN( Capabilities() ); return _getCapabilities( _solvable->repo->idarraydata, _solvable->dep_supplements ); } Capabilities Solvable::dep_prerequires() const { NO_SOLVABLE_RETURN( Capabilities() ); // prerequires are a subset of requires ::Offset offs = _solvable->dep_requires; return offs ? Capabilities( _solvable->repo->idarraydata + offs, detail::solvablePrereqMarker ) : Capabilities(); } #if __cplusplus < 202002L #define DECLARE_CAP_FWD(_Fnc_Name) \ Capabilities Solvable::_Fnc_Name() const \ { return dep_##_Fnc_Name(); } DECLARE_CAP_FWD(provides) DECLARE_CAP_FWD(requires) DECLARE_CAP_FWD(conflicts) DECLARE_CAP_FWD(obsoletes) DECLARE_CAP_FWD(recommends) DECLARE_CAP_FWD(suggests) DECLARE_CAP_FWD(enhances) DECLARE_CAP_FWD(supplements) DECLARE_CAP_FWD(prerequires) #undef DECLARE_CAP_FWD #endif CapabilitySet Solvable::providesNamespace( const std::string & namespace_r ) const { NO_SOLVABLE_RETURN( CapabilitySet() ); CapabilitySet ret; Capabilities caps( dep_provides() ); for_( it, caps.begin(), caps.end() ) { CapDetail caprep( it->detail() ); if ( str::hasPrefix( caprep.name().c_str(), namespace_r ) && *(caprep.name().c_str()+namespace_r.size()) == '(' ) ret.insert( *it ); } return ret; } CapabilitySet Solvable::valuesOfNamespace( const std::string & namespace_r ) const { NO_SOLVABLE_RETURN( CapabilitySet() ); CapabilitySet ret; Capabilities caps( dep_provides() ); for_( it, caps.begin(), caps.end() ) { CapDetail caprep( it->detail() ); if ( str::hasPrefix( caprep.name().c_str(), namespace_r ) && *(caprep.name().c_str()+namespace_r.size()) == '(' ) { std::string value( caprep.name().c_str()+namespace_r.size()+1 ); value[value.size()-1] = '\0'; // erase the trailing ')' ret.insert( Capability( value, caprep.op(), caprep.ed() ) ); } } return ret; } std::pair Solvable::matchesSolvable(const SolvAttr &attr, const Solvable &solv) const { sat::Queue capQueue; int res = solvable_matchessolvable( get(), attr.id(), static_cast( solv.id() ), capQueue, 0 ); CapabilitySet caps; if ( capQueue.size() ) std::for_each( capQueue.begin(), capQueue.end(), [ &caps ]( auto cap ){ caps.insert( Capability(cap) );}); return std::make_pair( res == 1, std::move(caps) ); } /////////////////////////////////////////////////////////////////// namespace { /** Expand \ref Capability and call \c fnc_r for each namespace:language * dependency. Return #invocations of fnc_r, negative if fnc_r returned * false to indicate abort. */ int invokeOnEachSupportedLocale( Capability cap_r, const function& fnc_r ) { CapDetail detail( cap_r ); if ( detail.kind() == CapDetail::EXPRESSION ) { switch ( detail.capRel() ) { case CapDetail::CAP_AND: case CapDetail::CAP_OR: // expand { int res = invokeOnEachSupportedLocale( detail.lhs(), fnc_r ); if ( res < 0 ) return res; // negative on abort. int res2 = invokeOnEachSupportedLocale( detail.rhs(), fnc_r ); if ( res2 < 0 ) return -res + res2; // negative on abort. return res + res2; } break; case CapDetail::CAP_NAMESPACE: if ( detail.lhs().id() == NAMESPACE_LANGUAGE ) { return ( !fnc_r || fnc_r( Locale( IdString(detail.rhs().id()) ) ) ) ? 1 : -1; // negative on abort. } break; default: break; // unwanted } } return 0; } /** Expand \ref Capability and call \c fnc_r for each namespace:language * dependency. Return #invocations of fnc_r, negative if fnc_r returned * false to indicate abort. */ inline int invokeOnEachSupportedLocale( Capabilities cap_r, const function& fnc_r ) { int cnt = 0; for_( cit, cap_r.begin(), cap_r.end() ) { int res = invokeOnEachSupportedLocale( *cit, fnc_r ); if ( res < 0 ) return -cnt + res; // negative on abort. cnt += res; } return cnt; } //@} // Functor returning false if a Locale is in the set. struct NoMatchIn { NoMatchIn( const LocaleSet & locales_r ) : _locales( locales_r ) {} bool operator()( const Locale & locale_r ) const { return _locales.find( locale_r ) == _locales.end(); } const LocaleSet & _locales; }; } // namespace /////////////////////////////////////////////////////////////////// bool Solvable::supportsLocales() const { // false_c stops on 1st Locale. return invokeOnEachSupportedLocale( dep_supplements(), functor::false_c() ) < 0; } bool Solvable::supportsLocale( const Locale & locale_r ) const { // not_equal_to stops on == Locale. return invokeOnEachSupportedLocale( dep_supplements(), bind( std::not_equal_to(), locale_r, _1 ) ) < 0; } bool Solvable::supportsLocale( const LocaleSet & locales_r ) const { if ( locales_r.empty() ) return false; // NoMatchIn stops if Locale is included. return invokeOnEachSupportedLocale( dep_supplements(), NoMatchIn(locales_r) ) < 0; } bool Solvable::supportsRequestedLocales() const { return supportsLocale( myPool().getRequestedLocales() ); } LocaleSet Solvable::getSupportedLocales() const { LocaleSet ret; invokeOnEachSupportedLocale( dep_supplements(), functor::collector( std::inserter( ret, ret.begin() ) ) ); return ret; } CpeId Solvable::cpeId() const { NO_SOLVABLE_RETURN( CpeId() ); return CpeId( lookupStrAttribute( SolvAttr::cpeid ), CpeId::noThrow ); } unsigned Solvable::mediaNr() const { NO_SOLVABLE_RETURN( 0U ); // medianumber and path unsigned medianr = 0U; const char * file = ::solvable_lookup_location( _solvable, &medianr ); if ( ! file ) medianr = 0U; else if ( ! medianr ) medianr = 1U; return medianr; } ByteCount Solvable::installSize() const { NO_SOLVABLE_RETURN( ByteCount() ); return ByteCount( lookupNumAttribute( SolvAttr::installsize ) ); } ByteCount Solvable::downloadSize() const { NO_SOLVABLE_RETURN( ByteCount() ); return ByteCount( lookupNumAttribute( SolvAttr::downloadsize ) ); } std::string Solvable::distribution() const { NO_SOLVABLE_RETURN( std::string() ); return lookupStrAttribute( SolvAttr::distribution ); } std::string Solvable::summary( const Locale & lang_r ) const { NO_SOLVABLE_RETURN( std::string() ); return lookupStrAttribute( SolvAttr::summary, lang_r ); } std::string Solvable::description( const Locale & lang_r ) const { NO_SOLVABLE_RETURN( std::string() ); return lookupStrAttribute( SolvAttr::description, lang_r ); } std::string Solvable::insnotify( const Locale & lang_r ) const { NO_SOLVABLE_RETURN( std::string() ); return lookupStrAttribute( SolvAttr::insnotify, lang_r ); } std::string Solvable::delnotify( const Locale & lang_r ) const { NO_SOLVABLE_RETURN( std::string() ); return lookupStrAttribute( SolvAttr::delnotify, lang_r ); } std::string Solvable::licenseToConfirm( const Locale & lang_r ) const { NO_SOLVABLE_RETURN( std::string() ); std::string ret = lookupStrAttribute( SolvAttr::eula, lang_r ); if ( ret.empty() && isKind() ) { const RepoInfo & ri( repoInfo() ); std::string riname( name() ); // "license-"+name with fallback "license" if ( ! ri.hasLicense( riname ) ) riname.clear(); if ( ri.needToAcceptLicense( riname ) || ! ui::Selectable::get( *this )->hasInstalledObj() ) ret = ri.getLicense( riname, lang_r ); // bnc#908976: suppress informal license upon update } return ret; } bool Solvable::needToAcceptLicense() const { NO_SOLVABLE_RETURN( false ); if ( isKind() ) { const RepoInfo & ri( repoInfo() ); std::string riname( name() ); // "license-"+name with fallback "license" if ( ! ri.hasLicense( riname ) ) riname.clear(); return ri.needToAcceptLicense( riname ); } return true; } std::ostream & operator<<( std::ostream & str, const Solvable & obj ) { if ( ! obj ) return str << (obj.isSystem() ? "systemSolvable" : "noSolvable" ); return str << "(" << obj.id() << ")" << ( obj.isKind( ResKind::srcpackage ) ? "srcpackage:" : "" ) << obj.ident() << '-' << obj.edition() << '.' << obj.arch() << "(" << obj.repository().alias() << ")"; } std::ostream & dumpOn( std::ostream & str, const Solvable & obj ) { str << obj; if ( obj ) { #define OUTS(X) if ( ! obj[Dep::X].empty() ) str << endl << " " #X " " << obj[Dep::X] OUTS(PROVIDES); OUTS(PREREQUIRES); OUTS(REQUIRES); OUTS(CONFLICTS); OUTS(OBSOLETES); OUTS(RECOMMENDS); OUTS(SUGGESTS); OUTS(ENHANCES); OUTS(SUPPLEMENTS); #undef OUTS } return str; } std::ostream & dumpAsXmlOn( std::ostream & str, const Solvable & obj ) { xmlout::Node guard( str, "solvable" ); dumpAsXmlOn( *guard, obj.kind() ); *xmlout::Node( *guard, "name" ) << obj.name(); dumpAsXmlOn( *guard, obj.edition() ); dumpAsXmlOn( *guard, obj.arch() ); dumpAsXmlOn( *guard, obj.repository() ); return str; } } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/Solvable.h000066400000000000000000000546121476576476200171370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Solvable.h * */ #ifndef ZYPP_SAT_SOLVABLE_H #define ZYPP_SAT_SOLVABLE_H #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { class ByteCount; class CheckSum; class CpeId; class Date; class OnMediaLocation; /////////////////////////////////////////////////////////////////// namespace sat { /////////////////////////////////////////////////////////////////// /// \class Solvable /// \brief A \ref Solvable object within the sat \ref Pool. /// /// \note Unfortunately libsolv combines the objects kind and /// name in a single identifier \c "pattern:kde_multimedia", /// \b except for packages and source packes. They are not prefixed /// by any kind string. Instead the architecture is abused to store /// \c "src" and \c "nosrc" values. /// /// \ref Solvable will hide this inconsistency by treating source /// packages as an own kind of solvable and map their arch to /// \ref Arch_noarch. /////////////////////////////////////////////////////////////////// class ZYPP_API Solvable : protected detail::PoolMember { public: using IdType = sat::detail::SolvableIdType; static const IdString retractedToken; ///< Indicator provides `retracted-patch-package()` static const IdString ptfMasterToken; ///< Indicator provides `ptf()` static const IdString ptfPackageToken; ///< Indicator provides `ptf-package()` public: /** Default ctor creates \ref noSolvable.*/ Solvable() : _id( detail::noSolvableId ) {} Solvable(const Solvable &) = default; Solvable(Solvable &&) noexcept = default; Solvable &operator=(const Solvable &) = default; Solvable &operator=(Solvable &&) noexcept = default; /** \ref PoolImpl ctor. */ explicit Solvable( IdType id_r ) : _id( id_r ) {} public: /** Represents no \ref Solvable. */ static const Solvable noSolvable; /** Evaluate \ref Solvable in a boolean context (\c != \c noSolvable). */ explicit operator bool() const { return get(); } public: /** The identifier. * This is the solvables \ref name, \b except for packages and * source packes, prefixed by its \ref kind. */ IdString ident()const; /** The Solvables ResKind. */ ResKind kind()const; /** Test whether a Solvable is of a certain \ref ResKind. * The test is far cheaper than actually retrieving and * comparing the \ref kind. */ bool isKind( const ResKind & kind_r ) const; /** \overload */ template bool isKind() const { return isKind( resKind() ); } /** \overload Extend the test to a range of \ref ResKind. */ template bool isKind( TIterator begin, TIterator end ) const { for_( it, begin, end ) if ( isKind( *it ) ) return true; return false; } /** The name (without any ResKind prefix). */ std::string name() const; /** The edition (version-release). */ Edition edition() const; /** The architecture. */ Arch arch() const; /** The vendor. */ IdString vendor() const; /** The \ref Repository this \ref Solvable belongs to. */ Repository repository() const; /** The repositories \ref RepoInfo. */ RepoInfo repoInfo() const; /** Return whether this \ref Solvable belongs to the system repo. * \note This includes the otherwise hidden systemSolvable. */ bool isSystem() const; /** Whether this is known to be installed on behalf of a user request. * \note Returns \c false for non-system (uninstalled) solvables. */ bool onSystemByUser() const; /** Whether this is known to be automatically installed (as dependency of a user request package). * \note Returns \c false for non-system (uninstalled) solvables. */ bool onSystemByAuto() const; /** Whether an installed solvable with the same \ref ident is flagged as AutoInstalled. */ bool identIsAutoInstalled() const { return identIsAutoInstalled( ident() ); } /** \overload static version */ static bool identIsAutoInstalled( const IdString & ident_r ); /** Whether different versions of this package can be installed at the same time. * Per default \c false. \see also \ref ZConfig::multiversion. */ bool multiversionInstall() const; /** Whether this solvable triggers the reboot-needed hint if installed/updated. */ bool isNeedreboot() const; /** \name Blacklisted packages. * * Blacklisted packages are visible in a repository, but no matter how good they * apparently look like, they must not be considered during normal operations. * * Under normal conditions the resolver will avoid selecting blacklisted packages. * To install a blacklisted package it must be selected explicitly. Whether this * is a good idea, depends on the reason for having been blacklisted: * * - RETRACTED packages are usually buggy packages/patches which have been released * and can not be removed from the public repositories anymore. Nevertheless those * packages should not be installed. * * - PTFs usually contain special features or fixes which are not yet released as * an official patch upadate. Installing a PTF will prevent its packages from being * updated until you decide to remove the PTF and follow the official releases again. */ //@{ /** Whether this solvable is blacklisted (retracted,ptf,...). */ bool isBlacklisted() const; /** Whether this solvable is retracted (provides \ref retractedToken). */ bool isRetracted() const; /** Whether this solvable belongs to a PTF (provides \ref ptfMasterToken or \ref ptfPackageToken). */ bool isPtf() const; /** Subset of \ref isPtf (provides \ref ptfMasterToken). */ bool isPtfMaster() const; /** Subset of \ref isPtf (provides \ref ptfPackageToken). */ bool isPtfPackage() const; //@} /** The items build time. */ Date buildtime() const; /** The items install time (\c false if not installed). */ Date installtime() const; public: /** String representation "ident-edition.arch" or \c "noSolvable" * \code * product:openSUSE-11.1.x86_64 * autoyast2-2.16.19-0.1.src * noSolvable * \endcode */ std::string asString() const; /** String representation "ident-edition.arch(repo)" or \c "noSolvable" */ std::string asUserString() const; /** Test whether two Solvables have the same content. * Basically the same name, edition, arch, vendor and buildtime. */ bool identical( const Solvable & rhs ) const; /** Test for same name-version-release.arch */ bool sameNVRA( const Solvable & rhs ) const { return( get() == rhs.get() || ( ident() == rhs.ident() && edition() == rhs.edition() && arch() == rhs.arch() ) ); } public: /** \name Access to the \ref Solvable dependencies. * * \note Prerequires are a subset of requires. */ //@{ Capabilities dep_provides() const; Capabilities dep_requires() const; Capabilities dep_conflicts() const; Capabilities dep_obsoletes() const; Capabilities dep_recommends() const; Capabilities dep_suggests() const; Capabilities dep_enhances() const; Capabilities dep_supplements() const; Capabilities dep_prerequires() const; #if __cplusplus < 202002L Capabilities provides() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities requires() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities conflicts() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities obsoletes() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities recommends() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities suggests() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities enhances() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities supplements() const ZYPP_DEPRECATED; // use dep_ prefixed version instead Capabilities prerequires() const ZYPP_DEPRECATED; // use dep_ prefixed version instead #endif /** Return \ref Capabilities selected by \ref Dep constant. */ Capabilities dep( Dep which_r ) const { switch( which_r.inSwitch() ) { case Dep::PROVIDES_e: return dep_provides(); break; case Dep::REQUIRES_e: return dep_requires(); break; case Dep::CONFLICTS_e: return dep_conflicts(); break; case Dep::OBSOLETES_e: return dep_obsoletes(); break; case Dep::RECOMMENDS_e: return dep_recommends(); break; case Dep::SUGGESTS_e: return dep_suggests(); break; case Dep::ENHANCES_e: return dep_enhances(); break; case Dep::SUPPLEMENTS_e: return dep_supplements(); break; case Dep::PREREQUIRES_e: return dep_prerequires(); break; } return Capabilities(); } /** \overload operator[] */ Capabilities operator[]( Dep which_r ) const { return dep( which_r ); } /** Return the namespaced provides 'namespace([value])[ op edition]' of this Solvable. */ CapabilitySet providesNamespace( const std::string & namespace_r ) const; /** Return 'value[ op edition]' for namespaced provides 'namespace(value)[ op edition]'. * Similar to \ref providesNamespace, but the namespace is stripped from the * dependencies. This is convenient if the namespace denotes packages that * should be looked up. E.g. the \c weakremover namespace used in a products * release package denotes the packages that were dropped from the distribution. * \see \ref Product::droplist */ CapabilitySet valuesOfNamespace( const std::string & namespace_r ) const; //@} std::pair matchesSolvable ( const SolvAttr &attr, const sat::Solvable &solv ) const; public: /** \name Locale support. */ //@{ /** Whether this \c Solvable claims to support locales. */ bool supportsLocales() const; /** Whether this \c Solvable supports a specific \ref Locale. */ bool supportsLocale( const Locale & locale_r ) const; /** Whether this \c Solvable supports at least one of the specified locales. */ bool supportsLocale( const LocaleSet & locales_r ) const; /** Whether this \c Solvable supports at least one requested locale. * \see \ref Pool::setRequestedLocales */ bool supportsRequestedLocales() const; /** Return the supported locales. */ LocaleSet getSupportedLocales() const; /** \overload Legacy return via arg \a locales_r */ void getSupportedLocales( LocaleSet & locales_r ) const { locales_r = getSupportedLocales(); } //@} public: /** The solvables CpeId if available. */ CpeId cpeId() const; /** Media number the solvable is located on (\c 0 if no media access required). */ unsigned mediaNr() const; /** Installed (unpacked) size. * This is just a total number. Many objects provide even more detailed * disk usage data. You can use \ref DiskUsageCounter to find out * how objects data are distributed across partitions/directories. * \code * // Load directory set into ducounter * DiskUsageCounter ducounter( { "/", "/usr", "/var" } ); * * // see how noch space the packages use * for ( const PoolItem & pi : pool ) * { * cout << pi << ducounter.disk_usage( pi ) << endl; * // I__s_(7)GeoIP-1.4.8-3.1.2.x86_64(@System) { * // dir:[/] [ bs: 0 B ts: 0 B us: 0 B (+-: 1.0 KiB)] * // dir:[/usr] [ bs: 0 B ts: 0 B us: 0 B (+-: 133.0 KiB)] * // dir:[/var] [ bs: 0 B ts: 0 B us: 0 B (+-: 1.1 MiB)] * // } * } * \endcode * \see \ref DiskUsageCounter */ ByteCount installSize() const; /** Download size. */ ByteCount downloadSize() const; /** The distribution string. */ std::string distribution() const; /** Short (singleline) text describing the solvable (opt. translated). */ std::string summary( const Locale & lang_r = Locale() ) const; /** Long (multiline) text describing the solvable (opt. translated). */ std::string description( const Locale & lang_r = Locale() ) const; /** UI hint text when selecting the solvable for install (opt. translated). */ std::string insnotify( const Locale & lang_r = Locale() ) const; /** UI hint text when selecting the solvable for uninstall (opt. translated).*/ std::string delnotify( const Locale & lang_r = Locale() ) const; /** License or agreement to accept before installing the solvable (opt. translated). */ std::string licenseToConfirm( const Locale & lang_r = Locale() ) const; /** \c True except for well known exceptions (i.e show license but no need to accept it). */ bool needToAcceptLicense() const; public: /** Helper that splits an identifier into kind and name or vice versa. * \note In case \c name_r is preceded by a well known kind spec, the * \c kind_r argument is ignored, and kind is derived from name. * \see \ref ident */ class SplitIdent { public: SplitIdent() {} SplitIdent( IdString ident_r ); SplitIdent( const char * ident_r ); SplitIdent( const std::string & ident_r ); SplitIdent( ResKind kind_r, IdString name_r ); SplitIdent( ResKind kind_r, const C_Str & name_r ); IdString ident() const { return _ident; } ResKind kind() const { return _kind; } IdString name() const { return _name; } private: IdString _ident; ResKind _kind; IdString _name; }; public: /** \name Attribute lookup. * \see \ref LookupAttr and \ref ArrayAttr providing a general, more * query like interface for attribute retrieval. */ //@{ /** * returns the string attribute value for \ref attr * or an empty string if it does not exists. */ std::string lookupStrAttribute( const SolvAttr & attr ) const; /** \overload Trying to look up a translated string attribute. * * Returns the translation for \c lang_r. * * Passing an empty \ref Locale will return the string for the * current default locale (\see \ref ZConfig::TextLocale), * \b considering all fallback locales. * * Returns an empty string if no translation is available. */ std::string lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const; /** * returns the numeric attribute value for \ref attr * or 0 if it does not exists. */ unsigned long long lookupNumAttribute( const SolvAttr & attr ) const; /** \overload returning custom notfound_r value */ unsigned long long lookupNumAttribute( const SolvAttr & attr, unsigned long long notfound_r ) const; /** * returns the boolean attribute value for \ref attr * or \c false if it does not exists. */ bool lookupBoolAttribute( const SolvAttr & attr ) const; /** * returns the id attribute value for \ref attr * or \ref detail::noId if it does not exists. */ detail::IdType lookupIdAttribute( const SolvAttr & attr ) const; /** * returns the CheckSum attribute value for \ref attr * or an empty CheckSum if ir does not exist. */ CheckSum lookupCheckSumAttribute( const SolvAttr & attr ) const; /** * returns OnMediaLocation data: This is everything we need to * download e.g. an rpm (path, checksum, downloadsize, etc.). */ OnMediaLocation lookupLocation() const; //@} public: /** Return next Solvable in \ref Pool (or \ref noSolvable). */ Solvable nextInPool() const; /** Return next Solvable in \ref Repo (or \ref noSolvable). */ Solvable nextInRepo() const; /** Expert backdoor. */ detail::CSolvable * get() const; /** Expert backdoor. */ IdType id() const { return _id; } private: IdType _id; }; /////////////////////////////////////////////////////////////////// /** \relates Solvable Stream output */ std::ostream & operator<<( std::ostream & str, const Solvable & obj ) ZYPP_API; /** \relates Solvable More verbose stream output including dependencies */ std::ostream & dumpOn( std::ostream & str, const Solvable & obj ) ZYPP_API; /** \relates Solvable XML output */ std::ostream & dumpAsXmlOn( std::ostream & str, const Solvable & obj ) ZYPP_API; /** \relates Solvable */ inline bool operator==( const Solvable & lhs, const Solvable & rhs ) { return lhs.get() == rhs.get(); } /** \relates Solvable */ inline bool operator!=( const Solvable & lhs, const Solvable & rhs ) { return lhs.get() != rhs.get(); } /** \relates Solvable */ inline bool operator<( const Solvable & lhs, const Solvable & rhs ) { return lhs.get() < rhs.get(); } /** \relates Solvable Test whether a \ref Solvable is of a certain Kind. */ template inline bool isKind( const Solvable & solvable_r ) { return solvable_r.isKind( ResTraits::kind ); } /** \relates Solvable Test for same content. */ inline bool identical( const Solvable & lhs, const Solvable & rhs ) { return lhs.identical( rhs ); } /** \relates Solvable Test for same name version release and arch. */ inline bool sameNVRA( const Solvable & lhs, const Solvable & rhs ) { return lhs.sameNVRA( rhs ); } /** \relates Solvable Compare according to \a kind and \a name. */ inline int compareByN( const Solvable & lhs, const Solvable & rhs ) { int res = 0; if ( lhs != rhs ) { if ( (res = lhs.kind().compare( rhs.kind() )) == 0 ) res = lhs.name().compare( rhs.name() ); } return res; } /** \relates Solvable Compare according to \a kind, \a name and \a edition. */ inline int compareByNVR( const Solvable & lhs, const Solvable & rhs ) { int res = compareByN( lhs, rhs ); if ( res == 0 ) res = lhs.edition().compare( rhs.edition() ); return res; } /** \relates Solvable Compare according to \a kind, \a name, \a edition and \a arch. */ inline int compareByNVRA( const Solvable & lhs, const Solvable & rhs ) { int res = compareByNVR( lhs, rhs ); if ( res == 0 ) res = lhs.arch().compare( rhs.arch() ); return res; } /////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /// \class SolvableIterator /// \brief Iterate over valid Solvables in the pool. /// If the Solvable passed to the ctor is not valid, advance /// to the next valid solvable (or Solvable::noSolvable if the /// end is reached, class SolvableIterator : public boost::iterator_adaptor< SolvableIterator // Derived , CSolvable* // Base , const Solvable // Value , boost::forward_traversal_tag // CategoryOrTraversal , const Solvable // Reference > { public: SolvableIterator() : SolvableIterator::iterator_adaptor_( nullptr ) {} explicit SolvableIterator( const Solvable & val_r ) : SolvableIterator::iterator_adaptor_( nullptr ) { initialAssignVal( val_r ); } explicit SolvableIterator( SolvableIdType id_r ) : SolvableIterator::iterator_adaptor_( nullptr ) { initialAssignVal( Solvable(id_r) ); } private: friend class boost::iterator_core_access; Solvable dereference() const { return _val; } void increment() { assignVal( _val.nextInPool() ); } private: void initialAssignVal( const Solvable & val_r ) { assignVal( val_r ? val_r : val_r.nextInPool() ); } void assignVal( const Solvable & val_r ) { _val = val_r; base_reference() = _val.get(); } Solvable _val; }; } // namespace detail /////////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// class PoolItem; /////////////////////////////////////////////////////////////////// namespace sat { /** To Solvable transform functor. * \relates Solvable * \relates sat::SolvIterMixin */ struct ZYPP_API asSolvable { using result_type = Solvable; Solvable operator()( const Solvable & solv_r ) const { return solv_r; } Solvable operator()( const PoolItem & pi_r ) const; Solvable operator()( const ResObject_constPtr & res_r ) const; }; } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// ZYPP_DEFINE_ID_HASHABLE( ::zypp::sat::Solvable ); #endif // ZYPP_SAT_SOLVABLE_H libzypp-17.36.5/zypp/sat/SolvableSet.cc000066400000000000000000000031721476576476200177440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvableSet.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const SolvableSet & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/SolvableSet.h000066400000000000000000000101061476576476200176010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvableSet.h * */ #ifndef ZYPP_SAT_SOLVABLESET_H #define ZYPP_SAT_SOLVABLESET_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolvableSet // /** Solvable set wrapper to allow adding additional convenience iterators. */ class SolvableSet : public SolvIterMixin::const_iterator> { friend std::ostream & operator<<( std::ostream & str, const SolvableSet & obj ); public: using Container = std::unordered_set; using value_type = Container::value_type; using size_type = Container::size_type; using const_iterator = Solvable_iterator; // from SolvIterMixin public: /** Default ctor */ SolvableSet() : _pimpl( new Container ) {} /** Ctor building a set from a range. */ template SolvableSet( TInputIterator begin_r, TInputIterator end_r ) : _pimpl( new Container( begin_r, end_r ) ) {} public: /** Whether the set is epmty. */ bool empty() const { return _pimpl->empty(); } /** Size of the set. */ size_type size() const { return _pimpl->size(); } /** */ template bool contains( const TSolv & solv_r ) const { return( get().count( asSolvable()( solv_r ) ) ); } /** Iterator pointing to the first \ref Solvable. */ const_iterator begin() const { return _pimpl->begin(); } /** Iterator pointing behind the last \ref Solvable. */ const_iterator end() const { return _pimpl->end(); } public: /** Clear the container */ void clear() { get().clear(); } /** Insert a Solvable. * \return \c true if it was actually inserted, or \c false if already present. */ template bool insert( const TSolv & solv_r ) { return get().insert( asSolvable()( solv_r ) ).second; } /** Insert a range of Solvables. */ template void insert( TIterator begin_r, TIterator end_r ) { for_( it, begin_r, end_r ) insert( *it ); } public: /** The set. */ Container & get() { return *_pimpl; } /** The set. */ const Container & get() const { return *_pimpl; } private: /** Pointer to implementation */ RWCOW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates SolvableSet Stream output */ std::ostream & operator<<( std::ostream & str, const SolvableSet & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_SOLVABLESET_H libzypp-17.36.5/zypp/sat/SolvableSpec.cc000066400000000000000000000145461476576476200201120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvableSpec.cc */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { /////////////////////////////////////////////////////////////////// /// \class SolvableSpec::Impl /// \brief SolvableSpec implementation. /////////////////////////////////////////////////////////////////// class SolvableSpec::Impl { public: void addIdent( IdString ident_r ) { if ( ! ident_r.empty() ) _idents.insert( ident_r ); } void addProvides( Capability provides_r ) { if ( ! provides_r.empty() && _provides.insert( provides_r ).second ) setDirty(); } bool addIdenticalInstalledToo() const { return _addIdenticalInstalledToo; } void addIdenticalInstalledToo( bool yesno_r ) { if ( yesno_r != _addIdenticalInstalledToo ) { _addIdenticalInstalledToo = yesno_r; if ( not _provides.empty() ) setDirty(); } } void parse( const C_Str & spec_r ) { if ( str::hasPrefix( spec_r, "provides:" ) ) addProvides( Capability(spec_r.c_str()+9) ); else addIdent( IdString(spec_r) ); } bool needed() const { return !_provides.empty(); } bool dirty() const { return needed() && !_cache; } void setDirty() const { _cache.reset(); _cacheIdenticalInstalled.clear(); } const WhatProvides & cache() const { if ( !_cache ) { _cache.reset( new WhatProvides( _provides ) ); if ( _addIdenticalInstalledToo ) { for ( const auto & solv : *_cache ) { if ( solv.isSystem() ) continue; auto pi { ui::Selectable::get(solv)->identicalInstalledObj( PoolItem(solv) ) }; if ( pi ) _cacheIdenticalInstalled.insert( pi ); } } } return *_cache; } bool contains( const sat::Solvable & solv_r ) const { if ( _idents.count( solv_r.ident() ) ) return true; if ( needed() ) { if ( cache().contains( solv_r ) ) return true; if ( _addIdenticalInstalledToo && _cacheIdenticalInstalled.contains( solv_r ) ) return true; } return false; } const IdStringSet & idents() const { return _idents; } const CapabilitySet & provides() const { return _provides; } private: IdStringSet _idents; CapabilitySet _provides; bool _addIdenticalInstalledToo = false; mutable SolvableSet _cacheIdenticalInstalled; // follows _cache mutable shared_ptr _cache; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; /** \relates SolvableSpec::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const SolvableSpec::Impl & obj ) { str << "SolvableSpec {" << endl << " Idents " << obj.idents() << endl << " Provides " << obj.provides() << endl << "}"; return str; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolvableSpec // /////////////////////////////////////////////////////////////////// SolvableSpec::SolvableSpec() : _pimpl( new Impl ) {} SolvableSpec::~SolvableSpec() {} void SolvableSpec::addIdent( IdString ident_r ) { _pimpl->addIdent( ident_r ); } void SolvableSpec::addProvides( Capability provides_r ) { _pimpl->addProvides( provides_r ); } bool SolvableSpec::addIdenticalInstalledToo() const { return _pimpl->addIdenticalInstalledToo(); } void SolvableSpec::addIdenticalInstalledToo( bool yesno_r ) { _pimpl->addIdenticalInstalledToo( yesno_r ); } void SolvableSpec::parse( const C_Str & spec_r ) { _pimpl->parse( spec_r ); } void SolvableSpec::parseFrom( const InputStream & istr_r ) { iostr::simpleParseFile( istr_r, [this]( int num_r, const std::string & line_r )->bool { this->parse( line_r ); return true; }); } void SolvableSpec::splitParseFrom( const C_Str & multispec_r ) { std::vector v; str::splitEscaped( multispec_r, std::back_inserter( v ), ", \t" ); parseFrom( v.begin(), v.end() ); } bool SolvableSpec::contains( const sat::Solvable & solv_r ) const { return _pimpl->contains( solv_r ) && !solv_r.isKind( ResKind::srcpackage ); } bool SolvableSpec::dirty() const { return _pimpl->dirty(); } void SolvableSpec::setDirty() const { _pimpl->setDirty(); } bool SolvableSpec::empty() const { return _pimpl->idents().empty() && _pimpl->provides().empty(); } bool SolvableSpec::containsIdent( const IdString & ident_r ) const { return _pimpl->idents().count( ident_r ); } bool SolvableSpec::containsProvides( const Capability & provides_r ) const { return _pimpl->provides().count( provides_r ); } std::ostream & operator<<( std::ostream & str, const SolvableSpec & obj ) { return str << *obj._pimpl; } } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/SolvableSpec.h000066400000000000000000000123351476576476200177460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvableSpec.h */ #ifndef ZYPP_SAT_SOLVABLESPEC_H #define ZYPP_SAT_SOLVABLESPEC_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { /////////////////////////////////////////////////////////////////// /// \class SolvableSpec /// \brief Define a set of \ref Solvables by ident and provides. /// /// Able to keep the definition of solvable sets like in 'needreboot' /// or 'multiversion'. The associated file parser allows reading /// stored definitions (one `IDENT` or provides:CAPABILITY` per line; /// empty lines and lines starting with '#' are ignored). /// /// The use of provides requires re-computation of the solvable set, /// whenever the solvable pool changes. This computation via \ref WhatProvides /// is expensive, that's why a built in cache is also offered. /// /// \note \ref contains does not match srcpackage: per default. /////////////////////////////////////////////////////////////////// class SolvableSpec { public: /** Default ctor */ SolvableSpec(); /** Dtor */ ~SolvableSpec(); SolvableSpec(const SolvableSpec &) = default; SolvableSpec(SolvableSpec &&) noexcept = default; SolvableSpec &operator=(const SolvableSpec &) = default; SolvableSpec &operator=(SolvableSpec &&) noexcept = default; public: /** Add all \ref sat::Solvable with this \a ident_r */ void addIdent( IdString ident_r ); /** A all \ref sat::Solvable matching this \a provides_r. */ void addProvides( Capability provides_r ); /** Extend the provides set to include idential installed items as well. * Hack for retracted packages, where the indicator provides is injected * into the available items, but is not present in the installed items. */ bool addIdenticalInstalledToo() const; void addIdenticalInstalledToo( bool yesno_r ); public: /** Parse and add spec from a string (`IDENT` or provides:CAPABILITY`). */ void parse( const C_Str & spec_r ); /** Parse file \a istr_r and add its specs (one per line, #-comments). */ void parseFrom( const InputStream & istr_r ); /** Parse and add specs from iterator range. */ template void parseFrom( TIterator begin, TIterator end ) { for_( it, begin, end ) parse( *it ); } /** Convenience using \ref str::splitEscaped(", \t") to parse multiple specs from one line. */ void splitParseFrom( const C_Str & multispec_r ); public: /** Test whether \a solv_r matches the spec. * (Re-)builds the \ref WhatProvides cache on demand. * * \note Does not match srcpackage: per default. */ bool contains( const sat::Solvable & solv_r ) const; /** \overload */ template bool contains( const SolvableType & solv_r ) const { return contains( solv_r.satSolvable() ); } /** Whether the cache is needed and dirty. */ bool dirty() const; /** Explicitly flag the cache as dirty, so it will be rebuilt on the next request. * To be called if the \ref ResPool content has changed. Intentionally `const` as * this does not change the set of spects (though the set of matches might change). * \note This has no effect if no cache is needed (i.e. no provides: are used). */ void setDirty() const; public: /** Whether neither idents nor provides are set. */ bool empty() const; /** Whether \a ident_r has been added to the specs (mainly for parser tests). */ bool containsIdent( const IdString & ident_r ) const; /** Whether \a provides_r has been added to the sepcs (mainly for parser tests).*/ bool containsProvides( const Capability & provides_r ) const; public: class Impl; ///< Implementation class. private: RWCOW_pointer _pimpl; ///< Pointer to implementation. friend std::ostream & operator<<( std::ostream & str, const SolvableSpec & obj ); }; /** \relates SolvableSpec Stream output */ std::ostream & operator<<( std::ostream & str, const SolvableSpec & obj ); } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_SOLVABLESPEC_H libzypp-17.36.5/zypp/sat/SolvableType.h000066400000000000000000000366111476576476200200000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/SolvableType.h */ #ifndef ZYPP_SAT_SOLVABLETYPE_H #define ZYPP_SAT_SOLVABLETYPE_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace sat { /////////////////////////////////////////////////////////////////// /// \class SolvableType /// \brief Base class for creating \ref Solvable based types. /// \ingroup g_CRTP /// /// Derive from this and offer explicit conversion to \ref Solvable /// to make the \ref Solvable properties directly accessible. /// /// Different SolvableTypes are comparable based on the underlying /// \ref Solvable. /// /// \see \ref Solvable /// /// \code /// class MySolvable : public SolvableType /// { /// ...... /// public: /// explicit operator sat::Solvable() const; /// /// }; /// \endcode /////////////////////////////////////////////////////////////////// template struct SolvableType { /** Return the corresponding \ref sat::Solvable. */ Solvable satSolvable() const { return Solvable(static_cast(*this)); } explicit operator bool() const { return bool(satSolvable()); } IdString ident() const { return satSolvable().ident(); } ResKind kind() const { return satSolvable().kind(); } bool isKind( const ResKind & kind_r ) const { return satSolvable().isKind( kind_r ); } template bool isKind() const { return satSolvable().template isKind(); } template bool isKind( TIterator begin, TIterator end ) const { return satSolvable().isKind( begin, end ); } std::string name() const { return satSolvable().name(); } Edition edition() const { return satSolvable().edition(); } Arch arch() const { return satSolvable().arch(); } IdString vendor() const { return satSolvable().vendor(); } Repository repository() const { return satSolvable().repository(); } RepoInfo repoInfo() const { return satSolvable().repoInfo(); } bool isSystem() const { return satSolvable().isSystem(); } bool onSystemByUser() const { return satSolvable().onSystemByUser(); } bool onSystemByAuto() const { return satSolvable().onSystemByAuto(); } bool identIsAutoInstalled() const { return satSolvable().identIsAutoInstalled(); } bool multiversionInstall() const { return satSolvable().multiversionInstall(); } bool isNeedreboot() const { return satSolvable().isNeedreboot(); } bool isBlacklisted() const { return satSolvable().isBlacklisted(); } bool isRetracted() const { return satSolvable().isRetracted(); } bool isPtf() const { return satSolvable().isPtf(); } bool isPtfMaster() const { return satSolvable().isPtfMaster(); } bool isPtfPackage() const { return satSolvable().isPtfPackage(); } Date buildtime() const { return satSolvable().buildtime(); } Date installtime() const { return satSolvable().installtime(); } std::string asString() const { return satSolvable().asString(); } std::string asUserString() const { return satSolvable().asUserString(); } bool identical( const Solvable & rhs ) const { return satSolvable().identical( rhs ); } template bool identical( const SolvableType & rhs ) const { return satSolvable().identical( rhs.satSolvable() ); } bool sameNVRA( const Solvable &rhs ) const { return satSolvable().sameNVRA( rhs ); } template bool sameNVRA( const SolvableType & rhs ) const { return satSolvable().sameNVRA( rhs.satSolvable() ); } Capabilities dep_provides() const { return satSolvable().dep_provides(); } Capabilities dep_requires() const { return satSolvable().dep_requires(); } Capabilities dep_conflicts() const { return satSolvable().dep_conflicts(); } Capabilities dep_obsoletes() const { return satSolvable().dep_obsoletes(); } Capabilities dep_recommends() const { return satSolvable().dep_recommends(); } Capabilities dep_suggests() const { return satSolvable().dep_suggests(); } Capabilities dep_enhances() const { return satSolvable().dep_enhances(); } Capabilities dep_supplements() const { return satSolvable().dep_supplements(); } Capabilities dep_prerequires() const { return satSolvable().dep_prerequires(); } Capabilities dep( Dep which_r ) const { return satSolvable().dep(which_r); } Capabilities operator[]( Dep which_r ) const { return satSolvable()[which_r]; } #if __cplusplus < 202002L Capabilities provides() const { return satSolvable().dep_provides(); } Capabilities requires() const { return satSolvable().dep_requires(); } Capabilities conflicts() const { return satSolvable().dep_conflicts(); } Capabilities obsoletes() const { return satSolvable().dep_obsoletes(); } Capabilities recommends() const { return satSolvable().dep_recommends(); } Capabilities suggests() const { return satSolvable().dep_suggests(); } Capabilities enhances() const { return satSolvable().dep_enhances(); } Capabilities supplements() const { return satSolvable().dep_supplements(); } Capabilities prerequires() const { return satSolvable().dep_prerequires(); } #endif CapabilitySet providesNamespace( const std::string & namespace_r ) const { return satSolvable().providesNamespace( namespace_r ); } CapabilitySet valuesOfNamespace( const std::string & namespace_r ) const { return satSolvable().valuesOfNamespace( namespace_r ); } bool supportsLocales() const { return satSolvable().supportsLocales(); } bool supportsLocale( const Locale & locale_r ) const { return satSolvable().supportsLocale( locale_r ); } bool supportsLocale( const LocaleSet & locales_r ) const { return satSolvable().supportsLocale( locales_r ); } bool supportsRequestedLocales() const { return satSolvable().supportsRequestedLocales(); } LocaleSet getSupportedLocales() const { return satSolvable().getSupportedLocales(); } CpeId cpeId() const { return satSolvable().cpeId(); } unsigned mediaNr() const { return satSolvable().mediaNr(); } ByteCount installSize() const { return satSolvable().installSize(); } ByteCount downloadSize() const { return satSolvable().downloadSize(); } std::string distribution() const { return satSolvable().distribution(); } std::string summary( const Locale & lang_r = Locale() ) const { return satSolvable().summary( lang_r ); } std::string description( const Locale & lang_r = Locale() ) const { return satSolvable().description( lang_r ); } std::string insnotify( const Locale & lang_r = Locale() ) const { return satSolvable().insnotify( lang_r ); } std::string delnotify( const Locale & lang_r = Locale() ) const { return satSolvable().delnotify( lang_r ); } std::string licenseToConfirm( const Locale & lang_r = Locale() ) const { return satSolvable().licenseToConfirm( lang_r ); } bool needToAcceptLicense() const { return satSolvable().needToAcceptLicense(); } public: std::string lookupStrAttribute( const SolvAttr & attr ) const { return satSolvable().lookupStrAttribute( attr ); } std::string lookupStrAttribute( const SolvAttr & attr, const Locale & lang_r ) const { return satSolvable().lookupStrAttribute( attr, lang_r ); } bool lookupBoolAttribute( const SolvAttr & attr ) const { return satSolvable().lookupBoolAttribute( attr ); } detail::IdType lookupIdAttribute( const SolvAttr & attr ) const { return satSolvable().lookupIdAttribute( attr ); } unsigned long long lookupNumAttribute( const SolvAttr & attr ) const { return satSolvable().lookupNumAttribute( attr ); } unsigned long long lookupNumAttribute( const SolvAttr & attr, unsigned long long notfound_r ) const { return satSolvable().lookupNumAttribute( attr, notfound_r ); } CheckSum lookupCheckSumAttribute( const SolvAttr & attr ) const { return satSolvable().lookupCheckSumAttribute( attr ); } OnMediaLocation lookupLocation() const { return satSolvable().lookupLocation(); } Solvable::IdType id() const { return satSolvable().id(); } protected: SolvableType() {} SolvableType( const SolvableType & ) = default; SolvableType &operator=( const SolvableType & ) = default; SolvableType( SolvableType && ) noexcept = default; SolvableType &operator=( SolvableType && ) noexcept = default; ~SolvableType() {} }; /** \relates SolvableType Stream output */ template inline std::ostream & operator<<( std::ostream & str, const SolvableType & obj ) { return str << obj.satSolvable(); } /** \relates SolvableType More verbose stream output including dependencies */ template inline std::ostream & dumpOn( std::ostream & str, const SolvableType & obj ) { return dumpOn( str, obj.satSolvable() ); } /** \relates SolvableType Equal*/ template inline bool operator==( const SolvableType & lhs, const SolvableType & rhs ) { return lhs.satSolvable() == rhs.satSolvable(); } /** \overload */ template inline bool operator==( const SolvableType & lhs, const Solvable & rhs ) { return lhs.satSolvable() == rhs; } /** \overload */ template inline bool operator==( const Solvable & lhs, const SolvableType & rhs ) { return lhs == rhs.satSolvable(); } /** \relates SolvableType NotEqual */ template inline bool operator!=( const SolvableType & lhs, const SolvableType & rhs ) { return lhs.satSolvable() != rhs.satSolvable(); } /** \overload */ template inline bool operator!=( const SolvableType & lhs, const Solvable & rhs ) { return lhs.satSolvable() != rhs; } /** \overload */ template inline bool operator!=( const Solvable & lhs, const SolvableType & rhs ) { return lhs != rhs.satSolvable(); } /** \relates SolvableType Less*/ template inline bool operator<( const SolvableType & lhs, const SolvableType & rhs ) { return lhs.satSolvable() < rhs.satSolvable(); } /** \overload */ template inline bool operator<( const SolvableType & lhs, const Solvable & rhs ) { return lhs.satSolvable() < rhs; } /** \overload */ template inline bool operator<( const Solvable & lhs, const SolvableType & rhs ) { return lhs < rhs.satSolvable(); } /** \relates SolvableType Test whether the \ref Solvable is of a certain \ref ResKind. */ template inline bool isKind( const SolvableType & solvable_r ) { return isKind( solvable_r.satSolvable() ); } /** \relates SolvableType Test for same content. */ template inline bool identical( const SolvableType & lhs, const SolvableType & rhs ) { return identical( lhs.satSolvable(), rhs.satSolvable() ); } /** \overload */ template inline bool identical( const SolvableType & lhs, const Solvable & rhs ) { return identical( lhs.satSolvable(), rhs ); } /** \overload */ template inline bool identical( const Solvable & lhs, const SolvableType & rhs ) { return identical( lhs, rhs.satSolvable() ); } /** \relates SolvableType Test for same name version release and arch. */ template inline bool sameNVRA( const SolvableType & lhs, const SolvableType & rhs ) { return sameNVRA( lhs.satSolvable(), rhs.satSolvable() ); } /** \overload */ template inline bool sameNVRA( const SolvableType & lhs, const Solvable & rhs ) { return sameNVRA( lhs.satSolvable(), rhs ); } /** \overload */ template inline bool sameNVRA( const Solvable & lhs, const SolvableType & rhs ) { return sameNVRA( lhs, rhs.satSolvable() ); } /** \relates SolvableType Compare according to \a kind and \a name. */ template inline int compareByN( const SolvableType & lhs, const SolvableType & rhs ) { return compareByN( lhs.satSolvable(), rhs.satSolvable() ); } /** \overload */ template inline bool compareByN( const SolvableType & lhs, const Solvable & rhs ) { return compareByN( lhs.satSolvable(), rhs ); } /** \overload */ template inline bool compareByN( const Solvable & lhs, const SolvableType & rhs ) { return compareByN( lhs, rhs.satSolvable() ); } /** \relates SolvableType Compare according to \a kind, \a name and \a edition. */ template inline int compareByNVR( const SolvableType & lhs, const SolvableType & rhs ) { return compareByNVR( lhs.satSolvable(), rhs.satSolvable() ); } /** \overload */ template inline bool compareByNVR( const SolvableType & lhs, const Solvable & rhs ) { return compareByNVR( lhs.satSolvable(), rhs ); } /** \overload */ template inline bool compareByNVR( const Solvable & lhs, const SolvableType & rhs ) { return compareByNVR( lhs, rhs.satSolvable() ); } /** \relates SolvableType Compare according to \a kind, \a name, \a edition and \a arch. */ template inline int compareByNVRA( const SolvableType & lhs, const SolvableType & rhs ) { return compareByNVRA( lhs.satSolvable(), rhs.satSolvable() ); } /** \overload */ template inline bool compareByNVRA( const SolvableType & lhs, const Solvable & rhs ) { return compareByNVRA( lhs.satSolvable(), rhs ); } /** \overload */ template inline bool compareByNVRA( const Solvable & lhs, const SolvableType & rhs ) { return compareByNVRA( lhs, rhs.satSolvable() ); } } // namespace sat /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_SOLVABLETYPE_H libzypp-17.36.5/zypp/sat/Transaction.cc000066400000000000000000000377211476576476200200150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Transaction.cc */ extern "C" { #include #include } #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// constexpr Transaction::LoadFromPoolType Transaction::loadFromPool; /** Transaction implementation. * * \NOTE After commit the @System repo is reloaded. This invalidates * the ids off all installed items in the transaction, including their * stepType. Thats why some information (stepType, NVRA) is be stored * for post mortem access (i.e. tell after commit which NVRA were deleted). * */ struct Transaction::Impl : protected detail::PoolMember , private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const Impl & obj ); public: using set_type = std::unordered_set; using map_type = std::unordered_map; struct PostMortem { PostMortem() {} PostMortem( const sat::Solvable & solv_r ) : _ident( solv_r.ident() ) , _edition( solv_r.edition() ) , _arch( solv_r.arch() ) {} IdString _ident; Edition _edition; Arch _arch; }; using pmmap_type = std::unordered_map; public: Impl() : _trans( ::transaction_create( nullptr ) ) { memset( _trans, 0, sizeof(*_trans) ); } Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; Impl(LoadFromPoolType) : _watcher(myPool().serial()), _trans(nullptr) { Queue decisionq; for ( const PoolItem & pi : ResPool::instance() ) { if ( ! pi.status().transacts() ) continue; decisionq.push( pi.isSystem() ? -pi.id() : pi.id() ); } Queue noobsq; for ( const Solvable & solv : myPool().multiversionList() ) { noobsq.push( SOLVER_NOOBSOLETES | SOLVER_SOLVABLE ); noobsq.push( solv.id() ); } Map noobsmap; ::solver_calculate_noobsmap( myPool().getPool(), noobsq, noobsmap ); _trans = ::transaction_create_decisionq( myPool().getPool(), decisionq, noobsmap ); // NOTE: package/product buddies share the same ResStatus // so we also link the buddies stepStages. This assumes // only one buddy is acting during commit (package is installed, // but no extra operation for the product). for_( it, _trans->steps.elements, _trans->steps.elements + _trans->steps.count ) { sat::Solvable solv( *it ); // buddy list: if ( ! solv.isKind() ) { PoolItem pi( solv ); if ( pi.buddy() ) { _linkMap[*it] = pi.buddy().id(); } } if ( solv.isSystem() ) { // to delete list: if ( stepType( solv ) == TRANSACTION_ERASE ) { _systemErase.insert( *it ); } // post mortem data _pmMap[*it] = solv; } } } ~Impl() { ::transaction_free( _trans ); } public: bool valid() const { return _watcher.isClean( myPool().serial() ); } bool order() { if ( ! valid() ) return false; if ( empty() ) return true; #if 0 // This is hwo we could implement out own order method. // As ::transaction already groups by MediaNr, we don't // need it for ORDER_BY_MEDIANR. ::transaction_order( _trans, SOLVER_TRANSACTION_KEEP_ORDERDATA ); detail::IdType chosen = 0; Queue choices; while ( true ) { int ret = transaction_order_add_choices( _trans, chosen, choices ); MIL << ret << ": " << chosen << ": " << choices << endl; chosen = choices.pop_front(); // pick one out of choices if ( ! chosen ) break; } return true; #endif if ( !_ordered ) { ::transaction_order( _trans, 0 ); _ordered = true; } return true; } bool empty() const { return( _trans->steps.count == 0 ); } size_t size() const { return _trans->steps.count; } const_iterator begin( const RW_pointer & self_r ) const { return const_iterator( self_r, _trans->steps.elements ); } iterator begin( const RW_pointer & self_r ) { return iterator( self_r, _trans->steps.elements ); } const_iterator end( const RW_pointer & self_r ) const { return const_iterator( self_r, _trans->steps.elements + _trans->steps.count ); } iterator end( const RW_pointer & self_r ) { return iterator( self_r, _trans->steps.elements + _trans->steps.count ); } const_iterator find(const RW_pointer & self_r, const sat::Solvable & solv_r ) const { detail::IdType * it( _find( solv_r ) ); return it ? const_iterator( self_r, it ) : end( self_r ); } iterator find(const RW_pointer & self_r, const sat::Solvable & solv_r ) { detail::IdType * it( _find( solv_r ) ); return it ? iterator( self_r, it ) : end( self_r ); } public: int installedResult( Queue & result_r ) const { return ::transaction_installedresult( _trans, result_r ); } StringQueue autoInstalled() const { return _autoInstalled; } void autoInstalled( const StringQueue & queue_r ) { _autoInstalled = queue_r; } public: StepType stepType( Solvable solv_r ) const { if ( ! solv_r ) { // post mortem @System solvable return isIn( _systemErase, solv_r.id() ) ? TRANSACTION_ERASE : TRANSACTION_IGNORE; } switch( ::transaction_type( _trans, solv_r.id(), SOLVER_TRANSACTION_RPM_ONLY ) ) { case SOLVER_TRANSACTION_ERASE: return TRANSACTION_ERASE; break; case SOLVER_TRANSACTION_INSTALL: return TRANSACTION_INSTALL; break; case SOLVER_TRANSACTION_MULTIINSTALL: return TRANSACTION_MULTIINSTALL; break; } return TRANSACTION_IGNORE; } StepStage stepStage( Solvable solv_r ) const { return stepStage( resolve( solv_r ) ); } void stepStage( Solvable solv_r, StepStage newval_r ) { stepStage( resolve( solv_r ), newval_r ); } const PostMortem & pmdata( Solvable solv_r ) const { static PostMortem _none; pmmap_type::const_iterator it( _pmMap.find( solv_r.id() ) ); return( it == _pmMap.end() ? _none : it->second ); } private: detail::IdType resolve( const Solvable & solv_r ) const { map_type::const_iterator res( _linkMap.find( solv_r.id() ) ); return( res == _linkMap.end() ? solv_r.id() : res->second ); } bool isIn( const set_type & set_r, detail::IdType sid_r ) const { return( set_r.find( sid_r ) != set_r.end() ); } StepStage stepStage( detail::IdType sid_r ) const { if ( isIn( _doneSet, sid_r ) ) return STEP_DONE; if ( isIn( _errSet, sid_r ) ) return STEP_ERROR; return STEP_TODO; } void stepStage( detail::IdType sid_r, StepStage newval_r ) { StepStage stage( stepStage( sid_r ) ); if ( stage != newval_r ) { // reset old stage if ( stage != STEP_TODO ) { (stage == STEP_DONE ? _doneSet : _errSet).erase( sid_r ); } if ( newval_r != STEP_TODO ) { (newval_r == STEP_DONE ? _doneSet : _errSet).insert( sid_r ); } } } private: detail::IdType * _find( const sat::Solvable & solv_r ) const { if ( solv_r && _trans->steps.elements ) { for_( it, _trans->steps.elements, _trans->steps.elements + _trans->steps.count ) { if ( *it == detail::IdType(solv_r.id()) ) return it; } } return 0; } private: SerialNumberWatcher _watcher; mutable ::Transaction * _trans; DefaultIntegral _ordered; // set_type _doneSet; set_type _errSet; map_type _linkMap; // buddy map to adopt buddies StepResult set_type _systemErase; // @System packages to be eased (otherse are TRANSACTION_IGNORE) pmmap_type _pmMap; // Post mortem data of deleted @System solvables StringQueue _autoInstalled; // ident strings of all packages that would be auto-installed after the transaction is run. public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } }; /** \relates Transaction::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const Transaction::Impl & obj ) { return str << "Transaction: " << obj.size() << " (" << (obj.valid()?"valid":"INVALID") << ")"; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Transaction // /////////////////////////////////////////////////////////////////// Transaction::Transaction() : _pimpl( Impl::nullimpl() ) {} Transaction::Transaction( LoadFromPoolType ) : _pimpl( new Impl( loadFromPool ) ) {} Transaction::~Transaction() {} bool Transaction::valid() const { return _pimpl->valid(); } bool Transaction::order() { return _pimpl->order(); } bool Transaction::empty() const { return _pimpl->empty(); } size_t Transaction::size() const { return _pimpl->size(); } Transaction::const_iterator Transaction::begin() const { return _pimpl->begin( _pimpl ); } Transaction::iterator Transaction::begin() { return _pimpl->begin( _pimpl ); } Transaction::const_iterator Transaction::end() const { return _pimpl->end( _pimpl ); } Transaction::iterator Transaction::end() { return _pimpl->end( _pimpl ); } Transaction::const_iterator Transaction::find( const sat::Solvable & solv_r ) const { return _pimpl->find( _pimpl, solv_r ); } Transaction::iterator Transaction::find( const sat::Solvable & solv_r ) { return _pimpl->find( _pimpl, solv_r ); } int Transaction::installedResult( Queue & result_r ) const { return _pimpl->installedResult( result_r ); } StringQueue Transaction::autoInstalled() const { return _pimpl->autoInstalled(); } void Transaction::autoInstalled( const StringQueue & queue_r ) { _pimpl->autoInstalled( queue_r ); } std::ostream & operator<<( std::ostream & str, const Transaction & obj ) { return str << *obj._pimpl; } std::ostream & dumpOn( std::ostream & str, const Transaction & obj ) { for_( it, obj.begin(), obj.end() ) { str << *it << endl; } return str; } bool operator==( const Transaction & lhs, const Transaction & rhs ) { return lhs._pimpl == rhs._pimpl; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Transaction::Step // /////////////////////////////////////////////////////////////////// Transaction::Step::Step() {} Transaction::StepType Transaction::Step::stepType() const { return _pimpl->stepType( _solv ); } Transaction::StepStage Transaction::Step::stepStage() const { return _pimpl->stepStage( _solv ); } void Transaction::Step::stepStage( StepStage val_r ) { _pimpl->stepStage( _solv, val_r ); } IdString Transaction::Step::ident() const { return _solv ? _solv.ident() : _pimpl->pmdata(_solv )._ident; } Edition Transaction::Step::edition() const { return _solv ? _solv.edition() : _pimpl->pmdata(_solv )._edition; } Arch Transaction::Step::arch() const { return _solv ? _solv.arch() : _pimpl->pmdata(_solv )._arch; } std::ostream & operator<<( std::ostream & str, const Transaction::Step & obj ) { str << obj.stepType() << obj.stepStage() << " "; if ( obj.satSolvable() ) str << PoolItem( obj.satSolvable() ); else str << '[' << obj.ident() << '-' << obj.edition() << '.' << obj.arch() << ']'; return str; } std::ostream & operator<<( std::ostream & str, Transaction::StepType obj ) { switch ( obj ) { #define OUTS(E,S) case Transaction::E: return str << #S; break OUTS( TRANSACTION_IGNORE, [ ] ); OUTS( TRANSACTION_ERASE, [-] ); OUTS( TRANSACTION_INSTALL, [+] ); OUTS( TRANSACTION_MULTIINSTALL, [M] ); #undef OUTS } return str << "[?]"; } std::ostream & operator<<( std::ostream & str, Transaction::StepStage obj ) { switch ( obj ) { #define OUTS(E,S) case Transaction::E: return str << #S; break OUTS( STEP_TODO, [__] ); OUTS( STEP_DONE, [OK] ); OUTS( STEP_ERROR, [**] ); #undef OUTS } return str << "[??]"; } /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Transaction::const_iterator/iterator // /////////////////////////////////////////////////////////////////// Transaction_const_iterator::Transaction_const_iterator() : Transaction_const_iterator::iterator_adaptor_( 0 ) {} Transaction_const_iterator::Transaction_const_iterator( const Transaction_iterator & iter_r ) : Transaction_const_iterator::iterator_adaptor_( iter_r.base() ) , _pimpl( iter_r._pimpl ) {} Transaction_iterator::Transaction_iterator() : Transaction_iterator::iterator_adaptor_( 0 ) {} ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/Transaction.h000066400000000000000000000356741476576476200176640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/Transaction.h */ #ifndef ZYPP_SAT_TRANSACTION_H #define ZYPP_SAT_TRANSACTION_H #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// namespace detail { /** Needs to be outside \ref Transaction in order to be usable in SolvIterMixin. */ class Transaction_iterator; /** Needs to be outside \ref Transaction in order to be usable in SolvIterMixin. */ class Transaction_const_iterator; } /** Libsolv transaction wrapper. * \note Note that Transaction is derived from \ref sat::SolvIterMixin which * makes PoolItem and Selectable iterators automatically available. * \note Changing the \ref ResPool content (loading/unloading repositories) * invalidates all outstanding transaction data. \see \ref valid. * \note.The transaction may inlude steps of type \ref TRANSACTION_IGNORE which * do not cause/require any specific action. To skip those informal steps * when iterating, use the \ref actionBegin /\ref actionEnd methods. */ class ZYPP_API Transaction : public SolvIterMixin { friend std::ostream & operator<<( std::ostream & str, const Transaction & obj ); friend std::ostream & dumpOn( std::ostream & str, const Transaction & obj ); friend bool operator==( const Transaction & lhs, const Transaction & rhs ); public: /** Represents a single step within a \ref Transaction. */ class Step; /** Type of (rpm) action to perform in a \ref Step. */ enum StepType { TRANSACTION_IGNORE = 0x00, /**< [ ] Nothing (includes implicit deletes due to obsoletes and non-package actions) */ TRANSACTION_ERASE = 0x10, /**< [-] Delete item */ TRANSACTION_INSTALL = 0x20, /**< [+] Install(update) item */ TRANSACTION_MULTIINSTALL = 0x30 /**< [M] Install(multiversion) item (\see \ref ZConfig::multiversion) */ }; /** \ref Step action result. */ enum StepStage { STEP_TODO = (1 << 0), /**< [__] unprocessed */ STEP_DONE = (1 << 1), /**< [OK] success */ STEP_ERROR = (1 << 2), /**< [**] error */ }; ZYPP_DECLARE_FLAGS(StepStages,StepStage); public: struct LoadFromPoolType {}; ///< Ctor arg type static constexpr LoadFromPoolType loadFromPool = LoadFromPoolType(); public: /** Default ctor: empty transaction. */ Transaction(); /** Ctor loading the default pools transaction. */ Transaction( LoadFromPoolType ); /** Dtor */ ~Transaction(); public: /** Whether transaction actually contains data and also fits the current pools content. */ bool valid() const; /** Validate object in a boolean context: valid */ explicit operator bool() const { return valid(); } /** Order transaction steps for commit. * It's cheap to call it for an aleready ordered \ref Transaction. * This invalidates outstanding iterators. Returns whether * \ref Transaction is \ref valid. */ bool order(); /** Whether the transaction contains any steps. */ bool empty() const; /** Number of steps in transaction steps. */ size_t size() const; using iterator = detail::Transaction_iterator; using const_iterator = detail::Transaction_const_iterator; /** Iterator to the first \ref TransactionStep */ const_iterator begin() const; /** \overload */ iterator begin(); /** Iterator behind the last \ref TransactionStep */ const_iterator end() const; /** \overload */ iterator end(); /** Return iterator pointing to \a solv_r or \ref end. */ const_iterator find( const sat::Solvable & solv_r ) const; iterator find( const sat::Solvable & solv_r ); /** \overload */ const_iterator find( const ResObject::constPtr & resolvable_r ) const; iterator find( const ResObject::constPtr & resolvable_r ); /** \overload */ const_iterator find( const PoolItem & pi_r ) const; iterator find( const PoolItem & pi_r ); public: /** \name Iterate action steps (omit TRANSACTION_IGNORE steps). * * All these methods allow to pass an optional OR'd combination of * \ref StepStages as filter. Per default all steps are processed/counted. * * \code * Transaction trans; * for_( it, trans.actionBegin(~sat::Transaction::STEP_DONE), trans.actionEnd() ) * { * ... // process all steps not DONE (ERROR and TODO) * } * \endcode */ //@{ struct FilterAction; using action_iterator = filter_iterator; /** Whether the [filtered] transaction contains any steps . */ bool actionEmpty( StepStages filter_r = StepStages() ) const; /** Number of steps in [filtered] transaction steps. */ size_t actionSize( StepStages filter_r = StepStages() ) const; /** Pointer to the 1st action step in [filtered] transaction. */ action_iterator actionBegin( StepStages filter_r = StepStages() ) const; /** Pointer behind the last action step in transaction. */ action_iterator actionEnd() const; /** Iterate the [filtered] transaction steps. */ Iterable action( StepStages filter_r = StepStages() ) const; //@} public: /** Return all packages that would be installed after the transaction is run. * The new packages are put at the head of the queue, the number of new * packages is returned. (wraps libsolv::transaction_installedresult) */ int installedResult( Queue & result_r ) const; /** Return the ident strings of all packages that would be auto-installed after the transaction is run. */ StringQueue autoInstalled() const; /** Set the ident strings of all packages that would be auto-installed after the transaction is run. */ void autoInstalled( const StringQueue & queue_r ); public: /** Implementation */ struct Impl; private: /** Pointer to implementation */ RW_pointer _pimpl; }; ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Transaction::StepStages); /** \relates Transaction Stream output */ std::ostream & operator<<( std::ostream & str, const Transaction & obj ) ZYPP_API; /** \relates Transaction Verbose stream output */ std::ostream & dumpOn( std::ostream & str, const Transaction & obj ) ZYPP_API; /** \relates Transaction */ bool operator==( const Transaction & lhs, const Transaction & rhs ) ZYPP_API; /** \relates Transaction */ inline bool operator!=( const Transaction & lhs, const Transaction & rhs ) { return !( lhs == rhs ); } /** A single step within a \ref Transaction. * * \note After commit, when the @System repo (rpm database) is reread, all * @System solvables within the transaction are invalidated (they got deleted). * Thats why we internally store the NVRA, so you can access \ref ident * (\see \ref sat::Solvable::ident), \ref edition, \ref arch of a deleted package, * even if the \ref satSolvable itself is meanwhile invalid. * * \see \ref Transaction. */ class Transaction::Step { friend std::ostream & operator<<( std::ostream & str, const Step & obj ); public: Step(); Step( const RW_pointer & pimpl_r, detail::IdType id_r ) : _solv( id_r ) , _pimpl( pimpl_r ) {} public: /** Type of action to perform in this step. */ StepType stepType() const; /** Step action result. */ StepStage stepStage() const; /** Set step action result. */ void stepStage( StepStage val_r ); /** Return the corresponding \ref Solvable. * Returns \ref Solvable::noSolvable if the item is meanwhile deleted and * was removed from the pool. \see Post mortem acccess to @System solvables. */ Solvable satSolvable() const { return _solv; } /** \name Post mortem acccess to @System solvables * \code * Transaction::Step step; * if ( step.satSolvable() ) * std::cout << step.satSolvable() << endl; * else * std::cout << step.ident() << endl; // deleted @System solvable * \endcode */ //@{ /** \see \ref sat::Solvable::ident. */ IdString ident() const; /** \see \ref sat::Solvable::edition. */ Edition edition() const; /** \see \ref sat::Solvable::arch. */ Arch arch() const; //@} /** Implicit conversion to \ref Solvable */ operator const Solvable &() const { return _solv; } /** \overload nonconst */ operator Solvable &() { return _solv; } private: Solvable _solv; /** Pointer to implementation */ RW_pointer _pimpl; }; /** \relates Transaction::Step Stream output */ std::ostream & operator<<( std::ostream & str, const Transaction::Step & obj ) ZYPP_API; /** \relates Transaction::StepType Stream output */ std::ostream & operator<<( std::ostream & str, Transaction::StepType obj ) ZYPP_API; /** \relates Transaction::StepStage Stream output */ std::ostream & operator<<( std::ostream & str, Transaction::StepStage obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// /** \ref Transaction iterator. */ class Transaction_iterator : public boost::iterator_adaptor< Transaction_iterator // Derived , const detail::IdType * // Base , Transaction::Step // Value , boost::forward_traversal_tag // CategoryOrTraversal , Transaction::Step // Reference > { public: Transaction_iterator(); Transaction_iterator( const RW_pointer & pimpl_r, base_type id_r ) : Transaction_iterator::iterator_adaptor_( id_r ) , _pimpl( pimpl_r ) {} private: friend class boost::iterator_core_access; reference dereference() const { return Transaction::Step( _pimpl, *base() ); } private: friend class Transaction_const_iterator; /** Pointer to implementation */ RW_pointer _pimpl; }; /** \ref Transaction const_iterator. */ class Transaction_const_iterator : public boost::iterator_adaptor< Transaction_const_iterator // Derived , const detail::IdType * // Base , const Transaction::Step // Value , boost::forward_traversal_tag // CategoryOrTraversal , const Transaction::Step // Reference > { public: Transaction_const_iterator(); Transaction_const_iterator( const Transaction_iterator & iter_r ); Transaction_const_iterator( const RW_pointer & pimpl_r, base_type id_r ) : Transaction_const_iterator::iterator_adaptor_( id_r ) , _pimpl( pimpl_r ) {} private: friend class boost::iterator_core_access; reference dereference() const { return Transaction::Step( _pimpl, *base() ); } private: /** Pointer to implementation */ RW_pointer _pimpl; }; ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// inline Transaction::const_iterator Transaction::find( const ResObject::constPtr & resolvable_r ) const { return( resolvable_r ? find( resolvable_r->satSolvable() ) : end() ); } inline Transaction::iterator Transaction::find( const ResObject::constPtr & resolvable_r ) { return( resolvable_r ? find( resolvable_r->satSolvable() ) : end() ); } inline Transaction::const_iterator Transaction::find( const PoolItem & pi_r ) const { return find( pi_r.satSolvable() ); } inline Transaction::iterator Transaction::find( const PoolItem & pi_r ) { return find( pi_r.satSolvable() ); } struct Transaction::FilterAction { FilterAction() {} FilterAction( StepStages filter_r ) : _filter( filter_r ) {} bool operator()( const Transaction::Step & step_r ) const { if ( step_r.stepType() == Transaction::TRANSACTION_IGNORE ) return false; // no action return !_filter || _filter.testFlag( step_r.stepStage() ); } StepStages _filter; }; inline Transaction::action_iterator Transaction::actionBegin( StepStages filter_r ) const { return make_filter_begin( FilterAction( filter_r ), *this ); } inline Transaction::action_iterator Transaction::actionEnd() const { return make_filter_end( FilterAction(), *this ); } inline bool Transaction::actionEmpty( StepStages filter_r ) const { return( actionBegin( filter_r ) == actionEnd() ); } inline size_t Transaction::actionSize( StepStages filter_r ) const { size_t cnt = 0; for_( it, actionBegin( filter_r ), actionEnd() ) ++cnt; return cnt; } inline Iterable Transaction::action( StepStages filter_r ) const { return makeIterable( actionBegin( filter_r ), actionEnd() ); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_TRANSACTION_H libzypp-17.36.5/zypp/sat/WhatObsoletes.cc000066400000000000000000000126161476576476200203070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/WhatObsoletes.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// // Obsoletes may either match against provides, or names. // Configuration depends on the behaviour of rpm. #ifdef _RPM_5 bool obsoleteUsesProvides = true; #else bool obsoleteUsesProvides = false; #endif /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// using set_type = std::unordered_set; using vector_type = std::vector; ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// WhatObsoletes::WhatObsoletes( Solvable item_r ) : _begin( 0 ) { ctorAdd( item_r ); ctorDone(); } WhatObsoletes::WhatObsoletes( const PoolItem & item_r ) : _begin( 0 ) { ctorAdd( item_r ); ctorDone(); } WhatObsoletes::WhatObsoletes( const ResObject::constPtr& item_r ) : _begin( 0 ) { if ( item_r ) { ctorAdd( item_r->satSolvable() ); ctorDone(); } } void WhatObsoletes::ctorAdd( const PoolItem & item_r ) { ctorAdd( item_r->satSolvable() ); } void WhatObsoletes::ctorAdd( const ResObject_constPtr& item_r ) { if ( item_r ) ctorAdd( item_r->satSolvable() ); } namespace { /** Add item to the set created on demand. */ inline void addToSet( Solvable item, set_type *& pdata, shared_ptr& _private ) { if ( ! pdata ) { _private.reset( (pdata = new set_type) ); } pdata->insert( item.id() ); } } void WhatObsoletes::ctorAdd( Solvable item_r ) { if ( item_r.multiversionInstall() ) return; // multiversion (rpm -i) does not evaluate any obsoletes if ( obsoleteUsesProvides ) { WhatProvides obsoleted( item_r.dep_obsoletes() ); if ( obsoleted.empty() ) return; // use allocated private data to collect the results set_type * pdata = ( _private ? reinterpret_cast( _private.get() ) : 0 ); for_( it, obsoleted.begin(), obsoleted.end() ) { if ( it->isSystem() ) addToSet( *it, pdata, _private ); } } else // Obsoletes match names { Capabilities obsoletes( item_r.dep_obsoletes() ); if ( obsoletes.empty() ) return; // use allocated private data to collect the results set_type * pdata = ( _private ? reinterpret_cast( _private.get() ) : 0 ); for_( it, obsoletes.begin(), obsoletes.end() ) { // For each obsoletes find providers, but with the same name IdString ident( it->detail().name() ); WhatProvides obsoleted( *it ); for_( iit, obsoleted.begin(), obsoleted.end() ) { if ( iit->isSystem() && iit->ident() == ident ) addToSet( *iit, pdata, _private ); } } } } void WhatObsoletes::ctorDone() { if ( _private ) { // copy set to vector and terminate _private set_type * sdata = reinterpret_cast( _private.get() ); vector_type * pdata = new vector_type( sdata->begin(), sdata->end() ); pdata->push_back( sat::detail::noId ); _begin = &pdata->front(); _private.reset( pdata ); } } WhatObsoletes::size_type WhatObsoletes::size() const { if ( ! _begin ) return 0; Capabilities::size_type ret = 0; for ( const sat::detail::IdType * end = _begin; *end; ++end ) { ++ret; } return ret; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const WhatObsoletes & obj ) { return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() ); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/WhatObsoletes.h000066400000000000000000000073141476576476200201500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/WhatObsoletes.h * */ #ifndef ZYPP_SAT_WHATOBSOLETES_H #define ZYPP_SAT_WHATOBSOLETES_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : WhatObsoletes // /** Container of \b installed \ref Solvable which would be * obsoleted by the \ref Solvable passed to the ctor. * * \todo Publish obsoleteUsesProvides config option. */ class WhatObsoletes : public SolvIterMixin, protected detail::PoolMember { public: using value_type = Solvable; using size_type = unsigned int; public: /** Default ctor */ WhatObsoletes() : _begin( 0 ) {} /** Ctor from \ref Solvable. */ explicit WhatObsoletes( Solvable item_r ); /** Ctor from \ref PoolItem. */ explicit WhatObsoletes( const PoolItem & item_r ); /** Ctor from \ref ResObject::constPtr. */ explicit WhatObsoletes( const ResObject_constPtr& item_r ); /** Ctor from a range of \ref Solvable, \ref PoolItem or \ref ResObject::constPtr. */ template WhatObsoletes( TIterator begin, TIterator end ) : _begin( 0 ) { for_( it, begin, end ) ctorAdd( *it ); ctorDone(); } public: /** Whether the container is empty. */ bool empty() const { return ! ( _begin && *_begin ); } /** Number of solvables inside. */ size_type size() const; public: using const_iterator = detail::WhatProvidesIterator; /** Iterator pointing to the first \ref Solvable. */ const_iterator begin() const { return const_iterator( _begin ); } /** Iterator pointing behind the last \ref Solvable. */ const_iterator end() const { return const_iterator(); } private: void ctorAdd( const PoolItem & item_r ); void ctorAdd( const ResObject_constPtr& item_r ); void ctorAdd( Solvable item_r ); void ctorDone(); private: const sat::detail::IdType * _begin; shared_ptr _private; }; /////////////////////////////////////////////////////////////////// /** \relates WhatObsoletes Stream output */ std::ostream & operator<<( std::ostream & str, const WhatObsoletes & obj ); ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_WHATOBSOLETES_H libzypp-17.36.5/zypp/sat/WhatProvides.cc000066400000000000000000000142361476576476200201430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/WhatProvides.cc * */ #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : WhatProvides::Impl // /** WhatProvides implementation date. * Stores the offset into a O terminated Id array. Per default * libsolvs whatprovidesdata, otherwise private data. * * As libsolvs whatprovidesdata might be realocated * while iterating a result, the iterator takes an * const IdType *const*. Thats why we explicitly * provide _private and pass its adress to the iterator, * even if private data are not reallocated. */ class WhatProvides::Impl : protected detail::PoolMember { public: Impl() : _offset( 0 ), _private( 0 ) {} Impl( unsigned offset_r ) : _offset( offset_r ), _private( 0 ) {} Impl( const std::unordered_set & ids_r ) : _offset( 0 ), _private( 0 ) { // use private data to store the result (incl. trailing NULL) _pdata.reserve( ids_r.size()+1 ); _pdata.insert( _pdata.begin(), ids_r.begin(), ids_r.end() ); _pdata.push_back( detail::noId ); _private = &_pdata.front(); // ptr to 1st element } public: unsigned _offset; const detail::IdType * _private; private: std::vector _pdata; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// /** WhatProvides ctor helper collecting providers from Capabilies. */ template void collectProviders( Iterator begin_r, Iterator end_r, std::unordered_set & collect_r ) { for_( it, begin_r, end_r ) { WhatProvides providers( *it ); for_( prv, providers.begin(), providers.end() ) { collect_r.insert( prv->id() ); } } } ///////////////////////////////////////////////////////////////// } //namespace /////////////////////////////////////////////////////////////////// WhatProvides::WhatProvides() {} WhatProvides::WhatProvides( Capability cap_r ) { unsigned res( myPool().whatProvides( cap_r ) ); if ( myPool().whatProvidesData( res ) ) { _pimpl.reset( new Impl( res ) ); } // else: no Impl for empty result. } WhatProvides::WhatProvides( Capabilities caps_r ) { std::unordered_set ids; collectProviders( caps_r.begin(), caps_r.end(), ids ); if ( ! ids.empty() ) { _pimpl.reset( new Impl( ids ) ); } // else: no Impl for empty result. } WhatProvides::WhatProvides( const CapabilitySet & caps_r ) { std::unordered_set ids; collectProviders( caps_r.begin(), caps_r.end(), ids ); if ( ! ids.empty() ) { _pimpl.reset( new Impl( ids ) ); } // else: no Impl for empty result. } bool WhatProvides::empty() const { return !_pimpl; // Ctor asserts no Impl for empty result. } WhatProvides::size_type WhatProvides::size() const { if ( !_pimpl ) return 0; size_type count = 0; for_( it, begin(), end() ) ++count; return count; } WhatProvides::const_iterator WhatProvides::begin() const { if ( !_pimpl ) return const_iterator(); if ( _pimpl->_private ) return const_iterator( _pimpl->_private ); // for libsolvs index use one more indirection, as it might get relocated. return const_iterator( &myPool().getPool()->whatprovidesdata, _pimpl->_offset ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const WhatProvides & obj ) { return dumpRange( str << "(" << obj.size() << ")", obj.begin(), obj.end() ); } /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const WhatProvidesIterator & obj ) { str << str::form( "[%5u]", obj._offset ); str << str::form( "<%p(%p)>", obj.base_reference(), &obj.base_reference() ); str << str::form( "<%p(%p)>", obj._baseRef, (obj._baseRef ? *obj._baseRef : 0) ); return str; } ///////////////////////////////////////////////////////////////// } //namespace detail /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/WhatProvides.h000066400000000000000000000206011476576476200177760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/WhatProvides.h * */ #ifndef ZYPP_SAT_WHATPROVIDES_H #define ZYPP_SAT_WHATPROVIDES_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// namespace detail { class WhatProvidesIterator; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : WhatProvides // /** Container of \ref Solvable providing a \ref Capability (read only). * * \code * Capability cap("amarok < 1.13"); * * WhatProvides q( cap ); * Solvable firstMatch; * * if ( ! q.empty() ) * { * cout << "Found " << q.size() << " matches for " << cap << ":" << endl; * firstMatch = *q.begin(); * * for_( it, q.begin(), q.end() ) * cout << *it << endl; * } * * if ( firstMatch ) * { * WhatProvides req( firstMatch.requires() ); * if ( ! req.empty() ) * { * cout << "Found " << req.size() << " items providing requirements of " << firstMatch << ":" << endl; * } * } * \endcode * * \note Note that there are capabilities which are not provided by any \ref Solvable, * but are system properties. For example: * \code * rpmlib(PayloadIsBzip2) <= 3.0.5-1 * \endcode * In that case a \ref Solvable::noSolvable is returned, which has \c isSystem set \c true, although * there should never be a \ref Solvable::noSolvable returned with \c isSystem set \c false. If so, * please file a bugreport. * \code * WhatProvides q( Capability("rpmlib(PayloadIsBzip2) <= 3.0.5-1") ); * for_( it, q.begin(), q.end() ) * { * if ( *it ) * cout << "Capability is provided by package " << *it << endl; * else if ( it->isSystem() ) * cout << "Capability is a system property" << endl; * else * ; // never reaching this \c else * } * \endcode */ class ZYPP_API WhatProvides : public SolvIterMixin, protected detail::PoolMember { public: using value_type = Solvable; using size_type = unsigned int; public: /** Default ctor */ WhatProvides(); /** Ctor from \ref Capability. */ explicit WhatProvides( Capability cap_r ); /** Ctor collecting all providers of capabilities in \c caps_r. */ explicit WhatProvides( Capabilities caps_r ); /** Ctor collecting all providers of capabilities in \c caps_r. */ explicit WhatProvides( const CapabilitySet & caps_r ); public: /** Whether the container is empty. */ bool empty() const; /** Number of solvables inside. */ size_type size() const; public: using const_iterator = detail::WhatProvidesIterator; /** Iterator pointing to the first \ref Solvable. */ const_iterator begin() const; /** Iterator pointing behind the last \ref Solvable. */ const_iterator end() const; private: class Impl; RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates WhatProvides Stream output */ std::ostream & operator<<( std::ostream & str, const WhatProvides & obj ); /////////////////////////////////////////////////////////////////// /// \brief Container of packages providing `ptf()` class ZYPP_API AllPTFs : public WhatProvides { public: AllPTFs() : WhatProvides( Capability(Solvable::ptfMasterToken.id()) ) {}; }; namespace detail { /////////////////////////////////////////////////////////////////// // // CLASS NAME : WhatProvides::const_iterator // /** \ref WhatProvides iterator. * Iterate a NULL terminated sat::detail::IdType array. Ctor gets * the adress of a pointer to the array, and offset into the array. * This is needed in case the array gets reallocated. */ class WhatProvidesIterator : public boost::iterator_adaptor< WhatProvidesIterator // Derived , const detail::IdType * // Base , const Solvable // Value , boost::forward_traversal_tag // CategoryOrTraversal , const Solvable // Reference > { friend std::ostream & operator<<( std::ostream & str, const WhatProvidesIterator & obj ); public: WhatProvidesIterator() : iterator_adaptor_( 0 ), _baseRef( 0 ), _offset( 0 ) {} /** Ctor with pointer to 1st elemment of an array. * Use otherwise unused base as pointer for _baseRef. */ explicit WhatProvidesIterator( const detail::IdType *const base_r, unsigned offset_r = 0 ) : iterator_adaptor_( base_r ), _baseRef( base_r ? &base_reference() : 0 ), _offset( offset_r ) {} /** Ctor with pointer to pointer to 1st elemment of an array. * Required for arrays that might be relocated while iterating. */ explicit WhatProvidesIterator( const detail::IdType *const* baseRef_r, unsigned offset_r ) : iterator_adaptor_( 0 ), _baseRef( baseRef_r ), _offset( offset_r ) {} /** Copy-ctor required to keep _baseRef adjusted. */ WhatProvidesIterator( const WhatProvidesIterator & rhs ) : iterator_adaptor_( rhs.base_reference() ) , _baseRef( base_reference() ? &base_reference() : rhs._baseRef ) , _offset( rhs._offset ) {} /** Assignment operator required to keep _baseRef adjusted. */ WhatProvidesIterator & operator=( const WhatProvidesIterator & rhs ) { if ( this != &rhs ) // no self assign { base_reference() = rhs.base_reference(); _baseRef = ( base_reference() ? &base_reference() : rhs._baseRef ); _offset = rhs._offset; } return *this; } private: friend class boost::iterator_core_access; reference dereference() const { return Solvable( getId() ); } #if 0 template bool equal( const boost::iterator_adaptor & rhs ) const #endif bool equal( const WhatProvidesIterator & rhs ) const { if ( ! ( getId() || rhs.getId() ) ) return true; // both @end if ( _offset != rhs._offset ) return false; if ( base_reference() ) return( base_reference() == rhs.base_reference() ); return( _baseRef == rhs._baseRef ); } void increment() { ++_offset; } detail::IdType getId() const { return _baseRef ? (*_baseRef)[_offset] : detail::noId; } private: const detail::IdType *const* _baseRef; unsigned _offset; }; /////////////////////////////////////////////////////////////////// } inline WhatProvides::const_iterator WhatProvides::end() const { return const_iterator(); } ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_WHATPROVIDES_H libzypp-17.36.5/zypp/sat/detail/000077500000000000000000000000001476576476200164515ustar00rootroot00000000000000libzypp-17.36.5/zypp/sat/detail/PoolImpl.cc000066400000000000000000000600731476576476200205210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/detail/PoolImpl.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { // Workaround libsolv project not providing a common include // directory. (the -devel package does, but the git repo doesn't). // #include // #include int repo_add_helix( ::Repo *repo, FILE *fp, int flags ); int testcase_add_testtags(Repo *repo, FILE *fp, int flags); } using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::satpool" // /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace env { /** */ inline int LIBSOLV_DEBUGMASK() { const char * envp = getenv("LIBSOLV_DEBUGMASK"); return envp ? str::strtonum( envp ) : 0; } } // namespace env /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// // MPL checks for satlib constants we redefine to avoid // includes and defines. BOOST_MPL_ASSERT_RELATION( noId, ==, STRID_NULL ); BOOST_MPL_ASSERT_RELATION( emptyId, ==, STRID_EMPTY ); BOOST_MPL_ASSERT_RELATION( noSolvableId, ==, ID_NULL ); BOOST_MPL_ASSERT_RELATION( systemSolvableId, ==, SYSTEMSOLVABLE ); BOOST_MPL_ASSERT_RELATION( solvablePrereqMarker, ==, SOLVABLE_PREREQMARKER ); BOOST_MPL_ASSERT_RELATION( solvableFileMarker, ==, SOLVABLE_FILEMARKER ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_AND, ==, REL_AND ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_OR, ==, REL_OR ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_COND, ==, REL_COND ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_UNLESS, ==, REL_UNLESS ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_ELSE, ==, REL_ELSE ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_WITH, ==, REL_WITH ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_WITHOUT, ==, REL_WITHOUT ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_NAMESPACE, ==, REL_NAMESPACE ); BOOST_MPL_ASSERT_RELATION( CapDetail::CAP_ARCH, ==, REL_ARCH ); BOOST_MPL_ASSERT_RELATION( namespaceModalias, ==, NAMESPACE_MODALIAS ); BOOST_MPL_ASSERT_RELATION( namespaceLanguage, ==, NAMESPACE_LANGUAGE ); BOOST_MPL_ASSERT_RELATION( namespaceFilesystem, ==, NAMESPACE_FILESYSTEM ); ///////////////////////////////////////////////////////////////// const std::string & PoolImpl::systemRepoAlias() { static const std::string _val( "@System" ); return _val; } const Pathname & sysconfigStoragePath() { static const Pathname _val( "/etc/sysconfig/storage" ); return _val; } ///////////////////////////////////////////////////////////////// static void logSat( CPool *, void *data, int type, const char *logString ) { // "1234567890123456789012345678901234567890 if ( 0 == strncmp( logString, "job: drop orphaned", 18 ) ) return; if ( 0 == strncmp( logString, "job: user installed", 19 ) ) return; if ( 0 == strncmp( logString, "job: multiversion", 17 ) ) return; if ( 0 == strncmp( logString, " - no rule created", 19 ) ) return; if ( 0 == strncmp( logString, " next rules: 0 0", 19 ) ) return; if ( type & (SOLV_FATAL|SOLV_ERROR) ) { L_ERR("libsolv") << logString; } else if ( type & SOLV_DEBUG_STATS ) { L_DBG("libsolv") << logString; } else { L_MIL("libsolv") << logString; } } detail::IdType PoolImpl::nsCallback( CPool *, void * data, detail::IdType lhs, detail::IdType rhs ) { // lhs: the namespace identifier, e.g. NAMESPACE:MODALIAS // rhs: the value, e.g. pci:v0000104Cd0000840[01]sv*sd*bc*sc*i* // return: 0 if not supportded // 1 if supported by the system // -1 AFAIK it's also possible to return a list of solvables that support it, but don't know how. static const detail::IdType RET_unsupported = 0; static const detail::IdType RET_systemProperty = 1; switch ( lhs ) { case NAMESPACE_LANGUAGE: { const TrackedLocaleIds & localeIds( reinterpret_cast(data)->trackedLocaleIds() ); return localeIds.contains( IdString(rhs) ) ? RET_systemProperty : RET_unsupported; } break; case NAMESPACE_MODALIAS: { // modalias strings in capability may be hexencoded because rpm does not allow // ',', ' ' or other special chars. return target::Modalias::instance().query( str::hexdecode( IdString(rhs).c_str() ) ) ? RET_systemProperty : RET_unsupported; } break; case NAMESPACE_FILESYSTEM: { const std::set & requiredFilesystems( reinterpret_cast(data)->requiredFilesystems() ); return requiredFilesystems.find( IdString(rhs).asString() ) != requiredFilesystems.end() ? RET_systemProperty : RET_unsupported; } break; } WAR << "Unhandled " << Capability( lhs ) << " vs. " << Capability( rhs ) << endl; return RET_unsupported; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : PoolMember::myPool // METHOD TYPE : PoolImpl // PoolImpl & PoolMember::myPool() { static PoolImpl _global; return _global; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : PoolImpl::PoolImpl // METHOD TYPE : Ctor // PoolImpl::PoolImpl() : _pool( ::pool_create() ) { MIL << "Creating sat-pool." << endl; if ( ! _pool ) { ZYPP_THROW( Exception( _("Can not create sat-pool.") ) ); } // by now we support only a RPM backend ::pool_setdisttype(_pool, DISTTYPE_RPM ); // initialialize logging if ( env::LIBSOLV_DEBUGMASK() ) { ::pool_setdebugmask(_pool, env::LIBSOLV_DEBUGMASK() ); } else { if ( getenv("ZYPP_LIBSOLV_FULLLOG") || getenv("ZYPP_LIBSAT_FULLLOG") ) ::pool_setdebuglevel( _pool, 3 ); else if ( getenv("ZYPP_FULLLOG") ) ::pool_setdebuglevel( _pool, 2 ); else ::pool_setdebugmask(_pool, SOLV_DEBUG_JOB|SOLV_DEBUG_STATS ); } ::pool_setdebugcallback( _pool, logSat, NULL ); // set namespace callback _pool->nscallback = &nsCallback; _pool->nscallbackdata = (void*)this; // CAVEAT: We'd like to do it here, but in side the Pool ctor we can not // yet use IdString types. We do in setDirty, when the 1st // _retractedSpec.addProvides( Capability( Solvable::retractedToken.id() ) ); // _ptfMasterSpec.addProvides( Capability( Solvable::ptfMasterToken.id() ) ); // _ptfPackageSpec.addProvides( Capability( Solvable::ptfPackageToken.id() ) ); _retractedSpec.addIdenticalInstalledToo( true ); // retracted indicator is not part of the package! } /////////////////////////////////////////////////////////////////// // // METHOD NAME : PoolImpl::~PoolImpl // METHOD TYPE : Dtor // PoolImpl::~PoolImpl() { ::pool_free( _pool ); } /////////////////////////////////////////////////////////////////// void PoolImpl::setDirty( const char * a1, const char * a2, const char * a3 ) { if ( _retractedSpec.empty() ) { // lazy init IdString types we can not use inside the ctor _retractedSpec.addProvides( Capability( Solvable::retractedToken.id() ) ); _ptfMasterSpec.addProvides( Capability( Solvable::ptfMasterToken.id() ) ); _ptfPackageSpec.addProvides( Capability( Solvable::ptfPackageToken.id() ) ); } if ( a1 ) { if ( a3 ) MIL << a1 << " " << a2 << " " << a3 << endl; else if ( a2 ) MIL << a1 << " " << a2 << endl; else MIL << a1 << endl; } _serial.setDirty(); // pool content change _availableLocalesPtr.reset(); // available locales may change _multiversionListPtr.reset(); // re-evaluate ZConfig::multiversionSpec. _needrebootSpec.setDirty(); // re-evaluate needrebootSpec _retractedSpec.setDirty(); // re-evaluate blacklisted spec _ptfMasterSpec.setDirty(); // --"-- _ptfPackageSpec.setDirty(); // --"-- depSetDirty(); // invaldate dependency/namespace related indices } void PoolImpl::localeSetDirty( const char * a1, const char * a2, const char * a3 ) { if ( a1 ) { if ( a3 ) MIL << a1 << " " << a2 << " " << a3 << endl; else if ( a2 ) MIL << a1 << " " << a2 << endl; else MIL << a1 << endl; } _trackedLocaleIdsPtr.reset(); // requested locales changed depSetDirty(); // invaldate dependency/namespace related indices } void PoolImpl::depSetDirty( const char * a1, const char * a2, const char * a3 ) { if ( a1 ) { if ( a3 ) MIL << a1 << " " << a2 << " " << a3 << endl; else if ( a2 ) MIL << a1 << " " << a2 << endl; else MIL << a1 << endl; } ::pool_freewhatprovides( _pool ); } void PoolImpl::prepare() const { // additional /etc/sysconfig/storage check: static WatchFile sysconfigFile( sysconfigStoragePath(), WatchFile::NO_INIT ); if ( sysconfigFile.hasChanged() ) { _requiredFilesystemsPtr.reset(); // recreated on demand const_cast(this)->depSetDirty( "/etc/sysconfig/storage change" ); } if ( _watcher.remember( _serial ) ) { // After repo/solvable add/remove: // set pool architecture ::pool_setarch( _pool, ZConfig::instance().systemArchitecture().asString().c_str() ); } if ( ! _pool->whatprovides ) { MIL << "pool_createwhatprovides..." << endl; ::pool_addfileprovides( _pool ); ::pool_createwhatprovides( _pool ); } if ( ! _pool->languages ) { // initial seting const_cast(this)->setTextLocale( ZConfig::instance().textLocale() ); } } /////////////////////////////////////////////////////////////////// CRepo * PoolImpl::_createRepo( const std::string & name_r ) { setDirty(__FUNCTION__, name_r.c_str() ); CRepo * ret = ::repo_create( _pool, name_r.c_str() ); if ( ret && name_r == systemRepoAlias() ) ::pool_set_installed( _pool, ret ); return ret; } void PoolImpl::_deleteRepo( CRepo * repo_r ) { setDirty(__FUNCTION__, repo_r->name ); if ( isSystemRepo( repo_r ) ) _autoinstalled.clear(); eraseRepoInfo( repo_r ); ::repo_free( repo_r, /*resusePoolIDs*/false ); // If the last repo is removed clear the pool to actually reuse all IDs. // NOTE: the explicit ::repo_free above asserts all solvables are memset(0)! if ( !_pool->urepos ) { _serialIDs.setDirty(); // Indicate resusePoolIDs - ResPool must also invalidate its PoolItems ::pool_freeallrepos( _pool, /*resusePoolIDs*/true ); } } int PoolImpl::_addSolv( CRepo * repo_r, FILE * file_r ) { setDirty(__FUNCTION__, repo_r->name ); int ret = ::repo_add_solv( repo_r, file_r, 0 ); if ( ret == 0 ) _postRepoAdd( repo_r ); return ret; } int PoolImpl::_addHelix( CRepo * repo_r, FILE * file_r ) { setDirty(__FUNCTION__, repo_r->name ); int ret = ::repo_add_helix( repo_r, file_r, 0 ); if ( ret == 0 ) _postRepoAdd( repo_r ); return 0; } int PoolImpl::_addTesttags(CRepo *repo_r, FILE *file_r) { setDirty(__FUNCTION__, repo_r->name ); int ret = ::testcase_add_testtags( repo_r, file_r, 0 ); if ( ret == 0 ) _postRepoAdd( repo_r ); return 0; } void PoolImpl::_postRepoAdd( CRepo * repo_r ) { if ( ! isSystemRepo( repo_r ) ) { // Filter out unwanted archs std::set sysids; { Arch::CompatSet sysarchs( Arch::compatSet( ZConfig::instance().systemArchitecture() ) ); for_( it, sysarchs.begin(), sysarchs.end() ) sysids.insert( it->id() ); // unfortunately libsolv treats src/nosrc as architecture: sysids.insert( ARCH_SRC ); sysids.insert( ARCH_NOSRC ); } detail::IdType blockBegin = 0; unsigned blockSize = 0; for ( detail::IdType i = repo_r->start; i < repo_r->end; ++i ) { CSolvable * s( _pool->solvables + i ); if ( s->repo == repo_r && sysids.find( s->arch ) == sysids.end() ) { // Remember an unwanted arch entry: if ( ! blockBegin ) blockBegin = i; ++blockSize; } else if ( blockSize ) { // Free remembered entries ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*resusePoolIDs*/false ); blockBegin = blockSize = 0; } } if ( blockSize ) { // Free remembered entries ::repo_free_solvable_block( repo_r, blockBegin, blockSize, /*resusePoolIDs*/false ); blockBegin = blockSize = 0; } } } detail::SolvableIdType PoolImpl::_addSolvables( CRepo * repo_r, unsigned count_r ) { setDirty(__FUNCTION__, repo_r->name ); return ::repo_add_solvable_block( repo_r, count_r ); } void PoolImpl::setRepoInfo( RepoIdType id_r, const RepoInfo & info_r ) { CRepo * repo( getRepo( id_r ) ); if ( repo ) { bool dirty = false; // libsolv priority is based on '<', while yum's repoinfo // uses 1(highest)->99(lowest). Thus we use -info_r.priority. if ( repo->priority != int(-info_r.priority()) ) { repo->priority = -info_r.priority(); dirty = true; } // subpriority is used to e.g. prefer http over dvd iff // both have same priority. int mediaPriority( media::MediaPriority( info_r.url() ) ); if ( repo->subpriority != mediaPriority ) { repo->subpriority = mediaPriority; dirty = true; } if ( dirty ) setDirty(__FUNCTION__, info_r.alias().c_str() ); } _repoinfos[id_r] = info_r; } /////////////////////////////////////////////////////////////////// void PoolImpl::setTextLocale( const Locale & locale_r ) { if ( ! locale_r ) { // We need one, so "en" is the last resort const char *needone[] { "en" }; ::pool_set_languages( _pool, needone, 1 ); return; } std::vector fallbacklist; for ( Locale l( locale_r ); l; l = l.fallback() ) { fallbacklist.push_back( l.code() ); } dumpRangeLine( MIL << "pool_set_languages: ", fallbacklist.begin(), fallbacklist.end() ) << endl; std::vector fallbacklist_cstr; for_( it, fallbacklist.begin(), fallbacklist.end() ) { fallbacklist_cstr.push_back( it->c_str() ); } ::pool_set_languages( _pool, &fallbacklist_cstr.front(), fallbacklist_cstr.size() ); } void PoolImpl::initRequestedLocales( const LocaleSet & locales_r ) { if ( _requestedLocalesTracker.setInitial( locales_r ) ) { localeSetDirty( "initRequestedLocales" ); MIL << "Init RequestedLocales: " << _requestedLocalesTracker << " =" << locales_r << endl; } } void PoolImpl::setRequestedLocales( const LocaleSet & locales_r ) { if ( _requestedLocalesTracker.set( locales_r ) ) { localeSetDirty( "setRequestedLocales" ); MIL << "New RequestedLocales: " << _requestedLocalesTracker << " =" << locales_r << endl; } } bool PoolImpl::addRequestedLocale( const Locale & locale_r ) { bool done = _requestedLocalesTracker.add( locale_r ); if ( done ) { localeSetDirty( "addRequestedLocale", locale_r.code().c_str() ); MIL << "New RequestedLocales: " << _requestedLocalesTracker << " +" << locale_r << endl; } return done; } bool PoolImpl::eraseRequestedLocale( const Locale & locale_r ) { bool done = _requestedLocalesTracker.remove( locale_r ); if ( done ) { localeSetDirty( "eraseRequestedLocale", locale_r.code().c_str() ); MIL << "New RequestedLocales: " << _requestedLocalesTracker << " -" << locale_r << endl; } return done; } const PoolImpl::TrackedLocaleIds & PoolImpl::trackedLocaleIds() const { if ( ! _trackedLocaleIdsPtr ) { _trackedLocaleIdsPtr.reset( new TrackedLocaleIds ); const base::SetTracker & localesTracker( _requestedLocalesTracker ); TrackedLocaleIds & localeIds( *_trackedLocaleIdsPtr ); // Add current locales+fallback except for added ones for ( Locale lang: localesTracker.current() ) { if ( localesTracker.wasAdded( lang ) ) continue; for ( ; lang; lang = lang.fallback() ) { localeIds.current().insert( IdString(lang) ); } } // Add added locales+fallback except they are already in current for ( Locale lang: localesTracker.added() ) { for ( ; lang && localeIds.current().insert( IdString(lang) ).second; lang = lang.fallback() ) { localeIds.added().insert( IdString(lang) ); } } // Add removed locales+fallback except they are still in current for ( Locale lang: localesTracker.removed() ) { for ( ; lang && ! localeIds.current().count( IdString(lang) ); lang = lang.fallback() ) { localeIds.removed().insert( IdString(lang) ); } } // bsc#1155678: We try to differ between an empty RequestedLocales // and one containing 'en' (explicit or as fallback). An empty RequestedLocales // should not even drag in recommended 'en' packages. So we no longer enforce // 'en' being in the set. } return *_trackedLocaleIdsPtr; } static void _getLocaleDeps( const Capability & cap_r, LocaleSet & store_r ) { // Collect locales from any 'namespace:language(lang)' dependency CapDetail detail( cap_r ); if ( detail.kind() == CapDetail::EXPRESSION ) { switch ( detail.capRel() ) { case CapDetail::CAP_AND: case CapDetail::CAP_OR: // expand _getLocaleDeps( detail.lhs(), store_r ); _getLocaleDeps( detail.rhs(), store_r ); break; case CapDetail::CAP_NAMESPACE: if ( detail.lhs().id() == NAMESPACE_LANGUAGE ) { store_r.insert( Locale( IdString(detail.rhs().id()) ) ); } break; default: break; // unwanted } } } const LocaleSet & PoolImpl::getAvailableLocales() const { if ( !_availableLocalesPtr ) { _availableLocalesPtr.reset( new LocaleSet ); LocaleSet & localeSet( *_availableLocalesPtr ); for ( const Solvable & pi : Pool::instance().solvables() ) { for ( const Capability & cap : pi.dep_supplements() ) { _getLocaleDeps( cap, localeSet ); } } } return *_availableLocalesPtr; } /////////////////////////////////////////////////////////////////// void PoolImpl::multiversionListInit() const { _multiversionListPtr.reset( new MultiversionList ); MultiversionList & multiversionList( *_multiversionListPtr ); MultiversionList::size_type size = 0; for ( const std::string & spec : ZConfig::instance().multiversionSpec() ) { static const std::string prefix( "provides:" ); bool provides = str::hasPrefix( spec, prefix ); for ( Solvable solv : WhatProvides( Capability( provides ? spec.c_str() + prefix.size() : spec.c_str() ) ) ) { if ( provides || solv.ident() == spec ) multiversionList.insert( solv ); } MultiversionList::size_type nsize = multiversionList.size(); MIL << "Multiversion install " << spec << ": " << (nsize-size) << " matches" << endl; size = nsize; } } void PoolImpl::multiversionSpecChanged() { _multiversionListPtr.reset(); } const PoolImpl::MultiversionList & PoolImpl::multiversionList() const { if ( ! _multiversionListPtr ) multiversionListInit(); return *_multiversionListPtr; } bool PoolImpl::isMultiversion( const Solvable & solv_r ) const { return multiversionList().contains( solv_r ); } /////////////////////////////////////////////////////////////////// const std::set & PoolImpl::requiredFilesystems() const { if ( ! _requiredFilesystemsPtr ) { _requiredFilesystemsPtr.reset( new std::set ); std::set & requiredFilesystems( *_requiredFilesystemsPtr ); str::split( base::sysconfig::read( sysconfigStoragePath() )["USED_FS_LIST"], std::inserter( requiredFilesystems, requiredFilesystems.end() ) ); } return *_requiredFilesystemsPtr; } ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/sat/detail/PoolImpl.h000066400000000000000000000356101476576476200203620ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/detail/PoolImpl.h * */ #ifndef ZYPP_SAT_DETAIL_POOLIMPL_H #define ZYPP_SAT_DETAIL_POOLIMPL_H extern "C" { #include #include #include #include #include #include } #include #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// class SolvableSet; /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolImpl // /** */ class PoolImpl : private base::NonCopyable { public: /** Default ctor */ PoolImpl(); /** Dtor */ ~PoolImpl(); /** Pointer style access forwarded to sat-pool. */ CPool * operator->() { return _pool; } public: /** Serial number changing whenever the content changes. */ const SerialNumber & serial() const { return _serial; } /** Serial number changing whenever resusePoolIDs==true was used. ResPool must also invalidate its PoolItems! */ const SerialNumber & serialIDs() const { return _serialIDs; } /** Update housekeeping data (e.g. whatprovides). * \todo actually requires a watcher. */ void prepare() const; private: /** Invalidate housekeeping data (e.g. whatprovides) if the * pools content changed. */ void setDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 ); /** Invalidate locale related housekeeping data. */ void localeSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 ); /** Invalidate housekeeping data (e.g. whatprovides) if dependencies changed. */ void depSetDirty( const char * a1 = 0, const char * a2 = 0, const char * a3 = 0 ); /** Callback to resolve namespace dependencies (language, modalias, filesystem, etc.). */ static detail::IdType nsCallback( CPool *, void * data, detail::IdType lhs, detail::IdType rhs ); public: /** Reserved system repository alias \c @System. */ static const std::string & systemRepoAlias(); bool isSystemRepo( CRepo * repo_r ) const { return repo_r && _pool->installed == repo_r; } CRepo * systemRepo() const { return _pool->installed; } /** Get rootdir (for file conflicts check) */ Pathname rootDir() const { const char * rd = ::pool_get_rootdir( _pool ); return( rd ? rd : "/" ); } /** Set rootdir (for file conflicts check) */ void rootDir( const Pathname & root_r ) { if ( root_r.empty() || root_r == "/" ) ::pool_set_rootdir( _pool, nullptr ); else ::pool_set_rootdir( _pool, root_r.c_str() ); } public: /** \name Actions invalidating housekeeping data. * * All methods expect valid arguments being passed. */ //@{ /** Creating a new repo named \a name_r. */ CRepo * _createRepo( const std::string & name_r ); /** Delete repo \a repo_r from pool. */ void _deleteRepo( CRepo * repo_r ); /** Adding solv file to a repo. * Except for \c isSystemRepo_r, solvables of incompatible architecture * are filtered out. */ int _addSolv( CRepo * repo_r, FILE * file_r ); /** Adding helix file to a repo. * Except for \c isSystemRepo_r, solvables of incompatible architecture * are filtered out. */ int _addHelix( CRepo * repo_r, FILE * file_r ); /** Adding testtags file to a repo. * Except for \c isSystemRepo_r, solvables of incompatible architecture * are filtered out. */ int _addTesttags( CRepo * repo_r, FILE * file_r ); /** Adding Solvables to a repo. */ detail::SolvableIdType _addSolvables( CRepo * repo_r, unsigned count_r ); //@} /** Helper postprocessing the repo after adding solv or helix files. */ void _postRepoAdd( CRepo * repo_r ); public: /** a \c valid \ref Solvable has a non NULL repo pointer. */ bool validSolvable( const CSolvable & slv_r ) const { return slv_r.repo; } /** \overload Check also for id_r being in range of _pool->solvables. */ bool validSolvable( SolvableIdType id_r ) const { return id_r < unsigned(_pool->nsolvables) && validSolvable( _pool->solvables[id_r] ); } /** \overload Check also for slv_r being in range of _pool->solvables. */ bool validSolvable( const CSolvable * slv_r ) const { return _pool->solvables <= slv_r && slv_r <= _pool->solvables+_pool->nsolvables && validSolvable( *slv_r ); } public: CPool * getPool() const { return _pool; } /** \todo a quick check whether the repo was meanwhile deleted. */ CRepo * getRepo( RepoIdType id_r ) const { return id_r; } /** Return pointer to the sat-solvable or NULL if it is not valid. * \see \ref validSolvable. */ CSolvable * getSolvable( SolvableIdType id_r ) const { if ( validSolvable( id_r ) ) return &_pool->solvables[id_r]; return 0; } public: /** libsolv capability parser */ sat::detail::IdType parserpmrichdep( const char * capstr_r ) { return ::pool_parserpmrichdep( _pool, capstr_r ); } public: /** Get id of the first valid \ref Solvable. * This is the next valid after the system solvable. */ SolvableIdType getFirstId() const { return getNextId( 1 ); } /** Get id of the next valid \ref Solvable. * This goes round robbin. At the end it returns \ref noSolvableId. * Passing \ref noSolvableId it returns the 1st valid \ref Solvable. * \see \ref validSolvable. */ SolvableIdType getNextId( SolvableIdType id_r ) const { for( ++id_r; id_r < unsigned(_pool->nsolvables); ++id_r ) { if ( validSolvable( _pool->solvables[id_r] ) ) return id_r; } return noSolvableId; } public: /** */ const RepoInfo & repoInfo( RepoIdType id_r ) { return _repoinfos[id_r]; } /** Also adjust repo priority and subpriority accordingly. */ void setRepoInfo( RepoIdType id_r, const RepoInfo & info_r ); /** */ void eraseRepoInfo( RepoIdType id_r ) { _repoinfos.erase( id_r ); } public: /** Returns the id stored at \c offset_r in the internal * whatprovidesdata array. */ const sat::detail::IdType whatProvidesData( unsigned offset_r ) { return _pool->whatprovidesdata[offset_r]; } /** Returns offset into the internal whatprovidesdata array. * Use \ref whatProvidesData to get the stored Id. */ unsigned whatProvides( Capability cap_r ) { prepare(); return ::pool_whatprovides( _pool, cap_r.id() ); } public: /// \name Requested locales. /// The requested LocaleSets managed in _requestedLocalesTracker /// are unexpanded; i.e. they contain just the pure user selection. /// The resolver however uses expanded sets ('de_DE' will also /// include its fallback locales 'de', (en); here in the namespace: /// callback and in the Resolver itself). //@{ /** */ void setTextLocale( const Locale & locale_r ); /** Start tracking changes based on this \a locales_r. * Usually called on TargetInit. */ void initRequestedLocales( const LocaleSet & locales_r ); /** Added since last initRequestedLocales. */ const LocaleSet & getAddedRequestedLocales() const { return _requestedLocalesTracker.added(); } /** Removed since last initRequestedLocales. */ const LocaleSet & getRemovedRequestedLocales() const { return _requestedLocalesTracker.removed(); } /** Current set of requested Locales. */ const LocaleSet & getRequestedLocales() const { return _requestedLocalesTracker.current(); } bool isRequestedLocale( const Locale & locale_r ) const { return _requestedLocalesTracker.contains( locale_r ); } /** User change (tracked). */ void setRequestedLocales( const LocaleSet & locales_r ); /** User change (tracked). */ bool addRequestedLocale( const Locale & locale_r ); /** User change (tracked). */ bool eraseRequestedLocale( const Locale & locale_r ); /** All Locales occurring in any repo. */ const LocaleSet & getAvailableLocales() const; bool isAvailableLocale( const Locale & locale_r ) const { const LocaleSet & avl( getAvailableLocales() ); LocaleSet::const_iterator it( avl.find( locale_r ) ); return it != avl.end(); } typedef base::SetTracker TrackedLocaleIds; /** Expanded _requestedLocalesTracker for solver.*/ const TrackedLocaleIds & trackedLocaleIds() const; //@} public: /** \name Multiversion install. */ //@{ typedef SolvableSet MultiversionList; const MultiversionList & multiversionList() const; bool isMultiversion( const Solvable & solv_r ) const; void multiversionSpecChanged(); //@} public: /** \name Installed on behalf of a user request hint. */ //@{ /** Get ident list of all autoinstalled solvables. */ StringQueue autoInstalled() const { return _autoinstalled; } /** Set ident list of all autoinstalled solvables. */ void setAutoInstalled( const StringQueue & autoInstalled_r ) { _autoinstalled = autoInstalled_r; } bool isOnSystemByUser( IdString ident_r ) const { return !_autoinstalled.contains( ident_r.id() ); } bool isOnSystemByAuto( IdString ident_r ) const { return _autoinstalled.contains( ident_r.id() ); } //@} public: /** \name Solvables which should trigger the reboot-needed hint if installed/updated. */ //@{ /** Set new Solvable specs.*/ void setNeedrebootSpec( sat::SolvableSpec needrebootSpec_r ) { _needrebootSpec = std::move(needrebootSpec_r); _needrebootSpec.setDirty(); } /** Whether \a solv_r matches the spec.*/ bool isNeedreboot( const Solvable & solv_r ) const { return _needrebootSpec.contains( solv_r ); } //@} public: /** \name Blacklisted Solvables. */ //@{ bool isRetracted( const Solvable & solv_r ) const { return _retractedSpec.contains( solv_r ); } bool isPtfMaster( const Solvable & solv_r ) const { return _ptfMasterSpec.contains( solv_r ); } bool isPtfPackage( const Solvable & solv_r ) const { return _ptfPackageSpec.contains( solv_r ); } //@} public: /** accessor for etc/sysconfig/storage reading file on demand */ const std::set & requiredFilesystems() const; private: /** sat-pool. */ CPool * _pool; /** Serial number - changes with each Pool content change. */ SerialNumber _serial; /** Serial number of IDs - changes whenever resusePoolIDs==true - ResPool must also invalidate its PoolItems! */ SerialNumber _serialIDs; /** Watch serial number. */ SerialNumberWatcher _watcher; /** Additional \ref RepoInfo. */ std::map _repoinfos; /** */ base::SetTracker _requestedLocalesTracker; mutable scoped_ptr _trackedLocaleIdsPtr; mutable scoped_ptr _availableLocalesPtr; /** */ void multiversionListInit() const; mutable scoped_ptr _multiversionListPtr; /** */ sat::StringQueue _autoinstalled; /** Solvables which should trigger the reboot-needed hint if installed/updated. */ sat::SolvableSpec _needrebootSpec; /** Blacklisted specs: */ sat::SolvableSpec _retractedSpec; sat::SolvableSpec _ptfMasterSpec; sat::SolvableSpec _ptfPackageSpec; /** filesystems mentioned in /etc/sysconfig/storage */ mutable scoped_ptr > _requiredFilesystemsPtr; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #define POOL_SETDIRTY #endif // ZYPP_SAT_DETAIL_POOLIMPL_H libzypp-17.36.5/zypp/sat/detail/PoolMember.h000066400000000000000000000134441476576476200206710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/sat/detail/PoolMember.h * */ #ifndef ZYPP_SAT_DETAIL_POOLMEMBER_H #define ZYPP_SAT_DETAIL_POOLMEMBER_H #include #include #include #include extern "C" { // Those s_Type names are exposed as sat::detail::CType below! struct s_Dataiterator; struct s_Datamatcher; struct s_Map; struct s_Pool; struct s_Queue; struct s_Repo; struct s_Solvable; struct s_Solver; struct s_Transaction; } /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class IdString; class Capability; class Capabilities; class Repository; class RepoInfo; /////////////////////////////////////////////////////////////////// namespace detail { class RepoIterator; struct ByRepository; } /////////////////////////////////////////////////////////////////// namespace sat { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace detail { using CDataiterator = ::s_Dataiterator; ///< Wrapped libsolv C data type exposed as backdoor using CDatamatcher = ::s_Datamatcher; ///< Wrapped libsolv C data type exposed as backdoor using CMap = ::s_Map; ///< Wrapped libsolv C data type exposed as backdoor using CPool = ::s_Pool; ///< Wrapped libsolv C data type exposed as backdoor using CQueue = ::s_Queue; ///< Wrapped libsolv C data type exposed as backdoor using CRepo = ::s_Repo; ///< Wrapped libsolv C data type exposed as backdoor using CSolvable = ::s_Solvable; ///< Wrapped libsolv C data type exposed as backdoor using CSolver = ::s_Solver; ///< Wrapped libsolv C data type exposed as backdoor using CTransaction = ::s_Transaction; ///< Wrapped libsolv C data type exposed as backdoor } // namespace detail /////////////////////////////////////////////////////////////////// class Pool; class Solvable; /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// class PoolImpl; /////////////////////////////////////////////////////////////////// // // CLASS NAME : PoolMember // /** Backlink to the associated \ref PoolImpl. * Simple as we currently use one global PoolImpl. If we change our * minds this is where we'd store and do the \c Id to \ref PoolImpl * mapping. */ struct PoolMember { static PoolImpl & myPool(); }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// /** Generic Id type. */ using IdType = int; static const IdType noId( 0 ); static const IdType emptyId( 1 ); /** Internal ids satlib includes in dependencies. * MPL check in PoolImpl.cc */ static const IdType solvablePrereqMarker( 15 ); static const IdType solvableFileMarker ( 16 ); static const IdType namespaceModalias ( 18 ); static const IdType namespaceLanguage ( 20 ); static const IdType namespaceFilesystem ( 21 ); /** Test for internal ids satlib includes in dependencies. */ inline bool isDepMarkerId( IdType id_r ) { return( id_r == solvablePrereqMarker || id_r == solvableFileMarker ); } /** Id type to connect \ref Solvable and sat-solvable. * Indext into solvable array. */ using SolvableIdType = unsigned int; using size_type = SolvableIdType; /** Id to denote \ref Solvable::noSolvable. */ static const SolvableIdType noSolvableId( 0 ); /** Id to denote the usually hidden \ref Solvable::systemSolvable. */ static const SolvableIdType systemSolvableId( 1 ); /** Id type to connect \ref Repo and sat-repo. */ using RepoIdType = CRepo *; /** Id to denote \ref Repo::noRepository. */ static const RepoIdType noRepoId( 0 ); ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////// class SolvableIterator; ///////////////////////////////////////////////////////////////// } // namespace detail /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace sat /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_SAT_DETAIL_POOLMEMBER_H libzypp-17.36.5/zypp/solver/000077500000000000000000000000001476576476200157325ustar00rootroot00000000000000libzypp-17.36.5/zypp/solver/Types.h000066400000000000000000000016761476576476200172210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/solver/Types.h * * Common types used in the Resolver public API and need to be passed * down to the details tree. Not for common use. */ #ifndef ZYPP_SOLVER_TYPES_H #define ZYPP_SOLVER_TYPES_H #include #include #include #include #endif // ZYPP_SOLVER_TYPES_H libzypp-17.36.5/zypp/solver/detail/000077500000000000000000000000001476576476200171745ustar00rootroot00000000000000libzypp-17.36.5/zypp/solver/detail/ItemCapKind.h000066400000000000000000000062061476576476200215010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/solver/detail/ItemCapKind.h * */ #ifndef ZYPP_SOLVER_DETAIL_ITEMCAPKIND_H #define ZYPP_SOLVER_DETAIL_ITEMCAPKIND_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace solver { /////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /// \class ItemCapKind /////////////////////////////////////////////////////////////////// struct ItemCapKind { public: ItemCapKind() : _pimpl( new Impl ) {} ItemCapKind( PoolItem i, Capability c, Dep k, bool initial ) : _pimpl( new Impl( i, c, k, initial ) ) {} /** Capability which has triggerd this selection */ Capability cap() const { return _pimpl->_cap; } /** Kind of that capability */ Dep capKind() const { return _pimpl->_capKind; } /** Item which has triggered this selection */ PoolItem item() const { return _pimpl->_item; } /** This item has triggered the installation (Not already fullfilled requierement only). */ bool initialInstallation() const { return _pimpl->_initialInstallation; } private: struct Impl { Impl() : _capKind( Dep::PROVIDES ) , _initialInstallation( false ) {} Impl( PoolItem i, Capability c, Dep k, bool initial ) : _cap( c ) , _capKind( k ) , _item( i ) , _initialInstallation( initial ) {} Capability _cap; Dep _capKind; PoolItem _item; bool _initialInstallation; private: friend Impl * rwcowClone( const Impl * rhs ); /** clone for RWCOW_pointer */ Impl * clone() const { return new Impl( *this ); } }; RWCOW_pointer _pimpl; }; typedef std::multimap ItemCapKindMap; typedef std::list ItemCapKindList; } // namespace detail /////////////////////////////////////////////////////////////////// } // namespace solver /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_ITEMCAPKIND_H libzypp-17.36.5/zypp/solver/detail/ProblemSolutionCombi.cc000066400000000000000000000042161476576476200236150ustar00rootroot00000000000000 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* ProblemSolution.cc * * Easy-to use interface to the ZYPP dependency resolver * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ #define ZYPP_USE_RESOLVER_INTERNALS #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// namespace detail { ProblemSolutionCombi::ProblemSolutionCombi() {} void ProblemSolutionCombi::addSingleAction( Capability capability, TransactionKind action) { addAction( new TransactionSolutionAction( capability, action ) ); } void ProblemSolutionCombi::addSingleAction( const PoolItem& item, TransactionKind action ) { addAction( new TransactionSolutionAction( item, action ) ); } void ProblemSolutionCombi::addSingleAction( SolverQueueItem_Ptr item, TransactionKind action ) { addAction( new TransactionSolutionAction( std::move(item), action ) ); } } // namespace detail ///////////////////////////////////////////////////////////////////// } // namespace solver /////////////////////////////////////////////////////////////////////// } // namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/ProblemSolutionCombi.h000066400000000000000000000065031476576476200234600ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* Resolver_problems.cc * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_PROBLEMSOLUTIONINSTALL_H #define ZYPP_SOLVER_DETAIL_PROBLEMSOLUTIONINSTALL_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else #include #include #include // TransactionKind ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////////////// /// \class ProblemSolutionCombi /// \brief Class representing one possible solution to one problem found during resolving. /// /// This problem solution is a combination of different actions, /// e.G. install, delete, keep different resolvables. ///////////////////////////////////////////////////////////////////////// class ProblemSolutionCombi : public ProblemSolution { public: /** Constructor. */ ProblemSolutionCombi(); /** * Add a single action of an item */ void addSingleAction( const PoolItem& item, TransactionKind action ); /** * Add a single action of a capability */ void addSingleAction( Capability capability, TransactionKind action ); /** * Add a single action of a SolverQueueItem */ void addSingleAction( SolverQueueItem_Ptr item, TransactionKind action ); /** * returns the number of actions */ size_t actionCount() { return actions().size(); } /** * Set description text (append) */ void addDescription( std::string description ) { pushDescriptionDetail( std::move(description) ); } /** * Set description text (prepend) */ void addFrontDescription( std::string description ) { pushDescriptionDetail( std::move(description), /*front*/true ); } }; } // namespace detail ///////////////////////////////////////////////////////////////////// } // namespace solver /////////////////////////////////////////////////////////////////////// } // namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_PROBLEMSOLUTIONAINSTALL_H libzypp-17.36.5/zypp/solver/detail/ProblemSolutionIgnore.cc000066400000000000000000000044271476576476200240130ustar00rootroot00000000000000 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* ProblemSolution.cc * * Easy-to use interface to the ZYPP dependency resolver * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// namespace detail { ProblemSolutionIgnore::ProblemSolutionIgnore( const PoolItem& item ) // TranslatorExplanation %s = name of package, patch, selection ... : ProblemSolution( str::form(_("break %s by ignoring some of its dependencies"), item.satSolvable().asString().c_str() ) ) { addAction( new InjectSolutionAction( item, WEAK ) ); } ProblemSolutionIgnore::ProblemSolutionIgnore( const PoolItemList& itemList ) : ProblemSolution( _("generally ignore of some dependencies") ) { for ( const auto & item : itemList) { addAction( new InjectSolutionAction( item, WEAK ) ); } } } // namespace detail ///////////////////////////////////////////////////////////////////// } // namespace solver /////////////////////////////////////////////////////////////////////// } // namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/ProblemSolutionIgnore.h000066400000000000000000000046401476576476200236520ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* Resolver_problems.cc * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_PROBLEMSOLUTIONIGNORE_H #define ZYPP_SOLVER_DETAIL_PROBLEMSOLUTIONIGNORE_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// namespace detail { ///////////////////////////////////////////////////////////////////////// /// \class ProblemSolutionIgnore /// \brief Class representing one possible solution to one problem found during resolving. /// /// This problem solution ignores one or more items by setting their /// dependencies to weak ///////////////////////////////////////////////////////////////////////// class ProblemSolutionIgnore : public ProblemSolution { public: typedef std::list PoolItemList; ProblemSolutionIgnore( const PoolItem& item ); ProblemSolutionIgnore( const PoolItemList& itemList ); }; } // namespace detail ///////////////////////////////////////////////////////////////////// } // namespace solver /////////////////////////////////////////////////////////////////////// } // namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_PROBLEMSOLUTIONIGNORE_H libzypp-17.36.5/zypp/solver/detail/Resolver.cc000066400000000000000000000651631476576476200213170ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* Resolver.cc * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * 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 #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include #include #include #include #include #include #define MAXSOLVERRUNS 5 using std::endl; using std::make_pair; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver" ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- std::ostream & Resolver::dumpOn( std::ostream & os ) const { os << "" << endl; #define OUTS(t) os << " " << #t << ":\t" << t << endl; OUTS( _upgradeMode ); OUTS( _updateMode ); OUTS( _verifying ); OUTS( _solveSrcPackages ); OUTS( _ignoreAlreadyRecommended ); #undef OUT return os << ""; } //--------------------------------------------------------------------------- Resolver::Resolver (ResPool pool) : _pool(std::move(pool)) , _satResolver(NULL) , _poolchanged(_pool.serial() ) , _upgradeMode ( false ) , _updateMode ( false ) , _verifying ( false ) , _solveSrcPackages ( false ) , _ignoreAlreadyRecommended ( true ) , _applyDefault_focus ( true ) , _applyDefault_forceResolve ( true ) , _applyDefault_cleandepsOnRemove ( true ) , _applyDefault_onlyRequires ( true ) , _applyDefault_allowDowngrade ( true ) , _applyDefault_allowNameChange ( true ) , _applyDefault_allowArchChange ( true ) , _applyDefault_allowVendorChange ( true ) , _applyDefault_dupAllowDowngrade ( true ) , _applyDefault_dupAllowNameChange ( true ) , _applyDefault_dupAllowArchChange ( true ) , _applyDefault_dupAllowVendorChange ( true ) { sat::Pool satPool( sat::Pool::instance() ); _satResolver = new SATResolver(_pool, satPool.get()); } Resolver::~Resolver() { delete _satResolver; } sat::detail::CSolver * Resolver::get() const { return _satResolver->get(); } void Resolver::setDefaultSolverFlags( bool all_r ) { MIL << "setDefaultSolverFlags all=" << all_r << endl; if ( all_r || _applyDefault_focus ) setFocus( ResolverFocus::Default ); #define ZOLV_FLAG_DEFAULT( ZSETTER, ZGETTER ) \ if ( all_r || _applyDefault_##ZGETTER ) ZSETTER( indeterminate ) ZOLV_FLAG_DEFAULT( setForceResolve ,forceResolve ); ZOLV_FLAG_DEFAULT( setCleandepsOnRemove ,cleandepsOnRemove ); ZOLV_FLAG_DEFAULT( setOnlyRequires ,onlyRequires ); ZOLV_FLAG_DEFAULT( setAllowDowngrade ,allowDowngrade ); ZOLV_FLAG_DEFAULT( setAllowNameChange ,allowNameChange ); ZOLV_FLAG_DEFAULT( setAllowArchChange ,allowArchChange ); ZOLV_FLAG_DEFAULT( setAllowVendorChange ,allowVendorChange ); ZOLV_FLAG_DEFAULT( dupSetAllowDowngrade ,dupAllowDowngrade ); ZOLV_FLAG_DEFAULT( dupSetAllowNameChange ,dupAllowNameChange ); ZOLV_FLAG_DEFAULT( dupSetAllowArchChange ,dupAllowArchChange ); ZOLV_FLAG_DEFAULT( dupSetAllowVendorChange ,dupAllowVendorChange ); #undef ZOLV_FLAG_TRIBOOL } //--------------------------------------------------------------------------- // forward flags too SATResolver void Resolver::setFocus( ResolverFocus focus_r ) { _applyDefault_focus = ( focus_r == ResolverFocus::Default ); _satResolver->_focus = _applyDefault_focus ? ZConfig::instance().solver_focus() : focus_r; } ResolverFocus Resolver::focus() const { return _satResolver->_focus; } void Resolver::setRemoveOrphaned( bool yesno_r ) { _satResolver->_removeOrphaned = yesno_r; } bool Resolver::removeOrphaned() const { return _satResolver->_removeOrphaned; } void Resolver::setRemoveUnneeded( bool yesno_r ) { _satResolver->_removeUnneeded = yesno_r; } bool Resolver::removeUnneeded() const { return _satResolver->_removeUnneeded; } #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARDEFAULT, ZVARNAME ) \ void Resolver::ZSETTER( TriBool state_r ) \ { _applyDefault_##ZGETTER = indeterminate(state_r); \ bool newval = _applyDefault_##ZGETTER ? ZVARDEFAULT : bool(state_r); \ if ( ZVARNAME != newval ) { \ DBG << #ZGETTER << ": changed from " << (bool)ZVARNAME << " to " << newval << endl;\ ZVARNAME = newval; \ } \ } \ bool Resolver::ZGETTER() const \ { return ZVARNAME; } \ // Flags stored here follow the naming convention,... // Flags down in _satResolver don't. Could match `_satResolver->_##ZGETTER` #define ZOLV_FLAG_SATSOLV( ZSETTER, ZGETTER, ZVARDEFAULT, ZVARNAME ) \ ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARDEFAULT, _satResolver->ZVARNAME ) // NOTE: ZVARDEFAULT must be in sync with SATResolver ctor ZOLV_FLAG_SATSOLV( setForceResolve ,forceResolve ,false ,_allowuninstall ) ZOLV_FLAG_SATSOLV( setCleandepsOnRemove ,cleandepsOnRemove ,ZConfig::instance().solver_cleandepsOnRemove() ,_cleandepsOnRemove ) ZOLV_FLAG_SATSOLV( setOnlyRequires ,onlyRequires ,ZConfig::instance().solver_onlyRequires() ,_onlyRequires ) ZOLV_FLAG_SATSOLV( setAllowDowngrade ,allowDowngrade ,false ,_allowdowngrade ) ZOLV_FLAG_SATSOLV( setAllowNameChange ,allowNameChange ,true /*bsc#1071466*/ ,_allownamechange ) ZOLV_FLAG_SATSOLV( setAllowArchChange ,allowArchChange ,false ,_allowarchchange ) ZOLV_FLAG_SATSOLV( setAllowVendorChange ,allowVendorChange ,ZConfig::instance().solver_allowVendorChange() ,_allowvendorchange ) ZOLV_FLAG_SATSOLV( dupSetAllowDowngrade ,dupAllowDowngrade ,ZConfig::instance().solver_dupAllowDowngrade() ,_dup_allowdowngrade ) ZOLV_FLAG_SATSOLV( dupSetAllowNameChange ,dupAllowNameChange ,ZConfig::instance().solver_dupAllowNameChange() ,_dup_allownamechange ) ZOLV_FLAG_SATSOLV( dupSetAllowArchChange ,dupAllowArchChange ,ZConfig::instance().solver_dupAllowArchChange() ,_dup_allowarchchange ) ZOLV_FLAG_SATSOLV( dupSetAllowVendorChange ,dupAllowVendorChange ,ZConfig::instance().solver_dupAllowVendorChange() ,_dup_allowvendorchange ) #undef ZOLV_FLAG_SATSOLV #undef ZOLV_FLAG_TRIBOOL //--------------------------------------------------------------------------- ResPool Resolver::pool() const { return _pool; } void Resolver::reset( bool keepExtras ) { _verifying = false; if (!keepExtras) { _extra_requires.clear(); _extra_conflicts.clear(); } _isInstalledBy.clear(); _installs.clear(); _satifiedByInstalled.clear(); _installedSatisfied.clear(); } PoolItemList Resolver::problematicUpdateItems() const { return _satResolver->problematicUpdateItems(); } void Resolver::addExtraRequire( const Capability & capability ) { _extra_requires.insert (capability); } void Resolver::removeExtraRequire( const Capability & capability ) { _extra_requires.erase (capability); } void Resolver::addExtraConflict( const Capability & capability ) { _extra_conflicts.insert (capability); } void Resolver::removeExtraConflict( const Capability & capability ) { _extra_conflicts.erase (capability); } void Resolver::removeQueueItem( const SolverQueueItem_Ptr& item ) { bool found = false; for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin(); iter != _added_queue_items.end(); iter++) { if (*iter == item) { _added_queue_items.remove(*iter); found = true; break; } } if (!found) { _removed_queue_items.push_back (item); _removed_queue_items.unique (); } } void Resolver::addQueueItem( const SolverQueueItem_Ptr& item ) { bool found = false; for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin(); iter != _removed_queue_items.end(); iter++) { if (*iter == item) { _removed_queue_items.remove(*iter); found = true; break; } } if (!found) { _added_queue_items.push_back (item); _added_queue_items.unique (); } } void Resolver::addWeak( const PoolItem & item ) { _addWeak.push_back( item ); } //--------------------------------------------------------------------------- struct UndoTransact { ResStatus::TransactByValue resStatus; UndoTransact ( const ResStatus::TransactByValue &status) :resStatus(status) { } bool operator()( const PoolItem& item ) // only transacts() items go here { item.status().resetTransact( resStatus );// clear any solver/establish transactions return true; } }; struct DoTransact { ResStatus::TransactByValue resStatus; DoTransact ( const ResStatus::TransactByValue &status) :resStatus(status) { } bool operator()( const PoolItem& item ) // only transacts() items go here { item.status().setTransact( true, resStatus ); return true; } }; //---------------------------------------------------------------------------- // undo void Resolver::undo() { UndoTransact info(ResStatus::APPL_LOW); MIL << "*** undo ***" << endl; invokeOnEach ( _pool.begin(), _pool.end(), resfilter::ByTransact( ), // collect transacts from Pool to resolver queue std::ref(info) ); // Regard dependencies of the item weak onl _addWeak.clear(); // Additional QueueItems which has to be regarded by the solver _removed_queue_items.clear(); _added_queue_items.clear(); return; } void Resolver::solverInit() { // Solving with libsolv static bool poolDumped = false; MIL << "-------------- Calling SAT Solver -------------------" << endl; if ( getenv("ZYPP_FULLLOG") and get() ) { // libzypp/issues/317: get() to make sure a satsolver instance is actually present Testcase testcase("/var/log/YaST2/autoTestcase"); if (!poolDumped) { testcase.createTestcase (*this, true, false); // dump pool poolDumped = true; } else { testcase.createTestcase (*this, false, false); // write control file only } } // update solver mode flags _satResolver->setDistupgrade (_upgradeMode); _satResolver->setUpdatesystem (_updateMode); _satResolver->setFixsystem ( isVerifyingMode() ); _satResolver->setSolveSrcPackages ( solveSrcPackages() ); _satResolver->setIgnorealreadyrecommended ( ignoreAlreadyRecommended() ); if (_upgradeMode) { // Maybe depend on ZConfig::solverUpgradeRemoveDroppedPackages. // For sure right but a change in behavior for old distros. // (Will disable weakremover processing in SATResolver) // _satResolver->setRemoveOrphaned( ... ); } // Resetting additional solver information _isInstalledBy.clear(); _installs.clear(); _satifiedByInstalled.clear(); _installedSatisfied.clear(); } bool Resolver::verifySystem() { DBG << "Resolver::verifySystem()" << endl; _verifying = true; UndoTransact resetting (ResStatus::APPL_HIGH); invokeOnEach ( _pool.begin(), _pool.end(), resfilter::ByTransact( ), // Resetting all transcations std::ref(resetting) ); return resolvePool(); } bool Resolver::doUpgrade() { // Setting Resolver to upgrade mode. SAT solver will do the update _upgradeMode = true; return resolvePool(); } bool Resolver::resolvePool() { solverInit(); return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos ); } void Resolver::doUpdate() { _updateMode = true; solverInit(); return _satResolver->doUpdate(); } bool Resolver::resolveQueue( solver::detail::SolverQueueItemList & queue ) { solverInit(); // add/remove additional SolverQueueItems for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin(); iter != _removed_queue_items.end(); iter++) { for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) { if ( (*iterQueue)->cmp(*iter) == 0) { MIL << "remove from queue" << *iter; queue.remove(*iterQueue); break; } } } for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin(); iter != _added_queue_items.end(); iter++) { bool found = false; for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) { if ( (*iterQueue)->cmp(*iter) == 0) { found = true; break; } } if (!found) { MIL << "add to queue" << *iter; queue.push_back(*iter); } } // The application has to take care to write these solutions back to e.g. selectables in order // give the user a chance for changing these decisions again. _removed_queue_items.clear(); _added_queue_items.clear(); return _satResolver->resolveQueue(queue, _addWeak); } sat::Transaction Resolver::getTransaction() { // FIXME: That's an ugly way of pushing autoInstalled into the transaction. sat::Transaction ret( sat::Transaction::loadFromPool ); ret.autoInstalled( _satResolver->autoInstalled() ); return ret; } //---------------------------------------------------------------------------- // Getting more information about the solve results ResolverProblemList Resolver::problems() const { MIL << "Resolver::problems()" << endl; return _satResolver->problems(); } void Resolver::applySolutions( const ProblemSolutionList & solutions ) { for ( const ProblemSolution_Ptr& solution : solutions ) { if ( ! applySolution( *solution ) ) break; } } bool Resolver::applySolution( const ProblemSolution & solution ) { bool ret = true; DBG << "apply solution " << solution << endl; for ( const SolutionAction_Ptr& action : solution.actions() ) { if ( ! action->execute( *this ) ) { WAR << "apply solution action failed: " << action << endl; ret = false; break; } } return ret; } //---------------------------------------------------------------------------- void Resolver::collectResolverInfo() { if ( _satResolver && _isInstalledBy.empty() && _installs.empty()) { // generating new PoolItemList itemsToInstall = _satResolver->resultItemsToInstall(); for (PoolItemList::const_iterator instIter = itemsToInstall.begin(); instIter != itemsToInstall.end(); instIter++) { // Requires for (Capabilities::const_iterator capIt = (*instIter)->dep (Dep::REQUIRES).begin(); capIt != (*instIter)->dep (Dep::REQUIRES).end(); ++capIt) { sat::WhatProvides possibleProviders(*capIt); for_( iter, possibleProviders.begin(), possibleProviders.end() ) { PoolItem provider = ResPool::instance().find( *iter ); // searching if this provider will already be installed bool found = false; bool alreadySetForInstallation = false; ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider); while (pos != _isInstalledBy.end() && pos->first == provider && !found) { alreadySetForInstallation = true; ItemCapKind capKind = pos->second; if (capKind.item() == *instIter) found = true; pos++; } if (!found && provider.status().isToBeInstalled()) { if (provider.status().isBySolver()) { ItemCapKind capKindisInstalledBy( *instIter, *capIt, Dep::REQUIRES, !alreadySetForInstallation ); _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy)); } else { // no initial installation cause it has been set be e.g. user ItemCapKind capKindisInstalledBy( *instIter, *capIt, Dep::REQUIRES, false ); _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy)); } ItemCapKind capKindisInstalledBy( provider, *capIt, Dep::REQUIRES, !alreadySetForInstallation ); _installs.insert (make_pair( *instIter, capKindisInstalledBy)); } if (provider.status().staysInstalled()) { // Is already satisfied by an item which is installed ItemCapKind capKindisInstalledBy( provider, *capIt, Dep::REQUIRES, false ); _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy)); ItemCapKind installedSatisfied( *instIter, *capIt, Dep::REQUIRES, false ); _installedSatisfied.insert (make_pair( provider, installedSatisfied)); } } } if (!(_satResolver->onlyRequires())) { //Recommends for (Capabilities::const_iterator capIt = (*instIter)->dep (Dep::RECOMMENDS).begin(); capIt != (*instIter)->dep (Dep::RECOMMENDS).end(); ++capIt) { sat::WhatProvides possibleProviders(*capIt); for_( iter, possibleProviders.begin(), possibleProviders.end() ) { PoolItem provider = ResPool::instance().find( *iter ); // searching if this provider will already be installed bool found = false; bool alreadySetForInstallation = false; ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider); while (pos != _isInstalledBy.end() && pos->first == provider && !found) { alreadySetForInstallation = true; ItemCapKind capKind = pos->second; if (capKind.item() == *instIter) found = true; pos++; } if (!found && provider.status().isToBeInstalled()) { if (provider.status().isBySolver()) { ItemCapKind capKindisInstalledBy( *instIter, *capIt, Dep::RECOMMENDS, !alreadySetForInstallation ); _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy)); } else { // no initial installation cause it has been set be e.g. user ItemCapKind capKindisInstalledBy( *instIter, *capIt, Dep::RECOMMENDS, false ); _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy)); } ItemCapKind capKindisInstalledBy( provider, *capIt, Dep::RECOMMENDS, !alreadySetForInstallation ); _installs.insert (make_pair( *instIter, capKindisInstalledBy)); } if (provider.status().staysInstalled()) { // Is already satisfied by an item which is installed ItemCapKind capKindisInstalledBy( provider, *capIt, Dep::RECOMMENDS, false ); _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy)); ItemCapKind installedSatisfied( *instIter, *capIt, Dep::RECOMMENDS, false ); _installedSatisfied.insert (make_pair( provider, installedSatisfied)); } } } //Supplements for (Capabilities::const_iterator capIt = (*instIter)->dep (Dep::SUPPLEMENTS).begin(); capIt != (*instIter)->dep (Dep::SUPPLEMENTS).end(); ++capIt) { sat::WhatProvides possibleProviders(*capIt); for_( iter, possibleProviders.begin(), possibleProviders.end() ) { PoolItem provider = ResPool::instance().find( *iter ); // searching if this item will already be installed bool found = false; bool alreadySetForInstallation = false; ItemCapKindMap::const_iterator pos = _isInstalledBy.find(*instIter); while (pos != _isInstalledBy.end() && pos->first == *instIter && !found) { alreadySetForInstallation = true; ItemCapKind capKind = pos->second; if (capKind.item() == provider) found = true; pos++; } if (!found && instIter->status().isToBeInstalled()) { if (instIter->status().isBySolver()) { ItemCapKind capKindisInstalledBy( provider, *capIt, Dep::SUPPLEMENTS, !alreadySetForInstallation ); _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy)); } else { // no initial installation cause it has been set be e.g. user ItemCapKind capKindisInstalledBy( provider, *capIt, Dep::SUPPLEMENTS, false ); _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy)); } ItemCapKind capKindisInstalledBy( *instIter, *capIt, Dep::SUPPLEMENTS, !alreadySetForInstallation ); _installs.insert (make_pair( provider, capKindisInstalledBy)); } if (instIter->status().staysInstalled()) { // Is already satisfied by an item which is installed ItemCapKind capKindisInstalledBy( *instIter, *capIt, Dep::SUPPLEMENTS, !alreadySetForInstallation ); _satifiedByInstalled.insert (make_pair( provider, capKindisInstalledBy)); ItemCapKind installedSatisfied( provider, *capIt, Dep::SUPPLEMENTS, false ); _installedSatisfied.insert (make_pair( *instIter, installedSatisfied)); } } } } } } } ItemCapKindList Resolver::isInstalledBy( const PoolItem & item ) { ItemCapKindList ret; collectResolverInfo(); for (ItemCapKindMap::const_iterator iter = _isInstalledBy.find(item); iter != _isInstalledBy.end();) { ItemCapKind info = iter->second; PoolItem iterItem = iter->first; if (iterItem == item) { ret.push_back(info); iter++; } else { // exit iter = _isInstalledBy.end(); } } return ret; } ItemCapKindList Resolver::installs( const PoolItem & item ) { ItemCapKindList ret; collectResolverInfo(); for (ItemCapKindMap::const_iterator iter = _installs.find(item); iter != _installs.end();) { ItemCapKind info = iter->second; PoolItem iterItem = iter->first; if (iterItem == item) { ret.push_back(info); iter++; } else { // exit iter = _installs.end(); } } return ret; } ItemCapKindList Resolver::satifiedByInstalled( const PoolItem & item ) { ItemCapKindList ret; collectResolverInfo(); for (ItemCapKindMap::const_iterator iter = _satifiedByInstalled.find(item); iter != _satifiedByInstalled.end();) { ItemCapKind info = iter->second; PoolItem iterItem = iter->first; if (iterItem == item) { ret.push_back(info); iter++; } else { // exit iter = _satifiedByInstalled.end(); } } return ret; } ItemCapKindList Resolver::installedSatisfied( const PoolItem & item ) { ItemCapKindList ret; collectResolverInfo(); for (ItemCapKindMap::const_iterator iter = _installedSatisfied.find(item); iter != _installedSatisfied.end();) { ItemCapKind info = iter->second; PoolItem iterItem = iter->first; if (iterItem == item) { ret.push_back(info); iter++; } else { // exit iter = _installedSatisfied.end(); } } return ret; } /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/Resolver.h000066400000000000000000000236541476576476200211600ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* Resolver.h * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_RESOLVER_H #define ZYPP_SOLVER_DETAIL_RESOLVER_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else #include #include #include #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { namespace sat { class Transaction; } /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// namespace detail { class SATResolver; typedef std::list PoolItemList; typedef std::set PoolItemSet; /////////////////////////////////////////////////////////////////// // // CLASS NAME : Resolver /** A mid layer class we should remove * \todo Merge this and class SATResolver. Logic and date are horribly * distributed between this and SATResolver. Either SATResolver becomes * a pure wrapper adapting the libsolv C interface to fit our needs, and * all the solver logic and problem handling goes here; or completely merge * both classes. */ class ZYPP_API_DEPTESTOMATIC Resolver : private base::NonCopyable { typedef std::multimap ItemCapKindMap; private: ResPool _pool; SATResolver *_satResolver; SerialNumberWatcher _poolchanged; CapabilitySet _extra_requires; CapabilitySet _extra_conflicts; std::set _upgradeRepos; // Regard dependencies of the item weak onl PoolItemList _addWeak; /** \name Solver flags */ //@{ bool _upgradeMode:1; // Resolver has been called with doUpgrade bool _updateMode:1; // Resolver has been called with doUpdate bool _verifying:1; // The system will be checked bool _solveSrcPackages:1; // whether to generate solver jobs for selected source packges. bool _ignoreAlreadyRecommended:1; // ignore recommended packages that have already been recommended by the installed packages //@} /** \name applyDefaults * Remember whether global default or explicit settings are applied to SATResolver. * Global defaults may change with the Target, explicit settings not. */ //@{ bool _applyDefault_focus:1; bool _applyDefault_forceResolve:1; bool _applyDefault_cleandepsOnRemove:1; bool _applyDefault_onlyRequires:1; bool _applyDefault_allowDowngrade:1; bool _applyDefault_allowNameChange:1; bool _applyDefault_allowArchChange:1; bool _applyDefault_allowVendorChange:1; bool _applyDefault_dupAllowDowngrade:1; bool _applyDefault_dupAllowNameChange:1; bool _applyDefault_dupAllowArchChange:1; bool _applyDefault_dupAllowVendorChange:1; //@} // Additional QueueItems which has to be regarded by the solver // This will be used e.g. by solution actions solver::detail::SolverQueueItemList _removed_queue_items; solver::detail::SolverQueueItemList _added_queue_items; // Additional information about the solverrun ItemCapKindMap _isInstalledBy; ItemCapKindMap _installs; ItemCapKindMap _satifiedByInstalled; ItemCapKindMap _installedSatisfied; // helpers void collectResolverInfo(); // Unmaintained packages which does not fit to the updated system // (broken dependencies) will be deleted. // returns true if solving was successful bool checkUnmaintainedItems (); void solverInit(); public: Resolver( ResPool pool ); virtual ~Resolver(); // ---------------------------------- I/O std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<( std::ostream& str, const Resolver & obj ) { return obj.dumpOn (str); } // ---------------------------------- methods ResPool pool() const; void setPool( const ResPool & pool ) { _pool = pool; } /** * Reset all solver flags to the systems default (e.g. from zypp.conf). * * The information whether a \ref SATResolver setting was explicitly set or follows * the targets default (zypp.conf) is stored here in the \ref Resolver. * If \a all_r is \c false, only those settings are updated, which still follow * the target defaults (e.g. after the target has changed). Otherwise all explicit * settings are discarded and the defaults are applied. */ void setDefaultSolverFlags( bool all_r ); void addUpgradeRepo( Repository repo_r ) { if ( repo_r && ! repo_r.isSystemRepo() ) _upgradeRepos.insert( repo_r ); } bool upgradingRepo( Repository repo_r ) const { return( _upgradeRepos.find( repo_r ) != _upgradeRepos.end() ); } void removeUpgradeRepo( Repository repo_r ) { _upgradeRepos.erase( repo_r ); } void removeUpgradeRepos() { _upgradeRepos.clear(); } const std::set & upgradeRepos() const { return _upgradeRepos; } void addExtraRequire( const Capability & capability ); void removeExtraRequire( const Capability & capability ); void addExtraConflict( const Capability & capability ); void removeExtraConflict( const Capability & capability ); void removeQueueItem( const SolverQueueItem_Ptr& item ); void addQueueItem( const SolverQueueItem_Ptr& item ); CapabilitySet extraRequires() const { return _extra_requires; } CapabilitySet extraConflicts() const { return _extra_conflicts; } void addWeak( const PoolItem & item ); bool verifySystem(); bool resolvePool(); bool resolveQueue( SolverQueueItemList & queue ); void doUpdate(); bool doUpgrade(); PoolItemList problematicUpdateItems() const; /** \name Solver flags */ //@{ bool ignoreAlreadyRecommended() const { return _ignoreAlreadyRecommended; } void setIgnoreAlreadyRecommended( bool yesno_r ) { _ignoreAlreadyRecommended = yesno_r; } bool isUpgradeMode() const { return _upgradeMode; }// Resolver has been called with doUpgrade void setUpgradeMode( bool yesno_r ) { _upgradeMode = yesno_r; } bool isUpdateMode() const { return _updateMode; } // Resolver has been called with doUpdate void setUpdateMode( bool yesno_r ) { _updateMode = yesno_r; } bool isVerifyingMode() const { return _verifying; } // The system will be checked void setVerifyingMode( TriBool state_r ) { _verifying = indeterminate(state_r) ? false : bool(state_r); } bool solveSrcPackages() const { return _solveSrcPackages; } void setSolveSrcPackages( TriBool state_r ) { _solveSrcPackages = indeterminate(state_r) ? false : bool(state_r); } //@} void setRemoveOrphaned( bool yesno_r ); bool removeOrphaned() const; void setRemoveUnneeded( bool yesno_r ); bool removeUnneeded() const; void setFocus( ResolverFocus focus_r ); ResolverFocus focus() const; #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER ) \ void ZSETTER( TriBool state_r ); \ bool ZGETTER() const; \ ZOLV_FLAG_TRIBOOL( setForceResolve ,forceResolve ) ZOLV_FLAG_TRIBOOL( setCleandepsOnRemove ,cleandepsOnRemove ) ZOLV_FLAG_TRIBOOL( setOnlyRequires ,onlyRequires ) ZOLV_FLAG_TRIBOOL( setAllowDowngrade ,allowDowngrade ) ZOLV_FLAG_TRIBOOL( setAllowNameChange ,allowNameChange ) ZOLV_FLAG_TRIBOOL( setAllowArchChange ,allowArchChange ) ZOLV_FLAG_TRIBOOL( setAllowVendorChange ,allowVendorChange ) ZOLV_FLAG_TRIBOOL( dupSetAllowDowngrade ,dupAllowDowngrade ) ZOLV_FLAG_TRIBOOL( dupSetAllowNameChange ,dupAllowNameChange ) ZOLV_FLAG_TRIBOOL( dupSetAllowArchChange ,dupAllowArchChange ) ZOLV_FLAG_TRIBOOL( dupSetAllowVendorChange ,dupAllowVendorChange ) #undef ZOLV_FLAG_TRIBOOL ResolverProblemList problems() const; void applySolutions( const ProblemSolutionList & solutions ); bool applySolution( const ProblemSolution & solution ); // Return the Transaction computed by the last solver run. sat::Transaction getTransaction(); // reset all SOLVER transaction in pool void undo(); void reset( bool keepExtras = false ); // Get more information about the solverrun // Which item will be installed by another item or triggers an item for // installation ItemCapKindList isInstalledBy( const PoolItem & item ); ItemCapKindList installs( const PoolItem & item ); ItemCapKindList satifiedByInstalled (const PoolItem & item ); ItemCapKindList installedSatisfied( const PoolItem & item ); public: /** Expert backdoor. */ sat::detail::CSolver * get() const; }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_RESOLVER_H libzypp-17.36.5/zypp/solver/detail/SATResolver.cc000066400000000000000000002224621476576476200216640ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SATResolver.cc * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ extern "C" { #include #include #include #include #include #include #include } #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; #define XDEBUG(x) do { if (base::logger::isExcessive()) XXX << x << std::endl;} while (0) #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver" ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace { inline void solverSetFocus( sat::detail::CSolver & satSolver_r, const ResolverFocus & focus_r ) { switch ( focus_r ) { case ResolverFocus::Default: // fallthrough to Job case ResolverFocus::Job: solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 0 ); solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 0 ); break; case ResolverFocus::Installed: solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 1 ); solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 0 ); break; case ResolverFocus::Update: solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 0 ); solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 1 ); break; } } /** Helper collecting pseudo installed items from the pool. * \todo: pseudoItems are cachable as long as pool content does not change */ inline sat::Queue collectPseudoInstalled( const ResPool & pool_r ) { sat::Queue ret; for ( const PoolItem & pi : pool_r ) if ( traits::isPseudoInstalled( pi.kind() ) ) ret.push( pi.id() ); return ret; } /** Copy back new \ref WeakValue to \ref PoolItem after solving. * On the fly collect orphaned items (cached by the solver for the UI) */ inline void solverCopyBackWeak( sat::detail::CSolver & satSolver_r, PoolItemList & orphanedItems_r ) { // NOTE: assert all items weak stati are reset (resetWeak was called) { sat::Queue recommendations; sat::Queue suggestions; ::solver_get_recommendations( &satSolver_r, recommendations, suggestions, 0 ); for ( sat::Queue::size_type i = 0; i < recommendations.size(); ++i ) PoolItem(sat::Solvable(recommendations[i])).status().setRecommended( true ); for ( sat::Queue::size_type i = 0; i < suggestions.size(); ++i ) PoolItem(sat::Solvable(suggestions[i])).status().setSuggested( true ); } { orphanedItems_r.clear(); // cached on the fly sat::Queue orphaned; ::solver_get_orphaned( &satSolver_r, orphaned ); for ( sat::Queue::size_type i = 0; i < orphaned.size(); ++i ) { PoolItem pi { sat::Solvable(orphaned[i]) }; pi.status().setOrphaned( true ); orphanedItems_r.push_back( pi ); } } { sat::Queue unneeded; ::solver_get_unneeded( &satSolver_r, unneeded, 1 ); for ( sat::Queue::size_type i = 0; i < unneeded.size(); ++i ) PoolItem(sat::Solvable(unneeded[i])).status().setUnneeded( true ); } } /** Copy back new \ref ValidateValue to \ref PoolItem after solving. */ inline void solverCopyBackValidate( sat::detail::CSolver & satSolver_r, const ResPool & pool_r ) { sat::Queue pseudoItems { collectPseudoInstalled( pool_r ) }; if ( ! pseudoItems.empty() ) { sat::Queue pseudoFlags; ::solver_trivial_installable( &satSolver_r, pseudoItems, pseudoFlags ); for ( sat::Queue::size_type i = 0; i < pseudoItems.size(); ++i ) { PoolItem pi { sat::Solvable(pseudoItems[i]) }; switch ( pseudoFlags[i] ) { case 0: pi.status().setBroken(); break; case 1: pi.status().setSatisfied(); break; case -1: pi.status().setNonRelevant(); break; default: pi.status().setUndetermined(); break; } } } } } //namespace /////////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SATResolver); #define MAYBE_CLEANDEPS (cleandepsOnRemove()?SOLVER_CLEANDEPS:0) //--------------------------------------------------------------------------- // Callbacks for SAT policies //--------------------------------------------------------------------------- int vendorCheck( sat::detail::CPool *pool, Solvable *solvable1, Solvable *solvable2 ) { return VendorAttr::instance().equivalent( IdString(solvable1->vendor), IdString(solvable2->vendor) ) ? 0 : 1; } int relaxedVendorCheck( sat::detail::CPool *pool, Solvable *solvable1, Solvable *solvable2 ) { return VendorAttr::instance().relaxedEquivalent( IdString(solvable1->vendor), IdString(solvable2->vendor) ) ? 0 : 1; } /** ResPool helper to compute the initial status of Patches etc. * An empty solver run (no jobs) just to compute the initial status * of pseudo installed items (patches). */ void establish( sat::Queue & pseudoItems_r, sat::Queue & pseudoFlags_r ) { pseudoItems_r = collectPseudoInstalled( ResPool::instance() ); if ( ! pseudoItems_r.empty() ) { auto satPool = sat::Pool::instance(); MIL << "Establish..." << endl; sat::detail::CPool * cPool { satPool.get() }; ::pool_set_custom_vendorcheck( cPool, &vendorCheck ); sat::Queue jobQueue; // Add rules for parallel installable resolvables with different versions for ( const sat::Solvable & solv : satPool.multiversion() ) { jobQueue.push( SOLVER_NOOBSOLETES | SOLVER_SOLVABLE ); jobQueue.push( solv.id() ); } AutoDispose cSolver { ::solver_create( cPool ), ::solver_free }; satPool.prepare(); if ( ::solver_solve( cSolver, jobQueue ) != 0 ) INT << "How can establish fail?" << endl; ::solver_trivial_installable( cSolver, pseudoItems_r, pseudoFlags_r ); for ( sat::Queue::size_type i = 0; i < pseudoItems_r.size(); ++i ) { PoolItem pi { sat::Solvable(pseudoItems_r[i]) }; switch ( pseudoFlags_r[i] ) { case 0: pi.status().setBroken(); break; case 1: pi.status().setSatisfied(); break; case -1: pi.status().setNonRelevant(); break; default: pi.status().setUndetermined(); break; } } MIL << "Establish DONE" << endl; } else MIL << "Establish not needed." << endl; } inline std::string itemToString( const PoolItem & item ) { if ( !item ) return std::string(); sat::Solvable slv( item.satSolvable() ); std::string ret( slv.asString() ); // n-v-r.a if ( ! slv.isSystem() ) { ret += "["; ret += slv.repository().alias(); ret += "]"; } return ret; } //--------------------------------------------------------------------------- std::ostream & SATResolver::dumpOn( std::ostream & os ) const { os << "" << endl; if (_satSolver) { #define OUTS(X) os << " " << #X << "\t= " << solver_get_flag(_satSolver, SOLVER_FLAG_##X) << endl OUTS( ALLOW_DOWNGRADE ); OUTS( ALLOW_ARCHCHANGE ); OUTS( ALLOW_VENDORCHANGE ); OUTS( ALLOW_NAMECHANGE ); OUTS( ALLOW_UNINSTALL ); OUTS( NO_UPDATEPROVIDE ); OUTS( SPLITPROVIDES ); OUTS( ONLY_NAMESPACE_RECOMMENDED ); OUTS( ADD_ALREADY_RECOMMENDED ); OUTS( NO_INFARCHCHECK ); OUTS( KEEP_EXPLICIT_OBSOLETES ); OUTS( BEST_OBEY_POLICY ); OUTS( NO_AUTOTARGET ); OUTS( DUP_ALLOW_DOWNGRADE ); OUTS( DUP_ALLOW_ARCHCHANGE ); OUTS( DUP_ALLOW_VENDORCHANGE ); OUTS( DUP_ALLOW_NAMECHANGE ); OUTS( KEEP_ORPHANS ); OUTS( BREAK_ORPHANS ); OUTS( YUM_OBSOLETES ); #undef OUTS os << " focus = " << _focus << endl; os << " distupgrade = " << _distupgrade << endl; os << " removeOrphaned = " << _removeOrphaned << endl; os << " solveSrcPackages = " << _solveSrcPackages << endl; os << " cleandepsOnRemove = " << _cleandepsOnRemove << endl; os << " fixsystem = " << _fixsystem << endl; } else { os << ""; } return os << "" << endl; } //--------------------------------------------------------------------------- // NOTE: flag defaults must be in sync with ZVARDEFAULT in Resolver.cc SATResolver::SATResolver (ResPool pool, sat::detail::CPool *satPool) : _pool(std::move(pool)) , _satPool(satPool) , _satSolver(NULL) , _focus ( ZConfig::instance().solver_focus() ) , _fixsystem(false) , _allowdowngrade ( false ) , _allownamechange ( true ) // bsc#1071466 , _allowarchchange ( false ) , _allowvendorchange ( ZConfig::instance().solver_allowVendorChange() ) , _allowuninstall ( false ) , _updatesystem(false) , _noupdateprovide ( false ) , _dosplitprovides ( true ) , _onlyRequires (ZConfig::instance().solver_onlyRequires()) , _ignorealreadyrecommended(true) , _distupgrade(false) , _removeOrphaned(false) , _removeUnneeded(false) , _dup_allowdowngrade ( ZConfig::instance().solver_dupAllowDowngrade() ) , _dup_allownamechange ( ZConfig::instance().solver_dupAllowNameChange() ) , _dup_allowarchchange ( ZConfig::instance().solver_dupAllowArchChange() ) , _dup_allowvendorchange ( ZConfig::instance().solver_dupAllowVendorChange() ) , _solveSrcPackages(false) , _cleandepsOnRemove(ZConfig::instance().solver_cleandepsOnRemove()) { } SATResolver::~SATResolver() { solverEnd(); } //--------------------------------------------------------------------------- ResPool SATResolver::pool (void) const { return _pool; } //--------------------------------------------------------------------------- // copy marked item from solution back to pool // if data != NULL, set as APPL_LOW (from establishPool()) static void SATSolutionToPool (const PoolItem& item, const ResStatus & status, const ResStatus::TransactByValue causer) { // resetting item.status().resetTransact (causer); item.status().resetWeak (); bool r = false; // installation/deletion if (status.isToBeInstalled()) { r = item.status().setToBeInstalled (causer); XDEBUG("SATSolutionToPool install returns " << item << ", " << r); } else if (status.isToBeUninstalledDueToUpgrade()) { r = item.status().setToBeUninstalledDueToUpgrade (causer); XDEBUG("SATSolutionToPool upgrade returns " << item << ", " << r); } else if (status.isToBeUninstalled()) { r = item.status().setToBeUninstalled (causer); XDEBUG("SATSolutionToPool remove returns " << item << ", " << r); } return; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // solverInit //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- ///////////////////////////////////////////////////////////////////////// /// \class SATCollectTransact /// \brief Commit helper functor distributing PoolItem by status into lists /// /// On the fly it clears all PoolItem bySolver/ByApplLow status. /// The lists are cleared in the Ctor, populated by \ref operator(). ///////////////////////////////////////////////////////////////////////// struct SATCollectTransact { SATCollectTransact( PoolItemList & items_to_install_r, PoolItemList & items_to_remove_r, PoolItemList & items_to_lock_r, PoolItemList & items_to_keep_r, bool solveSrcPackages_r ) : _items_to_install( items_to_install_r ) , _items_to_remove( items_to_remove_r ) , _items_to_lock( items_to_lock_r ) , _items_to_keep( items_to_keep_r ) , _solveSrcPackages( solveSrcPackages_r ) { _items_to_install.clear(); _items_to_remove.clear(); _items_to_lock.clear(); _items_to_keep.clear(); } bool operator()( const PoolItem & item_r ) { ResStatus & itemStatus( item_r.status() ); bool by_solver = ( itemStatus.isBySolver() || itemStatus.isByApplLow() ); if ( by_solver ) { // Clear former solver/establish resultd itemStatus.resetTransact( ResStatus::APPL_LOW ); return true; // -> back out here, don't re-queue former results } if ( !_solveSrcPackages && item_r.isKind() ) { // Later we may continue on a per source package base. return true; // dont process this source package. } switch ( itemStatus.getTransactValue() ) { case ResStatus::TRANSACT: itemStatus.isUninstalled() ? _items_to_install.push_back( item_r ) : _items_to_remove.push_back( item_r ); break; case ResStatus::LOCKED: _items_to_lock.push_back( item_r ); break; case ResStatus::KEEP_STATE: _items_to_keep.push_back( item_r ); break; } return true; } private: PoolItemList & _items_to_install; PoolItemList & _items_to_remove; PoolItemList & _items_to_lock; PoolItemList & _items_to_keep; bool _solveSrcPackages; }; ///////////////////////////////////////////////////////////////////////// void SATResolver::solverEnd() { // cleanup if ( _satSolver ) { solver_free(_satSolver); _satSolver = NULL; queue_free( &(_jobQueue) ); } } void SATResolver::solverInit(const PoolItemList & weakItems) { MIL << "SATResolver::solverInit()" << endl; // Remove old stuff and create a new jobqueue solverEnd(); _satSolver = solver_create( _satPool ); queue_init( &_jobQueue ); { // bsc#1182629: in dup allow an available -release package providing 'dup-vendor-relax(suse)' // to let (suse/opensuse) vendor being treated as being equivalent. bool toRelax = false; if ( _distupgrade ) { for ( sat::Solvable solv : sat::WhatProvides( Capability("dup-vendor-relax(suse)") ) ) { if ( ! solv.isSystem() ) { MIL << "Relaxed vendor check requested by " << solv << endl; toRelax = true; break; } } } ::pool_set_custom_vendorcheck( _satPool, toRelax ? &relaxedVendorCheck : &vendorCheck ); } // Add rules for user/auto installed packages ::pool_add_userinstalled_jobs(_satPool, sat::Pool::instance().autoInstalled(), &(_jobQueue), GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED); // Collect PoolItem's tasks and cleanup Pool for solving. // Todos are kept in _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep { SATCollectTransact collector( _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep, solveSrcPackages() ); invokeOnEach ( _pool.begin(), _pool.end(), std::ref( collector ) ); } // Add rules for previous ProblemSolutions "break %s by ignoring some of its dependencies" for (PoolItemList::const_iterator iter = weakItems.begin(); iter != weakItems.end(); iter++) { Id id = iter->id(); if (id == ID_NULL) { ERR << "Weaken: " << *iter << " not found" << endl; } MIL << "Weaken dependencies of " << *iter << endl; queue_push( &(_jobQueue), SOLVER_WEAKENDEPS | SOLVER_SOLVABLE ); queue_push( &(_jobQueue), id ); } // Add rules for retracted patches and packages { queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES ); queue_push( &(_jobQueue), sat::Solvable::retractedToken.id() ); queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES ); queue_push( &(_jobQueue), sat::Solvable::ptfMasterToken.id() ); // bsc#1186503: ptfPackageToken should not be blacklisted } // Add rules for changed requestedLocales { const auto & trackedLocaleIds( myPool().trackedLocaleIds() ); // just track changed locakes for ( const auto & locale : trackedLocaleIds.added() ) { queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES ); queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() ); } for ( const auto & locale : trackedLocaleIds.removed() ) { queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | SOLVER_CLEANDEPS ); // needs uncond. SOLVER_CLEANDEPS! queue_push( &(_jobQueue), Capability( ResolverNamespace::language, IdString(locale) ).id() ); } } // Add rules for parallel installable resolvables with different versions for ( const sat::Solvable & solv : myPool().multiversionList() ) { queue_push( &(_jobQueue), SOLVER_NOOBSOLETES | SOLVER_SOLVABLE ); queue_push( &(_jobQueue), solv.id() ); } // Add rules to protect PTF removal without repos (bsc#1203248) // Removing a PTF its packages should be replaced by the official // versions again. If just the system repo is present, they'd get // removed instead. { _protectPTFs = sat::Pool::instance().reposSize() == 1; if ( _protectPTFs ) { for ( const auto & solv : sat::AllPTFs() ) { if ( solv.isSystem() ) { queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE ); queue_push( &(_jobQueue), solv.id() ); } } } } // set requirements for a running system solverInitSetSystemRequirements(); // set locks for the solver solverInitSetLocks(); // set mode (verify,up,dup) specific jobs and solver flags solverInitSetModeJobsAndFlags(); } void SATResolver::solverInitSetSystemRequirements() { CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap(); CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap(); for (CapabilitySet::const_iterator iter = system_requires.begin(); iter != system_requires.end(); ++iter) { queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES ); queue_push( &(_jobQueue), iter->id() ); MIL << "SYSTEM Requires " << *iter << endl; } for (CapabilitySet::const_iterator iter = system_conflicts.begin(); iter != system_conflicts.end(); ++iter) { queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | MAYBE_CLEANDEPS ); queue_push( &(_jobQueue), iter->id() ); MIL << "SYSTEM Conflicts " << *iter << endl; } // Lock the architecture of the running systems rpm // package on distupgrade. if ( _distupgrade && ZConfig::instance().systemRoot() == "/" ) { ResPool pool( ResPool::instance() ); IdString rpm( "rpm" ); for_( it, pool.byIdentBegin(rpm), pool.byIdentEnd(rpm) ) { if ( (*it)->isSystem() ) { Capability archrule( (*it)->arch(), rpm.c_str(), Capability::PARSED ); queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_NAME | SOLVER_ESSENTIAL ); queue_push( &(_jobQueue), archrule.id() ); } } } } void SATResolver::solverInitSetLocks() { unsigned icnt = 0; unsigned acnt = 0; for (PoolItemList::const_iterator iter = _items_to_lock.begin(); iter != _items_to_lock.end(); ++iter) { sat::detail::SolvableIdType id( iter->id() ); if (iter->status().isInstalled()) { ++icnt; queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE ); queue_push( &(_jobQueue), id ); } else { ++acnt; queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE | MAYBE_CLEANDEPS ); queue_push( &(_jobQueue), id ); } } MIL << "Locked " << icnt << " installed items and " << acnt << " NOT installed items." << endl; /////////////////////////////////////////////////////////////////// // Weak locks: Ignore if an item with this name is already installed. // If it's not installed try to keep it this way using a weak delete /////////////////////////////////////////////////////////////////// std::set unifiedByName; for (PoolItemList::const_iterator iter = _items_to_keep.begin(); iter != _items_to_keep.end(); ++iter) { IdString ident( iter->ident() ); if ( unifiedByName.insert( ident ).second ) { if ( ! ui::Selectable::get( *iter )->hasInstalledObj() ) { MIL << "Keep NOT installed name " << ident << " (" << *iter << ")" << endl; queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | SOLVER_WEAK | MAYBE_CLEANDEPS ); queue_push( &(_jobQueue), ident.id() ); } } } } void SATResolver::solverInitSetModeJobsAndFlags() { if (_fixsystem) { queue_push( &(_jobQueue), SOLVER_VERIFY|SOLVER_SOLVABLE_ALL); queue_push( &(_jobQueue), 0 ); } if (_updatesystem) { queue_push( &(_jobQueue), SOLVER_UPDATE|SOLVER_SOLVABLE_ALL); queue_push( &(_jobQueue), 0 ); } if (_distupgrade) { queue_push( &(_jobQueue), SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_ALL); queue_push( &(_jobQueue), 0 ); // By now libsolv supports orphan handling just in dup. // We keep it here in _distupgrade to make sure nothing bad happens // in case libsolv changes and it's used in remove commands which // have no repos enabled. I.e. everything would be orphaned. if (_removeOrphaned) { queue_push( &(_jobQueue), SOLVER_DROP_ORPHANED|SOLVER_SOLVABLE_ALL); queue_push( &(_jobQueue), 0 ); } } if (_removeUnneeded) { invokeOnEach ( _pool.begin(), _pool.end(), [this]( const PoolItem & pi_r ) { if ( pi_r.status().isUnneeded() ) { queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | SOLVER_WEAK | MAYBE_CLEANDEPS ); queue_push( &(_jobQueue), pi_r.ident().id() ); } return true; } ); } solverSetFocus( *_satSolver, _focus ); solver_set_flag(_satSolver, SOLVER_FLAG_ADD_ALREADY_RECOMMENDED, !_ignorealreadyrecommended); solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_DOWNGRADE, _allowdowngrade); solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_NAMECHANGE, _allownamechange); solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_ARCHCHANGE, _allowarchchange); solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_VENDORCHANGE, _allowvendorchange); solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_UNINSTALL, _allowuninstall); solver_set_flag(_satSolver, SOLVER_FLAG_NO_UPDATEPROVIDE, _noupdateprovide); solver_set_flag(_satSolver, SOLVER_FLAG_SPLITPROVIDES, _dosplitprovides); solver_set_flag(_satSolver, SOLVER_FLAG_IGNORE_RECOMMENDED, false); // resolve recommended namespaces solver_set_flag(_satSolver, SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED, _onlyRequires); // solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_DOWNGRADE, _dup_allowdowngrade ); solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_NAMECHANGE, _dup_allownamechange ); solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE, _dup_allowarchchange ); solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE, _dup_allowvendorchange ); } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // solving..... //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- class CheckIfUpdate { public: bool is_updated; sat::Solvable _installed; CheckIfUpdate( const sat::Solvable & installed_r ) : is_updated( false ) , _installed( installed_r ) {} // check this item will be updated bool operator()( const PoolItem & item ) { if ( item.status().isToBeInstalled() ) { if ( ! item.multiversionInstall() || sameNVRA( _installed, item ) ) { is_updated = true; return false; } } return true; } }; bool SATResolver::solving(const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps) { sat::Pool::instance().prepare(); // Solve ! MIL << "Starting solving...." << endl; MIL << *this; if ( solver_solve( _satSolver, &(_jobQueue) ) == 0 ) { // bsc#1155819: Weakremovers of future product not evaluated. // Do a 2nd run to cleanup weakremovers() of to be installed // Produtcs unless removeunsupported is active (cleans up all). if ( _distupgrade ) { if ( _removeOrphaned ) MIL << "Droplist processing not needed. RemoveUnsupported is On." << endl; else if ( ! ZConfig::instance().solverUpgradeRemoveDroppedPackages() ) MIL << "Droplist processing is disabled in ZConfig." << endl; else { bool resolve = false; MIL << "Checking droplists ..." << endl; // get Solvables to be installed... sat::SolvableQueue decisionq; solver_get_decisionqueue( _satSolver, decisionq ); for ( sat::detail::IdType id : decisionq ) { if ( id < 0 ) continue; sat::Solvable slv { (sat::detail::SolvableIdType)id }; // get product buddies (they carry the weakremover)... static const Capability productCap { "product()" }; if ( slv && slv.dep_provides().matches( productCap ) ) { CapabilitySet droplist { slv.valuesOfNamespace( "weakremover" ) }; MIL << "Droplist for " << slv << ": size " << droplist.size() << endl; if ( !droplist.empty() ) { for ( const auto & cap : droplist ) { queue_push( &_jobQueue, SOLVER_DROP_ORPHANED | SOLVER_SOLVABLE_NAME ); queue_push( &_jobQueue, cap.id() ); } // PIN product - a safety net to prevent cleanup from changing the decision for this product queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE ); queue_push( &(_jobQueue), id ); resolve = true; } } } if ( resolve ) solver_solve( _satSolver, &(_jobQueue) ); } } } MIL << "....Solver end" << endl; // copying solution back to zypp pool //----------------------------------------- _result_items_to_install.clear(); _result_items_to_remove.clear(); /* solvables to be installed */ Queue decisionq; queue_init(&decisionq); solver_get_decisionqueue(_satSolver, &decisionq); for ( int i = 0; i < decisionq.count; ++i ) { Id p = decisionq.elements[i]; if ( p < 0 ) continue; sat::Solvable slv { (sat::detail::SolvableIdType)p }; if ( ! slv || slv.isSystem() ) continue; PoolItem poolItem( slv ); SATSolutionToPool (poolItem, ResStatus::toBeInstalled, ResStatus::SOLVER); _result_items_to_install.push_back( poolItem ); } queue_free(&decisionq); /* solvables to be erased */ Repository systemRepo( sat::Pool::instance().findSystemRepo() ); // don't create if it does not exist if ( systemRepo && ! systemRepo.solvablesEmpty() ) { bool mustCheckObsoletes = false; for_( it, systemRepo.solvablesBegin(), systemRepo.solvablesEnd() ) { if (solver_get_decisionlevel(_satSolver, it->id()) > 0) continue; // Check if this is an update CheckIfUpdate info( *it ); PoolItem poolItem( *it ); invokeOnEach( _pool.byIdentBegin( poolItem ), _pool.byIdentEnd( poolItem ), resfilter::ByUninstalled(), // ByUninstalled std::ref(info) ); if (info.is_updated) { SATSolutionToPool( poolItem, ResStatus::toBeUninstalledDueToUpgrade, ResStatus::SOLVER ); } else { SATSolutionToPool( poolItem, ResStatus::toBeUninstalled, ResStatus::SOLVER ); if ( ! mustCheckObsoletes ) mustCheckObsoletes = true; // lazy check for UninstalledDueToObsolete } _result_items_to_remove.push_back (poolItem); } if ( mustCheckObsoletes ) { sat::WhatObsoletes obsoleted( _result_items_to_install.begin(), _result_items_to_install.end() ); for_( it, obsoleted.poolItemBegin(), obsoleted.poolItemEnd() ) { ResStatus & status( it->status() ); // WhatObsoletes contains installed items only! if ( status.transacts() && ! status.isToBeUninstalledDueToUpgrade() ) status.setToBeUninstalledDueToObsolete(); } } } // copy back computed status values to pool // (on the fly cache orphaned items for the UI) solverCopyBackWeak( *_satSolver, _problem_items ); solverCopyBackValidate( *_satSolver, _pool ); // Solvables which were selected due requirements which have been made by the user will // be selected by APPL_LOW. We can't use any higher level, because this setting must // not serve as a request for the next solver run. APPL_LOW is reset before solving. for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) { sat::WhatProvides rpmProviders(*iter); for_( iter2, rpmProviders.begin(), rpmProviders.end() ) { PoolItem poolItem(*iter2); if (poolItem.status().isToBeInstalled()) { MIL << "User requirement " << *iter << " sets " << poolItem << endl; poolItem.status().setTransactByValue (ResStatus::APPL_LOW); } } } for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) { sat::WhatProvides rpmProviders(*iter); for_( iter2, rpmProviders.begin(), rpmProviders.end() ) { PoolItem poolItem(*iter2); if (poolItem.status().isToBeUninstalled()) { MIL << "User conflict " << *iter << " sets " << poolItem << endl; poolItem.status().setTransactByValue (ResStatus::APPL_LOW); } } } if (solver_problem_count(_satSolver) > 0 ) { ERR << "Solverrun finished with an ERROR" << endl; return false; } return true; } void SATResolver::solverAddJobsFromPool() { for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) { Id id = iter->id(); if (id == ID_NULL) { ERR << "Install: " << *iter << " not found" << endl; } else { MIL << "Install " << *iter << endl; queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE ); queue_push( &(_jobQueue), id ); } } for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) { Id id = iter->id(); if (id == ID_NULL) { ERR << "Delete: " << *iter << " not found" << endl; } else { MIL << "Delete " << *iter << endl; queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE | MAYBE_CLEANDEPS ); queue_push( &(_jobQueue), id); } } } void SATResolver::solverAddJobsFromExtraQueues( const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps ) { for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) { queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES ); queue_push( &(_jobQueue), iter->id() ); MIL << "Requires " << *iter << endl; } for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) { queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | MAYBE_CLEANDEPS ); queue_push( &(_jobQueue), iter->id() ); MIL << "Conflicts " << *iter << endl; } } bool SATResolver::resolvePool(const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps, const PoolItemList & weakItems, const std::set & upgradeRepos) { MIL << "SATResolver::resolvePool()" << endl; // Initialize solverInit(weakItems); // Add pool and extra jobs. solverAddJobsFromPool(); solverAddJobsFromExtraQueues( requires_caps, conflict_caps ); // 'dup --from' jobs for_( iter, upgradeRepos.begin(), upgradeRepos.end() ) { queue_push( &(_jobQueue), SOLVER_DISTUPGRADE | SOLVER_SOLVABLE_REPO ); queue_push( &(_jobQueue), iter->get()->repoid ); MIL << "Upgrade repo " << *iter << endl; } // Solve! bool ret = solving(requires_caps, conflict_caps); (ret?MIL:WAR) << "SATResolver::resolvePool() done. Ret:" << ret << endl; return ret; } bool SATResolver::resolveQueue(const SolverQueueItemList &requestQueue, const PoolItemList & weakItems) { MIL << "SATResolver::resolvQueue()" << endl; // Initialize solverInit(weakItems); // Add request queue's jobs. for (SolverQueueItemList::const_iterator iter = requestQueue.begin(); iter != requestQueue.end(); iter++) { (*iter)->addRule(_jobQueue); } // Add pool jobs; they do contain any problem resolutions. solverAddJobsFromPool(); // Solve! bool ret = solving(); (ret?MIL:WAR) << "SATResolver::resolveQueue() done. Ret:" << ret << endl; return ret; } void SATResolver::doUpdate() { MIL << "SATResolver::doUpdate()" << endl; // Initialize solverInit(PoolItemList()); // By now, doUpdate has no additional jobs. // It does not include any pool jobs, and so it does not create an conflicts. // Combinations like patch_with_update are driven by resolvePool + _updatesystem. // TODO: Try to join the following with solving() sat::Pool::instance().prepare(); // Solve! MIL << "Starting solving for update...." << endl; MIL << *this; solver_solve( _satSolver, &(_jobQueue) ); MIL << "....Solver end" << endl; // copying solution back to zypp pool //----------------------------------------- /* solvables to be installed */ Queue decisionq; queue_init(&decisionq); solver_get_decisionqueue(_satSolver, &decisionq); for (int i = 0; i < decisionq.count; i++) { Id p = decisionq.elements[i]; if ( p < 0 ) continue; sat::Solvable solv { (sat::detail::SolvableIdType)p }; if ( ! solv || solv.isSystem() ) continue; SATSolutionToPool( PoolItem(solv), ResStatus::toBeInstalled, ResStatus::SOLVER ); } queue_free(&decisionq); /* solvables to be erased */ if ( _satSolver->pool->installed ) { for (int i = _satSolver->pool->installed->start; i < _satSolver->pool->installed->start + _satSolver->pool->installed->nsolvables; i++) { if (solver_get_decisionlevel(_satSolver, i) > 0) continue; PoolItem poolItem( _pool.find( sat::Solvable(i) ) ); if (poolItem) { // Check if this is an update CheckIfUpdate info( (sat::Solvable(i)) ); invokeOnEach( _pool.byIdentBegin( poolItem ), _pool.byIdentEnd( poolItem ), resfilter::ByUninstalled(), // ByUninstalled std::ref(info) ); if (info.is_updated) { SATSolutionToPool (poolItem, ResStatus::toBeUninstalledDueToUpgrade , ResStatus::SOLVER); } else { SATSolutionToPool (poolItem, ResStatus::toBeUninstalled, ResStatus::SOLVER); } } else { ERR << "id " << i << " not found in ZYPP pool." << endl; } } } // copy back computed status values to pool // (on the fly cache orphaned items for the UI) solverCopyBackWeak( *_satSolver, _problem_items ); solverCopyBackValidate( *_satSolver, _pool ); MIL << "SATResolver::doUpdate() done" << endl; } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // error handling //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- // helper function //---------------------------------------------------------------------------- struct FindPackage { ProblemSolutionCombi *problemSolution; TransactionKind action; FindPackage (ProblemSolutionCombi *p, const TransactionKind act) : problemSolution (p) , action (act) { } bool operator()( const PoolItem& p) { problemSolution->addSingleAction (p, action); return true; } }; //---------------------------------------------------------------------------- // Checking if this solvable/item has a buddy which reflect the real // user visible description of an item // e.g. The release package has a buddy to the concerning product item. // This user want's the message "Product foo conflicts with product bar" and // NOT "package release-foo conflicts with package release-bar" // (ma: that's why we should map just packages to buddies, not vice versa) //---------------------------------------------------------------------------- inline sat::Solvable mapBuddy( const PoolItem & item_r ) { if ( item_r.isKind() ) { sat::Solvable buddy = item_r.buddy(); if ( buddy ) return buddy; } return item_r.satSolvable(); } inline sat::Solvable mapBuddy( sat::Solvable item_r ) { return mapBuddy( PoolItem( item_r ) ); } PoolItem SATResolver::mapItem ( const PoolItem & item ) { return PoolItem( mapBuddy( item ) ); } sat::Solvable SATResolver::mapSolvable ( const Id & id ) { return mapBuddy( sat::Solvable(id) ); } std::vector SATResolver::SATgetCompleteProblemInfoStrings ( Id problem ) { std::vector ret; sat::Queue problems; solver_findallproblemrules( _satSolver, problem, problems ); bool nobad = false; //filter out generic rule information if more explicit ones are available for ( sat::Queue::size_type i = 0; i < problems.size(); i++ ) { SolverRuleinfo ruleClass = solver_ruleclass( _satSolver, problems[i]); if ( ruleClass != SolverRuleinfo::SOLVER_RULE_UPDATE && ruleClass != SolverRuleinfo::SOLVER_RULE_JOB ) { nobad = true; break; } } for ( sat::Queue::size_type i = 0; i < problems.size(); i++ ) { SolverRuleinfo ruleClass = solver_ruleclass( _satSolver, problems[i]); if ( nobad && ( ruleClass == SolverRuleinfo::SOLVER_RULE_UPDATE || ruleClass == SolverRuleinfo::SOLVER_RULE_JOB ) ) { continue; } std::string detail; Id ignore = 0; std::string pInfo = SATproblemRuleInfoString( problems[i], detail, ignore ); //we get the same string multiple times, reduce the noise if ( std::find( ret.begin(), ret.end(), pInfo ) == ret.end() ) ret.push_back( pInfo ); } return ret; } std::string SATResolver::SATprobleminfoString(Id problem, std::string &detail, Id &ignoreId) { // FIXME: solver_findallproblemrules to get all rules for this problem // (the 'most relevabt' one returned by solver_findproblemrule is embedded Id probr = solver_findproblemrule(_satSolver, problem); return SATproblemRuleInfoString( probr, detail, ignoreId ); } std::string SATResolver::SATproblemRuleInfoString (Id probr, std::string &detail, Id &ignoreId) { std::string ret; sat::detail::CPool *pool = _satSolver->pool; Id dep = 0, source = 0, target = 0; SolverRuleinfo type = solver_ruleinfo(_satSolver, probr, &source, &target, &dep); ignoreId = 0; sat::Solvable s = mapSolvable( source ); sat::Solvable s2 = mapSolvable( target ); // @FIXME, these strings are a duplicate copied from the libsolv library // to provide translations. Instead of having duplicate code we should // translate those strings directly in libsolv switch ( type ) { case SOLVER_RULE_DISTUPGRADE: if ( s.isSystem() ) ret = str::Format(_("the installed %1% does not belong to a distupgrade repository and must be replaced") ) % s.asString(); else /*just in case*/ ret = str::Format(_("the to be installed %1% does not belong to a distupgrade repository") ) % s.asString(); break; case SOLVER_RULE_INFARCH: if ( s.isSystem() ) ret = str::Format(_("the installed %1% has inferior architecture") ) % s.asString(); else ret = str::Format(_("the to be installed %1% has inferior architecture") ) % s.asString(); break; case SOLVER_RULE_UPDATE: ret = str::Format(_("problem with the installed %1%") ) % s.asString(); break; case SOLVER_RULE_JOB: ret = _("conflicting requests"); break; case SOLVER_RULE_PKG: ret = _("some dependency problem"); break; case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP: ret = str::Format(_("nothing provides the requested '%1%'") ) % pool_dep2str(pool, dep); detail += _("Have you enabled all the required repositories?"); break; case SOLVER_RULE_JOB_UNKNOWN_PACKAGE: ret = str::Format(_("the requested package %1% does not exist") ) % pool_dep2str(pool, dep); detail += _("Have you enabled all the required repositories?"); break; case SOLVER_RULE_JOB_UNSUPPORTED: ret = _("unsupported request"); break; case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM: ret = str::Format(_("'%1%' is provided by the system and cannot be erased") ) % pool_dep2str(pool, dep); break; case SOLVER_RULE_PKG_NOT_INSTALLABLE: ret = str::Format(_("%1% is not installable") ) % s.asString(); break; case SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP: ignoreId = source; // for setting weak dependencies if ( s.isSystem() ) ret = str::Format(_("nothing provides '%1%' needed by the installed %2%") ) % pool_dep2str(pool, dep) % s.asString(); else ret = str::Format(_("nothing provides '%1%' needed by the to be installed %2%") ) % pool_dep2str(pool, dep) % s.asString(); break; case SOLVER_RULE_PKG_SAME_NAME: ret = str::Format(_("cannot install both %1% and %2%") ) % s.asString() % s2.asString(); break; case SOLVER_RULE_PKG_CONFLICTS: if ( s.isSystem() ) { if ( s2.isSystem() ) ret = str::Format(_("the installed %1% conflicts with '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); else ret = str::Format(_("the installed %1% conflicts with '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); } else { if ( s2.isSystem() ) ret = str::Format(_("the to be installed %1% conflicts with '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); else ret = str::Format(_("the to be installed %1% conflicts with '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); } break; case SOLVER_RULE_PKG_OBSOLETES: case SOLVER_RULE_PKG_INSTALLED_OBSOLETES: if ( s.isSystem() ) { if ( s2.isSystem() ) ret = str::Format(_("the installed %1% obsoletes '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); else ret = str::Format(_("the installed %1% obsoletes '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); } else { if ( s2.isSystem() ) ret = str::Format(_("the to be installed %1% obsoletes '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); else ret = str::Format(_("the to be installed %1% obsoletes '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString(); } break; case SOLVER_RULE_PKG_SELF_CONFLICT: if ( s.isSystem() ) ret = str::Format(_("the installed %1% conflicts with '%2%' provided by itself") ) % s.asString() % pool_dep2str(pool, dep); else ret = str::Format(_("the to be installed %1% conflicts with '%2%' provided by itself") ) % s.asString() % pool_dep2str(pool, dep); break; case SOLVER_RULE_PKG_REQUIRES: { ignoreId = source; // for setting weak dependencies Capability cap(dep); sat::WhatProvides possibleProviders(cap); // check, if a provider will be deleted typedef std::list ProviderList; ProviderList providerlistInstalled, providerlistUninstalled; for_( iter1, possibleProviders.begin(), possibleProviders.end() ) { PoolItem provider1 = ResPool::instance().find( *iter1 ); // find pair of an installed/uninstalled item with the same NVR bool found = false; for_( iter2, possibleProviders.begin(), possibleProviders.end() ) { PoolItem provider2 = ResPool::instance().find( *iter2 ); if (compareByNVR (provider1,provider2) == 0 && ( (provider1.status().isInstalled() && provider2.status().isUninstalled()) || (provider2.status().isInstalled() && provider1.status().isUninstalled()) )) { found = true; break; } } if (!found) { if (provider1.status().isInstalled()) providerlistInstalled.push_back(provider1); else providerlistUninstalled.push_back(provider1); } } if ( s.isSystem() ) ret = str::Format(_("the installed %1% requires '%2%', but this requirement cannot be provided") ) % s.asString() % pool_dep2str(pool, dep); else ret = str::Format(_("the to be installed %1% requires '%2%', but this requirement cannot be provided") ) % s.asString() % pool_dep2str(pool, dep); if (providerlistInstalled.size() > 0) { detail += _("deleted providers: "); for (ProviderList::const_iterator iter = providerlistInstalled.begin(); iter != providerlistInstalled.end(); iter++) { if (iter == providerlistInstalled.begin()) detail += itemToString( *iter ); else detail += "\n " + itemToString( mapItem(*iter) ); } } if (providerlistUninstalled.size() > 0) { if (detail.size() > 0) detail += _("\nnot installable providers: "); else detail = _("not installable providers: "); for (ProviderList::const_iterator iter = providerlistUninstalled.begin(); iter != providerlistUninstalled.end(); iter++) { if (iter == providerlistUninstalled.begin()) detail += itemToString( *iter ); else detail += "\n " + itemToString( mapItem(*iter) ); } } break; } default: { DBG << "Unknown rule type(" << type << ") going to query libsolv for rule information." << endl; ret = str::asString( ::solver_problemruleinfo2str( _satSolver, type, static_cast(s.id()), static_cast(s2.id()), dep ) ); break; } } return ret; } ///////////////////////////////////////////////////////////////////////// namespace { /// bsc#1194848 hint on ptf<>patch conflicts or common ptf conflicts struct PtfPatchHint { void notInstallPatch( sat::Solvable slv_r ) { _patch.push_back( slv_r.ident() ); } void removePtf( sat::Solvable slv_r, bool showremoveProtectHint_r = false ) { _ptf.push_back( slv_r.ident() ); if ( showremoveProtectHint_r ) _showremoveProtectHint = true; } bool applies() const { return not _ptf.empty(); } std::string description() const { if ( not _patch.empty() ) { return str::Str() // translator: %1% is the name of a PTF, %2% the name of a patch. << (str::Format( _("%1% is not yet fully integrated into %2%.") ) % printlist(_ptf) % printlist(_patch)) << endl << _("Typically you want to keep the PTF and choose to not install the maintenance patches."); } //else: a common problem due to an installed ptf if ( _showremoveProtectHint ) { // bsc#1203248 const std::string & removeptfCommand { str::Format("zypper removeptf %1%") % printlist(_ptf) }; return str::Str() // translator: %1% is the name of a PTF. << (str::Format( _("Removing the installed %1% in this context will remove (not replace!) the included PTF-packages too." ) ) % printlist(_ptf)) << endl << (str::Format( _("The PTF should be removed by calling '%1%'. This will update the included PTF-packages rather than removing them." ) ) % removeptfCommand) << endl << _("Typically you want to keep the PTF or choose to cancel the action."); // ma: When translated, it should replace the '..and choose..' below too } return str::Str() // translator: %1% is the name of a PTF. << (str::Format( _("The installed %1% blocks the desired action.") ) % printlist(_ptf)) << endl << _("Typically you want to keep the PTF and choose to cancel the action."); } private: using StoreType = IdString; static std::string printlist( const std::vector & list_r ) { str::Str ret; dumpRange( ret.stream(), list_r.begin(), list_r.end(), "", "", ", ", "", "" ); return ret; } std::vector _ptf; std::vector _patch; bool _showremoveProtectHint = false; }; } ///////////////////////////////////////////////////////////////////////// ResolverProblemList SATResolver::problems () { ResolverProblemList resolverProblems; if (_satSolver && solver_problem_count(_satSolver)) { sat::detail::CPool *pool = _satSolver->pool; int pcnt = 0; Id p = 0, rp = 0, what = 0; Id problem = 0, solution = 0, element = 0; sat::Solvable s, sd; CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap(); CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap(); MIL << "Encountered problems! Here are the solutions:\n" << endl; pcnt = 1; problem = 0; while ((problem = solver_next_problem(_satSolver, problem)) != 0) { MIL << "Problem " << pcnt++ << ":" << endl; MIL << "====================================" << endl; std::string detail; Id ignoreId = 0; std::string whatString = SATprobleminfoString (problem,detail,ignoreId); MIL << whatString << endl; MIL << "------------------------------------" << endl; ResolverProblem_Ptr resolverProblem = new ResolverProblem (whatString, detail, SATgetCompleteProblemInfoStrings( problem )); PtfPatchHint ptfPatchHint; // bsc#1194848 hint on ptf<>patch conflicts solution = 0; while ((solution = solver_next_solution(_satSolver, problem, solution)) != 0) { element = 0; ProblemSolutionCombi *problemSolution = new ProblemSolutionCombi; while ((element = solver_next_solutionelement(_satSolver, problem, solution, element, &p, &rp)) != 0) { if (p == SOLVER_SOLUTION_JOB) { /* job, rp is index into job queue */ what = _jobQueue.elements[rp]; switch (_jobQueue.elements[rp-1]&(SOLVER_SELECTMASK|SOLVER_JOBMASK)) { case SOLVER_INSTALL | SOLVER_SOLVABLE: { s = mapSolvable (what); PoolItem poolItem = _pool.find (s); if (poolItem) { if (pool->installed && s.get()->repo == pool->installed) { problemSolution->addSingleAction (poolItem, REMOVE); std::string description = str::Format(_("remove lock to allow removal of %1%") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); if ( _protectPTFs && s.isPtfMaster() ) ptfPatchHint.removePtf( s, _protectPTFs ); // bsc#1203248 } else { problemSolution->addSingleAction (poolItem, KEEP); std::string description = str::Format(_("do not install %1%") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); if ( s.isKind() ) ptfPatchHint.notInstallPatch( s ); } } else { ERR << "SOLVER_INSTALL_SOLVABLE: No item found for " << s.asString() << endl; } } break; case SOLVER_ERASE | SOLVER_SOLVABLE: { s = mapSolvable (what); PoolItem poolItem = _pool.find (s); if (poolItem) { if (pool->installed && s.get()->repo == pool->installed) { problemSolution->addSingleAction (poolItem, KEEP); std::string description = str::Format(_("keep %1%") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); } else { problemSolution->addSingleAction (poolItem, UNLOCK); std::string description = str::Format(_("remove lock to allow installation of %1%") ) % itemToString( poolItem ); MIL << description << endl; problemSolution->addDescription (description); } } else { ERR << "SOLVER_ERASE_SOLVABLE: No item found for " << s.asString() << endl; } } break; case SOLVER_INSTALL | SOLVER_SOLVABLE_NAME: { IdString ident( what ); SolverQueueItemInstall_Ptr install = new SolverQueueItemInstall(_pool, ident.asString(), false ); problemSolution->addSingleAction (install, REMOVE_SOLVE_QUEUE_ITEM); std::string description = str::Format(_("do not install %1%") ) % ident; MIL << description << endl; problemSolution->addDescription (description); } break; case SOLVER_ERASE | SOLVER_SOLVABLE_NAME: { // As we do not know, if this request has come from resolvePool or // resolveQueue we will have to take care for both cases. IdString ident( what ); FindPackage info (problemSolution, KEEP); invokeOnEach( _pool.byIdentBegin( ident ), _pool.byIdentEnd( ident ), functor::chain (resfilter::ByInstalled (), // ByInstalled resfilter::ByTransact ()), // will be deinstalled std::ref(info) ); SolverQueueItemDelete_Ptr del = new SolverQueueItemDelete(_pool, ident.asString(), false ); problemSolution->addSingleAction (del, REMOVE_SOLVE_QUEUE_ITEM); std::string description = str::Format(_("keep %1%") ) % ident; MIL << description << endl; problemSolution->addDescription (description); } break; case SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES: { problemSolution->addSingleAction (Capability(what), REMOVE_EXTRA_REQUIRE); std::string description = ""; // Checking if this problem solution would break your system if (system_requires.find(Capability(what)) != system_requires.end()) { // Show a better warning resolverProblem->setDetails( resolverProblem->description() + "\n" + resolverProblem->details() ); resolverProblem->setDescription(_("This request will break your system!")); description = _("ignore the warning of a broken system"); description += std::string(" (requires:")+pool_dep2str(pool, what)+")"; MIL << description << endl; problemSolution->addFrontDescription (description); } else { description = str::Format(_("do not ask to install a solvable providing %1%") ) % pool_dep2str(pool, what); MIL << description << endl; problemSolution->addDescription (description); } } break; case SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES: { problemSolution->addSingleAction (Capability(what), REMOVE_EXTRA_CONFLICT); std::string description = ""; // Checking if this problem solution would break your system if (system_conflicts.find(Capability(what)) != system_conflicts.end()) { // Show a better warning resolverProblem->setDetails( resolverProblem->description() + "\n" + resolverProblem->details() ); resolverProblem->setDescription(_("This request will break your system!")); description = _("ignore the warning of a broken system"); description += std::string(" (conflicts:")+pool_dep2str(pool, what)+")"; MIL << description << endl; problemSolution->addFrontDescription (description); } else { description = str::Format(_("do not ask to delete all solvables providing %1%") ) % pool_dep2str(pool, what); MIL << description << endl; problemSolution->addDescription (description); } } break; case SOLVER_UPDATE | SOLVER_SOLVABLE: { s = mapSolvable (what); PoolItem poolItem = _pool.find (s); if (poolItem) { if (pool->installed && s.get()->repo == pool->installed) { problemSolution->addSingleAction (poolItem, KEEP); std::string description = str::Format(_("do not install most recent version of %1%") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); } else { ERR << "SOLVER_INSTALL_SOLVABLE_UPDATE " << poolItem << " is not selected for installation" << endl; } } else { ERR << "SOLVER_INSTALL_SOLVABLE_UPDATE: No item found for " << s.asString() << endl; } } break; default: MIL << "- do something different" << endl; ERR << "No valid solution available" << endl; break; } } else if (p == SOLVER_SOLUTION_INFARCH) { s = mapSolvable (rp); PoolItem poolItem = _pool.find (s); if (pool->installed && s.get()->repo == pool->installed) { problemSolution->addSingleAction (poolItem, LOCK); std::string description = str::Format(_("keep %1% despite the inferior architecture") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); } else { problemSolution->addSingleAction (poolItem, INSTALL); std::string description = str::Format(_("install %1% despite the inferior architecture") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); } } else if (p == SOLVER_SOLUTION_DISTUPGRADE) { s = mapSolvable (rp); PoolItem poolItem = _pool.find (s); if (pool->installed && s.get()->repo == pool->installed) { problemSolution->addSingleAction (poolItem, LOCK); std::string description = str::Format(_("keep obsolete %1%") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); } else { problemSolution->addSingleAction (poolItem, INSTALL); std::string description = str::Format(_("install %1% from excluded repository") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); } } else if ( p == SOLVER_SOLUTION_BLACK ) { // Allow to install a blacklisted package (PTF, retracted,...). // For not-installed items only s = mapSolvable (rp); PoolItem poolItem = _pool.find (s); problemSolution->addSingleAction (poolItem, INSTALL); std::string description; if ( s.isRetracted() ) { // translator: %1% is a package name description = str::Format(_("install %1% although it has been retracted")) % s.asString(); } else if ( s.isPtf() ) { // translator: %1% is a package name description = str::Format(_("allow installing the PTF %1%")) % s.asString(); } else { // translator: %1% is a package name description = str::Format(_("install %1% although it is blacklisted")) % s.asString(); } MIL << description << endl; problemSolution->addDescription( description ); } else if ( p > 0 ) { /* policy, replace p with rp */ s = mapSolvable (p); PoolItem itemFrom = _pool.find (s); if (rp) { int gotone = 0; sd = mapSolvable (rp); PoolItem itemTo = _pool.find (sd); if (itemFrom && itemTo) { problemSolution->addSingleAction (itemTo, INSTALL); int illegal = policy_is_illegal(_satSolver, s.get(), sd.get(), 0); if ((illegal & POLICY_ILLEGAL_DOWNGRADE) != 0) { std::string description = str::Format(_("downgrade of %1% to %2%") ) % s.asString() % sd.asString(); MIL << description << endl; problemSolution->addDescription (description); gotone = 1; } if ((illegal & POLICY_ILLEGAL_ARCHCHANGE) != 0) { std::string description = str::Format(_("architecture change of %1% to %2%") ) % s.asString() % sd.asString(); MIL << description << endl; problemSolution->addDescription (description); gotone = 1; } if ((illegal & POLICY_ILLEGAL_VENDORCHANGE) != 0) { IdString s_vendor( s.vendor() ); IdString sd_vendor( sd.vendor() ); std::string description; if ( s == sd ) // FIXME? Actually .ident() must be eq. But the more verbose 'else' isn't bad either. description = str::Format(_("install %1% (with vendor change)\n %2% --> %3%") ) % sd.asString() % ( s_vendor ? s_vendor.c_str() : " (no vendor) " ) % ( sd_vendor ? sd_vendor.c_str() : " (no vendor) " ); else description = str::Format(_("install %1% from vendor %2%\n replacing %3% from vendor %4%") ) % sd.asString() % ( sd_vendor ? sd_vendor.c_str() : " (no vendor) " ) % s.asString() % ( s_vendor ? s_vendor.c_str() : " (no vendor) " ); MIL << description << endl; problemSolution->addDescription (description); gotone = 1; } if (!gotone) { std::string description = str::Format(_("replacement of %1% with %2%") ) % s.asString() % sd.asString(); MIL << description << endl; problemSolution->addDescription (description); } } else { ERR << s.asString() << " or " << sd.asString() << " not found" << endl; } } else { if (itemFrom) { std::string description = str::Format(_("deinstallation of %1%") ) % s.asString(); MIL << description << endl; problemSolution->addDescription (description); problemSolution->addSingleAction (itemFrom, REMOVE); if ( s.isPtfMaster() ) ptfPatchHint.removePtf( s ); } } } else { INT << "Unknown solution " << p << endl; } } resolverProblem->addSolution (problemSolution, problemSolution->actionCount() > 1 ? true : false); // Solutions with more than 1 action will be shown first. MIL << "------------------------------------" << endl; } if (ignoreId > 0) { // There is a possibility to ignore this error by setting weak dependencies PoolItem item = _pool.find (sat::Solvable(ignoreId)); ProblemSolutionIgnore *problemSolution = new ProblemSolutionIgnore(item); resolverProblem->addSolution (problemSolution, false); // Solutions will be shown at the end MIL << "ignore some dependencies of " << item << endl; MIL << "------------------------------------" << endl; } // bsc#1194848 hint on ptf<>patch conflicts if ( ptfPatchHint.applies() ) { resolverProblem->setDescription( str::Str() << ptfPatchHint.description() << endl << "(" << resolverProblem->description() << ")" ); } // save problem resolverProblems.push_back (resolverProblem); } } return resolverProblems; } void SATResolver::applySolutions( const ProblemSolutionList & solutions ) { Resolver( _pool ).applySolutions( solutions ); } sat::StringQueue SATResolver::autoInstalled() const { sat::StringQueue ret; if ( _satSolver ) ::solver_get_userinstalled( _satSolver, ret, GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED ); return ret; } sat::StringQueue SATResolver::userInstalled() const { sat::StringQueue ret; if ( _satSolver ) ::solver_get_userinstalled( _satSolver, ret, GET_USERINSTALLED_NAMES ); return ret; } /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SATResolver.h000066400000000000000000000237511476576476200215260ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SATResolver.h * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_SAT_RESOLVER_H #define ZYPP_SOLVER_DETAIL_SAT_RESOLVER_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else extern "C" { #include #include } #include #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// namespace sat { class Transaction; } /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SATResolver /** * \todo The way solver options are passed as individual booleans from Resolver * via solver::detail::Resolver to SATResolver is pedestrian and error prone. * Introdce a dedicated solver option structure which is passed down as a whole. */ class SATResolver : public base::ReferenceCounted, private base::NonCopyable, private sat::detail::PoolMember { private: ResPool _pool; sat::detail::CPool *_satPool; sat::detail::CSolver *_satSolver; sat::detail::CQueue _jobQueue; // list of problematic items (orphaned) PoolItemList _problem_items; // list populated by calls to addPoolItemTo*() PoolItemList _items_to_install; PoolItemList _items_to_remove; PoolItemList _items_to_lock; PoolItemList _items_to_keep; // solve results PoolItemList _result_items_to_install; PoolItemList _result_items_to_remove; public: ResolverFocus _focus; // The resolver's general attitude bool _fixsystem:1; // repair errors in rpm dependency graph bool _allowdowngrade:1; // allow one to downgrade installed solvable bool _allownamechange:1; // allow one to change name of installed solvable bool _allowarchchange:1; // allow one to change architecture of installed solvables bool _allowvendorchange:1; // allow one to change vendor of installed solvables bool _allowuninstall:1; // allow removal of installed solvables bool _updatesystem:1; // update bool _noupdateprovide:1; // true: update packages needs not to provide old package bool _dosplitprovides:1; // true: consider legacy split provides bool _onlyRequires:1; // true: consider required packages only (but recommended namespaces) bool _ignorealreadyrecommended:1; // true: ignore recommended packages that were already recommended by the installed packages bool _distupgrade:1; bool _removeOrphaned:1; bool _removeUnneeded:1; bool _dup_allowdowngrade:1; // dup mode: allow one to downgrade installed solvable bool _dup_allownamechange:1; // dup mode: allow one to change name of installed solvable bool _dup_allowarchchange:1; // dup mode: allow one to change architecture of installed solvables bool _dup_allowvendorchange:1; // dup mode: allow one to change vendor of installed solvables bool _solveSrcPackages:1; // false: generate no job rule for source packages selected in the pool bool _cleandepsOnRemove:1; // whether removing a package should also remove no longer needed requirements private: bool _protectPTFs:1; // protect from accidental removal of PTFs if only @System is present (bsc#1203248) // ---------------------------------- methods std::string SATprobleminfoString (Id problem, std::string &detail, Id &ignoreId); std::string SATproblemRuleInfoString (Id rule, std::string &detail, Id &ignoreId); std::vector SATgetCompleteProblemInfoStrings ( Id problem ); void resetItemTransaction (PoolItem item); // Create a SAT solver and void solverInit(const PoolItemList & weakItems); void solverInitSetLocks(); void solverInitSetSystemRequirements(); void solverInitSetModeJobsAndFlags(); void solverAddJobsFromPool(); void solverAddJobsFromExtraQueues( const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps ); // common solver run with the _jobQueue; Save results back to pool bool solving(const CapabilitySet & requires_caps = CapabilitySet(), const CapabilitySet & conflict_caps = CapabilitySet()); // cleanup solver void solverEnd(); // Checking if this solvable/item has a buddy which reflect the real // user visible description of an item // e.g. The release package has a buddy to the concerning product item. // This user want's the message "Product foo conflicts with product bar" and // NOT "package release-foo conflicts with package release-bar" // So these functions return the concerning buddy (e.g. product item) sat::Solvable mapSolvable (const Id &id); PoolItem mapItem (const PoolItem &item); public: SATResolver (ResPool pool, sat::detail::CPool *satPool); virtual ~SATResolver(); // ---------------------------------- I/O virtual std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<(std::ostream& str, const SATResolver & obj) { return obj.dumpOn (str); } ResPool pool (void) const; void setPool (const ResPool & pool) { _pool = pool; } // solver run with pool selected items bool resolvePool(const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps, const PoolItemList & weakItems, const std::set & upgradeRepos ); // solver run with the given request queue bool resolveQueue(const SolverQueueItemList &requestQueue, const PoolItemList & weakItems ); // searching for new packages void doUpdate(); ResolverProblemList problems (); void applySolutions (const ProblemSolutionList &solutions); bool fixsystem () const {return _fixsystem;} void setFixsystem ( const bool fixsystem) { _fixsystem = fixsystem;} bool ignorealreadyrecommended () const {return _ignorealreadyrecommended;} void setIgnorealreadyrecommended ( const bool ignorealreadyrecommended) { _ignorealreadyrecommended = ignorealreadyrecommended;} bool distupgrade () const {return _distupgrade;} void setDistupgrade ( const bool distupgrade) { _distupgrade = distupgrade;} bool removeOrphaned () const {return _removeOrphaned;} void setRemoveOrphaned ( const bool removeOrphaned) { _removeOrphaned = removeOrphaned;} bool allowdowngrade () const {return _allowdowngrade;} void setAllowdowngrade ( const bool allowdowngrade) { _allowdowngrade = allowdowngrade;} bool allowarchchange () const {return _allowarchchange;} void setAllowarchchange ( const bool allowarchchange) { _allowarchchange = allowarchchange;} bool allowvendorchange () const {return _allowvendorchange;} void setAllowvendorchange ( const bool allowvendorchange) { _allowvendorchange = allowvendorchange;} bool allowuninstall () const {return _allowuninstall;} void setAllowuninstall ( const bool allowuninstall) { _allowuninstall = allowuninstall;} bool updatesystem () const {return _updatesystem;} void setUpdatesystem ( const bool updatesystem) { _updatesystem = updatesystem;} bool noupdateprovide () const {return _noupdateprovide;} void setNoupdateprovide ( const bool noupdateprovide) { _noupdateprovide = noupdateprovide;} bool dosplitprovides () const {return _dosplitprovides;} void setDosplitprovides ( const bool dosplitprovides) { _dosplitprovides = dosplitprovides;} bool onlyRequires () const {return _onlyRequires;} void setOnlyRequires ( const bool onlyRequires) { _onlyRequires = onlyRequires;} bool solveSrcPackages() const { return _solveSrcPackages; } void setSolveSrcPackages( bool state_r ) { _solveSrcPackages = state_r; } bool cleandepsOnRemove() const { return _cleandepsOnRemove; } void setCleandepsOnRemove( bool state_r ) { _cleandepsOnRemove = state_r; } PoolItemList problematicUpdateItems( void ) const { return _problem_items; } PoolItemList problematicUpdateItems() { return _problem_items; } PoolItemList resultItemsToInstall () { return _result_items_to_install; } PoolItemList resultItemsToRemove () { return _result_items_to_remove; } sat::StringQueue autoInstalled() const; sat::StringQueue userInstalled() const; public: /** Expert backdoor. */ sat::detail::CSolver * get() const { return _satSolver; } }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_SAT_RESOLVER_H libzypp-17.36.5/zypp/solver/detail/SolutionAction.cc000066400000000000000000000136511476576476200224630ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SolutionAction.cc * * Easy-to use interface to the ZYPP dependency resolver * * Copyright (C) 2000-2002 Ximian, Inc. * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp::solver::detail { /////////////////////////////////////////////////////////////////////// // class SolutionAction /////////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SolutionAction); SolutionAction::SolutionAction() {} SolutionAction::~SolutionAction() {} std::ostream & SolutionAction::dumpOn( std::ostream & os ) const { return os << "SolutionAction "; } PoolItem SolutionAction::item() const { return PoolItem(); } bool SolutionAction::skipsPatchesOnly() const { return false; } std::ostream & operator<<( std::ostream & str, const SolutionActionList & actionlist ) { for ( const auto & itemptr : actionlist ) str << *itemptr << std::endl; return str; } /////////////////////////////////////////////////////////////////////// // class TransactionSolutionAction /////////////////////////////////////////////////////////////////////// std::ostream & TransactionSolutionAction::dumpOn( std::ostream & str ) const { str << "TransactionSolutionAction: "; switch (_action) { case KEEP: str << "Keep " << _item; break; case INSTALL: str << "Install " << _item; break; case REMOVE: str << "Remove " << _item; break; case UNLOCK: str << "Unlock " << _item; break; case LOCK: str << "Lock " << _item; break; case REMOVE_EXTRA_REQUIRE: str << "Remove require " << _capability; break; case REMOVE_EXTRA_CONFLICT: str << "Remove conflict " << _capability; break; case ADD_SOLVE_QUEUE_ITEM: str << "Add SolveQueueItem " << _solverQueueItem; break; case REMOVE_SOLVE_QUEUE_ITEM: str << "Remove SolveQueueItem " << _solverQueueItem; break; } return str; } bool TransactionSolutionAction::execute( ResolverInternal & resolver ) const { bool ret = true; switch ( _action ) { case KEEP: _item.status().resetTransact( ResStatus::USER ); ret = _item.status().setTransact( false, ResStatus::APPL_HIGH ); // APPL_HIGH: Locking should not be saved permanently break; case INSTALL: if ( _item.status().isToBeUninstalled() ) ret = _item.status().setTransact( false, ResStatus::USER ); else _item.status().setToBeInstalled( ResStatus::USER ); break; case REMOVE: if ( _item.status().isToBeInstalled() ) { _item.status().setTransact( false, ResStatus::USER ); _item.status().setLock( true, ResStatus::USER ); // no other dependency can set it again } else if ( _item.status().isInstalled() ) _item.status().setToBeUninstalled( ResStatus::USER ); else _item.status().setLock( true,ResStatus::USER ); // no other dependency can set it again break; case UNLOCK: ret = _item.status().setLock( false, ResStatus::USER ); if ( !ret ) ERR << "Cannot unlock " << _item << endl; break; case LOCK: _item.status().resetTransact( ResStatus::USER ); ret = _item.status().setLock( true, ResStatus::APPL_HIGH ); // APPL_HIGH: Locking should not be saved permanently if ( !ret ) ERR << "Cannot lock " << _item << endl; break; case REMOVE_EXTRA_REQUIRE: resolver.removeExtraRequire( _capability ); break; case REMOVE_EXTRA_CONFLICT: resolver.removeExtraConflict( _capability ); break; case ADD_SOLVE_QUEUE_ITEM: resolver.addQueueItem( _solverQueueItem ); break; case REMOVE_SOLVE_QUEUE_ITEM: resolver.removeQueueItem( _solverQueueItem ); break; default: ERR << "Wrong TransactionKind" << endl; ret = false; break; } return ret; } bool TransactionSolutionAction::skipsPatchesOnly() const { return _action == KEEP && _item.isKind(); } /////////////////////////////////////////////////////////////////////// // class InjectSolutionAction /////////////////////////////////////////////////////////////////////// std::ostream & InjectSolutionAction::dumpOn( std::ostream & str ) const { str << "InjectSolutionAction: "; switch (_kind) { case WEAK: str << "Weak"; break; default: str << "Wrong kind"; break; } return str << " " << _item; } bool InjectSolutionAction::execute( ResolverInternal & resolver ) const { bool ret = true; switch (_kind) { case WEAK: // set item dependencies to weak resolver.addWeak( _item ); break; default: ERR << "No valid InjectSolutionAction kind found" << endl; ret = false; break; } return ret; } } // namespace zypp::solver::detail ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SolutionAction.h000066400000000000000000000123001476576476200223130ustar00rootroot00000000000000/* * * Easy-to use interface to the ZYPP dependency resolver * * Author: Stefan Hundhammer * **/ #ifndef ZYPP_SOLVER_DETAIL_SOLUTIONACTION_H #define ZYPP_SOLVER_DETAIL_SOLUTIONACTION_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else #include #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// class Resolver; DEFINE_PTR_TYPE(SolverQueueItem); DEFINE_PTR_TYPE(SolutionAction); typedef std::list SolutionActionList; /** * Abstract base class for one action of a problem solution. **/ class SolutionAction : public base::ReferenceCounted { protected: typedef Resolver ResolverInternal; SolutionAction(); public: virtual ~SolutionAction(); virtual std::ostream & dumpOn( std::ostream & str ) const; /** * Execute this action. * Returns 'true' on success, 'false' on error. **/ virtual bool execute( ResolverInternal & resolver ) const = 0; public: /** The PoolItem the solution refers to (if any). */ virtual PoolItem item() const; /** The solution contains only 'do not install patch:' actions. */ virtual bool skipsPatchesOnly() const; }; inline std::ostream & operator<<( std::ostream & str, const SolutionAction & action ) { return action.dumpOn( str ); } std::ostream & operator<<( std::ostream & str, const SolutionActionList & actionlist ); /** * A problem solution action that performs a transaction * (installs, removes, keep ...) one resolvable * (package, patch, pattern, product). **/ typedef enum { KEEP, INSTALL, REMOVE, UNLOCK, LOCK, REMOVE_EXTRA_REQUIRE, REMOVE_EXTRA_CONFLICT, ADD_SOLVE_QUEUE_ITEM, REMOVE_SOLVE_QUEUE_ITEM, } TransactionKind; class TransactionSolutionAction: public SolutionAction { public: TransactionSolutionAction( PoolItem item, TransactionKind action ) : SolutionAction() , _action( action ) , _item( item ) {} TransactionSolutionAction( Capability capability, TransactionKind action ) : SolutionAction() , _action( action ) , _capability( capability ) {} TransactionSolutionAction( SolverQueueItem_Ptr item, TransactionKind action ) : SolutionAction() , _action( action ) , _solverQueueItem( item ) {} TransactionSolutionAction( TransactionKind action ) : SolutionAction() , _action( action ) {} std::ostream & dumpOn( std::ostream & str ) const override; bool execute( ResolverInternal & resolver ) const override; public: PoolItem item() const override { return _item; } bool skipsPatchesOnly() const override; protected: const TransactionKind _action; PoolItem _item; Capability _capability; SolverQueueItem_Ptr _solverQueueItem; }; /** * Type of ignoring; currently only WEAK **/ typedef enum { WEAK } InjectSolutionKind; /** * A problem solution action that injects an artificial "provides" to * the pool to satisfy open requirements or remove the conflict of * concerning resolvable * * This is typically used by "ignore" (user override) solutions. **/ class InjectSolutionAction: public SolutionAction { public: InjectSolutionAction( PoolItem item, const InjectSolutionKind & kind ) : SolutionAction() , _kind( kind ) , _item( item ) {} std::ostream & dumpOn( std::ostream & str ) const override; bool execute( ResolverInternal & resolver ) const override; public: PoolItem item() const override { return _item; } protected: const InjectSolutionKind _kind; PoolItem _item; }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_SOLUTIONACTION_H libzypp-17.36.5/zypp/solver/detail/SolverQueueItem.cc000066400000000000000000000066261476576476200226130ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SolverQueueItem.cc * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ extern "C" { #include } #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SolverQueueItem); //--------------------------------------------------------------------------- std::ostream & SolverQueueItem::dumpOn( std::ostream & os ) const { switch (_type) { case QUEUE_ITEM_TYPE_UNKNOWN : os << "unknown"; break; case QUEUE_ITEM_TYPE_UPDATE : os << "update"; break; case QUEUE_ITEM_TYPE_LOCK : os << "lock"; break; case QUEUE_ITEM_TYPE_INSTALL : os << "install"; break; case QUEUE_ITEM_TYPE_DELETE : os << "delete"; break; case QUEUE_ITEM_TYPE_INSTALL_ONE_OF: os << "install one of"; break; default: os << "?solverqueueitem?"; break; } return os; } std::ostream& operator<<( std::ostream & os, const SolverQueueItemList & itemlist ) { for (SolverQueueItemList::const_iterator iter = itemlist.begin(); iter != itemlist.end(); ++iter) { if (iter != itemlist.begin()) os << "," << endl << "\t"; os << **iter; } return os; } //--------------------------------------------------------------------------- SolverQueueItem::SolverQueueItem (SolverQueueItemType type, ResPool pool) : _type (type) , _pool (std::move(pool)) { } SolverQueueItem::~SolverQueueItem() { } //--------------------------------------------------------------------------- void SolverQueueItem::copy (const SolverQueueItem *from) { } //--------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SolverQueueItem.h000066400000000000000000000104461476576476200224500ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* QueueItem.h * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_QUEUEITEM_H #define ZYPP_SOLVER_DETAIL_QUEUEITEM_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else #include #include #include #include #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(SolverQueueItem); DEFINE_PTR_TYPE(SolverQueueItemUpdate); DEFINE_PTR_TYPE(SolverQueueItemDelete); DEFINE_PTR_TYPE(SolverQueueItemInstall); DEFINE_PTR_TYPE(SolverQueueItemInstallOneOf); DEFINE_PTR_TYPE(SolverQueueItemLock); typedef enum { QUEUE_ITEM_TYPE_UNKNOWN = 0, QUEUE_ITEM_TYPE_UPDATE, QUEUE_ITEM_TYPE_INSTALL, QUEUE_ITEM_TYPE_DELETE, QUEUE_ITEM_TYPE_INSTALL_ONE_OF, QUEUE_ITEM_TYPE_LOCK } SolverQueueItemType; typedef std::list SolverQueueItemList; #define CMP(a,b) (((a) < (b)) - ((b) < (a))) /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolverQueueItem class SolverQueueItem : public base::ReferenceCounted, private base::NonCopyable { private: SolverQueueItemType _type; ResPool _pool; protected: SolverQueueItem (SolverQueueItemType type, ResPool pool); public: virtual ~SolverQueueItem(); // ---------------------------------- I/O virtual std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<(std::ostream & str, const SolverQueueItem & obj) { return obj.dumpOn (str); } friend std::ostream& operator<<(std::ostream & str, const SolverQueueItemList & itemlist); // ---------------------------------- accessors ResPool pool (void) const { return _pool; } // ---------------------------------- methods void copy (const SolverQueueItem *from); bool isDelete (void) const { return _type == QUEUE_ITEM_TYPE_DELETE; } bool isInstall (void) const { return _type == QUEUE_ITEM_TYPE_INSTALL; } bool isUpdate (void) const { return _type == QUEUE_ITEM_TYPE_UPDATE; } bool isLock (void) const { return _type == QUEUE_ITEM_TYPE_LOCK; } bool isInstallOneOf (void) const { return _type == QUEUE_ITEM_TYPE_INSTALL_ONE_OF; } virtual SolverQueueItem_Ptr copy (void) const = 0; virtual bool addRule (sat::detail::CQueue & q) =0 ; virtual int cmp (SolverQueueItem_constPtr item) const = 0; int compare (SolverQueueItem_constPtr item) const { return CMP(_type, item->_type); } }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_QUEUEITEM_H libzypp-17.36.5/zypp/solver/detail/SolverQueueItemDelete.cc000066400000000000000000000076331476576476200237350ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SolverQueueItem.cc * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ extern "C" { #include } #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SolverQueueItemDelete); //--------------------------------------------------------------------------- std::ostream & SolverQueueItemDelete::dumpOn( std::ostream & os ) const { os << "[" << (_soft?"Soft":"") << "Delete: " << _name << "]"; return os; } //--------------------------------------------------------------------------- SolverQueueItemDelete::SolverQueueItemDelete (const ResPool & pool, std::string name, bool soft) : SolverQueueItem (QUEUE_ITEM_TYPE_DELETE, pool) , _name (std::move(name)) , _soft (soft) { } SolverQueueItemDelete::~SolverQueueItemDelete() { } //--------------------------------------------------------------------------- bool SolverQueueItemDelete::addRule (sat::detail::CQueue & q) { #define MAYBE_CLEANDEPS (pool().resolver().cleandepsOnRemove()?SOLVER_CLEANDEPS:0) ::Id id = IdString(_name).id(); if (_soft) { queue_push( &(q), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | SOLVER_WEAK | MAYBE_CLEANDEPS ); } else { queue_push( &(q), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | MAYBE_CLEANDEPS ); } queue_push( &(q), id); MIL << "Delete " << _name << (_soft ? "(soft)" : "") << " with SAT-Pool: " << id << endl; return true; } SolverQueueItem_Ptr SolverQueueItemDelete::copy (void) const { SolverQueueItemDelete_Ptr new_delete = new SolverQueueItemDelete (pool(), _name); new_delete->SolverQueueItem::copy(this); new_delete->_soft = _soft; return new_delete; } int SolverQueueItemDelete::cmp (SolverQueueItem_constPtr item) const { int cmp = this->compare (item); if (cmp != 0) return cmp; SolverQueueItemDelete_constPtr del = dynamic_pointer_cast(item); if (_name != del->_name) { return _name.compare(del->_name); } return 0; } //--------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SolverQueueItemDelete.h000066400000000000000000000057311476576476200235740ustar00rootroot00000000000000 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* QueueItem.h * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_QUEUEITEMDELETE_H #define ZYPP_SOLVER_DETAIL_QUEUEITEMDELETE_H #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolverQueueItemDelete class ZYPP_API_DEPTESTOMATIC SolverQueueItemDelete : public SolverQueueItem { private: std::string _name; bool _soft; // if triggered by a soft requirement (a recommends) public: SolverQueueItemDelete (const ResPool & pool, std::string name, bool soft = false); virtual ~SolverQueueItemDelete(); // ---------------------------------- I/O virtual std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<(std::ostream & str, const SolverQueueItemDelete & obj) { return obj.dumpOn (str); } // ---------------------------------- accessors bool isSoft (void) const { return _soft; } // ---------------------------------- methods virtual bool addRule (sat::detail::CQueue & q); virtual SolverQueueItem_Ptr copy (void) const; virtual int cmp (SolverQueueItem_constPtr item) const; }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_SOLVER_DETAIL_QUEUEITEMDELETE_H libzypp-17.36.5/zypp/solver/detail/SolverQueueItemInstall.cc000066400000000000000000000075051476576476200241370ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SolverQueueItem.cc * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ extern "C" { #include } #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SolverQueueItemInstall); //--------------------------------------------------------------------------- std::ostream & SolverQueueItemInstall::dumpOn( std::ostream & os ) const { os << "[" << (_soft?"Soft":"") << "Install: " << _name << "]"; return os; } //--------------------------------------------------------------------------- SolverQueueItemInstall::SolverQueueItemInstall (const ResPool & pool, std::string name, bool soft) : SolverQueueItem (QUEUE_ITEM_TYPE_INSTALL, pool) , _name (std::move(name)) , _soft (soft) { } SolverQueueItemInstall::~SolverQueueItemInstall() { } //--------------------------------------------------------------------------- bool SolverQueueItemInstall::addRule (sat::detail::CQueue & q) { ::Id id = IdString(_name).id(); if (_soft) { queue_push( &(q), SOLVER_INSTALL | SOLVER_SOLVABLE_NAME | SOLVER_WEAK ); } else { queue_push( &(q), SOLVER_INSTALL | SOLVER_SOLVABLE_NAME ); } queue_push( &(q), id); MIL << "Install " << _name << (_soft ? "(soft)" : "") << " with SAT-PoolID: " << id << endl; return true; } SolverQueueItem_Ptr SolverQueueItemInstall::copy (void) const { SolverQueueItemInstall_Ptr new_install = new SolverQueueItemInstall (pool(), _name); new_install->SolverQueueItem::copy(this); new_install->_soft = _soft; return new_install; } int SolverQueueItemInstall::cmp (SolverQueueItem_constPtr item) const { int cmp = this->compare (item); if (cmp != 0) return cmp; SolverQueueItemInstall_constPtr ins = dynamic_pointer_cast(item); if (_name != ins->_name) { return _name.compare(ins->_name); } return 0; } //--------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SolverQueueItemInstall.h000066400000000000000000000057401476576476200240000ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* QueueItem.h * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_QUEUEITEMINSTALL_H #define ZYPP_SOLVER_DETAIL_QUEUEITEMINSTALL_H #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolverQueueItemInstall class ZYPP_API_DEPTESTOMATIC SolverQueueItemInstall : public SolverQueueItem { private: std::string _name; bool _soft; // if triggered by a soft requirement (a recommends) public: SolverQueueItemInstall (const ResPool & pool, std::string name, bool soft = false); virtual ~SolverQueueItemInstall(); // ---------------------------------- I/O virtual std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<(std::ostream & str, const SolverQueueItemInstall & obj) { return obj.dumpOn (str); } // ---------------------------------- accessors bool isSoft (void) const { return _soft; } // ---------------------------------- methods virtual bool addRule (sat::detail::CQueue & q); virtual SolverQueueItem_Ptr copy (void) const; virtual int cmp (SolverQueueItem_constPtr item) const; }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_SOLVER_DETAIL_QUEUEITEMINSTALL_H libzypp-17.36.5/zypp/solver/detail/SolverQueueItemInstallOneOf.cc000066400000000000000000000111331476576476200250560ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SolverQueueItem.cc * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ extern "C" { #include } #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SolverQueueItemInstallOneOf); //--------------------------------------------------------------------------- std::ostream & SolverQueueItemInstallOneOf::dumpOn( std::ostream & os ) const { os << "[" << (_soft?"Soft":"") << "InstallOneOf: "; for (PoolItemList::const_iterator iter = _oneOfList.begin(); iter != _oneOfList.end(); iter++) os << *iter; os << "]"; return os; } //--------------------------------------------------------------------------- SolverQueueItemInstallOneOf::SolverQueueItemInstallOneOf (const ResPool & pool, PoolItemList itemList, bool soft) : SolverQueueItem (QUEUE_ITEM_TYPE_INSTALL_ONE_OF, pool) , _oneOfList (std::move(itemList)) , _soft (soft) { } SolverQueueItemInstallOneOf::~SolverQueueItemInstallOneOf() { } //--------------------------------------------------------------------------- bool SolverQueueItemInstallOneOf::addRule (sat::detail::CQueue & q) { bool ret = true; MIL << "Install one of " << (_soft ? "(soft):" : ":")<< endl; Queue qs; if (_soft) { queue_push( &(q), SOLVER_INSTALL | SOLVER_SOLVABLE_ONE_OF | SOLVER_WEAK); } else { queue_push( &(q), SOLVER_INSTALL | SOLVER_SOLVABLE_ONE_OF ); } queue_init(&qs); for (PoolItemList::const_iterator iter = _oneOfList.begin(); iter != _oneOfList.end(); iter++) { Id id = (*iter)->satSolvable().id(); if (id == ID_NULL) { ERR << *iter << " not found" << endl; ret = false; } else { MIL << " candidate:" << *iter << " with the SAT-Pool ID: " << id << endl; queue_push( &(qs), id ); } } sat::Pool satPool( sat::Pool::instance() ); queue_push( &(q), pool_queuetowhatprovides(satPool.get(), &qs)); queue_free(&qs); return ret; } SolverQueueItem_Ptr SolverQueueItemInstallOneOf::copy (void) const { SolverQueueItemInstallOneOf_Ptr new_installOneOf = new SolverQueueItemInstallOneOf (pool(), _oneOfList); new_installOneOf->SolverQueueItem::copy(this); new_installOneOf->_soft = _soft; return new_installOneOf; } int SolverQueueItemInstallOneOf::cmp (SolverQueueItem_constPtr item) const { int cmp = this->compare (item); if (cmp != 0) return cmp; SolverQueueItemInstallOneOf_constPtr install = dynamic_pointer_cast(item); return (_oneOfList == install->_oneOfList) ? 0 : -1; // more evaluation would be not useful } //--------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SolverQueueItemInstallOneOf.h000066400000000000000000000061421476576476200247240ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* QueueItem.h * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_QUEUEITEMINSTALLONEOF_H #define ZYPP_SOLVER_DETAIL_QUEUEITEMINSTALLONEOF_H #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolverQueueItemInstallOneOf class ZYPP_API_DEPTESTOMATIC SolverQueueItemInstallOneOf : public SolverQueueItem { public: typedef std::list PoolItemList; private: PoolItemList _oneOfList; // List of candidates bool _soft; // if triggered by a soft requirement (a recommends) public: SolverQueueItemInstallOneOf (const ResPool & pool, PoolItemList itemList, bool soft = false); virtual ~SolverQueueItemInstallOneOf(); // ---------------------------------- I/O virtual std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<(std::ostream & str, const SolverQueueItemInstallOneOf & obj) { return obj.dumpOn (str); } // ---------------------------------- accessors bool isSoft (void) const { return _soft; } // ---------------------------------- methods virtual bool addRule (sat::detail::CQueue & q); virtual SolverQueueItem_Ptr copy (void) const; virtual int cmp (SolverQueueItem_constPtr item) const; }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_SOLVER_DETAIL_QUEUEITEMINSTALLONEOF_H libzypp-17.36.5/zypp/solver/detail/SolverQueueItemLock.cc000066400000000000000000000100131476576476200234050ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SolverQueueItem.cc * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ extern "C" { #include } #define ZYPP_USE_RESOLVER_INTERNALS #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SolverQueueItemLock); //--------------------------------------------------------------------------- std::ostream & SolverQueueItemLock::dumpOn( std::ostream & os ) const { os << "[" << (_soft?"Soft":"") << "Lock: " << _item << "]"; return os; } //--------------------------------------------------------------------------- SolverQueueItemLock::SolverQueueItemLock (const ResPool & pool, const PoolItem & item, bool soft) : SolverQueueItem (QUEUE_ITEM_TYPE_LOCK, pool) , _item (item) , _soft (soft) { } SolverQueueItemLock::~SolverQueueItemLock() { } //--------------------------------------------------------------------------- bool SolverQueueItemLock::addRule (sat::detail::CQueue & q) { ::Id id = _item.satSolvable().id(); if (id == ID_NULL) { ERR << "Lock : " << _item << " not found" << endl; return false; } MIL << "Lock " << _item << " with the SAT-Pool ID: " << id << endl; if (_item.status().isInstalled()) { if (_soft) { queue_push( &(q), SOLVER_INSTALL | SOLVER_SOLVABLE | SOLVER_WEAK ); } else { queue_push( &(q), SOLVER_INSTALL | SOLVER_SOLVABLE ); } } else { if (_soft) { queue_push( &(q), SOLVER_ERASE | SOLVER_SOLVABLE | SOLVER_WEAK ); } else { queue_push( &(q), SOLVER_ERASE | SOLVER_SOLVABLE ); } } queue_push( &(q), id ); return true; } SolverQueueItem_Ptr SolverQueueItemLock::copy (void) const { SolverQueueItemLock_Ptr new_lock = new SolverQueueItemLock (pool(), _item); new_lock->SolverQueueItem::copy(this); new_lock->_soft = _soft; return new_lock; } int SolverQueueItemLock::cmp (SolverQueueItem_constPtr item) const { int cmp = this->compare (item); if (cmp != 0) return cmp; SolverQueueItemLock_constPtr lock = dynamic_pointer_cast(item); return compareByNVRA (_item, lock->_item); } //--------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SolverQueueItemLock.h000066400000000000000000000057761476576476200232730ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* QueueItem.h * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_QUEUEITEMLOCK_H #define ZYPP_SOLVER_DETAIL_QUEUEITEMLOCK_H #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolverQueueItemLock class ZYPP_API_DEPTESTOMATIC SolverQueueItemLock : public SolverQueueItem { private: PoolItem _item; // the item to-be-locked bool _soft; // if triggered by a soft requirement (a recommends) public: SolverQueueItemLock (const ResPool & pool, const PoolItem & item, bool soft = false); virtual ~SolverQueueItemLock(); // ---------------------------------- I/O virtual std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<(std::ostream & str, const SolverQueueItemLock & obj) { return obj.dumpOn (str); } // ---------------------------------- accessors bool isSoft (void) const { return _soft; } // ---------------------------------- methods virtual bool addRule (sat::detail::CQueue & q); virtual SolverQueueItem_Ptr copy (void) const; virtual int cmp (SolverQueueItem_constPtr item) const; }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_SOLVER_DETAIL_QUEUEITEMLOCK_H libzypp-17.36.5/zypp/solver/detail/SolverQueueItemUpdate.cc000066400000000000000000000073121476576476200237470ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* SolverQueueItem.cc * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA * 02111-1307, USA. */ extern "C" { #include } #define ZYPP_USE_RESOLVER_INTERNALS #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(SolverQueueItemUpdate); //--------------------------------------------------------------------------- std::ostream & SolverQueueItemUpdate::dumpOn( std::ostream & os ) const { os << "[" << (_soft?"Soft":"") << "Update: " << _item << "]"; return os; } //--------------------------------------------------------------------------- SolverQueueItemUpdate::SolverQueueItemUpdate (const ResPool & pool, const PoolItem & item, bool soft) : SolverQueueItem (QUEUE_ITEM_TYPE_UPDATE, pool) , _item (item) , _soft (soft) { } SolverQueueItemUpdate::~SolverQueueItemUpdate() { } //--------------------------------------------------------------------------- bool SolverQueueItemUpdate::addRule (sat::detail::CQueue & q) { ::Id id = _item.satSolvable().id(); if (id == ID_NULL) { ERR << "Update explicit: " << _item << " not found" << endl; return false; } MIL << "Update explicit " << _item << " with the SAT-Pool ID: " << id << endl; queue_push( &(q), SOLVER_UPDATE | SOLVER_SOLVABLE ); queue_push( &(q), id ); return true; } SolverQueueItem_Ptr SolverQueueItemUpdate::copy (void) const { SolverQueueItemUpdate_Ptr new_update = new SolverQueueItemUpdate (pool(), _item); new_update->SolverQueueItem::copy(this); new_update->_soft = _soft; return new_update; } int SolverQueueItemUpdate::cmp (SolverQueueItem_constPtr item) const { int cmp = this->compare (item); if (cmp != 0) return cmp; SolverQueueItemUpdate_constPtr update = dynamic_pointer_cast(item); return compareByNVRA (_item, update->_item); } //--------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SolverQueueItemUpdate.h000066400000000000000000000060171476576476200236120ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* QueueItem.h * * Copyright (C) 2008 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_QUEUEITEMUPDATE_H #define ZYPP_SOLVER_DETAIL_QUEUEITEMUPDATE_H #include #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SolverQueueItemUpdate class ZYPP_API_DEPTESTOMATIC SolverQueueItemUpdate : public SolverQueueItem { private: PoolItem _item; // the item to-be-updated bool _soft; // if triggered by a soft requirement (a recommends) public: SolverQueueItemUpdate (const ResPool & pool, const PoolItem & item, bool soft = false); virtual ~SolverQueueItemUpdate(); // ---------------------------------- I/O virtual std::ostream & dumpOn( std::ostream & str ) const; friend std::ostream& operator<<(std::ostream & str, const SolverQueueItemUpdate & obj) { return obj.dumpOn (str); } // ---------------------------------- accessors bool isSoft (void) const { return _soft; } // ---------------------------------- methods virtual bool addRule (sat::detail::CQueue & q); virtual SolverQueueItem_Ptr copy (void) const; virtual int cmp (SolverQueueItem_constPtr item) const; }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_SOLVER_DETAIL_QUEUEITEMUPDATE_H libzypp-17.36.5/zypp/solver/detail/SystemCheck.cc000066400000000000000000000125171476576476200217330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/solver/detail/SystemCheck.cc * */ #include #include #include #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// Pathname _file = ""; Pathname _dir = ""; CapabilitySet _require; CapabilitySet _conflict; using CapList = std::vector; const SystemCheck & SystemCheck::instance() { static SystemCheck _val; return _val; } SystemCheck::SystemCheck() { if (_file.empty()) { _file = ZConfig::instance().solver_checkSystemFile(); loadFile(_file); } if (_dir.empty()) { _dir = ZConfig::instance().solver_checkSystemFileDir(); loadFiles(); } } bool SystemCheck::setFile(const Pathname & file) const{ MIL << "Setting checkFile to : " << file << endl; _file = file; loadFile(_file); return true; } bool SystemCheck::setDir(const Pathname & dir) const { MIL << "Setting checkFile directory to : " << dir << endl; loadFile(_file); _dir = dir; loadFiles(); return true; } const Pathname & SystemCheck::file() { return _file; } const Pathname & SystemCheck::dir() { return _dir; } const CapabilitySet & SystemCheck::requiredSystemCap() const{ return _require; } const CapabilitySet & SystemCheck::conflictSystemCap() const{ return _conflict; } bool SystemCheck::loadFile(Pathname & file, bool reset_caps) const{ Target_Ptr trg( getZYpp()->getTarget() ); if ( trg ) file = trg->assertRootPrefix( file ); PathInfo pi( file ); if ( ! pi.isFile() ) { WAR << "Can't read " << file << " " << pi << endl; return false; } if (reset_caps) { _require.clear(); _conflict.clear(); } std::ifstream infile( file.c_str() ); for( iostr::EachLine in( infile ); in; in.next() ) { std::string l( str::trim(*in) ); if ( ! l.empty() && l[0] != '#' ) { CapList capList; str::split( l, back_inserter(capList), ":" ); if (capList.size() == 2 ) { CapList::iterator it = capList.begin(); if (*it == "requires") { _require.insert(Capability(*(it+1))); } else if (*it == "conflicts") { _conflict.insert(Capability(*(it+1))); } else { ERR << "Wrong parameter: " << l << endl; } } else { ERR << "Wrong line: " << l << endl; } } } MIL << "Read " << pi << endl; return true; } bool SystemCheck::loadFiles() const { filesystem::dirForEach(_dir, [this](const Pathname & dir_r, const char *const & name_r)->bool { const std::string wanted = ".check"; Pathname pth = dir_r/name_r; if (pth.extension() != wanted) { MIL << "Skipping " << pth << " (not a *.check file)" << endl; return true; } else { MIL << "Reading " << pth << endl; return loadFile(pth, false /* do not reset caps */); } }); return true; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const SystemCheck & obj ) { str << _file << endl; str << "requires" << endl; for (CapabilitySet::const_iterator it = _require.begin(); it != _require.end(); ++it) str << " " << *it << endl; str << "conflicts" << endl; for (CapabilitySet::const_iterator it = _conflict.begin(); it != _conflict.end(); ++it) str << " " << *it << endl; return str; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/SystemCheck.h000066400000000000000000000053651476576476200216000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/SystemCheck.h * */ #ifndef ZYPP_TARGET_SYSTEMCHECK_H #define ZYPP_TARGET_SYSTEMCHECK_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SystemCheck // /** Save and restore locale set from file. */ class SystemCheck : private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const SystemCheck & obj ); public: /** Singleton */ static const SystemCheck & instance(); /** Return the file path. */ const Pathname & file(); /** Return the directory path. */ const Pathname & dir(); /** Set configuration file of system requirements * Should be used for testcase only */ bool setFile(const Pathname & file) const; /** Set configuration directory for files of system * requirements. * Should be used for testcase only */ bool setDir(const Pathname & dir) const; /** Returns a list of required system capabilities. */ const CapabilitySet & requiredSystemCap() const; /** Returns a list of conflicting system capabilities. */ const CapabilitySet & conflictSystemCap() const; private: /** Ctor taking the file to read. */ SystemCheck(); bool loadFile(Pathname &file, bool reset_caps = true) const; bool loadFiles() const; }; /////////////////////////////////////////////////////////////////// /** \relates SystemCheck Stream output */ std::ostream & operator<<( std::ostream & str, const SystemCheck & obj ); ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_TARGET_SYSTEMCHECK_H libzypp-17.36.5/zypp/solver/detail/Testcase.cc000066400000000000000000000376441476576476200212740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/solver/detail/Testcase.cc * */ #include #include #include #include #include #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { #include } using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// //--------------------------------------------------------------------------- Testcase::Testcase() :dumpPath("/var/log/YaST2/solverTestcase") {} Testcase::Testcase(std::string path) :dumpPath(std::move(path)) {} Testcase::~Testcase() {} bool Testcase::createTestcase(Resolver & resolver, bool dumpPool, bool runSolver) { // libzypp/issues/317: make sure a satsolver instance is actually present if ( not resolver.get() ) { WAR << "Can't createTestcase if the satsolver is not yet initialized." << endl; return false; } MIL << "createTestcase at " << dumpPath << (dumpPool?" dumpPool":"") << (runSolver?" runSolver":"") << endl; PathInfo path (dumpPath); if ( !path.isExist() ) { if (zypp::filesystem::assert_dir (dumpPath)!=0) { ERR << "Cannot create directory " << dumpPath << endl; return false; } } else { if (!path.isDir()) { ERR << dumpPath << " is not a directory." << endl; return false; } // remove old stuff if pool will be dump if (dumpPool) zypp::filesystem::clean_dir (dumpPath); } if (runSolver) { zypp::base::LogControl::TmpLineWriter tempRedirect; zypp::base::LogControl::instance().logfile( dumpPath +"/y2log" ); zypp::base::LogControl::TmpExcessive excessive; resolver.resolvePool(); } ResPool pool = resolver.pool(); PoolItemList items_to_install; PoolItemList items_to_remove; PoolItemList items_locked; PoolItemList items_keep; const std::string slvTestcaseName = "testcase.t"; const std::string slvResult = "solver.result"; zypp::AutoDispose repoFileNames( testcase_mangle_repo_names( resolver.get()->pool ), [ nrepos = resolver.get()->pool->nrepos ]( auto **x ){ if (!x) return; for ( int i = 1; i < nrepos; i++ ) solv_free((void *)x[i]); solv_free((void *)x); }); if ( ::testcase_write( resolver.get(), dumpPath.c_str(), TESTCASE_RESULT_TRANSACTION | TESTCASE_RESULT_PROBLEMS, slvTestcaseName.c_str(), slvResult.c_str() ) == 0 ) { ERR << "Failed to write solv data, aborting." << endl; return false; } // HACK: directly access sat::pool const sat::Pool & satpool( sat::Pool::instance() ); YAML::Emitter yOut; const auto addTag = [&]( const std::string & tag_r, bool yesno_r = true ){ yOut << YAML::Key << tag_r << YAML::Value << yesno_r; }; yOut << YAML::BeginMap << YAML::Key << "version" << YAML::Value << "1.0"; yOut << YAML::Key << "setup" << YAML::Value << YAML::BeginMap; yOut << YAML::Key << "channels"; yOut << YAML::Value << YAML::BeginSeq; std::set repos; for ( const PoolItem & pi : pool ) { if ( pi.status().isToBeInstalled() && !(pi.status().isBySolver())) { items_to_install.push_back( pi ); } if ( pi.status().isKept() && !(pi.status().isBySolver())) { items_keep.push_back( pi ); } if ( pi.status().isToBeUninstalled() && !(pi.status().isBySolver())) { items_to_remove.push_back( pi ); } if ( pi.status().isLocked() && !(pi.status().isBySolver())) { items_locked.push_back( pi ); } const auto &myRepo = pi.repository(); const auto &myRepoInfo = myRepo.info(); if ( repos.find( myRepo.id()) == repos.end() ) { repos.insert( myRepo.id() ); yOut << YAML::Value << YAML::BeginMap; yOut << YAML::Key << "alias" << YAML::Value << myRepo.alias(); yOut << YAML::Key << "url" << YAML::BeginSeq; for ( auto itUrl = myRepoInfo.baseUrlsBegin(); itUrl != myRepoInfo.baseUrlsEnd(); ++itUrl ) { yOut << YAML::Value << itUrl->asString(); } yOut << YAML::EndSeq; yOut << YAML::Key << "path" << YAML::Value << myRepoInfo.path().asString(); yOut << YAML::Key << "type" << YAML::Value << myRepoInfo.type().asString(); yOut << YAML::Key << "generated" << YAML::Value << myRepo.generatedTimestamp().form( "%Y-%m-%d %H:%M:%S" ); yOut << YAML::Key << "outdated" << YAML::Value << myRepo.suggestedExpirationTimestamp().form( "%Y-%m-%d %H:%M:%S" ); yOut << YAML::Key << "priority" << YAML::Value << myRepoInfo.priority(); yOut << YAML::Key << "file" << YAML::Value << str::Format("%1%.repo.gz") % repoFileNames[myRepo.id()->repoid]; yOut << YAML::EndMap; } } yOut << YAML::EndSeq; yOut << YAML::Key << "arch" << YAML::Value << ZConfig::instance().systemArchitecture().asString() ; yOut << YAML::Key << "solverTestcase" << YAML::Value << slvTestcaseName ; yOut << YAML::Key << "solverResult" << YAML::Value << slvResult ; // RequestedLocales const LocaleSet & addedLocales( satpool.getAddedRequestedLocales() ); const LocaleSet & removedLocales( satpool.getRemovedRequestedLocales() ); const LocaleSet & requestedLocales( satpool.getRequestedLocales() ); yOut << YAML::Key << "locales" << YAML::Value << YAML::BeginSeq ; for ( const Locale& l : requestedLocales ) { yOut << YAML::Value << YAML::BeginMap; yOut << YAML::Key << "fate" << YAML::Value << ( addedLocales.count(l) ? "added" : "" ) ; yOut << YAML::Key << "name" << YAML::Value << l.asString() ; yOut << YAML::EndMap; } for ( const Locale& l : removedLocales ) { yOut << YAML::Value << YAML::BeginMap; yOut << YAML::Key << "fate" << YAML::Value << "removed" ; yOut << YAML::Key << "name" << YAML::Value << l.asString() ; yOut << YAML::EndMap; } yOut << YAML::EndSeq; // locales // Vendor settings yOut << YAML::Key << "vendors" << YAML::Value << YAML::BeginSeq ; VendorAttr::instance().foreachVendorList( [&]( const VendorAttr::VendorList& vlist )->bool { if ( ! vlist.empty() ) { yOut << YAML::Value << YAML::BeginSeq; for( const auto & v : vlist ) yOut << YAML::Value << v ; yOut << YAML::EndSeq; } return true; } ); yOut << YAML::EndSeq; // vendors // helper lambda to write a list of elements into a external file instead of the main file const auto &writeListOrFile = [&]( const std::string &name, const auto &list, const auto &callback ) { if ( list.size() > 10 ) { const std::string fName = str::Format("zypp-%1%.yaml") % name; yOut << YAML::Key << name << YAML::Value << fName; YAML::Emitter yOutFile; callback( yOutFile, list ); std::ofstream fout( dumpPath+"/"+fName ); fout << yOutFile.c_str(); } else { yOut << YAML::Key << name << YAML::Value ; callback( yOut, list ); } }; // AutoInstalled const auto &writeAutoInst = [] ( YAML::Emitter &out, const auto &autoInstalledList ) { out << YAML::BeginSeq; for ( IdString::IdType n : autoInstalledList ) { out << YAML::Value << IdString(n).asString() ; } out << YAML::EndSeq; }; writeListOrFile( "autoinst", satpool.autoInstalled(), writeAutoInst ); // ModAlias const auto &writeModalias = []( YAML::Emitter &out, const auto &modAliasList ){ out << YAML::BeginSeq; for ( const auto &modAlias : modAliasList ) { out << YAML::Value << modAlias ; } out << YAML::EndSeq; }; writeListOrFile( "modalias", target::Modalias::instance().modaliasList(), writeModalias ); // Multiversion const auto &writeMultiVersion = [] ( YAML::Emitter &out, const auto &multiversionList ) { out << YAML::BeginSeq; for ( const auto &multiver : multiversionList ) { out << YAML::Value << multiver ; } out << YAML::EndSeq; }; writeListOrFile( "multiversion", ZConfig::instance().multiversionSpec(), writeMultiVersion ); yOut << YAML::Key << "resolverFlags" << YAML::Value << YAML::BeginMap; yOut << YAML::Key << "focus" << YAML::Value << asString( resolver.focus() ); addTag( "ignorealreadyrecommended", resolver.ignoreAlreadyRecommended() ); addTag( "onlyRequires", resolver.onlyRequires() ); addTag( "forceResolve", resolver.forceResolve() ); addTag( "cleandepsOnRemove", resolver.cleandepsOnRemove() ); addTag( "allowDowngrade", resolver.allowDowngrade() ); addTag( "allowNameChange", resolver.allowNameChange() ); addTag( "allowArchChange", resolver.allowArchChange() ); addTag( "allowVendorChange", resolver.allowVendorChange() ); addTag( "dupAllowDowngrade", resolver.dupAllowDowngrade() ); addTag( "dupAllowNameChange", resolver.dupAllowNameChange() ); addTag( "dupAllowArchChange", resolver.dupAllowArchChange() ); addTag( "dupAllowVendorChange", resolver.dupAllowVendorChange() ); yOut << YAML::EndMap; // resolverFlags yOut << YAML::EndMap; // setup yOut << YAML::Key << "trials" << YAML::Value << YAML::BeginSeq; yOut << YAML::Value << YAML::BeginMap << YAML::Key << "trial" << YAML::Value; yOut << YAML::BeginSeq; const auto &writeJobsToFile = [&]( const std::string &fName, const auto &data, const auto &cb ){ yOut << YAML::Value << YAML::BeginMap; yOut << YAML::Key << "include" << YAML::Value << fName; yOut << YAML::EndMap; YAML::Emitter yOutFile; yOutFile << YAML::BeginSeq; cb( yOutFile, data ); yOutFile << YAML::EndSeq; std::ofstream fout( dumpPath+"/"+fName ); fout << yOutFile.c_str(); }; // Multiversion const auto &writePoolItemJobs = []( const std::string &jobName ){ return [ &jobName ] ( YAML::Emitter &yOut, const PoolItemList &poolItems, bool shortInfo = false ) { for ( const PoolItem & pi : poolItems ) { yOut << YAML::Value << YAML::BeginMap; std::stringstream status; status << pi.status(); yOut << YAML::Key << "job" << YAML::Value << jobName << YAML::Key << "kind" << YAML::Value << pi.kind().asString() << YAML::Key << "name" << YAML::Value << pi.name() << YAML::Key << "status" << YAML::Value << status.str(); if ( !shortInfo ) { yOut << YAML::Key << "channel" << YAML::Value << pi.repoInfo().alias() << YAML::Key << "arch" << YAML::Value << pi.arch().asString() << YAML::Key << "version" << YAML::Value << pi.edition().version() << YAML::Key << "release" << YAML::Value << pi.edition().release(); } yOut << YAML::EndMap; } }; }; const auto &writeMapJob = []( YAML::Emitter &yOut, const std::string &name, const std::map &values = std::map() ){ yOut << YAML::Value << YAML::BeginMap; yOut << YAML::Key << "job" << YAML::Value << name; for ( const auto &v : values ) yOut << YAML::Key << v.first << YAML::Value << v.second; yOut << YAML::EndMap; }; writePoolItemJobs("install")( yOut, items_to_install ); writePoolItemJobs("keep")( yOut, items_keep ); writePoolItemJobs("uninstall")( yOut, items_to_remove, true ); if ( items_locked.size() ) writeJobsToFile("zypp-locks.yaml", items_locked, writePoolItemJobs("lock") ); for ( const auto &v : resolver.extraRequires() ) writeMapJob( yOut, "addRequire", { { "name", v.asString() } } ); for ( const auto &v : SystemCheck::instance().requiredSystemCap() ) writeMapJob( yOut, "addRequire", { { "name", v.asString() } } ); for ( const auto &v : resolver.extraConflicts() ) writeMapJob( yOut, "addConflict", { { "name", v.asString() } } ); for ( const auto &v : SystemCheck::instance().conflictSystemCap() ) writeMapJob( yOut, "addConflict", { { "name", v.asString() } } ); for ( const auto &v : resolver.upgradeRepos() ) writeMapJob( yOut, "upgradeRepo", { { "name", v.alias() } } ); if ( resolver.isUpgradeMode() ) writeMapJob( yOut, "distupgrade" ); if ( resolver.isUpdateMode() ) writeMapJob( yOut, "update" ); if ( resolver.isVerifyingMode() ) writeMapJob( yOut, "verify" ); yOut << YAML::EndSeq; yOut << YAML::EndMap; // trial yOut << YAML::EndSeq; // trials list yOut << YAML::EndMap; // trials yOut << YAML::EndMap; // root std::ofstream fout( dumpPath+"/zypp-control.yaml" ); fout << yOut.c_str(); MIL << "createTestcase done at " << dumpPath << endl; return true; } /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/Testcase.h000066400000000000000000000047351476576476200211310ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/solver/detail/Testcase.h * */ #ifndef ZYPP_SOLVER_DETAIL_TESTCASE_H #define ZYPP_SOLVER_DETAIL_TESTCASE_H #ifndef ZYPP_USE_RESOLVER_INTERNALS #error Do not directly include this file! #else #include #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// class Resolver; /////////////////////////////////////////////////////////////////// // // CLASS NAME : Testcase /** * Generating a testcase of the current pool and solver state. **/ class ZYPP_API_DEPTESTOMATIC Testcase { private: std::string dumpPath; // Path of the generated testcase public: Testcase(); Testcase( std::string path ); ~Testcase(); bool createTestcase( Resolver & resolver, bool dumpPool = true, bool runSolver = true ); }; /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_USE_RESOLVER_INTERNALS #endif // ZYPP_SOLVER_DETAIL_TESTCASE_H libzypp-17.36.5/zypp/solver/detail/Testcase_helix.cc000066400000000000000000000516101476576476200224520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/solver/detail/Testcase.cc * */ #include #include #include #include #define ZYPP_USE_RESOLVER_INTERNALS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// namespace detail { /////////////////////////////////////////////////////////////////// #define TAB "\t" #define TAB2 "\t\t" using namespace zypp::str; //--------------------------------------------------------------------------- inline std::string xml_escape( const std::string &text ) { return zypp::xml::escape(text); } inline std::string xml_tag_enclose( const std::string &text, const std::string &tag, bool escape = false ) { std::string result; result += "<" + tag + ">"; if ( escape) result += xml_escape(text); else result += text; result += ""; return result; } template std::string helixXML( const T &obj ); //undefined template<> std::string helixXML( const Edition &edition ) { std::stringstream str; str << xml_tag_enclose(edition.version(), "version"); if (!edition.release().empty()) str << xml_tag_enclose(edition.release(), "release"); if (edition.epoch() != Edition::noepoch) str << xml_tag_enclose(numstring(edition.epoch()), "epoch"); return str.str(); } template<> std::string helixXML( const Arch &arch ) { std::stringstream str; str << xml_tag_enclose(arch.asString(), "arch"); return str.str(); } template<> std::string helixXML( const Capability &cap ) { std::stringstream str; CapDetail detail = cap.detail(); if (detail.isSimple()) { if (detail.isVersioned()) { str << "" << endl; } else { str << "" << endl; } } else if (detail.isExpression()) { if (detail.capRel() == CapDetail::CAP_AND && detail.lhs().detail().isNamed() && detail.rhs().detail().isNamed()) { // packageand dependency str << "" << endl; } else if (detail.capRel() == CapDetail::CAP_NAMESPACE && detail.lhs().id() == NAMESPACE_OTHERPROVIDERS) { str << "" << endl; } else { // modalias ? IdString packageName; if (detail.capRel() == CapDetail::CAP_AND) { packageName = IdString(detail.lhs().id()); detail = detail.rhs().detail(); } if (detail.capRel() == CapDetail::CAP_NAMESPACE && detail.lhs().id() == NAMESPACE_MODALIAS) { str << "" << endl; } else { str << "" << endl; } } } else { str << "" << endl; } return str.str(); } template<> std::string helixXML( const Capabilities &caps ) { std::stringstream str; Capabilities::const_iterator it = caps.begin(); str << endl; for ( ; it != caps.end(); ++it) { str << TAB2 << helixXML((*it)); } str << TAB; return str.str(); } template<> std::string helixXML( const CapabilitySet &caps ) { std::stringstream str; CapabilitySet::const_iterator it = caps.begin(); str << endl; for ( ; it != caps.end(); ++it) { str << TAB2 << helixXML((*it)); } str << TAB; return str.str(); } inline std::string helixXML( const PoolItem & obj, Dep deptag_r ) { std::stringstream out; Capabilities caps( obj[deptag_r] ); if ( ! caps.empty() ) out << TAB << xml_tag_enclose(helixXML(caps), deptag_r.asString()) << endl; return out.str(); } std::string helixXML( const PoolItem & item ) { std::stringstream str; str << "<" << item.kind() << ">" << endl; str << TAB << xml_tag_enclose( item.name(), "name", true ) << endl; str << TAB << xml_tag_enclose( item.vendor().asString(), "vendor", true ) << endl; str << TAB << xml_tag_enclose( item.buildtime().asSeconds(), "buildtime", true ) << endl; if ( isKind( item ) ) { str << TAB << "" << endl << TAB << "" << endl; str << TAB2 << helixXML( item.arch() ) << endl; str << TAB2 << helixXML( item.edition() ) << endl; str << TAB << "" << endl << TAB << "" << endl; } else { str << TAB << helixXML( item.arch() ) << endl; str << TAB << helixXML( item.edition() ) << endl; } str << helixXML( item, Dep::PROVIDES ); str << helixXML( item, Dep::PREREQUIRES ); str << helixXML( item, Dep::CONFLICTS ); str << helixXML( item, Dep::OBSOLETES ); str << helixXML( item, Dep::REQUIRES ); str << helixXML( item, Dep::RECOMMENDS ); str << helixXML( item, Dep::ENHANCES ); str << helixXML( item, Dep::SUPPLEMENTS ); str << helixXML( item, Dep::SUGGESTS ); str << "" << endl; return str.str(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : HelixResolvable /** * Creates a file in helix format which includes all available * or installed packages,patches,selections..... **/ class HelixResolvable : public base::ReferenceCounted, private base::NonCopyable{ private: std::string dumpFile; // Path of the generated testcase ofgzstream *file; public: HelixResolvable (const std::string & path); ~HelixResolvable (); void addResolvable (const PoolItem item) { *file << helixXML (item); } std::string filename () { return dumpFile; } }; DEFINE_PTR_TYPE(HelixResolvable); IMPL_PTR_TYPE(HelixResolvable); typedef std::map RepositoryTable; HelixResolvable::HelixResolvable(const std::string & path) :dumpFile (path) { file = new ofgzstream(path.c_str()); if (!file) { ZYPP_THROW (Exception( "Can't open " + path ) ); } *file << "" << endl; } HelixResolvable::~HelixResolvable() { *file << "" << endl; delete(file); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : HelixControl /** * Creates a file in helix format which contains all controll * action of a testcase ( file is known as *-test.xml) **/ class HelixControl { private: std::string dumpFile; // Path of the generated testcase std::ofstream *file; bool _inSetup; public: HelixControl (const std::string & controlPath, const RepositoryTable & sourceTable, const Arch & systemArchitecture, const target::Modalias::ModaliasList & modaliasList, const std::set & multiversionSpec, const std::string & systemPath); ~HelixControl (); void closeSetup() { if ( _inSetup ) { *file << "" << endl << "" << endl; _inSetup = false; } } std::ostream & writeTag() { return *file << (_inSetup ? TAB : ""); } void addTagIf( const std::string & tag_r, bool yesno_r = true ) { if ( yesno_r ) writeTag() << "<" << tag_r << "/>" << endl; } void installResolvable( const PoolItem & pi_r ); void lockResolvable( const PoolItem & pi_r ); void keepResolvable( const PoolItem & pi_r ); void deleteResolvable( const PoolItem & pi_r ); void addDependencies (const CapabilitySet &capRequire, const CapabilitySet &capConflict); void addUpgradeRepos( const std::set & upgradeRepos_r ); std::string filename () { return dumpFile; } }; HelixControl::HelixControl(const std::string & controlPath, const RepositoryTable & repoTable, const Arch & systemArchitecture, const target::Modalias::ModaliasList & modaliasList, const std::set & multiversionSpec, const std::string & systemPath) :dumpFile (controlPath) ,_inSetup( true ) { file = new std::ofstream(controlPath.c_str()); if (!file) { ZYPP_THROW (Exception( "Can't open " + controlPath ) ); } *file << "" << endl << "" << endl << "" << endl << "" << endl << TAB << "" << endl << endl; for ( RepositoryTable::const_iterator it = repoTable.begin(); it != repoTable.end(); ++it ) { RepoInfo repo = it->first.info(); *file << TAB << "" << endl; *file << TAB << "first.id()) << "-package.xml.gz\" name=\"" << repo.alias() << "\"" << " priority=\"" << repo.priority() << "\" />" << endl << endl; } // HACK: directly access sat::pool const sat::Pool & satpool( sat::Pool::instance() ); // RequestedLocales const LocaleSet & addedLocales( satpool.getAddedRequestedLocales() ); const LocaleSet & removedLocales( satpool.getRemovedRequestedLocales() ); const LocaleSet & requestedLocales( satpool.getRequestedLocales() ); for ( Locale l : requestedLocales ) { const char * fate = ( addedLocales.count(l) ? "\" fate=\"added" : "" ); *file << TAB << "" << endl; } for ( Locale l : removedLocales ) { *file << TAB << "" << endl; } // AutoInstalled for ( IdString::IdType n : satpool.autoInstalled() ) { *file << TAB << "" << endl; } for_( it, modaliasList.begin(), modaliasList.end() ) { *file << TAB << "" << endl; } for_( it, multiversionSpec.begin(), multiversionSpec.end() ) { *file << TAB << "" << endl; } // setup continued outside.... } HelixControl::~HelixControl() { closeSetup(); // in case it is still open *file << "" << endl << "" << endl; delete(file); } void HelixControl::installResolvable( const PoolItem & pi_r ) { *file << "" << endl; } void HelixControl::lockResolvable( const PoolItem & pi_r ) { *file << "" << endl; } void HelixControl::keepResolvable( const PoolItem & pi_r ) { *file << "" << endl; } void HelixControl::deleteResolvable( const PoolItem & pi_r ) { *file << "" << endl; } void HelixControl::addDependencies (const CapabilitySet & capRequire, const CapabilitySet & capConflict) { for (CapabilitySet::const_iterator iter = capRequire.begin(); iter != capRequire.end(); iter++) { *file << "asString() << "\"" << "/>" << endl; } for (CapabilitySet::const_iterator iter = capConflict.begin(); iter != capConflict.end(); iter++) { *file << "asString() << "\"" << "/>" << endl; } } void HelixControl::addUpgradeRepos( const std::set & upgradeRepos_r ) { for_( it, upgradeRepos_r.begin(), upgradeRepos_r.end() ) { *file << "alias() << "\"/>" << endl; } } //--------------------------------------------------------------------------- Testcase::Testcase() :dumpPath("/var/log/YaST2/solverTestcase") {} Testcase::Testcase(const std::string & path) :dumpPath(path) {} Testcase::~Testcase() {} bool Testcase::createTestcase(Resolver & resolver, bool dumpPool, bool runSolver) { PathInfo path (dumpPath); if ( !path.isExist() ) { if (zypp::filesystem::assert_dir (dumpPath)!=0) { ERR << "Cannot create directory " << dumpPath << endl; return false; } } else { if (!path.isDir()) { ERR << dumpPath << " is not a directory." << endl; return false; } // remove old stuff if pool will be dump if (dumpPool) zypp::filesystem::clean_dir (dumpPath); } if (runSolver) { zypp::base::LogControl::TmpLineWriter tempRedirect; zypp::base::LogControl::instance().logfile( dumpPath +"/y2log" ); zypp::base::LogControl::TmpExcessive excessive; resolver.resolvePool(); } ResPool pool = resolver.pool(); RepositoryTable repoTable; PoolItemList items_to_install; PoolItemList items_to_remove; PoolItemList items_locked; PoolItemList items_keep; HelixResolvable_Ptr system = NULL; if (dumpPool) system = new HelixResolvable(dumpPath + "/solver-system.xml.gz"); for ( const PoolItem & pi : pool ) { if ( system && pi.status().isInstalled() ) { // system channel system->addResolvable( pi ); } else { // repo channels Repository repo = pi.repository(); if (dumpPool) { if (repoTable.find (repo) == repoTable.end()) { repoTable[repo] = new HelixResolvable(dumpPath + "/" + str::numstring((long)repo.id()) + "-package.xml.gz"); } repoTable[repo]->addResolvable( pi ); } } if ( pi.status().isToBeInstalled() && !(pi.status().isBySolver())) { items_to_install.push_back( pi ); } if ( pi.status().isKept() && !(pi.status().isBySolver())) { items_keep.push_back( pi ); } if ( pi.status().isToBeUninstalled() && !(pi.status().isBySolver())) { items_to_remove.push_back( pi ); } if ( pi.status().isLocked() && !(pi.status().isBySolver())) { items_locked.push_back( pi ); } } // writing control file "*-test.xml" HelixControl control (dumpPath + "/solver-test.xml", repoTable, ZConfig::instance().systemArchitecture(), target::Modalias::instance().modaliasList(), ZConfig::instance().multiversionSpec(), "solver-system.xml.gz"); // In : resolver flags,... control.writeTag() << "" << endl; control.addTagIf( "ignorealreadyrecommended", resolver.ignoreAlreadyRecommended() ); control.addTagIf( "onlyRequires", resolver.onlyRequires() ); control.addTagIf( "forceResolve", resolver.forceResolve() ); control.addTagIf( "cleandepsOnRemove", resolver.cleandepsOnRemove() ); control.addTagIf( "allowDowngrade", resolver.allowDowngrade() ); control.addTagIf( "allowNameChange", resolver.allowNameChange() ); control.addTagIf( "allowArchChange", resolver.allowArchChange() ); control.addTagIf( "allowVendorChange", resolver.allowVendorChange() ); control.addTagIf( "dupAllowDowngrade", resolver.dupAllowDowngrade() ); control.addTagIf( "dupAllowNameChange", resolver.dupAllowNameChange() ); control.addTagIf( "dupAllowArchChange", resolver.dupAllowArchChange() ); control.addTagIf( "dupAllowVendorChange", resolver.dupAllowVendorChange() ); control.closeSetup(); // Entering ... for ( const PoolItem & pi : items_to_install ) { control.installResolvable( pi ); } for ( const PoolItem & pi : items_locked ) { control.lockResolvable( pi ); } for ( const PoolItem & pi : items_keep ) { control.keepResolvable( pi ); } for ( const PoolItem & pi : items_to_remove ) { control.deleteResolvable( pi ); } control.addDependencies (resolver.extraRequires(), resolver.extraConflicts()); control.addDependencies (SystemCheck::instance().requiredSystemCap(), SystemCheck::instance().conflictSystemCap()); control.addUpgradeRepos( resolver.upgradeRepos() ); control.addTagIf( "distupgrade", resolver.isUpgradeMode() ); control.addTagIf( "update", resolver.isUpdateMode() ); control.addTagIf( "verify", resolver.isVerifyingMode() ); return true; } /////////////////////////////////////////////////////////////////// };// namespace detail ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// };// namespace solver /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// };// namespace zypp ///////////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/solver/detail/Types.h000066400000000000000000000036761476576476200204650ustar00rootroot00000000000000/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */ /* Types.h * * Copyright (C) 2005 SUSE Linux Products GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public 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 ZYPP_SOLVER_DETAIL_TYPES_H #define ZYPP_SOLVER_DETAIL_TYPES_H #include #include ///////////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////////// namespace solver { ///////////////////////////////////////////////////////////////////// namespace detail { // A few type names exposed in the public API // class Resolver; using ResolverInternal = Resolver; ///< Preferred name in API struct ItemCapKind; using ItemCapKindList = std::list; DEFINE_PTR_TYPE(SolverQueueItem); using SolverQueueItemList = std::list; DEFINE_PTR_TYPE(SolutionAction); using SolutionActionList = std::list; } // namespace detail ///////////////////////////////////////////////////////////////////// } // namespace solver /////////////////////////////////////////////////////////////////////// } // namespace zypp ///////////////////////////////////////////////////////////////////////// #endif // ZYPP_SOLVER_DETAIL_TYPES_H libzypp-17.36.5/zypp/target/000077500000000000000000000000001476576476200157065ustar00rootroot00000000000000libzypp-17.36.5/zypp/target/CommitPackageCache.cc000066400000000000000000000140171476576476200216500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/CommitPackageCache.cc * */ #include #include #include #include #include #include #include using std::endl; #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { /////////////////////////////////////////////////////////////////// /// \class QueryInstalledEditionHelper /// \short Helper for PackageProvider queries during download. /// Queries the exact version of a currently installed package /// in context(/) which may then be used by \ref applydeltarpm /// to build a final rpm. /////////////////////////////////////////////////////////////////// struct QueryInstalledEditionHelper { bool operator()( const std::string & name_r, const Edition & ed_r, const Arch & arch_r ) const { rpm::librpmDb::db_const_iterator it( "/" ); for ( it.findByName( name_r ); *it; ++it ) { if ( arch_r == it->tag_arch() && ( ed_r == Edition::noedition || ed_r == it->tag_edition() ) ) { return true; } } return false; } }; } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // class RepoProvidePackage // /////////////////////////////////////////////////////////////////// struct RepoProvidePackage::Impl { repo::RepoMediaAccess _access; std::list _repos; repo::PackageProviderPolicy _packageProviderPolicy; }; RepoProvidePackage::RepoProvidePackage() : _impl( new Impl ) { const ResPool & pool( ResPool::instance() ); _impl->_repos.insert( _impl->_repos.begin(), pool.knownRepositoriesBegin(), pool.knownRepositoriesEnd() ); _impl->_packageProviderPolicy.queryInstalledCB( QueryInstalledEditionHelper() ); } RepoProvidePackage::~RepoProvidePackage() {} ManagedFile RepoProvidePackage::operator()( const PoolItem & pi_r, bool fromCache_r ) { ManagedFile ret; if ( fromCache_r ) { repo::PackageProvider pkgProvider( _impl->_access, pi_r, _impl->_packageProviderPolicy ); ret = pkgProvider.providePackageFromCache(); } else if ( pi_r.isKind() ) // may make use of deltas { repo::DeltaCandidates deltas( _impl->_repos, pi_r.name() ); repo::PackageProvider pkgProvider( _impl->_access, pi_r, deltas, _impl->_packageProviderPolicy ); return pkgProvider.providePackage(); } else // SrcPackage or throws { repo::PackageProvider pkgProvider( _impl->_access, pi_r, _impl->_packageProviderPolicy ); return pkgProvider.providePackage(); } return ret; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : CommitPackageCache // /////////////////////////////////////////////////////////////////// CommitPackageCache::CommitPackageCache( Impl * pimpl_r ) : _pimpl( pimpl_r ) { assert( _pimpl ); } CommitPackageCache::CommitPackageCache( PackageProvider packageProvider_r ) { if ( getenv("ZYPP_COMMIT_NO_PACKAGE_CACHE") ) { MIL << "$ZYPP_COMMIT_NO_PACKAGE_CACHE is set." << endl; _pimpl.reset( new Impl( std::move(packageProvider_r) ) ); // no cache } else { _pimpl.reset( new CommitPackageCacheReadAhead( std::move(packageProvider_r) ) ); } assert( _pimpl ); } CommitPackageCache::CommitPackageCache( const Pathname & /*rootDir_r*/, const PackageProvider & packageProvider_r ) : CommitPackageCache( packageProvider_r ) {} CommitPackageCache::~CommitPackageCache() {} void CommitPackageCache::setCommitList( std::vector commitList_r ) { _pimpl->setCommitList( std::move(commitList_r) ); } ManagedFile CommitPackageCache::get( const PoolItem & citem_r ) { return _pimpl->get( citem_r ); } bool CommitPackageCache::preloaded() const { return _pimpl->preloaded(); } void CommitPackageCache::preloaded( bool newval_r ) { _pimpl->preloaded( newval_r ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const CommitPackageCache & obj ) { return str << *obj._pimpl; } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/CommitPackageCache.h000066400000000000000000000104771476576476200215200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/CommitPackageCache.h * */ #ifndef ZYPP_TARGET_COMMITPACKAGECACHE_H #define ZYPP_TARGET_COMMITPACKAGECACHE_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class RepoProvidePackage /// \short Default PackageProvider for \ref CommitPackageCache /// /// \p pool_r \ref ResPool used to get candidates /// \p pi item to be commited /////////////////////////////////////////////////////////////////// class ZYPP_API RepoProvidePackage { public: RepoProvidePackage(); ~RepoProvidePackage(); /** Provide package optionally fron cache only. */ ManagedFile operator()( const PoolItem & pi, bool fromCache_r ); private: struct Impl; RW_pointer _impl; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : CommitPackageCache // /** Target::commit helper optimizing package provision. */ class ZYPP_API CommitPackageCache { friend std::ostream & operator<<( std::ostream & str, const CommitPackageCache & obj ); public: using PackageProvider = function; public: /** Ctor */ CommitPackageCache(PackageProvider packageProvider_r = RepoProvidePackage() ); /** \deprecated Legacy Ctor; Pathname rootDir_r is not used. * The repositories RepoInfo::packagesPath defines the cache location. */ CommitPackageCache( const Pathname & /*rootDir_r*/, const PackageProvider & packageProvider_r = RepoProvidePackage() ) ZYPP_DEPRECATED; /** Dtor */ ~CommitPackageCache(); public: /** Download(commit) sequence of solvables to compute read ahead. */ void setCommitList( std::vector commitList_r ); /** \overload */ template void setCommitList( TIterator begin_r, TIterator end_r ) { setCommitList( std::vector( begin_r, end_r ) ); } /** Provide a package. */ ManagedFile get( const PoolItem & citem_r ); /** \overload */ ManagedFile get( sat::Solvable citem_r ) { return get( PoolItem(citem_r) ); } /** Whether preloaded hint is set. * If preloaded the cache tries to avoid trigering the infoInCache CB, * based on the assumption this was already done when preloading the cache. */ bool preloaded() const; /** Set preloaded hint. */ void preloaded( bool newval_r ); public: /** Implementation. */ class Impl; /** Ctor taking an implementation. */ explicit CommitPackageCache( Impl * pimpl_r ); private: /** Pointer to implementation. */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates CommitPackageCache Stream output */ std::ostream & operator<<( std::ostream & str, const CommitPackageCache & obj ); ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_COMMITPACKAGECACHE_H libzypp-17.36.5/zypp/target/CommitPackageCacheImpl.cc000066400000000000000000000025551476576476200224760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/CommitPackageCacheImpl.cc * */ #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/CommitPackageCacheImpl.h000066400000000000000000000100471476576476200223330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/CommitPackageCacheImpl.h * */ #ifndef ZYPP_TARGET_COMMITPACKAGECACHEIMPL_H #define ZYPP_TARGET_COMMITPACKAGECACHEIMPL_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : CommitPackageCache::Impl // /** Base for CommitPackageCache implementations (implements no chache). * * All packages are directly retrieved from the source via the * PackageProvider passed to the ctor. The PackageProvider is expected * to throw or return an empty ManagedFile if the package can't be provided. */ class CommitPackageCache::Impl { public: using PackageProvider = CommitPackageCache::PackageProvider; public: Impl( PackageProvider &&packageProvider_r ) : _packageProvider(std::move( packageProvider_r )) {} virtual ~Impl() {} public: /** Provide the package. * Derived classes overload this. */ virtual ManagedFile get( const PoolItem & citem_r ) { return sourceProvidePackage( citem_r ); } void setCommitList( std::vector commitList_r ) { _commitList = std::move(commitList_r); } const std::vector & commitList() const { return _commitList; } bool preloaded() const { return _preloaded; } void preloaded( bool newval_r ) { _preloaded = newval_r; } protected: /** Let the Source provide the package. */ virtual ManagedFile sourceProvidePackage( const PoolItem & pi ) const { if ( ! _packageProvider ) { ZYPP_THROW( Exception("No package provider configured.") ); } ManagedFile ret( _packageProvider( pi, /*cached only*/false ) ); if ( ret.value().empty() ) { ZYPP_THROW( Exception("Package provider failed.") ); } return ret; } /** Let the Source provide an already cached package. */ virtual ManagedFile sourceProvideCachedPackage( const PoolItem & pi ) const { if ( ! _packageProvider ) { ZYPP_THROW( Exception("No package provider configured.") ); } return _packageProvider( pi, /*cached only*/true ); } private: std::vector _commitList; PackageProvider _packageProvider; DefaultIntegral _preloaded; }; /////////////////////////////////////////////////////////////////// /** \relates CommitPackageCache::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const CommitPackageCache::Impl & obj ) { return str << "CommitPackageCache::Impl"; } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_COMMITPACKAGECACHEIMPL_H libzypp-17.36.5/zypp/target/CommitPackageCacheReadAhead.cc000066400000000000000000000146331476576476200233730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/CommitPackageCacheReadAhead.cc * */ #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : IMediaKey // /////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const IMediaKey & obj ) { return str << "[S" << obj._repo.id() << ":" << obj._mediaNr << "]" << " " << obj._repo.info().alias(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : CommitPackageCacheReadAhead // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : CommitPackageCacheReadAhead::CommitPackageCacheReadAhead // METHOD TYPE : Ctor // CommitPackageCacheReadAhead::CommitPackageCacheReadAhead( PackageProvider packageProvider_r ) : CommitPackageCache::Impl( std::move(packageProvider_r) ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : CommitPackageCacheReadAhead::onInteractiveMedia // METHOD TYPE : bool // bool CommitPackageCacheReadAhead::onInteractiveMedia( const PoolItem & pi ) const { if ( pi->mediaNr() == 0 ) // no media access at all return false; if ( pi->repoInfo().baseUrlsEmpty() ) return false; // no Url - should actually not happen std::string scheme( pi->repoInfo().baseUrlsBegin()->getScheme() ); return ( scheme == "dvd" || scheme == "cd" ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : CommitPackageCacheReadAhead::cacheLastInteractive // METHOD TYPE : void // void CommitPackageCacheReadAhead::cacheLastInteractive( const PoolItem & citem_r ) { // Fill cache errors are never proagated. try { doCacheLastInteractive( citem_r ); } catch ( const Exception & excpt_r ) { ZYPP_CAUGHT( excpt_r ); WAR << "Failed to cache " << _lastInteractive << endl; } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : CommitPackageCacheReadAhead::doCacheLastInteractive // METHOD TYPE : void // void CommitPackageCacheReadAhead::doCacheLastInteractive( const PoolItem & citem_r ) { unsigned addToCache = 0; bool sawCitem = false; // Collect all remaining packages to install from // _lastInteractive media. (just the PoolItem data) for_( it, commitList().begin(), commitList().end() ) { PoolItem pi( *it ); if ( ! sawCitem ) { if ( pi == citem_r ) sawCitem = true; continue; } if ( IMediaKey( pi ) == _lastInteractive && pi.status().isToBeInstalled() && isKind(pi.resolvable()) ) { if ( ! pi->asKind()->isCached() ) { ManagedFile fromSource( sourceProvidePackage( pi ) ); if ( fromSource->empty() ) { ERR << "Copy to cache failed on " << fromSource << endl; ZYPP_THROW( Exception("Copy to cache failed.") ); } fromSource.resetDispose(); // keep the package file in the cache ++addToCache; } } } if ( addToCache ) MIL << "Cached " << _lastInteractive << ": " << addToCache << " items." << endl; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : CommitPackageCacheReadAhead::get // METHOD TYPE : ManagedFile // ManagedFile CommitPackageCacheReadAhead::get( const PoolItem & citem_r ) { ManagedFile ret; if ( preloaded() ) { // Check whether it's cached. ManagedFile ret( sourceProvideCachedPackage( citem_r ) ); if ( ! ret->empty() ) return ret; } // else: we head for sourceProvidePackage(), even if the package // was cached. The actual difference is that sourceProvidePackage // will trigger the infoInCache CB that informs the application. // Once the cache is preloaded we try to avoid this CB. // Preload cache if a CD/DVD change is pending to avoid // switching back and forth... if ( onInteractiveMedia( citem_r ) ) { ret = sourceProvideCachedPackage( citem_r ); if ( ! ret->empty() ) return ret; IMediaKey current( citem_r ); if ( current != _lastInteractive ) { if ( _lastInteractive != IMediaKey() ) { cacheLastInteractive( citem_r ); } DBG << "Interactive change [" << ++_dbgChanges << "] from " << _lastInteractive << " to " << current << endl; _lastInteractive = current; } } // Provide and return the file from media. return sourceProvidePackage( citem_r ); } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/CommitPackageCacheReadAhead.h000066400000000000000000000101531476576476200232260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/CommitPackageCacheReadAhead.h * */ #ifndef ZYPP_TARGET_COMMITPACKAGECACHEREADAHEAD_H #define ZYPP_TARGET_COMMITPACKAGECACHEREADAHEAD_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : IMediaKey // /** Helper storing a source id and media number. */ struct IMediaKey { IMediaKey() {} explicit IMediaKey( const PoolItem & obj_r ) : _repo( obj_r->repository() ) , _mediaNr( obj_r->mediaNr() ) {} explicit IMediaKey( const ResObject::constPtr & obj_r ) : _repo( obj_r->repository() ) , _mediaNr( obj_r->mediaNr() ) {} IMediaKey( const Repository & repo, unsigned mediaNr_r ) : _repo( repo ) , _mediaNr( mediaNr_r ) {} bool operator==( const IMediaKey & rhs ) const { return( _repo == rhs._repo && _mediaNr == rhs._mediaNr ); } bool operator!=( const IMediaKey & rhs ) const { return ! operator==( rhs ); } bool operator<( const IMediaKey & rhs ) const { return( _repo.id() < rhs._repo.id() || ( _repo.id() == rhs._repo.id() && _mediaNr < rhs._mediaNr ) ); } Repository _repo; DefaultIntegral _mediaNr; }; /////////////////////////////////////////////////////////////////// std::ostream & operator<<( std::ostream & str, const IMediaKey & obj ); /////////////////////////////////////////////////////////////////// // // CLASS NAME : CommitPackageCacheReadAhead // /** */ class CommitPackageCacheReadAhead : public CommitPackageCache::Impl { public: CommitPackageCacheReadAhead(PackageProvider packageProvider_r ); public: /** Provide the package. Either from Source or from cache. */ ManagedFile get( const PoolItem & citem_r ) override; private: /** Return whether \a pi is located on a CD/DVD */ bool onInteractiveMedia( const PoolItem & pi ) const; private: /** Fill the cache. * Called before changing from one interactive media to another. * Performs the read ahead of packages trying to avoid the necessity * of switching back to the current media later. */ void cacheLastInteractive( const PoolItem & citem_r ); /** cacheLastInteractive helper . */ void doCacheLastInteractive( const PoolItem & citem_r ); private: DefaultIntegral _dbgChanges; IMediaKey _lastInteractive; //Pathname _rootDir; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_COMMITPACKAGECACHEREADAHEAD_H libzypp-17.36.5/zypp/target/HardLocksFile.cc000066400000000000000000000054431476576476200206750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/HardLocksFile.cc * */ #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// void HardLocksFile::load( const Pathname & file_r, Data & data_r ) { PathInfo pi( file_r ); if ( ! pi.isFile() ) { WAR << "Can't read " << pi << endl; return; } readPoolQueriesFromFile( file_r, std::back_inserter( data_r ) ); MIL << "Read " << pi << endl; } void HardLocksFile::store( const Pathname & file_r, const Data & data_r ) { filesystem::TmpFile tmp( filesystem::TmpFile::makeSibling( file_r ) ); filesystem::chmod( tmp.path(), 0644 ); writePoolQueriesToFile( tmp.path(), data_r.begin(), data_r.end() ); if ( true ) // by now: no error info from writePoolQueriesToFile { filesystem::rename( tmp.path(), file_r ); MIL << "Wrote " << PathInfo(file_r) << endl; } else { ERR << "Can't write " << PathInfo(tmp.path()) << endl; } } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const HardLocksFile & obj ) { str << obj.file() << ' '; if ( obj._dataPtr ) str << obj.data(); else str << "(unloaded)"; return str; } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/HardLocksFile.h000066400000000000000000000103221476576476200205270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/HardLocksFile.h * */ #ifndef ZYPP_TARGET_HARDLOCKSFILE_H #define ZYPP_TARGET_HARDLOCKSFILE_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : HardLocksFile // /** Save and restore hardlocks. */ class HardLocksFile { friend std::ostream & operator<<( std::ostream & str, const HardLocksFile & obj ); public: using Data = pool::PoolTraits::HardLockQueries; public: /** Ctor taking the file to read/write. */ HardLocksFile( Pathname file_r ) : _file(std::move( file_r )) {} /** Return the file path. */ const Pathname & file() const { return _file; } /** Return the data. * The file is read once on demand. Returns empty \ref Data if * the file does not exist or is not readable. */ const Data & data() const { if ( !_dataPtr ) { _dataPtr.reset( new Data ); Data & mydata( *_dataPtr ); load( _file, mydata ); } return *_dataPtr; } /** Store new \ref Data. * Write the new \ref Data to file, unless we know it * did not change. The directory containing file must * exist. */ void setData( const Data & data_r ) { if ( !_dataPtr ) { if ( data_r.empty() ) return; // bsc#1096803: Prevent against empty commit without Target having been been loaded (!_dataPtr ) _dataPtr.reset( new Data ); } if ( differs( *_dataPtr, data_r ) ) { store( _file, data_r ); *_dataPtr = data_r; } } private: /** Helper testing whether two \ref Data differ. */ bool differs( const Data & lhs, const Data & rhs ) const { if ( lhs.size() != rhs.size() ) return true; // Complete diff is too expensive and not necessary here. // Just check for the same sequence of items. Data::const_iterator rit = rhs.begin(); for_( it, lhs.begin(), lhs.end() ) { if ( *it != *rit ) return true; ++rit; } return false; } /** Read \ref Data from \c file_r. */ static void load( const Pathname & file_r, Data & data_r ); /** Write \ref Data to \c file_r. */ static void store( const Pathname & file_r, const Data & data_r ); private: Pathname _file; mutable scoped_ptr _dataPtr; }; /////////////////////////////////////////////////////////////////// /** \relates HardLocksFile Stream output */ std::ostream & operator<<( std::ostream & str, const HardLocksFile & obj ); ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_HARDLOCKSFILE_H libzypp-17.36.5/zypp/target/RequestedLocalesFile.cc000066400000000000000000000061531476576476200222660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/RequestedLocalesFile.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// void RequestedLocalesFile::load( const Pathname & file_r, LocaleSet & locales_r ) { PathInfo pi( file_r ); if ( ! pi.isFile() ) { WAR << "Can't read " << pi << endl; return; } std::ifstream infile( file_r.c_str() ); for( iostr::EachLine in( infile ); in; in.next() ) { std::string l( str::trim(*in) ); if ( ! l.empty() && l[0] != '#' ) { locales_r.insert( Locale(l) ); } } MIL << "Read " << pi << endl; } void RequestedLocalesFile::store( const Pathname & file_r, const LocaleSet & locales_r ) { filesystem::TmpFile tmp( filesystem::TmpFile::makeSibling( file_r ) ); filesystem::chmod( tmp.path(), 0644 ); std::ofstream outs( tmp.path().c_str() ); outs << "# zypp::RequestedLocales generated " << Date::now() << endl; dumpRange( outs, locales_r.begin(), locales_r.end(), "#", "\n", "\n", "\n", "#\n" ); outs.close(); if ( outs.good() ) { filesystem::rename( tmp.path(), file_r ); MIL << "Wrote " << PathInfo(file_r) << endl; } else { ERR << "Can't write " << PathInfo(tmp.path()) << endl; } } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const RequestedLocalesFile & obj ) { str << obj.file() << ' '; if ( obj._localesPtr ) str << obj.locales(); else str << "(unloaded)"; return str; } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/RequestedLocalesFile.h000066400000000000000000000077031476576476200221320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/RequestedLocalesFile.h * */ #ifndef ZYPP_TARGET_REQUESTEDLOCALESFILE_H #define ZYPP_TARGET_REQUESTEDLOCALESFILE_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RequestedLocalesFile // /** Save and restore locale set from file. */ class RequestedLocalesFile { friend std::ostream & operator<<( std::ostream & str, const RequestedLocalesFile & obj ); public: /** Ctor taking the file to read/write. */ RequestedLocalesFile( Pathname file_r ) : _file(std::move( file_r )) {} /** Return the file path. */ const Pathname & file() const { return _file; } /** Return the loacale set. * The file is read once on demand. returns an empty set if * the file does not exist or is not readable. */ const LocaleSet & locales() const { if ( !_localesPtr ) { _localesPtr.reset( new LocaleSet ); LocaleSet & ls( *_localesPtr ); load( _file, ls ); } return *_localesPtr; } /** Store a new locale set. * Write the new localeset to file, unless we know it * did not change. The directory containing file must exist. */ void setLocales( const LocaleSet & locales_r ) { if ( !_localesPtr ) _localesPtr.reset( new LocaleSet ); if ( differs( *_localesPtr, locales_r ) ) { store( _file, locales_r ); *_localesPtr = locales_r; } } private: /** Helper testing whether two \ref LocaleSet differ. */ bool differs( const LocaleSet & lhs, const LocaleSet & rhs ) const { if ( lhs.size() != rhs.size() ) return true; for_( it, lhs.begin(), lhs.end() ) { if ( rhs.find( *it ) == rhs.end() ) return true; } return false; } /** Read \ref LocaleSet from \c file_r. */ static void load( const Pathname & file_r, LocaleSet & locales_r ); /** Write \ref LocaleSet to \c file_r. */ static void store( const Pathname & file_r, const LocaleSet & locales_r ); private: Pathname _file; mutable scoped_ptr _localesPtr; }; /////////////////////////////////////////////////////////////////// /** \relates RequestedLocalesFile Stream output */ std::ostream & operator<<( std::ostream & str, const RequestedLocalesFile & obj ); ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_REQUESTEDLOCALESFILE_H libzypp-17.36.5/zypp/target/RpmPostTransCollector.cc000066400000000000000000000453571476576476200225160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/RpmPostTransCollector.cc */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::posttrans" /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace target { /////////////////////////////////////////////////////////////////// /// \class RpmPostTransCollector::Impl /// \brief RpmPostTransCollector implementation. /////////////////////////////////////////////////////////////////// class RpmPostTransCollector::Impl : private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const Impl & obj ); friend std::ostream & dumpOn( std::ostream & str, const Impl & obj ); /// <%posttrans script basename, pkgname> pairs. using ScriptList = std::list< std::pair >; /// Data regarding the dumpfile used if `rpm --runposttrans` is supported struct Dumpfile { Dumpfile( Pathname dumpfile_r ) : _dumpfile { std::move(dumpfile_r) } {} Pathname _dumpfile; ///< The file holding the collected dump_posttrans: lines. size_t _numscripts = 0; ///< Number of scripts we collected (roughly estimated) bool _runposttrans = true; ///< Set to false if rpm lost --runposttrans support during transaction. }; public: Impl( Pathname &&root_r ) : _root(std::move( root_r )) , _myJobReport { "cmdout", "%posttrans" } {} Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; ~Impl() {} bool hasPosttransScript( const Pathname & rpmPackage_r ) { return bool(getHeaderIfPosttrans( rpmPackage_r )); } void collectPosttransInfo( const Pathname & rpmPackage_r, const std::vector & runposttrans_r ) { if ( not collectDumpPosttransLines( runposttrans_r ) ) collectScriptForPackage( rpmPackage_r ); } void collectPosttransInfo( const std::vector & runposttrans_r ) { collectDumpPosttransLines( runposttrans_r ); } void collectScriptFromHeader( const rpm::RpmHeader::constPtr& pkg ) { if ( pkg ) { if ( not _scripts ) { _scripts = ScriptList(); } filesystem::TmpFile script( tmpDir(), pkg->ident() ); filesystem::addmod( script.path(), 0500 ); // script must be executable script.autoCleanup( false ); // no autodelete; within a tmpdir { std::ofstream out( script.path().c_str() ); out << "#! " << pkg->tag_posttransprog() << endl << pkg->tag_posttrans() << endl; } _scripts->push_back( std::make_pair( script.path().basename(), pkg->tag_name() ) ); MIL << "COLLECT posttrans: '" << PathInfo( script.path() ) << "' for package: '" << pkg->tag_name() << "'" << endl; } } void collectScriptForPackage( const Pathname & rpmPackage_r ) { collectScriptFromHeader( getHeaderIfPosttrans( rpmPackage_r ) ); } /** Return whether runposttrans lines were collected. * If runposttrans is supported, rpm issues at least one 'dump_posttrans: enabled' line with * every install/remove. If no line is issued, rpm does not support --runposttrans. Interesting * for \ref executeScripts is whether the final call to rpm supported it. */ bool collectDumpPosttransLines( const std::vector & runposttrans_r ) { if ( runposttrans_r.empty() ) { if ( _dumpfile and _dumpfile->_runposttrans ) { MIL << "LOST dump_posttrans support" << endl; _dumpfile->_runposttrans = false; // rpm was downgraded to a version not supporing --runposttrans } return false; } if ( not _dumpfile ) { filesystem::TmpFile dumpfile( tmpDir(), "dumpfile" ); filesystem::addmod( dumpfile.path(), 0400 ); // dumpfile must be readable dumpfile.autoCleanup( false ); // no autodelete; within a tmpdir _dumpfile = Dumpfile( dumpfile.path() ); MIL << "COLLECT dump_posttrans to '" << _dumpfile->_dumpfile << endl; } std::ofstream out( _dumpfile->_dumpfile.c_str(), std::ios_base::app ); for ( const auto & s : runposttrans_r ) { out << s << endl; } _dumpfile->_numscripts += runposttrans_r.size(); MIL << "COLLECT " << runposttrans_r.size() << " dump_posttrans lines" << endl; return true; } /** Execute the remembered scripts. * Crucial is the mixed case, where scripts and dumpfile are present at the end. * If rpm was updated in the transaction to a version supporting --runposttrans, * run scripts and then the dumpfile. * If rpm was downgraded in the transaction to a version no longer supporting * --runposttrans, we need to extract missing %posttrans scripts from the dumpfile * and execute them before the collected scripts. */ void executeScripts( rpm::RpmDb & rpm_r ) { if ( _dumpfile && not _dumpfile->_runposttrans ) { // Here a downgraded rpm lost the ability to --runposttrans. Extract at least any // missing %posttrans scripts collected in _dumpfile and prepend them to the _scripts. MIL << "Extract missing %posttrans scripts and prepend them to the scripts." << endl; // collectScriptFromHeader appends to _scripts, so we save here and append again later std::optional savedscripts; if ( _scripts ) { savedscripts = std::move(*_scripts); _scripts = std::nullopt; } rpm::RpmDb::db_const_iterator it { rpm_r.dbConstIterator() }; recallFromDumpfile( _dumpfile->_dumpfile, [&]( const std::string& n_r, const std::string& v_r, const std::string& r_r, const std::string& a_r ) -> void { if ( it.findPackage( n_r, Edition( v_r, r_r ) ) && headerHasPosttrans( *it ) ) collectScriptFromHeader( *it ); } ); // append any savedscripts if ( savedscripts ) { if ( _scripts ) { _scripts->splice( _scripts->end(), *savedscripts ); } else { _scripts = std::move(*savedscripts); } } _dumpfile = std::nullopt; } if ( not ( _scripts || _dumpfile ) ) return; // Nothing todo // ProgressReport counting the scripts ( 0:preparation, 1->n:for n scripts, n+1: indicate success) callback::SendReport report; ProgressData scriptProgress( [&]() -> ProgressData::value_type { ProgressData::value_type ret = 1; if ( _scripts ) ret += _scripts->size(); if ( _dumpfile ) ret += _dumpfile->_numscripts; return ret; }() ); scriptProgress.sendTo( ProgressReportAdaptor( ProgressData::ReceiverFnc(), report ) ); // Translator: progress bar label std::string scriptProgressName { _("Running post-transaction scripts") }; // Translator: progress bar label; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' str::Format fmtScriptProgressRun { _("Running %1% script") }; // Translator: headline; %1% is a script identifier like '%posttrans(mypackage-2-0.noarch)' str::Format fmtRipoff { _("%1% script output:") }; std::string sendRipoff; HistoryLog historylog; // lambda to prepare reports for a new script auto startNewScript = [&] ( const std::string & scriptident_r ) -> void { // scriptident_r : script identifier like "%transfiletriggerpostun(istrigger-2-0.noarch)" sendRipoff = fmtRipoff % scriptident_r; scriptProgress.name( fmtScriptProgressRun % scriptident_r ); scriptProgress.incr(); }; // lambda to send script output to reports auto sendScriptOutput = [&] ( const std::string & line_r ) -> void { OnScopeExit cleanup; // in case we need it if ( not sendRipoff.empty() ) { historylog.comment( sendRipoff, true /*timestamp*/); _myJobReport.set( "ripoff", std::cref(sendRipoff) ); cleanup.setDispose( [&]() -> void { _myJobReport.erase( "ripoff" ); sendRipoff.clear(); } ); } historylog.comment( line_r ); _myJobReport.info( line_r ); }; // send the initial progress report scriptProgress.name( scriptProgressName ); scriptProgress.toMin(); // Scripts first... if ( _scripts ) { Pathname noRootScriptDir( ZConfig::instance().update_scriptsPath() / tmpDir().basename() ); // like rpm would report it (intentionally not translated and NL-terminated): str::Format fmtScriptFailedMsg { "warning: %%posttrans(%1%) scriptlet failed, exit status %2%\n" }; str::Format fmtPosttrans { "%%posttrans(%1%)" }; rpm::RpmDb::db_const_iterator it { rpm_r.dbConstIterator() }; // Open DB only once while ( ! _scripts->empty() ) { const auto &scriptPair = _scripts->front(); const std::string & script = scriptPair.first; const std::string & pkgident( script.substr( 0, script.size()-6 ) ); // strip tmp file suffix[6] startNewScript( fmtPosttrans % pkgident ); int npkgs = 0; for ( it.findByName( scriptPair.second ); *it; ++it ) ++npkgs; MIL << "EXECUTE posttrans: " << script << " with argument: " << npkgs << endl; ExternalProgram::Arguments cmd { "/bin/sh", (noRootScriptDir/script).asString(), str::numstring( npkgs ) }; ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout, false, -1, true, _root ); for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) { sendScriptOutput( line ); } //script was executed, remove it from the list _scripts->pop_front(); int ret = prog.close(); if ( ret != 0 ) { std::string msg { fmtScriptFailedMsg % pkgident % ret }; WAR << msg; sendScriptOutput( msg ); // info!, as rpm would have reported it. } } _scripts = std::nullopt; } // ...then 'rpm --runposttrans' int res = 0; // Indicate a failed call to rpm itself! (a failed script is just a warning) if ( _dumpfile ) { res = rpm_r.runposttrans( _dumpfile->_dumpfile, [&] ( const std::string & line_r ) ->void { if ( str::startsWith( line_r, "RIPOFF:" ) ) startNewScript( line_r.substr( 7 ) ); // new scripts ident sent by rpm else sendScriptOutput( line_r ); } ); if ( res != 0 ) _myJobReport.error( str::Format("rpm --runposttrans returned %1%.") % res ); _dumpfile = std::nullopt; } // send a final progress report scriptProgress.name( scriptProgressName ); if ( res == 0 ) scriptProgress.toMax(); // Indicate 100%, in case Dumpfile::_numscripts estimation was off return; } /** Discard all remembered scrips. * As we are just logging the omitted actions, we don't pay further attention * to the mixed case, where scripts and dumpfile are present (see executeScripts). */ void discardScripts() { if ( not ( _scripts || _dumpfile ) ) return; // Nothing todo str::Str msg; if ( _scripts ) { // Legacy format logs all collected %posttrans msg << "%posttrans scripts skipped while aborting:" << endl; for ( const auto & script : *_scripts ) { WAR << "UNEXECUTED posttrans: " << script.first << endl; const std::string & pkgident( script.first.substr( 0, script.first.size()-6 ) ); // strip tmp file suffix[6] msg << " " << pkgident << "\n"; } _scripts = std::nullopt; } if ( _dumpfile ) { msg << "%posttrans and %transfiletrigger scripts are not executed when aborting!" << endl; _dumpfile = std::nullopt; } HistoryLog historylog; historylog.comment( msg, true /*timestamp*/); _myJobReport.warning( msg ); } private: /** Lazy create tmpdir on demand. */ Pathname tmpDir() { if ( !_ptrTmpdir ) _ptrTmpdir.reset( new filesystem::TmpDir( _root / ZConfig::instance().update_scriptsPath(), "posttrans" ) ); DBG << _ptrTmpdir->path() << endl; return _ptrTmpdir->path(); } /** Return whether RpmHeader has a %posttrans. */ bool headerHasPosttrans( const rpm::RpmHeader::constPtr& pkg_r ) const { bool ret = false; if ( pkg_r ) { std::string prog( pkg_r->tag_posttransprog() ); if ( not prog.empty() && prog != "" ) // by now leave lua to rpm ret = true; } return ret; } /** Cache RpmHeader for consecutive hasPosttransScript / collectScriptForPackage calls. * @return RpmHeader::constPtr IFF \a rpmPackage_r has a %posttrans */ rpm::RpmHeader::constPtr getHeaderIfPosttrans( const Pathname & rpmPackage_r ) { if ( _headercache.first == rpmPackage_r ) return _headercache.second; rpm::RpmHeader::constPtr ret { rpm::RpmHeader::readPackage( rpmPackage_r, rpm::RpmHeader::NOVERIFY ) }; if ( ret ) { if ( not headerHasPosttrans( ret ) ) ret = nullptr; } else { WAR << "Unexpectedly this is no package: " << rpmPackage_r << endl; } _headercache = std::make_pair( rpmPackage_r, ret ); return ret; } /** Retrieve "dump_posttrans: install" lines from \a dumpfile_r and pass n,v,r,a to the \a consumer_r. */ void recallFromDumpfile( const Pathname & dumpfile_r, std::function consume_r ) { // dump_posttrans: install 10 terminfo-base-6.4.20230819-19.1.x86_64 static const str::regex rxInstalled { "^dump_posttrans: +install +[0-9]+ +(.+)-([^-]+)-([^-]+)\\.([^.]+)" }; str::smatch what; iostr::forEachLine( InputStream( dumpfile_r ), [&]( int num_r, const std::string& line_r ) -> bool { if( str::regex_match( line_r, what, rxInstalled ) ) consume_r( what[1], what[2], what[3], what[4] ); return true; // continue iostr::forEachLine } ); } private: Pathname _root; std::optional _scripts; std::optional _dumpfile; scoped_ptr _ptrTmpdir; UserDataJobReport _myJobReport; ///< JobReport with ContentType "cmdout/%posttrans" std::pair _headercache; }; /** \relates RpmPostTransCollector::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const RpmPostTransCollector::Impl & obj ) { return str << "RpmPostTransCollector::Impl"; } /** \relates RpmPostTransCollector::Impl Verbose stream output */ inline std::ostream & dumpOn( std::ostream & str, const RpmPostTransCollector::Impl & obj ) { return str << obj; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RpmPostTransCollector // /////////////////////////////////////////////////////////////////// RpmPostTransCollector::RpmPostTransCollector( Pathname root_r ) : _pimpl( new Impl( std::move(root_r) ) ) {} RpmPostTransCollector::~RpmPostTransCollector() {} bool RpmPostTransCollector::hasPosttransScript( const Pathname & rpmPackage_r ) { return _pimpl->hasPosttransScript( rpmPackage_r ); } void RpmPostTransCollector::collectPosttransInfo( const Pathname & rpmPackage_r, const std::vector & runposttrans_r ) { _pimpl->collectPosttransInfo( rpmPackage_r, runposttrans_r ); } void RpmPostTransCollector::collectPosttransInfo( const std::vector & runposttrans_r ) { _pimpl->collectPosttransInfo( runposttrans_r ); } void RpmPostTransCollector::executeScripts( rpm::RpmDb & rpm_r ) { _pimpl->executeScripts( rpm_r ); } void RpmPostTransCollector::discardScripts() { return _pimpl->discardScripts(); } std::ostream & operator<<( std::ostream & str, const RpmPostTransCollector & obj ) { return str << *obj._pimpl; } std::ostream & dumpOn( std::ostream & str, const RpmPostTransCollector & obj ) { return dumpOn( str, *obj._pimpl ); } } // namespace target /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/RpmPostTransCollector.h000066400000000000000000000071001476576476200223400ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/RpmPostTransCollector.h */ #ifndef ZYPP_TARGET_RPMPOSTTRANSCOLLECTOR_H #define ZYPP_TARGET_RPMPOSTTRANSCOLLECTOR_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace target { namespace rpm { class RpmDb; } /////////////////////////////////////////////////////////////////// /// \class RpmPostTransCollector /// \brief Extract and remember %posttrans scripts for later execution /// /// bsc#1041742: Attempt to delay also %transfiletrigger(postun|in) execution /// iff rpm supports it. Rpm versions supporting --runposttrans will inject /// "dump_posttrans:..." lines into the output if macro "_dump_posttrans" is /// defined during execution. Those lines are collected and later fed into /// "rpm --runposttrans". /// If rpm does not support it, those lines are not injected. In this case we /// collect and later execute the %posttrans script on our own. /////////////////////////////////////////////////////////////////// class RpmPostTransCollector { friend std::ostream & operator<<( std::ostream & str, const RpmPostTransCollector & obj ); friend std::ostream & dumpOn( std::ostream & str, const RpmPostTransCollector & obj ); public: /** Default ctor */ RpmPostTransCollector( Pathname root_r ); /** Dtor */ ~RpmPostTransCollector(); public: /** Test whether a package defines a %posttrans script. */ bool hasPosttransScript( const Pathname & rpmPackage_r ); /** Extract and remember a packages %posttrans script or dump_posttrans lines for later execution. */ void collectPosttransInfo( const Pathname & rpmPackage_r, const std::vector & runposttrans_r ); /** \overload 'remove' does not trigger a %posttrans, but it may trigger %transfiletriggers. */ void collectPosttransInfo( const std::vector & runposttrans_r ); /** Execute the remembered scripts and/or or dump_posttrans lines. */ void executeScripts( rpm::RpmDb & rpm_r ); /** Discard all remembered scripts and/or or dump_posttrans lines. */ void discardScripts(); public: class Impl; ///< Implementation class. private: RW_pointer _pimpl; ///< Pointer to implementation. }; /** \relates RpmPostTransCollector Stream output */ std::ostream & operator<<( std::ostream & str, const RpmPostTransCollector & obj ); /** \relates RpmPostTransCollector Verbose stream output */ std::ostream & dumOn( std::ostream & str, const RpmPostTransCollector & obj ); } // namespace target /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_RPMPOSTTRANSCOLLECTOR_H libzypp-17.36.5/zypp/target/SolvIdentFile.cc000066400000000000000000000064111476576476200207260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/SolvIdentFile.cc * */ #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// void SolvIdentFile::load( const Pathname & file_r, Data & data_r ) { PathInfo pi( file_r ); if ( ! pi.isFile() ) { WAR << "Can't read " << pi << endl; return; } std::ifstream infile( file_r.c_str() ); for( iostr::EachLine in( infile ); in; in.next() ) { std::string l( str::trim(*in) ); if ( ! l.empty() && l[0] != '#' ) { data_r.insert( IdString(l) ); } } MIL << "Read " << pi << endl; } void SolvIdentFile::store( const Pathname & file_r, const Data & data_r ) { filesystem::TmpFile tmp( filesystem::TmpFile::makeSibling( file_r ) ); filesystem::chmod( tmp.path(), 0644 ); std::ofstream outs( tmp.path().c_str() ); outs << "# " << file_r.basename() << " generated " << Date::now() << endl; if ( true ) { std::set sorted( data_r.begin(), data_r.end() ); dumpRange( outs, sorted.begin(), sorted.end(), "#", "\n", "\n", "\n", "#\n" ); } else { dumpRange( outs, data_r.begin(), data_r.end(), "#", "\n", "\n", "\n", "#\n" ); } outs.close(); if ( outs.good() ) { filesystem::rename( tmp.path(), file_r ); MIL << "Wrote " << PathInfo(file_r) << endl; } else { ERR << "Can't write " << PathInfo(tmp.path()) << endl; } } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const SolvIdentFile & obj ) { str << obj.file() << ' '; if ( obj._dataPtr ) str << obj.data(); else str << "(unloaded)"; return str; } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/SolvIdentFile.h000066400000000000000000000076341476576476200206000ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/SolvIdentFile.h * */ #ifndef ZYPP_TARGET_SOLVIDENTFILE_H #define ZYPP_TARGET_SOLVIDENTFILE_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /// \class SolvIdentFile /// \short Save and restore a list of solvable names (ident IdString) /////////////////////////////////////////////////////////////////// class SolvIdentFile { friend std::ostream & operator<<( std::ostream & str, const SolvIdentFile & obj ); public: using Data = std::unordered_set; public: /** Ctor taking the file to read/write. */ SolvIdentFile( Pathname file_r ) : _file(std::move( file_r )) {} /** Return the file path. */ const Pathname & file() const { return _file; } /** Return the data. * The file is read once on demand. Returns empty \ref Data if * the file does not exist or is not readable. */ const Data & data() const { if ( !_dataPtr ) { _dataPtr.reset( new Data ); Data & mydata( *_dataPtr ); load( _file, mydata ); } return *_dataPtr; } /** Store new \ref Data. * Write the new \ref Data to file, unless we know it * did not change. The directory containing file must * exist. */ void setData( const Data & data_r ) { if ( !_dataPtr ) _dataPtr.reset( new Data ); if ( differs( *_dataPtr, data_r ) ) { store( _file, data_r ); *_dataPtr = data_r; } } private: /** Helper testing whether two \ref Data differ. */ bool differs( const Data & lhs, const Data & rhs ) const { if ( lhs.size() != rhs.size() ) return true; for_( it, lhs.begin(), lhs.end() ) { if ( rhs.find( *it ) == rhs.end() ) return true; } return false; } /** Read \ref Data from \c file_r. */ static void load( const Pathname & file_r, Data & data_r ); /** Write \ref Data to \c file_r. */ static void store( const Pathname & file_r, const Data & data_r ); private: Pathname _file; mutable scoped_ptr _dataPtr; }; /////////////////////////////////////////////////////////////////// /** \relates SolvIdentFile Stream output */ std::ostream & operator<<( std::ostream & str, const SolvIdentFile & obj ); ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_SOLVIDENTFILE_H libzypp-17.36.5/zypp/target/TargetCallbackReceiver.cc000066400000000000000000000160021476576476200225440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/TargetCallbackReceiver.cc * */ #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// RpmInstallPackageReceiver::RpmInstallPackageReceiver (Resolvable::constPtr res) : callback::ReceiveReport () , _resolvable (std::move(res)) , _level( target::rpm::InstallResolvableReport::RPM ) , _abort (false) { } RpmInstallPackageReceiver::~RpmInstallPackageReceiver () { } void RpmInstallPackageReceiver::reportbegin() { } void RpmInstallPackageReceiver::reportend() { } void RpmInstallPackageReceiver::report( const UserData & userData_r ) { if ( ! userData_r.haskey( "solvable" ) ) userData_r.set( "solvable", _resolvable->satSolvable() ); _report->report( userData_r ); } /** Start the operation */ void RpmInstallPackageReceiver::start( const Pathname & name ) { _report->start( _resolvable ); _abort = false; } /** * Inform about progress * Return true on abort */ bool RpmInstallPackageReceiver::progress( unsigned percent ) { _abort = ! _report->progress( percent, _resolvable ); return _abort; } rpm::RpmInstallReport::Action RpmInstallPackageReceiver::problem( Exception & excpt_r ) { rpm::InstallResolvableReport::Action user = _report->problem( _resolvable , rpm::InstallResolvableReport::INVALID , excpt_r.asUserHistory() , _level ); switch (user) { case rpm::InstallResolvableReport::RETRY: return rpm::RpmInstallReport::RETRY; case rpm::InstallResolvableReport::ABORT: _abort = true; return rpm::RpmInstallReport::ABORT; case rpm::InstallResolvableReport::IGNORE: return rpm::RpmInstallReport::IGNORE; } return rpm::RpmInstallReport::problem( excpt_r ); } void RpmInstallPackageReceiver::finishInfo( const std::string & info_r ) { _finishInfo = info_r; } /** Finish operation in case of success */ void RpmInstallPackageReceiver::finish() { _report->finish( _resolvable, rpm::InstallResolvableReport::NO_ERROR, _finishInfo, _level ); } /** Finish operation in case of success */ void RpmInstallPackageReceiver::finish( Exception & excpt_r ) { _report->finish( _resolvable, rpm::InstallResolvableReport::INVALID, std::string(), _level ); } void RpmInstallPackageReceiver::tryLevel( target::rpm::InstallResolvableReport::RpmLevel level_r ) { _level = level_r; } ///////////////////////////////////////////////////////////////// /// RpmRemovePackageReceiver ///////////////////////////////////////////////////////////////// RpmRemovePackageReceiver::RpmRemovePackageReceiver (Resolvable::constPtr res) : callback::ReceiveReport () , _resolvable (std::move(res)) , _abort(false) { } RpmRemovePackageReceiver::~RpmRemovePackageReceiver () { } void RpmRemovePackageReceiver::reportbegin() { } void RpmRemovePackageReceiver::reportend() { } /** Start the operation */ void RpmRemovePackageReceiver::report( const UserData & userData_r ) { if ( ! userData_r.haskey( "solvable" ) ) userData_r.set( "solvable", _resolvable->satSolvable() ); _report->report( userData_r ); } void RpmRemovePackageReceiver::start( const std::string & name ) { _report->start( _resolvable ); _abort = false; } /** * Inform about progress * Return true on abort */ bool RpmRemovePackageReceiver::progress( unsigned percent ) { _abort = ! _report->progress( percent, _resolvable ); return _abort; } rpm::RpmRemoveReport::Action RpmRemovePackageReceiver::problem( Exception & excpt_r ) { rpm::RemoveResolvableReport::Action user = _report->problem( _resolvable , rpm::RemoveResolvableReport::INVALID , excpt_r.asUserHistory() ); switch (user) { case rpm::RemoveResolvableReport::RETRY: return rpm::RpmRemoveReport::RETRY; case rpm::RemoveResolvableReport::ABORT: _abort = true; return rpm::RpmRemoveReport::ABORT; case rpm::RemoveResolvableReport::IGNORE: return rpm::RpmRemoveReport::IGNORE; } return rpm::RpmRemoveReport::problem( excpt_r ); } void RpmRemovePackageReceiver::finishInfo( const std::string & info_r ) { _finishInfo = info_r; } /** Finish operation in case of success */ void RpmRemovePackageReceiver::finish() { _report->progress( 100, _resolvable ); _report->finish( _resolvable, rpm::RemoveResolvableReport::NO_ERROR, _finishInfo ); } /** Finish operation in case of success */ void RpmRemovePackageReceiver::finish( Exception & excpt_r ) { _report->finish( _resolvable, rpm::RemoveResolvableReport::INVALID, std::string() ); } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/TargetCallbackReceiver.h000066400000000000000000000104411476576476200224070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/TargetCallbackReceiver.h * */ #ifndef ZYPP_TARGET_TARGETCALLBACKRECEIVER_H #define ZYPP_TARGET_TARGETCALLBACKRECEIVER_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// class RpmInstallPackageReceiver : public callback::ReceiveReport { callback::SendReport _report; Resolvable::constPtr _resolvable; target::rpm::InstallResolvableReport::RpmLevel _level; bool _abort; std::string _finishInfo; public: RpmInstallPackageReceiver (Resolvable::constPtr res); virtual ~RpmInstallPackageReceiver (); virtual void reportbegin(); virtual void reportend(); /** Forwards generic reports. */ void report( const UserData & userData_r ) override; /** Start the operation */ virtual void start( const Pathname & name ); void tryLevel( target::rpm::InstallResolvableReport::RpmLevel level_r ); bool aborted() const { return _abort; } /** * Inform about progress * Return true on abort */ virtual bool progress( unsigned percent ); /** inform user about a problem */ virtual rpm::RpmInstallReport::Action problem( Exception & excpt_r ); /** Additional rpm output to be reported in \ref finish in case of success. */ virtual void finishInfo( const std::string & info_r ); /** Finish operation in case of success */ virtual void finish(); /** Finish operatin in case of fail, report fail exception */ virtual void finish( Exception & excpt_r ); }; class RpmRemovePackageReceiver : public callback::ReceiveReport { callback::SendReport _report; Resolvable::constPtr _resolvable; bool _abort; std::string _finishInfo; public: RpmRemovePackageReceiver (Resolvable::constPtr res); virtual ~RpmRemovePackageReceiver (); virtual void reportbegin(); virtual void reportend(); /** Start the operation */ /** Forwards generic reports. */ void report( const UserData & userData_r ) override; virtual void start( const std::string & name ); /** * Inform about progress * Return true on abort */ virtual bool progress( unsigned percent ); /** * Returns true if removing is aborted during progress */ bool aborted() const { return _abort; } /** inform user about a problem */ virtual rpm::RpmRemoveReport::Action problem( Exception & excpt_r ); /** Additional rpm output to be reported in \ref finish in case of success. */ virtual void finishInfo( const std::string & info_r ); /** Finish operation in case of success */ virtual void finish(); /** Finish operatin in case of fail, report fail exception */ virtual void finish( Exception & excpt_r ); }; ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_TARGETCALLBACKRECEIVER_H libzypp-17.36.5/zypp/target/TargetException.cc000066400000000000000000000030171476576476200213230ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/TargetException.cc * */ #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// TargetAbortedException::TargetAbortedException() : TargetAbortedException ( _("Installation has been aborted as directed.") ) { } std::ostream & TargetAbortedException::dumpOn( std::ostream & str ) const { //call base implementation, do not hardcode a string, do not blame user ( fixes bnc#978193 ) return TargetException::dumpOn( str ); } ///////////////////////////////////////////////////////////////// } // namespace target } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/TargetException.h000066400000000000000000000044641476576476200211740ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/TargetException.h * */ #ifndef ZYPP_TARGET_TARGETEXCEPTION_H #define ZYPP_TARGET_TARGETEXCEPTION_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace target { /////////////////////////////////////////////////////////////// // // CLASS NAME : TargetException /** Just inherits Exception to separate target exceptions * **/ class ZYPP_API TargetException : public Exception { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ TargetException() : Exception( "Target Exception" ) {} /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ TargetException( const std::string & msg_r ) : Exception( msg_r ) {} /** Dtor. */ ~TargetException() throw() override {}; }; class ZYPP_API TargetAbortedException : public TargetException { public: TargetAbortedException( ); /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ TargetAbortedException( const std::string & msg_r ) : TargetException( msg_r ) {} /** Dtor. */ ~TargetAbortedException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: }; ///////////////////////////////////////////////////////////////// } // namespace target } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_TARGETEXCEPTION_H libzypp-17.36.5/zypp/target/TargetImpl.cc000066400000000000000000003514031476576476200202730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/TargetImpl.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // include the error codes from zypp-rpm #include "tools/zypp-rpm/errorcodes.h" #include #include namespace zypp::env { inline bool TRANSACTIONAL_UPDATE() { static bool val = [](){ const char * env = getenv("TRANSACTIONAL_UPDATE"); return( env && zypp::str::strToBool( env, true ) ); }(); return val; } } // namespace zypp::env using std::endl; /////////////////////////////////////////////////////////////////// extern "C" { #include #include } namespace zypp { namespace target { inline std::string rpmDbStateHash( const Pathname & root_r ) { std::string ret; AutoDispose state { ::rpm_state_create( sat::Pool::instance().get(), root_r.c_str() ), ::rpm_state_free }; AutoDispose chk { ::solv_chksum_create( REPOKEY_TYPE_SHA1 ), []( Chksum *chk ) -> void { ::solv_chksum_free( chk, nullptr ); } }; if ( ::rpm_hash_database_state( state, chk ) == 0 ) { int md5l; const unsigned char * md5 = ::solv_chksum_get( chk, &md5l ); ret = ::pool_bin2hex( sat::Pool::instance().get(), md5, md5l ); } else WAR << "rpm_hash_database_state failed" << endl; return ret; } inline RepoStatus rpmDbRepoStatus( const Pathname & root_r ) { return RepoStatus( rpmDbStateHash( root_r ), Date() ); } } // namespace target } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace { // HACK for bnc#906096: let pool re-evaluate multiversion spec // if target root changes. ZConfig returns data sensitive to // current target root. inline void sigMultiversionSpecChanged() { sat::detail::PoolMember::myPool().multiversionSpecChanged(); } } //namespace ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace json { // Lazy via template specialisation / should switch to overloading template<> inline std::string toJSON( const ZYppCommitResult::TransactionStepList & steps_r ) { using sat::Transaction; json::Array ret; for ( const Transaction::Step & step : steps_r ) // ignore implicit deletes due to obsoletes and non-package actions if ( step.stepType() != Transaction::TRANSACTION_IGNORE ) ret.add( step ); return ret.asJSON(); } /** See \ref commitbegin on page \ref plugin-commit for the specs. */ template<> inline std::string toJSON( const sat::Transaction::Step & step_r ) { static const std::string strType( "type" ); static const std::string strStage( "stage" ); static const std::string strSolvable( "solvable" ); static const std::string strTypeDel( "-" ); static const std::string strTypeIns( "+" ); static const std::string strTypeMul( "M" ); static const std::string strStageDone( "ok" ); static const std::string strStageFailed( "err" ); static const std::string strSolvableN( "n" ); static const std::string strSolvableE( "e" ); static const std::string strSolvableV( "v" ); static const std::string strSolvableR( "r" ); static const std::string strSolvableA( "a" ); using sat::Transaction; json::Object ret; switch ( step_r.stepType() ) { case Transaction::TRANSACTION_IGNORE: /*empty*/ break; case Transaction::TRANSACTION_ERASE: ret.add( strType, strTypeDel ); break; case Transaction::TRANSACTION_INSTALL: ret.add( strType, strTypeIns ); break; case Transaction::TRANSACTION_MULTIINSTALL: ret.add( strType, strTypeMul ); break; } switch ( step_r.stepStage() ) { case Transaction::STEP_TODO: /*empty*/ break; case Transaction::STEP_DONE: ret.add( strStage, strStageDone ); break; case Transaction::STEP_ERROR: ret.add( strStage, strStageFailed ); break; } { IdString ident; Edition ed; Arch arch; if ( sat::Solvable solv = step_r.satSolvable() ) { ident = solv.ident(); ed = solv.edition(); arch = solv.arch(); } else { // deleted package; post mortem data stored in Transaction::Step ident = step_r.ident(); ed = step_r.edition(); arch = step_r.arch(); } json::Object s { { strSolvableN, ident.asString() }, { strSolvableV, ed.version() }, { strSolvableR, ed.release() }, { strSolvableA, arch.asString() } }; if ( Edition::epoch_t epoch = ed.epoch() ) s.add( strSolvableE, epoch ); ret.add( strSolvable, s ); } return ret.asJSON(); } } // namespace json /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { /////////////////////////////////////////////////////////////////// namespace { class AssertMountedBase { NON_COPYABLE(AssertMountedBase); NON_MOVABLE(AssertMountedBase); protected: AssertMountedBase() {} ~AssertMountedBase() { if ( ! _mountpoint.empty() ) { // we mounted it so we unmount... MIL << "We mounted " << _mountpoint << " so we unmount it" << endl; execute({ "umount", "-R", "-l", _mountpoint.asString() }); } } protected: int execute( ExternalProgram::Arguments && cmd_r ) const { ExternalProgram prog( cmd_r, ExternalProgram::Stderr_To_Stdout ); for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) { DBG << line; } return prog.close(); } protected: Pathname _mountpoint; }; /// \brief Try to provide /proc fs if not present. /// bsc#1181328: Some systemd tools require /proc to be mounted class AssertProcMounted : private AssertMountedBase { public: AssertProcMounted( Pathname root_r ) { root_r /= "/proc"; if ( ! PathInfo(root_r/"self").isDir() ) { MIL << "Try to make sure proc is mounted at" << root_r << endl; if ( filesystem::assert_dir(root_r) == 0 && execute({ "mount", "-t", "proc", "/proc", root_r.asString() }) == 0 ) { _mountpoint = std::move(root_r); // so we'll later unmount it } else { WAR << "Mounting proc at " << root_r << " failed" << endl; } } } }; /// \brief Try to provide /dev fs if not present. /// #444: Some packages expect /dev to be mounted class AssertDevMounted : private AssertMountedBase { public: AssertDevMounted( Pathname root_r ) { root_r /= "/dev"; if ( ! PathInfo(root_r/"null").isChr() ) { MIL << "Try to make sure dev is mounted at" << root_r << endl; // https://unix.stackexchange.com/questions/263972/unmount-a-rbind-mount-without-affecting-the-original-mount // Without --make-rslave unmounting /dev/pts // may unmount /dev/pts and you're out of ptys. if ( filesystem::assert_dir(root_r) == 0 && execute({ "mount", "--rbind", "--make-rslave", "/dev", root_r.asString() }) == 0 ) { _mountpoint = std::move(root_r); // so we'll later unmount it } else { WAR << "Mounting dev at " << root_r << " failed" << endl; } } } }; } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { SolvIdentFile::Data getUserInstalledFromHistory( const Pathname & historyFile_r ) { SolvIdentFile::Data onSystemByUserList; // go and parse it: 'who' must constain an '@', then it was installed by user request. // 2009-09-29 07:25:19|install|lirc-remotes|0.8.5-3.2|x86_64|root@opensuse|InstallationImage|a204211eb0... std::ifstream infile( historyFile_r.c_str() ); for( iostr::EachLine in( infile ); in; in.next() ) { const char * ch( (*in).c_str() ); // start with year if ( *ch < '1' || '9' < *ch ) continue; const char * sep1 = ::strchr( ch, '|' ); // | after date if ( !sep1 ) continue; ++sep1; // if logs an install or delete bool installs = true; if ( ::strncmp( sep1, "install|", 8 ) ) { if ( ::strncmp( sep1, "remove |", 8 ) ) continue; // no install and no remove else installs = false; // remove } sep1 += 8; // | after what // get the package name const char * sep2 = ::strchr( sep1, '|' ); // | after name if ( !sep2 || sep1 == sep2 ) continue; (*in)[sep2-ch] = '\0'; IdString pkg( sep1 ); // we're done, if a delete if ( !installs ) { onSystemByUserList.erase( pkg ); continue; } // now guess whether user installed or not (3rd next field contains 'user@host') if ( (sep1 = ::strchr( sep2+1, '|' )) // | after version && (sep1 = ::strchr( sep1+1, '|' )) // | after arch && (sep2 = ::strchr( sep1+1, '|' )) ) // | after who { (*in)[sep2-ch] = '\0'; if ( ::strchr( sep1+1, '@' ) ) { // by user onSystemByUserList.insert( pkg ); continue; } } } MIL << "onSystemByUserList found: " << onSystemByUserList.size() << endl; return onSystemByUserList; } } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace { inline PluginFrame transactionPluginFrame( const std::string & command_r, ZYppCommitResult::TransactionStepList & steps_r ) { return PluginFrame( command_r, json::Object { { "TransactionStepList", steps_r } }.asJSON() ); } } // namespace /////////////////////////////////////////////////////////////////// /** \internal Manage writing a new testcase when doing an upgrade. */ void writeUpgradeTestcase() { unsigned toKeep( ZConfig::instance().solver_upgradeTestcasesToKeep() ); MIL << "Testcases to keep: " << toKeep << endl; if ( !toKeep ) return; Target_Ptr target( getZYpp()->getTarget() ); if ( ! target ) { WAR << "No Target no Testcase!" << endl; return; } std::string stem( "updateTestcase" ); Pathname dir( target->assertRootPrefix("/var/log/") ); Pathname next( dir / Date::now().form( stem+"-%Y-%m-%d-%H-%M-%S" ) ); { std::list content; filesystem::readdir( content, dir, /*dots*/false ); std::set cases; for_( c, content.begin(), content.end() ) { if ( str::startsWith( *c, stem ) ) cases.insert( *c ); } if ( cases.size() >= toKeep ) { unsigned toDel = cases.size() - toKeep + 1; // +1 for the new one for_( c, cases.begin(), cases.end() ) { filesystem::recursive_rmdir( dir/(*c) ); if ( ! --toDel ) break; } } } MIL << "Write new testcase " << next << endl; getZYpp()->resolver()->createSolverTestcase( next.asString(), false/*no solving*/ ); } /////////////////////////////////////////////////////////////////// namespace { ///////////////////////////////////////////////////////////////// /** Execute script and report against report_r. * Return \c std::pair to indicate if * execution was successful (first = true), or the desired * \c PatchScriptReport::Action in case execution failed * (first = false). * * \note The packager is responsible for setting the correct permissions * of the script. If the script is not executable it is reported as an * error. We must not modify the permessions. */ std::pair doExecuteScript( const Pathname & root_r, const Pathname & script_r, callback::SendReport & report_r ) { MIL << "Execute script " << PathInfo(Pathname::assertprefix( root_r,script_r)) << endl; HistoryLog historylog; historylog.comment(script_r.asString() + _(" executed"), /*timestamp*/true); ExternalProgram prog( script_r.asString(), ExternalProgram::Stderr_To_Stdout, false, -1, true, root_r ); for ( std::string output = prog.receiveLine(); output.length(); output = prog.receiveLine() ) { historylog.comment(output); if ( ! report_r->progress( PatchScriptReport::OUTPUT, output ) ) { WAR << "User request to abort script " << script_r << endl; prog.kill(); // the rest is handled by exit code evaluation // in case the script has meanwhile finished. } } std::pair ret( std::make_pair( false, PatchScriptReport::ABORT ) ); if ( prog.close() != 0 ) { ret.second = report_r->problem( prog.execError() ); WAR << "ACTION" << ret.second << "(" << prog.execError() << ")" << endl; std::ostringstream sstr; sstr << script_r << _(" execution failed") << " (" << prog.execError() << ")" << endl; historylog.comment(sstr.str(), /*timestamp*/true); return ret; } report_r->finish(); ret.first = true; return ret; } /** Execute script and report against report_r. * Return \c false if user requested \c ABORT. */ bool executeScript( const Pathname & root_r, const Pathname & script_r, callback::SendReport & report_r ) { std::pair action( std::make_pair( false, PatchScriptReport::ABORT ) ); do { action = doExecuteScript( root_r, script_r, report_r ); if ( action.first ) return true; // success switch ( action.second ) { case PatchScriptReport::ABORT: WAR << "User request to abort at script " << script_r << endl; return false; // requested abort. break; case PatchScriptReport::IGNORE: WAR << "User request to skip script " << script_r << endl; return true; // requested skip. break; case PatchScriptReport::RETRY: break; // again } } while ( action.second == PatchScriptReport::RETRY ); // THIS is not intended to be reached: INT << "Abort on unknown ACTION request " << action.second << " returned" << endl; return false; // abort. } /** Look for update scripts named 'name-version-release-*' and * execute them. Return \c false if \c ABORT was requested. * * \see http://en.opensuse.org/Software_Management/Code11/Scripts_and_Messages */ bool RunUpdateScripts( const Pathname & root_r, const Pathname & scriptsPath_r, const std::vector & checkPackages_r, bool aborting_r ) { if ( checkPackages_r.empty() ) return true; // no installed packages to check MIL << "Looking for new update scripts in (" << root_r << ")" << scriptsPath_r << endl; Pathname scriptsDir( Pathname::assertprefix( root_r, scriptsPath_r ) ); if ( ! PathInfo( scriptsDir ).isDir() ) return true; // no script dir std::list scripts; filesystem::readdir( scripts, scriptsDir, /*dots*/false ); if ( scripts.empty() ) return true; // no scripts in script dir // Now collect and execute all matching scripts. // On ABORT: at least log all outstanding scripts. // - "name-version-release" // - "name-version-release-*" bool abort = false; std::map unify; // scripts for_( it, checkPackages_r.begin(), checkPackages_r.end() ) { std::string prefix( str::form( "%s-%s", it->name().c_str(), it->edition().c_str() ) ); for_( sit, scripts.begin(), scripts.end() ) { if ( ! str::hasPrefix( *sit, prefix ) ) continue; if ( (*sit)[prefix.size()] != '\0' && (*sit)[prefix.size()] != '-' ) continue; // if not exact match it had to continue with '-' PathInfo script( scriptsDir / *sit ); Pathname localPath( scriptsPath_r/(*sit) ); // without root prefix std::string unifytag; // must not stay empty if ( script.isFile() ) { // Assert it's set as executable, unify by md5sum. filesystem::addmod( script.path(), 0500 ); unifytag = filesystem::md5sum( script.path() ); } else if ( ! script.isExist() ) { // Might be a dangling symlink, might be ok if we are in // instsys (absolute symlink within the system below /mnt). // readlink will tell.... unifytag = filesystem::readlink( script.path() ).asString(); } if ( unifytag.empty() ) continue; // Unify scripts if ( unify[unifytag].empty() ) { unify[unifytag] = localPath; } else { // translators: We may find the same script content in files with different names. // Only the first occurence is executed, subsequent ones are skipped. It's a one-line // message for a log file. Preferably start translation with "%s" std::string msg( str::form(_("%s already executed as %s)"), localPath.asString().c_str(), unify[unifytag].c_str() ) ); MIL << "Skip update script: " << msg << endl; HistoryLog().comment( msg, /*timestamp*/true ); continue; } if ( abort || aborting_r ) { WAR << "Aborting: Skip update script " << *sit << endl; HistoryLog().comment( localPath.asString() + _(" execution skipped while aborting"), /*timestamp*/true); } else { MIL << "Found update script " << *sit << endl; callback::SendReport report; report->start( make( *it ), script.path() ); if ( ! executeScript( root_r, localPath, report ) ) // script path without root prefix! abort = true; // requested abort. } } } return !abort; } /////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////// inline void copyTo( std::ostream & out_r, const Pathname & file_r ) { std::ifstream infile( file_r.c_str() ); for( iostr::EachLine in( infile ); in; in.next() ) { out_r << *in << endl; } } inline std::string notificationCmdSubst( const std::string & cmd_r, const UpdateNotificationFile & notification_r ) { std::string ret( cmd_r ); #define SUBST_IF(PAT,VAL) if ( ret.find( PAT ) != std::string::npos ) ret = str::gsub( ret, PAT, VAL ) SUBST_IF( "%p", notification_r.solvable().asString() ); SUBST_IF( "%P", notification_r.file().asString() ); #undef SUBST_IF return ret; } void sendNotification( const Pathname & root_r, const UpdateNotifications & notifications_r ) { if ( notifications_r.empty() ) return; std::string cmdspec( ZConfig::instance().updateMessagesNotify() ); MIL << "Notification command is '" << cmdspec << "'" << endl; if ( cmdspec.empty() ) return; std::string::size_type pos( cmdspec.find( '|' ) ); if ( pos == std::string::npos ) { ERR << "Can't send Notification: Missing 'format |' in command spec." << endl; HistoryLog().comment( str::Str() << _("Error sending update message notification."), /*timestamp*/true ); return; } std::string formatStr( str::toLower( str::trim( cmdspec.substr( 0, pos ) ) ) ); std::string commandStr( str::trim( cmdspec.substr( pos + 1 ) ) ); enum Format { UNKNOWN, NONE, SINGLE, DIGEST, BULK }; Format format = UNKNOWN; if ( formatStr == "none" ) format = NONE; else if ( formatStr == "single" ) format = SINGLE; else if ( formatStr == "digest" ) format = DIGEST; else if ( formatStr == "bulk" ) format = BULK; else { ERR << "Can't send Notification: Unknown format '" << formatStr << " |' in command spec." << endl; HistoryLog().comment( str::Str() << _("Error sending update message notification."), /*timestamp*/true ); return; } // Take care: commands are ececuted chroot(root_r). The message file // pathnames in notifications_r are local to root_r. For physical access // to the file they need to be prefixed. if ( format == NONE || format == SINGLE ) { for_( it, notifications_r.begin(), notifications_r.end() ) { std::vector command; if ( format == SINGLE ) command.push_back( "<"+Pathname::assertprefix( root_r, it->file() ).asString() ); str::splitEscaped( notificationCmdSubst( commandStr, *it ), std::back_inserter( command ) ); ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout, false, -1, true, root_r ); if ( true ) // Wait for feedback { for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) { DBG << line; } int ret = prog.close(); if ( ret != 0 ) { ERR << "Notification command returned with error (" << ret << ")." << endl; HistoryLog().comment( str::Str() << _("Error sending update message notification."), /*timestamp*/true ); return; } } } } else if ( format == DIGEST || format == BULK ) { filesystem::TmpFile tmpfile; std::ofstream out( tmpfile.path().c_str() ); for_( it, notifications_r.begin(), notifications_r.end() ) { if ( format == DIGEST ) { out << it->file() << endl; } else if ( format == BULK ) { copyTo( out << '\f', Pathname::assertprefix( root_r, it->file() ) ); } } std::vector command; command.push_back( "<"+tmpfile.path().asString() ); // redirect input str::splitEscaped( notificationCmdSubst( commandStr, *notifications_r.begin() ), std::back_inserter( command ) ); ExternalProgram prog( command, ExternalProgram::Stderr_To_Stdout, false, -1, true, root_r ); if ( true ) // Wait for feedback otherwise the TmpFile goes out of scope. { for( std::string line = prog.receiveLine(); ! line.empty(); line = prog.receiveLine() ) { DBG << line; } int ret = prog.close(); if ( ret != 0 ) { ERR << "Notification command returned with error (" << ret << ")." << endl; HistoryLog().comment( str::Str() << _("Error sending update message notification."), /*timestamp*/true ); return; } } } else { INT << "Can't send Notification: Missing handler for 'format |' in command spec." << endl; HistoryLog().comment( str::Str() << _("Error sending update message notification."), /*timestamp*/true ); return; } } /** Look for update messages named 'name-version-release-*' and * send notification according to \ref ZConfig::updateMessagesNotify. * * \see http://en.opensuse.org/Software_Management/Code11/Scripts_and_Messages */ void RunUpdateMessages( const Pathname & root_r, const Pathname & messagesPath_r, const std::vector & checkPackages_r, ZYppCommitResult & result_r ) { if ( checkPackages_r.empty() ) return; // no installed packages to check MIL << "Looking for new update messages in (" << root_r << ")" << messagesPath_r << endl; Pathname messagesDir( Pathname::assertprefix( root_r, messagesPath_r ) ); if ( ! PathInfo( messagesDir ).isDir() ) return; // no messages dir std::list messages; filesystem::readdir( messages, messagesDir, /*dots*/false ); if ( messages.empty() ) return; // no messages in message dir // Now collect all matching messages in result and send them // - "name-version-release" // - "name-version-release-*" HistoryLog historylog; for_( it, checkPackages_r.begin(), checkPackages_r.end() ) { std::string prefix( str::form( "%s-%s", it->name().c_str(), it->edition().c_str() ) ); for_( sit, messages.begin(), messages.end() ) { if ( ! str::hasPrefix( *sit, prefix ) ) continue; if ( (*sit)[prefix.size()] != '\0' && (*sit)[prefix.size()] != '-' ) continue; // if not exact match it had to continue with '-' PathInfo message( messagesDir / *sit ); if ( ! message.isFile() || message.size() == 0 ) continue; MIL << "Found update message " << *sit << endl; Pathname localPath( messagesPath_r/(*sit) ); // without root prefix result_r.rUpdateMessages().push_back( UpdateNotificationFile( *it, localPath ) ); historylog.comment( str::Str() << _("New update message") << " " << localPath, /*timestamp*/true ); } } sendNotification( root_r, result_r.updateMessages() ); } /** jsc#SLE-5116: Log patch status changes to history. * Adjust precomputed set if transaction is incomplete. */ void logPatchStatusChanges( const sat::Transaction & transaction_r, TargetImpl & target_r ) { ResPool::ChangedPseudoInstalled changedPseudoInstalled { ResPool::instance().changedPseudoInstalled() }; if ( changedPseudoInstalled.empty() ) return; if ( ! transaction_r.actionEmpty( ~sat::Transaction::STEP_DONE ) ) { // Need to recompute the patch list if commit is incomplete! // We remember the initially established status, then reload the // Target to get the current patch status. Then compare. WAR << "Need to recompute the patch status changes as commit is incomplete!" << endl; ResPool::EstablishedStates establishedStates{ ResPool::instance().establishedStates() }; target_r.load(); changedPseudoInstalled = establishedStates.changedPseudoInstalled(); } HistoryLog historylog; for ( const auto & el : changedPseudoInstalled ) historylog.patchStateChange( el.first, el.second ); } ///////////////////////////////////////////////////////////////// } // namespace /////////////////////////////////////////////////////////////////// void XRunUpdateMessages( const Pathname & root_r, const Pathname & messagesPath_r, const std::vector & checkPackages_r, ZYppCommitResult & result_r ) { RunUpdateMessages( root_r, messagesPath_r, checkPackages_r, result_r ); } /////////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(TargetImpl); /////////////////////////////////////////////////////////////////// // // METHOD NAME : TargetImpl::TargetImpl // METHOD TYPE : Ctor // TargetImpl::TargetImpl( const Pathname & root_r, bool doRebuild_r ) : _root( root_r ) , _requestedLocalesFile( home() / "RequestedLocales" ) , _autoInstalledFile( home() / "AutoInstalled" ) , _hardLocksFile( Pathname::assertprefix( _root, ZConfig::instance().locksFile() ) ) , _vendorAttr( Pathname::assertprefix( _root, ZConfig::instance().vendorPath() ) ) { _rpm.initDatabase( root_r, doRebuild_r ); HistoryLog::setRoot(_root); createAnonymousId(); sigMultiversionSpecChanged(); // HACK: see sigMultiversionSpecChanged MIL << "Initialized target on " << _root << endl; } /** * generates a random id using uuidgen */ static std::string generateRandomId() { std::ifstream uuidprovider( "/proc/sys/kernel/random/uuid" ); return iostr::getline( uuidprovider ); } /** * updates the content of \p filename * if \p condition is true, setting the content * the the value returned by \p value */ void updateFileContent( const Pathname &filename, boost::function condition, boost::function value ) { std::string val = value(); // if the value is empty, then just dont // do anything, regardless of the condition if ( val.empty() ) return; if ( condition() ) { MIL << "updating '" << filename << "' content." << endl; // if the file does not exist we need to generate the uuid file std::ofstream filestr; // make sure the path exists filesystem::assert_dir( filename.dirname() ); filestr.open( filename.c_str() ); if ( filestr.good() ) { filestr << val; filestr.close(); } else { // FIXME, should we ignore the error? ZYPP_THROW(Exception("Can't openfile '" + filename.asString() + "' for writing")); } } } /** helper functor */ static bool fileMissing( const Pathname &pathname ) { return ! PathInfo(pathname).isExist(); } void TargetImpl::createAnonymousId() const { // bsc#1024741: Omit creating a new uid for chrooted systems (if it already has one, fine) if ( root() != "/" ) return; // Create the anonymous unique id, used for download statistics Pathname idpath( home() / "AnonymousUniqueId"); try { updateFileContent( idpath, std::bind(fileMissing, idpath), generateRandomId ); } catch ( const Exception &e ) { WAR << "Can't create anonymous id file" << endl; } } void TargetImpl::createLastDistributionFlavorCache() const { // create the anonymous unique id // this value is used for statistics Pathname flavorpath( home() / "LastDistributionFlavor"); // is there a product Product::constPtr p = baseProduct(); if ( ! p ) { WAR << "No base product, I won't create flavor cache" << endl; return; } std::string flavor = p->flavor(); try { updateFileContent( flavorpath, // only if flavor is not empty functor::Constant( ! flavor.empty() ), functor::Constant(flavor) ); } catch ( const Exception &e ) { WAR << "Can't create flavor cache" << endl; return; } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : TargetImpl::~TargetImpl // METHOD TYPE : Dtor // TargetImpl::~TargetImpl() { _rpm.closeDatabase(); sigMultiversionSpecChanged(); // HACK: see sigMultiversionSpecChanged MIL << "Closed target on " << _root << endl; } /////////////////////////////////////////////////////////////////// // // solv file handling // /////////////////////////////////////////////////////////////////// Pathname TargetImpl::defaultSolvfilesPath() const { return Pathname::assertprefix( _root, ZConfig::instance().repoSolvfilesPath() / sat::Pool::instance().systemRepoAlias() ); } void TargetImpl::clearCache() { Pathname base = solvfilesPath(); filesystem::recursive_rmdir( base ); } bool TargetImpl::buildCache() { Pathname base = solvfilesPath(); Pathname rpmsolv = base/"solv"; Pathname rpmsolvcookie = base/"cookie"; bool build_rpm_solv = true; // lets see if the rpm solv cache exists RepoStatus rpmstatus( rpmDbRepoStatus(_root) && RepoStatus(_root/"etc/products.d") ); bool solvexisted = PathInfo(rpmsolv).isExist(); if ( solvexisted ) { // see the status of the cache PathInfo cookie( rpmsolvcookie ); MIL << "Read cookie: " << cookie << endl; if ( cookie.isExist() ) { RepoStatus status = RepoStatus::fromCookieFile(rpmsolvcookie); // now compare it with the rpm database if ( status == rpmstatus ) build_rpm_solv = false; MIL << "Read cookie: " << rpmsolvcookie << " says: " << (build_rpm_solv ? "outdated" : "uptodate") << endl; } } if ( build_rpm_solv ) { // if the solvfile dir does not exist yet, we better create it filesystem::assert_dir( base ); Pathname oldSolvFile( solvexisted ? rpmsolv : Pathname() ); // to speedup rpmdb2solv filesystem::TmpFile tmpsolv( filesystem::TmpFile::makeSibling( rpmsolv ) ); if ( !tmpsolv ) { // Can't create temporary solv file, usually due to insufficient permission // (user query while @System solv needs refresh). If so, try switching // to a location within zypps temp. space (will be cleaned at application end). bool switchingToTmpSolvfile = false; Exception ex("Failed to cache rpm database."); ex.remember(str::form("Cannot create temporary file under %s.", base.c_str())); if ( ! solvfilesPathIsTemp() ) { base = getZYpp()->tmpPath() / sat::Pool::instance().systemRepoAlias(); rpmsolv = base/"solv"; rpmsolvcookie = base/"cookie"; filesystem::assert_dir( base ); tmpsolv = filesystem::TmpFile::makeSibling( rpmsolv ); if ( tmpsolv ) { WAR << "Using a temporary solv file at " << base << endl; switchingToTmpSolvfile = true; _tmpSolvfilesPath = base; } else { ex.remember(str::form("Cannot create temporary file under %s.", base.c_str())); } } if ( ! switchingToTmpSolvfile ) { ZYPP_THROW(ex); } } // Take care we unlink the solvfile on exception ManagedFile guard( base, filesystem::recursive_rmdir ); ExternalProgram::Arguments cmd; #ifdef ZYPP_RPMDB2SOLV_PATH cmd.push_back( ZYPP_RPMDB2SOLV_PATH ); #else cmd.push_back( "rpmdb2solv" ); #endif if ( ! _root.empty() ) { cmd.push_back( "-r" ); cmd.push_back( _root.asString() ); } cmd.push_back( "-D" ); cmd.push_back( rpm().dbPath().asString() ); cmd.push_back( "-X" ); // autogenerate pattern/product/... from -package // bsc#1104415: no more application support // cmd.push_back( "-A" ); // autogenerate application pseudo packages cmd.push_back( "-p" ); cmd.push_back( Pathname::assertprefix( _root, "/etc/products.d" ).asString() ); if ( ! oldSolvFile.empty() ) cmd.push_back( oldSolvFile.asString() ); cmd.push_back( "-o" ); cmd.push_back( tmpsolv.path().asString() ); ExternalProgram prog( cmd, ExternalProgram::Stderr_To_Stdout ); std::string errdetail; for ( std::string output( prog.receiveLine() ); output.length(); output = prog.receiveLine() ) { WAR << " " << output; if ( errdetail.empty() ) { errdetail = prog.command(); errdetail += '\n'; } errdetail += output; } int ret = prog.close(); if ( ret != 0 ) { Exception ex(str::form("Failed to cache rpm database (%d).", ret)); ex.remember( errdetail ); ZYPP_THROW(ex); } ret = filesystem::rename( tmpsolv, rpmsolv ); if ( ret != 0 ) ZYPP_THROW(Exception("Failed to move cache to final destination")); // if this fails, don't bother throwing exceptions filesystem::chmod( rpmsolv, 0644 ); rpmstatus.saveToCookieFile(rpmsolvcookie); // We keep it. guard.resetDispose(); sat::updateSolvFileIndex( rpmsolv ); // content digest for zypper bash completion // system-hook: Finally send notification to plugins if ( root() == "/" ) { PluginExecutor plugins; plugins.load( ZConfig::instance().pluginsPath()/"system" ); if ( plugins ) plugins.send( PluginFrame( "PACKAGESETCHANGED" ) ); } } else { // On the fly add missing solv.idx files for bash completion. if ( ! PathInfo(base/"solv.idx").isExist() ) sat::updateSolvFileIndex( rpmsolv ); } return build_rpm_solv; } void TargetImpl::reload() { load( false ); } void TargetImpl::unload() { Repository system( sat::Pool::instance().findSystemRepo() ); if ( system ) system.eraseFromPool(); } void TargetImpl::load( bool force ) { bool newCache = buildCache(); MIL << "New cache built: " << (newCache?"true":"false") << ", force loading: " << (force?"true":"false") << endl; // now add the repos to the pool sat::Pool satpool( sat::Pool::instance() ); Pathname rpmsolv( solvfilesPath() / "solv" ); MIL << "adding " << rpmsolv << " to pool(" << satpool.systemRepoAlias() << ")" << endl; // Providing an empty system repo, unload any old content Repository system( sat::Pool::instance().findSystemRepo() ); if ( system && ! system.solvablesEmpty() ) { if ( newCache || force ) { system.eraseFromPool(); // invalidates system } else { return; // nothing to do } } if ( ! system ) { system = satpool.systemRepo(); } try { MIL << "adding " << rpmsolv << " to system" << endl; system.addSolv( rpmsolv ); } catch ( const Exception & exp ) { ZYPP_CAUGHT( exp ); MIL << "Try to handle exception by rebuilding the solv-file" << endl; clearCache(); buildCache(); system.addSolv( rpmsolv ); } satpool.rootDir( _root ); // (Re)Load the requested locales et al. // If the requested locales are empty, we leave the pool untouched // to avoid undoing changes the application applied. We expect this // to happen on a bare metal installation only. An already existing // target should be loaded before its settings are changed. { const LocaleSet & requestedLocales( _requestedLocalesFile.locales() ); if ( ! requestedLocales.empty() ) { satpool.initRequestedLocales( requestedLocales ); } } { if ( ! PathInfo( _autoInstalledFile.file() ).isExist() ) { // Initialize from history, if it does not exist Pathname historyFile( Pathname::assertprefix( _root, ZConfig::instance().historyLogFile() ) ); if ( PathInfo( historyFile ).isExist() ) { SolvIdentFile::Data onSystemByUser( getUserInstalledFromHistory( historyFile ) ); SolvIdentFile::Data onSystemByAuto; for_( it, system.solvablesBegin(), system.solvablesEnd() ) { IdString ident( (*it).ident() ); if ( onSystemByUser.find( ident ) == onSystemByUser.end() ) onSystemByAuto.insert( ident ); } _autoInstalledFile.setData( onSystemByAuto ); } // on the fly removed any obsolete SoftLocks file filesystem::unlink( home() / "SoftLocks" ); } // read from AutoInstalled file sat::StringQueue q; for ( const auto & idstr : _autoInstalledFile.data() ) q.push( idstr.id() ); satpool.setAutoInstalled( q ); } // Load the needreboot package specs { sat::SolvableSpec needrebootSpec; needrebootSpec.addProvides( Capability("installhint(reboot-needed)") ); needrebootSpec.addProvides( Capability("kernel") ); Pathname needrebootFile { Pathname::assertprefix( root(), ZConfig::instance().needrebootFile() ) }; if ( PathInfo( needrebootFile ).isFile() ) needrebootSpec.parseFrom( needrebootFile ); Pathname needrebootDir { Pathname::assertprefix( root(), ZConfig::instance().needrebootPath() ) }; if ( PathInfo( needrebootDir ).isDir() ) { static const StrMatcher isRpmConfigBackup( "\\.rpm(new|save|orig)$", Match::REGEX ); filesystem::dirForEach( needrebootDir, filesystem::matchNoDots(), [&]( const Pathname & dir_r, const char *const str_r )->bool { if ( ! isRpmConfigBackup( str_r ) ) { Pathname needrebootFile { needrebootDir / str_r }; if ( PathInfo( needrebootFile ).isFile() ) needrebootSpec.parseFrom( needrebootFile ); } return true; }); } satpool.setNeedrebootSpec( std::move(needrebootSpec) ); } if ( ZConfig::instance().apply_locks_file() ) { const HardLocksFile::Data & hardLocks( _hardLocksFile.data() ); if ( ! hardLocks.empty() ) { ResPool::instance().setHardLockQueries( hardLocks ); } } // now that the target is loaded, we can cache the flavor createLastDistributionFlavorCache(); MIL << "Target loaded: " << system.solvablesSize() << " resolvables" << endl; } /////////////////////////////////////////////////////////////////// // // COMMIT // /////////////////////////////////////////////////////////////////// ZYppCommitResult TargetImpl::commit( ResPool pool_r, const ZYppCommitPolicy & policy_rX ) { // ----------------------------------------------------------------- // ZYppCommitPolicy policy_r( policy_rX ); bool explicitDryRun = policy_r.dryRun(); // explicit dry run will trigger a fileconflict check, implicit (download-only) not. ShutdownLock lck("zypp", "Zypp commit running."); // Fake outstanding YCP fix: Honour restriction to media 1 // at installation, but install all remaining packages if post-boot. if ( policy_r.restrictToMedia() > 1 ) policy_r.allMedia(); if ( policy_r.downloadMode() == DownloadDefault ) { if ( root() == "/" ) policy_r.downloadMode(DownloadInHeaps); else { if ( policy_r.singleTransModeEnabled() ) policy_r.downloadMode(DownloadInAdvance); else policy_r.downloadMode(DownloadAsNeeded); } } // DownloadOnly implies dry-run. else if ( policy_r.downloadMode() == DownloadOnly ) policy_r.dryRun( true ); // ----------------------------------------------------------------- // MIL << "TargetImpl::commit(, " << policy_r << ")" << endl; /////////////////////////////////////////////////////////////////// // Compute transaction: /////////////////////////////////////////////////////////////////// ZYppCommitResult result( root() ); result.rTransaction() = pool_r.resolver().getTransaction(); result.rTransaction().order(); // steps: this is our todo-list ZYppCommitResult::TransactionStepList & steps( result.rTransactionStepList() ); if ( policy_r.restrictToMedia() ) { // Collect until the 1st package from an unwanted media occurs. // Further collection could violate install order. MIL << "Restrict to media number " << policy_r.restrictToMedia() << endl; for_( it, result.transaction().begin(), result.transaction().end() ) { if ( makeResObject( *it )->mediaNr() > 1 ) break; steps.push_back( *it ); } } else { result.rTransactionStepList().insert( steps.end(), result.transaction().begin(), result.transaction().end() ); } MIL << "Todo: " << result << endl; /////////////////////////////////////////////////////////////////// // Prepare execution of commit plugins: /////////////////////////////////////////////////////////////////// PluginExecutor commitPlugins; if ( ( root() == "/" || zypp::env::TRANSACTIONAL_UPDATE() ) && ! policy_r.dryRun() ) { commitPlugins.load( ZConfig::instance().pluginsPath()/"commit" ); } if ( commitPlugins ) commitPlugins.send( transactionPluginFrame( "COMMITBEGIN", steps ) ); /////////////////////////////////////////////////////////////////// // Write out a testcase if we're in dist upgrade mode. /////////////////////////////////////////////////////////////////// if ( pool_r.resolver().upgradeMode() || pool_r.resolver().upgradingRepos() ) { if ( ! policy_r.dryRun() ) { writeUpgradeTestcase(); } else { DBG << "dryRun: Not writing upgrade testcase." << endl; } } /////////////////////////////////////////////////////////////////// // Store non-package data: /////////////////////////////////////////////////////////////////// if ( ! policy_r.dryRun() ) { filesystem::assert_dir( home() ); // requested locales _requestedLocalesFile.setLocales( pool_r.getRequestedLocales() ); // autoinstalled { SolvIdentFile::Data newdata; for ( sat::Queue::value_type id : result.rTransaction().autoInstalled() ) newdata.insert( IdString(id) ); _autoInstalledFile.setData( newdata ); } // hard locks if ( ZConfig::instance().apply_locks_file() ) { HardLocksFile::Data newdata; pool_r.getHardLockQueries( newdata ); _hardLocksFile.setData( newdata ); } } else { DBG << "dryRun: Not storing non-package data." << endl; } /////////////////////////////////////////////////////////////////// // First collect and display all messages // associated with patches to be installed. /////////////////////////////////////////////////////////////////// if ( ! policy_r.dryRun() ) { for_( it, steps.begin(), steps.end() ) { if ( ! it->satSolvable().isKind() ) continue; PoolItem pi( *it ); if ( ! pi.status().isToBeInstalled() ) continue; Patch::constPtr patch( asKind(pi.resolvable()) ); if ( ! patch ||patch->message().empty() ) continue; MIL << "Show message for " << patch << endl; callback::SendReport report; if ( ! report->show( patch ) ) { WAR << "commit aborted by the user" << endl; ZYPP_THROW( TargetAbortedException( ) ); } } } else { DBG << "dryRun: Not checking patch messages." << endl; } /////////////////////////////////////////////////////////////////// // Remove/install packages. /////////////////////////////////////////////////////////////////// DBG << "commit log file is set to: " << HistoryLog::fname() << endl; if ( ! policy_r.dryRun() || policy_r.downloadMode() == DownloadOnly ) { // Prepare the package cache. Pass all items requiring download. CommitPackageCache packageCache; packageCache.setCommitList( steps.begin(), steps.end() ); bool miss = false; std::unique_ptr preloader; if ( policy_r.downloadMode() != DownloadAsNeeded ) { { // concurrently preload the download cache as a workaround until we have // migration to full async workflows ready preloader = std::make_unique(); preloader->preloadTransaction( steps ); miss = preloader->missed (); } if ( !miss ) { // Preload the cache. Until now this means pre-loading all packages. // Once DownloadInHeaps is fully implemented, this will change and // we may actually have more than one heap. for_( it, steps.begin(), steps.end() ) { switch ( it->stepType() ) { case sat::Transaction::TRANSACTION_INSTALL: case sat::Transaction::TRANSACTION_MULTIINSTALL: // proceed: only install actionas may require download. break; default: // next: no download for or non-packages and delete actions. continue; break; } PoolItem pi( *it ); if ( pi->isKind() || pi->isKind() ) { ManagedFile localfile; try { localfile = packageCache.get( pi ); localfile.resetDispose(); // keep the package file in the cache } catch ( const AbortRequestException & exp ) { it->stepStage( sat::Transaction::STEP_ERROR ); miss = true; WAR << "commit cache preload aborted by the user" << endl; ZYPP_THROW( TargetAbortedException( ) ); break; } catch ( const SkipRequestException & exp ) { ZYPP_CAUGHT( exp ); it->stepStage( sat::Transaction::STEP_ERROR ); miss = true; WAR << "Skipping cache preload package " << pi->asKind() << " in commit" << endl; continue; } catch ( const Exception & exp ) { // bnc #395704: missing catch causes abort. // TODO see if packageCache fails to handle errors correctly. ZYPP_CAUGHT( exp ); it->stepStage( sat::Transaction::STEP_ERROR ); miss = true; INT << "Unexpected Error: Skipping cache preload package " << pi->asKind() << " in commit" << endl; continue; } } } packageCache.preloaded( true ); // try to avoid duplicate infoInCache CBs in commit } } if ( miss ) { ERR << "Some packages could not be provided. Aborting commit."<< endl; } else { if ( ! policy_r.dryRun() ) { if ( policy_r.singleTransModeEnabled() ) { commitInSingleTransaction( policy_r, packageCache, result ); } else { // if cache is preloaded, check for file conflicts commitFindFileConflicts( policy_r, result ); commit( policy_r, packageCache, result ); } if ( preloader ) preloader->cleanupCaches (); } else { DBG << "dryRun/downloadOnly: Not installing/deleting anything." << endl; if ( explicitDryRun ) { if ( policy_r.singleTransModeEnabled() ) { // single trans mode does a test install via rpm commitInSingleTransaction( policy_r, packageCache, result ); } else { // if cache is preloaded, check for file conflicts commitFindFileConflicts( policy_r, result ); } } } } } else { DBG << "dryRun: Not downloading/installing/deleting anything." << endl; if ( explicitDryRun ) { // if cache is preloaded, check for file conflicts commitFindFileConflicts( policy_r, result ); } } { // NOTE: Removing rpm in a transaction, rpm removes the /var/lib/rpm compat symlink. // We re-create it, in case it was lost to prevent legacy tools from accidentally // assuming no database is present. if ( ! PathInfo(_root/"/var/lib/rpm",PathInfo::LSTAT).isExist() && PathInfo(_root/"/usr/lib/sysimage/rpm").isDir() ) { WAR << "(rpm removed in commit?) Inject missing /var/lib/rpm compat symlink to /usr/lib/sysimage/rpm" << endl; filesystem::assert_dir( _root/"/var/lib" ); filesystem::symlink( "../../usr/lib/sysimage/rpm", _root/"/var/lib/rpm" ); } } /////////////////////////////////////////////////////////////////// // Send result to commit plugins: /////////////////////////////////////////////////////////////////// if ( commitPlugins ) commitPlugins.send( transactionPluginFrame( "COMMITEND", steps ) ); /////////////////////////////////////////////////////////////////// // Try to rebuild solv file while rpm database is still in cache /////////////////////////////////////////////////////////////////// if ( ! policy_r.dryRun() ) { buildCache(); } MIL << "TargetImpl::commit(, " << policy_r << ") returns: " << result << endl; return result; } /////////////////////////////////////////////////////////////////// // // COMMIT internal // /////////////////////////////////////////////////////////////////// namespace { struct NotifyAttemptToModify { NotifyAttemptToModify( ZYppCommitResult & result_r ) : _result( result_r ) {} void operator()() { if ( _guard ) { _result.attemptToModify( true ); _guard = false; } } TrueBool _guard; ZYppCommitResult & _result; }; } // namespace void TargetImpl::commit( const ZYppCommitPolicy & policy_r, CommitPackageCache & packageCache_r, ZYppCommitResult & result_r ) { // steps: this is our todo-list ZYppCommitResult::TransactionStepList & steps( result_r.rTransactionStepList() ); MIL << "TargetImpl::commit(" << policy_r << ")" << steps.size() << endl; HistoryLog().stampCommand(); // Send notification once upon 1st call to rpm NotifyAttemptToModify attemptToModify( result_r ); bool abort = false; // bsc#1181328: Some systemd tools require /proc to be mounted AssertProcMounted assertProcMounted( _root ); AssertDevMounted assertDevMounted( _root ); // also /dev RpmPostTransCollector postTransCollector( _root ); std::vector successfullyInstalledPackages; TargetImpl::PoolItemList remaining; for_( step, steps.begin(), steps.end() ) { PoolItem citem( *step ); if ( step->stepType() == sat::Transaction::TRANSACTION_IGNORE ) { if ( citem->isKind() ) { // for packages this means being obsoleted (by rpm) // thius no additional action is needed. step->stepStage( sat::Transaction::STEP_DONE ); continue; } } if ( citem->isKind() ) { Package::constPtr p = citem->asKind(); if ( citem.status().isToBeInstalled() ) { ManagedFile localfile; try { localfile = packageCache_r.get( citem ); } catch ( const AbortRequestException &e ) { WAR << "commit aborted by the user" << endl; abort = true; step->stepStage( sat::Transaction::STEP_ERROR ); break; } catch ( const SkipRequestException &e ) { ZYPP_CAUGHT( e ); WAR << "Skipping package " << p << " in commit" << endl; step->stepStage( sat::Transaction::STEP_ERROR ); continue; } catch ( const Exception &e ) { // bnc #395704: missing catch causes abort. // TODO see if packageCache fails to handle errors correctly. ZYPP_CAUGHT( e ); INT << "Unexpected Error: Skipping package " << p << " in commit" << endl; step->stepStage( sat::Transaction::STEP_ERROR ); continue; } // create a installation progress report proxy RpmInstallPackageReceiver progress( citem.resolvable() ); progress.connect(); // disconnected on destruction. bool success = false; rpm::RpmInstFlags flags( policy_r.rpmInstFlags() & rpm::RPMINST_JUSTDB ); // Why force and nodeps? // // Because zypp builds the transaction and the resolver asserts that // everything is fine. // We use rpm just to unpack and register the package in the database. // We do this step by step, so rpm is not aware of the bigger context. // So we turn off rpms internal checks, because we do it inside zypp. flags |= rpm::RPMINST_NODEPS; flags |= rpm::RPMINST_FORCE; // if (p->multiversionInstall()) flags |= rpm::RPMINST_NOUPGRADE; if (policy_r.dryRun()) flags |= rpm::RPMINST_TEST; if (policy_r.rpmExcludeDocs()) flags |= rpm::RPMINST_EXCLUDEDOCS; if (policy_r.rpmNoSignature()) flags |= rpm::RPMINST_NOSIGNATURE; attemptToModify(); try { progress.tryLevel( target::rpm::InstallResolvableReport::RPM_NODEPS_FORCE ); rpm().installPackage( localfile, flags, &postTransCollector ); HistoryLog().install(citem); if ( progress.aborted() ) { WAR << "commit aborted by the user" << endl; localfile.resetDispose(); // keep the package file in the cache abort = true; step->stepStage( sat::Transaction::STEP_ERROR ); break; } else { if ( citem.isNeedreboot() ) { auto rebootNeededFile = root() / "/run/reboot-needed"; if ( filesystem::assert_file( rebootNeededFile ) == EEXIST) filesystem::touch( rebootNeededFile ); } success = true; step->stepStage( sat::Transaction::STEP_DONE ); } } catch ( Exception & excpt_r ) { ZYPP_CAUGHT(excpt_r); localfile.resetDispose(); // keep the package file in the cache if ( policy_r.dryRun() ) { WAR << "dry run failed" << endl; step->stepStage( sat::Transaction::STEP_ERROR ); break; } // else if ( progress.aborted() ) { WAR << "commit aborted by the user" << endl; abort = true; } else { WAR << "Install failed" << endl; } step->stepStage( sat::Transaction::STEP_ERROR ); break; // stop } if ( success && !policy_r.dryRun() ) { citem.status().resetTransact( ResStatus::USER ); successfullyInstalledPackages.push_back( citem.satSolvable() ); step->stepStage( sat::Transaction::STEP_DONE ); } } else { RpmRemovePackageReceiver progress( citem.resolvable() ); progress.connect(); // disconnected on destruction. bool success = false; rpm::RpmInstFlags flags( policy_r.rpmInstFlags() & rpm::RPMINST_JUSTDB ); flags |= rpm::RPMINST_NODEPS; if (policy_r.dryRun()) flags |= rpm::RPMINST_TEST; attemptToModify(); try { rpm().removePackage( p, flags, &postTransCollector ); HistoryLog().remove(citem); if ( progress.aborted() ) { WAR << "commit aborted by the user" << endl; abort = true; step->stepStage( sat::Transaction::STEP_ERROR ); break; } else { success = true; step->stepStage( sat::Transaction::STEP_DONE ); } } catch (Exception & excpt_r) { ZYPP_CAUGHT( excpt_r ); if ( progress.aborted() ) { WAR << "commit aborted by the user" << endl; abort = true; step->stepStage( sat::Transaction::STEP_ERROR ); break; } // else WAR << "removal of " << p << " failed"; step->stepStage( sat::Transaction::STEP_ERROR ); } if ( success && !policy_r.dryRun() ) { citem.status().resetTransact( ResStatus::USER ); step->stepStage( sat::Transaction::STEP_DONE ); } } } else if ( ! policy_r.dryRun() ) // other resolvables (non-Package) { // Status is changed as the buddy package buddy // gets installed/deleted. Handle non-buddies only. if ( ! citem.buddy() ) { if ( citem->isKind() ) { Product::constPtr p = citem->asKind(); if ( citem.status().isToBeInstalled() ) { ERR << "Can't install orphan product without release-package! " << citem << endl; } else { // Deleting the corresponding product entry is all we con do. // So the product will no longer be visible as installed. std::string referenceFilename( p->referenceFilename() ); if ( referenceFilename.empty() ) { ERR << "Can't remove orphan product without 'referenceFilename'! " << citem << endl; } else { Pathname referencePath { Pathname("/etc/products.d") / referenceFilename }; // no root prefix for rpmdb lookup! if ( ! rpm().hasFile( referencePath.asString() ) ) { // If it's not owned by a package, we can delete it. referencePath = Pathname::assertprefix( _root, referencePath ); // now add a root prefix if ( filesystem::unlink( referencePath ) != 0 ) ERR << "Delete orphan product failed: " << referencePath << endl; } else { WAR << "Won't remove orphan product: '/etc/products.d/" << referenceFilename << "' is owned by a package." << endl; } } } } else if ( citem->isKind() && citem.status().isToBeInstalled() ) { // SrcPackage is install-only SrcPackage::constPtr p = citem->asKind(); installSrcPackage( p ); } citem.status().resetTransact( ResStatus::USER ); step->stepStage( sat::Transaction::STEP_DONE ); } } // other resolvables } // for // Process any remembered %posttrans and/or %transfiletrigger(postun|in) // scripts. If aborting, at least log if scripts were omitted. if ( not abort ) postTransCollector.executeScripts( rpm() ); else postTransCollector.discardScripts(); // Check presence of update scripts/messages. If aborting, // at least log omitted scripts. if ( ! successfullyInstalledPackages.empty() ) { if ( ! RunUpdateScripts( _root, ZConfig::instance().update_scriptsPath(), successfullyInstalledPackages, abort ) ) { WAR << "Commit aborted by the user" << endl; abort = true; } // send messages after scripts in case some script generates output, // that should be kept in t %ghost message file. RunUpdateMessages( _root, ZConfig::instance().update_messagesPath(), successfullyInstalledPackages, result_r ); } // jsc#SLE-5116: Log patch status changes to history // NOTE: Should be the last action as it may need to reload // the Target in case of an incomplete transaction. logPatchStatusChanges( result_r.transaction(), *this ); if ( abort ) { HistoryLog().comment( "Commit was aborted." ); ZYPP_THROW( TargetAbortedException( ) ); } } /////////////////////////////////////////////////////////////////// /// \brief Convenience SendReport wrapper. /// /// Provide convenience methods to invoke a generic \ref report /// supplied with the proper \ref UserData and \ref ContentType, /////////////////////////////////////////////////////////////////// struct SendSingleTransReport : public callback::SendReport { /** Convenience to send a \ref contentLogline. */ void sendLogline( const std::string & line_r, ReportType::loglevel level_r = ReportType::loglevel::msg ) { callback::UserData data { ReportType::contentLogline }; data.set( "line", std::cref(line_r) ); data.set( "level", level_r ); report( data ); } /** Convenience to send a \ref contentLogline translating a rpm loglevel. */ void sendLoglineRpm( const std::string & line_r, unsigned rpmlevel_r ) { auto u2rpmlevel = []( unsigned rpmlevel_r ) -> ReportType::loglevel { switch ( rpmlevel_r ) { case RPMLOG_EMERG: [[fallthrough]]; // system is unusable case RPMLOG_ALERT: [[fallthrough]]; // action must be taken immediately case RPMLOG_CRIT: // critical conditions return ReportType::loglevel::crt; case RPMLOG_ERR: // error conditions return ReportType::loglevel::err; case RPMLOG_WARNING: // warning conditions return ReportType::loglevel::war; default: [[fallthrough]]; case RPMLOG_NOTICE: [[fallthrough]]; // normal but significant condition case RPMLOG_INFO: // informational return ReportType::loglevel::msg; case RPMLOG_DEBUG: return ReportType::loglevel::dbg; } }; sendLogline( line_r, u2rpmlevel( rpmlevel_r ) ); } private: void report( const callback::UserData & userData_r ) { (*this)->report( userData_r ); } }; const callback::UserData::ContentType rpm::SingleTransReport::contentLogline { "zypp-rpm", "logline" }; const callback::UserData::ContentType rpm::InstallResolvableReportSA::contentRpmout( "zypp-rpm","installpkgsa" ); const callback::UserData::ContentType rpm::RemoveResolvableReportSA::contentRpmout( "zypp-rpm","removepkgsa" ); const callback::UserData::ContentType rpm::CommitScriptReportSA::contentRpmout( "zypp-rpm","scriptsa" ); const callback::UserData::ContentType rpm::TransactionReportSA::contentRpmout( "zypp-rpm","transactionsa" ); const callback::UserData::ContentType rpm::CleanupPackageReportSA::contentRpmout( "zypp-rpm","cleanupkgsa" ); void TargetImpl::commitInSingleTransaction(const ZYppCommitPolicy &policy_r, CommitPackageCache &packageCache_r, ZYppCommitResult &result_r) { SendSingleTransReport report; // active throughout the whole rpm transaction // steps: this is our todo-list ZYppCommitResult::TransactionStepList & steps( result_r.rTransactionStepList() ); MIL << "TargetImpl::commit(" << policy_r << ")" << steps.size() << endl; HistoryLog().stampCommand(); // Send notification once upon calling rpm NotifyAttemptToModify attemptToModify( result_r ); // let zypper know we executed in one big transaction so in case of failures it can show extended error information result_r.setSingleTransactionMode( true ); // bsc#1181328: Some systemd tools require /proc to be mounted AssertProcMounted assertProcMounted( _root ); AssertDevMounted assertDevMounted( _root ); // also /dev // Why nodeps? // // Because zypp builds the transaction and the resolver asserts that // everything is fine, or the user decided to ignore problems. rpm::RpmInstFlags flags( policy_r.rpmInstFlags() | rpm::RPMINST_NODEPS // skip signature checks, we did that already | rpm::RPMINST_NODIGEST | rpm::RPMINST_NOSIGNATURE // ignore untrusted keys since we already checked those earlier | rpm::RPMINST_ALLOWUNTRUSTED ); proto::target::Commit commit; commit.flags = flags; commit.ignoreArch = ( !ZConfig::instance().systemArchitecture().compatibleWith( ZConfig::instance().defaultSystemArchitecture() ) ); commit.arch = ZConfig::instance().systemArchitecture().asString(); commit.dbPath = rpm().dbPath().asString(); commit.root = rpm().root().asString(); commit.lockFilePath = ZYppFactory::lockfileDir().asString(); bool abort = false; zypp::AutoDispose> locCache([]( std::unordered_map &data ){ for ( auto &[_, value] : data ) { (void)_; // unsused; for older g++ versions value.resetDispose(); } data.clear(); }); // fill the transaction for ( int stepId = 0; (ZYppCommitResult::TransactionStepList::size_type)stepId < steps.size() && !abort ; ++stepId ) { auto &step = steps[stepId]; PoolItem citem( step ); if ( step.stepType() == sat::Transaction::TRANSACTION_IGNORE ) { if ( citem->isKind() ) { // for packages this means being obsoleted (by rpm) // thius no additional action is needed. step.stepStage( sat::Transaction::STEP_DONE ); continue; } } if ( citem->isKind() ) { Package::constPtr p = citem->asKind(); if ( citem.status().isToBeInstalled() ) { try { locCache.value()[stepId] = packageCache_r.get( citem ); proto::target::InstallStep tStep; tStep.stepId = stepId; tStep.pathname = locCache.value()[stepId]->asString(); tStep.multiversion = p->multiversionInstall() ; commit.transactionSteps.push_back( std::move(tStep) ); } catch ( const AbortRequestException &e ) { WAR << "commit aborted by the user" << endl; abort = true; step.stepStage( sat::Transaction::STEP_ERROR ); break; } catch ( const SkipRequestException &e ) { ZYPP_CAUGHT( e ); WAR << "Skipping package " << p << " in commit" << endl; step.stepStage( sat::Transaction::STEP_ERROR ); continue; } catch ( const Exception &e ) { // bnc #395704: missing catch causes abort. // TODO see if packageCache fails to handle errors correctly. ZYPP_CAUGHT( e ); INT << "Unexpected Error: Skipping package " << p << " in commit" << endl; step.stepStage( sat::Transaction::STEP_ERROR ); continue; } } else { proto::target::RemoveStep tStep; tStep.stepId = stepId; tStep.name = p->name(); tStep.version = p->edition().version(); tStep.release = p->edition().release(); tStep.arch = p->arch().asString(); commit.transactionSteps.push_back(std::move(tStep)); } } else if ( citem->isKind() && citem.status().isToBeInstalled() ) { // SrcPackage is install-only SrcPackage::constPtr p = citem->asKind(); try { // provide on local disk locCache.value()[stepId] = provideSrcPackage( p ); proto::target::InstallStep tStep; tStep.stepId = stepId; tStep.pathname = locCache.value()[stepId]->asString(); tStep.multiversion = false; commit.transactionSteps.push_back(std::move(tStep)); } catch ( const Exception &e ) { ZYPP_CAUGHT( e ); INT << "Unexpected Error: Skipping package " << p << " in commit" << endl; step.stepStage( sat::Transaction::STEP_ERROR ); continue; } } } std::vector successfullyInstalledPackages; if ( commit.transactionSteps.size() ) { // create the event loop early auto loop = zyppng::EventLoop::create(); attemptToModify(); const std::vector interceptedSignals { SIGINT, SIGTERM, SIGHUP, SIGQUIT }; auto unixSignals = loop->eventDispatcher()->unixSignalSource(); unixSignals->sigReceived ().connect ([]( int signum ){ // translator: %1% is the received unix signal name, %2% is the numerical value of the received signal JobReport::error ( str::Format(_("Received signal :\"%1% (%2%)\", to ensure the consistency of the system it is not possible to cancel a running rpm transaction.") ) % strsignal(signum) % signum ); }); for( const auto &sig : interceptedSignals ) unixSignals->addSignal ( sig ); Deferred cleanupSigs([&](){ for( const auto &sig : interceptedSignals ) unixSignals->removeSignal ( sig ); }); // transaction related variables: // // the index of the step in the transaction list that we currenty execute. // this can be -1 int currentStepId = -1; // sync flag, every time zypp-rpm finishes executing a step it writes a tag into // the script fd, once we receive it we set this flag to true and ignore all output // that is written to the pipe ( aside from buffering it ) until we finalize the current report // and start a new one bool gotEndOfScript = false; // the possible reports we emit during the transaction std::unique_ptr> transactionreport; std::unique_ptr> installreport; std::unique_ptr> uninstallreport; std::unique_ptr> scriptreport; std::unique_ptr> cleanupreport; // this will be set if we receive a transaction error description std::optional transactionError; // infos about the currently executed script, empty if no script is currently executed std::string currentScriptType; std::string currentScriptPackage; // buffer to collect rpm output per report, this will be written to the log once the // report ends std::string rpmmsg; // maximum number of lines that we are buffering in rpmmsg constexpr auto MAXRPMMESSAGELINES = 10000; // current number of lines in the rpmmsg line buffer. This is capped to MAXRPMMESSAGELINES unsigned lineno = 0; // the sources to communicate with zypp-rpm, we will associate pipes with them further down below auto msgSource = zyppng::AsyncDataSource::create(); auto scriptSource = zyppng::AsyncDataSource::create(); // this will be the communication channel, will be created once the process starts and // we can receive data zyppng::StompFrameStreamRef msgStream; // helper function that sends RPM output to the currently active report, writing a warning to the log // if there is none const auto &sendRpmLineToReport = [&]( const std::string &line ){ const auto &sendLogRep = [&]( auto &report, const auto &cType ){ callback::UserData cmdout(cType); if ( currentStepId >= 0 ) cmdout.set( "solvable", steps.at(currentStepId).satSolvable() ); cmdout.set( "line", line ); report->report(cmdout); }; if ( installreport ) { sendLogRep( (*installreport), rpm::InstallResolvableReportSA::contentRpmout ); } else if ( uninstallreport ) { sendLogRep( (*uninstallreport), rpm::RemoveResolvableReportSA::contentRpmout ); } else if ( scriptreport ) { sendLogRep( (*scriptreport), rpm::CommitScriptReportSA::contentRpmout ); } else if ( transactionreport ) { sendLogRep( (*transactionreport), rpm::TransactionReportSA::contentRpmout ); } else if ( cleanupreport ) { sendLogRep( (*cleanupreport), rpm::CleanupPackageReportSA::contentRpmout ); } else { WAR << "Got rpm output without active report " << line; // no endl! - readLine does not trim } // remember rpm output if ( lineno >= MAXRPMMESSAGELINES ) { if ( line.find( " scriptlet failed, " ) == std::string::npos ) // always log %script errors return; } rpmmsg += line; if ( line.back() != '\n' ) rpmmsg += '\n'; }; // callback and helper function to process data that is received on the script FD const auto &processDataFromScriptFd = [&](){ while ( scriptSource->canReadLine() ) { if ( gotEndOfScript ) return; std::string l = scriptSource->readLine().asString(); if( str::endsWith( l, endOfScriptTag ) ) { gotEndOfScript = true; std::string::size_type rawsize { l.size() - endOfScriptTag.size() }; if ( not rawsize ) return; l = l.substr( 0, rawsize ); } L_DBG("zypp-rpm") << "[rpm> " << l; // no endl! - readLine does not trim sendRpmLineToReport( l ); } }; scriptSource->sigReadyRead().connect( processDataFromScriptFd ); // helper function that just waits until the end of script tag was received on the scriptSource const auto &waitForScriptEnd = [&]() { // nothing to wait for if ( gotEndOfScript ) return; // we process all available data processDataFromScriptFd(); // end of script is always sent by zypp-rpm, we need to wait for it to keep order while ( scriptSource->readFdOpen() && scriptSource->canRead() && !gotEndOfScript ) { // readyRead will trigger processDataFromScriptFd so no need to call it again // we still got nothing, lets wait for more scriptSource->waitForReadyRead( 100 ); } }; const auto &aboutToStartNewReport = [&](){ if ( transactionreport || installreport || uninstallreport || scriptreport || cleanupreport ) { ERR << "There is still a running report, this is a bug" << std::endl; assert(false); } gotEndOfScript = false; }; const auto &writeRpmMsgToHistory = [&](){ if ( rpmmsg.size() == 0 ) return; if ( lineno >= MAXRPMMESSAGELINES ) rpmmsg += "[truncated]\n"; std::ostringstream sstr; sstr << "rpm output:" << endl << rpmmsg << endl; HistoryLog().comment(sstr.str()); }; // helper function that closes the current report and cleans up the ressources const auto &finalizeCurrentReport = [&]() { sat::Transaction::Step *step = nullptr; Resolvable::constPtr resObj; if ( currentStepId >= 0 ) { step = &steps.at(currentStepId); resObj = makeResObject( step->satSolvable() ); } if ( installreport ) { waitForScriptEnd(); if ( step->stepStage() == sat::Transaction::STEP_ERROR ) { HistoryLog().comment( str::form("%s install failed", step->ident().c_str()), true /*timestamp*/); writeRpmMsgToHistory(); ( *installreport)->finish( resObj, rpm::InstallResolvableReportSA::INVALID ); } else { ( *installreport)->progress( 100, resObj ); ( *installreport)->finish( resObj, rpm::InstallResolvableReportSA::NO_ERROR ); if ( currentStepId >= 0 ) locCache.value().erase( currentStepId ); successfullyInstalledPackages.push_back( step->satSolvable() ); PoolItem citem( *step ); if ( !( flags & rpm::RPMINST_TEST ) ) { // @TODO are we really doing this just for install? if ( citem.isNeedreboot() ) { auto rebootNeededFile = root() / "/run/reboot-needed"; if ( filesystem::assert_file( rebootNeededFile ) == EEXIST) filesystem::touch( rebootNeededFile ); } citem.status().resetTransact( ResStatus::USER ); HistoryLog().install(citem); } HistoryLog().comment( str::form("%s installed ok", step->ident().c_str()), true /*timestamp*/); writeRpmMsgToHistory(); } } if ( uninstallreport ) { waitForScriptEnd(); if ( step->stepStage() == sat::Transaction::STEP_ERROR ) { HistoryLog().comment( str::form("%s uninstall failed", step->ident().c_str()), true /*timestamp*/); writeRpmMsgToHistory(); ( *uninstallreport)->finish( resObj, rpm::RemoveResolvableReportSA::INVALID ); } else { ( *uninstallreport)->progress( 100, resObj ); ( *uninstallreport)->finish( resObj, rpm::RemoveResolvableReportSA::NO_ERROR ); PoolItem citem( *step ); HistoryLog().remove(citem); HistoryLog().comment( str::form("%s removed ok", step->ident().c_str()), true /*timestamp*/); writeRpmMsgToHistory(); } } if ( scriptreport ) { waitForScriptEnd(); ( *scriptreport)->progress( 100, resObj ); ( *scriptreport)->finish( resObj, rpm::CommitScriptReportSA::NO_ERROR ); } if ( transactionreport ) { waitForScriptEnd(); ( *transactionreport)->progress( 100 ); ( *transactionreport)->finish( rpm::TransactionReportSA::NO_ERROR ); } if ( cleanupreport ) { waitForScriptEnd(); ( *cleanupreport)->progress( 100 ); ( *cleanupreport)->finish( rpm::CleanupPackageReportSA::NO_ERROR ); } currentStepId = -1; lineno = 0; rpmmsg.clear(); currentScriptType.clear(); currentScriptPackage.clear(); installreport.reset(); uninstallreport.reset(); scriptreport.reset(); transactionreport.reset(); cleanupreport.reset(); }; // This sets up the process and pushes the required transactions steps to it // careful when changing code here, zypp-rpm relies on the exact order data is transferred: // // 1) Size of the commit message , sizeof(zyppng::rpc::HeaderSizeType) // 2) The Commit Proto message, directly serialized to the FD, without Envelope // 3) 2 writeable FDs that are set up by the parent Process when forking. The first FD is to be used for message sending, the second one for script output constexpr std::string_view zyppRpmBinary(ZYPP_RPM_BINARY); const char *argv[] = { //"gdbserver", //"localhost:10001", zyppRpmBinary.data(), nullptr }; auto prog = zyppng::Process::create(); // we set up a pipe to communicate with the process, it is too dangerous to use stdout since librpm // might print to it. auto messagePipe = zyppng::Pipe::create(); if ( !messagePipe ) ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to create message pipe" ) ); // open a pipe that we are going to use to receive script output, this is a librpm feature, there is no other // way than a FD to redirect that output auto scriptPipe = zyppng::Pipe::create(); if ( !scriptPipe ) ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to create scriptfd" ) ); prog->addFd( messagePipe->writeFd ); prog->addFd( scriptPipe->writeFd ); // set up the AsyncDataSource to read script output if ( !scriptSource->openFds( std::vector{ scriptPipe->readFd } ) ) ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to open scriptFD to subprocess" ) ); const auto &processMessages = [&] ( ) { // lambda function that parses the passed message type and checks if the stepId is a valid offset // in the steps list. const auto &checkMsgWithStepId = [&steps]( auto &p ){ if ( !p ) { ERR << "Failed to parse message from zypp-rpm." << std::endl; return false; } auto id = p->stepId; if ( id < 0 || id >= steps.size() ) { ERR << "Received invalid stepId: " << id << " in " << p->typeName << " message from zypp-rpm, ignoring." << std::endl; return false; } return true; }; while ( const auto &m = msgStream->nextMessage() ) { // due to librpm behaviour we need to make sense of the order of messages we receive // because we first get a PackageFinished BEFORE getting a PackageError, same applies to // Script related messages. What we do is remember the current step we are in and only close // the step when we get the start of the next one const auto &mName = m->command(); if ( mName == proto::target::RpmLog::typeName ) { const auto &p = proto::target::RpmLog::fromStompMessage (*m); if ( !p ) { ERR << "Failed to parse " << proto::target::RpmLog::typeName << " message from zypp-rpm." << std::endl; continue; } ( p->level >= RPMLOG_ERR ? L_ERR("zypp-rpm") : p->level >= RPMLOG_WARNING ? L_WAR("zypp-rpm") : L_DBG("zypp-rpm") ) << "[rpm " << p->level << "> " << p->line; // no endl! - readLine does not trim report.sendLoglineRpm( p->line, p->level ); } else if ( mName == proto::target::PackageBegin::typeName ) { finalizeCurrentReport(); const auto &p = proto::target::PackageBegin::fromStompMessage(*m); if ( !checkMsgWithStepId( p ) ) continue; aboutToStartNewReport(); auto & step = steps.at( p->stepId ); currentStepId = p->stepId; if ( step.stepType() == sat::Transaction::TRANSACTION_ERASE ) { uninstallreport = std::make_unique< callback::SendReport > (); ( *uninstallreport )->start( makeResObject( step.satSolvable() ) ); } else { installreport = std::make_unique< callback::SendReport > (); ( *installreport )->start( makeResObject( step.satSolvable() ) ); } } else if ( mName == proto::target::PackageFinished::typeName ) { const auto &p = proto::target::PackageFinished::fromStompMessage(*m); if ( !checkMsgWithStepId( p ) ) continue; // here we only set the step stage to done, we however need to wait for the next start in order to send // the finished report since there might be a error pending to be reported steps[ p->stepId ].stepStage( sat::Transaction::STEP_DONE ); } else if ( mName == proto::target::PackageProgress::typeName ) { const auto &p = proto::target::PackageProgress::fromStompMessage(*m); if ( !checkMsgWithStepId( p ) ) continue; if ( uninstallreport ) (*uninstallreport)->progress( p->amount, makeResObject( steps.at( p->stepId ) )); else if ( installreport ) (*installreport)->progress( p->amount, makeResObject( steps.at( p->stepId ) )); else ERR << "Received a " << mName << " message but there is no corresponding report running." << std::endl; } else if ( mName == proto::target::PackageError::typeName ) { const auto &p = proto::target::PackageError::fromStompMessage(*m); if ( !checkMsgWithStepId( p ) ) continue; if ( p->stepId >= 0 && p->stepId < steps.size() ) steps[ p->stepId ].stepStage( sat::Transaction::STEP_ERROR ); finalizeCurrentReport(); } else if ( mName == proto::target::ScriptBegin::typeName ) { finalizeCurrentReport(); const auto &p = proto::target::ScriptBegin::fromStompMessage(*m); if ( !p ) { ERR << "Failed to parse " << proto::target::ScriptBegin::typeName << " message from zypp-rpm." << std::endl; continue; } aboutToStartNewReport(); Resolvable::constPtr resPtr; const auto stepId = p->stepId; if ( stepId >= 0 && static_cast(stepId) < steps.size() ) { resPtr = makeResObject( steps.at(stepId).satSolvable() ); } currentStepId = p->stepId; scriptreport = std::make_unique< callback::SendReport > (); currentScriptType = p->scriptType; currentScriptPackage = p->scriptPackage; (*scriptreport)->start( currentScriptType, currentScriptPackage, resPtr ); } else if ( mName == proto::target::ScriptFinished::typeName ) { // we just read the message, we do not act on it because a ScriptError is reported after ScriptFinished } else if ( mName == proto::target::ScriptError::typeName ) { const auto &p = proto::target::ScriptError::fromStompMessage(*m); if ( !p ) { ERR << "Failed to parse " << proto::target::ScriptError::typeName << " message from zypp-rpm." << std::endl; continue; } Resolvable::constPtr resPtr; const auto stepId = p->stepId; if ( stepId >= 0 && static_cast(stepId) < steps.size() ) { resPtr = makeResObject( steps.at(stepId).satSolvable() ); if ( p->fatal ) { steps.at( stepId ).stepStage( sat::Transaction::STEP_ERROR ); } } HistoryLog().comment( str::form("Failed to execute %s script for %s ", currentScriptType.c_str(), currentScriptPackage.size() ? currentScriptPackage.c_str() : "unknown" ), true /*timestamp*/); writeRpmMsgToHistory(); if ( !scriptreport ) { ERR << "Received a ScriptError message, but there is no running report. " << std::endl; continue; } // before killing the report we need to wait for the script end tag waitForScriptEnd(); (*scriptreport)->finish( resPtr, p->fatal ? rpm::CommitScriptReportSA::CRITICAL : rpm::CommitScriptReportSA::WARN ); // manually reset the current report since we already sent the finish(), rest will be reset by the new start scriptreport.reset(); currentStepId = -1; } else if ( mName == proto::target::CleanupBegin::typeName ) { finalizeCurrentReport(); const auto &beg = proto::target::CleanupBegin::fromStompMessage(*m); if ( !beg ) { ERR << "Failed to parse " << proto::target::CleanupBegin::typeName << " message from zypp-rpm." << std::endl; continue; } aboutToStartNewReport(); cleanupreport = std::make_unique< callback::SendReport > (); (*cleanupreport)->start( beg->nvra ); } else if ( mName == proto::target::CleanupFinished::typeName ) { finalizeCurrentReport(); } else if ( mName == proto::target::CleanupProgress::typeName ) { const auto &prog = proto::target::CleanupProgress::fromStompMessage(*m); if ( !prog ) { ERR << "Failed to parse " << proto::target::CleanupProgress::typeName << " message from zypp-rpm." << std::endl; continue; } if ( !cleanupreport ) { ERR << "Received a CleanupProgress message, but there is no running report. " << std::endl; continue; } (*cleanupreport)->progress( prog->amount ); } else if ( mName == proto::target::TransBegin::typeName ) { finalizeCurrentReport(); const auto &beg = proto::target::TransBegin::fromStompMessage(*m); if ( !beg ) { ERR << "Failed to parse " << proto::target::TransBegin::typeName << " message from zypp-rpm." << std::endl; continue; } aboutToStartNewReport(); transactionreport = std::make_unique< callback::SendReport > (); (*transactionreport)->start( beg->name ); } else if ( mName == proto::target::TransFinished::typeName ) { finalizeCurrentReport(); } else if ( mName == proto::target::TransProgress::typeName ) { const auto &prog = proto::target::TransProgress::fromStompMessage(*m); if ( !prog ) { ERR << "Failed to parse " << proto::target::TransProgress::typeName << " message from zypp-rpm." << std::endl; continue; } if ( !transactionreport ) { ERR << "Received a TransactionProgress message, but there is no running report. " << std::endl; continue; } (*transactionreport)->progress( prog->amount ); } else if ( mName == proto::target::TransactionError::typeName ) { const auto &error = proto::target::TransactionError::fromStompMessage(*m); if ( !error ) { ERR << "Failed to parse " << proto::target::TransactionError::typeName << " message from zypp-rpm." << std::endl; continue; } // this value is checked later transactionError = std::move(*error); } else { ERR << "Received unexpected message from zypp-rpm: "<< m->command() << ", ignoring" << std::endl; return; } } }; // setup the rest when zypp-rpm is running prog->sigStarted().connect( [&](){ // close the ends of the pipes we do not care about messagePipe->unrefWrite(); scriptPipe->unrefWrite(); // read the stdout and stderr and forward it to our log prog->connectFunc( &zyppng::IODevice::sigChannelReadyRead, [&]( int channel ){ while( prog->canReadLine( channel ) ) { L_ERR("zypp-rpm") << ( channel == zyppng::Process::StdOut ? " " : " " ) << prog->channelReadLine( channel ).asStringView(); // no endl! - readLine does not trim } }); // this is the source for control messages from zypp-rpm , we will get structured data information // in form of STOMP messages if ( !msgSource->openFds( std::vector{ messagePipe->readFd }, prog->stdinFd() ) ) ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to open read stream to subprocess" ) ); msgStream = zyppng::StompFrameStream::create(msgSource); msgStream->connectFunc( &zyppng::StompFrameStream::sigMessageReceived, processMessages ); const auto &msg = commit.toStompMessage(); if ( !msg ) std::rethrow_exception ( msg.error() ); if ( !msgStream->sendMessage( *msg ) ) { prog->stop( SIGKILL ); ZYPP_THROW( target::rpm::RpmSubprocessException( "Failed to write commit to subprocess" ) ); } }); // track the childs lifetime int zyppRpmExitCode = -1; prog->connectFunc( &zyppng::Process::sigFinished, [&]( int code ){ zyppRpmExitCode = code; loop->quit(); }); if ( !prog->start( argv ) ) { HistoryLog().comment( "Commit was aborted, failed to run zypp-rpm" ); ZYPP_THROW( target::rpm::RpmSubprocessException( prog->execError() ) ); } loop->run(); if ( msgStream ) { // pull all messages from the IO device msgStream->readAllMessages(); // make sure to read ALL available messages processMessages(); } // we will not receive a new start message , so we need to manually finalize the last report finalizeCurrentReport(); // make sure to read all data from the log source bool readMsgs = false; while( prog->canReadLine( zyppng::Process::StdErr ) ) { readMsgs = true; MIL << "zypp-rpm: " << prog->channelReadLine( zyppng::Process::StdErr ).asStringView(); } while( prog->canReadLine( zyppng::Process::StdOut ) ) { readMsgs = true; MIL << "zypp-rpm: " << prog->channelReadLine( zyppng::Process::StdOut ).asStringView(); } while ( scriptSource->canReadLine() ) { readMsgs = true; MIL << "rpm-script-fd: " << scriptSource->readLine().asStringView(); } if ( scriptSource->bytesAvailable() > 0 ) { readMsgs = true; MIL << "rpm-script-fd: " << scriptSource->readAll().asStringView(); } if ( readMsgs ) MIL << std::endl; switch ( zyppRpmExitCode ) { // we need to look at the summary, handle finishedwitherrors like no error here case zypprpm::NoError: case zypprpm::RpmFinishedWithError: break; case zypprpm::RpmFinishedWithTransactionError: { // here zypp-rpm sent us a error description if ( transactionError ) { std::ostringstream sstr; sstr << _("Executing the transaction failed because of the following problems:") << "\n"; for ( const auto & err : transactionError->problems ) { sstr << " " << err << "\n"; } sstr << std::endl; ZYPP_THROW( rpm::RpmTransactionFailedException( sstr.str() ) ); } else { ZYPP_THROW( rpm::RpmTransactionFailedException("RPM failed with a unexpected error, check the logs for more information.") ); } break; } case zypprpm::FailedToOpenDb: ZYPP_THROW( rpm::RpmDbOpenException( rpm().root(), rpm().dbPath() ) ); break; case zypprpm::WrongHeaderSize: case zypprpm::WrongMessageFormat: ZYPP_THROW( rpm::RpmSubprocessException("Failed to communicate with zypp-rpm, this is most likely a bug. Consider to fall back to legacy transaction strategy.") ); break; case zypprpm::RpmInitFailed: ZYPP_THROW( rpm::RpmInitException( rpm().root(), rpm().dbPath() ) ); break; case zypprpm::FailedToReadPackage: ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm was unable to read a package, check the logs for more information.") ); break; case zypprpm::FailedToAddStepToTransaction: ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm failed to build the transaction, check the logs for more information.") ); break; case zypprpm::RpmOrderFailed: ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm failed to order the transaction, check the logs for more information.") ); break; case zypprpm::FailedToCreateLock: ZYPP_THROW( rpm::RpmSubprocessException("zypp-rpm failed to create its lockfile, check the logs for more information.") ); break; } for ( int stepId = 0; (ZYppCommitResult::TransactionStepList::size_type)stepId < steps.size() && !abort; ++stepId ) { auto &step = steps[stepId]; PoolItem citem( step ); if ( step.stepStage() == sat::Transaction::STEP_TODO ) { // other resolvables (non-Package) that are not handled by zypp-rpm if ( !citem->isKind() && !policy_r.dryRun() ) { // Status is changed as the buddy package buddy // gets installed/deleted. Handle non-buddies only. if ( ! citem.buddy() && citem->isKind() ) { Product::constPtr p = citem->asKind(); if ( citem.status().isToBeInstalled() ) { ERR << "Can't install orphan product without release-package! " << citem << endl; } else { // Deleting the corresponding product entry is all we con do. // So the product will no longer be visible as installed. std::string referenceFilename( p->referenceFilename() ); if ( referenceFilename.empty() ) { ERR << "Can't remove orphan product without 'referenceFilename'! " << citem << endl; } else { Pathname referencePath { Pathname("/etc/products.d") / referenceFilename }; // no root prefix for rpmdb lookup! if ( ! rpm().hasFile( referencePath.asString() ) ) { // If it's not owned by a package, we can delete it. referencePath = Pathname::assertprefix( _root, referencePath ); // now add a root prefix if ( filesystem::unlink( referencePath ) != 0 ) ERR << "Delete orphan product failed: " << referencePath << endl; } else { WAR << "Won't remove orphan product: '/etc/products.d/" << referenceFilename << "' is owned by a package." << endl; } } } citem.status().resetTransact( ResStatus::USER ); step.stepStage( sat::Transaction::STEP_DONE ); } } } } } // Check presence of update scripts/messages. If aborting, // at least log omitted scripts. if ( ! successfullyInstalledPackages.empty() ) { if ( ! RunUpdateScripts( _root, ZConfig::instance().update_scriptsPath(), successfullyInstalledPackages, abort ) ) { WAR << "Commit aborted by the user" << endl; abort = true; } // send messages after scripts in case some script generates output, // that should be kept in t %ghost message file. RunUpdateMessages( _root, ZConfig::instance().update_messagesPath(), successfullyInstalledPackages, result_r ); } // jsc#SLE-5116: Log patch status changes to history // NOTE: Should be the last action as it may need to reload // the Target in case of an incomplete transaction. logPatchStatusChanges( result_r.transaction(), *this ); if ( abort ) { HistoryLog().comment( "Commit was aborted." ); ZYPP_THROW( TargetAbortedException( ) ); } } /////////////////////////////////////////////////////////////////// rpm::RpmDb & TargetImpl::rpm() { return _rpm; } bool TargetImpl::providesFile (const std::string & path_str, const std::string & name_str) const { return _rpm.hasFile(path_str, name_str); } /////////////////////////////////////////////////////////////////// namespace { parser::ProductFileData baseproductdata( const Pathname & root_r ) { parser::ProductFileData ret; PathInfo baseproduct( Pathname::assertprefix( root_r, "/etc/products.d/baseproduct" ) ); if ( baseproduct.isFile() ) { try { ret = parser::ProductFileReader::scanFile( baseproduct.path() ); } catch ( const Exception & excpt ) { ZYPP_CAUGHT( excpt ); } } else if ( PathInfo( Pathname::assertprefix( root_r, "/etc/products.d" ) ).isDir() ) { ERR << "baseproduct symlink is dangling or missing: " << baseproduct << endl; } return ret; } inline Pathname staticGuessRoot( const Pathname & root_r ) { if ( root_r.empty() ) { // empty root: use existing Target or assume "/" Pathname ret ( ZConfig::instance().systemRoot() ); if ( ret.empty() ) return Pathname("/"); return ret; } return root_r; } inline std::string firstNonEmptyLineIn( const Pathname & file_r ) { std::ifstream idfile( file_r.c_str() ); for( iostr::EachLine in( idfile ); in; in.next() ) { std::string line( str::trim( *in ) ); if ( ! line.empty() ) return line; } return std::string(); } } // namespace /////////////////////////////////////////////////////////////////// Product::constPtr TargetImpl::baseProduct() const { ResPool pool(ResPool::instance()); for_( it, pool.byKindBegin(), pool.byKindEnd() ) { Product::constPtr p = (*it)->asKind(); if ( p->isTargetDistribution() ) return p; } return nullptr; } LocaleSet TargetImpl::requestedLocales( const Pathname & root_r ) { const Pathname needroot( staticGuessRoot(root_r) ); const Target_constPtr target( getZYpp()->getTarget() ); if ( target && target->root() == needroot ) return target->requestedLocales(); return RequestedLocalesFile( home(needroot) / "RequestedLocales" ).locales(); } void TargetImpl::updateAutoInstalled() { MIL << "updateAutoInstalled if changed..." << endl; SolvIdentFile::Data newdata; for ( auto id : sat::Pool::instance().autoInstalled() ) newdata.insert( IdString(id) ); // explicit ctor! _autoInstalledFile.setData( std::move(newdata) ); } std::string TargetImpl::targetDistribution() const { return baseproductdata( _root ).registerTarget(); } // static version: std::string TargetImpl::targetDistribution( const Pathname & root_r ) { return baseproductdata( staticGuessRoot(root_r) ).registerTarget(); } std::string TargetImpl::targetDistributionRelease() const { return baseproductdata( _root ).registerRelease(); } // static version: std::string TargetImpl::targetDistributionRelease( const Pathname & root_r ) { return baseproductdata( staticGuessRoot(root_r) ).registerRelease();} std::string TargetImpl::targetDistributionFlavor() const { return baseproductdata( _root ).registerFlavor(); } // static version: std::string TargetImpl::targetDistributionFlavor( const Pathname & root_r ) { return baseproductdata( staticGuessRoot(root_r) ).registerFlavor();} Target::DistributionLabel TargetImpl::distributionLabel() const { Target::DistributionLabel ret; parser::ProductFileData pdata( baseproductdata( _root ) ); ret.shortName = pdata.shortName(); ret.summary = pdata.summary(); return ret; } // static version: Target::DistributionLabel TargetImpl::distributionLabel( const Pathname & root_r ) { Target::DistributionLabel ret; parser::ProductFileData pdata( baseproductdata( staticGuessRoot(root_r) ) ); ret.shortName = pdata.shortName(); ret.summary = pdata.summary(); return ret; } std::string TargetImpl::distributionVersion() const { if ( _distributionVersion.empty() ) { _distributionVersion = TargetImpl::distributionVersion(root()); if ( !_distributionVersion.empty() ) MIL << "Remember distributionVersion = '" << _distributionVersion << "'" << endl; } return _distributionVersion; } // static version std::string TargetImpl::distributionVersion( const Pathname & root_r ) { const Pathname & needroot = staticGuessRoot(root_r); std::string distributionVersion = baseproductdata( needroot ).edition().version(); if ( distributionVersion.empty() ) { // ...But the baseproduct method is not expected to work on RedHat derivatives. // On RHEL, Fedora and others the "product version" is determined by the first package // providing 'system-release'. This value is not hardcoded in YUM and can be configured // with the $distroverpkg variable. rpm::librpmDb::db_const_iterator it( needroot ); if ( it.findByProvides( ZConfig::instance().distroverpkg() ) ) distributionVersion = it->tag_version(); } return distributionVersion; } std::string TargetImpl::distributionFlavor() const { return firstNonEmptyLineIn( home() / "LastDistributionFlavor" ); } // static version: std::string TargetImpl::distributionFlavor( const Pathname & root_r ) { return firstNonEmptyLineIn( staticGuessRoot(root_r) / "/var/lib/zypp/LastDistributionFlavor" ); } /////////////////////////////////////////////////////////////////// namespace { std::string guessAnonymousUniqueId( const Pathname & root_r ) { // bsc#1024741: Omit creating a new uid for chrooted systems (if it already has one, fine) std::string ret( firstNonEmptyLineIn( root_r / "/var/lib/zypp/AnonymousUniqueId" ) ); if ( ret.empty() && root_r != "/" ) { // if it has nonoe, use the outer systems one ret = firstNonEmptyLineIn( "/var/lib/zypp/AnonymousUniqueId" ); } return ret; } } std::string TargetImpl::anonymousUniqueId() const { return guessAnonymousUniqueId( root() ); } // static version: std::string TargetImpl::anonymousUniqueId( const Pathname & root_r ) { return guessAnonymousUniqueId( staticGuessRoot(root_r) ); } /////////////////////////////////////////////////////////////////// void TargetImpl::vendorAttr( VendorAttr vendorAttr_r ) { MIL << "New VendorAttr: " << vendorAttr_r << endl; _vendorAttr = std::move(vendorAttr_r); } /////////////////////////////////////////////////////////////////// void TargetImpl::installSrcPackage( const SrcPackage_constPtr & srcPackage_r ) { // provide on local disk ManagedFile localfile = provideSrcPackage(srcPackage_r); // create a installation progress report proxy RpmInstallPackageReceiver progress( srcPackage_r ); progress.connect(); // disconnected on destruction. // install it rpm().installPackage ( localfile ); } ManagedFile TargetImpl::provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ) { // provide on local disk repo::RepoMediaAccess access_r; repo::SrcPackageProvider prov( access_r ); return prov.provideSrcPackage( srcPackage_r ); } //////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/TargetImpl.commitFindFileConflicts.cc000066400000000000000000000141631476576476200250270ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/TargetImpl.commitFindFileConflicts.cc */ extern "C" { #include #include #include #include #include #include #include } #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace target { /////////////////////////////////////////////////////////////////// namespace { /** libsolv::pool_findfileconflicts callback providing package header. */ struct FileConflictsCB { FileConflictsCB( sat::detail::CPool * pool_r, ProgressData & progress_r ) : _progress( progress_r ) , _state( ::rpm_state_create( pool_r, ::pool_get_rootdir(pool_r) ), ::rpm_state_free ) {} void * operator()( sat::detail::CPool * pool_r, sat::detail::IdType id_r ) { void * ret = lookup( id_r ); // report progress on 1st visit only, ticks later // (there may be up to 3 visits) if ( _visited.find( id_r ) == _visited.end() ) { //DBG << "FCCB: " << sat::Solvable( id_r ) << " " << ret << endl; _visited.insert( id_r ); if ( ! ret && sat::Solvable( id_r ).isKind() ) // only packages have filelists _noFilelist.push( id_r ); _progress.incr(); } else { _progress.tick(); } return ret; } const sat::Queue & noFilelist() const { return _noFilelist; } static void * invoke( sat::detail::CPool * pool_r, sat::detail::IdType id_r, void * cbdata_r ) { return (*reinterpret_cast(cbdata_r))( pool_r, id_r ); } private: void * lookup( sat::detail::IdType id_r ) { sat::Solvable solv( id_r ); if ( solv.isSystem() ) { Solvable * s = solv.get(); if ( ! s->repo->rpmdbid ) return nullptr; sat::detail::IdType rpmdbid = s->repo->rpmdbid[id_r - s->repo->start]; if ( ! rpmdbid ) return nullptr; return ::rpm_byrpmdbid( _state, rpmdbid ); } else { Package::Ptr pkg( make( solv ) ); if ( ! pkg ) return nullptr; Pathname localfile( pkg->cachedLocation() ); if ( localfile.empty() ) return nullptr; AutoDispose fp( ::fopen( localfile.c_str(), "re" ), ::fclose ); return ::rpm_byfp( _state, fp, localfile.c_str() ); } } private: ProgressData & _progress; AutoDispose _state; std::unordered_set _visited; sat::Queue _noFilelist; }; } // namespace /////////////////////////////////////////////////////////////////// void TargetImpl::commitFindFileConflicts( const ZYppCommitPolicy & policy_r, ZYppCommitResult & result_r ) { sat::Queue todo; sat::FileConflicts conflicts; int newpkgs = result_r.transaction().installedResult( todo ); MIL << "Checking for file conflicts in " << newpkgs << " new packages..." << endl; if ( ! newpkgs ) return; try { callback::SendReport report; ProgressData progress( todo.size() ); if ( ! report->start( progress ) ) ZYPP_THROW( AbortRequestException() ); FileConflictsCB cb( sat::Pool::instance().get(), progress ); // lambda receives progress trigger and translates into report auto sendProgress = [&]( const ProgressData & progress_r )->bool { if ( ! report->progress( progress_r, cb.noFilelist() ) ) { progress.noSend(); // take care progress DTOR does not trigger a final report (2nd exeption) ZYPP_THROW( AbortRequestException() ); } return true; }; progress.sendTo( sendProgress ); unsigned count = ::pool_findfileconflicts( sat::Pool::instance().get(), todo, newpkgs, conflicts, FINDFILECONFLICTS_USE_SOLVABLEFILELIST | FINDFILECONFLICTS_CHECK_DIRALIASING | FINDFILECONFLICTS_USE_ROOTDIR, &FileConflictsCB::invoke, &cb ); progress.toMax(); progress.noSend(); (count?WAR:MIL) << "Found " << count << " file conflicts." << endl; if ( ! report->result( progress, cb.noFilelist(), conflicts ) ) ZYPP_THROW( AbortRequestException() ); } catch ( const AbortRequestException & e ) { TargetAbortedException excpt; excpt.remember( e ); ZYPP_THROW( excpt ); } } } // namespace target /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/TargetImpl.h000066400000000000000000000207021476576476200201300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/TargetImpl.h * */ #ifndef ZYPP_TARGET_TARGETIMPL_H #define ZYPP_TARGET_TARGETIMPL_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(TargetImpl); class CommitPackageCache; /////////////////////////////////////////////////////////////////// // // CLASS NAME : TargetImpl // /** Base class for concrete Target implementations. * * Constructed by \ref TargetFactory. Public access via \ref Target * interface. */ class TargetImpl : public base::ReferenceCounted, private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const TargetImpl & obj ); public: /** list of pool items */ using PoolItemList = std::list; /** set of pool items */ using PoolItemSet = std::set; public: /** Ctor. */ TargetImpl(const Pathname & root_r = "/", bool doRebuild_r = false ); /** Dtor. */ ~TargetImpl() override; /** * generates the unique anonymous id which is called * when creating the target */ void createAnonymousId() const; /** * generates a cache of the last product flavor */ void createLastDistributionFlavorCache() const; /** \name Solv file handling. * If target solv file is outdated, but (non-root-)user has * no permission to create it at the default location, we * use a temporary one. */ //@{ private: /** The systems default solv file location. */ Pathname defaultSolvfilesPath() const; /** The solv file location actually in use (default or temp). */ Pathname solvfilesPath() const { return solvfilesPathIsTemp() ? _tmpSolvfilesPath : defaultSolvfilesPath(); } /** Whether we're using a temp. solvfile. */ bool solvfilesPathIsTemp() const { return ! _tmpSolvfilesPath.empty(); } Pathname _tmpSolvfilesPath; public: void load( bool force = true ); void unload(); void reload(); void clearCache(); bool buildCache(); //@} public: /** The root set for this target */ Pathname root() const { return _root; } /** The directory to store things. */ Pathname home() const { return home( _root ); } static Pathname home( const Pathname & root_r ) { return root_r / "/var/lib/zypp"; } /** Commit changes in the pool */ ZYppCommitResult commit( ResPool pool_r, const ZYppCommitPolicy & policy_r ); /** Install a source package on the Target. */ void installSrcPackage( const SrcPackage_constPtr & srcPackage_r ); /** Provides a source package on the Target. */ ManagedFile provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ); /** Overload to realize stream output. */ std::ostream & dumpOn( std::ostream & str ) const override { return str << "Target(" << root() << ")"; } /** The RPM database */ rpm::RpmDb & rpm(); /** If the package is installed and provides the file Needed to evaluate split provides during Resolver::Upgrade() */ bool providesFile (const std::string & path_str, const std::string & name_str) const; /** Return name of package owning \a path_str * or empty string if no installed package owns \a path_str. */ std::string whoOwnsFile (const std::string & path_str) const { return _rpm.whoOwnsFile (path_str); } /** \copydoc Target::baseProduct() */ Product::constPtr baseProduct() const; /** \copydoc Target::requestedLocales() */ LocaleSet requestedLocales() const { return _requestedLocalesFile.locales(); } /** \overload */ static LocaleSet requestedLocales( const Pathname & root_r ); /** \copydoc Target::updateAutoInstalled */ void updateAutoInstalled(); /** \copydoc Target::targetDistribution() */ std::string targetDistribution() const; /** \overload */ static std::string targetDistribution( const Pathname & root_r ); /** \copydoc Target::targetDistributionRelease()*/ std::string targetDistributionRelease() const; /** \overload */ static std::string targetDistributionRelease( const Pathname & root_r ); /** \copydoc Target::targetDistributionFlavor()*/ std::string targetDistributionFlavor() const; /** \overload */ static std::string targetDistributionFlavor( const Pathname & root_r ); /** \copydoc Target::distributionLabel()*/ Target::DistributionLabel distributionLabel() const; /** \overload */ static Target::DistributionLabel distributionLabel( const Pathname & root_r ); /** \copydoc Target::distributionVersion()*/ std::string distributionVersion() const; /** \overload */ static std::string distributionVersion( const Pathname & root_r ); /** \copydoc Target::distributionFlavor() */ std::string distributionFlavor() const; /** \overload */ static std::string distributionFlavor( const Pathname & root_r ); /** \copydoc Target::anonymousUniqueId() */ std::string anonymousUniqueId() const; /** \overload */ static std::string anonymousUniqueId( const Pathname & root_r ); /** \copydoc Target::vendorAttr() */ const VendorAttr & vendorAttr() const { return _vendorAttr; } /** \overload */ void vendorAttr( VendorAttr vendorAttr_r ); //@} public: private: /** Commit ordered changes (internal helper) */ void commit( const ZYppCommitPolicy & policy_r, CommitPackageCache & packageCache_r, ZYppCommitResult & result_r ); /** Commit ordered changes (internal helper) */ void commitInSingleTransaction( const ZYppCommitPolicy & policy_r, CommitPackageCache & packageCache_r, ZYppCommitResult & result_r ); /** Commit helper checking for file conflicts after download. */ void commitFindFileConflicts( const ZYppCommitPolicy & policy_r, ZYppCommitResult & result_r ); protected: /** Path to the target */ Pathname _root; /** RPM database */ rpm::RpmDb _rpm; /** Requested Locales database */ RequestedLocalesFile _requestedLocalesFile; /** user/auto installed database */ SolvIdentFile _autoInstalledFile; /** Hard-Locks database */ HardLocksFile _hardLocksFile; /** Cache distributionVersion */ mutable std::string _distributionVersion; /** vendor equivalence settings. */ VendorAttr _vendorAttr; }; /////////////////////////////////////////////////////////////////// /** \relates TargetImpl Stream output */ inline std::ostream & operator<<( std::ostream & str, const TargetImpl & obj ) { return obj.dumpOn( str ); } ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_TARGETIMPL_H libzypp-17.36.5/zypp/target/commitpackagepreloader.cc000066400000000000000000000510411476576476200227200ustar00rootroot00000000000000#include "private/commitpackagepreloader_p.h" #include "zypp-core/base/Gettext.h" #include #include #include // for shared logic like authenticate #include // to detect the URL type #include #include #include #include #include #include #include #include #include #include #include namespace zypp { namespace { inline bool preloadEnabled() { const char *val = ::getenv("ZYPP_PCK_PRELOAD"); // opt out for now if ( !val ) return false; return ( std::string_view( val ) == "1" ); } zypp::Pathname pckCachedLocation ( const PoolItem &pck ) { if ( pck.isKind() ) { return pck->asKind()->cachedLocation(); } else if ( pck.isKind() ) { return pck->asKind()->cachedLocation(); } return {}; } } struct RepoUrl { zypp::Url baseUrl; media::UrlResolverPlugin::HeaderList headers; }; class CommitPackagePreloader::PreloadWorker : public zyppng::Base { public: enum State { Pending, SimpleDl, //ZckHead, //ZckData, Finished }; PreloadWorker( CommitPackagePreloader &parent ) : _parent(parent) {} bool finished ( ) const { return (_s == Finished); } void nextJob () { // clean state vars _started = false; _firstAuth = true; _notFoundRetry = 0; _tmpFile.reset(); _lastByteCount = 0; _taintedMirrors.clear(); if ( _parent._requiredDls.empty() ) { if ( _myMirror ) { _myMirror->refs--; _myMirror = nullptr; _currentRepoId = sat::detail::noRepoId; } MIL << "No more jobs pending, exiting worker" << std::endl; // exit! _s = Finished; _sigFinished.emit(); return; } _job = _parent._requiredDls.front(); _parent._requiredDls.pop_front(); auto loc = _job.lookupLocation(); _targetPath = _job.repoInfo().predownloadPath() / _job.lookupLocation().filename(); // select a mirror we want to use if ( !prepareMirror( ) ) { callback::UserData userData( "CommitPreloadReport/fileDone" ); userData.set( "description", _("No mirror found") ); _parent._report->fileDone( _targetPath, media::CommitPreloadReport::ERROR, userData ); return nextJob(); } if ( filesystem::assert_dir( _targetPath.dirname()) != 0 ) { ERR << "Failed to create target dir for file: " << _targetPath << std::endl; callback::UserData userData( "CommitPreloadReport/fileDone" ); userData.set( "description", _("Could not create target File") ); _parent._report->fileDone( _targetPath, media::CommitPreloadReport::ERROR, userData ); return nextJob(); } media::TransferSettings settings; zypp::Url url; makeJobUrl ( url, settings ); // check if the file is there already { PathInfo pathInfo(_targetPath); if ( pathInfo.isExist() ) { // just in case there is something else that is not a file we delete it if ( !pathInfo.isFile() ) { if ( pathInfo.isDir () ) filesystem::rmdir( _targetPath ); else filesystem::unlink( _targetPath ); } else if ( is_checksum( _targetPath, loc.checksum() ) ) { // if we have the file already, no need to download again callback::UserData userData( "CommitPreloadReport/fileDone" ); userData.set( "Url", url ); userData.set( "description", _("Already in Cache") ); _parent._report->fileDone( _targetPath, media::CommitPreloadReport::NO_ERROR, userData ); return nextJob(); } else { // everything else we delete filesystem::unlink ( _targetPath ); } } } // we download into a temp file so that we don't leave broken files in case of errors or a crash _tmpFile = filesystem::TmpFile::asManagedFile( _targetPath.dirname(), _targetPath.basename() ); if ( _s == Pending ) { // init case, set up request _req = std::make_shared( url, _tmpFile ); _req->connect( &zyppng::NetworkRequest::sigStarted, *this, &PreloadWorker::onRequestStarted ); _req->connect( &zyppng::NetworkRequest::sigBytesDownloaded, *this, &PreloadWorker::onRequestProgress ); _req->connect( &zyppng::NetworkRequest::sigFinished, *this, &PreloadWorker::onRequestFinished ); } else { _req->resetRequestRanges(); _req->setUrl( url ); _req->setTargetFilePath( _tmpFile ); } // TODO check for zchunk _s = SimpleDl; _req->transferSettings() = settings; _parent._dispatcher->enqueue(_req); } zyppng::SignalProxy sigWorkerFinished() { return _sigFinished; } private: // TODO some smarter logic that selects mirrors bool prepareMirror( ) { const auto &pi = _job; if ( _myMirror ) { if ( _currentRepoId == pi.repository().id() ) { return true; } _currentRepoId = sat::detail::noRepoId; _myMirror->refs--; _myMirror = nullptr; } _myMirror = findUsableMirror (); if ( !_myMirror ) return false; _currentRepoId = pi.repository().id(); _myMirror->refs++; return true; } /** * Taints the current mirror, returns true if a alternative was found */ bool taintCurrentMirror() { if ( _myMirror ) { _myMirror->miss++; _taintedMirrors.insert( _myMirror ); } // try to find another mirror auto mirrPtr = findUsableMirror ( _myMirror, false ); if ( mirrPtr ) { if ( _myMirror ) { _myMirror->refs--; } _myMirror = mirrPtr; _myMirror->refs++; return true; } return false; } /** * Tries to find a usable mirror */ RepoUrl *findUsableMirror( RepoUrl *skip = nullptr, bool allowTainted = true ) { auto &repoDlInfo = _parent._dlRepoInfo.at( _job.repository().id() ); std::vector::iterator curr = repoDlInfo._baseUrls.end(); int currentSmallestRef = INT_MAX; for ( auto i = repoDlInfo._baseUrls.begin(); i != repoDlInfo._baseUrls.end(); i++ ) { auto mirrorPtr = &(*i); if ( skip == mirrorPtr ) continue; if ( !allowTainted && _taintedMirrors.find(mirrorPtr) != _taintedMirrors.end() ) continue; // we are adding the file misses on top of the refcount // that way we will use mirrors that often miss a file less if ( ( i->refs + i->miss ) < currentSmallestRef ) { currentSmallestRef = ( i->refs + i->miss ); curr = i; } } if ( curr == repoDlInfo._baseUrls.end() ) return nullptr; return &(*curr); } void onRequestStarted ( zyppng::NetworkRequest &req ) { MIL << "Request for " << req.url() << " started" << std::endl; } void onRequestProgress( zyppng::NetworkRequest &req, zypp::ByteCount count ) { if ( !_started ) { _started = true; callback::UserData userData( "CommitPreloadReport/fileStart" ); userData.set( "Url", _req->url() ); _parent._report->fileStart( _targetPath, userData ); } ByteCount downloaded; if ( _lastByteCount == 0 ) downloaded = count; else downloaded = count - _lastByteCount; _lastByteCount = count; _parent.reportBytesDownloaded( downloaded ); } void onRequestFinished( zyppng::NetworkRequest &req, const zyppng::NetworkRequestError &err ) { MIL << "Request for " << req.url() << " finished. (" << err.toString() << ")" << std::endl; if ( !req.hasError() ) { if ( filesystem::rename( _tmpFile, _targetPath ) != 0 ) { // error failCurrentJob ( _targetPath, req.url(), media::CommitPreloadReport::ERROR, _("Failed to rename temporary file.") ); } else { callback::UserData userData( "CommitPreloadReport/fileDone" ); userData.set( "Url", req.url() ); userData.set( "description", _("Finished") ); _parent._report->fileDone( _targetPath, media::CommitPreloadReport::NO_ERROR, userData ); } } else { // handle errors and auth const auto &error = req.error(); switch ( error.type() ) { case zyppng::NetworkRequestError::InternalError: case zyppng::NetworkRequestError::InvalidChecksum: case zyppng::NetworkRequestError::UnsupportedProtocol: case zyppng::NetworkRequestError::MalformedURL: case zyppng::NetworkRequestError::PeerCertificateInvalid: case zyppng::NetworkRequestError::ConnectionFailed: case zyppng::NetworkRequestError::ServerReturnedError: case zyppng::NetworkRequestError::MissingData: case zyppng::NetworkRequestError::RangeFail: case zyppng::NetworkRequestError::Cancelled: case zyppng::NetworkRequestError::ExceededMaxLen: case zyppng::NetworkRequestError::TemporaryProblem: case zyppng::NetworkRequestError::Timeout: case zyppng::NetworkRequestError::Forbidden: case zyppng::NetworkRequestError::Http2Error: case zyppng::NetworkRequestError::Http2StreamError: { failCurrentJob ( _targetPath, req.url(), media::CommitPreloadReport::ERROR, req.extendedErrorString() ); break; } case zyppng::NetworkRequestError::Unauthorized: case zyppng::NetworkRequestError::AuthFailed: { //in case we got a auth hint from the server the error object will contain it std::string authHint = error.extraInfoValue("authHint", std::string()); media::CredentialManager cm(media::CredManagerOptions(ZConfig::instance().repoManagerRoot())); bool newCreds = media::MediaCurl2::authenticate( _myMirror->baseUrl, cm, req.transferSettings(), authHint, _firstAuth ); if ( newCreds) { _firstAuth = false; _parent._dispatcher->enqueue( _req ); return; } failCurrentJob ( _targetPath, req.url(), media::CommitPreloadReport::ACCESS_DENIED, req.extendedErrorString() ); break; } case zyppng::NetworkRequestError::NotFound: { MIL << "Download from mirror failed for file " << req.url () << " trying to taint mirror and move on" << std::endl; if ( taintCurrentMirror() ) { _notFoundRetry++; media::TransferSettings settings; zypp::Url url; makeJobUrl ( url, settings ); MIL << "Found new mirror: " << url << " recovering, retry count: " << _notFoundRetry << std::endl; _req->setUrl( url ); _req->transferSettings () = settings; _parent._dispatcher->enqueue( _req ); return; } failCurrentJob ( _targetPath, req.url(), media::CommitPreloadReport::NOT_FOUND, req.extendedErrorString() ); break; } case zyppng::NetworkRequestError::NoError: // should never happen DBG << "BUG: Download error flag is set , but Error code is NoError" << std::endl; break; } } nextJob(); } void failCurrentJob( const zypp::Pathname &localPath, const std::optional &url, media::CommitPreloadReport::Error e, const std::optional &errorMessage ) { callback::UserData userData( "CommitPreloadReport/fileDone" ); if ( url ) userData.set( "Url", url ); if ( errorMessage ) userData.set( "description", _("Already in Cache") ); _parent._missedDownloads = true; _parent._report->fileDone( localPath, e, userData ); } void makeJobUrl ( zypp::Url &resultUrl, media::TransferSettings &resultSet ) { // rewrite Url zypp::Url url = _myMirror->baseUrl; media::TransferSettings settings; // TODO share logic with MediaCurl2 ::internal::fillSettingsFromUrl( url, settings ); // if the proxy was not set (or explicitly unset) by url, then look... if ( settings.proxy().empty() ) ::internal::fillSettingsSystemProxy( url, settings ); // remove extra options from the URL url = ::internal::clearQueryString( url ); const auto &loc = _job.lookupLocation(); // rewrite URL for media handle url = MediaSetAccess::rewriteUrl( url ,loc.medianr() ); // append path to file url.appendPathName( loc.filename() ); // add extra headers for ( const auto & el : _myMirror->headers ) { std::string header { el.first }; header += ": "; header += el.second; MIL << "Added custom header -> " << header << std::endl; settings.addHeader( std::move(header) ); } resultUrl = url; resultSet = settings; } private: State _s = Pending; CommitPackagePreloader &_parent; zyppng::NetworkRequestRef _req; PoolItem _job; ManagedFile _tmpFile; zypp::Pathname _targetPath; bool _started = false; bool _firstAuth = true; RepoUrl *_myMirror = nullptr; ByteCount _lastByteCount = 0; Repository::IdType _currentRepoId = sat::detail::noRepoId; // retry handling int _notFoundRetry = 0; std::set _taintedMirrors; //< mirrors that returned 404 for the current request zyppng::Signal _sigFinished; }; CommitPackagePreloader::CommitPackagePreloader() {} void CommitPackagePreloader::preloadTransaction( const std::vector &steps) { if ( !preloadEnabled() ) { MIL << "CommitPackagePreloader disabled" << std::endl; return; } // preload happens only if someone handles the report if ( !_report->connected() ) { MIL << "No receiver for the CommitPreloadReport, skipping preload phase" << std::endl; return; } auto ev = zyppng::EventLoop::create(); _dispatcher = std::make_shared(); _dispatcher->setMaximumConcurrentConnections( MediaConfig::instance().download_max_concurrent_connections() ); _dispatcher->setAgentString ( str::asString( media::MediaCurl2::agentString () ) ); _dispatcher->setHostSpecificHeader ("download.opensuse.org", "X-ZYpp-DistributionFlavor", str::asString(media::MediaCurl2::distributionFlavorHeader()) ); _dispatcher->setHostSpecificHeader ("download.opensuse.org", "X-ZYpp-AnonymousId", str::asString(media::MediaCurl2::anonymousIdHeader()) ); _dispatcher->run(); _pTracker = std::make_shared(); _requiredBytes = 0; _downloadedBytes = 0; _missedDownloads = false; zypp_defer { _dispatcher.reset(); _pTracker.reset(); }; for ( const auto &step : steps ) { switch ( step.stepType() ) { case sat::Transaction::TRANSACTION_INSTALL: case sat::Transaction::TRANSACTION_MULTIINSTALL: // proceed: only install actions may require download. break; default: // next: no download for non-packages and delete actions. continue; break; } PoolItem pi(step.satSolvable()); if ( !pi->isKind() && !pi->isKind() ) continue; // no checksum ,no predownload, Fetcher would ignore it if ( pi->lookupLocation().checksum().empty() ) continue; // check if Package is cached already if( !pckCachedLocation(pi).empty() ) continue; auto repoDlsIter = _dlRepoInfo.find( pi.repository().id() ); if ( repoDlsIter == _dlRepoInfo.end() ) { // make sure download path for this repo exists if ( filesystem::assert_dir( pi.repoInfo().predownloadPath() ) != 0 ) { ERR << "Failed to create predownload cache for repo " << pi.repoInfo().alias() << std::endl; return; } // filter base URLs that do not download std::vector repoUrls; const auto bu = pi.repoInfo().baseUrls(); std::for_each( bu.begin(), bu.end(), [&]( const zypp::Url &u ) { media::UrlResolverPlugin::HeaderList custom_headers; Url url = media::UrlResolverPlugin::resolveUrl(u, custom_headers); MIL << "Trying scheme '" << url.getScheme() << "'" << std::endl; if ( media::MediaHandlerFactory::handlerType(url) != media::MediaHandlerFactory::MediaCURLType ) return; repoUrls.push_back( RepoUrl { .baseUrl = std::move(url), .headers = std::move(custom_headers) } ); }); // skip this solvable if it has no downloading base URLs if( repoUrls.empty() ) { MIL << "Skipping predownload for " << step.satSolvable() << " no downloading URL" << std::endl; continue; } // TODO here we could block to fetch mirror informations, either if the RepoInfo has a metalink or mirrorlist entry // or if the hostname of the repo is d.o.o if ( repoUrls.begin()->baseUrl.getHost() == "download.opensuse.org" ){ //auto req = std::make_shared( ); } _dlRepoInfo.insert( std::make_pair( pi.repository().id(), RepoDownloadData{ ._baseUrls = std::move(repoUrls) } )); } _requiredBytes += pi.lookupLocation().downloadSize(); _requiredDls.push_back( pi ); } if ( _requiredDls.empty() ) return; // order by repo std::sort( _requiredDls.begin(), _requiredDls.end(), []( const PoolItem &a , const PoolItem &b ) { return a.repository() < b.repository(); }); const auto &workerDone = [&, this](){ if ( std::all_of( _workers.begin(), _workers.end(), []( const auto &w ) { return w->finished();} ) ) ev->quit(); }; _report->start(); zypp_defer { _report->finish( _missedDownloads ? media::CommitPreloadReport::MISS : media::CommitPreloadReport::SUCCESS ); }; MIL << "Downloading packages via " << MediaConfig::instance().download_max_concurrent_connections() << " connections." << std::endl; // we start a worker for each configured connection for ( int i = 0; i < MediaConfig::instance().download_max_concurrent_connections() ; i++ ) { // if we run out of jobs before we started all workers, stop if (_requiredDls.empty()) break; auto worker = std::make_shared(*this); worker->sigWorkerFinished().connect(workerDone); worker->nextJob(); _workers.push_back( std::move(worker) ); } if( std::any_of( _workers.begin(), _workers.end(), []( const auto &w ) { return !w->finished(); } ) ) { MIL << "Running preload event loop!" << std::endl; ev->run(); } MIL << "Preloading done, returning" << std::endl; } void CommitPackagePreloader::cleanupCaches() { if ( !preloadEnabled() ) { MIL << "CommitPackagePreloader disabled" << std::endl; return; } std::for_each( _dlRepoInfo.begin (), _dlRepoInfo.end(), []( const auto &elem ){ filesystem::clean_dir ( Repository(elem.first).info().predownloadPath() ); }); } bool CommitPackagePreloader::missed() const { return _missedDownloads; } void CommitPackagePreloader::reportBytesDownloaded(ByteCount newBytes) { _downloadedBytes += newBytes; _pTracker->updateStats( _requiredBytes, _downloadedBytes ); callback::UserData userData( "CommitPreloadReport/progress" ); userData.set( "dbps_avg" , static_cast( _pTracker->_drateTotal ) ); userData.set( "dbps_current", static_cast( _pTracker->_drateLast ) ); userData.set( "bytesReceived", static_cast( _pTracker->_dnlNow ) ); userData.set( "bytesRequired", static_cast( _pTracker->_dnlTotal ) ); if ( !_report->progress( _pTracker->_dnlPercent, userData ) ) { _missedDownloads = true; _requiredDls.clear(); _dispatcher->cancelAll( _("Cancelled by user.")); } } } libzypp-17.36.5/zypp/target/modalias/000077500000000000000000000000001476576476200174775ustar00rootroot00000000000000libzypp-17.36.5/zypp/target/modalias/Modalias.cc000066400000000000000000000170271476576476200215460ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/modalias/Modalias.cc * */ extern "C" { #include } #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "MODALIAS" #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace target { /////////////////////////////////////////////////////////////////// namespace { /** Filter subtrees known to contain no modalias files */ inline bool isBlackListed( const Pathname & dir_r, const char * file_r ) { #define PATH_IS( D, F ) ( ::strcmp( file_r, F ) == 0 && ::strcmp( dir_r.c_str(), D ) == 0 ) switch ( file_r[0] ) { case 'm': return PATH_IS( "/sys/devices/system", "memory" ); // bnc#824110: huge tree for systems with large RAM break; } return false; #undef PATH_IS } void foreach_file_recursive( const Pathname & dir_r, std::set & arg_r ) { AutoDispose dir( ::opendir( dir_r.c_str() ), ::closedir ); if ( ! dir ) return; struct dirent * dirent = NULL; while ( (dirent = ::readdir(dir)) != NULL ) { if ( dirent->d_name[0] == '.' ) continue; if ( isBlackListed( dir_r, dirent->d_name ) ) continue; Pathname path; // lazy init as needed unsigned char d_type = dirent->d_type; if ( d_type == DT_UNKNOWN ) { path = dir_r/dirent->d_name; PathInfo pi( path, PathInfo::LSTAT ); if ( pi.isDir() ) d_type = DT_DIR; else if ( pi.isFile() ) d_type = DT_REG; } if ( d_type == DT_DIR ) { if ( path.empty() ) path = dir_r/dirent->d_name; foreach_file_recursive( path, arg_r ); } else if ( d_type == DT_REG && ::strcmp( dirent->d_name, "modalias" ) == 0 ) { if ( path.empty() ) path = dir_r/dirent->d_name; // read modalias line from file std::ifstream str( path.c_str() ); std::string line( iostr::getline( str ) ); if ( ! line.empty() ) arg_r.insert( line ); } } } /** Recursively scan for modalias files and scan them to \a arg. */ void foreach_file_recursive( const Pathname & dir_r, Modalias::ModaliasList & arg_r ) { std::set arg; // we want the aliases to be unified (the public API uses a vector) foreach_file_recursive( dir_r, arg ); arg_r.insert( arg_r.end(), arg.begin(), arg.end() ); } } // namespace /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Modalias::Impl // /** Modalias implementation. */ struct Modalias::Impl { /** Ctor. */ Impl() { const char * dir = getenv("ZYPP_MODALIAS_SYSFS"); if ( dir ) { PathInfo pi( dir ); if ( pi.isFile() ) { // Debug/testcases: // find /sys/ -type f -name modalias -print0 | xargs -0 cat >/tmp/modaliases // ZYPP_MODALIAS_SYSFS=/tmp/modaliases DBG << "Using $ZYPP_MODALIAS_SYSFS modalias file: " << dir << endl; iostr::forEachLine( InputStream( pi.path() ), [&]( int num_r, const std::string& line_r )->bool { this->_modaliases.push_back( line_r ); return true; } ); return; } DBG << "Using $ZYPP_MODALIAS_SYSFS: " << dir << endl; } else { dir = "/sys"; DBG << "Using /sys directory." << endl; } foreach_file_recursive( dir, _modaliases ); } Impl(const Impl &) = delete; Impl(Impl &&) = delete; Impl &operator=(const Impl &) = delete; Impl &operator=(Impl &&) = delete; /** Dtor. */ ~Impl() = default; /* * Check if a device on the system matches a modalias PATTERN. * * Returns NULL if no matching device is found, and the modalias * of the first matching device otherwise. (More than one device * may match a given pattern.) * * On a system that has the following device, * * pci:v00008086d0000265Asv00008086sd00004556bc0Csc03i00 * * modalias_matches("pci:v00008086d0000265Asv*sd*bc*sc*i*") will * return a non-NULL value. */ bool query( const char * cap_r ) const { if ( cap_r && *cap_r ) { for_( it, _modaliases.begin(), _modaliases.end() ) { if ( fnmatch( cap_r, (*it).c_str(), 0 ) == 0 ) return true; } } return false; } public: ModaliasList _modaliases; public: /** Offer default Impl. */ static shared_ptr nullimpl() { static shared_ptr _nullimpl( new Impl ); return _nullimpl; } }; /////////////////////////////////////////////////////////////////// /** \relates Modalias::Impl Stream output * And maybe std::ostream & operator<< Modalias::Impl below too. * return libhal version or something like that. */ inline std::ostream & operator<<( std::ostream & str, const Modalias::Impl & obj ) { return dumpRange( str << "Modaliases: (" << obj._modaliases.size() << ") ", obj._modaliases.begin(), obj._modaliases.end() ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : Modalias // /////////////////////////////////////////////////////////////////// Modalias::Modalias() : _pimpl( Impl::nullimpl() ) {} Modalias::~Modalias() {} Modalias & Modalias::instance() { static Modalias _singleton; return _singleton; } bool Modalias::query( const char * cap_r ) const { return _pimpl->query( cap_r ); } const Modalias::ModaliasList & Modalias::modaliasList() const { return _pimpl->_modaliases; } void Modalias::modaliasList( ModaliasList newlist_r ) { _pimpl->_modaliases.swap( newlist_r ); } std::ostream & operator<<( std::ostream & str, const Modalias & obj ) { return str << *obj._pimpl; } } // namespace target /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/modalias/Modalias.h000066400000000000000000000067521476576476200214130ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/modalias/Modalias.h * */ #ifndef ZYPP_TARGET_MODALIAS_MODALIAS_H #define ZYPP_TARGET_MODALIAS_MODALIAS_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Modalias // /** Hardware abstaction layer singleton. */ class ZYPP_API_DEPTESTOMATIC Modalias { friend std::ostream & operator<<( std::ostream & str, const Modalias & obj ); public: /** Implementation */ struct Impl; public: using ModaliasList = std::vector; /** Singleton access. */ static Modalias & instance(); /** Dtor */ ~Modalias(); public: /** Checks if a device on the system matches a modalias pattern. * * Returns \c false if no matching device is found, and the modalias * of the first matching device otherwise. (More than one device * may match a given pattern.) * * On a system that has the following device, * \code * pci:v00008086d0000265Asv00008086sd00004556bc0Csc03i00 * \endcode * the following query will return \c true: * \code * modalias_matches("pci:v00008086d0000265Asv*sd*bc*sc*i*") * \endcode */ bool query( IdString cap_r ) const { return query( cap_r.c_str() ); } /** \overload */ bool query( const char * cap_r ) const; /** \overload */ bool query( const std::string & cap_r ) const { return query( cap_r.c_str() ); } /** List of modaliases found on system */ const ModaliasList & modaliasList() const; /** Manually set list of modaliases to use */ void modaliasList( ModaliasList newlist_r ); private: /** Singleton ctor. */ Modalias(); /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates Modalias Stream output */ std::ostream & operator<<( std::ostream & str, const Modalias & obj ) ZYPP_API_DEPTESTOMATIC; ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_MODALIAS_MODALIAS_H libzypp-17.36.5/zypp/target/private/000077500000000000000000000000001476576476200173605ustar00rootroot00000000000000libzypp-17.36.5/zypp/target/private/commitpackagepreloader_p.h000066400000000000000000000041521476576476200245540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ #ifndef ZYPP_TARGET_PRIVATE_COMMITPACKAGEPRELOADER_H #define ZYPP_TARGET_PRIVATE_COMMITPACKAGEPRELOADER_H #include #include #include #include #include #include #include #include namespace zyppng { ZYPP_FWD_DECL_TYPE_WITH_REFS(NetworkRequestDispatcher); ZYPP_FWD_DECL_TYPE_WITH_REFS(NetworkRequest); } namespace zypp { class CommitPackagePreloader { public: CommitPackagePreloader(); void preloadTransaction( const std::vector &steps ); void cleanupCaches(); bool missed() const; private: class PreloadWorker; struct RepoUrl { zypp::Url baseUrl; media::UrlResolverPlugin::HeaderList headers; int refs = 0; //< how many workers operate on the mirror int miss = 0; //< how many times this mirror had files misses }; struct RepoDownloadData { std::vector _baseUrls; }; void reportBytesDownloaded ( ByteCount newBytes ); std::map _dlRepoInfo; std::deque _requiredDls; std::vector> _workers; ByteCount _requiredBytes; ByteCount _downloadedBytes; bool _missedDownloads = false; callback::SendReport _report; zyppng::Ref _pTracker; zyppng::NetworkRequestDispatcherRef _dispatcher; }; } #endif // ZYPP_TARGET_PRIVATE_COMMITPACKAGEPRELOADER_H libzypp-17.36.5/zypp/target/rpm/000077500000000000000000000000001476576476200165045ustar00rootroot00000000000000libzypp-17.36.5/zypp/target/rpm/BinHeader.cc000066400000000000000000000256541476576476200206500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/BinHeader.cc * */ #include "librpm.h" extern "C" { #ifdef _RPM_5 #undef RPM_NULL_TYPE #define RPM_NULL_TYPE rpmTagType(0) typedef rpmuint32_t rpm_count_t; #endif } #include #include #include #include #include #include using std::endl; #undef Y2LOG #define Y2LOG "BinHeader" namespace zypp { namespace target { namespace rpm { /** Helper for header data retieval. * With \c _RPM_4 use \c ::headerGet; with \c _RPM_5 * use the meanwhile deprecated \c ::headerGetEntry. * \ingroup g_RAII */ struct HeaderEntryGetter : private base::NonCopyable { public: HeaderEntryGetter(const Header &h_r, rpmTag &tag_r); HeaderEntryGetter(const HeaderEntryGetter &) = delete; HeaderEntryGetter(HeaderEntryGetter &&) = delete; HeaderEntryGetter &operator=(const HeaderEntryGetter &) = delete; HeaderEntryGetter &operator=(HeaderEntryGetter &&) = delete; ~HeaderEntryGetter(); rpmTagType type(); rpm_count_t cnt(); void * val(); private: #ifndef _RPM_5 ::rpmtd _rpmtd; #else rpmTagType _type; rpm_count_t _cnt; void * _val; #endif //_RPM_5 }; #ifndef _RPM_5 inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r ) : _rpmtd( ::rpmtdNew() ) { ::headerGet( h_r, tag_r, _rpmtd, HEADERGET_DEFAULT ); } inline HeaderEntryGetter::~HeaderEntryGetter() { ::rpmtdFreeData( _rpmtd ); ::rpmtdFree( _rpmtd ); } inline rpmTagType HeaderEntryGetter::type() { return rpmtdType( _rpmtd ); } inline rpm_count_t HeaderEntryGetter::cnt() { return _rpmtd->count; } inline void * HeaderEntryGetter::val() { return _rpmtd->data; } #else inline HeaderEntryGetter::HeaderEntryGetter( const Header & h_r, rpmTag & tag_r ) : _type( RPM_NULL_TYPE ) , _cnt( 0 ) , _val( 0 ) { ::headerGetEntry( h_r, tag_r, hTYP_t(&_type), &_val, &_cnt ); } inline HeaderEntryGetter::~HeaderEntryGetter() { if ( _val && _type == RPM_STRING_ARRAY_TYPE ) free( _val ); } inline rpmTagType HeaderEntryGetter::type() { return _type; } inline rpm_count_t HeaderEntryGetter::cnt() { return _cnt; } inline void * HeaderEntryGetter::val() { return _val; } #endif //_RPM_5 /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::intList // /////////////////////////////////////////////////////////////////// unsigned BinHeader::intList::set( void * val_r, unsigned cnt_r, rpmTagType type_r ) { _type = type_r; // remember the type! if ( val_r ) switch ( _type ) { #if RPM_CHAR_TYPE != RPM_INT8_TYPE case RPM_CHAR_TYPE: std::vector( (char*)val_r, ((char*)val_r)+cnt_r ).swap( _data ); break; #endif case RPM_INT8_TYPE: std::vector( (int8_t*)val_r, ((int8_t*)val_r)+cnt_r ).swap( _data ); break; case RPM_INT16_TYPE: std::vector( (int16_t*)val_r, ((int16_t*)val_r)+cnt_r ).swap( _data ); break; case RPM_INT32_TYPE: std::vector( (int32_t*)val_r, ((int32_t*)val_r)+cnt_r ).swap( _data ); break; #ifndef _RPM_5 case RPM_INT64_TYPE: std::vector( (int64_t*)val_r, ((int64_t*)val_r)+cnt_r ).swap( _data ); break; #endif default: std::vector( cnt_r, 0L ).swap( _data ); break; } else _data.clear(); return _data.size(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::stringList // /////////////////////////////////////////////////////////////////// unsigned BinHeader::stringList::set( char ** val_r, unsigned cnt_r ) { if ( val_r ) std::vector( val_r, val_r+cnt_r ).swap( _data ); else _data.clear(); return _data.size(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::BinHeader // METHOD TYPE : Constructor // BinHeader::BinHeader( Header h_r ) : _h( h_r ) { if ( _h ) { headerLink( _h ); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::BinHeader // METHOD TYPE : Constructor // BinHeader::BinHeader( BinHeader::Ptr & rhs ) { INT << "INJECT from " << rhs; if ( ! (rhs && rhs->_h) ) { _h = 0; } else { _h = rhs->_h; // ::headerLink already done in rhs rhs->_h = 0; } INT << ": " << *this << " (" << rhs << ")" << endl; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::~BinHeader // METHOD TYPE : Destructor // BinHeader::~BinHeader() { if ( _h ) { headerFree( _h ); } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::assertHeader // METHOD TYPE : void // bool BinHeader::assertHeader() { if ( !_h ) { _h = ::headerNew(); if ( !_h ) { INT << "OOPS: NULL HEADER created!" << endl; return false; } } return true; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::has_tag // METHOD TYPE : bool // // DESCRIPTION : // bool BinHeader::has_tag( tag tag_r ) const { return( !empty() && ::headerIsEntry( _h, tag_r ) ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::int_list // METHOD TYPE : unsigned // // DESCRIPTION : // unsigned BinHeader::int_list( tag tag_r, intList & lst_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return lst_r.set( 0, 0, headerget.type() ); #if RPM_CHAR_TYPE != RPM_INT8_TYPE case RPM_CHAR_TYPE: #endif case RPM_INT8_TYPE: case RPM_INT16_TYPE: case RPM_INT32_TYPE: #ifndef _RPM_5 case RPM_INT64_TYPE: #endif return lst_r.set( headerget.val(), headerget.cnt(), headerget.type() ); default: INT << "RPM_TAG MISMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return lst_r.set( 0, 0, RPM_NULL_TYPE ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::string_list // METHOD TYPE : unsigned // // DESCRIPTION : // unsigned BinHeader::string_list( tag tag_r, stringList & lst_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return lst_r.set( 0, 0 ); case RPM_STRING_ARRAY_TYPE: return lst_r.set( (char**)headerget.val(), headerget.cnt() ); default: INT << "RPM_TAG MISMATCH: RPM_STRING_ARRAY_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return lst_r.set( 0, 0 ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::int_val // METHOD TYPE : int // // DESCRIPTION : // int BinHeader::int_val( tag tag_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return 0; #if RPM_CHAR_TYPE != RPM_INT8_TYPE case RPM_CHAR_TYPE: return *((char*)headerget.val()); #endif case RPM_INT8_TYPE: return *((int8_t*)headerget.val()); case RPM_INT16_TYPE: return *((int16_t*)headerget.val()); case RPM_INT32_TYPE: return *((int32_t*)headerget.val()); #ifndef _RPM_5 case RPM_INT64_TYPE: return *((int64_t*)headerget.val()); #endif default: INT << "RPM_TAG MISMATCH: RPM_INTxx_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return 0; } ByteArray BinHeader::blob_val( tag tag_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return {}; case RPM_BIN_TYPE: return ByteArray( reinterpret_cast( headerget.val() ), headerget.cnt() ); default: INT << "RPM_TAG MISSMATCH: RPM_BIN_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return {}; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::string_val // METHOD TYPE : std::string // // DESCRIPTION : // std::string BinHeader::string_val( tag tag_r ) const { if ( !empty() ) { HeaderEntryGetter headerget( _h, tag_r ); if ( headerget.val() ) { switch ( headerget.type() ) { case RPM_NULL_TYPE: return ""; case RPM_STRING_TYPE: return (char*)headerget.val(); default: INT << "RPM_TAG MISMATCH: RPM_STRING_TYPE " << tag_r << " got type " << headerget.type() << endl; } } } return ""; } std::string BinHeader::format(const char *fmt) const { zypp::AutoDispose form(headerFormat(_h, fmt, NULL), free); if ( !form ) return std::string(); return std::string(form); } Header BinHeader::get() const { return _h; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::stringList_val // METHOD TYPE : std::list // // DESCRIPTION : // std::list BinHeader::stringList_val( tag tag_r ) const { std::list ret; if ( !empty() ) { stringList lines; unsigned count = string_list( tag_r, lines ); for ( unsigned i = 0; i < count; ++i ) { ret.push_back( lines[i] ); } } return ret; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : BinHeader::dumpOn // METHOD TYPE : ostream & // // DESCRIPTION : // std::ostream & BinHeader::dumpOn( std::ostream & str ) const { ReferenceCounted::dumpOn( str ); return str << '{' << (void*)_h << '}'; } } // namespace rpm } // namespace target } // namespace zypp libzypp-17.36.5/zypp/target/rpm/BinHeader.h000066400000000000000000000071721476576476200205050ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/BinHeader.h * */ #ifndef ZYPP_TARGET_RPM_BINHEADER_H #define ZYPP_TARGET_RPM_BINHEADER_H extern "C" { #include } #include #include #include #include #include #include #include #include #include namespace zypp { namespace target { namespace rpm { /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader /** * **/ class BinHeader : public base::ReferenceCounted, private base::NonCopyable { public: using Ptr = intrusive_ptr; using constPtr = intrusive_ptr; using tag = rpmTag; class intList; class stringList; private: Header _h; bool assertHeader(); public: BinHeader( Header h_r = 0 ); /** * Dangerous!<\B> This one takes the header out of rhs * and leaves rhs empty. **/ BinHeader( BinHeader::Ptr & rhs ); ~BinHeader() override; public: bool empty() const { return( _h == NULL ); } bool has_tag( tag tag_r ) const; unsigned int_list( tag tag_r, intList & lst_r ) const; unsigned string_list( tag tag_r, stringList & lst_r ) const; int int_val( tag tag_r ) const; ByteArray blob_val ( tag tag_r ) const; std::string string_val( tag tag_r ) const; std::string format ( const char * fmt) const; Header get() const; public: std::list stringList_val( tag tag_r ) const; public: std::ostream & dumpOn( std::ostream & str ) const override; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::intList /** * **/ class BinHeader::intList : private base::NonCopyable { public: intList() : _type( RPM_NULL_TYPE ) {} bool empty() const { return _data.empty(); } unsigned size() const { return _data.size(); } long operator[]( const unsigned idx_r ) const { return idx_r < _data.size() ? _data[idx_r] : 0; } private: friend class BinHeader; unsigned set( void * val_r, unsigned cnt_r, rpmTagType type_r ); private: std::vector _data; rpmTagType _type; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : BinHeader::stringList /** * **/ class BinHeader::stringList : private base::NonCopyable { public: bool empty() const { return _data.empty(); } unsigned size() const { return _data.size(); } std::string operator[]( const unsigned idx_r ) const { return idx_r < _data.size() ? _data[idx_r] : std::string(); } private: friend class BinHeader; unsigned set( char ** val_r, unsigned cnt_r ); private: std::vector _data; }; /////////////////////////////////////////////////////////////////// } // namespace rpm } // namespace target } // namespace zypp #endif // ZYPP_TARGET_RPM_BINHEADER_H libzypp-17.36.5/zypp/target/rpm/RpmCallbacks.cc000066400000000000000000000013751476576476200213570ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmCallbacks.cc * */ #include #include /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/rpm/RpmCallbacks.h000066400000000000000000000055411476576476200212200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmCallbacks.h * */ #ifndef ZYPP_TARGET_RPM_RPMCALLBACKS_H #define ZYPP_TARGET_RPM_RPMCALLBACKS_H #include #include #include #include #include namespace zypp { namespace target { namespace rpm { /////////////////////////////////////////////////////////////////// // Reporting progress of package removing /////////////////////////////////////////////////////////////////// struct RpmRemoveReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // ignore }; /** Start the operation */ virtual void start( const std::string & name ) {} /** * Inform about progress * Return true on abort */ virtual bool progress( unsigned percent ) { return false; } virtual Action problem( Exception & excpt_r ) { return ABORT; } /** Additional rpm output to be reported in \ref finish in case of success. */ virtual void finishInfo( const std::string & info_r ) {} /** Finish operation in case of success */ virtual void finish() {} /** Finish operation in case of fail, report fail exception */ virtual void finish( Exception & excpt_r ) {} }; /////////////////////////////////////////////////////////////////// // Reporting progress of package installation /////////////////////////////////////////////////////////////////// struct RpmInstallReport : public callback::ReportBase { enum Action { ABORT, // abort and return error RETRY, // retry IGNORE // ignore }; /** Start the operation */ virtual void start( const Pathname & name ) {} /** * Inform about progress * Return false on abort */ virtual bool progress( unsigned percent ) { return true; } /** Additional rpm output to be reported in \ref finish in case of success. */ virtual void finishInfo( const std::string & info_r ) {} /** Finish operation in case of success */ virtual void finish() {} virtual Action problem( Exception & excpt_r ) { return ABORT; } /** Finish operation in case of fail, report fail exception */ virtual void finish( Exception & excpt_r ) {} }; } // namespace rpm } // namespace target } // namespace zypp #endif // ZYPP_TARGET_RPM_RPMCALLBACKS_H libzypp-17.36.5/zypp/target/rpm/RpmDb.cc000066400000000000000000002035511476576476200200250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmDb.cc * */ #include "librpm.h" extern "C" { #include #include } #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; using namespace zypp::filesystem; #define WARNINGMAILPATH "/var/log/YaST2/" #define FILEFORBACKUPFILES "YaSTBackupModifiedFiles" #define MAXRPMMESSAGELINES 10000 #define WORKAROUNDRPMPWDBUG #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "librpmDb" namespace zypp { namespace zypp_readonly_hack { bool IGotIt(); // in readonly-mode } namespace env { inline bool ZYPP_RPM_DEBUG() { static bool val = [](){ const char * env = getenv("ZYPP_RPM_DEBUG"); return( env && str::strToBool( env, true ) ); }(); return val; } } // namespace env namespace target { namespace rpm { const callback::UserData::ContentType InstallResolvableReport::contentRpmout( "rpmout","installpkg" ); const callback::UserData::ContentType RemoveResolvableReport::contentRpmout( "rpmout","removepkg" ); namespace { const char* quoteInFilename_m = "\'\""; inline std::string rpmQuoteFilename( const Pathname & path_r ) { std::string path( path_r.asString() ); for ( std::string::size_type pos = path.find_first_of( quoteInFilename_m ); pos != std::string::npos; pos = path.find_first_of( quoteInFilename_m, pos ) ) { path.insert( pos, "\\" ); pos += 2; // skip '\\' and the quoted char. } return path; } /** Workaround bnc#827609 - rpm needs a readable pwd so we * chdir to /. Turn realtive pathnames into absolute ones * by prepending cwd so rpm still finds them */ inline Pathname workaroundRpmPwdBug( Pathname path_r ) { #if defined(WORKAROUNDRPMPWDBUG) if ( path_r.relative() ) { // try to prepend cwd AutoDispose cwd( ::get_current_dir_name(), ::free ); if ( cwd ) return Pathname( cwd ) / path_r; WAR << "Can't get cwd!" << endl; } #endif return path_r; // no problem with absolute pathnames } } struct KeyRingSignalReceiver : callback::ReceiveReport { KeyRingSignalReceiver(RpmDb &rpmdb) : _rpmdb(rpmdb) { connect(); } KeyRingSignalReceiver(const KeyRingSignalReceiver &) = delete; KeyRingSignalReceiver(KeyRingSignalReceiver &&) = delete; KeyRingSignalReceiver &operator=(const KeyRingSignalReceiver &) = delete; KeyRingSignalReceiver &operator=(KeyRingSignalReceiver &&) = delete; ~KeyRingSignalReceiver() override { disconnect(); } void trustedKeyAdded( const PublicKey &key ) override { MIL << "trusted key added to zypp Keyring. Importing..." << endl; _rpmdb.importPubkey( key ); } void trustedKeyRemoved( const PublicKey &key ) override { MIL << "Trusted key removed from zypp Keyring. Removing..." << endl; _rpmdb.removePubkey( key ); } RpmDb &_rpmdb; }; static shared_ptr sKeyRingReceiver; unsigned diffFiles(const std::string& file1, const std::string& file2, std::string& out, int maxlines) { const char* argv[] = { "diff", "-u", file1.c_str(), file2.c_str(), NULL }; ExternalProgram prog(argv,ExternalProgram::Discard_Stderr, false, -1, true); //if(!prog) //return 2; std::string line; int count = 0; for (line = prog.receiveLine(), count=0; !line.empty(); line = prog.receiveLine(), count++ ) { if (maxlines<0?true:count report; report->start( root() + dbPath() ); try { doRebuildDatabase(report); } catch (RpmException & excpt_r) { report->finish(root() + dbPath(), RebuildDBReport::FAILED, excpt_r.asUserHistory()); ZYPP_RETHROW(excpt_r); } report->finish(root() + dbPath(), RebuildDBReport::NO_ERROR, ""); } void RpmDb::doRebuildDatabase(callback::SendReport & report) { FAILIFNOTINITIALIZED; MIL << "RpmDb::rebuildDatabase" << *this << endl; const Pathname mydbpath { root()/dbPath() }; // the configured path used in reports { // For --rebuilddb take care we're using the real db directory // and not a symlink. Otherwise rpm will rename the symlink and // replace it with a real directory containing the converted db. DtorReset guardRoot { _root }; DtorReset guardDbPath{ _dbPath }; _root = "/"; _dbPath = filesystem::expandlink( mydbpath ); // run rpm RpmArgVec opts; opts.push_back("--rebuilddb"); opts.push_back("-vv"); run_rpm (opts, ExternalProgram::Stderr_To_Stdout); } // generate and report progress ProgressData tics; { ProgressData::value_type hdrTotal = 0; for ( auto it = dbConstIterator(); *it; ++it, ++hdrTotal ) {;} tics.range( hdrTotal ); } tics.sendTo( [&report,&mydbpath]( const ProgressData & tics_r ) -> bool { return report->progress( tics_r.reportValue(), mydbpath ); } ); tics.toMin(); std::string line; std::string errmsg; while ( systemReadLine( line ) ) { static const std::string debugPrefix { "D:" }; static const std::string progressPrefix { "D: read h#" }; static const std::string ignoreSuffix { "digest: OK" }; if ( ! str::startsWith( line, debugPrefix ) ) { if ( ! str::endsWith( line, ignoreSuffix ) ) { errmsg += line; errmsg += '\n'; WAR << line << endl; } } else if ( str::startsWith( line, progressPrefix ) ) { if ( ! tics.incr() ) { WAR << "User requested abort." << endl; systemKill(); } } } if ( systemStatus() != 0 ) { //TranslatorExplanation after semicolon is error message ZYPP_THROW(RpmSubprocessException(std::string(_("RPM failed: ")) + (errmsg.empty() ? error_message: errmsg) ) ); } else { tics.toMax(); } } /////////////////////////////////////////////////////////////////// namespace { /** \ref RpmDb::syncTrustedKeys helper * Compute which keys need to be exprted to / imported from the zypp keyring. * Return result via argument list. */ void computeKeyRingSync( std::set & rpmKeys_r, std::list & zyppKeys_r ) { /////////////////////////////////////////////////////////////////// // Remember latest release and where it ocurred struct Key { Key() : _inRpmKeys( nullptr ) , _inZyppKeys( nullptr ) {} void updateIf( const Edition & rpmKey_r ) { std::string keyRelease( rpmKey_r.release() ); int comp = _release.compare( keyRelease ); if ( comp < 0 ) { // update to newer release _release.swap( keyRelease ); _inRpmKeys = &rpmKey_r; _inZyppKeys = nullptr; if ( !keyRelease.empty() ) DBG << "Old key in Z: gpg-pubkey-" << rpmKey_r.version() << "-" << keyRelease << endl; } else if ( comp == 0 ) { // stay with this release if ( ! _inRpmKeys ) _inRpmKeys = &rpmKey_r; } // else: this is an old release else DBG << "Old key in R: gpg-pubkey-" << rpmKey_r.version() << "-" << keyRelease << endl; } void updateIf( const PublicKeyData & zyppKey_r ) { std::string keyRelease( zyppKey_r.gpgPubkeyRelease() ); int comp = _release.compare( keyRelease ); if ( comp < 0 ) { // update to newer release _release.swap( keyRelease ); _inRpmKeys = nullptr; _inZyppKeys = &zyppKey_r; if ( !keyRelease.empty() ) DBG << "Old key in R: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() << "-" << keyRelease << endl; } else if ( comp == 0 ) { // stay with this release if ( ! _inZyppKeys ) _inZyppKeys = &zyppKey_r; } // else: this is an old release else DBG << "Old key in Z: gpg-pubkey-" << zyppKey_r.gpgPubkeyVersion() << "-" << keyRelease << endl; } std::string _release; const Edition * _inRpmKeys; const PublicKeyData * _inZyppKeys; }; /////////////////////////////////////////////////////////////////// // collect keys by ID(version) and latest creation(release) std::map _keymap; for_( it, rpmKeys_r.begin(), rpmKeys_r.end() ) { _keymap[(*it).version()].updateIf( *it ); } for_( it, zyppKeys_r.begin(), zyppKeys_r.end() ) { _keymap[(*it).gpgPubkeyVersion()].updateIf( *it ); } // compute missing keys std::set rpmKeys; std::list zyppKeys; for_( it, _keymap.begin(), _keymap.end() ) { DBG << "gpg-pubkey-" << (*it).first << "-" << (*it).second._release << " " << ( (*it).second._inRpmKeys ? "R" : "_" ) << ( (*it).second._inZyppKeys ? "Z" : "_" ) << endl; if ( ! (*it).second._inRpmKeys ) { zyppKeys.push_back( *(*it).second._inZyppKeys ); } if ( ! (*it).second._inZyppKeys ) { rpmKeys.insert( *(*it).second._inRpmKeys ); } } rpmKeys_r.swap( rpmKeys ); zyppKeys_r.swap( zyppKeys ); } } // namespace /////////////////////////////////////////////////////////////////// void RpmDb::syncTrustedKeys( SyncTrustedKeyBits mode_r ) { MIL << "Going to sync trusted keys..." << endl; std::set rpmKeys( pubkeyEditions() ); std::list zyppKeys( getZYpp()->keyRing()->trustedPublicKeyData() ); if ( ! ( mode_r & SYNC_FROM_KEYRING ) ) { // bsc#1064380: We relief PK from removing excess keys in the zypp keyring // when re-acquiring the zyppp lock. For now we remove all excess keys. // TODO: Once we can safely assume that all PK versions are updated we // can think about re-importing newer key versions found in the zypp keyring and // removing only excess ones (but case is not very likely). Unfixed PK versions // however will remove the newer version found in the zypp keyring and by doing // this, the key here will be removed via callback as well (keys are deleted // via gpg id, regardless of the edition). MIL << "Removing excess keys in zypp trusted keyring" << std::endl; // Temporarily disconnect to prevent the attempt to pass back the delete request. callback::TempConnect tempDisconnect; bool dirty = false; for ( const PublicKeyData & keyData : zyppKeys ) { if ( ! rpmKeys.count( keyData.gpgPubkeyEdition() ) ) { DBG << "Excess key in Z to delete: gpg-pubkey-" << keyData.gpgPubkeyEdition() << endl; getZYpp()->keyRing()->deleteKey( keyData.id(), /*trusted*/true ); if ( !dirty ) dirty = true; } } if ( dirty ) zyppKeys = getZYpp()->keyRing()->trustedPublicKeyData(); } computeKeyRingSync( rpmKeys, zyppKeys ); MIL << (mode_r & SYNC_TO_KEYRING ? "" : "(skip) ") << "Rpm keys to export into zypp trusted keyring: " << rpmKeys.size() << endl; MIL << (mode_r & SYNC_FROM_KEYRING ? "" : "(skip) ") << "Zypp trusted keys to import into rpm database: " << zyppKeys.size() << endl; /////////////////////////////////////////////////////////////////// if ( (mode_r & SYNC_TO_KEYRING) && ! rpmKeys.empty() ) { // export to zypp keyring MIL << "Exporting rpm keyring into zypp trusted keyring" < tempDisconnect; auto keepDbOpen = dbConstIterator(); // just to keep a ref. TmpFile tmpfile( getZYpp()->tmpPath() ); { std::ofstream tmpos( tmpfile.path().c_str() ); for_( it, rpmKeys.begin(), rpmKeys.end() ) { // we export the rpm key into a file RpmHeader::constPtr result; getData( "gpg-pubkey", *it, result ); tmpos << result->tag_description() << endl; } } try { getZYpp()->keyRing()->multiKeyImport( tmpfile.path(), true /*trusted*/); // bsc#1096217: Try to spot and report legacy V3 keys found in the rpm database. // Modern rpm does not import those keys, but when migrating a pre SLE12 system // we may find them. rpm>4.13 even complains on sderr if sucha key is present. std::set missingKeys; for ( const Edition & key : rpmKeys ) { if ( getZYpp()->keyRing()->isKeyTrusted( key.version() ) ) // key.version is the gpgkeys short ID continue; ERR << "Could not import key:" << str::Format("gpg-pubkey-%s") % key << " into zypp keyring (V3 key?)" << endl; missingKeys.insert( key ); } if ( ! missingKeys.empty() ) callback::SendReport()->reportNonImportedKeys(missingKeys); } catch ( const Exception & excpt ) { ZYPP_CAUGHT( excpt ); ERR << "Could not import keys into zypp keyring: " << endl; } } /////////////////////////////////////////////////////////////////// if ( (mode_r & SYNC_FROM_KEYRING) && ! zyppKeys.empty() ) { // import from zypp keyring MIL << "Importing zypp trusted keyring" << std::endl; for_( it, zyppKeys.begin(), zyppKeys.end() ) { try { importPubkey( getZYpp()->keyRing()->exportTrustedPublicKey( *it ) ); } catch ( const RpmException & exp ) { ZYPP_CAUGHT( exp ); } } } MIL << "Trusted keys synced." << endl; } void RpmDb::importZyppKeyRingTrustedKeys() { syncTrustedKeys( SYNC_FROM_KEYRING ); } void RpmDb::exportTrustedKeysInZyppKeyRing() { syncTrustedKeys( SYNC_TO_KEYRING ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::importPubkey // METHOD TYPE : PMError // void RpmDb::importPubkey( const PublicKey & pubkey_r ) { FAILIFNOTINITIALIZED; // bnc#828672: On the fly key import in READONLY if ( zypp_readonly_hack::IGotIt() ) { WAR << "Key " << pubkey_r << " can not be imported. (READONLY MODE)" << endl; return; } // check if the key is already in the rpm database Edition keyEd( pubkey_r.gpgPubkeyVersion(), pubkey_r.gpgPubkeyRelease() ); std::set rpmKeys = pubkeyEditions(); bool hasOldkeys = false; for_( it, rpmKeys.begin(), rpmKeys.end() ) { // bsc#1008325: Keys using subkeys for signing don't get a higher release // if new subkeys are added, because the primary key remains unchanged. // For now always re-import keys with subkeys. Here we don't want to export the // keys in the rpm database to check whether the subkeys are the same. The calling // code should take care, we don't re-import the same kesy over and over again. if ( keyEd == *it && !pubkey_r.hasSubkeys() ) // quick test (Edition is IdStringType!) { MIL << "Key " << pubkey_r << " is already in the rpm trusted keyring. (skip import)" << endl; return; } if ( keyEd.version() != (*it).version() ) continue; // different key ID (version) if ( keyEd.release() < (*it).release() ) { MIL << "Key " << pubkey_r << " is older than one in the rpm trusted keyring. (skip import)" << endl; return; } else { hasOldkeys = true; } } MIL << "Key " << pubkey_r << " will be imported into the rpm trusted keyring." << (hasOldkeys?"(update)":"(new)") << endl; if ( hasOldkeys ) { // We must explicitly delete old key IDs first (all releases, // that's why we don't call removePubkey here). std::string keyName( "gpg-pubkey-" + keyEd.version() ); RpmArgVec opts; opts.push_back ( "-e" ); opts.push_back ( "--allmatches" ); opts.push_back ( "--" ); opts.push_back ( keyName.c_str() ); run_rpm( opts, ExternalProgram::Stderr_To_Stdout ); std::string line; while ( systemReadLine( line ) ) { ( str::startsWith( line, "error:" ) ? WAR : DBG ) << line << endl; } if ( systemStatus() != 0 ) { ERR << "Failed to remove key " << pubkey_r << " from RPM trusted keyring (ignored)" << endl; } else { MIL << "Key " << pubkey_r << " has been removed from RPM trusted keyring" << endl; } } // import the new key RpmArgVec opts; opts.push_back ( "--import" ); opts.push_back ( "--" ); std::string pubkeypath( pubkey_r.path().asString() ); opts.push_back ( pubkeypath.c_str() ); run_rpm( opts, ExternalProgram::Stderr_To_Stdout ); std::string line; std::vector excplines; while ( systemReadLine( line ) ) { if ( str::startsWith( line, "error:" ) ) { WAR << line << endl; excplines.push_back( std::move(line) ); } else DBG << line << endl; } if ( systemStatus() != 0 ) { // Translator: %1% is a gpg public key RpmSubprocessException excp( str::Format(_("Failed to import public key %1%") ) % pubkey_r.asString() ); excp.moveToHistory( excplines ); excp.addHistory( std::move(error_message) ); ZYPP_THROW( excp ); } else { MIL << "Key " << pubkey_r << " imported in rpm trusted keyring." << endl; } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::removePubkey // METHOD TYPE : PMError // void RpmDb::removePubkey( const PublicKey & pubkey_r ) { FAILIFNOTINITIALIZED; // check if the key is in the rpm database and just // return if it does not. std::set rpm_keys = pubkeyEditions(); std::set::const_iterator found_edition = rpm_keys.end(); std::string pubkeyVersion( pubkey_r.gpgPubkeyVersion() ); for_( it, rpm_keys.begin(), rpm_keys.end() ) { if ( (*it).version() == pubkeyVersion ) { found_edition = it; break; } } // the key does not exist, cannot be removed if (found_edition == rpm_keys.end()) { WAR << "Key " << pubkey_r.id() << " is not in rpm db" << endl; return; } std::string rpm_name("gpg-pubkey-" + found_edition->asString()); RpmArgVec opts; opts.push_back ( "-e" ); opts.push_back ( "--" ); opts.push_back ( rpm_name.c_str() ); run_rpm( opts, ExternalProgram::Stderr_To_Stdout ); std::string line; std::vector excplines; while ( systemReadLine( line ) ) { if ( str::startsWith( line, "error:" ) ) { WAR << line << endl; excplines.push_back( std::move(line) ); } else DBG << line << endl; } if ( systemStatus() != 0 ) { // Translator: %1% is a gpg public key RpmSubprocessException excp( str::Format(_("Failed to remove public key %1%") ) % pubkey_r.asString() ); excp.moveToHistory( excplines ); excp.addHistory( std::move(error_message) ); ZYPP_THROW( excp ); } else { MIL << "Key " << pubkey_r << " has been removed from RPM trusted keyring" << endl; } } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::pubkeys // METHOD TYPE : std::set // std::list RpmDb::pubkeys() const { std::list ret; auto it = dbConstIterator(); for ( it.findByName( "gpg-pubkey" ); *it; ++it ) { Edition edition = it->tag_edition(); if (edition != Edition::noedition) { // we export the rpm key into a file RpmHeader::constPtr result; getData( "gpg-pubkey", edition, result ); TmpFile file(getZYpp()->tmpPath()); std::ofstream os; try { os.open(file.path().asString().c_str()); // dump rpm key into the tmp file os << result->tag_description(); //MIL << "-----------------------------------------------" << endl; //MIL << result->tag_description() < RpmDb::pubkeyEditions() const { std::set ret; auto it = dbConstIterator(); for ( it.findByName( "gpg-pubkey" ); *it; ++it ) { Edition edition = it->tag_edition(); if (edition != Edition::noedition) ret.insert( edition ); } return ret; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::fileList // METHOD TYPE : bool // // DESCRIPTION : // std::list RpmDb::fileList( const std::string & name_r, const Edition & edition_r ) const { std::list result; auto it = dbConstIterator(); bool found = false; if (edition_r == Edition::noedition) { found = it.findPackage( name_r ); } else { found = it.findPackage( name_r, edition_r ); } if (!found) return result; return result; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::hasFile // METHOD TYPE : bool // // DESCRIPTION : // bool RpmDb::hasFile( const std::string & file_r, const std::string & name_r ) const { auto it = dbConstIterator(); bool res = false; do { res = it.findByFile( file_r ); if (!res) break; if (!name_r.empty()) { res = (it->tag_name() == name_r); } ++it; } while (res && *it); return res; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::whoOwnsFile // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmDb::whoOwnsFile( const std::string & file_r) const { auto it = dbConstIterator(); if (it.findByFile( file_r )) { return it->tag_name(); } return ""; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::hasProvides // METHOD TYPE : bool // // DESCRIPTION : // bool RpmDb::hasProvides( const std::string & tag_r ) const { auto it = dbConstIterator(); return it.findByProvides( tag_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::hasRequiredBy // METHOD TYPE : bool // // DESCRIPTION : // bool RpmDb::hasRequiredBy( const std::string & tag_r ) const { auto it = dbConstIterator(); return it.findByRequiredBy( tag_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::hasConflicts // METHOD TYPE : bool // // DESCRIPTION : // bool RpmDb::hasConflicts( const std::string & tag_r ) const { auto it = dbConstIterator(); return it.findByConflicts( tag_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::hasPackage // METHOD TYPE : bool // // DESCRIPTION : // bool RpmDb::hasPackage( const std::string & name_r ) const { auto it = dbConstIterator(); return it.findPackage( name_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::hasPackage // METHOD TYPE : bool // // DESCRIPTION : // bool RpmDb::hasPackage( const std::string & name_r, const Edition & ed_r ) const { auto it = dbConstIterator(); return it.findPackage( name_r, ed_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::getData // METHOD TYPE : PMError // // DESCRIPTION : // void RpmDb::getData( const std::string & name_r, RpmHeader::constPtr & result_r ) const { auto it = dbConstIterator(); it.findPackage( name_r ); result_r = *it; #if 0 // if this is needed we need to forcefully close the db of running db_const_iterators if (it.dbError()) ZYPP_THROW(*(it.dbError())); #endif } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::getData // METHOD TYPE : void // // DESCRIPTION : // void RpmDb::getData( const std::string & name_r, const Edition & ed_r, RpmHeader::constPtr & result_r ) const { auto it = dbConstIterator(); it.findPackage( name_r, ed_r ); result_r = *it; #if 0 // if this is needed we need to forcefully close the db of running db_const_iterators if (it.dbError()) ZYPP_THROW(*(it.dbError())); #endif } /////////////////////////////////////////////////////////////////// namespace { struct RpmlogCapture : public std::vector { RpmlogCapture() { rpmlogSetCallback( rpmLogCB, this ); _oldMask = rpmlogSetMask( RPMLOG_UPTO( RPMLOG_PRI(RPMLOG_INFO) ) ); } RpmlogCapture(const RpmlogCapture &) = delete; RpmlogCapture(RpmlogCapture &&) = delete; RpmlogCapture &operator=(const RpmlogCapture &) = delete; RpmlogCapture &operator=(RpmlogCapture &&) = delete; ~RpmlogCapture() { rpmlogSetCallback( nullptr, nullptr ); rpmlogSetMask( _oldMask ); } static int rpmLogCB( rpmlogRec rec_r, rpmlogCallbackData data_r ) { return reinterpret_cast(data_r)->rpmLog( rec_r ); } int rpmLog( rpmlogRec rec_r ) { std::string l { ::rpmlogRecMessage( rec_r ) }; // NL terminated line! l.pop_back(); // strip trailing NL push_back( std::move(l) ); return 0; } private: int _oldMask = 0; }; std::ostream & operator<<( std::ostream & str, const RpmlogCapture & obj ) { char sep = '\0'; for ( const auto & l : obj ) { if ( sep ) str << sep; else sep = '\n'; str << l; } return str; } RpmDb::CheckPackageResult doCheckPackageSig( const Pathname & path_r, // rpm file to check const Pathname & root_r, // target root bool requireGPGSig_r, // whether no gpg signature is to be reported RpmDb::CheckPackageDetail & detail_r ) // detailed result { PathInfo file( path_r ); if ( ! file.isFile() ) { ERR << "Not a file: " << file << endl; return RpmDb::CHK_ERROR; } FD_t fd = ::Fopen( file.asString().c_str(), "r.ufdio" ); if ( fd == 0 || ::Ferror(fd) ) { ERR << "Can't open file for reading: " << file << " (" << ::Fstrerror(fd) << ")" << endl; if ( fd ) ::Fclose( fd ); return RpmDb::CHK_ERROR; } rpmts ts = ::rpmtsCreate(); ::rpmtsSetRootDir( ts, root_r.c_str() ); ::rpmtsSetVSFlags( ts, RPMVSF_DEFAULT ); #ifdef HAVE_RPM_VERIFY_TRANSACTION_STEP ::rpmtsSetVfyFlags( ts, RPMVSF_DEFAULT ); #endif RpmlogCapture vresult; LocaleGuard guard( LC_ALL, "C" ); // bsc#1076415: rpm log output is localized, but we need to parse it :( static rpmQVKArguments_s qva = ([](){ rpmQVKArguments_s qva; memset( &qva, 0, sizeof(rpmQVKArguments_s) ); return qva; })(); int res = ::rpmVerifySignatures( &qva, ts, fd, path_r.basename().c_str() ); guard.restore(); ts = rpmtsFree(ts); ::Fclose( fd ); // Check the individual signature/disgest results: // To.map back known result strings to enum, everything else is CHK_ERROR. typedef std::map ResultMap; static const ResultMap resultMap { { "OK", RpmDb::CHK_OK }, { "NOKEY", RpmDb::CHK_NOKEY }, { "BAD", RpmDb::CHK_FAIL }, { "UNKNOWN", RpmDb::CHK_NOTFOUND }, { "NOTRUSTED", RpmDb::CHK_NOTTRUSTED }, { "NOTFOUND", RpmDb::CHK_NOTFOUND }, }; auto getresult = []( const ResultMap & resultMap, ResultMap::key_type key )->ResultMap::mapped_type { auto it = resultMap.find( key ); return it != resultMap.end() ? it->second : RpmDb::CHK_ERROR; }; // To track the signature states we saw. unsigned count[7] = { 0, 0, 0, 0, 0, 0, 0 }; // To track the kind off sigs we saw. enum Saw { SawNone = 0, SawHeaderSig = (1 << 0), // Header V3 RSA/SHA256 Signature, key ID 3dbdc284: OK SawHeaderDigest = (1 << 1), // Header SHA1 digest: OK (a60386347863affefef484ff1f26c889373eb094) SawPayloadDigest = (1 << 2), // Payload SHA256 digest: OK SawSig = (1 << 3), // V3 RSA/SHA256 Signature, key ID 3dbdc284: OK SawDigest = (1 << 4), // MD5 digest: OK (fd5259fe677a406951dcb2e9d08c4dcc) }; unsigned saw = SawNone; static const str::regex rx( "^ *(Header|Payload)? .*(Signature, key|digest).*: ([A-Z]+)" ); str::smatch what; for ( const std::string & line : vresult ) { if ( line[0] != ' ' ) // result lines are indented continue; RpmDb::CheckPackageResult lineres = RpmDb::CHK_ERROR; if ( str::regex_match( line, what, rx ) ) { lineres = getresult( resultMap, what[3] ); if ( lineres == RpmDb::CHK_NOTFOUND ) continue; // just collect details for signatures found (#229) if ( what[1][0] == 'H' ) { saw |= ( what[2][0] == 'S' ? SawHeaderSig :SawHeaderDigest ); } else if ( what[1][0] == 'P' ) { if ( what[2][0] == 'd' ) saw |= SawPayloadDigest; } else { saw |= ( what[2][0] == 'S' ? SawSig : SawDigest ); } } ++count[lineres]; detail_r.push_back( RpmDb::CheckPackageDetail::value_type( lineres, line ) ); } // Now combine the overall result: RpmDb::CheckPackageResult ret = ( res ? RpmDb::CHK_ERROR : RpmDb::CHK_OK ); if ( count[RpmDb::CHK_FAIL] ) ret = RpmDb::CHK_FAIL; else if ( count[RpmDb::CHK_NOTFOUND] ) ret = RpmDb::CHK_NOTFOUND; else if ( count[RpmDb::CHK_NOKEY] ) ret = RpmDb::CHK_NOKEY; else if ( count[RpmDb::CHK_NOTTRUSTED] ) ret = RpmDb::CHK_NOTTRUSTED; else if ( ret == RpmDb::CHK_OK ) { // Everything is OK, so check whether it's sufficient. // bsc#1184501: To count as signed the package needs a header signature // and either a payload digest (secured by the header sig) or a content signature. bool isSigned = (saw & SawHeaderSig) && ( (saw & SawPayloadDigest) || (saw & SawSig) ); if ( not isSigned ) { std::string message { " " }; if ( not (saw & SawHeaderSig) ) message += _("Package header is not signed!"); else message += _("Package payload is not signed!"); detail_r.push_back( RpmDb::CheckPackageDetail::value_type( RpmDb::CHK_NOSIG, std::move(message) ) ); if ( requireGPGSig_r ) ret = RpmDb::CHK_NOSIG; } } if ( ret != RpmDb::CHK_OK ) { // In case of an error line results may be reported to the user. In case rpm printed // only 8byte key IDs to stdout we try to get longer IDs from the header. bool didReadHeader = false; std::unordered_map< std::string, std::string> fprs; // we replace the data only if the key IDs are actually only 8 bytes str::regex rxexpr( "key ID ([a-fA-F0-9]{8}):" ); for ( auto &detail : detail_r ) { auto &line = detail.second; str::smatch what; if ( str::regex_match( line, what, rxexpr ) ) { if ( !didReadHeader ) { didReadHeader = true; // Get signature info from the package header, RPM always prints only the 8 byte ID auto header = RpmHeader::readPackage( path_r, RpmHeader::NOVERIFY ); if ( header ) { auto keyMgr = zypp::KeyManagerCtx::createForOpenPGP(); const auto &addFprs = [&]( auto tag ){ const auto &list1 = keyMgr.readSignatureFingerprints( header->blob_val( tag ) ); for ( const auto &id : list1 ) { if ( id.size() <= 8 ) continue; const auto &lowerId = str::toLower( id ); fprs.insert( std::make_pair( lowerId.substr( lowerId.size() - 8 ), lowerId ) ); } }; addFprs( RPMTAG_SIGGPG ); addFprs( RPMTAG_SIGPGP ); addFprs( RPMTAG_RSAHEADER ); addFprs( RPMTAG_DSAHEADER ); } else { ERR << "Failed to read package signatures." << std::endl; } } // if we have no keys we can substitute we can leave the loop right away if ( !fprs.size() ) break; { // replace the short key ID with the long ones parsed from the header const auto &keyId = str::toLower( what[1] ); if ( const auto &i = fprs.find( keyId ); i != fprs.end() ) { str::replaceAll( line, keyId, i->second ); } } } } WAR << path_r << " (" << requireGPGSig_r << " -> " << ret << ")" << endl; WAR << vresult << endl; } else DBG << path_r << " [0-Signature is OK]" << endl; return ret; } } // namespace /////////////////////////////////////////////////////////////////// // // METHOD NAME : RpmDb::checkPackage // METHOD TYPE : RpmDb::CheckPackageResult // RpmDb::CheckPackageResult RpmDb::checkPackage( const Pathname & path_r, CheckPackageDetail & detail_r ) { return doCheckPackageSig( path_r, root(), false/*requireGPGSig_r*/, detail_r ); } RpmDb::CheckPackageResult RpmDb::checkPackage( const Pathname & path_r ) { CheckPackageDetail dummy; return checkPackage( path_r, dummy ); } RpmDb::CheckPackageResult RpmDb::checkPackageSignature( const Pathname & path_r, RpmDb::CheckPackageDetail & detail_r ) { return doCheckPackageSig( path_r, root(), true/*requireGPGSig_r*/, detail_r ); } // determine changed files of installed package bool RpmDb::queryChangedFiles(FileList & fileList, const std::string& packageName) { bool ok = true; fileList.clear(); if ( ! initialized() ) return false; RpmArgVec opts; opts.push_back ("-V"); opts.push_back ("--nodeps"); opts.push_back ("--noscripts"); opts.push_back ("--nomd5"); opts.push_back ("--"); opts.push_back (packageName.c_str()); run_rpm (opts, ExternalProgram::Discard_Stderr); if ( process == NULL ) return false; /* from rpm manpage 5 MD5 sum S File size L Symlink T Mtime D Device U User G Group M Mode (includes permissions and file type) */ std::string line; while (systemReadLine(line)) { if (line.length() > 12 && (line[0] == 'S' || line[0] == 's' || (line[0] == '.' && line[7] == 'T'))) { // file has been changed std::string filename; filename.assign(line, 11, line.length() - 11); fileList.insert(filename); } } systemStatus(); // exit code ignored, rpm returns 1 no matter if package is installed or // not return ok; } /****************************************************************/ /* private member-functions */ /****************************************************************/ /*--------------------------------------------------------------*/ /* Run rpm with the specified arguments, handling stderr */ /* as specified by disp */ /*--------------------------------------------------------------*/ void RpmDb::run_rpm (const RpmArgVec& opts, ExternalProgram::Stderr_Disposition disp) { if ( process ) { delete process; process = NULL; } exit_code = -1; if ( ! initialized() ) { ZYPP_THROW(RpmDbNotOpenException()); } RpmArgVec args; // always set root and dbpath #if defined(WORKAROUNDRPMPWDBUG) args.push_back("#/"); // chdir to / to workaround bnc#819354 #endif args.push_back("rpm"); args.push_back("--root"); args.push_back(_root.asString().c_str()); args.push_back("--dbpath"); args.push_back(_dbPath.asString().c_str()); if ( env::ZYPP_RPM_DEBUG() ) args.push_back("-vv"); const char* argv[args.size() + opts.size() + 1]; const char** p = argv; p = copy (args.begin (), args.end (), p); p = copy (opts.begin (), opts.end (), p); *p = 0; #if 0 // if this is needed we need to forcefully close the db of running db_const_iterators // Invalidate all outstanding database handles in case // the database gets modified. librpmDb::dbRelease( true ); #endif // Launch the program with default locale process = new ExternalProgram(argv, disp, false, -1, true); return; } /*--------------------------------------------------------------*/ /* Read a line from the rpm process */ /*--------------------------------------------------------------*/ bool RpmDb::systemReadLine( std::string & line ) { line.erase(); if ( process == NULL ) return false; if ( process->inputFile() ) { process->setBlocking( false ); FILE * inputfile = process->inputFile(); do { // Check every 5 seconds if the process is still running to prevent against // daemons launched in rpm %post that do not close their filedescriptors, // causing us to block for infinity. (bnc#174548) const auto &readResult = io::receiveUpto( inputfile, '\n', 5 * 1000, false ); switch ( readResult.first ) { case io::ReceiveUpToResult::Timeout: { if ( !process->running() ) return false; // we might have received a partial line, lets not forget about it line += readResult.second; break; } case io::ReceiveUpToResult::Error: case io::ReceiveUpToResult::EndOfFile: { line += readResult.second; if ( line.size() && line.back() == '\n') line.pop_back(); return line.size(); // in case of pending output } case io::ReceiveUpToResult::Success: { line += readResult.second; if ( line.size() && line.back() == '\n') line.pop_back(); if ( env::ZYPP_RPM_DEBUG() ) L_DBG("RPM_DEBUG") << line << endl; return true; // complete line } } } while( true ); } return false; } /*--------------------------------------------------------------*/ /* Return the exit status of the rpm process, closing the */ /* connection if not already done */ /*--------------------------------------------------------------*/ int RpmDb::systemStatus() { if ( process == NULL ) return -1; exit_code = process->close(); if (exit_code == 0) error_message = ""; else error_message = process->execError(); process->kill(); delete process; process = 0; // DBG << "exit code " << exit_code << endl; return exit_code; } /*--------------------------------------------------------------*/ /* Forcably kill the rpm process */ /*--------------------------------------------------------------*/ void RpmDb::systemKill() { if (process) process->kill(); } // generate diff mails for config files void RpmDb::processConfigFiles(const std::string& line, const std::string& name, const char* typemsg, const char* difffailmsg, const char* diffgenmsg) { std::string msg = line.substr(9); std::string::size_type pos1 = std::string::npos; std::string::size_type pos2 = std::string::npos; std::string file1s, file2s; Pathname file1; Pathname file2; pos1 = msg.find (typemsg); for (;;) { if ( pos1 == std::string::npos ) break; pos2 = pos1 + strlen (typemsg); if (pos2 >= msg.length() ) break; file1 = msg.substr (0, pos1); file2 = msg.substr (pos2); file1s = file1.asString(); file2s = file2.asString(); if (!_root.empty() && _root != "/") { file1 = _root + file1; file2 = _root + file2; } std::string out; int ret = diffFiles (file1.asString(), file2.asString(), out, 25); if (ret) { Pathname file = _root + WARNINGMAILPATH; if (filesystem::assert_dir(file) != 0) { ERR << "Could not create " << file.asString() << endl; break; } file += Date(Date::now()).form("config_diff_%Y_%m_%d.log"); std::ofstream notify(file.asString().c_str(), std::ios::out|std::ios::app); if (!notify) { ERR << "Could not open " << file << endl; break; } // Translator: %s = name of an rpm package. A list of diffs follows // this message. notify << str::form(_("Changed configuration files for %s:"), name.c_str()) << endl; if (ret>1) { ERR << "diff failed" << endl; notify << str::form(difffailmsg, file1s.c_str(), file2s.c_str()) << endl; } else { notify << str::form(diffgenmsg, file1s.c_str(), file2s.c_str()) << endl; // remove root for the viewer's pleasure (#38240) if (!_root.empty() && _root != "/") { if (out.substr(0,4) == "--- ") { out.replace(4, file1.asString().length(), file1s); } std::string::size_type pos = out.find("\n+++ "); if (pos != std::string::npos) { out.replace(pos+5, file2.asString().length(), file2s); } } notify << out << endl; } notify.close(); notify.open("/var/lib/update-messages/yast2-packagemanager.rpmdb.configfiles"); notify.close(); } else { WAR << "rpm created " << file2 << " but it is not different from " << file2 << endl; } break; } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : RpmDb::installPackage // void RpmDb::installPackage( const Pathname & filename, RpmInstFlags flags ) { installPackage( filename, flags, nullptr ); } void RpmDb::installPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r ) { if ( postTransCollector_r && postTransCollector_r->hasPosttransScript( filename ) ) flags |= rpm::RPMINST_NOPOSTTRANS; // Just set the flag here. In \ref doInstallPackage we collect what else is needed. callback::SendReport report; report->start(filename); do try { doInstallPackage( filename, flags, postTransCollector_r, report ); report->finish(); break; } catch (RpmException & excpt_r) { RpmInstallReport::Action user = report->problem( excpt_r ); if ( user == RpmInstallReport::ABORT ) { report->finish( excpt_r ); ZYPP_RETHROW(excpt_r); } else if ( user == RpmInstallReport::IGNORE ) { break; } } while (true); } void RpmDb::doInstallPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport & report ) { FAILIFNOTINITIALIZED; HistoryLog historylog; MIL << "RpmDb::installPackage(" << filename << "," << flags << ")" << endl; // backup if ( _packagebackups ) { // FIXME report->progress( pd.init( -2, 100 ) ); // allow 1% for backup creation. if ( ! backupPackage( filename ) ) { ERR << "backup of " << filename.asString() << " failed" << endl; } // FIXME status handling report->progress( 0 ); // allow 1% for backup creation. } // run rpm RpmArgVec opts; #if defined(WORKAROUNDDUMPPOSTTRANS_BUG_1216091) if ( postTransCollector_r && _root == "/" ) { #else if ( postTransCollector_r ) { #endif opts.push_back("--define"); // bsc#1041742: Attempt to delay %transfiletrigger(postun|in) execution iff rpm supports it. opts.push_back("_dump_posttrans 1"); // Old rpm ignores the --define, new rpm injects 'dump_posttrans:' lines to collect and execute later. } if (flags & RPMINST_NOUPGRADE) opts.push_back("-i"); else opts.push_back("-U"); opts.push_back("--percent"); opts.push_back("--noglob"); // ZConfig defines cross-arch installation if ( ! ZConfig::instance().systemArchitecture().compatibleWith( ZConfig::instance().defaultSystemArchitecture() ) ) opts.push_back("--ignorearch"); if (flags & RPMINST_NODIGEST) opts.push_back("--nodigest"); if (flags & RPMINST_NOSIGNATURE) opts.push_back("--nosignature"); if (flags & RPMINST_EXCLUDEDOCS) opts.push_back ("--excludedocs"); if (flags & RPMINST_NOSCRIPTS) opts.push_back ("--noscripts"); if (flags & RPMINST_FORCE) opts.push_back ("--force"); if (flags & RPMINST_NODEPS) opts.push_back ("--nodeps"); if (flags & RPMINST_IGNORESIZE) opts.push_back ("--ignoresize"); if (flags & RPMINST_JUSTDB) opts.push_back ("--justdb"); if (flags & RPMINST_TEST) opts.push_back ("--test"); if (flags & RPMINST_NOPOSTTRANS) opts.push_back ("--noposttrans"); opts.push_back("--"); // rpm requires additional quoting of special chars: std::string quotedFilename( rpmQuoteFilename( workaroundRpmPwdBug( filename ) ) ); opts.push_back ( quotedFilename.c_str() ); run_rpm( opts, ExternalProgram::Stderr_To_Stdout ); // forward additional rpm output via report; std::string line; unsigned lineno = 0; callback::UserData cmdout( InstallResolvableReport::contentRpmout ); // Key "solvable" injected by RpmInstallPackageReceiver cmdout.set( "line", std::cref(line) ); cmdout.set( "lineno", lineno ); // LEGACY: collect and forward additional rpm output in finish std::string rpmmsg; std::vector configwarnings; // TODO: immediately process lines rather than collecting std::vector runposttrans; // bsc#1041742: If rpm supports --runposttrans it injects 'dump_posttrans:' lines we do collect while ( systemReadLine( line ) ) { if ( str::startsWith( line, "%%" ) ) { int percent = 0; sscanf( line.c_str() + 2, "%d", &percent ); report->progress( percent ); continue; } if ( str::hasPrefix( line, "dump_posttrans:" ) ) { runposttrans.push_back( line ); continue; } ++lineno; cmdout.set( "lineno", lineno ); report->report( cmdout ); if ( lineno >= MAXRPMMESSAGELINES ) { if ( line.find( " scriptlet failed, " ) == std::string::npos ) // always log %script errors continue; } rpmmsg += line+'\n'; if ( str::startsWith( line, "warning:" ) ) configwarnings.push_back(line); } if ( lineno >= MAXRPMMESSAGELINES ) rpmmsg += "[truncated]\n"; int rpm_status = systemStatus(); if ( postTransCollector_r && rpm_status == 0 ) { // Before doing anything else, handle any pending %posttrans script or dump_posttrans lines. postTransCollector_r->collectPosttransInfo( filename, runposttrans ); } // evaluate result for (std::vector::iterator it = configwarnings.begin(); it != configwarnings.end(); ++it) { processConfigFiles(*it, Pathname::basename(filename), " saved as ", // %s = filenames _("rpm saved %s as %s, but it was impossible to determine the difference"), // %s = filenames _("rpm saved %s as %s.\nHere are the first 25 lines of difference:\n")); processConfigFiles(*it, Pathname::basename(filename), " created as ", // %s = filenames _("rpm created %s as %s, but it was impossible to determine the difference"), // %s = filenames _("rpm created %s as %s.\nHere are the first 25 lines of difference:\n")); } if ( rpm_status != 0 ) { historylog.comment( str::form("%s install failed", Pathname::basename(filename).c_str()), true /*timestamp*/); std::ostringstream sstr; sstr << "rpm output:" << endl << rpmmsg << endl; historylog.comment(sstr.str()); // TranslatorExplanation the colon is followed by an error message auto excpt { RpmSubprocessException(_("RPM failed: ") + error_message ) }; if ( not rpmmsg.empty() ) excpt.addHistory( rpmmsg ); ZYPP_THROW(excpt); } else if ( ! rpmmsg.empty() ) { historylog.comment( str::form("%s installed ok", Pathname::basename(filename).c_str()), true /*timestamp*/); std::ostringstream sstr; sstr << "Additional rpm output:" << endl << rpmmsg << endl; historylog.comment(sstr.str()); // report additional rpm output in finish (LEGACY! Lines are immediately reported as InstallResolvableReport::contentRpmout) // TranslatorExplanation Text is followed by a ':' and the actual output. report->finishInfo(str::form( "%s:\n%s\n", _("Additional rpm output"), rpmmsg.c_str() )); } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : RpmDb::removePackage // void RpmDb::removePackage( Package::constPtr package, RpmInstFlags flags ) { removePackage( std::move(package), flags, nullptr ); } void RpmDb::removePackage( const std::string & name_r, RpmInstFlags flags ) { removePackage( name_r, flags, nullptr ); } void RpmDb::removePackage( const Package::constPtr& package, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r ) { // 'rpm -e' does not like epochs removePackage( package->name() + "-" + package->edition().version() + "-" + package->edition().release() + "." + package->arch().asString(), flags, postTransCollector_r ); } void RpmDb::removePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r ) { callback::SendReport report; report->start( name_r ); do try { doRemovePackage( name_r, flags, postTransCollector_r, report ); report->finish(); break; } catch (RpmException & excpt_r) { RpmRemoveReport::Action user = report->problem( excpt_r ); if ( user == RpmRemoveReport::ABORT ) { report->finish( excpt_r ); ZYPP_RETHROW(excpt_r); } else if ( user == RpmRemoveReport::IGNORE ) { break; } } while (true); } void RpmDb::doRemovePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport & report ) { FAILIFNOTINITIALIZED; HistoryLog historylog; MIL << "RpmDb::doRemovePackage(" << name_r << "," << flags << ")" << endl; // backup if ( _packagebackups ) { // FIXME solve this status report somehow // report->progress( pd.init( -2, 100 ) ); // allow 1% for backup creation. if ( ! backupPackage( name_r ) ) { ERR << "backup of " << name_r << " failed" << endl; } report->progress( 0 ); } else { report->progress( 100 ); } // run rpm RpmArgVec opts; #if defined(WORKAROUNDDUMPPOSTTRANS_BUG_1216091) if ( postTransCollector_r && _root == "/" ) { #else if ( postTransCollector_r ) { #endif opts.push_back("--define"); // bsc#1041742: Attempt to delay %transfiletrigger(postun|in) execution iff rpm supports it. opts.push_back("_dump_posttrans 1"); // Old rpm ignores the --define, new rpm injects 'dump_posttrans:' lines to collect and execute later. } opts.push_back("-e"); opts.push_back("--allmatches"); if (flags & RPMINST_NOSCRIPTS) opts.push_back("--noscripts"); if (flags & RPMINST_NODEPS) opts.push_back("--nodeps"); if (flags & RPMINST_JUSTDB) opts.push_back("--justdb"); if (flags & RPMINST_TEST) opts.push_back ("--test"); if (flags & RPMINST_FORCE) { WAR << "IGNORE OPTION: 'rpm -e' does not support '--force'" << endl; } opts.push_back("--"); opts.push_back(name_r.c_str()); run_rpm (opts, ExternalProgram::Stderr_To_Stdout); // forward additional rpm output via report; std::string line; unsigned lineno = 0; callback::UserData cmdout( RemoveResolvableReport::contentRpmout ); // Key "solvable" injected by RpmInstallPackageReceiver cmdout.set( "line", std::cref(line) ); cmdout.set( "lineno", lineno ); // LEGACY: collect and forward additional rpm output in finish std::string rpmmsg; std::vector runposttrans; // bsc#1041742: If rpm supports --runposttrans it injects 'dump_posttrans:' lines we do collect // got no progress from command, so we fake it: // 5 - command started // 50 - command completed // 100 if no error report->progress( 5 ); while (systemReadLine(line)) { if ( str::hasPrefix( line, "dump_posttrans:" ) ) { runposttrans.push_back( line ); continue; } ++lineno; cmdout.set( "lineno", lineno ); report->report( cmdout ); if ( lineno >= MAXRPMMESSAGELINES ) { if ( line.find( " scriptlet failed, " ) == std::string::npos ) // always log %script errors continue; } rpmmsg += line+'\n'; } if ( lineno >= MAXRPMMESSAGELINES ) rpmmsg += "[truncated]\n"; report->progress( 50 ); int rpm_status = systemStatus(); if ( postTransCollector_r && rpm_status == 0 ) { // Before doing anything else, handle any pending %posttrans script or dump_posttrans lines. // 'remove' does not trigger %posttrans, but it may trigger %transfiletriggers. postTransCollector_r->collectPosttransInfo( runposttrans ); } if ( rpm_status != 0 ) { historylog.comment( str::form("%s remove failed", name_r.c_str()), true /*timestamp*/); std::ostringstream sstr; sstr << "rpm output:" << endl << rpmmsg << endl; historylog.comment(sstr.str()); // TranslatorExplanation the colon is followed by an error message auto excpt { RpmSubprocessException(_("RPM failed: ") + error_message ) }; if ( not rpmmsg.empty() ) excpt.addHistory( rpmmsg ); ZYPP_THROW(excpt); } else if ( ! rpmmsg.empty() ) { historylog.comment( str::form("%s removed ok", name_r.c_str()), true /*timestamp*/); std::ostringstream sstr; sstr << "Additional rpm output:" << endl << rpmmsg << endl; historylog.comment(sstr.str()); // report additional rpm output in finish (LEGACY! Lines are immediately reported as RemoveResolvableReport::contentRpmout) // TranslatorExplanation Text is followed by a ':' and the actual output. report->finishInfo(str::form( "%s:\n%s\n", _("Additional rpm output"), rpmmsg.c_str() )); } } /////////////////////////////////////////////////////////////////// // // METHOD NAME : RpmDb::runposttrans // int RpmDb::runposttrans( const Pathname & filename_r, const std::function& output_r ) { FAILIFNOTINITIALIZED; HistoryLog historylog; MIL << "RpmDb::runposttrans(" << filename_r << ")" << endl; RpmArgVec opts; opts.push_back("-vv"); // want vverbose output to see scriptlet execution in the log opts.push_back("--runposttrans"); opts.push_back(filename_r.c_str()); run_rpm (opts, ExternalProgram::Stderr_To_Stdout); // Tailored to suit RpmPostTransCollector. // It's a pity, but we need all those verbose debug lines just // to figure out which script is currently executed. Otherwise we // can't tell which output belongs to which script. static const str::regex rx( "^D: (%.*): scriptlet start$" ); str::smatch what; std::string line; bool silent = true; // discard everything before 1st scriptlet while ( systemReadLine(line) ) { if ( not output_r ) continue; if ( str::startsWith( line, "D:" ) ) { // rpm debug output if ( str::regex_match( line, what, rx ) ) { // forward ripoff header output_r( "RIPOFF:"+what[1] ); if ( silent ) silent = false; } continue; } if ( silent ) { continue; } if ( str::startsWith( line, "+ " ) ) { // shell -x debug output continue; } // forward output line output_r( line ); } int rpm_status = systemStatus(); if ( rpm_status != 0 ) { WAR << "rpm --runposttrans returned " << rpm_status << endl; } return rpm_status; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::backupPackage // METHOD TYPE : bool // bool RpmDb::backupPackage( const Pathname & filename ) { RpmHeader::constPtr h( RpmHeader::readPackage( filename, RpmHeader::NOSIGNATURE ) ); if ( ! h ) return false; return backupPackage( h->tag_name() ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmDb::backupPackage // METHOD TYPE : bool // bool RpmDb::backupPackage(const std::string& packageName) { HistoryLog progresslog; bool ret = true; Pathname backupFilename; Pathname filestobackupfile = _root+_backuppath+FILEFORBACKUPFILES; if (_backuppath.empty()) { INT << "_backuppath empty" << endl; return false; } FileList fileList; if (!queryChangedFiles(fileList, packageName)) { ERR << "Error while getting changed files for package " << packageName << endl; return false; } if (fileList.size() <= 0) { DBG << "package " << packageName << " not changed -> no backup" << endl; return true; } if (filesystem::assert_dir(_root + _backuppath) != 0) { return false; } { // build up archive name time_t currentTime = time(0); struct tm *currentLocalTime = localtime(¤tTime); int date = (currentLocalTime->tm_year + 1900) * 10000 + (currentLocalTime->tm_mon + 1) * 100 + currentLocalTime->tm_mday; int num = 0; do { backupFilename = _root + _backuppath + str::form("%s-%d-%d.tar.gz",packageName.c_str(), date, num); } while ( PathInfo(backupFilename).isExist() && num++ < 1000); PathInfo pi(filestobackupfile); if (pi.isExist() && !pi.isFile()) { ERR << filestobackupfile.asString() << " already exists and is no file" << endl; return false; } std::ofstream fp ( filestobackupfile.asString().c_str(), std::ios::out|std::ios::trunc ); if (!fp) { ERR << "could not open " << filestobackupfile.asString() << endl; return false; } for (FileList::const_iterator cit = fileList.begin(); cit != fileList.end(); ++cit) { std::string name = *cit; if ( name[0] == '/' ) { // remove slash, file must be relative to -C parameter of tar name = name.substr( 1 ); } DBG << "saving file "<< name << endl; fp << name << endl; } fp.close(); const char* const argv[] = { "tar", "-czhP", "-C", _root.asString().c_str(), "--ignore-failed-read", "-f", backupFilename.asString().c_str(), "-T", filestobackupfile.asString().c_str(), NULL }; // execute tar in inst-sys (we dont know if there is a tar below _root !) ExternalProgram tar(argv, ExternalProgram::Stderr_To_Stdout, false, -1, true); std::string tarmsg; // TODO: it is probably possible to start tar with -v and watch it adding // files to report progress for (std::string output = tar.receiveLine(); output.length() ;output = tar.receiveLine()) { tarmsg+=output; } int ret = tar.close(); if ( ret != 0) { ERR << "tar failed: " << tarmsg << endl; ret = false; } else { MIL << "tar backup ok" << endl; progresslog.comment( str::form(_("created backup %s"), backupFilename.asString().c_str()) , /*timestamp*/true); } filesystem::unlink(filestobackupfile); } return ret; } void RpmDb::setBackupPath(const Pathname& path) { _backuppath = path; } std::ostream & operator<<( std::ostream & str, RpmDb::CheckPackageResult obj ) { switch ( obj ) { #define OUTS(E,S) case RpmDb::E: return str << "["<< (unsigned)obj << "-"<< S << "]"; break // translators: possible rpm package signature check result [brief] OUTS( CHK_OK, _("Signature is OK") ); // translators: possible rpm package signature check result [brief] OUTS( CHK_NOTFOUND, _("Unknown type of signature") ); // translators: possible rpm package signature check result [brief] OUTS( CHK_FAIL, _("Signature does not verify") ); // translators: possible rpm package signature check result [brief] OUTS( CHK_NOTTRUSTED, _("Signature is OK, but key is not trusted") ); // translators: possible rpm package signature check result [brief] OUTS( CHK_NOKEY, _("Signatures public key is not available") ); // translators: possible rpm package signature check result [brief] OUTS( CHK_ERROR, _("File does not exist or signature can't be checked") ); // translators: possible rpm package signature check result [brief] OUTS( CHK_NOSIG, _("File is unsigned") ); #undef OUTS } return str << "UnknowSignatureCheckError("+str::numstring(obj)+")"; } std::ostream & operator<<( std::ostream & str, const RpmDb::CheckPackageDetail & obj ) { for ( const auto & el : obj ) str << el.second << endl; return str; } } // namespace rpm } // namespace target } // namespace zypp libzypp-17.36.5/zypp/target/rpm/RpmDb.h000066400000000000000000000360641476576476200176720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmDb.h * */ // -*- C++ -*- #ifndef ZYPP_TARGET_RPM_RPMDB_H #define ZYPP_TARGET_RPM_RPMDB_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace zypp { namespace target { class RpmPostTransCollector; namespace rpm { /////////////////////////////////////////////////////////////////// // // CLASS NAME : RpmDb /** * @short Interface to the rpm program **/ class ZYPP_API RpmDb : public base::ReferenceCounted, private base::NonCopyable { public: /** * Default error class **/ using Error = class InstTargetError; /** Wrapper providing a \ref librpmDb::db_const_iterator for this \ref RpmDb. * Provide a properly initialized iterator while RpmDb is initialized. * Otherwise a null iterator. * \see \ref RpmDb::dbConstIterator. */ struct db_const_iterator : public librpmDb::db_const_iterator { private: friend class RpmDb; db_const_iterator() : librpmDb::db_const_iterator { nullptr } {} db_const_iterator( const Pathname & root_r, const Pathname & dbPath_r ) : librpmDb::db_const_iterator { root_r, dbPath_r } {} }; /////////////////////////////////////////////////////////////////// // // INITALISATION // /////////////////////////////////////////////////////////////////// private: /** * Root directory for all operations. **/ Pathname _root; /** * Directory that contains the rpmdb. **/ Pathname _dbPath; public: /** * Constructor. There's no rpmdb access until @ref initDatabase * was called. **/ RpmDb(); /** * Destructor. **/ ~RpmDb() override; /** * @return Root directory for all operations (empty if not initialized). **/ const Pathname & root() const { return _root; } /** * @return Directory that contains the rpmdb (empty if not initialized). **/ const Pathname & dbPath() const { return _dbPath; } /** * @return Whether we are initialized. **/ bool initialized() const { return( ! _root.empty() ); } /** * \return db_const_iterator for this rpmdb (empty if not initialized) */ db_const_iterator dbConstIterator() const; /** * Prepare access to the rpm database below \a root_r. * * An optional argument denotes the root directory for all operations. If * an empty Pathname is given the default (\c/) is used. * * Calling initDatabase a second time with different arguments will return * an error but leave the database in its original state. * * If the database already exists and \c doRebuild_r is true, * \ref rebuildDatabase is called. * * \throws RpmException **/ void initDatabase( Pathname root_r = Pathname(), bool doRebuild_r = false ); /** * Block further access to the rpm database and go back to uninitialized * state. On update: Decides what to do with any converted database * (see @ref initDatabase). * * \throws RpmException * **/ void closeDatabase(); /** * Rebuild the rpm database (rpm --rebuilddb). * * \throws RpmException * **/ void rebuildDatabase(); /** * Import ascii armored public key in file pubkey_r. * * \throws RpmException * **/ void importPubkey( const PublicKey & pubkey_r ); /** * Remove a public key from the rpm database * * \throws RpmException * **/ void removePubkey( const PublicKey & pubkey_r ); /** * Return the long ids of all installed public keys. **/ std::list pubkeys() const; /** * Return the edition of all installed public keys. **/ std::set pubkeyEditions() const; /////////////////////////////////////////////////////////////////// // // Direct RPM database retrieval via librpm. // /////////////////////////////////////////////////////////////////// public: /** * return complete file list for installed package name_r (in FileInfo.filename) * if edition_r != Edition::noedition, check for exact edition * if full==true, fill all attributes of FileInfo **/ std::list fileList( const std::string & name_r, const Edition & edition_r ) const; /** * Return true if at least one package owns a certain file (name_r empty) * Return true if package name_r owns file file_r (name_r nonempty). **/ bool hasFile( const std::string & file_r, const std::string & name_r = "" ) const; /** * Return name of package owning file * or empty string if no installed package owns file **/ std::string whoOwnsFile( const std::string & file_r ) const; /** * Return true if at least one package provides a certain tag. **/ bool hasProvides( const std::string & tag_r ) const; /** * Return true if at least one package requires a certain tag. **/ bool hasRequiredBy( const std::string & tag_r ) const; /** * Return true if at least one package conflicts with a certain tag. **/ bool hasConflicts( const std::string & tag_r ) const; /** * Return true if package is installed. **/ bool hasPackage( const std::string & name_r ) const; /** * Return true if package is installed in a certain edition. **/ bool hasPackage( const std::string & name_r, const Edition & ed_r ) const; /** * Get an installed packages data from rpmdb. Package is * identified by name. Data returned via result are NULL, * if packge is not installed (PMError is not set), or RPM database * could not be read (PMError is set). * * \throws RpmException * * FIXME this and following comment * **/ void getData( const std::string & name_r, RpmHeader::constPtr & result_r ) const; /** * Get an installed packages data from rpmdb. Package is * identified by name and edition. Data returned via result are NULL, * if packge is not installed (PMError is not set), or RPM database * could not be read (PMError is set). * * \throws RpmException * **/ void getData( const std::string & name_r, const Edition & ed_r, RpmHeader::constPtr & result_r ) const; /////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////// public: /** Sync mode for \ref syncTrustedKeys */ enum SyncTrustedKeyBits { SYNC_TO_KEYRING = 1<<0, //!< export rpm trusted keys into zypp trusted keyring SYNC_FROM_KEYRING = 1<<1, //!< import zypp trusted keys into rpm database. SYNC_BOTH = SYNC_TO_KEYRING | SYNC_FROM_KEYRING }; /** * Sync trusted keys stored in rpm database and zypp trusted keyring. */ void syncTrustedKeys( SyncTrustedKeyBits mode_r = SYNC_BOTH ); /** * iterates through zypp keyring and import all non-existent keys * into rpm keyring */ void importZyppKeyRingTrustedKeys(); /** * insert all rpm trusted keys into zypp trusted keyring */ void exportTrustedKeysInZyppKeyRing(); private: /** * The connection to the rpm process. */ ExternalProgram *process; using RpmArgVec = std::vector; /** * Run rpm with the specified arguments and handle stderr. * @param n_opts The number of arguments * @param options Array of the arguments, @ref n_opts elements * @param stderr_disp How to handle stderr, merged with stdout by default * * \throws RpmException * **/ void run_rpm( const RpmArgVec& options, ExternalProgram::Stderr_Disposition stderr_disp = ExternalProgram::Stderr_To_Stdout); /** * Read a line from the general rpm query */ bool systemReadLine(std::string &line); /** * Return the exit status of the general rpm process, * closing the connection if not already done. */ int systemStatus(); /** * Forcably kill the system process */ void systemKill(); /** * The exit code of the rpm process, or -1 if not yet known. */ int exit_code; /** * Error message from running rpm as external program. * Use only if something fail. */ std::string error_message; /** /var/adm/backup */ Pathname _backuppath; /** create package backups? */ bool _packagebackups; /** * handle rpm messages like "/etc/testrc saved as /etc/testrc.rpmorig" * * @param line rpm output starting with warning: * @param name name of package, appears in subject line * @param typemsg " saved as " or " created as " * @param difffailmsg what to put into mail if diff failed, must contain two %s for the two files * @param diffgenmsg what to put into mail if diff succeeded, must contain two %s for the two files * */ void processConfigFiles(const std::string& line, const std::string& name, const char* typemsg, const char* difffailmsg, const char* diffgenmsg); public: using FileList = std::set; /** * checkPackage result * @see checkPackage * */ enum CheckPackageResult { CHK_OK = 0, /*!< Signature is OK. */ CHK_NOTFOUND = 1, /*!< Signature is unknown type. */ CHK_FAIL = 2, /*!< Signature does not verify. */ CHK_NOTTRUSTED = 3, /*!< Signature is OK, but key is not trusted. */ CHK_NOKEY = 4, /*!< Public key is unavailable. */ CHK_ERROR = 5, /*!< File does not exist or can't be opened. */ CHK_NOSIG = 6, /*!< File has no gpg signature (only digests). */ }; /** Detailed rpm signature check log messages * A single multiline message if \ref CHK_OK. Otherwise, each message line * together with its \ref CheckPackageResult. */ struct CheckPackageDetail : std::vector> {}; /** * Check signature of rpm file on disk (legacy version returning CHK_OK if file is unsigned, like 'rpm -K') * * @param path_r which file to check * @param detail_r Return detailed rpm log messages * * @return CheckPackageResult (CHK_OK if file is unsigned) * * \see also \ref checkPackageSignature */ CheckPackageResult checkPackage( const Pathname & path_r, CheckPackageDetail & detail_r ); /** \overload Ignoring the \a details_r */ CheckPackageResult checkPackage( const Pathname & path_r ); /** * Check signature of rpm file on disk (strict check returning CHK_NOSIG if file is unsigned). * * @param path_r which file to check * @param detail_r Return detailed rpm log messages * * @return CheckPackageResult (CHK_NOSIG if file is unsigned) * * \see also \ref checkPackage */ CheckPackageResult checkPackageSignature( const Pathname & path_r, CheckPackageDetail & detail_r ); /** install rpm package * * @param filename file to install * @param flags which rpm options to use * * @return success * * \throws RpmException * * */ void installPackage ( const Pathname & filename, RpmInstFlags flags = RPMINST_NONE ); /** \overload For delayed %posttrans %transfiletrigger(postun|in) execution if driven by Target::commit. */ void installPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r ); /** remove rpm package * * @param name_r Name of the rpm package to remove. * @param iflags which rpm options to use * * @return success * * \throws RpmException * * */ void removePackage( const std::string & name_r, RpmInstFlags flags = RPMINST_NONE ); void removePackage( Package::constPtr package, RpmInstFlags flags = RPMINST_NONE ); /** \overload For delayed %posttrans %transfiletrigger(postun|in) execution if driven by Target::commit. */ void removePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r ); void removePackage( const Package::constPtr& package, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r ); /** Run collected %posttrans and %transfiletrigger(postun|in) if `rpm --runposttrans` is supported. * Output-function receives a "RIPOFF:%scriptident(packageident)" line for every script * that is executed followed by lines the script outputs to stout/stderr. */ int runposttrans( const Pathname & filename_r, const std::function& output_r ); /** * get backup dir for rpm config files * * */ Pathname getBackupPath (void) { return _backuppath; } /** * create tar.gz of all changed files in a Package * * @param packageName name of the Package to backup * * @see setBackupPath * */ bool backupPackage(const std::string& packageName); /** * queries file for name and then calls above backupPackage * function. For convenience. * * @param filename rpm file that is about to be installed * */ bool backupPackage(const Pathname& filename); /** * set path where package backups are stored * * @see backupPackage * */ void setBackupPath(const Pathname& path); /** * whether to create package backups during install or * removal * * @param yes true or false * */ void createPackageBackups(bool yes) { _packagebackups = yes; } /** * determine which files of an installed package have been * modified. * * @param fileList (output) where to store modified files * @param packageName name of package to query * * @return false if package couln't be queried for some * reason * */ bool queryChangedFiles(FileList & fileList, const std::string& packageName); public: /** * Dump debug info. **/ std::ostream & dumpOn( std::ostream & str ) const override; protected: void doRemovePackage( const std::string & name_r, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport & report ); void doInstallPackage( const Pathname & filename, RpmInstFlags flags, RpmPostTransCollector* postTransCollector_r, callback::SendReport & report ); void doRebuildDatabase(callback::SendReport & report); }; /** \relates RpmDb::CheckPackageResult Stream output */ std::ostream & operator<<( std::ostream & str, RpmDb::CheckPackageResult obj ) ZYPP_API; /** \relates RpmDb::checkPackageDetail Stream output */ std::ostream & operator<<( std::ostream & str, const RpmDb::CheckPackageDetail & obj ) ZYPP_API; } // namespace rpm } // namespace target } // namespace zypp #endif // ZYPP_TARGET_RPM_RPMDB_H libzypp-17.36.5/zypp/target/rpm/RpmException.cc000066400000000000000000000052731476576476200214370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmException.cc * */ #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// namespace rpm { ///////////////////////////////////////////////////////////////// std::ostream & RpmInvalidRootException::dumpOn( std::ostream & str ) const { return str << "Illegal root " << _root << " or dbPath " << _dbpath; } std::ostream & RpmAccessBlockedException::dumpOn( std::ostream & str ) const { return str << "Access is blocked: Root: " << _root << " dbPath: " << _dbpath; } std::ostream & RpmSubprocessException::dumpOn( std::ostream & str ) const { return str << "Subprocess failed. Error: " << _errmsg; } std::ostream & RpmInitException::dumpOn( std::ostream & str) const { return str << "Failed to initialize database: Root: " << _root << " dbPath: " << _dbpath; } std::ostream & RpmDbOpenException::dumpOn( std::ostream & str) const { return str << "Failed to open database: Root: " << _root << " dbPath: " << _dbpath; } std::ostream & RpmDbAlreadyOpenException::dumpOn( std::ostream & str) const { return str << "Can't switch to " << _new_root << " " << _new_dbpath << " while accessing " << _old_root << " " << _old_dbpath; } std::ostream & RpmDbNotOpenException::dumpOn( std::ostream & str) const { return str << "RPM database not open"; } std::ostream & RpmDbConvertException::dumpOn( std::ostream & str) const { return str << "RPM database conversion failed"; } std::ostream & RpmNullDatabaseException::dumpOn( std::ostream & str) const { return str << "NULL rpmV4 database passed as argument!"; } std::ostream &RpmTransactionFailedException::dumpOn(std::ostream &str) const { return str << _errmsg; } ///////////////////////////////////////////////////////////////// } // namespace rpm } // namespace target } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/target/rpm/RpmException.h000066400000000000000000000146511476576476200213010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmException.h * */ #ifndef ZYPP_TARGET_RPM_RPMEXCEPTION_H #define ZYPP_TARGET_RPM_RPMEXCEPTION_H #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace target { /////////////////////////////////////////////////////////////// namespace rpm { /////////////////////////////////////////////////////////////// // // CLASS NAME : RpmException /** Just inherits Exception to separate media exceptions * **/ class ZYPP_API RpmException : public Exception { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ RpmException() : Exception( "Rpm Exception" ) {} /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ RpmException( const std::string & msg_r ) : Exception( msg_r ) {} /** Dtor. */ ~RpmException() throw() override {}; }; class ZYPP_API GlobalRpmInitException : public RpmException { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ GlobalRpmInitException() : RpmException("Global RPM initialization failed") {} /** Dtor. */ ~GlobalRpmInitException() throw() override {}; private: }; class ZYPP_API RpmInvalidRootException : public RpmException { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ RpmInvalidRootException( const Pathname & root_r, const Pathname & dbpath_r ) : RpmException() , _root(root_r.asString()) , _dbpath(dbpath_r.asString()) {} /** Dtor. */ ~RpmInvalidRootException() throw() override {}; std::string root() const { return _root; } std::string dbpath() const { return _dbpath; } protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _root; std::string _dbpath; }; class ZYPP_API RpmAccessBlockedException : public RpmException { public: RpmAccessBlockedException( const Pathname & root_r, const Pathname & dbpath_r ) : RpmException() , _root(root_r.asString()) , _dbpath(dbpath_r.asString()) {} ~RpmAccessBlockedException() throw() override {}; std::string root() const { return _root; } std::string dbpath() const { return _dbpath; } protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _root; std::string _dbpath; }; class ZYPP_API RpmSubprocessException : public RpmException { public: RpmSubprocessException(std::string errmsg_r) : RpmException() , _errmsg(std::move(errmsg_r)) {} ~RpmSubprocessException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _errmsg; }; class ZYPP_API RpmInitException : public RpmException { public: RpmInitException(const Pathname & root_r, const Pathname & dbpath_r) : RpmException() , _root(root_r.asString()) , _dbpath(dbpath_r.asString()) {} ~RpmInitException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _root; std::string _dbpath; }; class ZYPP_API RpmDbOpenException : public RpmException { public: RpmDbOpenException(const Pathname & root_r, const Pathname & dbpath_r) : RpmException() , _root(root_r.asString()) , _dbpath(dbpath_r.asString()) {} ~RpmDbOpenException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _root; std::string _dbpath; }; class ZYPP_API RpmDbAlreadyOpenException : public RpmException { public: RpmDbAlreadyOpenException(const Pathname & old_root_r, const Pathname & old_dbpath_r, const Pathname & new_root_r, const Pathname & new_dbpath_r) : RpmException() , _old_root(old_root_r.asString()) , _old_dbpath(old_dbpath_r.asString()) , _new_root(new_root_r.asString()) , _new_dbpath(new_dbpath_r.asString()) {} ~RpmDbAlreadyOpenException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _old_root; std::string _old_dbpath; std::string _new_root; std::string _new_dbpath; }; class ZYPP_API RpmDbNotOpenException : public RpmException { public: RpmDbNotOpenException() : RpmException() {} ~RpmDbNotOpenException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: }; class ZYPP_API RpmDbConvertException : public RpmException { public: RpmDbConvertException() : RpmException() {} ~RpmDbConvertException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: }; class ZYPP_API RpmNullDatabaseException : public RpmException { public: RpmNullDatabaseException() : RpmException() {} ~RpmNullDatabaseException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: }; class ZYPP_API RpmTransactionFailedException : public RpmException { public: RpmTransactionFailedException(std::string errmsg_r) : RpmException() , _errmsg(std::move(errmsg_r)) {} ~RpmTransactionFailedException() throw() override {}; protected: std::ostream & dumpOn( std::ostream & str ) const override; private: std::string _errmsg; }; ///////////////////////////////////////////////////////////////// } // namespace rpm } // namespace target } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_RPM_RPMEXCEPTION_H libzypp-17.36.5/zypp/target/rpm/RpmFlags.h000066400000000000000000000053621476576476200203760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmFlags.h * */ #ifndef ZYPP_TARGET_RPM_RPMFLAGS_H #define ZYPP_TARGET_RPM_RPMFLAGS_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace target { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace rpm { ///////////////////////////////////////////////////////////////// /** * Bits representing rpm installation options. * * Use \ref RpmInstFlags as a type-safe way of * storing OR-combinations. * * @see RpmDb::installPackage(), RpmDb::removePackage(), */ enum RpmInstFlag { RPMINST_NONE = 0x0000, RPMINST_EXCLUDEDOCS = 0x0001, RPMINST_NOSCRIPTS = 0x0002, RPMINST_FORCE = 0x0004, RPMINST_NODEPS = 0x0008, RPMINST_IGNORESIZE = 0x0010, RPMINST_JUSTDB = 0x0020, RPMINST_NODIGEST = 0x0040, RPMINST_NOSIGNATURE = 0x0080, RPMINST_NOUPGRADE = 0x0100, RPMINST_TEST = 0x0200, RPMINST_NOPOSTTRANS = 0x0400, RPMINST_ALLOWDOWNGRADE = 0x0800, RPMINST_REPLACEFILES = 0x1000, RPMINST_ALLOWUNTRUSTED = 0x2000, }; /** \relates RpmInstFlag Type-safe way of storing OR-combinations. */ ZYPP_DECLARE_FLAGS_AND_OPERATORS( RpmInstFlags, RpmInstFlag ); ///////////////////////////////////////////////////////////////// } // namespace rpm /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace target /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_TARGET_RPM_RPMFLAGS_H libzypp-17.36.5/zypp/target/rpm/RpmHeader.cc000066400000000000000000000631601476576476200206700ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmHeader.cc * */ #include "librpm.h" #include #include //////////////////////////////////////////////////////////////////// // unameToUid and gnameToGid are shamelessly stolen from rpm-4.4. // (rpmio/ugid.c) Those functions were dropped in RPM_4_7 extern "C" { #include #include } /* unameToUid(), uidTouname() and the group variants are really poorly implemented. They really ought to use hash tables. I just made the guess that most files would be owned by root or the same person/group who owned the last file. Those two values are cached, everything else is looked up via getpw() and getgr() functions. If this performs too poorly I'll have to implement it properly :-( */ int unameToUid(const char * thisUname, uid_t * uid) { /*@only@*/ static char * lastUname = NULL; static size_t lastUnameLen = 0; static size_t lastUnameAlloced; static uid_t lastUid; struct passwd * pwent = nullptr; size_t thisUnameLen = 0; if (!thisUname) { lastUnameLen = 0; return -1; } else if (strcmp(thisUname, "root") == 0) { /*@-boundswrite@*/ *uid = 0; /*@=boundswrite@*/ return 0; } thisUnameLen = strlen(thisUname); if (lastUname == NULL || thisUnameLen != lastUnameLen || strcmp(thisUname, lastUname) != 0) { if (lastUnameAlloced < thisUnameLen + 1) { lastUnameAlloced = thisUnameLen + 10; lastUname = (char *)realloc(lastUname, lastUnameAlloced); /* XXX memory leak */ } /*@-boundswrite@*/ strcpy(lastUname, thisUname); /*@=boundswrite@*/ pwent = getpwnam(thisUname); if (pwent == NULL) { /*@-internalglobs@*/ /* FIX: shrug */ endpwent(); /*@=internalglobs@*/ pwent = getpwnam(thisUname); if (pwent == NULL) return -1; } lastUid = pwent->pw_uid; } /*@-boundswrite@*/ *uid = lastUid; /*@=boundswrite@*/ return 0; } int gnameToGid(const char * thisGname, gid_t * gid) { /*@only@*/ static char * lastGname = NULL; static size_t lastGnameLen = 0; static size_t lastGnameAlloced; static gid_t lastGid; size_t thisGnameLen = 0; struct group * grent = nullptr; if (thisGname == NULL) { lastGnameLen = 0; return -1; } else if (strcmp(thisGname, "root") == 0) { /*@-boundswrite@*/ *gid = 0; /*@=boundswrite@*/ return 0; } thisGnameLen = strlen(thisGname); if (lastGname == NULL || thisGnameLen != lastGnameLen || strcmp(thisGname, lastGname) != 0) { if (lastGnameAlloced < thisGnameLen + 1) { lastGnameAlloced = thisGnameLen + 10; lastGname = (char *)realloc(lastGname, lastGnameAlloced); /* XXX memory leak */ } /*@-boundswrite@*/ strcpy(lastGname, thisGname); /*@=boundswrite@*/ grent = getgrnam(thisGname); if (grent == NULL) { /*@-internalglobs@*/ /* FIX: shrug */ endgrent(); /*@=internalglobs@*/ grent = getgrnam(thisGname); if (grent == NULL) { /* XXX The filesystem package needs group/lock w/o getgrnam. */ if (strcmp(thisGname, "lock") == 0) { /*@-boundswrite@*/ *gid = lastGid = 54; /*@=boundswrite@*/ return 0; } else if (strcmp(thisGname, "mail") == 0) { /*@-boundswrite@*/ *gid = lastGid = 12; /*@=boundswrite@*/ return 0; } else return -1; } } lastGid = grent->gr_gid; } /*@-boundswrite@*/ *gid = lastGid; /*@=boundswrite@*/ return 0; } //////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include using std::endl; namespace zypp { namespace target { namespace rpm { /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::RpmHeader // METHOD TYPE : Constructor // // DESCRIPTION : // RpmHeader::RpmHeader( Header h_r ) : BinHeader( h_r ) {} /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::RpmHeader // METHOD TYPE : Constructor // RpmHeader::RpmHeader( BinHeader::Ptr & rhs ) : BinHeader( rhs ) {} /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::~RpmHeader // METHOD TYPE : Destructor // // DESCRIPTION : // RpmHeader::~RpmHeader() {} /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::readPackage // METHOD TYPE : constRpmHeaderPtr // RpmHeader::constPtr RpmHeader::readPackage( const Pathname & path_r, VERIFICATION verification_r ) { librpmDb::globalInit(); zypp::AutoDispose ts ( ::rpmtsCreate(), ::rpmtsFree ); unsigned vsflag = RPMVSF_DEFAULT; if ( verification_r & NODIGEST ) vsflag |= _RPMVSF_NODIGESTS; if ( verification_r & NOSIGNATURE ) vsflag |= _RPMVSF_NOSIGNATURES; ::rpmtsSetVSFlags( ts, rpmVSFlags(vsflag) ); return readPackage( ts, path_r ).first; } std::pair RpmHeader::readPackage( rpmts ts_r, const zypp::filesystem::Pathname &path_r ) { PathInfo file( path_r ); if ( ! file.isFile() ) { ERR << "Not a file: " << file << endl; return std::make_pair( RpmHeader::Ptr(), -1 ); } FD_t fd = ::Fopen( file.asString().c_str(), "r.ufdio" ); if ( fd == 0 || ::Ferror(fd) ) { ERR << "Can't open file for reading: " << file << " (" << ::Fstrerror(fd) << ")" << endl; if ( fd ) ::Fclose( fd ); return std::make_pair( RpmHeader::Ptr(), -1 ); } Header nh = 0; int res = ::rpmReadPackageFile( ts_r, fd, path_r.asString().c_str(), &nh ); ::Fclose( fd ); if ( ! nh ) { WAR << "Error reading header from " << path_r << " error(" << res << ")" << endl; return std::make_pair( RpmHeader::Ptr(), res ); } RpmHeader::Ptr h( new RpmHeader( nh ) ); headerFree( nh ); // clear the reference set in ReadPackageFile MIL << h << " from " << path_r << endl; return std::make_pair( h, res ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::dumpOn // METHOD TYPE : std::ostream & // // DESCRIPTION : // std::ostream & RpmHeader::dumpOn( std::ostream & str ) const { BinHeader::dumpOn( str ) << '{' << tag_name() << "-"; if ( tag_epoch() != 0 ) str << tag_epoch() << ":"; str << tag_version() << (tag_release().empty()?"":(std::string("-")+tag_release())) << ( isSrc() ? ".src}" : "}"); return str; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::isSrc // METHOD TYPE : bool // bool RpmHeader::isSrc() const { return has_tag( RPMTAG_SOURCEPACKAGE ); } bool RpmHeader::isNosrc() const { return has_tag( RPMTAG_SOURCEPACKAGE ) && ( has_tag( RPMTAG_NOSOURCE ) || has_tag( RPMTAG_NOPATCH ) ); } std::string RpmHeader::ident() const { static str::Format fmt { "%1%-%2%-%3%.%4%" }; std::string ret; if ( not empty() ) ret = fmt % tag_name() % tag_version() % tag_release() % tag_arch(); return ret; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_name // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_name() const { return string_val( RPMTAG_NAME ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_epoch // METHOD TYPE : Edition::epoch_t // // DESCRIPTION : // Edition::epoch_t RpmHeader::tag_epoch() const { return int_val ( RPMTAG_EPOCH ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_version // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_version() const { return string_val ( RPMTAG_VERSION ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_release // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_release() const { return string_val( RPMTAG_RELEASE ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_edition // METHOD TYPE : Edition // // DESCRIPTION : // Edition RpmHeader::tag_edition () const { return Edition( tag_version(), tag_release(), tag_epoch() ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_arch // METHOD TYPE : Arch // // DESCRIPTION : // Arch RpmHeader::tag_arch() const { return Arch( string_val( RPMTAG_ARCH ) ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_installtime // METHOD TYPE : Date // // DESCRIPTION : // Date RpmHeader::tag_installtime() const { return int_val( RPMTAG_INSTALLTIME ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_buildtime // METHOD TYPE : Date // // DESCRIPTION : // Date RpmHeader::tag_buildtime() const { return int_val( RPMTAG_BUILDTIME ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::PkgRelList_val // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::PkgRelList_val( tag tag_r, bool pre, std::set * freq_r ) const { CapabilitySet ret; rpmTag kindFlags = rpmTag(0); rpmTag kindVersion = rpmTag(0); switch ( tag_r ) { case RPMTAG_REQUIRENAME: kindFlags = RPMTAG_REQUIREFLAGS; kindVersion = RPMTAG_REQUIREVERSION; break; case RPMTAG_PROVIDENAME: kindFlags = RPMTAG_PROVIDEFLAGS; kindVersion = RPMTAG_PROVIDEVERSION; break; case RPMTAG_OBSOLETENAME: kindFlags = RPMTAG_OBSOLETEFLAGS; kindVersion = RPMTAG_OBSOLETEVERSION; break; case RPMTAG_CONFLICTNAME: kindFlags = RPMTAG_CONFLICTFLAGS; kindVersion = RPMTAG_CONFLICTVERSION; break; #ifdef RPMTAG_OLDSUGGESTS case RPMTAG_OLDENHANCESNAME: kindFlags = RPMTAG_OLDENHANCESFLAGS; kindVersion = RPMTAG_OLDENHANCESVERSION; break; case RPMTAG_OLDSUGGESTSNAME: kindFlags = RPMTAG_OLDSUGGESTSFLAGS; kindVersion = RPMTAG_OLDSUGGESTSVERSION; break; case RPMTAG_RECOMMENDNAME: kindFlags = RPMTAG_RECOMMENDFLAGS; kindVersion = RPMTAG_RECOMMENDVERSION; break; case RPMTAG_SUPPLEMENTNAME: kindFlags = RPMTAG_SUPPLEMENTFLAGS; kindVersion = RPMTAG_SUPPLEMENTVERSION; break; case RPMTAG_SUGGESTNAME: kindFlags = RPMTAG_SUGGESTFLAGS; kindVersion = RPMTAG_SUGGESTVERSION; break; case RPMTAG_ENHANCENAME: kindFlags = RPMTAG_ENHANCEFLAGS; kindVersion = RPMTAG_ENHANCEVERSION; break; #else case RPMTAG_ENHANCESNAME: kindFlags = RPMTAG_ENHANCESFLAGS; kindVersion = RPMTAG_ENHANCESVERSION; break; case RPMTAG_SUGGESTSNAME: kindFlags = RPMTAG_SUGGESTSFLAGS; kindVersion = RPMTAG_SUGGESTSVERSION; break; #endif default: INT << "Illegal RPMTAG_dependencyNAME " << tag_r << endl; return ret; break; } stringList names; unsigned count = string_list( tag_r, names ); if ( !count ) return ret; intList flags; int_list( kindFlags, flags ); stringList versions; string_list( kindVersion, versions ); for ( unsigned i = 0; i < count; ++i ) { std::string n( names[i] ); Rel op = Rel::ANY; int32_t f = flags[i]; std::string v = versions[i]; if ( n[0] == '/' ) { if ( freq_r ) { freq_r->insert( n ); } } else { if ( v.size() ) { switch ( f & RPMSENSE_SENSEMASK ) { case RPMSENSE_LESS: op = Rel::LT; break; case RPMSENSE_LESS|RPMSENSE_EQUAL: op = Rel::LE; break; case RPMSENSE_GREATER: op = Rel::GT; break; case RPMSENSE_GREATER|RPMSENSE_EQUAL: op = Rel::GE; break; case RPMSENSE_EQUAL: op = Rel::EQ; break; } } } if ((pre && (f & RPMSENSE_PREREQ)) || ((! pre) && !(f & RPMSENSE_PREREQ))) { try { ret.insert( Capability( n, op, Edition(v) ) ); } catch (Exception & excpt_r) { ZYPP_CAUGHT(excpt_r); WAR << "Invalid capability: " << n << " " << op << " " << v << endl; } } } return ret; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_provides // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_provides( std::set * freq_r ) const { return PkgRelList_val( RPMTAG_PROVIDENAME, false, freq_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_requires // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_requires( std::set * freq_r ) const { return PkgRelList_val( RPMTAG_REQUIRENAME, false, freq_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_requires // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_prerequires( std::set * freq_r ) const { return PkgRelList_val( RPMTAG_REQUIRENAME, true, freq_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_conflicts // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_conflicts( std::set * freq_r ) const { return PkgRelList_val( RPMTAG_CONFLICTNAME, false, freq_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_obsoletes // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_obsoletes( std::set * freq_r ) const { return PkgRelList_val( RPMTAG_OBSOLETENAME, false, freq_r ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_enhances // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_enhances( std::set * freq_r ) const { #ifdef RPMTAG_OLDSUGGESTS return PkgRelList_val( RPMTAG_ENHANCENAME, false, freq_r ); #else return PkgRelList_val( RPMTAG_ENHANCESNAME, false, freq_r ); #endif } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_suggests // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_suggests( std::set * freq_r ) const { #ifdef RPMTAG_OLDSUGGESTS return PkgRelList_val( RPMTAG_SUGGESTNAME, false, freq_r ); #else return PkgRelList_val( RPMTAG_SUGGESTSNAME, false, freq_r ); #endif } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_supplements // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_supplements( std::set * freq_r ) const { #ifdef RPMTAG_OLDSUGGESTS return PkgRelList_val( RPMTAG_SUPPLEMENTNAME, false, freq_r ); #else return CapabilitySet(); #endif } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_recommends // METHOD TYPE : CapabilitySet // // DESCRIPTION : // CapabilitySet RpmHeader::tag_recommends( std::set * freq_r ) const { #ifdef RPMTAG_OLDSUGGESTS return PkgRelList_val( RPMTAG_RECOMMENDNAME, false, freq_r ); #else return CapabilitySet(); #endif } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_size // METHOD TYPE : ByteCount // // DESCRIPTION : // ByteCount RpmHeader::tag_size() const { return int_val( RPMTAG_SIZE ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_archivesize // METHOD TYPE : ByteCount // // DESCRIPTION : // ByteCount RpmHeader::tag_archivesize() const { return int_val( RPMTAG_ARCHIVESIZE ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_summary // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_summary() const { return string_val( RPMTAG_SUMMARY ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_description // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_description() const { return string_val( RPMTAG_DESCRIPTION ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_group // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_group() const { return string_val( RPMTAG_GROUP ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_vendor // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_vendor() const { return string_val( RPMTAG_VENDOR ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_distribution // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_distribution() const { return string_val( RPMTAG_DISTRIBUTION ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_license // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_license() const { return string_val( RPMTAG_LICENSE ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_buildhost // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_buildhost() const { return string_val( RPMTAG_BUILDHOST ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_packager // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_packager() const { return string_val( RPMTAG_PACKAGER ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_url // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_url() const { return string_val( RPMTAG_URL ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_os // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_os() const { return string_val( RPMTAG_OS ); } std::string RpmHeader::tag_prein() const { return string_val( RPMTAG_PREIN ); } std::string RpmHeader::tag_preinprog() const { return string_val( RPMTAG_PREINPROG ); } std::string RpmHeader::tag_postin() const { return string_val( RPMTAG_POSTIN ); } std::string RpmHeader::tag_postinprog() const { return string_val( RPMTAG_POSTINPROG ); } std::string RpmHeader::tag_preun() const { return string_val( RPMTAG_PREUN ); } std::string RpmHeader::tag_preunprog() const { return string_val( RPMTAG_PREUNPROG ); } std::string RpmHeader::tag_postun() const { return string_val( RPMTAG_POSTUN ); } std::string RpmHeader::tag_postunprog() const { return string_val( RPMTAG_POSTUNPROG ); } std::string RpmHeader::tag_pretrans() const { return string_val( RPMTAG_PRETRANS ); } std::string RpmHeader::tag_pretransprog() const { return string_val( RPMTAG_PRETRANSPROG ); } std::string RpmHeader::tag_posttrans() const { return string_val( RPMTAG_POSTTRANS ); } std::string RpmHeader::tag_posttransprog() const { return string_val( RPMTAG_POSTTRANSPROG ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_sourcerpm // METHOD TYPE : std::string // // DESCRIPTION : // std::string RpmHeader::tag_sourcerpm() const { return string_val( RPMTAG_SOURCERPM ); } std::string RpmHeader::signatureKeyID() const { std::string sigInfo = format("%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|"); //no signature, return empty string if ( sigInfo == "(none)" ) return std::string(); std::vector words; str::split( sigInfo, std::back_inserter(words), ","); if ( words.size() < 3) return std::string(); const std::string &keyId = words[2]; if ( !str::startsWith(keyId, " Key ID ")) return std::string(); return str::toUpper( words[2].substr(8) ); } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_filenames // METHOD TYPE : std::list // // DESCRIPTION : // std::list RpmHeader::tag_filenames() const { std::list ret; stringList basenames; if ( string_list( RPMTAG_BASENAMES, basenames ) ) { stringList dirnames; string_list( RPMTAG_DIRNAMES, dirnames ); intList dirindexes; int_list( RPMTAG_DIRINDEXES, dirindexes ); for ( unsigned i = 0; i < basenames.size(); ++ i ) { ret.push_back( dirnames[dirindexes[i]] + basenames[i] ); } } return ret; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_fileinfos // METHOD TYPE : std::list // // DESCRIPTION : // std::list RpmHeader::tag_fileinfos() const { std::list ret; stringList basenames; if ( string_list( RPMTAG_BASENAMES, basenames ) ) { stringList dirnames; string_list( RPMTAG_DIRNAMES, dirnames ); intList dirindexes; int_list( RPMTAG_DIRINDEXES, dirindexes ); intList filesizes; int_list( RPMTAG_FILESIZES, filesizes ); stringList md5sums; string_list( RPMTAG_FILEMD5S, md5sums ); stringList usernames; string_list( RPMTAG_FILEUSERNAME, usernames ); stringList groupnames; string_list( RPMTAG_FILEGROUPNAME, groupnames ); intList uids; int_list( RPMTAG_FILEUIDS, uids ); intList gids; int_list( RPMTAG_FILEGIDS, gids ); intList filemodes; int_list( RPMTAG_FILEMODES, filemodes ); intList filemtimes; int_list( RPMTAG_FILEMTIMES, filemtimes ); intList fileflags; int_list( RPMTAG_FILEFLAGS, fileflags ); stringList filelinks; string_list( RPMTAG_FILELINKTOS, filelinks ); for ( unsigned i = 0; i < basenames.size(); ++ i ) { uid_t uid = 0; if (uids.empty()) { uid = unameToUid( usernames[i].c_str(), &uid ); } else { uid =uids[i]; } gid_t gid = 0; if (gids.empty()) { gid = gnameToGid( groupnames[i].c_str(), &gid ); } else { gid = gids[i]; } FileInfo info = { dirnames[dirindexes[i]] + basenames[i], filesizes[i], md5sums[i], uid, gid, mode_t(filemodes[i]), filemtimes[i], bool(fileflags[i] & RPMFILE_GHOST), filelinks[i] }; ret.push_back( info ); } } return ret; } /////////////////////////////////////////////////////////////////// // // // METHOD NAME : RpmHeader::tag_changelog // METHOD TYPE : Changelog // // DESCRIPTION : // Changelog RpmHeader::tag_changelog() const { Changelog ret; intList times; if ( int_list( RPMTAG_CHANGELOGTIME, times ) ) { stringList names; string_list( RPMTAG_CHANGELOGNAME, names ); stringList texts; string_list( RPMTAG_CHANGELOGTEXT, texts ); for ( unsigned i = 0; i < times.size(); ++ i ) { ret.push_back( ChangelogEntry( times[i], names[i], texts[i] ) ); } } return ret; } } // namespace rpm } // namespace target } // namespace zypp libzypp-17.36.5/zypp/target/rpm/RpmHeader.h000066400000000000000000000137031476576476200205300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/RpmHeader.h * */ #ifndef ZYPP_TARGET_RPM_RPMHEADER_H #define ZYPP_TARGET_RPM_RPMHEADER_H #include #include #include #include #include #include #include namespace zypp { namespace target { namespace rpm { struct FileInfo { Pathname filename; ByteCount size; std::string md5sum; uid_t uid; gid_t gid; mode_t mode; time_t mtime; bool ghost; Pathname link_target; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : RpmHeader /** * @short Wrapper class for rpm header struct. * * RpmHeader provides methods to query the content * of a rpm header struct retrieved from the RPM database or by reading * the rpm header of a package on disk. * * The rpm header contains all data associated with a package. So you * probabely do not want to permanently store too many of them. * * NEVER create RpmHeader from a NULL Header! **/ class ZYPP_API RpmHeader : public BinHeader { public: using Ptr = intrusive_ptr; using constPtr = intrusive_ptr; private: CapabilitySet PkgRelList_val( tag tag_r, bool pre, std::set * freq_r = 0 ) const; public: /** * **/ RpmHeader( Header h_r = 0 ); /** * Dangerous!<\B> This one takes the header out of rhs * and leaves rhs empty. **/ RpmHeader( BinHeader::Ptr & rhs ); ~RpmHeader() override; bool isSrc() const; ///< Either 'src' or 'nosrc' bool isNosrc() const; ///< Only 'nosrc' std::string ident() const; ///< N-V-R.A or empty public: std::string tag_name() const; Edition::epoch_t tag_epoch() const; std::string tag_version() const; std::string tag_release() const; Edition tag_edition() const; Arch tag_arch() const; Date tag_installtime() const; Date tag_buildtime() const; /** * If freq_r is not NULL, file dependencies found are inserted. **/ CapabilitySet tag_provides ( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_requires ( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_prerequires ( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_conflicts( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_obsoletes( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_enhances( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_suggests( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_supplements( std::set * freq_r = 0 ) const; /** * @see #tag_provides **/ CapabilitySet tag_recommends( std::set * freq_r = 0 ) const; ByteCount tag_size() const; ByteCount tag_archivesize() const; std::string tag_summary() const; std::string tag_description() const; std::string tag_group() const; std::string tag_vendor() const; std::string tag_distribution() const; std::string tag_license() const; std::string tag_buildhost() const; std::string tag_packager() const; std::string tag_url() const; std::string tag_os() const; std::string tag_prein() const; std::string tag_preinprog() const; std::string tag_postin() const; std::string tag_postinprog() const; std::string tag_preun() const; std::string tag_preunprog() const; std::string tag_postun() const; std::string tag_postunprog() const; std::string tag_pretrans() const; std::string tag_pretransprog() const; std::string tag_posttrans() const; std::string tag_posttransprog()const; std::string tag_sourcerpm() const; /** * Uses headerFormat to query the signature info from the header. * \note Query copied from Yum misc/checksig.py */ std::string signatureKeyID() const; /** just the list of names */ std::list tag_filenames() const; /** * complete information about the files * (extended version of tag_filenames()) */ std::list tag_fileinfos() const; Changelog tag_changelog() const; public: std::ostream & dumpOn( std::ostream & str ) const override; public: /** * Digest and signature verification flags **/ enum VERIFICATION { VERIFY = 0x0000, NODIGEST = (1<<0), NOSIGNATURE = (1<<1), NOVERIFY = 0xffff }; /** * Get an accessible packages data from disk. * Returns NULL on any error. **/ static RpmHeader::constPtr readPackage( const Pathname & path, VERIFICATION verification = VERIFY ); /** * Get an accessible packages data from disk using a existing transaction. * Returns a std::pair container the header and resultcode from reading it **/ static std::pair readPackage( rpmts ts_r, const Pathname & path_r ); }; /////////////////////////////////////////////////////////////////// } // namespace rpm } // namespace target } // namespace zypp #endif // ZYPP_TARGET_RPM_RPMHEADER_H libzypp-17.36.5/zypp/target/rpm/librpm.h000066400000000000000000000020171476576476200201420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/librpm.h * */ #ifndef ZYPP_TARGET_RPM_LIBRPM_H #define ZYPP_TARGET_RPM_LIBRPM_H #ifdef _RPM_5 // needs to be outside 'extern "C"' #include #endif // _RPM_5 extern "C" { #ifdef _RPM_5 #include #else #include #endif // _RPM_5 #include #include #include #include #include } #endif // ZYPP_TARGET_RPM_LIBRPM_H libzypp-17.36.5/zypp/target/rpm/librpmDb.cc000066400000000000000000000333251476576476200205540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/librpmDb.cc * */ #include "librpm.h" #include #include #include #include #include #include #include #include #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "librpmDb" using std::endl; namespace zypp { namespace target { namespace rpm { namespace internal { // helper functions here expect basic checks on arguments have been performed. // (globalInit done, root is absolute, dbpath not empty, ...) inline const Pathname & rpmDefaultDbPath() { static const Pathname _val = [](){ Pathname ret = librpmDb::expand( "%{_dbpath}" ); if ( ret.empty() ) { ret = "/usr/lib/sysimage/rpm"; WAR << "Looks like rpm has no %{_dbpath} set!?! Assuming " << ret << endl; } return ret; }(); return _val; } inline Pathname suggestedDbPath( const Pathname & root_r ) { if ( PathInfo( root_r ).isDir() ) { // If a known dbpath exsists, we continue to use it for ( auto p : { "/var/lib/rpm", "/usr/lib/sysimage/rpm" } ) { if ( PathInfo( root_r/p, PathInfo::LSTAT/*!no symlink*/ ).isDir() ) { MIL << "Suggest existing database at " << dumpPath( root_r, p ) << endl; return p; } } } const Pathname & defaultDbPath { rpmDefaultDbPath() }; MIL << "Suggest rpm dbpath " << dumpPath( root_r, defaultDbPath ) << endl; return defaultDbPath; } inline Pathname sanitizedDbPath( const Pathname & root_r, const Pathname & dbPath_r ) { return dbPath_r.empty() ? suggestedDbPath( root_r ) : dbPath_r; } inline bool dbExists( const Pathname & root_r, const Pathname & dbPath_r ) { Pathname dbdir { root_r / sanitizedDbPath( root_r, dbPath_r ) }; return PathInfo(dbdir).isDir() && ( PathInfo(dbdir/"Packages").isFile() || PathInfo(dbdir/"Packages.db").isFile() || PathInfo(dbdir/"rpmdb.sqlite").isFile() ); } } // namespace internal /////////////////////////////////////////////////////////////////// // // CLASS NAME : librpmDb (ststic interface) // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : librpmDb::D /** * @short librpmDb internal database handle **/ class librpmDb::D { D ( const D & ) = delete; // NO COPY! D & operator=( const D & ) = delete; // NO ASSIGNMENT! D(D &&) = delete; D &operator=(D &&) = delete; public: const Pathname _root; // root directory for all operations const Pathname _dbPath; // directory (below root) that contains the rpmdb AutoDispose _ts; // transaction handle, includes database friend std::ostream & operator<<( std::ostream & str, const D & obj ) { return str << "{" << dumpPath( obj._root, obj._dbPath ) << "}"; } D( Pathname root_r, Pathname dbPath_r, bool readonly_r ) : _root { std::move(root_r) } , _dbPath { std::move(dbPath_r) } , _ts { nullptr } { _ts = AutoDispose( ::rpmtsCreate(), ::rpmtsFree ); ::rpmtsSetRootDir( _ts, _root.c_str() ); // open database (creates a missing one on the fly) OnScopeExit cleanup; if ( _dbPath != internal::rpmDefaultDbPath() ) { // temp set %{_dbpath} macro for rpmtsOpenDB cleanup.setDispose( ¯oResetDbpath ); macroSetDbpath( _dbPath ); } int res = ::rpmtsOpenDB( _ts, (readonly_r ? O_RDONLY : O_RDWR ) ); if ( res ) { ERR << "rpmdbOpen error(" << res << "): " << *this << endl; ZYPP_THROW(RpmDbOpenException(_root, _dbPath)); } } private: static void macroSetDbpath( const Pathname & dppath_r ) { ::addMacro( NULL, "_dbpath", NULL, dppath_r.asString().c_str(), RMIL_CMDLINE ); } static void macroResetDbpath() { macroSetDbpath( internal::rpmDefaultDbPath() ); } }; /////////////////////////////////////////////////////////////////// bool librpmDb::globalInit() { static bool initialized = false; if ( initialized ) return true; int rc = ::rpmReadConfigFiles( NULL, NULL ); if ( rc ) { ERR << "rpmReadConfigFiles returned " << rc << endl; return false; } initialized = true; // Necessary to be able to use exand() in rpmDefaultDbPath(). const Pathname & rpmDefaultDbPath { internal::rpmDefaultDbPath() }; // init rpmDefaultDbPath()! MIL << "librpm init done: (_target:" << expand( "%{_target}" ) << ") (_dbpath:" << rpmDefaultDbPath << ")" << endl; return initialized; } std::string librpmDb::expand( const std::string & macro_r ) { if ( ! globalInit() ) return macro_r; // unexpanded AutoFREE val = ::rpmExpand( macro_r.c_str(), NULL ); if ( val ) return std::string( val ); return std::string(); } Pathname librpmDb::suggestedDbPath( const Pathname & root_r ) { if ( ! root_r.absolute() ) ZYPP_THROW(RpmInvalidRootException( root_r, "" )); // initialize librpm (for rpmDefaultDbPath) if ( ! globalInit() ) ZYPP_THROW(GlobalRpmInitException()); return internal::suggestedDbPath( root_r ); } bool librpmDb::dbExists( const Pathname & root_r, const Pathname & dbPath_r ) { if ( ! root_r.absolute() ) ZYPP_THROW(RpmInvalidRootException( root_r, "" )); // initialize librpm (for rpmDefaultDbPath) if ( ! globalInit() ) ZYPP_THROW(GlobalRpmInitException()); return internal::dbExists( root_r, dbPath_r ); } librpmDb::constPtr librpmDb::dbOpenIf( const Pathname & root_r, const Pathname & dbPath_r ) { return dbAccess( root_r, dbPath_r, /*create_r*/false ); } librpmDb::constPtr librpmDb::dbOpenCreate( const Pathname & root_r, const Pathname & dbPath_r ) { return dbAccess( root_r, dbPath_r, /*create_r*/true ); } librpmDb::constPtr librpmDb::dbAccess( const Pathname & root_r, const Pathname & dbPath_rx, bool create_r ) { if ( ! root_r.absolute() ) ZYPP_THROW(RpmInvalidRootException( root_r, "" )); // initialize librpm (for rpmDefaultDbPath) if ( ! globalInit() ) ZYPP_THROW(GlobalRpmInitException()); Pathname dbPath { internal::sanitizedDbPath( root_r, dbPath_rx ) }; bool dbExists = internal::dbExists( root_r, dbPath ); if ( not create_r && not dbExists ) { WAR << "NoOpen not existing database " << dumpPath( root_r, dbPath ) << endl; return nullptr; } MIL << (dbExists?"Open":"Create") << " database " << dumpPath( root_r, dbPath ) << endl; return new librpmDb( root_r, dbPath, /*readonly*/true ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : librpmDb (internal database handle interface (nonstatic)) // /////////////////////////////////////////////////////////////////// librpmDb::librpmDb( const Pathname & root_r, const Pathname & dbPath_r, bool readonly_r ) : _d( * new D( root_r, dbPath_r, readonly_r ) ) {} librpmDb::~librpmDb() { MIL << "Close database " << *this << endl; delete &_d; } void librpmDb::unref_to( unsigned refCount_r ) const { return; } // if ( refCount_r == 1 ) { tbd if we hold a static reference as weak ptr. } const Pathname & librpmDb::root() const { return _d._root; } const Pathname & librpmDb::dbPath() const { return _d._dbPath; } std::ostream & librpmDb::dumpOn( std::ostream & str ) const { return ReferenceCounted::dumpOn( str ) << _d; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : librpmDb::db_const_iterator::D // class librpmDb::db_const_iterator::D { D & operator=( const D & ) = delete; // NO ASSIGNMENT! D ( const D & ) = delete; // NO COPY! D(D &&); D &operator=(D &&) = delete; public: librpmDb::constPtr _dbptr; AutoDispose _mi; RpmHeader::constPtr _hptr; /** A null iterator */ D() {} /** Open a specific rpmdb if it exists. */ D( const Pathname & root_r, const Pathname & dbPath_r = Pathname() ) { try { _dbptr = librpmDb::dbOpenIf( root_r, dbPath_r ); } catch ( const RpmException & excpt_r ) { ZYPP_CAUGHT(excpt_r); } if ( not _dbptr ) { WAR << "No database access: " << dumpPath( root_r, dbPath_r ) << endl; } } /** * Let iterator access a dbindex file. Call @ref advance to access the * 1st element (if present). **/ bool create( int rpmtag, const void * keyp = NULL, size_t keylen = 0 ) { destroy(); if ( ! _dbptr ) return false; _mi = AutoDispose( ::rpmtsInitIterator( _dbptr->_d._ts, rpmTag(rpmtag), keyp, keylen ), ::rpmdbFreeIterator ); return _mi; } /** * Reset iterator. Always returns false. **/ bool destroy() { _mi.reset(); _hptr.reset(); return false; } /** * Advance to the first/next header in iterator. Destroys iterator if * no more headers available. **/ bool advance() { if ( !_mi ) return false; Header h = ::rpmdbNextIterator( _mi ); if ( ! h ) { destroy(); return false; } _hptr = new RpmHeader( h ); return true; } /** * Access a dbindex file and advance to the 1st header. **/ bool init( int rpmtag, const void * keyp = NULL, size_t keylen = 0 ) { if ( ! create( rpmtag, keyp, keylen ) ) return false; return advance(); } /** * Create an itertator that contains the database entry located at * off_r, and advance to the 1st header. **/ bool set( int off_r ) { if ( ! create( RPMDBI_PACKAGES ) ) return false; #ifdef RPMFILEITERMAX // since rpm.4.12 ::rpmdbAppendIterator( _mi, (const unsigned *)&off_r, 1 ); #else ::rpmdbAppendIterator( _mi, &off_r, 1 ); #endif return advance(); } unsigned offset() { return( _mi ? ::rpmdbGetIteratorOffset( _mi ) : 0 ); } int size() { if ( !_mi ) return 0; int ret = ::rpmdbGetIteratorCount( _mi ); return( ret ? ret : -1 ); // -1: sequential access } }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : librpmDb::Ptr::db_const_iterator // /////////////////////////////////////////////////////////////////// #if LEGACY(1735) // Former ZYPP_API used this as default ctor (dbptr_r == nullptr). // (dbptr_r!=nullptr) is not possible because librpmDb is not in ZYPP_API. librpmDb::db_const_iterator::db_const_iterator( librpmDb::constPtr dbptr_r ) : db_const_iterator( "/" ) {} #endif librpmDb::db_const_iterator::db_const_iterator() : _d( * new D( "/" ) ) { findAll(); } librpmDb::db_const_iterator::db_const_iterator( const Pathname & root_r ) : _d( * new D( root_r ) ) { findAll(); } librpmDb::db_const_iterator::db_const_iterator( const Pathname & root_r, const Pathname & dbPath_r ) : _d( * new D( root_r, dbPath_r ) ) { findAll(); } librpmDb::db_const_iterator::db_const_iterator( std::nullptr_t ) : _d( * new D() ) {} librpmDb::db_const_iterator::~db_const_iterator() { delete &_d; } bool librpmDb::db_const_iterator::hasDB() const { return bool(_d._dbptr); } void librpmDb::db_const_iterator::operator++() { _d.advance(); } unsigned librpmDb::db_const_iterator::dbHdrNum() const { return _d.offset(); } const RpmHeader::constPtr & librpmDb::db_const_iterator::operator*() const { return _d._hptr; } std::ostream & operator<<( std::ostream & str, const librpmDb::db_const_iterator & obj ) { return str << "db_const_iterator(" << obj._d._dbptr << ")"; } bool librpmDb::db_const_iterator::findAll() { return _d.init( RPMDBI_PACKAGES ); } bool librpmDb::db_const_iterator::findByFile( const std::string & file_r ) { return _d.init( RPMTAG_BASENAMES, file_r.c_str() ); } bool librpmDb::db_const_iterator::findByProvides( const std::string & tag_r ) { return _d.init( RPMTAG_PROVIDENAME, tag_r.c_str() ); } bool librpmDb::db_const_iterator::findByRequiredBy( const std::string & tag_r ) { return _d.init( RPMTAG_REQUIRENAME, tag_r.c_str() ); } bool librpmDb::db_const_iterator::findByConflicts( const std::string & tag_r ) { return _d.init( RPMTAG_CONFLICTNAME, tag_r.c_str() ); } bool librpmDb::db_const_iterator::findByName( const std::string & name_r ) { return _d.init( RPMTAG_NAME, name_r.c_str() ); } bool librpmDb::db_const_iterator::findPackage( const std::string & name_r ) { if ( ! _d.init( RPMTAG_NAME, name_r.c_str() ) ) return false; if ( _d.size() == 1 ) return true; // check installtime on multiple entries int match = 0; time_t itime = 0; for ( ; operator*(); operator++() ) { if ( operator*()->tag_installtime() > itime ) { match = _d.offset(); itime = operator*()->tag_installtime(); } } return _d.set( match ); } bool librpmDb::db_const_iterator::findPackage( const std::string & name_r, const Edition & ed_r ) { if ( ! _d.init( RPMTAG_NAME, name_r.c_str() ) ) return false; for ( ; operator*(); operator++() ) { if ( ed_r == operator*()->tag_edition() ) { int match = _d.offset(); return _d.set( match ); } } return _d.destroy(); } bool librpmDb::db_const_iterator::findPackage( const Package::constPtr & which_r ) { if ( ! which_r ) return _d.destroy(); return findPackage( which_r->name(), which_r->edition() ); } } // namespace rpm } // namespace target } // namespace zypp libzypp-17.36.5/zypp/target/rpm/librpmDb.h000066400000000000000000000237621476576476200204220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/target/rpm/librpmDb.h * */ #ifndef librpmDb_h #define librpmDb_h #include #include #include #include #include #include #include namespace zypp { namespace target { namespace rpm { struct _dumpPath { _dumpPath( const Pathname & root_r, const Pathname & sub_r ) : _root {root_r } , _sub { sub_r } {} const Pathname & _root; const Pathname & _sub; }; inline std::ostream & operator<<( std::ostream & str, const _dumpPath & obj ) { return str << "'(" << obj._root << ")" << obj._sub << "'"; } /** dumpPath iomaip to dump '(root_r)sub_r' output, */ inline _dumpPath dumpPath( const Pathname & root_r, const Pathname & sub_r ) { return _dumpPath( root_r, sub_r ); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : librpmDb /** * @short Manage access to librpm database. **/ class librpmDb : public base::ReferenceCounted, private base::NonCopyable { public: using Ptr = intrusive_ptr; using constPtr = intrusive_ptr; private: /** * INTENTIONALLY UNDEFINED<\B> because of bug in Ptr classes * which allows implicit conversion from librpmDb::Ptr to * librpmDb::constPtr. Currently we don't want to provide non const * handles, as the database is opened READONLY. * \throws RpmException **/ static void dbAccess( librpmDb::Ptr & ptr_r ); public: /////////////////////////////////////////////////////////////////// // // static interface // /////////////////////////////////////////////////////////////////// /** * Initialize lib librpm (read configfiles etc.). * It's called on demand but you may call it anytime. * * @return Whether librpm is initialized. **/ static bool globalInit(); /** * @return librpm macro expansion. **/ static std::string expand( const std::string & macro_r ); /** * \return The preferred location of the rpmdb below \a root_r. * It's the location of an already existing db, otherwise the * default location suggested by rpm's config. * * \throws RpmException if root is not an absolute path or no directory for the rpmdb can determined. **/ static Pathname suggestedDbPath( const Pathname & root_r ); /** * \return whether the rpmdb below the system at \a root_r exists. * Unless a \a dbPath_r is explicitly specified, the systems default * rpmdb is used (\see \ref suggestedDbPath). * * \throws RpmException if no directory for the rpmdb can be determined. */ static bool dbExists( const Pathname & root_r, const Pathname & dbPath_r = Pathname() ); /** Open the rpmdb below the system at \a root_r (if it exists). * If the database does not exist a \c nullptr is returned. * Unless a \a dbPath_r is explicitly specified, the systems default * rpmdb is used (\see \ref suggestedDbPath). * * \throws RpmException if an existing database can not be opened. */ static librpmDb::constPtr dbOpenIf( const Pathname & root_r, const Pathname & dbPath_r = Pathname() ); /** Assert the rpmdb below the system at \a root_r exists. * If the database does not exist an empty one is created. * Unless a \a dbPath_r is explicitly specified, the systems default * rpmdb is used (\see \ref suggestedDbPath). * * \throws RpmException if the database can not be created or opened. */ static librpmDb::constPtr dbOpenCreate( const Pathname & root_r, const Pathname & dbPath_r = Pathname() ); /** * Subclass to retrieve database content. **/ class db_const_iterator; private: /** * Internal workhorse managing database creation and access. * \throws RpmException if an existing database can not be opened. */ static librpmDb::constPtr dbAccess( const Pathname & root_r, const Pathname & dbPath_r, bool create_r = false ); private: /////////////////////////////////////////////////////////////////// // // internal database handle interface (nonstatic) // /////////////////////////////////////////////////////////////////// /** * Hides librpm specific data **/ class D; D & _d; /** * Private constructor! librpmDb objects are to be created via * static interface only. **/ librpmDb( const Pathname & root_r, const Pathname & dbPath_r, bool readonly_r = true ); /** * Trigger from @ref Rep, after refCount was decreased. **/ void unref_to( unsigned refCount_r ) const override; public: /** * Destructor. Closes rpmdb. **/ ~librpmDb() override; /** * @return This handles root directory for all operations. **/ const Pathname & root() const; /** * @return This handles directory that contains the rpmdb. **/ const Pathname & dbPath() const; public: /** * Dump debug info. **/ std::ostream & dumpOn( std::ostream & str ) const override; }; /////////////////////////////////////////////////////////////////// /// \class librpmDb::db_const_iterator /// \brief Subclass to retrieve rpm database content. /// /// If the specified rpm database was opened successfully, the iterator /// is initialized to @ref findAll. Otherwise the iterator is an empty /// null iterator. /// /// \note The iterator will never create a not existing database. /// \note The iterator keeps the rpm database open as a reader, so do not /// store it for longer than necessary as it may prevent write operations. /////////////////////////////////////////////////////////////////// class ZYPP_API librpmDb::db_const_iterator { db_const_iterator & operator=( const db_const_iterator & ); // NO ASSIGNMENT! db_const_iterator ( const db_const_iterator & ); // NO COPY! friend std::ostream & operator<<( std::ostream & str, const db_const_iterator & obj ); friend class librpmDb; private: /** * Hides librpm specific data **/ class D; D & _d; #if LEGACY(1735) public: /** * \deprecated Legacy code linked this with 'dbptr_r=0' as default argument. * The ZYPP_API is not able to acquire a not-null dbptr_r, so we keep * this symbol in the ZYPP_API and map it to the default ctor until * we need to raise our SOVERSION. Afterwards this ctor is no longer * needed. */ db_const_iterator( librpmDb::constPtr dbptr_r ) ZYPP_DEPRECATED; #endif public: /** Open the default rpmdb below the host system (at /). * \deprecated It's preferred to explicitly tell the root directory * of the system whose database you want to query. */ db_const_iterator() ZYPP_DEPRECATED; /** Open the default rpmdb below the system at \a root_r. */ explicit db_const_iterator( const Pathname & root_r ); /** Open a specific rpmdb below the system at \a root_r. */ db_const_iterator( const Pathname & root_r, const Pathname & dbPath_r ); /** A null iterator. * What you get if the database does not exist. */ db_const_iterator( std::nullptr_t ); /** * Destructor. **/ ~db_const_iterator(); /** Whether an underlying rpmdb exists. */ bool hasDB() const; /** * Advance to next RpmHeader::constPtr. **/ void operator++(); /** * Returns the current headers index in database, * 0 if no header. **/ unsigned dbHdrNum() const; /** * Returns the current RpmHeader::constPtr or * NULL, if no more entries available. **/ const RpmHeader::constPtr & operator*() const; /** * Forwards to the current RpmHeader::constPtr. **/ const RpmHeader::constPtr & operator->() const { return operator*(); } public: /** * Reset to iterate all packages. Returns true if iterator * contains at least one entry. **/ bool findAll(); /** * Reset to iterate all packages that own a certain file. **/ bool findByFile( const std::string & file_r ); /** * Reset to iterate all packages that provide a certain tag. **/ bool findByProvides( const std::string & tag_r ); /** * Reset to iterate all packages that require a certain tag. **/ bool findByRequiredBy( const std::string & tag_r ); /** * Reset to iterate all packages that conflict with a certain tag. **/ bool findByConflicts( const std::string & tag_r ); /** * Reset to iterate all packages with a certain name. * * NOTE: Multiple entries for one package installed * in different versions are possible but not desired. Usually * you'll want to use @ref findPackage instead. * * findByName is needed to retrieve pseudo packages like * 'gpg-pubkey', which in fact exist in multiple instances. **/ bool findByName( const std::string & name_r ); public: /** * Find package by name. * * Multiple entries for one package installed in different versions * are possible but not desired. If so, the last package installed * is returned. **/ bool findPackage( const std::string & name_r ); /** * Find package by name and edition. * Commonly used by PMRpmPackageDataProvider. **/ bool findPackage( const std::string & name_r, const Edition & ed_r ); /** * Abbr. for findPackage( which_r->name(), which_r->edition() ); **/ bool findPackage( const Package::constPtr & which_r ); }; /** \relates librpmDb::db_const_iterator stream output */ std::ostream & operator<<( std::ostream & str, const librpmDb::db_const_iterator & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// } //namespace rpm } //namespace target } // namespace zypp #endif // librpmDb_h libzypp-17.36.5/zypp/ui/000077500000000000000000000000001476576476200150355ustar00rootroot00000000000000libzypp-17.36.5/zypp/ui/SelFilters.h000066400000000000000000000056641476576476200172750ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/SelFilters.h * */ #ifndef ZYPP_UI_SELFILTERS_H #define ZYPP_UI_SELFILTERS_H #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace selfilter { ///////////////////////////////////////////////////////////////// /** */ struct ByKind { ByKind( ResKind kind_r ) : _kind(std::move( kind_r )) {} bool operator()( const Selectable::constPtr & obj ) const { return obj && obj->kind() == _kind; } ResKind _kind; }; /** */ struct ByName { ByName( std::string name_r ) : _name(std::move( name_r )) {} bool operator()( const ui::Selectable::constPtr & obj ) const { return obj && obj->name() == _name; } std::string _name; }; /** */ struct ByHasInstalledObj { bool operator()( const ui::Selectable::constPtr & obj ) const { return obj && !obj->installedEmpty(); } }; /** */ struct ByHasCandidateObj { bool operator()( const ui::Selectable::constPtr & obj ) const { return obj && obj->hasCandidateObj(); } }; struct ByStatus /** */ { ByStatus( Status status_r ) : _status( status_r ) {} bool operator()( const ui::Selectable::constPtr & obj ) const { return obj && obj->status() == _status; } Status _status; }; ///////////////////////////////////////////////////////////////// } // namespace selfilter /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_UI_SELFILTERS_H libzypp-17.36.5/zypp/ui/Selectable.cc000066400000000000000000000256701476576476200174210ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/Selectable.cc * */ #include #include //#include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// IMPL_PTR_TYPE(Selectable); Selectable::Ptr Selectable::get( const pool::ByIdent & ident_r ) { return ResPool::instance().proxy().lookup( ident_r ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Selectable::Selectable // METHOD TYPE : Ctor // Selectable::Selectable( Impl_Ptr pimpl_r ) : _pimpl( std::move(pimpl_r) ) {} /////////////////////////////////////////////////////////////////// // // METHOD NAME : Selectable::~Selectable // METHOD TYPE : Dtor // Selectable::~Selectable() {} /////////////////////////////////////////////////////////////////// // // Forward to implementation. // Restrict PoolItems to ResObject::constPtr! // /////////////////////////////////////////////////////////////////// IdString Selectable::ident() const { return _pimpl->ident(); } ResKind Selectable::kind() const { return _pimpl->kind(); } const std::string & Selectable::name() const { return _pimpl->name(); } Status Selectable::status() const { return _pimpl->status(); } bool Selectable::setStatus( Status state_r, ResStatus::TransactByValue causer_r ) { return _pimpl->setStatus( state_r, causer_r ); } PoolItem Selectable::installedObj() const { return _pimpl->installedObj(); } PoolItem Selectable::candidateObj() const { return _pimpl->candidateObj(); } PoolItem Selectable::candidateObjFrom( Repository repo_r ) const { return _pimpl->candidateObjFrom( repo_r ); } PoolItem Selectable::updateCandidateObj() const { return _pimpl->updateCandidateObj(); } PoolItem Selectable::highestAvailableVersionObj() const { return _pimpl->highestAvailableVersionObj(); } bool Selectable::identIsAutoInstalled() const { return _pimpl->identIsAutoInstalled(); } bool Selectable::identicalAvailable( const PoolItem & rhs ) const { return _pimpl->identicalAvailable( rhs ); } bool Selectable::identicalInstalled( const PoolItem & rhs ) const { return _pimpl->identicalInstalled( rhs ); } PoolItem Selectable::identicalAvailableObj( const PoolItem & rhs ) const { return _pimpl->identicalAvailableObj( rhs ); } PoolItem Selectable::identicalInstalledObj( const PoolItem & rhs ) const { return _pimpl->identicalInstalledObj( rhs ); } PoolItem Selectable::setCandidate( const PoolItem & newCandidate_r, ResStatus::TransactByValue causer_r ) { return _pimpl->setCandidate( newCandidate_r, causer_r ); } PoolItem Selectable::setCandidate( const ResObject::constPtr& newCandidate_r, ResStatus::TransactByValue causer_r ) { return _pimpl->setCandidate( PoolItem( newCandidate_r ), causer_r ); } bool Selectable::setOnSystem( const PoolItem & newCandidate_r, ResStatus::TransactByValue causer_r ) { if ( identicalInstalled( newCandidate_r ) ) return setFate( UNMODIFIED, causer_r ); return setCandidate( newCandidate_r, causer_r ) && setFate( TO_INSTALL, causer_r ); } PoolItem Selectable::theObj() const { return _pimpl->theObj(); } std::vector Selectable::supersededBy() const { return _pimpl->supersededBy(); } //////////////////////////////////////////////////////////////////////// bool Selectable::availableEmpty() const { return _pimpl->availableEmpty(); } Selectable::available_size_type Selectable::availableSize() const { return _pimpl->availableSize(); } Selectable::available_iterator Selectable::availableBegin() const { return _pimpl->availableBegin(); } Selectable::available_iterator Selectable::availableEnd() const { return _pimpl->availableEnd(); } //////////////////////////////////////////////////////////////////////// bool Selectable::installedEmpty() const { return _pimpl->installedEmpty(); } Selectable::installed_size_type Selectable::installedSize() const { return _pimpl->installedSize(); } Selectable::installed_iterator Selectable::installedBegin() const { return _pimpl->installedBegin(); } Selectable::installed_iterator Selectable::installedEnd() const { return _pimpl->installedEnd(); } //////////////////////////////////////////////////////////////////////// bool Selectable::picklistEmpty() const { return _pimpl->picklistEmpty(); } Selectable::picklist_size_type Selectable::picklistSize() const { return _pimpl->picklistSize(); } Selectable::picklist_iterator Selectable::picklistBegin() const { return _pimpl->picklistBegin(); } Selectable::picklist_iterator Selectable::picklistEnd() const { return _pimpl->picklistEnd(); } Selectable::picklist_size_type Selectable::picklistPos( const PoolItem & pi_r ) const { return picklistPos( pi_r.satSolvable() ); } Selectable::picklist_size_type Selectable::picklistPos( const sat::Solvable & solv_r ) const { picklist_size_type idx = picklist_size_type(0); for ( const auto & pi : picklist() ) { if ( pi == solv_r ) return idx; ++idx; } return picklistNoPos; } //////////////////////////////////////////////////////////////////////// bool Selectable::hasBlacklisted() const { return _pimpl->hasBlacklisted(); } bool Selectable::hasBlacklistedInstalled() const { return _pimpl->hasBlacklistedInstalled(); } bool Selectable::hasRetracted() const { return _pimpl->hasRetracted(); } bool Selectable::hasRetractedInstalled() const { return _pimpl->hasRetractedInstalled(); } bool Selectable::hasPtf() const { return _pimpl->hasPtf(); } bool Selectable::hasPtfInstalled() const { return _pimpl->hasPtfInstalled(); } bool Selectable::isUnmaintained() const { return _pimpl->isUnmaintained(); } bool Selectable::multiversionInstall() const { return _pimpl->multiversionInstall(); } bool Selectable::pickInstall( const PoolItem & pi_r, ResStatus::TransactByValue causer_r, bool yesno_r ) { return _pimpl->pickInstall( pi_r, causer_r, yesno_r ); } bool Selectable::pickDelete( const PoolItem & pi_r, ResStatus::TransactByValue causer_r, bool yesno_r ) { return _pimpl->pickDelete( pi_r, causer_r, yesno_r ); } Status Selectable::pickStatus( const PoolItem & pi_r ) const { return _pimpl->pickStatus( pi_r ); } bool Selectable::setPickStatus( const PoolItem & pi_r, Status state_r, ResStatus::TransactByValue causer_r ) { return _pimpl->setPickStatus( pi_r, state_r, causer_r ); } //////////////////////////////////////////////////////////////////////// bool Selectable::isUndetermined() const { return _pimpl->isUndetermined(); } bool Selectable::isRelevant() const { return _pimpl->isRelevant(); } bool Selectable::isSatisfied() const { return _pimpl->isSatisfied(); } bool Selectable::isBroken() const { return _pimpl->isBroken(); } bool Selectable::isNeeded() const { return fate() == TO_INSTALL || ( ! locked() && isBroken() ); } bool Selectable::isUnwanted() const { return locked() && isBroken() ; } ResStatus::TransactByValue Selectable::modifiedBy() const { return _pimpl->modifiedBy(); } bool Selectable::hasLicenceConfirmed() const { return _pimpl->hasLicenceConfirmed(); } void Selectable::setLicenceConfirmed( bool val_r ) { _pimpl->setLicenceConfirmed( val_r ); } bool Selectable::hasLocks() const { return _pimpl->hasLocks(); } Selectable::Fate Selectable::fate() const { switch ( status() ) { case S_Update: case S_Install: case S_AutoUpdate: case S_AutoInstall: return TO_INSTALL; break; case S_Del: case S_AutoDel: return TO_DELETE; break; case S_Protected: case S_Taboo: case S_KeepInstalled: case S_NoInst: break; } return UNMODIFIED; }; bool Selectable::setFate( Fate fate_r, ResStatus::TransactByValue causer_r ) { switch ( fate_r ) { case TO_INSTALL: return setStatus( hasInstalledObj() ? S_Update : S_Install, causer_r ); break; case TO_DELETE: return setStatus( S_Del, causer_r ); break; case UNMODIFIED: switch ( status() ) { case S_Protected: case S_Taboo: return true; break; default: return setStatus( hasInstalledObj() ? S_KeepInstalled : S_NoInst, causer_r ); break; } break; } return false; } bool Selectable::setInstalled( ResStatus::TransactByValue causer_r ) { return( hasInstalledObj() || setStatus( S_Install, causer_r ) ); } bool Selectable::setUpToDate( ResStatus::TransactByValue causer_r ) { if ( ! hasInstalledObj() ) return setStatus( S_Install, causer_r ); PoolItem cand( candidateObj() ); if ( ! cand ) return true; return( installedObj()->edition() >= cand->edition() || setStatus( S_Update, causer_r ) ); } bool Selectable::setDeleted( ResStatus::TransactByValue causer_r ) { return( ! hasInstalledObj() || setStatus( S_Del, causer_r ) ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const Selectable & obj ) { return str << *(obj._pimpl); } std::ostream & dumpOn( std::ostream & str, const Selectable & obj ) { return dumpOn( str, *(obj._pimpl) ); } ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ui/Selectable.h000066400000000000000000000562261476576476200172640ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/Selectable.h * */ #ifndef ZYPP_UI_SELECTABLE_H #define ZYPP_UI_SELECTABLE_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// DEFINE_PTR_TYPE(Selectable); /////////////////////////////////////////////////////////////////// // // CLASS NAME : Selectable // /** Collects PoolItems of same kind and name. * * Selectable is a status wrapper. The ui::Status is calculated * from (and transated to) \ref PoolItems individual \ref ResStatus * values. * * Available objects are sorted according the solver policies, 'best' * packages first (e.g. by repository priority, then Arch, then Edition). * * Installed objects are sorted according the installation date, newer install * time first. */ class ZYPP_API Selectable : public base::ReferenceCounted, private base::NonCopyable { friend std::ostream & operator<<( std::ostream & str, const Selectable & obj ); friend std::ostream & dumpOn( std::ostream & str, const Selectable & obj ); public: using Ptr = intrusive_ptr; using constPtr = intrusive_ptr; /** Iterates over ResObject::constPtr */ using available_iterator = SelectableTraits::available_iterator; using available_size_type = SelectableTraits::available_size_type; using installed_iterator = SelectableTraits::installed_iterator; using installed_size_type = SelectableTraits::installed_size_type; using picklist_iterator = SelectableTraits::picklist_iterator; using picklist_size_type = SelectableTraits::picklist_size_type; public: /** \name Static ctor substitues picking the item from the pool. * \code * Selectable::Ptr item; * item = Selectable::get( "amarok ); // package amamrok * item = Selectable::get( ResKind::patch, "amarok ); // patch amamrok * item = Selectable::get( IdString( "patch:amarok" ); // patch amamrok * \endcode */ //@{ /** Get the \ref Selctable */ static Ptr get( const pool::ByIdent & ident_r ); /** Get the \ref Selctable by its \c sat-identifier. */ static Ptr get( IdString ident_r ) { return get( pool::ByIdent( ident_r ) ); } /** Get the \ref Selctable by \c kind and \c name. */ static Ptr get( ResKind kind_r, const std::string & name_r ) { return get( pool::ByIdent( std::move(kind_r), name_r ) ); } /** Get the \c Package \ref Selctable by \c name. */ static Ptr get( const std::string & name_r ) { return get( pool::ByIdent( ResKind::package, name_r ) ); } /** Get the \ref Selctable containing a specific \ref sat::Solvable. */ static Ptr get( const sat::Solvable & solv_r ) { return get( pool::ByIdent( solv_r ) ); } /** Get the \ref Selctable containing a specific \ref ResObject. */ static Ptr get( const ResObject::constPtr & resolvable_r ) { return resolvable_r ? get( resolvable_r->satSolvable() ) : Ptr(); } /** Get the \ref Selctable containing a specific \ref PoolItem. */ static Ptr get( const PoolItem & pi_r ) { return get( pi_r.satSolvable() ); } //@} public: /** The identifier. * This is the solvables \ref name, \b except for packages and * source packes, prefixed by its \ref kind. * \see \ref sat::Solvable. */ IdString ident() const; /** The ResObjects kind. */ ResKind kind() const; /** The ResObjects name. */ const std::string & name() const; /** The last Installed object. */ PoolItem installedObj() const; /** The 'best' or 'most interesting' among all available objects. * One that is, or is likely to be, chosen for installation, unless * it violated any solver policy (see \ref updateCandidateObj). * \note Might return a blacklisted item if explicitly set by \ref setCandidate * or nothing else available. */ PoolItem candidateObj() const; /** The best candidate provided by a specific \ref Repository, if there is one. * In contrary to \ref candidateObj, this may return no item even if * there are available objects. This simply means the \ref Repository * does not provide this object. * \note Avoids to return blacklisted items. */ PoolItem candidateObjFrom( Repository repo_r ) const; /** The best candidate for update, if there is one. * In contrary to \ref candidateObj, this may return no item even if * there are available objects. This simply means the best object is * already installed, and all available objects violate at least one * update policy. Or all available objects are blacklisted (e.g. a PTF) * in which there does not need to be an installed item either. * \note Avoids to return blacklisted items. */ PoolItem updateCandidateObj() const; /** Simply the highest available version, ignoring priorities and policies. * It's doubtful whether solely looking at the version makes a good * candidate, but apps ask for it. Beware that different vendors may * use different (uncomparable) version schemata. * \note Avoids to return blacklisted items. */ PoolItem highestAvailableVersionObj() const; /** Whether this \ref ident is flagged as AutoInstalled. */ bool identIsAutoInstalled() const; /** \c True if \a rhs is installed and one with the same content is available. * Basically the same name, edition, arch, vendor and buildtime. * \see \ref sat::Solvable::identical */ bool identicalAvailable( const PoolItem & rhs ) const; /** \c True if \a rhs has the same content as an installed one. * Basically the same name, edition, arch, vendor and buildtime. * \see \ref sat::Solvable::identical */ bool identicalInstalled( const PoolItem & rhs ) const; /** \c True if the \ref candidateObj is installed (same content). * \see \ref identicalInstalled. */ bool identicalInstalledCandidate() const { return identicalInstalled( candidateObj() ); } /** \c True if the \ref updateCandidateObj is installed (same content). * \see \ref identicalInstalled. */ bool identicalInstalledUpdateCandidate() const { return identicalInstalled( updateCandidateObj() ); } /** Return an available Object with the same content as \c rhs. * Basically the same name, edition, arch, vendor and buildtime. * \see \ref sat::Solvable::identical */ PoolItem identicalAvailableObj( const PoolItem & rhs ) const; /** \Return an installed Object with the same content as \c rhs. * Basically the same name, edition, arch, vendor and buildtime. * \see \ref sat::Solvable::identical */ PoolItem identicalInstalledObj( const PoolItem & rhs ) const; /** Return the \ref installedObj resolvable casted to a specific kind. * \code * Selectable mySelectable; * Package::constPtr p( mySelectable.installedAsKind() ); * \endcode */ template typename ResTraits::constPtrType installedAsKind() const { return asKind( candidateObj() ); } /** Return the \ref candidateObj resolvable casted to a specific kind. * \code * Selectable mySelectable; * Package::constPtr p( mySelectable.candidateAsKind() ); * \endcode */ template typename ResTraits::constPtrType candidateAsKind() const { return asKind( candidateObj() ); } /** Set a candidate (out of available objects). * \return The new candidate, or NULL if choice was invalid * (NULL or not among availableObjs). An invalid choice * selects the default candidate. * In case the causer is not \c ResStatus::USER the operation * may also fail if there are insufficient permissions to change * a transacting candidate. */ PoolItem setCandidate( const PoolItem & newCandidate_r, ResStatus::TransactByValue causer_r = ResStatus::USER ); /** \overload */ PoolItem setCandidate( const ResObject::constPtr& newCandidate_r, ResStatus::TransactByValue causer_r = ResStatus::USER ); /** Arrange the specified candidate (out of available objects) to be on system after commit. * If the specified candidate is not already installed (\ref identicalInstalled), * and the \a causer_r has sufficient permission, then \a newCandidate_r is set as the new * candidate (\ref setCandidate) and selected for installation. * \returns \c True if \a newCandidate_r is already installed or successfully selected for installation. */ bool setOnSystem( const PoolItem & newCandidate_r, ResStatus::TransactByValue causer_r = ResStatus::USER ); /** An object you could use as pars pro toto. * * \return the \ref candidateObj, or ,if no available objects * exist, the \ref installedObj. */ PoolItem theObj() const; /** The name(s) of the successor package if \ref vendorSupport is \ref VendorSupportSuperseded. * It returns the value for the newest candidate. * \see \ref Package::supersededBy */ std::vector supersededBy() const; //////////////////////////////////////////////////////////////////////// /** \name Available objects iterators. * Oredered according to solver policy. 'Best' first. */ //@{ bool availableEmpty() const; available_size_type availableSize() const; available_iterator availableBegin() const; available_iterator availableEnd() const; inline Iterable available() const { return makeIterable( availableBegin(), availableEnd() ); } //@} //////////////////////////////////////////////////////////////////////// /** \name Installed objects iterators. * Ordered by install time. Latest first. */ //@{ bool installedEmpty() const; installed_size_type installedSize() const; installed_iterator installedBegin() const; installed_iterator installedEnd() const; inline Iterable installed() const { return makeIterable( installedBegin(), installedEnd() ); } //@} //////////////////////////////////////////////////////////////////////// /** \name picklist iterators. * This is basically the available items list prepended by those * installed items, that are nolonger \ref identicalAvailable. */ //@{ bool picklistEmpty() const; picklist_size_type picklistSize() const; picklist_iterator picklistBegin() const; picklist_iterator picklistEnd() const; inline Iterable picklist() const { return makeIterable( picklistBegin(), picklistEnd() ); } /** Returned by \ref picklistPos if the Item does not belong to the picklist. */ static constexpr const picklist_size_type picklistNoPos = picklist_size_type(-1); /** Return the position of \a pi_r in the piclist or \ref picklistNoPos. * \note \ref picklistNoPos is returned if you pass an installed Poolitem, * whci has an \ref identicalAvailableObj. */ picklist_size_type picklistPos( const PoolItem & pi_r ) const; /** \overload taking a sat::Solvable */ picklist_size_type picklistPos( const sat::Solvable & solv_r ) const; //@} //////////////////////////////////////////////////////////////////////// public: /** \name Query for objects within this Selectable. */ //@{ /** True if either installed or candidate object is present */ bool hasObject() const { return (! installedEmpty()) || candidateObj(); } /** True if installed object is present. */ bool hasInstalledObj() const { return ! installedEmpty(); } /** True if candidate object is present. */ bool hasCandidateObj() const { return bool(candidateObj()); } /** True if installed and candidate object is present */ bool hasBothObjects() const { return (! installedEmpty()) && candidateObj(); } /** True if installed object is present but no candidate. */ bool hasInstalledObjOnly() const { return (! installedEmpty()) && ! candidateObj(); } /** True if candidate object is present but no installed. */ bool hasCandidateObjOnly() const { return ( installedEmpty() ) && candidateObj(); } /** True if this Selectable contains available blacklisted items (retracted,ptf,...). */ bool hasBlacklisted() const; /** True if this Selectable contains an installed blacklisted item (retracted,ptf,...). */ bool hasBlacklistedInstalled() const; /** True if this Selectable contains available retracted items. */ bool hasRetracted() const; /** True if this Selectable contains an installed retracted item. */ bool hasRetractedInstalled() const; /** True if this Selectable contains available ptf items. */ bool hasPtf() const; /** True if this Selectable contains an installed ptf item. */ bool hasPtfInstalled() const; //@} /** * True if this package has no replacement from * the available repositories */ bool isUnmaintained() const; /** \name Multiversion install. * * Using \ref pickInstall or \ref pickDelete with non-multiversionInstall items * is possible, but additional constraints will apply. E.g. selecting one item for * install will deselect any other. */ //@{ /** Whether at least one of the available packages has multiversionInstall set. * \see \ref Solvable::multiversionInstall * \see also \ref ZConfig::multiversion. */ bool multiversionInstall() const; /** Select a specific available item for installation. */ bool pickInstall( const PoolItem & pi_r, ResStatus::TransactByValue causer_r = ResStatus::USER, bool yesno_r = true ); /** Deselect a specific available item from installation. */ bool pickNoInstall( const PoolItem & pi_r, ResStatus::TransactByValue causer_r = ResStatus::USER ) { return pickInstall( pi_r, causer_r, false ); } /** Select a specific installed item for deletion. */ bool pickDelete( const PoolItem & pi_r, ResStatus::TransactByValue causer_r = ResStatus::USER, bool yesno_r = true ); /** Deselect a specific installed item from deletion. */ bool pickNoDelete( const PoolItem & pi_r, ResStatus::TransactByValue causer_r = ResStatus::USER ) { return pickDelete( pi_r, causer_r, false ); } /** Compute the \ref ui::Status for an individual PoolItem. * This just takes into account the item and any identical * installed (or available) one. * \code * Assume there are 3 identical 'foo-1.1 (vendor A)' items, * one 'foo-2.1 (vendor A)' and one ''foo-1.1 (vendor B)': * * installed: . foo-1.1 (vendor A) -> S_KeepInstalled * available: foo-2.1 (vendor A) (repo 1) -> S_NoInst * . foo-1.1 (vendor A) (repo 1) -> S_KeepInstalled * . foo-1.1 (vendor A) (repo 2) -> S_KeepInstalled * foo-1.1 (vendor B) (repo 3) -> S_NoInst * * After 'foo-1.1 (vendor A) (repo 1)' was selected to be installed: * * installed: . foo-1.1 (vendor A) -> S_Update * available: foo-2.1 (vendor A) (repo 1) -> S_NoInst * I foo-1.1 (vendor A) (repo 1) -> S_Update * . foo-1.1 (vendor A) (repo 2) -> S_KeepInstalled * foo-1.1 (vendor B) (repo 3) -> S_NoInst * \endcode * \see \ref sat::Solvable::identical */ Status pickStatus( const PoolItem & pi_r ) const; /** Assign a new status to a specific item. */ bool setPickStatus( const PoolItem & pi_r, Status state_r, ResStatus::TransactByValue causer_r = ResStatus::USER ); //@} /** \name Classification of available patches (pseudo installed items). * A patch is either \c not \c relevant, \c satisfied or \c broken. * The same applies to other pseudo installed kinds. * \see \ref traits::isPseudoInstalled */ //@{ /** Returns true for packages, because packages are not * classified by the solver. */ bool isUndetermined() const; /** Returns true if the patch is relevant which means that at least * one package of the patch is installed. */ bool isRelevant() const; /** Whether a relevant patchs requirements are met. */ bool isSatisfied() const; /** Whether a relevant patchs requirements are broken. */ bool isBroken() const; /** This includes \c unlocked broken patches, as well as those already * selected to be installed. This is because already selected * patches will be classified as \c satisfied. \c Locked but broken * patches will be classified as \ref isUnwanted. */ bool isNeeded() const; /** Broken (needed) but locked patches. */ bool isUnwanted() const; //@} public: /** \name Query and maip objects fate in case of commit. */ //@{ enum Fate { TO_DELETE = -1, UNMODIFIED = 0, TO_INSTALL = 1 }; /** */ Fate fate() const; /** True if neither to delete or to install */ bool unmodified() const { return fate() == UNMODIFIED; } /** True if locked (subclass of unmodified). * The \ref locked status indicates that \b all installed and/or \b all available * items are locked. So you can't remove and/or can't install any item. This * is the common case. * \see \ref hasLocks */ bool locked() const { Status st( status() ); return( st == S_Protected || st == S_Taboo ); } /** True if it includes locked items (don't mix this with the \ref locked status). * This is also \c true for partially locked items, where only specific versions * are locked. * \see \ref locked */ bool hasLocks() const; /** True if either to delete or to install */ bool toModify() const { return fate() != UNMODIFIED; } /** True if to delete */ bool toDelete() const { return fate() == TO_DELETE; } /** True if to install */ bool toInstall() const { return fate() == TO_INSTALL; } /** True if would be on system after commit. */ bool onSystem() const { return( ( hasInstalledObj() && !toDelete() ) ||( hasCandidateObj() && toInstall() ) ); } /** True if would be off system after commit. */ bool offSystem() const { return ! onSystem(); } /** */ bool setFate( Fate fate_r, ResStatus::TransactByValue causer_r = ResStatus::USER ); /** Set the item to be installed (new- or re-install). */ bool setToInstall( ResStatus::TransactByValue causer_r = ResStatus::USER ) { return setFate( TO_INSTALL, causer_r ); } /** Take care the item gets installed if it is not. */ bool setInstalled( ResStatus::TransactByValue causer_r = ResStatus::USER ); /** Take care the item gets installed if it is not, or is older. */ bool setUpToDate( ResStatus::TransactByValue causer_r = ResStatus::USER ); /** Set the item to be deleted (must be installed). */ bool setToDelete( ResStatus::TransactByValue causer_r = ResStatus::USER ) { return setFate( TO_DELETE, causer_r ); } /** Take care the item gets deleted if it is installed. */ bool setDeleted( ResStatus::TransactByValue causer_r = ResStatus::USER ); /** Set the item to stay unmodified. */ bool unset( ResStatus::TransactByValue causer_r = ResStatus::USER ) { return setFate( UNMODIFIED, causer_r ); } //@} public: /** * \name Special inteface for Y2UI. * \note This interface acts on \ref ResStatus::USER level. * The \ref Status enum, and allowed state transitions are * tightly related to the Y2UI. */ //@{ /** Return the current Status */ Status status() const; /** * Try to set a new Status. * Returns \c false if the transitions is not allowed. */ bool setStatus( Status state_r, ResStatus::TransactByValue causer_r = ResStatus::USER ); /** Return who caused the modification. */ ResStatus::TransactByValue modifiedBy() const; /** Return value of LicenceConfirmed bit. */ bool hasLicenceConfirmed() const; /** Set LicenceConfirmed bit. */ void setLicenceConfirmed( bool val_r = true ); //@} public: /** Implementation */ struct Impl; using Impl_Ptr = shared_ptr; /** Default ctor */ Selectable( Impl_Ptr pimpl_r ); private: /** Dtor */ ~Selectable() override; private: /** Pointer to implementation */ RW_pointer _pimpl; }; /////////////////////////////////////////////////////////////////// /** \relates Selectable Stream output */ std::ostream & operator<<( std::ostream & str, const Selectable & obj ) ZYPP_API; /** \relates Selectable More verbose stream output */ std::ostream & dumpOn( std::ostream & str, const Selectable & obj ) ZYPP_API; /** Solvable to Selectable transform functor. * \relates Selectable * \relates sat::SolvIterMixin */ struct ZYPP_API asSelectable { using result_type = Selectable_Ptr; Selectable_Ptr operator()( const sat::Solvable & solv_r ) const; Selectable_Ptr operator()( const PoolItem & pi_r ) const { return operator()( pi_r.satSolvable() ); } }; ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_UI_SELECTABLE_H libzypp-17.36.5/zypp/ui/SelectableImpl.cc000066400000000000000000000532461476576476200202430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/SelectableImpl.cc * */ #include //#include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// /** Simple ResStatus backup stack. * \ref restore simply rewinds all remembered status. */ class StatusBackup { public: using Causer = ResStatus::TransactByValue; public: /** Backup status. */ ResStatus & backup( ResStatus & status_r ) { _backup.push_back( status_r ); return status_r; } /** \overload */ ResStatus & backup( const PoolItem & pi_r ) { return backup( pi_r.status() ); } /** Backup status. */ ResStatus & operator()( ResStatus & status_r ) { return backup( status_r ); } /** \overload */ ResStatus & operator()( const PoolItem & pi_r ) { return backup( pi_r.status() ); } /** Restore all status. */ bool restore() { for_( rit, _backup.rbegin(), _backup.rend() ) rit->replay(); return false; // restore is done on error - return restore(); } public: /** lowlevel \c ResStatus::setTransact */ bool setTransact( const PoolItem & pi_r, bool yesno_r, Causer causer_r ) { return backup( pi_r ).setTransact( yesno_r, causer_r ); } /** lowlevel \c ResStatus::setLock */ bool setLock( const PoolItem & pi_r, bool yesno_r, Causer causer_r ) { return backup( pi_r ).setLock( yesno_r, causer_r ); } /** lowlevel \c ResStatus::setTransact(true). */ bool setTransactTrue( const PoolItem & pi_r, Causer causer_r ) { return setTransact( pi_r, true, causer_r ); } /** lowlevel \c ResStatus::setTransact(false). */ bool setTransactFalse( const PoolItem & pi_r, Causer causer_r ) { return setTransact( pi_r, false, causer_r ); } public: /** highevel set transact (force unlock). */ bool transact( const PoolItem & pi_r, Causer causer_r ) { ResStatus & status( backup( pi_r ) ); if ( ! status.setLock( false, causer_r ) ) return false; if ( ! status.setTransact( true, causer_r ) ) return false; return true; } /** highlevel set locked. */ bool lock( const PoolItem & pi_r, Causer causer_r ) { ResStatus & status( backup( pi_r ) ); if ( ! status.setTransact( false, causer_r ) ) return false; if ( ! status.setLock( true, causer_r ) ) return false; return true; } /** highlevel unlock (also unsets transact). */ bool unlock( const PoolItem & pi_r, Causer causer_r ) { ResStatus & status( backup( pi_r ) ); if ( ! status.setTransact( false, causer_r ) ) return false; if ( ! status.setLock( false, causer_r ) ) return false; return true; } /** highlevel remove transact from non-multiversion packages. */ bool unsetNonMultiTransact( const PoolItem & pi_r, Causer causer_r ) { ResStatus & status( backup( pi_r ) ); if ( status.transacts() && ! pi_r.multiversionInstall() ) { if ( ! status.setTransact( false, causer_r ) ) return false; } return true; } /** highlevel remove transact from multiversion packages. */ bool unsetMultiTransact( const PoolItem & pi_r, Causer causer_r ) { ResStatus & status( backup( pi_r ) ); if ( status.transacts() && pi_r.multiversionInstall() ) { if ( ! status.setTransact( false, causer_r ) ) return false; } return true; } /** Highlevel action. */ using Action = bool (StatusBackup::*)(const PoolItem &, Causer); /** Highlevel action on range of items. */ template bool forEach( TIter begin_r, TIter end_r, Action action_r, Causer causer_r ) { for_( it, begin_r, end_r ) if ( ! (this->*action_r)( *it, causer_r ) ) return false; return true; } private: std::vector _backup; }; /////////////////////////////////////////////////////////////////// // // CLASS NAME : StatusHelper // /** \todo Unify status and pickStatus. */ struct StatusHelper { StatusHelper( const Selectable::Impl & impl, ResStatus::TransactByValue causer_r ) : _impl( impl ) , inst( impl.installedObj() ) , cand( impl.candidateObj() ) , causer( causer_r ) {} using available_const_iterator = Selectable::Impl::available_const_iterator; // // Queries // bool hasInstalled() const { return bool(inst); } bool hasCandidate() const { return bool(cand); } bool hasInstalledOnly() const { return inst && !cand; } bool hasCandidateOnly() const { return cand && !inst; } bool hasBoth() const { return inst && cand; } /** \name Topevel methods must restore status on failure. */ //@{ bool setInstall() { if ( cand ) { if ( inst ) { for_( it, _impl.installedBegin(), _impl.installedEnd() ) { ResStatus & inststatus( backup( it->status() ) ); if ( ! inststatus.setTransact( false, causer ) ) return restore(); if ( ! inststatus.setLock ( false, causer ) ) return restore(); if ( ! cand->multiversionInstall() ) { // This is what the solver most probabely will do. // If we are wrong the solver will correct it. But // this way we will get a better disk usage result, // even if no autosolving is on. inststatus.setTransact( true, ResStatus::SOLVER ); } } } if ( ! unlockCandidates() ) return restore(); ResStatus & candstatus( backup( cand.status() ) ); if ( ! candstatus.setTransact( true, causer ) ) return restore(); return true; } return false; } bool setDelete() { if ( inst ) { if ( ! resetTransactingCandidates() ) return restore(); for_( it, _impl.installedBegin(), _impl.installedEnd() ) { ResStatus & inststatus( backup( it->status() ) ); if ( ! inststatus.setLock( false, causer ) ) return restore(); if ( ! inststatus.setTransact( true, causer ) ) return restore(); } return true; } return false; } bool unset() { if ( inst ) { for_( it, _impl.installedBegin(), _impl.installedEnd() ) { ResStatus & inststatus( backup( it->status() ) ); if ( ! inststatus.setTransact( false, causer ) ) return restore(); if ( ! inststatus.setLock( false, causer ) ) return restore(); } } if ( ! unlockCandidates() ) return restore(); return true; } bool setProtected() { if ( causer != ResStatus::USER ) // by user only return false; if ( inst ) { resetTransactingCandidates(); for_( it, _impl.installedBegin(), _impl.installedEnd() ) { it->status().setTransact( false, causer ); it->status().setLock( true, causer ); } return true; } else return false; } bool setTaboo() { if ( causer != ResStatus::USER ) // by user only return false; if ( cand ) { lockCandidates(); return true; } else return false; } //@} private: /** \name Helper methods backup status but do not replay. */ //@{ bool resetTransactingCandidates() { for_( it, _impl.availableBegin(), _impl.availableEnd() ) { ResStatus & status( backup( (*it).status() ) ); if ( ! status.setTransact( false, causer ) ) return false; } return true; } bool unlockCandidates() { for_( it, _impl.availableBegin(), _impl.availableEnd() ) { ResStatus & status( backup( (*it).status() ) ); if ( ! status.setTransact( false, causer ) ) return false; if ( ! status.setLock( false, causer ) ) return false; } return true; } bool lockCandidates() { for_( it, _impl.availableBegin(), _impl.availableEnd() ) { ResStatus & status( backup( (*it).status() ) ); if ( ! status.setTransact( false, causer ) ) return false; if ( ! status.setLock( true, causer ) ) return false; } return true; } //@} private: const Selectable::Impl & _impl; PoolItem inst; PoolItem cand; ResStatus::TransactByValue causer; private: bool restore() { return backup.restore(); } StatusBackup backup; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Selectable::Impl // /////////////////////////////////////////////////////////////////// Status Selectable::Impl::status() const { PoolItem cand( candidateObj() ); if ( cand && cand.status().transacts() ) { if ( cand.status().isByUser() ) return( installedObj() ? S_Update : S_Install ); else return( installedObj() ? S_AutoUpdate : S_AutoInstall ); } if ( installedObj() && installedObj().status().transacts() ) { return( installedObj().status().isByUser() ? S_Del : S_AutoDel ); } if ( installedObj() && allInstalledLocked() ) return S_Protected; if ( !installedObj() && allCandidatesLocked() ) return S_Taboo; // KEEP state: if ( installedObj() ) return S_KeepInstalled; // Report pseudo installed items as installed, if they are satisfied. if ( traits::isPseudoInstalled( kind() ) && cand.status().isSatisfied() ) // no installed, so we must have candidate return S_KeepInstalled; return S_NoInst; } bool Selectable::Impl::setStatus( Status state_r, ResStatus::TransactByValue causer_r ) { StatusHelper self( *this, causer_r ); switch ( state_r ) { case S_Protected: return self.setProtected(); case S_Taboo: return self.setTaboo(); case S_AutoDel: case S_AutoInstall: case S_AutoUpdate: // Auto level is SOLVER level. UI may query, but not // set at this level. break; case S_Del: return self.setDelete(); break; case S_Install: return self.hasCandidateOnly() && self.setInstall(); break; case S_Update: return self.hasBoth() && self.setInstall(); break; case S_KeepInstalled: return self.hasInstalled() && self.unset(); break; case S_NoInst: return !self.hasInstalled() && self.unset(); break; } return false; } PoolItem Selectable::Impl::setCandidate( const PoolItem & newCandidate_r, ResStatus::TransactByValue causer_r ) { PoolItem newCandidate; if ( newCandidate_r ) // must be in available list { for_( it, availableBegin(), availableEnd() ) { if ( *it == newCandidate_r ) { newCandidate = *it; break; } } } if ( newCandidate ) { PoolItem trans( transactingCandidate() ); if ( trans && trans != newCandidate ) { // adjust transact to the new cancidate if ( trans.status().maySetTransact( false, causer_r ) && newCandidate.status().maySetTransact( true, causer_r ) ) { trans.status().setTransact( false, causer_r ); newCandidate.status().setTransact( true, causer_r ); } else { // No permission to change a transacting candidate. // Leave _candidate untouched and return NULL. return PoolItem(); } } } return _candidate = newCandidate; } /////////////////////////////////////////////////////////////////// bool Selectable::Impl::pickInstall( const PoolItem & pi_r, ResStatus::TransactByValue causer_r, bool yesno_r ) { if ( identicalInstalled( pi_r ) ) return setPickStatus( pi_r, ( yesno_r ? S_Update : S_KeepInstalled ), causer_r ); return setPickStatus( pi_r, ( yesno_r ? S_Install : S_NoInst ), causer_r ); } bool Selectable::Impl::pickDelete( const PoolItem & pi_r, ResStatus::TransactByValue causer_r, bool yesno_r ) { return setPickStatus( pi_r, ( yesno_r ? S_Del : S_KeepInstalled ), causer_r ); } bool Selectable::Impl::setPickStatus( const PoolItem & pi_r, Status state_r, ResStatus::TransactByValue causer_r ) { if ( pi_r.ident() != ident() ) return false; // not my PoolItem StatusBackup backup; std::vector i; std::vector a; for_( it, installedBegin(), installedEnd() ) if ( identical( *it, pi_r ) ) i.push_back( *it ); for_( it, availableBegin(), availableEnd() ) if ( identical( *it, pi_r ) ) a.push_back( *it ); switch ( state_r ) { case S_Protected: if ( causer_r == ResStatus::USER && ! i.empty() ) { if ( ! backup.forEach( i.begin(), i.end(), &StatusBackup::lock, causer_r ) ) return backup.restore(); if ( ! backup.forEach( a.begin(), a.end(), &StatusBackup::setTransactFalse, causer_r ) ) return backup.restore(); return true; } break; case S_Taboo: if ( causer_r == ResStatus::USER && ! a.empty() ) { if ( ! backup.forEach( a.begin(), a.end(), &StatusBackup::lock, causer_r ) ) return backup.restore(); return true; } break; case S_AutoDel: case S_AutoInstall: case S_AutoUpdate: // Auto level is SOLVER level. UI may query, but not // set at this level. break; case S_Del: if ( ! i.empty() ) { if ( ! backup.forEach( i.begin(), i.end(), &StatusBackup::transact, causer_r ) ) return backup.restore(); if ( ! backup.forEach( a.begin(), a.end(), &StatusBackup::setTransactFalse, causer_r ) ) return backup.restore(); return true; } break; case S_Install: if ( i.empty() && ! a.empty() ) { const PoolItem & cand( pi_r.status().isInstalled() ? *a.begin() : pi_r ); if ( cand.multiversionInstall() ) { if ( ! backup.forEach( availableBegin(), availableEnd(), &StatusBackup::unsetNonMultiTransact, causer_r ) ) return backup.restore(); // maybe unlock candidate only? if ( ! backup.forEach( a.begin(), a.end(), &StatusBackup::unlock, causer_r ) ) return backup.restore(); if ( ! cand.status().setTransact( true, causer_r ) ) return backup.restore(); return true; } else { // For non-multiversion use ordinary setStatus // NOTE that S_Update/S_Install here depends on !installedEmpty() // and not on picklists identicalInstalled. if ( ! backup.forEach( availableBegin(), availableEnd(), &StatusBackup::unsetMultiTransact, causer_r ) ) return backup.restore(); if ( ! setCandidate( cand, causer_r ) ) return backup.restore(); if ( ! setStatus( installedEmpty() ? S_Install : S_Update, causer_r ) ) return backup.restore(); return true; } } break; case S_Update: if ( ! i.empty() && ! a.empty() ) { const PoolItem & cand( pi_r.status().isInstalled() ? *a.begin() : pi_r ); if ( cand.multiversionInstall() ) { if ( ! backup.forEach( i.begin(), i.end(), &StatusBackup::unlock, causer_r ) ) return backup.restore(); if ( ! backup.forEach( i.begin(), i.end(), &StatusBackup::setTransactTrue, ResStatus::SOLVER ) ) return backup.restore(); if ( ! backup.forEach( availableBegin(), availableEnd(), &StatusBackup::unsetNonMultiTransact, causer_r ) ) return backup.restore(); // maybe unlock candidate only? if ( ! backup.forEach( a.begin(), a.end(), &StatusBackup::unlock, causer_r ) ) return backup.restore(); if ( ! cand.status().setTransact( true, causer_r ) ) return backup.restore(); return true; } else { // For non-multiversion use ordinary setStatus // NOTE that S_Update/S_Install here depends on !installedEmpty() // and not on picklists identicalInstalled. if ( ! backup.forEach( availableBegin(), availableEnd(), &StatusBackup::unsetMultiTransact, causer_r ) ) return backup.restore(); if ( ! setCandidate( cand, causer_r ) ) return backup.restore(); if ( ! setStatus( installedEmpty() ? S_Install : S_Update, causer_r ) ) return backup.restore(); return true; } } break; case S_KeepInstalled: if ( ! i.empty() ) { if ( ! backup.forEach( i.begin(), i.end(), &StatusBackup::unlock, causer_r ) ) return backup.restore(); if ( ! backup.forEach( a.begin(), a.end(), &StatusBackup::unlock, causer_r ) ) return backup.restore(); return true; } break; case S_NoInst: if ( i.empty() ) { if ( ! backup.forEach( a.begin(), a.end(), &StatusBackup::unlock, causer_r ) ) return backup.restore(); return true; } break; } return false; } Status Selectable::Impl::pickStatus( const PoolItem & pi_r ) const { if ( pi_r.satSolvable().ident() != ident() ) return Status(-1); // not my PoolItem std::vector i; std::vector a; PoolItem ti; PoolItem ta; for_( it, installedBegin(), installedEnd() ) if ( identical( *it, pi_r ) ) { i.push_back( *it ); if ( ! ti && it->status().transacts() ) ti = *it; } for_( it, availableBegin(), availableEnd() ) if ( identical( *it, pi_r ) ) { a.push_back( *it ); if ( ! ta && it->status().transacts() ) ta = *it; } if ( ta ) { if ( ta.status().isByUser() ) return( i.empty() ? S_Install : S_Update ); else return( i.empty() ? S_AutoInstall : S_AutoUpdate ); } if ( ti ) { return( ti.status().isByUser() ? S_Del : S_AutoDel ); } for_( it, i.begin(), i.end() ) if ( it->status().isLocked() ) return S_Protected; if ( i.empty() ) { bool allALocked = true; for_( it, a.begin(), a.end() ) if ( ! it->status().isLocked() ) { allALocked = false; break; } if ( allALocked ) return S_Taboo; } // KEEP state: if ( ! i.empty() ) return S_KeepInstalled; // Report pseudo installed items as installed, if they are satisfied. if ( traits::isPseudoInstalled( kind() ) && ( ta ? ta : *a.begin() ).status().isSatisfied() ) // no installed, so we must have candidate return S_KeepInstalled; return S_NoInst; } /////////////////////////////////////////////////////////////////// ResStatus::TransactByValue Selectable::Impl::modifiedBy() const { PoolItem cand( candidateObj() ); if ( cand && cand.status().transacts() ) return cand.status().getTransactByValue(); if ( installedObj() && installedObj().status().transacts() ) return installedObj().status().getTransactByValue(); if ( cand ) return cand.status().getTransactByValue(); if ( installedObj() ) return installedObj().status().getTransactByValue(); return ResStatus::SOLVER; } ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ui/SelectableImpl.h000066400000000000000000000463751476576476200201120ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/SelectableImpl.h * */ #ifndef ZYPP_UI_SELECTABLEIMPL_H #define ZYPP_UI_SELECTABLEIMPL_H #include #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Selectable::Impl // /** Selectable implementation. * \note Implementation is based in PoolItem, just the Selectable * inteface restricts them to ResObject::constPtr. */ struct Selectable::Impl { public: using AvailableItemSet = SelectableTraits::AvailableItemSet; using available_iterator = SelectableTraits::available_iterator; using available_const_iterator = SelectableTraits::available_const_iterator; using available_size_type = SelectableTraits::available_size_type; using InstalledItemSet = SelectableTraits::InstalledItemSet; using installed_iterator = SelectableTraits::installed_iterator; using installed_const_iterator = SelectableTraits::installed_const_iterator; using installed_size_type = SelectableTraits::installed_size_type; using PickList = SelectableTraits::PickList; public: template Impl( const ResKind & kind_r, const std::string & name_r, TIterator begin_r, TIterator end_r ) : _ident( sat::Solvable::SplitIdent( kind_r, name_r ).ident() ) , _kind( kind_r ) , _name( name_r ) { for_( it, begin_r, end_r ) { if ( it->status().isInstalled() ) _installedItems.insert( *it ); else _availableItems.insert( *it ); } } public: /** */ IdString ident() const { return _ident; } /** */ ResKind kind() const { return _kind; } /** */ const std::string & name() const { return _name; } /** */ Status status() const; /** */ bool setStatus( Status state_r, ResStatus::TransactByValue causer_r ); /** Installed object (transacting ot highest version). */ PoolItem installedObj() const { if ( installedEmpty() ) return PoolItem(); PoolItem ret( transactingInstalled() ); return ret ? ret : *_installedItems.begin(); } /** Best among available objects. * The transacting candidate or the one scheduled to receive * the transact bit. */ PoolItem candidateObj() const { PoolItem ret( transactingCandidate() ); if ( ! ret ) ret = _candidate ? _candidate : defaultCandidate(); return ret; } /** Set a userCandidate (out of available objects). * \return The new userCandidate or NULL if choice was invalid * (not among availableObjs). */ PoolItem setCandidate( const PoolItem & newCandidate_r, ResStatus::TransactByValue causer_r ); /** The best candidate provided by a specific \ref Repository, if there is one. * In contrary to \ref candidateObj, this may return no item even if * there are available objects. This simply means the \ref Repository * does not provide this object. */ PoolItem candidateObjFrom( Repository repo_r ) const { for ( const PoolItem & pi : available() ) { if ( pi.isBlacklisted() ) continue; if ( pi.repository() == repo_r ) return pi; } return PoolItem(); } /** The best candidate for update, if there is one. * In contrary to \ref candidateObj, this may return no item even if * there are available objects. This simply means the best object is * already installed, and all available objects violate at least one * update policy. */ PoolItem updateCandidateObj() const { PoolItem defaultCand( defaultCandidate() ); // multiversionInstall: This returns the candidate for the last // instance installed. Actually we'd need a list here. if ( ! defaultCand || defaultCand.isBlacklisted() ) return PoolItem(); if ( installedEmpty() ) return defaultCand; // Here: installed and defaultCand are non NULL and it's not a // multiversion install. PoolItem installed( installedObj() ); // check vendor change if ( ! ( ResPool::instance().resolver().allowVendorChange() || VendorAttr::instance().equivalent( defaultCand->vendor(), installed->vendor() ) ) ) return PoolItem(); // check arch change (arch noarch changes are allowed) if ( defaultCand->arch() != installed->arch() && ! ( defaultCand->arch() == Arch_noarch || installed->arch() == Arch_noarch ) ) return PoolItem(); // check greater edition if ( defaultCand->edition() <= installed->edition() ) return PoolItem(); return defaultCand; } /** \copydoc Selectable::highestAvailableVersionObj()const */ PoolItem highestAvailableVersionObj() const { PoolItem ret; bool blacklistedOk = false; for ( const PoolItem & pi : available() ) { if ( !blacklistedOk && pi.isBlacklisted() ) { if ( ret ) break; // prefer a not retracted candidate blacklistedOk = true; } if ( !ret || pi.edition() > ret.edition() ) ret = pi; } return ret; } /** \copydoc Selectable::identIsAutoInstalled()const */ bool identIsAutoInstalled() const { return sat::Solvable::identIsAutoInstalled( ident() ); } /** \copydoc Selectable::identicalAvailable( const PoolItem & )const */ bool identicalAvailable( const PoolItem & rhs ) const { return bool(identicalAvailableObj( rhs )); } /** \copydoc Selectable::identicalInstalled( const PoolItem & )const */ bool identicalInstalled( const PoolItem & rhs ) const { return bool(identicalInstalledObj( rhs )); } /** \copydoc Selectable::identicalAvailableObj( const PoolItem & rhs ) const */ PoolItem identicalAvailableObj( const PoolItem & rhs ) const { if ( !availableEmpty() && rhs ) { for_( it, _availableItems.begin(), _availableItems.end() ) { if ( identical( *it, rhs ) ) return *it; } } return PoolItem(); } /** \copydoc Selectable::identicalInstalledObj( const PoolItem & rhs ) const */ PoolItem identicalInstalledObj( const PoolItem & rhs ) const { if ( !installedEmpty() && rhs ) { for_( it, _installedItems.begin(), _installedItems.end() ) { if ( identical( *it, rhs ) ) return *it; } } return PoolItem(); } /** Best among all objects. */ PoolItem theObj() const { PoolItem ret( candidateObj() ); if ( ret ) return ret; return installedObj(); } std::vector supersededBy() const { std::vector ret; if ( kind() == ResKind::package ) { for ( const PoolItem & pi : available() ) { ret = pi->asKind()->supersededBy(); if ( not ret.empty() ) break; } } return ret; } //////////////////////////////////////////////////////////////////////// bool availableEmpty() const { return _availableItems.empty(); } available_size_type availableSize() const { return _availableItems.size(); } available_iterator availableBegin() const { return _availableItems.begin(); } available_iterator availableEnd() const { return _availableItems.end(); } inline Iterable available() const { return makeIterable( availableBegin(), availableEnd() ); } //////////////////////////////////////////////////////////////////////// bool installedEmpty() const { return _installedItems.empty(); } installed_size_type installedSize() const { return _installedItems.size(); } installed_iterator installedBegin() const { return _installedItems.begin(); } installed_iterator installedEnd() const { return _installedItems.end(); } inline Iterable installed() const { return makeIterable( installedBegin(), installedEnd() ); } //////////////////////////////////////////////////////////////////////// const PickList & picklist() const { if ( ! _picklistPtr ) { _picklistPtr.reset( new PickList ); // installed without identical avaialble first: for ( const PoolItem & pi : installed() ) { if ( ! identicalAvailable( pi ) ) _picklistPtr->push_back( pi ); } _picklistPtr->insert( _picklistPtr->end(), availableBegin(), availableEnd() ); } return *_picklistPtr; } bool picklistEmpty() const { return picklist().empty(); } picklist_size_type picklistSize() const { return picklist().size(); } picklist_iterator picklistBegin() const { return picklist().begin(); } picklist_iterator picklistEnd() const { return picklist().end(); } //////////////////////////////////////////////////////////////////////// bool hasBlacklisted() const { // Blacklisted items are sorted to the end of the available list. return !_availableItems.empty() && _availableItems.rbegin()->isBlacklisted(); } bool hasBlacklistedInstalled() const { // Blacklisted items may be embedded in the installed list. for ( const PoolItem & pi : installed() ) { if ( pi.isBlacklisted() ) return true; } return false; } bool hasRetracted() const { for ( const PoolItem & pi : makeIterable( _availableItems.rbegin(), _availableItems.rend() ) ) { if ( not pi.isBlacklisted() ) break; if ( pi.isRetracted() ) return true; } return false; } bool hasRetractedInstalled() const { for ( const PoolItem & pi : installed() ) { if ( pi.isRetracted() ) return true; } return false; } bool hasPtf() const { for ( const PoolItem & pi : makeIterable( _availableItems.rbegin(), _availableItems.rend() ) ) { if ( not pi.isBlacklisted() ) break; if ( pi.isPtf() ) return true; } return false; } bool hasPtfInstalled() const { for ( const PoolItem & pi : installed() ) { if ( pi.isPtf() ) return true; } return false; } bool isUnmaintained() const { return availableEmpty(); } bool multiversionInstall() const { for ( const PoolItem & pi : picklist() ) { if ( pi.multiversionInstall() ) return true; } return false; } bool pickInstall( const PoolItem & pi_r, ResStatus::TransactByValue causer_r, bool yesno_r ); bool pickDelete( const PoolItem & pi_r, ResStatus::TransactByValue causer_r, bool yesno_r ); Status pickStatus( const PoolItem & pi_r ) const; bool setPickStatus( const PoolItem & pi_r, Status state_r, ResStatus::TransactByValue causer_r ); //////////////////////////////////////////////////////////////////////// bool isUndetermined() const { PoolItem cand( candidateObj() ); return ! cand || cand.isUndetermined(); } bool isRelevant() const { PoolItem cand( candidateObj() ); return cand && cand.isRelevant(); } bool isSatisfied() const { PoolItem cand( candidateObj() ); return cand && cand.isSatisfied(); } bool isBroken() const { PoolItem cand( candidateObj() ); return cand && cand.isBroken(); } /** Return who caused the modification. */ ResStatus::TransactByValue modifiedBy() const; /** Return value of LicenceConfirmed bit. */ bool hasLicenceConfirmed() const { return candidateObj() && candidateObj().status().isLicenceConfirmed(); } /** Set LicenceConfirmed bit. */ void setLicenceConfirmed( bool val_r ) { if ( candidateObj() ) candidateObj().status().setLicenceConfirmed( val_r ); } /** \copydoc Selectable::hasLocks()const */ bool hasLocks() const { for ( const PoolItem & pi : available() ) { if ( pi.status().isLocked() ) return true; } for ( const PoolItem & pi : installed() ) { if ( pi.status().isLocked() ) return true; } return false; } private: PoolItem transactingInstalled() const { for ( const PoolItem & pi : installed() ) { if ( pi.status().transacts() ) return pi; } return PoolItem(); } PoolItem transactingCandidate() const { for ( const PoolItem & pi : available() ) { if ( pi.status().transacts() ) return pi; } return PoolItem(); } PoolItem defaultCandidate() const { if ( ! installedEmpty() ) { // prefer the installed objects arch and vendor bool solver_allowVendorChange( ResPool::instance().resolver().allowVendorChange() ); for ( const PoolItem & ipi : installed() ) { PoolItem sameArch; // in case there's no same vendor at least stay with same arch. for ( const PoolItem & api : available() ) { // 'same arch' includes allowed changes to/from noarch. if ( ipi.arch() == api.arch() || ipi.arch() == Arch_noarch || api.arch() == Arch_noarch ) { if ( ! solver_allowVendorChange ) { if ( VendorAttr::instance().equivalent( ipi, api ) ) return api; else if ( ! sameArch ) // remember best same arch in case no same vendor found sameArch = api; } else // same arch is sufficient return api; } } if ( sameArch ) return sameArch; } } if ( _availableItems.empty() ) return PoolItem(); return *_availableItems.begin(); } bool allCandidatesLocked() const { for ( const PoolItem & pi : available() ) { if ( ! pi.status().isLocked() ) return false; } return( ! _availableItems.empty() ); } bool allInstalledLocked() const { for ( const PoolItem & pi : installed() ) { if ( ! pi.status().isLocked() ) return false; } return( ! _installedItems.empty() ); } private: const IdString _ident; const ResKind _kind; const std::string _name; InstalledItemSet _installedItems; AvailableItemSet _availableItems; //! The object selected by setCandidateObj() method. PoolItem _candidate; //! lazy initialized picklist mutable scoped_ptr _picklistPtr; }; /////////////////////////////////////////////////////////////////// /** \relates Selectable::Impl Stream output */ inline std::ostream & operator<<( std::ostream & str, const Selectable::Impl & obj ) { return str << '[' << obj.kind() << ']' << obj.name() << ": " << obj.status() << " (I " << obj.installedSize() << ")" << " (A " << obj.availableSize() << ")" << obj.candidateObj(); } /** \relates Selectable::Impl Stream output */ inline std::ostream & dumpOn( std::ostream & str, const Selectable::Impl & obj ) { str << '[' << obj.kind() << ']' << obj.name() << ": " << obj.status() << ( obj.multiversionInstall() ? " (multiversion)" : "") << endl; if ( obj.installedEmpty() ) str << " (I 0) {}" << endl << " "; else { PoolItem icand( obj.installedObj() ); str << " (I " << obj.installedSize() << ") {" << endl; for ( const PoolItem & pi : obj.installed() ) { char t = ' '; if ( pi == icand ) { t = 'i'; } str << " " << t << " " << pi << endl; } str << "} "; } if ( obj.availableEmpty() ) { str << "(A 0) {}" << endl << " "; } else { PoolItem cand( obj.candidateObj() ); PoolItem up( obj.updateCandidateObj() ); str << "(A " << obj.availableSize() << ") {" << endl; for ( const PoolItem & pi : obj.available() ) { char t = ' '; if ( pi == cand ) { t = pi == up ? 'C' : 'c'; } else if ( pi == up ) { t = 'u'; } str << " " << t << " " << pi << endl; } str << "} "; } if ( obj.picklistEmpty() ) { str << "(P 0) {}"; } else { PoolItem cand( obj.candidateObj() ); PoolItem up( obj.updateCandidateObj() ); str << "(P " << obj.picklistSize() << ") {" << endl; for ( const PoolItem & pi : obj.picklist() ) { char t = ' '; if ( pi == cand ) { t = pi == up ? 'C' : 'c'; } else if ( pi == up ) { t = 'u'; } str << " " << t << " " << pi << "\t" << obj.pickStatus( pi ) << endl; } str << "} "; } return str; } ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_UI_SELECTABLEIMPL_H libzypp-17.36.5/zypp/ui/SelectableTraits.h000066400000000000000000000121321476576476200204370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/SelectableTraits.h * */ #ifndef ZYPP_UI_SELECTABLETRAITS_H #define ZYPP_UI_SELECTABLETRAITS_H #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : SelectableTraits // /** */ struct SelectableTraits { /** Oder on AvailableItemSet. * \li not blacklisted * \li repository priority * \li best Arch (arch/noarch changes are ok) * \li best Edition * \li newer buildtime * \li ResObject::constPtr as fallback. */ struct AVOrder { // NOTE: operator() provides LESS semantics to order the set. // So LESS means 'prior in set'. We want 'better' archs and // 'better' editions at the beginning of the set. So we return // TRUE if (lhs > rhs)! // bool operator()( const PoolItem & lhs, const PoolItem & rhs ) const { if ( lhs.isBlacklisted() != rhs.isBlacklisted() ) return rhs.isBlacklisted(); int lprio = lhs->satSolvable().repository().satInternalPriority(); int rprio = rhs->satSolvable().repository().satInternalPriority(); if ( lprio != rprio ) return( lprio > rprio ); // arch/noarch changes are ok. if ( lhs->arch() != Arch_noarch && rhs->arch() != Arch_noarch ) { int res = lhs->arch().compare( rhs->arch() ); if ( res ) return res > 0; } int res = lhs->edition().compare( rhs->edition() ); if ( res ) return res > 0; lprio = lhs->buildtime(); rprio = rhs->buildtime(); if ( lprio != rprio ) return( lprio > rprio ); lprio = lhs->satSolvable().repository().satInternalSubPriority(); rprio = rhs->satSolvable().repository().satInternalSubPriority(); if ( lprio != rprio ) return( lprio > rprio ); // no more criteria, still equal: sort by id return lhs.satSolvable().id() < rhs.satSolvable().id(); } }; /** Oder on InstalledItemSet. * \li best Arch * \li best Edition * \li newer install time * \li ResObject::constPtr as fallback. */ struct IOrder { // NOTE: operator() provides LESS semantics to order the set. // So LESS means 'prior in set'. We want 'newer' install time // at the beginning of the set. // bool operator()( const PoolItem & lhs, const PoolItem & rhs ) const { int res = lhs->arch().compare( rhs->arch() ); if ( res ) return res > 0; res = lhs->edition().compare( rhs->edition() ); if ( res ) return res > 0; Date ldate = lhs->installtime(); Date rdate = rhs->installtime(); if ( ldate != rdate ) return( ldate > rdate ); // no more criteria, still equal: sort by id return lhs.satSolvable().id() < rhs.satSolvable().id(); } }; using AvailableItemSet = std::set; using available_iterator = AvailableItemSet::iterator; using available_const_iterator = AvailableItemSet::const_iterator; using available_size_type = AvailableItemSet::size_type; using InstalledItemSet = std::set; using installed_iterator = AvailableItemSet::iterator; using installed_const_iterator = AvailableItemSet::const_iterator; using installed_size_type = AvailableItemSet::size_type; using PickList = std::vector; using picklist_iterator = PickList::const_iterator; using picklist_size_type = PickList::size_type; }; /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_UI_SELECTABLETRAITS_H libzypp-17.36.5/zypp/ui/Status.cc000066400000000000000000000037751476576476200166430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/Status.cc * */ #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : asString ** FUNCTION TYPE : std::string */ std::string asString( const Status & obj ) { switch ( obj ) { #define ENUM_OUT(V) case V: return #V; break ENUM_OUT( S_Protected ); ENUM_OUT( S_Taboo ); ENUM_OUT( S_Del ); ENUM_OUT( S_Install ); ENUM_OUT( S_Update ); ENUM_OUT( S_AutoDel ); ENUM_OUT( S_AutoInstall ); ENUM_OUT( S_AutoUpdate ); ENUM_OUT( S_NoInst ); ENUM_OUT( S_KeepInstalled ); #undef ENUM_OUT } INT << "Unknown ui::Status " << (unsigned)obj << std::endl; return "Status(UNKNOWN)"; } ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/ui/Status.h000066400000000000000000000060321476576476200164720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ui/Status.h * */ #ifndef ZYPP_UI_STATUS_H #define ZYPP_UI_STATUS_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace ui { ///////////////////////////////////////////////////////////////// /** UI status * Status values calculated by \ref Selectable. * \note The \ref Status enum, and its use within \ref Selectabe * is tightly related to the Y2UI. It might be not very useful * outside the Y2UI. * * \todo make it an EnumerationClass */ enum Status { S_Protected, // Keep this unmodified ( have installedObj && S_Protected ) S_Taboo, // Keep this unmodified ( have no installedObj && S_Taboo) // requested by user: S_Del, // delete installedObj ( clears S_Protected if set ) S_Update, // install candidateObj ( have installedObj, clears S_Protected if set ) S_Install, // install candidateObj ( have no installedObj, clears S_Taboo if set ) // not requested by user: S_AutoDel, // delete installedObj S_AutoUpdate, // install candidateObj ( have installedObj ) S_AutoInstall, // install candidateObj ( have no installedObj ) // no modification: S_KeepInstalled, // no modification ( have installedObj && !S_Protected, clears S_Protected if set ) S_NoInst, // no modification ( have no installedObj && !S_Taboo, clears S_Taboo if set ) }; /////////////////////////////////////////////////////////////////// /** \relates Status Enum value as string. */ std::string asString( const Status & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// /** \relates Status Stream output */ inline std::ostream & operator<<( std::ostream & str, const Status & obj ) { return str << asString( obj ); } ///////////////////////////////////////////////////////////////// } // namespace ui /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_UI_STATUS_H libzypp-17.36.5/zypp/ui/UserWantedPackages.cc000066400000000000000000000076561476576476200211020ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/ui/UserWantedPackages.cc * * \author Stefan Hundhammer * */ #include #include #include #include #include #include #include #include using std::string; using std::set; using std::endl; namespace zypp { namespace ui { using PoolProxyIterator = ResPoolProxy::const_iterator; static inline ResPoolProxy poolProxy() { return getZYpp()->poolProxy(); } template PoolProxyIterator poolProxyBegin() { return poolProxy().byKindBegin(); } template PoolProxyIterator poolProxyEnd() { return poolProxy().byKindEnd(); } static inline PoolProxyIterator pkgBegin() { return poolProxyBegin(); } static inline PoolProxyIterator pkgEnd() { return poolProxyEnd(); } static inline PoolProxyIterator patchesBegin() { return poolProxyBegin(); } static inline PoolProxyIterator patchesEnd() { return poolProxyEnd(); } template bool contains( const std::set & container, T search ) { return container.find( search ) != container.end(); } static void addDirectlySelectedPackages ( set & pkgNames ); template void addPkgSetPackages( set & pkgNames ); static void addPatchPackages ( set & pkgNames ); set userWantedPackageNames() { set pkgNames; DBG << "Collecting packages the user explicitly asked for" << endl; addDirectlySelectedPackages ( pkgNames ); addPatchPackages ( pkgNames ); return pkgNames; } static void addDirectlySelectedPackages( set & pkgNames ) { for ( PoolProxyIterator it = pkgBegin(); it != pkgEnd(); ++it ) { // Add all packages the user wanted to transact directly, // no matter what the transaction is (install, update, delete) if ( (*it)->toModify() && (*it)->modifiedBy() == ResStatus::USER ) { DBG << "Explicit user transaction on pkg \"" << (*it)->name() << "\"" << endl; pkgNames.insert( (*it)->name() ); } } } static void addPatchPackages( set & pkgNames ) { for ( PoolProxyIterator patch_it = patchesBegin(); patch_it != patchesEnd(); ++patch_it ) { Patch::constPtr patch = dynamic_pointer_cast( (*patch_it)->theObj() ? (*patch_it)->theObj().resolvable() : 0 ); if ( patch && (*patch_it)->toModify() ) { DBG << "Patch will be transacted: \"" << patch->name() << "\" - \"" << patch->summary() << "\"" << endl; Patch::Contents contents( patch->contents() ); for_( it, contents.begin(), contents.end() ) { pkgNames.insert( it->name() ); } } } } } // namespace ui } // namespace zypp libzypp-17.36.5/zypp/ui/UserWantedPackages.h000066400000000000000000000031171476576476200207300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/ui/UserWantedPackages.h * * \author Stefan Hundhammer * */ #ifndef USER_WANTED_PACKAGES_H #define USER_WANTED_PACKAGES_H #include #include namespace zypp { namespace ui { /** * This returns a set of package names the user explicitly wanted to * transact ( to install, to update, or to delete) for any of the * following reasons: * * - The user wanted to transact the pkg directly * * - Pkg is part of a pattern the user wanted to transact * - Pkg is part of a language the user wanted to transact * (? No more transacting Languages) * - Pkg is part of a patch the user wanted to transact * * - Pkg is part of a pattern that is required by a pattern the * user wanted to transact **/ std::set userWantedPackageNames() ZYPP_API; } // namespace ui } // namespace zypp #endif // USER_WANTED_PACKAGES_H libzypp-17.36.5/zypp/url/000077500000000000000000000000001476576476200152225ustar00rootroot00000000000000libzypp-17.36.5/zypp/url/UrlBase.h000066400000000000000000000000431476576476200167250ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/url/UrlException.h000066400000000000000000000000501476576476200200070ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/url/UrlUtils.h000066400000000000000000000000441476576476200171540ustar00rootroot00000000000000#include libzypp-17.36.5/zypp/zypp_detail/000077500000000000000000000000001476576476200167445ustar00rootroot00000000000000libzypp-17.36.5/zypp/zypp_detail/ZYppImpl.cc000066400000000000000000000252711476576476200210060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/zypp_detail/ZYppImpl.cc * */ #include #include #include #include #include #include #include #include #include #include #include #include #include // JobReport::instance using std::endl; #include #include #include namespace { // Helper pipe to safely signal libzypp's poll code // to stop polling and throw a user abort exception. // Due to the pain that is unix signal handling we need // to use atomics and be very careful about what we are calling. // // Not cleaned up, this happens when the application that is using libzypp // exits. volatile sig_atomic_t shutdownPipeRead{-1}; volatile sig_atomic_t shutdownPipeWrite{-1}; bool makeShutdownPipe() { int pipeFds[]{ -1, -1 }; #ifdef HAVE_PIPE2 if ( ::pipe2( pipeFds, O_CLOEXEC ) != 0 ) return false; #else if ( ::pipe( pipeFds ) != 0 ) return false; ::fcntl( pipeFds[0], F_SETFD, O_CLOEXEC ); ::fcntl( pipeFds[1], F_SETFD, O_CLOEXEC ); #endif shutdownPipeRead = pipeFds[0]; shutdownPipeWrite = pipeFds[1]; return true; } const bool ensureShutdownPipe() { static auto pipesInitialized = makeShutdownPipe(); return pipesInitialized; } const int shutdownPipeReadFd() { if ( !ensureShutdownPipe() ) return -1; return static_cast(shutdownPipeRead); } const int shutdownPipeWriteFd() { return static_cast(shutdownPipeWrite); } } /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace media { ScopedDisableMediaChangeReport::ScopedDisableMediaChangeReport( bool condition_r ) { static weak_ptr > globalguard; if ( condition_r && ! (_guard = globalguard.lock()) ) { // aquire a new one.... _guard.reset( new callback::TempConnect() ); globalguard = _guard; } } } // namespace media /////////////////////////////////////////////////////////////////// callback::SendReport & JobReport::instance() { static callback::SendReport _report; return _report; } /////////////////////////////////////////////////////////////////// namespace zypp_detail { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : ZYppImpl::ZYppImpl // METHOD TYPE : Constructor // ZYppImpl::ZYppImpl() : _target( nullptr ) , _resolver( new Resolver( ResPool::instance()) ) { // trigger creation of the shutdown pipe if ( !ensureShutdownPipe() ) WAR << "Failed to create shutdown pipe" << std::endl; ZConfig::instance().about( MIL ); MIL << "Initializing keyring..." << std::endl; _keyring = new KeyRing(tmpPath()); _keyring->allowPreload( true ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : ZYppImpl::~ZYppImpl // METHOD TYPE : Destructor // ZYppImpl::~ZYppImpl() {} //------------------------------------------------------------------------ // add/remove resolvables DiskUsageCounter::MountPointSet ZYppImpl::diskUsage() { if ( ! _disk_usage ) { setPartitions( DiskUsageCounter::detectMountPoints() ); } return _disk_usage->disk_usage(pool()); } void ZYppImpl::setPartitions(const DiskUsageCounter::MountPointSet &mp) { _disk_usage.reset(new DiskUsageCounter()); _disk_usage->setMountPoints(mp); } DiskUsageCounter::MountPointSet ZYppImpl::getPartitions() const { if (_disk_usage) return _disk_usage->getMountPoints(); else return DiskUsageCounter::detectMountPoints(); } //------------------------------------------------------------------------ // target Target_Ptr ZYppImpl::target() const { if (! _target) ZYPP_THROW(Exception("Target not initialized.")); return _target; } void ZYppImpl::changeTargetTo( const Target_Ptr& newtarget_r ) { if ( _target && newtarget_r ) // bsc#1203760: Make sure the old target is deleted before a new one is created! INT << "2 active targets at the same time must not happen!" << endl; _target = newtarget_r; ZConfig::instance().notifyTargetChanged(); resolver()->setDefaultSolverFlags( /*all_r*/false ); // just changed defaults } void ZYppImpl::initializeTarget( const Pathname & root, bool doRebuild_r ) { MIL << "initTarget( " << root << (doRebuild_r?", rebuilddb":"") << ")" << endl; if (_target) { if (_target->root() == root) { MIL << "Repeated call to initializeTarget()" << endl; return; } _target->unload(); _target = nullptr; // bsc#1203760: Make sure the old target is deleted before a new one is created! } changeTargetTo( new Target( root, doRebuild_r ) ); _target->buildCache(); } void ZYppImpl::finishTarget() { if (_target) _target->unload(); changeTargetTo( nullptr ); } //------------------------------------------------------------------------ // commit /** \todo Remove workflow from target, lot's of it could be done here, * and target used for transact. */ ZYppCommitResult ZYppImpl::commit( const ZYppCommitPolicy & policy_r ) { if ( getenv("ZYPP_TESTSUITE_FAKE_ARCH") ) { ZYPP_THROW( Exception("ZYPP_TESTSUITE_FAKE_ARCH set. Commit not allowed and disabled.") ); } MIL << "Attempt to commit (" << policy_r << ")" << endl; if (! _target) ZYPP_THROW( Exception("Target not initialized.") ); env::ScopedSet ea { "ZYPP_IS_RUNNING", str::numstring(getpid()).c_str() }; env::ScopedSet eb; if ( _target->chrooted() ) eb = env::ScopedSet( "SYSTEMD_OFFLINE", "1" ); // bsc#1118758 - indicate no systemd if chrooted install ZYppCommitResult res = _target->_pimpl->commit( pool(), policy_r ); if (! policy_r.dryRun() ) { if ( policy_r.syncPoolAfterCommit() ) { // reload new status from target DBG << "reloading " << sat::Pool::instance().systemRepoAlias() << " repo to pool" << endl; _target->load(); } else { DBG << "unloading " << sat::Pool::instance().systemRepoAlias() << " repo from pool" << endl; _target->unload(); } } MIL << "Commit (" << policy_r << ") returned: " << res << endl; return res; } void ZYppImpl::installSrcPackage( const SrcPackage_constPtr & srcPackage_r ) { if (! _target) ZYPP_THROW( Exception("Target not initialized.") ); _target->_pimpl->installSrcPackage( srcPackage_r ); } ManagedFile ZYppImpl::provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ) { if (! _target) ZYPP_THROW( Exception("Target not initialized.") ); return _target->_pimpl->provideSrcPackage( srcPackage_r ); } //------------------------------------------------------------------------ // target store path Pathname ZYppImpl::homePath() const { return _home_path.empty() ? Pathname("/var/lib/zypp") : _home_path; } void ZYppImpl::setHomePath( const Pathname & path ) { _home_path = path; } Pathname ZYppImpl::tmpPath() const { return zypp::myTmpDir(); } void ZYppImpl::setShutdownSignal() { // ONLY signal safe code here, that means no logging or anything else that is more than using atomics // or writing a fd int sigFd = shutdownPipeWriteFd(); if ( sigFd == -1 ) { // we have no fd to set this return; } zyppng::eintrSafeCall( write, sigFd, "1", 1 ); } void ZYppImpl::clearShutdownSignal() { // ONLY signal safe code here, that means no logging or anything else that is more than using atomics // or writing a fd int sigFd = shutdownPipeWriteFd(); if ( sigFd == -1 ) { // we have no fd so nothing to clear return; } char buf = 0; while( zyppng::eintrSafeCall( read, sigFd, &buf, 1 ) > 0 ) continue; } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const ZYppImpl & obj ) { return str << "ZYppImpl"; } int zypp_poll( std::vector &fds, int timeout) { // request a shutdown fd we can use const auto shutdownFd = shutdownPipeReadFd(); if (shutdownFd == -1) { ZYPP_THROW( zypp::Exception("Failed to get shutdown pipe") ); } fds.push_back( GPollFD { .fd = shutdownFd, .events = G_IO_IN, .revents = 0 }); // make sure to remove our fd again OnScopeExit removeShutdownFd( [&](){ fds.pop_back(); } ); int r = zyppng::eintrSafeCall( g_poll, fds.data(), fds.size(), timeout ); if ( r > 0 ) { // at least one fd triggered, if its our's we throw if ( fds.back().revents ) ZYPP_THROW( UserRequestException( UserRequestException::ABORT, "Shutdown signal received during poll." ) ); } return r; } ///////////////////////////////////////////////////////////////// } // namespace zypp_detail /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp/zypp_detail/ZYppImpl.h000066400000000000000000000120651476576476200206450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/zypp_detail/ZYppImpl.h * */ #ifndef ZYPP_ZYPP_DETAIL_ZYPPIMPL_H #define ZYPP_ZYPP_DETAIL_ZYPPIMPL_H #include #include #include #include #include #include #include #include #include using GPollFD = struct _GPollFD; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp_detail { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ZYppImpl // /** */ class ZYppImpl { friend std::ostream & operator<<( std::ostream & str, const ZYppImpl & obj ); public: /** Default ctor */ ZYppImpl(); /** Dtor */ ~ZYppImpl(); public: /** */ ResPool pool() const { return ResPool::instance(); } ResPoolProxy poolProxy() const { return ResPool::instance().proxy(); } /** */ KeyRing_Ptr keyRing() const { return _keyring; } Resolver_Ptr resolver() const { return _resolver; } public: /** \todo Signal locale change. */ /** * \throws Exception */ Target_Ptr target() const; /** Same as \ref target but returns NULL if target is not * initialized, instead of throwing. */ Target_Ptr getTarget() const { return _target; } /** * \throws Exception * true, just init the target, dont populate store or pool */ void initializeTarget( const Pathname & root, bool doRebuild_r ); /** * \throws Exception */ void finishTarget(); /** Commit changes and transactions. */ ZYppCommitResult commit( const ZYppCommitPolicy & policy_r ); /** Install a source package on the Target. */ void installSrcPackage( const SrcPackage_constPtr & srcPackage_r ); /** Install a source package on the Target. */ ManagedFile provideSrcPackage( const SrcPackage_constPtr & srcPackage_r ); public: /** Get the path where zypp related plugins store persistent data and caches */ Pathname homePath() const; /** Get the path where zypp related plugins store tmp data */ Pathname tmpPath() const; /** set the home, if you need to change it */ void setHomePath( const Pathname & path ); public: DiskUsageCounter::MountPointSet diskUsage(); void setPartitions(const DiskUsageCounter::MountPointSet &mp); DiskUsageCounter::MountPointSet getPartitions() const; public: /** Hook for actions to trigger if the Target changes (initialize/finish) */ void changeTargetTo( const Target_Ptr& newtarget_r ); /** * Enable the shutdown signal for \ref zypp_poll calls */ static void setShutdownSignal(); /** * Disable the shutdown signal for \ref zypp_poll calls */ static void clearShutdownSignal(); private: /** */ Target_Ptr _target; /** */ Resolver_Ptr _resolver; KeyRing_Ptr _keyring; /** */ Pathname _home_path; /** defined mount points, used for disk usage counting */ shared_ptr _disk_usage; }; /////////////////////////////////////////////////////////////////// /** \relates ZYppImpl Stream output */ std::ostream & operator<<( std::ostream & str, const ZYppImpl & obj ); /** * Small wrapper around g_poll that additionally listens to the shutdown FD * returned by \ref ZYpp::shutdownSignalFd. * * EINTR is handled internally, no need to explicitely handle it. * * For zyppng related code we should use different means to cancel processes, * e.g via the top level event loop * * \throws zypp::UserAbortException in case the shutdown signal was received */ int zypp_poll( std::vector &fds, int timeout = -1 ); ///////////////////////////////////////////////////////////////// } // namespace zypp_detail /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPP_DETAIL_ZYPPIMPL_H libzypp-17.36.5/zypp/zypp_detail/ZYppReadOnlyHack.h000066400000000000000000000030151476576476200222430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/zypp_detail/ZYppReadOnlyHack.h * */ #ifndef ZYPP_ZYPP_DETAIL_ZYPPREADONLYHACK_H #define ZYPP_ZYPP_DETAIL_ZYPPREADONLYHACK_H #warning ZYPP_ZYPP_DETAIL_ZYPPREADONLYHACK_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp_readonly_hack { ///////////////////////////////////////////////////////////////// extern void IWantIt() ZYPP_DEPRECATED; ///////////////////////////////////////////////////////////////// } // namespace zypp_readonly_hack /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_ZYPP_DETAIL_ZYPPREADONLYHACK_H libzypp-17.36.5/zypp/zypp_detail/keyring_p.h000066400000000000000000000016211476576476200211040ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-common/private/keyring_p.h * */ #ifndef ZYPP_ZYPP_DETAIL_KEYRINGIMPL_H #define ZYPP_ZYPP_DETAIL_KEYRINGIMPL_H #include #include namespace zypp { struct KeyRing::Impl : public KeyRingImpl { Impl(const filesystem::Pathname &baseTmpDir); }; } #endif libzypp-17.36.5/zypp/zypp_detail/urlcredentialextractor_p.h000066400000000000000000000057311476576476200242330ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/zypp_detail/urlcredentialextractor_p.h * */ #ifndef ZYPP_ZYPP_DETAIL_URLCREDENTIALEXTRACTOR_P_H #define ZYPP_ZYPP_DETAIL_URLCREDENTIALEXTRACTOR_P_H #include #include namespace zypp { /////////////////////////////////////////////////////////////////// /// \class UrlCredentialExtractor /// \brief Extract credentials in \ref Url authority and store them via \ref CredentialManager. /// /// Lazy init CredentialManager and save collected credentials when /// going out of scope. /// /// Methods return whether a password has been collected/extracted. /// /// \code /// UrlCredentialExtractor( "/rootdir" ).collect( oneUrlOrUrlContainer ); /// \endcode /// \code /// { /// UrlCredentialExtractor extractCredentials; /// extractCredentials.collect( oneUrlOrUrlContainer ); /// extractCredentials.extract( oneMoreUrlOrUrlContainer ); /// .... /// } /// \endcode /// class UrlCredentialExtractor { public: UrlCredentialExtractor( const Pathname & root_r ) : _root( root_r ) {} UrlCredentialExtractor( Pathname & root_r ) : _root( root_r ) {} ~UrlCredentialExtractor() { if ( _cmPtr ) _cmPtr->save(); } /** Remember credentials stored in URL authority leaving the password in \a url_r. */ bool collect( const Url & url_r ) { bool ret = url_r.hasCredentialsInAuthority(); if ( ret ) { if ( !_cmPtr ) _cmPtr.reset( new media::CredentialManager( _root ) ); _cmPtr->addUserCred( url_r ); } return ret; } /** \overload operating on Url container */ template bool collect( const TContainer & urls_r ) { bool ret = false; for ( const Url & url : urls_r ) { if ( collect( url ) && !ret ) ret = true; } return ret; } /** Remember credentials stored in URL authority stripping the passowrd from \a url_r. */ bool extract( Url & url_r ) { bool ret = collect( url_r ); if ( ret ) url_r.setPassword( std::string() ); return ret; } /** \overload operating on Url container */ template bool extract( TContainer & urls_r ) { bool ret = false; for ( Url & url : urls_r ) { if ( extract( url ) && !ret ) ret = true; } return ret; } private: const Pathname & _root; scoped_ptr _cmPtr; }; } #endif libzypp-17.36.5/zyppng/000077500000000000000000000000001476576476200147455ustar00rootroot00000000000000libzypp-17.36.5/zyppng/CMakeLists.txt000066400000000000000000000011121476576476200175000ustar00rootroot00000000000000project(zyppng) SET ( CMAKE_CXX_STANDARD 20 ) SET ( CMAKE_CXX_EXTENSIONS OFF ) SET ( zyppng_lib_SRCS ) # Default loggroup for all files #SET_LOGGROUP( "zypp" ${zyppng_lib_SRCS} ) if ( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK ) message(NOTICE "Enabling static analysis: ${ZYPP_CXX_CLANG_TIDY} ${ZYPP_CXX_CPPCHECK}") if (ZYPP_CXX_CLANG_TIDY) set( CMAKE_CXX_CLANG_TIDY ${ZYPP_CXX_CLANG_TIDY} ) endif(ZYPP_CXX_CLANG_TIDY) if (ZYPP_CXX_CPPCHECK) set(CMAKE_CXX_CPPCHECK ${ZYPP_CXX_CPPCHECK}) endif(ZYPP_CXX_CPPCHECK) endif( ZYPP_CXX_CLANG_TIDY OR ZYPP_CXX_CPPCHECK )

_dp; // disabled Digest(const Digest& d) = delete; // disabled const Digest& operator=(const Digest& d) = delete; public: // moving is fine Digest(Digest&& other) noexcept; Digest& operator=( Digest&& other) noexcept; /** \name Well known digest algorithm names. */ //@{ /** md5 */ static const std::string & md5(); /** sha1 */ static const std::string & sha1(); /** sha224 */ static const std::string & sha224(); /** sha256 */ static const std::string & sha256(); /** sha384 */ static const std::string & sha384(); /** sha512 */ static const std::string & sha512(); //@} public: Digest(); ~Digest(); /** \brief initialize creation of a new message digest * * Since openssl is used as backend you may use anything that openssl * supports (see man 1 dgst). Common examples are md5 or sha1. sha1 * should be preferred when creating digests to verify the authenticity * of something. * * successive calls to this funcion will destroy the internal state and * reinit from scratch * * @param name name of the message digest algorithm. * @return whether an error occured * */ bool create(const std::string& name); /** \brief get the name of the current digest algorithm */ const std::string& name(); /** \brief feed data into digest computation algorithm * @param bytes * @param len * @return whether an error occured * */ bool update(const char* bytes, size_t len); /** \brief feed data into digest computation algorithm * @param is * @param bufsize * @return whether an error occured * */ bool update(std::istream& is, size_t bufsize = 4096); /** * Returns the number of input bytes that have been added to the hash */ zypp::ByteCount bytesHashed () const; /** \brief get hex string representation of the digest * * this function will finalize the digest computation. calls to update * after this function will start from scratch * * @return hex string representation of the digest * */ std::string digest(); /** \brief get hex string representation of the digest vector given as parameter * * @return hex string representation of the digest * */ static std::string digestVectorToString ( const UByteArray &vec ); #ifdef __cpp_lib_string_view /** \brief convert the hex string representation of the digest vector given as parameter into the actual byte array representation * * @return hex string representation of the digest * */ static ByteArray hexStringToByteArray ( std::string_view str ); static UByteArray hexStringToUByteArray ( std::string_view str ); #endif /** \brief get vector of unsigned char representation of the digest * * this function will finalize the digest computation. calls to update * after this function will start from scratch * * @return vector representation of the digest * */ UByteArray digestVector(); /** \brief reset internal digest state * * this function is equivalent to calling create() with an unchanged name, * but it may be implemented in a more efficient way. */ bool reset(); /** * Returns a clone of the current Digest and returns it. * This is the same as manually creating a Digest with the same name ( so no * checksum calculation state is copied ) */ Digest clone() const; /** \brief compute digest of a stream. convenience function * * calls create, update and digest in one function. The data for the * computation is read from the stream * * @param name name of the digest algorithm, \see create * @param is an input stream to get the data from * @param bufsize size of the buffer used for update(). Be careful, this is on the stack. * @return the digest or empty on error * */ static std::string digest(const std::string& name, std::istream& is, size_t bufsize = 4096); /** \overload Reading input data from \c string. */ static std::string digest( const std::string & name, const std::string & input, size_t bufsize = 4096 ); }; } // namespace zypp #endif libzypp-17.36.5/zypp-core/ExternalProgram.cc000066400000000000000000000427341476576476200210010ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ExternalProgram.cc */ #define _GNU_SOURCE 1 // for ::getline #include #include #include #include #include #include // openpty #include // setenv #include // prctl(), PR_SET_PDEATHSIG #include // strsignal #include #include #include #include #include #include #include #include #include #include using std::endl; #undef ZYPP_BASE_LOGGER_LOGGROUP #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::exec" namespace zypp { ExternalProgram::ExternalProgram() {} ExternalProgram::ExternalProgram( const std::string& commandline, Stderr_Disposition stderr_disp, bool use_pty, int stderr_fd, bool default_locale, const Pathname & root ) { const char *argv[4]; argv[0] = "/bin/sh"; argv[1] = "-c"; argv[2] = commandline.c_str(); argv[3] = 0; start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty ); } ExternalProgram::ExternalProgram( const Arguments & argv, Stderr_Disposition stderr_disp, bool use_pty, int stderr_fd, bool default_locale, const Pathname & root ) { const char * argvp[argv.size() + 1]; unsigned c = 0; for ( const std::string & arg : argv ) { argvp[c] = arg.c_str(); ++c; } argvp[c] = 0; start_program( argvp, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty ); } ExternalProgram::ExternalProgram( const Arguments & argv, const Environment & environment, Stderr_Disposition stderr_disp, bool use_pty, int stderr_fd, bool default_locale, const Pathname & root ) { const char * argvp[argv.size() + 1]; unsigned c = 0; for ( const std::string & arg : argv ) { argvp[c] = arg.c_str(); ++c; } argvp[c] = 0; start_program( argvp, environment, stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty ); } ExternalProgram::ExternalProgram( const char *const *argv, Stderr_Disposition stderr_disp, bool use_pty, int stderr_fd, bool default_locale, const Pathname & root ) { start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty ); } ExternalProgram::ExternalProgram( const char *const * argv, const Environment & environment, Stderr_Disposition stderr_disp, bool use_pty, int stderr_fd, bool default_locale, const Pathname & root ) { start_program( argv, environment, stderr_disp, stderr_fd, default_locale, root.c_str(), false, false, use_pty ); } ExternalProgram::ExternalProgram( const char *binpath, const char *const *argv_1, bool use_pty ) { int i = 0; while (argv_1[i++]) ; const char *argv[i + 1]; argv[0] = binpath; memcpy( &argv[1], argv_1, (i - 1) * sizeof (char *) ); start_program( argv, Environment(), Normal_Stderr, 1, false, NULL, false, false, use_pty ); } ExternalProgram::ExternalProgram( const char *binpath, const char *const *argv_1, const Environment & environment, bool use_pty ) { int i = 0; while (argv_1[i++]) ; const char *argv[i + 1]; argv[0] = binpath; memcpy( &argv[1], argv_1, (i - 1) * sizeof (char *) ); start_program( argv, environment, Normal_Stderr, 1, false, NULL, false, false, use_pty ); } ExternalProgram::~ExternalProgram() { } void ExternalProgram::start_program( const char *const *argv, const Environment & environment, Stderr_Disposition stderr_disp, int stderr_fd, bool default_locale, const char * root , bool switch_pgid, bool die_with_parent , bool usePty ) { if ( _backend ) return; // usePty is only supported by the forking backend if ( usePty ) { DBG << "usePty was set, forcing the ForkSpawnEngine to start external processes" << std::endl; _backend = std::make_unique(); static_cast(*_backend).setUsePty( true ); } else { _backend = zyppng::AbstractSpawnEngine::createDefaultEngine(); } // retrieve options at beginning of arglist const char * redirectStdin = nullptr; // <[file] const char * redirectStdout = nullptr; // >[file] const char * chdirTo = nullptr; // #/[path] if ( root ) { if ( root[0] == '\0' ) { root = nullptr; // ignore empty root } else if ( root[0] == '/' && root[1] == '\0' ) { // If root is '/' do not chroot, but chdir to '/' // unless arglist defines another dir. chdirTo = "/"; root = nullptr; } } for ( bool strip = false; argv[0] != nullptr; ++argv ) { strip = false; switch ( argv[0][0] ) { case '<': strip = true; redirectStdin = argv[0]+1; if ( *redirectStdin == '\0' ) redirectStdin = "/dev/null"; break; case '>': strip = true; redirectStdout = argv[0]+1; if ( *redirectStdout == '\0' ) redirectStdout = "/dev/null"; break; case '#': strip = true; if ( argv[0][1] == '/' ) // #/[path] chdirTo = argv[0]+1; break; } if ( ! strip ) break; } // those are the FDs that the new process will receive // AutoFD will take care of closing them on our side zypp::AutoFD stdinFd = -1; zypp::AutoFD stdoutFd = -1; zypp::AutoFD stderrFd = -1; // those are the fds we will keep, we put them into autofds in case // we need to return early without actually spawning the new process zypp::AutoFD childStdinParentFd = -1; zypp::AutoFD childStdoutParentFd = -1; if ( usePty ) { int master_tty = 0, slave_tty = 0; // fds for pair of ttys // Create pair of ttys DBG << "Using ttys for communication with " << argv[0] << endl; if ( zyppng::eintrSafeCall( ::openpty, &master_tty, &slave_tty, (char *)0, (termios *)0, (winsize *)0) != 0) { _backend->setExecError( str::form( _("Can't open pty (%s)."), strerror(errno) ) ); _backend->setExitStatus( 126 ); ERR << _backend->execError() << endl; return; } stdinFd = slave_tty; stdoutFd = slave_tty; childStdinParentFd = master_tty; childStdoutParentFd = master_tty; } else { if ( redirectStdin ) { stdinFd = open( redirectStdin, O_RDONLY ); } else { int to_external[2]; if ( pipe (to_external) != 0 ) { _backend->setExecError( str::form( _("Can't open pipe (%s)."), strerror(errno) ) ); _backend->setExitStatus( 126 ); ERR << _backend->execError() << endl; return; } stdinFd = to_external[0]; childStdinParentFd = to_external[1]; } if ( redirectStdout ) { stdoutFd = open( redirectStdout, O_WRONLY|O_CREAT|O_APPEND, 0600 ); } else { int from_external[2]; // Create pair of pipes if ( pipe (from_external) != 0 ) { _backend->setExecError( str::form( _("Can't open pipe (%s)."), strerror(errno) ) ); _backend->setExitStatus( 126 ); ERR << _backend->execError() << endl; return; } stdoutFd = from_external[1]; childStdoutParentFd = from_external[0]; } } // Handle stderr if (stderr_disp == Discard_Stderr) { stderrFd = open("/dev/null", O_WRONLY); } else if (stderr_disp == Stderr_To_Stdout) { stderrFd = *stdoutFd; //no double close stderrFd.resetDispose(); } else if (stderr_disp == Stderr_To_FileDesc) { // Note: We don't have to close anything regarding stderr_fd. // Our caller is responsible for that. stderrFd = stderr_fd; stderrFd.resetDispose(); } if ( root ) _backend->setChroot( root ); if ( chdirTo ) _backend->setWorkingDirectory( chdirTo ); _backend->setDieWithParent( die_with_parent ); _backend->setSwitchPgid( switch_pgid ); _backend->setEnvironment( environment ); _backend->setUseDefaultLocale( default_locale ); if ( _backend->start( argv, stdinFd, stdoutFd, stderrFd ) ) { bool connected = true; if ( childStdoutParentFd != -1 ) { inputfile = fdopen( childStdoutParentFd, "r" ); if ( inputfile ) childStdoutParentFd.resetDispose(); else connected = false; } if ( childStdinParentFd != -1 ) { outputfile = fdopen( childStdinParentFd, "w" ); if ( outputfile ) childStdinParentFd.resetDispose(); else connected = false; } if ( not connected ) { ERR << "Cannot create streams to external program " << argv[0] << endl; ExternalProgram::close(); } } else { // Fork failed, exit code and status was set by backend return; } } bool ExternalProgram::waitForExit(std::optional timeout) { if ( !_backend ) { // no backend means no running progress, return true return true; } return _backend->waitForExit( timeout ); } int ExternalProgram::close() { if ( !_backend ) { ExternalDataSource::close(); return -1; } if ( _backend->isRunning() ) { if ( inputFile() ) { // Discard any output instead of closing the pipe, // but watch out for the command exiting while some // subprocess keeps the filedescriptor open. setBlocking( false ); FILE * inputfile = inputFile(); int inputfileFd = ::fileno( inputfile ); long delay = 0; do { /* Watch inputFile to see when it has input. */ GPollFD rfd; rfd.fd = inputfileFd; rfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; rfd.revents = 0; // each try increases our wait by 0.1 seconds, until we have // 1 sec max timout. gint timeout = delay < 0 ? 1000 : delay*100; if ( delay >= 0 && ++delay > 9 ) delay = -1; int retval = zyppng::eintrSafeCall( g_poll, &rfd, 1, timeout ); if ( retval == -1 ) { ERR << "select error: " << strerror(errno) << endl; break; } else if ( retval ) { // Data is available now. static size_t linebuffer_size = 0; // static because getline allocs static char * linebuffer = 0; // and reallocs if buffer is too small getline( &linebuffer, &linebuffer_size, inputfile ); // ::feof check is important as select returns // positive if the file was closed. if ( ::feof( inputfile ) ) break; clearerr( inputfile ); } else { // No data within time. if ( ! _backend->isRunning() ) break; } } while ( true ); } // wait for the process to end) _backend->isRunning( true ); } ExternalDataSource::close(); return _backend->exitStatus(); } bool ExternalProgram::kill() { if ( _backend && _backend->isRunning() ) { if ( ::kill( _backend->pid(), SIGKILL) == -1 ) { ERR << "Failed to kill PID " << _backend->pid() << " with error: " << Errno() << std::endl; return false; } close(); } return true; } bool ExternalProgram::kill(int sig) { if ( _backend && _backend->isRunning() ) { if ( ::kill( _backend->pid(), sig ) == -1 ) { ERR << "Failed to kill PID " << _backend->pid() << " with error: " << Errno() << std::endl; return false; } } return true; } bool ExternalProgram::running() { if ( !_backend ) return false; return _backend->isRunning(); } pid_t ExternalProgram::getpid() { if ( !running() ) return -1; return _backend->pid(); } const std::string &ExternalProgram::command() const { if ( !_backend ) { static std::string empty; return empty; } return _backend->executedCommand(); } const std::string &ExternalProgram::execError() const { if ( !_backend ) { static std::string empty; return empty; } return _backend->execError(); } // origfd will be accessible as newfd and closed (unless they were equal) void ExternalProgram::renumber_fd (int origfd, int newfd) { return zyppng::renumberFd( origfd, newfd ); } std::ostream & ExternalProgram::operator>>( std::ostream & out_r ) { setBlocking( true ); for ( std::string line = receiveLine(); line.length(); line = receiveLine() ) out_r << line; return out_r; } ////////////////////////////////////////////////////////////////////// // // class ExternalProgramWithStderr // ////////////////////////////////////////////////////////////////////// namespace externalprogram { EarlyPipe::EarlyPipe() { _fds[R] = _fds[W] = -1; #ifdef HAVE_PIPE2 ::pipe2( _fds, O_NONBLOCK ); #else ::pipe( _fds ); ::fcntl(_fds[R], F_SETFD, O_NONBLOCK ); ::fcntl(_fds[W], F_SETFD, O_NONBLOCK ); #endif _stderr = ::fdopen( _fds[R], "r" ); } EarlyPipe::~EarlyPipe() { closeW(); if ( _stderr ) ::fclose( _stderr ); } } // namespace externalprogram bool ExternalProgramWithStderr::stderrGetUpTo( std::string & retval_r, const char delim_r, bool returnDelim_r ) { if ( ! _stderr ) return false; if ( delim_r && ! _buffer.empty() ) { // check for delim already in buffer std::string::size_type pos( _buffer.find( delim_r ) ); if ( pos != std::string::npos ) { retval_r = _buffer.substr( 0, returnDelim_r ? pos+1 : pos ); _buffer.erase( 0, pos+1 ); return true; } } ::clearerr( _stderr ); do { int ch = fgetc( _stderr ); if ( ch != EOF ) { if ( ch != delim_r || ! delim_r ) _buffer.push_back( ch ); else { if ( returnDelim_r ) _buffer.push_back( delim_r ); break; } } else if ( ::feof( _stderr ) ) { if ( _buffer.empty() ) return false; break; } else if ( errno != EINTR ) return false; } while ( true ); // HERE: we left after readig at least one char (\n) retval_r.swap( _buffer ); _buffer.clear(); return true; } } // namespace zypp libzypp-17.36.5/zypp-core/ExternalProgram.h000066400000000000000000000263651476576476200206450ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ExternalProgram.h */ #ifndef ZYPP_EXTERNALPROGRAM_H #define ZYPP_EXTERNALPROGRAM_H #include #include #include #include #include #include #include #include namespace zyppng { class AbstractSpawnEngine; } namespace zypp { /** * @short Execute a program and give access to its io * An object of this class encapsulates the execution of * an external program. It starts the program using fork * and some exec.. call, gives you access to the program's * stdio and closes the program after use. * * \code * * const char* argv[] = * { * "/usr/bin/foo, * "--option1", * "--option2", * NULL * }; * * ExternalProgram prog( argv, * ExternalProgram::Discard_Stderr, * false, -1, true); * string line; * for(line = prog.receiveLine(); * ! line.empty(); * line = prog.receiveLine() ) * { * stream << line; * } * prog.close(); * * \endcode */ class ZYPP_API ExternalProgram : public zypp::externalprogram::ExternalDataSource { public: using Arguments = std::vector; /** * Define symbols for different policies on the handling * of stderr */ enum Stderr_Disposition { Normal_Stderr, Discard_Stderr, Stderr_To_Stdout, Stderr_To_FileDesc }; /** * For passing additional environment variables to set */ using Environment = std::map; /** * Start the external program by using the shell /bin/sh * with the option -c. You can use io direction symbols < and >. * @param commandline a shell commandline that is appended to * /bin/sh -c. * @param default_locale whether to set LC_ALL=C before starting * @param root directory to chroot into; or just 'cd' if '/'l; nothing if empty */ ExternalProgram (const std::string& commandline, Stderr_Disposition stderr_disp = Normal_Stderr, bool use_pty = false, int stderr_fd = -1, bool default_locale = false, const Pathname& root = ""); /** * Start an external program by giving the arguments as an arry of char *pointers. * If environment is provided, varaiables will be added to the childs environment, * overwriting existing ones. * * Initial args starting with \c # are discarded but some are treated specially: * #/[path] - chdir to /[path] before executing * * Stdin redirection: If the \b 1st argument starts with a \b '<', the remaining * part is treated as file opened for reading on standard input (or \c /dev/null * if empty). * \code * // cat file /tmp/x * const char* argv[] = { "', the remaining * part is treated as file opened for writing on standard output (or \c /dev/null * if empty). */ ExternalProgram(); ExternalProgram (const Arguments &argv, Stderr_Disposition stderr_disp = Normal_Stderr, bool use_pty = false, int stderr_fd = -1, bool default_locale = false, const Pathname& root = ""); ExternalProgram (const Arguments &argv, const Environment & environment, Stderr_Disposition stderr_disp = Normal_Stderr, bool use_pty = false, int stderr_fd = -1, bool default_locale = false, const Pathname& root = ""); ExternalProgram (const char *const *argv, Stderr_Disposition stderr_disp = Normal_Stderr, bool use_pty = false, int stderr_fd = -1, bool default_locale = false, const Pathname& root = ""); ExternalProgram (const char *const *argv, const Environment & environment, Stderr_Disposition stderr_disp = Normal_Stderr, bool use_pty = false, int stderr_fd = -1, bool default_locale = false, const Pathname& root = ""); ExternalProgram (const char *binpath, const char *const *argv_1, bool use_pty = false); ExternalProgram (const char *binpath, const char *const *argv_1, const Environment & environment, bool use_pty = false); ~ExternalProgram() override; #ifdef __cpp_lib_optional // YAST/PK explicitly use c++11 until 15-SP3 /*! * Wait a certain timeout for the programm to complete, if \a timeout * is not set this will wait forever, 0 will check if the process is still * running and return immediately with the result, any other value is the * timeout in ms to wait. * * \returns true if the process has exited in time */ bool waitForExit ( std::optional timeout = {} ); #endif /** Wait for the progamm to complete. */ int close() override; /** * Kill the program */ bool kill(); /** * Send a signal to the program */ bool kill( int sig ); /** * Return whether program is running */ bool running(); /** * return pid * */ pid_t getpid(); /** The command we're executing. */ const std::string & command() const; /** Some detail telling why the execution failed, if it failed. * Empty if the command is still running or successfully completed. * * \li Can't open pty (%s). * \li Can't open pipe (%s). * \li Can't fork (%s). * \li Command exited with status %d. * \li Command was killed by signal %d (%s). */ const std::string & execError() const; /** * origfd will be accessible as newfd and closed (unless they were equal) */ static void renumber_fd (int origfd, int newfd); public: /** * Redirect all command output to an \c ostream. * Returns when the command has completed. * \code * std::ostringstream s; * ExternalProgram("pwd") >> s; * SEC << s.str() << endl; * \endcode * \code * std::ostringstream s; * ExternalProgram prog("ls -l wrzl"); * prog >> s; * if ( prog.close() == 0 ) * MIL << s.str() << endl; * else * ERR << prog.execError() << endl; * \endcode */ std::ostream & operator>>( std::ostream & out_r ); private: std::unique_ptr _backend; protected: void start_program (const char *const *argv, const Environment & environment, Stderr_Disposition stderr_disp = Normal_Stderr, int stderr_fd = -1, bool default_locale = false, const char* root = NULL, bool switch_pgid = false, bool die_with_parent = false, bool usePty = false ); }; namespace externalprogram { /** Helper providing pipe FDs for \ref ExternalProgramWithStderr. * Moved to a basse class because the pipe needs to be initialized * before the \ref ExternalProgram base class is initialized. * \see \ref ExternalProgramWithStderr */ struct EarlyPipe { enum { R=0, W=1 }; EarlyPipe(); ~EarlyPipe(); void closeW() { if ( _fds[W] != -1 ) { ::close( _fds[W] ); _fds[W] = -1; } } FILE * fStdErr() { return _stderr; } protected: FILE * _stderr; int _fds[2]; }; } // namespace externalprogram /** ExternalProgram extended to offer reading programs stderr. * \see \ref ExternalProgram */ class ExternalProgramWithStderr : private externalprogram::EarlyPipe, public ExternalProgram { public: ExternalProgramWithStderr( const Arguments & argv_r, bool defaultLocale_r = false, const Pathname & root_r = "" ) : ExternalProgram( argv_r, Stderr_To_FileDesc, /*use_pty*/false, _fds[W], defaultLocale_r, root_r ) { _initStdErr(); } /** \overlocad Convenience taking just the \a root_r. */ ExternalProgramWithStderr( const Arguments & argv_r, const Pathname & root_r ) : ExternalProgramWithStderr( argv_r, false, root_r ) {} ExternalProgramWithStderr( const Arguments & argv_r, const Environment & environment_r, bool defaultLocale_r = false, const Pathname & root_r = "" ) : ExternalProgram( argv_r, environment_r, Stderr_To_FileDesc, /*use_pty*/false, _fds[W], defaultLocale_r, root_r ) { _initStdErr(); } /** \overlocad Convenience taking just the \a root_r. */ ExternalProgramWithStderr( const Arguments & argv_r, const Environment & environment_r, const Pathname & root_r ) : ExternalProgramWithStderr( argv_r, environment_r, false, root_r ) {} public: /** Return \c FILE* to read programms stderr (O_NONBLOCK set). */ using externalprogram::EarlyPipe::fStdErr; /** Read data up to \c delim_r from stderr (nonblocking). * \note If \c delim_r is '\0', we read as much data as possible. * \return \c false if data are not yet available (\c retval_r remains untouched then). */ bool stderrGetUpTo( std::string & retval_r, const char delim_r, bool returnDelim_r = false ); /** Read next complete line from stderr (nonblocking). * \return \c false if data are not yet available (\c retval_r remains untouched then). */ bool stderrGetline( std::string & retval_r, bool returnDelim_r = false ) { return stderrGetUpTo( retval_r, '\n', returnDelim_r ); } private: /** Close write end of the pipe (childs end). */ void _initStdErr() { closeW(); } private: std::string _buffer; }; /** ExternalProgram extended to change the progress group ID after forking. * \see \ref ExternalProgram */ class ZYPP_LOCAL ExternalProgramWithSeperatePgid : public ExternalProgram { public: ExternalProgramWithSeperatePgid (const char *const *argv, Stderr_Disposition stderr_disp = Normal_Stderr, int stderr_fd = -1, bool default_locale = false, const Pathname& root = "") : ExternalProgram() { start_program( argv, Environment(), stderr_disp, stderr_fd, default_locale, root.c_str(), true ); } }; } // namespace zypp #endif // ZYPP_EXTERNALPROGRAM_H libzypp-17.36.5/zypp-core/Globals.h000066400000000000000000000101671476576476200171070ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/Globals.h * \brief Provides API related macros. */ #ifndef ZYPP_GLOBALS_H #define ZYPP_GLOBALS_H #include // LIBZYPP_ version defines for the LEGACY macro #include // some macros used almost everywhere /** * Legacy code we still support. * * Deprecated items we can't drop immediately because YAST/PK still * refer to them or they break binary compatibility, should be * enclosed in `#if LEGACY(#)` where # is either a major number(<=99), * a soversion [<=9999] or numversion [<=999999]. * */ #ifndef LIBZYPP_VERSION_MAJOR #error Missing APIConfig.h include (LIBZYPP_VERSION_MAJOR) #endif #ifndef LIBZYPP_SOVERSION #error Missing APIConfig.h include (LIBZYPP_SOVERSION) #endif #ifndef LIBZYPP_VERSION #error Missing APIConfig.h include (LIBZYPP_VERSION) #endif #define LEGACY(CL) ( CL < 100 && LIBZYPP_VERSION_MAJOR <= CL ) || ( CL < 10000 && LIBZYPP_SOVERSION <= CL ) || LIBZYPP_VERSION <= CL /** * Generic helper definitions for shared library support. * * \see e.g. http://gcc.gnu.org/wiki/Visibility * \code * extern "C" ZYPP_API void function(int a); * class ZYPP_API SomeClass * { * int c; * ZYPP_LOCAL void privateMethod(); // Only for use within this DSO * public: * Person(int _c) : c(_c) { } * static void foo(int a); * }; * \endcode };*/ #if __GNUC__ >= 4 #define ZYPP_DECL_EXPORT __attribute__ ((visibility ("default"))) #define ZYPP_DECL_IMPORT __attribute__ ((visibility ("default"))) #define ZYPP_DECL_HIDDEN __attribute__ ((visibility ("hidden"))) #else #define ZYPP_DECL_EXPORT #define ZYPP_DECL_IMPORT #define ZYPP_DECL_HIDDEN #endif #ifdef ZYPP_DLL //defined if zypp is compiled as DLL #define ZYPP_API ZYPP_DECL_EXPORT #define ZYPP_TESTS ZYPP_DECL_EXPORT #define ZYPP_LOCAL ZYPP_DECL_HIDDEN #else #define ZYPP_API ZYPP_DECL_IMPORT #define ZYPP_TESTS ZYPP_DECL_IMPORT #define ZYPP_LOCAL #endif // A small set of internal symbols offered to the deptestomatic // tool (package libzypp-testsuite-tools) to load and evaluate // solver testcases. #define ZYPP_API_DEPTESTOMATIC ZYPP_API /** * The ZYPP_DEPRECATED macro can be used to trigger compile-time warnings * with gcc >= 3.2 when deprecated functions are used. * * For non-inline functions, the macro is used at the very end of the * function declaration, right before the semicolon, unless it's pure * virtual: * * int deprecatedFunc() const ZYPP_DEPRECATED; * virtual int deprecatedPureVirtualFunc() const ZYPP_DEPRECATED = 0; * * Functions which are implemented inline are handled differently: * the ZYPP_DEPRECATED macro is used at the front, right before the * return type, but after "static" or "virtual": * * ZYPP_DEPRECATED void deprecatedFuncA() { .. } * virtual ZYPP_DEPRECATED int deprecatedFuncB() { .. } * static ZYPP_DEPRECATED bool deprecatedFuncC() { .. } * * You can also mark whole structs or classes as deprecated, by inserting * the ZYPP_DEPRECATED macro after the struct/class keyword, but before * the name of the struct/class: * * class ZYPP_DEPRECATED DeprecatedClass { }; * struct ZYPP_DEPRECATED DeprecatedStruct { }; * * However, deprecating a struct/class doesn't create a warning for gcc * versions <= 3.3 (haven't tried 3.4 yet). If you want to deprecate a class, * also deprecate all member functions as well (which will cause warnings). * */ #ifndef NDEBUG #ifndef ZYPP_DEPRECATED #define ZYPP_DEPRECATED __attribute__ ((deprecated)) #endif #else #ifndef ZYPP_DEPRECATED #define ZYPP_DEPRECATED #endif #endif #endif libzypp-17.36.5/zypp-core/KVMap000066400000000000000000000000231476576476200162420ustar00rootroot00000000000000#include "kvmap.h" libzypp-17.36.5/zypp-core/ManagedFile.h000066400000000000000000000023341476576476200176550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ManagedFile.h * */ #ifndef ZYPP_MANAGEDFILE_H #define ZYPP_MANAGEDFILE_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** A Pathname plus associated cleanup code to be executed when * path is no longer needed. */ using ManagedFile = AutoDispose; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_MANAGEDFILE_H libzypp-17.36.5/zypp-core/OnMediaLocation000066400000000000000000000000351476576476200202740ustar00rootroot00000000000000#include "onmedialocation.h" libzypp-17.36.5/zypp-core/Pathname.cc000066400000000000000000000220661476576476200174200ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Pathname.cc * */ #include #include #include #include #include using std::string; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace filesystem { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::_assign // METHOD TYPE : void // void Pathname::_assign( const string & name_r ) { _name.clear(); if ( name_r.empty() ) return; _name.reserve( name_r.size() ); // Collect up to "/.." enum Pending { P_none = 0, // "" P_slash = 1, // "/" P_dot1 = 2, // "/." P_dot2 = 3 // "/.." } pending = P_none; // Assert relative path starting with "./" // We rely on this below! if ( name_r[0] != '/' ) { _name += '.'; pending = P_slash; } // Lambda handling the "/.." case: // [] + "/.." ==> [] // [.] + "/.." ==> [./..] // [foo] is always [./foo] due to init above // [*/..] + "/.." ==> [*/../..] // [*/foo] + "/.." ==> [*] auto goParent_f = [&](){ if ( _name.empty() ) /*NOOP*/; else if ( _name.size() == 1 ) // content is '.' _name += "/.."; else { std::string::size_type pos = _name.rfind( '/' ); if ( pos == _name.size() - 3 && _name[pos+1] == '.' && _name[pos+2] == '.' ) _name += "/.."; else _name.erase( pos ); } }; for ( char ch : name_r ) { switch ( ch ) { case '/': switch ( pending ) { case P_none: pending = P_slash; break; case P_slash: break; case P_dot1: pending = P_slash; break; case P_dot2: goParent_f(); pending = P_slash; break; } break; case '.': switch ( pending ) { case P_none: _name += '.'; break; case P_slash: pending = P_dot1; break; case P_dot1: pending = P_dot2; break; case P_dot2: _name += "/..."; pending = P_none; break; } break; default: switch ( pending ) { case P_none: break; case P_slash: _name += '/'; pending = P_none; break; case P_dot1: _name += "/."; pending = P_none; break; case P_dot2: _name += "/.."; pending = P_none; break; } _name += ch; break; } } switch ( pending ) { case P_none: break; case P_slash: if ( _name.empty() ) _name = "/"; break; case P_dot1: if ( _name.empty() ) _name = "/"; break; case P_dot2: goParent_f(); if ( _name.empty() ) _name = "/"; break; } return; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::dirname // METHOD TYPE : Pathname // Pathname Pathname::dirname( const Pathname & name_r ) { if ( name_r.empty() ) return Pathname(); Pathname ret_t( name_r ); std::string::size_type idx = ret_t._name.find_last_of( '/' ); if ( idx == std::string::npos ) { ret_t._name = "."; } else if ( idx == 0 ) { ret_t._name = "/"; } else { ret_t._name.erase( idx ); } return ret_t; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::basename // METHOD TYPE : string // string Pathname::basename( const Pathname & name_r ) { if ( name_r.empty() ) return string(); string ret_t( name_r.asString() ); std::string::size_type idx = ret_t.find_last_of( '/' ); if ( idx != std::string::npos && ( idx != 0 || ret_t.size() != 1 ) ) { ret_t.erase( 0, idx+1 ); } return ret_t; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::asUrl // METHOD TYPE : Url // Url Pathname::asUrl( const std::string & scheme_r ) const { Url ret; ret.setPathName( asString() ); ret.setScheme( scheme_r ); return ret; } Url Pathname::asUrl() const { return asUrl( "dir" ); } Url Pathname::asDirUrl() const { return asUrl( "dir" ); } Url Pathname::asFileUrl() const { return asUrl( "file" ); } std::string Pathname::showRoot( const Pathname & root_r, const Pathname & path_r ) { return str::Str() << "(" << root_r << ")" << path_r; } std::string Pathname::showRootIf( const Pathname & root_r, const Pathname & path_r ) { if ( root_r.empty() || root_r == "/" ) return path_r.asString(); return showRoot( root_r, path_r ); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::extension // METHOD TYPE : string // string Pathname::extension( const Pathname & name_r ) { if ( name_r.empty() ) return string(); string base( basename( name_r ) ); std::string::size_type pos = base.rfind( '.' ); switch ( pos ) { case 0: if ( base.size() == 1 ) // . return string(); break; case 1: if ( base.size() == 2 && base[0] == '.' ) // .. return string(); break; case std::string::npos: return string(); break; } return base.substr( pos ); } Pathname Pathname::realpath() const { std::string real; if( !empty()) { #if __GNUC__ > 2 /** GNU extension */ char *ptr = ::realpath(_name.c_str(), NULL); if( ptr != NULL) { real = ptr; free( ptr); } else /** the SUSv2 way */ if( EINVAL == errno) { char buff[PATH_MAX + 2]; memset(buff, '\0', sizeof(buff)); if( ::realpath(_name.c_str(), buff) != NULL) { real = buff; } } #else char buff[PATH_MAX + 2]; memset(buff, '\0', sizeof(buff)); if( ::realpath(_name.c_str(), buff) != NULL) { real = buff; } #endif } return zypp::Pathname(real); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::assertprefix // METHOD TYPE : Pathname // Pathname Pathname::assertprefix( const Pathname & root_r, const Pathname & path_r ) { if ( root_r.empty() || path_r == root_r || str::hasPrefix( path_r.asString(), root_r.asString() ) ) return path_r; return root_r / path_r; } Pathname Pathname::stripprefix( const Pathname & root_r, const Pathname & path_r ) { if ( root_r.emptyOrRoot() ) return path_r; if ( root_r == path_r ) return "/"; std::string rest( str::stripPrefix( path_r.asString(), root_r.asString() ) ); if ( rest[0] == '/' ) // needs to be a dir prefix! return rest; return path_r; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::cat // METHOD TYPE : Pathname // Pathname Pathname::cat( const Pathname & name_r, const Pathname & add_tv ) { if ( add_tv.empty() ) return name_r; if ( name_r.empty() ) return add_tv; string ret_ti( name_r._name ); if( add_tv._name[0] != '/' ) ret_ti += '/'; return ret_ti + add_tv._name; } /////////////////////////////////////////////////////////////////// // // METHOD NAME : Pathname::Extend // METHOD TYPE : Pathname // Pathname Pathname::extend( const Pathname & l, const string & r ) { return l.asString() + r; } ///////////////////////////////////////////////////////////////// } // namespace filesystem /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/Pathname.h000066400000000000000000000175311476576476200172630ustar00rootroot00000000000000 /*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/Pathname.h * */ #ifndef ZYPP_PATHNAME_H #define ZYPP_PATHNAME_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// class Url; /////////////////////////////////////////////////////////////////// namespace filesystem { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Pathname // /** Pathname. * * \note For convenience Pathname is available as zypp::Pathname too. * * Always stores normalized paths (no inner '.' or '..' components * and no consecutive '/'es). Concatenation automatically adds * the path separator '/'. * * \todo Add support for handling extensions incl. stripping * extensions from basename (basename("/path/foo.baa", ".baa") ==> "foo") */ class ZYPP_API Pathname { public: /** Default ctor: an empty path. */ Pathname() {} /** Ctor from string. */ Pathname( const std::string & name_r ) { _assign( name_r ); } /** Ctor from char*. */ Pathname( const char * name_r ) { _assign( name_r ? name_r : "" ); } /** Copy Ctor */ Pathname( const Pathname & rhs ) : _name( rhs._name ) {} /** Swap */ friend void swap( Pathname & lhs, Pathname & rhs ) noexcept { using std::swap; swap( lhs._name, rhs._name ); } /** Move Ctor */ Pathname( Pathname && tmp ) noexcept : _name( std::move( tmp._name ) ) {} /** Assign */ Pathname & operator=( Pathname rhs ) { swap( *this, rhs ); return *this; } /** Concatenate and assign. \see cat */ Pathname & operator/=( const Pathname & path_tv ) { return( *this = cat( *this, path_tv ) ); } /** Concatenate and assign. \see cat * \deprecated: use /= */ Pathname & operator+=( const Pathname & path_tv ) { return( *this = cat( *this, path_tv ) ); } /** String representation. */ const std::string & asString() const { return _name; } /** String representation as "(root)/path" */ static std::string showRoot( const Pathname & root_r, const Pathname & path_r ); /** String representation as "(root)/path", unless \a root is \c "/" or empty. */ static std::string showRootIf( const Pathname & root_r, const Pathname & path_r ); /** Url representation using \c scheme_r schema . */ Url asUrl( const std::string & scheme_r ) const; /** \overload using \c dir schema. */ Url asUrl() const; /** \overload using \c dir schema. */ Url asDirUrl() const; /** \overload using \c file schema. */ Url asFileUrl() const; /** String representation. */ const char * c_str() const { return _name.c_str(); } /** Test for an empty path. */ bool empty() const { return _name.empty(); } /** Test for an absolute path. */ bool absolute() const { return *_name.c_str() == '/'; } /** Test for a relative path. */ bool relative() const { return !( absolute() || empty() ); } /** Test for "" or "/". */ bool emptyOrRoot() const { return( _name.empty() || _name == "/" ); } /** Return all but the last component od this path. */ Pathname dirname() const { return dirname( *this ); } static Pathname dirname( const Pathname & name_r ); /** Return the last component of this path. */ std::string basename() const { return basename( *this ); } static std::string basename( const Pathname & name_r ); /** Return all of the characters in name after and including * the last dot in the last element of name. If there is no dot * in the last element of name then returns the empty string. */ std::string extension() const { return extension( *this ); } static std::string extension( const Pathname & name_r ); /** Return this path, adding a leading '/' if relative. */ Pathname absolutename() const { return absolutename( *this ); } static Pathname absolutename( const Pathname & name_r ) { return name_r.relative() ? cat( "/", name_r ) : name_r; } /** Return this path, removing a leading '/' if absolute.*/ Pathname relativename() const { return relativename( *this ); } static Pathname relativename( const Pathname & name_r ) { return name_r.absolute() ? cat( ".", name_r ) : name_r; } /** Returns this path as the absolute canonical pathname */ Pathname realpath() const; /** Return \c path_r prefixed with \c root_r, unless it is already prefixed. */ static Pathname assertprefix( const Pathname & root_r, const Pathname & path_r ); /** Return \c path_r with any \c root_r dir prefix striped. */ static Pathname stripprefix( const Pathname & root_r, const Pathname & path_r ); /** Concatenation of pathnames. * \code * "foo" / "baa" ==> "foo/baa" * "foo/" / "baa" ==> "foo/baa" * "foo" / "/baa" ==> "foo/baa" * "foo/" / "/baa" ==> "foo/baa" * \endcode */ Pathname cat( const Pathname & r ) const { return cat( *this, r ); } static Pathname cat( const Pathname & l, const Pathname & r ); /** Append string \a r to the last component of the path. * \code * "foo/baa".extend( ".h" ) ==> "foo/baa.h" * \endcode */ Pathname extend( const std::string & r ) const { return extend( *this, r ); } static Pathname extend( const Pathname & l, const std::string & r ); private: std::string _name; void _assign( const std::string & name_r ); }; /////////////////////////////////////////////////////////////////// /** \relates Pathname */ inline bool operator==( const Pathname & l, const Pathname & r ) { return l.asString() == r.asString(); } /** \relates Pathname */ inline bool operator!=( const Pathname & l, const Pathname & r ) { return l.asString() != r.asString(); } /** \relates Pathname Concatenate two Pathname. */ inline Pathname operator/( const Pathname & l, const Pathname & r ) { return Pathname::cat( l, r ); } /** \relates Pathname Concatenate two Pathname. * \deprecated: use / */ inline Pathname operator+( const Pathname & l, const Pathname & r ) { return Pathname::cat( l, r ); } /** \relates Pathname */ inline bool operator<( const Pathname & l, const Pathname & r ) { return l.asString() < r.asString(); } /////////////////////////////////////////////////////////////////// /** \relates Pathname Stream output */ inline std::ostream & operator<<( std::ostream & str, const Pathname & obj ) { return str << obj.asString(); } ///////////////////////////////////////////////////////////////// } // namespace filesystem /////////////////////////////////////////////////////////////////// /** Dragged into namespace zypp. */ using filesystem::Pathname; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_PATHNAME_H libzypp-17.36.5/zypp-core/ShutdownLock.cc000066400000000000000000000022701476576476200203020ustar00rootroot00000000000000#include "ShutdownLock_p.h" #include #include #include #include zypp::ShutdownLock::ShutdownLock(const std::string &who, const std::string &reason) { try { MIL << "Try to acquire an inhibitor lock..." << endl; std::string whoStr = str::form("--who=%s", who.c_str()); std::string whyStr = str::form("--why=%s", reason.c_str()); const char* argv[] = { "/usr/bin/systemd-inhibit", "--what=sleep:shutdown:idle", whoStr.c_str(), "--mode=block", whyStr.c_str(), "/usr/bin/cat", NULL }; _prog = shared_ptr( new ExternalProgramWithSeperatePgid( argv, ExternalProgram::Discard_Stderr ) ); } catch (...) { } } zypp::ShutdownLock::~ShutdownLock() { if (_prog) { MIL << "Terminate inhibitor lock: pid " << _prog->getpid() << endl; _prog->kill( SIGTERM ); if ( !_prog->waitForExit( 10 * 1000 ) ) { // do a real kill if the app does not close in 10 seconds WAR << "systemd-inhibit did not respond to SIGTERM, killing it" << std::endl; _prog->kill(); } else { _prog->close(); } } } libzypp-17.36.5/zypp-core/ShutdownLock_p.h000066400000000000000000000022741476576476200204670ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/ShutdownLock_p.h * */ #ifndef ZYPP_SHUTDOWNLOCK_P_H_INCLUDED #define ZYPP_SHUTDOWNLOCK_P_H_INCLUDED #include #include #include namespace zypp { class ExternalProgramWithSeperatePgid; /** * Attempts to create a lock to prevent the system * from going into hibernate/shutdown. The lock is automatically * released when the object is destroyed. */ class ShutdownLock { public: ShutdownLock( const std::string &who, const std::string &reason ); ~ShutdownLock(); private: shared_ptr _prog; }; } #endif libzypp-17.36.5/zypp-core/TriBool.h000066400000000000000000000055761476576476200171060ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/TriBool.h * */ #ifndef ZYPP_TRIBOOL_H #define ZYPP_TRIBOOL_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** 3-state boolean logic (\c true, \c false and \c indeterminate). * \code * namespace zypp * { * typedef boost::logic::tribool TriBool; * using boost::logic::tribool; * using boost::logic::indeterminate; * } * \endcode * * \warning Be carefull.esp. when comparing \ref TriBool using * \c operator==, as ( indeterminate == indeterminate ) * does \b not evaluate \b true. It's \c indeterminate. * * \see http://www.boost.org/doc/html/tribool.html * \ingroup BOOST */ using TriBool = boost::logic::tribool; using boost::logic::tribool; using boost::logic::indeterminate; inline std::string asString( const TriBool & val_r, const std::string & istr_r = std::string(), const std::string & tstr_r = std::string(), const std::string & fstr_r = std::string() ) { std::string ret; if (indeterminate(val_r)) ret = ( istr_r.empty() ? "indeterminate" : istr_r ); else if (val_r) ret = ( tstr_r.empty() ? "true" : tstr_r ); else ret = ( fstr_r.empty() ? "false" : fstr_r ); return ret; } /** Convert TriBool to bool returning \a default_r if indeterminate.*/ inline bool tri2bool( const TriBool & val_r, bool default_r ) { return indeterminate(val_r) ? default_r : bool(val_r); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// namespace boost { namespace logic { /** \relates TriBool stream output */ inline std::ostream & operator<<(std::ostream & s, const tribool & obj) { return s << zypp::asString( obj ); } /** \relates TriBool whether 2 tribool have the same state (this is NOT ==) */ inline bool sameTriboolState( tribool lhs, tribool rhs ) { return( ( indeterminate(lhs) && indeterminate(rhs) ) || ( bool )( lhs == rhs ) ); } } } #endif // ZYPP_TRIBOOL_H libzypp-17.36.5/zypp-core/Url.cc000066400000000000000000000575061476576476200164340ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/Url.cc */ #include #include #include #include #include #include #include #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// using namespace zypp::url; // ----------------------------------------------------------------- /* * url = [scheme:] [//authority] /path [?query] [#fragment] */ #define RX_SPLIT_URL "^([^:/?#]+:|)" \ "(//[^/?#]*|)" \ "([^?#]*)" \ "([?][^#]*|)" \ "(#.*|)" //////////////////////////////////////////////////////////////////// namespace { ////////////////////////////////////////////////////////////////// // --------------------------------------------------------------- class LDAPUrl: public UrlBase { public: LDAPUrl(): UrlBase() { configure(); } LDAPUrl(LDAPUrl &&) = default; LDAPUrl &operator=(const LDAPUrl &) = default; LDAPUrl &operator=(LDAPUrl &&) = default; LDAPUrl(const LDAPUrl &url) : UrlBase(url) {} ~LDAPUrl() override = default; UrlBase * clone() const override { return new LDAPUrl(*this); } UrlSchemes getKnownSchemes() const override { UrlSchemes schemes(2); schemes[0] = "ldap"; schemes[1] = "ldaps"; return schemes; } void configure() override { config("sep_pathparams", ""); config("psep_querystr", "?"); config("vsep_querystr", ""); // host is required (isValid=>false) // but not mandatory (see RFC 2255), // that is, accept empty host. config("require_host", "y"); // not allowed here config("rx_username", ""); config("rx_password", ""); config("rx_fragment", ""); config("rx_pathparams", ""); } zypp::url::ParamMap getQueryStringMap(zypp::url::EEncoding eflag) const override { static const char * const keys[] = { "attrs", "scope", "filter", "exts", NULL }; zypp::url::ParamMap pmap; zypp::url::ParamVec pvec( getQueryStringVec()); if( pvec.size() <= 4) { for(size_t i=0; ifirst == keys[i]) { found=true; pvec[i] = zypp::url::encode(p->second, join_safe); } } if( !found) { ZYPP_THROW(url::UrlNotSupportedException( str::form(_("Invalid LDAP URL query parameter '%s'"), p->first.c_str()) )); } } setQueryStringVec(pvec); } else { setQueryString( zypp::url::join( pmap, config("psep_querystr"), config("vsep_querystr"), config("safe_querystr"), url::E_ENCODED ) ); } } }; // --------------------------------------------------------------- // FIXME: hmm.. class UrlByScheme { private: using UrlBySchemeMap = std::map; UrlBySchemeMap urlByScheme; public: UrlByScheme() { UrlRef ref; // ===================================== ref.reset( new LDAPUrl()); addUrlByScheme("ldap", ref); addUrlByScheme("ldaps", ref); // ===================================== ref.reset( new UrlBase()); // don't show empty authority ref->setViewOptions( zypp::url::ViewOption::DEFAULTS - zypp::url::ViewOption::EMPTY_AUTHORITY); ref->config("with_authority", "n"); // disallow host,... ref->config("require_pathname", "m"); // path is mandatory addUrlByScheme("hd", ref); addUrlByScheme("cd", ref); addUrlByScheme("dvd", ref); addUrlByScheme("dir", ref); addUrlByScheme("iso", ref); addUrlByScheme("mailto", ref); addUrlByScheme("urn", ref); addUrlByScheme("plugin", ref); // zypp plugable media handler: // RFC1738, 3.10: may contain a host ref->config("with_authority", "y"); // allow host, ref->config("with_port", "n"); // but no port, ref->config("rx_username", ""); // username or ref->config("rx_password", ""); // password ... addUrlByScheme("file", ref); // ===================================== ref.reset( new UrlBase()); ref->config("require_host", "m"); // host is mandatory addUrlByScheme("nfs", ref); addUrlByScheme("nfs4", ref); addUrlByScheme("smb", ref); addUrlByScheme("cifs", ref); addUrlByScheme("http", ref); addUrlByScheme("https", ref); ref->config("path_encode_slash2", "y"); // always encode 2. slash addUrlByScheme("ftp", ref); addUrlByScheme("sftp", ref); addUrlByScheme("tftp", ref); } bool addUrlByScheme(const std::string &scheme, UrlRef urlImpl) { if( urlImpl && urlImpl->isValidScheme(scheme)) { UrlRef ref(urlImpl); ref->clear(); urlByScheme[str::toLower(scheme)] = ref; return true; } return false; } UrlRef getUrlByScheme(const std::string &scheme) const { UrlBySchemeMap::const_iterator i(urlByScheme.find(str::toLower(scheme))); if( i != urlByScheme.end()) { return i->second; } return UrlRef(); } bool isRegisteredScheme(const std::string &scheme) const { return urlByScheme.find(str::toLower(scheme)) != urlByScheme.end(); } UrlSchemes getRegisteredSchemes() const { UrlBySchemeMap::const_iterator i(urlByScheme.begin()); UrlSchemes schemes; schemes.reserve(urlByScheme.size()); for( ; i != urlByScheme.end(); ++i) { schemes.push_back(i->first); } return schemes; } }; // --------------------------------------------------------------- UrlByScheme & g_urlSchemeRepository() { static UrlByScheme _v; return _v; } ////////////////////////////////////////////////////////////////// } // anonymous namespace //////////////////////////////////////////////////////////////////// // ----------------------------------------------------------------- Url::~Url() { } // ----------------------------------------------------------------- Url::Url() : m_impl( new UrlBase()) { } // ----------------------------------------------------------------- Url::Url(const Url &url) : m_impl( url.m_impl) { if( !m_impl) { ZYPP_THROW(url::UrlException( _("Unable to clone Url object") )); } } // ----------------------------------------------------------------- Url::Url(zypp::url::UrlRef url) : m_impl(std::move( url)) { if( !m_impl) { ZYPP_THROW(url::UrlException( _("Invalid empty Url object reference") )); } } // ----------------------------------------------------------------- Url::Url(const std::string &encodedUrl) : m_impl( parseUrl(encodedUrl)) { if( !m_impl) { ZYPP_THROW(url::UrlParsingException( _("Unable to parse Url components") )); } } // ----------------------------------------------------------------- Url& Url::operator = (const std::string &encodedUrl) { UrlRef url( parseUrl(encodedUrl)); if( !url) { ZYPP_THROW(url::UrlParsingException( _("Unable to parse Url components") )); } m_impl = url; return *this; } // ----------------------------------------------------------------- Url& Url::operator = (const Url &url) { m_impl = url.m_impl; return *this; } // ----------------------------------------------------------------- // static bool Url::registerScheme(const std::string &scheme, UrlRef urlImpl) { return g_urlSchemeRepository().addUrlByScheme(scheme, std::move(urlImpl)); } // ----------------------------------------------------------------- // static UrlRef Url::parseUrl(const std::string &encodedUrl) { UrlRef url; str::smatch out; bool ret = false; try { str::regex rex(RX_SPLIT_URL); ret = str::regex_match(encodedUrl, out, rex); } catch( ... ) {} if(ret && out.size() == 6) { std::string scheme = out[1]; if (scheme.size() > 1) scheme.pop_back(); std::string authority = out[2]; if (authority.size() >= 2) authority = authority.substr(2); std::string query = out[4]; if (query.size() > 1) query = query.substr(1); std::string fragment = out[5]; if (fragment.size() > 1) fragment = fragment.substr(1); url = g_urlSchemeRepository().getUrlByScheme(scheme); if( !url) { url.reset( new UrlBase()); } url->init(scheme, authority, out[3], query, fragment); } return url; } // ----------------------------------------------------------------- // static zypp::url::UrlSchemes Url::getRegisteredSchemes() { return g_urlSchemeRepository().getRegisteredSchemes(); } // ----------------------------------------------------------------- // static bool Url::isRegisteredScheme(const std::string &scheme) { return g_urlSchemeRepository().isRegisteredScheme(scheme); } // ----------------------------------------------------------------- zypp::url::UrlSchemes Url::getKnownSchemes() const { return m_impl->getKnownSchemes(); } // ----------------------------------------------------------------- bool Url::isValidScheme(const std::string &scheme) const { return m_impl->isValidScheme(scheme); } /////////////////////////////////////////////////////////////////// namespace { inline bool isInList( const char ** begin_r, const char ** end_r, const std::string & scheme_r ) { for ( ; begin_r != end_r; ++begin_r ) if ( scheme_r == *begin_r ) return true; return false; } } bool Url::schemeIsLocal( const std::string & scheme_r ) { static const char * val[] = { "cd", "dvd", "dir", "hd", "iso", "file" }; return isInList( arrayBegin(val), arrayEnd(val), scheme_r ); } bool Url::schemeIsRemote( const std::string & scheme_r ) { static const char * val[] = { "http", "https", "nfs", "nfs4", "smb", "cifs", "ftp", "sftp", "tftp" }; return isInList( arrayBegin(val), arrayEnd(val), scheme_r ); } bool Url::schemeIsVolatile( const std::string & scheme_r ) { static const char * val[] = { "cd", "dvd" }; return isInList( arrayBegin(val), arrayEnd(val), scheme_r ); } bool Url::schemeIsDownloading( const std::string & scheme_r ) { static const char * val[] = { "http", "https", "ftp", "sftp", "tftp" }; return isInList( arrayBegin(val), arrayEnd(val), scheme_r ); } bool Url::schemeIsPlugin( const std::string & scheme_r ) { return scheme_r == "plugin"; } /////////////////////////////////////////////////////////////////// // ----------------------------------------------------------------- bool Url::isValid() const { return m_impl->isValid(); } // ----------------------------------------------------------------- std::string Url::asString() const { return m_impl->asString(); } // ----------------------------------------------------------------- std::string Url::asCompleteString() const { // make sure, all url components are included; // regardless of the current configuration... ViewOptions opts(getViewOptions() + ViewOption::WITH_SCHEME + ViewOption::WITH_USERNAME + ViewOption::WITH_PASSWORD + ViewOption::WITH_HOST + ViewOption::WITH_PORT + ViewOption::WITH_PATH_NAME + ViewOption::WITH_PATH_PARAMS + ViewOption::WITH_QUERY_STR + ViewOption::WITH_FRAGMENT); return m_impl->asString(opts); } // ----------------------------------------------------------------- std::string Url::asString(const ViewOptions &opts) const { return m_impl->asString(opts); } // ----------------------------------------------------------------- std::string Url::getScheme() const { return m_impl->getScheme(); } // ----------------------------------------------------------------- std::string Url::getAuthority() const { return m_impl->getAuthority(); } // ----------------------------------------------------------------- std::string Url::getPathData() const { return m_impl->getPathData(); } // ----------------------------------------------------------------- std::string Url::getQueryString() const { return m_impl->getQueryString(); } // ----------------------------------------------------------------- std::string Url::getFragment(zypp::url::EEncoding eflag) const { return m_impl->getFragment(eflag); } // ----------------------------------------------------------------- std::string Url::getUsername(EEncoding eflag) const { return m_impl->getUsername(eflag); } // ----------------------------------------------------------------- std::string Url::getPassword(EEncoding eflag) const { return m_impl->getPassword(eflag); } // ----------------------------------------------------------------- std::string Url::getHost(EEncoding eflag) const { return m_impl->getHost(eflag); } // ----------------------------------------------------------------- std::string Url::getPort() const { return m_impl->getPort(); } // ----------------------------------------------------------------- std::string Url::getPathName(EEncoding eflag) const { return m_impl->getPathName(eflag); } // ----------------------------------------------------------------- std::string Url::getPathParams() const { return m_impl->getPathParams(); } // ----------------------------------------------------------------- zypp::url::ParamVec Url::getPathParamsVec() const { return m_impl->getPathParamsVec(); } // ----------------------------------------------------------------- zypp::url::ParamMap Url::getPathParamsMap(EEncoding eflag) const { return m_impl->getPathParamsMap(eflag); } // ----------------------------------------------------------------- std::string Url::getPathParam(const std::string ¶m, EEncoding eflag) const { return m_impl->getPathParam(param, eflag); } // ----------------------------------------------------------------- zypp::url::ParamVec Url::getQueryStringVec() const { return m_impl->getQueryStringVec(); } // ----------------------------------------------------------------- zypp::url::ParamMap Url::getQueryStringMap(EEncoding eflag) const { return m_impl->getQueryStringMap(eflag); } // ----------------------------------------------------------------- std::string Url::getQueryParam(const std::string ¶m, EEncoding eflag) const { return m_impl->getQueryParam(param, eflag); } // ----------------------------------------------------------------- void Url::setScheme(const std::string &scheme) { if(scheme == m_impl->getScheme()) { return; } if( m_impl->isKnownScheme(scheme)) { m_impl->setScheme(scheme); return; } UrlRef url = g_urlSchemeRepository().getUrlByScheme(scheme); if( !url) { url.reset( new UrlBase()); } url->init( scheme, m_impl->getAuthority(), m_impl->getPathData(), m_impl->getQueryString(), m_impl->getFragment(zypp::url::E_ENCODED) ); m_impl = url; } // ----------------------------------------------------------------- void Url::setAuthority(const std::string &authority) { m_impl->setAuthority(authority); } // ----------------------------------------------------------------- void Url::setPathData(const std::string &pathdata) { m_impl->setPathData(pathdata); } // ----------------------------------------------------------------- void Url::setQueryString(const std::string &querystr) { m_impl->setQueryString(querystr); } // ----------------------------------------------------------------- void Url::setFragment(const std::string &fragment, EEncoding eflag) { m_impl->setFragment(fragment, eflag); } // ----------------------------------------------------------------- void Url::setUsername(const std::string &user, EEncoding eflag) { m_impl->setUsername(user, eflag); } // ----------------------------------------------------------------- void Url::setPassword(const std::string &pass, EEncoding eflag) { m_impl->setPassword(pass, eflag); } // ----------------------------------------------------------------- void Url::setHost(const std::string &host) { m_impl->setHost(host); } // ----------------------------------------------------------------- void Url::setPort(const std::string &port) { m_impl->setPort(port); } // ----------------------------------------------------------------- void Url::setPathName(const std::string &path, EEncoding eflag) { m_impl->setPathName(path, eflag); } void Url::setPathName(const Pathname &path, EEncoding eflag) { m_impl->setPathName(path.asString(), eflag); } void Url::setPathName(const char *path, EEncoding eflag) { m_impl->setPathName(path, eflag); } // ----------------------------------------------------------------- void Url::appendPathName( const Pathname & path_r, EEncoding eflag_r ) { if ( ! path_r.emptyOrRoot() ) { // Check on string level to restore leading double slashes "//" (E_DECODED) // Most important for ftp: where "/%2f" (E_ENCODED) denotes an absolute path. std::string upath { getPathName( url::E_DECODED ) }; if ( upath.empty() ) { setPathName( path_r.absolutename(), eflag_r ); } else { bool doubleslhash = str::startsWith( upath, "//" ); Pathname npath { upath }; // now let Pathname handle the correct concatenation if ( eflag_r == url::E_DECODED ) { npath /= path_r; } else { npath /= url::decode( path_r.asString() ); } if ( doubleslhash ) { setPathName( "/" + npath.asString(), url::E_DECODED ); } else { setPathName( npath.asString(), url::E_DECODED ); } } } } // ----------------------------------------------------------------- void Url::setPathParams(const std::string ¶ms) { m_impl->setPathParams(params); } // ----------------------------------------------------------------- void Url::setPathParamsVec(const zypp::url::ParamVec &pvec) { m_impl->setPathParamsVec(pvec); } // ----------------------------------------------------------------- void Url::setPathParamsMap(const zypp::url::ParamMap &pmap) { m_impl->setPathParamsMap(pmap); } // ----------------------------------------------------------------- void Url::setPathParam(const std::string ¶m, const std::string &value) { m_impl->setPathParam(param, value); } // ----------------------------------------------------------------- void Url::setQueryStringVec(const zypp::url::ParamVec &pvec) { m_impl->setQueryStringVec(pvec); } // ----------------------------------------------------------------- void Url::setQueryStringMap(const zypp::url::ParamMap &pmap) { m_impl->setQueryStringMap(pmap, url::E_DECODED); } // ----------------------------------------------------------------- void Url::setQueryParam(const std::string ¶m, const std::string &value) { m_impl->setQueryParam(param, value); } // ----------------------------------------------------------------- void Url::delQueryParam(const std::string ¶m) { m_impl->delQueryParam(param); } void Url::delQueryParams(const std::set ¶ms) { m_impl->delQueryParams(params); } // ----------------------------------------------------------------- ViewOptions Url::getViewOptions() const { return m_impl->getViewOptions(); } // ----------------------------------------------------------------- void Url::setViewOptions(const ViewOptions &vopts) { m_impl->setViewOptions(vopts); } // ----------------------------------------------------------------- std::ostream & operator<<( std::ostream & str, const Url & url ) { return str << url.asString(); } bool operator<( const Url &lhs, const Url &rhs ) { return (lhs.asCompleteString() < rhs.asCompleteString()); } bool operator==( const Url &lhs, const Url &rhs ) { return (lhs.asCompleteString() == rhs.asCompleteString()); } bool operator!=( const Url &lhs, const Url &rhs ) { return (lhs.asCompleteString() != rhs.asCompleteString()); } namespace hotfix1050625 { std::string asString( const Url & url_r ) { return url_r.m_impl->asString1050625(); } } //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp-core/Url.h000066400000000000000000000720061476576476200162660ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** * \file zypp/Url.h */ #ifndef ZYPP_URL_H #define ZYPP_URL_H #include #include #include ////////////////////////////////////////////////////////////////////// namespace zypp { //////////////////////////////////////////////////////////////////// class Url; namespace hotfix1050625 { std::string asString( const Url & url_r ); } namespace filesystem { class Pathname; } using filesystem::Pathname; /** * \class Url * \brief Url manipulation class. * * The generic URL (URI) syntax and its main components are defined in * RFC3986 (http://rfc.net/rfc3986.html) Section 3, "Syntax Components". * The scheme specific URL syntax and semantics is defined in the * specification of the particular scheme. See also RFC1738 * (http://rfc.net/rfc1738.html), that defines specific syntax for * several URL schemes. * * This class provides methods to access and manipulate generic and * common scheme-specific URL components (or using the more general * term, URI components). * To consider the scheme-specifics of a URL, the Url class contains * a reference object pointing to a UrlBase or derived object, that * implements the scheme specifics. * * Using the Url::registerScheme() method, it is possible to register * a preconfigured or derived UrlBase object for a specific scheme * name. The registered object will be cloned to handle all URLs * containing the specified scheme name. * * \par RFC3986, Syntax Components: * * The generic URI syntax consists of a hierarchical sequence of * components referred to as the scheme, authority, path, query, * and fragment. * * \code * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] * * hier-part = "//" authority path-abempty * / path-absolute * / path-rootless * / path-empty * \endcode * * The scheme and path components are required, though the path may be * empty (no characters). * When authority is present, the path must either be empty or begin * with a slash ("/") character. * When authority is not present, the path cannot begin with two slash * characters ("//"). * These restrictions result in five different ABNF rules for a path * (Section 3.3), only one of which will match any given URI reference. * * The following are two example URIs and their component parts: * \code * foo://example.com:8042/over/there?name=ferret#nose * \_/ \______________/\_________/ \_________/ \__/ * | | | | | * scheme authority path query fragment * | _____________________|__ * / \ / \ * urn:example:animal:ferret:nose * \endcode * */ class ZYPP_API Url { public: /** * Encoding flags. */ using EEncoding = zypp::url::EEncoding; /** * View options. */ using ViewOptions = zypp::url::ViewOptions; ~Url(); Url(); /** * Create a new Url object as shared copy of the given one. * * Upon return, both objects will point to the same underlying * object. This state will remain until one of the object is * modified. * * \param url The Url object to make a copy of. * \throws url::UrlException if copy fails (should not happen). */ Url(const Url &url); /** * Create a new Url object as shared copy of the given reference. * * Upon return, both objects will point to the same underlying * object. This state will remain until one of the object is * modified. * * \param url The URL implementation reference to make a copy of. * \throws url::UrlException if reference is empty. */ Url(zypp::url::UrlRef url); /** * \brief Construct a Url object from percent-encoded URL string. * * Parses the \p encodedUrl string using the parseUrl() method * and assigns the result to the newly created object. * * \param encodedUrl A percent-encoded URL string. * \throws url::UrlParsingException if parsing of the url fails. * \throws url::UrlNotAllowedException if one of the components * is not allowed for the scheme. * \throws url::UrlBadComponentException if one of the components * contains an invalid character. */ Url(const std::string &encodedUrl); /** * @brief Move construct a Url object */ Url(Url &&other) = default; // ----------------- /** * \brief Parse a percent-encoded URL string. * * Tries to parse the given string into generic URL components * and creates a clone of a scheme-specialized object or a new * UrlBase object. * * \param encodedUrl A percent-encoded URL string. * \return A reference to a (derived) UrlBase object or * empty reference if the \p encodedUrl string * does not match the generic URL syntax. * \throws url::UrlNotAllowedException if one of the components * is not allowed for the scheme. * \throws url::UrlBadComponentException if one of the components * contains an invalid character. */ static url::UrlRef parseUrl(const std::string &encodedUrl); // ----------------- /** * \brief Assigns parsed percent-encoded URL string to the object. * * Parses \p encodedUrl string using the parseUrl() method * and assigns the result to the current object. * * \param encodedUrl A percent-encoded URL string. * \return A reference to this Url object. * \throws url::UrlParsingException if parsing of the url fails. * \throws url::UrlNotAllowedException if one of the components * is not allowed for the scheme. * \throws url::UrlBadComponentException if one of the components * contains an invalid character. */ Url& operator = (const std::string &encodedUrl); /** * \brief Assign a shared copy of \p url to the current object. * * Upon return, both objects will point to the same underlying * object. This state will remain until one of the objects is * modified. * * \param url The Url object to make a copy of. * \return A reference to this Url object. */ Url& operator = (const Url &url); /** * \brief Moves the data from other into the current object */ Url &operator=(Url &&other) = default; // ----------------- /** * \brief Register a scheme-specific implementation. * * \param scheme A name of a scheme. * \param urlImpl A UrlBase object specialized for this scheme. * \return True, if the object claims to implement the scheme. */ static bool registerScheme(const std::string &scheme, url::UrlRef urlImpl); /** * \brief Returns all registered scheme names. * \return A vector with registered URL scheme names. */ static zypp::url::UrlSchemes getRegisteredSchemes(); /** * \brief Returns if scheme name is registered. * \return True, if scheme name is registered. */ static bool isRegisteredScheme(const std::string &scheme); // ----------------- /** * \brief Returns scheme names known to this object. * \return A vector with scheme names known by this object. */ zypp::url::UrlSchemes getKnownSchemes() const; /** * \brief Verifies the specified scheme name. * * Verifies the generic syntax of the specified \p scheme name * and if it is contained in the current object's list of known * schemes (see getKnownSchemes()) if the list is not empty. * * The default implementation in the UrlBase class returns an * emtpy list of known schemes, causing a check of the generic * syntax only. * * \return True, if generic scheme name syntax is valid and * the scheme name is known to the current object. */ bool isValidScheme(const std::string &scheme) const; /** hd cd dvd dir file iso */ static bool schemeIsLocal( const std::string & scheme_r ); /** \overload nonstatic version */ bool schemeIsLocal() const { return schemeIsLocal( getScheme() ); } /** nfs nfs4 smb cifs http https ftp sftp tftp */ static bool schemeIsRemote( const std::string & scheme_r ); /** \overload nonstatic version */ bool schemeIsRemote() const { return schemeIsRemote( getScheme() ); } /** cd dvd */ static bool schemeIsVolatile( const std::string & scheme_r ); /** \overload nonstatic version */ bool schemeIsVolatile() const { return schemeIsVolatile( getScheme() ); } /** http https ftp sftp tftp */ static bool schemeIsDownloading( const std::string & scheme_r ); /** \overload nonstatic version */ bool schemeIsDownloading() const { return schemeIsDownloading( getScheme() ); } /** plugin */ static bool schemeIsPlugin( const std::string & scheme_r ); /** \overload nonstatic version */ bool schemeIsPlugin() const { return schemeIsPlugin( getScheme() ); } /** * \brief Verifies the Url. * * Verifies if the current object contains a non-empty scheme * name. Additional semantical URL checks may be performed by * derived UrlBase objects. * * \return True, if the Url seems to be valid. */ bool isValid() const; // ----------------- /** * Returns a default string representation of the Url object. * * By default, a password in the URL will be hidden. * * \return A default string representation of the Url object. */ std::string asString() const; /** * Returns a string representation of the Url object. * * To include a password in the resulting Url string, use: * \code * url.asString(url.getViewOptions() + * url::ViewOptions::WITH_PASSWORD); * \endcode * * \param opts A combination of view options. * \return A string representation of the Url object. */ std::string asString(const ViewOptions &opts) const; /** * Returns a complete string representation of the Url object. * * This function ignores the configuration of the view options * in the current object (see setViewOption()) and forces to * return a string with all URL components included. * * \return A complete string representation of the Url object. */ std::string asCompleteString() const; // ----------------- /** * Returns the scheme name of the URL. * \return Scheme name of the current Url object. */ std::string getScheme() const; // ----------------- /** * Returns the encoded authority component of the URL. * * The returned authority string does not contain the leading * "//" separator characters, but just its "user:pass@host:port" * content only. * * \return The encoded authority component string. */ std::string getAuthority() const; /** * Returns the username from the URL authority. * \param eflag Flag if the usename should be percent-decoded or not. * \return The username sub-component from the URL authority. * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ std::string getUsername(EEncoding eflag = zypp::url::E_DECODED) const; /** * Returns the password from the URL authority. * \param eflag Flag if the password should be percent-decoded or not. * \return The password sub-component from the URL authority. * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ std::string getPassword(EEncoding eflag = zypp::url::E_DECODED) const; /** * Returns \c true if username \b and password are encoded in the authority component. */ bool hasCredentialsInAuthority() const { return ! ( getUsername().empty() || getPassword().empty() ); } /** * Returns the hostname or IP from the URL authority. * * In case the Url contains an IP number, it may be surrounded * by "[" and "]" characters, for example "[::1]" for an IPv6 * localhost address. * * \param eflag Flag if the host should be percent-decoded or not. * \return The host sub-component from the URL authority. * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ std::string getHost(EEncoding eflag = zypp::url::E_DECODED) const; /** * Returns the port from the URL authority. * \return The port sub-component from the URL authority. */ std::string getPort() const; // ----------------- /** * Returns the encoded path component of the URL. * * The path data contains the path name, optionally * followed by path parameters separated with a ";" * character, for example "/foo/bar;version=1.1". * * \return The encoded path component of the URL. */ std::string getPathData() const; /** * Returns the path name from the URL. * \param eflag Flag if the path should be decoded or not. * \return The path name sub-component without path parameters * from Path-Data component of the URL. * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ std::string getPathName(EEncoding eflag = zypp::url::E_DECODED) const; /** * Returns the path parameters from the URL. * \return The encoded path parameters from the URL. */ std::string getPathParams() const; /** * Returns a vector with path parameter substrings. * * The default path parameter separator is the \c ',' character. * A schema specific object may overide the default separators. * * For example, the path parameters string "foo=1,bar=2" is splited * by default into a vector containing the substrings "foo=1" and * "bar=2". * * \return The path parameters splited into a vector of substrings. */ zypp::url::ParamVec getPathParamsVec() const; /** * Returns a string map with path parameter keys and values. * * The default path parameter separator is the \c ',' character, * the default key/value separator for the path parameters is * the \c '=' character. * A schema specific object may overide the default separators. * * For example, the path parameters string "foo=1,bar=2" is splited * into a map containing "foo" = "1" and "bar" = "2" by default. * * \param eflag Flag if the path parameter keys and values should * be decoded or not. * \return The path parameters key and values as a string map. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ zypp::url::ParamMap getPathParamsMap(EEncoding eflag = zypp::url::E_DECODED) const; /** * Return the value for the specified path parameter. * * For example, if the path parameters string is "foo=1,bar=2" * the method will return the substring "1" for the param key * "foo" and "2" for the param key "bar". * * \param param The path parameter key. * \param eflag Flag if the path parameter keys and values should * be decoded or not. * \return The value for the path parameter key or empty string. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ std::string getPathParam(const std::string ¶m, EEncoding eflag = zypp::url::E_DECODED) const; // ----------------- /** * Returns the encoded query string component of the URL. * * The query string is returned without first "?" (separator) * character. Further "?" characters as in e.g. LDAP URLs * remain in the returned string. * * \return The encoded query string component of the URL. */ std::string getQueryString() const; /** * Returns a vector with query string parameter substrings. * * The default query string parameter separator is the \c '&' * character. * A schema specific object may overide the default separators. * * For example, the query string "foo=1&bar=2" is splited by * default into a vector containing the substrings "foo=1" and * "bar=2". * * \return The query string splited into a vector of substrings. */ zypp::url::ParamVec getQueryStringVec() const; /** * Returns a string map with query parameter and their values. * * The default query string parameter separator is the \c ',' * character, the default key/value separator the \c '=' character. * A schema specific object may overide the default separators. * * For example, the query string "foo=1&bar=2" is splited by * default into a map containing "foo" = "1" and "bar" = "2". * * \param eflag Flag if the query string keys and values should * be decoded or not. * \return The query string as a key/value string map. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ zypp::url::ParamMap getQueryStringMap(EEncoding eflag = zypp::url::E_DECODED) const; /** * Return the value for the specified query parameter. * * For example, if the query string is "foo=1,bar=2" the method * will return the substring "1" for the param key "foo" and * "2" for the param key "bar". * * \param param The query parameter key. * \param eflag Flag if the query parameter keys and values should * be decoded or not. * \return The value for the query parameter key or empty string. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ std::string getQueryParam(const std::string ¶m, EEncoding eflag = zypp::url::E_DECODED) const; // ----------------- /** * Returns the encoded fragment component of the URL. * \param eflag Flag if the fragment should be percent-decoded or not. * \return The encoded fragment component of the URL. * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ std::string getFragment(EEncoding eflag = zypp::url::E_DECODED) const; // ----------------- /** * \brief Set the scheme name in the URL. * \param scheme The new scheme name. * \throws url::UrlBadComponentException if the \p scheme * contains an invalid character or is empty. */ void setScheme(const std::string &scheme); // ----------------- /** * \brief Set the authority component in the URL. * * The \p authority string shoud contain the "user:pass@host:port" * sub-components without any leading "//" separator characters. * * \param authority The encoded authority component string. * \throws url::UrlNotAllowedException if the \p authority * has to be empty in for the current scheme. * \throws url::UrlBadComponentException if the \p authority * contains an invalid character. * \throws url::UrlParsingException if \p authority parsing fails. */ void setAuthority(const std::string &authority); /** * \brief Set the username in the URL authority. * \param user The new username. * \param eflag If the \p username is encoded or not. * \throws url::UrlNotAllowedException if the \p user * has to be empty in for the current scheme * \throws url::UrlBadComponentException if the \p user * contains an invalid character. */ void setUsername(const std::string &user, EEncoding eflag = zypp::url::E_DECODED); /** * \brief Set the password in the URL authority. * \param pass The new password. * \param eflag If the \p password is encoded or not. * \throws url::UrlNotAllowedException if the \p pass * has to be empty in for the current scheme. * \throws url::UrlBadComponentException if the \p pass * contains an invalid character. */ void setPassword(const std::string &pass, EEncoding eflag = zypp::url::E_DECODED); /** * \brief Set the hostname or IP in the URL authority. * * The \p host parameter may contain a hostname, an IPv4 address * in dotted-decimal form or an IPv6 address literal encapsulated * within square brackets (RFC3513, Sect. 2.2). * * A hostname may contain national alphanumeric UTF8 characters * (letters other than ASCII a-z0-9), that will be encoded. * This function allows to specify both, a encoded or decoded * hostname. * * Other IP literals in "[v ... ]" square bracket format are not * supported by the implementation in UrlBase class. * * \param host The new hostname or IP address. * \throws url::UrlNotAllowedException if the \p host (authority) * has to be empty in for the current scheme. * \throws url::UrlBadComponentException if the \p host is invalid. */ void setHost(const std::string &host); /** * \brief Set the port number in the URL authority. * \param port The new port number. * \throws url::UrlNotAllowedException if the \p port (authority) * has to be empty in for the current scheme. * \throws url::UrlBadComponentException if the \p port is invalid. */ void setPort(const std::string &port); // ----------------- /** * \brief Set the path data component in the URL. * * By default, the \p pathdata string may include path * parameters separated by the ";" separator character. * * \param pathdata The encoded path data component string. * \throws url::UrlBadComponentException if the \p pathdata * contains an invalid character. */ void setPathData(const std::string &pathdata); /** * \brief Set the path name. * \param path The new path name. * \param eflag If the \p path name is encoded or not. * \throws url::UrlBadComponentException if the \p path name * contains an invalid character. */ void setPathName(const std::string &path, EEncoding eflag = zypp::url::E_DECODED); /** \overload */ void setPathName(const Pathname &path, EEncoding eflag = zypp::url::E_DECODED); /** \overload */ void setPathName(const char *path, EEncoding eflag = zypp::url::E_DECODED); /** * \brief Extend the path name. */ void appendPathName( const Pathname & path_r, EEncoding eflag_r = zypp::url::E_DECODED ); /** * \brief Set the path parameters. * \param params The new encoded path parameter string. * \throws url::UrlBadComponentException if the path \p params * contains an invalid character. */ void setPathParams(const std::string ¶ms); /** * \brief Set the path parameters. * \param pvec The vector with encoded path parameters. * \throws url::UrlBadComponentException if the \p pvec * contains an invalid character. */ void setPathParamsVec(const zypp::url::ParamVec &pvec); /** * \brief Set the path parameters. * \param pmap The map with decoded path parameters. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). */ void setPathParamsMap(const zypp::url::ParamMap &pmap); /** * \brief Set or add value for the specified path parameter. * \param param The decoded path parameter name. * \param value The decoded path parameter value. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ void setPathParam(const std::string ¶m, const std::string &value); // ----------------- /** * \brief Set the query string in the URL. * \param querystr The new encoded query string. * \throws url::UrlBadComponentException if the \p querystr * contains an invalid character. */ void setQueryString(const std::string &querystr); /** * \brief Set the query parameters. * \param qvec The vector with encoded query parameters. * \throws url::UrlBadComponentException if the \p qvec * contains an invalid character. */ void setQueryStringVec(const zypp::url::ParamVec &qvec); /** * \brief Set the query parameters. * \param qmap The map with decoded query parameters. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). */ void setQueryStringMap(const zypp::url::ParamMap &qmap); /** * \brief Set or add value for the specified query parameter. * \param param The decoded query parameter name. * \param value The decoded query parameter value. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ void setQueryParam(const std::string ¶m, const std::string &value); /** * \brief remove the specified query parameter. * \param param The decoded query parameter name. * \throws url::UrlNotSupportedException if parameter parsing * is not supported for a URL (scheme). * \throws url::UrlDecodingException if the decoded result string * would contain a '\\0' character. */ void delQueryParam(const std::string ¶m); /** \brief remove multiple query parameters at once */ void delQueryParams(const std::set ¶ms); // ----------------- /** * \brief Set the fragment string in the URL. * \param fragment The new fragment string. * \param eflag If the \p fragment is encoded or not. * \throws url::UrlBadComponentException if the \p fragment * contains an invalid character. */ void setFragment(const std::string &fragment, EEncoding eflag = zypp::url::E_DECODED); // ----------------- /** * Return the view options of the current object. * * This method is used to query the view options * used by the asString() method. * * \return The current view option combination. */ ViewOptions getViewOptions() const; /** * Change the view options of the current object. * * This method is used to change the view options * used by the asString() method. * * \param vopts New view options combination. */ void setViewOptions(const ViewOptions &vopts); private: friend std::string hotfix1050625::asString( const Url & url_r ); url::UrlRef m_impl; }; std::ostream & operator<<( std::ostream & str, const Url & url ) ZYPP_API; /** * needed for std::set */ bool operator<( const Url &lhs, const Url &rhs ) ZYPP_API; /** * needed for find */ bool operator==( const Url &lhs, const Url &rhs ) ZYPP_API; bool operator!=( const Url &lhs, const Url &rhs ) ZYPP_API; //////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////////// #endif /* ZYPP_URL_H */ /* ** vim: set ts=2 sts=2 sw=2 ai et: */ libzypp-17.36.5/zypp-core/UserData.h000066400000000000000000000167351476576476200172430ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/UserData.h */ #ifndef ZYPP_CORE_USERDATA_H #define ZYPP_CORE_USERDATA_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace callback { /////////////////////////////////////////////////////////////////// /// \class UserData /// \brief Typesafe passing of user data via callbacks /// /// Basically a std::map plus /// associated \ref ContentType. /// /// Constness protects non-empty values from being modified. /// It is possible to overwrite empty values or to add new ones. /////////////////////////////////////////////////////////////////// class UserData { public: typedef boost::any AnyType; typedef boost::bad_any_cast bad_AnyType_cast; typedef std::map DataType; typedef DataType::size_type size_type; typedef DataType::key_type key_type; typedef DataType::value_type value_type; typedef DataType::const_iterator const_iterator; typedef zypp::ContentType ContentType; public: /** Default ctor. */ UserData() {} /** Ctor taking ContentType. */ explicit UserData( ContentType type_r ) : _type( std::move(type_r) ) {} /** Ctor taking ContentType. */ explicit UserData( std::string type_r ) : UserData( ContentType( std::move(type_r) ) ) {} /** Ctor taking ContentType. */ UserData( std::string type_r, std::string subtype_r ) : UserData( ContentType( std::move(type_r), std::move(subtype_r) ) ) {} public: /** Get type. */ const ContentType & type() const { return _type; } /** Set type. */ void type( ContentType type_r ) { _type = std::move(type_r); } public: /** Validate object in a boolean context: has data */ explicit operator bool() const { return !empty(); } /** Whether \ref data is empty. */ bool empty() const { return !_dataP || _dataP->empty(); } /** Size of \ref data. */ size_type size() const { return _dataP ? _dataP->size() : 0; } /** The \ref data. */ const DataType & data() const { return dataRef(); } /** Whether \a key_r is in \ref data. */ bool haskey( const std::string & key_r ) const { return _dataP && _dataP->find( key_r ) != _dataP->end(); } /** Whether \a key_r is in \ref data and value is not empty. */ bool hasvalue( const std::string & key_r ) const { bool ret = false; if ( _dataP ) { const_iterator it = _dataP->find( key_r ); if ( it != _dataP->end() && ! it->second.empty() ) { ret = true; } } return ret; } /** Set the value for key (nonconst version always returns true). * Const version is allowed to set empty values or to add new ones only. */ bool set( const std::string & key_r, AnyType val_r ) { dataRef()[key_r] = std::move(val_r); return true; } /** \overload const version */ bool set( const std::string & key_r, AnyType val_r ) const { bool ret = false; AnyType & val( dataRef()[key_r] ); if ( val.empty() ) { val = std::move(val_r); ret = true; } return ret; } /** Set an empty value for \a key_r (if possible). */ bool reset( const std::string & key_r ) { return set( key_r, AnyType() ); } /** \overload const version */ bool reset( const std::string & key_r ) const { return set( key_r, AnyType() ); } /** Remove key from data.*/ void erase( const std::string & key_r ) { if ( _dataP ) _dataP->erase( key_r ); } /** \ref get helper returning the keys AnyType value or an empty value if key does not exist. */ const AnyType & getvalue( const std::string & key_r ) const { if ( _dataP ) { const_iterator it = _dataP->find( key_r ); if ( it != _dataP->end() ) { return it->second; } } static const AnyType none; return none; } /** Pass back a const Tp & reference to \a key_r value. * \throws bad_AnyType_cast if key is not set or value is not of appropriate type * \code * UserData data; * std::string value( "defaultvalue" ); * try * { * value = data.get( "mykey" ); * } * catch ( const UserData::bad_AnyType_cast & ) * { * // no "mykey" or not a std::sting * } * \endcode */ template const Tp & get( const std::string & key_r ) const { return boost::any_cast( getvalue( key_r ) ); } /** Pass back a \a Tp copy of \a key_r value. * \throws bad_AnyType_cast if key is not set or value is not of appropriate type * \code * UserData data; * std::string value = data.get( "mykey", "defaultvalue" ); * \endcode */ template Tp get( const std::string & key_r, const Tp & default_r ) const { Tp ret( default_r ); get( key_r, ret ); return ret; } /** If the value for \a key_r is of the same type as \a ret_r, pass it back in \a ret_r and return \c true;. * \code * UserData data; * std::string value( "defaultvalue" ); * if ( ! data.get( "mykey", value ) * { * // no "mykey" or not a std::sting * } * \endcode */ template bool get( const std::string & key_r, Tp & ret_r ) const { bool ret = false; if ( _dataP ) { const_iterator it = _dataP->find( key_r ); if ( it != _dataP->end() ) { auto ptr = boost::any_cast(&it->second); if ( ptr ) { ret_r = *ptr; ret = true; } } } return ret; } private: DataType & dataRef() const { if ( ! _dataP ) _dataP.reset( new DataType ); return *_dataP; } private: ContentType _type; mutable shared_ptr _dataP; }; /** \relates UserData Stream output */ inline std::ostream & operator<<( std::ostream & str, const UserData & obj ) { return str << "UserData(" << obj.type() << ":" << obj.size() << ")";} } // namespace callback /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_CORE_USERDATA_H libzypp-17.36.5/zypp-core/base/000077500000000000000000000000001476576476200162605ustar00rootroot00000000000000libzypp-17.36.5/zypp-core/base/CleanerThread.cc000066400000000000000000000050141476576476200212700ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/CleanerThread.cc */ #include #include #include #include #include #include #include #include #include #include #include struct CleanerData { static CleanerData &instance () { // C++11 requires that this is thread safe "magic statics" // this is a intentional leak and will live until the application exits static CleanerData *data( new CleanerData ); return *data; } CleanerData () { std::thread t ( [&](){ this->run(); } ); t.detach(); //we will control the thread otherwise } void run () { // force the kernel to pick another thread to handle signals zyppng::blockAllSignalsForCurrentThread(); zyppng::ThreadData::current().setName("Zypp-Cleaner"); std::unique_lock lk( _m ); while ( true ) { auto filter = []( pid_t pid ){ int status = 0; int res = waitpid( pid, &status, WNOHANG ); // we either got an error, or the child has exited, remove it from list bool removeMe = ( res == -1 || res == pid ); return removeMe; }; _watchedPIDs.erase( std::remove_if( _watchedPIDs.begin(), _watchedPIDs.end(), filter ), _watchedPIDs.end() ); if ( _watchedPIDs.size() ) _cv.wait_for( lk, std::chrono::milliseconds(100) ); else _cv.wait( lk ); } } std::mutex _m; // < locks all data in CleanerData, do not access it without owning the mutex std::condition_variable _cv; std::vector _watchedPIDs; }; void zypp::CleanerThread::watchPID( pid_t pid_r ) { CleanerData &data = CleanerData::instance(); { std::lock_guard guard( data._m ); data._watchedPIDs.push_back( pid_r ); } //wake the thread up data._cv.notify_one(); } libzypp-17.36.5/zypp-core/base/CleanerThread_p.h000066400000000000000000000016311476576476200214520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/CleanerThread_p.h * This file contains private API, it will change without notice. * You have been warned. */ #include #include namespace zypp { class ZYPP_LOCAL CleanerThread { public: CleanerThread() = delete; static void watchPID ( pid_t pid_r ); }; } libzypp-17.36.5/zypp-core/base/DefaultIntegral000066400000000000000000000000351476576476200212530ustar00rootroot00000000000000#include "defaultintegral.h" libzypp-17.36.5/zypp-core/base/DtorReset000066400000000000000000000000271476576476200201150ustar00rootroot00000000000000#include "dtorreset.h" libzypp-17.36.5/zypp-core/base/Easy.h000066400000000000000000000065631476576476200173440ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Easy.h * */ #ifndef ZYPP_BASE_EASY_H #define ZYPP_BASE_EASY_H #include #include /** Convenient for-loops using iterator. * \code * std::set; _store; * for_( it, _store.begin(), _store.end() ) * { * cout << *it << endl; * } * \endcode */ #define for_(IT,BEG,END) for ( auto IT = BEG, _for_end = END; IT != _for_end; ++IT ) /** Simple C-array iterator * \code * const char * defstrings[] = { "", "a", "default", "two words" }; * for_( it, arrayBegin(defstrings), arrayEnd(defstrings) ) * cout << *it << endl; * \endcode */ #define arrayBegin(A) (&A[0]) #define arraySize(A) (sizeof(A)/sizeof(*A)) #define arrayEnd(A) (&A[0] + arraySize(A)) /** * \code * defConstStr( strANY(), "ANY" ); * std::str str = strANY(); * \endcode */ #define defConstStr(FNC,STR) inline const std::string & FNC { static const std::string val( STR ); return val; } /** Delete copy ctor and copy assign */ #define NON_COPYABLE(CLASS) \ CLASS( const CLASS & ) = delete; \ CLASS & operator=( const CLASS & ) = delete /** Default copy ctor and copy assign */ #define DEFAULT_COPYABLE(CLASS) \ CLASS( const CLASS & ) = default; \ CLASS & operator=( const CLASS & ) = default /** Delete move ctor and move assign */ #define NON_MOVABLE(CLASS) \ CLASS( CLASS && ) = delete; \ CLASS & operator=( CLASS && ) = delete /** Default move ctor and move assign */ #define DEFAULT_MOVABLE(CLASS) \ CLASS( CLASS && ) = default; \ CLASS & operator=( CLASS && ) = default /** Delete copy ctor and copy assign but enable default move */ #define NON_COPYABLE_BUT_MOVE( CLASS ) \ NON_COPYABLE(CLASS); \ DEFAULT_MOVABLE(CLASS) /** Default move ctor and move assign but enable default copy */ #define NON_MOVABLE_BUT_COPY( CLASS ) \ NON_MOVABLE(CLASS); \ DEFAULT_COPYABLE(CLASS) /** Prevent an universal ctor to be chosen as copy ctor. * \code * struct FeedStrings * { * template> * FeedStrings( TARG && arg_r ) * : _value { std::forward( arg_r ) } * {} * * // Same with variadic template. Could be chosen as copy_ctor. * template * FeedStrings( Us &&... us ) * : ... * * private: * std::string _value; * \endcode */ template using disable_use_as_copy_ctor = std::enable_if_t>>; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_EASY_H libzypp-17.36.5/zypp-core/base/EnumClass.h000066400000000000000000000072621476576476200203320ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/EnumClass.h */ #ifndef ZYPP_BASE_ENUMCLASS_H #define ZYPP_BASE_ENUMCLASS_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// namespace base { /////////////////////////////////////////////////////////////////// /// \class EnumClass /// \brief Type safe enum (workaround SWIG not supporting enum class) /// \code /// struct EColorDef { enum Enum { R, G ,B }; }; /// typedef EnumClass Color; /// \endcode /// Conversion to from string can be easily added, e.g. like this: /// \code /// struct EColorDef { /// enum Enum { R, G ,B }; /// static Enum fromString( const std::string & val_r ); /// static const std::string & asString( Enum val_r ); /// }; /// std::ostream & operator<<( std::ostream & str, const EColorDef & obj ) /// { return str << EColorDef::asString( obj.inSwitch() ); } /// /// typedef EnumClass Color; /// Color red = Color::fromString("red"); /// cout << red << endl; // "red" /// \endcode /////////////////////////////////////////////////////////////////// template class EnumClass : public TEnumDef { public: using Enum = typename TEnumDef::Enum; ///< The underlying enum type using Integral = std::underlying_type_t;///< The underlying integral type EnumClass( Enum val_r ) : _val( val_r ) {} /** Underlying enum value for use in switch * \code * struct EColorDef { enum Enum { R, G ,B }; } * typedef EnumClass Color; * * Color a; * switch ( a.asEnum() ) * \endcode */ Enum asEnum() const { return _val; } /** Underlying integral value (e.g. array index) * \code * struct EColorDef { enum Enum { R, G ,B }; } * typedef EnumClass Color; * * Color a; * std::string table[] = { "red", "green", "blue" }; * std::cout << table[a.asIntegral()] << std::endl; */ Integral asIntegral() const { return static_cast(_val); } friend bool operator==( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val == rhs._val; } friend bool operator!=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val != rhs._val; } friend bool operator< ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val < rhs._val; } friend bool operator<=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val <= rhs._val; } friend bool operator> ( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val > rhs._val; } friend bool operator>=( const EnumClass & lhs, const EnumClass & rhs ) { return lhs._val >= rhs._val; } private: Enum _val; }; } // namespace base /////////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_ENUMCLASS_H libzypp-17.36.5/zypp-core/base/Errno.h000066400000000000000000000043371476576476200175250ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Errno.h * */ #ifndef ZYPP_BASE_ERRNO_H #define ZYPP_BASE_ERRNO_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Convenience \c errno wrapper. */ class Errno { public: /** Default ctor: \c errno */ Errno() : _errno( errno ) {} /** Ctor set to \c errno if error condition, else \c 0. * \code * int ret = ::write( fd, buffer, size ); * DBG << "write returns: " << Errno( ret != size ) << end; * // on success: "write returns: [0-Success]" * // on error e.g.: "write returns: [11-Resource temporarily unavailable]" * \endcode */ Errno( bool error_r ) : _errno( error_r ? errno : 0 ) {} /** Ctor taking an explicit errno value. */ Errno( int errno_r ) : _errno( errno_r ) {} public: /** Return the stored errno. */ int get() const { return _errno; } /** Allow implicit conversion to \c int. */ operator int() const { return get(); } /** Return human readable error string. */ std::string asString() const { return str::form( "[%d-%s]", _errno, ::strerror(_errno) ); } private: int _errno; }; /** \relates Errno Stream output */ inline std::ostream & operator<<( std::ostream & str, const Errno & obj ) { return str << obj.asString(); } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_ERRNO_H libzypp-17.36.5/zypp-core/base/Exception.cc000066400000000000000000000154641476576476200205370ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Exception.cc * */ #include #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace exception_detail { ///////////////////////////////////////////////////////////////// std::string CodeLocation::asString() const { return str::form( "%s(%s):%u", _file.c_str(), _func.c_str(), _line ); } std::ostream & operator<<( std::ostream & str, const CodeLocation & obj ) { return str << obj.asString(); } void do_ZYPP_RETHROW(const std::exception_ptr &excpt_r, const CodeLocation &where_r) { if ( !excpt_r ) return; try { std::rethrow_exception (excpt_r); } catch ( const zypp::Exception &e ) { Exception::log( e, where_r, "RETHROW: " ); throw; } catch ( const std::exception & e ) { Exception::log( typeid(e).name(), where_r, "RETHROW: " ); throw; } catch (...) { Exception::log( "Unknown Exception", where_r, "RETHROW: " ); throw; } } std::exception_ptr do_ZYPP_FWD_EXCPT_PTR( const std::exception_ptr & excpt_r, const CodeLocation & where_r ) { try { std::rethrow_exception( excpt_r ); } catch ( zypp::Exception &e ) { e.relocate( where_r ); Exception::log( e, where_r, "RETHROW (FWD) EXCPTR: " ); return std::current_exception(); } catch ( const std::exception & e ) { Exception::log( typeid(e).name(), where_r, "RETHROW (FWD) EXCPTR: " ); return std::current_exception(); } catch (...) { Exception::log( "Unknown Exception", where_r, "RETHROW (FWD) EXCPTR: " ); return std::current_exception(); } } ///////////////////////////////////////////////////////////////// } // namespace exception_detail /////////////////////////////////////////////////////////////////// Exception::Exception() {} Exception::Exception( const std::string & msg_r ) : _msg( msg_r ) {} Exception::Exception( std::string && msg_r ) : _msg( std::move(msg_r) ) {} Exception::Exception( const std::string & msg_r, const Exception & history_r ) : _msg( msg_r ) { remember( history_r ); } Exception::Exception( std::string && msg_r, const Exception & history_r ) : _msg( std::move(msg_r) ) { remember( history_r ); } Exception::Exception( const std::string & msg_r, Exception && history_r ) : _msg( msg_r ) { remember( std::move(history_r) ); } Exception::Exception( std::string && msg_r, Exception && history_r ) : _msg( std::move(msg_r) ) { remember( std::move(history_r) ); } Exception::~Exception() throw() {} std::string Exception::asString() const { std::ostringstream str; dumpOn( str ); return str.str(); } std::string Exception::asUserString() const { std::ostringstream str; dumpOn( str ); // call gettext to translate the message. This will // not work if dumpOn() uses composed messages. return _(str.str().c_str()); } std::string Exception::asUserHistory() const { if ( historyEmpty() ) return asUserString(); std::string ret( asUserString() ); if ( ret.empty() ) return historyAsString(); ret += '\n'; ret += historyAsString(); return ret; } void Exception::remember( const Exception & old_r ) { if ( &old_r != this ) // no self-remember { History newh( old_r._history.begin(), old_r._history.end() ); newh.push_front( old_r.asUserString() ); _history.swap( newh ); } } void Exception::remember( Exception && old_r ) { if ( &old_r != this ) // no self-remember { History & newh( old_r._history ); // stealing it newh.push_front( old_r.asUserString() ); _history.swap( newh ); } } void Exception::remember( std::exception_ptr old_r ) { try { if (old_r) { std::rethrow_exception(std::move(old_r)); } } catch( const Exception& e ) { remember( e ); } catch ( const std::exception& e ) { addHistory( e.what() ); } catch ( ... ) { addHistory( "Remembered unknown exception" ); } } void Exception::addHistory( const std::string & msg_r ) { _history.push_front( msg_r ); } void Exception::addHistory( std::string && msg_r ) { _history.push_front( std::move(msg_r) ); } std::string Exception::historyAsString() const { std::ostringstream ret; if ( not _history.empty() ) { ret << _("History:"); for ( const std::string & entry : _history ) { strv::split( entry, "\n", [&ret]( std::string_view line_r, unsigned idx, bool last_r ) -> void { if ( not ( last_r && line_r.empty() ) ) ret << endl << (idx==0?" - ":" ") << line_r; }); } } return ret.str(); } std::ostream & Exception::dumpOn( std::ostream & str ) const { return str << _msg; } std::ostream & Exception::dumpError( std::ostream & str ) const { return dumpOn( str << _where << ": " ); } std::ostream & operator<<( std::ostream & str, const Exception & obj ) { return obj.dumpError( str ); } std::string Exception::strErrno( int errno_r ) { return str::strerror( errno_r ); } std::string Exception::strErrno( int errno_r, std::string msg_r ) { msg_r += ": "; return msg_r += strErrno( errno_r ); } void Exception::log( const Exception & excpt_r, const CodeLocation & where_r, const char *const prefix_r ) { INT << where_r << " " << prefix_r << " " << excpt_r.asUserHistory() << endl; } void Exception::log( const char * typename_r, const CodeLocation & where_r, const char *const prefix_r ) { INT << where_r << " " << prefix_r << " exception of type " << typename_r << endl; } ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/Exception.h000066400000000000000000000412321476576476200203710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Exception.h * */ #ifndef ZYPP_BASE_EXCEPTION_H #define ZYPP_BASE_EXCEPTION_H #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace exception_detail { ///////////////////////////////////////////////////////////////// /** Keep _FILE_, _FUNCTION_ and _LINE_. * Construct it using the \ref ZYPP_EX_CODELOCATION macro. */ struct CodeLocation { friend std::ostream & operator<<( std::ostream & str, const CodeLocation & obj ); /** Ctor */ CodeLocation() : _line( 0 ) {} /** Ctor */ CodeLocation( std::string file_r, std::string func_r, unsigned line_r ) : _file(std::move( file_r )), _func(std::move( func_r )), _line( line_r ) {} /** Location as string */ std::string asString() const; private: std::string _file; std::string _func; unsigned _line; }; /////////////////////////////////////////////////////////////////// /** Create CodeLocation object storing the current location. */ //#define ZYPP_EX_CODELOCATION ::zypp::exception_detail::CodeLocation(__FILE__,__FUNCTION__,__LINE__) #define ZYPP_EX_CODELOCATION ::zypp::exception_detail::CodeLocation(( *__FILE__ == '/' ? strrchr( __FILE__, '/' ) + 1 : __FILE__ ),__FUNCTION__,__LINE__) /** \relates CodeLocation Stream output */ std::ostream & operator<<( std::ostream & str, const CodeLocation & obj ); ///////////////////////////////////////////////////////////////// } // namespace exception_detail /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Exception /** Base class for Exception. * * Exception offers to store a message string passed to the ctor. * Derived classes may provide additional information. Overload * \ref dumpOn to provide a proper error text. * * \li Use \ref ZYPP_THROW to throw exceptions. * \li Use \ref ZYPP_CAUGHT If you caught an exceptions in order to handle it. * \li Use \ref ZYPP_RETHROW to rethrow a caught exception. * * The use of these macros is not mandatory. but \c ZYPP_THROW and * \c ZYPP_RETHROW will adjust the code location information stored in * the Exception. All three macros will drop a line in the logfile. * \code * 43 try * 44 { * 45 try * 46 { * 47 ZYPP_THROW( Exception("Something bad happened.") ); * 48 } * 49 catch ( Exception & excpt ) * 50 { * 51 ZYPP_RETHROW( excpt ); * 52 } * 53 * 54 } * 55 catch ( Exception & excpt ) * 56 { * 57 ZYPP_CAUGHT( excpt ); * 58 } * \endcode * The above produces the following log lines: * \code * Main.cc(main):47 THROW: Main.cc(main):47: Something bad happened. * Main.cc(main):51 RETHROW: Main.cc(main):47: Something bad happened. * Main.cc(main):57 CAUGHT: Main.cc(main):51: Something bad happened. * \endcode * * * Class Exception now offers a history list of message strings. * These messages should describe what lead to the exception. * * The Exceptions message itself is NOT included in the history. * * Rethrow, remembering an old exception: * \code * try * { * .... * } * catch( const Exception & olderr_r ) * { * ZYPP_CAUGHT( olderr_r ) * HighLevelException newerr( "Something failed." ); * newerr.rember( olderr_r ); * ZYPP_THROW( newerr ); * } * \endcode * * Print an Exception, followed by its history, if available: * \code * Exception error; * ERR << error << endl << error.historyAsString(); * \endcode * * \todo That's a draft to have a common way of throwing exceptions. * Most probably, we'll finally use blocxx exceptions here, but not * in the remaining code of zypp. If we can, we should try to wrap * the blocxx macros and typedef the classes in here. **/ class ZYPP_API Exception : public std::exception { friend std::ostream & operator<<( std::ostream & str, const Exception & obj ); public: using CodeLocation = exception_detail::CodeLocation; using History = std::list; using HistoryIterator = History::const_iterator; using HistorySize = History::size_type; /** Default ctor. * Use \ref ZYPP_THROW to throw exceptions. */ Exception(); /** Ctor taking a message. * Use \ref ZYPP_THROW to throw exceptions. */ Exception( const std::string & msg_r ); /** \overload */ Exception( std::string && msg_r ); /** Ctor taking a message and an exception to remember as history * \see \ref remember * Use \ref ZYPP_THROW to throw exceptions. */ Exception( const std::string & msg_r, const Exception & history_r ); /** \overload moving */ Exception( std::string && msg_r, const Exception & history_r ); /** \overload moving */ Exception( const std::string & msg_r, Exception && history_r ); /** \overload moving */ Exception( std::string && msg_r, Exception && history_r ); /** Dtor. */ ~Exception() throw() override; /** Return CodeLocation. */ const CodeLocation & where() const { return _where; } /** Exchange location on rethrow. */ void relocate( const CodeLocation & where_r ) const { _where = where_r; } /** Return the message string provided to the ctor. * \note This is not necessarily the complete error message. * The whole error message is provided by \ref asString or * \ref dumpOn. */ const std::string & msg() const { return _msg; } /** Error message provided by \ref dumpOn as string. */ std::string asString() const; /** Translated error message as string suitable for the user. * \see \ref asUserStringHistory */ std::string asUserString() const; public: /** \name History list of message strings. * Maintain a simple list of individual error messages, that lead * to this Exception. The Exceptions message itself is not included * in the history. The History list stores the most recent message * fist. */ //@{ /** Store an other Exception as history. */ void remember( const Exception & old_r ); /** \overload moving */ void remember( Exception && old_r ); /** \overload std::exception_ptr */ void remember( std::exception_ptr old_r ); /** Remembering a plain string is most probably not wanted - we \ref addHistory. * It would discards the old history and replace it with this string. * If that's actually your intent, explicitly wrap it into an \ref Exception. */ void remember( const std::string & msg_r ) { addHistory( msg_r ); } /** \overload moving */ void remember( std::string && msg_r ) { addHistory( std::move(msg_r) ); } /** Add some message text to the history. */ void addHistory( const std::string & msg_r ); /** \overload moving */ void addHistory( std::string && msg_r ); /** \ref addHistory from string container types (oldest first) */ template void addToHistory( const TContainer & msgc_r ) { for ( const std::string & el : msgc_r ) addHistory( el ); } /** \ref addHistory from string container types (oldest first) moving */ template void moveToHistory( TContainer && msgc_r ) { for ( std::string & el : msgc_r ) addHistory( std::move(el) ); } /** Iterator pointing to the most recent message. */ HistoryIterator historyBegin() const { return _history.begin(); } /** Iterator pointing behind the last message. */ HistoryIterator historyEnd() const { return _history.end(); } /** Whether the history list is empty. */ bool historyEmpty() const { return _history.empty(); } /** The size of the history list. */ HistorySize historySize() const { return _history.size(); } /** The history as string. Empty if \ref historyEmpty. * Otherwise: * \code * History: * - most recent message * - 2nd message * ... * - oldest message * \endcode */ std::string historyAsString() const; /** A single (multiline) string composed of \ref asUserString and \ref historyAsString. */ std::string asUserHistory() const; //@} protected: /** Overload this to print a proper error message. */ virtual std::ostream & dumpOn( std::ostream & str ) const; public: /** Make a string from \a errno_r. */ static std::string strErrno( int errno_r ); /** Make a string from \a errno_r and \a msg_r. */ static std::string strErrno( int errno_r, std::string msg_r ); public: /** Drop a logline on throw, catch or rethrow. * Used by \ref ZYPP_THROW macros. */ static void log( const Exception & excpt_r, const CodeLocation & where_r, const char *const prefix_r ); /** \overrload for not-Exception types thrown via ZYPP_THROW */ static void log( const char * typename_r, const CodeLocation & where_r, const char *const prefix_r ); private: mutable CodeLocation _where; std::string _msg; History _history; /** Return message string. */ const char * what() const throw() override { return _msg.c_str(); } /** Called by std::ostream & operator\<\<. * Prints \ref CodeLocation and the error message provided by * \ref dumpOn. */ std::ostream & dumpError( std::ostream & str ) const; }; /////////////////////////////////////////////////////////////////// /** \relates Exception Stream output */ std::ostream & operator<<( std::ostream & str, const Exception & obj ) ZYPP_API; /////////////////////////////////////////////////////////////////// namespace exception_detail { /** SFINAE: Hide template signature unless \a TExcpt is derived from \ref Exception. */ template using EnableIfIsException = std::enable_if_t< std::is_base_of_v, int>; /** SFINAE: Hide template signature if \a TExcpt is derived from \ref Exception. */ template using EnableIfNotException = std::enable_if_t< !std::is_base_of_v, int>; /** Helper for \ref ZYPP_THROW( Exception ). */ template = 0> void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn)); template> void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) { excpt_r.relocate( where_r ); Exception::log( excpt_r, where_r, "THROW: " ); throw( excpt_r ); } /** Helper for \ref ZYPP_THROW( not Exception ). */ template = 0> void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn)); template> void do_ZYPP_THROW( const TExcpt & excpt_r, const CodeLocation & where_r ) { Exception::log( typeid(excpt_r).name(), where_r, "THROW: " ); throw( excpt_r ); } /** Helper for \ref ZYPP_THROW( Exception ). */ template = 0> void do_ZYPP_CAUGHT( const TExcpt & excpt_r, const CodeLocation & where_r ) { Exception::log( excpt_r, where_r, "CAUGHT: " ); } /** Helper for \ref ZYPP_THROW( not Exception ). */ template = 0> void do_ZYPP_CAUGHT( const TExcpt & excpt_r, const CodeLocation & where_r ) { Exception::log( typeid(excpt_r).name(), where_r, "CAUGHT: " ); } /** Helper for \ref ZYPP_THROW( Exception ). */ template = 0> void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn)); template> void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) { Exception::log( excpt_r, where_r, "RETHROW: " ); excpt_r.relocate( where_r ); throw; } /** Helper for \ref ZYPP_THROW( not Exception ). */ template = 0> void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) __attribute__((noreturn)); template> void do_ZYPP_RETHROW( const TExcpt & excpt_r, const CodeLocation & where_r ) { Exception::log( excpt_r, where_r, "RETHROW: " ); throw; } void do_ZYPP_RETHROW( const std::exception_ptr & excpt_r, const CodeLocation & where_r ); /** Helper for \ref ZYPP_EXCPT_PTR( Exception ). */ template std::exception_ptr do_ZYPP_EXCPT_PTR( TExcpt && excpt_r, const CodeLocation & where_r ) { if constexpr( std::is_base_of_v> ) { excpt_r.relocate( where_r ); Exception::log( excpt_r, where_r, "THROW (EXCPTR): " ); } else { Exception::log( typeid(excpt_r).name(), where_r, "THROW (EXCPTR): " ); } return std::make_exception_ptr>( std::forward(excpt_r) ); } /** Helper for \ref ZYPP_FWD_CURRENT_EXCPT(). */ std::exception_ptr do_ZYPP_FWD_EXCPT_PTR( const std::exception_ptr & excpt_r, const CodeLocation & where_r ); } // namespace exception_detail /////////////////////////////////////////////////////////////////// /** \defgroup ZYPP_THROW ZYPP_THROW macros * Macros for throwing Exception. * \see \ref zypp::Exception for an example. */ //@{ /** Drops a logline and throws the Exception. */ #define ZYPP_THROW(EXCPT)\ ::zypp::exception_detail::do_ZYPP_THROW( EXCPT, ZYPP_EX_CODELOCATION ) /** Drops a logline and returns Exception as a std::exception_ptr. */ #define ZYPP_EXCPT_PTR(EXCPT)\ ::zypp::exception_detail::do_ZYPP_EXCPT_PTR( EXCPT, ZYPP_EX_CODELOCATION ) /** Drops a logline and returns the given Exception as a std::exception_ptr. */ #define ZYPP_FWD_EXCPT(EXCPT)\ ::zypp::exception_detail::do_ZYPP_FWD_EXCPT_PTR( EXCPT, ZYPP_EX_CODELOCATION ) /** Drops a logline and returns the current Exception as a std::exception_ptr. */ #define ZYPP_FWD_CURRENT_EXCPT()\ ::zypp::exception_detail::do_ZYPP_FWD_EXCPT_PTR( std::current_exception(), ZYPP_EX_CODELOCATION ) /** Drops a logline telling the Exception was caught (in order to handle it). */ #define ZYPP_CAUGHT(EXCPT)\ ::zypp::exception_detail::do_ZYPP_CAUGHT( EXCPT, ZYPP_EX_CODELOCATION ) /** Drops a logline and rethrows, updating the CodeLocation. */ #define ZYPP_RETHROW(EXCPT)\ ::zypp::exception_detail::do_ZYPP_RETHROW( EXCPT, ZYPP_EX_CODELOCATION ) /** Throw Exception built from a message string. */ #define ZYPP_THROW_MSG(EXCPTTYPE, MSG)\ ZYPP_THROW( EXCPTTYPE( MSG ) ) /** Throw Exception built from errno. */ #define ZYPP_THROW_ERRNO(EXCPTTYPE)\ ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(errno) ) ) /** Throw Exception built from errno provided as argument. */ #define ZYPP_THROW_ERRNO1(EXCPTTYPE, ERRNO)\ ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(ERRNO) ) ) /** Throw Exception built from errno and a message string. */ #define ZYPP_THROW_ERRNO_MSG(EXCPTTYPE, MSG)\ ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(errno,MSG) ) ) /** Throw Exception built from errno provided as argument and a message string */ #define ZYPP_THROW_ERRNO_MSG1(EXCPTTYPE, ERRNO,MSG)\ ZYPP_THROW( EXCPTTYPE( ::zypp::Exception::strErrno(ERRNO,MSG) ) ) //@} ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_EXCEPTION_H libzypp-17.36.5/zypp-core/base/ExternalDataSource.cc000066400000000000000000000071311476576476200223260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/ExternalDataSource.cc */ #define _GNU_SOURCE 1 // for ::getline #include #include #include #include #include #include #include #include #include #include #include #include #include using std::endl; namespace zypp { namespace externalprogram { ExternalDataSource::ExternalDataSource( FILE *ifile, FILE *ofile ) : inputfile( ifile ), outputfile( ofile ), linebuffer( 0 ), linebuffer_size( 0 ) { } ExternalDataSource::~ExternalDataSource() { if (linebuffer) free( linebuffer ); close (); } bool ExternalDataSource::send( const char *buffer, size_t length ) { if ( outputfile ) { bool success = fwrite( buffer, length, 1, outputfile ) != 0; fflush( outputfile ); return success; } else return false; } bool ExternalDataSource::send( std::string s ) { DBG << "send (" << s << ")"; return send( s.data(), s.length() ); } std::string ExternalDataSource::receiveUpto( char c ) { if ( inputfile && !feof( inputfile ) ) { std::ostringstream datas; while ( true ) { int readc = fgetc( inputfile ); if ( readc == EOF ) break; datas << (char)readc; if ( (char)readc == c ) break; } return datas.str(); } return std::string(); } std::string ExternalDataSource::receiveUpto( char c, io::timeout_type timeout ) { const auto &received = io::receiveUpto( inputFile(), c, timeout ); if ( received.first == io::Timeout ) ZYPP_THROW( io::TimeoutException() ); return received.second; } size_t ExternalDataSource::receive( char *buffer, size_t length ) { if ( inputfile ) return fread( buffer, 1, length, inputfile ); else return 0; } void ExternalDataSource::setBlocking( bool mode ) { io::setFILEBlocking( inputfile, mode ); } std::string ExternalDataSource::receiveLine() { if ( inputfile ) { ssize_t nread = zyppng::eintrSafeCallEx( getline, [&](){clearerr ( inputfile );}, &linebuffer, &linebuffer_size, inputfile ); if ( nread == -1 ) return ""; else return std::string( linebuffer, nread ); } else return ""; } std::string ExternalDataSource::receiveLine( io::timeout_type timeout ) { return receiveUpto( '\n', timeout ); } int ExternalDataSource::close() { if ( inputfile && inputfile != outputfile ) fclose( inputfile ); if ( outputfile ) fclose( outputfile ); inputfile = 0; outputfile = 0; return 0; } } // namespace externalprogram } // namespace zypp libzypp-17.36.5/zypp-core/base/ExternalDataSource.h000066400000000000000000000074221476576476200221730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/ExternalDataSource.h */ #ifndef ZYPP_EXTERNALDATASOURCE_H #define ZYPP_EXTERNALDATASOURCE_H #include #include #include #include namespace zypp { namespace externalprogram { /** * @short Bidirectional stream to external data */ class ZYPP_API ExternalDataSource { protected: FILE *inputfile; FILE *outputfile; private: char *linebuffer; size_t linebuffer_size; public: /** * Create a new instance. * @param inputfile The stream for reading * @param outputfile The stream for writing * Either can be NULL if no reading/writing is allowed. */ ExternalDataSource( FILE *inputfile = 0, FILE *outputfile = 0 ); /** * Implicitly close the connection. */ virtual ~ExternalDataSource (); /** * Send some data to the output stream. * @param buffer The data to send * @param length The size of it */ bool send( const char *buffer, size_t length ); /** * Send some data down the stream. * @param string The data to send */ bool send( std::string s ); /** * Read some data from the input stream. * @param buffer Where to put the data * @param length How much to read at most * Returns the amount actually received */ size_t receive( char *buffer, size_t length ); /** * Read one line from the input stream. * Returns the line read, including the terminator. */ std::string receiveLine(); /** * Read one line from the input stream. * Returns the line read, including the terminator. * \note The delimiter is not removed from the string. * \note The \a timeout value is to be specified in milliseconds. * \throws io::TimeoutException if the timeout is reached */ std::string receiveLine( io::timeout_type timeout ); /** * Read characters into a string until delimiter \a c or EOF is * read. * \note The delimiter is not removed from the string. */ std::string receiveUpto( char c ); /** * Read characters into a string until delimiter \a c or EOF is * read or the \a timeout is reached. * \note The delimiter is not removed from the string. * \note The \a timeout value is to be specified in milliseconds. * \throws io::TimeoutException if the timeout is reached */ std::string receiveUpto( char c, io::timeout_type timeout ); /** * Set the blocking mode of the input stream. * @param mode True if the reader should be blocked waiting for input. * This is the initial default. */ void setBlocking( bool mode ); /** * Close the input and output streams. */ virtual int close(); /** * Return the input stream. */ FILE *inputFile() const { return inputfile; } /** * Return the output stream. */ FILE *outputFile() const { return outputfile; } }; } // namespace externalprogram } // namespace zypp #endif // ZYPP_EXTERNALDATASOURCE_H libzypp-17.36.5/zypp-core/base/FileStreamBuf000066400000000000000000000000331476576476200206670ustar00rootroot00000000000000#include "filestreambuf.h" libzypp-17.36.5/zypp-core/base/Flags.h000066400000000000000000000204341476576476200174700ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Flags.h * */ #ifndef ZYPP_BASE_FLAGS_H #define ZYPP_BASE_FLAGS_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Flags // /** A type-safe way of storing OR-combinations of enum values (like QTs QFlags). * \see QFlags Class Reference * \code * class RpmDb * { * public: * enum DbStateInfoBits { * DbSI_NO_INIT = 0x0000, * DbSI_HAVE_V4 = 0x0001, * DbSI_MADE_V4 = 0x0002, * DbSI_MODIFIED_V4 = 0x0004, * DbSI_HAVE_V3 = 0x0008, * DbSI_HAVE_V3TOV4 = 0x0010, * DbSI_MADE_V3TOV4 = 0x0020 * }; * * ZYPP_DECLARE_FLAGS(DbStateInfo,DbStateInfoBits); * }; * ZYPP_DECLARE_OPERATORS_FOR_FLAGS(RpmDb::DbStateInfo); * * ... * enum Other { OTHERVAL = 13 }; * { * XRpmDb::DbStateInfo s; * s = XRpmDb::DbSI_MODIFIED_V4|XRpmDb::DbSI_HAVE_V4; * // s |= OTHERVAL; // As desired: it does not compile * } * \endcode */ template class Flags { public: using Enum = TEnum; ///< The underlying enum type using Integral = std::underlying_type_t; ///< The underlying integral type public: constexpr Flags() : _val( 0 ) {} constexpr Flags( Enum flag_r ) : _val( integral(flag_r) ) {} constexpr explicit Flags( Integral flag_r ) : _val( flag_r ) {} constexpr static Flags none() { return Flags( Integral(0) ); } constexpr static Flags all() { return Flags( ~Integral(0) ); } constexpr bool isNone() const { return _val == Integral(0); } constexpr bool isAll() const { return _val == ~Integral(0); } Flags & operator&=( Flags rhs ) { _val &= integral(rhs); return *this; } Flags & operator&=( Enum rhs ) { _val &= integral(rhs); return *this; } Flags & operator|=( Flags rhs ) { _val |= integral(rhs); return *this; } Flags & operator|=( Enum rhs ) { _val |= integral(rhs); return *this; } Flags & operator^=( Flags rhs ) { _val ^= integral(rhs); return *this; } Flags & operator^=( Enum rhs ) { _val ^= integral(rhs); return *this; } public: constexpr operator Integral() const { return _val; } constexpr Flags operator&( Flags rhs ) const { return Flags( _val & integral(rhs) ); } constexpr Flags operator&( Enum rhs ) const { return Flags( _val & integral(rhs) ); } constexpr Flags operator|( Flags rhs ) const { return Flags( _val | integral(rhs) ); } constexpr Flags operator|( Enum rhs ) const { return Flags( _val | integral(rhs) ); } constexpr Flags operator^( Flags rhs ) const { return Flags( _val ^ integral(rhs) ); } constexpr Flags operator^( Enum rhs ) const { return Flags( _val ^ integral(rhs) ); } constexpr Flags operator~() const { return Flags( ~_val ); } constexpr bool operator==( Enum rhs ) const { return( _val == integral(rhs) ); } constexpr bool operator!=( Enum rhs ) const { return( _val != integral(rhs) ); } public: Flags & setFlag( Flags flag_r, bool newval_r ) { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); } Flags & setFlag( Enum flag_r, bool newval_r ) { return( newval_r ? setFlag(flag_r) : unsetFlag(flag_r) ); } Flags & setFlag( Flags flag_r ) { _val |= integral(flag_r); return *this; } Flags & setFlag( Enum flag_r ) { _val |= integral(flag_r); return *this; } Flags & unsetFlag( Flags flag_r ) { _val &= ~integral(flag_r); return *this; } Flags & unsetFlag( Enum flag_r ) { _val &= ~integral(flag_r); return *this; } constexpr bool testFlag( Flags flag_r ) const { return testFlag( integral(flag_r) ); } constexpr bool testFlag( Enum flag_r ) const { return testFlag( integral(flag_r) ); } private: constexpr bool testFlag( Integral flag ) const { return flag ? ( _val & flag ) == flag : !_val; } constexpr static Integral integral( Flags obj ) { return obj._val; } constexpr static Integral integral( Enum obj ) { return static_cast(obj); } Integral _val; }; /////////////////////////////////////////////////////////////////// /** \relates Flags Stringify * Build a string of OR'ed names of each flag value set in \a flag_r. * Remaining bits in \a flag_r are added as hexstring. * \code * enum E { a=1, b=2, c=4 }; * ZYPP_DECLARE_FLAGS( E, MyFlags ); * * MyFlags f = a|b|c; * cout << f << " = " << stringify( f, { {a,"A"}, {b,"B"} } ) << endl; * // prints: 0x0007 = [A|B|0x4] * \endcode */ template std::string stringify( const Flags & flag_r, const std::initializer_list,std::string> > & flaglist_r = {}, std::string intro_r = "[", std::string sep_r = "|", const std::string &extro_r = "]" ) { std::string ret( std::move(intro_r) ); std::string sep; Flags mask; for ( const auto & pair : flaglist_r ) { if ( flag_r.testFlag( pair.first ) ) { mask |= pair.first; ret += sep; ret += pair.second; if ( sep.empty() && !sep_r.empty() ) { sep = std::move(sep_r); } } } mask = flag_r & ~mask; if ( mask ) { ret += sep; ret += str::hexstring( mask, 0 ); } ret += extro_r; return ret; } template inline std::ostream & operator<<( std::ostream & str, const Flags & obj ) { return str << str::hexstring(obj); } template inline std::ostream & operator<<( std::ostream & str, const typename Flags::Enum & obj ) { return str << Flags(obj); } /** \relates Flags */ #define ZYPP_DECLARE_FLAGS(Name,Enum) typedef zypp::base::Flags Name /** \relates Flags */ #define ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) \ inline constexpr bool operator==( Name::Enum lhs, Name rhs ) { return( rhs == lhs ); } \ inline constexpr bool operator!=(Name:: Enum lhs, Name rhs ) { return( rhs != lhs ); } \ inline constexpr Name operator&( Name::Enum lhs, Name::Enum rhs ) { return Name( lhs ) & rhs; } \ inline constexpr Name operator&( Name::Enum lhs, Name rhs ) { return rhs & lhs; } \ inline constexpr Name operator|( Name::Enum lhs, Name::Enum rhs ) { return Name( lhs ) | rhs; } \ inline constexpr Name operator|( Name::Enum lhs, Name rhs ) { return rhs | lhs; } \ inline constexpr Name operator^( Name::Enum lhs, Name::Enum rhs ) { return Name( lhs ) ^ rhs; } \ inline constexpr Name operator^( Name::Enum lhs, Name rhs ) { return rhs ^ lhs; } \ inline constexpr Name operator~( Name::Enum lhs ) { return ~Name( lhs ); } /** \relates Flags */ #define ZYPP_DECLARE_FLAGS_AND_OPERATORS(Name,Enum) \ ZYPP_DECLARE_FLAGS(Name,Enum); \ ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Name) ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_FLAGS_H libzypp-17.36.5/zypp-core/base/Function.h000066400000000000000000000042031476576476200202150ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Function.h * */ #ifndef ZYPP_BASE_FUNCTION_H #define ZYPP_BASE_FUNCTION_H #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /* http://www.boost.org/doc/html/function.html The Boost.Function library contains a family of class templates that are function object wrappers. The notion is similar to a generalized callback. It shares features with function pointers in that both define a call interface (e.g., a function taking two integer arguments and returning a floating-point value) through which some implementation can be called, and the implementation that is invoked may change throughout the course of the program. Generally, any place in which a function pointer would be used to defer a call or make a callback, Boost.Function can be used instead to allow the user greater flexibility in the implementation of the target. Targets can be any 'compatible' function object (or function pointer), meaning that the arguments to the interface designated by Boost.Function can be converted to the arguments of the target function object. */ using boost::function; using std::bind; using std::placeholders::_1; using std::placeholders::_2; using std::placeholders::_3; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_FUNCTION_H libzypp-17.36.5/zypp-core/base/Gettext.cc000066400000000000000000000042561476576476200202220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Gettext.cc * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif extern "C" { #include } #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace gettext { ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// // TEXTDOMAIN and LOCALEDIR must be provided via config.h // or at compile time using -D. ///////////////////////////////////////////////////////////////// inline void assertInit() { static bool initialized = false; if ( ! initialized ) { ::bindtextdomain( TEXTDOMAIN, LOCALEDIR ); ::bind_textdomain_codeset( TEXTDOMAIN, "UTF-8" ); initialized = true; } } const char * dgettext( const char * msgid ) { assertInit(); return ::dgettext( TEXTDOMAIN, msgid ); } const char * dngettext( const char * msgid1, const char * msgid2, unsigned long n ) { assertInit(); return ::dngettext( TEXTDOMAIN, msgid1, msgid2, n ); } ///////////////////////////////////////////////////////////////// } // namespace gettext /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/Gettext.h000066400000000000000000000042021476576476200200530ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Gettext.h * * Interface to gettext. * */ #ifndef ZYPP_BASE_GETTEXT_H #define ZYPP_BASE_GETTEXT_H #include #ifdef ZYPP_DLL //defined if zypp is compiled as DLL /** Just tag text for translation. */ #undef N_ #define N_(MSG) MSG /** Return translated text. */ #undef _ #define _(MSG) ::zypp::gettext::dgettext( MSG ) /** Return translated text (plural form). */ #undef PL_ #define PL_(MSG1,MSG2,N) ::zypp::gettext::dngettext( MSG1, MSG2, N ) #else #ifndef N_ #define N_(MSG) MSG #endif #ifndef _ #define _(MSG) ::gettext( MSG ) #endif #ifndef PL_ #define PL_(MSG1,MSG2,N) ::ngettext( MSG1, MSG2, N ) #endif #endif /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace gettext { ///////////////////////////////////////////////////////////////// /** Return translated text. */ const char * dgettext( const char * msgid ) ZYPP_API; /** Return translated text (plural form). */ const char * dngettext( const char * msgid1, const char * msgid2, unsigned long n ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace gettext /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_GETTEXT_H libzypp-17.36.5/zypp-core/base/GzStream000066400000000000000000000000261476576476200177350ustar00rootroot00000000000000#include "gzstream.h" libzypp-17.36.5/zypp-core/base/Hash.h000066400000000000000000000033641476576476200173220ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Hash.h * */ #ifndef ZYPP_BASE_HASH_H #define ZYPP_BASE_HASH_H #include #include #include /** Define hash function for id based classes. * Class has to provide a method \c id() retuning a unique number. * \code * // in global namespace define: * ZYPP_DEFINE_ID_HASHABLE( ::zypp::sat::Solvable ) * \endcode */ #define ZYPP_DEFINE_ID_HASHABLE(C) \ namespace std { \ template struct hash; \ template<> struct hash \ { \ size_t operator()( const C & __s ) const \ { return __s.id(); } \ }; \ } /////////////////////////////////////////////////////////////////// namespace std { /** clone function for RW_pointer */ template inline unordered_set * rwcowClone( const std::unordered_set * rhs ) { return new std::unordered_set( *rhs ); } /** clone function for RW_pointer */ template inline std::unordered_map * rwcowClone( const std::unordered_map * rhs ) { return new std::unordered_map( *rhs ); } } // namespace std /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_HASH_H libzypp-17.36.5/zypp-core/base/IOStream.cc000066400000000000000000000123431476576476200202550ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/IOStream.cc * */ #include #include #include //#include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace iostr { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : getline ** FUNCTION TYPE : std::string */ std::string getline( std::istream & str ) { static const unsigned tmpBuffLen = 1024; static char tmpBuff[tmpBuffLen]; std::string ret; do { str.clear(); str.getline( tmpBuff, tmpBuffLen ); // always writes '\0' terminated ret += tmpBuff; } while( str.rdstate() == std::ios::failbit ); return ret; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : EachLine // /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // METHOD NAME : EachLine::EachLine // METHOD TYPE : Ctor // EachLine::EachLine( std::istream & str_r, unsigned lineNo_r ) : _str( str_r ) , _lineStart( -1 ) , _lineNo( lineNo_r ) , _valid( true ) { next(); } /////////////////////////////////////////////////////////////////// // // METHOD NAME : EachLine::next // METHOD TYPE : bool // bool EachLine::next() { if ( ! _valid ) { return false; } if ( ! _str ) // usg: saw EOF in previous read { _line.clear(); return(_valid = false); } _lineStart = _str.tellg(); _line = iostr::getline( _str ); ++_lineNo; if ( _str.fail() || _str.bad() ) { _line.clear(); return(_valid = false); } return(_valid = true); } /////////////////////////////////////////////////////////////////// // forEachLine /////////////////////////////////////////////////////////////////// int forEachLine( std::istream & str_r, const function& consume_r ) { int lineno = 0; while ( str_r ) { std::string line( getline( str_r ) ); if ( ! (str_r.fail() || str_r.bad()) ) { // line contains valid data to be consumed. ++lineno; if ( consume_r && ! consume_r( lineno, line ) ) { lineno = -lineno; break; } } } return lineno; } // MPL checks to assert equal values for PF_?TRIM and str::?TRIM BOOST_MPL_ASSERT_RELATION( int(PF_LTRIM), ==, int(str::L_TRIM) ); BOOST_MPL_ASSERT_RELATION( int(PF_RTRIM), ==, int(str::R_TRIM) ); int simpleParseFile( std::istream & str_r, ParseFlags flags_r, function consume_r ) { return forEachLine( str_r, [&]( int num_r, std::string line_r )->bool { if ( ! consume_r ) return true; if ( flags_r ) { if ( flags_r & PF_TRIM ) line_r = str::trim( line_r, str::Trim( unsigned(flags_r & PF_TRIM) ) ); if ( flags_r & ~PF_TRIM ) { const char* firstNW = line_r.c_str(); while ( *firstNW == ' ' || *firstNW == '\t' ) ++firstNW; switch ( *firstNW ) { case '\0': if ( flags_r & PF_SKIP_EMPTY ) return true; break; case '#': if ( flags_r & PF_SKIP_SHARP_COMMENT ) return true; break; } } } return consume_r( num_r, line_r ); } ); } ///////////////////////////////////////////////////////////////// } // namespace iostr /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/IOStream.h000066400000000000000000000157071476576476200201260ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/IOStream.h * */ #ifndef ZYPP_BASE_IOSTREAM_H #define ZYPP_BASE_IOSTREAM_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /** Iostream related utilities. */ namespace iostr { ///////////////////////////////////////////////////////////////// /** Save and restore streams \c width, \c precision * and \c fmtflags. */ using IosFmtFlagsSaver = boost::io::ios_base_all_saver; /** Read one line from stream. * * Reads everything up to the next newline or EOF. newline * is read but not returned. * * \see \ref forEachLine */ std::string getline( std::istream & str ) ZYPP_API; /** Copy istream to ostream. * \return reference to the ostream. */ inline std::ostream & copy( std::istream & from_r, std::ostream & to_r ) { if ( from_r && to_r ) { char ch = 0; while ( from_r && from_r.get( ch ) ) to_r.put( ch ); } return to_r; } /** Copy istream to ostream, prefixing each line with \a indent_r (default "> " ). * \return reference to the ostream. */ inline std::ostream & copyIndent( std::istream & from_r, std::ostream & to_r, const std::string & indent_r = "> " ) { if ( from_r && to_r ) { char ch = 0; bool indent = true; while ( from_r && from_r.get( ch ) ) { if ( indent ) to_r << indent_r; indent = ( ch == '\n' ); to_r.put( ch ); } } return to_r; } /** Copy istream to ostream, prefixing each line with \a indent_r (default "> " ). * \return reference to the ostream. */ inline void tee( std::istream & from_r, std::ostream & to1_r, std::ostream & to2_r ) { if ( from_r && ( to1_r ||to2_r ) ) { char ch = 0; while ( from_r && from_r.get( ch ) ) { to1_r.put( ch ); to2_r.put( ch ); } } } /////////////////////////////////////////////////////////////////// // // CLASS NAME : EachLine // /** Simple lineparser: Traverse each line in a file. * * \code * std::ifstream infile( "somefile" ); * for( iostr::EachLine in( infile ); in; in.next() ) * { * DBG << *in << endl; * } * \endcode */ class ZYPP_API EachLine : private base::NonCopyable { public: /** Ctor taking a stream and reading the 1st line from it. */ EachLine( std::istream & str_r, unsigned lineNo_r = 0 ); /** Whether \c this contains a valid line to consume. */ bool valid() const { return _valid; } /** Evaluate class in a boolean context. */ explicit operator bool() const { return _valid; } /** Return the current line number. */ unsigned lineNo() const { return _lineNo; } std::streamoff lineStart() const { return _lineStart; }; /** Set current line number. */ void setLineNo( unsigned lineNo_r ) { _lineNo = lineNo_r; } /** Access the current line. */ const std::string & operator*() const { return _line; } /** \overload non const access */ std::string & operator*() { return _line; } /** Access the current line. */ const std::string * operator->() const { return &_line; } /** Advance to next line. */ bool next(); /** Advance \a num_r lines. */ bool next( unsigned num_r ) { while ( num_r-- && next() ) ; /* EMPTY */ return valid(); } private: std::istream & _str; std::string _line; std::streamoff _lineStart; unsigned _lineNo; bool _valid; }; /////////////////////////////////////////////////////////////////// /** Simple lineparser: Call functor \a consume_r for each line. * * \param str_r istream to read from. * \param consume_r callback function taking linenumber and content * * The loop is aborted if the callback returns \c false. * * \code * iostr::forEachLine( InputStream( "/my/file/to/read.txt" ), * []( int num_r, std::string line_r )->bool * { * MIL << " [" num_r << "]'" << line_r << "'" << endl; * return true; * } ); * \endcode * * \return Number if lines consumed (negative if aborted by callback). */ int forEachLine( std::istream & str_r, const function& consume_r ) ZYPP_API; /** \ref simpleParseFile modifications before consuming a line. */ enum ParseFlag { PF_LTRIM = 1 << 0, //< left trim whitespace PF_RTRIM = 1 << 1, //< right trim whitespace PF_TRIM = PF_LTRIM | PF_RTRIM, //< trim whitespace PF_SKIP_EMPTY = 1 << 2, //< skip lines containing whitespace only PF_SKIP_SHARP_COMMENT = 1 << 3 //< skip lines beginning with '#' }; ZYPP_DECLARE_FLAGS( ParseFlags, ParseFlag ); ZYPP_DECLARE_OPERATORS_FOR_FLAGS( ParseFlags ); /** Simple lineparser optionally trimming and skipping comments. */ int simpleParseFile( std::istream & str_r, ParseFlags flags_r, function consume_r ) ZYPP_API; /** \overload trimming lines, skipping '#'-comments and empty lines. */ inline int simpleParseFile( std::istream & str_r, function consume_r ) { return simpleParseFile( str_r, PF_TRIM | PF_SKIP_EMPTY | PF_SKIP_SHARP_COMMENT , std::move(consume_r) ); } ///////////////////////////////////////////////////////////////// } // namespace iostr /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_IOSTREAM_H libzypp-17.36.5/zypp-core/base/IOTools.cc000066400000000000000000000134021476576476200201170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/IOTools.cc * */ #include #include #include #include #include #include #include #include namespace zypp::io { BlockingMode setFILEBlocking (FILE * file, bool mode ) { if ( !file ) return BlockingMode::FailedToSetMode; return setFDBlocking( ::fileno( file ), mode ); } BlockingMode setFDBlocking(int fd, bool mode) { if ( fd == -1 ) { ERR << strerror( errno ) << std::endl; return BlockingMode::FailedToSetMode; } int flags = zyppng::eintrSafeCall( ::fcntl, fd, F_GETFL ); if ( flags == -1 ) { ERR << strerror( errno ) << std::endl; return BlockingMode::FailedToSetMode; } BlockingMode oldMode = ( flags & O_NONBLOCK ) == O_NONBLOCK ? BlockingMode::WasNonBlocking : BlockingMode::WasBlocking; if ( !mode ) flags = flags | O_NONBLOCK; else if ( flags & O_NONBLOCK ) flags = flags ^ O_NONBLOCK; flags = zyppng::eintrSafeCall( ::fcntl, fd,F_SETFL,flags ); if ( flags == -1 ) { ERR << strerror(errno) << std::endl; return BlockingMode::FailedToSetMode; } return oldMode; } bool writeAll(int fd, void *buf, size_t size) { char *tmpBuf = static_cast(buf); size_t written = 0; while ( written < size ) { const auto res = zyppng::eintrSafeCall( ::write, fd, tmpBuf+written, size-written ); if ( res < 0 ) // error return false; written += res; } return true; } ReadAllResult readAll (int fd, void *buf, size_t size ) { char *tmpBuf = static_cast(buf); size_t read = 0; while ( read != size ) { const auto r = zyppng::eintrSafeCall( ::read, fd, tmpBuf+read, size - read ); if ( r == 0 ) return ReadAllResult::Eof; if ( r < 0 ) return ReadAllResult::Error; read += r; } return ReadAllResult::Ok; } std::pair receiveUpto(FILE *file, char c, timeout_type timeout, bool failOnUnblockError ) { FILE * inputfile = file; if ( !file ) return std::make_pair( ReceiveUpToResult::Error, std::string() ); int inputfileFd = ::fileno( inputfile ); size_t linebuffer_size = 0; zypp::AutoFREE linebuf; const auto prevMode = setFILEBlocking( file, false ); if ( prevMode == BlockingMode::FailedToSetMode && failOnUnblockError ) return std::make_pair( ReceiveUpToResult::Error, std::string() ); // reset the blocking mode when we are done zypp::OnScopeExit resetMode([ prevMode, fd = file ]( ){ if ( prevMode == BlockingMode::WasBlocking ) setFILEBlocking( fd, true ); }); bool haveTimeout = (timeout != no_timeout); int remainingTimeout = static_cast( timeout ); zypp::AutoDispose timer( nullptr ); if ( haveTimeout ) timer = zypp::AutoDispose( g_timer_new(), &g_free ); std::string line; do { /* Watch inputFile to see when it has input. */ GPollFD fd; fd.fd = inputfileFd; fd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; fd.revents = 0; if ( timer ) g_timer_start( timer ); clearerr( inputfile ); int retval = zyppng::eintrSafeCall( g_poll, &fd, 1, remainingTimeout ); if ( retval == -1 ) { ERR << "select error: " << zyppng::strerr_cxx() << std::endl; return std::make_pair( ReceiveUpToResult::Error, std::string() ); } else if ( retval ) { // Data is available now. ssize_t nread = zyppng::eintrSafeCallEx( ::getdelim, [&](){ clearerr( inputfile ); }, &linebuf.value(), &linebuffer_size, c, inputfile ); if ( nread == -1 ) { if ( ::feof( inputfile ) ) { return std::make_pair( ReceiveUpToResult::EndOfFile, std::move(line) ); } if ( errno != EAGAIN && ( ::ferror( inputfile ) || errno != 0 ) ) { if ( errno ) ERR << "getdelim error: " << zyppng::strerr_cxx() << std::endl; else ERR << "Unknown getdelim error." << std::endl; return std::make_pair( ReceiveUpToResult::Error, std::string() ); } } else { if ( nread > 0 ) line += std::string( linebuf, nread ); if ( ! ::ferror( inputfile ) || ::feof( inputfile ) ) { return std::make_pair( ReceiveUpToResult::Success, std::move(line) ); // complete line } } } // we timed out, or were interrupted for some reason // check if we can wait more if ( timer ) { remainingTimeout -= g_timer_elapsed( timer, nullptr ) * 1000; if ( remainingTimeout <= 0 ) return std::make_pair( ReceiveUpToResult::Timeout, std::move(line) ); } } while ( true ); } TimeoutException::~TimeoutException() noexcept { } std::vector peek_data_fd( FILE *fd, off_t offset, size_t count ) { if ( !fd ) return {}; fflush( fd ); std::vector data( count + 1 , '\0' ); ssize_t l = zyppng::eintrSafeCall( pread, fileno( fd ), data.data(), count, offset ); if (l == -1) return {}; return data; } } libzypp-17.36.5/zypp-core/base/IOTools.h000066400000000000000000000056611476576476200177710ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/IOTools.h * */ #ifndef ZYPP_BASE_IOTOOLS_H #define ZYPP_BASE_IOTOOLS_H #include #include #include #include namespace zypp::io { enum class BlockingMode{ FailedToSetMode = -1, ///< Failed to block or unblock the fd WasBlocking, ///< FD was blocking before WasNonBlocking ///< FD was non blocking before }; /** * Enables or disabled non blocking mode on a file descriptor. * The return value is one of the \ref zypp::io::BlockingMode values */ BlockingMode setFILEBlocking ( FILE *file, bool mode = true ); BlockingMode setFDBlocking ( int fd, bool mode = true ); /*! Blocks until all data in buf was written to the fd or a error occured */ bool writeAll ( int fd, void *buf, size_t size ); /*! Blocks until the number of bytes passed via \a size was received */ enum class ReadAllResult { Error, Eof, Ok }; ReadAllResult readAll ( int fd, void *buf, size_t size ); class ZYPP_API TimeoutException : public Exception { public: /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ TimeoutException() : Exception( "Timeout Exception" ) {} /** Ctor taking message. * Use \ref ZYPP_THROW to throw exceptions. */ TimeoutException( const std::string & msg_r ) : Exception( msg_r ) {} /** Dtor. */ ~TimeoutException() noexcept override; }; enum ReceiveUpToResult { Success, Timeout, EndOfFile, Error, }; using timeout_type = size_t; static constexpr timeout_type no_timeout = static_cast(-1); /*! * Reads data from \a file until it finds a seperator \a c, hits the end of the file or times out. * The \a timeout value is specified in milliseconds, a timeout of -1 means no timeout. * If \a failOnUnblockError is set to false the function will not error out if unblocking * the file descriptor did not work. The default is to fail if it's not possible to unblock the file. */ std::pair receiveUpto( FILE * file, char c, timeout_type timeout, bool failOnUnblockError = true ); /*! * Fetches data from a FILE without changing the current file offset */ std::vector peek_data_fd ( FILE *fd, off_t offset, size_t count ); } #endif libzypp-17.36.5/zypp-core/base/InputStream000066400000000000000000000000311476576476200204500ustar00rootroot00000000000000#include "inputstream.h" libzypp-17.36.5/zypp-core/base/Iterable.h000066400000000000000000000065641476576476200201730ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Iterable.h */ #ifndef ZYPP_BASE_ITERABLE_H #define ZYPP_BASE_ITERABLE_H #include /////////////////////////////////////////////////////////////////// namespace zypp { /////////////////////////////////////////////////////////////////// /// \class Iterable /// \brief /// \code /// struct Foo /// { /// class Iterator; /// typedef Iterable IterableType; /// /// Iterator myBegin(); /// Iterator myEnd(); /// /// IterableType iterate() { return makeIterable( myBegin(), myEnd() ); } /// }; /// \endcode /////////////////////////////////////////////////////////////////// template class Iterable { public: using size_type = size_t; using iterator_type = TIterator; using value_type = typename std::iterator_traits::value_type; using difference_type = typename std::iterator_traits::difference_type; using pointer = typename std::iterator_traits::pointer; using reference = typename std::iterator_traits::reference; using iterator_category = typename std::iterator_traits::iterator_category; /** Ctor taking the iterator pair */ Iterable() {} /** Ctor taking the iterator pair */ Iterable( iterator_type begin_r, iterator_type end_r ) : _begin( std::move(begin_r) ) , _end( std::move(end_r) ) {} /** Ctor taking the iterator pair */ Iterable( std::pair range_r ) : _begin( std::move(range_r.first) ) , _end( std::move(range_r.second) ) {} iterator_type begin() const { return _begin; } iterator_type end() const { return _end; } bool empty() const { return( _begin == _end ); } size_type size() const { size_type ret = 0; for ( iterator_type i = _begin; i != _end; ++i ) ++ret; return ret; } bool contains( const value_type & val_r ) const { return( find( val_r ) != _end ); } iterator_type find( const value_type & val_r ) const { iterator_type ret = _begin; for ( ; ret != _end; ++ret ) if ( *ret == val_r ) break; return ret; } private: iterator_type _begin; iterator_type _end; }; /** \relates Iterable convenient construction. */ template Iterable makeIterable( TIterator && begin_r, TIterator && end_r ) { return Iterable( std::forward(begin_r), std::forward(end_r) ); } /** \relates Iterable convenient construction. */ template Iterable makeIterable( std::pair &&range_r ) { return Iterable( std::move(range_r) ); } } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_ITERABLE_H libzypp-17.36.5/zypp-core/base/Iterator.h000066400000000000000000000314761476576476200202350ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Iterator.h * */ #ifndef ZYPP_BASE_ITERATOR_H #define ZYPP_BASE_ITERATOR_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** \defgroup ITERATOR Boost.Iterator Library * * \see http://www.boost.org/libs/iterator/doc/index.html * * \li \b counting_iterator: an iterator over a sequence of * consecutive values. Implements a "lazy sequence" * \li \b filter_iterator: an iterator over the subset of elements * of some sequence which satisfy a given predicate * \li \b function_output_iterator: an output iterator wrapping a * unary function object; each time an element is written into * the dereferenced iterator, it is passed as a parameter to * the function object. * \li \b indirect_iterator: an iterator over the objects pointed-to * by the elements of some sequence. * \li \b permutation_iterator: an iterator over the elements of * some random-access sequence, rearranged according to some * sequence of integer indices. * \li \b reverse_iterator: an iterator which traverses the elements * of some bidirectional sequence in reverse. Corrects many of the shortcomings of C++98's std::reverse_iterator. * \li \b shared_container_iterator: an iterator over elements of * a container whose lifetime is maintained by a shared_ptr * stored in the iterator. * \li \b transform_iterator: an iterator over elements which are * the result of applying some functional transformation to * the elements of an underlying sequence. This component * also replaces the old projection_iterator_adaptor. * \li \b zip_iterator: an iterator over tuples of the elements * at corresponding positions of heterogeneous underlying * iterators. * * There are in fact more interesting iterator concepts * available than the ones listed above. Have a look at them. * * Some of the iterator types are already dragged into namespace * zypp. Feel free to add what's missing. * * \todo Separate them into individual zypp header files. */ //@{ /** \class filter_iterator * An iterator over the subset of elements of some sequence * which satisfy a given predicate. * * Provides boost::filter_iterator and boost::make_filter_iterator * convenience function. * \see http://www.boost.org/libs/iterator/doc/filter_iterator.html * \code * template * filter_iterator * make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); * * template * filter_iterator * make_filter_iterator(Iterator x, Iterator end = Iterator()); * \endcode * Remember the deduction rules for template arguments. * \code * struct MyDefaultConstructibleFilter; * make_filter_iterator( c.begin(), c.end() ); * make_filter_iterator( MyDefaultConstructibleFilter(), c.begin(), c.end() ); * ... * make_filter_iterator( resfilter::ByName("foo"), c.begin(), c.end() ); * * \endcode */ using boost::filter_iterator; using boost::make_filter_iterator; /** Convenience to create filter_iterator from container::begin(). */ template filter_iterator make_filter_begin( TFilter f, const TContainer & c ) { return make_filter_iterator( f, c.begin(), c.end() ); } /** Convenience to create filter_iterator from container::begin(). */ template filter_iterator make_filter_begin( const TContainer & c ) { return make_filter_iterator( TFilter(), c.begin(), c.end() ); } /** Convenience to create filter_iterator from container::end(). */ template filter_iterator make_filter_end( TFilter f, const TContainer & c ) { return make_filter_iterator( f, c.end(), c.end() ); } /** Convenience to create filter_iterator from container::end(). */ template filter_iterator make_filter_end( const TContainer & c ) { return make_filter_iterator( TFilter(), c.end(), c.end() ); } /** \class transform_iterator * An iterator over elements which are the result of applying * some functional transformation to the elements of an underlying * sequence. * * Provides boost::transform_iterator and boost::make_transform_iterator * convenience function. * \see http://www.boost.org/libs/iterator/doc/transform_iterator.html * \code * template * transform_iterator * make_transform_iterator(Iterator it, UnaryFunction fun); * * template * transform_iterator * make_transform_iterator(Iterator it); * \endcode */ using boost::transform_iterator; using boost::make_transform_iterator; /** Functor taking a \c std::pair returning \c std::pair.first. * \see MapKVIteratorTraits */ template struct GetPairFirst { const typename TPair::first_type & operator()( const TPair & pair_r ) const { return pair_r.first; } }; /** Functor taking a \c std::pair returning \c std::pair.second . * \see MapKVIteratorTraits */ template struct GetPairSecond { const typename TPair::second_type & operator()( const TPair & pair_r ) const { return pair_r.second; } }; /** Traits for std::map key and value iterators. * * \ref GetPairFirst and \ref GetPairSecond help building a transform_iterator * that iterates over keys or values of a std::map. Class MapKVIteratorTraits * provides some typedefs, you usg. do not want to write explicitly. * * \code * // typedefs * typedef std::map MapType; * * // transform_iterator, MapType::const_iterator> * typedef MapKVIteratorTraits::Key_const_iterator MapTypeKey_iterator; * // transform_iterator, MapType::const_iterator> * typedef MapKVIteratorTraits::Value_const_iterator MapTypeValue_iterator; * * // usage * MapType mymap; * * MapTypeKey_const_iterator keyBegin( make_map_key_begin( mymap ) ); * MapTypeKey_const_iterator keyEnd ( make_map_key_end( mymap ) ); * * MapTypeValue_const_iterator valBegin( make_map_value_begin( mymap ) ); * MapTypeValue_const_iterator valEnd ( make_map_value_end( mymap ) ); * * std::for_each( keyBegin, keyEnd, DoSomething() ); * std::for_each( valBegin, valEnd, DoSomething() ); * \endcode * * Or short: * * \code * typedef std::map MapType; * MapType mymap; * * std::for_each( make_map_key_begin( mymap ), make_map_key_end( mymap ), DoSomething() ); * std::for_each( make_map_value_begin( mymap ), make_map_value_end( mymap ), DoSomething() ); * \endcode */ template struct MapKVIteratorTraits { /** The map type */ using MapType = TMap; /** The maps key type */ using KeyType = typename TMap::key_type; /** The key iterator type */ using Key_const_iterator = transform_iterator, typename MapType::const_iterator>; /** The maps value (mapped) type */ using ValueType = typename TMap::mapped_type; /** The value iterator type */ using Value_const_iterator = transform_iterator, typename MapType::const_iterator>; }; /** Convenience to create the key iterator from container::begin() */ template inline typename MapKVIteratorTraits::Key_const_iterator make_map_key_begin( const TMap & map_r ) { return make_transform_iterator( map_r.begin(), GetPairFirst() ); } /** Convenience to create the key iterator from container::end() */ template inline typename MapKVIteratorTraits::Key_const_iterator make_map_key_end( const TMap & map_r ) { return make_transform_iterator( map_r.end(), GetPairFirst() ); } /** Convenience to create the value iterator from container::begin() */ template inline typename MapKVIteratorTraits::Value_const_iterator make_map_value_begin( const TMap & map_r ) { return make_transform_iterator( map_r.begin(), GetPairSecond() ); } /** Convenience to create the value iterator from container::end() */ template inline typename MapKVIteratorTraits::Value_const_iterator make_map_value_end( const TMap & map_r ) { return make_transform_iterator( map_r.end(), GetPairSecond() ); } /** Convenience to create the key iterator from container::lower_bound() */ template inline typename MapKVIteratorTraits::Key_const_iterator make_map_key_lower_bound( const TMap & map_r, const typename TMap::key_type & key_r ) { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairFirst() ); } /** Convenience to create the key iterator from container::upper_bound() */ template inline typename MapKVIteratorTraits::Key_const_iterator make_map_key_upper_bound( const TMap & map_r, const typename TMap::key_type & key_r ) { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairFirst() ); } /** Convenience to create the value iterator from container::lower_bound() */ template inline typename MapKVIteratorTraits::Value_const_iterator make_map_value_lower_bound( const TMap & map_r, const typename TMap::key_type & key_r ) { return make_transform_iterator( map_r.lower_bound( key_r ), GetPairSecond() ); } /** Convenience to create the value iterator from container::upper_bound() */ template inline typename MapKVIteratorTraits::Value_const_iterator make_map_value_upper_bound( const TMap & map_r, const typename TMap::key_type & key_r ) { return make_transform_iterator( map_r.upper_bound( key_r ), GetPairSecond() ); } /** Convenience to create an \ref Iterable over the container keys */ template inline Iterable::Key_const_iterator> make_map_key_Iterable( const TMap & map_r ) { return makeIterable( make_map_key_begin( map_r ), make_map_key_end( map_r ) ); } /** Convenience to create an \ref Iterable over the container values */ template inline Iterable::Value_const_iterator> make_map_value_Iterable( const TMap & map_r ) { return makeIterable( make_map_value_begin( map_r ), make_map_value_end( map_r ) ); } /** \class function_output_iterator * An output iterator wrapping a unary function object; each time an * element is written into the dereferenced iterator, it is passed as * a parameter to the function object. * * Provides boost::function_output_iterator and boost::make_function_output_iterator * convenience function. * \see http://www.boost.org/libs/iterator/doc/function_output_iterator.html * \code * template * function_output_iterator * make_function_output_iterator(const UnaryFunction& f = UnaryFunction()); * \endcode */ using boost::function_output_iterator; using boost::make_function_output_iterator; //@} ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_ITERATOR_H libzypp-17.36.5/zypp-core/base/LogControl.cc000066400000000000000000000756241476576476200206670ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/LogControl.cc * */ #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 extern "C" { #include #include #include #include #include } using std::endl; std::once_flag flagReadEnvAutomatically; namespace zypp { constexpr std::string_view ZYPP_MAIN_THREAD_NAME( "Zypp-main" ); template inline constexpr bool always_false_v = false; /*! * \internal Provides a very simply lock that is using atomics so it can be * safely used in signal handlers */ class SpinLock { public: void lock () { // acquire lock while ( _atomicLock.test_and_set()) // Reschedule the current thread while we wait. Maybe, when it is our next turn, the lock is free again. std::this_thread::yield(); } void unlock() { _atomicLock.clear(); } private: // we use a lock-free atomic flag here, so this lock can be safely obtained in a signal handler as well std::atomic_flag _atomicLock = ATOMIC_FLAG_INIT; }; class LogThread { public: LogThread(const LogThread &) = delete; LogThread(LogThread &&) = delete; LogThread &operator=(const LogThread &) = delete; LogThread &operator=(LogThread &&) = delete; ~LogThread() { stop(); } static LogThread &instance () { static LogThread t; return t; } void setLineWriter ( zypp::shared_ptr writer ) { std::lock_guard lk( _lineWriterLock ); _lineWriter = std::move(writer); } zypp::shared_ptr getLineWriter () { std::lock_guard lk( _lineWriterLock ); auto lw = _lineWriter; return lw; } void stop () { _stopSignal.notify(); if ( _thread.get_id() != std::this_thread::get_id() ) _thread.join(); } std::thread::id threadId () { return _thread.get_id(); } static std::string sockPath () { static std::string path = zypp::str::Format("zypp-logsocket-%1%") % getpid(); return path; } private: LogThread () { // Name the thread that started the logger, assuming it's the main thread. zyppng::ThreadData::current().setName(ZYPP_MAIN_THREAD_NAME); _thread = std::thread( [this] () { workerMain(); }); } void workerMain () { // force the kernel to pick another thread to handle signals zyppng::blockAllSignalsForCurrentThread(); zyppng::ThreadData::current().setName("Zypp-Log"); auto ev = zyppng::EventLoop::create(); auto server = zyppng::Socket::create( AF_UNIX, SOCK_STREAM, 0 ); auto stopNotifyWatch = _stopSignal.makeNotifier( ); std::vector clients; // bind to a abstract unix domain socket address, which means we do not need to care about cleaning it up server->bind( std::make_shared( sockPath(), true ) ); server->listen(); // wait for incoming connections from other threads server->connectFunc( &zyppng::Socket::sigIncomingConnection, [&](){ auto cl = server->accept(); if ( !cl ) return; clients.push_back( cl ); // wait until data is available, we operate line by line so we only // log a string once we encounter \n cl->connectFunc( &zyppng::Socket::sigReadyRead, [ this, sock = cl.get() ](){ auto writer = getLineWriter(); if ( !writer ) return; while ( sock->canReadLine() ) { auto br = sock->readLine(); writer->writeOut( std::string( br.data(), br.size() - 1 ) ); } }, *cl); // once a client disconnects we remove it from the std::vector so that the socket is not leaked cl->connectFunc( &zyppng::Socket::sigDisconnected, [&clients, sock = std::weak_ptr(cl)](){ auto lock = sock.lock(); if ( !lock ) return; auto idx = std::find_if( clients.begin(), clients.end(), [lock]( const auto &s ){ return lock.get() == s.get(); } ); clients.erase( idx ); }); }); stopNotifyWatch->connectFunc( &zyppng::SocketNotifier::sigActivated, [&ev]( const auto &, auto ) { ev->quit(); }); ev->run(); // make sure we have written everything auto writer = getLineWriter(); if ( writer ) { for ( auto &sock : clients ){ auto br = sock->readLine(); while ( !br.empty() ) { if ( br.back () == '\n' ) writer->writeOut( std::string( br.data(), br.size() - 1 ) ); else writer->writeOut( std::string( br.data(), br.size() ) ); br = sock->readLine(); } } } } private: std::thread _thread; zyppng::Wakeup _stopSignal; // since the public API uses boost::shared_ptr (via the alias zypp::shared_ptr) we can not use the atomic // functionalities provided in std. // this lock type can be used safely in signals SpinLock _lineWriterLock; // boost shared_ptr has a lock free implementation of reference counting so it can be used from signal handlers as well shared_ptr _lineWriter{ nullptr }; }; class LogClient { public: LogClient(){ // make sure the thread is running LogThread::instance(); } LogClient(const LogClient &) = delete; LogClient(LogClient &&) = delete; LogClient &operator=(const LogClient &) = delete; LogClient &operator=(LogClient &&) = delete; ~LogClient() { if (_sockFD >= 0) ::close(_sockFD); } /*! * Tries to connect to the log threads socket, returns true on success or * if the socket is already connected */ bool ensureConnection () { if ( _sockFD >= 0 ) return true; _sockFD = ::socket( AF_UNIX, SOCK_STREAM, 0 ); if ( _sockFD == -1 ) return false; zyppng::UnixSockAddr addr( LogThread::sockPath(), true ); return zyppng::trySocketConnection( _sockFD, addr, 100 ); } /*! * Sends a message to the log thread. */ void pushMessage ( std::string msg ) { if ( inPushMessage ) { return; } // make sure we do not end up in a busy loop zypp::AutoDispose res( &inPushMessage, [](auto val){ *val = false; }); inPushMessage = true; // if we are in the same thread as the Log worker we can directly push our messages out, no need to use the socket if ( std::this_thread::get_id() == LogThread::instance().threadId() ) { auto writer = LogThread::instance().getLineWriter(); if ( writer ) writer->writeOut( msg ); return; } if(!ensureConnection()) return; if ( msg.back() != '\n' ) msg.push_back('\n'); size_t written = 0; while ( written < msg.size() ) { const auto res = zyppng::eintrSafeCall( ::send, _sockFD, msg.data() + written, msg.size() - written, MSG_NOSIGNAL ); if ( res == -1 ) { //assume broken socket ::close( _sockFD ); _sockFD = -1; return; } written += res; } } private: int _sockFD = -1; bool inPushMessage = false; }; #ifndef ZYPP_NDEBUG namespace debug { // Fg::Black: 30 Bg: 40 Attr::Normal: 22;27 // Fg::Red: 31 ... Attr::Bright: 1 // Fg::Green: 32 Attr::Reverse: 7 // Fg::Yellow: 33 // Fg::Blue: 34 // Fg::Magenta: 35 // Fg::Cyan: 36 // Fg::White: 37 // Fg::Default: 39 static constexpr std::string_view OO { "\033[0m" }; static constexpr std::string_view WH { "\033[37;40m" }; static constexpr std::string_view CY { "\033[36;40m" }; static constexpr std::string_view YE { "\033[33;1;40m" }; static constexpr std::string_view GR { "\033[32;40m" }; static constexpr std::string_view RE { "\033[31;1;40m" }; static constexpr std::string_view MA { "\033[35;40m" }; unsigned TraceLeave::_depth = 0; std::string tracestr( char tag_r, unsigned depth_r, const std::string & msg_r, const char * file_r, const char * fnc_r, int line_r ) { static str::Format fmt { "***%2d %s%c %s(%s):%d %s" }; fmt % depth_r %std::string(depth_r,'.') % tag_r % Pathname::basename(file_r) % fnc_r % line_r % msg_r; return fmt; } TraceLeave::TraceLeave( const char * file_r, const char * fnc_r, int line_r, std::string msg_r ) : _file( file_r ) , _fnc( fnc_r ) , _line( line_r ) , _msg( std::move(msg_r) ) { unsigned depth = _depth++; const std::string & m { tracestr( '>',depth, _msg, _file,_fnc,_line ) }; Osd(L_USR("TRACE"),depth) << m << endl; } TraceLeave::~TraceLeave() { unsigned depth = --_depth; const std::string & m { tracestr( '<',depth, _msg, _file,_fnc,_line ) }; Osd(L_USR("TRACE"),depth) << m << endl; } Osd::Osd( std::ostream & str, int i ) : _strout { std::cerr } , _strlog { str } { _strout << (i?WH:YE); } Osd::~Osd() { _strout << OO; } Osd & Osd::operator<<( std::ostream& (*iomanip)( std::ostream& ) ) { _strout << iomanip; _strlog << iomanip; return *this; } } #endif // ZYPP_NDEBUG /////////////////////////////////////////////////////////////////// namespace log { ///////////////////////////////////////////////////////////////// StdoutLineWriter::StdoutLineWriter() : StreamLineWriter( std::cout ) {} StderrLineWriter::StderrLineWriter() : StreamLineWriter( std::cerr ) {} FileLineWriter::FileLineWriter( const Pathname & file_r, mode_t mode_r ) { if ( file_r == Pathname("-") ) { _str = &std::cerr; } else { if ( mode_r ) { // not filesystem::assert_file as filesystem:: functions log, // and this FileWriter is not yet in place. int fd = ::open( file_r.c_str(), O_CREAT|O_EXCL, mode_r ); if ( fd != -1 ) ::close( fd ); } // set unbuffered write std::ofstream * fstr = 0; _outs.reset( (fstr = new std::ofstream( file_r.asString().c_str(), std::ios_base::app )) ); fstr->rdbuf()->pubsetbuf(0,0); _str = &(*fstr); } } ///////////////////////////////////////////////////////////////// } // namespace log /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace logger { ///////////////////////////////////////////////////////////////// inline void putStream( const std::string & group_r, LogLevel level_r, const char * file_r, const char * func_r, int line_r, const std::string & buffer_r ); /////////////////////////////////////////////////////////////////// // // CLASS NAME : Loglinebuf // class Loglinebuf : public std::streambuf { public: /** */ Loglinebuf( std::string group_r, LogLevel level_r ) : _group(std::move( group_r )) , _level( level_r ) , _file( "" ) , _func( "" ) , _line( -1 ) {} Loglinebuf(const Loglinebuf &) = default; Loglinebuf(Loglinebuf &&) = default; Loglinebuf &operator=(const Loglinebuf &) = default; Loglinebuf &operator=(Loglinebuf &&) = default; /** */ ~Loglinebuf() override { if ( !_buffer.empty() ) writeout( "\n", 1 ); } /** */ void tagSet( const char * fil_r, const char * fnc_r, int lne_r ) { _file = fil_r; _func = fnc_r; _line = lne_r; } private: /** */ std::streamsize xsputn( const char * s, std::streamsize n ) override { return writeout( s, n ); } /** */ int overflow( int ch = EOF ) override { if ( ch != EOF ) { char tmp = ch; writeout( &tmp, 1 ); } return 0; } /** */ virtual int writeout( const char* s, std::streamsize n ) { //logger::putStream( _group, _level, _file, _func, _line, _buffer ); //return n; if ( s && n ) { const char * c = s; for ( int i = 0; i < n; ++i, ++c ) { if ( *c == '\n' ) { _buffer += std::string( s, c-s ); logger::putStream( _group, _level, _file, _func, _line, _buffer ); _buffer = std::string(); s = c+1; } } if ( s < c ) { _buffer += std::string( s, c-s ); } } return n; } private: std::string _group; LogLevel _level; const char * _file; const char * _func; int _line; std::string _buffer; }; /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : Loglinestream // class Loglinestream { public: /** */ Loglinestream( const std::string & group_r, LogLevel level_r ) : _mybuf( group_r, level_r ) , _mystream( &_mybuf ) {} Loglinestream(const Loglinestream &) = delete; Loglinestream(Loglinestream &&) = delete; Loglinestream &operator=(const Loglinestream &) = delete; Loglinestream &operator=(Loglinestream &&) = delete; /** */ ~Loglinestream() { _mystream.flush(); } public: /** */ std::ostream & getStream( const char * fil_r, const char * fnc_r, int lne_r ) { _mybuf.tagSet( fil_r, fnc_r, lne_r ); return _mystream; } private: Loglinebuf _mybuf; std::ostream _mystream; }; /////////////////////////////////////////////////////////////////// struct LogControlImpl; /* * Ugly hack to prevent the use of LogControlImpl when libzypp is shutting down. * Due to the C++ standard, thread_local static instances are cleaned up before the first global static * destructor is called. So all classes that use logging after that point in time would crash the * application because it is accessing a variable that has already been destroyed. */ int &logControlValidFlag() { // We are using a POD flag that does not have a destructor, // to flag if the thread_local destructors were already executed. // Since TLS data is stored in a segment that is available until the thread ceases to exist it should still be readable // after thread_local c++ destructors were already executed. Or so I hope. static thread_local int logControlValid = 0; return logControlValid; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : LogControlImpl // /** LogControl implementation (thread_local Singleton). * * \note There is a slight difference in using the _lineFormater and _lineWriter! * \li \c _lineFormater must not be NULL (create default LogControl::LineFormater) * \li \c _lineWriter is NULL if no logging is performed, this way we can pass * _no_stream as logstream to the application, and avoid unnecessary formating * of logliles, which would then be discarded when passed to some dummy * LineWriter. */ struct LogControlImpl { public: bool isExcessive() const { return _excessive; } void excessive( bool onOff_r ) { _excessive = onOff_r; } /** Hint for Formater whether to hide the thread name. */ bool hideThreadName() const { if ( indeterminate(_hideThreadName) ) _hideThreadName = ( zyppng::ThreadData::current().name() == ZYPP_MAIN_THREAD_NAME ); return bool(_hideThreadName); } /** \overload Setter */ void hideThreadName( bool onOff_r ) { _hideThreadName = onOff_r; } /** \overload Static getter */ static bool instanceHideThreadName() { auto impl = LogControlImpl::instance(); return impl ? impl->hideThreadName() : false; } /** \overload Static setter */ static void instanceHideThreadName( bool onOff_r ) { auto impl = LogControlImpl::instance(); if ( impl ) impl->hideThreadName( onOff_r ); } /** Hint for formatter wether we forward all logs to a parents log */ static bool instanceLogToPPID( ) { auto impl = LogControlImpl::instance(); return impl ? impl->_logToPPIDMode : false; } /** \overload Static setter */ static void instanceSetLogToPPID( bool onOff_r ) { auto impl = LogControlImpl::instance(); if ( impl ) impl->_logToPPIDMode = onOff_r; } /** NULL _lineWriter indicates no loggin. */ void setLineWriter( const shared_ptr & writer_r ) { LogThread::instance().setLineWriter( writer_r ); } shared_ptr getLineWriter() const { return LogThread::instance().getLineWriter(); } /** Assert \a _lineFormater is not NULL. */ void setLineFormater( const shared_ptr & format_r ) { if ( format_r ) _lineFormater = format_r; else _lineFormater.reset( new LogControl::LineFormater ); } void logfile( const Pathname & logfile_r, mode_t mode_r = 0640 ) { if ( logfile_r.empty() ) setLineWriter( shared_ptr() ); else if ( logfile_r == Pathname( "-" ) ) setLineWriter( shared_ptr(new log::StderrLineWriter) ); else setLineWriter( shared_ptr(new log::FileLineWriter(logfile_r, mode_r)) ); } private: LogClient _logClient; std::ostream _no_stream; bool _excessive; bool _logToPPIDMode = false; ///< Hint for formatter to use the PPID and always show the thread name mutable TriBool _hideThreadName = indeterminate; ///< Hint for Formater whether to hide the thread name. shared_ptr _lineFormater; public: /** Provide the log stream to write (logger interface) */ std::ostream & getStream( const std::string & group_r, LogLevel level_r, const char * file_r, const char * func_r, const int line_r ) { if ( ! getLineWriter() ) return _no_stream; if ( level_r == E_XXX && !_excessive ) return _no_stream; if ( !_streamtable[group_r][level_r] ) { _streamtable[group_r][level_r].reset( new Loglinestream( group_r, level_r ) ); } std::ostream & ret( _streamtable[group_r][level_r]->getStream( file_r, func_r, line_r ) ); if ( !ret ) { ret.clear(); ret << "---format( group_r, level_r, file_r, func_r, line_r, message_r ) ); } private: using StreamPtr = shared_ptr; using StreamSet = std::map; using StreamTable = std::map; /** one streambuffer per group and level */ StreamTable _streamtable; zyppng::Socket::Ptr _sock; private: void readEnvVars () { if ( getenv("ZYPP_LOGFILE") ) logfile( getenv("ZYPP_LOGFILE") ); if ( getenv("ZYPP_PROFILING") ) { shared_ptr formater(new ProfilingFormater); setLineFormater(formater); } } /** Singleton ctor. * No logging per default, unless enabled via $ZYPP_LOGFILE. */ LogControlImpl() : _no_stream( NULL ) , _excessive( getenv("ZYPP_FULLLOG") ) , _lineFormater( new LogControl::LineFormater ) { logControlValidFlag() = 1; std::call_once( flagReadEnvAutomatically, &LogControlImpl::readEnvVars, this); // make sure the LogControl is invalidated when we fork pthread_atfork( nullptr, nullptr, &LogControl::notifyFork ); } public: LogControlImpl(const LogControlImpl &) = delete; LogControlImpl(LogControlImpl &&) = delete; LogControlImpl &operator=(const LogControlImpl &) = delete; LogControlImpl &operator=(LogControlImpl &&) = delete; ~LogControlImpl() { logControlValidFlag() = 0; } /** The LogControlImpl singleton * \note As most dtors log, it is inportant that the * LogControlImpl instance is the last static variable * destructed. At least destucted after all statics * which log from their dtor. */ static LogControlImpl *instance(); }; /////////////////////////////////////////////////////////////////// // 'THE' LogControlImpl singleton inline LogControlImpl *LogControlImpl::instance() { thread_local static LogControlImpl _instance; if ( logControlValidFlag() > 0 ) return &_instance; return nullptr; } /////////////////////////////////////////////////////////////////// /** \relates LogControlImpl Stream output */ inline std::ostream & operator<<( std::ostream & str, const LogControlImpl & ) { return str << "LogControlImpl"; } /////////////////////////////////////////////////////////////////// // // Access from logger:: // /////////////////////////////////////////////////////////////////// std::ostream & getStream( const char * group_r, LogLevel level_r, const char * file_r, const char * func_r, const int line_r ) { static std::ostream nstream(NULL); auto control = LogControlImpl::instance(); if ( !control || !group_r || strlen(group_r ) == 0 ) { return nstream; } return control->getStream( group_r, level_r, file_r, func_r, line_r ); } /** That's what Loglinebuf calls. */ inline void putStream( const std::string & group_r, LogLevel level_r, const char * file_r, const char * func_r, int line_r, const std::string & buffer_r ) { auto control = LogControlImpl::instance(); if ( !control ) return; control->putStream( group_r, level_r, file_r, func_r, line_r, buffer_r ); } bool isExcessive() { auto impl = LogControlImpl::instance(); if ( !impl ) return false; return impl->isExcessive(); } ///////////////////////////////////////////////////////////////// } // namespace logger /////////////////////////////////////////////////////////////////// using logger::LogControlImpl; /////////////////////////////////////////////////////////////////// // LineFormater /////////////////////////////////////////////////////////////////// std::string LogControl::LineFormater::format( const std::string & group_r, logger::LogLevel level_r, const char * file_r, const char * func_r, int line_r, const std::string & message_r ) { static char hostname[1024]; static char nohostname[] = "unknown"; std::string now( Date::now().form( "%Y-%m-%d %H:%M:%S" ) ); std::string ret; const bool logToPPID = LogControlImpl::instanceLogToPPID(); if ( !logToPPID && LogControlImpl::instanceHideThreadName() ) ret = str::form( "%s <%d> %s(%d) [%s] %s(%s):%d %s", now.c_str(), level_r, ( gethostname( hostname, 1024 ) ? nohostname : hostname ), getpid(), group_r.c_str(), file_r, func_r, line_r, message_r.c_str() ); else ret = str::form( "%s <%d> %s(%d) [%s] %s(%s):%d {T:%s} %s", now.c_str(), level_r, ( gethostname( hostname, 1024 ) ? nohostname : hostname ), logToPPID ? getppid() : getpid(), group_r.c_str(), file_r, func_r, line_r, zyppng::ThreadData::current().name().c_str(), message_r.c_str() ); return ret; } /////////////////////////////////////////////////////////////////// // // CLASS NAME : LogControl // Forward to LogControlImpl singleton. // /////////////////////////////////////////////////////////////////// void LogControl::logfile( const Pathname & logfile_r ) { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->logfile( logfile_r ); } void LogControl::logfile( const Pathname & logfile_r, mode_t mode_r ) { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->logfile( logfile_r, mode_r ); } shared_ptr LogControl::getLineWriter() const { auto impl = LogControlImpl::instance(); if ( !impl ) return nullptr; return impl->getLineWriter(); } void LogControl::setLineWriter( const shared_ptr & writer_r ) { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->setLineWriter( writer_r ); } void LogControl::setLineFormater( const shared_ptr & formater_r ) { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->setLineFormater( formater_r ); } void LogControl::enableLogForwardingMode(bool enable) { LogControlImpl::instanceSetLogToPPID ( enable ); } void LogControl::logNothing() { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->setLineWriter( shared_ptr() ); } void LogControl::logToStdErr() { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->setLineWriter( shared_ptr( new log::StderrLineWriter ) ); } void base::LogControl::emergencyShutdown() { LogThread::instance().stop(); } void LogControl::notifyFork() { logger::logControlValidFlag () = 0; } void LogControl::logRawLine ( std::string &&line ) { LogControlImpl::instance ()->putRawLine ( std::move(line) ); } /////////////////////////////////////////////////////////////////// // // LogControl::TmpExcessive // /////////////////////////////////////////////////////////////////// LogControl::TmpExcessive::TmpExcessive() { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->excessive( true ); } LogControl::TmpExcessive::~TmpExcessive() { auto impl = LogControlImpl::instance(); if ( !impl ) return; impl->excessive( false ); } /****************************************************************** ** ** FUNCTION NAME : operator<< ** FUNCTION TYPE : std::ostream & */ std::ostream & operator<<( std::ostream & str, const LogControl & ) { auto impl = LogControlImpl::instance(); if ( !impl ) return str; return str << *impl; } ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/LogControl.h000066400000000000000000000172401476576476200205170ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/LogControl.h * */ #ifndef ZYPP_BASE_LOGCONTROL_H #define ZYPP_BASE_LOGCONTROL_H #include #include //for std::endl #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace log { ///////////////////////////////////////////////////////////////// /** If you want to log the (formated) loglines by yourself, * derive from this, and overload \c writeOut. * Expect \a formated_r to be a formated log line without trailing \c NL. * Ready to be written to the log. */ struct ZYPP_API LineWriter { virtual void writeOut( const std::string & /*formated_r*/ ) {} virtual ~LineWriter() {} }; /** Base class for ostream based \ref LineWriter */ struct StreamLineWriter : public LineWriter { StreamLineWriter( std::ostream & str_r ) : _str( &str_r ) {} void writeOut( const std::string & formated_r ) override { (*_str) << formated_r << std::endl; } protected: StreamLineWriter() : _str( 0 ) {} std::ostream *_str; }; /** \ref LineWriter to stdout. */ struct StdoutLineWriter : public StreamLineWriter { StdoutLineWriter(); }; /** \ref LineWriter to stderr. */ struct StderrLineWriter : public StreamLineWriter { StderrLineWriter(); }; /** \ref LineWriter to file. * If \c mode_r is not \c 0, \c file_r persissions are changed * accordingly. \c "-" logs to \c cerr. */ struct ZYPP_API FileLineWriter : public StreamLineWriter { FileLineWriter( const Pathname & file_r, mode_t mode_r = 0 ); protected: shared_ptr _outs; }; ///////////////////////////////////////////////////////////////// } // namespace log /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : LogControl // /** Maintain logfile related options. * \note A Singleton using a Singleton implementation class, * that's why there is no _pimpl like in other classes. */ class ZYPP_API LogControl { friend std::ostream & operator<<( std::ostream & str, const LogControl & obj ); public: /** Singleton access. */ static LogControl instance() { return LogControl(); } /** \see \ref log::LineWriter */ using LineWriter = log::LineWriter; /** If you want to format loglines by yourself, * derive from this, and overload \c format. * Return a formated logline without trailing \c NL. * Ready to be written to the log. */ struct ZYPP_API LineFormater { virtual std::string format( const std::string & /*group_r*/, logger::LogLevel /*level_r*/, const char * /*file_r*/, const char * /*func_r*/, int /*line_r*/, const std::string & /*message_r*/ ); virtual ~LineFormater() {} }; public: /** Assign a LineFormater. * If you want to format loglines by yourself. NULL installs the * default formater. */ void setLineFormater( const shared_ptr & formater_r ); /*! * Sets a special log mode that uses the ppid in the log output and always shows the * thread name (if the default formatter is used). This is only used by internal zypp tools that directly want to log into the * parents logfile. */ void enableLogForwardingMode ( bool enable = true ); public: /** Set path for the logfile. * Permission for logfiles is set to 0640 unless an explicit mode_t * value is given. An empty pathname turns off logging. "-" * logs to std::err. * \throw if \a logfile_r is not usable. */ void logfile( const Pathname & logfile_r ); void logfile( const Pathname & logfile_r, mode_t mode_r ); /** Turn off logging. */ void logNothing(); /** Log to std::err. */ void logToStdErr(); /** will cause the log thread to exit and flush all sockets */ void emergencyShutdown(); /** * This will completely disable logging. * It is supposed to be called in the child process after fork() * was called to shut down all logging completely. */ static void notifyFork(); /** will push a line to the logthread without formatting it */ void logRawLine ( std::string &&line ); public: /** Get the current LineWriter */ shared_ptr getLineWriter() const; /** Assign a LineWriter. * If you want to log the (formated) loglines by yourself. * NULL turns off logging (same as logNothing) * \see \ref log::LineWriter */ void setLineWriter( const shared_ptr & writer_r ); public: /** Turn on excessive logging for the lifetime of this object.*/ struct TmpExcessive { TmpExcessive(); ~TmpExcessive(); }; /** Exchange LineWriter for the lifetime of this object. * \see \ref log::LineWriter */ struct ZYPP_API TmpLineWriter { TmpLineWriter( const shared_ptr & writer_r = shared_ptr() ) : _writer( LogControl::instance().getLineWriter() ) { LogControl::instance().setLineWriter( writer_r ); } /** Convenience ctor taking over ownership of an allocated LineWriter. *\code * TmpLineWriter mylw( new log::StderrLineWriter ); * \endcode */ template TmpLineWriter( TLineWriter * _allocated_r ) : _writer( LogControl::instance().getLineWriter() ) { LogControl::instance().setLineWriter( shared_ptr( _allocated_r ) ); } ~TmpLineWriter() { LogControl::instance().setLineWriter( _writer ); } private: shared_ptr _writer; }; private: /** Default ctor: Singleton */ LogControl() {} }; /////////////////////////////////////////////////////////////////// /** \relates LogControl Stream output */ std::ostream & operator<<( std::ostream & str, const LogControl & obj ) ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_LOGCONTROL_H libzypp-17.36.5/zypp-core/base/LogTools.h000066400000000000000000000413411476576476200201760ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/LogTools.h * */ #ifndef ZYPP_BASE_LOGTOOLS_H #define ZYPP_BASE_LOGTOOLS_H #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __GNUG__ #include #include #include #endif /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// using std::endl; /// \brief Helper to produce not-NL-terminated multi line output. /// Used as leading separator it prints a separating NL by omitting /// output upon it's first invocation. /// A custom separator char can be passed to the ctor. /// \code /// Container foo { 1,2,3 }; /// MLSep sep; /// for ( auto && el : foo ) /// cout << sep << el; /// # "1\n2\n3" /// \endcode struct MLSep { MLSep() {} MLSep( char sep_r ) : _sep { sep_r } {} bool _first = true; char _sep = '\n'; }; inline std::ostream & operator<<( std::ostream & str, MLSep & obj ) { if ( obj._first ) obj._first = false; else str << obj._sep; return str; } /** Print range defined by iterators (multiline style). * \code * intro [ pfx ITEM [ { sep ITEM }+ ] sfx ] extro * \endcode * * The defaults print the range enclosed in \c {}, one item per * line indented by 2 spaces. * \code * { * item1 * item2 * } * {} // on empty range * \endcode * * A comma separated list enclosed in \c () would be: * \code * dumpRange( stream, begin, end, "(", "", ", ", "", ")" ); * // or shorter: * dumpRangeLine( stream, begin, end ); * \endcode * * \note Some special handling is required for printing std::maps. * Therefore iomaipulators \ref dumpMap, \ref dumpKeys and \ref dumpValues * are provided. * \code * std::map m; * m["a"]=1; * m["b"]=2; * m["c"]=3; * * dumpRange( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl; * // { * // [a] = 1 * // [b] = 2 * // [c] = 3 * // } * dumpRange( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl; * // { * // a * // b * // c * // } * dumpRange( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl; * // { * // 1 * // 2 * // 3 * // } * dumpRangeLine( DBG, dumpMap(m).begin(), dumpMap(m).end() ) << endl; * // ([a] = 1, [b] = 2, [c] = 3) * dumpRangeLine( DBG, dumpKeys(m).begin(), dumpKeys(m).end() ) << endl; * // (a, b, c) * dumpRangeLine( DBG, dumpValues(m).begin(), dumpValues(m).end() ) << endl; * // (1, 2, 3) * \endcode */ template std::ostream & dumpRange( std::ostream & str, TIterator begin, TIterator end, const std::string & intro = "{", const std::string & pfx = "\n ", const std::string & sep = "\n ", const std::string & sfx = "\n", const std::string & extro = "}" ) { str << intro; if ( begin != end ) { str << pfx << *begin; for ( ++begin; begin != end; ++begin ) str << sep << *begin; str << sfx; } return str << extro; } /** Print range defined by iterators (single line style). * \see dumpRange */ template std::ostream & dumpRangeLine( std::ostream & str, TIterator begin, TIterator end ) { return dumpRange( str, begin, end, "(", "", ", ", "", ")" ); } /** \overload for container */ template std::ostream & dumpRangeLine( std::ostream & str, const TContainer & cont ) { return dumpRangeLine( str, cont.begin(), cont.end() ); } /////////////////////////////////////////////////////////////////// namespace iomanip { /////////////////////////////////////////////////////////////////// /// \class RangeLine /// \brief Iomanip helper printing dumpRangeLine style /////////////////////////////////////////////////////////////////// template struct RangeLine { RangeLine( TIterator begin, TIterator end ) : _begin( begin ) , _end( end ) {} TIterator _begin; TIterator _end; }; /** \relates RangeLine */ template std::ostream & operator<<( std::ostream & str, const RangeLine & obj ) { return dumpRangeLine( str, obj._begin, obj._end ); } } // namespce iomanip /////////////////////////////////////////////////////////////////// /** Iomanip printing dumpRangeLine style * \code * std::vector c( { 1, 1, 2, 3, 5, 8 } ); * std::cout << rangeLine(c) << std::endl; * -> (1, 1, 2, 3, 5, 8) * \endcode */ template iomanip::RangeLine rangeLine( TIterator begin, TIterator end ) { return iomanip::RangeLine( begin, end ); } /** \overload for container */ template auto rangeLine( const TContainer & cont ) -> decltype( rangeLine( cont.begin(), cont.end() ) ) { return rangeLine( cont.begin(), cont.end() ); } template std::ostream & operator<<( std::ostream & str, const std::vector & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } template std::ostream & operator<<( std::ostream & str, const std::set & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } template std::ostream & operator<<( std::ostream & str, const std::unordered_set & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } template std::ostream & operator<<( std::ostream & str, const std::multiset & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } template std::ostream & operator<<( std::ostream & str, const std::list & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } template std::ostream & operator<<( std::ostream & str, const Iterable & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } /////////////////////////////////////////////////////////////////// namespace _logtoolsdetail { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // mapEntry /////////////////////////////////////////////////////////////////// /** std::pair wrapper for std::map output. * Just because we want a special output format for std::pair * used in a std::map. The mapped std::pair is printed as * [key] = value. */ template class MapEntry { public: MapEntry( const TPair & pair_r ) : _pair( &pair_r ) {} const TPair & pair() const { return *_pair; } private: const TPair *const _pair; }; /** \relates MapEntry Stream output. */ template std::ostream & operator<<( std::ostream & str, const MapEntry & obj ) { return str << '[' << obj.pair().first << "] = " << obj.pair().second; } /** \relates MapEntry Convenience function to create MapEntry from std::pair. */ template MapEntry mapEntry( const TPair & pair_r ) { return MapEntry( pair_r ); } /////////////////////////////////////////////////////////////////// // dumpMap /////////////////////////////////////////////////////////////////// /** std::map wrapper for stream output. * Uses a transform_iterator to wrap the std::pair into MapEntry. * */ template class DumpMap { public: using MapType = TMap; using PairType = typename TMap::value_type; using MapEntryType = MapEntry; struct Transformer { MapEntryType operator()( const PairType & pair_r ) const { return mapEntry( pair_r ); } }; using MapEntry_const_iterator = transform_iterator; public: DumpMap( const TMap & map_r ) : _map( &map_r ) {} const TMap & map() const { return *_map; } MapEntry_const_iterator begin() const { return make_transform_iterator( map().begin(), Transformer() ); } MapEntry_const_iterator end() const { return make_transform_iterator( map().end(), Transformer() );} private: const TMap *const _map; }; /** \relates DumpMap Stream output. */ template std::ostream & operator<<( std::ostream & str, const DumpMap & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } /** \relates DumpMap Convenience function to create DumpMap from std::map. */ template DumpMap dumpMap( const TMap & map_r ) { return DumpMap( map_r ); } /////////////////////////////////////////////////////////////////// // dumpKeys /////////////////////////////////////////////////////////////////// /** std::map wrapper for stream output of keys. * Uses MapKVIterator iterate and write the key values. * \code * std::map<...> mymap; * std::cout << dumpKeys(mymap) << std::endl; * \endcode */ template class DumpKeys { public: using MapKey_const_iterator = typename MapKVIteratorTraits::Key_const_iterator; public: DumpKeys( const TMap & map_r ) : _map( &map_r ) {} const TMap & map() const { return *_map; } MapKey_const_iterator begin() const { return make_map_key_begin( map() ); } MapKey_const_iterator end() const { return make_map_key_end( map() ); } private: const TMap *const _map; }; /** \relates DumpKeys Stream output. */ template std::ostream & operator<<( std::ostream & str, const DumpKeys & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } /** \relates DumpKeys Convenience function to create DumpKeys from std::map. */ template DumpKeys dumpKeys( const TMap & map_r ) { return DumpKeys( map_r ); } /////////////////////////////////////////////////////////////////// // dumpValues /////////////////////////////////////////////////////////////////// /** std::map wrapper for stream output of values. * Uses MapKVIterator iterate and write the values. * \code * std::map<...> mymap; * std::cout << dumpValues(mymap) << std::endl; * \endcode */ template class DumpValues { public: using MapValue_const_iterator = typename MapKVIteratorTraits::Value_const_iterator; public: DumpValues( const TMap & map_r ) : _map( &map_r ) {} const TMap & map() const { return *_map; } MapValue_const_iterator begin() const { return make_map_value_begin( map() ); } MapValue_const_iterator end() const { return make_map_value_end( map() ); } private: const TMap *const _map; }; /** \relates DumpValues Stream output. */ template std::ostream & operator<<( std::ostream & str, const DumpValues & obj ) { return dumpRange( str, obj.begin(), obj.end() ); } /** \relates DumpValues Convenience function to create DumpValues from std::map. */ template DumpValues dumpValues( const TMap & map_r ) { return DumpValues( map_r ); } ///////////////////////////////////////////////////////////////// } // namespace _logtoolsdetail /////////////////////////////////////////////////////////////////// // iomanipulator using _logtoolsdetail::mapEntry; // std::pair as '[key] = value' using _logtoolsdetail::dumpMap; // dumpRange '[key] = value' using _logtoolsdetail::dumpKeys; // dumpRange keys using _logtoolsdetail::dumpValues; // dumpRange values template std::ostream & operator<<( std::ostream & str, const std::map & obj ) { return str << dumpMap( obj ); } template std::ostream & operator<<( std::ostream & str, const std::unordered_map & obj ) { return str << dumpMap( obj ); } template std::ostream & operator<<( std::ostream & str, const std::multimap & obj ) { return str << dumpMap( obj ); } /** Print stream status bits. * Prints the values of a streams \c good, \c eof, \c failed and \c bad bit. * * \code * [g___] - good * [_eF_] - eof and fail bit set * [__FB] - fail and bad bit set * \endcode */ inline std::ostream & operator<<( std::ostream & str, const std::basic_ios & obj ) { std::string ret( "[" ); ret += ( obj.good() ? 'g' : '_' ); ret += ( obj.eof() ? 'e' : '_' ); ret += ( obj.fail() ? 'F' : '_' ); ret += ( obj.bad() ? 'B' : '_' ); ret += "]"; return str << ret; } /////////////////////////////////////////////////////////////////// // iomanipulator: str << dump(val) << ... // calls: std::ostream & dumpOn( std::ostream & str, const Type & obj ) /////////////////////////////////////////////////////////////////// namespace detail { template struct Dump { Dump( const Tp & obj_r ) : _obj( obj_r ) {} const Tp & _obj; }; template std::ostream & operator<<( std::ostream & str, const Dump & obj ) { return dumpOn( str, obj._obj ); } } template detail::Dump dump( const Tp & obj_r ) { return detail::Dump(obj_r); } /** hexdump data on stream * \code * hexdump 0000000333 bytes (0x0000014d): * 0000: 0c 00 01 49 03 00 17 41 04 af 7c 75 5e 4c 2d f7 ...I...A..|u^L-. * 0010: c9 c9 75 bf a8 41 37 2a d0 03 2c ff 96 d2 43 89 ..u..A7*..,...C. * 0020: ... * \endcode */ inline std::ostream & hexdumpOn( std::ostream & outs, const unsigned char *ptr, size_t size ) { size_t i = 0,c = 0; unsigned width = 0x10; outs << str::form( "hexdump %10.10ld bytes (0x%8.8lx):\n", (long)size, (long)size ); for ( i = 0; i < size; i += width ) { outs << str::form( "%4.4lx: ", (long)i ); /* show hex to the left */ for ( c = 0; c < width; ++c ) { if ( i+c < size ) outs << str::form( "%02x ", ptr[i+c] ); else outs << (" "); } /* show data on the right */ for ( c = 0; (c < width) && (i+c < size); ++c ) { char x = (ptr[i+c] >= 0x20 && ptr[i+c] < 0x7f) ? ptr[i+c] : '.'; outs << x; } outs << std::endl; } return outs; } /** \overload */ inline std::ostream & hexdumpOn( std::ostream & outs, const char *ptr, size_t size ) { return hexdumpOn( outs, reinterpret_cast(ptr), size ); } /*! * Write type info to stream * @TODO de-inline me */ inline std::ostream & operator<<( std::ostream & str, const std::type_info &info ) { #ifdef __GNUG__ int status = -4; // some arbitrary value to eliminate the compiler warning // enable c++11 by passing the flag -std=c++11 to g++ std::unique_ptr res { abi::__cxa_demangle(info.name(), NULL, NULL, &status), std::free }; return str << std::string((status==0) ? res.get() : info.name()); #else return str << info.name(); #endif } #ifdef __cpp_lib_optional // YAST/PK explicitly use c++11 until 15-SP3 template inline std::ostream & operator<<( std::ostream & str, const std::optional & obj ) { if ( obj ) str << "opt(" << *obj << ")"; else str << "nullopt"; return str; } #endif ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_LOGTOOLS_H libzypp-17.36.5/zypp-core/base/Logger.h000066400000000000000000000155031476576476200176540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Logger.h * */ #ifndef ZYPP_BASE_LOGGER_H #define ZYPP_BASE_LOGGER_H #include #include #include #include /////////////////////////////////////////////////////////////////// #ifndef ZYPP_NDEBUG namespace zypp { namespace debug { // impl in LogControl.cc // Log code loacaton and block leave // Indent if nested struct ZYPP_API TraceLeave { TraceLeave( const TraceLeave & ) =delete; TraceLeave & operator=( const TraceLeave & ) =delete; TraceLeave( const char * file_r, const char * fnc_r, int line_r, std::string msg_r=std::string() ); ~TraceLeave(); private: static unsigned _depth; const char * _file; const char * _fnc; int _line; std::string _msg; }; #define TRACE(M) ::zypp::debug::TraceLeave _TraceLeave( __FILE__, __FUNCTION__, __LINE__, M ); #define XTRACE ::zypp::debug::TraceLeave _TraceLeave( __FILE__, __FUNCTION__, __LINE__ ); // OnScreenDebug messages colored to stderr struct ZYPP_API Osd { Osd( std::ostream &, int = 0 ); ~Osd(); template Osd & operator<<( Tp && val ) { _strout << std::forward(val); _strlog << std::forward(val); return *this; } Osd & operator<<( std::ostream& (*iomanip)( std::ostream& ) ); private: std::ostream & _strout; std::ostream & _strlog; }; #define OSD ::zypp::debug::Osd(L_USR("OSD")) } } #endif // ZYPP_NDEBUG /////////////////////////////////////////////////////////////////// /** \defgroup ZYPP_BASE_LOGGER_MACROS ZYPP_BASE_LOGGER_MACROS * Convenience macros for logging. * * The macros finally call @ref getStream, providing appropriate arguments, * to return the log stream. * * @code * L_DBG("foo") << .... * @endcode * Logs a debug message for group @a "foo". * * @code * #undef ZYPP_BASE_LOGGER_LOGGROUP * #define ZYPP_BASE_LOGGER_LOGGROUP "foo" * * DBG << .... * @endcode * Defines group @a "foo" as default for log messages and logs a * debug message. */ /*@{*/ #ifndef ZYPP_BASE_LOGGER_LOGGROUP /** Default log group if undefined. */ #define ZYPP_BASE_LOGGER_LOGGROUP "DEFINE_LOGGROUP" #endif #define XXX L_XXX( ZYPP_BASE_LOGGER_LOGGROUP ) #define DBG L_DBG( ZYPP_BASE_LOGGER_LOGGROUP ) #define MIL L_MIL( ZYPP_BASE_LOGGER_LOGGROUP ) #define WAR L_WAR( ZYPP_BASE_LOGGER_LOGGROUP ) #define ERR L_ERR( ZYPP_BASE_LOGGER_LOGGROUP ) #define SEC L_SEC( ZYPP_BASE_LOGGER_LOGGROUP ) #define INT L_INT( ZYPP_BASE_LOGGER_LOGGROUP ) #define USR L_USR( ZYPP_BASE_LOGGER_LOGGROUP ) #define L_XXX(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_XXX ) #define L_DBG(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP"++", zypp::base::logger::E_MIL ) #define L_MIL(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_MIL ) #define L_WAR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_WAR ) #define L_ERR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_ERR ) #define L_SEC(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_SEC ) #define L_INT(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_INT ) #define L_USR(GROUP) ZYPP_BASE_LOGGER_LOG( GROUP, zypp::base::logger::E_USR ) #define L_ENV_CONSTR_DEFINE_FUNC(ENV) \ namespace zypp::log { \ bool has_env_constr_##ENV () \ { \ static bool has_##ENV = (::getenv(#ENV) != NULL); \ return has_##ENV; \ } \ const char *empty_or_group_if_##ENV ( const char *group ) \ { \ return has_env_constr_##ENV() ? group : nullptr; \ } \ } #define L_ENV_CONSTR_FWD_DECLARE_FUNC(ENV) namespace zypp::log { bool has_env_constr_##ENV (); const char *empty_or_group_if_##ENV ( const char *group ); } #define L_ENV_CONSTR(ENV,GROUP,LEVEL) ZYPP_BASE_LOGGER_LOG( zypp::log::empty_or_group_if_##ENV( GROUP ), LEVEL ) #define L_BASEFILE ( *__FILE__ == '/' ? strrchr( __FILE__, '/' ) + 1 : __FILE__ ) /** Actual call to @ref getStream. */ #define ZYPP_BASE_LOGGER_LOG(GROUP,LEVEL) \ zypp::base::logger::getStream( GROUP, LEVEL, L_BASEFILE, __FUNCTION__, __LINE__ ) /*@}*/ /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace logger { ///////////////////////////////////////////////////////////////// /** Definition of log levels. * * @see getStream */ enum LogLevel { E_XXX = 999, /**< Excessive logging. */ E_DBG = 0, /**< Debug or verbose. */ E_MIL, /**< Milestone. */ E_WAR, /**< Warning. */ E_ERR, /**< Error. */ E_SEC, /**< Secutrity related. */ E_INT, /**< Internal error. */ E_USR /**< User log. */ }; /** Return a log stream to write on. * * The returned log stream is determined by @a group_r and * @a level_r. The remaining arguments @a file_r, @a func_r * and @a line_r are expected to denote the location in the * source code that issued the message. * * @note You won't call @ref getStream directly, but use the * @ref ZYPP_BASE_LOGGER_MACROS. */ extern std::ostream & getStream( const char * group_r, LogLevel level_r, const char * file_r, const char * func_r, const int line_r ) ZYPP_API; extern bool isExcessive() ZYPP_API; ///////////////////////////////////////////////////////////////// } // namespace logger /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_LOGGER_H libzypp-17.36.5/zypp-core/base/NonCopyable.h000066400000000000000000000027521476576476200206500ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/NonCopyable.h */ #ifndef ZYPP_BASE_NONCOPYABLE_H #define ZYPP_BASE_NONCOPYABLE_H #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /** Ensure derived classes cannot be copied. * Use private inheritance. */ using NonCopyable = boost::noncopyable; ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_NONCOPYABLE_H libzypp-17.36.5/zypp-core/base/ProfilingFormater.cc000066400000000000000000000046621476576476200222300ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/ProfilingFormater.cc * */ #include #include #include #include #include #include using std::endl; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // ProfilingFormater /////////////////////////////////////////////////////////////////// std::string ProfilingFormater::format( const std::string & group_r, logger::LogLevel level_r, const char * file_r, const char * func_r, int line_r, const std::string & message_r ) { struct timeval tp; gettimeofday( &tp, NULL); return str::form( "%ld.%ld [%d] <%d> %s(%s):%d %s", tp.tv_sec, tp.tv_usec, level_r, getpid(), /*group_r.c_str(),*/ file_r, func_r, line_r, message_r.c_str() ); } ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/ProfilingFormater.h000066400000000000000000000036631476576476200220720ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/ProfilingFormater.h * */ #ifndef ZYPP_BASE_PROFILINGFORMATER_H #define ZYPP_BASE_PROFILINGFORMATER_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// struct ProfilingFormater : public LogControl::LineFormater { std::string format( const std::string & /*group_r*/, logger::LogLevel /*level_r*/, const char * /*file_r*/, const char * /*func_r*/, int /*line_r*/, const std::string & /*message_r*/ ) override; ~ProfilingFormater() override {} }; ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_PROFILINGFORMATER_H libzypp-17.36.5/zypp-core/base/ProvideNumericId000066400000000000000000000000361476576476200214120ustar00rootroot00000000000000#include "providenumericid.h" libzypp-17.36.5/zypp-core/base/PtrTypes.h000066400000000000000000000535651476576476200202410ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/PtrTypes.h * \ingroup ZYPP_SMART_PTR * \see ZYPP_SMART_PTR */ #ifndef ZYPP_BASE_PTRTYPES_H #define ZYPP_BASE_PTRTYPES_H #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// namespace str { // printing void* (prevents us from including ) std::string form( const char * format, ... ) __attribute__ ((format (printf, 1, 2))); } /** \defgroup ZYPP_SMART_PTR Smart pointer types * Smart pointer types. * * Namespace zypp provides 3 smart pointer types \b using the * boost smart pointer library. * * \li \c scoped_ptr Simple sole ownership of single objects. Noncopyable. * * \li \c shared_ptr Object ownership shared among multiple pointers * * \li \c weak_ptr Non-owning observers of an object owned by shared_ptr. * * And \ref zypp::RW_pointer, as wrapper around a smart pointer, * poviding \c const correct read/write access to the object it refers. */ /*@{*/ /** shared_ptr custom deleter doing nothing. * A custom deleter is a function being called when the * last shared_ptr goes out of score. Per default the * object gets deleted, but you can insall custom deleters * as well. This one does nothing. * * \code * // Some class providing a std::istream * struct InpuStream * { * // Per deafult use std::cin. * InputStream() * : _stream( &std::cin, NullDeleter() ) * {} * // Or read from a file. * InputStream( const Pathname & file_r ) * : _stream( new ifgzstream( _path.asString().c_str() ) ) * {} * // Or use a stream priovided by the application. * InputStream( std::istream & stream_r ) * : _stream( &stream_r, NullDeleter() ) * {} * * std::istream & stream() * { return *_stream; } * * private: * shared_ptr _stream; * }; * \endcode */ struct NullDeleter { void operator()( const void *const ) const {} }; /** \class scoped_ptr */ using boost::scoped_ptr; /** \class shared_ptr */ using boost::shared_ptr; /** \class weak_ptr */ using boost::weak_ptr; /** \class intrusive_ptr */ using boost::intrusive_ptr; template inline intrusive_ptr make_intrusive( Args&&... __args ) { return intrusive_ptr( new T( std::forward(__args)...) ); } /** */ using boost::static_pointer_cast; /** */ using boost::const_pointer_cast; /** */ using boost::dynamic_pointer_cast; ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace std { ///////////////////////////////////////////////////////////////// // namespace sub { // class Foo; // typedef zypp::intrusive_ptr Foo_Ptr; // see DEFINE_PTR_TYPE(NAME) macro below // } // Defined in namespace std g++ finds the output operator (König-Lookup), // even if we typedef the pointer in a different namespace than ::zypp. // Otherwise we had to define an output operator always in the same namespace // as the typedef (else g++ will just print the pointer value). /** \relates zypp::shared_ptr Stream output. */ template inline std::ostream & operator<<( std::ostream & str, const zypp::shared_ptr & obj ) { if ( obj ) return str << *obj; return str << std::string("NULL"); } /** \overload specialize for void */ template<> inline std::ostream & operator<<( std::ostream & str, const zypp::shared_ptr & obj ) { if ( obj ) return str << zypp::str::form( "%p", static_cast(obj.get()) ); return str << std::string("NULL"); } /** \relates zypp::shared_ptr Stream output. */ template inline std::ostream & dumpOn( std::ostream & str, const zypp::shared_ptr & obj ) { if ( obj ) return dumpOn( str, *obj ); return str << std::string("NULL"); } /** \overload specialize for void */ template<> inline std::ostream & dumpOn( std::ostream & str, const zypp::shared_ptr & obj ) { return str << obj; } /** \relates zypp::intrusive_ptr Stream output. */ template inline std::ostream & operator<<( std::ostream & str, const zypp::intrusive_ptr & obj ) { if ( obj ) return str << *obj; return str << std::string("NULL"); } /** \relates zypp::intrusive_ptr Stream output. */ template inline std::ostream & dumpOn( std::ostream & str, const zypp::intrusive_ptr & obj ) { if ( obj ) return dumpOn( str, *obj ); return str << std::string("NULL"); } ///////////////////////////////////////////////////////////////// } // namespace std /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // RW_pointer traits // /////////////////////////////////////////////////////////////////// /** * Don't forgett to provide versions for PtrType and constPtrType, * esp. if creation a of temporary is not acceptable (eg. when * checking the ref count value). */ namespace rw_pointer { template struct Shared { using PtrType = shared_ptr; using constPtrType = shared_ptr; /** Check whether pointer is not shared. */ bool unique( const constPtrType & ptr_r ) { return !ptr_r || ptr_r.unique(); } bool unique( const PtrType & ptr_r ) { return !ptr_r || ptr_r.unique(); } /** Return number of references. */ long use_count( const constPtrType & ptr_r ) const { return ptr_r.use_count(); } long use_count( const PtrType & ptr_r ) const { return ptr_r.use_count(); } }; template struct Intrusive { using PtrType = intrusive_ptr; using constPtrType = intrusive_ptr; /** Check whether pointer is not shared. */ bool unique( const constPtrType & ptr_r ) { return !ptr_r || (ptr_r->refCount() <= 1); } bool unique( const PtrType & ptr_r ) { return !ptr_r || (ptr_r->refCount() <= 1); } /** Return number of references. */ long use_count( const constPtrType & ptr_r ) const { return ptr_r ? ptr_r->refCount() : 0; } long use_count( const PtrType & ptr_r ) const { return ptr_r ? ptr_r->refCount() : 0; } }; template struct Scoped { using PtrType = scoped_ptr; using constPtrType = scoped_ptr; /** Check whether pointer is not shared. */ bool unique( const constPtrType & ptr_r ) { return true; } bool unique( const PtrType & ptr_r ) { return true; } /** Return number of references. */ long use_count( const constPtrType & ptr_r ) const { return ptr_r ? 1 : 0; } long use_count( const PtrType & ptr_r ) const { return ptr_r ? 1 : 0; } }; } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : RW_pointer // /** Wrapper for \c const correct access via \ref ZYPP_SMART_PTR. * * zypp::RW_pointer\ stores a \ref ZYPP_SMART_PTR * of type \c DTraits::PtrType, which must be convertible into a D *. * Pointer style access (via \c -> and \c *) offers a const D * in const * a context, otherwise a D *. Thus \em RW_ means \em read/write, * as you get a different type, dependent on whether you're allowed to * read or write. * * Forwarding access from an interface to an implemantation class, an * RW_pointer prevents const interface methods from accidentally calling * nonconst implementation methods. * * The second template argument defaults to * DTraits = rw_pointer::Shared thus wraping a * shared_ptr. To wrap an intrusive_ptr * use rw_pointer::Intrusive. * * \see zypp::RWCOW_pointer for 'copy on write' functionality. * * \code * #include "zypp/base/PtrTypes.h" * * class Foo * { * ... * private: * // Implementation class * struct Impl; * // Pointer to implementation; actually a shared_ptr * RW_pointer _pimpl; * * void baa() { _pimpl->... } // is Impl * * void baa() const { _pimpl->... } // is Impl const * * }; * \endcode */ template > struct RW_pointer { using PtrType = typename DTraits::PtrType; using constPtrType = typename DTraits::constPtrType; RW_pointer() {} RW_pointer(const RW_pointer &) = default; RW_pointer(RW_pointer &&) = default; RW_pointer &operator=(const RW_pointer &) = default; RW_pointer &operator=(RW_pointer &&) = default; RW_pointer(std::nullptr_t) {} explicit RW_pointer( typename PtrType::element_type * dptr ) : _dptr( dptr ) {} explicit RW_pointer( PtrType dptr ) : _dptr( dptr ) {} RW_pointer & operator=( std::nullptr_t ) { reset(); return *this; } void reset() { PtrType().swap( _dptr ); } void reset( typename PtrType::element_type * dptr ) { PtrType( dptr ).swap( _dptr ); } void swap( RW_pointer & rhs ) noexcept { _dptr.swap( rhs._dptr ); } void swap( PtrType & rhs ) noexcept { _dptr.swap( rhs ); } explicit operator bool() const { return _dptr.get() != nullptr; } const D & operator*() const { return *_dptr; }; const D * operator->() const { return _dptr.operator->(); } const D * get() const { return _dptr.get(); } D & operator*() { return *_dptr; } D * operator->() { return _dptr.operator->(); } D * get() { return _dptr.get(); } public: bool unique() const { return DTraits().unique( _dptr ); } long use_count() const { return DTraits().use_count( _dptr ); } constPtrType getPtr() const { return _dptr; } PtrType getPtr() { return _dptr; } constPtrType cgetPtr() { return _dptr; } private: PtrType _dptr; }; /////////////////////////////////////////////////////////////////// /** \relates RW_pointer Stream output. * * Print the \c D object the RW_pointer refers, or \c "NULL" * if the pointer is \c NULL. */ template inline std::ostream & operator<<( std::ostream & str, const RW_pointer & obj ) { if ( obj.get() ) return str << *obj.get(); return str << std::string("NULL"); } /** \relates RW_pointer */ template inline bool operator==( const RW_pointer & lhs, const RW_pointer & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RW_pointer */ template inline bool operator==( const RW_pointer & lhs, const typename DPtr::PtrType & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RW_pointer */ template inline bool operator==( const typename DPtr::PtrType & lhs, const RW_pointer & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RW_pointer */ template inline bool operator==( const RW_pointer & lhs, const typename DPtr::constPtrType & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RW_pointer */ template inline bool operator==( const typename DPtr::constPtrType & lhs, const RW_pointer & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RW_pointer */ template inline bool operator==( const RW_pointer & lhs, std::nullptr_t ) { return( lhs.get() == nullptr ); } /** \relates RW_pointer */ template inline bool operator==( std::nullptr_t, const RW_pointer & rhs ) { return( nullptr == rhs.get() ); } /** \relates RW_pointer */ template inline bool operator!=( const RW_pointer & lhs, const RW_pointer & rhs ) { return ! ( lhs == rhs ); } /** \relates RW_pointer */ template inline bool operator!=( const RW_pointer & lhs, const typename DPtr::PtrType & rhs ) { return ! ( lhs == rhs ); } /** \relates RW_pointer */ template inline bool operator!=( const typename DPtr::PtrType & lhs, const RW_pointer & rhs ) { return ! ( lhs == rhs ); } /** \relates RW_pointer */ template inline bool operator!=( const RW_pointer & lhs, const typename DPtr::constPtrType & rhs ) { return ! ( lhs == rhs ); } /** \relates RW_pointer */ template inline bool operator!=( const typename DPtr::constPtrType & lhs, const RW_pointer & rhs ) { return ! ( lhs == rhs ); } /** \relates RW_pointer */ template inline bool operator!=( const RW_pointer & lhs, std::nullptr_t ) { return( lhs.get() != nullptr ); } /** \relates RW_pointer */ template inline bool operator!=( std::nullptr_t, const RW_pointer & rhs ) { return( nullptr != rhs.get() ); } /////////////////////////////////////////////////////////////////// /** \relates RWCOW_pointer Clone the underlying object. * Calls \a rhs -\>clone(). Being defined as a * function outside \ref RWCOW_pointer allows to overload * it, in case a specific \a D does not have clone(). */ template inline D * rwcowClone( const D * rhs ) { return rhs->clone(); } /////////////////////////////////////////////////////////////////// // // CLASS NAME : RWCOW_pointer // /** \ref RW_pointer supporting 'copy on write' functionality. * * \em Write access to the underlying object creates a copy, iff * the object is shared. * * See \ref RW_pointer. */ template > struct RWCOW_pointer { using PtrType = typename DTraits::PtrType; using constPtrType = typename DTraits::constPtrType; RWCOW_pointer() {} RWCOW_pointer(std::nullptr_t) {} RWCOW_pointer(const RWCOW_pointer &) = default; RWCOW_pointer(RWCOW_pointer &&) = default; explicit RWCOW_pointer( typename PtrType::element_type * dptr ) : _dptr( dptr ) {} explicit RWCOW_pointer( PtrType dptr ) : _dptr( dptr ) {} RWCOW_pointer & operator=( std::nullptr_t ) { reset(); return *this; } RWCOW_pointer &operator=(const RWCOW_pointer &) = default; RWCOW_pointer &operator=(RWCOW_pointer &&) = default; void reset() { PtrType().swap( _dptr ); } void reset( typename PtrType::element_type * dptr ) { PtrType( dptr ).swap( _dptr ); } void swap( RWCOW_pointer & rhs ) noexcept { _dptr.swap( rhs._dptr ); } void swap( PtrType & rhs ) noexcept { _dptr.swap( rhs ); } explicit operator bool() const { return _dptr.get() != nullptr; } const D & operator*() const { return *_dptr; }; const D * operator->() const { return _dptr.operator->(); } const D * get() const { return _dptr.get(); } D & operator*() { assertUnshared(); return *_dptr; } D * operator->() { assertUnshared(); return _dptr.operator->(); } D * get() { assertUnshared(); return _dptr.get(); } public: bool unique() const { return DTraits().unique( _dptr ); } long use_count() const { return DTraits().use_count( _dptr ); } constPtrType getPtr() const { return _dptr; } PtrType getPtr() { assertUnshared(); return _dptr; } constPtrType cgetPtr() { return _dptr; } private: void assertUnshared() { if ( !unique() ) PtrType( rwcowClone( _dptr.get() ) ).swap( _dptr ); } private: PtrType _dptr; }; /////////////////////////////////////////////////////////////////// /** \relates RWCOW_pointer Stream output. * * Print the \c D object the RWCOW_pointer refers, or \c "NULL" * if the pointer is \c NULL. */ template inline std::ostream & operator<<( std::ostream & str, const RWCOW_pointer & obj ) { if ( obj.get() ) return str << *obj.get(); return str << std::string("NULL"); } /** \relates RWCOW_pointer */ template inline bool operator==( const RWCOW_pointer & lhs, const RWCOW_pointer & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RWCOW_pointer */ template inline bool operator==( const RWCOW_pointer & lhs, const typename DPtr::PtrType & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RWCOW_pointer */ template inline bool operator==( const typename DPtr::PtrType & lhs, const RWCOW_pointer & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RWCOW_pointer */ template inline bool operator==( const RWCOW_pointer & lhs, const typename DPtr::constPtrType & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RWCOW_pointer */ template inline bool operator==( const typename DPtr::constPtrType & lhs, const RWCOW_pointer & rhs ) { return( lhs.get() == rhs.get() ); } /** \relates RWCOW_pointer */ template inline bool operator==( const RWCOW_pointer & lhs, std::nullptr_t ) { return( lhs.get() == nullptr ); } /** \relates RWCOW_pointer */ template inline bool operator==( std::nullptr_t, const RWCOW_pointer & rhs ) { return( nullptr == rhs.get() ); } /** \relates RWCOW_pointer */ template inline bool operator!=( const RWCOW_pointer & lhs, const RWCOW_pointer & rhs ) { return ! ( lhs == rhs ); } /** \relates RWCOW_pointer */ template inline bool operator!=( const RWCOW_pointer & lhs, const typename DPtr::PtrType & rhs ) { return ! ( lhs == rhs ); } /** \relates RWCOW_pointer */ template inline bool operator!=( const typename DPtr::PtrType & lhs, const RWCOW_pointer & rhs ) { return ! ( lhs == rhs ); } /** \relates RWCOW_pointer */ template inline bool operator!=( const RWCOW_pointer & lhs, const typename DPtr::constPtrType & rhs ) { return ! ( lhs == rhs ); } /** \relates RWCOW_pointer */ template inline bool operator!=( const typename DPtr::constPtrType & lhs, const RWCOW_pointer & rhs ) { return ! ( lhs == rhs ); } /** \relates RWCOW_pointer */ template inline bool operator!=( const RWCOW_pointer & lhs, std::nullptr_t ) { return( lhs.get() != nullptr ); } /** \relates RWCOW_pointer */ template inline bool operator!=( std::nullptr_t, const RWCOW_pointer & rhs ) { return( nullptr != rhs.get() ); } /////////////////////////////////////////////////////////////////// /*@}*/ ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// /** Forward declaration of Ptr types */ #define DEFINE_PTR_TYPE(NAME) \ class NAME; \ extern void intrusive_ptr_add_ref( const NAME * ) ZYPP_API; \ extern void intrusive_ptr_release( const NAME * ) ZYPP_API; \ typedef zypp::intrusive_ptr NAME##_Ptr; \ typedef zypp::intrusive_ptr NAME##_constPtr; /////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_PTRTYPES_H libzypp-17.36.5/zypp-core/base/ReferenceCounted.cc000066400000000000000000000041601476576476200220100ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/base/ReferenceCounted.cc * */ #include #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// ReferenceCounted::ReferenceCounted() : _counter( 0 ) {} ReferenceCounted::ReferenceCounted( const ReferenceCounted & /*rhs*/ ) : _counter( 0 ) {} ReferenceCounted::~ReferenceCounted() { if ( _counter ) { INT << "~ReferenceCounted: nonzero reference count" << std::endl; } } void ReferenceCounted::unrefException() const { INT << "ReferenceCounted::unref: zero reference count" << std::endl; throw std::out_of_range( "ReferenceCounted::unref: zero reference count" ); } std::ostream & ReferenceCounted::dumpOn( std::ostream & str ) const { return str << "ReferenceCounted(@" << (const void *)this << "<=" << _counter << ")"; } ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/ReferenceCounted.h000066400000000000000000000116141476576476200216540ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp-core/base/ReferenceCounted.h * */ #ifndef ZYPP_CORE_BASE_REFERENCECOUNTED_H #define ZYPP_CORE_BASE_REFERENCECOUNTED_H #include #include #include /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace base { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // // CLASS NAME : ReferenceCounted // /** Base class for reference counted objects. * \todo Make counter thread safe. */ class ZYPP_API ReferenceCounted { /** Stream output via dumpOn. */ friend std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj ); public: /** Default ctor. * Initial reference count is zero. */ ReferenceCounted(); /** Copy ctor. * Initial reference count is zero. */ ReferenceCounted( const ReferenceCounted & rhs ); /** Dtor. * \throw std::out_of_range if reference count is not zero. */ virtual ~ReferenceCounted(); /** Assignment. * Reference count remains untouched. */ ReferenceCounted & operator=( const ReferenceCounted & ) { return *this; } public: /** Return reference counter value. */ unsigned refCount() const { return _counter; } /** Add a reference. */ void ref() const { ref_to( ++_counter ); } /** Release a reference. * Deletes the object if reference count gets zero. * \throw std::out_of_range if reference count is zero. */ void unref() const { if ( !_counter ) unrefException(); // will throw! if ( --_counter ) unref_to( _counter ); else delete this; } /** Called by zypp::intrusive_ptr to add a reference. * \see ZYPP_SMART_PTR */ static void add_ref( const ReferenceCounted * ptr_r ) { if( ptr_r ) ptr_r->ref(); } /** Called by zypp::intrusive_ptr to add a reference. * \see ZYPP_SMART_PTR */ static void release( const ReferenceCounted * ptr_r ) { if( ptr_r ) ptr_r->unref(); } protected: /** Overload to realize std::ostream & operator\<\<. */ virtual std::ostream & dumpOn( std::ostream & str ) const; /** Trigger derived classes after refCount was increased. */ virtual void ref_to( unsigned /* rep_cnt_r */ ) const {} /** Trigger derived classes after refCount was decreased. * No trigger is sent, if refCount got zero (i.e. the * object is deleted). **/ virtual void unref_to( unsigned /* rep_cnt_r */ ) const {} private: /** The reference counter. */ mutable unsigned _counter; /** Throws Exception on unref. */ void unrefException() const; }; /////////////////////////////////////////////////////////////////// /** \relates ReferenceCounted intrusive_ptr hook to add_ref. */ inline void intrusive_ptr_add_ref( const ReferenceCounted * ptr_r ) { ReferenceCounted::add_ref( ptr_r ); } /** \relates ReferenceCounted intrusive_ptr hook to release. */ inline void intrusive_ptr_release( const ReferenceCounted * ptr_r ) { ReferenceCounted::release( ptr_r ); } /** \relates ReferenceCounted Stream output. */ inline std::ostream & operator<<( std::ostream & str, const ReferenceCounted & obj ) { return obj.dumpOn( str ); } ///////////////////////////////////////////////////////////////// } // namespace base /////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// } // namespace zypp /////////////////////////////////////////////////////////////////// #define IMPL_PTR_TYPE(NAME) \ void intrusive_ptr_add_ref( const NAME * ptr_r ) \ { zypp::base::ReferenceCounted::add_ref( ptr_r ); } \ void intrusive_ptr_release( const NAME * ptr_r ) \ { zypp::base::ReferenceCounted::release( ptr_r ); } /////////////////////////////////////////////////////////////////// #endif // ZYPP_CORE_BASE_REFERENCECOUNTED_H libzypp-17.36.5/zypp-core/base/Regex.cc000066400000000000000000000074351476576476200176520ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Regex.cc * */ #include #include #include #include #include using namespace zypp; using namespace zypp::str; regex::regex() : m_flags( match_extended ) {} regex::regex( const std::string & str, int flags ) { assign( str, flags ); } regex::~regex() { if ( m_valid ) regfree( &m_preg ); } void regex::assign( const std::string & str, int flags ) { if ( m_valid ) regfree( &m_preg ); m_valid = false; m_str = str; m_flags = flags; static constexpr int normal = 1<<16; // deprecated legacy, use match_extended if ( flags & normal ) flags &= ~normal; if ( (flags & rxdefault) != rxdefault ) flags |= rxdefault; // always enforced (legacy) if ( int err = regcomp( &m_preg, str.c_str(), flags ) ) { char errbuff[100]; regerror( err, &m_preg, errbuff, sizeof(errbuff) ); ZYPP_THROW( regex_error(std::string(errbuff)) ); } m_valid = true; } bool regex::matches( const char* s, smatch & matches, int flags ) const { if ( m_valid ) { const auto possibleMatchCount = m_preg.re_nsub + 1; matches.pmatch.resize( possibleMatchCount ); memset( matches.pmatch.data(), -1, sizeof( regmatch_t ) * ( possibleMatchCount ) ); if ( s && !regexec( &m_preg, s, matches.pmatch.size(), matches.pmatch.data(), flags ) ) { matches.match_str = s; return true; // good match } } // Here: no match matches.pmatch.clear(); matches.match_str.clear(); return false; } bool regex::matches( const char* s ) const { return m_valid && s && !regexec( &m_preg, s, 0, NULL, 0 ); } bool zypp::str::regex_match( const char* s, smatch& matches, const regex& regex ) { return regex.matches( s, matches ); } bool zypp::str::regex_match( const char* s, const regex& regex ) { return regex.matches( s ); } smatch::smatch() {} std::string smatch::operator[](unsigned i) const { if ( i < pmatch.size() && pmatch[i].rm_so != -1 ) return match_str.substr( pmatch[i].rm_so, pmatch[i].rm_eo-pmatch[i].rm_so ); return std::string(); } std::string::size_type smatch::begin( unsigned i ) const { return( i < pmatch.size() && pmatch[i].rm_so != -1 ? pmatch[i].rm_so : std::string::npos ); } std::string::size_type smatch::end( unsigned i ) const { return( i < pmatch.size() && pmatch[i].rm_so != -1 ? pmatch[i].rm_eo : std::string::npos ); } std::string::size_type smatch::size( unsigned i ) const { return( i < pmatch.size() && pmatch[i].rm_so != -1 ? pmatch[i].rm_eo-pmatch[i].rm_so : std::string::npos ); } unsigned smatch::size() const { unsigned matches = unsigned(-1); // Get highest (pmatch[i].rm_so != -1). Just looking for the 1st // (pmatch[i].rm_so == -1) is wrong as optional mayches "()?" // may be embeded. for ( unsigned i = 0; i < pmatch.size(); ++i ) { if ( pmatch[i].rm_so != -1 ) matches = i; } return ++matches; } std::string zypp::str::regex_substitute( const std::string &s, const regex ®ex, const std::string &replacement, bool global ) { std::string result; strv::splitRx( s, regex, [&result,&replacement,global]( std::string_view w, unsigned, bool last ) { result += w; if ( !last ) result += replacement; return global; }); return result; } libzypp-17.36.5/zypp-core/base/Regex.h000066400000000000000000000156271476576476200175160ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/Regex.h * */ #ifndef ZYPP_BASE_REGEX_H #define ZYPP_BASE_REGEX_H #include #include #include #include ////////////////////////////////////////////////////////////////// namespace zypp { ////////////////////////////////////////////////////////////////// /// \namespace str /// \brief String related utilities and \ref ZYPP_STR_REGEX. namespace str { ////////////////////////////////////////////////////////////////// /// \defgroup ZYPP_STR_REGEX Regular expression matching /// \brief Regular expressions using the glibc regex library. /// /// \see also \ref StrMatcher string matcher also supporting globing, etc. /// /// \code /// str::regex rxexpr( "^(A)?([0-9]*) im" ); /// str::smatch what; /// /// std::string mytext( "Y123 imXXXX" ); /// if ( str::regex_match( mytext, what, rxexpr ) ) /// { /// MIL << "MATCH '" << what[0] << "'" << endl; /// MIL << " subs: " << what.size()-1 << endl; /// for_( i, 1U, what.size() ) /// MIL << " [" << i << "] " << what[i] << endl; /// } /// else /// { /// WAR << "NO MATCH '" << rxexpr << "' in '" << mytext << endl; /// } /// \endcode ////////////////////////////////////////////////////////////////// using regex_error = Exception; class smatch; class regex; ////////////////////////////////////////////////////////////////// /// \brief Regular expression matching /// /// \ingroup ZYPP_STR_REGEX /// \relates regex /// Return whether a \ref regex matches a specific string. An optionally /// passed \ref smatch object will contain the match reults. ////////////////////////////////////////////////////////////////// bool regex_match( const char * s, smatch & matches, const regex & regex ) ZYPP_API; /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */ inline bool regex_match(const std::string & s, smatch & matches, const regex & regex) { return regex_match( s.c_str(), matches, regex ); } /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */ bool regex_match( const char * s, const regex & regex ) ZYPP_API; /** \copydoc regex_match \relates regex \ingroup ZYPP_STR_REGEX */ inline bool regex_match( const std::string & s, const regex & regex ) { return regex_match( s.c_str(), regex ); } /** * Replaces the matched regex with the string passed in \a replacement. * If \a global is set the search continues after the first match * * \note Using backreferences in the replacement string is NOT supported. */ std::string regex_substitute ( const std::string & s, const regex & regex, const std::string &replacement, bool global = true ) ZYPP_API; ////////////////////////////////////////////////////////////////// /// \class regex /// \brief Regular expression /// /// \ingroup ZYPP_STR_REGEX ////////////////////////////////////////////////////////////////// class ZYPP_API regex { public: enum RegFlags { icase = REG_ICASE, ///< Do not differentiate case nosubs = REG_NOSUB, ///< Support for substring addressing of matches is not required match_extended = REG_EXTENDED, ///< Use POSIX Extended Regular Expression syntax when interpreting regex. newline = REG_NEWLINE, ///< Match newline rxdefault = match_extended|newline ///< These are enforced even if you don't pass them as flag argument }; enum MatchFlags { none = 0, not_bol = REG_NOTBOL ///< Do not match begin of line }; regex(); regex( const std::string & s, int flags = rxdefault ); regex( const char* s, int flags = rxdefault ) : regex( std::string(s?s:""), flags ) {} ~regex(); regex( const regex & rhs ) { assign( rhs.m_str, rhs.m_flags ); } regex & operator=( const regex & rhs ) { assign( rhs.m_str, rhs.m_flags ); return *this; } /** * string representation of the regular expression */ std::string asString() const { return m_str; } bool matches( const char * s, str::smatch & matches, int flags = none ) const; bool matches( const std::string & s_r, str::smatch & matches_r, int flags_r = none ) const { return matches( s_r.c_str(), matches_r, flags_r ); } bool matches( const char * s ) const; bool matches( const std::string & s_r ) const { return matches( s_r.c_str() ); } public: /** Expert backdoor. Returns pointer to the compiled regex for direct use in regexec() */ regex_t * get() { return & m_preg; } private: void assign( const std::string & s, int flags ); private: friend class smatch; std::string m_str; int m_flags; regex_t m_preg; bool m_valid = false; }; /** \relates regex Stream output */ inline std::ostream & operator<<( std::ostream & str, const regex & obj ) { return str << obj.asString(); } ////////////////////////////////////////////////////////////////// /// \class smatch /// \brief Regular expression match result /// /// \ingroup ZYPP_STR_REGEX /// /// Index \c n=0 returns the string object representing the character /// sequence that matched the whole regular expression. /// If \c n is out of range, or if \c n is an unmatched sub-expression, /// then an empty string is returned. ////////////////////////////////////////////////////////////////// class ZYPP_API smatch { public: smatch(); std::string operator[](unsigned i) const; unsigned size() const; /** Begin index of subexpression \c i in \a match_str (or std::string::npos) */ std::string::size_type begin( unsigned i ) const; /** End index of subexpression \c i in \a match_str (or std::string::npos) */ std::string::size_type end( unsigned i ) const; /** Size of subexpression \c i (or std::string::npos) */ std::string::size_type size( unsigned i ) const; std::string match_str; std::vector pmatch; }; } // namespace str ////////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////// #endif // ZYPP_BASE_STRING_H libzypp-17.36.5/zypp-core/base/SimpleStreambuf000066400000000000000000000000351476576476200213030ustar00rootroot00000000000000#include "simplestreambuf.h" libzypp-17.36.5/zypp-core/base/String.cc000066400000000000000000000330721476576476200200420ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/String.cc * */ #include #include #include #include #include #include #include using std::string; /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace str { ///////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : form ** FUNCTION TYPE : std::string */ std::string form( const char * format, ... ) { SafeBuf safe; va_list ap; va_start( ap, format ); vasprintf( &safe._buf, format, ap ); va_end( ap ); return safe.asString(); } /****************************************************************** ** ** FUNCTION NAME : strerror ** FUNCTION TYPE : std::string */ std::string strerror( int errno_r ) { return form( "(%d)%s", errno_r, ::strerror( errno_r ) ); } /****************************************************************** ** ** FUNCTION NAME : strToTrue ** FUNCTION TYPE : bool */ bool strToTrue( const C_Str & str ) { std::string t( toLower( str ) ); return( t == "1" || t == "yes" || t == "true" || t == "always" || t == "on" || t == "+" || strtonum( str ) ); } /****************************************************************** ** ** FUNCTION NAME : strToFalse ** FUNCTION TYPE : bool */ bool strToFalse( const C_Str & str ) { std::string t( toLower( str ) ); return ! ( t == "0" || t == "no" || t == "false" || t == "never" || t == "off" || t == "-" ); } TriBool strToTriBool( const C_Str & str ) // from TriBool.h { if ( strToTrue( str ) ) return true; if ( !strToFalse( str ) ) return false; return indeterminate; } /////////////////////////////////////////////////////////////////// // Hexencode /////////////////////////////////////////////////////////////////// namespace { /** What's not decoded. */ inline bool heIsAlNum( char ch ) { return ( ( 'a' <= ch && ch <= 'z' ) ||( 'A' <= ch && ch <= 'Z' ) ||( '0' <= ch && ch <= '9' ) ); } /** Hex-digit to number or -1. */ inline int heDecodeCh( char ch ) { if ( '0' <= ch && ch <= '9' ) return( ch - '0' ); if ( 'A' <= ch && ch <= 'F' ) return( ch - 'A' + 10 ); if ( 'a' <= ch && ch <= 'f' ) return( ch - 'a' + 10 ); return -1; } } std::string hexencode( const C_Str & str_r ) { static const char *const hdig = "0123456789ABCDEF"; std::string res; res.reserve( str_r.size() ); for ( const char * it = str_r.c_str(); *it; ++it ) { if ( heIsAlNum( *it ) ) { res += *it; } else { res += '%'; res += hdig[(unsigned char)(*it)/16]; res += hdig[(unsigned char)(*it)%16]; } } return res; } std::string hexdecode( const C_Str & str_r ) { std::string res; res.reserve( str_r.size() ); for_( it, str_r.c_str(), str_r.c_str()+str_r.size() ) { if ( *it == '%' ) { int d1 = heDecodeCh( *(it+1) ); if ( d1 != -1 ) { int d2 = heDecodeCh( *(it+2) ); if ( d2 != -1 ) { res += (d1<<4)|d2; it += 2; continue; } } } // verbatim if no %XX: res += *it; } return res; } /////////////////////////////////////////////////////////////////// /****************************************************************** ** ** FUNCTION NAME : toLower ** FUNCTION TYPE : std::string */ std::string toLower( const std::string & s ) { return toLower( std::string(s) ); } std::string toLower( std::string && s ) { std::string ret( std::move(s) ); if ( ret.empty() ) return ret; for ( std::string::size_type i = 0; i < ret.length(); ++i ) { if ( isupper( ret[i] ) ) ret[i] = static_cast(tolower( ret[i] )); } return ret; } /****************************************************************** ** ** FUNCTION NAME : toUpper ** FUNCTION TYPE : std::string */ std::string toUpper( const std::string & s ) { return toUpper( std::string(s) ); } std::string toUpper( std::string && s ) { std::string ret( std::move(s) ); if ( ret.empty() ) return ret; for ( std::string::size_type i = 0; i < ret.length(); ++i ) { if ( islower( ret[i] ) ) ret[i] = static_cast(toupper( ret[i] )); } return ret; } /****************************************************************** ** ** FUNCTION NAME : trim ** FUNCTION TYPE : std::string */ std::string trim( const std::string & s, const Trim trim_r ) { return trim( std::string(s), trim_r ); } std::string trim( std::string && s, const Trim trim_r ) { std::string ret( std::move(s) ); if ( ret.empty() || trim_r == NO_TRIM ) return ret; if ( trim_r & L_TRIM ) { std::string::size_type p = ret.find_first_not_of( " \t\n" ); if ( p == std::string::npos ) { ret.clear(); return ret; } ret.erase( 0, p ); } if ( trim_r & R_TRIM ) { std::string::size_type p = ret.find_last_not_of( " \t\n" ); if ( p == std::string::npos ) { ret.clear(); return ret; } ret = ret.erase( p+1 ); } return ret; } /****************************************************************** ** ** FUNCTION NAME : stripFirstWord ** FUNCTION TYPE : std::string */ std::string stripFirstWord( std::string & line, const bool ltrim_first ) { if ( ltrim_first ) line = ltrim( line ); if ( line.empty() ) return line; std::string ret; std::string::size_type p = line.find_first_of( " \t" ); if ( p == std::string::npos ) { // no ws on line ret = line; line.erase(); } else if ( p == 0 ) { // starts with ws // ret remains empty line = ltrim( line ); } else { // strip word and ltim line ret = line.substr( 0, p ); line = ltrim( line.erase( 0, p ) ); } return ret; } /****************************************************************** ** ** FUNCTION NAME : stripLastWord ** FUNCTION TYPE : std::string */ std::string stripLastWord( std::string & line, const bool rtrim_first ) { if ( rtrim_first ) line = rtrim( line ); if ( line.empty() ) return line; std::string ret; std::string::size_type p = line.find_last_of( " \t" ); if ( p == std::string::npos ) { // no ws on line ret = line; line.erase(); } else if ( p == line.size()-1 ) { // ends with ws // ret remains empty line = rtrim( line ); } else { // strip word and rtim line ret = line.substr( p+1 ); line = rtrim( line.erase( p ) ); } return ret; } std::string gsub( const std::string & str_r, const std::string & from_r, const std::string & to_r ) { std::string ret( str_r ); return replaceAll( ret, from_r, to_r ); } std::string & replaceAll( std::string & str_r, const std::string & from_r, const std::string & to_r ) { if ( ! from_r.empty() ) { std::string::size_type pos = 0; while ( (pos = str_r.find( from_r, pos )) != std::string::npos ) { str_r.replace( pos, from_r.size(), to_r ); pos += to_r.size(); if ( pos >= str_r.length() ) break; } } return str_r; } std::string gsubFun( const std::string & str_r, const std::string & from_r, function to_r ) { std::string ret( str_r ); return replaceAllFun( ret, from_r, std::move(to_r) ); } std::string & replaceAllFun( std::string & str_r, const std::string & from_r, const function& to_r ) { if ( ! from_r.empty() ) { std::string::size_type pos = 0; while ( (pos = str_r.find( from_r, pos )) != std::string::npos ) { std::string to( to_r() ); str_r.replace( pos, from_r.size(), to ); pos += to.size(); if ( pos >= str_r.length() ) break; } } return str_r; } std::string escape( const C_Str & str_r, const char sep_r ) { std::vector buf; for_( s, str_r.c_str(), s+str_r.size() ) { switch ( *s ) { case '"': case '\'': case '\\': buf.push_back( '\\' ); buf.push_back( *s ); break; default: if ( *s == sep_r ) buf.push_back( '\\' ); buf.push_back( *s ); } } return std::string( buf.begin(), buf.end() ); } std::string bEscape( std::string str_r, const C_Str & special_r ) { if ( str_r.empty() ) return str_r; if ( str_r.find_first_of( special_r ) == std::string::npos && ( ::strchr( special_r.c_str(), '\\' ) || !::strchr( str_r.c_str(), '\\' ) ) ) return str_r; Str buf; for_( s, str_r.c_str(), s+str_r.size() ) { if ( *s == '\\' || ::strchr( special_r.c_str(), *s ) ) buf << '\\'; buf << *s; } return buf; } #define RXSPECIALCHARS "\\.*+?^$[()|{" std::string rxEscapeStr( std::string str_r ) { return bEscape( std::move(str_r), RXSPECIALCHARS ); } std::string rxEscapeGlob( std::string str_r ) { if ( str_r.empty() ) return str_r; if ( str_r.find_first_of( RXSPECIALCHARS ) == std::string::npos ) return str_r; Str buf; for_( s, str_r.c_str(), s+str_r.size() ) { if ( *s == '\\' ) // + next char literally { buf << '\\'; if ( *(s+1) ) { ++s; buf << *s; } } else if ( *s == '?' ) // translate { buf << '.'; } else if ( *s == '*' ) // translate { buf << ".*"; } else if ( *s == '[' ) // character class if closing ] is found, else literally { const char * e = s+1; if ( *e == '^' || *e == '!' ) // negated cclass ++e; if ( *e == ']' ) // ] in cclass ++e; while ( *e && *e != ']' ) // ...to ] or \0 ++e; if ( *e ) // on closing ']' { ++s; buf << '[' << (*s == '!' ? '^' : *s ); while ( ++s != e ) buf << *s; buf << ']'; } else { buf << "\\["; } } else if ( ::strchr( RXSPECIALCHARS, *s ) ) // escape { buf << '\\' << *s; } else { buf << *s; } } return buf; } std::string getline( std::istream & str, const Trim trim_r ) { return trim( receiveUpTo( str, '\n' ), trim_r ); } std::string getline( std::istream & str, bool trim_r ) { return trim( receiveUpTo( str, '\n' ), trim_r?TRIM:NO_TRIM ); } std::string receiveUpTo( std::istream & str, const char delim_r, bool returnDelim_r ) { std::ostringstream datas; do { char ch = 0; if ( str.get( ch ) ) { if ( ch != delim_r ) { datas.put( ch ); } else { if ( returnDelim_r ) datas.put( ch ); break; // --> delimiter found } } else { // clear fail bit if we read data before reaching EOF if ( str.eof() && datas.tellp() ) str.clear( std::ios::eofbit ); break; // --> no consumable data. } } while ( true ); return datas.str(); } ///////////////////////////////////////////////////////////////// } // namespace str /////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// } // namespace zypp ////////////////////////////////////////////////////////////////// libzypp-17.36.5/zypp-core/base/String.h000066400000000000000000001237521476576476200177110ustar00rootroot00000000000000/*---------------------------------------------------------------------\ | ____ _ __ __ ___ | | |__ / \ / / . \ . \ | | / / \ V /| _/ _/ | | / /__ | | | | | | | | /_____||_| |_| |_| | | | \---------------------------------------------------------------------*/ /** \file zypp/base/String.h * */ #ifndef ZYPP_BASE_STRING_H #define ZYPP_BASE_STRING_H #include #include #include #include #include #include #include #include #include #include /////////////////////////////////////////////////////////////////// namespace boost { namespace logic { class tribool; } } namespace zypp { using TriBool = boost::logic::tribool; } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp { /** Request a human readable (translated) string representation of Tp [Tp.asUserString()] * Classes may implement a default as member function. */ template std::string asUserString( const Tp & val_r ) { return val_r.asUserString(); } }// namespace zypp /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// namespace zypp { ///////////////////////////////////////////////////////////////// /** Convenience \c char* constructible from \c std::string and \c char*, * it maps \c (char*)0 to an empty string. * * \code * bool hasPrefix( const std::string & str_r, const std::string & prefix_r ) * { return( ::strncmp( str_r.c_str(), prefix_r.c_str(), prefix_r.size() ) == 0 ); } * \endcode * * Called with a plain \c char* as argument, the \c std::string is created form * for nothing. The implementation actually does not use the \c std::string. * * Best would be to implement \c hasPrefix for each combination of \c char* * and \c std::string arguments: * * \code * bool hasPrefix( const std::string & str_r, const std::string & prefix_r ) * { return( ::strncmp( str_r.c_str(), prefix_r.c_str(), prefix_r.size() ) == 0 ); } * * bool hasPrefix( const std::string & str_r, const char * prefix_r ) * { return( !prefix_r || ::strncmp( str_r.c_str(), prefix_r, ::strlen(prefix_r) ) == 0 ); } * * bool hasPrefix( const char * str_r, const std::string & prefix_r ) * { return( str_r ? ::strncmp( str_r, prefix_r.c_str(), prefix_r.size() ) == 0 : prefix_r.empty() ); } * * bool hasPrefix( const char * str_r, const char * prefix_r ) * { return( str && prefix_r ? ::strncmp( str_r, prefix_r, ::strlen(prefix_r) ) == 0 * : !((str_r && *str_r) || (prefix_r && *prefix_r)); } * \endcode * * This is where \ref C_Str can help. Constructible from \c std::string and \c char*, * it \e reduces the \c std::string to its \c char*. At the same, time it converts * \c (char*)0 into an \c "" string. * * \code * bool hasPrefix( const C_Str & str_r, const C_Str & prefix_r ) * { return( ::strncmp( str_r, prefix_r, prefix_r.size() ) == 0 ); } * \endcode * * \todo Check whether to replace by boost::string_ref */ class C_Str { public: using size_type = std::string::size_type; public: C_Str() : _val( 0 ), _sze( 0 ) {} C_Str( char * c_str_r ) : _val( c_str_r ), _sze( std::string::npos ) {} C_Str( const char * c_str_r ) : _val( c_str_r ), _sze( std::string::npos ) {} C_Str( const std::string & str_r ) : _val( str_r.c_str() ), _sze( str_r.size() ) {} C_Str( const boost::string_ref & str_r ) : _val( str_r.data() ), _sze( str_r.size() ) {} #ifdef __cpp_lib_string_view C_Str( const std::string_view & str_r ) : _val( str_r.data() ), _sze( str_r.size() ) {} #endif public: bool isNull() const { return !_val; } bool empty() const { return !(_val && *_val); } size_type size() const { if ( _sze == std::string::npos ) { _sze = _val ? ::strlen( _val ) : 0; } return _sze; }; operator const char *() const { return c_str(); } const char * c_str() const { return _val ? _val : ""; } private: const char *const _val; mutable size_type _sze; }; /** \relates C_Str Stream output */ inline std::ostream & operator<<( std::ostream & str, const C_Str & obj ) { return str << obj.c_str(); } /////////////////////////////////////////////////////////////////// /** String related utilities and \ref ZYPP_STR_REGEX. \see \ref ZYPP_STR_REGEX */ namespace str { ///////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /** * Global asString() that works with std::string too */ inline const std::string & asString( const std::string & t ) { return t; } inline std::string && asString( std::string && t ) { return std::move(t); } inline std::string asString( const char * t ) { return t == nullptr ? std::string() : t; } inline std::string asString( char * t ) { return t == nullptr ? std::string() : t; } template inline std::string asString( const Tp &t ) { return t.asString(); } template inline std::string asString( const intrusive_ptr &p ) { return p->asString(); } template inline std::string asString( const weak_ptr &p ) { return p->asString(); } template<> inline std::string asString( const bool &t ) { return t ? "true" : "false"; } /////////////////////////////////////////////////////////////////// /** Printf style construction of std::string. */ std::string form( const char * format, ... ) __attribute__ ((format (printf, 1, 2))) ZYPP_API; /////////////////////////////////////////////////////////////////// /** Return string describing the \a error_r code. * Like ::strerror, but the numerical value is included in * the string as well. */ std::string strerror( int errno_r ) ZYPP_API; /////////////////////////////////////////////////////////////////// /** Assert \c free called for allocated char *. * \code * ... * SafeBuf safe; * vasprintf( &safe._buf, format, ap ); * return safe.asString(); * \endcode * * \ingroup g_RAII */ struct SafeBuf { char * _buf; SafeBuf() : _buf( 0 ) {} ~SafeBuf() { if ( _buf ) free( _buf ); } std::string asString() const { return _buf ? std::string(_buf) : std::string(); } }; /////////////////////////////////////////////////////////////////// /// \class Str /// \brief Convenient building of std::string via \ref std::ostringstream /// Basically a \ref std::ostringstream autoconvertible to \ref std::string /// for building string arguments. /// \code /// void fnc( const std::string & txt_r ); /// fnc( str::Str() << "Hello " << 13 ); /// /// std::string txt( str::Str() << 45 ); /// \endcode /////////////////////////////////////////////////////////////////// struct Str { template Str & operator<<( Tp && val ) { _str << std::forward(val); return *this; } Str & operator<<( std::ostream& (*iomanip)( std::ostream& ) ) { _str << iomanip; return *this; } operator std::string() const { return _str.str(); } std::string asString() const { return _str.str(); } std::string str() const { return _str.str(); } const std::ostream & stream() const { return _str; } std::ostream & stream() { return _str; } void clear() { _str.str( std::string() ); } private: std::ostringstream _str; }; /** \relates Str Stream output */ inline std::ostream & operator<<( std::ostream & str, const Str & obj ) { return str << obj.str(); } /////////////////////////////////////////////////////////////////// /// \class Format /// \brief Convenient building of std::string with \ref boost::format. /// Basically a \ref boost::format autoconvertible to \ref std::string /// for building string arguments. /// \note It won't complain about malformed or incomplete format /// strings. Usefull when dealing with translations or classes /// providing a default formater. /// \code /// void fnc( const std::string & txt_r ); /// fnc( str::Format("Hello %1%") % 13 ); /// /// std::string txt( str::Format("Hello %1%") % 13 ); /// \endcode /////////////////////////////////////////////////////////////////// struct Format { Format() { _fmter.exceptions( boost::io::no_error_bits ); } Format( const std::string & format_r ) : Format() { _fmter.parse( format_r ); } template Format & operator%( Tp && arg ) { _fmter % std::forward(arg); return *this; } operator std::string() const { return _fmter.str(); } std::string asString() const { return _fmter.str(); } std::string str() const { return _fmter.str(); } const boost::format & fmter() const { return _fmter; } boost::format & fmter() { return _fmter; } protected: boost::format _fmter; }; /** \relates Format Stream output */ inline std::ostream & operator<<( std::ostream & str, const Format & obj ) { return str << obj.fmter(); } /** \name String representation of number. * * Optional second argument sets the minimal string width (' ' padded). * Negative values will cause the number to be left adjusted within the string. * * Default width is 0. * \code * numstring(42) -> "42" * numstring(42, 4) -> " 42" * numstring(42,-4) -> "42 " * \endcode **/ //@{ inline std::string numstring( char n, int w = 0 ) { return form( "%*hhd", w, n ); } inline std::string numstring( unsigned char n, int w = 0 ) { return form( "%*hhu", w, n ); } inline std::string numstring( short n, int w = 0 ) { return form( "%*hd", w, n ); } inline std::string numstring( unsigned short n, int w = 0 ) { return form( "%*hu", w, n ); } inline std::string numstring( int n, int w = 0 ) { return form( "%*d", w, n ); } inline std::string numstring( unsigned n, int w = 0 ) { return form( "%*u", w, n ); } inline std::string numstring( long n, int w = 0 ) { return form( "%*ld", w, n ); } inline std::string numstring( unsigned long n, int w = 0 ) { return form( "%*lu", w, n ); } inline std::string numstring( long long n, int w = 0 ) { return form( "%*lld", w, n ); } inline std::string numstring( unsigned long long n, int w = 0 ) { return form( "%*llu", w, n ); } template<> inline std::string asString( const char & t ) { return numstring( t ); } template<> inline std::string asString( const unsigned char & t ) { return numstring( t ); } template<> inline std::string asString( const short & t ) { return numstring( t ); } template<> inline std::string asString( const unsigned short & t ) { return numstring( t ); } template<> inline std::string asString( const int & t ) { return numstring( t ); } template<> inline std::string asString( const unsigned & t ) { return numstring( t ); } template<> inline std::string asString( const long & t ) { return numstring( t ); } template<> inline std::string asString( const unsigned long & t ) { return numstring( t ); } template<> inline std::string asString( const long long & t ) { return numstring( t ); } template<> inline std::string asString( const unsigned long long & t ) { return numstring( t ); } //@} /////////////////////////////////////////////////////////////////// /** \name String representation of number as hex value with leading '0x'. * Optional second argument sets the minimal * string width (0 padded). Negative values will cause the number to be left adjusted * within the string. Default width is 10 (4 for char). *